pax_global_header00006660000000000000000000000064133430275450014520gustar00rootroot0000000000000052 comment=92e13d818fb64603724e184bf2cd6acfab1c09a1 enigmail-2.0.8/000077500000000000000000000000001334302754500133145ustar00rootroot00000000000000enigmail-2.0.8/.eslintrc.js000066400000000000000000000031561334302754500155600ustar00rootroot00000000000000module.exports = { "parserOptions": { "ecmaVersion": 2017 }, "rules": { "linebreak-style": [ 2, "unix" ], "semi": [ 2, "always" ], "strict": [2, "global"], "no-unused-vars": 0, "no-empty": 0, "comma-dangle": 2, "consistent-return": 2, "block-scoped-var": 2, "dot-notation": 2, "no-alert": 2, "no-caller": 2, "no-case-declarations": 2, "no-div-regex": 2, "no-labels": 2, "no-empty-pattern": 2, "no-eq-null": 2, "no-eval": 2, "no-extend-native": 2, "no-extra-bind": 2, "no-fallthrough": 2, "no-floating-decimal": 2, "no-implicit-coercion": 2, "no-implied-eval": 2, "no-invalid-this": 2, "no-iterator": 2, "no-labels": 2, "no-lone-blocks": 2, "no-loop-func": 2, "no-multi-str": 2, "no-native-reassign": 2, "no-new-func": 2, "no-new-wrappers": 2, "no-new": 2, "no-octal-escape": 2, "no-process-env": 2, "no-proto": 2, "no-redeclare": [2, { "builtinGlobals": true }], "no-return-assign": 2, "no-script-url": 2, "no-self-compare": 2, "no-sequences": 2, "no-unused-expressions": 2, "no-useless-call": 2, "no-useless-concat": 2, "no-useless-escape": 1, "no-void": 2, "no-with": 2, "radix": 2, "wrap-iife": [2, "inside"], "yoda": 2, // TODO: //"eqeqeq": 2, }, "env": { "es6": true, "browser": true, "node": true, }, "extends": "eslint:recommended", "globals": { "ChromeUtils": true, "Components": true, "Cc": true, "Cu": true, "Ci": true } }; enigmail-2.0.8/.gitattributes000066400000000000000000000000531334302754500162050ustar00rootroot00000000000000*.xul text *.rdf text *.js text *.jsm text enigmail-2.0.8/.gitignore000066400000000000000000000010151334302754500153010ustar00rootroot00000000000000# generated files: *.pyc *.dtd.gen *.properties.gen /config.log /config.status /config/autoconf.mk /build /ui/content/enigmailBuildDate.js /ipc/src/subprocess.o /public/_xpidlgen ipc/src/libsubprocess-*.dylib ipc/src/libsubprocess-*.so /test_output.log /ipc/tests/ipc-data.txt /package/tests/jsunit.result unused.txt /package/tests/enigdbug.txt # vi tmp files: *.swp *.swo # emacs tmp files: \#*\# .dir-locals.el # backup files: *~ # vagrant files: provisioning/.vagrant # other local configuration files: .ackrc .envrc enigmail-2.0.8/.gitlab-ci.yml000066400000000000000000000042601334302754500157520ustar00rootroot00000000000000image: node:10-stretch build: script: - apt update -y -qq - apt install zip -y -qq - ./configure - make lint: before_script: - npm install -g eslint script: - ./configure - make eslint check: script: - ./configure - make check test: before_script: - export TBPROFILE="$(pwd)/tb-test-profile" - apt update -y -qq - apt install thunderbird gnupg zip unzip curl xvfb libgtk-3-0 -y -qq - mkdir -p $TBPROFILE/extensions tmp jsunit - printf '%s/build/dist/' "$(pwd)" > "$TBPROFILE/extensions/{847b3a00-7ab1-11d4-8f02-006008948af5}" - printf 'user_pref("extensions.autoDisableScopes", 14);\n' > "$TBPROFILE/prefs.js" - printf 'user_pref("browser.dom.window.dump.enabled", true);\n' >> "$TBPROFILE/prefs.js" - printf 'user_pref("extensions.update.enabled", false);\n' >> "$TBPROFILE/prefs.js" - printf 'user_pref("extensions.update.autoUpdateDefault", false);\n' >> "$TBPROFILE/prefs.js" - printf 'user_pref("extensions.blocklist.enabled", false);\n' >> "$TBPROFILE/prefs.js" - printf 'user_pref("app.update.enabled", false);\n' >> "$TBPROFILE/prefs.js" - printf 'user_pref("extensions.enigmail.logDirectory", "%s");\n' $(pwd)/tmp >> "$TBPROFILE/prefs.js" - curl -s -o "$TBPROFILE/extensions/jsunit@enigmail.net.xpi" https://www.enigmail.net/jsunit/jsunit-0.1.6.xpi - export TBDOWNLOAD=$(curl -s 'https://download.mozilla.org/?product=thunderbird-beta-latest&os=linux64&lang=en-US' | sed -E 's/(.*href=")([^"]+)(".*)/\2/') - curl -s -o thunderbird.tar.bz2 $TBDOWNLOAD - tar -xjvf thunderbird.tar.bz2 - thunderbird/thunderbird --version script: - export TBPROFILE="$(pwd)/tb-test-profile" - export TMPDIR="$(pwd)/tmp" - export XAUTHORITY="$(pwd)/tmp/.Xauthority" - export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/ - ./configure --enable-tests --with-tb-path=`printf '%s/thunderbird/thunderbird' "$(pwd)"` --with-tb-args="--headless --profile $TBPROFILE" - make dirs xpi - cat config/autoconf.mk - ls $TBPROFILE - cat $TBPROFILE/prefs.js - USER=root xvfb-run -a -f "$XAUTHORITY" $(which make) unit artifacts: paths: - config - tmp - tb-test-profile enigmail-2.0.8/.jsbeautifyrc000066400000000000000000000011501334302754500160040ustar00rootroot00000000000000{ "indent_size": 2, "indent_char": " ", "eol": "\n", "indent_level": 0, "indent_with_tabs": false, "preserve_newlines": true, "max_preserve_newlines": 10, "jslint_happy": false, "space_after_anon_function": false, "brace_style": "end-expand", "keep_array_indentation": false, "keep_function_indentation": false, "space_before_conditional": true, "break_chained_methods": false, "eval_code": false, "unescape_strings": false, "wrap_line_length": 0, "wrap_attributes": "auto", "wrap_attributes_indent_size": 4, "end_with_newline": true } enigmail-2.0.8/.travis.yml000066400000000000000000000005001334302754500154200ustar00rootroot00000000000000language: c sudo: required compiler: - gcc install: provisioning/provision-travis.sh script: - ./configure --with-tb-path=$(which thunderbird) - make > /dev/null 2>&1 - Xvfb :99 -screen 0 1024x768x24 >/dev/null 2>&1 & - export DISPLAY=:99 - make eslint - ./test.sh after_failure: - cat test_output.log enigmail-2.0.8/COMPILING000066400000000000000000000010151334302754500145550ustar00rootroot00000000000000Instructions for compiling and packaging Enigmail ================================================= Prerequisites ------------- In order to build Enigmail you will need the following helper tools: - GNU make 3.81 or newer - zip - python 2.7 or newer - perl 5 or newer If you want to execute unit tests, you will also need: - eslint (installable via node.js / npm, see https://eslint.org) Building -------- Execute the following commands: ./configure make The resulting XPI file can be found in the "build" directory. enigmail-2.0.8/LICENSE000066400000000000000000000410331334302754500143220ustar00rootroot00000000000000This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/. Mozilla Public License Version 2.0 ================================== 1. Definitions -------------- 1.1. "Contributor" means each individual or legal entity that creates, contributes to the creation of, or owns Covered Software. 1.2. "Contributor Version" means the combination of the Contributions of others (if any) used by a Contributor and that particular Contributor's Contribution. 1.3. "Contribution" means Covered Software of a particular Contributor. 1.4. "Covered Software" means Source Code Form to which the initial Contributor has attached the notice in Exhibit A, the Executable Form of such Source Code Form, and Modifications of such Source Code Form, in each case including portions thereof. 1.5. "Incompatible With Secondary Licenses" means (a) that the initial Contributor has attached the notice described in Exhibit B to the Covered Software; or (b) that the Covered Software was made available under the terms of version 1.1 or earlier of the License, but not also under the terms of a Secondary License. 1.6. "Executable Form" means any form of the work other than Source Code Form. 1.7. "Larger Work" means a work that combines Covered Software with other material, in a separate file or files, that is not Covered Software. 1.8. "License" means this document. 1.9. "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently, any and all of the rights conveyed by this License. 1.10. "Modifications" means any of the following: (a) any file in Source Code Form that results from an addition to, deletion from, or modification of the contents of Covered Software; or (b) any new file in Source Code Form that contains any Covered Software. 1.11. "Patent Claims" of a Contributor means any patent claim(s), including without limitation, method, process, and apparatus claims, in any patent Licensable by such Contributor that would be infringed, but for the grant of the License, by the making, using, selling, offering for sale, having made, import, or transfer of either its Contributions or its Contributor Version. 1.12. "Secondary License" means either the GNU General Public License, Version 2.0, the GNU Lesser General Public License, Version 2.1, the GNU Affero General Public License, Version 3.0, or any later versions of those licenses. 1.13. "Source Code Form" means the form of the work preferred for making modifications. 1.14. "You" (or "Your") means an individual or a legal entity exercising rights under this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. 2. License Grants and Conditions -------------------------------- 2.1. Grants Each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license: (a) under intellectual property rights (other than patent or trademark) Licensable by such Contributor to use, reproduce, make available, modify, display, perform, distribute, and otherwise exploit its Contributions, either on an unmodified basis, with Modifications, or as part of a Larger Work; and (b) under Patent Claims of such Contributor to make, use, sell, offer for sale, have made, import, and otherwise transfer either its Contributions or its Contributor Version. 2.2. Effective Date The licenses granted in Section 2.1 with respect to any Contribution become effective for each Contribution on the date the Contributor first distributes such Contribution. 2.3. Limitations on Grant Scope The licenses granted in this Section 2 are the only rights granted under this License. No additional rights or licenses will be implied from the distribution or licensing of Covered Software under this License. Notwithstanding Section 2.1(b) above, no patent license is granted by a Contributor: (a) for any code that a Contributor has removed from Covered Software; or (b) for infringements caused by: (i) Your and any other third party's modifications of Covered Software, or (ii) the combination of its Contributions with other software (except as part of its Contributor Version); or (c) under Patent Claims infringed by Covered Software in the absence of its Contributions. This License does not grant any rights in the trademarks, service marks, or logos of any Contributor (except as may be necessary to comply with the notice requirements in Section 3.4). 2.4. Subsequent Licenses No Contributor makes additional grants as a result of Your choice to distribute the Covered Software under a subsequent version of this License (see Section 10.2) or under the terms of a Secondary License (if permitted under the terms of Section 3.3). 2.5. Representation Each Contributor represents that the Contributor believes its Contributions are its original creation(s) or it has sufficient rights to grant the rights to its Contributions conveyed by this License. 2.6. Fair Use This License is not intended to limit any rights You have under applicable copyright doctrines of fair use, fair dealing, or other equivalents. 2.7. Conditions Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in Section 2.1. 3. Responsibilities ------------------- 3.1. Distribution of Source Form All distribution of Covered Software in Source Code Form, including any Modifications that You create or to which You contribute, must be under the terms of this License. You must inform recipients that the Source Code Form of the Covered Software is governed by the terms of this License, and how they can obtain a copy of this License. You may not attempt to alter or restrict the recipients' rights in the Source Code Form. 3.2. Distribution of Executable Form If You distribute Covered Software in Executable Form then: (a) such Covered Software must also be made available in Source Code Form, as described in Section 3.1, and You must inform recipients of the Executable Form how they can obtain a copy of such Source Code Form by reasonable means in a timely manner, at a charge no more than the cost of distribution to the recipient; and (b) You may distribute such Executable Form under the terms of this License, or sublicense it under different terms, provided that the license for the Executable Form does not attempt to limit or alter the recipients' rights in the Source Code Form under this License. 3.3. Distribution of a Larger Work You may create and distribute a Larger Work under terms of Your choice, provided that You also comply with the requirements of this License for the Covered Software. If the Larger Work is a combination of Covered Software with a work governed by one or more Secondary Licenses, and the Covered Software is not Incompatible With Secondary Licenses, this License permits You to additionally distribute such Covered Software under the terms of such Secondary License(s), so that the recipient of the Larger Work may, at their option, further distribute the Covered Software under the terms of either this License or such Secondary License(s). 3.4. Notices You may not remove or alter the substance of any license notices (including copyright notices, patent notices, disclaimers of warranty, or limitations of liability) contained within the Source Code Form of the Covered Software, except that You may alter any license notices to the extent required to remedy known factual inaccuracies. 3.5. Application of Additional Terms You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, You may do so only on Your own behalf, and not on behalf of any Contributor. You must make it absolutely clear that any such warranty, support, indemnity, or liability obligation is offered by You alone, and You hereby agree to indemnify every Contributor for any liability incurred by such Contributor as a result of warranty, support, indemnity or liability terms You offer. You may include additional disclaimers of warranty and limitations of liability specific to any jurisdiction. 4. Inability to Comply Due to Statute or Regulation --------------------------------------------------- If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Software due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be placed in a text file included with all distributions of the Covered Software under this License. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. 5. Termination -------------- 5.1. The rights granted under this License will terminate automatically if You fail to comply with any of its terms. However, if You become compliant, then the rights granted under this License from a particular Contributor are reinstated (a) provisionally, unless and until such Contributor explicitly and finally terminates Your grants, and (b) on an ongoing basis, if such Contributor fails to notify You of the non-compliance by some reasonable means prior to 60 days after You have come back into compliance. Moreover, Your grants from a particular Contributor are reinstated on an ongoing basis if such Contributor notifies You of the non-compliance by some reasonable means, this is the first time You have received notice of non-compliance with this License from such Contributor, and You become compliant prior to 30 days after Your receipt of the notice. 5.2. If You initiate litigation against any entity by asserting a patent infringement claim (excluding declaratory judgment actions, counter-claims, and cross-claims) alleging that a Contributor Version directly or indirectly infringes any patent, then the rights granted to You by any and all Contributors for the Covered Software under Section 2.1 of this License shall terminate. 5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or Your distributors under this License prior to termination shall survive termination. ************************************************************************ * * * 6. Disclaimer of Warranty * * ------------------------- * * * * Covered Software is provided under this License on an "as is" * * basis, without warranty of any kind, either expressed, implied, or * * statutory, including, without limitation, warranties that the * * Covered Software is free of defects, merchantable, fit for a * * particular purpose or non-infringing. The entire risk as to the * * quality and performance of the Covered Software is with You. * * Should any Covered Software prove defective in any respect, You * * (not any Contributor) assume the cost of any necessary servicing, * * repair, or correction. This disclaimer of warranty constitutes an * * essential part of this License. No use of any Covered Software is * * authorized under this License except under this disclaimer. * * * ************************************************************************ ************************************************************************ * * * 7. Limitation of Liability * * -------------------------- * * * * Under no circumstances and under no legal theory, whether tort * * (including negligence), contract, or otherwise, shall any * * Contributor, or anyone who distributes Covered Software as * * permitted above, be liable to You for any direct, indirect, * * special, incidental, or consequential damages of any character * * including, without limitation, damages for lost profits, loss of * * goodwill, work stoppage, computer failure or malfunction, or any * * and all other commercial damages or losses, even if such party * * shall have been informed of the possibility of such damages. This * * limitation of liability shall not apply to liability for death or * * personal injury resulting from such party's negligence to the * * extent applicable law prohibits such limitation. Some * * jurisdictions do not allow the exclusion or limitation of * * incidental or consequential damages, so this exclusion and * * limitation may not apply to You. * * * ************************************************************************ 8. Litigation ------------- Any litigation relating to this License may be brought only in the courts of a jurisdiction where the defendant maintains its principal place of business and such litigation shall be governed by laws of that jurisdiction, without reference to its conflict-of-law provisions. Nothing in this Section shall prevent a party's ability to bring cross-claims or counter-claims. 9. Miscellaneous ---------------- This License represents the complete agreement concerning the subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not be used to construe this License against a Contributor. 10. Versions of the License --------------------------- 10.1. New Versions Mozilla Foundation is the license steward. Except as provided in Section 10.3, no one other than the license steward has the right to modify or publish new versions of this License. Each version will be given a distinguishing version number. 10.2. Effect of New Versions You may distribute the Covered Software under the terms of the version of the License under which You originally received the Covered Software, or under the terms of any subsequent version published by the license steward. 10.3. Modified Versions If you create software not governed by this License, and you want to create a new license for such software, you may create and use a modified version of this License if you rename the license and remove any references to the name of the license steward (except to note that such modified license differs from this License). 10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses If You choose to distribute Source Code Form that is Incompatible With Secondary Licenses under the terms of this version of the License, the notice described in Exhibit B of this License must be attached. Exhibit A - Source Code Form License Notice ------------------------------------------- This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/. If it is not possible or desirable to put the notice in a particular file, then You may include the notice in a location (such as a LICENSE file in a relevant directory) where a recipient would be likely to look for such a notice. You may add additional accurate notices of copyright ownership. Exhibit B - "Incompatible With Secondary Licenses" Notice --------------------------------------------------------- This Source Code Form is "Incompatible With Secondary Licenses", as defined by the Mozilla Public License, v. 2.0. enigmail-2.0.8/Makefile000066400000000000000000000020511334302754500147520ustar00rootroot00000000000000# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. XPI_MODULE = enigmail XPI_MODULE_VERS = 2.0.8 DEPTH = . include $(DEPTH)/config/autoconf.mk DIRS = ipc ui package lang stdlib ALL = dirs xpi ifeq ($(TESTS),yes) ALL += test endif XPIFILE = $(XPI_MODULE)-$(XPI_MODULE_VERS).xpi .PHONY: dirs $(DIRS) test all: $(ALL) dirs: $(DIRS) $(DIRS): $(MAKE) -C $@ xpi: $(DIRS) $(srcdir)/util/genxpi $(XPIFILE) $(XPI_MODULE_VERS) $(DIST) $(srcdir) $(XPI_MODULE) $(ENABLE_LANG) check: util/checkFiles.py eslint: static_analysis/eslint ipc static_analysis/eslint package static_analysis/eslint ui unit: make -C ipc/tests make -C package/tests make -C ui/tests test: eslint check unit clean: rm -f build/$(XPIFILE) for dir in $(DIRS); do \ if [ "$${dir}x" != "checkx" ]; then \ $(MAKE) -C $$dir clean; fi; \ done distclean: clean rm -rf build/* rm -f config/autoconf.mk config.log config.status enigmail-2.0.8/README.md000066400000000000000000000003161334302754500145730ustar00rootroot00000000000000[![Build Status](https://travis-ci.org/twtiger/enigmail.svg?branch=master)](https://travis-ci.org/twtiger/enigmail) Instructions for setting up the developer environment are in the provisioning directory. enigmail-2.0.8/build.sh000077500000000000000000000005231334302754500147520ustar00rootroot00000000000000#!/usr/bin/env bash # # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. # export TB_PATH=${TB_PATH:-`which thunderbird`} make clean make distclean ./configure --with-tb-path=$TB_PATH make enigmail-2.0.8/config.guess000077500000000000000000001271721334302754500156460ustar00rootroot00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2013 Free Software Foundation, Inc. timestamp='2018-07-10' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner. # # You can get the latest version of this script from: # https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD # # Please send patches with a ChangeLog entry to config-patches@gnu.org. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW64*:*) echo ${UNAME_MACHINE}-pc-mingw64 exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-gnu else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-gnueabi else echo ${UNAME_MACHINE}-unknown-linux-gnueabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-gnu exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:Linux:*:*) LIBC=gnu eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or1k:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; or32:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; padre:Linux:*:*) echo sparc-unknown-linux-gnu exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in i386) eval $set_cc_for_build if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then UNAME_PROCESSOR="x86_64" fi fi ;; unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: enigmail-2.0.8/config.sub000077500000000000000000001052611334302754500153040ustar00rootroot00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2013 Free Software Foundation, Inc. timestamp='2018-07-10' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches with a ChangeLog entry to config-patches@gnu.org. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 \ | or1k | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i386-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or1k-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: enigmail-2.0.8/config/000077500000000000000000000000001334302754500145615ustar00rootroot00000000000000enigmail-2.0.8/config/autoconf.mk.in000066400000000000000000000005051334302754500173350ustar00rootroot00000000000000# @configure_input@ PERL = @PERL@ PYTHON = @PYTHON@ TB_PATH = "@TB_PATH@" TB_ARGS = @TB_ARGS@ TESTS = @enable_tests@ FIX_LANGUAGES = @enable_fix_lang@ ENABLE_LANG = @enable_lang@ srcdir = @srcdir@ DIST = $(DEPTH)/build/dist BUILD = $(DEPTH)/build JSUNIT = $(DEPTH)/util/run-jsunit $(PERL) $(TB_PATH) $(TB_ARGS) -jsunit enigmail-2.0.8/configure.ac000066400000000000000000000034511334302754500156050ustar00rootroot00000000000000# Process this file with autoconf to produce a configure script. AC_PREREQ(2.61) min_automake_version="1.10" AC_INIT([enigmail],[2.0.8], [https://www.enigmail.net]) AC_PATH_PROG(PYTHON, "python2") # fallback to python if python2 does not exist if test "x$PYTHON" = "x" ; then AC_PATH_PROG(PYTHON, "python") fi if test "x$PYTHON" = "x" ; then AC_MSG_ERROR([[python2 or python not found.]]) fi AC_PATH_PROG(PERL,"perl") if test "x$PERL" = "x" ; then AC_MSG_ERROR([[Perl not found.]]) fi AC_CANONICAL_TARGET # Enable running of unit test during build # AC_ARG_ENABLE(tests, AC_HELP_STRING([--enable-tests],[run unit tests during build process]), enable_tests=$enableval) # Disable creation of languages other than en-US (for submitting to babelzilla) # AC_ARG_ENABLE(lang, AC_HELP_STRING([--disable-lang],[disable creation of locales other than en-US]), enable_lang=$enableval, enable_lang=yes ) AC_SUBST(enable_tests) AC_SUBST(enable_lang) AC_ARG_WITH(tb-path, [ --with-tb-path=/path/to/thunderbird set the path to an installed Thunderbird], [if test "$withval" = yes ; then withval=no elif test "$withval" != no ; then TB_PATH="$withval" fi],withval=no) AC_SUBST(TB_PATH) AC_ARG_WITH(tb-args, [ --with-tb-args="-P profilename" set additional arguments for Thunderbird], [if test "$withval" = yes ; then withval=no elif test "$withval" != no ; then TB_ARGS="$withval" fi],withval=no) AC_SUBST(TB_ARGS) AC_ARG_ENABLE(fix-lang, AC_HELP_STRING([--disable-fix-lang],[disable replacing of missing strings in localizations with en-US]), enable_fix_lang=$enableval, enable_fix_lang=yes ) AC_SUBST(enable_fix_lang) AC_CONFIG_FILES([config/autoconf.mk]) AC_OUTPUT enigmail-2.0.8/install-sh000077500000000000000000000332551334302754500153300ustar00rootroot00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2011-11-20.07; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: enigmail-2.0.8/ipc/000077500000000000000000000000001334302754500140675ustar00rootroot00000000000000enigmail-2.0.8/ipc/Makefile000066400000000000000000000006451334302754500155340ustar00rootroot00000000000000# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. DEPTH = .. include $(DEPTH)/config/autoconf.mk DIRS = modules .PHONY: dirs $(DIRS) all: dirs dirs: $(DIRS) $(DIRS): $(MAKE) -C $@ clean: for dir in $(DIRS); do \ $(MAKE) -C $$dir clean; \ done enigmail-2.0.8/ipc/modules/000077500000000000000000000000001334302754500155375ustar00rootroot00000000000000enigmail-2.0.8/ipc/modules/.eslintrc.js000066400000000000000000000002041334302754500177720ustar00rootroot00000000000000module.exports = { "extends": "../../.eslintrc.js", "rules": { "no-constant-condition": 0, "no-invalid-this": 0 } }; enigmail-2.0.8/ipc/modules/Makefile000066400000000000000000000013621334302754500172010ustar00rootroot00000000000000# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. DEPTH = ../.. include $(DEPTH)/config/autoconf.mk EXTRA_JS_MODULES = \ subprocess.jsm \ enigmailprocess_shared_unix.js \ enigmailprocess_worker_common.js \ enigmailprocess_common.jsm \ enigmailprocess_shared_win.js \ enigmailprocess_worker_unix.js \ enigmailprocess_main.jsm \ enigmailprocess_unix.jsm \ enigmailprocess_worker_win.js \ enigmailprocess_shared.js \ enigmailprocess_win.jsm all: $(EXTRA_JS_MODULES) $(DEPTH)/util/install -m 644 $(DIST)/modules $^ clean: $(EXTRA_JS_MODULES) $(DEPTH)/util/install -u $(DIST)/modules $^ enigmail-2.0.8/ipc/modules/enigmailprocess_common.jsm000066400000000000000000000515671334302754500230240ustar00rootroot00000000000000/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */ /* vim: set sts=2 sw=2 et tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; /* eslint-disable mozilla/balanced-listeners */ /* exported BaseProcess, PromiseWorker */ /* global Components: false, ChromeWorker: false, */ var { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components; // const { // Services // } = Cu.import("resource://gre/modules/Services.jsm", {}); /* global Services: false */ Cu.import("resource://gre/modules/XPCOMUtils.jsm"); /* global XPCOMUtils: false */ Cu.importGlobalProperties(["TextDecoder", "TextEncoder"]); XPCOMUtils.defineLazyModuleGetter(this, "AsyncShutdown", "resource://gre/modules/AsyncShutdown.jsm"); /* global AsyncShutdown: false */ XPCOMUtils.defineLazyModuleGetter(this, "setTimeout", "resource://gre/modules/Timer.jsm"); /* global Timer: false */ var SubScriptLoader = Cc["@mozilla.org/moz/jssubscript-loader;1"].getService(Ci.mozIJSSubScriptLoader); SubScriptLoader.loadSubScript("resource://enigmail/enigmailprocess_shared.js", this); var EXPORTED_SYMBOLS = ["BaseProcess", "PromiseWorker", "SubprocessConstants"]; const BUFFER_SIZE = 4096; let nextResponseId = 0; /* global SubprocessConstants: true */ /** * Wraps a ChromeWorker so that messages sent to it return a promise which * resolves when the message has been received and the operation it triggers is * complete. */ class PromiseWorker extends ChromeWorker { constructor(url) { super(url); this.listeners = new Map(); this.pendingResponses = new Map(); this.addListener("close", this.onClose.bind(this)); this.addListener("failure", this.onFailure.bind(this)); this.addListener("success", this.onSuccess.bind(this)); this.addListener("debug", this.onDebug.bind(this)); this.addEventListener("message", this.onmessage); this.shutdown = this.shutdown.bind(this); AsyncShutdown.webWorkersShutdown.addBlocker( "Subprocess.jsm: Shut down IO worker", this.shutdown); } onClose() { AsyncShutdown.webWorkersShutdown.removeBlocker(this.shutdown); } shutdown() { return this.call("shutdown", []); } /** * Adds a listener for the given message from the worker. Any message received * from the worker with a `data.msg` property matching the given `msg` * parameter are passed to the given listener. * * @param {string} msg * The message to listen for. * @param {function(Event)} listener * The listener to call when matching messages are received. */ addListener(msg, listener) { if (!this.listeners.has(msg)) { this.listeners.set(msg, new Set()); } this.listeners.get(msg).add(listener); } /** * Removes the given message listener. * * @param {string} msg * The message to stop listening for. * @param {function(Event)} listener * The listener to remove. */ removeListener(msg, listener) { let listeners = this.listeners.get(msg); if (listeners) { listeners.delete(listener); if (!listeners.size) { this.listeners.delete(msg); } } } onmessage(event) { let { msg } = event.data; let listeners = this.listeners.get(msg) || new Set(); for (let listener of listeners) { try { listener(event.data); } catch (e) { Cu.reportError(e); } } } /** * Called when a message sent to the worker has failed, and rejects its * corresponding promise. * * @private */ onFailure({ msgId, error }) { this.pendingResponses.get(msgId).reject(error); this.pendingResponses.delete(msgId); } /** * Called when a message sent to the worker has succeeded, and resolves its * corresponding promise. * * @private */ onSuccess({ msgId, data }) { this.pendingResponses.get(msgId).resolve(data); this.pendingResponses.delete(msgId); } onDebug({ message }) { //dump(`Worker debug: ${message}\n`); } /** * Calls the given method in the worker, and returns a promise which resolves * or rejects when the method has completed. * * @param {string} method * The name of the method to call. * @param {Array} args * The arguments to pass to the method. * @param {Array} [transferList] * A list of objects to transfer to the worker, rather than cloning. * @returns {Promise} */ call(method, args, transferList = []) { let msgId = nextResponseId++; return new Promise((resolve, reject) => { this.pendingResponses.set(msgId, { resolve, reject }); let message = { msg: method, msgId, args }; this.postMessage(message, transferList); }); } } /** * Represents an input or output pipe connected to a subprocess. * * @property {integer} fd * The file descriptor number of the pipe on the child process's side. * @readonly */ class Pipe { /** * @param {Process} process * The child process that this pipe is connected to. * @param {integer} fd * The file descriptor number of the pipe on the child process's side. * @param {integer} id * The internal ID of the pipe, which ties it to the corresponding Pipe * object on the Worker side. */ constructor(process, fd, id) { this.id = id; this.fd = fd; this.processId = process.id; this.worker = process.worker; /** * @property {boolean} closed * True if the file descriptor has been closed, and can no longer * be read from or written to. Pending IO operations may still * complete, but new operations may not be initiated. * @readonly */ this.closed = false; } /** * Closes the end of the pipe which belongs to this process. * * @param {boolean} force * If true, the pipe is closed immediately, regardless of any pending * IO operations. If false, the pipe is closed after any existing * pending IO operations have completed. * @returns {Promise} * Resolves to an object with no properties once the pipe has been * closed. */ close(force = false) { this.closed = true; return this.worker.call("close", [this.id, force]); } } /** * Represents an output-only pipe, to which data may be written. */ class OutputPipe extends Pipe { constructor(...args) { super(...args); this.encoder = new TextEncoder(); } /** * Writes the given data to the stream. * * When given an array buffer or typed array, ownership of the buffer is * transferred to the IO worker, and it may no longer be used from this * thread. * * @param {ArrayBuffer|TypedArray|string} buffer * Data to write to the stream. * @returns {Promise} * Resolves to an object with a `bytesWritten` property, containing * the number of bytes successfully written, once the operation has * completed. * * @rejects {object} * May be rejected with an Error object, or an object with similar * properties. The object will include an `errorCode` property with * one of the following values if it was rejected for the * corresponding reason: * * - Subprocess.ERROR_END_OF_FILE: The pipe was closed before * all of the data in `buffer` could be written to it. */ write(buffer) { if (typeof buffer === "string") { buffer = this.encoder.encode(buffer); } if (Cu.getClassName(buffer, true) !== "ArrayBuffer") { if (buffer.byteLength === buffer.buffer.byteLength) { buffer = buffer.buffer; } else { buffer = buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength); } } let args = [this.id, buffer]; return this.worker.call("write", args, [buffer]); } } /** * Represents an input-only pipe, from which data may be read. */ class InputPipe extends Pipe { constructor(...args) { super(...args); this.buffers = []; /** * @property {integer} dataAvailable * The number of readable bytes currently stored in the input * buffer. * @readonly */ this.dataAvailable = 0; this.decoder = new TextDecoder(); this.pendingReads = []; this._pendingBufferRead = null; this.fillBuffer(); } /** * @property {integer} bufferSize * The current size of the input buffer. This varies depending on * the size of pending read operations. * @readonly */ get bufferSize() { if (this.pendingReads.length) { return Math.max(this.pendingReads[0].length, BUFFER_SIZE); } return BUFFER_SIZE; } /** * Attempts to fill the input buffer. * * @private */ fillBuffer() { let dataWanted = this.bufferSize - this.dataAvailable; if (!this._pendingBufferRead && dataWanted > 0) { this._pendingBufferRead = this._read(dataWanted); this._pendingBufferRead.then((result) => { this._pendingBufferRead = null; if (result) { this.onInput(result.buffer); this.fillBuffer(); } }); } } _read(size) { let args = [this.id, size]; return this.worker.call("read", args).catch(e => { this.closed = true; for (let { length, resolve, reject } of this.pendingReads.splice(0)) { if (length === null && e.errorCode === SubprocessConstants.ERROR_END_OF_FILE) { resolve(new ArrayBuffer(0)); } else { reject(e); } } }); } /** * Adds the given data to the end of the input buffer. * * @param {ArrayBuffer} buffer * An input buffer to append to the current buffered input. * @private */ onInput(buffer) { this.buffers.push(buffer); this.dataAvailable += buffer.byteLength; this.checkPendingReads(); } /** * Checks the topmost pending read operations and fulfills as many as can be * filled from the current input buffer. * * @private */ checkPendingReads() { this.fillBuffer(); let reads = this.pendingReads; while (reads.length && this.dataAvailable && reads[0].length <= this.dataAvailable) { let pending = this.pendingReads.shift(); let length = pending.length || this.dataAvailable; let result; let byteLength = this.buffers[0].byteLength; if (byteLength == length) { result = this.buffers.shift(); } else if (byteLength > length) { let buffer = this.buffers[0]; this.buffers[0] = buffer.slice(length); result = ArrayBuffer.transfer(buffer, length); } else { result = ArrayBuffer.transfer(this.buffers.shift(), length); let u8result = new Uint8Array(result); while (byteLength < length) { let buffer = this.buffers[0]; let u8buffer = new Uint8Array(buffer); let remaining = length - byteLength; if (buffer.byteLength <= remaining) { this.buffers.shift(); u8result.set(u8buffer, byteLength); } else { this.buffers[0] = buffer.slice(remaining); u8result.set(u8buffer.subarray(0, remaining), byteLength); } byteLength += Math.min(buffer.byteLength, remaining); } } this.dataAvailable -= result.byteLength; pending.resolve(result); } } /** * Reads exactly `length` bytes of binary data from the input stream, or, if * length is not provided, reads the first chunk of data to become available. * In the latter case, returns an empty array buffer on end of file. * * The read operation will not complete until enough data is available to * fulfill the request. If the pipe closes without enough available data to * fulfill the read, the operation fails, and any remaining buffered data is * lost. * * @param {integer} [length] * The number of bytes to read. * @returns {Promise} * * @rejects {object} * May be rejected with an Error object, or an object with similar * properties. The object will include an `errorCode` property with * one of the following values if it was rejected for the * corresponding reason: * * - Subprocess.ERROR_END_OF_FILE: The pipe was closed before * enough input could be read to satisfy the request. */ read(length = null) { if (length !== null && !(Number.isInteger(length) && length >= 0)) { throw new RangeError("Length must be a non-negative integer"); } if (length == 0) { return Promise.resolve(new ArrayBuffer(0)); } return new Promise((resolve, reject) => { this.pendingReads.push({ length, resolve, reject }); this.checkPendingReads(); }); } /** * Reads exactly `length` bytes from the input stream, and parses them as * UTF-8 JSON data. * * @param {integer} length * The number of bytes to read. * @returns {Promise} * * @rejects {object} * May be rejected with an Error object, or an object with similar * properties. The object will include an `errorCode` property with * one of the following values if it was rejected for the * corresponding reason: * * - Subprocess.ERROR_END_OF_FILE: The pipe was closed before * enough input could be read to satisfy the request. * - Subprocess.ERROR_INVALID_JSON: The data read from the pipe * could not be parsed as a valid JSON string. */ readJSON(length) { if (!Number.isInteger(length) || length <= 0) { throw new RangeError("Length must be a positive integer"); } return this.readString(length).then(string => { try { return JSON.parse(string); } catch (e) { e.errorCode = SubprocessConstants.ERROR_INVALID_JSON; throw e; } }); } /** * Reads a chunk of UTF-8 data from the input stream, and converts it to a * JavaScript string. * * If `length` is provided, reads exactly `length` bytes. Otherwise, reads the * first chunk of data to become available, and returns an empty string on end * of file. In the latter case, the chunk is decoded in streaming mode, and * any incomplete UTF-8 sequences at the end of a chunk are returned at the * start of a subsequent read operation. * * @param {integer} [length] * The number of bytes to read. * @param {object} [options] * An options object as expected by TextDecoder.decode. * @returns {Promise} * * @rejects {object} * May be rejected with an Error object, or an object with similar * properties. The object will include an `errorCode` property with * one of the following values if it was rejected for the * corresponding reason: * * - Subprocess.ERROR_END_OF_FILE: The pipe was closed before * enough input could be read to satisfy the request. */ readString(length = null, options = { stream: length === null }) { if (length !== null && !(Number.isInteger(length) && length >= 0)) { throw new RangeError("Length must be a non-negative integer"); } return this.read(length).then(buffer => { return this.decoder.decode(buffer, options); }); } /** * Reads 4 bytes from the input stream, and parses them as an unsigned * integer, in native byte order. * * @returns {Promise} * * @rejects {object} * May be rejected with an Error object, or an object with similar * properties. The object will include an `errorCode` property with * one of the following values if it was rejected for the * corresponding reason: * * - Subprocess.ERROR_END_OF_FILE: The pipe was closed before * enough input could be read to satisfy the request. */ readUint32() { return this.read(4).then(buffer => { return new Uint32Array(buffer)[0]; }); } } /** * @class Process * @extends BaseProcess */ /** * Represents a currently-running process, and allows interaction with it. */ class BaseProcess { /** * @param {PromiseWorker} worker * The worker instance which owns the process. * @param {integer} processId * The internal ID of the Process object, which ties it to the * corresponding process on the Worker side. * @param {integer[]} fds * An array of internal Pipe IDs, one for each standard file descriptor * in the child process. * @param {integer} pid * The operating system process ID of the process. */ constructor(worker, processId, fds, pid) { this.id = processId; this.worker = worker; /** * @property {integer} pid * The process ID of the process, assigned by the operating system. * @readonly */ this.pid = pid; this.exitCode = null; this.exitPromise = new Promise(resolve => { this.worker.call("wait", [this.id]).then(({ exitCode }) => { resolve(Object.freeze({ exitCode })); this.exitCode = exitCode; }); }); if (fds[0] !== undefined) { /** * @property {OutputPipe} stdin * A Pipe object which allows writing to the process's standard * input. * @readonly */ this.stdin = new OutputPipe(this, 0, fds[0]); } if (fds[1] !== undefined) { /** * @property {InputPipe} stdout * A Pipe object which allows reading from the process's standard * output. * @readonly */ this.stdout = new InputPipe(this, 1, fds[1]); } if (fds[2] !== undefined) { /** * @property {InputPipe} [stderr] * An optional Pipe object which allows reading from the * process's standard error output. * @readonly */ this.stderr = new InputPipe(this, 2, fds[2]); } } /** * Spawns a process, and resolves to a BaseProcess instance on success. * * @param {object} options * An options object as passed to `Subprocess.call`. * * @returns {Promise} */ static create(options) { let worker = this.getWorker(); return worker.call("spawn", [options]).then(({ processId, fds, pid }) => { return new this(worker, processId, fds, pid); }); } static get WORKER_URL() { throw new Error("Not implemented"); } static get WorkerClass() { return PromiseWorker; } /** * Gets the current subprocess worker, or spawns a new one if it does not * currently exist. * * @returns {PromiseWorker} */ static getWorker() { if (!this._worker) { this._worker = new this.WorkerClass(this.WORKER_URL); } return this._worker; } /** * Kills the process. * * @param {integer} [timeout=300] * A timeout, in milliseconds, after which the process will be forcibly * killed. On platforms which support it, the process will be sent * a `SIGTERM` signal immediately, so that it has a chance to terminate * gracefully, and a `SIGKILL` signal if it hasn't exited within * `timeout` milliseconds. On other platforms (namely Windows), the * process will be forcibly terminated immediately. * * @returns {Promise} * Resolves to an object with an `exitCode` property when the process * has exited. */ kill(timeout = 300) { // If the process has already exited, don't bother sending a signal. if (this.exitCode !== null) { return this.wait(); } let force = timeout <= 0; this.worker.call("kill", [this.id, force]); if (!force) { setTimeout(() => { if (this.exitCode === null) { this.worker.call("kill", [this.id, true]); } }, timeout); } return this.wait(); } /** * Returns a promise which resolves to the process's exit code, once it has * exited. * * @returns {Promise} * Resolves to an object with an `exitCode` property, containing the * process's exit code, once the process has exited. * * On Unix-like systems, a negative exit code indicates that the * process was killed by a signal whose signal number is the absolute * value of the error code. On Windows, an exit code of -9 indicates * that the process was killed via the {@linkcode BaseProcess#kill kill()} * method. */ wait() { return this.exitPromise; } } enigmail-2.0.8/ipc/modules/enigmailprocess_main.jsm000066400000000000000000000136601334302754500224500ustar00rootroot00000000000000/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */ /* vim: set sts=2 sw=2 et tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ /* * These modules are loosely based on the subprocess.jsm module created * by Jan Gerber and Patrick Brunschwig, though the implementation * differs drastically. */ "use strict"; let EXPORTED_SYMBOLS = ["SubprocessMain"]; /* exported SubprocessMain */ /* global Components: false */ var { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components; Cu.import("resource://gre/modules/AppConstants.jsm"); /* global AppConstants: false */ Cu.import("resource://gre/modules/XPCOMUtils.jsm"); /* global XPCOMUtils: false */ Cu.import("resource://enigmail/enigmailprocess_common.jsm"); /* global SubprocessConstants: false */ if (AppConstants.platform == "win") { XPCOMUtils.defineLazyModuleGetter(this, "SubprocessImpl", "resource://enigmail/enigmailprocess_win.jsm"); /* global SubprocessImpl: false */ } else { XPCOMUtils.defineLazyModuleGetter(this, "SubprocessImpl", "resource://enigmail/enigmailprocess_unix.jsm"); } /** * Allows for creation of and communication with OS-level sub-processes. * @namespace */ var SubprocessMain = { /** * Launches a process, and returns a handle to it. * * @param {object} options * An object describing the process to launch. * * @param {string} options.command * The full path of the execuable to launch. Relative paths are not * accepted, and `$PATH` is not searched. * * If a path search is necessary, the {@link SubprocessMain.pathSearch} method may * be used to map a bare executable name to a full path. * * @param {string[]} [options.arguments] * A list of strings to pass as arguments to the process. * * @param {object} [options.environment] * An object containing a key and value for each environment variable * to pass to the process. Only the object's own, enumerable properties * are added to the environment. * * @param {boolean} [options.environmentAppend] * If true, append the environment variables passed in `environment` to * the existing set of environment variables. Otherwise, the values in * 'environment' constitute the entire set of environment variables * passed to the new process. * * @param {string} [options.stderr] * Defines how the process's stderr output is handled. One of: * * - `"ignore"`: (default) The process's standard error is not redirected. * - `"stdout"`: The process's stderr is merged with its stdout. * - `"pipe"`: The process's stderr is redirected to a pipe, which can be read * from via its `stderr` property. * * @param {string} [options.workdir] * The working directory in which to launch the new process. * * @returns {Promise} * * @rejects {Error} * May be rejected with an Error object if the process can not be * launched. The object will include an `errorCode` property with * one of the following values if it was rejected for the * corresponding reason: * * - SubprocessMain.ERROR_BAD_EXECUTABLE: The given command could not * be found, or the file that it references is not executable. * * Note that if the process is successfully launched, but exits with * a non-zero exit code, the promise will still resolve successfully. */ call(options) { options = Object.assign({}, options); options.stderr = options.stderr || "ignore"; options.workdir = options.workdir || null; let environment = {}; if (!options.environment || options.environmentAppend) { environment = this.getEnvironment(); } if (options.environment) { Object.assign(environment, options.environment); } options.environment = Object.keys(environment) .map(key => `${key}=${environment[key]}`); options.arguments = Array.from(options.arguments || []); return Promise.resolve(SubprocessImpl.isExecutableFile(options.command)).then(isExecutable => { if (!isExecutable) { let error = new Error(`File at path "${options.command}" does not exist, or is not executable`); error.errorCode = SubprocessConstants.ERROR_BAD_EXECUTABLE; throw error; } options.arguments.unshift(options.command); return SubprocessImpl.call(options); }); }, /** * Returns an object with a key-value pair for every variable in the process's * current environment. * * @returns {object} */ getEnvironment() { let environment = Object.create(null); for (let [k, v] of SubprocessImpl.getEnvironment()) { environment[k] = v; } return environment; }, /** * Searches for the given executable file in the system executable * file paths as specified by the PATH environment variable. * * On Windows, if the unadorned filename cannot be found, the * extensions in the semicolon-separated list in the PATHSEP * environment variable are successively appended to the original * name and searched for in turn. * * @param {string} command * The name of the executable to find. * @param {object} [environment] * An object containing a key for each environment variable to be used * in the search. If not provided, full the current process environment * is used. * @returns {Promise} */ pathSearch(command, environment = this.getEnvironment()) { // Promise.resolve lets us get around returning one of the Promise.jsm // pseudo-promises returned by Task.jsm. let path = SubprocessImpl.pathSearch(command, environment); return Promise.resolve(path); } }; Object.assign(SubprocessMain, SubprocessConstants); Object.freeze(SubprocessMain); enigmail-2.0.8/ipc/modules/enigmailprocess_shared.js000066400000000000000000000050601334302754500226100ustar00rootroot00000000000000/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */ /* vim: set sts=2 sw=2 et tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; /* exported Library, SubprocessConstants */ /* global ctypes: false */ if (!ArrayBuffer.transfer) { /** * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer/transfer * * @param {ArrayBuffer} buffer * @param {integer} [size = buffer.byteLength] * @returns {ArrayBuffer} */ ArrayBuffer.transfer = function(buffer, size = buffer.byteLength) { let u8out = new Uint8Array(size); let u8buffer = new Uint8Array(buffer, 0, Math.min(size, buffer.byteLength)); u8out.set(u8buffer); return u8out.buffer; }; } var libraries = {}; class Library { constructor(name, names, definitions) { if (name in libraries) { return libraries[name]; } for (let name of names) { try { if (!this.library) { this.library = ctypes.open(name); } } catch (e) { // Ignore errors until we've tried all the options. } } if (!this.library) { throw new Error("Could not load libc"); } libraries[name] = this; for (let symbol of Object.keys(definitions)) { this.declare(symbol, ...definitions[symbol]); } return this; } declare(name, ...args) { Object.defineProperty(this, name, { configurable: true, get() { Object.defineProperty(this, name, { configurable: true, value: this.library.declare(name, ...args) }); return this[name]; } }); } } /** * Holds constants which apply to various Subprocess operations. * @namespace * @lends Subprocess */ const SubprocessConstants = { /** * @property {integer} ERROR_END_OF_FILE * The operation failed because the end of the file was reached. * @constant */ ERROR_END_OF_FILE: 0xff7a0001, /** * @property {integer} ERROR_INVALID_JSON * The operation failed because an invalid JSON was encountered. * @constant */ ERROR_INVALID_JSON: 0xff7a0002, /** * @property {integer} ERROR_BAD_EXECUTABLE * The operation failed because the given file did not exist, or * could not be executed. * @constant */ ERROR_BAD_EXECUTABLE: 0xff7a0003 }; Object.freeze(SubprocessConstants); enigmail-2.0.8/ipc/modules/enigmailprocess_shared_unix.js000066400000000000000000000064361334302754500236630ustar00rootroot00000000000000/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */ /* vim: set sts=2 sw=2 et tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; /* exported libc */ /* global ctypes: false, OS: false, Library: false */ const LIBC = OS.Constants.libc; const LIBC_CHOICES = ["libc.so", "libSystem.B.dylib", "a.out"]; const unix = { pid_t: ctypes.int32_t, pollfd: new ctypes.StructType("pollfd", [{ "fd": ctypes.int }, { "events": ctypes.short }, { "revents": ctypes.short }]), posix_spawn_file_actions_t: ctypes.uint8_t.array( LIBC.OSFILE_SIZEOF_POSIX_SPAWN_FILE_ACTIONS_T), WEXITSTATUS(status) { return (status >> 8) & 0xff; }, WTERMSIG(status) { return status & 0x7f; } }; var libc = new Library("libc", LIBC_CHOICES, { environ: [ctypes.char.ptr.ptr], // Darwin-only. _NSGetEnviron: [ ctypes.default_abi, ctypes.char.ptr.ptr.ptr ], chdir: [ ctypes.default_abi, ctypes.int, ctypes.char.ptr /* path */ ], close: [ ctypes.default_abi, ctypes.int, ctypes.int /* fildes */ ], fcntl: [ ctypes.default_abi, ctypes.int, ctypes.int, /* fildes */ ctypes.int, /* cmd */ ctypes.int /* ... */ ], getcwd: [ ctypes.default_abi, ctypes.char.ptr, ctypes.char.ptr, /* buf */ ctypes.size_t /* size */ ], kill: [ ctypes.default_abi, ctypes.int, unix.pid_t, /* pid */ ctypes.int /* signal */ ], pipe: [ ctypes.default_abi, ctypes.int, ctypes.int.array(2) /* pipefd */ ], poll: [ ctypes.default_abi, ctypes.int, unix.pollfd.array(), /* fds */ ctypes.unsigned_int, /* nfds */ ctypes.int /* timeout */ ], posix_spawn: [ ctypes.default_abi, ctypes.int, unix.pid_t.ptr, /* pid */ ctypes.char.ptr, /* path */ unix.posix_spawn_file_actions_t.ptr, /* file_actions */ ctypes.voidptr_t, /* attrp */ ctypes.char.ptr.ptr, /* argv */ ctypes.char.ptr.ptr /* envp */ ], posix_spawn_file_actions_addclose: [ ctypes.default_abi, ctypes.int, unix.posix_spawn_file_actions_t.ptr, /* file_actions */ ctypes.int /* fildes */ ], posix_spawn_file_actions_adddup2: [ ctypes.default_abi, ctypes.int, unix.posix_spawn_file_actions_t.ptr, /* file_actions */ ctypes.int, /* fildes */ ctypes.int /* newfildes */ ], posix_spawn_file_actions_destroy: [ ctypes.default_abi, ctypes.int, unix.posix_spawn_file_actions_t.ptr /* file_actions */ ], posix_spawn_file_actions_init: [ ctypes.default_abi, ctypes.int, unix.posix_spawn_file_actions_t.ptr /* file_actions */ ], read: [ ctypes.default_abi, ctypes.ssize_t, ctypes.int, /* fildes */ ctypes.char.ptr, /* buf */ ctypes.size_t /* nbyte */ ], waitpid: [ ctypes.default_abi, unix.pid_t, unix.pid_t, /* pid */ ctypes.int.ptr, /* status */ ctypes.int /* options */ ], write: [ ctypes.default_abi, ctypes.ssize_t, ctypes.int, /* fildes */ ctypes.char.ptr, /* buf */ ctypes.size_t /* nbyte */ ] }); unix.Fd = function(fd) { return ctypes.CDataFinalizer(ctypes.int(fd), libc.close); }; enigmail-2.0.8/ipc/modules/enigmailprocess_shared_win.js000066400000000000000000000326071334302754500234740ustar00rootroot00000000000000/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */ /* vim: set sts=2 sw=2 et tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; /* exported LIBC, Win, createPipe, libc */ /* global ctypes: false, OS: false, Library: false */ /* eslint no-void: 0 */ const LIBC = OS.Constants.libc; const Win = OS.Constants.Win; const LIBC_CHOICES = ["kernel32.dll"]; var win32 = { // On Windows 64, winapi_abi is an alias for default_abi. WINAPI: ctypes.winapi_abi, VOID: ctypes.void_t, BYTE: ctypes.uint8_t, WORD: ctypes.uint16_t, DWORD: ctypes.uint32_t, LONG: ctypes.long, LARGE_INTEGER: ctypes.int64_t, ULONGLONG: ctypes.uint64_t, UINT: ctypes.unsigned_int, UCHAR: ctypes.unsigned_char, BOOL: ctypes.bool, HANDLE: ctypes.voidptr_t, PVOID: ctypes.voidptr_t, LPVOID: ctypes.voidptr_t, CHAR: ctypes.char, WCHAR: ctypes.jschar, ULONG_PTR: ctypes.uintptr_t, SIZE_T: ctypes.size_t, PSIZE_T: ctypes.size_t.ptr }; Object.assign(win32, { DWORD_PTR: win32.ULONG_PTR, LPSTR: win32.CHAR.ptr, LPWSTR: win32.WCHAR.ptr, LPBYTE: win32.BYTE.ptr, LPDWORD: win32.DWORD.ptr, LPHANDLE: win32.HANDLE.ptr, // This is an opaque type. PROC_THREAD_ATTRIBUTE_LIST: ctypes.char.array(), LPPROC_THREAD_ATTRIBUTE_LIST: ctypes.char.ptr }); Object.assign(win32, { LPCSTR: win32.LPSTR, LPCWSTR: win32.LPWSTR, LPCVOID: win32.LPVOID }); Object.assign(win32, { INVALID_HANDLE_VALUE: ctypes.cast(ctypes.int64_t(-1), win32.HANDLE), NULL_HANDLE_VALUE: ctypes.cast(ctypes.uintptr_t(0), win32.HANDLE), CREATE_SUSPENDED: 0x00000004, CREATE_NEW_CONSOLE: 0x00000010, CREATE_UNICODE_ENVIRONMENT: 0x00000400, CREATE_NO_WINDOW: 0x08000000, CREATE_BREAKAWAY_FROM_JOB: 0x01000000, EXTENDED_STARTUPINFO_PRESENT: 0x00080000, STARTF_USESTDHANDLES: 0x0100, DUPLICATE_CLOSE_SOURCE: 0x01, DUPLICATE_SAME_ACCESS: 0x02, ERROR_HANDLE_EOF: 38, ERROR_BROKEN_PIPE: 109, ERROR_INSUFFICIENT_BUFFER: 122, FILE_FLAG_OVERLAPPED: 0x40000000, PIPE_TYPE_BYTE: 0x00, PIPE_ACCESS_INBOUND: 0x01, PIPE_ACCESS_OUTBOUND: 0x02, PIPE_ACCESS_DUPLEX: 0x03, PIPE_WAIT: 0x00, PIPE_NOWAIT: 0x01, STILL_ACTIVE: 259, PROC_THREAD_ATTRIBUTE_HANDLE_LIST: 0x00020002, JobObjectBasicLimitInformation: 2, JobObjectExtendedLimitInformation: 9, JOB_OBJECT_LIMIT_BREAKAWAY_OK: 0x00000800, // These constants are 32-bit unsigned integers, but Windows defines // them as negative integers cast to an unsigned type. STD_INPUT_HANDLE: -10 + 0x100000000, STD_OUTPUT_HANDLE: -11 + 0x100000000, STD_ERROR_HANDLE: -12 + 0x100000000, WAIT_TIMEOUT: 0x00000102, WAIT_FAILED: 0xffffffff }); Object.assign(win32, { JOBOBJECT_BASIC_LIMIT_INFORMATION: new ctypes.StructType("JOBOBJECT_BASIC_LIMIT_INFORMATION", [{ "PerProcessUserTimeLimit": win32.LARGE_INTEGER }, { "PerJobUserTimeLimit": win32.LARGE_INTEGER }, { "LimitFlags": win32.DWORD }, { "MinimumWorkingSetSize": win32.SIZE_T }, { "MaximumWorkingSetSize": win32.SIZE_T }, { "ActiveProcessLimit": win32.DWORD }, { "Affinity": win32.ULONG_PTR }, { "PriorityClass": win32.DWORD }, { "SchedulingClass": win32.DWORD }]), IO_COUNTERS: new ctypes.StructType("IO_COUNTERS", [{ "ReadOperationCount": win32.ULONGLONG }, { "WriteOperationCount": win32.ULONGLONG }, { "OtherOperationCount": win32.ULONGLONG }, { "ReadTransferCount": win32.ULONGLONG }, { "WriteTransferCount": win32.ULONGLONG }, { "OtherTransferCount": win32.ULONGLONG }]) }); Object.assign(win32, { JOBOBJECT_EXTENDED_LIMIT_INFORMATION: new ctypes.StructType("JOBOBJECT_EXTENDED_LIMIT_INFORMATION", [{ "BasicLimitInformation": win32.JOBOBJECT_BASIC_LIMIT_INFORMATION }, { "IoInfo": win32.IO_COUNTERS }, { "ProcessMemoryLimit": win32.SIZE_T }, { "JobMemoryLimit": win32.SIZE_T }, { "PeakProcessMemoryUsed": win32.SIZE_T }, { "PeakJobMemoryUsed": win32.SIZE_T }]), OVERLAPPED: new ctypes.StructType("OVERLAPPED", [{ "Internal": win32.ULONG_PTR }, { "InternalHigh": win32.ULONG_PTR }, { "Offset": win32.DWORD }, { "OffsetHigh": win32.DWORD }, { "hEvent": win32.HANDLE }]), PROCESS_INFORMATION: new ctypes.StructType("PROCESS_INFORMATION", [{ "hProcess": win32.HANDLE }, { "hThread": win32.HANDLE }, { "dwProcessId": win32.DWORD }, { "dwThreadId": win32.DWORD }]), SECURITY_ATTRIBUTES: new ctypes.StructType("SECURITY_ATTRIBUTES", [{ "nLength": win32.DWORD }, { "lpSecurityDescriptor": win32.LPVOID }, { "bInheritHandle": win32.BOOL }]), STARTUPINFOW: new ctypes.StructType("STARTUPINFOW", [{ "cb": win32.DWORD }, { "lpReserved": win32.LPWSTR }, { "lpDesktop": win32.LPWSTR }, { "lpTitle": win32.LPWSTR }, { "dwX": win32.DWORD }, { "dwY": win32.DWORD }, { "dwXSize": win32.DWORD }, { "dwYSize": win32.DWORD }, { "dwXCountChars": win32.DWORD }, { "dwYCountChars": win32.DWORD }, { "dwFillAttribute": win32.DWORD }, { "dwFlags": win32.DWORD }, { "wShowWindow": win32.WORD }, { "cbReserved2": win32.WORD }, { "lpReserved2": win32.LPBYTE }, { "hStdInput": win32.HANDLE }, { "hStdOutput": win32.HANDLE }, { "hStdError": win32.HANDLE }]) }); Object.assign(win32, { STARTUPINFOEXW: new ctypes.StructType("STARTUPINFOEXW", [{ "StartupInfo": win32.STARTUPINFOW }, { "lpAttributeList": win32.LPPROC_THREAD_ATTRIBUTE_LIST }]) }); var libc = new Library("libc", LIBC_CHOICES, { AssignProcessToJobObject: [ win32.WINAPI, win32.BOOL, win32.HANDLE, /* hJob */ win32.HANDLE /* hProcess */ ], CloseHandle: [ win32.WINAPI, win32.BOOL, win32.HANDLE /* hObject */ ], CreateEventW: [ win32.WINAPI, win32.HANDLE, win32.SECURITY_ATTRIBUTES.ptr, /* opt lpEventAttributes */ win32.BOOL, /* bManualReset */ win32.BOOL, /* bInitialState */ win32.LPWSTR /* lpName */ ], CreateFileW: [ win32.WINAPI, win32.HANDLE, win32.LPWSTR, /* lpFileName */ win32.DWORD, /* dwDesiredAccess */ win32.DWORD, /* dwShareMode */ win32.SECURITY_ATTRIBUTES.ptr, /* opt lpSecurityAttributes */ win32.DWORD, /* dwCreationDisposition */ win32.DWORD, /* dwFlagsAndAttributes */ win32.HANDLE /* opt hTemplateFile */ ], CreateJobObjectW: [ win32.WINAPI, win32.HANDLE, win32.SECURITY_ATTRIBUTES.ptr, /* opt lpJobAttributes */ win32.LPWSTR /* lpName */ ], CreateNamedPipeW: [ win32.WINAPI, win32.HANDLE, win32.LPWSTR, /* lpName */ win32.DWORD, /* dwOpenMode */ win32.DWORD, /* dwPipeMode */ win32.DWORD, /* nMaxInstances */ win32.DWORD, /* nOutBufferSize */ win32.DWORD, /* nInBufferSize */ win32.DWORD, /* nDefaultTimeOut */ win32.SECURITY_ATTRIBUTES.ptr /* opt lpSecurityAttributes */ ], CreatePipe: [ win32.WINAPI, win32.BOOL, win32.LPHANDLE, /* out hReadPipe */ win32.LPHANDLE, /* out hWritePipe */ win32.SECURITY_ATTRIBUTES.ptr, /* opt lpPipeAttributes */ win32.DWORD /* nSize */ ], CreateProcessW: [ win32.WINAPI, win32.BOOL, win32.LPCWSTR, /* lpApplicationName */ win32.LPWSTR, /* lpCommandLine */ win32.SECURITY_ATTRIBUTES.ptr, /* lpProcessAttributes */ win32.SECURITY_ATTRIBUTES.ptr, /* lpThreadAttributes */ win32.BOOL, /* bInheritHandle */ win32.DWORD, /* dwCreationFlags */ win32.LPVOID, /* opt lpEnvironment */ win32.LPCWSTR, /* opt lpCurrentDirectory */ win32.STARTUPINFOW.ptr, /* lpStartupInfo */ win32.PROCESS_INFORMATION.ptr /* out lpProcessInformation */ ], CreateSemaphoreW: [ win32.WINAPI, win32.HANDLE, win32.SECURITY_ATTRIBUTES.ptr, /* opt lpSemaphoreAttributes */ win32.LONG, /* lInitialCount */ win32.LONG, /* lMaximumCount */ win32.LPCWSTR /* opt lpName */ ], DeleteProcThreadAttributeList: [ win32.WINAPI, win32.VOID, win32.LPPROC_THREAD_ATTRIBUTE_LIST /* in/out lpAttributeList */ ], DuplicateHandle: [ win32.WINAPI, win32.BOOL, win32.HANDLE, /* hSourceProcessHandle */ win32.HANDLE, /* hSourceHandle */ win32.HANDLE, /* hTargetProcessHandle */ win32.LPHANDLE, /* out lpTargetHandle */ win32.DWORD, /* dwDesiredAccess */ win32.BOOL, /* bInheritHandle */ win32.DWORD /* dwOptions */ ], FreeEnvironmentStringsW: [ win32.WINAPI, win32.BOOL, win32.LPCWSTR /* lpszEnvironmentBlock */ ], GetCurrentProcess: [ win32.WINAPI, win32.HANDLE ], GetCurrentProcessId: [ win32.WINAPI, win32.DWORD ], GetEnvironmentStringsW: [ win32.WINAPI, win32.LPCWSTR ], GetExitCodeProcess: [ win32.WINAPI, win32.BOOL, win32.HANDLE, /* hProcess */ win32.LPDWORD /* lpExitCode */ ], GetOverlappedResult: [ win32.WINAPI, win32.BOOL, win32.HANDLE, /* hFile */ win32.OVERLAPPED.ptr, /* lpOverlapped */ win32.LPDWORD, /* lpNumberOfBytesTransferred */ win32.BOOL /* bWait */ ], GetStdHandle: [ win32.WINAPI, win32.HANDLE, win32.DWORD /* nStdHandle */ ], InitializeProcThreadAttributeList: [ win32.WINAPI, win32.BOOL, win32.LPPROC_THREAD_ATTRIBUTE_LIST, /* out opt lpAttributeList */ win32.DWORD, /* dwAttributeCount */ win32.DWORD, /* dwFlags */ win32.PSIZE_T /* in/out lpSize */ ], ReadFile: [ win32.WINAPI, win32.BOOL, win32.HANDLE, /* hFile */ win32.LPVOID, /* out lpBuffer */ win32.DWORD, /* nNumberOfBytesToRead */ win32.LPDWORD, /* opt out lpNumberOfBytesRead */ win32.OVERLAPPED.ptr /* opt in/out lpOverlapped */ ], ReleaseSemaphore: [ win32.WINAPI, win32.BOOL, win32.HANDLE, /* hSemaphore */ win32.LONG, /* lReleaseCount */ win32.LONG.ptr /* opt out lpPreviousCount */ ], ResumeThread: [ win32.WINAPI, win32.DWORD, win32.HANDLE /* hThread */ ], SetInformationJobObject: [ win32.WINAPI, win32.BOOL, win32.HANDLE, /* hJob */ ctypes.int, /* JobObjectInfoClass */ win32.LPVOID, /* lpJobObjectInfo */ win32.DWORD /* cbJobObjectInfoLengt */ ], TerminateJobObject: [ win32.WINAPI, win32.BOOL, win32.HANDLE, /* hJob */ win32.UINT /* uExitCode */ ], TerminateProcess: [ win32.WINAPI, win32.BOOL, win32.HANDLE, /* hProcess */ win32.UINT /* uExitCode */ ], UpdateProcThreadAttribute: [ win32.WINAPI, win32.BOOL, win32.LPPROC_THREAD_ATTRIBUTE_LIST, /* in/out lpAttributeList */ win32.DWORD, /* dwFlags */ win32.DWORD_PTR, /* Attribute */ win32.PVOID, /* lpValue */ win32.SIZE_T, /* cbSize */ win32.PVOID, /* out opt lpPreviousValue */ win32.PSIZE_T /* opt lpReturnSize */ ], WaitForMultipleObjects: [ win32.WINAPI, win32.DWORD, win32.DWORD, /* nCount */ win32.HANDLE.ptr, /* hHandles */ win32.BOOL, /* bWaitAll */ win32.DWORD /* dwMilliseconds */ ], WaitForSingleObject: [ win32.WINAPI, win32.DWORD, win32.HANDLE, /* hHandle */ win32.BOOL, /* bWaitAll */ win32.DWORD /* dwMilliseconds */ ], WriteFile: [ win32.WINAPI, win32.BOOL, win32.HANDLE, /* hFile */ win32.LPCVOID, /* lpBuffer */ win32.DWORD, /* nNumberOfBytesToRead */ win32.LPDWORD, /* opt out lpNumberOfBytesWritten */ win32.OVERLAPPED.ptr /* opt in/out lpOverlapped */ ] }); let nextNamedPipeId = 0; win32.Handle = function(handle) { return ctypes.CDataFinalizer(win32.HANDLE(handle), libc.CloseHandle); }; win32.createPipe = function(secAttr, readFlags = 0, writeFlags = 0, size = 0) { readFlags |= win32.PIPE_ACCESS_INBOUND; writeFlags |= Win.FILE_ATTRIBUTE_NORMAL; if (size == 0) { size = 4096; } let pid = libc.GetCurrentProcessId(); let pipeName = String.raw `\\.\Pipe\SubProcessPipe.${pid}.${nextNamedPipeId++}`; let readHandle = libc.CreateNamedPipeW( pipeName, readFlags, win32.PIPE_TYPE_BYTE | win32.PIPE_WAIT, 1, /* number of connections */ size, /* output buffer size */ size, /* input buffer size */ 0, /* timeout */ secAttr.address()); let isInvalid = handle => String(handle) == String(win32.HANDLE(Win.INVALID_HANDLE_VALUE)); if (isInvalid(readHandle)) { return []; } let writeHandle = libc.CreateFileW( pipeName, Win.GENERIC_WRITE, 0, secAttr.address(), Win.OPEN_EXISTING, writeFlags, null); if (isInvalid(writeHandle)) { libc.CloseHandle(readHandle); return []; } return [win32.Handle(readHandle), win32.Handle(writeHandle) ]; }; win32.createThreadAttributeList = function(handles) { try { void libc.InitializeProcThreadAttributeList; void libc.DeleteProcThreadAttributeList; void libc.UpdateProcThreadAttribute; } catch (e) { // This is only supported in Windows Vista and later. return null; } let size = win32.SIZE_T(); if (!libc.InitializeProcThreadAttributeList(null, 1, 0, size.address()) && ctypes.winLastError != win32.ERROR_INSUFFICIENT_BUFFER) { return null; } let attrList = win32.PROC_THREAD_ATTRIBUTE_LIST(size.value); if (!libc.InitializeProcThreadAttributeList(attrList, 1, 0, size.address())) { return null; } let ok = libc.UpdateProcThreadAttribute( attrList, 0, win32.PROC_THREAD_ATTRIBUTE_HANDLE_LIST, handles, handles.constructor.size, null, null); if (!ok) { libc.DeleteProcThreadAttributeList(attrList); return null; } return attrList; }; enigmail-2.0.8/ipc/modules/enigmailprocess_unix.jsm000066400000000000000000000113051334302754500225010ustar00rootroot00000000000000/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */ /* vim: set sts=2 sw=2 et tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; /* eslint-disable mozilla/balanced-listeners */ /* exported SubprocessImpl */ /* globals BaseProcess, PromiseWorker */ /* global Components: false, libc: false, LIBC: false, OS: false */ var { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components; var EXPORTED_SYMBOLS = ["SubprocessImpl"]; Cu.import("resource://gre/modules/ctypes.jsm"); /* global ctypes: false */ Cu.import("resource://gre/modules/osfile.jsm"); /* global ctypes: false */ Cu.import("resource://gre/modules/Services.jsm"); /* global Services: false */ Cu.import("resource://gre/modules/Task.jsm"); /* global Task: false */ Cu.import("resource://enigmail/enigmailprocess_common.jsm"); /* global SubprocessConstants: false */ Services.scriptloader.loadSubScript("resource://enigmail/enigmailprocess_shared.js", this); Services.scriptloader.loadSubScript("resource://enigmail/enigmailprocess_shared_unix.js", this); class UnixPromiseWorker extends PromiseWorker { constructor(...args) { super(...args); let fds = ctypes.int.array(2)(); let res = libc.pipe(fds); if (res == -1) { throw new Error("Unable to create pipe"); } this.signalFd = fds[1]; libc.fcntl(fds[0], LIBC.F_SETFL, LIBC.O_NONBLOCK); libc.fcntl(fds[0], LIBC.F_SETFD, LIBC.FD_CLOEXEC); libc.fcntl(fds[1], LIBC.F_SETFD, LIBC.FD_CLOEXEC); this.call("init", [{ signalFd: fds[0] }]); } closePipe() { if (this.signalFd) { libc.close(this.signalFd); this.signalFd = null; } } onClose() { this.closePipe(); super.onClose(); } signalWorker() { libc.write(this.signalFd, new ArrayBuffer(1), 1); } postMessage(...args) { this.signalWorker(); return super.postMessage(...args); } } class Process extends BaseProcess { static get WORKER_URL() { return "resource://enigmail/enigmailprocess_worker_unix.js"; } static get WorkerClass() { return UnixPromiseWorker; } } var SubprocessUnix = { Process, call(options) { return Process.create(options); }, * getEnvironment() { let environ; if (OS.Constants.Sys.Name == "Darwin") { environ = libc._NSGetEnviron().contents; } else { environ = libc.environ; } for (let envp = environ; !envp.contents.isNull(); envp = envp.increment()) { let str = envp.contents.readString(); let idx = str.indexOf("="); if (idx >= 0) { yield [str.slice(0, idx), str.slice(idx + 1) ]; } } }, isExecutableFile: Task.async(function* isExecutable(path) { if (!OS.Path.split(path).absolute) { return false; } try { let info = yield OS.File.stat(path); // FIXME: We really want access(path, X_OK) here, but OS.File does not // support it. return !info.isDir && (info.unixMode & 0x49); } catch (e) { return false; } }), /** * Searches for the given executable file in the system executable * file paths as specified by the PATH environment variable. * * On Windows, if the unadorned filename cannot be found, the * extensions in the semicolon-separated list in the PATHEXT * environment variable are successively appended to the original * name and searched for in turn. * * @param {string} bin * The name of the executable to find. * @param {object} environment * An object containing a key for each environment variable to be used * in the search. * @returns {Promise} */ pathSearch: Task.async(function*(bin, environment) { let split = OS.Path.split(bin); if (split.absolute) { if (yield this.isExecutableFile(bin)) { return bin; } let error = new Error(`File at path "${bin}" does not exist, or is not executable`); error.errorCode = SubprocessConstants.ERROR_BAD_EXECUTABLE; throw error; } let dirs = []; if (environment.PATH) { dirs = environment.PATH.split(":"); } for (let dir of dirs) { let path = OS.Path.join(dir, bin); if (yield this.isExecutableFile(path)) { return path; } } let error = new Error(`Executable not found: ${bin}`); error.errorCode = SubprocessConstants.ERROR_BAD_EXECUTABLE; throw error; }) }; var SubprocessImpl = SubprocessUnix; enigmail-2.0.8/ipc/modules/enigmailprocess_win.jsm000066400000000000000000000117711334302754500223220ustar00rootroot00000000000000/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */ /* vim: set sts=2 sw=2 et tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; /* eslint-disable mozilla/balanced-listeners */ /* exported SubprocessImpl */ /* global Components: false, libc: false */ /* globals BaseProcess, PromiseWorker */ var { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components; var EXPORTED_SYMBOLS = ["SubprocessImpl"]; Cu.import("resource://gre/modules/AppConstants.jsm"); /* global AppConstants: false */ Cu.import("resource://gre/modules/ctypes.jsm"); /* global ctypes: false */ Cu.import("resource://gre/modules/osfile.jsm"); /* global OS: false */ Cu.import("resource://gre/modules/Services.jsm"); /* global Services: false */ Cu.import("resource://gre/modules/Task.jsm"); /* global Task: false */ Cu.import("resource://gre/modules/XPCOMUtils.jsm"); /* global XPCOMUtils: false */ Cu.import("resource://enigmail/enigmailprocess_common.jsm"); /* global SubprocessConstants: false */ XPCOMUtils.defineLazyServiceGetter(this, "env", "@mozilla.org/process/environment;1", "nsIEnvironment"); /* global env: false */ Services.scriptloader.loadSubScript("resource://enigmail/enigmailprocess_shared.js", this); Services.scriptloader.loadSubScript("resource://enigmail/enigmailprocess_shared_win.js", this); class WinPromiseWorker extends PromiseWorker { constructor(...args) { super(...args); this.signalEvent = libc.CreateSemaphoreW(null, 0, 32, null); this.call("init", [{ breakAwayFromJob: !AppConstants.isPlatformAndVersionAtLeast("win", "6.2"), comspec: env.get("COMSPEC"), signalEvent: String(ctypes.cast(this.signalEvent, ctypes.uintptr_t).value) }]); } signalWorker() { libc.ReleaseSemaphore(this.signalEvent, 1, null); } postMessage(...args) { this.signalWorker(); return super.postMessage(...args); } } class Process extends BaseProcess { static get WORKER_URL() { return "resource://enigmail/enigmailprocess_worker_win.js"; } static get WorkerClass() { return WinPromiseWorker; } } var SubprocessWin = { Process, call(options) { return Process.create(options); }, * getEnvironment() { let env = libc.GetEnvironmentStringsW(); try { for (let p = env, q = env;; p = p.increment()) { if (p.contents == "\0") { if (String(p) == String(q)) { break; } let str = q.readString(); q = p.increment(); let idx = str.indexOf("="); if (idx == 0) { idx = str.indexOf("=", 1); } if (idx >= 0) { yield [str.slice(0, idx), str.slice(idx + 1)]; } } } } finally { libc.FreeEnvironmentStringsW(env); } }, isExecutableFile: Task.async(function*(path) { if (!OS.Path.split(path).absolute) { return false; } try { let info = yield OS.File.stat(path); return !(info.isDir || info.isSymlink); } catch (e) { return false; } }), /** * Searches for the given executable file in the system executable * file paths as specified by the PATH environment variable. * * On Windows, if the unadorned filename cannot be found, the * extensions in the semicolon-separated list in the PATHEXT * environment variable are successively appended to the original * name and searched for in turn. * * @param {string} bin * The name of the executable to find. * @param {object} environment * An object containing a key for each environment variable to be used * in the search. * @returns {Promise} */ pathSearch: Task.async(function*(bin, environment) { let split = OS.Path.split(bin); if (split.absolute) { if (yield this.isExecutableFile(bin)) { return bin; } let error = new Error(`File at path "${bin}" does not exist, or is not a normal file`); error.errorCode = SubprocessConstants.ERROR_BAD_EXECUTABLE; throw error; } let dirs = []; let exts = []; if (environment.PATH) { dirs = environment.PATH.split(";"); } if (environment.PATHEXT) { exts = environment.PATHEXT.split(";"); } for (let dir of dirs) { let path = OS.Path.join(dir, bin); if (yield this.isExecutableFile(path)) { return path; } for (let ext of exts) { let file = path + ext; if (yield this.isExecutableFile(file)) { return file; } } } let error = new Error(`Executable not found: ${bin}`); error.errorCode = SubprocessConstants.ERROR_BAD_EXECUTABLE; throw error; }) }; var SubprocessImpl = SubprocessWin; enigmail-2.0.8/ipc/modules/enigmailprocess_worker_common.js000066400000000000000000000123271334302754500242270ustar00rootroot00000000000000/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */ /* vim: set sts=2 sw=2 et tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; /* exported BasePipe, BaseProcess, debug */ /* globals Process, io */ /* global ctypes: false, onmessage: true */ /* eslint no-console: 0 */ function debug(message) { self.postMessage({ msg: "debug", message }); } class BasePipe { constructor() { this.closing = false; this.closed = false; this.closedPromise = new Promise(resolve => { this.resolveClosed = resolve; }); this.pending = []; } shiftPending() { let result = this.pending.shift(); if (this.closing && this.pending.length == 0) { this.close(); } return result; } } let nextProcessId = 0; class BaseProcess { constructor(options) { this.id = nextProcessId++; this.exitCode = null; this.exitPromise = new Promise(resolve => { this.resolveExit = resolve; }); this.exitPromise.then(() => { // The input file descriptors will be closed after poll // reports that their input buffers are empty. If we close // them now, we may lose output. this.pipes[0].close(true); }); this.pid = null; this.pipes = []; this.stringArrays = []; this.spawn(options); } /** * Waits for the process to exit and all of its pending IO operations to * complete. * * @returns {Promise} */ awaitFinished() { return Promise.all([ this.exitPromise, ...this.pipes.map(pipe => pipe.closedPromise) ]); } /** * Creates a null-terminated array of pointers to null-terminated C-strings, * and returns it. * * @param {string[]} strings * The strings to convert into a C string array. * * @returns {ctypes.char.ptr.array} */ stringArray(strings) { let result = ctypes.char.ptr.array(strings.length + 1)(); let cstrings = strings.map(str => ctypes.char.array()(str)); for (let [i, cstring] of cstrings.entries()) { result[i] = cstring; } // Char arrays used in char arg and environment vectors must be // explicitly kept alive in a JS object, or they will be reaped // by the GC if it runs before our process is started. this.stringArrays.push(cstrings); return result; } } let requests = { init(details) { io.init(details); return { data: {} }; }, shutdown() { io.shutdown(); return { data: {} }; }, close(pipeId, force = false) { let pipe = io.getPipe(pipeId); return pipe.close(force).then(() => ({ data: {} })); }, spawn(options) { let process = new Process(options); let processId = process.id; io.addProcess(process); let fds = process.pipes.map(pipe => pipe.id); return { data: { processId, fds, pid: process.pid } }; }, kill(processId, force = false) { let process = io.getProcess(processId); process.kill(force ? 9 : 15); return { data: {} }; }, wait(processId) { let process = io.getProcess(processId); process.wait(); process.awaitFinished().then(() => { io.cleanupProcess(process); }); return process.exitPromise.then(exitCode => { return { data: { exitCode } }; }); }, read(pipeId, count) { let pipe = io.getPipe(pipeId); return pipe.read(count).then(buffer => { return { data: { buffer } }; }); }, write(pipeId, buffer) { let pipe = io.getPipe(pipeId); return pipe.write(buffer).then(bytesWritten => { return { data: { bytesWritten } }; }); }, getOpenFiles() { return { data: new Set(io.pipes.keys()) }; }, getProcesses() { let data = new Map(Array.from(io.processes.values()) .filter(proc => proc.exitCode === null) .map(proc => [proc.id, proc.pid])); return { data }; }, waitForNoProcesses() { return Promise.all(Array.from(io.processes.values(), proc => proc.awaitFinished())); } }; onmessage = event => { io.messageCount--; let { msg, msgId, args } = event.data; new Promise(resolve => { resolve(requests[msg](...args)); }).then(result => { let response = { msg: "success", msgId, data: result.data }; self.postMessage(response, result.transfer || []); }).catch(error => { if (error instanceof Error) { error = { message: error.message, fileName: error.fileName, lineNumber: error.lineNumber, column: error.column, stack: error.stack, errorCode: error.errorCode }; } self.postMessage({ msg: "failure", msgId, error }); }).catch(error => { console.error(error); self.postMessage({ msg: "failure", msgId, error: {} }); }); }; enigmail-2.0.8/ipc/modules/enigmailprocess_worker_unix.js000066400000000000000000000356421334302754500237270ustar00rootroot00000000000000/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */ /* vim: set sts=2 sw=2 et tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; /* exported Process */ /* globals BaseProcess, BasePipe */ /* global importScripts: false */ importScripts("resource://enigmail/enigmailprocess_shared.js", "resource://enigmail/enigmailprocess_shared_unix.js", "resource://enigmail/enigmailprocess_worker_common.js"); /* global ctypes: false, LIBC: false, libc: false, unix: false, SubprocessConstants: false */ /* global debug: false */ /* eslint no-console: 0 */ const POLL_TIMEOUT = 5000; let io; let nextPipeId = 0; class Pipe extends BasePipe { constructor(process, fd) { super(); this.process = process; this.fd = fd; this.id = nextPipeId++; } get pollEvents() { throw new Error("Not implemented"); } /** * Closes the file descriptor. * * @param {boolean} [force=false] * If true, the file descriptor is closed immediately. If false, the * file descriptor is closed after all current pending IO operations * have completed. * * @returns {Promise} * Resolves when the file descriptor has been closed. */ close(force = false) { if (!force && this.pending.length) { this.closing = true; return this.closedPromise; } for (let { reject } of this.pending) { let error = new Error("File closed"); error.errorCode = SubprocessConstants.ERROR_END_OF_FILE; reject(error); } this.pending.length = 0; if (!this.closed) { this.fd.dispose(); this.closed = true; this.resolveClosed(); io.pipes.delete(this.id); io.updatePollFds(); } return this.closedPromise; } /** * Called when an error occurred while polling our file descriptor. */ onError() { this.close(true); this.process.wait(); } } class InputPipe extends Pipe { /** * A bit mask of poll() events which we currently wish to be notified of on * this file descriptor. */ get pollEvents() { if (this.pending.length) { return LIBC.POLLIN; } return 0; } /** * Asynchronously reads at most `length` bytes of binary data from the file * descriptor into an ArrayBuffer of the same size. Returns a promise which * resolves when the operation is complete. * * @param {integer} length * The number of bytes to read. * * @returns {Promise} */ read(length) { if (this.closing || this.closed) { throw new Error("Attempt to read from closed pipe"); } return new Promise((resolve, reject) => { this.pending.push({ resolve, reject, length }); io.updatePollFds(); }); } /** * Synchronously reads at most `count` bytes of binary data into an * ArrayBuffer, and returns that buffer. If no data can be read without * blocking, returns null instead. * * @param {integer} count * The number of bytes to read. * * @returns {ArrayBuffer|null} */ readBuffer(count) { let buffer = new ArrayBuffer(count); let read = Number(libc.read(this.fd, buffer, buffer.byteLength)); if (read < 0 && ctypes.errno != LIBC.EAGAIN) { this.onError(); } if (read <= 0) { return null; } if (read < buffer.byteLength) { return ArrayBuffer.transfer(buffer, read); } return buffer; } /** * Called when one of the IO operations matching the `pollEvents` mask may be * performed without blocking. * * @returns {boolean} * True if any data was successfully read. */ onReady() { let result = false; let reads = this.pending; while (reads.length) { let { resolve, length } = reads[0]; let buffer = this.readBuffer(length); if (buffer) { result = true; this.shiftPending(); resolve(buffer); } else { break; } } if (reads.length == 0) { io.updatePollFds(); } return result; } } class OutputPipe extends Pipe { /** * A bit mask of poll() events which we currently wish to be notified of on * this file discriptor. */ get pollEvents() { if (this.pending.length) { return LIBC.POLLOUT; } return 0; } /** * Asynchronously writes the given buffer to our file descriptor, and returns * a promise which resolves when the operation is complete. * * @param {ArrayBuffer} buffer * The buffer to write. * * @returns {Promise} * Resolves to the number of bytes written when the operation is * complete. */ write(buffer) { if (this.closing || this.closed) { throw new Error("Attempt to write to closed pipe"); } return new Promise((resolve, reject) => { this.pending.push({ resolve, reject, buffer, length: buffer.byteLength }); io.updatePollFds(); }); } /** * Attempts to synchronously write the given buffer to our file descriptor. * Writes only as many bytes as can be written without blocking, and returns * the number of byes successfully written. * * Closes the file descriptor if an IO error occurs. * * @param {ArrayBuffer} buffer * The buffer to write. * * @returns {integer} * The number of bytes successfully written. */ writeBuffer(buffer) { let bytesWritten = libc.write(this.fd, buffer, buffer.byteLength); if (bytesWritten < 0 && ctypes.errno != LIBC.EAGAIN) { this.onError(); } return bytesWritten; } /** * Called when one of the IO operations matching the `pollEvents` mask may be * performed without blocking. */ onReady() { let writes = this.pending; while (writes.length) { let { buffer, resolve, length } = writes[0]; let written = this.writeBuffer(buffer); if (written == buffer.byteLength) { resolve(length); this.shiftPending(); } else if (written > 0) { writes[0].buffer = buffer.slice(written); } else { break; } } if (writes.length == 0) { io.updatePollFds(); } } } class Signal { constructor(fd) { this.fd = fd; } cleanup() { libc.close(this.fd); this.fd = null; } get pollEvents() { return LIBC.POLLIN; } /** * Called when an error occurred while polling our file descriptor. */ onError() { io.shutdown(); } /** * Called when one of the IO operations matching the `pollEvents` mask may be * performed without blocking. */ onReady() { let buffer = new ArrayBuffer(16); let count = Number(libc.read(this.fd, buffer, buffer.byteLength)); if (count > 0) { io.messageCount += count; } } } class Process extends BaseProcess { /** * Each Process object opens an additional pipe from the target object, which * will be automatically closed when the process exits, but otherwise * carries no data. * * This property contains a bit mask of poll() events which we wish to be * notified of on this descriptor. We're not expecting any input from this * pipe, but we need to poll for input until the process exits in order to be * notified when the pipe closes. */ get pollEvents() { if (this.exitCode === null) { return LIBC.POLLIN; } return 0; } /** * Kills the process with the given signal. * * @param {integer} signal */ kill(signal) { libc.kill(this.pid, signal); this.wait(); } /** * Initializes the IO pipes for use as standard input, output, and error * descriptors in the spawned process. * * @param {object} options * The Subprocess options object for this process. * @returns {unix.Fd[]} * The array of file descriptors belonging to the spawned process. */ initPipes(options) { let stderr = options.stderr; let our_pipes = []; let their_pipes = new Map(); let pipe = input => { let fds = ctypes.int.array(2)(); let res = libc.pipe(fds); if (res == -1) { throw new Error("Unable to create pipe"); } fds = Array.from(fds, unix.Fd); if (input) { fds.reverse(); } if (input) { our_pipes.push(new InputPipe(this, fds[1])); } else { our_pipes.push(new OutputPipe(this, fds[1])); } libc.fcntl(fds[0], LIBC.F_SETFD, LIBC.FD_CLOEXEC); libc.fcntl(fds[1], LIBC.F_SETFD, LIBC.FD_CLOEXEC); libc.fcntl(fds[1], LIBC.F_SETFL, LIBC.O_NONBLOCK); return fds[0]; }; their_pipes.set(0, pipe(false)); their_pipes.set(1, pipe(true)); if (stderr == "pipe") { their_pipes.set(2, pipe(true)); } else if (stderr == "stdout") { their_pipes.set(2, their_pipes.get(1)); } // Create an additional pipe that we can use to monitor for process exit. their_pipes.set(3, pipe(true)); this.fd = our_pipes.pop().fd; this.pipes = our_pipes; return their_pipes; } spawn(options) { let { command, arguments: args } = options; let argv = this.stringArray(args); let envp = this.stringArray(options.environment); let actions = unix.posix_spawn_file_actions_t(); let actionsp = actions.address(); let fds = this.initPipes(options); let cwd; try { if (options.workdir) { cwd = ctypes.char.array(LIBC.PATH_MAX)(); libc.getcwd(cwd, cwd.length); if (libc.chdir(options.workdir) < 0) { throw new Error(`Unable to change working directory to ${options.workdir}`); } } libc.posix_spawn_file_actions_init(actionsp); for (let [i, fd] of fds.entries()) { libc.posix_spawn_file_actions_adddup2(actionsp, fd, i); } let pid = unix.pid_t(); let rv = libc.posix_spawn(pid.address(), command, actionsp, null, argv, envp); if (rv != 0) { for (let pipe of this.pipes) { pipe.close(); } throw new Error(`Failed to execute command "${command}"`); } this.pid = pid.value; } finally { libc.posix_spawn_file_actions_destroy(actionsp); this.stringArrays.length = 0; if (cwd) { libc.chdir(cwd); } for (let fd of new Set(fds.values())) { fd.dispose(); } } } /** * Called when input is available on our sentinel file descriptor. * * @see pollEvents */ onReady() { // We're not actually expecting any input on this pipe. If we get any, we // can't poll the pipe any further without reading it. if (this.wait() == undefined) { this.kill(9); } } /** * Called when an error occurred while polling our sentinel file descriptor. * * @see pollEvents */ onError() { this.wait(); } /** * Attempts to wait for the process's exit status, without blocking. If * successful, resolves the `exitPromise` to the process's exit value. * * @returns {integer|null} * The process's exit status, if it has already exited. */ wait() { if (this.exitCode !== null) { return this.exitCode; } let status = ctypes.int(); let res = libc.waitpid(this.pid, status.address(), LIBC.WNOHANG); const EINTR = 4; // TODO: change to LIBC.EINTR with TB 59 // If there's a failure here and we get any errno other than EINTR, it // means that the process has been reaped by another thread (most likely // the nspr process wait thread), and its actual exit status is not // available to us. In that case, we have to assume success. if (res == 0 || (res == -1 && ctypes.errno == EINTR)) { return null; } let sig = unix.WTERMSIG(status.value); if (sig) { this.exitCode = -sig; } else { this.exitCode = unix.WEXITSTATUS(status.value); } this.fd.dispose(); io.updatePollFds(); this.resolveExit(this.exitCode); return this.exitCode; } } io = { pollFds: null, pollHandlers: null, pipes: new Map(), processes: new Map(), messageCount: 0, running: true, init(details) { this.signal = new Signal(details.signalFd); this.updatePollFds(); setTimeout(this.loop.bind(this), 0); }, shutdown() { if (this.running) { this.running = false; this.signal.cleanup(); this.signal = null; self.postMessage({ msg: "close" }); self.close(); } }, getPipe(pipeId) { let pipe = this.pipes.get(pipeId); if (!pipe) { let error = new Error("File closed"); error.errorCode = SubprocessConstants.ERROR_END_OF_FILE; throw error; } return pipe; }, getProcess(processId) { let process = this.processes.get(processId); if (!process) { throw new Error(`Invalid process ID: ${processId}`); } return process; }, updatePollFds() { let handlers = [this.signal, ...this.pipes.values(), ...this.processes.values() ]; handlers = handlers.filter(handler => handler.pollEvents); let pollfds = unix.pollfd.array(handlers.length)(); for (let [i, handler] of handlers.entries()) { let pollfd = pollfds[i]; pollfd.fd = handler.fd; pollfd.events = handler.pollEvents; pollfd.revents = 0; } this.pollFds = pollfds; this.pollHandlers = handlers; }, loop() { this.poll(); if (this.running) { setTimeout(this.loop.bind(this), 0); } }, poll() { let handlers = this.pollHandlers; let pollfds = this.pollFds; let timeout = this.messageCount > 0 ? 0 : POLL_TIMEOUT; let count = libc.poll(pollfds, pollfds.length, timeout); for (let i = 0; count && i < pollfds.length; i++) { let pollfd = pollfds[i]; if (pollfd.revents) { count--; let handler = handlers[i]; try { let success = false; if (pollfd.revents & handler.pollEvents) { success = handler.onReady(); } // Only call the error handler in this iteration if we didn't also // have a success. This is necessary because Linux systems set POLLHUP // on a pipe when it's closed but there's still buffered data to be // read, and Darwin sets POLLIN and POLLHUP on a closed pipe, even // when there's no data to be read. if (!success && (pollfd.revents & (LIBC.POLLERR | LIBC.POLLHUP | LIBC.POLLNVAL))) { handler.onError(); } } catch (e) { console.error(e); debug(`Worker error: ${e} :: ${e.stack}`); handler.onError(); } pollfd.revents = 0; } } }, addProcess(process) { this.processes.set(process.id, process); for (let pipe of process.pipes) { this.pipes.set(pipe.id, pipe); } }, cleanupProcess(process) { this.processes.delete(process.id); } }; enigmail-2.0.8/ipc/modules/enigmailprocess_worker_win.js000066400000000000000000000431471334302754500235400ustar00rootroot00000000000000/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */ /* vim: set sts=2 sw=2 et tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; /* exported Process */ /* globals BaseProcess, BasePipe, win32 */ /* global importScripts: false */ importScripts("resource://enigmail/enigmailprocess_shared.js", "resource://enigmail/enigmailprocess_shared_win.js", "resource://enigmail/enigmailprocess_worker_common.js"); /* global ctypes: false, libc: false, unix: false, SubprocessConstants: false */ /* global debug: false */ /* eslint no-console: 0 */ const POLL_TIMEOUT = 5000; // The exit code that we send when we forcibly terminate a process. const TERMINATE_EXIT_CODE = 0x7f; let io; let nextPipeId = 0; class Pipe extends BasePipe { constructor(process, origHandle) { super(); let handle = win32.HANDLE(); let curProc = libc.GetCurrentProcess(); libc.DuplicateHandle(curProc, origHandle, curProc, handle.address(), 0, false /* inheritable */ , win32.DUPLICATE_SAME_ACCESS); origHandle.dispose(); this.id = nextPipeId++; this.process = process; this.handle = win32.Handle(handle); let event = libc.CreateEventW(null, false, false, null); this.overlapped = win32.OVERLAPPED(); this.overlapped.hEvent = event; this._event = win32.Handle(event); this.buffer = null; } get event() { if (this.pending.length) { return this._event; } return null; } maybeClose() {} /** * Closes the file handle. * * @param {boolean} [force=false] * If true, the file handle is closed immediately. If false, the * file handle is closed after all current pending IO operations * have completed. * * @returns {Promise} * Resolves when the file handle has been closed. */ close(force = false) { if (!force && this.pending.length) { this.closing = true; return this.closedPromise; } for (let { reject } of this.pending) { let error = new Error("File closed"); error.errorCode = SubprocessConstants.ERROR_END_OF_FILE; reject(error); } this.pending.length = 0; this.buffer = null; if (!this.closed) { this.handle.dispose(); this._event.dispose(); io.pipes.delete(this.id); this.handle = null; this.closed = true; this.resolveClosed(); io.updatePollEvents(); } return this.closedPromise; } /** * Called when an error occurred while attempting an IO operation on our file * handle. */ onError() { this.close(true); } } class InputPipe extends Pipe { /** * Queues the next chunk of data to be read from the pipe if, and only if, * there is no IO operation currently pending. */ readNext() { if (this.buffer === null) { this.readBuffer(this.pending[0].length); } } /** * Closes the pipe if there is a pending read operation with no more * buffered data to be read. */ maybeClose() { if (this.buffer) { let read = win32.DWORD(); let ok = libc.GetOverlappedResult( this.handle, this.overlapped.address(), read.address(), false); if (!ok) { this.onError(); } } } /** * Asynchronously reads at most `length` bytes of binary data from the file * descriptor into an ArrayBuffer of the same size. Returns a promise which * resolves when the operation is complete. * * @param {integer} length * The number of bytes to read. * * @returns {Promise} */ read(length) { if (this.closing || this.closed) { throw new Error("Attempt to read from closed pipe"); } return new Promise((resolve, reject) => { this.pending.push({ resolve, reject, length }); this.readNext(); }); } /** * Initializes an overlapped IO read operation to read exactly `count` bytes * into a new ArrayBuffer, which is stored in the `buffer` property until the * operation completes. * * @param {integer} count * The number of bytes to read. */ readBuffer(count) { this.buffer = new ArrayBuffer(count); let ok = libc.ReadFile(this.handle, this.buffer, count, null, this.overlapped.address()); if (!ok && (!this.process.handle || libc.winLastError)) { this.onError(); } else { io.updatePollEvents(); } } /** * Called when our pending overlapped IO operation has completed, whether * successfully or in failure. */ onReady() { let read = win32.DWORD(); let ok = libc.GetOverlappedResult( this.handle, this.overlapped.address(), read.address(), false); read = read.value; if (!ok) { this.onError(); } else if (read > 0) { let buffer = this.buffer; this.buffer = null; let { resolve } = this.shiftPending(); if (read == buffer.byteLength) { resolve(buffer); } else { resolve(ArrayBuffer.transfer(buffer, read)); } if (this.pending.length) { this.readNext(); } else { io.updatePollEvents(); } } } } class OutputPipe extends Pipe { /** * Queues the next chunk of data to be written to the pipe if, and only if, * there is no IO operation currently pending. */ writeNext() { if (this.buffer === null) { this.writeBuffer(this.pending[0].buffer); } } /** * Asynchronously writes the given buffer to our file descriptor, and returns * a promise which resolves when the operation is complete. * * @param {ArrayBuffer} buffer * The buffer to write. * * @returns {Promise} * Resolves to the number of bytes written when the operation is * complete. */ write(buffer) { if (this.closing || this.closed) { throw new Error("Attempt to write to closed pipe"); } return new Promise((resolve, reject) => { this.pending.push({ resolve, reject, buffer }); this.writeNext(); }); } /** * Initializes an overapped IO read operation to write the data in `buffer` to * our file descriptor. * * @param {ArrayBuffer} buffer * The buffer to write. */ writeBuffer(buffer) { this.buffer = buffer; let ok = libc.WriteFile(this.handle, buffer, buffer.byteLength, null, this.overlapped.address()); if (!ok && libc.winLastError) { this.onError(); } else { io.updatePollEvents(); } } /** * Called when our pending overlapped IO operation has completed, whether * successfully or in failure. */ onReady() { let written = win32.DWORD(); let ok = libc.GetOverlappedResult( this.handle, this.overlapped.address(), written.address(), false); written = written.value; if (!ok || written != this.buffer.byteLength) { this.onError(); } else if (written > 0) { let { resolve } = this.shiftPending(); this.buffer = null; resolve(written); if (this.pending.length) { this.writeNext(); } else { io.updatePollEvents(); } } } } class Signal { constructor(event) { this.event = event; } cleanup() { libc.CloseHandle(this.event); this.event = null; } onError() { io.shutdown(); } onReady() { io.messageCount += 1; } } class Process extends BaseProcess { constructor(...args) { super(...args); this.killed = false; } /** * Returns our process handle for use as an event in a WaitForMultipleObjects * call. */ get event() { return this.handle; } /** * Forcibly terminates the process and all children. */ kill() { this.killed = true; libc.TerminateJobObject(this.jobHandle, TERMINATE_EXIT_CODE); } /** * Initializes the IO pipes for use as standard input, output, and error * descriptors in the spawned process. * * @returns {win32.Handle[]} * The array of file handles belonging to the spawned process. */ initPipes({ stderr }) { let our_pipes = []; let their_pipes = []; let secAttr = new win32.SECURITY_ATTRIBUTES(); secAttr.nLength = win32.SECURITY_ATTRIBUTES.size; secAttr.bInheritHandle = true; let pipe = input => { if (input) { let handles = win32.createPipe(secAttr, win32.FILE_FLAG_OVERLAPPED); our_pipes.push(new InputPipe(this, handles[0])); return handles[1]; } let handles = win32.createPipe(secAttr, 0, win32.FILE_FLAG_OVERLAPPED); our_pipes.push(new OutputPipe(this, handles[1])); return handles[0]; }; their_pipes[0] = pipe(false); their_pipes[1] = pipe(true); if (stderr == "pipe") { their_pipes[2] = pipe(true); } else { let srcHandle; if (stderr == "stdout") { srcHandle = their_pipes[1]; } else { srcHandle = libc.GetStdHandle(win32.STD_ERROR_HANDLE); } // If we don't have a valid stderr handle, just pass it along without duplicating. if (String(srcHandle) == win32.INVALID_HANDLE_VALUE || String(srcHandle) == win32.NULL_HANDLE_VALUE) { their_pipes[2] = srcHandle; } else { let handle = win32.HANDLE(); let curProc = libc.GetCurrentProcess(); let ok = libc.DuplicateHandle(curProc, srcHandle, curProc, handle.address(), 0, true /* inheritable */ , win32.DUPLICATE_SAME_ACCESS); their_pipes[2] = ok && win32.Handle(handle); } } if (!their_pipes.every(handle => handle)) { throw new Error("Failed to create pipe"); } this.pipes = our_pipes; return their_pipes; } /** * Creates a null-separated, null-terminated string list. * * @param {Array} strings * @returns {win32.WCHAR.array} */ stringList(strings) { // Remove empty strings, which would terminate the list early. strings = strings.filter(string => string); let string = strings.join("\0") + "\0\0"; return win32.WCHAR.array()(string); } /** * Quotes a string for use as a single command argument, using Windows quoting * conventions. * * @see https://msdn.microsoft.com/en-us/library/17w5ykft(v=vs.85).aspx * * @param {string} str * The argument string to quote. * @returns {string} */ quoteString(str) { if (!/[\s"]/.test(str)) { return str; } let escaped = str.replace(/(\\*)("|$)/g, (m0, m1, m2) => { if (m2) { m2 = `\\${m2}`; } return `${m1}${m1}${m2}`; }); return `"${escaped}"`; } spawn(options) { let { command, arguments: args } = options; if (/\\cmd\.exe$/i.test(command) && args.length == 3 && /^(\/S)?\/C$/i.test(args[1])) { // cmd.exe is insane and requires special treatment. args = [this.quoteString(args[0]), "/S/C", `"${args[2]}"`]; } else { args = args.map(arg => this.quoteString(arg)); } if (/\.(bat|cmd)$/i.test(command)) { command = io.comspec; args = ["cmd.exe", "/s/c", `"${args.join(" ")}"`]; } let envp = this.stringList(options.environment); let handles = this.initPipes(options); let processFlags = win32.CREATE_NO_WINDOW | win32.CREATE_SUSPENDED | win32.CREATE_UNICODE_ENVIRONMENT; if (io.breakAwayFromJob) { processFlags |= win32.CREATE_BREAKAWAY_FROM_JOB; } let startupInfoEx = new win32.STARTUPINFOEXW(); let startupInfo = startupInfoEx.StartupInfo; startupInfo.cb = win32.STARTUPINFOW.size; startupInfo.dwFlags = win32.STARTF_USESTDHANDLES; startupInfo.hStdInput = handles[0]; startupInfo.hStdOutput = handles[1]; startupInfo.hStdError = handles[2]; // Note: This needs to be kept alive until we destroy the attribute list. let handleArray = win32.HANDLE.array()(handles); let threadAttrs = win32.createThreadAttributeList(handleArray); if (threadAttrs) { // If have thread attributes to pass, pass the size of the full extended // startup info struct. processFlags |= win32.EXTENDED_STARTUPINFO_PRESENT; startupInfo.cb = win32.STARTUPINFOEXW.size; startupInfoEx.lpAttributeList = threadAttrs; } let procInfo = new win32.PROCESS_INFORMATION(); let errorMessage = "Failed to create process"; let ok = libc.CreateProcessW( command, args.join(" "), null, /* Security attributes */ null, /* Thread security attributes */ true, /* Inherits handles */ processFlags, envp, options.workdir, startupInfo.address(), procInfo.address()); for (let handle of new Set(handles)) { // If any of our handles are invalid, they don't have finalizers. if (handle && handle.dispose) { handle.dispose(); } } if (threadAttrs) { libc.DeleteProcThreadAttributeList(threadAttrs); } if (ok) { this.jobHandle = win32.Handle(libc.CreateJobObjectW(null, null)); let info = win32.JOBOBJECT_EXTENDED_LIMIT_INFORMATION(); info.BasicLimitInformation.LimitFlags = win32.JOB_OBJECT_LIMIT_BREAKAWAY_OK; ok = libc.SetInformationJobObject(this.jobHandle, win32.JobObjectExtendedLimitInformation, ctypes.cast(info.address(), ctypes.voidptr_t), info.constructor.size); errorMessage = `Failed to set job limits: 0x${(ctypes.winLastError || 0).toString(16)}`; } if (ok) { ok = libc.AssignProcessToJobObject(this.jobHandle, procInfo.hProcess); if (!ok) { errorMessage = `Failed to attach process to job object: 0x${(ctypes.winLastError || 0).toString(16)}`; libc.TerminateProcess(procInfo.hProcess, TERMINATE_EXIT_CODE); } } if (!ok) { for (let pipe of this.pipes) { pipe.close(); } throw new Error(errorMessage); } this.handle = win32.Handle(procInfo.hProcess); this.pid = procInfo.dwProcessId; libc.ResumeThread(procInfo.hThread); libc.CloseHandle(procInfo.hThread); } /** * Called when our process handle is signaled as active, meaning the process * has exited. */ onReady() { this.wait(); } /** * Attempts to wait for the process's exit status, without blocking. If * successful, resolves the `exitPromise` to the process's exit value. * * @returns {integer|null} * The process's exit status, if it has already exited. */ wait() { if (this.exitCode !== null) { return this.exitCode; } let status = win32.DWORD(); let ok = libc.GetExitCodeProcess(this.handle, status.address()); if (ok && status.value != win32.STILL_ACTIVE) { let exitCode = status.value; if (this.killed && exitCode == TERMINATE_EXIT_CODE) { // If we forcibly terminated the process, return the force kill exit // code that we return on other platforms. exitCode = -9; } this.resolveExit(exitCode); this.exitCode = exitCode; this.handle.dispose(); this.handle = null; //libc.TerminateJobObject(this.jobHandle, TERMINATE_EXIT_CODE); this.jobHandle.dispose(); this.jobHandle = null; for (let pipe of this.pipes) { pipe.maybeClose(); } io.updatePollEvents(); return exitCode; } else { return null; } } } io = { events: null, eventHandlers: null, pipes: new Map(), processes: new Map(), messageCount: 0, running: true, init(details) { this.comspec = details.comspec; let signalEvent = ctypes.cast(ctypes.uintptr_t(details.signalEvent), win32.HANDLE); this.signal = new Signal(signalEvent); this.updatePollEvents(); this.breakAwayFromJob = details.breakAwayFromJob; setTimeout(this.loop.bind(this), 0); }, shutdown() { if (this.running) { this.running = false; this.signal.cleanup(); this.signal = null; self.postMessage({ msg: "close" }); self.close(); } }, getPipe(pipeId) { let pipe = this.pipes.get(pipeId); if (!pipe) { let error = new Error("File closed"); error.errorCode = SubprocessConstants.ERROR_END_OF_FILE; throw error; } return pipe; }, getProcess(processId) { let process = this.processes.get(processId); if (!process) { throw new Error(`Invalid process ID: ${processId}`); } return process; }, updatePollEvents() { let handlers = [this.signal, ...this.pipes.values(), ...this.processes.values() ]; handlers = handlers.filter(handler => handler.event); this.eventHandlers = handlers; let handles = handlers.map(handler => handler.event); this.events = win32.HANDLE.array()(handles); }, loop() { this.poll(); if (this.running) { setTimeout(this.loop.bind(this), 0); } }, poll() { let timeout = this.messageCount > 0 ? 0 : POLL_TIMEOUT; for (;; timeout = 0) { let events = this.events; let handlers = this.eventHandlers; let result = libc.WaitForMultipleObjects(events.length, events, false, timeout); if (result < handlers.length) { try { handlers[result].onReady(); } catch (e) { console.error(e); debug(`Worker error: ${e} :: ${e.stack}`); handlers[result].onError(); } } else { break; } } }, addProcess(process) { this.processes.set(process.id, process); for (let pipe of process.pipes) { this.pipes.set(pipe.id, pipe); } }, cleanupProcess(process) { this.processes.delete(process.id); } }; enigmail-2.0.8/ipc/modules/subprocess.jsm000066400000000000000000000267261334302754500204570ustar00rootroot00000000000000/*global Components: false */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ /* * Import into a JS component using * 'Components.utils.import("resource://enigmail/subprocess.jsm");' * * This object allows to start a process, and read/write data to/from it * using stdin/stdout/stderr streams. * Usage example: * * var p = subprocess.call({ * command: '/bin/foo', * arguments: ['-v', 'foo'], * environment: [ "XYZ=abc", "MYVAR=def" ], * //stdin: "some value to write to stdin\nfoobar", * stdin: function(stdin) { * stdin.write("some value to write to stdin\nfoobar"); * stdin.close(); * }, * stdout: function(data) { * dump("got data on stdout:" + data + "\n"); * }, * stderr: function(data) { * dump("got data on stderr:" + data + "\n"); * }, * done: function(result) { * dump("process terminated with " + result.exitCode + "\n"); * }, * mergeStderr: false * }); * p.wait(); // wait for the subprocess to terminate * // this will block the main thread, * // only do if you can wait that long * * * Description of parameters: * -------------------------- * Apart from , all arguments are optional. * * command: either a |nsIFile| object pointing to an executable file or a * String containing the platform-dependent path to an executable * file. * * arguments: optional string array containing the arguments to the command. * * environment: optional string array containing environment variables to pass * to the command. The array elements must have the form * "VAR=data". Please note that if environment is defined, it * replaces any existing environment variables for the subprocess. * * stdin: optional input data for the process to be passed on standard * input. stdin can either be a string or a function. * A |string| gets written to stdin and stdin gets closed; * A |function| gets passed an object with write and close function. * Please note that the write() function will return almost immediately; * data is always written asynchronously on a separate thread. * * stdout: an optional function that can receive output data from the * process. The stdout-function is called asynchronously; it can be * called mutliple times during the execution of a process. * At a minimum at each occurance of \n or \r. * Please note that null-characters might need to be escaped * with something like 'data.replace(/\0/g, "\\0");'. * * stderr: an optional function that can receive stderr data from the * process. The stderr-function is called asynchronously; it can be * called mutliple times during the execution of a process. Please * note that null-characters might need to be escaped with * something like 'data.replace(/\0/g, "\\0");'. * (on windows it only gets called once right now) * * * done: optional function that is called when the process has terminated. * The exit code from the process available via result.exitCode. If * stdout is not defined, then the output from stdout is available * via result.stdout. stderr data is in result.stderr * done() is guaranteed to be called before .wait() finishes * * mergeStderr: optional boolean value. If true, stderr is merged with stdout; * no data will be provided to stderr. Default is false. * * * Description of object returned by subprocess.call(...) * ------------------------------------------------------ * The object returned by subprocess.call offers a few methods that can be * executed: * * wait(): waits for the subprocess to terminate. It is not required to use * wait; done will be called in any case when the subprocess terminated. * * kill(hardKill): kill the subprocess. Any open pipes will be closed and * done will be called. * hardKill [ignored on Windows]: * - false: signal the process terminate (SIGTERM) * - true: kill the process (SIGKILL) * * * Other methods in subprocess * --------------------------- * * registerDebugHandler(functionRef): register a handler that is called to get * debugging information * registerLogHandler(functionRef): register a handler that is called to get error * messages * * example: * subprocess.registerLogHandler( function(s) { dump(s); } ); */ 'use strict'; const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; Cu.import("resource://enigmail/enigmailprocess_main.jsm"); /* global SubprocessMain: false */ Cu.import("resource://gre/modules/Services.jsm"); /* global Services: false */ Cu.import("resource://gre/modules/Task.jsm"); /* global Task: false */ var EXPORTED_SYMBOLS = ["subprocess"]; const DEFAULT_ENVIRONMENT = []; var gDebugFunction = null; var gErrorFunction = null; var gRunningProcesses = []; // Array with all running subprocesses function write(pipe, data) { let buffer = new Uint8Array(Array.from(data, c => c.charCodeAt(0))); return pipe.write(buffer); } function arrayBufferToString(buffer) { const MAXLEN = 102400; let uArr = new Uint8Array(buffer); let ret = ""; let len = buffer.byteLength; for (let j = 0; j < Math.floor(len / MAXLEN) + 1; j++) { ret += String.fromCharCode.apply(null, uArr.subarray(j * MAXLEN, ((j + 1) * MAXLEN))); } return ret; } function read(pipe) { return pipe.read().then(buffer => { try { if (buffer.byteLength > 0) { return arrayBufferToString(buffer); } } catch (ex) { DEBUG_LOG("err: " + ex.toString()); } return ""; }); } var readAllData = Task.async(function*(pipe, read, callback) { /* eslint no-cond-assign: 0 */ let string; while (string = yield read(pipe)) { callback(string); } }); function removeProcRef(proc) { if (proc) { let i = gRunningProcesses.indexOf(proc); if (i >= 0) { gRunningProcesses.splice(i, 1); } } } var subprocess = { registerLogHandler: function(func) { gErrorFunction = func; }, registerDebugHandler: function(func) { gDebugFunction = func; }, call: function(options) { let resolved = null; let promises = []; let inputPromises = []; let stdinClosed = false; let stdoutData = ""; let stderrData = ""; let formattedStack = Components.stack.formattedStack; function writePipe(pipe, value) { let p = write(pipe, value); promises.push(p); inputPromises.push(p); } function subProcessThen(proc) { gRunningProcesses.push(proc); if (typeof options.stdin === "function") { // Some callers (e.g. child_process.js) depend on this // being called synchronously. options.stdin({ write(val) { writePipe(proc.stdin, val); }, close() { Promise.all(inputPromises).then(() => { if (!stdinClosed) { stdinClosed = true; proc.stdin.close(); } }); } }); } else { if (typeof options.stdin === "string") { DEBUG_LOG("write Stdin"); writePipe(proc.stdin, options.stdin); } Promise.all(inputPromises).then(() => { proc.stdin.close(); }); } promises.push( readAllData(proc.stdout, read, data => { DEBUG_LOG("Got Stdout: " + data.length + "\n"); if (typeof options.stdout === "function") { try { options.stdout(data); } catch (ex) {} } else stdoutData += data; })); if (!options.mergeStderr) { promises.push( readAllData(proc.stderr, read, data => { DEBUG_LOG("Got Stderr: " + data.length + "\n"); if (typeof options.stderr === "function") { try { options.stderr(data); } catch (ex) {} } else stderrData += data; })); } Promise.all(promises) .then(() => proc.wait()) .then(result => { DEBUG_LOG("Complete: " + result.exitCode + "\n"); removeProcRef(proc); if (gRunningProcesses.indexOf(proc) >= 0) { } if (result.exitCode === null) result.exitCode = -1; resolved = result.exitCode; if (typeof options.done === "function") { try { options.done({ exitCode: result.exitCode, stdout: stdoutData, stderr: stderrData }); } catch (ex) {} } }) .catch(error => { resolved = -1; let errStr = ""; if (typeof error === "string") { errStr = error; } else if (error) { for (let i in error) { errStr += "\n" + i + ": " + error[i]; } } ERROR_LOG(errStr); throw ("subprocess.jsm: caught error: " + errStr); }); } let opts = {}; if (options.mergeStderr) { opts.stderr = "stdout"; } else { opts.stderr = "pipe"; } if (options.command instanceof Ci.nsIFile) { opts.command = options.command.path; } else { opts.command = options.command; } if (options.workdir) { opts.workdir = options.workdir; } opts.arguments = options.arguments || []; // Set up environment let envVars = options.environment || DEFAULT_ENVIRONMENT; if (envVars.length) { let environment = {}; for (let val of envVars) { let idx = val.indexOf("="); if (idx >= 0) environment[val.slice(0, idx)] = val.slice(idx + 1); } opts.environment = environment; } let subproc = SubprocessMain.call(opts).then(subProcessThen).catch( error => { resolved = -1; let errStr = formattedStack; throw ("subprocess.jsm: launch error: " + errStr + JSON.stringify(error)); } ); return { wait: function() { let mainThread = Services.tm.mainThread; while (resolved === null) mainThread.processNextEvent(true); return resolved; }, kill: function(hard = false) { subproc.then(proc => { proc.kill(hard ? 0 : undefined); removeProcRef(); }); } }; }, /** * on shutdown kill all still running child processes */ onShutdown: function() { // create a copy of the array because gRunningProcesses will // get altered during kill() let procs = gRunningProcesses.map(x => x); for (let i = 0; i < procs.length; i++) { if (procs[i] && ("kill" in procs[i])) { procs[i].kill(true); } } } }; function DEBUG_LOG(str) { if (gDebugFunction) { gDebugFunction("subprocess.jsm: " + str + "\n"); } } function ERROR_LOG(str) { if (gErrorFunction) { gErrorFunction("subprocess.jsm: " + str + "\n"); } } enigmail-2.0.8/ipc/readme.os2000066400000000000000000000013631334302754500157540ustar00rootroot00000000000000IPC for OS/2 and eComstation ================================= BUILD INSTRUCTIONS --------------------------------- To build IPC for OS/2, you must first create Makefiles with the included MAKEMAKE.CMD script. The script accepts the following arguments. MAKEMAKE.CMD [/R] [ObjDir] /R: build recursively all Makefiles ObjDir: should correspond to the MOZ_OBJDIR parameter of your .mozconfig, if defined. Then, simply go to %MOZ_OBJDIR\extensions\ipc and do a make. CONTACTS --------------------------------- For questions specific to the OS/2 port of IPC, contact Davide Bresolin at davide@teamos2.it. For general questions about Enigmail, see the official enigmail web site at https://www.enigmail.net enigmail-2.0.8/ipc/tests/000077500000000000000000000000001334302754500152315ustar00rootroot00000000000000enigmail-2.0.8/ipc/tests/.eslintrc.js000066400000000000000000000000671334302754500174730ustar00rootroot00000000000000module.exports = { "rules": { "strict": 0, } } enigmail-2.0.8/ipc/tests/IpcCat.pl000077500000000000000000000033241334302754500167360ustar00rootroot00000000000000#!perl # # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. # # Helper tool to read or write data to/from stdin/stdout # # Usage: # IpcCat {write|read|dump|getenv} arg # # Parameters: # write: read from stdin and write to file # read: read from file and write to stdout # dump: read from stdin; write to stdout # getenv: print value of environment variable # # Exit codes: # 0: success # > 0: failure use Env; sub readFile { my $fn = $_[0]; open IN, $fn or die $!; my $r = ""; while () { $r .= $_; } close IN; return $r; } if ($#ARGV < 0) { exit(1); } #$| = 1; # disable buffering of output # wait a little before doing anything #select(undef, undef, undef, 0.1); if ($ARGV[0] =~ /^quick/i) { print "Hello\n"; exit(0); } elsif ($ARGV[0] =~ /^dump$/i) { print STDERR "Starting dump\n"; my $buf = readFile("-"); print $buf; print STDERR sprintf("Dumped %d bytes\n", length($buf)); } elsif ($ARGV[0] =~ /^read$/i) { print STDERR "Starting read\n"; my $buf = readFile($ARGV[1]); print $buf; print STDERR sprintf("Read %d bytes\n", length($buf)); } elsif ($ARGV[0] =~ /^write$/i) { my $of = $ARGV[1]; open(OF, ">$of") or die $!; print STDERR "Starting write\n"; my $buf = readFile("-"); print OF $buf; close(OF); print STDERR sprintf("Wrote %d bytes\n", length($buf)); } elsif ($ARGV[0] =~ /^getenv$/i) { print STDERR sprintf("Reading environment variable %s\n", $ARGV[1]); print STDOUT $ENV{$ARGV[1]}; } else { print STDERR "Invalid arguments\n"; exit(1); } exit(0); enigmail-2.0.8/ipc/tests/Makefile000066400000000000000000000005311334302754500166700ustar00rootroot00000000000000# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. DEPTH = ../.. include $(DEPTH)/config/autoconf.mk UNITTEST = ifneq ($(TB_PATH),"") UNITTEST = $(JSUNIT) main.js endif all: $(UNITTEST) enigmail-2.0.8/ipc/tests/main.js000066400000000000000000000012571334302754500165200ustar00rootroot00000000000000/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ /*global do_subtest: false, Components: false */ function execTest(filename) { const Cc = Components.classes; const Ci = Components.interfaces; let env = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment); let testcases = env.get("JS_TEST"); if (testcases && testcases.length > 0) { if (testcases.search(filename) >= 0) do_subtest(filename); } else do_subtest(filename); } // the subprocess tests execTest("subprocess-test.js"); enigmail-2.0.8/ipc/tests/subprocess-test.js000066400000000000000000000173151334302754500207430ustar00rootroot00000000000000/* global Components: false, Assert: false, do_get_file: false, do_print: false, do_get_cwd: false */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ /** * This file tests the implementation of subprocess.jsm */ Components.utils.import("resource://enigmail/subprocess.jsm"); /* global subprocess: false */ const Cc = Components.classes; const Ci = Components.interfaces; var gTestLines; var gResultData; var gResultStdErr; function run_test() { var isWindows = ("@mozilla.org/windows-registry-key;1" in Components.classes); var dataFile = do_get_file("ipc-data.txt", true); var env = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment); var plPath = env.get("PL_PATH"); Assert.ok(plPath.length > 0, "PL_PATH length is > 0"); if (plPath.length === 0) throw "perl path undefined"; var pl = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile); pl.initWithPath(plPath); if (!pl.exists()) throw "Could not locate the perl executable"; var processDir = do_get_cwd(); var cmd = processDir.clone(); cmd.append("IpcCat.pl"); if (!cmd.exists()) throw "Could not locate the IpcCat.pl helper executable"; var dirSvc = Cc["@mozilla.org/file/directory_service;1"]. getService(Ci.nsIProperties). QueryInterface(Ci.nsIDirectoryService); var greDir = dirSvc.get("GreD", Ci.nsIFile); var envList = [ "DYLD_LIBRARY_PATH=" + greDir.path, // for Mac "LD_LIBRARY_PATH=" + greDir.path // for Linux ]; var eol = isWindows ? "\r\n" : "\n"; gTestLines = ["Writing example data" + eol, "Writing something more" + eol, "And yet some more text" + eol ]; ///////////////////////////////////////////////////////////////// // Test standard scenario ///////////////////////////////////////////////////////////////// do_print("Standard scenario"); gResultData = ""; gResultStdErr = ""; var p = subprocess.call({ command: pl, arguments: [cmd.path, 'dump'], environment: envList, stdin: function(pipe) { for (var i = 0; i < gTestLines.length; i++) { pipe.write(gTestLines[i]); } pipe.close(); pipe.close(); // even if errorneous, this should simply succeed }, stdout: function(data) { gResultData += data; }, stderr: function(data) { gResultStdErr += data; }, done: function(result) { Assert.equal(0, result.exitCode, "exit code"); }, mergeStderr: false }); p.wait(); Assert.equal( gTestLines.join(""), gResultData, "result matching" ); let len = gTestLines.join("").length; if (isWindows) { len -= gTestLines.length; } Assert.equal( "Starting dump\nDumped " + len + " bytes\n", gResultStdErr.replace(/\r\n/g, "\n"), "stderr result matching" ); ///////////////////////////////////////////////////////////////// // Test mergeStderr=true & stdin as string ///////////////////////////////////////////////////////////////// do_print("mergeStderr=true & stdin as string"); gResultData = ""; p = subprocess.call({ command: pl, arguments: [cmd.path, 'dump'], environment: envList, stdin: gTestLines.join(""), stdout: function(data) { gResultData += data; }, stderr: function(data) { Assert.ok(false, "Got unexpected data '" + data + "' on stderr\n"); }, done: function(result) { Assert.equal(0, result.exitCode, "exit code"); }, mergeStderr: true }); p.wait(); Assert.equal(gTestLines.join("").length + (isWindows ? 3 : 0) + 30, gResultData.length, "comparing result"); ///////////////////////////////////////////////////////////////// // Test with workdir & no stderr ///////////////////////////////////////////////////////////////// do_print("workdir & no stderr"); gResultData = ""; p = subprocess.call({ command: pl, arguments: [cmd.path, 'dump'], environment: envList, workdir: do_get_file(".", true).path, stdin: function(pipe) { for (var i = 0; i < gTestLines.length; i++) { pipe.write(gTestLines[i]); } pipe.close(); }, done: function(result) { gResultData = result.stdout; Assert.equal(0, result.exitCode, "exit code"); }, mergeStderr: false }); p.wait(); Assert.equal(gTestLines.join(""), gResultData, "comparing result"); ///////////////////////////////////////////////////////////////// // Test exit code != 0 ///////////////////////////////////////////////////////////////// gResultData = ""; gResultStdErr = ""; p = subprocess.call({ command: pl, arguments: [cmd.path, 'wrong', 'arguments'], environment: envList, stdin: "Dummy text", stdout: function(data) { gResultData += data; }, stderr: function(data) { gResultStdErr += data; }, done: function(result) {}, mergeStderr: false }); var exitCode = p.wait(); // Assert.notEqual(0, exitCode, "expecting non-zero exit code"); // fails from time to time Assert.equal("", gResultData, "comapring result"); gResultStdErr = gResultStdErr.replace(/\r\n/g, "\n"); Assert.equal(18, gResultStdErr.length, "check error message"); ///////////////////////////////////////////////////////////////// // Test minimal scenario with stdout only ///////////////////////////////////////////////////////////////// do_print("minimal scenario with stdin and stdout separately"); gResultData = ""; gResultStdErr = ""; p = subprocess.call({ command: pl, arguments: [cmd.path, 'write', dataFile.path], stdin: gTestLines.join("") }); p.wait(); p = subprocess.call({ command: pl, arguments: [cmd.path, 'read', dataFile.path], environment: envList, stdin: "", stdout: function(data) { gResultData += data; } }); p.wait(); Assert.equal(gTestLines.join(""), gResultData, "read file"); ///////////////////////////////////////////////////////////////// // Test minimal scenario with done only ///////////////////////////////////////////////////////////////// do_print("minimal scenario with done only"); gResultData = ""; gResultData = ""; p = subprocess.call({ command: pl, charset: null, arguments: [cmd.path, 'read', dataFile.path], environment: envList, done: function(result) { gResultData = result.stdout; gResultStdErr = result.stderr.replace(/\r\n/g, "\n"); Assert.equal(0, result.exitCode, "exit code"); Assert.equal(gTestLines.join(""), gResultData, "stdout"); Assert.equal(gResultStdErr.length, 28, "stderr"); } }); p.wait(); ///////////////////////////////////////////////////////////////// // Test environment variables ///////////////////////////////////////////////////////////////// do_print("environment variables"); gTestLines = ["This is a test variable"]; envList.push("TESTVAR=" + gTestLines[0]); gResultData = ""; p = subprocess.call({ command: pl.path, arguments: [cmd.path, 'getenv', 'TESTVAR'], workdir: do_get_file(".", true).path, environment: envList, done: function(result) { gResultData = result.stdout; Assert.equal(0, result.exitCode, "exit code"); }, mergeStderr: false }); p.wait(); Assert.equal(gTestLines.join(""), gResultData, "variable comparison"); do_print("mass test"); for (let i = 0; i < 1000; i++) { p = subprocess.call({ command: pl.path, arguments: [cmd.path, 'quick'], environment: envList, done: function(result) { Assert.equal("Hello\n", result.stdout, "stdout text"); Assert.equal(0, result.exitCode, "exit code"); }, mergeStderr: false }); p.wait(); } } enigmail-2.0.8/lang/000077500000000000000000000000001334302754500142355ustar00rootroot00000000000000enigmail-2.0.8/lang/Makefile000066400000000000000000000020551334302754500156770ustar00rootroot00000000000000# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. DEPTH = .. define copyLang = mkdir -p $(BUILD)/lang/$^ endef DO_FIX_LANG = NO_GEN_FILES = include ../config/autoconf.mk ifneq ($(FIX_LANGUAGES),no) DO_FIX_LANG = prepFiles else NO_GEN_FILES = -ng endif all: jar ifneq ($(ENABLE_LANG),no) languages = $(shell cat current-languages.txt) EXPORT_CMD = $(PERL) $(DEPTH)/util/make-lang-xpi.pl $(NO_GEN_FILES) current-languages.txt $(BUILD)/lang else languages = EXPORT_CMD = echo "" > $(BUILD)/lang/jar.mn endif prepFiles: for l in $(languages); do \ $(PERL) $(DEPTH)/util/fixlang.pl $(DEPTH)/ui/locale/en-US $$l; \ done export: $(DO_FIX_LANG) mkdir -p $(BUILD)/lang $(EXPORT_CMD) jar: export $(PYTHON) ../util/JarMaker.py -j $(DIST) -t . -f flat $(BUILD)/lang/jar.mn clean: for l in $(languages); do \ rm -f $$l/enigmail.dtd.gen $$l/enigmail.properties.gen; \ done rm -f $(BUILD)/lang/jar.mn enigmail-2.0.8/lang/ar/000077500000000000000000000000001334302754500146375ustar00rootroot00000000000000enigmail-2.0.8/lang/ar/am-enigprefs.properties000066400000000000000000000001251334302754500213300ustar00rootroot00000000000000# Strings used in the Mozill AccountManager prefPanel-enigprefs=خصوصية OpenPGP enigmail-2.0.8/lang/ar/enigmail.dtd000066400000000000000000001455601334302754500171340ustar00rootroot00000000000000 ' حول عنوان البريد"> ' لتحديد عناوين البريد لأجل GnuPG. عطّÙله إن كانت للمتلقين Ù…ÙØ§ØªÙŠØ­ Hushmail قديمة."> ملاحظة: قد يستغرق توليد Ø§Ù„Ù…ÙØªØ§Ø­ بضع دقائق ليتم. لا تغلق التطبيق أثناء توليد Ø§Ù„Ù…ÙØªØ§Ø­. Ø§Ù„ØªØµÙØ­ بنشاط أو إجراء عمليات تستخدم القرص Ø¨ÙƒØ«Ø§ÙØ© Ù…Ùيد لملء 'وعاء العشوائية' ÙˆØ³ÙŠÙØ³Ø±Ù‘ÙØ¹ التوليد. ستبلّغ عندما يتم التوليد."> ' غير مقبول"> ملاحظة: قد يستغرق توليد Ø§Ù„Ù…ÙØªØ§Ø­ بضع دقائق ليتم. لا تغلق التطبيق أثناء توليد Ø§Ù„Ù…ÙØªØ§Ø­. ستبلّغ٠عند تمام التوليد."> لاحظ: سيقوم Enigmail دائما بالتحقق من التوقيعات على البريد لكل حساب أو هوية، بغض النظر عن ØªÙØ¹ÙŠÙ„ها من عدمه"> شكرًا لاستخدامك Enigmail."> enigmail-2.0.8/lang/ar/enigmail.properties000066400000000000000000001627101334302754500205510ustar00rootroot00000000000000Enigmail=Enigmail ##################################################################### # Strings used within enigmailCommon.js and enigmailCommon.jsm ##################################################################### enigAlert=تنبيه Enigmail enigConfirm=تأكيد Enigmail # enigInfo=Enigmail Information enigError=عطل Enigmail enigPrompt=محث Enigmail dlgYes=&نعم dlgNo=&لا dlgKeepSetting=تذكر إجابتي ولا تسألني ثانية dlgNoPrompt=لا تظهر هذا الحوار ثانية dlg.button.delete=ا&حذ٠dlg.button.cancel=أل&غ٠dlg.button.close=أغل&Ù‚ dlg.button.continue=وا&صل dlg.button.skip=أغ&ÙÙ„ # dlg.button.overwrite=&Overwrite dlg.button.view=&عاين # dlg.button.retry=&Retry # dlg.button.ignore=&Ignore # dlg.button.install=&Install # dlg.button.ok=&OK repeatPrefix=\n\nسيتكرر هذا التنبيه %S repeatSuffixSingular=مرة أخرى. repeatSuffixPlural=مرات أخرى. noRepeat=\n\nلن يتكرر هذا التنبيه إلى أن ØªØ­Ø¯Ù‘ÙØ« Enigmail. pgpNotSupported=يبدو أنك تستخدم Enigmail مع PGP 6.x\n\nÙ„Ù„Ø£Ø³ÙØŒ PGP 6.x به بعض الأمر التي تمنع Enigmail من العمل جيدا. لذا لم يعد Enigmail يدعم PGP 6.xØŒ من ÙØ¶Ù„Ùƒ انتقل إلى GnuPG (GPG) كبديل.\n\nإذا احتجت للمساعدة حول الانتقال إلى GnuPGØŒ راجع قسم المساعدة ÙÙŠ موقع Enigmail. # initErr.howToFixIt=In order to use Enigmail, GnuPG is required. If you did not install GnuPG yet, the easiest way to do this is using the "Setup Wizard" button below. # initErr.setupWizard.button=&Setup Wizard passphraseCleared=لم تÙمح كلمة السر # cannotClearPassphrase=You are using a non-standard tool (such as gnome-keyring) for passphrase handling. Clearing the passphrase is therefore not possible from within Enigmail. noPhotoAvailable=لا توجد صور debugLog.title=Enigmail Debug Log error.photoPathNotReadable=Photo path '%S' is not readable # generalError=Error: %S # Strings in configure.jsm # enigmailCommon.versionSignificantlyChanged=This new version of Enigmail has significant changes in the handling of preferences and options. We tried to transfer the old settings to this new version. However, we cannot cover all cases automatically. Please double check the resulting new preferences and options. # enigmailCommon.checkPreferences=Check Preferences ... # preferences.defaultToPgpMime=We have changed the default message encoding in Enigmail from Inline-PGP to PGP/MIME. We recommend you keep this as default.\n\nIf you still wish to use Inline-PGP by default, you can do so in the Account Settings under OpenPGP Security. ##################################################################### # Strings in enigmailAbout.js ##################################################################### usingVersion=ÙŠÙØ´ØºÙ„ Enigmail إصدارة %S # enigmailPepVersion=Enigmail/p≡p version %S usingAgent=يستخدم %S التنÙيذي %S للتعمية والتظهير agentError=عطل: ÙØ´Ù„ت ÙÙŠ Ø§Ù„Ù†ÙØ§Ø° إلى خدمة Enigmime ##################################################################### # Strings in enigmailKeygen.js ##################################################################### accessError=عطل أثناء Ø§Ù„Ù†ÙØ§Ø° لخدمة Enigmime onlyGPG=يعمل توليد Ø§Ù„Ù…ÙØ§ØªÙŠØ­ Ùقط مع GnuPG (وليس PGP)! keygenComplete=اكتمل توليد Ø§Ù„Ù…ÙØªØ§Ø­! Ø³ØªÙØ³ØªØ®Ø¯Ù… الهوية <%S> للتوقيع. revokeCertRecommended=ننصح بشدة أن تنشئ شهادة نقض Ø§Ù„Ù…ÙØªØ§Ø­. لتستخدم هذه لشهادة لإبطال Ø§Ù„Ù…ÙØªØ§Ø­ØŒ مثلا ÙÙŠ حال ضياع Ø§Ù„Ù…ÙØªØ§Ø­ السري أو انكشاÙÙ‡. أتريد إنشاءها الآن؟ keyMan.button.generateCert=&ÙˆÙ„Ù‘ÙØ¯ شهادة genCompleteNoSign=تم توليد Ø§Ù„Ù…ÙØªØ§Ø­! genGoing=توليد Ø§Ù„Ù…ÙØªØ§Ø­ جار Ø¨Ø§Ù„ÙØ¹Ù„! passNoMatch=عبارتا السر لا تتطابقا، أعد الإدخال من ÙØ¶Ù„Ùƒ passCheckBox=من ÙØ¶Ù„Ùƒ أشّر هذا إن كنت لن تضع عبارة سر Ù„Ù„Ù…ÙØªØ§Ø­ (غير محبذ) passUserName=من ÙØ¶Ù„Ùƒ حدد اسم المستخدم لهذه الهوية # keygen.missingUserName=There is no name specified for the selected account/identity. Please enter a value in the field "Your name" in the account settings. # keygen.passCharProblem=You are using special characters in your passphrase. Unfortunately, this can cause troubles for other applications. We recommend you choose a passphrase consisting only of any of these characters:\na-z A-Z 0-9 /.;:-,!?(){}[]%* # passSpaceProblem=Due to technical reasons, your passphrase may not start or end with a space character. changePassFailed=ÙØ´Ù„ تغيير كلمة السر. keyConfirm=أأولد Ù…ÙØ§ØªØ­ÙŠÙ† لأجل '%S'ØŸ keyMan.button.generateKey=ÙˆÙ„Ù‘ÙØ¯ Ù…&ÙØªØ§Ø­Ø§ keyAbort=أأجهض توليد Ø§Ù„Ù…ÙØªØ§Ø­ØŸ keyMan.button.generateKeyAbort=أجه&ض توليد Ø§Ù„Ù…ÙØªØ§Ø­ keyMan.button.generateKeyContinue=&عاود توليد Ø§Ù„Ù…ÙØªØ§Ø­ expiryTooLong=لا يمكنك إنشاء Ù…ÙØªØ§Ø­ تنتهي صلاحيته بعد أكثر من 100 عام. # expiryTooLongShorter=You cannot create a key that expires in more than 90 years. expiryTooShort=يجب أن يكون Ø§Ù„Ù…ÙØªØ§Ø­ صالحا ليوم واحد على الأقل. keyGenFailed=ÙØ´Ù„ توليد Ø§Ù„Ù…ÙØªØ§Ø­. من ÙØ¶Ù„Ùƒ راجع مرقاب Enigmail (قائمة Enigmail > تنقيح Enigmail) لمزيد من Ø§Ù„ØªÙØ§ØµÙŠÙ„. # setKeyExpirationDateFailed=The expiration date could not be changed # Strings in enigmailMessengerOverlay.js securityInfo=معلومات خصوصية Enigmail\n\n enigHeader=Enigmail: enigContentNote=Enigmail: *مرÙقات هذه الرسالة لم تÙوقّع أو ØªÙØ¹Ù…ّى*\n\n possiblyPgpMime=قد تكون رسالة PGP/MIME معماة أو موقّعة؛ انقر 'Ø¸Ù‡Ù‘ÙØ±' للتأكد saveAttachmentHeader=Enigmail: Ø§Ø­ÙØ¸ المرÙقة Ø§Ù„Ù…ÙØ¸Ù‡Ù‘َرة noTempDir=تعذّر العثور على دليل مؤقت للكتابه Ùيه\nمن ÙØ¶Ù„Ùƒ اضبط متغير البيئة TEMP attachmentPgpKey=المرÙقة '%S' الذي ØªÙØªØ­Ù‡Ø§ تبدو ÙƒÙ…Ù„Ù Ù…ÙØ§ØªÙŠØ­ OpenPGP.\n\nانقر 'نعم' لتصدير Ø§Ù„Ù…ÙØ§ØªÙŠØ­ التي تحتويها أو 'لا' لعرض محتويات المل٠ÙÙŠ Ù†Ø§ÙØ°Ø© Ø§Ù„Ù…ØªØµÙØ­ beginPgpPart=********* *بداية الجزء المعمى أو الموقّع* ********* endPgpPart=********* *نهاية الجزء المعمى أو الموقّع* ********* notePartEncrypted=Enigmail: *تحوي هذه الرسالة أجزاءً لم تÙوقّع أو ØªÙØ¹Ù…ّى* noteCutMessage=Enigmail: *توجد عدة كتل رسائل -- Ø£ÙØ¬Ù‡Ø¶ التظهير/التحقق* decryptOkNoSig=تحذير\n\nكان التظهير ناجحا، لكن تعذر التحقق من التوقيع بشكل صحيح msgOvl.button.contAnyway=&واصل على أي حال signature.verifiedOK=The signature for attachment %S was successfully verified signature.verifyFailed=The signature for attachment %S could not be verified attachment.noMatchToSignature=Could not match attachment '%S' to a signature file attachment.noMatchFromSignature=Could not match signature file '%S' to an attachment # fixBrokenExchangeMsg.failed=Did not succeed to repair message. # enigmail.msgViewColumn.label=Enigmail # enigmailPep.msgViewColumn.label=Enigmail/p≡p # wksNoIdentity=This key is not linked to any of your email accounts. Please add an account for at least one of the following email addresse(s):\n\n%S # wksConfirmSuccess=Confirmation email sent. # wksConfirmFailure=Sending the confirmation email failed. # autocrypt.importSetupKey.accountPreconfigured=Your account is already correctly configured for Autocrypt.\n\nDo you really want to overwrite your settings with this setup message? # autocrypt.importSetupKey.selfCreated=This message was created by your currently running instance of Enigmail.\n\nPlease switch to the email client to which you want to transfer the settings, and click on the message on that email client to import the settings. # autocrypt.importSetupKey.invalidMessage=Error - could not read setup message. The message seems to be corrupted. Please try to create a new setup message on your "other" device. # autocrypt.importSetupKey.invalidKey=Error - the key could not be imported. The key is either not supported by your version of GnuPG, or it got corrupted. # autocrypt.importSetupKey.wrongPasswd=The password you entered is wrong. Do you want to retry? # autocrypt.importSetupKey.success=The Autocrypt setup message was processed successfully. Autocrypt is now available for your account '%S'. ##################################################################### # Strings in enigmailMsgComposeOverlay.js ##################################################################### keysToExport=اختر Ù…ÙØªØ§Ø­ OpenPGP لإدراجه keysToUse=اختر Ù…ÙØªØ§Ø­ OpenPGP لاستخدامه لأجل %S pubKey=Ù…ÙØªØ§Ø­ %S العلني\n windowLocked=Ù†Ø§ÙØ°Ø© التحرير Ù…ÙÙ‚Ùلة؛ Ø£ÙلغÙÙŠ الإرسال sendUnencrypted=ÙØ´Ù„ بدء Enigmail.\nأأرسل رسالة غير Ù…ÙØ¹Ù…ّاة؟ composeSpecifyEmail=من ÙØ¶Ù„Ùƒ حدد عنوان بريدك الأساسي الذي Ø³ÙŠÙØ³ØªØ®Ø¯Ù… لاختيار Ù…ÙØªØ§Ø­ توقيع الرسائل الصادرة.\n إذا تركته خاويا ÙØ³ÙŠØ³ØªØ®Ø¯Ù… عنوان حقل 'Ù…ÙÙ†' ÙÙŠ الرسالة لاختيار Ù…ÙØªØ§Ø­ التوقيع. sendingHiddenRcpt=بعض متلقي هذه الرسالة يتلقونها ÙÙŠ العماء (BCC)ØŒ إن عÙمّÙيت هذه الرسالة Ùلن تظهر أسماؤهم كمتلقين للرسالة غير أن بعض أدوات التعمية (مثل التي تنتجها شركة PGP) لن يكون يمكنها تظهير الرسالة، لذا Ù†ÙØ­Ø¨Ù‘ÙØ° ØªÙØ§Ø¯ÙŠ Ø§Ù„Ù…Ø²Ø§ÙˆØ¬Ø© بين التعمية Ùˆ المتلقين ÙÙŠ العماء (BCC) sendWithHiddenBcc=أخÙ٠المتلقين ÙÙŠ العماء (BCC) sendWithShownBcc=عمّ٠كالمعتاد sendingNews=Ø£ÙØ¬Ù‡Ùضت عمليّة الإرسال Ø§Ù„Ù…ÙØ¹Ù…ّى.\n\nلا يمكن تعمية هذه الرسالة لوجود مجموعات بريدية ضمن المستلمين. من ÙØ¶Ù„Ùƒ أعد إرسال الرسالة بدون تعمية. sendToNewsWarning=تحذير: أنت بصدد إرسال رسالة معماة إلى مجموعة أخبار (newsgroup)ØŒ\n\nÙˆ هذا غير Ù…ÙØ­Ø¨Ù‘َذ لأنه لا معنى له إلا إن كان بوسع جميع أعضاء المجموعة تظهير الرسالة، أي أن الرسالة تنبغي تعميتها Ø¨Ù…ÙØ§ØªÙŠØ­ جميع المشاركين ÙÙŠ المجموعة. أرسل هذه الرسالة إن كنت تعلم ما ØªÙØ¹Ù„.\n\nأأواصل؟ hasHTML=تحذير بريد HTML:\nربما تحتوي هذه الرسالة على رَقْم HTMLØŒ مما قد يتسبب ÙÙŠ ÙØ´Ù„ التوقيع/التعمية. Ù„ØªØªÙØ§Ø¯Ù‰ هذا ÙÙŠ المستقبل، يجب أن تضغط زر SHIFT أثناء النقر على زر حرر/Ø±ÙØ¯ لإرسال بريد Ù…Ùوقّع.\nإذا كنت توقع البريد بدئيا، يستحسن أن تلغي ØªÙØ¶ÙŠÙ„ 'حرر رسائل HTML' لتعطيل بريد HTML بشكل دائم لحساب البريد هذا. strippingHTML=تحتوي الرسالة على معلومات تنسيق HTML ستÙÙقد عند تحويلها إلى نص ØµÙØ±Ù لتوقيعه/تعميته. أترغب ÙÙŠ المتابعة؟ msgCompose.button.sendAnyway=أر&سل الرسالة على أي حال attachWarning=مرÙقات هذه الرسالة ليست محلّÙية لذا لا تÙمكن تعميتها. لتعمية المرÙقات Ø§Ø­ÙØ¸Ù‡Ø§ أولا ÙƒÙ…Ù„ÙØ§Øª محلية ثم أرÙÙ‚ Ø§Ù„Ù…Ù„ÙØ§Øª. أترغب إرسال الرسالة بالرغم من ذلك؟ quotedPrintableWarn=لقد ÙØ¹Ù‘لت ترميز 'quoted-printable' للرسائل الصادرة، مما قد يؤدي إلى أخطاء عند تظهيرها أو التحقق.\nأترغب ÙÙŠ تعطيل الإرسال بترميز 'quoted-printable' الآن؟ minimalLineWrapping=لقد ضبطت طول السطر على %S حرÙ. لتعمية Ùˆ/أو توقيع سليمين، ينبغي لهذه القيمة أن تكون 68 على الأقل.\nأتريد تغيير طول السطر إلى 68 Ø­Ø±ÙØ§ الآن؟ warning=تحذير signIconClicked=لقد قمت يدويا بتغيير ØªÙØ¹ÙŠÙ„ التوقيع. لذا ÙÙيما يتعلق بهذه الرسالة ÙØ¥Ù† ØªÙØ¹ÙŠÙ„/تعطيل التوقيع لم يعد يعتمد على ØªÙØ¹ÙŠÙ„/تعطيل التعمية. # errorOwnKeyUnusable=The key ID '%S' configured for the current identity does not yield a usable OpenPGP key.\n\nPlease ensure that you have a valid, not expired OpenPGP key and that your account settings point to that key.\nIf your key is not expired, then check if you did set Owner trust to full or ultimate. # msgCompose.cannotSaveDraft=Error while saving draft # msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information - partially encrypted email. # msgCompose.partiallyEncrypted.mimeMsg=The message you are replying to contained both unencrypted and encrypted parts. Some encrypted message parts are invisible to you.\n\nIf the sender was not able to decrypt the hidden message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nWe recommend that you don't reply to the message, but create a new message containing your answer. # msgCompose.partiallyEncrypted.inlinePGP=The message you are replying to contained both unencrypted and encrypted parts. If the sender was not able to decrypt some message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nPlease consider removing all quoted text from your reply to this sender. # msgCompose.internalEncryptionError=Internal Error: promised encryption disabled # msgCompose.internalError=An internal error has occurred. # msgCompose.toolbarTxt.signAndEncrypt=This message will be signed and encrypted # msgCompose.toolbarTxt.signOnly=This message will be signed # msgCompose.toolbarTxt.encryptOnly=This message will be encrypted # msgCompose.toolbarTxt.noEncryption=This message will be unsigned and unencrypted # msgCompose.toolbarTxt.disabled=Enigmail is disabled for the selected identity # msgCompose.protectSubject.tooltip=Protect the message subject # msgCompose.noSubjectProtection.tooltip=Do not protect the message subject # msgCompose.encryptedSubjectStub=Encrypted Message # msgCompose.protectSubject.dialogTitle=Enable Protection of Subject? # msgCompose.protectSubject.question=Regular encrypted emails contain the unredacted subject.\n\nWe have established a standard to hide the original subject in the encrypted message\nand replace it with a dummy text, such that the subject is only visible after the email is decrypted.\n\nDo you want to protect the subject in encrypted messages? # msgCompose.protectSubject.yesButton=&Protect subject # msgCompose.protectSubject.noButton=&Leave subject unprotected # msgCompose.detailsButton.label=Details ... # msgCompose.detailsButton.accessKey=D # msgCompose.pepSendUnknown=Unknown # msgCompose.pepSendUnsecure=Unsecure # msgCompose.pepSendSecure=Secure # msgCompose.pepSendTrusted=Secure & Trusted # pep.alert.disabledForIdentity=p≡p is disabled for the current identity. Please enable p≡p via the Enigmail/p≡p preferences. # pep.alert.weakReply=You’re about to forward or reply to a secure message as insecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? # note: should end with double newline: sendAborted=Ø£ÙØ¬Ù‡Ùضت عملية الإرسال.\n\n # details: # keyNotTrusted=Not enough trust for key '%S' # keyNotFound=Key '%S' not found # keyRevoked=Key '%S' revoked # keyExpired=Key '%S' expired statPGPMIME=PGP/MIME # statSMIME=S/MIME statSigned=Ù…Ùوقّع statEncrypted=Ù…ÙØ¹Ù…ّى statPlain=نص صريح Ùˆ غير Ù…Ùوقَّع offlineSave=Ø£Ø£Ø­ÙØ¸ الرسالة %S إلى %S ÙÙŠ مجلد الرسائل غير المرسلة؟ onlineSend=أأرسل الرسالة %S إلى %SØŸ encryptKeysNote=ملحوظة: لقد عÙمّيت الرسالة باستخدام هويات/Ù…ÙØ§ØªÙŠØ­ المستخدمين التالية: %S # hiddenKey= signFailed=Ø¹ÙØ·Ù„ ÙÙŠ EnigmailØ› ÙØ´Ù„ت التعمية/التوقيع؛ Ø£ÙØ±Ø³Ù„٠الرسالة غير Ù…ÙØ¹Ù…ّاة؟ msgCompose.button.sendUnencrypted=أر&سل الرسالة بلا تعمية recipientsSelectionHdr=اختر المستلمين للتعمية configureNow=لم تضبط خصوصية Enigmail للهوية المختارة. أترغب ÙÙŠ ÙØ¹Ù„ هذا الآن؟ # encryption/signing status and associated reasons: # encryptMessageAuto=Encrypt Message (auto) # encryptMessageNorm=Encrypt Message # signMessageAuto=Sign Message (auto) # signMessageNorm=Sign Message # encryptOff=Encryption: OFF # encryptOnWithReason=Encryption: ON (%S) # encryptOffWithReason=Encryption: OFF (%S) # encryptOn=Encryption: ON # signOn=Signing: ON # signOff=Signing: OFF # signOnWithReason=Signing: ON (%S) # signOffWithReason=Signing: OFF (%S) # reasonEnabledByDefault=enabled by default # reasonManuallyForced=manually forced # reasonByRecipientRules=forced by recipient rules # reasonByAutoEncryption=forced by auto encryption # reasonByConflict=due to conflict in recipient rules # reasonByEncryptionMode=due to encryption mode # should not be used anymore: encryptYes=Ø³ØªÙØ¹Ù…ّى الرسالة encryptNo=لن ØªÙØ¹Ù…ّى الرسالة # should not be used anymore: signYes=ستÙوقّع الرسالة signNo=لن تÙوقّع الرسالة # PGP/MIME status: # pgpmimeNormal=Protocol: PGP/MIME # inlinePGPNormal=Protocol: Inline PGP # smimeNormal=Protocol: S/MIME # pgpmimeAuto=Protocol: PGP/MIME (auto) # inlinePGPAuto=Protocol: Inline PGP (auto) # smimeAuto=Protocol: S/MIME (auto) # should not be used anymore # pgpmimeYes=PGP/MIME will be used # pgpmimeNo=Inline PGP will be used # Attach own key status (tooltip strings): # attachOwnKeyNo=Your own key will not be attached # attachOwnKeyYes=Your own key will be attached # attachOwnKeyDisabled=Your own key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. rulesConflict=ÙˆÙØ¬Ùدت قواعد مستلمين متعارضة\n%S\n\nأأرسل الرسالة بهذه الإعدادات؟ msgCompose.button.configure=ا&ضبط msgCompose.button.send=Ø£&رسل الرسالة msgCompose.button.save=ا&Ø­ÙØ¸ الرسالة # Strings in enigmailMsgHdrViewOverlay.js keyNeeded=Ø§Ù„Ù…ÙØªØ§Ø­ العلني %S مطلوب للتحقق من التوقيع # keyUsed=Public key %S used to verify signature clickDecrypt='Ø› انقر زر 'Ø¸Ù‡Ù‘ÙØ± clickDecryptRetry=Ø› انقر زر 'Ø¸Ù‡Ù‘ÙØ±' لتعيد المحاولة # clickDetailsButton=; click on 'Details' button for more information # clickImportButton=; click on the 'Import Key' button to import the key # keyTypeUnsupported=; the key type is not supported by your version of GnuPG msgPart=جزة من الرسالة %S msgSigned=Ù…Ùوقّعة # msgSignedUnkownKey=signed with unknown key msgEncrypted=Ù…ÙØ¹Ù…ّاة msgSignedAndEnc=Ù…Ùوقّعة Ùˆ Ù…ÙØ¹Ù…ّاة unverifiedSig=توقيع غير Ù…ÙØ­Ù‚Ù‚ incompleteDecrypt=التظهير ناقص needKey=Ø¹ÙØ·Ù„ - بحاجة Ù„Ù…ÙØªØ§Ø­ سري لتعمية الرسالة failedDecrypt=Ø¹ÙØ·Ù„ - ÙØ´Ù„ التظهير badPhrase=Ø¹ÙØ·Ù„ - عبارة سر غير صحيحة failedDecryptVerify=Ø¹ÙØ·Ù„ - ÙØ´Ù„ التظهير/التحقق viewInfo=Ø› اعرض > معلومات خصوصية الرسالة Ù„Ù„ØªÙØ§ØµÙŠÙ„ decryptedMsg=Ø¸Ù‡Ù‘ÙØ± الرسالة # decryptedMsgWithFormatError=Decrypted message (restored broken PGP email format probably caused by an old Exchange server, so that the result might not be perfect to read) # usedAlgorithms=Used Algorithms: %1$S and %2$S # pepStatusInfo.text=p≡p Message Status. # pepStatusInfo.title.m3=Under Attack # pepStatusInfo.info.m3=This message is not secure and has been tampered with. # pepStatusInfo.title.m1=Mistrusted # pepStatusInfo.info.m1=This message has a communication partner that has previously been marked as mistrusted # pepStatusInfo.title.r0=Unknown # pepStatusInfo.info.r0=This message does not contain enough information to determine if it is secure. # pepStatusInfo.title.r1=Cannot Decrypt # pepStatusInfo.info.r1=This message cannot be decrypted because the key is not available. # pepStatusInfo.title.r2=Cannot Decrypt # pepStatusInfo.info.r2=This message cannot be decrypted because the key is not available. # pepStatusInfo.title.r3=Unsecure # pepStatusInfo.info.r3=This message is unsecure. # pepStatusInfo.title.r4=Unsecure for Some # pepStatusInfo.info.r4=This message is unsecure for some communication partners. # pepStatusInfo.title.r5=Unreliable Security # pepStatusInfo.info.r5=This message has unreliable protection. # pepStatusInfo.title.r6=Secure... # pepStatusInfo.info.r6=This message is secure but you still need to verify the identity of your communication partner. # pepStatusInfo.title.r7=Secure & Trusted # pepStatusInfo.info.r7=This message is secure and trusted. # pepStatusInfo.color.green=Green # pepStatusInfo.color.yellow=Yellow # pepStatusInfo.color.red=Red # pepRevokeTrust.question=Do you really want to cancel the trust for %S? # pepRevokeMistrust.question=Do you really want to re-trust the key for %S? # pepRevokeTrust.doRevoke=Cancel &trust # wksConfirmationReq=Web Key Directory Confirmation Request # wksConfirmationReq.message=This message has been sent by your email provider to confirm deployment of your OpenPGP public key\nin their Web Key Directory.\nProviding your public key helps others to discover your key and thus being able to encrypt messages to you.\n\nIf you want to deploy your key in the Web Key Directory now, please click on the button "Confirm Request" in the status bar.\nOtherwise, simply ignore this message. # wksConfirmationReq.button.label=Confirm Request # autocryptSetupReq=Perform Autocrypt Setup # autocryptSetupReq.button.label=Start Setup # autocryptSetupReq.setupMsg.desc=This message contains all information to transfer your Autocrypt settings along with your secret key securely from your original device. # autocryptSetupReq.setupMsg.backup=You can keep this message and use it as a backup for your secret key. If you want to do this, you should write down the password and store it securely. # autocryptSetupReq.message.import=To import the settings and key(s) in Enigmail, please click on the "Start Setup" button in the status bar. # autocryptSetupReq.message.sent=Please click on the message on your new device and follow the instuctions to import the settings. # strings in pref-enigmail.js # oldGpgVersion20=Enigmail initialization failed.\n\nYou are using GnuPG version %1$S, which is not supported anymore. Enigmail requires GnuPG version %2$S or newer. Please upgrade your GnuPG installation, or Enigmail will not work. locateGpg=حدد موضع برمجية GnuPG invalidGpgPath=لا ÙŠÙمكن تنÙيذ GnuPG من المسار Ø§Ù„Ù…ÙØ¹Ø·Ù‰. لذا Ø³ÙŠÙØ¹Ø·Ù‘Ù„ Enigmail حتى ØªÙØºÙŠÙ‘ر المسار إلى GnuPG أو ØªÙØ¹ÙŠØ¯ تشغيل التطبيق. warningsAreReset=تم تصÙير كل التحذيرات. prefs.gpgFound=ÙˆÙØ¬Ùد GnuPG ÙÙŠ %S prefs.gpgNotFound=تعذَّر إيجاد برمجية GnuPG '%S'.\nتأكد من ضبط مسار مل٠GnuPG التنÙيذي ÙÙŠ ØªÙØ¶ÙŠÙ„ات Enigmail. prefs.warnAskNever=تحذير: ØªÙØ¹ÙŠÙ„ هذا الخيار سيؤدي إلى إرسال بغير تعمية دون أي تنويهات إذا لم يوجد Ù…ÙØªØ§Ø­ لأحد Ø§Ù„Ù…ÙØ³ØªÙ„مين -- لن ÙŠÙنبهك Enigmail عند حدوث ذلك! # prefs.warnIdleTimeForUnknownAgent=Cannot connect to gpg-agent. Maybe your system uses a specialized tool for passphrase handling (e.g. gnome-keyring, seahorse-agent, KDE wallet manager, ...). Unfortunately Enigmail cannot control the passphrase timeout for the tool you are using. Therefore the respective timeout settings in Enigmail are disregarded. prefEnigmail.oneKeyserverOnly=عطل - لا يمكن تحديد سوى خادوم Ù…ÙØ§ØªÙŠØ­ واحد لجلب Ù…ÙØ§ØªÙŠØ­ OpenPGP الناقصة. # Strings used in core.jsm # (said file also re-uses some strings from above) enterAdminPin=من ÙØ¶Ù„Ùƒ أدخل PIN المدير لبطاقتك الذكية (SmartCard) enterCardPin=من ÙØ¶Ù„Ùƒ أدخل PIN بطاقتك الذكية (SmartCard) notInit=Ø¹ÙØ·Ù„ - لم تستبدأ خدمة Enigmail بعد badCommand=Ø¹ÙØ·Ù„ - ÙØ´Ù„ أمر التعمية cmdLine=خرج سطر الأوامر: notRequired=Ø¹ÙØ·Ù„ - لا تعمية مطلوبة notComplete=Ø¹ÙØ·Ù„ - لم يتم توليد Ø§Ù„Ù…ÙØªØ§Ø­ invalidEmail=Ø¹ÙØ·Ù„ - عنوان بريد غير صحيح noPassphrase=Ø¹ÙØ·Ù„ - لم تدخل أية عبارة سر noPGPblock=Ø¹ÙØ·Ù„ - لم ÙŠÙØ¹Ø«Ø± على أي كتل بيانات OpenPGP مدرّع unverifiedReply=جزء الرسالة المزاح (الرد) قد تغيير على الأغلب # keyInMessageBody=Key in message body found. Click 'Import Key' to import the key sigMismatch=Ø¹ÙØ·Ù„ - توقيع غير صحيح cantImport=خطأ ÙÙŠ استيراد Ø§Ù„Ù…ÙØªØ§Ø­ العلني\n\n # doImportOne=Import %1$S (%2$S)? # doImportMultiple=Import the following keys?\n\n%S # previewFailed=Can't read public key file. # Strings used in errorHandling.jsm sc.wrongCardAvailable=البطاقة الذكية %S الموجودة ÙÙŠ القارئ لا يمكن استخدامها لمعالجة الرسالة.\nأدخل البطاقة الذكية %S Ùˆ أعد العملية. sc.insertCard=تتطلب هذه العملية البطاقة الذكية %S.\nأدخل البطاقة الذكية المطلوبة Ùˆ أعد العملية. sc.removeCard=تتطلب هذه العملية ألا توجد ÙÙŠ القارئ بطاقة ذكية.\nأخرج البطاقة الذكية Ùˆ أعد العملية. sc.noCardAvailable=لم ÙŠÙØ¹Ø«Ø± على بطاقة ذكية ÙÙŠ القارئ\nأدخل البطاقة الذكية ثم أعد العملية. sc.noReaderAvailable=لا يمكن Ø§Ù„Ù†ÙØ§Ø° إلى قارئ البطاقات الذكية\nأوصل قارئ البطاقات الذكية ثم أدخل البطاقة ثم أعد العملية. # keyError.keySpecNotFound=The email address "%S" cannot be matched to a key on your keyring. # keyError.keyIdNotFound=The configured key ID "%S" cannot be found on your keyring. # keyError.resolutionAction=Please select a valid key in the OpenPGP section of your Account Settings. # missingPassphrase=Missing passphrase # errorHandling.gpgAgentInvalid=Your system is running a version of gpg-agent that is not suitable for your GnuPG version. # errorHandling.gpgAgentError=GnuPG reported an error in the communication with gpg-agent (a component of GnuPG). # errorHandling.dirmngrError=GnuPG reported an error in the communication with dirmngr (a component of GnuPG). # errorHandling.pinentryError=GnuPG cannot query your passphrase via pinentry. # errorHandling.readFaq=This is a system setup or configuration error that prevents Enigmail from working properly and cannot be fixed automatically.\n\nWe strongly recommend that you consult our support web site at https://enigmail.net/faq. gpgNotFound=تعذر تحديد موضع برمجية GnuPG '%S'.\nتأكد أنك ضبطت مسار مل٠GnuPG التنÙيذي صحيحا ÙÙŠ ØªÙØ¶ÙŠÙ„ات Enigmail. gpgNotInPath=تعذَّر إيجاد برمجية GnuPG ÙÙŠ المسار المعرَّ٠PATH.\nتأكد من ضبط مسار مل٠GnuPG التنÙيذي ÙÙŠ ØªÙØ¶ÙŠÙ„ات Enigmail. # enigmailNotAvailable=Enigmail core Service not available prefGood=توقيع صحيح من %S prefBad=توقيع غير صحيح من %S failCancel=Ø¹ÙØ·Ù„ - ألغى المستخدم جلب Ø§Ù„Ù…ÙØªØ§Ø­ failNoServer=Ø¹ÙØ·Ù„ - لم تحدد خادوم Ù…ÙØ§ØªÙŠØ­ لجلب Ø§Ù„Ù…ÙØ§ØªÙŠØ­ منه failNoID=Ø¹ÙØ·Ù„ - لم تحدد هوية لجلب Ù…ÙØªØ§Ø­ لها failKeyExtract=Ø¹ÙØ·Ù„ - ÙØ´Ù„ أمر استخراج Ø§Ù„Ù…ÙØªØ§Ø­ notFirstBlock=Ø¹ÙØ·Ù„ - أول كتلة OpenPGP ليست كتلة Ù…ÙØªØ§Ø­ علني importKeyConfirm=أأستورد Ø§Ù„Ù…ÙØ§ØªÙŠØ­ العلنية المضمنة ÙÙŠ الرسالة؟ failKeyImport=Ø¹ÙØ·Ù„ - ÙØ´Ù„ استيراد Ø§Ù„Ù…ÙØªØ§Ø­ fileWriteFailed=ÙØ´Ù„ت الكتابة ÙÙŠ المل٠%S importKey=استورد Ø§Ù„Ù…ÙØªØ§Ø­ العلني %S من خادوم Ø§Ù„Ù…ÙØ§ØªÙŠØ­ uploadKey=أرسل Ø§Ù„Ù…ÙØªØ§Ø­ العلني %S إلى الخادوم keyId=هويّة Ø§Ù„Ù…ÙØªØ§Ø­ keyAndSigDate=معرّÙÙ Ø§Ù„Ù…ÙØªØ§Ø­: 0x%S / Ù…Ùوقع ÙÙŠ: %S keyFpr=بصمة Ø§Ù„Ù…ÙØªØ§Ø­: %S noEmailProvided=لم ØªÙØ¹Ø· عنوان بريد! keyAlreadySigned=Ø§Ù„Ù…ÙØªØ§Ø­ Ù…Ùوقَّع مسبقا، لا يمكن توقيعه مرتين. ##################################################################### # Strings used in enigmailKeySelection.js ##################################################################### selKeyExpired=انتهى %S createdHeader=تاريخ الإنشاء atLeastOneKey=لم تختر أي Ù…ÙØ§ØªÙŠØ­! ينبغي اختيار Ù…ÙØªØ§Ø­ واحد على الأقل لقبول هذا الحوار fewerKeysThanRecipients=قد اخترت عددا من Ø§Ù„Ù…ÙØ§ØªÙŠØ­ أقل من عدد المرسل إليهم. أمتأكد أن قائمة Ù…ÙØ§ØªÙŠØ­ التعمية كاملة؟ userSel.button.goBack=اختر المزيد من Ø§Ù„Ù…ÙØ§ØªÙŠØ­ userSel.secretKeySel.title=اختر Ù…ÙØªØ§Ø­ OpenPGP سريا لتوقيع رسائلك. # userSel.problemNoKey=No valid key # userSel.problemMultipleKeys=Multiple keys # should be same as thunderbird ENTITY sendLaterCmd.label: # sendLaterCmd.label=Send Later # Strings used in enigmailAttachmentDialog.js # pgpMimeNote=NOTE: PGP/MIME is not supported by all email clients. If you are unsure, select the %S option. first=الأوّل second=الثّاني # Strings used in am-enigprefs.js / enigmailEditIdentity.js encryptKeyHeader=اختر Ù…ÙØªØ§Ø­ OpenPGP للتعمية identityName=الهوية: %S # switchPepMode=You are currently using the 'p≡p Junior' mode of Enigmail.\n\nBy enabling OpenPGP or S/MIME for an account, you are disabling p≡p and use the 'regular' mode of Enigmail without p≡p. # enableEnigmail=&Disable p≡p # Strings used in enigmailSingleRcptSettings.js noEncryption=لقد ÙØ¹Ù‘لت التعمية لكنك لم تختر Ù…ÙØªØ§Ø­Ø§. لتعمي الرسائل إلى %S ينبغي لك تحديد Ù…ÙØªØ§Ø­ سليم أو أكثر من قائمة Ø§Ù„Ù…ÙØ§ØªÙŠØ­. أترغب ÙÙŠ تعطيل التعمية إلى %SØŸ noKeyToUse=(لا شيء - لا تعمية) noEmptyRule=لا يمكن أن تكون القاعدة خاوية! من ÙØ¶Ù„Ùƒ ضع عنوان بريد ÙÙŠ حقل القاعدة. invalidAddress=عناوين البريد التي أدخلتها ليست سليمة. يجب ألا تضع أسماء المستلمين؛ Ùقط عناوين البريد. مثلا:\nغير سليم: اسم ما \nسليم : some.name@address.net # noCurlyBrackets=The curly brackets {} have a special meaning and should not be used in an email address. If you want to modify the matching behavior for this rule, use the 'Apply rule if recipient ...' option.\nMore information is available from the Help button. # Strings used in enigmailRulesEditor.js never=أبدًا always=دائمًا possible=ممكن deleteRule=أأحذ٠القاعدة المختارة حقا؟ nextRcpt=(المستلم التالي) negateRule=ليس addKeyToRule=Add key %S (%S) to per-recipient rule # Strings used in enigmailSearchKey.js needOnline=الخاصية التي اخترتها غير متاحة ÙÙŠ طور عدم الاتصال. من ÙØ¶Ù„Ùƒ تحول إلى طور الاتصال وحاول مجددا. protocolNotSupported=البروتوكول '%S://' الذي اخترته غير مدعوم لجلب Ù…ÙØ§ØªÙŠØ­ OpenPGP. gpgkeysDisabled=قد ÙŠÙØ³Ø§Ø¹Ø¯Ùƒ ØªÙØ¹ÙŠÙ„ الخيار 'extensions.enigmail.useGpgKeysTool'. noKeyserverConn=تعذّر الاتصال بخادوم Ø§Ù„Ù…ÙØ§ØªÙŠØ­ %S. keyDownloadFailed=ÙØ´Ù„ الجلب من خادوم Ø§Ù„Ù…ÙØ§ØªÙŠØ­. رسالة الحالة هي:\n%S internalError=حدث عطل داخلي. تعذّر جلب Ø§Ù„Ù…ÙØ§ØªÙŠØ­ أو استيرادها. noKeyFound=لم أعثر على أي Ù…ÙØ§ØªÙŠØ­ تتطابق معايير البحث.\nلاحظ أن هويات Ø§Ù„Ù…ÙØ§ØªÙŠØ­ يجب أن ØªÙØ³Ø¨Ù‚ ب†\\"0x\\" (مثلا: 0xABCDEF12). # keyDownload.keyUnavailable=We are sorry, but the key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their key by email. # gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. gpgKeysFailed=ÙØ´Ù„ البحث عن أو جلب Ø§Ù„Ù…ÙØªØ§Ø­ من خادوم Ø§Ù„Ù…ÙØ§ØªÙŠØ­: لا ÙŠÙمكن تنÙيذ gpgkeys_%S. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=ÙØ´Ù„ ضبط الثقة ÙÙŠ المالك # Strings in enigmailSignKeyDlg.js signKeyFailed=ÙØ´Ù„ توقيع Ø§Ù„Ù…ÙØªØ§Ø­ alreadySigned.label=ملاحظة: Ø§Ù„Ù…ÙØªØ§Ø­ %S موقَّع مسبقا Ø¨Ø§Ù„Ù…ÙØªØ§Ø­ السريّ٠المختار # alreadySignedexportable.label=Note: the key %S is already signed exportable with the selected secret key. A local signature does not make sense. # partlySigned.label=Note: some user IDs of key %S are already signed with the selected secret key. # noTrustedOwnKeys=No eligible key found for signing! You need at least one fully trusted secret key in order to sign keys. # Strings in enigmailKeyManager.js keyMan.loadingKeys=ÙŠÙØ­Ù…Ù‘ÙÙ„ Ø§Ù„Ù…ÙØ§ØªÙŠØ­ØŒ من ÙØ¶Ù„Ùƒ انتظر... keyValid.unknown=مجهول keyValid.invalid=غير صحيح keyValid.disabled=معطّل keyValid.revoked=منقوض keyValid.expired=انتهت صلاحيته keyValid.noSubkey=لا Ù…ÙØªØ§Ø­ ÙØ±Ø¹ÙŠ ØµØ§Ù„Ø­ keyTrust.untrusted=منعدمة keyTrust.marginal=هامشية keyTrust.full=تامة keyTrust.ultimate=مطلقة keyTrust.group=(مجموعة) keyType.public=علني keyType.publicAndSec=علني/سري keyMan.enableKey=ÙØ¹Ù‘Ù„ Ø§Ù„Ù…ÙØªØ§Ø­ keyMan.disableKey=عطّل Ø§Ù„Ù…ÙØªØ§Ø­ userAtt.photo=خصيصة المستخدم (صورة JPEG) asciiArmorFile=â€®Ù…Ù„ÙØ§Øª أسكي (‪ASCII‬) Ù…ÙØ¯Ø±Ù‘عة (*.‪asc‬) importKeyFile=Import OpenPGP Key File gnupgFile=Ù…Ù„ÙØ§Øª GnuPG # createKeyOK=Your Key has been generated saveRevokeCertAs=أنشئ ÙˆØ§Ø­ÙØ¸ شهادة نقض # revokeCertOK=The revocation certificate has been successfully created. You can use it to invalidate your public key, e.g. in case you would lose your secret key. revokeCertFailed=تعذّر إنشاء شهادة النقض. addUidOK=تمت Ø¥Ø¶Ø§ÙØ© هوية المستخدم بنجاح addUidFailed=ÙØ´Ù„ت Ø¥Ø¶Ø§ÙØ© هوية المستخدم noKeySelected=يجب أن تختار Ù…ÙØªØ§Ø­Ø§ واحدا على الأقل لإجراء العملية المطلوبة exportToFile=صدّر Ø§Ù„Ù…ÙØªØ§Ø­ العلني إلى مل٠# exportKeypairToFile=Export Secret and Public Key To File exportSecretKey=أتريد تضمين Ø§Ù„Ù…ÙØªØ§Ø­ السري ÙÙŠ Ù…Ù„Ù Ù…ÙØªØ§Ø­ OpenPGP المحÙوظ؟ saveKeysOK=تم Ø­ÙØ¸ Ø§Ù„Ù…ÙØ§ØªÙŠØ­ بنجاح saveKeysFailed=ÙØ´Ù„ Ø­ÙØ¸ Ø§Ù„Ù…ÙØ§ØªÙŠØ­ importKeysFailed=ÙØ´Ù„ استيراد Ø§Ù„Ù…ÙØ§ØªÙŠØ­ enableKeyFailed=ÙØ´Ù„ ØªÙØ¹ÙŠÙ„/تعطيل Ø§Ù„Ù…ÙØ§ØªÙŠØ­ # specificPubKeyFilename=%1$S (0x%2$S) pub # specificPubSecKeyFilename=%1$S (0x%2$S) pub-sec # defaultPubKeyFilename=Exported-public-keys # defaultPubSecKeyFilename=Exported-public-and-secret-keys noSecretKeys=لم ÙŠÙØ¹Ø«Ø± على Ù…ÙØ§ØªÙŠØ­ سرية.\n\nأتريد توليد Ù…ÙØªØ§Ø­ الآن؟ sendKeysOk=تم إرسال Ø§Ù„Ù…ÙØ§ØªÙŠØ­ بنجاح sendKeysFailed=ÙØ´Ù„ إرسال Ø§Ù„Ù…ÙØ§ØªÙŠØ­ receiveKeysOk=تم تحديث Ø§Ù„Ù…ÙØ§ØªÙŠØ­ بنجاح receiveKeysFailed=ÙØ´Ù„ جلب Ø§Ù„Ù…ÙØ§ØªÙŠØ­ importFromClip=أتريد استيراد Ø§Ù„Ù…ÙØ§ØªÙŠØ­ من Ø§Ù„Ø­Ø§ÙØ¸Ø©ØŸ # importFromUrl=Download public key from this URL: copyToClipbrdFailed=تعذر نسخ Ø§Ù„Ù…ÙØ§ØªÙŠØ­ المختارة إلى Ø§Ù„Ø­Ø§ÙØ¸Ø©. copyToClipbrdOK=تم نسخ Ø§Ù„Ù…ÙØ§ØªÙŠØ­ إلى Ø§Ù„Ø­Ø§ÙØ¸Ø© deleteSecretKey=تحذير: أنت بصدد Ø­Ø°Ù Ù…ÙØªØ§Ø­ سري!\nإن Ø­Ø°ÙØª Ù…ÙØªØ§Ø­Ùƒ السري Ùلن يعود بوسعك تظهير أية رسالة عÙمّÙيت لهذا Ø§Ù„Ù…ÙØªØ§Ø­ØŒ Ùˆ لن تستطيع نقض Ø§Ù„Ù…ÙØªØ§Ø­ كذلك.\n\nأترغب حقا ÙÙŠ حذ٠كلا Ø§Ù„Ù…ÙØªØ§Ø­ÙŠÙ† السري Ùˆ العلني\n'%S'ØŸ deleteMix=تحذير: أنت بصدد Ø­Ø°Ù Ù…ÙØªØ§Ø­ سري!\nإن Ø­Ø°ÙØª Ù…ÙØªØ§Ø­Ùƒ السري Ùلن يعود بوسعك تظهير أية رسالة عÙمّÙيت لهذا Ø§Ù„Ù…ÙØªØ§Ø­ØŒ ولن تستطيع نقض Ø§Ù„Ù…ÙØªØ§Ø­ كذلك.\n\nأترغب حقا ÙÙŠ حذ٠كلا Ø§Ù„Ù…ÙØªØ§Ø­ÙŠÙ† السري والعلني؟ deletePubKey=أتريد Ø­Ø°Ù Ø§Ù„Ù…ÙØªØ§Ø­ العلني\n'%S'ØŸ deleteSelectedPubKey=أتريد Ø­Ø°Ù Ø§Ù„Ù…ÙØ§ØªÙŠØ­ العلنية؟ deleteKeyFailed=تعذّر Ø­Ø°Ù Ø§Ù„Ù…ÙØªØ§Ø­. # revokeKeyQuestion=You are about to revoke the key '%S'.\n\nYou will no longer be able to sign with this key, and once distributed, others will no longer be able to encrypt with that key. You can still use the key to decrypt old messages.\n\nDo you want to proceed? revokeKeyOk=لقد تم نقض هذا Ø§Ù„Ù…ÙØªØ§Ø­. إذا كان Ù…ÙØªØ§Ø­Ùƒ منشورا على خادوم Ù…ÙØ§ØªÙŠØ­ ÙÙŠÙÙØ¶Ù‘Ù„ أن تعيد Ø±ÙØ¹Ù‡ ليرى الآخرون النقض. revokeKeyFailed=تعذّر نقض Ø§Ù„Ù…ÙØªØ§Ø­. # revokeKeyNotPresent=You have no key (0x%S) which fits to this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before the revocation certificate! # revokeKeyAlreadyRevoked=The key 0x%S has already been revoked. refreshAllQuestion=لم تختر أي Ù…ÙØªØ§Ø­. أتريد تحديث كل Ø§Ù„Ù…ÙØ§ØªÙŠØ­ØŸ # refreshKeyServiceOn.warn=Warning: Your keys are currently being refreshed in the background as safely as possible.\nRefreshing all your keys at once will unnecessarily reveal information about you.\nDo you really want to do this? refreshKey.warn=تحذير: طبقا لعدد Ø§Ù„Ù…ÙØ§ØªÙŠØ­ وسرعة الاتصال Ùقد يستغرق تحديث كل Ø§Ù„Ù…ÙØ§ØªÙŠØ­ وقتا طويلا نوعا ما. # downloadContactsKeys.warn=Warning: depending on the number of contacts and the connection speed, downloading all keys could be quite a lengthy process! # downloadContactsKeys.importFrom=Import contacts from address book '%S'? keyMan.button.exportSecKey=&ØµØ¯Ù‘ÙØ± Ø§Ù„Ù…ÙØ§ØªÙŠØ­ السرية keyMan.button.exportPubKey=Export &Public Keys Only keyMan.button.import=ا&ستورد keyMan.button.refreshAll=&Ø­Ø¯Ù‘ÙØ« كل Ø§Ù„Ù…ÙØ§ØªÙŠØ­ keyMan.button.revokeKey=ان&قض Ø§Ù„Ù…ÙØªØ§Ø­ # keyMan.button.skip=&Skip Key keylist.noOtherUids=ليست له هويات أخرى keylist.hasOtherUids=معرو٠كذلك باسم keylist.noPhotos=لا توجد صورة keylist.hasPhotos=الصور # keyMan.addphoto.filepicker.title=Select photo to add # keyMan.addphoto.warnLargeFile=The file you have chosen is larger than 25 kB.\nIt is not recommended to add very large files because the keys get very large by this. # keyMan.addphoto.noJpegFile=The selected file does not appear to be a JPEG file. Please choose a different file. # keyMan.addphoto.failed=The photo could not be added. # noWksIdentity=The key %S does not have a WKS identity. # keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key "%1$S (%2$S)" for encrypting messages? # keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key "%1$S (%2$S)" for future messages? # keyman.addBlacklistKey.button=&Blacklist the key # keyman.removeBlacklistKey.button=&Remove key from Blacklist # Strings in enigmailManageUidDlg.xul changePrimUidFailed=ÙØ´Ù„ تغيير هوية المستخدم الأساسية changePrimUidOK=تم تغيير هوية المستخدم الأساسية بنجاح revokeUidFailed=ÙØ´Ù„ سحب هوية المستخدم %S revokeUidOK=تم نقض هوية المستخدم %S بنجاح. إذا كان Ù…ÙØªØ§Ø­Ùƒ منشورا على خادوم Ù…ÙØ§ØªÙŠØ­ ÙÙŠÙÙØ¶Ù‘Ù„ أن تعيد Ø±ÙØ¹Ù‡ ليرى الآخرون النقض. revokeUidQuestion=أترغب حقا ÙÙŠ نقض هوية المستخدم هذه %SØŸ # Strings in enigmailKeyImportInfo.xul # importInfoTitle=SUCCESS! Keys imported # importInfoBits=Bits # importInfoCreated=Created # importInfoFpr=Fingerprint # importInfoDetails=(Details) # importInfoNoKeys=No keys imported. # Strings in enigmailKeyDetailsDlg.xul keyTypePublic=Ù…ÙØªØ§Ø­ علني keyTypePrimary=primary key keyTypeSubkey=Ù…ÙØªØ§Ø­ ÙØ±Ø¹ÙŠ keyTypePair=زوج Ù…ÙØ§ØªÙŠØ­ keyExpiryNever=أبدا keyAlgorithm_1=RSA keyAlgorithm_2=RSA keyAlgorithm_3=RSA keyAlgorithm_16=الجمل keyAlgorithm_17=DSA # keyAlgorithm_18=ECDH # keyAlgorithm_19=ECDSA keyAlgorithm_20=الجمل # keyAlgorithm_22=EDDSA # keyUsageEncrypt=Encrypt # keyUsageSign=Sign # keyUsageCertify=Certify # keyUsageAuthentication=Authentication # keyDoesNotExpire=Key does not expire # Strings in enigmailGenCardKey.xul keygen.started=من ÙØ¶Ù„Ùƒ انتظر بينما يجري توليد Ø§Ù„Ù…ÙØªØ§Ø­... keygen.completed=تم توليد Ø§Ù„Ù…ÙØªØ§Ø­. معرّÙÙ Ø§Ù„Ù…ÙØªØ§Ø­ الجديد هو: 0x%S keygen.keyBackup=تم Ø­ÙØ¸ Ø§Ù„Ù…ÙØªØ§Ø­ احتياطيا باسم %S keygen.passRequired=من ÙØ¶Ù„Ùƒ حدد عبارة سر إذا كنت تريد إنشاء نسخة احتياطية من Ù…ÙØªØ§Ø­Ùƒ خارج البطاقة الذكية. # Strings in enigmailSetCardPin.xul cardPin.processFailed=ÙØ´Ù„ تغيير PIN # Strings in enigRetrieveProgres.xul keyserverProgress.refreshing=يجري تحديث Ø§Ù„Ù…ÙØ§ØªÙŠØ­Ø› انتظر... keyserverProgress.uploading=يجري Ø±ÙØ¹ Ø§Ù„Ù…ÙØ§ØªÙŠØ­Ø› انتظر... # keyserverProgress.wksUploadFailed=Could not upload your key to the Web Key Service # keyserverProgress.wksUploadCompleted=Your public key was successfully submitted to your provider. You will receive an email to confirm that you initiated the upload. keyserverTitle.refreshing=تم تحديث Ø§Ù„Ù…ÙØ§ØªÙŠØ­ keyserverTitle.uploading=تم تحديث Ø§Ù„Ù…ÙØªØ§Ø­ # Strings in enigmailSetupWizard passphrase.min8keys=يجب أن تتأل٠كلمة السر من 8 محار٠على الأقل setupWizard.reallyCancel=أترغب حقا ÙÙŠ صر٠مرشد إعداد EnigmailØŸ # setupWizard.invalidGpg=The file you specified is not a GnuPG executable. Please specify a different file. setupWizard.specifyFile=You need to at least specify a public key file in order to proceed. # setupWizard.installFailed=It seems that the installation was not successful. Please either retry the installation, or install GnuPG manually and locate it using the Browse button. # setupWizard.downloadForbidden=For your own security, we will not download GnuPG. Please visit https://gnupg.org/ in order to download GnuPG. # setupWizard.downloadImpossible=We cannot download GnuPG currently. Please try later or visit https://gnupg.org/ in order to download GnuPG. # setupWizard.hashSumError=The wizard could not verify the integrity of the downloaded file. The file may be broken or manipulated. Do you want to continue the installation anyway? # setupWizard.importSettingsFile=Specify backup file to load from # setupWizard.invalidSettingsFile=The specified file is not a correct Enigmail Settings backup file. # setupWizard.gpgConfExists=The GnuPG config file already exists. Do you want to overwrite it with the one from your old installation? # setupWizard.noGpgHomeDir=It appears that you configured %S to use for GnuPG. However, this is not a directory - you cannot use it. # setupWizard.unmachtedIds=The following identities of your old setup could not be matched:\n%S\nThe settings for these identities were skipped. # Strings in installGnuPG.jsm # installGnuPG.downloadFailed=An error occurred while trying to download GnuPG. Please check the console log for further details. # installGnuPG.installFailed=An error occurred while installing GnuPG. Please check the console log for further details. # Strings in enigmailAddUidDlg.xul addUidDlg.nameOrEmailError=ينبغي أن تدخل اسما Ùˆ عنوان بريد إلكتروني addUidDlg.nameMinLengthError=ينبغي أن يتأل٠الاسم من خمسة محار٠على الأقل addUidDlg.invalidEmailError=ينبغي أن تضع عنوان بريد صحيح # Strings in enigmailCardDetails.js # Carddetails.NoASCII=OpenPGP Smartcards only support ASCII characters in Firstname/Name. # network error types # errorType.SecurityCertificate=The security certificate presented by the web service is not valid. # errorType.SecurityProtocol=The security protocol used by the web service is unknown. # errorType.Network=A network error has occurred. # filter stuff # filter.folderRequired=You must select a target folder. # filter.decryptMove.label=Decrypt permanently (Enigmail) # filter.decryptCopy.label=Create decrypted Copy (Enigmail) # filter.decryptMove.warnExperimental=Warning - the filter action "Decrypt permanently" may lead to destroyed messages.\n\nWe strongly recommend that you first try the "Create decrypted Copy" filter, test the result carefully, and only start using this filter once you are satisified with the result. # filter.tempPepFilterDesc=Temporary filter to store sent message unencrypted # filter.term.pgpencrypted.label=OpenPGP Encrypted # filter.encrypt.label=Encrypt to key (Enigmail) # filter.keyRequired=You must select a recipient key. # filter.keyNotFound=Could not find an encryption key for "%S". # filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for "%S" you will no longer be able to read the emails. # strings in enigmailConvert.jsm # converter.decryptBody.failed=Could not decrypt message with subject\n"%S".\nDo you want to retry with a different passphrase or do you want to skip the message? # converter.decryptAtt.failed=Could not decrypt attachment "%1$S"\nof message with subject\n"%2$S".\nDo you want to retry with a different passphrase or do you want to skip the message? # saveLogFile.title=Save Log File # strings in gpg.jsm # unknownSigningAlg=Unknown signing algorithm (ID: %S) # unknownHashAlg=Unknown cryptographic hash (ID: %S) # strings in keyRing.jsm # keyring.photo=Photo # keyRing.pubKeyRevoked=The key %1$S (key ID %2$S) is revoked. # keyRing.pubKeyExpired=The key %1$S (key ID %2$S) has expired. # keyRing.pubKeyNotForSigning=The key %1$S (key ID %2$S) cannot be used for signing. # keyRing.pubKeyNotForEncryption=The key %1$S (key ID %2$S) cannot be used for encryption. # keyRing.keyDisabled=The key %1$S (key ID %2$S) is disabled; it cannot be used. # keyRing.keyNotTrusted=The key %1$S (key ID %2$S) is not trusted enough. Please set the trust level of your key to "ultimate" to use it for signing. # keyRing.keyInvalid=The key %1$S (key ID %2$S) is not valid. Please consider verifying it correctly. Alternatively use the Default encryption settings in the Enigmail preferences dialog. # keyRing.signSubKeysRevoked=All signing-subkeys of key %1$S (key ID %2$S) are revoked. # keyRing.signSubKeysExpired=All signing-subkeys of key %1$S (key ID %2$S) have expired. # keyRing.signSubKeysUnusable=All signing-subkeys of key %1$S (key ID %2$S) are revoked, expired or otherwise unusable. # keyRing.encSubKeysRevoked=All encryption subkeys of key %1$S (key ID %2$S) are revoked. # keyRing.encSubKeysExpired=All encryption subkeys of key %1$S (key ID %2$S) have expired. # keyRing.noSecretKey=You do not seem to have the secret key for %1$S (key ID %2$S) on your keyring; you cannot use the key for signing. # keyRing.encSubKeysUnusable=All encryption subkeys of key %1$S (key ID %2$S) are revoked, expired or otherwise unusable. #strings in exportSettingsWizard.js # cannotWriteToFile=Cannot save to file '%S'. Please select a different file. # dataExportError=An error occurred during exporting your data. # enigmailSettings=EnigmailSettings # defaultBackupFileName=Enigmail-export # specifyExportFile=Specify file name for exporting # homedirParamNotSUpported=Additional params that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. #strings in expiry.jsm # expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use the new key. # expiry.keysExpireSoon=The following of your keys will expire in less than %1$S days:\n%2$S We recommend that you create new keys and configure your accounts to use the new keys. # expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to ultimate in key properties. # expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to ultimate in key properties. # expiry.OpenKeyManager=Open Enigmail Key Management # expiry.OpenKeyProperties=Open Key Properties #strings in pEpDecrypt.jsm # pEpDecrypt.cannotDecrypt=This is an encrypted message. Unfortunately you don't have the secret key to decrypt the message. #strings in gpgAgent.jsm # gpghomedir.notexists=The directory '%S' containing your OpenPGP keys does not exist and cannot be created. # gpghomedir.notwritable=The directory '%S' containing your OpenPGP keys is not writable. # gpghomedir.notdirectory=The directory '%S' containing your OpenPGP keys is a file instead of a directory. # gpghomedir.notusable=Please fix the directory permissions or change the location of your GnuPG "home" directory. GnuPG cannot work correctly otherwise. #strings in pepTrustWords.js # pepTrustWords.cannotVerifyOwnId=Cannot verify p≡p Trustwords for own account. # pepTrustWords.cannotFindKey=Cannot find key for %S. # pepTrustWords.cannotStoreChange=Could not change trust for %S. # pepTrustWords.generalFailure=Cannot obtain trustwords for %S. # pepTrustWords.partnerFingerprint=Fingerprint for %S: #strings in mimeWkdHandler.jsm # wkdMessage.body.req=Your email provider processed your request to upload your public key to the OpenPGP Web Key Directory.\n\nPlease click the confirmation button in the Enigmail header to complete the publishing of your public key. # wkdMessage.body.process=This is an email related to the automatic processing to upload your public key to the OpenPGP Web Key Directory.\n\nYou do not need to take any manual action at this point. #strings in pepHandshake.js # pepPrivacyStatus.RatingBrokenSuggestion=Either you or the sender should resend the message. # pepPrivacyStatus.RatingHaveNoKeySuggestionOutgoing=If you composed this message, your key is not available. # pepPrivacyStatus.RatingMistrustSuggestion=Re-establish the connection with your communication partner and try to complete another handshake. # pepPrivacyStatus.RatingReliableSuggestion=Complete a handshake with your communication partner by exchanging trustwords in person or over the phone. A handshake is needed only once per partner and will ensure secure and trusted communication. # pepPrivacyStatus.RatingTrustedSuggestion=No action needed! # pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware this message may not be secure. # pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Please add the necessary information. # pepPrivacyStatus.RatingUnderAttackSuggestion=Separately verify the content of this message with your communication partner. # pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least secure. # pepPrivacyStatus.RatingUnencryptedSuggestion=Please ask your communication partner to use an encryption solution or install p≡p. # pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or no signature. Ask your communication partner to upgrade their encryption solution or install p≡p. # pepPrivacyStatus.RatingBrokenExplanation=This message has broken encryption or formatting. # pepPrivacyStatus.RatingHaveNoKeyExplanation=This message cannot be decrypted because the key is not available. # pepPrivacyStatus.RatingMistrustExplanation=This message has a communication partner that has previously been marked as mistrusted. # pepPrivacyStatus.RatingReliableExplanation=This message is secure but you still need to verify the identity of your communication partner. # pepPrivacyStatus.RatingTrustedExplanation=This message is secure and trusted. # pepPrivacyStatus.RatingUndefinedExplanation=This message does not contain enough information to determine if it is secure. # pepPrivacyStatus.RatingUnderAttackExplanation=This message is not secure and has been tampered with. # pepPrivacyStatus.RatingUnencryptedExplanation=This message is unsecure. # pepPrivacyStatus.RatingUnencryptedForSomeExplanation=This message is unsecure for some communication partners. # pepPrivacyStatus.RatingUnreliableExplanation=This message has unreliable protection. # pepPrivacyStatus.RatingBrokenText=Broken # pepPrivacyStatus.RatingHaveNoKeyText=Cannot Decrypt # pepPrivacyStatus.RatingMistrustText=Mistrusted # pepPrivacyStatus.RatingReliableText=Secure # pepPrivacyStatus.RatingTrustedText=Secure & Trusted # pepPrivacyStatus.RatingUndefinedText=Unknown # pepPrivacyStatus.RatingUnderAttackText=Under Attack # pepPrivacyStatus.RatingUnencryptedForSomeText=Unsecure for Some # pepPrivacyStatus.RatingUnencryptedText=Unsecure # pepPrivacyStatus.RatingUnreliableText=Unreliable Security # handshakeDlg.button.initHandshake=Handshake... # handshakeDlg.button.stopTrust=Stop Trusting # handshakeDlg.button.reTrust=Stop Mistrusting # handshakeDlg.label.outgoingMessage=Outgoing message # handshakeDlg.label.incomingMessage=Incoming message # handshakeDlg.error.noPeers=Cannot handshake without any correspondents. # handshakeDlg.error.noProtection=Please enable protection in order to use the Handshake function. # enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device # enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup #strings in autocrypt.jsm # autocrypt.setupMsg.subject=Autocrypt Setup Message # autocrypt.setupMsg.msgBody=To set up your new device for Autocrypt, please follow the instuctions that should be presented by your new device. # autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code presented on your old device, and then import the contained key into your keyring. #strings in upgradeInfo.html # upgradeInfo.doctitle=What's New in Enigmail v2.0? # upgradeInfo.welcome1=Welcome to the new Enigmail version 2.0! # upgradeInfo.welcome2=The release contains a lot of new and changed features. Please take a minute to find out what's new: # upgradeInfo.encSubject.title=Encrypting the Message Subject # upgradeInfo.encSubject.desc=We developed a new method that moves the email subject into the encrypted message, and replaces the visible subject with "Encrypted Message". Once such a message is decrypted, the original subject is replaced automatically. Hiding the subject is on by default; there is a preference to turn it off if you don't like it. (Note: this feature requires the message to be sent with PGP/MIME.) # upgradeInfo.buttons.title=Changed behavior of Encrypt and Sign Buttons # upgradeInfo.buttons.desc=The Encrypt and Sign buttons in the message composer window now work for both the OpenPGP and S/MIME protocols. If both algorithms are possible, then Enigmail will try to prefer the one for which all keys are available. # upgradeInfo.autocrypt.title=Support for Autocrypt # upgradeInfo.autocrypt.desc=Enigmail now supports Autocrypt, a new standard to distribute keys as part of sent messages. Enigmail automatically imports keys from Autocrypt-compliant messages, such that over time more and more emails can be encrypted. # upgradeInfo.pEp.title=New p≡p Junior Mode (Pretty Easy Privacy) # upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. You currently need to manually install p≡p for this purpose; this will change in a future release. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. # upgradeInfo.bottom.desc=Please visit our documentation for help on using Enigmail. # pep.missingGnuPG=In order to use Enigmail/p≡p, GnuPG is required. As we could not find it, we suggest to download and install it for you. #strings in enigmailAbout.html # aboutEnigmail.tabName=About Enigmail # aboutEnigmail.title=OpenPGP support provided by Enigmail # aboutEnigmail.team=Enigmail is developed by the Enigmail Team: # aboutEnigmail.projectLeader=Lead Developer: # aboutEnigmail.usability=Usability: # aboutEnigmail.documentation=Documentation: # aboutEnigmail.testing=Testing: # aboutEnigmail.userSupport=User Support: # aboutEnigmail.localization=Localization: See the Enigmail Language Packs page # aboutEnigmail.Credits=Credits: # aboutEnigmail.origAuthor=Original author of the Enigmail extension # aboutEnigmail.icons=Icons: # aboutEnigmail.formerMembers=Former team members: # aboutEnigmail.projectHosting=Project hosting: # aboutEnigmail.licenseSupportTitle=License & Support # aboutEnigmail.license=Enigmail OpenPGP is open source and licensed under the %S # aboutEnigmail.support=Support and download is available from www.enigmail.net. enigmail-2.0.8/lang/ar/help/000077500000000000000000000000001334302754500155675ustar00rootroot00000000000000enigmail-2.0.8/lang/ar/help/compose.html000066400000000000000000000100071334302754500201200ustar00rootroot00000000000000 Enigmail Help: Message Composition

Enigmail Help

Using Enigmail when composing messages

Enigmail menu in Mail/Compose window
Sign message
Enable/Disable sending signed mail. User is notified, if signing fails.
Encrypt message

Enable/Disable encryption to all recipient(s) before sending. User is notified, if encryption fails.

If Display selection when necessary is set in Preferences -> Key Selection tab, a list of keys will pop up if there are addresses in the list of recipients for the message for whom you have no public key.

If Never display OpenPGP key selection dialog is set in Preferences -> Key Selection tab, and there are addresses in the list of recipients for the message for whom you have no public key, the message will be sent unencrypted.

Use PGP/MIME for this message
Enable/Disable the use of PGP/MIME for this message.

If you know the recipient(s) can read mail using the PGP/MIME format, you should use it.

This feature is dependent on the settings in Preferences -> PGP/MIME tab being set to Allow to use PGP/MIME or Always use PGP/MIME.

Default composition options
  • Signing/Encryption Options...: shortcut to Account Settings -> OpenPGP Options.
  • Send options...: shortcut to Preferences -> Send tab.
  • Key selection options...: shortcut to Preferences -> Key Selection tab.
  • PGP/MIME options...: shortcut to Preferences -> PGP/MIME tab.
Undo encryption

If there is a failure when actually sending mail, such as the POP server not accepting the request, Enigmail will not know about it, and the encrypted message will continue to be displayed in the Compose window. Choosing this menu item will undo the encryption/signing, reverting the Compose window back to its original text.

As a temporary fix, this option may also be used to decrypt the quoted text when replying to encrypted messages. Enigmail should automatically decrypt the quoted message, but if that fails for some reason, you can use this menu item to force it.

Insert public key
insert ASCII-armored public key block at the current cursor location in the Compose window. You will be prompted for the email addresses of the key(s) to be inserted. Keys inserted in this manner will automatically be recognized at the receiving end by Enigmail. After key insertion, you may still choose to sign/encrypt the mail as needed. Also, do not insert more than one key block in a message; just specify multiple email addresses, separated by commas or spaces, when prompted.
Clear save passphrase
Clears cached passphrase. Useful if you have multiple passphrases.
Help
Displays Help information from the website (this page).

Further help is available on the Enigmail Help web page

enigmail-2.0.8/lang/ar/help/editRcptRule.html000066400000000000000000000114521334302754500210660ustar00rootroot00000000000000 Enigmail Help: Edit OpenPGP Rule

Enigmail Help

Using the Enigmail Rules Editor: Edit OpenPGP Rule

In the Rules Editor, you can specify defaults per recipient for enabling encryption, signing and PGP/MIME, and to define what OpenPGP key(s) to use. In this dialog, you can specify the rules for a single recipient, and for a group of recipients with very similar attributes.

Set OpenPGP Rules for
Contains the email addresses of the recipients (without names, i.e. just an address like somebody@email.domain). You can specify several email addresses, separated by spaces. The address specified here can consist of only the domain section so that mail to any address at that domain will be matched, e.g. @email.domain will allow matching to body@email.domain, somebody@email.domain, anybody@email.domain, etc.
Apply rule if recipient ...
This modifies the matching of the email addresses. If multiple addresses are entered, the setting will apply to all. The examples below are based on body@email.domain entered in the OpenPGP Rules field above.
  • Is exactly: with this setting, the rule will only trigger on emails to body@email.domain (exact, case insensitive matching).
  • Contains: with this setting, any email address containing the string is matched, e.g. anybody@email.domain or body@email.domain.net
  • Begins with: with this setting, any email address starting with the string is matched, e.g. body@email.domain.net, body@email.domain-name.com.
  • Ends with: with this setting, any email address ending with the string is matched, e.g. anybody@email.domain , somebody@email.domain.
Continue with the next rule for the matching address
Enabling this function will allow you to define a rule but not have to specify a KeyID in the Use the following OpenPGP keys: field, so that the email address is used to check for a key at the time of sending. Also, further rules for the same address(es) will be processed as well.
Do not check further rules for the matching address
Enabling this function stops processing any other rules for the matching address(es) if this rule is matched; i.e. rule processing continues with the next recipient.
Use the following OpenPGP keys:
Use the Select Key(s).. button to select the recipient keys to be used for encryption. As in the action above, no further rules for the matching address(es) are processed.
Default for Signing
Enable or disable message signing. This either uses or overrides what you have specified in the message composition window. The values are:
  • Never: disable signing, even if it was enabled in the message composition window (overrules the other values)
  • Yes, if selected from in Message Composition: leave signing as specified in the message composition window
  • Always: enable signing, even if it was not enabled in the message composition window
These signing settings are applied for all rules that match. If one of the rules disables signing, the message will not be signed, regardless of other rules that specify Always.
Encryption
Enable or disable message encryption. The allowed settings and their meaning are the same as for message signing.
PGP/MIME
Enable or disable the use of the PGP/MIME (RFC 3156) message encoding. If PGP/MIME is disabled, the messages are encoded using "inline PGP". The allowed values and their meaning are the same as for message signing.

The rules are processed in the order displayed in the list in the OpenPGP Rules Editor. Whenever a rule matches a recipient and contains a OpenPGP Key ID, in addition to using the specified Key ID, the recipient is not considered anymore when processing further rules.


Further help is available on the Enigmail Per-Recipient Settings page

enigmail-2.0.8/lang/ar/help/initError.html000066400000000000000000000045311334302754500204350ustar00rootroot00000000000000 Enigmail Help: How to Resolve Problems with Initializing OpenPGP

Enigmail Help

How to Resolve Problems with Initializing OpenPGP

There are several reasons why initializing OpenPGP does not succeed. The most common ones are described below; for more information please visit the Enigmail Support page.

GnuPG could not be found

In order for OpenPGP to work, the tool GnuPG needs to be installed. If GnuPG cannot be found, then first make sure that the executable gpg.exe (on Windows; gpg on other platforms) is installed on your computer. If GnuPG is installed, and OpenPGP cannot find it, then you need to manually set the path to GnuPG in the OpenPGP Preferences (menu OpenPGP > Preferences)

Enigmime failed to initialize

OpenPGP works only if it is built using the same build environment as Thunderbird or SeaMonkey was built. This means that you can use the official Enigmail releases only if you use the official releases of Thunderbird or SeaMonkey provided by mozilla.org.

If you use a Thunderbird or SeaMonkey version coming from some other source (e.g. the provider of your Linux distribution), or if you built the application yourself, you should either use an Enigmail version built by the same source, or build Enigmail yourself. For building Enigmail, refer to the Source Code section on the Enigmail home page. Please don't file any bug report concerning this problem, it is not solvable.

Further help is available on the Enigmail Support Web Site.

enigmail-2.0.8/lang/ar/help/messenger.html000066400000000000000000000100131334302754500204400ustar00rootroot00000000000000 Enigmail Help: Message Reading

Enigmail Help

Using Enigmail when reading messages

Decrypt button in main Mail window
This button can be used for several purposes: decrypt, verify, or import public keys. Normally decryption/verification happens automatically, although this can be disabled through a preference. However, if this fails, usually a short error message will appear in the Enigmail status line. If you click the Decrypt button, you will be able to see a more detailed error message, including the output from the GnuPG command.
Pen and Key icons in Message Header display
The Pen and Key icons in the Message Header display indicate if the message you are reading was signed and/or encrypted and if the signature is good, i.e. the message has not been changed since it was signed. If the message has been changed, the Pen icon will change to a Broken Pen to indicate that the signature is bad. Right clicking on either the Pen or Key icons will bring up a menu with the following options:
  • OpenPGP Security info: allows you to view the output status from GnuPG for the message.
  • Copy OpenPGP Security info: copies the output status from GnuPG to the clipboard; to paste into a reply message, etc.
  • View OpenPGP Photo ID: allows you to view the Photo ID of the person who sent the message, if they have a photo embedded in their Public Key. (This option will only be enabled if a Photo ID exists in their key.)
  • S/MIME Security info: allows you to view the S/MIME Security Info for the message.

If you do not have keyserver-options auto-key-retrieve set in your gpg.conf file and you read a message which is signed or encrypted, you will see a Pen icon in the headers display area with a Question mark on it, the Enigmail status line in the headers area will say Part of the message signed; click pen icon for details and the message in the Message Pane will show all the OpenPGP message block indicators and the signature block.

You may also see this if you have keyserver-options auto-key-retrieve set in your gpg.conf file and the OpenPGP key is not available on the default keyserver.

Clicking on the Pen and Question mark icon will bring up a window advising that the key is unavailable in your keyring. Clicking on OK will bring up another window with a list of keyservers from which you can select to download the sender's public key from.

To configure the list of keyservers you wish to use, go to Enigmail -> Preferences -> Basic tab and enter the keyserver addresses in the Keyserver(s): box, separated by a comma. The first keyserver in the list will be used as the default.

Opening encrypted attachments / importing attached OpenPGP keys
Attachments named *.pgp, *.asc and *.gpg are recognized as attachments that can be handled specially by Enigmail. Right clicking on such an attachment enables two special menu items in the context menu: Decrypt and Open and Decrypt and Save. Use these two menu items if you want Enigmail to decrypt an attachment before opening or saving it. If an attachment is recognized as an OpenPGP key file, you are offered to import the keys it into your keyrings.

Further help is available on the Enigmail Help web page

enigmail-2.0.8/lang/ar/help/rulesEditor.html000066400000000000000000000057241334302754500207660ustar00rootroot00000000000000 Enigmail Help: Rules Editor

Enigmail Help

Using the Enigmail Rules Editor

In the Rules Editor, you can specify defaults per recipient for enabling encryption, signing and PGP/MIME, and to define what OpenPGP key(s) to use. Each rule consists of 5 fields and is represented on a single line:

Email
The e-mail(s) from the To:, Cc: and Bcc: fields to match. The matching works on substrings (Further details can be found in the Edit Rule dialog)
OpenPGP Key(s)
a list of OpenPGP Key ID's to use for the recipient
Sign
enable or disable message signing. This either uses or overrides what you have specified in the message composition window. The values are:
  • Never: disable signing, even if it was enabled in the message composition window (overrules the other values)
  • Possible: leave signing as specified in the message composition window
  • Always: enable signing, even if it was not enabled in the message composition window

These signing settings are applied for all rules that match. If one of the rules disables signing, the message will not be signed, regardless of other rules that specify Always.

Encrypt
enable or disable message encryption. The allowed settings and their meaning are the same as for message signing.
PGP/MIME
enable or disable the use of the PGP/MIME (RFC 3156) message encoding. If PGP/MIME is disabled, the messages are encoded using "inline PGP". The allowed values and their meaning a re the same as for message signing.

The rules are processed in the order displayed in the list. Whenever a rule matches a recipient and contains a OpenPGP Key ID, in addition to using the specified Key ID, the recipient is not considered anymore when processing further rules.

Note: The rule editor is not yet complete. It is possible to write some more advanced rules by directly editing the rules file (these rules should then not be edited anymore in the rule editor). Further information for directly editing the file is available on the Enigmail Homepage


Further help is available on the Enigmail Help web page

enigmail-2.0.8/lang/ar/help/sendingPrefs.html000066400000000000000000000047771334302754500211230ustar00rootroot00000000000000 Enigmail Help: Edit OpenPGP Rule

Enigmail Help

Defining Preferences to Send Encrypted

In the Sending Preferences you can choose the general model and preferences for encryption.

Convenient Encryption
With these settings, emails are encrypted without confirmation whenever possible.

This setup is appropriate, if you just want to improve your privacy by sending emails encyrpted instead of unencrypted if that's possible.

The effect is like sending emails as letters instead of postcards. Unlike postcards, letters usually hide their contents while in transit.

Note however that as with letters you can't be sure that nobody is opening the letter while it is in transit (although, some technical effort is necessary for that).

A concrete risk is that you accidentally use "faked keys" you got from somewhere or somebody claiming that the key belongs to the person you want to send emails to. To avoid this risk, you can either use the trust model of PGP (see below) or you should always verify, whether the fingerprint of a public key is correct.

Manual Encryption
This option allows you to specify the different preferences for encryption according to your needs. You can specify
  • whether replies to encrypted/signed emails should automatically also be encrypted/signed-
  • whether to use the trust model of OpenPGP to accept keys (this means that to use a key you either have to sign the key or have enough other people you trust having signed the key).
  • whether you want to automatically send emails encrypted if all keys are accepted.
  • whether and when you want to finally confirm sending an email.
If it is important for you that content you send encrypted can't be read by other people or organizations, you should use the manual preferences at least choose the option to accept keys only if you or other people signed them. While this model reduces the risk of using faked keys, it requires that you actively sign keys and declare owner trust using the key managament dialog. enigmail-2.0.8/lang/bg/000077500000000000000000000000001334302754500146255ustar00rootroot00000000000000enigmail-2.0.8/lang/bg/am-enigprefs.properties000066400000000000000000000001211334302754500213120ustar00rootroot00000000000000# Strings used in the Mozill AccountManager prefPanel-enigprefs=OpenPGP Security enigmail-2.0.8/lang/bg/enigmail.dtd000066400000000000000000001571561334302754500171260ustar00rootroot00000000000000 ' за да уточните имейл адреÑите"> ' Ñимволи за да уточните имейл адреÑи за GnuPG. Изключете ако получателите имат Ñтари Hushmail ключове."> Забележка: Генерирането на ключа може да отнеме нÑколко минути. Ðе излизайте от приложението докато трае генерирането на ключа. Ðктивното браузване или извършването на активни операции Ñ Ð´Ð¸Ñка по време на генерирането на ключа ще генерира 'Ñлучайни чиÑла' и ще уÑкори процеÑа. Ще бъдете уведомени, когато генерирането на ключа приключи."> ' е невалидно"> Забележка: Генерирането на ключа може да отнеме нÑколко минути. Ðе излизайте от приложението докато трае генерирането на ключа. Ще бъдете уведомени, когато генерирането на ключа приключи"> Забележка: Enigmail винаги ще проверÑва подпиÑите на пиÑмата за вÑеки акаунт или идентичноÑÑ‚, незавиÑимо дали това е активирано или не"> Благодарим ви, че използвате Enigmail."> enigmail-2.0.8/lang/bg/enigmail.properties000066400000000000000000002061621334302754500205370ustar00rootroot00000000000000Enigmail=Enigmail ##################################################################### # Strings used within enigmailCommon.js and enigmailCommon.jsm ##################################################################### enigAlert=Enigmail Предупреждение enigConfirm=Enigmail Потвърждение # enigInfo=Enigmail Information enigError=Enigmail Грешка enigPrompt=Enigmail ÐапомнÑне dlgYes=&Да dlgNo=&Ðе dlgKeepSetting=Запомни отговора и не питай отново dlgNoPrompt=Ðе показвай този диалог отново dlg.button.delete=&Изтриване dlg.button.cancel=&Отказ dlg.button.close=&ЗатварÑне dlg.button.continue=Продължаване dlg.button.skip=&ПропуÑкане # dlg.button.overwrite=&Overwrite dlg.button.view=&Отвори # dlg.button.retry=&Retry # dlg.button.ignore=&Ignore # dlg.button.install=&Install # dlg.button.ok=&OK repeatPrefix=\n\nТова предупреждение ще Ñе повтори %S repeatSuffixSingular=един път. repeatSuffixPlural=повече пъти. noRepeat=\n\nТова предупреждение нÑма да Ñе Ð¿Ð¾Ð²Ñ‚Ð°Ñ€Ñ Ð´Ð¾ÐºÐ°Ñ‚Ð¾ не обновите Enigmail. pgpNotSupported=Желаете да използвате Enigmail заедно Ñ PGP 6.x\n\nза Ñъжаление, PGP 6.x има проблеми, който не позволÑват на Enigmail да работи коректно. Ето защо, Enigmail не поддържа PGP 6.x повече; Ð¼Ð¾Ð»Ñ Ð¸Ð½Ñталирайте GnuPG (GPG) поддръжка.\n\nÐко Ñе нуждаете от помощ за инÑталиране на GnuPG, Ñе обърнете към ÑекциÑта за помощ, намираща Ñе на заглавната Ñтраница на Enigmail. # initErr.howToFixIt=In order to use Enigmail, GnuPG is required. If you did not install GnuPG yet, the easiest way to do this is using the "Setup Wizard" button below. # initErr.setupWizard.button=&Setup Wizard passphraseCleared=Паролата за защита на чаÑÑ‚Ð½Ð¸Ñ ÐºÐ»ÑŽÑ‡ беше изтрита. # cannotClearPassphrase=You are using a non-standard tool (such as gnome-keyring) for passphrase handling. Clearing the passphrase is therefore not possible from within Enigmail. noPhotoAvailable=ÐÑма налична Ñнимка debugLog.title=Enigmail дебъгер дневник # error.photoPathNotReadable=Photo path '%S' is not readable # generalError=Error: %S # Strings in configure.jsm enigmailCommon.versionSignificantlyChanged=Тази нова верÑÐ¸Ñ Ð½Ð° Enigmail има значителни промени в боравенето Ñ Ð¿Ñ€ÐµÐ´Ð¿Ð¾Ñ‡Ð¸Ñ‚Ð°Ð½Ð¸Ñта и възможноÑтите. Опитахме Ñе да прехвърлим Ñтарите наÑтройки в тази нова верÑиÑ. Въпреки това, ние не можахме да обхванем вÑичко автоматично. МолÑ, проврете отново получените нови преференции и възможноÑти. enigmailCommon.checkPreferences=Проверeте Преференциите ... # preferences.defaultToPgpMime=We have changed the default message encoding in Enigmail from Inline-PGP to PGP/MIME. We recommend you keep this as default.\n\nIf you still wish to use Inline-PGP by default, you can do so in the Account Settings under OpenPGP Security. ##################################################################### # Strings in enigmailAbout.js ##################################################################### usingVersion=Използваната Enigmail верÑÐ¸Ñ Ðµ %S # enigmailPepVersion=Enigmail/p≡p version %S usingAgent=Използва Ñе %S изпълним файл %S за криптиране и декриптиране agentError=ERROR: Грешка при опит за доÑтъп до Enigmime уÑлуги! ##################################################################### # Strings in enigmailKeygen.js ##################################################################### accessError=Грешка при опит за доÑтъп до Enigmail уÑлуги onlyGPG=Генерирането на ключове работи Ñамо Ñ GnuPG (не работи Ñ PGP)! keygenComplete=Генерирането на ключа е готово! ИдентификациÑта <%S> ще бъде използвана за подпиÑване. revokeCertRecommended=Силно препоръчваме да Ñъздадете нулиращ Ñертификат за вашиÑÑ‚ ключ. Този Ñертификат може да Ñе използва девалидиране, в Ñлучай че вашиÑÑ‚ Ñекретен ключ бъде изгубен или компроментиран. Желаете ли да Ñъздадете нулиращ Ñертификат Ñега? keyMan.button.generateCert=&Генериране на Ñертификат genCompleteNoSign=Генерирането на ключа е готово! genGoing=Генерирането на ключа е в прогреÑ! passNoMatch=Паролите за защита на чаÑÑ‚Ð½Ð¸Ñ ÐºÐ»ÑŽÑ‡ не Ñъвпадат! ÐœÐ¾Ð»Ñ Ð²ÑŠÐ²ÐµÐ´ÐµÑ‚Ðµ ги отново! passCheckBox=ÐœÐ¾Ð»Ñ Ð¼Ð°Ñ€ÐºÐ¸Ñ€Ð°Ð¹Ñ‚Ðµ опциÑта 'Без парола за защита на чаÑÑ‚Ð½Ð¸Ñ ÐºÐ»ÑŽÑ‡', ако не желаете да използвате парола passUserName=ÐœÐ¾Ð»Ñ Ð²ÑŠÐ²ÐµÐ´ÐµÑ‚Ðµ потребителÑко име за тази Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ # keygen.missingUserName=There is no name specified for the selected account/identity. Please enter a value in the field "Your name" in the account settings. # keygen.passCharProblem=You are using special characters in your passphrase. Unfortunately, this can cause troubles for other applications. We recommend you choose a passphrase consisting only of any of these characters:\na-z A-Z 0-9 /.;:-,!?(){}[]%* passSpaceProblem=\nПоради техничеÑки причини, паролата ви, не може да започне или завърши Ñ Ð¸Ð½Ñ‚ÐµÑ€Ð²Ð°Ð». changePassFailed=ПромÑната на паролата за защита на чаÑÑ‚Ð½Ð¸Ñ ÐºÐ»ÑŽÑ‡ е неуÑпешна. keyConfirm=Генериране на публичен и чаÑтен ключ за '%S'? keyMan.button.generateKey=&Генериране на ключ keyAbort=Да Ñе прекъÑне ли генерирането на ключ? keyMan.button.generateKeyAbort=&ПрекъÑване на генерирането на ключ keyMan.button.generateKeyContinue=&Продължаване на генерирането на ключ expiryTooLong=Ðе може да Ñъздавате ключ ÑÑŠÑ Ñрок на валидноÑÑ‚ по-голÑм от 100 години. expiryTooLongShorter=Вие не можете да Ñъздадете ключ, който изтича Ñлед повече от 90 години. expiryTooShort=Ключа трÑбва да има валидноÑÑ‚ поне един ден. keyGenFailed=Генерирането на ключ беше провалено. ÐœÐ¾Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐµÑ‚Ðµ Enigmail конзолата (Меню Enigmail > Опции за отÑтранÑване на грешки) за подробноÑти. setKeyExpirationDateFailed=Срокът на валидноÑÑ‚ не може да бъде променен # Strings in enigmailMessengerOverlay.js securityInfo=Enigmail Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° ÑигурноÑÑ‚\n\n enigHeader=Enigmail: enigContentNote=Enigmail: *Прикачените ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ ÐºÑŠÐ¼ това Ñъобщение не Ñа криптирани или подпиÑани*\n\n possiblyPgpMime=Възможно е Ñъобщението да е криптирано или подпиÑано Ñ PGP/MIME; натиÑнете бутона 'Декриптирай' за да го проверите saveAttachmentHeader=Enigmail: Запишете Ð´ÐµÐºÑ€Ð¸Ð¿Ñ‚Ð¸Ñ€Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¸ÐºÐ°Ñ‡ÐµÐ½ файл noTempDir=Ðе може да бъде намерен път към временна директориÑ\nÐœÐ¾Ð»Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð¸Ñ€Ð°Ð¹Ñ‚Ðµ Ð¿ÑŠÑ‚Ñ ÐºÑŠÐ¼ временната Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ attachmentPgpKey=ПрикачениÑÑ‚ файл '%S' който отварÑте Ñъдържа OpenPGP ключ файл.\n\nÐатиÑнете 'ВнеÑи' за да запишете Ñъдържащите Ñе ключове или 'Отвори' за да разгледате Ñъдържанието на файла beginPgpPart=********* *ÐÐЧÐЛО ÐРКРИПТИРÐÐÐТРИЛИ ПОДПИСÐÐÐТРЧÐСТ* ********* endPgpPart=********** *КРÐЙ ÐРКРИПТИРÐÐÐТРИЛИ ПОДПИСÐÐÐТРЧÐСТ* ********** notePartEncrypted=Enigmail: *ЧаÑтите на това Ñъобщение не Ñа криптирани или подпиÑани* noteCutMessage=Enigmail: *Ð’ Ñъобщението Ñа намерени множеÑтво блокове -- декриптирането/проверката Ñа прекъÑнати* decryptOkNoSig=Предупреждение\n\nДекриптирането беше уÑпешно, но подпиÑа не не беше проверен коректно msgOvl.button.contAnyway=&Въпреки това продължете # signature.verifiedOK=The signature for attachment %S was successfully verified signature.verifyFailed=ПодпиÑÑŠÑ‚ за прикрепване на файл %S беше уÑпешно проверена attachment.noMatchToSignature=ÐÑма Ñъвпадение на Ð¿Ñ€Ð¸ÐºÐ°Ñ‡ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð» '%S' към подпиÑа на файла attachment.noMatchFromSignature=ÐÑма Ñъвпадение на подпиÑÐ°Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð» '%S' към Ð¿Ñ€Ð¸ÐºÐ°Ñ‡ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð» # fixBrokenExchangeMsg.failed=Did not succeed to repair message. # enigmail.msgViewColumn.label=Enigmail # enigmailPep.msgViewColumn.label=Enigmail/p≡p # wksNoIdentity=This key is not linked to any of your email accounts. Please add an account for at least one of the following email addresse(s):\n\n%S # wksConfirmSuccess=Confirmation email sent. # wksConfirmFailure=Sending the confirmation email failed. # autocrypt.importSetupKey.accountPreconfigured=Your account is already correctly configured for Autocrypt.\n\nDo you really want to overwrite your settings with this setup message? # autocrypt.importSetupKey.selfCreated=This message was created by your currently running instance of Enigmail.\n\nPlease switch to the email client to which you want to transfer the settings, and click on the message on that email client to import the settings. # autocrypt.importSetupKey.invalidMessage=Error - could not read setup message. The message seems to be corrupted. Please try to create a new setup message on your "other" device. # autocrypt.importSetupKey.invalidKey=Error - the key could not be imported. The key is either not supported by your version of GnuPG, or it got corrupted. # autocrypt.importSetupKey.wrongPasswd=The password you entered is wrong. Do you want to retry? # autocrypt.importSetupKey.success=The Autocrypt setup message was processed successfully. Autocrypt is now available for your account '%S'. ##################################################################### # Strings in enigmailMsgComposeOverlay.js ##################################################################### keysToExport=Изберете OpenPGP ключове за внаÑÑне keysToUse=Изберете OpenPGP Ключ(ове) за да ги използвате за %S pubKey=Публичен ключ за %S\n windowLocked=Прозореца за ÑÑŠÑтавÑне на ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ðµ блокиран; изпращането е прекратено sendUnencrypted=Грешка при инициализирането на Enigmail.\nДа Ñе изпрати ли некриптирано Ñъобщение? composeSpecifyEmail=ÐœÐ¾Ð»Ñ ÑƒÑ‚Ð¾Ñ‡Ð½Ð¸Ñ‚Ðµ ÑÐ²Ð¾Ñ Ð¿ÑŠÑ€Ð²Ð¸Ñ‡ÐµÐ½ пощенÑки адреÑ, който ще Ñе използва за подпиÑване на изходÑщите ÑъобщениÑ.\nÐко оÑтавите полето празно, за подпиÑване на Ñъобщението ще бъде използван адреÑа от полето 'От'. sendingHiddenRcpt=Това Ñъобщение Ñъдържа Ñкрити ÐºÐ¾Ð¿Ð¸Ñ (BCC) към нÑкой от получателите. Ðко то е криптирано, може да изпратите Ñкрити ÐºÐ¾Ð¿Ð¸Ñ ÐºÑŠÐ¼ тези получатели, но тези от Ñ‚ÑÑ… които използват други програми (например: PGP Corp.) нÑма да могат да декриптират Ñъобщението. УточнÑвайки това, препоръчваме да избÑгвате Ñкрити ÐºÐ¾Ð¿Ð¸Ñ (BCC) при изпращане на криптирани ÑъобщениÑ. sendWithHiddenBcc=Скрит получател на Ñкрито копие sendWithShownBcc=Криптирай нормално sendingNews=Изпращането на криптирано Ñъобщение е прекратено.\n\nТова Ñъобщение не може да бъде криптирано защото Ñъдържа newsgroup получатели. ÐœÐ¾Ð»Ñ Ð¸Ð·Ð¿Ñ€Ð°Ñ‚ÐµÑ‚Ðµ Ñъобщението отново без да го криптирате. sendToNewsWarning=Предупреждение: на път Ñте да изпратите криптирано пиÑмо къm newsgroup.\n\nТова не е препоръчително, защото има ÑмиÑъл, Ñамо ако вÑички членове на групата може да декриптират Ñъобщението, Ñ‚.е.Ñъобщението трÑбва да бъде криптирано Ñ ÐºÐ»ÑŽÑ‡Ð¾Ð²ÐµÑ‚Ðµ на вÑички учаÑтници в групата. ÐœÐ¾Ð»Ñ Ð¸Ð·Ð¿Ñ€Ð°Ñ‚ÐµÑ‚Ðµ това Ñъобщение Ñамо ако знаете какео правите.\n\nДа продължа ли? hasHTML=HTML mail warning:\nТова Ñъобщение може да Ñъдържа HTML, и това да доведе до неуÑпешно криптиране/подпиÑване. За да избегнете това в бъдеще, трÑбва да задържите 'SHIFT' бутона и да натиÑнете СъÑтави/Отговори бутон за да изпращате криптирани пиÑма.\nÐко подпиÑвате ÑъобщениÑта по-подразбиране, трÑбва да деактивирате 'СъÑтавÑй ÑъобщениÑта като HTML' за поÑтоÑнно деактивиране на HTML ÑъобщениÑта за този имейл акаунт. strippingHTML=Съобщението ÑÑŠÑържа HTML форматиране и Ñ‚Ñ Ñ‰Ðµ бъде изгубена при преминаването към нормален текÑÑ‚ за подпиÑване/криптиране. Желаете ли да продължите? msgCompose.button.sendAnyway=&Изпратете Ñъобщението въпреки това attachWarning=Прикачените файлове към това Ñъобщение не Ñа запиÑани на Ð²Ð°ÑˆÐ¸Ñ ÐºÐ¾Ð¼Ð¿ÑŽÑ‚ÑŠÑ€ и не може да бъдат криптирани. За да криптирате прикачените файлове, първо ги запишете на Ð²Ð°ÑˆÐ¸Ñ ÐºÐ¾Ð¼Ð¿ÑŽÑ‚ÑŠÑ€ и Ñлед това ги прикачете. Желаете ли вÑе пак да изпратите това Ñъобщение? quotedPrintableWarn=Вие Ñте активирали 'quoted-printable' кодиране за вашите изходÑщи ÑъобщениÑ. Това може да доведе до неправилно декриптиране и/или проверка на вашето Ñъобщение.\nЖелаете ли да изключите изпращането на 'quoted-printable' ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñега? minimalLineWrapping=Вие решихте да изравните редовете по %S Ñимвола ширина. За правилно криптиране и/или подпиÑване, тази ÑтойноÑÑ‚ трÑбва да е най-малко 68.\nЖелаете ли да промените подравнÑването на 68 Ñимвола? warning=Предупреждение signIconClicked=Вие ръчно определихте дали да Ñе подпиÑва Ñъобщението. Ето защо използването на подпиÑване не завиÑи от използването на криптиране. # errorOwnKeyUnusable=The key ID '%S' configured for the current identity does not yield a usable OpenPGP key.\n\nPlease ensure that you have a valid, not expired OpenPGP key and that your account settings point to that key.\nIf your key is not expired, then check if you did set Owner trust to full or ultimate. # msgCompose.cannotSaveDraft=Error while saving draft # msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information - partially encrypted email. # msgCompose.partiallyEncrypted.mimeMsg=The message you are replying to contained both unencrypted and encrypted parts. Some encrypted message parts are invisible to you.\n\nIf the sender was not able to decrypt the hidden message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nWe recommend that you don't reply to the message, but create a new message containing your answer. # msgCompose.partiallyEncrypted.inlinePGP=The message you are replying to contained both unencrypted and encrypted parts. If the sender was not able to decrypt some message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nPlease consider removing all quoted text from your reply to this sender. # msgCompose.internalEncryptionError=Internal Error: promised encryption disabled # msgCompose.internalError=An internal error has occurred. # msgCompose.toolbarTxt.signAndEncrypt=This message will be signed and encrypted msgCompose.toolbarTxt.signOnly=Това Ñъобщение ще бъде подпиÑано # msgCompose.toolbarTxt.encryptOnly=This message will be encrypted msgCompose.toolbarTxt.noEncryption=Това Ñъобщение ще бъде неподпиÑано и некодирано # msgCompose.toolbarTxt.disabled=Enigmail is disabled for the selected identity # msgCompose.protectSubject.tooltip=Protect the message subject # msgCompose.noSubjectProtection.tooltip=Do not protect the message subject # msgCompose.encryptedSubjectStub=Encrypted Message # msgCompose.protectSubject.dialogTitle=Enable Protection of Subject? # msgCompose.protectSubject.question=Regular encrypted emails contain the unredacted subject.\n\nWe have established a standard to hide the original subject in the encrypted message\nand replace it with a dummy text, such that the subject is only visible after the email is decrypted.\n\nDo you want to protect the subject in encrypted messages? # msgCompose.protectSubject.yesButton=&Protect subject # msgCompose.protectSubject.noButton=&Leave subject unprotected # msgCompose.detailsButton.label=Details ... # msgCompose.detailsButton.accessKey=D # msgCompose.pepSendUnknown=Unknown # msgCompose.pepSendUnsecure=Unsecure # msgCompose.pepSendSecure=Secure # msgCompose.pepSendTrusted=Secure & Trusted # pep.alert.disabledForIdentity=p≡p is disabled for the current identity. Please enable p≡p via the Enigmail/p≡p preferences. # pep.alert.weakReply=You’re about to forward or reply to a secure message as insecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? # note: should end with double newline: sendAborted=Изпращането е прекъÑнато.\n\n # details: # keyNotTrusted=Not enough trust for key '%S' # keyNotFound=Key '%S' not found # keyRevoked=Key '%S' revoked # keyExpired=Key '%S' expired statPGPMIME=PGP/MIME # statSMIME=S/MIME statSigned=ПОДПИСÐÐО statEncrypted=EКОДИРÐÐО statPlain=ÐЕПОДПИСÐÐО и ÐЕКРИПТИРÐÐО offlineSave=Да запиша ли %S Ñъобщението %S в папката за неизпратени ÑъобщениÑ? onlineSend=Да Ð¸Ð·Ð¿Ñ€Ð°Ñ‚Ñ Ð»Ð¸ %S Ñъобщение на %S? encryptKeysNote=Забележка: Ñъобщението е криптирано ÑÑŠÑ Ñледната ПотребителÑка Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ / Ключове: %S # hiddenKey= signFailed=Грешка в Enigmail; Криптирането/подпиÑването беше неуÑпешно; Да Ð¸Ð·Ð¿Ñ€Ð°Ñ‚Ñ Ð»Ð¸ Ñъобщението некриптирано? msgCompose.button.sendUnencrypted=&Изпращане на некриптирано Ñъобщение recipientsSelectionHdr=Избери получателите на криптираното Ñъобщение configureNow=Ðе Ñте конфигирурали тази потребителÑка Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð·Ð° работа Ñ Enigmail. ÐайÑтина ли желаете да направите това? # encryption/signing status and associated reasons: # encryptMessageAuto=Encrypt Message (auto) # encryptMessageNorm=Encrypt Message # signMessageAuto=Sign Message (auto) # signMessageNorm=Sign Message # encryptOff=Encryption: OFF # encryptOnWithReason=Encryption: ON (%S) # encryptOffWithReason=Encryption: OFF (%S) # encryptOn=Encryption: ON # signOn=Signing: ON # signOff=Signing: OFF # signOnWithReason=Signing: ON (%S) # signOffWithReason=Signing: OFF (%S) # reasonEnabledByDefault=enabled by default # reasonManuallyForced=manually forced reasonByRecipientRules=принудени от правилата на получателите reasonByAutoEncryption=принудени от автоматичното криптиране reasonByConflict=поради конфликт в правилата на получателите reasonByEncryptionMode=поради режим на криптиране # should not be used anymore: encryptYes=Съобщението ще бъде криптирано encryptNo=Съобщението нÑма да бъде криптирано # should not be used anymore: signYes=Съобщението ще бъде подпиÑано signNo=Съобщението нÑма да бъде подпиÑано # PGP/MIME status: # pgpmimeNormal=Protocol: PGP/MIME # inlinePGPNormal=Protocol: Inline PGP # smimeNormal=Protocol: S/MIME # pgpmimeAuto=Protocol: PGP/MIME (auto) # inlinePGPAuto=Protocol: Inline PGP (auto) # smimeAuto=Protocol: S/MIME (auto) # should not be used anymore pgpmimeYes=PGP/MIME ще бъдат използвани pgpmimeNo=Inline PGP ще бъдат използван # Attach own key status (tooltip strings): # attachOwnKeyNo=Your own key will not be attached # attachOwnKeyYes=Your own key will be attached # attachOwnKeyDisabled=Your own key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. rulesConflict=Възникна конфликт Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»Ð°Ñ‚Ð° на получателÑ\n%S\n\nДа Ð¸Ð·Ð¿Ñ€Ð°Ñ‚Ñ Ð»Ð¸ Ñъобщението Ñ Ñ‚ÐµÐ·Ð¸ наÑтройки? msgCompose.button.configure=&ÐаÑтройки msgCompose.button.send=&Изпращане на Ñъобщение msgCompose.button.save=&Ð—Ð°Ð¿Ð¸Ñ Ð½Ð° Ñъобщение # Strings in enigmailMsgHdrViewOverlay.js keyNeeded=За проверка на подпиÑа Ñе нуждаете от Ð¿ÑƒÐ±Ð»Ð¸Ñ‡Ð½Ð¸Ñ ÐºÐ»ÑŽÑ‡ %S keyUsed=ÐŸÑƒÐ±Ð»Ð¸Ñ‡Ð½Ð¸Ñ ÐºÐ»ÑŽÑ‡ %S Ñе използва за проверка на Ð¿Ð¾Ð´Ð¿Ð¸Ñ clickDecrypt=; натиÑнете бутона за Декриптиране clickDecryptRetry=; натиÑнете бутона за Декриптиране за повторен опит clickDetailsButton=; щракнете върху бутона 'Детайли' за повече Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ # clickImportButton=; click on the 'Import Key' button to import the key # keyTypeUnsupported=; the key type is not supported by your version of GnuPG msgPart=ЧаÑÑ‚ от Ñъобщението %S msgSigned=подпиÑано # msgSignedUnkownKey=signed with unknown key msgEncrypted=криптирано msgSignedAndEnc=подпиÑано и криптирано unverifiedSig=Ðепроверен цифров Ð¿Ð¾Ð´Ð¿Ð¸Ñ incompleteDecrypt=Декриптирането е неуÑпешно needKey=Грешка - за да декриптирате Ñъобщението имате нужда от ÑÐµÐºÑ€ÐµÑ‚Ð½Ð¸Ñ ÐºÐ»ÑŽÑ‡ failedDecrypt=Грешка - декриптирането е неуÑпешно badPhrase=Грешка - грешна парола за защита на чаÑÑ‚Ð½Ð¸Ñ ÐºÐ»ÑŽÑ‡ failedDecryptVerify=Грешка - декриптирането или проверката на Ñ†Ð¸Ñ„Ñ€Ð¾Ð²Ð¸Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñ Ðµ неуÑпешно viewInfo=; View > Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° детайлите на ÑигурноÑтта на Ñъобщението decryptedMsg=Декриптирано Ñъобщение # decryptedMsgWithFormatError=Decrypted message (restored broken PGP email format probably caused by an old Exchange server, so that the result might not be perfect to read) # usedAlgorithms=Used Algorithms: %1$S and %2$S # pepStatusInfo.text=p≡p Message Status. # pepStatusInfo.title.m3=Under Attack # pepStatusInfo.info.m3=This message is not secure and has been tampered with. # pepStatusInfo.title.m1=Mistrusted # pepStatusInfo.info.m1=This message has a communication partner that has previously been marked as mistrusted # pepStatusInfo.title.r0=Unknown # pepStatusInfo.info.r0=This message does not contain enough information to determine if it is secure. # pepStatusInfo.title.r1=Cannot Decrypt # pepStatusInfo.info.r1=This message cannot be decrypted because the key is not available. # pepStatusInfo.title.r2=Cannot Decrypt # pepStatusInfo.info.r2=This message cannot be decrypted because the key is not available. # pepStatusInfo.title.r3=Unsecure # pepStatusInfo.info.r3=This message is unsecure. # pepStatusInfo.title.r4=Unsecure for Some # pepStatusInfo.info.r4=This message is unsecure for some communication partners. # pepStatusInfo.title.r5=Unreliable Security # pepStatusInfo.info.r5=This message has unreliable protection. # pepStatusInfo.title.r6=Secure... # pepStatusInfo.info.r6=This message is secure but you still need to verify the identity of your communication partner. # pepStatusInfo.title.r7=Secure & Trusted # pepStatusInfo.info.r7=This message is secure and trusted. # pepStatusInfo.color.green=Green # pepStatusInfo.color.yellow=Yellow # pepStatusInfo.color.red=Red # pepRevokeTrust.question=Do you really want to cancel the trust for %S? # pepRevokeMistrust.question=Do you really want to re-trust the key for %S? # pepRevokeTrust.doRevoke=Cancel &trust # wksConfirmationReq=Web Key Directory Confirmation Request # wksConfirmationReq.message=This message has been sent by your email provider to confirm deployment of your OpenPGP public key\nin their Web Key Directory.\nProviding your public key helps others to discover your key and thus being able to encrypt messages to you.\n\nIf you want to deploy your key in the Web Key Directory now, please click on the button "Confirm Request" in the status bar.\nOtherwise, simply ignore this message. # wksConfirmationReq.button.label=Confirm Request # autocryptSetupReq=Perform Autocrypt Setup # autocryptSetupReq.button.label=Start Setup # autocryptSetupReq.setupMsg.desc=This message contains all information to transfer your Autocrypt settings along with your secret key securely from your original device. # autocryptSetupReq.setupMsg.backup=You can keep this message and use it as a backup for your secret key. If you want to do this, you should write down the password and store it securely. # autocryptSetupReq.message.import=To import the settings and key(s) in Enigmail, please click on the "Start Setup" button in the status bar. # autocryptSetupReq.message.sent=Please click on the message on your new device and follow the instuctions to import the settings. # strings in pref-enigmail.js # oldGpgVersion20=Enigmail initialization failed.\n\nYou are using GnuPG version %1$S, which is not supported anymore. Enigmail requires GnuPG version %2$S or newer. Please upgrade your GnuPG installation, or Enigmail will not work. locateGpg=Ðамерете програмата GnuPG invalidGpgPath=ИзпълнимиÑÑ‚ файл на GnuPG не може да бъде намерен в указаната директориÑ. Ето защо Enigmail ще бъде деактивиран . warningsAreReset=Ð’Ñички Ð¿Ñ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ñ Ñ‰Ðµ бъдат нулирани. prefs.gpgFound=GnuPG е намерен в %S prefs.gpgNotFound=Ðе може да бъде намерен GnuPG prefs.warnAskNever=Предупреждение: активирането на тази Ð¾Ð¿Ñ†Ð¸Ñ Ñ‰Ðµ доведе до некриптирани имейли без вÑÑкаква допълнителна информациÑ, ако нÑма ключ за нÑкой от получателите - Enigmail нÑма да ви информира, ако това Ñе Ñлучи! # prefs.warnIdleTimeForUnknownAgent=Cannot connect to gpg-agent. Maybe your system uses a specialized tool for passphrase handling (e.g. gnome-keyring, seahorse-agent, KDE wallet manager, ...). Unfortunately Enigmail cannot control the passphrase timeout for the tool you are using. Therefore the respective timeout settings in Enigmail are disregarded. prefEnigmail.oneKeyserverOnly=Грешка - може да изберете Ñамо един Ñървър за ключове за Ñвалене на липÑтващи OpenPGP ключове. # Strings used in core.jsm # (said file also re-uses some strings from above) enterAdminPin=ÐœÐ¾Ð»Ñ Ð²ÑŠÐ²ÐµÐ´ÐµÑ‚Ðµ админиÑтраторÑки ПИРна вашата Смарткарта enterCardPin=ÐœÐ¾Ð»Ñ Ð²ÑŠÐ²ÐµÐ´ÐµÑ‚Ðµ ПИÐ-а на вашата Смарткарта notInit=Грешка - Enigmail уÑлугите вÑе още не Ñа инициализирани badCommand=Грешка - грешка при криптирането cmdLine=командна Ð»Ð¸Ð½Ð¸Ñ Ð¸ изход: notRequired=Грешка - не Ñе изиÑква криптиране notComplete=Грешка - генерирането на ключа вÑе още не е приключило invalidEmail=Грешка - грешен имейл адреÑ(и) noPassphrase=Грешка - не беше въведена парола за защита на чаÑÑ‚Ð½Ð¸Ñ ÐºÐ»ÑŽÑ‡ noPGPblock=Грешка - Ðе е намерен Ð·Ð°Ñ‰Ð¸Ñ‚ÐµÐ½Ð¸Ñ Ð±Ð»Ð¾Ðº Ñ Ð´Ð°Ð½Ð½Ð¸ на OpenPGP unverifiedReply=Indented message part (reply) was probably modified # keyInMessageBody=Key in message body found. Click 'Import Key' to import the key sigMismatch=Грешка - ПодпиÑите не Ñъвпадат cantImport=Грешка при внаÑÑнето на Ð¿ÑƒÐ±Ð»Ð¸Ñ‡Ð½Ð¸Ñ ÐºÐ»ÑŽÑ‡\n\n # doImportOne=Import %1$S (%2$S)? # doImportMultiple=Import the following keys?\n\n%S # previewFailed=Can't read public key file. # Strings used in errorHandling.jsm sc.wrongCardAvailable=Смарткартата %S намерена във Ð²Ð°ÑˆÐ¸Ñ Ñ‡ÐµÑ‚ÐµÑ† не може да бъде използвана за обработка на Ñъобщението.\nÐœÐ¾Ð»Ñ Ð¿Ð¾Ñтавете ÑвоÑта Смарткарта %S отново и повторете операциÑта. sc.insertCard=ОперациÑта изиÑква вашата Смарткарта %S.\nÐœÐ¾Ð»Ñ Ð¿Ð¾Ñтавете изиÑкваната Смарткарта и повторете операциÑта. sc.removeCard=ОперациÑта изиÑква вашата Смарткарта да бъде поÑтавена в четеца.\nÐœÐ¾Ð»Ñ Ñложете вашата Смарткарта и повторете операциÑта. sc.noCardAvailable=Във Ð²Ð°ÑˆÐ¸Ñ Ñ‡ÐµÑ‚ÐµÑ† не беше открита Смарткарта\nÐœÐ¾Ð»Ñ Ð¿Ð¾Ñтавете вашата Смарткарта, и повторете операциÑта. sc.noReaderAvailable=ВашиÑÑ‚ четец за Смарт карти е недоÑтъпен.\nÐœÐ¾Ð»Ñ Ñвържете Ð²Ð°ÑˆÐ¸Ñ Ñ‡ÐµÑ‚ÐµÑ† за Смарткарти, поÑтавете вашата карта, и повторете операциÑта. # keyError.keySpecNotFound=The email address "%S" cannot be matched to a key on your keyring. # keyError.keyIdNotFound=The configured key ID "%S" cannot be found on your keyring. # keyError.resolutionAction=Please select a valid key in the OpenPGP section of your Account Settings. # missingPassphrase=Missing passphrase # errorHandling.gpgAgentInvalid=Your system is running a version of gpg-agent that is not suitable for your GnuPG version. # errorHandling.gpgAgentError=GnuPG reported an error in the communication with gpg-agent (a component of GnuPG). # errorHandling.dirmngrError=GnuPG reported an error in the communication with dirmngr (a component of GnuPG). # errorHandling.pinentryError=GnuPG cannot query your passphrase via pinentry. # errorHandling.readFaq=This is a system setup or configuration error that prevents Enigmail from working properly and cannot be fixed automatically.\n\nWe strongly recommend that you consult our support web site at https://enigmail.net/faq. gpgNotFound=Ðевъзможно е да Ñе намери GnuPG програмата '%S'.\nУверете Ñе, че Ñте задали Ð¿ÑŠÑ‚Ñ Ð½Ð° Ð¸Ð·Ð¿ÑŠÐ»Ð½Ð¸Ð¼Ð¸Ñ GnuPG файли в наÑтройките. gpgNotInPath=Ðевъзможно е да Ñе намери GnuPG Ð¸Ð·Ð¿ÑŠÐ»Ð½Ð¸Ð¼Ð¸Ñ Ñ„Ð°Ð¹Ð».\nУверете Ñе, че Ñте задали Ð¿ÑŠÑ‚Ñ Ð½Ð° Ð¸Ð·Ð¿ÑŠÐ»Ð½Ð¸Ð¼Ð¸Ñ GnuPG файли в наÑтройките. # enigmailNotAvailable=Enigmail core Service not available prefGood=Правилен Ð¿Ð¾Ð´Ð¿Ð¸Ñ Ð¾Ñ‚ %S prefBad=Ðеправилен Ð¿Ð¾Ð´Ð¿Ð¸Ñ Ð¾Ñ‚ %S failCancel=Error - Получаването на ключа е отменено от Ð¿Ð¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ failNoServer=Error - Ðе е указан Ñървър за ключове failNoID=Error - Ðе е указан идентификатор на ключа за получаването на ключа failKeyExtract=Error - извличането на ключа е неуÑпешно notFirstBlock=Error - ПървиÑÑ‚ OpenPGP блок не е блок на Ð¿ÑƒÐ±Ð»Ð¸Ñ‡Ð½Ð¸Ñ ÐºÐ»ÑŽÑ‡ importKeyConfirm=Да импортирам ли ключа(овете) приложени в Ñъобщението? failKeyImport=Error - внаÑÑнето Ð½Ñ ÐºÐ»ÑŽÑ‡Ð° е неуÑпешно fileWriteFailed=ЗапиÑа на файла е неуÑпешен %S importKey=ВнаÑÑне на Ð¿ÑƒÐ±Ð»Ð¸Ñ‡Ð½Ð¸Ñ ÐºÐ»ÑŽÑ‡ %S от Ñървъра за ключове: uploadKey=Изпратете публичниÑÑ‚ ключ %S към Ñървъра за ключове: keyId=Идентификатор на ключа keyAndSigDate=Идентификатор на ключа: 0x%S / ПодпиÑан: %S keyFpr=Отпечатък на ключа: %S noEmailProvided=Ðе Ñте указали Ð°Ð´Ñ€ÐµÑ Ð·Ð° електронна поща! keyAlreadySigned=Ключа е вече подпиÑан, не може да го подпиÑвате повторно. ##################################################################### # Strings used in enigmailKeySelection.js ##################################################################### selKeyExpired=изтича %S createdHeader=Създаден на atLeastOneKey=Ðе е избран ключ! ТрÑбва да изберете поне един ключ fewerKeysThanRecipients=Избраните от Ð²Ð°Ñ ÐºÐ»ÑŽÑ‡Ð¾Ð²Ðµ Ñа по-малко от Ð±Ñ€Ð¾Ñ Ð½Ð° получателите. Сигурни ли Ñте че лиÑта Ñ ÐºÐ»ÑŽÑ‡Ð¾Ð²Ðµ за шифроване е пълен? userSel.button.goBack=Изберете още ключове userSel.secretKeySel.title=Изберете Ñекретен OpenPGP ключ за да подпиÑвате ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ userSel.problemNoKey=ÐÑма валиден ключ userSel.problemMultipleKeys=МножеÑтво ключове # should be same as thunderbird ENTITY sendLaterCmd.label: # sendLaterCmd.label=Send Later # Strings used in enigmailAttachmentDialog.js # pgpMimeNote=NOTE: PGP/MIME is not supported by all email clients. If you are unsure, select the %S option. first=първата second=втората # Strings used in am-enigprefs.js / enigmailEditIdentity.js encryptKeyHeader=Изберете OpenPGP ключ за криптиране identityName=СамоличноÑÑ‚: %S # switchPepMode=You are currently using the 'p≡p Junior' mode of Enigmail.\n\nBy enabling OpenPGP or S/MIME for an account, you are disabling p≡p and use the 'regular' mode of Enigmail without p≡p. # enableEnigmail=&Disable p≡p # Strings used in enigmailSingleRcptSettings.js noEncryption=Имате активирано криптиране, но вÑе ощч не Ñте избрали ключ. За да криптирате ÑъобщениÑта изпращани на %S, трÑбва да изберете един или нÑколко ключа от Ð²Ð°ÑˆÐ¸Ñ Ð»Ð¸ÑÑ‚. Желаете ли да деактивирате криптирането за %S? noKeyToUse=(Без - без криптиране) noEmptyRule=Правилото не може да е празно! ÐœÐ¾Ð»Ñ Ð²ÑŠÐ²ÐµÐ´ÐµÑ‚Ðµ имейл Ð°Ð´Ñ€ÐµÑ Ð¸ попълнете полето на правилото. invalidAddress=Имейл адреÑа(ите), който Ñте въвели не Ñа валидни. Ðе трÑбва да въвеждате имената на потребителите, а Ñамо техните имейл адреÑи. Пример:\nÐеправилно: Some Name \nПравилно: some.name@address.net # noCurlyBrackets=The curly brackets {} have a special meaning and should not be used in an email address. If you want to modify the matching behavior for this rule, use the 'Apply rule if recipient ...' option.\nMore information is available from the Help button. # Strings used in enigmailRulesEditor.js never=Ðикога always=Винаги possible=Възможно deleteRule=ÐаиÑтина ли желаете да изтриете избраното правило? nextRcpt=(Следващ получател) negateRule=Ðе # addKeyToRule=Add key %1$S (%2$S) to per-recipient rule # Strings used in enigmailSearchKey.js needOnline=ФункциÑта коÑто Ñте избрали не работи в Офлайн режим. ÐœÐ¾Ð»Ñ Ð¿Ñ€ÐµÐ¼Ð¸Ð½ÐµÑ‚Ðµ в Онлайн режим. protocolNotSupported=Протокола '%S://' който Ñте избрали не Ñе поддържа за ÑвалÑне на OpenPGP ключове. gpgkeysDisabled=Включването на опциÑта може да помогне 'extensions.enigmail.useGpgKeysTool'. noKeyserverConn=Свързването ÑÑŠÑ Ñървъра за ключове %S е невъзможно. keyDownloadFailed=СвалÑнето на ключа от Ñървъра за ключове е неуÑпешно. СтатуÑа е:\n%S internalError=Възникна вътршна грешка. Ключовете не могата да бъдат Ñвалени или внеÑени. noKeyFound=СъжалÑваме, не бÑха намерени ключове който да Ñъвпадат Ñ Ð²ÑŠÐ²ÐµÐ´ÐµÐ½Ð¸Ñ‚Ðµ критерии за търÑене.\nÐœÐ¾Ð»Ñ Ð·Ð°Ð±ÐµÐ»ÐµÐ¶ÐµÑ‚Ðµ че идентификациÑта на ключа трÑбва да започва Ñ \\"0x\\" (e.g. 0xABCDEF12). # keyDownload.keyUnavailable=We are sorry, but the key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their key by email. # gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. gpgKeysFailed=ТърÑенето или ÑвалÑнето на кл=чове от Ñървъра за ключове е неуÑпешно: gpgkeys_%S не може да бъде изпълнен. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Задаването на доверие на ÑобÑтвеника на ключа е неуÑпешно # Strings in enigmailSignKeyDlg.js signKeyFailed=ПодпиÑването на ключа Ñе провали alreadySigned.label=Забележка: ключа %S е винаги подпиÑан Ñ Ð¸Ð·Ð±Ñ€Ð°Ð½Ð¸Ñ Ñекретен ключ. # alreadySignedexportable.label=Note: the key %S is already signed exportable with the selected secret key. A local signature does not make sense. # partlySigned.label=Note: some user IDs of key %S are already signed with the selected secret key. # noTrustedOwnKeys=No eligible key found for signing! You need at least one fully trusted secret key in order to sign keys. # Strings in enigmailKeyManager.js keyMan.loadingKeys=Зареждане на ключовете, Ð¼Ð¾Ð»Ñ Ð¸Ð·Ñ‡Ð°ÐºÐ°Ð¹Ñ‚Ðµ ... keyValid.unknown=непознат keyValid.invalid=невалиден keyValid.disabled=деактивиран keyValid.revoked=анулиран keyValid.expired=изтекъл keyValid.noSubkey=нÑма валиден подключ keyTrust.untrusted=недоверен keyTrust.marginal=малко доверен keyTrust.full=доверен keyTrust.ultimate=безкрайно доверен keyTrust.group=(група) keyType.public=pub keyType.publicAndSec=pub/sec keyMan.enableKey=Ðктивиране на ключ keyMan.disableKey=Деактивиране на ключ userAtt.photo=Ðтрибут на Ð¿Ð¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ (JPEG image) asciiArmorFile=ASCII Защитени файлове (*.asc) importKeyFile=ВнеÑи файл за OpenPGP ключ gnupgFile=GnuPG Файлове # createKeyOK=Your Key has been generated saveRevokeCertAs=Създаване и Ð·Ð°Ð¿Ð¸Ñ Ð½Ð° Ðнулиращ Ñертификат # revokeCertOK=The revocation certificate has been successfully created. You can use it to invalidate your public key, e.g. in case you would lose your secret key. revokeCertFailed=ÐÐ½Ð¸Ð»Ð¸Ñ€Ð°Ñ‰Ð¸Ñ Ñертифика не може да бъде Ñъздаден. addUidOK=ПотребителÑката Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ðµ добавена уÑпешно addUidFailed=ДобавÑнето на потребителÑката Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ðµ неуÑпешно noKeySelected=ТрÑбва да изберете поне един ключ за да оÑъщеÑтвите избраната Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ exportToFile=Ð—Ð°Ð¿Ð¸Ñ Ð½Ð° Ð¿ÑƒÐ±Ð»Ð¸Ñ‡Ð½Ð¸Ñ ÐºÐ»ÑŽÑ‡ във файл # exportKeypairToFile=Export Secret and Public Key To File exportSecretKey=Желаете ли да включите ÑÐµÐºÑ€ÐµÑ‚Ð½Ð¸Ñ ÐºÐ»ÑŽÑ‡ в OpenPGP файла, който ще бъде запиÑан? saveKeysOK=Ключовете бÑха уÑпешно запиÑани saveKeysFailed=ЗапиÑването на ключовете Ñе провали importKeysFailed=ВнаÑÑнето на ключовете Ñе провали enableKeyFailed=Ðктивирането/деактивирането на ключовете не е уÑпешно specificPubKeyFilename=%S (0x%S) pub specificPubSecKeyFilename=%S (0x%S) pub-sec defaultPubKeyFilename=ИзнеÑени-публични ключове defaultPubSecKeyFilename=ИзнеÑени-публични-и-Ñекретни-ключове noSecretKeys=Ðе Ñа намерени Ñекретни ключове.\n\nЖелаете ли да генерирате ÑобÑтвен ключ Ñега? sendKeysOk=Ключа(овете) Ñа изпратени уÑпешно sendKeysFailed=Изпращането на ключовете е неуÑпешно receiveKeysOk=Ключа(овете) Ñа обновени уÑпешно receiveKeysFailed=СвалÑнето на ключовете пропадна importFromClip=ИÑкате ли да внеÑете ключ(ове) от клипборда? # importFromUrl=Download public key from this URL: copyToClipbrdFailed=Ðе може да копирате избраниÑÑ‚ ключо(ове) в клипборда. copyToClipbrdOK=Ключа(овете) Ñа копирани в клипборда deleteSecretKey=Предупреждение: Ðа път Ñте да изтриете ÑÐµÐºÑ€ÐµÑ‚Ð½Ð¸Ñ ÐºÐ»ÑŽÑ‡!\nÐко изтриете Ð²Ð°ÑˆÐ¸Ñ Ñекретен ключ, повече нÑма да можете да декриптирате ÑъобщениÑта криптирани за този ключ, и нÑма да може да анулирате този ключ.\n\nÐаиÑтина ли желаете да изтриете и двата ключа, ÑÐµÐºÑ€ÐµÑ‚Ð½Ð¸Ñ Ð¸ Ð¿ÑƒÐ±Ð»Ð¸Ñ‡Ð½Ð¸Ñ ÐºÐ»ÑŽÑ‡\n'%S'? deleteMix=Предупреждение: Ðа път Ñте да изтриете ÑÐµÐºÑ€ÐµÑ‚Ð½Ð¸Ñ ÐºÐ»ÑŽÑ‡!\nÐко изтриете Ð²Ð°ÑˆÐ¸Ñ Ñекретен ключ, повече нÑма да можете Ð´Ñ Ð´ÐµÐºÑ€Ð¸Ð¿Ñ‚Ð¸Ñ€Ð°Ñ‚Ðµ ÑъобщениÑта криптирани за този ключ.\n\nÐаиÑтина ли желаете да изтриете и двата, Ð¸Ð·Ð±Ñ€Ð°Ð½Ð¸Ñ Ñекретен и публичен ключ? deletePubKey=Желаете ли да изтриете Ð¿ÑƒÐ±Ð»Ð¸Ñ‡Ð½Ð¸Ñ ÐºÐ»ÑŽÑ‡\n'%S'? deleteSelectedPubKey=Желаете ли да изтриете публичните ключове? deleteKeyFailed=Ключа не може да бъде изтрит. # revokeKeyQuestion=You are about to revoke the key '%S'.\n\nYou will no longer be able to sign with this key, and once distributed, others will no longer be able to encrypt with that key. You can still use the key to decrypt old messages.\n\nDo you want to proceed? revokeKeyOk=Ключа ще бъде анулиран. Ðко ключа ви е качен на Ñървъра за ключове, е препоръчително да го качите отново, за да виждат вÑички че е анулиран. revokeKeyFailed=Ключа не може да бъде анулиран. # revokeKeyNotPresent=You have no key (0x%S) which fits to this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before the revocation certificate! # revokeKeyAlreadyRevoked=The key 0x%S has already been revoked. refreshAllQuestion=Ðе Ñте избрали ключ. ИÑкате ли да обновите вÑички ключове? # refreshKeyServiceOn.warn=Warning: Your keys are currently being refreshed in the background as safely as possible.\nRefreshing all your keys at once will unnecessarily reveal information about you.\nDo you really want to do this? refreshKey.warn=Предупреждение: в завиÑимоÑÑ‚ от Ð±Ñ€Ð¾Ñ Ð½Ð° ключовете и ÑкороÑтта на връзката, обновÑването на вÑички ключове може да отнеме много време! # downloadContactsKeys.warn=Warning: depending on the number of contacts and the connection speed, downloading all keys could be quite a lengthy process! # downloadContactsKeys.importFrom=Import contacts from address book '%S'? keyMan.button.exportSecKey=ЕкÑпортиране на &Секретните ключове keyMan.button.exportPubKey=ЕкÑпортиране &Ñамо на Публичните ключове keyMan.button.import=&ВнаÑÑне keyMan.button.refreshAll=&ОбновÑване на вÑички ключове keyMan.button.revokeKey=&Ðулиране на ключа # keyMan.button.skip=&Skip Key keylist.noOtherUids=ÐÑма други идентификации keylist.hasOtherUids=Така извеÑтни както keylist.noPhotos=ÐÑма Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ñ keylist.hasPhotos=Ð¤Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ñ # keyMan.addphoto.filepicker.title=Select photo to add # keyMan.addphoto.warnLargeFile=The file you have chosen is larger than 25 kB.\nIt is not recommended to add very large files because the keys get very large by this. # keyMan.addphoto.noJpegFile=The selected file does not appear to be a JPEG file. Please choose a different file. # keyMan.addphoto.failed=The photo could not be added. # noWksIdentity=The key %S does not have a WKS identity. # keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key "%1$S (%2$S)" for encrypting messages? # keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key "%1$S (%2$S)" for future messages? # keyman.addBlacklistKey.button=&Blacklist the key # keyman.removeBlacklistKey.button=&Remove key from Blacklist # Strings in enigmailManageUidDlg.xul changePrimUidFailed=ПромÑната на оÑновната ПотребителÑка Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð±ÐµÑˆÐµ неуÑпешна changePrimUidOK=ПромÑната на оÑновната ПотребителÑка Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð±ÐµÑˆÐµ уÑпешна revokeUidFailed=Ðнулирането на ПотрeбителÑката Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ %S беше неуÑпешно revokeUidOK=ПотрeбителÑката Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ %S беше анулирана уÑпешно. Aко Ñте качили вашиÑÑ‚ ключ на Ñървър за ключове, е препоръчително да го качите отново, така оÑтаналите потребители ще виждат че е анулиран. revokeUidQuestion=ÐаиÑтина ли желаете да анулирате ПотребителÑката идентификациÑ: \n%S # Strings in enigmailKeyImportInfo.xul # importInfoTitle=SUCCESS! Keys imported # importInfoBits=Bits # importInfoCreated=Created # importInfoFpr=Fingerprint # importInfoDetails=(Details) # importInfoNoKeys=No keys imported. # Strings in enigmailKeyDetailsDlg.xul keyTypePublic=Публичен ключ keyTypePrimary=ОÑновен ключ keyTypeSubkey=Подключ keyTypePair=двойка ключове keyExpiryNever=безÑрочен keyAlgorithm_1=RSA keyAlgorithm_2=RSA keyAlgorithm_3=RSA keyAlgorithm_16=ELG keyAlgorithm_17=DSA # keyAlgorithm_18=ECDH # keyAlgorithm_19=ECDSA keyAlgorithm_20=ELG # keyAlgorithm_22=EDDSA keyUsageEncrypt=Криптиране keyUsageSign=ПодпиÑване keyUsageCertify=Потвърждавам keyUsageAuthentication=УдоÑтоверÑване # keyDoesNotExpire=Key does not expire # Strings in enigmailGenCardKey.xul keygen.started=ÐœÐ¾Ð»Ñ Ð¸Ð·Ñ‡Ð°ÐºÐ°Ð¹Ñ‚Ðµ, докато ключа Ñе генерира .... keygen.completed=Генериране на ключ. Ðовата Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð½Ð° ключа е: 0x%S keygen.keyBackup=Създадено беше резервно копие като %S keygen.passRequired=ÐœÐ¾Ð»Ñ Ð²ÑŠÐ²ÐµÐ´ÐµÑ‚Ðµ парола за защита на чаÑÑ‚Ð½Ð¸Ñ ÐºÐ»ÑŽÑ‡ ако желаете да Ñъздадете резервно копие на Ð²Ð°ÑˆÐ¸Ñ ÐºÐ»ÑŽÑ‡ извън вашата Смарткарта. # Strings in enigmailSetCardPin.xul cardPin.processFailed=СмÑната на PIN-а беше неуÑпешна # Strings in enigRetrieveProgres.xul keyserverProgress.refreshing=ОбновÑване на ключовете, Ð¼Ð¾Ð»Ñ Ð¸Ð·Ñ‡Ð°ÐºÐ°Ð¹Ñ‚Ðµ ... keyserverProgress.uploading=Качване на ключовете, Ð¼Ð¾Ð»Ñ Ð¸Ð·Ñ‡Ð°ÐºÐ°Ð¹Ñ‚Ðµ ... # keyserverProgress.wksUploadFailed=Could not upload your key to the Web Key Service # keyserverProgress.wksUploadCompleted=Your public key was successfully submitted to your provider. You will receive an email to confirm that you initiated the upload. keyserverTitle.refreshing=ОбновÑване на ключовете keyserverTitle.uploading=Качване на ключ # Strings in enigmailSetupWizard passphrase.min8keys=Вашата парола за защита на чаÑÑ‚Ð½Ð¸Ñ ÐºÐ»ÑŽÑ‡ трÑбва да Ñе ÑÑŠÑтой най-малко от 8 Ñимвола! setupWizard.reallyCancel=ÐаиÑтина ли желаете да затворите Enigmail Ñъветника за наÑтройка? # setupWizard.invalidGpg=The file you specified is not a GnuPG executable. Please specify a different file. # setupWizard.specifyFile=You need to at least specify a public key file in order to proceed. # setupWizard.installFailed=It seems that the installation was not successful. Please either retry the installation, or install GnuPG manually and locate it using the Browse button. # setupWizard.downloadForbidden=For your own security, we will not download GnuPG. Please visit https://gnupg.org/ in order to download GnuPG. # setupWizard.downloadImpossible=We cannot download GnuPG currently. Please try later or visit https://gnupg.org/ in order to download GnuPG. # setupWizard.hashSumError=The wizard could not verify the integrity of the downloaded file. The file may be broken or manipulated. Do you want to continue the installation anyway? # setupWizard.importSettingsFile=Specify backup file to load from # setupWizard.invalidSettingsFile=The specified file is not a correct Enigmail Settings backup file. # setupWizard.gpgConfExists=The GnuPG config file already exists. Do you want to overwrite it with the one from your old installation? # setupWizard.noGpgHomeDir=It appears that you configured %S to use for GnuPG. However, this is not a directory - you cannot use it. # setupWizard.unmachtedIds=The following identities of your old setup could not be matched:\n%S\nThe settings for these identities were skipped. # Strings in installGnuPG.jsm # installGnuPG.downloadFailed=An error occurred while trying to download GnuPG. Please check the console log for further details. # installGnuPG.installFailed=An error occurred while installing GnuPG. Please check the console log for further details. # Strings in enigmailAddUidDlg.xul addUidDlg.nameOrEmailError=ТрÑбва да попълните Име и Имейл Ð°Ð´Ñ€ÐµÑ addUidDlg.nameMinLengthError=Името ви трÑбва да Ñъдържа най-малко 5 Ñимвола addUidDlg.invalidEmailError=ТрÑбва да въведете валиден имейл Ð°Ð´Ñ€ÐµÑ # Strings in enigmailCardDetails.js # Carddetails.NoASCII=OpenPGP Smartcards only support ASCII characters in Firstname/Name. # network error types # errorType.SecurityCertificate=The security certificate presented by the web service is not valid. errorType.SecurityProtocol=Протоколът за ÑигурноÑÑ‚, използван от уеб уÑлугата е неизвеÑтен. # errorType.Network=A network error has occurred. # filter stuff # filter.folderRequired=You must select a target folder. # filter.decryptMove.label=Decrypt permanently (Enigmail) filter.decryptCopy.label=Създайте декриптирано копие (Enigmail) # filter.decryptMove.warnExperimental=Warning - the filter action "Decrypt permanently" may lead to destroyed messages.\n\nWe strongly recommend that you first try the "Create decrypted Copy" filter, test the result carefully, and only start using this filter once you are satisified with the result. # filter.tempPepFilterDesc=Temporary filter to store sent message unencrypted # filter.term.pgpencrypted.label=OpenPGP Encrypted # filter.encrypt.label=Encrypt to key (Enigmail) # filter.keyRequired=You must select a recipient key. # filter.keyNotFound=Could not find an encryption key for "%S". # filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for "%S" you will no longer be able to read the emails. # strings in enigmailConvert.jsm # converter.decryptBody.failed=Could not decrypt message with subject\n"%S".\nDo you want to retry with a different passphrase or do you want to skip the message? # converter.decryptAtt.failed=Could not decrypt attachment "%1$S"\nof message with subject\n"%2$S".\nDo you want to retry with a different passphrase or do you want to skip the message? # saveLogFile.title=Save Log File # strings in gpg.jsm # unknownSigningAlg=Unknown signing algorithm (ID: %S) # unknownHashAlg=Unknown cryptographic hash (ID: %S) # strings in keyRing.jsm # keyring.photo=Photo # keyRing.pubKeyRevoked=The key %1$S (key ID %2$S) is revoked. # keyRing.pubKeyExpired=The key %1$S (key ID %2$S) has expired. # keyRing.pubKeyNotForSigning=The key %1$S (key ID %2$S) cannot be used for signing. # keyRing.pubKeyNotForEncryption=The key %1$S (key ID %2$S) cannot be used for encryption. # keyRing.keyDisabled=The key %1$S (key ID %2$S) is disabled; it cannot be used. # keyRing.keyNotTrusted=The key %1$S (key ID %2$S) is not trusted enough. Please set the trust level of your key to "ultimate" to use it for signing. # keyRing.keyInvalid=The key %1$S (key ID %2$S) is not valid. Please consider verifying it correctly. Alternatively use the Default encryption settings in the Enigmail preferences dialog. # keyRing.signSubKeysRevoked=All signing-subkeys of key %1$S (key ID %2$S) are revoked. # keyRing.signSubKeysExpired=All signing-subkeys of key %1$S (key ID %2$S) have expired. # keyRing.signSubKeysUnusable=All signing-subkeys of key %1$S (key ID %2$S) are revoked, expired or otherwise unusable. # keyRing.encSubKeysRevoked=All encryption subkeys of key %1$S (key ID %2$S) are revoked. # keyRing.encSubKeysExpired=All encryption subkeys of key %1$S (key ID %2$S) have expired. # keyRing.noSecretKey=You do not seem to have the secret key for %1$S (key ID %2$S) on your keyring; you cannot use the key for signing. # keyRing.encSubKeysUnusable=All encryption subkeys of key %1$S (key ID %2$S) are revoked, expired or otherwise unusable. #strings in exportSettingsWizard.js # cannotWriteToFile=Cannot save to file '%S'. Please select a different file. # dataExportError=An error occurred during exporting your data. # enigmailSettings=EnigmailSettings # defaultBackupFileName=Enigmail-export # specifyExportFile=Specify file name for exporting # homedirParamNotSUpported=Additional params that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. #strings in expiry.jsm # expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use the new key. # expiry.keysExpireSoon=The following of your keys will expire in less than %1$S days:\n%2$S We recommend that you create new keys and configure your accounts to use the new keys. # expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to ultimate in key properties. # expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to ultimate in key properties. # expiry.OpenKeyManager=Open Enigmail Key Management # expiry.OpenKeyProperties=Open Key Properties #strings in pEpDecrypt.jsm # pEpDecrypt.cannotDecrypt=This is an encrypted message. Unfortunately you don't have the secret key to decrypt the message. #strings in gpgAgent.jsm # gpghomedir.notexists=The directory '%S' containing your OpenPGP keys does not exist and cannot be created. # gpghomedir.notwritable=The directory '%S' containing your OpenPGP keys is not writable. # gpghomedir.notdirectory=The directory '%S' containing your OpenPGP keys is a file instead of a directory. # gpghomedir.notusable=Please fix the directory permissions or change the location of your GnuPG "home" directory. GnuPG cannot work correctly otherwise. #strings in pepTrustWords.js # pepTrustWords.cannotVerifyOwnId=Cannot verify p≡p Trustwords for own account. # pepTrustWords.cannotFindKey=Cannot find key for %S. # pepTrustWords.cannotStoreChange=Could not change trust for %S. # pepTrustWords.generalFailure=Cannot obtain trustwords for %S. # pepTrustWords.partnerFingerprint=Fingerprint for %S: #strings in mimeWkdHandler.jsm # wkdMessage.body.req=Your email provider processed your request to upload your public key to the OpenPGP Web Key Directory.\n\nPlease click the confirmation button in the Enigmail header to complete the publishing of your public key. # wkdMessage.body.process=This is an email related to the automatic processing to upload your public key to the OpenPGP Web Key Directory.\n\nYou do not need to take any manual action at this point. #strings in pepHandshake.js # pepPrivacyStatus.RatingBrokenSuggestion=Either you or the sender should resend the message. # pepPrivacyStatus.RatingHaveNoKeySuggestionOutgoing=If you composed this message, your key is not available. # pepPrivacyStatus.RatingMistrustSuggestion=Re-establish the connection with your communication partner and try to complete another handshake. # pepPrivacyStatus.RatingReliableSuggestion=Complete a handshake with your communication partner by exchanging trustwords in person or over the phone. A handshake is needed only once per partner and will ensure secure and trusted communication. # pepPrivacyStatus.RatingTrustedSuggestion=No action needed! # pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware this message may not be secure. # pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Please add the necessary information. # pepPrivacyStatus.RatingUnderAttackSuggestion=Separately verify the content of this message with your communication partner. # pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least secure. # pepPrivacyStatus.RatingUnencryptedSuggestion=Please ask your communication partner to use an encryption solution or install p≡p. # pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or no signature. Ask your communication partner to upgrade their encryption solution or install p≡p. # pepPrivacyStatus.RatingBrokenExplanation=This message has broken encryption or formatting. # pepPrivacyStatus.RatingHaveNoKeyExplanation=This message cannot be decrypted because the key is not available. # pepPrivacyStatus.RatingMistrustExplanation=This message has a communication partner that has previously been marked as mistrusted. # pepPrivacyStatus.RatingReliableExplanation=This message is secure but you still need to verify the identity of your communication partner. # pepPrivacyStatus.RatingTrustedExplanation=This message is secure and trusted. # pepPrivacyStatus.RatingUndefinedExplanation=This message does not contain enough information to determine if it is secure. # pepPrivacyStatus.RatingUnderAttackExplanation=This message is not secure and has been tampered with. # pepPrivacyStatus.RatingUnencryptedExplanation=This message is unsecure. # pepPrivacyStatus.RatingUnencryptedForSomeExplanation=This message is unsecure for some communication partners. # pepPrivacyStatus.RatingUnreliableExplanation=This message has unreliable protection. # pepPrivacyStatus.RatingBrokenText=Broken # pepPrivacyStatus.RatingHaveNoKeyText=Cannot Decrypt # pepPrivacyStatus.RatingMistrustText=Mistrusted # pepPrivacyStatus.RatingReliableText=Secure # pepPrivacyStatus.RatingTrustedText=Secure & Trusted # pepPrivacyStatus.RatingUndefinedText=Unknown # pepPrivacyStatus.RatingUnderAttackText=Under Attack # pepPrivacyStatus.RatingUnencryptedForSomeText=Unsecure for Some # pepPrivacyStatus.RatingUnencryptedText=Unsecure # pepPrivacyStatus.RatingUnreliableText=Unreliable Security # handshakeDlg.button.initHandshake=Handshake... # handshakeDlg.button.stopTrust=Stop Trusting # handshakeDlg.button.reTrust=Stop Mistrusting # handshakeDlg.label.outgoingMessage=Outgoing message # handshakeDlg.label.incomingMessage=Incoming message # handshakeDlg.error.noPeers=Cannot handshake without any correspondents. # handshakeDlg.error.noProtection=Please enable protection in order to use the Handshake function. # enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device # enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup #strings in autocrypt.jsm # autocrypt.setupMsg.subject=Autocrypt Setup Message # autocrypt.setupMsg.msgBody=To set up your new device for Autocrypt, please follow the instuctions that should be presented by your new device. # autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code presented on your old device, and then import the contained key into your keyring. #strings in upgradeInfo.html # upgradeInfo.doctitle=What's New in Enigmail v2.0? # upgradeInfo.welcome1=Welcome to the new Enigmail version 2.0! # upgradeInfo.welcome2=The release contains a lot of new and changed features. Please take a minute to find out what's new: # upgradeInfo.encSubject.title=Encrypting the Message Subject # upgradeInfo.encSubject.desc=We developed a new method that moves the email subject into the encrypted message, and replaces the visible subject with "Encrypted Message". Once such a message is decrypted, the original subject is replaced automatically. Hiding the subject is on by default; there is a preference to turn it off if you don't like it. (Note: this feature requires the message to be sent with PGP/MIME.) # upgradeInfo.buttons.title=Changed behavior of Encrypt and Sign Buttons # upgradeInfo.buttons.desc=The Encrypt and Sign buttons in the message composer window now work for both the OpenPGP and S/MIME protocols. If both algorithms are possible, then Enigmail will try to prefer the one for which all keys are available. # upgradeInfo.autocrypt.title=Support for Autocrypt # upgradeInfo.autocrypt.desc=Enigmail now supports Autocrypt, a new standard to distribute keys as part of sent messages. Enigmail automatically imports keys from Autocrypt-compliant messages, such that over time more and more emails can be encrypted. # upgradeInfo.pEp.title=New p≡p Junior Mode (Pretty Easy Privacy) # upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. You currently need to manually install p≡p for this purpose; this will change in a future release. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. # upgradeInfo.bottom.desc=Please visit our documentation for help on using Enigmail. # pep.missingGnuPG=In order to use Enigmail/p≡p, GnuPG is required. As we could not find it, we suggest to download and install it for you. #strings in enigmailAbout.html # aboutEnigmail.tabName=About Enigmail # aboutEnigmail.title=OpenPGP support provided by Enigmail # aboutEnigmail.team=Enigmail is developed by the Enigmail Team: # aboutEnigmail.projectLeader=Lead Developer: # aboutEnigmail.usability=Usability: # aboutEnigmail.documentation=Documentation: # aboutEnigmail.testing=Testing: # aboutEnigmail.userSupport=User Support: # aboutEnigmail.localization=Localization: See the Enigmail Language Packs page # aboutEnigmail.Credits=Credits: # aboutEnigmail.origAuthor=Original author of the Enigmail extension # aboutEnigmail.icons=Icons: # aboutEnigmail.formerMembers=Former team members: # aboutEnigmail.projectHosting=Project hosting: # aboutEnigmail.licenseSupportTitle=License & Support # aboutEnigmail.license=Enigmail OpenPGP is open source and licensed under the %S # aboutEnigmail.support=Support and download is available from www.enigmail.net. enigmail-2.0.8/lang/bg/help/000077500000000000000000000000001334302754500155555ustar00rootroot00000000000000enigmail-2.0.8/lang/bg/help/compose.html000066400000000000000000000077661334302754500201300ustar00rootroot00000000000000 Enigmail Help: Message Composition

Enigmail Help

Using Enigmail when composing messages

Enigmail menu in Mail/Compose window
Sign message
Enable/Disable sending signed mail. User is notified, if signing fails.
Encrypt message

Enable/Disable encryption to all recipient(s) before sending. User is notified, if encryption fails.

If Display selection when necessary is set in Preferences -> Key Selection tab, a list of keys will pop up if there are addresses in the list of recipients for the message for whom you have no public key.

If Never display OpenPGP key selection dialog is set in Preferences -> Key Selection tab, and there are addresses in the list of recipients for the message for whom you have no public key, the message will be sent unencrypted.

Use PGP/MIME for this message
Enable/Disable the use of PGP/MIME for this message.

If you know the recipient(s) can read mail using the PGP/MIME format, you should use it.

This feature is dependent on the settings in Preferences -> PGP/MIME tab being set to Allow to use PGP/MIME or Always use PGP/MIME.

Default composition options
  • Signing/Encryption Options...: shortcut to Account Settings -> OpenPGP Options.
  • Send options...: shortcut to Preferences -> Send tab.
  • Key selection options...: shortcut to Preferences -> Key Selection tab.
  • PGP/MIME options...: shortcut to Preferences -> PGP/MIME tab.
Undo encryption

If there is a failure when actually sending mail, such as the POP server not accepting the request, Enigmail will not know about it, and the encrypted message will continue to be displayed in the Compose window. Choosing this menu item will undo the encryption/signing, reverting the Compose window back to its original text.

As a temporary fix, this option may also be used to decrypt the quoted text when replying to encrypted messages. Enigmail should automatically decrypt the quoted message, but if that fails for some reason, you can use this menu item to force it.

Insert public key
insert ASCII-armored public key block at the current cursor location in the Compose window. You will be prompted for the email addresses of the key(s) to be inserted. Keys inserted in this manner will automatically be recognized at the receiving end by Enigmail. After key insertion, you may still choose to sign/encrypt the mail as needed. Also, do not insert more than one key block in a message; just specify multiple email addresses, separated by commas or spaces, when prompted.
Clear save passphrase
Clears cached passphrase. Useful if you have multiple passphrases.
Help
Displays Help information from the website (this page).

Further help is available on the Enigmail Help web page

enigmail-2.0.8/lang/bg/help/editRcptRule.html000066400000000000000000000114521334302754500210540ustar00rootroot00000000000000 Enigmail Help: Edit OpenPGP Rule

Enigmail Help

Using the Enigmail Rules Editor: Edit OpenPGP Rule

In the Rules Editor, you can specify defaults per recipient for enabling encryption, signing and PGP/MIME, and to define what OpenPGP key(s) to use. In this dialog, you can specify the rules for a single recipient, and for a group of recipients with very similar attributes.

Set OpenPGP Rules for
Contains the email addresses of the recipients (without names, i.e. just an address like somebody@email.domain). You can specify several email addresses, separated by spaces. The address specified here can consist of only the domain section so that mail to any address at that domain will be matched, e.g. @email.domain will allow matching to body@email.domain, somebody@email.domain, anybody@email.domain, etc.
Apply rule if recipient ...
This modifies the matching of the email addresses. If multiple addresses are entered, the setting will apply to all. The examples below are based on body@email.domain entered in the OpenPGP Rules field above.
  • Is exactly: with this setting, the rule will only trigger on emails to body@email.domain (exact, case insensitive matching).
  • Contains: with this setting, any email address containing the string is matched, e.g. anybody@email.domain or body@email.domain.net
  • Begins with: with this setting, any email address starting with the string is matched, e.g. body@email.domain.net, body@email.domain-name.com.
  • Ends with: with this setting, any email address ending with the string is matched, e.g. anybody@email.domain , somebody@email.domain.
Continue with the next rule for the matching address
Enabling this function will allow you to define a rule but not have to specify a KeyID in the Use the following OpenPGP keys: field, so that the email address is used to check for a key at the time of sending. Also, further rules for the same address(es) will be processed as well.
Do not check further rules for the matching address
Enabling this function stops processing any other rules for the matching address(es) if this rule is matched; i.e. rule processing continues with the next recipient.
Use the following OpenPGP keys:
Use the Select Key(s).. button to select the recipient keys to be used for encryption. As in the action above, no further rules for the matching address(es) are processed.
Default for Signing
Enable or disable message signing. This either uses or overrides what you have specified in the message composition window. The values are:
  • Never: disable signing, even if it was enabled in the message composition window (overrules the other values)
  • Yes, if selected from in Message Composition: leave signing as specified in the message composition window
  • Always: enable signing, even if it was not enabled in the message composition window
These signing settings are applied for all rules that match. If one of the rules disables signing, the message will not be signed, regardless of other rules that specify Always.
Encryption
Enable or disable message encryption. The allowed settings and their meaning are the same as for message signing.
PGP/MIME
Enable or disable the use of the PGP/MIME (RFC 3156) message encoding. If PGP/MIME is disabled, the messages are encoded using "inline PGP". The allowed values and their meaning are the same as for message signing.

The rules are processed in the order displayed in the list in the OpenPGP Rules Editor. Whenever a rule matches a recipient and contains a OpenPGP Key ID, in addition to using the specified Key ID, the recipient is not considered anymore when processing further rules.


Further help is available on the Enigmail Per-Recipient Settings page

enigmail-2.0.8/lang/bg/help/initError.html000066400000000000000000000045311334302754500204230ustar00rootroot00000000000000 Enigmail Help: How to Resolve Problems with Initializing OpenPGP

Enigmail Help

How to Resolve Problems with Initializing OpenPGP

There are several reasons why initializing OpenPGP does not succeed. The most common ones are described below; for more information please visit the Enigmail Support page.

GnuPG could not be found

In order for OpenPGP to work, the tool GnuPG needs to be installed. If GnuPG cannot be found, then first make sure that the executable gpg.exe (on Windows; gpg on other platforms) is installed on your computer. If GnuPG is installed, and OpenPGP cannot find it, then you need to manually set the path to GnuPG in the OpenPGP Preferences (menu OpenPGP > Preferences)

Enigmime failed to initialize

OpenPGP works only if it is built using the same build environment as Thunderbird or SeaMonkey was built. This means that you can use the official Enigmail releases only if you use the official releases of Thunderbird or SeaMonkey provided by mozilla.org.

If you use a Thunderbird or SeaMonkey version coming from some other source (e.g. the provider of your Linux distribution), or if you built the application yourself, you should either use an Enigmail version built by the same source, or build Enigmail yourself. For building Enigmail, refer to the Source Code section on the Enigmail home page. Please don't file any bug report concerning this problem, it is not solvable.

Further help is available on the Enigmail Support Web Site.

enigmail-2.0.8/lang/bg/help/messenger.html000066400000000000000000000100131334302754500204260ustar00rootroot00000000000000 Enigmail Help: Message Reading

Enigmail Help

Using Enigmail when reading messages

Decrypt button in main Mail window
This button can be used for several purposes: decrypt, verify, or import public keys. Normally decryption/verification happens automatically, although this can be disabled through a preference. However, if this fails, usually a short error message will appear in the Enigmail status line. If you click the Decrypt button, you will be able to see a more detailed error message, including the output from the GnuPG command.
Pen and Key icons in Message Header display
The Pen and Key icons in the Message Header display indicate if the message you are reading was signed and/or encrypted and if the signature is good, i.e. the message has not been changed since it was signed. If the message has been changed, the Pen icon will change to a Broken Pen to indicate that the signature is bad. Right clicking on either the Pen or Key icons will bring up a menu with the following options:
  • OpenPGP Security info: allows you to view the output status from GnuPG for the message.
  • Copy OpenPGP Security info: copies the output status from GnuPG to the clipboard; to paste into a reply message, etc.
  • View OpenPGP Photo ID: allows you to view the Photo ID of the person who sent the message, if they have a photo embedded in their Public Key. (This option will only be enabled if a Photo ID exists in their key.)
  • S/MIME Security info: allows you to view the S/MIME Security Info for the message.

If you do not have keyserver-options auto-key-retrieve set in your gpg.conf file and you read a message which is signed or encrypted, you will see a Pen icon in the headers display area with a Question mark on it, the Enigmail status line in the headers area will say Part of the message signed; click pen icon for details and the message in the Message Pane will show all the OpenPGP message block indicators and the signature block.

You may also see this if you have keyserver-options auto-key-retrieve set in your gpg.conf file and the OpenPGP key is not available on the default keyserver.

Clicking on the Pen and Question mark icon will bring up a window advising that the key is unavailable in your keyring. Clicking on OK will bring up another window with a list of keyservers from which you can select to download the sender's public key from.

To configure the list of keyservers you wish to use, go to Enigmail -> Preferences -> Basic tab and enter the keyserver addresses in the Keyserver(s): box, separated by a comma. The first keyserver in the list will be used as the default.

Opening encrypted attachments / importing attached OpenPGP keys
Attachments named *.pgp, *.asc and *.gpg are recognized as attachments that can be handled specially by Enigmail. Right clicking on such an attachment enables two special menu items in the context menu: Decrypt and Open and Decrypt and Save. Use these two menu items if you want Enigmail to decrypt an attachment before opening or saving it. If an attachment is recognized as an OpenPGP key file, you are offered to import the keys it into your keyrings.

Further help is available on the Enigmail Help web page

enigmail-2.0.8/lang/bg/help/rulesEditor.html000066400000000000000000000057241334302754500207540ustar00rootroot00000000000000 Enigmail Help: Rules Editor

Enigmail Help

Using the Enigmail Rules Editor

In the Rules Editor, you can specify defaults per recipient for enabling encryption, signing and PGP/MIME, and to define what OpenPGP key(s) to use. Each rule consists of 5 fields and is represented on a single line:

Email
The e-mail(s) from the To:, Cc: and Bcc: fields to match. The matching works on substrings (Further details can be found in the Edit Rule dialog)
OpenPGP Key(s)
a list of OpenPGP Key ID's to use for the recipient
Sign
enable or disable message signing. This either uses or overrides what you have specified in the message composition window. The values are:
  • Never: disable signing, even if it was enabled in the message composition window (overrules the other values)
  • Possible: leave signing as specified in the message composition window
  • Always: enable signing, even if it was not enabled in the message composition window

These signing settings are applied for all rules that match. If one of the rules disables signing, the message will not be signed, regardless of other rules that specify Always.

Encrypt
enable or disable message encryption. The allowed settings and their meaning are the same as for message signing.
PGP/MIME
enable or disable the use of the PGP/MIME (RFC 3156) message encoding. If PGP/MIME is disabled, the messages are encoded using "inline PGP". The allowed values and their meaning a re the same as for message signing.

The rules are processed in the order displayed in the list. Whenever a rule matches a recipient and contains a OpenPGP Key ID, in addition to using the specified Key ID, the recipient is not considered anymore when processing further rules.

Note: The rule editor is not yet complete. It is possible to write some more advanced rules by directly editing the rules file (these rules should then not be edited anymore in the rule editor). Further information for directly editing the file is available on the Enigmail Homepage


Further help is available on the Enigmail Help web page

enigmail-2.0.8/lang/bg/help/sendingPrefs.html000066400000000000000000000047771334302754500211110ustar00rootroot00000000000000 Enigmail Help: Edit OpenPGP Rule

Enigmail Help

Defining Preferences to Send Encrypted

In the Sending Preferences you can choose the general model and preferences for encryption.

Convenient Encryption
With these settings, emails are encrypted without confirmation whenever possible.

This setup is appropriate, if you just want to improve your privacy by sending emails encyrpted instead of unencrypted if that's possible.

The effect is like sending emails as letters instead of postcards. Unlike postcards, letters usually hide their contents while in transit.

Note however that as with letters you can't be sure that nobody is opening the letter while it is in transit (although, some technical effort is necessary for that).

A concrete risk is that you accidentally use "faked keys" you got from somewhere or somebody claiming that the key belongs to the person you want to send emails to. To avoid this risk, you can either use the trust model of PGP (see below) or you should always verify, whether the fingerprint of a public key is correct.

Manual Encryption
This option allows you to specify the different preferences for encryption according to your needs. You can specify
  • whether replies to encrypted/signed emails should automatically also be encrypted/signed-
  • whether to use the trust model of OpenPGP to accept keys (this means that to use a key you either have to sign the key or have enough other people you trust having signed the key).
  • whether you want to automatically send emails encrypted if all keys are accepted.
  • whether and when you want to finally confirm sending an email.
If it is important for you that content you send encrypted can't be read by other people or organizations, you should use the manual preferences at least choose the option to accept keys only if you or other people signed them. While this model reduces the risk of using faked keys, it requires that you actively sign keys and declare owner trust using the key managament dialog. enigmail-2.0.8/lang/ca/000077500000000000000000000000001334302754500146205ustar00rootroot00000000000000enigmail-2.0.8/lang/ca/am-enigprefs.properties000066400000000000000000000001221334302754500213060ustar00rootroot00000000000000# Strings used in the Mozill AccountManager prefPanel-enigprefs=Seguretat OpenPGP enigmail-2.0.8/lang/ca/enigmail.dtd000066400000000000000000001426631334302754500171160ustar00rootroot00000000000000 Mozilla Public License 2.0."> ' per indicar les adreces de correu"> ' per indicar adreces de correu en el GnuPG. Desactiveu-ho si els destinataris tenen les antigues claus Hushmail."> NOTA: La generació de la clau pot trigar uns quants minuts en acabar. No sortiu del navegador mentre s'està generant la clau. La navegació activa o les operacions d'ús intensiu del disc dur durant la generació de la clau renovaran el 'pou d'atzar' i acceleraran el procés. Rebreu un avís quan acabi el procés de generació de la clau."> ' no és vàlid"> NOTA: La generació de la clau pot trigar uns minuts en acabar. No sortiu de l'aplicació mentre estigui en curs la generació de la clau. Us avisaré quan acabi la generació de la clau."> Nota: L'Enigmail sempre verificarà les signatures dels correus per cada compte o identitat, sense fer cas a si està habilitat o no."> Gràcies per emprar l'Enigmail."> enigmail-2.0.8/lang/ca/enigmail.properties000066400000000000000000001542201334302754500205270ustar00rootroot00000000000000Enigmail=Enigmail ##################################################################### # Strings used within enigmailCommon.js and enigmailCommon.jsm ##################################################################### enigAlert=Alerta de l'Enigmail enigConfirm=Confirmació de l'Enigmail # enigInfo=Enigmail Information enigError=Error de l'Enigmail enigPrompt=Pregunta de l'Enigmail dlgYes=&Sí dlgNo=&No dlgKeepSetting=Recorda la meva resposta i no tornis a preguntar-ho dlgNoPrompt=No tornis a mostrar aquest diàleg dlg.button.delete=&Esborra dlg.button.cancel=&Cancel·la dlg.button.close=Tan&ca dlg.button.continue=Con&tinua dlg.button.skip=&Omet # dlg.button.overwrite=&Overwrite dlg.button.view=&Visualitza # dlg.button.retry=&Retry # dlg.button.ignore=&Ignore # dlg.button.install=&Install # dlg.button.ok=&OK repeatPrefix=\n\nAquesta alerta es repetirà %S repeatSuffixSingular=altra vegada. repeatSuffixPlural=vegades més. noRepeat=\n\nAquesta alerta no es repetirà fins que actualitzeu l'Enigmail. pgpNotSupported=Sembla que s'està emprant l'Enigmail amb el PGP 6.x \n\nDesafortunadament, el PGP 6.x té una sèrie de problemes que impedeixen que l'Enigmail treballi correctament. Per tant, l'Enigmail no permet utilitzar el PGP 6.x; cal que canvieu a GnuPG (GPG) en el seu lloc.\n\nSi us cal ajuda per canviar al GnuPG, reviseu la secció d'ajuda de la pàgina web de l'Enigmail. # initErr.howToFixIt=In order to use Enigmail, GnuPG is required. If you did not install GnuPG yet, the easiest way to do this is using the "Setup Wizard" button below. # initErr.setupWizard.button=&Setup Wizard passphraseCleared=S'ha netejat la contrasenya. # cannotClearPassphrase=You are using a non-standard tool (such as gnome-keyring) for passphrase handling. Clearing the passphrase is therefore not possible from within Enigmail. noPhotoAvailable=No hi ha foto disponible debugLog.title=Registre de depuració de l'Enigmail error.photoPathNotReadable=La ubicació de la foto '%S' no es accessible # generalError=Error: %S # Strings in configure.jsm enigmailCommon.versionSignificantlyChanged=La nova versió de l'Enigmail conté canvis importants a la gestió de les preferències i opcions. S'ha intentat transferir la configuració antiga a la nova versió. No obstant això, no podem cobrir tots els casos automàticament. Comproveu dues vegades les preferències i opcions que han resultat. enigmailCommon.checkPreferences=Comproveu preferències... # preferences.defaultToPgpMime=We have changed the default message encoding in Enigmail from Inline-PGP to PGP/MIME. We recommend you keep this as default.\n\nIf you still wish to use Inline-PGP by default, you can do so in the Account Settings under OpenPGP Security. ##################################################################### # Strings in enigmailAbout.js ##################################################################### usingVersion=S'està executant la versió %S de l'Enigmail # enigmailPepVersion=Enigmail/p≡p version %S usingAgent=S'està emprant el %S i l'executable %S per xifrar i desxifrar agentError=ERROR: Ha fallat l'accés al servei Enigmail! ##################################################################### # Strings in enigmailKeygen.js ##################################################################### accessError=Error al accedir al servei Enigmail onlyGPG=La generació de la clau només funciona amb el GnuPG (no amb el PGP)! keygenComplete=Ha acabat la generació de la clau! S'emprarà la identitat <%S> per signar. revokeCertRecommended=Us recomano fermament que genereu un certificat de revocació de la vostra clau. Aquest certificat es pot emprar per invalidar la clau, quan, per exemple, la clau secreta es perd o queda compromesa. Voleu generar ara el certificat de revocació? keyMan.button.generateCert=&Genera el certificat genCompleteNoSign=Ha acabat la generació de la clau! genGoing=Ja s'està generant la clau! passNoMatch=La contrasenya introduïda no és correcta; torneu-la a introduir passCheckBox=Marqueu la caixa si no especifiqueu cap contrasenya per la clau passUserName=Indiqueu el nom d'usuari per aquesta identitat # keygen.missingUserName=There is no name specified for the selected account/identity. Please enter a value in the field "Your name" in the account settings. # keygen.passCharProblem=You are using special characters in your passphrase. Unfortunately, this can cause troubles for other applications. We recommend you choose a passphrase consisting only of any of these characters:\na-z A-Z 0-9 /.;:-,!?(){}[]%* passSpaceProblem=A causa de raons tècniques, la vostra contrasenya no pot començar amb un espai. changePassFailed=Ha fallat el canvi de contrasenya. keyConfirm=Genero les claus pública i privada per '%S'? keyMan.button.generateKey=&Genera la clau keyAbort=Cancel·lo la generació de la clau? keyMan.button.generateKeyAbort=&Interromp la generació de la clau keyMan.button.generateKeyContinue=&Continua la generació de la clau expiryTooLong=No podeu crear cap clau que caduqui més enllà dels 100 anys. expiryTooLongShorter=No podeu crear una clau que caduqui més enllà dels 90 anys. expiryTooShort=La vostra clau ha de ser vàlida com a mínim durant un dia. keyGenFailed=La generació de la clau ha fallat. Comproveu els detalls a la consola de l'Enigmail (menú Enigmail > Depuració de l'Enigmail). setKeyExpirationDateFailed=No s'ha canviat la data de caducitat # Strings in enigmailMessengerOverlay.js securityInfo=Informació de seguretat Enigmail\n\n enigHeader=Enigmail: enigContentNote=Enigmail: *Els fitxers adjunts a aquest missatge no s'han signat o xifrat*\n\n possiblyPgpMime=El missatge segurament s'ha xifrat o signat amb PGP/MIME; cliqueu el botó Desxifra per verificar-ho saveAttachmentHeader=Enigmail: Desa l'adjunt desxifrat noTempDir=No s'ha pogut trobar un directori temporal per escriure-hi. \nEstabliu la variable d'entorn TEMP attachmentPgpKey=L'adjunt '%S' que esteu obrint sembla ser un fitxer de clau OpenPGP. \n\nCliqueu «Importa» per a importar les claus que conté o «Visualitza» per a mostrar el contingut del fitxer a una finestra del navegador beginPgpPart=********* *INICI DE PART XIFRADA o SIGNADA* ******** endPgpPart=********** *FI DE PART XIFRADA o SIGNADA* ********** notePartEncrypted=Enigmail: *NO s'ha signat o xifrat parts del missatge* noteCutMessage=Enigmail: *S'han trobat múltiples blocs de missatge -- s'ha cancel·lat el desxifratge/verificació* decryptOkNoSig=Avís\n\nEl desxifratge ha reeixit, però la signatura no s'ha pogut verificar correctament msgOvl.button.contAnyway=&Continua igualment # signature.verifiedOK=The signature for attachment %S was successfully verified # signature.verifyFailed=The signature for attachment %S could not be verified # attachment.noMatchToSignature=Could not match attachment '%S' to a signature file # attachment.noMatchFromSignature=Could not match signature file '%S' to an attachment # fixBrokenExchangeMsg.failed=Did not succeed to repair message. # enigmail.msgViewColumn.label=Enigmail # enigmailPep.msgViewColumn.label=Enigmail/p≡p # wksNoIdentity=This key is not linked to any of your email accounts. Please add an account for at least one of the following email addresse(s):\n\n%S # wksConfirmSuccess=Confirmation email sent. # wksConfirmFailure=Sending the confirmation email failed. # autocrypt.importSetupKey.accountPreconfigured=Your account is already correctly configured for Autocrypt.\n\nDo you really want to overwrite your settings with this setup message? # autocrypt.importSetupKey.selfCreated=This message was created by your currently running instance of Enigmail.\n\nPlease switch to the email client to which you want to transfer the settings, and click on the message on that email client to import the settings. # autocrypt.importSetupKey.invalidMessage=Error - could not read setup message. The message seems to be corrupted. Please try to create a new setup message on your "other" device. # autocrypt.importSetupKey.invalidKey=Error - the key could not be imported. The key is either not supported by your version of GnuPG, or it got corrupted. # autocrypt.importSetupKey.wrongPasswd=The password you entered is wrong. Do you want to retry? # autocrypt.importSetupKey.success=The Autocrypt setup message was processed successfully. Autocrypt is now available for your account '%S'. ##################################################################### # Strings in enigmailMsgComposeOverlay.js ##################################################################### keysToExport=Seleccioneu les claus OpenPGP a inserir keysToUse=Seleccioneu les claus OpenPGP per emprar a %S pubKey=Clau pública per a %S\n windowLocked=La finestra del redactor està blocada; s'ha cancel·lat l'enviament sendUnencrypted=Ha fallat la inicialització de l'Enigmail.\nEnvio el missatge sense xifrar? composeSpecifyEmail=Indiqueu la vostra adreça de correu principal, que s'emprarà per triar la clau de signatura per als missatges de sortida.\n Si la deixeu en blanc, l'adreça DES DE (FROM) del missatge s'emprarà per triar la clau de signatura. sendingHiddenRcpt=Aquest missatge té destinataris Cco (còpia oculta). Si aquest missatge està xifrat, ès possible ocultar els destinataris però els usuaris d'alguns productes (p.ex. PGP Corp.) no podran desxifrar el missatge. Tenint en compte això, es recomana evitar els correus electrònics amb Cco amb missatges xifrats. sendWithHiddenBcc=Oculta els destinataris Cco sendWithShownBcc=Xifra normalment sendingNews=S'ha cancel·lat l'operació d'enviament xifrat.\n\nAquest missatge no es pot xifrar perquè hi ha destinataris de grups de notícies. Reenvieu aquest missatge sense xifrar. sendToNewsWarning=Avís: esteu a punt d'enviar un correu xifrat a un grup de notícies.\n\nAixò es desaprova perqué nomès tè sentit si tots els membres del grup poden desxifrar el missatge, ès a dir, cal xifrar el missatge amb les claus de tots els participants del grup. Envieu aquest missatge nomès si sabeu perfectament el qué esteu fent.\n\nContinuo? hasHTML=Avís de correu HTML:\nAquest missatge pot contenir HTML, que podria causar errades al signar/xifrar. Per a evitar això en el futur, heu de prémer la tecla MAJ (SHIFT) quan feu un clic al botó Redacta/Respon al enviar correu signat.\nSi signeu el correu per defecte, hauríeu de desmarcar la caixa de preferència 'Redacta missatges en HTML' per desactivar permanentment el correu HTML en aquest compte de correu. strippingHTML=El missatge té informació de format HTML que es perdrà quan es converteixi a text al signar/xifrar. Desitgeu continuar? msgCompose.button.sendAnyway=&Envia el missatge igualment attachWarning=Els adjunts d'aquest missatge no són locals, no es poden xifrar. Per a xifrar els adjunts, primer els heu de desar com a fitxers locals i adjuntar aquests fitxers. Voleu continuar igualment? quotedPrintableWarn=Heu activat la codificació «quoted-printable» per enviar els missatges. Això pot provocar un desxifratge o verificació incorrectes dels vostres missatges.\nVoleu desactivar ara l'enviament «quoted-printable» dels missatges? minimalLineWrapping=Heu establert l'ajustament de línia a %S caràcters. Per a un xifratge i/o signatura correctes, aquest valor ha de ser almenys 68.\nVoleu canviar ara l'ajust de línia a 68 caràcters? warning=Avís signIconClicked=Heu modificat manualment la signatura. Per tant, mentre redacteu el missatge, la (des)activació de la signatura no dependrà de la (des)activació del xifratge. # errorOwnKeyUnusable=The key ID '%S' configured for the current identity does not yield a usable OpenPGP key.\n\nPlease ensure that you have a valid, not expired OpenPGP key and that your account settings point to that key.\nIf your key is not expired, then check if you did set Owner trust to full or ultimate. # msgCompose.cannotSaveDraft=Error while saving draft # msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information - partially encrypted email. # msgCompose.partiallyEncrypted.mimeMsg=The message you are replying to contained both unencrypted and encrypted parts. Some encrypted message parts are invisible to you.\n\nIf the sender was not able to decrypt the hidden message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nWe recommend that you don't reply to the message, but create a new message containing your answer. # msgCompose.partiallyEncrypted.inlinePGP=The message you are replying to contained both unencrypted and encrypted parts. If the sender was not able to decrypt some message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nPlease consider removing all quoted text from your reply to this sender. # msgCompose.internalEncryptionError=Internal Error: promised encryption disabled # msgCompose.internalError=An internal error has occurred. # msgCompose.toolbarTxt.signAndEncrypt=This message will be signed and encrypted # msgCompose.toolbarTxt.signOnly=This message will be signed # msgCompose.toolbarTxt.encryptOnly=This message will be encrypted # msgCompose.toolbarTxt.noEncryption=This message will be unsigned and unencrypted # msgCompose.toolbarTxt.disabled=Enigmail is disabled for the selected identity # msgCompose.protectSubject.tooltip=Protect the message subject # msgCompose.noSubjectProtection.tooltip=Do not protect the message subject # msgCompose.encryptedSubjectStub=Encrypted Message # msgCompose.protectSubject.dialogTitle=Enable Protection of Subject? # msgCompose.protectSubject.question=Regular encrypted emails contain the unredacted subject.\n\nWe have established a standard to hide the original subject in the encrypted message\nand replace it with a dummy text, such that the subject is only visible after the email is decrypted.\n\nDo you want to protect the subject in encrypted messages? # msgCompose.protectSubject.yesButton=&Protect subject # msgCompose.protectSubject.noButton=&Leave subject unprotected # msgCompose.detailsButton.label=Details ... # msgCompose.detailsButton.accessKey=D # msgCompose.pepSendUnknown=Unknown # msgCompose.pepSendUnsecure=Unsecure # msgCompose.pepSendSecure=Secure # msgCompose.pepSendTrusted=Secure & Trusted # pep.alert.disabledForIdentity=p≡p is disabled for the current identity. Please enable p≡p via the Enigmail/p≡p preferences. # pep.alert.weakReply=You’re about to forward or reply to a secure message as insecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? # note: should end with double newline: sendAborted=S'ha cancel·lat l'operació d'enviament.\n\n # details: # keyNotTrusted=Not enough trust for key '%S' # keyNotFound=Key '%S' not found # keyRevoked=Key '%S' revoked # keyExpired=Key '%S' expired statPGPMIME=PGP/MIME # statSMIME=S/MIME statSigned=SIGNAT statEncrypted=XIFRAT statPlain=SENSE SIGNAR i SENSE XIFRAR offlineSave=Deso el missatge %S a %S a la carpeta de Missatges per enviar? onlineSend=Envio el missatge %S a %S? encryptKeysNote=Nota: el missatge està xifrat amb la següent identificació d'usuari / clau: %S # hiddenKey= signFailed=Error a l'Enigmail; ha fallat la xifra/signatura; envio el missatge sense xifrar? msgCompose.button.sendUnencrypted=&Envia el missatge sense xifrar recipientsSelectionHdr=Seleccioneu els destinataris per xifrar configureNow=Encara no heu configurat la seguretat Enigmail per la identitat seleccionada. Voleu fer-ho ara? # encryption/signing status and associated reasons: # encryptMessageAuto=Encrypt Message (auto) # encryptMessageNorm=Encrypt Message # signMessageAuto=Sign Message (auto) # signMessageNorm=Sign Message # encryptOff=Encryption: OFF # encryptOnWithReason=Encryption: ON (%S) # encryptOffWithReason=Encryption: OFF (%S) # encryptOn=Encryption: ON # signOn=Signing: ON # signOff=Signing: OFF # signOnWithReason=Signing: ON (%S) # signOffWithReason=Signing: OFF (%S) # reasonEnabledByDefault=enabled by default # reasonManuallyForced=manually forced # reasonByRecipientRules=forced by recipient rules # reasonByAutoEncryption=forced by auto encryption # reasonByConflict=due to conflict in recipient rules # reasonByEncryptionMode=due to encryption mode # should not be used anymore: encryptYes=El missatge es xifrarà encryptNo=El missatge no es xifrarà # should not be used anymore: signYes=El missatge es signarà signNo=El missatge no es signarà # PGP/MIME status: # pgpmimeNormal=Protocol: PGP/MIME # inlinePGPNormal=Protocol: Inline PGP # smimeNormal=Protocol: S/MIME # pgpmimeAuto=Protocol: PGP/MIME (auto) # inlinePGPAuto=Protocol: Inline PGP (auto) # smimeAuto=Protocol: S/MIME (auto) # should not be used anymore pgpmimeYes=S'usarà PGP/MIME pgpmimeNo=S'usarà PGP integrat. # Attach own key status (tooltip strings): # attachOwnKeyNo=Your own key will not be attached # attachOwnKeyYes=Your own key will be attached # attachOwnKeyDisabled=Your own key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. rulesConflict=S'ha detectat un conflicte a les regles per destinatari\n%S\n\nEnvio el missatge amb aquests paràmetres? msgCompose.button.configure=&Configura msgCompose.button.send=&Envia el missatge msgCompose.button.save=&Desa el missatge # Strings in enigmailMsgHdrViewOverlay.js keyNeeded=Cal la clau pública %S per verificar la signatura # keyUsed=Public key %S used to verify signature clickDecrypt=; feu un clic al botó Desxifra clickDecryptRetry=; feu un clic al botó Desxifra per reintentar # clickDetailsButton=; click on 'Details' button for more information # clickImportButton=; click on the 'Import Key' button to import the key # keyTypeUnsupported=; the key type is not supported by your version of GnuPG msgPart=Part del missatge %S msgSigned=signat # msgSignedUnkownKey=signed with unknown key msgEncrypted=xifrat msgSignedAndEnc=signat i xifrat unverifiedSig=Signatura no verificada incompleteDecrypt=Desxifratge incomplet needKey=Error - cal la clau secreta per desxifrar el missatge failedDecrypt=Error - ha fallat el desxifratge badPhrase=Error - contrasenya incorrecta failedDecryptVerify=Error - ha fallat el desxifratge/verificació mdcError=Error - el missatge no tenia protecció d'integritat viewInfo=; Visualitza > Informació de seguretat del missatge per als detalls decryptedMsg=Missatge desxifrat # decryptedMsgWithFormatError=Decrypted message (restored broken PGP email format probably caused by an old Exchange server, so that the result might not be perfect to read) # usedAlgorithms=Used Algorithms: %1$S and %2$S # pepStatusInfo.text=p≡p Message Status. # pepStatusInfo.title.m3=Under Attack # pepStatusInfo.info.m3=This message is not secure and has been tampered with. # pepStatusInfo.title.m1=Mistrusted # pepStatusInfo.info.m1=This message has a communication partner that has previously been marked as mistrusted # pepStatusInfo.title.r0=Unknown # pepStatusInfo.info.r0=This message does not contain enough information to determine if it is secure. # pepStatusInfo.title.r1=Cannot Decrypt # pepStatusInfo.info.r1=This message cannot be decrypted because the key is not available. # pepStatusInfo.title.r2=Cannot Decrypt # pepStatusInfo.info.r2=This message cannot be decrypted because the key is not available. # pepStatusInfo.title.r3=Unsecure # pepStatusInfo.info.r3=This message is unsecure. # pepStatusInfo.title.r4=Unsecure for Some # pepStatusInfo.info.r4=This message is unsecure for some communication partners. # pepStatusInfo.title.r5=Unreliable Security # pepStatusInfo.info.r5=This message has unreliable protection. # pepStatusInfo.title.r6=Secure... # pepStatusInfo.info.r6=This message is secure but you still need to verify the identity of your communication partner. # pepStatusInfo.title.r7=Secure & Trusted # pepStatusInfo.info.r7=This message is secure and trusted. # pepStatusInfo.color.green=Green # pepStatusInfo.color.yellow=Yellow # pepStatusInfo.color.red=Red # pepRevokeTrust.question=Do you really want to cancel the trust for %S? # pepRevokeMistrust.question=Do you really want to re-trust the key for %S? # pepRevokeTrust.doRevoke=Cancel &trust # wksConfirmationReq=Web Key Directory Confirmation Request # wksConfirmationReq.message=This message has been sent by your email provider to confirm deployment of your OpenPGP public key\nin their Web Key Directory.\nProviding your public key helps others to discover your key and thus being able to encrypt messages to you.\n\nIf you want to deploy your key in the Web Key Directory now, please click on the button "Confirm Request" in the status bar.\nOtherwise, simply ignore this message. # wksConfirmationReq.button.label=Confirm Request # autocryptSetupReq=Perform Autocrypt Setup # autocryptSetupReq.button.label=Start Setup # autocryptSetupReq.setupMsg.desc=This message contains all information to transfer your Autocrypt settings along with your secret key securely from your original device. # autocryptSetupReq.setupMsg.backup=You can keep this message and use it as a backup for your secret key. If you want to do this, you should write down the password and store it securely. # autocryptSetupReq.message.import=To import the settings and key(s) in Enigmail, please click on the "Start Setup" button in the status bar. # autocryptSetupReq.message.sent=Please click on the message on your new device and follow the instuctions to import the settings. # strings in pref-enigmail.js # oldGpgVersion20=Enigmail initialization failed.\n\nYou are using GnuPG version %1$S, which is not supported anymore. Enigmail requires GnuPG version %2$S or newer. Please upgrade your GnuPG installation, or Enigmail will not work. locateGpg=Localitza el programa GnuPG invalidGpgPath=El GnuPG no es pot executar amb el camí indicat. Per tant, l'Enigmail queda desactivat fins que torneu a canviar el camí al GnuPG o fins que reinicieu l'aplicació. warningsAreReset=S'han reiniciat tots els avisos. prefs.gpgFound=S'ha trobat el GnuPG a %S prefs.gpgNotFound=No s'ha pogut trobar el GnuPG prefs.warnAskNever=Avís: l'activació d'aquesta opció provocarà, sense mès informació, que els correus no es xifrin si no hi ha la clau per algun dels destinataris -- Si això passa, l'Enigmail no us informarà! # prefs.warnIdleTimeForUnknownAgent=Cannot connect to gpg-agent. Maybe your system uses a specialized tool for passphrase handling (e.g. gnome-keyring, seahorse-agent, KDE wallet manager, ...). Unfortunately Enigmail cannot control the passphrase timeout for the tool you are using. Therefore the respective timeout settings in Enigmail are disregarded. prefEnigmail.oneKeyserverOnly=Error - nomès podeu indicar un servidor de claus per a la baixada automàtica de claus OpenPGP que manquin. # Strings used in core.jsm # (said file also re-uses some strings from above) enterAdminPin=Introduïu el PIN d'administració de la targeta intel·ligent enterCardPin=Introduïu el PIN de la targeta intel·ligent notInit=Error - el servei Enigmail encara no s'ha iniciat badCommand=Error - ha fallat l'ordre de xifrar cmdLine=línia d'ordres i sortida: notRequired=Error - no s'ha demanat xifrar notComplete=Error - la generació de la clau encara no ha acabat invalidEmail=Error - adreça de correu no vàlida noPassphrase=Error - no s'ha facilitat la contrasenya noPGPblock=Error - no s'ha trobat cap bloc cuirassat amb dades OpenPGP unverifiedReply=La part indentada del missatge (resposta) ha estat probablement modificada # keyInMessageBody=Key in message body found. Click 'Import Key' to import the key sigMismatch=Error - la signatura no coincideix cantImport=Error en importar la clau pública\n\n # doImportOne=Import %1$S (%2$S)? # doImportMultiple=Import the following keys?\n\n%S # previewFailed=Can't read public key file. # Strings used in errorHandling.jsm sc.wrongCardAvailable=La targeta intel·ligent %S trobada al lector no es pot utilitzar per a processar el missatge.\nSi us plau, inseriu la vostra targeta intel·ligent %S i repetiu l'operació. sc.insertCard=L'operació requereix la vostra targeta intel·ligent %S.\nSi us plau, inseriu la targeta intel·ligent requerida i repetiu l'operació. sc.removeCard=L'operació requereix que no hi hagi cap targeta intel·ligent en el lector.\nSi us plau, retireu la targeta intel·ligent i repetiu l'operació. sc.noCardAvailable=No hi ha cap targeta intel·ligent al lector\nInseriu la vostra targeta intel·ligent i repetiu l'operació. sc.noReaderAvailable=No s'ha pogut accedir a la targeta intel·ligent\nConnecteu el lector de targetes intel·ligents, inseriu la vostra targeta, i repetiu l'operació. # keyError.keySpecNotFound=The email address "%S" cannot be matched to a key on your keyring. # keyError.keyIdNotFound=The configured key ID "%S" cannot be found on your keyring. # keyError.resolutionAction=Please select a valid key in the OpenPGP section of your Account Settings. # missingPassphrase=Missing passphrase # errorHandling.gpgAgentInvalid=Your system is running a version of gpg-agent that is not suitable for your GnuPG version. # errorHandling.gpgAgentError=GnuPG reported an error in the communication with gpg-agent (a component of GnuPG). # errorHandling.dirmngrError=GnuPG reported an error in the communication with dirmngr (a component of GnuPG). # errorHandling.pinentryError=GnuPG cannot query your passphrase via pinentry. # errorHandling.readFaq=This is a system setup or configuration error that prevents Enigmail from working properly and cannot be fixed automatically.\n\nWe strongly recommend that you consult our support web site at https://enigmail.net/faq. gpgNotFound=No s'ha pogut trobar el programa GnuPG '%S'.\nComproveu que s'ha indicat el camí correcte a l'executable GnuPG a les Preferències de l'Enigmail. gpgNotInPath=No s'ha pogut trobar l'executable GnuPG en el PATH.\nComproveu que s'ha especificat correctament el camí a l'executable GnuPG a les Preferències de l'Enigmail. # enigmailNotAvailable=Enigmail core Service not available prefGood=Signatura correcta de %S prefBad=Signatura INCORRECTA de %S failCancel=Error - L'usuari ha cancel·lat la recepció de la clau failNoServer=Error - No s'ha especificat cap servidor de claus per rebre la clau failNoID=Error - No s'ha especificat cap identificador de clau per rebre-la failKeyExtract=Error - ha fallat l'ordre d'extracció de la clau notFirstBlock=Error - El primer bloc OpenPGP no és un bloc de clau pública importKeyConfirm=Importo la clau/s pública incrustada al missatge? failKeyImport=Error - ha fallat la importació de la clau fileWriteFailed=Ha fallat l'escriptura al fitxer %S importKey=Importo la clau pública %S del servidor de claus: uploadKey=Envia la clau pública %S al servidor de claus: keyId=Identificador de clau keyAndSigDate=Identificació de clau: 0x%S / Signada el: %S keyFpr=Empremta digital de la clau: %S noEmailProvided=No heu indicat cap adreça de correu! keyAlreadySigned=La clau ja està signada, no la podeu signar dues vegades. ##################################################################### # Strings used in enigmailKeySelection.js ##################################################################### selKeyExpired=%S caducada createdHeader=Creada atLeastOneKey=No s'ha seleccionat cap clau! Heu de triar una clau com a mínim per acceptar aquest diàleg fewerKeysThanRecipients=Heu seleccionat un nombre mès petit de de claus que de destinataris. Esteu segur que la llista de clau a xifrar ès completa? userSel.button.goBack=Seleccioneu mès claus userSel.secretKeySel.title=Selecció d'una clau OpenPGP secreta per a signar els vostres missatges # userSel.problemNoKey=No valid key # userSel.problemMultipleKeys=Multiple keys # should be same as thunderbird ENTITY sendLaterCmd.label: sendLaterCmd.label=Envieu més tard # Strings used in enigmailAttachmentDialog.js # pgpMimeNote=NOTE: PGP/MIME is not supported by all email clients. If you are unsure, select the %S option. first=primera second=segona # Strings used in am-enigprefs.js / enigmailEditIdentity.js encryptKeyHeader=Seleccioneu una clau OpenPGP per xifrar identityName=Identitat: %S # switchPepMode=You are currently using the 'p≡p Junior' mode of Enigmail.\n\nBy enabling OpenPGP or S/MIME for an account, you are disabling p≡p and use the 'regular' mode of Enigmail without p≡p. # enableEnigmail=&Disable p≡p # Strings used in enigmailSingleRcptSettings.js noEncryption=Heu activat l'opció de xifrar, però no heu seleccionat cap clau. Per a enviar correus xifrats a %S us cal indicar una o més claus vàlides de la vostra llista de claus. Voleu desactivar el xifratge per a %S? noKeyToUse=(cap - sense xifrar) noEmptyRule=La regla no pot estar buida! Indiqueu una adreça de correu al camp regla. invalidAddress=L'adreça de correu que heu indicat no és vàlida. No heu d'indicar els noms dels destinataris, només les adreces de correu. Per exemple: \nNo vàlid: Un nom \nVàlid: un.nom@adreça.net # noCurlyBrackets=The curly brackets {} have a special meaning and should not be used in an email address. If you want to modify the matching behavior for this rule, use the 'Apply rule if recipient ...' option.\nMore information is available from the Help button. # Strings used in enigmailRulesEditor.js never=Mai always=Sempre possible=Possible deleteRule=Voleu suprimir la regla seleccionada? nextRcpt=(destinatari següent) negateRule=No # addKeyToRule=Add key %1$S (%2$S) to per-recipient rule # Strings used in enigmailSearchKey.js needOnline=La funció que heu seleccionat no és disponible en mode fora de línia. Connecteu-vos i torneu a provar. protocolNotSupported=El protocol '%S://' que heu seleccionat no és permés per a descarregar claus OpenPGP. gpgkeysDisabled=Us pot ajudar l'activació de l'opció 'extensions.enigmail.useGpgKeysTool'. noKeyserverConn=No es pot connectar al servidor de claus %S. keyDownloadFailed=Ha fallat la descàrrega de la clau del servidor de claus. El missatge d'estat és:\n%S internalError=Hi ha hagut un error intern. Les claus no s'han pogut descarregar o importar. noKeyFound=Ho sento, no s'ha trobat cap clau que coincideixi amb el criteri de recerca indicat.\nTingueu en compte que els identificadors de clau han d'estar prefixats amb \\"0x\\" (p.ex. 0xABCDEF12). # keyDownload.keyUnavailable=We are sorry, but the key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their key by email. # gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. gpgKeysFailed=Ha fallat la recerca o la descàrrega de la clau del servidor de claus: no s'ha pogut executar gpgkeys_%S. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Ha fallat l'assignació de la confiança del propietari # Strings in enigmailSignKeyDlg.js signKeyFailed=Ha fallat la signatura de la clau alreadySigned.label=Nota: la clau %S ja està signada amb la clau secreta seleccionada. # alreadySignedexportable.label=Note: the key %S is already signed exportable with the selected secret key. A local signature does not make sense. # partlySigned.label=Note: some user IDs of key %S are already signed with the selected secret key. # noTrustedOwnKeys=No eligible key found for signing! You need at least one fully trusted secret key in order to sign keys. # Strings in enigmailKeyManager.js keyMan.loadingKeys=Loading keys, please wait ... keyValid.unknown=desconeguda keyValid.invalid=invàlida keyValid.disabled=deshabilitada keyValid.revoked=revocada keyValid.expired=caducada keyValid.noSubkey=no hi ha una subclau vàlida keyTrust.untrusted=no confiable keyTrust.marginal=marginal keyTrust.full=confiable keyTrust.ultimate=definitiva keyTrust.group=(grup) keyType.public=pub keyType.publicAndSec=pub/sec keyMan.enableKey=Activa la clau keyMan.disableKey=Desactiva la clau userAtt.photo=Atribut d'usuari (imatge JPEG) asciiArmorFile=Fitxers cuirassats ASCII (*.asc) importKeyFile=Importa un fitxer de claus OpenPGP gnupgFile=Fitxers GnuPG # createKeyOK=Your Key has been generated saveRevokeCertAs=Crea i desa el certificat de revocació # revokeCertOK=The revocation certificate has been successfully created. You can use it to invalidate your public key, e.g. in case you would lose your secret key. revokeCertFailed=No s'ha pogut crear el certificat de revocació. addUidOK=L'identificador d'usuari s'ha afegit amb èxit addUidFailed=Ha fallat al afegir l'identificador d'usuari noKeySelected=Heu de seleccionar com a mínim una clau per tal de realitzar l'operació indicada exportToFile=Exporta la clau pública a un fitxer # exportKeypairToFile=Export Secret and Public Key To File exportSecretKey=Voleu incloure la clau secreta en el fitxer de clau OpenPGP desat? saveKeysOK=Les claus s'han desat amb èxit saveKeysFailed=Ha estat impossible desar les claus importKeysFailed=Ha fallat la importació de les claus enableKeyFailed=Ha fallat l'habilitació/deshabilitació de les claus specificPubKeyFilename=%S (0x%S) pub specificPubSecKeyFilename=%S (0x%S) pub-sec defaultPubKeyFilename=Claus-públiques-exportades defaultPubSecKeyFilename=Claus-públiques-i-secretes-exportades noSecretKeys=No s'ha trobat cap clau secreta.\n\nVoleu generar ara la vostra propia clau? sendKeysOk=La clau/s s'ha enviat amb èxit sendKeysFailed=Ha fallat l'enviament de les claus receiveKeysOk=La clau/s s'ha actualitzat amb èxit receiveKeysFailed=Ha fallat la baixada de les claus importFromClip=Voleu importar alguna clau/s del porta-retalls? # importFromUrl=Download public key from this URL: copyToClipbrdFailed=No s'han pogut copiar la clau/s seleccionada al porta-retalls. copyToClipbrdOK=La clau/s s'ha copiat al porta-retalls deleteSecretKey=AVÃS: Esteu a punt de suprimir una clau secreta!\nSi esborreu la vostra clau secreta, ja no podreu desxifrar els missatges xifrats amb aquesta clau. \n\nSegur que voleu suprimir les dues, la clau secreta i la clau pública \n'%S'? deleteMix=AVÃS: Esteu a punt de suprimir claus secretes!\nSi esborreu la vostra clau secreta, mai més podreu desxifrar cap missatge xifrat amb aquest clau. \n\nSegur que voleu suprimir ambdues claus seleccionades, la secreta i la pública? deletePubKey=Voleu suprimir la clau pública\n'%S'? deleteSelectedPubKey=Voleu suprimir les claus públiques? deleteKeyFailed=La clau no s'ha pogut suprimir. # revokeKeyQuestion=You are about to revoke the key '%S'.\n\nYou will no longer be able to sign with this key, and once distributed, others will no longer be able to encrypt with that key. You can still use the key to decrypt old messages.\n\nDo you want to proceed? revokeKeyOk=S'ha revocat la clau. Si la vostra clau estava en un servidor de claus, es recomena que la torneu a pujar, de manera que els altres puguin veure la revocació. revokeKeyFailed=No s'ha pogut revocar la clau. # revokeKeyNotPresent=You have no key (0x%S) which fits to this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before the revocation certificate! # revokeKeyAlreadyRevoked=The key 0x%S has already been revoked. refreshAllQuestion=No heu seleccionat cap clau. Voleu refrescar TOTES les claus? # refreshKeyServiceOn.warn=Warning: Your keys are currently being refreshed in the background as safely as possible.\nRefreshing all your keys at once will unnecessarily reveal information about you.\nDo you really want to do this? refreshKey.warn=Avís: segons el nombre de claus i la velocitat de connexió, el refresc de totes les claus pot ser un procés bastant llarg! # downloadContactsKeys.warn=Warning: depending on the number of contacts and the connection speed, downloading all keys could be quite a lengthy process! # downloadContactsKeys.importFrom=Import contacts from address book '%S'? keyMan.button.exportSecKey=&Exporta les claus secretes keyMan.button.exportPubKey=Exporta només les claus &públiques keyMan.button.import=&Importa keyMan.button.refreshAll=&Refresca totes les claus keyMan.button.revokeKey=&Revoca una clau # keyMan.button.skip=&Skip Key keylist.noOtherUids=No tè altres identitats keylist.hasOtherUids=Tambè conegut com a keylist.noPhotos=Sense fotografies disponibles keylist.hasPhotos=Fotografies keyMan.addphoto.filepicker.title=Seleccione una foto per afegir # keyMan.addphoto.warnLargeFile=The file you have chosen is larger than 25 kB.\nIt is not recommended to add very large files because the keys get very large by this. # keyMan.addphoto.noJpegFile=The selected file does not appear to be a JPEG file. Please choose a different file. keyMan.addphoto.failed=No s'afegit la foto. # noWksIdentity=The key %S does not have a WKS identity. # keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key "%1$S (%2$S)" for encrypting messages? # keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key "%1$S (%2$S)" for future messages? # keyman.addBlacklistKey.button=&Blacklist the key # keyman.removeBlacklistKey.button=&Remove key from Blacklist # Strings in enigmailManageUidDlg.xul changePrimUidFailed=Ha fallat en canviar l'identificador primari d'usuari changePrimUidOK=S'ha canviat l'identificador primari d'usuari amb èxit revokeUidFailed=Ha fallat la revocació de l'identificador d'usuari %S revokeUidOK=L'identificador d'usuari %S s'ha revocat amb èxit. Si la vostra clau estava en un servidor de claus, es recomena que la torneu a pujar, de manera que els altres puguin veure la revocació. revokeUidQuestion=Segur que voleu revocar l'identificador d'usuari %S? # Strings in enigmailKeyImportInfo.xul # importInfoTitle=SUCCESS! Keys imported # importInfoBits=Bits # importInfoCreated=Created # importInfoFpr=Fingerprint # importInfoDetails=(Details) # importInfoNoKeys=No keys imported. # Strings in enigmailKeyDetailsDlg.xul keyTypePublic=clau pública keyTypePrimary=clau primària keyTypeSubkey=subclau keyTypePair=parella de claus keyExpiryNever=mai keyAlgorithm_1=RSA keyAlgorithm_2=RSA keyAlgorithm_3=RSA keyAlgorithm_16=ELG keyAlgorithm_17=DSA # keyAlgorithm_18=ECDH # keyAlgorithm_19=ECDSA keyAlgorithm_20=ELG # keyAlgorithm_22=EDDSA keyUsageEncrypt=Xifra keyUsageSign=Signa keyUsageCertify=Certifica keyUsageAuthentication=Autentifica # keyDoesNotExpire=Key does not expire # Strings in enigmailGenCardKey.xul keygen.started=Espereu mentre s'està generant la clau ... keygen.completed=S'ha generat la clau. El nou identificador de clau és: 0x%S keygen.keyBackup=S'ha fet una còpia de seguretat de la clau a %S keygen.passRequired=Indiqueu una contrasenya si voleu crear una còpia de seguretat de la vostra clau fora de la targeta intel·ligent. # Strings in enigmailSetCardPin.xul cardPin.processFailed=El canvi de PIN ha fallat # Strings in enigRetrieveProgres.xul keyserverProgress.refreshing=S'està refrescant les claus, espereu si us plau ... keyserverProgress.uploading=S'està penjant les claus, espereu, si us plau ... # keyserverProgress.wksUploadFailed=Could not upload your key to the Web Key Service # keyserverProgress.wksUploadCompleted=Your public key was successfully submitted to your provider. You will receive an email to confirm that you initiated the upload. keyserverTitle.refreshing=Refresca les claus keyserverTitle.uploading=Penja les claus # Strings in enigmailSetupWizard passphrase.min8keys=La vostra contrasenya hauria de tenir 8 caràcters com a mínim! setupWizard.reallyCancel=Esteu segur que voleu tancar l'auxiliar de configuració de l'Enigmail? # setupWizard.invalidGpg=The file you specified is not a GnuPG executable. Please specify a different file. # setupWizard.specifyFile=You need to at least specify a public key file in order to proceed. # setupWizard.installFailed=It seems that the installation was not successful. Please either retry the installation, or install GnuPG manually and locate it using the Browse button. # setupWizard.downloadForbidden=For your own security, we will not download GnuPG. Please visit https://gnupg.org/ in order to download GnuPG. # setupWizard.downloadImpossible=We cannot download GnuPG currently. Please try later or visit https://gnupg.org/ in order to download GnuPG. # setupWizard.hashSumError=The wizard could not verify the integrity of the downloaded file. The file may be broken or manipulated. Do you want to continue the installation anyway? # setupWizard.importSettingsFile=Specify backup file to load from # setupWizard.invalidSettingsFile=The specified file is not a correct Enigmail Settings backup file. # setupWizard.gpgConfExists=The GnuPG config file already exists. Do you want to overwrite it with the one from your old installation? # setupWizard.noGpgHomeDir=It appears that you configured %S to use for GnuPG. However, this is not a directory - you cannot use it. # setupWizard.unmachtedIds=The following identities of your old setup could not be matched:\n%S\nThe settings for these identities were skipped. # Strings in installGnuPG.jsm # installGnuPG.downloadFailed=An error occurred while trying to download GnuPG. Please check the console log for further details. # installGnuPG.installFailed=An error occurred while installing GnuPG. Please check the console log for further details. # Strings in enigmailAddUidDlg.xul addUidDlg.nameOrEmailError=Heu d'omplir amb un nom i una adreça de correu addUidDlg.nameMinLengthError=El nom ha de tenir 5 caràcters com a mínim addUidDlg.invalidEmailError=Heu d'indicar una adreça de correu vàlida # Strings in enigmailCardDetails.js # Carddetails.NoASCII=OpenPGP Smartcards only support ASCII characters in Firstname/Name. # network error types # errorType.SecurityCertificate=The security certificate presented by the web service is not valid. # errorType.SecurityProtocol=The security protocol used by the web service is unknown. # errorType.Network=A network error has occurred. # filter stuff # filter.folderRequired=You must select a target folder. # filter.decryptMove.label=Decrypt permanently (Enigmail) # filter.decryptCopy.label=Create decrypted Copy (Enigmail) # filter.decryptMove.warnExperimental=Warning - the filter action "Decrypt permanently" may lead to destroyed messages.\n\nWe strongly recommend that you first try the "Create decrypted Copy" filter, test the result carefully, and only start using this filter once you are satisified with the result. # filter.tempPepFilterDesc=Temporary filter to store sent message unencrypted # filter.term.pgpencrypted.label=OpenPGP Encrypted # filter.encrypt.label=Encrypt to key (Enigmail) # filter.keyRequired=You must select a recipient key. # filter.keyNotFound=Could not find an encryption key for "%S". # filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for "%S" you will no longer be able to read the emails. # strings in enigmailConvert.jsm # converter.decryptBody.failed=Could not decrypt message with subject\n"%S".\nDo you want to retry with a different passphrase or do you want to skip the message? # converter.decryptAtt.failed=Could not decrypt attachment "%1$S"\nof message with subject\n"%2$S".\nDo you want to retry with a different passphrase or do you want to skip the message? # saveLogFile.title=Save Log File # strings in gpg.jsm # unknownSigningAlg=Unknown signing algorithm (ID: %S) # unknownHashAlg=Unknown cryptographic hash (ID: %S) # strings in keyRing.jsm # keyring.photo=Photo # keyRing.pubKeyRevoked=The key %1$S (key ID %2$S) is revoked. # keyRing.pubKeyExpired=The key %1$S (key ID %2$S) has expired. # keyRing.pubKeyNotForSigning=The key %1$S (key ID %2$S) cannot be used for signing. # keyRing.pubKeyNotForEncryption=The key %1$S (key ID %2$S) cannot be used for encryption. # keyRing.keyDisabled=The key %1$S (key ID %2$S) is disabled; it cannot be used. # keyRing.keyNotTrusted=The key %1$S (key ID %2$S) is not trusted enough. Please set the trust level of your key to "ultimate" to use it for signing. # keyRing.keyInvalid=The key %1$S (key ID %2$S) is not valid. Please consider verifying it correctly. Alternatively use the Default encryption settings in the Enigmail preferences dialog. # keyRing.signSubKeysRevoked=All signing-subkeys of key %1$S (key ID %2$S) are revoked. # keyRing.signSubKeysExpired=All signing-subkeys of key %1$S (key ID %2$S) have expired. # keyRing.signSubKeysUnusable=All signing-subkeys of key %1$S (key ID %2$S) are revoked, expired or otherwise unusable. # keyRing.encSubKeysRevoked=All encryption subkeys of key %1$S (key ID %2$S) are revoked. # keyRing.encSubKeysExpired=All encryption subkeys of key %1$S (key ID %2$S) have expired. # keyRing.noSecretKey=You do not seem to have the secret key for %1$S (key ID %2$S) on your keyring; you cannot use the key for signing. # keyRing.encSubKeysUnusable=All encryption subkeys of key %1$S (key ID %2$S) are revoked, expired or otherwise unusable. #strings in exportSettingsWizard.js # cannotWriteToFile=Cannot save to file '%S'. Please select a different file. # dataExportError=An error occurred during exporting your data. # enigmailSettings=EnigmailSettings # defaultBackupFileName=Enigmail-export # specifyExportFile=Specify file name for exporting # homedirParamNotSUpported=Additional params that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. #strings in expiry.jsm # expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use the new key. # expiry.keysExpireSoon=The following of your keys will expire in less than %1$S days:\n%2$S We recommend that you create new keys and configure your accounts to use the new keys. # expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to ultimate in key properties. # expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to ultimate in key properties. # expiry.OpenKeyManager=Open Enigmail Key Management # expiry.OpenKeyProperties=Open Key Properties #strings in pEpDecrypt.jsm # pEpDecrypt.cannotDecrypt=This is an encrypted message. Unfortunately you don't have the secret key to decrypt the message. #strings in gpgAgent.jsm # gpghomedir.notexists=The directory '%S' containing your OpenPGP keys does not exist and cannot be created. # gpghomedir.notwritable=The directory '%S' containing your OpenPGP keys is not writable. # gpghomedir.notdirectory=The directory '%S' containing your OpenPGP keys is a file instead of a directory. # gpghomedir.notusable=Please fix the directory permissions or change the location of your GnuPG "home" directory. GnuPG cannot work correctly otherwise. #strings in pepTrustWords.js # pepTrustWords.cannotVerifyOwnId=Cannot verify p≡p Trustwords for own account. # pepTrustWords.cannotFindKey=Cannot find key for %S. # pepTrustWords.cannotStoreChange=Could not change trust for %S. # pepTrustWords.generalFailure=Cannot obtain trustwords for %S. # pepTrustWords.partnerFingerprint=Fingerprint for %S: #strings in mimeWkdHandler.jsm # wkdMessage.body.req=Your email provider processed your request to upload your public key to the OpenPGP Web Key Directory.\n\nPlease click the confirmation button in the Enigmail header to complete the publishing of your public key. # wkdMessage.body.process=This is an email related to the automatic processing to upload your public key to the OpenPGP Web Key Directory.\n\nYou do not need to take any manual action at this point. #strings in pepHandshake.js # pepPrivacyStatus.RatingBrokenSuggestion=Either you or the sender should resend the message. # pepPrivacyStatus.RatingHaveNoKeySuggestionOutgoing=If you composed this message, your key is not available. # pepPrivacyStatus.RatingMistrustSuggestion=Re-establish the connection with your communication partner and try to complete another handshake. # pepPrivacyStatus.RatingReliableSuggestion=Complete a handshake with your communication partner by exchanging trustwords in person or over the phone. A handshake is needed only once per partner and will ensure secure and trusted communication. # pepPrivacyStatus.RatingTrustedSuggestion=No action needed! # pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware this message may not be secure. # pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Please add the necessary information. # pepPrivacyStatus.RatingUnderAttackSuggestion=Separately verify the content of this message with your communication partner. # pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least secure. # pepPrivacyStatus.RatingUnencryptedSuggestion=Please ask your communication partner to use an encryption solution or install p≡p. # pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or no signature. Ask your communication partner to upgrade their encryption solution or install p≡p. # pepPrivacyStatus.RatingBrokenExplanation=This message has broken encryption or formatting. # pepPrivacyStatus.RatingHaveNoKeyExplanation=This message cannot be decrypted because the key is not available. # pepPrivacyStatus.RatingMistrustExplanation=This message has a communication partner that has previously been marked as mistrusted. # pepPrivacyStatus.RatingReliableExplanation=This message is secure but you still need to verify the identity of your communication partner. # pepPrivacyStatus.RatingTrustedExplanation=This message is secure and trusted. # pepPrivacyStatus.RatingUndefinedExplanation=This message does not contain enough information to determine if it is secure. # pepPrivacyStatus.RatingUnderAttackExplanation=This message is not secure and has been tampered with. # pepPrivacyStatus.RatingUnencryptedExplanation=This message is unsecure. # pepPrivacyStatus.RatingUnencryptedForSomeExplanation=This message is unsecure for some communication partners. # pepPrivacyStatus.RatingUnreliableExplanation=This message has unreliable protection. # pepPrivacyStatus.RatingBrokenText=Broken # pepPrivacyStatus.RatingHaveNoKeyText=Cannot Decrypt # pepPrivacyStatus.RatingMistrustText=Mistrusted # pepPrivacyStatus.RatingReliableText=Secure # pepPrivacyStatus.RatingTrustedText=Secure & Trusted # pepPrivacyStatus.RatingUndefinedText=Unknown # pepPrivacyStatus.RatingUnderAttackText=Under Attack # pepPrivacyStatus.RatingUnencryptedForSomeText=Unsecure for Some # pepPrivacyStatus.RatingUnencryptedText=Unsecure # pepPrivacyStatus.RatingUnreliableText=Unreliable Security # handshakeDlg.button.initHandshake=Handshake... # handshakeDlg.button.stopTrust=Stop Trusting # handshakeDlg.button.reTrust=Stop Mistrusting # handshakeDlg.label.outgoingMessage=Outgoing message # handshakeDlg.label.incomingMessage=Incoming message # handshakeDlg.error.noPeers=Cannot handshake without any correspondents. # handshakeDlg.error.noProtection=Please enable protection in order to use the Handshake function. # enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device # enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup #strings in autocrypt.jsm # autocrypt.setupMsg.subject=Autocrypt Setup Message # autocrypt.setupMsg.msgBody=To set up your new device for Autocrypt, please follow the instuctions that should be presented by your new device. # autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code presented on your old device, and then import the contained key into your keyring. #strings in upgradeInfo.html # upgradeInfo.doctitle=What's New in Enigmail v2.0? # upgradeInfo.welcome1=Welcome to the new Enigmail version 2.0! # upgradeInfo.welcome2=The release contains a lot of new and changed features. Please take a minute to find out what's new: # upgradeInfo.encSubject.title=Encrypting the Message Subject # upgradeInfo.encSubject.desc=We developed a new method that moves the email subject into the encrypted message, and replaces the visible subject with "Encrypted Message". Once such a message is decrypted, the original subject is replaced automatically. Hiding the subject is on by default; there is a preference to turn it off if you don't like it. (Note: this feature requires the message to be sent with PGP/MIME.) # upgradeInfo.buttons.title=Changed behavior of Encrypt and Sign Buttons # upgradeInfo.buttons.desc=The Encrypt and Sign buttons in the message composer window now work for both the OpenPGP and S/MIME protocols. If both algorithms are possible, then Enigmail will try to prefer the one for which all keys are available. # upgradeInfo.autocrypt.title=Support for Autocrypt # upgradeInfo.autocrypt.desc=Enigmail now supports Autocrypt, a new standard to distribute keys as part of sent messages. Enigmail automatically imports keys from Autocrypt-compliant messages, such that over time more and more emails can be encrypted. # upgradeInfo.pEp.title=New p≡p Junior Mode (Pretty Easy Privacy) # upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. You currently need to manually install p≡p for this purpose; this will change in a future release. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. # upgradeInfo.bottom.desc=Please visit our documentation for help on using Enigmail. # pep.missingGnuPG=In order to use Enigmail/p≡p, GnuPG is required. As we could not find it, we suggest to download and install it for you. #strings in enigmailAbout.html # aboutEnigmail.tabName=About Enigmail # aboutEnigmail.title=OpenPGP support provided by Enigmail # aboutEnigmail.team=Enigmail is developed by the Enigmail Team: # aboutEnigmail.projectLeader=Lead Developer: # aboutEnigmail.usability=Usability: # aboutEnigmail.documentation=Documentation: # aboutEnigmail.testing=Testing: # aboutEnigmail.userSupport=User Support: # aboutEnigmail.localization=Localization: See the Enigmail Language Packs page # aboutEnigmail.Credits=Credits: # aboutEnigmail.origAuthor=Original author of the Enigmail extension # aboutEnigmail.icons=Icons: # aboutEnigmail.formerMembers=Former team members: # aboutEnigmail.projectHosting=Project hosting: # aboutEnigmail.licenseSupportTitle=License & Support # aboutEnigmail.license=Enigmail OpenPGP is open source and licensed under the %S # aboutEnigmail.support=Support and download is available from www.enigmail.net. enigmail-2.0.8/lang/ca/help/000077500000000000000000000000001334302754500155505ustar00rootroot00000000000000enigmail-2.0.8/lang/ca/help/compose.html000066400000000000000000000102251334302754500201030ustar00rootroot00000000000000 Ajuda Enigmail: Redacció de missatge

Ajuda Enigmail

Emprant l'Enigmail per redactar missatges

  • El menú Enigmail a la finestra de Redacció
  • Signa missatge: Activa/desactiva l'enviament de correu signat. S'avisa a l'usuari si falla la signatura.
  • Xifra missatge: Activa/desactiva el xifratge a tots els destinataris abans d'enviar. S'avisa a l'usuari si falla el xifratge.

    Si s'ha activat Mostra la selecció només quan es necessiti a Preferències -> Pestanya de selecció de claus, s'obrirà una llista de claus si hi ha adreces a la llista de destinataris del missatge pels que no teniu una clau pública.

    Si s'ha activat No mostris mai el diàleg de selecció de claus OpenPGP a Preferències -> Pestanya de selecció de claus, i hi ha adreces a la llista de destinataris del missatge pels que no teniu una clau pública, el missatge s'enviarà sense xifrar.

  • Empra PGP/MIME en aquest missatge: Activa/desactiva l'ús del PGP/MIME en aquest missatge.

    Si teniu coneixement que el(s) destinatari(s) pot llegir el correu codificat amb el format PGP/MIME, hauríeu d'activar-lo.

    Aquesta funcionalitat depèn de si estan actius els paràmetres Permet l'ús de PGP/MIME o Empra sempre PGP/MIME a Preferències -> Pestanya PGP/MIME.

  • Opcions de redacció predeterminades: Submenú.
    • Opcions de signatura/xifratge...: drecera a Paràmetres del compte -> Opcions OpenPGP.
    • Opcions d'enviament...: drecera a la pestanya Preferències -> Enviament.
    • Opcions de selecció de clau...: drecera a la pestanya Preferències -> Selecció de clau.
    • Opcions PGP/MIME...: drecera a la pestanya Preferències -> PGP/MIME.
  • Desfés el xifratge: Si hi ha una errada quan s'enviï el corrreu, p.ex. que el servidor POP no accepta la petició, l'Enigmail no se n'assabentarà, i el missatge xifrat continuarà mostrant-se a la finestra de redacció. Seleccionant aquesta opció del menú es desfarà el xifratge/signatura, i es revertirà la finestra de redacció al text original.
    Com a solució provisional, aquesta opció es pot emprar per a desxifrar el text citat en respondre a missatges xifrats. L'Enigmail hauria de desxifrar automàticament el missatge citat, però si això falla per alguna raó, podeu emprar aquesta opció del menú per a forçar-ho.
  • Insereix la clau pública: insereix el bloc ASCII-cuirassat amb la clau pública a la posició actual del cursor de la finestra de redacció. Es sol·licitarà l'adreça de correu de la clau(s) a inserir. Les claus inserides d'aquesta manera es reconeixeran automàticament a la recepció per l'Enigmail. Després de l'inserció de la clau, encara podeu signar/xifrar el correu si us cal. No inseriu més d'un bloc de clau a un missatge; només indiqueu vàries adreces de correu, separades per comes o espais quan es sol·liciti.
  • Neteja la contrasenya desada: Neteja la contrasenya memoritzada. És útil si teniu vàries contrasenyes.
  • Ajuda: Mostra la informació d'ajuda del lloc web (aquesta pàgina).

Teniu més ajuda a la vostra disposició a la pàgina web de l'Enigmail

enigmail-2.0.8/lang/ca/help/editRcptRule.html000066400000000000000000000135471334302754500210560ustar00rootroot00000000000000 Ajuda Enigmail: Editar regla OpenPGP

Ajuda Enigmail

Emprant l'editor de regles de l'Enigmail: Edició d'una regla OpenPGP

A l'editor de regles, podeu indicar, per cada destinatari, el xifratge, la signatura i PGP/MIME i quines claus OpenPGP emprar de manera predeterminada. En aquest diàleg, podeu indicar les regles per un destinatari individual i per un grup de destinataris amb atributs força similars.

  • Estableix les regles OpenPGP per a: Conté l'adreça de correu dels destinataris (sense noms, p.ex. només una adreça com algu@correu.domini). Podeu indicar algunes adreces de correu, separades per espais. L'adreça indicada aquí pot consistir de només la secció del domini, així el correu a qualsevol adreça del domini coincidirà (p.ex. @correu.domini coincideix amb algu@correu.domini, algualtre@correu.domini, qualsevol@correu.domini, etc.)
  • Aplica la regla si el destinatari ...: Això modifica la coincidència de les adreces de correu. Si s'ha introduït múltiples adreces de correu, el paràmetre s'aplicarà a totes. Els exemples següents estan basats en les Regles OpenPGP introduïdes més amunt algu@correu.domini.
    • És exacta: amb aquest paràmetre, la regla només s'activarà amb adreces de correus a algu@correu.domini (exacta, coincidència sense distinció de majúscules).
    • Conté: amb aquest paràmetre, qualsevol adreça de correu que contingui la cadena coincidirà (p.ex. tambealgu@correu.domini o algu@correu.domini.net)
    • Comença amb: amb aquest paràmetre, qualsevol adreça de correu que comenci amb la cadena coincidirà (p.ex. algu@correu.domini.net, algu@correu.domini-nom.com)
    • Acaba amb: amb aquest paràmetre, qualsevol adreça de correu que acabi amb la cadena coincidirà (p.ex. algu@correu.domini, algualtre@correu.domini).
  • Continua amb la següent regla per l'adreça coincident
    L'activació d'aquesta funció us permet definir una regla sense haver d'indicar una identificació de clau en el camp Empra les claus OpenPGP següents:, així que l'adreça de correu s'usa per comprovar la clau en el moment d'enviar. També es processaran les regles posteriors per a la mateixa adreça(es).
  • No comprovis més regles per l'adreça coincident
    L'activació d'aquesta funció atura el procés d'altres regles per a l'adreça(es) coincident amb aquesta regla. El procés de regles continua amb el següent destinatari.
  • Empra les següents claus OpenPGP:
    Empreu el botó Selecciona clau(s).. per seleccionar les claus dels destinataris que s'usaran per a xifrar. De la mateixa manera que amb l'acció anterior, no es processen més regles amb l'adreça coincident.
  • Signatura per omissió: activa o desactiva la signatura del missatge, en funció del que s'ha indicat a la finestra de redacció del missatge. El valors són:
    • Mai: desactiva la signatura, inclòs si s'ha activat a la finestra de redacció del missatge (preval sobre els altres valors)
    • Sí, si s'ha seleccionat a la redacció del missatge: deixa la signatura tal com s'ha indicat a la finestra de redacció del missatge
    • Sempre: activa la signatura, inclòs si no s'ha activat a la finestra de redacció del missatge
Aquests paràmtres de signatura s'apliquen a totes les regles que coincideixen. Si una de les regles desactiva la signatura, el missatge no es signarà, a menys que altres regles indiquin Sempre.
  • Xifratge: activa o desactiva el xifratge del missatge. Els paràmetres admesos i el seu significat són els mateixos que per la signatura de missatge.
  • PGP/MIME: activa o desactiva l'ús de la codificació PGP/MIME (RFC 3156) del missatge. Si el PGP/MIME està desactivat, els missatges es codifiquen usant el "PGP inserit". Els paràmetres admesos i el seu significat són els mateixos que per la signatura de missatge.

Les regles es processen segons l'ordre mostrat a la llista de l'editor de regles OpenPGP. Quan una regla coincideix amb un destinatari i conté una identificació de clau OpenPGP, a més d'usar la identificació de clau indicada, el destinatari ja no es té en compte al processar més regles.


Teniu més ajuda a la vostra disposició a la pàgina de paràmetres per destinatari de l'Enigmail

enigmail-2.0.8/lang/ca/help/initError.html000066400000000000000000000054071334302754500204210ustar00rootroot00000000000000 Ajuda de l'Enigmail: Com resoldre els problemes en inicialitzar l'OpenPGP

Ajuda de l'Enigmail

Com resoldre els problemes en inicialitzar l'OpenPGP

Hi ha diversos motius pels que la inicialització de l'OpenPGP no funciona. Els més normals es descriuen tot seguit. Per a més informació visiteu la pàgina d'ajuda de l'Enigmail.

No s'ha trobat el GnuPG

Per a que funcioni l'OpenPGP, cal instal·lar l'eina GnuPG. Si no es pot trobar el GnuPG, primer assegureu-vos que l'executable gpg.exe (a Windows, gpg en altres platformes) està instal·lat a l'ordinador. Si el GnuPG està instal·lat, i l'OpenPGP no pot trobar-lo, aleshores necessitareu definir manualment el camí al GnuPG en les preferències de l'OpenPGP (menú OpenPGP > Preferències)

L'Enigmime falla en iniciar-se

L'OpenPGP funciona només si està construït utilitzant el mateix entorn de construcció amb el que s'ha construït el Thunderbird o el SeaMonkey. Aixó vol dir que només podeu utilitzar la versió oficial de l'Enigmail si utilitzeu les versions oficials del Thunderbird o el SeaMonkey proporcionats per mozilla.org.

Si utilitzeu una versió del Thunderbird o del SeaMonkey provinent d'alguna altra font (p.ex. el proveïdor de la vostra distribució de Linux), o si vós mateix heu construït l'aplicació, heu d'utilitzar una versió de l'Enigmail construïda per la mateixa font, o heu de construir l'Enigmail vós mateix. Per a construir l'Enigmail, dirigiu-vos a la secció de codi font de la pàgina inicial de l'Enigmail. Si us plau, no presenteu cap informe d'error respecte a aquest problema, no es pot solucionar.

Hi ha més ajuda disponible en el lloc web d'ajuda de l'Enigmail.

enigmail-2.0.8/lang/ca/help/messenger.html000066400000000000000000000105331334302754500204300ustar00rootroot00000000000000 Ajuda Enigmail: Lectura de missatges

Ajuda Enigmail

Emprant l'Enigmail per llegir missatges

  • Botó Desxifra a la finestra principal de la Missatgeria
    Aquest botó es pot emprar per a varies funcions: desxifrar, verificar o importar claus públiques. Normalment, el desxiframent/verificació és automàtic, encara que es pot desactivar amb una opció. Tanmateix, si això falla, es mostrarà un missatge curt d'error a la línia d'estat de l'Enigmail. Si feu un clic al botó Desxifra, podreu veure un missatge d'error més detallat, inclòsa la sortida de l'ordre GPG.
  • Icones del llapis i la clau al visualitzador de capçaleres del missatge
    Les icones del llapis i la clau al visualitzador de capçaleres del missatge indiquen si el missatge que esteu llegint ha estat signat i/o xifrat. Si el missatge ha estat modificat, la icona del llapis canviarà a un llapis trencat per a indicar que la signatura és dolenta. Fent un clic amb el botó dret a la icona del llapis o de la clau mostrarà un menú amb les següents opcions:
    • Informació de seguretat OpenPGP: us permet veure l'estat de la sortida GPG del missatge.
    • Copia la informació de seguretat OpenPGP: copia l'estat de la sortida GPG al porta-retalls; enganxar-lo a un missatge de resposta, etc.
    • Mostra l'identificador de foto OpenPGP: us permet veure l'identificador de foto de la persona que envia el missatge, si ha incrustat una foto a la seva clau pública. (Aquesta opció només s'activarà si existeix l'identificador de foto a la seva clau.)
    • Informació de seguretat S/MIME: us permet veure la informació de seguretat S/MIME del missatge.

    Si no heu establert l'opció keyserver-options auto-key-retrieve al vostre fitxer gpg.conf i llegiu un missatge que està signat o xifrat, veureu la icona d'un llapis a l'àrea de visualització de les capçaleres amb un interrogant, i la línia d'estat de l'Enigmail a l'àrea de capçaleres indicarà Part del missatge signat; feu un clic a la icona del llapis pels detalls i el missatge de la subfinestra de la Missatgeria mostrarà tots els indicadors del bloc PGP del missatge i el bloc de signatura.

    També podreu veure això si teniu establerta l'opció keyserver-options auto-key-retrieve al vostre fitxer gpg.conf i la clau PGP no es troba en el servidor de claus predeterminat.

    En fer un clic a la icona del llapis amb interrogant s'obrirà una finestra avisant que la clau no està al vostre anell de claus. Si feu un clic a D'acord s'obrirà una altra finestra amb una llista dels servidors de claus que podeu seleccionar per a baixar la clau pública del remitent.

    Per a configurar la llista dels servidors de claus que voleu usar, aneu a la pestanya Enigmail -> Preferències -> Bàsic i introduïu les adreces dels servidors de claus a la caixa Servidor(s) de claus:, separats per comes. El primer servidor de claus serà el predeterminat.

  • Obrint fitxers adjunts xifrats / important claus PGP adjuntes
    Els fitxers adjunts anomenats *.pgp, *.asc i *.gpg es reconeixen com adjunts que l'Enigmail pot gestionar de manera especial. Fent un clic amb el botó dret en aquests adjunts s'activen dos elements especials del menú contextual: Desxifra i obre i Desxifra i desa. Empreu aquests dos elements del menú si voleu que l'Enigmail desxifri un adjunt abans d'obrir-lo o desar-lo. Si un adjunt es reconeix com un fitxer de clau PGP, se us oferirà la possibilitat d'importar la clau al vostre anell de claus.

Teniu més ajuda a la vostra disposició a la pàgina web de l'Enigmail

enigmail-2.0.8/lang/ca/help/rulesEditor.html000066400000000000000000000066151334302754500207470ustar00rootroot00000000000000 Ajuda Enigmail: Editor de regles

Ajuda Enigmail

Emprant l'editor de regles de l'Enigmail

En el editor de regles podeu indicar que, en funció del destinatari, s'activi el xifratge, la signatura i el PGP/MIME, i definir quina clau OpenPGP emprar. Cada regla consisteix en 5 camps que es representen en una línia individual:

  • Correu electrònic: l'adreça(es) dels camps A: (To), Còpia: (Cc) i Còpia invisible: (Bcc) a comprovar. La coincidència es basa en subcadenes (es poden trobar més detalls al diàleg d'edició de regles)
  • Clau(s) OpenPGP: una llista de les identificacions de claus OpenPGP per a usar amb el destinatari
  • Signatura: activa o desactiva la signatura del missatge. Això preval sobre el que s'ha indicat a la finestra de redacció del missatge. El valors són:
    • Mai: desactiva la signatura, inclòs si s'ha activat a la finestra de redacció del missatge (preval sobre els altres valors)
    • Possible: deixa la signatura tal com s'ha indicat a la finestra de redacció del missatge
    • Sempre: activa la signatura, inclòs si no s'ha activat a la finestra de redacció del missatge
Aquests paràmetres de signatura s'aplicaran a totes les regles que coincideixin. Si una de les regles desactiva la signatura, el missatge no es signarà, a menys que altres regles indiquin Sempre.
  • Xifratge: activa o desactiva el xifratge del missatge. Els paràmetres permesos i els seu significat són els mateixos que per la signatura de missatge.
  • PGP/MIME: activa o desactiva l'ús de la codificació PGP/MIME (RFC 3156) del missatge. Si el el PGP/MIME està desactivat, els missatges es codifiquen amb el "PGP inserit". Els paràmetres permesos i els seu significat són els mateixos que per la signatura de missatge.

Les regles es processen segons l'ordre mostrat a la llista. Quan una regla coincideix amb un destinatari i conté un identificador de clau OpenPGP, a més d'emprar l'dentificador de clau indicat, el destinatari no es tornarà a considerar en processar les regles seguents.

Nota: L'editor de regles encara no està acabat. És posible escriure les regles més avançades editant directament el fitxer de regles (aquestes regles no hauríen de tornar-se a editar en el editor de regles). Més informació per editar directament el fitxer a la pàgina web de l'Enigmail


Teniu més ajuda a la vostra disposició a la pàgina web d'ajuda de l'Enigmail

enigmail-2.0.8/lang/ca/help/sendingPrefs.html000066400000000000000000000047771334302754500211040ustar00rootroot00000000000000 Enigmail Help: Edit OpenPGP Rule

Enigmail Help

Defining Preferences to Send Encrypted

In the Sending Preferences you can choose the general model and preferences for encryption.

Convenient Encryption
With these settings, emails are encrypted without confirmation whenever possible.

This setup is appropriate, if you just want to improve your privacy by sending emails encyrpted instead of unencrypted if that's possible.

The effect is like sending emails as letters instead of postcards. Unlike postcards, letters usually hide their contents while in transit.

Note however that as with letters you can't be sure that nobody is opening the letter while it is in transit (although, some technical effort is necessary for that).

A concrete risk is that you accidentally use "faked keys" you got from somewhere or somebody claiming that the key belongs to the person you want to send emails to. To avoid this risk, you can either use the trust model of PGP (see below) or you should always verify, whether the fingerprint of a public key is correct.

Manual Encryption
This option allows you to specify the different preferences for encryption according to your needs. You can specify
  • whether replies to encrypted/signed emails should automatically also be encrypted/signed-
  • whether to use the trust model of OpenPGP to accept keys (this means that to use a key you either have to sign the key or have enough other people you trust having signed the key).
  • whether you want to automatically send emails encrypted if all keys are accepted.
  • whether and when you want to finally confirm sending an email.
If it is important for you that content you send encrypted can't be read by other people or organizations, you should use the manual preferences at least choose the option to accept keys only if you or other people signed them. While this model reduces the risk of using faked keys, it requires that you actively sign keys and declare owner trust using the key managament dialog. enigmail-2.0.8/lang/cs/000077500000000000000000000000001334302754500146425ustar00rootroot00000000000000enigmail-2.0.8/lang/cs/am-enigprefs.properties000066400000000000000000000001211334302754500213270ustar00rootroot00000000000000# Strings used in the Mozill AccountManager prefPanel-enigprefs=OpenPGP/Enigmail enigmail-2.0.8/lang/cs/enigmail.dtd000066400000000000000000001426511334302754500171350ustar00rootroot00000000000000 ' k urÄení e-mailové adresy"> ' znaky pro urÄení e-mailové adresy pro GnuPG. Zakažte, pokud příjemce používá staré klíÄe Hushmail."> UpozornÄ›ní: tvorba klíÄe klíÄe může nÄ›kolik minut trvat. NeukonÄujte aplikaci, dokud probíhá vytváření klíÄe. Proces se urychlí a zlepší, když budete aktivnÄ› pracovat s prohlížeÄem a Äasto pÅ™istupovat k harddisku. Na to, že je klÃ­Ä vytvoÅ™en, budete upozornÄ›n/a."> ' je nesprávnÄ›"> UpozornÄ›ní: Vytváření klíÄe může trvat nÄ›kolik minut. NeukonÄujte aplikaci, dokud probíhá vytváření klíÄe. Na to, že je klÃ­Ä vytvoÅ™en, budete upozornÄ›n/a."> UpozornÄ›ní: Enigmail bude vždy ověřovat podpisy v e-mailech vÅ¡ech identit a úÄtů bez ohledu na to, zda je to v nich povoleno"> DÄ›kujeme, že používáte Enigmail."> enigmail-2.0.8/lang/cs/enigmail.properties000066400000000000000000001533111334302754500205510ustar00rootroot00000000000000Enigmail=Enigmail ##################################################################### # Strings used within enigmailCommon.js and enigmailCommon.jsm ##################################################################### enigAlert=UpozornÄ›ní Enigmail enigConfirm=Potvrzení Enigmail # enigInfo=Enigmail Information enigError=Chyba Enigmail enigPrompt=PÅ™ipomenutí Enigmail dlgYes=&Ano dlgNo=&Ne dlgKeepSetting=Pamatovat si odpovÄ›Ä a neptat se znovu dlgNoPrompt=Nezobrazovat znovu tento dialog dlg.button.delete=&Odstranit/Smazat dlg.button.cancel=&ZpÄ›t dlg.button.close=&Zavřít dlg.button.continue=Pok&raÄovat dlg.button.skip=&PÅ™eskoÄit # dlg.button.overwrite=&Overwrite dlg.button.view=&Zobrazit # dlg.button.retry=&Retry # dlg.button.ignore=&Ignore # dlg.button.install=&Install # dlg.button.ok=&OK repeatPrefix=\n\nToto upozornÄ›ní se zopakuje %S repeatSuffixSingular=krát. repeatSuffixPlural=krát. noRepeat=\n\nToto upozornÄ›ní se již nezopakuje, dokud nebudete upgradovat Enigamil. pgpNotSupported=Zdá se, že používáte Enigmail spoleÄnÄ› s PGP 6.x\n\nPGP 6.x má bohužel nÄ›kolik nedostatků, kvůli kterým nelze zajistit správný chod rozšíření Enigmail. Proto také Enigmail nepodporuje více PGP 6.x; radÄ›ji prosím používejte GnuPG (GPG).\n\nJestliže potÅ™ebujete pomoc s pÅ™echodem na GnuPG, pÅ™eÄtÄ›te si sekci Help na domovské stránce Enigmailu. # initErr.howToFixIt=In order to use Enigmail, GnuPG is required. If you did not install GnuPG yet, the easiest way to do this is using the "Setup Wizard" button below. # initErr.setupWizard.button=&Setup Wizard passphraseCleared=Heslo bylo smazáno. # cannotClearPassphrase=You are using a non-standard tool (such as gnome-keyring) for passphrase handling. Clearing the passphrase is therefore not possible from within Enigmail. noPhotoAvailable=Foto není k dispozici debugLog.title=Enigmail Debug Log error.photoPathNotReadable=Foto cesta s není Äitelný # generalError=Error: %S # Strings in configure.jsm # enigmailCommon.versionSignificantlyChanged=This new version of Enigmail has significant changes in the handling of preferences and options. We tried to transfer the old settings to this new version. However, we cannot cover all cases automatically. Please double check the resulting new preferences and options. # enigmailCommon.checkPreferences=Check Preferences ... # preferences.defaultToPgpMime=We have changed the default message encoding in Enigmail from Inline-PGP to PGP/MIME. We recommend you keep this as default.\n\nIf you still wish to use Inline-PGP by default, you can do so in the Account Settings under OpenPGP Security. ##################################################################### # Strings in enigmailAbout.js ##################################################################### usingVersion=SpuÅ¡tÄ›no rozšíření Enigmail verze %S # enigmailPepVersion=Enigmail/p≡p version %S usingAgent=K Å¡ifrování a deÅ¡ifrování je použito GnuPG, které je umístÄ›né v cestÄ› %S %S agentError=CHYBA: selhal přístup ke službÄ› Enigmime! ##################################################################### # Strings in enigmailKeygen.js ##################################################################### accessError=Chyba v přístupu k službám rozšíření Enigmail onlyGPG=Generování klíÄe je možné jedinÄ› s GnuPG (ne s PGP)! keygenComplete=Generování klíÄe je dokonÄeno! Identita <%S> bude použita k podepisování. revokeCertRecommended=Velice Vám doporuÄujeme vytvoÅ™it revokaÄní certifikát pro Vás klíÄ. Tento certifikát můžete být použít pro zneplatnÄ›ní klíÄe, napÅ™. když soukromý klÃ­Ä ztratíte nebo bude klÃ­Ä kompromitován. PÅ™ejete si nyní vytvoÅ™it revokaÄní certifikát? keyMan.button.generateCert=&Generování certifikátu genCompleteNoSign=Generování klíÄe je dokonÄeno! genGoing=Generování klíÄe již probíhá! passNoMatch=Heslo nesouhlasí, zadejte jej prosím znovu passCheckBox=PÅ™ekontrolujte prosím okénko, zda nastavujete klíÄi volbu \\"bez hesla\\" passUserName=Prosím specifikujte jméno uživatele pro tuto identitu # keygen.missingUserName=There is no name specified for the selected account/identity. Please enter a value in the field "Your name" in the account settings. # keygen.passCharProblem=You are using special characters in your passphrase. Unfortunately, this can cause troubles for other applications. We recommend you choose a passphrase consisting only of any of these characters:\na-z A-Z 0-9 /.;:-,!?(){}[]%* passSpaceProblem=Z technických důvodů může být vaÅ¡e přístupové heslo není zaÄínat nebo konÄit mezerou changePassFailed=ZmÄ›na hesla selhala. keyConfirm=VytvoÅ™it veÅ™ejný a soukromý klÃ­Ä pro '%S'? keyMan.button.generateKey=&VytvoÅ™it klÃ­Ä keyAbort=PÅ™eruÅ¡it vytváření klíÄe? keyMan.button.generateKeyAbort=&PÅ™eruÅ¡it vytváření klíÄe keyMan.button.generateKeyContinue=&PokraÄovat ve vytváření klíÄe expiryTooLong=Nemůžete vytvoÅ™it klíÄ, který expiruje více než za 100 let. expiryTooLongShorter=You cannot create a key that expires in more than 90 years. expiryTooShort=Váš klÃ­Ä musí být platný minimálnÄ› jeden den. keyGenFailed=Vytváření klíÄe selhalo. Podrobnosti zjistíte v konzoli Enigmail (nabídka Enigmail > LadÄ›ní Enigmail). # setKeyExpirationDateFailed=The expiration date could not be changed # Strings in enigmailMessengerOverlay.js securityInfo=Informace zabezpeÄení Enigmail\n\n enigHeader=Enigmail: enigContentNote=Enigmail: *Přílohy k této zprávÄ› nebyly podepsány nebo zaÅ¡ifrovány*\n\n possiblyPgpMime=Tato zpráva je možná zaÅ¡ifrovaná nebo podepsaná PGP/MIME; ověříte si to po kliknutí na tlaÄítko \\"DeÅ¡ifrovat\\" saveAttachmentHeader=Enigmail: Uložit deÅ¡ifrovanou přílohu noTempDir=Nemohu najít doÄasný adresář k zápisu\nNastavte promÄ›nnou prostÅ™edí systému TEMP prosím attachmentPgpKey=Zdá se, že příloha '%S', kterou otevíráte, je soubor s klíÄem OpenPGP.\n\nKlinÄ›te na \\"Import\\" pro uložení klíÄe nebo na \\"Zobrazit\\", abyste si prohlédli obsah souboru v oknÄ› prohlížeÄe. beginPgpPart=********* *ZACATEK SIFROVANE nebo PODEPSANE CASTI* ********* endPgpPart=********** *KONEC SIFROVANE nebo PODEPSANE CASTI* ********** notePartEncrypted=Enigmail: *Cast zpravy nebyla podepsana nebo desifrovana* noteCutMessage=Enigmail: *Nalezen mnohonásobný blok zpráv -- deÅ¡ifrování/ověření zruÅ¡eno* decryptOkNoSig=UpozornÄ›ní\n\nDeÅ¡ifrování bylo úspěšné, ale podpis nemohl být správnÄ› ověřen msgOvl.button.contAnyway=&PÅ™ejete si pÅ™esto pokraÄovat? signature.verifiedOK=ÚspěšnÄ› byl ověřen podpis přílohy %S signature.verifyFailed=Nelze ověřit podpis přílohy %S attachment.noMatchToSignature=Přílohu '%S' nelze porovnat se souborem podpisu attachment.noMatchFromSignature=Soubor podpisu '%S' nelze s přílohou porovnat # fixBrokenExchangeMsg.failed=Did not succeed to repair message. enigmail.msgViewColumn.label=Enigmail # enigmailPep.msgViewColumn.label=Enigmail/p≡p # wksNoIdentity=This key is not linked to any of your email accounts. Please add an account for at least one of the following email addresse(s):\n\n%S # wksConfirmSuccess=Confirmation email sent. # wksConfirmFailure=Sending the confirmation email failed. # autocrypt.importSetupKey.accountPreconfigured=Your account is already correctly configured for Autocrypt.\n\nDo you really want to overwrite your settings with this setup message? # autocrypt.importSetupKey.selfCreated=This message was created by your currently running instance of Enigmail.\n\nPlease switch to the email client to which you want to transfer the settings, and click on the message on that email client to import the settings. # autocrypt.importSetupKey.invalidMessage=Error - could not read setup message. The message seems to be corrupted. Please try to create a new setup message on your "other" device. # autocrypt.importSetupKey.invalidKey=Error - the key could not be imported. The key is either not supported by your version of GnuPG, or it got corrupted. # autocrypt.importSetupKey.wrongPasswd=The password you entered is wrong. Do you want to retry? # autocrypt.importSetupKey.success=The Autocrypt setup message was processed successfully. Autocrypt is now available for your account '%S'. ##################################################################### # Strings in enigmailMsgComposeOverlay.js ##################################################################### keysToExport=Vybrat klíÄe OpenPGP ke vložení keysToUse=Vybrat klíÄ/e OpenPGP pro použití s %S pubKey=VeÅ™ejný klÃ­Ä pro %S\n windowLocked=Okno vytváření zprávy je uzamÄeno; odesílání zruÅ¡eno sendUnencrypted=Chyba inicializace Enigmailu.\nOdeslat zprávu nezaÅ¡ifrovanou? composeSpecifyEmail=UrÄete prosím svou hlavní e-mailovou adresu, která bude vybrána k podepisování odchozích zpráv.\n Jestliže ji nevyplníte, bude pro výbÄ›r klíÄe k podpisu použita adresa odesílatele. sendingHiddenRcpt=Tato zpráva obsahuje příjemce BCC (skrytá kopie). Jestliže je taková zpráva zaÅ¡ifrována, je možné skrýt BCC příjemce, ale uživatelé nÄ›kterých produktů (napÅ™. PGP Corp.) nebudou moci zprávu deÅ¡ifrovat. Proto nedoporuÄujeme používat BCC u Å¡ifrovaných zpráv. sendWithHiddenBcc=Skrýt příjemce BCC sendWithShownBcc=Å ifrovat normálnÄ› sendingNews=Odeslání Å¡ifrované zprávy selhalo.\n\nTato zpráva nemůže být Å¡ifrována, protože obsahuje adresáta z diskuzní skupiny. PoÅ¡lete prosím zprávu bez Å¡ifrování. sendToNewsWarning=Pozor: Snažíte se poslat zaÅ¡ifrovaný email do diskuzní skupiny.\n\nOd toho odrazujeme, protože to má smysl pouze v případÄ›, že vÅ¡ichni Älenové skupiny jsou schopni email rozÅ¡ifrovat. Zpráva musí být Å¡ifrována pomocí klíÄů vÅ¡ech skupin úÄastníků. Prosím, poÅ¡lete tuto zprávu, jen pokud pÅ™esnÄ› víte, co dÄ›láte.\n\nPokraÄovat? hasHTML=HTML e-mail - varování\nZpráva zÅ™ejmÄ› obsahuje kód HTML, který může způsobit chybu pÅ™i podepisování nebo Å¡ifrování. Této chybÄ› u podepsaného mailu se vyhnete, když stlaÄíte klávesu SHIFT pÅ™i kliknutí na tlaÄítko 'VytvoÅ™it zprávu' nebo 'OdpovÄ›dÄ›t'.\nJestliže vždy zprávy podepisujete, mÄ›li byste radÄ›ji trvale zruÅ¡it 'Vytváření zpráv v HTML' u tohoto úÄtu. (Pozn. pÅ™ekl.: anebo odesílejte zprávy s využitím PGP/MIME, jestliže je to možné, tj. jestliže příjemce používá poÅ¡tovního klienta, který PGP/MIME podporuje.) strippingHTML=Zpráva obsahuje kód HTML, který bude pÅ™i konverzi do prostého textu pÅ™i podepisování nebo Å¡ifrování ztracen. PÅ™ejete si provést konverzi? msgCompose.button.sendAnyway=&Odeslat pÅ™esto zprávu attachWarning=Přílohy k této zprávÄ› nejsou místní a nemohou být tedy Å¡ifrovány. Přílohu je tÅ™eba k zaÅ¡ifrování nejdříve uložit jako místní soubor. PÅ™ejete si pÅ™esto pokraÄovat dále? quotedPrintableWarn=Pro odesílání zpráv je povoleno kódování 'quoted-printable', to může způsobit nesprávné deÅ¡ifrování a/nebo ověření vaší zprávy.\n PÅ™ejete si vypnout odesílání zpráv v 'quoted-printable'? minimalLineWrapping=Máte nastaveno zalamování řádků na %S znaků. Pro správné Å¡ifrování a/nebo podepisování musí být tato hodnota nejménÄ› 68.\nPÅ™ejete si nyní zmÄ›nit zalamování řádků na 68 znaků? warning=Pozor signIconClicked=RuÄnÄ› jste zmÄ›nil/a podepisování. PÅ™i vytváření této zprávy proto (de)aktivace podpisu nezávisí na (de)aktivaci Å¡ifrování. # errorOwnKeyUnusable=The key ID '%S' configured for the current identity does not yield a usable OpenPGP key.\n\nPlease ensure that you have a valid, not expired OpenPGP key and that your account settings point to that key.\nIf your key is not expired, then check if you did set Owner trust to full or ultimate. # msgCompose.cannotSaveDraft=Error while saving draft # msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information - partially encrypted email. # msgCompose.partiallyEncrypted.mimeMsg=The message you are replying to contained both unencrypted and encrypted parts. Some encrypted message parts are invisible to you.\n\nIf the sender was not able to decrypt the hidden message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nWe recommend that you don't reply to the message, but create a new message containing your answer. # msgCompose.partiallyEncrypted.inlinePGP=The message you are replying to contained both unencrypted and encrypted parts. If the sender was not able to decrypt some message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nPlease consider removing all quoted text from your reply to this sender. # msgCompose.internalEncryptionError=Internal Error: promised encryption disabled # msgCompose.internalError=An internal error has occurred. msgCompose.toolbarTxt.signAndEncrypt=Tato zpráva bude podepsána a Å¡ifrována msgCompose.toolbarTxt.signOnly=Tato zpráva bude podepsána msgCompose.toolbarTxt.encryptOnly=Tato zpráva bude Å¡ifrována msgCompose.toolbarTxt.noEncryption=Tato zpráva nebude podepsána ani Å¡ifrována # msgCompose.toolbarTxt.disabled=Enigmail is disabled for the selected identity # msgCompose.protectSubject.tooltip=Protect the message subject # msgCompose.noSubjectProtection.tooltip=Do not protect the message subject msgCompose.encryptedSubjectStub=Å ifrovaná zpráva # msgCompose.protectSubject.dialogTitle=Enable Protection of Subject? # msgCompose.protectSubject.question=Regular encrypted emails contain the unredacted subject.\n\nWe have established a standard to hide the original subject in the encrypted message\nand replace it with a dummy text, such that the subject is only visible after the email is decrypted.\n\nDo you want to protect the subject in encrypted messages? # msgCompose.protectSubject.yesButton=&Protect subject # msgCompose.protectSubject.noButton=&Leave subject unprotected # msgCompose.detailsButton.label=Details ... msgCompose.detailsButton.accessKey=D # msgCompose.pepSendUnknown=Unknown # msgCompose.pepSendUnsecure=Unsecure # msgCompose.pepSendSecure=Secure # msgCompose.pepSendTrusted=Secure & Trusted # pep.alert.disabledForIdentity=p≡p is disabled for the current identity. Please enable p≡p via the Enigmail/p≡p preferences. # pep.alert.weakReply=You’re about to forward or reply to a secure message as insecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? # note: should end with double newline: sendAborted=Odeslání zprávy se nezdaÅ™ilo.\n\n # details: # keyNotTrusted=Not enough trust for key '%S' # keyNotFound=Key '%S' not found # keyRevoked=Key '%S' revoked # keyExpired=Key '%S' expired statPGPMIME=PGP/MIME # statSMIME=S/MIME statSigned=PODEPSANOU statEncrypted=Å IFROVANOU statPlain=NEPODEPSANà a NEZAÅ IFROVANà offlineSave=Uložit %S zprávu do %S do složky konceptů? onlineSend=Odeslat zprávu %S na %S? encryptKeysNote=UpozornÄ›ní: zpráva je Å¡ifrována s následujícím uživatelským ID / klíÄem: %S hiddenKey= signFailed=Chyba Enigmail; Å ifrování nebo podepisování selhalo; odeslat zprávu nezaÅ¡ifrovanou? msgCompose.button.sendUnencrypted=&Odeslat nezaÅ¡ifrovanou zprávu recipientsSelectionHdr=UrÄit adresáty pro Å¡ifrování configureNow=Nemáte jeÅ¡tÄ› nastaveno zabezpeÄení Enigmail pro zvolenou identitu. PÅ™ejete si to nyní provést? # encryption/signing status and associated reasons: encryptMessageAuto=Å ifrovat zprávu (automaticky) encryptMessageNorm=Å ifrovat zprávu signMessageAuto=Podepsat zprávu (automaticky) signMessageNorm=Podepsat zprávu encryptOff=Å ifrování: Vypnuto encryptOnWithReason=Å ifrování: Zapnuto (%S) encryptOffWithReason=Å ifrování: Vypnuto (%S) encryptOn=Å ifrování: Zapnuto # signOn=Signing: ON # signOff=Signing: OFF # signOnWithReason=Signing: ON (%S) # signOffWithReason=Signing: OFF (%S) # reasonEnabledByDefault=enabled by default # reasonManuallyForced=manually forced # reasonByRecipientRules=forced by recipient rules # reasonByAutoEncryption=forced by auto encryption # reasonByConflict=due to conflict in recipient rules # reasonByEncryptionMode=due to encryption mode # should not be used anymore: encryptYes=Zpráva bude Å¡ifrována encryptNo=Zpráva nebude Å¡ifrována # should not be used anymore: signYes=Zpráva bude podepsána signNo=Zpráva nebude podepsána # PGP/MIME status: pgpmimeNormal=Protokol: PGP/MIME inlinePGPNormal=Protokol: Inline PGP smimeNormal=Protokol: S/MIME pgpmimeAuto=Protokol: PGP/MIME (automaticky) inlinePGPAuto=Protokol: Inline PGP (automaticky) smimeAuto=Protokol: S/MIME (automaticky) # should not be used anymore # pgpmimeYes=PGP/MIME will be used # pgpmimeNo=Inline PGP will be used # Attach own key status (tooltip strings): attachOwnKeyNo=Váš vlastní klÃ­Ä nebude pÅ™ipojen attachOwnKeyYes=Váš vlastní klÃ­Ä bude pÅ™ipojen # attachOwnKeyDisabled=Your own key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. rulesConflict=Nalezena rozporná pravidla pro adresáty\n%S\n\nPoslat zprávu s tÄ›mito nastaveními? msgCompose.button.configure=&Nastavení msgCompose.button.send=&Odeslat zprávu msgCompose.button.save=&Uložit zprávu # Strings in enigmailMsgHdrViewOverlay.js keyNeeded=K ověření podpisu je nutný veÅ™ejný klÃ­Ä %S # keyUsed=Public key %S used to verify signature clickDecrypt=; stisknÄ›te tlaÄítko DeÅ¡ifrovat clickDecryptRetry=; stisknÄ›te tlaÄítko DeÅ¡ifrovat znovu clickDetailsButton=; kliknÄ›te na tlaÄítko "Podrobnosti", pokud se chcete dozvÄ›dÄ›t více # clickImportButton=; click on the 'Import Key' button to import the key # keyTypeUnsupported=; the key type is not supported by your version of GnuPG msgPart=Část zprávy %S msgSigned=podepsána # msgSignedUnkownKey=signed with unknown key msgEncrypted=Å¡ifrována msgSignedAndEnc=podepsána a Å¡ifrována unverifiedSig=Neověřený podpis incompleteDecrypt=Nekompletní deÅ¡ifrování needKey=Chyba - pro deÅ¡ifrování je potÅ™eba soukromý klÃ­Ä failedDecrypt=Chyba - deÅ¡ifrování selhalo badPhrase=Chyba - Å¡patné heslo failedDecryptVerify=Chyba - deÅ¡ifrování/ověření selhalo mdcError=Chyba - zpráva nebyla chránÄ›na proti poruÅ¡ení její integrity viewInfo=; Zobrazit > BezpeÄnostní informace zprávy pro podrobnosti decryptedMsg=DeÅ¡ifrovaná zpráva # decryptedMsgWithFormatError=Decrypted message (restored broken PGP email format probably caused by an old Exchange server, so that the result might not be perfect to read) # usedAlgorithms=Used Algorithms: %1$S and %2$S # pepStatusInfo.text=p≡p Message Status. # pepStatusInfo.title.m3=Under Attack # pepStatusInfo.info.m3=This message is not secure and has been tampered with. # pepStatusInfo.title.m1=Mistrusted # pepStatusInfo.info.m1=This message has a communication partner that has previously been marked as mistrusted # pepStatusInfo.title.r0=Unknown # pepStatusInfo.info.r0=This message does not contain enough information to determine if it is secure. # pepStatusInfo.title.r1=Cannot Decrypt # pepStatusInfo.info.r1=This message cannot be decrypted because the key is not available. # pepStatusInfo.title.r2=Cannot Decrypt # pepStatusInfo.info.r2=This message cannot be decrypted because the key is not available. # pepStatusInfo.title.r3=Unsecure # pepStatusInfo.info.r3=This message is unsecure. # pepStatusInfo.title.r4=Unsecure for Some # pepStatusInfo.info.r4=This message is unsecure for some communication partners. # pepStatusInfo.title.r5=Unreliable Security # pepStatusInfo.info.r5=This message has unreliable protection. # pepStatusInfo.title.r6=Secure... # pepStatusInfo.info.r6=This message is secure but you still need to verify the identity of your communication partner. # pepStatusInfo.title.r7=Secure & Trusted # pepStatusInfo.info.r7=This message is secure and trusted. # pepStatusInfo.color.green=Green # pepStatusInfo.color.yellow=Yellow # pepStatusInfo.color.red=Red # pepRevokeTrust.question=Do you really want to cancel the trust for %S? # pepRevokeMistrust.question=Do you really want to re-trust the key for %S? # pepRevokeTrust.doRevoke=Cancel &trust # wksConfirmationReq=Web Key Directory Confirmation Request # wksConfirmationReq.message=This message has been sent by your email provider to confirm deployment of your OpenPGP public key\nin their Web Key Directory.\nProviding your public key helps others to discover your key and thus being able to encrypt messages to you.\n\nIf you want to deploy your key in the Web Key Directory now, please click on the button "Confirm Request" in the status bar.\nOtherwise, simply ignore this message. # wksConfirmationReq.button.label=Confirm Request # autocryptSetupReq=Perform Autocrypt Setup # autocryptSetupReq.button.label=Start Setup # autocryptSetupReq.setupMsg.desc=This message contains all information to transfer your Autocrypt settings along with your secret key securely from your original device. # autocryptSetupReq.setupMsg.backup=You can keep this message and use it as a backup for your secret key. If you want to do this, you should write down the password and store it securely. # autocryptSetupReq.message.import=To import the settings and key(s) in Enigmail, please click on the "Start Setup" button in the status bar. # autocryptSetupReq.message.sent=Please click on the message on your new device and follow the instuctions to import the settings. # strings in pref-enigmail.js # oldGpgVersion20=Enigmail initialization failed.\n\nYou are using GnuPG version %1$S, which is not supported anymore. Enigmail requires GnuPG version %2$S or newer. Please upgrade your GnuPG installation, or Enigmail will not work. locateGpg=Nalézt program GnuPG invalidGpgPath=GnuPG nelze na uvedené cestÄ› spustit. Enigmail bude tedy proto vypnuto dokud nezmÄ›níte cestu ke GnuPG nebo dokud nerestartujete aplikaci. warningsAreReset=VÅ¡echna varování byla resetována. prefs.gpgFound=GnuPG bylo nalezeno v %S prefs.gpgNotFound=Nelze nalézt GnuPG prefs.warnAskNever=Varování: aktivací této volby docílíte toho, že zprávy budou odesílány nezaÅ¡ifrované bez ohlášení, jestliže nemáte klÃ­Ä pro nÄ›kterého z příjemců -- Enigmail Vás o tomto nebude nadále informovat! prefs.warnIdleTimeForUnknownAgent=Your system uses a specialized tool for passphrase handling such as gnome-keyring or seahorse-agent. Unfortunately Enigmail cannot control the passphrase timeout for the tool you are using. Therefore the respective timeout settings in Enigmail are disregarded. prefEnigmail.oneKeyserverOnly=Chyba - je možné urÄit pouze jeden keyserver pro automatické stahování chybÄ›jících klíÄů OpenPGP. # Strings used in core.jsm # (said file also re-uses some strings from above) enterAdminPin=NapiÅ¡te prosím PIN správce pro SmartCard enterCardPin=NapiÅ¡te prosím svůj PIN pro SmartCard notInit=Chyba! Služba Enigmail dosud nebyla inicializována badCommand=Chyba - Å¡ifrovací příkaz selhal cmdLine=příkazová řádka a výstup: notRequired=Chyba - Å¡ifrování není nutné notComplete=Chyba - generování klíÄe není jeÅ¡tÄ› dokonÄeno invalidEmail=Chyba - chybná e-mailová adresa/y noPassphrase=Chyba - nebylo vyplnÄ›no heslo noPGPblock=Chyba - nenalezen platný datový blok OpenPGP unverifiedReply=Odsazená Äást zprávy (odpovÄ›Ä) byla pravdÄ›podobnÄ› zmÄ›nÄ›na # keyInMessageBody=Key in message body found. Click 'Import Key' to import the key sigMismatch=Chyba - podpis nesouhlasí cantImport=Chyba pÅ™i importování veÅ™ejného klíÄe\n\n # doImportOne=Import %1$S (%2$S)? # doImportMultiple=Import the following keys?\n\n%S # previewFailed=Can't read public key file. # Strings used in errorHandling.jsm sc.wrongCardAvailable=SmartCard %S nalezená ve vaší ÄteÄky nemůže být použita pro zpracování zprávy.\nVložte prosím SmartCard %S a opakujte operaci. sc.insertCard=Operace vyžaduje VaÅ¡i SmartCard %s.\nVložte prosím požadovanou SmartCard a opakujte operaci. sc.removeCard=Operace vyžaduje, aby ve ÄteÄce nebyla žádná SmartCard.\nVyjmÄ›te prosím SmartCard a zopakujte operaci. sc.noCardAvailable=SmartCard ve ÄteÄce nebyla nalezena\nVložte prosím SmartCard a zopakujte operaci. sc.noReaderAvailable=Váše ÄteÄka SmartCard není přístupná\nPÅ™ipojte prosím ÄteÄku SmartCard, vložte kartu a operaci zopakujte. # keyError.keySpecNotFound=The email address "%S" cannot be matched to a key on your keyring. # keyError.keyIdNotFound=The configured key ID "%S" cannot be found on your keyring. # keyError.resolutionAction=Please select a valid key in the OpenPGP section of your Account Settings. # missingPassphrase=Missing passphrase # errorHandling.gpgAgentInvalid=Your system is running a version of gpg-agent that is not suitable for your GnuPG version. # errorHandling.gpgAgentError=GnuPG reported an error in the communication with gpg-agent (a component of GnuPG). # errorHandling.dirmngrError=GnuPG reported an error in the communication with dirmngr (a component of GnuPG). # errorHandling.pinentryError=GnuPG cannot query your passphrase via pinentry. # errorHandling.readFaq=This is a system setup or configuration error that prevents Enigmail from working properly and cannot be fixed automatically.\n\nWe strongly recommend that you consult our support web site at https://enigmail.net/faq. gpgNotFound=Nelze nalézt program GnuPG '%S'.\nUjistÄ›te se, zda máte správnÄ› zadanou cestu ke spustitelnému souboru GnuPG v nastavení Enigmail. gpgNotInPath=Nelze nalézt spustitelný soubor GnuPG v cestÄ› PATH.\nUjistÄ›te se, zda máte správnÄ› zadanou cestu ke spustitelnému souboru GnuPG v nastavení Enigmail. # enigmailNotAvailable=Enigmail core Service not available prefGood=SPRÃVNà podpis od %S prefBad=CHYBNà podpis od %S failCancel=Chyba - příjem klíÄe zruÅ¡en uživatelem failNoServer=Chyba - není urÄen keyserver pro pÅ™ijetí klíÄe failNoID=Chyba - není urÄeno ID, pro které pÅ™ijmout klÃ­Ä failKeyExtract=Chyba - extrakce klíÄe selhala notFirstBlock=Chyba - první blok OpenPGP není blok veÅ™ejného klíÄe importKeyConfirm=Importovat veÅ™ejný/é kliÄ(e) obsažený ve zprávÄ›? failKeyImport=Chyba - import klíÄe selhal fileWriteFailed=Selhal zápis do souboru %S importKey=Importovat veÅ™ejný klÃ­Ä %S z keyserveru: uploadKey=Poslat veÅ™ejný klÃ­Ä %S na keyserver: keyId=ID klíÄe keyAndSigDate=ID klíÄe: 0x%S / Podepsán: %S keyFpr=Otisk prstu klíÄe: %S noEmailProvided=Nezadal/a jste e-mailovou adresu! keyAlreadySigned=KlÃ­Ä je již podepsán, nemůžete jej ppodepsat dvakrát. ##################################################################### # Strings used in enigmailKeySelection.js ##################################################################### selKeyExpired=expirovaný %S createdHeader=VytvoÅ™en atLeastOneKey=Nebyl zvolen žádný klíÄ! Pro pÅ™ijetí tohoto dialogu vyberte alespoň jeden klÃ­Ä fewerKeysThanRecipients=Vybrali jste menší poÄet klíÄů než příjemců. Je jistÄ› seznam klíÄů k Å¡ifrování kompletní? userSel.button.goBack=Vybrat více klíÄů userSel.secretKeySel.title=Vyberte soukromý klÃ­Ä OpenPGP k podpisu svých zpráv # userSel.problemNoKey=No valid key # userSel.problemMultipleKeys=Multiple keys # should be same as thunderbird ENTITY sendLaterCmd.label: # sendLaterCmd.label=Send Later # Strings used in enigmailAttachmentDialog.js # pgpMimeNote=NOTE: PGP/MIME is not supported by all email clients. If you are unsure, select the %S option. first=první second=druhý # Strings used in am-enigprefs.js / enigmailEditIdentity.js encryptKeyHeader=UrÄit klÃ­Ä OpenPGP pro Å¡ifrování identityName=Identita: %S # switchPepMode=You are currently using the 'p≡p Junior' mode of Enigmail.\n\nBy enabling OpenPGP or S/MIME for an account, you are disabling p≡p and use the 'regular' mode of Enigmail without p≡p. # enableEnigmail=&Disable p≡p # Strings used in enigmailSingleRcptSettings.js noEncryption=Máte aktivováno Å¡ifrování, ale nevybral/a jste žádný klíÄ. K Å¡ifrování zprávy pro %S je tÅ™eba vybrat jeden nebo nÄ›kolik platných klíÄů ze seznamu. Chcete zakázat Å¡ifrování pro %S? noKeyToUse=(nic - žádné Å¡ifrování) noEmptyRule=Pravidlo nesmí být prázdné! Prosím nastavte e-mailovou adresu v poli pravidla. invalidAddress=Vložená/é e-mailová adresa/y je/jsou neplatná/é. Nelze vkládat jména příjemců, ale pouze e-mailové adresy. NapÅ™.:\nNeplatné: jmeno \nPlatné: jmeno@adresa.cz # noCurlyBrackets=The curly brackets {} have a special meaning and should not be used in an email address. If you want to modify the matching behavior for this rule, use the 'Apply rule if recipient ...' option.\nMore information is available from the Help button. # Strings used in enigmailRulesEditor.js never=Nikdy always=Vždy possible=Možný deleteRule=Opravdu smazat vybrané pravidlo? nextRcpt=(Další adresát) negateRule=Ne addKeyToRule=PÅ™idat klÃ­Ä %S (%S) k pravidlu podle příjemce # Strings used in enigmailSearchKey.js needOnline=Funkce, kterou jste zvolil/a, není dostupná v offline módu. PÅ™ejdÄ›te prosím do online módu a zkuste to znovu. protocolNotSupported=Protokol '%S://', který jste zvolil/a, není podporován pro stažení klíÄů OpenPGP. gpgkeysDisabled=Může vám pomoci povolit volbu 'extensions.enigmail.useGpgKeysTool' noKeyserverConn=Nelze se pÅ™ipojit na keyserver %S. keyDownloadFailed=Selhalo stažení klíÄe z keyserveru. Stavová zpráva:\n%S internalError=Vyskytla se vnitÅ™ní chyba. KlíÄe nelze stáhnout nebo importovat. noKeyFound=Je mi líto, ale nemohu nalézt žádný klíÄ, který by odpovídal zadaným kritériím pro vyhledávání.\nVÅ¡imnÄ›te si prosím, že ID klíÄe by mÄ›lo zaÄínat na \\"0x\\" (napÅ™. 0xABCDEF12). # keyDownload.keyUnavailable=We are sorry, but the key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their key by email. # gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. gpgKeysFailed=Selhalo hledání nebo stahování klíÄe z keyserveru: gpgkeys_%S nelze spustit. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Nastavení důvÄ›ryhodnosti selhalo # Strings in enigmailSignKeyDlg.js signKeyFailed=Podepsání klíÄe selhalo alreadySigned.label=UpozornÄ›ní: klÃ­Ä %S je již podepsán oznaÄeným soukromým klíÄem. # alreadySignedexportable.label=Note: the key %S is already signed exportable with the selected secret key. A local signature does not make sense. # partlySigned.label=Note: some user IDs of key %S are already signed with the selected secret key. # noTrustedOwnKeys=No eligible key found for signing! You need at least one fully trusted secret key in order to sign keys. # Strings in enigmailKeyManager.js keyMan.loadingKeys=NaÄítání klíÄů, Äekejte prosím ... keyValid.unknown=neznámý keyValid.invalid=neplatný keyValid.disabled=zakázaný keyValid.revoked=revokovaný keyValid.expired=expirovaný keyValid.noSubkey=žádný platný podklÃ­Ä keyTrust.untrusted=nedůvÄ›ryhodný keyTrust.marginal=okrajovÄ› keyTrust.full=plnÄ› důvÄ›ryhodný keyTrust.ultimate=absolutnÄ› důvÄ›ryhodný keyTrust.group=(skupina) keyType.public=veÅ™ejný keyType.publicAndSec=veÅ™ejný/soukromý keyMan.enableKey=Povolit klÃ­Ä keyMan.disableKey=Zakázat klÃ­Ä userAtt.photo=Znak uživatele (JPEG obrázek) asciiArmorFile=Soubory kódované ASCII (*.asc) importKeyFile=Importovat klÃ­Ä OpenPGP ze souboru gnupgFile=Soubory GnuPG # createKeyOK=Your Key has been generated saveRevokeCertAs=VytvoÅ™it a uložit revokaÄní certifikát # revokeCertOK=The revocation certificate has been successfully created. You can use it to invalidate your public key, e.g. in case you would lose your secret key. revokeCertFailed=RevokaÄní certifikát nemohl být vytvoÅ™en. addUidOK=ÚspěšnÄ› přídáno ID uživatele addUidFailed=Selhalo pÅ™idání ID uživatele noKeySelected=K provedení operace byste mÄ›l/a vybrat aspoň jeden klÃ­Ä exportToFile=Exportovat veÅ™ejný klÃ­Ä do souboru # exportKeypairToFile=Export Secret and Public Key To File exportSecretKey=PÅ™ejete si do uloženého souboru s klíÄem OpenPGP zahrnout i soukromý klíÄ? saveKeysOK=KlíÄe byly úspěšnÄ› uloženy saveKeysFailed=Uložení klíÄů selhalo importKeysFailed=Importování klíÄů selhalo enableKeyFailed=Povolení/zakázání klíÄů selhalo specificPubKeyFilename=%S (0x%S)_verejny specificPubSecKeyFilename=%S (0x%S)_verejny-soukromy defaultPubKeyFilename=Exportovane-verejne-klice defaultPubSecKeyFilename=Exportovany-verejny-a-soukromy-klic noSecretKeys=Nebyly nalezeny žádné soukromé klíÄe.\n\nPÅ™ejete si nyní vytvoÅ™it svůj vlastní klíÄ? sendKeysOk=KlíÄ/e byly úspěšnÄ› odeslány sendKeysFailed=Odeslání klíÄů selhalo receiveKeysOk=KlíÄ/e úspěšnÄ› aktualizovány receiveKeysFailed=Stažení klíÄů selhalo importFromClip=PÅ™ejete si importovat nÄ›který/é klíÄ/e ze schránky? # importFromUrl=Download public key from this URL: copyToClipbrdFailed=Zvolený/é klíÄ/e nelze kopírovat do schránky. copyToClipbrdOK=KlíÄe byly zkopírovány do schránky deleteSecretKey=Varování: Snažíte se smazat soukromý klíÄ!\nJestliže smažete svůj soukromý klíÄ, nebudete moci dále deÅ¡ifrovat zprávy zaÅ¡ifrované pro tento klÃ­Ä ani klÃ­Ä revokovat.\n\nPÅ™ejete si opravdu smazat oba klíÄe (veÅ™ejný i soukromý)\n'%S'? deleteMix=POZOR: Pokoušíte se smazat soukromé klíÄe!\nJestliže smažete svůj soukromý klíÄ, nebudete moci dále deÅ¡ifrovat zprávy zaÅ¡ifrované pro tento klíÄ.\n\nOpravdu si pÅ™ejte smazat Vámi zvolený veÅ™ejný a soukromý klíÄ? deletePubKey=PÅ™ejete si smazat tento veÅ™ejný klíÄ\n'%S'? deleteSelectedPubKey=PÅ™ejete si smazat tyto veÅ™ejné klíÄe? deleteKeyFailed=KlÃ­Ä nelze smazat # revokeKeyQuestion=You are about to revoke the key '%S'.\n\nYou will no longer be able to sign with this key, and once distributed, others will no longer be able to encrypt with that key. You can still use the key to decrypt old messages.\n\nDo you want to proceed? revokeKeyOk=KlÃ­Ä byl revokován. Jestliže je tento klÃ­Ä dostupný také na keyserveru, je doporuÄeno odeslat jej tam znovu, abyste dal/a i ostatním uživatelům vÄ›det o revokaci. revokeKeyFailed=KlÃ­Ä nelze revokovat # revokeKeyNotPresent=You have no key (0x%S) which fits to this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before the revocation certificate! # revokeKeyAlreadyRevoked=The key 0x%S has already been revoked. refreshAllQuestion=Nevybral/a jste žádný klíÄ. PÅ™ejete si obnovit seznam vÅ¡ech klíÄů? # refreshKeyServiceOn.warn=Warning: Your keys are currently being refreshed in the background as safely as possible.\nRefreshing all your keys at once will unnecessarily reveal information about you.\nDo you really want to do this? refreshKey.warn=POZOR: v závislosti na poÄtu klíÄů a rychlosti pÅ™ipojení k internetu může trvat obnovení seznamu vÅ¡ech klíÄů delší dobu! downloadContactsKeys.warn=Warning: depending on the number of contacts and the connection speed, downloading all keys could be quite a lengthy process! # downloadContactsKeys.importFrom=Import contacts from address book '%S'? keyMan.button.exportSecKey=Exportovat &soukromé klíÄe keyMan.button.exportPubKey=Exportovat &pouze veÅ™ejné klíÄe keyMan.button.import=&Importovat keyMan.button.refreshAll=&Znovu naÄíst vÅ¡echny klíÄe keyMan.button.revokeKey=&Revokovat klÃ­Ä # keyMan.button.skip=&Skip Key keylist.noOtherUids=Nemá jiné identity keylist.hasOtherUids=Další identita keylist.noPhotos=Fotografie není dostupná keylist.hasPhotos=Foto keyMan.addphoto.filepicker.title=Vyberte fotografii pro vložení keyMan.addphoto.warnLargeFile=Vybrali jste soubor vÄ›tší než 25kB.\nNení doporuÄeno pÅ™ipojovat příliÅ¡ velké soubory, protože se tím klíÄe stávají velmi objemné. keyMan.addphoto.noJpegFile=Vybraný soubor zÅ™ejmÄ› není JPEG. Vyberte jiný soubor. keyMan.addphoto.failed=Soubor nelze vloÅ™it. # noWksIdentity=The key %S does not have a WKS identity. # keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key "%1$S (%2$S)" for encrypting messages? # keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key "%1$S (%2$S)" for future messages? # keyman.addBlacklistKey.button=&Blacklist the key # keyman.removeBlacklistKey.button=&Remove key from Blacklist # Strings in enigmailManageUidDlg.xul changePrimUidFailed=ZmÄ›na výchozího ID uživatele selhala changePrimUidOK=ZmÄ›na výchozího ID uživatele probÄ›hla úspěšnÄ› revokeUidFailed=Revokace ID uživatele %S selhalo revokeUidOK=ID uživatele %S bylo úspěšnÄ› revokováno. Jestliže je tento klÃ­Ä dostupný také na keyserveru, je doporuÄeno odeslat jej tam znovu, aby se i ostatní o revokaci dozvÄ›dÄ›li. revokeUidQuestion=JistÄ› si pÅ™ejete revokovat ID uživatele %S? # Strings in enigmailKeyImportInfo.xul # importInfoTitle=SUCCESS! Keys imported # importInfoBits=Bits # importInfoCreated=Created # importInfoFpr=Fingerprint # importInfoDetails=(Details) # importInfoNoKeys=No keys imported. # Strings in enigmailKeyDetailsDlg.xul keyTypePublic=veÅ™ejný klÃ­Ä keyTypePrimary=hlavní kÃ­Ä keyTypeSubkey=podklÃ­Ä keyTypePair=pár klíÄů keyExpiryNever=nikdy keyAlgorithm_1=RSA keyAlgorithm_2=RSA keyAlgorithm_3=RSA keyAlgorithm_16=ELG keyAlgorithm_17=DSA # keyAlgorithm_18=ECDH # keyAlgorithm_19=ECDSA keyAlgorithm_20=ELG # keyAlgorithm_22=EDDSA keyUsageEncrypt=Å ifrování keyUsageSign=Podepisování keyUsageCertify=Potvrdit keyUsageAuthentication=Ověřování # keyDoesNotExpire=Key does not expire # Strings in enigmailGenCardKey.xul keygen.started=Prosím poÄkejte, klÃ­Ä se zaÄal vytvářet .... keygen.completed=KlÃ­Ä vytvoÅ™en. Nový klÃ­Ä má ID: 0x%S keygen.keyBackup=KlÃ­Ä byl zazálohován jako %S keygen.passRequired=Jestliže chcete vytvoÅ™it záložní kopii VaÅ¡eho klíÄe mimo SmartCard, napiÅ¡te prosím heslo. # Strings in enigmailSetCardPin.xul cardPin.processFailed=ZmÄ›na PIN selhala # Strings in enigRetrieveProgres.xul keyserverProgress.refreshing=Obnovují se klíÄe, prosím Äekejte ... keyserverProgress.uploading=Odesílání klíÄů, prosím Äekejte ... # keyserverProgress.wksUploadFailed=Could not upload your key to the Web Key Service # keyserverProgress.wksUploadCompleted=Your public key was successfully submitted to your provider. You will receive an email to confirm that you initiated the upload. keyserverTitle.refreshing=Obnovit klíÄe keyserverTitle.uploading=Odesílání klíÄe # Strings in enigmailSetupWizard passphrase.min8keys=VaÅ¡e heslo je kratší než 8 znaků! setupWizard.reallyCancel=Opravdu si pÅ™ejete ukonÄit průvodce nastavením Enigmail? setupWizard.invalidGpg=Soubor, který jste zadali, není spustitelný GnuPG. Zadejte prosím jiný soubor. setupWizard.specifyFile=Abyste mohli pokraÄovat, potÅ™ebujete urÄit alespoň soubor s veÅ™ejným klíÄem. setupWizard.installFailed=Zdá se, že instalace nebyla úspěšná. Prosím, buÄ opakovat instalaci nebo nainstalovat GnuPG ruÄnÄ› a lokalizovat pomocí tlaÄítka Procházet. # setupWizard.downloadForbidden=For your own security, we will not download GnuPG. Please visit https://gnupg.org/ in order to download GnuPG. # setupWizard.downloadImpossible=We cannot download GnuPG currently. Please try later or visit https://gnupg.org/ in order to download GnuPG. setupWizard.hashSumError=Průvodce nemohl ověřit integritu staženého souboru.Soubor může být poÅ¡kozen nebo maniuplated. Chcete pokraÄovat pÅ™esto v instalaci ? # setupWizard.importSettingsFile=Specify backup file to load from # setupWizard.invalidSettingsFile=The specified file is not a correct Enigmail Settings backup file. # setupWizard.gpgConfExists=The GnuPG config file already exists. Do you want to overwrite it with the one from your old installation? # setupWizard.noGpgHomeDir=It appears that you configured %S to use for GnuPG. However, this is not a directory - you cannot use it. # setupWizard.unmachtedIds=The following identities of your old setup could not be matched:\n%S\nThe settings for these identities were skipped. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=Chyba ocurred pÅ™i pokusu o stažení GnuPG. Zkontrolujte prosím konzoly protokol pro další podrobnosti. installGnuPG.installFailed=Chyba pÅ™i instalaci GnuPG ocurred. Zkontrolujte konzole protokol pro další podrobnosti. # Strings in enigmailAddUidDlg.xul addUidDlg.nameOrEmailError=Musíte vyplnit jméno a e-mailovou adresu addUidDlg.nameMinLengthError=Jméno musí mít alespoň 5 znaků addUidDlg.invalidEmailError=Musíte zadat platnou e-mailovou adresu # Strings in enigmailCardDetails.js # Carddetails.NoASCII=OpenPGP Smartcards only support ASCII characters in Firstname/Name. # network error types errorType.SecurityCertificate=Certifikát zabezpeÄení pÅ™edložený webové službÄ› není platný. errorType.SecurityProtocol=BezpeÄnostní protokol používaný webovou službou není znám. errorType.Network=DoÅ¡lo k chybÄ› sítÄ›. # filter stuff # filter.folderRequired=You must select a target folder. # filter.decryptMove.label=Decrypt permanently (Enigmail) # filter.decryptCopy.label=Create decrypted Copy (Enigmail) # filter.decryptMove.warnExperimental=Warning - the filter action "Decrypt permanently" may lead to destroyed messages.\n\nWe strongly recommend that you first try the "Create decrypted Copy" filter, test the result carefully, and only start using this filter once you are satisified with the result. # filter.tempPepFilterDesc=Temporary filter to store sent message unencrypted # filter.term.pgpencrypted.label=OpenPGP Encrypted # filter.encrypt.label=Encrypt to key (Enigmail) # filter.keyRequired=You must select a recipient key. # filter.keyNotFound=Could not find an encryption key for "%S". # filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for "%S" you will no longer be able to read the emails. # strings in enigmailConvert.jsm # converter.decryptBody.failed=Could not decrypt message with subject\n"%S".\nDo you want to retry with a different passphrase or do you want to skip the message? # converter.decryptAtt.failed=Could not decrypt attachment "%1$S"\nof message with subject\n"%2$S".\nDo you want to retry with a different passphrase or do you want to skip the message? # saveLogFile.title=Save Log File # strings in gpg.jsm # unknownSigningAlg=Unknown signing algorithm (ID: %S) # unknownHashAlg=Unknown cryptographic hash (ID: %S) # strings in keyRing.jsm # keyring.photo=Photo # keyRing.pubKeyRevoked=The key %1$S (key ID %2$S) is revoked. # keyRing.pubKeyExpired=The key %1$S (key ID %2$S) has expired. # keyRing.pubKeyNotForSigning=The key %1$S (key ID %2$S) cannot be used for signing. # keyRing.pubKeyNotForEncryption=The key %1$S (key ID %2$S) cannot be used for encryption. # keyRing.keyDisabled=The key %1$S (key ID %2$S) is disabled; it cannot be used. # keyRing.keyNotTrusted=The key %1$S (key ID %2$S) is not trusted enough. Please set the trust level of your key to "ultimate" to use it for signing. # keyRing.keyInvalid=The key %1$S (key ID %2$S) is not valid. Please consider verifying it correctly. Alternatively use the Default encryption settings in the Enigmail preferences dialog. # keyRing.signSubKeysRevoked=All signing-subkeys of key %1$S (key ID %2$S) are revoked. # keyRing.signSubKeysExpired=All signing-subkeys of key %1$S (key ID %2$S) have expired. # keyRing.signSubKeysUnusable=All signing-subkeys of key %1$S (key ID %2$S) are revoked, expired or otherwise unusable. # keyRing.encSubKeysRevoked=All encryption subkeys of key %1$S (key ID %2$S) are revoked. # keyRing.encSubKeysExpired=All encryption subkeys of key %1$S (key ID %2$S) have expired. # keyRing.noSecretKey=You do not seem to have the secret key for %1$S (key ID %2$S) on your keyring; you cannot use the key for signing. # keyRing.encSubKeysUnusable=All encryption subkeys of key %1$S (key ID %2$S) are revoked, expired or otherwise unusable. #strings in exportSettingsWizard.js # cannotWriteToFile=Cannot save to file '%S'. Please select a different file. # dataExportError=An error occurred during exporting your data. # enigmailSettings=EnigmailSettings # defaultBackupFileName=Enigmail-export # specifyExportFile=Specify file name for exporting # homedirParamNotSUpported=Additional params that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. #strings in expiry.jsm # expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use the new key. # expiry.keysExpireSoon=The following of your keys will expire in less than %1$S days:\n%2$S We recommend that you create new keys and configure your accounts to use the new keys. # expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to ultimate in key properties. # expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to ultimate in key properties. # expiry.OpenKeyManager=Open Enigmail Key Management # expiry.OpenKeyProperties=Open Key Properties #strings in pEpDecrypt.jsm # pEpDecrypt.cannotDecrypt=This is an encrypted message. Unfortunately you don't have the secret key to decrypt the message. #strings in gpgAgent.jsm # gpghomedir.notexists=The directory '%S' containing your OpenPGP keys does not exist and cannot be created. # gpghomedir.notwritable=The directory '%S' containing your OpenPGP keys is not writable. # gpghomedir.notdirectory=The directory '%S' containing your OpenPGP keys is a file instead of a directory. # gpghomedir.notusable=Please fix the directory permissions or change the location of your GnuPG "home" directory. GnuPG cannot work correctly otherwise. #strings in pepTrustWords.js # pepTrustWords.cannotVerifyOwnId=Cannot verify p≡p Trustwords for own account. # pepTrustWords.cannotFindKey=Cannot find key for %S. # pepTrustWords.cannotStoreChange=Could not change trust for %S. # pepTrustWords.generalFailure=Cannot obtain trustwords for %S. # pepTrustWords.partnerFingerprint=Fingerprint for %S: #strings in mimeWkdHandler.jsm # wkdMessage.body.req=Your email provider processed your request to upload your public key to the OpenPGP Web Key Directory.\n\nPlease click the confirmation button in the Enigmail header to complete the publishing of your public key. # wkdMessage.body.process=This is an email related to the automatic processing to upload your public key to the OpenPGP Web Key Directory.\n\nYou do not need to take any manual action at this point. #strings in pepHandshake.js # pepPrivacyStatus.RatingBrokenSuggestion=Either you or the sender should resend the message. # pepPrivacyStatus.RatingHaveNoKeySuggestionOutgoing=If you composed this message, your key is not available. # pepPrivacyStatus.RatingMistrustSuggestion=Re-establish the connection with your communication partner and try to complete another handshake. # pepPrivacyStatus.RatingReliableSuggestion=Complete a handshake with your communication partner by exchanging trustwords in person or over the phone. A handshake is needed only once per partner and will ensure secure and trusted communication. # pepPrivacyStatus.RatingTrustedSuggestion=No action needed! # pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware this message may not be secure. # pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Please add the necessary information. # pepPrivacyStatus.RatingUnderAttackSuggestion=Separately verify the content of this message with your communication partner. # pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least secure. # pepPrivacyStatus.RatingUnencryptedSuggestion=Please ask your communication partner to use an encryption solution or install p≡p. # pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or no signature. Ask your communication partner to upgrade their encryption solution or install p≡p. # pepPrivacyStatus.RatingBrokenExplanation=This message has broken encryption or formatting. # pepPrivacyStatus.RatingHaveNoKeyExplanation=This message cannot be decrypted because the key is not available. # pepPrivacyStatus.RatingMistrustExplanation=This message has a communication partner that has previously been marked as mistrusted. # pepPrivacyStatus.RatingReliableExplanation=This message is secure but you still need to verify the identity of your communication partner. # pepPrivacyStatus.RatingTrustedExplanation=This message is secure and trusted. # pepPrivacyStatus.RatingUndefinedExplanation=This message does not contain enough information to determine if it is secure. # pepPrivacyStatus.RatingUnderAttackExplanation=This message is not secure and has been tampered with. # pepPrivacyStatus.RatingUnencryptedExplanation=This message is unsecure. # pepPrivacyStatus.RatingUnencryptedForSomeExplanation=This message is unsecure for some communication partners. # pepPrivacyStatus.RatingUnreliableExplanation=This message has unreliable protection. # pepPrivacyStatus.RatingBrokenText=Broken # pepPrivacyStatus.RatingHaveNoKeyText=Cannot Decrypt # pepPrivacyStatus.RatingMistrustText=Mistrusted # pepPrivacyStatus.RatingReliableText=Secure # pepPrivacyStatus.RatingTrustedText=Secure & Trusted # pepPrivacyStatus.RatingUndefinedText=Unknown # pepPrivacyStatus.RatingUnderAttackText=Under Attack # pepPrivacyStatus.RatingUnencryptedForSomeText=Unsecure for Some # pepPrivacyStatus.RatingUnencryptedText=Unsecure # pepPrivacyStatus.RatingUnreliableText=Unreliable Security # handshakeDlg.button.initHandshake=Handshake... # handshakeDlg.button.stopTrust=Stop Trusting # handshakeDlg.button.reTrust=Stop Mistrusting # handshakeDlg.label.outgoingMessage=Outgoing message # handshakeDlg.label.incomingMessage=Incoming message # handshakeDlg.error.noPeers=Cannot handshake without any correspondents. # handshakeDlg.error.noProtection=Please enable protection in order to use the Handshake function. # enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device # enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup #strings in autocrypt.jsm # autocrypt.setupMsg.subject=Autocrypt Setup Message # autocrypt.setupMsg.msgBody=To set up your new device for Autocrypt, please follow the instuctions that should be presented by your new device. # autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code presented on your old device, and then import the contained key into your keyring. #strings in upgradeInfo.html # upgradeInfo.doctitle=What's New in Enigmail v2.0? # upgradeInfo.welcome1=Welcome to the new Enigmail version 2.0! # upgradeInfo.welcome2=The release contains a lot of new and changed features. Please take a minute to find out what's new: # upgradeInfo.encSubject.title=Encrypting the Message Subject # upgradeInfo.encSubject.desc=We developed a new method that moves the email subject into the encrypted message, and replaces the visible subject with "Encrypted Message". Once such a message is decrypted, the original subject is replaced automatically. Hiding the subject is on by default; there is a preference to turn it off if you don't like it. (Note: this feature requires the message to be sent with PGP/MIME.) # upgradeInfo.buttons.title=Changed behavior of Encrypt and Sign Buttons # upgradeInfo.buttons.desc=The Encrypt and Sign buttons in the message composer window now work for both the OpenPGP and S/MIME protocols. If both algorithms are possible, then Enigmail will try to prefer the one for which all keys are available. # upgradeInfo.autocrypt.title=Support for Autocrypt # upgradeInfo.autocrypt.desc=Enigmail now supports Autocrypt, a new standard to distribute keys as part of sent messages. Enigmail automatically imports keys from Autocrypt-compliant messages, such that over time more and more emails can be encrypted. # upgradeInfo.pEp.title=New p≡p Junior Mode (Pretty Easy Privacy) # upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. You currently need to manually install p≡p for this purpose; this will change in a future release. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. # upgradeInfo.bottom.desc=Please visit our documentation for help on using Enigmail. # pep.missingGnuPG=In order to use Enigmail/p≡p, GnuPG is required. As we could not find it, we suggest to download and install it for you. #strings in enigmailAbout.html # aboutEnigmail.tabName=About Enigmail # aboutEnigmail.title=OpenPGP support provided by Enigmail # aboutEnigmail.team=Enigmail is developed by the Enigmail Team: # aboutEnigmail.projectLeader=Lead Developer: # aboutEnigmail.usability=Usability: # aboutEnigmail.documentation=Documentation: # aboutEnigmail.testing=Testing: # aboutEnigmail.userSupport=User Support: # aboutEnigmail.localization=Localization: See the Enigmail Language Packs page # aboutEnigmail.Credits=Credits: # aboutEnigmail.origAuthor=Original author of the Enigmail extension # aboutEnigmail.icons=Icons: # aboutEnigmail.formerMembers=Former team members: # aboutEnigmail.projectHosting=Project hosting: # aboutEnigmail.licenseSupportTitle=License & Support # aboutEnigmail.license=Enigmail OpenPGP is open source and licensed under the %S # aboutEnigmail.support=Support and download is available from www.enigmail.net. enigmail-2.0.8/lang/cs/help/000077500000000000000000000000001334302754500155725ustar00rootroot00000000000000enigmail-2.0.8/lang/cs/help/compose.html000066400000000000000000000115001334302754500201220ustar00rootroot00000000000000 NápovÄ›da pro Enigmail - psaní zpráv

Nápověda pro Enigmail

Použití Enigmailu při psaní zprávy

menu OpenPGP v okně Zpráva/Nová zpráva
Podepsat zprávu
Povolit / zakázat podepsat odesílanou zprávu. Pokud digitální podpis selže, je o tom uživatel informován.
Šifrovat zprávu

Povolit / zakázat Å¡ifrování zprávy pro vÅ¡echny příjemce pÅ™ed zasláním. Pokud Å¡ifrování selže, je uživatel o této zkuteÄnosti informován.

PÅ™i nastavené volbÄ› Zobraz výbÄ›r, když je tÅ™eba v menu PÅ™edvolby-> záložka VýbÄ›r klíÄe se pÅ™i odesílání poÅ¡ty zobrazí seznam klíÄů pro Å¡ifrování zprávy, pokud jsou v seznamu příjemců poÅ¡ty adresáti, jejichž veÅ™ejný klÃ­Ä nemáte.

PÅ™i nastavené volbÄ› Nikdy nezobrazovat výbÄ›r OpenPGP klíÄe v menu PÅ™edvolby -> záložka VýbÄ›r klíÄe se odeÅ¡le zpráva nezaÅ¡ifrovaná, pokud jsou v seznamu příjemců poÅ¡ty adresáti, jejichž veÅ™ejný klÃ­Ä nemáte.

Použít PGP/MIME pro tuto zprávu
Povolit / zakázat použití PGP/MIME pro tuto zprávu..

Pokud víte, že příjemce dokáže pÅ™eÄíst poÅ¡tu, která používá PGP/MIME formát, můžete tento formát použít.

Tato volba je povolena, pokud na záložce Předvolby -> PGP/MIME tab je nastaveno Povolit použití PGP/MIME nebo Vždy použít PGP/MIME.

Výchozí nastavení tvorby zpráv
  • Nastavení podepisování/Å¡ifrování...: menu Nástroje -> Nastavení úÄtu -> OpenPGP/Enigmail
  • Nastavení odesílání...:-> záložky PÅ™edvolby -> Odesílání
  • Nastavení výbÄ›ru klíÄe...:-> záložky PÅ™edvolby -> VýbÄ›r klíÄe
  • PGP/MIME nastavení...:-> záložky PÅ™edvolby -> PGP/MIME
Zpět šifrování

Pokud při zasílání pošty dojde k chybě, například když POP server nepřijme požadavek, Enigmail o tom nebude vědět, a zašifrovaná zpráva zůstane zobrazena v okně Psaní zprávy. Zvolením této položky menu dojde ke zrušení šifrování a podepsání, což se projeví zobrazením původního (nezašifrovaného) textu v okně psaní zprávy.

Tato volba může být použita takě jako nouzová oprava, pokud odpovídáte na zašifrovanou zprávu. Enigmail dešifruje citovanou zprávu automaticky, ale pokud z nějakého důvodu dešifrování neproběhne, může být tato volba použita k vynucenému dešifrování zprávy.

PÅ™ipojit veÅ™ejný klíÄ
Zobrazí se seznam veÅ™ejných klíÄů, které můžete pÅ™ipojit k vytvářené zprávÄ›. Pokud zvolíte jediný klíÄ, pÅ™ipojí se ke zprávÄ› soubor s názvem 0xkey_id.asc (kde key_id je Äíselný identifikátor zvoleného klíÄe ), který obsahuje ASCII-armoredy text zvolného klíÄe. Pokud vyberete více klíÄů, pÅ™ipojí se soubor s názvem pgpkeys.asc, který obsahuje ASCII-armored text se vÅ¡emi klíÄi.
Smazat uložené heslo
Dojde k odstranÄ›ní doÄasnÄ› uloženého hesla k soukromému klíÄi. To je užiteÄné zejména pokud máte více hesel.
Nápověda
Zobrazí nápovědu jako webovou stránku (tato stránka).

Další nápověda je dostupná na stránkách dokumentace Enigmailu (anglicky).

enigmail-2.0.8/lang/cs/help/editRcptRule.html000066400000000000000000000121621334302754500210700ustar00rootroot00000000000000 Nápověda pro Enigmail - úprava pravidel OpenPGP

Nápověda pro Enigmail

Používání editoru pravidel v Enigmailu: úprava pravidel OpenPGP

V editoru pravidel můžete pro každého příjemce nastavit výchozí chování Enigmailu tak, že povolíte Å¡ifrování, podpis, PGP/MIME a urÄíte klíÄ(e) OpenPGP, který se bude pro daného příjemce používat. Zde můžete urÄit pravidla pro jednotlivé příjemce a pro skupiny příjemců s podobnými charfakteristikami.

Nastavit OpenPGP pravidla pro
Pole obsahuje emailové adresy příjemců (bez jmen, t.j. pouze adresu ve tvaru jmeno@domena.cz). Můžete uvést nÄ›kolik emailových adres oddÄ›lených mezerami. Adresy mohou obsahovat pouze doménovou Äást, takže pravidlo odpovídá vÅ¡em adresátům dané domény, napÅ™.@domena.cz zahrnuje adresy jmeno@domena.cz, jine_jmeno@domena.cz, atd.
Použij pravidlo jestliže adresát ...
Upravuje hledání emailových adres, na které se budou v pravidlech používat. Pokud zapíšete více adres, nastavení se aplikuje na všechny. Následující příklady vycházejí z příkladu adresy jmeno@domena.cz.
  • Je pÅ™esnÄ›: s tímto nastavením bude pravidlo použito, pokud email adresáta je pÅ™esnÄ› jmeno@domena.cz (nezávisí na použití velkých a malých písmen v emailové adrese).
  • Obsahuje: s tímto nastavením bude pravidlo použito pro každou emailovou adresu, která obsahuje zadaný text, t.j. moje-jmeno@domena.cz nebo jmeno@domena.cz.com.
  • ZaÄíná s: s tímto nastavením bude pravidlo použito pro každou emailovou adresu, která zaÄíná zadaným textem t.j. jmeno@domena.cz, jmeno@domena.cz.com.
  • KonÄí s: s tímto nastavením bude pravidlo použito pro každou emailovou adresu, která konÄí zadaným textem t.j. moje-jmeno@domena.cz , jmeno@domena.cz.
PokraÄovat s dalším pravidlem k daným adresám
Tato akce umožní definovat pravidlo a nezadat ID klíÄe ve vstupním poli Použít následující klíÄe OpenPGP:. Odpovídající klÃ­Ä bude podle emailové adresy urÄen pÅ™i odesílání zprávy. Pro urÄenou(é) adresu(y) se také zpracují další pravidla.
Nekontrolovat dále pravidla k dané adrese
UkonÄí zpracování dalších pravidel pro zvolenou adresu, zaÄne se zpracovávat další adresa příjemce.
Použít následující OpenPGP klíÄe:
Pomocí tlaÄítka Vybrat klíÄ(e)... vyberte klíÄe, které budou použity k Å¡ifrování. StejnÄ› jako v pÅ™edchozím případÄ› se již nepoužijí pro odpovídající adresu další pravidla.
Výchozí pro podepisování
Povolit / zakázat podepsání zprávy. To, zda dojde k podepsání zprávy, závisí na nastavení podepisovámí v okně Psání zprávy a na vybrané hodnotě z těchto možností:
  • Nikdy: zakáže podepsání zprávy bez ohledu na to, jaká volba je v oknÄ› psaní zprávy. Tato volba potlaÄuje ostatní.
  • Ano, jestliže je to povoleno pÅ™i vytváření zprávy: podepisování zprávy je povoleno a závisí na další volbÄ›, která bude nastavena v oknÄ› psaní zprávy.
  • Vždy: zpráva bude podepsána bez ohledu na to, jaká je volba v oknÄ› psaní zprávy
Toto nastavení podpisu bude použito pro všechna odpovídající pravidla. Jestliže jedno z pravidel zakáže podepsání, zpráva nebude podepsána bez ohledu na to, zda v ostatních pravidlech je nastavena volba Vždy.
Šifrování
Povolit / zakázat šifrování zprávy. Nastavení šifrování a jeho význam jsou podobné jako nastavení podepisování.
PGP/MIME
Povolit / zakázat kódování zprávy pomocí PGP/MIME (RFC 3156). Pokud je PGP/MIME zakázáno, zpráva je kódována použitím "vkládaného PGP" ("inline PGP"). Nastavení a jeho význam jsou podobné jako nastavení podepisování.

Pravidla jsou zpracována v poÅ™adí podle uvedeného seznamu. Vždy, když pravidlo odpovídá příjemci a obsahuje ID klíÄe OpenPGP, příjemce se již kromÄ› použití urÄeného klíÄe v dalších pravidlech nezpracovává.


Další nápověda je dostupná na stránkách dokumentace Enigmailu (anglicky).

enigmail-2.0.8/lang/cs/help/messenger.html000066400000000000000000000102041334302754500204450ustar00rootroot00000000000000 NápovÄ›da pro Enigmail - Ätení zpráv

Nápověda pro Enigmail

Používání Enigmailu pÅ™i Ätení zpráv

TlaÄítko "DeÅ¡ifrovat" v hlavním oknÄ›
Toto tlaÄítko má nÄ›kolik funkcí: deÅ¡ifrování, ověřování nebo import veÅ™ejných klíÄů. NormálnÄ› probíhá deÅ¡ifrování/ověřování automaticky, ovÅ¡em tato funkce může být v pÅ™edvolbách zakázána. Pokud nastane chyba, zobrazí se krátká zpráva ve stavovém řádku Enigmailu. Pokud klepnete na tlaÄítko "DeÅ¡ifrovat", zobrazí se podrobnÄ›jší výpis chyb vÄetnÄ› GnuPG příkazů.
Ikony pera a klíÄe zobrazené v hlaviÄce zprávy
Ikony Pera a KlíÄe ikony pera a klíÄe v hlaviÄce zprávy indikují zda zpráva, kterou Ätete, je podepsána a/nebo Å¡ifrována a zda je podpis platný, tj., že zpráva nebyla od okamžiku podpisu zmÄ›nÄ›na. Ikona zlomného pera indikuje, že zpráva má neplatný podpis nebo byla zmÄ›nÄ›na. Pokud klepnete pravým tlaÄítkem na ikonu pera nebo klíÄe zobrazí se menu s následujícími možnostmi:
  • BezpeÄnostní informace: zobrazí výstup GnuPG pro tuto zprávu.
  • Kopírovat bezpeÄnostní informace OpenPGP: zkopíruje výstup z GnuPG do schránky; umožní například vložení do odpovÄ›di na zprávu.
  • Zobrazit Foto ID: zobrazí Photo ID osoby, která zprávu poslala, jestliže jej veÅ™ejný klÃ­Ä obsahuje. (Tato volba je dostupná pouze pokud je fotografie ve veÅ™ejném klíÄi uložena.)
  • BezpeÄnostní informace S/MIME: zobrazí bezpeÄnostní informace S/MIME.

Jestliže v souboru gpg.conf nemáte nastaveno automatické naÄítání klíÄů z keyserveru a Ätete elektronicky podepsáné nebo Å¡ifrováné zprávy, uvidíte panelu zprávy ikonku pera s otazníkem a v horní Äásti se zobrazí: Část zprávy byla podepsána; klepnÄ›te na ikonku pera nebo klíÄe pro více informací. Ve zprávÄ› se zobrazí znaÄky úseku textu OpenPGP a blok podpisu.

Může se to stát i v případÄ›, že máte nastaveno automatické naÄítání klíÄů z keyserveru, ale klÃ­Ä není na serveru k dispozici.

Klepnutím na ikonku pera a otazníku se Vám zobrazí hlášení že klíÄ, kterým byla zpráva podepsána, není dostupný. Klepnutím na tlaÄítko OK se dostanete k dalšímu oknu, kde si můžete ze seznamu keyserverů vybrat odkud veÅ™ejný klÃ­Ä odesílatele stáhnout.

Seznam keyserverů, které chcete používat, nastavíte v menu OpenPGP -> PÅ™edvolby... -> UrÄete Váš/VaÅ¡e keyservery, adresy napiÅ¡te do řádku Keyserver(y):. Více adres oddÄ›lte Äárkou. Jako výchozí bude použit první keyserver.

OtevÅ™ení Å¡ifrovaných příloh / import pÅ™iložených klíÄů OpenPGP
Přílohy pojmenované *.pgp, *,asc a *.gpg je OpenPGP schopno rozeznat a zpracovat. Kliknutím pravým tlaÄítkem myÅ¡i na přílohu dostanete dvÄ› specifické položky kontextového menu: DeÅ¡ifrovat a otevřít a DeÅ¡ifrovat a uložit jako .... Tyto možnosti využijete, když budete chtít, aby Enigmail přílohy pÅ™ed otevÅ™ením nebo uložením deÅ¡ifroval. Jestliže je příloha zprávy rozpoznána jako soubor obsahující s klíÄem OpenPGP, bude Vám nabídnuta možnost importovat klÃ­Ä do VaÅ¡eho úložiÅ¡tÄ›.

Další nápověda je dostupná na stránkách dokumentace Enigmailu (anglicky).

enigmail-2.0.8/lang/cs/help/rulesEditor.html000066400000000000000000000064311334302754500207650ustar00rootroot00000000000000 Nápověda pro Enigmail: editor pravidel

Nápověda pro Enigmail

Použití editoru pravidel v Enigmailu

V editoru pravidel můžete pro každého příjemce nastavit výchozí chování Enigmailu tak, že povolíte Å¡ifrování, podpis, PGP/MIME a urÄíte klíÄ(e) OpenPGP, který se bude pro daného příjemce používat. Každé pravidlo se skládá z 5 položek a je reprezentováno jedním řádkem:

Email
UrÄení emailové(ých) adresy (adres) z polí Komu:, Kopie: a Skrytá kopie:, pro kterou(é) se pravidlo použije. UrÄení probíhá podle podÅ™etÄ›zců (více podrobností najdete v dialogu pÅ™i vytváření pravidla).
KlíÄ(e) OpenPGP
Seznam ID klíÄů OpenPGP k použití pro zvoleného příjemce
Podpis
Povolit / zakázat podepsání zprávy. Použije se zadaná hodnota anebo bude přepsána hodnota nastavená v okně vytváření zprávy. Možnosti jsou:
  • Nikdy: zakáže podepsání zprávy bez ohledu na to, jaká volba je v oknÄ› psaní zprávy. Tato volba potlaÄuje ostatní.
  • Možný: ponechá podepisování zprávy na nastavení v oknÄ› psaní zprávy.
  • Vždy: zprávy bude podepsána, i kdyby to v oknÄ› psaní zprávy povoleno nebylo.

Nastavení pro podepisování se použije pro všechna odpovídající pravidla. Jestliže jedno pravidlo podepsání zakazuje, zpráva nebude podepsána bez ohledu na to, zda ostatní pravidla mají nastavenou volbu Vždy.

Šifrování
Povolit / zakázat šifrování zprávy. Nastavení šifrování a jeho význam jsou podobné jako nastavení podepisování.
PGP/MIME
Povolit / zakázat kódování zprávy pomocí PGP/MIME (RFC 3156). Pokud je PGP/MIME zakázáno, zpráva je kódována použitím "vkládaného PGP" ("inline PGP"). Nastavení a jeho význam jsou podobné jako nastavení podepisování.

Pravidla jsou zpracována v poÅ™adí podle uvedeného seznamu. Vždy, když pravidlo odpovídá příjemci a obsahuje ID klíÄe OpenPGP, příjemce se již kromÄ› použití urÄeného klíÄe v dalších pravidlech nezpracovává.

Poznámka: Editor pravidel jeÅ¡tÄ› není kompletní. Je možno napsat složitÄ›jší pravidla přímou úpravou souboru pravidel, avÅ¡ak tyto pravidla již pak nesmíte upravovat pomocí editoru pravidel. Další informace o přímé úpravÄ› souboru s pravidly si můžete pÅ™eÄíst na stránkách Enigmailu (anglicky).


Další nápověda je dostupná na stránkách dokumentace Enigmailu (anglicky).

enigmail-2.0.8/lang/cs/help/sendingPrefs.html000066400000000000000000000047771334302754500211260ustar00rootroot00000000000000 Enigmail Help: Edit OpenPGP Rule

Enigmail Help

Defining Preferences to Send Encrypted

In the Sending Preferences you can choose the general model and preferences for encryption.

Convenient Encryption
With these settings, emails are encrypted without confirmation whenever possible.

This setup is appropriate, if you just want to improve your privacy by sending emails encyrpted instead of unencrypted if that's possible.

The effect is like sending emails as letters instead of postcards. Unlike postcards, letters usually hide their contents while in transit.

Note however that as with letters you can't be sure that nobody is opening the letter while it is in transit (although, some technical effort is necessary for that).

A concrete risk is that you accidentally use "faked keys" you got from somewhere or somebody claiming that the key belongs to the person you want to send emails to. To avoid this risk, you can either use the trust model of PGP (see below) or you should always verify, whether the fingerprint of a public key is correct.

Manual Encryption
This option allows you to specify the different preferences for encryption according to your needs. You can specify
  • whether replies to encrypted/signed emails should automatically also be encrypted/signed-
  • whether to use the trust model of OpenPGP to accept keys (this means that to use a key you either have to sign the key or have enough other people you trust having signed the key).
  • whether you want to automatically send emails encrypted if all keys are accepted.
  • whether and when you want to finally confirm sending an email.
If it is important for you that content you send encrypted can't be read by other people or organizations, you should use the manual preferences at least choose the option to accept keys only if you or other people signed them. While this model reduces the risk of using faked keys, it requires that you actively sign keys and declare owner trust using the key managament dialog. enigmail-2.0.8/lang/current-languages.txt000066400000000000000000000001621334302754500204230ustar00rootroot00000000000000ar bg ca cs de el es-ES fi fr gd gl hr hu it ja ko lt nb-NO nl pl pt-BR pt-PT ru sk sl sq sv-SE tr vi zh-CN zh-TW enigmail-2.0.8/lang/de/000077500000000000000000000000001334302754500146255ustar00rootroot00000000000000enigmail-2.0.8/lang/de/am-enigprefs.properties000066400000000000000000000001231334302754500213140ustar00rootroot00000000000000# Strings used in the Mozill AccountManager prefPanel-enigprefs=OpenPGP-Sicherheit enigmail-2.0.8/lang/de/enigmail.dtd000066400000000000000000002067321334302754500171210ustar00rootroot00000000000000 Mozilla Public License 2.0."> Die 'Autocrypt Schlüsselübertragung' erfordert, dass die E-Mail-Anwendung auf dem anderen Gerät Autocrypt unerstützt. Dies ist die einfachere Variante, aber nur eine begrenzte Anzahl an Anwendungen unterstützt diesen Standard. Die andere Variante ist 'Sichern & Wiederherstellen' der Einstellungen. Dies erstellt eine ZIP-Datei mit allen notwendigen Informationen und Schlüsseln, die zum neuen Gerät übertragen werden können. Enigmail kann diese Einstellungen direkt importieren, für andere E-Mail-Anwendungen kann die ZIP-Datei entpackt und die Einstellungen manuell übertragen werden."> '"> " verwenden, um E-Mail-Adressen zu kennzeichnen"> OpenPGP-Sicherheit)"> ACHTUNG: Das Erzeugen eines Schlüssels kann mehrere Minuten dauern. Beenden Sie die Anwendung während dieser Zeit nicht. Da der Zufallsgenerator von Aktivität auf dem Rechner abhängt, wird empfohlen, z. B. im Webbrowser aktiv zu surfen, um das Erzeugen des Schlüssels zu beschleunigen. Sie werden informiert, sobald der Schlüssel fertiggestellt ist."> Autocrypt ist ein Standard, welcher definiert, wie komfortable Ende-zu-Ende-Verschlüsselung von E-Mails zu erreichen ist. Er spezifiziert. wie E-Mail-Programme ihre Verschlüsselungs-Fähigkeiten mittels regulärer E-Mails aushandeln."> " ist ungültig."> ACHTUNG: Das Erzeugen eines Schlüssels kann mehrere Minuten dauern. Beenden Sie die Anwendung während dieser Zeit nicht. Sie werden informiert, sobald der Schlüssel fertiggestellt ist."> Dieser Assistent führt Sie durch die Einrichtung."> Hinweis: Enigmail wird Signaturen immer für alle Konten bzw. Identitäten überprüfen, unabhängig davon, was hier ausgewählt wird."> öffentlichen Schlüssel können Andere E-Mails an Sie verschlüsseln (und von Ihnen signierte Nachrichten überprüfen). Sie dürfen ihn jedem geben."> privater Schlüssel ist nur für Sie, um damit Mails an Sie zu entschlüsseln und um Mails, die Sie schicken, zu signieren.  Sie sollten ihm niemandem geben."> privater Schlüssel ist nur für Sie, um damit Mails an Sie zu entschlüsseln und um Mails, die Sie schicken, zu signieren. Sie sollten ihm niemandem geben. Um Ihren privaten Schlüssel zu schützen, fragen die folgenden zwei Dialoge Sie nach einer Passphrase."> Passphrase ist ein Passwort, mit dem GnuPG Ihren privaten Schlüssel schützt. Es soll Missbrauch Ihres privaten Schlüssels verhindern."> nicht empfehlenswert (weil nicht jedes Programm damit richtig umgeht)."> Sie werden aufgefordert ein Passwort dafür einzugeben. Bitte transferieren Sie das Zertifikat auf ein sicheres Medium wie z.B. eine CD oder einen USB-Stick. Jeder, der Zugriff auf dieses Zertifikat erhält, kann damit Ihren Schlüssel unbrauchbar machen."> Exportieren Sie die Einstellungen vom alten Rechner. Das geht mit dem Sicherungs-Assistenten aus den Enigmail-Einstellungen. Importieren Sie die Einstellungen auf den neuen Rechner. Das geht mit diesem Assistenten. "> Danke, dass Sie Enigmail verwenden."> Bitte bestätigen Sie die Anfrage die Sie in Ihrem Posteingang finden werden wenn Sie dies wollen."> Exportieren Sie die Einstellungen vom alten Rechner. Das geht mit diesem Assistenten. Importieren Sie die Einstellungen auf den neuen Rechner. Das geht mit dem Einrichtungs-Assistenten. "> Wählen Sie unten das Konto dessen Schlüssel übertragen werden soll. Es wird am folgenden Schirm ein Einrichtungspasswort angezeigt das auf dem anderen Gerät eingegeben werden muss um den Schlüssel und die dazugehörigen Einstellungen zu importieren."> Wecheln Sie nun zum anderen Gerät und öffnen Sie die Nachricht. Sie sollten um ein Passwort gefragt werden. Geben Sie dort die folgenden Ziffern ein:"> enigmail-2.0.8/lang/de/enigmail.properties000066400000000000000000001723251334302754500205420ustar00rootroot00000000000000Enigmail=Enigmail ##################################################################### # Strings used within enigmailCommon.js and enigmailCommon.jsm ##################################################################### enigAlert=Enigmail-Meldung enigConfirm=Enigmail-Bestätigung enigInfo=Enigmail Information enigError=Enigmail-Fehler enigPrompt=Enigmail-Eingabe dlgYes=&Ja dlgNo=&Nein dlgKeepSetting=Antwort merken und in Zukunft nicht mehr fragen dlgNoPrompt=Diesen Dialog nicht mehr anzeigen. dlg.button.delete=&Löschen dlg.button.cancel=&Abbrechen dlg.button.close=&Schließen dlg.button.continue=&Fortsetzen dlg.button.skip=&Überspringen dlg.button.overwrite=&Überschreiben dlg.button.view=&Anzeigen dlg.button.retry=&Erneut versuchen dlg.button.ignore=&Ignorieren dlg.button.install=&Installieren dlg.button.ok=&OK repeatPrefix=\n\nDiese Nachricht wird noch %S repeatSuffixSingular=mal wiederholt. repeatSuffixPlural=mal wiederholt. noRepeat=\n\nDiese Meldung wird bis zu einem Upgrade von Enigmail nicht wiederholt. pgpNotSupported=Sie scheinen Enigmail zusammen mit PGP 6.x zu verwenden. \n\nLeider weist PGP 6.x einige Probleme auf, die verhindern, dass Enigmail korrekt funktioniert. Darum unterstützt Enigmail PGP 6.x nicht mehr. Bitte verwenden Sie deshalb in Zukunft GnuPG (GPG). \n\nFalls Sie für den Wechsel auf GnuPG Unterstützung brauchen, besuchen Sie die Seite „Help“ auf der Enigmail-Homepage. initErr.howToFixIt=Um Enigmail verwenden zu können, ist GnuPG erforderlich. Wenn GnuPG noch nicht installiert ist, können Sie dies mit der Schaltfläche „Installations-Assistent“ erledigen. initErr.setupWizard.button=&Installations-Assistent passphraseCleared=Die Passphrase wurde gelöscht. cannotClearPassphrase=Sie benutzen ein individuelles Programm (beispielsweise gnome-keyring) für die Passwortverwaltung. Das Vergessen der Passphrase ist daher aus Enigmail heraus nicht möglich. noPhotoAvailable=Kein Foto verfügbar debugLog.title=Enigmail-Debug-Log error.photoPathNotReadable=Fotopfad „%S“ kann nicht geöffnet werden. generalError=Fehler: %S # Strings in configure.jsm enigmailCommon.versionSignificantlyChanged=Diese neue Version von Enigmail enthält signifikante Änderungen in der Anwendung der Voreinstellungen und Optionen. Wir haben versucht, die alten Einstellungen in diese neue Version zu übernehmen. Leider können wir nicht alle Fälle automatisch abdecken. Bitte überprüfen Sie die hierdurch entstandenen neuen Einstellungen und Optionen. enigmailCommon.checkPreferences=&Einstellungen überprüfen … preferences.defaultToPgpMime=Die Vorgabe für das Nachrichten-Protokoll wurde von Inline-PGP auf PGP/MIME geändert. Diese Einstellung sollten Sie, soweit möglich, beibehalten.\n\nWenn Sie doch Inline-PGP nutzen wollen, können Sie das in den Konto-Einstellungen unter OpenPGP-Security einstellen. ##################################################################### # Strings in enigmailAbout.js ##################################################################### usingVersion=Sie verwenden Enigmail Version %S enigmailPepVersion=Enigmail/p≡p Version %S usingAgent=Das %1$S-Programm %2$S wird zur Ver- und Entschlüsselung benutzt agentError=FEHLER: Zugriff auf Enigmail-Dienste fehlgeschlagen! ##################################################################### # Strings in enigmailKeygen.js ##################################################################### accessError=Fehler beim Zugriff auf Enigmail-Dienste onlyGPG=Erzeugen eines Schlüssels funktioniert nur mit GnuPG (nicht mit PGP)! keygenComplete=Erzeugung des Schlüssels abgeschlossen! Identität <%S> wird zum Signieren verwendet. revokeCertRecommended=Es wird dringend empfohlen, dass Sie nun ein Widerrufszertifikat für Ihren Schlüssel erzeugen. Dieses Zertifikat benötigen Sie, um Ihren Schlüssel bei Bedarf für ungültig zu erklären (z.B. wenn der Schlüssel missbraucht, verloren oder gestohlen wird).\n\nMöchten Sie nun das zugehörige Widerrufszertifikat erzeugen? keyMan.button.generateCert=&Zertifikat erzeugen genCompleteNoSign=Erzeugen des Schlüssels abgeschlossen! genGoing=Erzeugen des Schlüssels läuft! passNoMatch=Passphrase wurde nicht korrekt wiederholt; bitte geben Sie diese erneut ein passCheckBox=Setzen Sie bitte die entsprechende Option, wenn Sie keine Passphrase für den Schlüssel verwenden. passUserName=Geben Sie bitte den Benutzernamen für diese Identität an. keygen.missingUserName=Für das angegebene Konto ist kein Name angegeben. Bitte geben Sie in den Konto-Einstellungen im Feld „Ihr Name“ einen Wert ein. keygen.passCharProblem=Sie verwenden in Ihrer Passphrase Sonderzeichen. Dies kann zu Schwierigkeiten mit anderen Anwendungen führen, die den Schlüsselring verwenden wollen. Wir empfehlen, in der Passphrase nur die folgenden Zeichen zu verwenden: a-z A-Z 0-9 /.;:-,!?(){}[]%* passSpaceProblem=Aus technischen Gründen darf die Passphrase nicht mit einem Leerzeichen beginnen oder aufhören. changePassFailed=Ändern der Passphrase fehlgeschlagen keyConfirm=Öffentlichen und privaten Schlüssel für „%S“ erzeugen? keyMan.button.generateKey=&Schlüssel erzeugen keyAbort=Erzeugen des Schlüssels abbrechen? keyMan.button.generateKeyAbort=Schlüsselerzeugung &abbrechen keyMan.button.generateKeyContinue=Schlüsselerzeugung &fortsetzen expiryTooLong=Sie können keinen Schlüssel erzeugen, der erst in mehr als 100 Jahren abläuft. expiryTooLongShorter=Sie können keinen Schlüssel erzeugen, der erst in mehr als 90 Jahren abläuft. expiryTooShort=Ihr Schlüssel muss mindestens einen Tag lang gültig sein. keyGenFailed=Das Erzeugen des Schlüssels ist fehlgeschlagen. Weitere Details finden Sie in der Enigmail-Konsole (Menü Enigmail > Fehlersuche > Konsole anzeigen). setKeyExpirationDateFailed=Das Ablaufdatum konnte nicht geändert werden # Strings in enigmailMessengerOverlay.js securityInfo=Enigmail-Sicherheitsinfo:\n\n enigHeader=Enigmail: enigContentNote=Enigmail: *Anhänge an diese Nachricht wurden nicht signiert oder verschlüsselt*\r\n\r\n possiblyPgpMime=Eventuell PGP/MIME verschlüsselte oder signierte Nachricht; verwenden Sie die Funktion 'Entschlüsseln/Überprüfen' zum Überprüfen saveAttachmentHeader=Enigmail: Entschlüsselte Anhänge speichern noTempDir=Konnte kein temporäres Verzeichnis zum Schreiben finden. Bitte setzen Sie die Umgebungsvariable TEMP. attachmentPgpKey=Der Anhang „%S“ scheint einen OpenPGP-Schlüssel zu enthalten.\n\nKlicken Sie auf „Importieren“, um die Schlüssel zu importieren, oder auf „Anzeigen“, um die Datei in einem Browser-Fenster zu öffnen. beginPgpPart=********* *ANFANG DES VERSCHLÜSSELTEN oder SIGNIERTEN BEREICHS* ********* endPgpPart=********* *ENDE DES VERSCHLÜSSELTEN oder SIGNIERTEN BEREICHS* ********* notePartEncrypted=Enigmail: *Teile der Nachricht wurden NICHT signiert oder verschlüsselt* noteCutMessage=Enigmail: *MehrereTextblöcke gefunden – Entschlüsselung/Überprüfung abgebrochen* decryptOkNoSig=Achtung:\n\nDie Entschlüsselung war erfolgreich, aber die Signatur konnte nicht überprüft werden msgOvl.button.contAnyway=&Trotzdem fortfahren signature.verifiedOK=Die Signatur für den Anhang „%S“ wurde erfolgreich überprüft signature.verifyFailed=Die Signatur für den Anhang %S konnte nicht überprüft werden attachment.noMatchToSignature=Der Anhang „%S“ konnte keiner Signaturdatei zugeordnet werden attachment.noMatchFromSignature=Die Signaturdatei „%S“ konnte keinem Anhang zugeordnet werden fixBrokenExchangeMsg.failed=Reparatur der Nachricht ist fehlgeschlagen. enigmail.msgViewColumn.label=Enigmail enigmailPep.msgViewColumn.label=Enigmail/p≡p wksNoIdentity=Dieser Schlüssel ist mit keinem Ihrer E-Mailkonten verknüpft. Bitte fügen Sie ein Konto für mindestens eine der folgenden E-Mailadressen hinzu: wksConfirmSuccess=Bestätigungs-E-Mail gesendet. wksConfirmFailure=Senden der Bestätigungs-E-Mail fehlgeschlagen. autocrypt.importSetupKey.accountPreconfigured=Ihr Konto ist bereits korrekt konfiguriert für Autocrypt.\n\nMöchten Sie die Einstellungen wirklich mittels dieser Einrichtungs-Nachricht überschreiben? autocrypt.importSetupKey.selfCreated=Diese Nachricht wurde von Ihrer aktuell laufenden Instanz von Enigmail erstellt.\n\nBitte wechseln Sie zu dem E-Mail-Programm zu dem Sie die Einstellungen übertragen möchten, und klicken Sie auf die Nachricht in diesem E-Mail-Programm, um die Einstellungen zu importieren. autocrypt.importSetupKey.invalidMessage=Error - Einrichtungsnachricht konnte nicht gelesen werden. Die Nachricht scheint beschädigt zu sein. Bitte versuchen Sie, eine neue Einrichtungsnachricht auf Ihrem "anderen" Gerät zu erstellen. autocrypt.importSetupKey.invalidKey=Fehler - der Schlüssel konnte nicht importiert werden. Entweder wird der Schlüssel von Ihrer Version von GnuPG nicht unterstützt oder er ist beschädigt. autocrypt.importSetupKey.wrongPasswd=Das von Ihnen eingegebene Passwort ist falsch. Möchten Sie es noch einmal versuchen? autocrypt.importSetupKey.success=Die Autocrypt-Einrichtungsnachricht wurde erfolgreich verarbeitet. Autocrypt ist ab sofort für Ihr Konto '%S' verfügbar. ##################################################################### # Strings in enigmailMsgComposeOverlay.js ##################################################################### keysToExport=Wähle einzufügende OpenPGP Schlüssel keysToUse=Zu verwendende OpenPGP-Schlüssel für %S pubKey=Öffentlicher Schlüssel für %S\n windowLocked=Das Editorfenster ist blockiert; Das Senden wurde abgebrochen sendUnencrypted=Initialisierung von Enigmail fehlgeschlagen. \n\nNachricht unverschlüsselt senden? composeSpecifyEmail=Geben Sie bitte ihre Haupt-E-Mail-Adresse an, die verwendet wird, um den Signatur-Schlüssel für ausgehende Nachrichten auszuwählen. Wenn Sie keine Adresse angeben, wird die E-Mail-Adresse im FROM-Feld der Nachricht zur Auswahl des Schlüssels verwendet. sendingHiddenRcpt=Diese Nachricht hat Empfänger im BCC-Feld (blind copy, versteckt). Wenn diese Nachricht verschlüsselt wird, ist es zwar möglich die BCC-Empfänger zu verstecken, aber Benutzer mancher PGP-Anwendungen (z.B. PGP Corp.) können die Nachricht dann nicht mehr entschlüsseln. Wir empfehlen, auf verschlüsselte E-Mails mit BCC-Empfängern zu verzichten. sendWithHiddenBcc=BCC-Empfänger verstecken sendWithShownBcc=Normal verschlüsseln sendingNews=Das Senden der verschlüsselten Nachricht wurde abgebrochen.\n\nDiese Nachricht kann nicht verschlüsselt werden, da unter den Empfängern Newsgruppen-Adressen sind. Senden Sie bitte diese Nachricht ohne Verschlüsselung. sendToNewsWarning=Warnung: Sie möchten eine verschlüsselte Nachricht an eine Newsgruppe senden.\n\nDies ist nicht zu empfehlen, da es nur Sinn machen würde, wenn alle Leser der Newsgruppe die Nachricht entschlüsseln könnten. Dazu müsste die Nachricht beispielsweise für alle Leser der Newsgruppe verschlüsselt werden. Bitte senden Sie die Nachricht nur, wenn Sie genau wissen, was Sie machen.\n\nFortfahren? hasHTML=Warnung vor HTML-Nachricht: \nDiese Nachricht kann HTML enthalten. Das kann das korrekte Signieren bzw. Verschlüsseln dieser Nachricht verhindern. Um dies zukünftig beim Senden signierter Nachrichten zu vermeiden, drücken Sie bitte die Umschalttaste gleichzeitig mit der „Verfassen“- bzw. „Antworten“-Schaltfläche. Wenn Sie Nachrichten standardmäßig signieren, entfernen Sie in den Konteneinstellungen den Haken bei „Nachrichten im HTML-Format verfassen“, um das Senden von HTML-Nachrichten dauerhaft zu verhindern. strippingHTML=Die Nachricht enthält HTML-Formatierungen, die verloren gehen, wenn die Nachricht für die Signatur bzw. Verschlüsselung in ein Nur-Text-Format umgewandelt wird. Möchten Sie fortfahren? msgCompose.button.sendAnyway=Nachricht &trotzdem senden attachWarning=Anhänge zu dieser Nachicht sind nicht lokal vorhanden, sie können daher nicht verschlüsselt werden. Um die Anhänge zu verschlüsseln, speichern Sie diese zuerst lokal und fügen sie anschließend bei. Möchten Sie trotzdem fortfahren? quotedPrintableWarn=Sie haben „quoted-printable“ als Kodierung für Nachrichten eingestellt. Dies kann zu inkorrekter Entschlüsselung und/oder Überprüfung Ihrer Nachricht führen. \nMöchten Sie die Einstellung „quoted printable“ deaktivieren? minimalLineWrapping=Sie haben den Textumbruch auf %S Zeichen eingestellt. Für korrekte Verschlüsselung und Signatur muss dieser Wert auf mindestens 68 eingestellt werden. \nMöchten Sie den Wert jetzt auf 68 ändern? warning=Warnung signIconClicked=Sie haben Einstellungen für das Signieren verändert. Deshalb hängt für diese Nachricht das (De-)Aktivieren des Signierens nicht mehr von der (De-)Aktivierung der Verschlüsselung ab. errorOwnKeyUnusable=Die Schlüssel-ID „%S“ für die aktuelle Identität entspricht keinem gültigen OpenPGP-Schlüssel.\n\nBitte stellen Sie sicher, dass Sie einen gültigen, nicht abgelaufenen OpenPGP-Schlüssel haben und dass die Einstellungen des E-Mail-Kontos auf diesen Schlüssel verweisen.\nWenn Ihr Schlüssel nicht abgelaufen ist, prüfen Sie bitte, ob das Besitzervertrauen des Schlüssels auf „vertraut“ oder „absolut“ eingestellt ist. msgCompose.cannotSaveDraft=Fehler beim Speichern des Entwurfs msgCompose.partiallyEncrypted.short=Vorsicht: teilweise verschlüsselte Email - Sie könnten sensitive Informationen preisgeben. msgCompose.partiallyEncrypted.mimeMsg=Die Nachricht welche Sie beantworten enthält verschlüsselte und unverschlüsselte Teile. Manche verschlüsselte Teile der Nachricht können unsichtbar sein.\n\nWenn der Absender der Nachricht nicht in der Lage war die versteckten Nachrichtenteile zu entschlüsseln, könnten Sie beim Antworten unbewusst die verschlüsselte Information preisgeben, die der Absender ursprünglich nicht entschlüsseln konnte.\n\nWir empfehlen eine neue Nachricht mit der Antwort zu erstellen anstatt auf diese Nachricht zu antworten. msgCompose.partiallyEncrypted.inlinePGP=Die Nachricht welche Sie beantworten enthält verschlüsselte und unverschlüsselte Teile. \n\nWenn der Absender der Nachricht nicht in der Lage war manche Nachrichtenteile zu entschlüsseln, könnten Sie beim Antworten unbewusst die verschlüsselte Information preisgeben, die der Absender ursprünglich nicht entschlüsseln konnte.\n\nErwägen Sie alle zitierten Nachrichtenteile aus Ihrer Antwort zu entfernen. msgCompose.internalEncryptionError=Interner Fehler: Versprochene Verschlüsselung ist deaktiviert. msgCompose.internalError=Ein interner Fehler ist aufgetreten. msgCompose.toolbarTxt.signAndEncrypt=Diese Nachricht wird signiert und verschlüsselt msgCompose.toolbarTxt.signOnly=Diese Nachricht wird signiert msgCompose.toolbarTxt.encryptOnly=Nachricht wird verschlüsselt. msgCompose.toolbarTxt.noEncryption=Diese Nachricht wird weder signiert noch verschlüsselt. msgCompose.toolbarTxt.disabled=Enigmail ist für die ausgewählte Identität deaktiviert. msgCompose.protectSubject.tooltip=Den Betreff der Nachricht schützen msgCompose.noSubjectProtection.tooltip=Den Betreff der Nachricht nicht schützen msgCompose.encryptedSubjectStub=Verschlüsselte Nachricht msgCompose.protectSubject.dialogTitle=Schutz des Betreffs einschalten? msgCompose.protectSubject.question=Normale verschlüsselte Nachrichten enthalten den unredigierten Betreff.\nWir haben einen neuen Standard etabliert der den originalen Betreff in der verschlüsselten Nachricht versteckt und ihn mit einem Platzhalter ersetzt, sodass der eigentliche Betreff erst nach dem Entschlüsseln der E-Mail sichtbar ist.\n\nWollen Sie den Betreff in verschlüsselten Nachrichten schützen? msgCompose.protectSubject.yesButton=&Betreff schützen msgCompose.protectSubject.noButton=Betreff &ungeschützt lassen msgCompose.detailsButton.label=Details… msgCompose.detailsButton.accessKey=D msgCompose.pepSendUnknown=Unbekannt msgCompose.pepSendUnsecure=Unsicher msgCompose.pepSendSecure=Sicher msgCompose.pepSendTrusted=Sicher & Vertraut pep.alert.disabledForIdentity=p≡p ist für die aktuelle Identität deaktiviert. Bitte aktivieren Sie p≡p in den Enigmail/p≡p Einstellungen. pep.alert.weakReply=Sie sind im Begriff, eine sichere Nachricht als unsicher zu übermitteln. Wenn Sie fortfahren, könnten vertrauliche Infos durchsickern, die Sie und Ihren Kommunikationspartner gefährden könnten. Sind Sie sicher, dass Sie fortfahren wollen? # note: should end with double newline: sendAborted=Das Senden wurde abgebrochen.\n\n # details: keyNotTrusted=Schlüssel '%S' wird nicht genug vertraut. keyNotFound=Schlüssel '%S' wurde nicht gefunden. keyRevoked=Schlüssel '%S' wurde widerrufen. keyExpired=Schlüssel '%S' ist abgelaufen. statPGPMIME=PGP/MIME statSMIME=S/MIME statSigned=SIGNIERT statEncrypted=VERSCHLÜSSELT statPlain=NICHT SIGNIERT und UNVERSCHLÜSSELT offlineSave=Nachricht %1$S an folgende Empfänger im Ordner „Postausgang“ speichern: \n\n%2$S\n onlineSend=Nachricht %S an folgende Empfänger senden: \n\n%S\n encryptKeysNote=Hinweis: Die Nachricht wurde mit folgenden Benutzer-IDs / Schlüsseln verschlüsselt: %S hiddenKey= signFailed=Fehler in Enigmail; Verschlüsselung/Signieren fehlgeschlagen; Nachricht unverschlüsselt senden? msgCompose.button.sendUnencrypted=Nachricht &unverschlüsselt senden recipientsSelectionHdr=Empfänger für Verschlüsselung wählen configureNow=Sie haben Enigmail-Sicherheit für die ausgewählte Identität noch nicht konfiguriert. Möchten Sie dies jetzt machen? # encryption/signing status and associated reasons: encryptMessageAuto=Nachricht verschlüsseln (automatisch) encryptMessageNorm=Nachricht verschlüsseln signMessageAuto=Nachricht signieren (automatisch) signMessageNorm=Nachricht signieren encryptOff=Verschlüsselung: AUS encryptOnWithReason=Verschlüsselung: EIN (%S) encryptOffWithReason=Verschlüsselung: AUS (%S) encryptOn=Verschlüsselung: EIN signOn=Signieren: EIN signOff=Signieren: AUS signOnWithReason=Signieren: EIN (%S) signOffWithReason=Signieren: AUS (%S) reasonEnabledByDefault=Voreinstellung ist EIN reasonManuallyForced=von Hand eingeschaltet reasonByRecipientRules=aufgrund von Empfänger-Regeln reasonByAutoEncryption=aufgrund von automatischer Verschlüsselung reasonByConflict=wegen Konflikt in Empfänger-Regeln reasonByEncryptionMode=wegen Verschlüsselungs-Modus # should not be used anymore: encryptYes=Nachricht wird verschlüsselt encryptNo=Nachricht wird nicht verschlüsselt # should not be used anymore: signYes=Nachricht wird signiert signNo=Nachricht wird nicht signiert # PGP/MIME status: pgpmimeNormal=Protokoll: PGP/MIME inlinePGPNormal=Protokoll: Inline-PGP smimeNormal=Protokoll: S/MIME pgpmimeAuto=Protokoll: PGP/MIME (automatisch) inlinePGPAuto=Protokoll: Inline-PGP (automatisch) smimeAuto=Protokoll: S/MIME (automatisch) # should not be used anymore pgpmimeYes=PGP/MIME wird verwendet pgpmimeNo=Inline-PGP wird verwendet # Attach own key status (tooltip strings): attachOwnKeyNo=Ihr eigener Schlüssel wird nicht angehängt attachOwnKeyYes=Ihr eigener Schlüssel wird angehängt attachOwnKeyDisabled=Sie können Ihren eigenen Schlüssel nicht anhängen. Um dieses Feature zu aktivieren, müssen Sie einen bestimmten Schlüssel in den Konto-Einstellungen im Abschnitt OpenPGP auswählen. rulesConflict=Konflikt in Empfängerregeln entdeckt\n%S\n\nNachrichten trotzdem mit diesen Einstellungen senden? msgCompose.button.configure=&Konfigurieren msgCompose.button.send=Nachricht &senden msgCompose.button.save=Nachricht &speichern # Strings in enigmailMsgHdrViewOverlay.js keyNeeded=Öffentlicher Schlüssel %S wird zur Überprüfung der Signatur benötigt keyUsed=Signatur wurde mit öffentlichem Schlüssel %S überprüft clickDecrypt=; klicken Sie bitte auf die Entschlüsselungs-Schaltfläche clickDecryptRetry=; klicken Sie bitte auf die Entschlüsselungs-Schaltfläche für einen erneuten Versuch clickDetailsButton=; Für weitere Informationen klicken Sie auf die Schaltfläche „Details“. clickImportButton=; Drücken Sie die Schaltfläche „Schlüssel importieren“, um den Schlüssel herunterzuladen. keyTypeUnsupported=; Der Schlüsseltyp wird von Ihrer Version von GnuPG nicht unterstützt. msgPart=Teil der Nachricht %S msgSigned=signiert msgSignedUnkownKey=signiert mit unbekanntem Schlüssel msgEncrypted=verschlüsselt msgSignedAndEnc=signiert und verschlüsselt unverifiedSig=Ungeprüfte Signatur incompleteDecrypt=Entschlüsselung unvollständig needKey=Fehler - kein passender privater/geheimer Schlüssel zur Entschlüsselung gefunden failedDecrypt=Fehler – Entschlüsselung fehlgeschlagen badPhrase=Fehler – falsche Passphrase failedDecryptVerify=Fehler – Entschlüsselung/Überprüfung fehlgeschlagen mdcError=Fehler - Nachricht enthält keinen Integritätsschutz (MDC) viewInfo=; Ansicht > Nachrichtensicherheitsinformation für Details decryptedMsg=Entschlüsselte Nachricht decryptedMsgWithFormatError=Nachricht entschlüsselt (wiederhergestelltes ungültiges PGP Email Format - vermutlich durch alte Exchange Server Version entstanden. Das Resultat könnte nicht ideal zu lesen sein) usedAlgorithms=Verwendete Algorithmen: %S und %S pepStatusInfo.text=p≡p Nachrichtenstatus. pepStatusInfo.title.m3=Wird angegriffen pepStatusInfo.info.m3=Diese Nachricht ist nicht sicher und wurde manipuliert. pepStatusInfo.title.m1=Misstraut. pepStatusInfo.info.m1=Diese Nachricht hat einen Kommunikationspartner der früher als misstraut markiert wurde pepStatusInfo.title.r0=Unbekannt pepStatusInfo.info.r0=Diese Nachricht beinhaltet nicht genug Informationen um festzustellen ob sie sicher ist. pepStatusInfo.title.r1=Kann nicht entschlüsseln pepStatusInfo.info.r1=Diese Nachricht kann nicht entschlüsselt werden weil der Schlüssel nicht verfügbar ist. pepStatusInfo.title.r2=Entschlüsselung fehlgeschlagen pepStatusInfo.info.r2=Diese Nachricht kann nicht entschlüsselt werden weil der Schlüssel nicht verfügbar ist. pepStatusInfo.title.r3=Unsicher pepStatusInfo.info.r3=Diese Nachricht ist unsicher. pepStatusInfo.title.r4=Unsicher für Manche pepStatusInfo.info.r4=Diese Nachricht ist unsicher für manche der Kommunikationspartner. pepStatusInfo.title.r5=Unzuverlässige Sicherheit pepStatusInfo.info.r5=Diese Nachricht hat einen unzuverlässigen Schutz. pepStatusInfo.title.r6=Sicher... pepStatusInfo.info.r6=Diese Nachricht ist sicher aber Sie müssen die Identität Ihres Kommunikationspartners überprüfen. pepStatusInfo.title.r7=Sicher & Vertraut pepStatusInfo.info.r7=Diese Nachricht ist sicher und vertraut. pepStatusInfo.color.green=Grün pepStatusInfo.color.yellow=Gelb pepStatusInfo.color.red=Rot pepRevokeTrust.question=Möchten Sie das Vertrauen für %S wirklich entziehen? pepRevokeMistrust.question=Wollen Sie wirklich dem Schlüssel von %S vertrauen? pepRevokeTrust.doRevoke=&Vertrauen entziehen wksConfirmationReq=Webkey-Verzeichnis Bestätigungsanfrage wksConfirmationReq.message=Diese Nachricht wurde von Ihrem E-Mail-Provider gesendet, um die Bereitstellung Ihres öffentlichen OpenPGP-Schlüssels in dessen Web-Schlüsselverzeichnis zu bestätigen.\nDie Bereitstellung Ihres öffentlichen Schlüssels hilft anderen, Ihren Schlüssel zu finden und so in der Lage zu sein, Nachrichten an Sie zu verschlüsseln.\n\nWenn Sie Ihren Schlüssel jetzt im Web-Schlüsselverzeichnis bereitstellen möchten, klicken Sie bitte auf die Schaltfläche "Anfrage bestätigen" in der Statusleiste.\nAndernfalls ignorieren Sie diese Nachricht einfach. wksConfirmationReq.button.label=Anfrage bestätigen autocryptSetupReq=Autocrypt-Einrichtung durchführen autocryptSetupReq.button.label=Einrichtung starten autocryptSetupReq.setupMsg.desc=Diese Nachricht enthält alle Informationen, um Ihre Autocrypt-Einstellungen zusammen mit Ihrem geheimen Schlüssel sicher von Ihrem Originalgerät zu übertragen. autocryptSetupReq.setupMsg.backup=Sie können diese Nachricht behalten und als Sicherungskopie für Ihren geheimen Schlüssel verwenden. Wenn Sie das tun möchten, sollten Sie das Passwort notieren und es sicher verwahren. autocryptSetupReq.message.import=Um die Einstellungen und Schlüssel in Enigmail zu importieren, klicken Sie bitte auf die Schaltfläche "Einrichtung starten" in der Statusleiste. autocryptSetupReq.message.sent=Bitte klicken Sie die Nachricht auf Ihrem neuen Gerät an und befolgen Sie die Hinweise, um die Einstellungen zu importieren. # strings in pref-enigmail.js oldGpgVersion20=Initialisierung von Enigmail fehlgeschlagen.\n\nSie nutzen GnuPG Version %1$S, welche nicht mehr unterstützt wird. Enigmail benötigt GnuPG Version %2$S oder neuer. Bitte aktualisieren Sie Ihre GnuPG Installation, andernfalls kann Enigmail nicht funtkionieren. locateGpg=GnuPG-Anwendung finden invalidGpgPath=GnuPG kann im angegebenen Pfad nicht gefunden werden. Enigmail wird deshalb deaktiviert, bis Sie den Pfad zu GnuPG korrigieren oder die Anwendung neu starten. warningsAreReset=Alle Warnungen wurden zurückgesetzt. prefs.gpgFound=GnuPG wurde gefunden in %S prefs.gpgNotFound=GnuPG wurde nicht gefunden prefs.warnAskNever=Warnung: Das Aktivieren dieser Option führt dazu, dass Nachrichten UNVERSCHLÜSSELT gesendet werden, sobald bei Nachrichten an mehrere Empfänger auch nur ein einziger Schlüssel für die Liste der Empfänger fehlt. Enigmail wird Sie in diesen Situationen NICHT nochmals informieren! prefs.warnIdleTimeForUnknownAgent=Ihr System verwendet ein spezialisiertes Tool für die Passphrasen-Verwaltung (z.B. gnome-keyring oder seahorse-agent, KDE-Wallet, etc.) Leider kann Enigmail die Ablaufzeit für diese Tools nicht kontrollieren. Daher werden Änderungen an der Ablaufzeit hier ignoriert. prefEnigmail.oneKeyserverOnly=Fehler – Es kann nur ein Schlüsselserver für das automatische Herunterladen fehlender OpenPGP-Schlüssel angegeben werden. # Strings used in core.jsm # (said file also re-uses some strings from above) enterAdminPin=Bitte geben Sie die ADMIN-PIN Ihrer SmartCard ein enterCardPin=Bitte geben Sie Ihre SmartCard-PIN ein notInit=Fehler – Enigmail-Dienste noch nicht eingerichtet badCommand=Fehler – Verschlüsselung fehlgeschlagen cmdLine=Kommandozeile und Ausgabe: notRequired=Fehler – keine Verschlüsselung notwendig notComplete=Fehler – Erzeugen des Schlüssels noch nicht abgeschlossen invalidEmail=Fehler – ungültige E-Mail-Adresse(n) noPassphrase=Fehler – keine Passphrase angegeben noPGPblock=Fehler – keinen gültigen OpenPGP-Block gefunden unverifiedReply=Der eingerückte Teil der Nachricht (Antwort) wurde wahrscheinlich verändert keyInMessageBody=Schlüssel im Text der Nachricht gefunden. Klicken Sie auf „Schlüssel importieren“, um den Schlüssel zu importieren. sigMismatch=Fehler – Signatur passt nicht zusammen cantImport=Fehler beim Importieren eines öffentlichen Schlüssels doImportOne=%1$S (%2$S) importieren? doImportMultiple=Die folgenden Schlüssel importieren?\n\n%S previewFailed=Öffentlicher Schlüssel kann nicht gelesen werden. # Strings used in errorHandling.jsm sc.wrongCardAvailable=Die SmartCard %1$S im Lesegerät kann zum Verarbeiten der Nachricht nicht verwendet werden.\nBitte legen Sie Ihre SmartCard %2$S ein und wiederholen Sie den Vorgang. sc.insertCard=Der Vorgang erfordert Ihre SmartCard %S.\nBitte legen Sie die erforderliche SmartCard ein und wiederholen Sie den Vorgang. sc.removeCard=Der Vorgang erfordert, dass keine SmartCard im Lesegerät ist.\nBitte entfernen Sie die SmartCard und wiederholen Sie den Vorgang. sc.noCardAvailable=Es wurde keine SmartCard im Lesegerät gefunden.\nBitte legen Sie die SmartCard ein und wiederholen Sie den Vorgang. sc.noReaderAvailable=Ihr SmartCard-Lesegerät wurde nicht gefunden.\nBitte installieren Sie das Lesegerät, legen die Karte ein und wiederholen Sie den Vorgang. keyError.keySpecNotFound=Die E-Mail-Adresse „%S“ passt zu keinem der Schlüssel in Ihrem Schlüsselbund. keyError.keyIdNotFound=Die konfigurierte Schlüssel-ID „%S“ wurde nicht in Ihrem Schlüsselbund gefunden. keyError.resolutionAction=Bitte wählen Sie in den Konto-Einstellungen im Abschnitt OpenPGP einen gültigen Schlüssel aus. missingPassphrase=Fehlende Passphrase errorHandling.gpgAgentInvalid=Auf Ihrem System läuft eine Version von gpg-agent, die nicht für die installierte GnuPG-Version geeignet ist. errorHandling.gpgAgentError=In der Kommunikation zwischen GnuPG und gpg-agent (einem Teil von GnuPG) ist ein Fehler aufgetreten. errorHandling.dirmngrError=In der Kommunikation zwischen GnuPG und dirmngr (einem Teil von GnuPG) ist ein Fehler aufgetreten. errorHandling.pinentryError=GnuPG kann Ihre Passphrase nicht mit Hilfe des Programms pinentry abfragen. errorHandling.readFaq=Dies ist ein Problem mit der Systeminstallation oder ein Konfigurationsfehler und führt dazu, dass Enigmail nicht funktioniert. Das Problem kann nicht automatisch behoben werden.\n\nBitte sehen Sie auf der Support-Webseite https://enigmail.net/faq (auf Englisch) nach, welche Möglichkeiten Sie haben. gpgNotFound=Die GnuPG-Anwendung „%S“ konnte nicht gefunden werden.\nStellen Sie sicher, dass der Pfad zur GnuPG-Anwendung in den Enigmail-Einstellungen korrekt angegeben ist. gpgNotInPath=Die GnuPG-Anwendung konnte im Systempfad nicht gefunden werden.\nStellen Sie sicher, dass der Pfad zur GnuPG-Anwendung in den Enigmail-Einstellungen korrekt angegeben ist. enigmailNotAvailable=Enigmail-Kerndienst nicht verfügbar prefGood=Korrekte Signatur von %S prefBad=FALSCHE Signatur von %S failCancel=Fehler - Schlüsselempfang durch Benutzer abgebrochen failNoServer=Fehler – Es wurde kein Schlüssel-Server angegeben failNoID=Fehler – Es wurde keine Schlüssel-ID angegeben failKeyExtract=Fehler – Schlüssel-Extraktion fehlgeschlagen notFirstBlock=Fehler - Der erste OpenPGP-Block ist kein öffentlicher Schlüssel-Block importKeyConfirm=In der Nachricht enthaltene(n) öffentliche(n) Schlüssel importieren? failKeyImport=Fehler – Schlüssel konnte nicht importiert werden fileWriteFailed=Fehler beim Schreiben in Datei %S. importKey=Importiere folgende öffentliche Schlüssel von einem Schlüssel-Server: %S uploadKey=Sende folgende öffentliche Schlüssel an einen Schlüssel-Server: %S keyId=Schlüssel-ID keyAndSigDate=Schlüsselkennung: 0x%1$S / Signiert am: %2$S keyFpr=Schlüssel-Fingerabdruck: %S noEmailProvided=Sie haben keine E-Mail-Adresse angegeben! keyAlreadySigned=Der Schlüssel wurde bereits signiert, Sie können ihn nicht doppelt signieren. ##################################################################### # Strings used in enigmailKeySelection.js ##################################################################### selKeyExpired=abgelaufen am %S createdHeader=Erzeugt atLeastOneKey=Kein Schlüssel ausgewählt! Sie müssen mindestens einen Schlüssel auswählen. fewerKeysThanRecipients=Sie haben weniger Schlüssel als Empfänger ausgewählt. Sind Sie sicher, dass alle notwendigen Schlüssel ausgewählt wurden? userSel.button.goBack=Weitere Schlüssel auswählen userSel.secretKeySel.title=Wählen Sie einen geheimen OpenPGP-Schlüssel aus, um Ihre Nachrichten zu signieren userSel.problemNoKey=Kein gültiger Schlüssel userSel.problemMultipleKeys=Mehrere Schlüssel # should be same as thunderbird ENTITY sendLaterCmd.label: sendLaterCmd.label=Später absenden # Strings used in enigmailAttachmentDialog.js pgpMimeNote=HINWEIS: PGP/MIME wird nicht von allen E-Mail-Programmen unterstützt. Sind Sie unsicher, wählen Sie die Option %S. first=erste second=zweite # Strings used in am-enigprefs.js / enigmailEditIdentity.js encryptKeyHeader=OpenPGP-Schlüssel für Verschlüsselung wählen identityName=Identität: %S switchPepMode=Sie nutzen momentan den 'p≡p Junior' Modus von Enigmail.\n\nDurch das Aktivieren con OpenPGP oder S/MIME für ein Konto deaktivieren Sie p≡p und nutzen den regulären Modus von Enigmail ohne p≡p. enableEnigmail=p≡p &deaktiveren # Strings used in enigmailSingleRcptSettings.js noEncryption=Sie haben die Verschlüsselung aktiviert, aber keinen Schlüssel gewählt. Um Nachrichten an %1$S verschlüsselt zu senden, müssen Sie einen oder mehrere gültige Schlüssel auswählen. Möchten Sie die Verschlüsselung für %2$S deaktivieren? noKeyToUse=(keiner – nicht verschlüsseln) noEmptyRule=Regeln dürfen nicht leer sein. Bitte geben Sie eine E-Mail-Adresse an. invalidAddress=Die eingegebenen E-Mail-Adressen sind nicht gültig. Sie sollten nicht die Namen der Empfänger eingeben, sondern nur die Adressen. \n\nBeispiel: \nUngültig: Max Mustermann \nGültig: max.mustermann@domain.de noCurlyBrackets=Die geschweiften Klammern {} haben ein besondere Bedeutung und sollten nicht verwendet werden in einer E-Mail-Adresse. Wenn Sie das Treffer-Verhalten für diese Regel verändern möchten, verwenden Sie die Option 'Wende Regel an wenn Empfänger...'\nMehr Information ist verfügbar über die Schaltfläche "Hilfe". # Strings used in enigmailRulesEditor.js never=Nie always=Immer possible=Wenn ausgewählt deleteRule=Ausgewählte Regel wirklich löschen? nextRcpt=(Nächster Empfänger) negateRule=Nicht addKeyToRule=Den Schlüssel %1$S (%2$S) zur Empfängerregel hinzufügen # Strings used in enigmailSearchKey.js needOnline=Im Offline-Modus ist die gewählte Funktion nicht verfügbar. Bitte gehen Sie online und versuchen es erneut. protocolNotSupported=Das ausgewählte Protokoll „%S://“ wird nicht unterstützt, um OpenPGP-Schlüssel herunterzuladen. gpgkeysDisabled=Es könnte helfen folgende Funktion zu aktivieren: „extensions.enigmail.useGpgKeysTool“ noKeyserverConn=Verbindung zum Schlüssel-Server %S konnte nicht hergestellt werden. keyDownloadFailed=Schlüssel konnte nicht vom Server heruntergeladen werden. Status-Meldung:\n%S internalError=Ein interner Fehler ist aufgetreten. Schlüssel konnten nicht heruntergeladen oder importiert werden. noKeyFound=Leider konnte kein passender Schlüssel zu den angegebenen Suchkriterien gefunden werden.\nBeachten Sie, dass Schlüssel-IDs mit „0x“ beginnen müssen (z.B. 0xABCDEF12). keyDownload.keyUnavailable=Verzeihung, aber der Schlüssel mit der ID %S ist nicht verfügbar auf dem Schlüssel-Server. Vermutlich hat der Besitzer des Schlüssels diesen nicht zu dem Schlüssel-Server hochgeladen.\n\nErsuchen Sie bitte den Sender der Nachricht, Ihnen den Schlüssel per E-Mail zu senden. # gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. gpgKeysFailed=Schlüssel konnte nicht gesucht oder heruntergeladen werden: gpgkeys_%S konnte nicht ausgeführt werden. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Festlegen des Besitzervertrauens fehlgeschlagen # Strings in enigmailSignKeyDlg.js signKeyFailed=Signieren des Schlüssels fehlgeschlagen alreadySigned.label=Hinweis: Der Schlüssel %S wurde bereits mit dem ausgewählten privaten Schlüssel signiert. alreadySignedexportable.label=Hinweis: Der Schlüssel %S ist bereits mit dem angegebenen privaten Schlüssel als exportierbar signiert. Eine lokale Signatur ist daher nicht sinnvoll. partlySigned.label=Hinweis: einige Benutzerkennungen des Schlüssels %S sind bereits mit dem ausgewählten privaten Schlüssel signiert. noTrustedOwnKeys=Kein geeigneter Schlüssel zum Signieren gefunden! Sie brauchen mindestens einen vollständig vertrauten privaten Schlüssel in Ihrem Schlüsselbund. # Strings in enigmailKeyManager.js keyMan.loadingKeys=Schlüssel werden geladen, bitte warten… keyValid.unknown=unbekannt keyValid.invalid=ungültig keyValid.disabled=deaktiviert keyValid.revoked=widerrufen keyValid.expired=abgelaufen keyValid.noSubkey=Kein gültiger Unterschlüssel keyTrust.untrusted=nicht vertrauenswürdig keyTrust.marginal=marginal keyTrust.full=vertraut keyTrust.ultimate=absolut keyTrust.group=(Gruppe) keyType.public=öffentlich keyType.publicAndSec=öffentlich + privat keyMan.enableKey=Aktivieren keyMan.disableKey=Deaktivieren userAtt.photo=Benutzerattribut (JPEG-Bild) asciiArmorFile=ASCII-Armored-Dateien (*.asc) importKeyFile=OpenPGP-Schlüsseldatei importieren gnupgFile=GnuPG-Dateien createKeyOK=Ihr Schlüssel wurde erzeugt. saveRevokeCertAs=Widerrufszertifikat erzeugen & speichern revokeCertOK=Das Widerrufszertifikat wurde erfolgreich erstellt. Damit können Sie Ihren öffentlichen Schlüssel für ungültig erklären, z.B. für den Fall, dass Sie Ihren geheimen Schlüssel verlieren. revokeCertFailed=Das Widerrufszertifikat konnte nicht erzeugt werden. addUidOK=Benutzer-ID erfolgreich hinzugefügt addUidFailed=Hinzufügen der Benutzer-ID fehlgeschlagen noKeySelected=Sie müssen mindestens einen Schlüssel auswählen, um diese Funktion auszuführen. exportToFile=Öffentlichen Schlüssel in Datei exportieren exportKeypairToFile=Geheime und öffentliche Schlüssel in eine Datei exportieren exportSecretKey=Möchten Sie auch private (geheime) Schlüssel in die Datei speichern? saveKeysOK=Die Schlüssel wurden erfolgreich gespeichert. saveKeysFailed=Speichern der Schlüssel fehlgeschlagen importKeysFailed=Speichern der Schlüssel fehlgeschlagen enableKeyFailed=Aktivieren / Deaktivieren der Schlüssel fehlgeschlagen specificPubKeyFilename=%1$S (0x%2$S) pub specificPubSecKeyFilename=%1$S (0x%2$S) pub-sec defaultPubKeyFilename=Exportierte_oeffentliche_Schluessel defaultPubSecKeyFilename=Exportierte_oeffentliche_und_private_Schluessel noSecretKeys=Keinen privaten Schlüssel gefunden.\n\nMöchten Sie jetzt Ihren eigenen Schlüssel erzeugen? sendKeysOk=Schlüssel erfolgreich gesendet sendKeysFailed=Senden der Schlüssel fehlgeschlagen receiveKeysOk=Schlüssel erfolgreich aktualisiert receiveKeysFailed=Herunterladen der Schlüssel ist fehlgeschlagen importFromClip=Möchten Sie Schlüssel aus der Zwischenablage importieren? importFromUrl=Öffentlichen Schlüssel von dieser URL herunterladen: copyToClipbrdFailed=Exportieren der Schlüssel in die Zwischenablage fehlgeschlagen copyToClipbrdOK=Schlüssel erfolgreich in Zwischenablage exportiert deleteSecretKey=WARNUNG: Sie sind dabei einen privaten Schlüssel zu löschen!\n\nWenn Sie Ihren privaten Schlüssel löschen, können Sie keine Nachrichten mehr entschlüsseln, die dafür verschlüsselt wurden. Außerdem können Sie anschließend den zugehörigen öffentlichen Schlüssel nicht mehr widerrufen.\n\nMöchten Sie wirklich den öffentlichen UND den PRIVATEN Schlüssel „%S“ löschen? deleteMix=WARNUNG: Sie sind dabei private Schlüssel zu löschen!\n\nWenn Sie Ihren privaten Schlüssel löschen, können Sie keine Nachrichten mehr entschlüsseln, die dafür verschlüsselt wurden.\n\nWollen Sie wirklich beides, die gewählten öffentlichen UND PRIVATEN Schlüssel löschen? deletePubKey=Möchten Sie den öffentlichen Schlüssel „%S“ löschen? deleteSelectedPubKey=Möchten Sie die öffentlichen Schlüssel löschen? deleteKeyFailed=Löschen des Schlüssels fehlgeschlagen revokeKeyQuestion=Sie sind dabei, den Schlüssel '%S' zu widerrufen.\n\nSie werden mit diesem Schlüssel nicht mehr signieren können, und sobald der Widerruf verteilt ist, werden andere nicht mehr mit diesem Schlüssel verschlüsseln können. Sie können mit dem Schlüssel aber weiterhin alte Nachrichten entschlüsseln.\n\nMöchten Sie fortfahren? revokeKeyOk=Der Schlüssel wurde widerrufen. Wenn Ihr Schlüssel auf einem Schlüssel-Server verfügbar ist, sollten Sie Ihn jetzt erneut hochladen. Erst dann können andere Anwender sehen, dass er widerrufen wurde. revokeKeyFailed=Der Schlüssel konnte nicht widerrufen werden. revokeKeyNotPresent=Sie haben keine Slüssel (0x%S), der zu dem Widerrufszertifikat passt!\n\nWenn Sie ihren Schlüssel verloren haben, müssen sie ihn (z.B. vom Keyserver) vor dem Widerrufszertifikat importieren! revokeKeyAlreadyRevoked=Der Schlüssel 0x%S wurde bereits zurückgerufen. refreshAllQuestion=Sie haben keinen Schlüssel ausgewählt. Möchten Sie ALLE Schlüssel aktualisieren? refreshKeyServiceOn.warn=Warnung: Ihre Schlüssel werden derzeit so schnell wie möglich im Hintergrund aufgefrischt.\nWenn Sie all Ihre Schlüssel sofort erneuern, werden Sie unnötigerweise Infos über Sie preis geben.\nWollen Sie das wirklich machen? refreshKey.warn=Warnung: In Abhängigkeit von der Anzahl der Schlüssel und der Verbindungsgeschwindigkeit, kann das Aktualisieren aller Schlüssel sehr lange dauern! downloadContactsKeys.warn=Warnung: In Abhängigkeit von der Anzahl der Kontakte und der Übertragungsgeschwindigkeit kann dieser Vorgang recht lange dauern! downloadContactsKeys.importFrom=Kontakte aus Adressbuch '%S' importieren? keyMan.button.exportSecKey=&Geheime Schlüssel exportieren keyMan.button.exportPubKey=&Nur öffentliche Schlüssel exportieren keyMan.button.import=&Importieren keyMan.button.refreshAll=Alle Schlüssel &aktualisieren keyMan.button.revokeKey=Schlüssel &widerrufen keyMan.button.skip=Schlüssel über&springen keylist.noOtherUids=Hat keine weiteren Identitäten keylist.hasOtherUids=Auch bekannt als keylist.noPhotos=Kein Foto verfügbar keylist.hasPhotos=Fotos keyMan.addphoto.filepicker.title=Foto auswählen keyMan.addphoto.warnLargeFile=Die ausgewählte Datei ist größer als 25 kB.\nEs ist nicht empfehlenswert große Dateien hinzuzufügen, da die Schlüssel dadurch sehr groß werden. keyMan.addphoto.noJpegFile=Das ausgewählte Foto scheint nicht im JPEG-Format zu sein. Bitte wählen Sie eine andere Datei. keyMan.addphoto.failed=Das Foto konnte nicht hinzugefügt werden. noWksIdentity=Der Schlüssel %S hat keine WKS-Identität. keyman.addBlacklistKey.msg=Möchten Sie wirklich, dass p≡p den Schlüssel "%1$S (%2$S)" nicht mehr verwendet zum Verschlüsseln von Nachrichten? keyman.removeBlacklistKey.msg=Möchten Sie p≡p erlauben, den Schlüssel "%1$S (%2$S)" für zukünftige Nachrichten zu verwenden? keyman.addBlacklistKey.button=Den Schlüssel auf die Sperrliste setzen keyman.removeBlacklistKey.button=Schlüssel von der Sperrliste &entfernen # Strings in enigmailManageUidDlg.xul changePrimUidFailed=Änderung der primären Benutzer-ID fehlgeschlagen changePrimUidOK=Primäre Benutzer-ID erfolgreich geändert revokeUidFailed=Widerrufen der Benutzer-ID %S fehlgeschlagen revokeUidOK=Benutzer-ID „%S“ erfolgreich widerrufen. Wenn Ihr Schlüssel auf einem Schlüssel-Server verfügbar ist, sollten Sie Ihn jetzt erneut hochladen. Erst dann können andere Anwender sehen, dass er widerrufen wurde. revokeUidQuestion=Möchten Sie die Benutzer-ID „%S“ wirklich widerrufen? # Strings in enigmailKeyImportInfo.xul importInfoTitle=Das hat geklappt! Schlüssel wurden importiert importInfoBits=Bit importInfoCreated=Erstellt importInfoFpr=Fingerabdruck importInfoDetails=(Details) importInfoNoKeys=Keine Schlüssel importiert # Strings in enigmailKeyDetailsDlg.xul keyTypePublic=öffentlicher Schlüssel keyTypePrimary=Primärer Schlüssel keyTypeSubkey=Unterschlüssel keyTypePair=Schlüsselpaar keyExpiryNever=nie keyAlgorithm_1=RSA keyAlgorithm_2=RSA keyAlgorithm_3=RSA keyAlgorithm_16=ELG keyAlgorithm_17=DSA keyAlgorithm_18=ECDH keyAlgorithm_19=ECDSA keyAlgorithm_20=ELG keyAlgorithm_22=EDDSA keyUsageEncrypt=Verschlüsseln keyUsageSign=Signieren keyUsageCertify=Beglaubigen keyUsageAuthentication=Authentifizieren keyDoesNotExpire=Schlüssel läuft nicht ab # Strings in enigmailGenCardKey.xul keygen.started=Bitte warten Sie, während der Schlüssel erzeugt wird… keygen.completed=Schlüssel erzeugt. Die neue Schlüssel-ID ist: 0x%S keygen.keyBackup=Die Sicherungskopie des Schlüssel wurde gespeichert als %S keygen.passRequired=Bitte vergeben Sie eine Passphrase, wenn Sie eine Sicherungskopie des Schlüssels außerhalb der SmartCard anlegen möchten. # Strings in enigmailSetCardPin.xul cardPin.processFailed=Ändern der PIN fehlgeschlagen # Strings in enigRetrieveProgres.xul keyserverProgress.refreshing=Schlüssel werden aktualisiert. Bitte warten… keyserverProgress.uploading=Schlüssel werden hochgeladen. Bitte warten… keyserverProgress.wksUploadFailed=Ihr Schlüssel konnte nicht zum Webkey Service hochgeladen werden. keyserverProgress.wksUploadCompleted=Ihr öffentlicher Schlüssel wurde Ihrem Anbieter erfolgreich übermittelt. Sie erhalten eine E-Mail, zum bestätigen, dass Sie den Upload eingeleitet haben. keyserverTitle.refreshing=Schlüssel aktualisieren keyserverTitle.uploading=Schlüssel hochladen # Strings in enigmailSetupWizard passphrase.min8keys=Ihre Passphrase sollte mindestens 8 Zeichen lang sein! setupWizard.reallyCancel=Möchten Sie den Einrichtungs-Assistenten wirklich schließen? setupWizard.invalidGpg=Bei der angegebenen Datei handelt es sich nicht um die GnuPG-Anwendung. Bitte wählen Sie eine andere Datei aus. setupWizard.specifyFile=Sie müssen zumindest eine öffentliche Schlüsseldatei auswählen, um fortzufahren. setupWizard.installFailed=Die Installation scheint nicht erfolgreich abgeschlossen worden zu sein. Bitte versuchen Sie GnuPG erneut zu installieren, oder installieren Sie GnuPG manuell und weisen Sie den Pfad über die Schaltfläche „Durchsuchen“ zu. setupWizard.downloadForbidden=Zu ihrer eigenen Sicherheit werden wir GnuPG nicht herunterladen. Bitte besuchen Sie die Webseite https://gnupg.org/, um GnuPG herunterzuladen. setupWizard.downloadImpossible=GnuPG kann im Moment nicht heruntergeladen werden. Bitte versuchen Sie es später erneut oder laden Sie GnuPG von https://gnupg.org/ herunter. setupWizard.hashSumError=Der Assistent konnte die Integrität der heruntergeladenen Datei nicht verifizieren. Die Datei könnte defekt oder manipuliert sein. Möchten Sie die Installation trotzdem fortsetzen? setupWizard.importSettingsFile=Geben Sie die zu ladende Sicherungsdatei an setupWizard.invalidSettingsFile=Die angegebene Datei enthält keine Enigmail-Einstellungen. setupWizard.gpgConfExists=Es existiert bereits eine GnuPG-Konfigurationsdatei. Soll sie durch die GnuPG-Konfigurationsdatei aus der Sicherung ersetzt werden? setupWizard.noGpgHomeDir=Es scheint, dass Sie %S zur Verwendung mit GnuPG konfiguriert haben. Dies ist jedoch kein Verzeichnis - Sie können es nicht verwenden. setupWizard.unmachtedIds=Folgende Identitäten Ihres alten Setups konnten nicht zugeordnet werden:\n%S\nDie Einstellungen für diese Identitäten wurden übersprungen. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=Beim Download von GnuPG ist ein Fehler aufgetreten. Bitte prüfen Sie die Fehlerkonsole für weitere Details. installGnuPG.installFailed=Bei der Installation von GnuPG ist ein Fehler aufgetreten. Bitte prüfen Sie die Fehlerkonsole für weitere Details. # Strings in enigmailAddUidDlg.xul addUidDlg.nameOrEmailError=Sie müssen einen Namen und eine E-Mail-Adresse angeben addUidDlg.nameMinLengthError=Der Name muss mindestens 5 Zeichen enthalten addUidDlg.invalidEmailError=Sie müssen eine gültige E-Mail-Adresse angeben # Strings in enigmailCardDetails.js Carddetails.NoASCII=OpenPGP-Smartcards unterstützen nur ASCII-Zeichen in Vor- und Nachname (also beispielsweise keine Umlaute) # network error types errorType.SecurityCertificate=Das Zertifikat des Web-Services ist nicht gültig. errorType.SecurityProtocol=Das vom Web-Service verwendete Sicherheitsprotokoll ist unbekannt. errorType.Network=Ein Netzwerkfehler ist aufgetreten. # filter stuff filter.folderRequired=Sie müssen einen Zielordner auswählen filter.decryptMove.label=Dauerhaft entschlüsseln (Enigmail) filter.decryptCopy.label=Entschlüsselte Kopie anlegen (Enigmail) filter.decryptMove.warnExperimental=Warnung – Die Filter-Aktion „Dauerhaft entschlüsseln“ kann Nachrichten zerstören.\n\nWir empfehlen eindringlich, dass Sie zunächst den Filter „Entschlüsselte Kopie anlegen“ ausprobieren und das Ergebnis sorgfältig prüfen. Nur wenn Sie mit dessen Ergebnis zufrieden sind, sollten Sie diesen Filter hier verwenden. filter.tempPepFilterDesc=Temporärer Filter zum Speichern der gesendeten Nachricht unverschlüsselt filter.term.pgpencrypted.label=OpenPGP-verschlüsselt filter.encrypt.label=Verschlüsseln (Enigmail) filter.keyRequired=Sie müssen einen Empfänger-Schlüssel wählen. filter.keyNotFound=Konnte keinen Verschlüsselungs-Schlüssel finden für "%S". filter.warn.keyNotSecret=Achtung - die Filteraktion "Verschlüsseln" ersetzt den Empfänger.\n\nWenn Sie keinen geheimen Schlüssel für "%S" haben, können Sie die E-Mails nicht mehr lesen. # strings in enigmailConvert.jsm converter.decryptBody.failed=Konnte Nachricht mit folgendem Betreff nicht entschlüsseln:\n„%S“\nWollen Sie es mit einer anderen Passphrase erneut versuchen, oder wollen Sie die Nachricht überspringen? converter.decryptAtt.failed=Konnte Anhang „%1$S“ \nnicht entschlüsseln in Nachricht mit Betreff \n„%2$S“. \nWollen Sie es mit einer anderen Passphrase erneut versuchen, oder wollen Sie die Nachricht überspringen? saveLogFile.title=Log-Datei speichern # strings in gpg.jsm unknownSigningAlg=Unbekannter Signatur-Algorithmus (Kennung: %S) unknownHashAlg=Unbekannter kryptographischer Hash (ID: %S) # strings in keyRing.jsm keyring.photo=Foto keyRing.pubKeyRevoked=Der Schlüssel %1$S (Schlüssel-ID %2$S) wurde widerrufen. keyRing.pubKeyExpired=Der Schlüssel %1$S (Schlüsselkennung %2$S) ist abgelaufen. keyRing.pubKeyNotForSigning=Der Schlüssel %1$S (Schlüsselkennung %2$S) kann nicht zum Signieren verwendet werden. keyRing.pubKeyNotForEncryption=Der Schlüssel %1$S (Schlüssel-ID %2$S) kann nicht zum Verschlüsseln verwendet werden. keyRing.keyDisabled=Der Schlüssel %1$S (Schlüsselkennung %2$S) ist deaktiviert; er kann nicht verwendet werden. keyRing.keyNotTrusted=Der Schlüssel %1$S (Schlüsselkennung %2$S) hat nicht genug Vertrauen. Bitte ändern Sie das Besitzervertrauen des Schlüssels auf „absolut“, um ihn zum Signieren zu verwenden. keyRing.keyInvalid=Der Schlüssel %1$S (Schlüssel-ID %2$S) ist ungültig (er könnte beispielsweise nicht von sich selbst signiert sein). keyRing.signSubKeysRevoked=Alle Signatur-Unterschlüssel des Schlüssels %1$S (Schlüsselkennung %2$S) wurden widerrufen. keyRing.signSubKeysExpired=Alle Signatur-Unterschlüssel des Schlüssels %1$S (Schlüsselkennung %2$S) sind abgelaufen. keyRing.signSubKeysUnusable=Alle Signatur-Unterschlüssel des Schlüssels %1$S (Schlüsselkennung %2$S) sind widerrufen, abgelaufen oder aus anderem Grund unbenutzbar. keyRing.encSubKeysRevoked=Alle Verschlüsselungs-Unterschlüssel des Schlüssels %1$S (Schlüssel-ID %2$S) wurden widerrufen. keyRing.encSubKeysExpired=Alle Verschlüsselungs-Unterschlüssel des Schlüssels %1$S (Schlüssel-ID %2$S) sind abgelaufen. keyRing.noSecretKey=Der private Schlüssel für %1$S (Schlüsselkennung %2$S) scheint in Ihrem Schlüsselbund zu fehlen; dieser Schlüssel kann daher nicht zum Signieren verwendet werden. keyRing.encSubKeysUnusable=Alle Verschlüsselungs-Unterschlüssel des Schlüssels %1$S (Schlüssel-ID %2$S) sind widerrufen, abgelaufen oder aus anderem Grund unbenutzbar. #strings in exportSettingsWizard.js cannotWriteToFile=Datei „%S“ kann nicht gespeichert werden. Bitte wählen Sie eine andere Datei aus. dataExportError=Beim Exportieren der Daten ist ein Fehler aufgetreten. enigmailSettings=Enigmail-Einstellungen defaultBackupFileName=Enigmail-Sicherung specifyExportFile=Geben Sie den Dateinamen für die Sicherung an homedirParamNotSUpported=Zusätzliche Parameter zum Ändern von Pfaden, zum Beispiel --homedir und --keyring, sind beim Exportieren/Wiederherstellen der Einstellungen nicht möglich. Bitte nutzen Sie alternative Möglichkeiten, zum Beispiel die Umgebungsvariable GNUPGHOME. #strings in expiry.jsm expiry.keyExpiresSoon=Ihr Schlüssel %1$S läuft in weniger als %2$S Tagen ab.\n\nEs wird empfohlen, dass Sie ein neues Schlüsselpaar erzeugen und die entsprechenden E-Mail-Konten so einstellen, dass die neuen Schlüssel benutzt werden. expiry.keysExpireSoon=Die folgenden Schlüssel laufen in weniger als %1$S Tagen ab:\n%2$S Wir empfehlen neue Schlüssel zu erzeugen und diese in ihren Accounts zu nutzen. expiry.keyMissingOwnerTrust=Dem geheimen Schlüssel %S fehlt das Vertrauen.\n\nWir empfehlen Ihnen, "Sie verlassen sich auf Zertifikate", um die wichtigsten Eigenschaften zu beenden. expiry.keysMissingOwnerTrust=Folgende geheime Schlüssel sind nicht vertrauenswürdig.\n%S.\nWir empfehlen Ihnen, "verlassen Sie sich auf die Zertifikate", um die wichtigsten Eigenschaften zu beenden. expiry.OpenKeyManager=Enigmail Schlüsselverwaltung öffnen expiry.OpenKeyProperties=Schlüsseleigenschaften öffnen #strings in pEpDecrypt.jsm pEpDecrypt.cannotDecrypt=Dies ist eine verschlüsselte Nachricht. Leider besitzen Sie nicht den passenden privaten Schlüssel um die Nachricht zu entschlüsseln. #strings in gpgAgent.jsm gpghomedir.notexists=Das Verzeichnis '%S' mit den OpenPGP-Schlüsseln existiert nicht und kann nicht erstellt werden. gpghomedir.notwritable=Das Verzeichnis '%S' mit den OpenPGP-Schlüsseln kann nicht beschrieben werden. gpghomedir.notdirectory=Das Verzeichnis '%S' mit den OpenPGP-Schlüsseln ist eine Datei, kein Verzeichnis. gpghomedir.notusable=Bitte korrigieren Sie die Verzeichnisberechtigungen oder ändern Sie den Speicherort Ihres GnuPG "home"-Verzeichnisses. GnuPG funktioniert sonst nicht korrekt. #strings in pepTrustWords.js pepTrustWords.cannotVerifyOwnId=Kann keine p≡p vertrauliche Wörter für Ihren Account verifizieren. pepTrustWords.cannotFindKey=Konnte Schlüssel für %S nicht finden. pepTrustWords.cannotStoreChange=Konnte Vertrauen für den Schlüssel %S nicht ändern. pepTrustWords.generalFailure=Bekommt keine vertrauenswürdige Wörter für %S. pepTrustWords.partnerFingerprint=Fingerabdruck für %S: #strings in mimeWkdHandler.jsm wkdMessage.body.req=Ihr E-Mailanbieter hat Ihre Anfrage zum Hochladen Ihres öffentlichen Schlüssels in das OpenPGP WebKey-Verzeichnis verarbeitet.\n\nBitte klicken Sie auf bestätien im Enigmail-Header, um die Veröffentlichung Ihres öffentlichen Schlüssels abzuschließen. wkdMessage.body.process=Dies ist eine E-Mail im Zusammenhang mit der autom. Verarbeitung, um Ihren öffentlichen Schlüssel in das OpenPGP WebKey-Verzeichnis hochzuladen.\n\nSie müssen an dieser Stelle keine manuelle Handlung durchführen. #strings in pepHandshake.js pepPrivacyStatus.RatingBrokenSuggestion=Entweder Sie oder der Sender sollte die Nachricht erneut versenden. pepPrivacyStatus.RatingHaveNoKeySuggestionOutgoing=Wenn Sie diese Nachricht erstellt haben, ist Ihr Schlüssel nicht verfügbar. pepPrivacyStatus.RatingMistrustSuggestion=Stellen Sie die Verbindung zu Ihrem Kommunikationspartner wieder her und versuchen Sie einen weiteren Handshake. pepPrivacyStatus.RatingReliableSuggestion=Führen Sie einen Handshake mit Ihrem Kommunikationspartner durch, zum Austausch vertrauenswürdiger Wörter, persönlich oder über das Telefon. Ein Handshake wird nur einmal pro Partner benötigt und sorgt für sichere und vertrauensvolle Kommunikation. pepPrivacyStatus.RatingTrustedSuggestion=Keine Aktion notwendig! pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Beachten Sie, dass die Nachricht möglicherweise nicht sicher ist. pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Bitte fügen Sie die notwendigen Informationen hinzu. pepPrivacyStatus.RatingUnderAttackSuggestion=Den Inhalt dieser Nachricht mit Ihrem Kommunikationspartner separat prüfen. pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Stellen Sie sicher, dass der Datenschutzstatus für jeden aufgeführten Kommunikations-Partner sicher ist. pepPrivacyStatus.RatingUnencryptedSuggestion=Bitte fragen Sie Ihren Kommunikationspartner Verschlüsselungslösungen zu nutzen oder p≡p zu installieren. pepPrivacyStatus.RatingUnreliableSuggestion=Diese Nachricht hat keine zuverlässige Verschlüsselung oder keine Signatur. Fragen Sie Ihren Kommunikationspartner, um seine Verschlüsselungslösungen zu aktualisieren oder p≡p zu installieren. pepPrivacyStatus.RatingBrokenExplanation=Diese Nachricht hat eine defekte Verschlüsselung oder Formatierung. pepPrivacyStatus.RatingHaveNoKeyExplanation=Diese Nachricht kann nicht entschlüsselt werden, da der Schlüssel nicht verfügbar ist. pepPrivacyStatus.RatingMistrustExplanation=Diese Nachricht hat einen Kommunikationspartner der früher als misstraut markiert wurde. pepPrivacyStatus.RatingReliableExplanation=Die Nachricht ist sicher, aber Sie müssen noch die Identität des Kommunikations-Partners prüfen. pepPrivacyStatus.RatingTrustedExplanation=Diese Nachricht ist sicher und vertraut. pepPrivacyStatus.RatingUndefinedExplanation=Diese Nachricht enthält nicht genügend Infos, um festzustellen, ob sie sicher ist. pepPrivacyStatus.RatingUnderAttackExplanation=Diese Nachricht ist unsicher und wurde manipuliert. pepPrivacyStatus.RatingUnencryptedExplanation=Diese Nachricht ist unsicher. pepPrivacyStatus.RatingUnencryptedForSomeExplanation=Diese Nachricht ist unsicher für manche der Kommunikationspartner. pepPrivacyStatus.RatingUnreliableExplanation=Diese Nachricht hat einen unzuverlässigen Schutz. pepPrivacyStatus.RatingBrokenText=Defekt pepPrivacyStatus.RatingHaveNoKeyText=Entschlüsselung fehlgeschlagen pepPrivacyStatus.RatingMistrustText=Misstraut pepPrivacyStatus.RatingReliableText=Sicher pepPrivacyStatus.RatingTrustedText=Sicher & Vertraut pepPrivacyStatus.RatingUndefinedText=Unbekannt pepPrivacyStatus.RatingUnderAttackText=Wird angegriffen pepPrivacyStatus.RatingUnencryptedForSomeText=Für einige unsicher pepPrivacyStatus.RatingUnencryptedText=Unsicher pepPrivacyStatus.RatingUnreliableText=Unzuverlässige Sicherheit handshakeDlg.button.initHandshake=Handschlag... handshakeDlg.button.stopTrust=Vertrauen stoppen handshakeDlg.button.reTrust=Misstrauen stoppen handshakeDlg.label.outgoingMessage=Ausgehende Nachricht handshakeDlg.label.incomingMessage=Eingehende Nachricht handshakeDlg.error.noPeers=Kann ohne Hände schütteln nicht korrespondieren. handshakeDlg.error.noProtection=Bitte aktivieren Sie den Schutz, um die Handshake-Funktion nutzen zu können. enigmail.acSetupPasswd.descEnterPasswd=Bitte geben Sie den Einrichtungscode ein, der auf dem anderen Gerät angezeigt wird enigmail.acSetupPasswd.descCopyPasswd=Bitte geben Sie den untenstehenden Einrichtungscode auf Ihrem anderen Gerät ein, um mit der Installation fortzufahren #strings in autocrypt.jsm autocrypt.setupMsg.subject=Autocrypt-Einrichtungsnachricht autocrypt.setupMsg.msgBody=Um Ihr neues Gerät für Autocrypt einzurichten, folgen Sie bitte den Anweisungen, die von Ihrem neuen Gerät angezeigt werden sollten. autocrypt.setupMsg.fileTxt=Dies ist die Autocrypt-Einrichtungsdatei, die für die Übertragung von Einstellungen und Schlüsseln zwischen Clients verwendet wird. Sie können sie mit dem Einrichtungscode entschlüsseln, den Sie auf Ihrem alten Gerät finden, und dann den enthaltenen Schlüssel in Ihren Schlüsselbund importieren. #strings in upgradeInfo.html upgradeInfo.doctitle=Was gibt es Neues in Enigmail v2.0? upgradeInfo.welcome1=Willkommen bei der neuen Enigmail-Version 2.0! upgradeInfo.welcome2=Die Version enthält viele neue und geänderte Funktionen. Bitte nehmen Sie sich eine Minute Zeit, um zu erfahren, was es Neues gibt: upgradeInfo.encSubject.title=Verschlüsselung des Betreffs der Nachricht upgradeInfo.encSubject.desc=Wir haben eine neue Methode entwickelt, welche den Betreff in die verschlüsselte E-Mail verschiebt und den sichtbaren Betreff durch "Encrypted Message" ersetzt. Wenn eine solche Nachricht entschlüsselt wird, wird der Betreff automatisch durch den originalen Betreff ersetzt. Diese Funktionalität ist standardmäßig aktiviert, es gibt jedoch eine Einstellung, mit der man sie ausschalten kann. (Für diese Methode muss die Nachricht per PGP/MIME gesendet werden.) upgradeInfo.buttons.title=Geändertes Verhalten der Schaltflächen zum Verschlüsseln und Signieren upgradeInfo.buttons.desc=Die SchaltflächenVerschlüsseln und Signieren im Fenster Nachricht verfassen funktionieren nun sowohl für das OpenPGP- als auch für das S/MIME-Protokoll. Wenn beide Algorithmen möglich sind, wird Enigmail versuchen, denjenigen zu bevorzugen, für den alle Schlüssel verfügbar sind. upgradeInfo.autocrypt.title=Unterstützung für Autocrypt upgradeInfo.autocrypt.desc=Enigmail unterstützt nun Autocrypt, einen neuen Standard zur Verteilung von Schlüsseln als Teil der gesendeten Nachrichten. Enigmail importiert automatisch Schlüssel aus Autocrypt-kompatiblen Nachrichten, so dass im Laufe der Zeit immer mehr E-Mails verschlüsselt werden können. upgradeInfo.pEp.title=Neuer p≡p Junior-Modus (Pretty Easy Privacy) upgradeInfo.pEp.desc=Enigmail enthält jetzt einen p≡p Junior-Modus. Derzeit müssen Sie dazu p≡p manuell installieren; dies wird sich in einer zukünftigen Version ändern. Der p≡p Junior-Modus ermöglicht es Ihnen, die OpenPGP-Verschlüsselung so transparent wie möglich zu nutzen; Sie müssen sich nicht mehr um die Schlüsselverwaltung und die Synchronisation von Schlüsseln zwischen Geräten kümmern. upgradeInfo.bottom.desc=Bitte beachten Sie unsere Dokumentation, um Hilfe zur Verwendung von Enigmail zu erhalten. pep.missingGnuPG=Für die Verwendung von Enigmail/p≡p wird GnuPG benötigt. Da wir es nicht finden konnten, schlagen wir vor, es für Sie herunterzuladen und zu installieren. #strings in enigmailAbout.html aboutEnigmail.tabName=Über Enigmail aboutEnigmail.title=OpenPGP-Unterstützung bereitgestellt durch Enigmail aboutEnigmail.team=Enigmail wird vom Enigmail Team entwickelt: aboutEnigmail.projectLeader=Leitender Entwickler: aboutEnigmail.usability=Benutzerfreundlichkeit: aboutEnigmail.documentation=Dokumentation: aboutEnigmail.testing=Testen: aboutEnigmail.userSupport=Anwender-Support: aboutEnigmail.localization=Lokalisierung: Siehe die Enigmail-Sprachpakete-Seite aboutEnigmail.Credits=Danksagungen: aboutEnigmail.origAuthor=Ursprünglicher Autor der Enigmail-Erweiterung aboutEnigmail.icons=Symbole: aboutEnigmail.formerMembers=Ehemalige Mitglieder des Teams: aboutEnigmail.projectHosting=Projekt-Hosting: aboutEnigmail.licenseSupportTitle=Lizenz & Unterstützung aboutEnigmail.license=Enigmail OpenPGP ist quelloffen und lizenziert unter der %S aboutEnigmail.support=Support und Download ist verfügbar unter www.enigmail.net. enigmail-2.0.8/lang/de/help/000077500000000000000000000000001334302754500155555ustar00rootroot00000000000000enigmail-2.0.8/lang/de/help/compose.html000066400000000000000000000111471334302754500201140ustar00rootroot00000000000000 Enigmail-Hilfe: Verfassen von Nachrichten

Enigmail-Hilfe

Verwenden von Enigmail beim Verfassen von Nachrichten

Menü "Enigmail" im Fenster "Verfassen"
Nachricht unterschreiben
Unterschreiben von Nachrichten aktivieren / deaktivieren. Der Benutzer wird benachrichtigt, falls das Unterschreiben fehlschlägt.
Nachricht verschlüsseln

Verschlüsselung an alle Adressaten aktivieren / deaktivieren. Der Benutzer wird benachrichtigt, falls die Verschlüsselung fehlschlägt.

Falls Auswahl anzeigen, wenn notwendig im Menü Enigmail -> Einstellungen -> Schlüsselauswahl... eingestellt ist, dann wird eine Liste mit Schlüsseln erscheinen, wenn Sie keinen öffentlichen Schlüssel für einen oder mehrere Empfänger der Nachrichten besitzen.

Falls Auswahlfenster nie anzeigen im Menü Enigmail -> Einstellungen -> Schlüsselauswahl... eingestellt ist, dann wird die Nachricht an die Empfänger unverschlüsselt gesendet, von denen Sie keinen öffentlichen Schlüssel besitzen.

PGP/MIME verwenden
Verwenden von PGP/MIME für diese Nachricht ermöglichen / nicht ermöglichen.

Wenn Sie wissen, dass die Empfänger das PGP/MIME-Format verwenden können, dann sollten Sie dies benutzen.

Diese Möglichkeit hängt von den Einstellungen unter Enigmail -> Einstellungen -> PGP/MIME... ab. Hier muss PGP/MIME verwenden, wenn möglich oder Immer PGP/MIME verwenden aktiviert sein.

Einstellungen (Untermenü)
  • Unterschrift/Verschlüsselung...: Abkürzung zu den Konten-Einstellungen -> OpenPGP-Sicherheit.
  • Senden...: Abkürzung zu Einstellungen -> Senden.
  • Schlüsselwauswahl...: Abkürzung zu Einstellungen -> Schlüsselauswahl.
Empfängerregeln
Öffnet den Dialog mit den Empfängerregeln.
Verschlüsselung rückgängig machen

Wenn es einen Fehler beim Senden der Nachricht gibt, also z.B. der POP-Server nicht erreichbar ist, dann wird Enigmail dies nicht wissen und die verschlüsselte Nachricht wird auch weiterhin im Fenster "Verfassen" angezeigt. Dieser Menüpunkt nimmt die Verschlüsselung / das Unterschreiben zurück und das Fenster "Verfassen" kehrt zum Originaltext zurück.

Als vorläufige Maßnahme kann über diesen Menüpunkt auch eine verschlüsselte Nachricht, die man zitiert und auf die man antwortet, entschlüsselt angezeigt werden. Enigmail sollte zitierte Nachrichten automatisch entschlüsseln, was bisher jedoch fehlschlägt. Über diesen Menüeintrag kann Enigmail zur Entschlüsselung gezwungen werden.

Meinen öffentlichen Schlüssel anhängen
Hägt an die Nachricht Ihren öffentlichen Schlüssel im ASCII-Format an.
Öffentlichen Schlüssel anhängen
Hägt an die Nachricht öffentliche Schlüssel im ASCII-Format an. Sie können die gewünschten Schlüssel dazu auswählen.
Passphrase aus Zwischenspeicher löschen
Löscht die gespeicherte Passphrase. Nützlich, falls Sie mehrere Passphrasen verwenden.
Hilfe
Zeigt die Hilfe an (diese Seite).

Weitere Hilfe ist verfügbar auf der Enigmail-Hilfeseite

enigmail-2.0.8/lang/de/help/editRcptRule.html000066400000000000000000000131311334302754500210500ustar00rootroot00000000000000 Enigmail-Hilfe: Enigmail-Empfägerregel bearbeiten

Enigmail-Hilfe

Enigmail-Empfängerregeln bearbeiten

Es können Standards für einen Empfänger bezüglich Verschlüsselung, Unterschreiben und PGP/MIME sowie die Verwendung von OpenPGP-Schlüsseln festgelegt werden. In diesem Dialog können Sie Regeln für einen einzelnen Empfänger sowie Gruppen von Empfängern mit ähnlichen Eigenschaften festlegen.

Regel für
Beinhaltet die E-Mail-Adressen der Empfänger (ohne Namen, also z.B. einfach somebody@email.domain). Sie können mehrere E-Mail-Adressen festlegen; die Adressen müssen mit Leerzeichen voneinander getrennt sein. Die eingegebenen Adressen können auch nur aus dem Domain-Namen bestehen, so dass die Regel auf alle Mails dieser Domain angewendet wird, also z.B. @email.domain bezieht ein body@email.domain, somebody@email.domain, anybody@email.domain, etc.
Anwenden, wenn Empfänger...
Dies modifiziert die Übereinstimmung der E-Mail-Adressen. Wenn mehrere E-Mail-Adressen eingegeben werden, dann wird diese Einstellung auf alle angewendet. Die folgenden Beispiele beziehen sich auf die Adresse body@email.domain, die im oberen Feld Enigmail-Empfängerregel eingegeben wurde.
  • ist exakt: Mit dieser Einstellung wird die Regel nur angewendet, wenn die E-Mail-Adresse body@email.domain lautet (exakt, Gross-/Kleinschreibung wird nicht beachtet).
  • enthält: Regel wird angewendet, wenn die Zeichenfolge in der E-Mail-Adresse auftaucht, also z.B. anybody@email.domain oder body@email.domain.net
  • beginnt mit: Regel wird angewendet, wenn die Zeichenfolge am Beginn der E-Mail-Adresse steht, also z.B. body@email.domain.net, body@email.domain-name.com.
  • endet mit: Regel wird angewendet, wenn die Zeichenfolge am Ende der E-Mail-Adresse steht, also z.B. anybody@email.domain, somebody@email.domain.
Weitere Regeln auf passende Adresse prüfen
Diese Einstellung erlaubt Ihnen, eine Regel zu erstellen ohne eine spezielle Schlüssel-ID in Verwende folgende OpenPGP-Schlüssel angeben zu müssen. Die E-Mail-Adresse wird für die Auswahl des passenden Schlüssels beim Senden genutzt. Weitere Regeln für die gleiche E-Mail-Adresse werden auch ausgeführt.
Weitere Regeln nicht auf passende Adresse prüfen
Bei dieser Einstellung werden weitere Regeln nicht mehr ausgeführt, sobald eine passende Regel gefunden wurde.
Verwende folgende OpenPGP-Schlüssel:
Nutzen Sie die Schaltfläche Auswählen..., um die gewünschten Schlüssel auszuwählen. Auch hier werden keine weiteren Regeln ausgeführt.
Unterschreiben
Unterschreiben von Nachrichten ermöglichen / nicht ermöglichen. Diese Einstellung verwendet oder übergeht, was Sie im Fenster "Verfassen" angegeben haben. Die möglichen Einstellungen lauten:
  • Nie: Unterschreiben nicht ermöglichen, auch wenn es im Fenster "Verfassen" möglich war (andere Einstellungen werden übergangen).
  • Ja, wenn beim Verfassen ausgewählt: Übernimmt die Einstellung, die beim Verfassen gewählt wurde.
  • Immer: Unterschreiben ermöglichen, selbst wenn es nicht im Fenster "Verfassen" ermöglicht war.
Diese Unterschriftseinstellungen werden bei allen übereinstimmenden Regeln angewendet. Wenn eine der Regeln das Unterschreiben nicht ermöglicht, dann wird die Nachricht ungeachtet anderer Regeln, die Immer vorschreiben, nicht unterschrieben.
Verschlüsselung
Verschlüsselung ermöglichen / nicht ermöglichen. Die möglichen Einstellungen und Bedeutungen stimmen mit den oben genannten überein.
PGP/MIME
Verschlüsselung mit PGP/MIME (RFC 3156) ermöglichen / nicht ermöglichen. Wenn nicht PGP/MIME abgestellt (nicht möglich) ist, dann wird die Nachricht per "Inline PGP" verschlüsselt. Die möglichen Einstellungen und Bedeutungen stimmen mit den oben genannten überein.

Die Regeln werden in der Reihenfolge, wie sie in der Liste im Dialog "Enigmail-Empfängerregeln" erscheinen, angewendet. Wann immer eine Regel auf einen Empfänger zutrifft und eine OpenPGP-Schlüssel-ID enthält, dann wird der Empfänger nach Verwendung der angegeben Schlüssel-ID bei den nachfolgenden Regeln nicht mehr beachtet.


Weitere Hilfe ist verfügbar auf der Enigmail Per-Recipient Settings Seite

enigmail-2.0.8/lang/de/help/initError.html000066400000000000000000000053561334302754500204310ustar00rootroot00000000000000 Enigmail-Hilfe: Beheben von Problemen bei der Enigmail-Initialisierung

Enigmail-Hilfe

Beheben von Problemen bei der Enigmail-Initialisierung

Es gibt verschiedene Ursachen für ein Fehlschlagen der Enigmail-Initialisierung. Die bekanntesten werden unten beschrieben& für weitere Informationen besuchen Sie bitte die Enigmail-Hilfe-Webseite.

GnuPG konnte nicht gefunden werden

Damit Enigmail funktionieren kann, muss die Anwendung GnuPG installiert sein. Wenn GnuPG nicht gefunden werden kann, stellen Sie als erstes sicher, dass die Anwendung gpg.exe (für Windows& gpg für andere Plattformen) auf Ihrem PC tatsächlich vorhanden ist. Wenn GnuPG (gpg.exe bzw. gpg) tatsächlich installiert ist, aber Enigmail kann es trotzdem nicht finden, müssen Sie den Pfad zu GnuPG manuell in den Enigmail-Einstellungen angeben (Menü Enigmail > Einstellungen...).

Initialisierung von EnigMIME ist fehlgeschlagen

Enigmail funktioniert nur, wenn es in der gleichen Entwicklungsumgebung wie Thunderbird bzw. Seamonkey erstellt (kompiliert) wurde. Sie können das offizielle Enigmail zusammen mit offiziellen Veröffentlichungen von Thunderbird bzw. Seamonkey von mozilla.org verwenden.

Wenn Sie Thunderbird oder Seamonkey in einer Version/Variante von einer anderen Quelle verwenden (z.B. vom Anbieter einer Linux-Distribution), oder wenn Sie die Anwendung selbst kompiliert haben, müssen Sie auch Enigmail in einer Version verwenden, die in der gleichen Entwicklungsumgebung kompiliert wurde. Um Enigmail selbst zu kompilieren, beachten Sie bitte die Angaben auf der Enigmail-Webseite im Bereich Source-Code. Bitte erstellen Sie keine Fehlerhinweise (Bugs) zu diesem Problem, da es dazu keine andere Lösung gibt.


Weitere Hilfe ist verfügbar unter Enigmail-Hilfeseite

enigmail-2.0.8/lang/de/help/messenger.html000066400000000000000000000131431334302754500204350ustar00rootroot00000000000000 Enigmail-Hilfe: Lesen von Nachrichten

Enigmail-Hilfe

Verwenden von Enigmail beim Lesen von Nachrichten

Schaltfläche "Entschlüsseln" im Hauptfenster
Diese Schaltfläche kann für mehrere Zwecke verwendet werden: zum Entschlüsseln, Überprüfen, oder Importieren von öffentlichen Schlüsseln. Im Normalfall werden Nachrichten automatisch entschlüsselt und überprüft. Dies kann jedoch in den Einstellungen deaktiviert werden. Sollte das Entschlüsseln fehlschlagen, dann erscheint im Regelfall eine kurze Fehlermeldung in der Statuszeile von Enigmail. Sie werden dann, wenn Sie die Schaltfläche "Entschlüsseln" anklicken, eine detaillierte Fehlermeldung (inklusive der Meldung von der OpenPGP-Kommandozeile) erhalten.
Schlüssel- und/oder Stift-Symbol in der Statusleiste einer Nachricht
Das Stift- und das Schlüssel-Symbol in der Statusleiste geben an, ob die Nachricht unterschrieben und/oder verschlüsselt ist und ob die Unterschrift gültig ist, d.h. dass die Nachricht seit ihrem Senden nicht geändert wurde. Falls die Nachricht geändert wurde, wird der Stift rot dargestellt, um auf die Ungültigkeit der Unterschrift hinzuweisen. Nach einem Klick auf "Details" in der Enigmail-Zeile im Nachrichtenkopf wird ein Menü mit den folgenden Optionen angezeigt:
  • Schlüssel importieren: importiert eventuell angehängte öffentliche Schlüssel in Ihren Schlüsselring in der Schlüsselverwaltung.
  • Enigmail-Sichheitsinfo...: ermöglicht Ihnen, die Statusmeldungen der Enigmail-Kommandozeile für die Nachricht anzusehen.
  • Enigmail-Sicherheitsinfo kopieren: kopiert die Statusmeldungen von Enigmail in die Zwischenablage, damit man sie z.B. in eine Antwortnachricht etc. einfügen kann.
  • Foto-ID anzeigen: ermöglicht Ihnen, die Foto-ID der Person, die die Nachricht gesendet hat, anzusehen, falls diese ein Foto in dem öffentlichen Schlüssel eingebettet hat. (Diese Option is nur verfügbar wenn ein Foto in dem öffentlichen Schlüssel eingebettet ist.)
  • Schlüssel unterschreiben: lässt Sie den Schlüssel des Absenders unterschreiben.
  • Besitzervertrauen des Absenders festlegen...: lässt Sie das Besitzervertrauen des Absenders festlegen, falls dessen Schlüssel in Ihrem Schlüsselring vorhanden ist.

Falls Sie keyserver-options auto-key-retrieve nicht in der Datei gpg.conf eingestellt haben, und Sie lesen eine Nachricht, die signiert oder verschlüsselt ist, dann erscheint ein Stift-Symbol mit einem Fragezeichen. Die Enigmail-Statuszeile im Kopfzeilenbereich der Nachricht wird melden: Ein Teil der Nachricht ist signiert; klicken Sie auf das Stift-Symbol für Details, und im Nachrichtentext werden alle PGP-Nachrichtenblockanzeiger und Signaturblöcke angezeigt.

Dies kann außerdem angezeigt werden, wenn Sie keyserver-options auto-key-retrieve in der Datei gpg.conf eingestellt haben aber der OpenPGP-Schlüssel nicht auf dem voreingestellten Schlüssel-Server verfügbar ist.

Wenn Sie auf das Schlüssel mit Fragezeichen-Symbol klicken, dann erhalten Sie die Meldung, dass der Schlüssel nicht in Ihrem Schlüsselring verfügbar ist. Wenn Sie OK klicken, dann öffnet sich ein Fenster mit einer Liste von Schlüssel-Servern, aus der Sie einen auswählen können, um den öffentlichen Schlüssel des Absenders herunterzuladen.

Um die Liste der Schlüssel-Server, die Sie verwenden möchten, zu konfigurieren, gehen Sie zu Enigmail -> Einstellungen... -> Allgemein und geben die Adressen der Schlüssel-Server im Feld Schlüssel-Server ein (jeweils getrennt durch ein Komma). Der erste Schlüssel-Server wird als voreingestellter Server verwendet.

Öffnen von verschlüsselten Dateianhängen / Importieren von angehängten OpenPGP-Schlüsseln
Dateianhänge mit den Endungen *.pgp, *.asc und *.gpg werden von Enigmail als Anhänge erkannt, die speziell mit Enigmail bearbeitet werden können. Durch einen Rechtsklick auf solch einen Dateianhang werden zwei spezielle Menüeinträge im Kontextmenü angezeigt: Entschlüsseln und Öffnen und Entschlüsseln und Speichern. Verwenden Sie diese Menüeinträge, falls Enigmail einen Dateianhang entschlüsseln soll, bevor Sie ihn öffnen oder speichern. Wenn ein Anhang als PGP-Schlüsseldatei erkannt wird, dann werden Sie gefragt, ob sie diese(n) Schlüssel in ihren Schlüsselring importieren möchten.

Weitere Hilfe ist verfügbar unter Enigmail Hilfeseite

enigmail-2.0.8/lang/de/help/rulesEditor.html000066400000000000000000000073241334302754500207520ustar00rootroot00000000000000 Enigmail-Hilfe: Enigmail-Empfägerregeln

Enigmail-Hilfe

Enigmail-Empfängerregeln

Mit dem Regel-Editor kann man Standards in Bezug auf Verschlüsselung, Unterschreiben und PGP/MIME für bestimmte Empfänger und die Benutzung von Schlüsseln einstellen. Jede Regel besteht aus 5 Feldern und ist in einer einzelnen Zeile zu finden:

E-Mail-Adresse
Die E-Mail-Adressen der Felder "An:", "CC:" und "BCC:", die übereinstimmen sollen. Die Übereinstimmung arbeitet mit substrings (Weitere Details im Dialog "Enigmail-Empfängerregel bearbeiten").
OpenPGP-Schlüssel
Eine Liste der OpenPGP-Schlüssel-IDs, die für den Empfänger verwendet werden sollen.
Unterschreiben
Unterschreiben von Nachrichten ermöglichen / nicht ermöglichen. Dies verwendet die Einstellungen, die im Fenster "Verfassen" angegeben sind oder setzt sich darüber hinweg. Es gibt folgende Optionen:
  • Nie: Unterschreiben unmöglich, selbst wenn im Fenster "Verfassen" angegeben (setzt sich über andere Einstellungen hinweg).
  • Ja, wenn beim Verfassen ausgewählt: Einstellung aus dem Fenster "Verfassen" wird übernommen.
  • Immer: Unterschreiben, selbst wenn nicht im Fenster "Verfassen" angegeben.

Diese Unterschriftseinstellungen werden auf alle Regeln angewendet, die übereinstimmen. Wenn eine der Regeln das Unterschreiben unmöglich macht, dann wird die Nachricht nicht unterschrieben - auch wenn bei anderen Regeln Immer angegeben ist.

Verschlüsseln
Verschlüsselung ermöglichen / nicht ermöglichen. Die möglichen Einstellungen und ihre Bedeutungen stimmen mit den oben genannten überein.
PGP/MIME
Verwenden von PGP/MIME (RFC 3156) ermöglichen / nicht ermöglichen. Falls PGP/MIME nicht möglich ist, dann werden die Nachrichten per "Inline PGP" verschlüsselt. Die möglichen Einstellungen und ihre Bedeutungen stimmen mit den oben genannten überein.

Die Regeln werden in der Reihenfolge, wie sie in der Liste erscheinen, angewendet. Wann immer eine Regel auf einen Empfänger zutrifft und eine OpenPGP-Schlüssel-ID enthält, dann wird der Empfänger nach Verwendung der angegeben Schlüssel-ID bei den nachfolgenden Regeln nicht mehr beachtet.

Hinweis: Der Regel-Editor ist noch nicht komplett. Es ist möglich, weiter fortgeschrittene Regeln zu schreiben, indem man direkt die Regel-Datei bearbeitet (diese Regeln sollten danach nicht mehr mit dem Regel-Editor bearbeitet werden). Weitere Informationen, wie die Datei bearbeitet werden muss, gibt es auf der Enigmail-Homepage


Weitere Hilfe ist verfügbar auf der Enigmail-Hilfeseite

enigmail-2.0.8/lang/de/help/sendingPrefs.html000066400000000000000000000064301334302754500210750ustar00rootroot00000000000000 Enigmail Help: Edit Enigmail Rule

Enigmail-Hilfe

Optionen zum Verschlüsselten Senden

In den Senden Einstellungen kann man prinzipiell das Modell und die prinzipiellen Einstellungen zum Verschlüsseln einstellen.

Bequeme Verschlüsselung
Mit diesen Einstellungen wird möglichst immer ohne Rückfragen verschlüsselt.

Diese Einstellungen sind vor allem dann angemessen, wenn man einfach nur seine Privatsphäre erhöhen will, indem man Emails möglichst verschlüsselt statt unverschlüsselt verschickt.

Der Effekt ist wie wenn man Emails statt als Postkarten als Briefe versendet. Im Gegensatz zu Postkarten kann damit unterwegs nicht mehr jeder den Inhalt der Email einfach so mitlesen.

Wie bei Briefen bietet das aber keine absolute Garantie, dass die Emails unterwegs nicht von anderen gelesen werden können (auch wenn dazu ein gewisser technischer Aufwand notwendig ist).

Ein ganz konkretes Risiko besteht darin, aus Versehen "gefälschte Schlüssel" zu verwenden, die man von irgendjemanden oder irgendwo bekommen hat und nur behauptet wurde, dass der Schlüssel zur angegebenen Email-Adresse gehört. Um dieses Risiko zu vermeiden, sollte man nur Schlüssel akzeptieren, denen man vertrauen kann (siehe unten), oder immer selbst einen Schlüssel anhand des Fingerabdrucks mit dem Eigentümer abgleichen (und unterschreiben).

Manuelle Verschlüsselung
Mit dieser Option kann man die verschiedenen Einstellungen zur Verschlüsselung nach den eigenen Vorstellungen anpassen. Man kann festlegen
  • ob auf verschlüsselte/signierte Emails automatisch verschlüsselt/signiert geantwortet werden soll.
  • ob man nur Schlüssel akzeptieren will, denen man auch vertrauen kann (dies aktiviert das OpenPGP Vertrauensmodell, durch das man nur Schlüsseln vertraut, die von einem selbst oder Personen, denen man trauen kann, unterschrieben wurden).
  • ob man möglichst immer automatisch verschlüsseln will.
  • ob und unter welchen Umständen eine ausgehende Email (und deren Verschlüsselung) final bestätigt werden muss.
Falls es wichtig ist, dass der Inhalt von verschlüsselten Emails nicht von anderen Personen oder Organisationen gelesen werden können, sollte man zumindest bei den manuellen Einstellungen die Option einschalten, mit der nur vertrauenswürdige Schlüssel akzeptiert werden. Während dies das Risiko der Verwendung von "gefälschten Schlüsseln" reduziert, muss man dazu aber in der Schlüsselverwaltung Schlüssel aktiv unterschreiben und/oder aktiv bestätigen, welchen Email-Adressen (Personen/Organisationen) man trauen kann, wenn diese die Gültigkeit von Schlüssel bestätigen.


Weitere Hilfe ist verfügbar auf der Enigmail-Hilfeseite

enigmail-2.0.8/lang/el/000077500000000000000000000000001334302754500146355ustar00rootroot00000000000000enigmail-2.0.8/lang/el/am-enigprefs.properties000066400000000000000000000001311334302754500213230ustar00rootroot00000000000000# Strings used in the Mozill AccountManager prefPanel-enigprefs=Ασφάλεια OpenPGP enigmail-2.0.8/lang/el/enigmail.dtd000066400000000000000000001656261334302754500171370ustar00rootroot00000000000000 ' στις διευθÏνσεις email"> ' στις διευθÏνσεις email του GnuPG. ΑπενεÏγοποίηση αν ο παÏαλήπτης χÏησιμοποιεί κλειδιά Hushmail."> ΣΗΜΕΙΩΣΗ: Η δημιουÏγία του ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï Î¼Ï€Î¿Ïεί να διαÏκέσει αÏκετά λεπτά. Μην τεÏματίσετε την εφαÏμογή κατά τη διάÏκεια της δημιουÏγίας του κλειδιοÏ. Κατά τη διάÏκεια της δημιουÏγίας του ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï Î¸Î± ήταν καλό να κάνετε κάποιες εÏγασίες που χÏησιμοποιοÏν τους πόÏους του συστήματος (επεξεÏγαστή, μνήμη, δίσκο) για να αυξηθεί η εντÏοπία και να επισπευσθεί η δημιουÏγία του κλειδιοÏ. Θα ειδοποιηθείτε όταν ολοκληÏωθεί η δημιουÏγία του κλειδιοÏ."> ' δεν είναι έγκυÏο"> ΣΗΜΕΙΩΣΗ: Η δημιουÏγία του ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï Î¼Ï€Î¿Ïεί να διαÏκέσει αÏκετά λεπτά. Μην τεÏματίσετε την εφαÏμογή κατά τη διάÏκεια της δημιουÏγίας του κλειδιοÏ. Θα ειδοποιηθείτε όταν ολοκληÏωθεί η δημιουÏγία του κλειδιοÏ."> Σημείωση: Το Enigmail θα επαληθεÏει πάντα τις υπογÏαφές των μηνυμάτων όλων των λογαÏιασμών και ταυτοτήτων, ανεξάÏτητα αν είναι ενεÏγοποιημένο για αυτές ή όχι"> ΕυχαÏιστοÏμε που χÏησιμοποιείτε το Enigmail."> enigmail-2.0.8/lang/el/enigmail.properties000066400000000000000000002122201334302754500205370ustar00rootroot00000000000000Enigmail=Enigmail ##################################################################### # Strings used within enigmailCommon.js and enigmailCommon.jsm ##################################################################### enigAlert=Ειδοποίηση του Enigmail enigConfirm=Επιβεβαίωση του Enigmail # enigInfo=Enigmail Information enigError=Σφάλμα του Enigmail enigPrompt=ΕÏώτηση του Enigmail dlgYes=&Îαι dlgNo=ÎŒ&χι dlgKeepSetting=Απομνημόνευση της απάντησής μου ώστε να μην εÏωτηθώ ξανά dlgNoPrompt=Îα μην εμφανιστεί ξανά αυτός ο διάλογος dlg.button.delete=&ΔιαγÏαφή dlg.button.cancel=&ΑκÏÏωση dlg.button.close=&Κλείσιμο dlg.button.continue=Συνέ&χεια dlg.button.skip=Πα&Ïάλειψη # dlg.button.overwrite=&Overwrite dlg.button.view=&ΠÏοβολή # dlg.button.retry=&Retry # dlg.button.ignore=&Ignore # dlg.button.install=&Install # dlg.button.ok=&OK repeatPrefix=\n\nΑυτή η ειδοποίηση θα επαναληφθεί %S repeatSuffixSingular=φοÏά ακόμα. repeatSuffixPlural=φοÏές ακόμα. noRepeat=\n\nΑυτή η ειδοποίηση δε θα ξαναεμφανιστεί μέχÏι να αναβαθμίσετε το Enigmail. pgpNotSupported=Απ' ότι φαίνεται χÏησιμοποιείτε το Enigmail μαζί με το PGP 6.x\n\nΔυστυχώς, το PGP 6.x έχει οÏισμένες ατέλειες που εμποδίζουν το Enigmail να λειτουÏγήσει σωστά. Για αυτό το λόγο, το Enigmail δεν υποστηÏίζει πια το PGP 6.x ΠαÏακαλώ χÏησιμοποιήστε το GnuPG (GPG).\n\nΑν χÏειάζεστε πεÏισσότεÏη βοήθεια για τη χÏήση του GnuPG, ανατÏέξτε στο τμήμα Βοήθειας στο δικτυακό τόπο του Enigmail. # initErr.howToFixIt=In order to use Enigmail, GnuPG is required. If you did not install GnuPG yet, the easiest way to do this is using the "Setup Wizard" button below. # initErr.setupWizard.button=&Setup Wizard passphraseCleared=Η φÏάση ÎºÏ‰Î´Î¹ÎºÎ¿Ï Î¼Î·Î´ÎµÎ½Î¯ÏƒÏ„Î·ÎºÎµ. # cannotClearPassphrase=You are using a non-standard tool (such as gnome-keyring) for passphrase handling. Clearing the passphrase is therefore not possible from within Enigmail. noPhotoAvailable=Δεν υπάÏχει διαθέσιμη φωτογÏαφία debugLog.title=Enigmail Debug Log error.photoPathNotReadable=Η διαδÏομή εικόνων '%S' δεν είναι Ï€Ïοσβάσιμη # generalError=Error: %S # Strings in configure.jsm # enigmailCommon.versionSignificantlyChanged=This new version of Enigmail has significant changes in the handling of preferences and options. We tried to transfer the old settings to this new version. However, we cannot cover all cases automatically. Please double check the resulting new preferences and options. # enigmailCommon.checkPreferences=Check Preferences ... # preferences.defaultToPgpMime=We have changed the default message encoding in Enigmail from Inline-PGP to PGP/MIME. We recommend you keep this as default.\n\nIf you still wish to use Inline-PGP by default, you can do so in the Account Settings under OpenPGP Security. ##################################################################### # Strings in enigmailAbout.js ##################################################################### usingVersion=ΧÏησιμοποιείται το Enigmail έκδοση %S # enigmailPepVersion=Enigmail/p≡p version %S usingAgent=ΧÏησιμοποιείται το %S (εκτελέσιμο: %S) για υπογÏαφή και κÏυπτογÏάφηση agentError=ΣΦΑΛΜΑ: ΑδÏνατη η Ï€Ïόσβαση στην υπηÏεσία Enigmime! ##################################################################### # Strings in enigmailKeygen.js ##################################################################### accessError=Σφάλμα Ï€Ïόσβασης στην υπηÏεσία Enigmail onlyGPG=Η δημιουÏγία κλειδιών λειτουÏγεί μόνο με το GnuPG (όχι με το PGP)! keygenComplete=Η δημιουÏγία του ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï Î¿Î»Î¿ÎºÎ»Î·Ïώθηκε! Η ταυτότητα <%S> θα χÏησιμοποιηθεί για υπογÏαφή. revokeCertRecommended=Σας συστήνεται να δημιουÏγήσετε ένα Ï€Î¹ÏƒÏ„Î¿Ï€Î¿Î¹Î·Ï„Î¹ÎºÎ¿Ï Î±Î½Î¬ÎºÎ»Î·ÏƒÎ·Ï‚ για το κλειδί σας. Αυτό το πιστοποιητικό μποÏεί να χÏησιμοποιηθεί για να ακυÏώσει το κλειδί σας, αν για παÏάδειγμα το ιδιωτικό κλειδί σας χαθεί ή γίνει γνωστό σε κάποιον άλλον. Θέλετε να δημιουÏγηθεί ένα τέτοιο πιστοποιητικό ανάκλησης τώÏα; keyMan.button.generateCert=&ΔημιουÏγία Ï€Î¹ÏƒÏ„Î¿Ï€Î¿Î¹Î·Ï„Î¹ÎºÎ¿Ï genCompleteNoSign=Η δημιουÏγία του ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï Î¿Î»Î¿ÎºÎ»Î·Ïώθηκε! genGoing=Η δημιουÏγία του ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï ÎµÎ¯Î½Î±Î¹ ήδη σε εξέλιξη! passNoMatch=Οι φÏάσεις ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï Î´ÎµÎ½ ταιÏιάζουν· παÏακαλώ ξαναδοκιμάσετε passCheckBox=ΕνεÏγοποιήστε αυτό το πλαίσιο αν δε θέλετε να οÏίσετε φÏάση ÎºÏ‰Î´Î¹ÎºÎ¿Ï Î³Î¹Î± το κλειδί passUserName=ΠαÏακαλώ καθοÏίστε το όνομα χÏήστη για αυτήν την ταυτότητα # keygen.missingUserName=There is no name specified for the selected account/identity. Please enter a value in the field "Your name" in the account settings. # keygen.passCharProblem=You are using special characters in your passphrase. Unfortunately, this can cause troubles for other applications. We recommend you choose a passphrase consisting only of any of these characters:\na-z A-Z 0-9 /.;:-,!?(){}[]%* passSpaceProblem=Για τεχνικοÏÏ‚ λόγους, ο κωδικός δεν Ï€Ïέπει να αÏχίζει ή να τελειώνει με κενό. changePassFailed=Η αλλαγή της φÏάσης ÎºÏ‰Î´Î¹ÎºÎ¿Ï Î±Ï€Î­Ï„Ï…Ï‡Îµ. keyConfirm=Îα δημιουÏγηθεί δημόσιο και ιδιωτικό κλειδί για το '%S'; keyMan.button.generateKey=&ΔημιουÏγία ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï keyAbort=ΑκÏÏωση της δημιουÏγίας του κλειδιοÏ; keyMan.button.generateKeyAbort=&Εγκατάλειψη δημιουÏγίας ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï keyMan.button.generateKeyContinue=&Συνέχεια δημιουÏγίας ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï expiryTooLong=Δεν μποÏείτε να δημιουÏγήσετε κλειδί που να λήγει σε πεÏισσότεÏο από 100 χÏόνια. expiryTooLongShorter=Δεν μποÏείτε να δημιουÏγήσετε κλειδί που λήγει σε πεÏισσότεÏα από 90 έτη. expiryTooShort=Το κλειδί θα Ï€Ïέπει να είναι έγκυÏο για μία ημέÏα τουλάχιστον. keyGenFailed=Η δημιουÏγία του ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï Î±Ï€Î­Ï„Ï…Ï‡Îµ. ΑνατÏέξτε στην κονσόλα του Enigmail (ÎœÎµÎ½Î¿Ï Enigmail > Αποσφαλμάτωση του Enigmail) για λεπτομέÏειες. # setKeyExpirationDateFailed=The expiration date could not be changed # Strings in enigmailMessengerOverlay.js securityInfo=ΠληÏοφοÏίες ασφαλείας του Enigmail\n\n enigHeader=Enigmail: enigContentNote=Enigmail: *Οι επισυνάψεις Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… μηνÏματος δεν υπογÏάφηκαν ή κÏυπτογÏαφήθηκαν*\n\n possiblyPgpMime=Πιθανό κÏυπτογÏαφημένο ή υπογεγÏαμμένο μήνυμα με PGP/MIME. Κάντε κλικ στο κουμπί ΑποκÏυπτογÏάφηση για να το επαληθεÏσετε saveAttachmentHeader=Enigmail: Αποθήκευση αποκÏυπτογÏαφημένων επισυνάψεων noTempDir=Δε βÏέθηκε Ï€ÏοσωÏινός κατάλογος για εγγÏαφή\nΠαÏακαλώ οÏίστε τη μεταβλητή πεÏιβάλλοντος TEMP attachmentPgpKey=Η επισÏναψη '%S' που ανοίξατε φαίνεται να είναι ένα αÏχείο ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï OpenPGP.\n\nΚάντε κλικ στο 'Εισαγωγή' για να εισάγετε τα κλειδιά που πεÏιέχονται σε αυτό, ή στο 'ΠÏοβολή' για να εμφανίσετε τα πεÏιεχόμενά του στον πεÏιηγητή beginPgpPart=********* *BEGIN ENCRYPTED or SIGNED PART* ********* endPgpPart=********** *END ENCRYPTED or SIGNED PART* ********** notePartEncrypted=Enigmail: *Κάποια τμήματα του μηνÏματος ΔΕΠυπογÏάφηκαν ή κÏυπτογÏαφήθηκαν* noteCutMessage=Enigmail: *Î’Ïέθηκε μήνυμα πολλαπλών τμημάτων -- η αποκÏυπτογÏάφηση/επαλήθευση διακόπηκε* decryptOkNoSig=ΠÏοειδοποίηση\n\nΗ αποκÏυπτογÏάφηση ήταν επιτυχής, αλλά ή επαλήθευση της υπογÏαφής δεν έγινε σωστά msgOvl.button.contAnyway=&Συνέχεια όπως και να 'χει signature.verifiedOK=Η υπογÏαφή της επισÏναψης %S επαληθεÏτηκε επιτυχώς signature.verifyFailed=Η υπογÏαφή της επισÏναψης %S δεν μπόÏεσε να επαληθευτεί attachment.noMatchToSignature=Δεν μπόÏεσε να αντιστοιχισθεί η επισÏναψη '%S' σε αÏχείο υπογÏαφής attachment.noMatchFromSignature=Δεν μπόÏεσε να αντιστοιχισθεί το αÏχείο υπογÏαφής '%S' σε επισÏναψη # fixBrokenExchangeMsg.failed=Did not succeed to repair message. # enigmail.msgViewColumn.label=Enigmail # enigmailPep.msgViewColumn.label=Enigmail/p≡p # wksNoIdentity=This key is not linked to any of your email accounts. Please add an account for at least one of the following email addresse(s):\n\n%S # wksConfirmSuccess=Confirmation email sent. # wksConfirmFailure=Sending the confirmation email failed. # autocrypt.importSetupKey.accountPreconfigured=Your account is already correctly configured for Autocrypt.\n\nDo you really want to overwrite your settings with this setup message? # autocrypt.importSetupKey.selfCreated=This message was created by your currently running instance of Enigmail.\n\nPlease switch to the email client to which you want to transfer the settings, and click on the message on that email client to import the settings. # autocrypt.importSetupKey.invalidMessage=Error - could not read setup message. The message seems to be corrupted. Please try to create a new setup message on your "other" device. # autocrypt.importSetupKey.invalidKey=Error - the key could not be imported. The key is either not supported by your version of GnuPG, or it got corrupted. # autocrypt.importSetupKey.wrongPasswd=The password you entered is wrong. Do you want to retry? # autocrypt.importSetupKey.success=The Autocrypt setup message was processed successfully. Autocrypt is now available for your account '%S'. ##################################################################### # Strings in enigmailMsgComposeOverlay.js ##################################################################### keysToExport=Επιλέξτε τα κλειδιά OpenPGP που θα εισαχθοÏν keysToUse=Επιλέξτε κλειδί(ά) OpenPGP που θα χÏησιμοποιηθοÏν για το %S pubKey=Δημόσιο κλειδί για το %S\n windowLocked=Το παÏάθυÏο σÏνταξης είναι κλειδωμένο· η αποστολή ακυÏώθηκε sendUnencrypted=Η αÏχικοποίηση του Enigmail απέτυχε.\nΑποστολή του μηνÏματος χωÏίς κÏυπτογÏάφηση; composeSpecifyEmail=ΠαÏακαλώ καθοÏίστε την κÏÏια διεÏθυνση αλληλογÏαφίας σας, η οποία θα χÏησιμοποιηθεί για την επιλογή του ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï Ï…Ï€Î¿Î³Ïαφής των εξεÏχόμενων μηνυμάτων.\n Αν το αφήσετε κενό, θα χÏησιμοποιηθεί η διεÏθυνση αποστολέα για την επιλογή του ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï Ï…Ï€Î¿Î³Ïαφής. sendingHiddenRcpt=Το μήνυμα έχει κÏυφοÏÏ‚ (BCC) παÏαλήπτες. Αν κÏυπτογÏαφηθεί, είναι δυνατή η απόκÏυψη των κÏυφών παÏαληπτών, αλλά οι χÏήστες κάποιων Ï€ÏογÏαμμάτων (Ï€.χ. PGP Corp.) δε θα μποÏοÏν να αποκÏυπτογÏαφήσουν το μήνυμα. Κατόπιν αυτοÏ, σας συνιστοÏμε να μη χÏησιμοποιείτε κÏυφοÏÏ‚ παÏαλήπτες (BCC) σε κÏυπτογÏαφημένα μηνÏματα. sendWithHiddenBcc=ΑπόκÏυψη παÏαληπτών BCC sendWithShownBcc=Κανονική κÏυπτογÏάφηση sendingNews=Η αποστολή κÏυπτογÏαφημένου μηνÏματος ακυÏώθηκε.\n\nΤο μήνυμα δεν μποÏεί να κÏυπτογÏαφηθεί γιατί κάποιοι παÏαλήπτες είναι λίστες αλληλογÏαφίας. ΠαÏακαλώ στείλτε το μήνυμα χωÏίς κÏυπτογÏάφηση. sendToNewsWarning=ΠÏοειδοποίηση: Ï€Ïόκειται να στείλετε ένα κÏυπτογÏαφημένο μήνυμα σε μία ομάδα συζήτησης.\n\nΑυτό έχει νόημα μόνο αν όλοι οι συμμετέχοντες στην ομάδα συζήτησης μποÏοÏν να αποκÏυπτογÏαφήσουν το μήνυμα, δηλ. το μήνυμα θα Ï€Ïέπει να κÏυπτογÏαφηθεί με το κλειδί του κάθε μέλους της ομάδας. ΚÏυπτογÏαφήστε το μήνυμα μόνο αν ξέÏετε ακÏιβώς τι κάνετε..\n\nΣυνέχεια; hasHTML=ΠÏοειδοποίηση μηνÏματος HTML:\nΑυτό το μήνυμα πεÏιέχει HTML, που θα μποÏοÏσε να κάνει την υπογÏαφή/κÏυπτογÏάφησή του να αποτÏχει. Για να το αποφÏγετε στο μέλλον, θα Ï€Ïέπει να κÏατάτε πατημένο το πλήκτÏο SHIFT όταν κάνετε κλικ στο κουμπί ΣÏνταξη/Απάντηση για να αποστείλετε υπογεγÏαμμένα μηνÏματα.\nΑν το μήνυμα υπογÏάφεται εξ οÏισμοÏ, θα Ï€Ïέπει να απενεÏγοποιήσετε την επιλογή 'ΣÏνταξη μηνυμάτων σε μοÏφή HTML' για να μη χÏησιμοποιείται HTML για τα μηνÏματα Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… λογαÏιασμοÏ. strippingHTML=Το μήνυμα πεÏιέχει πληÏοφοÏίες μοÏφοποίησης HTML οι οποίες θα χαθοÏν κατά τη μετατÏοπή του σε απλό κείμενο για υπογÏαφή/κÏυπτογÏάφηση. Θέλετε να συνεχίσετε; msgCompose.button.sendAnyway=&Αποστολή του μηνÏματος όπως και να 'χει attachWarning=Οι επισυνάψεις Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… μηνÏματος δεν είναι τοπικές, και για αυτό δεν μποÏοÏν να κÏυπτογÏαφηθοÏν. Για να τις κÏυπτογÏαφήσετε, αποθηκεÏστε τις ως τοπικά αÏχεία και επισυνάψτε αυτά τα αÏχεία. Θέλετε να συνεχίσετε; quotedPrintableWarn=Έχετε ενεÏγοποιήσει την κωδικοποίηση 'quoted-printable' για την αποστολή μηνυμάτων. Αυτό μποÏεί να οδηγήσει σε εσφαλμένη αποκÏυπτογÏάφηση και/ή επαλήθευση της υπογÏαφής του μηνÏματός σας.\n Θέλετε να απενεÏγοποιήσετε τη χÏήση της κωδικοποίησης 'quoted-printable'; minimalLineWrapping=Έχετε οÏίσει να γίνεται αναδίπλωση κειμένου στους %S χαÏακτήÏες. Για σωστή κÏυπτογÏάφηση και/ή υπογÏαφή, αυτή η τιμή θα Ï€Ïέπει να είναι τουλάχιστον 68.\nΘέλετε να αλλάξει η αναδίπλωση κειμένου στους 68 χαÏακτήÏες τώÏα; warning=ΠÏοειδοποίηση signIconClicked=Έχετε Ï„Ïοποποιήσει χειÏωνακτικά τις Ïυθμίσεις υπογÏαφής μηνυμάτων. Για αυτό το λόγο, κατά τη σÏνταξη Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… μηνÏματος, η (απ)ενεÏγοποίηση της υπογÏαφής δεν εξαÏτάται πια από την (απ)ενεÏγοποίηση της κÏυπτογÏάφησης. # errorOwnKeyUnusable=The key ID '%S' configured for the current identity does not yield a usable OpenPGP key.\n\nPlease ensure that you have a valid, not expired OpenPGP key and that your account settings point to that key.\nIf your key is not expired, then check if you did set Owner trust to full or ultimate. # msgCompose.cannotSaveDraft=Error while saving draft # msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information - partially encrypted email. # msgCompose.partiallyEncrypted.mimeMsg=The message you are replying to contained both unencrypted and encrypted parts. Some encrypted message parts are invisible to you.\n\nIf the sender was not able to decrypt the hidden message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nWe recommend that you don't reply to the message, but create a new message containing your answer. # msgCompose.partiallyEncrypted.inlinePGP=The message you are replying to contained both unencrypted and encrypted parts. If the sender was not able to decrypt some message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nPlease consider removing all quoted text from your reply to this sender. # msgCompose.internalEncryptionError=Internal Error: promised encryption disabled # msgCompose.internalError=An internal error has occurred. # msgCompose.toolbarTxt.signAndEncrypt=This message will be signed and encrypted # msgCompose.toolbarTxt.signOnly=This message will be signed # msgCompose.toolbarTxt.encryptOnly=This message will be encrypted # msgCompose.toolbarTxt.noEncryption=This message will be unsigned and unencrypted # msgCompose.toolbarTxt.disabled=Enigmail is disabled for the selected identity # msgCompose.protectSubject.tooltip=Protect the message subject # msgCompose.noSubjectProtection.tooltip=Do not protect the message subject # msgCompose.encryptedSubjectStub=Encrypted Message # msgCompose.protectSubject.dialogTitle=Enable Protection of Subject? # msgCompose.protectSubject.question=Regular encrypted emails contain the unredacted subject.\n\nWe have established a standard to hide the original subject in the encrypted message\nand replace it with a dummy text, such that the subject is only visible after the email is decrypted.\n\nDo you want to protect the subject in encrypted messages? # msgCompose.protectSubject.yesButton=&Protect subject # msgCompose.protectSubject.noButton=&Leave subject unprotected # msgCompose.detailsButton.label=Details ... # msgCompose.detailsButton.accessKey=D # msgCompose.pepSendUnknown=Unknown # msgCompose.pepSendUnsecure=Unsecure # msgCompose.pepSendSecure=Secure # msgCompose.pepSendTrusted=Secure & Trusted # pep.alert.disabledForIdentity=p≡p is disabled for the current identity. Please enable p≡p via the Enigmail/p≡p preferences. # pep.alert.weakReply=You’re about to forward or reply to a secure message as insecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? # note: should end with double newline: sendAborted=Η αποστολή ακυÏώθηκε.\n\n # details: # keyNotTrusted=Not enough trust for key '%S' # keyNotFound=Key '%S' not found # keyRevoked=Key '%S' revoked # keyExpired=Key '%S' expired statPGPMIME=PGP/MIME # statSMIME=S/MIME statSigned=ΥΠΟΓΕΓΡΑΜΜΕÎΟ statEncrypted=ΚΡΥΠΤΟΓΡΑΦΗΜΕÎΟ statPlain=ΜΗ ΥΠΟΓΕΓΡΑΜΜΕÎΟ και ΜΗ ΚΡΥΠΤΟΓΡΑΦΗΜΕÎΟ offlineSave=Αποθήκευση του μηνÏματος %S ως %S στο φάκελο Μη απεσταλμένης αλληλογÏαφίας; onlineSend=Αποστολή του μηνÏματος %S στον %S; encryptKeysNote=Σημείωση: το μήνυμα κÏυπτογÏαφήθηκε με τα ακόλουθα ID χÏήστη / κλειδιά: %S # hiddenKey= signFailed=Σφάλμα του Enigmail. Η κÏυπτογÏάφηση/υπογÏαφή απέτυχε. Îα αποσταλεί χωÏίς κÏυπτογÏάφηση; msgCompose.button.sendUnencrypted=&Αποστολή μη κÏυπτογÏαφημένου μηνÏματος recipientsSelectionHdr=Επιλέξτε παÏαλήπτες για κÏυπτογÏάφηση configureNow=Δεν έχετε Ïυθμίσει ακόμα το Enigmail για αυτήν την ταυτότητα. Θέλετε να το κάνετε τώÏα; # encryption/signing status and associated reasons: # encryptMessageAuto=Encrypt Message (auto) # encryptMessageNorm=Encrypt Message # signMessageAuto=Sign Message (auto) # signMessageNorm=Sign Message # encryptOff=Encryption: OFF # encryptOnWithReason=Encryption: ON (%S) # encryptOffWithReason=Encryption: OFF (%S) # encryptOn=Encryption: ON # signOn=Signing: ON # signOff=Signing: OFF # signOnWithReason=Signing: ON (%S) # signOffWithReason=Signing: OFF (%S) # reasonEnabledByDefault=enabled by default # reasonManuallyForced=manually forced # reasonByRecipientRules=forced by recipient rules # reasonByAutoEncryption=forced by auto encryption # reasonByConflict=due to conflict in recipient rules # reasonByEncryptionMode=due to encryption mode # should not be used anymore: encryptYes=Το μήνυμα θα κÏυπτογÏαφηθεί encryptNo=Το μήνυμα δε θα κÏυπτογÏαφηθεί # should not be used anymore: signYes=Το μήνυμα θα υπογÏαφεί signNo=Το μήνυμα δε θα υπογÏαφεί # PGP/MIME status: # pgpmimeNormal=Protocol: PGP/MIME # inlinePGPNormal=Protocol: Inline PGP # smimeNormal=Protocol: S/MIME # pgpmimeAuto=Protocol: PGP/MIME (auto) # inlinePGPAuto=Protocol: Inline PGP (auto) # smimeAuto=Protocol: S/MIME (auto) # should not be used anymore # pgpmimeYes=PGP/MIME will be used # pgpmimeNo=Inline PGP will be used # Attach own key status (tooltip strings): # attachOwnKeyNo=Your own key will not be attached # attachOwnKeyYes=Your own key will be attached # attachOwnKeyDisabled=Your own key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. rulesConflict=Εντοπίστηκαν αλληλοσυγκÏουόμενοι κανόνες παÏαληπτών\n%S\n\nÎα σταλθεί το μήνυμα με αυτές τις παÏαμέτÏους; msgCompose.button.configure=&ΡÏθμιση msgCompose.button.send=&Αποστολή μηνÏματος msgCompose.button.save=Α&ποθήκευση μηνÏματος # Strings in enigmailMsgHdrViewOverlay.js keyNeeded=Απαιτείται το δημόσιο κλειδί %S για την επαλήθευση της υπογÏαφής # keyUsed=Public key %S used to verify signature clickDecrypt=· κάντε κλικ στο κουμπί ΑποκÏ/φηση clickDecryptRetry=· κάντε κλικ στο κουμπί ΑποκÏ/φηση για να ξαναδοκιμάσετε # clickDetailsButton=; click on 'Details' button for more information # clickImportButton=; click on the 'Import Key' button to import the key # keyTypeUnsupported=; the key type is not supported by your version of GnuPG msgPart=Τμήμα του μηνÏματος %S msgSigned=υπογεγÏαμμένο # msgSignedUnkownKey=signed with unknown key msgEncrypted=κÏυπτογÏαφημένο msgSignedAndEnc=υπογεγÏαμμένο και κÏυπτογÏαφημένο unverifiedSig=Μη επαληθεÏσιμη υπογÏαφή incompleteDecrypt=Η αποκÏυπτογÏάφηση είναι ημιτελής needKey=Σφάλμα - απαιτείται ιδιωτικό κλειδί για την αποκÏυπτογÏάφηση του μηνÏματος failedDecrypt=Σφάλμα - η αποκÏυπτογÏάφηση απέτυχε badPhrase=Σφάλμα - κακή δÏάση ÎºÏ‰Î´Î¹ÎºÎ¿Ï failedDecryptVerify=Σφάλμα - η αποκÏυπτογÏάφηση/επαλήθευση απέτυχε mdcError=Σφάλμα - δεν Ï€ÏοστατεÏτηκε η ακεÏαιότητα του μηÏματος viewInfo=· ΠÏοβολή > ΠληÏοφοÏίες ασφαλείας μηνÏματος decryptedMsg=ΑποκÏυπτογÏαφημένο μήνυμα # decryptedMsgWithFormatError=Decrypted message (restored broken PGP email format probably caused by an old Exchange server, so that the result might not be perfect to read) # usedAlgorithms=Used Algorithms: %1$S and %2$S # pepStatusInfo.text=p≡p Message Status. # pepStatusInfo.title.m3=Under Attack # pepStatusInfo.info.m3=This message is not secure and has been tampered with. # pepStatusInfo.title.m1=Mistrusted # pepStatusInfo.info.m1=This message has a communication partner that has previously been marked as mistrusted # pepStatusInfo.title.r0=Unknown # pepStatusInfo.info.r0=This message does not contain enough information to determine if it is secure. # pepStatusInfo.title.r1=Cannot Decrypt # pepStatusInfo.info.r1=This message cannot be decrypted because the key is not available. # pepStatusInfo.title.r2=Cannot Decrypt # pepStatusInfo.info.r2=This message cannot be decrypted because the key is not available. # pepStatusInfo.title.r3=Unsecure # pepStatusInfo.info.r3=This message is unsecure. # pepStatusInfo.title.r4=Unsecure for Some # pepStatusInfo.info.r4=This message is unsecure for some communication partners. # pepStatusInfo.title.r5=Unreliable Security # pepStatusInfo.info.r5=This message has unreliable protection. # pepStatusInfo.title.r6=Secure... # pepStatusInfo.info.r6=This message is secure but you still need to verify the identity of your communication partner. # pepStatusInfo.title.r7=Secure & Trusted # pepStatusInfo.info.r7=This message is secure and trusted. # pepStatusInfo.color.green=Green # pepStatusInfo.color.yellow=Yellow # pepStatusInfo.color.red=Red # pepRevokeTrust.question=Do you really want to cancel the trust for %S? # pepRevokeMistrust.question=Do you really want to re-trust the key for %S? # pepRevokeTrust.doRevoke=Cancel &trust # wksConfirmationReq=Web Key Directory Confirmation Request # wksConfirmationReq.message=This message has been sent by your email provider to confirm deployment of your OpenPGP public key\nin their Web Key Directory.\nProviding your public key helps others to discover your key and thus being able to encrypt messages to you.\n\nIf you want to deploy your key in the Web Key Directory now, please click on the button "Confirm Request" in the status bar.\nOtherwise, simply ignore this message. # wksConfirmationReq.button.label=Confirm Request # autocryptSetupReq=Perform Autocrypt Setup # autocryptSetupReq.button.label=Start Setup # autocryptSetupReq.setupMsg.desc=This message contains all information to transfer your Autocrypt settings along with your secret key securely from your original device. # autocryptSetupReq.setupMsg.backup=You can keep this message and use it as a backup for your secret key. If you want to do this, you should write down the password and store it securely. # autocryptSetupReq.message.import=To import the settings and key(s) in Enigmail, please click on the "Start Setup" button in the status bar. # autocryptSetupReq.message.sent=Please click on the message on your new device and follow the instuctions to import the settings. # strings in pref-enigmail.js # oldGpgVersion20=Enigmail initialization failed.\n\nYou are using GnuPG version %1$S, which is not supported anymore. Enigmail requires GnuPG version %2$S or newer. Please upgrade your GnuPG installation, or Enigmail will not work. locateGpg=Εντοπισμός του Ï€ÏογÏάμματος GnuPG invalidGpgPath=Το GnuPG δεν μποÏεί να εκτελεστεί με τη διαδÏομή που δόθηκε. Για αυτό το λόγο το Enigmail θα είναι απενεÏγοποιημένο μέχÏι να δώσετε τη σωστή διαδÏομή ή να επανεκκινήσετε την εφαÏμογή. warningsAreReset=Όλες οι Ï€Ïοειδοποιήσεις επανήλθαν στην Ï€ÏοκαθοÏισμένη τους κατάσταση. prefs.gpgFound=Το GnuPG βÏέθηκε στο %S prefs.gpgNotFound=Το GnuPG δε βÏέθηκε prefs.warnAskNever=ΠÏοειδοποίηση: η ενεÏγοποίηση αυτής της επιλογής θα οδηγήσει σε αποστολή μη κÏυπτογÏαφημένων μηνυμάτων χωÏίς να εμφανίζεται καμία απολÏτως πληÏοφοÏία, όταν δεν υπάÏχει το κλειδί κάποιου από τους παÏαλήπτες -- το Enigmail δε θα σας πληÏοφοÏεί όταν συμβαίνει αυτό! prefs.warnIdleTimeForUnknownAgent=Το σÏστημά σας χÏησιμοποιεί ένα εξειδικευμένο εÏγαλείο για διαχείÏιση κωδικών, όπως το gnome-keyring ή το seahorse-agent. Δυστυχώς το Enigmail δεν μποÏεί να ελέγξει το χÏονικό ÏŒÏιο λήξης ÎºÏ‰Î´Î¹ÎºÎ¿Ï Î³Î¹Î± αυτό το εÏγαλείο. Συνεπώς, οι αντίστοιχες Ïυθμίσεις χÏονικών οÏίων στο Enigmail αγνοÏνται. prefEnigmail.oneKeyserverOnly=Σφάλμα - μποÏείτε να οÏίσετε μόνο ένα εξυπηÏετητή κλειδιών για την αυτόματη λήψη των OpenPGP κλειδιών που λείπουν. # Strings used in core.jsm # (said file also re-uses some strings from above) enterAdminPin=ΠαÏακαλώ πληκτÏολογήστε το PIN ΔΙΑΧΕΙΡΙΣΤΗ της SmartCard σας enterCardPin=ΠαÏακαλώ πληκτÏολογήστε το PIN της SmartCard σας notInit=Σφάλμα - Η υπηÏεσία Enigmail δεν έχει αÏχικοποιηθεί ακόμα badCommand=Σφάλμα - η εντολή κÏυπτογÏάφησης απέτυχε cmdLine=γÏαμμή εντολών και έξοδος: notRequired=Σφάλμα - δε χÏειάζεται κÏυπτογÏάφηση notComplete=Σφάλμα - η δημιουÏγία κλειδιών δεν έχει ολοκληÏωθεί ακόμα invalidEmail=Σφάλμα - μη έγκυÏη διεÏθυνση(εις) αλληλογÏαφίας noPassphrase=Σφάλμα - δε δόθηκε φÏάση ÎºÏ‰Î´Î¹ÎºÎ¿Ï noPGPblock=Σφάλμα - Δε βÏέθηκε έγκυÏο μπλοκ δεδομένων armored OpenPGP unverifiedReply=Η απάντηση δεν επαληθεÏθηκε # keyInMessageBody=Key in message body found. Click 'Import Key' to import the key sigMismatch=Σφάλμα - Η υπογÏαφή δεν ταιÏιάζει cantImport=Σφάλμα εισαγωγής δημόσιου κλειδιοÏ\n\n # doImportOne=Import %1$S (%2$S)? # doImportMultiple=Import the following keys?\n\n%S # previewFailed=Can't read public key file. # Strings used in errorHandling.jsm sc.wrongCardAvailable=Η SmartCard %S που βÏέθηκε στη συσκευή ανάγνωσης δε μποÏεί να χÏησιμοποιηθεί για την επεξεÏγασία του μηνÏματος.\nΠαÏακαλώ εισάγετε την SmartCard %S και ξαναδοκιμάστε. sc.insertCard=Για τη λειτουÏγία απαιτείται η SmartCard %S.\nΠαÏακαλώ εισάγετε την απαιτοÏμενη SmartCard και ξαναδοκιμάστε. sc.removeCard=Για τη λειτουÏγία δε χÏειάζεται να υπάÏχει κάποια SmartCard στη συσκευή ανάγνωσης.\nΠαÏακαλώ αφαιÏέστε τη SmartCard και ξαναδοκιμάστε. sc.noCardAvailable=Δε βÏέθηκε SmartCard στη συσκευή ανάγνωσης της\nΠαÏακαλώ εισάγετε την SmartCard σας και ξαναδοκιμάστε. sc.noReaderAvailable=Η συσκευή ανάγνωσης SmartCard δεν μπόÏεσε να Ï€Ïοσπελασθεί.\nΠαÏακαλώ συνδέστε τη συσκευή, εισάγετε την κάÏτα σας, και ξαναδοκιμάστε. # keyError.keySpecNotFound=The email address "%S" cannot be matched to a key on your keyring. # keyError.keyIdNotFound=The configured key ID "%S" cannot be found on your keyring. # keyError.resolutionAction=Please select a valid key in the OpenPGP section of your Account Settings. # missingPassphrase=Missing passphrase # errorHandling.gpgAgentInvalid=Your system is running a version of gpg-agent that is not suitable for your GnuPG version. # errorHandling.gpgAgentError=GnuPG reported an error in the communication with gpg-agent (a component of GnuPG). # errorHandling.dirmngrError=GnuPG reported an error in the communication with dirmngr (a component of GnuPG). # errorHandling.pinentryError=GnuPG cannot query your passphrase via pinentry. # errorHandling.readFaq=This is a system setup or configuration error that prevents Enigmail from working properly and cannot be fixed automatically.\n\nWe strongly recommend that you consult our support web site at https://enigmail.net/faq. gpgNotFound=ΑδÏνατος ο εντοπισμός του Ï€ÏογÏάμματος GnuPG '%S'.\nΣιγουÏευτείτε ότι έχετε οÏίσει σωστά τη διαδÏομή του εκτελέσιμου του GnuPG στις Ï€Ïοτιμήσεις του Enigmail. gpgNotInPath=ΑδÏνατος ο εντοπισμός του εκτελέσιμου του GnuPG στο PATH.\nΣιγουÏευτείτε ότι έχετε οÏίσει σωστά τη διαδÏομή του εκτελέσιμου του GnuPG στις Ï€Ïοτιμήσεις του Enigmail. # enigmailNotAvailable=Enigmail core Service not available prefGood=ΈγκυÏη υπογÏαφή από %S prefBad=ΜΗ έγκυÏη υπογÏαφή από %S failCancel=Σφάλμα - Η λήψη του ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï Î±ÎºÏ…Ïώθηκε από το χÏήση failNoServer=Σφάλμα - Δεν καθοÏίστηκε εξυπηÏετητής κλειδιών για χÏήση failNoID=Σφάλμα - Δεν καθοÏίστηκε ID για τη λήψη του ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï failKeyExtract=Σφάλμα - η εντολή εξαγωγής του κλειδιών απέτυχε notFirstBlock=Σφάλμα - Το Ï€Ïώτο μπλοκ OpenPGP δεν είναι μπλοκ δημόσιου ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï importKeyConfirm=Îα εισαχθοÏν τα δημόσια κλειδιά που υπάÏχουν στο μήνυμα; failKeyImport=Σφάλμα - η εισαγωγή κλειδιών απέτυχε fileWriteFailed=Απέτυχε η έγγÏαφη στο αÏχείο %S importKey=Εισαγωγή του δημόσιου ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï %S από τον εξυπηÏετητή κλειδιών: uploadKey=Αποστολή του δημόσιου ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï %S στον εξυπηÏετητή κλειδιών: keyId=ID ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï keyAndSigDate=ID κλειδιοÏ: 0x%S / ΥπογεγÏαμμένο την: %S keyFpr=ΑποτÏπωμα κλειδιοÏ: %S noEmailProvided=Δε δώσατε διεÏθυνση αλληλογÏαφίας! keyAlreadySigned=Το κλειδί έχει ήδη υπογÏαφεί, δεν μποÏείτε να το υπογÏάψετε ξανά. ##################################################################### # Strings used in enigmailKeySelection.js ##################################################################### selKeyExpired=έληξε %S createdHeader=ΔημιουÏγήθηκε atLeastOneKey=Δεν επιλέχθηκε κλειδί! ΠÏέπει να επιλέξετε τουλάχιστον ένα κλειδί για να συνεχίσετε fewerKeysThanRecipients=Έχετε επιλέξει λιγότεÏα κλειδιά από τους παÏαλήπτες. Είστε σίγουÏοι ότι η λίστα με τα κλειδιά κÏυπτογÏάφησης είναι πλήÏης; userSel.button.goBack=Επιλογή πεÏισσότεÏων κλειδιών userSel.secretKeySel.title=Επιλογή ενός Î¹Î´Î¹Ï‰Ï„Î¹ÎºÎ¿Ï ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï OpenPGP για κÏυπτογÏάφηση των μηνυμάτων σας # userSel.problemNoKey=No valid key # userSel.problemMultipleKeys=Multiple keys # should be same as thunderbird ENTITY sendLaterCmd.label: # sendLaterCmd.label=Send Later # Strings used in enigmailAttachmentDialog.js # pgpMimeNote=NOTE: PGP/MIME is not supported by all email clients. If you are unsure, select the %S option. first=Ï€Ïώτο second=δεÏτεÏο # Strings used in am-enigprefs.js / enigmailEditIdentity.js encryptKeyHeader=Επιλέξτε κλειδί OpenPGP για την κÏυπτογÏάφηση identityName=Ταυτότητα: %S # switchPepMode=You are currently using the 'p≡p Junior' mode of Enigmail.\n\nBy enabling OpenPGP or S/MIME for an account, you are disabling p≡p and use the 'regular' mode of Enigmail without p≡p. # enableEnigmail=&Disable p≡p # Strings used in enigmailSingleRcptSettings.js noEncryption=ΕνεÏγοποιήσατε την κÏυπτογÏάφηση, αλλά δεν επιλέξατε κλειδί. Για να αποστέλλονται κÏυπτογÏαφημένα μηνÏματα στον παÏαλήπτη(ες) %S, Ï€Ïέπει να οÏίσετε ένα ή πεÏισσότεÏα έγκυÏα κλειδιά για χÏήση από τη λίστα των κλειδιών σας. Θέλετε να απενεÏγοποιήσετε την κÏυπτογÏάφηση για τον παÏαλήπτη(ες) %S; noKeyToUse=(κανένα - χωÏίς κÏυπτογÏάφηση) noEmptyRule=Ο κανόνας δεν μποÏεί να είναι κενός! ΠαÏακαλώ οÏίστε μία διεÏθυνση αλληλογÏαφίας στο πεδίο του κανόνα. invalidAddress=Η διεÏθυνση(εις) αλληλογÏαφίας που δώσατε δεν είναι έγκυÏη. Δεν Ï€Ïέπει να χÏησιμοποιήσετε τα ονόματα των παÏαληπτών, αλλά τις διευθÏνσεις αλληλογÏαφίας τους. Π.χ.:\nΜη έγκυÏη: Κάποιο Όνομα \nΈγκυÏη: some.name@address.net # noCurlyBrackets=The curly brackets {} have a special meaning and should not be used in an email address. If you want to modify the matching behavior for this rule, use the 'Apply rule if recipient ...' option.\nMore information is available from the Help button. # Strings used in enigmailRulesEditor.js never=Ποτέ always=Πάντα possible=Πιθανή deleteRule=Îα διαγÏαφεί ο επιλεγμένος κανόνας; nextRcpt=(Επόμενος παÏαλήπτης) negateRule=Δεν addKeyToRule=ΠÏοσθήκη ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï %S (%S) σε κανόνα παÏαληπτών # Strings used in enigmailSearchKey.js needOnline=Η λειτουÏγία που επιλέξατε δεν είναι διαθέσιμη όταν είστε χωÏίς σÏνδεση. ΠαÏακαλώ συνδεθείτε και ξαναδοκιμάστε. protocolNotSupported=Το Ï€Ïωτόκολλο '%S://' που έχετε επιλέξει δεν υποστηÏίζεται για τη λήψη κλειδιών OpenPGP. gpgkeysDisabled=Ίσως βοηθήσει αν ενεÏγοποιήσετε την επιλογή 'extensions.enigmail.useGpgKeysTool'. noKeyserverConn=ΑδÏνατη η σÏνδεση στον εξυπηÏετητή κλειδιών %S. keyDownloadFailed=Η λήψη του ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï Î±Ï€ÏŒ τον εξυπηÏετητή κλειδιών απέτυχε. Μήνυμα κατάστασης:\n%S internalError=ΠαÏουσιάστηκε ένα εσωτεÏικό σφάλμα. Η λήψη ή εισαγωγή των κλειδιών είναι αδÏνατη. noKeyFound=Δε βÏέθηκε κανένα κλειδί που να ταιÏιάζει στα κÏιτήÏια αναζήτησης.\nΠαÏακαλώ σημειώστε ότι το ID των κλειδιών Ï€Ïέπει να αÏχίζει με \\"0x\\" (Ï€.χ. 0xABCDEF12). # keyDownload.keyUnavailable=We are sorry, but the key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their key by email. # gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. gpgKeysFailed=Η αναζήτηση ή λήψη ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï Î±Ï€ÏŒ τον εξυπηÏετητή κλειδιών απέτυχε: αδÏνατη η εκτέλεση της εντολής gpgkeys_%S. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Ο οÏισμός της εμπιστοσÏνης απέτυχε # Strings in enigmailSignKeyDlg.js signKeyFailed=Η υπογÏαφή του ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï Î±Ï€Î­Ï„Ï…Ï‡Îµ alreadySigned.label=Σημείωση: το κλειδί %S έχει ήδη υπογÏαφεί με το επιλεγμένο ιδιωτικό κλειδί. # alreadySignedexportable.label=Note: the key %S is already signed exportable with the selected secret key. A local signature does not make sense. # partlySigned.label=Note: some user IDs of key %S are already signed with the selected secret key. # noTrustedOwnKeys=No eligible key found for signing! You need at least one fully trusted secret key in order to sign keys. # Strings in enigmailKeyManager.js keyMan.loadingKeys=ΦόÏτωση κλειδιών, παÏακαλώ πεÏιμένετε... keyValid.unknown=άγνωστο keyValid.invalid=μη έγκυÏο keyValid.disabled=απενεÏγοποιήθηκε keyValid.revoked=ανακλήθηκε keyValid.expired=έληξε keyValid.noSubkey=χωÏίς έγκυÏο υποκλειδί keyTrust.untrusted=μη έμπιστο keyTrust.marginal=οÏιακά keyTrust.full=έμπιστο keyTrust.ultimate=απόλυτα keyTrust.group=(ομάδα) keyType.public=δημ keyType.publicAndSec=δημ/ιδ keyMan.enableKey=ΕνεÏγοποίηση ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï keyMan.disableKey=ΑπενεÏγοποίηση ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï userAtt.photo=Εικόνα χÏήστη (αÏχείο JPEG) asciiArmorFile=ΑÏχεία ASCII Armored (*.asc) importKeyFile=Εισαγωγή ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï OpenPGP gnupgFile=ΑÏχεία GnuPG # createKeyOK=Your Key has been generated saveRevokeCertAs=ΔημιουÏγία & αποθήκευση Ï€Î¹ÏƒÏ„Î¿Ï€Î¿Î¹Î·Ï„Î¹ÎºÎ¿Ï Î±Î½Î¬ÎºÎ»Î·ÏƒÎ·Ï‚ # revokeCertOK=The revocation certificate has been successfully created. You can use it to invalidate your public key, e.g. in case you would lose your secret key. revokeCertFailed=Δεν είναι δυνατή η δημιουÏγία του Ï€Î¹ÏƒÏ„Î¿Ï€Î¿Î¹Î·Ï„Î¹ÎºÎ¿Ï Î±Î½Î¬ÎºÎ»Î·ÏƒÎ·Ï‚. addUidOK=Το ID χÏήστη Ï€Ïοστέθηκε με επιτυχία addUidFailed=Η Ï€Ïοσθήκη του ID χÏήστη απέτυχε noKeySelected=ΠÏέπει να επιλέξετε ένα τουλάχιστον κλειδί για να εκτελεστεί η επιλεγμένη λειτουÏγία exportToFile=Εξαγωγή δημόσιου ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï ÏƒÎµ αÏχείο # exportKeypairToFile=Export Secret and Public Key To File exportSecretKey=Θέλετε να πεÏιληφθεί το ιδιωτικό κλειδί στο αποθηκευμένο αÏχείο ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï OpenPGP; saveKeysOK=Τα κλειδιά αποθηκεÏτηκαν με επιτυχία saveKeysFailed=Η αποθήκευση των κλειδιών απέτυχε importKeysFailed=Η εισαγωγή των κλειδιών απέτυχε enableKeyFailed=Η ενεÏγοποίηση/απενεÏγοποίηση των κλειδιών απέτυχε specificPubKeyFilename=%S (0x%S) pub specificPubSecKeyFilename=%S (0x%S) pub-sec defaultPubKeyFilename=Εξαγωγηθέντα-δημόσια-κλειδιά defaultPubSecKeyFilename=Εξαγωγηθέντα-δημόσια-και-ιδιωτικά-κλειδιά noSecretKeys=Δε βÏέθηκαν ιδιωτικά κλειδιά.\n\nΘέλετε να δημιουÏγήσετε ένα τώÏα; sendKeysOk=Το κλειδί(ά) απεστάλη με επιτυχία sendKeysFailed=Η αποστολή των κλειδιών απέτυχε receiveKeysOk=Τα κλειδιά ανανεώθηκαν με επιτυχία receiveKeysFailed=Η λήψη των κλειδιών απέτυχε importFromClip=Θέλετε να εισάγετε κάποια κλειδιά από το Ï€ÏόχειÏο; # importFromUrl=Download public key from this URL: copyToClipbrdFailed=ΑδÏνατη η αντιγÏαφή των επιλεγμένων κλειδιών στο Ï€ÏόχειÏο. copyToClipbrdOK=Τα κλειδιά αντιγÏάφηκαν στο Ï€ÏόχειÏο deleteSecretKey=ΠΡΟΕΙΔΟΠΟΙΗΣΗ: ΠÏόκειται να διαγÏάψετε ένα ιδιωτικό κλειδί!\nΑν διαγÏάψετε το ιδιωτικό κλειδί σας, δε θα μποÏείτε πια να αποκÏυπτογÏαφήσετε κανένα μήνυμα που κÏυπτογÏαφήθηκε για αυτό το κλειδί.\n\nΘέλετε Ï€Ïαγματικά να διαγÏάψετε αυτά τα ΔΥΟ κλειδιά (το ιδιωτικό και το δημόσιο)\n'%S'; deleteMix=WARNING: ΠÏόκειται να διαγÏάψετε ιδιωτικά κλειδιά!\nΑν διαγÏάψετε το ιδιωτικό κλειδί σας, δε θα μποÏείτε πια να αποκÏυπτογÏαφήσετε κανένα μήνυμα που κÏυπτογÏαφήθηκε για αυτό το κλειδί.\n\nΘέλετε Ï€Ïαγματικά να διαγÏάψετε αυτά τα ΖΕΥΓΗ κλειδιών (τα ιδιωτικά και τα δημόσια); deletePubKey=Θέλετε να διαγÏάψετε το δημόσιο κλειδί\n'%S'; deleteSelectedPubKey=Θέλετε να διαγÏάψετε τα δημόσια κλειδιά; deleteKeyFailed=Το κλειδί δεν μπόÏεσε να διαγÏαφεί. # revokeKeyQuestion=You are about to revoke the key '%S'.\n\nYou will no longer be able to sign with this key, and once distributed, others will no longer be able to encrypt with that key. You can still use the key to decrypt old messages.\n\nDo you want to proceed? revokeKeyOk=Το κλειδί ανακλήθηκε. Αν το κλειδί σας υπάÏχει σε κάποιο εξυπηÏετητή κλειδιών, θα Ï€Ïέπει να το αποστείλετε και πάλι, ώστε να γίνει γνωστή η ανάκληση. revokeKeyFailed=Το κλειδί δεν μπόÏεσε να ανακληθεί. # revokeKeyNotPresent=You have no key (0x%S) which fits to this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before the revocation certificate! # revokeKeyAlreadyRevoked=The key 0x%S has already been revoked. refreshAllQuestion=Δεν επιλέξατε κανένα κλειδί. Θέλετε να ανανεωθοÏν ΟΛΑ τα κλειδιά; # refreshKeyServiceOn.warn=Warning: Your keys are currently being refreshed in the background as safely as possible.\nRefreshing all your keys at once will unnecessarily reveal information about you.\nDo you really want to do this? refreshKey.warn=ΠÏοειδοποίηση: ανάλογα με τον αÏιθμό των κλειδιών και την ταχÏτητα σÏνδεσης, η ανανέωση όλων των κλειδιών μποÏεί να είμαι μια Ï€Î¿Î»Ï Ï‡ÏονοβόÏα διαδικασία!\n\nΣυνέχεια; downloadContactsKeys.warn=ΠÏοειδοποίηση: ανάλογα με τον αÏιθμώ των επαφών και την ταχÏτητα του δικτÏου, η λήψη όλων των κλειδιών μποÏεί να είναι χÏονοβόÏα! # downloadContactsKeys.importFrom=Import contacts from address book '%S'? keyMan.button.exportSecKey=Ε&ξαγωγή ιδιωτικών κλειδιών keyMan.button.exportPubKey=Εξαγωγή μονάχα &Public ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï keyMan.button.import=Ε&ισαγωγή keyMan.button.refreshAll=&Ανανέωση όλων των κλειδιών keyMan.button.revokeKey=Ανάκ&ληση ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï # keyMan.button.skip=&Skip Key keylist.noOtherUids=Δεν υπάÏχουν άλλες ταυτότητες keylist.hasOtherUids=Γνωστός και ως keylist.noPhotos=Δεν υπάÏχει διαθέσιμη φωτογÏαφία keylist.hasPhotos=ΦωτογÏαφίες keyMan.addphoto.filepicker.title=Επιλέξτε αÏχείο εικόνας keyMan.addphoto.warnLargeFile=Το αÏχείο που επιλέξατε είναι μεγαλÏτεÏο από 25 kB.\nΔεν Ï€Ïοτείνετε να επιλέγετε Ï€Î¿Î»Ï Î¼ÎµÎ³Î¬Î»Î± αÏχεία καθώς το μέγεθος των κλειδιών θα αυξηθεί δÏαματικά. keyMan.addphoto.noJpegFile=Το επιλεγμένο αÏχείο δεν είναι σε μοÏφή JPEG. ΠαÏακαλώ επιλέξτε ένα άλλο αÏχείο. keyMan.addphoto.failed=Δεν ήταν δυνατό να Ï€Ïοστεθεί η εικόνα. # noWksIdentity=The key %S does not have a WKS identity. # keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key "%1$S (%2$S)" for encrypting messages? # keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key "%1$S (%2$S)" for future messages? # keyman.addBlacklistKey.button=&Blacklist the key # keyman.removeBlacklistKey.button=&Remove key from Blacklist # Strings in enigmailManageUidDlg.xul changePrimUidFailed=Η αλλαγή του κÏÏιου ID χÏήστη απέτυχε changePrimUidOK=Το κÏÏιο ID χÏήστη άλλαξε με επιτυχία revokeUidFailed=Η ανάκληση του ID χÏήστη %S απέτυχε revokeUidOK=Το ID χÏήστη %S ανακλήθηκε με επιτυχία. Αν το κλειδί σας υπάÏχει σε κάποιο εξυπηÏετητή κλειδιών, θα Ï€Ïέπει να το αποστείλετε και πάλι, ώστε να γίνει γνωστή η ανάκληση. revokeUidQuestion=Θέλετε Ï€Ïαγματικά να ανακαλέσετε το ID χÏήστη %S; # Strings in enigmailKeyImportInfo.xul # importInfoTitle=SUCCESS! Keys imported # importInfoBits=Bits # importInfoCreated=Created # importInfoFpr=Fingerprint # importInfoDetails=(Details) # importInfoNoKeys=No keys imported. # Strings in enigmailKeyDetailsDlg.xul keyTypePublic=δημόσιο κλειδί keyTypePrimary=Ï€ÏωτεÏον κλειδί keyTypeSubkey=υποκλειδί keyTypePair=ζεÏγος κλειδιών keyExpiryNever=ποτέ keyAlgorithm_1=RSA keyAlgorithm_2=RSA keyAlgorithm_3=RSA keyAlgorithm_16=ELG keyAlgorithm_17=DSA # keyAlgorithm_18=ECDH # keyAlgorithm_19=ECDSA keyAlgorithm_20=ELG # keyAlgorithm_22=EDDSA keyUsageEncrypt=ΚÏυπτογÏάφηση keyUsageSign=ΥπογÏαφή keyUsageCertify=Πιστοποίηση keyUsageAuthentication=Ταυτοποίηση # keyDoesNotExpire=Key does not expire # Strings in enigmailGenCardKey.xul keygen.started=ΠαÏακαλώ πεÏιμένετε να ολοκληÏωθεί ή δημιουÏγία του κλειδιοÏ.... keygen.completed=Το κλειδί δημιουÏγήθηκε. Το νέο ID ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï ÎµÎ¯Î½Î±Î¹: 0x%S keygen.keyBackup=Το αντίγÏαφο ασφαλείας του ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï Î±Ï€Î¿Î¸Î·ÎºÎµÏτηκε ως %S keygen.passRequired=ΠαÏακαλώ δώστε μια φÏάση ÎºÏ‰Î´Î¹ÎºÎ¿Ï Î±Î½ θέλετε να αποθηκευτεί ένα αντίγÏαφο ασφαλείας του ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï ÏƒÎ±Ï‚ εκτός της SmartCard. # Strings in enigmailSetCardPin.xul cardPin.processFailed=Η αλλαγή του PIN απέτυχε # Strings in enigRetrieveProgres.xul keyserverProgress.refreshing=Ανανέωση κλειδιών, παÏακαλώ πεÏιμένετε... keyserverProgress.uploading=Αποστολή κλειδιών, παÏακαλώ πεÏιμένετε... # keyserverProgress.wksUploadFailed=Could not upload your key to the Web Key Service # keyserverProgress.wksUploadCompleted=Your public key was successfully submitted to your provider. You will receive an email to confirm that you initiated the upload. keyserverTitle.refreshing=Ανανέωση κλειδιών keyserverTitle.uploading=Αποστολή ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï # Strings in enigmailSetupWizard passphrase.min8keys=Η φÏάση ÎºÏ‰Î´Î¹ÎºÎ¿Ï ÏƒÎ±Ï‚ θα Ï€Ïέπει να αποτελείται από τουλάχιστον 8 χαÏακτήÏες! setupWizard.reallyCancel=Θέλετε Ï€Ïαγματικά να τεÏματίσετε το Μάγο του Enigmail; setupWizard.invalidGpg=Το αÏχείο που επιλέξατε δεν είναι εκτελέσιμο του GnuPG. ΠαÏακαλώ επιλέξτε διαφοÏετικό αÏχείο. setupWizard.specifyFile=ΠÏέπει να οÏίσετε τουλάχιστον ένα δημόσιο κλειδί για να συνεχίσετε. setupWizard.installFailed=Η εγκατάσταση δεν ήταν επιτυχής. ΠαÏακαλώ ξαναπÏοσπαθήστε ή εγκαταστήστε το GnuPG χειÏοκίνητα και εντοπίστε το από το Browse button. # setupWizard.downloadForbidden=For your own security, we will not download GnuPG. Please visit https://gnupg.org/ in order to download GnuPG. # setupWizard.downloadImpossible=We cannot download GnuPG currently. Please try later or visit https://gnupg.org/ in order to download GnuPG. setupWizard.hashSumError=Δεν ήταν δυνατή η επαλήθευση της ακεÏαιότητας του αÏχείου. Το αÏχείο μποÏεί να είναι εσφαλμένο ή επεξεÏγασμένο. Θέλετε να συνεχίσετε την εγκατάσταση παÏ'ολ'αυτά; # setupWizard.importSettingsFile=Specify backup file to load from # setupWizard.invalidSettingsFile=The specified file is not a correct Enigmail Settings backup file. # setupWizard.gpgConfExists=The GnuPG config file already exists. Do you want to overwrite it with the one from your old installation? # setupWizard.noGpgHomeDir=It appears that you configured %S to use for GnuPG. However, this is not a directory - you cannot use it. # setupWizard.unmachtedIds=The following identities of your old setup could not be matched:\n%S\nThe settings for these identities were skipped. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=ΠÏοέκυψε Ï€Ïόβλημα στην λήψη του GnuPG. ΠαÏακαλώ ελέγξτε τη καταγÏαφή κονσόλας για πεÏισσότεÏες πληÏοφοÏίες. installGnuPG.installFailed=ΠÏοέκυψε Ï€Ïόβλημα στην εγκατάσταση του GnuPG. ΠαÏακαλώ ελέγξτε τη καταγÏαφή κονσόλας για πεÏισσότεÏες πληÏοφοÏίες. # Strings in enigmailAddUidDlg.xul addUidDlg.nameOrEmailError=ΠÏέπει να συμπληÏώσετε το όνομα και τη διεÏθυνση email addUidDlg.nameMinLengthError=Το όνομα Ï€Ïέπει να έχει τουλάχιστον 5 χαÏακτήÏες addUidDlg.invalidEmailError=ΠÏέπει να εισάγετε μια έγκυÏη διεÏθυνση email # Strings in enigmailCardDetails.js # Carddetails.NoASCII=OpenPGP Smartcards only support ASCII characters in Firstname/Name. # network error types errorType.SecurityCertificate=Το πιστοποιητικό ασφαλείας της υπηÏεσίας web είναι άκυÏο. errorType.SecurityProtocol=Το Ï€Ïωτόκολλο ασφάλειας που χÏησιμοποιείται από την υπηÏεσία web είναι άγνωστο. errorType.Network=ΠÏοέκυψε Ï€Ïόβλημα δικτÏου. # filter stuff # filter.folderRequired=You must select a target folder. # filter.decryptMove.label=Decrypt permanently (Enigmail) # filter.decryptCopy.label=Create decrypted Copy (Enigmail) # filter.decryptMove.warnExperimental=Warning - the filter action "Decrypt permanently" may lead to destroyed messages.\n\nWe strongly recommend that you first try the "Create decrypted Copy" filter, test the result carefully, and only start using this filter once you are satisified with the result. # filter.tempPepFilterDesc=Temporary filter to store sent message unencrypted # filter.term.pgpencrypted.label=OpenPGP Encrypted # filter.encrypt.label=Encrypt to key (Enigmail) # filter.keyRequired=You must select a recipient key. # filter.keyNotFound=Could not find an encryption key for "%S". # filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for "%S" you will no longer be able to read the emails. # strings in enigmailConvert.jsm # converter.decryptBody.failed=Could not decrypt message with subject\n"%S".\nDo you want to retry with a different passphrase or do you want to skip the message? # converter.decryptAtt.failed=Could not decrypt attachment "%1$S"\nof message with subject\n"%2$S".\nDo you want to retry with a different passphrase or do you want to skip the message? # saveLogFile.title=Save Log File # strings in gpg.jsm # unknownSigningAlg=Unknown signing algorithm (ID: %S) # unknownHashAlg=Unknown cryptographic hash (ID: %S) # strings in keyRing.jsm # keyring.photo=Photo # keyRing.pubKeyRevoked=The key %1$S (key ID %2$S) is revoked. # keyRing.pubKeyExpired=The key %1$S (key ID %2$S) has expired. # keyRing.pubKeyNotForSigning=The key %1$S (key ID %2$S) cannot be used for signing. # keyRing.pubKeyNotForEncryption=The key %1$S (key ID %2$S) cannot be used for encryption. # keyRing.keyDisabled=The key %1$S (key ID %2$S) is disabled; it cannot be used. # keyRing.keyNotTrusted=The key %1$S (key ID %2$S) is not trusted enough. Please set the trust level of your key to "ultimate" to use it for signing. # keyRing.keyInvalid=The key %1$S (key ID %2$S) is not valid. Please consider verifying it correctly. Alternatively use the Default encryption settings in the Enigmail preferences dialog. # keyRing.signSubKeysRevoked=All signing-subkeys of key %1$S (key ID %2$S) are revoked. # keyRing.signSubKeysExpired=All signing-subkeys of key %1$S (key ID %2$S) have expired. # keyRing.signSubKeysUnusable=All signing-subkeys of key %1$S (key ID %2$S) are revoked, expired or otherwise unusable. # keyRing.encSubKeysRevoked=All encryption subkeys of key %1$S (key ID %2$S) are revoked. # keyRing.encSubKeysExpired=All encryption subkeys of key %1$S (key ID %2$S) have expired. # keyRing.noSecretKey=You do not seem to have the secret key for %1$S (key ID %2$S) on your keyring; you cannot use the key for signing. # keyRing.encSubKeysUnusable=All encryption subkeys of key %1$S (key ID %2$S) are revoked, expired or otherwise unusable. #strings in exportSettingsWizard.js # cannotWriteToFile=Cannot save to file '%S'. Please select a different file. # dataExportError=An error occurred during exporting your data. # enigmailSettings=EnigmailSettings # defaultBackupFileName=Enigmail-export # specifyExportFile=Specify file name for exporting # homedirParamNotSUpported=Additional params that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. #strings in expiry.jsm # expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use the new key. # expiry.keysExpireSoon=The following of your keys will expire in less than %1$S days:\n%2$S We recommend that you create new keys and configure your accounts to use the new keys. # expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to ultimate in key properties. # expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to ultimate in key properties. # expiry.OpenKeyManager=Open Enigmail Key Management # expiry.OpenKeyProperties=Open Key Properties #strings in pEpDecrypt.jsm # pEpDecrypt.cannotDecrypt=This is an encrypted message. Unfortunately you don't have the secret key to decrypt the message. #strings in gpgAgent.jsm # gpghomedir.notexists=The directory '%S' containing your OpenPGP keys does not exist and cannot be created. # gpghomedir.notwritable=The directory '%S' containing your OpenPGP keys is not writable. # gpghomedir.notdirectory=The directory '%S' containing your OpenPGP keys is a file instead of a directory. # gpghomedir.notusable=Please fix the directory permissions or change the location of your GnuPG "home" directory. GnuPG cannot work correctly otherwise. #strings in pepTrustWords.js # pepTrustWords.cannotVerifyOwnId=Cannot verify p≡p Trustwords for own account. # pepTrustWords.cannotFindKey=Cannot find key for %S. # pepTrustWords.cannotStoreChange=Could not change trust for %S. # pepTrustWords.generalFailure=Cannot obtain trustwords for %S. # pepTrustWords.partnerFingerprint=Fingerprint for %S: #strings in mimeWkdHandler.jsm # wkdMessage.body.req=Your email provider processed your request to upload your public key to the OpenPGP Web Key Directory.\n\nPlease click the confirmation button in the Enigmail header to complete the publishing of your public key. # wkdMessage.body.process=This is an email related to the automatic processing to upload your public key to the OpenPGP Web Key Directory.\n\nYou do not need to take any manual action at this point. #strings in pepHandshake.js # pepPrivacyStatus.RatingBrokenSuggestion=Either you or the sender should resend the message. # pepPrivacyStatus.RatingHaveNoKeySuggestionOutgoing=If you composed this message, your key is not available. # pepPrivacyStatus.RatingMistrustSuggestion=Re-establish the connection with your communication partner and try to complete another handshake. # pepPrivacyStatus.RatingReliableSuggestion=Complete a handshake with your communication partner by exchanging trustwords in person or over the phone. A handshake is needed only once per partner and will ensure secure and trusted communication. # pepPrivacyStatus.RatingTrustedSuggestion=No action needed! # pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware this message may not be secure. # pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Please add the necessary information. # pepPrivacyStatus.RatingUnderAttackSuggestion=Separately verify the content of this message with your communication partner. # pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least secure. # pepPrivacyStatus.RatingUnencryptedSuggestion=Please ask your communication partner to use an encryption solution or install p≡p. # pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or no signature. Ask your communication partner to upgrade their encryption solution or install p≡p. # pepPrivacyStatus.RatingBrokenExplanation=This message has broken encryption or formatting. # pepPrivacyStatus.RatingHaveNoKeyExplanation=This message cannot be decrypted because the key is not available. # pepPrivacyStatus.RatingMistrustExplanation=This message has a communication partner that has previously been marked as mistrusted. # pepPrivacyStatus.RatingReliableExplanation=This message is secure but you still need to verify the identity of your communication partner. # pepPrivacyStatus.RatingTrustedExplanation=This message is secure and trusted. # pepPrivacyStatus.RatingUndefinedExplanation=This message does not contain enough information to determine if it is secure. # pepPrivacyStatus.RatingUnderAttackExplanation=This message is not secure and has been tampered with. # pepPrivacyStatus.RatingUnencryptedExplanation=This message is unsecure. # pepPrivacyStatus.RatingUnencryptedForSomeExplanation=This message is unsecure for some communication partners. # pepPrivacyStatus.RatingUnreliableExplanation=This message has unreliable protection. # pepPrivacyStatus.RatingBrokenText=Broken # pepPrivacyStatus.RatingHaveNoKeyText=Cannot Decrypt # pepPrivacyStatus.RatingMistrustText=Mistrusted # pepPrivacyStatus.RatingReliableText=Secure # pepPrivacyStatus.RatingTrustedText=Secure & Trusted # pepPrivacyStatus.RatingUndefinedText=Unknown # pepPrivacyStatus.RatingUnderAttackText=Under Attack # pepPrivacyStatus.RatingUnencryptedForSomeText=Unsecure for Some # pepPrivacyStatus.RatingUnencryptedText=Unsecure # pepPrivacyStatus.RatingUnreliableText=Unreliable Security # handshakeDlg.button.initHandshake=Handshake... # handshakeDlg.button.stopTrust=Stop Trusting # handshakeDlg.button.reTrust=Stop Mistrusting # handshakeDlg.label.outgoingMessage=Outgoing message # handshakeDlg.label.incomingMessage=Incoming message # handshakeDlg.error.noPeers=Cannot handshake without any correspondents. # handshakeDlg.error.noProtection=Please enable protection in order to use the Handshake function. # enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device # enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup #strings in autocrypt.jsm # autocrypt.setupMsg.subject=Autocrypt Setup Message # autocrypt.setupMsg.msgBody=To set up your new device for Autocrypt, please follow the instuctions that should be presented by your new device. # autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code presented on your old device, and then import the contained key into your keyring. #strings in upgradeInfo.html # upgradeInfo.doctitle=What's New in Enigmail v2.0? # upgradeInfo.welcome1=Welcome to the new Enigmail version 2.0! # upgradeInfo.welcome2=The release contains a lot of new and changed features. Please take a minute to find out what's new: # upgradeInfo.encSubject.title=Encrypting the Message Subject # upgradeInfo.encSubject.desc=We developed a new method that moves the email subject into the encrypted message, and replaces the visible subject with "Encrypted Message". Once such a message is decrypted, the original subject is replaced automatically. Hiding the subject is on by default; there is a preference to turn it off if you don't like it. (Note: this feature requires the message to be sent with PGP/MIME.) # upgradeInfo.buttons.title=Changed behavior of Encrypt and Sign Buttons # upgradeInfo.buttons.desc=The Encrypt and Sign buttons in the message composer window now work for both the OpenPGP and S/MIME protocols. If both algorithms are possible, then Enigmail will try to prefer the one for which all keys are available. # upgradeInfo.autocrypt.title=Support for Autocrypt # upgradeInfo.autocrypt.desc=Enigmail now supports Autocrypt, a new standard to distribute keys as part of sent messages. Enigmail automatically imports keys from Autocrypt-compliant messages, such that over time more and more emails can be encrypted. # upgradeInfo.pEp.title=New p≡p Junior Mode (Pretty Easy Privacy) # upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. You currently need to manually install p≡p for this purpose; this will change in a future release. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. # upgradeInfo.bottom.desc=Please visit our documentation for help on using Enigmail. # pep.missingGnuPG=In order to use Enigmail/p≡p, GnuPG is required. As we could not find it, we suggest to download and install it for you. #strings in enigmailAbout.html # aboutEnigmail.tabName=About Enigmail # aboutEnigmail.title=OpenPGP support provided by Enigmail # aboutEnigmail.team=Enigmail is developed by the Enigmail Team: # aboutEnigmail.projectLeader=Lead Developer: # aboutEnigmail.usability=Usability: # aboutEnigmail.documentation=Documentation: # aboutEnigmail.testing=Testing: # aboutEnigmail.userSupport=User Support: # aboutEnigmail.localization=Localization: See the Enigmail Language Packs page # aboutEnigmail.Credits=Credits: # aboutEnigmail.origAuthor=Original author of the Enigmail extension # aboutEnigmail.icons=Icons: # aboutEnigmail.formerMembers=Former team members: # aboutEnigmail.projectHosting=Project hosting: # aboutEnigmail.licenseSupportTitle=License & Support # aboutEnigmail.license=Enigmail OpenPGP is open source and licensed under the %S # aboutEnigmail.support=Support and download is available from www.enigmail.net. enigmail-2.0.8/lang/el/help/000077500000000000000000000000001334302754500155655ustar00rootroot00000000000000enigmail-2.0.8/lang/el/help/compose.html000066400000000000000000000154241334302754500201260ustar00rootroot00000000000000 Βοήθεια του Enigmail: ΣÏνταξη μηνυμάτων

Βοήθεια του Enigmail

ΧÏήση του Enigmail στη σÏνταξη μηνυμάτων

  • ÎœÎµÎ½Î¿Ï Ï„Î¿Ï… Enigmail στο παÏάθυÏο ΣÏνταξης μηνÏματος
    • ΥπογÏαφή μηνÏματος: ΕνεÏγοποίηση/ΑπενεÏγοποίηση της αποστολής υπογεγÏαμμένων μηνυμάτων. Ο χÏήστης θα ειδοποιηθεί αν η υπογÏαφή αποτÏχει.
    • ΚÏυπτογÏάφηση μηνÏματος: ΕνεÏγοποίηση/ΑπενεÏγοποίηση της κÏυπτογÏάφησης για όλους τους παÏαλήπτες Ï€Ïιν την αποστολή. Ο χÏήστης θα ειδοποιηθεί αν η κÏυπτογÏάφηση αποτÏχει.

      Αν έχει ενεÏγοποιηθεί η επιλογή Εμφάνιση επιλογών όταν είναι απαÏαίτητο στην καÏτέλα ΠÏοτιμήσεις -> Επιλογή κλειδιοÏ, και υπάÏχουν διευθÏνσεις στη λίστα παÏαληπτών για τις οποίες δεν υπάÏχει δημόσιο κλειδί, θα εμφανιστεί η λίστα κλειδιών για να επιλέξετε αυτό που θα χÏησιμοποιηθεί.

      Αν έχει ενεÏγοποιηθεί η επιλογή Îα μην εμφανίζεται ποτέ ο διάλογος επιλογής κλειδί OpenPGP στην καÏτέλα ΠÏοτιμήσεις -> Επιλογή κλειδιοÏ, και υπάÏχουν διευθÏνσεις στη λίστα παÏαληπτών για τις οποίες δεν υπάÏχει δημόσιο κλειδί, το μήνυμα θα αποσταλεί χωÏίς κÏυπτογÏάφηση.

  • ΧÏήση PGP/MIME για αυτό το μήνυμα: ΕνεÏγοποίηση/ΑπενεÏγοποίηση της χÏήσης PGP/MIME για αυτό το μήνυμα.

    Αν γνωÏίζετε ότι οι παÏαλήπτες του μηνÏματός σας μποÏοÏν να διαβάσουν μηνÏματα που χÏησιμοποιοÏν PGP/MIME, καλό είναι να το ενεÏγοποιήσετε.

    Αυτό το χαÏακτηÏιστικό εξαÏτάται από το αν έχετε ενεÏγοποιήσει μία από τις επιλογές ΕπιτÏέπεται η χÏήση PGP/MIME ή Îα χÏησιμοποιείται πάντα PGP/MIME, στην καÏτέλα ΠÏοτιμήσεις -> PGP/MIME.

  • ΠÏοκαθοÏισμένες επιλογές σÏνταξης: ΥπομενοÏ.
    • Επιλογές υπογÏαφής/κÏυπτογÏάφησης...: συντόμευση Ï€Ïος το Ρυθμίσεις λογαÏÎ¹Î±ÏƒÎ¼Î¿Ï -> Επιλογές OpenPGP.
    • Επιλογές αποστολής...: συντόμευση Ï€Ïος την καÏτέλα ΠÏοτιμήσεις -> Βασικές Ïυθμίσεις.
    • Ρυθμίσεις επιλογής κλειδιοÏ...: συντόμευση Ï€Ïος την καÏτέλα ΠÏοτιμήσεις -> Επιλογή κλειδιοÏ.
    • Επιλογές PGP/MIME...: συντόμευση Ï€Ïος την καÏτέλα ΠÏοτιμήσεις -> PGP/MIME.
  • ΑφαίÏεση κÏυπτογÏάφησης: Αν παÏουσιαστεί κάποιο σφάλμα κατά την αποστολή του μηνÏματος, Ï€.χ. ο διακομιστής POP δεν αποδεχτεί την αίτηση, το Enigmail δεν έχει Ï„Ïόπο να το ανιχνεÏσει, και το κÏυπτογÏαφημένο μήνυμα θα εξακολουθήσει να εμφανίζεται στο παÏάθυÏο ΣÏνταξης. Σε αυτήν την πεÏίπτωση μποÏείτε να ανακτήσετε το αÏχικό σας κείμενο (χωÏίς την υπογÏαφή/κÏυπτογÏάφηση) με τη χÏήση Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… μενοÏ.
    Ως λÏση ανάγκης, αυτή η επιλογή μποÏεί να χÏησιμοποιηθεί για την αποκÏυπτογÏάφηση του κειμένου σε παÏάθεση, όταν απαντάτε σε κÏυπτογÏαφημένα μηνÏματα. Το Enigmail θα Ï€Ïέπει να αποκÏυπτογÏαφήσει αυτόματα το αÏχικό μήνυμα, αλλά αν για κάποιο λόγο αυτό δε συμβεί, μποÏείτε να το κάνετε εσείς με τη χÏήση Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… μενοÏ.
  • ΕπισÏναψη δημόσιου κλειδιοÏ: εισάγει το μπλοκ του δημόσιου ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï ÏƒÎµ μοÏφή ASCII-armored στην Ï„Ïέχουσα θέση του δÏομέα στο παÏάθυÏο ΣÏνταξης. Θα σας ζητηθοÏν οι διευθÏνσεις αλληλογÏαφίας του κλειδιοÏ/ών που θα εισαχθεί. Κλειδιά που εισήχθησαν με αυτόν τον Ï„Ïόπο θα αναγνωÏιστοÏν αυτόματα από το Enigmail του παÏαλήπτη. Μετά την εισαγωγή, μποÏείτε να υπογÏάψετε/κÏυπτογÏαφήσετε το μήνυμα ανάλογα με τις ανάγκες σας. Επίσης, δε θα Ï€Ïέπει να εισάγετε πολλαπλά μπλοκ κλειδιών σε ένα μήνυμα· απλώς καθοÏίστε πολλαπλές διευθÏνσεις αλληλογÏαφίας, χωÏισμένες με κόμμα, όταν σας ζητηθεί.
  • ΕκκαθάÏιση αποθηκευμένης φÏάσης Ï€Ïόσβασης: ΧÏήσιμο αν έχετε πολλαπλές φÏάσης Ï€Ïόσβασης.
  • Βοήθεια: Εμφανίζει τη Βοήθεια από το δικτυακό τόπο (αυτή η σελίδα).

ΠεÏισσότεÏη βοήθεια είναι διαθέσιμη στο δικτυακό τόπο του Enigmail

enigmail-2.0.8/lang/el/help/editRcptRule.html000066400000000000000000000210751334302754500210660ustar00rootroot00000000000000 Βοήθεια του Enigmail: ΕπεξεÏγασία κανόνων OpenPGP

Βοήθεια του Enigmail

ΧÏήση του ΕπεξεÏγαστή κανόνων του Enigmail: ΕπεξεÏγασία κανόνων OpenPGP

Στον ΕπεξεÏγαστή κανόνων, μποÏείτε να καθοÏίσετε τις Ï€ÏοκαθοÏισμένες επιλογές για κάθε παÏαλήπτη για την ενεÏγοποίηση της κÏυπτογÏάφησης, υπογÏαφής και χÏήση PGP/MIME, και να επιλέξετε τα κλειδιά OpenPGP που θα χÏησιμοποιηθοÏν. Σε αυτόν το διάλογο μποÏείτε να καθοÏίσετε τους κανόνες για ένα συγκεκÏιμένο παÏαλήπτη, ή για μια ομάδα παÏαληπτών με παÏόμοιες ιδιότητες.

  • ΟÏισμός κανόνων OpenPGP για: ΠεÏιέχει τις διευθÏνσεις αλληλογÏαφίας των παÏαληπτών (χωÏίς ονόματα, δηλ. απλώς τη διεÏθυνση, όπως η somebody@email.domain). ΜποÏείτε να εισάγετε παÏαπάνω από μία διεÏθυνση, χωÏίζοντάς τες με κενά. Οι διευθÏνσεις μποÏοÏν να πεÏιέχουν μόνο τον τομέα ώστε ο κανόνας να εφαÏμόζεται σε όλες τις διευθÏνσεις από αυτόν τον τομέα. ΠαÏάδειγμα: εισάγοντας το @email.domain, ο κανόνας να εφαÏμοστεί στα body@email.domain, somebody@email.domain, anybody@email.domain, κλπ.
  • ΕφαÏμογή κανόνα αν ο παÏαλήπτης ...: Αυτό καθοÏίζει τον Ï„Ïόπο ταιÏιάσματος της διεÏθυνσης αλληλογÏαφίας. Αν έχουν εισαχθεί πολλαπλές διευθÏνσεις, η ÏÏθμιση θα εφαÏμοστεί σε όλες. Τα παÏακάτω παÏάδειγμα βασίζονται στο ότι το body@email.domain έχει εισαχθεί στο παÏαπάνω πεδίο ΟÏισμός κανόνων OpenPGP για.
    • είναι ακÏιβώς: με αυτήν την επιλογή, ο κανόνας θα εφαÏμοστεί μόνο σε μηνÏματα Ï€Ïος το body@email.domain (ακÏιβές ταίÏιασμα, χωÏίς διάκÏιση πεζών/κεφαλαίων).
    • πεÏιέχει: με αυτήν την επιλογή, ο κανόνας θα εφαÏμοστεί σε οποιαδήποτε διεÏθυνση πεÏιέχει τη συμβολοσειÏά, δηλ. anybody@email.domain ή body@email.domain.net
    • αÏχίζει με: με αυτήν την επιλογή, ο κανόνας θα εφαÏμοστεί σε οποιαδήποτε διεÏθυνση αÏχίζει με τη συμβολοσειÏά, δηλ. body@email.domain.net, body@email.domain-name.com κλπ.
    • τελειώνει με : με αυτήν την επιλογή, ο κανόνας θα εφαÏμοστεί σε οποιαδήποτε διεÏθυνση τελειώνει με τη συμβολοσειÏά, δηλ. anybody@email.domain, somebody@email.domain κλπ.
  • Συνέχιση με τον επόμενο κανόνα για τη διεÏθυνση
    ΕνεÏγοποιώντας αυτήν την επιλογή μποÏείτε να οÏίσετε έναν κανόνα χωÏίς να χÏειαστεί να εισάγετε ένα ID ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï ÏƒÏ„Î¿ πεδίο ΧÏήση των ακόλουθων κλειδιών OpenPGP:, ώστε η διεÏθυνση να χÏησιμοποιηθεί για τον έλεγχο του ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï Ï„Î·Î½ ÏŽÏα της αποστολής. Επίσης, θα εφαÏμοστοÏν οι επόμενοι κανόνες για τη διεÏθυνση.
  • Îα μη γίνει έλεγχος άλλων κανόνων για τη διεÏθυνση
    ΕνεÏγοποιώντας αυτήν την επιλογή μποÏείτε να σταματήσετε τον έλεγχο της συγκεκÏιμένης διεÏθυνσης, δηλ. ο έλεγχος κανόνων συνεχίζεται για την επόμενη διεÏθυνσή
  • ΧÏήση των ακόλουθων κλειδιών OpenPGP:
    ΧÏησιμοποιήστε το κουμπί Επιλογή κλειδιοÏ(ών)... για να επιλέξετε τα κλειδιά του παÏαλήπτη που θα χÏησιμοποιηθοÏν για την κÏυπτογÏάφηση. Όπως και στην παÏαπάνω ενέÏγεια, δε θα ελεγχθοÏν οι επόμενοι κανόνες για τη διεÏθυνση.
  • Εξ οÏÎ¹ÏƒÎ¼Î¿Ï Î³Î¹Î± υπογÏαφή: ενεÏγοποίηση ή απενεÏγοποίηση της υπογÏαφής του μηνÏματος. Αυτό είτε χÏησιμοποιεί ή παÏακάμπτει την επιλογή που κάνατε στο παÏάθυÏο ΣÏνταξης του μηνÏματος. Διαθέσιμες τιμές είναι οι:
    • Ποτέ: απενεÏγοποιεί την υπογÏαφή, ακόμα και αν έχει ενεÏγοποιηθεί στο παÏάθυÏο ΣÏνταξης του μηνÏματος
    • Îαι, αν επιλεγεί στη σÏνταξη μηνÏματος: θα χÏησιμοποιηθεί η επιλογή που έγινε στο παÏάθυÏο ΣÏνταξης του μηνÏματος
    • Πάντα: ενεÏγοποιεί την υπογÏαφή, ακόμα και αν δεν έχει ενεÏγοποιηθεί στο παÏάθυÏο ΣÏνταξης του μηνÏματος
Αυτές οι επιλογές εφαÏμόζονται σε όσους κανόνες ταιÏιάζουν. Αν κάποιος κανόνας απενεÏγοποιεί την υπογÏαφή, το μήνυμα δε θα υπογÏαφεί, ανεξάÏτητα από άλλους κανόνες που χÏησιμοποιοÏν το Πάντα.
  • ΚÏυπτογÏάφηση: ενεÏγοποιεί ή απενεÏγοποιεί την κÏυπτογÏάφηση του μηνÏματος. Οι επιτÏεπόμενες τιμές και το νόημά τους είναι ίδιες με αυτές της υπογÏαφής.
  • PGP/MIME: ενεÏγοποιεί ή απενεÏγοποιεί τη χÏήση της κωδικοποίησης PGP/MIME (RFC 3156) για το μήνυμα. Αν απενεÏγοποιηθεί, τα μηνÏματα θα κωδικοποιοÏνται με "εμβόλιμο PGP". Οι επιτÏεπόμενες τιμές και το νόημά τους είναι ίδιες με αυτές της υπογÏαφής.

Οι κανόνες εφαÏμόζονται με τη σειÏά που βÏίσκονται στη λίστα του ΕπεξεÏγαστή κανόνων OpenPGP. Κάθε φοÏά που ένας κανόνας ταιÏιάζει με έναν παÏαλήπτη και πεÏιέχει ένα ID ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï OpenPGP, εκτός του ότι θα χÏησιμοποιηθεί το καθοÏισμένο ID κλειδιοÏ, ο παÏαλήπτης δε θα θεωÏείται διαθέσιμος για τους υπόλοιπους κανόνες.


ΠεÏισσότεÏη βοήθεια είναι διαθέσιμη στο δικτυακό τόπο του Enigmail

enigmail-2.0.8/lang/el/help/initError.html000066400000000000000000000045421334302754500204350ustar00rootroot00000000000000 Enigmail Help: How to Resolve Problems with Initializing OpenPGP

Enigmail Help

How to Resolve Problems with Initializing OpenPGP

There are several reasons why initializing OpenPGP does not succeed. The most common ones are described below; for more information please visit the Enigmail Support page.

GnuPG could not be found

In order for OpenPGP to work, the tool GnuPG needs to be installed. If GnuPG cannot be found, then first make sure that the executable gpg.exe (on Windows; gpg on other platforms) is installed on your computer. If GnuPG is installed, and OpenPGP cannot find it, then you need to manually set the path to GnuPG in the OpenPGP Preferences (menu OpenPGP > Preferences)

Enigmime failed to initialize

OpenPGP works only if it is built using the same build environment as Thunderbird or SeaMonkey was built. This means that you can use the official Enigmail releases only if you use the official releases of Thunderbird or SeaMonkey provided by mozilla.org.

If you use a Thunderbird or SeaMonkey version coming from some other source (e.g. the provider of your Linux distribution), or if you built the application yourself, you should either use an Enigmail version built by the same source, or build Enigmail yourself. For building Enigmail, refer to the Source Code section on the Enigmail home page. Please don't file any bug report concerning this problem, it is not solvable.

Further help is available on the Enigmail Support Web Site.

enigmail-2.0.8/lang/el/help/messenger.html000066400000000000000000000171571334302754500204560ustar00rootroot00000000000000 Βοήθεια του Enigmail

Βοήθεια του Enigmail

Ανάγνωση μηνυμάτων με το Enigmail

  • Το κουμπί ΑποκÏυπτογÏάφησης στο κÏÏιο παÏάθυÏο
    Αυτό το κουμπί εξυπηÏετεί πολλοÏÏ‚ σκοποÏÏ‚: αποκÏυπτογÏάφηση, επαλήθευση ή εισαγωγή δημόσιων κλειδιών. Κανονικά η αποκÏυπτογÏάφηση/επαλήθευση γίνεται αυτόματα, παÏότι αυτό μποÏεί να αλλαχτεί. Αν όμως παÏουσιαστεί Ï€Ïόβλημα, θα εμφανιστεί ένα πεÏιληπτικό μήνυμα στη γÏαμμή κατάστασης του Enigmail. Αν κάνετε κλικ στο κουμπί ΑποκÏυπτογÏάφησης, θα μποÏέσετε να δείτε ένα πιο λεπτομεÏές μήνυμα καθώς και την έξοδο της εντολής GnuPG.
  • Τα εικονίδια Πένας και ÎšÎ»ÎµÎ¹Î´Î¹Î¿Ï ÏƒÏ„Î·Î½ Κεφαλίδα του μηνÏματος
    Τα εικονίδια Πένας και ÎšÎ»ÎµÎ¹Î´Î¹Î¿Ï ÏƒÏ„Î·Î½ Κεφαλίδα του μηνÏματος δηλώνουν αν το μήνυμα που διαβάζετε είναι υπογεγÏαμμένο και/ή κÏυπτογÏαφημένο και αν η υπογÏαφή είναι έγκυÏη, το μήνυμα δεν αλλάχτηκε μετά την υπογÏαφή του. Αν το μήνυμα έχει αλλαχτεί, το εικονίδιο Πένας θα αντικατασταθεί από το εικονιδίου Σπασμένου ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï Ï„Î¿ οποίο δηλώνει ότι η υπογÏαφή δεν είναι έγκυÏη. Κάνοντας δεξί κλικ σε ένα από τα δÏο εικονίδια θα εμφανιστεί ένα Î¼ÎµÎ½Î¿Ï Î¼Îµ τις ακόλουθες επιλογές:
    • ΠληÏοφοÏίες ασφαλείας OpenPGP: σας εμφανίζει την κατάσταση εξόδου του GnuPG για το μήνυμα.
    • ΑντιγÏαφή πληÏοφοÏιών ασφαλείας OpenPGP: αντιγÏάφει την κατάσταση εξόδου του GnuPG στο Ï€ÏόχειÏο· για να την επικολλήσετε σε κάποιο μήνυμα κλπ.
    • Εμφάνιση ID φωτογÏαφίας OpenPGP: σας εμφανίζει το ID φωτογÏαφίας του ατόμου που σας έστειλε το μήνυμα, αν βέβαια αυτή υπάÏχει στο Δημόσιο Κλειδί του. (Αυτή η επιλογή είναι διαθέσιμο μόνο αν το ID φωτογÏαφίας OpenPGP υπάÏχει στο κλειδί.)
    • ΠληÏοφοÏίες ασφαλείας S/MIME: σας εμφανίζει τις πληÏοφοÏίες ασφαλείας S/MIME για το μήνυμα.

    Αν δεν έχετε ενεÏγοποιημένη την επιλογή keyserver-options auto-key-retrieve στο αÏχείο gpg.conf σας, και διαβάζετε ένα μήνυμα που είναι υπογεγÏαμμένο ή κÏυπτογÏαφημένο, στην κεφαλίδα του μηνÏματος θα εμφανιστεί το εικονίδιο Πένας με ένα ΕÏωτηματικό πάνω του, ενώ το μήνυμα στη γÏαμμή κατάστασης του Enigmail θα λέει Τμήμα του μηνÏματος υπογεγÏαμμένο· κάντε κλικ στο εικονίδιο Πένας για πληÏοφοÏίες και στην πεÏιοχή κειμένου του μηνÏματος θα εμφανίζονται όλα τα OpenPGP μπλοκ και το μπλοκ της υπογÏαφής.

    Αυτό μποÏεί επίσης να συμβεί όταν το κλειδί δεν υπάÏχει στον Ï€ÏοκαθοÏισμένο εξυπηÏετητή κλειδιών, ακόμα κι αν έχετε ενεÏγοποιημένη την επιλογήkeyserver-options auto-key-retrieve στο gpg.conf σας.

    Κάνοντας κλικ στο εικονίδιο Πένας και ΕÏÏ‰Ï„Î·Î¼Î±Ï„Î¹ÎºÎ¿Ï Î¸Î± εμφανιστεί ένα παÏάθυÏο που θα σας πληÏοφοÏεί ότι το κλειδί δεν είναι διαθέσιμο στη λίστα κλειδιών σας. Πατώντας OK θα εμφανιστεί ένα άλλο παÏάθυÏο με μία λίστα εξυπηÏετητών κλειδιών για να επιλέξετε από ποιον θα γίνει λήψη του δημόσιου ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï Ï„Î¿Ï… αποστολέα.

    Για να οÏίσετε τη λίστα των εξυπηÏετητών κλειδιών που θέλετε να χÏησιμοποιείτε, πηγαίνετε στην καÏτέλα Enigmail -> ΠÏοτιμήσεις -> Βασικές και εισάγετε τις διευθÏνσεις στο πεδίο ΕξυπηÏετητής(ές) κλειδιών:, χωÏισμένες με κόμματα. Ο Ï€Ïώτος εξυπηÏετητής στη λίστα θα χÏησιμοποιηθεί ως ο Ï€ÏοκαθοÏισμένος.

  • Άνοιγμα κÏυπτογÏαφημένων επισυνάψεων / εισαγωγή ενσωματωμένων κλειδιών OpenPGP
    Επισυνάψεις με όνομα *.pgp, *.asc και *.gpg αναγνωÏίζονται ως επισυνάψεις που το Enigmail θα τις διαχειÏιστεί με ειδικό Ï„Ïόπο. Κάνοντας δεξί κλικ σε μία τέτοια επισÏναψη θα ενεÏγοποιήσει δÏο ειδικές καταχωÏήσεις στο Î¼ÎµÎ½Î¿Ï Ï€Î¿Ï… θα εμφανιστεί: ΑποκÏυπτογÏάφηση και Άνοιγμα και ΑποκÏυπτογÏάφηση και Αποθήκευση. ΧÏησιμοποιήστε τις αν θέλετε το Enigmail αποκÏυπτογÏαφήσει την επισυνάψεις Ï€Ïιν το άνοιγμα ή την αποθήκευσή της. Αν η επισÏναψη αναγνωÏιστεί ως αÏχείο ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï OpenPGP, θα εÏωτηθείτε αν θέλετε να γίνει εισαγωγή του ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï ÏƒÏ„Î· λίστα κλειδιών σας.

ΠεÏισσότεÏη βοήθεια είναι διαθέσιμη στο δικτυακό τόπο του Enigmail
Αν έχετε εÏωτήσεις ή σχόλια σχετικά με το enigmail, παÏακαλώ στείλτε ένα μήνυμα στη λίστα του Enigmail OpenPGP

Το Enigmail OpenPGP είναι λογισμικό Î±Î½Î¿Î¹ÎºÏ„Î¿Ï ÎºÏŽÎ´Î¹ÎºÎ± και κυκλοφοÏεί υπό την Mozilla Public License 2.0

enigmail-2.0.8/lang/el/help/rulesEditor.html000066400000000000000000000122171334302754500207570ustar00rootroot00000000000000 Βοήθεια του Enigmail: ΕπεξεÏγασία κανόνων

Βοήθεια του Enigmail

ΧÏήση του ΕπεξεÏγαστή κανόνων του Enigmail

Στον ΕπεξεÏγαστή κανόνων, μποÏείτε να καθοÏίσετε τις Ï€ÏοκαθοÏισμένες επιλογές για κάθε παÏαλήπτη για την ενεÏγοποίηση της κÏυπτογÏάφησης, υπογÏαφής και χÏήση PGP/MIME, και να επιλέξετε τα κλειδιά OpenPGP που θα χÏησιμοποιηθοÏν. Κάθε κανόνας αποτελείται από πέντε πεδία:

  • Email: οι διευθÏνσεις αλληλογÏαφίας που μποÏοÏν να χÏησιμοποιηθοÏν στα πεδία To:, Cc: και Bcc:. Ο έλεγχός τους γίνεται με χÏήση υποσυμβολοσειÏών (ΠεÏισσότεÏες λεπτομέÏειες υπάÏχουν στο διάλογο του ΕπεξεÏγαστή κανόνων)
  • Κλειδί(ιά) OpenPGP: η λίστα ID κλειδιών OpenPGP για χÏήση με τον αποστολέα
  • ΥπογÏαφή: ενεÏγοποίηση ή απενεÏγοποίηση της υπογÏαφής του μηνÏματος. Αυτό είτε χÏησιμοποιεί ή παÏακάμπτει την επιλογή που κάνατε στο παÏάθυÏο ΣÏνταξης του μηνÏματος. Διαθέσιμες τιμές είναι οι:
    • Ποτέ: απενεÏγοποιεί την υπογÏαφή, ακόμα και αν έχει ενεÏγοποιηθεί στο παÏάθυÏο ΣÏνταξης του μηνÏματος
    • Πιθανή: θα χÏησιμοποιηθεί η επιλογή που έγινε στο παÏάθυÏο ΣÏνταξης του μηνÏματος
    • Πάντα: ενεÏγοποιεί την υπογÏαφή, ακόμα και αν δεν έχει ενεÏγοποιηθεί στο παÏάθυÏο ΣÏνταξης του μηνÏματος
Αυτές οι επιλογές εφαÏμόζονται σε όσους κανόνες ταιÏιάζουν. Αν κάποιος κανόνας απενεÏγοποιεί την υπογÏαφή, το μήνυμα δε θα υπογÏαφεί, ανεξάÏτητα από άλλους κανόνες που χÏησιμοποιοÏν το Πάντα.
  • ΚÏυπτογÏάφηση: ενεÏγοποιεί ή απενεÏγοποιεί την κÏυπτογÏάφηση του μηνÏματος. Οι επιτÏεπόμενες τιμές και το νόημά τους είναι ίδιες με αυτές της υπογÏαφής.
  • PGP/MIME: ενεÏγοποιεί ή απενεÏγοποιεί τη χÏήση της κωδικοποίησης PGP/MIME (RFC 3156) για το μήνυμα. Αν απενεÏγοποιηθεί, τα μηνÏματα θα κωδικοποιοÏνται με "εμβόλιμο PGP". Οι επιτÏεπόμενες τιμές και το νόημά τους είναι ίδιες με αυτές της υπογÏαφής.

Οι κανόνες εφαÏμόζονται με τη σειÏά που βÏίσκονται στη λίστα. Κάθε φοÏά που ένας κανόνας ταιÏιάζει με έναν παÏαλήπτη και πεÏιέχει ένα ID ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï OpenPGP, εκτός του ότι θα χÏησιμοποιηθεί το καθοÏισμένο ID κλειδιοÏ, ο παÏαλήπτης δε θα θεωÏείται διαθέσιμος για τους υπόλοιπους κανόνες.

Σημείωση: Ο ΕπεξεÏγαστής κανόνων δεν είναι ακόμα ολοκληÏωμένος. Είναι δυνατή η συγγÏαφή πιο Ï€ÏοχωÏημένων κανόνων με απευθείας επεξεÏγασία του αÏχείου κανόνων (δε θα Ï€Ïέπει να γίνει πλέον επεξεÏγασία αυτών των κανόνων με τον ΕπεξεÏγαστή). ΠεÏισσότεÏες πληÏοφοÏίες για την απευθείας επεξεÏγασία του αÏχείου κανόνων υπάÏχουν στο δικτυακό τόπο του Enigmail


ΠεÏισσότεÏη βοήθεια είναι διαθέσιμη στο δικτυακό τόπο του Enigmail

enigmail-2.0.8/lang/el/help/sendingPrefs.html000066400000000000000000000047771334302754500211210ustar00rootroot00000000000000 Enigmail Help: Edit OpenPGP Rule

Enigmail Help

Defining Preferences to Send Encrypted

In the Sending Preferences you can choose the general model and preferences for encryption.

Convenient Encryption
With these settings, emails are encrypted without confirmation whenever possible.

This setup is appropriate, if you just want to improve your privacy by sending emails encyrpted instead of unencrypted if that's possible.

The effect is like sending emails as letters instead of postcards. Unlike postcards, letters usually hide their contents while in transit.

Note however that as with letters you can't be sure that nobody is opening the letter while it is in transit (although, some technical effort is necessary for that).

A concrete risk is that you accidentally use "faked keys" you got from somewhere or somebody claiming that the key belongs to the person you want to send emails to. To avoid this risk, you can either use the trust model of PGP (see below) or you should always verify, whether the fingerprint of a public key is correct.

Manual Encryption
This option allows you to specify the different preferences for encryption according to your needs. You can specify
  • whether replies to encrypted/signed emails should automatically also be encrypted/signed-
  • whether to use the trust model of OpenPGP to accept keys (this means that to use a key you either have to sign the key or have enough other people you trust having signed the key).
  • whether you want to automatically send emails encrypted if all keys are accepted.
  • whether and when you want to finally confirm sending an email.
If it is important for you that content you send encrypted can't be read by other people or organizations, you should use the manual preferences at least choose the option to accept keys only if you or other people signed them. While this model reduces the risk of using faked keys, it requires that you actively sign keys and declare owner trust using the key managament dialog. enigmail-2.0.8/lang/es-AR/000077500000000000000000000000001334302754500151445ustar00rootroot00000000000000enigmail-2.0.8/lang/es-AR/enigmail.dtd000066400000000000000000001070011334302754500174250ustar00rootroot00000000000000 NOTA: Generar la clave puede tardar varios minutos. No salga del programa mientras se est\u00E9 generando la clave. Navegue activamente o realice distintas operaciones que requieran un uso intensivo del disco durante el proceso, repercutir\u00E1n en la aleatoridad y velocidad del mismo. Cuando las claves se hayan generado, se le avisar\u00E1."> ' no es v\u00E1lido"> NOTA: La generaci\u00F3n de las claves puede tardar varios minutos. No salga del programa mientras se est\u00E1n generando. Se le avisar\u00E1 cuando las claves se hayan terminado de generar."> Para hacerlo todo sencillo, asumimos ciertos valores sobre la configuraci\u00F3n. Estos valores intentar\u00E1n proporcionar un alto nivel de seguridad para el usuario medio sin crear confusi\u00F3n. Por supuesto, puede cambiar todas estas opciones despu\u00E9s de que termine el asistente. Puede averiguar m\u00E1s acerca de las caracter\u00EDsticas de Enigmail en el men\u00FA Ayuda o en el "> NOTA: Enigmail siempre comprobar\u00E1 las firmas en los correos de cada cuenta o identidad, tanto si est\u00E1 activado como si no"> Para verificar su correo firmado, la gente necesita un programa de correo que interprete OpenPGP. Si no tienen un programa que entienda OpenPGP, podr\u00E1n leer su correo, pero la firma se ver\u00E1 como un adjunto o como texto alrededor del mensaje. Esto puede molestar a algunas personas. Necesita elegir si desea firmar todo el correo que env\u00EDe, o si desea evitar correo firmado a algunas personas."> Gracias por usar Enigmail."> Gracias por usar Enigmail."> enigmail-2.0.8/lang/es-AR/enigmail.properties000066400000000000000000000623241334302754500210560ustar00rootroot00000000000000Enigmail=Enigmail enigAlert=Alerta de Enigmail enigConfirm=Confirmación de Enigmail enigError=Error de Enigmail enigPrompt=Línea de comandos Enigmail dlgYes=Si dlgNo=No dlgKeepSetting=Recordar mi respuesta y no volver a preguntarme dlgNoPrompt=No volver a mostrar este diálogo dlg.button.delete=&Borrar dlg.button.cancel=&Cancelar dlg.button.close=&Cerrar dlg.button.continue=Con&tinuar dlg.button.skip=&Omitir dlg.button.view=&Ver repeatPrefix=\n\nEste alerta se repetirá %S repeatSuffixSingular=vez más. repeatSuffixPlural=veces más. noRepeat=\n\nEste alerta no se repetirá hasta que actualice Enigmail. noLogDir=Por favor, active la opción 'Directorio de registro' para crear el archivo de registro. noLogFile=¡El archivo de registro todavía no ha sido creado! restartForLog=Por favor, reinicie el programa para crear el archivo de registro pgpNotSupported=Parece que está usando Enigmail junto con PGP 6.x\n\nDesafortunadamente, PGP 6.x tiene algunas características que impiden que Enigmail funcione correctamente. Por lo tanto, Enigmail ya no soporta más PGP 6.x; por favor, utilice GnuPG (GPG) en su lugar.\n\nSi necesita ayuda para cambiar a GnuPG, visite la sección de Ayuda en el sitio Web de Enigmail. avoidInitErr=Para evitar este alerta permanentemente, arregle el problema o desinstale Enigmail utilizando el menú Herramientas->Extensiones passphraseCleared=La frase contraseña ha sido eliminada. passphraseCannotBeCleared=Est\u00E1 utilizando gpg-agent para el manejo de la contrase\u00F1a. PorYou are using gpg-agent for passphrase handling. Por lo tanto no es posible eliminar la contrase\u00F1a desde Enigmail. noPhotoAvailable=No hay foto disponible usingVersion=Ejecutando Enigmail versión %S usingAgent=Usando %S ejecutable %S para cifrar y descifrar. agentError=ERROR: ¡No se pudo acceder al servicio Enigmime! accessError=Error al acceder al servicio Enigmail. onlyGPG=¡Generar la clave sólo funciona con GnuPG (no con PGP)! keygenComplete=¡Se ha terminado de generar la clave! La Identidad <%S> se usará para firmar. revokeCertRecommended=Recomendamos firmemente crear un certificado de revocación para su clave. Este certificado puede usarse para invalidar su clave, por ejemplo si su clave secreta se pierde o queda comprometida. ¿Desea crear ahora el certificado de revocación? keyMan.button.generateCert=&Generate Certificate genCompleteNoSign=¡La clave ha sido generada! genGoing=¡Ya se está generando la clave! passNoMatch=La frase contraseña ingresada no coincide; inténtelo de nuevo. passCheckBox=Por favor, marque la casilla si no especifica una frase contraseña para la clave. passUserName=Por favor, indique un nombre de usuario para esta identidad passCharProblem=Ha utilizado caracteres especiales en la frase contraseña. Desafortunadamente, esto puede crear problemas en otros programas. Por favor, elija una frase contraseña con cualquiera de estos caracteres:\na-z A-Z 0-9 /.;:-,!?(){}[]%* changePassFailed=No se pudo cambiar la frase contraseña. removePassphrase=¿Desea borrar la frase contraseña actual sin crear una nueva? keyMan.button.removePass=&Remover Contrase\u00F1a keyConfirm=¿Generar la clave pública y privada para '%S'? keyMan.button.generateKey=&Generar Clave keyAbort=¿Cancelar generar la clave? keyMan.button.generateKeyAbort=&Abortar Generacion de Clave keyMan.button.generateKeyContinue=&Continuar Generaci\u00F3n de Clave expiryTooLong=No se puede crear una clave que expire dentro de más de 100 años. expiryTooShort=Su clave debe ser válida al menos durante un día. keyGenFailed=No se pudo generar la clave. Por favor, compruebe la consola de Enigmail (Menú Enigmail > Depurar Enigmail) para detalles. securityInfo=Información de seguridad Enigmail.\n\n enigHeader=Enigmail: enigContentNote=Enigmail: *Los adjuntos de este mensaje no han sido firmados ni cifrados*\n\n possiblyPgpMime=El mensaje posiblemente esté firmado o cifrado con PGP/MIME; pulse el botón Descifrar para comprobarlo. noDecrypted=¡No hay mensajes descifrados para guardar!\nUse el comando Guardar del menú Archivo noMessage=¡No hay mensajes para guardar! useButton=Por favor, pulse el botón Descifrar para descifrar el mensaje saveHeader=Enigmail: Guardar mensaje descifrado saveAttachmentHeader=Enigmail: Guardar adjunto descifrado noTempDir=No se pudo encontrar un directorio temporal para escribir\nPor favor, compruebe el valor de la variable TEMP attachmentPgpKey=El adjunto '%S' que está abriendo parece un archivo de claves OpenPGP.\n\nPulse Si para importar las claves que contenga o No para ver el contenido del archivo en una ventana del navegador beginPgpPart=********* *PRINCIPIO DE LA PARTE CIFRADA o FIRMADA* ********* endPgpPart=********** *FIN DE LA PARTE CIFRADA o FIRMADA* ********** notePartEncrypted=Enigmail: *Partes del mensaje que NO se han firmado o cifrado* noteCutMessage=Enigmail: *Multiple message blocks found -- decryption/verification aborted* decryptOkNoSig=Aviso\n\nSe pudo descifrar correctamente, pero no se pudo comprobar la firma. msgOvl.button.contAnyway=&Continuar De Todos Modos keysToExport=Seleccionar claves OpenPGP a adjuntar keysToUse=Seleccionar la(s) clave(s) OpenPGP a usar para %S pubKey=Clave pública para %S\n windowLocked=La ventana de redactar está bloqueada; envío cancelado sendUnencrypted=No se pudo inicializar Enigmail.\n¿Enviar mensaje sin cifrar? composeSpecifyEmail=Por favor, especifique su dirección de correo principal, que se usará para elegir la clave que firma los mensajes salientes.\nSi lo deja en blanco, se usará el campo DE de la dirección de correo para elegir la clave que firme el mensaje. sendingHiddenRcpt=Este mensaje tiene destinatarios BCC (copia oculta). Si el mensaje es cifrado, es posible esconder los destinatarios BCC, pero usuarios de otros productos (por ej. PGP Corp) no podr\u00E1n descifrar el mensaje. Por eso, recomendamos evitar correos con copia oculta con mensajes cifrados. sendWithHiddenBcc=Esconder destinatarios BCC sendWithShownBcc=Cifrar normalmente sendingNews=Se canceló la operación de envío cifrado.\n\nEste mensaje no se puede cifrar porque hay destinatarios de grupos de noticias. Por favor, vuelva a enviar el mensaje sin cifrado. sendToNewsWarning=Advertencia: usted est\u00E1 por enviar un mensaje cifrado a un grupo de noticias.\n\nEsto se desaconseja porque s\u00F3lo tiene sentido si todos los miembros del grupo pueden descifrar el mensaje, por ej. el mensaje debe ser cifrado con las claves de todos los participantes del grupo. Por favor env\u00EDe este mensaje solamente si sabe exactamente lo que est\u00E1 haciendo.\n\nContinuar? hasHTML=Aviso de correo HTML:\nEste es un mensaje en formato HTML, lo que podría causar que falle la firma/cifrado. Para evitar esto en el futuro, debe pulsar la tecla MAYUSCULAS mientras pulsa el botón de Redactar/Responder para enviar correo cifrado.\nSi firma el correo de manera predeterminada, debería desmarcar la opción 'Redactar mensajes en formato HTML' para desactivar permanentemente el correo en formato HTML para esta cuenta. strippingHTML=El mensaje contiene información en formato HTML que se perderá al convertir a texto plano para firmar o cifrar. ¿Desea continuar? msgCompose.button.sendAnyway=&Enviar Mensaje de Todos Modos attachWarning=Los adjuntos a este mensaje no son locales, no se pueden cifrar. Para cifrar los adjuntos, primero guárdelos como archivos locales y luego adjunte los archivos. ¿Desea continuar? quotedPrintableWarn=Ha activado la codificación 'quoted-printable' para enviar mensajes. Esto puede producir un cifrado y/o verificación incorrectos de su mensaje.\n¿Desea desactivar ahora el envío de mensajes en formato 'quoted-printable'? minimalLineWrapping=Tiene que poner el ajuste de línea a %S caracteres. Para un cifrado y/o firmado correctos, este valor necesita ser de al menos 68.\n¿Desea cambiar ahora el ajuste de línea a 68 caracteres? warning=Aviso signIconClicked=Ha modificado el firmado manualmente. Por lo tanto, mientras esté redactando el mensaje, (des)activar el firmado ya no depende de la opción de (des)activar. sendAborted=Operación de envío cancelada.\n\n statPGPMIME=PGP/MIME statSigned=FIRMADO statEncrypted=CIFRADO statPlain=TEXTO PLANO offlineSave=¿Guardar el mensaje %S para %S en la carpeta de mensajes No enviados? onlineSend=¿Enviar el mensaje %S a %S? encryptKeysNote=NOTA: El mensaje está cifrado con los siguientes IDs de usuario / Clave: %S signFailed=Error en Enigmail; no se pudo cifrar/firmar; ¿enviar el correo sin cifrar? msgCompose.button.sendUnencrypted=&Enviar Mensaje Sin Cifrar acctNotConfigured=No ha configurado esta identidad para usar seguridad Enigmail.\n¿Enviar el mensaje sin cifrar? recipientsSelectionHdr=Seleccionar destinatarios para cifrar configureNow=No ha configurado la seguridad Enigmail para la identidad seleccionada. ¿Desea hacerlo ahora? signYes=El mensaje se firmará signNo=El mensaje no se firmará encryptYes=El mensaje se cifrará encryptNo=El mensaje no se cifrará rulesConflict=Se ha detectado un conflicto en reglas por destinatario\n%S\n\n¿Enviar el mensaje con esta configuración? msgCompose.button.configure=&Configure msgCompose.button.send=&Enviar Mensaje msgCompose.button.save=&Guardar Mensaje keyNeeded=Se necesita la clave pública %S para verificar la firma clickDecrypt=; pulse el botón Descifrar clickDecryptRetry=; pulse el botón Descifrar para volver a intentarlo clickPen=; pulse el icono del Lápiz clickPenDetails=; pulse el icono del Lápiz para detalles clickQueryPenDetails=; pulse el icono del Lápiz para detalles clickKey=; pulse el icono de la Llave clickQueryKeyDetails=; pulse el icono de la Llave para detalles clickKeyDetails=; pulse el icono de la Llave para detalles clickPenKeyDetails=; pulse el icono del Lápiz o Llave para detalles msgPart=Parte del mensaje %S msgSigned=firmado msgEncrypted=cifrado msgSignedAndEnc=firmado y cifrado unverifiedSig=Firma sin verificar incompleteDecrypt=Descifrado incompleto failedSig=Error - No se pudo comprobar la firma. needKey=Error - Se necesita la clave secreta para descifrar el mensaje. failedDecrypt=Error - No se pudo descifrar. badPhrase=Error - Frase contraseña incorrecta. failedDecryptVerify=Error - No se pudo descifrar/verificar. viewInfo=; Ver > Información de seguridad del mensaje para detalles decryptedMsg=Mensaje descifrado testNoSvc=EnigTest: No se pudo acceder al servicio Enigmail testNoEmail=EnigTest: Por favor, indique la dirección de correo para probar. testSucceeded=Enigmail está funcionando correctamente. Para detalles, examine la consola disponible en el menú Enigmail. oldGpgVersion=No se pudo iniciar Enigmail.\n\nEstá usando la versión %S de GnuPG, que ya no se actualiza. Enigmail requiere GnuPG versión 1.4 o superior; Por favor, actualice su instalación de GnuPG, o Enigmail no funcionará. locateGpg=Localizar el agente GnuPG invalidGpgPath=No se puede ejecutar GnuPG con la ruta proporcionada. Por lo tanto, se desactiva Enigmail hasta que se cambie la ruta a GnuPG otra vez o se reinicie el programa. warningsAreReset=Todos los avisos serán restablecidos. prefs.gpgFound=Se encontr\u00F3 GnuPG en %S prefs.gpgNotFound=No se pudo encontrar GnuPG prefs.warnAskNever=Aviso: activar esta opci\u00F3n tendr\u00E1 como resultado que los correos en donde no haya clave para uno de los destinatarios el correo ir\u00E1 sin cifrar, sin m\u00E1s informaci\u00F3n. \u00A1Enigmail no informar\u00E1 si esto ocurre! prefEnigmail.oneKeyserverOnly=Error - s\u00F3lo se puede especificar un servidor de claves para la descarga autom\u00E1tica de claves OpenPGP faltantes. enterPass=Por favor, escriba su frase contraseña OpenPGP. enterPassOrPin=Por favor, escriba su frase contraseña OpenPGP o el PIN de su tarjeta inteligente. repeatPass=Por favor, repita su frase contraseña OpenPGP rememberPass=Recordar durante %S minutos de inactividad enterAdminPin=Por favor, escriba el PIN administrativo de su tarjeta inteligente enterCardPin=Por favor, escriba el PIN de su tarjeta inteligente notInit=Error - No se ha iniciado todavía el servicio Enigmail. badCommand=Error - Falló el comando de cifrado. cmdLine=línea de comandos y salida: notRequired=Error - No se requiere cifrado. notComplete=Error - No se ha terminado de generar la clave. invalidEmail=Error - Dirección/direcciones de correo no válida(s). noPassphrase=Error - No se suministró la frase contraseña. noPGPblock=Error - No se encontró un bloque con armadura OpenPGP válido. unverifiedReply=La parte indentada del mensaje (respuesta) probablemente ha sido modificada decryptToImport=Pulse el botón Descifrar para importar el bloque de clave pública en el mensaje sigMismatch=Error - La firma no coincide. cantImport=Error al importar la clave pública.\n\n sc.wrongCardAvailable=La tarjeta inteligente %S encontrada en su lector no puede ser usada para procesar el mensaje.\nPor favor inserte su tarjeta inteligente %S y repita la operaci\u00F3n. sc.insertCard=La operaci\u00F3n requiere su tarjeta inteligente %S.\nPor favor inserte la tarjeta inteligente requerida y repita la operaci\u00F3n. sc.removeCard=La operaci\u00F3n require que no haya tarjetas inteligentes en el lector.\nPor favor retire su tarjeta inteligente y repita la operaci\u00F3n. sc.noCardAvailable=No se pudo encontrar ninguna tarjeta inteligente en su lectora\nPor favor, inserte su tarjeta inteligente y repita la operación sc.noReaderAvailable=No se pudo acceder a su lectora de tarjetas inteligentes.\nPor favor, conecte su lectora de tarjetas inteligentes, inserte la tarjeta y repita la operación. gpgNotFound=No se pudo encontrar el agente GnuPG '%S'.\nAsegúrese de haber puesto correctamente la ruta al ejecutable GnuPG en las preferencias de Enigmail. gpgNotInPath=No se pudo encontrar el ejecutable GnuPG en el PATH.\nAsegúrese que haya puesto correctamente la ruta al ejecutable GnuPG en las preferencias de Enigmail. enigmimeNotAvail=El servicio Enigmime no está disponible gpgAgentNotStarted=No se pudo iniciar el programa del agente gpg necesario para su versi\u00F3n de GnuPG %S. prefUntrusted=SIN CONFIANZA prefRevoked=CLAVE REVOCADA prefExpiredKey=CLAVE EXPIRADA prefExpired=EXPIRADO prefGood=La firma de %S es correcta. prefBad=Firma INCORRECTA de %S failCancel=Error - Recepción de clave cancelada por el usuario. failNoServer=Error - No se especificó el servidor de claves para recibir la clave. failNoID=Error - No se especificó el ID que va a recibir la clave. failKeyExtract=Error - Falló el comando de extracción de clave. notFirstBlock=Error - El primer bloque OpenPGP no es un bloque de clave pública. importKeyConfirm=¿Importar la(s) clave(s) pública(s) incluida(s) en el mensaje? failKeyImport=Error - No se pudo importar la clave. fileWriteFailed=No se pudo escribir en el archivo %S successKeyImport=Clave(s) importada(s) exitosamente. importKey=Importar la clave pública %S desde el servidor de claves: uploadKey=Enviar la clave pública %S al servidor de claves: keyId=ID de clave keyAndSigDate=ID de clave: 0x%S / Firmado el: %S keyFpr=Huella de clave: %S noEmailProvided=¡No se proporcionó la dirección de correo! keyAlreadySigned=La clave ya está firmada, no se puede firmar dos veces. selKeyExpired=expiró %S createdHeader=Creada atLeastOneKey=¡No se seleccionó una clave! Tiene que seleccionar al menos una para aceptar este diálogo fewerKeysThanRecipients=Usted ha seleccionado un n\u00FAmero menor de claves que de destinatarios. Est\u00E1 seguro de que la lista de claves para cifrar est\u00E1 completa? userSel.button.goBack=Seleccione m\u00E1s Claves userSel.secretKeySel.title=Seleccione una Clave Secreta OpenPGP para Firmar Sus Mensajes pgpMimeNote=NOTA: PGP/MIME sólo está soportado en un número limitado de clientes de correo. En Windows sólo Mozilla/Thunderbird, Sylpheed, Pegasus y Mulberry se sabe que soportan este estándar; en Linux/UNIX y Mac OS X la mayoría de los clientes de correo lo soportan. Si no está seguro, seleccione la %S opción. first=primera second=segunda encryptKeyHeader=Seleccione clave OpenPGP para cifrar identityName=Identidad: %S noEncryption=Tiene el cifrado activado, pero no seleccionó una clave. Para enviar correo cifrado a %S, necesita especificar una o varias claves válidas de la lista de claves. ¿Desea desactivar el cifrado para %S? noKeyToUse=(ninguna - sin cifrado) noEmptyRule=¡La regla no puede estar vacía! Por favor, ponga una dirección de correo electrónico en el campo Regla. invalidAddress=La(s) dirección/direcciones de correo introducida(s) no es/son válida(s). No hay que poner los nombres de los destinatarios, sólo las direcciones. Ejemplo:\nNo válido: El nombre \nVálido: usuario@servidor.net noCurlyBrackets=Los corchetes {} tienen un significado especial y no se deben usar en las direcciones de correo electrónico. Si desea modificar el comportamiento de esta regla, use la opción 'Aplicar regla si el destinatario...'\nPara más información pulse el botón Ayuda. never=Nunca always=Siempre possible=Posible deleteRule=¿Realmente quiere borrar la regla seleccionada? nextRcpt=(Destinatario siguiente) negateRule=No needOnline=La función seleccionada no está disponible en modo sin conexión. Por favor, pase a modo con conexión y vuelva a intentarlo. protocolNotSupported=El protocolo '%S://' que ha seleccionado no está soportado para descargar claves OpenPGP. gpgkeysDisabled=Podría ayudar si se activa la opción 'extensions.enigmail.useGpgKeysTool'. noKeyserverConn=No se pudo conectar con el servidor de claves %S keyDownloadFailed=No se pudo descargar la clave del servidor de claves. El mensaje de estado es:\n%S internalError=Ha ocurrido un error interno. No se pudieron descargar o importar las claves. noKeyFound=Lo siento, no se pudo encontrar ninguna clave que coincidiera con el criterio de búsqueda especificado.\nPor favor, tenga en cuenta que el ID de clave debe tener el prefijo "0x" (ejemplo: 0xABCDEF12). gpgKeysFailed=Fallo al buscar o descargar la clave del servidor de claves: no se pudo ejecutar gpgkeys_%S. setKeyTrustFailed=Fallo al establecer la confianza de clave. signKeyFailed=Fallo al firmar la clave. undefinedError=Ocurrió un error no definido. alreadySigned.label=Nota: la clave %S ya est\u00E1 firmada con la clave secreta seleccionada. keyMan.loadingKeys=Cargando claves. Por favor, espere... keyValid.unknown=desconocida keyValid.invalid=no es válida keyValid.disabled=desactivada keyValid.revoked=revocada keyValid.expired=expirada keyValid.noSubkey=subclave no válida keyValid.valid=v\u00E1lida keyTrust.untrusted=sin confianza keyTrust.marginal=poca confianza keyTrust.full=confiable keyTrust.ultimate=absoluta keyTrust.group=(group) keyType.public=pública keyType.publicAndSec=pública/secreta keyMan.enableKey=Activar clave keyMan.disableKey=Desactivar clave userAtt.photo=Aspecto de usuario (imagen JPEG) asciiArmorFile=Archivos con armadura ASCII (*.asc) gnupgFile=Archivos GnuPG saveRevokeCertAs=Crear y guardar certificado de revocación revokeCertOK=El certificado de revocación se ha creado correctamente. Puede usarlo para invalidar su clave pública, por ejemplo si pierde su clave secreta.\n\nPor favor, póngalo en un soporte que se pueda guardar de forma segura, como un CD o un disquete. Si alguien tiene acceso a este certificado, puede usarlo para inutilizar su clave. revokeCertFailed=No se pudo crear el certificado de revocación. addUidOK=ID del usuario agregado correctamente addUidFailed=Fallo al agregar el ID del usuario noKeySelected=Debe seleccionar al menos una clave para realizar la operación seleccionada. exportToFile=Exportar clave pública a un archivo exportSecretKey=¿Desea incluir la clave secreta en el archivo de claves OpenPGP a guardar? saveKeysOK=Las claves se guardaron satisfactoriamente. saveKeysFailed=Fallo al guardar las claves. importKeysFailed=Fallo al importar las claves. enableKeyFailed=Fallo al activar/desactivar las claves. specificPubKeyFilename=%S (0x%S) púb specificPubSecKeyFilename=%S (0x%S) púb-sec defaultPubKeyFilename=Claves-públicas-exportadas defaultPubSecKeyFilename=Claves-públicas-y-secretas-exportadas noSecretKeys=No se encontraron claves secretas.\n\n¿Desea generar su propia clave secreta ahora? sendKeysOk=Clave(s) enviada(s) exitosamente. sendKeysFailed=Fallo al enviar las claves. receiveKeysOk=Clave(s) actualizada(s) exitosamente. receiveKeysFailed=Fallo al descargar las claves. importFromClip=¿Desea importar alguna(s) clave(s) desde el portapapeles? copyToClipbrdFailed=No se logró copiar la(s) clave(s) seleccionada(s) al portapapeles. copyToClipbrdOK=Clave(s) copiada(s) al portapapeles. deleteSecretKey=AVISO: ¡Está a punto de borrar una clave secreta!\nSi borra la clave secreta, ya no podrá descifrar ningún mensaje que vaya cifrado para esa clave.\n\n¿Realmente desea borrar AMBAS claves, la pública y la secreta\n'%S'? deleteMix=AVISO: ¡Está a punto de borrar las claves secretas!\nSi borra las claves secretas, ya no será posible descifrar ningún mensaje que haya sido cifrado con esas claves.\n\n¿Realmente desea borrar AMBAS, las claves secretas y públicas seleccionadas? deletePubKey=¿Desea borrar la clave pública\n'%S'? deleteSelectedPubKey=¿Desea borrar las claves públicas? deleteKeyFailed=No se pudo borrar la clave. revokeKeyAsk=Esta función crea e importa un certificado de revocación. ¿Realmente desea revocar la clave %S? revokeKeyOk=La clave ha sido revocada. Si la clave está disponible en un servidor de claves, se recomienda volver a subirla, de forma que otros puedan ver la revocación. revokeKeyFailed=No se pudo revocar la clave. refreshAllQuestion=No ha seleccionado ninguna clave. ¿Desea actualizar TODAS las claves? refreshKey.warn=AVISO: Dependiendo del número de claves y la velocidad de la conexión, actualizar todas las claves puede ser un proceso bastante lento.\n\n¿Continuar? keyMan.button.exportSecKey=&Exportar Claves Secretas keyMan.button.exportPubKey=Export S\u00F3lo Claves &P\u00FAblicas keyMan.button.import=&Importar keyMan.button.refreshAll=&Refrescar Todas las Claves keyMan.button.revokeKey=&Revocar Clave keylist.noOtherUids=No tiene otras identidades keylist.hasOtherUids=Tambi\u00E9n conocido como keylist.noPhotos=No hay fotograf\u00ED disponible keylist.hasPhotos=Fotograf\u00EDas keySignatureLocal=Local keySignatureExportable=Exportable keySignatureNoKey=Sin clave userIdNotFound=(No se encontró el ID del usuario) signatureValid=S\u00ED retrieveKeyConfirm=La clave no está disponible - ¿Desea descargarla de un servidor de claves? changePrimUidFailed=Fallo al cambiar el ID del usuario primario changePrimUidOK=El ID del usuario primario se cambió correctamente deleteUidFailed=Fallo al borrar el ID del usuario %S deleteUidOK=El ID del usuario %S se borró correctamente revokeUidFailed=Fallo al revocar el ID del usuario %S revokeUidOK=El ID del usuario %S se revocó correctamente. Si la clave está disponible en un servidor de claves, se recomienda volver a subirla, de forma que otros puedan ver la revocación. revokeUidQuestion=¿Realmente desea revocar el ID del usuario %S? deleteUidQuestion=¿Realmente desea borrar el ID del usuario %S?\n\nPor favor, tenga en cuenta que si la clave pública está en un servidor de claves, el borrar el ID del usuario no cambiará nada. En este caso hay que usar 'Revocar ID de usuario'. keyTypePublic=clave pública keyTypePrimary=clave primaria keyTypeSubkey=subclave keyTypePair=par de claves keyExpiryNever=nunca keyAlgorithm_1=RSA keyAlgorithm_2=RSA keyAlgorithm_3=RSA keyAlgorithm_16=ELG keyAlgorithm_17=DSA keyAlgorithm_20=ELG keygen.started=Por favor, espere mientras se está generando la clave... keygen.completed=Clave generada. El nuevo ID de clave es: 0x%S keygen.keyBackup=Se ha respaldado la clave como %S keygen.passRequired=Por favor, especifique una frase contraseña si desea crear una copia de respaldo de su clave fuera de su tarjeta inteligente. cardPin.dontMatch=El PIN introducido no coincide; por favor, vuelva a intentarlo. cardPin.minLength=El PIN debe tener al menos %S caracteres o números. cardPin.processFailed=Se produjo un fallo al cambiar el PIN. keyserverProgress.refreshing=Actualizando las claves. Por favor, espere... keyserverProgress.uploading=Subiendo claves; por favor, espere... keyserverTitle.refreshing=Actualizando claves keyserverTitle.uploading=Subir claves passphrase.min8keys=¡Su frase contraseña debe contener al menos 8 caracteres! setupWizard.applyAllId=Activar Enigmail para todas las identidades setupWizard.applySomeId=Activar Enigmail para las identidades: %S setupWizard.applySingleId=Activar Enigmail para su cuenta de correo setupWizard.setAllPrefs=Ajustar todas las opciones recomendadas del programa setupWizard.setSomePrefs=Ajustar las opciones del programa recomendadas que ha seleccionado setupWizard.setNoPrefs=No ajustar ninguna opción del programa setupWizard.createKey=Crear una nueva clave OpenPGP de 2048 bits, válida durante 5 años setupWizard.useKey=Usar la clave OpenPGP existente con ID %S para firmar setupWizard.encryptAll=Por defecto, cifrar todos los correos setupWizard.encryptNone=Por defecto, no cifrar todos los correos setupWizard.signAll=Por defecto, firmar todos los correos setupWizard.signNone=Por defecto, no firmar los correos setupWizard.reallyCancel=¿Realmente desea cancelar el asistente de instalación de Enigmail? addUidDlg.nameOrEmailError=Debe introducir un nombre y una direcci\u00F3n email addUidDlg.nameMinLengthError=El nombre debe tener al menos 5 caracteres addUidDlg.invalidEmailError=Debe especificar una direcci\u00F3n email v\u00E1lida addUidDlg.commentError=No se permite par\u00E9ntesis en los comentarios enigmail-2.0.8/lang/es-AR/help/000077500000000000000000000000001334302754500160745ustar00rootroot00000000000000enigmail-2.0.8/lang/es-AR/help/compose.html000066400000000000000000000104511334302754500204300ustar00rootroot00000000000000 Ayuda de Enigmail: Redacción de mensajes

Ayuda de Enigmail

Usando Enigmail para redactar mensajes

  • Menú Enigmail en la ventana de redacción de mensajes
    • Firmar mensaje: Activa/desactiva el envío de correo firmado. El usuario recibe una notificación si hay un fallo en la firma.
    • Cifrar mensaje: Activa/desactiva el cifrado para todos los destinatarios antes de enviarlo. El usuario recibe una notificación si hay un fallo al cifrar.

      Si está activada la opción Mostrar la selección si es necesario en Preferencias -> pestaña Selección de clave, se abrirá una ventana con una lista de claves si hay direcciones en la lista de destinatarios del mensaje de las que no se tiene la clave pública.

      Si está activada la opción Nunca mostrar el diálogo de selección de clave OpenPGP en Preferencias -> pestaña Selección de clave, y hay direcciones en la lista de destinatarios del mensaje de las que no se tiene la clave pública, el mensaje se enviará sin cifrar.

  • Usar PGP/MIME en este mensaje: Activa/desactiva el uso de PGP/MIME en este mensaje.

    Si sabe con certeza que los destinatarios pueden leer el correo usando el formato PGP/MIME, entonces se debe usar.

    Esta característica depende de la configuración en Preferencias -> pestaña PGP/MIME si está establecida en Usar PGP/MIME si es posible o Siempre usar PGP/MIME.

    • Opciones predeterminadas de redacción: Submenú
    • Opciones de firmado/cifrado...: acceder a Configuración de cuentas... -> Seguridad OpenPGP.
    • Opciones de envío...: acceder a Preferencias -> pestaña Enviar.
    • Opciones de selección de clave...: acceder a Preferencias -> pestaña Selección de clave.
    • Opciones PGP/MIME...: acceder a Preferencias -> pestaña PGP/MIME.
  • Deshacer cifrado: Si hay algún problema al enviar el correo, como un fallo en el servidor POP que no acepta la solicitud, Enigmail no lo sabrá, y el mensaje cifrado seguirá mostrándose en la ventana de redacción. Con esta opción de menú, se deshacerá el cifrado/firma, volviendo a la ventana de redacción con su texto original.
    Como solución temporal, también se puede usar para descifrar el texto citado al contestar a mensajes cifrados. Enigmail debe descifrar automáticamente el mensaje citado, pero si se produce un fallo por cualquier motivo, se puede usar esta opción del menú para forzarlo.
  • Adjuntar clave pública...: Adjunta el bloque de la clave pública al mensaje, en un archivo con armadura ASCII. Se le preguntará el ID de usuario de las claves que se van a adjuntar.
  • Borrar frase contraseña guardada: Elimina de la caché las frases contraseñas introducidas manualmente. Esto es útil si se tienen varias frases contraseñas.
  • Ayuda: Muestra información de ayuda (esta página).

Más ayuda disponible en la página Web de ayuda de Enigmail

enigmail-2.0.8/lang/es-AR/help/editRcptRule.html000066400000000000000000000133461334302754500213770ustar00rootroot00000000000000 Ayuda de Enigmail: Editar regla OpenPGP

Ayuda de Enigmail

Usando el editor de reglas de Enigmail: Editar regla OpenPGP

En el editor de reglas, se pueden especificar opciones predeterminadas para cada destinatario, activando el cifrado, la firma y PGP/MIME; y para definir qué clave(s) OpenPGP va a usar. En este diálogo, se pueden especificar las reglas para un único destinatario, y para un grupo de destinatarios con atributos muy similares.

  • Definir reglas OpenPGP para: Contiene las direcciones de correo electrónico de los destinatarios (sin nombre, por ejemplo una dirección como alguien@correo.org). Se pueden especificar varias direcciones de correo, separadas por espacios. La dirección especificada aquí puede consistir de sólo la sección del dominio, para que se aplique al correo de cualquier dirección de ese dominio, como @correo.org se aplicará a alguien@correo.org, cualquiera@correo.org, otro@correo.org, etc.
  • Aplicar regla si el destinatario: Esto modifica si coinciden las direcciones de correo electrónico. Si se introducen varias direcciones, la opción se aplicará a todas. Los ejemplos de abajo están basados en que se ha introducido alguien@correo.org en el campo Reglas openPGP de arriba.
    • Es exactamente: Con esta opción, la regla sólo se activará en los correos a alguien@correo.org (exacto, no se tienen en cuenta las mayúsculas).
    • Contiene: Con esta opción, cualquier dirección de correo que contenga la cadena, cumplirá la regla, como unnombre@correo.dominio o nombre@correo.dominio.org
    • Comienza con: Con esta opción, cualquier dirección de correo que empiece por la cadena, cumplirá la regla, como alguien@correo.dominio.net, alguien@correo.nombre-dominio.com.
    • Acaba en: Con esta opción, cualquier dirección de correo que acabe en la cadena, cumplirá la regla, como otronombre@correo.org, alguien@correo.org
  • Continuar con la regla siguiente para la dirección coincidente
    Activar esta función permitirá definir una regla pero no tener que especificar un ID de clave en el campo Usar las siguientes claves OpenPGP: para que se use la dirección de correo electrónico para comprobar una clave en el momento del envío. También se procesarán las reglas posteriores para la misma dirección.
  • No comprobar las reglas siguientes para la dirección coincidente
    Activar esta función detiene el procesamiento de cualquier otra regla para las direcciones que cumplan la regla. Es decir, las reglas se reanudan procesando el próximo destinatario.
  • Usar las siguientes claves OpenPGP:
    Use el botón Seleccionar clave(s)... para seleccionar las claves del destinatario que se usen para el cifrado. Al igual que la acción anterior, no se continúan procesando las reglas para las direcciones que cumplan la regla.
  • Predeterminada para firmar: Activa o desactiva la firma del mensaje. Esta opción usa o ignora lo especificado en la ventana de redacción de mensajes. Los valores son:
    • Nunca: Desactiva la firma, incluso si se activó en la ventana de redacción de mensajes (tiene preferencia sobre los otros valores).
    • Sí, si está seleccionada en la redacción del mensaje: Deja la firma como se haya especificado en la ventana de redacción de mensajes.
    • Siempre: Activa la firma, incluso si no estaba activada en la ventana de redacción de mensajes.
Estas opciones de firma se aplican a todas las reglas que coincidan con el criterio. Si una de las reglas desactiva la firma, el mensaje no se firmará, independientemente de que otras especifiquen Siempre.
  • Cifrar: Activa o desactiva el cifrado del mensaje. Las opciones permitidas y su significado son las mismas que para la firma de mensajes.
  • PGP/MIME: Activa o desactiva el uso de la codificación PGP/MIME (RFC 3156) en el mensaje. Si PGP/MIME está desactivado, los mensajes se codifican usando "PGP integrado". Los valores permitidos y su significado son los mismos que para la firma de mensajes.

Las reglas se procesan en el orden mostrado en la lista de OpenPGP - Editar reglas por destinatario. Cuando una regla coincida con un destinatario y contenga un ID de clave OpenPGP, además de usar el ID de clave especificado, el destinatario ya no se considera cuando se procesen más reglas.


Más ayuda disponible en la página de configuración por destinatario de Enigmail

enigmail-2.0.8/lang/es-AR/help/initError.html000066400000000000000000000052561334302754500207470ustar00rootroot00000000000000 Enigmail Help: How to Resolve Problems with Initializing OpenPGP

Ayuda de Enigmail

Cómo Resolver Problemas al Iniciar OpenPGP

Hay varias razones por las que no se tiene éxito al inicializar OpenPGP. Las más comunes son descritas más abajo & para más información por favor visite la página de Soporte de Enigmail.

No se pudo encontrar GnuPG

Para que funcione OpenPGP, la herramienta GnuPG debe ser instalada. Si GnuPG no puede ser encontrado, entonces primero asegúrese de que el ejecutable gpg.exe (en Windows& gpg en otras plataformas) esté instalado en su computador. Si GnuPG está instalado, y OpenPGP no puede encontrarlo, entonces usted necesitará configurar manualmente la ruta a GnuPG en las Preferencias de OpenPGP (menú OpenPGP > Preferencias)

Enigmime falló al inicilizarse

OpenPGP solamente funciona si es compilado usando el mismo ambiente de compilación en que Thunderbird o SeaMonkey fue compilado. Esto significa que usted sólo puede usar la versión oficial de Enigmail si utiliza las versiones oficiales de Thunderbird o SeaMonkey provistas por mozilla.org.

Si usted utiliza una versión de Thunderbird o SeaMonkey provista por otra fuente (p.ej. el proveedor de su distribución de Linux), o si usted compiló la aplicación por si mismo, ustede debe, o bien usar una versión de Enigmail del mismo proveedor, o compilar Enigmail usted mismo. Para compilar Enigmail, refiérase a la sección de Código Fuente en la página de Enigmail. Por favor no envie reportes de bugs acerca de este problema, no puede ser solucionado.

Más ayuda está disponible en el Sitio Web de Soporte de Enigmail.

enigmail-2.0.8/lang/es-AR/help/messenger.html000066400000000000000000000115301334302754500207520ustar00rootroot00000000000000 Ayuda de Enigmail: Lectura de mensajes

Ayuda de Enigmail

Usando Enigmail para leer mensajes

  • Botón Descifrar en la ventana principal de correo
    Este botón se puede usar para varios propósitos: descifrar, verificar o importar claves públicas. Normalmente el descifrado/verificación se realiza automáticamente, aunque hay una opción para desactivar esto. Sin embargo, si esto falla, normalmente aparecerá un breve mensaje de error en la línea de estado de Enigmail. Si se pulsa el botón Descifrar, podrá ver un mensaje de error más detallado, incluyendo la salida del comando GnuPG.
  • Los iconos Lápiz y Llave mostrados en la cabecera del mensaje
    Los iconos Lápiz y Llave en la cabecera del mensaje indican si el mensaje que se está leyendo está firmado y/o cifrado y si la firma es buena, es decir; que el mensaje no se ha modificado desde el momento de su firma. Si el mensaje ha sido modificado, el icono del Lápiz cambiará a un Lápiz roto para indicar que la firma no es correcta. Al pulsar con el botón derecho del ratón en los iconos del Lápiz o Llave, se obtendrá un menú con las siguientes opciones:

    • Información de seguridad OpenPGP: permite ver el estado de salida de GnuPG para el mensaje.
    • Copiar información de seguridad OpenPGP: copia el estado de salida de GnuPG al portapapeles; para pegarlo en un mensaje de respuesta, etc.
    • Ver ID fotográfico OpenPGP: permite ver la Foto ID de la persona que envió el mensaje, si tiene una foto incrustada en su clave pública (Esta opción sólo se activará si existe un ID fotográfico en su clave).
    • Información de seguridad S/MIME: permite ver la información de seguridad S/MIME del mensaje.

    Si no tiene puesta la opción keyserver-options auto-key-retrieve en su archivo gpg.conf y lee un mensaje que está firmado o cifrado, verá un icono de un Lápiz en el área de visión de las cabeceras con un Signo de interrogación y, la línea de estado de Enigmail en el área de las cabeceras dirá: Parte del mensaje firmado; pulse el icono del lápiz para más detalles y el mensaje en el panel de mensajes mostrará todos los indicadores del bloque del mensaje OpenPGP y el bloque de la firma.

    También se puede ver esto si tiene activada la opción keyserver-options auto-key-retrieve en su archivo gpg.conf y la clave OpenPGP no está disponible en el servidor de claves predeterminado.

    Al pulsar en el icono del Lápiz y Signo de interrogación abrirá una ventana avisando que la clave no está disponible en el anillo de claves. Al pulsar en Aceptar abrirá otra ventana con una lista de servidores de claves en los que puede seleccionar para descargar la clave pública del remitente.

    Para configurar la lista de servidores de claves que desee usar, vaya a la pestaña Enigmail -> Preferencias -> Básicas e introduzca la dirección de los servidores de claves en el recuadro Servidor(es) de claves: separados por una coma. El primer servidor de claves de la lista se usará como predeterminado.

  • Abrir adjuntos cifrados / importar claves OpenPGP adjuntas
    Los adjuntos con el nombre *.pgp, *.asc y *.gpg se reconocen como adjuntos que se pueden manejar especialmente con Enigmail. Al pulsar con el botón derecho en un adjunto de este tipo se activan dos elementos especiales en el menú contextual: Descifrar y Abrir y Descifrar y Guardar. Use estos elementos si desea que Enigmail descifre un adjunto antes de abrirlo o guardarlo. Si se reconoce un adjunto como un archivo de clave OpenPGP, se le ofrece la posibilidad de importar las claves a sus anillos.

Más ayuda disponible en la página Web de ayuda de Enigmail

enigmail-2.0.8/lang/es-AR/help/rulesEditor.html000066400000000000000000000067011334302754500212670ustar00rootroot00000000000000 Ayuda de Enigmail: Editor de reglas

Ayuda de Enigmail

Usando el editor de reglas de Enigmail

En el editor de reglas, se pueden especificar opciones predeterminadas por destinatario para activar el cifrado, firma y PGP/MIME, así como definir qué clave(s) OpenPGP usar. Cada regla consiste de 5 campos y se representa en una sola línea:

  • Correo electrónico: Las direcciones de correo en los campos Para:, Cc: y Cco: tienen que coincidir. La coincidencia funciona en subcadenas (Más detalles en el diálogo de Editar regla)
  • Clave(s) OpenPGP: Una lista de IDs de claves OpenPGP para usar con el destinatario.
  • Firmar: Activar o desactivar el firmado de mensajes. Esta opción usa o ignora lo que se haya especificado en la ventana de redacción de mensajes. Los valores son:
    • Nunca: Desactiva la firma, incluso si estaba activada en la ventana de redacción del mensaje (tiene preferencia sobre los otros valores).
    • Posible: Deja la firma como se haya especificado en la ventana de redacción de mensajes.
    • Siempre: Activar la firma, incluso si no está activada en la ventana de redacción de mensajes.
Estas opciones de firma se aplican a todas las reglas que las cumplan. Si una de las reglas desactiva la firma, el mensaje no se firmará, independientemente de otras reglas que especifiquen Siempre.
  • Cifrar: Activa o desactiva el cifrado del mensaje. Las opciones permitidas y su significado son las mismas que para la firma.
  • PGP/MIME: Activa o desactiva el uso de la codificación del mensaje PGP/MIME (RFC 3156). Si PGP/MIME está desactivado, los mensajes se codifican usando "PGP integrado". Los valores permitidos y su significado son los mismos que para la firma de mensajes.

Las reglas se procesan en el orden mostrado en la lista. Cuando una regla coincida con un destinatario y contenga un ID de clave OpenPGP, además de usar el ID de clave especificado, el destinatario no se tendrá en consideración al procesar más reglas.

NOTA: El editor de reglas aún no está completo. Es posible escribir algunas reglas más avanzadas editando directamente el archivo de reglas (en cuyo caso, éstas no se deben volver a editar mediante el editor). Más información para editar el archivo directamente se encuentra disponible en la página Web de Enigmail.


Más ayuda disponible en la página Web de ayuda de Enigmail

enigmail-2.0.8/lang/es-AR/help/sendingPrefs.html000066400000000000000000000047771334302754500214300ustar00rootroot00000000000000 Enigmail Help: Edit OpenPGP Rule

Enigmail Help

Defining Preferences to Send Encrypted

In the Sending Preferences you can choose the general model and preferences for encryption.

Convenient Encryption
With these settings, emails are encrypted without confirmation whenever possible.

This setup is appropriate, if you just want to improve your privacy by sending emails encyrpted instead of unencrypted if that's possible.

The effect is like sending emails as letters instead of postcards. Unlike postcards, letters usually hide their contents while in transit.

Note however that as with letters you can't be sure that nobody is opening the letter while it is in transit (although, some technical effort is necessary for that).

A concrete risk is that you accidentally use "faked keys" you got from somewhere or somebody claiming that the key belongs to the person you want to send emails to. To avoid this risk, you can either use the trust model of PGP (see below) or you should always verify, whether the fingerprint of a public key is correct.

Manual Encryption
This option allows you to specify the different preferences for encryption according to your needs. You can specify
  • whether replies to encrypted/signed emails should automatically also be encrypted/signed-
  • whether to use the trust model of OpenPGP to accept keys (this means that to use a key you either have to sign the key or have enough other people you trust having signed the key).
  • whether you want to automatically send emails encrypted if all keys are accepted.
  • whether and when you want to finally confirm sending an email.
If it is important for you that content you send encrypted can't be read by other people or organizations, you should use the manual preferences at least choose the option to accept keys only if you or other people signed them. While this model reduces the risk of using faked keys, it requires that you actively sign keys and declare owner trust using the key managament dialog. enigmail-2.0.8/lang/es-ES/000077500000000000000000000000001334302754500151515ustar00rootroot00000000000000enigmail-2.0.8/lang/es-ES/am-enigprefs.properties000066400000000000000000000001251334302754500216420ustar00rootroot00000000000000# Strings used in the Mozill AccountManager prefPanel-enigprefs=Seguridad de OpenPGP enigmail-2.0.8/lang/es-ES/enigmail.dtd000066400000000000000000002047621334302754500174460ustar00rootroot00000000000000 Mozilla Public License 2.0."> La 'Transferencia de clave de Autocrypt' requiere que el cliente de correo en el otro dispositivo sea compatible con Autocrypt. Aunque esta es la solución más fácil, actualmente sólo un número limitado de clientes soporta este estándar. La otra forma es 'Hacer copia de seguridad y Restaurar' su configuración. Esto creará un archivo ZIP con toda la información y claves requeridas, que puede copiar a su nuevo dispositivo. Enigmail puede importar directamente esta configuración; para otros clientes de correo, el archivo ZIP puede desempaquetarse y manejarse de forma manual."> '"> ' para especificar direcciones de correo electrónico"> ' para especificar direcciones de correo electrónico para GnuPG. Deshabilítela si los destinatarios tienen claves de Hushmail antiguas."> Configuración de cuenta > Seguridad OpenPGP)"> NOTA: La generación de clave puede llegar a tardar varios minutos. No salga de la aplicación mientras se esté generando la clave. Navegar por Internet o realizar operaciones que hagan uso intensivo del disco reabastecerá la 'provisión de aleatoriedad' y acelerará el proceso. Se le avisará cuando se haya completado la generación de claves."> Autocrypt es un estándar que define cómo lograr un cifrado extremo-a-extremo conveniente para correo electrónico. Especifica cómo negocian los programas de correo electrónico las capacidades de cifrado usando correos ordinarios."> ' no es válido."> NOTA: La generación del par de claves puede tardar varios minutos en completarse. No abandone la aplicación mientras se están generado. Se le avisará cuando la generación de claves se haya completado."> Nota: Enigmail siempre comprobará las firmas de los correos para cada cuenta o identidad, tanto si está activada como si no"> clave pública sirve para que otros el envíen correos cifrados. Puede distribuirla a todo el mundo."> clave privada sirve para que usted descifre estos correos y para envíar correos firmados. No debe dársela a nadie."> clave privada sirve para que usted descrifre estos correos y envíe correos cifrados. No debe dársela a nadie. Para proteger su clave privada, en los dos próximos cuadros de diálogo se le pedirá una frase-contraseña."> frase-contraseña es una palabra/frase de seguridad para proteger su clave privada. Evita el mal uso de su clave privada."> No se recomiendan, diéresis, acentos o caracteres específicos del idioma (ej. ä, é, ñ)."> Se le pedirá para ello que introduzca su contraseña. Por favor, transfiera el certificado a un soporte que pueda ser guardado aparte de forma segura, como un CD o una memoria USB. Si alguien obtiene acceso a este certificado puede usarlo para volver su clave inutilizable."> Exporte sus datos desde su antiguo equipo usando el asistente de copia de seguridad en las Preferencias de Enigmail. Importe los datos desde su nuevo equipo usando este asistente. "> Gracias por usar Enigmail."> Si desea hacerlo así, por favor, confirme la petición que encontrará en su bandeja de entrada."> Exporte sus datos desde su antiguo equipo usando este asistente Importe los datos a su nuevo equipo usando el asistente de configuración "> Por favor, seleccione debajo la cuenta para la que quiere transferir su clave. En la siguiente pantalla mostraremos un código de instalación (contraseña) que necesitará introducir en el otro dispositivo para importar su clave y la configuración relacionada."> Por favor, cambie ahora al otro dispositivo y abra el mensaje. Se le debe solicitar un código de instalación. Escriba, por favor, los siguientes dígitos en la solicitud."> enigmail-2.0.8/lang/es-ES/enigmail.properties000066400000000000000000001651741334302754500210720ustar00rootroot00000000000000Enigmail=Enigmail ##################################################################### # Strings used within enigmailCommon.js and enigmailCommon.jsm ##################################################################### enigAlert=Alerta de Enigmail enigConfirm=Confirmación de Enigmail enigInfo=Información de Enigmail enigError=Error de Enigmail enigPrompt=Requerimiento de Enigmail dlgYes=&Sí dlgNo=&No dlgKeepSetting=Recordar mi respuesta y no volver a preguntarme dlgNoPrompt=No mostrarme de nuevo este cuadro de diálogo dlg.button.delete=&Borrar dlg.button.cancel=&Cancelar dlg.button.close=&Cerrar dlg.button.continue=Con&tinuar dlg.button.skip=&Omitir dlg.button.overwrite=&Sobrescribir dlg.button.view=&Ver dlg.button.retry=&Reintentar dlg.button.ignore=&Ignorar dlg.button.install=&Instalar dlg.button.ok=&Aceptar repeatPrefix=\n\nEsta alerta se repetirá %S repeatSuffixSingular=vez más. repeatSuffixPlural=veces más. noRepeat=\n\nEsta alerta no se repetirá hasta que actualice Enigmail. pgpNotSupported=Parece que está usando Enigmail junto con PGP 6.x\n\nDesafortunadamente, PGP 6.x tiene varios problemas que impiden que Enigmail funcione correctamente. Por ello, Enigmail ya no soporta PGP 6.x. Por favor, use GnuPG (GPG) en su lugar.\n\nSi necesita ayuda para cambiar a GnuPG, eche un vistazo a la sección Support (soporte) en la página web de Enigmail. initErr.howToFixIt=Para usar Enigmail es necesario GnuPG. Si no lo ha instalado todavía, la forma más fácil de hacerlo es usar el botón del "Asistente de configuración" de debajo. initErr.setupWizard.button=Asistente de &configuración passphraseCleared=Se ha eliminado la frase-contraseña. cannotClearPassphrase=Está usando una herramienta no-estándar (como gnome-keyring) para la gestión de frases-contraseña. Por tanto, no es posible desechar la frase-contraseña desde el interior de Enigmail. noPhotoAvailable=No hay foto disponible debugLog.title=Registro de depuración de Enigmail error.photoPathNotReadable=La ruta de la foto '%S' no es accesible generalError=Error: %S # Strings in configure.jsm enigmailCommon.versionSignificantlyChanged=Esta nueva versión de Enigmail presenta cambios significativos en el manejo de preferencias y opciones. Hemos tratado de transferir la configuración antigua a esta nueva versión. Sin embargo, no podemos cubrir todos los casos de forma automática. Por favor, vuelva a comprobar las nuevas preferencias y opciones resultantes. enigmailCommon.checkPreferences=Comprobar preferencias ... preferences.defaultToPgpMime=Hemos cambiado la codificación de mensajes predeterminada en Enigmail de Inline-PGP (como texto en el correo) a PGP/MIME (aparte). Recomendamos que mantenga esta última como predeterminada.\n\nSi todavía desea usar Inline-PGP por defecto, puede establecerlo así en Herramientas > Configuración de cuenta > Seguridad OpenPGP. ##################################################################### # Strings in enigmailAbout.js ##################################################################### usingVersion=Está ejecutando Enigmail versión %S enigmailPepVersion=Enigmail/p≡p versión %S usingAgent=Está usando el ejecutable de %1$S %2$S para cifrar y descifrar agentError=ERROR: ¡No se pudo acceder al servicio principal de Enigmail! ##################################################################### # Strings in enigmailKeygen.js ##################################################################### accessError=Error al acceder al servicio de Enigmail onlyGPG=¡La generación de clave sólo funciona con GnuPG (no con PGP)! keygenComplete=¡Se ha completado la generación de clave! Se usará la identidad <%S> para firmado. revokeCertRecommended=Recomendamos firmemente crear un certificado de revocación para su clave. Este certificado se puede usar para invalidar su clave, por ejemplo, si su clave privada/secreta se pierde o resulta comprometida. ¿Quiere crear ahora dicho certificado de revocación? keyMan.button.generateCert=&Generar certificado genCompleteNoSign=¡La clave ha sido generada! genGoing=¡Ya se está generando la clave! passNoMatch=Las frases-contraseña no coinciden, por favor, inténtelo de nuevo passCheckBox=Por favor, marque la casilla si no quiere especificar una contraseña para la clave passUserName=Por favor, indique un nombre de usuario para esta identidad keygen.missingUserName=No se ha especificado nombre para la cuenta/identidad seleccionada. Por favor, introduzca un valor en el campo 'Su nombre' en la configuración de la cuenta. keygen.passCharProblem=Está usando caracteres especiales en su frase-contraseña. Por desgracia, esto puede causar problemas en otras aplicaciones. Le recomendamos que escoja una contraseña que únicamente se componga de estos caracteres:\na-z A-Z 0-9 /.;:-,!?(){}[]%* passSpaceProblem=Debido a razones técnicas, su frase-contraseña no puede comenzar o acabar con un espacio. changePassFailed=No se pudo cambiar la contraseña. keyConfirm=¿Generar claves pública y privada para '%S'? keyMan.button.generateKey=&Generar clave keyAbort=¿Abortar la generación de clave? keyMan.button.generateKeyAbort=&Abortar la generación de clave keyMan.button.generateKeyContinue=&Continuar con la generación de clave expiryTooLong=No puede crear una clave que caduque tras más de 100 años. expiryTooLongShorter=No se puede crear una clave que caduque tras más de 90 años. expiryTooShort=Su clave debe ser válida al menos un día. keyGenFailed=La generación de clave ha fallado. Por favor, revise la consola de Enigmail (menú Enigmail > Depurar Enigmail) para ver los detalles. setKeyExpirationDateFailed=No se pudo cambiar la fecha de caducidad # Strings in enigmailMessengerOverlay.js securityInfo=Información de seguridad de Enigmail\n\n enigHeader=Enigmail: enigContentNote=Enigmail: *Los adjuntos de este mensaje no han sido firmados ni cifrados*\n\n possiblyPgpMime=Posiblemente es un mensaje cifrado o firmado PGP/MIME; pulse 'Descifrar/Verificar' para comprobarlo saveAttachmentHeader=Enigmail: Guardar adjunto descifrado noTempDir=No se pudo encontrar un directorio temporal en el que escribir\nPor favor, establezca la variable de entorno TEMP attachmentPgpKey=El adjunto '%S' que está abriendo parece ser un fichero de clave OpenPGP.\n\nPulse 'Importar' para importar las claves que contiene o 'Ver' para ver el contenido del fichero en una ventana del navegador. beginPgpPart=********* *PRINCIPIO DE LA PARTE CIFRADA o FIRMADA* ********* endPgpPart=********** *FIN DE LA PARTE CIFRADA o FIRMADA* ********** notePartEncrypted=Enigmail: *Partes del mensaje NO han sido firmadas o cifradas* noteCutMessage=Enigmail: *Se han encontrado múltiples bloques de mensaje -- se abortó el descifrado/verificación* decryptOkNoSig=Advertencia:\n\nSe ha descifrado correctamente, pero no se pudo verificar la firma. msgOvl.button.contAnyway=&Continuar de todos modos signature.verifiedOK=La firma del adjunto %S ha sido verificada correctamente signature.verifyFailed=La firma del adjunto %S no se pudo verificar attachment.noMatchToSignature=No se pudo encontrar un fichero de firma correspondiente al adjunto '%S' attachment.noMatchFromSignature=No se pudo encontrar un adjunto correspondiente al fichero de firma '%S' fixBrokenExchangeMsg.failed=No se logró reparar el mensaje. enigmail.msgViewColumn.label=Enigmail enigmailPep.msgViewColumn.label=Enigmail/p≡p wksNoIdentity=Esta clave no está vinculada con ninguna de sus cuentas de correo electrónico. Por favor, añada una cuenta para al menos una de las siguientes direcciones de correo electrónico:\n\n%S wksConfirmSuccess=Confirmación de correo enviado. wksConfirmFailure=No se pudo enviar el correo de confirmación. autocrypt.importSetupKey.accountPreconfigured=Su cuenta ya está configurada correctamente para Autocrypt.\n\n¿De verdad quiere sobrescribir su configuración con este mensaje de instalación? autocrypt.importSetupKey.selfCreated=Este mensaje fue creado por su instancia de Enigmail actualmente en ejecución.\n\nPor favor, cambie al cliente de correo al que quiere transferir la configuración, y pulse en el mensaje en ese cliente de correo para importar la configuración. autocrypt.importSetupKey.invalidMessage=Error - No se pudo leer el mensaje configuración. El mensaje parece estar corrupto. Por favor, intente crear un nuevo mensaje de configuración en su "otro" dispositivo. autocrypt.importSetupKey.invalidKey=Error - No se pudo importar la calve. O bien la clave no esta soportada por su versión de GnuPG o está corrupta. autocrypt.importSetupKey.wrongPasswd=La contraseña que introdujo es errónea. ¿Quiere volver a intentarlo? autocrypt.importSetupKey.success=El mensaje de configuración de Autocrypt fue procesado con éxito. Autocrypt ahora está disponible para su cuenta '%S'. ##################################################################### # Strings in enigmailMsgComposeOverlay.js ##################################################################### keysToExport=Seleccionar claves OpenPGP a insertar keysToUse=Seleccione la(s) clave(s) OpenPGP a usar para %S pubKey=Clave pública para %S\n windowLocked=La ventana Redactar está bloqueada; se ha cancelado el envío sendUnencrypted=No se pudo inicializar Enigmail.\n¿Enviar el mensaje sin cifrar? composeSpecifyEmail=Por favor, especifique su dirección de correo principal, que se usará al escoger la clave para firmar los mensajes salientes.\nSi la deja en blanco, se usará la dirección en el campo DE del mensaje para elegir la clave de firmado. sendingHiddenRcpt=Este mensaje tiene destinatarios BCC (copia oculta). Si se cifra este mensaje es posible ocultar los destinatarios BCC, pero los usuarios de algunos productos (ej. PGP Corp.) no podrán descifrar el mensaje. Por eso, recomendamos evitar correos con copia oculta para mensajes cifrados. sendWithHiddenBcc=Ocultar destinatarios BCC sendWithShownBcc=Cifrar de forma normal sendingNews=Se canceló la operación de envío cifrado.\n\nEste mensaje no se puede cifrar porque entre los destinatarios hay grupos de noticias. Por favor, vuelva a enviar el mensaje sin cifrado. sendToNewsWarning=Advertencia: Está a punto de enviar un mensaje cifrado a un grupo de news.\n\nEsto es desaconsejable porque únicamente tiene sentido si todos los miembros del grupo pueden descifrar el mensaje, es decir, si el mensaje ha de ser cifrado con las claves de todos los participantes en el grupo. Por favor, envíe este mensaje sólo si sabe exactamente lo que está haciendo.\n\n¿Continuar? hasHTML=Advertencia de correo HTML:\nEste mensaje puede contener HTML, lo que podría causar que falle el proceso de firmado/cifrado. Para evitar esto en el futuro, impida el uso de HTML pulsando la tecla MAYÚSCULAS mientras pulsa el botón de Redactar o Responder para enviar correo firmado.\nSi firma el correo de forma predeterminada, debe desmarcar la opción 'Redactar mensajes en formato HTML', en la configuración de cuentas, para deshabilitar permanentemente el correo HTML para esa cuenta de correo strippingHTML=El mensaje contiene información de formato HTML que se perderá al convertirlo a texto simple para su firmado/cifrado. ¿Desea continuar? msgCompose.button.sendAnyway=&Enviar el mensaje de todos modos attachWarning=Los adjuntos de este mensaje no son locales, por lo que no se pueden cifrar. Para cifrar estos adjuntos, antes debería guardarlos como ficheros locales y adjuntarlos. ¿Desea enviar el mensaje sin cifrar de todos modos? quotedPrintableWarn=Ha habilitado la codificación 'quoted-printable' (de caracteres imprimibles) para enviar mensajes. Esto puede resultar en un descifrado y/o verificación incorrectos de su mensaje.\n¿Desea desactivar ahora el envío de mensajes 'quoted-printable'? minimalLineWrapping=Ha establecido el ajuste de línea a %S caracteres. Para un cifrado y/o firmado correctos, este valor ha ser de al menos 68.\n¿Desea cambiar ahora el ajuste de línea a 68 caracteres? warning=Advertencia signIconClicked=Ha modificado manualmente el firmado. Por lo tanto, mientras esté redactando este mensaje activar/desactivar el firmado ya no dependerá de activar/desactivar el cifrado. errorOwnKeyUnusable=El identificador de clave '%S' configurado para la identidad actual no ha ofrecido una clave OpenPGP operativa.\n\nPor favor, asegúrese de que tiene una clave OpenPGP válida, no caducada, y de que la configuración de su cuenta apunta hacia esa clave.\nSi su clave no está caducada, compruebe entonces si ha establecido la confianza en el propietario a 'completa' o 'absoluta'. msgCompose.cannotSaveDraft=Error al guardar borrador msgCompose.partiallyEncrypted.short=Tenga cuidado de no filtrar información sensible - correo parcialmente cifrado. msgCompose.partiallyEncrypted.mimeMsg=El mensaje al que está respondiendo contenía partes tanto no cifradas como cifradas. Algunas partes cifradas del mensaje son invisibles para usted.\n\nSi el remitente no pudo descifrar originalmente las partes ocultas del mensaje, al descifrarlo usted puede estar filtrando información confidencial que el remitente no pudo descifrar originalmente por si mismo.\n\nRecomendamos que no responda al mensaje, pero cree un nuevo mensaje que contenga su respuesta. msgCompose.partiallyEncrypted.inlinePGP=El mensaje al que está respondiendo contenía partes tanto no cifradas como cifradas. Si el remitente no pudo descifrar originalmente algunas partes del mensaje, al descifrarlo usted puede estar filtrando información confidencial que el remitente no pudo descifrar originalmente por si mismo.\n\nPor favor, considere eliminar todo el texto entrecomillado de su respuesta a este remitente. msgCompose.internalEncryptionError=Error interno: Se deshabilitó el cifrado prometido msgCompose.internalError=Ha ocurrido un error interno. msgCompose.toolbarTxt.signAndEncrypt=Este mensaje se firmará y cifrará msgCompose.toolbarTxt.signOnly=Este mensaje se firmará msgCompose.toolbarTxt.encryptOnly=Este mensaje se cifrará msgCompose.toolbarTxt.noEncryption=Este mensaje no se firmará ni cifrará msgCompose.toolbarTxt.disabled=Enigmail está deshabilitado para la identidad seleccionada msgCompose.protectSubject.tooltip=Proteger el asunto del mensaje msgCompose.noSubjectProtection.tooltip=No proteger el asunto del mensaje msgCompose.encryptedSubjectStub=Mensaje cifrado msgCompose.protectSubject.dialogTitle=¿Habilitar la protección del asunto? msgCompose.protectSubject.question=Los correos cifrados ordinarios contienen el asunto sin redactar\nHemos establecido un estándar para ocultar el asunto original en el mensaje cifrado,\ny reemplazarlo con un texto de sustitución de forma que el asunto sólo es visible después de que el correo sea descifrado.\n\n¿Queire proteger el asunto en los mensajes cifrados? msgCompose.protectSubject.yesButton=&Proteger asunto msgCompose.protectSubject.noButton=&Permitir asunto no protegido msgCompose.detailsButton.label=Detalles ... msgCompose.detailsButton.accessKey=D msgCompose.pepSendUnknown=Desconocido msgCompose.pepSendUnsecure=Inseguro msgCompose.pepSendSecure=Seguro msgCompose.pepSendTrusted=Seguro y de confianza pep.alert.disabledForIdentity=p≡p está deshabilitado para la identidad actual. Por favor, habilite p≡p mediante las preferencias de Enigmail/p≡p. pep.alert.weakReply=Está a punto de reenviar o responder a un mensaje seguro de forma insegura. Si elige continuar se podría filtrar información confidencial, lo que le pondría en riesgo a usted y a la contraparte de su comunicación. ¿Está seguro de que quiere continuar? # note: should end with double newline: sendAborted=Se abortó la operación de envío.\n\n # details: keyNotTrusted=Confianza insuficiente para la clave '%S' keyNotFound=No se encontró la clave '%S' keyRevoked=La clave '%S' fue revocada keyExpired=La clave '%S' ha caducado statPGPMIME=PGP/MIME statSMIME=S/MIME statSigned=FIRMADO statEncrypted=CIFRADO statPlain=NO CIFRADO y NO FIRMADO offlineSave=¿Guardar el mensaje de %1$S para %2$S en la carpeta de mensajes no enviados? onlineSend=¿Enviar el mensaje %1$S a %2$S? encryptKeysNote=Nota: El mensaje se cifra para las siguientes identificaciones-de-usuario / claves: %S hiddenKey= signFailed=Error en Enigmail; No se pudo completar el cifrado/firmado; ¿Enviar el mensaje sin cifrar? msgCompose.button.sendUnencrypted=&Enviar mensaje sin cifrar recipientsSelectionHdr=Seleccionar destinatarios para cifrado configureNow=Aún no ha configurado la seguridad de Enigmail para la identidad seleccionada. ¿Desea hacerlo ahora? # encryption/signing status and associated reasons: encryptMessageAuto=Cifrar mensaje (auto) encryptMessageNorm=Cifrar mensaje signMessageAuto=Firmar mensaje (auto) signMessageNorm=Firmar mensaje encryptOff=Cifrado: DESACTIVADO encryptOnWithReason=Cifrado: ACTIVO (%S) encryptOffWithReason=Cifrado: DESACTIVADO (%S) encryptOn=Cifrado: Activado signOn=Firmado: Activado signOff=Firmado: Desactivado signOnWithReason=Firmado: Activado (%S) signOffWithReason=Firmado: DESACTIVADO (%S) reasonEnabledByDefault=habilitado por defecto reasonManuallyForced=forzado manualmente reasonByRecipientRules=forzado vía reglas por-destinatario reasonByAutoEncryption=fozado por auto-cifrado reasonByConflict=debido a un conflicto entre reglas por destinatario reasonByEncryptionMode=debido al modo de cifrado # should not be used anymore: encryptYes=El mensaje se cifrará encryptNo=El mensaje no se cifrará # should not be used anymore: signYes=El mensaje se firmará signNo=El mensaje no se firmará # PGP/MIME status: pgpmimeNormal=Protocolo: PGP/ MIME inlinePGPNormal=Protocolo: Inline PGP smimeNormal=Protocolo: S/MIME pgpmimeAuto=Protocolo: PGP/MIME (auto) inlinePGPAuto=Protocolo: Inline PGP (auto) smimeAuto=Protocolo: S/MIME (auto) # should not be used anymore pgpmimeYes=Se usará PGP/MIME pgpmimeNo=Se usará Inline PGP # Attach own key status (tooltip strings): attachOwnKeyNo=No se adjuntará su propia clave attachOwnKeyYes=Se adjuntará su propia clave attachOwnKeyDisabled=No se puede adjuntar su propia clave. Tiene que seleccionar una clave\nespecífica en Herramientas > Configuración de cuenta > Seguridad OpenPGP, para habilitar esta característica. rulesConflict=Se han detectado reglas por-destinatario en conflicto\n%S\n\n¿Enviar el mensaje con esta configuración? msgCompose.button.configure=&Configurar msgCompose.button.send=&Enviar mensaje msgCompose.button.save=&Guardar mensaje # Strings in enigmailMsgHdrViewOverlay.js keyNeeded=Se necesita la clave pública %S para verificar la firma keyUsed=La clave pública %S se usó para verificar la firma clickDecrypt=; pulse 'Descifrar/Verificar' clickDecryptRetry=; pulse 'Descifrar/Verificar' para intentarlo de nuevo clickDetailsButton=; pulse el botón 'Detalles' para más información clickImportButton=; pulse el botón 'Importar clave' para importar la clave keyTypeUnsupported=; el tipo de clave no está soportado por su versión de GnuPG msgPart=Parte del mensaje %S msgSigned=firmado msgSignedUnkownKey=firmado con una clave desconocida msgEncrypted=cifrado msgSignedAndEnc=firmado y cifrado unverifiedSig=Firma sin verificar incompleteDecrypt=Descifrado incompleto needKey=Error - No se encontró la clave privada/secreta correspondiente para descifrar el mensaje failedDecrypt=Error - Fallo al descifrar badPhrase=Error - Contraseña incorrecta failedDecryptVerify=Error - Fallo al descifrar/verificar mdcError=Error - la intgridad del mensaje no está protegida viewInfo=; Ver > Información de seguridad del mensaje, para los detalles decryptedMsg=Mensaje descifrado decryptedMsgWithFormatError=Mensaje descifrado (se ha restaurado el formato de correo PGP que se estropeó probablemente a causa de un servidor Exchange antiguo, de modo que el resultado puede no haber quedado perfecto para lectura) usedAlgorithms=Algoritmos usados: %1$S y %2$S pepStatusInfo.text=Estado del mensaje p≡p. pepStatusInfo.title.m3=Bajo ataque pepStatusInfo.info.m3=Este mensaje no es seguro y ha sido alterado. pepStatusInfo.title.m1=Sin confianza pepStatusInfo.info.m1=El interlocutor de este mensaje en la comunicación previamente ha sido marcado como 'sin confianza'. pepStatusInfo.title.r0=Desconocido pepStatusInfo.info.r0=Este mensaje no contiene suficiente información para determinar si es seguro. pepStatusInfo.title.r1=No se puede descifrar pepStatusInfo.info.r1=Este mensaje no se puede descifrar porque la clave no está disponible. pepStatusInfo.title.r2=No se puede descifrar pepStatusInfo.info.r2=Este mensaje no se puede descifrar porque la clave no está disponible. pepStatusInfo.title.r3=Inseguro pepStatusInfo.info.r3=Este mensaje no es seguro. pepStatusInfo.title.r4=Inseguro para algunos pepStatusInfo.info.r4=Este mensaje no es seguro para algunos partícipes de la comunicación. pepStatusInfo.title.r5=Seguridad no fiable pepStatusInfo.info.r5=Este mensaje tiene una protección no fiable. pepStatusInfo.title.r6=Seguro... pepStatusInfo.info.r6=Este mensaje es seguro, pero todavía necesita verificar la identidad del interlocutor de su comunicación. pepStatusInfo.title.r7=Seguro y de confianza pepStatusInfo.info.r7=Este mensaje es seguro y de confianza. pepStatusInfo.color.green=Verde pepStatusInfo.color.yellow=Amarillo pepStatusInfo.color.red=Rojo pepRevokeTrust.question=¿De verdad quiere revocar la confianza para %S? pepRevokeMistrust.question=¿De verdad quiere volver a confiar en la clave para %S? pepRevokeTrust.doRevoke=Revocar &confianza wksConfirmationReq=Petición de confirmación del directorio Webkey wksConfirmationReq.message=Este mensaje ha sido enviado por su proveedor de correo electrónico para confirmar el despliegue de su clave pública\nde OpenPGP en su directorio web de claves (Webkey).\nProporcionar su clave pública ayuda a otros a hallar su clave y por tanto poder cifrar mensajes destinados a usted.\n\nSi quiere desplegar ahora su clave en el directorio web de claves, por favor, pulse el botón "Confirmar petición" en la barra de estado.\nDe otro modo, simplemente ignore este mensaje. wksConfirmationReq.button.label=Confirmar petición autocryptSetupReq=Realizar configuración de Autocrypt autocryptSetupReq.button.label=Iniciar configuración autocryptSetupReq.setupMsg.desc=Este mensaje contiene toda la información para transferir de forma segura su configuración de Autocrypt junto con su clave secreta/privada desde su dispositivo original. autocryptSetupReq.setupMsg.backup=Puede conservar este mensaje y usarlo como una copia de seguridad para su clave secreta/privada. Si quiere hacer esto, debe anotar la contraseña y guardarla de forma segura. autocryptSetupReq.message.import=Para importar la configuración y clave(s) en Enigmail, por favor, pulse el botón "Iniciar configuración" en la barra de estado. autocryptSetupReq.message.sent=Por favor, pulse sobre el mensaje en su nuevo dispositivo y siga las instrucciones para importar la configuración. # strings in pref-enigmail.js oldGpgVersion20=No se pudo inicializar Enigmail.\n\nEstá usando GnuPG versión %1$S, que ya no está soportada. Enigmail requiere GnuPG versión %2$S o superior. Por favor, actualice su instalación de GnuPG, o Enigmail no funcionará. locateGpg=Ubicar programa GnuPG invalidGpgPath=No se puede ejecutar GnuPG con la ruta proporcionada. Por tanto, Enigmail se desactivará hasta que cambie de nuevo la ruta a GnuPG o reinicie la aplicación. warningsAreReset=Todas las advertencias han sido revertidas. prefs.gpgFound=Se encontró GnuPG en %S prefs.gpgNotFound=No se pudo encontrar GnuPG prefs.warnAskNever=Advertencia: Activar esta opción tendrá como resultado que se dejarán sin cifrar sin aviso alguno los correos en los que no haya clave para alguno de los destinatarios -- ¡Enigmail no le informará si sucede esto! prefs.warnIdleTimeForUnknownAgent=No se pudo conectar con gpg-agent. Quizá su sistema usa una herramienta especializada para la gestión de contraseñas (como gnome-keyring, seahorse-agent, KDE wallet manager...). Desafortunadamente Enigmail no puede controlar el tiempo de espera de contraseña para la herramienta que esté usando. Por tanto, no se hará caso de la respectiva configuración de tiempo de espera en Enigmail. prefEnigmail.oneKeyserverOnly=Error - Sólo puede especificar un servidor de claves para la descarga automática de claves OpenPGP ausentes. # Strings used in core.jsm # (said file also re-uses some strings from above) enterAdminPin=Por favor, escriba el PIN de ADMIN de su tarjeta inteligente enterCardPin=Por favor, escriba el PIN de su tarjeta inteligente notInit=Error - El servicio de Enigmail aún no se ha inicializado badCommand=Error - Fallo del comando de cifrado cmdLine=línea de comandos y salida: notRequired=Error - No se requiere cifrado notComplete=Error - La generación de clave aún no se ha completado invalidEmail=Error - Dirección(es) de correo electrónico no válida(s) noPassphrase=Error - No se proporcionó frase-contraseña noPGPblock=Error - No se encontró un bloque de datos OpenPGP armado (cifrado como texto) válido unverifiedReply=La parte sangrada del mensaje (la respuesta) probablemente fue modificada keyInMessageBody=Se encontró una clave en el cuerpo del mensaje. Pulse en 'Importar clave' para importar la clave sigMismatch=Error - La firma no coincide cantImport=Error al importar la clave pública\n\n doImportOne=¿Importar %1$S (%2$S)? doImportMultiple=¿Importar las siguientes claves?\n\n%S previewFailed=No se pudo leer el fichero de clave pública. # Strings used in errorHandling.jsm sc.wrongCardAvailable=La tarjeta inteligente %1$S encontrada en su lector no se puede usar para procesar el mensaje.\nPor favor, inserte su tarjeta inteligente (SmartCard) %2$S y repita la operación. sc.insertCard=La operación requiere su tarjeta inteligente %S.\nPor favor, inserte la tarjeta requerida y repita la operación. sc.removeCard=La operación requiere que no haya tarjetas inteligentes en el lector.\nPor favor, retire su tarjeta y repita la operación. sc.noCardAvailable=No se pudo encontrar una tarjeta inteligente (SmartCard) en su lector.\nPor favor, inserte su tarjeta y repita la operación. sc.noReaderAvailable=No se pudo acceder a su lector de tarjetas inteligentes.\nPor favor, conecte su lector, inserte su tarjeta inteligente y repita la operación. keyError.keySpecNotFound=La dirección de correo electrónico "%S" no corresponde a ninguna clave de su juego de claves. keyError.keyIdNotFound=El identificador de clave "%S" configurado no se pudo encontrar en su juego de claves. keyError.resolutionAction=Por favor, seleccione una clave válida en Herramientas > Configuración de cuenta > Seguridad OpenPGP missingPassphrase=Frase-contraseña ausente errorHandling.gpgAgentInvalid=Su sistema está ejecutando una versión de gpg-agent que no es adecuada para su versión de GnuPG. errorHandling.gpgAgentError=GnuPG informó de un error en la comunicación con gpg-agent (un componente de GnuPG). errorHandling.dirmngrError=GnuPG informó de un error en la comunicación con dirmngr (un componente de GnuPG). errorHandling.pinentryError=GnuPG no puede consultar su contraseña mediante el programa pinentry. errorHandling.readFaq=Este es un error de instalación o configuración del sistema que evita que Enigmail funcione adecuadamente, y no se puede reparar automáticamente.\n\nLe recomendamos firmemente que consulte nuestro sitio web de soporte en https://enigmail.net/faq. gpgNotFound=No se pudo encontrar el programa '%S' de GnuPG.\nAsegúrese de haber establecido correctamente la ruta al ejecutable de GnuPG en las preferencias de Enigmail. gpgNotInPath=No se pudo encontrar el ejecutable de GnuPG en la ruta (PATH).\nAsegúrese de haber establecido correctamente la ruta al ejecutable de GnuPG en las preferencias de Enigmail. enigmailNotAvailable=Servicio principal de Enigmail no disponible prefGood=La firma de %S es correcta prefBad=La firma de %S es INCORRECTA failCancel=Error - Recepción de clave cancelada por el usuario failNoServer=Error - No se especificó servidor de claves del que recibir la clave failNoID=Error - No se especificó identificador de clave para el que recibir la clave failKeyExtract=Error - Fallo del comando de extracción de clave notFirstBlock=Error - El primer bloque de OpenPGP no es un bloque de clave pública importKeyConfirm=¿Importar la(s) clave(s) pública(s) incluida(s) en el mensaje? failKeyImport=Error - Fallo al importar clave fileWriteFailed=No se pudo escribir en el fichero %S importKey=Importar clave pública %S desde el servidor de claves: uploadKey=Enviar clave pública %S al servidor de claves: keyId=Identificador de clave keyAndSigDate=Identificador de clave: 0x%1$S / Firmada el: %2$S keyFpr=Huella de validación: %S noEmailProvided=¡No ha proporcionado una dirección de correo electrónico! keyAlreadySigned=La clave ya está firmada, no la puede firmar dos veces. ##################################################################### # Strings used in enigmailKeySelection.js ##################################################################### selKeyExpired=caducó el %S createdHeader=Creada atLeastOneKey=¡No se seleccionó clave alguna! Tiene que seleccionar al menos una clave para aceptar fewerKeysThanRecipients=Ha seleccionado un número menor de claves que de destinatarios. ¿Seguro que está completa la lista de claves para cifrado? userSel.button.goBack=Seleccionar más claves userSel.secretKeySel.title=Seleccione una clave privada/secreta OpenPGP para firmar sus mensajes userSel.problemNoKey=Ninguna clave válida userSel.problemMultipleKeys=Múltiples claves # should be same as thunderbird ENTITY sendLaterCmd.label: sendLaterCmd.label=Enviar más tarde # Strings used in enigmailAttachmentDialog.js pgpMimeNote=NOTA: PGP/MIME (mensaje cifrado como adjunto) no está soportado por todos los clientes de correo. Si no está seguro, seleccione la opción %S. first=primero second=segundo # Strings used in am-enigprefs.js / enigmailEditIdentity.js encryptKeyHeader=Seleccionar clave OpenPGP para cifrado identityName=Identidad: %S switchPepMode=Actualmente está usando el modo 'p≡p Junior' de Enigmail.\n\nAl habilitar el cifrado OpenPGP o el S/MIME para una cuenta, está deshabilitando p≡p y usando el modo 'regular' de Enigmail sin p≡p. enableEnigmail=&Deshabilitar p≡p # Strings used in enigmailSingleRcptSettings.js noEncryption=Ha activado el cifrado, pero no ha seleccionado una clave. Para cifrar correos enviados a %1$S, tiene que especificar una o varias claves válidas de su lista de claves. ¿Quiere deshabilitar el cifrado para %2$S? noKeyToUse=(ninguna - sin cifrado) noEmptyRule=¡La regla no puede estar vacía! Por favor, establezca una dirección de correo electrónico en el campo Regla. invalidAddress=La(s) dirección(es) de correo que introdujo carecen de formato válido. No debe añadir los nombres de los destinatarios, sólo las direcciones de correo electrónico. Ej.:\nNo válido: Algún Nombre \nVálido: algun.nombre@direccion.net noCurlyBrackets=Las llaves {} tienen un significado especial y no deben usarse en una dirección de correo electrónico. Si quiere modificar el modo en que funciona esta regla, use la opción 'Aplicar regla si el destinatario...'. Hay más información disponible desde el menú Ayuda. # Strings used in enigmailRulesEditor.js never=Nunca always=Siempre possible=Posible deleteRule=¿Seguro que quiere borrar la regla seleccionada? nextRcpt=(Siguiente destinatario) negateRule=No addKeyToRule=Añadir clave %1$S (%2$S) a regla por-destinatario # Strings used in enigmailSearchKey.js needOnline=La función seleccionada no está disponible en modo sin conexión. Por favor, conéctese y vuelva a intentarlo. protocolNotSupported=El protocolo '%S://' que ha seleccionado no está soportado para descargar claves OpenPGP. gpgkeysDisabled=Podría ser útil activar la opción 'extensions.enigmail.useGpgKeysTool'. noKeyserverConn=No se pudo conectar con el servidor de claves en %S. keyDownloadFailed=Fallo al descargar la clave del servidor de claves. El mensaje de estado es:\n%S internalError=Ha ocurrido un error interno. No se pudieron descargar o importar las claves. noKeyFound=Lo sentimos, no se pudo encontrar ninguna clave coincidente con el criterio de búsqueda especificado. keyDownload.keyUnavailable=Lo sentimos, pero la clave con identificación %S no está disponible en el servidor de claves. Lo más probable es que el propietario de la clave no la subiera al servidor de claves.\n\nPor favor, pida al remitente del mensaje que le envíe su clave por correo. # gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. gpgKeysFailed=Fallo al buscar o descargar la clave del servidor de claves: No se pudo ejecutar gpgkeys_%S. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=No se pudo establecer la confianza en el propietario # Strings in enigmailSignKeyDlg.js signKeyFailed=No se pudo firmar la clave alreadySigned.label=Nota: La clave %S ya está firmada con la clave secreta (privada) seleccionada. alreadySignedexportable.label=Nota: La clave %S ya está firmada como exportable con la clave secreta (privada) seleccionada. Una firma local no tiene sentido. partlySigned.label=Nota: Algunas identificaciones de usuario de la clave %S ya están firmadas con la clave privada/secreta seleccionada. noTrustedOwnKeys=¡No se encontró una clave cualificada para firmado! Necesita al menos una clave secreta (privada) con confianza 'completa' para firmar claves. # Strings in enigmailKeyManager.js keyMan.loadingKeys=Cargando claves. Por favor, espere ... keyValid.unknown=desconocida keyValid.invalid=no válida keyValid.disabled=deshabilitada keyValid.revoked=revocada keyValid.expired=caducada keyValid.noSubkey=subclave no válida keyTrust.untrusted=nula keyTrust.marginal=marginal keyTrust.full=completa keyTrust.ultimate=absoluta keyTrust.group=(grupo) keyType.public=púb keyType.publicAndSec=púb/sec keyMan.enableKey=Habilitar clave keyMan.disableKey=Deshabilitar clave userAtt.photo=Atributo del usuario (imagen JPEG) asciiArmorFile=Ficheros con blindaje ASCII (*.asc) importKeyFile=Importar fichero de clave OpenPGP gnupgFile=Ficheros de GnuPG createKeyOK=Se ha generado su clave saveRevokeCertAs=Crear y guardar certificado de revocación revokeCertOK=El certificado de revocación se ha creado con éxito. Puede usarlo para invalidad su clave pública, por ejemplo, en caso de que perdiera su clave secreta/privada. revokeCertFailed=No se pudo crear el certificado de revocación. addUidOK=La identificación de usuario se añadió correctamente addUidFailed=Fallo al añadir la identificación de usuario noKeySelected=Tiene que seleccionar al menos una clave para realizar la operación elegida exportToFile=Exportar clave pública a fichero exportKeypairToFile=Exportar clave secreta y pública a archivo exportSecretKey=¿Quiere incluir la clave secreta (privada) en el fichero de clave OpenPGP guardado? saveKeysOK=Las claves se guardaron correctamente saveKeysFailed=No se pudieron guardar las claves importKeysFailed=No se pudieron importar las claves enableKeyFailed=No se pudo habilitar/deshabilitar las claves specificPubKeyFilename=%1$S (0x%2$S) púb specificPubSecKeyFilename=%1$S (0x%2$S) pública-secreta defaultPubKeyFilename=Claves-públicas-exportadas defaultPubSecKeyFilename=Claves-públicas-y-secretas-exportadas noSecretKeys=No se encontraron claves secretas (privadas).\n\n¿Desea generar ahora su propia clave? sendKeysOk=La(s) clave(s) se enviaron correctamente sendKeysFailed=No se pudieron enviar la(s) clave(s) receiveKeysOk=La(s) clave(s) se actualizaron correctamente receiveKeysFailed=No se pudieron descargar la(s) clave(s) importFromClip=¿Desea importar alguna(s) clave(s) desde el portapapeles? importFromUrl=Descargar clave pública desde esta URL: copyToClipbrdFailed=No se pudo copiar la(s) clave(s) seleccionada(s) al portapapeles. copyToClipbrdOK=La(s) clave(s) se copiaron al portapapeles deleteSecretKey=ADVERTENCIA: ¡Está a punto de borrar una clave secreta (privada)!\nSi borra su clave secreta, en adelante no podrá descifrar los mensajes cifrados para esa clave, y tampoco podrá ya revocarla.\n\n¿Seguro que desea borrar el PAR claves secreta y pública\n'%S'? deleteMix=ADVERTENCIA: ¡Está a punto de borrar claves privadas/secretas!\nSi borra su clave privada, ya no podrá descifrar los mensajes cifrados para esa clave, y tampoco podrá ya revocarla.\n\n¿Seguro que desea borrar los PARES de claves privada y pública seleccionados? deletePubKey=¿Desea borrar la clave pública\n'%S'? deleteSelectedPubKey=¿Desea borrar las claves públicas? deleteKeyFailed=No se pudo borrar la clave. revokeKeyQuestion=Está a punto de revocar la clave (par) '%S'.\n\nNo podrá volver a firmar con esta clave (privada), y cuando el certificado de revocación se distribuya, los demás tampoco podrán cifrar con esta clave (pública). Aún podrá usar la clave (privada) para descifrar mensajes antiguos.\n\n¿Quiere continuar? revokeKeyOk=La clave ha sido revocada. Si su clave está disponible en un servidor de claves, se recomienda subirla de nuevo para que otros puedan ver la revocación. revokeKeyFailed=No se pudo revocar la clave. revokeKeyNotPresent=¡No tiene ninguna clave (0x%S) que corresponda a este certificado de revocación!\n\n¡Si ha perdido su clave, debe importarla (p.e. desde un servidor de claves) antes que el certificado de revocación! revokeKeyAlreadyRevoked=La clave 0x%S ya ha sido revocada. refreshAllQuestion=No ha seleccionado clave alguna. ¿Desea refrescar TODAS las claves? refreshKeyServiceOn.warn=Advertencia: Actualmente sus claves se están refrescando en segundo con la mayor seguridad posible.\nRefrescar todas sus claves de una vez revelerá innecesariamente información sobre usted.\n¿De verdad quiere hacer esto? refreshKey.warn=Advertencia: Dependiendo del número de claves y la velocidad de la conexión, ¡refrescar todas las claves puede ser un proceso bastante largo! downloadContactsKeys.warn=Advertencia: Dependiendo del número de contactos y la velocidad de la conexión, ¡descargar todas las claves puede ser un proceso bastante largo! downloadContactsKeys.importFrom=¿Importar contactos de la libreta de direcciones '%S'? keyMan.button.exportSecKey=&Exportar claves secretas keyMan.button.exportPubKey=Exportar sólo claves &públicas keyMan.button.import=&Importar keyMan.button.refreshAll=&Refrescar todas las claves keyMan.button.revokeKey=&Revocar clave keyMan.button.skip=&Omitir clave keylist.noOtherUids=No tiene otras identidades keylist.hasOtherUids=También se le conoce por keylist.noPhotos=No dispone de fotografía keylist.hasPhotos=Fotografías keyMan.addphoto.filepicker.title=Seleccione una foto a añadir keyMan.addphoto.warnLargeFile=El fichero que ha seleccionado supera los 25 KB.\nNo se recomienda añadir ficheros muy grandes porque esto causa que las claves queden muy grandes. keyMan.addphoto.noJpegFile=El fichero seleccionado no parece ser un fichero JPEG. Por favor, seleccione un fichero diferente. keyMan.addphoto.failed=No se pudo añadir la foto. noWksIdentity=La clave %S no tiene una identidad WKS (servicio Webkey). keyman.addBlacklistKey.msg=¿De verdad quiere que p≡p deje de usar la clave "%1$S (%2$S)" para cifrar mensajes? keyman.removeBlacklistKey.msg=¿Quiere permitir que p≡p use la clave "%1$S (%2$S)" para futuros mensajes? keyman.addBlacklistKey.button=&Añadir clave a la lista negra keyman.removeBlacklistKey.button=&Eliminar clave de la lista negra # Strings in enigmailManageUidDlg.xul changePrimUidFailed=No se pudo cambiar la identificación principal del usuario changePrimUidOK=La identificación principal de usuario se cambió correctamente revokeUidFailed=No se pudo revocar la identificación de usuario %S revokeUidOK=La identificación de usuario %S se revocó correctamente. Si su clave está disponible en un servidor de claves, se recomienda subirla de nuevo para que otros puedan ver la revocación. revokeUidQuestion=¿Seguro que quiere revocar la identificación de usuario %S? # Strings in enigmailKeyImportInfo.xul importInfoTitle=¡COMPLETADO! Se importaron las claves importInfoBits=Bits importInfoCreated=Creada importInfoFpr=Huella de validación importInfoDetails=(Detalles) importInfoNoKeys=No se importaron claves. # Strings in enigmailKeyDetailsDlg.xul keyTypePublic=clave pública keyTypePrimary=clave principal keyTypeSubkey=subclave keyTypePair=par de claves keyExpiryNever=nunca keyAlgorithm_1=RSA keyAlgorithm_2=RSA keyAlgorithm_3=RSA keyAlgorithm_16=ELG keyAlgorithm_17=DSA keyAlgorithm_18=ECDH keyAlgorithm_19=ECDSA keyAlgorithm_20=ELG keyAlgorithm_22=EdDSA keyUsageEncrypt=Cifrar keyUsageSign=Firmar keyUsageCertify=Certificar keyUsageAuthentication=Autentificación keyDoesNotExpire=La clave no caduca # Strings in enigmailGenCardKey.xul keygen.started=Por favor, espere mientras se genera la clave .... keygen.completed=Se ha generado la clave. El identificador de la nueva clave es: 0x%S keygen.keyBackup=Se ha hecho una copia de seguridad de la clave como %S keygen.passRequired=Por favor, especifique una frase-contraseña si quiere crear una copia de seguridad de su clave fuera de su tarjeta inteligente (SmartCard). # Strings in enigmailSetCardPin.xul cardPin.processFailed=No se pudo cambiar el PIN # Strings in enigRetrieveProgres.xul keyserverProgress.refreshing=Refrescando claves. Por favor, espere ... keyserverProgress.uploading=Subiendo claves, por favor espere ... keyserverProgress.wksUploadFailed=No se pudo subir su clave al servicio de directorio web de claves (Webkey) keyserverProgress.wksUploadCompleted=Su clave pública fue enviada con éxito a su proveedor. Recibirá un correo para que confirme que fue usted quien inició la subida. keyserverTitle.refreshing=Refrescar claves keyserverTitle.uploading=Subir claves # Strings in enigmailSetupWizard passphrase.min8keys=¡Su frase-contraseña debe contener al menos 8 caracteres! setupWizard.reallyCancel=¿De verdad quiere cancelar el asistente de configuración de Enigmail? setupWizard.invalidGpg=El fichero que ha especificado no es un ejecutable de GnuPG. Por favor, elija un fichero diferente. setupWizard.specifyFile=Tiene que especificar al menos un fichero de clave pública para continuar. setupWizard.installFailed=Parece que la instalación no se ha completado. Intente instalarlo de nuevo o instale GnuPG de forma manual usando el botón Examinar para seleccionarlo. setupWizard.downloadForbidden=Por su propia seguridad, no descargaremos GnuPG. Por favor, visite https://gnupg.org/ para descargarlo. setupWizard.downloadImpossible=No podemos descagar GnuPG en este momento. Por favor, inténtelo más tarde o visite https://gnupg.org/ para descargar GnuPG. setupWizard.hashSumError=El asistente no ha podido verificar la integridad del archivo descargado. El archivo puede estar dañado o manipulado. ¿Quiere continuar la instalación de todos modos? setupWizard.importSettingsFile=Especificar fichero de copia seguridad desde el que cagar setupWizard.invalidSettingsFile=El fichero especificado no es un fichero correcto de copia de seguridad de configuración de Enigmail. setupWizard.gpgConfExists=El fichero de configuración de GnuPG ya existe. ¿Quiere sobrescribirlo con el de su antigua instalación? setupWizard.noGpgHomeDir=Parece que ha configurado %S para su uso por GnuPG. Sin embargo, esto no es un directorio - no puede usarlo. setupWizard.unmachtedIds=No se pudieron encontrar en su antigua instalación las identidades correspondientes a:\n%S\nLas configuraciones para estas identidades fueron omitidas. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=Se produjo un error al intentar descargar GnuPG. Por favor, revise el registro de la consola para más detalles. installGnuPG.installFailed=Se ha producido un error al instalar GnuPG. Compruebe el registro de la consola para más detalles. # Strings in enigmailAddUidDlg.xul addUidDlg.nameOrEmailError=Tiene que introducir un nombre y una dirección de correo electrónico addUidDlg.nameMinLengthError=El nombre debe tener al menos 5 caracteres addUidDlg.invalidEmailError=Debe especificar una dirección de correo electrónico válida # Strings in enigmailCardDetails.js Carddetails.NoASCII=Las tarjetas inteligentes de OpenGPG sólo permiten caracteres ASCII en el Nombre. # network error types errorType.SecurityCertificate=El certificado de seguridad presentado por el servicio web no es válido. errorType.SecurityProtocol=El protocolo de seguridad usado por el servicio web es desconocido. errorType.Network=Se ha producido un error de red. # filter stuff filter.folderRequired=Debe seleccionar una carpeta de destino. filter.decryptMove.label=Descifrar permanentemente (Enigmail) filter.decryptCopy.label=Crear copia descifrada (Enigmail) filter.decryptMove.warnExperimental=Advertencia - La acción de filtro 'Descifrar permanentemente' puede llevar a la destrucción de mensajes.\n\nLe recomendamos firmemente que ensaye primero con el filtro 'Crear copia descifrada', pruebe el resultado con cuidado, y no comience a usar el filtro permanente hasta que esté satisfecho con el resultado. filter.tempPepFilterDesc=Filtro temporal para almacenar el mensaje enviado sin cifrar filter.term.pgpencrypted.label=OpenPGP cifrado filter.encrypt.label=Cifrar para clave (Enigmail) filter.keyRequired=Tiene que seleccionar la clave de un destinatario. filter.keyNotFound=No se pudo encontrar una clave de cifrado para "%S". filter.warn.keyNotSecret=Advertencia - la acción de filtrado "Cifrar para clave" reemplaza los destinatarios.\n\nSi no tiene la clave secreta (privada) para "%S" ya no podrá leer los correos. # strings in enigmailConvert.jsm converter.decryptBody.failed=No se pudo descifrar el mensaje con asunto\n"%S".\n¿Quiere intentarlo de nuevo con una contraseña diferente o quiere omitir el mensaje? converter.decryptAtt.failed=No se pudo descifrar el adjunto "%1$S"\ndel mensaje con asunto\n"%2$S".\n¿Quiere intentarlo de nuevo con una frase-contraseña diferente o quiere omitir el mensaje? saveLogFile.title=Guardar archivo de registro (log) # strings in gpg.jsm unknownSigningAlg=Algoritmo de firmado desconocido (identificador: %S) unknownHashAlg=Hash criptográfico desconocido (identificador: %S) # strings in keyRing.jsm keyring.photo=Foto keyRing.pubKeyRevoked=La clave %1$S (identificador de clave %2$S) está revocada. keyRing.pubKeyExpired=La clave %1$S (identificador de clave %2$S) ha caducado. keyRing.pubKeyNotForSigning=La clave %1$S (identificador de clave %2$S) no se puede usar para firmar. keyRing.pubKeyNotForEncryption=La clave %1$S (identificador de clave %2$S) no se puede usar para cifrado. keyRing.keyDisabled=La clave %1$S (identificador de clave %2$S) está deshabilitada; no se puede usar. keyRing.keyNotTrusted=La clave %1$S (identificador de clave %2$S) no ha recibido confianza suficiente. Por favor, establezca el nivel de confianza de su clave a 'absoluta' para usarla para firmado. keyRing.keyInvalid=La clave %1$S (identificador de clave %2$S) no es válida (ej.: no está auto-firmada). Por favor, considere verificarla correctamente. Como alternativa use la "Configuración conveniente de cifrado". keyRing.signSubKeysRevoked=Todas las subclaves-de-firmado de la clave %1$S (identificador de clave %2$S) están revocadas. keyRing.signSubKeysExpired=Todas las subclaves-de-firmado de la clave %1$S (identificador de clave %2$S) han caducado. keyRing.signSubKeysUnusable=Todas las subclaves-de-firmado de la clave %1$S (identificador de clave %2$S) están revocadas, caducadas, o de algún otro modo inutilizadas. keyRing.encSubKeysRevoked=Todas las subclaves-de-cifrado de la clave %1$S (identificador de clave %2$S) están revocadas. keyRing.encSubKeysExpired=Todas las subclaves-de-cifrado de la clave %1$S (identificador de clave %2$S) han caducado. keyRing.noSecretKey=No parece que tenga la clave secreta (privada) para %1$S (identificador de clave %2$S) en su juego de claves; no puede usar la clave para firmado. keyRing.encSubKeysUnusable=Todas las subclaves-de-cifrado de la clave %1$S (identificador de clave %2$S) están revocadas, caducadas, o inutilizadas de algún otro modo. #strings in exportSettingsWizard.js cannotWriteToFile=No puede guardar al fichero '%S'. Por favor, seleccione un fichero distinto. dataExportError=Ocurrió un error durante la exportación de sus datos. enigmailSettings=EnigmailSettings defaultBackupFileName=Enigmail-export specifyExportFile=Especificar nombre de fichero para la exportación homedirParamNotSUpported=Los parámetros adicionales que configuran rutas como --homedir y --keyring (directorio principal y juego de claves) no están soportados para exportar/restaurar su configuración. Por favor, use métodos alternativos como establecer la variable de entorno GNUPGHOME (directorio principal de GnuPG). #strings in expiry.jsm expiry.keyExpiresSoon=Su clave %1$S caducará en menos de %2$S días.\n\nLe recomendamos que cree un nuevo par de claves y configure las cuentas correspondientes para que usen la nueva clave. expiry.keysExpireSoon=Las siguientes de sus claves caducarán en menos de %1$S días:\n%2$S Recomendamos que cree nuevas claves y configure sus cuentas para que las usen. expiry.keyMissingOwnerTrust=Su clave secreta (privada) %S carece de nivel de confiaza.\n\nLe recomendamos que establezca la opción 'Su confianza en las certificaciones es' a 'absoluta' en las propiedades de la clave. expiry.keysMissingOwnerTrust=La siguiente de sus claves secretas/privadas carece de nivel de confianza\n%S.\nRecomendamos que establezca la configuración 'Su confianza en las certificaciones es' a 'absoluta' en las propiedades de la clave. expiry.OpenKeyManager=Abrir administración de claves de Enigmail expiry.OpenKeyProperties=Abrir propiedades de la clave #strings in pEpDecrypt.jsm pEpDecrypt.cannotDecrypt=Este es un mensaje cifrado. Desafortunadamente no tiene la clave secreta (privada) para descifrar el mensaje. #strings in gpgAgent.jsm gpghomedir.notexists=El directorio '%S' que contiene sus claves OpenPGP no existe y no se puede crear. gpghomedir.notwritable=El directorio '%S' que contiene sus claves OpenPGP no es escribible. gpghomedir.notdirectory=El directorio '%S' que contiene sus claves OpenPGP es un fichero en vez de un directorio. gpghomedir.notusable=Por favor, corrija los permisos del directorio o cambie la ubicación de su directorio 'home' (principal) de GnuPG, o de otro modo GnuPG no podrá funcionar correctamente. #strings in pepTrustWords.js pepTrustWords.cannotVerifyOwnId=No se pueden verificar las palabras de confianza (trustwords) de p≡p para la cuenta propia. pepTrustWords.cannotFindKey=No se pudo encontrar clave para %S. pepTrustWords.cannotStoreChange=No se pudo cambiar la confianza para %S. pepTrustWords.generalFailure=No se pueden obtener palabras de confianza para %S. pepTrustWords.partnerFingerprint=Huella de validación de clave para %S: #strings in mimeWkdHandler.jsm wkdMessage.body.req=Su proveedor de correo electrónico procesó su petición para subir su clave pública al directorio web de claves (Webkey) de OpenPGP.\n\nPor favor, pulse el botón de confirmación en el encabezamiento de Enigmail para completar la publicación de su clave pública. wkdMessage.body.process=Este es un correo en relación al procesado automático para subir su clave pública al Directorio Web de Claves OpenPGP (Web Key Directory).\n\nNo necesita llevar a cabo ninguna acción manual en este punto. #strings in pepHandshake.js pepPrivacyStatus.RatingBrokenSuggestion=O bien usted o el remitente deben reenviar el mensaje. pepPrivacyStatus.RatingHaveNoKeySuggestionOutgoing=Si usted redactó este mensaje, su clave no está disponible. pepPrivacyStatus.RatingMistrustSuggestion=Vuelva a establecer la conexión con el interlocutor de su comunicación e intente completar otra negociación. pepPrivacyStatus.RatingReliableSuggestion=Complete una negociación con el interlocutor de su comunicación intercambiando las palabras de confianza (trustwords) en persona o por teléfono (canal seguro). Una negociación sólo es necesaria una vez por interlocutor, y asegurará una comunicación segura y de confianza. pepPrivacyStatus.RatingTrustedSuggestion=¡No precisa ninguna acción! pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Tenga en cuenta que este mensaje puede no ser seguro. pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Por favor, añada la información necesaria. pepPrivacyStatus.RatingUnderAttackSuggestion=Verifique de forma separada el contenido de este mensaje con el interlocutor de su comunicación. pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Asegúrese de que el estado de privacidad para cada interlocutor de la comunicación listado es al menos 'seguro'. pepPrivacyStatus.RatingUnencryptedSuggestion=Por favor, pida al interlocutor de su comunicación que use una solución de cifrado o instale p≡p. pepPrivacyStatus.RatingUnreliableSuggestion=Este mensaje no tiene un cifrado fiable o carece de firma. Pida al interlocutor de su comunicación que actualice su solución de cifrado o instale p≡p (Pretty Easy Privacy). pepPrivacyStatus.RatingBrokenExplanation=Este mensaje tiene un cifrado o formato estropeado. pepPrivacyStatus.RatingHaveNoKeyExplanation=Este mensaje no se puede descifrar porque la clave no está disponible. pepPrivacyStatus.RatingMistrustExplanation=Este mensaje tiene un participante en la comunicación que ha sido evaluado 'sin confianza'. pepPrivacyStatus.RatingReliableExplanation=Este mensaje es seguro, pero todavía necesita verificar la identidad del interlocutor de su comunicación. pepPrivacyStatus.RatingTrustedExplanation=Este mensaje es seguro y de confianza. pepPrivacyStatus.RatingUndefinedExplanation=Este mensaje no contiene suficiente información para determinar si es seguro. pepPrivacyStatus.RatingUnderAttackExplanation=Este mensaje no es seguro y ha sido alterado. pepPrivacyStatus.RatingUnencryptedExplanation=Este mensaje no es seguro pepPrivacyStatus.RatingUnencryptedForSomeExplanation=Este mensaje no es seguro para algunos participantes en la comunicación. pepPrivacyStatus.RatingUnreliableExplanation=Este mensaje tiene una protección no fiable. pepPrivacyStatus.RatingBrokenText=Estropeado pepPrivacyStatus.RatingHaveNoKeyText=No se puede descifrar pepPrivacyStatus.RatingMistrustText=Sin confianza pepPrivacyStatus.RatingReliableText=Seguro pepPrivacyStatus.RatingTrustedText=Seguro y de confianza pepPrivacyStatus.RatingUndefinedText=Desconocido pepPrivacyStatus.RatingUnderAttackText=Bajo ataque pepPrivacyStatus.RatingUnencryptedForSomeText=No seguro para algún interlocutor pepPrivacyStatus.RatingUnencryptedText=Inseguro pepPrivacyStatus.RatingUnreliableText=Seguridad no fiable handshakeDlg.button.initHandshake=Negociación... handshakeDlg.button.stopTrust=Dejar de confiar handshakeDlg.button.reTrust=Devolver confianza handshakeDlg.label.outgoingMessage=Mensaje saliente handshakeDlg.label.incomingMessage=Mensaje entrante handshakeDlg.error.noPeers=No se puede realizar la negociación sin interlocutores. handshakeDlg.error.noProtection=Por favor, habilite la protección para usar la función de Negociación. enigmail.acSetupPasswd.descEnterPasswd=Por favor, introduzca el código de configuración que se muestra en el otro dispositivo. enigmail.acSetupPasswd.descCopyPasswd=Por favor, introduzca el código de configuración en su otro dispositivo para continuar con la configuración #strings in autocrypt.jsm autocrypt.setupMsg.subject=Mensaje de configuración de Autocrypt autocrypt.setupMsg.msgBody=Para configurar su nuevo dispositivo para Autocrypt, por favor, siga las instrucciones que se deben mostrar en su nuevo dispositivo. autocrypt.setupMsg.fileTxt=Este es el fichero de configuración de Autocrypt usado para transferir configuraciones y claves entre clientes de correo. Puede descifrarlo usando el código de configuración presentado en su dispositivo antiguo, y luego importar la clave que contiene a su juego de claves. #strings in upgradeInfo.html upgradeInfo.doctitle=¿Qué novedades hay en Enigmail v2.0? upgradeInfo.welcome1=¡Bienvenido a la nueva versión 2.0 de Enigmial! upgradeInfo.welcome2=Esta versión contiene un montón de características nuevas y modificaciones. Por favor, tómese un minuto para averiguar cuáles son las novedades: upgradeInfo.encSubject.title=Cifrar el asunto del mensaje upgradeInfo.encSubject.desc=Hemos desarrollado un nuevo método que mueve el asunto del correo al interior del mensaje cifrado, y reemplaza el asunto visible con "Mensaje cifrado". Una vez se descifre un mensaje de este tipo, el asunto original es reemplazado automáticamente. La ocultación del asunto está activada por defecto; hay una preferencia para desactivarla si no le gusta. (Nota: Esta característica requiere que el mensaje sea enviado con PGP/MIME (mensaje cifrado como adjunto).) upgradeInfo.buttons.title=Se cambió el comportamiento de los botones Cifrar y Firmar upgradeInfo.buttons.desc=Los botones Cifrar y Firmar en la ventana de redacción del mensaje ahora funcionan para ambos protocolos OpenPGP y S/MIME. Si ambos algoritmos son posibles, entonces Enigmail tratará de dar preferencia a aquel para el que estén disponibles todas las claves. upgradeInfo.autocrypt.title=Soporte para Autocrypt upgradeInfo.autocrypt.desc=Enigmail ahora soporta Autocrypt, un nuevo estándar para distribuir claves como parte de mensajes enviados. Enigmail importa claves automáticamente desde mensajes compatibles con Autocrypt, de forma que con el tiempo se pueden cifrar cada vez más correos electrónicos. upgradeInfo.pEp.title=Nuevo Modo Junior de p≡p (pretty Easy privacy) upgradeInfo.pEp.desc=Enigmail ahora contiene un Modo Junior de p≡p. En la actualidad necesita instalar p≡p manualmente para este propósito; esto cambiará en una futura versión. El Modo Junior de p≡p le permite usar cifrado OpenPGP de la forma más transparente posible; no tendrá que atender la administración de claves y la sincronización de claves entre dispositivos nunca más. upgradeInfo.bottom.desc=Por favor, visite nuestra documentación para ayuda en el uso de Enigmail. pep.missingGnuPG=Para usar Enigmail/p≡p, se requiere GnuPG. Como no pudimos encontrarlo, sugerimos descargarlo e instalarlo para usted. #strings in enigmailAbout.html aboutEnigmail.tabName=Acerca de Enigmail aboutEnigmail.title=Soporte OpenPGP proporcionado por Enigmail aboutEnigmail.team=Enigmail es desarrollado por el Equipo de Enigmail: aboutEnigmail.projectLeader=Desarrollador principal: aboutEnigmail.usability=Usabilidad: aboutEnigmail.documentation=Documentación: aboutEnigmail.testing=Probando: aboutEnigmail.userSupport=Soporte para el usuario: aboutEnigmail.localization=Ubicación: Vea la página de Paquetes de Idioma de Enigmail aboutEnigmail.Credits=Reconocimientos: aboutEnigmail.origAuthor=Autor original de la extensión Enigmail aboutEnigmail.icons=Iconos: aboutEnigmail.formerMembers=Anteriores miembros del equipo: aboutEnigmail.projectHosting=Alojamiento del proyecto: aboutEnigmail.licenseSupportTitle=Licencia y soporte aboutEnigmail.license=El OpenPGP de Enigmail es de código abierto y está licenciado bajo la %S aboutEnigmail.support=Tiene disponibles soporte y descargas desde www.enigmail.net. enigmail-2.0.8/lang/es-ES/help/000077500000000000000000000000001334302754500161015ustar00rootroot00000000000000enigmail-2.0.8/lang/es-ES/help/compose.html000066400000000000000000000105211334302754500204330ustar00rootroot00000000000000 Enigmail Help: Message Composition

Ayuda de Enigmail

Uso de Enigmail al redactar mensajes

  • Menú Enigmail en la ventana de Redacción de Correo
    • Firmar mensaje: Activa/Desactiva el envío de mensajes firmados. El usuario es notificado si el firmado falla.
    • Cifrar mensaje: Activa/Desactiva el cifrado para el(los) destinatario(s) antes del envío. El usuario es notificado si el cifrado falla.

      Si Mostrar selección cuando sea necesario está seleccionado en Preferencias -> pestaña Selección de Claves, una lista de claves aparecerá si hay direcciones en la lista de destinatarios para los que usted no tenga clave pública.

      Si Nunca mostrar diálogo de selección de clave OpenPGP está seleccionado en Preferencias -> pestaña Selección de Claves, y hay direcciones en la lista de destinatarios para los cuales usted no tiene clave pública, el mensaje será enviado sin cifrar.

    • Usar PGP/MIME para este mensaje : Activa/Desactiva el uso de PGP/MIME para este mensaje.

      Si usted sabe que el(los) destinatario(s) pueden leer correos usando el formato PGP/MIME, usted debiera usarlo.

      Esta característica depende de la configuración en Preferencias -> pestaña PGP/MIME estando configurada para Permitir el uso de PGP/MIME o Siempre usar PGP/MIME.

    • Opciones por defecto para redacción: Submenú.
      • Opciones de Firma/Cifrado...: atajo a Configuración de Cuentas -> Opciones de OpenPGP.
      • Opciones de Envío...: atajo a la pestaña Opciones -> Enviando.
      • Opciones de Selección de Clave...: atajo a la pestaña Preferencias -> Selección de Clave.
      • Opciones PGP/MIME...: atajo a la pestaña Preferencias -> PGP/MIME.
    • Deshacer cifrado: Si hay un fallo al momento del envío, tal como el servidor POP no aceptando la petición, Enigmail no sabrá al respecto, y el mensaje cifrado continuará siendo mostrado en la ventana de Redacción. Elegir este ítem de menú deshará el cifrado/firmado, devolviendo la ventana de Redacción a su texto original.
      Como una solución temporal, esta opción puede también ser usada para descifrar el texto citado cuando se responde a mensajes cifrados. Enigmail debiera descifrar automáticamente el texto citado, pero si eso falla por alguna razón, usted puede utilizar este ítem de menú para forzarlo.
    • Insertar clave pública: inserta la clave pública como un bloque de texto ASCII-blindado en la posición actual del cursor en la ventana de Redacción. Se le preguntará por la dirección email de la(s) clave(s) a ser insertada(s). Las Claves insertadas de esta manera serán reconocidas automáticamente en el lado receptor por Enigmail. Luego de la inserción de clave, usted aún puede elegir firmar/cifrar el mensaje como sea necesario. Además, no inserte más de un bloque de claves en un mensaje; sólo especifique múltiples direcciones email, separadas por comas o espacios, cuando se le pregunte.
    • Limpiar clave salvada: Limpia la contraseña retenida. útil si usted tiene múltiples contraseñas.
    • Ayuda: Despliega la información de Ayuda del sitio web (esta página).

Más ayuda disponible en la Página web de Ayuda de Enigmail

enigmail-2.0.8/lang/es-ES/help/editRcptRule.html000066400000000000000000000132341334302754500214000ustar00rootroot00000000000000 Enigmail Help: Edit OpenPGP Rule

Ayuda de Enigmail

Usando el Editor de Reglas de Enigmail: Editar Regla OpenPGP

En el Editor de Reglas, usted puede especificar valores por defecto por destinatarios para activar cifrado, firmado y PGP/MIME, y para definir qué clave(s) OpenPGP utilizar. En este diálogo, usted puede especificar reglas para un único destinatario, y para un grupo de destinatarios con atributos muy similares.

  • Poner Regla OpenPGP para : Contiene la(s) dirección(es) email de el/los destinatario(s) (sin nombres, p.ej. sólo una dirección como alguien@email.dom). Usted puede especificar varias direcciones email, separadas por espacios. La dirección especificada aquí puede consistir sólo de la sección de dominio de modo que cualquier dirección en ese dominio concuerde, p.ej. @email.domain permitirá concordancia a body@email.comain, somebody@email.domain, anybody@email.domain, etc.
  • Aplicar regla si el destinatario ...: Esto modifica la concordancia de las direcciones email. Si se ingresa múltiples direcciones, la configuración se aplicará a todas. Los ejemplos abajo están basados en body@email.domain ingresado en el campo Poner Regla OpenPGP para más arriba.
    • Es exactamente: con esta configuración, la regla sólo se disparará en emails para body@email.domain (comparación exacta, sin considerar mayúsculas/minúsculas).
    • Contiene: con esta configuración, cualquier dirección email que contenga el patrón concuerda, p.ej. anybody@email.domain o body@email.domain.net
    • Empieza por : con esta configuración, cualquier dirección email comenzando con el patrón concuerda, p.ej. body@email.domain.net, body@email.domain-name.com.
    • Acaba en: con esta configuración, cualquier dirección email finalizando en el patrón concuerda, p.ej. anybody@email.domain, somebody@email.domain.
  • Continuar con la siguiente regla para la dirección que coincida
    Activar esta función le permitirá definir una regla pero no tener que especificar un KeyID en el campo Usar las siguientes claves OpenPGP: , de modo que la dirección email es usada para buscar una clave al momento de enviar. Además, reglas adicionales para la(s) misma(s) dirección(es) también será(n) procesada(s).
  • No comprobar más reglas para la dirección que coincida
    Activar esta función detiene el procesamiento de cualquier otra regla para la(s) dirección(es) que coincide(n) si es que la regla coincide; p.ej. el procesamiento de reglas continúa con el siguiente destinatario.
  • Usar las siguientes claves OpenPGP:
    Use el botón Seleccionar Clave(s).. para seleccionar las claves receptoras a ser usadas para el cifrado. Como en la acción de arriba, no se sigue procesando más reglas para la(s) dirección(es) coincidentes.
  • Por defecto para Firmado: activa o desactiva la firma de mensaje. Esto o bien usa o anula lo que usted ha especificado en la ventana de redacción de mensaje. Los valores son:
    • Nunca: desactiva el firmado, incluso si está activado en la ventana de redacción de mensaje (anula los otros valores)
    • Sí, si está seleccionado en la redacción del mensaje: deja el firmado tal como está especificado en la ventana de redacción del mensaje
    • Siempre: activa el firmado, incluso si no estaba activado en la ventana de redacción del mensaje
Esas configuraciones para firmado son aplicadas para todas las reglas que coinciden. Si una de las reglas desactiva el firmado, el mensaje no será firmado, sin importar otras reglas que especifiquen Siempre.
  • Cifrado: activa o desactiva el cifrado de mensaje. Las configuraciones permitidas y su significado son las mismas que para la firma de mensajes.
  • PGP/MIME: activa o desactiva el uso de la codificación de mensaje PGP/MIME (RFC 3156). Si PGP/MIME está desactivado, los mensajes son codificados utilizando "inline PGP". Los valores permitidos y sus significados son los mismos que para la firma de mensajes.

Las reglas son procesadas en el orden en que se muestran en la lista en el Editor de Reglas OpenPGP. Siempre que una regla coincide con un destinatario y contiene una KeyID OpenPGP, adicionalmente a usar la KeyID especificada, el destinatario deja de ser considerado al procesar otras reglas adicionales.


Ayuda adicional disponible en la página de Configuración Por-Destinatario de Enigmail

enigmail-2.0.8/lang/es-ES/help/initError.html000066400000000000000000000045421334302754500207510ustar00rootroot00000000000000 Enigmail Help: How to Resolve Problems with Initializing OpenPGP

Enigmail Help

How to Resolve Problems with Initializing OpenPGP

There are several reasons why initializing OpenPGP does not succeed. The most common ones are described below; for more information please visit the Enigmail Support page.

GnuPG could not be found

In order for OpenPGP to work, the tool GnuPG needs to be installed. If GnuPG cannot be found, then first make sure that the executable gpg.exe (on Windows; gpg on other platforms) is installed on your computer. If GnuPG is installed, and OpenPGP cannot find it, then you need to manually set the path to GnuPG in the OpenPGP Preferences (menu OpenPGP > Preferences)

Enigmime failed to initialize

OpenPGP works only if it is built using the same build environment as Thunderbird or SeaMonkey was built. This means that you can use the official Enigmail releases only if you use the official releases of Thunderbird or SeaMonkey provided by mozilla.org.

If you use a Thunderbird or SeaMonkey version coming from some other source (e.g. the provider of your Linux distribution), or if you built the application yourself, you should either use an Enigmail version built by the same source, or build Enigmail yourself. For building Enigmail, refer to the Source Code section on the Enigmail home page. Please don't file any bug report concerning this problem, it is not solvable.

Further help is available on the Enigmail Support Web Site.

enigmail-2.0.8/lang/es-ES/help/messenger.html000066400000000000000000000115301334302754500207570ustar00rootroot00000000000000 Ayuda de Enigmail: Lectura de mensajes

Ayuda de Enigmail

Usando Enigmail para leer mensajes

  • Botón Descifrar en la ventana principal de correo
    Este botón se puede usar para varios propósitos: descifrar, verificar o importar claves públicas. Normalmente el descifrado/verificación se realiza automáticamente, aunque hay una opción para desactivar esto. Sin embargo, si esto falla, normalmente aparecerá un breve mensaje de error en la línea de estado de Enigmail. Si se pulsa el botón Descifrar, podrá ver un mensaje de error más detallado, incluyendo la salida del comando GnuPG.
  • Los iconos Lápiz y Llave mostrados en la cabecera del mensaje
    Los iconos Lápiz y Llave en la cabecera del mensaje indican si el mensaje que se está leyendo está firmado y/o cifrado y si la firma es buena, es decir; que el mensaje no se ha modificado desde el momento de su firma. Si el mensaje ha sido modificado, el icono del Lápiz cambiará a un Lápiz roto para indicar que la firma no es correcta. Al pulsar con el botón derecho del ratón en los iconos del Lápiz o Llave, se obtendrá un menú con las siguientes opciones:

    • Información de seguridad OpenPGP: permite ver el estado de salida de GnuPG para el mensaje.
    • Copiar información de seguridad OpenPGP: copia el estado de salida de GnuPG al portapapeles; para pegarlo en un mensaje de respuesta, etc.
    • Ver ID fotográfico OpenPGP: permite ver la Foto ID de la persona que envió el mensaje, si tiene una foto incrustada en su clave pública (Esta opción sólo se activará si existe un ID fotográfico en su clave).
    • Información de seguridad S/MIME: permite ver la información de seguridad S/MIME del mensaje.

    Si no tiene puesta la opción keyserver-options auto-key-retrieve en su archivo gpg.conf y lee un mensaje que está firmado o cifrado, verá un icono de un Lápiz en el área de visión de las cabeceras con un Signo de interrogación y, la línea de estado de Enigmail en el área de las cabeceras dirá: Parte del mensaje firmado; pulse el icono del lápiz para más detalles y el mensaje en el panel de mensajes mostrará todos los indicadores del bloque del mensaje OpenPGP y el bloque de la firma.

    También se puede ver esto si tiene activada la opción keyserver-options auto-key-retrieve en su archivo gpg.conf y la clave OpenPGP no está disponible en el servidor de claves predeterminado.

    Al pulsar en el icono del Lápiz y Signo de interrogación abrirá una ventana avisando que la clave no está disponible en el anillo de claves. Al pulsar en Aceptar abrirá otra ventana con una lista de servidores de claves en los que puede seleccionar para descargar la clave pública del remitente.

    Para configurar la lista de servidores de claves que desee usar, vaya a la pestaña Enigmail -> Preferencias -> Básicas e introduzca la dirección de los servidores de claves en el recuadro Servidor(es) de claves: separados por una coma. El primer servidor de claves de la lista se usará como predeterminado.

  • Abrir adjuntos cifrados / importar claves OpenPGP adjuntas
    Los adjuntos con el nombre *.pgp, *.asc y *.gpg se reconocen como adjuntos que se pueden manejar especialmente con Enigmail. Al pulsar con el botón derecho en un adjunto de este tipo se activan dos elementos especiales en el menú contextual: Descifrar y Abrir y Descifrar y Guardar. Use estos elementos si desea que Enigmail descifre un adjunto antes de abrirlo o guardarlo. Si se reconoce un adjunto como un archivo de clave OpenPGP, se le ofrece la posibilidad de importar las claves a sus anillos.

Más ayuda disponible en la página Web de ayuda de Enigmail

enigmail-2.0.8/lang/es-ES/help/rulesEditor.html000066400000000000000000000066711334302754500213020ustar00rootroot00000000000000 Ayuda de Enigmail: Editor de reglas

Ayuda de Enigmail

Usando el editor de reglas de Enigmail

En el editor de reglas, se pueden especificar opciones predeterminadas por destinatario para activar el cifrado, firma y PGP/MIME, así como definir qué clave(s) OpenPGP usar. Cada regla consiste de 5 campos y se representa en una sola línea:

  • Correo electrónico: Las direcciones de correo en los campos Para:, Cc: y Cco: tienen que coincidir. La coincidencia funciona en subcadenas (Más detalles en el diálogo de Editar regla)
  • Clave(s) OpenPGP: Una lista de IDs de claves OpenPGP para usar con el destinatario.
  • Firmar: Activar o desactivar el firmado de mensajes. Esta opción usa o ignora lo que se haya especificado en la ventana de redacción de mensajes. Los valores son:
    • Nunca: Desactiva la firma, incluso si estaba activada en la ventana de redacción del mensaje (tiene preferencia sobre los otros valores).
    • Posible: Deja la firma como se haya especificado en la ventana de redacción de mensajes.
    • Siempre: Activar la firma, incluso si no está activada en la ventana de redacción de mensajes.
Estas opciones de firma se aplican a todas las reglas que las cumplan. Si una de las reglas desactiva la firma, el mensaje no se firmará, independientemente de otras reglas que especifiquen Siempre.
  • Cifrar: Activa o desactiva el cifrado del mensaje. Las opciones permitidas y su significado son las mismas que para la firma.
  • PGP/MIME: Activa o desactiva el uso de la codificación del mensaje PGP/MIME (RFC 3156). Si PGP/MIME está desactivado, los mensajes se codifican usando "PGP integrado". Los valores permitidos y su significado son los mismos que para la firma de mensajes.

Las reglas se procesan en el orden mostrado en la lista. Cuando una regla coincida con un destinatario y contenga un ID de clave OpenPGP, además de usar el ID de clave especificado, el destinatario no se tendrá en consideración al procesar más reglas.

NOTA: El editor de reglas aún no está completo. Es posible escribir algunas reglas más avanzadas editando directamente el archivo de reglas (en cuyo caso, éstas no se deben volver a editar mediante el editor). Más información para editar el archivo directamente se encuentra disponible en la página Web de Enigmail.


Más ayuda disponible en la página Web de ayuda de Enigmail

enigmail-2.0.8/lang/es-ES/help/sendingPrefs.html000066400000000000000000000047771334302754500214350ustar00rootroot00000000000000 Enigmail Help: Edit OpenPGP Rule

Enigmail Help

Defining Preferences to Send Encrypted

In the Sending Preferences you can choose the general model and preferences for encryption.

Convenient Encryption
With these settings, emails are encrypted without confirmation whenever possible.

This setup is appropriate, if you just want to improve your privacy by sending emails encyrpted instead of unencrypted if that's possible.

The effect is like sending emails as letters instead of postcards. Unlike postcards, letters usually hide their contents while in transit.

Note however that as with letters you can't be sure that nobody is opening the letter while it is in transit (although, some technical effort is necessary for that).

A concrete risk is that you accidentally use "faked keys" you got from somewhere or somebody claiming that the key belongs to the person you want to send emails to. To avoid this risk, you can either use the trust model of PGP (see below) or you should always verify, whether the fingerprint of a public key is correct.

Manual Encryption
This option allows you to specify the different preferences for encryption according to your needs. You can specify
  • whether replies to encrypted/signed emails should automatically also be encrypted/signed-
  • whether to use the trust model of OpenPGP to accept keys (this means that to use a key you either have to sign the key or have enough other people you trust having signed the key).
  • whether you want to automatically send emails encrypted if all keys are accepted.
  • whether and when you want to finally confirm sending an email.
If it is important for you that content you send encrypted can't be read by other people or organizations, you should use the manual preferences at least choose the option to accept keys only if you or other people signed them. While this model reduces the risk of using faked keys, it requires that you actively sign keys and declare owner trust using the key managament dialog. enigmail-2.0.8/lang/eu/000077500000000000000000000000001334302754500146465ustar00rootroot00000000000000enigmail-2.0.8/lang/eu/am-enigprefs.properties000066400000000000000000000001241334302754500213360ustar00rootroot00000000000000# Strings used in the Mozill AccountManager prefPanel-enigprefs=OpenPGP Sekurtasuna enigmail-2.0.8/lang/eu/contents.rdf000077500000000000000000000011561334302754500172060ustar00rootroot00000000000000 enigmail-2.0.8/lang/eu/enigmail.dtd000066400000000000000000001047031334302754500171350ustar00rootroot00000000000000 OHARRA: Gakoa sortzeko prozesua zenbait minutu iraun ditzake. Ez zaitez aplikaziotik atera gakoa sortzen ari den bitartean. Bitartean ordenagailua erabiltzea edo disko gogorran eragiketak egiten dituzten ekintzak egiten badituzu, ausazko datuen sorreran lagunduko du eta prozesua azkartuko du. Jakinarazi egingo zaizu gako sorrera prozesua bukatzerakoan."> ' ez du balio"> OHARRA: Gakoa sortzeko prozesua minutu batzuk iraun ditzake. Ez zaitez aplikaziotik atera gakoa sortzen ari den bitartean. Gakoa sortu eta gero abisu bat agertuko zaizu."> Oharra: Enigmail-k sinadurak kontu eta nortasun guztientzat egiaztatuko ditu, gaituta egon ez arren."> Mila esker Enigmail erabiltzeagatik."> Mila esker Enigmail erabiltzeagatik."> enigmail-2.0.8/lang/eu/enigmail.properties000066400000000000000000000625531334302754500205640ustar00rootroot00000000000000Enigmail=Enigmail # Strings used within enigmailCommon.js # Strings in enigmailAbout.js # Strings in enigmailKeygen.js enigAlert=Enigmail Abisua enigConfirm=Enigmail Baieztapena enigError=Enigmail Errorea enigPrompt=Enigmail Mezua dlgYes=&Bai dlgNo=&Ez dlgKeepSetting=Nire erantzuna gogoratu eta ez galdetu berriro dlgNoPrompt=Ez erakutsi gehiago mezu hau dlg.button.delete=&Ezabatu dlg.button.cancel=&Utzi dlg.button.close=&Itxi dlg.button.continue=&Jarraitu dlg.button.skip=&Saltatu dlg.button.view=I&kusi repeatPrefix=\n\nAbisu hau %S errepikatuko da. repeatSuffixSingular=behin gehiago repeatSuffixPlural=gehiagotan noRepeat=\n\nAbisua hau ez da errepikatuko Enigmail eguneratzen duzun arte. noLogDir=Mesedez, 'Log karpeta' arazketa ezaugarria ezarri ezazu log fitxategia sortzeko noLogFile=Log fitxategia ez da oraindik sortu! restartForLog=Mesedez, aplikazioa berrabiatu log fitxategia sortzeko pgpNotSupported=Dirudienez Enigmail PGP 6.x-rekin batera erabiltzen ari zara.\n\nZoritxarrez, PGP 6.x zenbait arazo ditu eta horrek Enigmail gaizki ibiltzea dakar. Hortaz, Enigmail-ek ez du PGP 6.x onartzen; mesedez, horren ordez GnuPG (GPG) erabili ezazu.\n\nGnuPG-ra aldatzeko laguntzarik behar baldin baduzu, Enigmail weborriaren Laguntza atala begiratu ezazu. avoidInitErr=Mezu hau betirako kentzeko, arazoa konpondu ezazu edo Enigmail desinstalatu ezazu. Laguntza botoian sakatu ezazu xehetasun gehiago behar badituzu. passphraseCleared=Pasahitza ezabatu egin da. passphraseCannotBeCleared=Pasahitzak kudeatzeko gpg-agent erabiltzen ari zara. Horregatik, Enigmail-etik ezin da pasahitza ezabatu. noPhotoAvailable=Ez Dago Argazkirik # Strings in enigmailMessengerOverlay.js # Strings in enigmailMsgComposeOverlay.js # Strings in enigmailMsgHdrViewOverlay.js usingVersion=Enigmail %S bertsioa martxan dago usingAgent=%S exekutagarria %s erabiltzen zifratu eta argitzeko agentError=ERROREA: Ezin izan da Enigmime serbitzuarekin konexioa egin # Strings in enigmailNavigatorOverlay.js # Strings in pref-enigmail.js # Strings used in components/enigmail.js accessError=Enigmail serbitzura sartzean errore bat gertatu da onlyGPG=Gako sorrera GnuPG-rekin bakarrik (ez PGP-rekin) dabil! keygenComplete=Gakoaren sorrera bukatu da! Sinatzeko <%S> nortasuna erabiliko da. revokeCertRecommended=Gogor gomendatzen dugu zure gakoarentzat ezeztapen ziurtagiri bat sortzea. Ziurtagiri hau zure gakoa ezgaitzeko erabili daiteke, adibidez, zure gako sekretua galdu edo arriskuan badago. Ezeztapen ziurtagiri hau orain sortu nahi al duzu? keyMan.button.generateCert=&Ziurtagiria Sortu genCompleteNoSign=Gakoaren sorrera bukatu da! genGoing=Gakoaren sorrera prozesua dagoeneko martxan dago! passNoMatch=Pasahitzak ez datoz bat, mesedez, berriz sartu itzazu passCheckBox=Mesedez, laukitxoa sakatu ezazu gakoarentzak pasahitzik ez badago passUserName=Mesdez, nortasun honentzako erabiltzailearen izena sartu ezazu passCharProblem=Zure pasahitzan karaktere bereziak erabiltzen ari zara. Zoritxarrez, honek beste zenbait aplikazioetan arazoak sortu ditzake. Horregatik karaktere hauek bakarik dituen pasahitza aukeratu ezazu:\na-z A-Z 0-9 /.;:-,!?(){}[]%* changePassFailed=Pasahitzaren aldaketak huts egin du. removePassphrase=Orain dagoen pasahitza ezabatu nahi al duzu pasahitz berririk sartu gabe? keyMan.button.removePass=&Pasahitza Ezabatu keyConfirm='%S'-rentzat gako publiko eta pribatuak sortu nahi al duzu? keyMan.button.generateKey=Gakoa &Sortu keyAbort=Gako sorrera geldiarazi nahi al duzu? keyMan.button.generateKeyAbort=Gako Sorrera &Geldiarazi keyMan.button.generateKeyContinue=Gako Sorrera &Jarraitu expiryTooLong=Ezin da 100 urte baino gehiagoko iraungipena duen gakoa sortu. expiryTooShort=Zure gakoa gutxienez egun baterako balio behar du. keyGenFailed=Gako sorrerak huts egin du. Xehetasunak ikusteko, mesedez, Enigmail konsola begiratu ezazu (Enigmail Menua > Enigmail Araztu). # (said file also re-uses some strings from above) securityInfo=Enigmail Sekurtasun Informazioa\n\n enigHeader=Enigmail: enigContentNote=Enigmail: *Mezu honen eranskinak ez dira sinatu edo zifratu*\n\n possiblyPgpMime=Ziurenik PGP/MIME-k mezua sinatu edo zifratu egin du; Argitu botoia klikatu ezazu egiatzatzeko noDecrypted=Ez dago argituko mezurik gordetzeko!\nFitxategia menuan dagoen Gorde komandoa erabili ezazu noMessage=Ez dago mezurik gordetzeko! useButton=Mesedez Argitu botoia sakatu ezazu mezua argitzeko saveHeader=Enigmail: Argitutako mezua gorde saveAttachmentHeader=Enigmail: Argitutako eranskina gorde noTempDir=Ez da idatzi daitekeen aldi baterako karpetarik aurkitu.\nMesedez, TEMP ingurune aldagaia ezarri ezazu attachmentPgpKey=Irekitzen ari zaren '%S' eranskina OpenPGP gako fitxategi bat dirudi.\n\n'Inportatu' sakatu ezazu gakoa inportatzeko edo 'Ikusi' sakatu ezazu haren edukia azpian dagoen arakatzailean ikusteko. beginPgpPart=********* *ZIFRATU edo SINATUTAKO GUNEAREN HASIERA* ********* endPgpPart=********** *ZIFRATU edo SINATUTAKO GUNEAREN BUKAERA* ********** notePartEncrypted=Enigmail: *Mezu honen zati batzuk EZ dira sinatu edo zifratu* noteCutMessage=Enigmail: *Mezu bloke anitz aurkitu dira -- argitze/egiaztatze prozesua bertan behera utzi da* decryptOkNoSig=Kontuz\n\nArgitze prozesua ondo bukatu da, baina sinadura ezin izan da ondo egiaztatu. msgOvl.button.contAnyway=Edonola Ere &Jarraitu # Strings used in enigmailUserSelection.js keysToExport=Txertatko Diren OpenPGP Gakoak Aukeratu keysToUse=%S-rentzat erabiliko den(diren) OpenPGP Gako(ak) aukeratu pubKey=%S-rentzat gako publikoa\n windowLocked=Idazteko lehioa blokeatuta dago; bidaltzea ezeztatu da sendUnencrypted=Enigmail-ek hasieratzerakoan huts egin du.\nMezua zifratu gabe bidali? composeSpecifyEmail=Mesedez zure lehendabiziko helbide elektronikoa jarri ezazu. Hau bidaliko diren mezuak sinatzeko gakoa aukeratzeko erabiliko da.\nBete gabe uzten baduzu, NORK halbidea erabiliko da sinatzeko gakoa aukeratzeko. sendingHiddenRcpt=Mezu hau BCC (ezkutuko kopia) hartzaileak ditu. Mezu hau zifratuta bidaltzen bada, BCC hartzaileak ezkutatu ahal daitezke baina produktu batzuen erabiltzaileak (adib. PGP Corp.) ezin izango dute mezua argitu. Hau hartuta, BCC emailak zifratutako mezuekin ez bidaltzea gomendatzen dugu. sendWithHiddenBcc=BCC hartzaileak ezkutatu sendWithShownBcc=Normaltasunez zifratu sendingNews=Zifratutako mezua bidaltzeko operazioa bertan behera utzi da.\n\nMezu hau ezin da zifratu hartzaileen artean berri-taldeak daudelako. Mesedez, mezua zifratu gabe bidali ezazu. sendToNewsWarning=Kontuz: zifratutako email bat berri-talde batera bidaltzera zoaz.\n\nHau ez dago comendatua, honek bakarrik zentzuzkoa izango da baldin eta hartzaile guztiak mezua argitu dezakete, hau da, mezua hartzaile guztien gakoekin zifratuta badago. Mesedez, mezu hau bidali ezazu bakarrik egiten hari zarenaz ziur bazaude.\n\nJarraitu? hasHTML=HTML email-aren abisua:\nMezu honek HTML izan dezake, honek sinadura/zifraketa-ren hutsegitea ekar dezake. Etorkizunean hau eragozteko, sinatutako email bat bidaltzeko SHIFT tekla sakatu ezazu Idatzi/Erantzun botoia sakatzerakoan.\nZure aukera lehenetsita email-a sinatzea bada, 'Mezuak HTML-n Idatzi' laukitxoa ezgaitu beharko zenuke HTML posta kontu honetan betirako ezgaitzeko. strippingHTML=Mezuak HTML formatu informazioa dauka eta hau galuko da sinatu/zifratzeko testu arruntan bilakatzerakoan. Jarraitu nahi al duzu? msgCompose.button.sendAnyway=&Mezua Bidali Edonola attachWarning=Mezu honen eranskinak ez dira lokalak eta ezin dira zifratu. Eranskinak zifratu ahal izateko, fitxategi lokal bezala gorde itzazu eta gero erantsi itzazu. Mezua edonola bidali nahi al duzu? quotedPrintableWarn=Mezuak bidaltzeko 'quoted-printable' kodifikazioa gaitu duzu. Hau zure mezuaren argitze edo/eta egiaztatze okerra ekar dezake.\nMezuak 'quoted-printable' kodifikazioa erabiliz bidaltzeko aukera ezgaitu nahi al duzu? minimalLineWrapping=Lerroek %S karaktertara iristerakoan salto egitea konfiguratu duzu. Zifraketa eta/edo sinatze on batentzako, balio hau gutxienez 68 izan behar du.\nLerroen gehienezko luzeera 68 karakteretara orain aldatu nahi al duzu? warning=Kontuz signIconClicked=Sinadura eskuz aldatu duzu. Hortaz, mezua idazten ari zaren bitartean, sinadura (des)aktibatzea ez dator bat zifraketa (des)aktibatzearekin. sendAborted=Bidaltze eragiketa bertan bera utzi da\n\n statPGPMIME=PGP/MIME statSigned=SINATUTA statEncrypted=ZIFRATUTA statPlain=SINATU eta ZIFRATU GABE offlineSave=%S mezua Bidali Gabeko Mezuen karpetako %S-n gorde nahi al duzu? onlineSend=%S mezua %S-ri bidali nahi al diozu? encryptKeysNote=Oharra: mezu hau ondorengo erabiltzaile ID-ak/gakoak erabiliz zifratu da: signFailed=Enigmail-n errore bat egon da eta zifraketak/sinadurak huts egin du; mezua zifratu gabe bidali nahi al duzu? msgCompose.button.sendUnencrypted=Mezua Zifratu Gabe &Bidali acctNotConfigured=Ez duzu nortasun hau Enigmail sekurtasuna erabiltzeko konfiguratu.\nMezua zifratu gabe bidali nahi al duzu? recipientsSelectionHdr=Zifraketarako Hartzaileak Aukeratu configureNow=Aukeratutako nortasunarentzat oraindik ez duzu Enigmail sekurtasuna konfiguratu. Orain egin nahi al duzu? signYes=Mezua sinatuko da signNo=Mezua ez da sinatuko # Strings used in enigmailAttachmentDialog.js # Strings used in am-enigprefs.js encryptYes=Mezua zifratuko da encryptNo=Mezua ez da zifratuko rulesConflict=Hartzaileen arauen artean gatazka dago\n%S\n\nEzarpen hauekin mezua bidali nahi al duzu? msgCompose.button.configure=&Konfiguratu msgCompose.button.send=Mezua &Bidali msgCompose.button.save=Mezua &Gorde # Strings used in enigmailSingleRcptSettings.js keyNeeded=%S gako publikoa sinadura egiaztatzeko behar da clickDecrypt=; Argitu botoia sakatu clickDecryptRetry=; Argitu botoia sakatu berriz saiatzeko clickPen=; 'Xehetasunak' botoian klik egin ezazu informazio gehiago eskuratzeko clickPenDetails=; 'Xehetasunak' botoian klik egin ezazu informazio gehiago eskuratzeko clickQueryPenDetails=; 'Xehetasunak' botoian klik egin ezazu informazio gehiago eskuratzeko clickKey=; 'Xehetasunak' botoian klik egin ezazu informazio gehiago eskuratzeko clickQueryKeyDetails=;'Xehetasunak' botoian klik egin ezazu informazio gehiago eskuratzeko clickKeyDetails=; 'Xehetasunak' botoian klik egin ezazu informazio gehiago eskuratzeko clickPenKeyDetails=; 'Xehetasunak' botoian klik egin ezazu informazio gehiago eskuratzeko msgPart=%S mezuaren zatia msgSigned=Sinatutako msgEncrypted=Zifratutako msgSignedAndEnc=Sinatu eta zifratutako unverifiedSig=Egiaztatu gabeko sinadura incompleteDecrypt=Bukatu gabeko argitzea failedSig=Errorea - sinaduraren egiaztapenak huts egin du needKey=Errorea - mezua argitzeko gako sekretua behar da failedDecrypt=Errorea - argitzeak huts egin du badPhrase=Errorea - pasahitz okerra failedDecryptVerify=Errorea - argitzeak/egiaztapenak huts egin du viewInfo=; Xehetasunentzako Ikusi > Mezuaren Sekurtasun Informazioa decryptedMsg=Argitutako mezua # Strings used in enigmailRulesEditor.js testNoSvc=EnigTest: Ezin izan da Enigmail serbitzura konektatu testNoEmail=EnigTest: Frogarako e-posta helbidea jarri ezazu testSucceeded=Enigmail ondo funtzionatzen ari da. Xehetasunak nahi badituzu, Enigmail menutik ireki daitekeen kontsola begiratu ezazu oldGpgVersion=Enigmail-ren hasieraketak huts egin du.\n\nGnuPG %S bertsioa erabiltzen ari zara eta ez dago eguneratua. Enigmailek GnuPG 1.4 bertsioa edo berriago bat behar du. Mesedez, zure GnuPG instalazioa eguneratu ezazu edo Enigmail-k ez du funtzionatuko. locateGpg=GnuPG programa bilatu invalidGpgPath=Emandako helbidearekin ezin da GnuPG exekutatu. Hortaz, Enigmail ezgaituta egongo da GnuPG-ren helbidea berriz sartu arte edo aplikazioa berrabiatu arte. warningsAreReset=Abisu guztiak berrezarri dira. prefs.gpgFound=GnuPG hemen aurkitu da: %S prefs.gpgNotFound=Ezin izan da GnuPG aurkitu prefs.warnAskNever=Kontuz: aukera hau aktibatzen bada hartzaile batentzako gakorik ez badago ez da e-posta zifratuko eta ez da horren abisurik egongo -- Enigmail-k ez dizu hori gertatzen delaren berri emango! prefEnigmail.oneKeyserverOnly=Errorea - gako-serbitzari bakarra jarri dezakezu falta diren OpenPGP gakoak deskargatzeko. # Strings used in enigmailSearchKey.js # gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. enterPass=Mesedez, zure OpenPGP pasahitza sartu ezazu enterPassOrPin=Mesedez, zure OpenPGP pasahitza edo zure SmartCard-aren PIN-a sartu ezazu repeatPass=Mesedez, zure OpenPGP pasahitza berriz sartu ezazu rememberPass=Pasahitza %S minutuz gogoratu enterAdminPin=Mesedez, zure SmartCard-aren ADMIN PIN-a sartu ezazu enterCardPin=Mesedez, zure SmartCard-aren PIN-a sartu ezazu notInit=Errorea - Enigmail serbitzua ez da oraindik hasieratu badCommand=Errorea - zifraketa komandoak huts egin du cmdLine=komando lerroa eta output: notRequired=Errorea - ez da zifraketarik behar notComplete=Errorea - gako sorketa ez da oraindik bukatu invalidEmail=Errorea - baliogabeko e-posta helbidea(k) noPassphrase=Errorea - ez da pasahitzik sartu noPGPblock=Errorea - Ez da OpenPGP babestutako datu blokerik aurkitu unverifiedReply=Mezuaren tabulatutako zatia (erantzuna) ziruenik aldatu zen decryptToImport=Argitu botoia sakatu ezazu mezuan dagoen gako publikoaren blokea inportatzeko sigMismatch=Errorea - Sinadurak ez datoz bat cantImport=Errorea gako publikoa inportatzerakoan\n\n sc.wrongCardAvailable=Zure irakurgailuan aurkitutako %S SmartCard-a ezin da mezua prozesatzeko erabili.\nMesedez, zure %S SmartCard-a sartu ezazu eta eragiketa errepikatu ezazu. sc.insertCard=Eragiketak zure %S SmartCard-a behar du.\nMesedez, behar den SmartCard-a sartu ezazu eta eragiketa errepikatu ezazu. sc.removeCard=Eragiketak irakurgailuan SmartCard-ik ez egotea behar du.\nMesedez, zure SmartCard-a atera ezazu eta eragiketa errepikatu ezazu. sc.noCardAvailable=Irakurgailuan ez da SmartCard-ik aurkitu.\nMesedez, zure SmartCard-a sartu eta eragiketa errepikatu ezazu. sc.noReaderAvailable=Zure SmartCard irakurgailua ezin da aurkitu.\nMesedez, zure SmartCard irakurgailua konektatu ezazu, zure txartela sartu eta eragiketa errepikatu ezazu. gpgNotFound=Ezin izan da '%S' GnuPG programa aurkitu.\nZiurtatu zaitez GnuPG exekutagarriaren helbidea zuzen jarri duzula Enigmail Lehentasunetan. gpgNotInPath=Ezin izan da PATH-ean GnuPG exekutagarria aurkitu.\nZiurtatu zaitez GnuPG exekutagarriaren helbidea zuzen jarri duzula Enigmail Lehentasunetan. enigmimeNotAvail=Enigmime Serbitzua ez dago eskuragarri gpgAgentNotStarted=Zure GnuPG %S bertsiorako behar den gpg-agent-a ezin izan da abiatu. prefUntrusted=MESFIDAGARRIA prefRevoked=EZEZTATUTAKO GAKOA prefExpiredKey=IRAUNGITAKO GAKOA prefExpired=IRAUNGITA prefGood=%S-ren sinadura ona prefBad=%S-ren sinadura OKERRA failCancel=Errorea - Gakoaren harrera erabiltzaileak utzi egin du failNoServer=Errorea - Gakoak jasotzeko gako-serbitzari iturubururik ez da jarri failNoID=Errorea - Ez da jasoko den gakoaren ID-a jarri failKeyExtract=Errorea - gakoaren aterapen komandoak huts egin du notFirstBlock=Errorea - Lehendabiziko OpenPGP blokea ez da gako publiko batena importKeyConfirm=Mezuan txertatuta dauden gakoak inportatu nahi al dituzu? failKeyImport=Errorea - Gakoaren inportazioak huts egin du fileWriteFailed=%S fitxategian idazterakoan huts egin du successKeyImport=Gakoa(k) arazorik gabe inportatu da/dira importKey=%S gako publikoa gako-serbitzaritik inportatu: uploadKey=%S gakoa gako-serbitzarira bidali: keyId=Gakoaren ID-a keyAndSigDate=Gakoaren ID-a: 0x%S / Sinatuta: %S keyFpr=Gakoaren hatz-marka: %S noEmailProvided=Ez duzu e-posta helbiderik eman! keyAlreadySigned=Gakoa dagoeneko sinatuta dago, ezin duzu bitan sinatu. # Strings in enigmailEditKeyTrustDlg.xul selKeyExpired=%S-n iraungita createdHeader=Sortuta atLeastOneKey=Ez da gakorik aukeratu! Gutxienez gako bat aukeratu behar duzu lehio hau adosteko fewerKeysThanRecipients=Hartzaile baino gako gutxiago aukeratu dituzu. Ziru zaude zifratzeko gakoen zerrenda osorik dagoela? userSel.button.goBack=Gako gehiago aukeratu userSel.secretKeySel.title=OpenPGP Gako Sekretu Bat Aukeratu Zure Mezuak Sinatzekoa # Strings in enigmailSignKeyDlg.js # Strings in enigmailKeyManager.js pgpMimeNote=OHARRA: PGP/MIME e-posta bezero kopuru txiki batek onartzen du! Windowsen bakarrik Mozilla/Thunderbird, Sylpheed, Pegasus eta Mulberry estandar hau honartzen dute; Lunux/UNIX eta Mac OS X-ko bezero hedatuenak onartzen dute. Ziur ez bazaude, %S aukera hautatu ezazu. first=lehendabiziko second=bigarren # Strings in enigmailViewKeySigDlg.xul encryptKeyHeader=Zifratzeko OpenPGP Gako Bat Aukeratu identityName=Nortasuna: %S # Strings in enigmailManageUidDlg.xul noEncryption=Zifraketa aktibatu duzu, baina ez duzu gakorik aukeratu. %S-ri bidalitako e-postak zifratzeko, zure gako zerrendaren baliodun gako bat edo gehiago hautatu behar duzu. %S-rentzat zifraketa ezgaitu nahi al duzu? noKeyToUse=(ezer - zifraketarik ez) noEmptyRule=Araua agian ez dago hutsik! Mesedez, e-posta helbide bat sartu ezazu Araua eremuan. invalidAddress=Sartutako e-posta(k) ez dira baliodunak. Ez zenituzke hartzaileen izenak sartu behar, bakarrik helbide elektronikoak. Adib.:\nBaliogabea: Izen Bat \nBalioduna: izen.bat@helbidea.net noCurlyBrackets=Giltzek {} esanahi berezia daukate eta ez lirateke helbide elektronikoetan erabili behar. Arau honen baterapen portaera aldatu nahi baduzu, 'Araua erabili hartzaileak ...' aukera erabili ezazu.\nInformazio gehiago Laguntza botoian eskuragarri dago. # Strings in enigmailKeyDetailsDlg.xul never=Inoiz always=Beti possible=Posible deleteRule=(Hurrengo hartzailea) negateRule=Ez # Strings in enigmailGenCardKey.xul needOnline=Aukeratu duzun ekintza ez dago eskuragarri konexiorik gabe. Mesedez, konektatu zaitez eta berriz saiatu. protocolNotSupported=Aukeratu duzun '%S://' protokoloa ez dago onartuta OpenPGP gakoak deskargatzeko. gpgkeysDisabled=Agian 'extensions.enigmail.useGpgKeysTool' aukera gaitzea lagundu dezake. noKeyserverConn=%S-n dagoen gako-serbitzarira ezin izan da konektatu. keyDownloadFailed=Gakoa deskargatzerakoan huts egin du. Egoera mezua:\n%S internalError=Barneko errore bat gertatu da. Gakoak ezin izan dira deskargatu edo inportatu. noKeyFound=Sentitzen dut baina ezin izan da jarri dituzun bilaketa irizpideekin gakorik aurkitu.\nOhartu zaitez gakoaren ID-a "0x" aurrizkia eraman behar duela (adib.: 0xABCDEF12). # Strings in enigmailSetCardPin.xul gpgKeysFailed=Gako-sebritzarian gakoa bilatu edo deskargatzerakoan errore bat egon da: gpgkeys_%S ezin izan da exekutatu. # Strings in enigRetrieveProgres.xul setKeyTrustFailed=Jabearekiko konfidantza jartzerakoan huts egin du # Strings in enigmailSetupWizard signKeyFailed=Gakoaren sinadurak huts egin du undefinedError=Errore ezezagun bat gertatu da. alreadySigned.label= Oharra: %S gakoa dagoeneko aukeratutako gako sekretuarekin sinatuta dago. # Strings in enigmailAddUidDlg.xul keyMan.loadingKeys=Gakoak kargatzen, mesedez itxaron ... keyValid.unknown=ezezaguna keyValid.invalid=baliogabea keyValid.disabled=ezgaituta keyValid.revoked=ezeztatuta keyValid.expired=iraungita keyValid.noSubkey=ubgako baliogabea keyValid.valid=balioduna keyTrust.untrusted=konfidantzarik ez keyTrust.marginal=txikia keyTrust.full=konfidagarria keyTrust.ultimate=azkenekoa keyTrust.group=(taldea) keyType.public=pub keyType.publicAndSec=pub/seg keyMan.enableKey=Gakoa Gaitu keyMan.disableKey=Gakoa Ezgaitu userAtt.photo=Erabiltzailearen ezaugarria (JPEG irudia) asciiArmorFile=ASCII Fitxategi Babestuak (*.asc) gnupgFile=GnuPG Fitxategiak saveRevokeCertAs=Ezeztapen Ziurtagiria Sortu eta Gorde revokeCertOK==Ezeztapen ziurtagiria sortu egin da. Zure gako publikoa ezgaitzeko erabili dezakezu, adibidez, zure gako sekretua galtzen baduzu.\n\nMesedez, toki seguru batean gorde daitekeen unitate batean gorde ezazu, CD edo flash memoria gailu batera adibidez. Norbaitek ziurtagiri hau lortuko balu zure gakoa baliogabetu lezake. revokeCertFailed=Ezeztapen ziurtagiria ezin izan da sortu. addUidOK=Erabiltzeile IDa gehitu egin da addUidFailed=Erabiltzaile IDa gehitzerakoan errore bat egon da noKeySelected=Aukeratutako eragiketa egiteko gutxienez gako bat aukeratu behar duzu exportToFile=Gako Publikoa Fitxategi Batera Esportatu exportSecretKey=Gako sekretua OpenPGP gako pribatuan fitxategian gorde nahi al duzu? saveKeysOK=Gakoak gorde egin dira saveKeysFailed=Gakoak ezin izan dira gorde importKeysFailed=Gakoak ezin izan dira inportatu enableKeyFailed=Gakoak ezin izan dira gaitu/ezgaitu specificPubKeyFilename=%S (0x%S) pub specificPubSecKeyFilename=%S (0x%S) pub-sec defaultPubKeyFilename=Esportatutako gako publikoak defaultPubSecKeyFilename=Esportatutako gako publiko eta pribatuak noSecretKeys=Ez da gako sekreturik aurkitu.\n\nZure gakoa orain sortu nahi al duzu? sendKeysOk=Gakoa(k) bidali egin dira sendKeysFailed=Gakoak ezin izan dira bidali receiveKeysOk=Gakoa(k) eguneratu dira receiveKeysFailed=Gakoak ezin izan dira deskargatu importFromClip=Arbeletik gakoak inportatu nahi al dituzu? copyToClipbrdFailed=Aukeratutako gakoak ezin izan dira arbelera kopiatu. copyToClipbrdOK=Gakoak arbelera kopiatu dira deleteSecretKey=KONTUZ: Gako pribatu bat ezabatzera zoaz!\nZure gako pribatua ezabatzen baduzu, ezin izango dituzu gako horrentzat zifratu diren mezuak argitu, eta ezin izango duzu zure gakoa ezeztatu.\n\nZiur zaude BI gakoak, gako publikoa eta gako pribatua, ezabatu nahi al dituzula\n'%S'? deleteMix=KONTUZ: Gako pribatuak ezabatzera zoaz!nZure gako pribatua ezabatzen baduzu, ezin izango dituzu gako horrentzat zifratu diren mezuak argitu.\n\nZiur zaude BI gakoak, aukeratutako gako publiko eta pribatua, ezabatu nahi dituzula? deletePubKey=Gako publikoa ezabatu nahi al duzu\n'%S'? deleteSelectedPubKey=Zure gako publikoak ezabatu nahi al dituzu? deleteKeyFailed=Gakoa ezin izan da ezabatu. revokeKeyAsk=Funtzio honek ezeztapen ziurtagiria sortu eta inportatzen du. Ziur zaude %S gakoa ezeztatu nahi duzula? revokeKeyOk=Gakoa ezeztatu egin da. Gakoa gako-serbitzari batean eskuragarri badago, gomendatzenda berriz igotzea, horrela besteek ezeztapena ikusi ahal izango dute. revokeKeyFailed=Gakoa ezin izan da ezeztatu. refreshAllQuestion=Ez duzi gakorik aukeratu. Gako GUZTIAK freskatu nahi al dituzu? refreshKey.warn=Kontuz. Gako kopuruaren arabera eta konexioaren abiaduraren arabera, gako guztiak freskatzea prozesu luzea izan daiteke! keyMan.button.exportSecKey=Gako &Sekretuak Esportatu keyMan.button.exportPubKey=Gako &Publikoak Esporatatu keyMan.button.import=&Inportatu keyMan.button.refreshAll=Gako Guztiak &Freskatu keyMan.button.revokeKey=Gakoa &Ezeztatu keylist.noOtherUids=Ez dauka beste nortasunik keylist.hasOtherUids=Goitizena keylist.noPhotos=Ez dago argazkirik keylist.hasPhotos=Argazkiak # strings in pref-enigmail.js keySignatureLocal=Lokala keySignatureExportable=Esportagarria keySignatureNoKey=Gakorik ez userIdNotFound=(Erabiltzaile ID-a ez da aurkitu) signatureValid=Bai retrieveKeyConfirm=Gakoa ez dago eskuragarri - gako-serbitzari batetik deskargatu nahi al duzu? changePrimUidFailed=Erabiltzaile ID primarioa aldatzerakoan huts egin du changePrimUidOK==Erabiltzaile ID primarioa aldatu egin da deleteUidFailed=Erabiltzaile ID %S-a ezabatzerakoan huts egin du deleteUidOK=Erabiltzaile ID %S-a ezabatu egin da revokeUidFailed=Ezin izan da erabiltzaile ID %S-a ezeztatu revokeUidOK=Erabiltzaile ID %S-a ezeztatu egin da. Zure gakoa gako-serbitzari batean eskuragarri badago, berriz igotzea gomendatzen da, horrela beste erabiltzaileek ezeztapena ikusi ahal izango dute. revokeUidQuestion=Ziur zaude %S erabiltzaile ID-a ezeztatu nahi duzula? deleteUidQuestion=Ziur zaude %S erabiltzaile ID-a ezabatu nahi duzula?\n\nOharra: zure gako publikoa gako-serbitzari batera igo baduzu, zure erabiltzaile ID-a ezabatzeak ez du ezer aldatuko. Kasu horretan 'Erabiltzaile ID-a Ezeztatu' erabili beharko zenuke. keyTypePublic=gako publikoa keyTypePrimary=gako primarioa keyTypeSubkey=sub-gakoa keyTypePair=gako bikotea keyExpiryNever=inoiz keyAlgorithm_1=RSA keyAlgorithm_2=RSA keyAlgorithm_3=RSA keyAlgorithm_16=ELG keyAlgorithm_17=DSA keyAlgorithm_20=ELG keygen.started=Mesedez, itxaron gakoa sortzen ari den bitartean .... keygen.completed=Gakoa sortu da. Gako berriaren ID berria: 0x%S keygen.keyBackup=Gakoa %S bezela babeskopiatu da keygen.passRequired=Mesedez, zure SmartCard-aren kanpoan babeskopia sortu nahi baduzu pasahitz bat sartu ezazu. cardPin.dontMatch=Sartu duzun PIN-a ez dator bat; mesedez berriz sartu cardPin.minLength=PIN-a gutxienez %S karaktere edo zenbaki izan behar ditu cardPin.processFailed=PIN-a ezin izan da aldatu keyserverProgress.refreshing=Gakoak freskatzen, mesedez itxaron... keyserverProgress.uploading=Gakoak igotzen, mesedez itxaron... keyserverTitle.refreshing=Gakoak Freskatu keyserverTitle.uploading=Gakoa Igo passphrase.min8keys=Zure pasahitzak gutxienez 8 karaktere izan beharko lituzke! setupWizard.applyAllId=Nortasun guztientzat Enigmail aktibatu setupWizard.applySomeId=Nortasun hauentzat Enigmail aktibatu: %S setupWizard.applySingleId=Zure e-posta kontuarentzat Enigmail aktibatu setupWizard.setAllPrefs=Gomendatutako aplikazioaren ezarpen guztiak aldatu setupWizard.setSomePrefs=Aukeratu dituzun gomendatutako aplikazioaren ezarpenak aldatu setupWizard.setNoPrefs=Ez aldatu aplikazioaren ezarpenik setupWizard.createKey=OpenPGP 2048-biteko gako berria sortu, 5 urteko balioarekin setupWizard.useKey=Esistitzen den OpenPGP %S gako ID-a erabili sinatzeko setupWizard.encryptAll=Lehenetsita e-posta guztiak zifratu setupWizard.encryptNone=Lehenetsita ez zifratu e-postarik setupWizard.signAll=Lehenetsita e-posta guztiak sinatu setupWizard.signNone=Lehenetsita ez sinatu e-postarik setupWizard.reallyCancel=Ziur zaude Enigmail Instalatzaile Laguntzailea itxi nahi duzula? addUidDlg.nameOrEmailError=Ezena eta helbide elektronikoa bete behar dituzu addUidDlg.nameMinLengthError=Izenak gutxienez 5 karaktere izan behar ditu addUidDlg.invalidEmailError=Baliodun helbide elektronikoa sartu behar duzu addUidDlg.commentError=Parentesiak ez dira komentarioetan onartzen enigmail-2.0.8/lang/eu/help/000077500000000000000000000000001334302754500155765ustar00rootroot00000000000000enigmail-2.0.8/lang/eu/help/compose.html000066400000000000000000000104321334302754500201310ustar00rootroot00000000000000 Enigmail Laguntza: Mezua Idatzi

Enigmail Laguntza

Enigmail erabiltzen mezuak idazterakoan

Enigmail menua e-posta idazteko lehioan
Mezua sinatu
Mezua sinatuta bidaltzeko aukera gaitu/ezgaitu. Erabiltzaileari ohar bat aterako zaio sinadurak huts egiten badu.
Mezua zifratu

Bidali aurretik hartzaile guztientzat mezua zifratzeko aukera gaitu/ezgaitu. Erabiltzaileari ohar bat aterako zaio zifraketak huts egiten badu.

Aukeraketa behar denean erakutsi Lehentasunak -> Gako Aukeraketa fitxan aktibatuta badago, gako zerrenda bat agertuko da hartzaile zerrendan dauden eta euren gako publikorik ez duzun hartzaileentzako.

Ez erakutsi inoiz OpenPGP gako aukeraketa lehioa Lehentasunak -> Gako Aukeraketa fitxan gaituta badago, eta hartzaile zerrendan dagoen hartzaile baten gako publikoa baldin ez baduzu, mezua zifratu gabe bidaliko da.

Mezu honetan PGP/MIME erabili
Mezu honetarako PGP/MIME erabilera gaitu/ezgaitu.

Hartzaileek e-postak PGP/MIME formatuan irakurri ditzaketela baldin badakizu, erabili beharko zenuke.

Ezaugarri honek Lehentasuanak -> PGP/MIME fitxan dauden PGP/MIME erabiltzen utzi edo Beti PGP/MIME erabili aukerekin dependentzia dauka.

Idazteko aukera lehenetsitak
  • Sinatu/Zifratu Aukerak...: Kontu Ezarpenak -> OpenPGP Aukerak-rantz laisterbidea
  • Bidalketa Aukerak...: Lehentasunak -> Bidali fitxarako laisterbidea
  • Gako aukeraketa aukerak...: Lehentasunak -> Gako aukeraketa fitxarako laisterbidea.
  • PGP/MIME aukerak...: Lehentasunak -> PGP/MIME fitxarako laisterbidea.
Zifraketa desegin

Mezua bidaltzerakoan arazoren bat baldin badago, adibidez, POP serbitzariak eskaera onartzen ez badu, Enigmail-ek ez du horren berri izango eta zifratutako mezua Idatzi lehioan agertzen jarraituko du. Menuaren aukera hau hautatuz sinadura/zifraketa desegingo du, Idatzi lehioa hasieran zegoen testura bueltatuz

Behin-behineko konponketa bezala, aukera hau erabili daiteke zifratutako mezuak erantzuterakoan aipatutako testua argitzeko. Enigmailek automatikoki aipatutako mezua argitu beharko luke, baina horrek huts egiten badu, menu aukera hau erabili dezakezu hori behartzeko

Gako publikoa txertatu
Idatzi lehioan, kurtsorea dagoen tokian ASCII-babestua formatuan gako publiko bloke bat txertatzen du. Txertatuko den/diren gakoen helbide elektronikoak eskatuko zaizkizu. Modu honetan sartzen diren gakoak, heltzerakoan Enigmailek automatikoki detektatuko ditu. Txertatu eta gero, e-posta oraindik sinatu edo zifratu dezakezu. Horretaz gain, ez ezazu gako bloke bat baino gehiago sartu mezu bakoitzeko; helbide elektroniko bat baino gehiago jarri nahi baduzu, eskatzen dizkizunean komen edo espazioen bitartez bereizita sartu itzazu.
Ezabatu gordetako pasahitza
Katxeatu den pasahitza ezabatzen du. Erabilgarria da pasahitz baino gehiago dituzunean.
Laguntza
Laguntza informazio weborria (orri hau) erakusten du.

Laguntza gehiago nahi baduzu, Enigmail Laguntza weborrian aurkitu dezakezu.

enigmail-2.0.8/lang/eu/help/editRcptRule.html000066400000000000000000000122301334302754500210700ustar00rootroot00000000000000 Enigmail Laguntza: OpenPGP Araua Editatu

Enigmail Laguntza

Enigmail Arau Editorea Erabiltzen: OpenPGP Araua Editatu

Arau editorean, hartzaile bakoitzaren lehenetsitako aukerak jarri ditzakezu zifraketa, sinadura, PGP/MIME eta ze OpenPGP gakoak erabiliko diren arloetan. Lehio honetan, hartzaile bakar batentzat arauak sartu ditzakezu eta, baita ere, antzeko ezaugarriak dituzten hartzaileentzat..

OpenPGP Arauak honetarako ezarri
Hartzaileen helbide elektronikoak izango ditu (izenik gabe, hau da, helbidea bakarrik norbait@helbidea.domeinua bezala). Helbide elektroniko bat baino gehiago sartu dezakezu hutsuneekin tartekatuz. Hemen sartzen diren helbideak domeinuaren zatiarekin bakarrik sartu daitezke, horrela domeniu horretako edozein helbide elektronikoarekin bat egingo du, adibidez @helbidea.domeinua domeinua norbait@helbidea.domeinua, edonor@helbidea.domeinua, eta abarrekin bat etorriko da.
Araua aplikatu hartzaileak...
Hoek helbide elektronikoen bateratzea aldatuko du. Helbide bat baino gehiago sartu badira, ezaugarri hau guztietara aplikatuko dira. Azpian dauden adibideak izena@helbidea.domeinua erabiliko dute goian dagoen OpenPGP Arauak eremuan.
  • Zehazki bada: ezaugarri honekin araua bakarrik aplikatuko da izena@helbidea.domeinua helbidearekin (zehazki, letra larriak eta xeheak ezberdindu gabe).
  • Badauka: ezaugarri honekin, testu hori daukan edozein helbiderekin bateratuko da, adibidez abizena_izena@helbidea.domeinua edo izena@helbidea.domeinua.net
  • Honekin hasten da: ezaugarri honekin, testu honekin hasten den edozein helbiderekin bateratuko da, adibidez izena@helbidea.domeinua.net, izena@helbidea.domeinua-izena.com.
  • Honekin bukatzen da da:ezaugarri honekin, testu honekin bukatzen den edozein helbiderekin bateratuko da, adibidez abizena_izena@helbidea.domeinua , ezizena@helbidea.domeinua.
Bat datozen helbideekin hurrengo arauarekin jarraitu
Funtzio honek arau bat definitzen uzten dizu Hurrengo OpenPGP gakoak erabili: eremuan GakoID-rik zehaztu behar izan gabe, horrela bidaltzeko momentuan helbide elektronikoa erabiliko da gakoa bilatzeko. Horretaz gain, helbide berdinentzat arau gehiago badaude, hauek ere prozesatuko dira.
Ez bilatu arau gehiago bateratutako helbideentzat
Aukera hau gaitzen baduzu, arau honekin bateratzen bada, prozesamenduak ez ditu arau gehiago bilatuko helbide honentzako; hau da, hurrengo hartzailearekin hasiko da.
Hurrengo OpenPGP gakoak erabili:
Gakoa(k) Aukeratu.. botoia erabili ezazu zifratzeko erabiliko diren hartzailearen gakoak aukeratzeko. Goiko ekintzaren moduan, arau honekin baterantzen diren helbideek ez dute prozesua jarraituko.
Sinatzeko Lehenetsita
Mezuaren sinadura gaitu edo ezgaitu. Honek mezua idazteko lehioan jarri duzuna erabili edo jaramonik ez egitea zehazten du. Balioak hauek izan daitezke:
  • Inoiz: sinadura ezgaitu, nahiz eta mezua idazteko lehioan bestela esanda (beste balioei ez die jaramonik egiten)
  • Bai, Mezua idazteko lehioan aukeratzen bada: sinadura mezua idazteko lehioan jartzen duen bezela egin
  • Beti: sinadura gaitu, mezua idazteko lehioan aukera hori gaituta egonez arren
Sinadura ezarpen hauek bateratzen diren arau guztietara aplikatuko da. Arau batek sinadura ezgatzen badu, mezua ez da sinatuko, nahiz eta beste arau batzuk Beti esaten duten.
Zifraketa
Mezuaren zifraketa gaitu edo ezgaitu. Jarri daitezken ezaugarriak eta euren esanahia sinaduran daudenen berdinak dira.
PGP/MIME
PGP/MIME (RFC 3156) mezu kodifikazioa gaitu edo ezgaitu. PGP/MIME ezgaituta badago, mezuak "txertatutako PGP" erabiliz kodifikatuko dira. Jarri daitezken ezaugarriak eta euren esanahia sinaduran daudenen berdinak dira.

Arauak OpenPGP Arau Editorean dagoen zerrendaren ordenean prozesatuko dira. Hartzaile batek arau batekin bat datorrenean eta arau horrek OpenPGP gako ID-a badauka, gako ID hori erabiltzeaz gain, hartzailea ez da gehiago kontutan izango ondorengo arauak prozesatzerakoan.


Laguntza gehiago nahi baduzu Enigmail Hartzaile Bakoitzeko Ezaugarriak weborrian aurkitu dezakezu

enigmail-2.0.8/lang/eu/help/initError.html000066400000000000000000000046511334302754500204470ustar00rootroot00000000000000 Enigmail Laguntza: Nola Konpondu OpenPGP Hasieratzerakoan Dauden Arazoak

Enigmail Laguntza

Nola Konpondu OpenPGP Hasieratzerakoan Dauden Arazoak

Arrazoi asko egon daitezke OpenPGP hasieratzerakoan errorea emateko. Ohikoenak azpian agertzen dira; informazio gehiago nahi baduzu, Enigmail Laguntza weborrian aurkitu dezakezu.

GnuPG ezom ozam da aurkitu

OpenPG funtzionatu dezan GnuPG tresna instalatuta egon behar du. GnuPG ezin izan bada aurkitu, lehendabizi gpg.exe (Windows-en; gpg beste plataformetan) exekutagarria zure ordenagailuan instalatuta dagoela ziurtatu zaitez. GnuPG instalatuta badago eta OpenPGP-k ezn badu aurkitu, OpenPGP lehentasunetan (menua OpenPGP > Lehentasunak) GnuPG-ren helbidea eskuz jarri beharko diozu.

Enigmime hasieratzerakoan huts egin du

OpenPGP bakarrik funtzionatuko du Thunderbird edo SeaMonkey eraiki ziren ingurune berdinean eraki bada. Horrek esan nahi du, Enigmail-en bertsio ofiziala bakarrik mozilla.org argitaratutako Thunderbird edo SeaMonkey bertsio ofizialekin bakarrik erabili daitekeela.

Beste jatorri bat daukan Thunderbird edo SeaMonkey erabiltzen baduzu (adibidez, zure Linux banaketarekin datorrena), edo zuk zeuk aplikazioa eraiki baduzu, jatorri berdinarekin eraiki den Enigmail bertsio bat erabili beharko zenuke, edo zuk zeuk Enigmail eraiki. Enigmail erakitzeko Iturburu Kodea atalera jo ezazu Enigmail weborrian. Mesedez, ez bidali akats txosten bat arazo honekin, konponketarik ez baitauka.

Informazio gehiago nahi baduzu Enigmail Laguntza weborrian aurkitu dezakezu.

enigmail-2.0.8/lang/eu/help/messenger.html000066400000000000000000000105321334302754500204550ustar00rootroot00000000000000 Enigmail Laguntza: Mezuak Irakurri

Enigmail Laguntza

Enigmail erabili mezuak irakurtzeko

Posta lehioan dagoen Argitu botoia
Botoi hau gauza askotarako erabili daiteke: argitu, egiaztatu edo gako publikoak inportatzeko. Normalean, argitzea/egiaztatzea automatikoki egiten da, baina aukera hau ezgaitu daiteke lehentasun baten bitartez. Honek huts egiten badu, normalean Enigmailen egoera-lerroan mezu motz bat agertuko da. Argitu botoian klik eginez, xehetasun gehiago dituen errore mezua ikusi ahal izango duzu, GnuPG komandoaren irteeera barne.
Idazluma eta Giltza ikonoak Mezuaren Goiburuan
Idazluma eta Giltza ikonoek mezua sinatuta edo/eta zifratuta dagoela erakusten dute, baita sinadura ona bada ere, hau da, mezua sinatu zenetik aldatu baldin ez bada. Mezua aldatu baldin bada, Idazluma ikonoa Idazluma Apurtu batera aldatuko da sinadura oker dagoela adierazteko. Idazluma eta giltza ikonoetan eskubiko klik eginez hurrengo aukerak dituen menua agertuko da:
  • OpenPGP Sekurtasun informazioa: GnuPG-k mezuarentzat atera duen egoera erakutsiko dizu.
  • OpenPGP Sekurtasun informazioa kopiatu: GnuPG-k atera duen egorea arbelera kopiatuko du; adibidez, erantzun batean itxasteko e.a.
  • OpenPGP argazki ID-a ikusi: mezua bidali zuen pertsonaren Argazki ID-a erakutsiko dizu, euren argazkia gako publikoaren barruan txertatu baldin badu.(Aukera hau gaituta agertuko da bakarrik beraren gakoan Argazki ID-a txertatuta baldin badago.)
  • S/MIME Sekurtasun informazioa: mezuaren S/MIME sekurtasun informazioa erakutsiko dizu.

Zure gpg.conf fitxategian gako-serbitzari-aukerak gakoak-auto-inportatu gaituta ez baldin baduzu eta sinatutako edo zifratutako mezu bat irakurtzen baduzu, goiburuan dagoen Idazluma ikonoak Galdera ikur bat izango du, eta goiburuan dagoen Enigmail egoera-lerroak hurrengoa esango du: Mezuaren zati bat sinatuta dago; xehetasunentzako idazluma ikonoak klik egin ezazu; horretaz gain mezu panelean OpenPGP mezu bolkearen adierazleak eta sinadura blokeak erakutsiko ditu.

Hau ere ikusi dezakezu zure gpg.conf fitxategian gako-serbitzari-aukerak gakoak-auto-inportatu gaituta gaituta badaukazu eta mezuaren OpenPGP gakoa lehenetsitako gako-serbitzarian eskuragarri ez baldin badago.

Idazluma eta Galdera ikurra ikonoan klik egiten baduzu, gakoa zure gako giltzatakoan ez dagoela abisatzeko lehioa agertuko da. Ados sakatuz, beste lehio bat erakutsiko da, honetan gako-zerbitzari zerrenda bat agertuko da eta bertan igorlearen gako publikoa deskargatzeko serbitzaria aukeratu ahal izango duzu.

Erabiliko diren gako-serbitzaren zerrenda konfiguratzeko, Enigmail -> Lehentasunak -> Oinarrizkoak fitxara joan zaitez eta gako-serbitzarien helbideak Gako-serbitzaria(k): eremuan sartu itzazu koma bitartez bananduz. Zerrendan dagoen lehendabiziko gako-serbitzaria lehenetsitakoa bezela erabiliko da

Zifratutako eranskikak ireki / Erantsitako OpenPGP gakoak inportatu
*.pgp, *.asc eta *.gpg luzapena duten eranskinak Enigmailek bereziak bezala identifikatuko ditu eta tratamendu berezia emango die. Eranskin hauetan eskubiko klik egiten baduzu, laister-menuan bi sarrera berezi agertuko dira: Argitu eta Ireki eta Argitu eta Gorde. Bi menu sarrera hauek erabili itzazu eranskinak ireki edo gorde baino lehen argitu nahi badituzu. Eranskin bat OpenPGP gako fitxategi bat bezela antzematen badu, zure giltzatakoan gakoak inportatzeko aukera emango dizu.

Laguntza gehiago nahi baldin baduzu Enigmail Laguntza weborrian aurkitu dezakezu.

enigmail-2.0.8/lang/eu/help/rulesEditor.html000066400000000000000000000061631334302754500207730ustar00rootroot00000000000000 Enigmail Laguntza: Arau Editorea

Enigmail Laguntza

Enigmail Arau Editorea Erabiltzen

Arau editorean, hartzaile bakoitzaren lehentasunak jarri ditzakezu zifraketa, sinadura eta PGP/MIME gaitzeko, baita ze OpenPGP gako erabiliko diren. Arau bakotzak lerro batean agertzen diren 5 eremu dira:

E-posta
Hartzailea:, Cc: eta Bcc: eremuekin bateratuko den helbide elektronikoa(k). Bateratzea testu zatietan lan egiten du (Xehetasun geiago Araua Editatu lehioan aurkitu daitezke)
OpenPGP Gakoa(s)
hartzailearentzat erabiliko diren OpenPGP gako ID zerrenda
Sinatu
mezuaren sinadura gaitu edo ezgaitu. Honek mezua idazteko lehioan jarrtzen diozunaren arabera edo haiei jaramonik egin gabe lan egin dezake. Balioak honakoak dira:
  • Inoiz: sinadura ezgaitu, mezua idazteko lehioan gaituta egon arren (beste balioei ez die jaramonik egiten)
  • Posible: sinadura mezua idazteko lehioan agertzen denaren arabera egingo da
  • Beti: sinaduar gaitu, mezua idazteko lehioan aukera hori gaituta egon ez arren

Sinadura ezarpen hauek bateratzen diren arau guztiekin aplikatzen da. Arau batek sinadura ezgaitzen badu, mezua ez da sinatuko, nahiz eta beste arauek Beti esaten duten.

Zifratu
mezuaren zifraketa gaitu edo ezgaitu. Onartutako ezarpenak eta euren esanahia sinadurarenak bezalakoak dira.
PGP/MIME
PGP/MIME (RFC 3156) mezu kodifikazioaren erabilera gaitu edo ezgaitu. PGP/MIME ezgaituta badago, mezuak "txertatutako PGP" erabiliz erabiliko dira. Onartutako ezarpenak eta euren esanahia sinadurarenak bezalakoak dira.

Arauak zerrendan agertzen diren ordenean prozesatuko dira. Hartzaile batek arau batekin bat datorrenean eta arau horrek OpenPGP gako ID-a badauka, gako ID hori erabiltzeaz gain, hartzailea ez da gehiago kontutan izango ondorengo arauak prozesatzerakoan.

Oharra: Arau editorea oraindik bukatu gabe dago. Arau aurreratuagoak egin daitezke arau fitxategia zuzenean editatuz (arau hauek ez lirateke inoiz gehiago arau editorearekin editatu behar).Informazio gehiago nahi baduzu arau fitxategia zuzenean editatzeari buruz Enigmail weborrian aurkitu dezakezu


Laguntza gehiago nahi baduzu Enigmail Laguntza weborrian aurkitu dezakezu

enigmail-2.0.8/lang/eu/help/sendingPrefs.html000066400000000000000000000047771334302754500211320ustar00rootroot00000000000000 Enigmail Help: Edit OpenPGP Rule

Enigmail Help

Defining Preferences to Send Encrypted

In the Sending Preferences you can choose the general model and preferences for encryption.

Convenient Encryption
With these settings, emails are encrypted without confirmation whenever possible.

This setup is appropriate, if you just want to improve your privacy by sending emails encyrpted instead of unencrypted if that's possible.

The effect is like sending emails as letters instead of postcards. Unlike postcards, letters usually hide their contents while in transit.

Note however that as with letters you can't be sure that nobody is opening the letter while it is in transit (although, some technical effort is necessary for that).

A concrete risk is that you accidentally use "faked keys" you got from somewhere or somebody claiming that the key belongs to the person you want to send emails to. To avoid this risk, you can either use the trust model of PGP (see below) or you should always verify, whether the fingerprint of a public key is correct.

Manual Encryption
This option allows you to specify the different preferences for encryption according to your needs. You can specify
  • whether replies to encrypted/signed emails should automatically also be encrypted/signed-
  • whether to use the trust model of OpenPGP to accept keys (this means that to use a key you either have to sign the key or have enough other people you trust having signed the key).
  • whether you want to automatically send emails encrypted if all keys are accepted.
  • whether and when you want to finally confirm sending an email.
If it is important for you that content you send encrypted can't be read by other people or organizations, you should use the manual preferences at least choose the option to accept keys only if you or other people signed them. While this model reduces the risk of using faked keys, it requires that you actively sign keys and declare owner trust using the key managament dialog. enigmail-2.0.8/lang/fi/000077500000000000000000000000001334302754500146335ustar00rootroot00000000000000enigmail-2.0.8/lang/fi/am-enigprefs.properties000066400000000000000000000001251334302754500213240ustar00rootroot00000000000000# Strings used in the Mozill AccountManager prefPanel-enigprefs=OpenPGP-turvallisuus enigmail-2.0.8/lang/fi/enigmail.dtd000066400000000000000000001421771334302754500171310ustar00rootroot00000000000000 "-merkeillä"> "-merkeillä GnuPG:lle. Poista asetus käytöstä jos vastaanottajilla on vanhoja Hushmail-avaimia."> Huom: Avaimen luominen voi kestää jopa useita minuutteja. Älä sulje ohjelmaa kun avainta luodaan. Tietokoneen aktiivinen käyttäminen avainta luotaessa lisää avaimen luontiin tarvittavaa satunnaisuutta ja siten nopeuttaa luontiprosessia. Enigmail ilmoittaa kun avain on valmis."> " on virheellinen"> Huom: Avaimen luominen voi kestää jopa useita minuutteja. Älä sulje ohjelmaa kun avainta luodaan. Enigmail ilmoittaa kun avain on valmis."> Huom.: Enigmail varmentaa jokaisen sähköpostin allekirjoitukset riippumatta tilistä tai käyttäjätunnuksesta"> Kiitos Enigmail-tiimin puolesta."> enigmail-2.0.8/lang/fi/enigmail.properties000066400000000000000000001520711334302754500205440ustar00rootroot00000000000000Enigmail=Enigmail ##################################################################### # Strings used within enigmailCommon.js and enigmailCommon.jsm ##################################################################### enigAlert=Enigmail-hälytys enigConfirm=Enigmail-vahvistus # enigInfo=Enigmail Information enigError=Enigmail-virhe enigPrompt=Enigmail-kehote dlgYes=Kyllä dlgNo=Ei dlgKeepSetting=Muista vastaukseni, äläkä kysy uudestaan dlgNoPrompt=Älä näytä tätä huomioikkunaa uudestaan dlg.button.delete=&Poista dlg.button.cancel=&Peruuta dlg.button.close=&Sulje dlg.button.continue=Jatka dlg.button.skip=&Ohita # dlg.button.overwrite=&Overwrite dlg.button.view=&Näytä # dlg.button.retry=&Retry # dlg.button.ignore=&Ignore # dlg.button.install=&Install # dlg.button.ok=&OK repeatPrefix=\n\nTämä hälytys toistetaan %S repeatSuffixSingular=kerran. repeatSuffixPlural=kertaa. noRepeat=\n\nTämä hälytys toistetaan vasta Enigmailin seuraavan päivityksen yhteydessä. pgpNotSupported=Käytät ilmeisesti PGP 6.x:ä Enigmail:n kanssa.\n\nPGP 6.x:n toiminnassa on kuitenkin ongelmia, joiden takia Enigmail ei toiminut kunnolla ja siksi Enigmail ei enää tue PGP 6.x:ä. Käytä PGP:n sijaan GnuPG:tä.\n\nTarvittaessa Enigmailin kotisivujen ohjesivulta löytyy ohjeita GnuPG:n siirtymisestä # initErr.howToFixIt=In order to use Enigmail, GnuPG is required. If you did not install GnuPG yet, the easiest way to do this is using the "Setup Wizard" button below. # initErr.setupWizard.button=&Setup Wizard passphraseCleared=Salasanamuisti tyhjennettiin. # cannotClearPassphrase=You are using a non-standard tool (such as gnome-keyring) for passphrase handling. Clearing the passphrase is therefore not possible from within Enigmail. noPhotoAvailable=Ei kuvaa debugLog.title=Enigmail Debug Log error.photoPathNotReadable=Kuvan polku '%S' ei ole luettavissa # generalError=Error: %S # Strings in configure.jsm enigmailCommon.versionSignificantlyChanged=Enigmailin uudessa versiossa on olennaisia muutoksia asetuksissa ja vaihtoehdoissa. Pyrimme siirtämään vanhat asetukset uuteen versioon. Emme kuitenkaan voi varmistaa kaikkia tapauksia automaattisesti. Ole hyvä, tarkista eri asetukset ja vaihtoehdot asennuksen jälkeen. enigmailCommon.checkPreferences=Tarkista asetukset.. # preferences.defaultToPgpMime=We have changed the default message encoding in Enigmail from Inline-PGP to PGP/MIME. We recommend you keep this as default.\n\nIf you still wish to use Inline-PGP by default, you can do so in the Account Settings under OpenPGP Security. ##################################################################### # Strings in enigmailAbout.js ##################################################################### usingVersion=Enigmailin versio %S käynnissä # enigmailPepVersion=Enigmail/p≡p version %S usingAgent=Salaamiseen ja salauksen purkamiseen käytetään ohjelman %S tiedostoa %S agentError=VIRHE: Enigmime-palveluun ei saatu yhteyttä ##################################################################### # Strings in enigmailKeygen.js ##################################################################### accessError=Virhe käytettäessä Enigmail-palvelua onlyGPG=Avaimen luominen onnistuu vain GnuPG-ohjelman kanssa (Ei PGP:n kanssa). keygenComplete=Avain luotu! Käyttäjätieto <%S> käyttää avainta viestien allekirjoittamiseen. revokeCertRecommended=Mitätöintivarmenteen luominen avaimelle on suositeltua. Avaimen voi mitätöidä sillä jos avain esimerkiksi hukkuu tai joutuu vääriin käsiin. Luodaanko mitätöintivarmenne? keyMan.button.generateCert=&Luo sertifikaatti genCompleteNoSign=Avain luotu! genGoing=Avaimen luonti on jo käynnissä. passNoMatch=Salasanat eivät täsmää. Kirjoita ne uudelleen passCheckBox=Valitse, jos avaimelle ei aseteta salasanaa passUserName=Kirjoita käyttäjätiedoista puuttuva käyttäjätunnus # keygen.missingUserName=There is no name specified for the selected account/identity. Please enter a value in the field "Your name" in the account settings. # keygen.passCharProblem=You are using special characters in your passphrase. Unfortunately, this can cause troubles for other applications. We recommend you choose a passphrase consisting only of any of these characters:\na-z A-Z 0-9 /.;:-,!?(){}[]%* passSpaceProblem=Teknisistä syistä, tunnuslauseen voi aloittaa tai päättää välilyöntiin changePassFailed=Salasanan vaihtaminen epäonnistui. keyConfirm=Luodaanko julkinen ja salain avain käyttäjälle "%S"? keyMan.button.generateKey=&Luo avain keyAbort=Peruutetaanko avaimen luonti? keyMan.button.generateKeyAbort=&Keskeytä avainten luonti keyMan.button.generateKeyContinue=&Jatka varmenteen luontia expiryTooLong=Avaimen vanhenemisaika ei voi ylittää 100:a vuotta. expiryTooLongShorter=Et pysty määrittämään avaimen vanhenenemista yli 90 vuoden päähän. expiryTooShort=Avain ei voi vanheta alle päivässä. keyGenFailed=Avaimen luonti epäonnistui. Tarkista yksityiskohdat Enigmail-konsolin viesteistä (Valitse Enigmail > Enigmail:n virheenjäljitys). setKeyExpirationDateFailed=Päättymispäivää ei ole muutettu # Strings in enigmailMessengerOverlay.js securityInfo=Enigmail-turvallisuustietoja\n\n enigHeader=Enigmail: enigContentNote=Enigmail: *Tämän viestin liitteitä ei ole allekirjoitettu tai salattu*\n\n possiblyPgpMime=Viesti on mahdollisesti PGP/MIME-salattu tai -allekirjoitettu. Napsauta Pura-painiketta varmistaaksesi saveAttachmentHeader=Enigmail: Tallenna purettu liitetiedosto noTempDir=Väliaikaista tallennuskansiota ei löytynyt\nAseta TEMP-ympäristömuuttuja attachmentPgpKey=Avattava liite "%S" vaikuttaa OpenPGP-avaintiedostolta.\n\nTuo avaimet napsauttamalla Kyllä tai napsauta Ei näyttääksesi tiedoston sisällön beginPgpPart=********* *SALATTU tai ALLEKIRJOITETTU OSA ALKAA* ********* endPgpPart=********** *SALATTU tai ALLEKIRJOITETTU OSA LOPPUU* ********** notePartEncrypted=Enigmail: *Osia viestistä EI OLE allekirjoitettu tai salattu* noteCutMessage=Enigmail: *Viesti on jaettu useaan lohkoon -- Salauksen purku tai allekirjoituksen varmistus peruutettiin* decryptOkNoSig=Varoitus\n\nSalauksen purkaminen onnistui, mutta allekirjoitus ei varmistunut oikein msgOvl.button.contAnyway=&Jatka # signature.verifiedOK=The signature for attachment %S was successfully verified signature.verifyFailed=Allekirjoituksen liitetiedostoja %S ei voitu vahvistaa # attachment.noMatchToSignature=Could not match attachment '%S' to a signature file # attachment.noMatchFromSignature=Could not match signature file '%S' to an attachment # fixBrokenExchangeMsg.failed=Did not succeed to repair message. # enigmail.msgViewColumn.label=Enigmail # enigmailPep.msgViewColumn.label=Enigmail/p≡p # wksNoIdentity=This key is not linked to any of your email accounts. Please add an account for at least one of the following email addresse(s):\n\n%S # wksConfirmSuccess=Confirmation email sent. # wksConfirmFailure=Sending the confirmation email failed. # autocrypt.importSetupKey.accountPreconfigured=Your account is already correctly configured for Autocrypt.\n\nDo you really want to overwrite your settings with this setup message? # autocrypt.importSetupKey.selfCreated=This message was created by your currently running instance of Enigmail.\n\nPlease switch to the email client to which you want to transfer the settings, and click on the message on that email client to import the settings. # autocrypt.importSetupKey.invalidMessage=Error - could not read setup message. The message seems to be corrupted. Please try to create a new setup message on your "other" device. # autocrypt.importSetupKey.invalidKey=Error - the key could not be imported. The key is either not supported by your version of GnuPG, or it got corrupted. # autocrypt.importSetupKey.wrongPasswd=The password you entered is wrong. Do you want to retry? # autocrypt.importSetupKey.success=The Autocrypt setup message was processed successfully. Autocrypt is now available for your account '%S'. ##################################################################### # Strings in enigmailMsgComposeOverlay.js ##################################################################### keysToExport=Valitse viestiin liitettävät OpenPGP-avaimet keysToUse=Valitse OpenPGP-avaimet osoitesuotimelle %S pubKey=Käyttäjätunnuksen %S julkinen avain\n windowLocked=Viestin kirjoitusikkuna on lukittu. Viestin lähetys peruttu. sendUnencrypted=Enigmailin alustus epäonnistui.\nLähetetäänkö viesti salaamattomana? composeSpecifyEmail=Anna ensisijainen sähköpostiosoitteesi, jonka perusteella lähtevien viestien allekirjoitusavain valitaan.\nJos et anna sähköpostiosoitetta, jokaisen viestin allekirjoitusavain valitaan viestin lähettäjäkentän perusteella. # sendingHiddenRcpt=This message has BCC (blind copy) recipients. If this message is encrypted, it is possible to hide the BCC recipients but users of some products (e.g. PGP Corp.) will not be able to decrypt the message. Given this, we recommend to avoid BCC-emails with encrypted messages. # sendWithHiddenBcc=Hide BCC recipients sendWithShownBcc=Salaa normaalisti sendingNews=Salatun viestin lähetys peruttiin.\n\nTätä viestiä ei voi salata koska yksi vastaanottajista on keskusteluryhmä. Lähetä viesti uudestaan salaamattomana. sendToNewsWarning=Varoitus: olet aikeissa lähettää salattua sähköpostia uutisryhmään.\n\nTämä ei ole suotavaa. Se on järkevää ainoastaan silloin, kun kaikki ryhmän jäsenet voivat purkaa viestin. Eli viesti on salattu ja avain on kaikilla ryhmään osallistujilla. Lähetä tämä viesti vain, jos tiedät tarkalleen mitä olet tekemässä.\n\nHaluatko jatkaa? hasHTML=HTML-postin varoitus:\nViesti saattaa sisältää HTML-koodia, jonka vuoksi viestin salaus tai allekirjoitus voi epäonnistua. Voit vastaisuudessa lähettää allekirjoitettuja viestejä painamalla Shift-näppäintä napsauttaessasi Kirjoita viesti tai Vastaa viestiin -painiketta.\nJos allekirjoitat viestisi oletuksena, sinun kannattaa ottaa HTML-muotoisten viestien lähetys pois päältä tiliasetuksista. strippingHTML=Viestissä on HTML-muotoiluja, jotka katoavat kun viesti muunnetaan allekirjoituksen tai salauksen vuoksi pelkäksi tekstiksi. Jatketaanko muuntoa? msgCompose.button.sendAnyway=&Lähetä viesti joka tapauksessa attachWarning=Tämän viestin liitteet ovat linkitettyjä ja niitä ei voi salata. Salataksesi tiedostot, tallenna ne ensin kiintolevyllesi ja liitä ne sitten viestiin. Jatketaanko kaikesta huolimatta? quotedPrintableWarn=Lähtevien viestien "quoted printable"-koodaus on käytössä. Koodauksen takia viestiesi allekirjoitus ja salaus voidaan tulkita virheelliseksi.\nOtetaanko "quoted-printable"-koodaus pois käytöstä? minimalLineWrapping=Viestit rivittyvät tällä hetkellä %S merkin leveyteen. Jotta viestejä voi salata tai allekirjoittaa, merkkejä täytyy mahtua riville vähintään 68.\nMuutetaanko riville mahtuvien merkkien määrä 68:ksi? warning=Varoitus signIconClicked=Olet muokannut allekirjoitusta. Tämän takia kirjoittaessasi tätä viestiä, allekirjoittaminen ja viestin salaaminen eivät enää riipu toisistaan. # errorOwnKeyUnusable=The key ID '%S' configured for the current identity does not yield a usable OpenPGP key.\n\nPlease ensure that you have a valid, not expired OpenPGP key and that your account settings point to that key.\nIf your key is not expired, then check if you did set Owner trust to full or ultimate. # msgCompose.cannotSaveDraft=Error while saving draft # msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information - partially encrypted email. # msgCompose.partiallyEncrypted.mimeMsg=The message you are replying to contained both unencrypted and encrypted parts. Some encrypted message parts are invisible to you.\n\nIf the sender was not able to decrypt the hidden message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nWe recommend that you don't reply to the message, but create a new message containing your answer. # msgCompose.partiallyEncrypted.inlinePGP=The message you are replying to contained both unencrypted and encrypted parts. If the sender was not able to decrypt some message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nPlease consider removing all quoted text from your reply to this sender. # msgCompose.internalEncryptionError=Internal Error: promised encryption disabled # msgCompose.internalError=An internal error has occurred. msgCompose.toolbarTxt.signAndEncrypt=Tämä viesti tullaan allekirjoittamaan ja salataan # msgCompose.toolbarTxt.signOnly=This message will be signed # msgCompose.toolbarTxt.encryptOnly=This message will be encrypted # msgCompose.toolbarTxt.noEncryption=This message will be unsigned and unencrypted # msgCompose.toolbarTxt.disabled=Enigmail is disabled for the selected identity # msgCompose.protectSubject.tooltip=Protect the message subject # msgCompose.noSubjectProtection.tooltip=Do not protect the message subject # msgCompose.encryptedSubjectStub=Encrypted Message # msgCompose.protectSubject.dialogTitle=Enable Protection of Subject? # msgCompose.protectSubject.question=Regular encrypted emails contain the unredacted subject.\n\nWe have established a standard to hide the original subject in the encrypted message\nand replace it with a dummy text, such that the subject is only visible after the email is decrypted.\n\nDo you want to protect the subject in encrypted messages? # msgCompose.protectSubject.yesButton=&Protect subject # msgCompose.protectSubject.noButton=&Leave subject unprotected # msgCompose.detailsButton.label=Details ... # msgCompose.detailsButton.accessKey=D # msgCompose.pepSendUnknown=Unknown # msgCompose.pepSendUnsecure=Unsecure # msgCompose.pepSendSecure=Secure # msgCompose.pepSendTrusted=Secure & Trusted # pep.alert.disabledForIdentity=p≡p is disabled for the current identity. Please enable p≡p via the Enigmail/p≡p preferences. # pep.alert.weakReply=You’re about to forward or reply to a secure message as insecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? # note: should end with double newline: sendAborted=Viestin lähetys peruttiin.\n\n # details: # keyNotTrusted=Not enough trust for key '%S' # keyNotFound=Key '%S' not found # keyRevoked=Key '%S' revoked # keyExpired=Key '%S' expired statPGPMIME=PGP/MIME # statSMIME=S/MIME statSigned=ALLEKIRJOITETTU statEncrypted=SALATTU statPlain=SELKOKIELINEN offlineSave=Tallennetaanko %S viesti vastaanottajalle %S lähtevien viestien kansioon? onlineSend=Lähetä %S viesti vastaanottajalle %S? encryptKeysNote=Huom.: viesti on salattu seuraavilla käyttäjätunnuksilla / avaimilla: %S # hiddenKey= signFailed=Enigmail-virhe. Salaus tai allekirjoitus epäonnistui. Lähetetäänkö viesti salaamatta? msgCompose.button.sendUnencrypted=Lähetä salaamaton viesti recipientsSelectionHdr=Valitse vastaanottajat joiden viestit salataan configureNow=Valittua käyttäjää ei ole asetettu käyttämään Enigmail-turvallisuutta. Muokataanko asetuksia nyt? # encryption/signing status and associated reasons: # encryptMessageAuto=Encrypt Message (auto) # encryptMessageNorm=Encrypt Message # signMessageAuto=Sign Message (auto) # signMessageNorm=Sign Message # encryptOff=Encryption: OFF # encryptOnWithReason=Encryption: ON (%S) # encryptOffWithReason=Encryption: OFF (%S) # encryptOn=Encryption: ON # signOn=Signing: ON # signOff=Signing: OFF # signOnWithReason=Signing: ON (%S) # signOffWithReason=Signing: OFF (%S) # reasonEnabledByDefault=enabled by default # reasonManuallyForced=manually forced # reasonByRecipientRules=forced by recipient rules # reasonByAutoEncryption=forced by auto encryption # reasonByConflict=due to conflict in recipient rules # reasonByEncryptionMode=due to encryption mode # should not be used anymore: encryptYes=Viesti salataan encryptNo=Viestiä ei salata # should not be used anymore: signYes=Viesti allekirjoitetaan signNo=Viestiä ei allekirjoiteta # PGP/MIME status: # pgpmimeNormal=Protocol: PGP/MIME # inlinePGPNormal=Protocol: Inline PGP # smimeNormal=Protocol: S/MIME # pgpmimeAuto=Protocol: PGP/MIME (auto) # inlinePGPAuto=Protocol: Inline PGP (auto) # smimeAuto=Protocol: S/MIME (auto) # should not be used anymore # pgpmimeYes=PGP/MIME will be used # pgpmimeNo=Inline PGP will be used # Attach own key status (tooltip strings): # attachOwnKeyNo=Your own key will not be attached # attachOwnKeyYes=Your own key will be attached # attachOwnKeyDisabled=Your own key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. rulesConflict=Vastaanottajakohtaisissa säännöissä ristiriitoja\n%S\n\nLähetetäänkö viesti näillä asetuksilla? msgCompose.button.configure=&Määritä msgCompose.button.send=&Lähetä viesti msgCompose.button.save=&Talllenna viesti # Strings in enigmailMsgHdrViewOverlay.js keyNeeded=Allekirjoituksen varmistamiseen tarvitaan osoitteen %S julkinen avain # keyUsed=Public key %S used to verify signature clickDecrypt=. Napsauta Salauksen purkamis -painiketta clickDecryptRetry=. Napsauta Salauksen purkamis -painiketta yrittääksesi uudestaan # clickDetailsButton=; click on 'Details' button for more information # clickImportButton=; click on the 'Import Key' button to import the key # keyTypeUnsupported=; the key type is not supported by your version of GnuPG msgPart=Osa viestistä %S msgSigned=allekirjoitettu # msgSignedUnkownKey=signed with unknown key msgEncrypted=salattu msgSignedAndEnc=allekirjoitettu ja salattu unverifiedSig=Varmistamaton allekirjoitus incompleteDecrypt=Salauksen purkaminen ei ole täydellinen needKey=Virhe - salauksen purkaminen vaatii salaisen avaimen failedDecrypt=Virhe - salauksen purkaminen epäonnistui badPhrase=Virhe - väärä salasana failedDecryptVerify=Virhe - salauksen purkaminen tai viestin varmistus epäonnistui mdcError=Virhe - viestin eheyttä ei oltu suojattu viewInfo=. Näytä > Viestin turvallisuustiedot lukeaksesi lisätietoja decryptedMsg=Viesti, jonka salaus on purettu # decryptedMsgWithFormatError=Decrypted message (restored broken PGP email format probably caused by an old Exchange server, so that the result might not be perfect to read) # usedAlgorithms=Used Algorithms: %1$S and %2$S # pepStatusInfo.text=p≡p Message Status. # pepStatusInfo.title.m3=Under Attack # pepStatusInfo.info.m3=This message is not secure and has been tampered with. # pepStatusInfo.title.m1=Mistrusted # pepStatusInfo.info.m1=This message has a communication partner that has previously been marked as mistrusted # pepStatusInfo.title.r0=Unknown # pepStatusInfo.info.r0=This message does not contain enough information to determine if it is secure. # pepStatusInfo.title.r1=Cannot Decrypt # pepStatusInfo.info.r1=This message cannot be decrypted because the key is not available. # pepStatusInfo.title.r2=Cannot Decrypt # pepStatusInfo.info.r2=This message cannot be decrypted because the key is not available. # pepStatusInfo.title.r3=Unsecure # pepStatusInfo.info.r3=This message is unsecure. # pepStatusInfo.title.r4=Unsecure for Some # pepStatusInfo.info.r4=This message is unsecure for some communication partners. # pepStatusInfo.title.r5=Unreliable Security # pepStatusInfo.info.r5=This message has unreliable protection. # pepStatusInfo.title.r6=Secure... # pepStatusInfo.info.r6=This message is secure but you still need to verify the identity of your communication partner. # pepStatusInfo.title.r7=Secure & Trusted # pepStatusInfo.info.r7=This message is secure and trusted. # pepStatusInfo.color.green=Green # pepStatusInfo.color.yellow=Yellow # pepStatusInfo.color.red=Red # pepRevokeTrust.question=Do you really want to cancel the trust for %S? # pepRevokeMistrust.question=Do you really want to re-trust the key for %S? # pepRevokeTrust.doRevoke=Cancel &trust # wksConfirmationReq=Web Key Directory Confirmation Request # wksConfirmationReq.message=This message has been sent by your email provider to confirm deployment of your OpenPGP public key\nin their Web Key Directory.\nProviding your public key helps others to discover your key and thus being able to encrypt messages to you.\n\nIf you want to deploy your key in the Web Key Directory now, please click on the button "Confirm Request" in the status bar.\nOtherwise, simply ignore this message. # wksConfirmationReq.button.label=Confirm Request # autocryptSetupReq=Perform Autocrypt Setup # autocryptSetupReq.button.label=Start Setup # autocryptSetupReq.setupMsg.desc=This message contains all information to transfer your Autocrypt settings along with your secret key securely from your original device. # autocryptSetupReq.setupMsg.backup=You can keep this message and use it as a backup for your secret key. If you want to do this, you should write down the password and store it securely. # autocryptSetupReq.message.import=To import the settings and key(s) in Enigmail, please click on the "Start Setup" button in the status bar. # autocryptSetupReq.message.sent=Please click on the message on your new device and follow the instuctions to import the settings. # strings in pref-enigmail.js # oldGpgVersion20=Enigmail initialization failed.\n\nYou are using GnuPG version %1$S, which is not supported anymore. Enigmail requires GnuPG version %2$S or newer. Please upgrade your GnuPG installation, or Enigmail will not work. locateGpg=Osoita GnuPG-ohjelman sijainti invalidGpgPath=GnuPG:tä ei voida käynnistää annetusta sijainnista. Enigmail on pois käytöstä kunnes GnuPG:n sijainti muutetaan tai ohjelma käynnistetään uudestaan. warningsAreReset=Kaikki varoitusikkuna-asetukset on nollattu. prefs.gpgFound=GnuPG:tä ei löytynyt sijainnista %S prefs.gpgNotFound=GnuPG:tä ei löytynyt prefs.warnAskNever=Varoitus: Asetuksen seurauksena sähköpostiviestit lähetetään salaamatta siitä erikseen ilmoittamatta jos jollekin vastaanottajista ei löydy avainta! # prefs.warnIdleTimeForUnknownAgent=Cannot connect to gpg-agent. Maybe your system uses a specialized tool for passphrase handling (e.g. gnome-keyring, seahorse-agent, KDE wallet manager, ...). Unfortunately Enigmail cannot control the passphrase timeout for the tool you are using. Therefore the respective timeout settings in Enigmail are disregarded. # prefEnigmail.oneKeyserverOnly=Error - you can only specify one keyserver for automatic downloading of missing OpenPGP keys. # Strings used in core.jsm # (said file also re-uses some strings from above) enterAdminPin=Kirjoita älykorttisi ADMIN PIN-koodi enterCardPin=Kirjoita älykorttisi PIN-koodi notInit=Virhe - Enigmail-palvelua ei ole vielä alustettu badCommand=Virhe - salauskomento epäonnistui cmdLine=-komento ja -tuloste: notRequired=Virhe - salausta ei vaadita notComplete=Virhe - avaimen luonti ei ole vielä valmis invalidEmail=Virhe - virheellisiä sähköpostiosoitteita noPassphrase=Virhe - salasanaa ei ole annettu noPGPblock=Virhe - Ei löydetty kelvollista koodattua OpenPGP-dataosiota unverifiedReply=Viestin sisennettyä osaa (vastausta) on luultavasti muokattu # keyInMessageBody=Key in message body found. Click 'Import Key' to import the key sigMismatch=Virhe - Allekirjoitus ei ole täsmää cantImport=Julkisen avaimen tuonnissa tapahtui virhe\n\n # doImportOne=Import %1$S (%2$S)? # doImportMultiple=Import the following keys?\n\n%S # previewFailed=Can't read public key file. # Strings used in errorHandling.jsm sc.wrongCardAvailable=Älykorttia %S löydetty, lukija ei osaa käsitellä viestiä\nPyydän lisäämään älykortti %S, toista toimenpide. sc.insertCard=Toiminta vaatii älykorttin %S.\nOle hyvä ja lisää vaadittava älykortti, toista toimenpide. # sc.removeCard=The operation requires no SmartCard to be in the reader.\nPlease remove your SmartCard and repeat the operation. sc.noCardAvailable=Älykorttia ei löydetty lukijasta.\nAseta älykortti kortinlukijaan ja yritä uudestaan sc.noReaderAvailable=Älykortinlukijaan ei saatu yhteyttä\nKiinnitä älykortinlukija tietokoneeseen, aseta kortti lukijaan ja yritä uudestaan # keyError.keySpecNotFound=The email address "%S" cannot be matched to a key on your keyring. # keyError.keyIdNotFound=The configured key ID "%S" cannot be found on your keyring. # keyError.resolutionAction=Please select a valid key in the OpenPGP section of your Account Settings. # missingPassphrase=Missing passphrase # errorHandling.gpgAgentInvalid=Your system is running a version of gpg-agent that is not suitable for your GnuPG version. # errorHandling.gpgAgentError=GnuPG reported an error in the communication with gpg-agent (a component of GnuPG). # errorHandling.dirmngrError=GnuPG reported an error in the communication with dirmngr (a component of GnuPG). # errorHandling.pinentryError=GnuPG cannot query your passphrase via pinentry. # errorHandling.readFaq=This is a system setup or configuration error that prevents Enigmail from working properly and cannot be fixed automatically.\n\nWe strongly recommend that you consult our support web site at https://enigmail.net/faq. gpgNotFound=GnuPG-ohjelmaa %S ei löytynyt.\nTarkista, että GnuPG:n ohjelmatiedoston kansio on asetettu oikein Enigmail:n asetuksissa gpgNotInPath=GnuPG-ohjelmaa ei löytynyt PATH-muuttujan kansioista.\\Tarkista, että GnuPG:n ohjelmakansio on asetettu oikein Enigmail:n asetuksissa # enigmailNotAvailable=Enigmail core Service not available prefGood=Hyvä allekirjoitus lähettäjältä %S prefBad=VääRä allekirjoitus lähettäjältä %S failCancel=Virhe - Avaimen nouto peruutettiin failNoServer=Virhe - Ei annettu avainpalvelinta, jolta avain noudetaan failNoID=Virhe - Ei annettu käyttäjätunnusta, jolle avain noudetaan failKeyExtract=Virhe - avaimen tuonti viestistä epäonnistui notFirstBlock=Virhe - Ensimmäinen OpenPGP-osio ei ole julkinen avain importKeyConfirm=Tuodaanko viestiin sisällytetyt avaimet? failKeyImport=Virhe - avainten tuonti epäonnistui fileWriteFailed=Kirjoitus tiedostoon %S epäonnistui importKey=Tuo julkinen avain %S avainpalvelimelta: uploadKey=Lähetetäänkö julkinen avain %S avainpalvelimelle: keyId=Avaintunnus keyAndSigDate=Avaintunnus: 0x%S / Allekirjoitettu: %S keyFpr=Avaimen sormenjälki: %S noEmailProvided=Sähköpostiosoitetta ei ole asetettu. keyAlreadySigned=Avain on jo kertaalleen allekirjoitettu. ##################################################################### # Strings used in enigmailKeySelection.js ##################################################################### selKeyExpired=vanhenee %S createdHeader=Luotu atLeastOneKey=Avainta ei ole valittu! Valitse ainakin yksi avain ennen kuin suljet ikkunan # fewerKeysThanRecipients=You have selected a smaller number of keys than recipients. Are you sure that the list of keys to encrypt is complete? userSel.button.goBack=Valitse lisää avaimia userSel.secretKeySel.title=Valitse salainen OpenPGP avain jolla allekirjoitat viestit # userSel.problemNoKey=No valid key # userSel.problemMultipleKeys=Multiple keys # should be same as thunderbird ENTITY sendLaterCmd.label: sendLaterCmd.label=Lähetä myöhemmin # Strings used in enigmailAttachmentDialog.js # pgpMimeNote=NOTE: PGP/MIME is not supported by all email clients. If you are unsure, select the %S option. first=ensimmäinen second=toinen # Strings used in am-enigprefs.js / enigmailEditIdentity.js encryptKeyHeader=Valitse salaukseen käytettävä OpenPGP-avain identityName=Käyttäjätiedot: %S # switchPepMode=You are currently using the 'p≡p Junior' mode of Enigmail.\n\nBy enabling OpenPGP or S/MIME for an account, you are disabling p≡p and use the 'regular' mode of Enigmail without p≡p. # enableEnigmail=&Disable p≡p # Strings used in enigmailSingleRcptSettings.js noEncryption=Salaus on otettu käyttöön, mutta yhtäkään avainta ei ole valittu. Salataksesi osoitteeseen %S lähetettävät viestit, valitse avainlistasta yksi tai useampi voimassaoleva avaimesi. Poistetaanko salaus käytöstä osoitteelle %S? noKeyToUse=(ei avainta - ei salausta) noEmptyRule=Sääntö täytyy antaa. Kirjoita sääntökenttään sähköpostiosoite. invalidAddress=Antamasi sähköpostiosoitteet ovat virheellisesti muotoiltuja. Anna ainoastaan vastaanottajien sähköpostiosoitteet, älä heidän nimiään. Esimerkki:\nVäärin: Joku Nimi \nOikein: joku.nimi@osoite.fi # noCurlyBrackets=The curly brackets {} have a special meaning and should not be used in an email address. If you want to modify the matching behavior for this rule, use the 'Apply rule if recipient ...' option.\nMore information is available from the Help button. # Strings used in enigmailRulesEditor.js never=Ei koskaan always=Aina possible=Mahdollisesti deleteRule=Poistetaanko valittu sääntö? nextRcpt=(Seuraava vastaanottaja) negateRule=Ei # addKeyToRule=Add key %1$S (%2$S) to per-recipient rule # Strings used in enigmailSearchKey.js needOnline=Valitsemasi toiminto ei ole käytettävissä ilman verkkoyhteyttä. Siirry verkkoyhteystilaan ja yritä uudelleen. protocolNotSupported=OpenPGP-avaimia ei voi noutaa käyttäen antamaasi yhteyskäytäntöä "%S://". gpgkeysDisabled=Asetuksen "extensions.enigmail.useGpgKeysTool" ottaminen käyttöön voisi olla avuksi. noKeyserverConn=Yhteys avainpalvelimeen %S epäonnistui. keyDownloadFailed=Avaimen nouto avainpalvelimelta epäonnistui. Virheilmoitus oli:\n%S internalError=Tapahtui sisäinen virhe. Avainten nouto tai tuonti epäonnistui. noKeyFound=Ikävä kyllä yhtään avainta annetulle sähköpostiosoitteelle ei löytynyt. # keyDownload.keyUnavailable=We are sorry, but the key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their key by email. # gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. gpgKeysFailed=Avainten haku tai nouto avainpalvelimelta epäonnistui: ohjelmaa gpgkeys_%S ei kyetty suorittamaan. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Avaimen omistajan luottamustason asettaminen epäonnistui # Strings in enigmailSignKeyDlg.js signKeyFailed=Avaimen allekirjoittaminen epäonnistui # alreadySigned.label=Note: the key %S is already signed with the selected secret key. # alreadySignedexportable.label=Note: the key %S is already signed exportable with the selected secret key. A local signature does not make sense. # partlySigned.label=Note: some user IDs of key %S are already signed with the selected secret key. # noTrustedOwnKeys=No eligible key found for signing! You need at least one fully trusted secret key in order to sign keys. # Strings in enigmailKeyManager.js keyMan.loadingKeys=Ladataan avaimia... keyValid.unknown=tuntematon keyValid.invalid=virheellinen keyValid.disabled=ei käytössä keyValid.revoked=mitätöity keyValid.expired=vanhentunut keyValid.noSubkey=ei kelvollista aliavainta keyTrust.untrusted=ei luotettu keyTrust.marginal=osittain luotettu keyTrust.full=luotettu keyTrust.ultimate=ehdottomasti luotettu keyTrust.group=(ryhmä) keyType.public=julk keyType.publicAndSec=julk/sal keyMan.enableKey=Ota avain käyttöön keyMan.disableKey=Poista avain käytöstä userAtt.photo=Käyttäjätieto (JPEG-kuva) asciiArmorFile=ASCII-koodatut tiedostot (*.asc) importKeyFile=Tuo OpenPGP avain tiedoston gnupgFile=GnuPG-tiedostot # createKeyOK=Your Key has been generated saveRevokeCertAs=Luo ja tallenna mitätöintivarmenne # revokeCertOK=The revocation certificate has been successfully created. You can use it to invalidate your public key, e.g. in case you would lose your secret key. revokeCertFailed=Mitätöintivarmenteen luonti epäonnistui. addUidOK=Käyttäjätunnuksen lisäys onnistui addUidFailed=Käyttäjätunnuksen lisäys epäonnistui noKeySelected=Vähintään yksi avain täytyy valita, jotta operaatio voidaan suorittaa exportToFile=Valitse tiedostonimi vietäville avaimille # exportKeypairToFile=Export Secret and Public Key To File exportSecretKey=Tallennetaanko OpenPGP-tiedostoon myös salainen avaimesi? saveKeysOK=Avainten tallennus onnistui saveKeysFailed=Avainten tallennus epäonnistui importKeysFailed=Avainten tuonti epäonnistui enableKeyFailed=Avaimen käyttöön otto tai käytöstä poisto epäonnistui specificPubKeyFilename=%S (0x%S) julk specificPubSecKeyFilename=%S (0x%S) julk-sal defaultPubKeyFilename=Viedyt-julkiset-avaimet defaultPubSecKeyFilename=Viedyt-julkiset-ja-salaiset-avaimet noSecretKeys=Salaisia avaimia ei löytynyt.\n\nLuodaanko avain nyt? sendKeysOk=Avaimet lähetittiin onnistuneesti sendKeysFailed=Avainten lähettäminen epäonnistui receiveKeysOk=Avainten päivitys onnistui receiveKeysFailed=Avainten nouto epäonnistui importFromClip=Tuodaanko leikepöydällä olevat avaimet? # importFromUrl=Download public key from this URL: copyToClipbrdFailed=Avainten vienti leikepöydälle epäonnistui. copyToClipbrdOK=Avaimet kopioitiin leikepöydälle deleteSecretKey=VAROITUS: Olet poistamassa salaista avainta!\nAvaimelle salattuja viestejä ei voida enää purkaa jos avain poistetaan.\n\nPoistetaanko SEKÄ julkinen ETTÄ salainen avain\n"%S"? deleteMix=VAROITUS: Olet poistamassa salaisia avaimia!\nAvaimelle salattuja viestejä ei voida enää purkaa jos avain poistetaan.\n\nPoistetaanko SEKÄ valitut julkiset ETTÄ salaiset avaimet? deletePubKey=Poistetaanko julkinen avain tunnukselle\n%S? deleteSelectedPubKey=Poistetaanko julkinen avain? deleteKeyFailed=Avaimen poisto epäonnistui. # revokeKeyQuestion=You are about to revoke the key '%S'.\n\nYou will no longer be able to sign with this key, and once distributed, others will no longer be able to encrypt with that key. You can still use the key to decrypt old messages.\n\nDo you want to proceed? revokeKeyOk=Avain on mitätöity. Jos avain on saatavilla avainpalvelimelta, siirrä mitätöity avain palvelimelle, jotta muutkin näkevät mitätöinnin. revokeKeyFailed=Avaimen mitätöinti epäonnistui. # revokeKeyNotPresent=You have no key (0x%S) which fits to this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before the revocation certificate! # revokeKeyAlreadyRevoked=The key 0x%S has already been revoked. refreshAllQuestion=Yhtään avainta ei valittu. Päivitetäänkö kaikki avaimet? # refreshKeyServiceOn.warn=Warning: Your keys are currently being refreshed in the background as safely as possible.\nRefreshing all your keys at once will unnecessarily reveal information about you.\nDo you really want to do this? refreshKey.warn=Varoitus: riippuen avainten lukumäärästä ja verkkoyhteyden nopeudesta, kaikkien avainten päivittäminen voi kestää kauan!\n\nJatketaanko? # downloadContactsKeys.warn=Warning: depending on the number of contacts and the connection speed, downloading all keys could be quite a lengthy process! downloadContactsKeys.importFrom=Import contacts from address book '%S'? keyMan.button.exportSecKey=&Export Secret Keys # keyMan.button.exportPubKey=Export &Public Keys Only keyMan.button.import=&Tuo keyMan.button.refreshAll=&Päivitä kaikki avaimet keyMan.button.revokeKey=&Peruuta avain keyMan.button.skip=&Ohita avain keylist.noOtherUids=Ei ole muuta identiteettiä # keylist.hasOtherUids=Also known as keylist.noPhotos=Ei valokuvaa saatavilla keylist.hasPhotos=Valokuvat keyMan.addphoto.filepicker.title=Valokuva # keyMan.addphoto.warnLargeFile=The file you have chosen is larger than 25 kB.\nIt is not recommended to add very large files because the keys get very large by this. # keyMan.addphoto.noJpegFile=The selected file does not appear to be a JPEG file. Please choose a different file. keyMan.addphoto.failed=Valokuvaa ei voitu lisätä # noWksIdentity=The key %S does not have a WKS identity. # keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key "%1$S (%2$S)" for encrypting messages? # keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key "%1$S (%2$S)" for future messages? # keyman.addBlacklistKey.button=&Blacklist the key # keyman.removeBlacklistKey.button=&Remove key from Blacklist # Strings in enigmailManageUidDlg.xul changePrimUidFailed=Ensisijaisen käyttäjätunnuksen vaihto epäonnistui changePrimUidOK=Ensisijaisen käyttäjätunnuksen vaihto onnistui revokeUidFailed=Käyttäjätunnuksen %S mitätöinti epäonnistui revokeUidOK=Käyttäjätunnuksen %S mitätöinti onnistui. Jos avain on saatavilla avainpalvelimelta, siirrä mitätöity avain palvelimelle, jotta muutkin näkevät mitätöinnin. revokeUidQuestion=Mitätöidäänkö käyttäjätunnus %S? # Strings in enigmailKeyImportInfo.xul # importInfoTitle=SUCCESS! Keys imported # importInfoBits=Bits # importInfoCreated=Created # importInfoFpr=Fingerprint # importInfoDetails=(Details) # importInfoNoKeys=No keys imported. # Strings in enigmailKeyDetailsDlg.xul keyTypePublic=julkinen avain # keyTypePrimary=primary key keyTypeSubkey=aliavain keyTypePair=avainpari keyExpiryNever=ei koskaan keyAlgorithm_1=RSA keyAlgorithm_2=RSA keyAlgorithm_3=RSA keyAlgorithm_16=ELG keyAlgorithm_17=DSA # keyAlgorithm_18=ECDH # keyAlgorithm_19=ECDSA keyAlgorithm_20=ELG # keyAlgorithm_22=EDDSA # keyUsageEncrypt=Encrypt # keyUsageSign=Sign # keyUsageCertify=Certify # keyUsageAuthentication=Authentication # keyDoesNotExpire=Key does not expire # Strings in enigmailGenCardKey.xul keygen.started=Odota avaimen luonnin valmistumista.... keygen.completed=Avain luotu. Uuden avaimen tunnus on: 0x%S keygen.keyBackup=Avaimesta luotiin varmuuskopio nimellä %S keygen.passRequired=Kirjoita salasana jos haluat luoda varmuuskopion avaimesta toiselle medialle. # Strings in enigmailSetCardPin.xul cardPin.processFailed=PIN-koodin vaihtaminen ei onnistunut # Strings in enigRetrieveProgres.xul keyserverProgress.refreshing=Päivitetään avaimia, ole hyvä ja odota... keyserverProgress.uploading=Siirretään avaimia avainpalvelimella, ole hyvä ja odota... # keyserverProgress.wksUploadFailed=Could not upload your key to the Web Key Service # keyserverProgress.wksUploadCompleted=Your public key was successfully submitted to your provider. You will receive an email to confirm that you initiated the upload. keyserverTitle.refreshing=Päivitetään avaimia keyserverTitle.uploading=Avainten siirto # Strings in enigmailSetupWizard passphrase.min8keys=Salasanan tulee olla ainakin 8-kirjainta pitkä. setupWizard.reallyCancel=Peruutetaanko Enigmail:n ohjattu asennus? # setupWizard.invalidGpg=The file you specified is not a GnuPG executable. Please specify a different file. # setupWizard.specifyFile=You need to at least specify a public key file in order to proceed. # setupWizard.installFailed=It seems that the installation was not successful. Please either retry the installation, or install GnuPG manually and locate it using the Browse button. # setupWizard.downloadForbidden=For your own security, we will not download GnuPG. Please visit https://gnupg.org/ in order to download GnuPG. # setupWizard.downloadImpossible=We cannot download GnuPG currently. Please try later or visit https://gnupg.org/ in order to download GnuPG. # setupWizard.hashSumError=The wizard could not verify the integrity of the downloaded file. The file may be broken or manipulated. Do you want to continue the installation anyway? # setupWizard.importSettingsFile=Specify backup file to load from # setupWizard.invalidSettingsFile=The specified file is not a correct Enigmail Settings backup file. # setupWizard.gpgConfExists=The GnuPG config file already exists. Do you want to overwrite it with the one from your old installation? # setupWizard.noGpgHomeDir=It appears that you configured %S to use for GnuPG. However, this is not a directory - you cannot use it. # setupWizard.unmachtedIds=The following identities of your old setup could not be matched:\n%S\nThe settings for these identities were skipped. # Strings in installGnuPG.jsm # installGnuPG.downloadFailed=An error occurred while trying to download GnuPG. Please check the console log for further details. # installGnuPG.installFailed=An error occurred while installing GnuPG. Please check the console log for further details. # Strings in enigmailAddUidDlg.xul # addUidDlg.nameOrEmailError=You have to fill in a name and an email address # addUidDlg.nameMinLengthError=The name must at least have 5 characters # addUidDlg.invalidEmailError=You must specify a valid email address # Strings in enigmailCardDetails.js # Carddetails.NoASCII=OpenPGP Smartcards only support ASCII characters in Firstname/Name. # network error types # errorType.SecurityCertificate=The security certificate presented by the web service is not valid. # errorType.SecurityProtocol=The security protocol used by the web service is unknown. # errorType.Network=A network error has occurred. # filter stuff # filter.folderRequired=You must select a target folder. # filter.decryptMove.label=Decrypt permanently (Enigmail) # filter.decryptCopy.label=Create decrypted Copy (Enigmail) # filter.decryptMove.warnExperimental=Warning - the filter action "Decrypt permanently" may lead to destroyed messages.\n\nWe strongly recommend that you first try the "Create decrypted Copy" filter, test the result carefully, and only start using this filter once you are satisified with the result. # filter.tempPepFilterDesc=Temporary filter to store sent message unencrypted # filter.term.pgpencrypted.label=OpenPGP Encrypted # filter.encrypt.label=Encrypt to key (Enigmail) # filter.keyRequired=You must select a recipient key. # filter.keyNotFound=Could not find an encryption key for "%S". # filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for "%S" you will no longer be able to read the emails. # strings in enigmailConvert.jsm # converter.decryptBody.failed=Could not decrypt message with subject\n"%S".\nDo you want to retry with a different passphrase or do you want to skip the message? # converter.decryptAtt.failed=Could not decrypt attachment "%1$S"\nof message with subject\n"%2$S".\nDo you want to retry with a different passphrase or do you want to skip the message? # saveLogFile.title=Save Log File # strings in gpg.jsm # unknownSigningAlg=Unknown signing algorithm (ID: %S) # unknownHashAlg=Unknown cryptographic hash (ID: %S) # strings in keyRing.jsm # keyring.photo=Photo # keyRing.pubKeyRevoked=The key %1$S (key ID %2$S) is revoked. # keyRing.pubKeyExpired=The key %1$S (key ID %2$S) has expired. # keyRing.pubKeyNotForSigning=The key %1$S (key ID %2$S) cannot be used for signing. # keyRing.pubKeyNotForEncryption=The key %1$S (key ID %2$S) cannot be used for encryption. # keyRing.keyDisabled=The key %1$S (key ID %2$S) is disabled; it cannot be used. # keyRing.keyNotTrusted=The key %1$S (key ID %2$S) is not trusted enough. Please set the trust level of your key to "ultimate" to use it for signing. # keyRing.keyInvalid=The key %1$S (key ID %2$S) is not valid. Please consider verifying it correctly. Alternatively use the Default encryption settings in the Enigmail preferences dialog. # keyRing.signSubKeysRevoked=All signing-subkeys of key %1$S (key ID %2$S) are revoked. # keyRing.signSubKeysExpired=All signing-subkeys of key %1$S (key ID %2$S) have expired. # keyRing.signSubKeysUnusable=All signing-subkeys of key %1$S (key ID %2$S) are revoked, expired or otherwise unusable. # keyRing.encSubKeysRevoked=All encryption subkeys of key %1$S (key ID %2$S) are revoked. # keyRing.encSubKeysExpired=All encryption subkeys of key %1$S (key ID %2$S) have expired. # keyRing.noSecretKey=You do not seem to have the secret key for %1$S (key ID %2$S) on your keyring; you cannot use the key for signing. # keyRing.encSubKeysUnusable=All encryption subkeys of key %1$S (key ID %2$S) are revoked, expired or otherwise unusable. #strings in exportSettingsWizard.js # cannotWriteToFile=Cannot save to file '%S'. Please select a different file. # dataExportError=An error occurred during exporting your data. # enigmailSettings=EnigmailSettings # defaultBackupFileName=Enigmail-export # specifyExportFile=Specify file name for exporting # homedirParamNotSUpported=Additional params that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. #strings in expiry.jsm # expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use the new key. # expiry.keysExpireSoon=The following of your keys will expire in less than %1$S days:\n%2$S We recommend that you create new keys and configure your accounts to use the new keys. # expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to ultimate in key properties. # expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to ultimate in key properties. # expiry.OpenKeyManager=Open Enigmail Key Management # expiry.OpenKeyProperties=Open Key Properties #strings in pEpDecrypt.jsm # pEpDecrypt.cannotDecrypt=This is an encrypted message. Unfortunately you don't have the secret key to decrypt the message. #strings in gpgAgent.jsm # gpghomedir.notexists=The directory '%S' containing your OpenPGP keys does not exist and cannot be created. # gpghomedir.notwritable=The directory '%S' containing your OpenPGP keys is not writable. # gpghomedir.notdirectory=The directory '%S' containing your OpenPGP keys is a file instead of a directory. # gpghomedir.notusable=Please fix the directory permissions or change the location of your GnuPG "home" directory. GnuPG cannot work correctly otherwise. #strings in pepTrustWords.js # pepTrustWords.cannotVerifyOwnId=Cannot verify p≡p Trustwords for own account. # pepTrustWords.cannotFindKey=Cannot find key for %S. # pepTrustWords.cannotStoreChange=Could not change trust for %S. # pepTrustWords.generalFailure=Cannot obtain trustwords for %S. # pepTrustWords.partnerFingerprint=Fingerprint for %S: #strings in mimeWkdHandler.jsm # wkdMessage.body.req=Your email provider processed your request to upload your public key to the OpenPGP Web Key Directory.\n\nPlease click the confirmation button in the Enigmail header to complete the publishing of your public key. # wkdMessage.body.process=This is an email related to the automatic processing to upload your public key to the OpenPGP Web Key Directory.\n\nYou do not need to take any manual action at this point. #strings in pepHandshake.js # pepPrivacyStatus.RatingBrokenSuggestion=Either you or the sender should resend the message. # pepPrivacyStatus.RatingHaveNoKeySuggestionOutgoing=If you composed this message, your key is not available. # pepPrivacyStatus.RatingMistrustSuggestion=Re-establish the connection with your communication partner and try to complete another handshake. # pepPrivacyStatus.RatingReliableSuggestion=Complete a handshake with your communication partner by exchanging trustwords in person or over the phone. A handshake is needed only once per partner and will ensure secure and trusted communication. # pepPrivacyStatus.RatingTrustedSuggestion=No action needed! # pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware this message may not be secure. # pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Please add the necessary information. # pepPrivacyStatus.RatingUnderAttackSuggestion=Separately verify the content of this message with your communication partner. # pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least secure. # pepPrivacyStatus.RatingUnencryptedSuggestion=Please ask your communication partner to use an encryption solution or install p≡p. # pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or no signature. Ask your communication partner to upgrade their encryption solution or install p≡p. # pepPrivacyStatus.RatingBrokenExplanation=This message has broken encryption or formatting. # pepPrivacyStatus.RatingHaveNoKeyExplanation=This message cannot be decrypted because the key is not available. # pepPrivacyStatus.RatingMistrustExplanation=This message has a communication partner that has previously been marked as mistrusted. # pepPrivacyStatus.RatingReliableExplanation=This message is secure but you still need to verify the identity of your communication partner. # pepPrivacyStatus.RatingTrustedExplanation=This message is secure and trusted. # pepPrivacyStatus.RatingUndefinedExplanation=This message does not contain enough information to determine if it is secure. # pepPrivacyStatus.RatingUnderAttackExplanation=This message is not secure and has been tampered with. # pepPrivacyStatus.RatingUnencryptedExplanation=This message is unsecure. # pepPrivacyStatus.RatingUnencryptedForSomeExplanation=This message is unsecure for some communication partners. # pepPrivacyStatus.RatingUnreliableExplanation=This message has unreliable protection. # pepPrivacyStatus.RatingBrokenText=Broken # pepPrivacyStatus.RatingHaveNoKeyText=Cannot Decrypt # pepPrivacyStatus.RatingMistrustText=Mistrusted # pepPrivacyStatus.RatingReliableText=Secure # pepPrivacyStatus.RatingTrustedText=Secure & Trusted # pepPrivacyStatus.RatingUndefinedText=Unknown # pepPrivacyStatus.RatingUnderAttackText=Under Attack # pepPrivacyStatus.RatingUnencryptedForSomeText=Unsecure for Some # pepPrivacyStatus.RatingUnencryptedText=Unsecure # pepPrivacyStatus.RatingUnreliableText=Unreliable Security # handshakeDlg.button.initHandshake=Handshake... # handshakeDlg.button.stopTrust=Stop Trusting # handshakeDlg.button.reTrust=Stop Mistrusting # handshakeDlg.label.outgoingMessage=Outgoing message # handshakeDlg.label.incomingMessage=Incoming message # handshakeDlg.error.noPeers=Cannot handshake without any correspondents. # handshakeDlg.error.noProtection=Please enable protection in order to use the Handshake function. # enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device # enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup #strings in autocrypt.jsm # autocrypt.setupMsg.subject=Autocrypt Setup Message # autocrypt.setupMsg.msgBody=To set up your new device for Autocrypt, please follow the instuctions that should be presented by your new device. # autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code presented on your old device, and then import the contained key into your keyring. #strings in upgradeInfo.html # upgradeInfo.doctitle=What's New in Enigmail v2.0? # upgradeInfo.welcome1=Welcome to the new Enigmail version 2.0! # upgradeInfo.welcome2=The release contains a lot of new and changed features. Please take a minute to find out what's new: # upgradeInfo.encSubject.title=Encrypting the Message Subject # upgradeInfo.encSubject.desc=We developed a new method that moves the email subject into the encrypted message, and replaces the visible subject with "Encrypted Message". Once such a message is decrypted, the original subject is replaced automatically. Hiding the subject is on by default; there is a preference to turn it off if you don't like it. (Note: this feature requires the message to be sent with PGP/MIME.) # upgradeInfo.buttons.title=Changed behavior of Encrypt and Sign Buttons # upgradeInfo.buttons.desc=The Encrypt and Sign buttons in the message composer window now work for both the OpenPGP and S/MIME protocols. If both algorithms are possible, then Enigmail will try to prefer the one for which all keys are available. # upgradeInfo.autocrypt.title=Support for Autocrypt # upgradeInfo.autocrypt.desc=Enigmail now supports Autocrypt, a new standard to distribute keys as part of sent messages. Enigmail automatically imports keys from Autocrypt-compliant messages, such that over time more and more emails can be encrypted. # upgradeInfo.pEp.title=New p≡p Junior Mode (Pretty Easy Privacy) # upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. You currently need to manually install p≡p for this purpose; this will change in a future release. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. # upgradeInfo.bottom.desc=Please visit our documentation for help on using Enigmail. # pep.missingGnuPG=In order to use Enigmail/p≡p, GnuPG is required. As we could not find it, we suggest to download and install it for you. #strings in enigmailAbout.html # aboutEnigmail.tabName=About Enigmail # aboutEnigmail.title=OpenPGP support provided by Enigmail # aboutEnigmail.team=Enigmail is developed by the Enigmail Team: # aboutEnigmail.projectLeader=Lead Developer: # aboutEnigmail.usability=Usability: # aboutEnigmail.documentation=Documentation: # aboutEnigmail.testing=Testing: # aboutEnigmail.userSupport=User Support: # aboutEnigmail.localization=Localization: See the Enigmail Language Packs page # aboutEnigmail.Credits=Credits: # aboutEnigmail.origAuthor=Original author of the Enigmail extension # aboutEnigmail.icons=Icons: # aboutEnigmail.formerMembers=Former team members: # aboutEnigmail.projectHosting=Project hosting: # aboutEnigmail.licenseSupportTitle=License & Support # aboutEnigmail.license=Enigmail OpenPGP is open source and licensed under the %S # aboutEnigmail.support=Support and download is available from www.enigmail.net. enigmail-2.0.8/lang/fi/help/000077500000000000000000000000001334302754500155635ustar00rootroot00000000000000enigmail-2.0.8/lang/fi/help/compose.html000066400000000000000000000071251334302754500201230ustar00rootroot00000000000000 Enigmailin ohje: Viestien kirjoittamisesta

Enigmailin ohje

Enigmailin käyttö kirjoitettaessa viestejä

  • Enigmailin valikko Posti tai viestin kirjoitusikkunassa
    • Allekirjoita viesti: Ota käyttöön tai poista käytöstä viestin allekirjoitus. Käyttäjälle ilmoitetaan allekirjoituksen epäonnistumisesta.
    • Salaa viesti: Ota käyttöön tai poista käytöstä viestin salaus kaikille vastaanottajille. Käyttäjälle ilmoitetaan salaamisen epäonnistumisesta.

      Jos sinulla ei ole salatun viestin kaikkien vastaanottajien julkisia avaimia ja asetuksissa on valittuna Näytä avainten valintaikkuna kun se on välttämätöntä, avainlista avautuu.

      Jos sinulla ei ole salatun viestin kaikkien vastaanottajien julkisia avaimia ja asetuksissa on valittuna Älä koskaan näytä avainten valintaikkunaa, viesti lähetetään selkokielisenä.

    • Käytä PGP/MIME:ä tässä viestissä: Ota käyttöön tai poista käytöstä PGP/MIME tässä viestissä.

      Jos tiedät, että viestin vastaanottajien sähköpostiohjelmat ymmärtävät PGP/MIME-muotoa, sitä tulisi käyttää.

      Tämä toiminto otetaan käyttöön valitsemalla PGP/MIME-asetuksista Salli PGP/MIME:n käyttö tai Käytä aina PGP/MIME:ä.

    • Viestien kirjoituksen oletusasetukset: Alavalikko.
      • Allekirjoitus-/salausasetukset...: pikalinkki Tilin asetukset -> OpenPGP-asetuksiin.
      • Lähetysasetukset...: pikalinkki Asetukset -> Lähetys-välilehteen.
      • Avainten valinnan asetukset...: pikalinkki Asetukset -> Avainten valinta-välilehteen.
      • PGP/MIME-asetukset...: pikalinkki Asetukset -> PGP/MIME-välilehteen.
    • Kumoa salaus: Jos viestin lähettämisessä tapahtuu jokin virhe, kuten esimerkiksi POP-palvelinvirhe, Enigmail ei voi tietää sitä ja salattu viesti jää salatuksi viestin kirjoitusikkunaan. Palauta viesti selkokieliseksi valitsemalla Kumoa salaus.
      Kun Enigmail ei virheellisesti pura salausta lainatusta tekstistä kun salattuun viestiin vastataan, tai salausta ei pureta automaattisesti jostain muusta syystä, tätä toimintoa voi käyttää väliaikaisena korjauksena. Yleensä salauksen purku toimii automaattisesti.
    • Lisää julkinen avain: Lisää julkisen avaimen ASCII-koodattuna viestiin osoittimen sijainnista alkaen. Avaimeen sisällytettävät sähköpostiosoitteet kysytään erikseen. Lisää viestiin vain yksi avainosio ja valitse halutut julkiset avaimet. Jos vastaanottaja käyttää Enigmailia, avainosio huomataan automaattisesti. Kun avaimet on lisätty, viesti voidaan vielä salata ja allekirjoittaa.
    • Tyhjennä salasana muistista: Tyhjentää salasanan muistista. Toiminto on hyödyllinen, jos sinulla on useita avaimia ja useita salasanoja.
    • Ohje: Näyttää ohjeen (tämä sivu).

Lisää ohjeita Enigmailin ohjesivulta

enigmail-2.0.8/lang/fi/help/editRcptRule.html000066400000000000000000000112021334302754500210530ustar00rootroot00000000000000 Enigmailin ohje: OpenPGP-sääntöjen muokkaaminen

Enigmailin ohje

Enigmailin sääntömuokkaimen käyttö: OpenPGP-sääntöjen muokkaus

Sääntömuokkaimessa voit asettaa oletukset viestin allekirjoittamiselle, salaamiselle, PGP/MIME-koodauksen käytölle, ja määrittää käytettävät OpenPGP-avaimet vastaanottajakohtaisesti. Oletukset voidaan asettaa yhdelle vastaanottajalle tai usealle vastaanottajalle, jolla on toisensa kaltaiset sähköpostiosoitteet.

  • Aseta OpenPGP-säännöt osoitteille: Kentässä on täydelliset sähköpostiosoitteet (tai osa osoitteista) joille alla olevat säännöt pätevät suotimen tavoin. Jos osoitesuotimia on useita, ne erotetaan välilyönnillä. Suotimet voivat olla esimerkiksi pelkkä verkkoalue @sposti.fi, johon täsmäisivät kaikki @sposti.fi:n loppuvat osoitteet.
  • Sääntö pätee jos ylläoleva: Osoitesuotimen käyttäytymisen voi valita. Jos yllä olevassa kentässä on useita osoitteita, käyttäytymisasetus pätee kaikille osoitteille. Alla olevissa esimerkeissä osoitesuodinkenttään on kirjoitettu nieminen@sposti.fi.
    • on täsmälleen vastaanottajan osoite: Tällä asetuksella sääntö pätee viesteille, jotka lähetetään osoitteeseen nieminen@sposti.fi (täsmäys on kirjainkoon huomioiva).
    • on osa vastaanottajan osoitetta: Tällä asetuksella sääntö pätee viesteille, jotka lähetetään esim. osoitteisiin matti.nieminen@sposti.fi, nieminen@sposti.fi.com jne.
    • ja vastaanottajan osoitteen alku täsmäävät: Tällä asetuksella sääntö pätee viesteille, jotka lähetetään esim. osoitteeseen nieminen@sposti.fi.com
    • ja vastaanottajan osoitteen loppu täsmäävät: Tällä asetuksella sääntö pätee viesteille, jotka lähetetään esim. osoitteeseen maija.nieminen@sposti.fi
  • Jatka seuraavaan sääntöön täsmäävälle osoitteelle
    Jos asetus on valittu, Enigmail hakee osoitteeseen kuuluvaa OpenPGP-avainta vasta viestiä lähetettäessä, ja muut säännöt voivat muuttaa täsmäävien viestien lähetysasetuksia.
  • Älä tarkista enää sääntöjä täsmäävälle osoitteelle
    Jos asetus on valittu, täsmääviin osoitteisiin ei sovelleta muita sääntöjä. Täsmäävä osoite jätetään siis huomiotta muita sääntöjä käsiteltäessä.
  • Käytä seuraavia OpenPGP-avaimia:
    Valitse käytettävät vastaanottajien avaimet napsauttamalla Valitse avaimet-painiketta. Kuten yllä, jos asetus on valittu, muita sääntöjä ei huomioida täsmääville sähköpostiosoitteille.
  • Allekirjoittaminen: Allekirjoita tai älä allekirjoita viestejä tälle vastaanottajalle. Tämä asetus joko noudattaa viestin kirjoitusikkunassa antamaasi käskyä tai muuttaa sen. Mahdolliset arvot:
    • Ei koskaan: Älä ikinä allekirjoita viestiä vastaanottajalle, huolimatta viestin kirjoitusikkunan asetuksista.
    • Vain jos valitaan erikseen viestiä kirjoitettaessa: Allekirjoita viesti jos niin on viestin kirjoitusikkunassa asetettu
    • Aina: Allekirjoita viestit vastaanottajalle aina, huolimatta viestin kirjoitusikkunan asetuksista
Jokainen sääntö pätee kaikille täsmääville viesteille. Jos jokin säännöistä ottaa allekirjoituksen pois päältä, viestiä ei allekirjoiteta huolimatta siitä, mitä muut säännöt määräisivät.
  • Salaa: Salaa tai älä salaa viestiä. Asetusvalinnat ja niiden merkitykset ovat samat kuin viestin allekirjoitukselle.
  • PGP/MIME: Ota käyttöön tai poista käytöstä PGP/MIME (RFC 3156) -koodaus. Jos PGP/MIME ei ole käytössä, viestit allekirjoitetaan ja salataan käyttäen viestinsisäistä PGP:tä. Asetusvalinnat ja niiden merkitykset ovat samat kuin viestin allekirjoitukselle.

Säännöt käsitellään niiden listausjärjestyksessä OpenPGP-sääntömuokkaimessa. Jos säännössä on annettu vastaanottajan OpenPGP-avaintunnus ja osoite täsmää vastaanottajan osoitteeseen, muita viestin kanssa täsmääviä sääntöjä ei enää käsitellä.


Lisää ohjeita Enigmailin vastaanottajakohtaisten asetusten ohjesivuilta

enigmail-2.0.8/lang/fi/help/initError.html000066400000000000000000000045421334302754500204330ustar00rootroot00000000000000 Enigmail Help: How to Resolve Problems with Initializing OpenPGP

Enigmail Help

How to Resolve Problems with Initializing OpenPGP

There are several reasons why initializing OpenPGP does not succeed. The most common ones are described below; for more information please visit the Enigmail Support page.

GnuPG could not be found

In order for OpenPGP to work, the tool GnuPG needs to be installed. If GnuPG cannot be found, then first make sure that the executable gpg.exe (on Windows; gpg on other platforms) is installed on your computer. If GnuPG is installed, and OpenPGP cannot find it, then you need to manually set the path to GnuPG in the OpenPGP Preferences (menu OpenPGP > Preferences)

Enigmime failed to initialize

OpenPGP works only if it is built using the same build environment as Thunderbird or SeaMonkey was built. This means that you can use the official Enigmail releases only if you use the official releases of Thunderbird or SeaMonkey provided by mozilla.org.

If you use a Thunderbird or SeaMonkey version coming from some other source (e.g. the provider of your Linux distribution), or if you built the application yourself, you should either use an Enigmail version built by the same source, or build Enigmail yourself. For building Enigmail, refer to the Source Code section on the Enigmail home page. Please don't file any bug report concerning this problem, it is not solvable.

Further help is available on the Enigmail Support Web Site.

enigmail-2.0.8/lang/fi/help/messenger.html000066400000000000000000000067611334302754500204530ustar00rootroot00000000000000 Enigmailin ohje: Viestien lukeminen

Enigmailin ohje

Enigmailin käyttö luettaessa viestejä

  • Pura salaus -painike posti-ikkunassa
    Pura-painikkeella voi purkaa salauksen, varmistaa allekirjoituksen tai tuoda julkisia avaimia. Normaalisti salauksen purku tai allekirjoituksen varmistus tapahtuu automaattisesti, mutta jos näin ei käy, Enigmailin tilariville ilmestyy lyhyt virheilmoitus. Pura-painikkeesta saa tarkemman virheilmoituksen jossa on mukana GnuPG-komennon virheilmoitus.
  • Allekirjoitus- ja salauskuvakkeet viestin otsaketiedoissa
    Allekirjoitus (kynä) ja salaus (avain) -kuvakkeet ovat viestiotsakkeissa riippuen siitä, onko viesti allekirjoitettu hyvin (eli viestiä ei ole muokattu siirrettäessä) tai salattu. Jos viestiä on jollain tapaa muutettu siirrettäessä eli sen allekirjoitus on huono, tämä näkyy allekirjoituskuvakkeessa (se on esimerkiksi rikkinäinen tai yliviivattu kynä). Napsauttamalla kuvaketta hiiren oikealla painikkeella avautuu ponnahdusvalikko, jossa on seuraavat kohdat:
    • OpenPGP-turvallisuustiedot: Näyttää GnuPG:n tulosteen tälle viestille.
    • Kopioi OpenPGP-turvallisuustiedot: Kopiot leikepöydälle GnuPG:n tulosteen tälle viestille.
    • Näytä OpenPGP-kuva: Näyttää kuvan, jonka viestin lähettäjä on liittänyt julkiseen avaimeensa (vain jos kuva on olemassa).
    • S/MIME-turvallisuustiedot: Näyttää viestin S/MIME-turvallisuustiedot.

    Kun saat viestin, joka on allekirjoitettu sinulta puuttuvalla avaimella, ja jos sinulla ei ole keyserver-options auto-key-retrieve asetusta gpg.conf-tiedostossa (eli että kaikki tuntemattomat avaimet yritetään hakea avainpalvelimelta), Enigmail näyttää viestiotsakkeissa allekirjoituskuvakkeen, jossa on kysymysmerkki ja tekstirivin, jossa lukee Osa viestistä allekirjoitettu. Napsauta allekirjoituskuvaketta saadaksesi lisätietoja.

    Sama allekirjoituskuvake voi näkyä vaikka keyserver-options auto-key-retrieve olisikin asetettu, koska haettua avainta ei ehkä löydy oletusavainpalvelimelta.

    Napsauttamalla allekirjoituskuvaketta, jossa on kysymysmerkki, avautuu ikkuna, joka ilmoittaa, että avainta ei löydy avainrenkaastasi. Sulkemalla tämän ikkunan OK:ta napsauttamalla avautuu ikkuna, josta voit valita avainpalvelimen, jolta julkista avainta tulisi hakea.

    Voit muokata valittavissa olevia avainpalvelimia Enigmailin asetuksista: Enigmail -> Asetukset -> Yleiset-välilehti, ja muokkaamalla pilkulla erotettuja avainpalvelinten osoitteita Avainpalvelimet:-kentässä. Oletusavainpalvelin on listassa ensimmäisenä.

  • Salattujen liitetiedostojen avaaminen ja liitettyjen OpenPGP-avainten tuonti
    Enigmail käsittelee liitteet, joiden tiedostopääte on pgp, asc tai gpg. Tällaisen liitteen ponnahdusvalikossa (napsauta hiiren oikealla painikkeella liitettä) on kaksi erityistä valintaa: Pura ja avaa sekä Pura ja tallenna. Näillä valinnoilla voit purkaa liitteen salauksen ennen kuin avaat tai tallennat sen. Jos liite tunnistetaan OpenPGP-avaintiedostoksi, sinulta kysytään haluatko tuoda avaimet.

Lisää ohjeita Enigmailin ohjesivuilta

enigmail-2.0.8/lang/fi/help/rulesEditor.html000066400000000000000000000056151334302754500207610ustar00rootroot00000000000000 Enigmailin ohje: Sääntömuokkain

Enigmailin ohje

Enigmailin sääntömuokkaimen käyttö

Sääntömuokkaimessa voit muokata vastaanottajakohtaisia lähetysasetuksia. Voit määrätä, missä PGP/MIME-muodossa viesti lähetetään, mitä avainta käytetään ja allekirjoitetaanko tai salataanko se. Jokainen sääntö muodostuu viidestä kentästä ja on kirjoitettu yhdelle riville:

  • Sähköpostiosoite: Osoitteet, joiden vastaanottaja-, kopio- tai piilokopiokentässä on ehdon täyttävä osoite. Ehto voi koskea myös vain osaa osoitteesta (lisätietoja muokkaa sääntöjä -ikkunasta)
  • OpenPGP-avaimet: Lista vastaanottajalle käytettävistä OpenPGP-avaimista
  • Allekirjoita: Allekirjoita tai älä allekirjoita viestejä tälle vastaanottajalle. Tämä asetus joko noudattaa viestin kirjoitusikkunassa antamaasi käskyä tai muuttaa sen. Mahdolliset arvot:
    • Ei koskaan: Älä ikinä allekirjoita viestiä vastaanottajalle, huolimatta viestin kirjoitusikkunan asetuksista.
    • Mahdollisesti: Allekirjoita viesti jos niin on viestin kirjoitusikkunassa asetettu
    • Aina: Allekirjoita viestit vastaanottajalle aina, huolimatta viestin kirjoitusikkunan asetuksista
Jokainen sääntö pätee kaikille täsmääville viesteille. Jos jokin säännöistä ottaa allekirjoituksen pois päältä, viestiä ei allekirjoiteta huolimatta siitä, mitä muut säännöt määräisivät.
  • Salaa: Salaa tai älä salaa viestiä. Asetusvalinnat ja niiden merkitykset ovat samat kuin viestin allekirjoitukselle.
  • PGP/MIME: Ota käyttöön tai poista käytöstä PGP/MIME (RFC 3156) -koodaus. Jos PGP/MIME ei ole käytössä, viestit allekirjoitetaan ja salataan käyttäen viestinsisäistä PGP:tä. Asetusvalinnat ja niiden merkitykset ovat samat kuin viestin allekirjoitukselle.

Säännöt käsitellään niiden listausjärjestyksessä. Jos säännössä on annettu vastaanottajan OpenPGP-avaintunnus ja osoite täsmää vastaanottajan osoitteeseen, muita viestin kanssa täsmääviä sääntöjä ei enää käsitellä.

Huom.: Sääntömuokkain ei ole vielä valmis. Monimutkaisempia sääntöjä on mahdollista kirjoittaa muokkaamalla sääntötiedostoa käsin (näin muokattuihin sääntöihin ei pitäisi enää koskea sääntömuokkaimella). Tarkempia ohjeita sääntötiedoston muokkaamisesta Enigmailin kotisivulta.


Lisää ohjeita Enigmailin ohjesivuilta

enigmail-2.0.8/lang/fi/help/sendingPrefs.html000066400000000000000000000047771334302754500211170ustar00rootroot00000000000000 Enigmail Help: Edit OpenPGP Rule

Enigmail Help

Defining Preferences to Send Encrypted

In the Sending Preferences you can choose the general model and preferences for encryption.

Convenient Encryption
With these settings, emails are encrypted without confirmation whenever possible.

This setup is appropriate, if you just want to improve your privacy by sending emails encyrpted instead of unencrypted if that's possible.

The effect is like sending emails as letters instead of postcards. Unlike postcards, letters usually hide their contents while in transit.

Note however that as with letters you can't be sure that nobody is opening the letter while it is in transit (although, some technical effort is necessary for that).

A concrete risk is that you accidentally use "faked keys" you got from somewhere or somebody claiming that the key belongs to the person you want to send emails to. To avoid this risk, you can either use the trust model of PGP (see below) or you should always verify, whether the fingerprint of a public key is correct.

Manual Encryption
This option allows you to specify the different preferences for encryption according to your needs. You can specify
  • whether replies to encrypted/signed emails should automatically also be encrypted/signed-
  • whether to use the trust model of OpenPGP to accept keys (this means that to use a key you either have to sign the key or have enough other people you trust having signed the key).
  • whether you want to automatically send emails encrypted if all keys are accepted.
  • whether and when you want to finally confirm sending an email.
If it is important for you that content you send encrypted can't be read by other people or organizations, you should use the manual preferences at least choose the option to accept keys only if you or other people signed them. While this model reduces the risk of using faked keys, it requires that you actively sign keys and declare owner trust using the key managament dialog. enigmail-2.0.8/lang/fr/000077500000000000000000000000001334302754500146445ustar00rootroot00000000000000enigmail-2.0.8/lang/fr/am-enigprefs.properties000066400000000000000000000001231334302754500213330ustar00rootroot00000000000000# Strings used in the Mozill AccountManager prefPanel-enigprefs=Sécurité OpenPGP enigmail-2.0.8/lang/fr/enigmail.dtd000066400000000000000000002104711334302754500171330ustar00rootroot00000000000000 license public Mozilla 2.0."> Le transfert de clé Autocrypt exige que le client de courriel de l’autre appareil soit conforme Autocrypt. Bien que ce soit la solution la plus facile, seul un nombre limité de clients prennent cette norme en charge actuellement. L’autre manière est de sauvegarder et restaurer vos paramètres. Cela créera un fichier ZIP contenant tous les renseignements et clés nécessaires que vous pourrez copier sur votre nouvel appareil. Enigmail peut importer ces paramètres directement ; pour les autres clients de courriel, le fichier ZIP peut être décompressé et traité manuellement.">  »">  » pour indiquer les adresses courriel">  » pour indiquer les adresses courriel pour GnuPG. Désactiver si les destinataires possèdent d’anciennes clés Hushmail."> Sécurité OpenPGP)"> NOTE : La génération d’une clé peut prendre plusieurs minutes. Veuillez ne pas quitter l’application tant que la génération de clé est en cours. Parcourir activement le Web ou effectuer des opérations sollicitant le disque dur pendant la génération de clé renouvellera la « réserve d’aléation » (entropie) et accélérera le processus. Vous serez averti quand l’opération de génération de clé sera terminée."> Autocrypt est une norme qui définit la mise en place commode du chiffrement de bout en bout des courriels. Elle définit la négociation par les programmes de courriel des capacités de chiffrement en utilisant des courriels ordinaires.">  » est invalide"> NOTE : La génération de clé peut prendre plusieurs minutes. Veuillez ne pas quitter l’application tant que cette opération est en cours. Vous serez averti quand l’opération de génération de clé sera terminée."> Note : Enigmail vérifiera toujours les signatures des courriels pour tous les comptes et identités, qu’il soit activé ou non."> clé publique permet aux autres de vous envoyer des courriels chiffrés. Vous pouvez la distribuer à tout le monde."> clé privée vous permet de déchiffrer ces courriels et d’envoyer des courriels signés. Vous ne devriez la donner à personne."> clé privée vous permet de déchiffrer ces courriels et d’envoyer des courriels signés. Vous ne devriez la donner à personne. Pour protéger votre clé privée, vous serez invité à saisir une phrase de passe dans les deux boîtes de dialogue suivantes."> phrase de passe protège votre clé privée. Elle prévient l’usage abusif de votre clé privée."> ne sont pas recommandés."> Votre mot de passe vous sera demandé. Veuillez transférer le certificat vers un support qui peut être rangé en toute sécurité comme un CD ou une clé USB. Si quelqu’un accédait à ce certificat, il pourrait s’en servir pour rendre votre clé inutilisable."> exporter vos données du premier ordinateur en utilisant l’assistant de sauvegarde dans le préférences d’Enigmail importer les données dans le second ordinateur en utilisant cet assistant. "> Nous vous remercions d’utiliser Enigmail."> Si vous souhaitez le faire, veuillez confirmer la demande que vous trouverez dans votre boîte de réception."> exporter vos données du premier ordinateur en utilisant cet assistant importer les données dans le second ordinateur en utilisant l’assistant de configuration. "> Veuillez sélectionner ci-dessous le compte pour lequel vous souhaitez transférer votre clé. Un code de configuration (mot de passe) sera affiché sur l’écran suivant. Vous devrez le saisir sur votre appareil afin d’importer votre clé et les paramètres associés."> Veuillez maintenant passer sur l’autre appareil et ouvrir le message. Un code de sécurité vous sera demandé. Veuillez alors saisir les chiffres suivants :"> enigmail-2.0.8/lang/fr/enigmail.properties000066400000000000000000001732231334302754500205570ustar00rootroot00000000000000Enigmail=Enigmail ##################################################################### # Strings used within enigmailCommon.js and enigmailCommon.jsm ##################################################################### enigAlert=Alerte Enigmail enigConfirm=Confirmation Enigmail enigInfo=Informations Enigmail enigError=Erreur Enigmail enigPrompt=Invite Enigmail dlgYes=&Oui dlgNo=&Non dlgKeepSetting=Mémoriser ma réponse et ne plus me demander dlgNoPrompt=Ne plus afficher cette boîte de dialogue dlg.button.delete=&Supprimer dlg.button.cancel=&Annuler dlg.button.close=&Fermer dlg.button.continue=Con&tinuer dlg.button.skip=&Ignorer dlg.button.overwrite=&Remplacer dlg.button.view=&Visualiser dlg.button.retry=&Ressayer dlg.button.ignore=&Ignorer dlg.button.install=&Installer dlg.button.ok=&D’accord repeatPrefix=\n\nCette alerte sera répétée %S repeatSuffixSingular=fois. repeatSuffixPlural=fois. noRepeat=\n\nCette alerte ne sera pas répétée jusqu’à la mise à niveau d’Enigmail. pgpNotSupported=Vous semblez utiliser Enigmail avec PGP 6.x.\n\nMalheureusement, PGP 6.x présente un certain nombre de problèmes qui empêchent Enigmail de fonctionner correctement. C’est pourquoi Enigmail ne prend plus en charge PGP 6.x ; veuillez plutôt utiliser GnuPG (GPG).\n\nPour de l’aide sur le passage à GnuPG, consulter la section Aide de la page d’accueil d’Enigmail. initErr.howToFixIt=GnuPG est exigé pour utiliser Enigmail. Si vous n’avez pas encore installé GnuPG, le bouton « Assistant d’installation » ci-dessous vous permet de le faire, facilement. initErr.setupWizard.button=A&ssistant de configuration passphraseCleared=La phrase de passe n’est plus mémorisée. cannotClearPassphrase=Vous utilisez un outil atypique (comme le trousseau gnome-keyring) pour gérer les phrases de passe. Il est donc impossible d’effacer la phrase de passe à partir d’Enigmail. noPhotoAvailable=Aucune photo debugLog.title=Journal de débogage d’Enigmail error.photoPathNotReadable=Le chemin de la photo « %S » est illisible generalError=Erreur : %S # Strings in configure.jsm enigmailCommon.versionSignificantlyChanged=Cette nouvelle version d’Enigmail offre des changements importants dans la manière de gérer les préférences et options. Nous avons essayé de transférer les anciens paramètres vers cette nouvelle version. Cependant, nous ne pouvons pas traiter tous les cas automatiquement. Veuillez vérifier les nouvelles préférences et options générées ainsi. enigmailCommon.checkPreferences=Vérifier les préférences… preferences.defaultToPgpMime=Nous avons changé l’encodage par défaut dans Enigmail de PGP intégré (inline) à PGP/MIME. Nous vous recommandons de conserver ce réglage.\n\nSi vous souhaitez quand même utiliser PGP intégré par défaut, vous pouvez le configurer dans Paramètres de compte > Sécurité OpenPGP ##################################################################### # Strings in enigmailAbout.js ##################################################################### usingVersion=Enigmail version %S est utilisé enigmailPepVersion=Enigmail/p≡p version %S usingAgent=L’exécutable %1$S %2$S est utilisé pour chiffrer et déchiffrer agentError=ERREUR : échec d’accès au service principal d’Enigmail ! ##################################################################### # Strings in enigmailKeygen.js ##################################################################### accessError=Erreur d’accès au service Enigmail onlyGPG=La génération de clé ne fonctionne qu’avec GnuPG (pas avec PGP) ! keygenComplete=La génération de clé est terminée ! L’identité <%S> sera utilisée pour la signature. revokeCertRecommended=Nous recommandons fortement de créer un certificat de révocation pour votre clé. Ce certificat peut être utilisé pour invalider votre clé, par exemple si vous perdiez votre clé privée ou si elle était compromise. Souhaitez-vous créer un tel certificat de révocation maintenant ? keyMan.button.generateCert=&Générer un certificat genCompleteNoSign=La génération de clé est terminée ! genGoing=Une génération de clé est déjà en cours ! passNoMatch=Les phrases de passe ne correspondent pas ; veuillez les saisir à nouveau passCheckBox=Veuillez cocher la case en cas d’absence de phrase de passe pour la clé passUserName=Veuillez indiquer un nom d’utilisateur pour cette identité keygen.missingUserName=Aucun nom n’est indiqué pour le compte ou l’identité sélectionnés. Veuillez saisir une valeur dans le champ « Nom » des paramètres de compte. keygen.passCharProblem=Vous utilisez des caractères spéciaux dans votre phrase de passe, ce qui pourrait malheureusement entraîner des problèmes avec d’autres applications. Nous vous recommandons de choisir une phrase de passe ne comprenant que les caractères suivants : \na-z A-Z 0-9 /.;:-,!?(){}[]%* passSpaceProblem=Pour des raisons techniques, votre phrase de passe ne peut ni commencer ni se terminer par une espace. changePassFailed=Échec de modification de la phrase de passe. keyConfirm=Générer les clés publique et privée pour %S ? keyMan.button.generateKey=&Générer une clé keyAbort=Abandonner la génération de clé ? keyMan.button.generateKeyAbort=&Abandonner la génération de clé keyMan.button.generateKeyContinue=&Continuer la génération de clé expiryTooLong=Vous ne pouvez pas créer une clé qui expirera dans plus de 100 ans. expiryTooLongShorter=Vous ne pouvez pas créer une clé qui expirera dans plus de 90 ans. expiryTooShort=Votre clé doit être valide pendant au moins un jour. keyGenFailed=Échec de génération de la clé. Veuillez consulter la console Enigmail (Menu Enigmail > Options de débogage) pour plus de détails. setKeyExpirationDateFailed=Impossible de modifier la date d’expiration # Strings in enigmailMessengerOverlay.js securityInfo=Informations de sécurité d’Enigmail\n\n enigHeader=Enigmail : enigContentNote=Enigmail : *les pièces jointes à ce message n’ont été ni signées ni chiffrées*\n\n possiblyPgpMime=Possiblement un message chiffré ou signé avec PGP/MIME ; utiliser la fonction Déchiffrer/vérifier pour le vérifier saveAttachmentHeader=Enigmail : enregistrer la pièce jointe déchiffrée noTempDir=Impossible de trouver un répertoire temporaire vers lequel écrire\nVeuillez définir la variable d’environnement TEMP attachmentPgpKey=La pièce jointe « %S » que vous souhaitez ouvrir semble être un fichier de clé OpenPGP.\n\nCliquer sur Importer pour importer la clé contenue ou Visualiser pour visualiser le contenu du fichier dans une fenêtre de navigation beginPgpPart=********* *DÉBUT DE LA PARTIE CHIFFRÉE ou SIGNÉE* ********* endPgpPart=********** *FIN DE LA PARTIE CHIFFRÉE ou SIGNÉE* ********** notePartEncrypted=Enigmail : *Des parties du message n’ont été NI signées NI chiffrées* noteCutMessage=Enigmail : *plusieurs blocs de message ont été trouvés — le déchiffrement, la vérification ont été abandonnés* decryptOkNoSig=Avertissement\n\nLe déchiffrement a réussi, mais la signature n’a pas pu être vérifiée correctement msgOvl.button.contAnyway=&Continuer quand même signature.verifiedOK=La signature pour la pièce jointe %S a été vérifiée avec succès signature.verifyFailed=Impossible de vérifier la signature de la pièce jointe %S attachment.noMatchToSignature=Impossible de faire correspondre la pièce jointe « %S » à un fichier de signature attachment.noMatchFromSignature=Impossible de faire correspondre le fichier de signature « %S » à une pièce jointe fixBrokenExchangeMsg.failed=La réparation du message n’a pas été possible. enigmail.msgViewColumn.label=Enigmail enigmailPep.msgViewColumn.label=Enigmail/p≡p wksNoIdentity=Cette clé n’est liée à aucun de vos comptes de courriel. Veuillez ajouter un compte pour au moins l’une des adresses courriel suivantes :\n\n%S wksConfirmSuccess=Le courriel de confirmation a été envoyé. wksConfirmFailure=Échec d’envoi du courriel de confirmation. autocrypt.importSetupKey.accountPreconfigured=Votre compte est déjà configuré correctement pour Autocrypt.\n\nVoulez-vous vraiment remplacer vos paramètres par ce message de configuration ? autocrypt.importSetupKey.selfCreated=Ce message a été créé par votre instance actuelle d’Enigmail.\n\nVeuillez basculer vers le client de courriel vers lequel vous souhaitez transférer les paramètres et cliquer sur le message s’y trouvant pour importer les paramètres. autocrypt.importSetupKey.invalidMessage=Erreur — impossible de lire le message de configuration. Le message semble corrompu. Veuillez essayer de créer un nouveau message de configuration sur votre « autre » appareil. autocrypt.importSetupKey.invalidKey=Erreur — impossible d’importer la clé. La clé n’est soit pas prise en charge par cette version de GnuPG, soit corrompue. autocrypt.importSetupKey.wrongPasswd=Le mot de passe que vous avez saisi est erroné. Souhaitez-vous ressayer ? autocrypt.importSetupKey.success=Le message de configuration Autocrypt a été traité avec succès. Autocrypt est maintenant proposé pour votre compte « %S » ##################################################################### # Strings in enigmailMsgComposeOverlay.js ##################################################################### keysToExport=Sélectionner les clés OpenPGP à insérer keysToUse=Sélectionner la ou les clés OpenPGP à utiliser pour %S pubKey=Clé publique de %S\n windowLocked=La fenêtre de rédaction est verrouillée ; l’envoi a été annulé sendUnencrypted=Échec d’initialisation d’Enigmail.\nEnvoyer le message sans chiffrement ? composeSpecifyEmail=Veuillez indiquer votre adresse courriel principale, adresse qui sera utilisée pour choisir la clé de signature des courriels sortants.\nSi vous laissez le champ vide, l’adresse DE du courriel sera utilisée pour choisir la clé. sendingHiddenRcpt=Ce message a des destinataires cachés (Cci). Si ce message est chiffré, il est possible de cacher les destinataires Cci, mais les utilisateurs de certains produits (p. ex. PGP Corp.) ne pourront pas déchiffrer le message. C’est pour cela que nous recommandons d’éviter les courriels Cci pour les messages chiffrés. sendWithHiddenBcc=Cacher les destinataires Cci sendWithShownBcc=Chiffrer normalement sendingNews=L’opération d’envoi chiffré a été annulée.\n\nCe message ne peut pas être chiffré, car certains destinataires sont des forums. Veuillez renvoyer le message sans chiffrement. sendToNewsWarning=Avertissement : Vous êtes sur le point d’envoyer un courriel chiffré à un forum.\n\nCela est déconseillé, car il ne serait logique de le faire que si tous les membres du forum peuvent déchiffrer le courriel, c.-à-d. que le courriel doit être chiffré avec les clés de tous les membres du forum. Veuillez n’envoyer ce courriel que si vous savez exactement ce que vous faites.\n\nContinuer ? hasHTML=Avertissement de courriel HTML :\nCe message contient peut-être du HTML, ce qui pourrait entraîner l’échec de la signature ou du chiffrement. Pour éviter cela à l’avenir, vous devriez appuyer sur la touche Maj en cliquant sur le bouton Rédiger/Répondre pour envoyer un courriel signé.\nSi vous signez les courriels par défaut, vous devriez décocher le paramètre « Rédiger les messages en HTML » afin de désactiver de façon permanente les courriels HTML pour ce compte de courriel. strippingHTML=Le message contient des informations de formatage HTML qui seront perdues lors de la conversion en texte clair pour la signature ou le chiffrement. Souhaitez-vous continuer ? msgCompose.button.sendAnyway=&Envoyer le message quand même attachWarning=Les pièces jointes de ce message ne sont pas locales, elles ne peuvent donc pas être chiffrées. Afin de chiffrer les pièces jointes, enregistrez-les d’abord localement, puis joignez-les. Souhaitez-vous quand même envoyer le message ? quotedPrintableWarn=Vous avez activé l’encodage « quoted-printable (citation imprimable) » pour l’envoi de messages. Cela peut entraîner un déchiffrement ou une vérification incorrects de votre message.\nSouhaitez-vous désactiver maintenant l’envoi de messages avec cette option ? minimalLineWrapping=Vous avez défini le retour à la ligne automatique à %S caractères. Pour un chiffrement ou une signature corrects, cette valeur doit être d’au moins 68.\nSouhaitez-vous définir le retour à la ligne automatique à 68 caractères maintenant ? warning=Avertissement signIconClicked=Vous avez modifié la signature manuellement. De ce fait, pendant la rédaction de ce message, l’activation ou la désactivation de la signature ne dépend plus de l’activation ou de la désactivation du chiffrement. errorOwnKeyUnusable=L’ID de clé « %S » configuré pour l’identité courante ne produit pas de clé OpenPGP valide.\n\nVeuillez vous assurer que la clé OpenPGP est valide, non expirée et que les paramètres de votre compte sont dirigés vers cette clé.\nSi votre clé n’est pas expirée, vérifiez ensuite si vous avez bien défini le niveau de confiance envers le propriétaire à élevé ou absolu. msgCompose.cannotSaveDraft=Erreur d’enregistrement du brouillon msgCompose.partiallyEncrypted.short=Méfiez-vous de ne pas divulguer des renseignements délicats — le courriel est chiffré partiellement. msgCompose.partiallyEncrypted.mimeMsg=Le message auquel vous répondez contenait à la fois des parties non chiffrées et chiffrées. Certaines parties chiffrées du message sont invisibles à vos yeux.\n\nSi l’expéditeur n’a pas réussi à déchiffrer initialement les parties cachées du message, vous divulguerez peut-être des renseignements confidentiels que l’expéditeur n’a pas réussi à déchiffrer.\n\nNous vous recommandons de ne pas répondre au message, mais d’en créer un nouveau contenant votre réponse. msgCompose.partiallyEncrypted.inlinePGP=Le message auquel vous répondez contient à la fois des parties non chiffrées et chiffrées. Si l’expéditeur n’a pas réussi à déchiffrer initialement les parties cachées du message, vous divulguerez peut-être des renseignements confidentiels que l’expéditeur n’a pas réussi à déchiffrer.\n\nVeuillez envisager d’effacer tout texte cité de votre réponse à cet expéditeur. msgCompose.internalEncryptionError=Erreur interne : le chiffrement promis est désactivé msgCompose.internalError=Une erreur interne est survenue. msgCompose.toolbarTxt.signAndEncrypt=Ce message sera signé et chiffré msgCompose.toolbarTxt.signOnly=Ce message sera signé msgCompose.toolbarTxt.encryptOnly=Ce message sera chiffré msgCompose.toolbarTxt.noEncryption=Ce message ne sera ni signé ni chiffré msgCompose.toolbarTxt.disabled=Enigmail est désactivé pour l’identité sélectionnée msgCompose.protectSubject.tooltip=Protéger l’objet du message msgCompose.noSubjectProtection.tooltip=Ne pas protéger l’objet du message msgCompose.encryptedSubjectStub=Message chiffré msgCompose.protectSubject.dialogTitle=Activer la protection de l’objet du message ? msgCompose.protectSubject.question=Les courriels ordinaires non chiffrés contiennent l’objet non dissimulé.\n\nNous avons établi une norme pour cacher l’objet original du courriel chiffré et le remplacer par un faux texte afin que l’objet ne soit visible qu’une fois le courriel déchiffré.\n\nSouhaitez-vous protéger l’objet des courriels chiffrés ? msgCompose.protectSubject.yesButton=&Protéger l’objet msgCompose.protectSubject.noButton=&Laisser l’objet sans protection msgCompose.detailsButton.label=Détails… msgCompose.detailsButton.accessKey=D msgCompose.pepSendUnknown=Inconnu msgCompose.pepSendUnsecure=Non sécurisé msgCompose.pepSendSecure=Sécurisé msgCompose.pepSendTrusted=Sécurisé et de confiance pep.alert.disabledForIdentity=p≡p est désactivé pour l’identité actuelle. Veuillez activer p≡p dans les préférences Enigmail/p≡p. pep.alert.weakReply=Vous êtes sur le point de répondre à un message sécurisé ou de le transférer de manière non sécurisée. Si vous choisissez de poursuivre, des renseignements confidentiels pourraient être divulgués, ce qui vous exposerait, ainsi que votre partenaire de communication, à des risques. Voulez-vous vraiment continuer ? # note: should end with double newline: sendAborted=L’opération d’envoi a été annulée.\n\n # details: keyNotTrusted=Le niveau de confiance de la clé « %S » est insuffisant keyNotFound=La clé « %S » est introuvable keyRevoked=La clé « %S » est révoquée keyExpired=La clé « %S » est expirée statPGPMIME=PGP/MIME statSMIME=S/MIME statSigned=SIGNÉ statEncrypted=CHIFFRÉ statPlain=NON SIGNÉ et NON CHIFFRÉ offlineSave=Enregistrer le message %1$S à %2$S dans le dossier « Messages non envoyés » ? onlineSend=Envoyer le message %1$S à %S ? encryptKeysNote=Note : Le message est chiffré pour les ID utilisateurs et clés suivants : %S hiddenKey= signFailed=Erreur Enigmail : échec de chiffrement ou de signature. Envoyer le message non chiffré ? msgCompose.button.sendUnencrypted=&Envoyer le message non chiffré recipientsSelectionHdr=Sélectionner les destinataires pour le chiffrement configureNow=Vous n’avez pas encore configuré la sécurité Enigmail pour l’identité sélectionnée. Souhaitez-vous le faire maintenant ? # encryption/signing status and associated reasons: encryptMessageAuto=Chiffrer le message (automatique) encryptMessageNorm=Chiffrer le message signMessageAuto=Signer le message (automatique) signMessageNorm=Signer le message encryptOff=Chiffrement : DÉSACTIVÉ encryptOnWithReason=Chiffrement : ACTIVÉ (%S) encryptOffWithReason=Chiffrement : DÉSACTIVÉ (%S) encryptOn=Chiffrement : ACTIVÉ signOn=Signature : activée signOff=Signature : désactivée signOnWithReason=Signature : activée (%S) signOffWithReason=Signature : désactivée (%S) reasonEnabledByDefault=activé par défaut reasonManuallyForced=forcé manuellement reasonByRecipientRules=forcé par les règles par destinataire reasonByAutoEncryption=forcé par le chiffrement automatique reasonByConflict=à cause d’un conflit dans les règles par destinataire reasonByEncryptionMode=à cause du mode de chiffrement # should not be used anymore: encryptYes=Le message sera chiffré encryptNo=Le message ne sera pas chiffré # should not be used anymore: signYes=Le message sera signé signNo=Le message ne sera pas signé # PGP/MIME status: pgpmimeNormal=Protocole : PGP/MIME inlinePGPNormal=Protocole : PGP intégré smimeNormal=Protocole : S/MIME pgpmimeAuto=Protocole : PGP/MIME (automatique) inlinePGPAuto=Protocole : PGP intégré (auto) smimeAuto=Protocole : S/MIME (automatique) # should not be used anymore pgpmimeYes=PGP/MIME sera utilisé pgpmimeNo=PGP intégré sera utilisé # Attach own key status (tooltip strings): attachOwnKeyNo=Votre propre clé ne sera pas jointe attachOwnKeyYes=Votre propre clé sera jointe attachOwnKeyDisabled=Votre propre clé ne peut pas être jointe. Pour activer cette fonction, vous devez sélectionner une clé précise dans la section OpenPGP des paramètres de compte. rulesConflict=Un conflit de règles par destinataire a été détecté\n%S\n\nEnvoyer le message avec ces paramètres ? msgCompose.button.configure=&Configurer msgCompose.button.send=&Envoyer le message msgCompose.button.save=Enregi&strer le message # Strings in enigmailMsgHdrViewOverlay.js keyNeeded=La clé publique « %S » est exigée pour vérifier la signature keyUsed=La clé publique %S a été utilisée pour vérifier la signature clickDecrypt= ; utiliser la fonction Déchiffrer/Vérifier clickDecryptRetry=  ; utiliser la fonction « Déchiffrer/Vérifier » pour ressayer clickDetailsButton= ; cliquer sur le bouton « Détails » pour de plus amples informations clickImportButton= ; cliquer sur le bouton « Importer la clé » pour l’importer keyTypeUnsupported= ; le type de clé n’est pas pris en charge par votre version de GnuPG msgPart=Partie du message %S msgSigned=signé msgSignedUnkownKey=signé avec une clé inconnue msgEncrypted=chiffré msgSignedAndEnc=signé et chiffré unverifiedSig=Signature non vérifiée incompleteDecrypt=Le déchiffrement n’a pas abouti needKey=Erreur — aucune clé privée n’a été trouvée pour déchiffrer le message failedDecrypt=Erreur — échec de déchiffrement badPhrase=Erreur — phrase de passe erronée mdcError=Erreur - l'intégrité du message n'était pas protégée failedDecryptVerify=Erreur — échec du déchiffrement ou de la vérification viewInfo= ; pour plus de détails, Affichage > Infos de sécurité Enigmail decryptedMsg=Message déchiffré decryptedMsgWithFormatError=Message déchiffré (restauration d’un format de courriel PGP défectueux probablement causé par un ancien serveur Exchange ; le résultat pourrait ne pas être complètement lisible) usedAlgorithms=Algorithmes utilisés : %S et %S pepStatusInfo.text=État de message p≡p. pepStatusInfo.title.m3=Cible d’une attaque pepStatusInfo.info.m3=Ce message n’est pas sécurisé et a été altéré. pepStatusInfo.title.m1=Non digne de confiance pepStatusInfo.info.m1=Un des partenaires de communication de ce message a précédemment été marqué comme non digne de confiance pepStatusInfo.title.r0=Inconnu pepStatusInfo.info.r0=Ce message ne contient pas suffisamment d’informations pour déterminer s’il est sécurisé. pepStatusInfo.title.r1=Impossible de déchiffrer pepStatusInfo.info.r1=Ce message ne peut pas être déchiffré, car la clé n’est pas disponible. pepStatusInfo.title.r2=Impossible de déchiffrer pepStatusInfo.info.r2=Ce message ne peut pas être déchiffré, car la clé n’est pas disponible. pepStatusInfo.title.r3=Non sécurisé pepStatusInfo.info.r3=Ce message n’est pas sécurisé. pepStatusInfo.title.r4=Non sécurisé pour certains pepStatusInfo.info.r4=Ce message n’est pas sécurisé pour certains partenaires de communication. pepStatusInfo.title.r5=Sécurité non fiable pepStatusInfo.info.r5=La protection de ce message n’est pas fiable. pepStatusInfo.title.r6=Sécurisé… pepStatusInfo.info.r6=Ce message est sécurisé, mais vous devez quand même vérifier l’identité de votre partenaire de communication. pepStatusInfo.title.r7=Sécurisé et de confiance pepStatusInfo.info.r7=Ce message est sécurisé et de confiance. pepStatusInfo.color.green=Vert pepStatusInfo.color.yellow=Jaune pepStatusInfo.color.red=Rouge pepRevokeTrust.question=Voulez-vous vraiment supprimer le niveau de confiance en %S ? pepRevokeMistrust.question=Souhaitez-vous vraiment accorder votre confiance de nouveau à la clé de %S ? pepRevokeTrust.doRevoke=Annuler la &confiance wksConfirmationReq=Demande de confirmation de l’annuaire de clés Web (WKD) wksConfirmationReq.message=Ce message a été envoyé par votre fournisseur de services de courriel pour confirmer le déploiement de votre clé publique OpenPGP dans son annuaire de clés Web (WKD).\nEn fournissant votre clé publique, vous facilitez la découverte de votre clé, permettant aux autres de chiffrer les courriels qu’ils vous envoient.\n\nSi vous souhaitez propager votre clé dans l’annuaire de clés Web (WKD), veuillez cliquer sur le bouton « Confirmer la demande » dans la barre d’état.\nSinon, ignorez simplement ce message. wksConfirmationReq.button.label=Confirmer la demande autocryptSetupReq=Lancer la configuration Autocrypt autocryptSetupReq.button.label=Lancer la configuration autocryptSetupReq.setupMsg.desc=Ce message contient tous les renseignements pour transférer vos paramètres Autocrypt ainsi que votre clé privée en toute sécurité à partir de votre appareil d’origine. autocryptSetupReq.setupMsg.backup=Vous pouvez conserver ce message et l’utiliser comme sauvegarde de votre clé privée. Si vous souhaitez le faire, vous devriez noter le mot de passe et le conservez à l’abri. autocryptSetupReq.message.import=Pour importer les paramètres et clés dans Enigmail, veuillez cliquer sur le bouton « Lancer la configuration » dans la barre d’état. autocryptSetupReq.message.sent=Veuillez cliquer sur le message sur votre nouvel appareil et suivre les instructions pour importer les paramètres. # strings in pref-enigmail.js oldGpgVersion20=Échec d’initialisation d’Enigmail.\n\nVous utilisez GnuPG version %1$S, qui n’est plus prise en charge. Enigmail exige GnuPG version %2$S ou ultérieure. Veuillez mettre à niveau votre installation de GnuPG, ou Enigmail ne fonctionnera pas. locateGpg=Localiser le programme GnuPG invalidGpgPath=GnuPG ne peut pas être exécuté avec le chemin indiqué. Enigmail est donc désactivé jusqu’à ce que vous changiez le chemin vers GnuPG ou redémarriez l’application. warningsAreReset=Tous les avertissement ont été réinitialisés. prefs.gpgFound=GnuPG a été trouvé dans %S prefs.gpgNotFound=Impossible de trouver GnuPG prefs.warnAskNever=Avertissement : Activer cette option entraînera l’envoi de courriels non chiffrés sans autre notification si l’un des destinataires n’a pas de clé — Enigmail ne vous signalera pas de tels cas ! prefs.warnIdleTimeForUnknownAgent=Impossible de se connecter à gpg-agent. Votre système utilise peut-être un outil spécialisé pour gérer les phrases de passe (p. ex. les trousseaux gnome-keyring, seahorse-agent ou le gestionnaire de porte-monnaie KDE…). Malheureusement Enigmail ne peut pas contrôler le délai de mémorisation pour l’outil que vous utilisez. Par conséquent, les paramètres de délai de mémorisation d’Enigmail seront ignorés. prefEnigmail.oneKeyserverOnly=Erreur — vous ne pouvez indiquer qu’un seul serveur de clés pour le téléchargement automatique des clés OpenPGP manquantes. # Strings used in core.jsm # (said file also re-uses some strings from above) enterAdminPin=Veuillez saisir le NIP d’administration de votre carte à puce intelligente enterCardPin=Veuillez saisir le NIP de votre carte à puce intelligente notInit=Erreur — le service Enigmail n’est pas encore initialisé badCommand=Erreur — échec de la commande de chiffrement cmdLine=ligne de commande et sortie : notRequired=Erreur — aucun chiffrement nécessaire notComplete=Erreur — la génération de clé n’est pas encore terminée invalidEmail=Erreur — adresses courriel invalides noPassphrase=Erreur — aucune phrase de passe n’a été saisie noPGPblock=Erreur — aucun bloc de données OpenPGP blindé valide n’a été trouvé unverifiedReply=La partie indentée du message (réponse) a probablement été modifiée keyInMessageBody=Une clé a été trouvée dans le corps du message. Cliquer sur « Importer la clé » pour l’importer sigMismatch=Erreur — la signature ne correspond pas cantImport=Erreur d’importation de la clé publique\n\n doImportOne=Importer %1$S (%2$S) ? doImportMultiple=Importer les clés suivantes ?\n\n%S previewFailed=Impossible de lire le fichier de la clé publique. # Strings used in errorHandling.jsm sc.wrongCardAvailable=La carte à puce intelligente %1$S détectée dans votre lecteur ne peut pas être utilisée pour traiter le message.\nVeuillez insérer votre carte %2$S et recommencer l’opération. sc.insertCard=Cette opération exige votre carte à puce intelligente %S.\nVeuillez insérer la carte exigée et recommencer l’opération. sc.removeCard=Cette opération exige qu’aucune carte à puce intelligente ne soit dans le lecteur.\nVeuillez retirer votre carte et recommencer l’opération. sc.noCardAvailable=Aucune carte à puce intelligente n’a été trouvée dans votre lecteur.\nVeuillez insérer votre carte et recommencer l’opération. sc.noReaderAvailable=Impossible d’accéder à votre lecteur de cartes à puce intelligente.\nVeuillez connecter votre lecteur de cartes, insérer votre carte et recommencer l’opération. keyError.keySpecNotFound=L’adresse courriel « %S » ne correspond à aucune clé de votre trousseau. keyError.keyIdNotFound=L’ID de clé « %S » configuré ne se trouve pas dans votre trousseau. keyError.resolutionAction=Veuillez sélectionner une clé valide dans la section OpenPGP de vos paramètres de compte. missingPassphrase=Phrase de passe manquante errorHandling.gpgAgentInvalid=Votre système utilise une version de gpg-agent qui n’est pas adaptée à votre version de GnuPG. errorHandling.gpgAgentError=GnuPG a signalé une erreur de communication avec gpg-agent (un composant de GnuPG). errorHandling.dirmngrError=GnuPG a signalé une erreur de communication avec dirmngr (un composant de GnuPG). errorHandling.pinentryError=GnuPG ne peut demander votre phrase de passe avec pinentry. errorHandling.readFaq=Ceci est une erreur de configuration du système qui empêche Enigmail de fonctionner correctement et qui ne peut pas être corrigée automatiquement.\n\nNous vous conseillons vivement de consulter notre page Web de soutien https://enigmail.net/faq gpgNotFound=Impossible de trouver le programme GnuPG « %S ».\nAssurez-vous d’avoir correctement défini le chemin de l’exécutable GnuPG dans les préférences d’Enigmail. gpgNotInPath=Impossible de trouver l’exécutable GnuPG dans le chemin.\nAssurez-vous d’avoir correctement défini le chemin de l’exécutable GnuPG dans les préférences d’Enigmail. enigmailNotAvailable=Le service principal d’Enigmail n’est pas disponible prefGood=Signature correcte de %S prefBad=MAUVAISE signature de %S failCancel=Erreur — la réception de clé a été annulé par l’utilisateur failNoServer=Erreur — aucun serveur de clés n’a été indiqué pour en recevoir des clés failNoID=Erreur — aucun ID de clé n’a été indiqué pour en recevoir la clé failKeyExtract=Erreur — échec de la commande d’extraction de clé notFirstBlock=Erreur — le premier bloc de données OpenPGP n’est pas un bloc de clé publique importKeyConfirm=Importer les clés publiques intégrées au message ? failKeyImport=Erreur — échec d’importation de la clé fileWriteFailed=Échec d’écriture dans le fichier %S importKey=Importer la clé publique %S du serveur de clés : uploadKey=Envoyer la clé publique %S au serveur de clés : keyId=ID de clé keyAndSigDate=ID de clé : 0x%1$S / Signée le : %2$S keyFpr=Empreinte de la clé : %S noEmailProvided=Vous n’avez indiqué aucune adresse courriel ! keyAlreadySigned=La clé est déjà signée et vous ne pouvez pas la signer deux fois. ##################################################################### # Strings used in enigmailKeySelection.js ##################################################################### selKeyExpired=expirée %S createdHeader=Créée atLeastOneKey=Aucune clé n’a été sélectionnée ! Vous devez sélectionner au moins une clé pour accepter cette boîte de dialogue fewerKeysThanRecipients=Vous avez sélectionné moins de clés que de destinataires. Êtes-vous certain que la liste de clés qui seront utilisées pour chiffrer est complète ? userSel.button.goBack=Sélectionner plus de clés userSel.secretKeySel.title=Sélectionner une clé privée OpenPGP pour signer vos messages userSel.problemNoKey=Aucune clé valide userSel.problemMultipleKeys=Multiclés # should be same as thunderbird ENTITY sendLaterCmd.label: sendLaterCmd.label=Envoyer plus tard # Strings used in enigmailAttachmentDialog.js pgpMimeNote=NOTE : PGP/MIME n’est pas pris en charge par tous les clients de courriel. Dans le doute, sélectionner l’option %S. first=première second=seconde # Strings used in am-enigprefs.js / enigmailEditIdentity.js encryptKeyHeader=Sélectionner une clé OpenPGP pour le chiffrement identityName=Identité : %S switchPepMode=Vous utilisez actuellement le mode « p≡p junior » d’Enigmail.\n\nEn activant OpenPGP ou S/MIME pour un compte, vous désactivez p≡p et utilisez le mode ordinaire sans p≡p. enableEnigmail=&Désactiver p≡p # Strings used in enigmailSingleRcptSettings.js noEncryption=Vous avez activé le chiffrement mais vous n’avez pas sélectionné de clé. Afin de chiffrer les messages envoyés à %1$S, vous devez indiquer une ou plusieurs clés valides de votre liste de clés. Souhaitez-vous désactiver le chiffrement pour %2$S ? noKeyToUse=(aucune — aucun chiffrement) noEmptyRule=La règle ne peut pas être vide ! Veuillez définir une adresse courriel dans le champ Règle. invalidAddress=Les adresses courriel que vous avez saisies ne sont pas valides. Vous ne devriez pas définir le nom des destinataires, seulement leur adresse courriel. Par exemple :\nInvalide : Un nom \nValide : un.nom@adresse.net noCurlyBrackets=Les accolades {} ont une signification particulière et ne devraient pas être utilisées dans une adresse courriel. Si vous souhaitez modifier le comportement de correspondance pour cette règle, utilisez l’option « Appliquer la règle si le destinataire... ».\nLe bouton Aide donne plus de renseignements à ce sujet. # Strings used in enigmailRulesEditor.js never=Jamais always=Toujours possible=Possible deleteRule=Souhaitez-vous vraiment supprimer la règle sélectionnée ? nextRcpt=(destinataire suivant) negateRule=Non addKeyToRule=Ajouter la clé %1$S (%2$S) à la règle par destinataire # Strings used in enigmailSearchKey.js needOnline=La fonction que vous avez sélectionnée n’est pas proposée en mode hors ligne. Veuillez passer en ligne et ressayer. protocolNotSupported=Le protocole « %S:// » que vous avez sélectionné n’est pas pris en charge pour télécharger des clés OpenPGP. gpgkeysDisabled=Il pourrait être bon d’activer l’option « extensions.enigmail.useGpgKeysTool ». noKeyserverConn=Impossible de se connecter au serveur de clés %S. keyDownloadFailed=Échec de téléchargement de la clé à partir du serveur de clés. Le message d’état est :\n%S internalError=Une erreur interne est survenue. Les clés n’ont pas pu être téléchargées ni importées. noKeyFound=Impossible de trouver une clé qui corresponde aux critères de recherche indiqués. keyDownload.keyUnavailable=Nous sommes désolés, mais la clé portant l’ID %S ne se trouve pas sur ce serveur de clés. Le propriétaire de la clé ne l’a probablement pas téléversée vers le serveur de clés.\n\nVeuillez demander à l’expéditeur du message de vous envoyer sa clé par courriel. # gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. gpgKeysFailed=Échec de recherche ou de téléchargement de la clé à partir du serveur de clés : impossible d’exécuter gpgkeys_%S. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Échec de définition du niveau de confiance envers le propriétaire # Strings in enigmailSignKeyDlg.js signKeyFailed=Échec de signature de la clé alreadySigned.label=Note : La clé %S est déjà signée avec la clé privée sélectionnée. alreadySignedexportable.label=Note : La clé %S est déjà signée comme étant exportable avec la clé privée sélectionnée. Une signature locale n’est donc pas logique. partlySigned.label=Note : Certains ID utilisateurs de la clé %S sont déjà signés avec la clé privée sélectionnée. noTrustedOwnKeys=Aucune clé susceptible d’être utilisée pour la signature n’a été trouvée ! Il vous faut au moins une clé privée de confiance afin de signer d’autres clés. # Strings in enigmailKeyManager.js keyMan.loadingKeys=Chargement des clés, veuillez patienter… keyValid.unknown=inconnue keyValid.invalid=invalide keyValid.disabled=désactivée keyValid.revoked=révoquée keyValid.expired=expirée keyValid.noSubkey=aucune sous-clé valide keyTrust.untrusted=non fiable keyTrust.marginal=confiance modérée keyTrust.full=fiable keyTrust.ultimate=confiance absolue keyTrust.group=(groupe) keyType.public=pub keyType.publicAndSec=pub/priv keyMan.enableKey=Activer la clé keyMan.disableKey=Désactiver la clé userAtt.photo=Attribut utilisateur (image JPEG) asciiArmorFile=Fichiers blindés ASCII (*.asc) importKeyFile=Importer un fichier de clé OpenPGP gnupgFile=Fichiers GnuPG createKeyOK=Votre clé a été générée saveRevokeCertAs=Créer et enregistrer un certificat de révocation revokeCertOK=Le certificat de révocation a été créé avec succès. Vous pouvez l’utiliser pour invalider votre clé publique, en cas de perte de votre clé privée par exemple. revokeCertFailed=Impossible de créer le certificat de révocation. addUidOK=L’ID utilisateur a été ajouté avec succès addUidFailed=Échec d’ajout de l’ID utilisateur noKeySelected=Vous devriez choisir au moins une clé pour effectuer l’opération sélectionnée exportToFile=Exporter la clé publique dans un fichier exportKeypairToFile=Exporter les clés privée et publique dans un fichier exportSecretKey=Souhaitez-vous inclure la clé privée dans le fichier de clé OpenPGP enregistré ? saveKeysOK=Les clés ont été enregistrées avec succès saveKeysFailed=Échec d’enregistrement des clés importKeysFailed=Échec d’importation des clés enableKeyFailed=Échec d’activation/de désactivation des clés specificPubKeyFilename=%1$S (0x%2$S) pub specificPubSecKeyFilename=%1$S (0x%2$S) pub-priv defaultPubKeyFilename=Clés-publiques-exportées defaultPubSecKeyFilename=Clés-publique-et-privée-exportées noSecretKeys=Aucune clé privée n’a été trouvée.\n\nSouhaitez-vous générer votre propre clé maintenant ? sendKeysOk=Les clés ont été envoyées avec succès sendKeysFailed=Échec d’envoi des clés receiveKeysOk=Les clés ont été mises à jour avec succès receiveKeysFailed=Échec de téléchargement des clés importFromClip=Souhaitez-vous importer des clés du presse-papiers ? importFromUrl=Télécharger une clé publique à partir de cette URL : copyToClipbrdFailed=Impossible de copier les clés sélectionnées dans le presse-papiers. copyToClipbrdOK=Les clés ont copiées dans le presse-papiers deleteSecretKey=AVERTISSEMENT : Vous êtes sur le point de supprimer une clé privée !\nSi vous supprimez votre clé privée, vous ne serez plus en mesure de déchiffrer les messages chiffrés pour cette clé ni de la révoquer.\n\nSouhaitez-vous vraiment supprimer à la fois la clé privée et la clé publique « %S » ? deleteMix=AVERTISSEMENT : Vous êtes sur le point de supprimer des clés privées !\nSi vous supprimez votre clé privée, vous ne serez plus en mesure de déchiffrer les messages chiffrés pour cette clé.\n\nSouhaitez-vous vraiment supprimer à la fois les clés privées et publiques sélectionnées ? deletePubKey=Souhaitez-vous supprimer la clé publique « %S » ? deleteSelectedPubKey=Souhaitez-vous supprimer les clés publiques ? deleteKeyFailed=Impossible de supprimer la clé. revokeKeyQuestion=Vous êtes sur le point de révoquer la clé « %S ».\n\nVous ne serez plus en mesure de signer avec cette clé, et une fois que la révocation sera propagée, les autres ne pourront plus chiffrer avec cette clé. Vous pouvez encore l’utiliser pour déchiffrer les messages anciens.\n\nVoulez-vous continuer ? revokeKeyOk=La clé a été révoquée. Si votre clé se trouve sur un serveur de clés, il est recommandé de la retéléverser afin que les autres voient la révocation. revokeKeyFailed=La clé n’a pas pu être révoquée. revokeKeyNotPresent=Vous n’avez aucune clé (0x%S) qui corresponde à ce certificat de révocation !\n\nSi vous avez perdu votre clé, vous devez l’importer (p. ex. d’un serveur de clés), avant d’utiliser ce certificat de révocation ! revokeKeyAlreadyRevoked=La clé 0x%S a déjà été révoquée. refreshAllQuestion=Vous n’avez sélectionné aucune clé. Souhaitez-vous actualiser TOUTES les clés ? refreshKeyServiceOn.warn=Avertissement : Vos clés sont en cours d’actualisation en arrière-plan, de manière aussi sécurisée que possible.\nL’actualisation de toutes vos clés en même temps divulguera inutilement des renseignements à votre sujet.\nSouhaitez-vous vraiment le faire ? refreshKey.warn=Avertissement : En fonction du nombre de clés et de la vitesse de connexion, l’actualisation de toutes les clés pourrait prendre du temps ! downloadContactsKeys.warn=Avertissement : Selon le nombre de contacts et la vitesse de connexion, le téléchargement de toutes les clés pourrait prendre du temps ! downloadContactsKeys.importFrom=Importer les contacts du carnet d’adresses « %S » ? keyMan.button.exportSecKey=Exporter les clés &privées keyMan.button.exportPubKey=Exporter les clés &publiques seulement keyMan.button.import=&Importer keyMan.button.refreshAll=&Actualiser toutes les clés keyMan.button.revokeKey=&Révoquer la clé keyMan.button.skip=&Ignorer la clé keylist.noOtherUids=N’a pas d’autre identité keylist.hasOtherUids=Aussi connu sous les noms keylist.noPhotos=Il n’y a pas de photo keylist.hasPhotos=Photos keyMan.addphoto.filepicker.title=Sélectionner une photo à ajouter keyMan.addphoto.warnLargeFile=Le fichier que vous avez choisi fait plus de 25 ko.\nIl n’est pas recommandé d’ajouter de très gros fichiers, car cela entraîne de très grosses clés. keyMan.addphoto.noJpegFile=Le fichier sélectionné ne semble pas être un fichier JPEG. Veuillez en choisir un autre. keyMan.addphoto.failed=Impossible d’ajouter la photo. noWksIdentity=La clé %S n’a pas d’identité WKS. keyman.addBlacklistKey.msg=Voulez-vous vraiment que p≡p arrête d’utiliser la clé « %1$S (%2$S) » pour chiffrer les messages ? keyman.removeBlacklistKey.msg=Voulez-vous autoriser p≡p à utiliser la clé « %1$S (%2$S) » pour les messages futurs ? keyman.addBlacklistKey.button=&Mettre la clé sur liste noire keyman.removeBlacklistKey.button=&Retirer la clé de la liste noire # Strings in enigmailManageUidDlg.xul changePrimUidFailed=Échec de modification de l’ID utilisateur principal changePrimUidOK=L’ID utilisateur principal a été modifié avec succès revokeUidFailed=Échec de révocation de l’ID utilisateur %S revokeUidOK=L’ID utilisateur %S a été révoqué avec succès. Si votre clé se trouve sur un serveur de clés, il est recommandé de la retéléverser afin que les autres voient la révocation. revokeUidQuestion=Voulez-vous vraiment révoquer l’ID utilisateur %S ? # Strings in enigmailKeyImportInfo.xul importInfoTitle=Les clés ont été importées avec succès importInfoBits=Bits importInfoCreated=Créées importInfoFpr=Empreinte importInfoDetails=(Détails) importInfoNoKeys=Aucune clé n’a été importée. # Strings in enigmailKeyDetailsDlg.xul keyTypePublic=clé publique keyTypePrimary=clé principale keyTypeSubkey=sous-clé keyTypePair=biclé keyExpiryNever=jamais keyAlgorithm_1=RSA keyAlgorithm_2=RSA keyAlgorithm_3=RSA keyAlgorithm_16=ELG keyAlgorithm_17=DSA keyAlgorithm_18=ECDH keyAlgorithm_19=ECDSA keyAlgorithm_20=ELG keyAlgorithm_22=EDDSA keyUsageEncrypt=Chiffrer keyUsageSign=Signer keyUsageCertify=Certifier keyUsageAuthentication=Authentification keyDoesNotExpire=La clé n’expire pas # Strings in enigmailGenCardKey.xul keygen.started=Veuillez patienter pendant la génération de clé… keygen.completed=La clé a été créée. Le nouvel ID de clé est : 0x%S keygen.keyBackup=La clé est sauvegardée sous %S keygen.passRequired=Si vous souhaitez créer une copie de sauvegarde de votre clé externe à votre carte à puce intelligente, veuillez indiquer une phrase de passe. # Strings in enigmailSetCardPin.xul cardPin.processFailed=Échec de modification du NIP # Strings in enigRetrieveProgres.xul keyserverProgress.refreshing=Actualisation des clés, veuillez patienter… keyserverProgress.uploading=Téléversement des clés, veuillez patienter… keyserverProgress.wksUploadFailed=Impossible de téléverser votre clé vers le service de clés Web (WKS) keyserverProgress.wksUploadCompleted=Votre clé publique a été transmise à votre fournisseur avec succès. Vous recevrez un courriel pour confirmer que vous avez déclenché le téléversement. keyserverTitle.refreshing=Actualiser les clés keyserverTitle.uploading=Téléversement de clés # Strings in enigmailSetupWizard passphrase.min8keys=Votre phrase de passe doit comprendre au moins 8 caractères ! setupWizard.reallyCancel=Voulez-vous vraiment fermer l’assistant de configuration d’Enigmail ? setupWizard.invalidGpg=Le fichier que vous avez indiqué n’est pas un exécutable GnuPG. Veuillez en indiquer un autre. setupWizard.specifyFile=Vous devez au moins indiquer un fichier de clé publique pour poursuivre. setupWizard.installFailed=Il semble que l’installation n’ait pas réussi. Veuillez soit ressayer l’installation soit installer GnuPG manuellement et le localiser avec le bouton Parcourir. setupWizard.downloadForbidden=Pour votre sécurité, GnuPG ne sera pas téléchargé. Veuillez visiter https://gnupg.org/ pour télécharger GnuPG. setupWizard.downloadImpossible=Impossible de télécharger GnuPG pour le moment. Veuillez ressayer plus tard ou visiter https://gnupg.org/ pour télécharger GnuPG. setupWizard.hashSumError=L’assistant n’a pas pu vérifier l’intégrité du fichier téléchargé. Le fichier pourrait être endommagé ou altéré. Souhaitez-vous quand même poursuivre l’installation ? setupWizard.importSettingsFile=Indiquer un fichier de sauvegarde à partir duquel importer setupWizard.invalidSettingsFile=Le fichier indiqué n’est pas un fichier de sauvegarde valide de paramètres d’Enigmail. setupWizard.gpgConfExists=Le fichier de configuration GnuPG existe déjà. Souhaitez-vous le remplacer par celui de votre ancienne installation ? setupWizard.noGpgHomeDir=Il semblerait que vous ayez configuré %S pour être utilisé avec GnuPG. Cependant, ce n’est pas un répertoire. Vous ne pouvez pas l’utiliser. setupWizard.unmachtedIds=Il a été impossible de faire correspondre les identités suivantes de votre ancienne configuration :\n%S\nLes paramètres de ces identités ont été ignorés. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=Une erreur est survenue en tentant de télécharger GnuPG. Veuillez consulter le journal de la console pour plus de détails. installGnuPG.installFailed=Une erreur est survenue lors de l’installation de GnuPG. Veuillez consulter le journal de la console pour plus de détails. # Strings in enigmailAddUidDlg.xul addUidDlg.nameOrEmailError=Vous devez saisir un nom et une adresse courriel addUidDlg.nameMinLengthError=Le nom doit comprendre au moins 5 caractères addUidDlg.invalidEmailError=Vous devez indiquer une adresse courriel valide # Strings in enigmailCardDetails.js Carddetails.NoASCII=Les cartes à puce intelligente OpenPGP n’acceptent les caractères ASCII que dans le prénom et le nom. # network error types errorType.SecurityCertificate=Le certificat de sécurité présenté par le service Web n’est pas valide. errorType.SecurityProtocol=Le protocole de sécurité utilisé par le service Web est inconnu. errorType.Network=Une erreur réseau est survenue. # filter stuff filter.folderRequired=Vous devez sélectionner un dossier cible. filter.decryptMove.label=Déchiffrement permanent (Enigmail) filter.decryptCopy.label=Créer une copie déchiffrée (Enigmail) filter.decryptMove.warnExperimental=Avertissement : L’action de filtrage « Déchiffrement permanent » pourrait détruire des messages.\n\nNous vous recommandons fortement d’essayer d’abord le filtre « Créer une copie déchiffrée », de tester le résultat avec soin et de ne commencer à utiliser ce filtre qu’une fois que vous serez satisfait du résultat. filter.tempPepFilterDesc=Filtre temporaire pour enregistrer déchiffré le message envoyé filter.term.pgpencrypted.label=Chiffré avec OpenPGP filter.encrypt.label=Chiffrer avec la clé (Enigmail) filter.keyRequired=Vous devez sélectionner une clé de destinataire. filter.keyNotFound=Impossible de trouver une clé de chiffrement pour « %S ». filter.warn.keyNotSecret=Avertissement : L’action de filtrage « Chiffrer avec la clé » remplace les destinataires.\n\nSi vous ne possédez pas la clé privée de « %S », vous ne pourrez plus lire les courriels. # strings in enigmailConvert.jsm converter.decryptBody.failed=Impossible de déchiffrer le message dont l’objet est\n« %S ».\nVoulez-vous recommencer avec une phrase de passe différente ou plutôt ignorer ce message ? converter.decryptAtt.failed=Impossible de déchiffrer la pièce jointe « %1$S »\ndu message dont l’objet est\n« %2$S ».\nVoulez-vous recommencer avec une phrase de passe différente ou plutôt ignorer ce message ? saveLogFile.title=Enregistrer le fichier journal # strings in gpg.jsm unknownSigningAlg=Algorithme de signature inconnu (ID : %S) unknownHashAlg=Empreinte cryptographique inconnue (ID : %S) # strings in keyRing.jsm keyring.photo=Photo keyRing.pubKeyRevoked=La clé %1$S (ID de clé %2$S) est révoquée. keyRing.pubKeyExpired=La clé %1$S (ID de clé %2$S) a expiré. keyRing.pubKeyNotForSigning=La clé %1$S (ID de clé %2$S) ne peut pas être utilisée pour signer. keyRing.pubKeyNotForEncryption=La clé %1$S (ID de clé %2$S) ne peut pas être utilisée pour chiffrer. keyRing.keyDisabled=La clé %1$S (ID de clé %2$S) est désactivée ; elle ne peut pas être utilisée. keyRing.keyNotTrusted=Vous n’avez pas accordé un niveau de confiance suffisant à la clé %1$S (ID de clé %2$S). Veuillez définir le niveau de confiance de votre clé à « absolu » afin de l’utiliser pour signer. keyRing.keyInvalid=La clé %1$S (ID de clé %2$S) est invalide. Veuillez envisager de la vérifier correctement. Vous pouvez autrement utiliser les paramètres de chiffrement par défaut des préférences d’Enigmail.. keyRing.signSubKeysRevoked=Toutes les sous-clés de signature de la clé %1$S (ID de clé %2$S) sont révoquées. keyRing.signSubKeysExpired=Toutes les sous-clés de signature de la clé %1$S (ID de clé %2$S) ont expiré. keyRing.signSubKeysUnusable=Toutes les sous-clés de signature de la clé %1$S (ID de clé %2$S) sont révoquées, ont expiré ou sont inutilisables. keyRing.encSubKeysRevoked=Toutes les sous-clés de chiffrement de la clé %1$S (ID de clé %2$S) sont révoquées. keyRing.encSubKeysExpired=Toutes les sous-clés de chiffrement de la clé %1$S (ID de clé %2$S) ont expiré. keyRing.noSecretKey=Vous ne semblez pas avoir la clé privée pour %1$S (ID de clé %2$S) dans votre trousseau ; vous ne pouvez pas utiliser la clé pour signer. keyRing.encSubKeysUnusable=Toutes les sous-clés de chiffrement de la clé %1$S (ID de clé %2$S) sont révoquées, ont expiré ou sont inutilisables. #strings in exportSettingsWizard.js cannotWriteToFile=Impossible d’enregistrer dans le fichier « %S ». Veuillez sélectionner un autre fichier. dataExportError=Une erreur est survenue lors de l’exportation de vos données. enigmailSettings=ParamètresEnigmail defaultBackupFileName=Enigmail-exportation specifyExportFile=Préciser le nom du fichier pour l’exportation homedirParamNotSUpported=Les paramètres supplémentaires qui configurent les chemins, comme « --homedir » et « --keyring », ne sont pas pris en charge pour importer/exporter vos paramètres. Veuillez utiliser d’autres méthodes, comme définir la variable d’environnement GNUPGHOME. #strings in expiry.jsm expiry.keyExpiresSoon=Votre clé %1$S arrivera à expiration dans moins de %2$S jours.\n\nNous vous recommandons de créer une nouvelle biclé et de configurer les comptes correspondants pour utiliser la nouvelle clé. expiry.keysExpireSoon=Vos clés suivantes arriveront à expiration dans moins de %1$S jours :\n%2$S.\nNous vous recommandons de créer de nouvelles clés et de configurer vos comptes pour qu’ils les utilisent. expiry.keyMissingOwnerTrust=Votre clé privée %S n’a pas de déclaration de confiance.\n\nNous vous recommandons de définir «Vous comptez sur des certifications» sur «confiance absolue» dans les propriétés de la clé. expiry.keysMissingOwnerTrust=Vos clés privées suivantes n’ont pas de déclaration de confiance.\n%S.\nNous vous recommandons de définir « Vous comptez sur des certifications » sur « confiance absolue » dans les propriétés de la clé. expiry.OpenKeyManager=Ouvrir la gestion des clés d’Enigmail expiry.OpenKeyProperties=Ouvrir les propriétés de la clé #strings in pEpDecrypt.jsm pEpDecrypt.cannotDecrypt=Ce message est chiffré. Malheureusement, vous n’avez pas la clé privé pour le déchiffrer. #strings in gpgAgent.jsm gpghomedir.notexists=Le dossier « %S » contenant vos clés OpenPGP n’existe pas et ne peut pas être créé. gpghomedir.notwritable=Le dossier « %S » contenant vos clés OpenPGP n’est pas accessible en écriture. gpghomedir.notdirectory=Le répertoire « %S » contenant vos clés OpenPGP est un fichier et non un répertoire. gpghomedir.notusable=Veuillez corriger les permissions du répertoire ou changer l’emplacement de votre répertoire « home » pour GnuPG. GnuPG ne pourra pas fonctionner correctement sans cela. #strings in pepTrustWords.js pepTrustWords.cannotVerifyOwnId=Impossible de vérifier les mots de confiance p≡p pour votre propre compte. pepTrustWords.cannotFindKey=Impossible de trouver une clé pour %S. pepTrustWords.cannotStoreChange=Impossible de modifier la confiance pour %S. pepTrustWords.generalFailure=Impossible d’obtenir les mots de confiance pour %S. pepTrustWords.partnerFingerprint=Empreinte de %S : #strings in mimeWkdHandler.jsm wkdMessage.body.req=Votre fournisseur de services de courriel a traité votre demande de téléversement de votre clé publique vers l’annuaire de clés Web (WKD) d’OpenPGP.\n\nVeuillez cliquer sur le bouton de confirmation dans l’en-tête d’Enigmail pour terminer la publication de votre clé publique. wkdMessage.body.process=Ce courriel est relatif au traitement automatique pour téléverser votre clé publique vers l’annuaire de clés Web (WKD) d’OpenPGP.\n\nVous n’avez aucune action manuelle à effectuer pour l’instant. #strings in pepHandshake.js pepPrivacyStatus.RatingBrokenSuggestion=L’expéditeur ou vous devriez renvoyer le message. pepPrivacyStatus.RatingHaveNoKeySuggestionOutgoing=Si vous avez rédigé ce message, votre clé n’est pas disponible. pepPrivacyStatus.RatingMistrustSuggestion=Rétablissez la connexion avec votre partenaire de communication et tentez d’initier une nouvelle poignée de main. pepPrivacyStatus.RatingReliableSuggestion=Confirmez la poignée de main avec votre partenaire de communication en échangeant vos mots de confiance en personne ou par téléphone. Une seule poignée de main est nécessaire par correspondant pour garantir des communications sécurisées, en toute confiance. pepPrivacyStatus.RatingTrustedSuggestion=Aucune action n’est requise ! pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Attention : ce message pourrait ne pas être sécurisé. pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Veuillez ajouter les renseignements requis. pepPrivacyStatus.RatingUnderAttackSuggestion=Vérifier par un autre moyen le contenu de ce message avec votre partenaire de communication. pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Assurez-vous que l’état de confidentialité de chacun de vos partenaires de communication est au moins sécurisé. pepPrivacyStatus.RatingUnencryptedSuggestion=Veuillez demander à votre partenaire de communication d’utiliser une solution de chiffrement ou d’installer p≡p. pepPrivacyStatus.RatingUnreliableSuggestion=Ce message n’a pas de chiffrement ni de signature fiable. Demandez à votre partenaire de communication de mettre à niveau sa solution de chiffrement ou d’installer p≡p. pepPrivacyStatus.RatingBrokenExplanation=Le chiffrement ou le formatage de ce message sont endommagés. pepPrivacyStatus.RatingHaveNoKeyExplanation=Ce message ne peut pas être déchiffré, car la clé correspondante n’est pas disponible. pepPrivacyStatus.RatingMistrustExplanation=Un des partenaires de communication de ce message a précédemment été marqué comme non digne de confiance pepPrivacyStatus.RatingReliableExplanation=Ce message est sécurisé, mais vous devez quand même vérifier l’identité de votre partenaire de communication. pepPrivacyStatus.RatingTrustedExplanation=Ce message est sécurisé et de confiance. pepPrivacyStatus.RatingUndefinedExplanation=Ce message ne contient pas suffisamment d’informations pour déterminer s’il est sécurisé. pepPrivacyStatus.RatingUnderAttackExplanation=Ce message n’est pas sécurisé et a été altéré. pepPrivacyStatus.RatingUnencryptedExplanation=Ce message n’est pas sécurisé. pepPrivacyStatus.RatingUnencryptedForSomeExplanation=Ce message n’est pas sécurisé pour certains partenaires de communication. pepPrivacyStatus.RatingUnreliableExplanation=La protection de ce message n’est pas fiable. pepPrivacyStatus.RatingBrokenText=Endommagée pepPrivacyStatus.RatingHaveNoKeyText=Impossible de déchiffrer pepPrivacyStatus.RatingMistrustText=Non digne de confiance pepPrivacyStatus.RatingReliableText=Sécurisé pepPrivacyStatus.RatingTrustedText=Sécurisé et de confiance pepPrivacyStatus.RatingUndefinedText=Inconnu pepPrivacyStatus.RatingUnderAttackText=Cible d’une attaque pepPrivacyStatus.RatingUnencryptedForSomeText=Non sécurisé pour certains pepPrivacyStatus.RatingUnencryptedText=Non sécurisé pepPrivacyStatus.RatingUnreliableText=Sécurité non fiable handshakeDlg.button.initHandshake=Poignée de main… handshakeDlg.button.stopTrust=Retirer la confiance handshakeDlg.button.reTrust=Faire confiance handshakeDlg.label.outgoingMessage=Message sortant handshakeDlg.label.incomingMessage=Message entrant handshakeDlg.error.noPeers=Impossible d’initier une poignée de main sans destinataire. handshakeDlg.error.noProtection=Veuillez activer la protection afin d’utiliser la fonction de poignée de main. enigmail.acSetupPasswd.descEnterPasswd=Veuillez saisir le code de configuration affiché sur l’autre appareil enigmail.acSetupPasswd.descCopyPasswd=Veuillez saisir le code de configuration ci-dessous sur votre autre appareil pour poursuivre la configuration #strings in autocrypt.jsm autocrypt.setupMsg.subject=Message de configuration Autocrypt autocrypt.setupMsg.msgBody=Pour configurer votre nouvel appareil pour Autocrypt, veuillez suivre les instructions qui devraient être affichées par votre nouvel appareil. autocrypt.setupMsg.fileTxt=Ceci est le fichier de configuration Autocrypt utilisé pour transférer paramètres et clés entre clients. Vous pouvez le déchiffrer en utilisant le code de configuration affiché sur votre ancien appareil, puis importer dans votre trousseau la clé incluse. #strings in upgradeInfo.html upgradeInfo.doctitle=Quoi de neuf dans Enigmail v2.0 ? upgradeInfo.welcome1=Bienvenue dans la nouvelle version 2.0 d’Enigmail ! upgradeInfo.welcome2=La version contient de nombreuses fonctions nouvelles ou modifiées. Veuillez prendre le temps de les découvrir : upgradeInfo.encSubject.title=Chiffrement de l’objet du message upgradeInfo.encSubject.desc=Nous avons développé une nouvelle méthode qui déplace l’objet au sein du message chiffré et remplace l’objet visible par « Message chiffré ». Une fois qu’un tel message est déchiffré, l’objet original est remplacé automatiquement. La dissimulation de l’objet est activée par défaut ; il existe toutefois une option pour la désactiver si vous le souhaitez. (Note : Cette fonction exige que le message soit envoyé avec PGP/MIME.) upgradeInfo.buttons.title=Nouveau comportement des boutons Chiffrer et Signer upgradeInfo.buttons.desc=Les boutons Chiffrer et Signer de la fenêtre de rédaction d’un message fonctionnent désormais à la fois avec les protocoles OpenPGP et S/MIME. Si les deux algorithmes sont possibles, Enigmail essaiera alors de favoriser celui pour lequel toutes les clés sont disponibles. upgradeInfo.autocrypt.title=Prise en charge d’Autocrypt upgradeInfo.autocrypt.desc=Enigmail prend désormais en charge Autocrypt, une nouvelle norme pour distribuer des clés comme faisant partie des messages envoyés. Enigmail importe automatiquement les clés des messages conformes à Autocrypt, permettant ainsi de chiffrer de plus en plus de courriels avec le temps. upgradeInfo.pEp.title=Nouveau mode p≡p junior (confidentialité plutôt facile [Pretty Easy Privacy]). upgradeInfo.pEp.desc=Enigmail contient désormais un mode p≡p junior. Vous devez actuellement installer p≡p pour pouvoir l’utiliser, mais cela changera dans une version future. Le mode p≡p junior vous permet d’utiliser le chiffrement OpenPGP de manière aussi transparente que possible ; vous n’avez plus à vous soucier de la gestion des clés ni de leurs synchronisations entre vos appareils. upgradeInfo.bottom.desc=Veuillez consulter notre documentation pour obtenir de l’aide sur l’utilisation d’Enigmail. pep.missingGnuPG=Afin d’utiliser Enigmail ou p≡p, GnuPG est exigé. Comme nous ne l’avons pas trouvé, nous vous suggérons de le télécharger et de l’installer pour vous. #strings in enigmailAbout.html aboutEnigmail.tabName=À propos d’Enigmail aboutEnigmail.title=La prise en charge d’OpenPGP est fournie par Enigmail aboutEnigmail.team=Enigmail est développé par l’Équipe Enigmail : aboutEnigmail.projectLeader=Développeur principal : aboutEnigmail.usability=Utilisabilité : aboutEnigmail.documentation=Documentation : aboutEnigmail.testing=Tests : aboutEnigmail.userSupport=Assistance technique : aboutEnigmail.localization=Traduction : consulter la page des paquets de langue d’Enigmail aboutEnigmail.Credits=Crédits : aboutEnigmail.origAuthor=auteur original de l’extension Enigmail aboutEnigmail.icons=Icônes : aboutEnigmail.formerMembers=Anciens membres de l’équipe : aboutEnigmail.projectHosting=Hébergement du projet : aboutEnigmail.licenseSupportTitle=Licence et assistance aboutEnigmail.license=Enigmail OpenPGP est un logiciel à code source ouvert sous licence %S aboutEnigmail.support=L’assistance et les téléchargements sont proposés sur www.enigmail.net. enigmail-2.0.8/lang/fr/help/000077500000000000000000000000001334302754500155745ustar00rootroot00000000000000enigmail-2.0.8/lang/fr/help/compose.html000066400000000000000000000111541334302754500201310ustar00rootroot00000000000000 Aide Enigmail : Modifier les rËgles OpenPGP

Aide Enigmail

Utiliser Enigmail lors de la rédaction de messages

  • Menu Enigmail dans la fenêtre de composition
    • Signer le message : Activer/Désactiver l'envoi de messages signés. L'utilisateur est prévenu si l'opération de signature échoue.
    • Chiffrer le message : Activer/Désactiver le chiffrement pour tous les destinataires avant l'envoi. L'utilisateur est prévenu si l'opération de chiffrement échoue.

      Si l'option Afficher une sélection si nécessaire est définie dans Préférences -> onglet Sélection clef, une liste de clefs apparaitra s'il y a dans le message des adresses de destination pour lesquelles vous n'avez pas de clef publique.

      Si l'option Ne jamais afficher le dialogue de sélection de clef est définie dans Préférences -> onglet Sélection clef et qu'il y a dans le message des adresses de destination pour lesquelles vous n'avez pas de clef publique, le message sera envoyé non chiffré.

    • Utiliser PGP/MIME pour ce message : Activer/Désactiver l'utilisation de PGP/MIME pour ce message.

      Si vous savez que le destinataire peut lire les messages utilisant le format PGP/MIME, il est conseillé de l'utiliser.

      Cette fonctionnalité est dépendante du réglage dans Préférences -> onglet PGP/MIME qui doit être Utiliser PGP/MIME si possible ou Toujours utiliser PGP/MIME.

    • Options de rédaction par défaut : Sous-menu.
      • Options de signature/chiffrement... : raccourci vers Paramètres des comptes -> Sécurité OpenPGP ;
      • Options d'envoi... : raccourci vers l'onglet Préférences -> Envoi ;
      • Options de sélection de clef... : raccourci vers l'onglet Préférences -> Sélection clef ;
      • Options PGP/MIME... : raccourci vers l'onglet Préférences -> PGP/MIME.
    • Annuler le chiffrement : S'il y a un problème lors de l'envoi effectif du message, par exemple parceque le serveur POP n'accepte pas la requête, Enigmail n'en sera pas informé, et le message sera toujours affiché chiffré dans la fenêtre de rédaction. En choississant ce menu, le chiffrement et la signature seront annulés et le message restauré dans sa forme texte originelle.
      Cette option peut être également utilisée en tant que solution temporaire pour déchiffrer les citations lors de la réponse à des messages chiffrés. Enigmail devrait automatiquement déchiffrer les citations mais si cela échoue pour une raison inconnue, il est possible d'utiliser ce menu pour forcer le déchiffrement.
    • Insérer une clef publique: insérer un bloc armure-ASCII d'une clef publique à la position courante du curseur dans la fenêtre de rédaction. L'adresse électronique de la clef à insérer sera demandée. Les clefs insérées de cette manière seront automatiquement reconnues par Enigmail du coté du destinataire. Après l'insertion de la clef, il est toujours possible de choisir de signer/chiffrer le message si nécessaire. De plus, il ne faut pas insérer plus d'un bloc de clef dans un message ; if faut juste spécifier plusieurs adresses, séparées par virgules ou des espaces, lors de la demande.
    • Oublier la phrase secrète: Effacer de la mémoire la phrase secrète mémorisée. Utile si vous avez plusieurs phrases secrètes.
    • Aide: Afficher les informations d'aide depuis le site Web (cette page).

De l'aide supplémentaire est disponible sur la page Web d'Enigmail

enigmail-2.0.8/lang/fr/help/editRcptRule.html000066400000000000000000000144141334302754500210740ustar00rootroot00000000000000 Aide Enigmail : Modifier les règles OpenPGP

Aide Enigmail

Utiliser l'éditeur de règles d'Enigmail : modifier les règles OpenPGP

Avec l'éditeur de règles, il est possible de définir les paramètres par défaut par destinataire concernant l'activation du chiffrement, de la signature, de PGP/MIME et de choisir quelle(s) clef(s) utiliser. Dans cette boite de dialogue, vous pouvez spécifier les règles pour un destinataire unique ou pour un groupe de destinataires ayant des attributs très proches.

  • Définir les règles OpenPGP pour : contient les adresses électroniques des destinataires (sans leur nom, c.à.d. juste une adresse comme personne@adresse.domaine). Il est possible de spécifier plusieurs adresses séparées par des espaces. L'adresse indiquée ici peut être réduite uniquement à la partie domaine de l'adresse afin de faire correspondre toutes les adresses vers ce domaine, par exemple @adresse.domaine correspondra à nafnaf@adresse.domaine, nifnif@adresse.domaine, noufnouf@adresse.domaine, etc ;
  • Appliquer la règle si le destinataire... : Ceci modifie la correspondance des adresses. Si plusieurs adresses sont saisies, le réglages s'applique à toutes. Les exemples ci-dessous sont basés sur le fait que naf@adresse.domaine à été saisi dans le champ règles OpenPGP ci-dessus :
    • Est exactement : avec ce réglage, la règle s'appliquera uniquement sur des messages à destination de naf@adresse.domaine (correspondance exacte, insensible à la casse),
    • Contient : avec ce réglage, n'importe quelle adresse contenant la chaîne correspond, par exemple nafnaf@adresse.domaine ou aeronaf@adresse.domaine.net,
    • Débute par : avec ce réglage, n'importe quelle adresse commençant par la chaîne correspond, par exemple naf@adresse.domaine.net, naf@adresse.domaine-nom.com,
    • Se termine par : avec ce réglage, n'importe quelle adresse finissant par la chaîne correspond, par exemple nafnaf@adresse.domaine, nafnafnaf@adresse.domaine ;
  • Continuer avec la prochaine règle pour l'adresse correspondante
    Activer cette fonctionnalité vous permettra de définir une règle sans avoir à spécifier un ID de clef dans le champ Utiliser les clefs OpenPGP suivantes : , de ce fait l'adresse électronique est utilisée pour trouver une clef au moment de l'envoi. De plus, les règles suivantes pour la (les) même(s) adresse(s) seront traitées également.
  • Ne pas vérifier les prochaines règles pour l'adresse correspondante
    Activer cette fonctionnalité interrompra le traitement des autres règles pour l'adresse correspondante si la règle en cours correspond ; c.à.d. que le traitement des règles continu avec le destinataire suivant.
  • Utiliser les clefs OpenPGP suivantes :
    Utilisez le bouton Sélectionner les clefs... pour sélectionner la clef du destinataire à utiliser pour le chiffrement. Comme dans l'option ci-dessus, plus aucune règle pour l'adresse correpondante n'est traitée.
  • Par défaut pour signature : activer ou désactiver la signature des messages. Ceci utilise ou outrepasse les réglages effectués dans la fenêtre de rédaction. Les valeurs possibles sont :
    • Jamais: désactiver la signature, même si elle est activée dans la fenêtre de rédaction du messages (prévaut sur les autres valeurs),
    • Oui, si sélectionné lors de la composition du message: laisser le réglage de signature tel qu'il est spécifié dans la fenêtre de rédaction,
    • Toujours: activer la signature, même si elle n'est pas activée dans la fenêtre de rédaction,
Ces paramètres de signature sont appliqués pour toutes les règles qui correspondent. Si l'une des règles désactive la signature, le message ne sera pas signé, même si d'autres règles spécifiaient Toujours ;
  • Chiffrement : activer ou désactiver le chiffrement des messages. Les valeurs autorisées ainsi que leur signification sont les mêmes que pour la signature des messages ;
  • PGP/MIME : activer ou désactiver l'utilisation du codage de message PGP/MIME (RFC 3156). Si PGP/MIME est désactivé, les messages sont codés en utilisant le format « PGP en ligne Â». Les valeurs autorisées ainsi que leur signification sont les mêmes que pour la signature des messages.

Les règles sont appliquées dans l'ordre d'affichage de la liste de l'éditeur de règles OpenPGP. Dès lors qu'une règle correspond à un destinataire et contient un identifiant de clef OpenPGP, non seulement l'identifiant de clef spécifié est utilisé, mais le destinataire n'est plus pris en compte dans le traitement des règles suivantes.


De l'aide supplémentaire est disponible sur la page des réglages par destinataire d'Enigmail

enigmail-2.0.8/lang/fr/help/initError.html000066400000000000000000000047641334302754500204520ustar00rootroot00000000000000 Enigmail Help: How to Resolve Problems with Initializing OpenPGP

Enigmail Help

How to Resolve Problems with Initializing OpenPGP

There are several reasons why initializing OpenPGP does not succeed. The most common ones are described below; for more information please visit the Enigmail Support page.

GnuPG could not be found

In order for OpenPGP to work, the tool GnuPG needs to be installed. If GnuPG cannot be found, then first make sure that the executable gpg.exe (on Windows; gpg on other platforms) is installed on your computer. If GnuPG is installed, and OpenPGP cannot find it, then you need to manually set the path to GnuPG in the OpenPGP Preferences (menu OpenPGP > Preferences)

Enigmime failed to initialize

OpenPGP works only if it is built using the same build environment as Thunderbird or SeaMonkey was built. This means that you can use the official Enigmail releases only if you use the official releases of Thunderbird or SeaMonkey provided by mozilla.org.

If you use a Thunderbird or SeaMonkey version coming from some other source (e.g. the provider of your Linux distribution), or if you built the application yourself, you should either use an Enigmail version built by the same source, or build Enigmail yourself. For building Enigmail, refer to the Source Code section on the Enigmail home page. Please don't file any bug report concerning this problem, it is not solvable.


Further help is available on the Enigmail Support Web Site.

enigmail-2.0.8/lang/fr/help/messenger.html000066400000000000000000000114171334302754500204560ustar00rootroot00000000000000 Aide Enigmail : Lecture de messages

Aide Enigmail

Utiliser Enigmail lors de la lecture de messages

  • Bouton Déchiffrer dans la fenêtre principale
    Ce bouton peut être utilisé pour plusieurs actions : déchiffrer, vérifier ou importer des clefs publiques. En temps normal, bien que cela soit optionnellement désactivable, le déchiffrement et la vérification seront effectués automatiquement. Toutefois, en cas d'échec, un court message apparaitra dans la barre d'état d'Enigmail. Un clic sur le bouton Déchiffrer permettra d'obtenir un message d'erreur plus détaillé, contenant les messages de sortie de la commande GnuPG.
  • Icônes stylo et clef dans l'affichage de l'en-tête du message
    Les icônes Stylo et Clef dans l'affichage de l'en-tête du message indique si le message affiché a été signé et/ou chiffré et si la signature est correcte, c.à.d. que le message n'a pas été modifié depuis qu'il a été signé. Si le message a été modifié, l'icône Stylo se changera en un Stylo brisé afin d'indiquer que la signature est incorrecte. Un clic droit sur l'icône de stylo ou celle de clef fera apparaitre un menu contenant les options suivantes :
    • Infos de sécurité OpenPGP : permet d'obtenir l'état de sortie de GnuPG pour le message ;
    • Copier les infos de sécurité OpenPGP : copie l'état de sortie de GnuPG dans le presse papier afin de le coller dans un message de réponse par exemple ;
    • Voir l'ID photo OpenGPG : permet de voir l'ID photo de l'expéditeur du message, uniquement s'il y a une photo intégrée dans sa clef publique (cette option ne sera active que si un ID photo existe dans la clef) ;
    • Infos de sécurité S/MIME : permet de visualiser les informations de sécurité S/MIME du message.

    Si vous n'avez pas l'option keyserver-options auto-key-retrieve définie dans votre fichier gpg.conf et que vous lisez un message signé ou chiffré, vous verrez une icône de Stylo comportant un point d'interrogation dans la zone d'affichage des en-têtes, la ligne d'état Enigmail affichera Partie du message signée ; cliquez sur l'icône « stylo Â» pour plus de détails. De plus le message dans le panneau de message affichera tous les blocs de message OpenPGP et le bloc de signature.

    Il est également possible d'observer ce comportement même si vous l'option keyserver-options auto-key-retrieve est bien définie dans votre fichier gpg.conf mais que la clef OpenPGP n'est pas disponible sur le serveur de clefs par défaut.

    En cliquant sur l'icône Stylo et point d'interrogation apparaitra une fenêtre vous avertissant que la clef n'est pas disponible dans votre trousseau de clefs. Fermer la fenêtre par OK ouvrira une autre fenêtre contenant une liste de serveurs de clefs que vous pouvez sélectionner afin de télécharger la clef publique de l'expéditeur.

    Pour configurer la liste des serveurs de clefs que vous désirez utiliser, allez dans Enigmail -> Préférences -> onglet Général et saisissez les adresses des serveurs de clefs dans la zone Serveur(s) de clefs : séparées par des virgules. Le premier serveur de la liste sera utilisé comme serveur par défaut.

  • Ouverture de pièces jointes chiffrées / importation de clefs OpenPGP attachées
    Les pièces jointes nommées *.pgp, *.asc et *.gpg sont reconnues par Enigmail comme pouvant être traitées spécialement. Cliquer droit sur une de ces pièces jointes active deux entrées de menu spéciales dans le menu contextuel : Déchiffrer et ouvrir et Déchiffrer et enregistrer sous. Utilisez ces deux menus si vous désirez qu'Enigmail déchiffre une pièce jointe avant de l'ouvrir ou de l'enregistrer. Si une pièce jointe est reconnue comme un fichier de clef OpenPGP, il vous est proposé d'importer les clefs qu'il contient dans votre trousseau de clefs.

De l'aide supplémentaire est disponible sur la page web d'Enigmail

enigmail-2.0.8/lang/fr/help/rulesEditor.html000066400000000000000000000075771334302754500210030ustar00rootroot00000000000000 Aide Enigmail : Éditeur de règles

Aide Enigmail

Utilisation de l'éditeur de règles

Dans l'éditeur de règles, vous pouvez spécifier les paramètres par défaut par destinataire, concernant l'activation du chiffrement, de la signature, de PGP/MIME et de choisir quelle(s) clef(s) utiliser. Chaque règle consiste en 5 champs et est représentée sur une seule ligne :

  • Adresse : l'adresse électronique des champs Pour, Cc et Bcc pour la correspondance. Cette correspondance est faite sur des sous-chaînes (plus de détails se trouvent dans la boite de dialogue d'édition des règles) ;
  • Clef(s) à utiliser : une liste d'identifiants de clefs OpenPGP à utiliser pour le destinataire ;
  • Signature : activer ou désactiver la signature des messages. Ceci utilise ou outrepasse les réglages effectués dans la fenêtre de rédaction. Les valeurs possibles sont :
    • Jamais : désactiver la signature, même si elle est activée dans la fenêtre de rédaction du messages (prévaut sur les autres valeurs),
    • Oui, si sélectionné lors de la composition du message : laisser le réglage de signature tel qu'il est spécifié dans la fenêtre de rédaction,
    • Toujours : activer la signature, même si elle n'est pas activée dans la fenêtre de rédaction,
Ces paramètres de signature sont appliqués pour toutes les règles qui correspondent. Si l'une des règles désactive la signature, le message ne sera pas signé, même si d'autres règles spécifiaient Toujours ;
  • Chiffrement: activer ou désactiver le chiffrement des messages. Les valeurs autorisées ainsi que leur signification sont les mêmes que pour la signature des messages ;
  • PGP/MIME: activer ou désactiver l'utilisation du codage de message PGP/MIME (RFC 3156). Si PGP/MIME est désactivé, les messages sont codés en utilisant le format « PGP en ligne Â». Les valeurs autorisées ainsi que leur signification sont les mêmes que pour la signature des messages.

Les règles sont appliquées dans l'ordre d'affichage de la liste. Dès lors qu'une règle correspond à un destinataire et contient un identifiant de clef OpenPGP, non seulement l'identifiant de clef spécifié est utilisé, mais le destinataire n'est plus pris en compte dans le traitement des règles suivantes.

Note : l'éditeur de règles n'est pas encore terminé. Il est possible d'écrire des règles plus avancées en modifiant directement le fichier de règles (ces règles ne devront alors plus être modifiées dans l'éditeur de règles). Des informations complémentaires pour modifier directement le fichier sont disponibles sur le site Web d'Enigmail


De l'aide supplémentaire est disponible sur la page Web d'Enigmail

enigmail-2.0.8/lang/fr/help/sendingPrefs.html000066400000000000000000000050141334302754500211110ustar00rootroot00000000000000 Enigmail Help: Edit OpenPGP Rule

Enigmail Help

Defining Preferences to Send Encrypted

In the Sending Preferences you can choose the general model and preferences for encryption.

Convenient Encryption
With these settings, emails are encrypted without confirmation whenever possible.

This setup is appropriate, if you just want to improve your privacy by sending emails encyrpted instead of unencrypted if that's possible.

The effect is like sending emails as letters instead of postcards. Unlike postcards, letters usually hide their contents while in transit.

Note however that as with letters you can't be sure that nobody is opening the letter while it is in transit (although, some technical effort is necessary for that).

A concrete risk is that you accidentally use "faked keys" you got from somewhere or somebody claiming that the key belongs to the person you want to send emails to. To avoid this risk, you can either use the trust model of PGP (see below) or you should always verify, whether the fingerprint of a public key is correct.

Manual Encryption
This option allows you to specify the different preferences for encryption according to your needs. You can specify
  • whether replies to encrypted/signed emails should automatically also be encrypted/signed-
  • whether to use the trust model of OpenPGP to accept keys (this means that to use a key you either have to sign the key or have enough other people you trust having signed the key).
  • whether you want to automatically send emails encrypted if all keys are accepted.
  • whether and when you want to finally confirm sending an email.

If it is important for you that content you send encrypted can't be read by other people or organizations, you should use the manual preferences at least choose the option to accept keys only if you or other people signed them. While this model reduces the risk of using faked keys, it requires that you actively sign keys and declare owner trust using the key managament dialog.

enigmail-2.0.8/lang/gd/000077500000000000000000000000001334302754500146275ustar00rootroot00000000000000enigmail-2.0.8/lang/gd/am-enigprefs.properties000066400000000000000000000001271334302754500213220ustar00rootroot00000000000000# Strings used in the Mozill AccountManager prefPanel-enigprefs=Tèarainteachd OpenPGP enigmail-2.0.8/lang/gd/enigmail.dtd000066400000000000000000002151501334302754500171150ustar00rootroot00000000000000 Mozilla Public License 2.0."> Iarraidh “Tar-chur na h-iuchrach Autocrypt†gum bi comas Autocrypt aig a’ chliant puist-d air an uidheam eile. Ged as e am fuasgladh as simplidhe a th’ ann, cha chuir ach cuid a chliantan taic ris aig an àm seo. ’S e “Lethbhreac-glèidhidh ⊠aiseag†dhe na roghainnean agad a tha san dòigh eile. Cruthaichidh sin faidhle ZIP leis an fhiosrachadh is na h-iuchraichean uile air a bheil feum ’na bhroinn agus ’s urrainn dhut lethbhreac dheth a chur air an uidheam ùr an uairsin. ’S urrainn dha Enigmail na roghainnean sin ion-phortadh gun duilgheadas; airson cliantan puist-d eile, gabhaidh am faidhle ZIP a dhì-dhùmhlachadh agus dèiligeadh ris a làimh."> â€"> †gus seòlaidhean puist-d a shònrachadh"> †gus seòlaidhean puist-d a shònrachadh airson GnuPG. Cuir à comas ma tha seann-iuchraichean Hushmail aig faightearan."> “Tèarainteachd OpenPGPâ€)"> AN AIRE: Dh’fhaoidte gun doir e mionaid no dhà gus am bi gintinn nan iuchraichean coileanta. Na fàg an aplacaid fhad ’s a tha iuchair ’ga gintinn. Ma nì thu brabhsadh no obair a bhios feumach air cleachdadh an diosga fhad ’s a tha iuchair ’ga gintinn, cuiridh seo ris a’ “ghoireas thuaireamach†agus nì seo am pròiseas nas luaithe. Gheibh thu brath nuair a bhios gintinn nan iuchraichean coileanta."> Autocrypt a mhìnicheas ciamar a nithear crioptachadh puist-d o cheann gu ceann a tha furasta cleachdadh. Tha e a’ sònrachadh ciamar a nì prògraman puist-d rèiteachadh air comasan crioptachaidh slighe phost-d àbhaisteach."> †mì-dhligheach"> AN AIRE: Dh’fhaoidte gun doir e mionaid no dhà gus am bi gintinn nan iuchraichean coileanta. Na fàg an aplacaid fhad ’s a tha iuchair ’ga gintinn. Gheibh thu brath nuair a bhios gintinn nan iuchraichean coileanta."> An aire: Nì Enigmail dearbhadh air soidhneadh puist-d airson gach cunntas no dearbh-aithne an-còmhnaidh ge b’ e a chaidh a chur an comas gus nach deach"> iuchair phoblach agad ann do chàch ach an cuir iad puist-d chrioptaichte thugad. ’S urrainn dhut a sgaoileadh dhan a h-uile duine."> iuchair phrìobhaideach agad ann dhut fhèin ach an dì-chrioptaich thu na puist-d sin agus gus puist-d le soidhneadh a chur. Na doir do dhuine beò i."> iuchair phrìobhaideach agad ann dhut fhèin ach an dì-chrioptaich thu na puist-d sin agus gus puist-d le soidhneadh a chur. Na doir do dhuine beò i. Gus an iuchair phrìobhaideach agad a chumail tèarainte, thèid abairt-fhaire iarraidh ort san da chòmhradh a leanas."> abairt-fhaire agad a dhìonas an iuchair phrìobhaideach agad. Cuiridh i casg air droch chleachdadh na h-iuchrach prìobhaidich agad."> Cha mholamaid gun cuireadh tu sràcan (m.e. à, ù) no caractaran sònraichte do chànan innte."> Thèid iarraidh ort gun cuir thu a-steach am facal-faire agad airson seo. Feuch an tar-chuir thu an teisteanas gu meadhan a ghabhas a stòradh gu sàbhailte, can CD no UB stick. Ma gheibh cuideigin eile greim air an teisteanas seo, ’s urrainn dhaibh an iuchair agad a chur à feum."> às-phortaich an dàta agad on t-seann choimpiutair agad le draoidh às-phortadh o na roghainnean Enigmail ion-phortaich an dàta dhan choimpiutair ùr agad leis an draoidh seo. "> Mòran taing airson Enigmail a chleachdadh."> Dearbhaich an t-iarrtas a gheibh thu sa bhogsa a-steach agad mas e seo a tha thu ag iarraidh."> às-phortaich an dàta agad on t-seann choimpiutair agad leis an draoidh seo ion-phortaich an dàta dhan choimpiutair ùr agad le draoidh an rèiteachaidh. "> Tagh an cunntas gu h-ìosal gus an iuchair aige a thar-chur. Seallaidh sinn còd suidheachaidh dhut (facal-faire) air an ath-sgrìn a dh’fheumas tu cur a-steach air an uidheam eile gus an iuchair agad agus na roghainnean ceangailte rithe ion-phortadh."> Cleachd an t-uidheam eile a-nis agus fosgail an teachdaireachd seo air-san. Thèid còd suidheachaidh iarraidh ort. Sgrìobh na h-àireamhan seo ann:"> enigmail-2.0.8/lang/gd/enigmail.properties000066400000000000000000002017661334302754500205460ustar00rootroot00000000000000Enigmail=Enigmail ##################################################################### # Strings used within enigmailCommon.js and enigmailCommon.jsm ##################################################################### enigAlert=Caismeachd Enigmail enigConfirm=Dearbhadh Enigmail enigInfo=Fiosrachadh Enigmail enigError=Mearachd Enigmail enigPrompt=Ceist Enigmail dlgYes=&Tha dlgNo=&Chan eil dlgKeepSetting=Cuir an fhreagairt agam an cuimhne is na faighnich dhìom a-rithist dlgNoPrompt=Na seall an còmhradh seo a-rithist dlg.button.delete=&Sguab às dlg.button.cancel=&Sguir dheth dlg.button.close=&Dùin dlg.button.continue=Lean air adhar&t dlg.button.skip=Gearr &leum dlg.button.overwrite=&Sgrìobh thairis air dlg.button.view=&Seall dlg.button.retry=Feuch ris a-&rithist dlg.button.ignore=Le&ig seachad dlg.button.install=Stàla&ich dlg.button.ok=&Ceart ma-thà repeatPrefix=\n\nNochdaidh a’ chaismeachd seo a-rithist %S repeatSuffixSingular=turas eile. repeatSuffixPlural=tursan/turas eile. noRepeat=\n\nChan nochd a’ chaismeachd seo a-rithist gus an àrdaich thu Enigmail. pgpNotSupported=Tha coltas gu bheil thu a’ chleachdadh Enigmail còmhla ri PGP 6.x\n\nGu mì-fhortanach, cha duilgheadasan aig PGP 6.x a dh’adhbharaicheas nach obraich Enigmail mar bu chòir. Mar sin, cha chuir Enigmail taic ri PGP 6.x tuilleadh; cleachd GnuPG (GPG) ’na àite.\n\nMa tha thu feumach air taic gus atharrachadh gu GnuPG, thoir sùil air earrann na cobharach air an duilleag-dhachaigh aig Enigmail. initErr.howToFixIt=Tha thu feumach air GnuPG mus urrainn dhut Enigmail a chleachdadh. Mur an do stàlaich thu GnuPG fhathast, ’s e an dòigh as fhasa gun cleachd thu putan “Draoidh an rèiteachaidh†gu h-ìosal. initErr.setupWizard.button=Draoidh an &rèiteachaidh passphraseCleared=Tha an abairt-fhaire air fhalamhachadh. cannotClearPassphrase=Tha thu a’ cleachdadh inneal neo-àbhaisteach (mar gnome-keyring) gus abairtean-faire a làimhseachadh. Chan eil Enigmail fhèin comasach air an abairt-fhaire fhalamhachadh air an adhbhar seo. noPhotoAvailable=Chan eil dealbh ri làimh debugLog.title=Loga dì-bhugachaidh Enigmail error.photoPathNotReadable=Cha ghabh slighe an deilbh “%S†leughadh generalError=Mearachd: %S # Strings in configure.jsm enigmailCommon.versionSignificantlyChanged=Thàinig atharrachadh mòr air mar a thèid roghainnean a làimhseachadh leis an tionndadh ùr seo de dh’Enigmail. Dh’fheuch sinn ris na seann roghainnean a thar-aiseag dhan tionndadh ùr seo. Co-dhiù, chan urrainn dhut dèiligeadh ris a h-uile roghainn gu fèin-obrachail. Thoir sùil air na roghainnean ùra a fhuair thu mar thoradh. enigmailCommon.checkPreferences=Dearbhaich na roghainnean… preferences.defaultToPgpMime=Dh’atharraich sinn còdachadh tùsail nan teachdaireachdan ann an Enigmail o PGP ion-loidhne gu PGP/MIME. Mholamaid gun cum thu seo mar a’ bhun-roghainn.\n\nNam bu toigh leat PGP ion-loidhne a chleachdadh a ghnàth fhathast, ’s urrainn dhut seo a dhèanamh ann an “Roghainnean nan cunntasan†fo “Tèarainteachd OpenPGPâ€. ##################################################################### # Strings in enigmailAbout.js ##################################################################### usingVersion=A’ ruith Enigmail tionndadh %S enigmailPepVersion=Enigmail/p≡p tionndadh %S usingAgent=A’ chleachdadh faidhle so-ghnìomhaichte %1$S %2$S airson crioptachadh is dì-chrioptachadh agentError=MEARACHD: Cha deach leinn bun-seirbheis Enigmail inntrigeadh! ##################################################################### # Strings in enigmailKeygen.js ##################################################################### accessError=Mearachd le inntrigeadh seirbheis Enigmail onlyGPG=Chan obraich gintinn iuchraichean ach le GnuPG (chan obraich e le PGP)! keygenComplete=Tha na h-iuchraichean air an gintinn! Thèid an dearbh-aithne <%S> a chleachdadh airson soidhneadh. revokeCertRecommended=Mholamaid gun cruthaich thu teisteanas cùl-ghairm dhen iuchair agad. ’S urrainn dhut an teisteanas a chleachdadh gus an iuchair agad a dhèanamh mì-dhligheach, m.e. ma thèid an iuchair phrìobhaideach agad air a call no briseadh a-steach oirre. A bheil thu airson teisteanas cùl-ghairm a chruthachadh an-dràsta? keyMan.button.generateCert=&Gin teisteanas genCompleteNoSign=Tha gintinn nan iuchraichean coileanta! genGoing=Tha iuchraichean ’gan gintinn mar-thà! passNoMatch=Chan eil an dà abairt-fhaire co-ionnann; cuir a-steach a-rithist iad passCheckBox=Cuir cromag sa bhogsa mur eil thu ag iarraidh abairt-fhaire airson na h-iuchrach passUserName=Sònraich ainm cleachdaiche airson na dearbh-aithne seo keygen.missingUserName=Cha deach ainm a shònrachadh airson a’ chunntais/na h-aithne a thagh thu. Cuir a-steach luach san raon “D’ ainm†ann an roghainnean a’ chunntais. keygen.passCharProblem=Chleachd thu caractaran sònraichte san abairt-fhaire agad. Gu mì-fhortanach, dh’fhaoidte gun adhbharaich seo trioblaid airson aplacaidean eile. Mholamaid gun tagh thu abairt-fhaire anns nach eil ach na caractaran seo:\na-z A-Z 0-9 /.;:-,!?(){}[]%* passSpaceProblem=Air adhbharan teicnigeach, chan fhaod an abairt-fhaire agad tòiseachadh no crìochnachadh le beàrn. changePassFailed=Dh’fhàillig le atharrachadh na h-abairt-fhaire. keyConfirm=A bheil thu airson iuchraichean poblach is prìobhaideach a ghintinn airson “%Sâ€? keyMan.button.generateKey=&Gin iuchair keyAbort=A bheil thu airson sgur de ghintinn nan iuchair? keyMan.button.generateKeyAbort=&Sguir de ghintinn nan iuchair keyMan.button.generateKeyContinue=&Lean air adhart le gintinn nan iuchair expiryTooLong=Chan urrainn dhut iuchair a chruthachadh a dh’fhalbhas an ùine air an ceann corr is 100 bliadhna. expiryTooLongShorter=Chan urrainn dhut iuchair a chruthachadh a dh’fhalbhas an ùine air an ceann corr is 90 bliadhna. expiryTooShort=Feumaidh an iuchair agad a bhith dligheach fad latha air a char as lugha. keyGenFailed=Dh’fhàillig le gintinn nan iuchraichean. Thoir sùil air consoil Enigmail (clàr-taice “Enigmail†> “Dì-bhugachadh Enigmailâ€) airson barrachd fiosrachaidh. setKeyExpirationDateFailed=Cha b’ urrainn dhuinn a’ chrìoch ùine atharrachadh # Strings in enigmailMessengerOverlay.js securityInfo=Fiosrachadh tèarainteachd Enigmail\n\n enigHeader=Enigmail: enigContentNote=Enigmail: *Cha deach na ceanglachain aig an teachdaireachd seo a shoidhneadh no a chrioptachadh*\r\n\r\n possiblyPgpMime=Teachdaireachd air a crioptachadh no soidhneadh le PGP/MIME ’s dòcha; cleachd an gleus “Dì-chrioptaich/Dearbhaich†gus a dhearbhadh saveAttachmentHeader=Enigmail: Sàbhail ceanglachan air a dhì-chrioptachadh noTempDir=Cha deach leinn pasgan sealach a lorg gus sgrìobhadh ann\nFeuch an suidhich thu an caochladair àrainneachd TEMP attachmentPgpKey=’S e faidhle iuchrach OpenPGP a tha sa cheanglachan “%S†a tha thu a’ fosgladh a-rèir coltais.\n\nBriog air “Ion-phortaich†gus na h-iuchraichean ’na bhroinn ion-phortadh no air “Seall†gus susbaint an fhaidhle a shealltainn ann an uinneag brabhsair beginPgpPart=***** *TOISEACH NA PÀIRT CRIOPTAICHTE no AIR A SOIDHNEADH* ***** endPgpPart=***** *DEIREADH NA PÀIRT CHRIOPTAICHTE no AIR A SOIDHNEADH* ***** notePartEncrypted=Enigmail: *CHA DEACH a h-uile pàirt dhen teachdaireachd a shoidhneadh no a chrioptachadh* noteCutMessage=Enigmail: *Chaidh iomadh bloca teachdaireachd a lorg – chaidh sgur dhen dì-chrioptachadh/dearbhadh* decryptOkNoSig=Rabhadh\n\nShoirbhich leis an dì-chrioptachadh ach cha b’ urrainn dhuinn an soidhneadh a dhearbhadh mar bu chòir msgOvl.button.contAnyway=Lean air adhart &co-dhiù signature.verifiedOK=Chaidh an soidhneadh airson a’ cheanglachain %S a dhearbhadh signature.verifyFailed=Cha deach leinn an soidhneadh airson a’ cheanglachain %S a dhearbhadh attachment.noMatchToSignature=Cha deach leinn an ceanglachan “%S†a mhaidseadh ri faidhle soidhnidh attachment.noMatchFromSignature=Cha deach leinn am faidhle soidhnidh “%S†a mhaidseadh ri ceanglachan fixBrokenExchangeMsg.failed=Cha deach leinn an teachdaireachd a chàradh. enigmail.msgViewColumn.label=Enigmail enigmailPep.msgViewColumn.label=Enigmail/p≡p wksNoIdentity=Cha deach an iuchair seo ceangal ri gin dhe na cunntasan puist-d agad. Cuir cunntas ris airson co-dhiù aon dhe na seòlaidhean puist-d seo:\n\n%S wksConfirmSuccess=Chaidh post-d dearbhaidh a chur. wksConfirmFailure=Dh’fhàillig le cur a’ phuist-d dearbhaidh. autocrypt.importSetupKey.accountPreconfigured=Chaidh an cunntas agad a rèiteachadh mar bu chòir airson Autocrypt mar-thà.\n\nA bheil thu cinnteach gu bheil thu airson tar-sgrìobhadh air na roghainnean agad leis an teachdaireachd suidheachaidh seo? autocrypt.importSetupKey.selfCreated=Chaidh an teachdaireachd seo a chruthachadh leis an tionndadh dhe Enigmail a tha ’ga ruith an-dràsta.\n\nGearr leum gun chliant puist-d a tha thu airson na roghainnean a thar-aiseag thuige agus briog air an teachdaireachd sa chliant puist-d ud gus na roghainnean ion-phortadh. autocrypt.importSetupKey.invalidMessage=Mearachd – cha b’ urrainn dhuinn an teachdaireachd suidheachaidh a leughadh. Tha coltas gu bheil an teachdaireachd coirbte. Feuch an cruthaich thu teachdaireachd suidheachaidh ùr air an uidheam eile agad. autocrypt.importSetupKey.invalidKey=Mearachd – cha b’ urrainn dhuinn an iuchair ion-phortadh. Cha chuir an tionndadh agad dhe GnuPG taic ris an iuchair air neo tha i coirbte. autocrypt.importSetupKey.wrongPasswd=Chan eil am facal-faire a chuir thu a-steach mar bu chòir. A bheil thu airson feuchainn ris a-rithist? autocrypt.importSetupKey.success=Tha teachdaireachd suidheachadh Autocrypt air a pròiseasadh. Tha Autocrypt ri fhaighinn airson a’ chunntais “%S†agad a-nis. ##################################################################### # Strings in enigmailMsgComposeOverlay.js ##################################################################### keysToExport=Tagh iuchraichean OpenPGP gus an chur ris keysToUse=Tagh iuchair/iuchraichean OpenPGP gus an cleachdadh airson %S pubKey=An iuchair phoblach airson %S\n windowLocked=Tha an uinneag sgrìobhaidh glaiste; chaidh sgur dhen chur sendUnencrypted=Dh’fhàillig le tòiseachadh Enigmail.\nA bheil thu airson an teachdaireachd a chur gun chrioptachadh? composeSpecifyEmail=Sònraich am prìomh sheòladh puist-d agad a chleachdas sinn gus iuchair an t-soidhnidh a thaghadh airson teachdaireachdan a-mach.\nMa dh’fhàgas tu bàn e, thèid an seòladh O aig an teachdaireachd a chleachdadh gus iuchair an t-soidhnidh a thaghadh. sendingHiddenRcpt=Tha faightearan BCC (lethbhreac dall) aig an teachdaireachd seo. Ma thèid an teachdaireachd seo a chrioptachadh, gabhaidh na faightearan BCC fhalach ach chan urrainn do chuid a bhathair-bhog (can PGP Corp.) a chleachdas faightear ma dh’fhaoidte an teachdaireachd a dhì-chrioptachadh. Air sàilleibh seo, mholamaid gun seachnaich thu puist-d BCC le crioptachadh. sendWithHiddenBcc=Falaich na faightearan BCC sendWithShownBcc=Crioptaich gu h-àbhaisteach sendingNews=Chaidh sgur dhen chur chrioptaichte.\n\nChan urrainn dhuinn an teachdaireachd seo a chrioptachadh on a tha faightearan buidhinn-naidheachdan innte. Feuch an cuir thu an teachdaireachd a-rithist gun chrioptachadh. sendToNewsWarning=Rabhadh: tha thu gu bhith a’ cur post-d crioptaichte gu buidheann-naidheachdan.\n\nCha mholamaid seo air sgàth ’s nach eil e gu ciall sam bith ach mas urrainn dhan a h-uile ball dhen bhuidheann-naidheachdan an teachdaireachd a dhì-chrioptachadh, ’s e seo gum feum thu an teachdaireachd a chrioptachadh le iuchraichean gach buill. Na cuir an teachdaireachd seo ach ma tha thu làn-eòlach air na tha thu a’ dèanamh.\n\nA bheil thu airson leantainn air adhart? hasHTML=Rabhadh post HTML:\nTha HTML am broinn na teachdaireachd seo ma dh’fhaoidte agus b’ urrainn seo adhbharachadh nach dèid leis an t-soidhneadh/a’ chrioptachadh. Gus seo a sheachnadh san àm ri teachd, cum an iuchair SHIFT sìos fhad ’s a bhios tu a’ briogadh air a’ phutan Sgrìobh/Freagair gus post air a shoidhneadh a chur.\nMa nì thu soidhneadh a’ phuist a ghnàth, bu chòir dhut a’ chromag a thoirt far bogsa na roghainn “Sgrìobh teachdaireachdan ann an cruth HTML†gus post HTML a chur à comas gu buan airson a’ chunntais puist seo. strippingHTML=Tha fiosrachadh fòrmatadh HTML am broinn na teachdaireachd seo a thèid air chall nuair a thèid iompachadh gu teacsa lom airson an t-soidhnidh/a’ chrioptachaidh. A bheil thu airson leantainn air adhart? msgCompose.button.sendAnyway=&Cuir an teachdaireachd co-dhiù attachWarning=Chan eil na ceanglachain aig an teachdaireachd seo ionadail, mar sin cha ghabh an crioptachadh. Gus na ceanglachain a chrioptachadh, glèidh iad ’nam faidhlichean ionadail an toiseach agus cuir na faidhlichean ris ’nan ceanglachan an uairsin. A bheil thu airson an teachdaireachd a chur co-dhiù? quotedPrintableWarn=Chuir thu còdachadh “quoted-printable†an comas airson cur nan teachdaireachdan. Faodaidh seo dì-chrioptachadh/dearbhadh cearr adhbharachadh airson na teachdaireachd agad.\nA bheil thu airson cur theachdaireachdan “quoted-printable†a chur à comas a-nis? minimalLineWrapping=Shuidhich thu pasgadh nan loidhnichean air %S caractar. Airson crioptachadh/soidhneadh mar bu chòir, feumaidh an luach seo a bhith 68 no nas motha.\nA bheil thu airson pasgadh nan loidhnichean atharrachadh gu 68 caractar a-nis? warning=Rabhadh signIconClicked=Dh’atharraich thu an soidhneadh a làimh. Mar sin, fad ’s a bhios tu a’ sgrìobhadh na teachdaireachd seo, cha bhi cur an/à comas an t-soidhnidh an eisimeil air cur an/à comas a’ chrioptachaidh tuilleadh. errorOwnKeyUnusable=Cha lìbhrig ID na h-iuchrach “%S†a chaidh a rèiteachadh airson na h-aithne làithrich iuchair OpenPGP a ghabhas cleachdadh.\n\nDèan cinnteach gu bheil iuchair OpenPGP dhligheach agad nach do dh’fhalbh an ùine oirre agus gun tomh roghainnean a’ chunntais agad ris an iuchair sin.\nMur an do dh’fhalbh an ùine air an iuchair agad, dearbhaich gun do shuidhich thu earbsa an t-seilbheadair air “earbsach†no “cho earbsach ’s a ghabhasâ€. msgCompose.cannotSaveDraft=Mearachd le sàbhaladh an dreachd msgCompose.partiallyEncrypted.short=Thoir an aire nach foillsich thu fiosrachadh dìomhair gun fhiosta – chan eil ach pàirt dhen phost-d seo crioptaichte. msgCompose.partiallyEncrypted.mimeMsg=Chaidh cuid dhen teachdaireachd seo a tha thu a’ freagairt rithe a chrioptachadh is tha cuid eile gun chrioptachadh. Tha cuid chrioptaichte aice nach fhaic thu.\n\nMura deach leis an t-seòladair a chuir thugad i a’ chuid chrioptaichte a dhì-chrioptachadh, dh’fhaoidte gun nochd thu fiosrachadh dìomhair do dhaoine nach deach leis an t-seòladair sin fhèin a dhì-chrioptachadh.\n\nMholamaid nach cuir thu freagairt dhan teachdaireachd seo ach gun cruthaich thu teachdaireachd ùr airson na freagairte agad. msgCompose.partiallyEncrypted.inlinePGP=Chaidh cuid dhen teachdaireachd seo a tha thu a’ freagairt rithe a chrioptachadh is tha cuid eile gun chrioptachadh. Mura deach leis an t-seòladair a chuir thugad i a’ chuid chrioptaichte a dhì-chrioptachadh, dh’fhaoidte gun nochd thu fiosrachadh dìomhair dha nach deach leis an t-seòladair sin fhèin a dhì-chrioptachadh.\n\nSaoil an doir thu air falbh gach iomradh teacsa on fhreagairt agad dhan t-seòladair sin? msgCompose.internalEncryptionError=Mearachd taobh a-staigh: Chaidh an crioptachadh geallta a chur à comas msgCompose.internalError=Thachair mearachd taobh a-staigh. msgCompose.toolbarTxt.signAndEncrypt=Thèid an teachdaireachd seo a shoidhneadh agus a chrioptachadh msgCompose.toolbarTxt.signOnly=Thèid an teachdaireachd seo a shoidhneadh msgCompose.toolbarTxt.encryptOnly=Thèid an teachdaireachd seo a chrioptachadh msgCompose.toolbarTxt.noEncryption=Cha dèid an teachdaireachd seo a shoidhneadh no a chrioptachadh msgCompose.toolbarTxt.disabled=Chaidh Enigmail a chur à comas airson na dearbh-aithne a thagh thu msgCompose.protectSubject.tooltip=Dìon cuspair na teachdaireachd msgCompose.noSubjectProtection.tooltip=Na dìon cuspair na teachdaireachd msgCompose.encryptedSubjectStub=Teachdaireachd chrioptaichte msgCompose.protectSubject.dialogTitle=A bheil thu airson dìon nan cuspairean a chur an coma? msgCompose.protectSubject.question=Chan fhalaich teachdaireachdan crioptaichte àbhaisteach an cuspair.\n\nStèidhich sinn stannard a dh’fhalaicheas an cuspair tùsail san teachdaireachd chrioptaichte ’s a chuireas teacsa fuadain ’na àite gus nach faicear an cuspair mus deach am post-d a dhì-chrioptachadh.\n\nA bheil thu airson cuspairean nan teachdaireachdan crioptaichte a dhìon? msgCompose.protectSubject.yesButton=&Dìon an cuspair msgCompose.protectSubject.noButton=&Na dìon an cuspair msgCompose.detailsButton.label=Mion-fhiosrachadh… msgCompose.detailsButton.accessKey=f msgCompose.pepSendUnknown=Chan eil fhios msgCompose.pepSendUnsecure=Neo-thèarainte msgCompose.pepSendSecure=Tèarainte msgCompose.pepSendTrusted=Tèarainte ⊠earbsach pep.alert.disabledForIdentity=Tha p≡p à comas airson na dearbh-aithne làithrich. Cuir an comas p≡p ann an roghainnean Enigmail/p≡p. pep.alert.weakReply=Tha thu an impis freagairt do theachdaireachd thèarainte a chur no a sìneadh air adhart mar theachdaireachd nach eil tèarainte tuilleadh. Ma leanas tu air adhart, dh’fhaoidte gun dèid fiosrachadh cugallach fhoillseachadh a chuireas tu fhèin agus an co-sgrìobhaiche agad fo chunnart. A bheil thu cinnteach gu bheil thu airson leantainn air adhart? # note: should end with double newline: sendAborted=Chaidh sgur dhen chur.\n\n # details: keyNotTrusted=Chan eil earbsa gu leòr san iuchair “%S†keyNotFound=Cha deach an iuchair “%S†a lorg keyRevoked=Chaidh an iuchair “%S†a chùl-ghairm keyExpired=Dh’fhalbh an ùine air an iuchair “%S†statPGPMIME=PGP/MIME statSMIME=S/MIME statSigned=AIR A SHOIDHNEADH statEncrypted=CRIOPTAICHTE statPlain=GUN SOIDHNEADH no CRIOPTACHADH offlineSave=A bheil thu airson an teachdaireachd %1$S a shàbhaladh gu %2$S ann am pasgan nan teachdaireachdan nach deach a chur? onlineSend=A bheil thu airson an teachdaireachd %1$S a chur gu %2$S? encryptKeysNote=An aire: Tha an teachdaireachd ’ga crioptachadh le IDan/iuchraichean a’ chleachdaiche seo: %S hiddenKey= signFailed=Mearachd le Enigmail; dh’fhàillig leis a’ chrioptachadh/an t-soidhnidh; an cuir sinn an teachdaireachd gun chrioptachadh? msgCompose.button.sendUnencrypted=&Cuir an teachdaireachd gun chrioptachadh recipientsSelectionHdr=Tagh na faightearan airson a’ chrioptachaidh configureNow=Cha do rèitich thu tèarainteachd Enigmail airson na dearbh-aithne a thagh thu fhathast. A bheil thu airson seo a dhèanamh a-nis? # encryption/signing status and associated reasons: encryptMessageAuto=Crioptaich an teachdaireachd (fèin-obrachail) encryptMessageNorm=Crioptaich an teachdaireachd signMessageAuto=Soidhnich an teachdaireachd (fèin-obrachail) signMessageNorm=Soidhnich an teachdaireachd encryptOff=Crioptachadh: DHETH encryptOnWithReason=Crioptachadh: AIR (%S) encryptOffWithReason=Crioptachadh: DHETH (%S) encryptOn=Crioptachadh: AIR signOn=Soidhneadh: AIR signOff=Soidhneadh: DHETH signOnWithReason=Soidhneadh: AIR (%S) signOffWithReason=Soidhneadh: DHETH (%S) reasonEnabledByDefault=an comas a ghnàth reasonManuallyForced=air a sparradh a làimh reasonByRecipientRules=air a sparradh le riaghailtean an fhaighteir reasonByAutoEncryption=air a sparradh leis a’ chrioptachadh fhèin-obrachail reasonByConflict=ri linn còmhstri ann an riaghailtean an fhaighteir reasonByEncryptionMode=ri linn modh a’ chrioptachaidh # should not be used anymore: encryptYes=Thèid an teachdaireachd a chrioptachadh encryptNo=Cha dèid an teachdaireachd a chrioptachadh # should not be used anymore: signYes=Thèid an teachdaireachd a shoidhneadh signNo=Cha dèid an teachdaireachd a shoidhneadh # PGP/MIME status: pgpmimeNormal=Pròtacal: PGP/MIME inlinePGPNormal=Pròtacal: PGP ion-loidhne smimeNormal=Pròtacal: S/MIME pgpmimeAuto=Pròtacal: PGP/MIME (fèin-obrachail) inlinePGPAuto=Pròtacal: PGP ion-loidhne (fèin-obrachail) smimeAuto=Pròtacal: S/MIME (fèin-obrachail) # should not be used anymore pgpmimeYes=Thèid PGP/MIME a chleachdadh pgpmimeNo=Thèid PGP ion-loidhne a chleachdadh # Attach own key status (tooltip strings): attachOwnKeyNo=Cha dèid an iuchair agad fhèin a chur ris attachOwnKeyYes=Thèid an iuchair agad fhèin a chur ris attachOwnKeyDisabled=Chan urrainn dhuinn an iuchair agad fhèin a chur ris mar cheanglachan. Feumaidh tu iuchair shònraichte a thaghadh\nann an earrann OpenPGP aig “Roghainnean nan cunntasan†gus an gleus seo a chur an comas. rulesConflict=Mhothaich sinn do chòmhstri ann an riaghailtean a-rèir faighteir\n%S\n\nA bheil thu airson an teachdaireachd a chur leis na roghainnean seo? msgCompose.button.configure=&Rèitich msgCompose.button.send=&Cuir an teachdaireachd msgCompose.button.save=&Sàbhail an teachdaireachd # Strings in enigmailMsgHdrViewOverlay.js keyNeeded=Tha feum air an iuchair phoblach %S gus an soidhneadh a dhearbhadh keyUsed=An iuchair phoblach %S a chaidh a chleachdadh gus an soidhneadh a dhearbhadh clickDecrypt=; cleachd an gleus “Dì-chrioptaich/Dearbhaich†clickDecryptRetry=; cleachd an gleus “Dì-chrioptaich/Dearbhaich†gus feuchainn ris a-rithist clickDetailsButton=; briog air a’ phutan “Mion-fhiosrachadh†airson barrachd fiosrachaidh clickImportButton=; briog air a’ phutan “Ion-phortaich iuchair†gus an iuchair ion-phortadh keyTypeUnsupported=; cha chuir an tionndadh agad de GhnuPG taic ris an seòrsa iuchrach seo msgPart=Pàirt dhen teachdaireachd %S msgSigned=air a soidhneadh msgSignedUnkownKey=air a shoidhneadh le iuchair nach aithne dhuinn msgEncrypted=air a crioptachadh msgSignedAndEnc=air a soidhneadh is crioptachadh unverifiedSig=Soidhneadh gun dearbhadh incompleteDecrypt=Chan eil an dì-chrioptachadh coileanta needKey=Mearachd - cha deach iuchair phrìobhaideach fhreagarrach a lorg gus an teachdaireachd a dhì-chrioptachadh failedDecrypt=Mearachd - dh’fhàillig leis an dì-chrioptachadh badPhrase=Mearachd - droch abairt-fhaire failedDecryptVerify=Mearachd - dh’fhàillig leis an dì-chrioptachadh/dearbhadh viewInfo=; Sealladh > Tèarainteachd na teachdaireachd airson barrachd fiosrachaidh decryptedMsg=Teachdaireachd air a dì-chrioptachadh decryptedMsgWithFormatError=Teachdaireachd air a dì-chrioptachadh (chaidh fòrmat puist-d PGP briste aiseag a dh’adhbharaich seann fhrithealaiche Exchange ma dh’fhaoidte, mar sin chan eil sinn an dùil gum bi an toradh foirfe ri leughadh) usedAlgorithms=Algairimean ’gan cleachdadh: %1$S agus %2$S pepStatusInfo.text=Staid teachdaireachd p≡p. pepStatusInfo.title.m3=Fo ionnsaigh pepStatusInfo.info.m3=Chan eil an teachdaireachd seo tèarainte agus bhean cuideigin rithe. pepStatusInfo.title.m1=Amharasach pepStatusInfo.info.m1=Tha co-sgrìobhaiche aig an teachdaireachd seo a chaidh a chomharrachadh mar fhear amharasach roimhe pepStatusInfo.title.r0=Chan eil fhios pepStatusInfo.info.r0=Chan eil fiosrachadh gu leòr san teachdaireachd seo airson measadh a bheil i tèarainte gus nach eil. pepStatusInfo.title.r1=Chan urrainn dhuinn a dì-chrioptachadh pepStatusInfo.info.r1=Cha ghabh an teachdaireachd seo a dhì-chrioptachadh air sgàth ’s nach eil an iuchair ri làimh. pepStatusInfo.title.r2=Chan urrainn dhuinn a dì-chrioptachadh pepStatusInfo.info.r2=Cha ghabh an teachdaireachd seo a dhì-chrioptachadh air sgàth ’s nach eil an iuchair ri làimh. pepStatusInfo.title.r3=Neo-thèarainte pepStatusInfo.info.r3=Chan eil an teachdaireachd seo tèarainte. pepStatusInfo.title.r4=Neo-thèarainte do chuid pepStatusInfo.info.r4=Chan eil an teachdaireachd seo tèarainte do gach co-sgrìobhaiche. pepStatusInfo.title.r5=Tèarainteachd neo-earbsach pepStatusInfo.info.r5=Chan eil dìon na teachdaireachd seo earbsach. pepStatusInfo.title.r6=Tèarainte… pepStatusInfo.info.r6=Tha an teachdaireachd seo tèarainte ach geumaidh tu aithne a’ cho-sgrìobhaiche agad a dhearbhadh fhathast. pepStatusInfo.title.r7=Tèarainte ⊠earbsach pepStatusInfo.info.r7=Tha an teachdaireachd seo tèarainte ’s earbsach. pepStatusInfo.color.green=Uaine pepStatusInfo.color.yellow=Buidhe pepStatusInfo.color.red=Dearg pepRevokeTrust.question=A bheil thu cinnteach nach eil thu airson earbsa a chur ann an %S tuilleadh? pepRevokeMistrust.question=A bheil thu airson earbsa a chur san iuchair airson %S a-rithist? pepRevokeTrust.doRevoke=Cuir crìoch air an &earbsa wksConfirmationReq=Iarrtas air dearbhadh eòlaire Web Key wksConfirmationReq.message=Chaidh an teachdaireachd seo a chur leis an t-solaraiche puist-d agad a dhearbhadh gun deach an iuchair phoblach OpenPGP agad a luchdadh suas\ngun eòlaire Web Key aca.\nMa dh’fhoillsicheas tu an iuchair phoblach agad, bidh e nas fhasa do chàch an iuchair agad a lorg agus teachdaireachdan crioptaichte a chur thugad.\n\nMa tha thu airson an iuchair agad fhoillseachadh san eòlaire Web Key an-ràsta, briog air a’ phutan “Dearbhaich an t-iarrtas†air a’ bhàr-inbhe.\nMur eil, leig seachad an teachdaireachd seo. wksConfirmationReq.button.label=Dearbhaich an t-iarrtas autocryptSetupReq=Dèan suidheachadh Autocrypt autocryptSetupReq.button.label=Tòisich air an rèiteachadh autocryptSetupReq.setupMsg.desc=Tha am fiosrachadh uile san teachdaireachd seo gus na roghainnean Autocrypt is an iuchair phrìobhaideach agad a thar-aiseag on uidheam tùsail agad gu tèarainte. autocryptSetupReq.setupMsg.backup=’S urrainn dhut an teachdaireachd seo a chumail ’na lethbhreac-glèidhidh dhen iuchair phrìobhaideach agad. Ma tha thu airson sin a dhèanamh, bu chòir dhut am facal-faire a sgrìobhadh air pìos pàipeir agus a ghlèidheadh gu tèarainte. autocryptSetupReq.message.import=Gus na roghainnean is iuchraichean ion-phortadh gu Enigmail, briog air a’ phutan “Tòisich air an rèiteachadh†air a' bhàr-inbhe. autocryptSetupReq.message.sent=Briog air an teachdaireachd air an uidheam ùr agad agus lean ris an stiùireadh gus na roghainnean ion-phortadh. # strings in pref-enigmail.js oldGpgVersion20=Cha deach leinn Enigmail a thòiseachadh.\n\nTha thu a’ cleachdadh GnuPG tionndadh %1$S ris nach cuir sinn taic tuilleadh. Feumaidh Enigmail GnuPG tionndadh %2$S no nas ùire. Chan obraich Enigmail gus an àrdaich thu an stàladh dhe GnuPG agad. locateGpg=Lorg prògram GnuPG invalidGpgPath=Cha ghabh GnuPG a ruith leis an t-slighe a chaidh a shònrachadh. Chaidh Enigmail a chur à comas gus an atharraich thu an t-slighe gu GnuPG a-rithist no gus an tòisich thu an aplacaid às ùr. warningsAreReset=Chaidh gach rabhadh ath-shuidheachadh. prefs.gpgFound=Chaidh GnuPG a lorg an-seo: %S prefs.gpgNotFound=Cha deach GnuPG a lorg prefs.warnAskNever=Rabhadh: ma chuireas tu an roghainn seo an comas, bidh teachdaireachdan gun chrioptachadh agad gun fhiosrachadh a bharrachd sam bith mur eil iuchair airson aon dhe na faightearan ann -- chan innis Enigmail dhut nuair a thachras seo! prefs.warnIdleTimeForUnknownAgent=Chan urrainn dhuinn ceangal ri gpg-agent. ’S dòcha gun cleachd an siostam agad inneal sònraichte gus abairtean-faire a làimhseachadh (m.e. gnome-keyring, seahorse-agent, KDE wallet manager, …). Gu mì-fhortanach, chan eil smachd aig Enigmail air nuair a dh’fhalbhas an ùine air abairt-fhaire airson an inneal a tha thu a’ chleachdadh. Mar sin, thèid roghainnean falbh na h-ùine aig Enigmail a leigeil seachad. prefEnigmail.oneKeyserverOnly=Mearachd - chan urrainn dhut barrachd air aon fhrithealaiche iuchraichean a shònrachadh airson luchdadh a-nuas fèin-obrachail nan iuchraichean OpenPGP a tha a dhìth. # Strings used in core.jsm # (said file also re-uses some strings from above) enterAdminPin=Cuir a-steach PIN an RIANAIRE airson a’ SmartCard agad enterCardPin=Cuir a-steach PIN a’ SmartCard agad notInit=Mearachd - chan eil seirbheis Enigmail air a tòiseachadh fhathast badCommand=Mearachd - dh’fhàillig le àithne crioptachaidh cmdLine=loidhne-àithne is às-chur: notRequired=Mearachd - chan eil crioptachadh riatanach notComplete=Mearachd - chan eil gintinn na h-iuchrach deiseil fhathast invalidEmail=Mearachd - seòladh no seòlaidhean puist-d mì-dhligheach noPassphrase=Mearachd - cha deach abairt-fhaire a sholar noPGPblock=Mearachd - cha deach bloca dàta OpenPGP armaichte dligheach a lorg unverifiedReply=Tha amharas oirnn gun deach pàirt dhen teachdaireachd a tha eagaichte (an fhreagairt) atharrachadh keyInMessageBody=Lorg sinn iuchair ann am bodhaig na teachdaireachd. Briog air “Ion-phortaich iuchair†gus an iuchair ion-phortadh sigMismatch=Mearachd - soidhneadh neo-ionnann cantImport=Mearachd le ion-phortadh na h-iuchrach poblaich\n\n doImportOne=A bheil thu airson %1$S (%2$S) ion-phortadh? doImportMultiple=A bheil thu airson na h-iuchraichean seo ion-phortadh?\n\n%S previewFailed=Chan urrainn dhuinn faidhle nan iuchraichean poblach a leughadh. # Strings used in errorHandling.jsm sc.wrongCardAvailable=Cha ghabh an SmartCard %1$S a lorg sinn san inneal-leughaidh agad cleachdadh gus an teachdaireachd seo a phròiseasadh.\nCuir a-steach an SmartCard %2$S agad is feuch ris a-rithist. sc.insertCard=Tha an t-obrachadh feumach air a’ SmartCard %S agad.\nCuir a-steach an SmartCard a tha a dhìth is feuch ris a-rithist. sc.removeCard=Tha an t-obrachadh ag iarraidh nach eil SmartCard san inneal-leughaidh agad.\nThoir air falbh an SmartCard agad is feuch ris a-rithist. sc.noCardAvailable=Cha deach SmartCard a lorg san inneal-leughaidh agad.\nCuir a-steach an SmartCard agad is feuch ris a-rithist. sc.noReaderAvailable=Cha b’ urrainn dhuinn an t-inneal-leughaidh SmartCard agad inntrigeadh\nCeangail an t-inneal-leughaidh SmartCard agad, cuir a-steach a’ chairt agad agus feuch ris a-rithist. keyError.keySpecNotFound=Cha do lorg sinn iuchair air an dul-iuchrach agad a fhreagras ris an t-seòladh puist-d “%Sâ€. keyError.keyIdNotFound=Cha do lorg sinn ID na h-iuchrach “%S†rèitichte air an dul-iuchrach agad. keyError.resolutionAction=Tagh iuchair dhligheach ann an earrann OpenPGP dhe “Roghainnean nan cunntasanâ€. missingPassphrase=Tha abairt-fhaire a dhìth errorHandling.gpgAgentInvalid=Tha an siostam agad a’ ruith tionndadh dhe gpg-agent nach eil iomchaidh airson an tionndaidh agad dhe GnuPG. errorHandling.gpgAgentError=Dh’aithris GnuPG mearachd sa chonaltradh le gpg-agent (seo co-phàirt dhe GnuPG). errorHandling.dirmngrError=Dh’aithris GnuPG mearachd sa chonaltradh le dirmngr (seo co-phàirt dhe GnuPG). errorHandling.pinentryError=Chan urrainn dha GnuPG an abairt-fhaire agad iarraidh le pinentry. errorHandling.readFaq=Seo mearachd le suidheachadh no rèiteachadh an t-siostaim nach leig le Enigmail obair mar bu chòir ’s a ghabh a càradh gu fèin-obrachail.\n\nDian-mholamaid gun doir thu sùil air an làrach-lìn taice againn air https://enigmail.net/faq. gpgNotFound=Cha deach am prògram GnuPG “%S†a lorg.\nDèan cinnteach gun do shònraich thu slighe an fhaidhle sho-ghnìomhaichte GnuPG mar bu chòir ann an roghainnean Enigmail. gpgNotInPath=Cha deach prògram GnuPG a lorg am broinn PATH.\nDèan cinnteach gun do shònraich thu slighe an fhaidhle sho-ghnìomhaichte GnuPG mar bu chòir ann an roghainnean Enigmail. enigmailNotAvailable=Chan eil bun-seirbheis Enigmail ri fhaighinn prefGood=Deagh shoidhneadh o %S prefBad=DROCH shoidhneadh o %S failCancel=Mearachd - chaidh sgur de dh’fhaighinn na h-iuchrach leis a’ chleachdaiche failNoServer=Mearachd - Cha deach frithealaiche iuchraichean a shònrachadh gus iuchair fhaighinn uaithe failNoID=Mearachd - Cha deach ID na h-iuchrach a shònrachadh gus iuchair fhaighinn air a son failKeyExtract=Mearachd - Dh’fhàillig le àithne às-tharraing na h-iuchrach notFirstBlock=Mearachd - Chan eil a’ chiad bhloca OpenPGP ’na bhloca iuchrach poblaich importKeyConfirm=A bheil thu airson an iuchair/na h-iuchraichean a tha leabaichte san teachdaireachd ion-phortadh? failKeyImport=Mearachd - Dh’fhàillig le ion-phortachadh iuchrach fileWriteFailed=Cha deach leinn sgrìobhadh gun fhaidhle %S importKey=Ion-phortaich an iuchair phoblach %S on fhrithealaiche iuchraichean: uploadKey=Cuir an iuchair phoblach %S gun fhrithealaiche iuchraichean: keyId=ID na h-iuchrach keyAndSigDate=ID na h-iuchrach: 0x%1$S / Chaidh a soidhneadh: %2$S keyFpr=Lorg-mheòir na h-iuchrach: %S noEmailProvided=Tha dug thu seòladh puist-d seachad! keyAlreadySigned=Chaidh an iuchair a shoidhneadh mar-thà, chan urrainn dhut a soidhneadh dà thuras. ##################################################################### # Strings used in enigmailKeySelection.js ##################################################################### selKeyExpired=dh’fhalbh an ùine air %S createdHeader=Air a chruthachadh atLeastOneKey=Cha deach iuchair a thaghadh! Feumaidh tu iuchair no dhà a thaghadh airson gabhail ris a’ chòmhradh seo fewerKeysThanRecipients=Thagh thu uiread nas lugha de dh’iuchraichean na tha faightearan ris. A bheil thu cinnteach gu bheil liosta nan iuchraichean crioptachaidh coileanta? userSel.button.goBack=Tagh barrachd iuchraichean userSel.secretKeySel.title=Tagh iuchair OpenPGP phrìobhaideach gus na teachdaireachdan agad a shoidhneadh userSel.problemNoKey=Gun iuchair dhligheach userSel.problemMultipleKeys=Iomadh iuchair # should be same as thunderbird ENTITY sendLaterCmd.label: sendLaterCmd.label=Cuir uaireigin eile # Strings used in enigmailAttachmentDialog.js pgpMimeNote=AN AIRE: Cha chuir gach cliant puist-d taic ri PGP/MIME. Ma tha thu mì-chinnteach, tagh an roghainn “%Sâ€. first=a’ chiad second=an dàrna # Strings used in am-enigprefs.js / enigmailEditIdentity.js encryptKeyHeader=Tagh iuchair OpenPGP airson a’ chrioptachaidh identityName=Dearbh-aithne: %S switchPepMode=Tha thu a’ cleachdadh a’ “mhodh furasta p≡p†aig Enigmail.\n\nMa chuireas tu an comas OpenPGP no S/MIME airson cunntas, cuiridh tu p≡p à comas agus cleachdaidh tu am modh “àbhaisteach†aig Enigmail às aonais p≡p. enableEnigmail=&Cuir à comas p≡p # Strings used in enigmailSingleRcptSettings.js noEncryption=Ghnìomhaich thu an crioptachadh ach cha do thagh thu iuchair. Feumaidh tu iuchair dhligheach no dhà a shònrachadh o liosta nan iuchraichean gus puist-d a chuireas tu gu %1$S a chrioptachadh. A bheil thu airson an crioptachadh a chur à comas airson %2$S? noKeyToUse=(gun iuchair - gun chrioptachadh) noEmptyRule=Chan fhaod an riaghailt a bhith falamh! Suidhich seòladh puist-d ann an raon na riaghailt. invalidAddress=Chan eil an seòladh/na seòlaidhean puist-d a chuir thu a-steach dligheach. Cha bu chòir dhut ainmean nam faightearan a shònrachadh, na sònraich ach na seòlaidhean puist-d fhèin. M.e.:\nMì-dhligheach: Ainm \nDligheach: ainm@seòladh.net noCurlyBrackets=Tha ciall sònraichte air na camagan dualach {} agus cha bu chòir dhut an cleachdadh ann an seòladh puist-d. Ma tha thu airson atharrachadh cò ris a fhreagras an riaghailt seo, cleachd an roghainn “Cuir an riaghailt an sàs ma … an fhaightearâ€.\nGheibh thu barrachd fiosrachadh le putan na cobharach. # Strings used in enigmailRulesEditor.js never=Chan ann idir always=An-còmhnaidh possible=Comasach deleteRule=A bheil thu airson an riaghailt a thagh thu a sguabadh às? nextRcpt=(An ath-fhaightear) negateRule=Gun a bhith addKeyToRule=Cuir an iuchair %1$S (%2$S) ris an riaghailt a-rèir faighteir # Strings used in enigmailSearchKey.js needOnline=Chan eil an gleus a thagh thu ri fhaighinn sa mhodh far loidhne. Rach air loidhne is feuch ris a-rithist. protocolNotSupported=Cha chuir sinn taic ris a’ phròtacal “%S://†a thagh thu gus iuchraichean OpenPGP a luchdadh a-nuas. gpgkeysDisabled=’S dòcha gum b’ fheairrde thu an roghainn “extensions.enigmail.useGpgKeysTool†a chur an comas. noKeyserverConn=Cha b’ urrainn dhuinn ceangal ri frithealaiche iuchraichean air %S. keyDownloadFailed=Cha deach leinn an iuchair a luchdadh a-nuas on fhrithealaiche iuchraichean. Seo teachdaireachd na staide:\n%S internalError=Thachair mearachd taobh a-staigh. Cha b’ urrainn dhuinn na h-iuchraichean a luchdadh a-nuas no an ion-phortadh. noKeyFound=Tha sinn duilich ach cha deach leinn iuchair a lorg a fhreagras ris na faclan-luirg. keyDownload.keyUnavailable=Tha sinn duilich ach chan eil an iuchair air a bheil ID %S ri faighinn air an fhrithealaiche iuchraichean. Mar as trice ’s ann nach do luchdaich sealbhadair na h-iuchrach suas gun fhrithealaiche iuchraichean i.\n\nIarr air seòladair na teachdaireachd gun cuir iad an iuchair thugad air a’ post-d. # gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. gpgKeysFailed=Cha deach leinn an iuchair a lorg no a luchdadh a-nuas on fhrithealaiche iuchraichean: cha b’ urrainn dhuinn gpgkeys_%S a ghnìomhachadh. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Dh’fhàillig le suidheachadh earbsa an t-seilbheadair # Strings in enigmailSignKeyDlg.js signKeyFailed=Dh’fhàillig le soidhneadh na h-iuchrach alreadySigned.label=An aire: chaidh an iuchair %S a shoidhneadh leis an iuchair phrìobhaideach a thagh thu mar-thà. alreadySignedexportable.label=An aire: chaidh an iuchair %S a shoidhneadh leis an iuchair phrìobhaideach a thagh thu mar thè a ghabhas às-phortadh. Chan eil soidhneadh ionadail gu ciall sam bith. partlySigned.label=An aire: chaidh cuid dhe na IDan cleachdaiche aig an iuchair %S a shoidhneadh leis an iuchair phrìobhaideach a thagh thu mar-thà. noTrustedOwnKeys=Cha deach iuchair iomchaidh a lorg gus a shoidhneadh! Feumaidh iuchair phrìobhaideach le làn-earbsa innte a bhith agad mus urrainn dhut iuchraichean a shoidhneadh. # Strings in enigmailKeyManager.js keyMan.loadingKeys=A’ luchdadh nan iuchraichean, fuirich greis… keyValid.unknown=chan eil fhios keyValid.invalid=mì-dhligheach keyValid.disabled=à comas keyValid.revoked=air chùl-ghairm keyValid.expired=dh’fhalbh an ùine air keyValid.noSubkey=chan eil fo-iuchair dligheach ann keyTrust.untrusted=gun earbsa ann keyTrust.marginal=cugallach keyTrust.full=earbsach keyTrust.ultimate=cho earbsach ’s a ghabhas keyTrust.group=(buidheann) keyType.public=poblach keyType.publicAndSec=pobl/prìobh keyMan.enableKey=Cuir an iuchair an comas keyMan.disableKey=Cuir an iuchair à comas userAtt.photo=Buadh a’ chleachdaiche (dealbh JPEG) asciiArmorFile=Faidhlichean ASCII armaichte (*.asc) importKeyFile=Ion-phortaich faidhle iuchrach OpenPGP gnupgFile=Faidhlichean GnuPG createKeyOK=Chaidh an iuchair agad a ghintinn saveRevokeCertAs=Cruthaich ⊠sàbhail teisteanas cùl-ghairm revokeCertOK=Chaidh an teisteanas cùl-ghairm a chruthachadh. ’S urrainn dhut a chleachdadh gus comharrachadh nach eil an iuchair phoblach agad dligheach tuilleadh, can ma bhios tu air an iuchair phrìobhaideach agad a chall. revokeCertFailed=Cha b’ urrainn dhuinn an teisteanas cùl-ghairm a chruthachadh. addUidOK=Chaidh ID a’ chleachdaiche a chur ris addUidFailed=Cha deach leinn ID a’ chleachdaiche a chur ris noKeySelected=Bu chòir dhut iuchair no dhà a thaghadh gus na thagh thu a dhèanamh exportToFile=Às-phortaich an iuchair phoblach gu faidhle exportKeypairToFile=Às-phortaich an iuchair phrìobhaideach is phoblach gu faidhle exportSecretKey=A bheil thu airson an iuchair phrìobhaideach a ghabhail a-steach san fhaidhle iuchrach OpenPGP air a shàbhaladh? saveKeysOK=Chaidh na h-iuchraichean a shàbhaladh saveKeysFailed=Cha deach leinn na h-iuchraichean a shàbhaladh importKeysFailed=Cha deach leinn na h-iuchraichean ion-phortadh enableKeyFailed=Dh’fhàillig le cur an/à comas nan iuchraichean specificPubKeyFilename=%1$S (0x%2$S) pobl specificPubSecKeyFilename=%1$S (0x%2$S) pobl-priobh defaultPubKeyFilename=Iuchraichean-poblach-air-as-phortadh defaultPubSecKeyFilename=Iuchraichean-poblach-is-priobhaideach-air-as-phortadh noSecretKeys=Cha deach iuchair phrìobhaideach a lorg.\n\nA bheil thu airson an iuchair agad fhèin a ghintinn a-nis? sendKeysOk=Chaidh an iuchair/na h-iuchraichean a chur sendKeysFailed=Dh’fhàillig le cur nan iuchraichean receiveKeysOk=Chaidh an iuchair/na h-iuchraichean ùrachadh receiveKeysFailed=Dh’fhàillig le luchdadh a-nuas nan iuchraichean importFromClip=A bheil thu airson iuchair no dhà ion-phortadh on stòr-bhòrd? importFromUrl=Luchdaich a-nuas iuchair phoblach on URL seo: copyToClipbrdFailed=Cha b’ urrainn dhuinn lethbhreac dhen iuchair/dhe na h-iuchraichean a chur air an stòr-bhòrd. copyToClipbrdOK=Chaidh lethbhreac dhen iuchair/dhe na h-iuchraichean a chur air an stòr-bhòrd. deleteSecretKey=RABHADH: Tha thu gu bhith iuchair phrìobhaideach a sguabadh às!\nMa sguabas tu às an iuchair phrìobhaideach agad, chan urrainn dhut teachdaireachd sam bith a chaidh a chrioptachadh air a son a dhì-chrioptachadh agus chan urrainn dhut an iuchair agad a chùl-ghairm tuilleadh.\n\nA bheil thu cinnteach gu bheil thu airson AN DÀ CHUID an iuchair phrìobhaideach is an iuchair phoblach\n“%Sâ€\na sguabadh às? deleteMix=RABHADH: Tha thu gu bhith iuchraichean prìobhaideach a sguabadh às!\nMa sguabas tu às iuchair phrìobhaideach agad, chan urrainn dhut teachdaireachd sam bith a chaidh a chrioptachadh air a son a dhì-chrioptachadh tuilleadh.\n\nA bheil thu cinnteach gu bheil thu airson AN DÀ CHUID na h-iuchraichean prìobhaideach is na h-iuchraichean poblach a sguabadh às? deletePubKey=A bheil thu airson an iuchair phoblach\n“%Sâ€\na sguabadh às? deleteSelectedPubKey=A bheil thu airson na h-iuchraichean poblach a sguabadh às? deleteKeyFailed=Cha b’ urrainn dhuinn an iuchair a sguabadh às. revokeKeyQuestion=Tha thu gu bhith an iuchair “%S†a chùl-ghairm.\n\nChan urrainn dhut soidhneadh leis an iuchair seo agus nuair a bhios i air a sgaoileadh, chan urrainn do chàch soidhneadh leatha tuilleadh. ’S urrainn dhut an iuchair a chleachdadh fhathast gus seann theachdaireachdan a dhì-chrioptachadh.\n\nA bheil thu airson leantainn air adhart? revokeKeyOk=Chaidh an iuchair a chùl-ghairm. Ma tha an iuchair agad ri fhaighinn air frithealaiche iuchraichean, mholamaid gun luchdaidh thu suas a-rithist i ach am faic càch gun deach a cùl-ghairm. revokeKeyFailed=Cha b’ urrainn dhuinn an iuchair a chùl-ghairm. revokeKeyNotPresent=Chan eil iuchair (0x%S) agad a fhreagras ris an teisteanas cùl-ghairm!\n\nMa chaill thu an iuchair agad, feumaidh tu a h-ion-phortadh (can o fhrithealaiche iuchraichean) ron teisteanas cùl-ghairm! revokeKeyAlreadyRevoked=Chaidh an iuchair 0x%S a chùl-ghairm mu thràth. refreshAllQuestion=Cha do thagh thu iuchair. Am bu toil leat a h-UILE iuchair ath-nuadhachadh? refreshKeyServiceOn.warn=Rabhadh: Tha na h-iuchraichean agad ’gan ath-nuadhachadh sa chùlaibh air dòigh cho sàbhailte ’s a ghabhas.\nMa nì thu ath-nuadhachadh air na h-iuchraichean uile agad aig an aon àm, nochdaidh sin fiosrachadh mu do dhèidhinn gun fheum air sin.\nA bheil thu cinnteach gu bheil thu airson seo a dhèanamh? refreshKey.warn=Rabhadh: a-rèir uiread nan iuchraichean is luaths a’ cheangail, dh’fhaoidte gun doir e fada fada gus a h-uile iuchair ath-nuadhachadh! downloadContactsKeys.warn=Rabhadh: a-rèir uiread an luchd-aithne is luaths a’ cheangail, dh’fhaoidte gun doir e fada fada gus a h-uile iuchair a luchdadh a-nuas! downloadContactsKeys.importFrom=A bheil thu airson an luchd-aithne o leabhar nan seòladh “%S†ion-phortadh? keyMan.button.exportSecKey=À&s-phortaich na h-iuchraichean prìobhaideach keyMan.button.exportPubKey=Na às-phortaich ach na h-iuchraichean &poblach keyMan.button.import=&Ion-phortaich keyMan.button.refreshAll=Ath-nuadhaich a h-uile iuchai&r keyMan.button.revokeKey=Cùl-ghai&rm an iuchair keyMan.button.skip=&Gearr leum thar na h-iuchrach keylist.noOtherUids=Chan eil dearbh-aithne eile aig an neach seo keylist.hasOtherUids=Tha seo air cuideachd: keylist.noPhotos=Chan eil dealbh ri làimh keylist.hasPhotos=Dealbhan keyMan.addphoto.filepicker.title=Tagh dealbh gus a chur ris keyMan.addphoto.warnLargeFile=Tha am faidhle a thagh thu nas motha na 25 kB.\nCha mholamaid gun cuir thu faidhle glè mhòr ris on a gheibh thu iuchair glè mhòr an uairsin. keyMan.addphoto.noJpegFile=Tha coltas nach eil am faidhle a thagh thu ’na fhaidhle JPEG. Feuch an tagh thu faidhle eile. keyMan.addphoto.failed=Cha b’ urrainn dhuinn an dealbh a chur ris. noWksIdentity=Chan eil dearbh-aithne WKS aig an iuchair %S. keyman.addBlacklistKey.msg=A bheil thu airson ’s gun sguir p≡p de chleachdadh na h-iuchrach “%1$S (%2$S)†a chum crioptachadh nan teachdaireachdan? keyman.removeBlacklistKey.msg=A bheil thu airson cead a thoirt do p≡p gus an iuchair “%1$S (%2$S)†a chleachdadh san àm ri teachd? keyman.addBlacklistKey.button=Cuir an iuchair ris an &dubh-liosta keyman.removeBlacklistKey.button=Thoi&r an iuchair far na dubh-liosta # Strings in enigmailManageUidDlg.xul changePrimUidFailed=Dh’fhàillig le atharrachadh prìomh ID a’ chleachdaiche changePrimUidOK=Chaidh prìomh ID a’ chleachdaiche atharrachadh revokeUidFailed=Dh’fhàillig le cùl-ghairm ID a’ chleachdaiche %S revokeUidOK=Chaidh ID a’ chleachdaiche %S a chùl-ghairm. Ma tha an iuchair agad ri fhaighinn air frithealaiche iuchraichean, mholamaid gun luchdaich thu suas a-rithist i ach am faic càch gun deach a cùl-ghairm. revokeUidQuestion=A bheil thu cinnteach gu bheil thu airson ID a’ chleachdaiche %S a chùl-ghairm? # Strings in enigmailKeyImportInfo.xul importInfoTitle=DEISEIL! Chaidh na h-iuchraichean ion-phortadh importInfoBits=Biod importInfoCreated=Air a chruthachadh importInfoFpr=Lorg-mheòir importInfoDetails=(Mion-fhiosrachadh) importInfoNoKeys=Cha deach iuchair ion-phortadh. # Strings in enigmailKeyDetailsDlg.xul keyTypePublic=iuchair phoblach keyTypePrimary=prìomh iuchair keyTypeSubkey=fo-iuchair keyTypePair=càraid iuchrach keyExpiryNever=gun chrìoch keyAlgorithm_1=RSA keyAlgorithm_2=RSA keyAlgorithm_3=RSA keyAlgorithm_16=ELG keyAlgorithm_17=DSA keyAlgorithm_18=ECDH keyAlgorithm_19=ECDSA keyAlgorithm_20=ELG keyAlgorithm_22=EDDSA keyUsageEncrypt=Crioptaich keyUsageSign=Soidhneadh keyUsageCertify=Teistich keyUsageAuthentication=Dearbhadh keyDoesNotExpire=Chan fhalbh an ùine air an iuchair # Strings in enigmailGenCardKey.xul keygen.started=Fuirich greis fhad ’s a tha an iuchair ga gintinn… keygen.completed=Chaidh an iuchair a ghintinn. Seo ID na h-iuchrach ùire: 0x%S keygen.keyBackup=Chaidh lethbhreac-glèidhidh dhen iuchair a dhèanamh mar %S keygen.passRequired=Sònraich abairt-fhaire ma tha thu airson lethbhreac-glèidhidh dhen iuchair agad a chruthachadh taobh a-muigh a’ SmartCard agad. # Strings in enigmailSetCardPin.xul cardPin.processFailed=Cha deach leinn am PIN atharrachadh # Strings in enigRetrieveProgres.xul keyserverProgress.refreshing=Ag ath-nuadhachadh nan iuchraichean, fuirich greis… keyserverProgress.uploading=A’ luchdadh suas nan iuchraichean, fuirich greis… keyserverProgress.wksUploadFailed=Cha b’ urrainn dhuinn an iuchair agad a luchdadh suas gu seirbheis Web Key keyserverProgress.wksUploadCompleted=Chaidh an iuchair phoblach agad a chur a-null dhan t-solaraiche agad. Gheibh thu post-d a dhearbhas gun do rinn thu fhèin air an luchdadh suas. keyserverTitle.refreshing=Ath-nuadhaich na h-iuchraichean keyserverTitle.uploading=Luchdadh suas iuchraichean # Strings in enigmailSetupWizard passphrase.min8keys=Bu chòir do 8 caractaran a bhith san abairt-fhaire agad air a char a lugha! setupWizard.reallyCancel=A bheil thu cinnteach gu bheil thu airson draoidh an rèiteachaidh Enigmail a dhùnadh? setupWizard.invalidGpg=Chan eil am faidhle a shònraich thu ’na fhaidhle so-ghnìomhaichte GnuPG. Feuch an sònraich thu faidhle eile. setupWizard.specifyFile=Feumaidh tu faidhle iuchrach poblaich a shònrachadh mus urrainn dhut leantainn air adhart. setupWizard.installFailed=Tha coltas nach do shoirbhich leis an stàladh. Feuch ris an stàladh a-rithist no stàlaich GnuPG a làimh agus lorg e leis a’ phutan “Rùraichâ€. setupWizard.downloadForbidden=A chum do thèarainteachd fhèin, cha luchdaich sinn a-nuas GnuPG. Tadhail air https://gnupg.org/ a luchdadh a-nuas GnuPG. setupWizard.downloadImpossible=Chan urrainn dhuinn GnuPG a luchdadh a-nuas an-dràsta. Feuch ris a-rithist an ceann greis no tadhail air https://gnupg.org/ gus GnuPG a luchdadh a-nuas. setupWizard.hashSumError=Cha b’ urrainn dhan draoidh treibhdhireas an fhaidhle air a luchdadh a-nuas a dhearbhadh. Dh’fhaoidte gu bheil am faidhle briste no gun deach beantainn ris. A bheil thu airson leantainn air adhart leis an stàladh co-dhiù? setupWizard.importSettingsFile=Sònraich faidhle lethbhric-ghlèidhidh gus a luchdadh uaithe setupWizard.invalidSettingsFile=Chan eil am faidhle a shònraich thu ’na fhaidhle lethbhric-ghlèidhidh cheart airson roghainnean Enigmail. setupWizard.gpgConfExists=Tha faidhle rèiteachaidh GnuPG ann mar-thà. A bheil thu airson sgrìobhadh thairis air leis an fhear on t-seann-stàladh agad? setupWizard.noGpgHomeDir=Tha coltas gun do rèitich thu %S airson cleachdadh le GnuPG. Gidheadh, chan e pasgan a tha seo – chan urrainn dhut a chleachdadh. setupWizard.unmachtedIds=Tha aithne no dhà san t-seann shuidheachadh agad nach b’ urrainn dhuinn a mhaidseadh:\n%S\nLeum sinn thairis air na roghainnean aca-san. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=Thachair mearachd rè luchdadh a-nuas GnuPG. Thoir sùil air loga na consoil airson barrachd fiosrachaidh. installGnuPG.installFailed=Thachair mearachd rè stàladh GnuPG. Thoir sùil air loga na consoil airson barrachd fiosrachaidh. # Strings in enigmailAddUidDlg.xul addUidDlg.nameOrEmailError=Feumaidh tu ainm is seòladh puist-d a chur a-steach addUidDlg.nameMinLengthError=Feumaidh 5 caractaran a bhith san ainm air a char as lugha addUidDlg.invalidEmailError=Feumaidh tu seòladh puist-d dligheach a thoirt seachad # Strings in enigmailCardDetails.js Carddetails.NoASCII=Cha chuir SmartCard OpenPGP taic ach ri caractaran ASCII san ainm is sloinneadh. # network error types errorType.SecurityCertificate=Chan eil an teisteanas tèarainteachd a thug an t-seirbheis-lìn seachad dligheach. errorType.SecurityProtocol=Chan aithne dhuinn am pròtacal tèarainteachd a chleachdas an t-seirbheis-lìn. errorType.Network=Thachair mearachd lìonraidh. # filter stuff filter.folderRequired=Feumaidh tu pasgan-uidhe a thaghadh. filter.decryptMove.label=Dì-chrioptaich gu buan (Enigmail) filter.decryptCopy.label=Cruthaich lethbhreac dì-chrioptaichte dheth (Enigmail) filter.decryptMove.warnExperimental=Rabhadh - dh’fhaoidte gum mill an roghainn criathraidh “Dì-chrioptaich gu buan†teachdaireachdan.\n\nDian-mholamaid gum feuch thu ris a’ chriathrag “Cruthaich lethbhreac dì-chrioptaichte†an toiseach, gun dearbhaich thu an toradh gu cùramach agus nach cleachd thu a’ chriathrag seo ach ma tha thu toilichte leis an toradh. filter.tempPepFilterDesc=Criathrag shealach gus an teachdaireachd air a cur a stòradh gun chrioptachadh filter.term.pgpencrypted.label=Le crioptachadh OpenPGP filter.encrypt.label=Crioptaich gu iuchair (Enigmail) filter.keyRequired=Feumaidh tu iuchair an fhaighteir a thaghadh. filter.keyNotFound=Cha do lorg sinn iuchair crioptachaidh airson “%Sâ€. filter.warn.keyNotSecret=Rabhadh – cuiridh an gnìomh criathraidh “Crioptaich gu iuchair†faightear eile an àite nam faightearan tùsail.\n\nMur eil an iuchair phrìobhaideach airson “%S†agad, chan urrainn dhut na puist-d a leughadh tuilleadh. # strings in enigmailConvert.jsm converter.decryptBody.failed=Cha deach leinn an teachdaireachd a dhì-chrioptachadh air a bheil an cuspair\n“%Sâ€.\nA bheil thu airson feuchainn ris a-rithist le abairt-fhaire eile no a bheil thu airson leum a ghearradh thar na teachdaireachd? converter.decryptAtt.failed=Cha deach leinn an ceanglachan “%1$Sâ€\na dhì-chrioptachadh aig an teachdaireachd air a bheil an cuspair\n“%2$Sâ€.\nA bheil thu airson feuchainn ris a-rithist le abairt-fhaire eile no a bheil thu airson leum a ghearradh thar na teachdaireachd? saveLogFile.title=Sàbhail faidhle loga # strings in gpg.jsm unknownSigningAlg=Algairim soidhnidh nach aithne dhuinn (ID: %S) unknownHashAlg=Hais chrioptografach nach aithne dhuinn (ID: %S) # strings in keyRing.jsm keyring.photo=Dealbh-camara keyRing.pubKeyRevoked=Chaidh an iuchair %1$S (ID na h-iuchrach: %2$S) a chùl-ghairm. keyRing.pubKeyExpired=Dh’fhalbh an ùine air an iuchair %1$S (ID na h-iuchrach>: %2$S). keyRing.pubKeyNotForSigning=Cha ghabh an iuchair %1$S (ID na h-iuchrach: %2$S) cleachdadh airson soidhneadh. keyRing.pubKeyNotForEncryption=Cha ghabh an iuchair %1$S (ID na h-iuchrach: %2$S) cleachdadh airson crioptachadh. keyRing.keyDisabled=Chaidh an iuchair %1$S (ID na h-iuchrach: %2$S) a chur à comas; cha ghabh a cleachdadh. keyRing.keyNotTrusted=Chan eil earbsa gu leòr san iuchair %1$S (ID na h-iuchrach: %2$S). Suidhich ìre earbsa na h-iuchrach agad air “cho earbsach ’s a ghabhas†gus a cleachdadh airson soidhneadh. keyRing.keyInvalid=Chan eil an iuchair %1$S (ID na h-iuchrach %2$S) dhligheach. Feuch an dearbhaich thu i mar bu chòir no cleachd “Roghainnean crioptachaidh furastaâ€. keyRing.signSubKeysRevoked=Chaidh gach fo-iuchair soidhnidh aig an iuchair %1$S (ID na h-iuchrach: %2$S) a chùl-ghairm. keyRing.signSubKeysExpired=Dh’fhalbh an ùine air gach fo-iuchair soidhnidh aig an iuchair %1$S (ID na h-iuchrach: %2$S). keyRing.signSubKeysUnusable=Chaidh gach fo-iuchair soidhnidh aig an iuchair %1$S (ID na h-iuchrach: %2$S) a chùl-ghairm, dh’fhalbh an ùine orra no cha ghabh an cleachdadh air adhbhar air choireigin eile. keyRing.encSubKeysRevoked=Chaidh gach fo-iuchair crioptachaidh aig an iuchair %1$S (ID na h-iuchrach: %2$S) a chùl-ghairm. keyRing.encSubKeysExpired=Dh’fhalbh an ùine air gach fo-iuchair crioptachaidh aig an iuchair %1$S (ID na h-iuchrach: %2$S). keyRing.noSecretKey=Chan eil an iuchair phrìobhaideach airson %1$S (ID na h-iuchrach: %2$S) air an dul-iuchrach agad a-rèir coltais; chan urrainn dhut an iuchair a chleachdadh airson soidhneadh. keyRing.encSubKeysUnusable=Chaidh gach fo-iuchair crioptachaidh aig an iuchair %1$S (ID na h-iuchrach: %2$S) a chùl-ghairm, dh’fhalbh an ùine orra no cha ghabh an cleachdadh air adhbhar air choireigin eile. #strings in exportSettingsWizard.js cannotWriteToFile=Chan urrainn dhuinn sàbhaladh dhan fhaidhle “%Sâ€. Feuch an tagh thu faidhle eile. dataExportError=Tachair mearachd rè às-phortadh an dàta agad. enigmailSettings=RoghainneanEnigmail defaultBackupFileName=Enigmail-às-phortadh specifyExportFile=Sònraich ainm faile airson an às-phortaidh homedirParamNotSUpported=Cha chuir sinn taic ri paramadairean a bharrachd a rèiticheas slighean, can --homedir agus --keyring rè às-phortadh/aiseag nan roghainnean agad. Cleachd dòighean eile, can suidheachadh a’ chaochladair àrainneachd GNUPGHOME. #strings in expiry.jsm expiry.keyExpiresSoon=Falbhaidh an ùine air an iuchair %1$S agad ro %2$S là(ithean).\n\nMholamaid gun cruthaich thu càraid iuchrach ùr ’s gun rèitich thu na cunntasan a fhreagras rithe ach an cleachd iad an iuchair ùr. expiry.keysExpireSoon=Falbhaidh an ùine air na h-iuchraichean seo agad ro %1$S là(ithean):\n%2$S. Mholamaid gun cruthaich thu iuchraichean ùra ’s gun rèitich thu na cunntasan agad ach an cleachd iad na h-iuchraichean ùra. expiry.keyMissingOwnerTrust=Tha earbsa a dhìth air an iuchair phrìobhaideach %S agad.\n\nMholamaid gun cuir thu “Cho earbsach ’s a ghabhas“ air “Tha thu ag earbsadh nan teisteanasan†ann an roghainnean na h-iuchrach. expiry.keysMissingOwnerTrust=Tha earbsa a dhìth air na h-iuchraichean prìobhaideachd seo agad:\n%S.\nMholamaid gun cuir thu “Cho earbsach ’s a ghabhas“ air “Tha thu ag earbsadh nan teisteanasan†ann an roghainnean na h-iuchrach. expiry.OpenKeyManager=Fosgail stiùireadh nan iuchraichean Enigmail expiry.OpenKeyProperties=Fosgail roghainnean na h-iuchrach #strings in pEpDecrypt.jsm pEpDecrypt.cannotDecrypt=Seo teachdaireachd chrioptaichte. Gu mì-fhortanach, chan eil an iuchair phrìobhaideach agad gus an teachdaireachd a dhì-chrioptachadh. #strings in gpgAgent.jsm gpghomedir.notexists=Chan eil am pasgan “%S†far a bheil na h-iuchraichean OpenPGP agad ann ’s cha ghabh a chruthachadh. gpghomedir.notwritable=Gha ghabh sgrìobhadh sa phasgan “%S†sa bheil na h-iuchraichean OpenPGP agad. gpghomedir.notdirectory=’S e faidhle seach pasgan a th’ ann an “%S†far a bheil na h-iuchraichean OpenPGP agad ann. gpghomedir.notusable=Càraich ceadan a’ phasgain no atharraich an t-ionad “dachaigh†aig a’ GnuPG agad- Chan obraich GnuPG mar bu chòir mura dèan thu seo. #strings in pepTrustWords.js pepTrustWords.cannotVerifyOwnId=Chan urrainn dhuinn na faclan-earbsa p≡p airson a’ chunntais agad fhèin a dhearbhadh. pepTrustWords.cannotFindKey=Chan urrainn dhuinn an iuchair airson %S a lorg. pepTrustWords.cannotStoreChange=Cha b’ urrainn dhuinn an earbsa a thaobh %S atharrachadh. pepTrustWords.generalFailure=Chan urrainn dhuinn na faclan-earbsa airson %S fhaighinn. pepTrustWords.partnerFingerprint=An lorg-mheòir airson %S: #strings in mimeWkdHandler.jsm wkdMessage.body.req=Tha an solaraiche agad air an iuchair phoblach agad a chur ri eòlaire Web Key OpenPGP\n\nBriog air a’ phutan dearbhaidh ann am bann-cinn Enigmail gus foillseachadh na h-iuchrach poblaich agad a choileanadh. wkdMessage.body.process=Seo post-d co-cheangailte ris a’ phròiseasadh fhèin-obrachail a luchdadh suas na h-iuchrach poblaich agad gu eòlaire Web Key OpenPGP.
Cha leig thu leas dad a dhèanamh aig an àm seo.
#strings in pepHandshake.js pepPrivacyStatus.RatingBrokenSuggestion=Bu chòir dhut fhèin no an seòladair an teachdaireachd a chur a-rithist. pepPrivacyStatus.RatingHaveNoKeySuggestionOutgoing=Ma sgrìobh thu fhèin an teachdaireachd seo, chan eil an iuchair agad ri làimh. pepPrivacyStatus.RatingMistrustSuggestion=Dèan ceangal leis a’ cho-sgrìobhaiche agad a-rithist is sibh a’ feuchainn ri crathadh-làimhe eile a choileanadh. pepPrivacyStatus.RatingReliableSuggestion=Coilean crathadh-làimhe leis a’ cho-sgrìobhaiche agad a thoirt faclan-earbsa ri chèile gu pearsanta no air a’ fòn. Cha leig thu leas crathadh-làimhe a dhèanamh le gach co-sgrìobhaiche ach aon turas agus nì sin cinnteach gum bi an conaltradh earbsach tèarainte. pepPrivacyStatus.RatingTrustedSuggestion=Chan fheum thu dad a dhèanamh! pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Thoir an aire nach eil an teachdaireachd seo tèarainte ma dh’fhaoidte. pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Cuir ris am fiosrachadh a tha a dhìth pepPrivacyStatus.RatingUnderAttackSuggestion=Dearbhaich susbaint na teachdaireachd seo gu sònraichte leis a’ cho-sgrìobhaiche agad. pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Dèan cinnteach gu bheil ìre “Tèarainte†air a char as lugha air staid na prìobhaideachd airson gach co-sgrìobhaiche air an liosa. pepPrivacyStatus.RatingUnencryptedSuggestion=Iarr air a’ cho-sgrìobhaiche agad gun cleachd iad dòigh crioptachaidh no gun stàlaich iad p≡p. pepPrivacyStatus.RatingUnreliableSuggestion=Chan eil crioptachadh no soidhneadh earbsach aig an teachdaireachd seo. Iarr air a’ cho-sgrìobhaiche agad gun àrdaich iad an dòigh crioptachaidh aca no gun stàlaich iad p≡p. pepPrivacyStatus.RatingBrokenExplanation=Tha crioptachadh no fòrmatadh briste air an teachdaireachd seo. pepPrivacyStatus.RatingHaveNoKeyExplanation=Cha ghabh an teachdaireachd seo a dhì-chrioptachadh air sgàth ’s nach eil an iuchair ri làimh. pepPrivacyStatus.RatingMistrustExplanation=Tha co-sgrìobhaiche aig an teachdaireachd seo a chaidh a chomharrachadh mar fhear amharasach roimhe. pepPrivacyStatus.RatingReliableExplanation=Tha an teachdaireachd seo tèarainte ach geumaidh tu aithne a’ cho-sgrìobhaiche agad a dhearbhadh fhathast. pepPrivacyStatus.RatingTrustedExplanation=Tha an teachdaireachd seo tèarainte ’s earbsach. pepPrivacyStatus.RatingUndefinedExplanation=Chan eil fiosrachadh gu leòr san teachdaireachd seo airson measadh a bheil i tèarainte gus nach eil. pepPrivacyStatus.RatingUnderAttackExplanation=Chan eil an teachdaireachd seo tèarainte agus bhean cuideigin rithe. pepPrivacyStatus.RatingUnencryptedExplanation=Chan eil an teachdaireachd seo tèarainte. pepPrivacyStatus.RatingUnencryptedForSomeExplanation=Chan eil an teachdaireachd seo tèarainte do gach co-sgrìobhaiche. pepPrivacyStatus.RatingUnreliableExplanation=Chan eil dìon na teachdaireachd seo earbsach. pepPrivacyStatus.RatingBrokenText=Briste pepPrivacyStatus.RatingHaveNoKeyText=Chan urrainn dhuinn a dì-chrioptachadh pepPrivacyStatus.RatingMistrustText=Amharasach pepPrivacyStatus.RatingReliableText=Tèarainte pepPrivacyStatus.RatingTrustedText=Tèarainte ⊠earbsach pepPrivacyStatus.RatingUndefinedText=Chan eil fhios pepPrivacyStatus.RatingUnderAttackText=Fo ionnsaigh pepPrivacyStatus.RatingUnencryptedForSomeText=Neo-thèarainte do chuid pepPrivacyStatus.RatingUnencryptedText=Neo-thèarainte pepPrivacyStatus.RatingUnreliableText=Tèarainteachd neo-earbsach handshakeDlg.button.initHandshake=Crathadh-làimhe… handshakeDlg.button.stopTrust=Na cuir earbsa ann tuilleadh handshakeDlg.button.reTrust=Thoir air falbh an t-an-amharas handshakeDlg.label.outgoingMessage=Teachdaireachd a-mach handshakeDlg.label.incomingMessage=Teachdaireachd a-steach handshakeDlg.error.noPeers=Cha ghabh crathadh-làimhe a dhèanamh às aonais co-sgrìobhaiche. handshakeDlg.error.noProtection=Cuir an dìon an comas ach an cleachd thu gleus nan crathaidhean-làimhe. enigmail.acSetupPasswd.descEnterPasswd=Cuir a-steach an còd suidheachaidh a chì thu air an uidheam eile enigmail.acSetupPasswd.descCopyPasswd=Cuir a-steach an còd suidheachadh a chì thu gu h-ìosal air an uidheam eile agad gus leantainn air adhart leis an t-suidheachadh #strings in autocrypt.jsm autocrypt.setupMsg.subject=Teachdaireachd suidheachadh Autocrypt autocrypt.setupMsg.msgBody=Gus Autocrypt a shuidheachadh air an uidheam ùr agad, lean ris an stiùireadh a bu chòir dhut fhaicinn air an uidheam ùr agad. autocrypt.setupMsg.fileTxt=Seo faidhle suidheachadh Autocrypt a thèid a chleachdadh gus roghainnean is iuchraichean a thar-aiseag eadar cliantan. ’S urrainn dhut a dì-chrioptachadh leis a’ chòd shuidheachaidh a chì thu air an t-seann-uidheam agad agus an iuchair a tha ’na broinn ion-phortadh dhan dul-iuchrach agad an uairsin. #strings in upgradeInfo.html upgradeInfo.doctitle=Na tha ùr ann an Enigmail v2.0 upgradeInfo.welcome1=Fàilte gun Enigmail ùr, tionndadh 2.0! upgradeInfo.welcome2=Tha iomadh gleus ùr no air atharrachadh san sgaoileadh seo. Thoir sùil air na tha ùr: upgradeInfo.encSubject.title=Crioptachadh air cuspair na teachdaireachd upgradeInfo.encSubject.desc=Leasaich sinn dòigh ùr a ghluaiseas cuspair a’ phuist-d dhan teachdaireachd chrioptaichte ’s a chuireas “Teachdaireachd le crioptachadh†an àite a’ chuspair a chithear. Nuair a thèid teachdaireachd dhen leithid a dhì-chrioptachadh, thèid an cuspair tùsail a chur ’na àite gu fèin-obrachail. Tha falach nan cuspairean an comas a ghnàth; tha roghainn ann gus a chur dheth mura còrd e riut. (Thoir an aire: iarraidh an gleus seo gun cuir thu an teachdaireachd le PGP/MIME.) upgradeInfo.buttons.title=Chaidh an dòigh a dh’obraicheas na putanan crioptachaidh is soidhnidh atharrachadh upgradeInfo.buttons.desc=Obraichidh na putanan Crioptaich is Soidhnich ann an uinneag an sgrìobhaidh an dà chuid le pròtacal OpenPGP agus S/MIME. Ma tha an dà chuid comasach, feuchaidh Enigmail am pròtacal a chleachdadh dhan a bheil a h-uile iuchair ri fhaighinn. upgradeInfo.autocrypt.title=Taic ri Autocrypt upgradeInfo.autocrypt.desc=Cuiridh Enigmail taic ri Autocrypt a-nis, seo stannard ùr a chum sgaoileadh iuchraichean mar phàirt de theachdaireachdan a thèid a chur. Ion-phortaichidh Enigmail iuchraichean o theachdaireachdan a ghèilleas ri Autocrypt gu fèin-obrachail ach an gabh barrachd phost-d a chrioptachadh san àm ri teachd. upgradeInfo.pEp.title=Modh p≡p furasta ùr (Pretty Easy Privacy) upgradeInfo.pEp.desc=Tha modh furasta p≡p aig Enigmail a-nis. Feumaidh tu p≡p a stàladh a làimh aig an àm seo; tha sinn ag amas piseach a chur air sin san àm ri teachd. Leigidh am modh furasta p≡p leat crioptachadh OpenPGP a chleachdadh air dòigh as soilleire; cha leig thu leas bodraigeadh le stiùireadh no sioncronachadh nan iuchraichean eadar uidheaman tuilleadh. upgradeInfo.bottom.desc=Tadhail air an docamaideadh againn airson cobhair le cleachdadh Enigmail. pep.missingGnuPG=Feumaidh GnuPG a bhith agad mus urrainn dhut Enigmail/p≡p a chleachdadh. Cha do lorg sinn e agus mholamaid gun luchdaich sinn a-nuas is gun stàlaich sinn e air do shon. #strings in enigmailAbout.html aboutEnigmail.tabName=Mu Enigmail aboutEnigmail.title=Tha an taic ri OpenPGP ’ga sholar le Enigmail aboutEnigmail.team=Tha Enigmail ’ga leasachadh le sgioba leasachaidh Enigmail: aboutEnigmail.projectLeader=Prìomh neach-leasachaidh: aboutEnigmail.usability=So-chleachdachd: aboutEnigmail.documentation=Docamaideadh: aboutEnigmail.testing=Deuchainnean: aboutEnigmail.userSupport=Taic: aboutEnigmail.localization=Eadar-theangachadh: Faic duilleag nam pacaidean cànain Enigmail aboutEnigmail.Credits=Urram: aboutEnigmail.origAuthor=Ùghdar tùsail leudachan Enigmail aboutEnigmail.icons=Ìomhaigheagan: aboutEnigmail.formerMembers=Seann-bhuill an sgioba: aboutEnigmail.projectHosting=Òstadh a’ phròiseict: aboutEnigmail.licenseSupportTitle=Ceadachas ⊠taic aboutEnigmail.license=’S e bathar-bog le tùs fosgailte a th’ ann an Enigmail OpenPGP agus fo cheadachas %S aboutEnigmail.support=Tha taic is luchdaidhean a-nuas ri am faighinn air www.enigmail.net. enigmail-2.0.8/lang/gd/help/000077500000000000000000000000001334302754500155575ustar00rootroot00000000000000enigmail-2.0.8/lang/gd/help/compose.html000066400000000000000000000100761334302754500201160ustar00rootroot00000000000000 Enigmail Help: Message Composition

Enigmail Help

Using Enigmail when composing messages

Enigmail menu in Mail/Compose window
Sign message
Enable/Disable sending signed mail. User is notified, if signing fails.
Encrypt message

Enable/Disable encryption to all recipient(s) before sending. User is notified, if encryption fails.

If Display selection when necessary is set in Preferences -> Key Selection tab, a list of keys will pop up if there are addresses in the list of recipients for the message for whom you have no public key.

If Never display OpenPGP key selection dialog is set in Preferences -> Key Selection tab, and there are addresses in the list of recipients for the message for whom you have no public key, the message will be sent unencrypted.

Use PGP/MIME for this message
Enable/Disable the use of PGP/MIME for this message.

If you know the recipient(s) can read mail using the PGP/MIME format, you should use it.

This feature is dependent on the settings in Preferences -> PGP/MIME tab being set to Allow to use PGP/MIME or Always use PGP/MIME.

Default composition options
  • Signing/Encryption Options...: shortcut to Account Settings -> OpenPGP Options.
  • Send options...: shortcut to Preferences -> Send tab.
  • Key selection options...: shortcut to Preferences -> Key Selection tab.
  • PGP/MIME options...: shortcut to Preferences -> PGP/MIME tab.
Undo encryption

If there is a failure when actually sending mail, such as the POP server not accepting the request, Enigmail will not know about it, and the encrypted message will continue to be displayed in the Compose window. Choosing this menu item will undo the encryption/signing, reverting the Compose window back to its original text.

As a temporary fix, this option may also be used to decrypt the quoted text when replying to encrypted messages. Enigmail should automatically decrypt the quoted message, but if that fails for some reason, you can use this menu item to force it.

Insert public key
insert ASCII-armored public key block at the current cursor location in the Compose window. You will be prompted for the email addresses of the key(s) to be inserted. Keys inserted in this manner will automatically be recognized at the receiving end by Enigmail. After key insertion, you may still choose to sign/encrypt the mail as needed. Also, do not insert more than one key block in a message; just specify multiple email addresses, separated by commas or spaces, when prompted.
Clear save passphrase
Clears cached passphrase. Useful if you have multiple passphrases.
Help
Displays Help information from the website (this page).

Further help is available on the Enigmail Help web page

enigmail-2.0.8/lang/gd/help/editRcptRule.html000066400000000000000000000116041334302754500210550ustar00rootroot00000000000000 Enigmail Help: Edit Per-Recipient Rule

Enigmail Help

Using the Enigmail Rules Editor: Edit Per-Recipient Rule

In the Rules Editor, you can specify defaults per recipient for enabling encryption, signing and PGP/MIME, and to define what OpenPGP key(s) to use. In this dialog, you can specify the rules for a single recipient, and for a group of recipients with very similar attributes.

Set Enigmail Rules for
Contains the email addresses of the recipients (without names, i.e. just an address like somebody@email.domain). You can specify several email addresses, separated by spaces. The address specified here can consist of only the domain section so that mail to any address at that domain will be matched, e.g. @email.domain will allow matching to body@email.domain, somebody@email.domain, anybody@email.domain, etc.
Apply rule if recipient ...
This modifies the matching of the email addresses. If multiple addresses are entered, the setting will apply to all. The examples below are based on body@email.domain entered in the Enigmail Rules field above.
  • Is exactly: with this setting, the rule will only trigger on emails to body@email.domain (exact, case insensitive matching).
  • Contains: with this setting, any email address containing the string is matched, e.g. anybody@email.domain or body@email.domain.net
  • Begins with: with this setting, any email address starting with the string is matched, e.g. body@email.domain.net, body@email.domain-name.com.
  • Ends with: with this setting, any email address ending with the string is matched, e.g. anybody@email.domain , somebody@email.domain.
Continue with the next rule for the matching address
Enabling this function will allow you to define a rule but not have to specify a KeyID in the Use the following OpenPGP keys: field, so that the email address is used to check for a key at the time of sending. Also, further rules for the same address(es) will be processed as well.
Do not check further rules for the matching address
Enabling this function stops processing any other rules for the matching address(es) if this rule is matched; i.e. rule processing continues with the next recipient.
Use the following OpenPGP keys:
Use the Select Key(s).. button to select the recipient keys to be used for encryption. As in the action above, no further rules for the matching address(es) are processed.
Default for Signing
Enable or disable message signing. This either uses or overrides what you have specified in the message composition window. The values are:
  • Never: disable signing, even if it was enabled in the message composition window (overrules the other values)
  • Yes, if selected from in Message Composition: leave signing as specified in the message composition window
  • Always: enable signing, even if it was not enabled in the message composition window
These signing settings are applied for all rules that match. If one of the rules disables signing, the message will not be signed, regardless of other rules that specify Always.
Encryption
Enable or disable message encryption. The allowed settings and their meaning are the same as for message signing.
PGP/MIME
Enable or disable the use of the PGP/MIME (RFC 3156) message encoding. If PGP/MIME is disabled, the messages are encoded using "inline PGP". The allowed values and their meaning are the same as for message signing.

The rules are processed in the order displayed in the list in the Per-Recipient Rules Editor. Whenever a rule matches a recipient and contains a OpenPGP Key ID, in addition to using the specified Key ID, the recipient is not considered anymore when processing further rules.


Further help is available on the Enigmail Per-Recipient Settings page

enigmail-2.0.8/lang/gd/help/help.html000066400000000000000000000103271334302754500174000ustar00rootroot00000000000000 Enigmail Help

Enigmail Help

Using Enigmail when reading messages

  • Decrypt button in main Mail window
    This button can be used for several purposes: decrypt, verify, or import public keys. Normally decryption/verification happens automatically, although this can be disabled through a preference. However, if this fails, usually a short error message will appear in the Enigmail status line. If you click the Decrypt button, you will be able to see a more detailed error message, including the output from the GnuPG command.
  • Pen and Key icons in Message Header display
    The Pen and Key icons in the Message Header display indicate if the message you are reading was signed and/or encrypted and if the signature is good, i.e. the message has not been changed since it was signed. If the message has been changed, the Pen icon will change to a Broken Pen to indicate that the signature is bad. Right clicking on either the Pen or Key icons will bring up a menu with the following options:
    • Enigmail Security info: allows you to view the output status from GnuPG for the message.
    • Copy Enigmail Security info: copies the output status from GnuPG to the clipboard; to paste into a reply message, etc.
    • View OpenPGP Photo ID: allows you to view the Photo ID of the person who sent the message, if they have a photo embedded in their Public Key. (This option will only be enabled if a Photo ID exists in their key.)
    • S/MIME Security info: allows you to view the S/MIME Security Info for the message.

    If you do not have keyserver-options auto-key-retrieve set in your gpg.conf file and you read a message which is signed or encrypted, you will see a Pen icon in the headers display area with a Question mark on it, the Enigmail status line in the headers area will say Part of the message signed; click pen icon for details and the message in the Message Pane will show all the OpenPGP message block indicators and the signature block.

    You may also see this if you have keyserver-options auto-key-retrieve set in your gpg.conf file and the OpenPGP key is not available on the default keyserver.

    Clicking on the Pen and Question mark icon will bring up a window advising that the key is unavailable in your keyring. Clicking on OK will bring up another window with a list of keyservers from which you can select to download the sender's public key from.

    To configure the list of keyservers you wish to use, go to Enigmail -> Preferences -> Basic tab and enter the keyserver addresses in the Keyserver(s): box, separated by a comma. The first keyserver in the list will be used as the default.

  • Opening encrypted attachments / importing attached OpenPGP keys
    Attachments named *.pgp, *.asc and *.gpg are recognized as attachments that can be handled specially by Enigmail. Right clicking on such an attachment enables two special menu items in the context menu: Decrypt and Open and Decrypt and Save. Use these two menu items if you want Enigmail to decrypt an attachment before opening or saving it. If an attachment is recognized as an OpenPGP key file, you are offered to import the keys it into your keyrings.

Further help is available on the Enigmail Help web page
If you have questions or comments about enigmail, please send a message to the Enigmail mailing list

Enigmail is open source and licensed under the Mozilla Public License

enigmail-2.0.8/lang/gd/help/initError.html000066400000000000000000000045521334302754500204300ustar00rootroot00000000000000 Enigmail Help: How to Resolve Problems with Initializing Enigmail

Enigmail Help

How to Resolve Problems with Initializing Enigmail

There are several reasons why initializing Enigmail does not succeed. The most common ones are described below; for more information please visit the Enigmail Support page.

GnuPG could not be found

In order for Enigmail to work, the tool GnuPG needs to be installed. If GnuPG cannot be found, then first make sure that the executable gpg.exe (on Windows; gpg on other platforms) is installed on your computer. If GnuPG is installed, and Enigmail cannot find it, then you need to manually set the path to GnuPG in the Enigmail Preferences (menu Enigmail > Preferences)

Enigmime failed to initialize

Enigmail works only if it is built using the same build environment as Thunderbird or SeaMonkey was built. This means that you can use the official Enigmail releases only if you use the official releases of Thunderbird or SeaMonkey provided by mozilla.org.

If you use a Thunderbird or SeaMonkey version coming from some other source (e.g. the provider of your Linux distribution), or if you built the application yourself, you should either use an Enigmail version built by the same source, or build Enigmail yourself. For building Enigmail, refer to the Source Code section on the Enigmail home page. Please don't file any bug report concerning this problem, it is not solvable.

Further help is available on the Enigmail Support Web Site.

enigmail-2.0.8/lang/gd/help/messenger.html000066400000000000000000000101421334302754500204330ustar00rootroot00000000000000 Enigmail Help: Message Reading

Enigmail Help

Using Enigmail when reading messages

Decrypt button in main Mail window
This button can be used for several purposes: decrypt, verify, or import public keys. Normally decryption/verification happens automatically, although this can be disabled through a preference. However, if this fails, usually a short error message will appear in the Enigmail status line. If you click the Decrypt button, you will be able to see a more detailed error message, including the output from the GnuPG command.
Pen and Key icons in Message Header display
The Pen and Key icons in the Message Header display indicate if the message you are reading was signed and/or encrypted and if the signature is good, i.e. the message has not been changed since it was signed. If the message has been changed, the Pen icon will change to a Broken Pen to indicate that the signature is bad. Right clicking on either the Pen or Key icons will bring up a menu with the following options:
  • Enigmail Security info: allows you to view the output status from GnuPG for the message.
  • Copy Enigmail Security info: copies the output status from GnuPG to the clipboard; to paste into a reply message, etc.
  • View OpenPGP Photo ID: allows you to view the Photo ID of the person who sent the message, if they have a photo embedded in their Public Key. (This option will only be enabled if a Photo ID exists in their key.)
  • S/MIME Security info: allows you to view the S/MIME Security Info for the message.

If you do not have keyserver-options auto-key-retrieve set in your gpg.conf file and you read a message which is signed or encrypted, you will see a Pen icon in the headers display area with a Question mark on it, the Enigmail status line in the headers area will say Part of the message signed; click pen icon for details and the message in the Message Pane will show all the OpenPGP message block indicators and the signature block.

You may also see this if you have keyserver-options auto-key-retrieve set in your gpg.conf file and the OpenPGP key is not available on the default keyserver.

Clicking on the Pen and Question mark icon will bring up a window advising that the key is unavailable in your keyring. Clicking on OK will bring up another window with a list of keyservers from which you can select to download the sender's public key from.

To configure the list of keyservers you wish to use, go to Enigmail -> Preferences -> Basic tab and enter the keyserver addresses in the Keyserver(s): box, separated by a comma. The first keyserver in the list will be used as the default.

Opening encrypted attachments / importing attached OpenPGP keys
Attachments named *.pgp, *.asc and *.gpg are recognized as attachments that can be handled specially by Enigmail. Right clicking on such an attachment enables two special menu items in the context menu: Decrypt and Open and Decrypt and Save. Use these two menu items if you want Enigmail to decrypt an attachment before opening or saving it. If an attachment is recognized as an OpenPGP key file, you are offered to import the keys it into your keyrings.

Further help is available on the Enigmail Help web page

enigmail-2.0.8/lang/gd/help/rulesEditor.html000066400000000000000000000060331334302754500207500ustar00rootroot00000000000000 Enigmail Help: Rules Editor

Enigmail Help

Using the Enigmail Rules Editor

In the Rules Editor, you can specify defaults per recipient for enabling encryption, signing and PGP/MIME, and to define what OpenPGP key(s) to use. Each rule consists of 5 fields and is represented on a single line:

Email
The e-mail(s) from the To:, Cc: and Bcc: fields to match. The matching works on substrings (Further details can be found in the Edit Rule dialog)
OpenPGP Key(s)
a list of OpenPGP Key ID's to use for the recipient
Sign
enable or disable message signing. This either uses or overrides what you have specified in the message composition window. The values are:
  • Never: disable signing, even if it was enabled in the message composition window (overrules the other values)
  • Possible: leave signing as specified in the message composition window
  • Always: enable signing, even if it was not enabled in the message composition window

These signing settings are applied for all rules that match. If one of the rules disables signing, the message will not be signed, regardless of other rules that specify Always.

Encrypt
enable or disable message encryption. The allowed settings and their meaning are the same as for message signing.
PGP/MIME
enable or disable the use of the PGP/MIME (RFC 3156) message encoding. If PGP/MIME is disabled, the messages are encoded using "inline PGP". The allowed values and their meaning a re the same as for message signing.

The rules are processed in the order displayed in the list. Whenever a rule matches a recipient and contains a OpenPGP Key ID, in addition to using the specified Key ID, the recipient is not considered anymore when processing further rules.

Note: The rule editor is not yet complete. It is possible to write some more advanced rules by directly editing the rules file (these rules should then not be edited anymore in the rule editor). Further information for directly editing the file is available on the Enigmail Homepage


Further help is available on the Enigmail Help web page

enigmail-2.0.8/lang/gd/help/sendingPrefs.html000066400000000000000000000047571334302754500211110ustar00rootroot00000000000000 Enigmail Help: Edit OpenPGP Rule

Enigmail Help

Defining Preferences to Send Encrypted

In the Sending Preferences you can choose the general model and preferences for encryption.

Convenient Encryption
With these settings, emails are encrypted without confirmation whenever possible.

This setup is appropriate, if you just want to improve your privacy by sending emails encyrpted instead of unencrypted if that's possible.

The effect is like sending emails as letters instead of postcards. Unlike postcards, letters usually hide their contents while in transit.

Note however that as with letters you can't be sure that nobody is opening the letter while it is in transit (although, some technical effort is necessary for that).

A concrete risk is that you accidentally use "faked keys" you got from somewhere or somebody claiming that the key belongs to the person you want to send emails to. To avoid this risk, you can either use the trust model of PGP (see below) or you should always verify, whether the fingerprint of a public key is correct.

Manual Encryption
This option allows you to specify the different preferences for encryption according to your needs. You can specify
  • whether replies to encrypted/signed emails should automatically also be encrypted/signed-
  • whether to use the trust model of Enigmail to accept keys (this means that to use a key you either have to sign the key or have enough other people you trust having signed the key).
  • whether you want to automatically send emails encrypted if all keys are accepted.
  • whether and when you want to finally confirm sending an email.
If it is important for you that content you send encrypted can't be read by other people or organizations, you should use the manual preferences at least choose the option to accept keys only if you or other people signed them. While this model reduces the risk of using faked keys, it requires that you actively sign keys and declare owner trust using the key managament dialog. enigmail-2.0.8/lang/gl/000077500000000000000000000000001334302754500146375ustar00rootroot00000000000000enigmail-2.0.8/lang/gl/am-enigprefs.properties000066400000000000000000000001231334302754500213260ustar00rootroot00000000000000# Strings used in the Mozill AccountManager prefPanel-enigprefs=Seguridade OpenPGP enigmail-2.0.8/lang/gl/enigmail.dtd000066400000000000000000001702051334302754500171260ustar00rootroot00000000000000 Mozilla Public License 2.0."> ' para especificar os enderezos de correo"> ' para especificar enderezos de correo para GnuPG. Desactivar se os/as destinatarios/as teñen vellas chaves de Hushmail."> Seguranza OpenPGP)"> NOTA: A xeración de chaves pode levar varios minutos. Non saia da aplicación mentres se xera a chave. Unha navegación activa ou realizar operacións intensivas co disco durante a xeración das chaves acelerará o proceso e beneficiará a aleatoriedade. Recibirá un aviso cando se complete a xeración das chaves."> ' non é válido"> NOTA: A xeración da chave pode levar varios minutos. Non saia da aplicación mentres se estea a xerar a chave. Recibirá un aviso en canto remate o proceso."> Nota: Enigmail verificará sempre sinaturas nos correos para todas as contas ou identidades, estean ou non activadas"> chave pública é para que outros lle poidan enviar os correos electrónicos cifrados. Pode distribuirlla a quen desexe."> chave privada é só para que vostede poida descifrar estes correos e mais enviar correos asinados. Non debería darlla a ninguén."> chave privada é só para que vostede poida descifrar estes correos e mais enviar correos asinados. Non debería darlla a ninguén. Para asegurar a chave privada, pediráselle a frase secreta nos seguintes dous diálogos."> frase secreta protexe a chave privada impedindo un mal uso dela."> non se recomendan."> exportar os datos usando o asistente de copias de seguranza nas preferencias do Enigmail importar os datos ao novo computador usando este asistente. "> Grazas por usar Enigmail."> exportar os datos desde o computador antigo usando este asistente importar os datos ao novo computador usando o asistente de configuración. "> enigmail-2.0.8/lang/gl/enigmail.properties000066400000000000000000001560231334302754500205510ustar00rootroot00000000000000Enigmail=Enigmail ##################################################################### # Strings used within enigmailCommon.js and enigmailCommon.jsm ##################################################################### enigAlert=Alerta do Enigmail enigConfirm=Confirmación do Enigmail enigInfo=Información do Enigmail enigError=Erro do Enigmail enigPrompt=Diálogo do Enigmail dlgYes=&Si dlgNo=&Non dlgKeepSetting=Lembrar a resposta e non preguntar de novo dlgNoPrompt=Non mostrar este diálogo de novo dlg.button.delete=Eliminar dlg.button.cancel=&Cancelar dlg.button.close=Pe&char dlg.button.continue=Con&tinuar dlg.button.skip=&Omitir dlg.button.overwrite=&Sobrescribir dlg.button.view=&Ver dlg.button.retry=&Reintentar dlg.button.ignore=&Ignorar dlg.button.install=&Instalar dlg.button.ok=&Aceptar repeatPrefix=\n\nEsta alerta repetirase %S repeatSuffixSingular=vez máis. repeatSuffixPlural=veces máis. noRepeat=\n\nEsta alerta non se repetirá até que actualice Enigmail. pgpNotSupported=Semella que está a usar Enigmail xunto con PGP 6.x\n\nDesafortunadamente, PGP 6.x ten problemas que impiden que Enigmail traballe correctamente. Ademais, Enigmail xa non acepta PGP 6.x. Cambie a GnuPG (GPG) no seu lugar.\n\nSe precisa axuda para cambiar a GnuPG, comprobe a sección da Axuda no sitio web de Enigmail. initErr.howToFixIt=Para poder usar o Enigmail, precisa instalar o GnuPG. Se aínda non o ten, o xeito máis doado de\ninstalalo é usando o botón inferior do «Asistente de configuración». initErr.setupWizard.button=Configurar o a&sistente passphraseCleared=A frase secreta foi borrada. cannotClearPassphrase=Está usando unha ferramenta non estándar (como gnome-keyring) para manexar as frases secretas. Por este motivo non é posíbel limpar a frase secreta desde o Enigmail. noPhotoAvailable=A foto non está dispoñíbel debugLog.title=Rexistro da depuración do Enigmail error.photoPathNotReadable=A ruta da imaxe '%S' non se pode ler generalError=Erro: %S # Strings in configure.jsm enigmailCommon.versionSignificantlyChanged=Esta nova versión de Enigmail ten cambios importantes no manexo das preferencias e das opcións. Tentamos conservar os vellos axustes na nova versión. Con todo, non podemos cubrir todos os casos automaticamente. Por favor, comprobe as novas preferencias e opcións. enigmailCommon.checkPreferences=Comprobar as preferencias... preferences.defaultToPgpMime=Cambiamos a codificación predeterminada de mensaxes no Enigmail de Inline-PGP a PGP/MIME. Recomendámoslle que o manteña así.\n\nSe aínda desexa usar Inline-PGP de xeito predeterminado, pode facelo nos axustes da conta en Seguridade OpenPGP. ##################################################################### # Strings in enigmailAbout.js ##################################################################### usingVersion=Executando Enigmail versión %S enigmailPepVersion=Enigmail/p≡p versión %S usingAgent=Usando %S executábel %S para cifrar e descifrar agentError=ERRO: Produciuse un fallo ao acceder ao servizo Enigmime! ##################################################################### # Strings in enigmailKeygen.js ##################################################################### accessError=Produciuse un erro ao acceder ao servizo Enigmail onlyGPG=A xeración de chaves só funciona con GnuPG (non con PGP)! keygenComplete=Completouse a xeración da chave! Usarase a identidade <%S> para asinar. revokeCertRecommended=Recoméndase crear un certificado de revogación para a súa chave. Este certificado pode utilizarse para invalidar a súa chave, p.ex. no caso de que perda a súa chave privada ou esta se vexa comprometida. Quere crear un certificado de revogación agora? keyMan.button.generateCert=Xerar certificado genCompleteNoSign=Completouse a xeración da chave! genGoing=Xa se están a xerar as chaves! passNoMatch=As frases secretas non coinciden; introdúzaas de novo passCheckBox=Marque a caixa se non quere unha frase secreta para a chave passUserName=Especifique o nome de usuario/a para esta identidade keygen.missingUserName=Non se especificou un nome para a conta/identidade seleccionada. \nIntroduza un valor no campo «Nome» nos axustes da conta. keygen.passCharProblem=Está a usar caracteres especiais na frase secreta. Desafortunadamente, isto pode causar problemas noutros aplicativos. Recomendámoslle que escolla un contrasinal utilizando os seguintes caracteres:\na-z A-Z 0-9 /.;:-,!?(){}[]%* passSpaceProblem=Debido a razóns técnicas, a frase secreta non pode comezar ou rematar cun espazo. changePassFailed=Produciuse un fallo ao cambiar a frase secreta. keyConfirm=Xerar chaves pública e privada para '%S'? keyMan.button.generateKey=Xerar chave keyAbort=Desexa interromper a xeración de chaves? keyMan.button.generateKeyAbort=Cancelar a xeración da chave keyMan.button.generateKeyContinue=Continuar coa xeración da chave expiryTooLong=Non é posíbel crear unha chave con unha caducidade de máis de 100 anos. expiryTooLongShorter=Non é posíbel crear unha chave que caduque en máis de 90 anos. expiryTooShort=A súa chave debe ser válida alomenos durante un día. keyGenFailed=Produciuse un fallo durante a xeración da chave. Comprobe a consola de Enigmail (Menú Enigmail > Depuración Enigmail) para saber os detalles. setKeyExpirationDateFailed=Non foi posíbel cambiar a data de caducidade # Strings in enigmailMessengerOverlay.js securityInfo=Información de seguridade de Enigmail\n\n enigHeader=Enigmail: enigContentNote=Enigmail: *Os anexos de esta mensaxe non foron asinados nin cifrados*\n\n possiblyPgpMime=Posíbelmente é unha mensaxe PGP/MIME cifrada ou asinada; prema no botón Descifrar para verificalo saveAttachmentHeader=Enigmail: Gardar anexo descifrado noTempDir=Non foi posíbel atopar un cartafol temporal no que escribir. Defina a variábel de contorno TEMP attachmentPgpKey=O anexo '%S' que quere abrir parece ser un ficheiro de chave OpenPGP.\n\nPrema 'Importar' para importar as chaves contidas ou 'Ver' para ver o contido do ficheiro en unha xanela do navegador beginPgpPart=********* *INICIO DA PARTE CIFRADA OU ASINADA* ********* endPgpPart=********** *FIN DA PARTE CIFRADA OU ASINADA* ********** notePartEncrypted=Enigmail: *Hai partes da mensaxe que NON están asinadas ou cifradas* noteCutMessage=Enigmail: *Atopáronse múltiples bloques da mensaxe -- interrompeuse o descifrado/verificación* decryptOkNoSig=Aviso\n\nDescifrouse satisfactoriamente, mais a sinatura non se puido verificar correctamente. msgOvl.button.contAnyway=&Continuar igualmente signature.verifiedOK=A sinatura do anexo %S comprobouse correctamente signature.verifyFailed=Non foi posíbel comprobar a sinatura do anexo %S attachment.noMatchToSignature=Non foi posíbel asociar o anexo '%S' a un ficheiro de sinatura attachment.noMatchFromSignature=Non foi posíbel asociar o ficheiro de sinatura '%S' a un anexo fixBrokenExchangeMsg.failed=Non se conseguiu repara a mensaxe. enigmail.msgViewColumn.label=Enigmail enigmailPep.msgViewColumn.label=Enigmail/p≡p wksNoIdentity=Esta chave non está vencellada a ningunha das súas contas de correo. Engada unha conta para cando menos un dos seguintes enderezo(s):\n\n%S wksConfirmSuccess=Correo electrónico de confirmación enviado. wksConfirmFailure=Produciuse un fallo no envío do correo de confirmación. autocrypt.importSetupKey.accountPreconfigured=A conta xa está correctamente configurada para Autocrypt.\n\nConfirma que desexa sobrescribr os seus axustes con esta mensaxe de configuración? autocrypt.importSetupKey.selfCreated=Esta mensaxe foi creada pola instancia do Enigmail actualmente en execución.\n\nCambie ao cliente de correo ao que desexa transferir a configuración e prema na mensaxe nese cliente de correo ao que quere importar a configuración. autocrypt.importSetupKey.invalidMessage=Erro - non foi posíbel ler a mensaxe de configuración. A mensaxe parece corrompida. Tente crear unha nova no outro dispositivo. autocrypt.importSetupKey.invalidKey=Erro - non foi posíbel importar a chave porque ou ben non é compatíbel coa súa versión do GnuPG ou ben se corrompeu. autocrypt.importSetupKey.wrongPasswd=O contrasinal introducido é incorrecto. Desexa reintentalo? autocrypt.importSetupKey.success=A mensaxe de configuración do Autocrypt procesouse correctamente. O Autocrypt está agora dispoñíbel para a súa conta «%S». ##################################################################### # Strings in enigmailMsgComposeOverlay.js ##################################################################### keysToExport=Seleccionar chaves OpenPGP a inserir keysToUse=Seleccionar chaves OpenPGP que usar para %S pubKey=Chave pública para %S\n windowLocked=A xanela de composición está bloqueada; o envío foi cancelado sendUnencrypted=Produciuse un fallo ao arrancar Enigmail.\nQuere enviar o mensaxe sen cifrar? composeSpecifyEmail=Especifique o seu enderezo de correo principal, o que se utilizará para escoller a chave para asinar as mensaxes saíntes.\n Se o deixa en branco, usarase o enderezo de REMITE da mensaxe para escoller a chave para asinar. sendingHiddenRcpt=Esta mensaxe ten destinos ocultos Cco (Copia carbón oculta). Se esta mensaxe está cifrada, é posíbel agochar os/as destinatarios/as ocultos/as (Cco) mais usuarios/as dalgúns productos (p.e. PGP Corp.) non poderán descifrar a mensaxe. Dito isto, recomendase evitar correos con Cco con mensaxes cifradas. sendWithHiddenBcc=Agochar destinatarios/as Cco sendWithShownBcc=Cifrar normalmente sendingNews=Cancelouse o envío cifrado.\n\nEsta mensaxe non se pode cifrar porque hai destinos de grupos de novas. Reenvíe a mensaxe sen cifrar. sendToNewsWarning=Aviso: está a piques de enviar unha mensaxe cifrada a un grupo de novas.\n\nIsto non é aconsellábel xa que só ten sentido se todoas as persoas do grupo poden descifrar a mensaxe, p.e. a mensaxe precisa ser cifrada coas chaves de todos/as participantes do grupo. Envíe esta mensaxe só se sabe exactamente o que está a facer.\n\nContinuar? hasHTML=Aviso de correo HTML:\nEsta mensaxe pode conter HTML, o que podería causar fallos na sinatura/cifrado. Para evitar isto no futuro, debería premer a tecla SHIFT cando prema no botón Compoñer/Responder para enviar correo asinado.\nSe asina o correo de xeito predeterminado, debería desmarcar a opción 'Compoñer mensaxes en HTML' para desactivar o correo HTML de xeito permanente para esta conta de correo. strippingHTML=A mensaxe contén información de formato en HTML que se perderá ao facer a conversión a texto plano para asinar/cifrar. Quere continuar? msgCompose.button.sendAnyway=Enviar a mensaxe igualmente&Send Message Anywa attachWarning=Os anexos a esta mensaxe non son locais e non se poden cifrar. Para cifrar os anexos, gárdeos primeiro como ficheiros locais e despois engádaos como ficheiros adxuntos. Quere enviar a mensaxe igualmente? quotedPrintableWarn=Activou a codificación 'entrecomiñado-imprimíbel' para o envío de mensaxes. Isto pode producir erros ao descifrar ou verificar a mensaxe.\nQuere desactivar o envío de mensaxes 'entrecomiñados-imprimíbeis' agora? minimalLineWrapping=Definiu o axuste de liña a %S caracteres. Para un cifrado ou sinatura correcta, este valor ten que ser como mínimo 68.\nQuere mudar o axuste de liña a 68 caracteres agora? warning=Aviso signIconClicked=Modificou manualmente a sinatura de mensaxes. Polo tanto, mentres que compón esta mensaxe, (des)activar a sinatura non depende de (des)activar o cifrado. errorOwnKeyUnusable=O ID da chave «%S» configurado para a identidade actual non fornece unha chave OpenPGP válida.\n\nAsegúrese que ten unha chave OpenPGP non caducada e que os axustes da conta dirixen a esta chave.\nSe a chave non está caducada, comprobe que ten a confianza no propietario estabelecida como Completa ou Definitiva. msgCompose.cannotSaveDraft=Produciuse un erro gardando o borrador msgCompose.partiallyEncrypted.short=Teña tino co filtrado de información sensitiva - correo parcialmente cifrado. # msgCompose.partiallyEncrypted.mimeMsg=The message you are replying to contained both unencrypted and encrypted parts. Some encrypted message parts are invisible to you.\n\nIf the sender was not able to decrypt the hidden message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nWe recommend that you don't reply to the message, but create a new message containing your answer. msgCompose.partiallyEncrypted.inlinePGP=A mensaxe á que vostede está respondendo contiña partes cifradas e sen cifrar. Se o remitente non foi quen de descifrar algunhas partes da mensaxe en orixe, pode que vostede estea filtrando información confidencial que o remitente non puido descifrar.\n\nConsidere eliminar todas as citas da súa resposta a este remitente. msgCompose.internalEncryptionError=Erro interno: desactivouse o cifrado prometido. msgCompose.internalError=Produciuse un erro interno msgCompose.toolbarTxt.signAndEncrypt=Esta mensaxe asinarase e cifrarase msgCompose.toolbarTxt.signOnly=Esta mensaxe asinarase msgCompose.toolbarTxt.encryptOnly=Esta mensaxe cifrarase msgCompose.toolbarTxt.noEncryption=Esta mensaxe non se asinará nin cifrará msgCompose.toolbarTxt.disabled=Desactivouse o Enigmail para a identidade seleccionada msgCompose.protectSubject.tooltip=Protexer o asunto da mensaxe msgCompose.noSubjectProtection.tooltip=Non protexer o asunto da mensaxe msgCompose.encryptedSubjectStub=Mensaxe cifrada msgCompose.protectSubject.dialogTitle=Activar a protección do axunto? # msgCompose.protectSubject.question=Regular encrypted emails contain the unredacted subject.\n\nWe have established a standard to hide the original subject in the encrypted message\nand replace it with a dummy text, such that the subject is only visible after the email is decrypted.\n\nDo you want to protect the subject in encrypted messages? msgCompose.protectSubject.yesButton=&Protexer o Asunto msgCompose.protectSubject.noButton=&Deixar o Asunto sen protexer msgCompose.detailsButton.label=Detalles... msgCompose.detailsButton.accessKey=D msgCompose.pepSendUnknown=Descoñecido msgCompose.pepSendUnsecure=Insegura msgCompose.pepSendSecure=Seguro msgCompose.pepSendTrusted=Segura e confiábel pep.alert.disabledForIdentity=p≡p está desactivado para a identidade actual. Active p≡p nas preferencias do Enigmail/p≡p. pep.alert.weakReply=Está a piques de reenviar ou responder a unha mensaxe segura como se fose insegura. Se continúa pódese filtrar información confidencial poñéndose vostede e o seu interlocutor en risco. Confirma que desexa continuar? # note: should end with double newline: sendAborted=Cancelouse o envío.\n\n # details: keyNotTrusted=A chave «%S» non é fiábel dabondo keyNotFound=Non foi posíbel atopar a chave «%S» keyRevoked=A chave «%S» revogouse keyExpired=A chave «%S» caducou statPGPMIME=PGP/MIME statSMIME=S/MIME statSigned=ASINADO statEncrypted=CIFRADO statPlain=SEN ASINAR e SEN CIFRAR offlineSave=Gardar %S mensaxe a %S no cartafol de mensaxes sen enviar? onlineSend=Enviar %S mensaxe a %S? encryptKeysNote=Nota: a mensaxe está cifrada co seguinte ID de usuario/a / Chaves: %S hiddenKey= signFailed=Produciuse un erro en Enigmail; fallou Cifrado/sinatura; enviar mensaxe sen cifrar? msgCompose.button.sendUnencrypted=Enviar mensaxe sen cifrar recipientsSelectionHdr=Seleccionar destinatarios para o cifrado configureNow=Aínda non configurou a seguridade Enigmail para a identidade seleccionada. Quere facer isto agora? # encryption/signing status and associated reasons: encryptMessageAuto=Cifrar mensaxe (automaticamente) encryptMessageNorm=Cifrar mensaxe signMessageAuto=Asinar mensaxe (automaticamente) signMessageNorm=Asinar mensaxe encryptOff=Cifrado: DESACTIVADO encryptOnWithReason=Cifrado: ACTIVADO (%S) encryptOffWithReason=Cifrado: DESACTIVADO (%S) encryptOn=Cifrado: ACTIVADO signOn=Asinado: ACTIVADO signOff=Asinado: DESACTIVADO signOnWithReason=Asinado: ACTIVADO (%S) signOffWithReason=Asinado: DESACTIVADO (%S) reasonEnabledByDefault=activado de forma predeterminada reasonManuallyForced=forzado manualmente reasonByRecipientRules=forzado polas regras do destinatario reasonByAutoEncryption=forzado polo cifrado automático reasonByConflict=debido a un conflito nas regras do destinatario reasonByEncryptionMode=debido ao modo de cifrado # should not be used anymore: encryptYes=Vaise cifrar a mensaxe encryptNo=Non se vai a cifrar a mensaxe # should not be used anymore: signYes=Vaise asinar a mensaxe signNo=Non se vai asinar a mensaxe # PGP/MIME status: pgpmimeNormal=Protocolo: PGP/MIME inlinePGPNormal=Protocolo: Inline PGP smimeNormal=Protocolo: S/MIME pgpmimeAuto=Protocolo: PGP/MIME (automaticamente) inlinePGPAuto=Protocolo: Inline PGP (automaticamente) smimeAuto=Protocolo: S/MIME (automático) # should not be used anymore pgpmimeYes=Usarase PGP/MIME pgpmimeNo=Usarase o Inline PGP # Attach own key status (tooltip strings): attachOwnKeyNo=Non se anexará a súa chave attachOwnKeyYes=Anexarase a súa chave attachOwnKeyDisabled=Non pode anexar a súa chave. Ten que seleccionar unha chave na\nsección de OpenPGP nos axustes da conta para activar esta función. rulesConflict=Detectáronse conflitos nas regras por destinatario%S\n\nEnviar a mensaxe con esta configuración? msgCompose.button.configure=&Configurar msgCompose.button.send=Enviar mensaxe msgCompose.button.save=Gardar mensaxe # Strings in enigmailMsgHdrViewOverlay.js keyNeeded=Necesítase a chave pública %S para verificar a sinatura keyUsed=A chave pública %S usouse para comprobar a sinatura clickDecrypt=; premer botón Descifrar clickDecryptRetry=; premer botón Descifrar para tentar de novo clickDetailsButton=; premer no botón 'Detalles' para ver máis información clickImportButton=; prema no botón «Importar chave» para descargar a chave keyTypeUnsupported=; o tipo de chave non é compatíbel coa versión de GnuPG msgPart=Parte da mensaxe %S msgSigned=asinado msgSignedUnkownKey=asinado cunha chave descoñecida msgEncrypted=cifrado msgSignedAndEnc=asinado e cifrado unverifiedSig=Sinatura sen verificar incompleteDecrypt=Descifrado incompleto needKey=Erro - precísase a chave privada para descifrar a mensaxe failedDecrypt=Erro - fallou o descifrado badPhrase=Erro - mala frase secreta failedDecryptVerify=Erro - fallou o descifrado/verificación mdcError=Erro - a mensaxe non tiña protección de integridade viewInfo=; Ver > Información de seguridade da mensaxe para ver os detalles decryptedMsg=Mensaxe descifrada decryptedMsgWithFormatError=Mensaxe descifrada (restabeleceuse o formato de correo PGP, roto probabelmente por un servidor Exchange antigo, así que o resultado pode non ser perfecto para a súa lectura) usedAlgorithms=Algoritmos usados: %1$S e %2$S pepStatusInfo.text=Estado da mensaxe p≡p. pepStatusInfo.title.m3=Sendo atacado pepStatusInfo.info.m3=Esta mensaxe non é segura e foi alterada. pepStatusInfo.title.m1=Non fiábel pepStatusInfo.info.m1=Esta mensaxe ten un interlocutor marcado previamente como non fiábel pepStatusInfo.title.r0=Descoñecido pepStatusInfo.info.r0=Esta mensaxe non contén información dabondo para determinala como segura. pepStatusInfo.title.r1=Non é posíbel descifrar pepStatusInfo.info.r1=Non é posíbel descifrar esta mensaxe porque a chave non está dispoñíbel. pepStatusInfo.title.r2=Non é posíbel descifrala pepStatusInfo.info.r2=Non é posíbel descifrar a mensaxe porque a chave non está dispoñíbel. pepStatusInfo.title.r3=Inseguro pepStatusInfo.info.r3=Esta mensaxe non é segura. pepStatusInfo.title.r4=Insegura para alguén pepStatusInfo.info.r4=Esta mensaxe é insegura para algúns dos participantes. pepStatusInfo.title.r5=Seguranza non fiábel pepStatusInfo.info.r5=Esta mensaxe ten unha protección non fiábel. pepStatusInfo.title.r6=Seguro... pepStatusInfo.info.r6=Esta mensaxe é segura, aínda así, vostede precisa verificar a identidade do interlocutor. pepStatusInfo.title.r7=Segura e confiábel pepStatusInfo.info.r7=Esta mensaxe é segura e fiábel. pepStatusInfo.color.green=Verde pepStatusInfo.color.yellow=Amarelo pepStatusInfo.color.red=Vermello pepRevokeTrust.question=Desexa cancelar a confianza en %S? pepRevokeMistrust.question=Desexa volver confiar na chave de %S? pepRevokeTrust.doRevoke=Cancelar confianza wksConfirmationReq=Petición de confirmación do directorio do servidor de chaves wksConfirmationReq.message=Esta mensaxe enviouna o seu provedor de correo electrónico para confirmar a dispoñibilidade da súa chave pública OpenPGP\nno seu directorio do servidor de chaves.\nProporcionando a súa chave pública axudará a outros a descubrir a súa chave e deste xeito seren quen de cifrar\nmensaxes para vostede.\n\nSe desexa mostrar a súa chave no directorio do servidor de chaves\nagora, prema no botón «Confirmar petición» na barra do estado.\nNoutro caso, ignore esta mensaxe. wksConfirmationReq.button.label=Confirmar petición autocryptSetupReq=Realizar configuración do Autocrypt autocryptSetupReq.button.label=Iniciar configuración autocryptSetupReq.setupMsg.desc=Esta mensaxe contén toda a información precisa para transferir os axustes do Autocrypt xunto coa súa chave secreta desde o dispositivo orixinal. autocryptSetupReq.setupMsg.backup=Pode conservar esta mensaxe e usala como copia de seguranza da súa chave secreta. Se desexa facelo, debería escribir o contrasinal e gardalo de forma segura. autocryptSetupReq.message.import=Para importar os axustes e chave(s) ao Enigmail. Prema no botón «Iniciar configuración» na barra de estado. autocryptSetupReq.message.sent=Prema na mensaxe do seu dispositivo novo e siga as instrucións para importar os axustes. # strings in pref-enigmail.js oldGpgVersion20=Produciuse un fallo iniciando o Enigmail.\n\nEstá usando a versión %1$S do GnuPG que xa non compatíbel. O Enigmail require a versión %2$S ou unha máis recente. Anove a instalación do GnuPG ou o Enigmail non funcionará. locateGpg=Localizar o programa GnuPG invalidGpgPath=GnuPG non se pode executar coa ruta especificada. Enigmail ficará desactivado até que cambie a ruta de GnuPG de novo ou reinicie o aplicativo. warningsAreReset=Restablecéronse todos os avisos. prefs.gpgFound=Atopouse GnuPG en %S prefs.gpgNotFound=Non se atopou o GnuPG prefs.warnAskNever=Aviso: activar esta opción causará que non se cifre ningún correo se falta algunha das chaves dos/das destinatarios/as -- Enigmail non informará disto cando suceda! prefs.warnIdleTimeForUnknownAgent=Non é posíbel conectar co gpg-agent. Quizais o seu sistema usa unha ferramenta especializada para manexar frases secretas (como gnome-keyring ou seahorse-agent, KDE wallet manager...). Desafortunadamente Enigmail non pode controlar o tempo límite das frases secretas na ferramenta que está usando. Polo tanto a configuración do tempo límite respectivo en Enigmail é ignorada. prefEnigmail.oneKeyserverOnly=Erro - so se pode especificar un servidor de chaves para a descarga automática das chaves OpenPGP que falten. # Strings used in core.jsm # (said file also re-uses some strings from above) enterAdminPin=Introduza o PIN de administración da súa SmartCard enterCardPin=Introduza o PIN da súa SmartCard notInit=Erro - non se iniciou o servizo Enigmail badCommand=Erro - fallou o comando de cifrado cmdLine=liña de comando e saída: notRequired=Erro - non se precisa cifrado notComplete=Erro - non se completou a xeración da chave invalidEmail=Erro - enderezo(s) de correo non válido(s) noPassphrase=Erro - non se proporcionou a frase secreta noPGPblock=Erro - non se atopou un bloque de datos armado OpenPGP válido unverifiedReply=Probabelmente modificouse a parte sangrada da mensaxe (resposta) keyInMessageBody=Hai unha chave no corpo da mensaxe. Prema «Importar chave» para importala sigMismatch=Erro - A sinatura non coincide cantImport=Produciuse un erro importando a chave pública\n\n doImportOne=Desexa importar %1$S (%2$S)? doImportMultiple=Desexa importar as seguintes chaves?\n\n%S previewFailed=Non é posíbel ler o ficheiro da chave pública. # Strings used in errorHandling.jsm sc.wrongCardAvailable=Non se pode utilizar a SmartCard %S atopada no seu lector para procesar a mensaxe.\nInsira a súa SmartCard %S e repita a operación. sc.insertCard=A operación require o uso da súa SmartCard %S.\nInsira a SmartCard requerida e repita a operación. sc.removeCard=A operación non require que teña a súa SmartCard no lector.\nRetire a súa SmartCard e repita a operación. sc.noCardAvailable=Non se puido atopar ningunha SmartCard no seu lector\nInsira de novo a SmartCard e repita a operación. sc.noReaderAvailable=Non se puido acceder ao lector de tarxetas SmartCard \nConecte o lector de tarxetas, insira a SmartCard, e repita a operación. keyError.keySpecNotFound=O enderezo de correo-e «%S» non obtivo ningunha coincidencia cunha chave do anel de chaves. keyError.keyIdNotFound=O ID da chave configurada «%S» non se atopa no anel de chaves. keyError.resolutionAction=Seleccione unha chave válida na sección OpenPGP dos axustes da conta missingPassphrase=Falta a frase secreta errorHandling.gpgAgentInvalid=O sistema está executando unha versión do gpg-agent que non é axeitada para a súa versión de GnuPG. errorHandling.gpgAgentError=GnuPG informou dun erro na comunicación co gpg-agent (un compoñente do GnuPG). errorHandling.dirmngrError=GnuPG informou dun erro na comunicación co dirmngr (un compoñente do GnuPG). errorHandling.pinentryError=GnuPG non puido consultar a frase secreta por medio de pinentry, errorHandling.readFaq=Este é un erro de configuración do sistema que impide que o Enigmail funcione correctamente. Non se pode arranxar automaticamente.\n\nRecomendámoslle moito que consulte o noso sitio de asistencia en https://enigmail.net/faq. gpgNotFound=Non se puido localizar o programa GnuPG '%S'.\nAsegúrese de que a ruta ao executábel GnuPG é correcto nas Preferencias de Enigmail. gpgNotInPath=Non se puido localizar o executábel de GnuPG na ruta (PATH).\nAsegúrese de que a ruta ao executábel GnuPG é correcto nas Preferencias de Enigmail. enigmailNotAvailable=O servizo principal do Enigmail non está dispoñíbel prefGood=Sinatura correcta de %S prefBad=Sinatura INCORRECTA de %S failCancel=Erro - A descarga da chave foi cancelada polo usuario failNoServer=Erro- Non se especificou un servidor do que descargar as chaves failNoID=Erro - Non se especificou un ID de chave para descargar failKeyExtract=Erro - fallou o comando de extración de chave notFirstBlock=Erro - o primeiro bloque OpenPGP non é un bloque de chave pública importKeyConfirm=Importar chave(s) pública(s) integradas na mensaxe? failKeyImport=Erro - fallou a importación de chaves fileWriteFailed=Houbo un erro ao escribir ao ficheiro %S importKey=Importar chave pública %S desde o servidor de chaves. uploadKey=Enviar chave pública %S ao servidor de chaves: keyId=ID de chave keyAndSigDate=ID de chave: 0x%S / Asinado en: %S keyFpr=Pegada dixital da chave: %S noEmailProvided=Non proporcionou un enderezo de correo! keyAlreadySigned=A chave xa está asinada, non pode asinala dúas veces. ##################################################################### # Strings used in enigmailKeySelection.js ##################################################################### selKeyExpired=caducada %S createdHeader=Creada atLeastOneKey=Non se seleccionou ningunha chave! Ten que seleccionar polo menos unha chave para aceptar este diálogo fewerKeysThanRecipients=Seleccionou un número máis pequeno de chaves que de remitentes. Está seguro/a de que a lista de chaves para cifrar está completa? userSel.button.goBack=Seleccionar máis chaves userSel.secretKeySel.title=Seleccionar unha chave privada OpenPGP para asinar as mensaxes userSel.problemNoKey=Ningunha chave válida userSel.problemMultipleKeys=Múltiples chaves # should be same as thunderbird ENTITY sendLaterCmd.label: sendLaterCmd.label=Enviar máis tarde # Strings used in enigmailAttachmentDialog.js pgpMimeNote=NOTA: PGP/MIME non é compatíbel con todos os clientes de correo electrónico. Se vostede non está seguro, seleccione a opción %S. first=primeiro second=segundo # Strings used in am-enigprefs.js / enigmailEditIdentity.js encryptKeyHeader=Seleccionar chave OpenPGP para o cifrado identityName=Identidade: %S switchPepMode=Está usando actualmente o modo «p≡p Junior» do Enigmail.\n\nActivando o OpenPGP ou S/MIME para unha conta, está desactivando p≡p e usando o modo normal do Enigmail sen p≡p. enableEnigmail=&Desactivar p≡p # Strings used in enigmailSingleRcptSettings.js noEncryption=Activou o cifrado, mais non seleccionou unha chave. Para cifrar correos enviados a %S, precisa especificar unha ou varias chaves válidas da súa lista de chaves. Quere desactivar o cifrado para %S? noKeyToUse=(ningún - sen cifrado) noEmptyRule=A regra non pode estar baleira! Defina un enderezo de correo no campo da regra. invalidAddress=Os enderezos de correo que introduciu non son válidos. Non debería definir os nomes dos/as destinatarios/as, defina só os enderezos de correo. P.e.:\nInválido: Un nome\nVálido: un.nome@enderezo.net noCurlyBrackets=As chaves {} teñen un significado especial e non deberían usarse nun enderezo de correo electrónico. Se desexa modificar o comportamento desta regra, use a opción «Aplicar regra se o destinatario...» .\nHai máis información dispoñíbel no botón Axuda. # Strings used in enigmailRulesEditor.js never=Nunca always=Sempre possible=Posíbel deleteRule=Está seguro de que quere eliminar a regra? nextRcpt=(Seguinte destinatario) negateRule=Non addKeyToRule=Engadir unha chave %S (%S) á regra por-receptor # Strings used in enigmailSearchKey.js needOnline=A función seleccionada non está dispoñíbel en modo sen conexión. Conéctese e ténteo de novo. protocolNotSupported=O protocolo '%S://' que seleccionou non está soportado para a descarga de chaves OpenPGP. gpgkeysDisabled=Activar a opción 'extensions.enigmail.useGpgKeysTool' podería axudar. noKeyserverConn=Non foi posíbel conectar co servidor de chaves en %S. keyDownloadFailed=Houbo un erro ao descargar a chave do servidor. A mensaxe de estado é:\n%S internalError=Produciuse un erro interno. Non se puido descargar ou importar as chaves. noKeyFound=Sentímolo, non se puido atopar ningunha chave que coincida cos criterios de busqueda especificados.\nOs ID's de chave deberían ter como prefixo \\"0x\\" (e.g. 0xABCDEF12). keyDownload.keyUnavailable=Sentímolo pero a chave co ID %S non está dispoñíbel no servidor de chaves. Probabelmente, o propietario da chave non enviou a súa ao servidor.\n\nPídalle ao remitente da mensaxe que lle envíe a súa chave por correo electrónico. # gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. gpgKeysFailed=Produciuse un erro ao buscar ou descargar a chave do servidor: non se puido executar gpgkeys_%S. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Fallou ao definir a confianza no propietario # Strings in enigmailSignKeyDlg.js signKeyFailed=Fallou ao asinar a chave alreadySigned.label=Nota: a chave %S xa está asinada coa chave privada seleccionada. alreadySignedexportable.label=Nota: a chave %S xa está asinada exportábel coa chave privada seleccionada. Unha sinatura local non ten sentido. partlySigned.label=Nota: algunhas ID de chave de usuario %S xa están asinadas coa chave secreta seleccionada. noTrustedOwnKeys=Non se atopou ningunha chave axeitada para asinar. Precisa, cando menos, unha chave privada plenamente confiábel para asinar as chaves. # Strings in enigmailKeyManager.js keyMan.loadingKeys=Cargando chaves, espere ... keyValid.unknown=descoñecido keyValid.invalid=incorrecto keyValid.disabled=desactivado keyValid.revoked=revogado keyValid.expired=caducado keyValid.noSubkey=subchave non válida keyTrust.untrusted=non fiábel keyTrust.marginal=marxinal keyTrust.full=fiábel keyTrust.ultimate=definitiva keyTrust.group=(groupo) keyType.public=pub keyType.publicAndSec=pub/sec keyMan.enableKey=Activar chave keyMan.disableKey=Desactivar chave userAtt.photo=Usar atributo (imaxe JPEG) asciiArmorFile=Ficheiros con armadura ASCII (*.asc) importKeyFile=Importar o ficheiro coa chave OpenPGP gnupgFile=Ficheiros GnuPG createKeyOK=Xerouse a súa chave saveRevokeCertAs=Crear e gardar certificado de revogación revokeCertOK=O certificado de revogación creouse correctamente. Pode usalo para invalidar a súa chave pública, por exemplo, no caso de que a perdese. revokeCertFailed=Non se puido crear o certificado de revogación. addUidOK=O ID do usuario foi engadido correctamente addUidFailed=Produciuse un fallou ao engadir o ID de usuario noKeySelected=Debe seleccionar alomenos unha chave para realizar a operación selecionada exportToFile=Exportar chave pública a un ficheiro exportKeypairToFile=Exportar as chaves secreta e pública a un ficheiro exportSecretKey=Quere incluír a chave privada no ficheiro de chave OpenPGP que vai a gardar? saveKeysOK=O ficheiro de chave foi gardado correctamente saveKeysFailed=Produciuse un fallo ao gardar as chaves importKeysFailed=Produciuse un fallo ao importar as chaves enableKeyFailed=Produciuse un erro ao activar/desactivar as chaves specificPubKeyFilename=%S (0x%S) pub specificPubSecKeyFilename=%1$S (0x%2$S) pub-sec defaultPubKeyFilename=Chaves-públicas-exportadas defaultPubSecKeyFilename=Chaves-públicas-e-privadas-exportadas noSecretKeys=Non se atopou ningunha chave privada.\n\nQuere xerar a súa propia chave agora? sendKeysOk=As chaves foron enviadas correctamente sendKeysFailed=Produciuse un fallo ao enviar as chaves receiveKeysOk=As chaves foron actualizadas correctamente receiveKeysFailed=Produciuse un erro ao descargar as chaves importFromClip=Quere importar algunha(s) chaves do portarretallos? importFromUrl=Descargue a chave pública nesta URL: copyToClipbrdFailed=Non foi posíbel copiar a(s) chave(s) seleccionada(s) ao portarretallos. copyToClipbrdOK=Chave(s) copiada(s) ao portarretallos deleteSecretKey=AVISO: Vai eliminar unha chave privada!\nSe elimina a súa chave privada, non poderá descifrar ningunha mensaxe cifrada para esa chave, e tampouco poderá revogar a súa chave.\n\nEstá seguro de que quere eliminar AMBAS as chaves, a chave privada e a pública '%S'? deleteMix=AVISO: vai eliminar chaves privadas!\nSe elimina a súa chave privada non poderá descifrar calquera mensaxe cifrado para esa chave.\n\nEstá seguro de que quere eliminar AMBAS as chaves, as chaves privadas e públicas seleccionadas? deletePubKey=Desexa eliminar a chave pública\n'%S'? deleteSelectedPubKey=Desexa eliminar as chaves públicas? deleteKeyFailed=Non foi posíbel eliminar a chave. revokeKeyQuestion=Vai a revogar a chave «%S»\n\nXa non lle será posíbel volver asinar con esta chave. Unha vez revogada, os demais non serán quen de cifrar con ela. Pode seguir a usar a chave para descifrar as mensaxes antigas.\n\nDesexa continuar?\n\n revokeKeyOk=A chave foi revogada. Se a súa chave está dispoñíbel nalgún servidor de chaves, é recomendábel que a suba de novo, para que outras persoas poidan ver a revogación. revokeKeyFailed=Non se puido revogar a chave. revokeKeyNotPresent=Vostede non ten ningunha chave (0x%S) que se axuste a este certificado de revogación.\n\nSe perdeu a chave, debe importala (p.e.: dun servidor de chaves) antes do certificado de revogación. revokeKeyAlreadyRevoked=A chave 0x%S xa foi revogada. refreshAllQuestion=Non seleccionou ningunha chave. Desexa recargar TODAS as chaves? refreshKeyServiceOn.warn=Aviso: as súas chaves están actualizaÅ„dose en segundo plano con tanta seguranza como é\nposíbel. Actualizar todas as chaves dunha vez descubrirá innecesariamente información sobre vostede.\nConfirma que desexa facelo? refreshKey.warn=Aviso: dependendo do número de chaves e da velocidade da conexión, a recarga de todas as chaves pode ser un proceso bastante lento! downloadContactsKeys.warn=Aviso: dependendo do número de contactos e da velocidade da conexión, a descarga de todas as chaves pode durar unha boa miga. downloadContactsKeys.importFrom=Desexa importar contactos da axenda de enderezos «%S»? keyMan.button.exportSecKey=Exportar chaves privadas keyMan.button.exportPubKey=Exportar só chaves &públicas keyMan.button.import=&Importar keyMan.button.refreshAll=&Recargar todas as chaves keyMan.button.revokeKey=&Revogar chave keyMan.button.skip=&Saltar a chave keylist.noOtherUids=Non ten outras identidades keylist.hasOtherUids=Tamén coñecido como keylist.noPhotos=Non hai fotografías dispoñíbeis keylist.hasPhotos=Fotografías keyMan.addphoto.filepicker.title=Seleccione unha foto para engadir keyMan.addphoto.warnLargeFile=O ficheiro seleccionado é maior de 25kB.\nNon é recomendábel engadir ficheiros grandes porque a chave resulta longa de máis. keyMan.addphoto.noJpegFile=O ficheiro seleccionado non semella un ficheiro JPEG. Seleccione outro diferente. keyMan.addphoto.failed=Non foi posíbel engadir a foto. noWksIdentity=A chave %S non ten unha identidade no servizo web de chaves. keyman.addBlacklistKey.msg=Desexa realmente que o p≡p deixe de usar a chave «%1$S (%2$S)» para as mensaxes cifradas? keyman.removeBlacklistKey.msg=Desexa permitir que o p≡p use a chave «%1$S (%2$S)» nas futuras mensaxes? keyman.addBlacklistKey.button=Engadir a chave á &Lista negra keyman.removeBlacklistKey.button=&Eliminar a chave da lista negra # Strings in enigmailManageUidDlg.xul changePrimUidFailed=Produciuse un erro cambiando o ID de usuario principal changePrimUidOK=O ID de usuario principal foi cambiado correctamente revokeUidFailed=Produciuse un erro revogando o ID de usuario %S revokeUidOK=O ID de usuario %S revogouse correctamente. Se a súa chave está dispoñíbel nalgún servidor de chaves, é recomendábel que a suba de novo, para que outras persoas poidan ver a revogación. revokeUidQuestion=Está seguro de que quere revogar o ID de usuario %S? # Strings in enigmailKeyImportInfo.xul importInfoTitle=A chave importouse correctamente importInfoBits=Bits importInfoCreated=Creado importInfoFpr=Pegada dixital importInfoDetails=(Detalles) importInfoNoKeys=Non hai chaves importadas # Strings in enigmailKeyDetailsDlg.xul keyTypePublic=chave pública keyTypePrimary=chave primaria keyTypeSubkey=subchave keyTypePair=par de chaves keyExpiryNever=nunca keyAlgorithm_1=RSA keyAlgorithm_2=RSA keyAlgorithm_3=RSA keyAlgorithm_16=ELG keyAlgorithm_17=DSA keyAlgorithm_18=ECC keyAlgorithm_19=ECDSA keyAlgorithm_20=ELG keyAlgorithm_22=EDDSA keyUsageEncrypt=Cifrar keyUsageSign=Asinar keyUsageCertify=Certificar keyUsageAuthentication=Autenticación keyDoesNotExpire=A chave non caduca # Strings in enigmailGenCardKey.xul keygen.started=Agarde mentres se xera a chave ... keygen.completed=Chave xerada. O novo ID da chave é: 0x%S keygen.keyBackup=Fíxose unha copia de seguridade da chave a %S keygen.passRequired=Especifique unha frase secreta se quere crear unha copia de seguranza da súa chave fóra da súa SmartCard. # Strings in enigmailSetCardPin.xul cardPin.processFailed=Produciuse un erro ao cambiar o PIN # Strings in enigRetrieveProgres.xul keyserverProgress.refreshing=Recargando chaves, agarde ... keyserverProgress.uploading=Subindo chaves, agarde ... keyserverProgress.wksUploadFailed=Non foi posíbel enviar a súa chave ao servidor de chaves keyserverProgress.wksUploadCompleted=A súa chave pública enviouse correctamente ao provedor. Recibirá un correo electrónico para confirmar que vostede fixo o envío. keyserverTitle.refreshing=Recargar chaves keyserverTitle.uploading=Subir chave # Strings in enigmailSetupWizard passphrase.min8keys=A frase secreta debería conter polo menos 8 caracteres! setupWizard.reallyCancel=Está seguro que quere pechar o Asistente de instalación de Enigmail? setupWizard.invalidGpg=O ficheiro especificado non é un executábel de GnuPG. Indique outro ficheiro. setupWizard.specifyFile=Debe especificar polo menos un ficheiro coa chave pública para continuar. setupWizard.installFailed=Parece que a instalación non se realizou correctamente. Tente facela de novo ou instale GnuPG manualmente e localíceo usando o botón Explorar. setupWizard.downloadForbidden=Pola súa seguranza non descargaremos o GnuPG. Visite https://gnupg.org/ con fin de descargalo. setupWizard.downloadImpossible=Non é posíbel descargar o GnuPG agora mesmo. Ténteo máis tarde ou visite https://gnupg.org/ con fin de descargalo. setupWizard.hashSumError=O asistente non puido verificar a integridade do ficheiro descargado. Pode que estea roto ou manipulado. Desexa continuar a instalación? setupWizard.importSettingsFile=Especificar a copia de seguridade que cargar setupWizard.invalidSettingsFile=O ficheiro indicado non é unha copia de seguridade dos axustes de Enigmail correcta. setupWizard.gpgConfExists=O ficheiro config de GnuPG xa existe. Desexa sobrescribilo co ficheiro da instalación antiga? setupWizard.noGpgHomeDir=Semella que vostede configurou %S para usalo no GnuPG. Con todo, este non é un cartafol. Vostede non pode utilizalo. setupWizard.unmachtedIds=Non foi posíbel emparellar as seguintes identidades da súa vella instalación:\n%S\nOmitíronse os axustes destas identidades. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=Produciuse un erro mentres se tentaba descargar GnuPG. Comprobe o rexistro da consola para máis información. installGnuPG.installFailed=Produciuse un erro mentres se instalaba GnuPG. Comprobe o rexistro da consola para máis información. # Strings in enigmailAddUidDlg.xul addUidDlg.nameOrEmailError=Debe que indicar un nome e un enderezo de correo addUidDlg.nameMinLengthError=O nome debe ter polo menos 5 caracteres addUidDlg.invalidEmailError=Debe especificar un enderezo de correo válido # Strings in enigmailCardDetails.js Carddetails.NoASCII=A Smartcards OpenPGP unicamente aceptan caracteres ASCII no nome # network error types errorType.SecurityCertificate=O certificado de seguranza presentado polo servizo web non é válido. errorType.SecurityProtocol=O protocolo de seguranza usado polo servizo web é descoñecido. errorType.Network=Produciuse un erro de rede. # filter stuff filter.folderRequired=Debe seleccionar un cartafol de destino. filter.decryptMove.label=Descifrar permanentemente (Enigmail) filter.decryptCopy.label=Crear unha copia descifrada (Enigmail) filter.decryptMove.warnExperimental=Aviso: a acción do filtro «Descifrar permanentemente» pode provocar a destrución de mensaxes.\n\nRecomendámoslle que probe primeiro o filtro «Crear copia descifrada», comprobe o resultado con coidado e use este filtro unicamente se está satisfeito co resultado. filter.tempPepFilterDesc=Filtro temporal para gardar a mensaxe enviada sen cifrar filter.term.pgpencrypted.label=OpenPGP cifrado # filter.encrypt.label=Encrypt to key (Enigmail) filter.keyRequired=Debe seleccionar unha chave de destinatario. filter.keyNotFound=Non foi posíbel atopar unha chave de cifrado para «%S». # filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for "%S" you will no longer be able to read the emails. # strings in enigmailConvert.jsm converter.decryptBody.failed=Non foi posíbel descifrar a mensaxe\n«%S».\nDesexa tentalo cunha frase secreta diferente ou prefire saltar a mensaxe? converter.decryptAtt.failed=Non foi posíbel descifrar o anexo «%1$S»\nda mensaxe co asunto\n«%2$S».\nDesexa tentalo de novo cunha frase de paso distinta ou prefire saltar a mensaxe? saveLogFile.title=Gardar o ficheiro do rexistro # strings in gpg.jsm unknownSigningAlg=Algoritmo de asinado descoñecido (ID: %S) unknownHashAlg=Hash de cifrado descoñecido (ID: %S) # strings in keyRing.jsm keyring.photo=Imaxe keyRing.pubKeyRevoked=A chave %1$S (ID da chave %2$S) revogouse. keyRing.pubKeyExpired=A chave %1$S (ID da chave %2$S) caducou. keyRing.pubKeyNotForSigning=A chave %1$S (ID da chave %2$S) non se pode usar para asinar. keyRing.pubKeyNotForEncryption=A chave %1$S (ID da chave %2$S) non se pode usar para cifrar. keyRing.keyDisabled=A chave %1$S (ID da chave %2$S) está desactivada e non se pode usar. keyRing.keyNotTrusted=A chave %1$S (ID da chave %2$S) non ten suficiente nivel de confianza. Estabeleza o nivel de confianza a «definitiva» para poder asinar con ela. keyRing.keyInvalid=A chave %1$S (ID da chave %2$S) non é válida (p.e: non ten unha auto-sinatura). keyRing.signSubKeysRevoked=Todas as sub-chaves de asinado da chave %1$S (ID da chave %2$S) revogáronse. keyRing.signSubKeysExpired=Todas as sub-chaves de asinado da chave %1$S (ID da chave %2$S) caducaron. keyRing.signSubKeysUnusable=Todas as subchaves de asinado da chave %1$S (ID da chave %2$S) revogáronse, caducaron ou non son utilizábeis. keyRing.encSubKeysRevoked=Revogáronse todas as sub-chaves de cifrado da chave %1$S (ID da chave %2$S). keyRing.encSubKeysExpired=Caducaron todas as sub-chaves de cifrado da chave %1$S (ID da chave %2$S). keyRing.noSecretKey=Non parece ter a chave secreta de %1$S (ID da chave %2$S) no anel de chaves. Non pode usar a chave para asinar. keyRing.encSubKeysUnusable=Todas as sub-chaves de cifrado da chave %1$S (ID da chave %2$S) revogáronse, caducaron ou non son utilizábeis. #strings in exportSettingsWizard.js cannotWriteToFile=Non é posíbel gardar no ficheiro «%S». Seleccione un ficheiro diferente. dataExportError=Produciuse un erro na exportación dos datos. enigmailSettings=Axustes do Enigmail defaultBackupFileName=Exportar-export. specifyExportFile=Especificar o nome do ficheiro para exportar homedirParamNotSUpported=Os parámetros adicionais que configuran a ruta, tales como --homedir e --keyring non se aceptan para exportar/restabelecer os seus axustes. Use métodos alternativos como axustar a variábel de contorno GNUPGHOME. #strings in expiry.jsm expiry.keyExpiresSoon=A súa chave %1$S caducará en menos de %2$S days.\n\nRecomendámoslle crear unha nova parella de chaves e configurar as correspondentes contas para usar esta nova chave. expiry.keysExpireSoon=As seguintes chaves caducarán en menos de %1$S días:\n %2$S\nRecomendámoslle que cree chaves novas e configure as súas contas para usalas. expiry.keyMissingOwnerTrust=A súa chave secreta %S perdeu a confianza.\n%S.\nRecomendámoslle que estabeleza «Vostede confía nos certificados» como Definitiva nas propiedades da chave. expiry.keysMissingOwnerTrust=As seguintes chaves secretas súas perderon a confianza.\n%S.\nRecomendámoslle que estabeleza «Vostede confía nos certificados» como Definitiva nas propiedades da chave. expiry.OpenKeyManager=Abrir a xestión de chaves do Enigmail expiry.OpenKeyProperties=Abrir propiedades da chave #strings in pEpDecrypt.jsm pEpDecrypt.cannotDecrypt=Esta é unha mensaxe cifrada. Desafortunadamente non ten unha chave privada para descifrar a mensaxe. #strings in gpgAgent.jsm gpghomedir.notexists=O directorio «%S» coas as súas chaves OpenPGP non existe e non é posíbel crealo. gpghomedir.notwritable=O directorio «%S» coas as súas chaves OpenPGP non é escribíbel. gpghomedir.notdirectory=O cartafol «%S» que contén as súas chaves OpenPGP é un ficheiro no canto dun cartafol. gpghomedir.notusable=Modifique os permisos do cartafol ou cambie a localización do seu cartafol «home» do GnuPG. Noutro caso o GnuPG non poderá traballar correctamente. #strings in pepTrustWords.js pepTrustWords.cannotVerifyOwnId=Non foi posíbel verificar as palabras de control do p≡p da súa conta. pepTrustWords.cannotFindKey=Non foi posíbel atopar a chave de %S. pepTrustWords.cannotStoreChange=Non foi posíbel cambiar a confianza de %S. pepTrustWords.generalFailure=Non foi posíbel obter as palabras de control para %S. pepTrustWords.partnerFingerprint=Pegada dixital de %S: #strings in mimeWkdHandler.jsm wkdMessage.body.req=O seu provedor de correo electrónico procesou a petición para enviar a chave pública ao directorio do servidor de chaves do OpenPGP.\n\nPrema no botón de confirmación na cabeceira do Enigmail para completar a publicación da súa chave. wkdMessage.body.process=Este é un correo electrónico relacionado co procesamento automático para enviar a súa chave pública ao directorio do servidor de chaves do OpenPGP.\n\nNon precisa realizar ningunha acción. #strings in pepHandshake.js pepPrivacyStatus.RatingBrokenSuggestion=Ou ben vostede ou o remitente deberían reenviar a mensaxe. pepPrivacyStatus.RatingHaveNoKeySuggestionOutgoing=Se escribiu esta mensaxe, a súa chave non está dispoñíbel. pepPrivacyStatus.RatingMistrustSuggestion=Restabeleza a conexión co seu interlocutor e tente realizar outra negociación de enlace ou «handshake». pepPrivacyStatus.RatingReliableSuggestion=Complete a negociación de enlace ou «handshake» co seu interlocutor intercambiando palabras de control en persoa ou por teléfono. Unha negociación de enlace só se precisa facer unha vez por interlocutor e proporcionará unha comunicación segura e fiábel. pepPrivacyStatus.RatingTrustedSuggestion=Non precisa facer nada! pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Sexa consciente de que esta mensaxe pode non ser segura. pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Engada a información necesaria. pepPrivacyStatus.RatingUnderAttackSuggestion=Por separado verifique o contido desta mensaxe co interlocutor. pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Comprobe que o estado da privacidade de cada interlocutor da lista é cando menos seguro. pepPrivacyStatus.RatingUnencryptedSuggestion=Pídalle ao interlocutor que use unha solución de cifrado ou instale p≡p. pepPrivacyStatus.RatingUnreliableSuggestion=Esta mensaxe non ten un cifrado ou sinatura fiábeis. Pídalle ao seu interlocutor que actualice a súa solución de cifrado ou instale p≡p. pepPrivacyStatus.RatingBrokenExplanation=Esta mensaxe ten un cifrado ou formatado rotos. pepPrivacyStatus.RatingHaveNoKeyExplanation=Esta mensaxe non se pode descifrar porque a chave non está dispoñíbel. pepPrivacyStatus.RatingMistrustExplanation=Esta mensaxe ten un interlocutor marcado previamente como non fiábel. pepPrivacyStatus.RatingReliableExplanation=Esta mensaxe é segura pero aínda así precisa verificar a identidade do interlocutor. pepPrivacyStatus.RatingTrustedExplanation=Esta mensaxe é segura e confiábel. pepPrivacyStatus.RatingUndefinedExplanation=Esta mensaxe non contén información dabondo para determinala como segura. pepPrivacyStatus.RatingUnderAttackExplanation=Esta mensaxe non é segura e foi alterada. pepPrivacyStatus.RatingUnencryptedExplanation=Esta mensaxe no é segura. pepPrivacyStatus.RatingUnencryptedForSomeExplanation=Esta mensaxe é insegura para algúns dos interlocutores. pepPrivacyStatus.RatingUnreliableExplanation=A protección desta mensaxe non é fiábel. pepPrivacyStatus.RatingBrokenText=Roto pepPrivacyStatus.RatingHaveNoKeyText=Non é posíbel descifrar pepPrivacyStatus.RatingMistrustText=Non fiábel pepPrivacyStatus.RatingReliableText=Seguro pepPrivacyStatus.RatingTrustedText=Segura e confiábel pepPrivacyStatus.RatingUndefinedText=Descoñecido pepPrivacyStatus.RatingUnderAttackText=Sendo atacado pepPrivacyStatus.RatingUnencryptedForSomeText=Insegura para algún pepPrivacyStatus.RatingUnencryptedText=Inseguro pepPrivacyStatus.RatingUnreliableText=Seguranza non fiábel handshakeDlg.button.initHandshake=Negociación de enlace... handshakeDlg.button.stopTrust=Deixar de confiar handshakeDlg.button.reTrust=Deixar de desconfiar handshakeDlg.label.outgoingMessage=Mensaxe saínte handshakeDlg.label.incomingMessage=Mensaxe entrante handshakeDlg.error.noPeers=Non é posíbel negociar un enlace ou «handshake» sen interlocutores. handshakeDlg.error.noProtection=Active a protección para usar a función de negociación de enlace ou «handshake». enigmail.acSetupPasswd.descEnterPasswd=Introduza o código de configuración que se mostra no outro dispositivo enigmail.acSetupPasswd.descCopyPasswd=Introduza o seguinte código de configuración no seu outro dispositivo para continuar cos axustes. #strings in autocrypt.jsm autocrypt.setupMsg.subject=Mensaxe de configuración do Autocrypt autocrypt.setupMsg.msgBody=Para configurar o seu novo dispositivo para o Autocrypt siga as instrucións que se deberían ver no dispositivo novo. autocrypt.setupMsg.fileTxt=Este é o ficheiro de configuración do Autocrypt usado para transferir os axustes e chaves entre clientes. Pode descifralo usando o código de configuración mostrado no seu dispositivo antigo e despois importar a chave ao seu anel de chaves. #strings in upgradeInfo.html upgradeInfo.doctitle=Que novidades hai no Enigmail v2.0? upgradeInfo.welcome1=Benvido/a á nova versión do Enigmail 2.0! upgradeInfo.welcome2=A versión contén unha morea de cambios e características novas. Tómese un minuto para coñecer as novidades: upgradeInfo.encSubject.title=Cifrando o asunto da mensaxe # upgradeInfo.encSubject.desc=We developed a new method that moves the email subject into the encrypted message, and replaces the visible subject with "Encrypted Message". Once such a message is decrypted, the original subject is replaced automatically. Hiding the subject is on by default; there is a preference to turn it off if you don't like it. (Note: this feature requires the message to be sent with PGP/MIME.) upgradeInfo.buttons.title=Cambiado o comportamento dos botóns de cifrar e de asinar upgradeInfo.buttons.desc=Os botóns de Cifrar e Asinar na xanela de composición de mensaxes agora funcionan para os protocolos OpenPGP e S/MIME. Se ambos os algoritmos son posíbeis, o Enigmail preferirá aquel para o que hai chaves dispoñíbeis. upgradeInfo.autocrypt.title=Compatibilidade para o Autocrypt upgradeInfo.autocrypt.desc=O Enigmail xa é compatíbel co Autocrypt, un novo estándar para distribuír chaves como parte das mensaxes enviadas. O Enigmail importa automaticamente estas chaves das mensaxes que cumpren coas normas do Autocrypt, deste xeito cada vez máis correos electrónicos poderán ser cifrados. upgradeInfo.pEp.title=Novo modo Junior do p≡p (Pretty Easy Privacy) upgradeInfo.pEp.desc=Enigmail xa dispón do Modo Junior p≡p. Con este propósito debe instalar manualmente o p≡p; isto cambiará en futuras versións. O Modo Junior p≡p permítelle usar o cifrado OpenPGP con tanta transparencia como é posíbel; vostede xa non precisa preocuparse da xestión e sincronización de chaves entre dispositivos. upgradeInfo.bottom.desc=Lea a nosa documentación para obter axuda no uso do Enigmail. pep.missingGnuPG=Para poder usar o Enigmail/p≡p é necesario o GnuPG. Como non foi posíbel atopalo, podemos descargalo e instalalo por vostede. #strings in enigmailAbout.html aboutEnigmail.tabName=Sobre Enigmail aboutEnigmail.title=Compatibilidade co OpenPGP proporcionada polo Enigmail aboutEnigmail.team=Enigmail é desenvolvido polo equipo do Enigmail: aboutEnigmail.projectLeader=Desenvolvedor principal: aboutEnigmail.usability=Facilidade de uso: aboutEnigmail.documentation=Documentación: aboutEnigmail.testing=Probando: aboutEnigmail.userSupport=Asistencia ao usuario: aboutEnigmail.localization=Localización: vexa a páxina de paquetes de idiomas do Enigmail aboutEnigmail.Credits=Créditos: aboutEnigmail.origAuthor=Autor orixinal do engadido Enigmail aboutEnigmail.icons=Iconas: aboutEnigmail.formerMembers=Antigos membros do equipo: aboutEnigmail.projectHosting=Aloxamento do proxecto: aboutEnigmail.licenseSupportTitle=Licenza e asistencia aboutEnigmail.license=O OpenPGP do Enigmail é software aberto e con licenza %S aboutEnigmail.support=Asistencia e descargas dispoñíbeis en www.enigmail.net. enigmail-2.0.8/lang/gl/help/000077500000000000000000000000001334302754500155675ustar00rootroot00000000000000enigmail-2.0.8/lang/gl/help/compose.html000066400000000000000000000103201334302754500201160ustar00rootroot00000000000000 Axuda de Enigmail: Composición de Mensaxe

Axuda de Enigmail

Usando Enigmail para compoñer mensaxes

  • Menú de Enigmail na ventá de Composición de correo
    • Asinar mensaxe: Activa/Desactiva o envío de correo asinado. O usuario ou usuaria son notificados se a sinatura falla.
    • Cifrar mensaxe: Activar/Desactiva o cifrado a todos os destinatarios ou destinatarias antes do envío. Notifícase en caso de que se produza un erro no cifrado.

      Se Mostrar selección cando sexa necesario está definido na pestana de Preferencias -> Selección de chaves, mostrarase unha listaxe de chaves se hai algún enderezo na lista de destinatarios/as da mensaxe para os/as que non ten chave pública.

      Se a opción de non mostrar nunca o diálogo de selección de chaves OpenPGP está activado na pestana Preferencias -> Selección de chaves, e hai enderezos na lista de destinatarios/as para os que non ten a chave pública, a mensaxe enviaras sen cifrar.

    • Usar PGP/MIME para esta mensaxe: Activa/Desactiva o uso de PGP/MIME para esta mensaxe.

      Se sabe que o(s) destinatario(s) ou destinataria(s) poden ler correo utilizando o formato PGP/MIME, debería utilizalo.

      Esta característica depende da configuración na pestana Preferencias -> PGP/MIME sendo a opción Permitir o uso de PGP/MIME ou Usar sempre PGP/MIME.

    • Opcións predeterminadas para a composición: Submenú.
      • Opcións de Sinatura/Cifrado...: atallo a Configuración das contas -> Opcións OpenPGP.
      • Opcións de envío...: atallo á pestana Preferencias -> Envío.
      • Opcións de selección de chaves...: atallo á pestana Preferencias -> Selección de chaves.
      • Opcións PGP/MIME...: atallo á pestana Preferencias -> PGP/MIME.
    • Desfacer cifrado: Se hai un fallo ao enviar un correo, como o servidor POP que non acepta unha solicitude, Enigmail non pode sabelo, e a mensaxe cifrada seguirá na ventá de composición. Escollendo este elemento do menú desfarase o cifrado/sinatura, volvendo o texto orixial á ventá de composición.
      Como un arranxo temporal, esta opción pode utilizarse para descifrar o texto comentado ao responder mensaxes cifradas. Enigmail debería descifrar a mensaxe automaticamente, mais se falla por algunha razón, pode utilizar este elemento do menú para forzalo.
    • Inserir chave pública: insire a chave pública nun bloque ASCII-armado na posición actual do cursos na ventá de composición. Pediráselle o enderezo da chave que quere inserir. As chaves inseridas desta maneira serán recoñecidas automaticamente ao seren recividas por Enigmail. Despois da inserción da chave, pode tamén escoller asinar/cifrar o correo se é preciso. De todos xeitos, non insira máis dun bloque de chaves nunha mensaxe; simplemente especifique múltiples enderezos de correo, separados por comas ou espazos, cando se lle pregunte.
    • Limpar contrasinais gardados: Limpa os contrasinais gardados en caché. Útil se ten múltiples contrasinais.
    • Axuda: Mostra información de axuda desde o sitio web (esta páxina).

Máis axuda dispoñíbel na páxina web de Axuda de Enigmail

enigmail-2.0.8/lang/gl/help/editRcptRule.html000066400000000000000000000131411334302754500210630ustar00rootroot00000000000000 Axuda de Enigmail: Editar regra OpenPGP

Axuda de Enigmail

Usando o Editor de regras de Enigmail Rules Editor: Editar regra OpenPGP

No Editor de regras, pode especificar configuracións predeterminadas por destinatario/a para a activación de cifrado, sinatura e PGP/MIME, e definir que chave(s) OpenPGP utilizar. Neste diálogo, pode especificar as regras para un único ou unha única destinataria, e para un grupo de destinatarios/as con atributos mois similares.

  • Definiar regras OpenPGP para: Contén os enderezos de correo dos destinos (sen nomes, p.e. so un enderezo como alguen@correo.dominio). Pode especificar varios enderezos de correo, separados por espazos. O enderezo especificado aquí pode consistir só na parte do dominio de xeito que calquera enderezo deste dominio coincidirá, p.e. @correo.dominio funcionará con calquera@correo.dominio, algun@correo.dominio, algunha@correo.dominio, etc.
  • Aplicar regra se o/a destinatario/a ...: Isto modifica a coincidencia dos enderezos de correo. Se se introducen múltiples enderezos, a configuración aplicaráselles a todos eles. Os seguintes exemplos están baseados en calquera@correo.dominio introducidos no seguinte campo de Regras OpenPGP.
    • É exactamente: con esta configuración, a regra só se dispara con correos a calquera@correo.dominio (exacto, coincidencia sensíbel a maiúsculas)
    • Contén: con esta configuración, calquera correo que conteña a cadea coincide p.e son.calquera@correo.dominio ou calquera@correo.dominio.net
    • Comeza por: con esta configuración, calquera correo que comece coa cadea coincidirá, p.e. calquera@correo.dominio.net, calquera@correo.dominio-nome.com.
    • Remata con: con esta configuración, calquera enderezo que remate coa cadea coincidirá, p.e. soncalquera@correo.dominio, nonson.calquera@correo.dominio.
  • Continuar coa seguinte regra que coincida co enderezo
    Activando esta función permitirase definir unha regra sen ter que especificar un ID de chave no campo Usar as seguintes chaves OpenPGP:, de xeito que o enderezo se utilizar para buscar unha chave no momento do envío. Tamén se procesarán outras regras para o(s) mesmo(s) enderezos igualmente.
  • Non comprobar outras regras para os enderezos que coinciden
    Activando esta función párase o procesamento de outras regras para un enderezo que xa coincidiu; p.e. o procesado de regras continúa co seguinte destinatario
  • Usar as seguintes chaves OpenPGP:
    Use o botón Seleccionar chave(s).. para seleccionar as chaves dos/as destinatarios/as que utilizar para o cifrado. Como na anterior acción, non se procesan máis regras para enderezos que xa coincidiron.
  • Predeterminado para sinatura: activa ou desactiva a sinatura de mensaxes. Isto afirmar ou anula o que especificou na ventá de composición de mensaxe. Os valores son:
    • Nunca: desactiva a sintaura, aínda que estea activada na ventá de composición da mensaxe (anula outros valores)
    • Si, se está seleccionado na Composición da mensaxe: deixa a sinatura tal e como se especificou na ventá de composición da mensaxe
    • Sempre: activa a sinatura, aínda que non estea activada na ventá de composición da mensaxe
Esta configuració de sinatura aplícase para todas as regras que coincidan. Se unha das regras desactiva a sinatura, a mensaxe non se asina, a pesar do que especifiquen outras regras Sempre.
  • Cifrado: activa ou desactiva o cifrado de mensaxes. As configuracións permitidas e o seu significado é o mesmo que para a sinatura.
  • PGP/MIME: activar ou desactivar o uso da codificación de mensaxes PGP/MIME (RFC 3156). Se PGP/MIME está desactivado, as mensaxes codifícanse usando "PGP en liña". Os valores permitidos e os seus significados son os mesmos que para a sinatura.

As regras son procesadas no orde mostrado na lista no Editor de regras OpenPGP. Cando unha regras coincide con un destinatario e contén un ID de chave OpenPGP, ademais de utilizar o ID de chave especificado, o destinatario non se utiliza para procesar máis regras.


Pode atopar máis información de axuda dispoñíbel na páxina de configuracións por-destinatario/a de Enigmail

enigmail-2.0.8/lang/gl/help/initError.html000066400000000000000000000045421334302754500204370ustar00rootroot00000000000000 Enigmail Help: How to Resolve Problems with Initializing OpenPGP

Enigmail Help

How to Resolve Problems with Initializing OpenPGP

There are several reasons why initializing OpenPGP does not succeed. The most common ones are described below; for more information please visit the Enigmail Support page.

GnuPG could not be found

In order for OpenPGP to work, the tool GnuPG needs to be installed. If GnuPG cannot be found, then first make sure that the executable gpg.exe (on Windows; gpg on other platforms) is installed on your computer. If GnuPG is installed, and OpenPGP cannot find it, then you need to manually set the path to GnuPG in the OpenPGP Preferences (menu OpenPGP > Preferences)

Enigmime failed to initialize

OpenPGP works only if it is built using the same build environment as Thunderbird or SeaMonkey was built. This means that you can use the official Enigmail releases only if you use the official releases of Thunderbird or SeaMonkey provided by mozilla.org.

If you use a Thunderbird or SeaMonkey version coming from some other source (e.g. the provider of your Linux distribution), or if you built the application yourself, you should either use an Enigmail version built by the same source, or build Enigmail yourself. For building Enigmail, refer to the Source Code section on the Enigmail home page. Please don't file any bug report concerning this problem, it is not solvable.

Further help is available on the Enigmail Support Web Site.

enigmail-2.0.8/lang/gl/help/messenger.html000066400000000000000000000110071334302754500204440ustar00rootroot00000000000000 Axuda de Enigmail: Lectura de mensaxes

Axuda de Enigmail

Usando Enigmail para ler o correo

  • Botón Descifra na ventá principal do correo
    Este botón pode utilizarse para diferentes propósitos: descifrar, verificar, ou importar chaves públicas. Normalmente o descifrado/verificación sucede de xeito automático, mais isto pode desactivarse a través das preferencias. De todos xeitos, se isto falla, normalmente aparecerá unha mensaxe de erro na liañ de estdo de Enigmail. Se fai clic no botón Descifrar, poderá ver unha mensaxe de erro máis detallada, incluída a saída do comando GnuPG.
  • Iconas do lápis e a chave na cabeceira da mensaxe
    As iconas do lápis e a chave ca cabeceira da mensaxe indican que a mensaxe que está a ler está asinada e/ou cifrada e que a sinatura é correcta, p.e. a mensaxe non mudou desde que foi asinada. Se a mensaxe tivese mudado, a icona do lápis mudaría nun láspis roto para indicar que a sinatura non é correcta. Se fai clic co botón dereito sobre o lápis ou a chave aparecerá un menú coas seguintes opcións:
    • Información de seguridade OpenPGP: permite ver o estado da saída de GnuPG para esta mensaxe.
    • Copiar información de seguridade OpenPGP: copia o estado da saída de GnuPG ao portarretallos; para pegala nunha mensaxe de resposta, etc.
    • Ver ID de foto OpenPGP: permite ver o ID de fotoda persoa que enviou a mensaxe, se é que tiña unha foto integrada na súa chave pública (Esta opción só estará activada se hai un ID de foto na chave.)
    • Información de seguridade S/MIME: permite ver a información sobre seguridade S/MIME para a mensaxe.

    Se non ten definido keyserver-options auto-key-retrieve no seu ficheiro gpg.conf e quere ler unha mensaxe asinada ou cifrada verá unha icona con un lápis na área da cabeceira con un símbolo de interrogación enriba, a liña de estado de Enigmail na cabeceira mostrará a mensaxe Parte da mensaxe asinada; prema na icona do lápis para máis detalles e a mensaxe no panel da mensaxe mostrará todos os bloques de sinaturas e indicadores de bloques de mensaxe OpenPGP.

    Tamén pode ver isto se ten definido keyserver-options auto-key-retrieve no seu ficheiro gpg.conf e a chave OpenPGP non está dispoñíbel no seu sevidor de chaves.

    Premendo na icona do lapis e símbolo de interrogación aparecerá unha ventá advertindo que a chave non está dispoñíbel no seu anel de chaves. Premendo en OK aparecerá outra ventá con unha lista de servidores de chaves dos cales pode seleccionar desde onde descargar a chave pública da persoa que lle enviou o correo.

    Para configurar a lista de servidores de chaves que quere usar, vaia á pestana Enigmail -> Preferencias -> Básico e introduza os enderezos dos servidores de chaves na caixa Servidor(es) de chaves: separados por comas. O primeiro servidor da lista será o que se utilice como servidor de chaves predeterminado.

  • Abrir ficheiros adxuntos cifrados / importar chaves OpenPGP adxuntas
    Anexos nomeados *.pgp, *.asc e *.gpg son recoñecidos como anexos que poden ser manexados especialmente por Enigmail. Facendo clic co botón dereito neses ficheiros adxuntos actívanse dous elementos de menú especiais no menú contextual: Descifrar e abrir e Descifrar e gardar. Use estes dous elementos do menú se quere que Enigmail descifre un anexo antes de abrilo ou gardalo. Se un anexo é recoñecido como un ficheiro de chave OpenPGP, ofreceráselle importar as chaves no seu anel de chaves.

Pode consultar máis información na páxina web de axuda de Enigmail

enigmail-2.0.8/lang/gl/help/rulesEditor.html000066400000000000000000000065301334302754500207620ustar00rootroot00000000000000 Axuda de Enigmail: Editor de regras

Axuda de Enigmail

Usando o Editor de regras de Enigmail

No Editor de regras, pode especificar as opcións predeterminadas por destinatario/a para activar cifrado, sinatura e PGP/MIME, e definir que chave(s) OpenPGP utilizar. Cada regra consiste en 5 campos e está representada por unha soa liña:

  • Correo: os campos de remite do(s) correo(s) o Para:, Cc: e Cco:the To:, Cc: and Bcc: que teñen que coincidir. A coincidencia funciona en subcadeas (Pódense consultar máis detalles no diálogo de edición da regra)
  • Chave(s) OpenPGP: unha lista de ID's de chaves para utilizar cos enderezos destinatarios
  • Asinar: activa ou desactiva a sinatura de mensaxes. Isto afirma ou anula o que especificou na ventá de composición da mensaxe. Os valores son:
    • Nunca: desactiva a sinatura, aínda que estea activa na ventá de composición da mensaxe (anular outros valores)
    • Posíbel: deixa a sinatura tal e como se especificou na ventá de composición da mensaxe.
    • Sempre: activa a sinatura, aínda que non estea activada na ventá de composición da mensaxe
Estas configuracións da sinatura aplícanse para todas as regras que coincidan. Se algunha das regras desactiva a sinatura, a mensaxe non se asinará, a pesar do que digan outras regras Sempre.
  • Cifrar: activa ou desactiva o cifrado de mensaxes. As configuracións permitidas e o seu significado é o mesmo que para as sinaturas.
  • PGP/MIME: activa ou desactiva o uso da codificación de mensaxes PGP/MIME (RFC 3156). Se PGP/MIME está desactivado, as mensaxes codifícanse usando "PGP en-liña". Os valores permitidos e o seu significado son os mesmos que para a sinatura.

As regras procésanse no orde que se mostra na lista. Cando unha regra coincide co/a destinatario/a e contén un ID de chave OpenPGP, ademais de usar o ID de chave especificado, o/a destinatario/a non se terá en conta ao procesar máis regras.

Nota: O editor de regras aínda non está completo. É posíbel escribir regras máis avanzadas editando directamente o ficheiro de regras (estas regras non poderás ser editadas despois no editor de regras) Máis información sobre como editar directamente o ficheiro está dispoñíbel na páxina web de Enigmail


Pode atopar máis información de axuda na páxina web de Axuda de Enigmail

enigmail-2.0.8/lang/gl/help/sendingPrefs.html000066400000000000000000000047771334302754500211230ustar00rootroot00000000000000 Enigmail Help: Edit OpenPGP Rule

Enigmail Help

Defining Preferences to Send Encrypted

In the Sending Preferences you can choose the general model and preferences for encryption.

Convenient Encryption
With these settings, emails are encrypted without confirmation whenever possible.

This setup is appropriate, if you just want to improve your privacy by sending emails encyrpted instead of unencrypted if that's possible.

The effect is like sending emails as letters instead of postcards. Unlike postcards, letters usually hide their contents while in transit.

Note however that as with letters you can't be sure that nobody is opening the letter while it is in transit (although, some technical effort is necessary for that).

A concrete risk is that you accidentally use "faked keys" you got from somewhere or somebody claiming that the key belongs to the person you want to send emails to. To avoid this risk, you can either use the trust model of PGP (see below) or you should always verify, whether the fingerprint of a public key is correct.

Manual Encryption
This option allows you to specify the different preferences for encryption according to your needs. You can specify
  • whether replies to encrypted/signed emails should automatically also be encrypted/signed-
  • whether to use the trust model of OpenPGP to accept keys (this means that to use a key you either have to sign the key or have enough other people you trust having signed the key).
  • whether you want to automatically send emails encrypted if all keys are accepted.
  • whether and when you want to finally confirm sending an email.
If it is important for you that content you send encrypted can't be read by other people or organizations, you should use the manual preferences at least choose the option to accept keys only if you or other people signed them. While this model reduces the risk of using faked keys, it requires that you actively sign keys and declare owner trust using the key managament dialog. enigmail-2.0.8/lang/hr/000077500000000000000000000000001334302754500146465ustar00rootroot00000000000000enigmail-2.0.8/lang/hr/am-enigprefs.properties000066400000000000000000000002051334302754500213360ustar00rootroot00000000000000# Strings used in the Mozill AccountManager prefPanel-enigprefs=Nizovi koriÅ¡teni u Mozilla upravitelju raÄuna\n\nOpenPGP sigurnost enigmail-2.0.8/lang/hr/enigmail.dtd000066400000000000000000001617101334302754500171360ustar00rootroot00000000000000 ' da bi odredili email adrese"> ' znakove da bi odredili email adrese za GnuPG. Onesposobite ako primatelji imaju stare Hushmail kljuÄeve."> OpenPGP sigurnost)"> NAPOMENA: Generiranje kljuÄeva može trajati nekoliko minuta. Ne izlazite iz aplikacije dok se kljuÄevi generiraju. Aktivno pregledavanje interneta ili provoÄ‘enje operacija koje su zahtjevne za disk prilikom generiranja kljuÄeva će napuniti 'bazen nasumiÄnosti' i ubrzati proces. Bit će te obavijeÅ¡teni kad je generiranje kljuÄeva gotovo."> ' nije važeće"> NAPOMENA: Generiranje kljuÄa može potrajati nekoliko minuta. Ne izlazite iz aplikacije dok se kljuÄ generira. Bit će te obavijeÅ¡teni kad je deneriranje zavrÅ¡eno."> Obavijest: Enigmail će uvijek provjeravati potpise na email-ovima za svaki raÄun i identitet, bez obzira da li je omogućen ili ne"> javni kljuÄ je za druge da Vam poÅ¡alju enkriptirane email-ove. Možete ga distribuirati svima."> privatni kljuÄ je za Vas tako da možete dekriptirati i slati potpisane email-ove. Ne bi ga trebali dati nikom."> privatni kljuÄ je za Vas da bi dekriptirali ove email-ove i slali potpisane email-ove. Ne bi ga trebali dati nikom. Da bi osigurali VaÅ¡ privatni kljuÄ, bit ćete upitani za lozinku u sljedeća dva dijaloga."> lozinka je lozinka za zaÅ¡titu VaÅ¡eg privatnog kljuÄa. SprijeÄava zloupotrebu VaÅ¡eg privatnog kljuÄa."> nisu preporuÄeni."> izvezite svoje podatke sa svog starog raÄunala koristeći Äarobnjak za sigurnosne kopije iz Enigmail postavki uvezite podatke na novo raÄunalo koristeći ovaj Äarobnjak. "> Hvala Vam Å¡to koristite Enigmail."> izvezite svoje podatke sa starog raÄunala koristeći ovaj Äarobnjak uvezite podatke na novo raÄunalo koristeći ÄŒarobnjak za postavljanje. "> enigmail-2.0.8/lang/hr/enigmail.properties000066400000000000000000001525761334302754500205710ustar00rootroot00000000000000Enigmail=Enigmail ##################################################################### # Strings used within enigmailCommon.js and enigmailCommon.jsm ##################################################################### enigAlert=Enigmail upozorenje enigConfirm=Enigmail potvrda # enigInfo=Enigmail Information enigError=Enigmail greÅ¡ka enigPrompt=Enigmail prompt dlgYes=&Da dlgNo=&Ne dlgKeepSetting=Zapamti moj odgovor i ne pitaj me viÅ¡e dlgNoPrompt=Ne pokazuj mi ovaj okvir ponovno dlg.button.delete=&ObriÅ¡i dlg.button.cancel=&Otkaži dlg.button.close=&Zatvori dlg.button.continue=Nastavi dlg.button.skip=&PreskoÄi dlg.button.overwrite=&PrepiÅ¡i dlg.button.view=&Pregledaj dlg.button.retry=&PokuÅ¡aj ponovno dlg.button.ignore=&Ignoriraj # dlg.button.install=&Install # dlg.button.ok=&OK repeatPrefix=\n\nOvo upozorenje će se ponoviti joÅ¡ %S repeatSuffixSingular=put. repeatSuffixPlural=puta. noRepeat=\n\nOvo upozorenje se neće ponavljati dok ne nadogradite Enigmail. pgpNotSupported=Izgleda da koristite Enigmail zajedno s PGP 6.x\n\nNažalost, PGP 6.x ima niz problema koji sprijeÄavaju Enigmail da radi ispravno. Zbog toga Enigmail ne podržava PGP 6.x viÅ¡e; molimo Vas da se prebacite na GnuPG (GPG) umjesto toga.\n\nAko Vam treba pomoć pri prebacivanju na GnuPG, provjerite dio Enigmail naslovne stranice na kojem se nalazi Pomoć. initErr.howToFixIt=Da bi koristili Enigmail morate imati GnuPG. Ako joÅ¡ niste instalirali GnuPG, najjednostavniji naÄin da to napravite je koristeći "ÄŒarobnjak postavljanja" gumb niže. initErr.setupWizard.button=&ÄŒarobnjak postavljanja passphraseCleared=Lozinka je oÄišćena. cannotClearPassphrase=Koristite ne standardni alat (npr. gnome-keyring) za upravljanje lozinkama. Zbog toga Äišćenje lozinke nije moguće iz Enigmail-a. noPhotoAvailable=Slika nije dostupna debugLog.title=Enigmail zapis o otklanjanju pogreÅ¡ke error.photoPathNotReadable=Putanja '%S' slike nije Äitljiva # generalError=Error: %S # Strings in configure.jsm enigmailCommon.versionSignificantlyChanged=Ova nova verzija Enigmail-a ima znaÄajne promjene u rukovanju postavki i opcija. PokuÅ¡ali smo prenijeti stare postavke na ovu novu verziju, no ne možemo pokriti sve sluÄajeve automatski. Molimo Vas da provjerite nove postavke i opcije. enigmailCommon.checkPreferences=Provjeri postavke... preferences.defaultToPgpMime=Promjenili smo zadano enkodiranje poruka u Enigmail-u sa Inline-PGP-a u PGP/MIME. PreporuÄamo Vam da to zadržite kao zadano.\n\nAko i dalje želite koristiti Inline-PGP kao zadani, možete to napraviti u postavkama raÄunaa, pod OpenPGP sigurnost. ##################################################################### # Strings in enigmailAbout.js ##################################################################### usingVersion=Koristim Enigmail verziju %S # enigmailPepVersion=Enigmail/p≡p version %S usingAgent=Koristim %1$S izvrÅ¡nu datoteku %2$S za enkripciju i dekripciju agentError=POGREÅ KA: Pristup Enigmime usluzi nije uspio! ##################################################################### # Strings in enigmailKeygen.js ##################################################################### accessError=PogreÅ¡ka u pristupanju Enigmail usluzi onlyGPG=Generiranje kljuÄeva radi jedino s GnuPG-om (ne s PGP-om)! keygenComplete=Generiranje kljuÄa zavrÅ¡eno! Identitet <%S> će biti koriÅ¡ten za potpisivanje. revokeCertRecommended=PreporuÄamo stvaranje certifikata za opoziv za VaÅ¡ kljuÄ. Ovaj certifikat se može iskoristiti za poniÅ¡tavanje VaÅ¡eg kljuÄa u sluÄaju da se VaÅ¡ tajni kljuÄ izgubi ili postane kompromitiran. Želite li stvoriti certifikat za opoziv sad? keyMan.button.generateCert=&Generiraj certifikat genCompleteNoSign=Generiranje kljuÄa zavrÅ¡eno! genGoing=Generiranje kljuÄa je već u tijeku! passNoMatch=Lozinke se ne podudaraju; molimo Vas da ih ponovno unesete passCheckBox=OznaÄite kvaÄicom kutiju ako ne odreÄ‘ujete lozinku za kljuÄ passUserName=Molimo Vas da odredite korisniÄko ime za ovaj identitet keygen.missingUserName=Nije odreÄ‘eno ime za odabranu državu/identitet. Molimo unesite vrijednost u polje "VaÅ¡e ime" u postavkama raÄunama. keygen.passCharProblem=Koristite posebne znakove u svojoj lozinci. Nažalost, ovo može prouzroÄiti probleme drugim aplikacijama. PreporuÄamo da odaberete lozinku koja se sastoji jedino od ovih znakova:\na-z A-Z 0-9 /.;:,!?(){}[]%* passSpaceProblem=Zbog tehniÄkih razloga VaÅ¡a lozinka ne može zapoÄeti ili zavrÅ¡iti s razmakom. changePassFailed=Promjena lozinke nije uspjela. keyConfirm=Generiraj javni i privatni kljuÄ za '%S'? keyMan.button.generateKey=&Generiraj kljuÄ keyAbort=Prekini generiranje kljuÄa? keyMan.button.generateKeyAbort=&Prekini generiranje kljuÄa keyMan.button.generateKeyContinue=&Nastavi generiranje kljuÄa expiryTooLong=Ne možete stvoriti kljuÄ koji istiÄe za viÅ¡e od 100 godina. expiryTooLongShorter=Ne možete stvoriti kljuÄ koji istiÄe za viÅ¡e od 90 godina. expiryTooShort=VaÅ¡ kljuÄ mora biti valjan za najmanje jedan dan. keyGenFailed=Generiranje kljuÄa nije uspjelo. Molimo Vas provjerite Enigmail konzolu (Izbornik Enigmail > Otklanjanje pogreÅ¡ki Enigmail-a) za detalje. setKeyExpirationDateFailed=Datum isteka nije mogao biti promjenjen # Strings in enigmailMessengerOverlay.js securityInfo=Enigmail sigurnosne informacije\n\n enigHeader=Enigmail: enigContentNote=Enigmail: *Privitci ove poruke nisu potpisani ili enkriptirani*\n\n possiblyPgpMime=Potencionalno PGP/MIME enkriptirana ili potpisana poruka; kliknite gumb Dekriptiraj za provjeru saveAttachmentHeader=Enigmail: Pohrani dekriptirani privitak noTempDir=Nije pronaÄ‘ena privremena mapa u koju se piÅ¡e\nMolimo Vas da postavite TEMP varijablu attachmentPgpKey=ÄŒini se da je privitak '%S' koji otvarate datoteka OpenPGP kljuÄa.\n\nKliknte 'Uvezi' da bi uveli kljuÄeve ili 'Pregledaj' da bi pregledali sadržaj datoteke u prozoru preglednika beginPgpPart=********* *POÄŒNI ENKRIPTRANI ili POTPISANI DIO* ********* endPgpPart=********** *ZAVRÅ I ENKRIPTIRANI ili POTPISANI DIO* ********** notePartEncrypted=Enigmail: *Dijelovi poruke NISU potpisani ili enkriptirani* noteCutMessage=Enigmail: *PronaÄ‘eni viÅ¡estruki blokovi poruke -- dekripcija/provjera prekinuta* decryptOkNoSig=Upozorenje!\n\nDekripcija je provedena uspjeÅ¡no, ali potpisa nije mogao biti provjeren toÄno msgOvl.button.contAnyway=&Svejedno nastavi signature.verifiedOK=Potpis za privitak %S je uspjeÅ¡no provjeren signature.verifyFailed=Potpis za privitak %S nije moguće provjeriti attachment.noMatchToSignature=Nije moguće usporediti privitak '%S' s potpisnom datotekom attachment.noMatchFromSignature=Nije moguće usporediti potpisnu datoteku '%S' s privitkom fixBrokenExchangeMsg.failed=Popravak poruke nije uspio. # enigmail.msgViewColumn.label=Enigmail # enigmailPep.msgViewColumn.label=Enigmail/p≡p # wksNoIdentity=This key is not linked to any of your email accounts. Please add an account for at least one of the following email addresse(s):\n\n%S # wksConfirmSuccess=Confirmation email sent. # wksConfirmFailure=Sending the confirmation email failed. # autocrypt.importSetupKey.accountPreconfigured=Your account is already correctly configured for Autocrypt.\n\nDo you really want to overwrite your settings with this setup message? # autocrypt.importSetupKey.selfCreated=This message was created by your currently running instance of Enigmail.\n\nPlease switch to the email client to which you want to transfer the settings, and click on the message on that email client to import the settings. # autocrypt.importSetupKey.invalidMessage=Error - could not read setup message. The message seems to be corrupted. Please try to create a new setup message on your "other" device. # autocrypt.importSetupKey.invalidKey=Error - the key could not be imported. The key is either not supported by your version of GnuPG, or it got corrupted. # autocrypt.importSetupKey.wrongPasswd=The password you entered is wrong. Do you want to retry? # autocrypt.importSetupKey.success=The Autocrypt setup message was processed successfully. Autocrypt is now available for your account '%S'. ##################################################################### # Strings in enigmailMsgComposeOverlay.js ##################################################################### keysToExport=Odaberite OpenPGP kljuÄeve za umetanje keysToUse=Odabeirte OpenPGP kljuÄ(eve) za uporabu za %S pubKey=Javni kljuÄ za %S\n windowLocked=Prozor stvaranja poruke je zakljuÄan; slanje otkazano sendUnencrypted=Inicijalizacija Enigmail-a nije uspjela.\nPoslati neenkriptiranu poruku? composeSpecifyEmail=Molimo Vas da odredite svoju primarnu email adresu koja će biti koriÅ¡tena pri odabiru potpisnog kljuÄa za odlazne poruke.\nAko ostavite prazno, OD adresa poruke će biti iskoriÅ¡tena za odabir potpisnog kljuÄa. sendingHiddenRcpt=Ova poruka ima BCC (slijepe kopije - skrivene) primatelje. Ukoliko je ova poruka enkriptirana moguće je sakriti BCC primatelje ali korisnici nekih proizvoda (npr. PGP Corp.) neće biti u mogućnosti dekriptirati poruku. S tim na umu, savjetujemo Vam da izbjegavate BCC email-ove kad radite s enkriptiranim porukama. sendWithHiddenBcc=Sakrij BCC primatelje sendWithShownBcc=Enkriptiraj normalno sendingNews=Operacija Enkriptiranog slanja prekinuta.\n\nOva poruka ne može biti dekriptirana jer postoje grupe primatelja. Molimo Vas da ponovno poÅ¡aljete poruku bez enkripcije. sendToNewsWarning=Upozorenje: poslati ćete neenkriptirani email grupi primatelja.\n\nOvo se ne potiÄe jer ima smisla jedino ako svi Älanovi grupe mogu dekriptirati poruku, odnosno poruka mora biti enkriptirana s kljuÄevima svih Älanova grupe. PoÅ¡aljite ovu poruku jedino ako znate toÄno Å¡to radite.\n\nNastaviti? hasHTML=HTML mail upozorenje:\nOva poruka može sadržavati HTML, Å¡to bi moglo prouzroÄiti neuspjeh potpisivanja/enkripcije. Da bi se to izbjeglo, u budućnosti bi trebali pritisnuti SHIFT tipku kad klikćete na Stvori/Odgovori gumb tako da poÅ¡aljete potpisan email.\nAko potpisujete email pod zadano, trebali bi odznaÄiti 'Stvori poruku u HTML-u' tako da trajno onemogućite HTML mail za ovaj raÄun. strippingHTML=Poruka sadrži HTML informacije formatiranja koje će biti izgubljene prilikom pretvorbe u obiÄan tekst za potpisivanje/enkripciju. Želite li nastaviti? msgCompose.button.sendAnyway=&PoÅ¡alji poruku svejedno attachWarning=Privitci ovoj poruci nisu lokalni, ne mogu biti enkriptirani. Da bi enkriptirali te privitke prvo ih pohranite kao lokalne datoteke, a zatim dodajte kao privitke. Želite li svejedno poslati poruku? quotedPrintableWarn=Omogućili ste enkodiranje 'citirano - pogodno za ispis' za poruke koje se Å¡alju. Ovo može rezultirati netoÄnom dekripcijom i/ili provjerom VaÅ¡e poruke.\nŽelite li iskljuÄiti slanje takvih poruka sad? minimalLineWrapping=Postavili ste omatanje linije na %S znakova. Za ispravnu enkripciju i/ili potpisivanje, ova vrijednost mora biti najmanje 68.\nŽelite li promjeniti omatanje linije na 68 znakova sad? warning=Upozorenje signIconClicked=RuÄno ste modificirali potpisivanje, stoga, dok stvarate ovu poruku, (de)aktiviranje potpisivanja ne ovisi viÅ¡e o (de)aktiviranju enkripcije. errorOwnKeyUnusable=ID '%S' kljuÄa konfiguriranog za trenutni identitet ne daje iskoristiv OpenPGP kljuÄ.\n\nUvjerite se da imate važeći, ne istekli OpenPGP kljuÄ i da postavke VaÅ¡eg raÄuna pokazuju na taj kljuÄ.\nAko VaÅ¡ kljuÄ nije istekao, provjerite jeste li postavili povjerenje prema vlasniku na puno ili ultimativno. msgCompose.cannotSaveDraft=PogreÅ¡ka prilikom spremanja predloÅ¡ka # msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information - partially encrypted email. # msgCompose.partiallyEncrypted.mimeMsg=The message you are replying to contained both unencrypted and encrypted parts. Some encrypted message parts are invisible to you.\n\nIf the sender was not able to decrypt the hidden message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nWe recommend that you don't reply to the message, but create a new message containing your answer. # msgCompose.partiallyEncrypted.inlinePGP=The message you are replying to contained both unencrypted and encrypted parts. If the sender was not able to decrypt some message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nPlease consider removing all quoted text from your reply to this sender. msgCompose.internalEncryptionError=Interna pogreÅ¡ka: obećana enkripcija onemogućena msgCompose.internalError=DoÅ¡lo je do interne pogreÅ¡ke. msgCompose.toolbarTxt.signAndEncrypt=Ova poruka će biti potpisana i enkriptirana msgCompose.toolbarTxt.signOnly=Ova poruka će biti potpisana msgCompose.toolbarTxt.encryptOnly=Ova poruka će biti enkriptirana msgCompose.toolbarTxt.noEncryption=Ova poruka će biti nepotpisana i neenkriptirana msgCompose.toolbarTxt.disabled=Enigmail je onemogućen za odabrani identitet # msgCompose.protectSubject.tooltip=Protect the message subject # msgCompose.noSubjectProtection.tooltip=Do not protect the message subject msgCompose.encryptedSubjectStub=Enkriptirana poruka # msgCompose.protectSubject.dialogTitle=Enable Protection of Subject? # msgCompose.protectSubject.question=Regular encrypted emails contain the unredacted subject.\n\nWe have established a standard to hide the original subject in the encrypted message\nand replace it with a dummy text, such that the subject is only visible after the email is decrypted.\n\nDo you want to protect the subject in encrypted messages? # msgCompose.protectSubject.yesButton=&Protect subject # msgCompose.protectSubject.noButton=&Leave subject unprotected msgCompose.detailsButton.label=Detalji... msgCompose.detailsButton.accessKey=D # msgCompose.pepSendUnknown=Unknown # msgCompose.pepSendUnsecure=Unsecure # msgCompose.pepSendSecure=Secure # msgCompose.pepSendTrusted=Secure & Trusted # pep.alert.disabledForIdentity=p≡p is disabled for the current identity. Please enable p≡p via the Enigmail/p≡p preferences. # pep.alert.weakReply=You’re about to forward or reply to a secure message as insecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? # note: should end with double newline: sendAborted=Operacija slanja prekinuta.\n\n # details: keyNotTrusted=Nema dovoljno povjerenja za kljuÄ '%S' keyNotFound=KljuÄ '%S' nije pronaÄ‘en keyRevoked=KljuÄ '%S' opozvan keyExpired=KljuÄ '%S' je istekao statPGPMIME=PGP/MIME # statSMIME=S/MIME statSigned=POTPISANO statEncrypted=ENKRIPTIRANO statPlain=NEPOTPISANO i NEENKRIPTIRANO offlineSave=Pohrani %1$S poruku za %2$S u mapi neposlanih poruka? onlineSend=PoÅ¡alji %1$S poruku %2$S? encryptKeysNote=Napomena: poruka je enkriptirana za sljedeće ID-e korisnika / kljuÄeve: %S hiddenKey= signFailed=PogreÅ¡ka u Enigmail-u; Enkripcija/potpisivanje nije uspjelo; poÅ¡alji neenkriptiranu poruku? msgCompose.button.sendUnencrypted=&PoÅ¡alji neenkriptiranu poruku recipientsSelectionHdr=Odaberi primatelje za enkripciju configureNow=JoÅ¡ niste postavili Enigmail sigurnost za odabrani identitet. Želite li to uÄiniti sad? # encryption/signing status and associated reasons: encryptMessageAuto=Enkriptiraj poruku (automatski) encryptMessageNorm=Enkriptiraj poruku signMessageAuto=PotpiÅ¡i poruku (automatski) signMessageNorm=PotpiÅ¡i poruku encryptOff=Enkripcija: ISKLJUÄŒENA encryptOnWithReason=Enkripcija: UKLJUÄŒENA (%S) encryptOffWithReason=Enkripcija: ISKLJUÄŒENA (%S) encryptOn=Enkripcija: UKLJUÄŒENA signOn=Potpisivanje: UKLJUÄŒENO signOff=Potpisivanje: ISKLJUÄŒENO signOnWithReason=Potpisivanje: UKLJUÄŒENO (%S) signOffWithReason=Potpisivanje: ISKLJUÄŒENO (%S) reasonEnabledByDefault=omogućeno pod zadano reasonManuallyForced=prisiljeno ruÄno reasonByRecipientRules=prisiljeno po pravilima primatelja reasonByAutoEncryption=prisiljeno po auto enkripciji reasonByConflict=zbog sukoba u pravilima primatelja reasonByEncryptionMode=zbog enkripcijskog naÄina rada # should not be used anymore: encryptYes=Poruka će biti enkriptirana encryptNo=Poruka neće biti enkriptirana # should not be used anymore: signYes=Poruka će biti potpisana signNo=Poruka neće biti potpisana # PGP/MIME status: pgpmimeNormal=Protokol: PGP/MIME inlinePGPNormal=Protokol: Inline PGP # smimeNormal=Protocol: S/MIME pgpmimeAuto=Protokol: PGP/MIME (automatski) inlinePGPAuto=Protokol: Inline PGP (automatski) # smimeAuto=Protocol: S/MIME (auto) # should not be used anymore pgpmimeYes=PGP/MIME će biti koriÅ¡ten pgpmimeNo=Inline PGP će biti koriÅ¡ten # Attach own key status (tooltip strings): attachOwnKeyNo=VaÅ¡ kljuÄ neće biti privijen attachOwnKeyYes=VaÅ¡ kljuÄ Ä‡e biti privijen attachOwnKeyDisabled=VaÅ¡ kljuÄ ne može biti privijen. Morate odabrati specifiÄan kljuÄ\nu OpenPGP sekciji Postavki raÄuna kako bi omogućili ovu znaÄajku. rulesConflict=Otkrivena konfliktna pravila po primatelju\n%S\n\nPoÅ¡alji poruku s ovim postavkama? msgCompose.button.configure=&Postavi msgCompose.button.send=&PoÅ¡alji poruku msgCompose.button.save=&Spremi poruku # Strings in enigmailMsgHdrViewOverlay.js keyNeeded=Potreban je javni kljuÄ %S da bi verificirali potpis keyUsed=Javni kljuÄ %S koriÅ¡ten za provjeru potpisa clickDecrypt=; kliknite Dekriptiraj gumb clickDecryptRetry=; kliknite Dekriptiraj gumb da bi pokuÅ¡ali ponovno clickDetailsButton=; kliknite na 'Detalji' za viÅ¡e informacija clickImportButton=; kliknite na 'Uvezi kljuÄ' da bi preuzeli kljuÄ keyTypeUnsupported=; vrsta kljuÄa nije podržana od strane VaÅ¡e verzije GnuPG-a msgPart=Dio poruke %S msgSigned=potpisan msgSignedUnkownKey=potpisano nepoznatim kljuÄem msgEncrypted=enkriptiran msgSignedAndEnc=potpisan i enkriptiran unverifiedSig=Neverificiran potpis incompleteDecrypt=Dekripcija nepotpuna needKey=GreÅ¡ka - nije pronaÄ‘en odgovarajući privatni/tajni kljuÄ za dekripciju poruke failedDecrypt=GreÅ¡ka - dekripcija nije uspjela badPhrase=GreÅ¡ka - loÅ¡a lozinka failedDecryptVerify=GreÅ¡ka - dekripcija/verifikacija nije uspjela viewInfo=; Pogledajte > Informacije o sigurnosti poruke za detalje decryptedMsg=Dekriptiraj poruku decryptedMsgWithFormatError=Dekriptirana poruka (obnovljen potrgani PGP email format vjerovatno uzrokovan starim Exchange poslužitelje, tako da bi rezultat mogao biti nesavrÅ¡en za Äitanje) usedAlgorithms=KoriÅ¡teni algoritmi: %S i %S # pepStatusInfo.text=p≡p Message Status. # pepStatusInfo.title.m3=Under Attack # pepStatusInfo.info.m3=This message is not secure and has been tampered with. # pepStatusInfo.title.m1=Mistrusted # pepStatusInfo.info.m1=This message has a communication partner that has previously been marked as mistrusted # pepStatusInfo.title.r0=Unknown # pepStatusInfo.info.r0=This message does not contain enough information to determine if it is secure. # pepStatusInfo.title.r1=Cannot Decrypt # pepStatusInfo.info.r1=This message cannot be decrypted because the key is not available. # pepStatusInfo.title.r2=Cannot Decrypt # pepStatusInfo.info.r2=This message cannot be decrypted because the key is not available. # pepStatusInfo.title.r3=Unsecure # pepStatusInfo.info.r3=This message is unsecure. # pepStatusInfo.title.r4=Unsecure for Some # pepStatusInfo.info.r4=This message is unsecure for some communication partners. # pepStatusInfo.title.r5=Unreliable Security # pepStatusInfo.info.r5=This message has unreliable protection. # pepStatusInfo.title.r6=Secure... # pepStatusInfo.info.r6=This message is secure but you still need to verify the identity of your communication partner. # pepStatusInfo.title.r7=Secure & Trusted # pepStatusInfo.info.r7=This message is secure and trusted. # pepStatusInfo.color.green=Green # pepStatusInfo.color.yellow=Yellow # pepStatusInfo.color.red=Red # pepRevokeTrust.question=Do you really want to cancel the trust for %S? # pepRevokeMistrust.question=Do you really want to re-trust the key for %S? # pepRevokeTrust.doRevoke=Cancel &trust # wksConfirmationReq=Web Key Directory Confirmation Request # wksConfirmationReq.message=This message has been sent by your email provider to confirm deployment of your OpenPGP public key\nin their Web Key Directory.\nProviding your public key helps others to discover your key and thus being able to encrypt messages to you.\n\nIf you want to deploy your key in the Web Key Directory now, please click on the button "Confirm Request" in the status bar.\nOtherwise, simply ignore this message. # wksConfirmationReq.button.label=Confirm Request # autocryptSetupReq=Perform Autocrypt Setup # autocryptSetupReq.button.label=Start Setup # autocryptSetupReq.setupMsg.desc=This message contains all information to transfer your Autocrypt settings along with your secret key securely from your original device. # autocryptSetupReq.setupMsg.backup=You can keep this message and use it as a backup for your secret key. If you want to do this, you should write down the password and store it securely. # autocryptSetupReq.message.import=To import the settings and key(s) in Enigmail, please click on the "Start Setup" button in the status bar. # autocryptSetupReq.message.sent=Please click on the message on your new device and follow the instuctions to import the settings. # strings in pref-enigmail.js # oldGpgVersion20=Enigmail initialization failed.\n\nYou are using GnuPG version %1$S, which is not supported anymore. Enigmail requires GnuPG version %2$S or newer. Please upgrade your GnuPG installation, or Enigmail will not work. locateGpg=Lociraj GnuPG program invalidGpgPath=GnuPG ne može biti izvrÅ¡en s danom putanjom. Enigmail je deaktiviran dok ne promjenite putanju za GnuPG ili ne pokrenete ponovno aplikaciju. warningsAreReset=Sva upozorenja su ponovno postavljena. prefs.gpgFound=GnuPG je pronaÄ‘en u %S prefs.gpgNotFound=Nije pronaÄ‘en GnuPG prefs.warnAskNever=Upozorenje: aktiviranje ove opcije će rezultirati neenkriptiranim email-ovima bez daljnjih informacija u sluÄaju nedostatka kljuÄa za nekog od primatelja -- Enigmail Vas neće obavijestiti ako se to dogodi! prefs.warnIdleTimeForUnknownAgent=Nije moguće spajanje s gpg-agent. Možda VaÅ¡ sustav koristi specijalizirani alat za upravljanje lozinkama (npr. gnome-keyring, seahorse-agent, KDE wallet manager...). Nažalost Enigmail ne može kontrolirati timeout lozinki za alat koji koristite. Zbog toga su pripadajuće postavke timeout-a u Enigmailu zanemarene. prefEnigmail.oneKeyserverOnly=PogreÅ¡ka - možete odrediti samo jedan poslužitelj kljuÄeva za automatsko preuzimanje OpenPGP kljuÄeva koji nedostaju. # Strings used in core.jsm # (said file also re-uses some strings from above) enterAdminPin=Molimo unesite administratorski PIN VaÅ¡e SmartCard enterCardPin=Molimo unesite svoj SmartCard PIN notInit=PogreÅ¡ka - Enigmail usluga joÅ¡ nije inicijalizirana badCommand=PogreÅ¡ka - naredba enkripcije nije uspjela cmdLine=naredbena linija i izlaz: notRequired=PogreÅ¡ka - enkripcija nije zahtjevana notComplete=PogreÅ¡ka - generiranje kljuÄa joÅ¡ nije zavrÅ¡eno invalidEmail=PogreÅ¡ka - pogreÅ¡na email adresa ili adrese noPassphrase=PogreÅ¡ka - nije dana lozinka noPGPblock=PogreÅ¡ka - nije pronaÄ‘en valjan oklopljeni OpenPGP blok podataka unverifiedReply=UvuÄeni dio poruke (odgovor) je vjerovatno modificiran keyInMessageBody=PronaÄ‘en kljuÄ u tjelu poruke. Stisnite 'Uvezi kljuÄ' kako bi uvezli kljuÄ sigMismatch=PogreÅ¡ka - potpisi se ne slažu cantImport=PogreÅ¡ka pri uvozu javnog kljuÄa\n\n doImportOne=Uvezi %1$S (%2$S)? doImportMultiple=Uvezi sljedeće kljuÄeve?\n\n%S previewFailed=Ne mogu proÄitati datoteku javnog kljuÄa. # Strings used in errorHandling.jsm sc.wrongCardAvailable=SmartCard %1$S pronaÄ‘ena u VaÅ¡em ÄitaÄu ne može biti koriÅ¡tena za obradu poruke.\nMolimo umetnite svoju SmartCard %S i ponovite operaciju. sc.insertCard=Operacija zahtjeva VaÅ¡u SmartCard %S.\nMolimo umetnite zahtjevanu SmartCard i ponovite operaciju. sc.removeCard=Operacija ne zahtjeva SmartCard u ÄitaÄu.\nMolimo uklonite svoju SmartCard i ponovite operaciju. sc.noCardAvailable=Nije pronaÄ‘ena nijedna SmartCard u VaÅ¡em ÄitaÄu\nMolimo Vas umetnite SmartCard i ponovite operaciju. sc.noReaderAvailable=VaÅ¡oj SmartCard se ne može pristupiti\nMolimo spojite VaÅ¡ SmartCard ÄitaÄ, umetnite karticu i ponovite operaciju. keyError.keySpecNotFound=Email adresa "%S" ne može biti usporeÄ‘ena sa kljuÄem na VaÅ¡em privjesku kljuÄeva. keyError.keyIdNotFound=Konfigurirani ID "%S" kljuÄa ne može biti pronaÄ‘en na VaÅ¡em privjesku kljuÄeva. keyError.resolutionAction=Molimo odaberite ispravan kljuÄ u OpenPGP odjelu u Postavkama raÄuna. missingPassphrase=Nedostaje lozinka errorHandling.gpgAgentInvalid=VaÅ¡ sustav koristi verziju gpg-agent koja ne odgovara VaÅ¡oj GnuPG verziji. errorHandling.gpgAgentError=GnuPG je prijavio pogreÅ¡ku u komunikaciji s gpg-agent -om (komponenta GnuPG-a). errorHandling.dirmngrError=GnuPG je prijavio pogreÅ¡ku u komunikaciji s dirmngr-om (komponenta GnuPG-a). errorHandling.pinentryError=GnuPG ne može poslati upit za VaÅ¡u lozinku putem unosa pin-a. errorHandling.readFaq=Ovo je greÅ¡ka sustava ili konfiguracije koja onemogućava da Enigmail radi ispravno i ne može biti popravljena automatski.\n\nPreporuÄamo da se posavjetujete s naÅ¡om stranicom https://enigmail.net/faq. gpgNotFound=Nije pronaÄ‘en GnuPG program '%S'.\nBudite sigurni da ste postavili toÄnu putanju do izvrÅ¡ne datoteke u Enigmail postavkama. gpgNotInPath=Nije pronaÄ‘ena GnuPG izvrÅ¡na datoteka na PUTANJI.\nBudite sigurni da ste postavili toÄnu putanju do izvrÅ¡ne datoteke u Enigmail postavkama. enigmailNotAvailable=Enigmail jezgrena usluga nije dostupna prefGood=Dobar potpis od %S prefBad=LOÅ  potpis od %S failCancel=PogreÅ¡ka - primanje kljuÄa otkazano od strane korisnika failNoServer=PogreÅ¡ka - nije odreÄ‘en poslužitelj kljuÄeva s kojeg bi se preuzeo kljuÄ failNoID=PogreÅ¡ka - nije odreÄ‘en ID kljuÄa za koji se preuzima kljuÄ failKeyExtract=PogreÅ¡ka - naredba ekstrakcije kljuÄa nije uspjela notFirstBlock=PogreÅ¡ka - Prvi OpenPGP blok nije blok javnog kljuÄa importKeyConfirm=Uvezi javni kljuÄ(eve) ugraÄ‘en(e) u poruku? failKeyImport=PogreÅ¡ka - uvoz kljuÄa nije uspio fileWriteFailed=Pisanje u datoteku %S nije uspjelo importKey=Uvezi javni kljuÄ %S sa poslužitelja kljuÄeva: uploadKey=PoÅ¡alji javni kljuÄ %S na poslužitelj kljuÄeva: keyId=ID kljuÄa keyAndSigDate=ID kljuÄa: 0x%1$S / potpisan: %2$S keyFpr=Otisak prsta kljuÄa: %S noEmailProvided=Niste dali email adresu! keyAlreadySigned=KljuÄ je već potpisan, ne možete ga potpisati dva puta. ##################################################################### # Strings used in enigmailKeySelection.js ##################################################################### selKeyExpired=istekao %S createdHeader=Stvoren atLeastOneKey=Nije odabran kljuÄ! Morate odabrati najmanje jedan kljuÄ da bi prihvatili ovaj dijalog fewerKeysThanRecipients=Odabrali ste manji broj kljuÄeva nego primatelja. Jeste li sigurni da je popis kljuÄeva za enkripciju potpun? userSel.button.goBack=Odaberi viÅ¡e kljuÄeva userSel.secretKeySel.title=Odabei tajni OpenPGP kljuÄ za potpisivanje poruka userSel.problemNoKey=Nema važećih kljuÄeva userSel.problemMultipleKeys=ViÅ¡estruki kljuÄevi # should be same as thunderbird ENTITY sendLaterCmd.label: sendLaterCmd.label=PoÅ¡alji kasnije # Strings used in enigmailAttachmentDialog.js # pgpMimeNote=NOTE: PGP/MIME is not supported by all email clients. If you are unsure, select the %S option. first=prvu second=drugu # Strings used in am-enigprefs.js / enigmailEditIdentity.js encryptKeyHeader=Odaberite OpenPGP kljuÄ za enkripciju identityName=Identitet: %S # switchPepMode=You are currently using the 'p≡p Junior' mode of Enigmail.\n\nBy enabling OpenPGP or S/MIME for an account, you are disabling p≡p and use the 'regular' mode of Enigmail without p≡p. # enableEnigmail=&Disable p≡p # Strings used in enigmailSingleRcptSettings.js noEncryption=Aktivirali ste enkripciju ali niste odabrali kljuÄ. Kako bi enkriptirali email-ove poslane prema %1$S morate odrediti jedan ili viÅ¡e važećih kljuÄeva iz VaÅ¡eg popisa kljuÄeva. Želite li onemogućiti enkripciju za %2$S? noKeyToUse=(niÅ¡ta - bez enkripcije) noEmptyRule=Pravilo ne smije biti prazno! Molimo Vas postavite email adresu u polju Pravila. invalidAddress=Jedna ili viÅ¡e email adresa koje ste unijeli nisu valjane. Ne bi trebali postavljati imena primatelja, samo email adrese. Npr:\nNeispravno: Neko Ime \nIspravno: neko.ime@adresa.net # noCurlyBrackets=The curly brackets {} have a special meaning and should not be used in an email address. If you want to modify the matching behavior for this rule, use the 'Apply rule if recipient ...' option.\nMore information is available from the Help button. # Strings used in enigmailRulesEditor.js never=Nikad always=Uvijek possible=Moguće deleteRule=Stvarno obrisati odabrano pravilo? nextRcpt=(Sljedeći primatelj) negateRule=Ne addKeyToRule=Dodaj kljuÄ %1$S (%2$S) pravilu po primatelju # Strings used in enigmailSearchKey.js needOnline=Funkcija koju ste odabrali nije dostupna u izvanmrežnom naÄinu rada. Molimo Vas da se povežete s mrežom i probate opet. protocolNotSupported=Protokol '%S://' koji ste odabrali nije podržan za preuzimanje OpenPGP kljuÄeva. gpgkeysDisabled=Možda bi pomoglo da omogućite opciju 'extensions.enigmail.useGpgKeysTool'. noKeyserverConn=Spajanje na poslužitelj kljuÄeva %S nije uspjelo. keyDownloadFailed=Preuzimanje kljuÄa s poslužitelja kljuÄeva nije uspjelo. Poruka je:\n%S internalError=Dogodila se interna pogreÅ¡ka. KljuÄevi se nisu mogli preuzeti ili uvesti. noKeyFound=Žao nam je, ali nismo mogli pronaći kljuÄ koji odgovara zadanim kriterijima pretrage.\nMolimo Vas da obratite pozornost da bi ID kljuÄa trebao poÄeti s "0x= (npr. 0xABCDEF12). # keyDownload.keyUnavailable=We are sorry, but the key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their key by email. # gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. gpgKeysFailed=Pretraga ili preuzimanje kljuÄa sa poslužitelja kljuÄeva nijo uspjelo: gpgkeys_%S nije moguće izvrÅ¡iti. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Postavljanje povjerenja valsnika nije uspjelo # Strings in enigmailSignKeyDlg.js signKeyFailed=Potpisivanje kljuÄa nije uspjelo alreadySigned.label=Napomena: kljuÄ %S je već potpisan s odabranim tajnim kljuÄem. alreadySignedexportable.label=Napomena: kljuÄ %S je već potpisan za izvoz sa odabranim privatnim kljuÄem. Lokalni potpis nema smisla. partlySigned.label=Napomena: neki ID-evi korisnika kljuÄa %S su već potpisani s odabranim tajnim kljuÄem. noTrustedOwnKeys=Nije pronaÄ‘en kvalificirani kljuÄ za potpisivanje! Trebate barem jedan privatni kljuÄ kojem se potpuno vjeruje kako bi potpisivali kljuÄeve. # Strings in enigmailKeyManager.js keyMan.loadingKeys=UÄitavam kljuÄeve, priÄekajte... keyValid.unknown=nepoznat keyValid.invalid=neisprava keyValid.disabled=onemogućen keyValid.revoked=opozvan keyValid.expired=istekao keyValid.noSubkey=nema valjanog podkljuÄa keyTrust.untrusted=nesiguran keyTrust.marginal=marginalan keyTrust.full=siguran keyTrust.ultimate=ultimativan keyTrust.group=(grupa) keyType.public=javni keyType.publicAndSec=javni/tajni keyMan.enableKey=Omogući kljuÄ keyMan.disableKey=Onemogući kljuÄ userAtt.photo=Koristi atribut (JPEG slike) asciiArmorFile=ASCII oklopljene datoteke (*.asc) importKeyFile=Uvezi OpenPGP datoteku kljuÄa gnupgFile=GnuPG datoteke # createKeyOK=Your Key has been generated saveRevokeCertAs=Stvori i pohrani certifikat za opoziv # revokeCertOK=The revocation certificate has been successfully created. You can use it to invalidate your public key, e.g. in case you would lose your secret key. revokeCertFailed=Certifikat za opoziv nije mogao biti stvoren. addUidOK=KorisniÄki ID uspjeÅ¡no dodan addUidFailed=Dodavanje korisniÄkog ID-a nije uspjelo noKeySelected=Trebali bi odabrati barem jedan kljuÄ kako bi proveli odabranu operaciju exportToFile=Izvezi javni kljuÄ u datoteku exportKeypairToFile=Izvezi tajni i javni kljuÄ u datoteku exportSecretKey=Želite li ukljuÄiti tajni kljuÄ u pohranjenu OpenPGP datoteku kljuÄa? saveKeysOK=KljuÄevi uspjeÅ¡no pohranjeni saveKeysFailed=Pohrana kljuÄeva nije uspjela importKeysFailed=Uvoz kljuÄeva nije uspio enableKeyFailed=Omogućivanje/onemogućivanje kljuÄeva nije uspjelo specificPubKeyFilename=%1$S (0x%2$S) javni specificPubSecKeyFilename=%1$S (0x%2$S) javni-tajni defaultPubKeyFilename=Izvezeni-javni-kljuÄevi defaultPubSecKeyFilename=Izvezeni-javni-i-tajni-kljuÄevi noSecretKeys=Nisu pronaÄ‘eni tajni kljuÄevi.\n\nŽelite li generirati svoj kljuÄ sad? sendKeysOk=KljuÄ(evi) poslan(i) uspjeÅ¡no sendKeysFailed=Slanje kljuÄeva nije uspjelo receiveKeysOk=KljuÄ(evi) uspjeÅ¡no ažuriran(i) receiveKeysFailed=Preuzimanje kljuÄeva nije uspjelo importFromClip=Želite li uvesti neke kljuÄeve iz meÄ‘uspremnika? importFromUrl=Preuzmite javni kljuÄ sa ovog URL-a: copyToClipbrdFailed=Kopiranje odabranih kljuÄeva u meÄ‘uspremnik nije moguće. copyToClipbrdOK=KljuÄ(evi) kopiran(i) u meÄ‘uspremnik deleteSecretKey=UPOZORENJE: PokuÅ¡avate obrisati tajni kljuÄ!\nAko obriÅ¡ete tajni kljuÄ, nećete viÅ¡e moći dekriptirati poruke enkriptirane za taj kljuÄ, i nećete viÅ¡e moći opozvati svoj kljuÄ.\n\nŽelite li uistinu obrisati OBA kljuÄa, tajni i javni?\n'%S' deleteMix=UPOZORENJE: PokuÅ¡avate obrisati tajne kljuÄeve!\nAko obriÅ¡ete tajni kljuÄ, nećete viÅ¡e moći dekriptirati poruke enkriptirane za taj kljuÄ.\n\nŽelite li uistinu obrisati odabrane kljuÄeve, tajne i javne? deletePubKey=Želite li obrisati javni kljuÄ\n'%S'? deleteSelectedPubKey=Želite li obrisati javne kljuÄeve? deleteKeyFailed=KljuÄ se ne može obrisati. revokeKeyQuestion=Opozvati će te kljuÄ '%S'.\n\nViÅ¡e nećete biti u mogućnosti potpisivati ovim kljuÄem, i jednom distribuirano, ostali neće moći dekriptirati s tim kljuÄem. JoÅ¡ uvjek možete koristit kljuÄ za dekripciju starih poruka.\n\nŽelite li nastaviti? revokeKeyOk=KljuÄ je opozvan. Ako je VaÅ¡ kljuÄ dostupan na poslužitelju kljuÄeva, preporuÄa se ponovno postavljanje tako da drugi mogu vidjeti opoziv. revokeKeyFailed=KljuÄ se ne može opozvati. # revokeKeyNotPresent=You have no key (0x%S) which fits to this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before the revocation certificate! # revokeKeyAlreadyRevoked=The key 0x%S has already been revoked. refreshAllQuestion=Niste odabrali nijedan kljuÄ. Želite li osvježiti SVE kljuÄeve? # refreshKeyServiceOn.warn=Warning: Your keys are currently being refreshed in the background as safely as possible.\nRefreshing all your keys at once will unnecessarily reveal information about you.\nDo you really want to do this? refreshKey.warn=Upozorenje: ovisno o broju kljuÄeva i brzini veze, osvježenje svih kljuÄeva može biti dugotrajan proces! downloadContactsKeys.warn=Upozorenje: ovisno o broju kontakta i brzini veze, preuzimanje kljuÄeva može biti dugotrajan proces! downloadContactsKeys.importFrom=Uvesti kontakte iz adresara '%S'? keyMan.button.exportSecKey=Izvezi &Tajne kljuÄeve keyMan.button.exportPubKey=Izvezi samo &Javne kljuÄeve keyMan.button.import=&Uvezi keyMan.button.refreshAll=&Osvježi sve kljuÄeve keyMan.button.revokeKey=&Opozovi kljuÄ keyMan.button.skip=&PreskoÄi kljuÄ keylist.noOtherUids=Nema drugih identiteta keylist.hasOtherUids=TakoÄ‘er poznat kao keylist.noPhotos=Slika nije dostupna keylist.hasPhotos=Slike keyMan.addphoto.filepicker.title=Odaberite sliku za dodavanje keyMan.addphoto.warnLargeFile=Datoteka koju ste odabrali je veća od 25 kB.\nNije preporuÄeno dodavati vrlo velike datoteke jer se tako povećavaju kljuÄevi. keyMan.addphoto.noJpegFile=Izgleda da odabrana datoteka nije JPEG datoteka. Molimo Vas da odaberete drugu datoteku. keyMan.addphoto.failed=Slika se ne može dodati. # noWksIdentity=The key %S does not have a WKS identity. # keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key "%1$S (%2$S)" for encrypting messages? # keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key "%1$S (%2$S)" for future messages? # keyman.addBlacklistKey.button=&Blacklist the key # keyman.removeBlacklistKey.button=&Remove key from Blacklist # Strings in enigmailManageUidDlg.xul changePrimUidFailed=Mijenjanje primarnog korisniÄkog ID-a nije uspjelo changePrimUidOK=Primarni korisniÄki ID uspjeÅ¡no promijenjen revokeUidFailed=Opoziv korisniÄkog ID-a %S nije uspio revokeUidOK=KorisniÄki ID %S je uspjeÅ¡no opozvan. Ako je VaÅ¡ kljuÄ dostupan na poslužitelju kljuÄeva, preporuÄa se ponovno postavljanje, tako da ostali mogu vidjeti opoziv. revokeUidQuestion=Želite li stvarno opozvati korisniÄki ID %S? # Strings in enigmailKeyImportInfo.xul importInfoTitle=USPJEH! KljuÄevi uvedeni importInfoBits=Bitovi importInfoCreated=Stvoreno importInfoFpr=Otisak prsta importInfoDetails=(Detalji) importInfoNoKeys=Nema uvedenih kljuÄeva. # Strings in enigmailKeyDetailsDlg.xul keyTypePublic=javni kljuÄ keyTypePrimary=primarni kljuÄ keyTypeSubkey=podkljuÄ keyTypePair=par kljuÄeva keyExpiryNever=nikad keyAlgorithm_1=RSA keyAlgorithm_2=RSA keyAlgorithm_3=RSA keyAlgorithm_16=ELG keyAlgorithm_17=DSA keyAlgorithm_18=ECC keyAlgorithm_19=ECC keyAlgorithm_20=ELG keyAlgorithm_22=EDDSA keyUsageEncrypt=Enkriptiraj keyUsageSign=PotpiÅ¡i keyUsageCertify=Certificiraj keyUsageAuthentication=Autentikacija keyDoesNotExpire=KljuÄ ne istiÄe # Strings in enigmailGenCardKey.xul keygen.started=Molimo priÄekajte dok se kljuÄ generira... keygen.completed=KljuÄ generiran. Novi ID kljuÄa je: 0x%S keygen.keyBackup=Sigurnosna kopija kljuÄa je %S keygen.passRequired=Molimo Vas da odredite lozinku ako želite stvoriti sigurnosnu kopiju VaÅ¡eg kljuÄa izvan SmartCard-a. # Strings in enigmailSetCardPin.xul cardPin.processFailed=Promjena PIN-a nije uspjela # Strings in enigRetrieveProgres.xul keyserverProgress.refreshing=Osvježujem kljuÄeve, priÄekajte... keyserverProgress.uploading=Postavljam kljuÄeve, priÄekajte... # keyserverProgress.wksUploadFailed=Could not upload your key to the Web Key Service # keyserverProgress.wksUploadCompleted=Your public key was successfully submitted to your provider. You will receive an email to confirm that you initiated the upload. keyserverTitle.refreshing=Osvježi kljuÄeve keyserverTitle.uploading=Postavljanje kljuÄa # Strings in enigmailSetupWizard passphrase.min8keys=VaÅ¡a lozinka bi trebala sadržavati najmanje 8 znakova! setupWizard.reallyCancel=Želite li stvarno zatvoriti Enigmail Äarobnjak za postavljanje? setupWizard.invalidGpg=Datoteka koju ste odredili nije izvrÅ¡na datoteka GnuPG-a. Molimo odredite drugu datoteku. setupWizard.specifyFile=Morate odrediti barem javni kljuÄ da bi nastavili. setupWizard.installFailed=Izgleda da instalacija nije uspjela. Ili ponovno pokuÅ¡ajte ili instalirajte GnuPG ruÄno te ga locirajte koristeći Pregledaj gumb. # setupWizard.downloadForbidden=For your own security, we will not download GnuPG. Please visit https://gnupg.org/ in order to download GnuPG. # setupWizard.downloadImpossible=We cannot download GnuPG currently. Please try later or visit https://gnupg.org/ in order to download GnuPG. setupWizard.hashSumError=ÄŒarobnjak nije mogao potvrditi integritet preuzete datoteke. Datoteka može biti oÅ¡tećena ili obraÄ‘ivana od treće strane. Želite li svejedno nastaviti instalaciju? setupWizard.importSettingsFile=Odredite datoteku sigurnosne kopije iz koje će se uÄitavati setupWizard.invalidSettingsFile=Specificirana datoteka nije toÄna Enigmail datoteka sigurnosne kopije postavki. setupWizard.gpgConfExists=Datoteka GnuPG postavki već postoji. Želite li ju prepisati s onom iz stare instalacije? # setupWizard.noGpgHomeDir=It appears that you configured %S to use for GnuPG. However, this is not a directory - you cannot use it. # setupWizard.unmachtedIds=The following identities of your old setup could not be matched:\n%S\nThe settings for these identities were skipped. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=Dogodila se pogreÅ¡ka pri preuzimanju GnuPG-a. Molimo provjerite konzolni zapis za daljnje detalje. installGnuPG.installFailed=Dogodila se pogreÅ¡ka prilikom instalacije GnuPG-a. Provjerite konzolni zapis za daljnje detalje. # Strings in enigmailAddUidDlg.xul addUidDlg.nameOrEmailError=Morate ispuniti ime i email adresu. addUidDlg.nameMinLengthError=Ime mora imati minimalno 5 znakova addUidDlg.invalidEmailError=Morate odrediti valjanu email adresu # Strings in enigmailCardDetails.js Carddetails.NoASCII=OpenPGP SmartCard podržava jedino ASCII znakove u imenu/prezimenu. # network error types errorType.SecurityCertificate=Sigurnosni certifikat pružen od strane web usluge nije valjan. errorType.SecurityProtocol=Sigurnosni protokol koriÅ¡ten od strane web usluge je nepoznat. errorType.Network=Dogodila se mrežna pogreÅ¡ka. # filter stuff filter.folderRequired=Morate odabrati ciljnu mapu. filter.decryptMove.label=Dekriptiraj trajno (Enigmail) filter.decryptCopy.label=Kreiraj dekriptiranu kopiju (Enigmail) filter.decryptMove.warnExperimental=Upozorenje - filter akcija "Dekriptiraj trajno" može dovesti do uniÅ¡tenih poruka.\n\nSnažno preporuÄamo da prvo probate filter "Kreiraj dekriptiranu kopiju", pozorno testirate rezultate, te poÄnete koristit ovaj filter tek kad ste zadovoljni rezultatima. # filter.tempPepFilterDesc=Temporary filter to store sent message unencrypted # filter.term.pgpencrypted.label=OpenPGP Encrypted # filter.encrypt.label=Encrypt to key (Enigmail) # filter.keyRequired=You must select a recipient key. # filter.keyNotFound=Could not find an encryption key for "%S". # filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for "%S" you will no longer be able to read the emails. # strings in enigmailConvert.jsm converter.decryptBody.failed=Nije uspjelo dekriptiranje poruke s predmetom\n"%S".\nŽelite li pokuÅ¡ati ponovno s drugom lozinkom ili želite preskoÄiti poruku? converter.decryptAtt.failed=Nije uspjelo dekriptiranje privitka "%1$S"\nporuke s predmetom\n"%2$S".\nŽelite li pokuÅ¡ati ponovno s drugom lozinkom ili želite preskoÄiti poruku? saveLogFile.title=Pohrani datoteku zapisa # strings in gpg.jsm unknownSigningAlg=Nepoznat algoritam potpisivanja (ID: %S) unknownHashAlg=Nepoznat kriptografski hash (ID: %S) # strings in keyRing.jsm keyring.photo=Slika keyRing.pubKeyRevoked=KljuÄ %1$S (ID kljuÄa %2$S) je opozvan. keyRing.pubKeyExpired=KljuÄ %1$S (ID kljuÄa %2$S) je istekao. keyRing.pubKeyNotForSigning=KljuÄ %1$S (ID kljuÄa %2$S) ne može biti koriÅ¡ten za potpisivanje. keyRing.pubKeyNotForEncryption=KljuÄ %1$S (ID kljuÄa %2$S) ne može biti koriÅ¡ten za enkripciju. keyRing.keyDisabled=KljuÄ %1$S (ID kljuÄa %2$S) je onemogućen; ne može biti koriÅ¡ten. keyRing.keyNotTrusted=KljuÄu %1$S (ID kljuÄa %2$S) se ne vjeruje dovoljno. Molimo postavite razinu povjerenja na "ultimativno" kako bi ga koristili za potpisivanje. keyRing.keyInvalid=KljuÄ %1$S (ID kljuÄa %2$S) je nevažeći (možda nema samo-potpis). keyRing.signSubKeysRevoked=Svi poptisni podkljuÄevi kljuÄa %1$S (ID kljuÄa %2$S) su opozvani. keyRing.signSubKeysExpired=Svi poptisni podkljuÄevi kljuÄa %1$S (ID kljuÄa %2$S) su istekli. keyRing.signSubKeysUnusable=Svi poptisni podkljuÄevi kljuÄa %1$S (ID kljuÄa %2$S) su opozvani, istekli ili drugaÄije neiskoristivi. keyRing.encSubKeysRevoked=Svi enkripcijski podkljuÄevi kljuÄa %1$S (ID kljuÄa %2$S) su opozvani. keyRing.encSubKeysExpired=Svi enkripcijski podkljuÄevi kljuÄa %1$S (ID kljuÄa %2$S) su istekli. keyRing.noSecretKey=Izgleda da nemate tajni kljuÄ za %1$S (ID kljuÄa %2$S) na VaÅ¡em privjesku kljuÄeva; ne možete koristiti taj kljuÄ za potpisivanje. keyRing.encSubKeysUnusable=Svi enkripcijski podkljuÄevi kljuÄa %1$S (ID kljuÄa %2$S) su opozvani, istekli ili drugaÄije neiskoristivi. #strings in exportSettingsWizard.js cannotWriteToFile=Ne može se spremiti u datoteku '%S'. Molimo odredite drugu datoteku. dataExportError=DoÅ¡lo je do greÅ¡ke prilikom izvoza VaÅ¡ih podataka. enigmailSettings=EnigmailPostavke defaultBackupFileName=Enigmail-izvoz specifyExportFile=Odredite ime za izvoz homedirParamNotSUpported=Dodatni parametri koji konfiguriraju putanje, primjerice --homedir i --keyring nisu podržani za izvoz/uvoz VaÅ¡ih postavki. Molimo koristite alternativne metode, primjerice postavite varijablu okoline na GNUPGHOME. #strings in expiry.jsm expiry.keyExpiresSoon=VaÅ¡ kljuÄ %1$S istiÄe za manje od %2$S dana.\n\nPreporuÄamo da stvorite novi par kljuÄeva i postavite raÄune tako da ih koriste. # expiry.keysExpireSoon=The following of your keys will expire in less than %1$S days:\n%2$S We recommend that you create new keys and configure your accounts to use the new keys. # expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to ultimate in key properties. # expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to ultimate in key properties. # expiry.OpenKeyManager=Open Enigmail Key Management # expiry.OpenKeyProperties=Open Key Properties #strings in pEpDecrypt.jsm # pEpDecrypt.cannotDecrypt=This is an encrypted message. Unfortunately you don't have the secret key to decrypt the message. #strings in gpgAgent.jsm # gpghomedir.notexists=The directory '%S' containing your OpenPGP keys does not exist and cannot be created. # gpghomedir.notwritable=The directory '%S' containing your OpenPGP keys is not writable. # gpghomedir.notdirectory=The directory '%S' containing your OpenPGP keys is a file instead of a directory. # gpghomedir.notusable=Please fix the directory permissions or change the location of your GnuPG "home" directory. GnuPG cannot work correctly otherwise. #strings in pepTrustWords.js # pepTrustWords.cannotVerifyOwnId=Cannot verify p≡p Trustwords for own account. # pepTrustWords.cannotFindKey=Cannot find key for %S. # pepTrustWords.cannotStoreChange=Could not change trust for %S. # pepTrustWords.generalFailure=Cannot obtain trustwords for %S. # pepTrustWords.partnerFingerprint=Fingerprint for %S: #strings in mimeWkdHandler.jsm # wkdMessage.body.req=Your email provider processed your request to upload your public key to the OpenPGP Web Key Directory.\n\nPlease click the confirmation button in the Enigmail header to complete the publishing of your public key. # wkdMessage.body.process=This is an email related to the automatic processing to upload your public key to the OpenPGP Web Key Directory.\n\nYou do not need to take any manual action at this point. #strings in pepHandshake.js # pepPrivacyStatus.RatingBrokenSuggestion=Either you or the sender should resend the message. # pepPrivacyStatus.RatingHaveNoKeySuggestionOutgoing=If you composed this message, your key is not available. # pepPrivacyStatus.RatingMistrustSuggestion=Re-establish the connection with your communication partner and try to complete another handshake. # pepPrivacyStatus.RatingReliableSuggestion=Complete a handshake with your communication partner by exchanging trustwords in person or over the phone. A handshake is needed only once per partner and will ensure secure and trusted communication. # pepPrivacyStatus.RatingTrustedSuggestion=No action needed! # pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware this message may not be secure. # pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Please add the necessary information. # pepPrivacyStatus.RatingUnderAttackSuggestion=Separately verify the content of this message with your communication partner. # pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least secure. # pepPrivacyStatus.RatingUnencryptedSuggestion=Please ask your communication partner to use an encryption solution or install p≡p. # pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or no signature. Ask your communication partner to upgrade their encryption solution or install p≡p. # pepPrivacyStatus.RatingBrokenExplanation=This message has broken encryption or formatting. # pepPrivacyStatus.RatingHaveNoKeyExplanation=This message cannot be decrypted because the key is not available. # pepPrivacyStatus.RatingMistrustExplanation=This message has a communication partner that has previously been marked as mistrusted. # pepPrivacyStatus.RatingReliableExplanation=This message is secure but you still need to verify the identity of your communication partner. # pepPrivacyStatus.RatingTrustedExplanation=This message is secure and trusted. # pepPrivacyStatus.RatingUndefinedExplanation=This message does not contain enough information to determine if it is secure. # pepPrivacyStatus.RatingUnderAttackExplanation=This message is not secure and has been tampered with. # pepPrivacyStatus.RatingUnencryptedExplanation=This message is unsecure. # pepPrivacyStatus.RatingUnencryptedForSomeExplanation=This message is unsecure for some communication partners. # pepPrivacyStatus.RatingUnreliableExplanation=This message has unreliable protection. # pepPrivacyStatus.RatingBrokenText=Broken # pepPrivacyStatus.RatingHaveNoKeyText=Cannot Decrypt # pepPrivacyStatus.RatingMistrustText=Mistrusted # pepPrivacyStatus.RatingReliableText=Secure # pepPrivacyStatus.RatingTrustedText=Secure & Trusted # pepPrivacyStatus.RatingUndefinedText=Unknown # pepPrivacyStatus.RatingUnderAttackText=Under Attack # pepPrivacyStatus.RatingUnencryptedForSomeText=Unsecure for Some # pepPrivacyStatus.RatingUnencryptedText=Unsecure # pepPrivacyStatus.RatingUnreliableText=Unreliable Security # handshakeDlg.button.initHandshake=Handshake... # handshakeDlg.button.stopTrust=Stop Trusting # handshakeDlg.button.reTrust=Stop Mistrusting # handshakeDlg.label.outgoingMessage=Outgoing message # handshakeDlg.label.incomingMessage=Incoming message # handshakeDlg.error.noPeers=Cannot handshake without any correspondents. # handshakeDlg.error.noProtection=Please enable protection in order to use the Handshake function. # enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device # enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup #strings in autocrypt.jsm # autocrypt.setupMsg.subject=Autocrypt Setup Message # autocrypt.setupMsg.msgBody=To set up your new device for Autocrypt, please follow the instuctions that should be presented by your new device. # autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code presented on your old device, and then import the contained key into your keyring. #strings in upgradeInfo.html # upgradeInfo.doctitle=What's New in Enigmail v2.0? # upgradeInfo.welcome1=Welcome to the new Enigmail version 2.0! # upgradeInfo.welcome2=The release contains a lot of new and changed features. Please take a minute to find out what's new: # upgradeInfo.encSubject.title=Encrypting the Message Subject # upgradeInfo.encSubject.desc=We developed a new method that moves the email subject into the encrypted message, and replaces the visible subject with "Encrypted Message". Once such a message is decrypted, the original subject is replaced automatically. Hiding the subject is on by default; there is a preference to turn it off if you don't like it. (Note: this feature requires the message to be sent with PGP/MIME.) # upgradeInfo.buttons.title=Changed behavior of Encrypt and Sign Buttons # upgradeInfo.buttons.desc=The Encrypt and Sign buttons in the message composer window now work for both the OpenPGP and S/MIME protocols. If both algorithms are possible, then Enigmail will try to prefer the one for which all keys are available. # upgradeInfo.autocrypt.title=Support for Autocrypt # upgradeInfo.autocrypt.desc=Enigmail now supports Autocrypt, a new standard to distribute keys as part of sent messages. Enigmail automatically imports keys from Autocrypt-compliant messages, such that over time more and more emails can be encrypted. # upgradeInfo.pEp.title=New p≡p Junior Mode (Pretty Easy Privacy) # upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. You currently need to manually install p≡p for this purpose; this will change in a future release. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. # upgradeInfo.bottom.desc=Please visit our documentation for help on using Enigmail. # pep.missingGnuPG=In order to use Enigmail/p≡p, GnuPG is required. As we could not find it, we suggest to download and install it for you. #strings in enigmailAbout.html # aboutEnigmail.tabName=About Enigmail # aboutEnigmail.title=OpenPGP support provided by Enigmail # aboutEnigmail.team=Enigmail is developed by the Enigmail Team: # aboutEnigmail.projectLeader=Lead Developer: # aboutEnigmail.usability=Usability: # aboutEnigmail.documentation=Documentation: # aboutEnigmail.testing=Testing: # aboutEnigmail.userSupport=User Support: # aboutEnigmail.localization=Localization: See the Enigmail Language Packs page # aboutEnigmail.Credits=Credits: # aboutEnigmail.origAuthor=Original author of the Enigmail extension # aboutEnigmail.icons=Icons: # aboutEnigmail.formerMembers=Former team members: # aboutEnigmail.projectHosting=Project hosting: # aboutEnigmail.licenseSupportTitle=License & Support # aboutEnigmail.license=Enigmail OpenPGP is open source and licensed under the %S # aboutEnigmail.support=Support and download is available from www.enigmail.net. enigmail-2.0.8/lang/hr/help/000077500000000000000000000000001334302754500155765ustar00rootroot00000000000000enigmail-2.0.8/lang/hr/help/compose.html000066400000000000000000000100761334302754500201350ustar00rootroot00000000000000 Enigmail Help: Message Composition

Enigmail Help

Using Enigmail when composing messages

Enigmail menu in Mail/Compose window
Sign message
Enable/Disable sending signed mail. User is notified, if signing fails.
Encrypt message

Enable/Disable encryption to all recipient(s) before sending. User is notified, if encryption fails.

If Display selection when necessary is set in Preferences -> Key Selection tab, a list of keys will pop up if there are addresses in the list of recipients for the message for whom you have no public key.

If Never display OpenPGP key selection dialog is set in Preferences -> Key Selection tab, and there are addresses in the list of recipients for the message for whom you have no public key, the message will be sent unencrypted.

Use PGP/MIME for this message
Enable/Disable the use of PGP/MIME for this message.

If you know the recipient(s) can read mail using the PGP/MIME format, you should use it.

This feature is dependent on the settings in Preferences -> PGP/MIME tab being set to Allow to use PGP/MIME or Always use PGP/MIME.

Default composition options
  • Signing/Encryption Options...: shortcut to Account Settings -> OpenPGP Options.
  • Send options...: shortcut to Preferences -> Send tab.
  • Key selection options...: shortcut to Preferences -> Key Selection tab.
  • PGP/MIME options...: shortcut to Preferences -> PGP/MIME tab.
Undo encryption

If there is a failure when actually sending mail, such as the POP server not accepting the request, Enigmail will not know about it, and the encrypted message will continue to be displayed in the Compose window. Choosing this menu item will undo the encryption/signing, reverting the Compose window back to its original text.

As a temporary fix, this option may also be used to decrypt the quoted text when replying to encrypted messages. Enigmail should automatically decrypt the quoted message, but if that fails for some reason, you can use this menu item to force it.

Insert public key
insert ASCII-armored public key block at the current cursor location in the Compose window. You will be prompted for the email addresses of the key(s) to be inserted. Keys inserted in this manner will automatically be recognized at the receiving end by Enigmail. After key insertion, you may still choose to sign/encrypt the mail as needed. Also, do not insert more than one key block in a message; just specify multiple email addresses, separated by commas or spaces, when prompted.
Clear save passphrase
Clears cached passphrase. Useful if you have multiple passphrases.
Help
Displays Help information from the website (this page).

Further help is available on the Enigmail Help web page

enigmail-2.0.8/lang/hr/help/editRcptRule.html000066400000000000000000000116041334302754500210740ustar00rootroot00000000000000 Enigmail Help: Edit Per-Recipient Rule

Enigmail Help

Using the Enigmail Rules Editor: Edit Per-Recipient Rule

In the Rules Editor, you can specify defaults per recipient for enabling encryption, signing and PGP/MIME, and to define what OpenPGP key(s) to use. In this dialog, you can specify the rules for a single recipient, and for a group of recipients with very similar attributes.

Set Enigmail Rules for
Contains the email addresses of the recipients (without names, i.e. just an address like somebody@email.domain). You can specify several email addresses, separated by spaces. The address specified here can consist of only the domain section so that mail to any address at that domain will be matched, e.g. @email.domain will allow matching to body@email.domain, somebody@email.domain, anybody@email.domain, etc.
Apply rule if recipient ...
This modifies the matching of the email addresses. If multiple addresses are entered, the setting will apply to all. The examples below are based on body@email.domain entered in the Enigmail Rules field above.
  • Is exactly: with this setting, the rule will only trigger on emails to body@email.domain (exact, case insensitive matching).
  • Contains: with this setting, any email address containing the string is matched, e.g. anybody@email.domain or body@email.domain.net
  • Begins with: with this setting, any email address starting with the string is matched, e.g. body@email.domain.net, body@email.domain-name.com.
  • Ends with: with this setting, any email address ending with the string is matched, e.g. anybody@email.domain , somebody@email.domain.
Continue with the next rule for the matching address
Enabling this function will allow you to define a rule but not have to specify a KeyID in the Use the following OpenPGP keys: field, so that the email address is used to check for a key at the time of sending. Also, further rules for the same address(es) will be processed as well.
Do not check further rules for the matching address
Enabling this function stops processing any other rules for the matching address(es) if this rule is matched; i.e. rule processing continues with the next recipient.
Use the following OpenPGP keys:
Use the Select Key(s).. button to select the recipient keys to be used for encryption. As in the action above, no further rules for the matching address(es) are processed.
Default for Signing
Enable or disable message signing. This either uses or overrides what you have specified in the message composition window. The values are:
  • Never: disable signing, even if it was enabled in the message composition window (overrules the other values)
  • Yes, if selected from in Message Composition: leave signing as specified in the message composition window
  • Always: enable signing, even if it was not enabled in the message composition window
These signing settings are applied for all rules that match. If one of the rules disables signing, the message will not be signed, regardless of other rules that specify Always.
Encryption
Enable or disable message encryption. The allowed settings and their meaning are the same as for message signing.
PGP/MIME
Enable or disable the use of the PGP/MIME (RFC 3156) message encoding. If PGP/MIME is disabled, the messages are encoded using "inline PGP". The allowed values and their meaning are the same as for message signing.

The rules are processed in the order displayed in the list in the Per-Recipient Rules Editor. Whenever a rule matches a recipient and contains a OpenPGP Key ID, in addition to using the specified Key ID, the recipient is not considered anymore when processing further rules.


Further help is available on the Enigmail Per-Recipient Settings page

enigmail-2.0.8/lang/hr/help/help.html000066400000000000000000000103271334302754500174170ustar00rootroot00000000000000 Enigmail Help

Enigmail Help

Using Enigmail when reading messages

  • Decrypt button in main Mail window
    This button can be used for several purposes: decrypt, verify, or import public keys. Normally decryption/verification happens automatically, although this can be disabled through a preference. However, if this fails, usually a short error message will appear in the Enigmail status line. If you click the Decrypt button, you will be able to see a more detailed error message, including the output from the GnuPG command.
  • Pen and Key icons in Message Header display
    The Pen and Key icons in the Message Header display indicate if the message you are reading was signed and/or encrypted and if the signature is good, i.e. the message has not been changed since it was signed. If the message has been changed, the Pen icon will change to a Broken Pen to indicate that the signature is bad. Right clicking on either the Pen or Key icons will bring up a menu with the following options:
    • Enigmail Security info: allows you to view the output status from GnuPG for the message.
    • Copy Enigmail Security info: copies the output status from GnuPG to the clipboard; to paste into a reply message, etc.
    • View OpenPGP Photo ID: allows you to view the Photo ID of the person who sent the message, if they have a photo embedded in their Public Key. (This option will only be enabled if a Photo ID exists in their key.)
    • S/MIME Security info: allows you to view the S/MIME Security Info for the message.

    If you do not have keyserver-options auto-key-retrieve set in your gpg.conf file and you read a message which is signed or encrypted, you will see a Pen icon in the headers display area with a Question mark on it, the Enigmail status line in the headers area will say Part of the message signed; click pen icon for details and the message in the Message Pane will show all the OpenPGP message block indicators and the signature block.

    You may also see this if you have keyserver-options auto-key-retrieve set in your gpg.conf file and the OpenPGP key is not available on the default keyserver.

    Clicking on the Pen and Question mark icon will bring up a window advising that the key is unavailable in your keyring. Clicking on OK will bring up another window with a list of keyservers from which you can select to download the sender's public key from.

    To configure the list of keyservers you wish to use, go to Enigmail -> Preferences -> Basic tab and enter the keyserver addresses in the Keyserver(s): box, separated by a comma. The first keyserver in the list will be used as the default.

  • Opening encrypted attachments / importing attached OpenPGP keys
    Attachments named *.pgp, *.asc and *.gpg are recognized as attachments that can be handled specially by Enigmail. Right clicking on such an attachment enables two special menu items in the context menu: Decrypt and Open and Decrypt and Save. Use these two menu items if you want Enigmail to decrypt an attachment before opening or saving it. If an attachment is recognized as an OpenPGP key file, you are offered to import the keys it into your keyrings.

Further help is available on the Enigmail Help web page
If you have questions or comments about enigmail, please send a message to the Enigmail mailing list

Enigmail is open source and licensed under the Mozilla Public License

enigmail-2.0.8/lang/hr/help/initError.html000066400000000000000000000045521334302754500204470ustar00rootroot00000000000000 Enigmail Help: How to Resolve Problems with Initializing Enigmail

Enigmail Help

How to Resolve Problems with Initializing Enigmail

There are several reasons why initializing Enigmail does not succeed. The most common ones are described below; for more information please visit the Enigmail Support page.

GnuPG could not be found

In order for Enigmail to work, the tool GnuPG needs to be installed. If GnuPG cannot be found, then first make sure that the executable gpg.exe (on Windows; gpg on other platforms) is installed on your computer. If GnuPG is installed, and Enigmail cannot find it, then you need to manually set the path to GnuPG in the Enigmail Preferences (menu Enigmail > Preferences)

Enigmime failed to initialize

Enigmail works only if it is built using the same build environment as Thunderbird or SeaMonkey was built. This means that you can use the official Enigmail releases only if you use the official releases of Thunderbird or SeaMonkey provided by mozilla.org.

If you use a Thunderbird or SeaMonkey version coming from some other source (e.g. the provider of your Linux distribution), or if you built the application yourself, you should either use an Enigmail version built by the same source, or build Enigmail yourself. For building Enigmail, refer to the Source Code section on the Enigmail home page. Please don't file any bug report concerning this problem, it is not solvable.

Further help is available on the Enigmail Support Web Site.

enigmail-2.0.8/lang/hr/help/messenger.html000066400000000000000000000101421334302754500204520ustar00rootroot00000000000000 Enigmail Help: Message Reading

Enigmail Help

Using Enigmail when reading messages

Decrypt button in main Mail window
This button can be used for several purposes: decrypt, verify, or import public keys. Normally decryption/verification happens automatically, although this can be disabled through a preference. However, if this fails, usually a short error message will appear in the Enigmail status line. If you click the Decrypt button, you will be able to see a more detailed error message, including the output from the GnuPG command.
Pen and Key icons in Message Header display
The Pen and Key icons in the Message Header display indicate if the message you are reading was signed and/or encrypted and if the signature is good, i.e. the message has not been changed since it was signed. If the message has been changed, the Pen icon will change to a Broken Pen to indicate that the signature is bad. Right clicking on either the Pen or Key icons will bring up a menu with the following options:
  • Enigmail Security info: allows you to view the output status from GnuPG for the message.
  • Copy Enigmail Security info: copies the output status from GnuPG to the clipboard; to paste into a reply message, etc.
  • View OpenPGP Photo ID: allows you to view the Photo ID of the person who sent the message, if they have a photo embedded in their Public Key. (This option will only be enabled if a Photo ID exists in their key.)
  • S/MIME Security info: allows you to view the S/MIME Security Info for the message.

If you do not have keyserver-options auto-key-retrieve set in your gpg.conf file and you read a message which is signed or encrypted, you will see a Pen icon in the headers display area with a Question mark on it, the Enigmail status line in the headers area will say Part of the message signed; click pen icon for details and the message in the Message Pane will show all the OpenPGP message block indicators and the signature block.

You may also see this if you have keyserver-options auto-key-retrieve set in your gpg.conf file and the OpenPGP key is not available on the default keyserver.

Clicking on the Pen and Question mark icon will bring up a window advising that the key is unavailable in your keyring. Clicking on OK will bring up another window with a list of keyservers from which you can select to download the sender's public key from.

To configure the list of keyservers you wish to use, go to Enigmail -> Preferences -> Basic tab and enter the keyserver addresses in the Keyserver(s): box, separated by a comma. The first keyserver in the list will be used as the default.

Opening encrypted attachments / importing attached OpenPGP keys
Attachments named *.pgp, *.asc and *.gpg are recognized as attachments that can be handled specially by Enigmail. Right clicking on such an attachment enables two special menu items in the context menu: Decrypt and Open and Decrypt and Save. Use these two menu items if you want Enigmail to decrypt an attachment before opening or saving it. If an attachment is recognized as an OpenPGP key file, you are offered to import the keys it into your keyrings.

Further help is available on the Enigmail Help web page

enigmail-2.0.8/lang/hr/help/rulesEditor.html000066400000000000000000000060331334302754500207670ustar00rootroot00000000000000 Enigmail Help: Rules Editor

Enigmail Help

Using the Enigmail Rules Editor

In the Rules Editor, you can specify defaults per recipient for enabling encryption, signing and PGP/MIME, and to define what OpenPGP key(s) to use. Each rule consists of 5 fields and is represented on a single line:

Email
The e-mail(s) from the To:, Cc: and Bcc: fields to match. The matching works on substrings (Further details can be found in the Edit Rule dialog)
OpenPGP Key(s)
a list of OpenPGP Key ID's to use for the recipient
Sign
enable or disable message signing. This either uses or overrides what you have specified in the message composition window. The values are:
  • Never: disable signing, even if it was enabled in the message composition window (overrules the other values)
  • Possible: leave signing as specified in the message composition window
  • Always: enable signing, even if it was not enabled in the message composition window

These signing settings are applied for all rules that match. If one of the rules disables signing, the message will not be signed, regardless of other rules that specify Always.

Encrypt
enable or disable message encryption. The allowed settings and their meaning are the same as for message signing.
PGP/MIME
enable or disable the use of the PGP/MIME (RFC 3156) message encoding. If PGP/MIME is disabled, the messages are encoded using "inline PGP". The allowed values and their meaning a re the same as for message signing.

The rules are processed in the order displayed in the list. Whenever a rule matches a recipient and contains a OpenPGP Key ID, in addition to using the specified Key ID, the recipient is not considered anymore when processing further rules.

Note: The rule editor is not yet complete. It is possible to write some more advanced rules by directly editing the rules file (these rules should then not be edited anymore in the rule editor). Further information for directly editing the file is available on the Enigmail Homepage


Further help is available on the Enigmail Help web page

enigmail-2.0.8/lang/hr/help/sendingPrefs.html000066400000000000000000000047571334302754500211300ustar00rootroot00000000000000 Enigmail Help: Edit OpenPGP Rule

Enigmail Help

Defining Preferences to Send Encrypted

In the Sending Preferences you can choose the general model and preferences for encryption.

Convenient Encryption
With these settings, emails are encrypted without confirmation whenever possible.

This setup is appropriate, if you just want to improve your privacy by sending emails encyrpted instead of unencrypted if that's possible.

The effect is like sending emails as letters instead of postcards. Unlike postcards, letters usually hide their contents while in transit.

Note however that as with letters you can't be sure that nobody is opening the letter while it is in transit (although, some technical effort is necessary for that).

A concrete risk is that you accidentally use "faked keys" you got from somewhere or somebody claiming that the key belongs to the person you want to send emails to. To avoid this risk, you can either use the trust model of PGP (see below) or you should always verify, whether the fingerprint of a public key is correct.

Manual Encryption
This option allows you to specify the different preferences for encryption according to your needs. You can specify
  • whether replies to encrypted/signed emails should automatically also be encrypted/signed-
  • whether to use the trust model of Enigmail to accept keys (this means that to use a key you either have to sign the key or have enough other people you trust having signed the key).
  • whether you want to automatically send emails encrypted if all keys are accepted.
  • whether and when you want to finally confirm sending an email.
If it is important for you that content you send encrypted can't be read by other people or organizations, you should use the manual preferences at least choose the option to accept keys only if you or other people signed them. While this model reduces the risk of using faked keys, it requires that you actively sign keys and declare owner trust using the key managament dialog. enigmail-2.0.8/lang/hu/000077500000000000000000000000001334302754500146515ustar00rootroot00000000000000enigmail-2.0.8/lang/hu/am-enigprefs.properties000066400000000000000000000001271334302754500213440ustar00rootroot00000000000000# Strings used in the Mozill AccountManager prefPanel-enigprefs=OpenPGP adatbiztonság enigmail-2.0.8/lang/hu/enigmail.dtd000066400000000000000000001725021334302754500171420ustar00rootroot00000000000000 Mozilla Public License 2.0 licenc alatt lett közreadva."> †karaktereket az e-mail címek megadásához"> †karaktereket az e-mail címek megadásához a GnuPG számára. Tiltsa le ezt a beállítást, ha régi Hushmail kulcsokat használ."> MEGJEGYZÉS: A kulcskészítés hosszabb ideig is eltarthat. Ne lépjen ki a levelezÅ‘bÅ‘l, amíg a kulcskészítés folyamatban van. Ha aktívan használja a számítógépet a kulcskészítés közben, a szükséges véletlenszerű adatok gyorsabban keletkeznek, így a folyamat gyorsul. A program értesítést ad a kulcs elkészültérÅ‘l."> †formátum helytelen."> MEGJEGYZÉS: A kulcskészítés több percet is igénybe vehet. Ne lépjen ki az alkalmazásból a kulcskészítés alatt. A kulcspár elkészültekor egy tájékoztató ablak fog megjelenni a képernyÅ‘n."> Megjegyzés: Az Enigmail minden e-mail esetén ellenÅ‘rzi az aláírást, figyelmen kívül hagyva a postafiókok és azonosítók beállításait."> nyilvános kulcs-át odaadhatjamásoknak, akik így tudnak Önnek titkosított levelet küldeni. A nyilvános kulcs bárkinek odaadható."> titkos kulcs-át kizárólag Ön használja. Ezzel tudja visszafejteni az Önnek küldött leveleket és aláírni az Ön által küldött leveleket. Soha, semmilyen körülmény között ne adja oda másnak."> titkos kulcs-át kizárólag Ön használja. Ezzel tudja visszafejteni az Önnek küldött leveleket és aláírni az Ön által küldött leveleket. Soha, semmilyen körülmény között ne adja oda másnak. A titkos kulcs biztonságos tárolásához jelmondatot kell megadnia a következÅ‘ két párbeszédablakon."> jelmondat a jelszó, amit a titkos kulcsát védi. Megvédi titkos kulcsát az illetéktelen használattól."> kerülendÅ‘."> adatok mentése a régi számítógéprÅ‘l az Enigmail Beállítások közül elérhetÅ‘ MentÅ‘ Tündér segítségével, adatok betöltése az új számítógépen ennek a tündérnek a segítségével. "> Köszönjük, hogy az Enigmail programot használja."> adatok mentése a régi számítógéprÅ‘l ezen varázsló segítségével, adatok betöltése az új számítógépen a Beállításvarázsló segítségével. "> enigmail-2.0.8/lang/hu/enigmail.properties000066400000000000000000001630061334302754500205620ustar00rootroot00000000000000Enigmail=Enigmail ##################################################################### # Strings used within enigmailCommon.js and enigmailCommon.jsm ##################################################################### enigAlert=Enigmail figyelmeztetés enigConfirm=Enigmail jóváhagyás enigInfo=Enigmail információ enigError=Enigmail hiba enigPrompt=Enigmail kérdés dlgYes=&Igen dlgNo=&Nem dlgKeepSetting=Emlékezzen a válaszaimra, és ne kérdezze meg újra dlgNoPrompt=Ne mutassa újra ezt az ablakot dlg.button.delete=&Törlés dlg.button.cancel=&Mégse dlg.button.close=&Bezárás dlg.button.continue=Foly&tatás dlg.button.skip=&Kihagyás dlg.button.overwrite=&Felülírás dlg.button.view=&Megtekintés dlg.button.retry=Új&ra dlg.button.ignore=&MellÅ‘zés dlg.button.install=&Telepítés dlg.button.ok=&OK repeatPrefix=\n\nAz értesítés ismétlÅ‘dik még %S repeatSuffixSingular=alkalommal. repeatSuffixPlural=alkalommal. noRepeat=\n\nEz az értesítés nem ismétlÅ‘dik, amíg nem frissíti az Enigmail programot. pgpNotSupported=Úgy tűnik, hogy az Enigmail a PGP 6.x rendszerrel dolgozik együtt.\n\nSajnos a PGP 6.x számos esetben akadályozza az Enigmail helyes működését. Emiatt az Enigmail nem támogatja többé a PGP 6.x rendszert. Használja inkább a GnuPG (GPG) csomagot.\n\nHa szüksége van segítségre a GPG-re történÅ‘ átálláshoz, nézze meg az Enigmail honlapján a Help szakaszt. initErr.howToFixIt=Az Enigmail használatához szükség van a GnuPG programra. Ha még nem telepítette a GnuPG programot, akkor a legegyszerűbben a „Beállítás Tündér†gombra kattintva teheti meg. initErr.setupWizard.button=Beállítá&s Tündér passphraseCleared=A jelmondat törölve. cannotClearPassphrase=A jelmondatok kezeléséhez a nem szabványos programot (például: gnome-keyring)használja, ezért a kulcstároló ürítése nem lehetséges az Enigmail programban. noPhotoAvailable=Nem érhetÅ‘ el fénykép debugLog.title=Enigmail hibanapló error.photoPathNotReadable=A(z) „%S†fénykép elérési útja nem olvasható. generalError=Error: %S # Strings in configure.jsm enigmailCommon.versionSignificantlyChanged=Az Enigmail új verziójának beállításai jelentÅ‘sen eltérnek a régebbi verziótól. A régi beállítások átvétele az új verzióba megtörtént, mindazonáltal nem minden esetben működik tökéletesen. EllenÅ‘rizzen minden beállítást az új verzióban. enigmailCommon.checkPreferences=Beállítások ellenÅ‘rzése… preferences.defaultToPgpMime=Megváltozott az Enigmail alapértelmezett üzenetkódolása a beágyazott PGP beállításról a PGP/MIME beállításra. Ajánlott az új alapértelmezett érték megtartása.\n\nHa ennek ellenére a beágyazott PGP szeretné használni, akkor azt a Postafiók beállításai párbeszédablakban az \nOpenPGP biztonság részben teheti meg. ##################################################################### # Strings in enigmailAbout.js ##################################################################### usingVersion=A használatban levÅ‘ Enigmail verziószáma: %S enigmailPepVersion=Enigmail/p≡p verzió: %S usingAgent=A titkosításhoz és visszafejtéshez a(z) %1$S program %2$S példányát használja. agentError=HIBA: Sikertelen az Enigmail alapszolgáltatás elérése. ##################################################################### # Strings in enigmailKeygen.js ##################################################################### accessError=Hiba az Enigmail szolgáltatás elérésekor onlyGPG=A kulcskészítés csak a GPG-vel működik (PGP-vel nem). keygenComplete=A kulcs elkészült. A következÅ‘ azonosító tartozik az aláíráshoz: „%Sâ€. revokeCertRecommended=ErÅ‘sen ajánljuk, hogy készítsen visszavonási tanúsítványt a kulcsához. Ez a tanúsítvány használható a kulcs érvénytelenítéséhez abban az esetben, ha a titkos kulcs elveszik vagy megsérül. Szeretné most létrehozni a visszavonási tanúsítványt? keyMan.button.generateCert=&Tanúsítvány létrehozása genCompleteNoSign=A kulcs elkészült! genGoing=A kulcs készítése már folyamatban. passNoMatch=A megadott jelmondatok nem egyeznek, adja meg újra passCheckBox=Jelölje be a négyzetet, ha nem ad meg a kulcshoz jelmondatot passUserName=Adja meg a felhasználónevet ehhez az azonosítóhoz keygen.missingUserName=Nincs a megadott néven szereplÅ‘ postafiók. A Postafiók beállításainál adja meg nevét a „Név†mezÅ‘ben. keygen.passCharProblem=A jelmondatban különleges (például ékezetes) karaktereket használt. Sajnos ez más alkalmazásoknál gondot okozhat. Válasszon olyan jelmondatot, amelyben csak ezek a karakterek szerepelnek:\na-z A-Z 0-9 /.;:-,!?(){}[]%* passSpaceProblem=Technikai okokból a jelmondat nem kezdÅ‘dhet vagy végzÅ‘dhet szóköz karakterrel. changePassFailed=A jelmondat megváltoztatása nem sikerült. keyConfirm=Létre kíván hozni nyilvános és titkos kulcsokat „%S†részére? keyMan.button.generateKey=&Kulcs létrehozása keyAbort=Megszakítja a kulcs létrehozását? keyMan.button.generateKeyAbort=&Megszakítás keyMan.button.generateKeyContinue=&Folytatás expiryTooLong=Nem hozhat létre 100 évnél késÅ‘bb lejáró kulcsot. expiryTooLongShorter=Nem hozhat létre 90 évnél késÅ‘bb lejáró kulcsot. expiryTooShort=A kulcsnak legalább 1 napig érvényesnek kell lennie. keyGenFailed=A kulcs létrehozása nem sikerült. EllenÅ‘rizze az Enigmail konzolban a részleteket (Enigmail menü → Hibakeresési beállítások). setKeyExpirationDateFailed=A lejárati idÅ‘ nem változtatható meg # Strings in enigmailMessengerOverlay.js securityInfo=Enigmail biztonsági adatok\n\n enigHeader=Enigmail: enigContentNote=Enigmail: *Az üzenet mellékletei nem lettek aláírva vagy titkosítva*\r\n\r\n possiblyPgpMime=Lehetséges, hogy az üzenet PGP/MIME-mal titkosított vagy aláírt. Kattintson a „Visszafejtés†gombra az ellenÅ‘rzéshez. saveAttachmentHeader=Enigmail: Visszafejtett melléklet mentése noTempDir=Nincs ideiglenes könyvtár a mentéshez.\nÃllítsa be a „TEMP†környezeti változó értékét. attachmentPgpKey=A megnyitott melléklet („%Sâ€) egy OpenPGP-kulcsfájl.\n\nVálassza az „Importálás†gombot a kulcs rögzítéséhez, vagy a „Megtekintés†gombot a fájl tartalmának böngészÅ‘ablakban történÅ‘ megtekintéséhez. beginPgpPart=********* *A TITKOSÃTOTT vagy ALÃÃRT TARTALOM KEZDETE* ********* endPgpPart=********** *A TITKOSÃTOTT vagy ALÃÃRT TARTALOM VÉGE* *********** notePartEncrypted=Enigmail: *A levél ezen része NINCS aláírva vagy titkosítva* noteCutMessage=Enigmail: *Az üzenetben több blokk szerepel -- visszafejtés és ellenÅ‘rzés megszakítva* decryptOkNoSig=Figyelmeztetés!\n\nA visszafejtés sikerült, de az aláírást nem lehetett megfelelÅ‘en ellenÅ‘rizni. msgOvl.button.contAnyway=&Folytatás mindenképp signature.verifiedOK=A(z) „%S†melléklet aláírása sikeresen ellenÅ‘rizve lett signature.verifyFailed=A(z) „%S†melléklet aláírása nem ellenÅ‘rizhetÅ‘ attachment.noMatchToSignature=A(z) „%S†melléklet aláírása nem jó attachment.noMatchFromSignature=A(z) „%S†aláírásfájlhoz nem található melléklet fixBrokenExchangeMsg.failed=Az üzenet megjavítása nem sikerült. enigmail.msgViewColumn.label=Enigmail enigmailPep.msgViewColumn.label=Enigmail/p≡p # wksNoIdentity=This key is not linked to any of your email accounts. Please add an account for at least one of the following email addresse(s):\n\n%S wksConfirmSuccess=Jóváhagyó üzenet elküldve. wksConfirmFailure=Jóváhagyó üzenet elküldése nem sikerült. # autocrypt.importSetupKey.accountPreconfigured=Your account is already correctly configured for Autocrypt.\n\nDo you really want to overwrite your settings with this setup message? # autocrypt.importSetupKey.selfCreated=This message was created by your currently running instance of Enigmail.\n\nPlease switch to the email client to which you want to transfer the settings, and click on the message on that email client to import the settings. # autocrypt.importSetupKey.invalidMessage=Error - could not read setup message. The message seems to be corrupted. Please try to create a new setup message on your "other" device. # autocrypt.importSetupKey.invalidKey=Error - the key could not be imported. The key is either not supported by your version of GnuPG, or it got corrupted. # autocrypt.importSetupKey.wrongPasswd=The password you entered is wrong. Do you want to retry? # autocrypt.importSetupKey.success=The Autocrypt setup message was processed successfully. Autocrypt is now available for your account '%S'. ##################################################################### # Strings in enigmailMsgComposeOverlay.js ##################################################################### keysToExport=Válasszon beszúrandó OpenPGP-kulcsokat keysToUse=OpenPGP-kulcsok választása %S számára pubKey=%S nyilvános kulcsa\n windowLocked=SzerkesztÅ‘ablak zárolva; küldés megszakítva sendUnencrypted=Enigmail indítási hiba.\nElküldi titkosítás nélkül az üzenetet? composeSpecifyEmail=Adja meg az elsÅ‘dleges e-mail címét, amely a kimenÅ‘ levelek aláírásának kulcsaként lesz kiválasztva.\n Ha üresen hagyja, úgy a levél feladójának címe lesz kiválasztva az aláírás kulcsaként. sendingHiddenRcpt=Ennek az üzenetnek rejtett másolat címzettjei is vannak. Amennyiben az üzenet titkosításra kerül, a rejtett másolat címzettjei el lesznek rejtve, de néhány termék (például: PGP Corp.) felhasználója nem tudja majd visszafejteni az üzenetet. Ennek megfelelÅ‘en nem javasolt rejtett másolat címzetteket megadni a titkosított üzenetekben. sendWithHiddenBcc=Rejtett másolat címzettjeinek elrejtése sendWithShownBcc=Hagyományos titkosítás sendingNews=Titkosított üzenetküldés megszakítva.\n\nAz üzenetet nem lehet titkosítani, mivel hírcsoport is szerepel a címzettek között. Küldje el ismét az üzenetet titkosítás nélkül. sendToNewsWarning=FIGYELMEZTETÉS: Titkosított üzenetet szeretett volna elküldeni egy hírcsoportnak.\n\nEz lehet, hogy nem helyes cselekedet, mert csak akkor elfogadható, ha a hírcsoport összes tagja vissza tudja fejteni az üzenetet. Például az üzenet a hírcsoport összes tagjának nyilvános kulcsával kerül titkosításra. Csak akkor küldje el ezt az üzenetet, ha valóban tudja, hogy mit csinál.\n\nKívánja folytatni? hasHTML=HTML-levél figyelmeztetés:\nAz üzenet tartalmazhat HTML tartalmat, ami megakadályozhatja az aláírást, illetve a titkosítást. A jövÅ‘ben ennek elkerülése végett használja a SHIFT billentyűt, amikor az Új üzenet/Válasz/Továbbítás gombokra kattint, hogy a küldéskor egyszerű levél legyen.\nHa a levél automatikus aláírása használatban van, be kell állítani a postafióknál, hogy a „Levelek írása HTML formátumban†jelölÅ‘négyzet ki legyen kapcsolva. strippingHTML=Az üzenet HTML formázásokra vonatkozó információkat tartalmaz, ami törlÅ‘dik az egyszerű szöveggé történÅ‘ átalakításkor, amire az aláíráskor/titkosításkor kerül sor. Szeretné folytatni? msgCompose.button.sendAnyway=Ü&zenet küldése attachWarning=A levélhez csatolt állomány nem helyi, ezért nem lehet titkosítani. A melléklet titkosításához elÅ‘bb tárolja le az állományt a saját gépére, majd ez után csatolja a levélhez. Folytatni kívánja a figyelmeztetés figyelmen kívül hagyásával? quotedPrintableWarn=Engedélyezte a „quoted-printable†kódolást a levélküldéshez. Ez a levele téves visszafejtését, illetve ellenÅ‘rzését okozhatja.\nSzeretné kikapcsolni a „quoted-printable†alapú üzenetküldést most? minimalLineWrapping=Beállította a sortördelést %S karakterre. A helyes titkosításhoz, illetve aláíráshoz ennek az értéknek legalább 68-nak kell lennie.\nSzeretné átállítani a sortördelést 68 karakterre most? warning=Figyelem signIconClicked=Manuálisan módosította a postafiók Enigmail beállítását! Amennyiben folytatja a levél írását, úgy a postafiókhoz beállított Enigmail funkció (titkosítás, aláírás) érvényét veszti. errorOwnKeyUnusable=Az aktuális azonosítónál beállított „%S†kulcs nem használható az OpenPGP számára.\n\nGyÅ‘zÅ‘djön meg róla, hogy a használandó kulcs érvényes, nem lejárt OpenPGP kulcs, és ellenÅ‘rizze, hogy Postafiók beállításainál megfelelÅ‘ kulcs van megadva.\nHa a kulcs nem járt le, akkor ellenÅ‘rizze, hogy a tulajdonos megbízhatóság teljesen- vagy véglegesen megbízhatóra van állítva. msgCompose.cannotSaveDraft=Hiba lépett fel a piszkozat mentése közben # msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information - partially encrypted email. # msgCompose.partiallyEncrypted.mimeMsg=The message you are replying to contained both unencrypted and encrypted parts. Some encrypted message parts are invisible to you.\n\nIf the sender was not able to decrypt the hidden message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nWe recommend that you don't reply to the message, but create a new message containing your answer. # msgCompose.partiallyEncrypted.inlinePGP=The message you are replying to contained both unencrypted and encrypted parts. If the sender was not able to decrypt some message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nPlease consider removing all quoted text from your reply to this sender. msgCompose.internalEncryptionError=BelsÅ‘ hiba: az ígért titkosítási támogatás le van tiltva msgCompose.internalError=BelsÅ‘ hiba történt. msgCompose.toolbarTxt.signAndEncrypt=Ez az üzenet alá lesz írva és titkosítva lesz msgCompose.toolbarTxt.signOnly=Ez az üzenet alá lesz írva msgCompose.toolbarTxt.encryptOnly=Ez az üzenet titkosítva lesz msgCompose.toolbarTxt.noEncryption=Ez az üzenet aláírás nélküli és titkosítatlan lesz msgCompose.toolbarTxt.disabled=Az Enigmail le van tiltva a kijelölt postafiókhoz msgCompose.protectSubject.tooltip=Üzenet tárgyának védelme msgCompose.noSubjectProtection.tooltip=Ne védje az üzenet tárgyát msgCompose.encryptedSubjectStub=Titkosított üzenet msgCompose.protectSubject.dialogTitle=Be kívánja kapcsolni az üzenet tárgyának védelmét? # msgCompose.protectSubject.question=Regular encrypted emails contain the unredacted subject.\n\nWe have established a standard to hide the original subject in the encrypted message\nand replace it with a dummy text, such that the subject is only visible after the email is decrypted.\n\nDo you want to protect the subject in encrypted messages? msgCompose.protectSubject.yesButton=&Tárgy védelme msgCompose.protectSubject.noButton=Tárgy védelmének &kikapcsolása msgCompose.detailsButton.label=Részletek… msgCompose.detailsButton.accessKey=R msgCompose.pepSendUnknown=Ismeretlen msgCompose.pepSendUnsecure=Nem biztonságos msgCompose.pepSendSecure=Biztonságos msgCompose.pepSendTrusted=Biztonságos és megbízható # pep.alert.disabledForIdentity=p≡p is disabled for the current identity. Please enable p≡p via the Enigmail/p≡p preferences. # pep.alert.weakReply=You’re about to forward or reply to a secure message as insecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? # note: should end with double newline: sendAborted=Küldés művelet megszakítva.\n\n # details: keyNotTrusted=Nem eléggé megbízható kulcs: „%S†keyNotFound=Nem található a kulcs: „%S†keyRevoked=A(z) „%S†kulcs vissza lett vonva keyExpired=A(z) „%S†kulcs lejárt statPGPMIME=PGP/MIME statSMIME=S/MIME statSigned=ALÃÃRT statEncrypted=TITKOSÃTOTT statPlain=NINCS ALÃÃRVA ÉS TITKOSÃTATLAN offlineSave=Mentse a(z) %1$S üzenetet %2$S részére a Postázandó üzenetek közé? onlineSend=Küldje el a(z) %1$S üzenetet %2$S részére? encryptKeysNote=Megjegyzés: az üzenet titkosítva van a következÅ‘ felhasználói azonosítókkal/kulcsokkal: %S hiddenKey= signFailed=Hiba az Enigmail programban: titkosítási illetve aláírási hiba. Elküldi a levelet titkosítás nélkül? msgCompose.button.sendUnencrypted=&Titkosítatlan üzenet küldése recipientsSelectionHdr=Válassza ki a címzetteket a titkosításhoz configureNow=Még nem állította be az Enigmail védelmet a kijelölt azonosítóhoz. Szeretné most megtenni? # encryption/signing status and associated reasons: encryptMessageAuto=Üzenet titkosítása (auto) encryptMessageNorm=Üzenet titkosítása signMessageAuto=Üzenet aláírása (auto) signMessageNorm=Üzenet aláírása encryptOff=Titkosítás: KI encryptOnWithReason=Titkosítás: BE (%S) encryptOffWithReason=Titkosítás: KI (%S) encryptOn=Titkosítás: BE signOn=Aláírás: BE signOff=Aláírás: KI signOnWithReason=Aláírás: BE (%S) signOffWithReason=Aláírás: KI (%S) reasonEnabledByDefault=mindig bekapcsolva reasonManuallyForced=kézzel kényszerítve reasonByRecipientRules=címzettenkénti szabállyal kényszerítve reasonByAutoEncryption=automatikus titkosítással kényszerítve reasonByConflict=a címzettenkénti szabályok ütközése miatt reasonByEncryptionMode=az automatikus titkosítás miatt # should not be used anymore: encryptYes=A levél titkosítva lesz encryptNo=A levél nem lesz titkosítva # should not be used anymore: signYes=A levél alá lesz írva signNo=A levél nem lesz aláírva # PGP/MIME status: pgpmimeNormal=Protokoll: PGP/MIME inlinePGPNormal=Protokoll: Beágyazott PGP smimeNormal=Protokoll: S/MIME pgpmimeAuto=Protokoll: PGP/MIME (auto) inlinePGPAuto=Protokoll: Beágyazott PGP (auto) smimeAuto=Protokoll: S/MIME (auto) # should not be used anymore pgpmimeYes=&PGP/MIME használatával pgpmimeNo=Beágyazott PGP használatával # Attach own key status (tooltip strings): attachOwnKeyNo=A saját kulcs nem lesz mellékelve. attachOwnKeyYes=A saját kulcs mellékelve lesz. attachOwnKeyDisabled=A saját kulcs nem mellékelhetÅ‘. A szolgáltatás engedélyezéséhez\nki kell választania egy kulcsot a Postafiók beállításai párbeszédablakban az OpenPGP részben. rulesConflict=A címzettenkénti szabályok többszörösen egyeznek:\n%S\n\nElküldi az üzenetet ezekkel a beállításokkal? msgCompose.button.configure=&Beállítás msgCompose.button.send=Üzenet küldé&se msgCompose.button.save=Üzenet &mentése # Strings in enigmailMsgHdrViewOverlay.js keyNeeded=%S nyilvános kulcs szükséges az aláírás ellenÅ‘rzéséhez keyUsed=%S nyilvános kulcs szükséges az aláírás ellenÅ‘rzéséhez clickDecrypt=; kattintson a „Visszafejtés†gombra clickDecryptRetry=; kattintson a „Visszafejtés†gombra az ismétléshez clickDetailsButton=; További információkért kattintson a „Részletek†gombra clickImportButton=; kattintson az „Importálás†gombra a kulcs letöltéséhez keyTypeUnsupported=; ezt a kulcstípust nem támogatja a telepített GnuPG verzió msgPart=A levél része: %S msgSigned=aláírt msgSignedUnkownKey=ismeretlen kulccsal aláírt msgEncrypted=titkosított msgSignedAndEnc=aláírt és titkosított unverifiedSig=Nem ellenÅ‘rzött aláírás incompleteDecrypt=Visszafejtés nem teljes needKey=Hiba – Titkos kulcs szükséges az üzenet visszafejtéséhez failedDecrypt=Hiba – Visszafejtés sikertelen badPhrase=Hiba – Rossz jelmondat failedDecryptVerify=Hiba – A visszafejtés és az ellenÅ‘rzés sikertelen mdcError=Hiba – Az üzenetet nem látták el integritásvédelemmel viewInfo=; további részletek: „Nézet → Üzenet biztonsági adatai†decryptedMsg=Visszafejtett üzenet decryptedMsgWithFormatError=Üzenet visszafejtése (visszaállítás hibás PGP levélformátumból, amelyet valószínűleg egy régi Exchange kiszolgáló okozott, így az eredménye esetleg nem lesz tökéletes) usedAlgorithms=Alkalmazott algoritmus: %S és %S pepStatusInfo.text=p≡p Üzenet állapota. # pepStatusInfo.title.m3=Under Attack # pepStatusInfo.info.m3=This message is not secure and has been tampered with. # pepStatusInfo.title.m1=Mistrusted # pepStatusInfo.info.m1=This message has a communication partner that has previously been marked as mistrusted pepStatusInfo.title.r0=Ismeretlen # pepStatusInfo.info.r0=This message does not contain enough information to determine if it is secure. pepStatusInfo.title.r1=Nem visszafejthetÅ‘ # pepStatusInfo.info.r1=This message cannot be decrypted because the key is not available. pepStatusInfo.title.r2=Nem visszafejthetÅ‘ # pepStatusInfo.info.r2=This message cannot be decrypted because the key is not available. pepStatusInfo.title.r3=Nem biztonságos pepStatusInfo.info.r3=Ez az üzenet nem biztonságos. pepStatusInfo.title.r4=Nem biztonságos néhány címzettnek pepStatusInfo.info.r4=Ez az üzenet nem biztonságos néhány címzett számára. pepStatusInfo.title.r5=Nem megbízható biztonság pepStatusInfo.info.r5=Ez az üzenet nem megbízható védelemmel rendelkezik. # pepStatusInfo.title.r6=Secure... # pepStatusInfo.info.r6=This message is secure but you still need to verify the identity of your communication partner. # pepStatusInfo.title.r7=Secure & Trusted # pepStatusInfo.info.r7=This message is secure and trusted. pepStatusInfo.color.green=Zöld pepStatusInfo.color.yellow=Sárga pepStatusInfo.color.red=Vörös # pepRevokeTrust.question=Do you really want to cancel the trust for %S? # pepRevokeMistrust.question=Do you really want to re-trust the key for %S? pepRevokeTrust.doRevoke=&Mégse megbízható # wksConfirmationReq=Web Key Directory Confirmation Request # wksConfirmationReq.message=This message has been sent by your email provider to confirm deployment of your OpenPGP public key\nin their Web Key Directory.\nProviding your public key helps others to discover your key and thus being able to encrypt messages to you.\n\nIf you want to deploy your key in the Web Key Directory now, please click on the button "Confirm Request" in the status bar.\nOtherwise, simply ignore this message. # wksConfirmationReq.button.label=Confirm Request # autocryptSetupReq=Perform Autocrypt Setup autocryptSetupReq.button.label=Telepítés indítás # autocryptSetupReq.setupMsg.desc=This message contains all information to transfer your Autocrypt settings along with your secret key securely from your original device. # autocryptSetupReq.setupMsg.backup=You can keep this message and use it as a backup for your secret key. If you want to do this, you should write down the password and store it securely. # autocryptSetupReq.message.import=To import the settings and key(s) in Enigmail, please click on the "Start Setup" button in the status bar. # autocryptSetupReq.message.sent=Please click on the message on your new device and follow the instuctions to import the settings. # strings in pref-enigmail.js # oldGpgVersion20=Enigmail initialization failed.\n\nYou are using GnuPG version %1$S, which is not supported anymore. Enigmail requires GnuPG version %2$S or newer. Please upgrade your GnuPG installation, or Enigmail will not work. locateGpg=GnuPG program elérési útja invalidGpgPath=GnuPG nem indítható a megadott útvonalról. Az Enigmail kikapcsolt állapotba kerül mindaddig, amíg a GnuPG útvonala nincs kijavítva, vagy az alkalmazás újra nem indul. warningsAreReset=A figyelmeztetések törölve lettek. prefs.gpgFound=A talált GnuPG helye: %S prefs.gpgNotFound=GnuPG nem található prefs.warnAskNever=Figyelmeztetés: Az opció kiválasztása mindenféle további figyelmeztetés nélkül hatással lesz a nem titkosított levelekre, ha nincs kulcs valamelyik címzettnél -- Enigmail nem fogja értesíteni, ha ez történik. prefs.warnIdleTimeForUnknownAgent=Nem sikerült csatlakozni a gpg-agent programhoz. ElÅ‘fordulhat hogy az Ön rendszere speciális eszközt – gnome-keyring vagy seahorse-agent – használ a jelmondatok kezeléséhez. Sajnos az Enigmail így nem tudja befolyásolni az jelmondatok lejáratát az Ön által használt eszközben. Ennek megfelelÅ‘en az Enigmail programban megadott lejárati idÅ‘k figyelmen kívül lesznek hagyva. prefEnigmail.oneKeyserverOnly=Hiba – Csak egy kulcskiszolgálót adhat meg a hiányzó OpenPGP-kulcsok automatikus letöltéséhez. # Strings used in core.jsm # (said file also re-uses some strings from above) enterAdminPin=Ãrja be az intelligens kártya adminisztrátori PIN-kódját. enterCardPin=Ãrja be az intelligens kártya PIN-kódját. notInit=Hiba – Az Enigmail szolgáltatás még nem indult el badCommand=Hiba – A titkosító parancs sikertelen volt cmdLine=parancssor és kimenet: notRequired=Hiba – Titkosítás nem szükséges notComplete=Hiba – A kulcskészítés még nem fejezÅ‘dött be invalidEmail=Hiba – Érvénytelen email cím(ek) noPassphrase=Hiba – Nincs jelmondat megadva noPGPblock=Hiba – Nem található érvényes védett OpenPGP-adatblokk unverifiedReply=A beljebb kezdett üzenetrész (válasz) valószínűleg módosult keyInMessageBody=Az üzenettörzsben kulcs található. kattintson az „Importálás†gombra a kulcs importálásához. sigMismatch=Hiba – EltérÅ‘ aláírás cantImport=Hiba a nyilvános kulcs importálásakor\n\n doImportOne=Importálja a következÅ‘t: %1$S (%2$S)? doImportMultiple=Importálja a következÅ‘ OpenPGP-kulcsot?\n\n%S previewFailed=A nyilvános kulcsfájl nem olvasható. # Strings used in errorHandling.jsm sc.wrongCardAvailable=A kártyaolvasóban a(z) „%1$S†intelligens kártya található, amely nem használható a művelet végrehajtásához.\nKérem, helyezze be a(z) „%2$S†intelligens kártyát és ismételje meg a műveletet. sc.insertCard=A művelet végrehajtásához a(z) „%S†intelligens kártyára van szükség.\nKérem, helyezze be az intelligens kártyát és ismételje meg a műveletet. sc.removeCard=A művelet végrehajtásához nincs szükség intelligens kártyára.\nKérem, távolítsa el az intelligens kártyát és ismételje meg a műveletet. sc.noCardAvailable=Nem található intelligens kártya az olvasóban.\nKérem, helyezze be az Intelligens kártyát és ismételje meg a műveletet. sc.noReaderAvailable=Az intelligens kártyaolvasó nem elérhetÅ‘.\nKérem, csatlakoztassa az Intelligens kártyaolvasót, helyezze be a kártyát, majd ismételje meg a műveletet. keyError.keySpecNotFound=A(z) „%S†e-mail cím nem egyeztethetÅ‘ össze a kulcstartón található kulccsal. keyError.keyIdNotFound=A beállított „%S†azonosítójú kulcs nem található meg a kulcstartón. keyError.resolutionAction=Adjon meg egy érvényes OpenPGP kulcsot a Postafiók beállításai párbeszédablakban az OpenPGP részben. missingPassphrase=Hiányzó jelmondat errorHandling.gpgAgentInvalid=A számítógépen olyan gpg-agent verzió található, amely nem működik együtt a telepített GnuPG verzióval. errorHandling.gpgAgentError=A GnuPG nem képes kommunikálni a gpg-agent programmal (amely a GnuPG része). errorHandling.dirmngrError=A GnuPG nem képes kommunikálni a dirmngr programmal (amely a GnuPG része). errorHandling.pinentryError=A GnuPG nem tudja lekérdezni a jelmondatot a pinentry segítségével. errorHandling.readFaq=Ez egy rendszer telepítési vagy beállítási hiba, amely meggátolja az Enigmail programot a helyes működésben. Ez a hiba nem javítható automatikusan.\n\nA hibaelhárítással kapcsolatos teendÅ‘kért látogassa meg az Enigmail terméktámogatási weboldalát:https://enigmail.net/faq. gpgNotFound=A GnuPG program („%Sâ€) nem található.\nGyÅ‘zÅ‘djön meg róla, hogy a GnuPG útvonala megfelelÅ‘en van beállítva az Enigmail beállításainál. gpgNotInPath=A GPG program nem található az útvonalban (PATH).\nGyÅ‘zÅ‘djön meg róla, hogy a GPG útvonala megfelelÅ‘en van beállítva az Enigmail beállításainál. enigmailNotAvailable=Az Enigmail alapszolgáltatások nem érhetÅ‘k el prefGood=Jó aláírás: %S prefBad=ROSSZ aláírás: %S failCancel=Hiba – Kulcslekérés a felhasználó által megszakítva failNoServer=Hiba – Nincs kulcskiszolgáló megadva, ahonnan letölthetÅ‘ a kulcs failNoID=Hiba – Nincs kulcsazonosító megadva a kulcs lekéréséhez failKeyExtract=Hiba – A kulcskinyerÅ‘ parancs sikertelen volt notFirstBlock=Hiba – Az elsÅ‘ OpenPGP-blokk nem nyilvános kulcs blokkja importKeyConfirm=Importálja a levélbe ágyazott nyilvános kulcsokat? failKeyImport=Hiba – A kulcsok importálása sikertelen fileWriteFailed=Hiba történt a fájl írásakor: %S importKey=Nyilvános kulcs importálása a kulcskiszolgálóról: %S uploadKey=Nyilvános kulcs küldése a kulcskiszolgálóra: %S keyId=Kulcsazonosító keyAndSigDate=Kulcsazonosító: 0x%1$S / Aláírva: %2$S keyFpr=Kulcs ujjlenyomata: %S noEmailProvided=Nem adott meg e-mail címet. keyAlreadySigned=A kulcs korábban már alá lett írva. ##################################################################### # Strings used in enigmailKeySelection.js ##################################################################### selKeyExpired=lejár %S createdHeader=Létrehozva atLeastOneKey=Nincs kulcs kiválasztva. Ki kell választani legalább egy kulcsot az elfogadáshoz. fewerKeysThanRecipients=Kevesebb kulcsot választott ki, mint amennyi címzett van. Biztos benne, hogy a titkosítókulcsok listája teljes? userSel.button.goBack=Válasszon ki több kulcsot userSel.secretKeySel.title=Válasszon ki titkos OpenPGP-kulcsot az üzenet aláírásához userSel.problemNoKey=Nincs érvényes kulcs userSel.problemMultipleKeys=Több kulcs # should be same as thunderbird ENTITY sendLaterCmd.label: sendLaterCmd.label=Küldés késÅ‘bb # Strings used in enigmailAttachmentDialog.js # pgpMimeNote=NOTE: PGP/MIME is not supported by all email clients. If you are unsure, select the %S option. first=elsÅ‘ second=második # Strings used in am-enigprefs.js / enigmailEditIdentity.js encryptKeyHeader=Válasszon ki OpenPGP-kulcsot a titkosításhoz identityName=Azonosító: %S # switchPepMode=You are currently using the 'p≡p Junior' mode of Enigmail.\n\nBy enabling OpenPGP or S/MIME for an account, you are disabling p≡p and use the 'regular' mode of Enigmail without p≡p. # enableEnigmail=&Disable p≡p # Strings used in enigmailSingleRcptSettings.js noEncryption=Aktiválta a titkosítást, de nem jelölt ki egy kulcsot. Ha %1$S számára küldött leveleit titkosítani szeretné, meg kell adnia egy vagy több kulcsot a kulcslistáról. Szeretné kikapcsolni a titkosítást %2$S számára? noKeyToUse=(nincs – nincs titkosítás) noEmptyRule=A szabály nem lehet üres. Adjon meg egy e-mail címet a Szabály mezÅ‘ben. invalidAddress=A beírt e-mail címek nem érvényesek. A címzettek nevét nem szabad beírni, csak az e-mail címet. Például:\nRossz: Senki Alfonz \nJó: alfonz.senki@cime.net # noCurlyBrackets=The curly brackets {} have a special meaning and should not be used in an email address. If you want to modify the matching behavior for this rule, use the 'Apply rule if recipient ...' option.\nMore information is available from the Help button. # Strings used in enigmailRulesEditor.js never=Soha always=Mindig possible=Ha lehet deleteRule=Valóban szeretné törölni a kijelölt szabályt? nextRcpt=(KövetkezÅ‘ címzett) negateRule=Nem addKeyToRule=A(z) „%1$S†kulcs (%2$S) hozzáadása címzettenkénti szabályhoz # Strings used in enigmailSearchKey.js needOnline=A kiválasztott funkció nem érhetÅ‘ el kapcsolat nélküli módban. Kérem, jelentkezzen be az Internetre, és próbálja ismét. protocolNotSupported=OpenPGP-kulcsok letöltését a kiválasztott protokoll ('%S://') nem támogatja. gpgkeysDisabled=Segíthet, ha engedélyezi az 'extensions.enigmail.useGpgKeysTool' lehetÅ‘séget. noKeyserverConn=Nem lehet kapcsolódni a kulcskiszolgálóhoz: %S. keyDownloadFailed=A kulcskiszolgálóról nem sikerült letölteni a kulcsot. Ãllapotüzenet:\n%S internalError=BelsÅ‘ hiba lépett fel. A kulcsot nem lehetett letölteni, illetve importálni. noKeyFound=Nem található egyetlen kulcs sem, amely megfelel a megadott keresési feltételeknek.\nKérem, jegyezze meg azt a kulcsazonosítót, amely „0xâ€-el kezdÅ‘dik (például: 0xABCDEF12). # keyDownload.keyUnavailable=We are sorry, but the key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their key by email. # gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. gpgKeysFailed=A kulcsot nem találtam, illetve nem tudtam letölteni a kulcskiszolgálóról: gpgkeys_%S nem futtatható. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Nem sikerült a tulajdonos megbízhatóságát beállítani. # Strings in enigmailSignKeyDlg.js signKeyFailed=Kulcs aláírása nem sikerült. alreadySigned.label=Megjegyzés: A(z) „%S†kulcs már alá van írva a kiválasztott titkos kulccsal. alreadySignedexportable.label=Megjegyzés: A(z) „%S†kulcs már exportálhatóan alá van írva a kiválasztott titkos kulccsal. A helyi aláírást nem használja. partlySigned.label=Megjegyzés: A(z) „%S†kulcshoz tartozó néhány felhasználói azonosító már alá van írva a kiválasztott titkos kulccsal. noTrustedOwnKeys=Nem található megfelelÅ‘ kulcs az aláíráshoz. Legalább egy teljesen megbízható titkos kulcsra van szükség a kulcsok aláírásához. # Strings in enigmailKeyManager.js keyMan.loadingKeys=Kulcsok betöltése, kérem várjon… keyValid.unknown=ismeretlen keyValid.invalid=érvénytelen keyValid.disabled=letiltott keyValid.revoked=visszavont keyValid.expired=lejárt keyValid.noSubkey=nincs érvényes kulcsrész keyTrust.untrusted=megbízhatatlan keyTrust.marginal=részben megbízható keyTrust.full=megbízható keyTrust.ultimate=teljesen megbízható keyTrust.group=(csoport) keyType.public=nyilvános keyType.publicAndSec=nyilvános/titkos keyMan.enableKey=Kulcs engedélyezése keyMan.disableKey=Kulcs tiltása userAtt.photo=Felhasználói tulajdonság (JPEG-kép) asciiArmorFile=ASCII-adat fájlok (*.asc) importKeyFile=OpenPGP-kulcsfájl importálása gnupgFile=GnuPG fájlok createKeyOK=A kulcs elkészült saveRevokeCertAs=Visszavonási tanúsítvány készítése és mentés # revokeCertOK=The revocation certificate has been successfully created. You can use it to invalidate your public key, e.g. in case you would lose your secret key. revokeCertFailed=A visszavonási tanúsítvány létrehozása nem sikerült. addUidOK=Felhasználói azonosító hozzáadva. addUidFailed=Nem sikerült hozzáadni a felhasználói azonosítót. noKeySelected=Legalább egy kulcsot ki kell választani a listából, hogy a kijelölt művelet elvégezhetÅ‘ legyen. exportToFile=Nyilvános kulcsok fájlba mentése exportKeypairToFile=Titkos és nyilvános kulcsok fájlba mentése exportSecretKey=Kívánja menteni a titkos kulcsot is az OpenPGP kulcs-fájlhoz? saveKeysOK=A kulcsok mentése sikerült saveKeysFailed=Nem sikerült a kulcsokat elmenteni. importKeysFailed=Nem sikerült a kulcsokat beolvasni. enableKeyFailed=Kulcsok engedélyezése/tiltása nem sikerült specificPubKeyFilename=%1$S (0x%2$S) nyilvános specificPubSecKeyFilename=%1$S (0x%2$S) nyilvános-titkos defaultPubKeyFilename=Mentett-nyilvanos-kulcsok defaultPubSecKeyFilename=Mentett-nyilvanos-es-titkos-kulcsok noSecretKeys=Nem található titkos kulcs.\n\nSzeretne most létrehozni egy saját kulcsot? sendKeysOk=Kulcs(ok) elküldése sikerült sendKeysFailed=Nem sikerült a kulcs(ok) elküldése receiveKeysOk=Kulcs(ok) frissítése sikerült receiveKeysFailed=Kulcs(ok) letöltése nem sikerült importFromClip=Szeretné a vágólapról betölteni a kulcs(ok)at? importFromUrl=Nyilvános kulcs letöltése errÅ‘l az URL-címrÅ‘l: copyToClipbrdFailed=Nem sikerült a vágólapra másolni a kijelölt kulcs(ok)at. copyToClipbrdOK=A kulcs(ok) a vágólapra kerültek deleteSecretKey=FIGYELMEZTETÉS: A titkos kulcs törlését kezdeményezte.\nHa letörli a titkos kulcsot, akkor a korábban ezzel a kulccsal titkosított leveleit soha többé nem tudja visszafejteni, illetve a kulcsot sem tudja visszavonni többé.\n\nBiztosan törölni akarja MINDKÉT, a titkos és a nyilvános kulcsot is\n„%Sâ€? deleteMix=FIGYELMEZTETÉS: A titkos kulcsok törlését kezdeményezte.\nHa letörli a titkos kulcsot, akkor a korábban ezzel a kulccsal titkosított leveleit soha többé nem tudja visszafejteni.\n\nBiztosan törölni akar MINDEN kiválasztott titkos és nyilvános kulcsot? deletePubKey=Szeretné törölni a következÅ‘ nyilvános kulcsot\n„%Sâ€? deleteSelectedPubKey=Szeretné törölni a kijelölt nyilvános kulcsokat? deleteKeyFailed=A kulcs nem törölhetÅ‘. revokeKeyQuestion=A következÅ‘ kulcs visszavonását kezdte el: „%Sâ€.\n\nA kulcs visszavonása után Ön nem tud majd aláírni ezzel a kulccsal és a visszavonás közreadása után, mások sem tudnak majd – ehhez a kulcshoz tartozó – titkosított üzenetet küldeni. Továbbra is használhatja a kulcsot a régi üzenetek visszafejtésére.\n\nKívánja folytatni a visszavonást? revokeKeyOk=A kulcs visszavonása sikerült. Ha a kulcs elérhetÅ‘ a kulcskiszolgálón, javasoljuk, hogy töltse fel oda is, hogy a nyilvánosság felé is látszódjon a visszavonás. revokeKeyFailed=A kulcs nem vonható vissza. # revokeKeyNotPresent=You have no key (0x%S) which fits to this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before the revocation certificate! revokeKeyAlreadyRevoked=A(z) „0x%S†kulcs már vissza lett vonva. refreshAllQuestion=Nincs kiválasztva egyetlen kulcs sem. Szeretné frissíteni az összes kulcsot? # refreshKeyServiceOn.warn=Warning: Your keys are currently being refreshed in the background as safely as possible.\nRefreshing all your keys at once will unnecessarily reveal information about you.\nDo you really want to do this? refreshKey.warn=Figyelmeztetés: Az összes kulcs frissítése hosszabb ideig eltarthat, a kulcsok mennyiségétÅ‘l és a kapcsolat sebességétÅ‘l függÅ‘en.\n\nFolytatja? downloadContactsKeys.warn=Figyelmeztetés: Az összes kulcs frissítése hosszabb ideig eltarthat, a kulcsok mennyiségétÅ‘l és a kapcsolat sebességétÅ‘l függÅ‘en. downloadContactsKeys.importFrom=Kívánja importálni a névjegyeket a következÅ‘ címjegyzékbÅ‘l: %S? keyMan.button.exportSecKey=Titkos kulcs &exportálása keyMan.button.exportPubKey=Csak a &nyilvános kulcs exportálása keyMan.button.import=&Importálás keyMan.button.refreshAll=Összes kulcs f&rissítése keyMan.button.revokeKey=Kulcs &visszavonás keyMan.button.skip=Kulcs kihagyá&sa keylist.noOtherUids=Nincs több azonosító keylist.hasOtherUids=Más néven keylist.noPhotos=Nem érhetÅ‘ el fotó keylist.hasPhotos=Fotók keyMan.addphoto.filepicker.title=Válassza ki a fotót keyMan.addphoto.warnLargeFile=A kiválasztott fájl nagyobb mint 25 kilobyte.\nNem ajánlatos túl nagy fájlt kiválasztani, mert a kulcs nagyon nagy méretű lesz. keyMan.addphoto.noJpegFile=A kiválasztott fájl nem tűnik JPEG-fájlnak. Válasszon ki egy JPEG-fájlt. keyMan.addphoto.failed=A fotó nem adható hozzá. # noWksIdentity=The key %S does not have a WKS identity. # keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key "%1$S (%2$S)" for encrypting messages? # keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key "%1$S (%2$S)" for future messages? keyman.addBlacklistKey.button=Kulcs &felvétele a feketelistára keyman.removeBlacklistKey.button=Kulcs &eltávolítása a feketelistától # Strings in enigmailManageUidDlg.xul changePrimUidFailed=Az elsÅ‘dleges felhasználói azonosító módosítása sikertelen. changePrimUidOK=Sikerült módosítani az elsÅ‘dleges felhasználói azonosítót. revokeUidFailed=%S felhasználó azonosítójának visszavonása nem sikerült revokeUidOK=%S felhasználói azonosító visszavonása sikerült. Ha a kulcs elérhetÅ‘ a kulcskiszolgálón, javasoljuk, hogy töltse fel oda is, hogy a nyilvánosság felé is látszódjon a visszavonás. revokeUidQuestion=Valóban szeretné visszavonni a(z) %S felhasználó azonosítót? # Strings in enigmailKeyImportInfo.xul importInfoTitle=Sikerült a kulcsok importálása importInfoBits=Bit importInfoCreated=Létrehozva importInfoFpr=Ujjlenyomat importInfoDetails=(Részletek) importInfoNoKeys=Nincsenek kulcsok importálva. # Strings in enigmailKeyDetailsDlg.xul keyTypePublic=nyilvános kulcs keyTypePrimary=elsÅ‘dleges kulcs keyTypeSubkey=kulcsrész keyTypePair=kulcspár keyExpiryNever=soha keyAlgorithm_1=RSA keyAlgorithm_2=RSA keyAlgorithm_3=RSA keyAlgorithm_16=ELG keyAlgorithm_17=DSA keyAlgorithm_18=ECC keyAlgorithm_19=ECC keyAlgorithm_20=ELG keyAlgorithm_22=EDDSA keyUsageEncrypt=Titkosítás keyUsageSign=Aláírás keyUsageCertify=Tanúsítás keyUsageAuthentication=Hitelesítés keyDoesNotExpire=A kulcs soha nem jár le # Strings in enigmailGenCardKey.xul keygen.started=Kérem várjon, amíg a kulcs elkészül… keygen.completed=Kulcs elkészült. Az új kulcsazonosító: 0x%S keygen.keyBackup=A kulcs lementve mint %S keygen.passRequired=Adja meg a jelmondatát, ha szeretne biztonsági másolatot készíteni a kulcsról az intelligens kártyán kívülre. # Strings in enigmailSetCardPin.xul cardPin.processFailed=PIN-kód módosítása nem sikerült. # Strings in enigRetrieveProgres.xul keyserverProgress.refreshing=Kulcsok frissítése, kérem várjon… keyserverProgress.uploading=Kulcsok feltöltése, kérem várjon… # keyserverProgress.wksUploadFailed=Could not upload your key to the Web Key Service # keyserverProgress.wksUploadCompleted=Your public key was successfully submitted to your provider. You will receive an email to confirm that you initiated the upload. keyserverTitle.refreshing=Kulcsok frissítése keyserverTitle.uploading=Kulcs feltöltése # Strings in enigmailSetupWizard passphrase.min8keys=A jelszavának legalább 8 karaktert kell tartalmaznia. setupWizard.reallyCancel=Valóban ki szeretne lépni az Enigmail Beállítás TündérbÅ‘l? setupWizard.invalidGpg=A megadott fájl nem egy GnuPG végrehajtható fájl. Adjon meg egy másik fájlt. setupWizard.specifyFile=Legalább a nyilvános kulcsot meg kell adnia a művelet végrehajtásához. setupWizard.installFailed=Az telepítés nem sikerült. Próbálja meg újra a telepítést, vagy telepítse a GnuPG programot kézzel és adja meg az elérési útját a „Tallózás†gombbal. # setupWizard.downloadForbidden=For your own security, we will not download GnuPG. Please visit https://gnupg.org/ in order to download GnuPG. # setupWizard.downloadImpossible=We cannot download GnuPG currently. Please try later or visit https://gnupg.org/ in order to download GnuPG. setupWizard.hashSumError=A tündér nem tudja ellenÅ‘rizni a letöltött fájl érvényességét. A fájl esetleg hibás vagy rossz szándékkal megváltoztatott lehet. Ennek ellenére folytatni kívánja a telepítést? setupWizard.importSettingsFile=Adja meg a betöltendÅ‘ mentés fájlt setupWizard.invalidSettingsFile=A megadott fájl nem érvényes Enigmail beállítások mentésfájl. setupWizard.gpgConfExists=A GnuPG beállítófájl már létezik. Felül kívánja írni a fájlt egy régebbi telepítésbÅ‘l származó fájllal? # setupWizard.noGpgHomeDir=It appears that you configured %S to use for GnuPG. However, this is not a directory - you cannot use it. # setupWizard.unmachtedIds=The following identities of your old setup could not be matched:\n%S\nThe settings for these identities were skipped. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=Hiba lépett fel a GnuPG letöltése során. További részleteket a konzol naplóban talál. installGnuPG.installFailed=Hiba lépett fel a GnuPG telepítése során. További részleteket a konzol naplóban talál. # Strings in enigmailAddUidDlg.xul addUidDlg.nameOrEmailError=Ki kell töltenie a név és e-mail mezÅ‘ket. addUidDlg.nameMinLengthError=A névnek legalább 5 karakter hosszúnak kell lennie. addUidDlg.invalidEmailError=Érvényes e-mail címet kell megadnia. # Strings in enigmailCardDetails.js Carddetails.NoASCII=Az OpenPGP intelligens kártya kizárólag ASCII karaktereket támogat a keresztnévben és a névben. # network error types errorType.SecurityCertificate=A webszolgáltatás által megadott biztonsági tanúsítvány nem érvényes. errorType.SecurityProtocol=A webszolgáltatás által alkalmazott protokoll ismeretlen. errorType.Network=Hálózati hiba történt. # filter stuff filter.folderRequired=Ki kell választania a célmappát. filter.decryptMove.label=Végleges visszafejtés (Enigmail) filter.decryptCopy.label=Visszafejtett másolat létrehozása (Enigmail) filter.decryptMove.warnExperimental=Figyelmeztetés – a „Végleges visszafejtés†szűrÅ‘művelet tönkreteheti az üzeneteket.\n\nErÅ‘sen ajánlott, hogy elÅ‘ször a „Visszafejtett másolat létrehozása†szűrÅ‘vel próbálkozzon, ellenÅ‘rizze az eredményt és csak akkor használja ezt a szűrÅ‘t, ha nem talált semmi problémát. # filter.tempPepFilterDesc=Temporary filter to store sent message unencrypted filter.term.pgpencrypted.label=OpenPGP titkosított # filter.encrypt.label=Encrypt to key (Enigmail) # filter.keyRequired=You must select a recipient key. filter.keyNotFound=Nem található titkosítókulcs a következÅ‘höz: „%S†# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for "%S" you will no longer be able to read the emails. # strings in enigmailConvert.jsm converter.decryptBody.failed=Nem fejthetÅ‘ vissza az üzenet, amelynek tárgya:\n„%Sâ€.\nMegpróbálja visszafejteni egy másik jelmondattal, vagy kihagyja ezt az üzenetet? converter.decryptAtt.failed=Nem fejthetÅ‘ vissza a(z) „%1$Sâ€\nüzenet mellékelte, amelynek tárgya:\n„%2$Sâ€.\nMegpróbálja visszafejteni egy másik jelmondattal, vagy kihagyja ezt az üzenetet? saveLogFile.title=Naplófájl mentése # strings in gpg.jsm unknownSigningAlg=Ismeretlen aláíró algoritmus (azonosító: %S) unknownHashAlg=Ismeretlen kriptográfiai algoritmus (azonosító: %S) # strings in keyRing.jsm keyring.photo=Fénykép keyRing.pubKeyRevoked=A(z) „%1$S†kulcs (azonosító: %2$S) vissza lett vonva. keyRing.pubKeyExpired=A(z) „%1$S†kulcs (azonosító: %2$S) lejárt. keyRing.pubKeyNotForSigning=A(z) „%1$S†kulcs (azonosító: %2$S) nem használható aláíráshoz. keyRing.pubKeyNotForEncryption=A(z) „%1$S†kulcs (azonosító: %2$S) nem használható titkosításhoz. keyRing.keyDisabled=A(z) „%1$S†kulcs (azonosító: %2$S) le van tiltva, nem használható. keyRing.keyNotTrusted=A(z) „%1$S†kulcs (azonosító: %2$S) nem eléggé megbízható. Amennyiben mégis ezt a kulcsot szeretné használni aláíráshoz állítsa be a kulcs megbízhatóságát „teljesen megbízható†szintre. keyRing.keyInvalid=A(z) „%1$S†kulcs (azonosító: %2$S) érvénytelen (például nem rendelkezik önaláírással). keyRing.signSubKeysRevoked=A(z) „%1$S†kulcs (azonosító: %2$S) összes aláíró alkulcsa vissza lett vonva. keyRing.signSubKeysExpired=A(z) „%1$S†kulcs (azonosító: %2$S) összes aláíró alkulcsa lejárt. keyRing.signSubKeysUnusable=A(z) „%1$S†kulcs (azonosító: %2$S) összes aláíró alkulcsa vissza lett vonva, lejárt, vagy más okból nem használható. keyRing.encSubKeysRevoked=A(z) „%1$S†kulcs (azonosító: %2$S) összes titkosító alkulcsa vissza lett vonva. keyRing.encSubKeysExpired=A(z) „%1$S†kulcs (azonosító: %2$S) összes titkosító alkulcsa lejárt. keyRing.noSecretKey=Úgy tűnik nem rendelkezik a(z) %1$S titkos kulcsával (azonosító: %2$S) a számítógép kulcstartóján, így ezt a kulcsot nem használhatja aláírásra. keyRing.encSubKeysUnusable=A(z) „%1$S†kulcs (azonosító: %2$S) összes titkosító alkulcsa vissza lett vonva, lejárt, vagy más okból nem használható. #strings in exportSettingsWizard.js cannotWriteToFile=Hiba lépett fel a fájl mentése során: „%Sâ€. Válasszon egy másik fájlt. dataExportError=Hiba történt az adatok exportálása során: %s. enigmailSettings=EnigmailBeallitasok defaultBackupFileName=Enigmail-export specifyExportFile=Adja meg a fájlnevet az exportáláshoz homedirParamNotSUpported=További paraméterek, amelyek az elérési utat állítják be – például: „--homedir†és „--keyring†– nem támogatottak a beállítások mentésekor és visszatöltésekor. Használjon más megoldást, például a „GNUPGHOME†környezeti változót. #strings in expiry.jsm expiry.keyExpiresSoon=A következÅ‘ kulcs lejár %1$S nap múlva:\n%2$S. Készítse el az új kulcsot és a postafiókját állítsa át az új kulcs használatára. # expiry.keysExpireSoon=The following of your keys will expire in less than %1$S days:\n%2$S We recommend that you create new keys and configure your accounts to use the new keys. # expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to ultimate in key properties. # expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to ultimate in key properties. expiry.OpenKeyManager=Enigmail KulcskezelÅ‘ megnyitása # expiry.OpenKeyProperties=Open Key Properties #strings in pEpDecrypt.jsm # pEpDecrypt.cannotDecrypt=This is an encrypted message. Unfortunately you don't have the secret key to decrypt the message. #strings in gpgAgent.jsm # gpghomedir.notexists=The directory '%S' containing your OpenPGP keys does not exist and cannot be created. # gpghomedir.notwritable=The directory '%S' containing your OpenPGP keys is not writable. # gpghomedir.notdirectory=The directory '%S' containing your OpenPGP keys is a file instead of a directory. # gpghomedir.notusable=Please fix the directory permissions or change the location of your GnuPG "home" directory. GnuPG cannot work correctly otherwise. #strings in pepTrustWords.js # pepTrustWords.cannotVerifyOwnId=Cannot verify p≡p Trustwords for own account. pepTrustWords.cannotFindKey=Nem található kulcs a következÅ‘höz: %S # pepTrustWords.cannotStoreChange=Could not change trust for %S. # pepTrustWords.generalFailure=Cannot obtain trustwords for %S. pepTrustWords.partnerFingerprint=%S ujjlenyomata: #strings in mimeWkdHandler.jsm # wkdMessage.body.req=Your email provider processed your request to upload your public key to the OpenPGP Web Key Directory.\n\nPlease click the confirmation button in the Enigmail header to complete the publishing of your public key. # wkdMessage.body.process=This is an email related to the automatic processing to upload your public key to the OpenPGP Web Key Directory.\n\nYou do not need to take any manual action at this point. #strings in pepHandshake.js # pepPrivacyStatus.RatingBrokenSuggestion=Either you or the sender should resend the message. # pepPrivacyStatus.RatingHaveNoKeySuggestionOutgoing=If you composed this message, your key is not available. # pepPrivacyStatus.RatingMistrustSuggestion=Re-establish the connection with your communication partner and try to complete another handshake. # pepPrivacyStatus.RatingReliableSuggestion=Complete a handshake with your communication partner by exchanging trustwords in person or over the phone. A handshake is needed only once per partner and will ensure secure and trusted communication. # pepPrivacyStatus.RatingTrustedSuggestion=No action needed! # pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware this message may not be secure. # pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Please add the necessary information. # pepPrivacyStatus.RatingUnderAttackSuggestion=Separately verify the content of this message with your communication partner. # pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least secure. # pepPrivacyStatus.RatingUnencryptedSuggestion=Please ask your communication partner to use an encryption solution or install p≡p. # pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or no signature. Ask your communication partner to upgrade their encryption solution or install p≡p. # pepPrivacyStatus.RatingBrokenExplanation=This message has broken encryption or formatting. # pepPrivacyStatus.RatingHaveNoKeyExplanation=This message cannot be decrypted because the key is not available. # pepPrivacyStatus.RatingMistrustExplanation=This message has a communication partner that has previously been marked as mistrusted. # pepPrivacyStatus.RatingReliableExplanation=This message is secure but you still need to verify the identity of your communication partner. # pepPrivacyStatus.RatingTrustedExplanation=This message is secure and trusted. # pepPrivacyStatus.RatingUndefinedExplanation=This message does not contain enough information to determine if it is secure. # pepPrivacyStatus.RatingUnderAttackExplanation=This message is not secure and has been tampered with. pepPrivacyStatus.RatingUnencryptedExplanation=Ez az üzenet nem biztonságos. pepPrivacyStatus.RatingUnencryptedForSomeExplanation=Ez az üzenet nem biztonságos néhány címzett számára. pepPrivacyStatus.RatingUnreliableExplanation=Ez az üzenet nem megbízható védelemmel rendelkezik. # pepPrivacyStatus.RatingBrokenText=Broken # pepPrivacyStatus.RatingHaveNoKeyText=Cannot Decrypt # pepPrivacyStatus.RatingMistrustText=Mistrusted # pepPrivacyStatus.RatingReliableText=Secure # pepPrivacyStatus.RatingTrustedText=Secure & Trusted pepPrivacyStatus.RatingUndefinedText=Ismeretlen # pepPrivacyStatus.RatingUnderAttackText=Under Attack pepPrivacyStatus.RatingUnencryptedForSomeText=Nem biztonságos néhány címzettnek pepPrivacyStatus.RatingUnencryptedText=Nem biztonságos pepPrivacyStatus.RatingUnreliableText=Nem megbízható biztonság # handshakeDlg.button.initHandshake=Handshake... # handshakeDlg.button.stopTrust=Stop Trusting # handshakeDlg.button.reTrust=Stop Mistrusting handshakeDlg.label.outgoingMessage=KimenÅ‘ üzenet handshakeDlg.label.incomingMessage=Beérkezett üzenet # handshakeDlg.error.noPeers=Cannot handshake without any correspondents. # handshakeDlg.error.noProtection=Please enable protection in order to use the Handshake function. # enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device # enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup #strings in autocrypt.jsm # autocrypt.setupMsg.subject=Autocrypt Setup Message # autocrypt.setupMsg.msgBody=To set up your new device for Autocrypt, please follow the instuctions that should be presented by your new device. # autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code presented on your old device, and then import the contained key into your keyring. #strings in upgradeInfo.html upgradeInfo.doctitle=Milyen újdonságok vannak az Enigmail v2.0 verziójában? # upgradeInfo.welcome1=Welcome to the new Enigmail version 2.0! # upgradeInfo.welcome2=The release contains a lot of new and changed features. Please take a minute to find out what's new: # upgradeInfo.encSubject.title=Encrypting the Message Subject # upgradeInfo.encSubject.desc=We developed a new method that moves the email subject into the encrypted message, and replaces the visible subject with "Encrypted Message". Once such a message is decrypted, the original subject is replaced automatically. Hiding the subject is on by default; there is a preference to turn it off if you don't like it. (Note: this feature requires the message to be sent with PGP/MIME.) # upgradeInfo.buttons.title=Changed behavior of Encrypt and Sign Buttons # upgradeInfo.buttons.desc=The Encrypt and Sign buttons in the message composer window now work for both the OpenPGP and S/MIME protocols. If both algorithms are possible, then Enigmail will try to prefer the one for which all keys are available. # upgradeInfo.autocrypt.title=Support for Autocrypt # upgradeInfo.autocrypt.desc=Enigmail now supports Autocrypt, a new standard to distribute keys as part of sent messages. Enigmail automatically imports keys from Autocrypt-compliant messages, such that over time more and more emails can be encrypted. # upgradeInfo.pEp.title=New p≡p Junior Mode (Pretty Easy Privacy) # upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. You currently need to manually install p≡p for this purpose; this will change in a future release. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. # upgradeInfo.bottom.desc=Please visit our documentation for help on using Enigmail. # pep.missingGnuPG=In order to use Enigmail/p≡p, GnuPG is required. As we could not find it, we suggest to download and install it for you. #strings in enigmailAbout.html aboutEnigmail.tabName=Az Enigmail névjegye # aboutEnigmail.title=OpenPGP support provided by Enigmail # aboutEnigmail.team=Enigmail is developed by the Enigmail Team: aboutEnigmail.projectLeader=VezetÅ‘ fejlesztÅ‘: # aboutEnigmail.usability=Usability: aboutEnigmail.documentation=Dokumentáció: aboutEnigmail.testing=Tesztelés: aboutEnigmail.userSupport=Felhasználói támogatás: # aboutEnigmail.localization=Localization: See the Enigmail Language Packs page # aboutEnigmail.Credits=Credits: aboutEnigmail.origAuthor=Az Enigmail kiterjesztés eredeti készítÅ‘je aboutEnigmail.icons=Ikonok: aboutEnigmail.formerMembers=Régebbi csapattagok: # aboutEnigmail.projectHosting=Project hosting: aboutEnigmail.licenseSupportTitle=Licenc és támogatás # aboutEnigmail.license=Enigmail OpenPGP is open source and licensed under the %S # aboutEnigmail.support=Support and download is available from www.enigmail.net. enigmail-2.0.8/lang/hu/help/000077500000000000000000000000001334302754500156015ustar00rootroot00000000000000enigmail-2.0.8/lang/hu/help/compose.html000066400000000000000000000100761334302754500201400ustar00rootroot00000000000000 Enigmail Help: Message Composition

Enigmail Help

Using Enigmail when composing messages

Enigmail menu in Mail/Compose window
Sign message
Enable/Disable sending signed mail. User is notified, if signing fails.
Encrypt message

Enable/Disable encryption to all recipient(s) before sending. User is notified, if encryption fails.

If Display selection when necessary is set in Preferences -> Key Selection tab, a list of keys will pop up if there are addresses in the list of recipients for the message for whom you have no public key.

If Never display OpenPGP key selection dialog is set in Preferences -> Key Selection tab, and there are addresses in the list of recipients for the message for whom you have no public key, the message will be sent unencrypted.

Use PGP/MIME for this message
Enable/Disable the use of PGP/MIME for this message.

If you know the recipient(s) can read mail using the PGP/MIME format, you should use it.

This feature is dependent on the settings in Preferences -> PGP/MIME tab being set to Allow to use PGP/MIME or Always use PGP/MIME.

Default composition options
  • Signing/Encryption Options...: shortcut to Account Settings -> OpenPGP Options.
  • Send options...: shortcut to Preferences -> Send tab.
  • Key selection options...: shortcut to Preferences -> Key Selection tab.
  • PGP/MIME options...: shortcut to Preferences -> PGP/MIME tab.
Undo encryption

If there is a failure when actually sending mail, such as the POP server not accepting the request, Enigmail will not know about it, and the encrypted message will continue to be displayed in the Compose window. Choosing this menu item will undo the encryption/signing, reverting the Compose window back to its original text.

As a temporary fix, this option may also be used to decrypt the quoted text when replying to encrypted messages. Enigmail should automatically decrypt the quoted message, but if that fails for some reason, you can use this menu item to force it.

Insert public key
insert ASCII-armored public key block at the current cursor location in the Compose window. You will be prompted for the email addresses of the key(s) to be inserted. Keys inserted in this manner will automatically be recognized at the receiving end by Enigmail. After key insertion, you may still choose to sign/encrypt the mail as needed. Also, do not insert more than one key block in a message; just specify multiple email addresses, separated by commas or spaces, when prompted.
Clear save passphrase
Clears cached passphrase. Useful if you have multiple passphrases.
Help
Displays Help information from the website (this page).

Further help is available on the Enigmail Help web page

enigmail-2.0.8/lang/hu/help/editRcptRule.html000066400000000000000000000116041334302754500210770ustar00rootroot00000000000000 Enigmail Help: Edit Per-Recipient Rule

Enigmail Help

Using the Enigmail Rules Editor: Edit Per-Recipient Rule

In the Rules Editor, you can specify defaults per recipient for enabling encryption, signing and PGP/MIME, and to define what OpenPGP key(s) to use. In this dialog, you can specify the rules for a single recipient, and for a group of recipients with very similar attributes.

Set Enigmail Rules for
Contains the email addresses of the recipients (without names, i.e. just an address like somebody@email.domain). You can specify several email addresses, separated by spaces. The address specified here can consist of only the domain section so that mail to any address at that domain will be matched, e.g. @email.domain will allow matching to body@email.domain, somebody@email.domain, anybody@email.domain, etc.
Apply rule if recipient ...
This modifies the matching of the email addresses. If multiple addresses are entered, the setting will apply to all. The examples below are based on body@email.domain entered in the Enigmail Rules field above.
  • Is exactly: with this setting, the rule will only trigger on emails to body@email.domain (exact, case insensitive matching).
  • Contains: with this setting, any email address containing the string is matched, e.g. anybody@email.domain or body@email.domain.net
  • Begins with: with this setting, any email address starting with the string is matched, e.g. body@email.domain.net, body@email.domain-name.com.
  • Ends with: with this setting, any email address ending with the string is matched, e.g. anybody@email.domain , somebody@email.domain.
Continue with the next rule for the matching address
Enabling this function will allow you to define a rule but not have to specify a KeyID in the Use the following OpenPGP keys: field, so that the email address is used to check for a key at the time of sending. Also, further rules for the same address(es) will be processed as well.
Do not check further rules for the matching address
Enabling this function stops processing any other rules for the matching address(es) if this rule is matched; i.e. rule processing continues with the next recipient.
Use the following OpenPGP keys:
Use the Select Key(s).. button to select the recipient keys to be used for encryption. As in the action above, no further rules for the matching address(es) are processed.
Default for Signing
Enable or disable message signing. This either uses or overrides what you have specified in the message composition window. The values are:
  • Never: disable signing, even if it was enabled in the message composition window (overrules the other values)
  • Yes, if selected from in Message Composition: leave signing as specified in the message composition window
  • Always: enable signing, even if it was not enabled in the message composition window
These signing settings are applied for all rules that match. If one of the rules disables signing, the message will not be signed, regardless of other rules that specify Always.
Encryption
Enable or disable message encryption. The allowed settings and their meaning are the same as for message signing.
PGP/MIME
Enable or disable the use of the PGP/MIME (RFC 3156) message encoding. If PGP/MIME is disabled, the messages are encoded using "inline PGP". The allowed values and their meaning are the same as for message signing.

The rules are processed in the order displayed in the list in the Per-Recipient Rules Editor. Whenever a rule matches a recipient and contains a OpenPGP Key ID, in addition to using the specified Key ID, the recipient is not considered anymore when processing further rules.


Further help is available on the Enigmail Per-Recipient Settings page

enigmail-2.0.8/lang/hu/help/help.html000066400000000000000000000103271334302754500174220ustar00rootroot00000000000000 Enigmail Help

Enigmail Help

Using Enigmail when reading messages

  • Decrypt button in main Mail window
    This button can be used for several purposes: decrypt, verify, or import public keys. Normally decryption/verification happens automatically, although this can be disabled through a preference. However, if this fails, usually a short error message will appear in the Enigmail status line. If you click the Decrypt button, you will be able to see a more detailed error message, including the output from the GnuPG command.
  • Pen and Key icons in Message Header display
    The Pen and Key icons in the Message Header display indicate if the message you are reading was signed and/or encrypted and if the signature is good, i.e. the message has not been changed since it was signed. If the message has been changed, the Pen icon will change to a Broken Pen to indicate that the signature is bad. Right clicking on either the Pen or Key icons will bring up a menu with the following options:
    • Enigmail Security info: allows you to view the output status from GnuPG for the message.
    • Copy Enigmail Security info: copies the output status from GnuPG to the clipboard; to paste into a reply message, etc.
    • View OpenPGP Photo ID: allows you to view the Photo ID of the person who sent the message, if they have a photo embedded in their Public Key. (This option will only be enabled if a Photo ID exists in their key.)
    • S/MIME Security info: allows you to view the S/MIME Security Info for the message.

    If you do not have keyserver-options auto-key-retrieve set in your gpg.conf file and you read a message which is signed or encrypted, you will see a Pen icon in the headers display area with a Question mark on it, the Enigmail status line in the headers area will say Part of the message signed; click pen icon for details and the message in the Message Pane will show all the OpenPGP message block indicators and the signature block.

    You may also see this if you have keyserver-options auto-key-retrieve set in your gpg.conf file and the OpenPGP key is not available on the default keyserver.

    Clicking on the Pen and Question mark icon will bring up a window advising that the key is unavailable in your keyring. Clicking on OK will bring up another window with a list of keyservers from which you can select to download the sender's public key from.

    To configure the list of keyservers you wish to use, go to Enigmail -> Preferences -> Basic tab and enter the keyserver addresses in the Keyserver(s): box, separated by a comma. The first keyserver in the list will be used as the default.

  • Opening encrypted attachments / importing attached OpenPGP keys
    Attachments named *.pgp, *.asc and *.gpg are recognized as attachments that can be handled specially by Enigmail. Right clicking on such an attachment enables two special menu items in the context menu: Decrypt and Open and Decrypt and Save. Use these two menu items if you want Enigmail to decrypt an attachment before opening or saving it. If an attachment is recognized as an OpenPGP key file, you are offered to import the keys it into your keyrings.

Further help is available on the Enigmail Help web page
If you have questions or comments about enigmail, please send a message to the Enigmail mailing list

Enigmail is open source and licensed under the Mozilla Public License

enigmail-2.0.8/lang/hu/help/initError.html000066400000000000000000000045521334302754500204520ustar00rootroot00000000000000 Enigmail Help: How to Resolve Problems with Initializing Enigmail

Enigmail Help

How to Resolve Problems with Initializing Enigmail

There are several reasons why initializing Enigmail does not succeed. The most common ones are described below; for more information please visit the Enigmail Support page.

GnuPG could not be found

In order for Enigmail to work, the tool GnuPG needs to be installed. If GnuPG cannot be found, then first make sure that the executable gpg.exe (on Windows; gpg on other platforms) is installed on your computer. If GnuPG is installed, and Enigmail cannot find it, then you need to manually set the path to GnuPG in the Enigmail Preferences (menu Enigmail > Preferences)

Enigmime failed to initialize

Enigmail works only if it is built using the same build environment as Thunderbird or SeaMonkey was built. This means that you can use the official Enigmail releases only if you use the official releases of Thunderbird or SeaMonkey provided by mozilla.org.

If you use a Thunderbird or SeaMonkey version coming from some other source (e.g. the provider of your Linux distribution), or if you built the application yourself, you should either use an Enigmail version built by the same source, or build Enigmail yourself. For building Enigmail, refer to the Source Code section on the Enigmail home page. Please don't file any bug report concerning this problem, it is not solvable.

Further help is available on the Enigmail Support Web Site.

enigmail-2.0.8/lang/hu/help/messenger.html000066400000000000000000000101421334302754500204550ustar00rootroot00000000000000 Enigmail Help: Message Reading

Enigmail Help

Using Enigmail when reading messages

Decrypt button in main Mail window
This button can be used for several purposes: decrypt, verify, or import public keys. Normally decryption/verification happens automatically, although this can be disabled through a preference. However, if this fails, usually a short error message will appear in the Enigmail status line. If you click the Decrypt button, you will be able to see a more detailed error message, including the output from the GnuPG command.
Pen and Key icons in Message Header display
The Pen and Key icons in the Message Header display indicate if the message you are reading was signed and/or encrypted and if the signature is good, i.e. the message has not been changed since it was signed. If the message has been changed, the Pen icon will change to a Broken Pen to indicate that the signature is bad. Right clicking on either the Pen or Key icons will bring up a menu with the following options:
  • Enigmail Security info: allows you to view the output status from GnuPG for the message.
  • Copy Enigmail Security info: copies the output status from GnuPG to the clipboard; to paste into a reply message, etc.
  • View OpenPGP Photo ID: allows you to view the Photo ID of the person who sent the message, if they have a photo embedded in their Public Key. (This option will only be enabled if a Photo ID exists in their key.)
  • S/MIME Security info: allows you to view the S/MIME Security Info for the message.

If you do not have keyserver-options auto-key-retrieve set in your gpg.conf file and you read a message which is signed or encrypted, you will see a Pen icon in the headers display area with a Question mark on it, the Enigmail status line in the headers area will say Part of the message signed; click pen icon for details and the message in the Message Pane will show all the OpenPGP message block indicators and the signature block.

You may also see this if you have keyserver-options auto-key-retrieve set in your gpg.conf file and the OpenPGP key is not available on the default keyserver.

Clicking on the Pen and Question mark icon will bring up a window advising that the key is unavailable in your keyring. Clicking on OK will bring up another window with a list of keyservers from which you can select to download the sender's public key from.

To configure the list of keyservers you wish to use, go to Enigmail -> Preferences -> Basic tab and enter the keyserver addresses in the Keyserver(s): box, separated by a comma. The first keyserver in the list will be used as the default.

Opening encrypted attachments / importing attached OpenPGP keys
Attachments named *.pgp, *.asc and *.gpg are recognized as attachments that can be handled specially by Enigmail. Right clicking on such an attachment enables two special menu items in the context menu: Decrypt and Open and Decrypt and Save. Use these two menu items if you want Enigmail to decrypt an attachment before opening or saving it. If an attachment is recognized as an OpenPGP key file, you are offered to import the keys it into your keyrings.

Further help is available on the Enigmail Help web page

enigmail-2.0.8/lang/hu/help/rulesEditor.html000066400000000000000000000060331334302754500207720ustar00rootroot00000000000000 Enigmail Help: Rules Editor

Enigmail Help

Using the Enigmail Rules Editor

In the Rules Editor, you can specify defaults per recipient for enabling encryption, signing and PGP/MIME, and to define what OpenPGP key(s) to use. Each rule consists of 5 fields and is represented on a single line:

Email
The e-mail(s) from the To:, Cc: and Bcc: fields to match. The matching works on substrings (Further details can be found in the Edit Rule dialog)
OpenPGP Key(s)
a list of OpenPGP Key ID's to use for the recipient
Sign
enable or disable message signing. This either uses or overrides what you have specified in the message composition window. The values are:
  • Never: disable signing, even if it was enabled in the message composition window (overrules the other values)
  • Possible: leave signing as specified in the message composition window
  • Always: enable signing, even if it was not enabled in the message composition window

These signing settings are applied for all rules that match. If one of the rules disables signing, the message will not be signed, regardless of other rules that specify Always.

Encrypt
enable or disable message encryption. The allowed settings and their meaning are the same as for message signing.
PGP/MIME
enable or disable the use of the PGP/MIME (RFC 3156) message encoding. If PGP/MIME is disabled, the messages are encoded using "inline PGP". The allowed values and their meaning a re the same as for message signing.

The rules are processed in the order displayed in the list. Whenever a rule matches a recipient and contains a OpenPGP Key ID, in addition to using the specified Key ID, the recipient is not considered anymore when processing further rules.

Note: The rule editor is not yet complete. It is possible to write some more advanced rules by directly editing the rules file (these rules should then not be edited anymore in the rule editor). Further information for directly editing the file is available on the Enigmail Homepage


Further help is available on the Enigmail Help web page

enigmail-2.0.8/lang/hu/help/sendingPrefs.html000066400000000000000000000047571334302754500211330ustar00rootroot00000000000000 Enigmail Help: Edit OpenPGP Rule

Enigmail Help

Defining Preferences to Send Encrypted

In the Sending Preferences you can choose the general model and preferences for encryption.

Convenient Encryption
With these settings, emails are encrypted without confirmation whenever possible.

This setup is appropriate, if you just want to improve your privacy by sending emails encyrpted instead of unencrypted if that's possible.

The effect is like sending emails as letters instead of postcards. Unlike postcards, letters usually hide their contents while in transit.

Note however that as with letters you can't be sure that nobody is opening the letter while it is in transit (although, some technical effort is necessary for that).

A concrete risk is that you accidentally use "faked keys" you got from somewhere or somebody claiming that the key belongs to the person you want to send emails to. To avoid this risk, you can either use the trust model of PGP (see below) or you should always verify, whether the fingerprint of a public key is correct.

Manual Encryption
This option allows you to specify the different preferences for encryption according to your needs. You can specify
  • whether replies to encrypted/signed emails should automatically also be encrypted/signed-
  • whether to use the trust model of Enigmail to accept keys (this means that to use a key you either have to sign the key or have enough other people you trust having signed the key).
  • whether you want to automatically send emails encrypted if all keys are accepted.
  • whether and when you want to finally confirm sending an email.
If it is important for you that content you send encrypted can't be read by other people or organizations, you should use the manual preferences at least choose the option to accept keys only if you or other people signed them. While this model reduces the risk of using faked keys, it requires that you actively sign keys and declare owner trust using the key managament dialog. enigmail-2.0.8/lang/it/000077500000000000000000000000001334302754500146515ustar00rootroot00000000000000enigmail-2.0.8/lang/it/am-enigprefs.properties000066400000000000000000000001221334302754500213370ustar00rootroot00000000000000# Strings used in the Mozill AccountManager prefPanel-enigprefs=Sicurezza OpenPGP enigmail-2.0.8/lang/it/enigmail.dtd000066400000000000000000001772321334302754500171470ustar00rootroot00000000000000 Mozilla Public License 2.0.."> 'Autocrypt Key Transfer' richiede che il client email dell'altro dispositivo abbia il supporto ad Autocrypt. Sebbene questa è la soluzione più semplice, al momento solo poche app supportano questo standard. L'altro modo è di eseguire un 'Backup & restore' delle tue impostazioni Verrà creato un file ZIP con tutte le informazioni e le chiavi che dovrà essere copiato sul nuovo dispositivo. Enigmail può importare direttamente queste impostazioni; con gli altri client email, il file ZIP dovrà essere scompattato e gestito manualmente."> '"> ' per specificare gli indirizzi email"> ' per evidenziare gli indirizzi email a GnuPG. Disattivare se i destinatari usano vecchie chiavi Hushmail."> Sicurezza OpenPGP)"> NOTA: la creazione della chiave può richiedere anche parecchi minuti. Non uscire dall'applicazione prima del termine dell'operazione. Navigare su internet o svolgere attività che sfruttino intensamente il disco durante la creazione della chiave potrà facilitare la generazione dei numeri casuali e accelerare il processo stesso. Sarai avvertito quando la creazione della chiave sarà stata completata."> ' non è valido"> NOTA: La creazione della chiave può richiedere anche diversi minuti per essere completata. Non uscire dall'applicazione mentre la creazione della chiave è in corso. Sarai avvertito al termine del processo."> Nota: Enigmail verificherà comunque le firme sulle email di tutti gli account o identità, indipendentemente dal fatto che sia abilitato o meno"> chiave pubblica serve agli altri per inviare a te messaggi cifrati. Puoi distribuirla a chiunque."> chiave privata serve solo a te per decifrare le email che ti arrivano per inviare messaggi firmati. Non dovresti fornirla a nessuno."> chiave privata serve solo a te per decifrare le email che ti arrivano per inviare messaggi firmati. Non dovresti fornirla a nessuno. Per proteggere la tua chiave privata, ti sarà richiesta una frase segreta nelle due finestre seguenti."> frase segreta è una password per proteggere la tua chiave privata. Impedisce utilizzi impropri della tua chiave privata."> non sono consigliati."> Ti verrà richiesto di inserire la tua password. Per favore sposta il certificato su un dispositivo che può essere conservato in sicurezza come un CD o una chiavetta USB. Se qualcuno dovesse accedere a questo certificato potrebbe usarlo per rendere la tua chiave inutilizzabile."> esporta i tuoi dati dal vecchio computer utilizzando la procedura di backup dalle preferenze di Enigmail importa i dati nel nuovo computer utilizzando questa procedura. "> Grazie per aver scelto Enigmail."> esporta i tuoi dati dal vecchio computer utilizzando questa procedura importa i dati nel nuovo computer utilizzando la procedura di configurazione. "> enigmail-2.0.8/lang/it/enigmail.properties000066400000000000000000001603231334302754500205610ustar00rootroot00000000000000Enigmail=Enigmail ##################################################################### # Strings used within enigmailCommon.js and enigmailCommon.jsm ##################################################################### enigAlert=Avviso Enigmail enigConfirm=Conferma Enigmail enigInfo=Informazioni Enigmail enigError=Errore Enigmail enigPrompt=Richiesta Enigmail dlgYes=&Sì dlgNo=&No dlgKeepSetting=Ricorda la risposta e non chiedere ancora dlgNoPrompt=Non mostrare ancora questa finestra dlg.button.delete=&Elimina dlg.button.cancel=&Annulla dlg.button.close=&Chiudi dlg.button.continue=Con&tinua dlg.button.skip=&Salta dlg.button.overwrite=S&ovrascrivi dlg.button.view=&Visualizza dlg.button.retry=&Riprova dlg.button.ignore=&Ignora dlg.button.install=&Installa dlg.button.ok=&OK repeatPrefix=\n\nQuesto avviso sarà ripetuto %S repeatSuffixSingular=altra volta. repeatSuffixPlural=altre volte. noRepeat=\n\nQuesto avviso non sarà ripetuto fino a che non aggiornerai Enigmail. pgpNotSupported=Sembra che tu stia usando Enigmail insieme a PGP 6.x\n\nSfortunatamente, PGP 6.x ha una serie di problemi che impediscono a Enigmail di operare correttamente. Pertanto, Enigmail non supporta più PGP 6.x ed è necessario usare GnuPG (GPG) al suo posto.\n\nSe hai bisogno di aiuto su come passare da PGP a GnuPG, controlla la sezione 'Help' della pagina web di Enigmail. initErr.howToFixIt=Per utilizzare Enigmail, è richiesto GnuPG. Se non hai ancora installato GnuPG, il modo più semplice per farlo è utilizzare il pulsante "Procedura guidata di configurazione" initErr.setupWizard.button=Procedura guidata di configura&zione passphraseCleared=La frase segreta è stata cancellata. cannotClearPassphrase=Stai utilizzando uno strumento non standard (come gnome-keyring) per la gestione della frase segreta. Non è perciò possibile cancellare la frase segreta dall'interno di Enigmail. noPhotoAvailable=Nessuna foto disponibile debugLog.title=Log di debug di Enigmail error.photoPathNotReadable=Il percorso '%S' della foto non è leggibile generalError=Errore: %S # Strings in configure.jsm enigmailCommon.versionSignificantlyChanged=Questa nuova versione di Enigmail apporta modifiche significative alla gestione delle preferenze e delle opzioni. Abbiamo provato a trasferire le vecchie impostazioni in questa nuova versione. Tuttavia, non siamo in grado di verificarle tutte automaticamente. Controlla le nuove preferenze e opzioni risultanti. enigmailCommon.checkPreferences=Controlla preferenze... preferences.defaultToPgpMime=Abbiamo modificato la cifratura predefinita del messaggio in Enigmail da PGP in linea a PGP/MIME. Ti consigliamo di mantenerla come predefinita.\n\nSe desideri utilizzare ancora PGP in linea in modo predefinito, puoi farlo nelle impostazioni dell'account sotto Sicurezza OpenPGP. ##################################################################### # Strings in enigmailAbout.js ##################################################################### usingVersion=In esecuzione la versione %S di Enigmail enigmailPepVersion=Enigmail/p≡p versione %S usingAgent=L'eseguibile di %S in uso per cifrare e decifrare è: %S agentError=ERRORE: accesso al servizio Enigmime non riuscito! ##################################################################### # Strings in enigmailKeygen.js ##################################################################### accessError=Errore durante l'accesso al servizio Enigmail onlyGPG=La creazione delle chiavi funziona solo con GnuPG (non con PGP)! keygenComplete=Creazione della chiave completata! L'identità <%S> sarà utilizzata per la firma. revokeCertRecommended=Ti consigliamo decisamente di creare un certificato di revoca per la tua chiave. Questo certificato può essere usato per invalidare la tua chiave, se ad esempio la tua chiave privata viene smarrita o compromessa. Vuoi creare un certificato di revoca adesso? keyMan.button.generateCert=&Genera certificato genCompleteNoSign=Creazione certificato completata! genGoing=La creazione della chiave è già in corso! passNoMatch=Le frasi segrete digitate non corrispondono; prova a reinserirle passCheckBox=Marca la casella se non vuoi specificare una frase segreta per la chiave passUserName=Specifica un nome utente per questa identità keygen.missingUserName=Non è stato specificato alcun nome per l'account/identità selezionato. Digita un valore nel campo "Il tuo nome" nelle impostazioni dell'account. keygen.passCharProblem=Stai utilizzando caratteri speciali nella tua frase segreta. Sfortunatamente, ciò può causare problemi con altre applicazione. Ti consigliamo di scegliere una frase segreta che contenga solo i caratteri che seguono:\na-z A-Z 0-9 /.;:-,!?(){}[]%* passSpaceProblem=Due to technical reasons, your passphrase may not start or end with a space character. changePassFailed=Cambiamento della frase segreta non riuscito. keyConfirm=Creare chiave pubblica e privata per '%S'? keyMan.button.generateKey=&Genera chiave keyAbort=Interrompere la creazione della chiave? keyMan.button.generateKeyAbort=&Interrompi la creazione della chiave keyMan.button.generateKeyContinue=&Continua la creazione della chiave expiryTooLong=Non puoi creare una chiave che scadrà tra più di 100 anni. expiryTooLongShorter=You cannot create a key that expires in more than 90 years. expiryTooShort=La tua chiave deve essere valida per almeno un giorno. keyGenFailed=Creazione della chiave non riuscita. Controlla la console di Enigmail (Menu Enigmail -> Debug di Enigmail) per maggiori dettagli. setKeyExpirationDateFailed=La data di scadenza non dovrebbe essere modificata # Strings in enigmailMessengerOverlay.js securityInfo=Informazioni di sicurezza Enigmail\n\n enigHeader=Enigmail: enigContentNote=Enigmail: *Gli allegati di questo messaggio non sono stati firmati o cifrati*\n\n possiblyPgpMime=Il messaggio potrebbe essere firmato o cifrato nel formato PGP/MIME; fai clic sul pulsante Decifra per verificare saveAttachmentHeader=Enigmail: salva allegato decifrato noTempDir=Impossibile trovare una cartella temporanea in cui poter scrivere\nImposta la variabile di ambiente TEMP attachmentPgpKey=L'allegato '%S' che stai aprendo sembra essere un file contenente chiavi OpenPGP.\n\nFai clic su 'Importa' per importare le chiavi contenute al suo interno oppure 'Visualizza' per visualizzare il file in una finestra del browser beginPgpPart=********* *INIZIO PARTE CIFRATA o FIRMATA* ********* endPgpPart=********** *FINE PARTE CIFRATA o FIRMATA* ********** notePartEncrypted=Enigmail: *Alcune parti del messaggio NON sono state cifrate o firmate* noteCutMessage=Enigmail: *Sono stati trovati blocchi di messaggio multipli -- decifratura/verifica interrotta* decryptOkNoSig=Attenzione\n\nLa decifratura è riuscita, ma non è stato possibile verificare correttamente la firma msgOvl.button.contAnyway=&Continua comunque signature.verifiedOK=La firma per l'allegato %S è stata verificata correttamente signature.verifyFailed=La firma per l'allegato %S non può essere verificata attachment.noMatchToSignature=L'allegato '%S' non corrisponde a un file di firma attachment.noMatchFromSignature=Il file di firma '%S' non corrisponde a un allegato fixBrokenExchangeMsg.failed=La riparazione del messaggio non è riuscita. enigmail.msgViewColumn.label=Enigmail enigmailPep.msgViewColumn.label=Enigmail/p≡p wksNoIdentity=Questa chiave non è collegata a nessuno dei tuoi account di posta. Aggiungi un account per almeno uno dei seguenti indirizzi di posta:\n\n%S wksConfirmSuccess=Messaggio di conferma inviato. wksConfirmFailure=Invio del messaggio di conferma non riuscito. # autocrypt.importSetupKey.accountPreconfigured=Your account is already correctly configured for Autocrypt.\n\nDo you really want to overwrite your settings with this setup message? # autocrypt.importSetupKey.selfCreated=This message was created by your currently running instance of Enigmail.\n\nPlease switch to the email client to which you want to transfer the settings, and click on the message on that email client to import the settings. # autocrypt.importSetupKey.invalidMessage=Error - could not read setup message. The message seems to be corrupted. Please try to create a new setup message on your "other" device. autocrypt.importSetupKey.invalidKey=Errore la chiave non può essere importata. La chiave non è supportata dalla tua versione di GnuPG o è danneggiata. autocrypt.importSetupKey.wrongPasswd=La password che hai digitato è errata. Vuoi riprovare? autocrypt.importSetupKey.success=Il messaggio di configurazione di Autocrypt è stato elaborato correttamente. Autocrypt è ora disponibile per il tuo account '%S'. ##################################################################### # Strings in enigmailMsgComposeOverlay.js ##################################################################### keysToExport=Scegli le chiavi OpenPGP da inserire keysToUse=Scegli la/le chiave/i OpenPGP da usare per %S pubKey=Chiave pubblica per %S\n windowLocked=La finestra di composizione è bloccata; invio annullato sendUnencrypted=Inizializzazione di Enigmail non riuscita.\nInviare il messaggio non cifrato? composeSpecifyEmail=Specifica il tuo indirizzo email principale, che sarà usato per scegliere la chiave che firmerà i messaggi in uscita.\n Se lasci in bianco, l'indirizzo del mittente nel campo DA di ogni messaggio sarà usato per scegliere la chiave per la firma. sendingHiddenRcpt=Questo messaggio ha destinatari in CCN (copia nascosta). Se questo messaggio verrà cifrato, sarà possibile tenere nascosti i destinatari in CCN, ma gli utenti di alcuni programmi (come PGP Corp.) non saranno in grado di decifrare il messaggio. Pertanto, consigliamo di evitare di spedire messaggi cifrati a destinatari in CCN. sendWithHiddenBcc=Nascondi i destinatari in CCN sendWithShownBcc=Cifra normalmente sendingNews=Operazione di invio cifrato interrotta.\n\nQuesto messaggio non può essere cifrato perché il destinatario è un gruppo di discussione. Invia nuovamente il messaggio senza cifratura. sendToNewsWarning=Attenzione: stai per inviare un messaggio cifrato a un gruppo di discussione.\n\nCiò è altamente sconsigliabile, perché ha senso solo se tutti i membri del gruppo sono in grado di decifrare il messaggio, cioè se il messaggio viene cifrato con le chiavi di tutti i membri del gruppo. Invia questo messaggio solo se sai perfettamente cosa stai facendo.\n\nVuoi continuare? hasHTML=Attenzione, email in formato HTML:\nQuesto messaggio potrebbe contenere parti in formato HTML, che potrebbero impedire la firma/cifratura. Per evitare questo in futuro, dovrai tenere premuto il tasto MAIUSC mentre fai clic sul pulsante Componi/Rispondi per inviare messaggi firmati.\nSe hai scelto di firmare le email in modo predefinito, deseleziona l'opzione 'Componi messaggi in HTML' per disabilitare permanentemente la creazione di email in HTML per questo account. strippingHTML=Il messaggio contiene una formattazione in HTML che andrà persa con la conversione in testo semplice per la firma/cifratura. Desideri continuare? msgCompose.button.sendAnyway=&Invia il messaggio comunque attachWarning=Gli allegati di questo messaggio non sono locali e non possono essere cifrati. Per cifrare gli allegati, salvali prima come file locali e allega di nuovo questi ultimi. Vuoi inviare il messaggio comunque? quotedPrintableWarn=Hai abilitato la codifica 'quoted-printable' per l'invio dei messaggi. Questo può provocare errori nella decifratura e/o nella verifica del messaggio.\nVuoi disattivare ora l'invio di messaggi 'quoted-printable'? minimalLineWrapping=Hai impostato l'interruzione di riga automatica ogni %S caratteri. Per una corretta cifratura e/o firma, questo valore deve essere almeno 68.\nVuoi impostare subito l'interruzione di riga dopo 68 caratteri? warning=Attenzione signIconClicked=Hai modificato manualmente la firma. Pertanto, durante la composizione di questo messaggio, (dis)attivare la firma non dipende più dalla (dis)attivazione della cifratura. errorOwnKeyUnusable=L'ID della chiave '%S' configurato per l'identità corrente non fornisce una chiave OpenPGP utilizzabile.\n\nAssicurati di avere una chiave OpenPGP valida e non scaduta e che le impostazioni del tuo account puntino a tale chiave.\nSe la tua chiave non è scaduta, controlla se hai impostato la fiducia nel proprietario a completa o definitiva. msgCompose.cannotSaveDraft=Errore durante il salvataggio della bozza # msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information - partially encrypted email. # msgCompose.partiallyEncrypted.mimeMsg=The message you are replying to contained both unencrypted and encrypted parts. Some encrypted message parts are invisible to you.\n\nIf the sender was not able to decrypt the hidden message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nWe recommend that you don't reply to the message, but create a new message containing your answer. # msgCompose.partiallyEncrypted.inlinePGP=The message you are replying to contained both unencrypted and encrypted parts. If the sender was not able to decrypt some message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nPlease consider removing all quoted text from your reply to this sender. msgCompose.internalEncryptionError=Errore interno: cifratura promessa disabilitata msgCompose.internalError=Si è verificato un errore interno. msgCompose.toolbarTxt.signAndEncrypt=Questo messaggio sarà firmato e cifrato msgCompose.toolbarTxt.signOnly=Questo messaggio sarà firmato msgCompose.toolbarTxt.encryptOnly=Questo messaggio sarà cifrato msgCompose.toolbarTxt.noEncryption=Questo messaggio non sarà né firmato, né cifrato msgCompose.toolbarTxt.disabled=Enigmail è disabilitato per l'identità selezionata msgCompose.protectSubject.tooltip=Proteggi l'oggetto del messaggio msgCompose.noSubjectProtection.tooltip=Non proteggere l'oggetto del messaggio msgCompose.encryptedSubjectStub=Messaggio cifrato msgCompose.protectSubject.dialogTitle=Vuoi abilitare la protezione dell'oggetto? # msgCompose.protectSubject.question=Regular encrypted emails contain the unredacted subject.\n\nWe have established a standard to hide the original subject in the encrypted message\nand replace it with a dummy text, such that the subject is only visible after the email is decrypted.\n\nDo you want to protect the subject in encrypted messages? msgCompose.protectSubject.yesButton=&Proteggi oggetto msgCompose.protectSubject.noButton=&Lascia l'oggetto non protetto msgCompose.detailsButton.label=Dettagli... msgCompose.detailsButton.accessKey=D msgCompose.pepSendUnknown=Sconosciuto msgCompose.pepSendUnsecure=Non sicuro msgCompose.pepSendSecure=Sicuro msgCompose.pepSendTrusted=Sicuro e affidabile pep.alert.disabledForIdentity=p≡p è disabilitato per l'identità attuale. Abilita p≡p dalle preferenze di Enigmail/p≡p. pep.alert.weakReply=Stai per inoltrare o rispondere a un messaggio sicuro in modo non sicuro. Se scegli di continuare, informazioni confidenziali potrebbero essere sottratte, mettendo a rischio te e il tuo interlocutore. Sei sicuro di voler continuare? # note: should end with double newline: sendAborted=Operazione di invio interrotta.\n\n # details: keyNotTrusted=La chiave '%S' non è sufficientemente affidabile keyNotFound=Chiave '%S' non trovata keyRevoked=Chiave '%S' revocata keyExpired=Chiave '%S' scaduta statPGPMIME=PGP/MIME statSMIME=S/MIME statSigned=FIRMATO statEncrypted=CIFRATO statPlain=NON FIRMATO E IN CHIARO offlineSave=Salvo il messaggio %S destinato a %S nella cartella 'Da inviare'? onlineSend=Invio il messaggio %S destinato a %S? encryptKeysNote=Nota: il messaggio è cifrato con i seguenti ID utente / chiavi: %S hiddenKey= signFailed=Errore in Enigmail; Cifratura/firma non riuscita; spedire il messaggio in chiaro? msgCompose.button.sendUnencrypted=&Invia messaggio in chiaro recipientsSelectionHdr=Scegli i destinatari per la cifratura configureNow=Non hai ancora configurato le impostazioni di sicurezza Enigmail per questa identità. Vuoi farlo adesso? # encryption/signing status and associated reasons: encryptMessageAuto=Cifra messaggio (auto) encryptMessageNorm=Cifra messaggio signMessageAuto=Firma messaggio (auto) signMessageNorm=Firma messaggio encryptOff=Cifratura: DISATTIVA encryptOnWithReason=Cifratura: ATTIVA (%S) encryptOffWithReason=Cifratura: DISATTIVA (%S) encryptOn=Cifratura: ATTIVA signOn=Firma: ATTIVA signOff=Firma: DISATTIVA signOnWithReason=Firma: ATTIVA (%S) signOffWithReason=Firma: DISATTIVA (%S) reasonEnabledByDefault=abilitato in modo predefinito reasonManuallyForced=forzato manualmente reasonByRecipientRules=forzato dalle regole per destinatario reasonByAutoEncryption=forzato dalla cifratura automatica reasonByConflict=a causa di un conflitto nelle regole per destinatario reasonByEncryptionMode=a causa della modalità di cifratura # should not be used anymore: encryptYes=Il messaggio sarà cifrato encryptNo=Il messaggio non sarà cifrato # should not be used anymore: signYes=Il messaggio sarà firmato signNo=Il messaggio non sarà firmato # PGP/MIME status: pgpmimeNormal=Protocollo: PGP/MIME inlinePGPNormal=Protocollo: PGP in linea smimeNormal=Protocollo: S/MIME pgpmimeAuto=Protocollo: PGP/MIME (auto) inlinePGPAuto=Protocollo: PGP in linea (auto) smimeAuto=Protocollo: S/MIME (auto) # should not be used anymore pgpmimeYes=Sarà utilizzato PGP/MIME pgpmimeNo=Sarà utilizzato PGP in linea # Attach own key status (tooltip strings): attachOwnKeyNo=La tua chiave non sarà allegata attachOwnKeyYes=La tua chiave sarà allegata attachOwnKeyDisabled=La tua chiave non può essere allegata. Devi selezionare una chiave specifica\nnella sezione OpenPGP delle impostazioni account per abilitare questa funzionalità. rulesConflict=Alcune delle regole impostate per i destinatari sono in conflitto fra di loro\n%S\n\nInviare il messaggio con queste impostazioni? msgCompose.button.configure=&Configura msgCompose.button.send=&Invia messaggio msgCompose.button.save=&Salva messaggio # Strings in enigmailMsgHdrViewOverlay.js keyNeeded=Chiave pubblica %S richiesta per verificare la firma keyUsed=Chiave pubblica %S utilizzata per verificare la firma clickDecrypt=; fai clic sul pulsante 'Decifra' clickDecryptRetry=; fai clic sul pulsante 'Decifra' per riprovare clickDetailsButton=; fai clic sul pulsante 'Dettagli' per ulteriori informazioni clickImportButton=; fai clic sul pulsante 'Importa chiave' per scaricare la chiave keyTypeUnsupported=; il tipo di chiave non è supportato dalla tua versione di GnuPG msgPart=Parte del messaggio %S msgSigned=firmato msgSignedUnkownKey=firmato con una chiave sconosciuta msgEncrypted=cifrato msgSignedAndEnc=firmato e cifrato unverifiedSig=Firma non verificata incompleteDecrypt=Decifratura incompleta needKey=Errore - serve la chiave segreta per decifrare il messaggio failedDecrypt=Errore - decifratura non riuscita badPhrase=Errore - frase segreta non valida failedDecryptVerify=Errore - decifratura/verifica non riuscita mdcError=Errore - l'integrità del messaggio non era protetta viewInfo=; Visualizza > Informazioni di sicurezza messaggio per i dettagli decryptedMsg=Messaggio decifrato decryptedMsgWithFormatError=Messaggio decifrato (ripristinato formato dell'email PGP danneggiata, probabilmente a causa di un server Exchange datato. Il risultato potrebbe non essere perfettamente leggibile) usedAlgorithms=Algoritmi utilizzati: %S e %S pepStatusInfo.text=Stato del messaggio di p≡p . pepStatusInfo.title.m3=Sotto attacco pepStatusInfo.info.m3=Questo messaggio non è sicuro ed è stato alterato. pepStatusInfo.title.m1=Diffidato pepStatusInfo.info.m1=Questo messaggio ha un interlocutore che è stato precedentemente marcato come diffidato pepStatusInfo.title.r0=Sconosciuto pepStatusInfo.info.r0=Questo messaggio non contiene informazioni sufficienti per determinare se è sicuro. pepStatusInfo.title.r1=Impossibile decifrare pepStatusInfo.info.r1=Questo messaggio non può essere decifrato poiché la chiave non è disponibile. pepStatusInfo.title.r2=Impossibile decifrare pepStatusInfo.info.r2=Questo messaggio non può essere decifrato poiché la chiave non è disponibile. pepStatusInfo.title.r3=Non sicuro pepStatusInfo.info.r3=Questo messaggio non è sicuro. pepStatusInfo.title.r4=Non sicuro per alcuni pepStatusInfo.info.r4=Questo messaggio non è sicuro per alcuni interlocutori. pepStatusInfo.title.r5=Sicurezza inaffidabile pepStatusInfo.info.r5=Questo messaggio ha una protezione non affidabile. pepStatusInfo.title.r6=Proteggi... pepStatusInfo.info.r6=Questo messaggio è sicuro, ma devi comunque verificare l'identità del tuo interlocutore. pepStatusInfo.title.r7=Sicuro e affidabile pepStatusInfo.info.r7=Questo messaggio è sicuro e affidabile. pepStatusInfo.color.green=Verde pepStatusInfo.color.yellow=Giallo pepStatusInfo.color.red=Rosso pepRevokeTrust.question=Vuoi davvero annullare la fiducia per %S? pepRevokeMistrust.question=Vuoi davvero ripristinare la fiducia della chiave per %S? pepRevokeTrust.doRevoke=Annulla &fiducia wksConfirmationReq=Richiesta di conferma directory WebKey # wksConfirmationReq.message=This message has been sent by your email provider to confirm deployment of your OpenPGP public key\nin their Web Key Directory.\nProviding your public key helps others to discover your key and thus being able to encrypt messages to you.\n\nIf you want to deploy your key in the Web Key Directory now, please click on the button "Confirm Request" in the status bar.\nOtherwise, simply ignore this message. wksConfirmationReq.button.label=Conferma richiesta autocryptSetupReq=Esegui configurazione Autocrypt autocryptSetupReq.button.label=Avvia configurazione autocryptSetupReq.setupMsg.desc=Questo messaggio contiene tutte le informazioni per trasferire le tue impostazioni di Autocrypt insieme alla tua chiave segreta in modo sicuro dal tuo dispositivo originale. # autocryptSetupReq.setupMsg.backup=You can keep this message and use it as a backup for your secret key. If you want to do this, you should write down the password and store it securely. autocryptSetupReq.message.import=Per importare le impostazioni e le chiavi in Enigmail, fai clic sul pulsante "Avvia configurazione" nella barra di stato. autocryptSetupReq.message.sent=Fai clic sul messaggio sul tuo nuovo dispositivo e segui le istruzioni per importare le impostazioni. # strings in pref-enigmail.js oldGpgVersion20=Inizializzazione di Enigmail non riuscita.\n\nStai utilizzando la versione %1$S di GnuPG, che non è più supportata. Enigmail richiede la versione %2$S o superiore di GnuPG. Aggiorna la tua installazione di GnuPG, o Enigmail non funzionerà. locateGpg=Trova l'eseguibile di GnuPG invalidGpgPath=GnuPG non può essere eseguito dal percorso impostato. Enigmail rimarrà quindi disattivato fino a quando non imposterai di nuovo il percorso di GnuPG o non riavvierai l'applicazione. warningsAreReset=Tutti gli avvisi sono stati riattivati. prefs.gpgFound=GnuPG è stato trovato in %S prefs.gpgNotFound=Impossibile trovare GnuPG prefs.warnAskNever=Attenzione: l'attivazione di questa opzione implica l'invio automatico di email in chiaro senza nessuna ulteriore comunicazione in mancanza di chiavi disponibili per anche uno solo dei destinatari -- Enigmail non mostrerà nessun messaggio di avvertimento nel caso in cui questa eventualità si verifichi! prefs.warnIdleTimeForUnknownAgent=Impossibile connettersi a gpg-agent. Il tuo sistema utilizza uno strumento specializzato per la gestione della chiave segreta come gnome-keyring o seahorse-agent. Sfortunatamente, Enigmail non può controllare il timeout della frase segreta per lo strumento utilizzato. Perciò le relative impostazioni di timeout in Enigmail sono ignorate. prefEnigmail.oneKeyserverOnly=Errore - puoi specificare un solo server per lo scaricamento automatico delle chiavi OpenPGP mancanti. # Strings used in core.jsm # (said file also re-uses some strings from above) enterAdminPin=Inserisci l'Admin PIN della tua smartcard enterCardPin=Inserisci il PIN della tua smartcard notInit=Errore - servizio Enigmail non ancora inizializzato badCommand=Errore - comando di cifratura non riuscito cmdLine=riga di comando e risultato: notRequired=Errore - cifratura non richiesta notComplete=Errore - la creazione della chiave non è ancora completata invalidEmail=Errore - indirizzo/i email non valido/i noPassphrase=Errore - passphrase non inserita noPGPblock=Errore - non è stato trovato nessun blocco valido di dati OpenPGP unverifiedReply=La parte di messaggio citata (in risposta) è stata probabilmente modificata keyInMessageBody=Trovata chiave nel corpo del messaggio. Fai clic su 'Importa chiave' per importare la chiave sigMismatch=Errore - firma non corrispondente cantImport=Errore nell'importazione della chiave pubblica\n\n doImportOne=Vuoi importare %1$S (%2$S)? doImportMultiple=Vuoi importare le seguenti chiavi?\n\n%S previewFailed=Impossibile leggere il file della chiave pubblica. # Strings used in errorHandling.jsm sc.wrongCardAvailable=La smartcard %S trovata nel lettore non può essere utilizzata per elaborare il messaggio.\nInserisci la smartcard %S e ripeti l'operazione. sc.insertCard=L'operazione richiede la tua smartcard %S.\nInserisci la smartcard richiesta e ripeti l'operazione. sc.removeCard=L'operazione richiede che non ci siano smartcard nel lettore.\nRimuovi la tua smartcard e ripeti l'operazione. sc.noCardAvailable=Nessuna smartcard trovata nel lettore\nInserisci la smartcard e ripeti l'operazione. sc.noReaderAvailable=Impossibile accedere al lettore di smartcard \nCollega il lettore, inserisci la scheda e ripeti l'operazione. keyError.keySpecNotFound=L'indirizzo email "%S" non può corrisponde a una chiave nel tuo portachiavi. keyError.keyIdNotFound=L'ID della chiave configurata "%S" non può essere trovato nel tuo portachiavi. keyError.resolutionAction=Seleziona un chiave valida nella sezione OpenPGP delle impostazioni del tuo account. missingPassphrase=Frase segreta mancante errorHandling.gpgAgentInvalid=Il tuo sistema esegue una versione di gpg-agent non appropriata alla tua versione di GnuPG. errorHandling.gpgAgentError=GnuPG ha segnalato un errore nella comunicazione con gpg-agent (un componente di GnuPG). errorHandling.dirmngrError=GnuPG ha segnalato un errore nella comunicazione con dirmngr (un componente di GnuPG). errorHandling.pinentryError=GnuPG non è in grado di interrogare la tua frase segreta tramite pinentry. errorHandling.readFaq=Questa è una configurazione di sistema o un errore di configurazione che impedisce a Enigmail di funzionare correttamente e non può essere corretta automaticamente.\n\nTi consigliamo di consultare il nostro sito web di supporto su https://enigmail.net/faq. gpgNotFound=Impossibile trovare l'eseguibile di GnuPG '%S'.\nAssicurati di aver impostato correttamente il percorso dell'eseguibile di GnuPG nelle impostazioni di Enigmail. gpgNotInPath=Impossibile trovare l'eseguibile di GnuPG nel PATH.\nAssicurati di aver impostato correttamente il percorso dell'eseguibile di GnuPG nelle impostazioni di Enigmail. enigmailNotAvailable=Il servizio principale di Enigmail non è disponibile prefGood=Firma autentica per %S prefBad=Firma NON autentica per %S failCancel=Errore - ricezione chiave annullata dall'utente failNoServer=Errore - nessun server specificato da cui ricevere la chiave failNoID=Errore - non è stato specificato nessun ID chiave per cui scaricare la chiave failKeyExtract=Errore - comando di estrazione chiave non riuscito notFirstBlock=Errore - il primo blocco di dati OpenPGP non è una chiave pubblica importKeyConfirm=Importare la/e chiave/i pubblica/he inserita/e nel messaggio? failKeyImport=Errore - importazione chiave non riuscita fileWriteFailed=Impossibile scrivere nel file %S importKey=Importa la chiave pubblica %S dal server: uploadKey=Invia la chiave pubblica %S al server: keyId=ID chiave keyAndSigDate=ID chiave: 0x%S / Firmata il: %S keyFpr=Impronta della chiave: %S noEmailProvided=Non hai fornito nessun indirizzo email! keyAlreadySigned=La chiave è già firmata, non puoi firmarla due volte. ##################################################################### # Strings used in enigmailKeySelection.js ##################################################################### selKeyExpired=scaduta %S createdHeader=Creata atLeastOneKey=Nessuna chiave selezionata! Devi selezionare almeno una chiave per proseguire fewerKeysThanRecipients=Hai selezionato un numero di chiavi inferiore a quello dei destinatari. Sei sicuro che l'elenco delle chiavi con cui cifrare sia completo? userSel.button.goBack=Seleziona altre chiavi userSel.secretKeySel.title=Seleziona una chiave segreta OpenPGP per firmare i messaggi userSel.problemNoKey=Nessuna chiave valida userSel.problemMultipleKeys=Chiavi multiple # should be same as thunderbird ENTITY sendLaterCmd.label: sendLaterCmd.label=Invia più tardi # Strings used in enigmailAttachmentDialog.js pgpMimeNote=NOTA: PGP/MIME non è supportato da tutti i client di posta elettronica. Se hai dei dubbi, seleziona l'opzione %S. first=primo second=secondo # Strings used in am-enigprefs.js / enigmailEditIdentity.js encryptKeyHeader=Scegli la chiave OpenPGP per la cifratura identityName=Identità: %S # switchPepMode=You are currently using the 'p≡p Junior' mode of Enigmail.\n\nBy enabling OpenPGP or S/MIME for an account, you are disabling p≡p and use the 'regular' mode of Enigmail without p≡p. enableEnigmail=&Disabilita p≡p # Strings used in enigmailSingleRcptSettings.js noEncryption=Hai attivato la cifratura, ma non hai selezionato nessuna chiave. Per cifrare i messaggi inviati a %S, devi specificare una o più chiavi valide dalla tua lista delle chiavi. Vuoi disattivare la cifratura per %S? noKeyToUse=(nessuna - nessuna cifratura) noEmptyRule=La regola non può essere vuota! Specifica un indirizzo email nel campo della regola. invalidAddress=Gli indirizzi email che hai specificato non sono validi. Non devi digitare anche il nome dei destinatari, ma solo gli indirizzi email. Ad es.:\nNon valido: Nome Cognome \nValido: nome.cognome@indirizzo.net # noCurlyBrackets=The curly brackets {} have a special meaning and should not be used in an email address. If you want to modify the matching behavior for this rule, use the 'Apply rule if recipient ...' option.\nMore information is available from the Help button. # Strings used in enigmailRulesEditor.js never=Mai always=Sempre possible=Possibile deleteRule=Vuoi davvero eliminare la regola selezionata? nextRcpt=(Destinatario successivo) negateRule=Non addKeyToRule=Aggiungi la chiave %S (%S) a una regola per destinatario # Strings used in enigmailSearchKey.js needOnline=La funzione che hai selezionato non è disponibile nella modalità non in linea. Vai in linea e riprova. protocolNotSupported=Il protocollo '%S://' che hai selezionato non è supportato per lo scaricamento delle chiavi OpenPGP. gpgkeysDisabled=Potrebbe aiutare abilitare l'opzione 'extensions.enigmail.useGpgKeysTool'. noKeyserverConn=Impossibile collegarsi al server delle chiavi a %S. keyDownloadFailed=Scaricamento della chiave dal server non riuscito. Il messaggio di stato è:\n%S internalError=Si è verificato un errore interno. Non è stato possibile né scaricare le chiavi, né importarle. noKeyFound=Spiacenti, non è stata trovata alcuna chiave che corrisponda ai criteri di ricerca specificati.\nRicorda che l'ID della chiave deve essere preceduto da "0x" (ad es. 0xABCDEF12). # keyDownload.keyUnavailable=We are sorry, but the key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their key by email. # gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. gpgKeysFailed=Impossibile cercare o scaricare la chiave dal server: non è stato possibile eseguire gpgkeys_%S. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Impostazione della fiducia nel proprietario non riuscita # Strings in enigmailSignKeyDlg.js signKeyFailed=Firma della chiave non riuscita alreadySigned.label=Nota: la chiave %S è già stata firmata con la chiave segreta selezionata. alreadySignedexportable.label=Nota: la chiave %S è già firmata come esportabile con la chiave privata selezionata. Una firma locale non ha senso. partlySigned.label=Nota: alcuni ID utente della chiave %S sono già firmati con la chiave segreta selezionata. noTrustedOwnKeys=Non è stata trovata alcuna chiave idonea per firmare! Hai bisogno almeno di una chiave privata definitivamente affidabile per firmare le chiavi. # Strings in enigmailKeyManager.js keyMan.loadingKeys=Caricamento delle chiavi in corso, attendere... keyValid.unknown=sconosciuta keyValid.invalid=non valida keyValid.disabled=disabilitata keyValid.revoked=revocata keyValid.expired=scaduta keyValid.noSubkey=non ci sono sottochiavi valide keyTrust.untrusted=senza fiducia keyTrust.marginal=marginale keyTrust.full=fidata keyTrust.ultimate=definitiva keyTrust.group=(gruppo) keyType.public=pub keyType.publicAndSec=pub/sec keyMan.enableKey=Abilita chiave keyMan.disableKey=Disabilita chiave userAtt.photo=Attributo dell'utente (immagine JPEG) asciiArmorFile=File con armatura ASCII (*.asc) importKeyFile=Importa file di chiave OpenPGP gnupgFile=File di GnuPG createKeyOK=La tua chiave è stata generata saveRevokeCertAs=Crea e salva certificato di revoca revokeCertOK=Il certificato di revoca è stato creato correttamente. Puoi usarlo per togliere validità alla tua chiave pubblica, come nel caso in cui tu perda la tua chiave privata. revokeCertFailed=Il certificato di revoca non può essere creato. addUidOK=ID utente aggiunto correttamente addUidFailed=Aggiunta dello ID utente non riuscita noKeySelected=Devi selezionare almeno una chiave per poter eseguire l'operazione selezionata exportToFile=Esporta la chiave pubblica in un file exportKeypairToFile=Esporta chiave privata e pubblica su file exportSecretKey=Vuoi includere anche la chiave privata nel file di chiave OpenPGP che viene salvato? saveKeysOK=Le chiavi sono state salvate correttamente saveKeysFailed=Salvataggio delle chiavi non riuscito importKeysFailed=Importazione delle chiavi non riuscita enableKeyFailed=Abilitazione/disabilitazione delle chiavi non riuscita specificPubKeyFilename=%S (0x%S) pub specificPubSecKeyFilename=%S (0x%S) pub-sec defaultPubKeyFilename=Chiavi-pubbliche-esportate defaultPubSecKeyFilename=Chiavi-pubbliche-e-private-esportate noSecretKeys=Non sono state trovate chiavi segrete.\n\nVuoi generare la tua chiave ora? sendKeysOk=Chiave/i inviata/e correttamente sendKeysFailed=Invio delle chiavi non riuscito receiveKeysOk=Chiave/i aggiornata/e correttamente receiveKeysFailed=Scaricamento della/e chiave/i non riuscito importFromClip=Vuoi importare alcune chiavi dagli appunti? importFromUrl=Scarica la chiave pubblica da questo URL: copyToClipbrdFailed=Impossibile copiare le chiavi selezionate negli appunti. copyToClipbrdOK=Chiave/i copiata/e negli appunti deleteSecretKey=ATTENZIONE: stai per eliminare una chiave privata!\nSe elimini la tua chiave privata, non sarai più in grado di decifrare alcun messaggio cifrato per quella chiave.\n\nVuoi veramente eliminarle ENTRAMBE, sia la chiave privata che la chiave pubblica\n'%S'? deleteMix=ATTENZIONE: Stai per eliminare delle chiavi private!\nSe elimini la tua chiave privata, non sarai più in grado di decifrare alcun messaggio cifrato per quella chiave.\n\nVuoi davvero eliminarle TUTTE, sia le chiavi private che le chiavi pubbliche? deletePubKey=Vuoi eliminare la chiave pubblica\n'%S'? deleteSelectedPubKey=Vuoi eliminare le chiavi pubbliche? deleteKeyFailed=La chiave non può essere eliminata. revokeKeyQuestion=Stai per revocare la chiave '%S'.\n\nNon sarai più in grado di firmare con questa chiave, e, una volta distribuita, gli altri non saranno in grado di cifrare con la tale chiave. Puoi ancora utilizzare la chiave per decifrare i vecchi messaggi.\n\nVuoi continuare? revokeKeyOk=La chiave è stata revocata. Se la tua chiave è disponibile su un server, è consigliabile spedirgliela di nuovo, così che tutti possano vedere la revoca. revokeKeyFailed=La chiave non può essere revocata. revokeKeyNotPresent=Non hai una chiave (0x%S) che corrisponda a questo certificato di revoca!\n\nSe hai perso la chiave, devi importarla (ad es. da un server di chiavi) prima del certificato di revoca! revokeKeyAlreadyRevoked=La chiave 0x%S è già stata revocata. refreshAllQuestion=Non hai selezionato nessuna chiave. Vuoi ricaricare TUTTE le chiavi? refreshKeyServiceOn.warn=Avviso: le tue chiavi sono in fase di aggiornamento sullo sfondo con la massima sicurezza possibile.\nL'aggiornamento di tutte le tue chiavi in un'unica soluzione rivelerà, senza che sia necessario, informazioni sul tuo conto.\nVuoi farlo davvero? refreshKey.warn=Attenzione: in base al numero delle chiavi e alla velocità di connessione, ricaricare tutte le chiavi può essere un processo molto lungo! downloadContactsKeys.warn=Avviso: in base al numero di contatti e alla velocità di connessione, lo scaricamento di tutte le chiavi potrebbe risultare un processo molto lungo. downloadContactsKeys.importFrom=Vuoi importare i contatti dalla rubrica '%S'? keyMan.button.exportSecKey=Esporta chiavi &segrete keyMan.button.exportPubKey=Esporta solo le chiavi &pubbliche keyMan.button.import=&Importa keyMan.button.refreshAll=&Ricarica tutte le chiavi keyMan.button.revokeKey=&Revoca chiave keyMan.button.skip=&Salta chiave keylist.noOtherUids=Non ha altre identità keylist.hasOtherUids=Noto anche come keylist.noPhotos=Non ci sono fotografie disponibili keylist.hasPhotos=Fotografie keyMan.addphoto.filepicker.title=Seleziona foto da aggiungere keyMan.addphoto.warnLargeFile=Il file scelto è più grande di 25 kB.\nNon è consigliato aggiungere file molto grandi per non rendere eccessivamente pesanti le chiavi. keyMan.addphoto.noJpegFile=Il file selezionato non sembra essere un file JPEG. Scegli un altro file. keyMan.addphoto.failed=La foto non può essere aggiunta. noWksIdentity=La chiave %S non ha un'identità WKS. keyman.addBlacklistKey.msg=Vuoi davvero che p≡p smetta di utilizzare la chiave "%1$S (%2$S)" per cifrare i messaggi? keyman.removeBlacklistKey.msg=Vuoi consentire a p≡p di utilizzare la chiave "%1$S (%2$S)" per i messaggi futuri? keyman.addBlacklistKey.button=Ins&erisci la chiave nella lista nera keyman.removeBlacklistKey.button=&Rimuovi la chiave dalla lista nera # Strings in enigmailManageUidDlg.xul changePrimUidFailed=Cambiamento dell'ID utente primario non riuscito changePrimUidOK=L'ID utente primario è stato cambiato correttamente revokeUidFailed=Revoca dell'ID utente %S non riuscita revokeUidOK=L'ID utente %S è stato revocato con successo. Se la tua chiave è disponibile su un server delle chiavi, è consigliabile caricarla di nuovo, così che tutti possano vedere la revoca. revokeUidQuestion=Vuoi veramente revocare l'ID utente %S? # Strings in enigmailKeyImportInfo.xul importInfoTitle=SUCCESSO! Chiavi importate importInfoBits=Bit importInfoCreated=Creato il importInfoFpr=Impronta digitale importInfoDetails=(Dettagli) importInfoNoKeys=Nessuna chiave importata. # Strings in enigmailKeyDetailsDlg.xul keyTypePublic=chiave pubblica keyTypePrimary=chiave principale keyTypeSubkey=sottochiave keyTypePair=coppia di chiavi keyExpiryNever=mai keyAlgorithm_1=RSA keyAlgorithm_2=RSA keyAlgorithm_3=RSA keyAlgorithm_16=ELG keyAlgorithm_17=DSA keyAlgorithm_18=ECC keyAlgorithm_19=ECC keyAlgorithm_20=ELG keyAlgorithm_22=EDDSA keyUsageEncrypt=Cifra keyUsageSign=Firma keyUsageCertify=Certifica keyUsageAuthentication=Autenticazione keyDoesNotExpire=La chiave non scade # Strings in enigmailGenCardKey.xul keygen.started=Attendi mentre la chiave viene generata... keygen.completed=Chiave generata. Il nuovo ID chiave è: 0x%S keygen.keyBackup=La copia della chiave viene salvata in %S keygen.passRequired=Inserisci una frase segreta se vuoi creare una copia di sicurezza della tua chiave al di fuori della tua smartcard. # Strings in enigmailSetCardPin.xul cardPin.processFailed=Cambiamento di PIN non riuscito # Strings in enigRetrieveProgres.xul keyserverProgress.refreshing=Aggiornamento chiavi in corso, attendere... keyserverProgress.uploading=Invio chiavi in corso, attendere... keyserverProgress.wksUploadFailed=Impossibile caricare la tua chiave sul servizio WebKey keyserverProgress.wksUploadCompleted=La tua chiave pubblica è stata inviata correttamente al tuo fornitore. Riceverai un messaggio per confermare che hai iniziato il caricamento. keyserverTitle.refreshing=Ricarica le chiavi keyserverTitle.uploading=Invia la chiave # Strings in enigmailSetupWizard passphrase.min8keys=La tua frase segreta deve contenere almeno 8 caratteri! setupWizard.reallyCancel=Vuoi veramente chiudere la procedura guidata di configurazione di Enigmail? setupWizard.invalidGpg=Il file specificato non è un eseguibile GnuPG. Scegli un altro file. setupWizard.specifyFile=Devi specificare almeno un file di chiave pubblica per continuare. setupWizard.installFailed=Sembra che l'installazione non sia avvenuta correttamente. Prova nuovamente l'installazione o installa GnuPG manualmente e individua l'eseguibile utilizzando il pulsante Sfoglia. setupWizard.downloadForbidden=Per la tua sicurezza, non scaricheremo GnuPG. Visita https://gnupg.org/ per scaricare GnuPG. setupWizard.downloadImpossible=Impossibile scaricare GnuPG attualmente. Prova più tardi o visita https://gnupg.org/ per scaricare GnuPG. setupWizard.hashSumError=La procedura guidata non è in grado di verificare l'integrità del file scaricato. Il file potrebbe essere danneggiato o manipolato. Vuoi continuare comunque l'installazione? setupWizard.importSettingsFile=Specifica il file di backup da caricare setupWizard.invalidSettingsFile=Il file specificato non è un file di backup delle impostazioni di Enigmail corretto. setupWizard.gpgConfExists=Il file di configurazione di GnuPG esiste già. Vuoi sovrascriverlo con quello della tua vecchia installazione? setupWizard.noGpgHomeDir=Sembra che tu abbia configurato %S per utilizzare GnuPG. Tuttavia, questa non è una cartella, non puoi usarla. setupWizard.unmachtedIds=Le seguenti identità della tua vecchia installazione potrebbero non essere verificate:\n%S\nLe impostazioni per queste identità sono state ignorate. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=Si è verificato un errore durante il tentativo di scaricamento di GnuPG. Controlla il log per ulteriori dettagli. installGnuPG.installFailed=Si è verificato un errore durante l'installazione di GnuPG. Controlla il log per ulteriori dettagli. # Strings in enigmailAddUidDlg.xul addUidDlg.nameOrEmailError=Devi inserire un nome e un indirizzo email addUidDlg.nameMinLengthError=Il nome deve contenere almeno 5 caratteri addUidDlg.invalidEmailError=Devi specificare un indirizzo email valido # Strings in enigmailCardDetails.js Carddetails.NoASCII=Le smartcard OpenPGP supportano solo caratteri ASCII in Nome/Cognome. # network error types errorType.SecurityCertificate=Il certificato di sicurezza presentato dal servizio web non è valido. errorType.SecurityProtocol=Il protocollo di sicurezza utilizzato dal servizio web è sconosciuto. errorType.Network=Si è verificato un errore di rete. # filter stuff filter.folderRequired=Devi selezionare una cartella di destinazione. filter.decryptMove.label=Decifra permanentemente (Enigmail) filter.decryptCopy.label=Crea copia decifrata (Enigmail) filter.decryptMove.warnExperimental=Avviso - l'azione di filtraggio "Decifra permanentemente" potrebbe provocare il danneggiamento dei messaggi.\n\nTi consigliamo vivamente di provare prima il filtro "Crea copia decifrata", verificare attentamente il risultato e iniziare a utilizzare questo filtro solo quando sei soddisfatto del risultato. filter.tempPepFilterDesc=Filtro temporaneo per memorizzare senza cifratura il messaggio inviato filter.term.pgpencrypted.label=Cifrato con OpenPGP filter.encrypt.label=Cifra su chiave (Enigmail) filter.keyRequired=Devi selezionare la chiave una chiave del destinatario. filter.keyNotFound=Impossibile trovare una chiave di cifratura per "%S". # filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for "%S" you will no longer be able to read the emails. # strings in enigmailConvert.jsm converter.decryptBody.failed=Impossibile decifrare il messaggio con oggetto con oggetto\n"%S".\nVuoi riprovare con una frase segreta diversa o vuoi saltare il messaggio? converter.decryptAtt.failed=Impossibile decifrare l'allegato "%1$S"\ndel messaggio con oggetto\n"%2$S".\nVuoi riprovare con una frase segreta diversa o vuoi saltare il messaggio? saveLogFile.title=Salva file di registro # strings in gpg.jsm unknownSigningAlg=Algoritmo di firma sconosciuto (ID: %S) unknownHashAlg=Hash crittografico sconosciuto (ID: %S) # strings in keyRing.jsm keyring.photo=Foto keyRing.pubKeyRevoked=La chiave %1$S (ID chiave %2$S) è revocata. keyRing.pubKeyExpired=La chiave %1$S (ID chiave %2$S) è scaduta. keyRing.pubKeyNotForSigning=La chiave %1$S (ID chiave %2$S) non può essere utilizzata per firmare. keyRing.pubKeyNotForEncryption=La chiave %1$S (ID chiave %2$S) non può essere utilizzata per cifrare. keyRing.keyDisabled=La chiave %1$S (ID chiave %2$S) è disabilitata; non può essere utilizzata. keyRing.keyNotTrusted=La chiave %1$S (ID chiave %2$S) non è abbastanza affidabile. Imposta il livello di fiducia a "definitiva" per utilizzarla per firmare. keyRing.keyInvalid=La chiave %1$S (ID chiave %2$S) non è valida (ad es. non è autofirmata) keyRing.signSubKeysRevoked=Tutte le sottochiavi di firma della chiave %1$S (ID chiave %2$S) sono scadute. keyRing.signSubKeysExpired=Tutte le sottochiavi di firma della chiave %1$S (ID chiave %2$S) sono scadute. keyRing.signSubKeysUnusable=Tutte le sottochiavi di firma della chiave %1$S (ID chiave %2$S) sono revocate, scadute o altrimenti non utilizzabili. keyRing.encSubKeysRevoked=Tutte le sottochiavi di cifratura della chiave %1$S (ID chiave %2$S) sono revocate. keyRing.encSubKeysExpired=Tutte le sottochiavi di cifratura della chiave %1$S (ID chiave %2$S) sono scadute. keyRing.noSecretKey=Sembra che tu non abbia una chiave segreta per %1$S (ID chiave %2$S) nel tuo portachiavi; non puoi utilizzare la chiave per firmare. keyRing.encSubKeysUnusable=Tutte le sottochiavi di cifratura della chiave %1$S (ID chiave %2$S) sono revocate, scadute o altrimenti non utilizzabili. #strings in exportSettingsWizard.js cannotWriteToFile=Impossibile salvare sul file '%S'. Seleziona un altro file. dataExportError=Si è verificato un errore durante l'esportazione dei tuoi dati. enigmailSettings=Impostazioni di Enigmail defaultBackupFileName=Esportazione di Enigmail specifyExportFile=Specifica il nome del file per l'esportazione homedirParamNotSUpported=I parametri aggiuntivi che configurano i percorsi come --homedir e --keyring non sono supportati per l'esportazione/ripristino delle tue impostazioni. Usa metodi alternativi come l'impostazione della variabile d'ambiente GNUPGHOME. #strings in expiry.jsm expiry.keyExpiresSoon=La chiave %1$S scadrà in meno di %2$S giorni.\n\nTi consigliamo di creare una nuova coppia di chiavi e configurare gli account corrispondenti per usare la nuova chiave. expiry.keysExpireSoon=Le seguenti chiavi scadranno in meno di %1$S giorni:\n%2$S. Ti consigliamo di creare delle nuove chiavi e configurare i tuoi account per usare le nuove chiavi. expiry.keyMissingOwnerTrust=La tua chiave segreta manca di fiducia.\n%S.\nTi consigliamo di impostare "Ti basi sulle certificazioni" per completare nelle proprietà della chiave. expiry.keysMissingOwnerTrust=Le seguenti tue chiavi segrete mancano di fiducia.\n%S.\nTi consigliamo di impostare "Ti basi sulle certificazioni" per completare nelle proprietà delle chiavi. expiry.OpenKeyManager=Apri gestione delle chiavi di Enigmail expiry.OpenKeyProperties=Apri proprietà della chiave #strings in pEpDecrypt.jsm pEpDecrypt.cannotDecrypt=Questo è un messaggio cifrato. Sfortunatamente non hai la chiave privata per decifrare il messaggio. #strings in gpgAgent.jsm gpghomedir.notexists=La cartella '%S' che contiene le tue chiavi OpenPGP non esiste e non può essere creata. gpghomedir.notwritable=La cartella '%S' che contiene le tue chiavi OpenPGP non è scrivibile. gpghomedir.notdirectory=La cartella '%S' che contiene le tue chiavi OpenPGP è un file e non una cartella. gpghomedir.notusable=Correggi i permessi della cartella o cambia la posizione della tua cartella di GnuPG. Altrimenti, GnuPG non può funzionare correttamente. #strings in pepTrustWords.js pepTrustWords.cannotVerifyOwnId=Impossibile verificare le trustword di p≡p per il proprio account. pepTrustWords.cannotFindKey=Impossibile trovare la chiave per %S. pepTrustWords.cannotStoreChange=Impossibile modificare la fiducia per %S. pepTrustWords.generalFailure=Impossibile ottenere le trustword per %S. pepTrustWords.partnerFingerprint=Impronta digitale per %S: #strings in mimeWkdHandler.jsm wkdMessage.body.req=Il tuo fornitore di posta elettronica ha elaborato la tua richiesta di caricare la chiave pubblica nella directory WebKey di OpenPGP.\n\nFai clic sul pulsante di conferma nell'intestazione di Enigmail per completare la pubblicazione della tua chiave pubblica. wkdMessage.body.process=Questo è un messaggio relativo all'elaborazione automatica per caricare la tua chiave pubblica sulla directory WebKey di OpenPGP.\n\nNon devi eseguire alcuna azione manuale a questo punto. #strings in pepHandshake.js pepPrivacyStatus.RatingBrokenSuggestion=Tu o il mittente dovreste inviare nuovamente il messaggio. pepPrivacyStatus.RatingHaveNoKeySuggestionOutgoing=Se hai composto questo messaggio, la tua chiave non è disponibile. pepPrivacyStatus.RatingMistrustSuggestion=Stabilisci nuovamente la connessione con il tuo interlocutore e prova a completare un altro handshake. pepPrivacyStatus.RatingReliableSuggestion=Completa un handshake con il tuo interlocutore scambiando le trustword di persona o telefonicamente. Un handshake è necessario solo una volta per interlocutore e assicurerà comunicazioni sicure e affidabili. pepPrivacyStatus.RatingTrustedSuggestion=Nessuna azione richiesta! pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Fai attenzione, questo messaggio potrebbe non essere sicuro. pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Aggiungi le informazioni necessarie. pepPrivacyStatus.RatingUnderAttackSuggestion=Verifica separatamente il contenuto di questo messaggio con il tuo interlocutore. pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Assicurati che lo stato di riservatezza per ogni interlocutore sia almeno sicuro. pepPrivacyStatus.RatingUnencryptedSuggestion=Chiedi al tuo interlocutore di utilizzare una soluzione di cifratura o installare p≡p. pepPrivacyStatus.RatingUnreliableSuggestion=Questo messaggio non ha una cifratura affidabile o una firma. Chiedi al tuo interlocutore di aggiornare la sua soluzione di cifratura o installare p≡p. pepPrivacyStatus.RatingBrokenExplanation=Questo messaggio ha una cifratura o formattazione danneggiata. pepPrivacyStatus.RatingHaveNoKeyExplanation=Questo messaggio non può essere decifrato poiché la chiave non è disponibile. pepPrivacyStatus.RatingMistrustExplanation=Questo messaggio ha un interlocutore che precedentemente è stato marcato come diffidato. pepPrivacyStatus.RatingReliableExplanation=Questo messaggio è sicuro, ma devi comunque verificare l'identità del tuo interlocutore. pepPrivacyStatus.RatingTrustedExplanation=Questo messaggio è sicuro e affidabile. pepPrivacyStatus.RatingUndefinedExplanation=Questo messaggio non contiene informazioni sufficienti per determinare se è sicuro. pepPrivacyStatus.RatingUnderAttackExplanation=Questo messaggio non è sicuro ed è stato alterato. pepPrivacyStatus.RatingUnencryptedExplanation=Questo messaggio non è sicuro. pepPrivacyStatus.RatingUnencryptedForSomeExplanation=Questo messaggio non è sicuro per alcuni interlocutori. pepPrivacyStatus.RatingUnreliableExplanation=Questo messaggio ha una protezione non affidabile. pepPrivacyStatus.RatingBrokenText=Danneggiato pepPrivacyStatus.RatingHaveNoKeyText=Impossibile decifrare pepPrivacyStatus.RatingMistrustText=Diffidato pepPrivacyStatus.RatingReliableText=Sicuro pepPrivacyStatus.RatingTrustedText=Sicuro e affidabile pepPrivacyStatus.RatingUndefinedText=Sconosciuto pepPrivacyStatus.RatingUnderAttackText=Sotto attacco pepPrivacyStatus.RatingUnencryptedForSomeText=Non sicuro per alcuni pepPrivacyStatus.RatingUnencryptedText=Non sicuro pepPrivacyStatus.RatingUnreliableText=Sicurezza inaffidabile handshakeDlg.button.initHandshake=Handshake... handshakeDlg.button.stopTrust=Interrompi fiducia handshakeDlg.button.reTrust=Interrompi diffida handshakeDlg.label.outgoingMessage=Messaggio in uscita handshakeDlg.label.incomingMessage=Messaggio in arrivo handshakeDlg.error.noPeers=Impossibile eseguire l'handshake senza alcun interlocutore. handshakeDlg.error.noProtection=Abilita la protezione per utilizzare la funzione Handshake. enigmail.acSetupPasswd.descEnterPasswd=Digita il codice di configurazione visualizzato sull'altro dispositivo enigmail.acSetupPasswd.descCopyPasswd=Digita il codice di configurazione visualizzato sull'altro dispositivo per continuare la configurazione #strings in autocrypt.jsm autocrypt.setupMsg.subject=Messaggio di configurazione Autocrypt # autocrypt.setupMsg.msgBody=To set up your new device for Autocrypt, please follow the instuctions that should be presented by your new device. # autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code presented on your old device, and then import the contained key into your keyring. #strings in upgradeInfo.html upgradeInfo.doctitle=Cosa c'è di nuovo in Enigmail v2.0? upgradeInfo.welcome1=Benvenuto nella nuova versione 2.0 di Enigmail! # upgradeInfo.welcome2=The release contains a lot of new and changed features. Please take a minute to find out what's new: upgradeInfo.encSubject.title=Cifrare l'oggetto del messaggio # upgradeInfo.encSubject.desc=We developed a new method that moves the email subject into the encrypted message, and replaces the visible subject with "Encrypted Message". Once such a message is decrypted, the original subject is replaced automatically. Hiding the subject is on by default; there is a preference to turn it off if you don't like it. (Note: this feature requires the message to be sent with PGP/MIME.) upgradeInfo.buttons.title=Comportamento dei pulsanti Cifra e Firma cambiato # upgradeInfo.buttons.desc=The Encrypt and Sign buttons in the message composer window now work for both the OpenPGP and S/MIME protocols. If both algorithms are possible, then Enigmail will try to prefer the one for which all keys are available. upgradeInfo.autocrypt.title=Supporto per Autocrypt # upgradeInfo.autocrypt.desc=Enigmail now supports Autocrypt, a new standard to distribute keys as part of sent messages. Enigmail automatically imports keys from Autocrypt-compliant messages, such that over time more and more emails can be encrypted. upgradeInfo.pEp.title=Nuova modalità Junior di p≡p (Prrtty Easy Privacy) # upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. You currently need to manually install p≡p for this purpose; this will change in a future release. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. upgradeInfo.bottom.desc=Visita la nostra documentazione per aiuto sull'utilizzo di Enigmail. pep.missingGnuPG=Per utilizzare Enigmail/p≡p, è richiesto GnuPG. Poiché non riusciamo a trovarlo, ti consigliamo di scaricarlo e installarlo. #strings in enigmailAbout.html aboutEnigmail.tabName=Informazioni su Enigmail aboutEnigmail.title=Supporto OpenPGP fornito da Enigmail aboutEnigmail.team=Enigmail è sviluppato dalla squadra di Enigmail: aboutEnigmail.projectLeader=Sviluppatore principale: aboutEnigmail.usability=Usabilità aboutEnigmail.documentation=Documentazione: aboutEnigmail.testing=Test: aboutEnigmail.userSupport=Supporto utente: aboutEnigmail.localization=Localizzazione: Vedi la pagina dei pacchetti della lingua di Enigmail aboutEnigmail.Credits=Ringraziamenti aboutEnigmail.origAuthor=Autore originale dell'estensione Enigmail aboutEnigmail.icons=Icone aboutEnigmail.formerMembers=Membri originali della squadra: aboutEnigmail.projectHosting=Hosting del progetto: aboutEnigmail.licenseSupportTitle=Licenza e supporto aboutEnigmail.license=Enigmail OpenPGP è open source e rilasciato nei termini della %S aboutEnigmail.support=Supporto e download disponibili su www.enigmail.net. enigmail-2.0.8/lang/it/help/000077500000000000000000000000001334302754500156015ustar00rootroot00000000000000enigmail-2.0.8/lang/it/help/compose.html000066400000000000000000000103541334302754500201370ustar00rootroot00000000000000 Enigmail Help: Composizione del Messaggio

Enigmail Help

Usare Enigmail durante la composizione dei messaggi

  • Menu di Enigmail nella finestra di Composizione dei messaggi
    • Firma il messaggio: Abilita/disabilita l'invio del messaggio firmato. L'utente viene avvertito se l'operazione di firma fallisce.
    • Cifra il messaggio: Abilita/disabilita la cifratura per tutti i destinatari prima dell'invio. L'utente viene avvertito se l'operazione di cifratura fallisce.

      Se in Impostazioni -> Scelta della chiave è stato impostato Mostra la finestra di selezione solo quando è necessario, e tra i destinatari del messaggio figurano indirizzi a cui non corrisponde nessuna delle chiavi pubbliche in tuo possesso, al momento dell'invio verrà mostrata una lista di chiavi tra cui scegliere.

      Se in Impostazioni -> Scelta della chiave è stato impostato Non mostrare mai la finestra di selezione delle chiavi OpenPGP, e tra i destinatari del messaggio figurano indirizzi a cui non corrisponde nessuna delle chiavi pubbliche in tuo possesso, il messaggio sarà inviato come testo in chiaro, senza venire cifrato.

    • Usa PGP/MIME per questo messaggio: Abilita/disabilita l'uso del formato PGP/MIME per il messaggio corrente.

      Se sai che i destinatari sono in grado di ricevere messaggi in formato PGP/MIME, allora faresti meglio ad usarlo.

      La possibilità di attivare questa funzione dipende dall'avere impostato o meno Consenti l'uso di PGP/MIME, o Usa sempre PGP/MIME, in Impostazioni -> PGP/MIME.

    • Impostazioni predefinite per la composizione: Sotto-menu.
      • Impostazioni di firma/cifratura...: scorciatoia per Configurazione account posta -> OpenPGP.
      • Impostazioni di invio...: scorciatoia per Impostazioni -> invio.
      • Impostazioni per la scelta della chiave...: scorciatoia per Impostazioni -> Scelta della chiave.
      • Impostazioni PGP/MIME...: scorciatoia per Impostazioni -> PGP/MIME.
    • Annulla cifratura: Se si verifica un problema durante l'invio del messaggio, se ad esempio il server rifiuta la richiesta, Enigmail non avrà modo di saperlo e il messaggio continuerà ad essere mostrato in formato cifrato nella finestra di composizione. Scegliendo questa voce di menu, la firma/cifratura verranno annullate e nella finestra di composizione apparirà nuovamente il testo in chiaro.
      Come soluzione temporanea, questa opzione può anche essere usata per decifrare il testo quotato quando si risponde a un messaggio cifrato. Enigmail dovrebbe decifrare automaticamente il messaggio quotato, ma se cioò non dovesse funzionare per qualche ragione, puoi usare questa voce di menu.
    • Inserisci chiave pubblica: inserisci una chiave pubblica in formato ASCII-armored a partire dalla posizione corrente del cursore nella finestra di composizione. Ti verranno chiesti gli indirizzi email delle chiavi da inserire. Le chiavi inserite in questo modo saranno automaticamente riconosciute da Enigmail sul computer del destinatario. Dopo l'inserimento della chiave, puoi ancora scegliere di cifrare/firmare il messaggio, se necessario. Attenzione a non inserire più di un blocco di chiavi pubbliche in un messaggio; specifica nel caso più indirizzi email, separati da virgole o spazi, per lo stesso blocco.
    • Cancella la passphrase memorizzata: Cancella la passphrase salvata in memoria. Utile se hai più di una passphrase.
    • Aiuto: Mostra le informazioni di aiuto (questa pagina).

Ulteriore aiuto è disponibile sul sito web di Enigmail

enigmail-2.0.8/lang/it/help/editRcptRule.html000066400000000000000000000134031334302754500210760ustar00rootroot00000000000000 Enigmail Help: Modifica regole OpenPGP

Enigmail Help

Usare l'editor delle regole di Enigmail: Modifica di una regola OpenPGP

Nell'editor delle regole puoi specificare le impostazioni predefinite per ogni destinatario per abilitare la cifratura, la firma, il formato PGP/MIME e per definire quali chiavi OpenPGP usare. In questa finestra di dialogo, puoi specificare le regole per un singolo destinatario o per un gruppo di destinatari con caratteristiche simili.

  • Imposta regole OpenPGP per : Contiene gli indirizzi email dei destinatari (senza i nomi, ovvero solo indirizzi del tipo nome.cognome@indirizzo.email). Puoi specificare indirizzi multipli, separati sa spazi. Gli indirizzi specificati qui possono consistere anche del solo dominio, in modo da comprendere tutti i destinatari di quel dominio, ad esempio @indirizzo.email corrisponderà sia a nome@indirizzo.email, nome2@indirizzo.email, nome3@indirizzo.email, ecc.
  • Applica la regola se il destinatario ...: Questo modifica la corrispondenza dell'indirizzo email. Se sono stati specificati indirizzi multipli, l'impostazione si applica a tutti. Gli esempi qui sotto assumono che si stato immesso l'indirizzo nome@indirizzo.email nel campo Regole OpenPGP sopra.
    • È esattamente: con questa impostazione, la regola viene applicata solo ai messaggi indirizzati a nome@indirizzo.email (corrispondenza esatta, maiuscole/minuscole ignorate).
    • Contiene: con questa impostazione, la regola si applica a ogni indirizzo contenente quello specificato, ad esempio tuo.nome@indirizzo.email o altro.nome@indirizzo.email.suo
    • Comincia con: con questa impostazione, la regola viene applicata a ogni indirizzo che inizia con quello specificato, ad esempio nome@indirizzo.email.suo, nome@indirizzo.email-2.suo.
    • Finisce con: Con questa impostazione la regola viene applicata a ogni indirizzo che finisce con quello specificato, ad esempio tuonome@indirizzo.email o altro.nome@indirizzo.email
  • Continua con la regola successiva per l'indirizzo corrispondente
    Abilitare questa funzione ti permette di definire una regola senza dover specificare un ID chiave nel campo Usa le seguenti chiavi OpenPGP:. In tal caso la chiave da usare sarà scelta al momento dell'invio in base all'indirizzo email del destinatario. Inoltre, saranno anche applicate le eventuali ulteriori regole per lo stesso indirizzo.
  • Non controllare le regole successive per l'indirizzo corrispondente
    Abilitando questa funzione si impedisce l'applicazione di qualunque altra regola per gli indirizzi corrispondenti, se questa regola viene applicata; il controllo delle regole passa al destinatario seguente.
  • Usa le seguenti chiavi OpenPGP:
    Usa il pulsante Seleziona chiave/i.. per scegliere la chiave pubblica del destinatario da usare per la cifratura. Come nel caso precedente, nessuna ulteriore regola viene applicata allo stesso indirizzo.
  • Impostazioni predefinite per... Firma: abilita o disabilita l'invio di messaggi firmati. Questa impostazione usa o ha la precedenza su quella specificata nella finestra di composizione del messaggio. I valori possibili sono:
    • Mai: disabilita la firma, anche se è attivata nella finestra di composizione del messaggio (ha la precedenza sulle altre impostazioni)
    • Sì, se selezionato durante la composizione del messaggio: usa l'impostazione specificata nella finestra di composizione del messaggio
    • Sempre: abilita la firma, anche se essa non è abilitata nella finestra di composizione del messaggio
Le impostazioni sulla firma vengono applicate per tutte le regole che corrispondono. Se una regola disabilita la firma, il messaggio non verrà firmato, indipendentemente dalle altre eventuali regole che specificano Sempre.
  • Impostazioni predefinite per... Cifratura: abilita o disabilita la cifratura del messaggio. Le possibili impostazioni sono le stesse della firma e hanno lo stesso significato.
  • Impostazioni predefinite per... PGP/MIME:abilita o disabilita l'uso della codifica PGP/MIME (RFC 3156) per il messaggio. Se PGP/MIME è disabilitato, i messaggi saranno codificati usando "inline PGP". Le possibili impostazioni sono le stesse della firma e hanno lo stesso significato.

Le regole sono elaborate nell'ordine in cui appaiono nella lista dell'Editor delle regole OpenPGP. Se una regola è applicabile a un destinatario e contiene un ID chiave OpenPGP, il destinatario, oltre a usare l'ID specificato, sarà ignorato nell'elaborazione delle altre regole.


Ulteriore aiuto è disponibile sulla pagina web di Enigmail sulle regole per singolo destinatario

enigmail-2.0.8/lang/it/help/initError.html000066400000000000000000000045421334302754500204510ustar00rootroot00000000000000 Enigmail Help: How to Resolve Problems with Initializing OpenPGP

Enigmail Help

How to Resolve Problems with Initializing OpenPGP

There are several reasons why initializing OpenPGP does not succeed. The most common ones are described below; for more information please visit the Enigmail Support page.

GnuPG could not be found

In order for OpenPGP to work, the tool GnuPG needs to be installed. If GnuPG cannot be found, then first make sure that the executable gpg.exe (on Windows; gpg on other platforms) is installed on your computer. If GnuPG is installed, and OpenPGP cannot find it, then you need to manually set the path to GnuPG in the OpenPGP Preferences (menu OpenPGP > Preferences)

Enigmime failed to initialize

OpenPGP works only if it is built using the same build environment as Thunderbird or SeaMonkey was built. This means that you can use the official Enigmail releases only if you use the official releases of Thunderbird or SeaMonkey provided by mozilla.org.

If you use a Thunderbird or SeaMonkey version coming from some other source (e.g. the provider of your Linux distribution), or if you built the application yourself, you should either use an Enigmail version built by the same source, or build Enigmail yourself. For building Enigmail, refer to the Source Code section on the Enigmail home page. Please don't file any bug report concerning this problem, it is not solvable.

Further help is available on the Enigmail Support Web Site.

enigmail-2.0.8/lang/it/help/messenger.html000066400000000000000000000101011334302754500204500ustar00rootroot00000000000000 Enigmail Help: Lettura dei messaggi

Enigmail Help

Usare Enigmail durante la lettura dei messaggi

  • Pulsante Decifra nella finestra principale della posta
    Questo pulsante può essere usato per molti scopi: decifrare, verificare, o importare chiavi pubbliche. Di solito, la decifratura/verifica dei messaggi viene fatta automaticamente, anche se questo può essere disabilitato nelle impostazioni. Tuttavia, in caso di errori, apparirebbe solo un breve messaggio nella barra di stato di Enigmail. Se premi il pulsante Decifra, verrà mostrato un messaggio di errore più dettagliato, che include anche l'output esatto di GnuPG.
  • Icone della penna e della chiave tra le intestazioni del messaggio
    Le icone Penna e Chiave tra le intestazioni del messaggio indicano se esso è stato cifrato/firmato e se la firma è valida, cioè se il messaggio non è stato modificato dopo la firma. Se ci sono state modifiche, l'icona Penna apparirà come una Penna spezzata per indicare che la firma non è valida. Premendo con il tasto destro sulla penna o sulla chiave si visualizzerà un menu con le seguenti opzioni:
    • Informazioni di sicurezza OpenPGP: mostra l'output di GnuPG per il messaggio.
    • Copia le informazioni di sicurezza OpenPGP: copia l'output di GnuPG negli appunti, ad esempio per incollarlo in un messaggio, ecc.
    • Mostra la foto-ID OpenPGP: Visualizza la Foto-ID del mittente del messaggio, se una foto è presente nella sua chiave pubblica. (Questa opzione è attiva solo se c'è una foto nella chiave pubblica.)
    • Informazioni di sicurezza S/MIME: mostra le informazioni di sicurezza S/MIME per il messaggio.

    Se non hai impostato keyserver-options auto-key-retrieve nel file gpg.conf file e visualizzi un messaggio firmato e/o cifrato, vedrai una icona Penna tra le intestazioni del messaggio con un Punto interrogativo su di essa, la riga di stato di Enigmail mostrerà la scritta Parte del messaggio firmata; premi sull'icona della penna per i dettagli e il messaggio nella finestra mostrerà tutte le intestazioni OpenPGP e la firma in calce.

    Puoi vedere questo messaggio anche se hai impostato keyserver-options auto-key-retrieve nel file gpg.conf e la chiave OpenPGP richiesta non è disponibile sul server della chiavi predefinito.

    Premendo sull'icona Penna e punto interrogativo apparirà una finestra che avverte che la chiave pubblica richiesta non è disponibile nel tuo portachiavi. Premendo su OK apparirà un'altra finestra con una lista di server di chiavi da cui potrai scegliere di scaricare la chiave pubblica del mittente.

    Per configurare la lista dei server di chiavi che vuoi usare, vai su Enigmail -> Impostazioni -> Generali e inserisci gli indirizzi dei server nella riga Keyserver:, separati da una virgola. Il primo server sarà considerato il predefinito.

  • Apertura di allegati cifrati / importazioni di chiavi OpenPGP allegate
    Gli allegati con estensioni *.pgp, *.asc e *.gpg sono riconosciuti da Enigmail come allegati da trattare in modo speciale. Premendo con il tasto destro su tali allegati, appariranno due speciali voci del menu contestuale: Decifra e apri e Decifra e salva. Usa queste due voci se vuoi che Enigmail decifri un allegato prima di aprirlo o salvarlo. Se un allegato è riconosciuto essere una chiave OpenPGP, ti sarà offerta la possibilità di importarla nel tuo portachiavi.

Ulteriore aiuto è disponibile sul sito web di Enigmail

enigmail-2.0.8/lang/it/help/rulesEditor.html000066400000000000000000000064361334302754500210010ustar00rootroot00000000000000 Enigmail Help: Editor delle regole

Enigmail Help

Usare l'editor delle regole di Enigmail

Nell'Editor delle regole, puoi specificare le impostazioni predefinite per ogni destinatario sull'abilitazione della cifratura, della firma del formato PGP/MIME, e sulla scelta della chiave OpenPGP da usare. Ogni regole è composta da 5 campi ed è rappresentata su una singola linea:

  • Email: L'indirizzo email che compare nei campi A:, Cc: e Bcc:. La corrispondenza funziona anche per sottostringhe (Ulteriori dettagli possono essere trovati nella finestra di dialogo Modifica regola)
  • Chiave/i OpenPGP: una lista di ID chiave OpenPGP da usare per il destinatario
  • Firma: abilita o disabilita l'invio di messaggi firmati. Questa impostazione usa o ha la precedenza su quella specificata nella finestra di composizione del messaggio. I valori possibili sono:
    • Mai: disabilita la firma, anche se è attivata nella finestra di composizione del messaggio (ha la precedenza sulle altre impostazioni)
    • Possibile: usa l'impostazione specificata nella finestra di composizione del messaggio
    • Sempre: abilita la firma, anche se essa non è abilitata nella finestra di composizione del messaggio
Le impostazioni sulla firma vengono applicate per tutte le regole che corrispondono. Se una regola disabilita la firma, il messaggio non verrà firmato, indipendentemente dalle altre eventuali regole che specificano Sempre.
  • Cifra: abilita o disabilita la cifratura del messaggio. Le possibili impostazioni sono le stesse della firma e hanno lo stesso significato.
  • PGP/MIME: abilita o disabilita l'uso della codifica PGP/MIME (RFC 3156) per il messaggio. Se PGP/MIME è disabilitato, i messaggi saranno codificati usando "inline PGP". Le possibili impostazioni sono le stesse della firma e hanno lo stesso significato.

Le regole sono elaborate nell'ordine in cui appaiono nella lista. Se una regola è applicabile a un destinatario e contiene un ID chiave OpenPGP, il destinatario, oltre a usare l'ID specificato, sarà ignorato nell'elaborazione delle altre regole.

Nota: L'editor delle regole non è ancora completo. Regole più avanzate possono essere create modificando direttamente il file delle regole (tali regole non dovranno essere più modificate con l'editor delle regole). Ulteriori informazioni sulla modifica diretta del file delle regole sono disponibili sulla home page di Enigmail.


Ulteriore aiuto è disponibile sul sito web di Enigmail

enigmail-2.0.8/lang/it/help/sendingPrefs.html000066400000000000000000000047771334302754500211350ustar00rootroot00000000000000 Enigmail Help: Edit OpenPGP Rule

Enigmail Help

Defining Preferences to Send Encrypted

In the Sending Preferences you can choose the general model and preferences for encryption.

Convenient Encryption
With these settings, emails are encrypted without confirmation whenever possible.

This setup is appropriate, if you just want to improve your privacy by sending emails encyrpted instead of unencrypted if that's possible.

The effect is like sending emails as letters instead of postcards. Unlike postcards, letters usually hide their contents while in transit.

Note however that as with letters you can't be sure that nobody is opening the letter while it is in transit (although, some technical effort is necessary for that).

A concrete risk is that you accidentally use "faked keys" you got from somewhere or somebody claiming that the key belongs to the person you want to send emails to. To avoid this risk, you can either use the trust model of PGP (see below) or you should always verify, whether the fingerprint of a public key is correct.

Manual Encryption
This option allows you to specify the different preferences for encryption according to your needs. You can specify
  • whether replies to encrypted/signed emails should automatically also be encrypted/signed-
  • whether to use the trust model of OpenPGP to accept keys (this means that to use a key you either have to sign the key or have enough other people you trust having signed the key).
  • whether you want to automatically send emails encrypted if all keys are accepted.
  • whether and when you want to finally confirm sending an email.
If it is important for you that content you send encrypted can't be read by other people or organizations, you should use the manual preferences at least choose the option to accept keys only if you or other people signed them. While this model reduces the risk of using faked keys, it requires that you actively sign keys and declare owner trust using the key managament dialog. enigmail-2.0.8/lang/ja/000077500000000000000000000000001334302754500146275ustar00rootroot00000000000000enigmail-2.0.8/lang/ja/am-enigprefs.properties000066400000000000000000000001331334302754500213170ustar00rootroot00000000000000# Strings used in the Mozill AccountManager prefPanel-enigprefs=OpenPGP セキュリティ enigmail-2.0.8/lang/ja/enigmail.dtd000066400000000000000000002202651334302754500171200ustar00rootroot00000000000000 Mozilla Public License 2.0 ã§ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã•れã¦ã„ã¾ã™"> 「Autocrypt Key Transferã€ã¯ã€ç§»è¡Œå…ˆã®ãƒ‡ãƒã‚¤ã‚¹ã« Autocrypt ã«å¯¾å¿œã—ãŸãƒ¡ãƒ¼ãƒ«ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆãŒå­˜åœ¨ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ ã“ã¡ã‚‰ã¯ç§»è¡Œã¯å®¹æ˜“ã§ã™ãŒã€ã“ã®æ¨™æº–ã«å¯¾å¿œã—ãŸã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã¯ç¾æ™‚点ã§ã¯é™ã‚‰ã‚Œã¦ã„ã¾ã™ã€‚ ã‚‚ã†ä¸€ã¤ã®æ–¹æ³•ã¯ã€è¨­å®šã®ã€Œã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ/インãƒãƒ¼ãƒˆã€ã§ã™ã€‚ ã“ã¡ã‚‰ã®æ–¹æ³•ã§ã¯ã€ã™ã¹ã¦ã®è¨­å®šã¨ OpenPGP éµã‚’ ZIP ファイルã«ä¿å­˜ã—ã€æ–°ã—ã„デãƒã‚¤ã‚¹ã§èª­ã¿è¾¼ã¿ã¾ã™ã€‚ Enigmail ã§ã¯ã“れらã®è¨­å®šã‚’直接インãƒãƒ¼ãƒˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ä»–ã®ãƒ¡ãƒ¼ãƒ«ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã§ã¯ã€ZIP ファイルを展開ã—ã€æ‰‹ä½œæ¥­ã§æ‰±ã†å¿…è¦ãŒã‚りã¾ã™ã€‚"> '"> ' をメールアドレスを指定ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã™ã‚‹"> ' をメールアドレスを指定ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã—ã¾ã™ã€‚ã‚‚ã—ã€å—å–人ãŒå¤ã„ Hushmail éµã‚’使用ã—ã¦ã„ã‚‹å ´åˆã¯ç„¡åйã«ã—ã¦ãã ã•ã„"> 注æ„:éµç”Ÿæˆã«ã¯æ•°åˆ†ã‹ã‹ã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚生æˆé€”中ã§ã‚¢ãƒ—リケーションを終了ã—ãªã„ã§ãã ã•ã„。生æˆé€”中ã§ã‚¦ã‚§ãƒ–ブラウザーを使用ã™ã‚‹ã€ã‚‚ã—ãã¯ãƒ‡ã‚£ã‚¹ã‚¯ã‚¢ã‚¯ã‚»ã‚¹ãŒæ¿€ã—ã„処ç†ã‚’行ã†ã¨ã€Œä¹±æ•°ãƒ—ールã€ãŒæº€ãŸã•れã€å‡¦ç†ãŒæ—©ã終ã‚りã¾ã™ã€‚éµã®ç”ŸæˆãŒçµ‚了ã™ã‚‹ã¨é€šçŸ¥ã—ã¾ã™ã€‚"> Autocrypt ã¯ã€ãƒ¡ãƒ¼ãƒ«ã®ã‚¨ãƒ³ãƒ‰ãƒ„ーエンド暗å·åŒ–を簡便ã«é”æˆã™ã‚‹ãŸã‚ã®æ¨™æº–ã§ã™ã€‚通常ã®ãƒ¡ãƒ¼ãƒ«ã‚’用ã„ã¦ã€ãƒ¡ãƒ¼ãƒ«ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆé–“ã§æš—å·åŒ–ã®å¯å¦ã‚’やりå–りã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"> 注æ„: éµç”Ÿæˆã«ã¯æ•°åˆ†ã‹ã‹ã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚éµç”Ÿæˆä¸­ã¯ã‚¢ãƒ—リケーションを終了ã—ãªã„ã§ãã ã•ã„。終了時ã«ã¯ãŠçŸ¥ã‚‰ã›ã—ã¾ã™ã€‚"> 注æ„: Enigmail ã¯ã€æœ‰åŠ¹ç„¡åŠ¹ã«é–¢ã‚ら㚠ã™ã¹ã¦ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚‚ã—ã㯠ID å®›ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ç½²åを検証ã—ã¾ã™ã€‚"> å…¬é–‹éµ ã¯ã€ã‚ãªãŸå®›ã«æš—å·åŒ–メッセージをé€ã‚‹ã¨ããŠã‚ˆã³ã€ã‚ãªãŸã«ã‚ˆã‚‹ç½²åメッセージを検証ã™ã‚‹ã¨ã㫠第三者ã«ã‚ˆã£ã¦ 使用ã•れã¾ã™ã€‚公開éµã¯ç¬¬ä¸‰è€…ã«é…布ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"> ç§˜å¯†éµ ã¯ã€æš—å·åŒ–メッセージを復å·ã™ã‚‹ã¨ããŠã‚ˆã³ç½²åメッセージをé€ã‚‹ã¨ãã« ã‚ãªãŸè‡ªèº«ã«ã‚ˆã£ã¦ 使用ã•れã¾ã™ã€‚ 秘密éµã‚’第三者ã«å…¬é–‹ã—ã¦ã¯ã„ã‘ã¾ã›ã‚“。"> ç§˜å¯†éµ ã¯ã€ã‚ãªãŸå®›ã«é€ã‚‰ã‚ŒãŸæš—å·åŒ–メッセージを復å·ã™ã‚‹ã¨ããŠã‚ˆã³ã€ã‚ãªãŸãŒç½²åメッセージをé€ã‚‹ã¨ãã« ã‚ãªãŸè‡ªèº«ã«ã‚ˆã£ã¦ 使用ã•れã¾ã™ã€‚ 秘密éµã‚’第三者ã«å…¬é–‹ã—ã¦ã¯ã„ã‘ã¾ã›ã‚“。 秘密éµã®å®‰å…¨æ€§ã‚’ä¿ã¤ãŸã‚ã«ã€ãƒ‘スフレーズを設定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚以下㮠2 ã¤ã®ãƒ€ã‚¤ã‚¢ãƒ­ã‚°ã«ãƒ‘スフレーズを入力ã—ã¦ãã ã•ã„。"> パスフレーズ ã¯ã€ç§˜å¯†éµã‚’ä¿è­·ã™ã‚‹ãŸã‚ã®ãƒ‘スワードã§ã™ã€‚ã“れã«ã‚ˆã‚Šã€ã‚ãªãŸè‡ªèº«ã«ã‚ˆã‚‹ç§˜å¯†éµã®èª¤ä½¿ç”¨ã‚„ã€ç¬¬ä¸‰è€…ã«ã‚ˆã‚‹ä¸æ­£ä½¿ç”¨ãŒé˜²æ­¢ã•れã¾ã™ã€‚"> 推奨ã•れã¾ã›ã‚“。"> 失効証明書ã®ç”Ÿæˆã®ãŸã‚パスフレーズを入力ã—ã¦ãã ã•ã„。ã“ã®è¨¼æ˜Žæ›¸ã¯ã€CD-R ã‚„ USB メモリーã®ã‚ˆã†ãªã‚ªãƒ•ラインã§å®‰å…¨ã«ä¿å­˜ã§ãるメディアã«ç§»ã—ã¦ãã ã•ã„。もã—ã€èª°ã‹ãŒã“ã®å¤±åŠ¹è¨¼æ˜Žæ›¸ã‚’æ‰‹ã«å…¥ã‚ŒãŸå ´åˆã€ã‚ãªãŸã®éµã‚’使ãˆãªãã•れるãŠãれãŒã‚りã¾ã™ã€‚"> å¤ã„環境ã§ã€ã“ã®ã‚¦ã‚£ã‚¶ãƒ¼ãƒ‰ã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’エクスãƒãƒ¼ãƒˆã™ã‚‹ æ–°ã—ã„環境ã§ã€ã‚»ãƒƒãƒˆã‚¢ãƒƒãƒ—ウィザードã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’インãƒãƒ¼ãƒˆã™ã‚‹ "> ã“ã®åº¦ã¯ã€Enigmail ã‚’ã”利用ã„ãŸã ãã‚りãŒã¨ã†ã”ã–ã„ã¾ã™ã€‚"> Web Key Directory ã«ã‚¢ãƒƒãƒ—ロードを希望ã™ã‚‹å ´åˆã«ã¯ã€ã“ã®å¾Œå—ä¿¡ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«è¨˜è¼‰ã•れã¦ã„る確èªãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’承èªã—ã¦ãã ã•ã„。"> å¤ã„環境ã§ã€ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã‚¦ã‚£ã‚¶ãƒ¼ãƒ‰ã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’エクスãƒãƒ¼ãƒˆã™ã‚‹ æ–°ã—ã„環境ã§ã€ã“ã®ã‚¦ã‚£ã‚¶ãƒ¼ãƒ‰ã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’インãƒãƒ¼ãƒˆã™ã‚‹ "> éµç§»è¡Œã‚’行ã„ãŸã„ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。 表示ã•れãŸã‚»ãƒƒãƒˆã‚¢ãƒƒãƒ—コード (パスワード) ã‚’ã€ç§»è¡Œå…ˆã®ãƒ‡ãƒã‚¤ã‚¹ã«å…¥åŠ›ã—ã¦ãã ã•ã„。"> 移行先ã®ãƒ‡ãƒã‚¤ã‚¹ã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é–‹ã„ã¦ãã ã•ã„。セットアップコードãŒè¦æ±‚ã•れãŸã‚‰ã€ä»¥ä¸‹ã®æ•°å­—を入力ã—ã¦ãã ã•ã„:"> enigmail-2.0.8/lang/ja/enigmail.properties000066400000000000000000002033161334302754500205370ustar00rootroot00000000000000Enigmail=Enigmail ##################################################################### # Strings used within enigmailCommon.js and enigmailCommon.jsm ##################################################################### enigAlert=Enigmail 警告 enigConfirm=Enigmail ç¢ºèª enigInfo=Enigmail 情報 enigError=Enigmail エラー enigPrompt=Enigmail プロンプト dlgYes=ã¯ã„(&Y) dlgNo=ã„ã„ãˆ(&N) dlgKeepSetting=設定をä¿å­˜ã—ã€æ¬¡å›žã‹ã‚‰å°‹ã­ãªã„ dlgNoPrompt=次回ã‹ã‚‰ã“ã®ãƒ€ã‚¤ã‚¢ãƒ­ã‚°ã‚’表示ã—ãªã„ dlg.button.delete=削除(&D) dlg.button.cancel=キャンセル(&C) dlg.button.close=é–‰ã˜ã‚‹(&C) dlg.button.continue=続行(&T) dlg.button.skip=スキップ(&S) dlg.button.overwrite=上書ã(&O) dlg.button.view=表示(&V) dlg.button.retry=å†è©¦è¡Œ(&R) dlg.button.ignore=無視(&I) dlg.button.install=インストール(&I) dlg.button.ok=OK(&O) repeatPrefix=\n\nã“ã®è­¦å‘Šã¯ %S repeatSuffixSingular=回繰り返ã•れã¾ã™ repeatSuffixPlural=回繰り返ã•れã¾ã™ noRepeat=\n\nEnigmail をアップグレードã™ã‚‹ã¾ã§ã€ã“ã®è­¦å‘Šã¯ç¹°ã‚Šè¿”ã•れã¾ã›ã‚“ pgpNotSupported=Enigmail ã‚’ PGP 6.x ã¨å…±ã«ä½¿ç”¨ã—ã¦ã„ã¾ã™\n\n残念ãªãŒã‚‰ã€PGP 6.x 㯠Enigmail を誤動作ã•ã›ã‚‹å•題を多数抱ãˆã¦ã„ã¾ã™ã€‚ãã®ãŸã‚ã€Enigmail 㯠PGP 6.x をサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“。GnuPG (GPG) を代ã‚りã«ä½¿ç”¨ã—ã¦ãã ã•ã„\nã‚‚ã—ã€GnuPG ã¸ã®åˆ‡ã‚Šæ›¿ãˆã«ãƒ˜ãƒ«ãƒ—ãŒå¿…è¦ã§ã—ãŸã‚‰ã€Enigmail ã®ãƒ›ãƒ¼ãƒ ãƒšãƒ¼ã‚¸ã®ãƒ˜ãƒ«ãƒ—ã‚’å‚ç…§ã—ã¦ãã ã•ã„ initErr.howToFixIt=Enigmail ã®ä½¿ç”¨ã«ã¯ GnuPG ãŒå¿…è¦ã§ã™ã€‚GnuPG ã‚’ã¾ã ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã—ã¦ã„ãªã„å ´åˆã«ã¯ã€ä¸‹ã®ã€Œã‚»ãƒƒãƒˆã‚¢ãƒƒãƒ—ウィザードã€ãƒœã‚¿ãƒ³ã‹ã‚‰ GnuPG をインストールã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ initErr.setupWizard.button=セットアップウィザード(&S) passphraseCleared=パスフレーズを消去ã—ã¾ã—㟠cannotClearPassphrase=パスフレーズã®ç®¡ç†ã« gnome-keyring ãªã©ã®éžæ¨™æº–ã®ãƒ„ールを使用ã—ã¦ã„ã‚‹ãŸã‚ã€Enigmail ã¯ãƒ‘スフレーズを消去ã§ãã¾ã›ã‚“ noPhotoAvailable=写真ãŒã‚りã¾ã›ã‚“ debugLog.title=Enigmail デãƒãƒƒã‚°ãƒ­ã‚° error.photoPathNotReadable=写真ã¸ã®ãƒ‘ス '%S' ã¯èª­ã¿è¾¼ã‚ã¾ã›ã‚“ generalError=エラー: %S # Strings in configure.jsm enigmailCommon.versionSignificantlyChanged=ã“ã®æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã® Enigmail ã§ã¯ã€è¨­å®šé …ç›®ãŒä»¥å‰ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‹ã‚‰å¤§ãã変化ã—ã¦ã„ã¾ã™ã€‚å¤ã„設定ã¯è‡ªå‹•çš„ã«ç§»è¡Œã•れã¦ã„ã¾ã™ãŒã€ã™ã¹ã¦ã®ã‚±ãƒ¼ã‚¹ã«ã¤ã„ã¦æ­£å¸¸ã«ç§»è¡Œã§ãã¦ã„ã‚‹ã“ã¨ã¯ä¿è¨¼ã§ãã¾ã›ã‚“ã€‚ç§»è¡Œå¾Œã®æ–°ã—ã„設定を改ã‚ã¦ç¢ºèªã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ enigmailCommon.checkPreferences=設定を確èªã™ã‚‹... preferences.defaultToPgpMime=Enigmail ã§ã®æ—¢å®šã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰æ–¹æ³•ã¯ã‚¤ãƒ³ãƒ©ã‚¤ãƒ³ PGP ã‹ã‚‰ PGP/MIME ã¸å¤‰æ›´ã•れã¾ã—ãŸã€‚ã“ã®è¨­å®šã‚’ç¶­æŒã™ã‚‹ã“ã¨ã‚’推奨ã—ã¾ã™\n\n既定ã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰æ–¹æ³•をインライン PGP ã¸å¤‰æ›´ã—ãŸã„å ´åˆã«ã¯ã€ã‚¢ã‚«ã‚¦ãƒ³ãƒˆè¨­å®š → OpenPGP セキュリティã‹ã‚‰å¤‰æ›´ã§ãã¾ã™ ##################################################################### # Strings in enigmailAbout.js ##################################################################### usingVersion=実行中㮠Enigmail ã¯ã€ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %S ã§ã™ enigmailPepVersion=Enigmail/p≡p ã¯ã€ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %S ã§ã™ usingAgent=%1$S ã¯å®Ÿè¡Œãƒ•ァイル %2$S を用ã„ã¦æš—å·åŒ–・復å·ã‚’ã—ã¦ã„ã¾ã™ agentError=エラー: Enigmail コアサービスã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“ã§ã—ãŸï¼ ##################################################################### # Strings in enigmailKeygen.js ##################################################################### accessError=Enigmail サービスã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“ã§ã—㟠onlyGPG=éµã®ç”Ÿæˆã¯ GnuPG ã§ã®ã¿åˆ©ç”¨ã§ãã¾ã™ (PGP ã§ã¯å‹•作ã—ã¾ã›ã‚“ï¼) keygenComplete=éµã®ç”ŸæˆãŒçµ‚了ã—ã¾ã—ãŸã€‚<%S> ãŒç½²åã«åˆ©ç”¨ã•れã¾ã™ revokeCertRecommended=失効証明書を作æˆã™ã‚‹ã“ã¨ã‚’å¼·ãæŽ¨å¥¨ã—ã¾ã™ã€‚失効証明書ã¯éµã‚’無効ã«ã—ãŸã„時ã€ä¾‹ãˆã°ã€ç§˜å¯†éµã‚’ãªãã—ãŸã‚Šãƒ‘ã‚¹ãƒ•ãƒ¬ãƒ¼ã‚ºã‚’å¿˜ã‚ŒãŸæ™‚ã‚„ã€ãƒ‘スフレーズãŒç¬¬ä¸‰è€…ã«æ¼æ´©ã™ã‚‹ãªã©ç§˜å¯†éµã®ä¿¡ç”¨ãŒå¤±ã‚ã‚ŒãŸæ™‚ã«åˆ©ç”¨ã§ãã¾ã™ã€‚ãã®ã‚ˆã†ãªå¤±åŠ¹è¨¼æ˜Žæ›¸ã‚’ä»Šä½œæˆã—ã¾ã™ã‹ï¼Ÿ keyMan.button.generateCert=証明書を生æˆ(&G) genCompleteNoSign=éµã®ç”ŸæˆãŒçµ‚了ã—ã¾ã—㟠genGoing=éµã®ç”ŸæˆãŒæ—¢ã«å®Ÿè¡Œä¸­ã§ã™ passNoMatch=パスフレーズãŒä¸€è‡´ã—ã¾ã›ã‚“ã§ã—ãŸã€‚å†åº¦å…¥åŠ›ã—ã¦ãã ã•ã„ passCheckBox=éµã«å¯¾ã—ã¦ãƒ‘スフレーズを設定ã—ãªã„å ´åˆã¯ã€ãƒã‚§ãƒƒã‚¯ã—ã¦ãã ã•ã„ passUserName=ユーザーåã‚’ã“ã® ID ã«æŒ‡å®šã—ã¦ãã ã•ã„ keygen.missingUserName=é¸æŠžã•れãŸã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«é–¢é€£ä»˜ã‘られãŸåå‰ãŒå­˜åœ¨ã—ã¾ã›ã‚“。アカウント設定ã®ã€Œåå‰ã€æ¬„ã«é©åˆ‡ãªå€¤ã‚’入力ã—ã¦ãã ã•ã„ keygen.passCharProblem=パスフレーズã«ç‰¹æ®Šè¨˜å·ã‚’使用ã—ã¦ã„ã¾ã™ã€‚残念ãªãŒã‚‰ã€ä»–ã®ã‚¢ãƒ—リケーションã§ãƒˆãƒ©ãƒ–ルã®å…ƒã¨ãªã‚Šã¾ã™ã€‚パスフレーズã«ã¯ã€æ¬¡ã®æ–‡å­—ã®ã¿ã‚’使用ã™ã‚‹ã“ã¨ã‚’推奨ã—ã¾ã™:\na-z A-Z 0-9 /.;:-,!?(){}[]%* passSpaceProblem=技術的制é™ã«ã‚ˆã‚Šã€ãƒ‘スフレーズã¯ã‚¹ãƒšãƒ¼ã‚¹è¨˜å·ã§é–‹å§‹ã‚ã‚‹ã„ã¯çµ‚了ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ changePassFailed=パスフレーズã®å¤‰æ›´ã«å¤±æ•—ã—ã¾ã—㟠keyConfirm='%S' ã®å…¬é–‹éµã¨ç§˜å¯†éµã‚’生æˆã—ã¾ã™ã‹ï¼Ÿ keyMan.button.generateKey=éµã‚’生æˆ(&G) keyAbort=éµã®ç”Ÿæˆã‚’中止ã—ã¾ã™ã‹ï¼Ÿ keyMan.button.generateKeyAbort=éµç”Ÿæˆã‚’中止(&A) keyMan.button.generateKeyContinue=éµç”Ÿæˆã‚’継続(&C) expiryTooLong=100 年より長ã„間有効ãªéµã¯ç”Ÿæˆã§ãã¾ã›ã‚“ expiryTooLongShorter=90 年より長ã„間有効ãªéµã¯ç”Ÿæˆã§ãã¾ã›ã‚“ expiryTooShort=éµã¯å°‘ãªãã¨ã‚‚ 1 æ—¥é–“ã¯æœ‰åйã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“ keyGenFailed=éµã®ç”Ÿæˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚詳細ã¯ã€Enigmail ã®ã‚³ãƒ³ã‚½ãƒ¼ãƒ« (メニュー Enigmail -> デãƒãƒƒã‚°ã‚ªãƒ—ション) を確èªã—ã¦ãã ã•ã„ setKeyExpirationDateFailed=有効期é™ã®å¤‰æ›´ã«å¤±æ•—ã—ã¾ã—㟠# Strings in enigmailMessengerOverlay.js securityInfo=Enigmail セキュリティ情報\n\n enigHeader=Enigmail: enigContentNote=Enigmail: *Attachments to this message have not been signed or encrypted*\n\n possiblyPgpMime=ãŠãらã PGP/MIME ã§æš—å·åŒ–ã‚‚ã—ãã¯ç½²åã•れã¦ã„ã¾ã™ã€‚「復å·/æ¤œè¨¼ã€æ©Ÿèƒ½ã‚’使用ã—ã¦ãã ã•ã„ saveAttachmentHeader=Enigmail: 復å·ã—ãŸæ·»ä»˜ãƒ•ァイルをä¿å­˜ noTempDir=書ãè¾¼ã¿å¯èƒ½ãªãƒ†ãƒ³ãƒãƒ©ãƒªãƒ•ォルダーãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“\n環境変数 TEMP ã‚’é©åˆ‡ãªå ´æ‰€ã«è¨­å®šã—ã¦ãã ã•ã„ attachmentPgpKey=é–‹ã“ã†ã¨ã—ãŸæ·»ä»˜ãƒ•ァイル '%S' ã¯ã€OpenPGP éµãƒ•ァイルã®ã‚ˆã†ã§ã™\n\néµã‚’インãƒãƒ¼ãƒˆã™ã‚‹ã«ã¯ã€Œã‚¤ãƒ³ãƒãƒ¼ãƒˆã€ã‚’クリックã—ã¦ãã ã•ã„。「表示ã€ã‚’クリックã™ã‚‹ã¨ãƒ–ラウザーウインドウã§ä¸­èº«ã‚’確èªã§ãã¾ã™ beginPgpPart=********* *BEGIN ENCRYPTED or SIGNED PART* ********* endPgpPart=********** *END ENCRYPTED or SIGNED PART* ********** notePartEncrypted=Enigmail: * Parts of the message have NOT been signed or encrypted* noteCutMessage=Enigmail: *Multiple message blocks found -- decryption/verification aborted* decryptOkNoSig=警告\n\n復å·ã«æˆåŠŸã—ã¾ã—ãŸãŒã€ç½²åã¯æ­£ã—ãæ¤œè¨¼ã§ãã¾ã›ã‚“ã§ã—㟠msgOvl.button.contAnyway=ãれã§ã‚‚続行ã—ã¾ã™ã‹ï¼Ÿ(&C) signature.verifiedOK=添付ファイル %S ã®ç½²åã®æ¤œè¨¼ã«æˆåŠŸã—ã¾ã—㟠signature.verifyFailed=添付ファイル %S ã®ç½²åã®æ¤œè¨¼ã«å¤±æ•—ã—ã¾ã—㟠attachment.noMatchToSignature=添付ファイル '%S' ã¯ç½²åファイルã«é©åˆã—ã¾ã›ã‚“ã§ã—㟠attachment.noMatchFromSignature=ç½²åファイル '%S' ã¯æ·»ä»˜ãƒ•ァイルã«é©åˆã—ã¾ã›ã‚“ã§ã—㟠fixBrokenExchangeMsg.failed=メッセージを修復ã§ãã¾ã›ã‚“ã§ã—㟠enigmail.msgViewColumn.label=Enigmail enigmailPep.msgViewColumn.label=Enigmail/p≡p wksNoIdentity=ã“ã®éµã¯ã‚ãªãŸã®ãƒ¡ãƒ¼ãƒ«ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ã„ãšã‚Œã«ã‚‚関連付ã‘られã¦ã„ã¾ã›ã‚“。以下ã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã®å°‘ãªãã¨ã‚‚一ã¤ã«ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’追加ã—ã¦ãã ã•ã„:\n\n%S wksConfirmSuccess=確èªãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡ã—ã¾ã—㟠wksConfirmFailure=確èªãƒ¡ãƒ¼ãƒ«ã®é€ä¿¡ã«å¤±æ•—ã—ã¾ã—㟠autocrypt.importSetupKey.accountPreconfigured=ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¯æ—¢ã« Autocrypt を使用ã™ã‚‹ã‚ˆã†é©åˆ‡ã«è¨­å®šã•れã¦ã„ã¾ã™\n\nã“ã®ã‚»ãƒƒãƒˆã‚¢ãƒƒãƒ—メッセージã§è¨­å®šã‚’上書ãã—ã¾ã™ã‹ï¼Ÿ autocrypt.importSetupKey.selfCreated=ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã‚ãªãŸãŒç¾åœ¨å®Ÿè¡Œã—ã¦ã„ã‚‹ Enigmail ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã«ã‚ˆã£ã¦ä½œæˆã•れã¾ã—ãŸ\n\n設定ã®ç§»è¡Œå…ˆã®ãƒ¡ãƒ¼ãƒ«ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆä¸Šã§ã€ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’インãƒãƒ¼ãƒˆã—ã¦ãã ã•ã„ autocrypt.importSetupKey.invalidMessage=エラー - セットアップメッセージã®èª­ã¿è¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒæ”¹ç«„ã•れã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ã‚ãªãŸã®ä»–ã®ãƒ‡ãƒã‚¤ã‚¹ã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ä½œæˆã‚’å†åº¦è©¦ã¿ã¦ãã ã•ã„ autocrypt.importSetupKey.invalidKey=エラー - éµã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã‚ãªãŸãŒãŠä½¿ã„ã® GnuPG ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ãªã„ã‹ã€æ”¹ç«„ã•れã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ autocrypt.importSetupKey.wrongPasswd=乳録ã•れãŸãƒ‘スワードãŒé–“é•ã£ã¦ã„ã¾ã™ã€‚å†åº¦å…¥åŠ›ã—ã¾ã™ã‹ï¼Ÿ autocrypt.importSetupKey.success=Autocrypt ã‚»ãƒƒãƒˆã‚¢ãƒƒãƒ—ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯æ­£å¸¸ã«å®Œäº†ã—ã¾ã—ãŸã€‚ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆ '%S% ã§ Autocrypt ãŒåˆ©ç”¨å¯èƒ½ã¨ãªã‚Šã¾ã—㟠##################################################################### # Strings in enigmailMsgComposeOverlay.js ##################################################################### keysToExport=エクスãƒãƒ¼ãƒˆã™ã‚‹ OpenPGP éµã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ ID (メールアドレス) keysToUse=%S ã«ä½¿ç”¨ã™ã‚‹ OpenPGP éµã‚’é¸æŠžã—ã¦ãã ã•ã„ pubKey=%Sã®å…¬é–‹éµ \n windowLocked=作æˆç”»é¢ãŒãƒ­ãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚é€ä¿¡ã¯ã‚­ãƒ£ãƒ³ã‚»ãƒ«ã•れã¾ã—㟠sendUnencrypted=Enigmail ã®åˆæœŸåŒ–ã«å¤±æ•—ã—ã¾ã—ãŸ\n何もã—ãªã„ã§å¹³æ–‡ã‚’é€ä¿¡ã—ã¾ã™ã‹ï¼Ÿ composeSpecifyEmail=主ã«ä½¿ã†ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’決ã‚ã¦ãã ã•ã„。ãれã¯é€ä¿¡ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ç½²åã™ã‚‹éš›ã«ä½¿ç”¨ã•れã¾ã™\n空白ã«ã—ãŸå ´åˆã€å·®å‡ºäººã‚¢ãƒ‰ãƒ¬ã‚¹ãŒç½²åã‚’ã™ã‚‹éš›ã®éµã® ID ã¨ã—ã¦ä½¿ç”¨ã•れã¾ã™ sendingHiddenRcpt=ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ BCC (blind carbon copy) ã§ã®å—å–人ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æš—å·åŒ–ã—ãŸå ´åˆã€BCC å—信者を隠蔽ã™ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ãŒ PGP Corp. ã®è£½å“ã®ã‚ˆã†ã«å¾©å·ã§ããªã„製å“ãŒã‚りã¾ã™ã€‚ã“ã®ã‚ˆã†ãªã“ã¨ã‹ã‚‰æš—å·åŒ–メッセージã«ã¯ BCC ã®ä½¿ç”¨ã‚’é¿ã‘ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ sendWithHiddenBcc=BCC å—信者を隠蔽ã™ã‚‹ sendWithShownBcc=BCC å—信者を隠蔽ã—ãªã„ sendingNews=æš—å·åŒ–é€ä¿¡ã¯ä¸­æ–­ã—ã¾ã—ãŸ\n\nニュースグループã®å—å–人ãŒå«ã¾ã‚Œã¦ã„ã‚‹ãŸã‚æš—å·åŒ–ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚æš—å·åŒ–ã›ãšã«å†åº¦ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡ã—ã¦ãã ã•ã„ sendToNewsWarning=警告: ã‚ãªãŸã¯ãƒ‹ãƒ¥ãƒ¼ã‚¹ã‚°ãƒ«ãƒ¼ãƒ—ã«é€ä¿¡ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æš—å·åŒ–ã—よã†ã¨ã—ã¦ã„ã¾ã™\n\nã“れã¯ã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒ¡ãƒ³ãƒãƒ¼å…¨å“¡ãŒå¾©å·å¯èƒ½ã¨åˆ¤æ–­ã§ãã‚‹å ´åˆä»¥å¤–ã¯ãŠå‹§ã‚ã§ãã¾ã›ã‚“。ã™ãªã‚ã¡ã€ã‚°ãƒ«ãƒ¼ãƒ—å‚加者全員ã®å…¬é–‹éµãŒå¿…è¦ã ã¨ã„ã†ã“ã¨ã§ã™ã€‚何をã—よã†ã¨ã—ã¦ã„ã‚‹ã‹ã‚’判ã£ã¦ã„ã‚‹å ´åˆã ã‘é€ä¿¡ã—ã¦ä¸‹ã•ã„\n\nç¶šã‘ã¾ã™ã‹ï¼Ÿ hasHTML=HTML メールã®è­¦å‘Š:\nã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ HTML ã‚’å«ã‚€ã¨æ€ã‚れã¾ã™ãŒã€ãã®å ´åˆã€ç½²å/æš—å·åŒ–ã«å¤±æ•—ã™ã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚今後ã«ã‚ãŸã‚Šå›žé¿ã™ã‚‹ãŸã‚ã«ã¯ã€ç½²å付ãメッセージをé€ã‚‹ã¨ãã«ã¯ä½œæˆ/返信ボタンを SHIFT キーを押ã—ãªãŒã‚‰ã‚¯ãƒªãƒƒã‚¯ã—ã¦ãã ã•ã„\nã‚‚ã—æ—¢å®šã§ç½²åã™ã‚‹è¨­å®šã®å ´åˆã¯ã€ã“ã®ãƒ¡ãƒ¼ãƒ«ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®è¨­å®šã§ã€ŒHTML å½¢å¼ã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’作æˆã™ã‚‹ã€ã®ãƒã‚§ãƒƒã‚¯ãƒœãƒƒã‚¯ã‚¹ã‹ã‚‰ãƒã‚§ãƒƒã‚¯ã‚’ã¯ãšã—ã€æ’久的㫠HTML メールを作æˆã—ãªã„よã†ã«ã—ã¦ãã ã•ã„ strippingHTML=メッセージã«å«ã¾ã‚Œã‚‹ HTML å½¢å¼ã¯ã€ç½²å/æš—å·åŒ–ã™ã‚‹æ™‚ã«ãƒ—レーンテキストã«å¤‰æ›ã•れるãŸã‚ã«ã€å¤±ã‚れã¾ã™ã€‚ãれã§ã‚‚ç¶šã‘ã¾ã™ã‹ï¼Ÿ msgCompose.button.sendAnyway=ã¨ã«ã‹ãé€ä¿¡ã™ã‚‹(&S) attachWarning=ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«æ·»ä»˜ã—よã†ã¨ã—ã¦ã„ã‚‹ã®ã¯ãƒ­ãƒ¼ã‚«ãƒ«ãƒ•ァイルã§ã¯ãªã„ã®ã§ã€æš—å·åŒ–ã§ãã¾ã›ã‚“。添付ファイルを暗å·åŒ–ã™ã‚‹ãŸã‚ã«ã¯ã€ã¾ãšãƒ­ãƒ¼ã‚«ãƒ«ãƒ•ァイルã¨ã—ã¦ä¿å­˜ã—ã¦ã‹ã‚‰æ·»ä»˜ã—ã¦ãã ã•ã„。構ã‚ãšæ¬¡ã¸é€²ã¿ã¾ã™ã‹ï¼Ÿ quotedPrintableWarn=Quoted-Printable エンコーディングãŒé€ä¿¡ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«å¯¾ã—ã¦æœ‰åйã«ãªã£ã¦ã„ã¾ã™ã€‚ ã“れã«ã‚ˆã‚Šã€æš—å·åŒ–ã‚„ã€ç½²åã®æ¤œè¨¼ã®å‹•ä½œã«æ‚ªå½±éŸ¿ã‚’åŠã¼ã™å¯èƒ½æ€§ãŒã‚りã¾ã™\n今ã™ã Quoted-Printable エンコーディングを無効ã«ã—ã¾ã™ã‹ï¼Ÿ minimalLineWrapping=%S æ–‡å­—ã§æ”¹è¡Œã™ã‚‹è¨­å®šã«ãªã£ã¦ã„ã¾ã™ã€‚æ­£ã—ã„æš—å·åŒ–åŠã³ç½²åã«ã¯ã€å°‘ãªãã¨ã‚‚ 68 æ–‡å­—ã§æ”¹è¡Œã™ã‚‹å¿…è¦ãŒã‚りã¾ã™\n今ã™ã改行文字数を 68 ã¸å¤‰æ›´ã—ã¾ã™ã‹ï¼Ÿ warning=警告 signIconClicked=ç½²åã®è¨­å®šã‚’手動ã§å¤‰æ›´ã—ã¾ã™ã€‚ã“れã«ã‚ˆã‚Šã€ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ä½œæˆä¸­ã¯ã€ç½²åã«é–¢ã™ã‚‹è¨­å®š (アカウントã”ã¨ã®è¨­å®šã€å—å–人ã”ã¨ã®è¨­å®šã€é€ä¿¡æ™‚ã®è¨­å®šãªã©) を無視ã—ã¾ã™ errorOwnKeyUnusable=ç¾åœ¨ã®å·®å‡ºäººã«æŒ‡å®šã•れã¦ã„ã‚‹éµ ID '%S' ã¯åˆ©ç”¨å¯èƒ½ãª OpenPGP éµã«é©åˆã—ã¾ã›ã‚“ã§ã—ãŸ\n\nã‚¢ã‚«ã‚¦ãƒ³ãƒˆè¨­å®šã§æœ‰åйã‹ã¤æœŸé™åˆ‡ã‚Œã§ãªã„ OpenPGP éµãŒæŒ‡å®šã•れã¦ã„ã‚‹ã‹ç¢ºèªã—ã¦ãã ã•ã„\néµãŒæœŸé™åˆ‡ã‚Œã§ã¯ãªã„ã«ã‚‚ã‹ã‹ã‚らãšã“ã®ã‚¨ãƒ©ãƒ¼ãŒè¡¨ç¤ºã•れる場åˆã«ã¯ã€æ‰€æœ‰è€…ã«ã‚ˆã‚‹ä¿¡ç”¨åº¦ãŒã€Œå®Œå…¨ã€ã‚ã‚‹ã„ã¯ã€Œçµ¶å¯¾çš„ã€ã«ãªã£ã¦ã„ã‚‹ã‹ç¢ºèªã—ã¦ãã ã•ã„ msgCompose.cannotSaveDraft=下書ãã‚’æš—å·åŒ–ã—ã¦ä¿å­˜ã™ã‚‹éš›ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ: msgCompose.partiallyEncrypted.short=æ©Ÿå¾®æƒ…å ±ã®æ¼æ´©ã«æ³¨æ„ã—ã¦ãã ã•ã„ - éƒ¨åˆ†çš„ã«æš—å·åŒ–ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã§ã™ msgCompose.partiallyEncrypted.mimeMsg=ã‚ãªãŸãŒè¿”ä¿¡ã—よã†ã¨ã—ã¦ã„るメッセージã«ã¯ã€æš—å·åŒ–ã•れã¦ã„ã‚‹éƒ¨åˆ†ã¨æš—å·åŒ–ã•れã¦ã„ãªã„部分ãŒã‚りã¾ã™ã€‚æš—å·åŒ–ã•れã¦ã„る部分ã®ä¸€éƒ¨ã¯ã‚ãªãŸã«ã¯è¦‹ãˆã¦ã„ã¾ã›ã‚“\n\nå…ƒã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®é€ä¿¡è€…ãŒæš—å·åŒ–ã•れã¦ã„る部分を復å·ã§ãã¦ã„ãªã„å ´åˆã€ã‚ãªãŸãŒã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«è¿”ä¿¡ã™ã‚‹ã“ã¨ã§å…ƒã®é€ä¿¡è€…ãŒå¾©å·ã§ããªã‹ã£ãŸæ©Ÿå¾®æƒ…å ±ã®æ¼æ´©ã«ã¤ãªãŒã‚‹æã‚ŒãŒã‚りã¾ã™\n\nã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«è¿”ä¿¡ã™ã‚‹ã®ã§ã¯ãªãã€è¿”信内容をå«ã‚“ã æ–°è¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’作æˆã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ msgCompose.partiallyEncrypted.inlinePGP=ã‚ãªãŸãŒè¿”ä¿¡ã—よã†ã¨ã—ã¦ã„るメッセージã«ã¯ã€æš—å·åŒ–ã•れã¦ã„ã‚‹éƒ¨åˆ†ã¨æš—å·åŒ–ã•れã¦ã„ãªã„部分ãŒã‚りã¾ã™ã€‚å…ƒã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®é€ä¿¡è€…ãŒæš—å·åŒ–ã•れã¦ã„る部分を復å·ã§ãã¦ã„ãªã„å ´åˆã€ã‚ãªãŸãŒã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«è¿”ä¿¡ã™ã‚‹ã“ã¨ã§å…ƒã®é€ä¿¡è€…ãŒå¾©å·ã§ããªã‹ã£ãŸæ©Ÿå¾®æƒ…å ±ã®æ¼æ´©ã«ã¤ãªãŒã‚‹æã‚ŒãŒã‚りã¾ã™\n\n返信メッセージã‹ã‚‰ã€å¼•用部をã™ã¹ã¦é™¤åŽ»ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ msgCompose.internalEncryptionError=内部エラー: 期待ã•ã‚ŒãŸæš—å·åŒ–ãŒç„¡åŠ¹åŒ–ã•れã¾ã—㟠msgCompose.internalError=内部エラーãŒç™ºç”Ÿã—ã¾ã—㟠msgCompose.toolbarTxt.signAndEncrypt=ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯æš—å·åŒ–ãŠã‚ˆã³ç½²åã•れã¾ã™ msgCompose.toolbarTxt.signOnly=ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ç½²åã•れã¾ã™ msgCompose.toolbarTxt.encryptOnly=ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯æš—å·åŒ–ã•れã¾ã™ msgCompose.toolbarTxt.noEncryption=ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯æš—å·åŒ–ã‚‚ç½²åã‚‚ã•れã¾ã›ã‚“ msgCompose.toolbarTxt.disabled=é¸æŠžã—ãŸå·®å‡ºäººã«ã¤ã„㦠Enigmail ã¯ç„¡åŠ¹åŒ–ã•れã¦ã„ã¾ã™ msgCompose.protectSubject.tooltip=ä»¶åã‚’ä¿è­·ã—ã¾ã™ msgCompose.noSubjectProtection.tooltip=ä»¶åã‚’ä¿è­·ã—ã¾ã›ã‚“ msgCompose.encryptedSubjectStub=Encrypted Message msgCompose.protectSubject.dialogTitle=ä»¶åã®ä¿è­·ã‚’有効ã«ã—ã¾ã™ã‹ï¼Ÿ msgCompose.protectSubject.question=é€šå¸¸ã®æš—å·åŒ–ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã§ã¯ã€ä»¶åã¯ä¿è­·ã•ã‚Œãšæ”¹ç«„ã•れるå¯èƒ½æ€§ãŒã‚りã¾ã™\n\n本æ¥ã®ä»¶åã‚’æš—å·åŒ–ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ä¸­ã«åŸ‹ã‚込んã ã†ãˆã§ä»¶åを代替テキストã«ç½®ãæ›ãˆã€\n復å·ã—ãªã„é™ã‚Šæœ¬æ¥ã®ä»¶åを確èªã™ã‚‹ã“ã¨ãŒã§ããªã„よã†ã«ã™ã‚‹ã“ã¨ãŒå¯èƒ½ã¨ãªã‚Šã¾ã—ãŸ\n\næš—å·åŒ–ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ãŠã‘ã‚‹ä»¶åã®ä¿è­·ã‚’有効ã«ã—ã¾ã™ã‹ï¼Ÿ msgCompose.protectSubject.yesButton=ä»¶åã‚’ä¿è­·ã™ã‚‹(&P) msgCompose.protectSubject.noButton=ä»¶åã‚’ä¿è­·ã—ãªã„(&L) msgCompose.detailsButton.label=詳細... msgCompose.detailsButton.accessKey=D msgCompose.pepSendUnknown=䏿˜Ž msgCompose.pepSendUnsecure=安全ã§ã¯ãªã„ msgCompose.pepSendSecure=安全 msgCompose.pepSendTrusted=安全ã‹ã¤ä¿¡é ¼ã—ã¦ã„ã‚‹ pep.alert.disabledForIdentity=p≡p ã¯ç¾åœ¨ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«å¯¾ã—ã¦ã¯ç„¡åŠ¹åŒ–ã•れã¦ã„ã¾ã™ã€‚Enigmail/p≡p 設定ã‹ã‚‰ p≡p を有効化ã—ã¦ãã ã•ã„ pep.alert.weakReply=安全ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«å¯¾ã—ã¦ã€å®‰å…¨ã§ã¯ãªã„返信ã‚ã‚‹ã„ã¯è»¢é€ã‚’行ãŠã†ã¨ã—ã¦ã„ã¾ã™ã€‚ã“ã®ã¾ã¾ç¶šè¡Œã™ã‚‹ã¨ã€ã‚ãªãŸã¨é€šä¿¡ç›¸æ‰‹ã®æ©Ÿå¾®æƒ…å ±ãŒæ¼æ´©ã™ã‚‹æã‚ŒãŒã‚りã¾ã™ã€‚本当ã«ç¶šè¡Œã—ã¾ã™ã‹ï¼Ÿ # note: should end with double newline: sendAborted=é€ä¿¡ãŒä¸­æ–­ã•れã¾ã—ãŸ\n\n # details: keyNotTrusted=éµ '%S' ã«ã¯å分ãªä¿¡ç”¨åº¦ãŒã‚りã¾ã›ã‚“ keyNotFound=éµ '%S' ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ keyRevoked=éµ '%S' ã¯å¤±åйã—ã¦ã„ã¾ã™ keyExpired=éµ '%S' ã¯æœŸé™åˆ‡ã‚Œã§ã™ statPGPMIME=PGP/MIME statSMIME=S/MIME statSigned=ç½²åã•れ㟠statEncrypted=æš—å·åŒ–ã•れ㟠statPlain=ç½²åã‚‚æš—å·åŒ–ã‚‚ã•れã¦ã„ãªã„ offlineSave=%2$S 宛㮠%1$S メッセージを未é€ä¿¡ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãƒ•ォルダーã¸ä¿å­˜ã—ã¾ã™ã‹ï¼Ÿ onlineSend=%2$S 宛㮠%1$S メッセージをé€ä¿¡ã—ã¾ã™ã‹ï¼Ÿ encryptKeysNote=注æ„: ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯æ¬¡ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ ID/éµã«å¯¾ã—ã¦æš—å·åŒ–ã•れã¦ã„ã¾ã™: %S hiddenKey=<隠蔽ã•れãŸéµ> signFailed=Enigmail エラー; ç½²å/æš—å·åŒ–ã«å¤±æ•—ã—ã¾ã—ãŸã€‚æš—å·åŒ–ã›ãšã«å¹³æ–‡ã‚’é€ä¿¡ã—ã¾ã™ã‹ï¼Ÿ msgCompose.button.sendUnencrypted=æš—å·åŒ–ã›ãšã«å¹³æ–‡ã‚’é€ä¿¡ã™ã‚‹(&S) recipientsSelectionHdr=æš—å·åŒ–ã®ãŸã‚ã®å—å–人を指定ã—ã¦ãã ã•ã„ configureNow=ã“ã® ID ã«å¯¾ã—㦠Enigmail セキュリティ ãŒã¾ã è¨­å®šã•れã¦ã„ã¾ã›ã‚“。今ã™ã設定ã—ã¾ã™ã‹ï¼Ÿ # encryption/signing status and associated reasons: encryptMessageAuto=æš—å·åŒ–: 有効 (自動) encryptMessageNorm=æš—å·åŒ–: 有効 signMessageAuto=ç½²å: 有効 (自動) signMessageNorm=ç½²å: 有効 encryptOff=æš—å·åŒ–: 無効 encryptOnWithReason=æš—å·åŒ–: 有効 (%S) encryptOffWithReason=æš—å·åŒ–: 無効 (%S) encryptOn=æš—å·åŒ–: 有効 signOn=ç½²å: 有効 signOff=ç½²å: 無効 signOnWithReason=ç½²å: 有効 (%S) signOffWithReason=ç½²å: 無効 (%S) reasonEnabledByDefault=æ—¢å®šã§æœ‰åй reasonManuallyForced=æ‰‹å‹•ã§æŒ‡å®š reasonByRecipientRules=å—å–人ã”ã¨ã®è¨­å®šã«ã‚ˆã‚‹æŒ‡å®š reasonByAutoEncryption=é€ä¿¡æ™‚ã®è¨­å®šã«ã‚ˆã‚‹æŒ‡å®š reasonByConflict=å—å–人ã”ã¨ã®è¨­å®šã«çŸ›ç›¾ãŒå­˜åœ¨ reasonByEncryptionMode=æš—å·åŒ–モードã«ã‚ˆã‚‹æŒ‡å®š # should not be used anymore: encryptYes=æš—å·åŒ–ã™ã‚‹ encryptNo=æš—å·åŒ–ã—ãªã„ # should not be used anymore: signYes=ç½²åã™ã‚‹ signNo=ç½²åã—ãªã„ # PGP/MIME status: pgpmimeNormal=プロトコル: PGP/MIME inlinePGPNormal=プロトコル: インライン PGP smimeNormal=プロトコル: S/MIME pgpmimeAuto=プロトコル: PGP/MIME (自動) inlinePGPAuto=プロトコル: インライン PGP (自動) smimeAuto=プロトコル: S/MIME (自動) # should not be used anymore pgpmimeYes=PGP/MIME pgpmimeNo=インライン PGP # Attach own key status (tooltip strings): attachOwnKeyNo=ã‚ãªãŸã®å…¬é–‹éµã¯æ·»ä»˜ã•れã¾ã›ã‚“ attachOwnKeyYes=ã‚ãªãŸã®å…¬é–‹éµãŒæ·»ä»˜ã•れã¾ã™ attachOwnKeyDisabled=ã‚ãªãŸã®å…¬é–‹éµã‚’添付ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。éµã‚’添付ã™ã‚‹ãŸã‚ã«ã¯ã€ã‚¢ã‚«ã‚¦ãƒ³ãƒˆè¨­å®š → OpenPGP セキュリティ\nã«ãŠã„ã¦ã“ã®æ©Ÿèƒ½ã‚’有効化ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ rulesConflict=å—å–人ã”ã¨ã®è¨­å®šã«çŸ›ç›¾ãŒã‚りã¾ã™\n%S\n\nã“れらã®è¨­å®šã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡ã—ã¾ã™ã‹ï¼Ÿ msgCompose.button.configure=設定ã™ã‚‹(&C) msgCompose.button.send=メッセージをé€ä¿¡ã™ã‚‹(&S) msgCompose.button.save=メッセージをä¿å­˜ã™ã‚‹(&S) # Strings in enigmailMsgHdrViewOverlay.js keyNeeded=ç½²åã®æ¤œè¨¼ã«ã¯å…¬é–‹éµ %S ãŒå¿…è¦ã§ã™ keyUsed=ç½²åã®æ¤œè¨¼ã«ã¯å…¬é–‹éµ %S ãŒä½¿ã‚れã¾ã—㟠clickDecrypt=; 「復å·/æ¤œè¨¼ã€æ©Ÿèƒ½ã‚’使用ã—ã¦ãã ã•ã„ clickDecryptRetry=; å†åº¦è©¦ã™ã«ã¯ã€ã€Œå¾©å·/æ¤œè¨¼ã€æ©Ÿèƒ½ã‚’使用ã—ã¦ãã ã•ã„ clickDetailsButton=; 詳ã—ãã¯ã€Œè©³ç´°ã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã¦ãã ã•ã„ clickImportButton=; 「éµã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã¦éµã‚’インãƒãƒ¼ãƒˆã—ã¦ãã ã•ã„ keyTypeUnsupported=; ã“ã®å½¢å¼ã®éµã¯ãŠä½¿ã„ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã® GnuPG ã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“ msgPart=メッセージã®ä¸€éƒ¨åˆ†ãŒ %S ã•れã¦ã„ã¾ã™ msgSigned=ç½²å msgSignedUnkownKey=䏿˜Žãªéµã§ç½²å msgEncrypted=æš—å·åŒ– msgSignedAndEnc=ç½²åã‹ã¤æš—å·åŒ– unverifiedSig=検証ã§ããªã„ç½²åã§ã™ incompleteDecrypt=復å·ãŒä¸å®Œå…¨ã§ã™ needKey=エラー - メッセージã®å¾©å·ã«é©åˆã™ã‚‹ç§˜å¯†éµãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ failedDecrypt=エラー - 復å·ã«å¤±æ•—ã—ã¾ã—㟠badPhrase=エラー - 無効ãªãƒ‘スフレーズã§ã™ failedDecryptVerify=エラー - 復å·/検証ã«å¤±æ•—ã—ã¾ã—㟠mdcError=エラー - メッセージã®å®Œå…¨æ€§ã¯ä¿è­·ã•れã¦ã„ã¾ã›ã‚“ viewInfo=; 詳細ã¯ã€Œãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£æƒ…å ±ã€ã‚’確èªã—ã¦ãã ã•ã„ decryptedMsg=復å·ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ decryptedMsgWithFormatError=復å·ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ (å¤ã„ Exchange サーãƒãƒ¼ã«ã‚ˆã‚‹ PGP フォーマットã®ç ´æã‚’修復ã—ã¦ã„ã‚‹ãŸã‚ã€å¾©å·çµæžœã‚’æ­£ã—ã読むã“ã¨ãŒã§ããªã„å¯èƒ½æ€§ãŒã‚りã¾ã™) usedAlgorithms=使用アルゴリズム: %1$S ãŠã‚ˆã³ %2$S pepStatusInfo.text=p≡p ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸çŠ¶æ³ pepStatusInfo.title.m3=攻撃ã•れã¦ã„ã‚‹ pepStatusInfo.info.m3=ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯æ”»æ’ƒã•れã¦ãŠã‚Šã€å®‰å…¨ã§ã¯ã‚りã¾ã›ã‚“ pepStatusInfo.title.m1=誤ã£ã¦ä¿¡é ¼ã•れ㟠pepStatusInfo.info.m1=ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®é€šä¿¡ç›¸æ‰‹ã¯ã€ã€Œèª¤ã£ã¦ä¿¡é ¼ã•れãŸã€ã¨è¨˜éŒ²ã•れãŸã“ã¨ãŒã‚りã¾ã™ pepStatusInfo.title.r0=䏿˜Ž pepStatusInfo.info.r0=ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ã¯å®‰å…¨æ€§ã‚’判断ã™ã‚‹ãŸã‚ã«ååˆ†ãªæƒ…å ±ãŒå«ã¾ã‚Œã¦ã„ã¾ã›ã‚“ pepStatusInfo.title.r1=復å·ä¸å¯ pepStatusInfo.info.r1=éµãŒåˆ©ç”¨å¯èƒ½ã§ãªã„ãŸã‚ã€ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’復å·ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ pepStatusInfo.title.r2=復å·ä¸å¯ pepStatusInfo.info.r2=éµãŒåˆ©ç”¨å¯èƒ½ã§ãªã„ãŸã‚ã€ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’復å·ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ pepStatusInfo.title.r3=安全ã§ã¯ãªã„ pepStatusInfo.info.r3=ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯å®‰å…¨ã§ã¯ã‚りã¾ã›ã‚“ pepStatusInfo.title.r4=安全ã§ã¯ãªã„å¯èƒ½æ€§ã‚り pepStatusInfo.info.r4=ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯é€šä¿¡ç›¸æ‰‹ã«ã‚ˆã£ã¦ã¯å®‰å…¨ã§ã¯ã‚りã¾ã›ã‚“ pepStatusInfo.title.r5=ä¿¡é ¼ã§ããªã„セキュリティ pepStatusInfo.info.r5=ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ã¯ä¿¡é ¼ã§ããªã„ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãŒæ–½ã•れã¦ã„ã¾ã™ pepStatusInfo.title.r6=安全... pepStatusInfo.info.r6=ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯å®‰å…¨ã§ã™ãŒã€é€šä¿¡ç›¸æ‰‹ã‚’èªè¨¼ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ pepStatusInfo.title.r7=安全ã‹ã¤ä¿¡é ¼æ¸ˆã¿ pepStatusInfo.info.r7=ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯å®‰å…¨ã‹ã¤ä¿¡é ¼æ¸ˆã¿ã§ã™ pepStatusInfo.color.green=ç·‘ pepStatusInfo.color.yellow=黄 pepStatusInfo.color.red=赤 pepRevokeTrust.question=éµ %S ã®ä¿¡ç”¨åº¦ã‚’本当ã«å–り消ã—ã¾ã™ã‹ï¼Ÿ pepRevokeMistrust.question=éµ %S を本当ã«å†ã³ä¿¡ç”¨ã—ã¾ã™ã‹ï¼Ÿ pepRevokeTrust.doRevoke=ä¿¡ç”¨åº¦ã‚’å–æ¶ˆ(&T) wksConfirmationReq=Web Key Directory 確èªãƒªã‚¯ã‚¨ã‚¹ãƒˆ wksConfirmationReq.message=ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã€Web Key Directory ã¸ã®ã‚¢ãƒƒãƒ—ロードを承èªã™ã‚‹ã‹ã®ç¢ºèªã®ãŸã‚ã«\nã‚ãªãŸã®ãƒ¡ãƒ¼ãƒ«ãƒ—ロãƒã‚¤ãƒ€ã‹ã‚‰é€ä¿¡ã•れãŸã‚‚ã®ã§ã™\nã‚ãªãŸã®å…¬é–‹éµã‚’アップロードã™ã‚‹ã“ã¨ã§ã€ã‚ãªãŸã®é€šä¿¡ç›¸æ‰‹ãŒã‚ãªãŸã®å…¬é–‹éµã‚’見ã¤ã‘ã€ã‚ãªãŸã«æš—å·åŒ–ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡ã™ã‚‹ã“ã¨ãŒå¯èƒ½ã¨ãªã‚Šã¾ã™\n\nã‚ãªãŸã®å…¬é–‹éµã®ã‚¢ãƒƒãƒ—ロードを承èªã™ã‚‹å ´åˆã«ã¯ã€ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ãƒãƒ¼ã®ã€Œãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’承èªã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã¦ãã ã•ã„\n承èªã—ãªã„å ´åˆã«ã¯ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’無視ã—ã¦ãã ã•ã„ wksConfirmationReq.button.label=ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’æ‰¿èª autocryptSetupReq=Perform Autocrypt セットアップã®å®Ÿè¡Œ autocryptSetupReq.button.label=セットアップ開始 autocryptSetupReq.setupMsg.desc=ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ã¯ã€ã‚ãªãŸã®ç§˜å¯†éµã‚’å«ã‚㟠Autocrypt ã®ã™ã¹ã¦ã®è¨­å®šã‚’安全ã«ä»–ã®ãƒ‡ãƒã‚¤ã‚¹ã‹ã‚‰ç§»è¡Œã™ã‚‹ãŸã‚ã®æƒ…å ±ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ autocryptSetupReq.setupMsg.backup=ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã™ã‚‹ã“ã¨ã§ã€ç§˜å¯†éµã‚’ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚パスワードを書ãç•™ã‚ã€å®‰å…¨ã«ä¿ç®¡ã—ã¦ãã ã•ã„ autocryptSetupReq.message.import=設定ã¨éµã‚’インãƒãƒ¼ãƒˆã™ã‚‹ã«ã¯ã€ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ãƒãƒ¼ã®ã€Œã‚»ãƒƒãƒˆã‚¢ãƒƒãƒ—é–‹å§‹ã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã¦ãã ã•ã„ autocryptSetupReq.message.sent=æ–°ã—ã„デãƒã‚¤ã‚¹ä¸Šã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’クリックã—ã€è¨­å®šã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã®æŒ‡ç¤ºã«å¾“ã£ã¦ãã ã•ã„ # strings in pref-enigmail.js oldGpgVersion20=Enigmail ã®åˆæœŸåŒ–ã«å¤±æ•—ã—ã¾ã—ãŸ\n\nGnuPG ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %1$S ãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã¾ã™ãŒã€ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã® GnuPG 㯠Enigmail ã§ã¯æ—¢ã«ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“。Enigmail ã®å‹•作ã«ã¯ GnuPG ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %2$S 以é™ãŒå¿…è¦ã§ã™ã€‚GnuPG をアップグレードã—ã¦ãã ã•ã„ locateGpg=GnuPG プログラムを指定ã™ã‚‹ invalidGpgPath=GnuPG ã¯è¨­å®šã•れã¦ã„るパスã§ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“。Enigmail 㯠GnuPG ã®ãƒ‘スをå†è¨­å®šã™ã‚‹ã‹ã€ã‚¢ãƒ—リケーションをå†èµ·å‹•ã™ã‚‹ã¾ã§ç„¡åйã¨ãªã‚Šã¾ã™ warningsAreReset=ã™ã¹ã¦ã®è­¦å‘Šã¯ãƒªã‚»ãƒƒãƒˆã•れã¾ã—㟠prefs.gpgFound=GnuPG 実行ファイル:%S prefs.gpgNotFound=GnuPG ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—㟠prefs.warnAskNever=警告: ã“ã®è¨­å®šã‚’有効ã«ã™ã‚‹ã¨ã€å—å–人ã®ä¸€äººã«ã§ã‚‚éµãŒè¦‹ã¤ã‹ã‚‰ãªã„å ´åˆã«ã€ä¸€åˆ‡ã®é€šçŸ¥ã‚‚ãªãæš—å·åŒ–ã•れãªããªã‚Šã¾ã™ã€‚Enigmail ã¯ã“ã®ã‚ˆã†ãªã“ã¨ãŒèµ·ã“ã£ã¦ã‚‚一切通知ã—ã¾ã›ã‚“ prefs.warnIdleTimeForUnknownAgent=gpg-agent ã«æŽ¥ç¶šã§ãã¾ã›ã‚“。ã“ã®ã‚·ã‚¹ãƒ†ãƒ ã§ã¯ãƒ‘スフレーズã®ç®¡ç†ã« gpg-agent ã§ã¯ãªã特別ãªãƒ„ール (例:gnome-keyringã€seahorse-agentã€KDE wallet manager ãªã©) ãŒä½¿ã‚れã¦ã„るよã†ã§ã™ã€‚Enigmail ã¯ã“れらã®ãƒ„ールã«ã‚ˆã‚‹ãƒ‘スフレーズã®è¨˜æ†¶æ™‚間を制御ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。ãã®ãŸã‚ã€Enigmail ã§ã®ãƒ‘スフレーズã®è¨˜æ†¶æ™‚é–“ã®è¨­å®šã¯ç„¡è¦–ã•れã¾ã™ prefEnigmail.oneKeyserverOnly=エラー - OpenPGP éµã®è‡ªå‹•çš„ãªãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã®ãŸã‚ã®å…¬é–‹éµã‚µãƒ¼ãƒãƒ¼ã¯ 1 ã¤ã—ã‹æŒ‡å®šã§ãã¾ã›ã‚“ # Strings used in core.jsm # (said file also re-uses some strings from above) enterAdminPin=スマートカードã®ç®¡ç†è€… PIN を入力ã—ã¦ãã ã•ã„ enterCardPin=スマートカード㮠PIN を入力ã—ã¦ãã ã•ã„ notInit=エラー - Enigmail サービスã¯ã¾ã åˆæœŸåŒ–ã•れã¦ã„ã¾ã›ã‚“ badCommand=エラー - æš—å·åŒ–コマンドã¯å¤±æ•—ã—ã¾ã—㟠cmdLine=コマンドラインã¨å‡ºåŠ›: notRequired=エラー - æš—å·åŒ–ã¯å¿…è¦ã‚りã¾ã›ã‚“ notComplete=エラー - éµã®ç”ŸæˆãŒçµ‚了ã—ã¦ã„ã¾ã›ã‚“ invalidEmail=エラー - 無効ãªãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã§ã™ noPassphrase=エラー - パスフレーズãŒå…¥åŠ›ã•れã¦ã„ã¾ã›ã‚“ noPGPblock=エラー - 有効㪠OpenPGP データブロックãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ unverifiedReply=インデントã•れ㟠(返信) 部分ãŒãŠãらã修正ã•れã¦ã„ã¾ã™ keyInMessageBody=メッセージ中ã«éµãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚「éµã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã€ã‚’クリックã—ã¦éµã‚’インãƒãƒ¼ãƒˆã—ã¦ãã ã•ã„ sigMismatch=エラー - ç½²åãŒä¸æ­£ã§ã™ cantImport=公開éµã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã«å¤±æ•—ã—ã¾ã—ãŸ\n\n doImportOne=éµ %1$S (%2$S) をインãƒãƒ¼ãƒˆã—ã¾ã™ã‹ï¼Ÿ doImportMultiple=ã“れらã®éµã‚’インãƒãƒ¼ãƒˆã—ã¾ã™ã‹ï¼Ÿ\n\n%S previewFailed=公開éµã®èª­ã¿è¾¼ã¿ã«å¤±æ•—ã—ã¾ã—㟠# Strings used in errorHandling.jsm sc.wrongCardAvailable=ã‚«ãƒ¼ãƒ‰ãƒªãƒ¼ãƒ€ã«æŒ¿å…¥ã•れã¦ã„るスマートカード %1$S ã¯ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å‡¦ç†ã«ä½¿ç”¨ã§ãã¾ã›ã‚“\nスマートカード %2$S を挿入ã—ã¦ã‚‚ã†ä¸€åº¦æ“作をã—ã¦ä¸‹ã•ã„ sc.insertCard=ã“ã®æ“作ã«ã¯ã‚¹ãƒžãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ %S ãŒå¿…è¦ã§ã™\nå¿…è¦ãªã‚¹ãƒžãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã‚’挿入ã—ã¦ã‚‚ã†ä¸€åº¦æ“作をã—ã¦ä¸‹ã•ã„ sc.removeCard=ã“ã®æ“作ã«ã¯ã‚¹ãƒžãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã¯ä¸è¦ã§ã™\nスマートカードを抜ã„ã¦ã‚‚ã†ä¸€åº¦æ“作をã—ã¦ä¸‹ã•ã„ sc.noCardAvailable=スマートカードãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“\nスマートカードを挿入ã—ã¦ã€ã‚‚ã†ä¸€åº¦æ“作を行ã£ã¦ãã ã•ã„ sc.noReaderAvailable=スマートカードリーダã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“\nカードリーダを接続ã—ã€ã‚¹ãƒžãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã‚’挿入ã—ã¦ã€ã‚‚ã†ä¸€åº¦æ“作を行ã£ã¦ãã ã•ã„ keyError.keySpecNotFound=メールアドレス "%S" ã«é©åˆã™ã‚‹éµãŒéµæŸã®ä¸­ã«ã‚りã¾ã›ã‚“ keyError.keyIdNotFound=指定ã•れãŸéµ ID "%S" ãŒéµæŸã®ä¸­ã«ã‚りã¾ã›ã‚“ keyError.resolutionAction=アカウント設定 → OpenPGP セキュリティã«ãŠã„ã¦æ­£å½“ãªéµã‚’指定ã—ã¦ãã ã•ã„ missingPassphrase=パスフレーズãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ errorHandling.gpgAgentInvalid=システムã§åˆ©ç”¨ã•れã¦ã„ã‚‹ gpg-agent ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¯ã€GnuPG ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¨äº’æ›æ€§ãŒã‚りã¾ã›ã‚“ errorHandling.gpgAgentError=GnuPG ãŒã‚³ãƒ³ãƒãƒ¼ãƒãƒ³ãƒˆã®ä¸€éƒ¨ã§ã‚ã‚‹ gpg-agent ã¨ã®ã‚³ãƒŸãƒ¥ãƒ‹ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã«é–¢ã™ã‚‹ã‚¨ãƒ©ãƒ¼ã‚’報告ã—ã¦ã„ã¾ã™ errorHandling.dirmngrError=GnuPG ãŒã‚³ãƒ³ãƒãƒ¼ãƒãƒ³ãƒˆã®ä¸€éƒ¨ã§ã‚ã‚‹ dirmngr ã¨ã®ã‚³ãƒŸãƒ¥ãƒ‹ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã«é–¢ã™ã‚‹ã‚¨ãƒ©ãƒ¼ã‚’報告ã—ã¦ã„ã¾ã™ errorHandling.pinentryError=GnuPG ã¯ã‚ãªãŸã®ãƒ‘スフレーズを pinentry 経由ã§å•ã„åˆã‚ã›ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—㟠errorHandling.readFaq=ã“れã¯ã‚·ã‚¹ãƒ†ãƒ ã®ã‚»ãƒƒãƒˆã‚¢ãƒƒãƒ—ã‚ã‚‹ã„ã¯è¨­å®šã®ã‚¨ãƒ©ãƒ¼ã§ã‚りã€Enigmail ãŒè‡ªå‹•çš„ã«ä¿®æ­£ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“\n\n以下ã®ã‚¦ã‚§ãƒ–サイトをå‚ç…§ã™ã‚‹ã“ã¨ã‚’推奨ã—ã¾ã™: https://www.enigmail.net/faq gpgNotFound=GnuPG プログラムを '%S' ã«è¦‹ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ\nEnigmail ã®è¨­å®šã§ã€GnuPG 実行ファイルã®ãƒ‘ã‚¹ãŒæ­£ã—ã設定ã•れã¦ã„ã‚‹ã‹ã©ã†ã‹ç¢ºèªã—ã¦ãã ã•ã„ gpgNotInPath=GnuPG 実行ファイルを PATH ã®ä¸­ã‹ã‚‰è¦‹ã¤ã‘られã¾ã›ã‚“ã§ã—ãŸ\nEnigmail ã®è¨­å®šã§ã€GnuPG 実行ファイルã®ãƒ‘ã‚¹ãŒæ­£ã—ã設定ã•れã¦ã„ã‚‹ã‹ã©ã†ã‹ç¢ºèªã—ã¦ãã ã•ã„ enigmailNotAvailable=Enigmail コアサービスを利用ã§ãã¾ã›ã‚“ prefGood=%S ã«ã‚ˆã‚‹æ­£å½“ãªç½²åã§ã™ prefBad=%S ã«ã‚ˆã‚‹ä¸æ­£ãªç½²åã§ã™ failCancel=エラー - ユーザーã«ã‚ˆã£ã¦éµã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ãŒä¸­æ­¢ã•れã¾ã—㟠failNoServer=エラー - éµã‚’ダウンロードã™ã‚‹ãŸã‚ã®éµã‚µãƒ¼ãƒãƒ¼ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“ failNoID=エラー - éµã‚’ダウンロードã™ã‚‹ãŸã‚ã® ID ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“ failKeyExtract=エラー - éµã®å±•開コマンドã«å¤±æ•—ã—ã¾ã—㟠notFirstBlock=エラー - 最åˆã® OpenPGP ブロックã¯å…¬é–‹éµã§ã¯ã‚りã¾ã›ã‚“ importKeyConfirm=メッセージ中ã«åŸ‹ã‚è¾¼ã¾ã‚ŒãŸéµã‚’インãƒãƒ¼ãƒˆã—ã¾ã™ã‹ï¼Ÿ failKeyImport=エラー - éµã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã«å¤±æ•—ã—ã¾ã—㟠fileWriteFailed=ファイル %S ã¸ã®æ›¸ãè¾¼ã¿ã«å¤±æ•—ã—ã¾ã—㟠importKey=å…¬é–‹éµ %S ã‚’éµã‚µãƒ¼ãƒãƒ¼ã‹ã‚‰ã‚¤ãƒ³ãƒãƒ¼ãƒˆã—ã¾ã™: uploadKey=å…¬é–‹éµ %S ã‚’éµã‚µãƒ¼ãƒãƒ¼ã¸ã‚¢ãƒƒãƒ—ロードã—ã¾ã™: keyId=éµ ID keyAndSigDate=éµ ID: 0x%1$S / ç½²åæ—¥æ™‚: %2$S keyFpr=フィンガープリント: %S noEmailProvided=メールアドレスãŒå…¥åŠ›ã•れã¦ã„ã¾ã›ã‚“ï¼ keyAlreadySigned=ã“ã®éµã¯æ—¢ã«ç½²åã•れã¦ã„ã¾ã™ã€‚2 度ã¯ç½²åã§ãã¾ã›ã‚“ ##################################################################### # Strings used in enigmailKeySelection.js ##################################################################### selKeyExpired=期é™åˆ‡ã‚Œã® %S createdHeader=生æˆã•れã¾ã—㟠atLeastOneKey=éµãŒ 1 ã¤ã‚‚é¸æŠžã•れã¦ã„ã¾ã›ã‚“。少ãªãã¨ã‚‚ 1 ã¤ã®éµã‚’é¸æŠžã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ fewerKeysThanRecipients=å—å–人より少ãªã„æ•°ã®éµã—ã‹é¸æŠžã•れã¦ã„ã¾ã›ã‚“。éµã®é¸æŠžã‚’終了ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ userSel.button.goBack=éµã®é¸æŠžã«æˆ»ã‚‹ userSel.secretKeySel.title=ç½²å用ã®ç§˜å¯†éµã‚’é¸æŠžã™ã‚‹ userSel.problemNoKey=有効ãªéµãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ userSel.problemMultipleKeys=複数ã®éµãŒã‚りã¾ã™ # should be same as thunderbird ENTITY sendLaterCmd.label: sendLaterCmd.label=後ã§é€ä¿¡ # Strings used in enigmailAttachmentDialog.js pgpMimeNote=注æ„: PGP/MIME ã¯ã™ã¹ã¦ã®ãƒ¡ãƒ¼ãƒ«ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã§ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã‚‹ã‚ã‘ã§ã¯ã‚りã¾ã›ã‚“。よãã‚ã‹ã‚‰ãªã„å ´åˆã¯ã€%S è¨­å®šã‚’é¸æŠžã—ã¦ãã ã•ã„ first=一番目㮠second=二番目㮠# Strings used in am-enigprefs.js / enigmailEditIdentity.js encryptKeyHeader=æš—å·åŒ–ã®ãŸã‚ã® OpenPGP éµã®é¸æŠž identityName=ID: %S switchPepMode=ç¾åœ¨ã€Enigmail ã® 'p≡p Junior Mode' を利用ã—ã¦ã„ã¾ã™\n\nアカウント設定㧠OpenPGP ã‚ã‚‹ã„㯠S/MIME を有効化ã™ã‚‹ã¨ã€p≡p を無効化㗠Enigmail ã®æ¨™æº–モードを利用ã™ã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ enableEnigmail=p≡p を無効化(&D) # Strings used in enigmailSingleRcptSettings.js noEncryption=æš—å·åŒ–を有効ã«ã—ã¾ã—ãŸãŒã€éµã‚’é¸æŠžã—ã¦ã„ã¾ã›ã‚“。%1$S ã¸é€ä»˜ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æš—å·åŒ–ã™ã‚‹ãŸã‚ã«ã¯ã€æœ‰åйãªéµã‚’éµãƒªã‚¹ãƒˆã‹ã‚‰é¸æŠžã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚%2$S ã¸ã®æš—å·åŒ–を無効ã«ã—ã¾ã™ã‹ï¼Ÿ noKeyToUse=(ç„¡ã— - æš—å·åŒ–ã—ãªã„) noEmptyRule=空ã®ãƒ«ãƒ¼ãƒ«ã¯ç„¡åйã§ã™ã€‚ルール欄ã«ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’設定ã—ã¦ãã ã•ã„ invalidAddress=入力ã—ãŸãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ãŒç„¡åйã§ã™ã€‚å—å–人ã®åå‰ã¯è¨­å®šã§ãã¾ã›ã‚“。メールアドレスã ã‘ã«ã—ã¦ãã ã•ã„。例:\n 無効ãªä¾‹: 日本 èŠ±å­ \næ­£ã—ã„例: hanako.nippon@address.net noCurlyBrackets=中括弧 {} ã¯ç‰¹åˆ¥ãªæ„味をæŒã¡ã¾ã™ã®ã§ã€ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã«ä½¿ç”¨ã—ãªã„ã§ãã ã•ã„。ã“ã®ãƒ«ãƒ¼ãƒ«ã«å½“ã¦ã¯ã¾ã‚‹æ™‚ã®å‹•作を修正ã—ãŸã„ã™ã‚‹å ´åˆã¯ã€'å—å–人ãŒä¸Šè¨˜ã‚¢ãƒ‰ãƒ¬ã‚¹...' オプションを使用ã—ã¦ãã ã•ã„\nè©³ç´°ãªæƒ…å ±ã¯ãƒ˜ãƒ«ãƒ—ボタンを押ã—ã¦ãã ã•ã„ # Strings used in enigmailRulesEditor.js never=無効 always=有効 possible=返信時ã®ã¿ deleteRule=é¸æŠžã—ãŸãƒ«ãƒ¼ãƒ«ã‚’本当ã«å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ nextRcpt=(次ã®å—å–人) negateRule=Not addKeyToRule=éµ %1$S (%2$S) ã‚’å—å–人ã”ã¨ã®è¨­å®šã«è¿½åŠ ã™ã‚‹ # Strings used in enigmailSearchKey.js needOnline=é¸æŠžã•ã‚ŒãŸæ©Ÿèƒ½ã¯ã‚ªãƒ•ラインモードã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。オンラインã®ã¨ãã«ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„ protocolNotSupported=é¸æŠžã—ãŸãƒ—ロトコル '%S://' ã¯ã€OpenPGP éµã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ç”¨ã«ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“ gpgkeysDisabled=次ã®ã‚ªãƒ—ションを有効ã«ã™ã‚‹ã¨è‰¯ã„ã‹ã‚‚ã—れã¾ã›ã‚“。'extensions.enigmail.useGpgKeysTool' noKeyserverConn=éµã‚µãƒ¼ãƒãƒ¼ %S ã«æŽ¥ç¶šã§ãã¾ã›ã‚“ã§ã—㟠keyDownloadFailed=éµã‚µãƒ¼ãƒãƒ¼ã‹ã‚‰éµã‚’ダウンロードã™ã‚‹ã“ã¨ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ステータスメッセージã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:\n%S internalError=内部エラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚éµã‚’ダウンロードã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—㟠noKeyFound=指定ã•ã‚ŒãŸæ¤œç´¢æ¡ä»¶ã«é©åˆã™ã‚‹éµã‚’発見ã§ãã¾ã›ã‚“ã§ã—㟠keyDownload.keyUnavailable=ID %S ã«é©åˆã™ã‚‹éµã‚’éµã‚µãƒ¼ãƒãƒ¼ä¸Šã§ç™ºè¦‹ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚éµã®æŒã¡ä¸»ãŒã€éµã‚’サーãƒãƒ¼ã«ã‚¢ãƒƒãƒ—ロードã—ã¦ã„ãªã„ã¨æ€ã‚れã¾ã™\n\né€ä¿¡å…ƒã«ã€éµã‚’ã‚ãªãŸã«é€ã‚‹ã‚ˆã†ä¾é ¼ã—ã¦ãã ã•ã„ # gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. gpgKeysFailed=éµã‚µãƒ¼ãƒãƒ¼ã§ã®æ¤œç´¢ã‚‚ã—ãã¯ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã«å¤±æ•—ã—ã¾ã—ãŸ: gpgkeys_%S ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“ã§ã—㟠# Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=所有者ã®ä¿¡ç”¨åº¦ã‚’設定ã§ãã¾ã›ã‚“ã§ã—㟠# Strings in enigmailSignKeyDlg.js signKeyFailed=éµã¸ã®ç½²åã«å¤±æ•—ã—ã¾ã—㟠alreadySigned.label=注æ„: éµ ID %S ã¯é¸æŠžã•れãŸç§˜å¯†éµã«ã‚ˆã£ã¦æ—¢ã«ç½²åã•れã¦ã„ã¾ã™ alreadySignedexportable.label=注æ„: éµ ID %S ã¯é¸æŠžã•れãŸç§˜å¯†éµã«ã‚ˆã£ã¦æ—¢ã«ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆå¯èƒ½ãªç½²åãŒã•れã¦ã„ã¾ã™ã€‚ã“れã«åŠ ãˆã¦ãƒ­ãƒ¼ã‚«ãƒ«ç½²åã‚’è¡Œã†æ„味ã¯ã‚りã¾ã›ã‚“ partlySigned.label=注記: éµ ID %S ã®ä¸€éƒ¨ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ ID ã¯é¸æŠžã•れãŸç§˜å¯†éµã«ã‚ˆã£ã¦æ—¢ã«ç½²åã•れã¦ã„ã¾ã™ noTrustedOwnKeys=ç½²åã«åˆ©ç”¨å¯èƒ½ãªéµãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚éµã«ç½²åã™ã‚‹ãŸã‚ã«ã¯ã€çµ¶å¯¾çš„ã«ä¿¡ç”¨ã—ã¦ã„る秘密éµã‚’最低ã§ã‚‚ä¸€ã¤æ‰€æœ‰ã—ã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ # Strings in enigmailKeyManager.js keyMan.loadingKeys=éµã‚’読ã¿è¾¼ã¿ä¸­ã§ã™ã€‚ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„... keyValid.unknown=䏿˜Ž keyValid.invalid=無効 keyValid.disabled=無効化 keyValid.revoked=失効 keyValid.expired=期é™åˆ‡ã‚Œ keyValid.noSubkey=有効ãªå‰¯éµãªã— keyTrust.untrusted=信用ã—ã¦ã„ãªã„ keyTrust.marginal=ã‚る程度 keyTrust.full=完全 keyTrust.ultimate=絶対的 keyTrust.group=(グループ) keyType.public=å…¬é–‹éµ keyType.publicAndSec=公開éµ/ç§˜å¯†éµ keyMan.enableKey=éµã‚’有効化 keyMan.disableKey=éµã‚’無効化 userAtt.photo=ユーザー属性 (JPEG イメージ) asciiArmorFile=ASCII å½¢å¼ (*.asc) importKeyFile=OpenPGP éµãƒ•ァイルã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆ gnupgFile=GnuPG ファイル createKeyOK=ã‚ãªãŸã®éµã‚’生æˆã—ã¾ã—㟠saveRevokeCertAs=失効証明書を生æˆã—ã¦ä¿å­˜ revokeCertOK=失効証明書を生æˆã—ã¾ã—ãŸã€‚ã“れã¯ç§˜å¯†éµã‚’ãªãã—ã¦ã—ã¾ã£ãŸã¨ããªã©ã«å…¬é–‹éµã‚’無効ã«ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã§ãã¾ã™ revokeCertFailed=失効証明書ã®ä½œæˆã«å¤±æ•—ã—ã¾ã—㟠addUidOK=ユーザー ID ã®è¿½åŠ ã«æˆåŠŸã—ã¾ã—㟠addUidFailed=ユーザー ID ã®è¿½åŠ ã«å¤±æ•—ã—ã¾ã—㟠noKeySelected=é¸æŠžã—ãŸæ“作を実行ã™ã‚‹ã«ã¯ã€å°‘ãªãã¨ã‚‚ 1 ã¤ã®éµã‚’é¸æŠžã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ exportToFile=公開éµã‚’ファイルã¸ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ exportKeypairToFile=公開éµ/秘密éµã®ãƒšã‚¢ã‚’ファイルã¸ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ exportSecretKey=エクスãƒãƒ¼ãƒˆã™ã‚‹ OpenPGP éµãƒ•ァイルã«ç§˜å¯†éµã‚’å«ã‚ã¾ã™ã‹ï¼Ÿ saveKeysOK=éµã‚’ä¿å­˜ã—ã¾ã—㟠saveKeysFailed=éµã®ä¿å­˜ã«å¤±æ•—ã—ã¾ã—㟠importKeysFailed=インãƒãƒ¼ãƒˆã«å¤±æ•—ã—ã¾ã—㟠enableKeyFailed=éµã®æœ‰åŠ¹åŒ–/無効化ã«å¤±æ•—ã—ã¾ã—㟠specificPubKeyFilename=%1$S (0x%2$S) pub specificPubSecKeyFilename=%1$S (0x%2$S) pub-sec defaultPubKeyFilename=Exported-public-keys defaultPubSecKeyFilename=Exported-public-and-secret-keys noSecretKeys=秘密éµãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“\n\n今ã‚ãªãŸã®éµã‚’生æˆã—ã¾ã™ã‹ï¼Ÿ sendKeysOk=éµã®é€ä¿¡ã«æˆåŠŸã—ã¾ã—㟠sendKeysFailed=éµã®é€ä¿¡ã«å¤±æ•—ã—ã¾ã—㟠receiveKeysOk=éµã®å—ä¿¡ã«æˆåŠŸã—ã¾ã—㟠receiveKeysFailed=éµã®å—ä¿¡ã«å¤±æ•—ã—ã¾ã—㟠importFromClip=éµã‚’クリップボードã‹ã‚‰ã‚¤ãƒ³ãƒãƒ¼ãƒˆã—ã¾ã™ã‹ï¼Ÿ importFromUrl=公開éµã‚’次㮠URL ã‹ã‚‰ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™: copyToClipbrdFailed=é¸æŠžã—ãŸéµã‚’クリップボードã¸ã‚³ãƒ”ーã§ãã¾ã›ã‚“ã§ã—㟠copyToClipbrdOK=éµã‚’クリップボードã«ã‚³ãƒ”ーã—ã¾ã—㟠deleteSecretKey=警告: ã‚ãªãŸã¯ç§˜å¯†éµã‚’削除ã—よã†ã¨ã—ã¦ã„ã¾ã™ï¼\nã‚‚ã—秘密éµã‚’削除ã—ãŸå ´åˆã€ã‚ãªãŸå®›ã«æš—å·åŒ–ã•れãŸã™ã¹ã¦ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’復å·ã§ããªããªã‚Šã€éµã‚’失効ã™ã‚‹ã“ã¨ã‚‚ã§ããªããªã‚Šã¾ã™\n\n本当ã«ç§˜å¯†éµã¨å…¬é–‹éµã®ä¸¡æ–¹ã‚’削除ã—ã¾ã™ã‹ï¼Ÿ\n'%S'? deleteMix=警告: ã‚ãªãŸã¯ç§˜å¯†éµã‚’削除ã—よã†ã¨ã—ã¦ã„ã¾ã™ï¼\n秘密éµã‚’削除ã™ã‚‹ã¨ã‚ãªãŸå®›ã«æš—å·åŒ–ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’復å·ã§ããªããªã‚Šã¾ã™\n\n本当ã«é¸æŠžã—ãŸç§˜å¯†éµã¨å…¬é–‹éµã‚’削除ã—ã¾ã™ã‹ï¼Ÿ deletePubKey=公開éµã‚’削除ã—ã¾ã™ã‹ï¼Ÿ "%S" deleteSelectedPubKey=é¸æŠžã—ãŸå…¬é–‹éµã‚’削除ã—ã¾ã™ã‹ï¼Ÿ deleteKeyFailed=éµã‚’削除ã§ãã¾ã›ã‚“ã§ã—㟠revokeKeyQuestion=éµ '%S' を失効ã•ã›ã‚ˆã†ã¨ã—ã¦ã„ã¾ã™\n\n失効ã•ã›ã‚‹ã¨ã€ã‚ãªãŸãŒã“ã®éµã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ç½²åã‚’ã™ã‚‹ã“ã¨ãŒã§ããªããªã‚‹ã»ã‹ã€éµã‚µãƒ¼ãƒãƒ¼ãªã©ã§é…布後ã¯ä»–ã®åˆ©ç”¨è€…ãŒã“ã®éµã§ã‚ãªãŸå®›ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æš—å·åŒ–ã™ã‚‹ã“ã¨ãŒã§ããªããªã‚Šã¾ã™ã€‚失効後もã€ã‚ãªãŸå®›ã®æ—¢å­˜ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å¾©å·ã‚’行ã†ã“ã¨ã¯ã§ãã¾ã™\n\n本当ã«å¤±åйã•ã›ã¾ã™ã‹ï¼Ÿ revokeKeyOk=éµã¯æ­£å¸¸ã«å¤±åйã—ã¾ã—ãŸã€‚ã‚‚ã—ã‚ãªãŸã®å…¬é–‹éµãŒéµã‚µãƒ¼ãƒãƒ¼ã§åˆ©ç”¨å¯èƒ½ã§ã‚れã°ã€å†ã‚¢ãƒƒãƒ—ロードã™ã‚‹äº‹ã‚’推奨ã—ã¾ã™ã€‚ãã†ã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€ã‚ãªãŸã®éµãŒå¤±åйã—ã¦ã„ã‚‹ã“ã¨ãŒå‘¨çŸ¥ã•れã¾ã™ revokeKeyFailed=éµã‚’失効ã§ãã¾ã›ã‚“ã§ã—㟠revokeKeyNotPresent=ã“ã®å¤±åŠ¹è¨¼æ˜Žæ›¸ã«é©åˆã™ã‚‹éµ (0x%S) ãŒå­˜åœ¨ã—ã¾ã›ã‚“ï¼\n\néµã‚’æŒã£ã¦ã„ãªã„å ´åˆã€å¤±åŠ¹è¨¼æ˜Žæ›¸ã‚ˆã‚Šã‚‚å‰ã«å…¬é–‹éµã‚’インãƒãƒ¼ãƒˆã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ï¼ revokeKeyAlreadyRevoked=éµ 0x%S ã¯æ—¢ã«å¤±åйã—ã¦ã„ã¾ã™ refreshAllQuestion=éµãŒ 1 ã¤ã‚‚é¸æŠžã•れã¦ã„ã¾ã›ã‚“。ã™ã¹ã¦ã®éµã‚’æ›´æ–°ã—ã¾ã™ã‹ï¼Ÿ refreshKeyServiceOn.warn=警告: ã‚ãªãŸã®éµã¯ã“れã‹ã‚‰ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã§å¯èƒ½ãªé™ã‚Šå®‰å…¨ã«æ›´æ–°ã•れã¾ã™\nã‚ãªãŸã®ã™ã¹ã¦ã®éµã‚’åŒæ™‚ã«æ›´æ–°ã™ã‚‹ã“ã¨ã¯ã€ã‚ãªãŸã«ã¤ã„ã¦ã®æƒ…報をä¸å¿…è¦ã«æ˜Žã‚‰ã‹ã¨ã—ã¦ã—ã¾ã†å¯èƒ½æ€§ãŒã‚りã¾ã™\næœ¬å½“ã«æ›´æ–°ã—ã¾ã™ã‹ï¼Ÿ refreshKey.warn=警告: éµã®æ•°ã‚„回線速度ã«ã‚ˆã£ã¦ã¯ã€ã™ã¹ã¦ã®éµã®æ›´æ–°ã«éžå¸¸ã«æ™‚é–“ãŒã‹ã‹ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ï¼ downloadContactsKeys.warn=注æ„ï¼šé€£çµ¡å…ˆã®æ•°ã‚„接続速度ã«ã‚ˆã£ã¦ã¯ã€ã™ã¹ã¦ã®éµã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã«éžå¸¸ã«æ™‚é–“ãŒã‹ã‹ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ï¼ downloadContactsKeys.importFrom=アドレス帳 '%S' ã®é€£çµ¡å…ˆã®éµã‚’検索ã—ã¾ã™ã‹ï¼Ÿ keyMan.button.exportSecKey=秘密éµã‚’å«ã‚ã¦ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ(&S) keyMan.button.exportPubKey=公開éµã®ã¿ã‚’エクスãƒãƒ¼ãƒˆ(&P) keyMan.button.import=インãƒãƒ¼ãƒˆ(&I) keyMan.button.refreshAll=ã™ã¹ã¦ã®éµã‚’æ›´æ–°(&R) keyMan.button.revokeKey=éµã®å¤±åй(&R) keyMan.button.skip=éµã‚’スキップ(&S) keylist.noOtherUids=ä»–ã® ID ã¯ã‚りã¾ã›ã‚“ keylist.hasOtherUids=別å keylist.noPhotos=写真ã¯åˆ©ç”¨ã§ãã¾ã›ã‚“ keylist.hasPhotos=写真 keyMan.addphoto.filepicker.title=追加ã™ã‚‹å†™çœŸã®é¸æŠž keyMan.addphoto.warnLargeFile=é¸æŠžã—ãŸãƒ•ァイルã®ã‚µã‚¤ã‚ºãŒ 25 kB ã‚’è¶…ãˆã¦ã„ã¾ã™\néµã®ã‚µã‚¤ã‚ºãŒå¤§ãããªã‚‹ãŸã‚ã€å¤§ããªå†™çœŸã®è¿½åŠ ã¯æŽ¨å¥¨ã•れã¦ã„ã¾ã›ã‚“ keyMan.addphoto.noJpegFile=é¸æŠžã—ãŸãƒ•ァイル㯠JPEG å½¢å¼ã§ã¯ãªã„よã†ã§ã™ã€‚é•ã†ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é¸æŠžã—ã¦ãã ã•ã„ keyMan.addphoto.failed=写真を追加ã§ãã¾ã›ã‚“ã§ã—㟠noWksIdentity=éµ %S ã«ã¯ Web Key Service ã«ãŠã‘る身元確èªãŒå­˜åœ¨ã—ã¾ã›ã‚“ keyman.addBlacklistKey.msg=éµ "%1$S (%2$S)" ã‚’ p≡p ã«ã‚ˆã‚‹æš—å·åŒ–ã§ä½¿ç”¨ã™ã‚‹ã“ã¨ã‚’ç¦æ­¢ã—ã¾ã™ã‹ï¼Ÿ keyman.removeBlacklistKey.msg=éµ "%1$S (%2$S)" ã‚’ p≡p ã«ã‚ˆã‚‹æš—å·åŒ–ã§ä½¿ç”¨ã™ã‚‹ã“ã¨ã‚’許å¯ã—ã¾ã™ã‹ï¼Ÿ keyman.addBlacklistKey.button=éµã‚’æ‹’å¦ãƒªã‚¹ãƒˆã«è¿½åŠ (&B) keyman.removeBlacklistKey.button=æ‹’å¦ãƒªã‚¹ãƒˆã‹ã‚‰é™¤åŽ»(&R) # Strings in enigmailManageUidDlg.xul changePrimUidFailed=主ã«ä½¿ã†ãƒ¦ãƒ¼ã‚¶ãƒ¼ ID ã®å¤‰æ›´ã«å¤±æ•—ã—ã¾ã—㟠changePrimUidOK=主ã«ä½¿ã†ãƒ¦ãƒ¼ã‚¶ãƒ¼ ID を変更ã—ã¾ã—㟠revokeUidFailed=ユーザー ID %S ã®å¤±åйã«å¤±æ•—ã—ã¾ã—㟠revokeUidOK=ユーザー ID %S を失効ã•ã›ã¾ã—ãŸã€‚ã‚‚ã—ã‚ãªãŸã®å…¬é–‹éµãŒéµã‚µãƒ¼ãƒãƒ¼ã§åˆ©ç”¨å¯èƒ½ã§ã‚れã°ã€å†ã‚¢ãƒƒãƒ—ロードã™ã‚‹äº‹ã‚’推奨ã—ã¾ã™ã€‚ãã†ã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€ã‚ãªãŸã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ ID ãŒå¤±åйã—ã¦ã„ã‚‹ã“ã¨ãŒå‘¨çŸ¥ã•れã¾ã™ revokeUidQuestion=本当ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼ ID %S を失効ã•ã›ã¾ã™ã‹ï¼Ÿ # Strings in enigmailKeyImportInfo.xul importInfoTitle=éµã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã«æˆåŠŸã—ã¾ã—ãŸï¼ importInfoBits=ビット importInfoCreated=ä½œæˆæ—¥æ™‚ importInfoFpr=フィンガープリント importInfoDetails=(詳細) importInfoNoKeys=éµã¯ã‚¤ãƒ³ãƒãƒ¼ãƒˆã•れã¾ã›ã‚“ã§ã—㟠# Strings in enigmailKeyDetailsDlg.xul keyTypePublic=å…¬é–‹éµ keyTypePrimary=ä¸»éµ keyTypeSubkey=å‰¯éµ keyTypePair=公開éµ/秘密éµã®ãƒšã‚¢ keyExpiryNever=ç„¡æœŸé™ keyAlgorithm_1=RSA keyAlgorithm_2=RSA keyAlgorithm_3=RSA keyAlgorithm_16=ELG keyAlgorithm_17=DSA keyAlgorithm_18=ECDH keyAlgorithm_19=ECDSA keyAlgorithm_20=ELG keyAlgorithm_22=EDDSA keyUsageEncrypt=æš—å·åŒ– keyUsageSign=ç½²å keyUsageCertify=証明 keyUsageAuthentication=èªè¨¼ keyDoesNotExpire=ç„¡æœŸé™ # Strings in enigmailGenCardKey.xul keygen.started=éµã‚’生æˆä¸­ã§ã™ã€‚ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„... keygen.completed=éµã‚’生æˆã—ã¾ã—ãŸã€‚æ–°ã—ã„éµ ID ã¯æ¬¡ã®é€šã‚Šã§ã™: 0x%S keygen.keyBackup=%S ã¨ã—ã¦éµã‚’ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã—ã¾ã—㟠keygen.passRequired=スマートカード以外ã®å ´æ‰€ã«ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã‚’ã¨ã‚‹ã®ã§ã‚れã°ã€ãƒ‘スフレーズを指定ã—ã¦ãã ã•ã„ # Strings in enigmailSetCardPin.xul cardPin.processFailed=PIN ã®å¤‰æ›´ã«å¤±æ•—ã—ã¾ã—㟠# Strings in enigRetrieveProgres.xul keyserverProgress.refreshing=éµã®æ›´æ–°ä¸­ã§ã™ã€‚ã—ã°ã‚‰ããŠå¾…ã¡ä¸‹ã•ã„ keyserverProgress.uploading=éµã®ã‚¢ãƒƒãƒ—ロード中ã§ã™ã€ã—ã°ã‚‰ããŠå¾…ã¡ä¸‹ã•ã„ keyserverProgress.wksUploadFailed=ã‚ãªãŸã®å…¬é–‹éµã‚’ Web Key Service ã«ã‚¢ãƒƒãƒ—ロードã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—㟠keyserverProgress.wksUploadCompleted=ã‚ãªãŸã®å…¬é–‹éµã¯æ­£å¸¸ã«ã‚ãªãŸã®ãƒ—ロãƒã‚¤ãƒ€ãƒ¼ã«ã‚¢ãƒƒãƒ—ロードã•れã¾ã—ãŸã€‚アップロードãŒã‚ãªãŸã«ã‚ˆã‚‹ã‚‚ã®ã§ã‚ã‚‹ã“ã¨ã‚’確èªã™ã‚‹ãŸã‚ã®ãƒ¡ãƒ¼ãƒ«ãŒé€ã‚‰ã‚Œã¦ãã¾ã™ keyserverTitle.refreshing=éµã®æ›´æ–° keyserverTitle.uploading=éµã®ã‚¢ãƒƒãƒ—ロード # Strings in enigmailSetupWizard passphrase.min8keys=パスフレーズã«ã¯å°‘ãªãã¨ã‚‚ 8 文字指定ã—ã¦ãã ã•ã„ setupWizard.reallyCancel=本当㫠Enigmail セットアップウィザードを中止ã—ã¾ã™ã‹ï¼Ÿ setupWizard.invalidGpg=指定ã•れãŸãƒ•ァイル㯠GnuPG ã®å®Ÿè¡Œãƒ•ァイルã§ã¯ã‚りã¾ã›ã‚“。他ã®ãƒ•ァイルを指定ã—ã¦ãã ã•ã„ setupWizard.specifyFile=å°‘ãªãã¨ã‚‚公開éµãƒ•ァイルを指定ã—ã¦ãã ã•ã„ setupWizard.installFailed=インストールã«å¤±æ•—ã—ãŸã‚ˆã†ã§ã™ã€‚ã‚‚ã†ä¸€åº¦ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’試ã¿ã‚‹ã‹ã€GnuPG を手動ã§ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã—ãŸå¾Œã§ã€Œé¸æŠžã€ãƒœã‚¿ãƒ³ã‹ã‚‰æŒ‡å®šã—ã¦ãã ã•ã„ setupWizard.downloadForbidden=セキュリティ上ã®ç†ç”±ã‹ã‚‰ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã¯è¡Œã‚れã¾ã›ã‚“。https://www.gnupg.org/ ã«ã‚¢ã‚¯ã‚»ã‚¹ã—㦠GnuPG をダウンロードã—ã¦ãã ã•ã„ setupWizard.downloadImpossible=GnuPG を正常ã«ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚時間をãŠã„ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã‚’試ã¿ã‚‹ã‹ã€https://www.gnupg.org/ ã«ã‚¢ã‚¯ã‚»ã‚¹ã—㦠GnuPG をダウンロードã—ã¦ãã ã•ã„ setupWizard.hashSumError=ダウンロードã—ãŸãƒ•ァイルã®å®Œå…¨æ€§ã‚’検証ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ファイルãŒç ´æã—ã¦ã„ã‚‹ã‹ã€æ”¹ç«„ã•れã¦ã„ã‚‹æã‚ŒãŒã‚りã¾ã™ã€‚ã“ã®ã¾ã¾ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’続行ã—ã¾ã™ã‹ï¼Ÿ setupWizard.importSettingsFile=インãƒãƒ¼ãƒˆã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã®æŒ‡å®š setupWizard.invalidSettingsFile=指定ã•れãŸãƒ•ã‚¡ã‚¤ãƒ«ã¯æ­£å½“㪠Enigmail ã®è¨­å®šæƒ…報ファイルã§ã¯ã‚りã¾ã›ã‚“ setupWizard.gpgConfExists=GnuPG ã®è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã¯æ—¢ã«å­˜åœ¨ã—ã¾ã™ã€‚å¤ã„環境ã®è¨­å®šãƒ•ァイルã§ä¸Šæ›¸ãã—ã¾ã™ã‹ï¼Ÿ setupWizard.noGpgHomeDir=GnuPG ã¨ã—㦠%S ãŒæŒ‡å®šã•れã¦ã„ã¾ã™ãŒã€ã“れã¯ãƒ•ォルダーã§ã¯ãªã„ãŸã‚利用ã§ãã¾ã›ã‚“ setupWizard.unmachtedIds=å¤ã„設定情報ã®ã†ã¡ã€ä»¥ä¸‹ã®å·®å‡ºäººæƒ…å ±ã«é©åˆã™ã‚‹ã‚‚ã®ãŒã‚りã¾ã›ã‚“:\n%S\nã“れらã®å·®å‡ºäººæƒ…å ±ã«ã¤ã„ã¦ã®è¨­å®šã‚’スキップã—ã¾ã™ # Strings in installGnuPG.jsm installGnuPG.downloadFailed=GnuPG ã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚詳細ã¯ã‚³ãƒ³ã‚½ãƒ¼ãƒ«ãƒ­ã‚°ã‚’確èªã—ã¦ãã ã•ã„ installGnuPG.installFailed=GnuPG ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚詳細ã¯ã‚³ãƒ³ã‚½ãƒ¼ãƒ«ãƒ­ã‚°ã‚’確èªã—ã¦ãã ã•ã„ # Strings in enigmailAddUidDlg.xul addUidDlg.nameOrEmailError=åå‰ã¨ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’入力ã—ã¦ä¸‹ã•ã„ addUidDlg.nameMinLengthError=åå‰ã¯ 5 文字以上必è¦ã§ã™ addUidDlg.invalidEmailError=有効ãªãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã§ã¯ã‚りã¾ã›ã‚“ # Strings in enigmailCardDetails.js Carddetails.NoASCII=OpenPGP スマートカードã§ã¯ã€åå‰ã« ASCII 文字ã®ã¿åˆ©ç”¨å¯èƒ½ã§ã™ # network error types errorType.SecurityCertificate=ウェブサービスã§ä½¿ç”¨ã•れã¦ã„ã‚‹ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£è¨¼æ˜Žæ›¸ã¯æ­£å½“ãªã‚‚ã®ã§ã¯ã‚りã¾ã›ã‚“ errorType.SecurityProtocol=ウェブサービスã§ä½¿ç”¨ã•れã¦ã„ã‚‹ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãƒ—ãƒ­ãƒˆã‚³ãƒ«ã¯æœªçŸ¥ã®ã‚‚ã®ã§ã™ errorType.Network=ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—㟠# filter stuff filter.folderRequired=ãƒ•ã‚©ãƒ«ãƒ€ãƒ¼ã‚’é¸æŠžã—ã¦ãã ã•ã„ filter.decryptMove.label=メッセージをæ’ä¹…çš„ã«å¾©å·ã™ã‚‹ (Enigmail) filter.decryptCopy.label=復å·ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ã‚³ãƒ”ーを作æˆã™ã‚‹ (Enigmail) filter.decryptMove.warnExperimental=警告:「メッセージをæ’ä¹…çš„ã«å¾©å·ã™ã‚‹ã€ãƒ•ィルターã¯ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ç ´æã™ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™\n\nã¯ã˜ã‚ã«ã€Œå¾©å·ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ã‚³ãƒ”ーを作æˆã™ã‚‹ã€ãƒ•ィルターを試験的ã«åˆ©ç”¨ã—ã€ãã®çµæžœã«å•題ãŒãªã„ã“ã¨ã‚’確èªã—ãŸã†ãˆã§ã€Œãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æ’ä¹…çš„ã«å¾©å·ã™ã‚‹ã€ãƒ•ィルターを使用ã™ã‚‹ã“ã¨ã‚’å¼·ãæŽ¨å¥¨ã—ã¾ã™ filter.tempPepFilterDesc=æš—å·åŒ–ã•れã¦ã„ãªã„é€ä¿¡æ¸ˆã¿ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ä¿å­˜ã™ã‚‹ãŸã‚ã®ä¸€æ™‚çš„ãªãƒ•ィルター filter.term.pgpencrypted.label=OpenPGP æš—å·åŒ– filter.encrypt.label=éµã«å¯¾ã—ã¦æš—å·åŒ–ã™ã‚‹ (Enigmail) filter.keyRequired=å—信者ã®éµã‚’é¸æŠžã—ã¦ãã ã•ã„ filter.keyNotFound="%S" ã«å¯¾ã™ã‚‹æš—å·åŒ–éµã‚’見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ filter.warn.keyNotSecret=警告 - 「éµã«å¯¾ã—ã¦æš—å·åŒ–ã™ã‚‹ã€ãƒ•ィルターã¯ã€å—信者を上書ãã—ã¾ã™\n\n"%S" ã«å¯¾ã™ã‚‹ç§˜å¯†éµã‚’æŒã£ã¦ã„ãªã„å ´åˆã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’復å·ã™ã‚‹ã“ã¨ã¯ã§ããªããªã‚Šã¾ã™ # strings in enigmailConvert.jsm converter.decryptBody.failed=以下ã®ä»¶åã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’復å·ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ\nä»¶å: "%S"\nç•°ãªã‚‹ãƒ‘スフレーズã§å†è©¦è¡Œã™ã‚‹ã‹ã€å¾©å·ã‚’スキップã™ã‚‹ã‹é¸æŠžã—ã¦ãã ã•ã„ converter.decryptAtt.failed=以下ã®ä»¶åã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®æ·»ä»˜ãƒ•ァイル "%1$S" を復å·ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ\n"ä»¶å: %2$S"\nç•°ãªã‚‹ãƒ‘スフレーズã§å†è©¦è¡Œã™ã‚‹ã‹ã€å¾©å·ã‚’スキップã™ã‚‹ã‹é¸æŠžã—ã¦ãã ã•ã„ saveLogFile.title=ログをファイルã«ä¿å­˜ # strings in gpg.jsm unknownSigningAlg=未知ã®ç½²åアルゴリズム (ID: %S) unknownHashAlg=未知ã®ãƒãƒƒã‚·ãƒ¥é–¢æ•° (ID: %S) # strings in keyRing.jsm keyring.photo=写真 keyRing.pubKeyRevoked=éµ %1$S (éµ ID %2$S) ã¯å¤±åйã—ã¦ã„ã¾ã™ keyRing.pubKeyExpired=éµ %1$S (éµ ID %2$S) ã¯æœ‰åŠ¹æœŸé™åˆ‡ã‚Œã§ã™ keyRing.pubKeyNotForSigning=éµ %1$S (éµ ID %2$S) ã¯ç½²åã«ã¯åˆ©ç”¨ã§ãã¾ã›ã‚“ keyRing.pubKeyNotForEncryption=éµ %1$S (éµ ID %2$S) ã¯æš—å·åŒ–ã«ã¯åˆ©ç”¨ã§ãã¾ã›ã‚“ keyRing.keyDisabled=éµ %1$S (éµ ID %2$S) ã¯ç„¡åŠ¹åŒ–ã•れã¦ã„ã‚‹ãŸã‚利用ã§ãã¾ã›ã‚“ keyRing.keyNotTrusted=éµ %1$S (éµ ID %2$S) ã¯å分ã«ä¿¡ç”¨ã•れã¦ã„ã¾ã›ã‚“。署åã«åˆ©ç”¨ã™ã‚‹ãŸã‚ã«ã¯ä¿¡ç”¨åº¦ã‚’「絶対的ã€ã«è¨­å®šã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ keyRing.keyInvalid=éµ %1$S (éµ ID %2$S) ã¯æ­£å½“ã§ã¯ã‚りã¾ã›ã‚“。ã“ã®éµã‚’æ­£ã—ãæ¤œè¨¼ã™ã‚‹ã‹ã€ã€Œæ¨™æº–ã®æš—å·åŒ–設定ã€ã‚’使用ã—ã¦ãã ã•ã„ keyRing.signSubKeysRevoked=éµ %1$S (éµ ID %2$S) ã®ã™ã¹ã¦ã®ç½²å用ã®å‰¯éµã¯å¤±åйã—ã¦ã„ã¾ã™ keyRing.signSubKeysExpired=éµ %1$S (éµ ID %2$S) ã®ã™ã¹ã¦ã®ç½²å用ã®å‰¯éµã¯æœ‰åŠ¹æœŸé™åˆ‡ã‚Œã§ã™ keyRing.signSubKeysUnusable=éµ %1$S (éµ ID %2$S) ã®ã™ã¹ã¦ã®ç½²å用ã®å‰¯éµã¯å¤±åŠ¹ã€æœ‰åŠ¹æœŸé™åˆ‡ã‚Œãªã©ã®ç†ç”±ã«ã‚ˆã‚Šåˆ©ç”¨ã§ãã¾ã›ã‚“ keyRing.encSubKeysRevoked=éµ %1$S (éµ ID %2$S) ã®ã™ã¹ã¦ã®æš—å·åŒ–用ã®å‰¯éµã¯å¤±åйã—ã¦ã„ã¾ã™ keyRing.encSubKeysExpired=éµ %1$S (éµ ID %2$S) ã®ã™ã¹ã¦ã®æš—å·åŒ–用ã®å‰¯éµã¯æœ‰åŠ¹æœŸé™åˆ‡ã‚Œã§ã™ keyRing.noSecretKey=éµ %1$S (éµ ID %2$S) ã®ç§˜å¯†éµãŒå­˜åœ¨ã—ãªã„ãŸã‚ã€ã“ã®éµã‚’ç½²åã«åˆ©ç”¨ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ keyRing.encSubKeysUnusable=éµ %1$S (éµ ID %2$S) ã®ã™ã¹ã¦ã®æš—å·åŒ–用ã®å‰¯éµã¯å¤±åŠ¹ã€æœ‰åŠ¹æœŸé™åˆ‡ã‚Œãªã©ã®ç†ç”±ã«ã‚ˆã‚Šåˆ©ç”¨ã§ãã¾ã›ã‚“ #strings in exportSettingsWizard.js cannotWriteToFile=Cannot save to fileファイル '%S' ã‚’ä¿å­˜ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚é•ã†ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é¸æŠžã—ã¦ãã ã•ã„ dataExportError=データã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—㟠enigmailSettings=EnigmailSettings defaultBackupFileName=Enigmail-export specifyExportFile=エクスãƒãƒ¼ãƒˆã™ã‚‹ãƒ•ァイルåを指定 homedirParamNotSUpported=--homedir ã‚„ --keyring ãªã©ã®ã€ãƒ‘スを指定ã™ã‚‹è¿½åŠ ãƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿ãƒ¼ã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ/インãƒãƒ¼ãƒˆã«ã¯å¯¾å¿œã—ã¦ã„ã¾ã›ã‚“ã€‚ãƒ‘ã‚¹ã®æŒ‡å®šã«ã¯ã€ç’°å¢ƒå¤‰æ•° GNUPGHOME ã®è¨­å®šãªã©ä»–ã®æ–¹æ³•を利用ã—ã¦ãã ã•ã„ #strings in expiry.jsm expiry.keyExpiresSoon=ã‚ãªãŸã®éµ %1$S 㯠%2$S æ—¥ä»¥å†…ã«æœŸé™åˆ‡ã‚Œã¨ãªã‚Šã¾ã™\n\næ–°ã—ã„éµãƒšã‚¢ã‚’作æˆã—ã€ã‚¢ã‚«ã‚¦ãƒ³ãƒˆè¨­å®šã‚’é©åˆ‡ã«æ›´æ–°ã™ã‚‹ã“ã¨ã‚’推奨ã—ã¾ã™ expiry.keysExpireSoon=以下ã®éµã¯ %1$S æ—¥ä»¥å†…ã«æœŸé™åˆ‡ã‚Œã¨ãªã‚Šã¾ã™:\n%2$S\n\næ–°ã—ã„éµãƒšã‚¢ã‚’作æˆã—ã€ã‚¢ã‚«ã‚¦ãƒ³ãƒˆè¨­å®šã‚’é©åˆ‡ã«æ›´æ–°ã™ã‚‹ã“ã¨ã‚’推奨ã—ã¾ã™ expiry.keyMissingOwnerTrust=ã‚ãªãŸã®ç§˜å¯†éµ %S ã®ä¿¡ç”¨åº¦ãŒå¤±ã‚れã¦ã„ã¾ã™\n\néµã®ãƒ—ロパティã‹ã‚‰ã€Œæ‰€æœ‰è€…ã«ã‚ˆã‚‹ä¿¡ç”¨åº¦ã€ã‚’「絶対的ã€ã«è¨­å®šã™ã‚‹ã“ã¨ã‚’推奨ã—ã¾ã™ expiry.keysMissingOwnerTrust=以下ã®ç§˜å¯†éµã®ä¿¡ç”¨åº¦ãŒå¤±ã‚れã¦ã„ã¾ã™\n%S\néµã®ãƒ—ロパティã‹ã‚‰ã€Œæ‰€æœ‰è€…ã«ã‚ˆã‚‹ä¿¡ç”¨åº¦ã€ã‚’「絶対的ã€ã«è¨­å®šã™ã‚‹ã“ã¨ã‚’推奨ã—ã¾ã™ expiry.OpenKeyManager=éµã®ç®¡ç†ã‚’é–‹ã expiry.OpenKeyProperties=éµã®ãƒ—ロパティを開ã #strings in pEpDecrypt.jsm pEpDecrypt.cannotDecrypt=ã“ã‚Œã¯æš—å·åŒ–ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã§ã™ã€‚ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«å¯¾å¿œã—ãŸç§˜å¯†éµãŒãªã„ãŸã‚ã€å¾©å·ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ #strings in gpgAgent.jsm gpghomedir.notexists=ã‚ãªãŸã® OpenPGP éµã‚’ä¿å­˜ã™ã‚‹ãŸã‚ã®ãƒ•ォルダー '%S' ã¯å­˜åœ¨ã›ãšã€ä½œæˆã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã›ã‚“ gpghomedir.notwritable=ã‚ãªãŸã® OpenPGP éµã‚’ä¿å­˜ã™ã‚‹ãŸã‚ã®ãƒ•ォルダー '%S' ã¯æ›¸ãè¾¼ã¿å¯èƒ½ã§ã¯ã‚りã¾ã›ã‚“ gpghomedir.notdirectory=ã‚ãªãŸã® OpenPGP éµã‚’ä¿å­˜ã™ã‚‹ãŸã‚ã®ãƒ•ォルダー '%S' ã¯ãƒ•ォルダーã§ã¯ãªãファイルã§ã™ gpghomedir.notusable=GnuPG ãŒæ­£ã—ã動作ã™ã‚‹ã‚ˆã†ã€ãƒ•ォルダーã®ãƒ‘ーミッションを変更ã™ã‚‹ã‹ã€GnuPG ã® "Home" ãƒ•ã‚©ãƒ«ãƒ€ãƒ¼ã®æŒ‡å®šã‚’変更ã—ã¦ãã ã•ã„ #strings in pepTrustWords.js pepTrustWords.cannotVerifyOwnId=ã‚ãªãŸè‡ªèº«ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã® Trustword ã‚’èªè¨¼ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ pepTrustWords.cannotFindKey=%S ã®ãŸã‚ã®éµã‚’見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“. pepTrustWords.cannotStoreChange=%S ã®ä¿¡ç”¨åº¦ã‚’変更ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ. pepTrustWords.generalFailure=%S ã® Trustword ã‚’å–å¾—ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“. pepTrustWords.partnerFingerprint=%S ã®ãƒ•ィンガープリント: #strings in mimeWkdHandler.jsm wkdMessage.body.req=ã‚ãªãŸã®ãƒ¡ãƒ¼ãƒ«ãƒ—ロãƒã‚¤ãƒ€ã¯ã€ã‚ãªãŸã®å…¬é–‹éµã® OpenPGP Web Key Directory ã¸ã®ã‚¢ãƒƒãƒ—ロードを進行中ã§ã™\n\nEnigmail ヘッダーã®ç¢ºèªãƒœã‚¿ãƒ³ã‚’クリックã—ã€å…¬é–‹éµã®å…¬è¡¨ã‚’完了ã—ã¦ãã ã•ã„ wkdMessage.body.process=ã“ã®ãƒ¡ãƒ¼ãƒ«ã¯ã€ã‚ãªãŸã®å…¬é–‹éµã® OpenPGP Web Key Directory ã¸ã®ã‚¢ãƒƒãƒ—ロードã®è‡ªå‹•プロセスã«ã‚ˆã‚‹ã‚‚ã®ã§ã™\n\nç¾æ™‚点ã§ã¯ã€ç‰¹ã«ä½•も行ã†å¿…è¦ã¯ã‚りã¾ã›ã‚“ #strings in pepHandshake.js pepPrivacyStatus.RatingBrokenSuggestion=ã‚ãªãŸã‹é€ä¿¡è€…ã®ã„ãšã‚Œã‹ãŒãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å†é€ä¿¡ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ pepPrivacyStatus.RatingHaveNoKeySuggestionOutgoing=ã‚ãªãŸãŒã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’作æˆã—ãŸã®ã§ã‚れã°ã€ã‚ãªãŸã®éµã¯åˆ©ç”¨å¯èƒ½ã§ã¯ã‚りã¾ã›ã‚“ pepPrivacyStatus.RatingMistrustSuggestion=ã‚ãªãŸã®é€šä¿¡ç›¸æ‰‹ã¨ã®é€šä¿¡ã‚’å†åº¦ç¢ºç«‹ã—ã€ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚’å†åº¦å®Œäº†ã•ã›ã¦ãã ã•ã„ pepPrivacyStatus.RatingReliableSuggestion=ã‚ãªãŸã®é€šä¿¡ç›¸æ‰‹ã¨ Trustword を対é¢ã‚ã‚‹ã„ã¯é›»è©±ã§äº¤æ›ã—ã€ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚’完了ã•ã›ã¦ãã ã•ã„。ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã¯ã€é€šä¿¡ç›¸æ‰‹ã”ã¨ã«ä¸€å›žã ã‘å¿…è¦ã§ã‚りã€ãれ以é™ã¯å®‰å…¨ã‹ã¤ä¿¡é ¼ã§ãる通信ãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ pepPrivacyStatus.RatingTrustedSuggestion=何も行ã†å¿…è¦ã¯ã‚りã¾ã›ã‚“ï¼ pepPrivacyStatus.RatingUndefinedSuggestionIncoming=ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯å®‰å…¨ã§ã¯ãªã„å¯èƒ½æ€§ãŒã‚りã¾ã™ pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=å¿…è¦ãªæƒ…報を追加ã—ã¦ãã ã•ã„ pepPrivacyStatus.RatingUnderAttackSuggestion=メッセージã®å†…容ã¨é€šä¿¡ç›¸æ‰‹ã‚’åˆ¥ã€…ã«æ¤œè¨¼ã—ã¦ãã ã•ã„ pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=一覧ã«ã‚る通信相手ã®ãƒ—ライãƒã‚·ãƒ¼çжæ³ã¯æœ€ä½Žé™åº¦ã®å®‰å…¨æ€§ã§ã™ pepPrivacyStatus.RatingUnencryptedSuggestion=ã‚ãªãŸã®é€šä¿¡ç›¸æ‰‹ã«ã€GnuPG ã®ã‚ˆã†ãªæš—å·ã‚½ãƒªãƒ¥ãƒ¼ã‚·ãƒ§ãƒ³ã‚ã‚‹ã„㯠p≡p ã®åˆ©ç”¨ã‚’ä¾é ¼ã—ã¦ãã ã•ã„ pepPrivacyStatus.RatingUnreliableSuggestion=ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ã¯ä¿¡é ¼ã§ãる方法ã§ã®æš—å·åŒ–ã‚ã‚‹ã„ã¯ç½²åãŒè¡Œã‚れã¦ã„ã¾ã›ã‚“。ã‚ãªãŸã®é€šä¿¡ç›¸æ‰‹ã«ã€GnuPG ã®ã‚ˆã†ãªæš—å·ã‚½ãƒªãƒ¥ãƒ¼ã‚·ãƒ§ãƒ³ã‚ã‚‹ã„㯠p≡p ã®åˆ©ç”¨ã‚’ä¾é ¼ã—ã¦ãã ã•ã„ pepPrivacyStatus.RatingBrokenExplanation=ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯å£Šã‚ŒãŸæš—å·åŒ–ã‚ã‚‹ã„ã¯ãƒ•ォーマットã§ã™ pepPrivacyStatus.RatingHaveNoKeyExplanation=éµãŒåˆ©ç”¨å¯èƒ½ã§ãªã„ãŸã‚ã€ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’復å·ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ pepPrivacyStatus.RatingMistrustExplanation=ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®é€šä¿¡ç›¸æ‰‹ã¯ã€ä»¥å‰ã«ã€Œèª¤ã£ã¦ä¿¡ç”¨ã•れãŸã€ã¨ãƒžãƒ¼ã‚¯ã•れã¦ã„ã¾ã™ pepPrivacyStatus.RatingReliableExplanation=ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯å®‰å…¨ã§ã™ãŒã€é€šä¿¡ç›¸æ‰‹ã®èº«å…ƒã‚’確èªã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ pepPrivacyStatus.RatingTrustedExplanation=ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯å®‰å…¨ã‹ã¤ä¿¡é ¼ã•れã¦ã„ã¾ã™ pepPrivacyStatus.RatingUndefinedExplanation=ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒå®‰å…¨ã‹å¦ã‹åˆ¤æ–­ã™ã‚‹æƒ…å ±ãŒä¸è¶³ã—ã¦ã„ã¾ã™ pepPrivacyStatus.RatingUnderAttackExplanation=ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯å®‰å…¨ã§ã¯ã‚りã¾ã›ã‚“。改竄ã•れã¦ã„ã¾ã™ pepPrivacyStatus.RatingUnencryptedExplanation=ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯å®‰å…¨ã§ã¯ã‚りã¾ã›ã‚“ pepPrivacyStatus.RatingUnencryptedForSomeExplanation=ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ä½•人ã‹ã®é€šä¿¡ç›¸æ‰‹ã«ã¤ã„ã¦ã¯å®‰å…¨ã§ã¯ã‚りã¾ã›ã‚“ pepPrivacyStatus.RatingUnreliableExplanation=ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ä¿¡é ¼ã§ããªã„ä¿è­·ãŒè¡Œã‚れã¦ã„ã¾ã™ pepPrivacyStatus.RatingBrokenText=壊れã¦ã„ã¾ã™ pepPrivacyStatus.RatingHaveNoKeyText=復å·ã§ãã¾ã›ã‚“ pepPrivacyStatus.RatingMistrustText=誤ã£ã¦ä¿¡ç”¨ã•れã¦ã„ã¾ã™ pepPrivacyStatus.RatingReliableText=安全ã§ã™ pepPrivacyStatus.RatingTrustedText=安全ã‹ã¤ä¿¡é ¼ã•れã¦ã„ã¾ã™ pepPrivacyStatus.RatingUndefinedText=䏿˜Ž pepPrivacyStatus.RatingUnderAttackText=改竄ã•れã¦ã„ã¾ã™ pepPrivacyStatus.RatingUnencryptedForSomeText=何人ã‹ã®é€šä¿¡ç›¸æ‰‹ã«ã¤ã„ã¦ã¯å®‰å…¨ã§ã¯ã‚りã¾ã›ã‚“ pepPrivacyStatus.RatingUnencryptedText=安全ã§ã¯ã‚りã¾ã›ã‚“ pepPrivacyStatus.RatingUnreliableText=ä¿¡é ¼ã§ããªã„ä¿è­· handshakeDlg.button.initHandshake=ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯... handshakeDlg.button.stopTrust=信用を中止 handshakeDlg.button.reTrust=誤ã£ãŸä¿¡ç”¨ã‚’中止 handshakeDlg.label.outgoingMessage=é€ä¿¡ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ handshakeDlg.label.incomingMessage=å—信メッセージ handshakeDlg.error.noPeers=通信相手ã®ã„ãšã‚Œã¨ã‚‚ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚’行ãˆã¾ã›ã‚“ handshakeDlg.error.noProtection=ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯æ©Ÿèƒ½ã‚’有効化ã™ã‚‹ãŸã‚ã€ä¿è­·ã‚’有効ã«ã—ã¦ãã ã•ã„ enigmail.acSetupPasswd.descEnterPasswd=ä»–ã®ãƒ‡ãƒã‚¤ã‚¹ä¸Šã§è¡¨ç¤ºã•れã¦ã„るセットアップコードを入力ã—ã¦ãã ã•ã„ enigmail.acSetupPasswd.descCopyPasswd=ä»–ã®ãƒ‡ãƒã‚¤ã‚¹ä¸Šã§ã‚»ãƒƒãƒˆã‚¢ãƒƒãƒ—を進ã‚ã‚‹ãŸã‚ã®ã‚»ãƒƒãƒˆã‚¢ãƒƒãƒ—コードを入力ã—ã¦ãã ã•ã„ #strings in autocrypt.jsm autocrypt.setupMsg.subject=Autocrypt セットアップメッセージ autocrypt.setupMsg.msgBody=æ–°ã—ã„デãƒã‚¤ã‚¹ã« Autocrypt をセットアップã™ã‚‹ã«ã¯ã€ãƒ‡ãƒã‚¤ã‚¹ä¸Šã®æŒ‡ç¤ºã«å¾“ã£ã¦ãã ã•ã„ autocrypt.setupMsg.fileTxt=ã“ã®ãƒ•ァイルã¯ã€ãƒ‡ãƒã‚¤ã‚¹é–“ã§ Autocrypt ã®è¨­å®šã‚„éµã‚’移行ã™ã‚‹ãŸã‚ã®ã‚‚ã®ã§ã™ã€‚å…ƒã®ãƒ‡ãƒã‚¤ã‚¹ã«è¡¨ç¤ºã•れã¦ã„るセットアップコードを入力ã™ã‚‹ã“ã¨ã§ã“ã®ãƒ•ァイルを復å·ã—ã€éµã‚’インãƒãƒ¼ãƒˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ #strings in upgradeInfo.html upgradeInfo.doctitle=Enigmail ãƒãƒ¼ã‚¸ãƒ§ãƒ³ 2.0 ã§ã®å¤‰æ›´ç‚¹ upgradeInfo.welcome1=Enigmail ãƒãƒ¼ã‚¸ãƒ§ãƒ³ 2.0 ã¸ã‚ˆã†ã“ãï¼ upgradeInfo.welcome2=ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ã€å¤šãã®æ–°æ©Ÿèƒ½ã®å®Ÿè£…ãŠã‚ˆã³æ©Ÿèƒ½ã®å¤‰æ›´ãŒè¡Œã‚れã¦ã„ã¾ã™ã€‚ãれらを紹介ã—ã¾ã™: upgradeInfo.encSubject.title=メッセージã®ä»¶åã®ä¿è­· upgradeInfo.encSubject.desc=ã“れã¾ã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ä»¶åã¯æš—å·åŒ–ã®å¯¾è±¡ã¨ãªã£ã¦ã„ã¾ã›ã‚“ã§ã—ãŸãŒã€æ–°ãŸã«ä»¶åã‚’æš—å·åŒ–ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ä¸­ã«è¨˜éŒ²ã—ã€é€šå¸¸ã®ä»¶åã«ã¯ "Encrypted Mesage" ã¨è¡¨ç¤ºã™ã‚‹æ©Ÿèƒ½ã‚’実装ã—ã¾ã—ãŸã€‚ã“ã®ã‚ˆã†ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’復å·ã™ã‚‹ã¨ã€æœ¬æ¥ã®ä»¶åãŒè‡ªå‹•çš„ã«å¾©å…ƒã•れã¾ã™ã€‚メッセージã®ä»¶åã®ä¿è­·ã¯æ—¢å®šã§æœ‰åйã¨ãªã£ã¦ã„ã¾ã™ãŒã€è¨­å®šã‹ã‚‰ç„¡åŠ¹åŒ–ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚(注æ„: ã“ã®æ©Ÿèƒ½ã¯ PGP/MIME メッセージã®ã¿ã§æœ‰åйã§ã™) upgradeInfo.buttons.title=æš—å·åŒ–ãŠã‚ˆã³ç½²åãƒœã‚¿ãƒ³ã®æ”¹è‰¯ upgradeInfo.buttons.desc=メッセージ編集ウインドウ上㮠暗å·åŒ– ãŠã‚ˆã³ ç½²å ボタンã¯ã€OpenPGP プロトコルã ã‘ã§ãªã S/MIME プロトコルã«å¯¾ã—ã¦ã‚‚有効ã¨ãªã‚Šã¾ã™ã€‚両方ã®ãƒ—ロトコルãŒåˆ©ç”¨å¯èƒ½ãªå ´åˆã€Enigmail ã¯ã™ã¹ã¦ã®éµãŒåˆ©ç”¨å¯èƒ½ãªãƒ—ãƒ­ãƒˆã‚³ãƒ«ã‚’é¸æŠžã—ã¾ã™ã€‚ upgradeInfo.autocrypt.title=Autocrypt ã®ã‚µãƒãƒ¼ãƒˆ upgradeInfo.autocrypt.desc=Enigmail ã¯æ–°ãŸãªéµé…布標準ã§ã‚ã‚‹ Autocrypt をサãƒãƒ¼ãƒˆã—ã¾ã™ã€‚Enigmail 㯠Autocrypt ã«é©åˆã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‹ã‚‰è‡ªå‹•çš„ã«éµã‚’インãƒãƒ¼ãƒˆã™ã‚‹ã“ã¨ã§ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®æš—å·åŒ–を推進ã—ã¾ã™ã€‚ upgradeInfo.pEp.title=p≡p (Pretty Easy Privacy) ã®ã‚µãƒãƒ¼ãƒˆ upgradeInfo.pEp.desc=Enigmail 㯠p≡p Junior Mode をサãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ç¾æ™‚点ã§ã¯ p≡p を手作業ã§ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ãŒã€å°†æ¥çš„ã«æ”¹å–„ã•れる見込ã¿ã§ã™ã€‚p≡p Junior Mode ã§ã¯ã€OpenPGP ã«ã‚ˆã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®æš—å·åŒ–ã‚’é€éŽçš„ã«æä¾›ã—ã¾ã™ã€‚ã¤ã¾ã‚Šã€éµã®ç®¡ç†ã‚„デãƒã‚¤ã‚¹é–“ã§ã®éµã®åŒæœŸã‚’æ°—ã«ã™ã‚‹å¿…è¦ãŒãªããªã‚Šã¾ã™ã€‚ upgradeInfo.bottom.desc=Enigmail 利用ã«é–¢ã™ã‚‹è©³ç´°ãªãƒ˜ãƒ«ãƒ—ã¯ã€ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆ ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 pep.missingGnuPG=Enigmail/p≡p を利用ã™ã‚‹ãŸã‚ã«ã¯ GnuPG ãŒå¿…è¦ã§ã™ãŒã€ã‚ãªãŸã®ç’°å¢ƒã« GnuPG ãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã“ã¨ã‚’確èªã§ãã¾ã›ã‚“ã§ã—ãŸã€‚GnuPG をダウンロード・インストールã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ #strings in enigmailAbout.html aboutEnigmail.tabName=Enigmail ã«ã¤ã„㦠aboutEnigmail.title=OpenPGP ã®ã‚µãƒãƒ¼ãƒˆã¯ Enigmail ã«ã‚ˆã£ã¦æä¾›ã•れã¦ã„ã¾ã™ aboutEnigmail.team=Enigmail ã¯ã€Enigmail ãƒãƒ¼ãƒ ã«ã‚ˆã£ã¦é–‹ç™ºã•れã¦ã„ã¾ã™: aboutEnigmail.projectLeader=主è¦é–‹ç™ºè€…: aboutEnigmail.usability=ユーザビリティ: aboutEnigmail.documentation=ドキュメント: aboutEnigmail.testing=テスト: aboutEnigmail.userSupport=ユーザーサãƒãƒ¼ãƒˆ: aboutEnigmail.localization=ローカライズ: Enigmail Language Packs page ã‚’å‚ç…§ aboutEnigmail.Credits=クレジット: aboutEnigmail.origAuthor=Enigmail æ‹¡å¼µæ©Ÿèƒ½ã®æœ€åˆã®ä½œæˆè€… aboutEnigmail.icons=アイコン: aboutEnigmail.formerMembers=ã‹ã¤ã¦ã®ãƒãƒ¼ãƒ ãƒ¡ãƒ³ãƒãƒ¼: aboutEnigmail.projectHosting=プロジェクトã®ãƒ›ã‚¹ãƒ†ã‚£ãƒ³ã‚°: aboutEnigmail.licenseSupportTitle=ライセンスãŠã‚ˆã³ã‚µãƒãƒ¼ãƒˆ aboutEnigmail.license=Enigmail ã¯ã‚ªãƒ¼ãƒ—ンソースã§ã‚りã€%S ã§ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã•れã¦ã„ã¾ã™ aboutEnigmail.support=Enigmail ã®ã‚µãƒãƒ¼ãƒˆãŠã‚ˆã³ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã¯ www.enigmail.net ã‹ã‚‰åˆ©ç”¨å¯èƒ½ã§ã™ enigmail-2.0.8/lang/ja/help/000077500000000000000000000000001334302754500155575ustar00rootroot00000000000000enigmail-2.0.8/lang/ja/help/compose.html000066400000000000000000000135061334302754500201170ustar00rootroot00000000000000 Enigmail ヘルプ: メッセージã®ä½œæˆ

Enigmail ヘルプ

メッセージを作æˆã™ã‚‹ã¨ãã® Enigmail ã®ä½¿ç”¨æ–¹æ³•

メッセージ作æˆç”»é¢ã§ã® Enigmail メニュー
ç½²å
  • 有効 (自動): ç½²åã«é–¢ã™ã‚‹è¨­å®š (アカウントã”ã¨ã®è¨­å®šã€å—å–人ã”ã¨ã®è¨­å®šã€é€ä¿¡æ™‚ã®è¨­å®šãªã©) ã«å¾“ã£ã¦ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ç½²åã™ã‚‹ã‚ˆã†è‡ªå‹•çš„ã«æŒ‡å®šã•れã¦ã„ã¾ã™ã€‚
  • 無効 (自動): ç½²åã«é–¢ã™ã‚‹è¨­å®š (アカウントã”ã¨ã®è¨­å®šã€å—å–人ã”ã¨ã®è¨­å®šã€é€ä¿¡æ™‚ã®è¨­å®šãªã©) ã«å¾“ã£ã¦ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ç½²åã—ãªã„よã†è‡ªå‹•çš„ã«æŒ‡å®šã•れã¦ã„ã¾ã™ã€‚
  • 有効: メッセージã«ç½²åã™ã‚‹ã‚ˆã†è¨­å®šã‚’上書ãã—ã¦ã„ã¾ã™ã€‚
  • 無効: メッセージã«ç½²åã—ãªã„よã†è¨­å®šã‚’上書ãã—ã¦ã„ã¾ã™ã€‚
æš—å·åŒ–
  • 有効 (自動): æš—å·åŒ–ã«é–¢ã™ã‚‹è¨­å®š (アカウントã”ã¨ã®è¨­å®šã€å—å–人ã”ã¨ã®è¨­å®šã€é€ä¿¡æ™‚ã®è¨­å®šãªã©) ã«å¾“ã£ã¦ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æš—å·åŒ–ã™ã‚‹ã‚ˆã†è‡ªå‹•çš„ã«æŒ‡å®šã•れã¦ã„ã¾ã™ã€‚
  • 無効 (自動): æš—å·åŒ–ã«é–¢ã™ã‚‹è¨­å®š (アカウントã”ã¨ã®è¨­å®šã€å—å–人ã”ã¨ã®è¨­å®šã€é€ä¿¡æ™‚ã®è¨­å®šãªã©) ã«å¾“ã£ã¦ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æš—å·åŒ–ã—ãªã„よã†è‡ªå‹•çš„ã«æŒ‡å®šã•れã¦ã„ã¾ã™ã€‚
  • 有効: メッセージを暗å·åŒ–ã™ã‚‹ã‚ˆã†è¨­å®šã‚’上書ãã—ã¦ã„ã¾ã™ã€‚
  • 無効: メッセージを暗å·åŒ–ã—ãªã„よã†è¨­å®šã‚’上書ãã—ã¦ã„ã¾ã™ã€‚
PGP/MIME
  • PGP/MIME (自動): PGP/MIME ã«é–¢ã™ã‚‹è¨­å®š (アカウントã”ã¨ã®è¨­å®šã€å—å–人ã”ã¨ã®è¨­å®šã€é€ä¿¡æ™‚ã®è¨­å®šãªã©) ã«å¾“ã£ã¦ã€PGP/MIME ã§é€ä¿¡ã™ã‚‹ã‚ˆã†è‡ªå‹•çš„ã«æŒ‡å®šã•れã¦ã„ã¾ã™ã€‚
  • インライン PGP (自動): PGP/MIME ã«é–¢ã™ã‚‹è¨­å®š (アカウントã”ã¨ã®è¨­å®šã€å—å–人ã”ã¨ã®è¨­å®šã€é€ä¿¡æ™‚ã®è¨­å®šãªã©) ã«å¾“ã£ã¦ã€ã‚¤ãƒ³ãƒ©ã‚¤ãƒ³ PGP ã§é€ä¿¡ã™ã‚‹ã‚ˆã†è‡ªå‹•çš„ã«æŒ‡å®šã•れã¦ã„ã¾ã™ã€‚
  • PGP/MIME: PGP/MIME ã§é€ä¿¡ã™ã‚‹ã‚ˆã†è¨­å®šã‚’上書ãã—ã¦ã„ã¾ã™ã€‚
  • インライン PGP: インライン PGP ã§é€ä¿¡ã™ã‚‹ã‚ˆã†è¨­å®šã‚’上書ãã—ã¦ã„ã¾ã™ã€‚
ã™ã¹ã¦ã®å—å–人ã®éµã‚’ä¿¡é ¼ã™ã‚‹
å®›å…ˆã«æŒ‡å®šã•れãŸå—å–人ã®éµã‚’ã™ã¹ã¦ä¿¡é ¼ã—ã¾ã™ã€‚
æ¨™æº–è¨­å®šã«æˆ»ã™
ã‚‚ã—ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®é€ä¿¡ã«å¤±æ•—ã—ãŸæ™‚ã€ãŸã¨ãˆã° POP サーãƒãƒ¼ãŒè¦æ±‚ã‚’æ‹’å¦ã—ãŸæ™‚ãªã©ã€Enigmail ã¯ãã®ã“ã¨ãŒåˆ†ã‹ã‚‰ãªã„ã®ã§ã€æš—å·åŒ–ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’メッセージ作æˆã‚¦ã‚¤ãƒ³ãƒ‰ã‚¦ã«ãã®ã¾ã¾è¡¨ç¤ºã—ç¶šã‘ã¾ã™ã€‚ã“ã®ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‚’é¸ã¶ã“ã¨ã«ã‚ˆã‚Šæš—å·åŒ–・署åã®è¨­å®šã‚’å…ƒã«æˆ»ã—ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ä½œæˆã‚¦ã‚¤ãƒ³ãƒ‰ã‚¦ã«å…ƒã®æ–‡æ›¸ã‚’表示ã—ã¾ã™ã€‚
暫定回é¿ç­–ã¨ã—ã¦ã€ã“ã®ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã¯æš—å·åŒ–ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«å¯¾ã—ã¦è¿”ä¿¡ã™ã‚‹æ™‚ã«ã€å¼·åˆ¶çš„ã«å¾©å·ã™ã‚‹ã“ã¨ã«ã‚‚使用ã§ãã¾ã™ã€‚
自分ã®å…¬é–‹éµã®æ·»ä»˜
ASCII å½¢å¼ã®è‡ªåˆ†ã®å…¬é–‹éµã‚’添付ã—ã¾ã™ã€‚ã“ã®æ–¹æ³•ã«ã‚ˆã£ã¦æŒ¿å…¥ã•れãŸå…¬é–‹éµã¯ã€å—ã‘å–りå´ã® Enigmail ã«ã‚ˆã£ã¦è‡ªå‹•çš„ã«èªè­˜ã•れã¾ã™ã€‚公開éµã‚’添付ã—ãŸå¾Œã§ã‚‚ã€å¿…è¦ã«å¿œã˜ã¦ãã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ç½²åãŠã‚ˆã³æš—å·åŒ–ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
公開éµã®æ·»ä»˜
ASCII å½¢å¼ã®å…¬é–‹éµã‚’添付ã—ã¾ã™ã€‚挿入ã™ã‚‹å…¬é–‹éµã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’é¸æŠžã™ã‚‹ãƒãƒƒãƒ—アップ画é¢ãŒã§ã¾ã™ã€‚ã“ã®æ–¹æ³•ã«ã‚ˆã£ã¦æŒ¿å…¥ã•れãŸå…¬é–‹éµã¯ã€å—ã‘å–りå´ã® Enigmail ã«ã‚ˆã£ã¦è‡ªå‹•çš„ã«èªè­˜ã•れã¾ã™ã€‚公開éµã‚’添付ã—ãŸå¾Œã§ã‚‚ã€å¿…è¦ã«å¿œã˜ã¦ãã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ç½²åãŠã‚ˆã³æš—å·åŒ–ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
パスフレーズã®ã‚¯ãƒªã‚¢
キャッシュã•れã¦ã„るパスフレーズをクリアã—ã¾ã™ã€‚複数ã®ãƒ‘スフレーズを使用ã—ã¦ã„ã‚‹ã¨ãã«ä¾¿åˆ©ã§ã™ã€‚
設定
  • アカウントã”ã¨ã®è¨­å®š...: アカウント設定 -> OpenPGP 設定 ã¸ã®ã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆã§ã™ã€‚
  • é€ä¿¡æ™‚ã®è¨­å®š...: Enigmail 設定 -> é€ä¿¡ ã¸ã®ã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆã§ã™ã€‚
  • éµã®é¸æŠžã®è¨­å®š...: Enigmail 設定 -> éµã®é¸æŠž ã¸ã®ã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆã§ã™ã€‚

æ›´ãªã‚‹ãƒ˜ãƒ«ãƒ—ã¯ä»¥ä¸‹ã®ã‚µã‚¤ãƒˆã§åˆ©ç”¨ã§ãã¾ã™ (英語): Enigmail Help web page

enigmail-2.0.8/lang/ja/help/editRcptRule.html000066400000000000000000000127361334302754500210640ustar00rootroot00000000000000 Enigmail ヘルプ: å—å–人ã”ã¨ã®è¨­å®šã®ç·¨é›†

Enigmail ヘルプ

å—å–人ã”ã¨ã®è¨­å®šã®ç·¨é›†

å—å–人ã”ã¨ã®è¨­å®šã®ç·¨é›†ã§ã€å—å–人ã”ã¨ã«ç½²åã€æš—å·åŒ–ã€PGP/MIME ã®å¯å¦ãŠã‚ˆã³ä½¿ç”¨ã™ã‚‹ OpenPGP éµã‚’指定ã§ãã¾ã™ã€‚ã“ã®ãƒ€ã‚¤ã‚¢ãƒ­ã‚°ã§ 1 人ã®å—å–人ã€ãŠã‚ˆã³åŒæ§˜ãªæ–¹æ³•ã§ã‚°ãƒ«ãƒ¼ãƒ—ã«å¯¾ã—ã¦è¨­å®šã§ãã¾ã™ã€‚

メールアドレス
å—å–人ã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ãŒè¡¨ç¤ºã•れã¾ã™ (åå‰ã¯è¡¨ç¤ºã•れãšã‚¢ãƒ‰ãƒ¬ã‚¹ã ã‘ã§ã™ 例: somebody@email.domain)。åŠè§’スペースã§åŒºåˆ‡ã£ã¦è¤‡æ•°ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’入力ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ã“ã“ã§æŒ‡å®šã™ã‚‹ã‚¢ãƒ‰ãƒ¬ã‚¹ã¯ã€ãƒ‰ãƒ¡ã‚¤ãƒ³ã‚»ã‚¯ã‚·ãƒ§ãƒ³ (@ ã®å³å´) ã ã‘を指定ã§ãã¾ã™ã€‚ãã†ã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€åŒã˜ãƒ‰ãƒ¡ã‚¤ãƒ³ã® (@ マークã®å³å´ãŒåŒã˜) ã©ã‚“ãªã‚¢ãƒ‰ãƒ¬ã‚¹ã«ã‚‚ルールをé©ç”¨ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚例ãˆã° @email.domain ã¨å…¥åŠ›ã—ãŸå ´åˆã€body@email.domain, somebody@email.domain, anybody@email.domain ãªã©ã«ã‚‚ルールãŒé©ç”¨ã•れã¾ã™ã€‚
å—å–人ãŒä¸Šè¨˜ã‚¢ãƒ‰ãƒ¬ã‚¹ ... ã¨ãã€ãƒ«ãƒ¼ãƒ«ã‚’é©ç”¨
é›»å­ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã®é©ç”¨æ–¹æ³•を指定ã—ã¾ã™ã€‚ã‚‚ã—ã€è¤‡æ•°ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ãŒå…¥åŠ›ã•れã¦ã„ã‚‹å ´åˆã€ã“ã®è¨­å®šã¯å…¨å“¡ã«å¯¾ã—ã¦é©ç”¨ã•れã¾ã™ã€‚以下㯠body@email.domain ㌠メールアドレス 欄ã«å…¥åŠ›ã•れãŸå ´åˆã®ä¾‹ã§ã™ã€‚
  • ã¨åŒä¸€ã®: 指定ã—ãŸãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã¨åŒä¸€ã®å ´åˆã®ã¿ãƒžãƒƒãƒã—ã¾ã™ã€‚body@email.domain (å¤§æ–‡å­—å°æ–‡å­—ã®é•ã„ã¯ç„¡è¦–ã•れã¾ã™)
  • ã‚’å«ã‚€: 指定ã—ãŸæ–‡å­—列をå«ã‚€ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ãŒãƒžãƒƒãƒã—ã¾ã™ã€‚例: anybody@email.domain, body@email.domain.net
  • ã‹ã‚‰å§‹ã¾ã‚‹: 指定ã—ãŸæ–‡å­—列ã‹ã‚‰å§‹ã¾ã‚‹ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ãŒãƒžãƒƒãƒã—ã¾ã™ã€‚例: body@email.domain.net, body@email.domain-name.com
  • ã§çµ‚ã‚ã‚‹: 指定ã—ãŸæ–‡å­—列ã§çµ‚ã‚るメールアドレスãŒãƒžãƒƒãƒã—ã¾ã™ã€‚例: anybody@email.domain, somebody@email.domain.
当ã¦ã¯ã¾ã‚‹ã‚¢ãƒ‰ãƒ¬ã‚¹ã«ã¤ã„ã¦ã¯ã€æ¬¡ã®ãƒ«ãƒ¼ãƒ«ã‚’ç¶šã„ã¦é©ç”¨
ã“れã«ãƒã‚§ãƒƒã‚¯ã‚’ã™ã‚‹ã¨ã€ä»¥ä¸‹ã® OpenPGP éµã‚’使用ã™ã‚‹ ã®æ¬„ã§éµ ID ã®æŒ‡å®šã‚’ã™ã‚‹å¿…è¦ãŒãªããªã‚Šã¾ã™ã€‚メールアドレスã¯ã€é€ä¿¡æ™‚ã«ãƒã‚§ãƒƒã‚¯ã•れã€ãã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã«ã¤ã„ã¦ã®ãƒ«ãƒ¼ãƒ«ãŒç¶šã„ã¦é©ç”¨ã•れã¾ã™ã€‚
当ã¦ã¯ã¾ã‚‹ã‚¢ãƒ‰ãƒ¬ã‚¹ã«ã¤ã„ã¦ã¯ã€ã“れ以上ã®ãƒ«ãƒ¼ãƒ«ã‚’é©ç”¨ã—ãªã„
ã“れã«ãƒã‚§ãƒƒã‚¯ã‚’ã™ã‚‹ã¨ã€ã“ã®ãƒ«ãƒ¼ãƒ«ã«ãƒžãƒƒãƒã—ãŸã‚¢ãƒ‰ãƒ¬ã‚¹ã«ã¤ã„ã¦ã¯ä»–ã®ãƒ«ãƒ¼ãƒ«ã‚’é©ç”¨ã—ãªããªã‚Šã¾ã™ã€‚ルール処ç†ã¯æ¬¡ã®å—å–人ã‹ã‚‰è¡Œã‚れるã“ã¨ã«ãªã‚Šã¾ã™ã€‚
以下㮠OpenPGP éµã‚’使用ã™ã‚‹:
éµã®é¸æŠž(s)... ボタンをクリックã—ã€æš—å·åŒ–ã«ä½¿ç”¨ã™ã‚‹å—å–人ã®éµã‚’é¸æŠžã—ã¦ãã ã•ã„。既ã«è¿°ã¹ãŸã‚ˆã†ã«ã€ãƒžãƒƒãƒã™ã‚‹ã‚¢ãƒ‰ãƒ¬ã‚¹ã«å¯¾ã—ã¦ã“れ以上ã®ãƒ«ãƒ¼ãƒ«å‡¦ç†ã¯ã•れã¾ã›ã‚“。
ç½²åã®æ—¢å®šã®è¨­å®š
ç½²åã™ã‚‹/ã—ãªã„を決定ã—ã¾ã™ã€‚ã“れã¯ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ä½œæˆç”»é¢ã®ã®å€‹åˆ¥ã®è¨­å®šã«ã‚ˆã£ã¦ä¸Šæ›¸ãã•れã¾ã™ã€‚
  • 無効: メッセージã«ç½²åã—ã¾ã›ã‚“。
  • 返信時ã®ã¿æœ‰åй: ç½²åã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«è¿”ä¿¡ã™ã‚‹ã¨ãã®ã¿ç½²åã—ã¾ã™ã€‚
  • 有効: メッセージã«ç½²åã—ã¾ã™ã€‚
ã“ã®ç½²åã«é–¢ã™ã‚‹è¨­å®šã¯ãƒžãƒƒãƒã™ã‚‹ã™ã¹ã¦ã®ãƒ«ãƒ¼ãƒ«ã«å¯¾ã—ã¦é©ç”¨ã•れã¾ã™ã€‚ã‚‚ã—ç½²åã‚’ã—ãªã„ルール㌠1 ã¤ã§ã‚‚ã‚れã°ã€ä»–ã®ç½²åã‚’ã™ã‚‹ãƒ«ãƒ¼ãƒ«ãŒãƒžãƒƒãƒã—ã¦ã‚‚ã€ç½²åã¯ã•れã¾ã›ã‚“。
æš—å·åŒ–ã®æ—¢å®šã®è¨­å®š
æš—å·åŒ–ã™ã‚‹/ã—ãªã„を決定ã—ã¾ã™ã€‚設定å¯èƒ½ãªé …ç›®ã¨æ„味ã¯ã€ç½²åã¨åŒä¸€ã§ã™ã€‚
PGP/MIME ã®æ—¢å®šã®è¨­å®š
PGP/MIME (RFC 3156) を用ã„ã¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’エンコードã™ã‚‹ã‹ã©ã†ã‹ã‚’決定ã—ã¾ã™ã€‚PGP/MIME ãŒç„¡åйã®å ´åˆã€ã‚¤ãƒ³ãƒ©ã‚¤ãƒ³ PGP ãŒä½¿ã‚れã¾ã™ã€‚設定å¯èƒ½ãªé …ç›®ã¨æ„味ã¯ã€ç½²åã¨åŒä¸€ã§ã™ã€‚

ã“れらã®ãƒ«ãƒ¼ãƒ«ã¯ å—å–人ã”ã¨ã®è¨­å®š ã«è¡¨ç¤ºã•れã¦ã„ã‚‹é †ã«å‡¦ç†ã•れã¾ã™ã€‚ルールã«å—å–人ãŒãƒžãƒƒãƒã—ã€OpenPGP éµã® ID ã‚’å«ã¿ã€åŠ ãˆã¦è¨­å®šã•れãŸéµ ID を使用ã—ã¦ã„ã‚‹å ´åˆã«ã¯ã€ãã®å—å–人ã«é–¢ã—ã¦ã¯ãれ以上ã®ãƒ«ãƒ¼ãƒ«ã¯è€ƒæ…®ã•れã¾ã›ã‚“。


æ›´ãªã‚‹ãƒ˜ãƒ«ãƒ—ã¯ä»¥ä¸‹ã®ã‚µã‚¤ãƒˆã§åˆ©ç”¨ã§ãã¾ã™ (英語): Enigmail Per-Recipient Settings page

enigmail-2.0.8/lang/ja/help/help.html000066400000000000000000000121731334302754500174010ustar00rootroot00000000000000 Enigmail ヘルプ

Enigmail ヘルプ

メッセージを読む時㮠Enigmail ã®ä½¿ç”¨æ–¹æ³•

  • メインウインドウã®å¾©å·ãƒœã‚¿ãƒ³
    ã“ã®ãƒœã‚¿ãƒ³ã‚’ã¯ã„ãã¤ã‹ã®ç”¨é€”ã§ä½¿ã‚れã¾ã™ã€‚: æš—å·åŒ–ã€æ¤œè¨¼ã€ã¾ãŸã¯å…¬é–‹éµã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆãªã©ã§ã™ã€‚é€šå¸¸ã€æš—å·åŒ–/検証ã¯è‡ªå‹•çš„ã«è¡Œã‚れã¾ã™ã€‚設定ã«ã‚ˆã£ã¦ç„¡åйã«ã™ã‚‹ã“ã¨ã‚‚å¯èƒ½ã§ã™ã€‚ã—ã‹ã—ã€å¤±æ•—ã—ãŸæ™‚ã«ã¯ã€çŸ­ã„エラーメッセージ㌠Enigmail ã«è¡¨ç¤ºã•れるã ã‘ã§ã™ã€‚ã“ã®ãƒœã‚¿ãƒ³ã‚’クリックã™ã‚‹ã“ã¨ã§ã€GnuPG コマンドã®å‡ºåŠ›çµæžœã‚’å«ã‚ã¦è©³ç´°ãªã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ã¾ã™ã€‚
  • メッセージヘッダーã®ãƒšãƒ³ã¨éµã®ã‚¢ã‚¤ã‚³ãƒ³
    メッセージヘッダーã«è¡¨ç¤ºã•れã¦ã„ã‚‹ ペン ã¨ éµ ã®ã‚¢ã‚¤ã‚³ãƒ³ã¯ã€ã‚ãªãŸãŒèª­ã‚“ã§ã„るメッセージã®ç½²åãŒæ­£ã—ã„ã‹ã€æš—å·åŒ–ã•れã¦ã„ã‚‹ã‹ã‚’示ã—ã¦ã„ã¾ã™ã€‚ã‚‚ã—ãã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒç½²åã•れãŸå¾Œã«æ”¹ã–ã‚“ã•れã¦ã„ã‚‹å ´åˆã€ãƒšãƒ³ã®ã‚¢ã‚¤ã‚³ãƒ³ã¯Ã—å°ã¤ãã®ãƒšãƒ³ã®ã‚¢ã‚¤ã‚³ãƒ³ã¨ã—ã¦è¡¨ç¤ºã•れå•題を示ã—ã¾ã™ã€‚ペンやéµã®ã‚¢ã‚¤ã‚³ãƒ³ã‚’å³ã‚¯ãƒªãƒƒã‚¯ã™ã‚‹ã“ã¨ã§ã€ä»¥ä¸‹ã®ãƒ¡ãƒ‹ãƒ¥ãƒ¼ãŒè¡¨ç¤ºã•れã¾ã™ã€‚
    • Enigmail セキュリティー情報: GnuPG ãŒãã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«å¯¾ã—ã¦å‡ºåŠ›ã—ãŸçµæžœã‚’表示ã—ã¾ã™ã€‚
    • Enigmail セキュリティー情報をコピー: GnuPG ã®å‡ºåŠ›ã‚’ã‚¯ãƒªãƒƒãƒ—ãƒœãƒ¼ãƒ‰ã«ã‚³ãƒ”ーã—ã¾ã™ã€‚返信ã«è²¼ã‚‹ãªã©ã«åˆ©ç”¨ã§ãã¾ã™ã€‚
    • OpenPGP フォト ID を表示: 公開éµã«å†™çœŸãŒåŸ‹ã‚è¾¼ã¾ã‚Œã¦ã„れã°ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®é€ä¿¡è€…㮠フォト ID を表示ã—ã¾ã™ã€‚(ã“ã®ã‚ªãƒ—ションã¯å†™çœŸãŒå…¬é–‹éµã«åŸ‹ã‚è¾¼ã¾ã‚Œã¦ã„ã‚‹å ´åˆã«æœ‰åйã§ã™ã€‚)
    • S/MIME セキュリティー情報: ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã® S/MIME セキュリティー情報を表示ã—ã¾ã™ã€‚

    ã‚‚ã—ã‚ãªãŸãŒ keyserver-options auto-key-retrieve ã‚’ gpg.conf ã«è¨­å®šã—ã¦ã„ãªã„状態ã§ç½²åã‹æš—å·åŒ–ã•れã¦ã„るメッセージを読むã¨ã€ãƒšãƒ³ã®ã‚¢ã‚¤ã‚³ãƒ³ãŒï¼Ÿã¨å…±ã«è¡¨ç¤ºã•れã€ãƒ˜ãƒƒãƒ€ãƒ¼ã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ãƒ©ã‚¤ãƒ³ã« メッセージã®ä¸€éƒ¨åˆ†ãŒ ç½²å ã•れã¦ã„ã¾ã™; 詳ã—ãã¯ã€Œè©³ç´°ã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã¦ãã ã•ã„ ã¨è¡¨ç¤ºã•れã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãƒšã‚¤ãƒ³ã«ã¯ OpenPGP メッセージブロックã¨ç½²åブロックãŒè¡¨ç¤ºã•れã¾ã™ã€‚

    keyserver-options auto-key-retrieve ㌠gpg.conf ã«è¨­å®šã•れã¦ã„ã‚‹å ´åˆã§ã‚‚ã€OpenPGP éµãŒæ—¢å®šã®éµã‚µãƒ¼ãƒãƒ¼ã«ç„¡ã„å ´åˆã¯åŒæ§˜ã®ã‚¢ã‚¤ã‚³ãƒ³ãŒè¡¨ç¤ºã•れã¾ã™ã€‚

    ペンã¨ï¼Ÿ ã®ã‚¢ã‚¤ã‚³ãƒ³ã‚’クリックã™ã‚‹ã¨ã€è©²å½“ã™ã‚‹å…¬é–‹éµã‚’æŒã£ã¦ã„ãªã„æ—¨ãŒè¡¨ç¤ºã•れã¾ã™ã€‚OK をクリックã™ã‚‹ã¨ã€éµã‚µãƒ¼ãƒãƒ¼ã®ãƒªã‚¹ãƒˆãŒè¡¨ç¤ºã•れãŸåˆ¥ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ãŒé–‹ãメッセージã®é€ä¿¡è€…ã®å…¬é–‹éµã‚’ダウンロードã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

    ã‚ãªãŸãŒä½¿ã„ãŸã„公開éµã‚µãƒ¼ãƒãƒ¼ã®ãƒªã‚¹ãƒˆã‚’編集ã™ã‚‹ã«ã¯ã€Enigmail -> 設定 -> éµã‚µãƒ¼ãƒãƒ¼ ã‚¿ãƒ–ã‚’é¸æŠžã—ã€å…¬é–‹éµã‚µãƒ¼ãƒãƒ¼: ã®æ¬„ã«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’カンマ区切りã§å…¥åŠ›ã—ã¦ãã ã•ã„。リストã®ä¸€ç•ªä¸Šã®ã‚µãƒ¼ãƒãƒ¼ãŒæ—¢å®šã§ä½¿ç”¨ã•れã¾ã™ã€‚

  • æš—å·åŒ–ã•ã‚ŒãŸæ·»ä»˜ãƒ•ァイルを開ã / 添付ã•れ㟠OpenPGP éµã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆ
    æ‹¡å¼µå­ãŒ *.pgp, *.asc *.gpg ã®æ·»ä»˜ãƒ•ァイル㯠Enigmail ã§è‡ªå‹•çš„ã«èªè­˜ã•れã¾ã™ã€‚ ãã‚Œã‚‰ã®æ·»ä»˜ãƒ•ァイルをå³ã‚¯ãƒªãƒƒã‚¯ã™ã‚‹ã¨ã€ç‰¹åˆ¥ãªé¸æŠžè‚¢ãŒã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆãƒ¡ãƒ‹ãƒ¥ãƒ¼ã«è¡¨ç¤ºã•れã¾ã™ã€‚æš—å·åŒ–ã•ã‚ŒãŸæ·»ä»˜ãƒ•ァイルã®å ´åˆã«ã¯ã€å¾©å·ã—ã¦é–‹ã 㨠復å·ã—ã¦åå‰ã‚’ã¤ã‘ã¦ä¿å­˜ ãŒè¡¨ç¤ºã•れã€é–‹ã„ãŸã‚Šä¿å­˜ã™ã‚‹å‰ã«æ·»ä»˜ãƒ•ァイルを Enigmail ã§å¾©å·ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚添付ファイル㌠OpenPGP éµãƒ•ァイルã®å ´åˆã«ã¯ã€OpenPGP éµã‚’読ã¿è¾¼ã‚€ ãŒè¡¨ç¤ºã•れã€OpenPGP éµã‚’読ã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã™ã€‚

æ›´ãªã‚‹ãƒ˜ãƒ«ãƒ—ã¯ä»¥ä¸‹ã®ã‚µã‚¤ãƒˆã§åˆ©ç”¨ã§ãã¾ã™ (英語): Enigmail Help web page
Enigmail ã«ã¤ã„ã¦è³ªå•ã‚„æ„見ãŒã‚ã‚‹å ´åˆã«ã¯ã€Enigmail mailing list ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡ã—ã¦ãã ã•ã„。

Enigmail ã¯ã‚ªãƒ¼ãƒ—ンソースã§ã‚りã€Mozilla Public License 2.0 ã§ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã•れã¦ã„ã¾ã™ã€‚

enigmail-2.0.8/lang/ja/help/initError.html000066400000000000000000000056711334302754500204330ustar00rootroot00000000000000 Enigmail ヘルプ: Enigmail ã®åˆæœŸåŒ–ã«é–¢ã™ã‚‹å•題を解決ã™ã‚‹ã«ã¯

Enigmail ヘルプ

Enigmail ã®åˆæœŸåŒ–ã«é–¢ã™ã‚‹å•題を解決ã™ã‚‹ã«ã¯

Enigmail ã®åˆæœŸåŒ–ãŒæˆåŠŸã—ãªã„ã“ã¨ã«ã¯ã„ãã¤ã‹ã®åŽŸå› ãŒã‚りã¾ã™ã€‚よãã‚る原因ã¯ä»¥ä¸‹ã®ã‚ˆã†ãªã‚‚ã®ã§ã™ã€‚ æ›´ãªã‚‹ãƒ˜ãƒ«ãƒ—ã¯ä»¥ä¸‹ã®ã‚µã‚¤ãƒˆã§åˆ©ç”¨ã§ãã¾ã™ (英語): Enigmail Help web page

GnuPG ãŒè¦‹ã¤ã‹ã‚‰ãªã„

Enigmail を利用ã™ã‚‹ãŸã‚ã«ã¯ã€GnuPG ãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ GnuPG ãŒè¦‹ã¤ã‹ã‚‰ãªã„å ´åˆã«ã¯ã€ã¾ãšã¯ã˜ã‚ã« GnuPG ã®å®Ÿè¡Œãƒ•ァイルã§ã‚ã‚‹ gpg.exe (Windows ã®å ´åˆã€‚ä»–ã®ãƒ—ラットフォームã®å ´åˆã«ã¯ gpg) ãŒãŠä½¿ã„ã®ã‚³ãƒ³ãƒ”ューターã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。 GnuPG ãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã«ã‚‚ã‹ã‹ã‚ら㚠Enigmail ãŒãれを検出ã§ããªã„å ´åˆã«ã¯ã€GnuPG ã®å®Ÿè¡Œãƒ•ァイルã¸ã®ãƒ‘スを手動ã§è¨­å®šã—ã¦ãã ã•ã„ (Enigmail > 設定)

Enigmail コアサービス ã®åˆæœŸåŒ–ã«å¤±æ•—ã™ã‚‹

Enigmail ã¯ã€ãŠä½¿ã„ã® Thunderbird ã‚„ SeaMonkey ãŒãƒ“ルドã•れãŸç’°å¢ƒã¨åŒã˜ç’°å¢ƒã§ãƒ“ルドã•れãŸã‚‚ã®ã—ã‹å‹•作ã—ã¾ã›ã‚“。ã™ãªã‚ã¡ã€Enigmail ã®å…¬å¼ãƒªãƒªãƒ¼ã‚¹ã¯ mozilla.org ã‹ã‚‰ãƒªãƒªãƒ¼ã‚¹ã•れる Thunderbird ã‚„ SeaMonkey ã§ã—ã‹å‹•作ã—ã¾ã›ã‚“。

Linux ディストリビューションãªã©ã€mozilla.org 以外ã‹ã‚‰ãƒªãƒªãƒ¼ã‚¹ã•れる Thunderbird ã‚„ SeaMonkey ã‚’ãŠä½¿ã„ã®å ´åˆã‚„ã”自分ã§ãƒ“ルドã—㟠Thunderbird ã‚„ SeaMonkey ã‚’ãŠä½¿ã„ã®å ´åˆã«ã¯ã€åŒã˜æä¾›å…ƒã‹ã‚‰ãƒªãƒªãƒ¼ã‚¹ã•れる Enigmail を利用ã™ã‚‹ã‹ã€ã”自分ã§ãƒ“ルドã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚Enigmail ã®ãƒ“ルドã«ã¤ã„ã¦ã¯ã€Source Code section ã‚’å‚ç…§ã—ã¦ãã ã•ã„。ã“ã®ã‚ˆã†ãªãƒ“ルド環境ã®é•ã„ã«èµ·å› ã™ã‚‹å•題を Enigmail ã®ãƒã‚°ã¨ã—ã¦å ±å‘Šã—ãªã„ã§ãã ã•ã„。

æ›´ãªã‚‹ãƒ˜ãƒ«ãƒ—ã¯ä»¥ä¸‹ã®ã‚µã‚¤ãƒˆã§åˆ©ç”¨ã§ãã¾ã™ (英語): Enigmail Support Web Site.

enigmail-2.0.8/lang/ja/help/messenger.html000066400000000000000000000116761334302754500204500ustar00rootroot00000000000000 Enigmail ヘルプ: メッセージを読む

Enigmail ヘルプ

メッセージを読む時㮠Enigmail ã®ä½¿ç”¨æ–¹æ³•

メインウインドウã®å¾©å·ãƒœã‚¿ãƒ³
ã“ã®ãƒœã‚¿ãƒ³ã‚’ã¯ã„ãã¤ã‹ã®ç”¨é€”ã§ä½¿ã‚れã¾ã™ã€‚: æš—å·åŒ–ã€æ¤œè¨¼ã€ã¾ãŸã¯å…¬é–‹éµã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆãªã©ã§ã™ã€‚é€šå¸¸ã€æš—å·åŒ–/検証ã¯è‡ªå‹•çš„ã«è¡Œã‚れã¾ã™ã€‚設定ã«ã‚ˆã£ã¦ç„¡åйã«ã™ã‚‹ã“ã¨ã‚‚å¯èƒ½ã§ã™ã€‚ã—ã‹ã—ã€å¤±æ•—ã—ãŸæ™‚ã«ã¯ã€çŸ­ã„エラーメッセージ㌠Enigmail ã«è¡¨ç¤ºã•れるã ã‘ã§ã™ã€‚ã“ã®ãƒœã‚¿ãƒ³ã‚’クリックã™ã‚‹ã“ã¨ã§ã€GnuPG コマンドã®å‡ºåŠ›çµæžœã‚’å«ã‚ã¦è©³ç´°ãªã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ã¾ã™ã€‚
メッセージヘッダーã®ãƒšãƒ³ã¨éµã®ã‚¢ã‚¤ã‚³ãƒ³
メッセージヘッダーã«è¡¨ç¤ºã•れã¦ã„ã‚‹ ペン ã¨ éµ ã®ã‚¢ã‚¤ã‚³ãƒ³ã¯ã€ã‚ãªãŸãŒèª­ã‚“ã§ã„るメッセージã®ç½²åãŒæ­£ã—ã„ã‹ã€æš—å·åŒ–ã•れã¦ã„ã‚‹ã‹ã‚’示ã—ã¦ã„ã¾ã™ã€‚ã‚‚ã—ãã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒç½²åã•れãŸå¾Œã«æ”¹ã–ã‚“ã•れã¦ã„ã‚‹å ´åˆã€ãƒšãƒ³ã®ã‚¢ã‚¤ã‚³ãƒ³ã¯Ã—å°ã¤ãã®ãƒšãƒ³ã®ã‚¢ã‚¤ã‚³ãƒ³ã¨ã—ã¦è¡¨ç¤ºã•れå•題を示ã—ã¾ã™ã€‚ペンやéµã®ã‚¢ã‚¤ã‚³ãƒ³ã‚’å³ã‚¯ãƒªãƒƒã‚¯ã™ã‚‹ã“ã¨ã§ã€ä»¥ä¸‹ã®ãƒ¡ãƒ‹ãƒ¥ãƒ¼ãŒè¡¨ç¤ºã•れã¾ã™ã€‚
  • Enigmail セキュリティー情報: GnuPG ãŒãã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«å¯¾ã—ã¦å‡ºåŠ›ã—ãŸçµæžœã‚’表示ã—ã¾ã™ã€‚
  • Enigmail セキュリティー情報をコピー: GnuPG ã®å‡ºåŠ›ã‚’ã‚¯ãƒªãƒƒãƒ—ãƒœãƒ¼ãƒ‰ã«ã‚³ãƒ”ーã—ã¾ã™ã€‚返信ã«è²¼ã‚‹ãªã©ã«åˆ©ç”¨ã§ãã¾ã™ã€‚
  • OpenPGP フォト ID を表示: 公開éµã«å†™çœŸãŒåŸ‹ã‚è¾¼ã¾ã‚Œã¦ã„れã°ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®é€ä¿¡è€…㮠フォト ID を表示ã—ã¾ã™ã€‚(ã“ã®ã‚ªãƒ—ションã¯å†™çœŸãŒå…¬é–‹éµã«åŸ‹ã‚è¾¼ã¾ã‚Œã¦ã„ã‚‹å ´åˆã«æœ‰åйã§ã™ã€‚)
  • S/MIME セキュリティー情報: ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã® S/MIME セキュリティー情報を表示ã—ã¾ã™ã€‚

ã‚‚ã—ã‚ãªãŸãŒ keyserver-options auto-key-retrieve ã‚’ gpg.conf ã«è¨­å®šã—ã¦ã„ãªã„状態ã§ç½²åã‹æš—å·åŒ–ã•れã¦ã„るメッセージを読むã¨ã€ãƒšãƒ³ã®ã‚¢ã‚¤ã‚³ãƒ³ãŒï¼Ÿã¨å…±ã«è¡¨ç¤ºã•れã€ãƒ˜ãƒƒãƒ€ãƒ¼ã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ãƒ©ã‚¤ãƒ³ã« メッセージã®ä¸€éƒ¨åˆ†ãŒ ç½²å ã•れã¦ã„ã¾ã™; 詳ã—ãã¯ã€Œè©³ç´°ã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã¦ãã ã•ã„ ã¨è¡¨ç¤ºã•れã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãƒšã‚¤ãƒ³ã«ã¯ OpenPGP メッセージブロックã¨ç½²åブロックãŒè¡¨ç¤ºã•れã¾ã™ã€‚

keyserver-options auto-key-retrieve ㌠gpg.conf ã«è¨­å®šã•れã¦ã„ã‚‹å ´åˆã§ã‚‚ã€OpenPGP éµãŒæ—¢å®šã®éµã‚µãƒ¼ãƒãƒ¼ã«ç„¡ã„å ´åˆã¯åŒæ§˜ã®ã‚¢ã‚¤ã‚³ãƒ³ãŒè¡¨ç¤ºã•れã¾ã™ã€‚

ペンã¨ï¼Ÿ ã®ã‚¢ã‚¤ã‚³ãƒ³ã‚’クリックã™ã‚‹ã¨ã€è©²å½“ã™ã‚‹å…¬é–‹éµã‚’æŒã£ã¦ã„ãªã„æ—¨ãŒè¡¨ç¤ºã•れã¾ã™ã€‚OK をクリックã™ã‚‹ã¨ã€éµã‚µãƒ¼ãƒãƒ¼ã®ãƒªã‚¹ãƒˆãŒè¡¨ç¤ºã•れãŸåˆ¥ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ãŒé–‹ãメッセージã®é€ä¿¡è€…ã®å…¬é–‹éµã‚’ダウンロードã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

ã‚ãªãŸãŒä½¿ã„ãŸã„公開éµã‚µãƒ¼ãƒãƒ¼ã®ãƒªã‚¹ãƒˆã‚’編集ã™ã‚‹ã«ã¯ã€Enigmail -> 設定 -> éµã‚µãƒ¼ãƒãƒ¼ ã‚¿ãƒ–ã‚’é¸æŠžã—ã€å…¬é–‹éµã‚µãƒ¼ãƒãƒ¼: ã®æ¬„ã«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’カンマ区切りã§å…¥åŠ›ã—ã¦ãã ã•ã„。リストã®ä¸€ç•ªä¸Šã®ã‚µãƒ¼ãƒãƒ¼ãŒæ—¢å®šã§ä½¿ç”¨ã•れã¾ã™ã€‚

æš—å·åŒ–ã•ã‚ŒãŸæ·»ä»˜ãƒ•ァイルを開ã / 添付ã•れ㟠OpenPGP éµã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆ
æ‹¡å¼µå­ãŒ *.pgp, *.asc *.gpg ã®æ·»ä»˜ãƒ•ァイル㯠Enigmail ã§è‡ªå‹•çš„ã«èªè­˜ã•れã¾ã™ã€‚ ãã‚Œã‚‰ã®æ·»ä»˜ãƒ•ァイルをå³ã‚¯ãƒªãƒƒã‚¯ã™ã‚‹ã¨ã€ç‰¹åˆ¥ãªé¸æŠžè‚¢ãŒã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆãƒ¡ãƒ‹ãƒ¥ãƒ¼ã«è¡¨ç¤ºã•れã¾ã™ã€‚æš—å·åŒ–ã•ã‚ŒãŸæ·»ä»˜ãƒ•ァイルã®å ´åˆã«ã¯ã€å¾©å·ã—ã¦é–‹ã 㨠復å·ã—ã¦åå‰ã‚’ã¤ã‘ã¦ä¿å­˜ ãŒè¡¨ç¤ºã•れã€é–‹ã„ãŸã‚Šä¿å­˜ã™ã‚‹å‰ã«æ·»ä»˜ãƒ•ァイルを Enigmail ã§å¾©å·ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚添付ファイル㌠OpenPGP éµãƒ•ァイルã®å ´åˆã«ã¯ã€OpenPGP éµã‚’読ã¿è¾¼ã‚€ ãŒè¡¨ç¤ºã•れã€OpenPGP éµã‚’読ã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã™ã€‚

æ›´ãªã‚‹ãƒ˜ãƒ«ãƒ—ã¯ä»¥ä¸‹ã®ã‚µã‚¤ãƒˆã§åˆ©ç”¨ã§ãã¾ã™ (英語): Enigmail Help web page

enigmail-2.0.8/lang/ja/help/rulesEditor.html000066400000000000000000000064601334302754500207540ustar00rootroot00000000000000 Enigmail ヘルプ: å—å–人ã”ã¨ã®è¨­å®š

Enigmail ヘルプ

Enigmail å—å–人ã”ã¨ã®è¨­å®š

å—å–人ã”ã¨ã®è¨­å®šã§ã¯ã€å—å–人ã”ã¨ã«æš—å·åŒ–ã€ç½²åã€PGP/MIME ã«é–¢ã™ã‚‹æ—¢å®šã®è¨­å®šã¨ã€ã©ã® OpenPGP éµã‚’用ã„ã‚‹ã‹ã‚’設定ã§ãã¾ã™ã€‚å„ルール㯠5 ã¤ã®ãƒ•ィールドã‹ã‚‰ãªã‚Šã€1 ã¤ã®æ–¹é‡ã‚’ã‚らã‚ã—ã¾ã™ã€‚:

メールアドレス
メールアドレスを To:, Cc: ãã—㦠Bcc: フィールドã§ãƒžãƒƒãƒã•ã›ã¾ã™ã€‚ マッãƒãƒ³ã‚°ã¯ã€éƒ¨åˆ†ä¸€è‡´ã§è¡Œã‚れã¾ã™ã€‚ (詳細㯠ルール編集 ダイアログã«ã‚りã¾ã™ã€‚)
OpenPGP éµ
å—å–人ã”ã¨ã«ç”¨ã„ã‚‹ OpenPGP éµ ID を設定ã—ã¾ã™ã€‚
ç½²å
ç½²åã™ã‚‹/ã—ãªã„を決定ã—ã¾ã™ã€‚ã“れã¯ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ä½œæˆç”»é¢ã®å€‹åˆ¥ã®è¨­å®šã«ã‚ˆã£ã¦ä¸Šæ›¸ãã•れã¾ã™ã€‚
  • 無効: メッセージã«ç½²åã—ã¾ã›ã‚“。
  • 返信時ã®ã¿: ç½²åã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«è¿”ä¿¡ã™ã‚‹ã¨ãã®ã¿ç½²åã—ã¾ã™ã€‚
  • 有効: メッセージã«ç½²åã—ã¾ã™ã€‚

ã“ã®ç½²åã«é–¢ã™ã‚‹è¨­å®šã¯ãƒžãƒƒãƒã™ã‚‹ã™ã¹ã¦ã®ãƒ«ãƒ¼ãƒ«ã«å¯¾ã—ã¦é©ç”¨ã•れã¾ã™ã€‚ã‚‚ã—ç½²åã‚’ã—ãªã„ルール㌠1 ã¤ã§ã‚‚ã‚れã°ã€ä»–ã®ç½²åã‚’ã™ã‚‹ãƒ«ãƒ¼ãƒ«ãŒãƒžãƒƒãƒã—ã¦ã‚‚ã€ç½²åã¯ã•れã¾ã›ã‚“。

æš—å·åŒ–
æš—å·åŒ–ã™ã‚‹/ã—ãªã„を決定ã—ã¾ã™ã€‚設定å¯èƒ½ãªé …ç›®ã¨æ„味ã¯ã€ç½²åã¨åŒæ§˜ã§ã™ã€‚
PGP/MIME
PGP/MIME (RFC 3156) を用ã„ã¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’エンコードã™ã‚‹ã‹ã©ã†ã‹ã‚’決定ã—ã¾ã™ã€‚PGP/MIME ãŒç„¡åйã®å ´åˆã€ã‚¤ãƒ³ãƒ©ã‚¤ãƒ³ PGP ãŒä½¿ã‚れã¾ã™ã€‚設定å¯èƒ½ãªé …ç›®ã¨æ„味ã¯ã€ç½²åã¨åŒä¸€ã§ã™ã€‚

ルールã¯è¡¨ç¤ºã•れã¦ã„ã‚‹é †ã«å‡¦ç†ã•れã¾ã™ã€‚ã‚るルールãŒå—å–人ã«ã‚ã¦ã¯ã¾ã‚Šã€OpenPGP éµ IDã€ã•らã«ç‰¹å®šã•れãŸéµ ID ã‚’å«ã‚“ã§ã„ã‚‹å ´åˆã€ãã®å—å–人ã«ã¤ã„ã¦ã¯ã€ä»–ã®ãƒ«ãƒ¼ãƒ«ã¯è€ƒæ…®ã•れã¾ã›ã‚“。

注æ„: ルールエディターã¯ã¾ã å®Œæˆã—ã¦ã„ã¾ã›ã‚“。ルールファイルを直接編集ã™ã‚‹ã“ã¨ã§ã€ã‚ˆã‚Šè©³ç´°ãªãƒ«ãƒ¼ãƒ«ã‚’設定ã™ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ (ã“れらã®ãƒ«ãƒ¼ãƒ«ã¯ãƒ«ãƒ¼ãƒ«ã‚¨ãƒ‡ã‚£ã‚¿ãƒ¼ã§ç·¨é›†ã§ããªã‹ã£ãŸã‚‚ã®ã§ã™)。直接ファイルを編集ã™ã‚‹ã“ã¨ã«ã¤ã„ã¦ã® è©³ç´°ãªæƒ…å ± (英語) 㯠Enigmail Homepage ã«ã‚りã¾ã™ã€‚


æ›´ãªã‚‹ãƒ˜ãƒ«ãƒ—ã¯ä»¥ä¸‹ã®ã‚µã‚¤ãƒˆã§åˆ©ç”¨ã§ãã¾ã™ (英語): Enigmail Help web page

enigmail-2.0.8/lang/ja/help/sendingPrefs.html000066400000000000000000000062041334302754500210760ustar00rootroot00000000000000 Enigmail ヘルプ: é€ä¿¡æ™‚ã®æš—å·åŒ–設定

Enigmail ヘルプ

æš—å·åŒ–ã—ã¦é€ä¿¡ã™ã‚‹è¨­å®š

é€ä¿¡è¨­å®šã«ãŠã„ã¦ã€æš—å·åŒ–ã«é–¢ã™ã‚‹ä¸€èˆ¬çš„ãªãƒ¢ãƒ‡ãƒ«ã¨ãƒ«ãƒ¼ãƒ«ã‚’é¸æŠžã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

æ¨™æº–ã®æš—å·åŒ–設定
ã“ã®è¨­å®šã§ã¯ã€å¯èƒ½ã§ã‚れã°ç¢ºèªãªã—ã«è‡ªå‹•çš„ã«æš—å·åŒ–ã—ã¦é€ä¿¡ã—ã¾ã™ã€‚

å˜ã«æš—å·åŒ–ã™ã‚‹ã“ã¨ã§ãƒ—ライãƒã‚·ãƒ¼ã‚’強化ã—ãŸã„ã®ã§ã‚れã°ã€ã“ã®è¨­å®šãŒé©ã—ã¦ã„ã¾ã™ã€‚

ã“れã¯ã€è‘‰æ›¸ã§ã¯ãªãå°æ›¸ã‚’用ã„ã‚‹ã“ã¨ã¨é¡žä¼¼ã—ã¦ã„ã¾ã™ã€‚葉書ã¨ã¯ç•°ãªã‚Šã€å°æ›¸ã§ã‚れã°é…é€ã®éŽç¨‹ã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å†…容ãŒç¬¬ä¸‰è€…ã®ç›®ã«è§¦ã‚Œã‚‹ã“ã¨ã¯ã‚りã¾ã›ã‚“。

ã—ã‹ã—ãªãŒã‚‰å°æ›¸ã‚’用ã„ãŸå ´åˆã¨åŒæ§˜ã«ã€ã“ã®è¨­å®šã§ã¯é…é€éŽç¨‹ã§ç¬¬ä¸‰è€…ã«ã‚ˆã£ã¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å†…容ãŒè§£èª­ã•れるå¯èƒ½æ€§ã‚’完全ã«å¦å®šã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ (ãã®ãŸã‚ã«ç‰¹åˆ¥ãªæŠ€è¡“ã‚’å¿…è¦ã¨ã™ã‚‹ã¨ã—ã¦ã‚‚)。

具体的ãªãƒªã‚¹ã‚¯ã¨ã—ã¦ã¯ã€æ­£è¦ã®å—å–人を装ã£ãŸç¬¬ä¸‰è€…ã«ã‚ˆã‚‹ã€Œå½ç‰©ã®éµã€ã«å¯¾ã—ã¦æš—å·åŒ–ã—ã¦ã—ã¾ã†ã“ã¨ãŒæŒ™ã’られã¾ã™ã€‚ã“れをé¿ã‘ã‚‹ãŸã‚ã«ã¯ã€PGP ã®ä¿¡é ¼ãƒ¢ãƒ‡ãƒ«ã‚’利用ã™ã‚‹ã‹ (下記å‚ç…§)ã€å…¬é–‹éµã®ãƒ•ã‚£ãƒ³ã‚¬ãƒ¼ãƒ—ãƒªãƒ³ãƒˆãŒæ­£ã—ã„ã‹å¸¸ã«ç¢ºèªã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚

è©³ç´°ãªæš—å·åŒ–設定
ã“ã®è¨­å®šã§ã¯ã€å¿…è¦ã«å¿œã˜ã¦æš—å·åŒ–ã®è¨­å®šã‚’変更ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
  • ç½²å/æš—å·åŒ–ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«å¯¾ã—ã¦è‡ªåˆ†ã‚‚ç½²å/æš—å·åŒ–ã—ã¦è¿”ä¿¡ã™ã‚‹ã‹å¦ã‹
  • æš—å·åŒ–ã®éš›ã«å—ã‘入れるéµã®é¸å®šã« OpenPGP ã®ä¿¡é ¼ãƒ¢ãƒ‡ãƒ« (Web of Trustã€è‡ªåˆ†è‡ªèº«ã«ã‚ˆã‚‹ç½²åã‚ã‚‹ã„ã¯ã€è‡ªåˆ†ãŒä¿¡ç”¨ã™ã‚‹éµã«ã‚ˆã‚‹ååˆ†ãªæ•°ã®ç½²åã‚’å¿…è¦ã¨ã—ã¾ã™) を用ã„ã‚‹ã‹å¦ã‹
  • éµãŒå—ã‘入れられる場åˆã«ã€è‡ªå‹•çš„ã«æš—å·åŒ–ã—ã¦é€ä¿¡ã™ã‚‹ã‹å¦ã‹
  • é€ä¿¡å‰ã«æš—å·åŒ–ã«ã¤ã„ã¦ç¢ºèªã™ã‚‹ã‹å¦ã‹
æ­£è¦ã®å—å–人以外ã®ç¬¬ä¸‰è€…ã«ã‚ˆã£ã¦æš—å·åŒ–ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å†…容ãŒè§£èª­ã•れるã“ã¨ã‚’防ããŸã‚ã«ã¯ã€è©³ç´°è¨­å®šã§ã€Œä¿¡ç”¨ã§ãã‚‹éµã®ã¿ã€ã‚’é¸æŠžã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚OpenPGP ã®ä¿¡é ¼ãƒ¢ãƒ‡ãƒ« (Web of Trust) を用ã„ã‚‹ã“ã¨ã§ã€å½ç‰©ã®éµã«å¯¾ã™ã‚‹ãƒªã‚¹ã‚¯ã‚’軽減ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ãŒã€ã“ã®ãƒ¢ãƒ‡ãƒ«ã‚’é©åˆ‡ã«åˆ©ç”¨ã™ã‚‹ãŸã‚ã«ã¯ã€è‡ªåˆ†è‡ªèº«ã«ã‚ˆã‚‹ç½²åを行ã„ã€ã€Œæ‰€æœ‰è€…ã«ã‚ˆã‚‹ä¿¡ç”¨åº¦ã€ã‚’明示ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚

æ›´ãªã‚‹ãƒ˜ãƒ«ãƒ—ã¯ä»¥ä¸‹ã®ã‚µã‚¤ãƒˆã§åˆ©ç”¨ã§ãã¾ã™ (英語): Enigmail Help web page

enigmail-2.0.8/lang/ko/000077500000000000000000000000001334302754500146465ustar00rootroot00000000000000enigmail-2.0.8/lang/ko/am-enigprefs.properties000066400000000000000000000001171334302754500213400ustar00rootroot00000000000000# Strings used in the Mozill AccountManager prefPanel-enigprefs=OpenPGP 보안 enigmail-2.0.8/lang/ko/enigmail.dtd000066400000000000000000001674621334302754500171500ustar00rootroot00000000000000 '를 사용"> ' 문ìžë¥¼ 사용합니다. 받는 ì‚¬ëžŒì´ ì˜¤ëž˜ëœ Hushmail 키를 사용하고 있는 경우는 비활성화 ë°”ëžë‹ˆë‹¤."> OpenPGP 보안)"> 주ì˜ï¼ší‚¤ ìƒì„±ì€ 완료까지 몇 ë¶„ ì •ë„ ê±¸ë¦´ 수 있습니다. 키 ìƒì„±ì´ ì§„í–‰ë˜ëŠ” ë™ì•ˆ ì‘ìš©í”„ë¡œê·¸ëž¨ì„ ì¢…ë£Œí•˜ì§€ 마십시오. 키 ìƒì„± ë„ì¤‘ì— ë¸Œë¼ìš°ì €ë¥¼ 사용하거나 ë””ìŠ¤í¬ ì•¡ì„¸ìŠ¤ê°€ ë§Žì€ ìž‘ì—…ì„ ìˆ˜í–‰í•˜ë©´, '난수 í’€'ì´ ì±„ì›Œì ¸ 처리 ì†ë„ê°€ 빨ë¼ì§‘니다. 키 ìƒì„±ì´ 완료ë˜ë©´ 알려드립니다."> 'ì€ ìž˜ëª»ëœ ê²ƒìž…ë‹ˆë‹¤."> 주ì˜ï¼ší‚¤ ìƒì„±ì€ 완료까지 몇 ë¶„ ì •ë„ ê±¸ë¦´ 수 있습니다. 키 ìƒì„±ì´ ì§„í–‰ë˜ëŠ” ë™ì•ˆ ì‘ìš©í”„ë¡œê·¸ëž¨ì„ ì¢…ë£Œí•˜ì§€ 마십시오. 키 ìƒì„±ì´ 완료ë˜ë©´ 알려드립니다."> 주ì˜: Enigmail는 모든 계정 ë˜ëŠ” ì‹ ì›ì— 대하여, Enigmailê°€ ì„¤ì •ëœ ìƒíƒœì´ë“  아니든 관계없ì´, ì „ìž ë©”ì¼ì— 있는 ì„œëª…ì„ ê²€ì¦í•˜ê²Œ ëœë‹¤ëŠ” ì ì„ 주ì˜í•˜ì‹­ì‹œì˜¤"> 공개키(공개열쇠) 는 다른 사람들 ì´ ì—¬ëŸ¬ë¶„ì—게 암호메ì¼ì„ 보낼때 사용합니다. 모든 사람ì—게 공개열쇠를 ë°°í¬í•´ë„ ë©ë‹ˆë‹¤. "> 비밀키(비밀열쇠) 는 여러분 ìžì‹ ì´ 암호메ì¼ì„ 복호화할 때나 ì´ë©”ì¼ì— 서명할 때 사용합니다. 비밀열쇠를 다른 사람ì—게 ë³´ë‚´ì§€ 마십시오. "> 비밀키(비밀열쇠)는여러분 ìžì‹ ì´ 암호메ì¼ì„ 복호화할 때나 ì´ë©”ì¼ì— 서명할 때 사용합니다. 비밀열쇠를 다른 사람ì—게 ë³´ë‚´ì§€ 마십시오. 비밀키를 안전하게 사용하기 위해 ë‹¤ìŒ ëŒ€í™”ìƒìžì—서 ë‘번 ì•”í˜¸ë¬¸êµ¬ì„ ìž…ë ¥í•´ì•¼ 합니다."> 암호문구/html:b>ì€ ì—¬ëŸ¬ë¶„ì˜ ë¹„ë°€ì—´ì‡ ë¥¼ 지키는 패스워드입니다. ì—¬ëŸ¬ë¶„ì˜ ë¹„ë°€ì—´ì‡ ë¥¼ 다른 ì‚¬ëžŒì´ ë¬´ë‹¨ìœ¼ë¡œ 사용하는 ê²ƒì„ ë°©ì§€ 합니다."> 절대로 안ë©ë‹ˆë‹¤. "> Enigmailì„ ì„ íƒí•´ì£¼ì…”서 ê°ì‚¬í•©ë‹ˆë‹¤."> enigmail-2.0.8/lang/ko/enigmail.properties000066400000000000000000001626221334302754500205620ustar00rootroot00000000000000Enigmail=ì—ë‹ˆê·¸ë©”ì¼ ##################################################################### # Strings used within enigmailCommon.js and enigmailCommon.jsm ##################################################################### enigAlert=ì—ë‹ˆê·¸ë©”ì¼ ê²½ê³  enigConfirm=ì—ë‹ˆê·¸ë©”ì¼ í™•ì¸ # enigInfo=Enigmail Information enigError=ì—ë‹ˆê·¸ë©”ì¼ ì—러 enigPrompt=ì—ë‹ˆê·¸ë©”ì¼ í”„ë¡¬í”„íŠ¸ dlgYes=예(&Y) dlgNo=아니오(&N) dlgKeepSetting=ì„¤ì •ì„ ì €ìž¥í•´, 다ìŒë¶€í„° 묻지 ì•ŠìŒ dlgNoPrompt=다ìŒë¶€í„° ì´ ëŒ€í™”ìƒìžë¥¼ 표시하지 ì•ŠìŒ dlg.button.delete=ì‚­ì œ(&D) dlg.button.cancel=취소(&C) dlg.button.close=닫기(&C) dlg.button.continue=계ì†(&T) dlg.button.skip=건너뛰기(&S) dlg.button.overwrite=ë§ì“°ê¸° &O dlg.button.view=보기(&V) dlg.button.retry=ìž¬ì‹œë„ &R dlg.button.ignore=무시 &I # dlg.button.install=&Install # dlg.button.ok=&OK repeatPrefix=\n\nì´ ê²½ê³ ëŠ” %S repeatSuffixSingular=회 반복ë©ë‹ˆë‹¤. repeatSuffixPlural=회 반복ë©ë‹ˆë‹¤. noRepeat=\n\nEnigmail를 업그레ì´ë“œ í•  때까지, ì´ ê²½ê³ ëŠ” 반복ë˜ì§€ 않습니다. pgpNotSupported=ì—니그메ì¼ì„ PGP 6.x와 함께 사용하고 계신것 같습니다.\n\n불행하게ë„, PGP 6.x는 Enigmailê°€ 올바르게 ë™ìž‘하지 못하게하는 ë§Žì€ ë¬¸ì œì ì„ 가지고 있습니다. ë”°ë¼ì„œ, ì—니그메ì¼ì€ PGP 6.x를 ë”ì´ìƒ ì§€ì›í•˜ì§€ 않습니다.. GnuPG (GPG)를 ëŒ€ì‹ ì— ì‚¬ìš©í•˜ì„¸ìš”.\n\n, GnuPG로 전환할 때 ë„ì›€ì´ í•„ìš”í•˜ë‹¤ë©´, Enigmail 홈페ì´ì§€ì˜ Help ì„¹ì…˜ì„ ì°¸ì¡°í•˜ì‹œê¸° ë°”ëžë‹ˆë‹¤. initErr.howToFixIt=ì—니그메ì¼ì‚¬ìš©í•˜ë ¤ë©´ GnuPGê°€ 필요합니다. GnuPG를 ì•„ì§ ì„¤ì¹˜í•˜ì§€ 않았으면 ì•„ëž˜ì˜ ì„¤ì¹˜ë§ˆë²•ì‚¬ ë²„íŠ¼ì„ ì´ìš©í•˜ëŠ” ê²ƒì´ ê°€ìž¥ 쉽습니다. initErr.setupWizard.button=설치마법사 &S passphraseCleared=암호문구를 지웠습니다 cannotClearPassphrase=암호문구 관리를 위해 gnome-keyringê³¼ ê°™ì´ ë¹„í‘œì¤€ í”„ë¡œê·¸ëž¨ì„ ì‚¬ìš©í•©ë‹ˆë‹¤. ë”°ë¼ì„œ ì—니그메ì¼ì—서 암호문구 ì‚­ì œê¸°ëŠ¥ì„ ì‚¬ìš©í•  수 없습니다. noPhotoAvailable=ì‚¬ì§„ì´ ì—†ìŠµë‹ˆë‹¤ debugLog.title=ì—ë‹ˆê·¸ë©”ì¼ ë””ë²„ê·¸ 로그 error.photoPathNotReadable='%S'ì—서 ì‚¬ì§„ì„ ì°¾ì„ ìˆ˜ 없습니다. # generalError=Error: %S # Strings in configure.jsm enigmailCommon.versionSignificantlyChanged=ì—ë‹ˆê·¸ë©”ì¼ ìƒˆë²„ì „ì€ ì„ íƒì‚¬í•­ê³¼ ì˜µì…˜ì´ ë§Žì´ ë°”ë€Œì—ˆìŠµë‹ˆë‹¤. 최대한 ê³¼ê±°ë²„ì „ì˜ ë‚´ìš©ì„ ê·¸ëŒ€ë¡œ ì´ì „í•´ 오려고 했으나 ì¼ë¶€ ìžë™ìœ¼ë¡œ 처리하지 못한 ê²ƒì´ ìžˆìŠµë‹ˆë‹¤. 새 ë²„ì „ì˜ ì„ íƒì‚¬í•­ê³¼ ì˜µì…˜ì„ ë‹¤ì‹œí•œë²ˆ ì ê²€í•´ 주시기 ë°”ëžë‹ˆë‹¤. enigmailCommon.checkPreferences=ì„ íƒì‚¬í•­ì„ ì ê²€í•˜ì„¸ìš” ... preferences.defaultToPgpMime=ì—니그메ì¼ì—서 사용하는 ì¸ì½”딩 ë°©ì‹ì„ ì¸ë¼ì¸PGPë°©ì‹ì—서 PGP/MIMEë°©ì‹ìœ¼ë¡œ 변경하였습니다. ì´ ë°©ì‹ì´ ìžë™ì ìš©ë˜ë„ë¡ ë³€ê²½í•˜ì§€ 마시길 권합니다. \n\nì¸ë¼ì¸PGPë°©ì‹ì´ ìžë™ì ìš©ë˜ë„ë¡ í•˜ë ¤ë©´ OpenPGPë³´ì•ˆì˜ ê³„ì •ì—서 설정ì„하시기 ë°”ëžë‹ˆë‹¤. ##################################################################### # Strings in enigmailAbout.js ##################################################################### usingVersion=ì—ë‹ˆê·¸ë©”ì¼ ë²„ì „ %S 실행 중 # enigmailPepVersion=Enigmail/p≡p version %S usingAgent=%S ì‹¤í–‰íŒŒì¼ %S 를 ì´ìš©í•´ 암호화/복호화를 하고 있습니다. agentError=ì—러: ì—ë‹ˆê·¸ë©”ì¼ í•µì‹¬ ì„œë¹„ìŠ¤ì— ì•¡ì„¸ìŠ¤ í•  수 없습니다! ##################################################################### # Strings in enigmailKeygen.js ##################################################################### accessError=ì—ë‹ˆê·¸ë©”ì¼ ì„œë¹„ìŠ¤ì— ì•¡ì„¸ìŠ¤ í•  수 없습니다. onlyGPG=키 ìƒì„±ì€ GnuPGì—서만 ì´ìš©í•  수 있습니다. (PGPì—서는 ë™ìž‘하지 않습니다! ) keygenComplete=키 ìƒì„± 완료! ì¦ëª…서 <%S>ê°€ ì„œëª…ì— ì´ìš©ë©ë‹ˆë‹¤. revokeCertRecommended=사용ìžì˜ í‚¤ì— ëŒ€í•œ í기 ì¸ì¦ì„œ ìž‘ì„±ì„ ê°•ë ¥ížˆ 추천 합니다. ì´ ì¸ì¦ì„œëŠ” 키를 무효로 하고 ì‹¶ì„ ë•Œ, 예를 들어, 비밀키를 ì½ì–´ë²„리거나 ì‹ ë¢°ì„±ì„ ë³´ìž¥í•  수 ì—†ì„ ë•Œ ì´ìš©í•  수 있습니다. í기 ì¦ëª…서를 지금 작성합니까? keyMan.button.generateCert=ì¸ì¦ì„œ ìƒì„±(&G) genCompleteNoSign=키 ìƒì„± 완료! genGoing=키 ìƒì„± ì´ë¯¸ 진행중! passNoMatch=패스프레ì´ì¦ˆê°€ ì¼ì¹˜í•˜ì§€ 않았습니다. 다시 입력해주세요 passCheckBox=í‚¤ì— ëŒ€í•´ 패스프레ì´ì¦ˆë¥¼ 설정하지 않는 경우 ì²´í¬ passUserName=ì´ ì¦ëª…ì„œì— ëŒ€í•œ ì‚¬ìš©ìž ëª…ì„ ì§€ì •í•˜ì„¸ìš” keygen.missingUserName=계정ì´ë‚˜ ì•„ì´ë”” ë‚œì— ì„±ëª…ì„ ìž…ë ¥í•˜ì§€ 않았습니다. ê³„ì •ì„¤ì •ì˜ Your name ë‚œì— ì„±ëª…ì„ ìž…ë ¥í•˜ì„¸ìš”. keygen.passCharProblem=ì•”í˜¸ë¬¸êµ¬ì— íŠ¹ìˆ˜ë¬¸ìžê°€ 있습니다. ì´ ê²½ìš° 프로그램ì—서 문제가 ë°œìƒí•  수 있습니다. 암호문구ì—는 ë‹¤ìŒ ë¬¸ìžë§Œì„ 사용하기를 ë°”ëžë‹ˆë‹¤. :\na-z A-Z 0-9 /.;:-,!?(){}[]%* passSpaceProblem=기술ì ìœ¼ë¡œ 처리하기 어려우므로, 공백문ìžë¥¼ ì•”í˜¸ë¬¸êµ¬ì˜ ì²«ìžì™€ 마지막 글ìžë¡œ 입력할 수 없습니다. changePassFailed=패스프레ì´ì¦ˆ 변경 실패 keyConfirm='%S'ì˜ ê³µê°œí‚¤ì™€ ê°œì¸í‚¤ë¥¼ ìƒì„±í•©ë‹ˆê¹Œ? keyMan.button.generateKey=키 ìƒì„±(&G) keyAbort=키 ìƒì„±ì„ 중지합니까? keyMan.button.generateKeyAbort=키 ìƒì„± 중단(&A) keyMan.button.generateKeyContinue=키 ìƒì„± 계ì†(&C) expiryTooLong=100ë…„ ì´ìƒì˜ ìœ íš¨ê¸°ê°„ì´ ìžˆëŠ” 키는 ìƒì„± í•  수 없습니다. expiryTooLongShorter=ìœ íš¨ê¸°ê°„ì´ 90ë…„ì´ìƒì¸ 키를 ìƒì„±í•  수 없습니다. expiryTooShort=키는 ì ì–´ë„ 1ì¼ê°„ì€ ìœ íš¨í•˜ì§€ 않으면 안ë©ë‹ˆë‹¤. keyGenFailed=키 ìƒì„±ì— 실패했습니다. ìžì„¸í•œ ë‚´ìš©ì€ Enigmail 콘솔(메뉴 Enigmail > Enigmail 디버그)ì—서 확ì¸í•˜ì„¸ìš”. setKeyExpirationDateFailed=유효기간 만기ì¼ì„ 수정할 수 없습니다. # Strings in enigmailMessengerOverlay.js securityInfo=Enigmail 보안 ì •ë³´ \n\n enigHeader=Enigmail: enigContentNote=ì—니그메ì¼: ì´ ë©”ì‹œì§€ì˜ ì²¨ë¶€íŒŒì¼ì€ 서명ì´ë‚˜ 암호화가 ë˜ì§€ 않았습니다.\n\n possiblyPgpMime=PGP/MIME 암호화 í˜¹ì€ ì„œëª…ëœ ë©”ì‹œì§€ 같습니다. 복호화화 ë²„íŠ¼ì„ ëˆ„ë¥´ì„¸ìš” saveAttachmentHeader=Enigmail: 복호화 한 첨부 파ì¼ì„ 저장 noTempDir=쓰기 가능한 임시 디렉토리를 ì°¾ì„ ìˆ˜ ì—†ìŒ\nTEMP 환경 변수를 설정해 주세요 attachmentPgpKey=열려고 한 첨부 íŒŒì¼ '%S'는, OpenPGP키 파ì¼ìž…니다. \n\nì²¨ë¶€ëœ í‚¤ë¥¼ 가져오려면 '가져오기'를 브ë¼ìš°ì € 윈ë„ìš°ì—서 íŒŒì¼ ë‚´ìš©ì„ ë³´ë ¤ë©´ '보기'를 í´ë¦­í•˜ì„¸ìš” beginPgpPart=********* *BEGIN ENCRYPTED or SIGNED PART* ********* endPgpPart=********** *END ENCRYPTED or SIGNED PART* ********** notePartEncrypted=ì—니그메ì¼: ë©”ì‹œì§€ì˜ ì¼ë¶€ë¶„ì€ ì„œëª…ì´ë‚˜ 암호화가 ë˜ì§€ 않았습니다. noteCutMessage=ì—니그메ì¼: 메시지가 여러 블ë¡ìœ¼ë¡œ 나뉘어 있습니다.복호화/ê²€ì¦ì´ 실패하였습니다. decryptOkNoSig=경고\n\në³µí˜¸í™”ì— ì„±ê³µí–ˆìœ¼ë‚˜ ì„œëª…ì€ ì˜¬ë°”ë¥´ê²Œ ê²€ì¦ë˜ì§€ 않았습니다 msgOvl.button.contAnyway=ìƒê´€ì—†ì´ ê³„ì† ì§„í–‰(&C) signature.verifiedOK=첨부파ì¼%S ì˜ ì„œëª…ì„ ëŒ€ì¡°í•œ ê²°ê³¼ ì„œëª…ì´ ì¼ì¹˜í•©ë‹ˆë‹¤. signature.verifyFailed=ì²¨ë¶€íŒŒì¼ %Sì˜ ì„œëª…ì„ ëŒ€ì¡°í•œ ê²°ê³¼ ì„œëª…ì´ ë¶ˆì¼ì¹˜í•©ë‹ˆë‹¤. attachment.noMatchToSignature=첨부파ì¼'%S'와 서명파ì¼ì„ 대조한 ê²°ê³¼ 불ì¼ì¹˜í•©ë‹ˆë‹¤. attachment.noMatchFromSignature=ì„œëª…íŒŒì¼ '%S'와 첨부파ì¼ì„ 대조한 ê²°ê³¼ 불ì¼ì¹˜í•©ë‹ˆë‹¤. fixBrokenExchangeMsg.failed=메세지 수정 ìž‘ì—…ì´ ì‹¤íŒ¨í•˜ì˜€ìŠµë‹ˆë‹¤. # enigmail.msgViewColumn.label=Enigmail # enigmailPep.msgViewColumn.label=Enigmail/p≡p # wksNoIdentity=This key is not linked to any of your email accounts. Please add an account for at least one of the following email addresse(s):\n\n%S # wksConfirmSuccess=Confirmation email sent. # wksConfirmFailure=Sending the confirmation email failed. # autocrypt.importSetupKey.accountPreconfigured=Your account is already correctly configured for Autocrypt.\n\nDo you really want to overwrite your settings with this setup message? # autocrypt.importSetupKey.selfCreated=This message was created by your currently running instance of Enigmail.\n\nPlease switch to the email client to which you want to transfer the settings, and click on the message on that email client to import the settings. # autocrypt.importSetupKey.invalidMessage=Error - could not read setup message. The message seems to be corrupted. Please try to create a new setup message on your "other" device. # autocrypt.importSetupKey.invalidKey=Error - the key could not be imported. The key is either not supported by your version of GnuPG, or it got corrupted. # autocrypt.importSetupKey.wrongPasswd=The password you entered is wrong. Do you want to retry? # autocrypt.importSetupKey.success=The Autocrypt setup message was processed successfully. Autocrypt is now available for your account '%S'. ##################################################################### # Strings in enigmailMsgComposeOverlay.js ##################################################################### keysToExport=삽입할 OpenPGP 키를 ì„ íƒí•˜ì„¸ìš” keysToUse=%S 사용할 OpenPGP키를 ì„ íƒí•˜ì„¸ìš” pubKey=%S ì— ëŒ€í•œ 공개키\n windowLocked=메시지 작성 í™”ë©´ì´ ìž ê¹€. 보내기 ì·¨ì†Œë¨ sendUnencrypted=Enigmail 초기화를 실패했습니다.\n암호화ë˜ì§€ ì•Šì€ ë©”ì‹œì§€ë¥¼ 보내시겠습니까? composeSpecifyEmail=외부로 나가는 ë©”ì‹œì§€ì— ëŒ€í•œ 서명 키를 ì„ íƒí•˜ëŠ”ë° ì‚¬ìš©í•  주로 사용하는 ì „ìž ë©”ì¼ ì£¼ì†Œë¥¼ 지정해 주세요.\n 공백으로 ë‘ë©´, 해당 ë©”ì‹œì§€ì˜ ë³´ë‚´ëŠ” ì‚¬ëžŒì˜ ì£¼ì†Œê°€ 서명 키 ì„ íƒì— 사용ë©ë‹ˆë‹¤. sendingHiddenRcpt=ì´ ë©”ì‹œì§€ì—는 BCC (ìˆ¨ì€ ì°¸ì¡°)로 받는 ì‚¬ëžŒì´ ìžˆìŠµë‹ˆë‹¤. ì´ ë©”ì‹œì§€ê°€ 암호화ë˜ë©´, BCC로 받는 ì‚¬ëžŒì„ ìˆ¨ê¸¸ 수는 있지만 몇몇 다른 PGP 제품 (예를 들어, PGP Corp.) 사용ìžê°€ 메시지를 복호화 í•  수 없게 ë ìˆ˜ë„ 있습니다. ì´ ê²½ìš°, 암호화한 BCC-ë©”ì¼ì„ 사용하지 않는게 좋습니다. sendWithHiddenBcc=BCC 받는 사람 숨기기 sendWithShownBcc=ì¼ë°˜ì ì¸ ë°©ì‹ìœ¼ë¡œ 암호화 sendingNews=ì•”í˜¸í™”ëœ ë³´ë‚´ê¸° ìž‘ì—…ì´ ì¤‘ë‹¨ë습니다.\n\nì´ ë©”ì‹œì§€ëŠ” 뉴스 ê·¸ë£¹ì˜ ë°›ëŠ” ì‚¬ëžŒì´ í¬í•¨ë˜ì–´ 있기 ë•Œë¬¸ì— ì•”í˜¸í™”ë  ìˆ˜ 없습니다. 암호화 하지ë§ê³  다시 ì´ ë©”ì‹œì§€ë¥¼ 보내주세요. sendToNewsWarning=경고: ë‰´ìŠ¤ê·¸ë£¹ì— ì•”í˜¸í™”í•œ ë©”ì¼ì„ 보내려하고 있습니다.\n\nê·¸ë£¹ì˜ ëª¨ë“  구성ì›ì´ ì´ ë©”ì‹œì§€ë¥¼ 복호화 í•  수 있어야 ì˜ë¯¸ê°€ 있기 ë•Œë¬¸ì— ì´ë ‡ê²Œ 하는 ê²ƒì€ ê¶Œìž¥í•˜ì§€ 않습니다. 예를 들어, 메시지는 ê·¸ë£¹ì— ì°¸ì—¬í•˜ê³  있는 모든 ì‚¬ëžŒì˜ í‚¤ë¡œ 암호화 ë˜ì–´ì•¼ 합니다. 지금 수행하고 있는 ì¼ì´ ì–´ë–¤ ì¼ì¸ì§€ 정확히 알고있는 경우ì—ë§Œ 메시지를 보내기 ë°”ëžë‹ˆë‹¤.\n\n계ì†í•˜ì‹œê² ìŠµë‹ˆê¹Œ? hasHTML=HTML ë©”ì¼ ê²½ê³ :\nì´ ë©”ì‹œì§€ì—는 서명/암호화 실패를 ì¼ìœ¼í‚¬ 수 있는 HTMLì´ í¬í•¨ë˜ì–´ 있는 것 같습니다. 앞으로 ì´ ë©”ì‹œì§€ë¥¼ 무시하려면, 서명한 ë©”ì¼ì„ 보낼 때 SHIFT 키를 누르면서 작성/답신 ë²„íŠ¼ì„ í´ë¦­í•˜ì‹œê¸° ë°”ëžë‹ˆë‹¤.\n만약 기본으로 ë©”ì¼ì— ì„œëª…ì„ í•˜ê³  있다면, ì´ ë©”ì¼ ê³„ì •ì— ëŒ€í•´ HTML ë©”ì¼ì„ ê³„ì† ì‚¬ìš©í•˜ì§€ 않ë„ë¡í•˜ê¸° 위해 'HTML로 메시지를 작성하기' ì„¤ì •ì„ ì²´í¬ í•´ì œí•˜ì…”ì•¼ 합니다. strippingHTML=서명/암호화를 위해 í…스트 형ì‹ìœ¼ë¡œ 변환하는 과정ì—서 ì†ì‹¤ë˜ëŠ” HTML í˜•ì‹ ì •ë³´ê°€ ë©”ì‹œì§€ì— í¬í•¨ë˜ì–´ 있습니다. ì •ë§ë¡œ 진행할까요? msgCompose.button.sendAnyway=ê·¸ëž˜ë„ ë©”ì‹œì§€ 보내기(&S) attachWarning=ì´ ë©”ì‹œì§€ì˜ ì²¨ë¶€ë¬¼ì€ ë¡œì»¬ì— ìžˆëŠ” ê²ƒì´ ì•„ë‹ˆê¸° ë•Œë¬¸ì— ì•”í˜¸í™”ë  ìˆ˜ 없습니다. ì²¨ë¶€ë¬¼ì„ ì•”í˜¸í™”í•˜ê¸° 위해서는, 해당 ì²¨ë¶€ë¬¼ì„ ë¡œì»¬ 파ì¼ë¡œ ìš°ì„  저정한 ë‹¤ìŒ ì´ íŒŒì¼ë“¤ì„ 다시 첨부하세요. ê·¸ëž˜ë„ ë©”ì‹œì§€ë¥¼ 보내시겠습니까? quotedPrintableWarn=보내는 ë©”ì‹œì§€ì— 'quoted-printable' ì¸ì½”ë”©ì´ ì„¤ì •ë˜ì–´ 있습니다. ì´ ì„¤ì •ìœ¼ë¡œ ì¸í•´ ë©”ì‹œì§€ì˜ ë³µí˜¸í™” 그리고/ë˜ëŠ” ê²€ì¦ì„ 올바로 í•  수 ì—†ê²Œë  ì†Œì§€ê°€ 있습니다. 지금 'quoted-printable' 메시지 보내기 ì„¤ì •ì„ ë„시겠습니까? minimalLineWrapping=%S ìžê°€ ë  ë•Œë§ˆë‹¤ 줄 바꾸기 ì„¤ì •ì´ ë˜ì–´ 있습니다. 제대로 암호화 그리고/ë˜ëŠ” ì„œëª…ì„ í•˜ë ¤ë©´, ì ì–´ë„ ì´ ê°’ì´ 68 ì€ ë˜ì–´ì•¼í•©ë‹ˆë‹¤. \n 지금 줄 바꿈 ë¬¸ìž ìˆ˜ë¥¼ 68ìžë¡œ 변경합니까? warning=경고 signIconClicked=ì„œëª…ì„ ìˆ˜ë™ìœ¼ë¡œ 변경했습니다. ë”°ë¼ì„œ ì´ ë©”ì‹œì§€ë¥¼ 작성하는 ë™ì•ˆ, 서명하기 활성/ë¹„í™œì„±ì€ ë”ì´ìƒ 암호화 활성/ë¹„í™œì„±í•˜ê¸°ì— ì˜ì¡´í•˜ì§€ 않습니다. errorOwnKeyUnusable=ì´ ê³„ì •ì— ì§€ì •ëœ ì—´ì‡  '%S'로는 ì •ìƒì ì¸ OpenPGP 열쇠를 만들 수 없습니다. \n\nì •ìƒì´ê³  유효기간ì´ë‚´ì¸ OpenPGP 열쇠를 준비하고 ì´ ê³„ì •ì—서 해당 열쇠를 지정하기를 ë°”ëžë‹ˆë‹¤. \n\nì—´ì‡ ì˜ ìœ íš¨ê¸°ê°„ì´ ì•„ì§ ë‚¨ì•„ìžˆìœ¼ë©´ ì†Œìœ ìž ì‹ ë¢°ìˆ˜ì¤€ì„ ì¶©ë¶„ì´ë‚˜ 최고수준으로 지정하였는지 ì ê²€í•˜ì‹œê¸° ë°”ëžë‹ˆë‹¤. msgCompose.cannotSaveDraft=ì´ˆì•ˆì„ ì €ìž¥í•  때 ì—러 ë°œìƒ # msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information - partially encrypted email. # msgCompose.partiallyEncrypted.mimeMsg=The message you are replying to contained both unencrypted and encrypted parts. Some encrypted message parts are invisible to you.\n\nIf the sender was not able to decrypt the hidden message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nWe recommend that you don't reply to the message, but create a new message containing your answer. # msgCompose.partiallyEncrypted.inlinePGP=The message you are replying to contained both unencrypted and encrypted parts. If the sender was not able to decrypt some message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nPlease consider removing all quoted text from your reply to this sender. msgCompose.internalEncryptionError=ë‚´ë¶€ ì—러: 해당 암호화 방법 사용 불가 msgCompose.internalError=ë‚´ë¶€ì—러가 ë°œìƒí–ˆìŠµë‹ˆë‹¤. msgCompose.toolbarTxt.signAndEncrypt=ì´ ë©”ì‹œì§€ì— ì„œëª…ì„ í•˜ê³  암호화 합니다. msgCompose.toolbarTxt.signOnly=ì´ ë©”ì‹œì§€ì— ì„œëª…ì„ í•©ë‹ˆë‹¤. msgCompose.toolbarTxt.encryptOnly=ì´ ë©”ì‹œì§€ë¥¼ 암호화 합니다. msgCompose.toolbarTxt.noEncryption=ì´ ë©”ì‹œì§€ì— ì„œëª…í•˜ì§€ 않고 ì•”í˜¸í™”ë„ í•˜ì§€ 않습니다. msgCompose.toolbarTxt.disabled=ì„ íƒí•˜ì‹  ì•„ì´ë””는 ì—니그메ì¼ì„ 사용할 수 없습니다. # msgCompose.protectSubject.tooltip=Protect the message subject # msgCompose.noSubjectProtection.tooltip=Do not protect the message subject msgCompose.encryptedSubjectStub=메시지 암호화 완료 # msgCompose.protectSubject.dialogTitle=Enable Protection of Subject? # msgCompose.protectSubject.question=Regular encrypted emails contain the unredacted subject.\n\nWe have established a standard to hide the original subject in the encrypted message\nand replace it with a dummy text, such that the subject is only visible after the email is decrypted.\n\nDo you want to protect the subject in encrypted messages? # msgCompose.protectSubject.yesButton=&Protect subject # msgCompose.protectSubject.noButton=&Leave subject unprotected msgCompose.detailsButton.label=ìƒì„¸ë‚´ìš© ... msgCompose.detailsButton.accessKey=ìƒì„¸ # msgCompose.pepSendUnknown=Unknown # msgCompose.pepSendUnsecure=Unsecure # msgCompose.pepSendSecure=Secure # msgCompose.pepSendTrusted=Secure & Trusted # pep.alert.disabledForIdentity=p≡p is disabled for the current identity. Please enable p≡p via the Enigmail/p≡p preferences. # pep.alert.weakReply=You’re about to forward or reply to a secure message as insecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? # note: should end with double newline: sendAborted=보내기 중단ë¨.\n\n # details: keyNotTrusted='%S' í‚¤ì— ëŒ€í•œ 신뢰 ìˆ˜ì¤€ì´ ë¶€ì¡±í•©ë‹ˆë‹¤. keyNotFound='%S' 키를 ì°¾ì„ ìˆ˜ 없습니다. keyRevoked='%S' 키가 취소ë˜ì—ˆìŠµë‹ˆë‹¤. keyExpired='%S' 키 ìœ íš¨ê¸°ì¼ ê²½ê³¼ statPGPMIME=PGP/MIME # statSMIME=S/MIME statSigned=ì„œëª…ë¨ statEncrypted=ì•”í˜¸í™”ë¨ statPlain=서명ë˜ê³  ì•”í˜¸í™”ë¨ offlineSave=%S 메시지를 보낼 편지함 í´ë”ì— %S (으)로 저장하시겠습니까? onlineSend=%S 메시지를 %S (으)로 보냅니까? encryptKeysNote=주ì˜: ì´ ë©”ì‹œì§€ëŠ” ë‹¤ìŒ ì‚¬ìš©ìž ì‹ ì› / 키로 암호화ë©ë‹ˆë‹¤: %S hiddenKey=<키 숨김> signFailed=Enigmail ì—러; 암호화/서명하기 실패. 암호화ë˜ì§€ ì•Šì€ ë©”ì‹œì§€ë¥¼ 보낼까요? msgCompose.button.sendUnencrypted=암호화ë˜ì§€ ì•Šì€ ë©”ì‹œì§€ 보내기(&S) recipientsSelectionHdr=암호화하기 위해 받는 ì‚¬ëžŒì„ ì„ íƒ configureNow=ì„ íƒí•œ 디지털 ì‹ ë¶„ì¦ì— 대한 Enigmail 보안 ì„¤ì •ì´ ì•„ì§ ë˜ì–´ìžˆì§€ 않습니다. 지금 설정하시겠습니까? # encryption/signing status and associated reasons: encryptMessageAuto=메시지 암호화 (ìžë™) encryptMessageNorm=메시지 암호화 signMessageAuto=메시지 서명작업(ìžë™) signMessageNorm=메시지 서명작업 encryptOff=암호화작업: ì •ì§€ encryptOnWithReason=암호화작업:진행중(%S) encryptOffWithReason=암호화작업:ì •ì§€ (%S) encryptOn=암호화작업:진행중 signOn=서명작업:진행중 signOff=서명작업:ì •ì§€ signOnWithReason=서명작업:진행중 (%S) signOffWithReason=서명작업:ì •ì§€(%S) reasonEnabledByDefault=기본ì ìœ¼ë¡œ ê°€ë™ reasonManuallyForced=수작업으로 ì ìš© reasonByRecipientRules=ìˆ˜ì‹ ìž ê·œì¹™ìœ¼ë¡œ ì ìš© reasonByAutoEncryption=ìžë™ 암호화 ì ìš© reasonByConflict=ìˆ˜ì‹ ìž ê·œì¹™ê°„ ì¶©ëŒë°œìƒìœ¼ë¡œ ì¸í•´ reasonByEncryptionMode=암호화 ë°©ì‹ìœ¼ë¡œ ì¸í•´ # should not be used anymore: encryptYes=메시지는 암호화ë©ë‹ˆë‹¤ encryptNo=메시지가 암호화ë˜ì§€ 않습니다 # should not be used anymore: signYes=메시지는 서명ë©ë‹ˆë‹¤ signNo=메시지가 서명ë˜ì§€ 않습니다 # PGP/MIME status: pgpmimeNormal=프로토콜: PGP/MIME inlinePGPNormal=프로토콜:Inline PGP # smimeNormal=Protocol: S/MIME pgpmimeAuto=프로토콜:PGP/MIME (ìžë™) inlinePGPAuto=프로토콜l: Inline PGP (ìžë™) # smimeAuto=Protocol: S/MIME (auto) # should not be used anymore pgpmimeYes=PGP/MIME ì„ ì‚¬ìš©í•  예정입니다. pgpmimeNo=Inline PGP를 사용할 예정입니다. # Attach own key status (tooltip strings): attachOwnKeyNo=보유하신 열쇠를 첨부하지 않습니다. attachOwnKeyYes=보유하신 열쇠를 첨부합니다. attachOwnKeyDisabled=보유하신 열쇠를 첨부하지 안습니다. ì´ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ë ¤ë©´ ê³„ì •ì„¤ì •ì˜ OpenPGP섹션ì—서 해당하는 열쇠를 ì„ íƒí•˜ì…”야 합니다. rulesConflict=받는 사람 별 ê·œì¹™ë“¤ì´ ì„œë¡œ 모순ë©ë‹ˆë‹¤\n%S\n\nì´ë ‡ê²Œ 설정해서 메시지를 보냅니까? msgCompose.button.configure=설정(&C) msgCompose.button.send=메시지 보내기(&S) msgCompose.button.save=메시지 저장(&S) # Strings in enigmailMsgHdrViewOverlay.js keyNeeded=공개키 %S ê°€ 서명 ê²€ì¦ì— 필요함 keyUsed=ì„œëª…ì„ ê²€ì¦í•˜ê¸°ìœ„í•´ 공개키 %S 를 사용함. clickDecrypt=; 복호화 ë²„íŠ¼ì„ í´ë¦­ clickDecryptRetry=; 다시 시ë„하려면 복호화 ë²„íŠ¼ì„ í´ë¦­ clickDetailsButton=; ìžì„¸í•œ ë‚´ìš©ì„ ë³´ë ¤ë©´ "ìƒì„¸"ë²„íŠ¼ì„ ëˆ„ë¥´ì‹œì˜¤. clickImportButton=; 키를 반입하려면 "키반입"ë²„íŠ¼ì„ ëˆ„ë¥´ì‹œì˜¤. keyTypeUnsupported=; 사용하는 GnuPG버전ì—서는 해당 키 íƒ€ìž…ì„ ì§€ì›í•˜ì§€ 않습니다. msgPart=%S ë©”ì‹œì§€ì˜ ì¼ë¶€ë¶„ msgSigned=ì„œëª…ë¨ msgSignedUnkownKey=알 수 없는 키로 ì„œëª…ì´ ë˜ì—ˆìŒ. msgEncrypted=ì•”í˜¸í™”ë¨ msgSignedAndEnc=서명ë˜ê³  ì•”í˜¸í™”ë¨ unverifiedSig=ê²€ì¦ë˜ì§€ì•Šì€ 서명 incompleteDecrypt=복호화 미완료 needKey=ì—러 - 메시지를 복호화하려면 비밀키가 필요함 failedDecrypt=ì—러 - 복호화 실패 badPhrase=ì—러 - 틀린 패스프레ì´ì¦ˆ failedDecryptVerify=ì—러 - 복호화/ê²€ì¦ ì‹¤íŒ¨ viewInfo=; ì„¸ë¶€ì‚¬í•­ì€ ë³´ê¸° > 메시지 보안 ì •ë³´ decryptedMsg=ë³µí˜¸í™”ëœ ë©”ì‹œì§€ decryptedMsgWithFormatError=메세지 복호화 (과거 ìµìŠ¤ì²´ì¸ì§€ 서버를 사용할때 ì†ìƒëœ ì´ë©”ì¼ì´ 복구ë˜ì—ˆìŠµë‹ˆë‹¤. 하지만 메시지를 ì½ì„수 ì—†ì„ ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤.) usedAlgorithms=사용하는 알고리즘ì€: %S 와 %S # pepStatusInfo.text=p≡p Message Status. # pepStatusInfo.title.m3=Under Attack # pepStatusInfo.info.m3=This message is not secure and has been tampered with. # pepStatusInfo.title.m1=Mistrusted # pepStatusInfo.info.m1=This message has a communication partner that has previously been marked as mistrusted # pepStatusInfo.title.r0=Unknown # pepStatusInfo.info.r0=This message does not contain enough information to determine if it is secure. # pepStatusInfo.title.r1=Cannot Decrypt # pepStatusInfo.info.r1=This message cannot be decrypted because the key is not available. # pepStatusInfo.title.r2=Cannot Decrypt # pepStatusInfo.info.r2=This message cannot be decrypted because the key is not available. # pepStatusInfo.title.r3=Unsecure # pepStatusInfo.info.r3=This message is unsecure. # pepStatusInfo.title.r4=Unsecure for Some # pepStatusInfo.info.r4=This message is unsecure for some communication partners. # pepStatusInfo.title.r5=Unreliable Security # pepStatusInfo.info.r5=This message has unreliable protection. # pepStatusInfo.title.r6=Secure... # pepStatusInfo.info.r6=This message is secure but you still need to verify the identity of your communication partner. # pepStatusInfo.title.r7=Secure & Trusted # pepStatusInfo.info.r7=This message is secure and trusted. # pepStatusInfo.color.green=Green # pepStatusInfo.color.yellow=Yellow # pepStatusInfo.color.red=Red # pepRevokeTrust.question=Do you really want to cancel the trust for %S? # pepRevokeMistrust.question=Do you really want to re-trust the key for %S? # pepRevokeTrust.doRevoke=Cancel &trust # wksConfirmationReq=Web Key Directory Confirmation Request # wksConfirmationReq.message=This message has been sent by your email provider to confirm deployment of your OpenPGP public key\nin their Web Key Directory.\nProviding your public key helps others to discover your key and thus being able to encrypt messages to you.\n\nIf you want to deploy your key in the Web Key Directory now, please click on the button "Confirm Request" in the status bar.\nOtherwise, simply ignore this message. # wksConfirmationReq.button.label=Confirm Request # autocryptSetupReq=Perform Autocrypt Setup # autocryptSetupReq.button.label=Start Setup # autocryptSetupReq.setupMsg.desc=This message contains all information to transfer your Autocrypt settings along with your secret key securely from your original device. # autocryptSetupReq.setupMsg.backup=You can keep this message and use it as a backup for your secret key. If you want to do this, you should write down the password and store it securely. # autocryptSetupReq.message.import=To import the settings and key(s) in Enigmail, please click on the "Start Setup" button in the status bar. # autocryptSetupReq.message.sent=Please click on the message on your new device and follow the instuctions to import the settings. # strings in pref-enigmail.js # oldGpgVersion20=Enigmail initialization failed.\n\nYou are using GnuPG version %1$S, which is not supported anymore. Enigmail requires GnuPG version %2$S or newer. Please upgrade your GnuPG installation, or Enigmail will not work. locateGpg=GnuPG 프로그램 위치 지정 invalidGpgPath=GnuPGê°€ ì§€ì •ëœ ê²½ë¡œì—서 ì‹¤í–‰ë  ìˆ˜ 없습니다. Enigmail는 GnuPG로 경로를 다시 지정할 때까지 í˜¹ì€ ì‘ìš©í”„ë¡œê·¸ëž¨ì„ ë‹¤ì‹œ 시작할 때까지 비활성 ìƒíƒœê°€ ë©ë‹ˆë‹¤. warningsAreReset=모든 경고가 초기화 ë˜ì—ˆìŠµë‹ˆë‹¤. prefs.gpgFound=%S ì—서 GnuPGê°€ ë°œê²¬ë¨ prefs.gpgNotFound=GnuPG를 ì°¾ì„ ìˆ˜ ì—†ìŒ prefs.warnAskNever=경고: ì´ ì˜µì…˜ì„ í™œì„±í™”í•˜ë©´ 받는 사람들 중 ì–´ëŠ í•œ 사람ì—게 키가 ì—†ë”ë¼ë„ ë”는 알리지않기 ë•Œë¬¸ì— ì „ìž ë©”ì¼ì´ 암호화ë˜ì§€ ì•Šì€ ìƒíƒœë¡œ ë°©ì¹˜ë  ìˆ˜ 있습니다 -- Enigmail ì´ëŸ° 경우가 ë°œìƒí•´ë„ 알려드리지 ì•Šì„ ê²ƒìž…ë‹ˆë‹¤! prefs.warnIdleTimeForUnknownAgent=gpgì—ì´ì „트를 ì—°ê²°í•  수 없습니다. 암호문구를 관리하기 위해 gnome-keyring, seahorse-agent, KDE wallet managerê³¼ ê°™ì€ ë³„ë„ í”„ë¡œê·¸ëž¨ì„ ì‚¬ìš©í•˜ëŠ” 것 같습니다.ì—니그메ì¼ì€ ì´ë“¤ í”„ë¡œê·¸ëž¨ì´ ì‚¬ìš©í•˜ëŠ” 암호문구 유효기ì¼ì„ ì´ìš©í•  수 없습니다. 그래서 ì—니그메ì¼ì€ ì´ëŸ° í”„ë¡œê·¸ëž¨ì´ ì„¤ì •í•œ ìœ íš¨ê¸°ê°„ì€ ë¬´ì‹œí•©ë‹ˆë‹¤. prefEnigmail.oneKeyserverOnly=오류 - ë¹ ì§„ OpenPGP 키를 ìžë™ìœ¼ë¡œ 다운로드 하기위해 í•˜ë‚˜ì˜ í‚¤ 서버만 지정할 수 있습니다. # Strings used in core.jsm # (said file also re-uses some strings from above) enterAdminPin=스마트 ì¹´ë“œì˜ ê´€ë¦¬ìž PINì„ ìž…ë ¥í•´ 주세요 enterCardPin=스마트 카드 PINì„ ìž…ë ¥í•´ 주세요 notInit=ì—러 - Enigmail 서비스가 ì•„ì§ ì´ˆê¸°í™” ì•ˆë¨ badCommand=ì—러 - 암호화 명령 실패 cmdLine=명령 í–‰ 출력: notRequired=ì—러 - 암호화 í•„ìš” ì—†ìŒ notComplete=ì—러 - 키 ìƒì„±ì´ ì•„ì§ ì™„ë£Œ ì•ˆë¨ invalidEmail=ì—러 - ìž˜ëª»ëœ ì „ìž ë©”ì¼ ì£¼ì†Œ noPassphrase=ì—러 - 주어진 패스프레ì´ì¦ˆ ì—†ìŒ noPGPblock=ì—러 - 유효하지 ì•Šì€ ë³´í˜¸í˜• OpenPGP ë°ì´í„° 블ë¡ì´ 발견ë˜ì—ˆìŠµë‹ˆë‹¤ unverifiedReply=들여쓰기 ëœ ë¶€ë¶„ (답장)ì´ ë³€í˜•ëœ ê²ƒ 같습니다 keyInMessageBody=ë©”ì‹œì§€ì˜ ë³¸ë¬¸ì—서 열쇠를 발견하였습니다. "열쇠 반입" ë²„íŠ¼ì„ ëˆ„ë¥´ì‹œê¸° ë°”ëžë‹ˆë‹¤. sigMismatch=ì—러 - ì„œëª…ì´ ì¼ì¹˜í•˜ì§€ 않습니다 cantImport=공개키 가져오기 실패\n\n doImportOne=%1$S (%2$S)ì„ ë°˜ìž…í• ê¹Œìš”? doImportMultiple=ë‹¤ìŒ ì—´ì‡ ë¥¼ 반입할까요?\n\n%S previewFailed=공개키 파ì¼ì„ ì½ì„ 수 없습니다. # Strings used in errorHandling.jsm sc.wrongCardAvailable=리ë”ì— ë“¤ì–´ìžˆëŠ” %S 스마트카드가 메시지를 ì²˜ë¦¬í•˜ëŠ”ë° ì‚¬ìš©í•  수 없습니다.\n%S 스마트카드를 삽입하고 다시 시ë„해보십시오. sc.insertCard=해당 ìž‘ì—…ì€ ì‚¬ìš©ìžì˜ %S 스마트카드를 필요로합니다.\n필요한 스마트카드를 삽입하고 다시 시ë„해보십시오. sc.removeCard=해당 ìž‘ì—…ì€ ë¦¬ë”ì— ìŠ¤ë§ˆíŠ¸ì¹´ë“œê°€ ë“¤ì–´ìžˆì„ í•„ìš”ê°€ 없습니다.\n스마트카드를 제거한 후 다시 시ë„해보십시오. sc.noCardAvailable=리ë”ì—서 스마트 카드를 ì°¾ì„ ìˆ˜ 없습니다\n스마트 카드를 삽입하고 ìž‘ì—…ì„ ë‹¤ì‹œ 해보세요 sc.noReaderAvailable=스마트 카드 리ë”ì— ì ‘ê·¼ì´ í—ˆìš©ë˜ì§€ 않습니다\n카드 리ë”를 연결하고, 스마트 카드를 삽입 후, ìž‘ì—…ì„ ë‹¤ì‹œ 해보세요 keyError.keySpecNotFound=ì´ë©”ì¼ ì£¼ì†Œ "%S"ê°€ ì—´ì‡ ê³ ë¦¬ì— ìžˆëŠ” 열쇠와 ì¼ì¹˜í•˜ì§€ 않습니다. keyError.keyIdNotFound=열쇠고리ì—서 열쇠 "%S" 를 ì°¾ì„ ìˆ˜ 없습니다. keyError.resolutionAction=ê³„ì •ì„¤ì •ì˜ OpenPGP섹션ì—서 ì •ìƒì ì¸ 열쇠를 ì„ íƒí•˜ì‹­ì‹œì˜¤. missingPassphrase=암호문구 분실 errorHandling.gpgAgentInvalid=ì´ ì‹œìŠ¤í…œì´ ì‚¬ìš©í•˜ëŠ” gpgì—ì´ì „트가 GnuPG시스템과 ë²„ì „ì´ ë§žì§€ 않습니다. errorHandling.gpgAgentError=GPGì—ì´ì „트와 GnuPGê°€ 통신과정ì—서 ì—러가 ë°œìƒí•˜ì˜€ìŠµë‹ˆë‹¤. errorHandling.dirmngrError=GnuPG와 dirmngrê°€ 통신과정ì—서 ì—러가 ë°œìƒí•˜ì˜€ìŠµë‹ˆë‹¤. errorHandling.pinentryError=GnuPGê°€ pinentry를 ì´ìš©í•˜ì—¬ 암호문구를 ì°¾ì„ ìˆ˜ 없습니다. errorHandling.readFaq=시스템 ì…‹ì—…ê³¼ 설정과정ì—서 ì—러가 ë°œìƒí•˜ì—¬ ì—니그메ì¼ì´ ì •ìƒê°€ë™í•˜ì§€ 않고 있으며 ìžë™ì ìœ¼ë¡œ íšŒë³µë  ìˆ˜ 없습니다. \n\në‹¤ìŒ ì‚¬ì´íЏ https://enigmail.net/faq.를 참고하시기 ë°”ëžë‹ˆë‹¤. gpgNotFound=GnuPG 프로그램 '%S'ì„ ì°¾ì„ ìˆ˜ 없습니다.\nì—ë‹ˆê·¸ë©”ì¼ ì„¤ì •ì—서 GnuPG 실행 경로를 올바르게 설정 í•´ 주세요. gpgNotInPath=ì´ ê²½ë¡œì—서 GnuPG 실행파ì¼ì„ ì°¾ì„ ìˆ˜ 없습니다.\nì—ë‹ˆê·¸ë©”ì¼ ì„¤ì •ì—서 GnuPG 실행 경로를 올바르게 설정 í•´ 주세요. enigmailNotAvailable=ì—ë‹ˆê·¸ë©”ì¼ ì½”ì–´ 서비스는 사용할 수 없습니다. prefGood=%S ì˜ ì˜¬ë°”ë¥¸ 서명 prefBad=%S ì˜ ìž˜ëª»ëœ ì„œëª… failCancel=ì—러 - 사용ìžì— ì˜í•´ 키 받기가 취소 ë˜ì—ˆìŠµë‹ˆë‹¤ failNoServer=ì—러 - 키를 받아올 키 서버가 지정ë˜ì§€ 않았습니다 failNoID=ì—러 - ë°›ì„ í‚¤ì˜ IDê°€ 지정ë˜ì§€ 않았습니다 failKeyExtract=ì—러 - 키 추출 명령 실패 notFirstBlock=ì—러 - 첫 OpenPGP 블ë¡ì´ 공개키가 아닙니다 importKeyConfirm=ë©”ì‹œì§€ì— ë“¤ì–´ìžˆëŠ” 키를 가져오겠습니까? failKeyImport=ì—러 - 키 가져오기 실패 fileWriteFailed=íŒŒì¼ %S 로 쓰기 실패 importKey=키 서버ì—서 공개키 %S 를 가져오기: uploadKey=키 ì„œë²„ì— ê³µê°œí‚¤ %S 를 보내기: keyId=키 ID keyAndSigDate=키 ID: 0x%S / %S ì— ì„œëª…ë¨ keyFpr=키 지문: %S noEmailProvided=ì „ìž ë©”ì¼ ì£¼ì†Œë¥¼ 입력하지 않았습니다! keyAlreadySigned=해당 키는 ì´ë¯¸ 서명ë˜ì–´ 있습니다. 중복 서명할 수 없습니다. ##################################################################### # Strings used in enigmailKeySelection.js ##################################################################### selKeyExpired=ë§Œë£Œëœ %S createdHeader=ìƒì„±ë¨: atLeastOneKey=키가 ì„ íƒë˜ì§€ 않았ìŒ! ì ì–´ë„ í•˜ë‚˜ì˜ í‚¤ëŠ” ì„ íƒí•´ì£¼ì…”야 합니다 fewerKeysThanRecipients=받는 사람 수 보다 ì ì€ ìˆ˜ì˜ í‚¤ë¥¼ ì„ íƒí–ˆìŠµë‹ˆë‹¤. ì •ë§ë¡œ 암호화 í•  키 ëª©ë¡ ì„ íƒì„ ë내셨습니까? userSel.button.goBack=키를 ë” ì„ íƒ userSel.secretKeySel.title=ë©”ì‹œì§€ì— ì„œëª…í•  비밀 OpenPGP 키를 ì„ íƒ userSel.problemNoKey=ë¹„ì •ìƒ í‚¤ userSel.problemMultipleKeys=복수 키 # should be same as thunderbird ENTITY sendLaterCmd.label: sendLaterCmd.label=나중 발송 # Strings used in enigmailAttachmentDialog.js # pgpMimeNote=NOTE: PGP/MIME is not supported by all email clients. If you are unsure, select the %S option. first=1번째 second=2번째 # Strings used in am-enigprefs.js / enigmailEditIdentity.js encryptKeyHeader=ì•”í˜¸í™”ì— ì‚¬ìš©í•  OpenPGP 키 ì„ íƒ identityName=디지털 ì‹ ë¶„ì¦: %S # switchPepMode=You are currently using the 'p≡p Junior' mode of Enigmail.\n\nBy enabling OpenPGP or S/MIME for an account, you are disabling p≡p and use the 'regular' mode of Enigmail without p≡p. # enableEnigmail=&Disable p≡p # Strings used in enigmailSingleRcptSettings.js noEncryption=암호화를 활성화 했으나, 키를 ì„ íƒí•˜ì§€ 않으셨습니다. %S ì—게 보낼 ë©”ì¼ì„ 암호화하기 위해서는 키 목ë¡ì—서 키를 ì„ íƒí•´ì£¼ì…”야합니다. %S ì— ëŒ€í•˜ì—¬ 암호화를 비활성 ìƒíƒœë¡œ 하시겠습니까? noKeyToUse=(ì—†ìŒ - 암호화하지 않ìŒ) noEmptyRule=ê·œì¹™ì€ ë¹„ì–´ìžˆì„ ìˆ˜ 없습니다! 규칙 í•„ë“œì— ì „ìž ë©”ì¼ ì£¼ì†Œë¥¼ 설정해주세요. invalidAddress=입력한 ì „ìžë©”ì¼ ì£¼ì†Œê°€ 잘못ë˜ì–´ 있습니다. 받는 ì‚¬ëžŒì˜ ì´ë¦„으로 설정해서는 안ë˜ê³  ì „ìž ë©”ì¼ ì£¼ì†Œë§Œ 가능합니다. 예:\n 잘못ë¨: Some Name \n올바름: some.name@address.net # noCurlyBrackets=The curly brackets {} have a special meaning and should not be used in an email address. If you want to modify the matching behavior for this rule, use the 'Apply rule if recipient ...' option.\nMore information is available from the Help button. # Strings used in enigmailRulesEditor.js never=í•˜ì§€ì•ŠìŒ always=í•­ìƒ possible=가능 deleteRule=ì •ë§ë¡œ ì„ íƒí•œ ë£°ì„ ì‚­ì œí•©ë‹ˆê¹Œ? nextRcpt=(ë‹¤ìŒ ë°›ëŠ” 사람으로) negateRule=안 addKeyToRule=%1$S (%2$S) 키를 수신ìžë³„ ì›ì¹™ì— 추가하세요. # Strings used in enigmailSearchKey.js needOnline=ì„ íƒí•œ ê¸°ëŠ¥ì€ ì˜¤í”„ë¼ì¸ 모드ì—서는 사용할 수 없습니다. 온ë¼ì¸ì—서 다시 시ë„í•´ 주십시오. protocolNotSupported=ì„ íƒí•œ 프로토콜 '%S://'는 OpenPGP 키 다운로드를 ì§€ì›í•˜ì§€ 않습니다. gpgkeysDisabled='extensions.enigmail.useGpgKeysTool' ì˜µì…˜ì„ í™œì„±í™” 하면 ë„ì›€ì´ ë  ê²ƒ 같습니다. noKeyserverConn=키 서버 %S ì— ì ‘ì† í•  수 없습니다. keyDownloadFailed=키 서버ì—서 키 다운로드를 실패했습니다. ìƒíƒœ 메시지:\n%S internalError=ë‚´ë¶€ 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤. 키가 다운로드ë˜ê±°ë‚˜ 가져오기할 수 없었습니다. noKeyFound=죄송합니다. ì§€ì •ëœ ê²€ìƒ‰ ê¸°ì¤€ì— ì¼ì¹˜í•˜ëŠ” 키를 ì°¾ì„ ìˆ˜ 없었습니다.\n키 ID는 ì•žìª½ì— \\"0x\\"ê°€ 붙어야만 함 (예:0xABCDEF12)ì„ ì£¼ì˜í•´ì£¼ì„¸ìš”. # keyDownload.keyUnavailable=We are sorry, but the key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their key by email. # gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. gpgKeysFailed=키 서버ì—서 검색 í˜¹ì€ ë‹¤ìš´ë¡œë“œì— ì‹¤íŒ¨: gpgkeys_%S 는 ì‹¤í–‰ë  ìˆ˜ 없었습니다. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=ì†Œìœ ìž ì‹ ë¢° 설정 실패 # Strings in enigmailSignKeyDlg.js signKeyFailed=키 서명 실패 alreadySigned.label=주ì˜: %S 키는 ì´ë¯¸ ì„ íƒí•œ 비밀키로 서명ë˜ì–´ 있습니다. alreadySignedexportable.label=참고사항: %S 열쇠는 ì„œëª…ì„ ë§ˆì³¤ê³  ì„ íƒí•œ ê°œì¸í‚¤ì™€ 함께 반출할 수 있습니다. 로컬 ì„œëª…ì€ ë…¼ë¦¬ìƒ ë§žì§€ 않습니다. partlySigned.label=유ì˜ì‚¬í•­: %S í‚¤ì˜ ì‚¬ìš©ìž ì•„ì´ë””ê°€ 다른 비밀키로 ì´ë¯¸ 서명ë˜ì—ˆìŠµë‹ˆë‹¤. noTrustedOwnKeys=ì„œëª…ì— ì‚¬ìš©í•  열쇠를 ì°¾ì„ ìˆ˜ 없습니다. ì„œëª…ì„ í•˜ë ¤ë©´ ì‹ ë¢°ìˆ˜ì¤€ì´ ë†’ì€ ê°œì¸í‚¤ê°€ 하나 있어야 합니다. # Strings in enigmailKeyManager.js keyMan.loadingKeys=키를 불러오는 중, 잠시만 기다려주세요 ... keyValid.unknown=ì•Œìˆ˜ì—†ìŒ keyValid.invalid=무효 keyValid.disabled=비활성 keyValid.revoked=íê¸°ë¨ keyValid.expired=ë§Œë£Œë¨ keyValid.noSubkey=유효한 서브키 ì—†ìŒ keyTrust.untrusted=신뢰안함 keyTrust.marginal=최소 keyTrust.full=ì¶©ë¶„ keyTrust.ultimate=완전 keyTrust.group=(그룹) keyType.public=공개 keyType.publicAndSec=공개/비밀 keyMan.enableKey=키 활성 keyMan.disableKey=키 비활성 userAtt.photo=ì‚¬ìš©ìž ì†ì„± (JPEG ì´ë¯¸ì§€) asciiArmorFile=보호형 ASCII íŒŒì¼ (*.asc) importKeyFile=OpenPGP 키 íŒŒì¼ ë°˜ìž… gnupgFile=GnuPG íŒŒì¼ # createKeyOK=Your Key has been generated saveRevokeCertAs=í기 ì¦ëª…서 ìƒì„± & 저장 # revokeCertOK=The revocation certificate has been successfully created. You can use it to invalidate your public key, e.g. in case you would lose your secret key. revokeCertFailed=í기 ì¦ëª…서가 ìƒì„±ë˜ì§€ 않았습니다. addUidOK=ì‚¬ìš©ìž ID 추가 성공 addUidFailed=ì‚¬ìš©ìž ID 추가 실패 noKeySelected=ì„ íƒí•œ ìž‘ì—…ì„ ì‹¤í–‰í•˜ë ¤ë©´ ì ì–´ë„ í•˜ë‚˜ì˜ í‚¤ë¥¼ ì„ íƒí•´ 주셔야 합니다 exportToFile=파ì¼ë¡œ 공개키 내보내기 exportKeypairToFile=비밀키와 공개키를 파ì¼ë¡œ 반출. exportSecretKey=저장한 OpenPGP 키 파ì¼ì— 비밀키를 í¬í•¨ì‹œí‚¤ê² ìŠµë‹ˆê¹Œ? saveKeysOK=키가 성공ì ìœ¼ë¡œ 저장ë˜ì—ˆìŠµë‹ˆë‹¤ saveKeysFailed=키 저장하기 실패 importKeysFailed=키 ê°€ì ¸ì˜¤ê¸°ì— ì‹¤íŒ¨ enableKeyFailed=키 활성화/비활성화 실패 specificPubKeyFilename=%S (0x%S) pub specificPubSecKeyFilename=%S (0x%S) pub-sec defaultPubKeyFilename=ë°˜ì¶œëœ ê³µê°œí‚¤ defaultPubSecKeyFilename=ë°˜ì¶œëœ ê³µê°œí‚¤ì™€ 비밀키 noSecretKeys=비밀키가 발견ë˜ì§€ 않습니다.\n\n지금 ë³¸ì¸ ì†Œìœ ê°€ ë  í‚¤ë¥¼ ìƒì„±í•˜ì‹œê² ìŠµë‹ˆê¹Œ? sendKeysOk=키 보내기 성공 sendKeysFailed=키 보내기 실패 receiveKeysOk=키 ì—…ë°ì´íЏ 성공 receiveKeysFailed=키 다운로드 실패 importFromClip=í´ë¦½ë³´ë“œì—서 키를 가져오시겠습니까? importFromUrl=ì´ URLì—서 공개키를 다운로드: copyToClipbrdFailed=ì„ íƒí•œ 키를 í´ë¦½ë³´ë“œì— 복사할 수 없습니다. copyToClipbrdOK=í´ë¦½ë³´ë“œì— 키 ë³µì‚¬ë¨ deleteSecretKey=ê²½ê³ ï¼šë‹¹ì‹ ì€ ë¹„ë°€í‚¤ë¥¼ 삭제하려고 하고 있습니다!\në‹¹ì‹ ì˜ ë¹„ë°€í‚¤ë¥¼ ì‚­ì œí–ˆì„ ê²½ìš°, 해당 키로 ì•”í˜¸í™”ëœ ëª¨ë“  메시지를 복호화 í•  수 없으며, 당신 키를 íì§€í•˜ëŠ”ë° í•„ìš”í•œ íì§€ ì¸ì¦ì„œë„ ë”는 만들 수 없습니다.\n\nì •ë§ë¡œ 비밀키와 공개키 양쪽 모ë‘를 삭제합니까?\n'%S' deleteMix=ê²½ê³ ï¼šë‹¹ì‹ ì€ ë¹„ë°€í‚¤ë¥¼ 삭제하려고 하고 있습니다!\në‹¹ì‹ ì˜ ë¹„ë°€í‚¤ë¥¼ ì‚­ì œí–ˆì„ ê²½ìš°, 해당 키로 ì•”í˜¸í™”ëœ ëª¨ë“  메시지를 복호화 í•  수 없습니다.\n\nì •ë§ë¡œ 비밀키와 공개키 양쪽 모ë‘를 삭제합니까? deletePubKey=공개키를 삭제합니까?\n'%S' deleteSelectedPubKey=공개키를 삭제합니까? deleteKeyFailed=키가 ì‚­ì œë˜ì§€ 않았습니다. revokeKeyQuestion='%S'키를 취소하려고 합니다.\n\nì´ í‚¤ë¡œ ë” ì´ìƒ 서명 ìž‘ì—…ì„ ìˆ˜í–‰í•  수 없습니다. ì¼ë‹¨ ë°˜í¬í•˜ë©´ ìƒëŒ€ë°©ì´ ì´ í‚¤ë¡œ 암호화할 수 없습니다. 예전 메시지를 복호화할 수는 있습니다. \n\nê³„ì† ì§„í–‰í•˜ì‹œê² ìŠµë‹ˆê¹Œ?\n revokeKeyOk=키가 íì§€ë˜ì—ˆìŠµë‹ˆë‹¤. 만약 키 ì„œë²„ì— ë‹¹ì‹ ì˜ ê³µê°œí‚¤ê°€ 있다면, 다시 업로드하시기를 권장합니다. 그렇게 해주면 다른 ì‚¬ëžŒë“¤ì´ í•´ë‹¹ 키가 íì§€ëœ ê²ƒì„ ì•Œ 수 있습니다. revokeKeyFailed=키가 íì§€ë  ìˆ˜ 없습니다. # revokeKeyNotPresent=You have no key (0x%S) which fits to this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before the revocation certificate! # revokeKeyAlreadyRevoked=The key 0x%S has already been revoked. refreshAllQuestion=키를 í•˜ë‚˜ë„ ì„ íƒí•˜ì§€ 않았습니다. 모든 키를 새로고칠까요? # refreshKeyServiceOn.warn=Warning: Your keys are currently being refreshed in the background as safely as possible.\nRefreshing all your keys at once will unnecessarily reveal information about you.\nDo you really want to do this? refreshKey.warn=경고: í‚¤ì˜ ê°¯ìˆ˜ë‚˜ 회선 ì†ë„ì—ë”°ë¼, 모든 키 ìƒˆë¡œê³ ì¹¨ì€ ìƒë‹¹í•œ ì‹œê°„ì´ ê±¸ë¦¬ëŠ” ìž‘ì—…ì´ ë  ìˆ˜ 있습니다! downloadContactsKeys.warn=유ì˜ì‚¬í•­: ì„ íƒí•œ ì—°ë½ì²˜ì˜ 수와 통신ì†ë„ì— ë”°ë¼ í‚¤ë¥¼ 다운로드하는 ì‹œê°„ì´ ìƒë‹¹ížˆ 길 수 있습니다!\n downloadContactsKeys.importFrom='%S' 주소ë¡ì—서 ì—°ë½ì²˜ë¥¼ 반입할까요? keyMan.button.exportSecKey=비밀키 내보내기(&E) keyMan.button.exportPubKey=공개키만 내보내기(&P) keyMan.button.import=가져오기(&I) keyMan.button.refreshAll=모든 키 새로고침(&R) keyMan.button.revokeKey=키 í기(&R) keyMan.button.skip=키 건너뜀 &S keylist.noOtherUids=다른 ì‹ ì›ì´ ì—†ìŒ keylist.hasOtherUids=별명: keylist.noPhotos=사진 ì—†ìŒ keylist.hasPhotos=사진 keyMan.addphoto.filepicker.title=추가하려는 ì‚¬ì§„ì„ ì„ íƒí•˜ì„¸ìš”. keyMan.addphoto.warnLargeFile=ì„ íƒí•œ 파ì¼ì´ 25 kBì´ìƒìž…니다.\n첨부한 파ì¼ì´ 너무 í¬ë©´ í‚¤ì˜ í¬ê¸°ê°€ 커지는 문제가 ë°œìƒí•˜ë¯€ë¡œ 권장하지 않습니다. keyMan.addphoto.noJpegFile=ì„ íƒí•œ 파ì¼í˜•ì‹ì´ JPEG ê°€ 아닌 것 같습니다. 다른 파ì¼ì„ ì„ íƒí•˜ì„¸ìš”. keyMan.addphoto.failed=ì‚¬ì§„ì´ ì¶”ê°€ë˜ì§€ 않았습니다. # noWksIdentity=The key %S does not have a WKS identity. # keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key "%1$S (%2$S)" for encrypting messages? # keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key "%1$S (%2$S)" for future messages? # keyman.addBlacklistKey.button=&Blacklist the key # keyman.removeBlacklistKey.button=&Remove key from Blacklist # Strings in enigmailManageUidDlg.xul changePrimUidFailed=주 ì‚¬ìš©ìž ID 변경 실패 changePrimUidOK=주 ì‚¬ìš©ìž ID 변경 성공 revokeUidFailed=ì‚¬ìš©ìž ID %S íì§€ 실패 revokeUidOK=ì‚¬ìš©ìž ID %S íì§€ 성공. 만약 키 ì„œë²„ì— ë‹¹ì‹ ì˜ ê³µê°œí‚¤ê°€ 있다면, 다시 업로드하시기를 권장합니다. 그렇게 해주면 다른 ì‚¬ëžŒë“¤ì´ í•´ë‹¹ 키가 íì§€ëœ ê²ƒì„ ì•Œ 수 있습니다. revokeUidQuestion=ì •ë§ë¡œ 유저 ID %S 를 í지합니까? # Strings in enigmailKeyImportInfo.xul importInfoTitle=키 반입 성공! importInfoBits=비트 importInfoCreated=ìƒì„±ì™„료 importInfoFpr=지문 importInfoDetails=(ìƒì„¸) importInfoNoKeys=ë°˜ìž…ëœ ì—´ì‡  ì—†ìŒ. # Strings in enigmailKeyDetailsDlg.xul keyTypePublic=공개 키 keyTypePrimary=주 키 keyTypeSubkey=서브키 keyTypePair=키 ìŒ keyExpiryNever=무기한 keyAlgorithm_1=RSA keyAlgorithm_2=RSA keyAlgorithm_3=RSA keyAlgorithm_16=ELG keyAlgorithm_17=DSA keyAlgorithm_18=타ì›ê³¡ì„ ë””피헬만 알고리즘 keyAlgorithm_19=타ì›ê³¡ì„ ì „ìžì„œëª… 알고리즘 keyAlgorithm_20=ELG keyAlgorithm_22=타ì›ê³¡ì„ ì „ìžì„œëª…알고리즘 keyUsageEncrypt=암호화 keyUsageSign=서명 keyUsageCertify=ì¸ì¦ keyUsageAuthentication=허가하기 keyDoesNotExpire=열쇠유효기간 ì´ë‚´ # Strings in enigmailGenCardKey.xul keygen.started=잠시 기다려 주십시오. 키가 ìƒì„±ë˜ê³  있습니다... keygen.completed=키가 ìƒì„±ë˜ì—ˆìŠµë‹ˆë‹¤. 새로운 키 ID: 0x%S keygen.keyBackup=%S 로 키를 백업 ë¨ keygen.passRequired=스마트 카드가 아닌 다른 ì €ìž¥ìž¥ì¹˜ì— ë°±ì—…ì„ ìƒì„±í•˜ë ¤ë©´, 패스프레ì´ì¦ˆë¥¼ 지정해 주세요. # Strings in enigmailSetCardPin.xul cardPin.processFailed=PIN 변경 실패 # Strings in enigRetrieveProgres.xul keyserverProgress.refreshing=키 새로고침 중, 잠시 기다려 주십시오 ... keyserverProgress.uploading=키 업로드 중, 잠시 기다려 주십시오 ... # keyserverProgress.wksUploadFailed=Could not upload your key to the Web Key Service # keyserverProgress.wksUploadCompleted=Your public key was successfully submitted to your provider. You will receive an email to confirm that you initiated the upload. keyserverTitle.refreshing=키 새로고침 keyserverTitle.uploading=키 업로드 # Strings in enigmailSetupWizard passphrase.min8keys=패스프레ì´ì¦ˆê°€ 최소 8 ìžëŠ” ë˜ì–´ì•¼í•©ë‹ˆë‹¤! setupWizard.reallyCancel=ì •ë§ë¡œ Enigmail 설정 마법사를 닫으시겠습니까? setupWizard.invalidGpg=GnuPG 실행파ì¼ì´ 아닙니다. 다른 파ì¼ì„ ì„ íƒí•˜ì„¸ìš”. setupWizard.specifyFile=계ì†í•˜ë ¤ë©´ 공개키 파ì¼ì„ 지정해야합니다. setupWizard.installFailed=설치가 실패한 것 같습니다. 다시 설치하거나 GnuPG를 수작업으로 설치한 ë‹¤ìŒ ë¸Œë¼ìš°ì¦ˆ 버튼으로 해당 í”„ë¡œê·¸ëž¨ì„ ì§€ì •í•˜ì„¸ìš”. # setupWizard.downloadForbidden=For your own security, we will not download GnuPG. Please visit https://gnupg.org/ in order to download GnuPG. # setupWizard.downloadImpossible=We cannot download GnuPG currently. Please try later or visit https://gnupg.org/ in order to download GnuPG. setupWizard.hashSumError=마법사가 다운로드한 파ì¼ì´ ì •ìƒì¸ì§€ ê²€ì¦í•  수 없습니다. 파ì¼ì´ 파ì†ë˜ì—ˆê±°ë‚˜ 오ì†ëœ 것 같습니다. ê·¸ëž˜ë„ ì„¤ì¹˜ìž‘ì—…ì„ ê³„ì†í•˜ì‹œê² ìŠµë‹ˆê¹Œ? setupWizard.importSettingsFile=ì ìž¬í•  백업파ì¼ì„ 지정하시오 setupWizard.invalidSettingsFile=지정한 파ì¼ì´ ì •ìƒì ì¸ ì—ë‹ˆê·¸ë©”ì¼ ì…‹ì—…ë°±ì—…íŒŒì¼ì´ 아님 setupWizard.gpgConfExists=GnuPG 구성파ì¼ì´ ì´ë¯¸ 있습니다. 과거 설치과정ì—서 만든 구성파ì¼ë¡œ ë§ì“°ê¸° 할까요? # setupWizard.noGpgHomeDir=It appears that you configured %S to use for GnuPG. However, this is not a directory - you cannot use it. # setupWizard.unmachtedIds=The following identities of your old setup could not be matched:\n%S\nThe settings for these identities were skipped. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=GnuPG다운로드 과정ì—서 ì—러가 ë°œìƒí–ˆìŠµë‹ˆë‹¤. 콘솔로그를 ì´ìš©í•˜ì—¬ ìžì„¸í•œ ë‚´ìš©ì„ ì ê²€í•˜ì„¸ìš”. installGnuPG.installFailed=GnuPG설치과정ì—서 ì—러가 ë°œìƒí–ˆìŠµë‹ˆë‹¤.콘솔로그를 ì´ìš©í•˜ì—¬ ìžì„¸í•œ ë‚´ìš©ì„ ì ê²€í•˜ì„¸ìš”. # Strings in enigmailAddUidDlg.xul addUidDlg.nameOrEmailError=ì´ë¦„ê³¼ ì „ìž ë©”ì¼ ì£¼ì†ŒëŠ” 반드시 입력해야 함 addUidDlg.nameMinLengthError=ì´ë¦„ì€ ìµœì†Œí•œ 5글ìž(5 bytes)ì´ìƒ ì´ì–´ì•¼ 함 addUidDlg.invalidEmailError=유효한 ì „ìž ë©”ì¼ ì£¼ì†Œë¥¼ 지정해야 함 # Strings in enigmailCardDetails.js Carddetails.NoASCII=OpenPGP 스마트카드는ì´ë¦„난ì—는 ASCII 문ìžë§Œ 허용합니다. # network error types errorType.SecurityCertificate=웹서비스가 제시한 보안ì¸ì¦ì„œê°€ 비정ìƒìž…니다. errorType.SecurityProtocol=웹서비스가 사용하는 보안 í”„ë¡œí† ì½œì„ ì•Œ 수 없습니다. errorType.Network=ë„¤íŠ¸ì›Œí¬ ì—러가 ë°œìƒí•˜ì˜€ìŠµë‹ˆë‹¤. # filter stuff filter.folderRequired=타켓 í´ë”를 ì„ íƒí•˜ì„¸ìš”. filter.decryptMove.label=(ì—니그메ì¼) ì˜êµ¬ 복호화 filter.decryptCopy.label=(ì—니그메ì¼) 복호화 사본 ìƒì„± filter.decryptMove.warnExperimental=ì£¼ì˜ - "ì˜êµ¬ížˆ 복호화" í•„í„°ê°€ ìž‘ë™í•˜ë©´ 메시지가 파ì†ë  수 있습니다. \n\n처ìŒì—는" 보호화사본ìƒì„±"ì„ ì„ íƒí•˜ê³  ê·¸ 결과를 잘 ì ê²€í•©ë‹ˆë‹¤. 그다ìŒì— ì˜êµ¬ížˆ 복호화 필터를 ì ìš©í•˜ê¸°ë¥¼ 권합니다. # filter.tempPepFilterDesc=Temporary filter to store sent message unencrypted # filter.term.pgpencrypted.label=OpenPGP Encrypted # filter.encrypt.label=Encrypt to key (Enigmail) # filter.keyRequired=You must select a recipient key. # filter.keyNotFound=Could not find an encryption key for "%S". # filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for "%S" you will no longer be able to read the emails. # strings in enigmailConvert.jsm converter.decryptBody.failed=제목: "%S" 메시지를 복호화할 수 없습니다.\n다른 암호문구를 사용하시겠습니까? 아니면 ì´ ë©”ì‹œì§€ëŠ” 건너 뛸까요? converter.decryptAtt.failed=ì œëª©ì´ "%2$S"ì¸ ë©”ì‹œì§€ì˜ ì²¨ë¶€íŒŒì¼ "%1$S"ì„ ë³µí˜¸í™”í•  수 없습니다. \n.\n다른 암호문구를 사용하시겠습니까 아니면 ì´ ë©”ì‹œì§€ë¥¼ 건너뛸까요? saveLogFile.title=ë¡œê·¸íŒŒì¼ ì €ìž¥ # strings in gpg.jsm unknownSigningAlg=서명알고리즘(ID: %S)ì„ ì•Œì§€ 못함. unknownHashAlg=암호해쉬알고리즘 (ID: %S)ì„ ì•Œì§€ 못함. # strings in keyRing.jsm keyring.photo=사진 keyRing.pubKeyRevoked=%1$S 열쇠(키아ì´ë”” %2$S)ê°€ 취소ë˜ì—ˆìŒ. keyRing.pubKeyExpired=%1$S 열쇠(키아ì´ë”” %2$S)ê°€ 만료ë˜ì—ˆìŒ. keyRing.pubKeyNotForSigning=%1$S 열쇠(키아ì´ë”” %2$S)를 ì„œëª…ìž‘ì—…ì— ì‚¬ìš©í•  수 ì—†ìŒ. keyRing.pubKeyNotForEncryption=%1$S 열쇠(키아ì´ë”” %2$S)를 ì•”í˜¸í™”ìž‘ì—…ì— ì‚¬ìš©í•  수 ì—†ìŒ.. keyRing.keyDisabled=%1$S 열쇠(키아ì´ë”” %2$S)는 사용불가. 열쇠를 사용할 수 ì—†ìŒ. keyRing.keyNotTrusted=%1$S 열쇠(키아ì´ë”” %2$S)는 신뢰할 수 ì—†ìŒ. ì„œëª…ìž‘ì—…ì— ì‚¬ìš©í•  수 있ë„ë¡ ìžì‹ ì˜ 열쇠 ì‹ ë¢°ìˆ˜ì¤€ì„ "최ìƒ" 수준으로 올려야함. keyRing.keyInvalid=%1$S 열쇠(키아ì´ë”” %2$S)는 무효임. (즉, ìžê°€ì„œëª…ì´ ì—†ìŒ.). keyRing.signSubKeysRevoked=%1$S 열쇠(키아ì´ë”” %2$S)ì˜ ì„œëª…ìš© ë¶€ì† ì—´ì‡ ê°€ ëª¨ë‘ ì·¨ì†Œë˜ì—ˆìŒ. keyRing.signSubKeysExpired=%1$S 열쇠(키아ì´ë”” %2$S)ì˜ ì„œëª…ìš© ë¶€ì† ì—´ì‡  ìœ íš¨ê¸°ê°„ì´ ëª¨ë‘ ë§Œë£Œë˜ì—ˆìŒ keyRing.signSubKeysUnusable=%1$S 열쇠(키아ì´ë”” %2$S)ì˜ ë¶€ì† ì—´ì‡ ê°€ ëª¨ë‘ ì·¨ì†Œ, 만기등으로 서명 불가ìƒíƒœìž„. keyRing.encSubKeysRevoked=%1$S 열쇠(키아ì´ë”” %2$S)ì˜ ì•”í˜¸í™”ìš© ë¶€ì† ì—´ì‡ ê°€ 모ë‘취소ë˜ì—ˆìŒ. keyRing.encSubKeysExpired=%1$S 열쇠(키아ì´ë”” %2$S)ì˜ ì•”í˜¸í™”ìš© ë¶€ì† ì—´ì‡ ê°€ ëª¨ë‘ ìœ íš¨ê¸°ê°„ 만료ë˜ì—ˆìŒ. keyRing.noSecretKey=ì—´ì‡ ê³ ë¦¬ì— %1$S 열쇠(키아ì´ë”” %2$S)ì˜ ë¹„ë°€ì—´ì‡ ê°€ ì—†ìŒ.ì´ ì—´ì‡ ë¡œëŠ” ì„œëª…ì„ í•  수 ì—†ìŒ. keyRing.encSubKeysUnusable=%1$S 열쇠(키아ì´ë”” %2$S)ì˜ ë¶€ì† ì—´ì‡ ê°€ ëª¨ë‘ ì·¨ì†Œ, 만기등으로 암호화 불가ìƒíƒœìž„. #strings in exportSettingsWizard.js cannotWriteToFile='%S'파ì¼ì„ 저장할 수 ì—†ìŒ. 다른 파ì¼ì„ ì„ íƒí•˜ì„¸ìš”. dataExportError=ë°ì´í„°ë¥¼ 반출하는 과정ì—서 ì—러가 ë°œìƒí•˜ì˜€ìŠµë‹ˆë‹¤. enigmailSettings=ì—ë‹ˆê·¸ë©”ì¼ ì…‹íŒ… defaultBackupFileName=ì—ë‹ˆê·¸ë©”ì¼ ë°˜ì¶œ specifyExportFile=반출할 íŒŒì¼ ì´ë¦„ 지정 homedirParamNotSUpported=--homedir ì´ë‚˜ --keyring 와 ê°™ì´ íŒ¨ì“°ë¥¼ 구성하는 추가 매개변수는 시스템셋팅 ì •ë³´ 반출ì´ë‚˜ 반입작업ì—서 ì§€ì›ë˜ì§€ 않습니다. 환경변수GNUPGHOME 를 사용하는 것과 ê°™ì€ ë‹¤ë¥¸ ë°©ë²•ì„ ì‚¬ìš©í•˜ì„¸ìš”. #strings in expiry.jsm expiry.keyExpiresSoon=사용하는 열쇠 %1$S ì˜ ìœ íš¨ê¸°ê°„ì´ %2$S ì¼ ì´ë‚´ì— 만료ë©ë‹ˆë‹¤..\n\n열쇠 한ìŒì„ 새로 ìƒì„±í•œ ë‹¤ìŒ ê´€ë ¨ ê³„ì •ì— ìƒˆ 열쇠를 ì´ìš©í•˜ê¸°ë¥¼ 권합니다. # expiry.keysExpireSoon=The following of your keys will expire in less than %1$S days:\n%2$S We recommend that you create new keys and configure your accounts to use the new keys. # expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to ultimate in key properties. # expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to ultimate in key properties. # expiry.OpenKeyManager=Open Enigmail Key Management # expiry.OpenKeyProperties=Open Key Properties #strings in pEpDecrypt.jsm # pEpDecrypt.cannotDecrypt=This is an encrypted message. Unfortunately you don't have the secret key to decrypt the message. #strings in gpgAgent.jsm # gpghomedir.notexists=The directory '%S' containing your OpenPGP keys does not exist and cannot be created. # gpghomedir.notwritable=The directory '%S' containing your OpenPGP keys is not writable. # gpghomedir.notdirectory=The directory '%S' containing your OpenPGP keys is a file instead of a directory. # gpghomedir.notusable=Please fix the directory permissions or change the location of your GnuPG "home" directory. GnuPG cannot work correctly otherwise. #strings in pepTrustWords.js # pepTrustWords.cannotVerifyOwnId=Cannot verify p≡p Trustwords for own account. # pepTrustWords.cannotFindKey=Cannot find key for %S. # pepTrustWords.cannotStoreChange=Could not change trust for %S. # pepTrustWords.generalFailure=Cannot obtain trustwords for %S. # pepTrustWords.partnerFingerprint=Fingerprint for %S: #strings in mimeWkdHandler.jsm # wkdMessage.body.req=Your email provider processed your request to upload your public key to the OpenPGP Web Key Directory.\n\nPlease click the confirmation button in the Enigmail header to complete the publishing of your public key. # wkdMessage.body.process=This is an email related to the automatic processing to upload your public key to the OpenPGP Web Key Directory.\n\nYou do not need to take any manual action at this point. #strings in pepHandshake.js # pepPrivacyStatus.RatingBrokenSuggestion=Either you or the sender should resend the message. # pepPrivacyStatus.RatingHaveNoKeySuggestionOutgoing=If you composed this message, your key is not available. # pepPrivacyStatus.RatingMistrustSuggestion=Re-establish the connection with your communication partner and try to complete another handshake. # pepPrivacyStatus.RatingReliableSuggestion=Complete a handshake with your communication partner by exchanging trustwords in person or over the phone. A handshake is needed only once per partner and will ensure secure and trusted communication. # pepPrivacyStatus.RatingTrustedSuggestion=No action needed! # pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware this message may not be secure. # pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Please add the necessary information. # pepPrivacyStatus.RatingUnderAttackSuggestion=Separately verify the content of this message with your communication partner. # pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least secure. # pepPrivacyStatus.RatingUnencryptedSuggestion=Please ask your communication partner to use an encryption solution or install p≡p. # pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or no signature. Ask your communication partner to upgrade their encryption solution or install p≡p. # pepPrivacyStatus.RatingBrokenExplanation=This message has broken encryption or formatting. # pepPrivacyStatus.RatingHaveNoKeyExplanation=This message cannot be decrypted because the key is not available. # pepPrivacyStatus.RatingMistrustExplanation=This message has a communication partner that has previously been marked as mistrusted. # pepPrivacyStatus.RatingReliableExplanation=This message is secure but you still need to verify the identity of your communication partner. # pepPrivacyStatus.RatingTrustedExplanation=This message is secure and trusted. # pepPrivacyStatus.RatingUndefinedExplanation=This message does not contain enough information to determine if it is secure. # pepPrivacyStatus.RatingUnderAttackExplanation=This message is not secure and has been tampered with. # pepPrivacyStatus.RatingUnencryptedExplanation=This message is unsecure. # pepPrivacyStatus.RatingUnencryptedForSomeExplanation=This message is unsecure for some communication partners. # pepPrivacyStatus.RatingUnreliableExplanation=This message has unreliable protection. # pepPrivacyStatus.RatingBrokenText=Broken # pepPrivacyStatus.RatingHaveNoKeyText=Cannot Decrypt # pepPrivacyStatus.RatingMistrustText=Mistrusted # pepPrivacyStatus.RatingReliableText=Secure # pepPrivacyStatus.RatingTrustedText=Secure & Trusted # pepPrivacyStatus.RatingUndefinedText=Unknown # pepPrivacyStatus.RatingUnderAttackText=Under Attack # pepPrivacyStatus.RatingUnencryptedForSomeText=Unsecure for Some # pepPrivacyStatus.RatingUnencryptedText=Unsecure # pepPrivacyStatus.RatingUnreliableText=Unreliable Security # handshakeDlg.button.initHandshake=Handshake... # handshakeDlg.button.stopTrust=Stop Trusting # handshakeDlg.button.reTrust=Stop Mistrusting # handshakeDlg.label.outgoingMessage=Outgoing message # handshakeDlg.label.incomingMessage=Incoming message # handshakeDlg.error.noPeers=Cannot handshake without any correspondents. # handshakeDlg.error.noProtection=Please enable protection in order to use the Handshake function. # enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device # enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup #strings in autocrypt.jsm # autocrypt.setupMsg.subject=Autocrypt Setup Message # autocrypt.setupMsg.msgBody=To set up your new device for Autocrypt, please follow the instuctions that should be presented by your new device. # autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code presented on your old device, and then import the contained key into your keyring. #strings in upgradeInfo.html # upgradeInfo.doctitle=What's New in Enigmail v2.0? # upgradeInfo.welcome1=Welcome to the new Enigmail version 2.0! # upgradeInfo.welcome2=The release contains a lot of new and changed features. Please take a minute to find out what's new: # upgradeInfo.encSubject.title=Encrypting the Message Subject # upgradeInfo.encSubject.desc=We developed a new method that moves the email subject into the encrypted message, and replaces the visible subject with "Encrypted Message". Once such a message is decrypted, the original subject is replaced automatically. Hiding the subject is on by default; there is a preference to turn it off if you don't like it. (Note: this feature requires the message to be sent with PGP/MIME.) # upgradeInfo.buttons.title=Changed behavior of Encrypt and Sign Buttons # upgradeInfo.buttons.desc=The Encrypt and Sign buttons in the message composer window now work for both the OpenPGP and S/MIME protocols. If both algorithms are possible, then Enigmail will try to prefer the one for which all keys are available. # upgradeInfo.autocrypt.title=Support for Autocrypt # upgradeInfo.autocrypt.desc=Enigmail now supports Autocrypt, a new standard to distribute keys as part of sent messages. Enigmail automatically imports keys from Autocrypt-compliant messages, such that over time more and more emails can be encrypted. # upgradeInfo.pEp.title=New p≡p Junior Mode (Pretty Easy Privacy) # upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. You currently need to manually install p≡p for this purpose; this will change in a future release. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. # upgradeInfo.bottom.desc=Please visit our documentation for help on using Enigmail. # pep.missingGnuPG=In order to use Enigmail/p≡p, GnuPG is required. As we could not find it, we suggest to download and install it for you. #strings in enigmailAbout.html # aboutEnigmail.tabName=About Enigmail # aboutEnigmail.title=OpenPGP support provided by Enigmail # aboutEnigmail.team=Enigmail is developed by the Enigmail Team: # aboutEnigmail.projectLeader=Lead Developer: # aboutEnigmail.usability=Usability: # aboutEnigmail.documentation=Documentation: # aboutEnigmail.testing=Testing: # aboutEnigmail.userSupport=User Support: # aboutEnigmail.localization=Localization: See the Enigmail Language Packs page # aboutEnigmail.Credits=Credits: # aboutEnigmail.origAuthor=Original author of the Enigmail extension # aboutEnigmail.icons=Icons: # aboutEnigmail.formerMembers=Former team members: # aboutEnigmail.projectHosting=Project hosting: # aboutEnigmail.licenseSupportTitle=License & Support # aboutEnigmail.license=Enigmail OpenPGP is open source and licensed under the %S # aboutEnigmail.support=Support and download is available from www.enigmail.net. enigmail-2.0.8/lang/ko/help/000077500000000000000000000000001334302754500155765ustar00rootroot00000000000000enigmail-2.0.8/lang/ko/help/compose.html000066400000000000000000000100761334302754500201350ustar00rootroot00000000000000 Enigmail Help: Message Composition

Enigmail Help

Using Enigmail when composing messages

Enigmail menu in Mail/Compose window
Sign message
Enable/Disable sending signed mail. User is notified, if signing fails.
Encrypt message

Enable/Disable encryption to all recipient(s) before sending. User is notified, if encryption fails.

If Display selection when necessary is set in Preferences -> Key Selection tab, a list of keys will pop up if there are addresses in the list of recipients for the message for whom you have no public key.

If Never display OpenPGP key selection dialog is set in Preferences -> Key Selection tab, and there are addresses in the list of recipients for the message for whom you have no public key, the message will be sent unencrypted.

Use PGP/MIME for this message
Enable/Disable the use of PGP/MIME for this message.

If you know the recipient(s) can read mail using the PGP/MIME format, you should use it.

This feature is dependent on the settings in Preferences -> PGP/MIME tab being set to Allow to use PGP/MIME or Always use PGP/MIME.

Default composition options
  • Signing/Encryption Options...: shortcut to Account Settings -> OpenPGP Options.
  • Send options...: shortcut to Preferences -> Send tab.
  • Key selection options...: shortcut to Preferences -> Key Selection tab.
  • PGP/MIME options...: shortcut to Preferences -> PGP/MIME tab.
Undo encryption

If there is a failure when actually sending mail, such as the POP server not accepting the request, Enigmail will not know about it, and the encrypted message will continue to be displayed in the Compose window. Choosing this menu item will undo the encryption/signing, reverting the Compose window back to its original text.

As a temporary fix, this option may also be used to decrypt the quoted text when replying to encrypted messages. Enigmail should automatically decrypt the quoted message, but if that fails for some reason, you can use this menu item to force it.

Insert public key
insert ASCII-armored public key block at the current cursor location in the Compose window. You will be prompted for the email addresses of the key(s) to be inserted. Keys inserted in this manner will automatically be recognized at the receiving end by Enigmail. After key insertion, you may still choose to sign/encrypt the mail as needed. Also, do not insert more than one key block in a message; just specify multiple email addresses, separated by commas or spaces, when prompted.
Clear save passphrase
Clears cached passphrase. Useful if you have multiple passphrases.
Help
Displays Help information from the website (this page).

Further help is available on the Enigmail Help web page

enigmail-2.0.8/lang/ko/help/editRcptRule.html000066400000000000000000000140101334302754500210660ustar00rootroot00000000000000 Enigmail ë„움ë§: OpenPGP 규칙 편집하기

Enigmail ë„움ë§

Enigmail 규칙 편집기 사용하기: OpenPGP 규칙 편집하기

규칙 편집기ì—서는 받는 사람별로 암호화, 서명 그리고 PGP/MIME í™œì„±í™”ì— ëŒ€í•œ 기본 ë°©ì¹¨ì„ ì •í•  수 있으며, ì–´ë–¤ OpenPGP 키를 사용할지를 지정할 수 있습니다. ì´ ëŒ€í™”ìƒìžì—서는 한 ì‚¬ëžŒì˜ ë°›ëŠ” 사람 그리고 매우 유사한 방법으로 받는 사람 ê·¸ë£¹ì— ëŒ€í•˜ì—¬ ê·œì¹™ì„ ì§€ì •í•  수 있습니다.

OpenPGP 규칙 설정 대ìƒ

받는 ì‚¬ëžŒì˜ ì „ìž ë©”ì¼ ì£¼ì†Œê°€ (ì´ë¦„ì„ ì œì™¸í•˜ê³ , 예를 들어, somebody@email.domainê³¼ ê°™ì´ ì£¼ì†Œë§Œ) 들어갑니다. 여러 ê°œì˜ ì „ìž ë©”ì¼ ì£¼ì†Œë¥¼ 공백 문ìžë¡œ 구분하여 지정할 수 있습니다. 주소는 ë„ë©”ì¸ ë§Œìœ¼ë¡œë„ êµ¬ì„±í•  수 있습니다. ì´ë ‡ê²Œ 하면 ë„ë©”ì¸ì— ì†í•˜ëŠ” ì–´ë–¤ ì£¼ì†Œì™€ë„ ì¼ì¹˜í•©ë‹ˆë‹¤. 예를 들어, @email.domain ì€ body@email.domain, somebody@email.domain, anybody@emaildomain, 등과 ì¼ì¹˜í•˜ê²Œ ë©ë‹ˆë‹¤.

받는 ì‚¬ëžŒì´ ìœ„ì˜ ì£¼ì†Œì™€ ... ì¼ì¹˜í•˜ë©´ ê·œì¹™ì„ ì ìš©í•©ë‹ˆë‹¤

ì´ ì˜µì…˜ì€ ì „ìž ë©”ì¼ ì£¼ì†Œì˜ ëŒ€ì¡°ë²•ì„ ë³€ê²½í•©ë‹ˆë‹¤. 만약 ë‹¤ìˆ˜ì˜ ì£¼ì†Œê°€ ìž…ë ¥ë˜ë©´ ì„¤ì •ì€ ìž…ë ¥ëœ ëª¨ë‘ì— ëŒ€í•´ ì ìš©ë©ë‹ˆë‹¤. ì•„ëž˜ì˜ ì˜ˆëŠ” ìœ„ì˜ í•„ë“œì— OpenPGP 규칙으로 ìž…ë ¥ëœ body@email.domain 를 기준으로 한 예시입니다.

  • 정확히: ì´ë ‡ê²Œ 설정ë˜ë©´, ê·œì¹™ì€ ì „ìž ë©”ì¼ body@email.domain (완전히 ì¼ì¹˜, ëŒ€ì†Œë¬¸ìž êµ¬ë¶„ 안함)ì— ëŒ€í•´ì„œë§Œ íš¨ë ¥ì„ ë°œìƒí•©ë‹ˆë‹¤.
  • ì¼ë¶€ë¶„: ì´ë ‡ê²Œ 설정ë˜ë©´, ì§€ì •ëœ ë¬¸ìžì—´ì´ ì¼ë¶€ë¶„ í¬í•¨ë˜ì–´ 있는 ì–´ë–¤ ì „ìž ë©”ì¼ ì£¼ì†Œê°€ ì¼ì¹˜ ë©ë‹ˆë‹¤. 예를 들어, anybody@email.domain ë˜ëŠ” body@email.domain.net
  • 시작부분ì´: ì´ë ‡ê²Œ 설정ë˜ë©´, ì§€ì •ëœ ë¬¸ìžì—´ë¡œ 시작하는 ì–´ë–¤ ì „ìž ë©”ì¼ ì£¼ì†Œê°€ ì¼ì¹˜ë©ë‹ˆë‹¤. 예를 들어, body@email.domain.net, body@email.domain-name.com.
  • ë부분ì´: ì´ë ‡ê²Œ 설정ë˜ë©´, ì§€ì •ëœ ë¬¸ìžì—´ë¡œ ë나는 ì–´ë–¤ ë©”ì¼ ì£¼ì†Œê°€ ì¼ì¹˜ë©ë‹ˆë‹¤. 예를 들어, anybody@email.domain, somebody@email.domain.

ì¼ì¹˜í•˜ëŠ” ì£¼ì†Œì— ëŒ€í•´ ì´ë‹¤ìŒ 규칙으로 ê³„ì† ì§„í–‰

ì´ ê¸°ëŠ¥ì„ í™œì„±í™”í•˜ë©´ ê·œì¹™ì„ ì •ì˜í•˜ê¸´ 하지만 ë‹¤ìŒ OpenPGP í‚¤ë“¤ì„ ì‚¬ìš©: í•„ë“œì— í‚¤ ID를 지정하지 ì•Šì•„ë„ ë˜ë¯€ë¡œ, ì „ìž ë©”ì¼ ì£¼ì†ŒëŠ” 메시지를 보낼 때 키를 검사하는 ìš©ë„로 사용ë©ë‹ˆë‹¤. 그리고 ê°™ì€ ì£¼ì†Œì— ëŒ€í•´ ì¼ì¹˜í•˜ëŠ” ê·œì¹™ì´ ê³„ì† ì ìš©ë©ë‹ˆë‹¤.

ì¼ì¹˜í•˜ëŠ” ì£¼ì†Œì— ëŒ€í•´ ë”는 ê·œì¹™ì„ ê³ ë ¤í•˜ì§€ 않ìŒ

ì´ ê¸°ëŠ¥ì„ í™œì„±í™”í•˜ë©´ ì´ ê·œì¹™ì´ ì¼ì¹˜í•˜ëŠ” ì£¼ì†Œì— ëŒ€í•´ 다른 ê·œì¹™ì´ ë”는 ì ìš©ë˜ì§€ 않습니다. 다시 ë§í•´, 규칙 처리 ìž‘ì—…ì€ ë‹¤ìŒ ë°›ëŠ” 사람으로 넘어갑니다.

ë‹¤ìŒ OpenPGP í‚¤ë“¤ì„ ì‚¬ìš©:

ì•”í˜¸í™”í•˜ëŠ”ë° ì‚¬ìš©í•  받는 사람 키를 ì„ íƒí•˜ë ¤ë©´ 키 ì„ íƒ (S)... ë²„íŠ¼ì„ ì‚¬ìš©í•©ë‹ˆë‹¤. 바로 ìœ„ì˜ ë™ìž‘ê³¼ 마찬가지로 것처럼, ì¼ì¹˜ë˜ëŠ” ì£¼ì†Œì— ëŒ€í•´ ì´í›„ 다른 ê·œì¹™ì´ ì¶”ê°€ì ìœ¼ë¡œ ì ìš©ë˜ì§€ 않게ë©ë‹ˆë‹¤.

ì„œëª…ì— ëŒ€í•œ 기본 ì •ì±…

메시지 서명를 활성화 ë˜ëŠ” 비활성화 합니다. 메시지 작성 윈ë„ìš°ì—서 지정한 대로 í• ì§€, 무시하고 ì´ ê·œì¹™ì— ì„¤ì •ëœ ì •ì±…ì„ ì ìš©í• ì§€ë¥¼ 결정합니다. ì„ íƒ ê°€ëŠ¥í•œ ì •ì±…ì€ ë‹¤ìŒê³¼ 같습니다:

  • 하지 않ìŒ: 메시지 작성 윈ë„ìš°ì—서 ì„œëª…ì„ í•˜ë„ë¡ ì„ íƒ ë˜ì–´ìžˆì–´ë„ ì„œëª…ì„ í•˜ì§€ 않습니다 (다른 모든 ì •ì±…ì— ìš°ì„ í•©ë‹ˆë‹¤)
  • 예, 메시지 ìž‘ì„±ì‹œì— ì„ íƒë˜ì–´ 있는 경우: 메시지 작성 윈ë„ìš°ì—서 ì„ íƒí•œëŒ€ë¡œ 놔둡니다
  • í•­ìƒ: 메시지 작성 윈ë„ìš°ì—서 ì„œëª…ì„ í•˜ë„ë¡ ì„ íƒë˜ì–´ìžˆì§€ 않아ë„, 서명합니다

ì´ ì„œëª… ì„¤ì •ì€ ì¼ì¹˜í•˜ëŠ” 모든 ê·œì¹™ì— ì ìš©ë©ë‹ˆë‹¤. 규칙들 중 하나가 서명하기를 비활성화하면, í•­ìƒìœ¼ë¡œ ì„¤ì •í•´ë†“ì€ ë‹¤ë¥¸ ê·œì¹™ì´ ìžˆë”ë¼ë„, 메시지는 서명ë˜ì§€ 않습니다.

암호화

메시지 암호화를 활성화 ë˜ëŠ” 비활성화 합니다. 제공하는 ì •ì±…ê³¼ ê·¸ ì˜ë¯¸ëŠ” 메시지 ì„œëª…ì— ëŒ€í•œ 기본 ì •ì±…ì— ì„¤ëª…ëœ ê²ƒê³¼ 같습니다.

PGP/MIME

PGP/MIME (RFC 2156) 메시지 ì¸ì½”ë”©ì˜ ì‚¬ìš©ì—¬ë¶€ë¥¼ 활성화 ë˜ëŠ” 비활성화 합니다. PGP/MIMEê°€ 비활성화ë˜ë©´ 메시지는 "ì¸ë¼ì¸ 형ì‹"으로 ì¸ì½”딩ë©ë‹ˆë‹¤. 제공하는 ì •ì±…ê³¼ ê·¸ ì˜ë¯¸ëŠ” 메시지 ì„œëª…ì— ëŒ€í•œ 기본 ì •ì±…ì— ì„¤ëª…ëœ ê²ƒê³¼ 같습니다.

ê·œì¹™ë“¤ì€ OpenPGP 규칙 편집기 ë‚´ 목ë¡ì—서 í‘œì‹œëœ ìˆœì„œë¡œ 처리ë©ë‹ˆë‹¤. ì–´ë–¤ 한 ê·œì¹™ì´ ë°›ëŠ” 사람과 ì¼ì¹˜í•˜ê³  OpenPGP 키 ID를 í¬í•¨í•˜ëŠ” 경우, 추가ì ìœ¼ë¡œ 키 ID를 사용하려고 지정해ë„, ì´í›„ ê·œì¹™ì„ ì²˜ë¦¬í•  때 ê·¸ 받는 ì‚¬ëžŒì€ ë” ê³ ë ¤ë˜ì§€ 않습니다.


추가 ë„움ë§ì€ Enigmail 받는 사람별 설정 페ì´ì§€ì—서 ì–»ì„ ìˆ˜ 있습니다.

enigmail-2.0.8/lang/ko/help/initError.html000066400000000000000000000044301334302754500204420ustar00rootroot00000000000000 Enigmail Help: How to Resolve Problems with Initializing OpenPGP

Enigmail Help

How to Resolve Problems with Initializing OpenPGP

There are several reasons why initializing OpenPGP does not succeed. The most common ones are described below; for more information please visit the Enigmail Support page.

GnuPG could not be found

In order for OpenPGP to work, the tool GnuPG needs to be installed. If GnuPG cannot be found, then first make sure that the executable gpg.exe (on Windows; gpg on other platforms) is installed on your computer. If GnuPG is installed, and OpenPGP cannot find it, then you need to manually set the path to GnuPG in the OpenPGP Preferences (menu OpenPGP > Preferences)

Enigmime failed to initialize

OpenPGP works only if it is built using the same build environment as Thunderbird or SeaMonkey was built. This means that you can use the official Enigmail releases only if you use the official releases of Thunderbird or SeaMonkey provided by mozilla.org.

If you use a Thunderbird or SeaMonkey version coming from some other source (e.g. the provider of your Linux distribution), or if you built the application yourself, you should either use an Enigmail version built by the same source, or build Enigmail yourself. For building Enigmail, refer to the Source Code section on the Enigmail home page. Please don't file any bug report concerning this problem, it is not solvable.

Further help is available on the Enigmail Support Web Site.

enigmail-2.0.8/lang/ko/help/messenger.html000066400000000000000000000112021334302754500204500ustar00rootroot00000000000000 Enigmail ë„움ë§

Enigmail ë„움ë§

메시지를 ì½ì„ 때 Enigmail 사용하기

ë©”ì¸ ë©”ì¼ ìœˆë„ìš°ì˜ ë³µí˜¸í™” 버튼

ì´ ë²„íŠ¼ì€ ì—¬ëŸ¬ê°€ì§€ ìš©ë„로 ì‚¬ìš©ë  ìˆ˜ 있습니다: 복호화, ê²€ì¦, ë˜ëŠ” 공개키 가져오기. ì¼ë°˜ì ìœ¼ë¡œ 복화화/ê²€ì¦ì€ ìžë™ìœ¼ë¡œ ì´ë¤„지지만, ì„¤ì •ì„ í†µí•´ 비활성화 í•  수 있습니다. 그러나 실패할 경우, Enigmail ìƒíƒœ í‘œì‹œì¤„ì— ì§§ì€ ì˜¤ë¥˜ 메시지로 나타나게 ë©ë‹ˆë‹¤. 복호화 ë²„íŠ¼ì„ ëˆ„ë¥´ë©´, GnuPG 명령 í–‰ì—서 ë°œìƒë˜ëŠ” 출력 메시지를 í¬í•¨í•œ ë” ìžì„¸í•œ 오류 메시지를 ë³¼ 수 있습니다.

ë¨¸ë¦¬ë§ í‘œì‹œë¶€ì˜ íŽœê³¼ 키 ì•„ì´ì½˜

메시지 ë¨¸ë¦¬ë§ í‘œì‹œë¶€ì˜ íŒ¬ê³¼ 키 ì•„ì´ì½˜ì€ ì½ê³  있는 메시지가 서명 그리고/ë˜ëŠ” 암호화ë˜ì—ˆëŠ”ì§€ 그리고 ì„œëª…ì´ ì˜¬ë°”ë¥¸ ìƒíƒœì¸ì§€ë¥¼ (예를 들어, ì„œëª…ëœ í›„ 메시지가 변형ë˜ì§€ 않았는지 등) 나타냅니다. 만약 메시지가 변형ë˜ì—ˆìœ¼ë©´ 팬 ì•„ì´ì½˜ì€ ì„œëª…ì´ ì˜¬ë°”ë¥´ì§€ ì•Šì€ ìƒíƒœìž„ì„ í‘œì‹œí•˜ê¸° 위해 깨진 팬으로 ë°”ë€ë‹ˆë‹¤. 팬ì´ë‚˜ 키 ì•„ì´ì½˜ì—서 오른쪽 ë²„íŠ¼ì„ í´ë¦­í•˜ë©´ 다ìŒê³¼ ê°™ì€ ì˜µì…˜ì˜ ë©”ë‰´ê°€ 나타납니다:

  • OpenPGP 보안 ì •ë³´: ë©”ì‹œì§€ì— ëŒ€í•˜ì—¬ GnuPG 출력 ìƒíƒœë¥¼ ë³¼ 수 있습니다.
  • OpenPGP 보안 ì •ë³´ 복사: GnuPG 출력 ìƒíƒœë¥¼ í´ë¦½ë³´ë“œì— 복사합니다. 회신 ë©”ì‹œì§€ì— ë¶™ì—¬ë„£ê¸° ë“±ì˜ ìž‘ì—…ì— í™œìš©í•  수 있습니다.
  • OpenPGP Photo ID 보기: 공개 í‚¤ì— ì‚¬ì§„ì´ ë“¤ì–´ 있으면 메시지를 보낸 ì‚¬ëžŒì˜ Photo ID를 ë³¼ 수 있습니다. (ì´ ì˜µì…˜ì€ í‚¤ì— Photo IDê°€ 있는 경우ì—ë§Œ 활성화 ë©ë‹ˆë‹¤.)
  • S/MIME 보안 ì •ë³´: ë©”ì‹œì§€ì— ëŒ€í•œ S/MIME 보안 정보를 ë³¼ 수 있습니다.

만약 gpg.conf 파ì¼ì— keyserver-options auto-key-retrieve ì„¤ì •ì„ í•´ë†“ì§€ ì•Šì€ ìƒíƒœì—서 서명ë˜ê±°ë‚˜ ì•”í˜¸í™”ëœ ë©”ì‹œì§€ë¥¼ ì½ì–´ ë¨¸ë¦¬ë§ í‘œì‹œ ì˜ì—­ì˜ 팬 ì•„ì´ì½˜ì— 물ìŒí‘œê°€ 표시ë˜ëŠ” ê²ƒì„ ë³¼ 수 있는 경우, ë¨¸ë¦¬ë§ ì˜ì—­ì˜ Enigmail ìƒíƒœ í‘œì‹œì¤„ì€ ì„œëª…ëœ ë©”ì‹œì§€ì˜ ì¼ë¶€ë¶„; ì„¸ë¶€ì‚¬í•­ì„ ë³´ë ¤ë©´ 펜 ì•„ì´ì½˜ì„ í´ë¦­ìœ¼ë¡œ 표시하여 사용ìžì—게 알리고 메시지 êµ¬ì—­ì˜ ë©”ì‹œì§€ëŠ” 모든 OpenPGP 메시지 ë¸”ë¡ í‘œì‹œìžì™€ 서명 블ë¡ì„ 보여줄 것 입니다.

gpg.conf 파ì¼ì— keyserver-options auto-key-retrieve ì„¤ì •ì„ í•´ë†“ì€ ìƒíƒœì—서 기본 키 ì„œë²„ì— OpenPGP 키가 없는 경우ì—ë„ ì´ë ‡ê²Œ ë˜ëŠ” ê²ƒì„ ë³¼ 수 있습니다.

팬과 물ìŒí‘œ ì•„ì´ì½˜ì„ í´ë¦­í•˜ë©´ 키 ë§ì— 해당 키가 없다는 ê²ƒì„ ì•Œë ¤ì£¼ëŠ” ì°½ì´ ë‚˜íƒ€ë‚  것입니다. 확ì¸ì„ 누르면 보낸 ì‚¬ëžŒì˜ ê³µê°œí‚¤ë¥¼ 다운로드 í•  키 서버를 ì„ íƒí•  수 있는 키 서버 ëª©ë¡ ìœˆë„ìš°ê°€ 나타날 것 입니다.

사용하고ìží•˜ëŠ” 키 서버를 목ë¡ì„ 설정하려면, Enigmail → 설정 → 기본 탭으로 가셔서 키 서버 지정: ë°•ìŠ¤ì— ì½¤ë§ˆ(,)로 êµ¬ë¶„ëœ í‚¤ 서버 주소를 입력해주시기 ë°”ëžë‹ˆë‹¤. 목ë¡ì˜ 처ìŒì— 있는 키 서버가 기본으로 사용ë©ë‹ˆë‹¤.

ì•”í˜¸í™”ëœ ì²¨ë¶€ íŒŒì¼ / ì²¨ë¶€ëœ OpenPGP 키 가져오기

*.pgp, *.asc 그리고 *.gpg 확장ìžë¡œ ë˜ì–´ 있는 첨부 파ì¼ì€ Enigmailê°€ 특별히 취급할 수 있는 첨부파ì¼ë¡œì„œ ì¸ì‹ë©ë‹ˆë‹¤. 해당 첨부파ì¼ì— 오른쪽 í´ë¦­ì„ 하면 컨í…스트 ë©”ë‰´ì— ë‘ ê°€ì§€ 특수 메뉴가 활성화 ë©ë‹ˆë‹¤: 복호화 후 열기와 복호화 후 다른 ì´ë¦„으로 저장. 메시지를 열거나 저장하기 ì „ì— ì²¨ë¶€íŒŒì¼ì„ Enigmailì´ ë³µí˜¸í™”í•˜ê¸°ë¥¼ ì›í•˜ëŠ” 경우, ì´ ë‘ ë©”ë‰´ë¥¼ 사용하십시오. 첨부파ì¼ì´ OpenPGP 키 파ì¼ë¡œ ì¸ì‹ë˜ë©´, 사용ìžê°€ 키를 키 ë§ìœ¼ë¡œ 가져오기 í•  수 있ë„ë¡ í•  것입니다.


ì´í›„ ë„움ë§ì€ Enigmail OpenPGP ë„ì›€ë§ ì›¹ 페ì´ì§€ì—서 ì–»ì„ ìˆ˜ 있습니다.

enigmail-2.0.8/lang/ko/help/rulesEditor.html000066400000000000000000000060331334302754500207670ustar00rootroot00000000000000 Enigmail Help: Rules Editor

Enigmail Help

Using the Enigmail Rules Editor

In the Rules Editor, you can specify defaults per recipient for enabling encryption, signing and PGP/MIME, and to define what OpenPGP key(s) to use. Each rule consists of 5 fields and is represented on a single line:

Email
The e-mail(s) from the To:, Cc: and Bcc: fields to match. The matching works on substrings (Further details can be found in the Edit Rule dialog)
OpenPGP Key(s)
a list of OpenPGP Key ID's to use for the recipient
Sign
enable or disable message signing. This either uses or overrides what you have specified in the message composition window. The values are:
  • Never: disable signing, even if it was enabled in the message composition window (overrules the other values)
  • Possible: leave signing as specified in the message composition window
  • Always: enable signing, even if it was not enabled in the message composition window

These signing settings are applied for all rules that match. If one of the rules disables signing, the message will not be signed, regardless of other rules that specify Always.

Encrypt
enable or disable message encryption. The allowed settings and their meaning are the same as for message signing.
PGP/MIME
enable or disable the use of the PGP/MIME (RFC 3156) message encoding. If PGP/MIME is disabled, the messages are encoded using "inline PGP". The allowed values and their meaning a re the same as for message signing.

The rules are processed in the order displayed in the list. Whenever a rule matches a recipient and contains a OpenPGP Key ID, in addition to using the specified Key ID, the recipient is not considered anymore when processing further rules.

Note: The rule editor is not yet complete. It is possible to write some more advanced rules by directly editing the rules file (these rules should then not be edited anymore in the rule editor). Further information for directly editing the file is available on the Enigmail Homepage


Further help is available on the Enigmail Help web page

enigmail-2.0.8/lang/ko/help/sendingPrefs.html000066400000000000000000000047771334302754500211320ustar00rootroot00000000000000 Enigmail Help: Edit OpenPGP Rule

Enigmail Help

Defining Preferences to Send Encrypted

In the Sending Preferences you can choose the general model and preferences for encryption.

Convenient Encryption
With these settings, emails are encrypted without confirmation whenever possible.

This setup is appropriate, if you just want to improve your privacy by sending emails encyrpted instead of unencrypted if that's possible.

The effect is like sending emails as letters instead of postcards. Unlike postcards, letters usually hide their contents while in transit.

Note however that as with letters you can't be sure that nobody is opening the letter while it is in transit (although, some technical effort is necessary for that).

A concrete risk is that you accidentally use "faked keys" you got from somewhere or somebody claiming that the key belongs to the person you want to send emails to. To avoid this risk, you can either use the trust model of PGP (see below) or you should always verify, whether the fingerprint of a public key is correct.

Manual Encryption
This option allows you to specify the different preferences for encryption according to your needs. You can specify
  • whether replies to encrypted/signed emails should automatically also be encrypted/signed-
  • whether to use the trust model of OpenPGP to accept keys (this means that to use a key you either have to sign the key or have enough other people you trust having signed the key).
  • whether you want to automatically send emails encrypted if all keys are accepted.
  • whether and when you want to finally confirm sending an email.
If it is important for you that content you send encrypted can't be read by other people or organizations, you should use the manual preferences at least choose the option to accept keys only if you or other people signed them. While this model reduces the risk of using faked keys, it requires that you actively sign keys and declare owner trust using the key managament dialog. enigmail-2.0.8/lang/lt/000077500000000000000000000000001334302754500146545ustar00rootroot00000000000000enigmail-2.0.8/lang/lt/am-enigprefs.properties000066400000000000000000000001211334302754500213410ustar00rootroot00000000000000# Strings used in the Mozill AccountManager prefPanel-enigprefs=OpenPGP saugumas enigmail-2.0.8/lang/lt/enigmail.dtd000066400000000000000000001745251334302754500171540ustar00rootroot00000000000000 "Mozilla" viešąjÄ… licencijÄ… 2.0."> ""> “ nurodant el. paÅ¡to adresus"> “ simbolius, siekiant nurodyti el. paÅ¡to adresus, skirtus GnuPG. IÅ¡junkite, jei gavÄ—jai turi senus „Hushmail“ raktus."> OpenPGP saugumas)"> PASTABA: Rakto generavimas gali užtrukti kelias minutes. Neužverkite programos, kol vyksta rakto generavimas. Aktyviai narÅ¡ant ar atliekant operacijas, kurios reikalauja intensyvaus disko naudojimo, rakto generavimo metu padÄ—s sukurti atsitiktinesnį raktÄ… ir pagreitins procesÄ…. Jums bus praneÅ¡ta, kai rakto generavimas bus baigtas."> “ yra netinkamas"> PASTABA: Rakto generavimas gali užtrukti kelias minutes. Neužverkite programos, kol generuojamas raktas. Jums bus praneÅ¡ta, kai raktas bus sugeneruotas."> Pastaba: Enigmail visada patikrins visų paskyrų ir tapatybių paraÅ¡us nepaisant ar įjungta ar iÅ¡jungta"> vieÅ¡asis raktas yra skirtas kitiems, kad jie siųstų jums Å¡ifruotus laiÅ¡kus. JÅ«s galite juo dalintis su visais."> privatusis raktas yra skirtas jums, kad iššifruotumÄ—te Å¡iuos el. laiÅ¡kus ir siųstumÄ—te pasiraÅ¡ytus el. laiÅ¡kus. JÅ«s neturÄ—tumÄ—te jo niekam perduoti."> privatusis raktas yra skirtas jums, kad iššifruotumÄ—te Å¡iuos el. laiÅ¡kus ir siųstumÄ—te pasiraÅ¡ytus el. laiÅ¡kus. JÅ«s neturÄ—tumÄ—te jo niekam perduoti. Norint apsaugoti jÅ«sų privatųjį raktÄ…, kituose dviejuose dialogo languose jÅ«sų bus paklausta slaptafrazÄ—s."> slaptafrazÄ— yra slaptažodis, skirtas apsaugoti jÅ«sų privatųjį raktÄ…. Jis neleidžia netinkamai naudoti jÅ«sų privatųjį raktÄ…."> nerekomenduojami."> Å iam reikalui jÅ«sų bus papraÅ¡yta įvesti slaptažodį. Perkelkite liudijimÄ… į laikmenÄ…, kaip pavyzdžiui, CD ar USB atmintukas, kurį gali bÅ«ti saugiai atskirai laikoma. Jei koks nors asmuo gaus prieigÄ… prie Å¡io liudijimo, jis galÄ—s padaryti jÅ«sų raktÄ… netinkamÄ… naudoti."> eksportuokite savo duomenis iÅ¡ seno kompiuterio, naudodami atsarginÄ—s kopijos vediklį, esantį Enigmail nuostatose importuokite duomenis į savo naujÄ…jį kompiuterį, naudodami šį vediklį. "> DÄ—kui jog naudojate Enigmail."> eksportuokite savo duomenis iÅ¡ seno kompiuterio, naudodami šį vediklį importuokite duomenis į savo naujÄ…jį kompiuterį, naudodami sÄ…rankos vediklį. "> enigmail-2.0.8/lang/lt/enigmail.properties000066400000000000000000001541441334302754500205700ustar00rootroot00000000000000Enigmail=Enigmail ##################################################################### # Strings used within enigmailCommon.js and enigmailCommon.jsm ##################################################################### enigAlert=Enigmail įspÄ—jimas enigConfirm=Enigmail patvirtinimas enigInfo=Enigmail informacija enigError=Enigmail klaida enigPrompt=Enigmail įvedimas dlgYes=&Taip dlgNo=&Ne dlgKeepSetting=Prisiminti atsakymÄ… ir daugiau nebeklausti dlgNoPrompt=Daugiau neberodyti Å¡io praneÅ¡imo dlg.button.delete=&IÅ¡trinti dlg.button.cancel=&Atsisakyti dlg.button.close=&Užverti dlg.button.continue=&TÄ™sti dlg.button.skip=&Praleisti dlg.button.overwrite=&PerraÅ¡yti dlg.button.view=Rod&ymas dlg.button.retry=&Bandyti dar kartÄ… dlg.button.ignore=&Nepaisyti # dlg.button.install=&Install dlg.button.ok=&Gerai repeatPrefix=\n\nÅ is įspÄ—jimas bus kartojamas %S repeatSuffixSingular=kartÄ…. repeatSuffixPlural=kartus. noRepeat=\n\nÅ is įspÄ—jimas nebus rodomas kol neatnaujinsite Enigmail. pgpNotSupported=Atrodo, kad naudojate Enigmail kartu su PGP 6.x\n\nDeja, PGP 6.x turi daug problemų, kurios neleidžia Enigmail teisingai veikti. Be to, Enigmail daugiau nebepalaiko PGP 6.x; vietoj to, naudokite GnuPG (GPG).\n\nJei reikia pagalbos pradedant naudoti GnuPG, žiÅ«rÄ—kite pagalbos sekcijÄ… Enigmail internetinÄ—je svetainÄ—je. initErr.howToFixIt=Norint naudoti Enigmail, reikalinga GnuPG. Jeigu jÅ«s dar neįdiegÄ—te GnuPG, lengviausias bÅ«das tai padaryti yra pasinaudoti žemiau esanÄiu mygtuku "SÄ…rankos vediklis". initErr.setupWizard.button=&SÄ…rankos vediklis passphraseCleared=SlaptafrazÄ— iÅ¡valyta. # cannotClearPassphrase=You are using a non-standard tool (such as gnome-keyring) for passphrase handling. Clearing the passphrase is therefore not possible from within Enigmail. noPhotoAvailable=NÄ—ra nuotraukos debugLog.title=Enigmail derinimo žurnalas error.photoPathNotReadable=Kelias iki nuotraukos „%S“ neperskaitomas generalError=Klaida: %S # Strings in configure.jsm enigmailCommon.versionSignificantlyChanged=Å i nauja Enigmail versija turi daug pakeitimų nustatymuose ir parinktyse. Mes bandÄ—me perkelti senus nustatymus į Å¡iÄ… naujÄ… versijÄ…. TaÄiau negalime apraÅ¡yti visų situacijų. PeržiÅ«rÄ—kite visus nustatymus ir parinktis. enigmailCommon.checkPreferences=Tikrinti nustatymus... preferences.defaultToPgpMime=Mes pakeitÄ—me numatytÄ…jį laiÅ¡kų kodavimÄ… programoje Enigmail iÅ¡ įterptojo PGP į PGP/MIME. Rekomenduojame jums tai palikti kaip numatytÄ…jį nustatymÄ….\n\nJeigu vis tik pagal numatymÄ… norite naudoti įterptÄ…jį PGP, tuomet galite tai nustatyti Paskyros nustatymuose, skyrelyje OpenPGP saugumas. ##################################################################### # Strings in enigmailAbout.js ##################################################################### usingVersion=Enigmail versija %S enigmailPepVersion=Enigmail/p≡p versija %S usingAgent=Å ifravimui ir iššifravimui naudojamas %S sukompiliuotas failas %S agentError=KLAIDA: Nepavyko pasiekti Enigmime tarnybos! ##################################################################### # Strings in enigmailKeygen.js ##################################################################### accessError=Klaida bandant pasiekti Enigmail tarnybÄ… onlyGPG=Rakto generavimas veikia tik su GnuPG (ne su PGP)! keygenComplete=Raktas sugeneruotas! PasiraÅ¡ymui bus naudojama <%S> tapatybÄ—. revokeCertRecommended=Mes primygtinai rekomenduojame savo raktui sukurti panaikinimo liudijimÄ…. Å is liudijimas galÄ—s bÅ«ti naudojamas paversti jÅ«sų raktÄ… negaliojanÄiu, pvz., jei prarasite savo slaptÄ… raktÄ… ar jis bus sukompromituotas. Ar norite dabar sukurti tokį liudijimÄ…? keyMan.button.generateCert=&Generuoti liudijimÄ… genCompleteNoSign=Raktas sÄ—kmingai sugeneruotas! genGoing=Raktas generuojamas! passNoMatch=SlaptafrazÄ—s nesutampa; įveskite dar kartÄ… passCheckBox=PažymÄ—kite žymimÄ…jį langelį jei raktui nenurodote slaptafrazÄ—s passUserName=Nurodykite naudotojo vardÄ…, Å¡iai tapatybei # keygen.missingUserName=There is no name specified for the selected account/identity. Please enter a value in the field "Your name" in the account settings. keygen.passCharProblem=JÅ«s savo slaptafrazÄ—je naudojate specialius simbolius. Deja, tai gali sukelti problemų kitoms programoms. Rekomenduojame jums pasirinkti slaptafrazÄ™, kurioje bÅ«tų tik kurie nors iÅ¡ Å¡ių simbolių:\na-z A-Z 0-9 /.;:-,!?(){}[]%* passSpaceProblem=DÄ—l techninių priežasÄių, jÅ«sų slaptafrazÄ— negali prasidÄ—ti ar baigtis tarpu. changePassFailed=Nepavyko pakeisti slaptafrazÄ—s. keyConfirm=Sugeneruoti viešąjį ir privatųjį raktus, skirtus „%S“? keyMan.button.generateKey=&Generuoti raktÄ… keyAbort=Nutraukti raktų generavimÄ…? keyMan.button.generateKeyAbort=&Nutraukti raktų generavimÄ…? keyMan.button.generateKeyContinue=&TÄ™sti raktų generavimÄ…? expiryTooLong=Negalite sukurti rakto, kurio galiojimas baigsis daugiau nei po 100 metų. expiryTooLongShorter=Negalite sukurti rakto, kurio galiojimas baigsis daugiau nei po 90 metų. expiryTooShort=JÅ«sų raktas turi galioti bent vienÄ… dienÄ…. keyGenFailed=Sugeneruoti rakto nepavyko. Patikrinkite Enigmail pultÄ… (Meniu Enigmail > Enigmail derinimas) jei norite gauti daugiau informacijos. setKeyExpirationDateFailed=Nepavyko pakeisti galiojimo pabaigos datos # Strings in enigmailMessengerOverlay.js securityInfo=Enigmail saugumo informacija\n\n enigHeader=Enigmail: enigContentNote=Enigmail: *Å iam laiÅ¡kui skirti priedai nebuvo pasiraÅ¡yti ar Å¡ifruoti*\r\n\r\n possiblyPgpMime=Galimai PGP/MIME Å¡ifruotas ar pasiraÅ¡ytas laiÅ¡kas; norÄ—dami patikrinti, naudokite „Iššifruoti/Patikrinti“ funkcijÄ… saveAttachmentHeader=Enigmail: Ä®raÅ¡yti iššifruotÄ… priedÄ… noTempDir=Nepavyko rasti laikino aplanko į kurį galima bÅ«tų raÅ¡yti\nNustatykite TEMP aplinkos kintamÄ…jį attachmentPgpKey=Priedas „%S“, kurį bandote atverti yra OpenPGP rakto failas.\n\nSpustelÄ—kite „Importuoti“, norÄ—dami importuoti visus jame esanÄius raktus arba „Rodymas“ ir narÅ¡yklÄ—s lange bus parodytas failo turinys beginPgpPart=**********Å IFRUOTOS ar PASIRAÅ YTOS DALIES PRADŽIA********** endPgpPart=**********Å IFRUOTOS ar PASIRAÅ YTOS DALIES PABAIGA********** notePartEncrypted=Enigmail: *LaiÅ¡ko dalys NEBUVO pasiraÅ¡ytos ar užšifruotos* noteCutMessage=Enigmail: *Rastos kelios laiÅ¡ko dalys -- iššifravimas/tikrinimas nutrauktas* decryptOkNoSig=Ä®spÄ—jimas\n\nIššifravimas buvo sÄ—kmingas, bet nepavyko patikrinti paraÅ¡o msgOvl.button.contAnyway=&Vis tiek tÄ™sti signature.verifiedOK=Priedo %S paraÅ¡as sÄ—kmingai patvirtintas signature.verifyFailed=Nepavyko patvirtinti priedo %S paraÅ¡o attachment.noMatchToSignature=Nepavyko rasti atitinkamo priedo „%S“, skirto paraÅ¡o failui attachment.noMatchFromSignature=Nepavyko rasti atitinkamo paraÅ¡o failo „%S“, skirto priedui fixBrokenExchangeMsg.failed=Nepavyko pataisyti laiÅ¡ko. enigmail.msgViewColumn.label=Enigmail enigmailPep.msgViewColumn.label=Enigmail/p≡p # wksNoIdentity=This key is not linked to any of your email accounts. Please add an account for at least one of the following email addresse(s):\n\n%S wksConfirmSuccess=Patvirtinimo el. laiÅ¡kas iÅ¡siųstas. wksConfirmFailure=Patvirtinimo el. laiÅ¡ko siuntimas nepavyko. # autocrypt.importSetupKey.accountPreconfigured=Your account is already correctly configured for Autocrypt.\n\nDo you really want to overwrite your settings with this setup message? # autocrypt.importSetupKey.selfCreated=This message was created by your currently running instance of Enigmail.\n\nPlease switch to the email client to which you want to transfer the settings, and click on the message on that email client to import the settings. # autocrypt.importSetupKey.invalidMessage=Error - could not read setup message. The message seems to be corrupted. Please try to create a new setup message on your "other" device. autocrypt.importSetupKey.invalidKey=Klaida - nepavyko importuoti rakto. Raktas yra arba nepalaikomas jÅ«sų GnuPG versijos, arba jis susigadino. autocrypt.importSetupKey.wrongPasswd=JÅ«sų įvestas slaptažodis yra neteisingas. Ar norite bandyti dar kartÄ…? # autocrypt.importSetupKey.success=The Autocrypt setup message was processed successfully. Autocrypt is now available for your account '%S'. ##################################################################### # Strings in enigmailMsgComposeOverlay.js ##################################################################### keysToExport=Pasirinkite OpenPGP raktus kuriuos įterpti keysToUse=Pasirinkite kurį OpenPGP raktÄ…(-us) naudoti %S pubKey=VieÅ¡asis raktas skirtas %S\n windowLocked=RaÅ¡ymo langas užrakintas; siuntimas atÅ¡auktas sendUnencrypted=Nepavyko inicijuoti Enigmail.\nSiųsti neÅ¡ifruotÄ… laiÅ¡kÄ…? composeSpecifyEmail=Nurodykite savo pagrindinį el. paÅ¡to adresÄ…, kuris bus naudojamas pasirenkant raktÄ… iÅ¡einantiems laiÅ¡kams.\nJei paliksite tuÅ¡ÄiÄ…, NUO laukelio adresas bus naudojamas pasirinkti raktÄ…. sendingHiddenRcpt=Å is laiÅ¡kas turi BCC(nematomÄ… kopijÄ…) gavÄ—jų. Jei Å¡is laiÅ¡kas Å¡ifruotas, įmanoma paslÄ—pti BCC gavÄ—jus, bet kai kurių programų naudotojai (pvz. PGP Corp) negalÄ—s iššifruoti laiÅ¡ko. Mes rekomenduojame vengti BCC laiÅ¡kų su Å¡ifruotais praneÅ¡imais. sendWithHiddenBcc=SlÄ—pti BCC gavÄ—jus sendWithShownBcc=Å ifruoti įprastai sendingNews=Užšifruoto siuntimo operacija atÅ¡aukta.\n\nÅ¡is laiÅ¡kas negali bÅ«ti užšifruotas, nes yra naujienų grupių gavÄ—jų. Persiųskite šį laiÅ¡kÄ… neÅ¡ifruojant. sendToNewsWarning=Ä®spÄ—jimas: jÅ«s tuoj iÅ¡siųsite užšifruotÄ… laiÅ¡kÄ… naujienų grupei.\n\nTai nepatartina, nes toks veiksmas turi prasmÄ™ tik tada jei visi nariai gali iššifruoti laiÅ¡kÄ… t.y. laiÅ¡kas turi bÅ«ti Å¡ifruotas su visų grupÄ—s narių raktais. šį laiÅ¡kÄ… siųskite tik tada jei žinote kÄ… darote.\n\nTÄ™sti? hasHTML=HTML laiÅ¡ko įspÄ—jimas:\nÅ¡iame laiÅ¡ke gali bÅ«ti HTML, kuri gali sukelti problemų pasiraÅ¡ant/Å¡ifruojant. Norint to iÅ¡vengti ateityje, jÅ«s turÄ—tumÄ—te laikyti SHIFT kai spaudžiate „RaÅ¡yti/Atsakyti“ mygtukÄ…, pasiraÅ¡ytam laiÅ¡kui iÅ¡siųsti.\nJei visada pasiraÅ¡ote laiÅ¡kÄ…, nustatymuose turÄ—tumÄ—te atžymÄ—ti „Kurti laiÅ¡kus su HTML“, norint visam laikui iÅ¡jungti HTML laiÅ¡kus Å¡iai paÅ¡to paskyrai. strippingHTML=LaiÅ¡ke yra HTML formatavimo informacija, kuri bus prarasta konvertuojant į paprastÄ… tekstÄ…, pasiraÅ¡ymo/Å¡ifravimo metu. TÄ™sti? msgCompose.button.sendAnyway=&Vistiek siųsti attachWarning=Å io laiÅ¡ko priedai nÄ—ra vietiniai, jie negali bÅ«ti užšifruoti. NorÄ—dami užšifruoti Å¡iuos priedus, įraÅ¡ykite juos savo kompiuteryje ir tuomet pridÄ—kite failus. Ar vis tiek norite siųsti šį laiÅ¡kÄ…? quotedPrintableWarn=JÅ«s įjungÄ—te „quoted-printable“ kodavimÄ… siunÄiamiems laiÅ¡kams. Tai gali įtakoti neteisingÄ… jÅ«sų laiÅ¡ko iššifravimÄ… ir/ar patikrinimÄ….\nAr norite dabar iÅ¡jungti „quoted-printable“ siunÄiamiems laiÅ¡kams? minimalLineWrapping=JÅ«s nustatÄ—te eiluÄių laužymÄ… %S simboliais. Norint teisingai užšifruoti ar/ir pasiraÅ¡yti, Å¡i vertÄ— turi bÅ«ti bent 68.\nAr norite dabar nustatyti eiluÄių laužymÄ… ties 68 simboliais? warning=Ä®spÄ—jimas signIconClicked=JÅ«s pakeitÄ—te pasiraÅ¡ymÄ…. Nepaisant to, kol jÅ«s raÅ¡ote šį laiÅ¡kÄ…, pasiraÅ¡ymo (de)aktyvavimas daugiau nepriklauso nuo Å¡ifravimo (de)aktyvacijos. # errorOwnKeyUnusable=The key ID '%S' configured for the current identity does not yield a usable OpenPGP key.\n\nPlease ensure that you have a valid, not expired OpenPGP key and that your account settings point to that key.\nIf your key is not expired, then check if you did set Owner trust to full or ultimate. msgCompose.cannotSaveDraft=Klaida, įraÅ¡ant juodraÅ¡tį # msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information - partially encrypted email. # msgCompose.partiallyEncrypted.mimeMsg=The message you are replying to contained both unencrypted and encrypted parts. Some encrypted message parts are invisible to you.\n\nIf the sender was not able to decrypt the hidden message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nWe recommend that you don't reply to the message, but create a new message containing your answer. # msgCompose.partiallyEncrypted.inlinePGP=The message you are replying to contained both unencrypted and encrypted parts. If the sender was not able to decrypt some message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nPlease consider removing all quoted text from your reply to this sender. msgCompose.internalEncryptionError=VidinÄ— klaida: žadÄ—tas Å¡ifravimas iÅ¡jungtas msgCompose.internalError=Ä®vyko vidinÄ— klaida. msgCompose.toolbarTxt.signAndEncrypt=Å is laiÅ¡kas bus pasiraÅ¡ytas ir Å¡ifruotas msgCompose.toolbarTxt.signOnly=Å is laiÅ¡kas bus pasiraÅ¡ytas msgCompose.toolbarTxt.encryptOnly=Å is laiÅ¡kas bus Å¡ifruotas msgCompose.toolbarTxt.noEncryption=Å is laiÅ¡kas bus nepasiraÅ¡ytas ir neÅ¡ifruotas msgCompose.toolbarTxt.disabled=Enigmail pasirinktai tapatybei yra iÅ¡jungta # msgCompose.protectSubject.tooltip=Protect the message subject # msgCompose.noSubjectProtection.tooltip=Do not protect the message subject msgCompose.encryptedSubjectStub=Å ifruotas laiÅ¡kas # msgCompose.protectSubject.dialogTitle=Enable Protection of Subject? # msgCompose.protectSubject.question=Regular encrypted emails contain the unredacted subject.\n\nWe have established a standard to hide the original subject in the encrypted message\nand replace it with a dummy text, such that the subject is only visible after the email is decrypted.\n\nDo you want to protect the subject in encrypted messages? # msgCompose.protectSubject.yesButton=&Protect subject # msgCompose.protectSubject.noButton=&Leave subject unprotected msgCompose.detailsButton.label=IÅ¡samiau ... # msgCompose.detailsButton.accessKey=D msgCompose.pepSendUnknown=Nežinoma # msgCompose.pepSendUnsecure=Unsecure # msgCompose.pepSendSecure=Secure # msgCompose.pepSendTrusted=Secure & Trusted # pep.alert.disabledForIdentity=p≡p is disabled for the current identity. Please enable p≡p via the Enigmail/p≡p preferences. pep.alert.weakReply=JÅ«s ketinate persiųsti ar atsakyti į saugų laiÅ¡kÄ…, kaip į nesaugų. Jei pasirinksite tÄ™sti, gali bÅ«ti atskleista konfidenciali informacija, kuri sukels pavojų jums ir jÅ«sų bendravimo partneriui. Ar tikrai norite tÄ™sti? # note: should end with double newline: sendAborted=Siuntimo operacija nutraukta.\n\n # details: # keyNotTrusted=Not enough trust for key '%S' keyNotFound=Raktas "%S" nerastas keyRevoked=Raktas "%S" panaikintas keyExpired=PasibaigÄ— "%S" rakto galiojimas statPGPMIME=PGP/MIME statSMIME=S/MIME statSigned=PASIRAÅ YTAS statEncrypted=Å IFRUOTAS statPlain=NEPASIRAÅ YTAS ir NEÅ IFRUOTAS offlineSave=Ä®raÅ¡yti %S laiÅ¡kÄ… į %S neiÅ¡siųstų laiÅ¡kų aplanke? onlineSend=IÅ¡siųsti %S laiÅ¡kÄ… į %S? encryptKeysNote=Pastaba: laiÅ¡kas užšifruotas su Å¡io naudotojo ID/Raktu: %S hiddenKey= signFailed=Klaida Enigmail; Nepavyko užšifruoti/pasiraÅ¡yti; siųsti neÅ¡ifruotÄ… laiÅ¡kÄ…? msgCompose.button.sendUnencrypted=&Siųsti neÅ¡ifruotÄ… laiÅ¡kÄ… recipientsSelectionHdr=Pasirinkite gavÄ—jus Å¡ifravimui configureNow=Pasirinktai tapatybei jÅ«s nenustatÄ—te Enigmail saugumo. Ar norite tai padaryti dabar? # encryption/signing status and associated reasons: encryptMessageAuto=Å ifruoti laiÅ¡kÄ… (automatiÅ¡kai) encryptMessageNorm=Å ifruoti laiÅ¡kÄ… signMessageAuto=PasiraÅ¡yti laiÅ¡kÄ… (automatiÅ¡kai) signMessageNorm=PasiraÅ¡yti laiÅ¡kÄ… encryptOff=Å ifravimas: IÅ JUNGTAS encryptOnWithReason=Å ifravimas: Ä®JUNGTAS (%S) encryptOffWithReason=Å ifravimas: IÅ JUNGTAS (%S) encryptOn=Å ifravimas: Ä®JUNGTAS signOn=PasiraÅ¡ymas: Ä®JUNGTAS signOff=PasiraÅ¡ymas: IÅ JUNGTAS signOnWithReason=PasiraÅ¡ymas: Ä®JUNGTAS (%S) signOffWithReason=PasiraÅ¡ymas: IÅ JUNGTAS (%S) reasonEnabledByDefault=įjungta pagal numatymÄ… # reasonManuallyForced=manually forced # reasonByRecipientRules=forced by recipient rules # reasonByAutoEncryption=forced by auto encryption reasonByConflict=dÄ—l konflikto gavÄ—jų taisyklÄ—se reasonByEncryptionMode=dÄ—l Å¡ifravimo veiksenos # should not be used anymore: encryptYes=LaiÅ¡kas bus užšifruotas encryptNo=LaiÅ¡kas nebus užšifruotas # should not be used anymore: signYes=LaiÅ¡kas bus pasiraÅ¡ytas signNo=LaiÅ¡kas nebus pasiraÅ¡ytas # PGP/MIME status: pgpmimeNormal=Protokolas: PGP/MIME inlinePGPNormal=Protokolas: Ä®terptasis PGP smimeNormal=Protokolas: S/MIME pgpmimeAuto=Protokolas: PGP/MIME (automatiÅ¡kai) inlinePGPAuto=Protokolas: Ä®terptasis PGP (automatiÅ¡kai) smimeAuto=Protokolas: S/MIME (automatiÅ¡kai) # should not be used anymore pgpmimeYes=Bus naudojama PGP/MIME pgpmimeNo=Bus naudojamas įterptasis PGP # Attach own key status (tooltip strings): attachOwnKeyNo=JÅ«sų paÄių raktas nebus pridÄ—tas attachOwnKeyYes=Bus pridÄ—tas jÅ«sų paÄių raktas attachOwnKeyDisabled=Nepavyko pridÄ—ti jÅ«sų paÄių rakto. NorÄ—dami įjungti Å¡iÄ… ypatybÄ™,\nturite Paskyros nustatymuose, OpenPGP sekcijoje pasirinkti tam tikrÄ… raktÄ…. rulesConflict=Aptiktos nesuderinamos kiekvienam-gavÄ—jui taisyklÄ—s\n%S\n\nSiųsti laiÅ¡kÄ… su Å¡iais nustatymais? msgCompose.button.configure=&KonfigÅ«ruoti msgCompose.button.send=&Siųsti laiÅ¡kÄ… msgCompose.button.save=Ä®&raÅ¡yti laiÅ¡kÄ… # Strings in enigmailMsgHdrViewOverlay.js # keyNeeded=Public key %S needed to verify signature # keyUsed=Public key %S used to verify signature clickDecrypt=; naudokite „Iššifruoti/Patikrinti“ funkcijÄ… clickDecryptRetry=; norÄ—dami bandyti dar kartÄ…, naudokite „Iššifruoti/Patikrinti“ funkcijÄ… clickDetailsButton=; iÅ¡samesnei informacijai, spustelÄ—kite ant mygtuko "IÅ¡samiau" clickImportButton=; norÄ—dami importuoti raktÄ…, spustelÄ—kite ant mygtuko "Importuoti raktÄ…" keyTypeUnsupported=; jÅ«sų GnuPG versija nepalaiko rakto tipo msgPart=%S laiÅ¡ko dalis msgSigned=pasiraÅ¡ytas msgSignedUnkownKey=pasiraÅ¡ytas, naudojant nežinomÄ… raktÄ… msgEncrypted=užšifruotas msgSignedAndEnc=pasiraÅ¡yta ir užšifruota unverifiedSig=Nepatvirtintas paraÅ¡as incompleteDecrypt=Iššifravimas nepilnas needKey=Klaida - laiÅ¡ko iššifravimui nerasta jokio privaÄiojo/slapto rakto failedDecrypt=Klaida - nepavyko iššifruoti badPhrase=Klaida - bloga slaptafrazÄ— failedDecryptVerify=Klaida - iššifravimas/patikrinimas nepavyko viewInfo=; Rodymas > LaiÅ¡ko saugumo informacija, iÅ¡samesnei informacijai decryptedMsg=Iššifruotas laiÅ¡kas decryptedMsgWithFormatError=Iššifruotas laiÅ¡kas (atkurtas sugadintas PGP laiÅ¡ko formatas, jį greiÄiausiai sugadino senas Exchange serveris, gali bÅ«ti neįmanoma perskaityti laiÅ¡ko) usedAlgorithms=Naudoti algoritmai: %1$S ir %2$S pepStatusInfo.text=p≡p laiÅ¡ko bÅ«sena. # pepStatusInfo.title.m3=Under Attack # pepStatusInfo.info.m3=This message is not secure and has been tampered with. # pepStatusInfo.title.m1=Mistrusted pepStatusInfo.info.m1=Å iame laiÅ¡ke yra bendravimo partneris, kuris anksÄiau buvo pažymÄ—tas kaip nepatikimas pepStatusInfo.title.r0=Nežinoma pepStatusInfo.info.r0=Å iame laiÅ¡ke nÄ—ra pakankamai informacijos, kad bÅ«tų nusprÄ™sta ar jis yra saugus ar ne. pepStatusInfo.title.r1=Nepavyksta iššifruoti pepStatusInfo.info.r1=Å is laiÅ¡kas negali bÅ«ti iššifruotas, nes raktas nÄ—ra prieinamas. pepStatusInfo.title.r2=Nepavyksta iššifruoti pepStatusInfo.info.r2=Å is laiÅ¡kas negali bÅ«ti iššifruotas, nes raktas nÄ—ra prieinamas. pepStatusInfo.title.r3=Nesaugus pepStatusInfo.info.r3=Å is laiÅ¡kas yra nesaugus. # pepStatusInfo.title.r4=Unsecure for Some pepStatusInfo.info.r4=Kai kuriems bendravimo partneriams Å¡is laiÅ¡kas yra nesaugus. pepStatusInfo.title.r5=Nepatikimas saugumas pepStatusInfo.info.r5=Å iame laiÅ¡ke yra nepatikima apsauga. # pepStatusInfo.title.r6=Secure... pepStatusInfo.info.r6=Å is laiÅ¡kas yra saugus, taÄiau vis tiek turite patvirtinti savo bendravimo partnerio tapatybÄ™. # pepStatusInfo.title.r7=Secure & Trusted pepStatusInfo.info.r7=Å is laiÅ¡kas yra saugus ir patikimas. pepStatusInfo.color.green=Žalia pepStatusInfo.color.yellow=Geltona pepStatusInfo.color.red=Raudona # pepRevokeTrust.question=Do you really want to cancel the trust for %S? # pepRevokeMistrust.question=Do you really want to re-trust the key for %S? # pepRevokeTrust.doRevoke=Cancel &trust # wksConfirmationReq=Web Key Directory Confirmation Request # wksConfirmationReq.message=This message has been sent by your email provider to confirm deployment of your OpenPGP public key\nin their Web Key Directory.\nProviding your public key helps others to discover your key and thus being able to encrypt messages to you.\n\nIf you want to deploy your key in the Web Key Directory now, please click on the button "Confirm Request" in the status bar.\nOtherwise, simply ignore this message. wksConfirmationReq.button.label=Patvirtinti užklausÄ… # autocryptSetupReq=Perform Autocrypt Setup autocryptSetupReq.button.label=PradÄ—ti sÄ…rankÄ… # autocryptSetupReq.setupMsg.desc=This message contains all information to transfer your Autocrypt settings along with your secret key securely from your original device. # autocryptSetupReq.setupMsg.backup=You can keep this message and use it as a backup for your secret key. If you want to do this, you should write down the password and store it securely. autocryptSetupReq.message.import=NorÄ—dami importuoti nustatymus ir raktÄ…(-us) į Enigmail, spustelÄ—kite bÅ«senos juostoje ant mygtuko "PradÄ—ti sÄ…rankÄ…". # autocryptSetupReq.message.sent=Please click on the message on your new device and follow the instuctions to import the settings. # strings in pref-enigmail.js oldGpgVersion20=Enigmail inicijavimas patyrÄ— nesÄ—kmÄ™.\n\nJÅ«s naudojate GnuPG versijÄ… %1$S, kuri yra daugiau nebepalaikoma. Enigmail reikalauja GnuPG versijos %2$S arba naujesnÄ—s. PraÅ¡ome atnaujinti savo GnuPG įdiegimÄ… arba kitu atveju Enigmail neveiks. locateGpg=Surasti GnuPG programÄ… invalidGpgPath=Nurodytam kelyje GnuPG negali bÅ«ti įvykdyta. Enigmail iÅ¡jungta kol jÅ«s pakeisite keliÄ… iki GnuPG arba iÅ¡ naujo paleisite programÄ…. warningsAreReset=Visi įspÄ—jimai buvo atstatyti. prefs.gpgFound=GnuPG rasta kataloge %S prefs.gpgNotFound=Nepavyko rasti GnuPG prefs.warnAskNever=Ä®spÄ—jimas: įjungus Å¡iÄ… parinktį nebus praneÅ¡ama jei vienam iÅ¡ gavÄ—jų nÄ—ra rakto ir laiÅ¡kas neÅ¡ifruotas! prefs.warnIdleTimeForUnknownAgent=Nepavyko prisijungti prie gpg-agent. Gal jÅ«sų sistema slaptafrazÄ—s įvedimui naudoja specialų įrankį, tokį kaip gnome-keyring ar seahorse-agent. DÄ—ja Enigmail negali valdyti įvedimo laiko jÅ«sų įrankyje. Laiko nustatymai Enigmail programoje yra ignoruojami. prefEnigmail.oneKeyserverOnly=Klaida - automatiniam trÅ«kstamų OpenPGP raktų atsiuntimui galite nurodyti tik vienÄ… raktų serverį. # Strings used in core.jsm # (said file also re-uses some strings from above) enterAdminPin=Ä®veskite SmartCard ADMIN PIN enterCardPin=Ä®veskite SmartCard PIN notInit=Klaida - Enigmail tarnyba kol kas neinicijuota badCommand=Klaida - Å¡ifravimo komanda nepavyko cmdLine=komandų eilutÄ— ir iÅ¡vestis: notRequired=Klaida - Å¡ifravimas nereikalingas notComplete=Klaida - rakto generavimas dar nebaigtas invalidEmail=Klaida - netinkamas el. paÅ¡to adresas(-ai) noPassphrase=Klaida - nepateikta slaptafrazÄ— noPGPblock=Klaida - nerastas tinkamas „armored OpenPGP“ duomenų blokas unverifiedReply=Cituojama laiÅ¡ko dalis (atsakyme) turbÅ«t buvo pakeista keyInMessageBody=PagrindinÄ—je laiÅ¡ko dalyje rastas raktas. NorÄ—dami importuoti raktÄ…, spustelÄ—kite "Importuoti raktÄ…" sigMismatch=Klaida - paraÅ¡as nesutampa cantImport=Klaida importuojant viešąjį raktÄ…\n\n doImportOne=Importuoti %1$S (%2$S)? doImportMultiple=Importuoti Å¡iuos raktus?\n\n%S previewFailed=Nepavyksta perskaityti vieÅ¡ojo rakto failo. # Strings used in errorHandling.jsm sc.wrongCardAvailable=Rasta SmartCard %S jÅ«sų įrenginyje negali bÅ«ti panaudota skaitant laiÅ¡kÄ….\nÄ®dÄ—kite savo SmartCard %S ir pakartokite operacijÄ…. sc.insertCard=Operacijai atlikti reikia SmartCard %S.\nÄ®dÄ—kite reikalingÄ… SmartCard ir pakartokite operacijÄ…. sc.removeCard=Operacijai atlikti reikia jog SmartCard nebÅ«tų įrenginyje.\nIÅ¡imkite SmartCard ir pakartokite operacijÄ…. sc.noCardAvailable=JÅ«sų įrenginyje SmartCard nerasta\nÄ®dÄ—kite jÅ«sų SmartCard ir pakartokite operacijÄ…. sc.noReaderAvailable=JÅ«sų SmartCard skaitytuvas nepasiekiamas\nPrijunkite SmartCard skaitytuvÄ…, įdÄ—kite kortelÄ™ ir pakartokite operacijÄ…. # keyError.keySpecNotFound=The email address "%S" cannot be matched to a key on your keyring. # keyError.keyIdNotFound=The configured key ID "%S" cannot be found on your keyring. keyError.resolutionAction=Pasirinkite savo Paskyros nustatymuose, OpenPGP sekcijoje, galiojantį raktÄ…. missingPassphrase=TrÅ«ksta slaptafrazÄ—s errorHandling.gpgAgentInvalid=JÅ«sų sistemoje yra paleista gpg-agent versija, kuri nÄ—ra tinkama jÅ«sų GnuPG versijai. # errorHandling.gpgAgentError=GnuPG reported an error in the communication with gpg-agent (a component of GnuPG). errorHandling.dirmngrError=GnuPG pranešė apie klaida susisiekime su dirmngr (GnuPG komponentu). # errorHandling.pinentryError=GnuPG cannot query your passphrase via pinentry. # errorHandling.readFaq=This is a system setup or configuration error that prevents Enigmail from working properly and cannot be fixed automatically.\n\nWe strongly recommend that you consult our support web site at https://enigmail.net/faq. gpgNotFound=Nepavyko rasti GnuPG programos „%S“.\nÄ®sitikinkite jog Enigmail nustatymuose nurodÄ—te teisingÄ… GnuPG keliÄ…. gpgNotInPath=Nepavyko rasti GnuPG vykdomojo failo PATH.\nÄ®sitikinkite jog Enigmail nustatymuose nurodÄ—te teisingÄ… GnuPG keliÄ…. # enigmailNotAvailable=Enigmail core Service not available prefGood=GERAS paraÅ¡as iÅ¡ %S prefBad=BLOGAS paraÅ¡as iÅ¡ %S failCancel=Klaida - rakto gavimÄ… atÅ¡aukÄ— naudotojas failNoServer=Klaida - nenurodytas raktų serveris iÅ¡ kurio reikia gauti raktÄ… failNoID=Klaida - nenurodyta rakto ID kurį reikia gauti failKeyExtract=Klaida - rakto iÅ¡gavimo komanda nepavyko notFirstBlock=Klaida - pirmas OpenPGP blokas nÄ—ra vieÅ¡asis raktas importKeyConfirm=Importuoti viešąjį(-uosius) raktÄ…(-us) įterptus laiÅ¡ke? failKeyImport=Klaida - nepavyko importuoti rakto fileWriteFailed=Nepavyko įraÅ¡yti į failÄ… %S importKey=Importuoti iÅ¡ raktų serverio viešąjį raktÄ… %S: uploadKey=Siųsti viešąjį raktÄ… %S į raktų serverį: keyId=Rakto ID keyAndSigDate=Rakto ID: 0x%S / PasiraÅ¡yta: %S keyFpr=Rakto kontrolinis kodas: %S noEmailProvided=JÅ«s nepateikÄ—te el. paÅ¡to adreso! keyAlreadySigned=Raktas jau pasiraÅ¡ytas, negalite jo pasiraÅ¡yti antrÄ… kartÄ…. ##################################################################### # Strings used in enigmailKeySelection.js ##################################################################### selKeyExpired=pasibaigÄ™s galiojimas %S createdHeader=Sukurtas atLeastOneKey=Nepasirinktas raktas! Turite pasirinkti bent vienÄ… raktÄ… patvirtinant šį dialogÄ… fewerKeysThanRecipients=JÅ«s pasirinkote mažiau raktų nei yra gavÄ—jų. Ar jÅ«s įsitikinÄ™ jog raktų, kuriuos reikia užšifruoti, sÄ…raÅ¡as pilnas? userSel.button.goBack=Pasirinkti daugiau raktų userSel.secretKeySel.title=Pasirinkite slaptÄ… OpenPGP raktÄ… laiÅ¡kų pasiraÅ¡ymui # userSel.problemNoKey=No valid key # userSel.problemMultipleKeys=Multiple keys # should be same as thunderbird ENTITY sendLaterCmd.label: sendLaterCmd.label=Siųsti vÄ—liau # Strings used in enigmailAttachmentDialog.js # pgpMimeNote=NOTE: PGP/MIME is not supported by all email clients. If you are unsure, select the %S option. first=pirmas second=antras # Strings used in am-enigprefs.js / enigmailEditIdentity.js encryptKeyHeader=Pasirinkite OpenPGP raktÄ… Å¡ifravimui identityName=TapatybÄ—: %S # switchPepMode=You are currently using the 'p≡p Junior' mode of Enigmail.\n\nBy enabling OpenPGP or S/MIME for an account, you are disabling p≡p and use the 'regular' mode of Enigmail without p≡p. # enableEnigmail=&Disable p≡p # Strings used in enigmailSingleRcptSettings.js noEncryption=JÅ«s įjungÄ—te Å¡ifravimÄ…, bet nepasirinkote rakto. Norint užšifruoti laiÅ¡kus siunÄiamus %S, jÅ«s turite nurodyti vienÄ… ar kelis tinkamus raktus iÅ¡ jÅ«sų raktų sÄ…raÅ¡o. Ar norite iÅ¡jungti Å¡ifravimÄ… skirtÄ… %S? noKeyToUse=(nÄ—ra - be Å¡ifravimo) noEmptyRule=TaisyklÄ— negali bÅ«ti tuÅ¡Äia! Nurodykite el. paÅ¡to adresÄ… taisyklÄ—s laukelyje. invalidAddress=El. paÅ¡to adresas(-ai) kuriuos įvedÄ—te yra neteisingi. JÅ«s neturÄ—tumÄ—te nurodyti gavÄ—jų vardų, o tik el. paÅ¡to adresus. Pvz.:\nNeteisingas: Vardenis Pavardenis \nTeisingas: vardenis.pavardenis@adresas.lt # noCurlyBrackets=The curly brackets {} have a special meaning and should not be used in an email address. If you want to modify the matching behavior for this rule, use the 'Apply rule if recipient ...' option.\nMore information is available from the Help button. # Strings used in enigmailRulesEditor.js never=Niekada always=Visada possible=Ä®manoma deleteRule=Tikrai iÅ¡trinti pasirinktÄ… taisyklÄ™? nextRcpt=(Kitas gavÄ—jas) negateRule=Ne addKeyToRule=PridÄ—ti raktÄ… %S (%S) į kiekvienam-gavÄ—jui taisyklÄ™ # Strings used in enigmailSearchKey.js needOnline=Pasirinkta funkcija neprieinama dirbant atsijungus. Prisijunkite ir bandykite dar kartÄ…. protocolNotSupported=JÅ«sų pasirinktas protokolas „%S://“ nÄ—ra palaikomas OpenPGP raktų atsiuntimui. gpgkeysDisabled=TurÄ—tų pagelbÄ—ti „extensions.enigmail.useGpgKeysTool“ parinkties įjungimas. noKeyserverConn=Nepavyko prisijungti prie raktų serverio %S. keyDownloadFailed=Nepavyko atsisiųsti rakto iÅ¡ raktų serverio. BÅ«senos praneÅ¡imas:\n%S internalError=Kilo vidinÄ— klaida. Raktų importuoti ar atsisiųsti nepavyko. noKeyFound=Apgailestaujame, nepavyko rasti rakto kuris atitiktų jÅ«sų nurodytus kriterijus.\nTurÄ—kite omeny jog rakto ID turi prasidÄ—ti „0x“ (pvz. 0xABCDEF12). # keyDownload.keyUnavailable=We are sorry, but the key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their key by email. # gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. gpgKeysFailed=Nepavyko surasti ar atsisiųsti rakto iÅ¡ raktų serverio: nepavyko įvykdyti gpgkeys_%S. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Nepavyko nustatyti savininko patikimumo # Strings in enigmailSignKeyDlg.js signKeyFailed=Rakto pasiraÅ¡yti nepavyko alreadySigned.label=Pastaba: raktas %S jau pasiraÅ¡ytas pasirinktu privaÄiuoju raktu. # alreadySignedexportable.label=Note: the key %S is already signed exportable with the selected secret key. A local signature does not make sense. partlySigned.label=Pastaba: kai kurie rakto %S naudotojų ID jau pasiraÅ¡yti pasirinktu privaÄiuoju raktu. # noTrustedOwnKeys=No eligible key found for signing! You need at least one fully trusted secret key in order to sign keys. # Strings in enigmailKeyManager.js keyMan.loadingKeys=Ä®kraunami raktai, praÅ¡ome palaukti ... keyValid.unknown=nežinomas keyValid.invalid=netinkamas keyValid.disabled=iÅ¡jungtas keyValid.revoked=panaikintas keyValid.expired=nebegaliojantis keyValid.noSubkey=nÄ—ra tinkamo porakÄio keyTrust.untrusted=nepatikimas keyTrust.marginal=dalinai patikimas keyTrust.full=patikimas keyTrust.ultimate=visiÅ¡kas keyTrust.group=(grupÄ—) keyType.public=vieÅ¡as keyType.publicAndSec=vieÅ¡as/saugus keyMan.enableKey=Ä®jungti raktÄ… keyMan.disableKey=IÅ¡jungti raktÄ… userAtt.photo=Naudotojo savybÄ— (JPEG paveikslas) asciiArmorFile=ASCII Armored failai (*.asc) importKeyFile=Importuoti OpenPGP rakto failÄ… gnupgFile=GnuPG failai createKeyOK=JÅ«sų raktas buvo sugeneruotas saveRevokeCertAs=Sukurti ir įraÅ¡yti panaikinimo liudijimÄ… revokeCertOK=Panaikinimo liudijimas buvo sÄ—kmingai sukurtas. Galite jį naudoti, norÄ—dami paversti savo viešąjį raktÄ… negaliojanÄiu, pvz., tuo atveju, jei prarasite savo slaptÄ…jį raktÄ…. revokeCertFailed=Nepavyko sukurti panaikinimo liudijimo. addUidOK=Naudotojo ID sÄ—kmingai pridÄ—ta addUidFailed=PridÄ—ti naudotojo ID nepavyko noKeySelected=Pasirinktai operacijai atlikti jÅ«s turite pasirinkti bent vienÄ… raktÄ… exportToFile=Eksportuoti viešąjį raktÄ… į failÄ… # exportKeypairToFile=Export Secret and Public Key To File exportSecretKey=Ar norite įtraukti slaptÄ… raktÄ… į įraÅ¡ytÄ… OpenPGP rakto failÄ…? saveKeysOK=Raktai sÄ—kmingai įraÅ¡yti saveKeysFailed=Raktų įraÅ¡yti nepavyko importKeysFailed=Raktų importuoti nepavyko enableKeyFailed=Raktų įjungti/iÅ¡jungti nepavyko specificPubKeyFilename=%S (0x%S) vieÅ¡as specificPubSecKeyFilename=%S (0x%S) vieÅ¡as-saugus defaultPubKeyFilename=Eksportuoti-vieÅ¡ieji-raktai defaultPubSecKeyFilename=Eksportuoti-vieÅ¡ieji-ir-slapti-raktai noSecretKeys=Slaptų raktų nerasta.\n\nAr norite sugeneruoti savo raktÄ… dabar? sendKeysOk=Raktas(-ai) sÄ—kmingai iÅ¡siųsti sendKeysFailed=Raktų iÅ¡siųsti nepavyko receiveKeysOk=Raktas(-ai) sÄ—kmingai atnaujinti receiveKeysFailed=Raktų atsiuntimas nepavyko importFromClip=Ar norite importuoti raktÄ…(-us) iÅ¡ iÅ¡karpinÄ—s? importFromUrl=Atsisiųsti viešąjį raktÄ… iÅ¡ Å¡io URL: copyToClipbrdFailed=Nepavyko nukopijuoti pasirinkto rakto(-ų) į iÅ¡karpinÄ™. copyToClipbrdOK=Raktas(-ai) nukopijuoti į iÅ¡karpinÄ™ deleteSecretKey=Ä®SPÄ–JIMAS: JÅ«s ketinate iÅ¡trinti slaptÄ… raktÄ…!\nJei iÅ¡trinsite savo slaptÄ… raktÄ…, nebegalÄ—site iššifruoti laiÅ¡kų užšifruotų tuo raktu ir nebegalÄ—site to rakto panaikinti.\n\nAr tikrai norite iÅ¡trinti ABU (slaptÄ… ir viešąjį) raktus\n„%S“? deleteMix=Ä®SPÄ–JIMAS: JÅ«s ketinate iÅ¡trinti slaptus raktus!\nJeigu iÅ¡trinsite savo slaptÄ… raktÄ…, nebegalÄ—site iššifruoti laiÅ¡kų užšifruotų tuo raktu.\nAr tikrai norite iÅ¡trinti ABU (pasirinktÄ… slaptÄ… ir viešąjį) raktus? deletePubKey=Ar tikrai norite iÅ¡trinti viešąjį raktÄ…\n„%S“? deleteSelectedPubKey=Ar norite iÅ¡trinti vieÅ¡uosius raktus? deleteKeyFailed=Nepavyko iÅ¡trinti rakto. # revokeKeyQuestion=You are about to revoke the key '%S'.\n\nYou will no longer be able to sign with this key, and once distributed, others will no longer be able to encrypt with that key. You can still use the key to decrypt old messages.\n\nDo you want to proceed? revokeKeyOk=Raktas panaikintas. Jeigu jÅ«sų raktas yra prieinamas raktų serveryje, rekomenduojama jį įkelti iÅ¡ naujo, kad kiti matytų, jog jis buvo panaikintas. revokeKeyFailed=Nepavyko panaikinti rakto. revokeKeyNotPresent=JÅ«s neturite jokio rakto (0x%S), kuris tiktų į šį panaikinimo liudijimÄ…!\n\nJeigu praradote savo raktÄ…, tuomet privalote jį importuoti (pvz., iÅ¡ raktų serverio) prieÅ¡ panaikinimo liudijimÄ…! revokeKeyAlreadyRevoked=Raktas 0x%S jau buvo panaikintas. refreshAllQuestion=Nepasirinkote jokio rakto. Ar norite atnaujinti VISUS raktus? refreshKeyServiceOn.warn=Ä®spÄ—jimai: Å iuo metu jÅ«sų raktai kaip įmanoma saugiau yra fone įkeliami iÅ¡ naujo.\nVisų raktų įkÄ—limas iÅ¡ naujo vienu metu gali bereikalingai atskleisti informacijÄ… apie jus.\nAr tikrai norite tai padaryti? refreshKey.warn=Ä®spÄ—jimas: priklausomai nuo raktų skaiÄiaus ir interneto greiÄio, raktų atnaujinimas gali užtrukti! downloadContactsKeys.warn=Ä®spÄ—jimas: priklausomai nuo raktų skaiÄiaus ir interneto greiÄio, raktų atnaujinimas gali užtrukti! downloadContactsKeys.importFrom=Importuoti kontaktus iÅ¡ „%S“ adresų knygutÄ—s? keyMan.button.exportSecKey=Eksportuoti &slaptus raktus keyMan.button.exportPubKey=Eksportuoti tik &vieÅ¡uosius raktus keyMan.button.import=&Importuoti keyMan.button.refreshAll=&IÅ¡ naujo įkelti visus raktus keyMan.button.revokeKey=&Panaikinti raktÄ… keyMan.button.skip=&Praleisti raktÄ… keylist.noOtherUids=Neturi kitų tapatybių keylist.hasOtherUids=Taip pat žinomas kaip keylist.noPhotos=NÄ—ra nuotraukos keylist.hasPhotos=Nuotraukos keyMan.addphoto.filepicker.title=Pasirinkite nuotraukÄ… kuri bus pridÄ—ta keyMan.addphoto.warnLargeFile=JÅ«sų pasirinktas failas yra didesnis nei 25 kB.\nNerekomenduotina pridÄ—ti didelių failų, nes raktai tampa labai dideli. keyMan.addphoto.noJpegFile=Pasirinktas failas nÄ—ra JPEG failas. Pasirinkite kitÄ… failÄ…. keyMan.addphoto.failed=Nepavyko pridÄ—ti nuotraukos. noWksIdentity=Raktas %S neturi WKS tapatybÄ—s. # keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key "%1$S (%2$S)" for encrypting messages? # keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key "%1$S (%2$S)" for future messages? keyman.addBlacklistKey.button=Ä®&traukti raktÄ… į juodÄ…jį sÄ…rašą keyman.removeBlacklistKey.button=Å &alinti raktÄ… iÅ¡ juodojo sÄ…raÅ¡o # Strings in enigmailManageUidDlg.xul changePrimUidFailed=Nepavyko pakeisti pagrindinio naudotojo ID changePrimUidOK=Pagrindinio naudotojo ID sÄ—kmingai pakeistas revokeUidFailed=Naudotojo ID %S panaikinimas nepavyko revokeUidOK=Naudotojo ID %S sÄ—kmingai panaikintas. Jeigu jÅ«sų raktas prieinamas raktų serveryje, rekomenduojama jį įkelti pakartotinai, kad kiti žinotų, jog jis panaikintas. revokeUidQuestion=Ar tikrai norite panaikinti naudotojo ID %S? # Strings in enigmailKeyImportInfo.xul importInfoTitle=PAVYKO! Raktai importuoti # importInfoBits=Bits importInfoCreated=Sukurtas importInfoFpr=Kontrolinis kodas importInfoDetails=(IÅ¡samiau) importInfoNoKeys=Neimportuota jokių raktų. # Strings in enigmailKeyDetailsDlg.xul keyTypePublic=vieÅ¡asis raktas keyTypePrimary=pirminis raktas keyTypeSubkey=poraktis keyTypePair=raktų pora keyExpiryNever=niekada keyAlgorithm_1=RSA keyAlgorithm_2=RSA keyAlgorithm_3=RSA keyAlgorithm_16=ELG keyAlgorithm_17=DSA keyAlgorithm_18=ECDH keyAlgorithm_19=ECDSA keyAlgorithm_20=ELG keyAlgorithm_22=EDDSA keyUsageEncrypt=Å ifravimas keyUsageSign=PasiraÅ¡ymas # keyUsageCertify=Certify keyUsageAuthentication=TapatybÄ—s patvirtinimas keyDoesNotExpire=Raktas neturi galiojimo pabaigos # Strings in enigmailGenCardKey.xul keygen.started=Palaukite kol bus sugeneruotas raktas... keygen.completed=Raktas sugeneruotas. Naujas rakto ID yra: 0x%S keygen.keyBackup=Rakto atsarginÄ— kopija padaryta kaip %S keygen.passRequired=Nurodykite slaptafrazÄ™ jei norite sukurti savo rakto atsarginÄ™ kopijÄ… už SmartCard ribų. # Strings in enigmailSetCardPin.xul cardPin.processFailed=Nepavyko pakeisti PIN # Strings in enigRetrieveProgres.xul keyserverProgress.refreshing=Raktai įkeliami iÅ¡ naujo, praÅ¡ome palaukti... keyserverProgress.uploading=Raktai įkeliami, palaukite... # keyserverProgress.wksUploadFailed=Could not upload your key to the Web Key Service # keyserverProgress.wksUploadCompleted=Your public key was successfully submitted to your provider. You will receive an email to confirm that you initiated the upload. keyserverTitle.refreshing=Atnaujinti raktus keyserverTitle.uploading=Ä®kelti raktÄ… # Strings in enigmailSetupWizard passphrase.min8keys=JÅ«sų slaptafrazÄ— turi bÅ«ti sudaryta bent iÅ¡ 8 simbolių! setupWizard.reallyCancel=Ar tikrai norite užverti Enigmail sÄ…rankos vediklį? setupWizard.invalidGpg=JÅ«sų pasirinktas failas nÄ—ra GnuPG vykdomasis failas. Pasirinkite kitÄ… failÄ…. setupWizard.specifyFile=NorÄ—dami tÄ™sti, turite nurodyti bent jau viešąjį raktÄ…. setupWizard.installFailed=Atrodo diegimas nepavyko. Pabandykite iÅ¡ naujo arba įdiekite GnuPG rankiniu bÅ«du ir pasirinkite jį su narÅ¡ymo mygtuku. setupWizard.downloadForbidden=JÅ«sų paÄių saugumui, mes nesiųsime GnuPG. NorÄ—dami atsisiųsti GnuPG, apsilankykite https://gnupg.org/ . setupWizard.downloadImpossible=Å iuo metu mums nepavyko atsisiųsti GnuPG. Bandykite vÄ—liau arba, norÄ—dami atsisiųsti GnuPG, apsilankykite https://gnupg.org/ . setupWizard.hashSumError=Vedikliui nepavyko patikrinti atsiųsto failo vietisumo. Failas gali bÅ«ti netinkamai atsiųstas arba pakeistas. Ar vis tiek norite tÄ™sti diegimÄ…? setupWizard.importSettingsFile=Nurodykite atsarginÄ—s kopijos failÄ…, iÅ¡ kurio įkelti setupWizard.invalidSettingsFile=Nurodytas failas nÄ—ra teisingas Enigmail nustatymų atsarginÄ—s kopijos failas. setupWizard.gpgConfExists=GnuPG konfigÅ«racijos failas jau yra. Ar norite jį perraÅ¡yti konfigÅ«racijos failu iÅ¡ savo senojo diegimo? setupWizard.noGpgHomeDir=Atrodo, kad esate sukonfigÅ«ravÄ™ %S, kad naudotų GnuPG. TaÄiau tai nÄ—ra katalogas - jÅ«s negalite jo naudoti. setupWizard.unmachtedIds=Å ioms jÅ«sų senos sÄ…rankos tapatybÄ—ms nepavyko rasti atitikmenų:\n%S\nNustatymai Å¡ioms tapatybÄ—ms buvo praleisti. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=AtsiunÄiant GnuPG įvyko klaida. Tolimesnei informacijai, žiÅ«rÄ—kite pulto žurnalÄ…. installGnuPG.installFailed=Diegiant GnuPG įvyko klaida. Tolimesnei informacijai, žiÅ«rÄ—kite pulto žurnalÄ…. # Strings in enigmailAddUidDlg.xul addUidDlg.nameOrEmailError=Turite užpildyti vardÄ… ir el. paÅ¡to adresÄ… addUidDlg.nameMinLengthError=VardÄ… turi sudaryti bent 5 simboliai addUidDlg.invalidEmailError=Turite nurodyti teisingÄ… el. paÅ¡to adresÄ… # Strings in enigmailCardDetails.js Carddetails.NoASCII=OpenPGP SmartCards Varde/PavardÄ—je palaiko tik ASCII simbolius. # network error types errorType.SecurityCertificate=Interneto tarnybos pateiktas saugumo liudijimas negalioja. errorType.SecurityProtocol=Saugumo protokolas kurį naudoja tarnyba yra nežinomas. errorType.Network=Ä®vyko tinklo klaida. # filter stuff filter.folderRequired=Privalote pasirinkti paskirties aplankÄ…. filter.decryptMove.label=Iššifruoti visam laikui (Enigmail) filter.decryptCopy.label=Sukurti iššifruotÄ… kopijÄ… (Enigmail) filter.decryptMove.warnExperimental=Ä®spÄ—jimas - filtro veiksmas "Iššifruoti visam laikui" gali privesti prie sunaikintų laiÅ¡kų.\n\nPrimygtinai jums rekomenduojame, iÅ¡ pradžių, iÅ¡bandyti filtrÄ… "Sukurti iššifruotÄ… kopijÄ…", atsargiai iÅ¡bandyti rezultatÄ… ir pradÄ—ti naudoti šį filtrÄ… tik tuomet, kai bÅ«site patenkinti rezultatu. # filter.tempPepFilterDesc=Temporary filter to store sent message unencrypted # filter.term.pgpencrypted.label=OpenPGP Encrypted # filter.encrypt.label=Encrypt to key (Enigmail) # filter.keyRequired=You must select a recipient key. # filter.keyNotFound=Could not find an encryption key for "%S". # filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for "%S" you will no longer be able to read the emails. # strings in enigmailConvert.jsm converter.decryptBody.failed=Nepavyko iššifruoti laiÅ¡ko, kurio tema\n"%S".\nAr norÄ—tumÄ—te bandyti dar kartÄ…, naudojant kitÄ… slaptafrazÄ™, ar norite praleisti laiÅ¡kÄ…? converter.decryptAtt.failed=Nepavyko iššifruoti priedo "%1$S"\nlaiÅ¡ke, kurio tema\n"%2$S".\nAr norite bandyti dar kartÄ…, naudojant kitÄ… slaptafrazÄ™, ar verÄiau praleisti laiÅ¡kÄ…? saveLogFile.title=Ä®raÅ¡yti žurnalo failÄ… # strings in gpg.jsm unknownSigningAlg=Nežinomas pasiraÅ¡ymo algoritmas (ID: %S) unknownHashAlg=Nežinoma Å¡ifravimo maiÅ¡a (ID: %S) # strings in keyRing.jsm keyring.photo=Nuotrauka keyRing.pubKeyRevoked=Raktas %1$S (rakto ID %2$S) yra panaikintas. keyRing.pubKeyExpired=PasibaigÄ— rakto %1$S (rakto ID %2$S) galiojimas. keyRing.pubKeyNotForSigning=Raktas %1$S (rakto ID %2$S) negali bÅ«ti naudojamas pasiraÅ¡ymui. keyRing.pubKeyNotForEncryption=Raktas %1$S (rakto ID %2$S) negali bÅ«ti naudojamas Å¡ifravimui. keyRing.keyDisabled=Raktas %1$S (rakto ID %2$S) yra iÅ¡jungtas; jis negali bÅ«ti naudojamas. # keyRing.keyNotTrusted=The key %1$S (key ID %2$S) is not trusted enough. Please set the trust level of your key to "ultimate" to use it for signing. # keyRing.keyInvalid=The key %1$S (key ID %2$S) is not valid. Please consider verifying it correctly. Alternatively use the Default encryption settings in the Enigmail preferences dialog. keyRing.signSubKeysRevoked=Visi rakto %1$S (rakto ID %2$S) pasiraÅ¡ymo porakÄiai yra panaikinti. keyRing.signSubKeysExpired=Visų rakto %1$S (rakto ID %2$S) pasiraÅ¡ymo porakÄių galiojimas yra pasibaigÄ™s. keyRing.signSubKeysUnusable=Visi rakto %1$S (rakto ID %2$S) pasiraÅ¡ymo porakÄiai yra panaikinti, yra pasibaigÄ™s jų galiojimas ar jie yra kitaip netinkami naudoti. keyRing.encSubKeysRevoked=Visi rakto %1$S (rakto ID %2$S) Å¡ifravimo porakÄiai yra panaikinti. keyRing.encSubKeysExpired=PasibaigÄ— visų rakto %1$S (rakto ID %2$S) porakÄių galiojimas. # keyRing.noSecretKey=You do not seem to have the secret key for %1$S (key ID %2$S) on your keyring; you cannot use the key for signing. keyRing.encSubKeysUnusable=Visi rakto %1$S (rakto ID %2$S) Å¡ifravimo porakÄiai yra panaikinti, yra pasibaigÄ™s jų galiojimas ar jie yra kitaip netinkami naudoti. #strings in exportSettingsWizard.js cannotWriteToFile=Nepavyksta įraÅ¡yti į failÄ… "%S". PraÅ¡ome pasirinkti kitÄ… failÄ…. dataExportError=JÅ«sų duomenų eksportavimo metu įvyko klaida. # enigmailSettings=EnigmailSettings defaultBackupFileName=Enigmail-eksportavimas specifyExportFile=Nurodykite failo pavadinimÄ… eksportavimui # homedirParamNotSUpported=Additional params that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. #strings in expiry.jsm # expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use the new key. expiry.keysExpireSoon=Å ie jÅ«sų raktai nustos galioti mažiau nei po %1$S dienų:\n%2$S Rekomenduojame sukurti naujus raktus ir sukonfigÅ«ruoti savo paskyras naudoti naujus raktus. # expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to ultimate in key properties. # expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to ultimate in key properties. expiry.OpenKeyManager=Atverti Enigmail raktų tvarkymÄ… expiry.OpenKeyProperties=Atverti rakto savybes #strings in pEpDecrypt.jsm pEpDecrypt.cannotDecrypt=Tai yra Å¡ifruotas laiÅ¡kas. Deja, jÅ«s neturite Å¡io laiÅ¡ko iššifravimui skirto privaÄiojo rakto. #strings in gpgAgent.jsm gpghomedir.notexists=Katalogo "%S" su jÅ«sų OpenPGP raktais nÄ—ra ir jis negali bÅ«ti sukurtas. gpghomedir.notwritable=Katalogas "%S", kuriame yra jÅ«sų OpenPGP raktai, nÄ—ra skirtas raÅ¡ymui. gpghomedir.notdirectory=Katalogas "%S", kuriame yra jÅ«sų your OpenPGP raktai, iÅ¡ tiesų, yra failas, o ne katalogas. # gpghomedir.notusable=Please fix the directory permissions or change the location of your GnuPG "home" directory. GnuPG cannot work correctly otherwise. #strings in pepTrustWords.js # pepTrustWords.cannotVerifyOwnId=Cannot verify p≡p Trustwords for own account. pepTrustWords.cannotFindKey=Nepavyksta rasti rakto, skirto %S. # pepTrustWords.cannotStoreChange=Could not change trust for %S. # pepTrustWords.generalFailure=Cannot obtain trustwords for %S. pepTrustWords.partnerFingerprint=%S kontrolinis kodas: #strings in mimeWkdHandler.jsm # wkdMessage.body.req=Your email provider processed your request to upload your public key to the OpenPGP Web Key Directory.\n\nPlease click the confirmation button in the Enigmail header to complete the publishing of your public key. # wkdMessage.body.process=This is an email related to the automatic processing to upload your public key to the OpenPGP Web Key Directory.\n\nYou do not need to take any manual action at this point. #strings in pepHandshake.js pepPrivacyStatus.RatingBrokenSuggestion=Arba jÅ«s, arba siuntÄ—jas turÄ—tų iÅ¡siųsti laiÅ¡kÄ… iÅ¡ naujo. pepPrivacyStatus.RatingHaveNoKeySuggestionOutgoing=Jeigu jÅ«s parašėte šį laiÅ¡kÄ…, tuomet jÅ«sų raktas yra neprieinamas. # pepPrivacyStatus.RatingMistrustSuggestion=Re-establish the connection with your communication partner and try to complete another handshake. # pepPrivacyStatus.RatingReliableSuggestion=Complete a handshake with your communication partner by exchanging trustwords in person or over the phone. A handshake is needed only once per partner and will ensure secure and trusted communication. pepPrivacyStatus.RatingTrustedSuggestion=Nereikalingas joks veiksmas! pepPrivacyStatus.RatingUndefinedSuggestionIncoming=TurÄ—kite omenyje, kad Å¡is laiÅ¡kas gali bÅ«ti nesaugus. pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=PridÄ—kite reikiamÄ… informacijÄ…. # pepPrivacyStatus.RatingUnderAttackSuggestion=Separately verify the content of this message with your communication partner. # pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least secure. # pepPrivacyStatus.RatingUnencryptedSuggestion=Please ask your communication partner to use an encryption solution or install p≡p. # pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or no signature. Ask your communication partner to upgrade their encryption solution or install p≡p. pepPrivacyStatus.RatingBrokenExplanation=Å iame laiÅ¡ke yra sugadintas Å¡ifravimas ar formatavimas. pepPrivacyStatus.RatingHaveNoKeyExplanation=Å is laiÅ¡kas negali bÅ«ti iššifruotas, nes raktas nÄ—ra prieinamas. pepPrivacyStatus.RatingMistrustExplanation=Å iame laiÅ¡ke yra bendravimo partneris, kuris anksÄiau buvo pažymÄ—tas kaip nepatikimas. pepPrivacyStatus.RatingReliableExplanation=Å is laiÅ¡kas yra saugus, taÄiau vis tiek turite patvirtinti savo bendravimo partnerio tapatybÄ™. pepPrivacyStatus.RatingTrustedExplanation=Å is laiÅ¡kas yra saugus ir patikimas. pepPrivacyStatus.RatingUndefinedExplanation=Å iame laiÅ¡ke nÄ—ra pakankamai informacijos, kad bÅ«tų nusprÄ™sta ar jis yra saugus ar ne. # pepPrivacyStatus.RatingUnderAttackExplanation=This message is not secure and has been tampered with. pepPrivacyStatus.RatingUnencryptedExplanation=Å is laiÅ¡kas yra nesaugus. # pepPrivacyStatus.RatingUnencryptedForSomeExplanation=This message is unsecure for some communication partners. pepPrivacyStatus.RatingUnreliableExplanation=Å iame laiÅ¡ke yra nepatikima apsauga. # pepPrivacyStatus.RatingBrokenText=Broken pepPrivacyStatus.RatingHaveNoKeyText=Nepavyksta iššifruoti # pepPrivacyStatus.RatingMistrustText=Mistrusted pepPrivacyStatus.RatingReliableText=Saugus # pepPrivacyStatus.RatingTrustedText=Secure & Trusted pepPrivacyStatus.RatingUndefinedText=Nežinoma # pepPrivacyStatus.RatingUnderAttackText=Under Attack # pepPrivacyStatus.RatingUnencryptedForSomeText=Unsecure for Some pepPrivacyStatus.RatingUnencryptedText=Nesaugus pepPrivacyStatus.RatingUnreliableText=Nepatikimas saugumas handshakeDlg.button.initHandshake=IÅ¡ankstinis suderinimas... # handshakeDlg.button.stopTrust=Stop Trusting # handshakeDlg.button.reTrust=Stop Mistrusting # handshakeDlg.label.outgoingMessage=Outgoing message # handshakeDlg.label.incomingMessage=Incoming message # handshakeDlg.error.noPeers=Cannot handshake without any correspondents. # handshakeDlg.error.noProtection=Please enable protection in order to use the Handshake function. enigmail.acSetupPasswd.descEnterPasswd=Ä®veskite kitame įrenginyje rodomÄ… sÄ…rankos kodÄ… enigmail.acSetupPasswd.descCopyPasswd=NorÄ—dami tÄ™sti sÄ…rankÄ…, įveskite žemiau esantį sÄ…rankos kodÄ… savo kitame įrenginyje #strings in autocrypt.jsm # autocrypt.setupMsg.subject=Autocrypt Setup Message autocrypt.setupMsg.msgBody=NorÄ—dami nusistatyti savo naujajame įrenginyje Autocrypt, sekite instrukcijÄ…, kuriÄ… turÄ—tų pateikti jÅ«sų naujasis įrenginys. # autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code presented on your old device, and then import the contained key into your keyring. #strings in upgradeInfo.html upgradeInfo.doctitle=Kas naujo Enigmail v2.0? upgradeInfo.welcome1=Sveiki atvykÄ™ į naujÄ…jÄ… Enigmail versijÄ… 2.0! upgradeInfo.welcome2=Å ioje laidoje yra daug naujų ir pakeistų ypatybių. Skirkite minutÄ—lÄ™ ir sužinokite kas naujo: # upgradeInfo.encSubject.title=Encrypting the Message Subject # upgradeInfo.encSubject.desc=We developed a new method that moves the email subject into the encrypted message, and replaces the visible subject with "Encrypted Message". Once such a message is decrypted, the original subject is replaced automatically. Hiding the subject is on by default; there is a preference to turn it off if you don't like it. (Note: this feature requires the message to be sent with PGP/MIME.) # upgradeInfo.buttons.title=Changed behavior of Encrypt and Sign Buttons # upgradeInfo.buttons.desc=The Encrypt and Sign buttons in the message composer window now work for both the OpenPGP and S/MIME protocols. If both algorithms are possible, then Enigmail will try to prefer the one for which all keys are available. upgradeInfo.autocrypt.title=Autocrypt palaikymas upgradeInfo.autocrypt.desc=Dabar, Enigmail palaiko Autocrypt, naujÄ… standartÄ…, skirtÄ… platinti raktus kaip iÅ¡siųstų laiÅ¡kų dalį. Enigmail automatiÅ¡kai importuoja raktus iÅ¡ su Autocrypt suderinamų laiÅ¡kų ir tokiu bÅ«du, bÄ—gant laikui, gali bÅ«ti Å¡ifruota vis daugiau ir daugiau laiÅ¡kų. # upgradeInfo.pEp.title=New p≡p Junior Mode (Pretty Easy Privacy) # upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. You currently need to manually install p≡p for this purpose; this will change in a future release. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. upgradeInfo.bottom.desc=NorÄ—dami gauti pagalbos, naudojantis Enigmail, apsilankykite mÅ«sų dokumentacijos puslapyje. # pep.missingGnuPG=In order to use Enigmail/p≡p, GnuPG is required. As we could not find it, we suggest to download and install it for you. #strings in enigmailAbout.html # aboutEnigmail.tabName=About Enigmail aboutEnigmail.title=Enigmail pateikiamas OpenPGP palaikymas aboutEnigmail.team=Enigmail kuria Enigmail komanda: # aboutEnigmail.projectLeader=Lead Developer: aboutEnigmail.usability=Naudojimosi patogumas: aboutEnigmail.documentation=Dokumentacija: aboutEnigmail.testing=Testavimas: aboutEnigmail.userSupport=Naudotojų palaikymas: aboutEnigmail.localization=Lokalizavimas: ŽiÅ«rÄ—kite Enigmail kalbų paketų puslapį aboutEnigmail.Credits=PadÄ—kos: aboutEnigmail.origAuthor=Pradinis Enigmail plÄ—tinio autorius aboutEnigmail.icons=Piktogramos: aboutEnigmail.formerMembers=BuvÄ™ komandos nariai: # aboutEnigmail.projectHosting=Project hosting: aboutEnigmail.licenseSupportTitle=Licencija ir palaikymas aboutEnigmail.license=Enigmail OpenPGP atvirojo kodo ir yra licencijuota pagal %S aboutEnigmail.support=Palaikymas ir atsiuntimai yra prieinami iÅ¡ www.enigmail.net. enigmail-2.0.8/lang/lt/help/000077500000000000000000000000001334302754500156045ustar00rootroot00000000000000enigmail-2.0.8/lang/lt/help/compose.html000066400000000000000000000100761334302754500201430ustar00rootroot00000000000000 Enigmail Help: Message Composition

Enigmail Help

Using Enigmail when composing messages

Enigmail menu in Mail/Compose window
Sign message
Enable/Disable sending signed mail. User is notified, if signing fails.
Encrypt message

Enable/Disable encryption to all recipient(s) before sending. User is notified, if encryption fails.

If Display selection when necessary is set in Preferences -> Key Selection tab, a list of keys will pop up if there are addresses in the list of recipients for the message for whom you have no public key.

If Never display OpenPGP key selection dialog is set in Preferences -> Key Selection tab, and there are addresses in the list of recipients for the message for whom you have no public key, the message will be sent unencrypted.

Use PGP/MIME for this message
Enable/Disable the use of PGP/MIME for this message.

If you know the recipient(s) can read mail using the PGP/MIME format, you should use it.

This feature is dependent on the settings in Preferences -> PGP/MIME tab being set to Allow to use PGP/MIME or Always use PGP/MIME.

Default composition options
  • Signing/Encryption Options...: shortcut to Account Settings -> OpenPGP Options.
  • Send options...: shortcut to Preferences -> Send tab.
  • Key selection options...: shortcut to Preferences -> Key Selection tab.
  • PGP/MIME options...: shortcut to Preferences -> PGP/MIME tab.
Undo encryption

If there is a failure when actually sending mail, such as the POP server not accepting the request, Enigmail will not know about it, and the encrypted message will continue to be displayed in the Compose window. Choosing this menu item will undo the encryption/signing, reverting the Compose window back to its original text.

As a temporary fix, this option may also be used to decrypt the quoted text when replying to encrypted messages. Enigmail should automatically decrypt the quoted message, but if that fails for some reason, you can use this menu item to force it.

Insert public key
insert ASCII-armored public key block at the current cursor location in the Compose window. You will be prompted for the email addresses of the key(s) to be inserted. Keys inserted in this manner will automatically be recognized at the receiving end by Enigmail. After key insertion, you may still choose to sign/encrypt the mail as needed. Also, do not insert more than one key block in a message; just specify multiple email addresses, separated by commas or spaces, when prompted.
Clear save passphrase
Clears cached passphrase. Useful if you have multiple passphrases.
Help
Displays Help information from the website (this page).

Further help is available on the Enigmail Help web page

enigmail-2.0.8/lang/lt/help/editRcptRule.html000066400000000000000000000115601334302754500211030ustar00rootroot00000000000000 Enigmail Help: Edit OpenPGP Rule

Enigmail Help

Using the Enigmail Rules Editor: Edit OpenPGP Rule

In the Rules Editor, you can specify defaults per recipient for enabling encryption, signing and PGP/MIME, and to define what OpenPGP key(s) to use. In this dialog, you can specify the rules for a single recipient, and for a group of recipients with very similar attributes.

Set OpenPGP Rules for
Contains the email addresses of the recipients (without names, i.e. just an address like somebody@email.domain). You can specify several email addresses, separated by spaces. The address specified here can consist of only the domain section so that mail to any address at that domain will be matched, e.g. @email.domain will allow matching to body@email.domain, somebody@email.domain, anybody@email.domain, etc.
Apply rule if recipient ...
This modifies the matching of the email addresses. If multiple addresses are entered, the setting will apply to all. The examples below are based on body@email.domain entered in the OpenPGP Rules field above.
  • Is exactly: with this setting, the rule will only trigger on emails to body@email.domain (exact, case insensitive matching).
  • Contains: with this setting, any email address containing the string is matched, e.g. anybody@email.domain or body@email.domain.net
  • Begins with: with this setting, any email address starting with the string is matched, e.g. body@email.domain.net, body@email.domain-name.com.
  • Ends with: with this setting, any email address ending with the string is matched, e.g. anybody@email.domain , somebody@email.domain.
Continue with the next rule for the matching address
Enabling this function will allow you to define a rule but not have to specify a KeyID in the Use the following OpenPGP keys: field, so that the email address is used to check for a key at the time of sending. Also, further rules for the same address(es) will be processed as well.
Do not check further rules for the matching address
Enabling this function stops processing any other rules for the matching address(es) if this rule is matched; i.e. rule processing continues with the next recipient.
Use the following OpenPGP keys:
Use the Select Key(s).. button to select the recipient keys to be used for encryption. As in the action above, no further rules for the matching address(es) are processed.
Default for Signing
Enable or disable message signing. This either uses or overrides what you have specified in the message composition window. The values are:
  • Never: disable signing, even if it was enabled in the message composition window (overrules the other values)
  • Yes, if selected from in Message Composition: leave signing as specified in the message composition window
  • Always: enable signing, even if it was not enabled in the message composition window
These signing settings are applied for all rules that match. If one of the rules disables signing, the message will not be signed, regardless of other rules that specify Always.
Encryption
Enable or disable message encryption. The allowed settings and their meaning are the same as for message signing.
PGP/MIME
Enable or disable the use of the PGP/MIME (RFC 3156) message encoding. If PGP/MIME is disabled, the messages are encoded using "inline PGP". The allowed values and their meaning are the same as for message signing.

The rules are processed in the order displayed in the list in the OpenPGP Rules Editor. Whenever a rule matches a recipient and contains a OpenPGP Key ID, in addition to using the specified Key ID, the recipient is not considered anymore when processing further rules.


Further help is available on the Enigmail Per-Recipient Settings page

enigmail-2.0.8/lang/lt/help/help.html000066400000000000000000000103551334302754500174260ustar00rootroot00000000000000 Enigmail Help

Enigmail Help

Using Enigmail when reading messages

  • Decrypt button in main Mail window
    This button can be used for several purposes: decrypt, verify, or import public keys. Normally decryption/verification happens automatically, although this can be disabled through a preference. However, if this fails, usually a short error message will appear in the Enigmail status line. If you click the Decrypt button, you will be able to see a more detailed error message, including the output from the GnuPG command.
  • Pen and Key icons in Message Header display
    The Pen and Key icons in the Message Header display indicate if the message you are reading was signed and/or encrypted and if the signature is good, i.e. the message has not been changed since it was signed. If the message has been changed, the Pen icon will change to a Broken Pen to indicate that the signature is bad. Right clicking on either the Pen or Key icons will bring up a menu with the following options:
    • OpenPGP Security info: allows you to view the output status from GnuPG for the message.
    • Copy OpenPGP Security info: copies the output status from GnuPG to the clipboard; to paste into a reply message, etc.
    • View OpenPGP Photo ID: allows you to view the Photo ID of the person who sent the message, if they have a photo embedded in their Public Key. (This option will only be enabled if a Photo ID exists in their key.)
    • S/MIME Security info: allows you to view the S/MIME Security Info for the message.

    If you do not have keyserver-options auto-key-retrieve set in your gpg.conf file and you read a message which is signed or encrypted, you will see a Pen icon in the headers display area with a Question mark on it, the Enigmail status line in the headers area will say Part of the message signed; click pen icon for details and the message in the Message Pane will show all the OpenPGP message block indicators and the signature block.

    You may also see this if you have keyserver-options auto-key-retrieve set in your gpg.conf file and the OpenPGP key is not available on the default keyserver.

    Clicking on the Pen and Question mark icon will bring up a window advising that the key is unavailable in your keyring. Clicking on OK will bring up another window with a list of keyservers from which you can select to download the sender's public key from.

    To configure the list of keyservers you wish to use, go to Enigmail -> Preferences -> Basic tab and enter the keyserver addresses in the Keyserver(s): box, separated by a comma. The first keyserver in the list will be used as the default.

  • Opening encrypted attachments / importing attached OpenPGP keys
    Attachments named *.pgp, *.asc and *.gpg are recognized as attachments that can be handled specially by Enigmail. Right clicking on such an attachment enables two special menu items in the context menu: Decrypt and Open and Decrypt and Save. Use these two menu items if you want Enigmail to decrypt an attachment before opening or saving it. If an attachment is recognized as an OpenPGP key file, you are offered to import the keys it into your keyrings.

Further help is available on the Enigmail OpenPGP Help web page
If you have questions or comments about enigmail, please send a message to the Enigmail OpenPGP mailing list

Enigmail OpenPGP is open source and licensed under the Mozilla Public License

enigmail-2.0.8/lang/lt/help/initError.html000066400000000000000000000045421334302754500204540ustar00rootroot00000000000000 Enigmail Help: How to Resolve Problems with Initializing OpenPGP

Enigmail Help

How to Resolve Problems with Initializing OpenPGP

There are several reasons why initializing OpenPGP does not succeed. The most common ones are described below; for more information please visit the Enigmail Support page.

GnuPG could not be found

In order for OpenPGP to work, the tool GnuPG needs to be installed. If GnuPG cannot be found, then first make sure that the executable gpg.exe (on Windows; gpg on other platforms) is installed on your computer. If GnuPG is installed, and OpenPGP cannot find it, then you need to manually set the path to GnuPG in the OpenPGP Preferences (menu OpenPGP > Preferences)

Enigmime failed to initialize

OpenPGP works only if it is built using the same build environment as Thunderbird or SeaMonkey was built. This means that you can use the official Enigmail releases only if you use the official releases of Thunderbird or SeaMonkey provided by mozilla.org.

If you use a Thunderbird or SeaMonkey version coming from some other source (e.g. the provider of your Linux distribution), or if you built the application yourself, you should either use an Enigmail version built by the same source, or build Enigmail yourself. For building Enigmail, refer to the Source Code section on the Enigmail home page. Please don't file any bug report concerning this problem, it is not solvable.

Further help is available on the Enigmail Support Web Site.

enigmail-2.0.8/lang/lt/help/messenger.html000066400000000000000000000101221334302754500204560ustar00rootroot00000000000000 Enigmail Help: Message Reading

Enigmail Help

Using Enigmail when reading messages

Decrypt button in main Mail window
This button can be used for several purposes: decrypt, verify, or import public keys. Normally decryption/verification happens automatically, although this can be disabled through a preference. However, if this fails, usually a short error message will appear in the Enigmail status line. If you click the Decrypt button, you will be able to see a more detailed error message, including the output from the GnuPG command.
Pen and Key icons in Message Header display
The Pen and Key icons in the Message Header display indicate if the message you are reading was signed and/or encrypted and if the signature is good, i.e. the message has not been changed since it was signed. If the message has been changed, the Pen icon will change to a Broken Pen to indicate that the signature is bad. Right clicking on either the Pen or Key icons will bring up a menu with the following options:
  • OpenPGP Security info: allows you to view the output status from GnuPG for the message.
  • Copy OpenPGP Security info: copies the output status from GnuPG to the clipboard; to paste into a reply message, etc.
  • View OpenPGP Photo ID: allows you to view the Photo ID of the person who sent the message, if they have a photo embedded in their Public Key. (This option will only be enabled if a Photo ID exists in their key.)
  • S/MIME Security info: allows you to view the S/MIME Security Info for the message.

If you do not have keyserver-options auto-key-retrieve set in your gpg.conf file and you read a message which is signed or encrypted, you will see a Pen icon in the headers display area with a Question mark on it, the Enigmail status line in the headers area will say Part of the message signed; click pen icon for details and the message in the Message Pane will show all the OpenPGP message block indicators and the signature block.

You may also see this if you have keyserver-options auto-key-retrieve set in your gpg.conf file and the OpenPGP key is not available on the default keyserver.

Clicking on the Pen and Question mark icon will bring up a window advising that the key is unavailable in your keyring. Clicking on OK will bring up another window with a list of keyservers from which you can select to download the sender's public key from.

To configure the list of keyservers you wish to use, go to Enigmail -> Preferences -> Basic tab and enter the keyserver addresses in the Keyserver(s): box, separated by a comma. The first keyserver in the list will be used as the default.

Opening encrypted attachments / importing attached OpenPGP keys
Attachments named *.pgp, *.asc and *.gpg are recognized as attachments that can be handled specially by Enigmail. Right clicking on such an attachment enables two special menu items in the context menu: Decrypt and Open and Decrypt and Save. Use these two menu items if you want Enigmail to decrypt an attachment before opening or saving it. If an attachment is recognized as an OpenPGP key file, you are offered to import the keys it into your keyrings.

Further help is available on the Enigmail Help web page

enigmail-2.0.8/lang/lt/help/rulesEditor.html000066400000000000000000000060331334302754500207750ustar00rootroot00000000000000 Enigmail Help: Rules Editor

Enigmail Help

Using the Enigmail Rules Editor

In the Rules Editor, you can specify defaults per recipient for enabling encryption, signing and PGP/MIME, and to define what OpenPGP key(s) to use. Each rule consists of 5 fields and is represented on a single line:

Email
The e-mail(s) from the To:, Cc: and Bcc: fields to match. The matching works on substrings (Further details can be found in the Edit Rule dialog)
OpenPGP Key(s)
a list of OpenPGP Key ID's to use for the recipient
Sign
enable or disable message signing. This either uses or overrides what you have specified in the message composition window. The values are:
  • Never: disable signing, even if it was enabled in the message composition window (overrules the other values)
  • Possible: leave signing as specified in the message composition window
  • Always: enable signing, even if it was not enabled in the message composition window

These signing settings are applied for all rules that match. If one of the rules disables signing, the message will not be signed, regardless of other rules that specify Always.

Encrypt
enable or disable message encryption. The allowed settings and their meaning are the same as for message signing.
PGP/MIME
enable or disable the use of the PGP/MIME (RFC 3156) message encoding. If PGP/MIME is disabled, the messages are encoded using "inline PGP". The allowed values and their meaning a re the same as for message signing.

The rules are processed in the order displayed in the list. Whenever a rule matches a recipient and contains a OpenPGP Key ID, in addition to using the specified Key ID, the recipient is not considered anymore when processing further rules.

Note: The rule editor is not yet complete. It is possible to write some more advanced rules by directly editing the rules file (these rules should then not be edited anymore in the rule editor). Further information for directly editing the file is available on the Enigmail Homepage


Further help is available on the Enigmail Help web page

enigmail-2.0.8/lang/lt/help/sendingPrefs.html000066400000000000000000000047771334302754500211400ustar00rootroot00000000000000 Enigmail Help: Edit OpenPGP Rule

Enigmail Help

Defining Preferences to Send Encrypted

In the Sending Preferences you can choose the general model and preferences for encryption.

Convenient Encryption
With these settings, emails are encrypted without confirmation whenever possible.

This setup is appropriate, if you just want to improve your privacy by sending emails encyrpted instead of unencrypted if that's possible.

The effect is like sending emails as letters instead of postcards. Unlike postcards, letters usually hide their contents while in transit.

Note however that as with letters you can't be sure that nobody is opening the letter while it is in transit (although, some technical effort is necessary for that).

A concrete risk is that you accidentally use "faked keys" you got from somewhere or somebody claiming that the key belongs to the person you want to send emails to. To avoid this risk, you can either use the trust model of PGP (see below) or you should always verify, whether the fingerprint of a public key is correct.

Manual Encryption
This option allows you to specify the different preferences for encryption according to your needs. You can specify
  • whether replies to encrypted/signed emails should automatically also be encrypted/signed-
  • whether to use the trust model of OpenPGP to accept keys (this means that to use a key you either have to sign the key or have enough other people you trust having signed the key).
  • whether you want to automatically send emails encrypted if all keys are accepted.
  • whether and when you want to finally confirm sending an email.
If it is important for you that content you send encrypted can't be read by other people or organizations, you should use the manual preferences at least choose the option to accept keys only if you or other people signed them. While this model reduces the risk of using faked keys, it requires that you actively sign keys and declare owner trust using the key managament dialog. enigmail-2.0.8/lang/make-lang.sh000066400000000000000000000060721334302754500164320ustar00rootroot00000000000000#!/bin/sh # make-lang.sh v1.0.10 # this script is used to create a language-specifi XPI for Enigmail # if you want to debug this script, set DEBUG to something >0 DEBUG=0 if [ $# -ne 2 ]; then echo "Usage: $0 xx-YY version" echo " where: xx-YY is the language and country code representing the" echo " translated language" echo " version is the Enigmail version, e.g. 0.84.1" exit 1 fi ENIGLANG=$1 export ENIGLANG ENIGVERSION=$2 export ENIGVERSION LANGDIR=${ENIGLANG}/chrome/locale/${ENIGLANG}/enigmail HELPDIR=${LANGDIR}/help cwd=`pwd` rm -rf ${LANGDIR} >/dev/null 2>&1 mkdir -p ${LANGDIR} mkdir -p ${HELPDIR} LANGHASH=`echo "${ENIGLANG}" | md5sum | awk '{ print substr($0,1,2)}'` export LANGHASH # create chrome.manifest for Thunderbird 3.1 and newer cat > ${ENIGLANG}/chrome.manifest < ${ENIGLANG}/install.rdf < enigmail-${ENIGLANG}@www.enigmail.net ${ENIGVERSION} {3550f703-e582-4d05-9a08-453d09bdfdc6} 3.1 3.1.* {92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a} 2.0 2.1.* Enigmail ${ENIGLANG} Enigmail ${ENIGLANG} language package Enigmail Team https://www.enigmail.net/langpack.html chrome://enigmail/content/pref-enigmail.xul chrome://enigmail/content/enigmailAbout.xul chrome://enigmail/skin/enigmail-about.png EOT for f in enigmail.dtd enigmail.properties am-enigprefs.properties upgrade_080.html ; do cp ${f} ${LANGDIR} done if [ -d help ]; then cd help fi pwd for f in compose.html editRcptRule.html initError.html messenger.html rulesEditor.html sendingPrefs ; do cp ${f} ${cwd}/${HELPDIR} done cd ${cwd}/${ENIGLANG}/chrome zip -r -D enigmail-${ENIGLANG}.jar locale cd .. zip ../enigmail-${ENIGLANG}-${ENIGVERSION}.xpi install.rdf chrome.manifest chrome/enigmail-${ENIGLANG}.jar cd .. test $DEBUG -eq 0 && rm -rf ${ENIGLANG} enigmail-2.0.8/lang/nb-NO/000077500000000000000000000000001334302754500151465ustar00rootroot00000000000000enigmail-2.0.8/lang/nb-NO/am-enigprefs.properties000066400000000000000000000001221334302754500216340ustar00rootroot00000000000000# Strings used in the Mozill AccountManager prefPanel-enigprefs=OpenPGP Sikkerhet enigmail-2.0.8/lang/nb-NO/enigmail.dtd000066400000000000000000001761321334302754500174420ustar00rootroot00000000000000 Mozilla Public License 2.0."> 'Autocrypt-nøkkeloverføring' krever at e-postklienten på den andre enheten har Autocrypt-støtte. Selv om dette er den enkleste løsningen, er det foreløpig kun et par programmer som har støtte for standarden. Den andre måten er 'Sikkerhetskopi og gjenoppretting' av innstillingene dine. Dette vil opprette en ZIP-fil og all påkrevd informasjon og nøkler, som du så kan kopiere til din nye enhet. Enigmail kan importere disse innstillingene direkte; for andre e-postklienter, kan ZIP-filen pakkes ut og håndteres manuelt."> '"> ' for å spesifisere epostadresser"> ' for å spesifsere epostadresser for GnuPG. Deaktiver om mottakerne bruker gamle Hushmail-nøkler."> OpenPGP-sikkerhet)"> MERK: Nøkkelgenerering kan ta intill flere minutter å gjennomføre. Ikke avbryt programmet mens nøkkelgenerering pågår. Gjennomføring av harddisk-insentive oppgavevr mens nøkkelgenrerering pågår vil gjøre prosessen hurtigere. Du vil få beskjed når nøkkelgenerering er fullført."> Autocrypt er en standard som definerer hvordan man oppnår beleilig ende-til-ende -kryptering av e-post. Den definerer hvordan e-postprogrammer forhandler krypteringsmuligheter ved bruk av vanlige e-poster."> ' er ugyldig"> MERK: Nøkkelgenerering kan ta flere minutter, ikke avslutt programmet, du vil få beskjed når det er fullført."> MER: Enigmail vil alltid prøve å bekrefte signaturer i eposter, om det er aktivert for en konto eller ikke"> offentlige nøkkel brukes av andre for å sende deg krypterte eposter. Du kan dele denne med alle. "> private nøkkel er kun for deg for å dekryptere motatte meldinger og for å sende signerte meldinger. Du bør ikke dele den med noen."> private nøkkel er kun for deg for å dekryptere motatte meldinger og for å sende signerte meldinger. Du bør ikke dele den med noen. For å beskytte den private nøkkelen din vil du bli bedt om angi en passfrase i de to følgende dialogboksene."> Passfrasen er for å beskytte den private nøkkelen din. Den forhindrer misbruk av din private nøkkel."> ikke"> Du vil bli forespurt inntasting av ditt passord for dette. Overfør sertifikatet på et medium som kan lagres trygt, som en CD-plate eller et USB-minne. Hvis noen får tilgang til sertifikatet, kan de bruke det til å gjøre nøkkelen din ubrukelig."> eksporter dataene dine fra din gamle datamaskin ved hjelp av veiviseren for sikkerhetskopiering i Engimail-innstillinger importer dataene til en annen maskin ved hjelp av denne veiviseren. "> Takk for at du bruker Enigmail."> Bekreft forespørselen du finner i innboksen din hvis du ønsker å gjøre det."> eksporter dataene dine fra din gamle datamaskin ved hjelp av denne veiviseren importer dataene til en annen maskin ved hjelp av oppsettsveiviseren. "> Velg kontoen du ønsker å overføre nøkkelen din fra. En oppsettskode (passord) på påfølgende skjerm vil vises, som du må skrive inn på den andre enheten for å importere din nøkkel og relaterte innstillinger."> Bytt til den andre enheten nå og åpne meldingen. Du vil bli forespurt en oppsettskode. Skriv inn følgende tall inn i ledeteksten:"> enigmail-2.0.8/lang/nb-NO/enigmail.properties000066400000000000000000001502371334302754500210610ustar00rootroot00000000000000Enigmail=Enigmail ##################################################################### # Strings used within enigmailCommon.js and enigmailCommon.jsm ##################################################################### enigAlert=Enigmail varsel enigConfirm=Enigmail bekreftelse enigInfo=Enigmail-informasjon enigError=Enigmail feil enigPrompt=Enigmail forespørsel dlgYes=&Ja dlgNo=&Nei dlgKeepSetting=Husk svaret og ikke spør igjen dlgNoPrompt=Ikke vis meg denne dialogen igjen dlg.button.delete=&Slett dlg.button.cancel=&Avbryt dlg.button.close=&Lukk dlg.button.continue=&Fortsett dlg.button.skip=&Hopp over dlg.button.overwrite=&Overskriv dlg.button.view=&Vis dlg.button.retry=&Prøv igjen dlg.button.ignore=&Ignorer dlg.button.install=&Installer dlg.button.ok=&OK repeatPrefix=\n \n \nDenne meldingen vil gjentas %S repeatSuffixSingular=gang til. repeatSuffixPlural=ganger til. noRepeat=\n \n \nDette varselet vil ikke gjentas før du oppgraderer Enigmail. pgpNotSupported=Du ser ut til å bruke Enigmail sammen med with PGP 6.x\n\\Beklaglivis er ikke dette støttet da PGP 6.x har en rekke kompabilitetsproblemer med Enigmail. Hjelp for å endre til GnuPG finnes på websidene. initErr.howToFixIt=For å kunne bruke Enigmail kreves GnuPG. Hvis du ikke har installert GnuPG ennå kan du gjøre dette ved hjelp av oppsettsveilederknappen under. initErr.setupWizard.button=&Oppsettsveileder passphraseCleared=Passfrasen har blitt nullstilt. cannotClearPassphrase=Du bruker et ikke-standard verktøy (f.eks. gnome-keyring) for passfrasehåndtering. Det er derfor ikke mulig å tilbakestille passfrasen i Enigmail. noPhotoAvailable=Intet bilde tilgjengelig debugLog.title=Enigmail Debug Log error.photoPathNotReadable=Bildesti '%S' er ikke lesbar generalError=Feil: %S # Strings in configure.jsm enigmailCommon.versionSignificantlyChanged=Denne versjonen av Enigmail har omfattende endringer i håndteringen av innstillinger. Vi har forsøkt å overføre dine gamle innstllinger til denne versjonen, men det fungerer ikke for alle typer innstillinger. Vennligst dobbeltsjekk de nye innstillingene dine. enigmailCommon.checkPreferences=Sjekk innstillinger ... preferences.defaultToPgpMime=Vi har endret standard meldingskoding i Enigmail fra Inline-PGP til PGP/MIME. Vi anbefaler at du beholder dette som standard. \n \nHvis du fortsatt vil bruke Inline-PGP som standard kan du sette dette i konto-innstillinger under OpenPGP-sikkerhet. ##################################################################### # Strings in enigmailAbout.js ##################################################################### usingVersion=Kjører Enigmail versjon %S enigmailPepVersion=Enigmail/p≡p-versjon %S usingAgent=Bruker %S filen %S til å kryptere og dekryptere agentError=FEIL: Klarer ikke å få tilgang til enigmail! ##################################################################### # Strings in enigmailKeygen.js ##################################################################### accessError=Feil i tilgang til Enigmail-tjenesten onlyGPG=Nøkkelgenerering fungerer kun med GnuPG (ikke med PGP)! keygenComplete=Nøkkelgenerering fullført! Identitet <%S> vil bli brukt til signering. revokeCertRecommended=Vi anbefaler på det sterkeste å lage et tilbaketrekkingssertifikat. F.eks. om du skulle miste den private nøkkelen eller passfrasen din kommer på avveie. Ønsker du å lage dette sertifikatet nå? keyMan.button.generateCert=&Generer sertifikat genCompleteNoSign=Nøkkelgenerering fullført! genGoing=Nøkkelgenerering pågår allerede! passNoMatch=Passfrasene stemmer ikke overens, vennligst prøv igjen. passCheckBox=Kryss av for om nøkkelen ikke skal beskyttes med passfrase passUserName=Angi brukernavn for denne identiteten keygen.missingUserName=Det er ikke angitt noe navn for den valgte kontoen/identiteten. Angi en verdi i feltet "Ditt navn" i kontoinnstillinger. keygen.passCharProblem=Du bruker spesialtegn i passfrasen din. Dessverre kan dette skape problemer for andre applikasjoner. Vi anbefaler at du kun benytter tegn fra følgende grupper: \na-z A-Z 0-9 /.;:-,!?(){}[]%* passSpaceProblem=Av tekniske årsaker kan ikke passfrasen din starte eller slutte med mellomromstegnet. changePassFailed=Endring av passfrase mislyktes. keyConfirm=Generer offentlige og private nøkler for '%S'? keyMan.button.generateKey=&Genererer nøkkel keyAbort=Avbryt nøkkelgenerering? keyMan.button.generateKeyAbort=&Avbryt nøkkelgenerering keyMan.button.generateKeyContinue=&Fortsett nøkkelgenerering expiryTooLong=Du kan ikke lage en nøkkel som utløper om mer enn 100 år. expiryTooLongShorter=Du kan ikke lage en nøkkel som utløper om mer enn 90 år. expiryTooShort=Nøkkelen må være gyldig i minst én dag. keyGenFailed=Nøkkelgenereringen feilet. Vennligst sjekk Enigmail konsollen(Meny Enigmail > feilsøk Enigmail) for mer detaljer. setKeyExpirationDateFailed=Utløpsdatoen kunne ikke endres. # Strings in enigmailMessengerOverlay.js securityInfo=Enigmail sikkerhetsinformasjon\n\n enigHeader=Enigmail: enigContentNote=Enigmail: *Vedleggene i denne eposten har ikke blitt signert eller kryptert*\n\n possiblyPgpMime=Mulig PGP/MIME kryptert eller signert melding; klikk knapp for dekryptering for å bekrefte saveAttachmentHeader=Enigmail: Lagre dekryptert vedlegg noTempDir=Kunne ikke finne en midlertidig mappe å skrive til\nVennligst sett TEMP-miljøvariablen attachmentPgpKey=Vedlegget '%S' du åpner tyder på å være en OpenPGP-nøkkel\n\nKlikk Ja for å importere nøklene eller Nei for å se hva de inneholder i et vindu. beginPgpPart=********* *BEGYNN KRYPTERT ELLER SIGNERT DEL* ********* endPgpPart=********** *AVSLUTT KRYPTERT ELLER SIGNERT DEL* ********** notePartEncrypted=Enigmail: *Deler av meldignen har IKKE blitt krypert eller signert* noteCutMessage=Enigmail: *Flere meldingsblokker funnet -- dekryptering/bekreftelse avsluttet* decryptOkNoSig=Advarsel\n\nDekryptering var vellykket, men signaturen kunne ikke bekreftes. msgOvl.button.contAnyway=&Fortsett uansett signature.verifiedOK=Signaturen på vedlegg %S lot seg verifisere signature.verifyFailed=Signaturen på vedlegg %S lot seg ikke verifisere attachment.noMatchToSignature=Kunne ikke finne tilhørende signaturfil for vedlegg '%S' attachment.noMatchFromSignature=Kunne ikke finne et vedlegg tilhørende signaturfil '%S' fixBrokenExchangeMsg.failed=Klarte ikke å reparere meldingen enigmail.msgViewColumn.label=Enigmal enigmailPep.msgViewColumn.label=Enigmail/p≡p wksNoIdentity=Dene nøkkelen er ikke lenket til noen av dine e-postkontoer. Legg til en konto for minst én av følgende e-postadresse(r):\n\n%S wksConfirmSuccess=Bekreftelses-e-post sendt. wksConfirmFailure=Sending av bekreftelses-e-posten mislyktes. autocrypt.importSetupKey.accountPreconfigured=Kontoen din er allerede satt opp riktig for Autocrypt.\n\nØnsker du å overskrive innstillingene dine med denne oppsettsmeldingen? autocrypt.importSetupKey.selfCreated=Meldingen ble opprettet av den nåværende kjørende Enigmail-instansen.\n\nBytt til e-postklienten du ønsker å overføre innstillingene til, og klikk på meldingen på den på den e-postklienten for å importere innstillingene. autocrypt.importSetupKey.invalidMessage=Feil - kunne ikke lese oppsettsmeldingen. Meldingen ser ut til å være skadet. Prøv å opprette en ny oppsettsmelding på din "andre" enhet. autocrypt.importSetupKey.invalidKey=Feil - nøkkelen kunne ikke importeres. Nøkkelen er enten ikke støttet av din versjon av GnuPG, eller så har den blitt skadet. autocrypt.importSetupKey.wrongPasswd=Passordet du skrev inn er feil. Ønsker du å prøve igjen? autocrypt.importSetupKey.success=Autocrypt-oppsettsmeldingen ble behandlet. Autocrypt er nå tilgjengelig for din konto "%S". ##################################################################### # Strings in enigmailMsgComposeOverlay.js ##################################################################### keysToExport=Velg OpenPGP nøkkel å sette inn keysToUse=Velg OpenPGP Nøkkel/Nøkler å bruke for %S pubKey=Offentlig nøkkel for %S\n windowLocked=skrive-vindu er låst; sending avbrutt sendUnencrypted=Feilet å starte enigmine.\nSend melding ukryptert? composeSpecifyEmail=Vennligst spesifiser primær epostadresse, som vil bli brukt til å velge en signeringsnøkkel for utgående meldinger.\n Om blank vil FRA-adressen til meldingen bli brukt til å bestemme nøkkel. sendingHiddenRcpt=Denne meldingen har BCC (blindkopi)-mottakere. Hvis meldingen krypteres er det mulig å skjule BCC-mottakere, men noen programmer (fra bla. PGP Corp.) vil ikke kunne dekryptere meldingen. På grunn av dette anbefaler vi å ikke bruke BCC-mottakere i krypterte meldinger. sendWithHiddenBcc=Skjul BCC-mottakere sendWithShownBcc=Krypter på normal måte sendingNews=Kryptert sendingsoperasjon avbrutt.\n\nDenne meldingen kunne ikke sendes fordi der er meldingsgruppe-mottagere. sendToNewsWarning=Advarsel: du er i ferd med å sende en kryptert epost til en nyhetsgruppe. \n \nDette er ikke anbefalt siden det kun gir mening om alle medlemmene av gruppen kan dekryptere meldingen, dvs. at meldingen må krypteres med nøklene til samtlige gruppemedlemmer. Vennligst send meldingen kun hvis du vet nøyaktig hva du gjør. \n \nFortsett? hasHTML=HTML meldingsvarsel:\nDenne meldingen kan inneholde HTML, som kan forårsake signering/kryptering til å feile. Deaktiver HTML-meldinger om du ønsker å benytte denne funksjonen. strippingHTML=Meldingen inneholder HTML-informasjon som vil bli tapt under konvertering til enkel tekst. Ønsker du å fortsette? msgCompose.button.sendAnyway=&Send melding uansett attachWarning=Vedlegg til denne meldingen er ikke lagret lokalt, og kan ikke bli kryptert. Om du ønsker å kryptere vedleggene, lagre dem lokalt og legg dem ved. Ønsker du likevel å fortsette? quotedPrintableWarn=Du har aktivert 'quoted-printable' koding for sending av meldinger. dette kan resultare i ukorrekt kryptering og/eller verifisering av meldingen.\n Ønsker du å skru av 'quoted-printable' nå? minimalLineWrapping=Du har angitt at tekstlinjer skal brytes ved %S tegn. For korrept kryptering og/eller signering må denne verdien være minst 68. \nVil du endre tekstbryting til 68 tegn? warning=Advarsel signIconClicked=Du har manuelt modifisert signering. Derfor vil ikke (de)aktivering av signering avhenge av (de)aktivering av kryptering. errorOwnKeyUnusable=Nøkkel-IDen '%S' som er satt opp for den gjeldende identiteten gir ikke en anvendbar OpenPGP-nøkkel. \n \nForsikre deg om at du har en gyldig, ikke utløpt OpenPGP-nøkkel og at kontoinnstillingene dine peker til denne nøkkelen. \nHvis nøkkelen din ikke er utløpt sjekk om du har satt eiertillit til "full" eller "ultimat". msgCompose.cannotSaveDraft=Feil under lagring av utkast msgCompose.partiallyEncrypted.short=Pass deg for å lekke sensitiv informasjon - i særdeleshet kryptert e-post. msgCompose.partiallyEncrypted.mimeMsg=Meldingen du svarer på inneholder både ukrypterte og krypterte deler. Noen ukrypterte deler er ikke synlige for deg.\n\nHvis senderen ikke kan dekryptere de skjulte meldingsdelene opprinnelig, kan det hende du lekker konfidensiell informasjon om at senderen ikke opprinnelig kunne dekryptere selv.\n\nDet anbefales at du ikke svarer på meldingen, men oppretter en ny melding som inneholder svaret ditt. msgCompose.partiallyEncrypted.inlinePGP=Meldingen du svarer på inneholdt både ukrypterte og krypterte deler. Hvis senderen ikke kunne dekryptere noen deler av meldingen opprinnelig, kan det hende du lekker konfidensiell informasjon om at senderen ikke opprinnelig kunne dekryptere selv.\n\nOvervei å fjerne all sitert tekst fra ditt svar til denne avsenderen. msgCompose.internalEncryptionError=Intern feil: avtalt kryptering deaktivert msgCompose.internalError=Det har oppstått en intern feil. msgCompose.toolbarTxt.signAndEncrypt=Meldingen vil bli signert og kryptert msgCompose.toolbarTxt.signOnly=Meldigen vil bli signert msgCompose.toolbarTxt.encryptOnly=Meldigen vil bli kryptert msgCompose.toolbarTxt.noEncryption=Meldingen vil ikke bli signert eller kryptert msgCompose.toolbarTxt.disabled=Enigmail er deaktivert for den valgte identiteten msgCompose.protectSubject.tooltip=Beskytt meldingsemnet msgCompose.noSubjectProtection.tooltip=Ikke beskytt meldingsemnet msgCompose.encryptedSubjectStub=Kryptert melding msgCompose.protectSubject.dialogTitle=Skru på beskyttelse av emnet? msgCompose.protectSubject.question=Vanlige krypterte e-poster inneholder det uredigerte emnet.\n\nVi har etablert en standard for skjuling av det opprinnelige emnet i den krypterte meldingen\nog erstatte det med en lure-tekst, slik at det egentlige emnet kun er synlig etter at e-posten er dekryptert.\n\nØnsker du å beskytte emnet i krypterte meldinger? msgCompose.protectSubject.yesButton=&Beskytt emne msgCompose.protectSubject.noButton=&Levn emne ubeskyttet msgCompose.detailsButton.label=Detaljer ... msgCompose.detailsButton.accessKey=D msgCompose.pepSendUnknown=Ukjent msgCompose.pepSendUnsecure=Usikker msgCompose.pepSendSecure=Sikker msgCompose.pepSendTrusted=Sikker og betrodd pep.alert.disabledForIdentity=p≡p er avskrudd for nåværende identitet. Skru på p≡p via Enigmail/p≡p-innstillingene. pep.alert.weakReply=Du er i ferd med å videresende eller svare på en sikker melding på usikkert vis. Hvis du velger å fortsette, vil konfidensiell informasjon om deg kanskje lekke, og også gjøre din samtalepartner skadelidende. Er du sikker på at du ønsker å fortsette? # note: should end with double newline: sendAborted=Sendingsoperasjon.\n\n # details: keyNotTrusted=Ikke høyt nok tillitsnivå for nøkkel '%S' keyNotFound=Nøkkel '%S' ble ikke funnet keyRevoked=Nøkkel '%S' trukket tilbake keyExpired=Nøkkel '%S' utgått på dato statPGPMIME=PGP/MIME statSMIME=S/MIME statSigned=SIGNERT statEncrypted=KRYPTERT statPlain=REN TEKST offlineSave=Lagre %S melding til %S mappe for usendte elementer? onlineSend=Send %S melding til %S? encryptKeysNote=Merk: meldingen er kryptert med de følgende brukerid-er / nøkler: %S hiddenKey= signFailed=Feil i Enigmail; Kryptering/signering feilet. Send ukryptert epost? msgCompose.button.sendUnencrypted=&Send melding ukryptert recipientsSelectionHdr=Velg mottakere for kryptering configureNow=Du har enda ikke satt opp Enigmail-sikkerhet (Engimail) for denne identiteten. Ønsker du å gjøre dette nå? # encryption/signing status and associated reasons: encryptMessageAuto=Krypter melding (auto) encryptMessageNorm=Krypter melding signMessageAuto=Signert melding (auto) signMessageNorm=Signer melding encryptOff=Kryptering: AV encryptOnWithReason=Kryptering: PÅ (%S) encryptOffWithReason=Kryptering: AV (%S) encryptOn=Kryptering: PÅ signOn=Signering: PÅ signOff=Signering: AV signOnWithReason=Signering: AV (%S) signOffWithReason=Signering: AV (%S) reasonEnabledByDefault=påslått som standard reasonManuallyForced=manuelt tvunget reasonByRecipientRules=tvunget av mottaker-regler reasonByAutoEncryption=tvunget av automatisk kryptering reasonByConflict=grunnet konflikt mellom mottakerregler reasonByEncryptionMode=på grunn av krypteringsmodus # should not be used anymore: encryptYes=Melding vil bli kryptert encryptNo=Melding vil ikke bli kryptert # should not be used anymore: signYes=Melding vil bli signert signNo=Melding vil ikke bli signert # PGP/MIME status: pgpmimeNormal=Protokoll: PGP/MIME inlinePGPNormal=Protokoll: Inline PGP smimeNormal=Protokoll: S/MIME pgpmimeAuto=Protokoll: PGP/MIME (auto) inlinePGPAuto=Protokoll: Inline PGP (auto) smimeAuto=Protokoll: S/MIME (automatisk) # should not be used anymore pgpmimeYes=PGP/MIME vil bli benyttet pgpmimeNo=Inline PGP vil bli benyttet # Attach own key status (tooltip strings): attachOwnKeyNo=Din egen nøkkel vil ikke bli lagt ved attachOwnKeyYes=Din egen nøkkel vil bli lagt ved attachOwnKeyDisabled=Din egen nøkkel kan ikke legges ved. Du må angi en spesifikk nøkkel i OpenPGP-delen av Kontoinnstillinger for å aktivere denne funksjonen. rulesConflict=Konflikt i mottakerrelaterte regler:\n%S\n\nSend melding med desse instillingene? msgCompose.button.configure=&Sett opp msgCompose.button.send=&Send melding msgCompose.button.save=&Lagre melding # Strings in enigmailMsgHdrViewOverlay.js keyNeeded=Offentlig nøkkel %S trengs for å verifisere melding keyUsed=Offentlig nøkkel %S ble brukt for å verifisere signatur clickDecrypt=; klikk Dekrypter-knappen clickDecryptRetry=; klikk på dekrypter-knappen for å prøve igjen clickDetailsButton=; klikk på detaljer-knappen for mer informasjon clickImportButton=; klikk på importer nøkkel-knappen for å lasted ned nøkkelen keyTypeUnsupported=; nøkkeltypen er ikke støttet av din versjon av GnuPG msgPart=Del av meldingen %S msgSigned=signert msgSignedUnkownKey=signert med ukjent nøkkel msgEncrypted=kryptert msgSignedAndEnc=signert og kryptert unverifiedSig=Ikke-verifisert signatur incompleteDecrypt=Dekryptering ukomplett needKey=Feil - privat nøkkel trengs til å dekryptere failedDecrypt=Feil - Dekryptering feilet badPhrase=Feil - Feil passfrase failedDecryptVerify=Feil - Dekryptering / Verifisering feilet mdcError=Feil - meldinga var ikke integritetsbeskyttet viewInfo=; Vis -> Meldings sikkerhetsinfo for detaljer decryptedMsg=Dekryptert melding decryptedMsgWithFormatError=Dekryptert melding (reparert misformet PGP epostformat sannsynligvis pga en gammel MS Exchange-tjener. Resultatet kan være vanskelig å lese) usedAlgorithms=Benyttede algoritmer: %S og %S pepStatusInfo.text=p≡p-meldingsstatus pepStatusInfo.title.m3=Under angrep pepStatusInfo.info.m3=Denne meldingen er ikke sikker og har blitt tuklet med. pepStatusInfo.title.m1=Mistrodd pepStatusInfo.info.m1=Denne meldingen har en samtalepartner som tidligere har blitt markert som mistrodd. pepStatusInfo.title.r0=Ukjent pepStatusInfo.info.r0=Denne meldingen inneholder ikke nok informasjon til å tilsi om den er sikker. pepStatusInfo.title.r1=Kan ikke dekryptere pepStatusInfo.info.r1=Meldingen kan ikke dekrypteres fordi nøkkelen ikke er tilgjengelig. pepStatusInfo.title.r2=Kan ikke dekryptere pepStatusInfo.info.r2=Meldingen kan ikke dekrypteres fordi nøkkelen ikke er tilgjengelig. pepStatusInfo.title.r3=Usikker pepStatusInfo.info.r3=Denne meldingen er usikker. pepStatusInfo.title.r4=Usikker for noen pepStatusInfo.info.r4=Denne meldingen er usikret for noen samtalepartnere. pepStatusInfo.title.r5=Upålitelig sikkerhet pepStatusInfo.info.r5=Denne meldingen har upålitelig beskyttelse pepStatusInfo.title.r6=Sikker… pepStatusInfo.info.r6=Meldingen er sikker, men du må fremdeles bekrefte identiteten til din kommunikasjonspartner. pepStatusInfo.title.r7=Sikker og betrodd pepStatusInfo.info.r7=Denne meldingen er sikker og betrodd. pepStatusInfo.color.green=Grønn pepStatusInfo.color.yellow=Gul pepStatusInfo.color.red=Rød pepRevokeTrust.question=Ønsker du virkelig å avbryte tillitsforholdet til %S? pepRevokeMistrust.question=Ønsker du virkelig å stole på nøkkelen for %S igjen? pepRevokeTrust.doRevoke=Avbryt %tillit wksConfirmationReq=Bekreftelsesforespørsel for nettnøkkelmappe wksConfirmationReq.message=Denne meldingen har blitt sendt av din e-posttilbyder for å bekrefte utrullig av din offentligeOpenPGP-nøkkel\ni deres nettnøkkelmappe.\nÅ tilby din offentlige nøkkel slik hjelper andre å oppdage din nøkkel, og på den måten kan de kryptere meldinger til deg.\n\nHvis du ønsker å rulle ut din nøkkel i nettnøkkelmappen nå, klikk på "Bekreft forespørsel" i statusfeltet.\nEllers kan du se bort fra denne meldingen. wksConfirmationReq.button.label=Bekreft forespørsel autocryptSetupReq=Utfør Autocrypt-oppsett autocryptSetupReq.button.label=Start oppsett autocryptSetupReq.setupMsg.desc=Denne meldingen inneholder all informasjon for sikker overføring av dine Autocrypt-innstillinger, sammen med din hemmelige nøkkel fra din opprinnelige enhet. autocryptSetupReq.setupMsg.backup=Du kan beholde denne meldingen og bruke den som sikkerhetskopi for din hemmelige nøkkel. Hvis du ønsker å gjøre det, burde du skrive ned passordet og lagre det sikkert. autocryptSetupReq.message.import=For å importere innstillingene og nøkkel/nøkler i Enigmail, klikk på "Start oppsett" i statusfeltet. autocryptSetupReq.message.sent=Klikk på meldingen på din nye enhet og følg instruksjonene for å importere innstillingene. # strings in pref-enigmail.js oldGpgVersion20=Igangsetting av Enigmail mislyktes.\n\nDu bruker GnuPG-versjon %1$S, som ikke støttes lenger. Enigmail krever GnuPG-versjon %2$S eller nyere. Oppgrader din GnuPG-installasjon for at Enigmail skal virke. locateGpg=Lokaliser GnuPG-programmet invalidGpgPath=GnuPG kan ikke kjøre fra banen som ble spesifisert. Enigmail er derfor deaktivert intill du endrer banen til GnuPG, eller til du starter programmet på nytt. warningsAreReset=Alle advarsler har blitt nullstilt. prefs.gpgFound=GnuPG ble funnet i %S prefs.gpgNotFound=Kunne ikke finne GnuPG prefs.warnAskNever=Advarsel: ved å aktivere dette valget resulterer det i en ukryptert melding uten noe videre informasjon om nøkkel ikke finnes for en av mottagerene -- Enigmail vil ikke informere deg om dette skjer! prefs.warnIdleTimeForUnknownAgent=Kan ikke kople til gpg-agent. Dette kan skje om systemet ditt bruker et eget verktøy for passfrasehåndtering (f.eks. gnome-keyring, seahore-agent, KDE wallet manager,...) Dessverre kan ikke Enigmail kontrollere passfrasetimeout for verktøyet du bruker. Innstillinger for dette i Enigmail vil derfor ignoreres. prefEnigmail.oneKeyserverOnly=Feil - du kan kun angi én nøkkeltjener for automatisk nedlasting av manglende OpenPGP-nøkler. # Strings used in core.jsm # (said file also re-uses some strings from above) enterAdminPin=Skriv inn ADMIN PIN til ditt smartkort enterCardPin=Skriv inn din smartkort PIN notInit=Feil - Enigmail-tjenesten er ikke startet badCommand=Feil - krypteringskommando feilet cmdLine=kommandolinje og resultat: notRequired=Feil - ingen kryptering er nødvendig notComplete=Feil - nøkkelgenerering har ikke fullført invalidEmail=Feil - ugyldig(e) epostadresse(r) noPassphrase=Feil - ingen passfrase er oppgitt noPGPblock=Feil - Ingen beskyttet OpenPGP data blokk er funnet unverifiedReply=Innrykket meldingsdel (svar) er antageligvis endret keyInMessageBody=Nøkkel funnet i meldingen. Klikk "Importer nøkkel" for å importere den. sigMismatch=Feil - Signaturen stemmer ikke overens cantImport=Feil i importering av offentlig nøkkel\n\n doImportOne=Importer %1$S (%2$S)? doImportMultiple=Importer følgende nøkeler? %S previewFailed=Kan ikke lese offentlig nøkkel-fil. # Strings used in errorHandling.jsm sc.wrongCardAvailable=Smartkortet %1$S i leseren kan ikke brukes for å behandle meldingen. \nVennligst sett i smartkort %S og gjenta operasjonen. sc.insertCard=Denne operasjonen er avhengig av smartkortet %S. \nVennligst sett smartkoret i leseren og gjenta operasjonen. sc.removeCard=Denne operasjonen krever at det ikke er noe smartkort i leseren. Vennligst fjern smartkortet fra leseren og gjenta operasjonen. sc.noCardAvailable=Inget SmartCard ble funnet i leseren.\nVennligst sett inn et kort og gjenta operasjonen. sc.noReaderAvailable=SmartCard-leseren ble ikke funnet.\n Vennligst kobl til leseren. keyError.keySpecNotFound=E-postadressen "%S" kan ikke koples mot en nøkkel i nøkkelringen din. keyError.keyIdNotFound=Den angitte nøkkel-IDen "%S" ble ikke funnet i nøkkelringen din. keyError.resolutionAction=Velg en gyldig nøkkel i OpenPGP-delen av kontoinnstillingene dine. missingPassphrase=Manglende passfrase errorHandling.gpgAgentInvalid=Systemet ditt bruker en versjon av gpg-agent som ikke passer sammen med GnuPG-versjonen din. errorHandling.gpgAgentError=GnuPG rapporterte en feil i kommunikasjonen med gpg-agent (en komponent i GnuPG). errorHandling.dirmngrError=GnuPG rapporterte en feil i kommunikasjonen med dirmngr (en komponent i GnuPG). errorHandling.pinentryError=GnuPG kan ikke be om passfrasen din via pinentry. errorHandling.readFaq=Dette er en førstegangsveiviser- eller oppsettsfeil som hindrer Enigmail i å fungere normalt, og som ikke kan rettes automatisk. \n \nVi anbefaler sterkt at du konsulterer supportnettsiden vår på https://enigmail.net/faq. gpgNotFound=Klarte ikke å finne GnuPG-programmet '%S'\nKontroller banen. gpgNotInPath=Kunne ikke finne GnuPG i PATH-variablen.\nKontroller at banen stemmer i Enigmail instillingene. enigmailNotAvailable=Sentral Enigmail-tjeneste ikke tilgjengelig prefGood=God signatur fra %S prefBad=Dårlig signatur fra %S failCancel=Feil - Nøkkelhenting avbrutt av bruker failNoServer=Feil - Ingen nøkkeltjener har blitt spesifisert failNoID=Feil - Ingen NøkkelID å hente nøkkel for failKeyExtract=Feil - Nøkkelutentings-kommando feilet notFirstBlock=Feil - Første OpenPGP blokk tilhører ikke en offentlig nøkkel importKeyConfirm=Importer offentlige nøkler fra meldignen? failKeyImport=Feil - nøkkelimportering feilet fileWriteFailed=Klarte ikke å skrive til filen %S importKey=Importer offentlig nøkkel %S fra nøkkeltjener: uploadKey=Send offentlig nøkkel %S til nøkkeltjener: keyId=NøkkelID keyAndSigDate=NøkkelID: 0x%S / Signert den: %S keyFpr=Fingeravtrykk: %S noEmailProvided=Du oppgav ikke en epostadresse keyAlreadySigned=Denne nøkkelen har allerede blitt signert, du kan ikke signere den flere ganger ##################################################################### # Strings used in enigmailKeySelection.js ##################################################################### selKeyExpired=utløpt %S createdHeader=Laget atLeastOneKey=Ingen nøkkel valgt! Du må velge minst en nøkkel for å kunne akseptere denne dialogen fewerKeysThanRecipients=Du har valgt færre nøkler enn mottakere. Er du sikker på at lista med nøkler du vil kryptere til er komplett? userSel.button.goBack=Velg flere nøkler userSel.secretKeySel.title=Velg en OpenPGP privatnøkkel for å signere meldingene dine userSel.problemNoKey=Ingen gyldig nøkkel userSel.problemMultipleKeys=Flere nøkler # should be same as thunderbird ENTITY sendLaterCmd.label: sendLaterCmd.label=Send senere # Strings used in enigmailAttachmentDialog.js pgpMimeNote=Merk: PGP/MIME støttes ikke av alle e-postklienter. Hvis du er usikker, velg %S-valget. first=første second=andre # Strings used in am-enigprefs.js / enigmailEditIdentity.js encryptKeyHeader=Velg OpenPGP-nøkkel til kryptering identityName=Identitet: %S switchPepMode=Du bruker nå 'p≡p-juniormoduset' i Enigmail.\n\nVed å skru på OpenPGP eller S/MIME for en konto, skrur du av p≡p og bruker 'vanlig'-modus i Enigmail, uten p≡p. enableEnigmail=&Skru av p≡p # Strings used in enigmailSingleRcptSettings.js noEncryption=Du har aktivert kryptering, men ikke valgt en nøkkel. For å kunne kryptere eposter sendt til %S må du velge en eller flere nøkler å kryptere til. Ønsker du å deaktivere kryptering til: %S? noKeyToUse=(ingen - ingen kryptering) noEmptyRule=Denne regelen kan ikke være tom! vennligst sett en epostadresse i regelfeletet. invalidAddress=Epostadressen(e) du har skrevet er ikke gyldige. Du skal ikke skrive navnet på mottakeren, bare epostadressen. For eksempel:\nUgyldig: Some Name \nGyldig: some.name@address.net noCurlyBrackets=Krøllparantesene {} har en spesiell betydning, og kan ikke brukes i e-postadresser. Om du ønsker å endre filteroppførselen for denne regelen, bruk 'Gjør regelen gjeldende om mottaker…' , mer info finnes i "Hjelp"-menyen. # Strings used in enigmailRulesEditor.js never=Aldri always=Alltid possible=Mulig deleteRule=Virkelig slette den valgte regel? nextRcpt=(neste mottaker) negateRule=Ikke addKeyToRule=Legg nøkkelen %1$S (%2$S) til per mottaker-regel # Strings used in enigmailSearchKey.js needOnline=Funksjonen du har valg er ikke tilgjengelig i frakoblet modus. Venngligst kobl til og prøv igjen. protocolNotSupported=Protokollen '%S://' som du har valgt er ikke tilgjengelig for å laste ned OpenPGP nøkler gpgkeysDisabled=Det vil kanskje hjelpe å aktivere valget: 'extensions.enigmail.useGpgKeysTool'. noKeyserverConn=Kunne ikke koble til nøkkeltjener på %S. keyDownloadFailed=Feilet i å laste ned nøkkel fra tjener. Status-meldingen er:\n%S internalError=En intern feil oppstod. Nøklene kunne ikke bli lastet ned eller importert. noKeyFound=Beklager, men kunne ikke finne en nøkkel som passet til søket. Vennligst merk at nøkkel-ider skal være prefikset med \\"0x\\" (f.eks. 0xABCDEF12). keyDownload.keyUnavailable=Nøkkelen med ID %S er ikke tilgjengelig på den nøkkeltjeneren. Mest sannsynlig har ikke eieren av nøkkelen lastet den opp til nøkkeltjeneren.\n\nSpør avsenderen av meldingen om å sende deg deres offentlige nøkkel per e-post. # gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. gpgKeysFailed=Klarte ikke å søke eller laste ned nøkkel fra nøkkeltjener: gpgkeys_%S kunne ikke bli utført # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Nøkkelpålitelighet kunne ikke bli satt # Strings in enigmailSignKeyDlg.js signKeyFailed=Nøkkelsignering feilet alreadySigned.label=Merk: nøkkelen %S er allerede singert med den valgte privatnøkkelen. alreadySignedexportable.label=Merk: nøkkelen %S er allerede signert som eksporterbar med den valgte privatnøkkelen. En lokal signatur gir ikke mening. partlySigned.label=Merk: noen bruker-IDer til nøkkelen %S er allerede signert med den valgte privatnøkkelen noTrustedOwnKeys=Ingen kvalifisert nøkkel funnet for signering! Du trenger minst én fullt tiltrodd privatnøkkel for å signere nøkler. # Strings in enigmailKeyManager.js keyMan.loadingKeys=Laster inn nøkler, vennligst vent... keyValid.unknown=ukjent keyValid.invalid=ugyldig keyValid.disabled=deaktivert keyValid.revoked=trukket keyValid.expired=utløpt keyValid.noSubkey=ingen gyldig undernøkkel keyTrust.untrusted=ikke til å stole på keyTrust.marginal=marginal keyTrust.full=stolt på keyTrust.ultimate=fullstendig keyTrust.group=(gruppe) keyType.public=pub keyType.publicAndSec=pub/sec keyMan.enableKey=Aktiver nøkkel keyMan.disableKey=Deaktiver nøkkel userAtt.photo=brukerattributt (JPEG bilde) asciiArmorFile=ASCII armored-filer (*.asc) importKeyFile=Importer OpenPGP nøkkelfil gnupgFile=GnuPG Filer createKeyOK=Nøkkelen din har blitt laget saveRevokeCertAs=Lag og lagre tilbaketrekkingssertifikat revokeCertOK=Tilbaketrekkingssertifikatetet har blitt laget. Du kan bruke det til å gjøre din offentlige nøkkel ubrukelig, f.eks. hvis du skulle miste din hemmelige nøkkel. revokeCertFailed=Tilbaketrekkingssertifikatet kunne ikke lages. addUidOK=BrukerID lagt til vellykket. addUidFailed=Kunne ikke legge til BrukerID. noKeySelected=Du må velge minst en nøkkel å foreta operasjonen på. exportToFile=Eksporter offentlig nøkkel til fil exportKeypairToFile=Eksporter privat og offentlig nøkkel til fil exportSecretKey=Ønsker du å inkludere den private nøkkelen i den lagrede OpenPGP-filen? saveKeysOK=Nøklene ble lagret vellykket saveKeysFailed=Kunne ikke lagre nøklene importKeysFailed=Importering av nøkler feilet enableKeyFailed=Aktivering/Deaktivering av nøkler feilet specificPubKeyFilename=%S (0x%S) pub specificPubSecKeyFilename=%S (0x%S) pub-sec defaultPubKeyFilename=Eksporter offentlige nøkler defaultPubSecKeyFilename=Eksporter offentlige og private nøkler noSecretKeys=Ingen private nøkler funnet. Ønsker du å generere din egen nøkkel nå? sendKeysOk=Nøkler sendt vellykket sendKeysFailed=Sending av nøkler feilet receiveKeysOk=Nøkler oppdatert vellykket receiveKeysFailed=Nedlasting av nøkler feilet importFromClip=Ønsker du å importere noen nøkler fra utklippstavlen? importFromUrl=Last ned offentlig nøkkel fra denne URLen: copyToClipbrdFailed=Kunne ikke kopiere de valgte nøkler til utklippstavlen copyToClipbrdOK=Valgte nøkler kopiert til utklippstavle deleteSecretKey=Advarsel: Du er i gang med å slette en privat nøkkel!\nOm du sletter en privat nøkkel, vil du ikke klare å dekryptere meldinger som er kryptert med den offentlige nøkkelen\n\nØnsker du virkelig å både slette den private og den offentlige nøkkelen?\n'%S'? deleteMix=Advarsel: Du er i gang med å slette en privat nøkkel!\nOm du sletter en privat nøkkel, vil du ikke klare å dekryptere meldinger som er kryptert med den offentlige nøkkelen\n\nØnsker du virkelig å både slette den private og den offentlige nøkkelen?\n'%S'? deletePubKey=Ønsker du å slette den offentlige nøkkelen\n'%S'? deleteSelectedPubKey=Ønsker du å slette de offentlige nøklene? deleteKeyFailed=Nøkkelen kunne ikke bli slettet revokeKeyQuestion=Du er i ferd med å trekke tilbake nøkkel '%S'. \n \nDu vil ikke lenger kunne signere med denne nøkkelen, og når tilbaketrekkingen er distribuert vil andre ikke lenger kunne kryptere til denne nøkkelen. Du kan fortsatt bruke nøkkelen for å dekryptere gamle meldinger. \n \nVil du fortsette? revokeKeyOk=Nøkkelen har blitt trukket tilbake. Om nøkkelen er tilgjengelig på en nøkkeltjener er det annbefalt å laste den opp igjen så andre kan se at den er trukket tilbake. revokeKeyFailed=Nøkkelen kunne ikke bli trukket tilbake revokeKeyNotPresent=Du har ingen nøkkel (0x%S) som stemmer overens med dette tilbakekallingssertifikatet!\n\nHvis du har mistet nøkkelen din, må du importere den (f.eks. fra en nøkkeltjener) før tilbakekallingssertifikatet! revokeKeyAlreadyRevoked=Nøkkelen 0x%S har allerede blitt tilbakekalt. refreshAllQuestion=Du valgte ikke noen nøkkel, nøsker du å oppdatere alle? refreshKeyServiceOn.warn=Advarsel: Nøklene dine blir gjenoppfrisket i bakgrunnen så sikkert som mulig.\nÅ gjenoppfriske alle nøklene samtidig vil avsløre informasjon om deg i unøde.\nØnsker du virkelig å gjøre dette? refreshKey.warn=Warning: Avhengig av antall nøkler og båndbredde kan det ta lang tid å oppdatere alle nøkler. Ønsker du å fortsette? downloadContactsKeys.warn=Advarsel: avhengig av antall kontakter og tilkoplingshastighet kan det ta lang tid å laste ned alle nøklene! downloadContactsKeys.importFrom=Importer kontakter fra adressebok '%S'? keyMan.button.exportSecKey=&Export Secret Keys keyMan.button.exportPubKey=Eksporter kun &Offentlige nøkler keyMan.button.import=&Importer keyMan.button.refreshAll=&&Oppdater alle nøkler keyMan.button.revokeKey=&&Trekk tilbake nøkkel keyMan.button.skip=&&Hopp over nøkkel keylist.noOtherUids=Har ingen andre identiteter keylist.hasOtherUids=Også kjent som keylist.noPhotos=Ingen bilder tilgjengelig keylist.hasPhotos=Bilder keyMan.addphoto.filepicker.title=Velg bilde å legge til keyMan.addphoto.warnLargeFile=Filen du har valgt er større en 25kB. \nNøklene blir veldig store om det legges til store filer, dette anbefales derfor ikke. keyMan.addphoto.noJpegFile=Den valgte filen virker ikke å være en JPEG-fil. Vennligst velg en annen fil. keyMan.addphoto.failed=Kunne ikke legge til bildet noWksIdentity=Nøkkelen %S har ikke en WKS-identitet. keyman.addBlacklistKey.msg=Ønsker du virkelig av p≡p skal slutte å bruke nøkkelen "%1$S (%2$S)" til kryptering av meldinger? keyman.removeBlacklistKey.msg=Ønsker du å tillate p≡p å bruke nøkkelen "%1$S (%2$S)" for framtidige meldinger? keyman.addBlacklistKey.button=&Svartelist nøkkelen keyman.removeBlacklistKey.button=&Fjern nøkkel fra svarteliste # Strings in enigmailManageUidDlg.xul changePrimUidFailed=Feilet å endre den primære BrukerID-en changePrimUidOK=Primær BrukerID endret vellykket. revokeUidFailed=Tilbaketrekking av BrukerID %S feilet revokeUidOK=BrukerID %S har blitt trukket tilbake, om nøkkelen er tilgjengelig på en nøkkeltjener bør du laste den opp igjen. revokeUidQuestion=Ønsker du virkelig å trekke tilbake BrukerID %S? # Strings in enigmailKeyImportInfo.xul importInfoTitle=Suksess! Nøkler importert importInfoBits=Biter importInfoCreated=Laget importInfoFpr=Fingeravtrykk importInfoDetails=(Detaljer) importInfoNoKeys=Ingen nøkler importert. # Strings in enigmailKeyDetailsDlg.xul keyTypePublic=offentlig nøkkel keyTypePrimary=Primærnøkkel keyTypeSubkey=undernøkkel keyTypePair=nøkkelpar keyExpiryNever=aldri keyAlgorithm_1=RSA keyAlgorithm_2=RSA keyAlgorithm_3=RSA keyAlgorithm_16=ELG keyAlgorithm_17=DSA keyAlgorithm_18=ECC keyAlgorithm_19=ECC keyAlgorithm_20=ELG keyAlgorithm_22=EDDSA keyUsageEncrypt=Krypter keyUsageSign=Signer keyUsageCertify=Sertifiser keyUsageAuthentication=Autentisering keyDoesNotExpire=Nøkkel utløper ikke # Strings in enigmailGenCardKey.xul keygen.started=Vennligst vent mens nøkkel blir generert .... keygen.completed=Nøkkelen har blitt generert. Den nye NøkkelID er: 0x%S keygen.keyBackup=Backup av nøkkel er lagret som %S keygen.passRequired=Vennligst spesifiser en passfrase om du ønsker å lagre en backup utenfor smartkortet ditt. # Strings in enigmailSetCardPin.xul cardPin.processFailed=Klarte ikke å endre PIN # Strings in enigRetrieveProgres.xul keyserverProgress.refreshing=Oppdaterer nøkler, vennligst vent ... keyserverProgress.uploading=Laster opp nøkler, vennligst vent... keyserverProgress.wksUploadFailed=Kunne ikke late opp nøkkelen din til nettnøkkeltjenesten keyserverProgress.wksUploadCompleted=Din offentlige nøkkel ble sendt til din tilbyder. Du vil motta en e-post for å bekrefte at du igangsatte opplastingen. keyserverTitle.refreshing=Oppdater nøkler keyserverTitle.uploading=Nøkkelopplasting # Strings in enigmailSetupWizard passphrase.min8keys=Passfrasen må inneholde minst åtte tegn. setupWizard.reallyCancel=Ønsker du virkelig å avbryte Enigmail hjelperen? setupWizard.invalidGpg=Filen du anga er ikke GnuPG-programmet. Vennligst oppig en annen fil. setupWizard.specifyFile=Du må angi en offentlig nøkkel-fil for å kunne fortsette setupWizard.installFailed=Det virker som om installasjonen ikke gikk bra. Prøv igjen eller installer GnuPG manuelt og angi plassering med Bla igjennom-knappen. setupWizard.downloadForbidden=For din egen sikkerhet laster vi ikke ned GnuPG automatisk. Besøk https://gnupg.org/ for å laste det ned. setupWizard.downloadImpossible=Kan ikke laste ned GnuPG akkurat nå. Prøv igjen senere, eller besøk https://gnupg.org/ for å laste det ned. setupWizard.hashSumError=Installasjonsveilederen kunne ikke verifisere integriteten til den nedlastede filen. Filen kan være ødelagt eller manipulert. Vil du fortsette installasjonen uansett? setupWizard.importSettingsFile=Angi fil å hente sikkerhetskopi fra setupWizard.invalidSettingsFile=Den angitte filen er ikke en gyldig sikkerhetskopi av Enigmail-innstillinger. setupWizard.gpgConfExists=Oppsettsfil for GnuPG finnes allerede. Vil du overskrive den med versjonen fra din gamle installasjon? setupWizard.noGpgHomeDir=Det virker som du har satt opp %S til bruk for GnuPG. Dog, er ikke dette en mappe - du kan ikke bruke den. setupWizard.unmachtedIds=Følgende identiteter for ditt gamle oppsett kunne ikke jamføres:\n%S\nInnstillingene for disse identitetene ble hoppet over. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=Det oppsto en feil under nedlasting av GnuPG. Sjekk konsolloggen for flere detaljer. installGnuPG.installFailed=Det oppsto en feil under installasjon av GnuPG. Sjekk konsolloggen for flere detaljer. # Strings in enigmailAddUidDlg.xul addUidDlg.nameOrEmailError=Du må angi et navn og en e-postadresse addUidDlg.nameMinLengthError=Navnet må innholdet minst fem tegn addUidDlg.invalidEmailError=Du må angi en gyldig e-postadresse # Strings in enigmailCardDetails.js Carddetails.NoASCII=OpenPGP-smartkort støtter kun ASCII-tegn i Fornavn/Navn. # network error types errorType.SecurityCertificate=Sikkerhetssertifikatet til webtjenesten er ikke gyldig errorType.SecurityProtocol=Sikkerhetsprotokollen brukt av webtjenesten er ikke kjent errorType.Network=En nettverksfeil har oppstått # filter stuff filter.folderRequired=Du må velge en målkatalog filter.decryptMove.label=Dekrypter permanent (Enigmail) filter.decryptCopy.label=Lag dekryptert kopi (Enigmail) filter.decryptMove.warnExperimental=Advarsel - filtreringshandlingen "Dekrypter permanent" kan føre til ødelagte meldinger. \n \nVi anbefaler på det sterkeste at du først prøver "Lag dekryptert kopi"-filteret, tester resultatet nøye, og at du ikke benytter "Dekryptert permanent" før du er fornøyd med resultatet av testingen. filter.tempPepFilterDesc=Midlertidig filter for å lagre sendt melding ukryptert filter.term.pgpencrypted.label=OpenPGP-kryptert filter.encrypt.label=Krypter til nøkkel (Enigmail) filter.keyRequired=Du må velge en mottagernøkkel. filter.keyNotFound=Kunne ikke finne krypteringsnøkkel for "%S". filter.warn.keyNotSecret=Advarsel - filterhandlingen "Krypter til nøkkel" erstatter mottakerne.\n\nHvis du ikke har hemmelig nøkkel for "%S" vil ikke lenger kunne lese e-postene. # strings in enigmailConvert.jsm converter.decryptBody.failed=Kunne ikke dekryptere melding med emne \n"%S". \nVil du prøve igjen med en annen passfrase eller vil du hoppe over meldingen? converter.decryptAtt.failed=Kunne ikke dekryptere vedlegget "%1$S" \ntil meldingen med emne \n"%2$S" \nVil du prøve igjen med en annen passfrase eller vil du hoppe over meldingen? saveLogFile.title=Lagre loggfil # strings in gpg.jsm unknownSigningAlg=Ukjent signeringsalgoritme (ID: %S) unknownHashAlg=Ukjent kryptografisk hash (ID: %S) # strings in keyRing.jsm keyring.photo=Bilde keyRing.pubKeyRevoked=Nøkkelen %1$S (nøkkel-ID %2$S) er trukket tilbake. keyRing.pubKeyExpired=Nøkkelen %1$S (nøkkel-ID %2$S) er utløpt. keyRing.pubKeyNotForSigning=Nøkkelen %1$S (nøkkel-ID %2$S) kan ikke brukes til signering. keyRing.pubKeyNotForEncryption=Nøkkelen %1$S (nøkkel-ID %2$S) kan ikke brukes til kryptering. keyRing.keyDisabled=Nøkkelen %1$S (nøkkel-ID %2$S) er deaktivert; den kan ikke brukes. keyRing.keyNotTrusted=Nøkkelen %1$S (nøkkel-ID %2$S) er ikke tiltrodd nok. Sett tillitsnivået for nøkkelen din til "ultimat" for å bruke den til signering. keyRing.keyInvalid=Nøkkelen %1$S (nøkkel-ID %2$S) er ugyldig (det kan for eksempel være den ikke er selvsignert). keyRing.signSubKeysRevoked=Alle undernøkler for signering tilhørende nøkkel %1$S (nøkkel-ID %2$S) er tilbakekalt. keyRing.signSubKeysExpired=Alle undernøkler for signering tilhørende nøkkel %1$S (nøkkel-ID %2$S) er utløpt. keyRing.signSubKeysUnusable=Alle undernøkler for signering tilhørende nøkkel %1$S (nøkkel-ID %2$S) er tilbakekalt, har løpt ut eller er av andre grunner ikke mulige å bruke. keyRing.encSubKeysRevoked=Alle undernøkler for kryptering tilhørende nøkkel %1$S (nøkkel-ID %2$S) er tilbakekalt. keyRing.encSubKeysExpired=Alle undernøkler for kryptering tilhørende nøkkel %1$S (nøkkel-ID %2$S) er utløpt. keyRing.noSecretKey=Det virker ikke som du har privatnøkkelen til %1$S (nøkkel-ID %2$S) i nøkkelringen din. Du kan derfor ikke benytte denne nøkkelen for signering. keyRing.encSubKeysUnusable=Alle undernøkler for kryptering tilhørende nøkkel %1$S (nøkkel-ID %2$S) er tilbakekalt, har løpt ut eller er av andre grunner ikke mulige å bruke. #strings in exportSettingsWizard.js cannotWriteToFile=Kan ikke lagre til filen '%S'. Angi en annen fil. dataExportError=En feil oppsto under eksport av dataene dine. enigmailSettings=Enigmail-innstillinger defaultBackupFileName=Enigmail-eksport specifyExportFile=Angi filnavn for eksport homedirParamNotSUpported=Parametre som angir stier, som --homedir og --keyring, er ikke støttet ved eksport og import av innstillinger. Bruk andre metoder slik som å sette miljøvariabelen GNUPGHOME. #strings in expiry.jsm expiry.keyExpiresSoon=Din nøkkel %1$S utløper om mindre enn %2$S dager. \n \nVi anbefaler at du lager et nytt nøkkelpar og setter opp de aktuelle kontoene til å benytte den nye nøkkelen. expiry.keysExpireSoon=De følgende nøklene dine utløper om mindre enn %1$S dager:\n%2$S. Det anbefales at du lager nye nøkler og setter opp kontoene dine til å bruke de nye nøklene. expiry.keyMissingOwnerTrust=Din hemmelige nøkkel %S har manglende tillit..\n\nDet anbefales at du setter "Du stoler på sertifiseringer" til "ultimat" i nøkkelegenskapene. expiry.keysMissingOwnerTrust=Følgende av dine hemmelige nøkler har manglende tillit.\n%S.\nDet anbefales at du setter "Du stoler på sertifiseringer" til "ultimat" i nøkkelegenskapene. expiry.OpenKeyManager=Åpne Enigmail-nøkkelbehandling expiry.OpenKeyProperties=Åpne nøkkelegenskaper #strings in pEpDecrypt.jsm pEpDecrypt.cannotDecrypt=Dette er en kryptert melding. Desverre har du ikke den hemmelige nøkkelen for dekryptering av meldingen. #strings in gpgAgent.jsm gpghomedir.notexists=Mappen "%S" som inneholder dine OpenPGP-nøkler, finnes ikke og kan ikke opprettes. gpghomedir.notwritable=Mappen "%S" som inneholder dine OpenPGP-nøkler er ikke skrivbar. gpghomedir.notdirectory=Mappen "%S" som inneholder dine OpenPGP-nøkler er en fil istedenfor en mappe. gpghomedir.notusable=Ordne mappetilganger eller endre plasseringen for "hjem"-mappen for din GnuPG-mappe. GnuPG trenger dette for å fungere. #strings in pepTrustWords.js pepTrustWords.cannotVerifyOwnId=Kan ikke bekrefte p≡p-tillitsord for egen konto. pepTrustWords.cannotFindKey=Kan ikke finne nøkkel for %S. pepTrustWords.cannotStoreChange=Kunne ikke endre tillit for %S. pepTrustWords.generalFailure=Kan ikke hente tillitsord for %S. pepTrustWords.partnerFingerprint=Fingeravtrykk for %S. #strings in mimeWkdHandler.jsm wkdMessage.body.req=Din e-posttilbyder behandlet din forespørsel om å laste opp din offentlige nøkkel til OpenPGP-nettnøkkelmappen.\n\nKlikk på bekreftelsesknappen i Enigmail-hodet for å fullføre offentliggjøring av din offentlige nøkkel. wkdMessage.body.process=Dette er en e-post som har med automatisk behandling for å laste opp din offentlige nøkkel til OpenPGP-nettnøkkelmappen å gjøre.\n\nDu trenger ikke å gjøre noe manuelt. #strings in pepHandshake.js pepPrivacyStatus.RatingBrokenSuggestion=Enten du eller avsenderen må sende meldingen på nytt pepPrivacyStatus.RatingHaveNoKeySuggestionOutgoing=Hvis du skrev denne meldingen, er ikke nøkkelen din tilgjengelig. pepPrivacyStatus.RatingMistrustSuggestion=Gjenopprett tilkoblingen med din samtalepartner og prøv å fullføre et nytt handtrykk. pepPrivacyStatus.RatingReliableSuggestion=Sluttfør et håndtrykk med din samtalepartner ved å utveksle tillitsord på tomannshånd eller over telefon. Et håndtrykk trengs én gang per partner, og vil sikre at kommunikasjonen er sikker og betrodd. pepPrivacyStatus.RatingTrustedSuggestion=Ingen handling nødvendig! pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Ha i minnet at det kan hende meldingen ikke er sikker. pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Legg til nødvendig informasjon. pepPrivacyStatus.RatingUnderAttackSuggestion=Bekreft innholdet i denne meldingen med din samtalepartner i en annen kanal. pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Forsikre deg om at personvernsstatusen for hver samtalepartner som er opplistet minst er "sikker". pepPrivacyStatus.RatingUnencryptedSuggestion=Spør din kommunikasjonspartner om å bruke en krypteringsløsning eller installere p≡p. pepPrivacyStatus.RatingUnreliableSuggestion=Denne meldingen har ingen pålitelig kryptering eller mangler signatur. Spør din samtalepartner om å oppgradere deres krypteringsløsning, eller installere p≡p. pepPrivacyStatus.RatingBrokenExplanation=Meldingen har knekt kryptering eller formatering. pepPrivacyStatus.RatingHaveNoKeyExplanation=Denne meddelelsen kan ikke krypteres fordi nøkkelen ikke er tilgjengelig. pepPrivacyStatus.RatingMistrustExplanation=Denne meldingen har en samtalepartner som tidligere har blitt markert som mistrodd. pepPrivacyStatus.RatingReliableExplanation=Denne meldingen er sikker, men du må fremdeles bekrefte identiteten til din samtalepartner. pepPrivacyStatus.RatingTrustedExplanation=Denne meldingen er sikker og betrodd. pepPrivacyStatus.RatingUndefinedExplanation=Denne meddelelsen inneholder ikke nok informasjon til å fastsette hvorvidt den er sikker. pepPrivacyStatus.RatingUnderAttackExplanation=Denne meldingen er ikke sikker, og har blitt tuklet med. pepPrivacyStatus.RatingUnencryptedExplanation=Denne meldingen er usikker. pepPrivacyStatus.RatingUnencryptedForSomeExplanation=Denne meldingen er usikker for noen kommunikasjonsdeltagere. pepPrivacyStatus.RatingUnreliableExplanation=Denne meldingen har upålitelig beskyttelse pepPrivacyStatus.RatingBrokenText=Knekt pepPrivacyStatus.RatingHaveNoKeyText=Kan ikke dekryptere pepPrivacyStatus.RatingMistrustText=Mistrodd pepPrivacyStatus.RatingReliableText=Sikker pepPrivacyStatus.RatingTrustedText=Sikker og betrodd pepPrivacyStatus.RatingUndefinedText=Ukjent pepPrivacyStatus.RatingUnderAttackText=Under angrep pepPrivacyStatus.RatingUnencryptedForSomeText=Usikker for noen pepPrivacyStatus.RatingUnencryptedText=Usikker pepPrivacyStatus.RatingUnreliableText=Upålitelig sikkerhet handshakeDlg.button.initHandshake=Håndtrykk… handshakeDlg.button.stopTrust=Stopp tiltro handshakeDlg.button.reTrust=Fjern mistillit handshakeDlg.label.outgoingMessage=Utgående melding handshakeDlg.label.incomingMessage=Innkommende melding handshakeDlg.error.noPeers=Kan ikke utføre håndtrykk uten korrespondenter. handshakeDlg.error.noProtection=Skru på beskyttelse for å bruke "Håndtrykk"-funksjonen. enigmail.acSetupPasswd.descEnterPasswd=Skriv inn oppsettskoden som vises på den andre enheten. enigmail.acSetupPasswd.descCopyPasswd=Angi oppsettskoden nedenfor på din andre enhet for å fortsette oppsettet #strings in autocrypt.jsm autocrypt.setupMsg.subject=Autocrypt-oppsettsmelding autocrypt.setupMsg.msgBody=For å sette opp din nye enhet til bruk med Autocrypt, følg instruksjonene som forhåpentligvis presenteres for deg av din nye enhet. autocrypt.setupMsg.fileTxt=Dette er Autocrypt-oppsettsfilen som brukes til å overføre innstillinger og nøkler mellom klienter. Du kan dekryptere den ved bruk av oppsettskoden som vises på din gamle enhet, og så importere nøkkelen den inneholder til din nøkkelring. #strings in upgradeInfo.html upgradeInfo.doctitle=Hva er nytt i Enigmail v2.0? upgradeInfo.welcome1=Velkommen til nye Enigmail, versjon 2.0! upgradeInfo.welcome2=Utgivelsen inneholder mange nye og endrede funksjoner. Ta deg noen minutter for å lære hva som er nytt: upgradeInfo.encSubject.title=Krypterer meldingsemnet upgradeInfo.encSubject.desc=Vi utviklet en ny metode som flytter e-postemnet inn i den krypterte meldingen, og erstatter det synlige emnet med "Kryptert melding". Når en slik melding dekrypteres, blir det opprinnelige emnet erstattet automatisk. Skjuling av emnet er skrudd på som forvalg; det er en innstilling for å skru det av hvis du ikke liker det. (Merk: Denne funksjonen krever at meldingen sendes med PGP/MIME.) upgradeInfo.buttons.title=Endret oppførsel for "Krypter" og "Signer"-knapper upgradeInfo.buttons.desc=Krypter- og Signer -knappene i skrivevinduet fungerer nå for både OpenPGP- og S/MIME -protokollene. Hvis både algoritmene er mulige, vil Enigmail prøve å foretrekke én som har alle nøklene tilgjengelig. upgradeInfo.autocrypt.title=Støtte for Autocrypt upgradeInfo.autocrypt.desc=Enigmail støtter nå Autocrypt, en ny standard for å distribuere nøkler som del av sendte meldinger. Enigmail importerer automatisk nøkler meldinger av Autocrypt-standard, slik at at flere og flere e-poster kan krypteres ettersom tiden går. upgradeInfo.pEp.title=Nytt p≡p-juniormodus (praktisk enkelt personvern) upgradeInfo.pEp.desc=Enigmail inneholder et p≡p juniormodus. Du må installere p≡p manuelt for å få dette; dette vil endre seg i en senere versjon. p≡p-juniormodus lar deg bruke OpenPGP-kryptering så transparent som mulig; du trenger ikke å tenke på nøkkelbehandling og synkronisering av nøkler mellom enheter lenger. upgradeInfo.bottom.desc=Besøk dokumentasjonen for hjelp med bruk av Enigmail. pep.missingGnuPG=For å kunne bruke Enigmail/p≡p, kreves GnuPG. Siden det ikke ble fannet, kan det lastes ned og installeres for deg. #strings in enigmailAbout.html aboutEnigmail.tabName=Om Enigmail aboutEnigmail.title=OpenPGP-støtte skaffet til veie av Enigmail aboutEnigmail.team=Enigmail utvikles av Enigmail-laget: aboutEnigmail.projectLeader=Hovedutvikler: aboutEnigmail.usability=Brukbarhet: aboutEnigmail.documentation=Dokumentasjon: aboutEnigmail.testing=Testing: aboutEnigmail.userSupport=Brukerstøtte: aboutEnigmail.localization=Lokalisering: Sjekk Enigmail-språkpakkesiden aboutEnigmail.Credits=Bidragsytere: aboutEnigmail.origAuthor=Opprinnelig utvikler av Enigmail-tillegget aboutEnigmail.icons=Ikoner: aboutEnigmail.formerMembers=Tidligere lagmedlemmer: aboutEnigmail.projectHosting=Prosjekt-vertskap: aboutEnigmail.licenseSupportTitle=Lisens og støtte aboutEnigmail.license=Enigmail OpenPGP er fri programvare, under %S aboutEnigmail.support=Støtte og nedlastinger tilgjengelig fra www.enigmail.net. enigmail-2.0.8/lang/nb-NO/help/000077500000000000000000000000001334302754500160765ustar00rootroot00000000000000enigmail-2.0.8/lang/nb-NO/help/compose.html000066400000000000000000000100761334302754500204350ustar00rootroot00000000000000 Enigmail Help: Message Composition

Enigmail Help

Using Enigmail when composing messages

Enigmail menu in Mail/Compose window
Sign message
Enable/Disable sending signed mail. User is notified, if signing fails.
Encrypt message

Enable/Disable encryption to all recipient(s) before sending. User is notified, if encryption fails.

If Display selection when necessary is set in Preferences -> Key Selection tab, a list of keys will pop up if there are addresses in the list of recipients for the message for whom you have no public key.

If Never display OpenPGP key selection dialog is set in Preferences -> Key Selection tab, and there are addresses in the list of recipients for the message for whom you have no public key, the message will be sent unencrypted.

Use PGP/MIME for this message
Enable/Disable the use of PGP/MIME for this message.

If you know the recipient(s) can read mail using the PGP/MIME format, you should use it.

This feature is dependent on the settings in Preferences -> PGP/MIME tab being set to Allow to use PGP/MIME or Always use PGP/MIME.

Default composition options
  • Signing/Encryption Options...: shortcut to Account Settings -> OpenPGP Options.
  • Send options...: shortcut to Preferences -> Send tab.
  • Key selection options...: shortcut to Preferences -> Key Selection tab.
  • PGP/MIME options...: shortcut to Preferences -> PGP/MIME tab.
Undo encryption

If there is a failure when actually sending mail, such as the POP server not accepting the request, Enigmail will not know about it, and the encrypted message will continue to be displayed in the Compose window. Choosing this menu item will undo the encryption/signing, reverting the Compose window back to its original text.

As a temporary fix, this option may also be used to decrypt the quoted text when replying to encrypted messages. Enigmail should automatically decrypt the quoted message, but if that fails for some reason, you can use this menu item to force it.

Insert public key
insert ASCII-armored public key block at the current cursor location in the Compose window. You will be prompted for the email addresses of the key(s) to be inserted. Keys inserted in this manner will automatically be recognized at the receiving end by Enigmail. After key insertion, you may still choose to sign/encrypt the mail as needed. Also, do not insert more than one key block in a message; just specify multiple email addresses, separated by commas or spaces, when prompted.
Clear save passphrase
Clears cached passphrase. Useful if you have multiple passphrases.
Help
Displays Help information from the website (this page).

Further help is available on the Enigmail Help web page

enigmail-2.0.8/lang/nb-NO/help/editRcptRule.html000066400000000000000000000115601334302754500213750ustar00rootroot00000000000000 Enigmail Help: Edit OpenPGP Rule

Enigmail Help

Using the Enigmail Rules Editor: Edit OpenPGP Rule

In the Rules Editor, you can specify defaults per recipient for enabling encryption, signing and PGP/MIME, and to define what OpenPGP key(s) to use. In this dialog, you can specify the rules for a single recipient, and for a group of recipients with very similar attributes.

Set OpenPGP Rules for
Contains the email addresses of the recipients (without names, i.e. just an address like somebody@email.domain). You can specify several email addresses, separated by spaces. The address specified here can consist of only the domain section so that mail to any address at that domain will be matched, e.g. @email.domain will allow matching to body@email.domain, somebody@email.domain, anybody@email.domain, etc.
Apply rule if recipient ...
This modifies the matching of the email addresses. If multiple addresses are entered, the setting will apply to all. The examples below are based on body@email.domain entered in the OpenPGP Rules field above.
  • Is exactly: with this setting, the rule will only trigger on emails to body@email.domain (exact, case insensitive matching).
  • Contains: with this setting, any email address containing the string is matched, e.g. anybody@email.domain or body@email.domain.net
  • Begins with: with this setting, any email address starting with the string is matched, e.g. body@email.domain.net, body@email.domain-name.com.
  • Ends with: with this setting, any email address ending with the string is matched, e.g. anybody@email.domain , somebody@email.domain.
Continue with the next rule for the matching address
Enabling this function will allow you to define a rule but not have to specify a KeyID in the Use the following OpenPGP keys: field, so that the email address is used to check for a key at the time of sending. Also, further rules for the same address(es) will be processed as well.
Do not check further rules for the matching address
Enabling this function stops processing any other rules for the matching address(es) if this rule is matched; i.e. rule processing continues with the next recipient.
Use the following OpenPGP keys:
Use the Select Key(s).. button to select the recipient keys to be used for encryption. As in the action above, no further rules for the matching address(es) are processed.
Default for Signing
Enable or disable message signing. This either uses or overrides what you have specified in the message composition window. The values are:
  • Never: disable signing, even if it was enabled in the message composition window (overrules the other values)
  • Yes, if selected from in Message Composition: leave signing as specified in the message composition window
  • Always: enable signing, even if it was not enabled in the message composition window
These signing settings are applied for all rules that match. If one of the rules disables signing, the message will not be signed, regardless of other rules that specify Always.
Encryption
Enable or disable message encryption. The allowed settings and their meaning are the same as for message signing.
PGP/MIME
Enable or disable the use of the PGP/MIME (RFC 3156) message encoding. If PGP/MIME is disabled, the messages are encoded using "inline PGP". The allowed values and their meaning are the same as for message signing.

The rules are processed in the order displayed in the list in the OpenPGP Rules Editor. Whenever a rule matches a recipient and contains a OpenPGP Key ID, in addition to using the specified Key ID, the recipient is not considered anymore when processing further rules.


Further help is available on the Enigmail Per-Recipient Settings page

enigmail-2.0.8/lang/nb-NO/help/initError.html000066400000000000000000000045421334302754500207460ustar00rootroot00000000000000 Enigmail Help: How to Resolve Problems with Initializing OpenPGP

Enigmail Help

How to Resolve Problems with Initializing OpenPGP

There are several reasons why initializing OpenPGP does not succeed. The most common ones are described below; for more information please visit the Enigmail Support page.

GnuPG could not be found

In order for OpenPGP to work, the tool GnuPG needs to be installed. If GnuPG cannot be found, then first make sure that the executable gpg.exe (on Windows; gpg on other platforms) is installed on your computer. If GnuPG is installed, and OpenPGP cannot find it, then you need to manually set the path to GnuPG in the OpenPGP Preferences (menu OpenPGP > Preferences)

Enigmime failed to initialize

OpenPGP works only if it is built using the same build environment as Thunderbird or SeaMonkey was built. This means that you can use the official Enigmail releases only if you use the official releases of Thunderbird or SeaMonkey provided by mozilla.org.

If you use a Thunderbird or SeaMonkey version coming from some other source (e.g. the provider of your Linux distribution), or if you built the application yourself, you should either use an Enigmail version built by the same source, or build Enigmail yourself. For building Enigmail, refer to the Source Code section on the Enigmail home page. Please don't file any bug report concerning this problem, it is not solvable.

Further help is available on the Enigmail Support Web Site.

enigmail-2.0.8/lang/nb-NO/help/messenger.html000066400000000000000000000101221334302754500207500ustar00rootroot00000000000000 Enigmail Help: Message Reading

Enigmail Help

Using Enigmail when reading messages

Decrypt button in main Mail window
This button can be used for several purposes: decrypt, verify, or import public keys. Normally decryption/verification happens automatically, although this can be disabled through a preference. However, if this fails, usually a short error message will appear in the Enigmail status line. If you click the Decrypt button, you will be able to see a more detailed error message, including the output from the GnuPG command.
Pen and Key icons in Message Header display
The Pen and Key icons in the Message Header display indicate if the message you are reading was signed and/or encrypted and if the signature is good, i.e. the message has not been changed since it was signed. If the message has been changed, the Pen icon will change to a Broken Pen to indicate that the signature is bad. Right clicking on either the Pen or Key icons will bring up a menu with the following options:
  • OpenPGP Security info: allows you to view the output status from GnuPG for the message.
  • Copy OpenPGP Security info: copies the output status from GnuPG to the clipboard; to paste into a reply message, etc.
  • View OpenPGP Photo ID: allows you to view the Photo ID of the person who sent the message, if they have a photo embedded in their Public Key. (This option will only be enabled if a Photo ID exists in their key.)
  • S/MIME Security info: allows you to view the S/MIME Security Info for the message.

If you do not have keyserver-options auto-key-retrieve set in your gpg.conf file and you read a message which is signed or encrypted, you will see a Pen icon in the headers display area with a Question mark on it, the Enigmail status line in the headers area will say Part of the message signed; click pen icon for details and the message in the Message Pane will show all the OpenPGP message block indicators and the signature block.

You may also see this if you have keyserver-options auto-key-retrieve set in your gpg.conf file and the OpenPGP key is not available on the default keyserver.

Clicking on the Pen and Question mark icon will bring up a window advising that the key is unavailable in your keyring. Clicking on OK will bring up another window with a list of keyservers from which you can select to download the sender's public key from.

To configure the list of keyservers you wish to use, go to Enigmail -> Preferences -> Basic tab and enter the keyserver addresses in the Keyserver(s): box, separated by a comma. The first keyserver in the list will be used as the default.

Opening encrypted attachments / importing attached OpenPGP keys
Attachments named *.pgp, *.asc and *.gpg are recognized as attachments that can be handled specially by Enigmail. Right clicking on such an attachment enables two special menu items in the context menu: Decrypt and Open and Decrypt and Save. Use these two menu items if you want Enigmail to decrypt an attachment before opening or saving it. If an attachment is recognized as an OpenPGP key file, you are offered to import the keys it into your keyrings.

Further help is available on the Enigmail Help web page

enigmail-2.0.8/lang/nb-NO/help/rulesEditor.html000066400000000000000000000060331334302754500212670ustar00rootroot00000000000000 Enigmail Help: Rules Editor

Enigmail Help

Using the Enigmail Rules Editor

In the Rules Editor, you can specify defaults per recipient for enabling encryption, signing and PGP/MIME, and to define what OpenPGP key(s) to use. Each rule consists of 5 fields and is represented on a single line:

Email
The e-mail(s) from the To:, Cc: and Bcc: fields to match. The matching works on substrings (Further details can be found in the Edit Rule dialog)
OpenPGP Key(s)
a list of OpenPGP Key ID's to use for the recipient
Sign
enable or disable message signing. This either uses or overrides what you have specified in the message composition window. The values are:
  • Never: disable signing, even if it was enabled in the message composition window (overrules the other values)
  • Possible: leave signing as specified in the message composition window
  • Always: enable signing, even if it was not enabled in the message composition window

These signing settings are applied for all rules that match. If one of the rules disables signing, the message will not be signed, regardless of other rules that specify Always.

Encrypt
enable or disable message encryption. The allowed settings and their meaning are the same as for message signing.
PGP/MIME
enable or disable the use of the PGP/MIME (RFC 3156) message encoding. If PGP/MIME is disabled, the messages are encoded using "inline PGP". The allowed values and their meaning a re the same as for message signing.

The rules are processed in the order displayed in the list. Whenever a rule matches a recipient and contains a OpenPGP Key ID, in addition to using the specified Key ID, the recipient is not considered anymore when processing further rules.

Note: The rule editor is not yet complete. It is possible to write some more advanced rules by directly editing the rules file (these rules should then not be edited anymore in the rule editor). Further information for directly editing the file is available on the Enigmail Homepage


Further help is available on the Enigmail Help web page

enigmail-2.0.8/lang/nb-NO/help/sendingPrefs.html000066400000000000000000000047771334302754500214320ustar00rootroot00000000000000 Enigmail Help: Edit OpenPGP Rule

Enigmail Help

Defining Preferences to Send Encrypted

In the Sending Preferences you can choose the general model and preferences for encryption.

Convenient Encryption
With these settings, emails are encrypted without confirmation whenever possible.

This setup is appropriate, if you just want to improve your privacy by sending emails encyrpted instead of unencrypted if that's possible.

The effect is like sending emails as letters instead of postcards. Unlike postcards, letters usually hide their contents while in transit.

Note however that as with letters you can't be sure that nobody is opening the letter while it is in transit (although, some technical effort is necessary for that).

A concrete risk is that you accidentally use "faked keys" you got from somewhere or somebody claiming that the key belongs to the person you want to send emails to. To avoid this risk, you can either use the trust model of PGP (see below) or you should always verify, whether the fingerprint of a public key is correct.

Manual Encryption
This option allows you to specify the different preferences for encryption according to your needs. You can specify
  • whether replies to encrypted/signed emails should automatically also be encrypted/signed-
  • whether to use the trust model of OpenPGP to accept keys (this means that to use a key you either have to sign the key or have enough other people you trust having signed the key).
  • whether you want to automatically send emails encrypted if all keys are accepted.
  • whether and when you want to finally confirm sending an email.
If it is important for you that content you send encrypted can't be read by other people or organizations, you should use the manual preferences at least choose the option to accept keys only if you or other people signed them. While this model reduces the risk of using faked keys, it requires that you actively sign keys and declare owner trust using the key managament dialog. enigmail-2.0.8/lang/nl/000077500000000000000000000000001334302754500146465ustar00rootroot00000000000000enigmail-2.0.8/lang/nl/am-enigprefs.properties000066400000000000000000000001241334302754500213360ustar00rootroot00000000000000# Strings used in the Mozill AccountManager prefPanel-enigprefs=OpenPGP-beveiliging enigmail-2.0.8/lang/nl/enigmail.dtd000066400000000000000000002051171334302754500171360ustar00rootroot00000000000000 Mozilla Public License 2.0."> ‘Autocrypt-sleuteloverbrenging’ vereist dat het e-mailprogramma op het andere apparaat compatibel is met Autocrypt. Hoewel dit de eenvoudigere oplossing is, ondersteunen slechts een paar applicaties op dit moment deze standaard.De andere manier is via ‘het maken en terugzetten van een reservekopie’ van uw instellingen. Dit creëert een zipbestand met alle benodigde informatie en sleutels, dat u naar uw nieuwe apparaat kunt kopiëren. Enigmail kan deze instellingen direct importeren; voor andere e-mailprogramma’s kan het zipbestand uitgepakt worden en handmatig worden verwerkt."> ’"> ’ gebruiken om e-mailadressen op te geven"> ’ om e-mailadressen voor GnuPG op te geven. Schakel dit uit als ontvangers oude Hushmail-sleutels hebben."> OpenPGP)"> OPMERKING: Het maken van een sleutel kan meerdere minuten duren. Sluit het programma niet af tijdens dit proces. Het helpt om tegelijkertijd websites te bezoeken of acties uit te voeren die de harde schijf intensief gebruiken. Dit zorgt ervoor dat het ‘willekeurbuffer’ gevuld blijft en dat het aanmaken van de sleutel sneller verloopt. Zodra de sleutel klaar is wordt een melding getoond."> Autocrypt is een standaard die definieert hoe u eenvoudig end-to-end-versleuteling van e-mailberichten kunt bereiken. Het specificeert hoe e-mailprogramma’s onderhandelen over versleutelingsmogelijkheden via reguliere e-mailberichten."> ’ ongeldig"> LET OP: het genereren van een sleutel kan enkele minuten duren. Sluit het programma niet tijdens het aanmaken van de sleutel. U wordt gewaarschuwd zodra de sleutel is aangemaakt."> Let op: Enigmail zal altijd de ondertekeningen van e-mails controleren, of Enigmail nu voor die account is ingeschakeld of niet."> publieke sleutel kunnen andere personen u versleutelde berichten sturen. U kunt deze aan iedereen geven."> privésleutel is alleen voor uzelf en is nodig om e-mails te ontcijferen en ondertekende e-mails te verzenden. U moet deze sleutel geheim houden en aan niemand geven."> privésleutel is alleen voor uzelf en is nodig om e-mails te ontcijferen en ondertekende e-mails te verzenden. U moet deze sleutel geheim houden en aan niemand geven. Om uw privésleutel te beschermen, wordt in de volgende twee dialoogvensters om een wachtwoordzin gevraagd."> wachtwoordzin is een wachtwoord om uw privésleutel mee te beschermen. Deze voorkomt misbruik van uw privésleutel."> niet aanbevolen."> U wordt gevraagd om hiervoor uw wachtwoord in te voeren. Plaats dit certificaat op een medium waar het veilig opgeborgen kan worden, zoals een CD of een USB-stick. Als iemand dit certificaat bemachtigd, kan hij dit gebruiken om uw sleutel onbruikbaar te maken,"> exporteer uw gegevens van uw oude computer door middel van de back-upwizard in de Enigmail-instellingen importeer de gegevens op uw nieuwe computer door middel van deze wizard. "> Bedankt voor het gebruiken van Enigmail."> Bevestig het verzoek in uw Postvak IN als u dit wilt doen."> exporteer uw gegevens van uw oude computer door middel van deze wizard importeer de gegevens op uw nieuwe computer door middel van de Installatiewizard. "> Selecteer hieronder de account waarvoor uw uw sleutel wilt overzetten. Er wordt een instellingscode (wachtwoord) getoond op het volgende scherm, die u op het andere apparaat moet invoeren om uw sleutel en overige instellingen te importeren."> Schakel over naar het nieuwe apparaat en open het bericht. Als het goed is, wordt u gevraagd om de instellingscode. Type de volgende cijfers in op de prompt:"> enigmail-2.0.8/lang/nl/enigmail.properties000066400000000000000000001603161334302754500205600ustar00rootroot00000000000000Enigmail=Enigmail ##################################################################### # Strings used within enigmailCommon.js and enigmailCommon.jsm ##################################################################### enigAlert=Waarschuwing van Enigmail enigConfirm=Bevestiging van Enigmail enigInfo=Enigmail-informatie enigError=Fout van Enigmail enigPrompt=Vraag van Enigmail dlgYes=&Ja dlgNo=&Nee dlgKeepSetting=Mijn antwoord onthouden en niet opnieuw vragen dlgNoPrompt=Dit dialoogvenster niet opnieuw tonen dlg.button.delete=&Verwijderen dlg.button.cancel=&Annuleren dlg.button.close=&Sluiten dlg.button.continue=&Doorgaan dlg.button.skip=&Overslaan dlg.button.overwrite=&Overschrijven dlg.button.view=&Bekijken dlg.button.retry=&Opnieuw proberen dlg.button.ignore=&Negeren dlg.button.install=&Installeren dlg.button.ok=&OK repeatPrefix=\n\nDeze waarschuwing zal zich %S repeatSuffixSingular=keer herhalen. repeatSuffixPlural=keer herhalen. noRepeat=\n\nDeze waarschuwing zal niet worden herhaald totdat u een upgrade van Enigmail uitvoert. pgpNotSupported=U gebruikt Enigmail samen met PGP 6.x\n\nJammer genoeg zijn er een aantal problemen met PGP 6.x waardoor Enigmail niet goed functioneert. Daarom ondersteunt Enigmail PGP 6.x niet meer; u kunt GnuPG (GPG) daarvoor in de plaats gebruiken.\n\nAls u hulp nodig hebt om naar GnuPG over te schakelen, controleer dan de helpsectie op de website van Enigmail. initErr.howToFixIt=Om Enigmail te gebruiken, hebt u GnuPG nodig. Als u GnuPG nog niet hebt geïnstalleerd, kunt u op ‘Installatieassistent’ klikken. initErr.setupWizard.button=&Installatieassistent passphraseCleared=De wachtwoordzin is gewist. cannotClearPassphrase=U gebruikt een niet-standaard hulpmiddel (zoals gnome-keyring) voor het afhandelen van wachtwoordzinnen. Het is daarom niet mogelijk om de wachtwoordzin vanuit Enigmail leeg te maken. noPhotoAvailable=Geen foto beschikbaar debugLog.title=Debuglogboek van Enigmail error.photoPathNotReadable=Fotopad ‘%S’ is niet leesbaar generalError=Fout: %S # Strings in configure.jsm enigmailCommon.versionSignificantlyChanged=Deze nieuwe versie van Enigmail bevat significante wijzigingen omtrent de afhandeling van voorkeuren en opties. We hebben geprobeerd de oude instellingen in deze nieuwe versie over te nemen, maar kunnen dit niet in alle gevallen garanderen. Controleer voor de zekerheid nogmaals de nieuwe voorkeuren en opties. enigmailCommon.checkPreferences=Voorkeuren controleren… preferences.defaultToPgpMime=We hebben het standaard versleutelingsprotocol in Enigmail van Inline-PGP naar PGP/MIME gewijzigd. Het wordt aanbevolen deze standaardinstelling zo te laten.\n\nAls u toch standaard Inline-PGP wilt gebruiken, kunt u dit doen in de Accountinstellingen onder OpenPGP-beveiliging. ##################################################################### # Strings in enigmailAbout.js ##################################################################### usingVersion=Huidige versie van Enigmail %S enigmailPepVersion=Enigmail/p≡p-versie %S usingAgent=Uitvoerbaar bestand %2$S voor %1$S wordt voor versleuteling en ontcijfering gebruikt agentError=FOUT: geen toegang tot Enigmail-service! ##################################################################### # Strings in enigmailKeygen.js ##################################################################### accessError=Fout bij toegang tot Enigmail-service onlyGPG=Sleutelgeneratie werkt alleen met GnuPG (niet met PGP)! keygenComplete=Sleutelgeneratie voltooid! Voor het ondertekenen zal identiteit <%S> worden gebruikt. revokeCertRecommended=Het wordt ten zeerste aanbevolen een intrekkingscertificaat voor uw sleutel aan te maken. Dit certificaat kan worden gebruikt om uw sleutel ongeldig te maken, bijvoorbeeld als u uw geheime sleutel bent verloren of deze is gestolen. Wilt u nu een intrekkingscertificaat aanmaken? keyMan.button.generateCert=Certificaat &aanmaken genCompleteNoSign=Sleutelgeneratie voltooid! genGoing=Sleutelgeneratie wordt al uitgevoerd! passNoMatch=Wachtwoordzinnen komen niet overeen; voer ze opnieuw in passCheckBox=Vink dit aan als u geen wachtwoordzin voor deze sleutel gebruikt passUserName=Geef een gebruikersnaam op voor deze identiteit keygen.missingUserName=Er is geen naam voor de gekozen account/identiteit opgegeven. Geef in het veld ‘Uw naam’ in de Accountinstellingen een waarde in. keygen.passCharProblem=U gebruikt bijzondere tekens in uw wachtwoordzin. Helaas kan dit problemen veroorzaken met andere programma’s. Het is raadzaam een wachtwoordzin te kiezen die uitsluitend de volgende tekens bevat:\na-z A-Z 0-9 /.;:-,!?(){}[]%* passSpaceProblem=Om technische redenen is het niet mogelijk dat uw wachtwoordzin met een spatie begint of op een spatie eindigt. changePassFailed=Wijzigen van wachtwoordzin mislukt. keyConfirm=Publieke en geheime sleutel voor ‘%S’ aanmaken? keyMan.button.generateKey=&Geheime sleutel aanmaken keyAbort=Aanmaken sleutel afbreken? keyMan.button.generateKeyAbort=&Aanmaken van sleutel annuleren keyMan.button.generateKeyContinue=&Doorgaan met aanmaken van sleutel expiryTooLong=Het is niet mogelijk om een sleutel te maken die over meer dan 100 jaar vervalt. expiryTooLongShorter=Het is niet mogelijk om een sleutel te maken die over meer dan 90 jaar vervalt. expiryTooShort=Uw sleutel moet minstens één dag geldig zijn. keyGenFailed=Sleutelgeneratie mislukt. Controleer de console van Enigmail voor details (Menu Enigmail > Enigmail debuggen). setKeyExpirationDateFailed=De vervaldatum kon niet worden gewijzigd # Strings in enigmailMessengerOverlay.js securityInfo=Beveiligingsinformatie van Enigmail\n\n enigHeader=Enigmail: enigContentNote=Enigmail: *Bijlagen bij dit bericht zijn niet ondertekend of versleuteld*\n\n possiblyPgpMime=Mogelijk met PGP/MIME versleuteld of ondertekend bericht; klik op de knop Ontcijferen om te verifiëren saveAttachmentHeader=Enigmail: ontcijferde bijlage opslaan noTempDir=Kon geen tijdelijke map vinden om naar te schrijven\nStel de omgevingsvariabele TEMP in attachmentPgpKey=De bijlage ‘%S’ die u wilt openen blijkt een OpenPGP-sleutelbestand te zijn.\n\nKlik op Importeren om de ingesloten sleutels te importeren, of klik op Bekijken om de inhoud van het bestand te bekijken in een browservenster beginPgpPart=********* *BEGIN VAN VERSLEUTELD of ONDERTEKEND DEEL* ********* endPgpPart=********** *EINDE VAN VERSLEUTELD of ONDERTEKEND DEEL* ********** notePartEncrypted=Enigmail: *Delen van het bericht zijn NIET ondertekend of versleuteld* noteCutMessage=Enigmail: *Meerdere berichtblokken gevonden - ontcijferen/verifiëren afgebroken* decryptOkNoSig=Waarschuwing\n\nOntcijfering is gelukt, maar de ondertekening kon niet juist worden geverifieerd msgOvl.button.contAnyway=&Toch doorgaan signature.verifiedOK=De ondertekening voor bijlage %S is met succes geverifieerd signature.verifyFailed=De ondertekening voor bijlage %S kon niet worden geverifieerd attachment.noMatchToSignature=Kon bijlage ‘%S’ niet aan een ondertekeningsbestand koppelen attachment.noMatchFromSignature=Kon ondertekeningsbestand ‘%S’ niet aan een bijlage koppelen fixBrokenExchangeMsg.failed=Berichtreparatie mislukt. enigmail.msgViewColumn.label=Enigmail enigmailPep.msgViewColumn.label=Enigmail/p≡p wksNoIdentity=Deze sleutel is niet aan een van uw e-mailaccounts verbonden. Voeg een account voor tenminste een van de volgende e-mailadressen toe:\n\n%S wksConfirmSuccess=Bevestigingse-mail verzonden. wksConfirmFailure=Het versturen van de bevestigings-e-mail is mislukt. autocrypt.importSetupKey.accountPreconfigured=Uw account is al juist geconfigureerd voor Autocrypt.\n\nWilt u uw instellingen echt overschrijven met dit instellingsbericht? autocrypt.importSetupKey.selfCreated=Dit bericht is gecreëerd door het exemplaar van Enigmail dat momenteel wordt uitgevoerd.\n\nWissel naar de e-mailclient waar u de instellingen naartoe wilt overzetten en klik in die e-mailclient op het bericht om de instellingen te importeren. autocrypt.importSetupKey.invalidMessage=Fout - kon instellingsbericht niet lezen. Het bericht lijkt beschadigd. Creëer een nieuw instellingsbericht op uw andere apparaat. autocrypt.importSetupKey.invalidKey=Fout - de sleutel kon niet worden geïmporteerd. De sleutel wordt ofwel niet ondersteund door uw versie van GnuPG of is beschadigd. autocrypt.importSetupKey.wrongPasswd=Het door u ingevoerde wachtwoord is fout. Wilt u het nogmaals proberen? autocrypt.importSetupKey.success=Het Autocrypt-instellingsbericht is met succes verwerkt. Autocrypt is nu beschikbaar voor uw account ‘%S’. ##################################################################### # Strings in enigmailMsgComposeOverlay.js ##################################################################### keysToExport=Selecteer OpenPGP-sleutels om in te voegen keysToUse=Selecteer OpenPGP-sleutel(s) om te gebruiken voor %S pubKey=Publieke sleutel voor %S\n windowLocked=Opstelvenster is geblokkeerd; verzending geannuleerd sendUnencrypted=Initialiseren van Enigmail mislukt.\nNiet-versleuteld bericht verzenden? composeSpecifyEmail=Geef uw primaire e-mailadres op. Dit wordt gebruikt om de sleutel voor het ondertekenen van uitgaande berichten te kiezen.\nAls u dit niet invult, wordt het VAN-adres van het bericht gebruikt om de sleutel te kiezen. sendingHiddenRcpt=Dit bericht heeft BCC-ontvangers (blind copy). Als dit bericht wordt versleuteld, is het mogelijk om de BCC-ontvangers te verbergen, maar gebruikers van sommige producten (bv. PGP Corp.) zullen het bericht niet kunnen ontcijferen. Om deze reden wordt aanbevolen BCC-e-mails bij versleutelde berichten te vermijden. sendWithHiddenBcc=BCC-ontvangers verbergen sendWithShownBcc=Normaal versleutelen sendingNews=Versleutelde verzending afgebroken.\n\nDit bericht kan niet worden versleuteld, omdat er nieuwsgroepontvangers zijn. Verzend het bericht opnieuw zonder versleuteling. sendToNewsWarning=U staat op het punt een versleutelde e-mail naar een nieuwsgroep te verzenden.\n\nDit wordt afgeraden, omdat dit alleen zin heeft als alle leden van de groep dit bericht kunnen ontcijferen, dus het bericht moet worden versleuteld met de sleutels van alle leden van de groep. Verzend dit bericht alleen als u precies weet wat u doet.\n\nDoorgaan? hasHTML=HTML-berichtwaarschuwing:\nDit bericht bevat vermoedelijk HTML, wat ervoor kan zorgen dat ondertekening of versleuteling mislukt. Houd de SHIFT-toets ingedrukt wanneer u op de knop Opstellen/Antwoorden klikt om een ondertekend bericht te verzenden en dit probleem in de toekomst te vermijden. Als u dit berichten standaard ondertekent, vink dan de optie ‘Berichten opstellen in HTML-indeling’ uit om het gebruik van HTML voor deze account definitief uit te schakelen. strippingHTML=Het bericht bevat HTML-opmaakgegevens. Deze gaat verloren bij het converteren naar platte tekst voor ondertekening of versleuteling. Wilt u doorgaan? msgCompose.button.sendAnyway=Bericht toch &verzenden attachWarning=Bijlagen bij dit bericht zijn niet lokaal, dus ze kunnen niet worden versleuteld. Om bijlagen te versleutelen, dient u deze eerst lokaal op te slaan en daarna toe te voegen. Bericht toch verzenden? quotedPrintableWarn=U hebt de ‘quoted-printable’-codering voor het verzenden van berichten ingeschakeld. Dit kan resulteren in een onjuiste ontcijfering of verificatie van uw bericht.\nWilt u de ‘quoted-printable’-optie nu uitschakelen? minimalLineWrapping=U hebt regelterugloop ingesteld op %S tekens. Voor juiste versleuteling en/of ondertekening moet dit getal minstens 68 zijn.\nWilt u de regelterugloop nu naar 68 tekens wijzigen? warning=Waarschuwing signIconClicked=U hebt handmatig ondertekenen aangepast. Daarom zal het (de)activeren van de ondertekening tijdens het opstellen van dit bericht niet meer afhankelijk zijn van het (de)activeren van de versleuteling. errorOwnKeyUnusable=De sleutel-ID ‘%S’ die voor de huidige identiteit is geconfigureerd, levert geen bruikbare OpenPGP-sleutel op.\n\nZorg ervoor dat u een geldige, niet-vervallen OpenPGP-sleutel hebt en dat deze in uw accountinstellingen is ingesteld.\nAls uw sleutel niet is vervallen, controleer dan of u het Eigenaarsvertrouwen op volledig of maximaal hebt ingesteld. msgCompose.cannotSaveDraft=Fout bij opslaan van concept msgCompose.partiallyEncrypted.short=Pas op dat u geen gevoelige informatie lekt - gedeeltelijk versleuteld e-mailbericht. msgCompose.partiallyEncrypted.mimeMsg=Het bericht waarop u antwoord, bevat zowel onversleutelde als versleutelde delen. Sommige versleutelde delen zijn niet zichtbaar voor u.\n\nAls de afzender niet in staat was om de verborgen delen te ontsleutelen, is het mogelijk dat u vertrouwelijke informatie lekt die de afzender zelf niet kon ontsleutelen.\n\nWij adviseren u niet op het bericht te antwoorden, maar om een nieuw bericht te maken dat uw antwoord bevat. msgCompose.partiallyEncrypted.inlinePGP=Het bericht waarop u antwoord, bevat zowel onversleutelde als versleutelde delen. Als de afzender niet in staat was om sommige delen te ontsleutelen, is het mogelijk dat u vertrouwelijke informatie lekt die de afzender zelf niet kon ontsleutelen.\n\nWij adviseren u alle geciteerde tekst uit uw antwoord aan deze afzender te verwijderen. msgCompose.internalEncryptionError=Interne fout: beloofde versleuteling uitgeschakeld msgCompose.internalError=Er is een interne fout opgetreden. msgCompose.toolbarTxt.signAndEncrypt=Dit bericht zal worden ondertekend en versleuteld msgCompose.toolbarTxt.signOnly=Dit bericht zal worden ondertekend msgCompose.toolbarTxt.encryptOnly=Dit bericht zal worden versleuteld msgCompose.toolbarTxt.noEncryption=Dit bericht zal niet worden ondertekend en niet worden versleuteld msgCompose.toolbarTxt.disabled=Enigmail is voor het gekozen profiel uitgeschakeld msgCompose.protectSubject.tooltip=Het berichtonderwerp beschermen msgCompose.noSubjectProtection.tooltip=Het berichtonderwerp niet beschermen msgCompose.encryptedSubjectStub=Versleuteld bericht msgCompose.protectSubject.dialogTitle=Bescherming van Onderwerp inschakelen? msgCompose.protectSubject.question=Normale versleutelde berichten bevatten het ongeredigeerde onderwerp. Wij hebben een standaard bewerkstelligd om het oorspronkelijke onderwerp te verbergen in het versleutelde bericht en het te vervangen door een dummytekst, zodat het onderwerp alleen zichtbaar is nadat het e-mailbericht is ontsleuteld.\n\nWilt u het onderwerp van versleutelde berichten beschermen? msgCompose.protectSubject.yesButton=Onderwerp &beschermen msgCompose.protectSubject.noButton=Onderwerp &onbeschermd laten msgCompose.detailsButton.label=Details… msgCompose.detailsButton.accessKey=D msgCompose.pepSendUnknown=onbekend msgCompose.pepSendUnsecure=onveilig msgCompose.pepSendSecure=veilig msgCompose.pepSendTrusted=veilig & vertrouwd pep.alert.disabledForIdentity=p≡p is voor de huidige identiteit uitgeschakeld. Schakel p≡p in via Enigmail/p≡p-voorkeuren. pep.alert.weakReply=U staat op het punt om een veilig bericht onveilig te beantwoorden. Als u doorgaat, kan er vertrouwelijke informatie lekken, waardoor u en uw correspondent in gevaar gebracht kunnen worden. Weet u zeker dat u door wilt gaan? # note: should end with double newline: sendAborted=Verzendhandeling afgebroken.\n\n # details: keyNotTrusted=Niet voldoende vertrouwensbasis voor sleutel ‘%S’ keyNotFound=Sleutel ‘%S’ niet gevonden keyRevoked=Sleutel ‘%S’ ingetrokken keyExpired=Sleutel ‘%S’ verlopen statPGPMIME=PGP/MIME statSMIME=S/MIME statSigned=ONDERTEKEND statEncrypted=VERSLEUTELD statPlain=PLATTE TEKST offlineSave=%S bericht opslaan naar %S in map Niet-verzonden berichten? onlineSend=%S bericht naar %S verzenden? encryptKeysNote=Let op: het bericht is met de volgende gebruikers-ID/-sleutel versleuteld: %S hiddenKey= signFailed=Fout in Enigmail; Versleuteling/ondertekening mislukt; niet-versleuteld bericht verzenden? msgCompose.button.sendUnencrypted=Onversleuteld bericht &verzenden recipientsSelectionHdr=Ontvangers voor versleuteling selecteren configureNow=U hebt nog geen Enigmail-beveiliging voor de geselecteerde identiteit ingesteld. Wilt u dit nu doen? # encryption/signing status and associated reasons: encryptMessageAuto=Bericht versleutelen (auto) encryptMessageNorm=Bericht versleutelen signMessageAuto=Bericht ondertekenen (auto) signMessageNorm=Bericht ondertekenen encryptOff=Versleuteling: UIT encryptOnWithReason=Versleuteling: AAN (%S) encryptOffWithReason=Versleuteling: UIT (%S) encryptOn=Versleuteling: AAN signOn=Ondertekenen: AAN signOff=Ondertekenen: UIT signOnWithReason=Ondertekenen: AAN (%S) signOffWithReason=Ondertekenen: UIT (%S) reasonEnabledByDefault=standaard ingeschakeld reasonManuallyForced=handmatig afgedwongen reasonByRecipientRules=afgedwongen door ontvangerregels reasonByAutoEncryption=afgedwongen door automatische versleuteling reasonByConflict=vanwege conflict in de ontvangerregels reasonByEncryptionMode=vanwege versleutelingsmodus # should not be used anymore: encryptYes=Bericht zal worden versleuteld encryptNo=Bericht zal niet worden versleuteld # should not be used anymore: signYes=Bericht zal worden ondertekend signNo=Bericht zal niet worden ondertekend # PGP/MIME status: pgpmimeNormal=Protocol: PGP/MIME inlinePGPNormal=Protocol: Inline PGP smimeNormal=Protocol: S/MIME pgpmimeAuto=Protocol: PGP/MIME (auto) inlinePGPAuto=Protocol: Inline PGP (auto) smimeAuto=Protocol: S/MIME (auto) # should not be used anymore pgpmimeYes=PGP/MIME zal worden gebruikt pgpmimeNo=Inline PGP zal worden gebruikt # Attach own key status (tooltip strings): attachOwnKeyNo=Uw eigen sleutel zal niet worden gekoppeld attachOwnKeyYes=Uw eigen sleutel zal worden gekoppeld attachOwnKeyDisabled=Uw eigen sleutel kan niet worden gekoppeld. U moet een specifieke sleutel selecteren\nin de sectie OpenPGP van de Accountinstellingen om deze functie in te schakelen. rulesConflict=Conflicterende per-ontvanger-regels gevonden\n%S\n\nBericht met deze instellingen verzenden? msgCompose.button.configure=&Instellen msgCompose.button.send=Bericht &verzenden msgCompose.button.save=Bericht &opslaan # Strings in enigmailMsgHdrViewOverlay.js keyNeeded=Publieke sleutel %S is nodig om de ondertekening te verifiëren keyUsed=Publieke sleutel %S gebruikt om ondertekening te verifiëren clickDecrypt=; gebruik de functie ‘Ontcijferen/verifiëren’ clickDecryptRetry=; gebruik ‘Ontcijferen/verifiëren’ om het opnieuw te proberen clickDetailsButton=; klik op ‘Details’ voor meer informatie clickImportButton=; klik op ‘Sleutel importeren’ om de sleutel te importeren keyTypeUnsupported=; het sleuteltype wordt niet door uw versie van GnuPG ondersteund msgPart=Deel van het bericht %S msgSigned=ondertekend msgSignedUnkownKey=ondertekend met onbekende sleutel msgEncrypted=versleuteld msgSignedAndEnc=ondertekend en versleuteld unverifiedSig=Ongeverifieerde ondertekening incompleteDecrypt=Ontcijfering onvolledig needKey=Fout - geheime sleutel nodig om het bericht te ontcijferen failedDecrypt=Fout - ontcijfering mislukt badPhrase=Fout - onjuiste wachtwoordzin failedDecryptVerify=Fout - ontcijfering/verificatie mislukt viewInfo=; Beeld > Berichtbeveiliginginfo voor details decryptedMsg=Ontcijferd bericht decryptedMsgWithFormatError=Bericht ontcijferen (herstelt beschadigde PGP-e-mailindeling veroorzaakt door een oude Exchange-server, waardoor het resultaat misschien niet perfect leesbaar is) usedAlgorithms=Gebruikte algoritmen: %1$S en %2$S pepStatusInfo.text=p≡p Berichtstatus. pepStatusInfo.title.m3=Aangevallen pepStatusInfo.info.m3=Dit bericht is niet veilig en is gemanipuleerd. pepStatusInfo.title.m1=Gewantrouwd pepStatusInfo.info.m1=Dit bericht bevat een correspondent die voorheen als gewantrouwd werd gemarkeerd pepStatusInfo.title.r0=Onbekend pepStatusInfo.info.r0=Dit bericht bevat onvoldoende informatie om vast te stellen of het veilig is. pepStatusInfo.title.r1=Kan niet ontcijferen pepStatusInfo.info.r1=Dit bericht kan niet worden ontcijferd, omdat de sleutel niet beschikbaar is. pepStatusInfo.title.r2=Kan niet ontcijferen pepStatusInfo.info.r2=Dit bericht kan niet worden ontcijferd, omdat de sleutel niet beschikbaar is. pepStatusInfo.title.r3=Onveilig pepStatusInfo.info.r3=Dit bericht is onveilig. pepStatusInfo.title.r4=Onveilig voor enkelen pepStatusInfo.info.r4=Dit bericht is onveilig voor sommige correspondenten. pepStatusInfo.title.r5=Onbetrouwbare beveiliging pepStatusInfo.info.r5=Dit bericht heeft onbetrouwbare bescherming. pepStatusInfo.title.r6=Veilig… pepStatusInfo.info.r6=Dit bericht is veilig, maar u moet de identiteit van uw correspondent nog verifiëren. pepStatusInfo.title.r7=Veilig & vertrouwd pepStatusInfo.info.r7=Dit bericht is veilig en vertrouwd. pepStatusInfo.color.green=Groen pepStatusInfo.color.yellow=Geel pepStatusInfo.color.red=Rood pepRevokeTrust.question=Wilt u echt het vertrouwen voor %S annuleren? pepRevokeMistrust.question=Wilt u de sleutel voor %S echt opnieuw vertrouwen? pepRevokeTrust.doRevoke=Vertrouwen &annuleren wksConfirmationReq=Bevestigingsverzoek van Web Key Directory wksConfirmationReq.message=Dit bericht is door uw e-mailprovider verzonden om de distributie van uw OpenPGP publieke sleutel in hun Webkey-directory te bevestigen.\nDoor uw publieke sleutel aan te leveren, stelt u anderen in staat om uw sleutel te vinden en zo berichten naar u te kunnen versleutelen.\n\nAls u nu uw sleutel in de Webkey-directory wilt distribueren, klik dan op de knop ‘Verzoek bevestigen’ in de statusbalk. Anders kunt u dit bericht negeren. wksConfirmationReq.button.label=Verzoek bevestigen autocryptSetupReq=Autocrypt-set-up uitvoeren autocryptSetupReq.button.label=Set-up starten autocryptSetupReq.setupMsg.desc=Dit bericht bevat alle informatie die nodig is om uw Autocrypt-instellingen samen met uw privésleutel veilig van uw originele apparaat over te plaatsen. autocryptSetupReq.setupMsg.backup=U kunt dit bericht bewaren en het gebruiken als een veiligheidskopie van uw privésleutel. Als u dit wilt doen, schrijf dan het wachtwoord op en bewaar dit op een veilige plaats. autocryptSetupReq.message.import=Klik op de knop ‘Set-up starten’ in de statusbalk om de instellingen en sleutel(s) in Enigmail te importeren autocryptSetupReq.message.sent=Klik op het bericht op uw nieuwe apparaat en volg de instructies om uw instellingen te importeren. # strings in pref-enigmail.js oldGpgVersion20=Initialisatie van Enigmail is mislukt.\n\nU gebruikt GnuPG versie %1$S, die niet meer wordt ondersteund. Enigmail vereist GnuPG versie %2$S of nieuwer. Upgrade uw installatie van GnuPG, anders zal Enigmail niet werken. locateGpg=GnuPG-programma lokaliseren invalidGpgPath=GnuPG kan niet worden gestart met het opgegeven pad. Enigmail zal uitgeschakeld blijven totdat u het pad van GnuPG opnieuw wijzigt of totdat u het programma herstart. warningsAreReset=Alle waarschuwingen zijn teruggezet. prefs.gpgFound=GnuPG is gevonden in %S prefs.gpgNotFound=Kon GnuPG niet vinden prefs.warnAskNever=Waarschuwing: het aanzetten van deze optie zal leiden tot onversleutelde e-mails zonder enig bericht als er voor een van de ontvangers geen sleutel bestaat - Enigmail zal u niet informeren als dit gebeurt! prefs.warnIdleTimeForUnknownAgent=Kon geen verbinding met gpg-agent maken. Misschien gebruikt uw systeem een aangepast programma voor het afhandelen van uw wachtwoordzin (bv. gnome-keyring of seahorse-agent). Enigmail heeft helaas geen invloed op de geldigheidsduur van de wachtwoordzin van het programma dat u gebruikt. De instellingen in Enigmail worden daarom genegeerd. prefEnigmail.oneKeyserverOnly=Fout - u kunt slechts één sleutelserver instellen voor het automatisch downloaden van ontbrekende OpenPGP-sleutels. # Strings used in core.jsm # (said file also re-uses some strings from above) enterAdminPin=Typ de beheerpincode van uw smartcard enterCardPin=Typ de pincode van uw smartcard notInit=Fout - Enigmail-service nog niet geïnitialiseerd badCommand=Fout - versleutelingsopdracht mislukt cmdLine=opdrachtregel en uitvoer: notRequired=Fout - geen versleuteling vereist notComplete=Fout - sleutelgeneratie nog niet voltooid invalidEmail=Fout - ongeldig(e) e-mailadres(sen) noPassphrase=Fout - geen wachtwoordzin opgegeven noPGPblock=Fout - Geen geldig gewapend OpenPGP-gegevensblok gevonden unverifiedReply=Ingesprongen berichtdeel (antwoord) is waarschijnlijk aangepast keyInMessageBody=Sleutel in berichttekst gevonden. Klik op ‘Sleutel importeren’ om de sleutel te importeren sigMismatch=Fout - Ondertekeningen komen niet overeen cantImport=Fout bij het importeren van publieke sleutel\n\n doImportOne=%1$S (%2$S) importeren? doImportMultiple=De volgende sleutels importeren?\n\n%S previewFailed=Kan het bestand met de publieke sleutel niet importeren. # Strings used in errorHandling.jsm sc.wrongCardAvailable=De smartcard %1$S, die in uw lezer is gevonden, kan niet worden gebruikt om dit bericht te verwerken.\nVoer smartcard %S in en herhaal de handeling. sc.insertCard=Deze handeling vereist uw smartcard %S. \nVoer de vereiste kaart in en herhaal de handeling. sc.removeCard=Deze handeling vereist geen smartcard in de lezer. \nVerwijder uw kaart en herhaal de handeling. sc.noCardAvailable=Geen smartcard gevonden in de lezer.\nVoer je kaart in en herhaal de handeling. sc.noReaderAvailable=Uw smartcardlezer kon niet worden gevonden.\nKoppel uw smartcardlezer, voer uw kaart in en herhaal de handeling. keyError.keySpecNotFound=Het e-mailadres ‘%S’ komt niet overeen met een sleutel in uw keyring. keyError.keyIdNotFound=De ingestelde sleutel-ID ‘%S’ kan niet in uw keyring worden gevonden. keyError.resolutionAction=Kies een geldige sleutel in OpenPGP-beveiliging bij uw Accountinstellingen. missingPassphrase=Ontbrekende wachtwoordzin errorHandling.gpgAgentInvalid=Er is een versie van gpg-agent op uw systeem actief die niet geschikt is voor uw GnuPG-versie. errorHandling.gpgAgentError=GnuPG heeft een fout gemeld in de communicatie met gpg-agent (een component van GnuPG). errorHandling.dirmngrError=GnuPG heeft een fout gemeld in de communicatie met dirmngr (een component van GnuPG). errorHandling.pinentryError=GnuPG kan niet om uw wachtwoordzin vragen via pincode-invoer. errorHandling.readFaq=Dit is een systeeminstallatie- of configuratiefout die voorkomt dat Enigmail goed kan werken en niet automatisch kan worden hersteld.\n\nHet wordt ten zeerste aanbevolen onze ondersteuningswebsite https://enigmail.net/faq te raadplegen. gpgNotFound=Kan het GnuPG-programma ‘%S’ niet vinden.\nZorg ervoor dat u het uitvoerbare pad van GPG goed hebt ingesteld in de Enigmail-voorkeuren. gpgNotInPath=Kan GnuPG niet vinden in het PATH.\nZorg ervoor dat u het uitvoerbare pad van GPG goed hebt ingesteld in de Enigmail-voorkeuren. enigmailNotAvailable=Enigmail-coreservices zijn niet beschikbaar prefGood=Goede ondertekening van %S prefBad=ONJUISTE ondertekening van %S failCancel=Fout - Sleutelontvangst geannuleerd door gebruiker failNoServer=Fout - Geen sleutelserver opgegeven om sleutels van te ontvangen failNoID=Fout - Geen sleutel-ID opgegeven om een sleutel voor te ontvangen failKeyExtract=Fout - sleutelextractieopdracht mislukt notFirstBlock=Fout - Eerste OpenPGP-blok is geen publiek sleutelblok importKeyConfirm=Publieke sleutel(s) die in het bericht zijn ingesloten importeren? failKeyImport=Fout - sleutel importeren mislukt fileWriteFailed=Schrijven naar bestand %S mislukt importKey=Publieke sleutel %S importeren van sleutelserver: uploadKey=Publieke sleutel %S verzenden naar sleutelserver: keyId=Sleutel-ID keyAndSigDate=Sleutel-ID: 0x%1$S / Ondertekend op: %2$S keyFpr=Vingerafdruk van sleutel: %S noEmailProvided=U hebt geen e-mailadres opgegeven! keyAlreadySigned=De sleutel is al ondertekend. U kunt het geen twee keer ondertekenen. ##################################################################### # Strings used in enigmailKeySelection.js ##################################################################### selKeyExpired=vervallen %S createdHeader=Aangemaakt atLeastOneKey=Geen sleutel geselecteerd! U moet minstens één sleutel kiezen in dit dialoogvenster fewerKeysThanRecipients=U hebt een kleiner aantal sleutels geselecteerd dan dat er ontvangers zijn. Weet u zeker dat de lijst van sleutels volledig is? userSel.button.goBack=Meer sleutels selecteren userSel.secretKeySel.title=Selecteer een Geheime OpenPGP-sleutel om uw berichten te ondertekenen userSel.problemNoKey=Geen geldige sleutel userSel.problemMultipleKeys=Meerdere sleutels # should be same as thunderbird ENTITY sendLaterCmd.label: sendLaterCmd.label=Later verzenden # Strings used in enigmailAttachmentDialog.js pgpMimeNote=Noot: PGP/MIME wordt niet door alle e-mailclients ondersteund. Als u het niet zeker weet, kies dan de optie %S. first=eerste second=tweede # Strings used in am-enigprefs.js / enigmailEditIdentity.js encryptKeyHeader=OpenPGP-sleutel voor versleuteling selecteren identityName=Identiteit: %S switchPepMode=U gebruikt momenteel de ‘p≡p-juniormodus’ van Enigmail.\n\nDoor OpenPGP of S/MIME voor een account in te schakelen, schakelt u p≡p en de ‘normale’ modus van Enigmail zonder p≡p uit. enableEnigmail=p≡p &uitschakelen # Strings used in enigmailSingleRcptSettings.js noEncryption=U hebt versleuteling geactiveerd, maar geen sleutel geselecteerd. Om versleutelde mails naar %S te verzenden, dient u een geldige sleutel uit uw sleutellijst op te geven. Wilt u versleuteling voor %S uitschakelen? noKeyToUse=(geen - niet versleutelen) noEmptyRule=De regel mag niet leeg zijn! Geef een e-mailadres op in het Regelveld invalidAddress=Het e-mailadres dat u hebt opgegeven, is niet geldig. U mag de naam van de ontvangers niet gebruiken, alleen hun e-mailadres. Bv.:\nOngeldig: Een Naam \nGeldig: een.naam@adres.net noCurlyBrackets=De accolades {} hebben een speciale betekenis en zouden niet in het e-mailadres mogen worden gebruikt. Als u de vergelijkingsfuncties voor deze regel wilt aanpassen, gebruik dan de optie ‘Regel toepassen als ontvanger…’. Meer informatie is beschikbaar via de Helpknop. # Strings used in enigmailRulesEditor.js never=Nooit always=Altijd possible=Mogelijk deleteRule=De geselecteerde regel echt verwijderen? nextRcpt=(Volgende ontvanger) negateRule=Niet addKeyToRule=Sleutel %1$S (%2$S) per ontvanger aan regel toevoegen # Strings used in enigmailSearchKey.js needOnline=De functie die u hebt geselecteerd, is niet in de offlinemodus beschikbaar. Ga online en probeer het opnieuw. protocolNotSupported=Het protocol ‘%S://’ dat u hebt geselecteerd, wordt niet ondersteund bij het downloaden van OpenPGP-sleutels. gpgkeysDisabled=Het zou helpen als u de optie ‘extensions.enigmail.useGpgKeysTool’ inschakelt. noKeyserverConn=Kon geen verbinding maken met server op %S. keyDownloadFailed=Downloaden van sleutel van sleutelserver mislukt. Statusbericht is:\n%S internalError=Er is een interne fout opgetreden. De sleutels konden niet worden gedownload of geïmporteerd. noKeyFound=Sorry, ik kon geen sleutel vinden die aan de zoekcriteria voldoet.\nOnthoud dat de sleutel-ID’s moeten worden voorafgegaan door ‘0x’ (bv. 0xABCDEF12). keyDownload.keyUnavailable=De sleutel met ID %S is helaas niet beschikbaar op de keyserver. Waarschijnlijk heeft de eigenaar van de sleutel zijn sleutel niet naar de keyserver geüpload.\n\nVraag de afzender van het bericht om u zijn sleutel via e-mail toe te sturen. # gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. gpgKeysFailed=Zoeken naar of downloaden van sleutel van sleutelserver mislukt: gpgkeys_%S kon niet worden uitgevoerd. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Instellen van sleutelvertrouwen mislukt # Strings in enigmailSignKeyDlg.js signKeyFailed=Ondertekenen van sleutel mislukt alreadySigned.label=Let op: de sleutel %S is al ondertekend met de geselecteerde geheime sleutel. alreadySignedexportable.label=Noot: de sleutel ‘%S’ is al exporteerbaar ondertekend met de gekozen geheime sleutel. Een lokale ondertekening heeft geen zin. partlySigned.label=Let op: enkele gebruikers-ID’s van sleutel %S zijn al ondertekend met de gekozen geheime sleutel. noTrustedOwnKeys=Geen voor ondertekening in aanmerking komende sleutel gevonden! U moet minstens een volledig vertrouwde geheime sleutel hebben om sleutels te kunnen ondertekenen. # Strings in enigmailKeyManager.js keyMan.loadingKeys=Sleutels worden geladen, even geduld… keyValid.unknown=onbekend keyValid.invalid=ongeldig keyValid.disabled=uitgeschakeld keyValid.revoked=ingetrokken keyValid.expired=vervallen keyValid.noSubkey=geen geldige subsleutel keyTrust.untrusted=onbetrouwbaar keyTrust.marginal=weinig keyTrust.full=betrouwbaar keyTrust.ultimate=maximaal keyTrust.group=(groep) keyType.public=pub keyType.publicAndSec=pub/sec keyMan.enableKey=Sleutel inschakelen keyMan.disableKey=Sleutel uitschakelen userAtt.photo=Gebruikerskenmerk (JPEG-afbeelding) asciiArmorFile=ASCII-armored bestanden (*.asc) importKeyFile=OpenPGP-bestand importeren gnupgFile=GnuPG-bestanden createKeyOK=Uw sleutel is gegenereerd saveRevokeCertAs=Intrekkingscertificaat aanmaken en opslaan revokeCertOK=Het intrekkingscertificaat is met succes aangemaakt. U kunt dit certificaat gebruiken om uw publieke sleutel ongeldig te maken, bijvoorbeeld als u uw geheime sleutel hebt verloren. revokeCertFailed=Het intrekkingscertificaat kon worden niet aangemaakt. addUidOK=Gebruikers-ID met succes toegevoegd addUidFailed=Toevoegen van gebruikers-ID mislukt noKeySelected=U dient minstens één sleutel te selecteren om de gevraagde handeling uit te voeren exportToFile=Ppublieke sleutel naar bestand exporteren exportKeypairToFile=Geheime en publieke sleutel naar bestand exporteren exportSecretKey=Wilt u uw geheime sleutel in het opgeslagen OpenPGP-bestand bijvoegen? saveKeysOK=De sleutels zijn met succes opgeslagen saveKeysFailed=Opslaan van sleutels mislukt importKeysFailed=Importeren van sleutels mislukt enableKeyFailed=Sleutels in-/uitschakelen mislukt specificPubKeyFilename=%1$S (0x%2$S) pub specificPubSecKeyFilename=%1$S (0x%2$S) pub-sec defaultPubKeyFilename=Geëxporteerde-publieke-sleutels defaultPubSecKeyFilename=Geëxporteerde-publieke-en-geheime-sleutels noSecretKeys=Geen geheime sleutels gevonden.\n\nWilt u uw eigen sleutel nu aanmaken? sendKeysOk=Sleutel(s) met succes verzonden sendKeysFailed=Verzenden van sleutels is mislukt receiveKeysOk=Sleutel(s) met succes bijgewerkt receiveKeysFailed=Downloaden van sleutels mislukt importFromClip=Wilt u de sleutel(s) van het klembord importeren? importFromUrl=Publieke sleutel van deze URL downloaden: copyToClipbrdFailed=Kopiëren van sleutels naar het klembord mislukt. copyToClipbrdOK=Sleutel(s) naar het klembord gekopieerd deleteSecretKey=WAARSCHUWING: u gaat een geheime sleutel verwijderen!\nAls u uw geheime sleutel verwijdert, kunt u geen versleutelde berichten voor die sleutel meer ontcijferen en u kunt u uw sleutel niet meer intrekken.\n\nWeet u zeker dat u zowel uw geheime als uw publieke sleutel ‘%S’ wilt verwijderen? deleteMix=WAARSCHUWING: je gaat geheime sleutels verwijderen!\nAls je je geheime sleutel verwijdert, kun je je berichten niet meer met die sleutel ontcijferen.\n\nWeet je zeker dat je BEIDE sleutels wilt verwijderen, zowel de geheime als de publieke sleutel? deletePubKey=Wilt u de publieke sleutel verwijderen?\n‘%S’ deleteSelectedPubKey=Wilt u de publieke sleutels verwijderen? deleteKeyFailed=De sleutel kon niet worden verwijderd. revokeKeyQuestion=U gaat de sleutel ‘%S’ intrekken.\n\nU zal niet meer kunnen ondertekenen met deze sleutel, en zodra verspreid, kunnen anderen deze niet meer voor het versleutelen gebruiken. U kunt deze sleutel nog wel gebruiken voor het ontcijferen van oude berichten.\n\nWilt u doorgaan? revokeKeyOk=De sleutel is ingetrokken. Als uw sleutel op een sleutelserver beschikbaar is, wordt aanbevolen de sleutel opnieuw te uploaden, zodat anderen de intrekking kunnen zien. revokeKeyFailed=De sleutel kon niet worden ingetrokken. revokeKeyNotPresent=U heeft geen sleutel (0x%S) die overeenkomt met dit intrekkingscertificaat!\n\nAls u uw sleutel bent kwijtgeraakt, moet u hem voor het intrekkingscertificaat importeren (bv. van een sleutelserver)! revokeKeyAlreadyRevoked=De sleutel 0x%S is al ingetrokken. refreshAllQuestion=U hebt geen sleutel geselecteerd. Wilt u ALLE sleutels verversen? refreshKeyServiceOn.warn=Waarschuwing: uw sleutels worden momenteel zo veilig mogelijk in de achtergrond ververst.\nAls u al uw sleutels tegelijk ververst, zal dit onnodig informatie over u onthullen.\nWilt u dit echt doen? refreshKey.warn=Waarschuwing: afhankelijk van het aantal sleutels en de verbindingssnelheid kan het verversen van alle sleutels een langduring proces zijn! downloadContactsKeys.warn=Let op: afhankelijk van het aantal contactpersonen en de verbindingssnelheid kan het downloaden van alle sleutels een langdurig proces zijn! downloadContactsKeys.importFrom=Contacten uit adresboek ‘%S’ importeren? keyMan.button.exportSecKey=&Geheime sleutels exporteren keyMan.button.exportPubKey=&Alleen publieke sleutels exporteren keyMan.button.import=&Importeren keyMan.button.refreshAll=Alle sleutels &verversen keyMan.button.revokeKey=&Sleutel intrekken keyMan.button.skip=Sleutel &overslaan keylist.noOtherUids=Heeft geen andere identiteiten keylist.hasOtherUids=Ook bekend als keylist.noPhotos=Geen foto beschikbaar keylist.hasPhotos=Foto’s keyMan.addphoto.filepicker.title=Selecteer foto om toe te voegen keyMan.addphoto.warnLargeFile=Het bestand dat u hebt gekozen, is groter dan 25 kB.\nHet toevoegen van grote bestanden wordt niet aanbevolen, omdat de sleutels anders erg groot kunnen worden. keyMan.addphoto.noJpegFile=Het geselecteerde bestand lijkt geen JPEG-bestand te zijn. Kies een ander bestand. keyMan.addphoto.failed=De foto kon niet worden toegevoegd. noWksIdentity=De sleutel %S heeft geen WKS-identiteit. keyman.addBlacklistKey.msg=Wilt u echt dat p≡p de sleutel ‘%1$S (%2$S)’ niet meer gebruikt voor het versleutelen van berichten? keyman.removeBlacklistKey.msg=Wilt u p≡p toestemming geven om sleutel ‘%1$S (%2$S)’ voor toekomstige berichten te gebruiken? keyman.addBlacklistKey.button=Sleutel op &zwarte lijst zetten keyman.removeBlacklistKey.button=Sleutel van &zwarte lijst verwijderen # Strings in enigmailManageUidDlg.xul changePrimUidFailed=Aanpassen van primaire gebruikers-ID mislukt changePrimUidOK=De primaire gebruikers-ID is met succes aangepast revokeUidFailed=Intrekken van gebruikers-ID %S mislukt revokeUidOK=Gebruikers-ID %S is met succes ingetrokken. Als uw sleutel op een sleutelserver beschikbaar is, wordt aanbevolen de sleutel opnieuw te uploaden, zodat anderen de intrekking kunnen zien. revokeUidQuestion=Wilt u de gebruikers-ID %S echt intrekken? # Strings in enigmailKeyImportInfo.xul importInfoTitle=GELUKT! Sleutels geïmporteerd importInfoBits=Bits importInfoCreated=Gemaakt importInfoFpr=Vingerafdruk importInfoDetails=(Details) importInfoNoKeys=Geen sleutels geïmporteerd. # Strings in enigmailKeyDetailsDlg.xul keyTypePublic=publieke sleutel keyTypePrimary=primaire sleutel keyTypeSubkey=subsleutel keyTypePair=sleutelpaar keyExpiryNever=nooit keyAlgorithm_1=RSA keyAlgorithm_2=RSA keyAlgorithm_3=RSA keyAlgorithm_16=ELG keyAlgorithm_17=DSA keyAlgorithm_18=ECC keyAlgorithm_19=ECC keyAlgorithm_20=ELG keyAlgorithm_22=EDDSA keyUsageEncrypt=Versleutelen keyUsageSign=Ondertekenen keyUsageCertify=Certificeren keyUsageAuthentication=Authenticatie keyDoesNotExpire=Sleutel vervalt niet # Strings in enigmailGenCardKey.xul keygen.started=Even geduld terwijl de sleutel aangemaakt wordt… keygen.completed=Sleutel aangemaakt. De nieuwe sleutel-ID is: 0x%S keygen.keyBackup=De back-up van de sleutel is opgeslagen als %S keygen.passRequired=Geef een wachtwoordzin op als u een back-up van uw sleutel buiten uw smartcard wilt bewaren. # Strings in enigmailSetCardPin.xul cardPin.processFailed=Wijzigen van pincode mislukt # Strings in enigRetrieveProgres.xul keyserverProgress.refreshing=Sleutels worden ververst, even geduld… keyserverProgress.uploading=Sleutels worden geüpload, even geduld… keyserverProgress.wksUploadFailed=Kon uw sleutel niet uploaden naar de Web Key Service keyserverProgress.wksUploadCompleted=Uw publieke sleutel werd met succes naar uw provider gestuurd. U zult een e-mail krijgen om te bevestigen dat u de upload hebt aangevraagd. keyserverTitle.refreshing=Sleutels verversen keyserverTitle.uploading=Sleutel uploaden # Strings in enigmailSetupWizard passphrase.min8keys=Uw wachtwoordzin moet minstens 8 tekens bevatten! setupWizard.reallyCancel=Weet u zeker dat u de installatiewizard van Enigmail wilt afsluiten? setupWizard.invalidGpg=Het bestand dat u hebt opgegeven, is geen GnuPG-programma. Kies een ander bestand. setupWizard.specifyFile=U moet minstens één publieke sleutel selecteren om te kunnen doorgaan. setupWizard.installFailed=Het lijkt erop dat de installatie is mislukt. Probeer de installatie opnieuw, of installeer GnuPG zelf en geef de plaats aan met de knop Bladeren. setupWizard.downloadForbidden=Voor uw eigen veiligheid downloaden we GnuPG niet. Bezoek https://gnupg.org/ om GnuPG te downloaden. setupWizard.downloadImpossible=We kunnen GnuPG op dit moment niet downloaden. Probeer het later opnieuw, of ga naar https://gnupg.org/ om GnuPG te downloaden. setupWizard.hashSumError=De wizard kon de integriteit van het gedownloade bestand niet controleren. Het bestand kan ongeldig of gemanipuleerd zijn. Wilt u toch doorgaan met de installatie? setupWizard.importSettingsFile=Geef reservekopiebestand op waarvan moet worden geladen setupWizard.invalidSettingsFile=Het opgegeven bestand is geen geldig reseverkopiebestand voor Enigmail-instellingen. setupWizard.gpgConfExists=Het GnuPG-configuratiebestand bestaat al. Wilt u dit overschrijven met dat uit uw oude installatie? setupWizard.noGpgHomeDir=U heeft %S gespecificeerd om voor GnuPG te gebruiken. Dit is echter geen map - u kunt het niet gebruiken. setupWizard.unmachtedIds=De volgende identiteiten van uw oude set-up konden niet worden gevonden.\n%S\nDe instellingen voor deze identiteiten zijn overgeslagen. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=Er is een fout opgetreden bij het downloaden van GnuPG. Controleer de console-uitvoer voor nadere details. installGnuPG.installFailed=Er is een fout opgetreden tijdens het installeren van GnuPG. Controleer de console-uitvoer voor nadere details. # Strings in enigmailAddUidDlg.xul addUidDlg.nameOrEmailError=U moet een naam en e-mailadres invullen addUidDlg.nameMinLengthError=De naam moet minstens 5 tekens bevatten addUidDlg.invalidEmailError=U moet een geldig e-mailadres opgeven # Strings in enigmailCardDetails.js Carddetails.NoASCII=OpenPGP-smartcards ondersteunen alleen ASCII-tekens in Voornaam/Achternaam. # network error types errorType.SecurityCertificate=Het door de webservice aangeboden beveiligingscertificaat is niet geldig. errorType.SecurityProtocol=Het door de webservice gebruikte beveiligingsprotocol is onbekend. errorType.Network=Er is een netwerkfout opgetreden. # filter stuff filter.folderRequired=U moet een doelmap kiezen. filter.decryptMove.label=Permanent ontcijferen filter.decryptCopy.label=Ontcijferde kopie aanmaken (Enigmail) filter.decryptMove.warnExperimental=Waarschuwing. ‘Permanent ontcijferen’ kan leiden tot beschadigde of kapotte berichten.\n\nHet wordt aanbevolen eerst ‘Ontcijferde kopie genereren’ te proberen, het resultaat zorgvuldig te testen, en alleen dan de permanente actie uit te voeren. filter.tempPepFilterDesc=Tijdelijk filter om verzonden bericht onversleuteld op te slaan filter.term.pgpencrypted.label=Versleuteld met OpenPGP filter.encrypt.label=Naar sleutel versleutelen (Enigmail) filter.keyRequired=U moet een sleutel van een ontvanger selecteren. filter.keyNotFound=Kon geen sleutel voor ‘%S’ vinden. filter.warn.keyNotSecret=Waarschuwing - de filteractie ‘Naar sleutel versleutelen’ vervangt de ontvangers.\n\nAls u geen geheime sleutel voor ‘%S’ heeft, kunt u de e-mailberichten niet meer lezen. # strings in enigmailConvert.jsm converter.decryptBody.failed=Kon bericht met het volgende onderwerp niet ontcijferen:\n‘%S’.\nWilt u het nogmaals proberen met een andere wachtwoordzin, of wilt u dit bericht overslaan? converter.decryptAtt.failed=Kon bijlage niet ontcijferen: ‘%1$S’\nvan bericht met onderwerp:\n‘%2$S’.\nWilt u het nogmaals proberen met een andere wachtwoordzin, of wilt u het bericht overslaan? saveLogFile.title=Logbestand opslaan # strings in gpg.jsm unknownSigningAlg=Onbekend ondertekeningsalgoritme (ID: %S) unknownHashAlg=Onbekende cryptografische hash (ID: %S) # strings in keyRing.jsm keyring.photo=Foto keyRing.pubKeyRevoked=De sleutel %1$S (sleutel-ID %2$S) is ingetrokken. keyRing.pubKeyExpired=De sleutel %1$S (sleutel-ID %2$S) is vervallen. keyRing.pubKeyNotForSigning=De sleutel %1$S (sleutel-ID %2$S) kan niet voor ondertekening worden gebruikt. keyRing.pubKeyNotForEncryption=De sleutel %1$S (sleutel-ID %2$S) kan niet voor ondertekening worden gebruikt. keyRing.keyDisabled=De sleutel %1$S (sleutel-ID %2$S) is uitgeschakeld, deze kan niet worden gebruikt. keyRing.keyNotTrusted=De sleutel %1$S (sleutel-ID %2$S) wordt niet voldoende vertrouwd. Stel het vertrouwensniveau van uw sleutel in op ‘maximaal’ om deze voor ondertekening te kunnen gebruiken. keyRing.keyInvalid=De sleutel %1$S (sleutel-ID %2$S) is ongeldig. Overweeg om deze correct te verifiëren, of gebruik ‘Handige versleutelingsinstellingen’. keyRing.signSubKeysRevoked=Alle subsleutels voor ondertekening van sleutel %1$S (sleutel-ID %2$S) zijn ingetrokken. keyRing.signSubKeysExpired=Alle subsleutels voor ondertekening van sleutel %1$S (sleutel-ID %2$S) zijn vervallen. keyRing.signSubKeysUnusable=Alle subsleutels voor ondertekening van sleutel %1$S (sleutel-ID %2$S) zijn ingetrokken, vervallen of anderszins onbruikbaar. keyRing.encSubKeysRevoked=Alle subsleutels voor versleuteling van sleutel %1$S (sleutel-ID %2$S) zijn ingetrokken. keyRing.encSubKeysExpired=Alle subsleutels voor versleuteling van sleutel %1$S (sleutel-ID %2$S) zijn vervallen. keyRing.noSecretKey=Het lijkt erop dat u niet de geheime sleutel van %1$S (sleutel-ID %2$S) in uw keyring hebt; u kunt deze sleutel niet gebruiken voor ondertekening. keyRing.encSubKeysUnusable=Alle subsleutels voor versleuteling van sleutel %1$S (sleutel-ID %2$S) zijn ingetrokken, vervallen of anderszins onbruikbaar. #strings in exportSettingsWizard.js cannotWriteToFile=Kan niet opslaan naar bestand ‘%S’. Kies een ander bestand. dataExportError=Er is een fout opgetreden tijdens het exporteren van uw gegevens. enigmailSettings=Enigmail-instellingen defaultBackupFileName=Enigmail-export specifyExportFile=Geef bestandsnaam op om te exporteren homedirParamNotSUpported=Extra parameters waarmee paden worden geconfigureerd, zoals --homedir en --keyring, worden niet ondersteund bij het exporteren/herstellen van uw instellingen. Gebruik andere manieren, zoals het instellen van de variabele GNUPGHOME. #strings in expiry.jsm expiry.keyExpiresSoon=Uw sleutel %1$S zal binnen %2$S dagen vervallen.\n\nHet wordt aanbevolen een nieuw sleutelpaar aan te maken en de overeenkomende accounts in te stellen om deze nieuwe sleutel te gebruiken. expiry.keysExpireSoon=De volgende sleutels zullen binnen %1$S dagen vervallen:\n%2$S Het wordt aanbevolen nieuwe sleutels aan te maken en de overeenkomstige accounts in te stellen om deze nieuwe sleutels te gebruiken. expiry.keyMissingOwnerTrust=Voor uw geheime sleutel %S is geen vertrouwen ingesteld.\n\nHet wordt aanbevolen om ‘U vertrouwt op certificeringen’ op maximaal in te stellen bij de eigenschappen van de sleutel. expiry.keysMissingOwnerTrust=Voor uw onderstaande geheime sleutels is geen vertrouwen ingesteld:\n%S.\nHet wordt aanbevolen om ‘U vertrouwt op certificeringen’ op maximaal in te stellen bij de eigenschappen van de sleutel. expiry.OpenKeyManager=Enigmail-sleutelbeheer openen expiry.OpenKeyProperties=Sleuteleigenschappen openen #strings in pEpDecrypt.jsm pEpDecrypt.cannotDecrypt=Dit is een versleuteld bericht. Helaas heeft u geen privésleutel waarmee u het bericht kunt ontcijferen. #strings in gpgAgent.jsm gpghomedir.notexists=De map ‘%S’ die uw OpenPGP-sleutels bevat bestaat niet en kan niet worden aangemaakt. gpghomedir.notwritable=De map ‘%S’ die uw OpenPGP-sleutels bevat, is niet schrijfbaar. gpghomedir.notdirectory=De map ‘%S’ die uw OpenPGP-sleutels bevat, is een bestand in plaats van een map. gpghomedir.notusable=Herstel de rechten van de map of wijzig de locatie van uw GnuPG-hoofdmap. GnuPG kan anders niet correct werken. #strings in pepTrustWords.js pepTrustWords.cannotVerifyOwnId=p≡p-vertrouwwoorden voor eigen account kunnen niet worden geverifieerd. pepTrustWords.cannotFindKey=Kan sleutel voor %S niet vinden. pepTrustWords.cannotStoreChange=Kon vertrouwen voor %S niet wijzigen. pepTrustWords.generalFailure=Kan vertrouwenswoorden voor %S niet verkrijgen. pepTrustWords.partnerFingerprint=Vingerafdruk voor %S: #strings in mimeWkdHandler.jsm wkdMessage.body.req=Uw e-mailprovider heeft uw verzoek om uw publieke sleutel naar de OpenPGP Web Key Directory te uploaden verwerkt.\n\nKlik de knop Bevestigen in de header van Enigmail om het publiceren van uw publieke sleutel af te ronden. wkdMessage.body.process=Dit is een e-mailbericht met betrekking tot de automatische verwerking van het uploaden van uw publieke sleutel op de OpenPGP Web Key Directory.\n\nU hoeft hier op dit moment geen handmatige actie op te ondernemen. #strings in pepHandshake.js pepPrivacyStatus.RatingBrokenSuggestion=U of de afzender moet het bericht opnieuw verzenden. pepPrivacyStatus.RatingHaveNoKeySuggestionOutgoing=Als u dit bericht het opgesteld, dan is uw sleutel niet beschikbaar. pepPrivacyStatus.RatingMistrustSuggestion=Herstel de verbinding met uw correspondent en probeer een andere handdruk te voltooien. pepPrivacyStatus.RatingReliableSuggestion=Voltooi een handdruk met uw correspondent door persoonlijk of via de telefoon vertrouwenswoorden uit te wisselen. Aan handdruk is slechts een keer per correspondent nodig en verzekert u van veilige en vertrouwde communicatie. pepPrivacyStatus.RatingTrustedSuggestion=Geen actie nodig! pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Let erop dat dit bericht misschien niet veilig is. pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Voeg de benodigde informatie toe. pepPrivacyStatus.RatingUnderAttackSuggestion=Controleer de inhoud van dit bericht afzonderlijk met uw correspondent. pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Zorg ervoor dat de privacystatus voor alle getoonde correspondenten tenminste veilig is. pepPrivacyStatus.RatingUnencryptedSuggestion=Vraag uw correspondent om een versleutelingsoplossing te gebruiken of om p≡p te installeren. pepPrivacyStatus.RatingUnreliableSuggestion=Dit bericht heeft geen betrouwbare versleuteling of handtekening. Vraag uw correspondent om zijn encryptiesoftware te upgraden of om p≡p te installeren. pepPrivacyStatus.RatingBrokenExplanation=Dit bericht heeft ongeldige versleuteling of opmaak. pepPrivacyStatus.RatingHaveNoKeyExplanation=Dit bericht kan niet ontcijferd worden, omdat de sleutel niet beschikbaar is. pepPrivacyStatus.RatingMistrustExplanation=Dit bericht heeft een correspondent die eerder als gewantrouwd is gemarkeerd. pepPrivacyStatus.RatingReliableExplanation=Dit bericht is veilig, maar u moet de identiteit van uw correspondent nog verifiëren. pepPrivacyStatus.RatingTrustedExplanation=Dit bericht is veilig en vertrouwd. pepPrivacyStatus.RatingUndefinedExplanation=Dit bericht bevat on voldoende informatie om te bepalen of het veilig is. pepPrivacyStatus.RatingUnderAttackExplanation=Dit bericht is niet veilig en er is mee geknoeid. pepPrivacyStatus.RatingUnencryptedExplanation=Dit bericht is onveilig. pepPrivacyStatus.RatingUnencryptedForSomeExplanation=Dit bericht is onveilig voor enkele correspondenten. pepPrivacyStatus.RatingUnreliableExplanation=Dit bericht heeft onbetrouwbare bescherming. pepPrivacyStatus.RatingBrokenText=Ongeldig pepPrivacyStatus.RatingHaveNoKeyText=Ontcijferen niet mogelijk pepPrivacyStatus.RatingMistrustText=Gewantrouwd pepPrivacyStatus.RatingReliableText=Veilig pepPrivacyStatus.RatingTrustedText=Veilig & vertrouwd pepPrivacyStatus.RatingUndefinedText=Onbekend pepPrivacyStatus.RatingUnderAttackText=Aangevallen pepPrivacyStatus.RatingUnencryptedForSomeText=Onveilig voor enkele ontvangers pepPrivacyStatus.RatingUnencryptedText=Onveilig pepPrivacyStatus.RatingUnreliableText=Onbetrouwbare beveiliging handshakeDlg.button.initHandshake=Handdruk… handshakeDlg.button.stopTrust=Stoppen met vertrouwen handshakeDlg.button.reTrust=Stop wantrouwen handshakeDlg.label.outgoingMessage=Uitgaand bericht handshakeDlg.label.incomingMessage=Inkomend bericht handshakeDlg.error.noPeers=Kan geen handshake uitvoeren zonder correspondenten. handshakeDlg.error.noProtection=Schakel beveiliging in om de handdrukfunctie te gebruiken. enigmail.acSetupPasswd.descEnterPasswd=Voer de instellingscode in die op het andere apparaat wordt getoond enigmail.acSetupPasswd.descCopyPasswd=Voer de hieronder vermelde instellingscode in op uw andere apparaat om verder te gaan met de installatie. #strings in autocrypt.jsm autocrypt.setupMsg.subject=Autocrypt-instellingsbericht autocrypt.setupMsg.msgBody=Volg de instructies die door uw nieuwe apparaat getoond worden, om Autocrypt op het nieuwe apparaat te configureren. autocrypt.setupMsg.fileTxt=Dit is het Autocrypt-instellingsbestand dat gebruikt wordt om uw instellingen en sleutels tussen clients uit te wisselen. U kunt het ontcijferen door middel van de instellingcode die op uw oude apparaat wordt getoond en vervolgens de sleutel in uw keyring importeren. #strings in upgradeInfo.html upgradeInfo.doctitle=Wat is er nieuw in Enigmail v2.0? upgradeInfo.welcome1=Welkom bij de nieuwe Enigmail versie 2.0! upgradeInfo.welcome2=De versie bevat veel nieuwe en gewijzigde functies. Neem even de tijd om te ontdekken wat er nieuw is: upgradeInfo.encSubject.title=Versleutelen van het onderwerp van het bericht upgradeInfo.encSubject.desc=We hebben een nieuwe manier ontwikkeld die het onderwerp van de e-mail naar het versleutelde bericht verplaatst en het zichtbare onderwerp vervangt door ‘Versleuteld bericht’. Als zo’n bericht ontsleuteld is, wordt het originele onderwerp automatisch vervangen. Het vervangen van het onderwerp staat standaard aan; er is een optie om dit uit te schakelen als u dit niet wilt. (Noot: voor deze optie is het noodzakelijk dat het bericht met PGP/MIME wordt verzonden.) upgradeInfo.buttons.title=Gewijzigd gedrag van de knoppen Versleutelen en Ondertekenen upgradeInfo.buttons.desc=De knoppen Versleutelen en Ondertekenen in het berichtopstelvenster werken nu zowel voor het OpenPGP- als het S/MIME-protocol. Als beide algoritmes mogelijk zijn, zal Enigmail proberen het protocol waarvoor alle sleutels beschikbaar zijn te prefereren. upgradeInfo.autocrypt.title=Ondersteuning voor Autocrypt upgradeInfo.autocrypt.desc=Enigmail ondersteunt nu Autocrypt, een nieuwe standaard om sleutels te verspreiden als onderdeel van verzonden berichten. Enigmail importeert sleutels van Autocrypt-compatibele berichten automatisch, zodat na verloop van tijd meer en meer berichten versleuteld kunnen worden. upgradeInfo.pEp.title=Nieuwe p≡p-juniormodus (Pretty Easy Privacy) upgradeInfo.pEp.desc=Enigmail heeft nu een p≡p-juniormodus. Momenteel moet u hiervoor handmatig p≡p installeren; dit zal in toekomstige versies veranderen. Met de p≡p-juniormodus kunt u OpenPGP-versleuteling zo transparant als mogelijk gebruiken; u hoeft zich niet meer te bekommeren om sleutelbeheer en het synchroniseren van sleutels tussen apparaten. upgradeInfo.bottom.desc=Bezoek onze documentatie voor hulp over het gebruik van Enigmail. pep.missingGnuPG=Om Enigmail/p≡p te gebruiken, is GunPG vereist. Omdat we het niet konden vinden, stellen wij voor het voor u te downloaden en installeren. #strings in enigmailAbout.html aboutEnigmail.tabName=Over Enigmail aboutEnigmail.title=OpenPGP-ondersteuning geleverd door Enigmail aboutEnigmail.team=Enigmail wordt ontwikkeld door het Enigmail-team: aboutEnigmail.projectLeader=Hoofdontwikkelaar: aboutEnigmail.usability=Bruikbaarheid: aboutEnigmail.documentation=Documentatie: aboutEnigmail.testing=Testen: aboutEnigmail.userSupport=Gebruikersondersteuning: aboutEnigmail.localization=Lokalisatie: Zie de pagina Enigmail taalpakketten aboutEnigmail.Credits=Credits: aboutEnigmail.origAuthor=Oorspronkelijke auteur van de Enigmail-extensie aboutEnigmail.icons=Pictogrammen: aboutEnigmail.formerMembers=Voormalige teamleden: aboutEnigmail.projectHosting=Projecthosting: aboutEnigmail.licenseSupportTitle=licentie & ondersteuning aboutEnigmail.license=Enigmail OpenPGP is opensource en gelicentieerd onder de %S aboutEnigmail.support=Ondersteuning en download is beschikbaar op www.enigmail.net. enigmail-2.0.8/lang/nl/help/000077500000000000000000000000001334302754500155765ustar00rootroot00000000000000enigmail-2.0.8/lang/nl/help/compose.html000066400000000000000000000105431334302754500201340ustar00rootroot00000000000000 Enigmail help: Opstellen van een bericht

Enigmail help

Enigmail gebruiken bij het opstellen van een bericht

Enigmail menu in het Mail/Opstellen venster
Onderteken bericht
Ondertekende mail verzenden in- of uitschakelen. De gebruiker wordt gewaarschuwd als het ondertekenen mislukt.
Versleutel bericht

Versleuteling voor alle ontvanger(s) in- of uitschakelen. De gebruiker wordt gewaarschuwd als de versleuteling mislukt.

Als Selectie tonen wanneer nodig ingesteld is in de Voorkeuren -> Sleutelselectie tab, dan zal er een lijst van sleutel getoond worden als er ontvangers in de lijst staan van wie u geen publieke sleutel hebt.

Als Toon nooit het PGP dialoogvenster voor sleutelselectie ingesteld is in de Voorkeuren -> Sleutelselectie tab, en er zijn adressen in de lijst met ontvangers van wie u geen publieke sleutel hebt, dan wordt de mail onversleuteld verstuurd.

Gebruik PGP/MIME voor dit bericht
Het gebruik van PGP/MIME voor dit bericht in- of uitschakelen.

Als u weet dat uw ontvanger mail kan lezen in het PGP/MIME formaat, dan gebruikt u dit best ook.

Deze mogelijkheid is afhankelijk van de instellingen in de Voorkeuren -> PGP/MIME tab. Deze moet ingesteld zijn op Sta het gebruik van PGP/MIME toe of Gebruik altijd PGP/MIME.

Standaardopties voor berichtcompositie
  • Ondertekening/versleuteling opties...: snelkoppeling naar de Accountinstellingen -> OpenPGP opties.
  • Verzenden opties...: snelkoppeling naar de Voorkeuren -> Verzend tab.
  • Sleutelselectie opties...: snelkoppeling naar de Voorkeuren -> Sleutelselectie tab.
  • PGP/MIME opties...: snelkoppeling naar de Voorkeuren -> PGP/MIME tab.
Versleuteling ongedaan maken

Als er een fout is bij het verzenden van de e-mail zoals wanneer de POP server de aanvraag niet accepteerd, zal Enigmail dit niet weten en het versleuteld bericht zal nog altijd getoond worden in het Opstelvenster. Bij het kiezen van dit menu-item wordt de versleuteling of ondertekening uit de mail verwijderd.

Deze optie kan ook gebruikt worden als een tijdelijke oplossing om de aangehaalde tekst in versleutelde berichten te ontcijferen bij het antwoorden. Enigmail zou het aangehaalde bericht automatisch moeten ontcijferen, maar als dat om één of andere reden mislukt, kan u dit menu-item gebruiken om het te forceren.

Publieke sleutel invoegen
Voegt een ASCII gewapende publieke sleutel in op de huidige cursorpositie in het Opstelvenster. U krijgt de vraag welk e-mailadres er gebruikt moet worden voor de in te voegen sleutel(s). Sleutels die op deze manier zijn ingevoegd, zullen automatisch herkend worden door Enigmail bij het ontvangen. Na sleutelinvoeging kan u nog steeds uw e-mail ondertekenen of versleutelen. Voeg niet meer dan één sleutelblok in in een bericht; specifieer gewoon meerdere e-mailadressen, gescheiden door komma's of spaties.
Vergeet opgeslagen wachtwoord
Verwijdert het opgeslagen wachtwoord. Dit is nuttig als u meerdere wachtwoorden gebruikt.
Help
Toont de helpinformatie van de website (deze pagina).

Verdere help kan u vinden op de Enigmail support website

enigmail-2.0.8/lang/nl/help/editRcptRule.html000066400000000000000000000126431334302754500211000ustar00rootroot00000000000000 Enigmail help: Bewerk PGP regels

Enigmail help

De Enigmail regeleditor gebruiken: PGP regels bewerken

In de Regeleditor kan u standaarden opgeven om versleuteling, ondertekening en PGP/MIME te gebruiken en om te definiëren welke OpenPGP sleutel(s) er gebruikt moeten worden. In dit dialoogvenster kan u de regels voor een enkele ontvanger opgeven en voor een groep van ontvangers met sterk vergelijkbare eigenschappen.

Stel PGP regels in voor
bevat de e-mailadressen van de ontvangers (zonder namen, d.w.z. enkel een adres zoals persoon@email.domain). U kan meerdere e-mailadressen opgeven, gescheiden door spaties. Het opgegeven e-mailadres kan bestaan uit enkel de domeinnaam zodat alle e-mailadressen van dit domein ermee overeenkomen. Bijvoorbeeld @email.domain zal overeenkomen met per@email.domain,soon@email.domain, persoon@email.domain, enz.
Pas regel toe als ontvanger ...
Dit past de vergelijking van de e-mailadressen aan. Als er meerdere e-mailadressen opgegeven zijn, zal de instelling betrekking hebben op alle e-mailadressen. De voorbeelden hieronder zijn gebaseerd op persoon@email.domain ingegeven in het PGP regels veld erboven.
  • Is exact met deze instelling heeft de regel enkel betrekking op e-mails naar persoon@email.domain (exact, niet hoofdlettergevoelig).
  • Bevat met deze instelling zal de regel toegepast worden op elk e-mailadres dat deze tekenreeks bevat. B.v. persoon@email.domain or soon@email.domain.net
  • Begint met met deze instelling wordt de regel toegepast op e-mailadressen die beginnen met de opgegeven tekenreeks. B.v. per@email.domain.net, per@email.domain-name.com.
  • Eindigt met met deze instelling wordt de regel toegpast op e-mailadressen die eindigen met de opgegeven tekenreeks. B.v. persoon@email.domain, soon@email.domain.
Ga verder met de volgende regel voor het overeenstemmende adres
Het inschakelen van deze functie staat u toe om een regel te definiëren zonder een KeyID in het Gebruik de volgende OpenPGP sleutel: veld, zodat het e-mailadres gebruikt wordt om de sleutel te controleren op het moment van verzenden. Verdere regels voor hetzelfde adres zullen ook uitgevoerd worden.
Controleer verdere regels voor het overeenstemmende adres niet
Het inschakelen van deze functie zorgt ervoor dat andere regels niet uitgevoerd worden als het adres met deze regel overeenstemd. Er wordt dus direct naar de volgende ontvanger overgeschakeld.
Gebruik de volgende OpenPGP sleutels
Gebruik de Selecteer sleutel(s).. knop om de sleutel van de ontvanger te kiezen die u wilt gebruiken voor versleuteling. Net zoals bij de bovenstaande actie zullen er geen verdere regels voor het overeenstemmende adres uitgevoerd worden.
Standaard voor ondertekening
Ondertekening in- of uitschakelen. Dit gebruikt of overschrijft datgene dat u opgegeven hebt in het berichtopstel venster. Mogelijke waarden zijn:
  • Nooit: ondertekening uitschakelen, zelf al is het ingeschakeld in het berichtopstelvenster (overschrijft de andere waarden)
  • Ja, als het geselecteerd is bij Berichtopstelling: laat ondertekening zoals opgegeven in het berichtopstelvenster
  • Altijd: ondertekening inschakelen, zelfs al is het niet ingeschakeld in het berichtopstelvenster
Deze ondertekeningsregels worden toegepast op alle regels die ermee overeenkomen. Als één van de regesl ondertekening uitschakeld, dan word het bericht niet ondertekend, ook al hebt u een regel die Altijd opgeeft bij ondertekening.
Versleuteling
berichtversleuteling in- of uitschakelen. De toegestane instellingen en hun betekening zijn dezelfde als voor berichtondertekening.
PGP/MIME
Het gebruik van PGP/MIME (RFC 3156) berichtencodering in- of uitschakelen. Als PGP/MIME uitgeschakeld is, worden de berichten met "inline PGP) ondertekend of versleuteld. De toegestane waarden en hun betekenis zijn dezelfde als deze voor berichtondertekening.

De regels worden uitgevoerd in de volgorde waarin ze weergegeven worden in de PGP regeleditor. Wanneer een regel overeenstemt met een ontvanger en een PGP sleutel ID bevat, met daarbij nog een opgegeven sleutel ID, dan wordt de ontvanger niet meer gecontroleerd bij het uitvoeren van verdere regels.


Verdere help is beschikbaar op de Enigmail per-ontvanger instellingen pagina

enigmail-2.0.8/lang/nl/help/initError.html000066400000000000000000000050401334302754500204400ustar00rootroot00000000000000 Enigmail help: Het oplossen van problemen met de OpenPGP initialisatie

OpenPGP Help

Het oplossen van problemen met de OpenPGP initialisatie

Er zijn verschillende oorzaken voor het mislukken van de OpenPGP initialisatie. De bekendsten worden hieronder beschreven; voor meer informatie kunt u de Enigmail help website bezoeken.

Kon GnuPG niet vinden

Voor een goede werking van OpenPGP moet de applicatie GnuPG geïnstalleerd zijn. Als GnuPG niet kan worden gevonden, moet u er eerst voor zorgen dat de applicatie gpg.exe (voor Windows; gpg voor andere platformen) op uw PC daadwerkelijk aanwezig is. Als GnuPG (gpg.exe of gpg) daadwerkelijk geïnstalleerd is, maar OpenPGP kan het toch niet vinden, moet u het pad naar GnuPG in de OpenPGP instellingen ingeven (Menu OpenPGP) > Voorkeuren).

Initialisatie van EnigMIME is mislukt

OpenPGP werkt alleen als deze in dezelfde ontwikkelomgeving als Thunderbird of SeaMonkey gecreëerd (gecompileerd) is. U kunt de officiële Enigmail samen met officiële versies van Thunderbird of SeaMonkey downloaden van mozilla.org.

Als u Thunderbird of SeaMonkey in een andere versie/variant van een andere bron download (bv. van een Linux distributie provider), of als u de applicatie zelf gecompileerd heeft, moet u ook een versie van Enigmail gebruiken die in dezelfde ontwikelomgeving gecompileerd is. Om Enigmail zelf te compileren moet u de instructies opvolgen op de Enigmail website in Gebied Source-Code. Gelieve geen eventuele foutmeldingen (bugs) over dit probleem te maken, omdat er daarvoor geen andere oplossing is.

Verdere hulp is beschikbaar op de Enigmail support website.

enigmail-2.0.8/lang/nl/help/messenger.html000066400000000000000000000104771334302754500204650ustar00rootroot00000000000000 Enigmail Help: Message Reading

Enigmail help

Enigmail gebruiken bij het lezen van berichten

Ontcijferknop in het hoofdvenster
Deze knop kan gebruikt worden voor verschillende doelen: ontcijferen, verifiëren of publieke sleutels importeren. Normaalgesproken gebeurt ontcijfering/verificatie automatisch, maar dit kan uitgeschakeld worden door middel van een instelling. Hoewel, als dit mislukt, wordt er een kort foutbericht weergegeven in de Enigmail statusregel. Als u op de Ontcijferknop klikt, zal u een meer gedetailleerd foutbericht zien, samen met de uitvoer van het GPG commando.
Pen- en sleuteliconen in de berichtkop
Het Pen en Sleutel icoon in de berichtkop toont of het bericht dat u aan het lezen bent ondertekend en/of versleuteld was en of de ondertekening goed is, d.w.z. als het bericht niet gewijzigd is sinds de ondertekening. Als het bericht toch gewijzigd is, zal het Pen icoon veranderen naar een Gebroken pen om aan te geven dat de ondertekening ongeldig is. Een rechtermuisklik op het Pen- of Sleutelicoon geeft een menu met de volgende opties:
  • OpenPGP beveiligingsinfo: staat u toe de outputstatus van GPG voor het bericht te bekijken.
  • Kopieer OpenPGP beveiligingsinfo: kopieert de output status van GPG naar het klembord; om in een antwoord te plakken, enz.
  • Bekijk PGP foto ID: staat u toe om het Foto ID van de persoon die u het bericht gezonden heeft te bekijken, als er natuurlijk een foto ingebed zit in de publieke sleutel. (Deze optie is enkel beschikbaar als er een Foto ID bestaat in de gebruikte sleutel.)
  • S/MIME beveilingsinfo: staat u toe om de S/MIME beveilingsinfo van het bericht te bekijken.

Als u keyserver-options auto-key-retrieve niet ingesteld hebt in uw gpg.conf bestand en u leest een bericht dat ondertekend of versleuteld is, dan zal u een Pen icoon in de hoofding zien met een Vraagteken er op. De Enigmail statusregel zal zeggen Gedeelte van het bericht getekend; klik op het pen icoon voor details en het bericht in het berichtvenster zal alle OpenPGP informatie, samen met de ondertekening tonen.

U kan dit ook zien als u keyserver-options auto-key-retrieve ingesteld hebt in uw gpg.conf bestand en als de OpenPGP key niet beschikbaar is op de standaard keyserver.

Een klik op het Pen en Vraagteken icoon zal een venster tonen met het bericht dat de sleutel niet in uw sleutelbos zit. Als u dan op OK klikt, krijgt u een ander venster met een lijst met publieke keyservers waaruit u kan kiezen om de publieke sleutel van de verzender te downloaden.

Ga naar Enigmail -> Voorkeuren -> Basis tab en geef het adres van de keyserver in in het Keyserver(s): vakje, gescheiden door een komma om een lijst van keyservers die u wilt gebruiken te configureren. De eerste keyserver uit de lijst zal als standaardserver gebruikt worden.

Versleutelde bijlagen openen / bijgevoegde OpenPGP sleutels importeren
Bijlagen met de extensie *.pgp, *.asc en *.gpg worden herkend door Enigmail en worden speciaal behandeld. Bij een rechtermuisklik op zo een bijlage krijg je twee speciale menu items in het contextmenu: Ontcijfer en open en Ontcijfer en sla op als.... Gebruik deze twee menu items als u wilt dat Enigmail de bijlage ontcijfert voor deze te openen of op te slaan. Als een bijlage herkend word als een OpenPGP sleutelbestand, krijg je de kans om de sleutels in je sleutelbos te importeren.

Verdere help is verkrijgbaar op de Enigmail Helppagina

enigmail-2.0.8/lang/nl/help/rulesEditor.html000066400000000000000000000064651334302754500210000ustar00rootroot00000000000000 Enigmail help: Regeleditor

Enigmail help

De regeleditor gebruiken

In de regeleditor kan u standaarden opgeven per ontvanger om versleuteling, ondertekening en PGP/MIME in- of uit te schakelen. U kan er ook OpenPGP sleutels definiëren. Elke regel bestaat uit 5 velden en wordt getoond op een enkele lijn:

E-mail
De e-mail(s) van de Aan:, Cc: and Bcc: velden om te controleren. De controle werkt op subreeksen (Verdere details kunnen gevonden worden in het Bewerk regel dialoogvenster).
PGP sleutel(s)
een lijst van PGP sleutel ID's om te gebruiken voor de ontvanger
Onderteken
berichtondertekening in- of uitschakelen. Dit gebruikt of overschrijft de instelling die u gebruikt in het berichtenopstelvenster. De waarden zijn:
  • Nooit: ondertekening uitschakelen, zelf al is het ingeschakeld in het berichtopstelvenster (overschrijft de andere waarden)
  • Mogelijk: laat ondertekening als opgegeven in het berichtopstelvenster
  • Altijd: ondertekening inschakelen, zelfs al is het niet ingeschakeld in het berichtopstelvenster

Deze ondertekeningsinstellingen worden toegepast op alle regels die ermee overeenstemmen. Als één van de regels ondertekening uitschakeld, zal het bericht niet ondertekend worden, ook al is er een regel die Altijd opgeeft.

Versleutel
berichtversleuteling in- of uitschakelen. De toegestane instellingen zijn dezelfde als voor berichtondertekening.
PGP/MIME
het gebruik van PGP/MIME (RFC 3156) in- of uitschakelen. Als PGP/MIME uitgeschakeld is, zullen de berichten versleuteld of ondertekend worden met "inline PGP". De toegestane waarden en hun betekenis zijn dezelfde als voor berichtondertekening.

De regels worden uitgevoerd in de volgorde waarin ze weergegeven worden in de PGP regeleditor. Wanneer een regel overeenstemt met een ontvanger en een PGP sleutel ID bevat, met daarbij nog een opgegeven sleutel ID, dan wordt de ontvanger niet meer gecontroleerd bij het uitvoeren van verdere regels.

Let op: De regeleditor is nog niet volledig. Het is mogelijk om meer geavanceerde regels te schrijven door het regelbestand direct te bewerken (deze regels zouden dan niet meer bewerkt mogen worden in de regeleditor). Verdere informatie voor het direct bewerken van het bestand is beschikbaar op de Enigmail homepage


Verdere help is beschikbaar op de Enigmail support website

enigmail-2.0.8/lang/nl/help/sendingPrefs.html000066400000000000000000000055451334302754500211240ustar00rootroot00000000000000 Enigmail help: OpenPGP regel bewerken

Enigmail help

Voorkeuren instellen om versleutelde e-mail te versturen

Bij de Verzenden voorkeuren kunt u het algemene model en de voorkeuren voor versleuteling kiezen.

Handige versleuteling
Met deze instellingen worden e-mails zonder bevestiging versleuteld, indien mogelijk.

Deze instelling is geschikt als u uw privacy wilt vergroten door versleutelde e-mails te versturen in plaats van onversleutelde e-mails als dat mogelijk is.

Het effect is alsof u vrieven stuurt in plaats van ansichtkaarten. In tegenstelling tot bij ansichtkaarten, kunnen brieven normaal gesproken niet gelezen worden tijdens het transport.

Het is echter net als bij brieven niet zeker, dat niemand de brief tijdens het transport opent (hoewel daar wel technische inspanning voor nodig is).

Een concreet risico is dat u per ongeluk ‘vervalste sleutels’ gebruikt, die u van iemand heeft gekregen die beweert dat de sleutel eigendom is van de persoon die u wilt e-mailen. Om dit risico te voorkomen kunt u ofwel het vertrouwensmodel van OpenPGP gebruiken (zie onder) of u moet altijd controleren of de vingerafdruk van de publieke sleutel juist is.

Handmatige versleuteling
Met deze instellingen kunt u de verschillende voorkeuren voor versleuteling handmatig aan uw behoefte aanpassen. U kunt opgeven:
  • of antwoorden op versleutelde/ondertekende e-mails ook automatisch versleuteld/ondertekend moeten worden;
  • of u het vertrouwensmodel van OpenPGP wilt gebruiken om sleutels te accepteren (dit betekent dat u om een sleutel te kunnen gebruiken, u deze sleutel moet ondertekenen, of dat er genoeg andere personen zijn die u vertrouwt die de sleutel ondertekend hebben);
  • of u automatisch alle e-mails versleuteld wilt versturen als alle sleutels geaccepteerd zijn;
  • of en wanneer u eindelijk wilt bevestigen dat u een e-mail wilt versturen.
Als u het belangrijk vindt dat inhoud die u versleutelt niet door andere personen of organisaties gelezen kan worden, dan dient u de handmatige instellingen te kiezen en op zijn minst de optie te selecteren om alleen sleutels te accepteren als u of andere mensen ze ondertekend hebben. Hoewel dit model het risico op vervalste sleutels vermindert, moet u wel actief sleutels ondertekenen en het eigenaarsvertrouwen aangeven via sleutelbeheer. enigmail-2.0.8/lang/pl/000077500000000000000000000000001334302754500146505ustar00rootroot00000000000000enigmail-2.0.8/lang/pl/am-enigprefs.properties000066400000000000000000000001101334302754500213330ustar00rootroot00000000000000# Strings used in the Mozill AccountManager prefPanel-enigprefs=OpenPGP enigmail-2.0.8/lang/pl/enigmail.dtd000066400000000000000000001542551334302754500171460ustar00rootroot00000000000000 Mozilla Public License 2.0."> "Transfer kluczy Autocrypt" wymaga, aby klient poczty e-mail na drugim urzÄ…dzeniu byÅ‚ zgodny z Autocrypt. Chociaż jest to Å‚atwiejsze rozwiÄ…zanie, tylko kilka aplikacji obsÅ‚uguje ten standard. Innym sposobem jest "Utworzenie i przywrócenie kopii zapasowej" swoich ustawieÅ„. Spowoduje to utworzenie pliku ZIP zawierajÄ…cego wszystkie wymagane informacje i klucze, które można skopiować na nowe urzÄ…dzenie. Enigmail może bezpoÅ›rednio zaimportować te ustawienia; w przypadku innych klientów poczty e-mail plik ZIP można rozpakować i obsÅ‚użyć rÄ™cznie."> "> do oznaczania adresów e-mail dla GnuPG. Wyłącz tÄ™ funkcjÄ™, jeżeli adresaci posiadajÄ… stare klucze Hushmail."> Konfiguracja kont -> OpenPGP)."> Uwaga! Tworzenie klucza może potrwać kilka minut. Nie zamykaj programu w trakcie dziaÅ‚ania generatora. Aktywne używanie przeglÄ…darki lub wykonywanie intensywnych operacji dyskowych podczas tworzenia klucza przyspieszy proces. Koniec procesu zostanie zasygnalizowany odpowiednim komunikatem."> †jest nieprawidÅ‚owy"> Uwaga! Generowanie klucza może potrwać kilka minut. Nie zamykaj programu w trakcie dziaÅ‚ania generatora. Koniec procesu zostanie zasygnalizowany odpowiednim komunikatem."> Uwaga! Enigmail bÄ™dzie zawsze weryfikować podpisy w wiadomoÅ›ciach dla wszystkich tożsamoÅ›ci i kont, niezależnie od tego czy obsÅ‚uga Enigmail jest włączona, czy nie"> DziÄ™kujemy za wybór Enigmail Enigmail!"> enigmail-2.0.8/lang/pl/enigmail.properties000066400000000000000000001544401334302754500205630ustar00rootroot00000000000000Enigmail=Enigmail ##################################################################### # Strings used within enigmailCommon.js and enigmailCommon.jsm ##################################################################### enigAlert=Ostrzeżenie Enigmail enigConfirm=Potwierdzenie Enigmail # enigInfo=Enigmail Information enigError=Błąd Enigmail enigPrompt=Wprowadź dane Enigmail dlgYes=&Tak dlgNo=&Nie dlgKeepSetting=ZapamiÄ™taj mój wybór i nie wyÅ›wietlaj ponownie dlgNoPrompt=Nie wyÅ›wietlaj wiÄ™cej tego okna dlg.button.delete=&UsuÅ„ dlg.button.cancel=&Anuluj dlg.button.close=&Zamknij dlg.button.continue=&Kontynuuj dlg.button.skip=&PomiÅ„ dlg.button.overwrite=Przepisać dlg.button.view=Po&dglÄ…d dlg.button.retry=Znowu dlg.button.ignore=&Ignorować # dlg.button.install=&Install # dlg.button.ok=&OK repeatPrefix=\n\nTo ostrzeżenie bÄ™dzie powtórzone %S repeatSuffixSingular=raz. repeatSuffixPlural=razy. noRepeat=\n\nTo ostrzeżenie nie pojawi siÄ™ dopóki nie zaktualizujesz Enigmail. pgpNotSupported=WyglÄ…da na to, że używasz Enigmail razem z PGP 6.x\n\nNiestety, PGP 6.x ma dużo wÅ‚aÅ›ciwoÅ›ci, które powodujÄ… niepoprawne dziaÅ‚anie Enigmail. Dlatego też, PGP 6.x nie bÄ™dzie dÅ‚użej obsÅ‚ugiwane. Zamiast tego zalecane jest zainstalowanie GnuPG (GPG).\n\nJeżeli potrzebujesz pomocy przy instalacji GnuPG, sprawdź sekcjÄ™ „Pomoc†na stronie domowej Enigmail. # initErr.howToFixIt=In order to use Enigmail, GnuPG is required. If you did not install GnuPG yet, the easiest way to do this is using the "Setup Wizard" button below. initErr.setupWizard.button=Kreator Konfiguracji passphraseCleared=Szyfr zostaÅ‚ usuniÄ™ty z pamiÄ™ci. # cannotClearPassphrase=You are using a non-standard tool (such as gnome-keyring) for passphrase handling. Clearing the passphrase is therefore not possible from within Enigmail. noPhotoAvailable=Brak zdjÄ™cia debugLog.title=Dziennik zdarzeÅ„ debugowania Enigmail error.photoPathNotReadable=Nie można odczytać Å›cieżki „%S†# generalError=Error: %S # Strings in configure.jsm enigmailCommon.versionSignificantlyChanged=Ta wersja Enigmail wprowadza istotne zmiany w obsÅ‚udze preferencji i opcji. DoÅ‚ożyliÅ›my wszelkich staraÅ„, aby przenieść ustawienia z poprzednich wersji do aktualnej, tam gdzie byÅ‚o to możliwe. Prosimy o dokÅ‚adne sprawdzenie nowych preferencji i opcji. enigmailCommon.checkPreferences=Sprawdź preferencje... # preferences.defaultToPgpMime=We have changed the default message encoding in Enigmail from Inline-PGP to PGP/MIME. We recommend you keep this as default.\n\nIf you still wish to use Inline-PGP by default, you can do so in the Account Settings under OpenPGP Security. ##################################################################### # Strings in enigmailAbout.js ##################################################################### usingVersion=Uruchomiono Enigmail, wersja %S # enigmailPepVersion=Enigmail/p≡p version %S usingAgent=Szyfrowanie i weryfikacja programem %S: %S agentError=Błąd! Nie można uzyskać dostÄ™pu do usÅ‚ugi Enigmime! ##################################################################### # Strings in enigmailKeygen.js ##################################################################### accessError=WystÄ…piÅ‚ błąd podczas próby uzyskania dostÄ™pu do usÅ‚ugi Enigmail onlyGPG=Tworzenie kluczy dziaÅ‚a tylko z GnuPG (nie dziaÅ‚a z PGP)! keygenComplete=ZakoÅ„czono tworzenie klucza!\nTożsamość <%S> bÄ™dzie używana do podpisywania. revokeCertRecommended=Zaleca siÄ™ utworzenie certyfikatu unieważnienia dla tego klucza. Certyfikat ten posÅ‚uży do unieważnienia klucza, np. jeżeli zaginie klucz prywatny lub zostanie on wykradziony. Czy utworzyć teraz taki certyfikat? keyMan.button.generateCert=&Utwórz certyfikat genCompleteNoSign=ZakoÅ„czono tworzenie klucza! genGoing=Trwa tworzenie klucza…! passNoMatch=Wprowadzone szyfry sÄ… niezgodne – wprowadź ponownie passCheckBox=ProszÄ™ zaznaczyć pole, jeÅ›li nie podano szyfru do klucza passUserName=Podaj nazwÄ™ użytkownika dla tej tożsamoÅ›ci # keygen.missingUserName=There is no name specified for the selected account/identity. Please enter a value in the field "Your name" in the account settings. # keygen.passCharProblem=You are using special characters in your passphrase. Unfortunately, this can cause troubles for other applications. We recommend you choose a passphrase consisting only of any of these characters:\na-z A-Z 0-9 /.;:-,!?(){}[]%* passSpaceProblem=Z powodów technicznych szyfr nie może zaczynać siÄ™ lub koÅ„czyć spacjÄ…. changePassFailed=Nie udaÅ‚o siÄ™ zmienić szyfru. keyConfirm=Utworzyć klucz publiczny i prywatny dla „%Sâ€? keyMan.button.generateKey=&Utwórz klucz keyAbort=Czy przerwać tworzenie klucza? keyMan.button.generateKeyAbort=&Przerwij tworzenie klucza keyMan.button.generateKeyContinue=&Kontynuuj tworzenie klucza expiryTooLong=Nie można tworzyć kluczy ważnych dÅ‚użej niż 100 lat. expiryTooLongShorter=Nie można tworzyć kluczy, których okres ważnoÅ›ci jest dÅ‚uższy niż 90 lat. expiryTooShort=Klucz musi być ważny przynajmniej jeden dzieÅ„. keyGenFailed=Nie udaÅ‚o siÄ™ utworzyć klucza. Szczegóły wykonywanej operacji można znaleźć w konsoli Enigmail (menu Enigmail -> Debugowanie Enigmail). setKeyExpirationDateFailed=Data wygaÅ›niÄ™cia nie mogÅ‚a zostać zmieniona # Strings in enigmailMessengerOverlay.js securityInfo=Informacja Enigmail\n\n enigHeader=Enigmail: enigContentNote=Enigmail: *Załączniki do tej wiadomoÅ›ci nie zostaÅ‚y podpisane ani zaszyfrowane*\n\n possiblyPgpMime=Wiadomość prawdopodobnie podpisana/zaszyfrowana za pomocÄ… PGP/MIME – naciÅ›nij przycisk Odszyfruj/Weryfikuj, aby to sprawdzić saveAttachmentHeader=Enigmail: Zapisz odszyfrowany załącznik noTempDir=Nie można znaleźć katalogu plików tymczasowych.\nProszÄ™ ustawić odpowiedniÄ… Å›cieżkÄ™ jako wartość zmiennej systemowej TEMP. attachmentPgpKey=Otwierany załącznik „%S†jest plikiem klucza OpenPGP.\n\nNaciÅ›nij przycisk „Importâ€, aby zaimportować zawarty w nim klucz lub „PodglÄ…dâ€, aby wyÅ›wietlić zawartość w oknie przeglÄ…darki. beginPgpPart=********* *POCZATEK CZESCI SZYFROWANEJ / PODPISANEJ* ********* endPgpPart=********** *KONIEC CZESCI SZYFROWANEJ / PODPISANEJ* ********** notePartEncrypted=Enigmail: *Niektóre fragmenty wiadomoÅ›ci NIE zostaÅ‚y podpisane lub zaszyfrowane* noteCutMessage=Enigmail: *Znaleziono bloki wielu wiadomoÅ›ci – przerwano odszyfrowanie/weryfikacjÄ™* decryptOkNoSig=Uwaga!\n\nWiadomość zostaÅ‚a odszyfrowana, ale nie można prawidÅ‚owo zweryfikować podpisu. msgOvl.button.contAnyway=Czy chcesz &kontynuować? signature.verifiedOK=Podpis załącznika %S zostaÅ‚ pomyÅ›lnie zweryfikowany signature.verifyFailed=Nie można zweryfikować podpisu załącznika %S attachment.noMatchToSignature=Nie można dopasować załącznika %S do pliku podpisu attachment.noMatchFromSignature=Nie można dopasować pliku podpisu %S do załącznika fixBrokenExchangeMsg.failed=Nie uda siÄ™ naprawić wiadomość. # enigmail.msgViewColumn.label=Enigmail # enigmailPep.msgViewColumn.label=Enigmail/p≡p # wksNoIdentity=This key is not linked to any of your email accounts. Please add an account for at least one of the following email addresse(s):\n\n%S # wksConfirmSuccess=Confirmation email sent. # wksConfirmFailure=Sending the confirmation email failed. # autocrypt.importSetupKey.accountPreconfigured=Your account is already correctly configured for Autocrypt.\n\nDo you really want to overwrite your settings with this setup message? # autocrypt.importSetupKey.selfCreated=This message was created by your currently running instance of Enigmail.\n\nPlease switch to the email client to which you want to transfer the settings, and click on the message on that email client to import the settings. # autocrypt.importSetupKey.invalidMessage=Error - could not read setup message. The message seems to be corrupted. Please try to create a new setup message on your "other" device. # autocrypt.importSetupKey.invalidKey=Error - the key could not be imported. The key is either not supported by your version of GnuPG, or it got corrupted. # autocrypt.importSetupKey.wrongPasswd=The password you entered is wrong. Do you want to retry? # autocrypt.importSetupKey.success=The Autocrypt setup message was processed successfully. Autocrypt is now available for your account '%S'. ##################################################################### # Strings in enigmailMsgComposeOverlay.js ##################################################################### keysToExport=Wybierz klucze OpenPGP do wstawienia keysToUse=Wybierz klucze OpenPGP używane dla %S pubKey=Klucz publiczny dla %S\n windowLocked=Okno tworzenia wiadomoÅ›ci jest zablokowane – wysyÅ‚anie anulowane sendUnencrypted=Nie udaÅ‚o siÄ™ zainicjować Enigmail.\nWysÅ‚ać niezaszyfrowanÄ… wiadomość? composeSpecifyEmail=Wybierz swój adres e-mail, wedÅ‚ug którego wybierany bÄ™dzie klucz do podpisywania wysyÅ‚anych wiadomoÅ›ci.\n Jeżeli zostawisz to pole niewypeÅ‚nione, zostanie użyty adres z pola OD: wysyÅ‚anej wiadomoÅ›ci. sendingHiddenRcpt=Ta wiadomość zawiera adresy w polu Ukryta kopia. Jeżeli wiadomość jest szyfrowana, możliwe jest ukrycie odbiorców ukrytej kopii, ale użytkownicy niektórych produktów, np. PGP Corp. nie bÄ™dÄ… mogli odszyfrować takiej wiadomoÅ›ci. Z tego powodu zaleca siÄ™ nie korzystać z pól Ukryta kopia w szyfrowanych wiadomoÅ›ciach. sendWithHiddenBcc=Ukryj odbiorców ukrytej kopii sendWithShownBcc=Zaszyfruj normalnie sendingNews=Operacja wysyÅ‚ania szyfrowanej wiadomoÅ›ci zostaÅ‚a przerwana.\n\nWiadomoÅ›ci tej nie można zaszyfrować, ponieważ na liÅ›cie odbiorców jest grupa dyskusyjna. Należy ponownie wysyÅ‚ać wiadomość bez szyfrowania. sendToNewsWarning=Uwaga. WysyÅ‚asz zaszyfrowanÄ… wiadomość na adres grupy dyskusyjnej.\n\nOdradzamy takie dziaÅ‚anie, ponieważ ma ono sens tylko wtedy, gdy wszyscy użytkownicy grupy mogÄ… odszyfrować takÄ… wiadomość, tzn. wiadomość taka musiaÅ‚aby być zaszyfrowana kluczami wszystkich użytkowników grupy. WyÅ›lij wiadomość tylko, jeżeli wiesz dokÅ‚adnie co robisz.\n\nKontynuować? hasHTML=Ostrzeżenie o wiadomoÅ›ci w formacie HTML:\nTa wiadomość może zawierać kod HTML, co może uniemożliwić podpisanie/szyfrowanie wiadomoÅ›ci. Aby zapobiec temu w przyszÅ‚oÅ›ci, wciÅ›nij klawisz SHIFT, gdy naciskasz przycisk komponowania/odpowiedzi, żeby wysyÅ‚ać podpisane wiadomoÅ›ci.\nJeżeli domyÅ›lnie wysyÅ‚asz podpisane wiadomoÅ›ci, należy w ustawieniach odznaczyć funkcjÄ™ „Podczas tworzenia wiadomoÅ›ci używaj edytora HTMLâ€, aby na staÅ‚e wyłączyć wiadomoÅ›ci HTML dla tego konta pocztowego. strippingHTML="Wiadomość zawiera informacjÄ™ o formatowaniu w HTML, która zostanie utracona po konwersji do zwykÅ‚ego tekstu przy podpisywaniu/szyfrowaniu. Czy chcesz kontynuować? msgCompose.button.sendAnyway=&WyÅ›lij wiadomość attachWarning=Załączniki do tej wiadomoÅ›ci nie sÄ… zapisane lokalnie i nie mogÄ… być zaszyfrowane. Aby je zaszyfrować, należy zapisać załączniki jako pliki lokalne i nastÄ™pnie dołączyć do wiadomoÅ›ci. Czy na pewno wysÅ‚ać wiadomość? quotedPrintableWarn=Włączono kodowanie „quoted-printable†dla wysyÅ‚anych wiadomoÅ›ci. Może to spowodować nieprawidÅ‚owe odszyfrowanie lub weryfikacjÄ™ wiadomoÅ›ci.\nCzy wyłączyć to kodowanie? minimalLineWrapping=Ustawiono zawijanie wierszy dÅ‚uższych niż %S znaków. Aby poprawnie szyfrować lub podpisywać wiadomoÅ›ci, ta wartość musi wynosić co najmniej 68.\nCzy ustawić zawijanie wiersza powyżej 68 znaków? warning=Uwaga signIconClicked=Zmieniono rÄ™cznie opcje podpisywania. Dlatego też, podczas komponowania tej wiadomoÅ›ci dezaktywacja/aktywacja podpisywania nie zależy od dezaktywacji/aktywacji szyfrowania. # errorOwnKeyUnusable=The key ID '%S' configured for the current identity does not yield a usable OpenPGP key.\n\nPlease ensure that you have a valid, not expired OpenPGP key and that your account settings point to that key.\nIf your key is not expired, then check if you did set Owner trust to full or ultimate. msgCompose.cannotSaveDraft=Błąd podczas zapisywania projektu # msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information - partially encrypted email. # msgCompose.partiallyEncrypted.mimeMsg=The message you are replying to contained both unencrypted and encrypted parts. Some encrypted message parts are invisible to you.\n\nIf the sender was not able to decrypt the hidden message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nWe recommend that you don't reply to the message, but create a new message containing your answer. # msgCompose.partiallyEncrypted.inlinePGP=The message you are replying to contained both unencrypted and encrypted parts. If the sender was not able to decrypt some message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nPlease consider removing all quoted text from your reply to this sender. msgCompose.internalEncryptionError=Błąd wewnÄ™trzny: obiecaÅ‚ szyfrowanie wyłączone msgCompose.internalError=WystÄ…piÅ‚ błąd wewnÄ™trzny. msgCompose.toolbarTxt.signAndEncrypt=Ta wiadomość zostanie podpisana i zaszyfrowana msgCompose.toolbarTxt.signOnly=Ten komunikat zostanie podpisana msgCompose.toolbarTxt.encryptOnly=Ten komunikat zostanie zaszyfrowana msgCompose.toolbarTxt.noEncryption=Ten komunikat bÄ™dzie niepodpisane i nieszyfrowane msgCompose.toolbarTxt.disabled=Enigmail jest wyłączona dla wybranej tożsamoÅ›ci # msgCompose.protectSubject.tooltip=Protect the message subject # msgCompose.noSubjectProtection.tooltip=Do not protect the message subject msgCompose.encryptedSubjectStub=ZaszyfrowanÄ… Wiadomość # msgCompose.protectSubject.dialogTitle=Enable Protection of Subject? # msgCompose.protectSubject.question=Regular encrypted emails contain the unredacted subject.\n\nWe have established a standard to hide the original subject in the encrypted message\nand replace it with a dummy text, such that the subject is only visible after the email is decrypted.\n\nDo you want to protect the subject in encrypted messages? # msgCompose.protectSubject.yesButton=&Protect subject # msgCompose.protectSubject.noButton=&Leave subject unprotected msgCompose.detailsButton.label=Detale ... msgCompose.detailsButton.accessKey=D # msgCompose.pepSendUnknown=Unknown # msgCompose.pepSendUnsecure=Unsecure # msgCompose.pepSendSecure=Secure # msgCompose.pepSendTrusted=Secure & Trusted # pep.alert.disabledForIdentity=p≡p is disabled for the current identity. Please enable p≡p via the Enigmail/p≡p preferences. # pep.alert.weakReply=You’re about to forward or reply to a secure message as insecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? # note: should end with double newline: sendAborted=Operacja wysyÅ‚ania zostaa anulowana.\n\n # details: keyNotTrusted=Za maÅ‚o zaufania dla klucza '%S' keyNotFound=Klucz '%S' nie znaleziono keyRevoked=Klucz '%S' odwoÅ‚ane keyExpired=Klucz '%S' upÅ‚ynÄ…Å‚ statPGPMIME=PGP/MIME # statSMIME=S/MIME statSigned=PODPISANÄ„ statEncrypted=ZASZYFROWANÄ„ statPlain=NIEPODPISANÄ„ i NIEZASZYFROWANÄ„ offlineSave=Zapisać wiadomość %S do %S w folderze „NiewysÅ‚aneâ€? onlineSend=WysÅ‚ać wiadomość %S do %S? encryptKeysNote=Informacja. Wiadomość zaszyfrowana za pomocÄ… nastÄ™pujÄ…cego ID użytkownika/klucza: %S hiddenKey= signFailed=Błąd w Enigmail! Szyfrowanie/podpisanie siÄ™ nie powiodÅ‚o. WysÅ‚ać wiadomość bez szyfrowania/podpisu? msgCompose.button.sendUnencrypted=&WyÅ›lij niezaszyfrowanÄ… wiadomość recipientsSelectionHdr=Wybierz odbiorców do szyfrowania configureNow=Nie włączono jeszcze zabezpieczeÅ„ Enigmail dla tej tożsamoÅ›ci. Czy chcesz to zrobić teraz? # encryption/signing status and associated reasons: encryptMessageAuto=Szyfrowanie wiadomoÅ›ci (automatyczny) encryptMessageNorm=Szyfrowanie WiadomoÅ›ci signMessageAuto=Znak Wiadomość (automatyczny) signMessageNorm=Znak Wiadomość encryptOff=Szyfrowanie: OFF encryptOnWithReason=Szyfrowanie: ON (%S) encryptOffWithReason=Szyfrowanie: OFF (%S) encryptOn=Szyfrowanie: ON signOn=Podpisanie: ON signOff=Podpisanie: OFF signOnWithReason=Podpisanie: ON (%S) signOffWithReason=Podpisanie: OFF (%S) reasonEnabledByDefault=domyÅ›lnie włączone reasonManuallyForced=rÄ™cznie zmuszony reasonByRecipientRules=wymuszone przez przepisy otrzymujÄ…cych reasonByAutoEncryption=zmuszony przez szyfrowanie automatyczny reasonByConflict=z powodu konfliktu w przepisach otrzymujÄ…cych reasonByEncryptionMode=ze wzglÄ™du na tryb szyfrowania # should not be used anymore: encryptYes=Wiadomość zostanie zaszyfrowana encryptNo=Wiadomość nie zostanie zaszyfrowana # should not be used anymore: signYes=Wiadomość zostanie podpisana signNo=Wiadomość nie zostanie podpisana # PGP/MIME status: pgpmimeNormal=Protokół: PGP/MIME inlinePGPNormal=Protokół: PGP Inline # smimeNormal=Protocol: S/MIME pgpmimeAuto=Protokół: PGP/MIME (automatyczny) inlinePGPAuto=Protokół: PGP Inline (automatyczny) # smimeAuto=Protocol: S/MIME (auto) # should not be used anymore pgpmimeYes=Zostanie użyte PGP/MIME pgpmimeNo=Zostanie użyte PGP/Inline # Attach own key status (tooltip strings): attachOwnKeyNo=Twój wÅ‚asny klucz nie zostanie dołączony attachOwnKeyYes=WÅ‚asny klucz zostanie dołączony # attachOwnKeyDisabled=Your own key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. rulesConflict=Wykryto kolizjÄ™ reguÅ‚ Enigmail dla odbiorcy\n%S\n\nCzy wysÅ‚ać wiadomość z tymi ustawieniami? msgCompose.button.configure=&Konfiguruj msgCompose.button.send=&WyÅ›lij wiadomość msgCompose.button.save=&Zapisz wiadomość # Strings in enigmailMsgHdrViewOverlay.js keyNeeded=Wymagany jest klucz publiczny %S, aby zweryfikować podpis keyUsed=Klucz publiczny %S sÅ‚uży do weryfikacji podpisu clickDecrypt=; naciÅ›nij przycisk Odszyfruj clickDecryptRetry=; naciÅ›nij przycisk Odszyfruj, aby ponowić próbÄ™ clickDetailsButton=; kliknij na przycisk 'Detale', aby uzyskać wiÄ™cej informacji # clickImportButton=; click on the 'Import Key' button to import the key # keyTypeUnsupported=; the key type is not supported by your version of GnuPG msgPart=Część wiadomoÅ›ci %S msgSigned=podpisana msgSignedUnkownKey=podpisana nieznanym kluczem msgEncrypted=zaszyfrowana msgSignedAndEnc=podpisana i zaszyfrowana unverifiedSig=Podpis bez weryfikacji incompleteDecrypt=Odszyfrowanie nie zostaÅ‚o zakoÅ„czone needKey=Błąd – potrzebny klucz, aby odszyfrować wiadomość failedDecrypt=Błąd – nie powiodÅ‚o siÄ™ odszyfrowanie badPhrase=Błąd – nieprawidÅ‚owy szyfr failedDecryptVerify=Błąd – nie powiodÅ‚o siÄ™ odszyfrowanie/weryfikacja mdcError=Błąd – wiadomość nie byÅ‚a zabezpieczona przed manipulacjÄ… viewInfo=; Widok » Informacje o zabezpieczeniach wiadomoÅ›ci, aby zobaczyć szczegóły decryptedMsg=Odszyfrowana wiadomość decryptedMsgWithFormatError=Rozszyfrowana wiadomość (formatowanie uszkodzone prawdopodobnie przez serwer Exchange, wiadomość może być trudna do odczytania). usedAlgorithms=Używane Algorytmy: %S i %S # pepStatusInfo.text=p≡p Message Status. # pepStatusInfo.title.m3=Under Attack # pepStatusInfo.info.m3=This message is not secure and has been tampered with. # pepStatusInfo.title.m1=Mistrusted # pepStatusInfo.info.m1=This message has a communication partner that has previously been marked as mistrusted # pepStatusInfo.title.r0=Unknown # pepStatusInfo.info.r0=This message does not contain enough information to determine if it is secure. # pepStatusInfo.title.r1=Cannot Decrypt # pepStatusInfo.info.r1=This message cannot be decrypted because the key is not available. # pepStatusInfo.title.r2=Cannot Decrypt # pepStatusInfo.info.r2=This message cannot be decrypted because the key is not available. # pepStatusInfo.title.r3=Unsecure # pepStatusInfo.info.r3=This message is unsecure. # pepStatusInfo.title.r4=Unsecure for Some # pepStatusInfo.info.r4=This message is unsecure for some communication partners. # pepStatusInfo.title.r5=Unreliable Security # pepStatusInfo.info.r5=This message has unreliable protection. # pepStatusInfo.title.r6=Secure... # pepStatusInfo.info.r6=This message is secure but you still need to verify the identity of your communication partner. # pepStatusInfo.title.r7=Secure & Trusted # pepStatusInfo.info.r7=This message is secure and trusted. # pepStatusInfo.color.green=Green # pepStatusInfo.color.yellow=Yellow # pepStatusInfo.color.red=Red # pepRevokeTrust.question=Do you really want to cancel the trust for %S? # pepRevokeMistrust.question=Do you really want to re-trust the key for %S? # pepRevokeTrust.doRevoke=Cancel &trust # wksConfirmationReq=Web Key Directory Confirmation Request # wksConfirmationReq.message=This message has been sent by your email provider to confirm deployment of your OpenPGP public key\nin their Web Key Directory.\nProviding your public key helps others to discover your key and thus being able to encrypt messages to you.\n\nIf you want to deploy your key in the Web Key Directory now, please click on the button "Confirm Request" in the status bar.\nOtherwise, simply ignore this message. # wksConfirmationReq.button.label=Confirm Request # autocryptSetupReq=Perform Autocrypt Setup # autocryptSetupReq.button.label=Start Setup # autocryptSetupReq.setupMsg.desc=This message contains all information to transfer your Autocrypt settings along with your secret key securely from your original device. # autocryptSetupReq.setupMsg.backup=You can keep this message and use it as a backup for your secret key. If you want to do this, you should write down the password and store it securely. # autocryptSetupReq.message.import=To import the settings and key(s) in Enigmail, please click on the "Start Setup" button in the status bar. # autocryptSetupReq.message.sent=Please click on the message on your new device and follow the instuctions to import the settings. # strings in pref-enigmail.js # oldGpgVersion20=Enigmail initialization failed.\n\nYou are using GnuPG version %1$S, which is not supported anymore. Enigmail requires GnuPG version %2$S or newer. Please upgrade your GnuPG installation, or Enigmail will not work. locateGpg=Znajdź program GnuPG invalidGpgPath=Nie udaÅ‚o siÄ™ uruchomić GnuPG z podanej Å›cieżki. Dlatego też Enigmail bÄ™dzie nieaktywne, dopóki nie zostanie zmieniona Å›cieżka do programu GnuPG lub dopóki nie zrestartujesz aplikacji. warningsAreReset=Wszystkie ostrzeżenia bÄ™dÄ… pokazywane od nowa. prefs.gpgFound=GnuPG znaleziono w katalogu %S prefs.gpgNotFound=Nie można znależć GnuPG prefs.warnAskNever=Ostrzeżenie! Włączenie tej opcji oznacza niezaszyfrowane wiadomoÅ›ci bez żadnej informacji o brakujÄ…cym kluczu dla któregoÅ› z odbiorców – Enigmail nie poinformuje o takim przypadku! prefs.warnIdleTimeForUnknownAgent=Twój system używa specjalistycznych narzÄ™dzi do obsÅ‚ugi szyfru, takich jak gnome-keyring lub seahorse-agent. Niestety Enigmail nie może kontrolować limitu czasu szyfru używanego narzÄ™dzia. Dlatego poszczególne ustawienia limitu czasu w Enigmail sÄ… pomijane. prefEnigmail.oneKeyserverOnly=Błąd – w ustawieniach automatycznego pobierania brakujÄ…cych kluczy OpenPGP można wskazać tylko jeden serwer kluczy. # Strings used in core.jsm # (said file also re-uses some strings from above) enterAdminPin=Wprowadź ADMIN PIN swojej karty SmartCard enterCardPin=Wprowadź PIN swojej karty SmartCard notInit=Błąd – usÅ‚uga Enigmail nie zainicjowana badCommand=Błąd – nie powiodÅ‚o siÄ™ polecenie szyfrowania cmdLine=skÅ‚adnia i wynik polecenia: notRequired=Błąd – szyfrowanie nie jest wymagane notComplete=Błąd – generowanie kluczy nie jest jeszcze zakoÅ„czone invalidEmail=Błąd – nieprawidÅ‚owe adresy e-mail noPassphrase=Błąd – nie podano szyfru noPGPblock=Błąd – nie znaleziono prawidÅ‚owego bloku danych OpenPGP unverifiedReply=Cytowana część wiadomoÅ›ci (odpowiedzi) zostaÅ‚a prawdopodobnie zmodyfikowana # keyInMessageBody=Key in message body found. Click 'Import Key' to import the key sigMismatch=Błąd – podpis nie pasuje cantImport=Błąd przy importowaniu klucza publicznego\n\n # doImportOne=Import %1$S (%2$S)? # doImportMultiple=Import the following keys?\n\n%S # previewFailed=Can't read public key file. # Strings used in errorHandling.jsm sc.wrongCardAvailable=Karta SmartCard %S znaleziona w czytniku nie może być użyta do przetworzenia wiadomoÅ›ci.\nWłóż kartÄ™ %S i ponów operacjÄ™. sc.insertCard=Ta operacja wymaga karty SmartCard %S.\nWłóż wymaganÄ… kartÄ™ i ponów operacjÄ™. sc.removeCard=Ta operacja wymaga usuniÄ™cia karty SmartCard z czytnika.\nUsuÅ„ kartÄ™ i ponów operacjÄ™. sc.noCardAvailable=Nie znaleziono karty SmartCard w czytniku\nWłóż kartÄ™ do czytnika i ponów operacjÄ™ sc.noReaderAvailable=Brak dostÄ™pu do czytnika kart SmartCard\nPodłącz czytnik, włóż swojÄ… kartÄ™ i ponów operacjÄ™ # keyError.keySpecNotFound=The email address "%S" cannot be matched to a key on your keyring. # keyError.keyIdNotFound=The configured key ID "%S" cannot be found on your keyring. # keyError.resolutionAction=Please select a valid key in the OpenPGP section of your Account Settings. # missingPassphrase=Missing passphrase # errorHandling.gpgAgentInvalid=Your system is running a version of gpg-agent that is not suitable for your GnuPG version. # errorHandling.gpgAgentError=GnuPG reported an error in the communication with gpg-agent (a component of GnuPG). # errorHandling.dirmngrError=GnuPG reported an error in the communication with dirmngr (a component of GnuPG). # errorHandling.pinentryError=GnuPG cannot query your passphrase via pinentry. # errorHandling.readFaq=This is a system setup or configuration error that prevents Enigmail from working properly and cannot be fixed automatically.\n\nWe strongly recommend that you consult our support web site at https://enigmail.net/faq. gpgNotFound=Nie odnaleziono programu GnuPG „%Sâ€.\nSprawdź w ustawieniach Enigmail czy jest okreÅ›lona prawidÅ‚owa Å›cieżka do programu GnuPG. gpgNotInPath=W podanym poÅ‚ożeniu nie znaleziono programu GnuPG.\nSprawdź w ustawieniach Enigmail czy jest okreÅ›lona prawidÅ‚owa Å›cieżka do programu GnuPG. # enigmailNotAvailable=Enigmail core Service not available prefGood=PrawidÅ‚owy podpis od %S prefBad=NIEPRAWIDÅOWY podpis od %S failCancel=Błąd – użytkownik anulowaÅ‚ odbiór klucza failNoServer=Błąd – nie wprowadzono nazwy serwera kluczy failNoID=Błąd – brak ID klucza do pobrania failKeyExtract=Błąd – nie powiodÅ‚o siÄ™ uzyskanie klucza notFirstBlock=Błąd – pierwszy blok OpenPGP nie jest blokiem klucza publicznego importKeyConfirm=Czy zaimportować klucze publiczne osadzone w wiadomoÅ›ci? failKeyImport=Błąd – nie powiodÅ‚o siÄ™ zaimportowanie klucza fileWriteFailed=Błąd zapisu do pliku %S importKey=Importowanie klucza publicznego %S z serwera kluczy: uploadKey=Eksportowanie klucza publicznego %S do serwera: keyId=ID klucza keyAndSigDate=ID klucza: 0x%S / Podpisano dnia: %S keyFpr=Odcisk klucza: %S noEmailProvided=Nie podano adresu e-mail! keyAlreadySigned=Ten klucz jest już podpisany, nie można podpisać go ponownie. ##################################################################### # Strings used in enigmailKeySelection.js ##################################################################### selKeyExpired=przedawniony %S createdHeader=Utworzony atLeastOneKey=Nie wybrano klucza! Należy zaznaczyć co najmniej jednÄ… pozycjÄ™. fewerKeysThanRecipients=Zaznaczono mniejszÄ… liczbÄ™ kluczy niż odbiorców. Czy na pewno ten zestaw kluczy do szyfrowania jest kompletny? userSel.button.goBack=Wybierz wiÄ™cej kluczy userSel.secretKeySel.title=Wybierz klucz prywatny OpenPGP, aby podpisać wiadomość userSel.problemNoKey=Nie ważne kluczem userSel.problemMultipleKeys=Wiele kluczy # should be same as thunderbird ENTITY sendLaterCmd.label: sendLaterCmd.label=WyÅ›lij później # Strings used in enigmailAttachmentDialog.js # pgpMimeNote=NOTE: PGP/MIME is not supported by all email clients. If you are unsure, select the %S option. first=pierwszÄ… second=drugÄ… # Strings used in am-enigprefs.js / enigmailEditIdentity.js encryptKeyHeader=Wybierz klucz OpenPGP do szyfrowania identityName=Tożsamość: %S # switchPepMode=You are currently using the 'p≡p Junior' mode of Enigmail.\n\nBy enabling OpenPGP or S/MIME for an account, you are disabling p≡p and use the 'regular' mode of Enigmail without p≡p. # enableEnigmail=&Disable p≡p # Strings used in enigmailSingleRcptSettings.js noEncryption=Uaktywniono szyfrowanie, ale nie wybrano żadnego klucza. Aby szyfrować wiadomoÅ›ci wysyÅ‚ane do %S, należy wybrać co najmniej jeden ważny klucz z listy dostÄ™pnych. Czy chcesz wyłączyć szyfrowanie wiadomoÅ›ci do %S? noKeyToUse=(brak – bez szyfrowania) noEmptyRule=ReguÅ‚a nie może być pusta! Wprowadź adres e-mail w polu edycji reguÅ‚y. invalidAddress=Wprowadzone adresy e-mail sÄ… niepoprawne. Nie należy wpisywać nazwy adresata, tylko sam adres. Np.\nNieprawidÅ‚owo: Jan Kowalski \nPrawidÅ‚owo: jakis.adres@poczta.pl # noCurlyBrackets=The curly brackets {} have a special meaning and should not be used in an email address. If you want to modify the matching behavior for this rule, use the 'Apply rule if recipient ...' option.\nMore information is available from the Help button. # Strings used in enigmailRulesEditor.js never=Nigdy always=Zawsze possible=Możliwe deleteRule=Czy usunąć wybranÄ… regułę? nextRcpt=(NastÄ™pny adresat) negateRule=Nie addKeyToRule=Dodaj klucz %S (%S) do reguÅ‚y dla adresata # Strings used in enigmailSearchKey.js needOnline=Wybrana funkcja nie jest dostÄ™pna w trybie offline. Włącz tryb online i spróbuj ponownie. protocolNotSupported=Przy użyciu wybranego protokoÅ‚u „%S://†pobranie kluczy OpenPGP nie jest możliwe. gpgkeysDisabled=Pomóc może włączenie opcji „extensions.enigmail.useGpgKeysToolâ€. noKeyserverConn=Nie można połączyć siÄ™ z serwerem kluczy %S. keyDownloadFailed=Nie powiodÅ‚o siÄ™ pobieranie kluczy z serwera. Status wiadomoÅ›ci:\n%S internalError=WystÄ…piÅ‚ wewnÄ™trzny błąd. Nie można pobrać/zaimportować kluczy. noKeyFound=Niestety nie udaÅ‚o siÄ™ znaleźć kluczy pasujÄ…cych do podanych kryteriów wyszukiwania.\nIdentyfikatory kluczy (ID) powinny być poprzedzone znakami „0x†(np. 0xABCDEF12). # keyDownload.keyUnavailable=We are sorry, but the key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their key by email. # gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. gpgKeysFailed=Nie powiodÅ‚o siÄ™ wyszukiwanie lub pobieranie kluczy z serwera – nie można uruchomić programu gpgkeys_%S. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Nie powiodÅ‚o siÄ™ ustawienie poziomu zaufania dla wÅ‚aÅ›ciciela # Strings in enigmailSignKeyDlg.js signKeyFailed=Nie udaÅ‚o siÄ™ podpisać klucza alreadySigned.label=Informacja. Klucz %S jest już podpisany za pomocÄ… wybranego klucza prywatnego. # alreadySignedexportable.label=Note: the key %S is already signed exportable with the selected secret key. A local signature does not make sense. partlySigned.label=Informacja: niektóre numery ID klucza %S zostaÅ‚y już podpisane przez wybrany klucz prywatny. # noTrustedOwnKeys=No eligible key found for signing! You need at least one fully trusted secret key in order to sign keys. # Strings in enigmailKeyManager.js keyMan.loadingKeys=Wczytywanie kluczy… ProszÄ™ czekać. keyValid.unknown=nieznany keyValid.invalid=niepoprawny keyValid.disabled=wyłączony keyValid.revoked=unieważniony keyValid.expired=przeterminowany keyValid.noSubkey=brak podklucza keyTrust.untrusted=brak keyTrust.marginal=ograniczone keyTrust.full=peÅ‚ne keyTrust.ultimate=absolutne keyTrust.group=(grupa) keyType.public=pub keyType.publicAndSec=pub/pryw keyMan.enableKey=Włącz klucz keyMan.disableKey=Wyłącz klucz userAtt.photo=Atrybuty użytkownika (obraz JPEG) asciiArmorFile=Opakowanie ASCII (*.asc) importKeyFile=Import plik klucza OpenPGP gnupgFile=Pliki GnuPG # createKeyOK=Your Key has been generated saveRevokeCertAs=Utwórz i zapisz certyfikat unieważnienia # revokeCertOK=The revocation certificate has been successfully created. You can use it to invalidate your public key, e.g. in case you would lose your secret key. revokeCertFailed=Nie udaÅ‚o siÄ™ utworzyć certyfikatu unieważnienia. addUidOK=Nowe ID zostaÅ‚o dodane addUidFailed=Nie udaÅ‚o siÄ™ dodać nowego ID noKeySelected=Aby wykonać wybranÄ… operacjÄ™, należy zaznaczyć co najmniej jeden klucz exportToFile=Eksport klucza publicznego do pliku exportKeypairToFile=Eksport tajne i klucza publicznego do pliku exportSecretKey=Czy chcesz dołączyć klucz prywatny do zapisywanego pliku z kluczami OpenPGP? saveKeysOK=Klucze zostaÅ‚y zapisane saveKeysFailed=Nie udaÅ‚o siÄ™ zapisać kluczy importKeysFailed=Nie udaÅ‚o siÄ™ zaimportować kluczy enableKeyFailed=Nie udaÅ‚o siÄ™ włączenie/wyłączenie kluczy specificPubKeyFilename=%S (0x%S) pub specificPubSecKeyFilename=%S (0x%S) pub-pryw defaultPubKeyFilename=Eksportowane-klucze-publiczne defaultPubSecKeyFilename=Eksportowane-klucze-publiczne-i-prywatne noSecretKeys=Nie znaleziono klucza prywatnego.\n\nCzy chcesz wygenerować wÅ‚asny klucz? sendKeysOk=Klucze zostaÅ‚y wysyÅ‚ane sendKeysFailed=Nie udaÅ‚o siÄ™ wysÅ‚ać kluczy receiveKeysOk=Klucze zostaÅ‚y zaktualizowane receiveKeysFailed=Nie udaÅ‚o siÄ™ pobrać kluczy importFromClip=Czy chcesz zaimportować klucze ze schowka? # importFromUrl=Download public key from this URL: copyToClipbrdFailed=Nie udaÅ‚o siÄ™ skopiować wybranych kluczy do schowka. copyToClipbrdOK=Skopiowano klucze do schowka deleteSecretKey=Uwaga! Zamierzasz usunąć klucz prywatny!\nJeÅ›li usuniesz ten klucz, nie bÄ™dziesz mieć możliwoÅ›ci odszyfrowania wiadomoÅ›ci zaszyfrowanych tym kluczem ani unieważnienia tego klucza.\n\nCzy na pewno chcesz usunąć obydwa klucze, prywatny i publiczny\n„%Sâ€? deleteMix=Uwaga! Zamierzasz usunąć klucze prywatne!\nJeÅ›li usuniesz ten klucz, nie bÄ™dziesz mieć możliwoÅ›ci odszyfrowania wiadomoÅ›ci zaszyfrowanych tym kluczem.\n\nCzy na pewno chcesz usunąć wszystkie zaznaczone klucze prywatne i publiczne? deletePubKey=Czy chcesz usunąć klucz publiczny\n„%Sâ€? deleteSelectedPubKey=Czy chcesz usunąć wybrane klucze publiczne? deleteKeyFailed=Nie udaÅ‚o siÄ™ usunąć tego klucza. # revokeKeyQuestion=You are about to revoke the key '%S'.\n\nYou will no longer be able to sign with this key, and once distributed, others will no longer be able to encrypt with that key. You can still use the key to decrypt old messages.\n\nDo you want to proceed? revokeKeyOk=Klucz zostaÅ‚ unieważniony. Jeżeli klucz jest dostÄ™pny na serwerze kluczy, zalecane jest ponowne wysÅ‚anie go na serwer, tak aby inni użytkownicy otrzymali informacjÄ™ o unieważnieniu. revokeKeyFailed=Nie udaÅ‚o siÄ™ unieważnić tego klucza. # revokeKeyNotPresent=You have no key (0x%S) which fits to this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before the revocation certificate! # revokeKeyAlreadyRevoked=The key 0x%S has already been revoked. refreshAllQuestion=Nie wybrano żadnego klucza. Czy chcesz odÅ›wieżyć wszystkie klucze? # refreshKeyServiceOn.warn=Warning: Your keys are currently being refreshed in the background as safely as possible.\nRefreshing all your keys at once will unnecessarily reveal information about you.\nDo you really want to do this? refreshKey.warn=Uwaga! W zależnoÅ›ci od liczby kluczy i parametrów połączenia, odÅ›wieżenie wszystkich kluczy może być dÅ‚ugÄ… operacjÄ…! downloadContactsKeys.warn=Uwaga! W zależnoÅ›ci od liczby kontaktów i parametrów połączenia, pobieranie wszystkich kluczy może byc dÅ‚uga operacjÄ…! downloadContactsKeys.importFrom=Importuj kontakty z książki adresowej "%S" keyMan.button.exportSecKey=&Eksportuj klucze prywatne keyMan.button.exportPubKey=Eksportuj tylko klucze &publiczne keyMan.button.import=&Importuj keyMan.button.refreshAll=&OdÅ›wież wszystkie klucze keyMan.button.revokeKey=&Unieważnij klucz keyMan.button.skip=PomiÅ„ klucz keylist.noOtherUids=Nie ma innych tożsamoÅ›ci keylist.hasOtherUids=Także znany jako keylist.noPhotos=Brak zdjÄ™cia keylist.hasPhotos=ZdjÄ™cia keyMan.addphoto.filepicker.title=Wybierz zdjÄ™cie do dodania keyMan.addphoto.warnLargeFile=Wybrany plik jest wiÄ™kszy niż 25 kB.\nNie zaleca siÄ™ dodawania bardzo dużych plików, ponieważ klucz bÄ™dzie wówczas bardzo duży. keyMan.addphoto.noJpegFile=Wybrany plik nie jest w formacie JPEG. Wybierz inny plik. keyMan.addphoto.failed=Nie można dodać zdjÄ™cia. # noWksIdentity=The key %S does not have a WKS identity. # keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key "%1$S (%2$S)" for encrypting messages? # keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key "%1$S (%2$S)" for future messages? # keyman.addBlacklistKey.button=&Blacklist the key # keyman.removeBlacklistKey.button=&Remove key from Blacklist # Strings in enigmailManageUidDlg.xul changePrimUidFailed=Nie udaÅ‚o siÄ™ zmienić głównego identyfikatora użytkownika changePrimUidOK=Zmieniono główny identyfikator użytkownika revokeUidFailed=Nie udaÅ‚o siÄ™ unieważnić ID %S revokeUidOK=ID %S zostaÅ‚ unieważniony. Jeżeli klucz jest dostÄ™pny na serwerze kluczy, zalecane jest ponowne wysÅ‚anie go na serwer, tak aby inni użytkownicy otrzymali informacjÄ™ o unieważnieniu. revokeUidQuestion=Czy na pewno chcesz unieważnić ID %S? # Strings in enigmailKeyImportInfo.xul # importInfoTitle=SUCCESS! Keys imported # importInfoBits=Bits # importInfoCreated=Created # importInfoFpr=Fingerprint # importInfoDetails=(Details) # importInfoNoKeys=No keys imported. # Strings in enigmailKeyDetailsDlg.xul keyTypePublic=klucz publiczny keyTypePrimary=klucz główny keyTypeSubkey=podklucz keyTypePair=para kluczy keyExpiryNever=nigdy keyAlgorithm_1=RSA keyAlgorithm_2=RSA keyAlgorithm_3=RSA keyAlgorithm_16=ELG keyAlgorithm_17=DSA keyAlgorithm_18=ECDH keyAlgorithm_19=ECDSA keyAlgorithm_20=ELG # keyAlgorithm_22=EDDSA keyUsageEncrypt=Szyfruj keyUsageSign=Podpisz keyUsageCertify=Certyfikuj keyUsageAuthentication=Uwierzytelnianie # keyDoesNotExpire=Key does not expire # Strings in enigmailGenCardKey.xul keygen.started=ProszÄ™ czekać. Trwa proces generowania klucza… keygen.completed=Klucz zostaÅ‚ wygenerowany. Nowe ID klucza to: 0x%S. keygen.keyBackup=Klucz zostaÅ‚ zapisany jako %S keygen.passRequired=OkreÅ›l szyfr, jeÅ›li chcesz utworzyć kopiÄ™ zapasowÄ… swojego klucza poza kartÄ… SmartCard. # Strings in enigmailSetCardPin.xul cardPin.processFailed=Nie udaÅ‚o siÄ™ zmienić numeru PIN # Strings in enigRetrieveProgres.xul keyserverProgress.refreshing=Trwa odÅ›wieżanie kluczy… ProszÄ™ czekać. keyserverProgress.uploading=Trwa wysyÅ‚anie kluczy… ProszÄ™ czekać. # keyserverProgress.wksUploadFailed=Could not upload your key to the Web Key Service # keyserverProgress.wksUploadCompleted=Your public key was successfully submitted to your provider. You will receive an email to confirm that you initiated the upload. keyserverTitle.refreshing=OdÅ›wieżanie kluczy keyserverTitle.uploading=WysyÅ‚anie kluczy # Strings in enigmailSetupWizard passphrase.min8keys=Szyfr powinien zawierać co najmniej 8 znaków! setupWizard.reallyCancel=Czy na pewno chcesz zamknąć Asystenta ustawieÅ„ Enigmail? setupWizard.invalidGpg=Wybrany plik GnuPG nie jest plikiem wykonywalnym. Wybierz inny plik. setupWizard.specifyFile=Aby kontynuować, musisz okreÅ›lić przynajmniej plik klucza publicznego. setupWizard.installFailed=WyglÄ…da na to, że instalacja siÄ™ nie powiodÅ‚a. Spróbuj ponownie uruchomić instalacjÄ™ lub zainstaluj GnuPG rÄ™cznie i zlokalizować go, używajÄ…c przycisku PrzeglÄ…daj… # setupWizard.downloadForbidden=For your own security, we will not download GnuPG. Please visit https://gnupg.org/ in order to download GnuPG. # setupWizard.downloadImpossible=We cannot download GnuPG currently. Please try later or visit https://gnupg.org/ in order to download GnuPG. setupWizard.hashSumError=Asystent nie może zweryfikować spójnoÅ›ci pobranego pliku. Plik może być uszkodzony lub zostaÅ‚ zmieniony. Czy mimo wszystko chcesz kontynuować instalacjÄ™? # setupWizard.importSettingsFile=Specify backup file to load from # setupWizard.invalidSettingsFile=The specified file is not a correct Enigmail Settings backup file. # setupWizard.gpgConfExists=The GnuPG config file already exists. Do you want to overwrite it with the one from your old installation? # setupWizard.noGpgHomeDir=It appears that you configured %S to use for GnuPG. However, this is not a directory - you cannot use it. # setupWizard.unmachtedIds=The following identities of your old setup could not be matched:\n%S\nThe settings for these identities were skipped. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=Podczas pobierania GnuPG wystÄ…piÅ‚ błąd. Otwórz dziennik błędów, by zobaczyć szczegółowe informacje. installGnuPG.installFailed=Podczas instalowania GnuPG wystÄ…piÅ‚ błąd. Otwórz dziennik błędów, by zobaczyć szczegółowe informacje. # Strings in enigmailAddUidDlg.xul addUidDlg.nameOrEmailError=Należy uzupeÅ‚nić nazwÄ™ i adres e-mail addUidDlg.nameMinLengthError=Nazwa musi zawierać co najmniej 5 znaków addUidDlg.invalidEmailError=Należy podać poprawny adres e-mail # Strings in enigmailCardDetails.js Carddetails.NoASCII=Karta SmartCard obsÅ‚uguje jedynie znaki ASCII w polach "ImiÄ™ i nazwisko"/"Nazwa". # network error types errorType.SecurityCertificate=UsÅ‚uga przedstawia nieważny certyfikat zabezpieczeÅ„. errorType.SecurityProtocol=UsÅ‚uga używa nieznanego protokoÅ‚u zabezpieczeÅ„. errorType.Network=WystÄ…piÅ‚ błąd sieci. # filter stuff filter.folderRequired=Musisz wybrać folder docelowy. filter.decryptMove.label=Odszyfrować staÅ‚e (Enigmail) filter.decryptCopy.label=Tworzenie kopii szyfrowanego (Enigmail) # filter.decryptMove.warnExperimental=Warning - the filter action "Decrypt permanently" may lead to destroyed messages.\n\nWe strongly recommend that you first try the "Create decrypted Copy" filter, test the result carefully, and only start using this filter once you are satisified with the result. # filter.tempPepFilterDesc=Temporary filter to store sent message unencrypted # filter.term.pgpencrypted.label=OpenPGP Encrypted # filter.encrypt.label=Encrypt to key (Enigmail) # filter.keyRequired=You must select a recipient key. # filter.keyNotFound=Could not find an encryption key for "%S". # filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for "%S" you will no longer be able to read the emails. # strings in enigmailConvert.jsm # converter.decryptBody.failed=Could not decrypt message with subject\n"%S".\nDo you want to retry with a different passphrase or do you want to skip the message? # converter.decryptAtt.failed=Could not decrypt attachment "%1$S"\nof message with subject\n"%2$S".\nDo you want to retry with a different passphrase or do you want to skip the message? saveLogFile.title=Zapisz plik dziennika # strings in gpg.jsm # unknownSigningAlg=Unknown signing algorithm (ID: %S) # unknownHashAlg=Unknown cryptographic hash (ID: %S) # strings in keyRing.jsm # keyring.photo=Photo # keyRing.pubKeyRevoked=The key %1$S (key ID %2$S) is revoked. # keyRing.pubKeyExpired=The key %1$S (key ID %2$S) has expired. # keyRing.pubKeyNotForSigning=The key %1$S (key ID %2$S) cannot be used for signing. # keyRing.pubKeyNotForEncryption=The key %1$S (key ID %2$S) cannot be used for encryption. # keyRing.keyDisabled=The key %1$S (key ID %2$S) is disabled; it cannot be used. # keyRing.keyNotTrusted=The key %1$S (key ID %2$S) is not trusted enough. Please set the trust level of your key to "ultimate" to use it for signing. # keyRing.keyInvalid=The key %1$S (key ID %2$S) is not valid. Please consider verifying it correctly. Alternatively use the Default encryption settings in the Enigmail preferences dialog. # keyRing.signSubKeysRevoked=All signing-subkeys of key %1$S (key ID %2$S) are revoked. # keyRing.signSubKeysExpired=All signing-subkeys of key %1$S (key ID %2$S) have expired. # keyRing.signSubKeysUnusable=All signing-subkeys of key %1$S (key ID %2$S) are revoked, expired or otherwise unusable. # keyRing.encSubKeysRevoked=All encryption subkeys of key %1$S (key ID %2$S) are revoked. # keyRing.encSubKeysExpired=All encryption subkeys of key %1$S (key ID %2$S) have expired. # keyRing.noSecretKey=You do not seem to have the secret key for %1$S (key ID %2$S) on your keyring; you cannot use the key for signing. # keyRing.encSubKeysUnusable=All encryption subkeys of key %1$S (key ID %2$S) are revoked, expired or otherwise unusable. #strings in exportSettingsWizard.js # cannotWriteToFile=Cannot save to file '%S'. Please select a different file. # dataExportError=An error occurred during exporting your data. # enigmailSettings=EnigmailSettings # defaultBackupFileName=Enigmail-export # specifyExportFile=Specify file name for exporting # homedirParamNotSUpported=Additional params that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. #strings in expiry.jsm # expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use the new key. # expiry.keysExpireSoon=The following of your keys will expire in less than %1$S days:\n%2$S We recommend that you create new keys and configure your accounts to use the new keys. # expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to ultimate in key properties. # expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to ultimate in key properties. # expiry.OpenKeyManager=Open Enigmail Key Management # expiry.OpenKeyProperties=Open Key Properties #strings in pEpDecrypt.jsm # pEpDecrypt.cannotDecrypt=This is an encrypted message. Unfortunately you don't have the secret key to decrypt the message. #strings in gpgAgent.jsm # gpghomedir.notexists=The directory '%S' containing your OpenPGP keys does not exist and cannot be created. # gpghomedir.notwritable=The directory '%S' containing your OpenPGP keys is not writable. # gpghomedir.notdirectory=The directory '%S' containing your OpenPGP keys is a file instead of a directory. # gpghomedir.notusable=Please fix the directory permissions or change the location of your GnuPG "home" directory. GnuPG cannot work correctly otherwise. #strings in pepTrustWords.js # pepTrustWords.cannotVerifyOwnId=Cannot verify p≡p Trustwords for own account. # pepTrustWords.cannotFindKey=Cannot find key for %S. # pepTrustWords.cannotStoreChange=Could not change trust for %S. # pepTrustWords.generalFailure=Cannot obtain trustwords for %S. # pepTrustWords.partnerFingerprint=Fingerprint for %S: #strings in mimeWkdHandler.jsm # wkdMessage.body.req=Your email provider processed your request to upload your public key to the OpenPGP Web Key Directory.\n\nPlease click the confirmation button in the Enigmail header to complete the publishing of your public key. # wkdMessage.body.process=This is an email related to the automatic processing to upload your public key to the OpenPGP Web Key Directory.\n\nYou do not need to take any manual action at this point. #strings in pepHandshake.js # pepPrivacyStatus.RatingBrokenSuggestion=Either you or the sender should resend the message. # pepPrivacyStatus.RatingHaveNoKeySuggestionOutgoing=If you composed this message, your key is not available. # pepPrivacyStatus.RatingMistrustSuggestion=Re-establish the connection with your communication partner and try to complete another handshake. # pepPrivacyStatus.RatingReliableSuggestion=Complete a handshake with your communication partner by exchanging trustwords in person or over the phone. A handshake is needed only once per partner and will ensure secure and trusted communication. # pepPrivacyStatus.RatingTrustedSuggestion=No action needed! # pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware this message may not be secure. # pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Please add the necessary information. # pepPrivacyStatus.RatingUnderAttackSuggestion=Separately verify the content of this message with your communication partner. # pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least secure. # pepPrivacyStatus.RatingUnencryptedSuggestion=Please ask your communication partner to use an encryption solution or install p≡p. # pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or no signature. Ask your communication partner to upgrade their encryption solution or install p≡p. # pepPrivacyStatus.RatingBrokenExplanation=This message has broken encryption or formatting. # pepPrivacyStatus.RatingHaveNoKeyExplanation=This message cannot be decrypted because the key is not available. # pepPrivacyStatus.RatingMistrustExplanation=This message has a communication partner that has previously been marked as mistrusted. # pepPrivacyStatus.RatingReliableExplanation=This message is secure but you still need to verify the identity of your communication partner. # pepPrivacyStatus.RatingTrustedExplanation=This message is secure and trusted. # pepPrivacyStatus.RatingUndefinedExplanation=This message does not contain enough information to determine if it is secure. # pepPrivacyStatus.RatingUnderAttackExplanation=This message is not secure and has been tampered with. # pepPrivacyStatus.RatingUnencryptedExplanation=This message is unsecure. # pepPrivacyStatus.RatingUnencryptedForSomeExplanation=This message is unsecure for some communication partners. # pepPrivacyStatus.RatingUnreliableExplanation=This message has unreliable protection. # pepPrivacyStatus.RatingBrokenText=Broken # pepPrivacyStatus.RatingHaveNoKeyText=Cannot Decrypt # pepPrivacyStatus.RatingMistrustText=Mistrusted # pepPrivacyStatus.RatingReliableText=Secure # pepPrivacyStatus.RatingTrustedText=Secure & Trusted # pepPrivacyStatus.RatingUndefinedText=Unknown # pepPrivacyStatus.RatingUnderAttackText=Under Attack # pepPrivacyStatus.RatingUnencryptedForSomeText=Unsecure for Some # pepPrivacyStatus.RatingUnencryptedText=Unsecure # pepPrivacyStatus.RatingUnreliableText=Unreliable Security # handshakeDlg.button.initHandshake=Handshake... # handshakeDlg.button.stopTrust=Stop Trusting # handshakeDlg.button.reTrust=Stop Mistrusting # handshakeDlg.label.outgoingMessage=Outgoing message # handshakeDlg.label.incomingMessage=Incoming message # handshakeDlg.error.noPeers=Cannot handshake without any correspondents. # handshakeDlg.error.noProtection=Please enable protection in order to use the Handshake function. # enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device # enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup #strings in autocrypt.jsm # autocrypt.setupMsg.subject=Autocrypt Setup Message # autocrypt.setupMsg.msgBody=To set up your new device for Autocrypt, please follow the instuctions that should be presented by your new device. # autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code presented on your old device, and then import the contained key into your keyring. #strings in upgradeInfo.html # upgradeInfo.doctitle=What's New in Enigmail v2.0? # upgradeInfo.welcome1=Welcome to the new Enigmail version 2.0! # upgradeInfo.welcome2=The release contains a lot of new and changed features. Please take a minute to find out what's new: # upgradeInfo.encSubject.title=Encrypting the Message Subject # upgradeInfo.encSubject.desc=We developed a new method that moves the email subject into the encrypted message, and replaces the visible subject with "Encrypted Message". Once such a message is decrypted, the original subject is replaced automatically. Hiding the subject is on by default; there is a preference to turn it off if you don't like it. (Note: this feature requires the message to be sent with PGP/MIME.) # upgradeInfo.buttons.title=Changed behavior of Encrypt and Sign Buttons # upgradeInfo.buttons.desc=The Encrypt and Sign buttons in the message composer window now work for both the OpenPGP and S/MIME protocols. If both algorithms are possible, then Enigmail will try to prefer the one for which all keys are available. # upgradeInfo.autocrypt.title=Support for Autocrypt # upgradeInfo.autocrypt.desc=Enigmail now supports Autocrypt, a new standard to distribute keys as part of sent messages. Enigmail automatically imports keys from Autocrypt-compliant messages, such that over time more and more emails can be encrypted. # upgradeInfo.pEp.title=New p≡p Junior Mode (Pretty Easy Privacy) # upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. You currently need to manually install p≡p for this purpose; this will change in a future release. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. # upgradeInfo.bottom.desc=Please visit our documentation for help on using Enigmail. # pep.missingGnuPG=In order to use Enigmail/p≡p, GnuPG is required. As we could not find it, we suggest to download and install it for you. #strings in enigmailAbout.html # aboutEnigmail.tabName=About Enigmail # aboutEnigmail.title=OpenPGP support provided by Enigmail # aboutEnigmail.team=Enigmail is developed by the Enigmail Team: # aboutEnigmail.projectLeader=Lead Developer: # aboutEnigmail.usability=Usability: # aboutEnigmail.documentation=Documentation: # aboutEnigmail.testing=Testing: # aboutEnigmail.userSupport=User Support: # aboutEnigmail.localization=Localization: See the Enigmail Language Packs page # aboutEnigmail.Credits=Credits: # aboutEnigmail.origAuthor=Original author of the Enigmail extension # aboutEnigmail.icons=Icons: # aboutEnigmail.formerMembers=Former team members: # aboutEnigmail.projectHosting=Project hosting: # aboutEnigmail.licenseSupportTitle=License & Support # aboutEnigmail.license=Enigmail OpenPGP is open source and licensed under the %S # aboutEnigmail.support=Support and download is available from www.enigmail.net. enigmail-2.0.8/lang/pl/help/000077500000000000000000000000001334302754500156005ustar00rootroot00000000000000enigmail-2.0.8/lang/pl/help/compose.html000066400000000000000000000110121334302754500201260ustar00rootroot00000000000000 Pomoc dla Enigmail: Tworzenie wiadomoÅ›ci

Pomoc dla Enigmail

Używanie Enigmail w oknie tworzenia wiadomości

Menu Enigmail w oknie tworzenia wiadomości
Podpisz wiadomość
Włącza/wyłącza podpisywanie wiadomości. Użytkownik jest powiadamiany, jeśli podpisywanie się nie powiodło.
Szyfruj wiadomość

Włącza/wyłącza szyfrowanie dla wszystkich odbiorców przed wysłaniem. Użytkownik jest powiadamiany, jeśli szyfrowanie się nie powiodło.

Jeśli funkcja Wyświetlaj wybór w razie potrzeby, jest ustawiona na karcie Ustawienia » Zaawansowane » Wybór klucza, będzie wyświetlana lista kluczy, jeśli na liście odbiorców wiadomości znajdują się adresy dla, których nie masz kluczy publicznych.

Jeśli funkcja Nigdy nie wyświetlaj wyboru klucza OpenPGP, jest ustawiona na karcie Ustawienia » Wybór klucza, wiadomość będzie wysyłana niezaszyfrowana, jeśli na liście odbiorców wiadomości znajdują się adresy dla, których nie masz kluczy publicznych.

Użyj PGP/MIME dla tej wiadomości
Włącza/wyłącza użycie PGP/MIME dla danej wiadomości.

Jeśli wiesz, że odbiorca może przeczytać wiadomość za pomocą formatu PGP/MIME, należy go użyć.

Ta funkcja jest zależna od ustawień na karcie Ustawienia » PGP/MIME Zezwalaj na używanie PGP/MIME lub Zawsze używaj PGP/MIME.

Domyślne opcje tworzenia wiadomości
  • Opcje podpisu/szyfrowania… – skrót do Konfiguracja kont » OpenPGP.
  • WysyÅ‚anie wiadomoÅ›ci… – skrót do karty Ustawienia » WysyÅ‚anie.
  • Opcje wyboru kluczy… – skrót do do karty Ustawienia » Wybór kluczy.
  • Opcje PGP/MIME… – skrót do do karty Ustawienia » PGP/MIME.
Cofnij szyfrowanie

Jeśli wysyłanie wiadomości się nie powiodło, na przykład z powodu odrzucenia żądania przez serwer POP, Enigmail nie będzie o tym wiedział i zaszyfrowana wiadomość będzie wyświetlana w oknie tworzenia wiadomości. Wybranie tej funkcji spowoduje cofnięcie szyfrowania/podpisywania i w oknie tworzenia wiadomości będzie wyświetlany oryginalny tekst.

Jako tymczasowe rozwiązanie, funkcja ta może być również używana do odszyfrowania cytowanego tekstu podczas odpowiedzi na zaszyfrowane wiadomości. Enigmail powinien automatycznie rozszyfrować cytowaną wiadomość, ale jeśli z jakiegoś powodu zawiedzie, można za pomocą tej funkcji wymusić deszyfrowanie.

Wstaw klucz publiczny
Wstawia w oknie tworzenia wiadomości blok klucza publicznego w aktualnej pozycji kursora. Użytkownik będzie proszony o podanie adresu e-mail wstawianego klucza. Klucze wstawiane w ten sposób będą u odbiorcy automatycznie rozpoznawane przez Enigmail. Po wstawieniu klucza można nadal wybrać podpisanie/szyfrowanie wiadomości. Nie należy do wiadomości wstawiać więcej niż jeden blok klucza, wystarczy, gdy pojawi się monit, podać wiele adresów e-mail, oddzielając je przecinkami lub spacjami.
Wyczyść zapisane hasło
Czyści zbuforowane szyfry. Użyteczne, jeśli masz wiele szyfrów.
Pomoc
Wyświetla pomocne informacje z witryny internetowej (tę stronę).

Więcej pomocy można uzyskać na stronie pomocy Enigmail.

enigmail-2.0.8/lang/pl/help/editRcptRule.html000066400000000000000000000123271334302754500211010ustar00rootroot00000000000000 Pomoc dla Enigmail: Edycja reguł OpenPGP

Pomoc dla Enigmail

Używanie edytora reguł Enigmail: Edycja reguł OpenPGP

W edytorze reguł można określić dla każdego odbiorcy domyślne ustawienia szyfrowania, podpisywania, PGP/MIME i zdefiniować używane klucze OpenPGP. W tym oknie dialogowym można określić reguły dla konkretnego odbiorcy i dla grupy odbiorców, używając podobnych atrybutów.

Pole „OkreÅ›l reguÅ‚y OpenPGP dlaâ€
Reguły zawierają adresy e-mail odbiorcy (bez nazwisk, po prostu adres, jak: somebody@nazwa_domeny). Możesz podać kilka adresów e-mail, rozdzielając je spacjami. Podany tutaj adres może składać się tylko z domeny, np. @nazwa_domeny. Reguła będzie wówczas pasowała do wszystkich adresów w tej domenie, np. @nazwa_domeny będzie pasować do body@nazwa_domenyl, somebody@nazwa_domeny, anybody@nazwa_domeny itd.
Zastosuj regułę, gdy adresat…
Ustawienie to modyfikuje dopasowanie adresów e-mail. Jeśli jest podane wiele adresów, ustawienie będzie miało zastosowanie do wszystkich. Przykłady są oparte na przykładowym adresie body@nazwa_domeny podanym w powyższym polu.
  • Jest taki sam, jak – reguÅ‚a bÄ™dzie miaÅ‚a zastosowanie tylko do wiadomoÅ›ci adresowanych do body@nazwa_domeny (wielkość znaków musi siÄ™ zgadzać).
  • Zawiera – bÄ™dzie pasowaÅ‚ każdy adres wiadomoÅ›ci zawierajÄ…cy podany ciÄ…g znaków, np. anybody@nazwa_domeny lub body@nazwa_domeny.net.
  • Rozpoczyna siÄ™ od – bÄ™dzie pasowaÅ‚ każdy adres wiadomoÅ›ci rozpoczynajÄ…cy siÄ™ podanym ciÄ…giem znaków, np. body@nazwa_domeny.net, body@nazwa_domeny-nazwa.com.
  • KoÅ„czy siÄ™ na – bÄ™dzie pasowaÅ‚ każdy adres wiadomoÅ›ci koÅ„czÄ…cy siÄ™ podanym ciÄ…giem znaków, np. anybody@nazwa_domeny, somebody@nazwa_domeny.
Przejdź do następnej reguły pasującej do adresu
Włączenie tej funkcji umożliwi zdefiniowanie reguły, ale nie trzeba określać klucza w polu Użyj następujących kluczy OpenPGP:, więc adres e-mail jest wykorzystywany do sprawdzania klucza w momencie wysyłania. Dla tego adresu będą również przetwarzane inne reguły.
Nie sprawdzaj kolejnych reguł pasujących do adresu
Włączenie tej funkcji, jeśli reguła pasuje, zatrzyma przetwarzanie innych reguł dla pasujących adresów, na przykład kontynuowanie przetwarzania reguły dla następnego odbiorcy.
Użyj następujących kluczy OpenPGP:
Użyj przycisku Wybierz klucze, by wybrać klucze odbiorcy, które będą używane do szyfrowania. Oprócz czynności określonej powyżej żadne inne reguły nie są przetwarzane.
Wysyłając wiadomości włącz…
Włącza lub wyłącza podpisywanie wiadomości. Funkcja ta używa lub zastępuje to, co zostało określone w oknie tworzenia wiadomości. Ustawienia są następujące:
  • Nigdy – wyłącza podpisywanie, nawet jeÅ›li zostaÅ‚o włączone w oknie tworzenia wiadomoÅ›ci (zastÄ™puje wszystkie inne wartoÅ›ci reguÅ‚),
  • Tak, jeÅ›li zaznaczono takÄ… opcjÄ™ tworzenia wiadomoÅ›ci – pozostawia sposób podpisywania okreÅ›lony w oknie tworzenia wiadomoÅ›ci,
  • Zawsze – włącza podpisywanie, nawet jeÅ›li nie zostaÅ‚o włączone w oknie tworzenia wiadomoÅ›ci.
Te ustawienia podpisywania są stosowane do wszystkich reguł, do których pasują. Jeśli jedna z reguł wyłącza podpisywanie, wiadomość nie będzie podpisywana, pomimo że inne reguły mają ustawienie zawsze.
Szyfrowanie
Włącza lub wyłącza szyfrowanie wiadomości. Ustawienia i ich znaczenie są takie same jak dla podpisywania wiadomości.
PGP/MIME
Włącza lub wyłącza kodowanie wiadomoÅ›ci w formacie PGP/MIME (RFC 3156). JeÅ›li PGP/MIME jest wyłączone, wiadomoÅ›ci sÄ… kodowane za pomocÄ… „inline PGPâ€. Ustawienia i ich znaczenie sÄ… takie same jak dla podpisywania wiadomoÅ›ci.

Reguły są przetwarzane w kolejności, w jakiej są wyświetlane w edytorze reguł OpenPGP. Gdy reguła pasuje do odbiorcy i zawiera klucz OpenPGP, oprócz używania określonego klucza, przy kolejnym przetwarzaniu reguł odbiorca nie jest brany pod uwagę.


Więcej pomocy można uzyskać na stronie pomocy Enigmail.

enigmail-2.0.8/lang/pl/help/initError.html000066400000000000000000000050111334302754500204400ustar00rootroot00000000000000 Pomoc dla Enigmail: Jak rozwiązać problemy z zainicjowaniem OpenPGP

Pomoc dla Enigmail

Jak rozwiązać problemy z zainicjowaniem OpenPGP

Zainicjowanie OpenPGP może się nie powieść z różnych powodów. Najczęściej występujące są opisane poniżej. Więcej informacji na ten temat można znaleźć na stronie pomocy Enigmail.

Nie można znaleźć GnuPG

Aby OpenPGP działało, musi być zainstalowane narzędzie GnuPG. Jeśli nie można znaleźć GnuPG, najpierw należy sprawdzić czy na komputerz jest zainstalowanye plik wykonywalny: gpg.exe w systemie Windows lub gpg w innych systemach. Jeśli GnuPG jest zainstalowane i OpenPGP nie może go znaleźć, trzeba w ustawieniach OpenPGP (menu OpenPGP » Preferencje) ręcznie określić ścieżkę do GnuPG.

Nie udało się zainicjować Enigmime

OpenPGP działa tylko, jeśli zostało zbudowane za pomocą tego samego środowiska tworzenia, co np. Thunderbird lub SeaMonkey. Oznacza to, że możesz używać oficjalnych wydań Enigmail tylko jeśli używasz oficjalnych wydań Thunderbird lub SeaMonkey dostarczanych przez mozilla.org.

Jeśli używasz wersji Thunderbirda lub SeaMonkey pochodzących z innych źródeł, np. od dostarczyciela twojej dystrybucji Linuksa lub aplikacja została zbudowana we własnym zakresie, należy użyć Enigmail zbudowanego przez to samo źródło lub zbudować go we własnym zakresie. Aby zbudować Enigmail, przejdź do sekcji z kodem źródłowym znajdującej się na stronie Enigmail. Nie zgłaszaj błędów dotyczących tego błędu - nie są one rozwiązywalne.

Więcej pomocy można uzyskać na stronie pomocy Enigmail.

enigmail-2.0.8/lang/pl/help/messenger.html000066400000000000000000000113441334302754500204610ustar00rootroot00000000000000 Pomoc dla Enigmail: Czytanie wiadomości

Pomoc dla Enigmail

Używanie Enigmail podczas czytania wiadomości

Przycisk Deszyfruj w głównym oknie wiadomości
Przycisk ten może być używany do różnych celów: deszyfrowania, weryfikowania lub importowania kluczy publicznych. Normalnie deszyfrowanie/weryfikowanie odbywa się automatycznie i może być wyłączone w ustawieniach. Jeśli automatyczne deszyfrowanie/weryfikowanie się nie powiedzie, w pasku statusu Enigmail zostanie wyświetlona informacja o błędzie. Po naciśnięciu przycisku Deszyfruj zostaną wyświetlone szczegółowe informacje dotyczące tego błędu zawierające polecenia z GnuPG.
Ikony pióra i klucza wyświetlane w nagłówku wiadomości
Ikony pióra i klucza wyświetlane w nagłówku wiadomości informują, czy aktualnie czytana wiadomość została podpisana i/lub zaszyfrowana i czy podpis jest prawidłowy, np. że wiadomość nie została zmieniona od czasu jej podpisania. Jeśli wiadomość została zmieniona, kolor ikony pióra zostanie zmieniony na czerwony, informując, że podpis jest nieprawidłowy. Kliknięcie prawym przyciskiem myszy którejś z tych ikon, spowoduje wyświetlenie menu zawierającego następujące opcje:
  • Informacje OpenPGP… – umożliwia podglÄ…d statusu elementów wyjÅ›ciowych z GnuPG dla wiadomoÅ›ci.
  • Kopiuj informacje OpenPGP – kopiuje status elementów wyjÅ›ciowych z GnuPG do schowka, by nastÄ™pnie można byÅ‚o wstawić je do odpowiedzi na wiadomość itp.
  • Pokaż zdjÄ™cie – umożliwia podglÄ…d zdjÄ™cia osoby, która wysÅ‚aÅ‚a wiadomość, jeÅ›li zdjÄ™cie zostaÅ‚o dołączone do klucza publicznego. (Ta funkcja bÄ™dzie włączona tylko, jeÅ›li zdjÄ™cie jest w kluczu danego nadawcy).
  • Informacje S/MIME… – umożliwia zobaczenie informacji bezpieczeÅ„stwa S/MIME dla wiadomoÅ›ci.

Jeśli w pliku gpg.conf nie są ustawione funkcje keyserver-options auto-key-retrieve i czytasz podpisaną lub zaszyfrowaną wiadomość, w nagłówku czytanej wiadomości będzie widoczna ikona pióra ze znakiem zapytania, a w pasku statusu Enigmail będzie wyświetlana informacja Część wiadomości podpisana; kliknij ikonę pióra, by zobaczyć szczegóły i w wiadomości zostanie wyświetlony blok zawierający wszystkie wskaźniki OpenPGP i blok podpisu.

Możesz także zobaczyć tę informację, jeśli w pliku gpg.conf są ustawione funkcje keyserver-options auto-key-retrieve, a klucz OpenPGP jest niedostępny na domyślnym serwerze kluczy.

Po kliknięciu ikony pióra ze znakiem zapytania, zostanie wyświetlone okno informujące, że klucz nie jest dostępny w twojej bazie kluczy. Po naciśnięciu przycisku OK, zostanie wyświetlone kolejne okno zawierające listę serwerów kluczy, z której można wybrać do pobrania klucz publiczny nadawcy.

Aby skonfigurować listę serwerów kluczy, których chcesz używać, przejdź na kartę OpenPGP » Ustawienia » Zaawansowane » Serwery kluczy i w polu Określ swoje serwery kluczy, wprowadź adresy serwerów kluczy, oddzielając je przecinkami. Pierwszy serwer na liście będzie używany jako domyślny serwer.

Otwierania zaszyfrowanych załączników/importowanie załączonych kluczy OpenPGP
Załączniki z rozszerzeniem *.pgp, *.asc i *.gpg są rozpoznawane jako załączniki, które mogą być obsługiwane przez Enigmail specjalnie. Kliknięcie takiego załącznika prawym przyciskiem myszy spowoduje wyświetlenie w menu kontekstowym dwóch specjalnych elementów: Deszyfruj i otwórz i Deszyfruj i zapisz jako… Użyj tych dwóch elementów, jeśli chcesz, by Enigmail deszyfrował załącznik przed otworzeniem lub jego zapisaniem. Jeśli załącznik jest rozpoznany jako plik klucza OpenPGP, zostanie zaoferowane zaimportowanie kluczy do twojej bazy kluczy.

Więcej pomocy można uzyskać na stronie pomocy Enigmail.

enigmail-2.0.8/lang/pl/help/rulesEditor.html000066400000000000000000000067411334302754500207770ustar00rootroot00000000000000 Pomoc dla Enigmail – Edytor reguł

Pomoc dla Enigmail

Użycie edytora reguł

W edytorze reguł można określić domyślne ustawienia dla każdego adresata: włączyć szyfrowanie, podpisywanie, kodowanie PGP/MIME oraz zdefiniować działanie kluczy OpenPGP. Każda reguła składa się z pięciu, umieszczonych każde w osobnym wierszu, pól:

E-mail
Pola do dopasowywania wiadomości e-mail – Do:, Kopia: i Ukryta kopia:. Dopasowywanie działa w oparciu o substringi. Więcej szczegółów można znaleźć w oknie dialogowym edytora reguł.
Klucze OpenPGP
Wykaz ID kluczy OpenPGP używanych dla adresata
Podpis
Włącza lub wyłącza podpisywanie wiadomości. Ta funkcja używa lub nadpisuje, to co zostało określone w oknie tworzenia wiadomości. Dostępne ustawienia:
  • Nigdy – wyłącza podpisywanie wiadomoÅ›ci, nawet jeÅ›li funkcja byÅ‚a włączona w oknie tworzenia wiadomoÅ›ci – unieważnia inne ustawienia.
  • Pozostaw – pozostawia podpis, taki jaki byÅ‚ ustawiony w oknie tworzenia wiadomoÅ›ci,
  • Zawsze – włącza podpisywanie wiadomoÅ›ci, nawet jeÅ›li nie byÅ‚o włączone w oknie tworzenia wiadomoÅ›ci.

Ustawienia podpisywania są stosowane dla tych wszystkich reguł, które mają włączoną funkcję podpisywania. Jeśli jakaś reguła wyłącza podpisywanie, wiadomość nie będzie podpisywana bez względu na inne reguły, które określają Zawsze.

Szyfrowanie
Włącza lub wyłącza szyfrowanie wiadomości. Dostępne ustawienia i znaczenie są takie same, jak dla podpisywania wiadomości.
PGP/MIME
Włącza lub wyłącza używanie kodowania PGP/MIME (RFC 3156) wiadomoÅ›ci. JeÅ›li PGP/MIME jest wyłączone, wiadomoÅ›ci sÄ… kodowane za pomocÄ… „inline PGPâ€. DostÄ™pne ustawienia i znaczenie sÄ… takie same, jak dla podpisywania wiadomoÅ›ci.

Reguły są przetwarzane w kolejności, w jakiej są wyświetlane na liście. W przypadku, gdy reguła pasuje do odbiorcy i zawiera ID klucza OpenPGP, oprócz korzystania z określonego ID klucza odbiorcy, nic innego nie jest brane pod uwagę podczas przetwarzania kolejnych reguł.

Informacja. Proces twórczy edytora reguł nie jest jeszcze zakończony. Bardziej zaawansowane reguły można tworzyć, edytując bezpośrednio plik reguł. Reguły edytowane w ten sposób nie powinny już być nigdy edytowane w edytorze reguł. Więcej informacji na temat bezpośredniego edytowania pliku reguł jest dostępnych na stronie domowej Enigmail.


Więcej pomocy można uzyskać na stronie pomocy Enigmail.

enigmail-2.0.8/lang/pl/help/sendingPrefs.html000066400000000000000000000050761334302754500211250ustar00rootroot00000000000000 Pomoc dla Enigmail – Edytowanie reguł OpenPGP

Pomoc dla Enigmail

Defining Preferences to Send Encrypted

In the Sending Preferences you can choose the general model and preferences for encryption.

Convenient Encryption
With these settings, emails are encrypted without confirmation whenever possible.

This setup is appropriate, if you just want to improve your privacy by sending emails encyrpted instead of unencrypted if that's possible.

The effect is like sending emails as letters instead of postcards. Unlike postcards, letters usually hide their contents while in transit.

Note however that as with letters you can't be sure that nobody is opening the letter while it is in transit (although, some technical effort is necessary for that).

A concrete risk is that you accidentally use "faked keys" you got from somewhere or somebody claiming that the key belongs to the person you want to send emails to. To avoid this risk, you can either use the trust model of PGP (see below) or you should always verify, whether the fingerprint of a public key is correct.

Manual Encryption
This option allows you to specify the different preferences for encryption according to your needs. You can specify
  • whether replies to encrypted/signed emails should automatically also be encrypted/signed-
  • whether to use the trust model of OpenPGP to accept keys (this means that to use a key you either have to sign the key or have enough other people you trust having signed the key).
  • whether you want to automatically send emails encrypted if all keys are accepted.
  • whether and when you want to finally confirm sending an email.
If it is important for you that content you send encrypted can't be read by other people or organizations, you should use the manual preferences at least choose the option to accept keys only if you or other people signed them. While this model reduces the risk of using faked keys, it requires that you actively sign keys and declare owner trust using the key managament dialog. enigmail-2.0.8/lang/pt-BR/000077500000000000000000000000001334302754500151615ustar00rootroot00000000000000enigmail-2.0.8/lang/pt-BR/am-enigprefs.properties000066400000000000000000000001231334302754500216500ustar00rootroot00000000000000# Strings used in the Mozill AccountManager prefPanel-enigprefs=Segurança OpenPGP enigmail-2.0.8/lang/pt-BR/enigmail.dtd000066400000000000000000002041071334302754500174470ustar00rootroot00000000000000 Licença Pública Mozilla 2.0"> A 'Trasferência de chave criptográfica Automática' requer que o cliente de mail no outro dispositivo seja compatível com a criptografia automática. Embora seja a solução mais fácil, apenas um número limitado de clientes suportam este padrão. A outra forma é 'Copiar & restaurar' suas configurações. Isto vai criar um arquivo ZIP com todas as informações necessárias e chaves, que você poderá copiar para o seu novo dispositivo. O Enigmail pode importar diretamente estas configurações; para outros clientes de mail, o arquivo ZIP pode ser descompactado e movido de forma manual."> '"> ' para especificar endereços de email"> ' para especificar endereços de email para o GnuPG. Desabilite caso os destinatários possuam chaves antigas do Hushmail keys."> Segurança OṕenPGP)"> NOTA: A geração de chaves pode levar até vários minutos para terminar. Não feche o navegador enquanto a geração de chaves estiver em processo. Navegar ou realizar operações intensivas de disco irão preencher o 'espaço aleatório' e agilizar o processo. Você será alertado quando a geração de chaves estiver concluída."> Criptografia Automática é um padrão que define como conseguir criptografia fim-a-fim de e-mails. Ela especifica como os programas de e-mail negociam as capacidades de encriptação utilizando e-mails regulares."> ' é inválido"> NOTA: A geração da chave pode levar até vários minutos para terminar. Não saia da aplicação enquanto a geração da chave estiver em progresso. Você será alertado quando a geração da chave estiver completa."> Nota: O Enigmail irá sempre verificar assinaturas, caso existam, em mensagens de todas as contas e identidades não importando se o Enigmail está especificamente configurado ou não"> public key é para outros enviarem para você emails criptografados. Você pode distribuí-la para todos."> private key é somente sua para descriptografar esses mails e para enviar emails assinados. Você não deve distribuí-la para ninguém."> chave privada é para você descriptografar esses mails e para enviar emails assinados. Você não deve dá-la para ninguém. Para tornar segura a sua chave privada, lhe será solicitada uma senha nos dois diálogos a seguir."> senha é uma senha que protege a sua chave privada. Ela previne o mau uso da sua chave privada."> NÃO são recomendados."> Será solicitada a sua senha para isto. Por Favor transfira o certificado para uma mídia na qual seja armazenado de forma segura, como um CD ou Pendrive. Se alguém obter acesso a este certificado ele podera inutilizar a sua chave."> exporte seus dados do velho computador utilizando o assistente de cópia de segurança das preferências do Enigmail importe os dados para o seu novo computador utilizando este assistente. "> Obrigado por utilizar o Enigmail."> Por Favor confirme a requisição de que vai procurar na sua caixa postal se assim quiser."> exporte seus dados do velho computador utilizando este assistente importe os dados para o seu novo computador utilizando o assistente de configuração. "> Por Favor selecione abaixo a conta para a qual você quer transferir a sua chave. Nós vamos mostrar um código de ajuste (senha) na próxima tela, o qual será necessário digitar no outro dispositivo para poder importar a sua chave e ajustes relacionados."> Por Favor troque para o outro dispositivo agora e abra a mensagem. Será lhe pedido um código de configuração. Por favor digite os seguintes dígitos no comando:"> enigmail-2.0.8/lang/pt-BR/enigmail.properties000066400000000000000000001636641334302754500211040ustar00rootroot00000000000000Enigmail=Enigmail ##################################################################### # Strings used within enigmailCommon.js and enigmailCommon.jsm ##################################################################### enigAlert=Alerta do Enigmail enigConfirm=Confirmação do Enigmail enigInfo=Informação acerca do Enigmail enigError=Erro do Enigmail enigPrompt=Pergunta do Enigmail dlgYes=&Sim dlgNo=&Não dlgKeepSetting=Lembrar da minha resposta e não me perguntar novamente dlgNoPrompt=Não mostrar esta mensagem novamente dlg.button.delete=Apagar (&D) dlg.button.cancel=&Cancelar dlg.button.close=Fe&char dlg.button.continue=Con&tinuar dlg.button.skip=Pular (&S) dlg.button.overwrite=&Sobrescrever dlg.button.view=&Visualizar dlg.button.retry=&Tentar Novamente dlg.button.ignore=&Ignorar dlg.button.install=&Instalar dlg.button.ok=&OK repeatPrefix=\n\nEste alerta irá se repetir %S repeatSuffixSingular=vez. repeatSuffixPlural=vezes. noRepeat=\n\nEste alerta não irá se repetir até que você atualize o Enigmail. pgpNotSupported=Você parece estar utilizando o Enigmail juntamente com o PGP 6.x\n\nInfelizmente, o PGP 6.x possui alguns problemas que previnem o Enigmail de funcionar corretamente. Portanto, o Enigmail não suporta mais o PGP 6.x; por favor mude para o GnuPG (GPG) para utilizar o Enigmail.\n\nSe você precisar de ajuda para trocar para o GnuPG, leia a seção de Ajuda na página do Enigmail. initErr.howToFixIt=Para utilizar o Enigmail, é necessário ter instalado o GnuPG. Se você não instalou o GnuPG ainda, a forma mais fácil é utilizar o "Assistente de Configuração" através do botão abaixo. initErr.setupWizard.button=&Setup passphraseCleared=A senha foi removida. cannotClearPassphrase=Você está utilizando uma ferramenta fora do padrão (como a gnome-keyring) para a cuidar da senha. Limpar a senha não é mais possível de dentro do Enigmail. noPhotoAvailable=Nenhuma foto disponível debugLog.title=Enigmail Debug Log error.photoPathNotReadable=O caminho para a foto em '%S' não é válido generalError=Erro: %S # Strings in configure.jsm enigmailCommon.versionSignificantlyChanged=Essa nova versão do Enigmail muda o gerenciamento das preferências e opções. Tentamos transferir os antigos padrões para esta nova versão. No entanto, não podemos cobrir todos os casos automaticamente. Por favor cheque novamente os resultados das novas preferências e opções. enigmailCommon.checkPreferences=Checar preferências... preferences.defaultToPgpMime=Nós mudamos a codificação da mensagem padrão no Enigmail de Inline-PGP para PGP/MIME. Nós recomendamos manter isto como padrão.\n\nSe você ainda quiser usar o Inline-PGP por padrão, você pode fazer através das configurações de conta na Segurança OpenPGP. ##################################################################### # Strings in enigmailAbout.js ##################################################################### usingVersion=Rodando Enigmail versão %S enigmailPepVersion=Enigmail/p≡p versão %S usingAgent=Utilizando %S com o executável %S para criptografar e descriptografar agentError=ERRO: Falha ao acessar o serviço Enigmime! ##################################################################### # Strings in enigmailKeygen.js ##################################################################### accessError=Erro ao acessar serviço Enigmail onlyGPG=Geração de chaves funciona apenas com GnuPG (não com PGP)! keygenComplete=Geração de chaves completa! A identidade <%S> será utilizada para assinar. revokeCertRecommended=É altamente recomendado criar o certificado para revogação da sua chave. Este certificado pode ser usado para invalidar sua chave, por exemplo: No caso de perder a sua chave secreta ou ela for comprometida. Você deseja criar o certificado de revogação agora? keyMan.button.generateCert=&Gerar Certificado genCompleteNoSign=Geração de chaves completada! genGoing=Geração de chaves já em progresso! passNoMatch=Senhas não conferem; por favor tente novamente passCheckBox=Por favor marque a opção correspondente se não for especificar senha para a chave passUserName=Por favor especifique o nome do usuário para esta identidade keygen.missingUserName=Nenhum nome foi especificado para a conta/identidade selecionada. Por favor preencha o campo "Seu nome" nas configurações de conta. keygen.passCharProblem=Você está utilizando caracteres especiais na sua senha. Infelizmente, isto pode causar problemas para outras aplicações. Nós recomendamos que você escolha uma senha contendo apenas alguns destes caracteres:\na-z A-Z 0-9 /.;:-,!?(){}[]%* passSpaceProblem=Devido a questões técnicas, sua senha não pode iniciar ou terminar com um caracter de espaço. changePassFailed=A mudança de senha falhou. keyConfirm=Gerar chaves pública e privada para '%S'? keyMan.button.generateKey=&Gerar Chave keyAbort=Abortar geração da chave? keyMan.button.generateKeyAbort=&Abortar Geração de Chaves keyMan.button.generateKeyContinue=&Continuar Geração de Chaves expiryTooLong=Você não pode criar uma chave que expire em mais do que 100 anos. expiryTooLongShorter=Você não pode criar uma chave que expira daqui a mais de 90 anos. expiryTooShort=Sua chave deve ser válida por pelo menos um dia. keyGenFailed=A geração da chave falhou. Por favor verifique o console Enigmail (Menu Enigmail > Depuração do Enigmail) para detalhes. setKeyExpirationDateFailed=A data de validade não pôde ser mudada # Strings in enigmailMessengerOverlay.js securityInfo=Informações de Segurança do Enigmail\n\n enigHeader=Enigmail: enigContentNote=Enigmail: *Anexos desta mensagem não foram assinados ou criptografados*\n\n possiblyPgpMime=Mensagem possivelmente criptografada ou assinada com PGP/MIME; clique no botao Descriptografar para verificar saveAttachmentHeader=Enigmail: Salvar anexo descriptografada noTempDir=Não foi possível encontrar um diretório temporário para gravar\nPor favor defina a variável de ambiente TEMP attachmentPgpKey=O anexo '%S' que você está abrindo parece ser um arquivo de chave OpenPGP.\n\nClique em SIM para importar as chaves contidas ou NÃO para ver o conteúdo do arquivo em uma janela do navegador beginPgpPart=********* *INÃCIO DA PARTE CRIPTOGRAFADA ou ASSINADA* ********* endPgpPart=********** *FIM DA PARTE CRIPTOGRAFADA ou ASSINADA* ********** notePartEncrypted=Enigmail: *Partes da mensagem NÃO foram assinadas ou criptografada* noteCutMessage=Enigmail: *Múltiplos blocos de mensagem encontrados -- descriptografia/verificação cancelada* decryptOkNoSig=Aviso\n\nA descriptografia foi efetuada com sucesso, mas a assinatura não pode ser verificada corretamente msgOvl.button.contAnyway=&Continuar Assim Mesmo signature.verifiedOK=A assinatura para o anexo %S foi verificada com sucesso signature.verifyFailed=A assinatura para o anexo %S não pode ser verificada attachment.noMatchToSignature=Não foi possível encontrar o arquivo de assinatura correspondente ao anexo '%S' attachment.noMatchFromSignature=Não foi possível encontrar o anexo correspondente ao arquivo de assinatura '%S' fixBrokenExchangeMsg.failed=Não obteve êxito reparando a mensagem enigmail.msgViewColumn.label=Enigmail enigmailPep.msgViewColumn.label=Enigmail/p≡p wksNoIdentity=Esta chave não está ligada a nenhuma das suas contas de mail. Por favor adicione uma conta para ao menos um dos seguintes endereço(s) de mail:\n\n%S wksConfirmSuccess=Email de confirmação enviado. wksConfirmFailure=Envio do email de confirmação falhou autocrypt.importSetupKey.accountPreconfigured=A sua conta já está corretamente configurada para criptografia automática.\nVocê tem certeza de que quer sobrescrever as suas configurações com a contida nesta mensagem? autocrypt.importSetupKey.selfCreated=Esta mensagem foi criada pela sua atual instância do Enigmail.\n\nPor favor troque o cliente de mail para o qual você deseja transferir as configurações, e clique na mensagem naquele cliente de mail para importar as configurações. autocrypt.importSetupKey.invalidMessage=Erro - não foi possível ler a mensagem se configuração. A mensagem parece estar corrompida. Por favor tente criar uma nova configuração de mensagem os seus "outros" dispositivos. autocrypt.importSetupKey.invalidKey=Erro - a chave não pode ser importada. a chave não é suportado pela sua versão de GnuPG ou ela se corrompeu. autocrypt.importSetupKey.wrongPasswd=A senha que você digitou está errada. Quer tentar novamente? autocrypt.importSetupKey.success=A mensgem de Auto-encriptação foi processada com sucesso. A auto-encriptação agoar estpa disponível para a sua conta '%S' ##################################################################### # Strings in enigmailMsgComposeOverlay.js ##################################################################### keysToExport=Selecione as Chaves OpenPGP a Inserir keysToUse=Selecione a(s) Chave(s) OpenPGP que serão utilizadas para %S pubKey=Chave pública para %S\n windowLocked=Janela de composição bloqueada; envio cancelado sendUnencrypted=Falha ao inicializar o Enigmail.\nEnviar mensagem sem criptografia? composeSpecifyEmail=Especifique o seu endereço de email primário, o qual será utilizado para escolher a chave de assinatura para mensagens de saída.\n Se o endereço não for informado, o endereço de ORIGEM da mensagem será utilizado para escolher a chave de assinatura. sendingHiddenRcpt=Esta mensagem possui destinatários BCC (cópia-carbono oculta). Caso esta mensagem seja criptografada, é possível ocultar os destinatários que estão marcados como BCC, mas os usuários de outros produtos, como o PGP, não poderão decriptografar a mensagem. Logo, recomendamos que você evite enviar mensagens criptografadas com destinatários BCC. sendWithHiddenBcc=Ocultar destinatários BCC sendWithShownBcc=Criptografar normalmente sendingNews=Operação de envio criptografado cancelada.\n\nEsta mensagem não pode ser criptografada porque existem destinatários de um grupo de discussão. Por favor reenvie a mensagem sem criptografia. sendToNewsWarning=Aviso: você está prestes a enviar uma mensagem criptografada para um grupo de discussão.\n\nIsto não é recomendado porque só faz sentido se todos os membros do grupo puderem descriptografar a mensagem, ou seja, a mensagem precisa ser criptografada com as chaves de TODOS os participantes do grupo. Por favor envie esta mensagem apenas se você sabe exatamente o que está fazendo.\n\nContinuar? hasHTML=Aviso de mensagem HTML:\nEsta mensagem pode conter HTML, que pode causar problemas durante a assinatura/criptografia. Para evitar isto, você deve pressionar a tecla SHIFT ao clicar no botão Compor/Responder para enviar uma mensagem assinada.\nSe você assina as mensagens por padrão, você deve desmarcar a opção 'Compor Mensagens em HTML' nas preferências para desabilitar o envio de mensagens HTML permanentemente para esta conta de email. strippingHTML=A mensagem contém informações de formatação HTML que podem ser perdidas ao convertê-la para texto puro para assinatura/criptografia. Você deseja continuar? msgCompose.button.sendAnyway=Enviar Mensagem A&ssim Mesmo attachWarning=Os anexos desta mensagem não estão presentes localmente, e portanto não podem ser criptografados. Para poder criptografar os anexos, armazene-os como arquivos locais primeiro e depois anexe-os. Você deseja enviar a mensagem assim mesmo? quotedPrintableWarn=Você habilitou o tipo de codificação 'quoted-printable' para o envio de mensagens. Isto pode resultar em erros de decriptografia e/ou verificação de sua mensagem.\nVocê deseja desligar a opção 'quoted-printable' agora? minimalLineWrapping=Você definiu a quebra de linha em %S caracteres. Para a correta criptografia e/ou assinatura, este valor precisa ser de pelo menos 68 caracteres.\nVocê deseja alterar a quebra de linha para 68 caracteres agora? warning=Aviso signIconClicked=Você alterou manualmente a assinatura. Logo, enquanto você estiver compondo esta mensagem, (des)ativar a assinatura não depende mais de (de)ativar a criptografia. errorOwnKeyUnusable=O Id da chave: '%S' configurado para a identidade atual não fornece uma chave OpenPGP utilizável.\n\nPor favor garanta que você tem uma chave OpenGP válida e que não tenha expirado, e que suas configurações de conta apontem para esta chave.\nSe sua chave não expirou, então verifique se a confiança no Proprietário está setado em Completo ou Ultimate. msgCompose.cannotSaveDraft=Erro durante o salvamento do rascunho msgCompose.partiallyEncrypted.short=Esteja atento quantoa vazamento de informação sensível - email parcialmente criptografado. msgCompose.partiallyEncrypted.mimeMsg=A mensagem que você está respondendo, contém partes não-criptografas junto a partes criptografadas. Algumas partes criptografadas não serão apresentadas a você.\n\nSe o remetente não foi capaz de descriptografar a parte originalmente ocultada, você poderá estar vazando informação confidencial que o remetente não foi capaz de descriptografar.\nNós recomendamos que você não responda esta mensagem, mas que crie uma nova mensagem contendo a sua resposta. msgCompose.partiallyEncrypted.inlinePGP=A mensagem que você está respondendo, contém partes não-criptografas junto a partes criptografadas. Se o remetente não foi capaz de descriptografar a parte originalmente ocultada, você poderá estar vazando informação confidencial que o remetente não foi capaz de descriptografar.\n\nPor Favor considere remover todos o texto entre aspas da sua resposta para este remetente. msgCompose.internalEncryptionError=Erro Interno: criptografia prometida desativada msgCompose.internalError=Um erro interno ocorreu. msgCompose.toolbarTxt.signAndEncrypt=Essa mensagem será assinada e encriptada msgCompose.toolbarTxt.signOnly=Essa mensagem será assinada msgCompose.toolbarTxt.encryptOnly=Essa mensagem será encriptada msgCompose.toolbarTxt.noEncryption=Esta mensagem terá removida a sua assinatura e criptografia msgCompose.toolbarTxt.disabled=Enigmail foi desabilitado para a identidade selecionada msgCompose.protectSubject.tooltip=Proteja o assunto da mensagem msgCompose.noSubjectProtection.tooltip=Não proteger o assunto da mensagem msgCompose.encryptedSubjectStub=Mensagem Criptografada msgCompose.protectSubject.dialogTitle=Habilitar a proteção do assunto? msgCompose.protectSubject.question=emails regulares criptografados contêm o assunto sem alteração\nNós criamos um padrão para esconder o assunto original da mensagem dentro da parte criptografada\ne substituímos com um texto padrão, de forma ao assunto só possa ser visto após o email ter sido descriptografado.\n\nVocê quer proteger o assunto nas mensagens criptografadas? msgCompose.protectSubject.yesButton=&Proteger o Assunto msgCompose.protectSubject.noButton=&Deixar o assunto desprotegido msgCompose.detailsButton.label=Detalhes... msgCompose.detailsButton.accessKey=D msgCompose.pepSendUnknown=Desconhecido msgCompose.pepSendUnsecure=Inseguro msgCompose.pepSendSecure=Seguro msgCompose.pepSendTrusted=Seguro & Confiável pep.alert.disabledForIdentity=p≡p está desativado pra a identidade atual. Por favor habilite p≡p via as preferências do Enigmail/p≡p . pep.alert.weakReply=Você está prestes a encaminhar ou responder a uma mensagem insegura. Se você escolher continuar, informações confidenciais podem ser vazadas, colocando você e seu parceiro de comunicações em risco. Tem certeza que deseja continuar? # note: should end with double newline: sendAborted=Operação de envio abortada.\n\n # details: keyNotTrusted=Não há confiança suficiente para a chave '%S' keyNotFound=Chave '%S' não encontrada keyRevoked=Chave '%S' revogada keyExpired=Chave '%S' expirada statPGPMIME=PGP/MIME statSMIME=S/MIME statSigned=ASSINADA statEncrypted=CRIPTOGRAFADA statPlain=TEXTO PURO offlineSave=Salvar %S mensagem para %S a pasta de Mensagens Não Enviadas? onlineSend=Enviar %S mensagem para %S? encryptKeysNote=Nota: a mensagem está criptografada com as seguintes Identidades / Chaves: %S hiddenKey= signFailed=Erro no Enigmail; Criptografia/assinatura falharam; enviar mensagem sem criptografia? msgCompose.button.sendUnencrypted=Enviar Mensagem &Sem Criptografia recipientsSelectionHdr=Selecione os Destinatários para Criptografia configureNow=Você ainda não configurou a segurança Enigmail para a identidade selecionada. Deseja fazer isto agora? # encryption/signing status and associated reasons: encryptMessageAuto=Criptografar a Mensagem (automático) encryptMessageNorm=Criptografar a Mensagem signMessageAuto=Assinar mensagem (automático) signMessageNorm=Assinar Mensagem encryptOff=Encriptação: DESLIGADA encryptOnWithReason=Encriptação: LIGADA (%S) encryptOffWithReason=Encriptação: DESLIGADA (%S) encryptOn=Encriptação: LIGADA signOn=Assinar: LIGADO signOff=Assinar: DESLIGADO signOnWithReason=Assinar: LIGADO (%S) signOffWithReason=Assinar: DESLIGADO (%S) reasonEnabledByDefault=Habilitar por padrão reasonManuallyForced=forçar manualmente reasonByRecipientRules=imposto pelas regras do destinatário reasonByAutoEncryption=forçado por auto encriptação reasonByConflict=devido a conflito nas regras do destinatário reasonByEncryptionMode=Devido ao modo de encriptação # should not be used anymore: encryptYes=A mensagem será criptografada encryptNo=A mensagem não será criptografada # should not be used anymore: signYes=A mensagem será assinada signNo=A mensagem não será assinada # PGP/MIME status: pgpmimeNormal=Protocolo: PGP/MIME inlinePGPNormal=Protocolo: Inline PGP smimeNormal=Protocolo: S/MIME pgpmimeAuto=Protocolo: PGP/MIME (automático) inlinePGPAuto=Protocolo: Inline PGP (automático) smimeAuto=Protocolo: S/MIME (automático) # should not be used anymore pgpmimeYes=PGP/MIME será usado pgpmimeNo=Será usado Inline PGP # Attach own key status (tooltip strings): attachOwnKeyNo=A sua chave não será anexada attachOwnKeyYes=A sua chave será anexada attachOwnKeyDisabled=A sua própria chave não pode ser anexada. Você tem que selecionar uma chave específica\nna seção de configuração de conta do OpenPGP para habilitar esta funcionalidade. rulesConflict=Detectadas regras por destinatário conflitantes\n%S\n\nEnviar a mensagem com estas configurações? msgCompose.button.configure=&Configurar msgCompose.button.send=Enviar Men&sagem msgCompose.button.save=&Salvar Mensagem # Strings in enigmailMsgHdrViewOverlay.js keyNeeded=Chave pública %S necessária para verificar assinatura keyUsed=A chave pública %S foi usada para verificar a assinatura clickDecrypt=; clique o botão Descriptografar clickDecryptRetry=; clique o botão Descriptografar para tentar novamente clickDetailsButton=; clique no botão 'Detalhes' para mais informações clickImportButton=; clique no botão 'Importar chave' para importar a chave keyTypeUnsupported=;o tipo de chave não é suportado pela sua versão de GnuPG msgPart=Parte da mensagem %S msgSigned=assinada msgSignedUnkownKey=assinada com uma chave desconhecida msgEncrypted=criptografada msgSignedAndEnc=assinada e criptografada unverifiedSig=Assinatura não verificada incompleteDecrypt=Descriptografia incompleta needKey=Erro - chave secreta necessária para descriptografar a mensagem failedDecrypt=Erro - descriptografia falhou badPhrase=Erro - senha incorreta failedDecryptVerify=Erro - descriptografia/verificação falhou mdcError=Erro - a mensagem não tinha a sua integridade protegida viewInfo=; Ver > Informações de Segurança da Mensagem para detalhes decryptedMsg=Mensagem descriptografada decryptedMsgWithFormatError=Mensagem desencriptada (restaurado o PGP quebrado no email, provavelmente causado por um servidor Exchange antigo, então o resultado pode não ser ideal para a leitura) usedAlgorithms=Algoritmos usados: %1$S e %2$S pepStatusInfo.text=p≡p Estado da Mensagem. pepStatusInfo.title.m3=Sob Ataque pepStatusInfo.info.m3=Esta mensagem não é segura e foi adulterada. pepStatusInfo.title.m1=Não-confiável pepStatusInfo.info.m1=Esta mensagem tem um parceiro de comunicação que préviamente foi marcado como não-confiável pepStatusInfo.title.r0=Desconhecido pepStatusInfo.info.r0=Esta mensagem não contém informação suficiente para determinar se ela é segura. pepStatusInfo.title.r1=Não é possível descriptografar pepStatusInfo.info.r1=Esta mensagem não pôde ser descriptografada devido a chave não estar disponível. pepStatusInfo.title.r2=Não foi possível descriptografar pepStatusInfo.info.r2=A mensagem não pôde ser descriptografada devido a ausência da chave. pepStatusInfo.title.r3=Inseguro pepStatusInfo.info.r3=Esta mensagem é insegura. pepStatusInfo.title.r4=Inseguro para alguns pepStatusInfo.info.r4=Esta mensagem é insegura para alguns parceiros de comunicação. pepStatusInfo.title.r5=Segurança não-confiável pepStatusInfo.info.r5=Esta mensagem não possui uma proteção confiável. pepStatusInfo.title.r6=Seguro... pepStatusInfo.info.r6=Esta mensagem é segura mas você precisa verificar a identidade do parceiro de comunicação. pepStatusInfo.title.r7=Seguro & Confiável pepStatusInfo.info.r7=Esta mensagem é segura e confiável. pepStatusInfo.color.green=Verde pepStatusInfo.color.yellow=Amarelo pepStatusInfo.color.red=Vermelho pepRevokeTrust.question=Você realmente deseja cancelar a confiança em %S ? pepRevokeMistrust.question=Você realmente quer confiar novamente na chave para %S ? pepRevokeTrust.doRevoke=Cancelar &trust wksConfirmationReq=Confirmada a Requisição ao diretório de chaves Web wksConfirmationReq.message=Esta mensagem foi enviada para o seu provedor de mail para confirmar a instalação da sua chave pública OpenPGP\nno Diretório de chaves Web.\nDisponibilizar a sua chave pública ajuda outros a encontrar a sua chave e desta forma possibilitar que criptografem mensagem para você.\n\nSe você quiser disponibilizar a sua chave no diretório de chaves Web agora, por favor clique no botão "Confirmar Requisição" na barra de estado.\nCaso contrário, simplesmente ignore esta mensagem. wksConfirmationReq.button.label=Confirmar a requisição autocryptSetupReq=Criar configurações para Auto-encriptação autocryptSetupReq.button.label=Configurar agora autocryptSetupReq.setupMsg.desc=Esta mensagem contém toda a informação necessária para transferir suas configurações de Autocriptografia juntamente com sua senha secreta de forma segura do seu dispositivo original. autocryptSetupReq.setupMsg.backup=Você pode manter esta mensagem e usá-la como cópia de segurança para a sua chave secreta. Se você quiser fazer isto, você deve anotar a senha e armazená-la de forma segura. autocryptSetupReq.message.import=Para importar as configurações e chave(s) no Enigmail, por favor clique no botão "Iniciar Configuração" na barra de estado. autocryptSetupReq.message.sent=Por favor clique na mensagem em seu novo dispositivo e siga as instruções para importar as configurações. # strings in pref-enigmail.js oldGpgVersion20=A inicialização do Enigmail falhou.\n\nVocê está utilizando o GnuPG versão %1$S, que não é mais suportada. O Enigmail necessita da GnuPG versão %2$S ou mais recente. Por favor atualize a sua instalação do GnuPG, ou o Enigmail não irá funcionar. locateGpg=Localizar o programa GnuPG invalidGpgPath=O GnuPG não pode ser executado com o caminho fornecido. Logo, o Enigmail será desativado até que o caminho para o GnuPG seja alterado novamente ou até que a aplicação seja reiniciada. warningsAreReset=Todos os avisos de erro foram reinicializados. prefs.gpgFound=GnuPG foi encontrado em %S prefs.gpgNotFound=Não foi possível encontrar o GnuPG prefs.warnAskNever=Aviso: ativar esta opção fará com que os emails sejam enviados sem criptografia sem nenhum tipo de aviso caso não existe a chave correspondente para um dos destinatários -- o Enigmail não irá informá-lo se isto ocorrer! prefs.warnIdleTimeForUnknownAgent=O seu sistema utilizar uma ferramenta especial para obter senhas, como o gnome-keyring ou seahorse-agent. Infelizmente o Enigmail não pode controlar o timeout para entrara de senhas na ferramenta que você está utilizando. Logo, os tempos definidos para timeout no Enigmail serão ignorados. prefEnigmail.oneKeyserverOnly=Erro - você pode especificar apenas um servidor de chaves para baixar automaticamente as chaves OpenPGP que estiverem faltando. # Strings used in core.jsm # (said file also re-uses some strings from above) enterAdminPin=Digite o ADMIN PIN do SmartCard enterCardPin=Digite o PIN do SmartCard notInit=Erro - Serviço Enigmail não foi inicializado badCommand=Erro - comando de criptografia falhou cmdLine=linha de comando e saída: notRequired=Erro - criptografia não é necessária notComplete=Erro - geração de chave não completada invalidEmail=Erro - endereço(s) de email inválido(s) noPassphrase=Erro - nenhuma senha fornecida noPGPblock=Erro - Bloco de dados PGP-armor válido não encontrado unverifiedReply=Parte da mensagem indentada (resposta) provavelmente foi alterada keyInMessageBody=Foi encontrada uma chave no corpo da mensagem. Clique em 'Importar Chave' para importar a chave sigMismatch=Erro - Assinatura não confere cantImport=Erro ao importar chave pública\n\n doImportOne=Importar %1$S (%2$S)? doImportMultiple=Importar as seguintes chaves?\n\n%S previewFailed=Não consigo ler o arquivo da chave pública. # Strings used in errorHandling.jsm sc.wrongCardAvailable=O SmartCard %S que foi encontrado em sua leitora não pode ser utilizado para processar a mensagem.\nPor favor insira o SmartCard %S e repita a operação. sc.insertCard=A operação necessita do SmartCard %S.\nPor favor insira o SmartCard solicitado e repita a operação. sc.removeCard=A operação não necessita de um SmartCard na leitora.\nPor favor remova o seu SmartCard e repita a operação. sc.noCardAvailable=Não foi possível encontrar um SmartCard válido na sua leitora\nPor favor insira o SmartCard e repita a operação. sc.noReaderAvailable=A sua leitora de SmartCard não pode ser acessada\nPor favor conecte a sua leitora de SmartCard reader, insira o cartão e repita a operação. keyError.keySpecNotFound=O endereço de mail "%S" não casa com a chave na sua cadeia de chaves. keyError.keyIdNotFound=A chave configurada de ID "%S" não pôde ser encontrada na sua lista de chaves. keyError.resolutionAction=Por favor selecione uma chave vãlida na seção OpenPGP das configurações da sua conta. missingPassphrase=Senha não preenchida errorHandling.gpgAgentInvalid=Seu sistema está utilizando uma versão do agente pgp que não está adaptado para funcionar com a sua versão de GnuPG. errorHandling.gpgAgentError=GnuPG avisou sobre um erro de comunicação com o gpg-agente ( um componente do GnuPG). errorHandling.dirmngrError=GnuPG avisou sobre um erro de comunicação com o dirmngr ( um componente do GnuPG). errorHandling.pinentryError=GnuPG não pode consultar sua senha via pinentry. errorHandling.readFaq=Esta é uma configuração do sistema ou algum erro de configuração que impede o Enigmail de funcionar corretamente e não pode ser corrigido automaticamente.\n\nNós recomendamos fortemente que você consulte o nosso site web de suporte através do endereço https://enigmail.net/faq. gpgNotFound=Não foi possível localizar o programa do GnuPG '%S'.\nCertifique-se de que o caminho do executável do GnuPG esteja configurado corretamente nas Preferências do Enigmail. gpgNotInPath=Não foi possível localizar o executável do GnuPG no PATH.\nCertifique-se de que você definiu o caminho correto para o executável do GnuPG nas Preferências do Enigmail. enigmailNotAvailable=O Serviço principal do Enigmail não está disponível prefGood=Assinatura válida de %S prefBad=Assinatura INVÃLIDA de %S failCancel=Erro - Recebimento de chave cancelado pelo usuário failNoServer=Erro - Nenhum servidor de chaves especificado para receber chave failNoID=Erro - Nenhuma identidade de chave especificada para se receber chave failKeyExtract=Erro - comando de extração de chave falhou notFirstBlock=Erro - Primeiro bloco OpenPGP não é o bloco de chave pública importKeyConfirm=Importar chave(s) pública(s) contidas na mensagem? failKeyImport=Erro - importação de chave falhou fileWriteFailed=Falha ao escrever no arquivo %S importKey=Importar chave pública %S do servidor de chaves: uploadKey=Enviar chave pública %S para o servidor de chaves: keyId=ID da Chave keyAndSigDate=ID da Chave: 0x%S / Assinada em: %S keyFpr=Impressão digital da Chave: %S noEmailProvided=Você não forneceu um endereço de email! keyAlreadySigned=A chave já está assinada, você não pode assiná-la duas vezes. ##################################################################### # Strings used in enigmailKeySelection.js ##################################################################### selKeyExpired=expirada em %S createdHeader=Criada em atLeastOneKey=Nenhuma chave selecionada! Você precisa selecionar pelo menos uma chave para aceitar este diálogo fewerKeysThanRecipients=Você selecionou um número de chaves menor que o número de destinatários. Você tem certeza de que a lista de chaves de criptografia está completa? userSel.button.goBack=Selecionar mais chaves userSel.secretKeySel.title=Selecionar uma Chave Secreta OpenPGP para Assinar Suas Mensagens userSel.problemNoKey=Chave inválida userSel.problemMultipleKeys=Multiplas chaves # should be same as thunderbird ENTITY sendLaterCmd.label: sendLaterCmd.label=Enviar depois # Strings used in enigmailAttachmentDialog.js pgpMimeNote=NOTA: PGP/MIME só é suportado por um número limitado de clientes de email. Se você não tem certeza, selecione a opção %S. first=primeiro second=segundo # Strings used in am-enigprefs.js / enigmailEditIdentity.js encryptKeyHeader=Selecione a Chave OpenPGP para Criptografia identityName=Identidade: %S switchPepMode=Se você estiver utilizando o modo 'p≡p Junior' do Enigmail.\n\nAo habilitar o suporte ao OpenPGP ou ao S/MIME para uma conta, você estará desabilitando p≡p e utilizando usará o modo 'regular' do Enigmail sem p≡p. enableEnigmail=&Desabilitando p≡p # Strings used in enigmailSingleRcptSettings.js noEncryption=Você ativou a criptografia, mas não selecionou uma chave. Para poder criptografar emails enviados para %S, você precisa especificar uma ou mais chaves válidas a partir de sua relação de chaves. Você deseja desabilitar a criptografia para %S? noKeyToUse=(nenhuma - sem criptografia) noEmptyRule=A Regra não pode ser vazia! Por favor defina um endereço de email no campo de Regra. invalidAddress=O(s) endereço(s) de email que você entrou não são válidos. Você não deve definir os nomes dos destinatários, apenas os endereços de email. Por exemplo:\nInválido: Fulano \nVálido: fulano.qualquer@endereco.net noCurlyBrackets=As chaves {} possuem um significado especial e não devem ser usadas em endereços de email. Se você quiser modificar o respectivo comportamento para esta regra, utilizar a opção 'Aplicar esta regra caso o destinatário ...'.\nMais informações estão disponíveis no botão Ajuda. # Strings used in enigmailRulesEditor.js never=Nunca always=Sempre possible=Possível deleteRule=Deseja apagar a regra selecionada? nextRcpt=(Próximo destinatário) negateRule=Não addKeyToRule=Acrescentar a chave %S (%S) à regra por destinatário # Strings used in enigmailSearchKey.js needOnline=A funão que você selecionou não está disponível em modo offline. Por favor vá para o modo online e tente novamente. protocolNotSupported=O protocolo '%S://' que você selecionou não é suportado para baixar chaves OpenPGP. gpgkeysDisabled=Talvez ajude habilitar a opção 'extensions.enigmail.useGpgKeysTool'. noKeyserverConn=Não foi possível conectar ao servidor de chaves em %S. keyDownloadFailed=Falha ao baixar chave do servidor de chaves. Mensagem de status é:\n%S internalError=Um erro interno ocorreu. As chaves não puderam ser baixadas ou importadas. noKeyFound=Desculpe, não pude encontrar nenhuma resultado que atenda aos parâmetros de busca especificados.\nVerifique se os ID's de chave estão prefixados com \\"0x\\" (ex: 0xABCDEF12). keyDownload.keyUnavailable=Lamentamos, mas a chave com o ID %S não está disponível no servidor de chaves. É provavel que o proprietário da chave não tenha a enviado para o servidor de chaves.\n\nPor favor peça ao remetente da mensagem que lhe envie a chave por email. # gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. gpgKeysFailed=Falha ao buscar ou baixar chave do servidor de chaves: gpgkeys_%S não pode ser executado. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Falha ao definir o nível de confiança # Strings in enigmailSignKeyDlg.js signKeyFailed=Assinatura de chave falhou alreadySigned.label=Nota: a chave %S já está assinada com a chave secreta selecionada. alreadySignedexportable.label=Nota: a chave %S já está marcada como sendo exportável com a chave privada selecionada. Não faz sentido utilizar uma assinatura local. partlySigned.label=Nota: alguns logins da chave %S estão já assinalados com a chave secreta selecionada. noTrustedOwnKeys=nenhuma chave candidata foi encontrada para assinar! Você precisa de ao menos uma chave privada totalmente confiável para poder assinar chaves. # Strings in enigmailKeyManager.js keyMan.loadingKeys=Carregando chaves, por favor aguarde ... keyValid.unknown=desconhecida keyValid.invalid=inválida keyValid.disabled=desabilitada keyValid.revoked=revogada keyValid.expired=expirada keyValid.noSubkey=nenhuma sub-chave válida keyTrust.untrusted=não-confiável keyTrust.marginal=mínima keyTrust.full=confiável keyTrust.ultimate=total keyTrust.group=(grupo) keyType.public=pub keyType.publicAndSec=pub/sec keyMan.enableKey=Habilitar Chave keyMan.disableKey=Desabilitar Chave userAtt.photo=Atributo de Usuário (imagem JPEG) asciiArmorFile=ASCII Seguro importKeyFile=Importar Arquivo de Chave OpenPGP gnupgFile=Arquivos do GnuPG createKeyOK=Sua chave foi gerada saveRevokeCertAs=Criar e Salvar Certificado de Revogação revokeCertOK=O certificado de revogação foi criado com sucesso. Você pode utilizá-lo para invalidar a sua chave pública, exemplo: no caso de ter perdido a sua chave secreta. revokeCertFailed=O certificado de revogação não pode ser criado. addUidOK=ID de Usuário acrescentado com sucesso addUidFailed=Falha ao acrescentar ID de usuário noKeySelected=Você deve escolher pelo menos uma chave para poder executar a operação desejada exportToFile=Exportar Chave Pública para Arquivo exportKeypairToFile=Exportar as chaves secretas e públicas para arquivo exportSecretKey=Você deseja incluir a chave secreta no arquivo de chaves OpenPGP a ser salvo? saveKeysOK=As chaves foram salvas com sucesso saveKeysFailed=Falha ao salvar as chaves importKeysFailed=Falha ao importar as chaves enableKeyFailed=Falha ao habilitar/desabilitar as chaves specificPubKeyFilename=%S (0x%S) pub specificPubSecKeyFilename=%S (0x%S) pub-sec defaultPubKeyFilename=Chaves-públicas-exportadas defaultPubSecKeyFilename=Chaves-públicas-e-secretas-exportadas noSecretKeys=Nenhuma chave secreta foi encontrada.\n\nDeseja gerar a sua chave agora? sendKeysOk=Chave(s) enviada(s) com sucesso sendKeysFailed=Envio de chaves falhou receiveKeysOk=Chave(s) atualizadas com sucesso receiveKeysFailed=Baixa de chaves falhou importFromClip=Você deseja importar chaves a partir do clipboard? importFromUrl=Baixe a chave pública nesta URL: copyToClipbrdFailed=Não foi possível copiar a(s) chave(s) selecionadas para o clipboard. copyToClipbrdOK=Chave(s) copiadas para o clipboard deleteSecretKey=AVISO: Você está prestes a remover uma chave secreta!\nSe você apagar a sua chave secreta, não será mais possível descriptografar nenhuma mensagem criptografada com esta chave,e não será mais possível revogá-la também.\n\nVocê realmente quer apagar AMBAS as chaves secreta e pública\n'%S'? deleteMix=AVISO: Você está prestes a apagar as chaves secretas!\nSe você apagar a sua chave secreta, não será mais possível descriptografar nenhuma mensagem criptografada com esta chave.\n\nVocê realmente quer apagar AMBAS as chaves secreta e pública selecionadas? deletePubKey=Você quer apagar a chave pública\n'%S'? deleteSelectedPubKey=Você quer apagar as chaves públicas? deleteKeyFailed=A chave não pode ser removida. revokeKeyQuestion=Você está prestes a revogar a chave '%S'.\n\nNão será mais permitido assinar utilizando esta chave, e uma vez distribuída, outros também não serão mais permitidos criptografar utilizando eta chave. Você ainda poderá usar esta chave para descriptografar mensagens antigas.\n\nDeseja continuar? revokeKeyOk=A chave foi revogada. Se a sua chave está disponível em um servidor de chaves, é recomendado que você reenvie-a para que outros usuários vejam a revogação. revokeKeyFailed=A chave não pode ser revogada. revokeKeyNotPresent=Você não tem chave (0x%S) que se encaixe neste cerificado de revogação!\n\nSe você perdeu a sua chave, você precisa importá-lo (ex: de um servidor de chaves) antes de revogar o certificado! revokeKeyAlreadyRevoked=A chave 0x%S já foi revogada anteriormente. refreshAllQuestion=Você não selecionou uma chave. Você quer atualizar TODAS as chaves? refreshKeyServiceOn.warn=Aviso: Suas chaves estão sendo atualizadas em segundo plano o mais seguro quão é possível.\nAtualizar todas as suas chaves de uma só vez irá revelar informação acerca de você de forma desnecessária.\nVocê quer realmente fazer isto? refreshKey.warn=Aviso: dependendo do número de chaves e da velocidade da sua conexão, atualizar todas as chaves pode ser um processo bem demorado! downloadContactsKeys.warn=Aviso: dependendo do número de contatos e da velocidade de sua conexão, baixar todas as chaves pode ser um processo demorado! downloadContactsKeys.importFrom=Importar contatos do livro de endereços '%S'? keyMan.button.exportSecKey=&Exportar Chaves Secretas keyMan.button.exportPubKey=Exportar Apenas Chaves &Públicas keyMan.button.import=&Importar keyMan.button.refreshAll=Atualiza&r Todas as Chaves keyMan.button.revokeKey=&Revogar Chave keyMan.button.skip=&Pular Chave keylist.noOtherUids=Não possui outras identidades keylist.hasOtherUids=Também conhecido como keylist.noPhotos=Foto não disponível keylist.hasPhotos=Fotos keyMan.addphoto.filepicker.title=Selecionar foto para acrescentar keyMan.addphoto.warnLargeFile=O arquivo que você escolheu é maior que 25kb.\nNão é recomendado acrescentar arquivos de foto muito grandes, pois as chaves se tornarão igualmente grandes. keyMan.addphoto.noJpegFile=O arquivo selecionado não parece ser um arquivo JPEG. Escolha outro tipo de arquivo. keyMan.addphoto.failed=A foto não pode ser acrescentada. noWksIdentity=A chave %S não tem uma identidade WKS. keyman.addBlacklistKey.msg=Você realmente quer parar p≡p de usar a chave "%1$S (%2$S)" para criptografar as mensagens? keyman.removeBlacklistKey.msg=Você deseja permitir que p≡p use a chave "%1$S (%2$S)" para as futuras mensagens? keyman.addBlacklistKey.button=Colocar a chave na &Lista negra keyman.removeBlacklistKey.button=&Remover a chave da lista negra # Strings in enigmailManageUidDlg.xul changePrimUidFailed=Falha ao alterar o ID de usuário primário changePrimUidOK=O ID de usuário primário foi alterado com sucesso revokeUidFailed=Falha ao revogar o ID de usuário %S revokeUidOK=O ID de usuário %S foi revogado com sucesso. Caso a sua chave esteja disponível em um servidor de chaves, é recomendável reenviá-la, para que outros possam ver que foi revogado. revokeUidQuestion=Você realmente deseja revogar o ID de usuário %S? # Strings in enigmailKeyImportInfo.xul importInfoTitle=SUCESSO! Chaves importadas importInfoBits=Bits importInfoCreated=Criado importInfoFpr=Impressão digital importInfoDetails=(Detalhes) importInfoNoKeys=Nenhuma chave importada. # Strings in enigmailKeyDetailsDlg.xul keyTypePublic=chave pública keyTypePrimary=chave primária keyTypeSubkey=sub-chave keyTypePair=par de chaves keyExpiryNever=nunca keyAlgorithm_1=RSA keyAlgorithm_2=RSA keyAlgorithm_3=RSA keyAlgorithm_16=ELG keyAlgorithm_17=DSA keyAlgorithm_18=ECDH keyAlgorithm_19=ECDSA keyAlgorithm_20=ELG keyAlgorithm_22=EDDSA keyUsageEncrypt=Criptografar keyUsageSign=Assinar keyUsageCertify=Certificar keyUsageAuthentication=Autenticação keyDoesNotExpire=A chave não expira # Strings in enigmailGenCardKey.xul keygen.started=Por favor aguarde enquanto a chave está sendo gerada .... keygen.completed=Chave Gerada. O novo ID da Chave é: 0x%S keygen.keyBackup=Uma cópia de segurança da chave foi salva como %S keygen.passRequired=Por favor especifique uma senha para criar uma cópia de segurança de sua chave fora de seu SmartCard. # Strings in enigmailSetCardPin.xul cardPin.processFailed=Falha ao trocar o PIN # Strings in enigRetrieveProgres.xul keyserverProgress.refreshing=Atualizando chaves, por favor aguarde ... keyserverProgress.uploading=Enviando chaves, por favor aguarde ... keyserverProgress.wksUploadFailed=Não foi possível enviar a sua chave para o serviço de chaves Web keyserverProgress.wksUploadCompleted=A sua chave publica foi enviada com sucesso ao seu provedor. Você receberá um email para confirmar que foi feito o envio. keyserverTitle.refreshing=Atualizar Chaves keyserverTitle.uploading=Envio de Chaves # Strings in enigmailSetupWizard passphrase.min8keys=Sua senha deve conter pelo menos 8 caracteres! setupWizard.reallyCancel=Você realmente deseja cancelar o Assistente de Configuração do Enigmail? setupWizard.invalidGpg=O arquivo que você especificou não é um executável do GnuPG. Especifique um arquivo diferente. setupWizard.specifyFile=Você precisa escolher pelo menos um arquivo de chave pública para continuar. setupWizard.installFailed=Parece que a instalação não obteve êxito. Tente instalar novamente, ou instale o GnuPG manualmente e localize-o com o botão "Localizar". setupWizard.downloadForbidden=Para a sua segurança, nós não vamos baixar o GnuPG. Por favor visite https://gnupg.org/ para baixar o GnuPG. setupWizard.downloadImpossible=Não é possível baixar o GnuPG agora. Tente mais tarde ou navegue em https://gnupg.org/ para poder baixar o GnuPG. setupWizard.hashSumError=O assistente não conseguiu verificar a integridade do arquivo baixado. O arquivo pode estar corrompido ou ter sido manipulado. Deseja continuar a instalação mesmo assim? setupWizard.importSettingsFile=Escolha de onde será carregado o arquivo de cópia de segurança setupWizard.invalidSettingsFile=O arquivo especificado não é um arquivo de segurança das configurações do Enigmail. setupWizard.gpgConfExists=Há um arquivo de configuração existente do GnuPG. Deseja sobrescrever com o arquivo da sua instalação antiga? setupWizard.noGpgHomeDir=Parece que você configurou %S para usar o GnuPG. Contudo, este não é um diretório - você não pode utilizá-lo setupWizard.unmachtedIds=As seguintes identidades da sua antiga configuração não puderam ser encontradas:\n%S\nAs configurações para estas identidades serão ignoradas. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=Um erro aconteceu ao tentar baixar o GnuPG. Verifique o log de erros para mais detalhes. installGnuPG.installFailed=Um erro ocorreu ao instalar o GnuPG. Verifique o log de erros para mais detalhes. # Strings in enigmailAddUidDlg.xul addUidDlg.nameOrEmailError=Você precisa preencher um nome e um endereço de email addUidDlg.nameMinLengthError=O nome precisa ter pelo menos 5 caracteres addUidDlg.invalidEmailError=Você deve especificar um endereço de email válido # Strings in enigmailCardDetails.js Carddetails.NoASCII=OpenPGP Smartcards suporta apenas caracteres ASCII em Nome/Sobrenome. # network error types errorType.SecurityCertificate=O certificado de segurança apresentado pelo web service não é mais válido. errorType.SecurityProtocol=O protocolo de segurança utilizado pelo web service é desconhecido. errorType.Network=Ocorreu um erro de rede. # filter stuff filter.folderRequired=Você deve selecionar o diretório desejado filter.decryptMove.label=Descriptografar permanentemente (Enigmail) filter.decryptCopy.label=Criar uma Copia decriptada (Enigmail) filter.decryptMove.warnExperimental=Alerta - a ação do filtro "descriptografar permanentemente" pode levar a destruição de mensagens.\n\nNós recomendamos fortemente que primeiro tente usar o filtro "Criar cópia descriptografada", teste o resultado com cuidado, e apenas começe a utilzar este filtro caso o resultado tenha sido satisfatório. filter.tempPepFilterDesc=temporariamente o filtro para a loja enviou a mensagem sem estar criptografada filter.term.pgpencrypted.label=Criptografado por OpenPGP filter.encrypt.label=Encriptografar para a chave (Enigmail) filter.keyRequired=Você precisa selecionar uma chave do destinatário. filter.keyNotFound=Não foi possível encontrar uma chave de encriptação para "%S". filter.warn.keyNotSecret=Aviso - o filtro de ação "Encriptar para a chave" substitui os recipientes.\n\nSe você não possuir a chave secreta para "%S" vocÊ não poderá mais poder ler os mails. # strings in enigmailConvert.jsm converter.decryptBody.failed=Não foi possível descriptografar a mensagem com o assunto\n"%S".\nVocê quer tentar novamente com uma senha diferente ou quer abandonar a mensagem? converter.decryptAtt.failed=Não foi possível descriptografar o anexo "%1$S"\nda mensagem cujo assunto é\n"%2$S".\nVocê deseja tentar novamente com outra senha ou quer desistir da mensagem? saveLogFile.title=Salvar Arquivo de Log # strings in gpg.jsm unknownSigningAlg=Algoritmo de assinatura desconhecido (ID: %S) unknownHashAlg=Hash de criptografia desconhecido (ID: %S) # strings in keyRing.jsm keyring.photo=Foto keyRing.pubKeyRevoked=A chave %1$S (ID da chave: %2$S) foi revogada. keyRing.pubKeyExpired=A chave %1$S (ID da chave %2$S) expirou. keyRing.pubKeyNotForSigning=A chave %1$S (ID da chave: %2$S) não pode ser utilizada para assinar. keyRing.pubKeyNotForEncryption=A chave %1$S (ID da chave: %2$S) não pode ser utilizada para criptografar. keyRing.keyDisabled=A chave %1$S (ID da chave: %2$S) foi desabilitada; ela não poderá ser usada. keyRing.keyNotTrusted=A chave %1$S (ID da chave: %2$S) não é confiável o bastante. Por favor ajuste o nível de confiança da sua chave para "ultimate" para poder usá-la para assinar. keyRing.keyInvalid=A chave %1$S (ID da chave: %2$S) não é válida. Por favor, considere verificar corretamente a chave. Use alternativamente a opção "Configurações de criptografia convenientes". keyRing.signSubKeysRevoked=Todas a sub-chaves assinadas da chave %1$S (ID da chave: %2$S) foram revogadas. keyRing.signSubKeysExpired=Todas a sub-chaves assinadas da chave %1$S (ID da chave: %2$S) Expiraram. keyRing.signSubKeysUnusable=Todas as sub-chaves assinadas da chave %1$S (ID da chave:%2$S) foram revogadas, expiradas ou foram inutilizadas. keyRing.encSubKeysRevoked=Todas as sub-chaves criptografadas da chave %1$S (ID da chave:%2$S) foram revogadas. keyRing.encSubKeysExpired=Todas as sub-chaves criptografadas da chave %1$S (ID da chave:%2$S) expiraram. keyRing.noSecretKey=Aparentemente você parece não possuir a chave secreta para %1$S (ID da chave:%2$S) na sua lista de chaves; você não pode usar a chave para assinar. keyRing.encSubKeysUnusable=Todas as sub-chaves criptografadas da chave %1$S (ID da chave:%2$S) foram revogadas, expiradas ou foram inutilizadas. #strings in exportSettingsWizard.js cannotWriteToFile=Não foi possível salvar o arquivo '%S'. Por favor selecione um arquivo diferente. dataExportError=Um erro occorreu durante a exportação dos seus dados. enigmailSettings=Configurações do Enigmail defaultBackupFileName=Enigmail-Exportar specifyExportFile=Especifique o nome do arquivo para exportação homedirParamNotSUpported=Parâmetros adicionais para configurar o caminho. como o --homedir e o --keyring não são suportados para exportação/recuperação das suas configurações. Por favor utilize métodos alternativos como o ajuste da variável de ambiente GNUPGHOME. #strings in expiry.jsm expiry.keyExpiresSoon=Sua chave %1$S vai expirar em menos do que %2$S dias.\n\nNós recomendamos que você crie um novo par de chaves e configure as contas correspondentes para usar a nova chave. expiry.keysExpireSoon=As seguintes chaves que você possue irão expirar em menos que %1$S dias:\n%2$S Nós recomendamos que você crie novas chaves e configure as suas contas para utilizar novas chaves. expiry.keyMissingOwnerTrust=Sua chave secreta %S perdeu a confiabilidade.\n\nNós recomendamos que você configure "Sua confiança nos certificados" para Ultimate nas propriedades da chave. expiry.keysMissingOwnerTrust=As seguintes chaves secretas que você possue perderam a confiança.\n%S.\nRecomendamos que ajuste "Você confia nos certificações" para definir as propriedades da chave. expiry.OpenKeyManager=Abrir o gerenciador de chaves do Enigmail expiry.OpenKeyProperties=Abrir as propriedades da Chave #strings in pEpDecrypt.jsm pEpDecrypt.cannotDecrypt=Esta é uma mensagem criptografada. Infelizmente você não tem o chave privada para descriptografar a mensagem. #strings in gpgAgent.jsm gpghomedir.notexists=O diretório '%S' contendo a sua chave OpenPGP não existe e não pode ser criado. gpghomedir.notwritable=Não há permissão de escrita para o diretório '%S' que contém as suas chaves OpenPGP. gpghomedir.notdirectory=O diretório '%S' que contém suas chaves OpenPGP é um arquivo invês de ser um diretório. gpghomedir.notusable=Por Favor corrija as permissões do diretório ou altere a localização do diretório "home" do seu GnuPG. GnuPG nãopoderá funcionar de outra forma. #strings in pepTrustWords.js pepTrustWords.cannotVerifyOwnId=As palavras-confiáveis p≡p para a própria conta não puderam ser verificadas. pepTrustWords.cannotFindKey=Não foi encontrada a chave para %S. pepTrustWords.cannotStoreChange=Não foi possível alterar a confiança em %S. pepTrustWords.generalFailure=Palavras confiáveis não podem ser obtidas para %S. pepTrustWords.partnerFingerprint=Impressão Digital para %S: #strings in mimeWkdHandler.jsm wkdMessage.body.req=O seu provedor de mais processou a sua requisição para envio da sua chave pública para o diretório de chaves web do OpenPGP.\n\nPor favor clique no botão de confirmar do cabeçalho do Enigmail para completar a publicação da sua chave pública. wkdMessage.body.process=Este é um email sobre o processamento automático para enviar a sua chave pública para o Diretório de chaves OpenPGP da Web.\n\nVocê não precisa tomar nenhuma atitude agora. #strings in pepHandshake.js pepPrivacyStatus.RatingBrokenSuggestion=Ou você ou o remetente deve reenviar a mensagem. pepPrivacyStatus.RatingHaveNoKeySuggestionOutgoing=Se você criou esta mensagem, sua chave não está disponível. pepPrivacyStatus.RatingMistrustSuggestion=Re-estabeleça a conexão com seu parceiro de comunicação e tente completar outra negociação. pepPrivacyStatus.RatingReliableSuggestion=Complete a negociação com o seu parceiro de comunicação através da troca de trustwords pessoalmente ou pelo telefone. A negociação é necessária apenas uma única vez para cada parceiro e serve para garantir a comunicação de forma segura e confiável. pepPrivacyStatus.RatingTrustedSuggestion=Nenhuma ação se faz necessária! pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Cuidado! esta mensagem pode não ser segura. pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Por favor adicione as informações necessárias. pepPrivacyStatus.RatingUnderAttackSuggestion=verifique a parte o conteúdo da mensagem com o seu parceiro de comunicação. pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Garanta que o estado da segurança para cada um dos parceiros de comunicação listados esteja ao menos em seguro. pepPrivacyStatus.RatingUnencryptedSuggestion=Por favor peça ao seu parceiro de comunicação para utilizar uma solução de criptografia ou instalar o p≡p. pepPrivacyStatus.RatingUnreliableSuggestion=Esta mensagem não possui uma criptografia confiável ou não possue uma assinatura. Peça ao seu parceiro de comunicação para atualizar a sua solução criptográfica ou intalar o p≡p. pepPrivacyStatus.RatingBrokenExplanation=Esta mensagem tem criptografia danificada ou formato inválido. pepPrivacyStatus.RatingHaveNoKeyExplanation=Esta mensagem não pôde ser descriptografada porque a chave não está disponível. pepPrivacyStatus.RatingMistrustExplanation=Esta mensagem tem um parceiro de comunicação que previamente foi marcado como não-confiável. pepPrivacyStatus.RatingReliableExplanation=Esta mensagem é segura mas você precisa verificar a identidade do seu parceiro de comunicação. pepPrivacyStatus.RatingTrustedExplanation=Esta mensagem é segura e confiável. pepPrivacyStatus.RatingUndefinedExplanation=Esta mensagem não contém informação suficiente para determinar se é segura. pepPrivacyStatus.RatingUnderAttackExplanation=Esta mensagem não é segura e foi adulterada. pepPrivacyStatus.RatingUnencryptedExplanation=Esta mensagem é insegura. pepPrivacyStatus.RatingUnencryptedForSomeExplanation=Esta mensagem é insegura para alguns parceiros de comunicação. pepPrivacyStatus.RatingUnreliableExplanation=Esta mensagem não tem uma proteção confiável. pepPrivacyStatus.RatingBrokenText=Quebrado pepPrivacyStatus.RatingHaveNoKeyText=Não foi possível descriptografar pepPrivacyStatus.RatingMistrustText=Não-confiável pepPrivacyStatus.RatingReliableText=Seguro pepPrivacyStatus.RatingTrustedText=Seguro & Confiável pepPrivacyStatus.RatingUndefinedText=Desconhecido pepPrivacyStatus.RatingUnderAttackText=Sob Ataque pepPrivacyStatus.RatingUnencryptedForSomeText=Inseguro para alguns pepPrivacyStatus.RatingUnencryptedText=Inseguro pepPrivacyStatus.RatingUnreliableText=Segurança não-confiável handshakeDlg.button.initHandshake=Negociação... handshakeDlg.button.stopTrust=Parar Confiança handshakeDlg.button.reTrust=Pare de desconfiar handshakeDlg.label.outgoingMessage=Enviando mensagem handshakeDlg.label.incomingMessage=Recebendo mensagem handshakeDlg.error.noPeers=Não é possivel trocar informação sem que haja algum correspondente. handshakeDlg.error.noProtection=Por favor habilite a proteção para poder utilizar a função de negociação. enigmail.acSetupPasswd.descEnterPasswd=Por Favor digite o código de configuração que é mostrado no outro dispositivo enigmail.acSetupPasswd.descCopyPasswd=Por favor digite o código de configuração mostrado abaixo no outro dispositivo para continuar o processo de configuração #strings in autocrypt.jsm autocrypt.setupMsg.subject=Ajustar Mensagem para modo de Auto-encriptação autocrypt.setupMsg.msgBody=Para configurar o seu novo dispositivo para Auto-encriptar, por favor siga as instruções que serão mostradas no seu novo dispositivo. autocrypt.setupMsg.fileTxt=Este é o arquivo de Auto-criptografia usado para transferir as configurações e chaves entre os clientes. Você pode descriptografá-lo usando o código de configuração mostrado no seu antigo dispositivo, e então importar a chave na sua cadeia de chaves. #strings in upgradeInfo.html upgradeInfo.doctitle=O que há de novo no Enigmail 2.0? upgradeInfo.welcome1=Bem-vindo ao novo Enigmail versão 2.0! upgradeInfo.welcome2=Esta versão contém muitas funcionalidades novas e que foram alteradas. Por favor gaste um minuto para descobrir quais são as novidades: upgradeInfo.encSubject.title=Criptografando o Assunto da Mensagem upgradeInfo.encSubject.desc=Nós desenvolvemos um novo método para mover o assunto do email para dentro da mensagem criptografada, e substitue o assunto mostrado com "Mensagem Criptografada". Uma vez que a mensagem seja descriptografada, o assunto original será substituído automaticamente. Esconder o assunto estará ativo por padrão; existe uma preferência para desativar caso não goste. (Nota: esta funcionalidade requer que a mensagem seja enviada com o PGP/MIME.) upgradeInfo.buttons.title=Alterar o comportamento dos botões de Criptografar e Assinar upgradeInfo.buttons.desc=Os botões de criptografar e assinar no editor de mensagens agora funcionam para ambos os protocolos OpenPGP e S/MIME. Se ambos os algoritmos são possíveis, o Enigmail para preferir aquele para o qual todas as chaves estejam disponíveis. upgradeInfo.autocrypt.title=Suporte para Auto-encriptação upgradeInfo.autocrypt.desc=O Enigmail agora suporta Criptografia Automática, um novo padrão para distribuir as chave como parte das mensagens enviadas. O Enigmail automaticamente importa as chaves de mensagens compatíveis com a Criptografia Automatica, desta forma mais e mais emials poderão ser criptografados com o passar do tempo. upgradeInfo.pEp.title=Novo p≡p Modo Junior (Pretty Easy Privacy) upgradeInfo.pEp.desc=Enigmail agora contém um modo Júnior p≡p. No momento você precisa instalar manualmente o p≡p para este propósito; Isto mudará nas futuras versões. O p≡p modo júnior permite que você use a criptografia OpenPGP o mais transparente possível; você não precisa mais se preocupar com a gerência de chaves e com a sincronização de chaves entre os dispositivos. upgradeInfo.bottom.desc=Por favor acesse noss documentaçãopara obter ajuda no uso do Enigmail. pep.missingGnuPG=Para poder usar o Enigmail/p≡p, o GnuPG é pré-requisito. Assim como não o encontramos instalado, nós sugerimos baixar e fazer a instalação. #strings in enigmailAbout.html aboutEnigmail.tabName=Sobre o Enigmail aboutEnigmail.title=Suporte ao OpenPGP provido por Enigmail aboutEnigmail.team=Enigmail foi desenvolvido pela Equipe Enigmail: aboutEnigmail.projectLeader=Líder do Desenvolvimento: aboutEnigmail.usability=Usabilidade: aboutEnigmail.documentation=Documentação: aboutEnigmail.testing=Testando: aboutEnigmail.userSupport=Suporte ao Usuário: aboutEnigmail.localization=Localização: Veja o a página dos pacotes de tradução para o Enigmail aboutEnigmail.Credits=Créditos: aboutEnigmail.origAuthor=Autor Original da extensão do Enigmail aboutEnigmail.icons=Ãcones: aboutEnigmail.formerMembers=Membros aposentados da equipe: aboutEnigmail.projectHosting=Hospedagem do Projeto: aboutEnigmail.licenseSupportTitle=Licença & Suporte aboutEnigmail.license=Enigmail OpenPGP é open source e está licenciado sob a %S aboutEnigmail.support=Suporte e distribuição disponível em www.enigmail.net. enigmail-2.0.8/lang/pt-BR/help/000077500000000000000000000000001334302754500161115ustar00rootroot00000000000000enigmail-2.0.8/lang/pt-BR/help/compose.html000066400000000000000000000112731334302754500204500ustar00rootroot00000000000000 Ajuda do Enigmail: Composição de Mensagem

Ajuda do Enigmail

Utilizando o Enigmail ao compor mensagens

  • Menu do Enigmail na janela de Composição de Mensagem
    • Assinar mensagem: Habilitar/Desabilitar o envio de mensagens assinadas. O usuário será notificado se a assinatura falhar.
    • Criptografar mensagem: Habilitar/Desabilitar criptografia para todos os destinatário(s) antes de enviar a mensagem. O usuário será notificado caso a criptografia falhe.

      Caso a opção Mostrar seleção quanto necessário estiver habilitada na aba Preferências -> Seleção de Chaves , uma lista de chaves será mostrada caso existam endereços na lista de destinatários da mensagem para os quais você não possua uma chave pública correspondente.

      Caso a opção Nunca mostrar diálogo de seleção de chaves OpenPGP estiver habilitada na aba Preferêencias -> Seleção de Chaves, e existam endereços na lista de destinatários para os quais você não possua a chave pública correspondente, a mensagem será enviada sem criptografia.

    • Utilizar PGP/MIME para esta mensagem: Habilitar/Desabilitar o uso de PGP/MIME para esta mensagem.

      Se você sabe que o(s) destinatário(s) consegue(m) ler mensagens utilizando o formato PGP/MIME format, você deve utilizar esta opção.

      Esta facilidade depende de ter a opção da aba Preferências -> PGP/MIME configurada para Permitir o uso de PGP/MIME ou Sempre usar PGP/MIME.

    • Opções padrão para composição: Submenu.
      • Opções de Assinatura/Criptografia...: atalho para Configurações de Conta -> Opções do OpenPGP.
      • Opções de Envio...: atalho para a aba Preferências -> Envio.
      • Opções de seleções de Chave...: atalho para a aba Preferências -> Seleção de Chaves.
      • Opções de PGP/MIME...: atalho para a aba Preferências -> PGP/MIME.
    • Desfazer criptografia: Casa haja uma falha ao enviar a mensagem, tal como um servidor POP não aceitar o pedido, o Enigmail não saberá sobre o ocorrido, e a mensagem criptografada continuará a ser mostrada na janela de Composição de Mensagem. Escolhendo este item de menu fará com que a criptografia/assinatura seja desfeita, revertendo a janela de Composição de Mensagem de volta ao seu texto original.
      Como uma solução temporária, esta opção também pode ser utilizada para descriptografar a o texto de citação da mensagem anterior (quote) quando estiver respondendo mensagens criptografadas. O Enigmail deve automaticamente descriptografar a citação, mas caso isto falhe por alguma razão, você pode utilizar este item do menu para forçá-lo.
    • Inserir chave pública: inserir o bloco ASCII com a chave pública na posição atual do cursor na janela de Composição. Você será perguntado sobre os endereços das chaves a serem inseridas. Chaves inseridas desta maneira serão reconhecidas pelo Enigmail do destinatário. Após a inserção da chave, você ainda pode escolher assinar/criptografar a mensagem como for necessário. Não insira mais de um bloco de chave por mensagem; apenas especifique múltiplos endereços de email, separados por vírgulas ou espaços, quando for solicitado.
    • Remover senha: Remove a senha armazenada. Útil quando você possui múltiplas senhas.
    • Ajuda: Mostra informaçóes de Ajuda (esta página).

Mais ajuda pode ser encontrada na página web de Ajuda do Enigmail

enigmail-2.0.8/lang/pt-BR/help/editRcptRule.html000066400000000000000000000145561334302754500214200ustar00rootroot00000000000000 Ajuda do Enigmail: Edição de Regra do OpenPGP

Ajuda do Enigmail

Usando o Editor de Regras do Enigmail: Editando uma Regra OpenPGP

No Editor de Regras, você pode especificar padrões por destinatário para permitir criptografia, assinatura e PGP/MIME, e definir quais chaves OpenPGP serão utilizadas. Neste diálogo, você poderá especificar as regras para um único destinatário, ou para um grupo de destinatários com características similares.

  • Definir Regras OpenPGP para: Contém os endereços de email dos destinatários (sem nomes, por exemplo: apenas um endereço como alguem@dominio). Você pode especificar diversos endereços, separados por espaços. O endereço especificado aqui pode consistir apenas da parte com o domínio, de forma que qualquer mensagem que faça parte deste domínio será processada, por exemplo @email.domain permitirá processar mensagens como usuario@email.domain, alguem@email.domain, qualquerumy@email.domain, etc.
  • Aplicar regra se o destinatário for ...: Esta opção modifica a maneira como os endereços são processados. Caso múltiplos endereços sejam colocados, esta configuração será aplicada a todos. Os exemplos abaixo são baseados no endereço usuario@email.domain mostrado no exemplo de Regras OpenPGP mostrado acima.
    • É exatamente: com esta configuração, esta regra será apenas utilizada em emails para usuario@email.domain (texto exato, sem levar em consideração maiúsculas ou minúsculas).
    • Contém: com esta configuração, qualquer endereço de email contendo a sub-palavra especificada é encontrada, por exemplo qualquerum@email.domain ou usuario@email.domain.net
    • Começa com: com esta configuração, qualquer endereço começando com esta palavra é processado, por exemplo usuario@email.domain.net, usuario@email.domain-name.com.
    • Termina com: com esta configuração, qualquer endereço terminando com esta palavra será processado, por exemplo qualquerum@email.domain, alguem@email.domain.
  • Continua com a próxima regra para o endereço selecionado
    Ligando esta funçã permitirá que se defina uma regra mas não seja necessário especificar um ID de Chave no campo Usar as seguintes chaves OpenPGP:, de formad que o endereço de email será utilizado para verificar por uma chave na hora do envio. Além disso, regras criadas para o mesmo endereço serão processadas també.
  • Não continuar verificando regras para o endereço selecionado
    Ligando esta função, o processamento de quaisquer outras regras será abortado para o(s) endereço(s) selecionado(s) caso esta regra seja utilizada, ou seja, o processamento de regras continua com o próximo destinatário.
  • Utilizar as seguintes chaves OpenPGP:
    Utilize o botão Selecionar Chave(s).. para selecionar as chaves de destinatário que serão utilizadas para criptografia. Como na ação descrita anteriormente, nenhuma regra adicional para o(s) endereço(s) selecionado(s) serão processadas.
  • Padrão para Assinatura: habilitar ou desabilitar assinatura de mensagens. Esta opção utiliza ou sobrepõe o que você especificou na janela de composição de mensagem. Os valores são:
    • Nunca: desabilitar assinatura, mesmo quando tiver sido habilitada na janela de composição de mensagem. (sobrepõe os outros valores)
    • Sim, se selecionado na Composição da Mensagem: deixe a assinatura como especificada na janela de composição de mensagem
    • Sempre: habilitar assinatura, mesmo se não foi habilitada na janela de composição de mensagem
Estas configurações de assinatura são aplicadas para todas as regras que coincidirem. Caso uma das regras desabilite assinatura, a mensagem não será assinada, mesmo que outras regras especifiquem Sempre assinar.
  • Criptografia: habilitar ou desabilitar criptografia de mensagem. As configurações permitidas e seu significado é o mesmo que para assinatura de mensagens.
  • PGP/MIME: habilitar ou desabilitar o uso de codificação de mensagem PGP/MIME (RFC 3156). Caso o PGP/MIME esteja desligado, as mensagens são codificadas utilizando o processo "PGP inline". Os valores permitidos e seus significados são os mesmos utilizados para assinatura de mensagens.

As regras são processadas na ordem mostrada na lista do Editor de Regras OpenPGP. Sempre que uma regras coincidir com um destinatário e conter um ID de Chave OpenPGP, além de utilizar o ID de Chave especificado, o destinatário não é mais considerado ao se processar as regras seguintes.


Mais ajuda pode ser encontrada na página web de Ajuda do Enigmail para Configuraçáo por Destinatário

enigmail-2.0.8/lang/pt-BR/help/initError.html000066400000000000000000000054521334302754500207620ustar00rootroot00000000000000 Ajuda do Enigmail: Como Resolver Problemas com a Inicialização do OpenPGP

Ajuda do Enigmail

Como Resolver Problemas Com a Inicialização do OpenPGP

Existem diversas razões pelas quais a inicialização do OpenPGP pode falhar. As mais comuns estão descritas abaixo; Para mais informações visite a página de suporte do Enigmail.

GnuPG não pode ser encontrado

Para que o OpenPGP funcione, a ferramenta GnuPG precisa estar instalada. Caso o GnuPG não seja encontrado, verifique primeiramente se o arquivo executável gpg.exe (no Windows; gpg nas outras plataformas) está instalado em seu computador. Caso o GnuPG esteja instalado, e o OpenPGP não consiga encontrá-lo, você precisará informar manualmente o caminho para ele nas Preferências do OpenPGP Preferences (menu OpenPGP > Preferências)

Falha ao inicializar o Enigmime

O OpenPGP funciona apenas se tiver sido compilado utilizando-se o mesmo ambiente utilizado para construir o Thunderbird ou SeaMonkey. Isto significa que você apenas pode utilizar uma versão oficial do Enigmail se utilizar também uma versão oficial do Thunderbird ou SeaMonkey fornecida pela mozilla.org.

Caso você utilize uma versão do Thunderbird ou SeaMonkey de outro fornecedor (por exemplo, do distribuidor de sua distribuição Linux), ou se você mesmo compilou a aplicação, você deve utilizar uma versão construída pelo mesmo fornecedor, ou compilar uma versão do Enigmail. Para compilar o Enigmail, siga as instruções na seção Código Fonte na página do Enigmail. Por favor não abra relatórios de erro sobre este problema, ele não pode ser resolvido de outra maneira.

Mais ajuda está disponível na Página de Suporte do Enigmail.

enigmail-2.0.8/lang/pt-BR/help/messenger.html000066400000000000000000000116561334302754500210000ustar00rootroot00000000000000 Ajuda do Enigmail: Leitura de Mensagens

Ajuda do Enigmail

Utilizando o Enigmail durante a leitura de mensagens

  • Botão Descriptografar na janela principal de mensagens
    Este botão pode ser utilizado para diversas funções: descriptografar, verificar ou importar chaves públicas. Normalmente a criptografia/verificação ocorre automaticamente, embora isto possa ser desabilitado através de uma opção. No entanto, se isto falhar, geralmente uma pequena mensagem de erro irá aparecer na barra de status do Enigmail. Se você clicar no no botão Descriptografar, você poderá ver uma mensagem de erro mais detalhada, incluindo a saída do comando GnuPG.
  • Ícones de Caneta e Chave no Cabeçalho da Mensagem
    Os ícones de Caneta e Chave no cabeçalho da mensagem indicam s a mensagem que você está lendo foi assinada e/ou criptografada e se a assinatura é válida, ou seja, se a mensagem não foi alterada desde que foi assinada. Caso a mensagem tenha sido alterada, o ícone da Caneta irá mudar para um ícone de Caneta Quebrada para indicar que a assinatura não é válida. Clicando com o botão direito em qualquer um dos ícones de Caneta ou Chave trará um menu com as seguintes opçóes:
    • Informações de Segurança do OpenPGP: permite que você veja a saída do GnuPG para esta mensagem.
    • Copiar Informações de Segurança do OpenPGP: copia a saída do GnuPG para a área de transferência; para colar em uma mensagem, por exemplo.
    • Ver ID com Foto do OpenPGP: permite que você visualize o ID com Foto da pessoa que enviou a mensagem, caso possua uma foto contida em sua Chave Pública. (Esta opção apenas será habilitada caso um ID com Foto exista na chave da pessoa.)
    • Informações de Segurança S/MIME: permite que você visualize as Informações de Segurança S/MIME para a mensagem.

    Se você não tiver a opção de buscar chaves automaticamente no servidor de chaves definida em seu gpg.conf e ler uma mensagem que está assinada ou criptografada, você verá um ícone de uma Caneta no cabeçalho da mensagem juntamente com um Ponto de Interrogação nele, e a barra de status na área do cabeçalho do Enigmail dirá Parte da mensagem foi assinada; clique no ícone da caneta para detalhes e a mensagem mostrará todos os indicadores de blocos de mensagem do OpenPGP e o bloco de assinatura.

    Você também pode ver este ícone caso tenha a opção de buscar chaves automaticamente no servidor de chaves definida em seu gpg.conf e a chave OpenPGP não esteja disponível no servidor de chaves padrão.

    Clicando no ícone de Caneta com Ponto de Interrogação irá trazer uma janela informando que a chave não está disponível em seu chaveiro. Clicando em OK irá trazer uma outra janela com uma relação de servidores de chaves a partir dos quais você poderá selecionar de onde deseja baixar a chave pública do remetente.

    Para configurar a lista de servidores de chaves que você deseja utilizar, vá até a aba Enigmail -> Preferências -> Báasicas e entre com os endereços dos servidores de chaves na caixa Servidor(es) de Chaves: separados por uma vírgulas. O primeiro servidor de chaves na lista será utilizado como padrão.

  • Abrindo anexos criptografados / importando chaves OpenPGP anexadas
    Anexos terminando em *.pgp, *.asc e *.gpg são reconhecidos como anexos que podem ser tratados de forma especial pelo Enigmail. Clicando com o botão direito em um destes anexos habilita dois itens especiais no menu de contexto: Descriptografar e Abrir e Descriptografar e Salvar. Utilize estes dois itens se você quer que o Enigmail descriptografe um anexo antes de abrí-lo ou salvá-lo. Caso um anexo seja reconhecido com um arquivo de chave OpenPGP, será oferecida a oportunidade de importar as chaves em seu chaveiro.

Mais ajuda pode ser encontrada na página web de Ajuda do Enigmail

enigmail-2.0.8/lang/pt-BR/help/rulesEditor.html000066400000000000000000000070701334302754500213040ustar00rootroot00000000000000 Ajuda do Enigmail: Editor de Regras

Ajuda do Enigmail

Utilizando o Editor de Regras do Enigmail

No Editor de Regras, você pode especificar os padrões para cada destinatário para permitir criptografia, assinatura e PGP/MIME, e para definir quais chaves OpenPGP serão utilizadas. Cada regra consiste em 5 campos e é representada em uma única linha:

  • Email: o endereço de email que serão pesquisados nos campos De:, Cc: e Bcc:. A pesquisa funciona em sub-palavras (Maiores detalhes podem ser encontrados no diálogo do Editor de Regras)
  • Chave(s) OpenPGP: uma lista de Id's de Chaves OpenPGP Key ID's para utilizar para este destinatário
  • Assinar: habilitar ou desabilitar a assinatura da mensagem. Esta opção utiliza ou sobrepõe o que você especificou na janela de composição de mensagem. Os valores são:
    • Nunca: desabilita a assinatura, mesmo se estiver habilitada na janela de composição de mensagem (sobrepõe os outros valores)
    • Possível: deixa a opção de assinatura como especificada na janela de composição de mensagem
    • Sempre: habilita assinatura, mesmo se não estiver habilitada na janela de composição de mensagem
Estas opções de assinatura se aplicam para todas as regras que forem selecionadas. Caso uma destas regras desabilite a assinatura, a mensagem não será assinada, não importando o que outras regras especificarem Sempre.
  • Criptografar: habilita ou desabilita criptografia de mensagem. As opções permitidas e seus significados são os mesmos definidos para assinatura de mensagem.
  • PGP/MIME: habilita ou desabilita o uso de codificação PGP/MIME (RFC 3156). Caso a opção PGP/MIME esteja desabilitada, as mensagens são codificadas utilizando o "PGP inline". Os valores permitidos e seus significados são os mesmos da assinatura de mensagem.

As regras são processadas na ordem em que são mostradas na lista. Sempre que uma coincide com um destinatário e contém um ID de Chave OpenPGP, além de utilizar o ID de Chave especificado, o destinatário não é mais considerado ao se processar as regras seguintes.

Nota: O editor de regras ainda não está completo. É possível escrever regras muito mais avançadas editando o arquivo de regras diretamente (neste caso, as regras não deverão ser mais editadas no editor de regras). Maiores informações sobre como editar o arquivo diretamente estão disponíveis na página do Enigmail


Mais ajuda pode ser encontrada na página de Ajuda do Enigmail na web

enigmail-2.0.8/lang/pt-BR/help/sendingPrefs.html000066400000000000000000000047771334302754500214450ustar00rootroot00000000000000 Enigmail Help: Edit OpenPGP Rule

Enigmail Help

Defining Preferences to Send Encrypted

In the Sending Preferences you can choose the general model and preferences for encryption.

Convenient Encryption
With these settings, emails are encrypted without confirmation whenever possible.

This setup is appropriate, if you just want to improve your privacy by sending emails encyrpted instead of unencrypted if that's possible.

The effect is like sending emails as letters instead of postcards. Unlike postcards, letters usually hide their contents while in transit.

Note however that as with letters you can't be sure that nobody is opening the letter while it is in transit (although, some technical effort is necessary for that).

A concrete risk is that you accidentally use "faked keys" you got from somewhere or somebody claiming that the key belongs to the person you want to send emails to. To avoid this risk, you can either use the trust model of PGP (see below) or you should always verify, whether the fingerprint of a public key is correct.

Manual Encryption
This option allows you to specify the different preferences for encryption according to your needs. You can specify
  • whether replies to encrypted/signed emails should automatically also be encrypted/signed-
  • whether to use the trust model of OpenPGP to accept keys (this means that to use a key you either have to sign the key or have enough other people you trust having signed the key).
  • whether you want to automatically send emails encrypted if all keys are accepted.
  • whether and when you want to finally confirm sending an email.
If it is important for you that content you send encrypted can't be read by other people or organizations, you should use the manual preferences at least choose the option to accept keys only if you or other people signed them. While this model reduces the risk of using faked keys, it requires that you actively sign keys and declare owner trust using the key managament dialog. enigmail-2.0.8/lang/pt-PT/000077500000000000000000000000001334302754500152015ustar00rootroot00000000000000enigmail-2.0.8/lang/pt-PT/am-enigprefs.properties000066400000000000000000000001231334302754500216700ustar00rootroot00000000000000# Strings used in the Mozill AccountManager prefPanel-enigprefs=Segurança OpenPGP enigmail-2.0.8/lang/pt-PT/enigmail.dtd000066400000000000000000001711171334302754500174730ustar00rootroot00000000000000 ' para especificar endereços de correio eletrónico"> ' para especificar endereços de correio eletrónico para o GnuPG. Desativar se os destinatários apenas possuírem chaves Hushmail."> Segurança OpenPGP)"> NOTA: A operação de criar chave pode demorar vários minutos a completar. Não feche a aplicação enquanto a operação estiver em progresso. Navegar ativamente ou levar a cabo operações de uso intensivo do disco irão repor o nível do repositório de aleatoriedade e acelerar o processo. Será avisado quando a chave estiver criada."> ' não é válido"> NOTA: Criar a chave pode demorar vários minutos. Não feche a aplicação enquanto a operação não terminar. Será alertado quando a chave estiver criada."> Nota:O Enigmail verificará sempre as assinaturas das mensagens para cada conta ou identidade, independentemente de estar ou não ativado."> chave pública serve para que outras pessoas lhe enviem mensagens cifradas. Pode distribuí-la a todos."> chave pública serve para que você decifre essas mensagens e assine as suas mensagens. Não a deve dar a ninguém."> chave pública serve para que você decifre essas mensagens e assine as suas mensagens. Não a deve dar a ninguém. Para proteger a sua chave privada, ser-lhe-á pedida uma frase de acesso nos próximos dois diálogos."> frase de acesso é uma senha para proteger a sua chave privada. Evita uma utilização errada da sua chave privada."> não são recomendados."> exportar os seus dados do seu computador antigo usando o assistente de cópia de segurança nas Preferências do Enigmail importar os dados para o seu novo computador usando este assistente. "> Obrigado por usar o Enigmail."> exportar os seus dados do seu computador antigo usando este assistente importar os dados para o seu novo computador usando o Assistente de Configuração. "> enigmail-2.0.8/lang/pt-PT/enigmail.properties000066400000000000000000001557531334302754500211240ustar00rootroot00000000000000Enigmail=Enigmail ##################################################################### # Strings used within enigmailCommon.js and enigmailCommon.jsm ##################################################################### enigAlert=Enigmail: Aviso enigConfirm=Enigmail: Confirmação # enigInfo=Enigmail Information enigError=Enigmail: Erro enigPrompt=Enigmail: Comando dlgYes=&Sim dlgNo=&Não dlgKeepSetting=Lembrar a resposta e não perguntar novamente dlgNoPrompt=Não mostrar este diálogo novamente dlg.button.delete=&Apagar dlg.button.cancel=&Cancelar dlg.button.close=&Fechar dlg.button.continue=Con&tinuar dlg.button.skip=&Saltar dlg.button.overwrite=S&obrepor dlg.button.view=&Ver dlg.button.retry=&Repetir dlg.button.ignore=&Ignorar # dlg.button.install=&Install # dlg.button.ok=&OK repeatPrefix=\n\nEste aviso irá repetir-se mais %S repeatSuffixSingular=vez. repeatSuffixPlural=vezes. noRepeat=\n\nEste aviso não se repetirá até à atualização do Enigmail. pgpNotSupported=Parece que está a usar o Enigmail em conjunto com o PGP 6.x\n\nInfelizmente, o PGP 6.x tem uma série de problemas que impedem o correto funcionamento do Enigmail. Assim, o Enigmail já não suporta o PGP 6.x; por favor, passe antes a usar o GnuPG (GPG).\n\nSe necessita de ajuda na mudança para o GnuPG, consulte a secção de ajuda no site do Enigmail. initErr.howToFixIt=Para usar o Enigmail, é necessário o GnuPG. Se ainda não o instalou, a forma mais fácil será usando o botão "Assistente de Configuração". initErr.setupWizard.button=&Assistente de Configuração passphraseCleared=A senha foi limpa. cannotClearPassphrase=Está a usar uma ferramenta não convencional (como gnome-keyring) para manipular frases de acesso. Por esse motivo, não é possível apagar a frase de acesso a partir do Enigmail. noPhotoAvailable=Foto não disponível debugLog.title=Registo de Depuração do Enigmail error.photoPathNotReadable=Não foi possível aceder ao caminho '%S' para a fotografia # generalError=Error: %S # Strings in configure.jsm enigmailCommon.versionSignificantlyChanged=Esta nova versão do Enigmail tem alterações significativas no tratamento das preferências e opções. Tentámos transferir as opções antigas para esta versão. Contudo, não foi possível cobrir todos os casos automaticamente. Por favor, verifique com cuidado as novas preferências e opções. enigmailCommon.checkPreferences=Verificar Preferências ... preferences.defaultToPgpMime=A codificação de mensagem por omissão no Enigmail foi alterada de PGP embebido para PGP/MIME. Recomenda-se que mantenha esta configuração como omissão.\n\nSe mesmo assim deseja usar PGP embebido por omissão, pode fazê-lo nas Definições da conta em Segurança OpenPGP. ##################################################################### # Strings in enigmailAbout.js ##################################################################### usingVersion=Executando a versão %S do Enigmail # enigmailPepVersion=Enigmail/p≡p version %S usingAgent=Usando o programa %1$S com o executável %2$S para cifrar e decifrar agentError=ERRO: Foi impossível aceder ao serviço Enigmime! ##################################################################### # Strings in enigmailKeygen.js ##################################################################### accessError=Erro ao aceder ao serviço Enigmime onlyGPG=Só pode criar chaves com o GnuPG (não com o PGP)! keygenComplete=Nova chave criada!\nA identidade <%S> será usada para assinar. revokeCertRecommended=Recomendamos vivamente a criação de um certificado de revogação para a sua chave. Este certificado pode ser usado para invalidar a sua chave, por exemplo, na eventualidade da perder a sua chave privada ou de esta ter sido comprometida. Deseja criar um certificado de revogação agora? keyMan.button.generateCert=&Criar Certificado genCompleteNoSign=Nova chave criada! genGoing=Já está a criar uma nova chave! passNoMatch=As senhas não coincidem; por favor, introduza-as de novo passCheckBox=Seleccionar se não desejar definir uma senha para esta chave passUserName=Por favor indique o nome de utilizador para esta identidade keygen.missingUserName=Não foi indicado nenhum nome para a conta/identidade selecionada. Por favor introduza um valor no campo "O seu Nome" nas definições de conta. keygen.passCharProblem=Está a usar caracteres especiais na sua frase senha. Infelizmente, isso pode causar problemas para outras aplicações. Recomenda-se que escolha uma frase senha contendo apenas estes caracteres:\na-z A-Z 0-9 /.;:-,!?(){}[]%* passSpaceProblem=Devido a problemas técnicos, a sua senha não pode começar nem acabar com um espaço. changePassFailed=A alteração da senha falhou. keyConfirm=Criar chave pública e privada para '%S'? keyMan.button.generateKey=&Criar Chave keyAbort=Abortar criação da nova chave? keyMan.button.generateKeyAbort=&Abortar Criação de Chave keyMan.button.generateKeyContinue=&Continuar a Criar a Chave expiryTooLong=Não pode criar uma chave com o prazo de expiração superior a 100 anos. expiryTooLongShorter=Não pode criar uma chave que expire em mais de 90 anos. expiryTooShort=A chave tem de ser válida por um mínimo de um dia. keyGenFailed=Não foi possível criar a chave. Por favor, verifique a consola do Enigmail (Menu Enigmail > Depuração) para mais detalhes. setKeyExpirationDateFailed=A data de expiração não pôde ser alterada # Strings in enigmailMessengerOverlay.js securityInfo=Informação de Segurança Enigmail\n\n enigHeader=Enigmail: enigContentNote=Enigmail: *Os anexos a esta mensagem não foram assinados nem cifrados*\n\n possiblyPgpMime=Mensagem possivelmente assinada ou cifrada com PGP/MIME. Clique Decifrar para verificar. saveAttachmentHeader=Enigmail: Guardar anexo decifrado noTempDir=Não foi possível encontrar uma diretoria temporária na qual escrever\nPor favor, configure a variável de ambiente TEMP attachmentPgpKey=O anexo '%S' que está a abrir aparenta ser uma chave OpenPGP.\n\nClique 'Importar' para importar as chaves lá contidas ou 'Ver' para ver o conteúdo do ficheiro numa janela do navegador web beginPgpPart=********* *INÃCIO de PARTE ASSINADA ou CIFRADA* ********* endPgpPart=********** *FIM de PARTE ASSINADA ou CIFRADA* ********** notePartEncrypted=Enigmail: *Partes da mensagem NÃO foram assinadas ou cifradas* noteCutMessage=Enigmail: *Encontrados múltiplos blocos de mensagem -- verificação/decifração abortada* decryptOkNoSig=Aviso\n\nA mensagem foi corretamente decifrada mas não foi possível verificar a assinatura msgOvl.button.contAnyway=&Continuar Mesmo Assim signature.verifiedOK=A assinatura do anexo %S foi verificada com sucesso signature.verifyFailed=A assinatura do anexo %S não pôde ser verificada attachment.noMatchToSignature=Não foi possível fazer corresponder o anexo %S a uma assinatura attachment.noMatchFromSignature=Não foi possível fazer corresponder a assinatura %S a um anexo fixBrokenExchangeMsg.failed=Não foi possível reparar a mensagem. enigmail.msgViewColumn.label=Enigmail # enigmailPep.msgViewColumn.label=Enigmail/p≡p # wksNoIdentity=This key is not linked to any of your email accounts. Please add an account for at least one of the following email addresse(s):\n\n%S # wksConfirmSuccess=Confirmation email sent. # wksConfirmFailure=Sending the confirmation email failed. # autocrypt.importSetupKey.accountPreconfigured=Your account is already correctly configured for Autocrypt.\n\nDo you really want to overwrite your settings with this setup message? # autocrypt.importSetupKey.selfCreated=This message was created by your currently running instance of Enigmail.\n\nPlease switch to the email client to which you want to transfer the settings, and click on the message on that email client to import the settings. # autocrypt.importSetupKey.invalidMessage=Error - could not read setup message. The message seems to be corrupted. Please try to create a new setup message on your "other" device. # autocrypt.importSetupKey.invalidKey=Error - the key could not be imported. The key is either not supported by your version of GnuPG, or it got corrupted. # autocrypt.importSetupKey.wrongPasswd=The password you entered is wrong. Do you want to retry? # autocrypt.importSetupKey.success=The Autocrypt setup message was processed successfully. Autocrypt is now available for your account '%S'. ##################################################################### # Strings in enigmailMsgComposeOverlay.js ##################################################################### keysToExport=Seleccione as chaves OpenPGP a Inserir keysToUse=Seleccione a(s) chave(s) OpenPGP a usar para %S pubKey=Chave pública para %S\n windowLocked=A janela de composição está bloqueada; envio cancelado sendUnencrypted=A inicialização do Enigmail falhou.\nEnviar a mensagem em claro? composeSpecifyEmail=Por favor, indique o seu endereço de correio principal, que será usado para escolher a chave para assinar as mensagens a enviar.\nSe o deixar em branco, será usado o endereço no campo FROM (De) para escolher a chave a usar. sendingHiddenRcpt=Esta mensagem tem destinatários BCC (Cópia oculta). Se esta mensagem for cifrada é possível esconder os destinatários BCC, mas os utilizadores de alguns produtos (ex: PGP Corp.) não serão capazes de decifrar a mensagem. Assim, recomendamos evitar enviar mensagens cifradas com destinatários BCC. sendWithHiddenBcc=Esconder destinatários BCC sendWithShownBcc=Cifrar normalmente sendingNews=Operação de envio interrompida.\n\nEsta mensagem não pode ser cifrada uma vez que tem grupos de discussão como destinatários. Por favor, envie a mensagem sem a cifrar. sendToNewsWarning=Aviso: está prestes a enviar uma mensagem cifrada para um grupo de discussão.\n\nNão o recomendamos porque apenas faria sentido se todos os membros do grupo pudessem decifrar a mensagem, ou seja, a mensagem teria de ser cifrada com a chave de todos os participantes no grupo. Por favor, envie esta mensagem apenas se souber exatamente o que está a fazer.\n\nContinuar? hasHTML=Aviso de correio HTML:\nEsta mensagem parece conter HTML, o que poderá causar a falha da operação de assinar/cifrar. Para evitar esta situação no futuro, deve pressionar a tecla SHIFT ao fazer clique no botão Compor/Responder para enviar correio assinado.\nSe envia correio assinado por omissão, deve desseleccionar a opção 'Compor mensagens em HTML' para desativar permanentemente o envio de correio HTML nesta conta. strippingHTML=A mensagem contém formatação HTML que será perdida ao ser convertida para texto simples para assinar/cifrar. Deseja continuar? msgCompose.button.sendAnyway=&Enviar Mensagem Mesmo Assim attachWarning=Os anexos a esta mensagem não são locais, pelo que não podem ser cifrados. Para cifrar os anexos, guarde-os como ficheiros locais, anexando depois estes ficheiros. Deseja enviar a mensagem mesmo assim? quotedPrintableWarn=Escolheu a codificação 'quoted-printable' para enviar mensagens. Isto pode ter como resultado uma incorreta decifração ou verificação da sua mensagem.\nDeseja desseleccionar o envio de mensagens 'quoted-printable'? minimalLineWrapping=Configurou a quebra automática de linha para %S caracteres. Para cifrar ou assinar corretamente, este valor deve ser pelo menos 68.\nDeseja alterar a quebra automática de linha para 68 caracteres? warning=Aviso signIconClicked=Alterou manualmente a assinatura. Desta forma, ao compor esta mensagem, (des)ativar a assinatura já não depende de (des)ativar a cifra. errorOwnKeyUnusable=A chave com Identificador '%S' configurada para a identidade atual não contém uma chave OpenPGP utilizável.\n\nPor favor assegure-se de que tem uma chave OpenPGP válida e dentro do prazo de expiração.\nSe a sua chave ainda não expirou, verifique se definiu a confiança no utilizador para total ou máxima. msgCompose.cannotSaveDraft=Erro ao guardar rascunho # msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information - partially encrypted email. # msgCompose.partiallyEncrypted.mimeMsg=The message you are replying to contained both unencrypted and encrypted parts. Some encrypted message parts are invisible to you.\n\nIf the sender was not able to decrypt the hidden message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nWe recommend that you don't reply to the message, but create a new message containing your answer. # msgCompose.partiallyEncrypted.inlinePGP=The message you are replying to contained both unencrypted and encrypted parts. If the sender was not able to decrypt some message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nPlease consider removing all quoted text from your reply to this sender. msgCompose.internalEncryptionError=Erro Interno: desativada a cifra prometida msgCompose.internalError=Ocorreu um erro interno. msgCompose.toolbarTxt.signAndEncrypt=A mensagem será assinada e cifrada msgCompose.toolbarTxt.signOnly=A mensagem será assinada msgCompose.toolbarTxt.encryptOnly=A mensagem será cifrada msgCompose.toolbarTxt.noEncryption=A mensagem não será assinada nem cifrada msgCompose.toolbarTxt.disabled=O Enigmail está desativado para a identidade seleccionada # msgCompose.protectSubject.tooltip=Protect the message subject # msgCompose.noSubjectProtection.tooltip=Do not protect the message subject msgCompose.encryptedSubjectStub=Mensagem Cifrada # msgCompose.protectSubject.dialogTitle=Enable Protection of Subject? # msgCompose.protectSubject.question=Regular encrypted emails contain the unredacted subject.\n\nWe have established a standard to hide the original subject in the encrypted message\nand replace it with a dummy text, such that the subject is only visible after the email is decrypted.\n\nDo you want to protect the subject in encrypted messages? # msgCompose.protectSubject.yesButton=&Protect subject # msgCompose.protectSubject.noButton=&Leave subject unprotected msgCompose.detailsButton.label=Detalhes ... msgCompose.detailsButton.accessKey=D # msgCompose.pepSendUnknown=Unknown # msgCompose.pepSendUnsecure=Unsecure # msgCompose.pepSendSecure=Secure # msgCompose.pepSendTrusted=Secure & Trusted # pep.alert.disabledForIdentity=p≡p is disabled for the current identity. Please enable p≡p via the Enigmail/p≡p preferences. # pep.alert.weakReply=You’re about to forward or reply to a secure message as insecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? # note: should end with double newline: sendAborted=Operação de envio interrompida.\n\n # details: keyNotTrusted=A chave '%S' não é suficientemente confiável keyNotFound=A chave '%S' não foi encontrada keyRevoked=A chave '%S' está revogada keyExpired=A chave '%S' está expirada statPGPMIME=PGP/MIME # statSMIME=S/MIME statSigned=ASSINADA statEncrypted=CIFRADA statPlain=NÃO ASSINADA e NÃO CIFRADA offlineSave=Guardar a mensagem %1$S para %2$S na pasta Mensagens Não Enviadas? onlineSend=Enviar mensagem %1$S para %2$S? encryptKeysNote=Nota: a mensagem está cifrada com os seguintes Identificadores / Chaves de Utilizador: %S hiddenKey= signFailed=Erro no Enigmail; Não foi possível assinar/cifrar; enviar mensagem não cifrada? msgCompose.button.sendUnencrypted=&Enviar Mensagem Não Cifrada recipientsSelectionHdr=Escolha os Destinatários para os quais Cifrar configureNow=Ainda não configurou a segurança Enigmail para a identidade seleccionada. Deseja fazê-lo agora? # encryption/signing status and associated reasons: encryptMessageAuto=Cifrar Mensagem (auto) encryptMessageNorm=Cifrar Mensagem signMessageAuto=Assinar Mensagem (auto) signMessageNorm=Assinar Mensagem encryptOff=Cifrar: Desligado encryptOnWithReason=Cifrar: Ligado (%S) encryptOffWithReason=Cifrar: Desligado (%S) encryptOn=Cifrar: Ligado signOn=Assinar: Ligado signOff=Assinar: Desligado signOnWithReason=Assinar: Ligado (%S) signOffWithReason=Assinar: Desligado (%S) reasonEnabledByDefault=ativado por omissão reasonManuallyForced=forçado manualmente reasonByRecipientRules=forçado pelas regras por destinatário reasonByAutoEncryption=forçado por modo de cifra automática reasonByConflict=devido a conflito nas regras por destinatário reasonByEncryptionMode=devido ao modo de cifra # should not be used anymore: encryptYes=A mensagem será cifrada encryptNo=A mensagem não será cifrada # should not be used anymore: signYes=A mensagem será assinada signNo=A mensagem não será assinada # PGP/MIME status: pgpmimeNormal=Protocolo: PGP/MIME inlinePGPNormal=Protocolo: PGP embebido # smimeNormal=Protocol: S/MIME pgpmimeAuto=Protocolo: PGP/MIME (auto) inlinePGPAuto=Protocolo: PGP embebido (auto) smimeAuto=Protocolo: S/MIME (automático) # should not be used anymore pgpmimeYes=Será usado PGP/MIME pgpmimeNo=Será usado PGP embebido # Attach own key status (tooltip strings): attachOwnKeyNo=A sua chave não será anexada attachOwnKeyYes=A sua chave será anexada attachOwnKeyDisabled=A sua chave não pode ser anexada. Deve selecionar uma chave específica\nna secção OpenPGP nas Definições da conta para ativar esta funcionalidade. rulesConflict=Detetado conflito em regras por destinatário\n%S\n\nEnviar mensagem com esta configuração? msgCompose.button.configure=&Configurar msgCompose.button.send=&Enviar Mensagem msgCompose.button.save=&Guardar Mensagem # Strings in enigmailMsgHdrViewOverlay.js keyNeeded=É necessária a chave pública %S para verificar a assinatura keyUsed=Chave pública %S usada para verificar a assinatura clickDecrypt=; clique no botão Decifrar clickDecryptRetry=; clique no botão Decifrar para tentar novamente clickDetailsButton=; premir o botão 'Detalhes' para mais informação clickImportButton=; premir o botão 'Importar Chave' para transferir a chave keyTypeUnsupported=; o tipo de chave não é suportado pela sua versão do GnuPG msgPart=Parte da mensagem %S msgSigned=assinada msgSignedUnkownKey=assinada com chave desconhecida msgEncrypted=cifrada msgSignedAndEnc=assinada e cifrada unverifiedSig=Assinatura não verificada incompleteDecrypt=Decifração incompleta needKey=Erro - não foi encontrada a chave privada correspondente para decifrar a mensagem failedDecrypt=Erro - foi impossível decifrar badPhrase=Erro - senha incorreta failedDecryptVerify=Erro - foi impossível decifrar/verificar mdcError=Erro - a mensagem não tinha a sua integridade protegida viewInfo=; Escolha Ver > Informação de segurança da mensagem para mais informação decryptedMsg=Mensagem decifrada decryptedMsgWithFormatError=Mensagem decifrada (restaurado o formato PGP defeituoso provavelmente causado por um servidor Exchange antigo, podendo resultar numa mensagem de difícil leitura) usedAlgorithms=Algoritmos utilizados: %S e %S # pepStatusInfo.text=p≡p Message Status. # pepStatusInfo.title.m3=Under Attack pepStatusInfo.info.m3=Esta mensagem não é segura e foi alterada. # pepStatusInfo.title.m1=Mistrusted # pepStatusInfo.info.m1=This message has a communication partner that has previously been marked as mistrusted # pepStatusInfo.title.r0=Unknown pepStatusInfo.info.r0=Esta mensagem não contém informação suficiente para determinar se é segura. # pepStatusInfo.title.r1=Cannot Decrypt # pepStatusInfo.info.r1=This message cannot be decrypted because the key is not available. # pepStatusInfo.title.r2=Cannot Decrypt pepStatusInfo.info.r2=Esta mensagem não pode ser decifrada porque a chave não está disponível. # pepStatusInfo.title.r3=Unsecure pepStatusInfo.info.r3=Esta mensagem não é segura. # pepStatusInfo.title.r4=Unsecure for Some # pepStatusInfo.info.r4=This message is unsecure for some communication partners. # pepStatusInfo.title.r5=Unreliable Security # pepStatusInfo.info.r5=This message has unreliable protection. # pepStatusInfo.title.r6=Secure... pepStatusInfo.info.r6=Esta mensagem é segura mas ainda necessita de verificar a identidade do seu correspondente. # pepStatusInfo.title.r7=Secure & Trusted # pepStatusInfo.info.r7=This message is secure and trusted. # pepStatusInfo.color.green=Green # pepStatusInfo.color.yellow=Yellow pepStatusInfo.color.red=Vermelho # pepRevokeTrust.question=Do you really want to cancel the trust for %S? # pepRevokeMistrust.question=Do you really want to re-trust the key for %S? pepRevokeTrust.doRevoke=Cancelar &confiança # wksConfirmationReq=Web Key Directory Confirmation Request # wksConfirmationReq.message=This message has been sent by your email provider to confirm deployment of your OpenPGP public key\nin their Web Key Directory.\nProviding your public key helps others to discover your key and thus being able to encrypt messages to you.\n\nIf you want to deploy your key in the Web Key Directory now, please click on the button "Confirm Request" in the status bar.\nOtherwise, simply ignore this message. # wksConfirmationReq.button.label=Confirm Request # autocryptSetupReq=Perform Autocrypt Setup # autocryptSetupReq.button.label=Start Setup # autocryptSetupReq.setupMsg.desc=This message contains all information to transfer your Autocrypt settings along with your secret key securely from your original device. # autocryptSetupReq.setupMsg.backup=You can keep this message and use it as a backup for your secret key. If you want to do this, you should write down the password and store it securely. # autocryptSetupReq.message.import=To import the settings and key(s) in Enigmail, please click on the "Start Setup" button in the status bar. # autocryptSetupReq.message.sent=Please click on the message on your new device and follow the instuctions to import the settings. # strings in pref-enigmail.js # oldGpgVersion20=Enigmail initialization failed.\n\nYou are using GnuPG version %1$S, which is not supported anymore. Enigmail requires GnuPG version %2$S or newer. Please upgrade your GnuPG installation, or Enigmail will not work. locateGpg=Localizar o executável GnuPG invalidGpgPath=O GnuPG não pôde ser executado a partir da localização fornecida. Assim, o Enigmail está desativado até o alterar novamente ou até reiniciar a aplicação. warningsAreReset=Todos os avisos foram removidos. prefs.gpgFound=GnuPG encontrado em %S prefs.gpgNotFound=Não foi possível encontrar o GnuPG prefs.warnAskNever=Aviso: ativar esta opção terá como resultado mensagens não cifradas serem enviadas sem qualquer aviso sempre que não for encontrada qualquer chave para um dos destinatários -- O OpenPG não o informará se isto acontecer! prefs.warnIdleTimeForUnknownAgent=O seu sistema possui uma ferramenta especial para gestão de senhas, como o gnome-keyring ou seahorse-agent. Infelizmente, o Enigmail não pode controlar o tempo de expiração da chave com a ferramenta que está a usar. Por esse motivo a configuração do tempo de expiração respetiva será ignorada. prefEnigmail.oneKeyserverOnly=Erro - Apenas pode indicar um servidor de chaves para importação automática de chaves OpenPGP. # Strings used in core.jsm # (said file also re-uses some strings from above) enterAdminPin=Por favor, introduza o PIN de ADMINISTRAÇÃO do seu SmartCard enterCardPin=Por favor, introduza o PIN do seu SmartCard notInit=Erro - O serviço Enigmail ainda não está inicializado badCommand=Erro - foi impossível cifrar cmdLine=linha de comando e saída: notRequired=Erro - cifra não requerida notComplete=Erro - nova chave ainda não criada invalidEmail=Erro - endereço(s) de correio não válido(s) noPassphrase=Erro - senha não introduzida noPGPblock=Erro - Não foi encontrado um bloco OpenPGP válido unverifiedReply=A parte indentada da mensagem (resposta) foi provavelmente modificada keyInMessageBody=Foi encontrada uma chave no corpo da mensagem. Clique 'Importar Chave' para a importar sigMismatch=Erro - Assinatura não coincidente cantImport=Erro ao importar chave pública\n\n doImportOne=Importar %1$S (%2$S)? doImportMultiple=Importar as seguintes chaves?\n\n%S previewFailed=Não foi possível ler o ficheiro de chave pública. # Strings used in errorHandling.jsm sc.wrongCardAvailable=O SmartCard %S encontrado no seu leitor não pôde ser usado para processar a mensagem.\nPor favor, insira o seu SmartCard %S e repita a operação. sc.insertCard=A operação requer o seu SmartCard %S.\nPor favor insira o SmartCard requerido e repita a operação. sc.removeCard=A operação não necessita de qualquer SmartCard inserido no leitor.\nPor favor remova o SmartCard e repita a operação. sc.noCardAvailable=Não foi encontrado qualquer SmartCard no seu leitor\nPor favor, insira o SmartCard e repita a operação. sc.noReaderAvailable=Não foi possível aceder ao seu leitor de SmartCards\nPor favor, ligue o seu leitor de SmartCards, insira o seu cartão e repita a operação. keyError.keySpecNotFound=O endereço de correio eletrónico "%S" não corresponde a nenhuma chave no seu porta-chaves. keyError.keyIdNotFound=O Identificador da chave "%S" configurado não foi encontrado no seu porta-chaves. keyError.resolutionAction=Por favor selecione uma chave válida na secção OpenPGP nas Definições da conta. missingPassphrase=Introduza uma frase de acesso errorHandling.gpgAgentInvalid=O seu sistema está a executar uma versão do gpg-agent que não é adequada para a sua versão GnuPG. errorHandling.gpgAgentError=O GnuPG reportou um erro na comunicação com gpg-agent (uma componente do GnuPG). errorHandling.dirmngrError=O GnuPG reportou um erro na comunicação com dirmngr (um componente do GnuPG). errorHandling.pinentryError=O GnuPG não consegue consultar a sua frase de acesso via pinentry. errorHandling.readFaq=Isto é um erro provocado por configurações ou definições de sistema que impede o Enigmail de funcionar corretamente e não pode ser resolvido automaticamente.\n\nRecomenda-se veementemente que consulte o nosso sítio web de suporte em https://enigmail.net/faq. gpgNotFound=Foi impossível encontrar o GnuPG em '%S'.\nCertifique-se de que configurou corretamente a localização do executável GnuPG nas Preferências do Enigmail. gpgNotInPath=Foi impossível encontrar o executável GnuPG no PATH.\nCertifique-se de que configurou corretamente a localização do executável GnuPG nas Preferências do Enigmail. enigmailNotAvailable=Serviço básico do Enigmail indisponível prefGood=Assinatura válida de %S prefBad=Assinatura INVÃLIDA de %S failCancel=Erro - Importação de chave cancelada pelo utilizador failNoServer=Erro - Nenhum servidor configurado do qual importar a chave failNoID=Erro - Não foi indicado o Identificador da chave a importar failKeyExtract=Erro - O comando de extração de chave falhou notFirstBlock=Erro - O primeiro bloco OpenPGP não contém uma chave pública importKeyConfirm=Importar chave(s) pública(s) contidas na mensagem? failKeyImport=Erro - a importação de chave falhou fileWriteFailed=Erro ao escrever no ficheiro %S importKey=Importar a chave pública %S do servidor: uploadKey=Exportar chave %S para o servidor: keyId=Identificador da chave keyAndSigDate=Identificador da chave: 0x%1$S / Assinada em: %2$S keyFpr=Impressão digital da chave: %S noEmailProvided=Não introduziu um endereço de correio eletrónico! keyAlreadySigned=A chave já está assinada, não pode assiná-la novamente. ##################################################################### # Strings used in enigmailKeySelection.js ##################################################################### selKeyExpired=expirada em %S createdHeader=Criada atLeastOneKey=Nenhuma chave seleccionada! Deve seleccionar pelo menos uma chave para fechar este diálogo fewerKeysThanRecipients=Seleccionou menos chaves que destinatários. Tem a certeza de que a lista de chaves para cifrar está completa? userSel.button.goBack=Seleccionar Mais Chaves userSel.secretKeySel.title=Seleccionar uma Chave OpenPGP Privada para Assinar as Suas Mensagens userSel.problemNoKey=Não foi encontrada uma chave válida userSel.problemMultipleKeys=Múltiplas chaves # should be same as thunderbird ENTITY sendLaterCmd.label: sendLaterCmd.label=Enviar mais tarde # Strings used in enigmailAttachmentDialog.js # pgpMimeNote=NOTE: PGP/MIME is not supported by all email clients. If you are unsure, select the %S option. first=primeira second=segunda # Strings used in am-enigprefs.js / enigmailEditIdentity.js encryptKeyHeader=Seleccione a chave OpenPGP para Cifrar identityName=Identidade: %S # switchPepMode=You are currently using the 'p≡p Junior' mode of Enigmail.\n\nBy enabling OpenPGP or S/MIME for an account, you are disabling p≡p and use the 'regular' mode of Enigmail without p≡p. # enableEnigmail=&Disable p≡p # Strings used in enigmailSingleRcptSettings.js noEncryption=Ativou a cifra mas não selecionou uma chave. Para cifrar o correio enviado para %1$S, necessita de escolher uma ou várias chaves válidas da sua lista de chaves. Deseja desativar a cifra para %2$S? noKeyToUse=(nenhuma - em claro) noEmptyRule=A Regra não pode ficar em branco! Por favor, introduza um endereço de correio no campo Regra. invalidAddress=O(s) endereço(s) de correio que introduziu não são válidos. Não deve introduzir o nome dos destinatários, apenas os seus endereços. Ex:\nInválido: Nome Qualquer \nVálido: nome.qualquer@endereco.net # noCurlyBrackets=The curly brackets {} have a special meaning and should not be used in an email address. If you want to modify the matching behavior for this rule, use the 'Apply rule if recipient ...' option.\nMore information is available from the Help button. # Strings used in enigmailRulesEditor.js never=Nunca always=Sempre possible=Possível deleteRule=Deseja mesmo remover a regra seleccionada? nextRcpt=(Próximo destinatário) negateRule=Não addKeyToRule=Adicionar a chave %1$S (%2$S) à regra por destinatário # Strings used in enigmailSearchKey.js needOnline=A função que seleccionou não está disponível quando desligado da Internet. Por favor, ligue-se à rede e tente novamente. protocolNotSupported=O protocolo '%S://' que seleccionou não é suportado para importar chaves OpenPGP. gpgkeysDisabled=Ativar a opção 'extensions.enigmail.useGpgKeysTool' pode ajudar. noKeyserverConn=Foi impossível estabelecer ligação com o servidor %S. keyDownloadFailed=A transferência de chave do servidor falhou. Mensagem do sistema:\n%S internalError=Ocorreu um erro interno. Foi impossível transferir ou importar as chaves. noKeyFound=Desculpe, não foi possível encontrar uma chave com o critério de busca especificado.\nPor favor, note que os identificadores de chave devem conter o prefixo \\"0x\\" (por ex: 0xABCDEF12). # keyDownload.keyUnavailable=We are sorry, but the key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their key by email. # gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. gpgKeysFailed=A procura ou importação das chaves do servidor falhou: foi impossível executar gpgkeys_%S. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Erro ao definir a confiança no utilizador # Strings in enigmailSignKeyDlg.js signKeyFailed=Erro ao assinar a chave alreadySigned.label=Nota: a chave %S já está assinada com a chave privada selecionada. alreadySignedexportable.label=Nota: a chave %S já está assinada como exportável com a chave privada selecionada. Uma assinatura local não faz sentido. partlySigned.label=Nota: alguns identificadores de utilizador da chave %S já estão assinados com a chave secreta selecionada. noTrustedOwnKeys=Não foi encontrada nenhuma chave elegível para assinar! Necessita de pelo menos uma chave privada com total confiança para poder assinar chaves. # Strings in enigmailKeyManager.js keyMan.loadingKeys=Carregando as chaves, por favor aguarde... keyValid.unknown=desconhecida keyValid.invalid=inválida keyValid.disabled=desativada keyValid.revoked=revogada keyValid.expired=expirada keyValid.noSubkey=sem subchave válida keyTrust.untrusted=nula keyTrust.marginal=marginal keyTrust.full=normal keyTrust.ultimate=total keyTrust.group=(grupo) keyType.public=pub keyType.publicAndSec=pub/sec keyMan.enableKey=Ativar Chave keyMan.disableKey=Desativar Chave userAtt.photo=Atributo de utilizador (imagem JPEG) asciiArmorFile=Armadura ASCII (*.asc) importKeyFile=Importar Ficheiro com Chaves OpenPGP gnupgFile=Ficheiros GnuPG # createKeyOK=Your Key has been generated saveRevokeCertAs=Criar e Guardar Certificado de Revogação # revokeCertOK=The revocation certificate has been successfully created. You can use it to invalidate your public key, e.g. in case you would lose your secret key. revokeCertFailed=O certificado de revogação não pôde ser criado. addUidOK=Identificador de utilizador adicionado com sucesso. addUidFailed=Erro ao adicionar o identificador de utilizador noKeySelected=Deve seleccionar pelo menos uma chave para completar a operação seleccionada exportToFile=Exportar Chave Pública para Ficheiro exportKeypairToFile=Exportar as Chaves Pública e Privada para um Ficheiro exportSecretKey=Deseja incluir a chave privada no ficheiro de chave OpenPGP guardado? saveKeysOK=As chaves foram guardadas com sucesso saveKeysFailed=Erro ao guardar as chaves importKeysFailed=Erro ao importar as chaves enableKeyFailed=A ativação/desativação das chaves falhou specificPubKeyFilename=%1$S (0x%2$S) pub specificPubSecKeyFilename=%1$S (0x%2$S) pub-sec defaultPubKeyFilename=Chaves-publicas-exportadas defaultPubSecKeyFilename=Chaves-publicas-e-privadas-exportadas noSecretKeys=Não foram encontradas chaves privadas.\n\nDeseja criar a sua chave agora? sendKeysOk=Chave(s) enviadas com sucesso sendKeysFailed=Erro ao enviar as chaves receiveKeysOk=Chave(s) atualizada(s) com sucesso receiveKeysFailed=Erro ao importar as chaves importFromClip=Deseja importar chaves da Ãrea de Transferência? importFromUrl=Descarregar chave pública deste URL: copyToClipbrdFailed=Foi impossível copiar as chaves seleccionadas para a Ãrea de Transferência. copyToClipbrdOK=Chave(s) copiada(s) para a Ãrea de Transferência deleteSecretKey=AVISO: Está prestes a remover uma chave privada!\nAo remover a sua chave privada ficará impedido de decifrar qualquer mensagem cifrada para essa chave ou de a revogar.\n\nTem a certeza de que deseja remover AMBAS as chaves, pública e privada\n'%S'? deleteMix=AVISO: Está prestes a apagar chaves privadas!\nSe apagar a sua chave privada, não poderá mais decifrar mensagens cifradas para essa chave.\n\nDeseja realmente apagar AMBAS as chaves seleccionadas, pública e privada? deletePubKey=Deseja remover a chave pública\n'%S'? deleteSelectedPubKey=Deseja apagar as chaves públicas? deleteKeyFailed=Foi impossível remover a chave. revokeKeyQuestion=Está prestes a revogar a chave %S.\n\nIrá perder a hipótese de assinar com esta chave e, após distribuído este certificado, mais ninguém lhe poderá enviar mensagens cifradas com essa chave. Poderá continuar a usar a chave para decifrar mensagens antigas.\n\nDeseja continuar? revokeKeyOk=A chave foi revogada. Se tinha a chave disponível num servidor, deve exportá-la de novo, para que todos possam ver a revogação. revokeKeyFailed=Foi impossível revogar a chave. # revokeKeyNotPresent=You have no key (0x%S) which fits to this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before the revocation certificate! # revokeKeyAlreadyRevoked=The key 0x%S has already been revoked. refreshAllQuestion=Não seleccionou qualquer chave. Deseja refrescar TODAS as chaves? # refreshKeyServiceOn.warn=Warning: Your keys are currently being refreshed in the background as safely as possible.\nRefreshing all your keys at once will unnecessarily reveal information about you.\nDo you really want to do this? refreshKey.warn=Aviso: dependendo do número de chaves e da velocidade da sua ligação, refrescar todas as chaves pode ser um processo bastante longo! downloadContactsKeys.warn=Aviso: dependendo do número de contactos e da velocidade de ligação, transferir todas as chaves pode demorar um tempo apreciável. downloadContactsKeys.importFrom=Importar contactos do livro de endereços '%S'? keyMan.button.exportSecKey=&Exportar Chaves Privadas keyMan.button.exportPubKey=Exportar Apenas Chaves &Públicas keyMan.button.import=&Importar keyMan.button.refreshAll=&Refrescar Todas as Chaves keyMan.button.revokeKey=&Revogar Chave keyMan.button.skip=&Saltar Chave keylist.noOtherUids=Não tem outras identidades keylist.hasOtherUids=Também conhecido como keylist.noPhotos=Sem fotografia disponível keylist.hasPhotos=Fotografias keyMan.addphoto.filepicker.title=Seleccionar fotografia a adicionar keyMan.addphoto.warnLargeFile=O ficheiro que escolheu é maior que 25 kB.\nNão é recomendado usar ficheiros muito grandes pois isso aumenta consideravelmente o tamanho das chaves. keyMan.addphoto.noJpegFile=O ficheiro seleccionado não aparenta estar no formato JPEG. Por favor, seleccione um ficheiro diferente. keyMan.addphoto.failed=A fotografia não pôde ser adicionada. # noWksIdentity=The key %S does not have a WKS identity. # keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key "%1$S (%2$S)" for encrypting messages? # keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key "%1$S (%2$S)" for future messages? # keyman.addBlacklistKey.button=&Blacklist the key # keyman.removeBlacklistKey.button=&Remove key from Blacklist # Strings in enigmailManageUidDlg.xul changePrimUidFailed=Erro ao alterar o Identificador de Utilizador principal changePrimUidOK=O Identificador de Utilizador principal foi alterado com sucesso revokeUidFailed=Foi impossível revogar o Identificador de Utilizador %S revokeUidOK=Identificador de Utilizador %S foi revogado com sucesso. Se tinha a chave disponível num servidor, deve exportá-la de novo, para que todos possam ver a revogação. revokeUidQuestion=Tem a certeza que deseja revogar o Identificador de Utilizador %S? # Strings in enigmailKeyImportInfo.xul importInfoTitle=SUCESSO! Chaves importadas importInfoBits=Bits importInfoCreated=Criada importInfoFpr=Impressão digital importInfoDetails=(Detalhes) importInfoNoKeys=Nenhuma chave importada. # Strings in enigmailKeyDetailsDlg.xul keyTypePublic=chave pública keyTypePrimary=chave primária keyTypeSubkey=chave secundária keyTypePair=par de chaves keyExpiryNever=nunca keyAlgorithm_1=RSA keyAlgorithm_2=RSA keyAlgorithm_3=RSA keyAlgorithm_16=ELG keyAlgorithm_17=DSA keyAlgorithm_18=ECDH keyAlgorithm_19=ECDSA keyAlgorithm_20=ELG keyAlgorithm_22=EDDSA keyUsageEncrypt=Cifrar keyUsageSign=Assinar keyUsageCertify=Certificar keyUsageAuthentication=Autenticação keyDoesNotExpire=A chave nunca expira # Strings in enigmailGenCardKey.xul keygen.started=Por favor, aguarde enquanto a chave está a ser criada .... keygen.completed=Chave criada. O identificador da nova chave é: 0x%S keygen.keyBackup=Foi efetuada um cópia de segurança da chave com o nome %S keygen.passRequired=Por favor, introduza uma senha se deseja criar uma cópia de segurança da sua chave fora do SmartCard. # Strings in enigmailSetCardPin.xul cardPin.processFailed=A alteração do PIN falhou # Strings in enigRetrieveProgres.xul keyserverProgress.refreshing=Refrescando as chaves, aguarde por favor... keyserverProgress.uploading=Transferindo as chaves, aguarde por favor ... # keyserverProgress.wksUploadFailed=Could not upload your key to the Web Key Service # keyserverProgress.wksUploadCompleted=Your public key was successfully submitted to your provider. You will receive an email to confirm that you initiated the upload. keyserverTitle.refreshing=Refrescar Chaves keyserverTitle.uploading=Transferência de Chaves # Strings in enigmailSetupWizard passphrase.min8keys=A sua senha deve conter pelo menos 8 caracteres! setupWizard.reallyCancel=Deseja realmente fechar o Assistente de Configuração do Enigmail? setupWizard.invalidGpg=O ficheiro que escolheu não é um executável GnuPG. Por favor, indique outro ficheiro. setupWizard.specifyFile=Necessita de indicar pelo menos uma chave pública para continuar. setupWizard.installFailed=Parece que a instalação não foi bem sucedida. Tente instalar de novo ou instalar o GnuPG manualmente e localizá-lo usando o botão Procurar. # setupWizard.downloadForbidden=For your own security, we will not download GnuPG. Please visit https://gnupg.org/ in order to download GnuPG. # setupWizard.downloadImpossible=We cannot download GnuPG currently. Please try later or visit https://gnupg.org/ in order to download GnuPG. setupWizard.hashSumError=O assistente não foi capaz de verificar a integridade do ficheiro transferido. O ficheiro pode estar corrompido ou ter sido manipulado. Deseja continuar a instalação de qualquer forma? setupWizard.importSettingsFile=Indique o ficheiro da cópia de segurança setupWizard.invalidSettingsFile=O ficheiro indicado não é uma cópia de segurança das Definições do Enigmail. setupWizard.gpgConfExists=O ficheiro de configuração do GnuPG já existe. Deseja substituí-lo pelo ficheiro da sua instalação anterior? # setupWizard.noGpgHomeDir=It appears that you configured %S to use for GnuPG. However, this is not a directory - you cannot use it. # setupWizard.unmachtedIds=The following identities of your old setup could not be matched:\n%S\nThe settings for these identities were skipped. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=Ocorreu um erro ao tentar transferir o GnuPG. Por favor verifique a Consola de Erro para mais detalhes. installGnuPG.installFailed=Ocorreu um erro ao instalar o GnuPG. Por favor, verifique a Consola de Erro para mais detalhes. # Strings in enigmailAddUidDlg.xul addUidDlg.nameOrEmailError=Tem de inserir um nome e endereço de correio eletrónico addUidDlg.nameMinLengthError=O nome deve ter pelo menos 5 caracteres addUidDlg.invalidEmailError=Deve inserir um endereço de correio eletrónico válido # Strings in enigmailCardDetails.js Carddetails.NoASCII=Os Smartcards OpenPGP apenas suportam caracteres ASCII no Nome/Apelido. # network error types errorType.SecurityCertificate=O certificado de segurança apresentado pelo serviço web não é válido. errorType.SecurityProtocol=O protocolo de segurança usado pelo serviço web não é conhecido. errorType.Network=Ocorreu um erro de rede. # filter stuff filter.folderRequired=Deve escolher uma pasta de destino. filter.decryptMove.label=Decifrar permanentemente (Enigmail) filter.decryptCopy.label=Criar Cópia Decifrada (Enigmail) filter.decryptMove.warnExperimental=Aviso - a ação do filtro 'Decifrar permanentemente' poderá levar à destruição de mensagens.\n\nRecomenda-se vivamente que tente primeiro o filtro "Criar Cópia Decifrada", testando o resultado com atenção, e apenas use este filtro se ficar satisfeito com o resultado. # filter.tempPepFilterDesc=Temporary filter to store sent message unencrypted # filter.term.pgpencrypted.label=OpenPGP Encrypted # filter.encrypt.label=Encrypt to key (Enigmail) # filter.keyRequired=You must select a recipient key. # filter.keyNotFound=Could not find an encryption key for "%S". # filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for "%S" you will no longer be able to read the emails. # strings in enigmailConvert.jsm converter.decryptBody.failed=Não foi possível decifrar a mensagem com o assunto\n"%S".\nDeseja repetir com uma frase senha diferente ou saltar a mensagem? converter.decryptAtt.failed=Não foi possível decifrar o anexo "%1$S"\nda mensagem com o assunto\n"%2$S".\nDeseja repetir com uma frase senha diferente ou saltar a mensagem? saveLogFile.title=Guardar Ficheiro de Registo # strings in gpg.jsm unknownSigningAlg=Algoritmo de assinatura desconhecido (Identificador: %S) unknownHashAlg=Hash criptográfico desconhecido (Identificador: %S) # strings in keyRing.jsm keyring.photo=Foto keyRing.pubKeyRevoked=A chave %1$S (Identificador %2$S) foi revogada. keyRing.pubKeyExpired=A chave %1$S (Identificador %2$S) expirou. keyRing.pubKeyNotForSigning=A chave %1$S (Identificador %2$S) não pode ser usada para assinar. keyRing.pubKeyNotForEncryption=A chave %1$S (Identificador %2$S) não pode ser usada para cifrar. keyRing.keyDisabled=A chave %1$S (Identificador %2$S) está desativada; não pode ser usada. keyRing.keyNotTrusted=Não confia suficientemente na chave %1$S (Identificador %2$S). Por favor defina o nível de confiança da sua chave para "total" para poder assinar com ela. keyRing.keyInvalid=A chave %1$S (Identificador %2$S) não é válida (por exemplo, não está auto-assinada). keyRing.signSubKeysRevoked=Todas as subchaves de assinatura %1$S (Identificador %2$S) foram revogadas. keyRing.signSubKeysExpired=Todas as subchaves de assinatura da chave %1$S (Identificador %2$S) expiraram. keyRing.signSubKeysUnusable=Todas as subchaves de assinatura da chave %1$S (Identificador %2$S) foram revogadas, expiraram ou estão, de outro modo, inutilizáveis. keyRing.encSubKeysRevoked=Todas as subchaves de cifra da chave %1$S (Identificador %2$S) foram revogadas. keyRing.encSubKeysExpired=Todas as subchaves de cifra da chave %1$S (Identificador %2$S) expiraram. keyRing.noSecretKey=Parece que não tem a chave secreta de %1$S (Identificador %2$S) no seu porta-chaves; não pode usar a chave para assinar. keyRing.encSubKeysUnusable=Todas as subchaves de cifra da chave %1$S (Identificador %2$S) foram revogadas, expiraram ou estão, de outro modo, inutilizáveis. #strings in exportSettingsWizard.js cannotWriteToFile=Não foi possível guardar para o ficheiro '%S'. Por favor selecione outro ficheiro. dataExportError=Ocorreu um erro a exportar os seus dados. enigmailSettings=DefinicoesEnigmail defaultBackupFileName=Enigmail-export specifyExportFile=Indique o nome do ficheiro para exportar homedirParamNotSUpported=Parâmetros adicionais que configuram caminhos como --homedir e --keyring não são suportados na exportação/restauração. Por favor use métodos alternativos tais como definir a variável de ambiente GNUPGHOME. #strings in expiry.jsm expiry.keyExpiresSoon=A sua chave %1$S expira em menos de %2$S dias.\n\nRecomenda-se que crie um novo par de chaves e configure as contas correspondentes para usarem a nova chave. # expiry.keysExpireSoon=The following of your keys will expire in less than %1$S days:\n%2$S We recommend that you create new keys and configure your accounts to use the new keys. # expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to ultimate in key properties. expiry.keysMissingOwnerTrust=As suas chaves que se seguem não são de confiança:\n%S.\nRecomenda-se que configure "Confio nos certificados" para totalmente nas propriedades da chave. expiry.OpenKeyManager=Abrir Gestor de Chaves do Enigmail # expiry.OpenKeyProperties=Open Key Properties #strings in pEpDecrypt.jsm # pEpDecrypt.cannotDecrypt=This is an encrypted message. Unfortunately you don't have the secret key to decrypt the message. #strings in gpgAgent.jsm gpghomedir.notexists=A diretoria '%S' contendo as suas chaves OpenPGP não existe e não pode ser criada. # gpghomedir.notwritable=The directory '%S' containing your OpenPGP keys is not writable. # gpghomedir.notdirectory=The directory '%S' containing your OpenPGP keys is a file instead of a directory. # gpghomedir.notusable=Please fix the directory permissions or change the location of your GnuPG "home" directory. GnuPG cannot work correctly otherwise. #strings in pepTrustWords.js # pepTrustWords.cannotVerifyOwnId=Cannot verify p≡p Trustwords for own account. pepTrustWords.cannotFindKey=Não foi possível encontrar a chave para %S. # pepTrustWords.cannotStoreChange=Could not change trust for %S. # pepTrustWords.generalFailure=Cannot obtain trustwords for %S. pepTrustWords.partnerFingerprint=Impressão Digital para %S: #strings in mimeWkdHandler.jsm # wkdMessage.body.req=Your email provider processed your request to upload your public key to the OpenPGP Web Key Directory.\n\nPlease click the confirmation button in the Enigmail header to complete the publishing of your public key. wkdMessage.body.process=Esta é uma mensagem relacionada com o processamento automático para transferir a sua chave pública para a Diretoria Web Key Open PGP.\n\nNão é necessário tomar qualquer ação neste momento. #strings in pepHandshake.js # pepPrivacyStatus.RatingBrokenSuggestion=Either you or the sender should resend the message. # pepPrivacyStatus.RatingHaveNoKeySuggestionOutgoing=If you composed this message, your key is not available. # pepPrivacyStatus.RatingMistrustSuggestion=Re-establish the connection with your communication partner and try to complete another handshake. # pepPrivacyStatus.RatingReliableSuggestion=Complete a handshake with your communication partner by exchanging trustwords in person or over the phone. A handshake is needed only once per partner and will ensure secure and trusted communication. # pepPrivacyStatus.RatingTrustedSuggestion=No action needed! # pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware this message may not be secure. pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Por favor, adicione a informação necessária. # pepPrivacyStatus.RatingUnderAttackSuggestion=Separately verify the content of this message with your communication partner. # pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least secure. # pepPrivacyStatus.RatingUnencryptedSuggestion=Please ask your communication partner to use an encryption solution or install p≡p. # pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or no signature. Ask your communication partner to upgrade their encryption solution or install p≡p. # pepPrivacyStatus.RatingBrokenExplanation=This message has broken encryption or formatting. # pepPrivacyStatus.RatingHaveNoKeyExplanation=This message cannot be decrypted because the key is not available. # pepPrivacyStatus.RatingMistrustExplanation=This message has a communication partner that has previously been marked as mistrusted. # pepPrivacyStatus.RatingReliableExplanation=This message is secure but you still need to verify the identity of your communication partner. # pepPrivacyStatus.RatingTrustedExplanation=This message is secure and trusted. # pepPrivacyStatus.RatingUndefinedExplanation=This message does not contain enough information to determine if it is secure. # pepPrivacyStatus.RatingUnderAttackExplanation=This message is not secure and has been tampered with. pepPrivacyStatus.RatingUnencryptedExplanation=Esta mensagem não é segura. # pepPrivacyStatus.RatingUnencryptedForSomeExplanation=This message is unsecure for some communication partners. # pepPrivacyStatus.RatingUnreliableExplanation=This message has unreliable protection. # pepPrivacyStatus.RatingBrokenText=Broken # pepPrivacyStatus.RatingHaveNoKeyText=Cannot Decrypt # pepPrivacyStatus.RatingMistrustText=Mistrusted # pepPrivacyStatus.RatingReliableText=Secure # pepPrivacyStatus.RatingTrustedText=Secure & Trusted # pepPrivacyStatus.RatingUndefinedText=Unknown # pepPrivacyStatus.RatingUnderAttackText=Under Attack pepPrivacyStatus.RatingUnencryptedForSomeText=Inseguro para Alguns # pepPrivacyStatus.RatingUnencryptedText=Unsecure pepPrivacyStatus.RatingUnreliableText=Segurança Não Confiável # handshakeDlg.button.initHandshake=Handshake... # handshakeDlg.button.stopTrust=Stop Trusting # handshakeDlg.button.reTrust=Stop Mistrusting handshakeDlg.label.outgoingMessage=Mensagem a enviar handshakeDlg.label.incomingMessage=Mensagem recebida # handshakeDlg.error.noPeers=Cannot handshake without any correspondents. # handshakeDlg.error.noProtection=Please enable protection in order to use the Handshake function. # enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device # enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup #strings in autocrypt.jsm # autocrypt.setupMsg.subject=Autocrypt Setup Message # autocrypt.setupMsg.msgBody=To set up your new device for Autocrypt, please follow the instuctions that should be presented by your new device. # autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code presented on your old device, and then import the contained key into your keyring. #strings in upgradeInfo.html # upgradeInfo.doctitle=What's New in Enigmail v2.0? # upgradeInfo.welcome1=Welcome to the new Enigmail version 2.0! # upgradeInfo.welcome2=The release contains a lot of new and changed features. Please take a minute to find out what's new: # upgradeInfo.encSubject.title=Encrypting the Message Subject # upgradeInfo.encSubject.desc=We developed a new method that moves the email subject into the encrypted message, and replaces the visible subject with "Encrypted Message". Once such a message is decrypted, the original subject is replaced automatically. Hiding the subject is on by default; there is a preference to turn it off if you don't like it. (Note: this feature requires the message to be sent with PGP/MIME.) # upgradeInfo.buttons.title=Changed behavior of Encrypt and Sign Buttons # upgradeInfo.buttons.desc=The Encrypt and Sign buttons in the message composer window now work for both the OpenPGP and S/MIME protocols. If both algorithms are possible, then Enigmail will try to prefer the one for which all keys are available. # upgradeInfo.autocrypt.title=Support for Autocrypt # upgradeInfo.autocrypt.desc=Enigmail now supports Autocrypt, a new standard to distribute keys as part of sent messages. Enigmail automatically imports keys from Autocrypt-compliant messages, such that over time more and more emails can be encrypted. # upgradeInfo.pEp.title=New p≡p Junior Mode (Pretty Easy Privacy) # upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. You currently need to manually install p≡p for this purpose; this will change in a future release. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. # upgradeInfo.bottom.desc=Please visit our documentation for help on using Enigmail. # pep.missingGnuPG=In order to use Enigmail/p≡p, GnuPG is required. As we could not find it, we suggest to download and install it for you. #strings in enigmailAbout.html # aboutEnigmail.tabName=About Enigmail # aboutEnigmail.title=OpenPGP support provided by Enigmail # aboutEnigmail.team=Enigmail is developed by the Enigmail Team: # aboutEnigmail.projectLeader=Lead Developer: # aboutEnigmail.usability=Usability: # aboutEnigmail.documentation=Documentation: # aboutEnigmail.testing=Testing: # aboutEnigmail.userSupport=User Support: # aboutEnigmail.localization=Localization: See the Enigmail Language Packs page # aboutEnigmail.Credits=Credits: # aboutEnigmail.origAuthor=Original author of the Enigmail extension # aboutEnigmail.icons=Icons: # aboutEnigmail.formerMembers=Former team members: # aboutEnigmail.projectHosting=Project hosting: # aboutEnigmail.licenseSupportTitle=License & Support # aboutEnigmail.license=Enigmail OpenPGP is open source and licensed under the %S # aboutEnigmail.support=Support and download is available from www.enigmail.net. enigmail-2.0.8/lang/pt-PT/help/000077500000000000000000000000001334302754500161315ustar00rootroot00000000000000enigmail-2.0.8/lang/pt-PT/help/compose.html000066400000000000000000000111521334302754500204640ustar00rootroot00000000000000 Ajuda do Enigmail: Composição de Mensagens

Ajuda do Enigmail

Usando o Enigmail ao compor mensagens

  • Menu Enigmail na janela Correio/Composição
    • Assinar mensagem: Activar/Desactivar o envio de correio assinado. O utilizador será notificado se a assinatura falhar.
    • Cifrar mensagem: Activar/Desactivar a encriptação para todo(s) o(s) destinatário(s) antes do envio. O utilizador será notificado se a encriptação falhar.

      Se a opção Mostrar selecção quando necessário estiver seleccionada no separador Preferências Enigmail -> Selecção de chaves, será apresentada uma lista de chaves no caso de haver endereços de email na lista de destinatários para os quais tenha a chave pública.

      Se a opção Nunca mostrar selecção de chave OpenPGP estiver seleccionada no separador Preferências Enigmail -> Selecção de chaves, e houver endereços de email na lista de destinatários para os quais não tem a chave pública, a mensagem será enviada em claro.

    • Usar PGP/MIME para esta mensagem: Activar/Desactivar o uso de PGP/MIME para esta mensagem.

      Se sabe que o(s) destinatário(s) podem ler correio electrónico no formato PGP/MIME, deve usá-lo.

      Esta funcionalidade depende da configuração no separador Preferências -> PGP/MIME estar para Permitir o uso de PGP/MIME ou Usar sempre PGP/MIME.

    • Opções de composição por omissão: Submenu.
      • Opções de assinar/cifrar...: atalho para Opções de conta -> Opções OpenPGP.
      • Opções de envio...: atalho para o separador Preferências -> Ao Enviar.
      • Opções de Selecção de chaves...: atalho o separador Preferências -> Selecção de chaves.
      • Opções PGP/MIME...: atalho para o separador Preferências -> PGP/MIME.
    • Desfazer encriptação: se acontecer um erro ao enviar o correio, por exemplo o servidor POP não aceitar o pedido, o Enigmail não terá conhecimento disso e a mensagem cifrada continuará a ser mostrada na janela de composição. Ao escolher este item de menu reverterá a operação de encriptação, colocando o texto original novamente na janela.
      Como solução temporária, esta opção pode também ser usada para decifrar as citações ao responder a mensagens cifradas. O Enigmail deve decifrar automaticamente as mensagens cifradas, mas se isso falhar por alguma razão, pode usar este item de menu para o forçar.
    • Inserir chave pública: inserir bloco de chave pública em ASCII na posição corrente do cursor na janela de Composição. Ser-lhe-á pedido o endereço de correio electrónico da(s) chave(s) a inserir. As chaves inseridas desta forma serão automaticamente reconhecidas pelo Enigmail na recepção. Após a inserção da chave, pode escolher assinar/cifrar a mensagem consoante necessário. Não insira mais do que um bloco de chave por mensagem; em vez disso, indique os vários endereços de email separados por vírgulas ou espaços quando tal lhe for pedido.
    • Limpar senha memorizada: Limpa a senha guardada em memória. Útil se tem várias senhas diferentes.
    • Editar regras por destinatário
    • Ajuda: Mostra a informação de ajuda do site web (esta página).

Ajuda adicional disponível na página web de Ajuda do Enigmail

enigmail-2.0.8/lang/pt-PT/help/editRcptRule.html000066400000000000000000000137641334302754500214400ustar00rootroot00000000000000 Ajuda do Engimail: Editar Regras OpenPGP

Ajuda do Enigmail

Usar o Editor de Regras do Enigmail: Editar Regras OpenPGP

No Editor de Regras, pode especificar, para cada destinatário, se deseja cifrar, assinar ou usar PGP/MIME por omissão e ainda quais as chaves OpenPGP a usar. Neste diálogo, pode especificar as regras para cada destinatário individualmente ou para cada grupo de destinatários com atributos semelhantes.

  • Configurar regras OpenPGP para: Contém os endereços de email dos destinatários (sem nomes, isto é, apenas um endereço como alguem@dominio.email). Pode indicar vários endereços de email, separados por espaços. Os endereços indicados aqui podem conter apenas o domínio, de forma a que apenas os endereços daquele domínio sejam mostrados, por exemplo, @dominio.email permitiria mostrar os endereços pessoa@dominio.email, alguem@dominio.email, qualquer@dominio.email, etc.
  • Aplicar regra se destinatário ...: Altera a forma de correspondência de endereços de email. Se forem introduzidos vários endereços, esta definição aplicar-se-á a todos. Os exemplos abaixo baseiam-se em introduzir pessoa@dominio.email no campo Regras OpenPGP definido acima.
    • É exactamente: com esta configuração, a regra apenas se aplicará às mensagens para pessoa@dominio.email (correspondência exacta, ignorando maiúsculas/minúsculas).
    • Contém: com esta configuração, a regra aplicar-se-á a todos os endereços que contenham a cadeia de caracteres especificada, por exemplo qualquerpessoa@dominio.email ou pessoa@dominio.email.net
    • Começa por: com esta configuração, a regra irá aplicar-se a qualquer endereço iniciado pela cadeia de caracteres especificada, como pessoa@dominio.email.net ou pessoa@dominio.email-nome.com.
    • Termina em: esta configuração aplica a regra a todos os endereços terminados com a cadeia de caracteres especificada, tais como qualquerpessoa@dominio.email ou umapessoa@dominio.email.
  • Continuar com a próxima regra para os endereços coindidentes
    Activar esta função permitirá definir uma regra sem ter que especificar o Identificador da chave em Usar as seguintes chaves OpenPGP:, de forma a que o endereço de email seja usado para procurar a chave ao enviar. De igual modo, as regras seguintes para os mesmos endereços serão processadas da mesma maneira.
  • Não verificar mais regras para os endereços coincidentes
    Activar esta definição impede o processamento de quaisquer outras regras para os endereços coincidentes, caso esta regra seja verificada; ou seja, o processamento de regras continua com o próximo destinatário.
  • Definições por omissão para assinar: activar ou desactivar a assinatura de mensagens. Esta definição usa ou sobrepõe-se ao que especificou na janela de composições de mensagens. Os valores são:
    • Nunca: desactivar a assinatura, mesmo se estiver seleccionada na janela de composição de mensagens (sobrepõe-se a outros valores)
    • Sim, se seleccionado na Composição de Mensagens: deixar a assinatura como especificado na janela de composição de mensagens
    • Sempre: Activar a assinatura, mesmo se não estiver seleccionada na janela de composição de mensagens
Estas configurações de assinatura são aplicadas a todas as regras coincidentes. Se uma das regras desactivar a assinatura, a mensagem não será assinada, independentemente do que outras regras especifiquem. Sempre.
  • Cifrar: Activar ou desactivar a encriptação de mensagens. As configurações permitidas e o seu significado são os mesmos que para a assinatura de mensagens.
  • PGP/MIME: activar ou desactivar o uso de PGP/MIME (RFC 3156) para a codificação de mensagens. Se não seleccionar PGP/MIME, as mensagens serão codificadas usando o método "PGP embebido". Os valores permitidos e o seu significado são os mesmos que para a assinatura de mensagens.

As regras são processadas na ordem em que são mostradas na lista Editor de Regras por Destinatário. Sempre que uma regra coincidir com um destinatário e contiver um Identificador de chave OpenPGP, para além de usar o Identificador de chave específico, implica que o destinatário não seja mais considerado ao processar regras posteriores.


Pode encontrar mais ajuda na página de Configurações de Regras por Destinatário do Enigmail

enigmail-2.0.8/lang/pt-PT/help/initError.html000066400000000000000000000046571334302754500210100ustar00rootroot00000000000000 Ajuda Enigmail: Como Resolver Problemas na Inicialização do OpenPGP

Ajuda Enigmail

Como Resolver Problemas na Inicialização do OpenPGP

Há vários motivos para que o OpenPGP não consiga inicializar. Os mais comuns estão descritos abaixo; para mais informação, visite por favor a Página de Suporte do Enigmail.

GnuPG não foi encontrado

Para que o OpenPGP possa funcionar, é necessário que a ferramenta GnuPG esteja instalada. Se não for possível encontrar o GnuPG, certifique-se que o executável gpg.exe (em Windows; gpg nas outras platformas) está instalado no seu computador. Em caso afirmativo, e se o OpenPGP não o conseguir encontrar, é necessário configurar manualmente o caminho para o GnuPG nas Preferências (menu OpenPGP > Preferências)

Não foi possível inicializar o Enigmime

O OpenPGP funciona apenas se for compilado na mesma plataforma que o Thunderbird ou Seamonkey. Isto significa que a versão oficial do Enigmail apenas pode ser usada em conjunto com as versões oficiais do Thunderbird ou Seamonkey fornecidas pela mozilla.org.

Se usa o Thunderbird ou Seamonkey provenientes de outra fonte (por exemplo, o fornecedor da sua distribuição de Linux), ou se compilou a aplicação localmente, deve usar uma versão de Enigmail do mesmo fornecedor ou compilar o Enigmail localmente. Instruções para compilar o Enigmail podem ser encontradas na Secção de Código Fonte da página web do Enigmail. Por favor, não submeta nenhum relatório de erro sobre este problema, uma vez que não tem solução.

Pode encontrar mais ajuda no Sítio Web de Suporte ao Enigmail.

enigmail-2.0.8/lang/pt-PT/help/messenger.html000066400000000000000000000114741334302754500210160ustar00rootroot00000000000000 Ajuda Enigmail: Leitura de mensagens

Ajuda Enigmail

Usar o Enigmail ao ler mensagens

  • Botão Decifrar na janela principal do Mail & Newsgroups / Thunderbird
    Este botão pode ser usado para: decifrar, verificar ou importar chaves públicas. Normalmente, as mensagens são decifradas e verificadas automaticamente, embora este comportamento possa ser desactivado numa preferência. Contudo, se isto falhar, será apresentada uma curta mensagem de erro na barra de estado do Enigmail. Se clicar sobre o botão Decifrar, poderá ver uma mensagem mais detalhada, incluindo a saída do comando GnuPG.
  • Ícones da Caneta e da Chave no Cabeçalho da Mensagem
    Os ícones da Caneta e da Chave no Cabeçalho da Mensagem indicam se a mensagem que está a ler foi assinada e/ou cifrada e se a assinatura é válida, ou seja, se a mensagem não foi alterada desde que foi assinada. Se a mensagem foi alterada o ícone da Caneta mudará para uma Caneta Quebrada para indicar que a assinatura não é válida. Clicar com o botão alternativo do rato quer no ícone da Caneta quer no ícone da Chave fará aparecer um menu com as seguintes opções:
    • Informação de Segurança OpenPGP: permite ver a saída do GnuPG para a mensagem.
    • Copiar Informação de Segurança OpenPGP: copia a saída do GnuPG para a área de transferência; para colar numa mensagem de resposta, etc.
    • Ver Identificador Fotográfico OpenPGP: permite ver o Identificador Fotográfico do remetente, se ele tiver uma fotografia embebida na sua Chave Pública. (Esta opção estará activa apenas se existir um Identificador Fotográfico na chave.)
    • Informação de Segurança S/MIME: permite ver a informação de segurança S/MIME da mensagem.

    Se não tiver keyserver-options auto-key-retrieve no seu ficheiro gpg.conf e receber uma mensagem assinada ou cifrada, verá, na área de visualização do cabeçalho da mensagem, um ícone com uma Caneta com um ponto de interrogação sobreposto, a barra de estado do Enigmail na área do cabeçalho dirá Parte da mensagem assinada; para mais informação, clique sobre o ícone da caneta e a mensagem no Painel de Mensagem mostrará os indicadores de um bloco OpenPGP e o bloco da assinatura.

    Também poderá ver isto se tiver keyserver-options auto-key-retrieve no seu ficheiro gpg.conf e a chave não estiver disponível no seu servidor de chaves por omissão.

    Clicar sobre o ícone da Caneta e Ponto de Interrogação fará aparecer uma janela informando que a chave não está disponível no seu porta-chaves. Clicar em OK mostrará outra janela com uma lista de servidores de chaves para escolher a partir de qual quer fazer a transferência da chave pública do remetente.

    Para configurar a lista dos servidores de chaves que deseja usar, vá ao separador Enigmail -> Preferências -> Básicas e introduza os endereços dos servidores no campo Servidor(es) de chave(s):, separados por vírgulas. O servidor de chaves listado em primeiro lugar será usado como o servidor por omissão.

  • Abrir anexos cifrados / importar chaves OpenPGP em anexo
    Anexos de nome *.pgp, *.asc, e *.gpg são reconhecidos como podendo ter um tratamento especial por parte do Enigmail. Clicar com o botão alternativo do rato num anexo deste tipo, activa dois itens de menu especiais no menu de contexto: Decifrar e Abrir e Decifrar e Gravar Como.... Use estes dois itens de menu se deseja que o Enigmail decifre um anexo antes de o abrir ou gravar. Se um anexo for reconhecido como um ficheiro contendo uma chave OpenPGP, é-lhe oferecida a possibilidade de importar as chaves para o seu porta-chaves.

Ajuda adicional disponível na página web de Ajuda do Enigmail

enigmail-2.0.8/lang/pt-PT/help/rulesEditor.html000066400000000000000000000072731334302754500213310ustar00rootroot00000000000000 Ajuda do Enigmail: Editor de Regras

Ajuda do Enigmail

Usar o Editor de Regras do Enigmail

No Editor de Regras, pode indicar as configurações a usar por omissão para cifrar, assinar e usar PGP/MIME, por destinatário e quais as chaves a usar. Cada regra consiste em 5 campos e é representada numa única linha:

  • Email: o(s) endereço(s) de email dos campos Para:, CC:, e BCC: a encontrar. Cada coincidência trabalha em substrings (Mais detalhes na janela do Editor de Regras)
  • Chave(s) OpenPGP: a lista de Identificadores de chaves OpenPGP a usar para o destinatário
  • Assinar: activar ou desactivar o assinar de mensagens. Esta configuração usa ou sobrepõe-se ao indicado na janela de Composição de mensagens. Os valores são:
    • Nunca: a mensagem não será assinada, mesmo com uma configuração em contrário na janela de composição de mensagens (sobrepõe-se a outros valores)
    • Possível: a mensagem será assinada ou não, consoante a configuração na janela de composição de mensagens.
    • Sempre: a mensagem será assinada, mesmo que a assinatura esteja desactivada na janela de composição de mensagens
    Estas configurações aplicam-se a todas as regras coincidentes. Se uma das regras desactivar a assinatura, a mensagem não será assinada, independentemente de outras regras especificadas. Sempre.
  • Cifrar: activar ou desactivar a encriptação de mensagens. As configurações permitidas e o seu significado são os mesmos de que para a assinatura de mensagens.
  • PGP/MIME: activar ou desactivar o uso da codificação de mensagens PGP/MIME (RFC 3156). Se a PGP/MIME estiver desactivada, as mensagens serão codificadas usando "PGP embebido". As configurações permitidas e o seu significado são os mesmo de que para a assinatura de mensagens.

As regras são processadas na ordem em que são mostradas na lista. Sempre que uma regra coincidir com um destinatário e contiver um Identificador de chave OpenPGP, esse destinatário não será mais considerado ao processar as regras seguintes, para além de ser usado o Identificador de chave especificado.

Nota: O editor de regras ainda não está completo. É possível escrever regras mais avançadas editando o ficheiro de regras directamente (estas regras não devem ser posteriormente editadas no editor de regras). Mais informação sobre a edição directa deste ficheiro está disponível na Homepage do Enigmail.


Ajuda adicional disponível na página web de Ajuda do Enigmail

enigmail-2.0.8/lang/pt-PT/help/sendingPrefs.html000066400000000000000000000047771334302754500214650ustar00rootroot00000000000000 Enigmail Help: Edit OpenPGP Rule

Enigmail Help

Defining Preferences to Send Encrypted

In the Sending Preferences you can choose the general model and preferences for encryption.

Convenient Encryption
With these settings, emails are encrypted without confirmation whenever possible.

This setup is appropriate, if you just want to improve your privacy by sending emails encyrpted instead of unencrypted if that's possible.

The effect is like sending emails as letters instead of postcards. Unlike postcards, letters usually hide their contents while in transit.

Note however that as with letters you can't be sure that nobody is opening the letter while it is in transit (although, some technical effort is necessary for that).

A concrete risk is that you accidentally use "faked keys" you got from somewhere or somebody claiming that the key belongs to the person you want to send emails to. To avoid this risk, you can either use the trust model of PGP (see below) or you should always verify, whether the fingerprint of a public key is correct.

Manual Encryption
This option allows you to specify the different preferences for encryption according to your needs. You can specify
  • whether replies to encrypted/signed emails should automatically also be encrypted/signed-
  • whether to use the trust model of OpenPGP to accept keys (this means that to use a key you either have to sign the key or have enough other people you trust having signed the key).
  • whether you want to automatically send emails encrypted if all keys are accepted.
  • whether and when you want to finally confirm sending an email.
If it is important for you that content you send encrypted can't be read by other people or organizations, you should use the manual preferences at least choose the option to accept keys only if you or other people signed them. While this model reduces the risk of using faked keys, it requires that you actively sign keys and declare owner trust using the key managament dialog. enigmail-2.0.8/lang/ru/000077500000000000000000000000001334302754500146635ustar00rootroot00000000000000enigmail-2.0.8/lang/ru/am-enigprefs.properties000066400000000000000000000001251334302754500213540ustar00rootroot00000000000000# Strings used in the Mozill AccountManager prefPanel-enigprefs=Защита OpenPGP enigmail-2.0.8/lang/ru/enigmail.dtd000066400000000000000000002205611334302754500171530ustar00rootroot00000000000000 ' Ð´Ð»Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð°Ð´Ñ€ÐµÑов Ñлектронной почты"> ' Ð´Ð»Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð°Ð´Ñ€ÐµÑов Ñлектронной почты Ð´Ð»Ñ GnuPG. Отключите, еÑли у ваших получателей имеютÑÑ Ñтарые ключи в формате Hushmail."> БезопаÑноÑть OpenPGP)"> ПРИМЕЧÐÐИЕ: Ñоздание ключей может занÑть неÑколько минут. Ðе закрывайте приложение во Ð²Ñ€ÐµÐ¼Ñ Ñтого процеÑÑа. Ðктивный проÑмотр интернета или интенÑивное выполнение операций диÑковых операций во Ð²Ñ€ÐµÐ¼Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ¹ внеÑут необходимый Ñлемент ÑлучайноÑти и уÑкорÑÑ‚ процеÑÑ. Ð’Ñ‹ будете предупреждены о завершении."> ' неверна"> ПРИМЕЧÐÐИЕ: Ñоздание ключей может занÑть неÑколько минут. Ðе закрывайте приложение во Ð²Ñ€ÐµÐ¼Ñ Ñтого процеÑÑа.Ð’Ñ‹ будете предупреждены о завершении ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ»ÑŽÑ‡Ð°."> Примечание: Enigmail будет вÑегда проверÑть подпиÑи под каждым Ñообщением Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ учетной запиÑи, незавиÑимо от того, включён ли он или нет"> Закрытый ключ — только ваш, Ñлужит Ð´Ð»Ñ Ñ€Ð°Ñшифровки пиÑем и Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð»Ñемых вами пиÑем. Ðе давайте его никому."> Закрытый ключ — только ваш, Ñлужит Ð´Ð»Ñ Ñ€Ð°Ñшифровки пиÑем и Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð»Ñемых вами пиÑем. Ðе давайте его никому. Ð”Ð»Ñ Ð·Ð°Ñ‰Ð¸Ñ‚Ñ‹ закрытого ключа в Ñледующих двух диалогах будет предложено указать парольную фразу."> ÐŸÐ°Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñ„Ñ€Ð°Ð·Ð° — Ñто пароль, защищающий ваш закрытый ключ. Он препÑÑ‚Ñтвует ошибочному иÑпользованию закрытого ключа."> не рекомендуютÑÑ."> ÑкÑпорт данных Ñо Ñтарого компьютера, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñтот маÑтер. импорт данных на новом компьютере иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¼Ð°Ñтер уÑтановки. "> СпаÑибо за иÑпользование Enigmail."> ÑкÑпорт данных Ñо Ñтарого компьютера, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñтот маÑтер. импорт данных на новом компьютере иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¼Ð°Ñтер уÑтановки. "> enigmail-2.0.8/lang/ru/enigmail.properties000066400000000000000000002227631334302754500206020ustar00rootroot00000000000000Enigmail=Enigmail ##################################################################### # Strings used within enigmailCommon.js and enigmailCommon.jsm ##################################################################### enigAlert=Предупреждение Enigmail enigConfirm=Подтверждение Enigmail # enigInfo=Enigmail Information enigError=Ошибка Enigmail enigPrompt=Приглашение Enigmail dlgYes=&Да dlgNo=&Ðет dlgKeepSetting=Запомнить решение и больше не показывать Ñто окно dlgNoPrompt=Ðе отображать опÑть Ñтот диалог dlg.button.delete=&Удалить dlg.button.cancel=&Отмена dlg.button.close=&Закрыть dlg.button.continue=Прод&олжить dlg.button.skip=&ПропуÑтить dlg.button.overwrite=&ПерезапиÑать dlg.button.view=П&роÑмотреть dlg.button.retry=&Повторить dlg.button.ignore=&Игнорировать # dlg.button.install=&Install # dlg.button.ok=&OK repeatPrefix=\n\nЭто предупреждение повторитÑÑ ÐµÑ‰Ñ‘ %S repeatSuffixSingular=раз. repeatSuffixPlural=раз(а). noRepeat=\n\nЭто предупреждение не будет поÑвлÑтьÑÑ, пока вы не обновите Enigmail. pgpNotSupported=Ð’Ñ‹ хотите иÑпользовать Enigmail вмеÑте Ñ PGP 6.x.\n\nК Ñожалению, PGP 6.x обладает Ñ€Ñдом проблем, не позволÑющих Enigmail работать корректно. ПоÑтому Enigmail больше не поддерживает PGP 6.x, пожалуйÑта, уÑтановите вмеÑто него GnuPG (GPG).\n\nЕÑли вам нужна помощь в уÑтановке GnuPG, обратитеÑÑŒ к Ñправочному разделу Ñайта Enigmail. initErr.howToFixIt=Ð”Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Enigmail требуетÑÑ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð° GnuPG. ЕÑли GnuPG ещё не уÑтановлена, проÑтейший ÑпоÑоб Ñделать Ñто — иÑпользовать «МаÑтер наÑтройки». initErr.setupWizard.button=&МаÑтер наÑтройки passphraseCleared=Пароль был очищен. cannotClearPassphrase=Ð’Ñ‹ иÑпользуете неÑтандартный инÑтрументарий (такой, как gnome-keyring) Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ парольной фразы. ОчиÑтка парольной фразы из Enigmail невозможна. noPhotoAvailable=Ð¤Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ñ Ð½Ðµ доÑтупна debugLog.title=Отладочный журнал Enigmail error.photoPathNotReadable=Ðе удаётÑÑ Ð¿Ñ€Ð¾Ñ‡ÐµÑть путь к фото «%S» # generalError=Error: %S # Strings in configure.jsm enigmailCommon.versionSignificantlyChanged=ÐžÐ±Ð½Ð¾Ð²Ð»Ñ‘Ð½Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Enigmail Ñодержит значительные Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² хранении параметров. Мы поÑтаралиÑÑŒ перенеÑти ваши прежние наÑтройки в новую верÑию, однако кое-что могло потерÑтьÑÑ, так как мы не можем предуÑмотреть автоматичеÑкий Ð¿ÐµÑ€ÐµÐ½Ð¾Ñ Ð²Ñех вариантов наÑтроек. ПожалуйÑта, перепроверьте обновлённые параметры и наÑтройки ÑобÑтвенноручно. enigmailCommon.checkPreferences=Перейти к наÑтройкам… preferences.defaultToPgpMime=Ð’ Enigmail ÑпоÑоб ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ умолчанию был изменён Ñ Â«Inline-PGP» на «PGP/MIME», и рекомендуетÑÑ Ñохранить Ñти наÑтройки.\n\nЕÑли вы желаете иÑпользовать Inline-PGP по умолчанию, Ñто можно Ñделать в наÑтройках аккаунта в разделе «Защита PGP». ##################################################################### # Strings in enigmailAbout.js ##################################################################### usingVersion=ИÑпользуетÑÑ Enigmail верÑии %S # enigmailPepVersion=Enigmail/p≡p version %S usingAgent=ИÑпользуетÑÑ %S %S Ð´Ð»Ñ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ раÑшифровки agentError=ОШИБКÐ: ошибка доÑтупа к Ñлужбе Enigmime! ##################################################################### # Strings in enigmailKeygen.js ##################################################################### accessError=Ошибка доÑтупа к Ñлужбе Enigmail onlyGPG=Создание ключей возможно только при иÑпользовании GnuPG (не PGP)! keygenComplete=Создание ключа завершено! Ð”Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñи будет иÑпользоватьÑÑ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ‚Ð¾Ñ€ <%S>. revokeCertRecommended=РекомендуетÑÑ Ñоздать Ñертификат отзыва Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ ключа. Этот Ñертификат может быть иÑпользован Ð´Ð»Ñ Ð¾Ð±ÑŒÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ ключа недейÑтвительным в Ñлучае, еÑли ваш Ñекретный ключ утерÑн или Ñкомпрометирован. Ð’Ñ‹ хотите Ñоздать Ñертификат отзыва ÑейчаÑ? keyMan.button.generateCert=&Создать Ñертификат genCompleteNoSign=Создание ключей завершено! genGoing=Ключ уже ÑоздаетÑÑ! passNoMatch=Введённые пароли не Ñовпадают, попробуйте Ñнова passCheckBox=ПожалуйÑта, отметьте Ñту опцию, еÑли не хотите указывать пароль Ð´Ð»Ñ ÐºÐ»ÑŽÑ‡Ð° passUserName=Укажите Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ñтой учетной запиÑи keygen.missingUserName=Ð”Ð»Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð¾Ð³Ð¾ аккаунта / Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð½Ðµ указано имÑ. Заполните поле Â«Ð˜Ð¼Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÐµÐ»Ñ» в наÑтройках аккаунта. keygen.passCharProblem=Ð’ кодовой фразе были иÑпользованы Ñпециальные Ñимволы. К Ñожалению, Ñто может не поддерживатьÑÑ Ð² других приложениÑÑ…. РекомендуетÑÑ Ð² кодовой фразе иÑпользовать только Ñледующие Ñимволы:\na-z A-Z 0-9 /.;:-,!?(){}[]%* passSpaceProblem=Ð’ Ñилу техничеÑких ограничений Ð¿Ð°Ñ€Ð¾Ð»Ð½Ð°Ñ Ñ„Ñ€Ð°Ð·Ð° не может начинатьÑÑ Ð¸Ð»Ð¸ заканчиватьÑÑ Ð¿Ñ€Ð¾Ð±ÐµÐ»ÑŒÐ½Ñ‹Ð¼ Ñимволом. changePassFailed=Смена Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð½Ðµ удалаÑÑŒ. keyConfirm=Создать открытые и закрытые ключи Ð´Ð»Ñ '%S'? keyMan.button.generateKey=&Создать ключ keyAbort=Прервать генерацию ключа? keyMan.button.generateKeyAbort=&Прервать генерацию ключа keyMan.button.generateKeyContinue=П&родолжить генерацию ключа expiryTooLong=Ð’Ñ‹ не можете Ñоздать ключ Ñрок дейÑÑ‚Ð²Ð¸Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð³Ð¾ больше чем 100 лет. expiryTooLongShorter=Ðевозможно Ñоздать ключ, Ñрок дейÑÑ‚Ð²Ð¸Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð³Ð¾ иÑтекает более чем через 90 лет. expiryTooShort=Ваш ключ должен быть дейÑтвителен по меньшей мере один день. keyGenFailed=Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ ÐºÐ»ÑŽÑ‡Ð° не удалаÑÑŒ. За подробноÑÑ‚Ñми обратитеÑÑŒ к конÑоли Enigmail (меню Enigmail > Отладка Enigmail). setKeyExpirationDateFailed=Дата Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ñрока дейÑÑ‚Ð²Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ нельзÑ. # Strings in enigmailMessengerOverlay.js securityInfo=Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ защите Enigmail\n enigHeader=Enigmail: enigContentNote=Enigmail: *Ð’Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð² Ñто Ñообщение не были зашифрованы или Ñнабжены цифровой подпиÑью* possiblyPgpMime=Сообщение, возможно зашифровано или подпиÑано Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ PGP/MIME; нажмите кнопку \\"РаÑшифровать\\" Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ saveAttachmentHeader=Enigmail: Сохранение раÑшифрованного Ð²Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ noTempDir=Ðевозможно найти каталог временных файлов, доÑтупный Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи.\nПожалуйÑта, задайте его Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ переменной Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ TEMP. attachmentPgpKey=Открываемое вами вложение \\"%S\\" кажетÑÑ ÑвлÑетÑÑ Ñ„Ð°Ð¹Ð»Ð¾Ð¼ ключа OpenPGP.\n\nÐажмите \\"Импорт\\", чтобы импортировать ÑодержащиеÑÑ Ð² нем ключи, или \\"ПроÑмотреть\\", чтобы проÑмотреть Ñодержимое файла в окне браузера. beginPgpPart=********* *СЛЕДУЮЩÐЯ ЧÐСТЬ СООБЩЕÐИЯ ЗÐШИФРОВÐÐРили ЗÐЩИЩЕÐРЦИФРОВОЙ ПОДПИСЬЮ* ********* endPgpPart=********** *КОÐЕЦ ЗÐЩИЩЕÐÐОЙ ЧÐСТИ СООБЩЕÐИЯ* ********** notePartEncrypted=Enigmail: *ЧаÑти Ñтого ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ ÐЕ были зашифрованы или подпиÑаны* noteCutMessage=Enigmail: *Ð’ Ñообщении найдено множеÑтво блоков -- раÑшифровка/Ð²ÐµÑ€Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð¿Ñ€ÐµÑ€Ð²Ð°Ð½Ñ‹* decryptOkNoSig=Предупреждение\n\nРаÑшифровка прошла уÑпешно, но корректно проверить цифровую подпиÑÑŒ не удалоÑÑŒ. msgOvl.button.contAnyway=&Ð’ÑÑ‘ равно продолжить signature.verifiedOK=ПодпиÑÑŒ Ð´Ð»Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ %S была уÑпешно проверена signature.verifyFailed=Ðе удалоÑÑŒ проверить подпиÑÑŒ Ð´Ð»Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ %S attachment.noMatchToSignature=Ðе удалоÑÑŒ ÑоотнеÑти вложение '%S' Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð¼ подпиÑи attachment.noMatchFromSignature=Ðе удалоÑÑŒ ÑоотнеÑти файл подпиÑи '%S' Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð¸ÐµÐ¼ fixBrokenExchangeMsg.failed=Ðе удалоÑÑŒ воÑÑтановить пиÑьмо. # enigmail.msgViewColumn.label=Enigmail # enigmailPep.msgViewColumn.label=Enigmail/p≡p # wksNoIdentity=This key is not linked to any of your email accounts. Please add an account for at least one of the following email addresse(s):\n\n%S # wksConfirmSuccess=Confirmation email sent. # wksConfirmFailure=Sending the confirmation email failed. # autocrypt.importSetupKey.accountPreconfigured=Your account is already correctly configured for Autocrypt.\n\nDo you really want to overwrite your settings with this setup message? # autocrypt.importSetupKey.selfCreated=This message was created by your currently running instance of Enigmail.\n\nPlease switch to the email client to which you want to transfer the settings, and click on the message on that email client to import the settings. # autocrypt.importSetupKey.invalidMessage=Error - could not read setup message. The message seems to be corrupted. Please try to create a new setup message on your "other" device. # autocrypt.importSetupKey.invalidKey=Error - the key could not be imported. The key is either not supported by your version of GnuPG, or it got corrupted. # autocrypt.importSetupKey.wrongPasswd=The password you entered is wrong. Do you want to retry? # autocrypt.importSetupKey.success=The Autocrypt setup message was processed successfully. Autocrypt is now available for your account '%S'. ##################################################################### # Strings in enigmailMsgComposeOverlay.js ##################################################################### keysToExport=Выберите ключи OpenPGP Ð´Ð»Ñ Ð²Ñтавки keysToUse=Выбрать ключ(и) OpenPGP Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ %S pubKey=Открытый ключ Ð´Ð»Ñ %S\n windowLocked=Окно ÑоÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñообщений заблокировано; отправка отменена sendUnencrypted=Ошибка инициализации Enigmail.\nОтправить незашифрованную почту? composeSpecifyEmail=Укажите оÑновной Ð°Ð´Ñ€ÐµÑ Ñлектронной почты, который будет иÑпользоватьÑÑ Ð¿Ñ€Ð¸ выборе ключа подпиÑи Ð´Ð»Ñ Ð¸ÑходÑщей почты.\nЕÑли вы оÑтавите поле пуÑтым, Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° будет иÑпользовать Ð°Ð´Ñ€ÐµÑ Ð¸Ð· Ð¿Ð¾Ð»Ñ \\"От\\". sendingHiddenRcpt=Это Ñообщение будет отправлено некоторым корреÑпондентам в виде Ñкрытой копии. ЕÑли Ñто Ñообщение зашифровано, то вы можете Ñкрыть получателей Ñкрытой копии, но пользователи некоторых продуктов (напр. PGP Corp.) не Ñмогут раÑшифровать Ñообщение. Ð£Ñ‡Ð¸Ñ‚Ñ‹Ð²Ð°Ñ Ñто, мы рекомендуем не иÑпользовать функцию Ñкрытой копии Ð´Ð»Ñ Ð·Ð°ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð½Ñ‹Ñ… Ñообщений. sendWithHiddenBcc=Скрыть получателей Ñкрытой копии sendWithShownBcc=Обычное шифрование sendingNews=ÐžÐ¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ прервана.\n\nЭто Ñообщение не может быть зашифровано, поÑкольку в ÑпиÑке адреÑатов еÑть конференции. Отправьте Ñто Ñообщение без шифрованиÑ. sendToNewsWarning=Предупреждение: вы ÑобираетеÑÑŒ отправить зашифрованное Ñообщение в новоÑтную конференцию.\n\nЭто не приветÑтвуетÑÑ, так как Ñто имеет ÑмыÑл только в том Ñлучае, еÑли вÑе учаÑтники конференции Ñмогут раÑшифровать Ñообщение, то еÑть Ñообщение должно быть зашифровано на ключах вÑех учаÑтников конференции. ПожалуйÑта, отправлÑйте Ñто Ñообщение только еÑли вы точно знаете что делаете.\n\nПродолжить? hasHTML=Предупреждение:\nЭто Ñообщение может Ñодержать HTML, что может привеÑти к ошибкам во Ð²Ñ€ÐµÐ¼Ñ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñи. Чтобы избежать Ñтого в будущем, нажимайте на кнопку ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ ответа на ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ ÑƒÐ´ÐµÑ€Ð¶Ð°Ð½Ð¸ÐµÐ¼ SHIFT, еÑли хотите Ñоздать пиÑьмо Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñью.\nЕÑли вы Ñтавите цифровую подпиÑÑŒ по умолчанию, уберите флажок \\"СоÑтавлÑть ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² формате HTML\\", чтобы отключить иÑпользование HTML при Ñоздании Ñообщений Ð´Ð»Ñ Ñтой учетной запиÑи. strippingHTML=Сообщение Ñодержит HTML-форматирование, которое будет потерÑно при преобразовании в обычный текÑÑ‚ Ð´Ð»Ñ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñи. Продолжить? msgCompose.button.sendAnyway=&Ð’ÑÑ‘ равно отправить Ñообщение attachWarning=Ð’Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð² Ñто Ñообщение не ÑвлÑÑŽÑ‚ÑÑ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ñ‹Ð¼Ð¸, поÑтому их Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ. Чтобы зашифровать их, Ñохраните их Ñначала как локальные файлы, а затем уже вложите в Ñообщение. Ð’Ñ‹ хотите вÑÑ‘ равно отправить Ñто Ñообщение? quotedPrintableWarn=Ð’Ñ‹ решили иÑпользовать кодирование \\"quoted-printable\\" в иÑходÑщих ÑообщениÑÑ…. Это может привеÑти к ошибкам во Ð²Ñ€ÐµÐ¼Ñ Ñ€Ð°Ñшифровки и/или проверки подпиÑи.\nОтключить иÑпользование ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ \\"quoted-printable\\"? minimalLineWrapping=Ð’Ñ‹ решили выравнивать Ñтроки по %S Ñимволов в ширину. Ð”Ð»Ñ ÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð¾Ð³Ð¾ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸/или подпиÑÑ‹Ð²Ð°Ð½Ð¸Ñ Ñто значение должно быть не менее 68.\nУвеличить ширину Ñтрок до 68 Ñимволов? warning=Предупреждение signIconClicked=Ð’Ñ‹ ÑамоÑтоÑтельно указали, Ñтавить ли подпиÑÑŒ на Ñто Ñообщение. ПоÑтому иÑпользование подпиÑи больше не завиÑит от иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ. errorOwnKeyUnusable=Ключ текущего Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ñ ID «%S» не ÑоглаÑован Ñ Ð¿Ð¾Ð´Ñ…Ð¾Ð´Ñщим ключом OpenPGP. \n \nУбедитеÑÑŒ, что у Ð²Ð°Ñ ÐµÑть дейÑтвительный, дейÑтвующий ключ OpenPGP и наÑтройки аккаунта указывают на Ñтот ключ. \nЕÑли Ñрок дейÑÑ‚Ð²Ð¸Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ ключа не иÑтек, проверьте, уÑтановлен ли Ð´Ð»Ñ Ñтого ключа уровень Ð´Ð¾Ð²ÐµÑ€Ð¸Ñ Â«ÐŸÐ¾Ð»Ð½Ñ‹Ð¹Â» или «ÐбÑолютный». msgCompose.cannotSaveDraft=Ошибка ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñ‡ÐµÑ€Ð½Ð¾Ð²Ð¸ÐºÐ° # msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information - partially encrypted email. # msgCompose.partiallyEncrypted.mimeMsg=The message you are replying to contained both unencrypted and encrypted parts. Some encrypted message parts are invisible to you.\n\nIf the sender was not able to decrypt the hidden message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nWe recommend that you don't reply to the message, but create a new message containing your answer. # msgCompose.partiallyEncrypted.inlinePGP=The message you are replying to contained both unencrypted and encrypted parts. If the sender was not able to decrypt some message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nPlease consider removing all quoted text from your reply to this sender. msgCompose.internalEncryptionError=ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°: обещанное шифрование отключено msgCompose.internalError=Произошла внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°. msgCompose.toolbarTxt.signAndEncrypt=Это пиÑьмо будет подпиÑано и зашифровано msgCompose.toolbarTxt.signOnly=Это пиÑьмо будет подпиÑано msgCompose.toolbarTxt.encryptOnly=Это пиÑьмо будет зашифровано msgCompose.toolbarTxt.noEncryption=Это Ñообщение не будет ни подпиÑано, ни зашифровано msgCompose.toolbarTxt.disabled=Enigmail отключен Ð´Ð»Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð¾Ð³Ð¾ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ # msgCompose.protectSubject.tooltip=Protect the message subject # msgCompose.noSubjectProtection.tooltip=Do not protect the message subject msgCompose.encryptedSubjectStub=Зашифрованное пиÑьмо # msgCompose.protectSubject.dialogTitle=Enable Protection of Subject? # msgCompose.protectSubject.question=Regular encrypted emails contain the unredacted subject.\n\nWe have established a standard to hide the original subject in the encrypted message\nand replace it with a dummy text, such that the subject is only visible after the email is decrypted.\n\nDo you want to protect the subject in encrypted messages? # msgCompose.protectSubject.yesButton=&Protect subject # msgCompose.protectSubject.noButton=&Leave subject unprotected msgCompose.detailsButton.label=ПодробноÑти… msgCompose.detailsButton.accessKey=П # msgCompose.pepSendUnknown=Unknown # msgCompose.pepSendUnsecure=Unsecure # msgCompose.pepSendSecure=Secure # msgCompose.pepSendTrusted=Secure & Trusted # pep.alert.disabledForIdentity=p≡p is disabled for the current identity. Please enable p≡p via the Enigmail/p≡p preferences. # pep.alert.weakReply=You’re about to forward or reply to a secure message as insecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? # note: should end with double newline: sendAborted=ÐžÐ¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ прервана.\n\n # details: keyNotTrusted=Ðе доÑтаточно Ð´Ð¾Ð²ÐµÑ€Ð¸Ñ ÐºÐ»ÑŽÑ‡Ñƒ «%S» keyNotFound=Ключ «%S» не найден keyRevoked=Ключ «%S» отозван keyExpired=ИÑтёк Ñрок дейÑÑ‚Ð²Ð¸Ñ ÐºÐ»ÑŽÑ‡ «%S» statPGPMIME=PGP/MIME # statSMIME=S/MIME statSigned=ПОДПИСÐÐО statEncrypted=ЗÐШИФРОВÐÐО statPlain=ÐЕПОДПИСÐÐО и ÐЕЗÐШИФРОВÐÐО offlineSave=Сохранить Ñообщение %S в %S папки \\"ИÑходÑщие\\"? onlineSend=Отправить Ñообщение %S к %S? encryptKeysNote=Замечание: Ñообщение зашифровано Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ñледующего идентификатора пользователÑ/ключа: %S hiddenKey=<Ñкрытый ключ> signFailed=Ошибка Enigmail; Ошибка ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ подпиÑи; отправить незашифрованное Ñообщение? msgCompose.button.sendUnencrypted=&Отправить незашифрованное Ñообщение recipientsSelectionHdr=Выберите адреÑатов зашифрованных Ñообщений configureNow=Ð’Ñ‹ ещё не наÑтроили защиту Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Enigmail Ð´Ð»Ñ Ñтой учетной запиÑи. Сделать Ñто ÑейчаÑ? # encryption/signing status and associated reasons: encryptMessageAuto=Зашифровать пиÑьмо (автоматичеÑки) encryptMessageNorm=Зашифровать пиÑьмо signMessageAuto=ПодпиÑать пиÑьмо (автоматичеÑки) signMessageNorm=ПодпиÑать пиÑьмо encryptOff=Шифрование: ОТКЛЮЧЕÐО encryptOnWithReason=Шифрование: ВКЛЮЧЕÐО (%S) encryptOffWithReason=Шифрование: ОТКЛЮЧЕÐО (%S) encryptOn=Шифрование: ВКЛЮЧЕÐО signOn=ПодпиÑÑŒ: ВКЛЮЧЕÐО signOff=ПодпиÑÑŒ: ОТКЛЮЧЕÐО signOnWithReason=ПодпиÑÑŒ: ВКЛЮЧЕÐО (%S) signOffWithReason=ПодпиÑÑŒ: ОТКЛЮЧЕÐО (%S) reasonEnabledByDefault=включено по умолнанию reasonManuallyForced=включено вручную reasonByRecipientRules=включено наÑтройками Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ reasonByAutoEncryption=включено автошифрованием reasonByConflict=по причине конфликта в правилах Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ reasonByEncryptionMode=по причине режима ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ # should not be used anymore: encryptYes=Сообщение будет зашифровано encryptNo=Сообщение не будет зашифровано # should not be used anymore: signYes=Сообщение будет подпиÑано signNo=Сообщение не будет подпиÑано # PGP/MIME status: pgpmimeNormal=Протокол: PGP/MIME inlinePGPNormal=Протокол: Inline PGP # smimeNormal=Protocol: S/MIME pgpmimeAuto=Протокол: PGP/MIME (автоматичеÑки) inlinePGPAuto=Протокол: Inline PGP (автоматичеÑки) # smimeAuto=Protocol: S/MIME (auto) # should not be used anymore pgpmimeYes=ИÑпользуетÑÑ PGP/MIME pgpmimeNo=ИÑпользуетÑÑ Ð²ÑÑ‚Ñ€Ð¾ÐµÐ½Ð½Ð°Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑŒ PGP # Attach own key status (tooltip strings): attachOwnKeyNo=Ваш ключ не будет вложен attachOwnKeyYes=Ваш ключ будет вложен attachOwnKeyDisabled=Ваш ключ не может быть вложен, необходимо выбрать указанный ключ\nв разделе «OpenPGP» наÑтроек аккунута Ð´Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñтой функции. rulesConflict=Обнаружены конфликтующие правила Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ \n%S \n\nОтправить Ñообщение Ñ Ñтими уÑтановками? msgCompose.button.configure=&ÐаÑтроить msgCompose.button.send=&Отправить Ñообщение msgCompose.button.save=&Сохранить Ñообщение # Strings in enigmailMsgHdrViewOverlay.js keyNeeded=Ð”Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ подпиÑи необходим открытый ключ %S keyUsed=Public key %S used to verify signature clickDecrypt=; щелкните по кнопке раÑшифровки clickDecryptRetry=; щелкните по кнопке раÑшифровки, чтобы попробовать Ñнова clickDetailsButton=; нажмите кнопку «ПодробноÑти» Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра дополнительной информации clickImportButton=; нажмите кнопку «Импортировать ключ» Ð´Ð»Ñ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð° ключа keyTypeUnsupported=; тип Ñтого ключа не поддерживаетÑÑ ÑƒÑтановленной верÑией GnuPG msgPart=ЧаÑть ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ %S msgSigned=подпиÑана msgSignedUnkownKey=подпиÑано неизвеÑтным ключом msgEncrypted=зашифрована msgSignedAndEnc=подпиÑана и зашифрована unverifiedSig=ÐÐµÐ¿Ñ€Ð¾Ð²ÐµÑ€ÐµÐ½Ð½Ð°Ñ Ñ†Ð¸Ñ„Ñ€Ð¾Ð²Ð°Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑŒ incompleteDecrypt=РаÑшифровка не завершена needKey=Ошибка - Ð´Ð»Ñ Ñ€Ð°Ñшифровки нужен закрытый ключ failedDecrypt=Ошибка - ошибка раÑшифровки badPhrase=Ошибка - неверный пароль failedDecryptVerify=Ошибка - ошибка раÑшифровки или проверки дейÑтвительноÑти mdcError=Ошибка - целоÑтноÑть ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð½Ðµ защищена viewInfo=; выберите \\"Вид\\" > \\"Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ защите ÑообщениÑ\\" decryptedMsg=РаÑшифрованное Ñообщение decryptedMsgWithFormatError=РаÑшифрованное Ñообщение (воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ Ñлектронного ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² формате PGP, вероÑтно повреждённого уÑтаревшей верÑией Ñервера Exchange, форматирование текÑта может быть нарушено) usedAlgorithms=ИÑпользованы алгоритмы: %S and %S # pepStatusInfo.text=p≡p Message Status. # pepStatusInfo.title.m3=Under Attack # pepStatusInfo.info.m3=This message is not secure and has been tampered with. # pepStatusInfo.title.m1=Mistrusted # pepStatusInfo.info.m1=This message has a communication partner that has previously been marked as mistrusted # pepStatusInfo.title.r0=Unknown # pepStatusInfo.info.r0=This message does not contain enough information to determine if it is secure. # pepStatusInfo.title.r1=Cannot Decrypt # pepStatusInfo.info.r1=This message cannot be decrypted because the key is not available. # pepStatusInfo.title.r2=Cannot Decrypt # pepStatusInfo.info.r2=This message cannot be decrypted because the key is not available. # pepStatusInfo.title.r3=Unsecure # pepStatusInfo.info.r3=This message is unsecure. # pepStatusInfo.title.r4=Unsecure for Some # pepStatusInfo.info.r4=This message is unsecure for some communication partners. # pepStatusInfo.title.r5=Unreliable Security # pepStatusInfo.info.r5=This message has unreliable protection. # pepStatusInfo.title.r6=Secure... # pepStatusInfo.info.r6=This message is secure but you still need to verify the identity of your communication partner. # pepStatusInfo.title.r7=Secure & Trusted # pepStatusInfo.info.r7=This message is secure and trusted. # pepStatusInfo.color.green=Green # pepStatusInfo.color.yellow=Yellow # pepStatusInfo.color.red=Red # pepRevokeTrust.question=Do you really want to cancel the trust for %S? # pepRevokeMistrust.question=Do you really want to re-trust the key for %S? # pepRevokeTrust.doRevoke=Cancel &trust # wksConfirmationReq=Web Key Directory Confirmation Request # wksConfirmationReq.message=This message has been sent by your email provider to confirm deployment of your OpenPGP public key\nin their Web Key Directory.\nProviding your public key helps others to discover your key and thus being able to encrypt messages to you.\n\nIf you want to deploy your key in the Web Key Directory now, please click on the button "Confirm Request" in the status bar.\nOtherwise, simply ignore this message. # wksConfirmationReq.button.label=Confirm Request # autocryptSetupReq=Perform Autocrypt Setup # autocryptSetupReq.button.label=Start Setup # autocryptSetupReq.setupMsg.desc=This message contains all information to transfer your Autocrypt settings along with your secret key securely from your original device. # autocryptSetupReq.setupMsg.backup=You can keep this message and use it as a backup for your secret key. If you want to do this, you should write down the password and store it securely. # autocryptSetupReq.message.import=To import the settings and key(s) in Enigmail, please click on the "Start Setup" button in the status bar. # autocryptSetupReq.message.sent=Please click on the message on your new device and follow the instuctions to import the settings. # strings in pref-enigmail.js # oldGpgVersion20=Enigmail initialization failed.\n\nYou are using GnuPG version %1$S, which is not supported anymore. Enigmail requires GnuPG version %2$S or newer. Please upgrade your GnuPG installation, or Enigmail will not work. locateGpg=Ðайти программу GnuPG invalidGpgPath=ИÑполнÑемый файл GnuPG не найден по указанному пути. ПоÑтому Enigmail будет отключён до тех пор, пока вы не измените путь или пока вы не перезапуÑтите приложение. warningsAreReset=Ð’Ñе наÑтройки Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ð¹ были Ñброшены. prefs.gpgFound=GnuPG был найден в каталоге %S prefs.gpgNotFound=Ðе могу найти GnuPG prefs.warnAskNever=Предупреждение: Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ñ Ñтой опции приведёт к отправке незашифрованных Ñообщений без выдачи каких-либо уведомлений в Ñлучае, еÑли Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ из получателей нет ключа -- Enigmail не проинформирует ваÑ, еÑли Ñто ÑлучитÑÑ! prefs.warnIdleTimeForUnknownAgent=Ошибка Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº gpg-agent. Возможно, вы иÑпользуете Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»ÑŒÐ½Ð¾Ð¹ защиты, например gnome-keyring или seahorse-agent. К Ñожалению, Enigmail не может управлÑть временем ввода Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ приложениÑ, поÑтому ÑоответÑтвующие наÑтройки не будут применены. prefEnigmail.oneKeyserverOnly=Ошибка - вы можете указать только один Ñервер ключей Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкой загрузки недоÑтающих ключей OpenPGP. # Strings used in core.jsm # (said file also re-uses some strings from above) enterAdminPin=ПожалуйÑта введите PIN-код админиÑтратора вашей Ñмарт-карты enterCardPin=ПожалуйÑта введите PIN-код вашей Ñмарт-карты notInit=Ошибка - Ñлужба Enigmail ещё не инициализирована badCommand=Ошибка - ошибка ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ cmdLine=ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока и вывод: notRequired=Ошибка - шифрование не требуетÑÑ notComplete=Ошибка - ещё идет Ñоздание ключей invalidEmail=Ошибка - недейÑтвительный адреÑ(а) Ñлектронной почты noPassphrase=Ошибка — не указан пароль noPGPblock=Ошибка — не найден дейÑтвительный защищённый блок данных OpenPGP unverifiedReply=ЧаÑть ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ Ð¾Ñ‚Ñтупом была изменена (возможно, цитата из предыдущего пиÑьма) keyInMessageBody=Ключ найден в текÑте пиÑьма. Ðажмите «Импортировать ключ» Ð´Ð»Ñ ÐµÐ³Ð¾ импорта. sigMismatch=Ошибка — неÑовпадение подпиÑи cantImport=Ошибка импорта открытого ключа\n\n doImportOne=Импортировать %1$S (%2$S)? doImportMultiple=Импортировать Ñти ключи?\n\n%S previewFailed=Ðе удаётÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚ÑŒ файл открытого ключа. # Strings used in errorHandling.jsm sc.wrongCardAvailable=Смарт-карта %S, Ð½Ð°Ð¹Ð´ÐµÐ½Ð½Ð°Ñ Ð² вашем Ñчитывателе, не может быть иÑпользована Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ Ñтого ÑообщениÑ.\nПожалуйÑта, вÑтавьте вашу Ñмарт-карту %S и повторите операцию. sc.insertCard=Ð”Ð»Ñ Ñтой операции требуетÑÑ Ð²Ð°ÑˆÐ° Ñмарт-карта %S.\nПожалуйÑта, вÑтавьте требуемую Ñмарт-карту и повторите операцию. sc.removeCard=Ð”Ð»Ñ Ñтой операции требуетÑÑ, чтобы Ñмарт-карты в Ñчитывателе не было.\nПожалуйÑта, выньте вашу Ñмарт-карту и повторите операцию. sc.noCardAvailable=При обращении к Ñчитывателю Ñмарт-карта не была найдена\nÐ’Ñтавьте Ñмарт-карту и попытайтеÑÑŒ Ñнова. sc.noReaderAvailable=Считыватель Ñмарт-карт не найден\nПодÑоедините Ñчитыватель Ñмарт-карт, вÑтавьте в него Ñмарт-карту и попытайтеÑÑŒ Ñнова. keyError.keySpecNotFound=Ð”Ð»Ñ Ð°Ð´Ñ€ÐµÑ email «%S» не найден ÑоответÑтвующий ключ в ÑвÑзке ключей. keyError.keyIdNotFound=ÐаÑтроенный идентификатор ключа «%S» не найден в ÑвÑзке ключей. keyError.resolutionAction=Выберите дейÑтвительный ключ в разделе OpenPGP наÑтроек аккаунта. missingPassphrase=ÐŸÐ°Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñ„Ñ€Ð°Ð·Ð° отÑутÑтвует errorHandling.gpgAgentInvalid=Ð’ вашей ÑиÑтеме работает верÑÐ¸Ñ gpg-agent, не ÑовмеÑÑ‚Ð¸Ð¼Ð°Ñ Ñ Ð²ÐµÑ€Ñией GnuPG. errorHandling.gpgAgentError=GnuPG Ñообщил об ошибке ÑвÑзи Ñ gpg-agent (компонентом GnuPG). errorHandling.dirmngrError=GnuPG Ñообщает об ошибке ÑвÑзи Ñ dirmngr (компонентом GnuPG). errorHandling.pinentryError=GnuPG не может запрашивать вашу парольную фразу через pinentry. errorHandling.readFaq=Это ÑиÑÑ‚ÐµÐ¼Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° наÑтройки или конфигурации, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð½Ðµ даёт возможноÑти Enigmail работать, и она не может быть иÑправлена автоматичеÑки. \n \nÐаÑтоÑтельно рекомендуем вам обратитьÑÑ Ð½Ð° наш веб-Ñайт поддержки по адреÑу https://enigmail.net/faq. gpgNotFound=Ðевозможно найти программу GnuPG '%S'.\nУбедитеÑÑŒ, что в наÑтройках Enigmail указан правильный путь к иÑполнÑемому файлу GnuPG. gpgNotInPath=Ðевозможно найти GnuPG, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½ÑƒÑŽ PATH.\nУбедитеÑÑŒ, что в наÑтройках Enigmail указан правильный путь к иÑполнÑемому файлу GnuPG. enigmailNotAvailable=Ядро Ñлужбы Enigmail не доÑтупно prefGood=Ð¥Ð¾Ñ€Ð¾ÑˆÐ°Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑŒ от %S prefBad=ПЛОХÐЯ подпиÑÑŒ от %S failCancel=Ошибка - получение ключа отменено пользователем failNoServer=Ошибка - не указан Ñервер ключей failNoID=Ошибка - не указан идентификатор Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ ÐºÐ»ÑŽÑ‡Ð° failKeyExtract=Ошибка - ошибка Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐºÐ»ÑŽÑ‡Ð° notFirstBlock=Ошибка - первый блок OpenPGP не ÑвлÑетÑÑ Ð±Ð»Ð¾ÐºÐ¾Ð¼ открытого ключа importKeyConfirm=Импортировать открытые ключ(и), вложенные в Ñообщение? failKeyImport=Ошибка - ошибка импорта ключа fileWriteFailed=Ошибка при запиÑи файла %S importKey=Импорт открытого ключа %S Ñ Ñервера ключей: uploadKey=Отправить открытый ключ %S на Ñервер ключей: keyId=Идентификатор ключа keyAndSigDate=Идентификатор ключа: 0x%S / ПодпиÑан: %S keyFpr=Отпечаток ключа: %S noEmailProvided=Ð’Ñ‹ не указали Ð°Ð´Ñ€ÐµÑ Ñл. почты! keyAlreadySigned=Ключ уже подпиÑан, вы не можете подпиÑать его дважды. ##################################################################### # Strings used in enigmailKeySelection.js ##################################################################### selKeyExpired=Ñрок дейÑÑ‚Ð²Ð¸Ñ Ð¸Ñтек %S createdHeader=Создана atLeastOneKey=Ключ не выбран! Вам нужно выбрать Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ один ключ. fewerKeysThanRecipients=КоличеÑтво выбранных вами ключей меньше количеÑтва получателей. Ð’Ñ‹ уверены что ÑпиÑок ключей Ð´Ð»Ñ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð»Ð¾Ð½? userSel.button.goBack=Выбрать ещё ключи userSel.secretKeySel.title=Выберите закрытый ключ OpenPGP Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñи ваших Ñообщений userSel.problemNoKey=ДейÑтвительный ключ отÑутÑтвует userSel.problemMultipleKeys=МножеÑтво ключей # should be same as thunderbird ENTITY sendLaterCmd.label: sendLaterCmd.label=Отправить позже # Strings used in enigmailAttachmentDialog.js # pgpMimeNote=NOTE: PGP/MIME is not supported by all email clients. If you are unsure, select the %S option. first=первый second=второй # Strings used in am-enigprefs.js / enigmailEditIdentity.js encryptKeyHeader=Выберите OpenPGP-ключ Ð´Ð»Ñ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ identityName=Ð£Ñ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ: %S # switchPepMode=You are currently using the 'p≡p Junior' mode of Enigmail.\n\nBy enabling OpenPGP or S/MIME for an account, you are disabling p≡p and use the 'regular' mode of Enigmail without p≡p. # enableEnigmail=&Disable p≡p # Strings used in enigmailSingleRcptSettings.js noEncryption=Ð’Ñ‹ выбрали иÑпользование шифрованиÑ, но не выбрали ключ. Ð”Ð»Ñ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾Ñ‡Ñ‚Ð¾Ð²Ñ‹Ñ… Ñообщений поÑылаемых на %S, необходимо выбрать один или неÑколько дейÑтвительных ключей из ÑпиÑка ключей. Ð’Ñ‹ хотите отключить шифрование Ð´Ð»Ñ %S? noKeyToUse=(нет - нет шифрованиÑ) noEmptyRule=Правило не может быть пуÑтым! Укажите почтовый Ð°Ð´Ñ€ÐµÑ Ð² ÑоответÑтвующем поле правила. invalidAddress=Ð’Ñ‹ ввели адреÑ(а) Ñлектронной почты в неверном формате. ÐÐµÐ»ÑŒÐ·Ñ Ð²Ð²Ð¾Ð´Ð¸Ñ‚ÑŒ имена адреÑатов. Можно вводить только их почтовые адреÑа. Пример: \nÐеправильно: Some Name \nПравильно: some.name@address.net # noCurlyBrackets=The curly brackets {} have a special meaning and should not be used in an email address. If you want to modify the matching behavior for this rule, use the 'Apply rule if recipient ...' option.\nMore information is available from the Help button. # Strings used in enigmailRulesEditor.js never=Ðикогда always=Ð’Ñегда possible=Возможно deleteRule=Удалить выделенное правило? nextRcpt=(Следующий получатель) negateRule=Ðет addKeyToRule=Добавить ключ %S (%S) к правилу Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ # Strings used in enigmailSearchKey.js needOnline=Ð’Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ Ð²Ð°Ð¼Ð¸ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð½ÐµÐ´Ð¾Ñтупна в автономном режиме. Перейдите в режим Ð¿Ð¾ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº Ñети и попробуйте Ñнова. protocolNotSupported=Выбранный вами протокол '%S://' не поддерживает закачку ключей OpenPGP. gpgkeysDisabled=Возможно поможет включение опции 'extensions.enigmail.useGpgKeysTool'. noKeyserverConn=Ðе могу ÑоединитÑÑ Ñ Ñервером ключей %S. keyDownloadFailed=Ðе удалоÑÑŒ Ñкачать ключ Ñ Ñервера ключей. Сообщение: \n%S internalError=Произошла внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°. Ключи не могут быть Ñкачаны или импортированы. noKeyFound=Ðевозможно найти ни одного ключа ÑоответÑтвующего заданным критериÑм поиÑка. Заметьте, что идентификатор ключа должен иметь Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ \\"0x\\" (напр. 0xABCDEF12). # keyDownload.keyUnavailable=We are sorry, but the key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their key by email. # gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. gpgKeysFailed=Ðе удалоÑÑŒ найти или Ñкачать ключ Ñ Ñервера ключей: gpgkeys_%S не может быть выполнен. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Ðе удалоÑÑŒ уÑтановить уровень Ð´Ð¾Ð²ÐµÑ€Ð¸Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†Ð° к ключу # Strings in enigmailSignKeyDlg.js signKeyFailed=Ðе удалоÑÑŒ подпиÑать ключ alreadySigned.label=Примечание: ключ %S уже подпиÑан выбранным закрытым ключом. alreadySignedexportable.label=Примечание: ключ %S уже подпиÑан Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ñтью ÑкÑпорта Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ выбранного закрытого ключа. Ð›Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑŒ не имеет ÑмыÑла. partlySigned.label=Примечание: некоторые ID ключа %S уже были подпиÑаны выбранным Ñекретным ключом. noTrustedOwnKeys=Ðе найдено подходÑщих ключей Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñи! Ð”Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ Ñ‚Ñ€ÐµÐ±ÑƒÐµÑ‚ÑÑ ÐºÐ°Ðº минимум один полноÑтью доверенный закрытый ключ. # Strings in enigmailKeyManager.js keyMan.loadingKeys=Загрузка ключей, пожалуйÑта подождите ... keyValid.unknown=неизвеÑтен keyValid.invalid=недейÑтвителен keyValid.disabled=отключен keyValid.revoked=отозван keyValid.expired=проÑрочен keyValid.noSubkey=неверный подключ keyTrust.untrusted=не доверÑÑŽ keyTrust.marginal=минимальное keyTrust.full=доверÑÑŽ keyTrust.ultimate=абÑолютное keyTrust.group=(группа) keyType.public=pub keyType.publicAndSec=pub/sec keyMan.enableKey=Включить ключ keyMan.disableKey=Отключить ключ userAtt.photo=Ðтрибут Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ (картинка JPEG) asciiArmorFile=ASCII Защищённые файлы (*.asc) importKeyFile=Импорт файла ключа OpenPGP gnupgFile=Файлы GnuPG # createKeyOK=Your Key has been generated saveRevokeCertAs=Создать и Ñохранить Ñертификат отзыва # revokeCertOK=The revocation certificate has been successfully created. You can use it to invalidate your public key, e.g. in case you would lose your secret key. revokeCertFailed=Сертификат отзыва не может быть Ñоздан. addUidOK=Идентификатор Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½ уÑпешно addUidFailed=Добавление идентификатора Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½Ðµ удалоÑÑŒ noKeySelected=Ð’Ñ‹ должны выбрать по меньшей мере один ключ, чтобы выполнить выбранную вами операцию exportToFile=ЭкÑпортировать открытый ключ в файл exportKeypairToFile=ЭкÑпортировать закрытый и открытый ключи в файл exportSecretKey=Ð’Ñ‹ хотите включить закрытый ключ в ÑохранÑемый файл ключа OpenPGP? saveKeysOK=Ключи были уÑпешно Ñохранены saveKeysFailed=Сохранение ключей не удалоÑÑŒ importKeysFailed=Импорт ключей не удалÑÑ enableKeyFailed=Включение/отключение ключей не удалоÑÑŒ specificPubKeyFilename=%S (0x%S) pub specificPubSecKeyFilename=%S (0x%S) pub-sec defaultPubKeyFilename=ÑкÑпортированные-открытые-ключи defaultPubSecKeyFilename=ÑкÑпортированные-открытые-и-закрытые-ключи noSecretKeys=Ðе найден ни один закрытый ключ. \n\nÐ’Ñ‹ хотите Ñоздать ваш ÑобÑтвенный ключ ÑейчаÑ? sendKeysOk=Ключи отправлены уÑпешно sendKeysFailed=Отправка ключей не удалаÑÑŒ receiveKeysOk=Ключ(и) были уÑпешно обновлены receiveKeysFailed=Загрузка ключей не удалаÑÑŒ importFromClip=Ð’Ñ‹ хотите импортировать ключ(и) из буфера обмена? importFromUrl=Загружать открытые ключи Ñ Ñтого URL: copyToClipbrdFailed=Ðе могу Ñкопировать выделенные ключ(и) в буфер обмена. copyToClipbrdOK=Ключ(и) Ñкопированы в буфер обмена deleteSecretKey=ПРЕДУПРЕЖДЕÐИЕ: Ð’Ñ‹ ÑобираетеÑÑŒ удалить закрытый ключ!\nЕÑли вы удалите ваш закрытый ключ, вы больше не Ñможете раÑшифровывать ни одного ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð·Ð°ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð½Ð¾Ð³Ð¾ на Ñтот ключ и не Ñможете отозвать Ñвой ключ\n\nÐ’Ñ‹ дейÑтвительно хотите удалить ОБРключа, и закрытый и открытый\n'%S'? deleteMix=ПРЕДУПРЕЖДЕÐИЕ: Ð’Ñ‹ ÑобираетеÑÑŒ удалить закрытые ключи! ЕÑли вы удалите ваш закрытый ключ, вы не Ñможете раÑшифровать ни одного ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð·Ð°ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð½Ð¾Ð³Ð¾ на Ñтот ключ.\n\nÐ’Ñ‹ дейÑтвительно хотите удалить ОБРключа, и выбранный закрытый и открытый? deletePubKey=Ð’Ñ‹ хотите удалить открытый ключ\n'%S'? deleteSelectedPubKey=Ð’Ñ‹ дейÑтвительно хотите удалить открытые ключи? deleteKeyFailed=Ключ не может быть удалён. revokeKeyQuestion=Ð’Ñ‹ ÑобираетеÑÑŒ отзывать ключ «%S».\n\nПоÑле Ñтого ключ не Ñможет быть иÑпользован Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑаниÑ, и как только он будет раÑпроÑтранен, другие больше не Ñмогут иÑпользовать Ñтот ключ Ð´Ð»Ñ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ. Ключ возможно будет иÑпользовать Ð´Ð»Ñ Ñ€Ð°ÑÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ñ‹Ð²Ð°Ð½Ð¸Ñ Ñтарых Ñообщений.\n\nПродолжить? revokeKeyOk=Ключ был отозван. ЕÑли ваш ключ вÑе ещё доÑтупен на Ñервере ключей, рекомендуетÑÑ Ð¿Ð¾Ð´Ð³Ñ€ÑƒÐ·Ð¸Ñ‚ÑŒ его заново, чтобы другие увидели, что он был отозван. revokeKeyFailed=Ключ не может быть отозван. # revokeKeyNotPresent=You have no key (0x%S) which fits to this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before the revocation certificate! # revokeKeyAlreadyRevoked=The key 0x%S has already been revoked. refreshAllQuestion=Ð’Ñ‹ не выбрали ни одного ключа. Ð’Ñ‹ хотите обновить ВСЕ ключи? # refreshKeyServiceOn.warn=Warning: Your keys are currently being refreshed in the background as safely as possible.\nRefreshing all your keys at once will unnecessarily reveal information about you.\nDo you really want to do this? refreshKey.warn=Предупреждение: в завиÑимоÑти от чиÑла ключей и ÑкороÑти ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ðµ вÑех ключей может занÑть довольно значительное времÑ! downloadContactsKeys.warn=Внимание: в завиÑимоÑти от количеÑтва контактов и ÑкороÑти ÑоединениÑ, загрузка вÑех ключей может занÑть много времени! downloadContactsKeys.importFrom=Импортировать контакты из адреÑной книги '%S'? keyMan.button.exportSecKey=ЭкÑпорт &закрытых ключей keyMan.button.exportPubKey=ЭкÑпорт только &открытых ключей keyMan.button.import=&Импорт keyMan.button.refreshAll=&Обновить вÑе ключи keyMan.button.revokeKey=&Отозвать ключ keyMan.button.skip=&ПропуÑтить ключ keylist.noOtherUids=Других идентификаторов нет keylist.hasOtherUids=Также извеÑтный как keylist.noPhotos=Ðет фотографии keylist.hasPhotos=Фотографии keyMan.addphoto.filepicker.title=Выберите фотографию Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ keyMan.addphoto.warnLargeFile=Размер выбранного вами файла превышает 25 КБ.\nÐе рекомендуетÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»Ñть очень большие файлы, так как Ñто приводит к Ñозданию очень больших ключей. keyMan.addphoto.noJpegFile=Выбранный файл не похож на файл JPEG. ПожалуйÑта, выберите другой файл. keyMan.addphoto.failed=Ðе удалоÑÑŒ добавить фото. # noWksIdentity=The key %S does not have a WKS identity. # keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key "%1$S (%2$S)" for encrypting messages? # keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key "%1$S (%2$S)" for future messages? # keyman.addBlacklistKey.button=&Blacklist the key # keyman.removeBlacklistKey.button=&Remove key from Blacklist # Strings in enigmailManageUidDlg.xul changePrimUidFailed=Смена первичного идентификатора Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½Ðµ удалаÑÑŒ changePrimUidOK=Первичный идентификатор Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÑƒÑпешно Ñменён revokeUidFailed=Отзыв идентификатора Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ %S не удалÑÑ revokeUidOK=Идентификатор Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ %S был отозван уÑпешно. ЕÑли ваш ключ вÑе ещё доÑтупен на Ñервере ключей, рекомендуетÑÑ Ð¿Ð¾Ð´Ð³Ñ€ÑƒÐ·Ð¸Ñ‚ÑŒ его заново, чтобы другие увидели что он был отозван. revokeUidQuestion=Ð’Ñ‹ дейÑтвительно хотите отозвать идентификатор Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ %S? # Strings in enigmailKeyImportInfo.xul importInfoTitle=УСПЕХ! Ключи импортированы importInfoBits=Бит importInfoCreated=Создан importInfoFpr=Отпечаток importInfoDetails=(ПодробноÑти) importInfoNoKeys=Ключи не импортированы. # Strings in enigmailKeyDetailsDlg.xul keyTypePublic=открытый ключ keyTypePrimary=первичный ключ keyTypeSubkey=подключ keyTypePair=пара ключей keyExpiryNever=не иÑтекает keyAlgorithm_1=RSA keyAlgorithm_2=RSA keyAlgorithm_3=RSA keyAlgorithm_16=ELG keyAlgorithm_17=DSA keyAlgorithm_18=ECDH keyAlgorithm_19=ECDSA keyAlgorithm_20=ELG keyAlgorithm_22=EDDSA keyUsageEncrypt=Шифрование keyUsageSign=ПодпиÑÑŒ keyUsageCertify=Заверение keyUsageAuthentication=Ð˜Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ keyDoesNotExpire=Срок дейÑÑ‚Ð²Ð¸Ñ ÐºÐ»ÑŽÑ‡Ð° не иÑтёк. # Strings in enigmailGenCardKey.xul keygen.started=Подождите, пока идет процеÑÑ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ»ÑŽÑ‡Ð° .... keygen.completed=Ключ Ñоздан. Ðовый идентификатор ключа: 0x%S keygen.keyBackup=Ð ÐµÐ·ÐµÑ€Ð²Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ ÐºÐ»ÑŽÑ‡Ð° Ñохранена в %S keygen.passRequired=Укажите пароль, еÑли вы хотите Ñоздать резервную копию ключа (она будет Ñохранена не на Ñмарт-карте). # Strings in enigmailSetCardPin.xul cardPin.processFailed=Ðе удалоÑÑŒ Ñменить PIN-код # Strings in enigRetrieveProgres.xul keyserverProgress.refreshing=Обновление ключей, пожалуйÑта подождите ... keyserverProgress.uploading=Загрузка ключей на Ñервер, пожалуйÑта подождите ... # keyserverProgress.wksUploadFailed=Could not upload your key to the Web Key Service # keyserverProgress.wksUploadCompleted=Your public key was successfully submitted to your provider. You will receive an email to confirm that you initiated the upload. keyserverTitle.refreshing=Обновление ключей keyserverTitle.uploading=Загрузка ключей на Ñервер # Strings in enigmailSetupWizard passphrase.min8keys=Ваш пароль должен ÑоÑтоÑть по меньшей мере из 8 Ñимволов! setupWizard.reallyCancel=Ð’Ñ‹ дейÑтвительно хотите закрыть маÑтер наÑтройки Enigmail? setupWizard.invalidGpg=Выбранный файл не ÑвлÑетÑÑ Ð¸Ñполнимым файлом GnuPG. ПожалуйÑта, попробуйте другой файл. setupWizard.specifyFile=Чтобы продолжить, вы должны по меньшей мере указать файл открытого ключа. setupWizard.installFailed=Похоже, уÑтановка прошла неудачно. ПожалуйÑта, переуÑтановите приложение или уÑтановите GnuPG вручную и укажите её меÑтоположение Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ кнопки "Обзор". # setupWizard.downloadForbidden=For your own security, we will not download GnuPG. Please visit https://gnupg.org/ in order to download GnuPG. # setupWizard.downloadImpossible=We cannot download GnuPG currently. Please try later or visit https://gnupg.org/ in order to download GnuPG. setupWizard.hashSumError=МаÑтер не может проверить целоÑтноÑть загруженного файла. Возможно, он был повреждён или кем-то подменён. Ð’Ñ‹ хотите продолжить его уÑтановку? setupWizard.importSettingsFile=Указать файл резервной копии Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐºÐ¸ setupWizard.invalidSettingsFile=Указанный файл не ÑвлÑетÑÑ Ð²ÐµÑ€Ð½Ñ‹Ð¼ файлом резервной копии наÑтроек Enigmail. setupWizard.gpgConfExists=Файл наÑтройки GnuPG уже ÑущеÑтвует. ИÑпользовать Ñтот файл из предыдущей уÑтановки? # setupWizard.noGpgHomeDir=It appears that you configured %S to use for GnuPG. However, this is not a directory - you cannot use it. # setupWizard.unmachtedIds=The following identities of your old setup could not be matched:\n%S\nThe settings for these identities were skipped. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=Во Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸ GnuPG произошла ошибка. За дополнительной информацией обращайтеÑÑŒ, пожалуйÑта, к журналу ошибок. installGnuPG.installFailed=Во Ð²Ñ€ÐµÐ¼Ñ ÑƒÑтановки GnuPG произошла ошибка. За дополнительной информацией обращайтеÑÑŒ, пожалуйÑта, к журналу ошибок. # Strings in enigmailAddUidDlg.xul addUidDlg.nameOrEmailError=Ð’Ñ‹ должны ввеÑти Ð¸Ð¼Ñ Ð¸ Ð°Ð´Ñ€ÐµÑ Ñлектронной почты addUidDlg.nameMinLengthError=Длина имени должна быть не менее 5 Ñимволов addUidDlg.invalidEmailError=Ð’Ñ‹ должны указать корректный Ð°Ð´Ñ€ÐµÑ Ñлектронной почты # Strings in enigmailCardDetails.js Carddetails.NoASCII=Смарткарты OpenPGP поддерживают только ASCII Ñимволы в полÑÑ… Firstname/Name # network error types errorType.SecurityCertificate=Сертификат безопаÑноÑти, предоÑтавленный веб-ÑервиÑом, ÑвлÑетÑÑ Ð½ÐµÐ´ÐµÐ¹Ñтвительным. errorType.SecurityProtocol=Протокол безопаÑноÑти, иÑпользуемый веб-ÑервиÑом, не был опознан. errorType.Network=Произошла ошибка Ñетевого взаимодейÑÑ‚Ð²Ð¸Ñ # filter stuff filter.folderRequired=Ðеобходимо выбрать целевой каталог. filter.decryptMove.label=РаÑшифровывать поÑтоÑнно (Enigmail) filter.decryptCopy.label=Создавать раÑшифрованную копию (Enigmail) filter.decryptMove.warnExperimental=Предупреждение: фильтр «РаÑшифровывать поÑтоÑнно» может привеÑти к повреждению пиÑем.\n\nÐаÑтоÑтельно рекомендуетÑÑ Ð´Ð»Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° иÑпользовать фильтр «Создавать раÑшифрованную копию», убедитьÑÑ, что вÑе работает как ожидаетÑÑ, и только поÑле Ñтого иÑпользовать Ñтот фильтр. # filter.tempPepFilterDesc=Temporary filter to store sent message unencrypted # filter.term.pgpencrypted.label=OpenPGP Encrypted # filter.encrypt.label=Encrypt to key (Enigmail) # filter.keyRequired=You must select a recipient key. # filter.keyNotFound=Could not find an encryption key for "%S". # filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for "%S" you will no longer be able to read the emails. # strings in enigmailConvert.jsm converter.decryptBody.failed=Ðе удаётÑÑ Ñ€Ð°Ñшифровать пиÑьмо Ñ Ñ‚ÐµÐ¼Ð¾Ð¹\n«%S».\nПопытатьÑÑ Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¹ парольной фразой или пропуÑтить Ñто пиÑьмо? converter.decryptAtt.failed=Ðе удаётÑÑ Ñ€Ð°Ñшифровать вложение «%1$S»\nиз пиÑьма Ñ Ñ‚ÐµÐ¼Ð¾Ð¹\n«%2$S».\nПопытатьÑÑ Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¹ парольной фразой или пропуÑтить Ñто пиÑьмо? saveLogFile.title=Сохранить файл журнала # strings in gpg.jsm unknownSigningAlg=ÐеизвеÑтный алгоритм подпиÑÐ°Ð½Ð¸Ñ (ID: %S) unknownHashAlg=ÐеизвеÑтный криптографичеÑкий Ñ…Ñш (ID: %S) # strings in keyRing.jsm keyring.photo=Ð¤Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ñ keyRing.pubKeyRevoked=Ключ %1$S (ID ключа %2$S) отозван. keyRing.pubKeyExpired=ИÑтёк Ñрок дейÑÑ‚Ð²Ð¸Ñ ÐºÐ»ÑŽÑ‡Ð° %1$S (ID ключа %2$S). keyRing.pubKeyNotForSigning=Ключ %1$S (ID ключа %2$S) не может быть иÑпользован Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑаниÑ. keyRing.pubKeyNotForEncryption=Ключ %1$S (ID ключа %2$S) не может быть иÑпользован Ð´Ð»Ñ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ. keyRing.keyDisabled=Ключ %1$S (ID ключа %2$S) отключен и не может быть иÑпользован. keyRing.keyNotTrusted=ÐедоÑтаточный уровень Ð´Ð¾Ð²ÐµÑ€Ð¸Ñ Ð´Ð»Ñ ÐºÐ»ÑŽÑ‡Ð° %1$S (ID ключа %2$S). Ð”Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÐµÐ³Ð¾ Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑаниÑ, уÑтановите «абÑолютный» уровень Ð´Ð¾Ð²ÐµÑ€Ð¸Ñ Ñтому ключу. keyRing.keyInvalid=Ð’Ñе подключи, иÑпользуемые Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñи, ключа ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ %1$S (ID ключа %2$S) не ÑвлÑÑŽÑ‚ÑÑ Ð´ÐµÐ¹Ñтвительными (например, не ÑамоподпиÑаны). keyRing.signSubKeysRevoked=Ð’Ñе подключи, иÑпользуемые Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñи, ключа ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ %1$S (ID ключа %2$S) отозваны. keyRing.signSubKeysExpired=Ð’ ключе ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ %1$S (ID ключа %2$S) иÑтёк Ñрок дейÑÑ‚Ð²Ð¸Ñ Ð´Ð»Ñ Ð²Ñех подключей, иÑпользуемых Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑаниÑ. keyRing.signSubKeysUnusable=Ð’Ñе подключи, иÑпользуемые Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñи, ключа ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ %1$S (ID ключа %2$S) отозваны, Ð´Ð»Ñ Ð½Ð¸Ñ… иÑтёк Ñрок дейÑÑ‚Ð²Ð¸Ñ Ð¸Ð»Ð¸ они не могут быть иÑпользованы по другим причинам. keyRing.encSubKeysRevoked=Ð’Ñе подключи ключа ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ %1$S (ID ключа %2$S) отозваны. keyRing.encSubKeysExpired=ИÑтёк Ñрок дейÑÑ‚Ð²Ð¸Ñ Ð²Ñех подключей ключа ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ %1$S (ID ключа %2$S). keyRing.noSecretKey=Похоже, что Ð´Ð»Ñ ÐºÐ»ÑŽÑ‡Ð° %1$S (ID ключа %2$S) в ÑвÑзке ключей нет ÑоответÑтвующего закрытого ключа. Он не может быть иÑпользован Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑаниÑ. keyRing.encSubKeysUnusable=Ð’Ñе подключи, иÑпользуемые Ð´Ð»Ñ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ, ключа ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ %1$S (ID ключа %2$S) отозваны, Ð´Ð»Ñ Ð½Ð¸Ñ… иÑтёк Ñрок дейÑÑ‚Ð²Ð¸Ñ Ð¸Ð»Ð¸ они не могут быть иÑпользованы по другим причинам. #strings in exportSettingsWizard.js cannotWriteToFile=Ðе удалоÑÑŒ Ñохранить в файл «%S». Выберите другой файл. dataExportError=Во Ð²Ñ€ÐµÐ¼Ñ ÑкÑпорта данных произошла ошибка. enigmailSettings=ÐаÑтройки Enigmail defaultBackupFileName=Enigmail — ÑкÑпорт specifyExportFile=Укажите Ð¸Ð¼Ñ Ð´Ð»Ñ ÑÐºÐ¿Ð¾Ñ€Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ homedirParamNotSUpported=Дополнительные параметры наÑтройки путей, такие как «--homedir» и «--keyring», не поддерживаютÑÑ Ð´Ð»Ñ ÑкÑпорта и воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð°Ñтроек. ИÑпользуйте альтернативные ÑпоÑобы, такие как наÑтройку переменной Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Â«GNUPGHOME». #strings in expiry.jsm expiry.keyExpiresSoon=Срок дейÑÑ‚Ð²Ð¸Ñ ÐºÐ»ÑŽÑ‡Ð° «%1S» иÑтекает менее чем через %2$S дней.\n\nРекомендуетÑÑ Ñоздать новую пару ключей и наÑтроить ÑоответÑтвующий аккаунт Ð´Ð»Ñ Ð¸Ñ… иÑпользованиÑ. # expiry.keysExpireSoon=The following of your keys will expire in less than %1$S days:\n%2$S We recommend that you create new keys and configure your accounts to use the new keys. # expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to ultimate in key properties. # expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to ultimate in key properties. # expiry.OpenKeyManager=Open Enigmail Key Management # expiry.OpenKeyProperties=Open Key Properties #strings in pEpDecrypt.jsm # pEpDecrypt.cannotDecrypt=This is an encrypted message. Unfortunately you don't have the secret key to decrypt the message. #strings in gpgAgent.jsm # gpghomedir.notexists=The directory '%S' containing your OpenPGP keys does not exist and cannot be created. # gpghomedir.notwritable=The directory '%S' containing your OpenPGP keys is not writable. # gpghomedir.notdirectory=The directory '%S' containing your OpenPGP keys is a file instead of a directory. # gpghomedir.notusable=Please fix the directory permissions or change the location of your GnuPG "home" directory. GnuPG cannot work correctly otherwise. #strings in pepTrustWords.js # pepTrustWords.cannotVerifyOwnId=Cannot verify p≡p Trustwords for own account. # pepTrustWords.cannotFindKey=Cannot find key for %S. # pepTrustWords.cannotStoreChange=Could not change trust for %S. # pepTrustWords.generalFailure=Cannot obtain trustwords for %S. # pepTrustWords.partnerFingerprint=Fingerprint for %S: #strings in mimeWkdHandler.jsm # wkdMessage.body.req=Your email provider processed your request to upload your public key to the OpenPGP Web Key Directory.\n\nPlease click the confirmation button in the Enigmail header to complete the publishing of your public key. # wkdMessage.body.process=This is an email related to the automatic processing to upload your public key to the OpenPGP Web Key Directory.\n\nYou do not need to take any manual action at this point. #strings in pepHandshake.js # pepPrivacyStatus.RatingBrokenSuggestion=Either you or the sender should resend the message. # pepPrivacyStatus.RatingHaveNoKeySuggestionOutgoing=If you composed this message, your key is not available. # pepPrivacyStatus.RatingMistrustSuggestion=Re-establish the connection with your communication partner and try to complete another handshake. # pepPrivacyStatus.RatingReliableSuggestion=Complete a handshake with your communication partner by exchanging trustwords in person or over the phone. A handshake is needed only once per partner and will ensure secure and trusted communication. # pepPrivacyStatus.RatingTrustedSuggestion=No action needed! # pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware this message may not be secure. # pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Please add the necessary information. # pepPrivacyStatus.RatingUnderAttackSuggestion=Separately verify the content of this message with your communication partner. # pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least secure. # pepPrivacyStatus.RatingUnencryptedSuggestion=Please ask your communication partner to use an encryption solution or install p≡p. # pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or no signature. Ask your communication partner to upgrade their encryption solution or install p≡p. # pepPrivacyStatus.RatingBrokenExplanation=This message has broken encryption or formatting. # pepPrivacyStatus.RatingHaveNoKeyExplanation=This message cannot be decrypted because the key is not available. # pepPrivacyStatus.RatingMistrustExplanation=This message has a communication partner that has previously been marked as mistrusted. # pepPrivacyStatus.RatingReliableExplanation=This message is secure but you still need to verify the identity of your communication partner. # pepPrivacyStatus.RatingTrustedExplanation=This message is secure and trusted. # pepPrivacyStatus.RatingUndefinedExplanation=This message does not contain enough information to determine if it is secure. # pepPrivacyStatus.RatingUnderAttackExplanation=This message is not secure and has been tampered with. # pepPrivacyStatus.RatingUnencryptedExplanation=This message is unsecure. # pepPrivacyStatus.RatingUnencryptedForSomeExplanation=This message is unsecure for some communication partners. # pepPrivacyStatus.RatingUnreliableExplanation=This message has unreliable protection. # pepPrivacyStatus.RatingBrokenText=Broken # pepPrivacyStatus.RatingHaveNoKeyText=Cannot Decrypt # pepPrivacyStatus.RatingMistrustText=Mistrusted # pepPrivacyStatus.RatingReliableText=Secure # pepPrivacyStatus.RatingTrustedText=Secure & Trusted # pepPrivacyStatus.RatingUndefinedText=Unknown # pepPrivacyStatus.RatingUnderAttackText=Under Attack # pepPrivacyStatus.RatingUnencryptedForSomeText=Unsecure for Some # pepPrivacyStatus.RatingUnencryptedText=Unsecure # pepPrivacyStatus.RatingUnreliableText=Unreliable Security # handshakeDlg.button.initHandshake=Handshake... # handshakeDlg.button.stopTrust=Stop Trusting # handshakeDlg.button.reTrust=Stop Mistrusting # handshakeDlg.label.outgoingMessage=Outgoing message # handshakeDlg.label.incomingMessage=Incoming message # handshakeDlg.error.noPeers=Cannot handshake without any correspondents. # handshakeDlg.error.noProtection=Please enable protection in order to use the Handshake function. # enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device # enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup #strings in autocrypt.jsm # autocrypt.setupMsg.subject=Autocrypt Setup Message # autocrypt.setupMsg.msgBody=To set up your new device for Autocrypt, please follow the instuctions that should be presented by your new device. # autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code presented on your old device, and then import the contained key into your keyring. #strings in upgradeInfo.html # upgradeInfo.doctitle=What's New in Enigmail v2.0? # upgradeInfo.welcome1=Welcome to the new Enigmail version 2.0! # upgradeInfo.welcome2=The release contains a lot of new and changed features. Please take a minute to find out what's new: # upgradeInfo.encSubject.title=Encrypting the Message Subject # upgradeInfo.encSubject.desc=We developed a new method that moves the email subject into the encrypted message, and replaces the visible subject with "Encrypted Message". Once such a message is decrypted, the original subject is replaced automatically. Hiding the subject is on by default; there is a preference to turn it off if you don't like it. (Note: this feature requires the message to be sent with PGP/MIME.) # upgradeInfo.buttons.title=Changed behavior of Encrypt and Sign Buttons # upgradeInfo.buttons.desc=The Encrypt and Sign buttons in the message composer window now work for both the OpenPGP and S/MIME protocols. If both algorithms are possible, then Enigmail will try to prefer the one for which all keys are available. # upgradeInfo.autocrypt.title=Support for Autocrypt # upgradeInfo.autocrypt.desc=Enigmail now supports Autocrypt, a new standard to distribute keys as part of sent messages. Enigmail automatically imports keys from Autocrypt-compliant messages, such that over time more and more emails can be encrypted. # upgradeInfo.pEp.title=New p≡p Junior Mode (Pretty Easy Privacy) # upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. You currently need to manually install p≡p for this purpose; this will change in a future release. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. # upgradeInfo.bottom.desc=Please visit our documentation for help on using Enigmail. # pep.missingGnuPG=In order to use Enigmail/p≡p, GnuPG is required. As we could not find it, we suggest to download and install it for you. #strings in enigmailAbout.html # aboutEnigmail.tabName=About Enigmail # aboutEnigmail.title=OpenPGP support provided by Enigmail # aboutEnigmail.team=Enigmail is developed by the Enigmail Team: # aboutEnigmail.projectLeader=Lead Developer: # aboutEnigmail.usability=Usability: # aboutEnigmail.documentation=Documentation: # aboutEnigmail.testing=Testing: # aboutEnigmail.userSupport=User Support: # aboutEnigmail.localization=Localization: See the Enigmail Language Packs page # aboutEnigmail.Credits=Credits: # aboutEnigmail.origAuthor=Original author of the Enigmail extension # aboutEnigmail.icons=Icons: # aboutEnigmail.formerMembers=Former team members: # aboutEnigmail.projectHosting=Project hosting: # aboutEnigmail.licenseSupportTitle=License & Support # aboutEnigmail.license=Enigmail OpenPGP is open source and licensed under the %S # aboutEnigmail.support=Support and download is available from www.enigmail.net. enigmail-2.0.8/lang/ru/help/000077500000000000000000000000001334302754500156135ustar00rootroot00000000000000enigmail-2.0.8/lang/ru/help/compose.html000066400000000000000000000100761334302754500201520ustar00rootroot00000000000000 Enigmail Help: Message Composition

Enigmail Help

Using Enigmail when composing messages

Enigmail menu in Mail/Compose window
Sign message
Enable/Disable sending signed mail. User is notified, if signing fails.
Encrypt message

Enable/Disable encryption to all recipient(s) before sending. User is notified, if encryption fails.

If Display selection when necessary is set in Preferences -> Key Selection tab, a list of keys will pop up if there are addresses in the list of recipients for the message for whom you have no public key.

If Never display OpenPGP key selection dialog is set in Preferences -> Key Selection tab, and there are addresses in the list of recipients for the message for whom you have no public key, the message will be sent unencrypted.

Use PGP/MIME for this message
Enable/Disable the use of PGP/MIME for this message.

If you know the recipient(s) can read mail using the PGP/MIME format, you should use it.

This feature is dependent on the settings in Preferences -> PGP/MIME tab being set to Allow to use PGP/MIME or Always use PGP/MIME.

Default composition options
  • Signing/Encryption Options...: shortcut to Account Settings -> OpenPGP Options.
  • Send options...: shortcut to Preferences -> Send tab.
  • Key selection options...: shortcut to Preferences -> Key Selection tab.
  • PGP/MIME options...: shortcut to Preferences -> PGP/MIME tab.
Undo encryption

If there is a failure when actually sending mail, such as the POP server not accepting the request, Enigmail will not know about it, and the encrypted message will continue to be displayed in the Compose window. Choosing this menu item will undo the encryption/signing, reverting the Compose window back to its original text.

As a temporary fix, this option may also be used to decrypt the quoted text when replying to encrypted messages. Enigmail should automatically decrypt the quoted message, but if that fails for some reason, you can use this menu item to force it.

Insert public key
insert ASCII-armored public key block at the current cursor location in the Compose window. You will be prompted for the email addresses of the key(s) to be inserted. Keys inserted in this manner will automatically be recognized at the receiving end by Enigmail. After key insertion, you may still choose to sign/encrypt the mail as needed. Also, do not insert more than one key block in a message; just specify multiple email addresses, separated by commas or spaces, when prompted.
Clear save passphrase
Clears cached passphrase. Useful if you have multiple passphrases.
Help
Displays Help information from the website (this page).

Further help is available on the Enigmail Help web page

enigmail-2.0.8/lang/ru/help/editRcptRule.html000066400000000000000000000115601334302754500211120ustar00rootroot00000000000000 Enigmail Help: Edit OpenPGP Rule

Enigmail Help

Using the Enigmail Rules Editor: Edit OpenPGP Rule

In the Rules Editor, you can specify defaults per recipient for enabling encryption, signing and PGP/MIME, and to define what OpenPGP key(s) to use. In this dialog, you can specify the rules for a single recipient, and for a group of recipients with very similar attributes.

Set OpenPGP Rules for
Contains the email addresses of the recipients (without names, i.e. just an address like somebody@email.domain). You can specify several email addresses, separated by spaces. The address specified here can consist of only the domain section so that mail to any address at that domain will be matched, e.g. @email.domain will allow matching to body@email.domain, somebody@email.domain, anybody@email.domain, etc.
Apply rule if recipient ...
This modifies the matching of the email addresses. If multiple addresses are entered, the setting will apply to all. The examples below are based on body@email.domain entered in the OpenPGP Rules field above.
  • Is exactly: with this setting, the rule will only trigger on emails to body@email.domain (exact, case insensitive matching).
  • Contains: with this setting, any email address containing the string is matched, e.g. anybody@email.domain or body@email.domain.net
  • Begins with: with this setting, any email address starting with the string is matched, e.g. body@email.domain.net, body@email.domain-name.com.
  • Ends with: with this setting, any email address ending with the string is matched, e.g. anybody@email.domain , somebody@email.domain.
Continue with the next rule for the matching address
Enabling this function will allow you to define a rule but not have to specify a KeyID in the Use the following OpenPGP keys: field, so that the email address is used to check for a key at the time of sending. Also, further rules for the same address(es) will be processed as well.
Do not check further rules for the matching address
Enabling this function stops processing any other rules for the matching address(es) if this rule is matched; i.e. rule processing continues with the next recipient.
Use the following OpenPGP keys:
Use the Select Key(s).. button to select the recipient keys to be used for encryption. As in the action above, no further rules for the matching address(es) are processed.
Default for Signing
Enable or disable message signing. This either uses or overrides what you have specified in the message composition window. The values are:
  • Never: disable signing, even if it was enabled in the message composition window (overrules the other values)
  • Yes, if selected from in Message Composition: leave signing as specified in the message composition window
  • Always: enable signing, even if it was not enabled in the message composition window
These signing settings are applied for all rules that match. If one of the rules disables signing, the message will not be signed, regardless of other rules that specify Always.
Encryption
Enable or disable message encryption. The allowed settings and their meaning are the same as for message signing.
PGP/MIME
Enable or disable the use of the PGP/MIME (RFC 3156) message encoding. If PGP/MIME is disabled, the messages are encoded using "inline PGP". The allowed values and their meaning are the same as for message signing.

The rules are processed in the order displayed in the list in the OpenPGP Rules Editor. Whenever a rule matches a recipient and contains a OpenPGP Key ID, in addition to using the specified Key ID, the recipient is not considered anymore when processing further rules.


Further help is available on the Enigmail Per-Recipient Settings page

enigmail-2.0.8/lang/ru/help/initError.html000066400000000000000000000045421334302754500204630ustar00rootroot00000000000000 Enigmail Help: How to Resolve Problems with Initializing OpenPGP

Enigmail Help

How to Resolve Problems with Initializing OpenPGP

There are several reasons why initializing OpenPGP does not succeed. The most common ones are described below; for more information please visit the Enigmail Support page.

GnuPG could not be found

In order for OpenPGP to work, the tool GnuPG needs to be installed. If GnuPG cannot be found, then first make sure that the executable gpg.exe (on Windows; gpg on other platforms) is installed on your computer. If GnuPG is installed, and OpenPGP cannot find it, then you need to manually set the path to GnuPG in the OpenPGP Preferences (menu OpenPGP > Preferences)

Enigmime failed to initialize

OpenPGP works only if it is built using the same build environment as Thunderbird or SeaMonkey was built. This means that you can use the official Enigmail releases only if you use the official releases of Thunderbird or SeaMonkey provided by mozilla.org.

If you use a Thunderbird or SeaMonkey version coming from some other source (e.g. the provider of your Linux distribution), or if you built the application yourself, you should either use an Enigmail version built by the same source, or build Enigmail yourself. For building Enigmail, refer to the Source Code section on the Enigmail home page. Please don't file any bug report concerning this problem, it is not solvable.

Further help is available on the Enigmail Support Web Site.

enigmail-2.0.8/lang/ru/help/messenger.html000066400000000000000000000101221334302754500204650ustar00rootroot00000000000000 Enigmail Help: Message Reading

Enigmail Help

Using Enigmail when reading messages

Decrypt button in main Mail window
This button can be used for several purposes: decrypt, verify, or import public keys. Normally decryption/verification happens automatically, although this can be disabled through a preference. However, if this fails, usually a short error message will appear in the Enigmail status line. If you click the Decrypt button, you will be able to see a more detailed error message, including the output from the GnuPG command.
Pen and Key icons in Message Header display
The Pen and Key icons in the Message Header display indicate if the message you are reading was signed and/or encrypted and if the signature is good, i.e. the message has not been changed since it was signed. If the message has been changed, the Pen icon will change to a Broken Pen to indicate that the signature is bad. Right clicking on either the Pen or Key icons will bring up a menu with the following options:
  • OpenPGP Security info: allows you to view the output status from GnuPG for the message.
  • Copy OpenPGP Security info: copies the output status from GnuPG to the clipboard; to paste into a reply message, etc.
  • View OpenPGP Photo ID: allows you to view the Photo ID of the person who sent the message, if they have a photo embedded in their Public Key. (This option will only be enabled if a Photo ID exists in their key.)
  • S/MIME Security info: allows you to view the S/MIME Security Info for the message.

If you do not have keyserver-options auto-key-retrieve set in your gpg.conf file and you read a message which is signed or encrypted, you will see a Pen icon in the headers display area with a Question mark on it, the Enigmail status line in the headers area will say Part of the message signed; click pen icon for details and the message in the Message Pane will show all the OpenPGP message block indicators and the signature block.

You may also see this if you have keyserver-options auto-key-retrieve set in your gpg.conf file and the OpenPGP key is not available on the default keyserver.

Clicking on the Pen and Question mark icon will bring up a window advising that the key is unavailable in your keyring. Clicking on OK will bring up another window with a list of keyservers from which you can select to download the sender's public key from.

To configure the list of keyservers you wish to use, go to Enigmail -> Preferences -> Basic tab and enter the keyserver addresses in the Keyserver(s): box, separated by a comma. The first keyserver in the list will be used as the default.

Opening encrypted attachments / importing attached OpenPGP keys
Attachments named *.pgp, *.asc and *.gpg are recognized as attachments that can be handled specially by Enigmail. Right clicking on such an attachment enables two special menu items in the context menu: Decrypt and Open and Decrypt and Save. Use these two menu items if you want Enigmail to decrypt an attachment before opening or saving it. If an attachment is recognized as an OpenPGP key file, you are offered to import the keys it into your keyrings.

Further help is available on the Enigmail Help web page

enigmail-2.0.8/lang/ru/help/rulesEditor.html000066400000000000000000000060331334302754500210040ustar00rootroot00000000000000 Enigmail Help: Rules Editor

Enigmail Help

Using the Enigmail Rules Editor

In the Rules Editor, you can specify defaults per recipient for enabling encryption, signing and PGP/MIME, and to define what OpenPGP key(s) to use. Each rule consists of 5 fields and is represented on a single line:

Email
The e-mail(s) from the To:, Cc: and Bcc: fields to match. The matching works on substrings (Further details can be found in the Edit Rule dialog)
OpenPGP Key(s)
a list of OpenPGP Key ID's to use for the recipient
Sign
enable or disable message signing. This either uses or overrides what you have specified in the message composition window. The values are:
  • Never: disable signing, even if it was enabled in the message composition window (overrules the other values)
  • Possible: leave signing as specified in the message composition window
  • Always: enable signing, even if it was not enabled in the message composition window

These signing settings are applied for all rules that match. If one of the rules disables signing, the message will not be signed, regardless of other rules that specify Always.

Encrypt
enable or disable message encryption. The allowed settings and their meaning are the same as for message signing.
PGP/MIME
enable or disable the use of the PGP/MIME (RFC 3156) message encoding. If PGP/MIME is disabled, the messages are encoded using "inline PGP". The allowed values and their meaning a re the same as for message signing.

The rules are processed in the order displayed in the list. Whenever a rule matches a recipient and contains a OpenPGP Key ID, in addition to using the specified Key ID, the recipient is not considered anymore when processing further rules.

Note: The rule editor is not yet complete. It is possible to write some more advanced rules by directly editing the rules file (these rules should then not be edited anymore in the rule editor). Further information for directly editing the file is available on the Enigmail Homepage


Further help is available on the Enigmail Help web page

enigmail-2.0.8/lang/ru/help/sendingPrefs.html000066400000000000000000000047771334302754500211470ustar00rootroot00000000000000 Enigmail Help: Edit OpenPGP Rule

Enigmail Help

Defining Preferences to Send Encrypted

In the Sending Preferences you can choose the general model and preferences for encryption.

Convenient Encryption
With these settings, emails are encrypted without confirmation whenever possible.

This setup is appropriate, if you just want to improve your privacy by sending emails encyrpted instead of unencrypted if that's possible.

The effect is like sending emails as letters instead of postcards. Unlike postcards, letters usually hide their contents while in transit.

Note however that as with letters you can't be sure that nobody is opening the letter while it is in transit (although, some technical effort is necessary for that).

A concrete risk is that you accidentally use "faked keys" you got from somewhere or somebody claiming that the key belongs to the person you want to send emails to. To avoid this risk, you can either use the trust model of PGP (see below) or you should always verify, whether the fingerprint of a public key is correct.

Manual Encryption
This option allows you to specify the different preferences for encryption according to your needs. You can specify
  • whether replies to encrypted/signed emails should automatically also be encrypted/signed-
  • whether to use the trust model of OpenPGP to accept keys (this means that to use a key you either have to sign the key or have enough other people you trust having signed the key).
  • whether you want to automatically send emails encrypted if all keys are accepted.
  • whether and when you want to finally confirm sending an email.
If it is important for you that content you send encrypted can't be read by other people or organizations, you should use the manual preferences at least choose the option to accept keys only if you or other people signed them. While this model reduces the risk of using faked keys, it requires that you actively sign keys and declare owner trust using the key managament dialog. enigmail-2.0.8/lang/sk/000077500000000000000000000000001334302754500146525ustar00rootroot00000000000000enigmail-2.0.8/lang/sk/am-enigprefs.properties000066400000000000000000000001211334302754500213370ustar00rootroot00000000000000# Strings used in the Mozill AccountManager prefPanel-enigprefs=OpenPGP Security enigmail-2.0.8/lang/sk/enigmail.dtd000066400000000000000000001436751334302754500171540ustar00rootroot00000000000000 ' k urÄeniu e-mailovej adresy"> ' znaky pre urÄenie e-mailovej adresy pre GnuPG. Zakážte, pokiaľ príjemca používa staré kľúÄe Hushmail."> OpenPGP Security)"> Upozornenie: tvorba kľúÄa môže trvaÅ¥ niekoľko minút. NeukonÄujte aplikáciu, pokiaľ prebieha vytváranie kľúÄa. Proces sa urýchli a zlepší, pokiaľ budete aktívne pracovaÅ¥ s prehliadaÄom a Äasto pristupovaÅ¥ k harddisku. Na to, že je kÄ¾ÃºÄ vytvorený, budete upozornený/á."> ' je nesprávne"> Upozornenie: Vytváranie kľúÄa môže trvaÅ¥ niekoľko minút. NeukonÄujte aplikáciu, pokiaľ prebieha vytváranie kľúÄov. Na to, že je kÄ¾ÃºÄ vytvorený, budete upozornený/a."> Upozornenie: Enigmail bude vždy overovaÅ¥ podpisy v e-mailoch vÅ¡etkých identít a úÄtov bez ohľadu na to, Äi je to v nich povolené"> VÄaka Vám za používanie Enigmail."> enigmail-2.0.8/lang/sk/enigmail.properties000066400000000000000000001540231334302754500205620ustar00rootroot00000000000000Enigmail=Enigmail ##################################################################### # Strings used within enigmailCommon.js and enigmailCommon.jsm ##################################################################### enigAlert=Upozornenie Enigmail enigConfirm=Potvrdenie Enigmail # enigInfo=Enigmail Information enigError=Chyba Enigmail enigPrompt=Pripomenutie Enigmail dlgYes=Ãn&o dlgNo=&Nie dlgKeepSetting=PamätaÅ¥ si odpoveÄ a nepýtaÅ¥ sa znova dlgNoPrompt=NezobrazovaÅ¥ znova tento dialóg dlg.button.delete=&OdstrániÅ¥/ZmazaÅ¥ dlg.button.cancel=&Späť dlg.button.close=&ZatvoriÅ¥ dlg.button.continue=Pok&raÄovaÅ¥ dlg.button.skip=&PreskoÄiÅ¥ # dlg.button.overwrite=&Overwrite dlg.button.view=&ZobraziÅ¥ # dlg.button.retry=&Retry # dlg.button.ignore=&Ignore # dlg.button.install=&Install # dlg.button.ok=&OK repeatPrefix=\n\nToto upozornenie sa zopakuje %S repeatSuffixSingular=krát. repeatSuffixPlural=krát. noRepeat=\n\nToto upozornenie sa už nezopakuje, pokiaľ nebudete aktualizovaÅ¥ Enigmail. pgpNotSupported=Zdá sa, že používate Enigmail spoloÄne s PGP 6.x\n\nPGP 6.x má bohužiaľ niekoľko nedostatkov, kvôli ktorým nie je možné zaistiÅ¥ správny chod rozšírenia Enigmail. Preto taktiež Enigmail nepodporuje viacero PGP 6.x; radÅ¡ej prosím používajte GnuPG (GPG).\n\nAk potrebujete pomoc s prechodom na GnuPG, preÄítajte si sekciu Help na domovskej stránke Enigmailu. # initErr.howToFixIt=In order to use Enigmail, GnuPG is required. If you did not install GnuPG yet, the easiest way to do this is using the "Setup Wizard" button below. # initErr.setupWizard.button=&Setup Wizard passphraseCleared=Heslo bolo zmazané. # cannotClearPassphrase=You are using a non-standard tool (such as gnome-keyring) for passphrase handling. Clearing the passphrase is therefore not possible from within Enigmail. noPhotoAvailable=Foto nie je k dispozícii debugLog.title=Enigmail Debug Log error.photoPathNotReadable=Cesta k fotke '%S' nie je Äitateľná # generalError=Error: %S # Strings in configure.jsm enigmailCommon.versionSignificantlyChanged=Táto nová verzia Enigmail ma veľa podstatných zmien v nastaveniach. Pokúsili sme sa previesÅ¥ staré nastavenia do tejto novej verzia. Akokoľvek, nemôžme byt pripravený na vÅ¡etky prípady. Prosím skontrolujte výsledok prevodu nových nastavení. enigmailCommon.checkPreferences=Skontroluj Nastavenia... # preferences.defaultToPgpMime=We have changed the default message encoding in Enigmail from Inline-PGP to PGP/MIME. We recommend you keep this as default.\n\nIf you still wish to use Inline-PGP by default, you can do so in the Account Settings under OpenPGP Security. ##################################################################### # Strings in enigmailAbout.js ##################################################################### usingVersion=Spustené rozšírenie Enigmail verzie %S # enigmailPepVersion=Enigmail/p≡p version %S usingAgent=K Å¡ifrovaniu a deÅ¡ifrovaniu je použité GnuPG, ktoré je umiestené v ceste %S %S agentError=CHYBA: zlyhal prístup k službe Enigmime! ##################################################################### # Strings in enigmailKeygen.js ##################################################################### accessError=Chyba v prístupe k službám rozšírenia Enigmail onlyGPG=Generovanie kľúÄov je možné iba s GnuPG (nie s PGP)! keygenComplete=Generovanie kľúÄov je dokonÄené! Identita <%S> bude použitá k podpisovaniu. revokeCertRecommended=Veľmi Vám doporuÄujeme vytvoriÅ¥ revokaÄný certifikát pre Váš kľúÄ. Tento certifikát môže byÅ¥ použitý pre zneplatnenie kľúÄa, napr. keÄ súkromný kÄ¾ÃºÄ stratíte alebo bude kÄ¾ÃºÄ kompromitovaný. Prajete si teraz vytvoriÅ¥ revokaÄný certifikát? keyMan.button.generateCert=&Generovanie certifikátu genCompleteNoSign=Generovanie kľúÄa je dokonÄené! genGoing=Generovanie kľúÄa už prebieha! passNoMatch=Heslo nesúhlasí, zadajte ho prosím znovu passCheckBox=Prekontrolujte zaÅ¡krtnite, ak nastavujete kÄ¾ÃºÄ bez hesla passUserName=Prosím Å¡pecifikujte meno užívateľa pre túto identitu # keygen.missingUserName=There is no name specified for the selected account/identity. Please enter a value in the field "Your name" in the account settings. # keygen.passCharProblem=You are using special characters in your passphrase. Unfortunately, this can cause troubles for other applications. We recommend you choose a passphrase consisting only of any of these characters:\na-z A-Z 0-9 /.;:-,!?(){}[]%* passSpaceProblem=Z technických dôvodov, VaÅ¡e heslo nemôže zaÄínaÅ¥, ani konÄiÅ¥ medzerou. changePassFailed=Zmena hesla zlyhala. keyConfirm=VytvoriÅ¥ verejný a súkromný kÄ¾ÃºÄ pre '%S'? keyMan.button.generateKey=&VytvoriÅ¥ kÄ¾ÃºÄ keyAbort=PreruÅ¡iÅ¥ vytváranie kľúÄa? keyMan.button.generateKeyAbort=&PreruÅ¡iÅ¥ vytváranie kľúÄa keyMan.button.generateKeyContinue=&PokraÄovaÅ¥ vo vytváraní kľúÄa expiryTooLong=Nemôžete vytváraÅ¥ kľúÄ, ktorý expiruje viac než za 100 rokov. expiryTooLongShorter=Nemôžte vytvoriÅ¥ kľúÄ, ktorý expiruje za viac ako 90 rokov. expiryTooShort=Váš kÄ¾ÃºÄ musí byÅ¥ platný minimálne jeden deň. keyGenFailed=Vytvorenie kľúÄa zlyhalo. Podrobnosti zistíte v konzole Enigmail (ponuka Enigmail > Ladenie Enigmail). setKeyExpirationDateFailed=Doba expirácie sa nemôže zmeniÅ¥ # Strings in enigmailMessengerOverlay.js securityInfo=Informácie zabezpeÄenia Enigmail\n\n enigHeader=Enigmail: enigContentNote=Enigmail: *Prílohy k tejto správe neboli podpísané alebo zaÅ¡ifrované*\n\n possiblyPgpMime=Táto správa je možno zaÅ¡ifrovaná alebo podpísaná PGP/MIME; overíte si to po kliknutí na tlaÄítko "DeÅ¡ifrovaÅ¥" saveAttachmentHeader=Enigmail: UložiÅ¥ deÅ¡ifrovanú prílohu noTempDir=Nemôžem nájsÅ¥ doÄasný adresár na zápis\nNastavte premennú prostredia systému TEMP prosím attachmentPgpKey=Zdá sa, že príloha '%S', ktorú otvárate, je súbor s kľúÄom OpenPGP.\n\nKliknite na "Import" pre uloženie kľúÄa alebo na "ZobraziÅ¥", aby ste si pozreli obsah súboru v okne prehliadaÄa. beginPgpPart=********* *ZAÄŒIATOK Å IFROVANEJ alebo PODPÃSANEJ ÄŒASTI* ********* endPgpPart=********** *KONIEC Å IFROVANEJ alebo PODPÃSANEJ ÄŒASTI* ********** notePartEncrypted=Enigmail: *ÄŒasÅ¥ správy nebola podpísaná alebo deÅ¡ifrovaná* noteCutMessage=Enigmail: *Bol nájdený mnohonásobný blok správ -- deÅ¡ifrovanie/overenie zruÅ¡ené* decryptOkNoSig=Upozornenie\n\nDeÅ¡ifrovanie bolo úspeÅ¡né, ale podpis nemohol byÅ¥ správne overený msgOvl.button.contAnyway=&Prajete si aj tak pokraÄovaÅ¥? signature.verifiedOK=Podpis pre prílohu %S bol úspeÅ¡ne overený signature.verifyFailed=Signatúra pre prílohu %S nemôže byÅ¥ overená attachment.noMatchToSignature=Nemôžem priradiÅ¥ prílohu '%S' k podpisovému súboru attachment.noMatchFromSignature=Nemôžem priradiÅ¥ podpisový súbor '%S' k prílohe # fixBrokenExchangeMsg.failed=Did not succeed to repair message. # enigmail.msgViewColumn.label=Enigmail # enigmailPep.msgViewColumn.label=Enigmail/p≡p # wksNoIdentity=This key is not linked to any of your email accounts. Please add an account for at least one of the following email addresse(s):\n\n%S # wksConfirmSuccess=Confirmation email sent. # wksConfirmFailure=Sending the confirmation email failed. # autocrypt.importSetupKey.accountPreconfigured=Your account is already correctly configured for Autocrypt.\n\nDo you really want to overwrite your settings with this setup message? # autocrypt.importSetupKey.selfCreated=This message was created by your currently running instance of Enigmail.\n\nPlease switch to the email client to which you want to transfer the settings, and click on the message on that email client to import the settings. # autocrypt.importSetupKey.invalidMessage=Error - could not read setup message. The message seems to be corrupted. Please try to create a new setup message on your "other" device. # autocrypt.importSetupKey.invalidKey=Error - the key could not be imported. The key is either not supported by your version of GnuPG, or it got corrupted. # autocrypt.importSetupKey.wrongPasswd=The password you entered is wrong. Do you want to retry? # autocrypt.importSetupKey.success=The Autocrypt setup message was processed successfully. Autocrypt is now available for your account '%S'. ##################################################################### # Strings in enigmailMsgComposeOverlay.js ##################################################################### keysToExport=VybraÅ¥ kľúÄe OpenPGP k vloženiu keysToUse=VybraÅ¥ kľúÄ/e OpenPGP pre použitie s %S pubKey=Verejný kÄ¾ÃºÄ pre %Sn windowLocked=Okno vytvorenia správy je uzamknuté; odosielanie zruÅ¡ené sendUnencrypted=Chyba inicializácie Enigmailu.\nOdoslaÅ¥ správu nezaÅ¡ifrovanú? composeSpecifyEmail=UrÄite prosím svoju hlavnú e-mailovú adresu, ktorá bude vybraná k podpisovaniu odchádzajúcich správ.\n Ak ju nevyplníte, bude pre výber kľúÄa k podpisu použitá adresa odosielateľa. sendingHiddenRcpt=Tato správa obsahuje príjemcu BCC (skrytá kópia). Ak je takáto správa zaÅ¡ifrovaná, je možné skryÅ¥ BCC príjemcu, ale užívatelia niektorých produktov (napr. PGP Corp.) nebudú môcÅ¥ správu deÅ¡ifrovaÅ¥. Preto nedoporuÄujeme používaÅ¥ BCC u Å¡ifrovaných správ. sendWithHiddenBcc=SkryÅ¥ príjemcu BCC sendWithShownBcc=Å ifrovaÅ¥ normálne sendingNews=Odosielanie Å¡ifrovanej správy zlyhalo.\n\nTáto správa nemôže byÅ¥ Å¡ifrovaná, pretože obsahuje adresáta z diskusnej skupiny. PoÅ¡lite prosím správu bez Å¡ifrovania. sendToNewsWarning=Pozor: Snažíte sa poslaÅ¥ zaÅ¡ifrovaný email do diskusnej skupiny.\n\nOd toho odradzujeme, pretože to má zmysel iba v prípade, že vÅ¡etci Älenovia skupiny sú schopní email rozÅ¡ifrovaÅ¥. Správa musí byÅ¥ Å¡ifrovaná pomocou kľúÄov vÅ¡etkých úÄastníkov skupiny. Prosím, poÅ¡lite túto správu, iba pokiaľ presne viete, Äo robíte.\n\nPokraÄovaÅ¥? hasHTML=HTML e-mail - varovanie:\nSpráva zrejme obsahuje kód HTML, ktorý môže spôsobiÅ¥ chybu pri podpisovaní alebo Å¡ifrovaní. Tejto chybe pri podpisovaní emailu se vyhnete, keÄ stlaÄíte klávesu SHIFT pri kliknutí na tlaÄítko 'VytvoriÅ¥ správu' alebo 'OdpovedaÅ¥'.\nAk vždy správy podpisujete, mali by ste radÅ¡ej trvale zruÅ¡iÅ¥ 'Vytváranie správ v HTML' u tohto úÄtu. (Pozn. prekl.: alebo odosielajte správy s využitím PGP/MIME, ak je to možné, tj. ak príjemca používa poÅ¡tového klienta, ktorý PGP/MIME podporuje.) strippingHTML=Správa obsahuje kód HTML, ktorý bude pri konverzii do jednoduchého textu pri podpisovaní alebo Å¡ifrovaní stratený. Prajete si vykonaÅ¥ konverziu? msgCompose.button.sendAnyway=UrÄite &odoslaÅ¥ správu attachWarning=Prílohy k tejto správe nie sú míestne a nemôžu byÅ¥ teda Å¡ifrované. Prílohu je treba k zaÅ¡ifrovaniu najprv uložiÅ¥ ako miestny súbor. Prajete si aj tak pokraÄovaÅ¥ Äalej? quotedPrintableWarn=Pre odosielanie správ je povolené kódovanie 'quoted-printable', to môže spôsobiÅ¥ nesprávne deÅ¡ifrovanie a/lebo overenie vaÅ¡ej správy.n Prajete si vypnúť odosielanie správ v 'quoted-printable'? minimalLineWrapping=Máte nastavené zalamovanie riadkov na %S znakov. Pre správne Å¡ifrovanie a/alebo podpisovanie musí byÅ¥ táto hodnota najmenej 68.\nPrajete si teraz zmeniÅ¥ zalamovanie riadkov na 68 znakov? warning=Pozor signIconClicked=RuÄne ste zmenil/a podpisovanie. Pri vytváraní tejto správy preto (de)aktivácia podpisu nezávisí na (de)aktivácii Å¡ifrovania. # errorOwnKeyUnusable=The key ID '%S' configured for the current identity does not yield a usable OpenPGP key.\n\nPlease ensure that you have a valid, not expired OpenPGP key and that your account settings point to that key.\nIf your key is not expired, then check if you did set Owner trust to full or ultimate. # msgCompose.cannotSaveDraft=Error while saving draft # msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information - partially encrypted email. # msgCompose.partiallyEncrypted.mimeMsg=The message you are replying to contained both unencrypted and encrypted parts. Some encrypted message parts are invisible to you.\n\nIf the sender was not able to decrypt the hidden message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nWe recommend that you don't reply to the message, but create a new message containing your answer. # msgCompose.partiallyEncrypted.inlinePGP=The message you are replying to contained both unencrypted and encrypted parts. If the sender was not able to decrypt some message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nPlease consider removing all quoted text from your reply to this sender. # msgCompose.internalEncryptionError=Internal Error: promised encryption disabled # msgCompose.internalError=An internal error has occurred. # msgCompose.toolbarTxt.signAndEncrypt=This message will be signed and encrypted # msgCompose.toolbarTxt.signOnly=This message will be signed # msgCompose.toolbarTxt.encryptOnly=This message will be encrypted # msgCompose.toolbarTxt.noEncryption=This message will be unsigned and unencrypted # msgCompose.toolbarTxt.disabled=Enigmail is disabled for the selected identity # msgCompose.protectSubject.tooltip=Protect the message subject # msgCompose.noSubjectProtection.tooltip=Do not protect the message subject # msgCompose.encryptedSubjectStub=Encrypted Message # msgCompose.protectSubject.dialogTitle=Enable Protection of Subject? # msgCompose.protectSubject.question=Regular encrypted emails contain the unredacted subject.\n\nWe have established a standard to hide the original subject in the encrypted message\nand replace it with a dummy text, such that the subject is only visible after the email is decrypted.\n\nDo you want to protect the subject in encrypted messages? # msgCompose.protectSubject.yesButton=&Protect subject # msgCompose.protectSubject.noButton=&Leave subject unprotected # msgCompose.detailsButton.label=Details ... # msgCompose.detailsButton.accessKey=D # msgCompose.pepSendUnknown=Unknown # msgCompose.pepSendUnsecure=Unsecure # msgCompose.pepSendSecure=Secure # msgCompose.pepSendTrusted=Secure & Trusted # pep.alert.disabledForIdentity=p≡p is disabled for the current identity. Please enable p≡p via the Enigmail/p≡p preferences. # pep.alert.weakReply=You’re about to forward or reply to a secure message as insecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? # note: should end with double newline: sendAborted=Odosielanie správy sa nepodarilo.\n\n # details: # keyNotTrusted=Not enough trust for key '%S' # keyNotFound=Key '%S' not found # keyRevoked=Key '%S' revoked # keyExpired=Key '%S' expired statPGPMIME=PGP/MIME # statSMIME=S/MIME statSigned=PODPÃSANà statEncrypted=Å IFROVANà statPlain=NEPODPÃSANà a NEZAÅ IFROVANà offlineSave=UložiÅ¥ %S správu do %S do zložky konceptov? onlineSend=OdoslaÅ¥ správu %S na %S? encryptKeysNote=Upozornenie: správa je Å¡ifrovaná s nasledujúcim užívateľským ID / kľúÄom: %S # hiddenKey= signFailed=Chyba Enigmail; Å ifrovanie alebo podpisovanie zlyhalo; odoslaÅ¥ správu nezaÅ¡ifrovanú? msgCompose.button.sendUnencrypted=&OdoslaÅ¥ nezaÅ¡ifrovanú správu recipientsSelectionHdr=UrÄiÅ¥ adresátov pre Å¡ifrovanie configureNow=Nemáte eÅ¡te nastavené zabezpeÄenie Enigmail pre zvolenú identitu. Prajete si to teraz urobiÅ¥? # encryption/signing status and associated reasons: # encryptMessageAuto=Encrypt Message (auto) # encryptMessageNorm=Encrypt Message # signMessageAuto=Sign Message (auto) # signMessageNorm=Sign Message # encryptOff=Encryption: OFF # encryptOnWithReason=Encryption: ON (%S) # encryptOffWithReason=Encryption: OFF (%S) # encryptOn=Encryption: ON # signOn=Signing: ON # signOff=Signing: OFF # signOnWithReason=Signing: ON (%S) # signOffWithReason=Signing: OFF (%S) # reasonEnabledByDefault=enabled by default # reasonManuallyForced=manually forced # reasonByRecipientRules=forced by recipient rules # reasonByAutoEncryption=forced by auto encryption # reasonByConflict=due to conflict in recipient rules # reasonByEncryptionMode=due to encryption mode # should not be used anymore: encryptYes=Správa bude Å¡ifrovaná encryptNo=Správa nebude Å¡ifrovaná # should not be used anymore: signYes=Správa bude podpísaná signNo=Správa nebude podpísaná # PGP/MIME status: # pgpmimeNormal=Protocol: PGP/MIME # inlinePGPNormal=Protocol: Inline PGP # smimeNormal=Protocol: S/MIME # pgpmimeAuto=Protocol: PGP/MIME (auto) # inlinePGPAuto=Protocol: Inline PGP (auto) # smimeAuto=Protocol: S/MIME (auto) # should not be used anymore pgpmimeYes=PGP/MIME bude použité pgpmimeNo=Inline PGP bude použité # Attach own key status (tooltip strings): # attachOwnKeyNo=Your own key will not be attached # attachOwnKeyYes=Your own key will be attached # attachOwnKeyDisabled=Your own key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. rulesConflict=Nájdené protichodné pravidlá pre príjemcov\n%S\n\nPoslaÅ¥ správu s týmito nastaveniami? msgCompose.button.configure=&Nastavenie msgCompose.button.send=&OdoslaÅ¥ správu msgCompose.button.save=&UložiÅ¥ správu # Strings in enigmailMsgHdrViewOverlay.js keyNeeded=K overeniu podpisu je nutný verejný kÄ¾ÃºÄ %S # keyUsed=Public key %S used to verify signature clickDecrypt=; stlaÄte tlaÄítko DeÅ¡ifrovaÅ¥ clickDecryptRetry=; stlaÄte tlaÄítko DeÅ¡ifrovaÅ¥ znovu # clickDetailsButton=; click on 'Details' button for more information # clickImportButton=; click on the 'Import Key' button to import the key # keyTypeUnsupported=; the key type is not supported by your version of GnuPG msgPart=ÄŒasÅ¥ správy %S msgSigned=podpísaná # msgSignedUnkownKey=signed with unknown key msgEncrypted=Å¡ifrovaná msgSignedAndEnc=podpísaná a Å¡ifrovaná unverifiedSig=Neoverený podpis incompleteDecrypt=Nekompletné deÅ¡ifrovanie needKey=Chyba - pre deÅ¡ifrovanie je potrebný súkromný kÄ¾ÃºÄ failedDecrypt=Chyba - deÅ¡ifrovanie zlyhalo badPhrase=Chyba - zlé heslo failedDecryptVerify=Chyba - deÅ¡ifrovanie/overenie zlyhalo mdcError=Chyba - správa nemá ochranu integrity viewInfo=; ZobraziÅ¥ > BezpeÄnostné informácie správy pre podrobnosti decryptedMsg=DeÅ¡ifrovaná správa decryptedMsgWithFormatError=Dekódovaná správa (obnovený poÅ¡kodený PGP email formát pravdepodobne spôsobený starým Exchange serverom, takže výsledok nemusí byÅ¥ úplne Äitateľný) # usedAlgorithms=Used Algorithms: %1$S and %2$S # pepStatusInfo.text=p≡p Message Status. # pepStatusInfo.title.m3=Under Attack # pepStatusInfo.info.m3=This message is not secure and has been tampered with. # pepStatusInfo.title.m1=Mistrusted # pepStatusInfo.info.m1=This message has a communication partner that has previously been marked as mistrusted # pepStatusInfo.title.r0=Unknown # pepStatusInfo.info.r0=This message does not contain enough information to determine if it is secure. # pepStatusInfo.title.r1=Cannot Decrypt # pepStatusInfo.info.r1=This message cannot be decrypted because the key is not available. # pepStatusInfo.title.r2=Cannot Decrypt # pepStatusInfo.info.r2=This message cannot be decrypted because the key is not available. # pepStatusInfo.title.r3=Unsecure # pepStatusInfo.info.r3=This message is unsecure. # pepStatusInfo.title.r4=Unsecure for Some # pepStatusInfo.info.r4=This message is unsecure for some communication partners. # pepStatusInfo.title.r5=Unreliable Security # pepStatusInfo.info.r5=This message has unreliable protection. # pepStatusInfo.title.r6=Secure... # pepStatusInfo.info.r6=This message is secure but you still need to verify the identity of your communication partner. # pepStatusInfo.title.r7=Secure & Trusted # pepStatusInfo.info.r7=This message is secure and trusted. # pepStatusInfo.color.green=Green # pepStatusInfo.color.yellow=Yellow # pepStatusInfo.color.red=Red # pepRevokeTrust.question=Do you really want to cancel the trust for %S? # pepRevokeMistrust.question=Do you really want to re-trust the key for %S? # pepRevokeTrust.doRevoke=Cancel &trust # wksConfirmationReq=Web Key Directory Confirmation Request # wksConfirmationReq.message=This message has been sent by your email provider to confirm deployment of your OpenPGP public key\nin their Web Key Directory.\nProviding your public key helps others to discover your key and thus being able to encrypt messages to you.\n\nIf you want to deploy your key in the Web Key Directory now, please click on the button "Confirm Request" in the status bar.\nOtherwise, simply ignore this message. # wksConfirmationReq.button.label=Confirm Request # autocryptSetupReq=Perform Autocrypt Setup # autocryptSetupReq.button.label=Start Setup # autocryptSetupReq.setupMsg.desc=This message contains all information to transfer your Autocrypt settings along with your secret key securely from your original device. # autocryptSetupReq.setupMsg.backup=You can keep this message and use it as a backup for your secret key. If you want to do this, you should write down the password and store it securely. # autocryptSetupReq.message.import=To import the settings and key(s) in Enigmail, please click on the "Start Setup" button in the status bar. # autocryptSetupReq.message.sent=Please click on the message on your new device and follow the instuctions to import the settings. # strings in pref-enigmail.js # oldGpgVersion20=Enigmail initialization failed.\n\nYou are using GnuPG version %1$S, which is not supported anymore. Enigmail requires GnuPG version %2$S or newer. Please upgrade your GnuPG installation, or Enigmail will not work. locateGpg=NájsÅ¥ program GnuPG invalidGpgPath=GnuPG nie je možné na uvedenej ceste spustiÅ¥. Enigmail bude preto vypnutý pokiaľ nezmeníte cestu k GnuPG alebo pokiaľ nereÅ¡tartujete aplikáciu. warningsAreReset=VÅ¡etky varovania boli resetované. prefs.gpgFound=GnuPG bolo nájdené v %S prefs.gpgNotFound=Nie je možné nájsÅ¥ GnuPG prefs.warnAskNever=Varovanie: aktiváciou tejto voľby dosiahnete to, že správy budú odosielané nezaÅ¡ifrované bez ohlásenia, ak nemáte kÄ¾ÃºÄ pre niektorého z príjemcov -- Enigmail Vás o tomto nebude naÄalej informovaÅ¥! prefs.warnIdleTimeForUnknownAgent=Váš systém používa Å¡pecializovaný nástroj pre prácu s heslami (napr. gnome-keyring alebo seahorse-agent). Bohužiaľ Enigmail nemôže kontrolovaÅ¥ Äasový limit hesla nástroja, ktorý používate. Z tohoto dôvodu prísluÅ¡né nastavenia v Enigmail nebudú brané v úvahu. prefEnigmail.oneKeyserverOnly=Chyba - je možné urÄiÅ¥ iba jeden keyserver pre automatické sÅ¥ahovanie chýbajúcich kľúÄov OpenPGP. # Strings used in core.jsm # (said file also re-uses some strings from above) enterAdminPin=Napíšte prosím PIN správcu VaÅ¡ej SmartCard enterCardPin=Napíšte prosím svoj PIN pre SmartCard notInit=Chyba! Služba Enigmail doposiaľ nebola inicializovaná badCommand=Chyba - Å¡ifrovací príkaz zlyhal cmdLine=príkazový riadok a výstup: notRequired=Chyba - Å¡ifrovanie nie je nutné notComplete=Chyba - generovanie kľúÄov nie je eÅ¡te dokonÄené invalidEmail=Chyba - chybná e-mailová adresa/y noPassphrase=Chyba - nebolo vyplnené heslo noPGPblock=Chyba - nenájdený platný dátový blok OpenPGP unverifiedReply=Odsadená ÄasÅ¥ správy (odpoveÄ) bola pravdepodobne zmenená # keyInMessageBody=Key in message body found. Click 'Import Key' to import the key sigMismatch=Chyba - podpis nesúhlasí cantImport=Chyba pri importovaní verejného kľúÄa\n\n # doImportOne=Import %1$S (%2$S)? # doImportMultiple=Import the following keys?\n\n%S # previewFailed=Can't read public key file. # Strings used in errorHandling.jsm sc.wrongCardAvailable=SmartCard %S nájdená vo VaÅ¡ej ÄítaÄke nemôže byÅ¥ použitá pre spracovanie správy.\nVložte prosím SmartCard %S a opakujte operáciu. sc.insertCard=Operácia vyžaduje VaÅ¡u SmartCard %s.\nVložte prosím požadovanú SmartCard a opakujte operáciu. sc.removeCard=Operácia vyžaduje, aby v ÄítaÄke nebola žiadna SmartCard.\nVyberte prosím SmartCard a zopakujte operáciu. sc.noCardAvailable=SmartCard v ÄítaÄke nebola nájdená\nVložte prosím SmartCard a zopakujte operáciu. sc.noReaderAvailable=VaÅ¡a ÄítaÄka SmartCard nie je pristupná\nPripojte prosím ÄítaÄku SmartCard, vložte kartu a operáciu zopakujte. # keyError.keySpecNotFound=The email address "%S" cannot be matched to a key on your keyring. # keyError.keyIdNotFound=The configured key ID "%S" cannot be found on your keyring. # keyError.resolutionAction=Please select a valid key in the OpenPGP section of your Account Settings. # missingPassphrase=Missing passphrase # errorHandling.gpgAgentInvalid=Your system is running a version of gpg-agent that is not suitable for your GnuPG version. # errorHandling.gpgAgentError=GnuPG reported an error in the communication with gpg-agent (a component of GnuPG). # errorHandling.dirmngrError=GnuPG reported an error in the communication with dirmngr (a component of GnuPG). # errorHandling.pinentryError=GnuPG cannot query your passphrase via pinentry. # errorHandling.readFaq=This is a system setup or configuration error that prevents Enigmail from working properly and cannot be fixed automatically.\n\nWe strongly recommend that you consult our support web site at https://enigmail.net/faq. gpgNotFound=Nie je možné nájsÅ¥ program GnuPG '%S'.\nPresvedÄte sa, že máte správne zadanú cestu ku spustiteľnému súboru GnuPG v nastavení Enigmail. gpgNotInPath=Nie je možné nájsÅ¥ spustiteľný súbor GnuPG v ceste PATH.\nUistite sa, že máte správne zadanú cestu k spustiteľnému súboru GnuPG v nastavení Enigmail. # enigmailNotAvailable=Enigmail core Service not available prefGood=SPRÃVNY podpis od %S prefBad=CHYBNà podpis od %S failCancel=Chyba - príjem kľúÄa zruÅ¡ený užívateľom failNoServer=Chyba - nie je urÄený keyserver pre prijatie kľúÄov failNoID=Chyba - nie je urÄené ID, pre ktoré prijaÅ¥ kÄ¾ÃºÄ failKeyExtract=Chyba - extrakcia kľúÄa zlyhala notFirstBlock=Chyba - prvý blok OpenPGP nie je blok verejného kľúÄa importKeyConfirm=ImportovaÅ¥ verejný/é kľúÄ(e) obsiahnutý v správe? failKeyImport=Chyba - import kľúÄa zlyhal fileWriteFailed=Zlyhal zápis do súbora %S importKey=ImportovaÅ¥ verejný kÄ¾ÃºÄ %S z keyservera: uploadKey=PoslaÅ¥ verejný kÄ¾ÃºÄ %S na keyserver: keyId=ID kľúÄa keyAndSigDate=ID kľúÄa: 0x%S / Podpísaný: %S keyFpr=OdtlaÄok prstu kľúÄa: %S noEmailProvided=Nezadal/a ste e-mailovú adresu! keyAlreadySigned=KÄ¾ÃºÄ je už podpísaný, nemôžete ho podpísaÅ¥ dvakrát. ##################################################################### # Strings used in enigmailKeySelection.js ##################################################################### selKeyExpired=expirovaný %S createdHeader=Vytvorený atLeastOneKey=Nebol zvolený žiadny kľúÄ! Pre prijatie tohto dialógu vyberte aspoň jeden kÄ¾ÃºÄ fewerKeysThanRecipients=Vybrali ste menší poÄet kľúÄov než príjemcov. Je naozaj zoznam kľúÄov k Å¡ifrovaniu kompletný? userSel.button.goBack=VybraÅ¥ viacero kľúÄov userSel.secretKeySel.title=Vyberte súkromný kÄ¾ÃºÄ OpenPGP k podpisu svojich správ # userSel.problemNoKey=No valid key # userSel.problemMultipleKeys=Multiple keys # should be same as thunderbird ENTITY sendLaterCmd.label: sendLaterCmd.label=OdoÅ¡li neskôr # Strings used in enigmailAttachmentDialog.js # pgpMimeNote=NOTE: PGP/MIME is not supported by all email clients. If you are unsure, select the %S option. first=prvý second=druhý # Strings used in am-enigprefs.js / enigmailEditIdentity.js encryptKeyHeader=UrÄiÅ¥ kÄ¾ÃºÄ OpenPGP pre Å¡ifrovanie identityName=Identita: %S # switchPepMode=You are currently using the 'p≡p Junior' mode of Enigmail.\n\nBy enabling OpenPGP or S/MIME for an account, you are disabling p≡p and use the 'regular' mode of Enigmail without p≡p. # enableEnigmail=&Disable p≡p # Strings used in enigmailSingleRcptSettings.js noEncryption=Máte aktivované Å¡ifrovanie, ale nevybral/a ste žiaden kľúÄ. K Å¡ifrovaniu správy pre %S je potrebné vybraÅ¥ jeden alebo niekoľko platných kľúÄov zo zoznamu. Chcete zakázaÅ¥ Å¡ifrovanie pre %S? noKeyToUse=(niÄ - žiadne Å¡ifrovanie) noEmptyRule=Pravidlo nesmie byÅ¥ prázdne! Prosím nastavte e-mailovú adresu v poli pravidla. invalidAddress=Vložená/é e-mailová/é adresa/y je/sú neplatná/é. Nie je možné vkladaÅ¥ mená príjemcov, ale iba e-mailové adresy. Napr.:\nNeplatné: meno \nPlatné: meno@adresa.sk # noCurlyBrackets=The curly brackets {} have a special meaning and should not be used in an email address. If you want to modify the matching behavior for this rule, use the 'Apply rule if recipient ...' option.\nMore information is available from the Help button. # Strings used in enigmailRulesEditor.js never=Nikdy always=Vždy possible=Možné deleteRule=Naozaj zmazaÅ¥ vybrané pravidlo? nextRcpt=(ÄŽalší príjemca) negateRule=Nie addKeyToRule=PridaÅ¥ kÄ¾ÃºÄ %S (%S) do pravidiel pre príjemcov # Strings used in enigmailSearchKey.js needOnline=Funkcia, ktorú ste zvolil/a, nie je dostupná v offline móde. Prejdite prosím do online módu a skúste to znova. protocolNotSupported=Protokol '%S://', ktorý ste zvolil/a, nie je podporovaný pre stiahnutie kľúÄov OpenPGP. gpgkeysDisabled=Môže vám pomôcÅ¥ povoliÅ¥ voľbu 'extensions.enigmail.useGpgKeysTool' noKeyserverConn=Nie je možné sa pripojiÅ¥ na keyserver %S. keyDownloadFailed=Zlyhalo stiahnutie kľúÄa z keyservera. Stavová správa:n%S internalError=Vyskytla sa vnútorná chyba. KľúÄe nie je možné stiahnuÅ¥ alebo importovaÅ¥. noKeyFound=Je mi ľúto, ale nemôžem nájsÅ¥ žiaden kľúÄ, ktorý by zodpovedal zadaným kritériám pre vyhľadávanie.\nVÅ¡imnite si prosím, že ID kľúÄa by malo zaÄínaÅ¥ na \\"0x\\" (napr. 0xABCDEF12). # keyDownload.keyUnavailable=We are sorry, but the key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their key by email. # gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. gpgKeysFailed=Zlyhalo hľadanie alebo sÅ¥ahovanie kľúÄa z keyservera: gpgkeys_%S nie je možné spustiÅ¥. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Nastavenie dôveryhodnosti zlyhalo # Strings in enigmailSignKeyDlg.js signKeyFailed=Podpísanie kľúÄa zlyhalo alreadySigned.label=Upozornenie: kÄ¾ÃºÄ %S je už podpísaný oznaÄeným súkromným kľúÄom. # alreadySignedexportable.label=Note: the key %S is already signed exportable with the selected secret key. A local signature does not make sense. partlySigned.label=Poznámka: niektoré uživateľské ID kľúÄa %S sú podpísané zvoleným tajným kľúÄom. # noTrustedOwnKeys=No eligible key found for signing! You need at least one fully trusted secret key in order to sign keys. # Strings in enigmailKeyManager.js keyMan.loadingKeys=NaÄítanie kľúÄov, Äakajte prosím ... keyValid.unknown=neznámy keyValid.invalid=neplatný keyValid.disabled=zakázaný keyValid.revoked=revokovaný keyValid.expired=expirovaný keyValid.noSubkey=žiaden platný podkÄ¾ÃºÄ keyTrust.untrusted=nedôveryhodný keyTrust.marginal=okrajovo keyTrust.full=plne dôveryhodný keyTrust.ultimate=absolútne dôveryhodný keyTrust.group=(skupina) keyType.public=verejný keyType.publicAndSec=verejný/súkromný keyMan.enableKey=PovoliÅ¥ kÄ¾ÃºÄ keyMan.disableKey=ZakázaÅ¥ kÄ¾ÃºÄ userAtt.photo=Fotka užívateľa (JPEG obrázok) asciiArmorFile=Súbory kódované ASCII (*.asc) importKeyFile=Importuj OpenPGP súbor kľúÄa gnupgFile=Súbory GnuPG # createKeyOK=Your Key has been generated saveRevokeCertAs=VytvoriÅ¥ a uložiÅ¥ revokaÄný certifikát # revokeCertOK=The revocation certificate has been successfully created. You can use it to invalidate your public key, e.g. in case you would lose your secret key. revokeCertFailed=RevokaÄný certifikát nemohol byÅ¥ vytvorený. addUidOK=ÚspeÅ¡ne pridané ID užívateľa addUidFailed=Zlyhalo pridanie ID užívateľa noKeySelected=K vykonaniu operácie by ste mal/a vybraÅ¥ aspoň jeden kÄ¾ÃºÄ exportToFile=ExportovaÅ¥ verejný kÄ¾ÃºÄ do súboru # exportKeypairToFile=Export Secret and Public Key To File exportSecretKey=Prajete si do uloženého súboru s kľúÄom OpenPGP zahrnúť i súkromný kľúÄ? saveKeysOK=KľúÄe boli úspeÅ¡ne uložené saveKeysFailed=Uloženie kľúÄov zlyhalo importKeysFailed=Importovanie kľúÄov zlyhalo enableKeyFailed=Povolenie/zakázanie kľúÄov zlyhalo specificPubKeyFilename=%S (0x%S)_verejný specificPubSecKeyFilename=%S (0x%S)_verejný-súkromný defaultPubKeyFilename=Exportované-verejné-kľúÄe defaultPubSecKeyFilename=Exportovaný-verejný-a-súkromný-kÄ¾ÃºÄ noSecretKeys=Neboli nájdené žiadne súkromné kľúÄe.\n\nPrajete si teraz vytvoriÅ¥ svoj vlastný kľúÄ? sendKeysOk=KľúÄ/e boli úspeÅ¡ne odoslané sendKeysFailed=Odosielanie kľúÄov zlyhalo receiveKeysOk=KľúÄ/e úspeÅ¡ne aktualizované receiveKeysFailed=SÅ¥ahovanie kľúÄov zlyhalo importFromClip=Prajete si importovaÅ¥ niektorý/é kľúÄ/e zo schránky? # importFromUrl=Download public key from this URL: copyToClipbrdFailed=Zvolený/é kľúÄ/e nie je možné kopírovaÅ¥ do schránky. copyToClipbrdOK=KľúÄe boli nakopírované do schránky deleteSecretKey=Varovanie: Snažíte se zmazaÅ¥ súkromný kľúÄ!\nAk zmažete svoj súkromný kľúÄ, nebudete môcÅ¥ Äalej deÅ¡ifrovaÅ¥ správy zaÅ¡ifrované pre tento kÄ¾ÃºÄ ani kÄ¾ÃºÄ revokovaÅ¥.\n\nPrajete si naozaj zmazaÅ¥ oba kľúÄe (verejný i súkromný)\n'%S'? deleteMix=POZOR: Snažíte sa zmazaÅ¥ súkromné kľúÄe!\nAk zmažete svoj súkromný kľúÄ, nebudete môcÅ¥ Äalej deÅ¡ifrovaÅ¥ správy zaÅ¡ifrované pre tento kľúÄ.\n\nNaozaj si prajete zmazaÅ¥ Vami zvolený verejný a súkromný kľúÄ? deletePubKey=Prajete si zmazaÅ¥ tento verejný kľúÄ\n'%S'? deleteSelectedPubKey=Prajete si zmazaÅ¥ tieto verejné kľúÄe? deleteKeyFailed=KÄ¾ÃºÄ nie je možné zmazaÅ¥ # revokeKeyQuestion=You are about to revoke the key '%S'.\n\nYou will no longer be able to sign with this key, and once distributed, others will no longer be able to encrypt with that key. You can still use the key to decrypt old messages.\n\nDo you want to proceed? revokeKeyOk=KÄ¾ÃºÄ bol revokovaný. Ak je tento kÄ¾ÃºÄ dostupný taktiež na keyserveri, je doporuÄené odoslaÅ¥ ho tam znova, aby ste dal/a i ostatným uživateľom vedieÅ¥ o revokácii. revokeKeyFailed=KÄ¾ÃºÄ nie je možné revokovaÅ¥ # revokeKeyNotPresent=You have no key (0x%S) which fits to this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before the revocation certificate! # revokeKeyAlreadyRevoked=The key 0x%S has already been revoked. refreshAllQuestion=Nevybral/a ste žiaden kľúÄ. Prajete si obnoviÅ¥ zoznam vÅ¡etkých kľúÄov? # refreshKeyServiceOn.warn=Warning: Your keys are currently being refreshed in the background as safely as possible.\nRefreshing all your keys at once will unnecessarily reveal information about you.\nDo you really want to do this? refreshKey.warn=POZOR: v závislosti na poÄte kľúÄov a rýchlosti pripojenia k internetu môže trvaÅ¥ obnovenie zoznamu vÅ¡etkých kľúÄov dlhÅ¡iu dobu! downloadContactsKeys.warn=Upozornenie: v závislosti na poÄte kontaktov a rýchlosti vášho pripojenia, sÅ¥ahovanie vÅ¡etkých kľúÄov môže trvaÅ¥ veľmi dlho! downloadContactsKeys.importFrom=ImportovaÅ¥ kontakty zo zoznamu kontaktov '%S'? keyMan.button.exportSecKey=ExportovaÅ¥ &súkromné kľúÄe keyMan.button.exportPubKey=Ex&portovaÅ¥ iba verejné kľúÄe keyMan.button.import=&ImportovaÅ¥ keyMan.button.refreshAll=&Znova naÄítaÅ¥ vÅ¡etky kľúÄe keyMan.button.revokeKey=&RevokovaÅ¥ kÄ¾ÃºÄ keyMan.button.skip=Pre&skoÄ kÄ¾ÃºÄ keylist.noOtherUids=Nemá iné identity keylist.hasOtherUids=ÄŽalÅ¡ia identita keylist.noPhotos=Fotografia nie je dostupná keylist.hasPhotos=Fotografie keyMan.addphoto.filepicker.title=Vyberte obrázok pre pridanie. keyMan.addphoto.warnLargeFile=Súbor, ktorý ste si vybrali, je väÄší ako 25 kB. Nie je doporuÄené pridávaÅ¥ veľmi veľké obrázky, pretože kľúÄe sú potom príliÅ¡ veľké. keyMan.addphoto.noJpegFile=Vybraný súbor sa nezdá byÅ¥ súbor vo formáte JPEG. Zvoľte si prosím iný súbor keyMan.addphoto.failed=Fotka nemôže byÅ¥ pridaná. # noWksIdentity=The key %S does not have a WKS identity. # keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key "%1$S (%2$S)" for encrypting messages? # keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key "%1$S (%2$S)" for future messages? # keyman.addBlacklistKey.button=&Blacklist the key # keyman.removeBlacklistKey.button=&Remove key from Blacklist # Strings in enigmailManageUidDlg.xul changePrimUidFailed=Zmena Å¡tandardného ID užívateľa zlyhala changePrimUidOK=Zmena Å¡tandardného ID užívateľa prebehla úspeÅ¡ne revokeUidFailed=Revokácia ID užívateľa %S zlyhala revokeUidOK=ID užívateľa %S bolo úspeÅ¡ne revokované. Ak je tento kÄ¾ÃºÄ dostupný taktiež na keyserveri, je doporuÄené odoslaÅ¥ ho tam znova, aby sa aj ostatní o revokácii dozvedeli. revokeUidQuestion=UrÄite si prajete revokovaÅ¥ ID užívateľa %S? # Strings in enigmailKeyImportInfo.xul # importInfoTitle=SUCCESS! Keys imported # importInfoBits=Bits # importInfoCreated=Created # importInfoFpr=Fingerprint # importInfoDetails=(Details) # importInfoNoKeys=No keys imported. # Strings in enigmailKeyDetailsDlg.xul keyTypePublic=verejný kÄ¾ÃºÄ keyTypePrimary=hlavný kÄ¾ÃºÄ keyTypeSubkey=podkÄ¾ÃºÄ keyTypePair=pár kľúÄov keyExpiryNever=nikdy keyAlgorithm_1=RSA keyAlgorithm_2=RSA keyAlgorithm_3=RSA keyAlgorithm_16=ELG keyAlgorithm_17=DSA # keyAlgorithm_18=ECDH # keyAlgorithm_19=ECDSA keyAlgorithm_20=ELG # keyAlgorithm_22=EDDSA keyUsageEncrypt=Å ifrovaÅ¥ keyUsageSign=PodpísaÅ¥ keyUsageCertify=PotvrdiÅ¥ keyUsageAuthentication=Overovanie # keyDoesNotExpire=Key does not expire # Strings in enigmailGenCardKey.xul keygen.started=Prosím poÄkajte, kÄ¾ÃºÄ sa zaÄal vytváraÅ¥ .... keygen.completed=KÄ¾ÃºÄ vytvorený. Nový kÄ¾ÃºÄ má ID: 0x%S keygen.keyBackup=KÄ¾ÃºÄ bol zazálohovaný ako %S keygen.passRequired=Ak chcete vytvoriÅ¥ záložnú kópiu Vášho kľúÄa mimo SmartCard, napíšte prosím heslo. # Strings in enigmailSetCardPin.xul cardPin.processFailed=Zmena PIN zlyhala # Strings in enigRetrieveProgres.xul keyserverProgress.refreshing=Obnovujú sa kľúÄe, prosím Äakajte ... keyserverProgress.uploading=Odosielanie kľúÄov, prosím Äakajte ... # keyserverProgress.wksUploadFailed=Could not upload your key to the Web Key Service # keyserverProgress.wksUploadCompleted=Your public key was successfully submitted to your provider. You will receive an email to confirm that you initiated the upload. keyserverTitle.refreshing=ObnoviÅ¥ kľúÄe keyserverTitle.uploading=Odosielanie kľúÄa # Strings in enigmailSetupWizard passphrase.min8keys=VaÅ¡e heslo je kratÅ¡ie než 8 znakov! setupWizard.reallyCancel=Naozaj si prajete ukonÄiÅ¥ sprievodcu nastavením Enigmail? setupWizard.invalidGpg=Súbor, ktorý ste zvolili, nie je spustiteľný súbor GnuPG. Prosím, zvoľte iný súbor. setupWizard.specifyFile=Pre pokraÄovanie musíte zadaÅ¥ aspoň súbor s verejným kľúÄom. setupWizard.installFailed=Vyzerá to, že inÅ¡talácia sa nepodarila. Prosím skúste inÅ¡taláciu znova, alebo nainÅ¡talujte GnuPG ruÄne a urÄite súbor pomocou tlaÄítka Prehľadávanie. # setupWizard.downloadForbidden=For your own security, we will not download GnuPG. Please visit https://gnupg.org/ in order to download GnuPG. # setupWizard.downloadImpossible=We cannot download GnuPG currently. Please try later or visit https://gnupg.org/ in order to download GnuPG. setupWizard.hashSumError=Pomocník nemôže skontrolovaÅ¥ integritu stiahnutého súboru. Súbor je možno poÅ¡kodený, alebo neoficiálne upravený. Ste si istý, že chcete pokraÄovaÅ¥ v inÅ¡talácii? # setupWizard.importSettingsFile=Specify backup file to load from # setupWizard.invalidSettingsFile=The specified file is not a correct Enigmail Settings backup file. # setupWizard.gpgConfExists=The GnuPG config file already exists. Do you want to overwrite it with the one from your old installation? # setupWizard.noGpgHomeDir=It appears that you configured %S to use for GnuPG. However, this is not a directory - you cannot use it. # setupWizard.unmachtedIds=The following identities of your old setup could not be matched:\n%S\nThe settings for these identities were skipped. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=Vyskytla sa chyba pri pokuse o stiahnutie GnuPG. Prosím skontrolujte záznam v konzole pre ÄalÅ¡ie podrobnosti. installGnuPG.installFailed=Vyskytla sa chyba pri inÅ¡talácii GnuPG. Prosím skontrolujte záznam v konzole pre ÄalÅ¡ie podrobnosti. # Strings in enigmailAddUidDlg.xul addUidDlg.nameOrEmailError=Musíte vyplniÅ¥ meno a e-mailovú adresu addUidDlg.nameMinLengthError=Meno musí maÅ¥ aspoň 5 znakov addUidDlg.invalidEmailError=Musíte zadaÅ¥ platnú e-mailovú adresu # Strings in enigmailCardDetails.js Carddetails.NoASCII=OpenPGP Smartkarty podporujú iba ASCII znaky v Prvom mene/Mene. # network error types errorType.SecurityCertificate=BezpeÄnostný certifikát webovej služby nie je platný. errorType.SecurityProtocol=BezpeÄnostný protokol používaný webovou službou je neznámy. errorType.Network=Vyskytol sa problém so sieÅ¥ovým pripojením. # filter stuff # filter.folderRequired=You must select a target folder. # filter.decryptMove.label=Decrypt permanently (Enigmail) # filter.decryptCopy.label=Create decrypted Copy (Enigmail) # filter.decryptMove.warnExperimental=Warning - the filter action "Decrypt permanently" may lead to destroyed messages.\n\nWe strongly recommend that you first try the "Create decrypted Copy" filter, test the result carefully, and only start using this filter once you are satisified with the result. # filter.tempPepFilterDesc=Temporary filter to store sent message unencrypted # filter.term.pgpencrypted.label=OpenPGP Encrypted # filter.encrypt.label=Encrypt to key (Enigmail) # filter.keyRequired=You must select a recipient key. # filter.keyNotFound=Could not find an encryption key for "%S". # filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for "%S" you will no longer be able to read the emails. # strings in enigmailConvert.jsm # converter.decryptBody.failed=Could not decrypt message with subject\n"%S".\nDo you want to retry with a different passphrase or do you want to skip the message? # converter.decryptAtt.failed=Could not decrypt attachment "%1$S"\nof message with subject\n"%2$S".\nDo you want to retry with a different passphrase or do you want to skip the message? # saveLogFile.title=Save Log File # strings in gpg.jsm # unknownSigningAlg=Unknown signing algorithm (ID: %S) # unknownHashAlg=Unknown cryptographic hash (ID: %S) # strings in keyRing.jsm # keyring.photo=Photo # keyRing.pubKeyRevoked=The key %1$S (key ID %2$S) is revoked. # keyRing.pubKeyExpired=The key %1$S (key ID %2$S) has expired. # keyRing.pubKeyNotForSigning=The key %1$S (key ID %2$S) cannot be used for signing. # keyRing.pubKeyNotForEncryption=The key %1$S (key ID %2$S) cannot be used for encryption. # keyRing.keyDisabled=The key %1$S (key ID %2$S) is disabled; it cannot be used. # keyRing.keyNotTrusted=The key %1$S (key ID %2$S) is not trusted enough. Please set the trust level of your key to "ultimate" to use it for signing. # keyRing.keyInvalid=The key %1$S (key ID %2$S) is not valid. Please consider verifying it correctly. Alternatively use the Default encryption settings in the Enigmail preferences dialog. # keyRing.signSubKeysRevoked=All signing-subkeys of key %1$S (key ID %2$S) are revoked. # keyRing.signSubKeysExpired=All signing-subkeys of key %1$S (key ID %2$S) have expired. # keyRing.signSubKeysUnusable=All signing-subkeys of key %1$S (key ID %2$S) are revoked, expired or otherwise unusable. # keyRing.encSubKeysRevoked=All encryption subkeys of key %1$S (key ID %2$S) are revoked. # keyRing.encSubKeysExpired=All encryption subkeys of key %1$S (key ID %2$S) have expired. # keyRing.noSecretKey=You do not seem to have the secret key for %1$S (key ID %2$S) on your keyring; you cannot use the key for signing. # keyRing.encSubKeysUnusable=All encryption subkeys of key %1$S (key ID %2$S) are revoked, expired or otherwise unusable. #strings in exportSettingsWizard.js # cannotWriteToFile=Cannot save to file '%S'. Please select a different file. # dataExportError=An error occurred during exporting your data. # enigmailSettings=EnigmailSettings # defaultBackupFileName=Enigmail-export # specifyExportFile=Specify file name for exporting # homedirParamNotSUpported=Additional params that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. #strings in expiry.jsm # expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use the new key. # expiry.keysExpireSoon=The following of your keys will expire in less than %1$S days:\n%2$S We recommend that you create new keys and configure your accounts to use the new keys. # expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to ultimate in key properties. # expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to ultimate in key properties. # expiry.OpenKeyManager=Open Enigmail Key Management # expiry.OpenKeyProperties=Open Key Properties #strings in pEpDecrypt.jsm # pEpDecrypt.cannotDecrypt=This is an encrypted message. Unfortunately you don't have the secret key to decrypt the message. #strings in gpgAgent.jsm # gpghomedir.notexists=The directory '%S' containing your OpenPGP keys does not exist and cannot be created. # gpghomedir.notwritable=The directory '%S' containing your OpenPGP keys is not writable. # gpghomedir.notdirectory=The directory '%S' containing your OpenPGP keys is a file instead of a directory. # gpghomedir.notusable=Please fix the directory permissions or change the location of your GnuPG "home" directory. GnuPG cannot work correctly otherwise. #strings in pepTrustWords.js # pepTrustWords.cannotVerifyOwnId=Cannot verify p≡p Trustwords for own account. # pepTrustWords.cannotFindKey=Cannot find key for %S. # pepTrustWords.cannotStoreChange=Could not change trust for %S. # pepTrustWords.generalFailure=Cannot obtain trustwords for %S. # pepTrustWords.partnerFingerprint=Fingerprint for %S: #strings in mimeWkdHandler.jsm # wkdMessage.body.req=Your email provider processed your request to upload your public key to the OpenPGP Web Key Directory.\n\nPlease click the confirmation button in the Enigmail header to complete the publishing of your public key. # wkdMessage.body.process=This is an email related to the automatic processing to upload your public key to the OpenPGP Web Key Directory.\n\nYou do not need to take any manual action at this point. #strings in pepHandshake.js # pepPrivacyStatus.RatingBrokenSuggestion=Either you or the sender should resend the message. # pepPrivacyStatus.RatingHaveNoKeySuggestionOutgoing=If you composed this message, your key is not available. # pepPrivacyStatus.RatingMistrustSuggestion=Re-establish the connection with your communication partner and try to complete another handshake. # pepPrivacyStatus.RatingReliableSuggestion=Complete a handshake with your communication partner by exchanging trustwords in person or over the phone. A handshake is needed only once per partner and will ensure secure and trusted communication. # pepPrivacyStatus.RatingTrustedSuggestion=No action needed! # pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware this message may not be secure. # pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Please add the necessary information. # pepPrivacyStatus.RatingUnderAttackSuggestion=Separately verify the content of this message with your communication partner. # pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least secure. # pepPrivacyStatus.RatingUnencryptedSuggestion=Please ask your communication partner to use an encryption solution or install p≡p. # pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or no signature. Ask your communication partner to upgrade their encryption solution or install p≡p. # pepPrivacyStatus.RatingBrokenExplanation=This message has broken encryption or formatting. # pepPrivacyStatus.RatingHaveNoKeyExplanation=This message cannot be decrypted because the key is not available. # pepPrivacyStatus.RatingMistrustExplanation=This message has a communication partner that has previously been marked as mistrusted. # pepPrivacyStatus.RatingReliableExplanation=This message is secure but you still need to verify the identity of your communication partner. # pepPrivacyStatus.RatingTrustedExplanation=This message is secure and trusted. # pepPrivacyStatus.RatingUndefinedExplanation=This message does not contain enough information to determine if it is secure. # pepPrivacyStatus.RatingUnderAttackExplanation=This message is not secure and has been tampered with. # pepPrivacyStatus.RatingUnencryptedExplanation=This message is unsecure. # pepPrivacyStatus.RatingUnencryptedForSomeExplanation=This message is unsecure for some communication partners. # pepPrivacyStatus.RatingUnreliableExplanation=This message has unreliable protection. # pepPrivacyStatus.RatingBrokenText=Broken # pepPrivacyStatus.RatingHaveNoKeyText=Cannot Decrypt # pepPrivacyStatus.RatingMistrustText=Mistrusted # pepPrivacyStatus.RatingReliableText=Secure # pepPrivacyStatus.RatingTrustedText=Secure & Trusted # pepPrivacyStatus.RatingUndefinedText=Unknown # pepPrivacyStatus.RatingUnderAttackText=Under Attack # pepPrivacyStatus.RatingUnencryptedForSomeText=Unsecure for Some # pepPrivacyStatus.RatingUnencryptedText=Unsecure # pepPrivacyStatus.RatingUnreliableText=Unreliable Security # handshakeDlg.button.initHandshake=Handshake... # handshakeDlg.button.stopTrust=Stop Trusting # handshakeDlg.button.reTrust=Stop Mistrusting # handshakeDlg.label.outgoingMessage=Outgoing message # handshakeDlg.label.incomingMessage=Incoming message # handshakeDlg.error.noPeers=Cannot handshake without any correspondents. # handshakeDlg.error.noProtection=Please enable protection in order to use the Handshake function. # enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device # enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup #strings in autocrypt.jsm # autocrypt.setupMsg.subject=Autocrypt Setup Message # autocrypt.setupMsg.msgBody=To set up your new device for Autocrypt, please follow the instuctions that should be presented by your new device. # autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code presented on your old device, and then import the contained key into your keyring. #strings in upgradeInfo.html # upgradeInfo.doctitle=What's New in Enigmail v2.0? # upgradeInfo.welcome1=Welcome to the new Enigmail version 2.0! # upgradeInfo.welcome2=The release contains a lot of new and changed features. Please take a minute to find out what's new: # upgradeInfo.encSubject.title=Encrypting the Message Subject # upgradeInfo.encSubject.desc=We developed a new method that moves the email subject into the encrypted message, and replaces the visible subject with "Encrypted Message". Once such a message is decrypted, the original subject is replaced automatically. Hiding the subject is on by default; there is a preference to turn it off if you don't like it. (Note: this feature requires the message to be sent with PGP/MIME.) # upgradeInfo.buttons.title=Changed behavior of Encrypt and Sign Buttons # upgradeInfo.buttons.desc=The Encrypt and Sign buttons in the message composer window now work for both the OpenPGP and S/MIME protocols. If both algorithms are possible, then Enigmail will try to prefer the one for which all keys are available. # upgradeInfo.autocrypt.title=Support for Autocrypt # upgradeInfo.autocrypt.desc=Enigmail now supports Autocrypt, a new standard to distribute keys as part of sent messages. Enigmail automatically imports keys from Autocrypt-compliant messages, such that over time more and more emails can be encrypted. # upgradeInfo.pEp.title=New p≡p Junior Mode (Pretty Easy Privacy) # upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. You currently need to manually install p≡p for this purpose; this will change in a future release. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. # upgradeInfo.bottom.desc=Please visit our documentation for help on using Enigmail. # pep.missingGnuPG=In order to use Enigmail/p≡p, GnuPG is required. As we could not find it, we suggest to download and install it for you. #strings in enigmailAbout.html # aboutEnigmail.tabName=About Enigmail # aboutEnigmail.title=OpenPGP support provided by Enigmail # aboutEnigmail.team=Enigmail is developed by the Enigmail Team: # aboutEnigmail.projectLeader=Lead Developer: # aboutEnigmail.usability=Usability: # aboutEnigmail.documentation=Documentation: # aboutEnigmail.testing=Testing: # aboutEnigmail.userSupport=User Support: # aboutEnigmail.localization=Localization: See the Enigmail Language Packs page # aboutEnigmail.Credits=Credits: # aboutEnigmail.origAuthor=Original author of the Enigmail extension # aboutEnigmail.icons=Icons: # aboutEnigmail.formerMembers=Former team members: # aboutEnigmail.projectHosting=Project hosting: # aboutEnigmail.licenseSupportTitle=License & Support # aboutEnigmail.license=Enigmail OpenPGP is open source and licensed under the %S # aboutEnigmail.support=Support and download is available from www.enigmail.net. enigmail-2.0.8/lang/sk/help/000077500000000000000000000000001334302754500156025ustar00rootroot00000000000000enigmail-2.0.8/lang/sk/help/compose.html000066400000000000000000000100761334302754500201410ustar00rootroot00000000000000 Enigmail Help: Message Composition

Enigmail Help

Using Enigmail when composing messages

Enigmail menu in Mail/Compose window
Sign message
Enable/Disable sending signed mail. User is notified, if signing fails.
Encrypt message

Enable/Disable encryption to all recipient(s) before sending. User is notified, if encryption fails.

If Display selection when necessary is set in Preferences -> Key Selection tab, a list of keys will pop up if there are addresses in the list of recipients for the message for whom you have no public key.

If Never display OpenPGP key selection dialog is set in Preferences -> Key Selection tab, and there are addresses in the list of recipients for the message for whom you have no public key, the message will be sent unencrypted.

Use PGP/MIME for this message
Enable/Disable the use of PGP/MIME for this message.

If you know the recipient(s) can read mail using the PGP/MIME format, you should use it.

This feature is dependent on the settings in Preferences -> PGP/MIME tab being set to Allow to use PGP/MIME or Always use PGP/MIME.

Default composition options
  • Signing/Encryption Options...: shortcut to Account Settings -> OpenPGP Options.
  • Send options...: shortcut to Preferences -> Send tab.
  • Key selection options...: shortcut to Preferences -> Key Selection tab.
  • PGP/MIME options...: shortcut to Preferences -> PGP/MIME tab.
Undo encryption

If there is a failure when actually sending mail, such as the POP server not accepting the request, Enigmail will not know about it, and the encrypted message will continue to be displayed in the Compose window. Choosing this menu item will undo the encryption/signing, reverting the Compose window back to its original text.

As a temporary fix, this option may also be used to decrypt the quoted text when replying to encrypted messages. Enigmail should automatically decrypt the quoted message, but if that fails for some reason, you can use this menu item to force it.

Insert public key
insert ASCII-armored public key block at the current cursor location in the Compose window. You will be prompted for the email addresses of the key(s) to be inserted. Keys inserted in this manner will automatically be recognized at the receiving end by Enigmail. After key insertion, you may still choose to sign/encrypt the mail as needed. Also, do not insert more than one key block in a message; just specify multiple email addresses, separated by commas or spaces, when prompted.
Clear save passphrase
Clears cached passphrase. Useful if you have multiple passphrases.
Help
Displays Help information from the website (this page).

Further help is available on the Enigmail Help web page

enigmail-2.0.8/lang/sk/help/editRcptRule.html000066400000000000000000000115601334302754500211010ustar00rootroot00000000000000 Enigmail Help: Edit OpenPGP Rule

Enigmail Help

Using the Enigmail Rules Editor: Edit OpenPGP Rule

In the Rules Editor, you can specify defaults per recipient for enabling encryption, signing and PGP/MIME, and to define what OpenPGP key(s) to use. In this dialog, you can specify the rules for a single recipient, and for a group of recipients with very similar attributes.

Set OpenPGP Rules for
Contains the email addresses of the recipients (without names, i.e. just an address like somebody@email.domain). You can specify several email addresses, separated by spaces. The address specified here can consist of only the domain section so that mail to any address at that domain will be matched, e.g. @email.domain will allow matching to body@email.domain, somebody@email.domain, anybody@email.domain, etc.
Apply rule if recipient ...
This modifies the matching of the email addresses. If multiple addresses are entered, the setting will apply to all. The examples below are based on body@email.domain entered in the OpenPGP Rules field above.
  • Is exactly: with this setting, the rule will only trigger on emails to body@email.domain (exact, case insensitive matching).
  • Contains: with this setting, any email address containing the string is matched, e.g. anybody@email.domain or body@email.domain.net
  • Begins with: with this setting, any email address starting with the string is matched, e.g. body@email.domain.net, body@email.domain-name.com.
  • Ends with: with this setting, any email address ending with the string is matched, e.g. anybody@email.domain , somebody@email.domain.
Continue with the next rule for the matching address
Enabling this function will allow you to define a rule but not have to specify a KeyID in the Use the following OpenPGP keys: field, so that the email address is used to check for a key at the time of sending. Also, further rules for the same address(es) will be processed as well.
Do not check further rules for the matching address
Enabling this function stops processing any other rules for the matching address(es) if this rule is matched; i.e. rule processing continues with the next recipient.
Use the following OpenPGP keys:
Use the Select Key(s).. button to select the recipient keys to be used for encryption. As in the action above, no further rules for the matching address(es) are processed.
Default for Signing
Enable or disable message signing. This either uses or overrides what you have specified in the message composition window. The values are:
  • Never: disable signing, even if it was enabled in the message composition window (overrules the other values)
  • Yes, if selected from in Message Composition: leave signing as specified in the message composition window
  • Always: enable signing, even if it was not enabled in the message composition window
These signing settings are applied for all rules that match. If one of the rules disables signing, the message will not be signed, regardless of other rules that specify Always.
Encryption
Enable or disable message encryption. The allowed settings and their meaning are the same as for message signing.
PGP/MIME
Enable or disable the use of the PGP/MIME (RFC 3156) message encoding. If PGP/MIME is disabled, the messages are encoded using "inline PGP". The allowed values and their meaning are the same as for message signing.

The rules are processed in the order displayed in the list in the OpenPGP Rules Editor. Whenever a rule matches a recipient and contains a OpenPGP Key ID, in addition to using the specified Key ID, the recipient is not considered anymore when processing further rules.


Further help is available on the Enigmail Per-Recipient Settings page

enigmail-2.0.8/lang/sk/help/initError.html000066400000000000000000000045421334302754500204520ustar00rootroot00000000000000 Enigmail Help: How to Resolve Problems with Initializing OpenPGP

Enigmail Help

How to Resolve Problems with Initializing OpenPGP

There are several reasons why initializing OpenPGP does not succeed. The most common ones are described below; for more information please visit the Enigmail Support page.

GnuPG could not be found

In order for OpenPGP to work, the tool GnuPG needs to be installed. If GnuPG cannot be found, then first make sure that the executable gpg.exe (on Windows; gpg on other platforms) is installed on your computer. If GnuPG is installed, and OpenPGP cannot find it, then you need to manually set the path to GnuPG in the OpenPGP Preferences (menu OpenPGP > Preferences)

Enigmime failed to initialize

OpenPGP works only if it is built using the same build environment as Thunderbird or SeaMonkey was built. This means that you can use the official Enigmail releases only if you use the official releases of Thunderbird or SeaMonkey provided by mozilla.org.

If you use a Thunderbird or SeaMonkey version coming from some other source (e.g. the provider of your Linux distribution), or if you built the application yourself, you should either use an Enigmail version built by the same source, or build Enigmail yourself. For building Enigmail, refer to the Source Code section on the Enigmail home page. Please don't file any bug report concerning this problem, it is not solvable.

Further help is available on the Enigmail Support Web Site.

enigmail-2.0.8/lang/sk/help/messenger.html000066400000000000000000000101221334302754500204540ustar00rootroot00000000000000 Enigmail Help: Message Reading

Enigmail Help

Using Enigmail when reading messages

Decrypt button in main Mail window
This button can be used for several purposes: decrypt, verify, or import public keys. Normally decryption/verification happens automatically, although this can be disabled through a preference. However, if this fails, usually a short error message will appear in the Enigmail status line. If you click the Decrypt button, you will be able to see a more detailed error message, including the output from the GnuPG command.
Pen and Key icons in Message Header display
The Pen and Key icons in the Message Header display indicate if the message you are reading was signed and/or encrypted and if the signature is good, i.e. the message has not been changed since it was signed. If the message has been changed, the Pen icon will change to a Broken Pen to indicate that the signature is bad. Right clicking on either the Pen or Key icons will bring up a menu with the following options:
  • OpenPGP Security info: allows you to view the output status from GnuPG for the message.
  • Copy OpenPGP Security info: copies the output status from GnuPG to the clipboard; to paste into a reply message, etc.
  • View OpenPGP Photo ID: allows you to view the Photo ID of the person who sent the message, if they have a photo embedded in their Public Key. (This option will only be enabled if a Photo ID exists in their key.)
  • S/MIME Security info: allows you to view the S/MIME Security Info for the message.

If you do not have keyserver-options auto-key-retrieve set in your gpg.conf file and you read a message which is signed or encrypted, you will see a Pen icon in the headers display area with a Question mark on it, the Enigmail status line in the headers area will say Part of the message signed; click pen icon for details and the message in the Message Pane will show all the OpenPGP message block indicators and the signature block.

You may also see this if you have keyserver-options auto-key-retrieve set in your gpg.conf file and the OpenPGP key is not available on the default keyserver.

Clicking on the Pen and Question mark icon will bring up a window advising that the key is unavailable in your keyring. Clicking on OK will bring up another window with a list of keyservers from which you can select to download the sender's public key from.

To configure the list of keyservers you wish to use, go to Enigmail -> Preferences -> Basic tab and enter the keyserver addresses in the Keyserver(s): box, separated by a comma. The first keyserver in the list will be used as the default.

Opening encrypted attachments / importing attached OpenPGP keys
Attachments named *.pgp, *.asc and *.gpg are recognized as attachments that can be handled specially by Enigmail. Right clicking on such an attachment enables two special menu items in the context menu: Decrypt and Open and Decrypt and Save. Use these two menu items if you want Enigmail to decrypt an attachment before opening or saving it. If an attachment is recognized as an OpenPGP key file, you are offered to import the keys it into your keyrings.

Further help is available on the Enigmail Help web page

enigmail-2.0.8/lang/sk/help/rulesEditor.html000066400000000000000000000060331334302754500207730ustar00rootroot00000000000000 Enigmail Help: Rules Editor

Enigmail Help

Using the Enigmail Rules Editor

In the Rules Editor, you can specify defaults per recipient for enabling encryption, signing and PGP/MIME, and to define what OpenPGP key(s) to use. Each rule consists of 5 fields and is represented on a single line:

Email
The e-mail(s) from the To:, Cc: and Bcc: fields to match. The matching works on substrings (Further details can be found in the Edit Rule dialog)
OpenPGP Key(s)
a list of OpenPGP Key ID's to use for the recipient
Sign
enable or disable message signing. This either uses or overrides what you have specified in the message composition window. The values are:
  • Never: disable signing, even if it was enabled in the message composition window (overrules the other values)
  • Possible: leave signing as specified in the message composition window
  • Always: enable signing, even if it was not enabled in the message composition window

These signing settings are applied for all rules that match. If one of the rules disables signing, the message will not be signed, regardless of other rules that specify Always.

Encrypt
enable or disable message encryption. The allowed settings and their meaning are the same as for message signing.
PGP/MIME
enable or disable the use of the PGP/MIME (RFC 3156) message encoding. If PGP/MIME is disabled, the messages are encoded using "inline PGP". The allowed values and their meaning a re the same as for message signing.

The rules are processed in the order displayed in the list. Whenever a rule matches a recipient and contains a OpenPGP Key ID, in addition to using the specified Key ID, the recipient is not considered anymore when processing further rules.

Note: The rule editor is not yet complete. It is possible to write some more advanced rules by directly editing the rules file (these rules should then not be edited anymore in the rule editor). Further information for directly editing the file is available on the Enigmail Homepage


Further help is available on the Enigmail Help web page

enigmail-2.0.8/lang/sk/help/sendingPrefs.html000066400000000000000000000047771334302754500211360ustar00rootroot00000000000000 Enigmail Help: Edit OpenPGP Rule

Enigmail Help

Defining Preferences to Send Encrypted

In the Sending Preferences you can choose the general model and preferences for encryption.

Convenient Encryption
With these settings, emails are encrypted without confirmation whenever possible.

This setup is appropriate, if you just want to improve your privacy by sending emails encyrpted instead of unencrypted if that's possible.

The effect is like sending emails as letters instead of postcards. Unlike postcards, letters usually hide their contents while in transit.

Note however that as with letters you can't be sure that nobody is opening the letter while it is in transit (although, some technical effort is necessary for that).

A concrete risk is that you accidentally use "faked keys" you got from somewhere or somebody claiming that the key belongs to the person you want to send emails to. To avoid this risk, you can either use the trust model of PGP (see below) or you should always verify, whether the fingerprint of a public key is correct.

Manual Encryption
This option allows you to specify the different preferences for encryption according to your needs. You can specify
  • whether replies to encrypted/signed emails should automatically also be encrypted/signed-
  • whether to use the trust model of OpenPGP to accept keys (this means that to use a key you either have to sign the key or have enough other people you trust having signed the key).
  • whether you want to automatically send emails encrypted if all keys are accepted.
  • whether and when you want to finally confirm sending an email.
If it is important for you that content you send encrypted can't be read by other people or organizations, you should use the manual preferences at least choose the option to accept keys only if you or other people signed them. While this model reduces the risk of using faked keys, it requires that you actively sign keys and declare owner trust using the key managament dialog. enigmail-2.0.8/lang/sl/000077500000000000000000000000001334302754500146535ustar00rootroot00000000000000enigmail-2.0.8/lang/sl/am-enigprefs.properties000066400000000000000000000001201334302754500213370ustar00rootroot00000000000000# Strings used in the Mozill AccountManager prefPanel-enigprefs=Varnost OpenPGP enigmail-2.0.8/lang/sl/enigmail.dtd000066400000000000000000001641471334302754500171520ustar00rootroot00000000000000 ' pri navajanju e-naslovov"> ' za doloÄanje e-naslovov za GnuPG. IzkljuÄite, Äe imajo prejemniki stare kljuÄe Hushmail."> Varnost OpenPGP)"> POZOR: Ustvarjanje kljuÄa lahko traja veÄ minut. V tem Äasu ne zaprite brskalnika. Ker je generator nakljunÄnih Å¡tevil odvisen od dejavnosti raÄunalnika, je priporoÄljivo npr. aktivno brskati, da bi pospeÅ¡ili ustvarjanje kljuÄa. Ko bo kljuÄ ustvarjen, boste o tem takoj obveÅ¡Äeni."> ' je neveljavno"> OPOMBA: Tvorba kljuÄa lahko traja nekaj minut. Ne zaprite aplikacije, medtem ko je tvorba kljuÄa v teku. Ko bo kljuÄ izdelan, boste o tem obveÅ¡Äeni."> Opomba: Enigmail bo vedno preverjal podpise e-sporoÄil za vsak raÄun ali identiteto, ne glede na to, ali je omogoÄeno ali ne"> javni kljuÄ je za druge, da vam poÅ¡ljejo Å¡ifrirana gesla. Razdelite ga lahko komerkoli."> zasebni kljuÄ je za vas, da deÅ¡ifrirate to e-poÅ¡to in poÅ¡ljete podpisano e-poÅ¡to. Nikomur ga ne smete dati."> zasebni kljuÄ je za vas, da deÅ¡ifrirate to e-poÅ¡to in poÅ¡ljete podpisano e-poÅ¡to. Nikomur ga ne smete dati. Da zavarujete svoj javni kljuÄ, boste pozvani za geslo v naslednjih dveh pogovornih oknih."> Geslo zaÅ¡Äiti vaÅ¡ zasebni kljuÄ in prepreÄi njegovo zlorabo."> izvozite podatke s starega raÄunalnika s Äarovnikom za varnostno kopiranje iz nastavitev Enigmail uvozite podatke v nov raÄunalnik s tem Äarovnikom. "> Hvala, ker uporabljate Enigmail."> izvozite podatke s starega raÄunalnika s tem Äarovnikom uvozite podatke v nov raÄunalnik s Äarovnikom za namestitev. "> enigmail-2.0.8/lang/sl/enigmail.properties000066400000000000000000001517211334302754500205650ustar00rootroot00000000000000Enigmail=Enigmail ##################################################################### # Strings used within enigmailCommon.js and enigmailCommon.jsm ##################################################################### enigAlert=Enigmail – opozorilo enigConfirm=Enigmail – potrditev # enigInfo=Enigmail Information enigError=Enigmail – napaka enigPrompt=Enigmail – prompt dlgYes=&Da dlgNo=&Ne dlgKeepSetting=Zapomni si odgovor in ne spraÅ¡uj veÄ dlgNoPrompt=Tega pogovornega okna ne pokaži nikoli veÄ dlg.button.delete=I&zbriÅ¡i dlg.button.cancel=Pre&kliÄi dlg.button.close=&Zapri dlg.button.continue=&Nadaljuj dlg.button.skip=Pres&koÄi dlg.button.overwrite=&PrepiÅ¡i dlg.button.view=&Pokaži dlg.button.retry=Poskusi &znova dlg.button.ignore=&Prezri # dlg.button.install=&Install # dlg.button.ok=&OK repeatPrefix=\n\nTo sporoÄilo se bo ponovilo %S repeatSuffixSingular=-krat. repeatSuffixPlural=-krat. noRepeat=\n\nTo sporoÄilo se ne bo ponovilo vse do nadgradnje Enigmaila. pgpNotSupported=Kot kaže, uporabljate Enigmail skupaj s PGP 6.x.\n\nŽal povzroÄa PGP 6.x nekatere težave, ki onemogoÄajo, da bi Enigmail deloval pravilno. Zato Enigmail PGP 6.x ni veÄ podprt. V prihodnosti raje uporabite GnuPG (GPG).\n\nÄŒe za prehod na GPG potrebujete podporo, obiÅ¡Äite stran PomoÄ/Help na domaÄi strani Enigmail. initErr.howToFixIt=Za uporabo Enigmaila je zahtevan GnuPG. ÄŒe ga Å¡e niste namestili, je najlažji naÄin za namestitev uporaba spodnjega gumba "ÄŒarovnik za namestitev". initErr.setupWizard.button=&ÄŒarovnik za namestitev passphraseCleared=Geslo je bilo izbrisano. cannotClearPassphrase=Za ravnanje z gesli uporabljate neobiÄajno orodje (kot je gnome-keyring). V Enigmailu zatorej ne morete poÄistiti gesla. noPhotoAvailable=Na voljo ni nobene fotografije debugLog.title=Enigmail Debug Log error.photoPathNotReadable=Pot slike '%S' ni berljiva # generalError=Error: %S # Strings in configure.jsm enigmailCommon.versionSignificantlyChanged=Nova razliÄica Enigmaila ima pomembne spremembe ravnanja z nastavitvami in možnostmi. Stare nastavitve smo poskusili prenesti na novo razliÄico. Vendar pa ne moremo samodejno zadostiti vsem primerom. Ponovno preverite nastale nove nastavitve in možnosti. enigmailCommon.checkPreferences=Preveri nastavitve ... preferences.defaultToPgpMime=Privzeto kodiranje sporoÄil smo v Enigmailu spremenili iz vdelanega PGP-ja v PGP/MIME. PriporoÄamo, da ga ohranite kot privzetega.\n\nÄŒe Å¡e vedno želite privzeto uporabljati vdelan PGP, to lahko storite v nastavitvah raÄuna pod Varnost OpenPGP. ##################################################################### # Strings in enigmailAbout.js ##################################################################### usingVersion=Uporabljate Enigmail razliÄice %S # enigmailPepVersion=Enigmail/p≡p version %S usingAgent=Za Å¡ifriranje in deÅ¡ifriranje uporabi %S izvrÅ¡ilno datoteko %S agentError=NAPAKA: Dostop do storitve Enigmail ni uspel! ##################################################################### # Strings in enigmailKeygen.js ##################################################################### accessError=Napaka pri dostopu do storitve Enigmail onlyGPG=Ustvarjanje kljuÄa deluje le z GnuPG (ne pa tudi z PGP)! keygenComplete=Ustvarjanje kljuÄa je konÄano! Za podpisovanje bo uporabljena identiteta <%S> revokeCertRecommended=Nadvse priporoÄamo, da za svoj kljuÄ ustvarite certifikat za preklic. Ta certifikat lahko uporabite za preklic svojega kljuÄa, npr. Äe vaÅ¡ skrivni kljuÄ izgubite ali je v nevarnosti. Želite zdaj ustvariti tak certifikat za preklic? keyMan.button.generateCert=&Ustvari certifikat genCompleteNoSign=Ustvarjanje kljuÄa je konÄano! genGoing=Ustvarjanje kljuÄa je v teku! passNoMatch=Geslo ni ustrezno; prosimo, ponovite vnos. passCheckBox=ÄŒe ne uporabljate gesla za kljuÄ, potem prosim oznaÄite ustrezno možnost. passUserName=Prosimo, podajte imena uporabnikov za to identiteto. keygen.missingUserName=Za izbrani raÄun/identiteto ni navedenega imena. V polje "vaÅ¡e ime" v nastavitvah raÄuna vnesite vrednost. keygen.passCharProblem=V svojem geslu uporabljate posebne znake. Na žalost lahko to povzroÄi težave pri ostalih programih. PriporoÄamo, da izberete geslo s samo naslednjimi znaki:\n a-z A-Z 0-9 /.;:-,!?(){}[]%* passSpaceProblem=VaÅ¡e geslo se iz tehniÄnih razlogov ne sme zaÄeti ali konÄati s presledkom. changePassFailed=Sprememba gesla ni uspela. keyConfirm=Ustvari javni in skriti kljuÄ za '%S'? keyMan.button.generateKey=&Ustvari kljuÄ keyAbort=Prekinem ustvarjanje kljuÄa? keyMan.button.generateKeyAbort=&Ustavi tvorbo kljuÄa keyMan.button.generateKeyContinue=&Nadaljuj s tvorbo kljuÄa expiryTooLong=Ne morete ustvariti kljuÄa, ki postane neveljaven kasneje kot v 100 letih. expiryTooLongShorter=KljuÄa, ki poteÄe Äez veÄ kot 90 let, ne morete ustvariti. expiryTooShort=VaÅ¡ kljuÄ mora biti veljaven najmanj en dan. keyGenFailed=Ustvarjanje kljuÄa ni uspelo. Prosimo, za podrobnosti preverite konzolo Enigmail (Meni Enigmail > RazhroÅ¡Äevanje Enigmail). setKeyExpirationDateFailed=Datuma prenehanja veljavnosti ni mogoÄe spremeniti # Strings in enigmailMessengerOverlay.js securityInfo=Varnostne informacije Enigmail\n\n enigHeader=Enigmail: enigContentNote=Enigmail: *Priloge temu sporoÄilu niso podpisane ali Å¡ifrirane*\n\n possiblyPgpMime=Najverjetneje Å¡ifrirano ali podpisano sporoÄilo PGP/MIME; za preverjanje kliknite gumb DeÅ¡ifriraj saveAttachmentHeader=Enigmail: Shrani deÅ¡ifrirano priponko noTempDir=Ni mogoÄe najti nobene zaÄasne mape za pisanje.\nProsimo, doloÄite sistemsko spremenljivko TEMP. attachmentPgpKey=Priloga '%S', ki jo odpirate, je najverjetneje kljuÄ OpenPGP.\n\nKliknite 'Uvozi' za uvoz vsebovanega kljuÄa ali 'Pokaži', Äe si želite vsebino datoteke ogledati v oknu brskalnika. beginPgpPart=********* *ZACETEK SIFRIRANEGA ali PODPISANEGA DELA* ********* endPgpPart=********** *KONEC SIFRIRANEGA ali PODPISANEGA DELA* ********** notePartEncrypted=Enigmail: *Deli sporocila NISO bili podpisani ali sifrirani* noteCutMessage=Enigmail: *Najdenih je veÄ blokov sporoÄila -- deÅ¡ifriranje/preverjanje prekinjeno* decryptOkNoSig=Pozor\n\nDeÅ¡ifriranje je bilo uspeÅ¡no, a podpisa ni mogoÄe preveriti. msgOvl.button.contAnyway=&Vseeno nadaljuj signature.verifiedOK=Podpis za priponko %S je bil uspeÅ¡no preverjen. signature.verifyFailed=Podpisa za priponko %S ni bilo mogoÄe preveriti. attachment.noMatchToSignature=Priponka '%S' se ne ujema z datoteko podpisa attachment.noMatchFromSignature=Datoteka podpisa '%S' se ne ujema s priponko fixBrokenExchangeMsg.failed=SporoÄila ni uspelo popraviti. # enigmail.msgViewColumn.label=Enigmail # enigmailPep.msgViewColumn.label=Enigmail/p≡p # wksNoIdentity=This key is not linked to any of your email accounts. Please add an account for at least one of the following email addresse(s):\n\n%S # wksConfirmSuccess=Confirmation email sent. # wksConfirmFailure=Sending the confirmation email failed. # autocrypt.importSetupKey.accountPreconfigured=Your account is already correctly configured for Autocrypt.\n\nDo you really want to overwrite your settings with this setup message? # autocrypt.importSetupKey.selfCreated=This message was created by your currently running instance of Enigmail.\n\nPlease switch to the email client to which you want to transfer the settings, and click on the message on that email client to import the settings. # autocrypt.importSetupKey.invalidMessage=Error - could not read setup message. The message seems to be corrupted. Please try to create a new setup message on your "other" device. # autocrypt.importSetupKey.invalidKey=Error - the key could not be imported. The key is either not supported by your version of GnuPG, or it got corrupted. # autocrypt.importSetupKey.wrongPasswd=The password you entered is wrong. Do you want to retry? # autocrypt.importSetupKey.success=The Autocrypt setup message was processed successfully. Autocrypt is now available for your account '%S'. ##################################################################### # Strings in enigmailMsgComposeOverlay.js ##################################################################### keysToExport=Izberi kljuÄe OpenPGP za vstavljanje keysToUse=Izberi kljuÄe OpenPGP za uporabnika %S pubKey=Javni kljuÄ za %S\n windowLocked=Urejevalno okno je zaklenjeno; poÅ¡iljanje je bilo prekinjeno sendUnencrypted=Inicializacija Enigmaila ni uspela.\nPoÅ¡ljem sporoÄilo neÅ¡ifrirano? composeSpecifyEmail=Vnesite prosim glavni e-poÅ¡tni naslov, ki je potreben za izbor podpisnega kljuÄa za odhodna sporoÄila.\nÄŒe ne podate nobenega naslova, bo e-poÅ¡tni naslov v polju OD sporoÄila prepuÅ¡Äen izbiri kljuÄa. sendingHiddenRcpt=To sporoÄilo ima prejemnike v polju BCC (skrita kopija). ÄŒe to sporoÄilo Å¡ifrirate, je mogoÄe skriti prejemnike skrite kopije, vendar uporabniki nekaterih izdelkov (npr. PGP Corp.) ne bodo mogli deÅ¡ifrirati sporoÄila. Zaradi tega priporoÄamo, da se izogibate polju skrite kopije (BCC) v Å¡ifriranih sporoÄilih. sendWithHiddenBcc=Skrij prejemnike skrite kopije sendWithShownBcc=Å ifriraj obiÄajno sendingNews=PoÅ¡iljanje Å¡ifriranega sporoÄila je bilo prekinjeno.\n\nTega sporoÄila ne morete poslati Å¡ifriranega, ker so med prejemniki naslovi noviÄarskih skupin. To sporoÄilo poÅ¡ljite neÅ¡ifrirano. sendToNewsWarning=Opozorilo: poslali boste Å¡ifrirano sporoÄilo na dopisni seznam.\n\nTega ne priporoÄamo, ker je to smiselno le, Äe lahko vsi Älani skupine deÅ¡ifrirajo sporoÄilo, t.j. sporoÄilo je potrebno deÅ¡ifrirati s kljuÄi vseh Älanov seznama. To sporoÄilo poÅ¡ljite le, Äe dobro veste, kaj poÄnete.\n\nŽelite nadaljevati? hasHTML=Opozorilo za sporoÄila HTML: \nTo sporoÄilo lahko vsebuje HTML. To lahko onemogoÄi pravilno podpisovanje oz. Å¡ifriranje tega sporoÄila. Da bi to v prihodnje prepreÄili pri poÅ¡iljanju podpisanih sporoÄil, kliknite prosim dvigalko hkrati z gumbom Sestavi oz. Odgovori. Ko sporoÄilo podpiÅ¡ete, odstranite potrditev pri nastavitvah 'Ustvari sporoÄilo kot HTML' s Äimer poÅ¡iljanje sporoÄil HTML trajno prepreÄite. strippingHTML=SporoÄilo vsebuje kodo HTML, ki bo izgubljena, Äe bo sporoÄilo za podpisovanje oz. Å¡ifriranje pretvorjeno v zgolj tekstovni zapis. Želite nadaljevati? msgCompose.button.sendAnyway=&Vseeno poÅ¡lji sporoÄilo attachWarning=Priponke tega sporoÄila niso lokalne, zato jih ni mogoÄe Å¡ifrirati. Za Å¡ifriranje priponk jih najprej shranite lokalno in jih nato dodajte sporoÄilu. Želite kljub temu poslati sporoÄilo? quotedPrintableWarn=Za kodiranje sporoÄil ste nastavili 'quoted-printable'. To lahko pripelje do nepravilnega Å¡ifriranja in/ali preverjanja vaÅ¡ih sporoÄil.\nŽelite izklopiti nastavitev 'quoted printable'? minimalLineWrapping=Prelom besedila ste nastavili na %S znakov. Za pravilno Å¡ifriranje in podpisovanje mora biti ta vrednost najmanj 68.\nŽelite zdaj vrednost nastaviti na 68? warning=Opozorilo signIconClicked=Spremenili ste nastavitve za podpisovanje. Zato za to sporoÄilo niÄ veÄ ne velja (de-)aktivacija podpisovanja skupaj z (de-)aktivacijo Å¡ifriranja. errorOwnKeyUnusable=ID kljuÄa '%S', ki je nastavljen za trenutno identiteto, ne dobavi uporabnega kljuÄa OpenPGP.\n\nZagotovite, da imate veljaven kljuÄ OpenPGP in da vaÅ¡e nastavitve raÄuna nanj kažejo.\nÄŒe vaÅ¡ kljuÄ ni potekel, preverite, ali ste zaupanje lastniku nastavili na polno ali skrajno. msgCompose.cannotSaveDraft=Napaka med shranjevanjem osnutka # msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information - partially encrypted email. # msgCompose.partiallyEncrypted.mimeMsg=The message you are replying to contained both unencrypted and encrypted parts. Some encrypted message parts are invisible to you.\n\nIf the sender was not able to decrypt the hidden message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nWe recommend that you don't reply to the message, but create a new message containing your answer. # msgCompose.partiallyEncrypted.inlinePGP=The message you are replying to contained both unencrypted and encrypted parts. If the sender was not able to decrypt some message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nPlease consider removing all quoted text from your reply to this sender. msgCompose.internalEncryptionError=Notranja napaka: obljubljeno Å¡ifriranje onemogoÄeno msgCompose.internalError=Pojavila se je zaÄetna napaka. msgCompose.toolbarTxt.signAndEncrypt=To sporoÄilo po podpisano in Å¡ifrirano msgCompose.toolbarTxt.signOnly=To sporoÄilo bo podpisano msgCompose.toolbarTxt.encryptOnly=To sporoÄilo bo Å¡ifrirano msgCompose.toolbarTxt.noEncryption=To sporoÄilo bo nepodpisano in neÅ¡ifrirano msgCompose.toolbarTxt.disabled=Za izbrano identiteto je Enigmail onemogoÄen # msgCompose.protectSubject.tooltip=Protect the message subject # msgCompose.noSubjectProtection.tooltip=Do not protect the message subject msgCompose.encryptedSubjectStub=Å ifrirano sporoÄilo # msgCompose.protectSubject.dialogTitle=Enable Protection of Subject? # msgCompose.protectSubject.question=Regular encrypted emails contain the unredacted subject.\n\nWe have established a standard to hide the original subject in the encrypted message\nand replace it with a dummy text, such that the subject is only visible after the email is decrypted.\n\nDo you want to protect the subject in encrypted messages? # msgCompose.protectSubject.yesButton=&Protect subject # msgCompose.protectSubject.noButton=&Leave subject unprotected msgCompose.detailsButton.label=Podrobnosti … msgCompose.detailsButton.accessKey=P # msgCompose.pepSendUnknown=Unknown # msgCompose.pepSendUnsecure=Unsecure # msgCompose.pepSendSecure=Secure # msgCompose.pepSendTrusted=Secure & Trusted # pep.alert.disabledForIdentity=p≡p is disabled for the current identity. Please enable p≡p via the Enigmail/p≡p preferences. # pep.alert.weakReply=You’re about to forward or reply to a secure message as insecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? # note: should end with double newline: sendAborted=PoÅ¡iljanje je bilo prekinjeno.\n\n # details: keyNotTrusted=Premalo zaupanja za kljuÄ '%S' keyNotFound=KljuÄa '%S' ni mogoÄe najti keyRevoked=KljuÄ '%S' je preklican keyExpired=KljuÄ '%S' je potekel statPGPMIME=PGP/MIME # statSMIME=S/MIME statSigned=PODPISANO statEncrypted=Å IFRIRANO statPlain=NEPODPISANO in NEÅ IFRIRANO offlineSave=Želite shraniti sporoÄilo %S, namenjeno %S, v mapo 'Neodposlana sporoÄila'? onlineSend=Želite poslati sporoÄilo %S prejemniku %S? encryptKeysNote=Napotek\\: SporoÄilo je Å¡ifrirano z naslednjimi kljuÄi identitete uporabnikov\\: %S hiddenKey= signFailed=Napaka v programu Enigmail; Å¡ifriranje oz. podpisovanje ni uspelo. Želite poslati sporoÄilo nezavarovano? msgCompose.button.sendUnencrypted=&PoÅ¡lji neÅ¡ifrirano sporoÄilo recipientsSelectionHdr=Izberite prejemnika Å¡ifriranja configureNow=Varnosti Enigmail za izbrano identiteto Å¡e niste nastavili. Želite to zdaj storiti? # encryption/signing status and associated reasons: encryptMessageAuto=Å ifriraj sporoÄilo (samodejno) encryptMessageNorm=Å ifriraj sporoÄilo signMessageAuto=PodpiÅ¡i sporoÄilo (samodejno) signMessageNorm=PodpiÅ¡i sporoÄilo encryptOff=Å ifriranje: IZKLJUÄŒENO encryptOnWithReason=Å ifriranje: VKLJUÄŒENO (%S) encryptOffWithReason=Å ifriranje: IZKLJUÄŒENO (%S) encryptOn=Å ifriranje: VKLJUÄŒENO signOn=Podpisovanje: VKLJUÄŒENO signOff=Podpisovanje: IZKLJUÄŒENO signOnWithReason=Podpisovanje: VKLJUÄŒENO (%S) signOffWithReason=Podpisovanje: IZKLJUÄŒENO (%S) reasonEnabledByDefault=privzeto omogoÄeno reasonManuallyForced=roÄno vsiljeno reasonByRecipientRules=vsiljeno s pravili prejemnika reasonByAutoEncryption=vsiljeno s samo-Å¡ifriranjem reasonByConflict=zaradi spora v pravilih prejemnika reasonByEncryptionMode=zaradi naÄina Å¡ifriranja # should not be used anymore: encryptYes=SporoÄilo bo Å¡ifrirano encryptNo=SporoÄilo ne bo Å¡ifrirano # should not be used anymore: signYes=SporoÄilo bo podpisano signNo=SporoÄilo ne bo podpisano # PGP/MIME status: pgpmimeNormal=Protokol: PGP/MIME inlinePGPNormal=Protokol: vdelan PGP # smimeNormal=Protocol: S/MIME pgpmimeAuto=Protokol: PGP/MIME (samodejno) inlinePGPAuto=Protokol: vdelan PGP (samodejno) # smimeAuto=Protocol: S/MIME (auto) # should not be used anymore pgpmimeYes=Uporabljen bo PGP/MIME pgpmimeNo=Uporabljen bo vrinjen PGP # Attach own key status (tooltip strings): attachOwnKeyNo=VaÅ¡ lasten kljuÄ ne bo pripet attachOwnKeyYes=VaÅ¡ lasten kljuÄ bo pripet attachOwnKeyDisabled=VaÅ¡ega lastnega kljuÄa ni mogoÄe pripeti. Izbrati morate doloÄen kljuÄ\nv odseku OpenPGP v nastavitvah raÄuna, da omogoÄite to znaÄilnost. rulesConflict=Najdena so nasprotujoÄa si pravila za prejemnika\n%S\n\nŽelite poslati sporoÄilo s temi nastavitvami? msgCompose.button.configure=Pri&lagodi msgCompose.button.send=&PoÅ¡lji sporoÄilo msgCompose.button.save=&Shrani sporoÄilo # Strings in enigmailMsgHdrViewOverlay.js keyNeeded=Za preverjanje podpisa potrebujete javni kljuÄ %S keyUsed=Javni kljuÄ %S, ki se uporablja za preverjanje podpisa clickDecrypt=; kliknite na gumb DeÅ¡ifriraj clickDecryptRetry=; za ponoven poskus kliknite na ikono Å¡ifriranja clickDetailsButton=; za veÄ informacij kliknite na gumb 'Podrobnosti' clickImportButton=; za prenos kljuÄa kliknite na gumb 'Uvozi kljuÄ' keyTypeUnsupported=; vaÅ¡a razliÄica GnuPG ne podpira te vrste kljuÄa msgPart=Del sporoÄila %S msgSigned=podpisan msgSignedUnkownKey=podpisano z neznanim kljuÄem msgEncrypted=Å¡ifriran msgSignedAndEnc=podpisan in Å¡ifriran unverifiedSig=Podpis ni preverjen incompleteDecrypt=DeÅ¡ifriranje je bilo nepopolno needKey=Napaka - Za deÅ¡ifriranje je potreben skrivni kljuÄ failedDecrypt=Napaka - DeÅ¡ifriranje ni uspelo badPhrase=Napaka - NapaÄno geslo failedDecryptVerify=Napaka - DeÅ¡ifriranje/preverjanje ni uspelo viewInfo=; Za podrobnosti izberite Pogled > Informacije o varnosti sporoÄila decryptedMsg=DeÅ¡ifrirano sporoÄilo decryptedMsgWithFormatError=DeÅ¡ifrirano sporoÄilo (obnovljena pokvarjena oblika e-poÅ¡te PGP, ki jo je povzroÄil star strežnik Exchange, tako da rezultat verjetno ne bo popoln za branje) usedAlgorithms=Uporabljeni algoritmi: %S in %S # pepStatusInfo.text=p≡p Message Status. # pepStatusInfo.title.m3=Under Attack # pepStatusInfo.info.m3=This message is not secure and has been tampered with. # pepStatusInfo.title.m1=Mistrusted # pepStatusInfo.info.m1=This message has a communication partner that has previously been marked as mistrusted # pepStatusInfo.title.r0=Unknown # pepStatusInfo.info.r0=This message does not contain enough information to determine if it is secure. # pepStatusInfo.title.r1=Cannot Decrypt # pepStatusInfo.info.r1=This message cannot be decrypted because the key is not available. # pepStatusInfo.title.r2=Cannot Decrypt # pepStatusInfo.info.r2=This message cannot be decrypted because the key is not available. # pepStatusInfo.title.r3=Unsecure # pepStatusInfo.info.r3=This message is unsecure. # pepStatusInfo.title.r4=Unsecure for Some # pepStatusInfo.info.r4=This message is unsecure for some communication partners. # pepStatusInfo.title.r5=Unreliable Security # pepStatusInfo.info.r5=This message has unreliable protection. # pepStatusInfo.title.r6=Secure... # pepStatusInfo.info.r6=This message is secure but you still need to verify the identity of your communication partner. # pepStatusInfo.title.r7=Secure & Trusted # pepStatusInfo.info.r7=This message is secure and trusted. # pepStatusInfo.color.green=Green # pepStatusInfo.color.yellow=Yellow # pepStatusInfo.color.red=Red # pepRevokeTrust.question=Do you really want to cancel the trust for %S? # pepRevokeMistrust.question=Do you really want to re-trust the key for %S? # pepRevokeTrust.doRevoke=Cancel &trust # wksConfirmationReq=Web Key Directory Confirmation Request # wksConfirmationReq.message=This message has been sent by your email provider to confirm deployment of your OpenPGP public key\nin their Web Key Directory.\nProviding your public key helps others to discover your key and thus being able to encrypt messages to you.\n\nIf you want to deploy your key in the Web Key Directory now, please click on the button "Confirm Request" in the status bar.\nOtherwise, simply ignore this message. # wksConfirmationReq.button.label=Confirm Request # autocryptSetupReq=Perform Autocrypt Setup # autocryptSetupReq.button.label=Start Setup # autocryptSetupReq.setupMsg.desc=This message contains all information to transfer your Autocrypt settings along with your secret key securely from your original device. # autocryptSetupReq.setupMsg.backup=You can keep this message and use it as a backup for your secret key. If you want to do this, you should write down the password and store it securely. # autocryptSetupReq.message.import=To import the settings and key(s) in Enigmail, please click on the "Start Setup" button in the status bar. # autocryptSetupReq.message.sent=Please click on the message on your new device and follow the instuctions to import the settings. # strings in pref-enigmail.js # oldGpgVersion20=Enigmail initialization failed.\n\nYou are using GnuPG version %1$S, which is not supported anymore. Enigmail requires GnuPG version %2$S or newer. Please upgrade your GnuPG installation, or Enigmail will not work. locateGpg=Najdi program GPG invalidGpgPath=GnuPG ni mogoÄe izvrÅ¡iti s podano potjo. OpenGPG je zatorej deaktiviran, dokler znova ne spremenite poti do GnuPG ali ponovno ne zaženete aplikacije. warningsAreReset=Vsa opozorila so bila ponastavljena. prefs.gpgFound=GnuPG se nahaja v %S prefs.gpgNotFound=Ni mogoÄe najti programa GnuPG prefs.warnAskNever=Opozorilo: z aktivacijo te možnosti boste povzroÄili neÅ¡ifrirana e-sporoÄila brez dodatnih opozoril, Äe kljuÄ za enega od prejemnikov ne obstaja -- Enigmail vas o tem ne bo opozarjal! prefs.warnIdleTimeForUnknownAgent=VaÅ¡ sistem uporablja specializirano orodje za ravnanje z gesli, kot sta gnome-keyring ali seahorse-agent. Žal OpenGPG ne more nadzorovati Äasovne prekoraÄitve gesla za orodje, ki ga uporabljate. Zato se ustrezne nastavitve Äasovne prekoraÄitve v Enigmail ne upoÅ¡tevajo. prefEnigmail.oneKeyserverOnly=Napaka - navedete lahko le en strežnik kljuÄev za samodejno prenaÅ¡anje manjkajoÄih kljuÄev OpenPGP. # Strings used in core.jsm # (said file also re-uses some strings from above) enterAdminPin=Prosimo, vtipkajte ADMIN PIN svoje pametne kartice enterCardPin=Prosimo, vtipkajte PIN svoje pametne kartice notInit=Napaka - Storitev Enigmail Å¡e ni nastavljena badCommand=Napaka - Å ifriranje ni uspelo cmdLine=ukazna vrstica in izpis\\: notRequired=Napaka - Å ifriranje ni potrebno notComplete=Napaka - Ustvarjanje kljuÄa Å¡e ni dokonÄano invalidEmail=Napaka - Neveljaven(i) e-poÅ¡tni naslov(i) noPassphrase=Napaka – Niste vnesli gesla noPGPblock=Napaka – Ni nobenega veljavnega bloka OpenPGP unverifiedReply=Del sporoÄila (odgovor) je bil morda spremenjen keyInMessageBody=Najdena kljuÄ in telo sporoÄila. Kliknite 'Uvozi kljuÄ', da ga uvozite sigMismatch=Napaka – Podpis ni pravilen cantImport=Napaka pri uvozu javnega kljuÄa\n\n doImportOne=Uvozi %1$S (%2$S)? doImportMultiple=Uvozi naslednje kljuÄe?\n\n%S previewFailed=Javnega kljuÄa ni mogoÄe brati. # Strings used in errorHandling.jsm sc.wrongCardAvailable=Pametne kartice %S, ki je v bralniku, ni mogoÄe uporabiti za obdelavo sporoÄila.\nProsimo, vstavite pametno kartico %S in ponovite postopek. sc.insertCard=Postopek zahteva vaÅ¡o pametno kartico %S.\nProsimo, vstavite zahtevano pametno kartico in ponovite postopek. sc.removeCard=Postopek ne potrebuje prisotnosti pametne kartice v bralniku.\nProsimo, odstranite svojo pametno kartico in ponovite postopek. sc.noCardAvailable=V vaÅ¡em bralniku ni nobene pametne kartice.\nProsimo, vstavite svojo pametno kartico in ponovite postopek. sc.noReaderAvailable=VaÅ¡ bralnik pametnih kartic ni dosegljiv.\nProsimo, povežite svoj bralnik pametnih kartic, vstavite kartico in ponovite postopek. keyError.keySpecNotFound=E-poÅ¡tnega naslova "%S" ni mogoÄe ujemati s kljuÄem na vaÅ¡i verigi. keyError.keyIdNotFound=Nastavljenega ID kljuÄa "%S" ni mogoÄe najti na vaÅ¡i verigi. keyError.resolutionAction=Izberte veljaven kljuÄ v odseku OpenPGP v nastavitvah raÄuna. missingPassphrase=Manjka geslo errorHandling.gpgAgentInvalid=VaÅ¡ sistem izvaja razliÄico gpg-agenta, ki ni primerna za vaÅ¡o razliÄico GnuPG-ja. errorHandling.gpgAgentError=GnuPG je sporoÄil napako v komunikaciji z gpg-agentom (sestavni del GnuPG-ja). errorHandling.dirmngrError=GnuPG je sporoÄil napako v komunikaciji z dirmngr-jem (sestavni del GnuPG-ja). errorHandling.pinentryError=GnuPG ne more poizvedeti za vaÅ¡e geslo preko vnosa PIN-a. errorHandling.readFaq=To je napaka namestitve ali nastavitve sistema, ki prepreÄuje pravilno delovanje Enigmaila in se je ne da samodejno popraviti.\n\nZelo priporoÄamo, da se posvetujete z naÅ¡o spletno stranjo za podporo na https://enigmail.net/faq. gpgNotFound=Ni mogoÄe najti programa GnuPG '%S'.\nPreverite, da je pot do programa GnuPG v nastavitvah Enigmail podana pravilno. gpgNotInPath=Na podani poti PATH ni mogoÄe najti programa GnuPG.\nPreverite, da je pot do programa GnuPG v nastavitvah Enigmail podana pravilno. enigmailNotAvailable=Glavna storitev Enigmaila ni na voljo prefGood=Pravilen podpis %S prefBad=NAPAÄŒEN podpis %S failCancel=Napaka - Uporabnik je prekinil sprejem kljuÄa failNoServer=Napaka - Strežnik kljuÄev ni podan failNoID=Napaka - Ni bila podana identiteta kljuÄa failKeyExtract=Napaka - Ekstrakcija kljuÄa ni uspela notFirstBlock=Napaka - Prvi blok OpenPGP ni javni blok kljuÄa importKeyConfirm=Želite uvoziti v sporoÄilu vsebovani javni kljuÄ? failKeyImport=Napaka - KljuÄa ni mogoÄe uvoziti fileWriteFailed=Pisanje v datoteko %S ni mogoÄe importKey=Uvažam javni kljuÄ %S s strežnika kljuÄev\\: uploadKey=PoÅ¡lji javni kljuÄ %S na strežnik kljuÄev: keyId=ID kljuÄa keyAndSigDate=ID kljuÄa: 0x%S / Podpisano: %S keyFpr=Prstni odtis kljuÄa: %S noEmailProvided=Niste vnesli e-poÅ¡tnega naslova! keyAlreadySigned=KljuÄ je že podpisan, ne morete ga podpisati dvakrat. ##################################################################### # Strings used in enigmailKeySelection.js ##################################################################### selKeyExpired=veljavnost %S je potekla createdHeader=Ustvarjen atLeastOneKey=Niste izbrali nobenega kljuÄa\\! Izbrati morate vsaj en kljuÄ. fewerKeysThanRecipients=Izbrali ste manjÅ¡e Å¡tevilo kljuÄev, kot je prejemnikov. Ste prepriÄani, da je seznam kljuÄev za Å¡ifriranje popoln? userSel.button.goBack=Izberite veÄ kljuÄev userSel.secretKeySel.title=Izberite skrivni kljuÄ OpenPGP, s katerim boste podpisovali svoja sporoÄila userSel.problemNoKey=Ni veljavnega kljuÄa. userSel.problemMultipleKeys=VeÄ kljuÄev # should be same as thunderbird ENTITY sendLaterCmd.label: sendLaterCmd.label=PoÅ¡lji kasneje # Strings used in enigmailAttachmentDialog.js # pgpMimeNote=NOTE: PGP/MIME is not supported by all email clients. If you are unsure, select the %S option. first=prvi second=drugi # Strings used in am-enigprefs.js / enigmailEditIdentity.js encryptKeyHeader=Izberite kljuÄ OpenPGP za Å¡ifriranje identityName=Identiteta: %S # switchPepMode=You are currently using the 'p≡p Junior' mode of Enigmail.\n\nBy enabling OpenPGP or S/MIME for an account, you are disabling p≡p and use the 'regular' mode of Enigmail without p≡p. # enableEnigmail=&Disable p≡p # Strings used in enigmailSingleRcptSettings.js noEncryption=Vklopili ste Å¡ifriranje, niste pa izbrali nobenega kljuÄa. Da bi poÅ¡iljali %S Å¡ifrirana sporoÄila, morate izbrati enega ali veÄ veljavnih kljuÄev. Želite izklopiti Å¡ifriranje? noKeyToUse=(brez - ne zaklepaj) noEmptyRule=Pravila ne smejo biti prazna. Prosimo, vnesite vsaj en e-poÅ¡tni naslov. invalidAddress=Vneseni e-poÅ¡tni naslovi niso veljavni. Ne smete vnesti imen prejemnikov, temveÄ zgolj e-poÅ¡tne naslove. Primer:\nNeveljavno: Janez Kranjski \nPravilno: janez.kranjski@domena.si # noCurlyBrackets=The curly brackets {} have a special meaning and should not be used in an email address. If you want to modify the matching behavior for this rule, use the 'Apply rule if recipient ...' option.\nMore information is available from the Help button. # Strings used in enigmailRulesEditor.js never=nikoli always=vedno possible=ko je mogoÄe deleteRule=Želite izbrisati izbrana pravila? nextRcpt=(naslednji prejemnik) negateRule=ne addKeyToRule=Dodaj kljuÄ %1$S (%2$S) pravilu za uporabnika # Strings used in enigmailSearchKey.js needOnline=Funkcija, ki ste jo izbrali, ni na voljo v naÄinu brez povezave. Prosimo, povežite se in poskusite znova. protocolNotSupported=Protokol '%S://', ki ste ga izbrali, ni podprt za prenos kljuÄev OpenPGP. gpgkeysDisabled=Pomagalo bo, Äe omogoÄite izbiro 'extensions.enigmail.useGpgKeysTool'. noKeyserverConn=Ni se mogoÄe povezati s strežnikom kljuÄev na naslovu %S. keyDownloadFailed=Prenos kljuÄa s strežnika kljuÄev ni uspel. SporoÄilo o stanju se glasi:\n%S internalError=PriÅ¡lo je do notranje napake. KljuÄev ni bilo mogoÄe prenesti ali uvoziti. noKeyFound=Oprostite, a ni mogoÄe najti nobenega kljuÄa, ki bi ustrezal navedenemu e-poÅ¡tnemu naslovu. # keyDownload.keyUnavailable=We are sorry, but the key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their key by email. # gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. gpgKeysFailed=Iskanje ali prenos kljuÄa s strežnika kljuÄev: gpgkeys_%S ni bilo mogoÄe izvesti. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Nastavljanje zaupanja kljuÄa ni uspelo # Strings in enigmailSignKeyDlg.js signKeyFailed=Podpisovanje kljuÄa ni uspelo alreadySigned.label=Opomnik: kljuÄ %S je že podpisan z izbranim skrivnim kljuÄem. alreadySignedexportable.label=Opomba: kljuÄ %S je že podpisan za izvažanje z izbranim zasebnim kljuÄem. Lokalni podpis ni smiseln. partlySigned.label=Opomba: nekateri uporabniÅ¡ki ID-ji kljuÄa %S so že podpisani z izbranim skrivnim kljuÄem. noTrustedOwnKeys=Primernega kljuÄa za podpisovanje ni bilo najdenega! Potrebujete vsaj en popolnega zaupanja vreden kljuÄ za podpisovanje drugih kljuÄev. # Strings in enigmailKeyManager.js keyMan.loadingKeys=Poteka nalaganje kljuÄev, prosimo, poÄakajte ... keyValid.unknown=neznan keyValid.invalid=neveljaven keyValid.disabled=onemogoÄen keyValid.revoked=preklican keyValid.expired=pretekel keyValid.noSubkey=ni veljavnega podkljuÄa keyTrust.untrusted=ni vreden zaupanja keyTrust.marginal=delno zaupanje keyTrust.full=zaupanje keyTrust.ultimate=popolno zaupanje keyTrust.group=(skupina) keyType.public=jav keyType.publicAndSec=jav/skr keyMan.enableKey=OmogoÄi kljuÄ keyMan.disableKey=OnemogoÄi kljuÄ userAtt.photo=UporabniÅ¡ki atribut (slika JPEG) asciiArmorFile=Zavarovane datoteke ASCII (*.asc) importKeyFile=Uvozi datoteko kljuÄa OpenPGP gnupgFile=Datoteke GnuPG # createKeyOK=Your Key has been generated saveRevokeCertAs=Ustvari in shrani potrdilo o preklicu # revokeCertOK=The revocation certificate has been successfully created. You can use it to invalidate your public key, e.g. in case you would lose your secret key. revokeCertFailed=Potrdila o preklicu ni bilo mogoÄe ustvariti. addUidOK=UporabniÅ¡ka ID uspeÅ¡no dodana addUidFailed=Dodajanje uporabniÅ¡ke ID ni uspelo noKeySelected=Za izvedbo izbrane operacije morate izbrati vsaj en kljuÄ exportToFile=Izvozi javni kljuÄ v datoteko exportKeypairToFile=Izvozi tajni in javni kljuÄ v datoteko exportSecretKey=Želite vkljuÄiti skrivni kljuÄ v shranjeno datoteko kljuÄa OpenPGP? saveKeysOK=KljuÄi so bili uspeÅ¡no shranjeni saveKeysFailed=Shranjevanje kljuÄev ni uspelo importKeysFailed=Uvoz kljuÄev ni uspel enableKeyFailed=OmogoÄanje/onemogoÄanje kljuÄa ni uspelo specificPubKeyFilename=%1$S (0x%2$S) jav specificPubSecKeyFilename=%1$S (0x%2$S) jav-skr defaultPubKeyFilename=Izvoženi-javni-kljuÄi defaultPubSecKeyFilename=Izvoženi-javni-in-skrivni-kljuÄi noSecretKeys=Najdenih ni bilo skrivnih kljuÄev.\n\nŽelite zdaj tvoriti svoj lastni kljuÄ? sendKeysOk=KljuÄ(i) uspeÅ¡no poslani sendKeysFailed=PoÅ¡iljanje kljuÄev ni uspelo receiveKeysOk=KljuÄ(i) uspeÅ¡no posodobljeni receiveKeysFailed=Prenos kljuÄev ni uspel importFromClip=Želite uvoziti nekatere kljuÄe iz odložiÅ¡Äa? importFromUrl=Prenesi javni kljuÄ iz tega URL-ja: copyToClipbrdFailed=Kopiranje izbranega kljuÄa(-ev) v odložiÅ¡Äe ni uspelo. copyToClipbrdOK=KljuÄ(i) kopirani v odložiÅ¡Äe deleteSecretKey=OPOZORILO: Izbrisati želite skrivni kljuÄ!\nÄŒe izbriÅ¡ete svoj skrivni kljuÄ, ne boste veÄ mogli deÅ¡ifrirati sporoÄil, Å¡ifriranih za ta kljuÄ.\n\nResniÄno želite izbrisati OBA, skrivni kljuÄ in javni kljuÄ\n'%S'? deleteMix=OPOZORILO: Izbrisati želite skrivne kljuÄe!\nÄŒe izbriÅ¡ete svoj skrivni kljuÄ, ne boste veÄ mogli deÅ¡ifrirati sporoÄil, Å¡ifriranih za ta kljuÄ.\n\nResniÄno želite izbrisati OBA, skrivni kljuÄ in javni kljuÄ? deletePubKey=Želite izbrisati javni kljuÄ\n'%S'? deleteSelectedPubKey=Želite izbrisati javne kljuÄe? deleteKeyFailed=KljuÄa ni mogoÄe izbrisati. revokeKeyQuestion=Ste pred preklicem kljuÄa '%S'.\n\nS tem kljuÄem ne boste mogli veÄ podpisovati in ga porazdelitvi ne boste veÄ mogli uporabljati za Å¡ifriranje. Å e vedno ga lahko uporabljate za deÅ¡ifriranje starih sporoÄil.\n\nAli želite nadaljevati? revokeKeyOk=KljuÄ je bil preklican. ÄŒe je vaÅ¡ kljuÄ na voljo na strežniku kljuÄev, je priporoÄljivo, da ga ponovno naložite nanj, tako da drugi lahko opazijo preklic. revokeKeyFailed=KljuÄa ni mogoÄe preklicati. # revokeKeyNotPresent=You have no key (0x%S) which fits to this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before the revocation certificate! # revokeKeyAlreadyRevoked=The key 0x%S has already been revoked. refreshAllQuestion=Nobenega kljuÄa niste izbrali. Bi radi osvežili VSE kljuÄe? # refreshKeyServiceOn.warn=Warning: Your keys are currently being refreshed in the background as safely as possible.\nRefreshing all your keys at once will unnecessarily reveal information about you.\nDo you really want to do this? refreshKey.warn=Opozorilo: glede na Å¡tevilo kljuÄev in hitrost povezave je lahko osveževanje vseh kljuÄev razmeroma dolg postopek! downloadContactsKeys.warn=Opozorilo: glede na Å¡tevilo stikov in hitrost povezave je prenos vseh kljuÄev lahko zelo dolg postopek! downloadContactsKeys.importFrom=Želite uvoziti stike iz adresarja '%S'? keyMan.button.exportSecKey=&Izvozi skrivne kljuÄe keyMan.button.exportPubKey=Izvozi le &javne kljuÄe keyMan.button.import=&Uvozi keyMan.button.refreshAll=&Osveži vse kljuÄe keyMan.button.revokeKey=&PrekliÄi kljuÄ keyMan.button.skip=Pre&skoÄi kljuÄ keylist.noOtherUids=Nima drugih identitet keylist.hasOtherUids=Znan(a) tudi kot keylist.noPhotos=Fotografija ni na voljo keylist.hasPhotos=Fotografije keyMan.addphoto.filepicker.title=Izberite fotografijo za dodajanje keyMan.addphoto.warnLargeFile=Datoteka, ki ste jo izbrali, je veÄja od 25kB.\nNe priporoÄamo, da dodajate velike datoteke, ker se s tem zelo poveÄujejo kljuÄi. keyMan.addphoto.noJpegFile=Izbrana datoteka ni datoteka JPEG. Izberite drugo datoteko. keyMan.addphoto.failed=Slike ni mogoÄe dodati. # noWksIdentity=The key %S does not have a WKS identity. # keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key "%1$S (%2$S)" for encrypting messages? # keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key "%1$S (%2$S)" for future messages? # keyman.addBlacklistKey.button=&Blacklist the key # keyman.removeBlacklistKey.button=&Remove key from Blacklist # Strings in enigmailManageUidDlg.xul changePrimUidFailed=Spreminjanje primarnega uporabniÅ¡ke ID ni uspelo changePrimUidOK=Primarna uporabniÅ¡ka ID uspeÅ¡no spremenjena revokeUidFailed=Preklic uporabniÅ¡ke ID %S ni uspel revokeUidOK=UporabniÅ¡ka ID %S je bila uspeÅ¡no preklicana. ÄŒe je vaÅ¡ kljuÄ na voljo na strežniku kljuÄev, je priporoÄljivo, da ga ponovno naložite nanj, tako da drugi lahko opazijo preklic. revokeUidQuestion=ResniÄno želite preklicati uporabniÅ¡ko ID %S? # Strings in enigmailKeyImportInfo.xul importInfoTitle=USPEH! KljuÄi uvoženi importInfoBits=Biti importInfoCreated=Ustvarjeno importInfoFpr=Prstni odtis importInfoDetails=(podrobnosti) importInfoNoKeys=Noben kljuÄ se ni uvozil. # Strings in enigmailKeyDetailsDlg.xul keyTypePublic=javni kljuÄ keyTypePrimary=primarni kljuÄ keyTypeSubkey=podkljuÄ keyTypePair=par kljuÄev keyExpiryNever=nikoli keyAlgorithm_1=RSA keyAlgorithm_2=RSA keyAlgorithm_3=RSA keyAlgorithm_16=ELG keyAlgorithm_17=DSA keyAlgorithm_18=ECC keyAlgorithm_19=ECC keyAlgorithm_20=ELG keyAlgorithm_22=EDDSA keyUsageEncrypt=Å ifriraj keyUsageSign=PodpiÅ¡i keyUsageCertify=Potrdi keyUsageAuthentication=Overjanje keyDoesNotExpire=KljuÄ ne poteÄe # Strings in enigmailGenCardKey.xul keygen.started=Prosimo, poÄakajte, da se ustvari kljuÄ ... keygen.completed=KljuÄ je bil ustvarjen. ID novega kljuÄa je: 0x%S keygen.keyBackup=KljuÄ je bil varnostno kopiran kot %S keygen.passRequired=Prosimo, navedite geslo, Äe želite ustvariti varnostno kopijo svojega kljuÄa zunaj pametne kartice. # Strings in enigmailSetCardPin.xul cardPin.processFailed=Sprememba PIN ni uspela # Strings in enigRetrieveProgres.xul keyserverProgress.refreshing=Osveževanje kljuÄev je v teku, prosimo, poÄakajte ... keyserverProgress.uploading=PrenaÅ¡anje kljuÄev je v teku, prosimo, poÄakajte ... # keyserverProgress.wksUploadFailed=Could not upload your key to the Web Key Service # keyserverProgress.wksUploadCompleted=Your public key was successfully submitted to your provider. You will receive an email to confirm that you initiated the upload. keyserverTitle.refreshing=Osveževanje kljuÄev keyserverTitle.uploading=Prenos kljuÄev # Strings in enigmailSetupWizard passphrase.min8keys=Geslo mora vsebovati najmanj osem znakov! setupWizard.reallyCancel=ResniÄno želite zapreti namestitvenega Äarovnika Enigmail? setupWizard.invalidGpg=Datoteka, ki ste jo navedli, ni izvrÅ¡ljiv program GnuPG. Navedite drugo datoteko. setupWizard.specifyFile=Za nadaljevanje morate navesti vsaj datoteko javnega kljuÄa. setupWizard.installFailed=Zdi se, da namestitev ni bila uspeÅ¡na. Ponovno poskusite z namestitvijo ali namestite GnuPG roÄno in ga poiÅ¡Äite z gumbom Prebrskaj. # setupWizard.downloadForbidden=For your own security, we will not download GnuPG. Please visit https://gnupg.org/ in order to download GnuPG. # setupWizard.downloadImpossible=We cannot download GnuPG currently. Please try later or visit https://gnupg.org/ in order to download GnuPG. setupWizard.hashSumError=ÄŒarovnik integritete prenesen datoteke ni uspel preveriti. Datoteka je morda okvarjena ali Å¡kodljivo spremenjena. Želite kljub temu nadaljevati z nameÅ¡Äanjem? setupWizard.importSettingsFile=Navedite datoteko varnostne kopije za nalaganje setupWizard.invalidSettingsFile=Navedena datoteka ni pravilna datoteka varnostne kopije nastavitev Enigmaila. setupWizard.gpgConfExists=Datoteka nastavitev GnuPG že obstaja. Ali jo želite prepisati z datoteko iz stare namestiteve? # setupWizard.noGpgHomeDir=It appears that you configured %S to use for GnuPG. However, this is not a directory - you cannot use it. # setupWizard.unmachtedIds=The following identities of your old setup could not be matched:\n%S\nThe settings for these identities were skipped. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=Pri prenaÅ¡anju GnuPG je priÅ¡lo do napake. Preverite zapisnik konzole za podrobnosti. installGnuPG.installFailed=Pri nameÅ¡Äanju GnuPG je priÅ¡lo do napake. Preverite zapisnik konzole za podrobnosti. # Strings in enigmailAddUidDlg.xul addUidDlg.nameOrEmailError=Vnesti morate ime in e-poÅ¡tni naslov addUidDlg.nameMinLengthError=Ime mora obsegati najmanj pet znakov addUidDlg.invalidEmailError=Navesti morate veljaven e-poÅ¡tni naslov # Strings in enigmailCardDetails.js Carddetails.NoASCII=Pametne kartice OpenPGP v imenu podpirajo samo znake ASCII. # network error types errorType.SecurityCertificate=Varnostno potrdilo, ki ga izkazuje spletna storitev, ni veljavno. errorType.SecurityProtocol=Varnostni protokol, ki ga uporablja spletna storitev, ni znan. errorType.Network=PriÅ¡lo je do omrežne napake. # filter stuff filter.folderRequired=Izbrati morate ciljno mapo. filter.decryptMove.label=DeÅ¡ifriraj za vedno (Enigmail) filter.decryptCopy.label=Ustvari deÅ¡ifrirano kopijo (Enigmail) filter.decryptMove.warnExperimental=Opozorilo - dejanje filtra "Trajno deÅ¡ifriraj" lahko privede do uniÄenih sporoÄil.\n\nZelo priporoÄamo, da najprej poskusite s filtrom "Ustvari deÅ¡ifrirano kopijo", skrbno preskusite rezultat in zaÄnite uporabljati ta filter samo, ko ste zadovoljni z rezultatom. # filter.tempPepFilterDesc=Temporary filter to store sent message unencrypted # filter.term.pgpencrypted.label=OpenPGP Encrypted # filter.encrypt.label=Encrypt to key (Enigmail) # filter.keyRequired=You must select a recipient key. # filter.keyNotFound=Could not find an encryption key for "%S". # filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for "%S" you will no longer be able to read the emails. # strings in enigmailConvert.jsm converter.decryptBody.failed=SporoÄila z zadevo "%S" ni bilo mogoÄe Å¡ifrirati.\nAli želite ponovno poskusiti z drugim geslom ali želite sporoÄilo preskoÄiti? converter.decryptAtt.failed=Priponke "%1$S" v sporoÄilu z zadevo\n"%2$S"\nni bilo mogoÄe deÅ¡ifrirati.\nAli želite ponovno poskusiti z drugim geslom ali želite sporoÄilo preskoÄiti?\n saveLogFile.title=Shrani zapisniÅ¡ko datoteko # strings in gpg.jsm unknownSigningAlg=Neznan algoritem podpisovanja (ID: %S) unknownHashAlg=Neznano Å¡ifrirno razprÅ¡ilo (ID: %S) # strings in keyRing.jsm keyring.photo=Fotografija keyRing.pubKeyRevoked=KljuÄ %1$S (ID kljuÄa %2$S) je bil preklican. keyRing.pubKeyExpired=KljuÄ %1$S (ID kljuÄa %2$S) je potekel. keyRing.pubKeyNotForSigning=KljuÄa %1$S (ID kljuÄa %2$S) ni mogoÄe uporabiti za podpisovanje. keyRing.pubKeyNotForEncryption=KljuÄa %1$S (ID kljuÄa %2$S) ni mogoÄe uporabiti za Å¡ifriranje. keyRing.keyDisabled=KljuÄ %1$S (ID kljuÄa %2$S) je onemogoÄen; ni ga mogoÄe uporabiti. keyRing.keyNotTrusted=KljuÄ %1$S (ID kljuÄa %2$S) ni dovolj zaupanja vreden. Za podpisovanje nastavite raven zaupanja na "skrajno". keyRing.keyInvalid=KljuÄ %1$S (ID kljuÄa %2$S) je neveljaven (ni samopodpisan). keyRing.signSubKeysRevoked=Vsi podkljuÄi za podpisovanje kljuÄa %1$S (ID kljuÄa %2$S) so bili preklicani. keyRing.signSubKeysExpired=Vsi podkljuÄi za podpisovanje kljuÄa %1$S (ID kljuÄa %2$S) so potekli. keyRing.signSubKeysUnusable=Vsi podkljuÄi za podpisovanje kljuÄa %1$S (ID kljuÄa %2$S) so potekli, bili preklicani ali so drugaÄe neuporabni. keyRing.encSubKeysRevoked=Vsi podkljuÄi za Å¡ifriranje kljuÄa %1$S (ID kljuÄa %2$S) so bili preklicani. keyRing.encSubKeysExpired=Vsi podkljuÄi za Å¡ifriranje kljuÄa %1$S (ID kljuÄa %2$S) so potekli. keyRing.noSecretKey=Videti je, da nimate skrivnostnega kljuÄa za %1$S (ID kljuÄa %2$S) na svoji verigi; kljuÄa ne morete uporabiti za podpisovanje. keyRing.encSubKeysUnusable=Vsi podkljuÄi za Å¡ifriranje kljuÄa %1$S (ID kljuÄa %2$S) so potekli, bili preklicani ali so drugaÄe neuporabni. #strings in exportSettingsWizard.js cannotWriteToFile=Ni mogoÄe shraniti v datoteko '%S'. Izberite drugo datoteko. dataExportError=Med izvažanjem podatkov se je pojavila napaka. enigmailSettings=Nastavitve Enigmail defaultBackupFileName=Izvoz Enigmail specifyExportFile=Navedite ime datoteke za izvoz homedirParamNotSUpported=Dodatni parametri, ki doloÄajo poti, kot je --homedir in --keyring, niso podprti za izvažanje/obnavljanje nastavitev. Uporabite nadomestne naÄine, kot je nastavitev spremenljivke okolja GNUPGHOME. #strings in expiry.jsm expiry.keyExpiresSoon=VaÅ¡ kljuÄ %1$S bo potekle Äez %2$S dni.\n\nPriporoÄamo, da ustvarite nov par kljuÄev in ustrezne raÄune nastavite za njihovo uporabo. # expiry.keysExpireSoon=The following of your keys will expire in less than %1$S days:\n%2$S We recommend that you create new keys and configure your accounts to use the new keys. # expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to ultimate in key properties. # expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to ultimate in key properties. # expiry.OpenKeyManager=Open Enigmail Key Management # expiry.OpenKeyProperties=Open Key Properties #strings in pEpDecrypt.jsm # pEpDecrypt.cannotDecrypt=This is an encrypted message. Unfortunately you don't have the secret key to decrypt the message. #strings in gpgAgent.jsm # gpghomedir.notexists=The directory '%S' containing your OpenPGP keys does not exist and cannot be created. # gpghomedir.notwritable=The directory '%S' containing your OpenPGP keys is not writable. # gpghomedir.notdirectory=The directory '%S' containing your OpenPGP keys is a file instead of a directory. # gpghomedir.notusable=Please fix the directory permissions or change the location of your GnuPG "home" directory. GnuPG cannot work correctly otherwise. #strings in pepTrustWords.js # pepTrustWords.cannotVerifyOwnId=Cannot verify p≡p Trustwords for own account. # pepTrustWords.cannotFindKey=Cannot find key for %S. # pepTrustWords.cannotStoreChange=Could not change trust for %S. # pepTrustWords.generalFailure=Cannot obtain trustwords for %S. # pepTrustWords.partnerFingerprint=Fingerprint for %S: #strings in mimeWkdHandler.jsm # wkdMessage.body.req=Your email provider processed your request to upload your public key to the OpenPGP Web Key Directory.\n\nPlease click the confirmation button in the Enigmail header to complete the publishing of your public key. # wkdMessage.body.process=This is an email related to the automatic processing to upload your public key to the OpenPGP Web Key Directory.\n\nYou do not need to take any manual action at this point. #strings in pepHandshake.js # pepPrivacyStatus.RatingBrokenSuggestion=Either you or the sender should resend the message. # pepPrivacyStatus.RatingHaveNoKeySuggestionOutgoing=If you composed this message, your key is not available. # pepPrivacyStatus.RatingMistrustSuggestion=Re-establish the connection with your communication partner and try to complete another handshake. # pepPrivacyStatus.RatingReliableSuggestion=Complete a handshake with your communication partner by exchanging trustwords in person or over the phone. A handshake is needed only once per partner and will ensure secure and trusted communication. # pepPrivacyStatus.RatingTrustedSuggestion=No action needed! # pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware this message may not be secure. # pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Please add the necessary information. # pepPrivacyStatus.RatingUnderAttackSuggestion=Separately verify the content of this message with your communication partner. # pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least secure. # pepPrivacyStatus.RatingUnencryptedSuggestion=Please ask your communication partner to use an encryption solution or install p≡p. # pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or no signature. Ask your communication partner to upgrade their encryption solution or install p≡p. # pepPrivacyStatus.RatingBrokenExplanation=This message has broken encryption or formatting. # pepPrivacyStatus.RatingHaveNoKeyExplanation=This message cannot be decrypted because the key is not available. # pepPrivacyStatus.RatingMistrustExplanation=This message has a communication partner that has previously been marked as mistrusted. # pepPrivacyStatus.RatingReliableExplanation=This message is secure but you still need to verify the identity of your communication partner. # pepPrivacyStatus.RatingTrustedExplanation=This message is secure and trusted. # pepPrivacyStatus.RatingUndefinedExplanation=This message does not contain enough information to determine if it is secure. # pepPrivacyStatus.RatingUnderAttackExplanation=This message is not secure and has been tampered with. # pepPrivacyStatus.RatingUnencryptedExplanation=This message is unsecure. # pepPrivacyStatus.RatingUnencryptedForSomeExplanation=This message is unsecure for some communication partners. # pepPrivacyStatus.RatingUnreliableExplanation=This message has unreliable protection. # pepPrivacyStatus.RatingBrokenText=Broken # pepPrivacyStatus.RatingHaveNoKeyText=Cannot Decrypt # pepPrivacyStatus.RatingMistrustText=Mistrusted # pepPrivacyStatus.RatingReliableText=Secure # pepPrivacyStatus.RatingTrustedText=Secure & Trusted # pepPrivacyStatus.RatingUndefinedText=Unknown # pepPrivacyStatus.RatingUnderAttackText=Under Attack # pepPrivacyStatus.RatingUnencryptedForSomeText=Unsecure for Some # pepPrivacyStatus.RatingUnencryptedText=Unsecure # pepPrivacyStatus.RatingUnreliableText=Unreliable Security # handshakeDlg.button.initHandshake=Handshake... # handshakeDlg.button.stopTrust=Stop Trusting # handshakeDlg.button.reTrust=Stop Mistrusting # handshakeDlg.label.outgoingMessage=Outgoing message # handshakeDlg.label.incomingMessage=Incoming message # handshakeDlg.error.noPeers=Cannot handshake without any correspondents. # handshakeDlg.error.noProtection=Please enable protection in order to use the Handshake function. # enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device # enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup #strings in autocrypt.jsm # autocrypt.setupMsg.subject=Autocrypt Setup Message # autocrypt.setupMsg.msgBody=To set up your new device for Autocrypt, please follow the instuctions that should be presented by your new device. # autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code presented on your old device, and then import the contained key into your keyring. #strings in upgradeInfo.html # upgradeInfo.doctitle=What's New in Enigmail v2.0? # upgradeInfo.welcome1=Welcome to the new Enigmail version 2.0! # upgradeInfo.welcome2=The release contains a lot of new and changed features. Please take a minute to find out what's new: # upgradeInfo.encSubject.title=Encrypting the Message Subject # upgradeInfo.encSubject.desc=We developed a new method that moves the email subject into the encrypted message, and replaces the visible subject with "Encrypted Message". Once such a message is decrypted, the original subject is replaced automatically. Hiding the subject is on by default; there is a preference to turn it off if you don't like it. (Note: this feature requires the message to be sent with PGP/MIME.) # upgradeInfo.buttons.title=Changed behavior of Encrypt and Sign Buttons # upgradeInfo.buttons.desc=The Encrypt and Sign buttons in the message composer window now work for both the OpenPGP and S/MIME protocols. If both algorithms are possible, then Enigmail will try to prefer the one for which all keys are available. # upgradeInfo.autocrypt.title=Support for Autocrypt # upgradeInfo.autocrypt.desc=Enigmail now supports Autocrypt, a new standard to distribute keys as part of sent messages. Enigmail automatically imports keys from Autocrypt-compliant messages, such that over time more and more emails can be encrypted. # upgradeInfo.pEp.title=New p≡p Junior Mode (Pretty Easy Privacy) # upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. You currently need to manually install p≡p for this purpose; this will change in a future release. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. # upgradeInfo.bottom.desc=Please visit our documentation for help on using Enigmail. # pep.missingGnuPG=In order to use Enigmail/p≡p, GnuPG is required. As we could not find it, we suggest to download and install it for you. #strings in enigmailAbout.html # aboutEnigmail.tabName=About Enigmail # aboutEnigmail.title=OpenPGP support provided by Enigmail # aboutEnigmail.team=Enigmail is developed by the Enigmail Team: # aboutEnigmail.projectLeader=Lead Developer: # aboutEnigmail.usability=Usability: # aboutEnigmail.documentation=Documentation: # aboutEnigmail.testing=Testing: # aboutEnigmail.userSupport=User Support: # aboutEnigmail.localization=Localization: See the Enigmail Language Packs page # aboutEnigmail.Credits=Credits: # aboutEnigmail.origAuthor=Original author of the Enigmail extension # aboutEnigmail.icons=Icons: # aboutEnigmail.formerMembers=Former team members: # aboutEnigmail.projectHosting=Project hosting: # aboutEnigmail.licenseSupportTitle=License & Support # aboutEnigmail.license=Enigmail OpenPGP is open source and licensed under the %S # aboutEnigmail.support=Support and download is available from www.enigmail.net. enigmail-2.0.8/lang/sl/help/000077500000000000000000000000001334302754500156035ustar00rootroot00000000000000enigmail-2.0.8/lang/sl/help/compose.html000066400000000000000000000074371334302754500201510ustar00rootroot00000000000000 PomoÄ za Enigmail: Sestavljanje sporoÄil

PomoÄ za Enigmail

Uporaba Enigmaila pri sestavljanju sporoÄil

  • Meni Enigmail v oknu PoÅ¡ta/Sestavi
    • PodpiÅ¡i sporoÄilo: omogoÄi/onemogoÄi poÅ¡iljanje podpisane poÅ¡te. Uporabnik je obveÅ¡Äen, Äe podpisovanje ne uspe.
    • Å ifriraj sporoÄilo: omogoÄi/onemogoÄi Å¡ifriranje vsem prejemnikom pred poÅ¡iljanjem. Uporabnik je obveÅ¡Äen, Äe Å¡ifriranje ne uspe.

      ÄŒe je nastavljeno Prikaži izbiro, ko je to potrebno v Nastavitve -> zavihek Izbira kljuÄa, se pojavi seznam s kljuÄi, Äe so naslovi na voljo v seznamu prejemnikovi za sporoÄilo, za katerega nimate javnega kljuÄa.

      ÄŒe je nastavljeno Nikoli ne prikaži pogovornega okna Izbira kljuÄa OpenPGP v Nastavitve -> zavihek Izbira kljuÄa in se v seznamu prejemnikov sporoÄila nahajajo naslovi, za katere nimate javnega kljuÄa, bo sporoÄilo odposlano neÅ¡ifrirano.

    • Za to sporoÄilo uporabi PGP/MIME: omogoÄi/onemogoÄi uporabo PGP/MIME za to sporoÄilo.

      Če poznani prejemnik/i lahko berejo pošto z uporabo zapisa PGP/MIME, bi ga morali uporabiti.

      Ta možnost je odvisna od nastavitev v Nastavitve -> zavihek PGP/MIME - Äe je nastavljeno Dovoli uporabo PGP/MIME ali Vedno uporabi PGP/MIME.

    • Privzete možnosti sestavljanja: podmeni.
      • Možnosti podpisovanja/Å¡ifriranja ...: bližnjica prek Nastavitve raÄuna -> Možnosti OpenPGP.
      • Možnosti poÅ¡iljanja ...: bližnjica prek Nastavitve -> zavihek PoÅ¡iljanje.
      • Key selection options...: bližnjica prek Nastavitve -> zavihek Izbira kljuÄa.
      • Možnosti PGP/MIME ...: bližnjica prek Nastavitve -> zavihek PGP/MIME.
    • Razveljavi Å¡ifriranje: Äe pride do napake pri poÅ¡iljanju sporoÄila, npr. Äe strežnik POP ne sprejme zahteve, Enigmail o tem ne bo obveÅ¡Äen in Å¡ifrirano sporoÄilo bo Å¡e naprej prikazano v oknu Sestavljanje. S to menijsko izbiro boste razveljavili Å¡ifriranje/podpisovanje, s Äimer boste v oknu Sestavljanje besedilov povrnili v izvoren zapis.
      Kot zaÄasno reÅ¡itev lahko to možnost uporabite tudi za deÅ¡ifriranje citiranega besedila, ko odgovarjate na Å¡ifrirana sporoÄila. Enigmail bi moral samodejno deÅ¡ifrirati citirano sporoÄilo, vendar Äe to ne uspe, lahko uporabite to menijsko izbiro, da ga v to prisilite.
    • Vstavi javni kljuÄ: vstavi blok javnega kljuÄa z ASCII oklepnikom na trenutni položaj kazalke v oknu Sestavljanje. Vnesti boste morali e-poÅ¡tne naslove kljuÄa(ev), ki naj bodo vstavljeni. Na ta naÄin vstavljeni kljuÄi bodo samodejno prepoznani na sprejemnem delu Enigmaila. Po vstavljanju kljuÄa lahko Å¡e vedno izbirate med podpisovanjem/Å¡ifriranjem sporoÄila. Prav tako v sporoÄilo ne smete vstaviti veÄ kot enega bloka kljuÄa; le navedite veÄ e-poÅ¡tnih naslovov, loÄenih z vejicami ali presledki, ko boste po tem povpraÅ¡ani.
    • PoÄisti shranjeno geslo: poÄisti v spominu hranjeno geslo. Uporabno, Äe imate veÄ gesel.
    • PomoÄ: prikaže informacije pomoÄi s spletne strani (te strani).

Nadaljno pomoÄ najdete na spletni strani pomoÄi za Enigmail.

enigmail-2.0.8/lang/sl/help/editRcptRule.html000066400000000000000000000122111334302754500210740ustar00rootroot00000000000000 PomoÄ za Enigmail: Urejanje pravil OpenPGP

PomoÄ za Enigmail

Uporaba Urejevalnika pravil Enigmail: Uredi pravilo OpenPGP

V urejevalniku pravil lahko navedete privzete dejavnosti po uporabniku za omogoÄanje Å¡ifriranja, podpisovanje in PGP/MIME, ter doloÄite, kateri kljuÄ(i) OpenPGP naj bo(do) uporabljen(i). V tem pogovornem oknu lahko doloÄite pravila za posameznega prejemnika ali za skupino prejemnikov z zelo podobnimi atributi.

  • Nastavi pravila OpenPGP za: vsebuje e-poÅ¡tne naslove za prejemnike (brez imen, torej le naslove, kot je nekdo@neka.domena). DoloÄite lahko veÄ e-poÅ¡tnih sporoÄil, loÄenih s presledkom. Tukaj neveden naslov lahko sestavlja le del domene, tako da se bo ujemalo vsako sporoÄilo na kateri koli naslov iz te domene, npr. @neka.domena omogoÄa ujemanje francelj@neka.domena, nekdodrug@neka.domena, vsakdo@neka.domena itn.
  • Uporabi pravilo, Äe prejemnik ...: S tem spremenite ujemanje e-naslovov. ÄŒe je vnesenih veÄ naslovov, bo nastavitev veljala za vse. Spodnji primeri temeljijo na body@email.domain, vnesenem v gornjem polju Pravila OpenPGP.
    • je enako: s to nastavitvijo se bo pravilo sprožilo le na e-sporoÄilih za body@email.domain (natanÄno ujemanje, ne razlikuje velikih/malih Ärk).
    • vsebuje: s to nastavitvijo se ujema vsak e-naslov, ki vsebuje tak niz, npr. anybody@email.domain ali body@email.domain.net
    • se zaÄne z: s to nastavitvijo se ujemajo vsi e-naslovi, ki se zaÄenjajo z ujemajoÄim nizom, npr. body@email.domain.net, body@email.domain-name.com.
    • se konÄa z: s to nastavitvijo se ujemajo vsi e-naslovi, ki se konÄujejo z ujemajoÄim nizom, npr. anybody@email.domain, somebody@email.domain.
  • Nadaljuj z naslednjim pravilom za ujemajoÄi naslov
    VkljuÄitev te funkcije vam omogoÄa doloÄanje pravila, ne da bi morali navesti ID kljuÄa v polje Uporabi naslednje kljuÄe OpenPGP:, tako da je e-naslov uporabljen za preverjanje kljuÄa ob Äasu poÅ¡iljanja. Prav tako bodo procesirana tudi nadaljna pravila za iste naslove.
  • Ne preverjaj nadaljnjih pravil za ujemajoÄi naslov
    Z vkljuÄitvijo te funkcije ustavite obdelavo vseh drugih pravil za ujemajoÄ(i) naslov(e), Äe je temu pravilu ustreženo; t.j. obdelava pravil nadaljuje z naslednjim prejemnikom.
  • Uporabi naslednje kljuÄe OpenPGP:
    Uporabite gumb Izberi kljuÄ(e) ... za izbor kljuÄev prejemnika, ki naj bodo uporabljeni za Å¡ifriranje. Tako kot pri gornjem dejanju ne bodo obdelana nobena druga pravila za ujemajoÄe naslove.
  • Privzeto za podpisovanje: vkljuÄite ali izkljuÄite podpisovanje sporoÄil. S tem uporabite ali prekliÄete, kar ste doloÄili v oknu sestavljanja sporoÄil. Vrednosti so:
    • nikoli: onemogoÄite podpisovanje, Äeprav je morda omogoÄeno v oknu sestavljanja sporoÄila (preglasi druge vrednosti);
    • da, Äe je izbrano v sestavljanju sporoÄila: podpisovanje poteka v skladu z izbranim v oknu sestavljanja sporoÄila;
    • vedno: omogoÄite podpisovanje, Äetudi ni omogoÄeno v oknu sestavljanja sporoÄila;
Te nastavitve podpisovanja se uporabljajo za vsa pravila, ki se ujemajo. ÄŒe eno od pravil prepoveduje podpisovanje, sporoÄilo ne bo podpisano, ne glede na druga pravila, ki morda doloÄajo vedno.
  • Å ifriranje: vkljuÄite ali izkljuÄite Å¡ifriranje sporoÄil. Dovoljene nastavitve in njihov pomen so enaki kot za podpisovanje sporoÄil.
  • PGP/MIME: vkljuÄite ali izkljuÄite uporabo kodiranja sporoÄil PGP/MIME (RFC 3156). ÄŒe je PGP/MIME izkljuÄen, so sporoÄila kodirana z uporabo "medvrstiÄnega PGP". Dovoljene vrednosti in njihov pomen so enaki kot za podpisovanje sporoÄil.

Pravila se obdelujejo v zaporedju seznama v Urejevalniku pravil OpenPGP. VsakiÄ, ko se pravilo ujema s prejemnikom in ko vsebuje ID kljuÄa OpenPGP, poleg uporabe navedenega ID kljuÄa, se prejemnik ne obravnava veÄ pri obdelavi naslednjih pravil.


Nadaljno pomoÄ najdete na strani nastavitev Enigmail po prejemniku.

enigmail-2.0.8/lang/sl/help/messenger.html000066400000000000000000000075611334302754500204720ustar00rootroot00000000000000 PomoÄ za Enigmail: Branje sporoÄil

PomoÄ za Enigmail

Uporaba Enigmail pri branju sporoÄil

  • Gumb DeÅ¡ifriraj v glavnem oknu PoÅ¡ta
    Ta gumb lahko uporabite za veÄ dejanj: deÅ¡ifriranje, preverjanje ali uvoz javnih kljuÄev. ObiÄajno se deÅ¡ifriranje/preverjanje izvede samodejno, Äeprav lahko to izkljuÄite v nastavitvah. ÄŒe pa to ne uspe, se ponavadi pokaže kratko sporoÄilo o napaki v vrstici stanja Enigmaila. ÄŒe kliknete na gumb DeÅ¡ifriraj, boste videli bolj natanÄno sporoÄilo o napaki, vkljuÄno z izhodom ukaza GnuPG.
  • Ikoni Pisalo in KljuÄ v prikazu glave sporoÄila
    Ikoni Pisalo in KljuÄ v glavi sporoÄila nakazujeta, da je bilo sporoÄilo, ki ga prebirate podpisano in/ali Å¡ifrirano in da ali je podpis dober, t.j. da sporoÄilo od trenutka podpisa ni bilo spremenjeno. ÄŒe je bilo sporoÄilo spremenjeno, se ikona Peresa spremeni v Polomlneno pero, kar nakazuje nepravilen podpis. Z desnim klikom na ikono Pero ali KljuÄ se pojavi meni z naslednjimi možnostmi:
    • Podatki o varnosti OpenPGP: omogoÄa ogled izhodnega stanja iz GnuPG za to sporoÄilo.
    • Kopiraj varnostne podatke OpenPGP: skopira izhodno stanje iz GnuPG na odložiÅ¡Äe; za lepljenje v sporoÄilo-odgovor itn.
    • Pokaži fotografski ID OpenPGP: omogoÄa ogled Fotografskega ID osebe, ki je poslala sporoÄilo, Äe imajo fotografijo vdelano v svoj javni kljuÄ. (Ta možnost je na voljo le, Äe fotografski ID obstaja v njihovem kljuÄu.)
    • Varnostni podatki S/MIME: omogoÄa ogled varnostnih podatkov S/MIME za sporoÄilo.

    ÄŒe nimate nastavljenega keyserver-options autoretrieve-key v datoteki gpg.conf in preberete sporoÄilo, ki je podpisano ali Å¡ifrirano, boste videli ikono Peresa v podroÄju izpisa glave z VpraÅ¡ajem, vrstica stanja Enigmaila v podroÄju glave bo izpisala Del sporoÄila je podpisan; kliknite ikono peresa za podrobnosti in sporoÄilo v podoknu sporoÄila bo prikazalo vse pokazatelje blokov sporoÄila OpenPGP in blok podpisa.

    Ta znak boste videli tudi, Äe imate nastavljeno keyserver-options auto-key-retrieve v svoji datoteki gpg.conf, vendar kljuÄ OpenPGP ni na voljo na privzetem strežniku kljuÄev.

    S klikom na ikono Pero in vpraÅ¡aj prikliÄete okno z obvestilom, da kljuÄ ni na voljo v vaÅ¡em skladiÅ¡Äu kljuÄev. ÄŒe kliknete V redu, se pojavi novo okno s seznamom strežnikov kljuÄev, s katerega izberete tistega, s katerega naj bo prenesen javni kljuÄ poÅ¡iljatelja.

    Za nastavitev seznama strežnikov kljuÄev, ki bi jih radi uporabljali, pojdite na zavihek Enigmail -> Nastavitve -> SploÅ¡no in vnesite naslove strežnikov kljuÄev v polje Strežnik(i) kljuÄev:, loÄene z vejico. Prvi strežnik kljuÄev na seznamu bo uporabljen kot privzeti.

  • Odpiranje Å¡ifriranih priponk / uvažanje pripetih kljuÄev OpenPGP
    Priponke s konÄnicami *.pgp, *.asc in *.gpg so prepoznane kot priponke, ki jih Enigmail lahko posebej obdela. Z desnim klikom na takÅ¡no priponko se v pojavnem meniju pojavita dve posebni izbiri: DeÅ¡ifriraj in odpri in DeÅ¡ifriraj in shrani. Ti izbiri uporabite, Äe želite, da Enigmail priponko deÅ¡ifrira, preden jo odprete ali shranite. ÄŒe je priponka prepoznana kot datoteka kljuÄa OpenPGP, vam bo ponujen uvoz kljuÄev v vaÅ¡o shrambo kljuÄev.

Nadaljna pomoÄ je na voljo na spletni strani pomoÄi za Enigmail.

enigmail-2.0.8/lang/sl/help/rulesEditor.html000066400000000000000000000060731334302754500210000ustar00rootroot00000000000000 PomoÄ za Enigmail: Urejevalnik pravil

PomoÄ za Enigmail

Uporaba urejevalnika pravil Enigmail

V Urejevalniku pravil lahko doloÄite privzete vrednosti za prejemnike z omogoÄanjem Å¡ifriranja, podpisovanja in PGP/MIME, ter doloÄite, katerei kljuÄ(i) OpenPGP naj bo(do) uporabljen(i). Vsako pravilo sestavlja pet polj in je predstavljeno v eni vrstici:

  • Email: e-sporoÄilo(a) from the To:, Cc: and Bcc: fields to match. Ujemanje deluje na podnizih (Podrobnosti najdete v pogovornem oknu Urejanja pravil)
  • KljuÄ(i) OpenPGP: seznam ID kljuÄev OpenPGP, ki naj se uporabi(jo) za naslovnika
  • Podpisovanje: omogoÄi ali onemogoÄi podpisovanje sporoÄil. To ali uporabi ali pa prezre nastavitve v oknu sestavljanja sporoÄila. Možne vrednosti so:
    • nikoli: onemogoÄi podpisovanje, Äeprav je omogoÄeno v oknu sestavljanja sporoÄila (preglasi druge vrednosti)
    • dovoli: prepusti nastavitev podpisovanja doloÄitvi v oknu sestavljanja sporoÄila
    • vedno: omogoÄi podpisovanje, Äetudi ni omogoÄeno v oknu sestavljanja sporoÄila
Te nastavitve podpisovanja se upoÅ¡tevajo pri vseh ujemajoÄih pravilih. ÄŒe eno od pravil onemogoÄi podpisovanje, sporoÄilo ne bo podpisoano, ne glede na doloÄila dugega pravila, ki doloÄa podpisovanje Vedno.
  • Å ifriraj: omogoÄi ali onemogoÄi Å¡ifriranje sporoÄila. Dovoljene nastavitve in njihov pomen so enaki kot pri podpisovanju sporoÄila.
  • PGP/MIME: omogoÄi ali onemogoÄi uporabo Å¡ifriranja sporoÄil PGP/MIME (RFC 3156). ÄŒe je PGP/MIME onemogoÄen, se sporoÄila Å¡ifrirajo z uporabo "inline PGP". Dovoljene vrednosti in njihov pomen so enaki kot pri podpisovanju sporoÄil.

Pravila se procesirajo v vrstnem redu seznama. Ko se pravilo ujema s prejemnikom in vsebuje ID kljuÄa OpenPGP poleg zporabe navedenega ID kljuÄa, se prejemnik veÄ ne preuÄuje pri procesiranju nadaljnih pravil.

Opomba: Urejevalnik pravil Å¡e ni dokonÄan. Možno je napisati nekaj naprednejÅ¡ih pravil z neposrednim urejanjem datoteke pravil (ta pravila kasneje veÄ ne smete urejati v urejevalniku pravil). Nadaljne informacije za neposredno urejanje datoteke je na voljo na domaÄi strani Enigmail.


Nadaljna pomoÄ je na voljo na naslovu spletni strani pomoÄi za Enigmail

enigmail-2.0.8/lang/sl/help/sendingPrefs.html000066400000000000000000000047771334302754500211370ustar00rootroot00000000000000 Enigmail Help: Edit OpenPGP Rule

Enigmail Help

Defining Preferences to Send Encrypted

In the Sending Preferences you can choose the general model and preferences for encryption.

Convenient Encryption
With these settings, emails are encrypted without confirmation whenever possible.

This setup is appropriate, if you just want to improve your privacy by sending emails encyrpted instead of unencrypted if that's possible.

The effect is like sending emails as letters instead of postcards. Unlike postcards, letters usually hide their contents while in transit.

Note however that as with letters you can't be sure that nobody is opening the letter while it is in transit (although, some technical effort is necessary for that).

A concrete risk is that you accidentally use "faked keys" you got from somewhere or somebody claiming that the key belongs to the person you want to send emails to. To avoid this risk, you can either use the trust model of PGP (see below) or you should always verify, whether the fingerprint of a public key is correct.

Manual Encryption
This option allows you to specify the different preferences for encryption according to your needs. You can specify
  • whether replies to encrypted/signed emails should automatically also be encrypted/signed-
  • whether to use the trust model of OpenPGP to accept keys (this means that to use a key you either have to sign the key or have enough other people you trust having signed the key).
  • whether you want to automatically send emails encrypted if all keys are accepted.
  • whether and when you want to finally confirm sending an email.
If it is important for you that content you send encrypted can't be read by other people or organizations, you should use the manual preferences at least choose the option to accept keys only if you or other people signed them. While this model reduces the risk of using faked keys, it requires that you actively sign keys and declare owner trust using the key managament dialog. enigmail-2.0.8/lang/sq/000077500000000000000000000000001334302754500146605ustar00rootroot00000000000000enigmail-2.0.8/lang/sq/am-enigprefs.properties000066400000000000000000000001171334302754500213520ustar00rootroot00000000000000# Strings used in the Mozill AccountManager prefPanel-enigprefs=Siguri OpenPGP enigmail-2.0.8/lang/sq/enigmail.dtd000066400000000000000000002071531334302754500171520ustar00rootroot00000000000000 Mozilla Public License 2.0."> 'Shpërngulje Autocrypt e Kyçeve' lyp që klienti i postë te pajisja tjetër të mbulojë protokollin Autocrypt. Ndërkohë që kjo është zgjidhja më e lehtë, këtë standard e mbulojnë vetëm një numër i kufizuar klientësh. Mënyra tjetër është të 'Kopjeruani & riktheni' gjetkë rregullimet tuaj. Kjo do të krijojë një kartelë ZIP me krejt të dhënat dhe kyçet e nevojshëm, që mund ta kopjoni te pajisja juaj e re. Enigmail-i mund t’i importojë drejtpërsëdrejti këto rregullime; për klientë të tjerë poste, kartela ZIP mund të shpaketohet dhe të trajtohet dorazi."> '"> ' për përcaktim adresash email"> ' për të përcaktuar adresa email-i për GnuPG-në. Çaktivizojeni, nëse marrësi ka kyçe të vjetër Hushmail."> Siguri OpenPGP)"> SHËNIM: Prodhimi i kyçeve mund të dojë disa minuta të plotësohet. Mos e mbyllni programin, ndërkohë që kryhet prodhimi i kyçeve. Shfletimi rëndshëm, ose kryerja e veprimeve që e përdorin shumë diskun, gjatë prodhimit të kyçeve do ta rimbushë 'burimin e rastësisë' dhe përshpejtojë procesin. Kur prodhimi i kyçeve të jetë plotësuar, do t'ju njoftohet."> Autocrypt është një standard që përcakton se si të arrihet fshehtëzim skaj-më-skaj i email-eve. Ai specifikon se si programet email trajtojnë aftësi fshehtëzimi duke përdorur email-e të zakonshëm."> ' është e pavlefshme"> SHËNIM: Prodhimi i kyçeve mund të dojë disa minuta të plotësohet. Mos e mbyllni programin, ndërkohë që kryhet prodhimi i kyçeve. Kur prodhimi i kyçeve të jetë plotësuar, do t'ju njoftohet."> Shënim: Enigmail-i do të verifikojë përherë nënshkrimet në email-e, për çdo llogari ose identitet, pavarësisht se është aktivizuar apo jo për një të tillë"> Kyçi juaj publik shërben për t'u përdorur nga të tjerët që t'ju dërgojnë mesazhe të fshehtëzuar. Mund t'ia jepni kujtdo."> Kyçi juaj privat shërben që ju vetë t'i shfshehtëzoni këto email-e dhe që të dërgoni email-e të nënshkruar. S'duhet t’ia jepni ndokujt."> Kyçi juaj privat shërben që ju t'i shfshehtëzoni këto email-e dhe të dërgoni email-e të nënshkruar. S'duhet t'ia jepni ndokujt. Që ta siguroni kyçin tuaj privat, në dy hapat vijues do t'ju kërkohet një frazëkalim."> Frazëkalimi juaj është një fjalëkalim për mbrojtjen e kyçit tuaj privat. Ai parandalon përdorimin e paautorizuar të kyçit tuaj privat."> Nuk këshillohen shkronjat me shenja sipër (p.sh. ë, é, ñ) dhe shkronja specifike të një gjuhe të caktuar."> Për këtë do t'ju kërkohet të jepni fjalëkalimin tuaj. Ju lutemi, shpërnguleni dëshminë te një media që mund të depozitohet gjetkë pa rrezik, b.f., CD ose diskth USB. Nëse dikush arrin të hyjë në këtë dëshmi, mund ta përdorë për ta bërë të papërdorshëm kyçin tuaj."> eksportoni të dhënat tuaja prej kompjuterit të vjetër duke përdorur ndihmësin e kopjeruajtjeve te Parapëlqimet për Enigmail-in importojini të dhënat tuaja te kompjuteri i ri duke përdorur këtë ndihmës. "> Faleminderit që përdorni Enigmail-in."> Ju lutemi, ripohojeni kërkesën që do të gjeni te mesazhet tuaj të marrë, nëse doni të bëhet kështu. "> eksportoni të dhënat tuaja prej kompjuterit të vjetër duke përdorur këtë ndihmës importojini të dhënat tuaja te kompjuteri i ri duke përdorur Ndihmësin e Rregullimeve. "> Trustwords p≡p "> Trustwords e tij, ose përmes telefoni. Ato duhet të përputhen me Trustwords më poshtë."> Trustwords vijuese."> Trustwords"> Trustwords të Gjata"> Trustwords"> Ju lutemi, përzgjidhni më poshtë llogarinë për të cilën doni të shpërngulet kyçi juaj. Te skena vijuese do të shfaqim një kod rregullimi (fjalëkalim) të cilin do t’ju duhet ta jepni te pajisja tjetër, që të mund të importohet kyçi juaj dhe rregullimet e ruajtura."> Ju lutemi, tani kaloni te pajisja tjetër dhe hapeni mesazhin. Do t’ju kërkohet një kod rregullimi. Ju lutemi, shtypni te kutiza shifrat vijuese:"> enigmail-2.0.8/lang/sq/enigmail.properties000066400000000000000000001651021334302754500205700ustar00rootroot00000000000000Enigmail=Enigmail ##################################################################### # Strings used within enigmailCommon.js and enigmailCommon.jsm ##################################################################### enigAlert=Sinjalizim Enigmail-i enigConfirm=Ripohim Enigmail-i enigInfo=Të dhëna Enigmail-i enigError=Gabim Enigmail enigPrompt=Kërkesë nga Enigmail dlgYes=&Po dlgNo=&Jo dlgKeepSetting=Mbaje mend përgjigjen time dhe mos më pyet prapë dlgNoPrompt=Mos ma shfaq më këtë dialog dlg.button.delete=&Fshije dlg.button.cancel=&Anuloje dlg.button.close=&Mbylle dlg.button.continue=&Vazhdoni dlg.button.skip=Anashkal&oje dlg.button.overwrite=&Mbishkruaje dlg.button.view=Sh&iheni dlg.button.retry=&Riprovoni dlg.button.ignore=&Shpërfille dlg.button.install=&Instaloje dlg.button.ok=&OK repeatPrefix=\n\nKy sinjalizim do të përsëritet %S repeatSuffixSingular=herë tjetër. repeatSuffixPlural=herë të tjera. noRepeat=\n\nKy sinjalizim s’do të përsëritet pa përmirësuar Enigmail-in. pgpNotSupported=Duket se po përdorni Enigmail-in tok me PGP 6.x\n\nUnfortunately, Për fat të keq, PGP 6.x ka një dorë problemesh që e pengojnë punën normale të Enigmail-it. Ndaj, Enigmail-i nuk i mbulon më versionet PGP 6.x; ju lutemi, në vend të tij, hidhuni te GnuPG (GPG).\n\nNëse ju duhet ndihmë për kalimin te GnuPG, shihni ndarjen Ndihmë te sajti i Enigmail-it. initErr.howToFixIt=Që të mund të përdorni Enigmail-in, lypset GnuPG-ja. Nëse s’e keni instaluar ende GnuPG-në, rruga më e lehtë për ta bërë këtë është të përdorni butonin "Ndihmësi i Rregullimit" më poshtë. initErr.setupWizard.button=Ndihmësi i &Rregullimit passphraseCleared=Frazëkalimi u pastrua. cannotClearPassphrase=Po përdorni një mjet jo-standard (fjala vjen, gnome-keyring) për trajtim frazëkalimesh. Ndaj spastrimi i frazëkalimit s’është i mundur nga brenda Enigmail-it. noPhotoAvailable=S’ka Foto të gatshme debugLog.title=Regjistër Diagnostikimesh Enigmail-i error.photoPathNotReadable=Shtegu '%S' i fotos s’është i lexueshëm generalError=Gabim: %S # Strings in configure.jsm enigmailCommon.versionSignificantlyChanged=Ky version i ri i Enigmail-it ka ndryshime të rëndësishme në trajtimin e parapëlqimeve dhe mundësive. U përpoqëm të mbartim rregullimet e vjetra te ky version i ri. Megjithatë, s’ mund të mbulojmë vetvetiu të gjitha rastet. Ju lutemi, kontrolloni edhe ju rregullimet e reja për parapëlqimet dhe mundësitë. enigmailCommon.checkPreferences=Kontrolloni Parapëlqimet ... preferences.defaultToPgpMime=E kemi ndryshuar parazgjedhjen për kodimin e mesazheve në Enigmail, nga PGP Brendazi në PGP/MIME. Këshillojmë që si parazgjedhje të mbani këtë.\n\nNëse si parazgjedhje, prapëseprapë doni të përdorni PGP Brendazi, mund ta bëni këtë te Rregullime Llogarie nën ndarjen Siguri OpenPGP. ##################################################################### # Strings in enigmailAbout.js ##################################################################### usingVersion=Po xhirohet Enigmail-i version %S enigmailPepVersion=Enigmail/p≡p version %S usingAgent=Po përdoret i ekzekutueshmi %1$S %2$S për fshehtëzim dhe shfshehtëzim agentError=GABIM: Dështoi hyrja te shërbimi Enigmime! ##################################################################### # Strings in enigmailKeygen.js ##################################################################### accessError=Gabim gjatë hyrjes te shërbimi Enigmail onlyGPG=Prodhimi i kyçeve funksionon vetëm me GnuPG-në (jo me PGP-në)! keygenComplete=Prodhimi i kyçeve u plotësua! Për nënshkrim do të përdoret identiteti <%S>. revokeCertRecommended=Këshillojmë me forcë krijimin e një dëshmie shfuqizimi për kyçin tuaj. Kjo dëshmi mund të përdoret për të bërë të pavlefshëm kyçin tuaj, për shembull, në rast se kyçi juaj i fshehtë humb ose komprometohet. Doni të krijohet tani një dëshmi e tillë shfuqizimi? keyMan.button.generateCert=&Prodhoje Dëshminë genCompleteNoSign=Prodhimi i kyçeve u plotësua! genGoing=Prodhimi i kyçit është duke u kryer! passNoMatch=Zërat për frazëkalimet nuk përputhen; ju lutemi, rijepeni passCheckBox=Ju lutemi, i vini shenjë kutizës, nëse po tregoni se nuk doni frazëkalim për kyçin passUserName=Ju lutemi, tregoni një emër përdoruesi për këtë identitet keygen.missingUserName=S’ka emër të përcaktuar për llogarinë/identitetin e përzgjedhur. Ju lutemi, jepni një vlerë te fusha "Emri juaj", te rregullime llogarie. keygen.passCharProblem=Te frazëkalimi juaj po përdorni shenja speciale. Mjerisht, kjo mund të shkaktojë probleme për aplikacione të tjera. Këshillojmë të zgjidhni një frazëkalim që përbëhet vetëm nga cilado prej këtyre shenjave:\na-z A-Z 0-9 /.;:-,!?(){}[]%* passSpaceProblem=Për arsye teknike, frazëkalimi juaj s’mund të fillojë ose përfundojë me një shenjë hapësirë. changePassFailed=Ndryshimi i frazëkalimit dështoi. keyConfirm=Të prodhohen kyçet privatë dhe publikë për '%S'? keyMan.button.generateKey=&Prodhoje Kyçin keyAbort=Të ndërpritet prodhimi i kyçeve? keyMan.button.generateKeyAbort=&Ndërprite Prodhimin e Kyçeve keyMan.button.generateKeyContinue=&Vazhdo Prodhimin e Kyçeve expiryTooLong=Nuk mund të krijoni një kyç që skadon për më shumë se 100 vjet. expiryTooLongShorter=Nuk mund të krijoni një kyç që skadon për më shumë se 90 vjet. expiryTooShort=Kyçi juaj duhet të jetë i vlefshëm të paktën për një ditë. keyGenFailed=Prodhimi i kyçit dështoi. Ju lutemi, për hollësi kontrolloni konsolën Enigmail (Menuja Enigmail > Diagnostikim Enigmail-i). setKeyExpirationDateFailed=Data e skadimit s’u ndryshua dot # Strings in enigmailMessengerOverlay.js securityInfo=Të dhëna Sigurie Enigmail-i\n\n enigHeader=Enigmail: enigContentNote=Enigmail: *Bashkëngjitjet e këtij mesazhi nuk janë nënshkruar ose fshehtëzuar*\r\n\r\n possiblyPgpMime=Mesazh i fshehtëzuar ose nënshkruar ndoshta me PGP/MIME; klikoni mbi butonin Shfshehtëzoje që të verifikohet saveAttachmentHeader=Enigmail: Ruajeni bashkëngjitjen e shfshehtëzuar noTempDir=S’u gjet drejtori e përkohshme ku të shkruhej\nJu lutemi, rregulloni ndryshoren TEMP të mjedisit attachmentPgpKey=Bashkëngjitja '%S' që po hapni duket të jetë një kartelë kyçi OpenPGP.\n\nKlikoni mbi 'Importo' që të importoni kyçet që përmban ose 'Parje' që të shihni lëndën e kartelës në një dritare shfletuesi beginPgpPart=********* *FILLIMI I PJESËS SË FSHEHTËZUAR ose TË NËNSHKRUAR* ********* endPgpPart=********** *FUNDI I PJESËS SË FSHEHTËZUAR ose TË NËNSHKRUAR* ********** notePartEncrypted=Enigmail: *Pjesë të këtij mesazhi NUK janë nënshkruar ose fshehtëzuar* noteCutMessage=Enigmail: *U gjetën blloqe të shumëfishtë mesazhesh -- shfshehtëzimi/verifikimi dështoi* decryptOkNoSig=Kujdes\n\nShfshehtëzimi qe i suksesshëm, por nënshkrimi s’u verifikua saktë msgOvl.button.contAnyway=&Vazhdo Sido Qoftë signature.verifiedOK=Nënshkrimi për bashkëngjitjen %S u verifikua me sukses signature.verifyFailed=Nënshkrimi për bashkëngjitjen %S s’u verifikua dot attachment.noMatchToSignature=Për bashkëngjitjen '%S' s’u gjet dot përputhje me ndonjë kartelë nënshkrimi attachment.noMatchFromSignature=Për kartelën e nënshkrimit '%S' s’u gjet dot përputhje me ndonjë bashkëngjitje fixBrokenExchangeMsg.failed=Nuk pati sukses në ndreqjen e mesazhit. enigmail.msgViewColumn.label=Enigmail enigmailPep.msgViewColumn.label=Enigmail/p≡p wksNoIdentity=Ky kyç s’është i lidhur me ndonjë nga llogaritë tuaja email. Ju lutemi, shtoni një llogari për të paktën një nga adresat vijuese email:\n\n%S wksConfirmSuccess=Email-i i ripohimit u dërgua. wksConfirmFailure=Dërgimi i email-it të ripohimit dështoi. autocrypt.importSetupKey.accountPreconfigured=Llogaria juaj është tashmë e formësuar për Autocrypt-in.\n\nDoni të mbishkruhet vërtet rregullimi juaj me këtëe mesazh rregullimi? autocrypt.importSetupKey.selfCreated=Ky mesazh qe krijuar nga instanca juaj në xhirim e Enigmail-it.\n\nPër të importuar rregullimet, ju lutemi, kaloni te klienti i postës ku doni të shpërngulen rregullimit, dhe klikoni mbi mesazhin që nga ai klient poste. autocrypt.importSetupKey.invalidMessage=Gabim - s’u lexua dot mesazhi i rregullimit. Mesazhi duket të jetë i komprometuar. Ju lutemi, provoni të krijoni një mesazh të ri rregullimi te pajisja juaj "tjetër". autocrypt.importSetupKey.invalidKey=Gabim - kyçi s’u importua dot. Ose kyçi s’mbulohet nga versioni juaj i GnuPG-së, ose është komprometuar. autocrypt.importSetupKey.wrongPasswd=Fjalëkalimi që dhatë është i gabuar. Doni të riprovohet? autocrypt.importSetupKey.success=Mesazhi i rregullimit të Autocrypt-it u përpunua me sukses. Autocrypt-i tani është funksional për llogarinë tuaj'%S'. ##################################################################### # Strings in enigmailMsgComposeOverlay.js ##################################################################### keysToExport=Përzgjidhni Kyçe OpenPGP për Futje keysToUse=Përzgjidhni Kyç(e) OpenPGP për përdorim me %S pubKey=Kyç publik për %S\n windowLocked=Dritarja e hartimit është e bllokuar; dërgimi u anulua sendUnencrypted=Gatitja e Enigmail-it dështoi..\nTë dërgohet mesazhi i pafshehtëzuar? composeSpecifyEmail=Ju lutemi, përcaktoni adresën tuaj parësore, që do të përdoret për zgjedhjen e kyçit të nënshkrimit për mesazhet e dërguara.\n Nëse e lini të zbrazët, për zgjedhjen e kyçit të nënshkrimit do të përdoret adresa prej fushës NGA e mesazhit. sendingHiddenRcpt=Ky mesazh ka marrës BCC (kopje të padukshme). Nëse mesazhi fshehtëzohet, është e mundur të kryhet fshehja e marrësve BCC, por përdoruesit e disa produkteve (p.sh. PGP Corp.) s’do të jenë në gjendje të shfshehtëzojnë mesazhin. Prej kësaj, këshillojmë të shmangni email-e BCC me mesazhe të fshehtëzuar. sendWithHiddenBcc=Fshihi marrësit BCC sendWithShownBcc=Fshehtëzoje normalisht sendingNews=Veprimi i dërgimit të fshehtëzuar u ndërpre.\n\nKy mesazh s’mund të fshehtëzohet, ngaqë ka marrës prej grupe lajmesh. Ju lutemi, ridërgojeni mesazhin pa fshehtëzim. sendToNewsWarning=Kujdes: ju ndan një hap nga dërgimi te një grup lajmesh i një email-i të fshehtëzuar.\n\nKjo është e pakëshillueshme, ngaqë ka kuptim vetëm nëse mesazhin mund ta shfshehtëzojnë krejt anëtarët e grupit, pra lypset që mesazhi të fshehtëzohet me kyçet e krejt pjesëmarrësve në grup. Ju lutemi, dërgojeni këtë mesazh vetëm në rast se e dini saktësisht se ç’po bëni.\n\nTë vazhdohet? hasHTML=Sinjalizim mesazhi HTML::\nKy mesazh mund të përmbajë HTML, çka mund të bëjë që nënshkrimi/fshehtëzimi të dështojë. Për ta shmangur këtë në të ardhmen, duhet të shtypni tastin SHIFT, kur klikoni mbi butonin Hartoni/Përgjigjuni për dërgim mesazhesh të nënshkruar.\nNëse, si parazgjedhje, i nënshkruani mesazhet, duhet t’i hiqni shenjën kutizës së parapëlqimit 'Harto Mesazhe në HTML', për t’i çaktivizuar përgjithnjë mesazhet HTML për këtë llogari email-esh. strippingHTML=Mesazhi përmban të dhëna formatimi HTML që do të humbë gjatë shndërrimit në tekst të thjeshtë për nënshkrim/fshehtëzim. Doni të ecet më tej? msgCompose.button.sendAnyway=&Dërgoje Mesazhin Sido Qoftë attachWarning=Bashkëngjitjet te ky mesazh nuk janë vendore, ato s’mund të fshehtëzohen. Që të mund të fshehtëzoni bashkëngjitje, depozitojini ato së pari si kartela vendore dhe mandej bashkëngjitini. Doni të dërgohet mesazhi sido qoftë? quotedPrintableWarn=Keni aktivizuar kodim 'quoted-printable' për dërgim mesazhesh. Kjo mund të sjellë shfshehtëzim dhe/ose verifikim të pasaktë të mesazhit tuaj.\nDoni ta çaktivizoni tani dërgimin e mesazheve 'quoted-printable'? minimalLineWrapping=Keni caktuar mbështjellje rreshti në %S shenja. Për fshehtëzim dhe/ose nënshkrim të saktë, kjo vlerë lypset të jetë e pakta 68.\nDëshironi ta kaloni tani mbështjelljen e rreshtave në 68 shenja? warning=Kujdes signIconClicked=E keni ndryshuar dorazi nënshkrimin. Ndaj, teksa hartoni mesazhin, (ç)aktivizimi i nënshkrimit s’varet më nga (ç)aktivizimi i fshehtëzimit. errorOwnKeyUnusable=ID-ja '%S' e kyçit, e formësuar për identitetin e tanishëm nuk sjell ndonjë kyç OpenPGP të përdorshëm.\n\nJu lutemi, sigurohuni që keni një kyç OpenPGP të vlefshëm, që s’ka skaduar, dhe që rregullimet tuaja shpien te ai kyç.\nNëse kyçi juaj s’ka skaduar, atëherë kontrolloni nëse për të keni caktuar besueshmëri Zotëruesi si plotësisht ose përfundimisht. msgCompose.cannotSaveDraft=Gabim teksa ruhej skica msgCompose.partiallyEncrypted.short=Kini mendjen te rrjedhje informacionesh konfidenciale - email i fshehtëzuar pjesërisht. msgCompose.partiallyEncrypted.mimeMsg=Mesazhi të cilit po i përgjigjeni përmbante pjesë të pafshehtëzuara dhe të fshehtëzuara. Disa pjesë të fshehtëzuara të mesazhit janë të padukshme për ju.\n\nNëse dërguesi s’qe fillimisht në gjendje të shfshehtëzonte pjesë të fshehura të mesazhit, mund të jeni duke lënë zbuluar informacion konfidencial që dërguesi s’qe në gjendje ta fshehtëzonte.\n\nKëshillojmë të mos i përgjigjeni këtij mesazhi, por të krijoni një mesazh të ri që të përmbajë përgjigjen tuaj. msgCompose.partiallyEncrypted.inlinePGP=Mesazhi të cilit po i përgjigjeni përmbante pjesë të pafshehtëzuara dhe të fshehtëzuara. Nëse dërguesi s’qe fillimisht në gjendje të shfshehtëzonte pjesë të mesazhit, mund të jeni duke lënë zbuluar informacion konfidencial që dërguesi s’qe në gjendje ta fshehtëzonte.\n\nJu lutemi, shihni mundësinë e heqjes nga përgjigja juaj për këtë dërgues të krejt tekstit të cituar prej mesazhit të tij. msgCompose.internalEncryptionError=Gabim i Brendshëm: fshehtëzimi i premtuar është i çaktivizuar msgCompose.internalError=Ndodhi një gabim i brendshëm. msgCompose.toolbarTxt.signAndEncrypt=Ky mesazh do të nënshkruhet dhe fshehtëzohet msgCompose.toolbarTxt.signOnly=Ky mesazh do të nënshkruhet msgCompose.toolbarTxt.encryptOnly=Ky mesazh do të fshehtëzohet msgCompose.toolbarTxt.noEncryption=Ky mesazh do të jetë i panënshkruar dhe i pafshehtëzuar msgCompose.toolbarTxt.disabled=Për identitetin e përzgjedhur Enigmail-i është i çaktivizuar msgCompose.protectSubject.tooltip=Mbroje subjektin e mesazhit msgCompose.noSubjectProtection.tooltip=Mos e mbro subjektin e mesazhit msgCompose.encryptedSubjectStub=Mesazh i Fshehtëzuar msgCompose.protectSubject.dialogTitle=Të Aktivizohet Mbrojtja e Subjektit? msgCompose.protectSubject.question=Email-et e rregullt të fshehtëzuar përmbajnë subjekt të paredaktuar.\nKemi caktuar një standard për fshehje të subjektit origjinal të mesazhit të fshehtëzuar\ndhe zëvendësuar atë me tekst kot, në mënyrë që subjekti të jetë i dukshëm vetëm pasi email-i të fshehtëzohet.\n\nDoni të mbrohet subjekti në mesazhe të fshehtëzuar? msgCompose.protectSubject.yesButton=&Mbro Subjektin msgCompose.protectSubject.noButton=&Lëre subjektin të pambrojtur msgCompose.detailsButton.label=Hollësi… msgCompose.detailsButton.accessKey=H msgCompose.pepSendUnknown=E panjohur msgCompose.pepSendUnsecure=I pasigurt msgCompose.pepSendSecure=I sigurt msgCompose.pepSendTrusted=I sigurt & I besueshëm pep.alert.disabledForIdentity=p≡p është e çaktivizuar për identitetin e tanishëm. Ju lutemi, aktivizojeni p≡p që nga parapëlqimet për Enigmail/p≡p. pep.alert.weakReply=Ju ndan një hap nga përcjellja apo përgjigja ndaj një mesazhi të sigurt me një të pasigurt. Nëse vendosni të vazhdohet, mund të ketë rrjedhje informacionesh konfidenciale, duke ju vënë ju dhe partnerin e komunikimit në rrezik. Jeni i sigurt se doni të vazhdohet? # note: should end with double newline: sendAborted=Veprimi i dërgimit u ndërpre.\n\n # details: keyNotTrusted=Besueshmëri e pamjaftueshme e kyçit '%S' keyNotFound=Nuk u gjet kyçi '%S' keyRevoked=Kyçi '%S' është i shfuqizuar keyExpired=Kyçi '%S' ka skaduar statPGPMIME=PGP/MIME statSMIME=S/MIME statSigned=I NËNSHKRUAR statEncrypted=I FSHEHTËZUAR statPlain=I PANËNSHKRUAR dhe I PAFSHEHTËZUAR offlineSave=Të ruhet mesazhi %1$S për %2$S te dosja Mesazhe të Padërguar? onlineSend=Të dërgohet mesazhi %1$S për %2$S? encryptKeysNote=Shënim: Mesazhi është i fshehtëzuar për ID Përdoruesi / Kyçet vijues: %S hiddenKey= signFailed=Gabim te Enigmail-i; Fshehtëzimi/nënshkrimi dështoi; të dërgohet mesazhi i pafshehtëzuar? msgCompose.button.sendUnencrypted=&Dërgoje Mesazh të Pafshehtëzuar recipientsSelectionHdr=Përzgjidhni Marrës për Fshehtëzime configureNow=S’keni formësuar ende sigurinë e Enigmail-it për identitetin e përzgjedhur. Doni ta bëni tani? # encryption/signing status and associated reasons: encryptMessageAuto=Fshehtëzoje Mesazhin (vetvetiu) encryptMessageNorm=Fshehtëzoje Mesazhin signMessageAuto=Nënshkruaje Mesazhin (vetvetiu) signMessageNorm=Nënshkruaje Mesazhin encryptOff=Fshehtëzim: JO encryptOnWithReason=Fshehtëzim: PO (%S) encryptOffWithReason=Fshehtëzim: JO (%S) encryptOn=Fshehtëzim: PO signOn=Nënshkrim: PO signOff=Nënshkrim: JO signOnWithReason=Nënshkrim: PO (%S) signOffWithReason=Nënshkrim: JO (%S) reasonEnabledByDefault=aktivizuar si parazgjedhje reasonManuallyForced=i detyruar dorazi reasonByRecipientRules=i detyruar nga rregulla sipas marrësish reasonByAutoEncryption=i detyruar nga vetëfshehtëzimi reasonByConflict=për shkak përplasjeje me rregulla sipas marrësish reasonByEncryptionMode=për shkak të mënyrës së fshehtëzimit # should not be used anymore: encryptYes=Mesazhi do të fshehtëzohet encryptNo=Mesazhi s’do të fshehtëzohet # should not be used anymore: signYes=Mesazhi do të nënshkruhet signNo=Mesazhi s’do të nënshkruhet # PGP/MIME status: pgpmimeNormal=Protokoll: PGP/MIME inlinePGPNormal=Protokoll: PGP Brendazi smimeNormal=Protokoll: S/MIME pgpmimeAuto=Protokoll: PGP/MIME (vetvetiu) inlinePGPAuto=Protokoll: PGP Brendazi (vetvetiu) smimeAuto=Protokoll: S/MIME (auto) # should not be used anymore pgpmimeYes=Do të përdoret PGP/MIME pgpmimeNo=Do të përdoret PGP brendazi # Attach own key status (tooltip strings): attachOwnKeyNo=Kyçi juaj s’do të bashkëngjitet attachOwnKeyYes=Kyçi juaj do të bashkëngjitet attachOwnKeyDisabled=Kyçi juaj s’mund të bashkëngjitet. Që të aktivizohet kjo veçori, duhet të përzgjidhni një kyç të dhënë te ndarja OpenPGP e Rregullimeve të Llogarisë. rulesConflict=U kap përplasje me rregulla sipas-marrësish\n%S\n\nTë dërgohet mesazhi duke përdorur këto rregullime? msgCompose.button.configure=&Formësojeni msgCompose.button.send=&Dërgoje Mesazhin msgCompose.button.save=&Ruaje Mesazhin # Strings in enigmailMsgHdrViewOverlay.js keyNeeded=Lypset kyçi publik %S që të verifikohet nënshkrimi keyUsed=Për verifikimin e nënshkrimit u përdor kyçi publik %S clickDecrypt=; klikoni mbi butonin Shfshehtëzoje clickDecryptRetry=; klikoni mbi butonin Shfshehtëzoje që të riprovohet clickDetailsButton=; për më tepër të dhëna, klikoni mbi butonin 'Hollësi' clickImportButton=; që ta shkarkoni kyçin klikoni mbi butonin 'Importoje Kyçin' keyTypeUnsupported=; lloji i kyçit nuk mbulohet nga versioni juaj i GnuPG-së msgPart=Pjesë e mesazhit %S msgSigned=i nënshkruar msgSignedUnkownKey=nënshkruar me kyç të panjohur msgEncrypted=i fshehtëzuar msgSignedAndEnc=i nënshkruar dhe i fshehtëzuar unverifiedSig=Nënshkrim i paverifikuar incompleteDecrypt=Shfshehtëzim i paplotë needKey=Gabim - s’u gjet kyçi privat/i fshehtë përkatës për shfshehtëzimin e mesazhit failedDecrypt=Gabim - shfshehtëzimi dështoi badPhrase=Gabim - frazëkalim i gabuar failedDecryptVerify=Gabim - shfshehtëzimi/verifikimi dështoi viewInfo=; Parje > Të dhëna sigurie mesazhi, për hollësi decryptedMsg=Mesazhi u shfshehtëzua decryptedMsgWithFormatError=Mesazhi u shfshehtëzua (u rikthye format email-i PGP i dëmtuar, shkaktuar me gjasa nga një shërbyes i vjetër Exchange, ndaj përfundimi mund të mos jetë përsosmërisht i lexueshëm) usedAlgorithms=Algoritme të Përdorur: %S dhe %S pepStatusInfo.text=Gjendje Mesazhi p≡p. pepStatusInfo.title.m3=Po Sulmoheni pepStatusInfo.info.m3=Ky mesazh s’është i sigurt dhe mbi të është vënë dorë. pepStatusInfo.title.m1=I mosbesuar pepStatusInfo.info.m1=Ky mesazh ka një partner komunikimi të cilit më parë i është vënë shenjë si i mosbesuar pepStatusInfo.title.r0=E panjohur pepStatusInfo.info.r0=Ky mesazh nuk përmban të dhëna të mjaftueshme për të përcaktuar nëse është i sigurt. pepStatusInfo.title.r1=Nuk Shfshehtëzon Dot pepStatusInfo.info.r1=Ky mesazh nuk shfshehtëzohet dot, ngaqë kyçi s’është i passhëm. pepStatusInfo.title.r2=Nuk Shfshehtëzon Dot pepStatusInfo.info.r2=Ky mesazh nuk shfshehtëzohet dot, ngaqë kyçi s’është i passhëm. pepStatusInfo.title.r3=I pasigurt pepStatusInfo.info.r3=Ky mesazh është i pasigurt. pepStatusInfo.title.r4=I pasigurt për Disa pepStatusInfo.info.r4=Ky mesazh është i pasigurt për disa partnerë komunikimi. pepStatusInfo.title.r5=Siguri e Paqëndrueshme pepStatusInfo.info.r5=Ky mesazh ka mbrojtje të paqëndrueshme. pepStatusInfo.title.r6=I sigurt… pepStatusInfo.info.r6=Ky mesazh është i sigurt, por ende ju duhet të verifikoni identitetin e partnerit tuaj në komunikim. pepStatusInfo.title.r7=I sigurt & I besuar pepStatusInfo.info.r7=Ky mesazh është i sigurt dhe i besuar. pepStatusInfo.color.green=E gjelbër pepStatusInfo.color.yellow=E verdhë pepStatusInfo.color.red=E kuqe pepRevokeTrust.question=Doni vërtet të anuloni besueshmërinë për %S? pepRevokeMistrust.question=Doni vërtet të ribesoni kyçin për %S? pepRevokeTrust.doRevoke=Anuloja &besueshmërinë wksConfirmationReq=Kërkesë Ripohimi Liste Webkey wksConfirmationReq.message=Ky mesazh është dërguar nga furnizuesi juaj i shërbimit email, për të ripohuar futjen e kyçeve tuaj publikë OpenPGP\nnë Listën e tyre WebKey.\nDhënia e kyçeve tuaj publikë i ndihmon të tjerët të gjejnë kyçin tuaj dhe të jenë kështu në gjendje të fshehtëzojnë mesazhe për ju.\n\nNëse doni të vendoset tani kyçi juaj te Lista Web Key, ju lutemi, klikoni te shtylla e gjendjeve mbi butonin "Ripohoje Kërkesën".\nNë të kundërt, thjesht shpërfilleni këtë mesazh. wksConfirmationReq.button.label=Ripohije Kërkesën autocryptSetupReq=Kryej Rregullim Autocrypt-i autocryptSetupReq.button.label=Nise Rregullimin autocryptSetupReq.setupMsg.desc=Ky mesazh përmban krejt të dhënat për shpërnguljen e sigurt prej pajisjes tuaj origjinale të rregullimeve tuaja për Autocrypt, tok me kyçin tuaj të fshehtë. autocryptSetupReq.setupMsg.backup=Mund ta mbani këtë mesazh dhe ta përdorni si kopjeruajtje të kyçit tuaj të fshehtë. Nëse doni të bëhet kështu, duhet të shkruani fjalëkalimin diku dhe ta ruani në mënyrë të sigurt. autocryptSetupReq.message.import=Që të importohen në Enigmail rregullimet dhe kyçi(et), ju lutemi, klikoni te shtylla e gjendjeve mbi butonin "Nise Rregullimin". autocryptSetupReq.message.sent=Ju lutemi, klikoni mbi mesazhin te pajisja juaj e re dhe ndiqni udhëzimet për importim rregullimesh. # strings in pref-enigmail.js oldGpgVersion20=Gatitja e Enigmail-it dështoi.\n\nPo përdorni GnuPG version %1$S, që nuk mbulohet më. Enigmail-i lyp GnuPG version %2$S ose më të ri. Ju lutemi, përmirësoni instalimin tuaj të GnuPG-së, ose Enigmail-i nuk do të funksionojë. locateGpg=Lokalizoni programin GnuPG invalidGpgPath=GnuPG-ja nuk mund të ekzekutohet me shtegun e dhënë. Prandaj Enigmail-i është çaktivizuar, deri sa të ndryshoni sërish shtegun për te GnuPG-ja ose deri sa të rinisni aplikacionin. warningsAreReset=Krejt sinjalizimet u kthyen te parazgjedhjet. prefs.gpgFound=GnuPG-ja u gjet te %S prefs.gpgNotFound=S’u gjet dot GnuPG prefs.warnAskNever=Kujdes: aktivizimi i kësaj mundësie do të sjellë email-e të pafshehtëzuar, pa dhënë asnjë hollësi tjetër, nëse s’ka kyç për një nga marrësit -- Enigmail s’do t’ju njoftojë, nëse ndodh kjo! prefs.warnIdleTimeForUnknownAgent=Nuk lidhet dot me gpg-agent. Ndoshta sistemi juaj përdor ndonjë mjet të posaçëm për trajtim frazëkalimesh (p.sh. gnome-keyring, seahorse-agent, KDE wallet manager, ...). Për fat të keq, Enigmail-i s’e kontrollon dot intervalin kohor të vlefshmërisë së frazëkalimit për mjetin që po përdorni. Ndaj rregullimet mbi intervalin kohor përkatës te Enigmail-i nuk janë marrë parasysh. prefEnigmail.oneKeyserverOnly=Gabim - mund të përcaktoni vetëm një shërbyes kyçesh për shkarkim të vetvetishëm kyçesh OpenPGP që mungojnë. # Strings used in core.jsm # (said file also re-uses some strings from above) enterAdminPin=Ju lutemi, shtypni PIN ADMIN-in e Kartës tuaj të Mençur enterCardPin=Ju lutemi, shtypni PIN-in e Kartës tuaj të Mençur notInit=Gabim - shërbimi Enigmail ende i pagatitur badCommand=Gabim - urdhri i fshehtëzimit dështoi cmdLine=rresht urdhrash dhe output: notRequired=Gabim - nuk lypset fshehtëzim notComplete=Gabim - prodhim kyçesh ende i paplotësuar invalidEmail=Gabim - adresa email të pavlefshme noPassphrase=Gabim - s’u dha frazëkalim noPGPblock=Gabim - s’u gjet bllok i koracuar i vlefshëm të dhënash OpenPGP unverifiedReply=Ndoshta qe modifikuar pjesë e brendshme mesazhi (përgjigje) keyInMessageBody=U gjet kyç në lëndën e mesazhit. Klikoni mbi 'Importo Kyç' që të importohet kyçi sigMismatch=Gabim - Mospërputhje nënshkrimesh cantImport=Gabim në importim kyçi publik\n\n doImportOne=Të importohet %1$S (%2$S)? doImportMultiple=Të importohen kyçet vijues?\n\n%S previewFailed=S’lexohet dot kartela e kyçit publik. # Strings used in errorHandling.jsm sc.wrongCardAvailable=Karta e Mençur %1$S e gjetur te lexuesi juaj s’mund të përdoret për të përpunuar këtë mesazh.\nJu lutemi, futni Kartën tuaj të Mençur %2$S dhe përsëritni veprimin. sc.insertCard=Veprimi lyp Kartën tuaj të Mençur %S.\nJu lutemi, futni Kartën e Mençur të kërkuar dhe përsëritni veprimin. sc.removeCard=Veprimi nuk lyp pasjen e një Karte të Mençur te lexuesi.\nJu lutemi, hiqeni Kartën tuaj të Mençur dhe përsëritni veprimin. sc.noCardAvailable=S’u gjet Kartë e Mençur te lexuesi juaj\nJu lutemi, futni Kartën tuaj të Mençur dhe përsëritni veprimin. sc.noReaderAvailable=S’u fut dot te lexuesi juaj i Kartave të Mençura\nJu lutemi, vendosni lexuesin tuaj të Kartave të Mençura, futni kartën tuaj dhe përsëritni veprimin. keyError.keySpecNotFound=Adresës email "%S" s’i gjendet dot një kyç te vargu juaj i kyçeve. keyError.keyIdNotFound=ID-ja e formësuar e kyçit "%S" s’gjendet dot te vargu juaj i kyçeve. keyError.resolutionAction=Ju lutemi, përzgjidhni një kyç të vlefshëm, te ndarja OpenPGP e Rregullimeve tuaja për Llogarinë. missingPassphrase=Mungon frazëkalim errorHandling.gpgAgentInvalid=Sistemi juaj xhiron një version të gpg-agent që s’është i përshtatshëm për versionin tuaj të GnuPG-së. errorHandling.gpgAgentError=GnuPG-ja njoftoi një gabim te ndërlidhja me gpg-agent (një përbërës i GnuPG-së). errorHandling.dirmngrError=GnuPG-ja njoftoi një gabim në ndërlidhjen me dirmngr (një përbërës i GnuPG-së). errorHandling.pinentryError=GnuPG-ja s’mund të kërkojë për frazëkalimin tuaj me pinentry. errorHandling.readFaq=Ky është një gabim rregullimi sistemi ose formësimi që e pengon Enigmail-in të funksionojë si duhet dhe s’mund të ndreqet vetvetiu.\n\nKëshillojmë me forcë që të shihni te sajti ynë i asistencës, https://enigmail.net/faq. gpgNotFound=S’arrihet të lokalizohet programi GnuPG '%S'.\nSigurohuni që e keni caktuar saktë shtegun për te i ekzekutueshmi GnuPG te Parapëlqimet për Enigmail-in. gpgNotInPath=S’arrihet të lokalizohet programi GnuPG te SHTEGU.\nSigurohuni që e keni caktuar saktë shtegun për te i ekzekutueshmi GnuPG te Parapëlqimet për Enigmail-in. enigmailNotAvailable=Shërbimi bazë Enigmail jo gati prefGood=Nënshkrim i mirë nga %S prefBad=Nënshkrim i KEQ nga %S failCancel=Gabim - Marrja e kyçit u anulua nga përdoruesi failNoServer=Gabim - S’u tregua shërbyes kyçesh prej nga të merret kyçi failNoID=Gabim - S’u tregua ID kyçi për të cilin të merret kyçi failKeyExtract=Gabim - urdhri për përftim kyçi dështoi notFirstBlock=Gabim - Blloku i parë te OpenPGP s’është bllok kyçi publik importKeyConfirm=Të importohet i trupëzuar në mesazh kyçi(kyçet) publik? failKeyImport=Gabim - importimi i kyçit dështoi fileWriteFailed=Dështoi shkrimi në kartelën %S importKey=Importoni kyçin publik %S prej shërbyesit të kyçeve: uploadKey=Dërgoje kyçin publik %S te shërbyesi i kyçeve: keyId=ID Kyçi keyAndSigDate=ID Kyçi: 0x%1$S / Nënshkruar më: %2$S keyFpr=Shenja gishtash kyçi: %S noEmailProvided=Nuk dhatë ndonjë adresë email! keyAlreadySigned=Kyçi është tashmë i nënshkruar, s’mund ta nënshkruani dy herë. ##################################################################### # Strings used in enigmailKeySelection.js ##################################################################### selKeyExpired=Skaduar më %S createdHeader=Krijuar më atLeastOneKey=S’u përzgjodh kyç! Duhet të përzgjidhni të paktën një kyç që të pranohet ky dialog fewerKeysThanRecipients=Keni përzgjedhur një numër kyçesh më të vogël se sa numri i marrësve. Jeni i sigurt se lista e kyçeve për fshehtëzim është e plotë? userSel.button.goBack=Përzgjidhni më tepër Kyçe userSel.secretKeySel.title=Përzgjidhni një Kyç të Fshehtë OpenPGP Që të Nënshkruani Mesazhit Tuaj userSel.problemNoKey=Pa kyç të vlefshëm userSel.problemMultipleKeys=Shumë kyçe # should be same as thunderbird ENTITY sendLaterCmd.label: sendLaterCmd.label=Dërgoje Më Vonë # Strings used in enigmailAttachmentDialog.js pgpMimeNote=SHËNIM: PGP/MIME nuk mbulohet nga të tërë klientët email. Nëse jeni i pasigurt, përzgjidhni mundësinë %S. first=i pari second=i dyti # Strings used in am-enigprefs.js / enigmailEditIdentity.js encryptKeyHeader=Përzgjidhni Kyç OpenPGP për Fshehtëzim identityName=Identitet: %S switchPepMode=Po përdorni mënyrën 'p≡p Junior' të Enigmail-it.\n\nDuke aktivizuar OpenPGP ose S/MIME për një llogari, çaktivizohet p≡p dhe përdoret mënyra 'regular' e Enigmail-it, pa p≡p. enableEnigmail=&Çaktivizoje p≡p # Strings used in enigmailSingleRcptSettings.js noEncryption=Keni aktivizuar fshehtëzimin, por s’keni përzgjedhur kyç. Që të fshehtëzohen email-et e dërguar për %1$S, lypset të përcaktoni prej listës suaj të kyçeve një ose disa kyçe të vlefshëm. Doni të çaktivizohet fshehtëzimi për %2$S? noKeyToUse=(asnjë - pa fshehtëzim) noEmptyRule=Rregulli nuk mund të jetë i zbrazët! Ju lutemi, vendosni një adresë email te fusha Rregull. invalidAddress=Adresa(t) email që keni dhënë nuk janë të vlefshme. Nuk duhet të caktoni emra marrësish, thjesht adresat email. P.sh.:\nI pavlefshëm: Njëfarë Emri \nI vlefshëm: njëfarë.emri@address.net noCurlyBrackets=Kllapat gjarpërushe {} kanë një domethënie të veçantë dhe nuk duhen përdorur në adresa email. Nëse doni të ndryshoni mënyrën se si kërkohet për përputhje me këtë rregull, përdorni mundësinë 'Zbatoje rregullin nëse marrësi ...'.\nMë tepër të dhëna gjeni që nga butoni Ndihmë. # Strings used in enigmailRulesEditor.js never=Kurrë always=Përherë possible=E mundshme deleteRule=Të fshihet vërtet rregulli i përzgjedhur? nextRcpt=(Marrësi pasues) negateRule=Jo addKeyToRule=Shtoje kyçin %1$S (%2$S) te rregull sipas-marrësish # Strings used in enigmailSearchKey.js needOnline=Funksioni që keni përzgjedhur nuk mund të kihet nën mënyrën offline. Ju lutemi, lidhuni në internet dhe riprovoni. protocolNotSupported=Protokolli '%S://' që keni përzgjedhur nuk mbulohet për shkarkim kyçesh OpenPGP. gpgkeysDisabled=Aktivizimi i mundësisë 'extensions.enigmail.useGpgKeysTool' mund të ndihmonte këtu. noKeyserverConn=S’u lidh dot me shërbyesin e kyçeve te %S. keyDownloadFailed=Dështoi në shkarkim kyçesh nga shërbyesi i kyçeve. Mesazhi përkatës është:\n%S internalError=Ndodhi një gabim i brendshëm. Kyçet s’u shkarkuan ose importuan dot. noKeyFound=Na ndjeni, s’u gjet dot ndonjë kyç që të kishte përputhje me kriterin e dhënë për kërkim.\nJu lutemi, kini parasysh që ID-ja e kyçit duhet të paraprihet me "0x" (p.sh. 0xABCDEF12). keyDownload.keyUnavailable=Na ndjeni, por kyçi me ID %S s’është i passhëm te shërbyesi i kyçeve. Ka shumë mundësi që i zoti i kyçit të mos e ketë ngarkuar kyçin e tij te shërbyesi i kyçeve.\n\nPlease ask the sender of the message to send you their key by email. # gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. gpgKeysFailed=Dështoi në kërkim ose shkarkim kyçesh prej shërbyesi kyçesh: gpgkeys_%S s’u ekzekutua dot. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Caktimi i besueshmërisë së pronarit dështoi # Strings in enigmailSignKeyDlg.js signKeyFailed=Nënshkrimi i kyçit dështoi alreadySigned.label=Shënim: kyçi %S është tashmë i nënshkruar me kyçin e fshehtë të përzgjedhur. alreadySignedexportable.label=Shënim: kyçi %S është nënshkruar tashmë si i eksportueshëm me kyçin privat të përzgjedhur. Një nënshkrim vendor s’ka kuptim. partlySigned.label=Shënim: disa ID përdoruesi për kyçin %S janë nënshkruar tashmë me kyçin e fshehtë të përzgjedhur. noTrustedOwnKeys=S’u gjet kyç që mund të përdoret për nënshkrime! Që të mund të nënshkruani kyçe, ju duhet të paktën një kyç privat i besuar plotësisht. # Strings in enigmailKeyManager.js keyMan.loadingKeys=Po ngarkohen kyçe, ju lutemi, prisni ... keyValid.unknown=i panjohur keyValid.invalid=i pavlefshëm keyValid.disabled=i çaktivizuar keyValid.revoked=i shfuqizuar keyValid.expired=i skaduar keyValid.noSubkey=pa nënkyç të vlefshëm keyTrust.untrusted=jo i besuar keyTrust.marginal=me raste keyTrust.full=i besuar keyTrust.ultimate=përfundimisht keyTrust.group=(grup) keyType.public=publik keyType.publicAndSec=pub/fshe keyMan.enableKey=Aktivizoje kyçin keyMan.disableKey=Çaktivizoje kyçin userAtt.photo=Atribut përdoruesi (figurë JPEG) asciiArmorFile=ASCII Armored Files (*.asc) importKeyFile=Importo Kartelë Kyçi OpenPGP gnupgFile=Kartela GnuPG createKeyOK=Kyçi juaj u prodhua saveRevokeCertAs=Krijoni & Ruani Dëshmi Shfuqizimi revokeCertOK=Dëshmia e shfuqizimeve u krijua me sukses. Mund ta përdorni që të shfuqizoni kyçin tuaj publik, p.sh. në rast se humbni kyçin tuaj të fshehtë. revokeCertFailed=Dëshmia e shfuqizimit s’u krijua dot. addUidOK=ID-ja e përdoruesit u shtua me sukses addUidFailed=Shtimi i ID-së së Përdoruesit dështoi noKeySelected=Duhet të përzgjidhni të paktën një kyç, që të mund të përmbushet veprimi i përzgjedhur exportToFile=Eksportojeni Kyçin Publik Në Kartelë exportKeypairToFile=Eksporto Kyçin e Fshehtë dhe atë Publik në Kartelë exportSecretKey=Dëshironi ta përfshini kyçin tuaj të fshehtë te kartela e ruajtur e kyçit OpenPGP? saveKeysOK=Kyçet u ruajtën me sukses saveKeysFailed=Ruajtja e kyçeve dështoi importKeysFailed=Importimi i kyçeve dështoi enableKeyFailed=Aktivizimi/çaktivizimi i kyçeve dështoi specificPubKeyFilename=%1$S (0x%2$S) publik specificPubSecKeyFilename=%S (0x%S) pub-fshe defaultPubKeyFilename=Kyçe-publikë-të-eksportuar defaultPubSecKeyFilename=Kyçe-publikë-dhe-të-fshehtë-të-eksportuar noSecretKeys=S’u gjetën kyçe të fshehtë.\n\nDoni ta prodhoni tani kyçin tuaj? sendKeysOk=Kyçet u dërguan me sukses sendKeysFailed=Dërgimi i kyçeve dështoi receiveKeysOk=Kyçet u përditësuan me sukses receiveKeysFailed=Shkarkimi i kyçeve dështoi importFromClip=Doni të importoni ndonjë kyç(disa kyçe) nga e papastra? importFromUrl=Shkarkoje kyçin publik prej kësaj URL-je: copyToClipbrdFailed=S’u kopjua(n) dot kyçi(et) i(e) përzgjedhur te e papastra. copyToClipbrdOK=Kyçet u kopjuan te e papastra deleteSecretKey=KUJDES: Ju ndan një hap nga fshirja e një kyçi të fshehtë!\nNëse fshini kyçin tuaj të fshehtë, nuk do të jeni më në gjendje të fshehtëzoni dhe shfshehtëzoni mesazhe të fshehtëzuar për atë kyç, dhe nuk mund ta shfuqizoni më kyçin tuaj.\n\nDoni vërtet t’i fshini QË TË DY, kyçin e fshehtë dhe atë publik\n'%S'? deleteMix=KUJDES: Ju ndan një hap nga fshirja e kyçeve të fshehtë!\nNëse fshini kyçin tuaj të fshehtë, nuk do të jeni më në gjendje të fshehtëzoni dhe shfshehtëzoni mesazhe të fshehtëzuar për atë kyç.\n\nDoni vërtet t’i fshini QË TË DY, kyçin e fshehtë të përzgjedhur dhe atë publik? deletePubKey=Doni ta fshini kyçin publik\n'%S'? deleteSelectedPubKey=Doni t’i fshini kyçet publikë? deleteKeyFailed=Kyçi s’u fshi dot. revokeKeyQuestion=Ju ndan një hap nga shfuqizimi i kyçit '%S'.\n\nNuk do të jeni më në gjendje të nënshkruani me këtë kyç, dhe pasi të shpërndahet, të tjerët nuk do të jenë më në gjendje të fshehtëzojnë me këtë kyç. Mundeni prapëseprapë ta përdorni kyçin për shfshehtëzimin e mesazhe të vjetër.\n\nDoni të vazhdoni? revokeKeyOk=Kyçi është shfuqizuar. Nëse kyçi juaj gjendet te një shërbyes kyçesh, këshillohet ta ringarkoni, që të tjerët të mund ta vënë re shfuqizimin. revokeKeyFailed=Kyçi s’u shfuqizua dot. revokeKeyNotPresent=S’keni kyç (0x%S) që hyn në këtë dëshmi shfuqizimesh!\n\nNëse keni humbur kyçin tuaj, duhet ta importoni (për shembull, nga një shërbyes kyçesh) përpara dëshmisë së shfuqizimit! revokeKeyAlreadyRevoked=Kyçi 0x%S është i shfuqizuar tashmë. refreshAllQuestion=Nuk përzgjodhët ndonjë kyç. Do të donit të rifreskonit KREJT kyçet? refreshKeyServiceOn.warn=Kujdes: Kyçet tuaj po rifreskohen në prapaskenë, aq pa rrezik sa është e mundur.\nRifreskimi i krejt kyçeve tuaj njëherësh do të zbulojë, pa qenë nevoja, të dhëna rreth jush.\nDoni vërtet ta bëni këtë? refreshKey.warn=Kujdes: në varësi të numrit të kyçeve dhe shpejtësisë së lidhjes, rifreskimi i krejt kyçeve mund të jetë një proces ca i gjatë! downloadContactsKeys.warn=Kujdes: në varësi të numrit të kontakteve dhe shpejtësisë së lidhjes, shkarkimi i krejt kyçeve mund të jetë një proces ca i gjatë! downloadContactsKeys.importFrom=Të importohen kontakte prej librit të adresave '%S'? keyMan.button.exportSecKey=Eksporto Kyçe të &Fshehtë keyMan.button.exportPubKey=Eksporto Vetëm Kyçe &Publikë keyMan.button.import=&Importo keyMan.button.refreshAll=&Rifresko Krejt Kyçet keyMan.button.revokeKey=&Shfuqizoje Kyçin keyMan.button.skip=&Anashkaloje Kyçin keylist.noOtherUids=Nuk ka identitete të tjerë keylist.hasOtherUids=I njohur edhe si keylist.noPhotos=Nuk ka fotografi keylist.hasPhotos=Fotografi keyMan.addphoto.filepicker.title=Përzgjidhni foto për shtim keyMan.addphoto.warnLargeFile=Kartela që keni zgjedhur është më e madhe se sa 25 kB.\nNuk këshillohet të shtoni kartela shumë të mëdha, ngaqë kështu kyçet bëhen shumë të mëdhenj. keyMan.addphoto.noJpegFile=Kartela e përzgjedhur nuk duket se është kartelë JPEG. Ju lutemi, zgjidhni një tjetër kartelë. keyMan.addphoto.failed=Fotoja s’u shtua dot. noWksIdentity=Kyçi %S nuk ka identitet WKS. keyman.addBlacklistKey.msg=Doni vërtet të ndalni përdorimin nga p≡p të kyçit "%1$S (%2$S)" për fshehtëzim mesazhesh? keyman.removeBlacklistKey.msg=Doni të lejoni p≡p të përdorë kyçin "%1$S (%2$S)" për mesazhe të ardhshëm? keyman.addBlacklistKey.button=Shtojeni kyçin në &listë të zezë keyman.removeBlacklistKey.button=&Hiqe kyçin nga Lista e zezë # Strings in enigmailManageUidDlg.xul changePrimUidFailed=Ndryshimi i ID-së parësore të Përdoruesit dështoi changePrimUidOK=ID-ja parësore e përdoruesit u ndryshua me sukses revokeUidFailed=Shfuqizimi i ID-së së përdoruesit %S dështoi revokeUidOK=ID-ja e përdoruesit %S u shfuqizuar me sukses. Nëse kyçi juaj gjendet te një shërbyes kyçesh, këshillohet ta ringarkoni, që të tjerët të mund ta vënë re shfuqizimin. revokeUidQuestion=Doni vërtet të shfuqizoni ID-në e përdoruesit %S? # Strings in enigmailKeyImportInfo.xul importInfoTitle=SUKSES! Kyçet u importuan importInfoBits=Bit importInfoCreated=Krijuar më importInfoFpr=Shenja gishtash importInfoDetails=(Hollësi) importInfoNoKeys=S’u importuan kyçe. # Strings in enigmailKeyDetailsDlg.xul keyTypePublic=kyç publik keyTypePrimary=kyç parësor keyTypeSubkey=nënkyç keyTypePair=çift kyçesh keyExpiryNever=kurrë keyAlgorithm_1=RSA keyAlgorithm_2=RSA keyAlgorithm_3=RSA keyAlgorithm_16=ELG keyAlgorithm_17=DSA keyAlgorithm_18=ECC keyAlgorithm_19=ECC keyAlgorithm_20=ELG keyAlgorithm_22=EDDSA keyUsageEncrypt=Fshehtëzoje keyUsageSign=Nënshkruaje keyUsageCertify=Dëshmoje keyUsageAuthentication=Mirëfilltësim keyDoesNotExpire=Kyçi nuk skadon # Strings in enigmailGenCardKey.xul keygen.started=Ju lutemi, prisni, ndërkohë që po prodhohet kyçi .... keygen.completed=Kyçi u Prodhua. ID-ja e kyçit të ri është: 0x%S keygen.keyBackup=Kyçi u kopjeruajt si %S keygen.passRequired=Ju lutemi, përcaktoni një frazëkalim, nëse dëshironi të krijoni një kopjeruajtje të kyçit juaj jashtë Kartës suaj të Mençur. # Strings in enigmailSetCardPin.xul cardPin.processFailed=Dështoi në ndryshim PIN-i # Strings in enigRetrieveProgres.xul keyserverProgress.refreshing=Kyçet po rifreskohen, ju lutemi, prisni ... keyserverProgress.uploading=Kyçet po ngarkohen, ju lutemi, prisni ... keyserverProgress.wksUploadFailed=S’u ngarkua dot kyçi juaj te Shërbimi Webkey keyserverProgress.wksUploadCompleted=Kyçi juaj publik u parashtrua me sukses te furnizuesi juaj i internetit. Do të merrni një email për ripohimin e faktit se ngarkimin e nisët ju. keyserverTitle.refreshing=Rifreskoni Kyçet keyserverTitle.uploading=Ngarkim Kyçi # Strings in enigmailSetupWizard passphrase.min8keys=Frazëkalimi juaj duhet të përmbajë të paktën 8 shenja! setupWizard.reallyCancel=Doni ta mbyllni vërtet Ndihmësin e Rregullimit të Enigmail-it? setupWizard.invalidGpg=Kartela që keni treguar s’është i ekzekutueshëm GnuPG-je. Ju lutemi, përcaktoni një kartelë tjetër. setupWizard.specifyFile=Që të mund të vazhdohet, lypset të përcaktoni të paktën një kartelë kyçi publik. setupWizard.installFailed=Duket se instalimi s’qe i suksesshëm. Ju lutemi, ose riprovoni instalimin, ose instalojeni GnuPG-në dorazi dhe lokalizojeni duke përdorur butonin Shfletoni. setupWizard.downloadForbidden=Për hir të sigurisë tuaj, nuk do ta shkarkojmë GnuPG-në. Ju lutemi, që të shkarkoni GnuPG-në, vizitoni https://gnupg.org/. setupWizard.downloadImpossible=S’shkarkojmë dot GnuPG-në. Ju lutemi, provoni më vonë ose vizitoni https://gnupg.org/ që të mund të shkarkoni GnuPG-në. setupWizard.hashSumError=Ndihmësi s’verifikoi dot pacenueshmërinë e kartelës së shkarkuar. Kartela mund të jetë e dëmtuar ose e manipuluar. Doni të vazhdohet instalimi, sido që të jetë? setupWizard.importSettingsFile=Përcaktoni kartelë kopjeruajtjeje prej nga të ngarkohet setupWizard.invalidSettingsFile=Kartela e treguar s’është kartelë e saktë kopjeruajtjeje Rregullimesh Enigmail-i. setupWizard.gpgConfExists=Kartela e formësimit të GnuPG-së ekziston tashmë. Doni të mbishkruhet me atë prej instalimit tuaj të vjetër? setupWizard.noGpgHomeDir=Duket se e keni formësuar %S të përdorë GnuPG-në. Por, kjo s’është një drejtori - s’mund ta përdorni. setupWizard.unmachtedIds=Identitetet vijues të rregullimit tuaj të vjetër nuk u përputhën dot me gjë:\n%S\nRregullimet për këto identitete u anashkaluan. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=Ndodhi një gabim teksa provohej të shkarkohej GnuPG-ja. Ju lutemi, për hollësi të mëtejshme kontrolloni regjistrin e konsolës. installGnuPG.installFailed=Ndodhi një gabim teksa instalohej GnuPG-ja. Ju lutemi, për hollësi të mëtejshme kontrolloni regjistrin e konsolës. # Strings in enigmailAddUidDlg.xul addUidDlg.nameOrEmailError=Duhet të plotësoni një emër dhe një adresë email addUidDlg.nameMinLengthError=Emri duhet të ketë e pakta 5 shenja addUidDlg.invalidEmailError=Duhet të jepni një adresë email të vlefshme # Strings in enigmailCardDetails.js Carddetails.NoASCII=Kartat e mençura OpenPGP mbulojnë vetëm shenja ASCII për Emër/Mbiemër. # network error types errorType.SecurityCertificate=Dëshmia e sigurisë e paraqitur nga shërbimi web s’është e vlefshme. errorType.SecurityProtocol=Protokolli i sigurisë i përdorur nga shërbimi web është i panjohur. errorType.Network=Ndodhi një gabim rrjeti. # filter stuff filter.folderRequired=Duhet të përzgjidhni një dosje destinacion filter.decryptMove.label=Shfshehtëzoje përgjithmonë (Enigmail) filter.decryptCopy.label=Krijo Kopje të shfshehtëzuar (Enigmail) filter.decryptMove.warnExperimental=Kujdes - veprimi "Sfshehtëzoje përgjithmonë" mund të shpjerë në shkatërrim mesazhesh.\n\nKëshillojmë me forcë që së pari të provoni filtrin "Krijo Kopje të shfshehtëzuar", të provoni me kujdes përfundimin, dhe të filloni ta përdorni këtë filtër vetëm pasi të jeni të kënaqur me përfundimin. filter.tempPepFilterDesc=Filtër për të depozituar të pafshehtëzuar mesazhe të dërguar filter.term.pgpencrypted.label=Fshehtëzuar me OpenPGP filter.encrypt.label=Fshehtëzoje me kyçin (Enigmail) filter.keyRequired=Duhet të përzgjidhni një kyç marrësi. filter.keyNotFound=S’u gjet kyç fshehtëzimi për "%S". filter.warn.keyNotSecret=Kujdes - veprimi i "Fshehtëzoje me kyç" zëvendëson marrësit.\n\nNëse nuk e keni kyçin e fshehtë për "%S", s’do të jeni më në gjendje të lexoni email-et. # strings in enigmailConvert.jsm converter.decryptBody.failed=Nuk shfshehtëzoi dot mesazhin me subjekt\n"%S".\nDoni të riprovoni me një tjetër frazëkalim apo doni të anashkalohet mesazhi? converter.decryptAtt.failed=Nuk shfshehtëzoi dot bashkëngjitjen "%1$S"\ne mesazhit me subjekt\n"%2$S".\nDoni të riprovoni me një tjetër frazëkalim apo doni të anashkalohet mesazhi? saveLogFile.title=Ruaje Kartelën Regjistër # strings in gpg.jsm unknownSigningAlg=Algoritëm i panjohur nënshkrimesh (ID: %S) unknownHashAlg=Hash kriptografik i panjohur (ID: %S) # strings in keyRing.jsm keyring.photo=Foto keyRing.pubKeyRevoked=Kyçi %1$S (ID kyçi %2$S) është shfuqizuar. keyRing.pubKeyExpired=Kyçi %1$S (ID kyçi %2$S) ka skaduar. keyRing.pubKeyNotForSigning=Kyçi %1$S (ID kyçi %2$S) s’mund të përdoret për nënshkirime. keyRing.pubKeyNotForEncryption=Kyçi %1$S (ID kyçi %2$S) s’mund të përdoret për fshehtëzim. keyRing.keyDisabled=Kyçi %1$S (ID kyçi %2$S) është i çaktivizuar; s’mund të përdoret. keyRing.keyNotTrusted=Kyçi %1$S (ID kyçi %2$S) s’është mjaftueshmërisht i besueshëm. Ju lutemi, që ta përdorni për nënshkrime, caktojani kyçit tuaj shkallën e besimit si "përfundimisht". keyRing.keyInvalid=Kyçi %1$S (ID kyçi %2$S) është i pavlefshëm (p.sh. s’ka vetënënshkrim). keyRing.signSubKeysRevoked=Janë të shfuqizuar krejt nënkyçet nënshkrues të kyçit %1$S (ID kyçi %2$S). keyRing.signSubKeysExpired=Kanë skaduar krejt nënkyçet nënshkrues të kyçit %1$S (ID kyçi %2$S). keyRing.signSubKeysUnusable=Krejt nënkyçet nënshkrues të kyçit %1$S (ID kyçi %2$S) janë të shfuqizuar, kanë skaduar ose janë të papërdorshëm. keyRing.encSubKeysRevoked=Janë të shfuqizuar krejt nënkyçet fshehtëzues të kyçit %1$S (ID kyçi %2$S). keyRing.encSubKeysExpired=Kanë skaduar krejt nënkyçet fshehtëzues të kyçit %1$S (ID kyçi %2$S). keyRing.noSecretKey=S’duket se keni kyçin e fshehtë për %1$S (ID kyçi %2$S) te vargu juaj i kyçeve; s’mund ta përdorni kyçin për nënshkrime. keyRing.encSubKeysUnusable=Krejt nënkyçet fshehtëzues të kyçit %1$S (ID kyçi %2$S) janë të shfuqizuar, kanë skaduar ose janë të papërdorshëm. #strings in exportSettingsWizard.js cannotWriteToFile=S’ruhet dot te kartela file '%S'. Ju lutemi, përzgjidhni një kartelë tjetër. dataExportError=Ndodhi një gabim gjatë eksportimit të të dhënave tuaja. enigmailSettings=EnigmailSettings defaultBackupFileName=Enigmail-export specifyExportFile=Caktoni emër kartele për eksportim homedirParamNotSUpported=Për eksportimin/rikthimin e rregullimeve tuaja nuk mbulohen parametra shtesë që formësojnë shtigje, të tillë si --homedir dhe --keyring . Ju lutemi, përdorni metoda alternative, të tilla si rregullimi i ndryshores së mjedisit GNUPGHOME. #strings in expiry.jsm expiry.keyExpiresSoon=Kyçi juaj %1$S do të skadojë në më pak se %2$S ditë.\n\nKëshillojmë që të krijoni një dyshe të re kyçesh dhe të formësoni llogaritë përkatëse për përdorim të kyçit të ri. expiry.keysExpireSoon=Sa vijon nga kyçet tuaj do të skadojë në më pak se %1$S ditë:\n%2$S Rekomandojmë të krijoni kyçe të rinj dhe të formësoni llogaritë tuaja të përdorin kyçet e rinj. expiry.keyMissingOwnerTrust=Kyçit tuaj të fshehtë %S i mungon besueshmëria.\n%S.\nKëshillojmë që "Bazoheni në dëshmi" t’i përshoqëroni vlerën Përfundimisht, te vetitë e kyçit. expiry.keysMissingOwnerTrust=Kyçit vijues nga kyçet tuaj të fshehtë i mungon besueshmëria.\n%S.\nKëshillojmë që "Bazoheni në dëshmi" t’i përshoqëroni vlerën Përfundimisht, te vetitë e kyçit. expiry.OpenKeyManager=Hap Administrim Kyçesh Enigmail expiry.OpenKeyProperties=Veti Kyçi të Hapur #strings in pEpDecrypt.jsm pEpDecrypt.cannotDecrypt=Ky është një mesazh i fshehtëzuar. Për fat të keq, nuk keni kyçin privat për të shfshehtëzuar mesazhin. #strings in gpgAgent.jsm gpghomedir.notexists=Drejtoria '%S' që përmban kyçet tuaj OpenPGP nuk ekziston dhe s’mund të krijohet. gpghomedir.notwritable=Drejtoria '%S' që përmban kyçet tuaj OpenPGP s’është e shkrueshme. gpghomedir.notdirectory=Drejtoria '%S' që përmban kyçet tuaj OpenPGP është një kartelë, në vend se një drejtori. gpghomedir.notusable=Ju lutemi, ndreqni lejet mbi drejtorinë ose ndryshoni vendin e drejtorisë tuaj GnuPG "home". Përndryshe GnuPG-ja s’mund të funksionojë si duhet. #strings in pepTrustWords.js pepTrustWords.cannotVerifyOwnId=S’verifikohen dot Trustwords p≡p për llogarinë tuaj. pepTrustWords.cannotFindKey=S’gjendet dot kyç për %S. pepTrustWords.cannotStoreChange=S’u ndryshua dot besueshmëria për %S. pepTrustWords.generalFailure=S’merren dot trustwords për %S. pepTrustWords.partnerFingerprint=Shenja gishtash për %S: #strings in mimeWkdHandler.jsm wkdMessage.body.req=Furnizuesi i shërbimit tuaj email e përpunoi kërkesën tuaj për ngarkim kyçi publik te Lista e Kyçeve Web OpenPGP.\n\nJu lutemi, klikoni butonin e ripohimit te Enigmail-i që të plotësohet publikimi i kyçit tuaj publik. wkdMessage.body.process=Ky është një email lidhur me përmbushjen automatike të ngarkimit të kyçit tuaj publik te Lista e Kyçeve Web OpenPGP.\n\nNë këtë pikë, s’ju duhet të ndërmerrni ndonjë veprim dorazi. #strings in pepHandshake.js pepPrivacyStatus.RatingBrokenSuggestion=Ose ju, ose dërguesi duhet ta ridërgojë mesazhin. pepPrivacyStatus.RatingHaveNoKeySuggestionOutgoing=Nëse këtë mesazh e hartuar ju, kyçi juaj s’është i passhëm. pepPrivacyStatus.RatingMistrustSuggestion=Rivendosni lidhjen me partnerin tuaj të komunikimit dhe provoni të plotësoni një tjetër duarshtrëngim. pepPrivacyStatus.RatingReliableSuggestion=Plotësoni një duarshtrëngim me partnerin tuaj të komunikimit duke shkëmbyer trustwords me atë vetë ose me telefon. Duarshtrëngimi është i nevojshëm vetëm një herë për partner dhe do të garantojë komunikim të sigurt dhe të besueshëm. pepPrivacyStatus.RatingTrustedSuggestion=S’ka nevojë për veprim! pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Kini parasysh që ky mesazh mund të mos jetë i sigurt. pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Ju lutemi, shtoni të dhënat e nevojshme. pepPrivacyStatus.RatingUnderAttackSuggestion=Verifikoni ndarazi lëndën e këtij mesazhi me partnerin e komunikimit tuaj. pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Sigurohuni që gjendja e privatësisë për çdo partner komunikimi të pranishëm në listë të jetë të paktën e sigurt. pepPrivacyStatus.RatingUnencryptedSuggestion=Ju lutemi, kërkojini partnerit tuaj në komunikim një zgjidhje për fshehtëzim ose instaloni p≡p. pepPrivacyStatus.RatingUnreliableSuggestion=Ky mesazh nuk ka as fshehtëzim të besueshëm, as nënshkrim të besueshëm. Kërkojini partnerit tuaj të komunikimt të përmirësojë metodën e tij për fshehtëzimet ose të instalojë p≡p. pepPrivacyStatus.RatingBrokenExplanation=Ky mesazh ka fshehtëzim ose formatim të dëmtuar. pepPrivacyStatus.RatingHaveNoKeyExplanation=Ky mesazh nuk shfshehtëzohet dot, ngaqë kyçi s’është i passhëm. pepPrivacyStatus.RatingMistrustExplanation=Ky mesazh ka një partner komunikimi të cilit më parë i është vënë shenjë si i mosbesuar. pepPrivacyStatus.RatingReliableExplanation=Ky mesazh është i sigurt, por ende ju duhet të verifikoni identitetin e partnerit tuaj në komunikim. pepPrivacyStatus.RatingTrustedExplanation=Ky mesazh është i sigurt dhe i besuar. pepPrivacyStatus.RatingUndefinedExplanation=Ky mesazh nuk përmban të dhëna të mjaftueshme për të përcaktuar nëse është i sigurt. pepPrivacyStatus.RatingUnderAttackExplanation=Ky mesazh s’është i sigurt dhe mbi të është vënë dorë. pepPrivacyStatus.RatingUnencryptedExplanation=Ky mesazh është i pasigurt. pepPrivacyStatus.RatingUnencryptedForSomeExplanation=Ky mesazh është i pasigurt për disa partnerë komunikimi. pepPrivacyStatus.RatingUnreliableExplanation=Ky mesazh ka mbrojtje të paqëndrueshme. pepPrivacyStatus.RatingBrokenText=I dëmtuar pepPrivacyStatus.RatingHaveNoKeyText=Nuk Shfshehtëzon Dot pepPrivacyStatus.RatingMistrustText=I mosbesuar pepPrivacyStatus.RatingReliableText=I sigurt pepPrivacyStatus.RatingTrustedText=I sigurt & I besuar pepPrivacyStatus.RatingUndefinedText=E panjohur pepPrivacyStatus.RatingUnderAttackText=Po Sulmoheni pepPrivacyStatus.RatingUnencryptedForSomeText=I pasigurt për Disa pepPrivacyStatus.RatingUnencryptedText=E pasigurt pepPrivacyStatus.RatingUnreliableText=Sigurie e Paqëndrueshme handshakeDlg.button.initHandshake=Duarshtrëngim… handshakeDlg.button.stopTrust=Resht Së Besuari handshakeDlg.button.reTrust=Ndale Mosbesimin handshakeDlg.label.outgoingMessage=Mesazh ikës handshakeDlg.label.incomingMessage=Mesazh ardhës handshakeDlg.error.noPeers=S’bëhet dot duarshtrëngim pa ndonjë korrespondent. handshakeDlg.error.noProtection=Ju lutemi, që të mund të përdorni funksionin Handshake, aktivizoni mbrojtjen. enigmail.acSetupPasswd.descEnterPasswd=Ju lutemi, jepni kodin e rregullimit që shfaqet te pajisja tjetër enigmail.acSetupPasswd.descCopyPasswd=Ju lutemi, që të vazhdohet me rregullimin, jepni te pajisja juaj tjetër kodin e rregullimit më poshtë #strings in autocrypt.jsm autocrypt.setupMsg.subject=Mesazhi Rregullimi Autocrypt-i autocrypt.setupMsg.msgBody=Që të rregulloni pajisjen tuaj të re për Autocrypt-in, ju lutemi, ndiqni udhëzimet që duhet të shfaqen nga pajisja juaj e re. autocrypt.setupMsg.fileTxt=Kjo është kartela e rregullimit të Autocrypt-it e përdorur për të shpërngulur rregullime dhe kyçe mes klientësh. Mund ta shfshehtëzoni duke përdorur kodin e rregullimit të paraqitur te pajisja juaj e vjetër, dhe mandej të importoni kyçin e atyshëm te vargu juaj i kyçeve. #strings in upgradeInfo.html upgradeInfo.doctitle=Ç’ka të Re te Enigmail v2.0? upgradeInfo.welcome1=Mirë se vini te versioni i ri i 2.0 i Enigmail-it! upgradeInfo.welcome2=Hedhja në qarkullim përmban plot veçori të reja dhe të përmirësuara. Ju lutemi, ndaluni një minutë të shihni ç’ka të re: upgradeInfo.encSubject.title=Fshehtëzim Subjekti Mesazhi upgradeInfo.encSubject.desc=Krijuam një metodë të re që e kalon subjektin e email-it te mesazhi i fshehtëzuar, dhe zëvendëson subjektin e dukshëm me "Mesazh i Fshehtëzuar". Pasi një mesazh i tillë të jetë shfshehtëzuar, subjekti origjinal zëvendësohet vetvetiu. Si parazgjedhje, fshehja e subjektit është aktive; ka një parapëlqim për ta çaktivizuar, nëse s’ju pëlqen. (Shënim: kjo veçori lyp që mesazhi të dërgohet me PGP/MIME.) upgradeInfo.buttons.title=Është ndryshuar sjellja e butonave Fshehtëzo dhe Nënshkruaj upgradeInfo.buttons.desc=Butonat Fshehtëzoje dhe Nënshkruajete dritarja e hartimit të mesazheve tani funksionojnë si me protokollin OpenPGP, ashtu me atë S/MIME. Nëse janë të mundshëm që të dy algoritmet, atëherë Enigmail-i do të parapëlqejë atë për të cilin janë gati krejt kyçet. upgradeInfo.autocrypt.title=Mbulim për Autocrypt-in upgradeInfo.autocrypt.desc=Enigmail-i tani mbulon Autocrypt, një standard i ri për shpërndarje të kyçeve si pjesë e mesazhit të dërguar. Enigmail-i importon vetvetiu kyçe nga mesazhe që janë në pajtim me Autocrypt-in, në mënyrë që me kalimin e kohës, të mund të fshehtëzohen gjithnjë e më shumë email-e. upgradeInfo.pEp.title=p≡p Junior Mode (Pretty Easy Privacy) e re upgradeInfo.pEp.desc=Enigmail-i tani përmban një p≡p Junior Mode. Për këtë qëllim, hëpërhë lypset të instaloni dorazi p≡p; në versionet e ardhshme kjo do të ndryshojë. p≡p Junior Mode ju lejon të përdorni fshehtëzim OpenPGP në mënyrën më transparente të mundshme; s’keni pse e çani më kokën për administrim kyçesh dhe njëkohësim kyçesh mes pajisjesh. upgradeInfo.bottom.desc=Për ndihmë rreth përdorimit të Enigmail-it, ju lutemi, vizitoni dokumentimin tonë. pep.missingGnuPG=Që të mund të përdorni Enigmail/p≡p, GnuPG-ja është i domosdoshëm. Ngaqë nuk e gjetëm, këshillojmë të shkarkohet dhe të instalohet për ju. #strings in enigmailAbout.html aboutEnigmail.tabName=Mbi Enigmail-in aboutEnigmail.title=Mbulimi i OpenPGP furnizohet nga Enigmail aboutEnigmail.team=Enigmail zhvillohet nga Ekipi i Enigmail-it: aboutEnigmail.projectLeader=Drejtues Zhvillimi: aboutEnigmail.usability=Përdorshmëri: aboutEnigmail.documentation=Dokumentim: aboutEnigmail.testing=Testim: aboutEnigmail.userSupport=Asistencë Përdoruesi: aboutEnigmail.localization=Përkthim: Shihni faqen e Paketave Gjuhësore për Enigmail-in aboutEnigmail.Credits=Kredite: aboutEnigmail.origAuthor=Autori origjinal i zgjerimit Enigmail aboutEnigmail.icons=Ikona: aboutEnigmail.formerMembers=Anëtarë të dikurshëm të ekipit: aboutEnigmail.projectHosting=Strehim i projektit: aboutEnigmail.licenseSupportTitle=Licencë & Asistencë aboutEnigmail.license=OpenPGP-ja e Enigmail-it është me burim të hapët dhe e licencuar sipas %S aboutEnigmail.support=Asistencë dhe shkarkime gjeni te www.enigmail.net. enigmail-2.0.8/lang/sq/help/000077500000000000000000000000001334302754500156105ustar00rootroot00000000000000enigmail-2.0.8/lang/sq/help/compose.html000066400000000000000000000100761334302754500201470ustar00rootroot00000000000000 Enigmail Help: Message Composition

Enigmail Help

Using Enigmail when composing messages

Enigmail menu in Mail/Compose window
Sign message
Enable/Disable sending signed mail. User is notified, if signing fails.
Encrypt message

Enable/Disable encryption to all recipient(s) before sending. User is notified, if encryption fails.

If Display selection when necessary is set in Preferences -> Key Selection tab, a list of keys will pop up if there are addresses in the list of recipients for the message for whom you have no public key.

If Never display OpenPGP key selection dialog is set in Preferences -> Key Selection tab, and there are addresses in the list of recipients for the message for whom you have no public key, the message will be sent unencrypted.

Use PGP/MIME for this message
Enable/Disable the use of PGP/MIME for this message.

If you know the recipient(s) can read mail using the PGP/MIME format, you should use it.

This feature is dependent on the settings in Preferences -> PGP/MIME tab being set to Allow to use PGP/MIME or Always use PGP/MIME.

Default composition options
  • Signing/Encryption Options...: shortcut to Account Settings -> OpenPGP Options.
  • Send options...: shortcut to Preferences -> Send tab.
  • Key selection options...: shortcut to Preferences -> Key Selection tab.
  • PGP/MIME options...: shortcut to Preferences -> PGP/MIME tab.
Undo encryption

If there is a failure when actually sending mail, such as the POP server not accepting the request, Enigmail will not know about it, and the encrypted message will continue to be displayed in the Compose window. Choosing this menu item will undo the encryption/signing, reverting the Compose window back to its original text.

As a temporary fix, this option may also be used to decrypt the quoted text when replying to encrypted messages. Enigmail should automatically decrypt the quoted message, but if that fails for some reason, you can use this menu item to force it.

Insert public key
insert ASCII-armored public key block at the current cursor location in the Compose window. You will be prompted for the email addresses of the key(s) to be inserted. Keys inserted in this manner will automatically be recognized at the receiving end by Enigmail. After key insertion, you may still choose to sign/encrypt the mail as needed. Also, do not insert more than one key block in a message; just specify multiple email addresses, separated by commas or spaces, when prompted.
Clear save passphrase
Clears cached passphrase. Useful if you have multiple passphrases.
Help
Displays Help information from the website (this page).

Further help is available on the Enigmail Help web page

enigmail-2.0.8/lang/sq/help/editRcptRule.html000066400000000000000000000116041334302754500211060ustar00rootroot00000000000000 Enigmail Help: Edit Per-Recipient Rule

Enigmail Help

Using the Enigmail Rules Editor: Edit Per-Recipient Rule

In the Rules Editor, you can specify defaults per recipient for enabling encryption, signing and PGP/MIME, and to define what OpenPGP key(s) to use. In this dialog, you can specify the rules for a single recipient, and for a group of recipients with very similar attributes.

Set Enigmail Rules for
Contains the email addresses of the recipients (without names, i.e. just an address like somebody@email.domain). You can specify several email addresses, separated by spaces. The address specified here can consist of only the domain section so that mail to any address at that domain will be matched, e.g. @email.domain will allow matching to body@email.domain, somebody@email.domain, anybody@email.domain, etc.
Apply rule if recipient ...
This modifies the matching of the email addresses. If multiple addresses are entered, the setting will apply to all. The examples below are based on body@email.domain entered in the Enigmail Rules field above.
  • Is exactly: with this setting, the rule will only trigger on emails to body@email.domain (exact, case insensitive matching).
  • Contains: with this setting, any email address containing the string is matched, e.g. anybody@email.domain or body@email.domain.net
  • Begins with: with this setting, any email address starting with the string is matched, e.g. body@email.domain.net, body@email.domain-name.com.
  • Ends with: with this setting, any email address ending with the string is matched, e.g. anybody@email.domain , somebody@email.domain.
Continue with the next rule for the matching address
Enabling this function will allow you to define a rule but not have to specify a KeyID in the Use the following OpenPGP keys: field, so that the email address is used to check for a key at the time of sending. Also, further rules for the same address(es) will be processed as well.
Do not check further rules for the matching address
Enabling this function stops processing any other rules for the matching address(es) if this rule is matched; i.e. rule processing continues with the next recipient.
Use the following OpenPGP keys:
Use the Select Key(s).. button to select the recipient keys to be used for encryption. As in the action above, no further rules for the matching address(es) are processed.
Default for Signing
Enable or disable message signing. This either uses or overrides what you have specified in the message composition window. The values are:
  • Never: disable signing, even if it was enabled in the message composition window (overrules the other values)
  • Yes, if selected from in Message Composition: leave signing as specified in the message composition window
  • Always: enable signing, even if it was not enabled in the message composition window
These signing settings are applied for all rules that match. If one of the rules disables signing, the message will not be signed, regardless of other rules that specify Always.
Encryption
Enable or disable message encryption. The allowed settings and their meaning are the same as for message signing.
PGP/MIME
Enable or disable the use of the PGP/MIME (RFC 3156) message encoding. If PGP/MIME is disabled, the messages are encoded using "inline PGP". The allowed values and their meaning are the same as for message signing.

The rules are processed in the order displayed in the list in the Per-Recipient Rules Editor. Whenever a rule matches a recipient and contains a OpenPGP Key ID, in addition to using the specified Key ID, the recipient is not considered anymore when processing further rules.


Further help is available on the Enigmail Per-Recipient Settings page

enigmail-2.0.8/lang/sq/help/help.html000066400000000000000000000103331334302754500174260ustar00rootroot00000000000000 Enigmail Help

Enigmail Help

Using Enigmail when reading messages

  • Decrypt button in main Mail window
    This button can be used for several purposes: decrypt, verify, or import public keys. Normally decryption/verification happens automatically, although this can be disabled through a preference. However, if this fails, usually a short error message will appear in the Enigmail status line. If you click the Decrypt button, you will be able to see a more detailed error message, including the output from the GnuPG command.
  • Pen and Key icons in Message Header display
    The Pen and Key icons in the Message Header display indicate if the message you are reading was signed and/or encrypted and if the signature is good, i.e. the message has not been changed since it was signed. If the message has been changed, the Pen icon will change to a Broken Pen to indicate that the signature is bad. Right clicking on either the Pen or Key icons will bring up a menu with the following options:
    • Enigmail Security info: allows you to view the output status from GnuPG for the message.
    • Copy Enigmail Security info: copies the output status from GnuPG to the clipboard; to paste into a reply message, etc.
    • View OpenPGP Photo ID: allows you to view the Photo ID of the person who sent the message, if they have a photo embedded in their Public Key. (This option will only be enabled if a Photo ID exists in their key.)
    • S/MIME Security info: allows you to view the S/MIME Security Info for the message.

    If you do not have keyserver-options auto-key-retrieve set in your gpg.conf file and you read a message which is signed or encrypted, you will see a Pen icon in the headers display area with a Question mark on it, the Enigmail status line in the headers area will say Part of the message signed; click pen icon for details and the message in the Message Pane will show all the OpenPGP message block indicators and the signature block.

    You may also see this if you have keyserver-options auto-key-retrieve set in your gpg.conf file and the OpenPGP key is not available on the default keyserver.

    Clicking on the Pen and Question mark icon will bring up a window advising that the key is unavailable in your keyring. Clicking on OK will bring up another window with a list of keyservers from which you can select to download the sender's public key from.

    To configure the list of keyservers you wish to use, go to Enigmail -> Preferences -> Basic tab and enter the keyserver addresses in the Keyserver(s): box, separated by a comma. The first keyserver in the list will be used as the default.

  • Opening encrypted attachments / importing attached OpenPGP keys
    Attachments named *.pgp, *.asc and *.gpg are recognized as attachments that can be handled specially by Enigmail. Right clicking on such an attachment enables two special menu items in the context menu: Decrypt and Open and Decrypt and Save. Use these two menu items if you want Enigmail to decrypt an attachment before opening or saving it. If an attachment is recognized as an OpenPGP key file, you are offered to import the keys it into your keyrings.

Further help is available on the Enigmail Help web page
If you have questions or comments about enigmail, please send a message to the Enigmail mailing list

Enigmail is open source and licensed under the Mozilla Public License 2.0

enigmail-2.0.8/lang/sq/help/initError.html000066400000000000000000000045521334302754500204610ustar00rootroot00000000000000 Enigmail Help: How to Resolve Problems with Initializing Enigmail

Enigmail Help

How to Resolve Problems with Initializing Enigmail

There are several reasons why initializing Enigmail does not succeed. The most common ones are described below; for more information please visit the Enigmail Support page.

GnuPG could not be found

In order for Enigmail to work, the tool GnuPG needs to be installed. If GnuPG cannot be found, then first make sure that the executable gpg.exe (on Windows; gpg on other platforms) is installed on your computer. If GnuPG is installed, and Enigmail cannot find it, then you need to manually set the path to GnuPG in the Enigmail Preferences (menu Enigmail > Preferences)

Enigmime failed to initialize

Enigmail works only if it is built using the same build environment as Thunderbird or SeaMonkey was built. This means that you can use the official Enigmail releases only if you use the official releases of Thunderbird or SeaMonkey provided by mozilla.org.

If you use a Thunderbird or SeaMonkey version coming from some other source (e.g. the provider of your Linux distribution), or if you built the application yourself, you should either use an Enigmail version built by the same source, or build Enigmail yourself. For building Enigmail, refer to the Source Code section on the Enigmail home page. Please don't file any bug report concerning this problem, it is not solvable.

Further help is available on the Enigmail Support Web Site.

enigmail-2.0.8/lang/sq/help/messenger.html000066400000000000000000000101421334302754500204640ustar00rootroot00000000000000 Enigmail Help: Message Reading

Enigmail Help

Using Enigmail when reading messages

Decrypt button in main Mail window
This button can be used for several purposes: decrypt, verify, or import public keys. Normally decryption/verification happens automatically, although this can be disabled through a preference. However, if this fails, usually a short error message will appear in the Enigmail status line. If you click the Decrypt button, you will be able to see a more detailed error message, including the output from the GnuPG command.
Pen and Key icons in Message Header display
The Pen and Key icons in the Message Header display indicate if the message you are reading was signed and/or encrypted and if the signature is good, i.e. the message has not been changed since it was signed. If the message has been changed, the Pen icon will change to a Broken Pen to indicate that the signature is bad. Right clicking on either the Pen or Key icons will bring up a menu with the following options:
  • Enigmail Security info: allows you to view the output status from GnuPG for the message.
  • Copy Enigmail Security info: copies the output status from GnuPG to the clipboard; to paste into a reply message, etc.
  • View OpenPGP Photo ID: allows you to view the Photo ID of the person who sent the message, if they have a photo embedded in their Public Key. (This option will only be enabled if a Photo ID exists in their key.)
  • S/MIME Security info: allows you to view the S/MIME Security Info for the message.

If you do not have keyserver-options auto-key-retrieve set in your gpg.conf file and you read a message which is signed or encrypted, you will see a Pen icon in the headers display area with a Question mark on it, the Enigmail status line in the headers area will say Part of the message signed; click pen icon for details and the message in the Message Pane will show all the OpenPGP message block indicators and the signature block.

You may also see this if you have keyserver-options auto-key-retrieve set in your gpg.conf file and the OpenPGP key is not available on the default keyserver.

Clicking on the Pen and Question mark icon will bring up a window advising that the key is unavailable in your keyring. Clicking on OK will bring up another window with a list of keyservers from which you can select to download the sender's public key from.

To configure the list of keyservers you wish to use, go to Enigmail -> Preferences -> Basic tab and enter the keyserver addresses in the Keyserver(s): box, separated by a comma. The first keyserver in the list will be used as the default.

Opening encrypted attachments / importing attached OpenPGP keys
Attachments named *.pgp, *.asc and *.gpg are recognized as attachments that can be handled specially by Enigmail. Right clicking on such an attachment enables two special menu items in the context menu: Decrypt and Open and Decrypt and Save. Use these two menu items if you want Enigmail to decrypt an attachment before opening or saving it. If an attachment is recognized as an OpenPGP key file, you are offered to import the keys it into your keyrings.

Further help is available on the Enigmail Help web page

enigmail-2.0.8/lang/sq/help/rulesEditor.html000066400000000000000000000060331334302754500210010ustar00rootroot00000000000000 Enigmail Help: Rules Editor

Enigmail Help

Using the Enigmail Rules Editor

In the Rules Editor, you can specify defaults per recipient for enabling encryption, signing and PGP/MIME, and to define what OpenPGP key(s) to use. Each rule consists of 5 fields and is represented on a single line:

Email
The e-mail(s) from the To:, Cc: and Bcc: fields to match. The matching works on substrings (Further details can be found in the Edit Rule dialog)
OpenPGP Key(s)
a list of OpenPGP Key ID's to use for the recipient
Sign
enable or disable message signing. This either uses or overrides what you have specified in the message composition window. The values are:
  • Never: disable signing, even if it was enabled in the message composition window (overrules the other values)
  • Possible: leave signing as specified in the message composition window
  • Always: enable signing, even if it was not enabled in the message composition window

These signing settings are applied for all rules that match. If one of the rules disables signing, the message will not be signed, regardless of other rules that specify Always.

Encrypt
enable or disable message encryption. The allowed settings and their meaning are the same as for message signing.
PGP/MIME
enable or disable the use of the PGP/MIME (RFC 3156) message encoding. If PGP/MIME is disabled, the messages are encoded using "inline PGP". The allowed values and their meaning a re the same as for message signing.

The rules are processed in the order displayed in the list. Whenever a rule matches a recipient and contains a OpenPGP Key ID, in addition to using the specified Key ID, the recipient is not considered anymore when processing further rules.

Note: The rule editor is not yet complete. It is possible to write some more advanced rules by directly editing the rules file (these rules should then not be edited anymore in the rule editor). Further information for directly editing the file is available on the Enigmail Homepage


Further help is available on the Enigmail Help web page

enigmail-2.0.8/lang/sq/help/sendingPrefs.html000066400000000000000000000047571334302754500211420ustar00rootroot00000000000000 Enigmail Help: Edit OpenPGP Rule

Enigmail Help

Defining Preferences to Send Encrypted

In the Sending Preferences you can choose the general model and preferences for encryption.

Convenient Encryption
With these settings, emails are encrypted without confirmation whenever possible.

This setup is appropriate, if you just want to improve your privacy by sending emails encyrpted instead of unencrypted if that's possible.

The effect is like sending emails as letters instead of postcards. Unlike postcards, letters usually hide their contents while in transit.

Note however that as with letters you can't be sure that nobody is opening the letter while it is in transit (although, some technical effort is necessary for that).

A concrete risk is that you accidentally use "faked keys" you got from somewhere or somebody claiming that the key belongs to the person you want to send emails to. To avoid this risk, you can either use the trust model of PGP (see below) or you should always verify, whether the fingerprint of a public key is correct.

Manual Encryption
This option allows you to specify the different preferences for encryption according to your needs. You can specify
  • whether replies to encrypted/signed emails should automatically also be encrypted/signed-
  • whether to use the trust model of Enigmail to accept keys (this means that to use a key you either have to sign the key or have enough other people you trust having signed the key).
  • whether you want to automatically send emails encrypted if all keys are accepted.
  • whether and when you want to finally confirm sending an email.
If it is important for you that content you send encrypted can't be read by other people or organizations, you should use the manual preferences at least choose the option to accept keys only if you or other people signed them. While this model reduces the risk of using faked keys, it requires that you actively sign keys and declare owner trust using the key managament dialog. enigmail-2.0.8/lang/sv-SE/000077500000000000000000000000001334302754500151725ustar00rootroot00000000000000enigmail-2.0.8/lang/sv-SE/am-enigprefs.properties000066400000000000000000000001221334302754500216600ustar00rootroot00000000000000# Strings used in the Mozill AccountManager prefPanel-enigprefs=OpenPGP Säkerhet enigmail-2.0.8/lang/sv-SE/enigmail.dtd000066400000000000000000002023611334302754500174600ustar00rootroot00000000000000 Mozilla Public License 2.0."> 'Autocrypt-nyckelöverföring' kräver att e-postklienten på den andra enheten är Autocrypt-kompatibel. Även om det här är den enklare lösningen, stödjer endast ett begränsat antal klienter denna standard. Det andra sättet är att 'Säkerhetskopiera och återställa' dina inställningar. Detta skapar en ZIP-fil med all information och nycklar som du kan kopiera till din nya enhet. Enigmail kan importera dessa inställningar direkt; för andra e-postklienter kan ZIP-filen packas upp och hanteras manuellt."> '"> ' för att ange e-postadresser"> ' för att ange e-postadresser för GnuPG. Inaktivera om mottagarna har gamla Hushmailnycklar."> OpenPGP Säkerhet)"> OBS: Nyckelgenerering kan ta upp till flera minuter att slutföra. Avsluta inte programmet när nyckelgenerering pågår. Aktivt surfa eller disk-intensiva operationer under nyckelgenerering kommer att fylla på 'slumpvärdespoolen' och påskynda processen. Du kommer att bli varnad när nyckelgenerering är klar."> Autocrypt är en standard som definierar hur man kan uppnå bekväm end-to-end-kryptering av e-post. Den specificerar hur e-postprogram förhandlar krypteringsfunktioner med vanliga e-postmeddelanden."> ' är ogiltig"> OBS: Nyckelgenerering kan ta upp till flera minuter att slutföra. Avsluta inte programmet när nyckelgenerering pågår. Du kommer bli varnad när nyckelgenerering är klart."> OBS: Enigmail kommer alltid att verifiera signaturer på e-post för varje konto eller identitet, oavsett om den är aktiverad eller inte"> publika nyckel är till för andra för att skicka krypterad e-post till dig. Du kan distribuera den till alla."> privata nyckel är till för dig själv för att dekryptera e-post och skicka signerad e-post. Du bör inte ge till någon."> privata nyckel är till för dig själv för att dekryptera e-post och skicka signerad e-post. Du bör inte ge till någon. För att säkra din privata nyckel, kommer du att bli tillfrågad om en lösenfras i följande två dialogrutor."> lösenfras är ett lösenord för att skydda din privata nyckel. Den förhindrar missbruk av din privata nyckel."> inte."> Du kommer att bli uppmanad att ange ditt lösenord för detta. Överför certifikatet till ett medium som kan lagras säkert, som en CD eller USB-minne. Om någon får tillgång till detta certifikat kan de använda den för att göra din nyckel oanvändbar."> exportera data från den gamla datorn med hjälp av backupguiden från inställningarna i Enigmail importera data till den nya datorn med hjälp av den här guiden. "> Tack för att du använder Enigmail."> Vänligen bekräfta önskan som du hittar i din inkorg om du vill göra det."> exportera data från den gamla datorn med hjälp av den här guiden importera data till den nya datorn med hjälp av installationsguiden. "> Vänligen välj nedan det konto som du vill överföra nyckeln till. Vi kommer att visa en konfigurationskod (lösenord) på följande skärm som du måste ange på den andra enheten för att kunna importera din nyckel och relaterade inställningar."> Vänligen växla till den andra enheten nu och öppna meddelandet. Du bör uppmanas att ange en konfigurationskod. Vänligen skriv följande siffror i prompten:"> enigmail-2.0.8/lang/sv-SE/enigmail.properties000066400000000000000000001544121334302754500211040ustar00rootroot00000000000000Enigmail=Enigmail ##################################################################### # Strings used within enigmailCommon.js and enigmailCommon.jsm ##################################################################### enigAlert=Enigmail Varning enigConfirm=Enigmail Bekräfta enigInfo=Enigmail Information enigError=Enigmail Fel enigPrompt=Enigmail Prompt dlgYes=&Ja dlgNo=&Nej dlgKeepSetting=Kom ihåg mitt svar och fråga mig inte igen dlgNoPrompt=Visa inte den här dialogrutan igen dlg.button.delete=&Ta bort dlg.button.cancel=&Avbryt dlg.button.close=&Stäng dlg.button.continue=&Fortsätt dlg.button.skip=&Hoppa över dlg.button.overwrite=Skri&v över dlg.button.view=&Visa dlg.button.retry=&Försök igen dlg.button.ignore=&Ignorera dlg.button.install=&Installera dlg.button.ok=&OK repeatPrefix=\n\nDetta meddelande kommer att upprepas %S repeatSuffixSingular=gång till. repeatSuffixPlural=gånger till. noRepeat=\n\nDenna varning kommer inte att upprepas förrän du uppgraderar Enigmail. pgpNotSupported=Du verkar använda Enigmail tillsammans med PGP 6.x\n\nTyvärr har PGP 6.x ett antal problem som hindrar Enigmail från att fungera korrekt. Därför stöder Enigmail inte längre PGP 6.x; byt till GnuPG (GPG) istället.\n\nOm du behöver hjälp med att byta till GnuPG, kontrollera avsnittet hjälp på Enigmail's hemsida. initErr.howToFixIt=För att kunna använda Enigmail krävs GnuPG. Om du inte har installerat GnuPG ännu, är det enklaste genom att använda knappen för 'Installationsguiden' nedan. initErr.setupWizard.button=&Installationsguide passphraseCleared=Lösenfrasen har raderats. cannotClearPassphrase=Du använder ett icke-standardverktyg (såsom gnome-keyring) för lösenordshantering. Att rensa lösenord är därför inte möjligt inifrån Enigmail. noPhotoAvailable=Ingen bild tillgänglig debugLog.title=Enigmail Felsökningslogg error.photoPathNotReadable=Bildsökvägen '%S' är inte läsbar generalError=Fel: %S # Strings in configure.jsm enigmailCommon.versionSignificantlyChanged=Denna nya version av Enigmail har betydande förändringar i hanteringen av inställningar och alternativ. Vi försökte överföra de gamla inställningarna till den nya versionen. Men vi kan inte täcka alla fall automatiskt. Dubbelkolla nya inställningar och alternativ. enigmailCommon.checkPreferences=Kontrollera inställingar ... preferences.defaultToPgpMime=Vi har ändrat standardkodning för meddelanden i Enigmail från Inline-PGP till PGP/MIME. Vi rekommenderar dig att hålla detta som standard.\n\nOm du fortfarande vill använda Inline-PGP som standard, kan du göra det i kontoinställningar under OpenPGP-säkerhet. ##################################################################### # Strings in enigmailAbout.js ##################################################################### usingVersion=Kör Enigmail version %S enigmailPepVersion=Enigmail/p≡p version %S usingAgent=Använder %1$S körbara %2$S för att kryptera och dekryptera agentError=FEL: Det gick inte att komma åt tjänsten Enigmime! ##################################################################### # Strings in enigmailKeygen.js ##################################################################### accessError=Fel vid åtkomst till tjänsten Enigmail onlyGPG=Nyckelgenerering fungerar endast med GnuPG (inte med PGP)! keygenComplete=Nyckelgenerering klar! Identitet <%S> kommer att användas för signering. revokeCertRecommended=Vi rekommenderar starkt att skapa ett återkallningscertifikat för din nyckel. Detta certifikat kan användas för att ogiltigförklara din nyckel, t.ex. om din privata nyckel försvinner eller äventyras. Vill du skapa ett sådant återkallningscertifikat nu? keyMan.button.generateCert=&Skapa certifikat genCompleteNoSign=Nyckelgenerering klar! genGoing=Nyckelgenerering pågår redan! passNoMatch=Lösenfraserna matchar inte; försök igen passCheckBox=Markera kryssrutan om du inte anger lösenfras för nyckel passUserName=Ange användarnamn för denna identitet keygen.missingUserName=Det finns inget namn angett för det valda kontot/identiten. Ange ett värde i fältet "Ditt namn" i kontoinställningarna. keygen.passCharProblem=Du använder specialtecken i din lösenfras. Tyvärr kan detta orsaka problem för andra applikationer. Vi rekommenderar att du väljer en lösenfras som endast består av något av dessa tecken: \na-z A-Z 0-9 /.;:-,!?(){}[]%* passSpaceProblem=På grund av tekniska skäl, kan din lösenordsfras inte börja eller sluta med ett blanksteg. changePassFailed=Att ändra lösenfrasen misslyckades. keyConfirm=Skapa publika och privata nycklar för '%S'? keyMan.button.generateKey=&Skapa nyckel keyAbort=Avbryta nyckelgenerering? keyMan.button.generateKeyAbort=&Avbryt nyckelgenerering keyMan.button.generateKeyContinue=&Fortsätt nyckelgenerering expiryTooLong=Du kan inte skapa en nyckel som löper i mer än 100 år. expiryTooLongShorter=Du kan inte skapa en nyckel som löper i mer än 90 år. expiryTooShort=Din nyckel måste vara giltigt i minst ett dygn. keyGenFailed=Nyckelgenerering misslyckades. Vänligen kontrollera Enigmail konsolen (Menyn Enigmail > Felsök Enigmail) för detaljer. setKeyExpirationDateFailed=Förfallodatumet kan inte ändras # Strings in enigmailMessengerOverlay.js securityInfo=Enigmail Säkerhetsinfo\n\n enigHeader=Enigmail: enigContentNote=Enigmail: *Bilagor till detta meddelande har inte signerats eller krypterats*\n\n possiblyPgpMime=Möjligen PGP/MIME krypterat eller signerat meddelande; klicka på knappen Dekryptera för att bekräfta saveAttachmentHeader=Enigmail: Sparar dekrypterad bilaga noTempDir=Det gick inte att hitta en temporär katalog att skriva till\nVar god ange miljövariabeln TEMP attachmentPgpKey=Bilagan '%S' som du öppnar verkar vara en OpenPGP nyckelfil.\n\nKlicka på 'Importera' för att importera nycklar som finns eller 'Visa' för att visa filens innehåll i ett webbläsarfönster beginPgpPart=********* *STARTAR KRYPTERAD eller SIGNERAD DEL* ********* endPgpPart=********** *AVSLUTAR KRYPTERAD eller SIGNERAD DEL* ********** notePartEncrypted=Enigmail: *Delar av meddelandet har INTE signerats eller krypterats* noteCutMessage=Enigmail: *Flera meddelandeblock hittades -- dekryptering/verifiering avbruten* decryptOkNoSig=Varning\n\nDekrypteringen lyckades, men signaturen kunde inte verifieras korrekt msgOvl.button.contAnyway=&Fortsätt ändå signature.verifiedOK=Signaturen för bilagan %S har verifierats signature.verifyFailed=Signaturen för bilagan %S kunde inte verifieras attachment.noMatchToSignature=Det gick inte att matcha bilaga '%S' till en signaturfil attachment.noMatchFromSignature=Det gick inte att matcha signaturfil '%S' till en bilaga fixBrokenExchangeMsg.failed=Misslyckades att reparera meddelande. enigmail.msgViewColumn.label=Enigmail enigmailPep.msgViewColumn.label=Enigmail/p≡p wksNoIdentity=Den här nyckeln är inte länkad till någon av dina e-postkonton. Lägg till ett konto för minst en av följande e-postadress(er):\n\n%S wksConfirmSuccess=Bekräftelsemejl skickat. wksConfirmFailure=Sändning av bekräftelsemejl misslyckades. autocrypt.importSetupKey.accountPreconfigured=Ditt konto är redan korrekt konfigurerat för Autocrypt.\n\nVill du verkligen skriva över dina inställningar med detta konfigurationsmeddelande? autocrypt.importSetupKey.selfCreated=Detta meddelande skapades av din aktuella körning av Enigmail.\n\nVänligen växla till den e-postklient som du vill överföra inställningarna till och klicka på meddelandet på den e-postklienten för att importera inställningarna. autocrypt.importSetupKey.invalidMessage=Fel - kunde inte läsa konfigurationsmeddelandet. Meddelandet verkar vara skadat. Försök skapa ett nytt konfigurationsmeddelande på din "andra" enhet. autocrypt.importSetupKey.invalidKey=Fel - nyckeln kunde inte importeras. Nyckeln stöds inte heller av din version av GnuPG eller den skadades. autocrypt.importSetupKey.wrongPasswd=Lösenordet du skrev in är fel. Vill du försöka igen? autocrypt.importSetupKey.success=Autocrypt konfigurationsmeddelande bearbetades framgångsrikt. Autocrypt är nu tillgängligt för ditt konto '%S'. ##################################################################### # Strings in enigmailMsgComposeOverlay.js ##################################################################### keysToExport=Välj OpenPGP nycklar att infoga keysToUse=Välj OpenPGP-nycklar som ska användas för %S pubKey=Publik nyckel för %S\n windowLocked=Skrivfönstret är låst; skicka avbryts sendUnencrypted=Det gick inte att initiera Enigmail.\nSkicka okrypterat meddelande? composeSpecifyEmail=Vänligen ange din primära e-postadress, som kommer att användas för att välja signeringsnyckel för utgående meddelanden.\n Om du lämnar det tomt, kommer FRÅN adress i meddelandet att användas för att välja signeringsnyckel. sendingHiddenRcpt=Detta meddelande har BCC (hemlig kopia) mottagare. Om meddelandet är krypterat, är det möjligt att dölja BCC mottagare, men användare av vissa produkter (t.ex. PGP Corp) kommer inte att kunna dekryptera meddelandet. Mot bakgrund av detta rekommenderar vi att undvika BCC-e-post med krypterade meddelanden. sendWithHiddenBcc=Dölj BCC mottagare sendWithShownBcc=Kryptera normalt sendingNews=Krypterad sändning avbröts.\n\nDetta meddelande kan inte krypteras eftersom det finns diskussionsgrupper i mottagare. Vänligen skicka meddelandet igen utan kryptering. sendToNewsWarning=Varning: du är på väg att skicka ett krypterat e-postmeddelande till en diskussionsgrupp.\n\nDetta motverkas eftersom det bara är meningsfullt om alla medlemmar i gruppen kan dekryptera meddelandet, dvs meddelandet måste krypterat med nycklarna till alla gruppdeltagare. Vänligen skicka detta meddelande endast om du vet exakt vad du gör.\n\nVill du fortsätta? hasHTML=HTML e-postvarning:\nDetta meddelande kan innehålla HTML, vilket kan orsaka att signering/kryptering misslyckas. För att undvika detta i framtiden, bör du trycka på SHIFT tangenten när du klickar på Skriv/Svara knappen för att skicka signerad e-post.\nOm du signerar e-post som standard, bör du avmarkera 'Skriva meddelanden i HTML' i inställningsrutan för att permanent inaktivera HTML e-post för detta e-postkonto. strippingHTML=Meddelandet innehåller HTML formateringsinformation som går förlorad vid konvertering till oformaterad text för signering/kryptering. Vill du fortsätta? msgCompose.button.sendAnyway=&Skicka meddelande ändå attachWarning=Bilagor till detta meddelande är inte lokala, de kan inte krypteras. För att kryptera bilagor, lagra dem som lokala filer först och bifoga dessa filer. Vill du skicka meddelandet ändå? quotedPrintableWarn=Du har aktiverat 'quoted-printable' kodning för att skicka meddelanden. Detta kan leda till felaktig dekryptering och/eller verifiering av ditt meddelande.\nVill du stänga av skicka 'quoted-printable' meddelanden nu? minimalLineWrapping=Du har ställt radbrytning till %S tecken. För korrekt kryptering och/eller signering, måste detta värde vara minst 68.\nVill du ändra radbrytning till 68 tecken nu? warning=Varning signIconClicked=Du har manuellt ändrat signering. Därför, medan du skriver det här meddelandet, (av)aktivera signering beror inte längre på att (av)aktivera kryptering. errorOwnKeyUnusable=Nyckeln-ID '%S' konfigurerad för den aktuella identiteten är inte en användbar OpenPGP-nyckel.\n\nSe till att du har en giltig, ej upphörd OpenPGP-nyckel och att kontoinställningarna pekar på den nyckeln.\nOm din nyckel inte har upphört, kontrollera att du satte ägarförtroende till betrodd eller ultimat. msgCompose.cannotSaveDraft=Fel vid sparande av utkast msgCompose.partiallyEncrypted.short=Akta dig för att läcka känslig information - delvis krypterad e-post. msgCompose.partiallyEncrypted.mimeMsg=Meddelandet du svarar på innehöll både okrypterade och krypterade delar. Vissa krypterade meddelandedelar är osynliga för dig.\n\nOm avsändaren inte kunde dekryptera de dolda meddelandedelarna ursprungligen kan du läcka konfidentiell information eftersom avsändaren inte kunde avkoda ursprunget.\n\nVi rekommenderar att du inte svarar på meddelandet, utan skapar ett nytt meddelande som innehåller ditt svar. msgCompose.partiallyEncrypted.inlinePGP=Meddelandet du svarar på innehöll både okrypterade och krypterade delar. Om avsändaren inte kunde avkoda vissa meddelandedelar ursprungligen kan du läcka konfidentiell information om att avsändaren inte kunde avkryptera sig själva.\n\nTänk på att ta bort all citerad text från ditt svar till den här avsändaren. msgCompose.internalEncryptionError=Internt fel: utlovad kryptering inaktiverad msgCompose.internalError=Ett internt fel har inträffat. msgCompose.toolbarTxt.signAndEncrypt=Detta meddelande kommer att signeras och krypteras msgCompose.toolbarTxt.signOnly=Detta meddelande kommer att signeras msgCompose.toolbarTxt.encryptOnly=Detta meddelande kommer krypteras msgCompose.toolbarTxt.noEncryption=Detta meddelande kommer att vara osignerat och okrypterat msgCompose.toolbarTxt.disabled=Enigmail är inaktiverad för den valda identiteten msgCompose.protectSubject.tooltip=Skydda meddelandets ämnesrad msgCompose.noSubjectProtection.tooltip=Skydda inte meddelandets ämnesrad msgCompose.encryptedSubjectStub=Krypterat meddelande msgCompose.protectSubject.dialogTitle=Aktivera skydd av ämne? msgCompose.protectSubject.question=Normalt krypterade mejl innehåller det oskyddade ämnet.\nVi har fastställt en standard för att dölja det ursprungliga ämnet i det krypterade meddelandet\noch ersatt det med en dummytext, så att ämnet bara är synligt efter att e-posten dekrypterats.\n\nVill du skydda ämnet i krypterade meddelanden? msgCompose.protectSubject.yesButton=&Skydda ämne msgCompose.protectSubject.noButton=&Låt ämnet vara oskyddat msgCompose.detailsButton.label=Detaljer ... msgCompose.detailsButton.accessKey=D msgCompose.pepSendUnknown=Okänd msgCompose.pepSendUnsecure=Osäker msgCompose.pepSendSecure=Säker msgCompose.pepSendTrusted=Säker & betrodd pep.alert.disabledForIdentity=p≡p är inaktiverad för den aktuella identiteten. Vänligen aktivera p≡p via Enigmail/p≡p inställningarna. pep.alert.weakReply=Du är på väg att vidarebefordra eller svara på ett säkert meddelande som osäkert. Om du väljer att fortsätta kan det hända att konfidentiell information läcker, vilket kan sätta dig och din kommunikationspartner i fara. Är du säker på att du vill fortsätta? # note: should end with double newline: sendAborted=Skicka avbryts.\n\n # details: keyNotTrusted=Inte tillräckligt med förtroende för nyckel '%S' keyNotFound=Nyckel '%S' hittades inte keyRevoked=Nyckel '%S' har återkallats keyExpired=Nyckel '%S' har upphört statPGPMIME=PGP/MIME statSMIME=S/MIME statSigned=SIGNERAD statEncrypted=KRYPTERAD statPlain=OSIGNERAD och OKRYPTERAD offlineSave=Spara %1$S meddelande till %2$S i Utkorgen? onlineSend=Skicka %1$S meddelande till %2$S? encryptKeysNote=OBS: meddelande krypteras med följande användar-ID's / Nycklar: %S hiddenKey= signFailed=Fel i Enigmail; Kryptering/signering misslyckades; skicka meddelande okrypterat? msgCompose.button.sendUnencrypted=&Skicka meddelande okrypterat recipientsSelectionHdr=Välj mottagare för kryptering configureNow=Du har ännu inte konfigurerat Enigmail säkerhet för den valda identiteten. Vill du göra det nu? # encryption/signing status and associated reasons: encryptMessageAuto=Kryptera meddelande (auto) encryptMessageNorm=Kryptera meddelande signMessageAuto=Signera meddelande (auto) signMessageNorm=Signera meddelande encryptOff=Kryptering: AV encryptOnWithReason=Kryptering: PÅ (%S) encryptOffWithReason=Kryptering: AV (%S) encryptOn=Kryptering: PÅ signOn=Signering: PÅ signOff=Signering: AV signOnWithReason=Signering: PÅ (%S) signOffWithReason=Signering: AV (%S) reasonEnabledByDefault=aktiverad som standard reasonManuallyForced=tvinga manuellt reasonByRecipientRules=tvingad av mottagarregler reasonByAutoEncryption=tvingad av auto-kryptering reasonByConflict=på grund av konflikten i mottagarregler reasonByEncryptionMode=på grund av krypteringsläge # should not be used anymore: encryptYes=Meddelandet kommer att krypteras encryptNo=Meddelandet kommer inte att krypteras # should not be used anymore: signYes=Meddelandet kommer att signeras signNo=Meddelandet kommer inte att signeras # PGP/MIME status: pgpmimeNormal=Protokoll: PGP/MIME inlinePGPNormal=Protokoll: Inline PGP smimeNormal=Protokoll: S/MIME pgpmimeAuto=Protokoll: PGP/MIME (auto) inlinePGPAuto=Protokoll: Inline PGP (auto) smimeAuto=Protokoll: S/MIME (auto) # should not be used anymore pgpmimeYes=PGP/MIME kommer att användas pgpmimeNo=Inline PGP kommer att användas # Attach own key status (tooltip strings): attachOwnKeyNo=Din egen nyckel kommer inte bifogas attachOwnKeyYes=Din egen nyckel kommer att bifogas attachOwnKeyDisabled=Din egen nyckel kan inte bifogas. Du måste välja en specifik nyckel\ni OpenPGP-delen av kontoinställningar för att aktivera den här funktionen. rulesConflict=Motstridiga per-mottagare regler upptäckta\n%S\n\nSkicka meddelandet med dessa inställningar? msgCompose.button.configure=&Konfigurera msgCompose.button.send=&Skicka meddelande msgCompose.button.save=&Spara meddelande # Strings in enigmailMsgHdrViewOverlay.js keyNeeded=Publik nyckel %S behövs för att verifiera signatur keyUsed=Publik nyckel %S används för att verifiera signatur clickDecrypt=; klicka på knappen Dekryptera clickDecryptRetry=; klicka på knappen Dekryptera för att försöka igen clickDetailsButton=; klicka på 'Detaljer' för med information clickImportButton=; klicka på knappen 'Importera nyckel' för att hämta nyckel keyTypeUnsupported=; nyckeltypen stöds inte av din version av GnuPG msgPart=En del av meddelandet %S msgSigned=signerad msgSignedUnkownKey=signerad med okänd nyckel msgEncrypted=krypterat msgSignedAndEnc=signerat och krypterat unverifiedSig=Ej verifierad signatur incompleteDecrypt=Dekryptering ofullständig needKey=Fel - privat nyckel krävs för att dekryptera meddelandet failedDecrypt=Fel - dekryptering misslyckades badPhrase=Fel - dålig lösenfras failedDecryptVerify=Fel - dekryptering/verifiering misslyckades mdcError=Fel - detta meddelande var inte integritetsskyddat viewInfo=; Visa > Meddelande säkerhetsinformation för detaljer decryptedMsg=Dekrypterat meddelande decryptedMsgWithFormatError=Dekrypterade meddelandet (återställd bruten PGP e-postformat sannolikt orsakad av en gammal Exchange-server, så resultatet kanske inte är perfekt för att läsa) usedAlgorithms=Använda algoritmer: %1$S and %2$S pepStatusInfo.text=p≡p Meddelandestatus. pepStatusInfo.title.m3=Under attack pepStatusInfo.info.m3=Det här meddelandet är inte säkert och kan ha manipulerats. pepStatusInfo.title.m1=Misstrodd pepStatusInfo.info.m1=Detta meddelande har en kommunikationspartner som tidigare har markerats som misstrodd pepStatusInfo.title.r0=Okänd pepStatusInfo.info.r0=Det här meddelandet innehåller inte tillräckligt med information för att avgöra om det är säkert. pepStatusInfo.title.r1=Kan inte dekryptera pepStatusInfo.info.r1=Det här meddelandet kan inte dekrypteras eftersom nyckeln inte är tillgänglig. pepStatusInfo.title.r2=Kan inte dekryptera pepStatusInfo.info.r2=Det här meddelandet kan inte dekrypteras eftersom nyckeln inte är tillgänglig. pepStatusInfo.title.r3=Osäker pepStatusInfo.info.r3=Detta meddelande är osäkert. pepStatusInfo.title.r4=Osäker för vissa pepStatusInfo.info.r4=Det här meddelandet är osäkert för vissa kommunikationspartner. pepStatusInfo.title.r5=Otillförlitlig säkerhet pepStatusInfo.info.r5=Detta meddelande har opålitligt skydd. pepStatusInfo.title.r6=Säker... pepStatusInfo.info.r6=Det här meddelandet är säkert men du måste fortfarande verifiera identiteten hos din kommunikationspartner. pepStatusInfo.title.r7=Säker & betrodd pepStatusInfo.info.r7=Detta meddelande är säkert och betrott. pepStatusInfo.color.green=Grön pepStatusInfo.color.yellow=Gul pepStatusInfo.color.red=Röd pepRevokeTrust.question=Vill du verkligen avbryta förtroendet för %S? pepRevokeMistrust.question=Vill du verkligen åter lita på nyckeln för %S? pepRevokeTrust.doRevoke=Avbryt &förtroende wksConfirmationReq=Bekräftelsebegäran av Webkey-katalog wksConfirmationReq.message=Detta meddelande har skickats av din e-postleverantör för att bekräfta utplaceringen av din publika OpenPGP-nyckel\ni deras Webkey-katalog.\nAtt tillhandahålla din publika nyckel hjälper andra att upptäcka din nyckel och därmed kunna kryptera meddelanden till dig.\n\nOm du vill distribuera din nyckel i Webkey-katalogen nu, klicka på knappen "Bekräfta begäran" i statusfältet.\nAnnars ignorerar du bara det här meddelandet. wksConfirmationReq.button.label=Bekräfta begäran autocryptSetupReq=Utför Autocrypt konfiguration autocryptSetupReq.button.label=Starta konfiguration autocryptSetupReq.setupMsg.desc=Detta meddelande innehåller all information för att överföra dina Autocrypt-inställningar tillsammans med din hemliga nyckel säkert från din ursprungliga enhet. autocryptSetupReq.setupMsg.backup=Du kan behålla det här meddelandet och använda det som en säkerhetskopia för din hemliga nyckel. Om du vill göra det ska du skriva ner lösenordet och lagra det säkert. autocryptSetupReq.message.import=För att importera inställningarna och nycklarna i Enigmail, klicka på knappen "Starta konfiguration" i statusfältet. autocryptSetupReq.message.sent=Klicka på meddelandet på din nya enhet och följ anvisningarna för att importera inställningarna. # strings in pref-enigmail.js oldGpgVersion20=Initialisering av Enigmail misslyckades.\n\nDu använder GnuPG version %1$S, som inte längre stöds. Enigmail kräver GnuPG version %2$S eller nyare. Uppgradera din installation av GnuPG eller Enigmail kommer inte att fungera. locateGpg=Hitta GnuPG program invalidGpgPath=GnuPG kan inte köras med den angivna sökvägen. Enigmail inaktiveras därför tills du ändrar sökvägen till GnuPG igen eller tills du startar om programmet. warningsAreReset=Alla varningar har återställts. prefs.gpgFound=GnuPG hittades i %S prefs.gpgNotFound=Det gick inte att hitta GnuPG prefs.warnAskNever=Varning: aktivera det här alternativet kommer att resultera i okrypterade e-post utan någon ytterligare information om det inte finns nyckel för en av mottagarna -- Enigmail kommer inte att informera dig om detta händer! prefs.warnIdleTimeForUnknownAgent=Ditt system använder ett specialiserat verktyg för hantering av lösenfraser, såsom gnome-keyring eller seahorse-agent. Tyvärr kan inte Enigmail styra lösenfrasens timeout för det verktyg du använder. Därför bortses respektive timeoutinställning i Enigmail. prefEnigmail.oneKeyserverOnly=Fel - du kan bara ange en nyckelserver för automatisk nedladdning av saknade OpenPGP nycklar. # Strings used in core.jsm # (said file also re-uses some strings from above) enterAdminPin=Skriv in ditt ADMIN PIN för SmartCard enterCardPin=Vänligen skriv ditt SmartCard PIN notInit=Fel - Enigmail tjänsten ännu inte initierad badCommand=Fel - krypteringskommandot misslyckades cmdLine=kommandorad och utmatning: notRequired=Fel - ingen kryptering krävs notComplete=Fel - nyckelgenerering ännu inte slutförd invalidEmail=Fel - ogiltig e-postadress noPassphrase=Fel - ingen uppgift om lösenfras noPGPblock=Fel - Inget giltigt skyddat OpenPGP datablock finns unverifiedReply=Indragen meddelandedel (svar) troligen ändrats keyInMessageBody=Nyckel hittades i meddelandet. Klicka på "Importera nyckel" för att importera nyckeln sigMismatch=Fel - Signaturen matchar inte cantImport=Fel vid import av publik nyckel\n\n doImportOne=Importera %1$S (%2$S)? doImportMultiple=Importera följande nycklar?\n\n%S previewFailed=Kan inte läsa den publika nyckelfilen. # Strings used in errorHandling.jsm sc.wrongCardAvailable=SmartCard %S finns i din läsare kan inte användas för att behandla meddelandet.\nSätt in ditt SmartCard %S och upprepa operationen. sc.insertCard=Operationen kräver ditt SmartCard %S.\nSätt in ditt SmartCard och upprepa operationen. sc.removeCard=Operationen kräver inget SmartCard i läsaren.\nTa bort ditt SmartCard och upprepa operationen. sc.noCardAvailable=Inget SmartCard kunde hittas i din läsare.\nSätt in ditt SmartCard och upprepa operationen. sc.noReaderAvailable=Ingen åtkomst till din SmartCard-läsare.\nKoppla in din SmartCard-läsare, sätt in ditt kort, och upprepa operationen. keyError.keySpecNotFound=E-postadressen "%S" kan inte matchas till en nyckel i din nyckelring. keyError.keyIdNotFound=Den konfigurerade nyckel-ID "%S" kan inte hittas i din nyckelring. keyError.resolutionAction=Välj en giltig nyckel i OpenPGP-delen av dina kontoinställningar. missingPassphrase=Lösenord saknas errorHandling.gpgAgentInvalid=Systemet kör en version av gpg-agent som inte är lämplig för din GnuPG-version. errorHandling.gpgAgentError=GnuPG rapporterade ett fel i kommunikationen med gpg-agent (en komponent i GnuPG). errorHandling.dirmngrError=GnuPG rapporterade ett fel i kommunikationen med dirmngr (en komponent i GnuPG). errorHandling.pinentryError=GnuPG kan inte fråga efter ditt lösenord via pinentry. errorHandling.readFaq=Detta är ett systeminställnings eller konfigurationsfel som hindrar Enigmail från att fungera ordentligt och kan inte fixas automatiskt.\n\nVi rekommenderar starkt att du tittat på vår supportwebbplats på https://enigmail.net/faq. gpgNotFound=Kan inte hitta GnuPG programmet '%S'.\nSe till att du har ställt in GnuPG körbara sökväg korrekt i Enigmail inställningar. gpgNotInPath=Kan inte hitta programmet GnuPG i PATH.\nSe till att du har ställt in GnuPG körbara sökväg korrekt i Enigmail inställningar. enigmailNotAvailable=Enigmails kärntjänst är inte tillgänglig prefGood=Bra signatur från %S prefBad=Dålig signatur från %S failCancel=Fel - Mottagande av nyckel avbröts av användaren failNoServer=Fel - Ingen nyckelserver specificerad att motta nyckeln från failNoID=Fel - Inget nyckel-ID specificerad att ta emot nyckel för failKeyExtract=Fel - nyckel-extraktionskommando misslyckades notFirstBlock=Fel - Första OpenPGP blocket inte publik nyckelblock importKeyConfirm=Importera publik nyckel inbäddad i meddelandet? failKeyImport=Fel - nyckelimport misslyckades fileWriteFailed=Det gick inte att skriva till filen %S importKey=Importera publik nyckel %S från nyckelserver: uploadKey=Skicka publik nyckel %S till nyckelserver: keyId=Nyckel-ID keyAndSigDate=Nyckel-ID: 0x%1$S / Signerad: %2$S keyFpr=Nyckelns fingeravtryck: %S noEmailProvided=Du angav ingen e-postadress! keyAlreadySigned=Nyckeln är redan signerad, det går inte att signera den två gånger. ##################################################################### # Strings used in enigmailKeySelection.js ##################################################################### selKeyExpired=upphört %S createdHeader=Skapad atLeastOneKey=Ingen nyckel vald! Du måste välja minst en nyckel för att acceptera den här dialogrutan fewerKeysThanRecipients=Du har valt ett mindre antal nycklar än mottagare. Är du säker på att listan över nycklar för att kryptera är klar? userSel.button.goBack=Välj fler nycklar userSel.secretKeySel.title=Välj en privat OpenPGP-nyckel för att signera dina meddelanden userSel.problemNoKey=Ingen giltig nyckel userSel.problemMultipleKeys=Flera nycklar # should be same as thunderbird ENTITY sendLaterCmd.label: sendLaterCmd.label=Skicka senare # Strings used in enigmailAttachmentDialog.js pgpMimeNote=OBS! PGP/MIME stöds inte av alla e-postklienter. Om du är osäker, välj alternativet %S. first=första second=andra # Strings used in am-enigprefs.js / enigmailEditIdentity.js encryptKeyHeader=Välj OpenPGP-nyckel för kryptering identityName=Identitet: %S switchPepMode=Du använder för närvarande 'p≡p Junior'-läge av Enigmail.\n\nGenom att aktivera OpenPGP eller S/MIME för ett konto, inaktiverar du p≡p och använder 'normal'-läget för Enigmail utan p≡p. enableEnigmail=I&naktivera p≡p # Strings used in enigmailSingleRcptSettings.js noEncryption=Du har aktiverat kryptering, men du har inte valt någon nyckel. För att kunna kryptera e-post som skickas till %1$S, måste du ange en eller flera giltiga nycklar från din nyckellista. Vill du inaktivera kryptering för %2$S? noKeyToUse=(ingen - ingen kryptering) noEmptyRule=Regeln får inte vara tom! Vänligen ange en e-postadress i regelfältet. invalidAddress=Den e-postadress som du har angett är inte giltig. Du ska inte ange namnen hos mottagarna, bara e-postadresserna. T.ex.:\nOgiltig: Vissa namn \nGiltig: vissa.namn@adress.net noCurlyBrackets=Klamrarna {} har en särskild betydelse och bör inte användas i en e-postadress. Om du vill ändra matchningsbeteendet för denna regel, använd alternativet "Tillämpa regel om mottagare ...".\nMer information finns i hjälpen. # Strings used in enigmailRulesEditor.js never=Aldrig always=Alltid possible=Möjlig deleteRule=Vill du verkligen ta bort den valda regeln? nextRcpt=(Nästa mottagare) negateRule=Inte addKeyToRule=Lägg till nyckel %1$S (%2$S) till per-mottagare regel # Strings used in enigmailSearchKey.js needOnline=Funktionen du valt är inte tillgänglig offline. Vänligen gå online och försök igen. protocolNotSupported=Protokollet '%S://' som du har valt stöds inte för nedladdning av OpenPGP-nycklar. gpgkeysDisabled=Det kan hjälpa att aktivera alternativet 'extensions.enigmail.useGpgKeysTool'. noKeyserverConn=Det gick inte att ansluta till nyckelserver på %S. keyDownloadFailed=Det gick inte att hämta nyckeln från nyckelserver. Statusmeddelande är:\n%S internalError=Ett internt fel uppstod. Nycklarna kan inte laddas ner eller importeras. noKeyFound=Jag är ledsen, kunde inte hitta någon nyckel som matchar det angivna sökkriterierna.\nObservera att nyckel-ID bör ha prefix "0x" (t.ex. 0xABCDEF12). keyDownload.keyUnavailable=Vi är ledsna, men nyckeln med ID %S är inte tillgänglig på nyckelservern. Mest troligt har ägaren av nyckeln inte laddat upp den till nyckelservern.\n\nVänligen be avsändaren av meddelandet att skicka sin nyckel via e-post. # gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. gpgKeysFailed=Det gick inte att söka eller ladda ner nyckeln från nyckelserver: gpgkeys_%S kunde inte köras. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Ställa in ägarförtroende misslyckades # Strings in enigmailSignKeyDlg.js signKeyFailed=Nyckelsignering misslyckades alreadySigned.label=OBS: nyckeln %S är redan signerad med den valda privata nyckeln. alreadySignedexportable.label=Obs: nyckel %S är redan signerad exporterbar med den valda privata nyckeln. En lokal signatur verkar inte vettigt. partlySigned.label=Obs: vissa användar-ID för nyckel %S är redan signerade med den valda hemliga nyckeln. noTrustedOwnKeys=Ingen berättigade nyckel hittades för signering! Du behöver åtminstone en helt pålitliga privat nyckel för att signera nycklar. # Strings in enigmailKeyManager.js keyMan.loadingKeys=Laddar nycklar, vänta ... keyValid.unknown=okänd keyValid.invalid=ogiltig keyValid.disabled=inaktiverad keyValid.revoked=återkallad keyValid.expired=upphörd keyValid.noSubkey=ingen giltig undernyckel keyTrust.untrusted=ej betrodd keyTrust.marginal=marginell keyTrust.full=betrodd keyTrust.ultimate=ultimat keyTrust.group=(grupp) keyType.public=pub keyType.publicAndSec=pub/priv keyMan.enableKey=Aktivera nyckel keyMan.disableKey=Inaktivera nyckel userAtt.photo=Användarattribut (JPEG bild) asciiArmorFile=ASCII skyddade filer (*.asc) importKeyFile=Importera OpenPGP nyckelfil gnupgFile=GnuPG filer createKeyOK=Din nyckel har genererats saveRevokeCertAs=Skapa och spara återkallningscertifikat revokeCertOK=Återkallningscertifikatet har skapats. Du kan använda den för att upphäva din publika nyckel, t.ex. om du skulle förlora din hemliga nyckel. revokeCertFailed=Återkallningscertifikatet kunde inte skapas. addUidOK=Användar-ID har lagts till addUidFailed=Lägga till användar-ID misslyckades noKeySelected=Du bör välja minst en nyckel för att utföra vald åtgärd exportToFile=Exportera publik nyckel till fil exportKeypairToFile=Exportera privat och publik nyckel till fil exportSecretKey=Vill du inkludera den privata nyckeln i den sparade OpenPGP nyckelfilen? saveKeysOK=Nycklarna har sparats saveKeysFailed=Spara nycklarna misslyckades importKeysFailed=Importera nycklarna misslyckades enableKeyFailed=Aktivering/inaktivering av nycklarna misslyckades specificPubKeyFilename=%1$S (0x%2$S) pub specificPubSecKeyFilename=%1$S (0x%2$S) pub-priv defaultPubKeyFilename=Exporterade-publika-nycklar defaultPubSecKeyFilename=Exporterade-publika-och-privata-nycklar noSecretKeys=Inga privata nycklar hittades.\n\nVill du skapa din egen nyckel nu? sendKeysOk=Nyckel skickad sendKeysFailed=Skicka nycklar misslyckades receiveKeysOk=Nyckel uppdaterad receiveKeysFailed=Nedladdningen av nycklar misslyckades importFromClip=Vill du importera någon nyckel från urklipp? importFromUrl=Hämta publik nyckel från denna URL: copyToClipbrdFailed=Det gick inte att kopiera den valda nyckeln till urklipp. copyToClipbrdOK=Nyckel kopierad till urklipp deleteSecretKey=VARNING: Du är på väg att ta bort en privat nyckel!\nOm du tar bort din privata nyckel, kommer du inte längre att kunna dekryptera några meddelanden som är krypterade med den nyckeln.\n\nVill du verkligen ta bort BÅDA, den privata och den publika nyckeln\n'%S'? deleteMix=VARNING: Du är på väg att ta bort privata nycklar!\nOm du tar bort din privata nyckel, kommer du inte längre att kunna dekryptera några meddelanden med den nyckeln.\n\nVill du verkligen ta bort BÅDA, den valda privata och publika nyckeln? deletePubKey=Vill du ta bort den publika nyckeln\n'%S'? deleteSelectedPubKey=Vill du ta bort de publika nycklarna? deleteKeyFailed=Nyckeln kan inte tas bort. revokeKeyQuestion=Du håller på att spärra nyckel '%S'. \n \nDu kommer inte längre att kunna signera med denna nyckel och när den har distribuerats, kan andra inte längre kryptera med den nyckeln. Du kan fortfarande använda nyckeln för att dekryptera gamla meddelanden. \n \nVill du fortsätta? revokeKeyOk=Nyckeln har återkallats. Om din nyckel finns tillgänglig på en nyckelserver, rekommenderas att ladda upp den på nytt, så att andra kan se återkallelsen. revokeKeyFailed=Nyckeln kan inte återkallas. revokeKeyNotPresent=Du har ingen nyckel (0x%S) som passar till detta återkallningscertifikat!\n\nOm du har tappat bort din nyckel måste du importera den (t.ex. från en nyckelserver) före återkallningscertifikatet! revokeKeyAlreadyRevoked=Nyckeln 0x%S har redan återkallats. refreshAllQuestion=Du har inte valt någon nyckel. Vill du uppdatera ALLA nycklar? refreshKeyServiceOn.warn=Varning: Dina nycklar uppdateras för närvarande i bakgrunden så säkert som möjligt.\nUppdatering av alla dina nycklar på en gång kan avslöja information om dig.\nVill du verkligen göra det här? refreshKey.warn=Varning: beroende på antal nycklar och anslutningshastighet, uppdateringen av alla nycklar kan ta en ganska lång tid! downloadContactsKeys.warn=Varning: Beroende på antalet kontakter och anslutningshastighet, kan hämtning av alla nycklar vara en ganska lång process! downloadContactsKeys.importFrom=Importera kontakter från adressboken '%S'? keyMan.button.exportSecKey=Exportera &privata nycklar keyMan.button.exportPubKey=Exportera endast &publika nycklar keyMan.button.import=&Importera keyMan.button.refreshAll=&Uppdatera alla nycklar keyMan.button.revokeKey=&Återkalla nyckel keyMan.button.skip=&Hoppa över nyckel keylist.noOtherUids=Har inga andra identiteter keylist.hasOtherUids=Även känd som keylist.noPhotos=Inget foto tillgängligt keylist.hasPhotos=Fotografier keyMan.addphoto.filepicker.title=Välj foto att lägga till keyMan.addphoto.warnLargeFile=Filen du har valt är större än 25 kB.\nDet rekommenderas inte att lägga till mycket stora filer eftersom nycklarna blir mycket stora av detta. keyMan.addphoto.noJpegFile=Den valda filen verkar inte vara en JPEG-fil. Välj en annan fil. keyMan.addphoto.failed=Fotot kan inte läggas till. noWksIdentity=Nyckeln %S har ingen WKS-identitet. keyman.addBlacklistKey.msg=Vill du verkligen att p≡p ska sluta använda nyckeln "%1$S (%2$S)" för kryptering av meddelanden? keyman.removeBlacklistKey.msg=Vill du tillåta p≡p att använda nyckel "%1$S (%2$S)" för framtida meddelanden? keyman.addBlacklistKey.button=&Svartlista nyckel keyman.removeBlacklistKey.button=&Ta bort nyckel från svartlista # Strings in enigmailManageUidDlg.xul changePrimUidFailed=Ändra den primära användar-ID misslyckades changePrimUidOK=Ändra den primära användar-ID lyckades revokeUidFailed=Återkalla användar-ID %S misslyckades revokeUidOK=Användar-ID %S återkallat. Om din nyckel finns tillgänglig på någon nyckelserver, rekommenderas det att ladda upp den på nytt, så att andra kan se återkallelsen. revokeUidQuestion=Vill du verkligen återkalla användar-ID %S? # Strings in enigmailKeyImportInfo.xul importInfoTitle=Succé! Nycklar importerade importInfoBits=Bitar importInfoCreated=Skapad importInfoFpr=Fingeravtryck importInfoDetails=(Detaljer) importInfoNoKeys=Inga nycklar importerade. # Strings in enigmailKeyDetailsDlg.xul keyTypePublic=publik nyckel keyTypePrimary=primär nyckel keyTypeSubkey=undernyckel keyTypePair=nyckelpar keyExpiryNever=aldrig keyAlgorithm_1=RSA keyAlgorithm_2=RSA keyAlgorithm_3=RSA keyAlgorithm_16=ELG keyAlgorithm_17=DSA keyAlgorithm_18=ECDH keyAlgorithm_19=ECDSA keyAlgorithm_20=ELG keyAlgorithm_22=EDDSA keyUsageEncrypt=Kryptera keyUsageSign=Signera keyUsageCertify=Certifiera keyUsageAuthentication=Autentisering keyDoesNotExpire=Nyckel upphör inte # Strings in enigmailGenCardKey.xul keygen.started=Vänta medan nyckeln genereras .... keygen.completed=Nyckel skapad. Nytt nyckel-ID är: 0x%S keygen.keyBackup=Nyckel säkerhetskopieras som %S keygen.passRequired=Ange en lösenfras om du vill skapa en säkerhetskopia av din nyckel utanför ditt SmartCard. # Strings in enigmailSetCardPin.xul cardPin.processFailed=Det gick inte att ändra PIN-kod # Strings in enigRetrieveProgres.xul keyserverProgress.refreshing=Uppdaterar nycklar, vänta ... keyserverProgress.uploading=Laddar upp nycklar, vänta ... keyserverProgress.wksUploadFailed=Det gick inte att ladda upp din nyckel till Webkey-tjänsten keyserverProgress.wksUploadCompleted=Din offentliga nyckel har skickats till din leverantör. Du kommer att få ett mejl för att bekräfta att du startade uppladdningen. keyserverTitle.refreshing=Uppdatera nycklar keyserverTitle.uploading=Nyckeluppladdning # Strings in enigmailSetupWizard passphrase.min8keys=Din lösenfras bör innehålla åtminstone 8 tecken! setupWizard.reallyCancel=Vill du verkligen stänga Enigmail installationsguide? setupWizard.invalidGpg=Filen du angav är inte en körbar GnuPG. Ange en annan fil. setupWizard.specifyFile=Du måste åtminstone ange en publik nyckelfil för att fortsätta. setupWizard.installFailed=Det verkar som om installationen misslyckades. Antingen göra om installationen, eller installera GnuPG manuellt och lokalisera den med hjälp av knappen Bläddra. setupWizard.downloadForbidden=För din egen säkerhet laddar vi inte ner GnuPG. Besök https://gnupg.org/ för att ladda ner GnuPG. setupWizard.downloadImpossible=Vi kan inte ladda ner GnuPG just nu. Vänligen försök senare eller besök https://gnupg.org/ för att ladda ner GnuPG. setupWizard.hashSumError=Guiden kunde inte verifiera integriteten för den nedladdade filen. Filen kan vara trasig eller manipulerad. Vill du fortsätta installationen ändå? setupWizard.importSettingsFile=Ange säkerhetskopieringsfil att läsa från setupWizard.invalidSettingsFile=Den angivna filen är inte en korrekt säkerhetskopieringsfil med inställningar för Enigmail. setupWizard.gpgConfExists=Konfigurationsfil för GnuPG finns redan. Vill du skriva över den med den från din gamla installation? setupWizard.noGpgHomeDir=Det verkar som om du har konfigurerat %S för GnuPG. Det här är dock inte en katalog - du kan inte använda den. setupWizard.unmachtedIds=Följande identiteter från din gamla inställning kunde inte matchas:\n%S\nInställningarna för dessa identiteter hoppades över. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=Ett fel inträffade vid försök att hämta GnuPG. Kontrollera konsolloggen för mer detaljer. installGnuPG.installFailed=Ett fel inträffade under installationen av GnuPG. Vänligen kontrollera konsolloggen för mer detaljer. # Strings in enigmailAddUidDlg.xul addUidDlg.nameOrEmailError=Du måste fylla i ett namn och en e-postadress addUidDlg.nameMinLengthError=Namnet måste minst ha 5 tecken addUidDlg.invalidEmailError=Du måste ange en giltig e-postadress # Strings in enigmailCardDetails.js Carddetails.NoASCII=OpenPGP Smartcards stöder bara ASCII-tecken i Förnamn/Namn. # network error types errorType.SecurityCertificate=Säkerhetscertifikatet som presenteras av webbtjänsten är inte giltig. errorType.SecurityProtocol=Säkerhetsprotokollet som används av webbtjänsten är okänd. errorType.Network=Ett nätverksfel har inträffat. # filter stuff filter.folderRequired=Du måste välja en målmapp. filter.decryptMove.label=Dekryptera alltid (Enigmail) filter.decryptCopy.label=Skapa dekrypterad kopia (Enigmail) filter.decryptMove.warnExperimental=Varning - filteråtgärd 'Dekryptera alltid' kan leda till förstörda meddelanden . \n \nVi rekommenderar starkt att du först prövar filtret "Skapa dekrypterad kopia", testa resultatet noga och börja endast använda det här filtret när du är nöjd med resultatet. filter.tempPepFilterDesc=Tillfälligt filter för att lagra skickat meddelande okrypterat filter.term.pgpencrypted.label=OpenPGP Krypterad filter.encrypt.label=Kryptera till nyckel (Enigmail) filter.keyRequired=Du måste välja en mottagarnyckel. filter.keyNotFound=Det gick inte att hitta en krypteringsnyckel för "%S". filter.warn.keyNotSecret=Varning - filteråtgärden "Kryptera till nyckel" ersätter mottagarna.\n\nOm du inte har den hemliga nyckeln för "%S" kan du inte längre läsa mejlen. # strings in enigmailConvert.jsm converter.decryptBody.failed=Det gick inte att dekryptera meddelandet med ämne \n"%S". \nVill du försöka igen med en annan lösenfras eller vill du hoppa över meddelandet? converter.decryptAtt.failed=Det gick inte att dekryptera bilagan "%1$S" \nför meddelandet med ämnet \n"%2$S". \nVill du försöka igen med en annan lösenfras eller vill du hoppa över meddelandet? saveLogFile.title=Spara loggfil # strings in gpg.jsm unknownSigningAlg=Okänd signeringsalgoritm (ID: %S) unknownHashAlg=Okänt kryptografiskt hash (ID: %S) # strings in keyRing.jsm keyring.photo=Foto keyRing.pubKeyRevoked=Nyckel %1$S (nyckel-ID %2$S) är återkallad. keyRing.pubKeyExpired=Nyckel %1$S (nyckel-ID %2$S) har upphört. keyRing.pubKeyNotForSigning=Nyckel %1$S (nyckel-ID %2$S) kan inte användas för signering. keyRing.pubKeyNotForEncryption=Nyckel %1$S (nyckel-ID %2$S) kan inte användas för kryptering. keyRing.keyDisabled=Nyckel %1$S (nyckel-ID %2$S) är inaktiverad; kan inte användas. keyRing.keyNotTrusted=Nyckel %1$S (nyckel-ID %2$S) är inte tillräckligt tillförlitlig. Ställ in pålitlighetsnivån för din nyckel till "ultimat" för att använda den för signering. keyRing.keyInvalid=Nyckel %1$S (nyckel-ID %2$S) är ogiltig (t.ex. har den inte en egen signatur). keyRing.signSubKeysRevoked=Alla undernycklar för signering av nyckel %1$S (nyckel-ID %2$S) är återkallade. keyRing.signSubKeysExpired=Alla undernycklar för signering av nyckel %1$S (nyckel-ID %2$S) har upphört. keyRing.signSubKeysUnusable=Alla undernycklar för signering av nyckel %1$S (nyckel-ID %2$S) är återkallade, har upphört eller på annat sätt oanvändbara. keyRing.encSubKeysRevoked=Alla undernycklar för kryptering av nyckel %1$S (nyckel-ID %2$S) är återkallade. keyRing.encSubKeysExpired=Alla undernycklar för kryptering av nyckel %1$S (nyckel-ID %2$S) har upphört. keyRing.noSecretKey=Du verkar inte ha den hemliga nyckeln för %1$S (nyckel-ID %2$S) på din nyckelring; du kan inte använda nyckeln för signering. keyRing.encSubKeysUnusable=Alla undernycklar för kryptering av nyckel %1$S (nyckel-ID %2$S) är återkallade, har upphört eller på annat sätt oanvändbara. #strings in exportSettingsWizard.js cannotWriteToFile=Kan inte spara till fil '%S'. Välj en annan fil. dataExportError=Ett fel inträffade under exporten av dina data. enigmailSettings=Enigmail Inställningar defaultBackupFileName=Enigmail-exportera specifyExportFile=Ange filnamnet för export homedirParamNotSUpported=Ytterligare parametrar som konfigurerar sökvägar såsom --homedir och --keyring stöds inte för exportera/återställa dina inställningar. Vänligen använd alternativa metoder, såsom att ställa in miljövariabeln GNUPGHOME. #strings in expiry.jsm expiry.keyExpiresSoon=Din nyckel %1$S kommer att upphöra inom mindre än %2$S dagar.\n\nVi rekommenderar att du skapar ett nytt nyckelpar och konfigurerar motsvarande konton att använda den nya nyckeln. expiry.keysExpireSoon=Följande av dina nycklar upphör att gälla om mindre än %1$S dagar:\n%2$S Vi rekommenderar att du skapar nya nycklar och konfigurerar dina konton för att använda de nya nycklarna. expiry.keyMissingOwnerTrust=Din hemliga nyckel %S saknar förtroende.\n\nVi rekommenderar att du ställer in "Du litar på certifiering" till ultimat i nyckelegenskaper. expiry.keysMissingOwnerTrust=Följande av dina hemliga nycklar saknar förtroende.\n%S.\nVi rekommenderar att du ställer in "Du litar på certifiering" till ultimat i nyckelegenskaper. expiry.OpenKeyManager=Öppna Enigmail nyckelhantering expiry.OpenKeyProperties=Öppna nyckelegenskaper #strings in pEpDecrypt.jsm pEpDecrypt.cannotDecrypt=Detta är ett krypterat meddelande. Tyvärr har du inte den privata nyckeln för att dekryptera meddelandet. #strings in gpgAgent.jsm gpghomedir.notexists=Katalogen '%S' som innehåller dina OpenPGP-nycklar finns inte och kan inte skapas. gpghomedir.notwritable=Katalogen '%S' som innehåller dina OpenPGP-nycklar är inte skrivbar. gpghomedir.notdirectory=Katalogen '%S' som innehåller dina OpenPGP-nycklar är en fil istället för en katalog. gpghomedir.notusable=Korrigera katalogbehörigheterna eller ändra platsen för din GnuPG "hem"-katalog. GnuPG kan inte fungera korrekt annars. #strings in pepTrustWords.js pepTrustWords.cannotVerifyOwnId=Kan inte verifiera p≡p Förtroendeord för eget konto. pepTrustWords.cannotFindKey=Kan inte hitta nyckel för %S. pepTrustWords.cannotStoreChange=Kunde inte ändra förtroende för %S. pepTrustWords.generalFailure=Kan inte hämta förtroendeord för %S. pepTrustWords.partnerFingerprint=Fingeravtryck för %S: #strings in mimeWkdHandler.jsm wkdMessage.body.req=Din e-postleverantör behandlade din förfrågan om att ladda upp din offentliga nyckel till OpenPGP Webkey-katalog.\n\nVänligen klicka på bekräftelseknappen i Enigmail-headern för att slutföra publiceringen av din offentliga nyckel. wkdMessage.body.process=Det här är ett e-mejl relaterat till den automatiska behandlingen för att ladda upp din offentliga nyckel till OpenPGP Webkey-katalog.\n\nDu behöver inte vidta några manuella åtgärder vid denna tidpunkt. #strings in pepHandshake.js pepPrivacyStatus.RatingBrokenSuggestion=Antingen ska du eller avsändaren skicka meddelandet igen. pepPrivacyStatus.RatingHaveNoKeySuggestionOutgoing=Om du skriver det här meddelandet är din nyckel inte tillgänglig. pepPrivacyStatus.RatingMistrustSuggestion=Upprepa anslutningen med din kommunikationspartner och försök att slutföra en annan handskakning. pepPrivacyStatus.RatingReliableSuggestion=Slutför en handskakning med din kommunikationspartner genom att byta förtroendeord personligen eller via telefon. En handskakning behövs endast en gång per partner och säkerställer säker och betrodd kommunikation. pepPrivacyStatus.RatingTrustedSuggestion=Ingen åtgärd krävs! pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Var medveten om att det här meddelandet inte är säkert. pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Vänligen lägg till nödvändig information. pepPrivacyStatus.RatingUnderAttackSuggestion=Kontrollera separat innehållet i meddelandet med din kommunikationspartner. pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Se till att integritetsstatusen för varje kommunikationspartner som anges är åtminstone säker. pepPrivacyStatus.RatingUnencryptedSuggestion=Fråga din kommunikationspartner om att använda en krypteringslösning eller installera p≡p. pepPrivacyStatus.RatingUnreliableSuggestion=Det här meddelandet har ingen tillförlitlig kryptering eller ingen signatur. Be din kommunikationspartner att uppgradera sin krypteringslösning eller installera p≡p. pepPrivacyStatus.RatingBrokenExplanation=Det här meddelandet har trasig kryptering eller formatering. pepPrivacyStatus.RatingHaveNoKeyExplanation=Det här meddelandet kan inte dekrypteras eftersom nyckeln inte är tillgänglig. pepPrivacyStatus.RatingMistrustExplanation=Detta meddelande har en kommunikationspartner som tidigare har markerats som misstrodd. pepPrivacyStatus.RatingReliableExplanation=Det här meddelandet är säkert men du måste fortfarande verifiera identiteten hos din kommunikationspartner. pepPrivacyStatus.RatingTrustedExplanation=Detta meddelande är säkert och betrott. pepPrivacyStatus.RatingUndefinedExplanation=Det här meddelandet innehåller inte tillräckligt med information för att avgöra om det är säkert. pepPrivacyStatus.RatingUnderAttackExplanation=Det här meddelandet är inte säkert och kan ha manipulerats. pepPrivacyStatus.RatingUnencryptedExplanation=Detta meddelande är osäkert. pepPrivacyStatus.RatingUnencryptedForSomeExplanation=Det här meddelandet är osäkert för vissa kommunikationspartner. pepPrivacyStatus.RatingUnreliableExplanation=Detta meddelande har opålitligt skydd. pepPrivacyStatus.RatingBrokenText=Trasig pepPrivacyStatus.RatingHaveNoKeyText=Kan inte dekryptera pepPrivacyStatus.RatingMistrustText=Misstrodd pepPrivacyStatus.RatingReliableText=Säker pepPrivacyStatus.RatingTrustedText=Säker & betrodd pepPrivacyStatus.RatingUndefinedText=Okänd pepPrivacyStatus.RatingUnderAttackText=Under attack pepPrivacyStatus.RatingUnencryptedForSomeText=Osäker för vissa pepPrivacyStatus.RatingUnencryptedText=Osäker pepPrivacyStatus.RatingUnreliableText=Otillförlitlig säkerhet handshakeDlg.button.initHandshake=Handskakning... handshakeDlg.button.stopTrust=Sluta lita på handshakeDlg.button.reTrust=Sluta misstro handshakeDlg.label.outgoingMessage=Utgående meddelande handshakeDlg.label.incomingMessage=Inkommande meddelande handshakeDlg.error.noPeers=Kan inte handskaka utan några korrespondenter. handshakeDlg.error.noProtection=Vänligen aktivera skyddet för att använda handskakningsfunktionen. enigmail.acSetupPasswd.descEnterPasswd=Vänligen ange konfigurationskoden som visas på den andra enheten enigmail.acSetupPasswd.descCopyPasswd=Vänligen ange konfigurationskoden nedan på din andra enhet för att fortsätta med konfigurationen #strings in autocrypt.jsm autocrypt.setupMsg.subject=Autocrypt konfigurationsmeddelande autocrypt.setupMsg.msgBody=För att ställa in din nya enhet för Autocrypt, följ instruktionerna som ska presenteras av din nya enhet. autocrypt.setupMsg.fileTxt=Det här är Autocrypt-konfigurationsfil som används för att överföra inställningar och nycklar mellan klienter. Du kan dekryptera den med hjälp av konfigurationskoden som presenteras på din gamla enhet och sedan importera nyckeln till din nyckelring. #strings in upgradeInfo.html upgradeInfo.doctitle=Vad är nytt i Enigmail v2.0? upgradeInfo.welcome1=Välkommen till den nya Enigmail version 2.0! upgradeInfo.welcome2=Denna utgåva innehåller många nya och ändrade funktioner. Ta en minut och ta reda på vad som är nytt: upgradeInfo.encSubject.title=Krypterar e-postämnet upgradeInfo.encSubject.desc=Vi har utvecklat en ny metod som flyttar e-postämnet i det krypterade meddelandet och ersätter det synliga ämnet med "Krypterat meddelande". När ett sådant meddelande dekrypteras, ersätts det ursprungliga ämnet automatiskt. Att dölja ämnet är satt som standard. Det är en fördel att stänga av den om du inte gillar det. (Obs: Den här funktionen kräver att meddelandet skickas med PGP/MIME.) upgradeInfo.buttons.title=Ändrat beteende för Kryptera och Signera knappar upgradeInfo.buttons.desc=Knapparna Kryptera och Signera i meddelandekomponeringsfönstret fungerar nu för både OpenPGP och S/MIME protokollen. Om båda algoritmerna är möjliga, försöker Enigmail att föredra den som alla nycklar är tillgängliga för. upgradeInfo.autocrypt.title=Stöd för Autocrypt upgradeInfo.autocrypt.desc=Enigmail stöder nu Autocrypt, en ny standard för att distribuera nycklar som en del i att skicka meddelanden. Enigmail importerar automatiskt nycklar från Autocrypt-kompatibla meddelanden, så att fler och fler e-postmeddelanden över tiden kan krypteras. upgradeInfo.pEp.title=Nytt p≡p Junior-läge (Pretty Easy Privacy) upgradeInfo.pEp.desc=Enigmail innehåller nu ett p≡p Junior-läge. Du behöver för närvarande manuellt installera p≡p för detta ändamål; detta kommer att förändras i en framtida version. p≡p Junior-läge låter dig använda OpenPGP-kryptering så transparent som möjligt; du behöver inte ta hand om nyckelhantering och synkronisering av nycklar mellan enheter längre. upgradeInfo.bottom.desc=Besök vår dokumention för hjälp med att använda Enigmail. pep.missingGnuPG=För att kunna använda Enigmail/p≡p krävs GnuPG. Eftersom vi inte kunde hitta det, föreslår vi att vi hämtar och installerar det för dig. #strings in enigmailAbout.html aboutEnigmail.tabName=Om Enigmail aboutEnigmail.title=OpenPGP-stöd som tillhandahålls av Enigmail aboutEnigmail.team=Enigmail är utvecklad av Enigmail Team: aboutEnigmail.projectLeader=Huvudutvecklare: aboutEnigmail.usability=Användbarhet: aboutEnigmail.documentation=Dokumentation: aboutEnigmail.testing=Testning: aboutEnigmail.userSupport=Användarstöd: aboutEnigmail.localization=Lokalisering: Se sidan Enigmail Language Packs aboutEnigmail.Credits=Erkännande: aboutEnigmail.origAuthor=Ursprunglig författare till tillägget Enigmail aboutEnigmail.icons=Ikoner: aboutEnigmail.formerMembers=Tidigare teammedlemmar: aboutEnigmail.projectHosting=Projektvärd: aboutEnigmail.licenseSupportTitle=Licens & Support aboutEnigmail.license=Enigmail OpenPGP har öppen källkod och är licensierad under %S aboutEnigmail.support=Support och nedladdning är tillgänglig från www.enigmail.net. enigmail-2.0.8/lang/sv-SE/help/000077500000000000000000000000001334302754500161225ustar00rootroot00000000000000enigmail-2.0.8/lang/sv-SE/help/compose.html000066400000000000000000000074661334302754500204720ustar00rootroot00000000000000 Enigmail Hjälp: Skriva meddelanden

Enigmail Hjälp

Använda Enigmail när du skriver meddelanden

Enigmail's meny i skrivfönstret
Signera meddelande
Aktivera/inaktivera skicka signerad e-post. Användaren meddelas, om signering misslyckas.
Kryptera meddelande
Aktivera/inaktivera kryptering till alla mottagare innan du skickar. Användaren meddelas, om kryptering misslyckas.
Använd PGP/MIME för detta meddelande
Aktivera/inaktivera användning av PGP/MIME för detta meddelande.

Om du vet att mottagaren kan läsa e-post med hjälp av PGP/MIME-formatet, ska du använda det.

Den här funktionen är beroende av inställningarna i Inställningar -> PGP/MIME -fliken är satta till Tillåt att använda PGP/MIME eller Alltid använda PGP/MIME.

Standard kompositionsalternativ
  • Signering/Kryptering alternativ...: genväg till Kontoinställningar -> OpenPGP alternativ.
  • Skicka alternativ...: genväg till Inställningar -> skicka fliken.
  • Nyckelval alternativ...: genväg till Inställningar -> Nyckelval fliken.
  • PGP/MIME alternativ...: genväg till Inställningar -> PGP/MIME fliken.
Ã…ngra kryptering

Om det uppstår ett fel när du skickar mail, till exempel POP-servern inte accepterar begäran, kommer Enigmail inte vet om det, och det krypterade meddelandet fortsätter att visas i meddelandefönstret. Att välja detta menyalternativ kommer att ångra kryptering/signering, då återgår skrivfönstret tillbaka till sin ursprungliga text.

Som en temporär fix, kan detta alternativ också användas för att dekryptera den citerade texten när du svarar på krypterade meddelanden. Enigmail bör automatiskt dekryptera det citerade meddelandet, men om det misslyckas av någon anledning, kan du använda det här menyalternativet för att tvinga det.

Bifoga publik nyckel
Infoga ASCII-armerade publika nyckelblock vid nuvarande markörposition i skrivfönstret. Du kommer att bli tillfrågad om e-postadresser till nyckeln som ska infogas. Nycklar som infogats på detta sätt kommer automatiskt att redovisas vid den mottagande änden av Enigmail. Efter nyckelinsättning, kan du fortfarande välja att signera/kryptera mail efter behov. Också, infoga inte mer än ett nyckelblock i ett meddelande; ange flera e-postadresser, avgränsade med kommatecken eller mellanslag, när det efterfrågas.
Rensa sparad lösenfras
Rensar cachade lösenfraser. Användbart om du har flera lösenfraser.
Hjälp
Visar hjälpinformation från webbplatsen (denna sida).

Ytterligare hjälp finns på Enigmail's Supportwebbplats

enigmail-2.0.8/lang/sv-SE/help/editRcptRule.html000066400000000000000000000116611334302754500214230ustar00rootroot00000000000000 Enigmail Hjälp: Redigera OpenPGP regel

Enigmail Hjälp

Använda Enigmail's regelredigerare: Redigera OpenPGP regel

I regelredigeraren kan du ange standardinställningar per mottagare för att aktivera kryptering, signering och PGP/MIME, och för att definiera vilken OpenPGP-nyckel som ska användas. I det här fönstret kan du ange regler för en enda mottagare, och för en grupp av mottagare med mycket liknande egenskaper.

Ange Enigmail-regler för
Innehåller e-postadresserna till mottagarna (utan namn, det vill säga endast en adress som somebody@email.domain). Du kan ange flera e-postadresser, separerade med mellanslag. Adressen som anges här kan endast bestå av domändelen så att e-post till en adress på den domänen kommer att matchas, t.ex. @email.domain tillåter matchning till body@email.domain, somebody@email.domain, anybody@email.domain, etc.
Tillämpa regel om mottagare ...
Detta ändrar matchning av e-postadresser. Om flera adresser anges kommer inställningen gälla för alla. Exemplen nedan är baserade på body@email.domain som angetts i OpenPGP reglerfältet ovan.
  • Är exakt: med denna inställning, kommer regeln endast trigga pÃ¥ e-post till body@email.domain (exakt, fall okänsliga matchning).
  • InnehÃ¥ller: med denna inställning, kommer en e-postadress som innehÃ¥ller strängen matchas, t.ex. anybody@email.domain eller body@email.domain.net
  • Startar med: med denna inställning, kommer en e-postadress som börjar med strängen matchas, t.ex. body@email.domain.net, body@email.domain-name.com.
  • Slutar med: med denna inställning, kommer en e-postadress som slutar med strängen matchas, t.ex. anybody@email.domain, somebody@email.domain.
Fortsätt med nästa regel för matchande adress
Aktivera den här funktionen kan du definiera en regel, men inte ange en nyckel-ID i Använd följande OpenPGP nycklar: fältet, så att e-postadressen används för att kontrollera en nyckel när du skickar. Dessutom kommer ytterligare regler för samma adress behandlas också.
Kontrollera inte ytterligare regler för matchande adress
Aktivera den här funktionen stoppar bearbetning av andra regler för matchande adress, om denna regel matchas; dvs regelbearbetningen fortsätter med nästa mottagare.
Använd följande OpenPGP nycklar:
Använd Välj nyckel... knappen för att välja mottagarens nycklar som ska användas för kryptering. Som i åtgärden ovan, inga ytterligare regler för matchande adress behandlas.
Standardvärden för...
Aktivera eller inaktivera signering för meddelanden. Detta använder eller åsidosätter vad du har specificerat i meddelandefönstret. Värdena är:
  • Aldrig: avaktivera signering, även om den var aktiverad i meddelandefönstret(upphäver de andra värdena)
  • Ja, om det valts i meddelandekompositionen: lämna signering som anges i meddelandefönstret
  • Alltid: aktivera signering, även om det var inte aktiverad i meddelandefönstret
Dessa signeringsinställningar tillämpas för alla regler som matchar. Om en av reglerna inaktiverar signering kommer meddelandet inte signeras, oberoende av andra regler som anger Alltid.
Kryptering
Aktivera eller inaktivera meddelandekryptering. Tillåtna inställningar och deras betydelse är de samma som för meddelandesignering.
PGP/MIME
Aktivera eller inaktivera användning av PGP/MIME (RFC 3156) meddelandekodning. Om PGP/MIME är inaktiverad kodas meddelandena med "inline PGP". Tillåtna värden och deras betydelse är de samma som för meddelandesignering.

Reglerna behandlas i den ordning de visas i listan i OpenPGP regelredigerare. När en regel matchar en mottagare och innehåller en OpenPGP nyckel-ID, utöver att använda den angivna Nyckel-ID, mottagaren räknas inte längre vid behandling av ytterligare regler.


Ytterligare hjälp finns på Enigmail Per-Recipient Settings page

enigmail-2.0.8/lang/sv-SE/help/initError.html000066400000000000000000000046001334302754500207650ustar00rootroot00000000000000 Enigmail Hjälp: Hur man ska lösa problem med initiera OpenPGP

Enigmail Hjälp

Hur man ska lösa problem med Initiera OpenPGP

Det finns flera skäl till varför initiering av OpenPGP inte lyckas. De vanligaste beskrivs nedan; Mer information finns på Enigmail supportsida.

GnuPG kunde inte hittas

För att OpenPGP ska fungera, behövs verktyget GnuPG installeras. Om GnuPG inte kan hittas, se då först till att den körbara gpg.exe (för Windows; gpg för andra plattformar) är installeras på din dator. Om GnuPG är installerat, och OpenPGP kan inte hitta den, måste du manuellt ange sökväg till GnuPG i OpenPGP's inställningar (meny OpenPGP > Inställningar)

Enigmime gick inte att initiera

OpenPGP fungerar endast om den är byggd med samma byggmiljö som Thunderbird eller SeaMonkey byggdes med. Det innebär att du kan använda den officiella Enigmail releaser endast om du använder de officiella releaserna av Thunderbird eller SeaMonkey som tillhandahålls av mozilla.org.

Om du använder en Thunderbird eller SeaMonkey version som kommer från någon annan källa (t.ex. leverantören av din Linux-distribution), eller om du byggde programmet själv, bör du antingen använda en Enigmail version byggda med samma källa, eller bygga Enigmail själv. För att bygga Enigmail, se Avsnittet källkod på Enigmail's hemsida. Skicka eller lämna inte någon felrapporter om detta problem, det kan inte lösas.

Ytterligare hjälp finns på Enigmail's Supportwebbplats.

enigmail-2.0.8/lang/sv-SE/help/messenger.html000066400000000000000000000102511334302754500207770ustar00rootroot00000000000000 Enigmail Hjälp: Läsa meddelanden

Enigmail Hjälp

Använda Enigmail när du läser meddelanden

Dekryptera knappen i mailets huvudfönster
Denna knapp kan användas för flera ändamål: dekryptera, verifiera, eller importera allmänna nycklar. Normalt dekryptering/verifiering sker automatiskt, även om detta kan inaktiveras genom en inställning. Om detta misslyckas, kommer vanligtvis en kort felmeddelande i Enigmail's statusrad. Om du klickar på Dekryptera knappen, kommer du att kunna se ett mer detaljerat felmeddelande, inklusive utdata från kommandot GnuPG.
Penn- och nyckelikoner som visas i meddelandehuvudet
Penn- och Nyckelikoner i meddelandehuvudet visar om meddelandet som du läser signerats och/eller krypterats och om signaturen är bra, det vill säga meddelandet har inte förändrats sedan det signerades. Om meddelandet har ändrats, Pennikonen ändras till en bruten penna för att indikera att signaturen är dålig. Högerklicka på antingen penn- eller nyckelikonen visar en meny med följande alternativ:
  • OpenPGP säkerhetsinfo: lÃ¥ter dig se utdata frÃ¥n GnuPG för meddelandet.
  • Kopiera OpenPGP säkerhetsinfo: kopierar utdata frÃ¥n GnuPG till urklipp; för att klistra in ett svarsmeddelande, etc.
  • Visa OpenPGP foto-ID: lÃ¥ter dig se foto-ID för den person som skickade meddelandet, om de har ett foto inbäddad i sin publika nyckel. (Detta alternativ kommer endast att aktiveras om ett foto-ID finns i deras nyckel.)
  • S/MIME säkerhetsinfo: lÃ¥ter dig se pÃ¥ S/MIME säkerhetsinfo för meddelandet.

Om du inte har angett keyserver-options auto-key-retrieve i din gpg.conf fil och du läser ett meddelande som är signerat eller krypterat, kommer du att se en Penn-ikon i huvudområdet med ett Frågetecken på den, Enigmail's statusrad i huvudområdet visar del av meddelandet signerat; klicka på pennikonen för detaljer och meddelandet i meddelandefönstret visar alla OpenPGP meddelandeblocksindikatorer och signaturblock.

Du kan också se detta om du har angett keyserver-options auto-key-retrieve i din gpg.conf fil och OpenPGP nyckeln inte finns på standardnyckelservern.

Genom att klicka på Penn och frågetecknet-ikonen kommer ett fönster upp som meddelar att nyckeln inte är tillgänglig i din nyckelring. Om du klickar på OK kommer att ett nytt fönster upp med en lista över nyckelservrar där du kan välja att hämta avsändarens publika nyckel från.

För att konfigurera listan med nyckelservrar som du vill använda, gå till Enigmail-> Inställningar->grundläggande fliken och ange nyckelserverns adress i nyckelserver: rutan, separerade med ett kommatecken. Den första nyckelservern i listan kommer att användas som standard.

Öppna krypterade bilagor/importera bifogade OpenPGP nycklar
Bifogade filer som slutar på *.Pgp, *.Asc och *.Gpg känns igen som bilagor som kan hanteras speciellt av Enigmail. Genom att högerklicka på en sådan bilaga möjliggörs två speciella menyalternativ i snabbmenyn: Dekryptera och öppna och Dekryptera och spara. Använd dessa två menyalternativ om du vill att Enigmail ska dekryptera en bifogad fil innan du öppnar eller sparar den. Om en bilaga känns igen som en OpenPGP nyckelfil, erbjuds du att importera nycklarna till din nyckelring.

Ytterligare hjälp finns på Enigmail's Supportwebbplats

enigmail-2.0.8/lang/sv-SE/help/rulesEditor.html000066400000000000000000000062411334302754500213140ustar00rootroot00000000000000 Enigmail Hjälp: Regelredigeraren

Enigmail Hjälp

Använda Enigmail's regelredigerare

I regelredigeraren kan du ange standardinställningar per mottagare för att möjliggöra kryptering, signering och PGP/MIME, och ange vilken OpenPGP nyckel som ska användas. Varje regel består av fem områden och är representerade på en rad:

E-post
E-post att matcha i fälten Till:, Kopia: och Hemlig kopia:. Matchningen fungerar på delsträngar (Ytterligare information finns i fönstret redigera regler.)
OpenPGP nyckel
en lista med OpenPGP nyckel-ID för att använda för mottagaren
Signera
aktivera eller inaktivera signering av meddelanden. Detta använder eller åsidosätter vad du har specificerat i meddelandefönstret. Värdena är:
  • Aldrig: inaktivera signering, även om den var aktiverad i meddelandefönstret (upphäver de andra värdena)
  • Möjlig: lämna signering som angetts i meddelandefönstret
  • Alltid: aktivera signering, även om den inte var aktiverad i meddelandefönstret

Dessa signeringsinställningar tillämpas för alla regler som matchar. Om en av reglerna inaktiverar signering kommer meddelandet inte signeras, oberoende av andra regler som anger Alltid.

Kryptera
aktivera eller inaktivera kryptering av meddelande. Tillåtna inställningar och deras betydelse är de samma som för signering av meddelande.
PGP/MIME
aktivera eller inaktivera användning av PGP/MIME (RFC 3156) meddelandekodning. Om PGP/MIME är inaktiverad kodas meddelandena med "inline PGP". Tillåtna värden och deras betydelse är de samma som för signering av meddelande.

Reglerna behandlas i den ordning som visas i listan. När en regel matchar en mottagare och innehåller en OpenPGP nyckel-ID, utöver att använda den angivna nyckel-ID, mottagaren räknas inte längre vid behandling av ytterligare regler.

OBS: Regelredigeraren är ännu inte klar. Det är möjligt att skriva några mer avancerade regler genom att direkt redigera filen rules (dessa regler bör då inte redigeras längre i regelredigeraren). Mer information för att direkt redigera filen finns tillgänglig på Enigmail's hemsida


Ytterligare hjälp finns på Enigmail's Supportwebbplats

enigmail-2.0.8/lang/sv-SE/help/sendingPrefs.html000066400000000000000000000054021334302754500214400ustar00rootroot00000000000000 Enigmail Hjälp: Redigera OpenPGP regel

Enigmail Hjälp

Fastställa inställningar för att skicka krypterat

I inställningar för att skicka kan du välja en allmän modell och inställningar för kryptering.

Smidig kryptering
Med dessa inställningar, krypteras e-post utan bekräftelse när det är möjligt.

Denna inställning är lämplig, om du vill förbättra din integritet genom att skicka e-post krypterat istället för okrypterat om det är möjligt.

Effekten är som att skicka e-post som brev istället för vykort. Till skillnad från vykort, döljer brev oftast sitt innehåll under transport.

Observera dock att som med brev kan du inte vara säker på att ingen öppnar brevet under transporten (även om vissa tekniska ansträngningar krävs för det).

En konkret risk är att du av misstag använder "förfalskade nycklar" du fick från någonstans eller någon som hävdar att nyckeln tillhör den person som du vill skicka e-post till. För att undvika denna risk, kan du antingen använda förtroende modellen av PGP (se nedan) eller bör du alltid kontrollera, om fingeravtryck av en publik nyckel är korrekt.

Manuell kryptering
Med det här alternativet kan du ange olika inställningar för kryptering enligt dina behov. Du kan ange
  • om svar pÃ¥ krypterade/signerade e-postmeddelanden bör automatisk ocksÃ¥ vara krypterad/signerad-
  • om du vill använda förtroende modellen av OpenPGP för att acceptera nycklar (detta innebär att man använder en nyckel som du antingen mÃ¥ste signera nyckel eller har tillräckligt mÃ¥nga andra människor du litar pÃ¥ som har signerat nyckeln).
  • om du vill skicka e-post krypterat om alla nycklar accepteras.
  • om och när du vill slutligen bekräfta sändning av ett mail.
Om det är viktigt för dig att innehåll som du skickar krypteras inte kan läsas av andra personer eller organisationer, bör du använda de manuella inställningarna. Välj åtminstone alternativet att ta emot nycklarna om du eller andra människor signerat dem. Även denna modell minskar risken för att använda förfalskade nycklar, det kräver att du aktivt signerar nycklar och förklarar ägare förtroende med hjälp av fönstret nyckelhanteraren. enigmail-2.0.8/lang/tr/000077500000000000000000000000001334302754500146625ustar00rootroot00000000000000enigmail-2.0.8/lang/tr/am-enigprefs.properties000066400000000000000000000001241334302754500213520ustar00rootroot00000000000000# Strings used in the Mozill AccountManager prefPanel-enigprefs=OpenPGP Güvenliği enigmail-2.0.8/lang/tr/enigmail.dtd000066400000000000000000001365331334302754500171570ustar00rootroot00000000000000 ' kullan"> ' karakterlerini kullan. Alıcıların eski Hushmail anahtarları varsa etkisiz kıl."> NOT: Anahtar üretiminin bitmesi biraz zaman alabilir. Anahtar üretimi sırasında uygulamayı kapatmayın. Aktif olarak internette gezinmek ya da diskle ilgili işler yapmak rasgele üretimi kolaylaştıracağından işlemin hızını artıracaktır. Anahtar üretimi bittiğinde uyarılacaksınız."> ' yanlış"> NOT: Anahtar üretimi biraz uzun sürebilir. Anahtar üretimi sırasında uygulamayı kapatmayın. Anahtar üretimi bittiğinde uyarılacaksınız."> Not: Enigmail ayarlarda etkin olup olmamasına bakmadan herzaman her kimlikteki ya da hesaptaki imzaları doğrulayacaktır."> Enigmail kullandığınız için teşekkürler."> enigmail-2.0.8/lang/tr/enigmail.properties000066400000000000000000001515561334302754500206020ustar00rootroot00000000000000Enigmail=Enigmail ##################################################################### # Strings used within enigmailCommon.js and enigmailCommon.jsm ##################################################################### enigAlert=Enigmail Uyarı enigConfirm=Enigmail Doğrula # enigInfo=Enigmail Information enigError=Enigmail Hata enigPrompt=Enigmail Bilgi İstemi dlgYes=Evet dlgNo=Hayır dlgKeepSetting=Cevabımı hatırla ve tekrar sorma dlgNoPrompt=Bu diyaloğu tekrar gösterme dlg.button.delete=&Sil dlg.button.cancel=&Vazgeç dlg.button.close=&Kapat dlg.button.continue=&Devam dlg.button.skip=&Atla # dlg.button.overwrite=&Overwrite dlg.button.view=&Göster # dlg.button.retry=&Retry # dlg.button.ignore=&Ignore # dlg.button.install=&Install # dlg.button.ok=&OK repeatPrefix=\n\nBu uyarı tekrar edecek %S repeatSuffixSingular=kere daha. repeatSuffixPlural=kere daha. noRepeat=\n\nBu uyarı Enigmail'i yükseltene kadar tekrar etmeyecek. pgpNotSupported=Enigmail'yi PGP 6.x sürümüyle kullanıyor görünüyorsunuz\n\nPGP 6.x Enigmail'in düzgün çalışmasını bazı sebeplerden engellediğinden Enigmail 6.x desteklemiyor; lütfen GnuPG (GPG)'ye geçiş yapın.\n\nGnuPG'ye geçiş konusunda yardıma ihtiyacınız olursa, Enigmail ana sayfasından Yardım kısmına göz atın. # initErr.howToFixIt=In order to use Enigmail, GnuPG is required. If you did not install GnuPG yet, the easiest way to do this is using the "Setup Wizard" button below. # initErr.setupWizard.button=&Setup Wizard passphraseCleared=Parola temizlendi. # cannotClearPassphrase=You are using a non-standard tool (such as gnome-keyring) for passphrase handling. Clearing the passphrase is therefore not possible from within Enigmail. noPhotoAvailable=Hiçbir fotoğraf uygun değil debugLog.title=Enigmail Debug Log # error.photoPathNotReadable=Photo path '%S' is not readable # generalError=Error: %S # Strings in configure.jsm # enigmailCommon.versionSignificantlyChanged=This new version of Enigmail has significant changes in the handling of preferences and options. We tried to transfer the old settings to this new version. However, we cannot cover all cases automatically. Please double check the resulting new preferences and options. # enigmailCommon.checkPreferences=Check Preferences ... # preferences.defaultToPgpMime=We have changed the default message encoding in Enigmail from Inline-PGP to PGP/MIME. We recommend you keep this as default.\n\nIf you still wish to use Inline-PGP by default, you can do so in the Account Settings under OpenPGP Security. ##################################################################### # Strings in enigmailAbout.js ##################################################################### usingVersion=Enigmail %S sürümü kullanıyorsunuz # enigmailPepVersion=Enigmail/p≡p version %S usingAgent=Şifreleme ve deşifreleme için %S çalışıtırılabiliri %S kullanılıyor agentError=HATA: Enigmime servisine ulaşılamadı! ##################################################################### # Strings in enigmailKeygen.js ##################################################################### accessError=Enigmail servisine erişimde hata onlyGPG=Anahtar üretimi sadece GnuPG ile çalışır (PGP ile değil)! keygenComplete=Anahtar üretimi tamamlandı! İmzalama için <%S> kimliği kullanılacak revokeCertRecommended=Anahtarınız için bir iptal sertifikası oluşturmanızı öneririz. Bu sertifika örneğin özel anahtarınız kaybolur ya da çalınırsa, anahtarınızın iptali için gereklidir. Böyle bir iptal sertifikası oluşturmak istiyor musunuz ? keyMan.button.generateCert=Sertifika &Oluştur genCompleteNoSign=Anahtar üretimi tamamlandı! genGoing=Anahtar üretimi işlem halinde! passNoMatch=Parolalar uyuşmuyor, lütfen tekrar girin passCheckBox=Anahtar için bir parola girmeyecekseniz lütfen kutuyu işaretleyin passUserName=Lütfen bu kimlik için bir kullanıcı adı belirleyin # keygen.missingUserName=There is no name specified for the selected account/identity. Please enter a value in the field "Your name" in the account settings. # keygen.passCharProblem=You are using special characters in your passphrase. Unfortunately, this can cause troubles for other applications. We recommend you choose a passphrase consisting only of any of these characters:\na-z A-Z 0-9 /.;:-,!?(){}[]%* # passSpaceProblem=Due to technical reasons, your passphrase may not start or end with a space character. changePassFailed=Parola değişimi başarısız. keyConfirm='%S' için genel ve özel anahtarlar oluşturulsun mu? keyMan.button.generateKey=Anahtar &Üret keyAbort=Anahtar üretiminden çık? keyMan.button.generateKeyAbort=Anahtar Üretimini &İptal Et keyMan.button.generateKeyContinue=Anahtar Üretimine &Devam Et expiryTooLong=100 yıldan uzun sürede kaybolan bir anahtar oluşturamazsınız. expiryTooLongShorter=90 yıldan uzun sürede kaybolan bir anahtar oluşturamazsınız. expiryTooShort=Anahtarınız en az bir günlük olmalı. keyGenFailed=Anahtar üretimi başarısız. Daha fazla bilgi için Enigmail konsoluna göz atın ( Enigmail Menüsü > Hata ayıklama ) # setKeyExpirationDateFailed=The expiration date could not be changed # Strings in enigmailMessengerOverlay.js securityInfo=Enigmail Güvenlik Bilgisi\n\n enigHeader=Enigmail: enigContentNote=Enigmail: *Bu mesajın ekleri imzalanmadı ve şifrelenmedi*\n\n possiblyPgpMime=Muhtemelen PGP/MIME mesajı şifreledi ya da imzaladı; doğrulamak için Deşifre düğmesine tıklayın saveAttachmentHeader=Enigmail: Deşifre edilmiş eki kaydet noTempDir=Yazacak geçici bir dizin bulunamadı\nLütfen TEMP çevre değişkenini belirleyin attachmentPgpKey=Açtığınız '%S' eki bir OpenPGP anahtar dosyasına benziyor.\n\nİçindeki anahtarları almak için Evet'e, dosya içeriğini ayrı bir pencerede görmek için Hayır'a tıklayın beginPgpPart=********* *SIFRELI veya IMZALI KISIM BASLANGICI* ********* endPgpPart=********** *SIFRELI veya IMZALI KISIM BITISI* ********** notePartEncrypted=Enigmail: *Mesajın bazı kısımları şifrelenmedi veya imzalanmadı* noteCutMessage=Enigmail: *Birden fazla mesaj bloğu bulundu -- deşifre/doğrulama işlemi durduruldu* decryptOkNoSig=Uyarı\n\nDeşifre işlemi başarılıydı, ama imza düzgün doğrulanamadı msgOvl.button.contAnyway=Yine de &devam et # signature.verifiedOK=The signature for attachment %S was successfully verified # signature.verifyFailed=The signature for attachment %S could not be verified # attachment.noMatchToSignature=Could not match attachment '%S' to a signature file # attachment.noMatchFromSignature=Could not match signature file '%S' to an attachment # fixBrokenExchangeMsg.failed=Did not succeed to repair message. # enigmail.msgViewColumn.label=Enigmail # enigmailPep.msgViewColumn.label=Enigmail/p≡p # wksNoIdentity=This key is not linked to any of your email accounts. Please add an account for at least one of the following email addresse(s):\n\n%S # wksConfirmSuccess=Confirmation email sent. # wksConfirmFailure=Sending the confirmation email failed. # autocrypt.importSetupKey.accountPreconfigured=Your account is already correctly configured for Autocrypt.\n\nDo you really want to overwrite your settings with this setup message? # autocrypt.importSetupKey.selfCreated=This message was created by your currently running instance of Enigmail.\n\nPlease switch to the email client to which you want to transfer the settings, and click on the message on that email client to import the settings. # autocrypt.importSetupKey.invalidMessage=Error - could not read setup message. The message seems to be corrupted. Please try to create a new setup message on your "other" device. # autocrypt.importSetupKey.invalidKey=Error - the key could not be imported. The key is either not supported by your version of GnuPG, or it got corrupted. # autocrypt.importSetupKey.wrongPasswd=The password you entered is wrong. Do you want to retry? # autocrypt.importSetupKey.success=The Autocrypt setup message was processed successfully. Autocrypt is now available for your account '%S'. ##################################################################### # Strings in enigmailMsgComposeOverlay.js ##################################################################### keysToExport=Eklenecek OpenPGP anahtarlarını seçin keysToUse=%S için kullanılacak OpenPGP Anahtarı(ları)nı seçin pubKey=%S için Genel Anahtar\n windowLocked=Yazım penceresi kilitli; gönderme iptal edildi sendUnencrypted=Enigmail başlatılamadı.\nŞifrelenmemiş gönder? composeSpecifyEmail=Lütfen gönderilen mesajları imzalamada kullanılacak birincil eposta adresinizi belirtin.\nBoş bırakırsanız mesajdan alınan KİMDEN adresi kullanılacak. sendingHiddenRcpt=Bu mesajın BCC (kör karbon kopya) alıcıları var. Mesaj şifrelenmişse, BCC alıcıları saklamak mümkün olmasına rağmen bazı ürünlerin kullanıcıları (ör: PGP Corp.) mesajı deşifre edemeyecektir. Bu durum yüzünden şifrelenmiş mesajlar içeren ve BCC kullanılan postaları önermiyoruz. sendWithHiddenBcc=BCC alıcıları gizle sendWithShownBcc=Normal şifrele sendingNews=Şifrelenmiş gönderim iptal edildi.\n\n Bu mesaj şifrelenemez çünkü haber grubuna dahil alıcıları var. Lütfen şifrelemeden tekrar gönderin. sendToNewsWarning=Uyarı: şifrelenmiş bir postayı haber grubuna yollamak üzeresiniz.\n\nBu durum pek mantıklı değil çünkü üyelerin hepsi mesajı deşifre edemediği sürece bir anlamı olmayacak, mesajın tüm grup üyelerinin anahtarları ile şifrelenmesi gerekiyor. Lütfen bu mesajı ne yaptığınızı bildiğinizden eminseniz yollayın.\n\nDevam? hasHTML=HTML posta uyarısı:\nBu mesaj imzalama/şifreleme işlemini engelleyebilecek HTML içerebilir. Bu durumu önlemek için bir dahaki sefere mesaj yazma/cevaplama düğmelerine SHIFT tuşuna basılı tutarak tıklayın ki imzalı gönderilebilsin.\nPostaları öntanımlı olarak imzalıyorsanız, bu posta hesabında kalıcı olarak HTML'yi kapatmak için 'HTML Mesajları Gönder' seçeneğini kapatmalısınız. strippingHTML=Bu mesaj imzalama/şifreleme işlemleri için düz yazıya dönüştürüldüğünde kaybolacak HTML formatına sahip. Devam etmek istiyor musunuz ? msgCompose.button.sendAnyway=Mesajı &Yine de Gönder attachWarning=Bu mesajın ekleri yerelde değil. Şifrelenemezler. Ekleri şifrelemek için, önce bilgisayarınıza kaydedin ve sonra ekleyin. Yine de devam etmek istiyor musunuz? quotedPrintableWarn=Mesajları gönderirken 'quoted-printable' kullanılmasını istediniz. Bu mesajınızın yanlış deşifre edilmesine veya doğrulanmasına yol açabilir.\n 'quoted-printable' mesajlar göndermeyi kapatmak istiyor musunuz ? minimalLineWrapping=Satır bitimi %S karakter yapmışsınız. Düzgün şifreleme veya imzalama için bu değerin en az 68 olması gerek.\n 68'e değiştirmek istiyor musunuz? warning=Uyarı signIconClicked=İmzalamayı elle değiştirdiniz. Yani, bu mesajı yazarken, imzayı kapatmak artık şifrelemeyi kapatmaya bağımlı değil. # errorOwnKeyUnusable=The key ID '%S' configured for the current identity does not yield a usable OpenPGP key.\n\nPlease ensure that you have a valid, not expired OpenPGP key and that your account settings point to that key.\nIf your key is not expired, then check if you did set Owner trust to full or ultimate. # msgCompose.cannotSaveDraft=Error while saving draft # msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information - partially encrypted email. # msgCompose.partiallyEncrypted.mimeMsg=The message you are replying to contained both unencrypted and encrypted parts. Some encrypted message parts are invisible to you.\n\nIf the sender was not able to decrypt the hidden message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nWe recommend that you don't reply to the message, but create a new message containing your answer. # msgCompose.partiallyEncrypted.inlinePGP=The message you are replying to contained both unencrypted and encrypted parts. If the sender was not able to decrypt some message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nPlease consider removing all quoted text from your reply to this sender. # msgCompose.internalEncryptionError=Internal Error: promised encryption disabled # msgCompose.internalError=An internal error has occurred. # msgCompose.toolbarTxt.signAndEncrypt=This message will be signed and encrypted # msgCompose.toolbarTxt.signOnly=This message will be signed # msgCompose.toolbarTxt.encryptOnly=This message will be encrypted # msgCompose.toolbarTxt.noEncryption=This message will be unsigned and unencrypted # msgCompose.toolbarTxt.disabled=Enigmail is disabled for the selected identity # msgCompose.protectSubject.tooltip=Protect the message subject # msgCompose.noSubjectProtection.tooltip=Do not protect the message subject # msgCompose.encryptedSubjectStub=Encrypted Message # msgCompose.protectSubject.dialogTitle=Enable Protection of Subject? # msgCompose.protectSubject.question=Regular encrypted emails contain the unredacted subject.\n\nWe have established a standard to hide the original subject in the encrypted message\nand replace it with a dummy text, such that the subject is only visible after the email is decrypted.\n\nDo you want to protect the subject in encrypted messages? # msgCompose.protectSubject.yesButton=&Protect subject # msgCompose.protectSubject.noButton=&Leave subject unprotected # msgCompose.detailsButton.label=Details ... # msgCompose.detailsButton.accessKey=D # msgCompose.pepSendUnknown=Unknown # msgCompose.pepSendUnsecure=Unsecure # msgCompose.pepSendSecure=Secure # msgCompose.pepSendTrusted=Secure & Trusted # pep.alert.disabledForIdentity=p≡p is disabled for the current identity. Please enable p≡p via the Enigmail/p≡p preferences. # pep.alert.weakReply=You’re about to forward or reply to a secure message as insecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? # note: should end with double newline: sendAborted=Gönderme işleminden çıkıldı.\n\n # details: # keyNotTrusted=Not enough trust for key '%S' # keyNotFound=Key '%S' not found # keyRevoked=Key '%S' revoked # keyExpired=Key '%S' expired statPGPMIME=PGP/MIME # statSMIME=S/MIME statSigned=İMZALI statEncrypted=ŞİFRELENMİŞ statPlain=DÜZMETİN offlineSave=%S mesajı Gönderilmemiş Mesajlar klasöründe %S e kaydedelim mi? onlineSend=%S mesajını %S e gönder? encryptKeysNote=Not: mesaj şu Kullanıcı ID'si / Anahtarları ile şifreli: %S # hiddenKey= signFailed=Enigmail'de hata; Şifreleme/imzalama başarısız; şifrelenmemiş posta gönder? msgCompose.button.sendUnencrypted=Şifrelenmemiş Me&sajı Gönder recipientsSelectionHdr=Şifreleme için alıcıları seçin configureNow=Seçili kimlik için Enigmail güvenliğini henüz ayarlamadınız. Şimdi yapmak istiyor musunuz? # encryption/signing status and associated reasons: # encryptMessageAuto=Encrypt Message (auto) # encryptMessageNorm=Encrypt Message # signMessageAuto=Sign Message (auto) # signMessageNorm=Sign Message # encryptOff=Encryption: OFF # encryptOnWithReason=Encryption: ON (%S) # encryptOffWithReason=Encryption: OFF (%S) # encryptOn=Encryption: ON # signOn=Signing: ON # signOff=Signing: OFF # signOnWithReason=Signing: ON (%S) # signOffWithReason=Signing: OFF (%S) # reasonEnabledByDefault=enabled by default # reasonManuallyForced=manually forced # reasonByRecipientRules=forced by recipient rules # reasonByAutoEncryption=forced by auto encryption # reasonByConflict=due to conflict in recipient rules # reasonByEncryptionMode=due to encryption mode # should not be used anymore: encryptYes=Mesaj şifrelenecek encryptNo=Mesaj şifrelenmeyecek # should not be used anymore: signYes=Mesaj imzalanacak signNo=Mesaj imzalanmayacak # PGP/MIME status: # pgpmimeNormal=Protocol: PGP/MIME # inlinePGPNormal=Protocol: Inline PGP # smimeNormal=Protocol: S/MIME # pgpmimeAuto=Protocol: PGP/MIME (auto) # inlinePGPAuto=Protocol: Inline PGP (auto) # smimeAuto=Protocol: S/MIME (auto) # should not be used anymore # pgpmimeYes=PGP/MIME will be used # pgpmimeNo=Inline PGP will be used # Attach own key status (tooltip strings): # attachOwnKeyNo=Your own key will not be attached # attachOwnKeyYes=Your own key will be attached # attachOwnKeyDisabled=Your own key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. rulesConflict=Çakışan alıcı bazlı kurallar bulundu\n%S\n\nMesajı bu ayarlarla göndermek ister misiniz? msgCompose.button.configure=&Ayarla msgCompose.button.send=Mesajı &Gönder msgCompose.button.save=Mesajı &Kaydet # Strings in enigmailMsgHdrViewOverlay.js keyNeeded=İmzayı doğrulamak için %S genel anahtarı gerekli # keyUsed=Public key %S used to verify signature clickDecrypt=; Deşifre düğmesine tıklayın clickDecryptRetry=; tekrar denemek için Deşifre düğmesine tıklayın # clickDetailsButton=; click on 'Details' button for more information # clickImportButton=; click on the 'Import Key' button to import the key # keyTypeUnsupported=; the key type is not supported by your version of GnuPG msgPart=%S mesajının bir bölümü msgSigned=imzalı # msgSignedUnkownKey=signed with unknown key msgEncrypted=şifreli msgSignedAndEnc=imzalı ve şifreli unverifiedSig=Doğrulanmamış imza incompleteDecrypt=Deşifreleme tamamlanmadı needKey=Hata - mesajı deşifre etmek için gizli anahtar gerekli failedDecrypt=Hata - deşifreleme başarısız badPhrase=Hata - kötü parola failedDecryptVerify=Hata - deşifreleme/doğrulama başarısız mdcError=Hata - ileti bütünlük korumalı değildi viewInfo=; detaylar için Görünüm > Mesaj güvenliği bilgisi decryptedMsg=Deşifrelenmiş mesaj # decryptedMsgWithFormatError=Decrypted message (restored broken PGP email format probably caused by an old Exchange server, so that the result might not be perfect to read) # usedAlgorithms=Used Algorithms: %1$S and %2$S # pepStatusInfo.text=p≡p Message Status. # pepStatusInfo.title.m3=Under Attack # pepStatusInfo.info.m3=This message is not secure and has been tampered with. # pepStatusInfo.title.m1=Mistrusted # pepStatusInfo.info.m1=This message has a communication partner that has previously been marked as mistrusted # pepStatusInfo.title.r0=Unknown # pepStatusInfo.info.r0=This message does not contain enough information to determine if it is secure. # pepStatusInfo.title.r1=Cannot Decrypt # pepStatusInfo.info.r1=This message cannot be decrypted because the key is not available. # pepStatusInfo.title.r2=Cannot Decrypt # pepStatusInfo.info.r2=This message cannot be decrypted because the key is not available. # pepStatusInfo.title.r3=Unsecure # pepStatusInfo.info.r3=This message is unsecure. # pepStatusInfo.title.r4=Unsecure for Some # pepStatusInfo.info.r4=This message is unsecure for some communication partners. # pepStatusInfo.title.r5=Unreliable Security # pepStatusInfo.info.r5=This message has unreliable protection. # pepStatusInfo.title.r6=Secure... # pepStatusInfo.info.r6=This message is secure but you still need to verify the identity of your communication partner. # pepStatusInfo.title.r7=Secure & Trusted # pepStatusInfo.info.r7=This message is secure and trusted. # pepStatusInfo.color.green=Green # pepStatusInfo.color.yellow=Yellow # pepStatusInfo.color.red=Red # pepRevokeTrust.question=Do you really want to cancel the trust for %S? # pepRevokeMistrust.question=Do you really want to re-trust the key for %S? # pepRevokeTrust.doRevoke=Cancel &trust # wksConfirmationReq=Web Key Directory Confirmation Request # wksConfirmationReq.message=This message has been sent by your email provider to confirm deployment of your OpenPGP public key\nin their Web Key Directory.\nProviding your public key helps others to discover your key and thus being able to encrypt messages to you.\n\nIf you want to deploy your key in the Web Key Directory now, please click on the button "Confirm Request" in the status bar.\nOtherwise, simply ignore this message. # wksConfirmationReq.button.label=Confirm Request # autocryptSetupReq=Perform Autocrypt Setup # autocryptSetupReq.button.label=Start Setup # autocryptSetupReq.setupMsg.desc=This message contains all information to transfer your Autocrypt settings along with your secret key securely from your original device. # autocryptSetupReq.setupMsg.backup=You can keep this message and use it as a backup for your secret key. If you want to do this, you should write down the password and store it securely. # autocryptSetupReq.message.import=To import the settings and key(s) in Enigmail, please click on the "Start Setup" button in the status bar. # autocryptSetupReq.message.sent=Please click on the message on your new device and follow the instuctions to import the settings. # strings in pref-enigmail.js # oldGpgVersion20=Enigmail initialization failed.\n\nYou are using GnuPG version %1$S, which is not supported anymore. Enigmail requires GnuPG version %2$S or newer. Please upgrade your GnuPG installation, or Enigmail will not work. locateGpg=GnuPGP programını bul invalidGpgPath=GnuPGP verilen yolda çalıştırılamadı. Bu yüzden uygulamayı tekrar başlatana ya da doğru yolu girene kadar Enigmail kapatıldı. warningsAreReset=Tüm uyarılar ilk haline getirildi. prefs.gpgFound=GnuPG şurada bulundu: %S prefs.gpgNotFound=GnuPG bulunamadı prefs.warnAskNever=Uyarı: bu seçeneğin işaretlenmesi alıcılardan birinin anahtarı yoksa, daha fazla bilgi verilmeyen şifrelenmemiş mesajlara neden olacaktır -- Enigmail böyle bir durumda sizi uyarmayacaktır! # prefs.warnIdleTimeForUnknownAgent=Cannot connect to gpg-agent. Maybe your system uses a specialized tool for passphrase handling (e.g. gnome-keyring, seahorse-agent, KDE wallet manager, ...). Unfortunately Enigmail cannot control the passphrase timeout for the tool you are using. Therefore the respective timeout settings in Enigmail are disregarded. prefEnigmail.oneKeyserverOnly=Hata - kayıp OpePGP anahtarlarının otomatik indirilebilmesi için sadece bir anahtar sunucu belirtebilirsiniz. # Strings used in core.jsm # (said file also re-uses some strings from above) enterAdminPin=Lütfen SmartCard'ınızın YÖNETİCİ (admin) PIN'ini girin enterCardPin=Lütfen SmartCard PIN'inizi girin notInit=Hata - Enigmail servisi henüz başlatılmadı badCommand=Hata - şifreleme komutu başarısız cmdLine=komut satırı ve çıktısı: notRequired=Hata - şifreleme gerekmiyor notComplete=Hata - anahtar üretimi henüz bitmedi invalidEmail=Hata - geçersiz posta adres(ler)i noPassphrase=Hata - parola sağlanmamış noPGPblock=Hata - Düzgün zırhlı(armored) OpenPGP veri bloğu bulunamadı unverifiedReply=İçerden başlatılmış mesaj kısmı (cevap) muhtemelen değiştirilmiş # keyInMessageBody=Key in message body found. Click 'Import Key' to import the key sigMismatch=Hata - İmza kayıp cantImport=Genel anahtar aktarımında hata\n\n # doImportOne=Import %1$S (%2$S)? # doImportMultiple=Import the following keys?\n\n%S # previewFailed=Can't read public key file. # Strings used in errorHandling.jsm sc.wrongCardAvailable=Okuyucunuzda bulunan %S akıllı kartı bu mesajı işlemek için kullanılamaz.\nLütfen %S akıllı kartını takıp işlemi tekrarlayın. sc.insertCard=Bu işlem %S akıllı kartınızı gerektiriyor.\nLütfen gerekli akıllı kartı takıp işlemi tekrarlayın. sc.removeCard=Bu işlem okuyucuda hiçbir akıllı kartın olmamasını gerektiriyor.\nLütfen akıllı kartı çıkarıp işlemi tekrarlayın. sc.noCardAvailable=Okuyucunuzda SmartCard bulunamadı\nLütfen SmartCard'ınızı takıp işlemi tekrarlayın sc.noReaderAvailable=SmartCard okuyucunuza ulaşılamadı\nLütfen SmartCard okuyucunuzu takın, kartınızı takın, ve işlemi tekrarlayın # keyError.keySpecNotFound=The email address "%S" cannot be matched to a key on your keyring. # keyError.keyIdNotFound=The configured key ID "%S" cannot be found on your keyring. # keyError.resolutionAction=Please select a valid key in the OpenPGP section of your Account Settings. # missingPassphrase=Missing passphrase # errorHandling.gpgAgentInvalid=Your system is running a version of gpg-agent that is not suitable for your GnuPG version. # errorHandling.gpgAgentError=GnuPG reported an error in the communication with gpg-agent (a component of GnuPG). # errorHandling.dirmngrError=GnuPG reported an error in the communication with dirmngr (a component of GnuPG). # errorHandling.pinentryError=GnuPG cannot query your passphrase via pinentry. # errorHandling.readFaq=This is a system setup or configuration error that prevents Enigmail from working properly and cannot be fixed automatically.\n\nWe strongly recommend that you consult our support web site at https://enigmail.net/faq. gpgNotFound=GnuPG programı bulunamadı '%S'.\nGnuPG çalıştırılabilirinin yolunu düzgün girdiğinizi Enigmail Seçenekler menüsünden kontrol edin gpgNotInPath=PATH değişkeninde GnuPG çalıştırılabiliri bulunamadı.\nEnigmail Seçeneklerinden GnuPG çalıştırılabilirinin yolunu kontrol edin # enigmailNotAvailable=Enigmail core Service not available prefGood=%S kişisinden iyi imza prefBad=%S şahsından KÖTÜ İmza failCancel=Hata - Anahtar alımı kullanıcı tarafından iptal edildi failNoServer=Hata - Anahtar alınacak anahtar sunucu belirtilmedi failNoID=Hata - Anahtar almak için ID belirtilmemiş failKeyExtract=Hata - anahtar çıkartma komutu başarısız notFirstBlock=Hata - İlk OpenPGP bloğu genel anahtar bloğu değil importKeyConfirm=Mesajda gömülü olan genel anahtar(lar)ı ekleyelim mi? failKeyImport=Hata - anahtar eklemesi başarısız fileWriteFailed=%S dosyaya yazılamadı importKey=%S genel anahtarını anahtar sunucudan ekle: uploadKey=%S genel anahtarını anahtar sunucuya gönder: keyId=Anahtar ID'si keyAndSigDate=Anahtar ID'si: 0x%S / İmzalanma tarihi: %S keyFpr=Anahtar parmakizi: %S noEmailProvided=Posta adresi belirtmediniz! keyAlreadySigned=Anahtar zaten imzalı. ##################################################################### # Strings used in enigmailKeySelection.js ##################################################################### selKeyExpired=tarihi geçmiş %S createdHeader=Oluşturuldu atLeastOneKey=Anahtar seçilmedi! Bu diyaloğu geçmek için en az bir anahtar seçmelisiniz fewerKeysThanRecipients=Alıcı sayısından daha az anahtar seçtiniz. Şifrelemek için gerekli anahtar listesinin tam olduğundan emin misiniz? userSel.button.goBack=Daha fazla anahtar seç # userSel.secretKeySel.title=Select a Secret OpenPGP Key to Sign Your Messages # userSel.problemNoKey=No valid key # userSel.problemMultipleKeys=Multiple keys # should be same as thunderbird ENTITY sendLaterCmd.label: # sendLaterCmd.label=Send Later # Strings used in enigmailAttachmentDialog.js # pgpMimeNote=NOTE: PGP/MIME is not supported by all email clients. If you are unsure, select the %S option. first=ilk second=ikinci # Strings used in am-enigprefs.js / enigmailEditIdentity.js encryptKeyHeader=Şifreleme için OpenPGP Anahtarı seçin identityName=Kimlik: %S # switchPepMode=You are currently using the 'p≡p Junior' mode of Enigmail.\n\nBy enabling OpenPGP or S/MIME for an account, you are disabling p≡p and use the 'regular' mode of Enigmail without p≡p. # enableEnigmail=&Disable p≡p # Strings used in enigmailSingleRcptSettings.js noEncryption=Şifrelemeyi aktif ettiniz, ama anahtar seçmediniz. %S e gönderilen postaları şifrelemek için, anahtar listenizden bir ya da daha fazla doğru anahtar seçmelisiniz. %S için şifrelemeyi kapatmak istiyor musunuz? noKeyToUse=(yok - şifreleme yok) noEmptyRule=Kural boş olamaz! Lütfen Kural alanına bir posta adresi belirtin. invalidAddress=Girdiğiniz posta adres(ler)i düzgün değil. Alıcıların isimlerini girmemelisiniz, sadece posta adreslerini. Ör:\nYanlış: Yngwie Malmsteen \nDoğru: sirin.baba@adres.net # noCurlyBrackets=The curly brackets {} have a special meaning and should not be used in an email address. If you want to modify the matching behavior for this rule, use the 'Apply rule if recipient ...' option.\nMore information is available from the Help button. # Strings used in enigmailRulesEditor.js never=Asla always=Her zaman possible=Mümkün deleteRule=Seçili kuralı gerçekten silmek istiyor musunuz? nextRcpt=(Sonraki alıcı) negateRule=Değil # addKeyToRule=Add key %1$S (%2$S) to per-recipient rule # Strings used in enigmailSearchKey.js needOnline=Seçtiğiniz fonksiyon çevrimdışı modda kullanılamaz. Çevrimiçi olup tekrar deneyin. protocolNotSupported=Seçtiğiniz '%S://' protokolü OpenPGP anahtarları indirmek için uygun değil. gpgkeysDisabled='extensions.enigmail.useGpgKeysTool' seçeneğini açmak yardımcı olabilir. noKeyserverConn=%S konumundaki anahtar sunucuya bağlanılamadı. keyDownloadFailed=Anahtar sunucudan anahtar indirilemedi. Durum mesajı:\n%S internalError=Dahili hata. Anahtarlar indirilemedi veya aktarılamadı. noKeyFound=Üzgünüm, belirtilen arama kriterlerine uygun anahtar bulunamadı.\nAnahtar ID'lerinin "0x" öneki ile kullanılmaları gerektiğini unutmayın(ör: 0xABCDEF12). # keyDownload.keyUnavailable=We are sorry, but the key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their key by email. # gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. gpgKeysFailed=Anahtar getirmede ya da aramada hata: gpgkeys_%S çalıştırılamadı. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Anahtar sahibi güvenilirliği başarısız # Strings in enigmailSignKeyDlg.js signKeyFailed=Anahtar imzalama başarısız # alreadySigned.label=Note: the key %S is already signed with the selected secret key. # alreadySignedexportable.label=Note: the key %S is already signed exportable with the selected secret key. A local signature does not make sense. # partlySigned.label=Note: some user IDs of key %S are already signed with the selected secret key. # noTrustedOwnKeys=No eligible key found for signing! You need at least one fully trusted secret key in order to sign keys. # Strings in enigmailKeyManager.js keyMan.loadingKeys=Anahtarlar yükleniyor, lütfen bekleyin ... keyValid.unknown=bilinmeyen keyValid.invalid=yanlış keyValid.disabled=aktif değil keyValid.revoked=iptal edilmiş keyValid.expired=süresi dolmuş keyValid.noSubkey=düzgün alt anahtar yok keyTrust.untrusted=güvenilmeyen keyTrust.marginal=marjinal keyTrust.full=güvenilir keyTrust.ultimate=ultra # keyTrust.group=(group) keyType.public=genel keyType.publicAndSec=pub/sec keyMan.enableKey=Anahtar Aktif Et keyMan.disableKey=Anahtar Etkisiz Kıl userAtt.photo=Kullanıcı özelliği (JPEG resim) asciiArmorFile=ASCII Zırhlı Dosyalar (*.asc) # importKeyFile=Import OpenPGP Key File gnupgFile=GnuPG Dosyaları # createKeyOK=Your Key has been generated saveRevokeCertAs=İptal etme sertifikası Oluştur & Kaydet # revokeCertOK=The revocation certificate has been successfully created. You can use it to invalidate your public key, e.g. in case you would lose your secret key. revokeCertFailed=İptal sertifikası oluşturulamadı. addUidOK=Kullanıcı ID'si eklendi addUidFailed=Kullanıcı ID'si ekleme başarısız noKeySelected=Bu işlemi yapmak için en az bir anahtar seçmelisiniz exportToFile=Genel Anahtarı Dosyaya Aktar # exportKeypairToFile=Export Secret and Public Key To File exportSecretKey=Özel anahtarı kaydedilen OpenPGP anahtar dosyasına eklemek istiyor musunuz? saveKeysOK=Anahtarlar kaydedildi saveKeysFailed=Anahtarlar kaydedileMEdi importKeysFailed=Anahtarlar aktarılamadı enableKeyFailed=Anahtarları aktif/etkisiz yapılması başarısız specificPubKeyFilename=%S (0x%S) pub specificPubSecKeyFilename=%S (0x%S) pub-sec defaultPubKeyFilename=Aktarilmis-genel-anahtarlar defaultPubSecKeyFilename=Aktarilmis-genel-ve-ozel-anahtarlar noSecretKeys=Özel anahtar bulunamadı.\n\nAnahtarınızı şimdi üretmek ister misiniz? sendKeysOk=Anahtar(lar) gönderildi sendKeysFailed=Anahtarlar gönderileMEdi receiveKeysOk=Anahtar(lar) güncellendi receiveKeysFailed=Anahtarlar indirilemedi importFromClip=Panodan anahtar aktarmak ister misiniz? # importFromUrl=Download public key from this URL: copyToClipbrdFailed=Seçili anahtar(lar) panoya kopyalanamadı copyToClipbrdOK=Anahtar(lar) panoya kopyalandı deleteSecretKey=UYARI: Bir özel anahtar silmek üzeresiniz!\nözel anahtarınızı silerseniz bu anahtar için şifrelenmiş hiçbir mesajı açamazsınız, ve anahtarınızı artık iptal edemezsiniz.\n\nGerçekten hem özel hem genel anahtarınızı silmek istiyor musunuz\n'%S'? deleteMix=UYARI: özel anahtarları silmek üzeresiniz!\nözel anahtarınızı silerseniz, bu anahtar için şifrelenmiş mesajları açamazsınız.İKİSİNİ de, seçili özel ve genel anahtarları silmek istediğinizden emin misiniz? deletePubKey=Genel anahtarı silmek istiyor musunuz\n'%S'? deleteSelectedPubKey=Genel anahtarları silmek istiyor musunuz? deleteKeyFailed=Anahtar silinemedi # revokeKeyQuestion=You are about to revoke the key '%S'.\n\nYou will no longer be able to sign with this key, and once distributed, others will no longer be able to encrypt with that key. You can still use the key to decrypt old messages.\n\nDo you want to proceed? revokeKeyOk=Anahtar iptal edildi. Anahtarınız bir anahtar sunucudaysa, tekrar yüklemeniz önerilir, böylece diğerleri iptal edildiğini görebilir. revokeKeyFailed=Anahtar iptal edilemedi. # revokeKeyNotPresent=You have no key (0x%S) which fits to this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before the revocation certificate! # revokeKeyAlreadyRevoked=The key 0x%S has already been revoked. refreshAllQuestion=Anahtar seçmediniz. TÜM anahtarları yenilemek ister misiniz? # refreshKeyServiceOn.warn=Warning: Your keys are currently being refreshed in the background as safely as possible.\nRefreshing all your keys at once will unnecessarily reveal information about you.\nDo you really want to do this? refreshKey.warn=Uyarı: anahtar sayısı ve bağlantı hızına bağlı olarak, tüm anahtarların yenilenmesi uzun sürebilir!\n\nDevam? # downloadContactsKeys.warn=Warning: depending on the number of contacts and the connection speed, downloading all keys could be quite a lengthy process! # downloadContactsKeys.importFrom=Import contacts from address book '%S'? keyMan.button.exportSecKey=&Gizli Anahtarları Dışa Aktar keyMan.button.exportPubKey=Sadece &Açık Anahtarları Dışa Aktar keyMan.button.import=&İçe Aktar keyMan.button.refreshAll=&Tüm Anahtarları Tazele keyMan.button.revokeKey=&Anahtarı Hükümsüz Kıl # keyMan.button.skip=&Skip Key keylist.noOtherUids=Başka kimliği yoktur keylist.hasOtherUids=Ayrıca şöyle bilinir keylist.noPhotos=Uygun fotoğraf yok keylist.hasPhotos=Fotoğraflar # keyMan.addphoto.filepicker.title=Select photo to add # keyMan.addphoto.warnLargeFile=The file you have chosen is larger than 25 kB.\nIt is not recommended to add very large files because the keys get very large by this. # keyMan.addphoto.noJpegFile=The selected file does not appear to be a JPEG file. Please choose a different file. # keyMan.addphoto.failed=The photo could not be added. # noWksIdentity=The key %S does not have a WKS identity. # keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key "%1$S (%2$S)" for encrypting messages? # keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key "%1$S (%2$S)" for future messages? # keyman.addBlacklistKey.button=&Blacklist the key # keyman.removeBlacklistKey.button=&Remove key from Blacklist # Strings in enigmailManageUidDlg.xul changePrimUidFailed=Birincil kullanıcı ID'si değişimi başarısız changePrimUidOK=Birincil kullanıcı ID'Si değiştirildi revokeUidFailed=%S kullanıcı ID'sinin iptali başarısız revokeUidOK=%S kullanıcı ID'si iptal edildi. Anahtarınız bir anahtar sunucudaysa, diğerlerinin iptali görebilmesi için tekrar yüklemeniz tavsiye edilir. revokeUidQuestion=Gerçekten kullanıcı ID'si %S'i iptal etmek istiyor musunuz? # Strings in enigmailKeyImportInfo.xul # importInfoTitle=SUCCESS! Keys imported # importInfoBits=Bits # importInfoCreated=Created # importInfoFpr=Fingerprint # importInfoDetails=(Details) # importInfoNoKeys=No keys imported. # Strings in enigmailKeyDetailsDlg.xul keyTypePublic=genel anahtar keyTypePrimary=özel anahtar keyTypeSubkey=altanahtar keyTypePair=anahtar çifti keyExpiryNever=asla keyAlgorithm_1=RSA keyAlgorithm_2=RSA keyAlgorithm_3=RSA keyAlgorithm_16=ELG keyAlgorithm_17=DSA # keyAlgorithm_18=ECDH # keyAlgorithm_19=ECDSA keyAlgorithm_20=ELG # keyAlgorithm_22=EDDSA # keyUsageEncrypt=Encrypt # keyUsageSign=Sign # keyUsageCertify=Certify # keyUsageAuthentication=Authentication # keyDoesNotExpire=Key does not expire # Strings in enigmailGenCardKey.xul keygen.started=Lütfen anahtar üretilirken bekleyin .... keygen.completed=Anahtar Üretildi. Yeni Anahtar ID'si: 0x%S keygen.keyBackup=Anahtar %S olarak yedeklendi keygen.passRequired=Eğer anahtarınız için SmartCard'ınız dışında bir yedek yaratmak istiyorsanız bir parola belirtin. # Strings in enigmailSetCardPin.xul cardPin.processFailed=PIN değiştirilemedi # Strings in enigRetrieveProgres.xul keyserverProgress.refreshing=Anahtarlar yenileniyor, lütfen bekleyin ... keyserverProgress.uploading=Anahtarlar gönderiliyor, lütfen bekleyin ... # keyserverProgress.wksUploadFailed=Could not upload your key to the Web Key Service # keyserverProgress.wksUploadCompleted=Your public key was successfully submitted to your provider. You will receive an email to confirm that you initiated the upload. keyserverTitle.refreshing=Anahtarları Yenile keyserverTitle.uploading=Anahtarları Gönder # Strings in enigmailSetupWizard passphrase.min8keys=Parolanız en az 8 karakter olmalı! setupWizard.reallyCancel=Enigmail Kurulum Sihirbazından gerçekten mi çıkmak istiyorsunuz? # setupWizard.invalidGpg=The file you specified is not a GnuPG executable. Please specify a different file. # setupWizard.specifyFile=You need to at least specify a public key file in order to proceed. # setupWizard.installFailed=It seems that the installation was not successful. Please either retry the installation, or install GnuPG manually and locate it using the Browse button. # setupWizard.downloadForbidden=For your own security, we will not download GnuPG. Please visit https://gnupg.org/ in order to download GnuPG. # setupWizard.downloadImpossible=We cannot download GnuPG currently. Please try later or visit https://gnupg.org/ in order to download GnuPG. # setupWizard.hashSumError=The wizard could not verify the integrity of the downloaded file. The file may be broken or manipulated. Do you want to continue the installation anyway? # setupWizard.importSettingsFile=Specify backup file to load from # setupWizard.invalidSettingsFile=The specified file is not a correct Enigmail Settings backup file. # setupWizard.gpgConfExists=The GnuPG config file already exists. Do you want to overwrite it with the one from your old installation? # setupWizard.noGpgHomeDir=It appears that you configured %S to use for GnuPG. However, this is not a directory - you cannot use it. # setupWizard.unmachtedIds=The following identities of your old setup could not be matched:\n%S\nThe settings for these identities were skipped. # Strings in installGnuPG.jsm # installGnuPG.downloadFailed=An error occurred while trying to download GnuPG. Please check the console log for further details. # installGnuPG.installFailed=An error occurred while installing GnuPG. Please check the console log for further details. # Strings in enigmailAddUidDlg.xul addUidDlg.nameOrEmailError=İsim ve mail adresi girmeniz gerekiyor addUidDlg.nameMinLengthError=İsmin en az 5 karakter olması gerekiyor addUidDlg.invalidEmailError=Doğru bir mail adresi belirtmelisiniz # Strings in enigmailCardDetails.js # Carddetails.NoASCII=OpenPGP Smartcards only support ASCII characters in Firstname/Name. # network error types # errorType.SecurityCertificate=The security certificate presented by the web service is not valid. # errorType.SecurityProtocol=The security protocol used by the web service is unknown. # errorType.Network=A network error has occurred. # filter stuff # filter.folderRequired=You must select a target folder. # filter.decryptMove.label=Decrypt permanently (Enigmail) # filter.decryptCopy.label=Create decrypted Copy (Enigmail) # filter.decryptMove.warnExperimental=Warning - the filter action "Decrypt permanently" may lead to destroyed messages.\n\nWe strongly recommend that you first try the "Create decrypted Copy" filter, test the result carefully, and only start using this filter once you are satisified with the result. # filter.tempPepFilterDesc=Temporary filter to store sent message unencrypted # filter.term.pgpencrypted.label=OpenPGP Encrypted # filter.encrypt.label=Encrypt to key (Enigmail) # filter.keyRequired=You must select a recipient key. # filter.keyNotFound=Could not find an encryption key for "%S". # filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for "%S" you will no longer be able to read the emails. # strings in enigmailConvert.jsm # converter.decryptBody.failed=Could not decrypt message with subject\n"%S".\nDo you want to retry with a different passphrase or do you want to skip the message? # converter.decryptAtt.failed=Could not decrypt attachment "%1$S"\nof message with subject\n"%2$S".\nDo you want to retry with a different passphrase or do you want to skip the message? # saveLogFile.title=Save Log File # strings in gpg.jsm # unknownSigningAlg=Unknown signing algorithm (ID: %S) # unknownHashAlg=Unknown cryptographic hash (ID: %S) # strings in keyRing.jsm # keyring.photo=Photo # keyRing.pubKeyRevoked=The key %1$S (key ID %2$S) is revoked. # keyRing.pubKeyExpired=The key %1$S (key ID %2$S) has expired. # keyRing.pubKeyNotForSigning=The key %1$S (key ID %2$S) cannot be used for signing. # keyRing.pubKeyNotForEncryption=The key %1$S (key ID %2$S) cannot be used for encryption. # keyRing.keyDisabled=The key %1$S (key ID %2$S) is disabled; it cannot be used. # keyRing.keyNotTrusted=The key %1$S (key ID %2$S) is not trusted enough. Please set the trust level of your key to "ultimate" to use it for signing. # keyRing.keyInvalid=The key %1$S (key ID %2$S) is not valid. Please consider verifying it correctly. Alternatively use the Default encryption settings in the Enigmail preferences dialog. # keyRing.signSubKeysRevoked=All signing-subkeys of key %1$S (key ID %2$S) are revoked. # keyRing.signSubKeysExpired=All signing-subkeys of key %1$S (key ID %2$S) have expired. # keyRing.signSubKeysUnusable=All signing-subkeys of key %1$S (key ID %2$S) are revoked, expired or otherwise unusable. # keyRing.encSubKeysRevoked=All encryption subkeys of key %1$S (key ID %2$S) are revoked. # keyRing.encSubKeysExpired=All encryption subkeys of key %1$S (key ID %2$S) have expired. # keyRing.noSecretKey=You do not seem to have the secret key for %1$S (key ID %2$S) on your keyring; you cannot use the key for signing. # keyRing.encSubKeysUnusable=All encryption subkeys of key %1$S (key ID %2$S) are revoked, expired or otherwise unusable. #strings in exportSettingsWizard.js # cannotWriteToFile=Cannot save to file '%S'. Please select a different file. # dataExportError=An error occurred during exporting your data. # enigmailSettings=EnigmailSettings # defaultBackupFileName=Enigmail-export # specifyExportFile=Specify file name for exporting # homedirParamNotSUpported=Additional params that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. #strings in expiry.jsm # expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use the new key. # expiry.keysExpireSoon=The following of your keys will expire in less than %1$S days:\n%2$S We recommend that you create new keys and configure your accounts to use the new keys. # expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to ultimate in key properties. # expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to ultimate in key properties. # expiry.OpenKeyManager=Open Enigmail Key Management # expiry.OpenKeyProperties=Open Key Properties #strings in pEpDecrypt.jsm # pEpDecrypt.cannotDecrypt=This is an encrypted message. Unfortunately you don't have the secret key to decrypt the message. #strings in gpgAgent.jsm # gpghomedir.notexists=The directory '%S' containing your OpenPGP keys does not exist and cannot be created. # gpghomedir.notwritable=The directory '%S' containing your OpenPGP keys is not writable. # gpghomedir.notdirectory=The directory '%S' containing your OpenPGP keys is a file instead of a directory. # gpghomedir.notusable=Please fix the directory permissions or change the location of your GnuPG "home" directory. GnuPG cannot work correctly otherwise. #strings in pepTrustWords.js # pepTrustWords.cannotVerifyOwnId=Cannot verify p≡p Trustwords for own account. # pepTrustWords.cannotFindKey=Cannot find key for %S. # pepTrustWords.cannotStoreChange=Could not change trust for %S. # pepTrustWords.generalFailure=Cannot obtain trustwords for %S. # pepTrustWords.partnerFingerprint=Fingerprint for %S: #strings in mimeWkdHandler.jsm # wkdMessage.body.req=Your email provider processed your request to upload your public key to the OpenPGP Web Key Directory.\n\nPlease click the confirmation button in the Enigmail header to complete the publishing of your public key. # wkdMessage.body.process=This is an email related to the automatic processing to upload your public key to the OpenPGP Web Key Directory.\n\nYou do not need to take any manual action at this point. #strings in pepHandshake.js # pepPrivacyStatus.RatingBrokenSuggestion=Either you or the sender should resend the message. # pepPrivacyStatus.RatingHaveNoKeySuggestionOutgoing=If you composed this message, your key is not available. # pepPrivacyStatus.RatingMistrustSuggestion=Re-establish the connection with your communication partner and try to complete another handshake. # pepPrivacyStatus.RatingReliableSuggestion=Complete a handshake with your communication partner by exchanging trustwords in person or over the phone. A handshake is needed only once per partner and will ensure secure and trusted communication. # pepPrivacyStatus.RatingTrustedSuggestion=No action needed! # pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware this message may not be secure. # pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Please add the necessary information. # pepPrivacyStatus.RatingUnderAttackSuggestion=Separately verify the content of this message with your communication partner. # pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least secure. # pepPrivacyStatus.RatingUnencryptedSuggestion=Please ask your communication partner to use an encryption solution or install p≡p. # pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or no signature. Ask your communication partner to upgrade their encryption solution or install p≡p. # pepPrivacyStatus.RatingBrokenExplanation=This message has broken encryption or formatting. # pepPrivacyStatus.RatingHaveNoKeyExplanation=This message cannot be decrypted because the key is not available. # pepPrivacyStatus.RatingMistrustExplanation=This message has a communication partner that has previously been marked as mistrusted. # pepPrivacyStatus.RatingReliableExplanation=This message is secure but you still need to verify the identity of your communication partner. # pepPrivacyStatus.RatingTrustedExplanation=This message is secure and trusted. # pepPrivacyStatus.RatingUndefinedExplanation=This message does not contain enough information to determine if it is secure. # pepPrivacyStatus.RatingUnderAttackExplanation=This message is not secure and has been tampered with. # pepPrivacyStatus.RatingUnencryptedExplanation=This message is unsecure. # pepPrivacyStatus.RatingUnencryptedForSomeExplanation=This message is unsecure for some communication partners. # pepPrivacyStatus.RatingUnreliableExplanation=This message has unreliable protection. # pepPrivacyStatus.RatingBrokenText=Broken # pepPrivacyStatus.RatingHaveNoKeyText=Cannot Decrypt # pepPrivacyStatus.RatingMistrustText=Mistrusted # pepPrivacyStatus.RatingReliableText=Secure # pepPrivacyStatus.RatingTrustedText=Secure & Trusted # pepPrivacyStatus.RatingUndefinedText=Unknown # pepPrivacyStatus.RatingUnderAttackText=Under Attack # pepPrivacyStatus.RatingUnencryptedForSomeText=Unsecure for Some # pepPrivacyStatus.RatingUnencryptedText=Unsecure # pepPrivacyStatus.RatingUnreliableText=Unreliable Security # handshakeDlg.button.initHandshake=Handshake... # handshakeDlg.button.stopTrust=Stop Trusting # handshakeDlg.button.reTrust=Stop Mistrusting # handshakeDlg.label.outgoingMessage=Outgoing message # handshakeDlg.label.incomingMessage=Incoming message # handshakeDlg.error.noPeers=Cannot handshake without any correspondents. # handshakeDlg.error.noProtection=Please enable protection in order to use the Handshake function. # enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device # enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup #strings in autocrypt.jsm # autocrypt.setupMsg.subject=Autocrypt Setup Message # autocrypt.setupMsg.msgBody=To set up your new device for Autocrypt, please follow the instuctions that should be presented by your new device. # autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code presented on your old device, and then import the contained key into your keyring. #strings in upgradeInfo.html # upgradeInfo.doctitle=What's New in Enigmail v2.0? # upgradeInfo.welcome1=Welcome to the new Enigmail version 2.0! # upgradeInfo.welcome2=The release contains a lot of new and changed features. Please take a minute to find out what's new: # upgradeInfo.encSubject.title=Encrypting the Message Subject # upgradeInfo.encSubject.desc=We developed a new method that moves the email subject into the encrypted message, and replaces the visible subject with "Encrypted Message". Once such a message is decrypted, the original subject is replaced automatically. Hiding the subject is on by default; there is a preference to turn it off if you don't like it. (Note: this feature requires the message to be sent with PGP/MIME.) # upgradeInfo.buttons.title=Changed behavior of Encrypt and Sign Buttons # upgradeInfo.buttons.desc=The Encrypt and Sign buttons in the message composer window now work for both the OpenPGP and S/MIME protocols. If both algorithms are possible, then Enigmail will try to prefer the one for which all keys are available. # upgradeInfo.autocrypt.title=Support for Autocrypt # upgradeInfo.autocrypt.desc=Enigmail now supports Autocrypt, a new standard to distribute keys as part of sent messages. Enigmail automatically imports keys from Autocrypt-compliant messages, such that over time more and more emails can be encrypted. # upgradeInfo.pEp.title=New p≡p Junior Mode (Pretty Easy Privacy) # upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. You currently need to manually install p≡p for this purpose; this will change in a future release. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. # upgradeInfo.bottom.desc=Please visit our documentation for help on using Enigmail. # pep.missingGnuPG=In order to use Enigmail/p≡p, GnuPG is required. As we could not find it, we suggest to download and install it for you. #strings in enigmailAbout.html # aboutEnigmail.tabName=About Enigmail # aboutEnigmail.title=OpenPGP support provided by Enigmail # aboutEnigmail.team=Enigmail is developed by the Enigmail Team: # aboutEnigmail.projectLeader=Lead Developer: # aboutEnigmail.usability=Usability: # aboutEnigmail.documentation=Documentation: # aboutEnigmail.testing=Testing: # aboutEnigmail.userSupport=User Support: # aboutEnigmail.localization=Localization: See the Enigmail Language Packs page # aboutEnigmail.Credits=Credits: # aboutEnigmail.origAuthor=Original author of the Enigmail extension # aboutEnigmail.icons=Icons: # aboutEnigmail.formerMembers=Former team members: # aboutEnigmail.projectHosting=Project hosting: # aboutEnigmail.licenseSupportTitle=License & Support # aboutEnigmail.license=Enigmail OpenPGP is open source and licensed under the %S # aboutEnigmail.support=Support and download is available from www.enigmail.net. enigmail-2.0.8/lang/tr/help/000077500000000000000000000000001334302754500156125ustar00rootroot00000000000000enigmail-2.0.8/lang/tr/help/compose.html000066400000000000000000000100761334302754500201510ustar00rootroot00000000000000 Enigmail Help: Message Composition

Enigmail Help

Using Enigmail when composing messages

Enigmail menu in Mail/Compose window
Sign message
Enable/Disable sending signed mail. User is notified, if signing fails.
Encrypt message

Enable/Disable encryption to all recipient(s) before sending. User is notified, if encryption fails.

If Display selection when necessary is set in Preferences -> Key Selection tab, a list of keys will pop up if there are addresses in the list of recipients for the message for whom you have no public key.

If Never display OpenPGP key selection dialog is set in Preferences -> Key Selection tab, and there are addresses in the list of recipients for the message for whom you have no public key, the message will be sent unencrypted.

Use PGP/MIME for this message
Enable/Disable the use of PGP/MIME for this message.

If you know the recipient(s) can read mail using the PGP/MIME format, you should use it.

This feature is dependent on the settings in Preferences -> PGP/MIME tab being set to Allow to use PGP/MIME or Always use PGP/MIME.

Default composition options
  • Signing/Encryption Options...: shortcut to Account Settings -> OpenPGP Options.
  • Send options...: shortcut to Preferences -> Send tab.
  • Key selection options...: shortcut to Preferences -> Key Selection tab.
  • PGP/MIME options...: shortcut to Preferences -> PGP/MIME tab.
Undo encryption

If there is a failure when actually sending mail, such as the POP server not accepting the request, Enigmail will not know about it, and the encrypted message will continue to be displayed in the Compose window. Choosing this menu item will undo the encryption/signing, reverting the Compose window back to its original text.

As a temporary fix, this option may also be used to decrypt the quoted text when replying to encrypted messages. Enigmail should automatically decrypt the quoted message, but if that fails for some reason, you can use this menu item to force it.

Insert public key
insert ASCII-armored public key block at the current cursor location in the Compose window. You will be prompted for the email addresses of the key(s) to be inserted. Keys inserted in this manner will automatically be recognized at the receiving end by Enigmail. After key insertion, you may still choose to sign/encrypt the mail as needed. Also, do not insert more than one key block in a message; just specify multiple email addresses, separated by commas or spaces, when prompted.
Clear save passphrase
Clears cached passphrase. Useful if you have multiple passphrases.
Help
Displays Help information from the website (this page).

Further help is available on the Enigmail Help web page

enigmail-2.0.8/lang/tr/help/editRcptRule.html000066400000000000000000000115601334302754500211110ustar00rootroot00000000000000 Enigmail Help: Edit OpenPGP Rule

Enigmail Help

Using the Enigmail Rules Editor: Edit OpenPGP Rule

In the Rules Editor, you can specify defaults per recipient for enabling encryption, signing and PGP/MIME, and to define what OpenPGP key(s) to use. In this dialog, you can specify the rules for a single recipient, and for a group of recipients with very similar attributes.

Set OpenPGP Rules for
Contains the email addresses of the recipients (without names, i.e. just an address like somebody@email.domain). You can specify several email addresses, separated by spaces. The address specified here can consist of only the domain section so that mail to any address at that domain will be matched, e.g. @email.domain will allow matching to body@email.domain, somebody@email.domain, anybody@email.domain, etc.
Apply rule if recipient ...
This modifies the matching of the email addresses. If multiple addresses are entered, the setting will apply to all. The examples below are based on body@email.domain entered in the OpenPGP Rules field above.
  • Is exactly: with this setting, the rule will only trigger on emails to body@email.domain (exact, case insensitive matching).
  • Contains: with this setting, any email address containing the string is matched, e.g. anybody@email.domain or body@email.domain.net
  • Begins with: with this setting, any email address starting with the string is matched, e.g. body@email.domain.net, body@email.domain-name.com.
  • Ends with: with this setting, any email address ending with the string is matched, e.g. anybody@email.domain , somebody@email.domain.
Continue with the next rule for the matching address
Enabling this function will allow you to define a rule but not have to specify a KeyID in the Use the following OpenPGP keys: field, so that the email address is used to check for a key at the time of sending. Also, further rules for the same address(es) will be processed as well.
Do not check further rules for the matching address
Enabling this function stops processing any other rules for the matching address(es) if this rule is matched; i.e. rule processing continues with the next recipient.
Use the following OpenPGP keys:
Use the Select Key(s).. button to select the recipient keys to be used for encryption. As in the action above, no further rules for the matching address(es) are processed.
Default for Signing
Enable or disable message signing. This either uses or overrides what you have specified in the message composition window. The values are:
  • Never: disable signing, even if it was enabled in the message composition window (overrules the other values)
  • Yes, if selected from in Message Composition: leave signing as specified in the message composition window
  • Always: enable signing, even if it was not enabled in the message composition window
These signing settings are applied for all rules that match. If one of the rules disables signing, the message will not be signed, regardless of other rules that specify Always.
Encryption
Enable or disable message encryption. The allowed settings and their meaning are the same as for message signing.
PGP/MIME
Enable or disable the use of the PGP/MIME (RFC 3156) message encoding. If PGP/MIME is disabled, the messages are encoded using "inline PGP". The allowed values and their meaning are the same as for message signing.

The rules are processed in the order displayed in the list in the OpenPGP Rules Editor. Whenever a rule matches a recipient and contains a OpenPGP Key ID, in addition to using the specified Key ID, the recipient is not considered anymore when processing further rules.


Further help is available on the Enigmail Per-Recipient Settings page

enigmail-2.0.8/lang/tr/help/initError.html000066400000000000000000000045421334302754500204620ustar00rootroot00000000000000 Enigmail Help: How to Resolve Problems with Initializing OpenPGP

Enigmail Help

How to Resolve Problems with Initializing OpenPGP

There are several reasons why initializing OpenPGP does not succeed. The most common ones are described below; for more information please visit the Enigmail Support page.

GnuPG could not be found

In order for OpenPGP to work, the tool GnuPG needs to be installed. If GnuPG cannot be found, then first make sure that the executable gpg.exe (on Windows; gpg on other platforms) is installed on your computer. If GnuPG is installed, and OpenPGP cannot find it, then you need to manually set the path to GnuPG in the OpenPGP Preferences (menu OpenPGP > Preferences)

Enigmime failed to initialize

OpenPGP works only if it is built using the same build environment as Thunderbird or SeaMonkey was built. This means that you can use the official Enigmail releases only if you use the official releases of Thunderbird or SeaMonkey provided by mozilla.org.

If you use a Thunderbird or SeaMonkey version coming from some other source (e.g. the provider of your Linux distribution), or if you built the application yourself, you should either use an Enigmail version built by the same source, or build Enigmail yourself. For building Enigmail, refer to the Source Code section on the Enigmail home page. Please don't file any bug report concerning this problem, it is not solvable.

Further help is available on the Enigmail Support Web Site.

enigmail-2.0.8/lang/tr/help/messenger.html000066400000000000000000000101221334302754500204640ustar00rootroot00000000000000 Enigmail Help: Message Reading

Enigmail Help

Using Enigmail when reading messages

Decrypt button in main Mail window
This button can be used for several purposes: decrypt, verify, or import public keys. Normally decryption/verification happens automatically, although this can be disabled through a preference. However, if this fails, usually a short error message will appear in the Enigmail status line. If you click the Decrypt button, you will be able to see a more detailed error message, including the output from the GnuPG command.
Pen and Key icons in Message Header display
The Pen and Key icons in the Message Header display indicate if the message you are reading was signed and/or encrypted and if the signature is good, i.e. the message has not been changed since it was signed. If the message has been changed, the Pen icon will change to a Broken Pen to indicate that the signature is bad. Right clicking on either the Pen or Key icons will bring up a menu with the following options:
  • OpenPGP Security info: allows you to view the output status from GnuPG for the message.
  • Copy OpenPGP Security info: copies the output status from GnuPG to the clipboard; to paste into a reply message, etc.
  • View OpenPGP Photo ID: allows you to view the Photo ID of the person who sent the message, if they have a photo embedded in their Public Key. (This option will only be enabled if a Photo ID exists in their key.)
  • S/MIME Security info: allows you to view the S/MIME Security Info for the message.

If you do not have keyserver-options auto-key-retrieve set in your gpg.conf file and you read a message which is signed or encrypted, you will see a Pen icon in the headers display area with a Question mark on it, the Enigmail status line in the headers area will say Part of the message signed; click pen icon for details and the message in the Message Pane will show all the OpenPGP message block indicators and the signature block.

You may also see this if you have keyserver-options auto-key-retrieve set in your gpg.conf file and the OpenPGP key is not available on the default keyserver.

Clicking on the Pen and Question mark icon will bring up a window advising that the key is unavailable in your keyring. Clicking on OK will bring up another window with a list of keyservers from which you can select to download the sender's public key from.

To configure the list of keyservers you wish to use, go to Enigmail -> Preferences -> Basic tab and enter the keyserver addresses in the Keyserver(s): box, separated by a comma. The first keyserver in the list will be used as the default.

Opening encrypted attachments / importing attached OpenPGP keys
Attachments named *.pgp, *.asc and *.gpg are recognized as attachments that can be handled specially by Enigmail. Right clicking on such an attachment enables two special menu items in the context menu: Decrypt and Open and Decrypt and Save. Use these two menu items if you want Enigmail to decrypt an attachment before opening or saving it. If an attachment is recognized as an OpenPGP key file, you are offered to import the keys it into your keyrings.

Further help is available on the Enigmail Help web page

enigmail-2.0.8/lang/tr/help/rulesEditor.html000066400000000000000000000060331334302754500210030ustar00rootroot00000000000000 Enigmail Help: Rules Editor

Enigmail Help

Using the Enigmail Rules Editor

In the Rules Editor, you can specify defaults per recipient for enabling encryption, signing and PGP/MIME, and to define what OpenPGP key(s) to use. Each rule consists of 5 fields and is represented on a single line:

Email
The e-mail(s) from the To:, Cc: and Bcc: fields to match. The matching works on substrings (Further details can be found in the Edit Rule dialog)
OpenPGP Key(s)
a list of OpenPGP Key ID's to use for the recipient
Sign
enable or disable message signing. This either uses or overrides what you have specified in the message composition window. The values are:
  • Never: disable signing, even if it was enabled in the message composition window (overrules the other values)
  • Possible: leave signing as specified in the message composition window
  • Always: enable signing, even if it was not enabled in the message composition window

These signing settings are applied for all rules that match. If one of the rules disables signing, the message will not be signed, regardless of other rules that specify Always.

Encrypt
enable or disable message encryption. The allowed settings and their meaning are the same as for message signing.
PGP/MIME
enable or disable the use of the PGP/MIME (RFC 3156) message encoding. If PGP/MIME is disabled, the messages are encoded using "inline PGP". The allowed values and their meaning a re the same as for message signing.

The rules are processed in the order displayed in the list. Whenever a rule matches a recipient and contains a OpenPGP Key ID, in addition to using the specified Key ID, the recipient is not considered anymore when processing further rules.

Note: The rule editor is not yet complete. It is possible to write some more advanced rules by directly editing the rules file (these rules should then not be edited anymore in the rule editor). Further information for directly editing the file is available on the Enigmail Homepage


Further help is available on the Enigmail Help web page

enigmail-2.0.8/lang/tr/help/sendingPrefs.html000066400000000000000000000047771334302754500211460ustar00rootroot00000000000000 Enigmail Help: Edit OpenPGP Rule

Enigmail Help

Defining Preferences to Send Encrypted

In the Sending Preferences you can choose the general model and preferences for encryption.

Convenient Encryption
With these settings, emails are encrypted without confirmation whenever possible.

This setup is appropriate, if you just want to improve your privacy by sending emails encyrpted instead of unencrypted if that's possible.

The effect is like sending emails as letters instead of postcards. Unlike postcards, letters usually hide their contents while in transit.

Note however that as with letters you can't be sure that nobody is opening the letter while it is in transit (although, some technical effort is necessary for that).

A concrete risk is that you accidentally use "faked keys" you got from somewhere or somebody claiming that the key belongs to the person you want to send emails to. To avoid this risk, you can either use the trust model of PGP (see below) or you should always verify, whether the fingerprint of a public key is correct.

Manual Encryption
This option allows you to specify the different preferences for encryption according to your needs. You can specify
  • whether replies to encrypted/signed emails should automatically also be encrypted/signed-
  • whether to use the trust model of OpenPGP to accept keys (this means that to use a key you either have to sign the key or have enough other people you trust having signed the key).
  • whether you want to automatically send emails encrypted if all keys are accepted.
  • whether and when you want to finally confirm sending an email.
If it is important for you that content you send encrypted can't be read by other people or organizations, you should use the manual preferences at least choose the option to accept keys only if you or other people signed them. While this model reduces the risk of using faked keys, it requires that you actively sign keys and declare owner trust using the key managament dialog. enigmail-2.0.8/lang/vi/000077500000000000000000000000001334302754500146535ustar00rootroot00000000000000enigmail-2.0.8/lang/vi/am-enigprefs.properties000066400000000000000000000001301334302754500213400ustar00rootroot00000000000000# Strings used in the Mozill AccountManager prefPanel-enigprefs=Bảo mật cho OpenPGP enigmail-2.0.8/lang/vi/enigmail.dtd000066400000000000000000001532101334302754500171370ustar00rootroot00000000000000 ' để chỉ định các địa chỉ email"> ' để chỉ định các địa chỉ email cho GnuPG. Tắt nếu ngưá»i nhận có khoá Hushmail cÅ©."> Bảo mật cho OpenPGP)"> LƯU Ã: Có thể mất vài phút để hoàn tất việc tạo khoá. Äừng thoát ứng dụng khi Ä‘ang tạo khoá. Việc duyệt tìm hay thá»±c hiện những thao tác sá»­ dụng cật lá»±c ổ đĩa trong lúc tạo khoá sẽ bổ sung 'tính ngẫu nhiên' và tăng tốc tiến trình. Bạn sẽ được thông báo khi tạo khoá hoàn tất."> ' không hợp lệ"> LƯU Ã: Có thể mất mấy phút để hoàn tất việc tạo ra khóa. Äừng ra khá»i ứng dụng trong khi việc tạo ra khóa Ä‘ang tiến triển. Bạn sẽ được báo cho biết khi việc tạo ra khóa được hoàn tất."> Lưu ý: Enigmail sẽ luôn luôn kiểm chứng chữ ký trên thư Ä‘iện tá»­ cho tất cả các tài khoản hoặc danh tính, bất kể là nó có được bật hay không"> Cám Æ¡n bạn đã sá»­ dụng Enigmail."> xuất dữ liệu từ máy cÅ© thông qua trình hướng dẫn này nhập dữ liệu vào máy má»›i thông qua trình hướng dẫn cài đặt. "> enigmail-2.0.8/lang/vi/enigmail.properties000066400000000000000000001631641334302754500205710ustar00rootroot00000000000000Enigmail=Enigmail ##################################################################### # Strings used within enigmailCommon.js and enigmailCommon.jsm ##################################################################### enigAlert=Cảnh báo Enigmail enigConfirm=Xác nhận Enigmail # enigInfo=Enigmail Information enigError=Lá»—i Enigmail enigPrompt=Nhắc nhở Enigmail dlgYes=&Có dlgNo=&Không dlgKeepSetting=Nhá»› câu trả lá»i cá»§a tôi và đừng há»i lại nữa dlgNoPrompt=Äừng hiện lại há»™p thoại này nữa dlg.button.delete=&Xoá dlg.button.cancel=&Huá»· dlg.button.close=&Äóng dlg.button.continue=Tiếp &tục dlg.button.skip=&Bá» qua dlg.button.overwrite=&Chép đè dlg.button.view=&Xem dlg.button.retry=&Thá»­ lại dlg.button.ignore=&Bá» qua # dlg.button.install=&Install # dlg.button.ok=&OK repeatPrefix=\n\nCảnh báo này sẽ lặp lại %S repeatSuffixSingular=lần nữa. repeatSuffixPlural=lần nữa. noRepeat=\n\nCảnh báo này sẽ không lặp lại cho đến khi bạn nâng cấp Enigmail. pgpNotSupported=Có vẻ như bạn Ä‘ang dùng Enigmail cùng vá»›i PGP 6.x\n\nÄáng tiếc là PGP 6.x có má»™t vài vấn đỠngăn cản Enigmail hoạt động đúng cách. Vậy nên, Enigmail không còn há»— trợ PGP 6.x nữa; xin chuyển sang dùng GnuPG (GPG) thay vào đó.\n\nNếu bạn cần há»— trợ chuyển sang GnuPG, hãy tham khảo mục Trợ giúp trên trang chá»§ Enigmail. initErr.howToFixIt=Äể dùng Enigmail cần có GnuPG. Nếu bạn chưa cài GnuPG, cách dá»… dàng nhất là dùng nút "Trình hướng dẫn cài đặt" bên dưới. initErr.setupWizard.button=&Trình hướng dẫn cài đặt passphraseCleared=Äã xoá mật khẩu. cannotClearPassphrase=Bạn Ä‘ang dùng má»™t công cụ không tiêu chuẩn (như là gnome-keyring) để xá»­ lý mật khẩu. Vậy nên không thể xoá mật khẩu khi dùng Enigmail. noPhotoAvailable=Không có ảnh nào debugLog.title=Nhật ký dò lá»—i Enigmail error.photoPathNotReadable=Không Ä‘á»c được đưá»ng dẫn đến ảnh '%S' # generalError=Error: %S # Strings in configure.jsm enigmailCommon.versionSignificantlyChanged=Phiên bản Enigmail má»›i này có những thay đổi đáng kể trong việc quản lý tinh chỉnh và tuỳ chá»n. Chúng tôi đã cố gắng chuyển cài đặt cÅ© sang bản má»›i này. Tuy nhiên, chúng tôi không thể đảm bảo toàn bá»™ thao tác má»™t cách tá»± động. Xin kiểm tra kỹ tinh chỉnh và tuỳ chá»n má»›i. enigmailCommon.checkPreferences=Kiểm tra Tinh chỉnh... preferences.defaultToPgpMime=Chúng tôi đã đổi cách mã hoá tin nhắn mặc định trong Enigmail từ Inline-PGP thành PGP/MIME. Chúng tôi khuyên bạn giữ nó làm mặc định.\n\nNếu bạn vẫn muốn dùng Inline-PGP làm mặc định, bạn có thể vào Cài đặt tài khoản dưới mục Bảo mật cho OpenPGP. ##################################################################### # Strings in enigmailAbout.js ##################################################################### usingVersion=Äang chạy Enigmail phiên bản %S # enigmailPepVersion=Enigmail/p≡p version %S usingAgent=Sá»­ dụng %1$S tập tin chạy %2$S để mã hoá và giải mã agentError=Lá»–I: Không truy cập được dịch vụ trá»ng yếu cá»§a Enigmail! ##################################################################### # Strings in enigmailKeygen.js ##################################################################### accessError=Lá»—i truy cập dịch vụ Enigmail onlyGPG=Tạo khoá chỉ hoạt động vá»›i GnuPG (chứ không phải PGP)! keygenComplete=Hoàn tất tạo khoá! Danh tính <%S> sẽ được dùng để ký tên. revokeCertRecommended=Chúng tôi khuyên bạn tạo má»™t chứng nhận huá»· cho khoá cá»§a bạn. Chứng nhận này có thể được dùng để vô hiệu hoá khoá cá»§a bạn, VD. trong trưá»ng hợp khoá bí mật cá»§a bạn thất lạc hoặc bị lá»™. Bạn có muốn tạo má»™t chứng nhận huá»· ngay không? keyMan.button.generateCert=&Tạo chứng nhận genCompleteNoSign=Hoàn tất tạo khoá! genGoing=Äã bắt đầu tạo khoá! passNoMatch=Các mục mật khẩu không trùng khá»›p; xin nhập lại passCheckBox=Xin đánh dấu há»™p chá»n nếu không chỉ định mật khẩu cho khoá passUserName=Xin chỉ định tên ngưá»i dùng cho danh tính này keygen.missingUserName=Chưa có tên chỉ định nào cho tài khoản/danh tính đã chá»n. Xin nhập má»™t giá trị vào trưá»ng "Tên cá»§a bạn" trong cài đặt tài khoản. keygen.passCharProblem=Bạn Ä‘ang dùng các ký tá»± đặc biệt cho mật khẩu. Äáng tiếc là nó sẽ gây rắc rối cho các ứng dụng khác. Chúng tôi khuyên bạn chá»n mật khẩu chỉ chứa các ký tá»± này:\na-z A-Z 0-9 /.;:-,!?(){}[]%* passSpaceProblem=Vì lý do kỹ thuật, mật khẩu cá»§a bạn không thể bắt đầu hoặc kết thúc vá»›i khoảng trắng. changePassFailed=Äổi mật khẩu thất bại. keyConfirm=Tạo các khoá công khai và cá nhân cho '%S'? keyMan.button.generateKey=&Tạo khoá keyAbort=Huá»· tạo khoá? keyMan.button.generateKeyAbort=&Huá»· tạo khoá? keyMan.button.generateKeyContinue=&Tiếp tục tạo khoá? expiryTooLong=Bạn không thể tạo khoá có hạn dùng quá 100 năm. expiryTooLongShorter=Bạn không thể tạo khoá có hạn dùng quá 90 năm. expiryTooShort=Khoá cá»§a bạn phải còn hiệu lá»±c trong ít nhất má»™t ngày. keyGenFailed=Tạo khoá thất bại. Xin xem trình Ä‘iá»u khiển Enigmail (Trình đơn Enigmail > Dò lá»—i Enigmail) để biết thêm chi tiết. setKeyExpirationDateFailed=Không thể đổi ngày hết hạn. # Strings in enigmailMessengerOverlay.js securityInfo=Thông tin bảo mật cho Enigmail\n\n enigHeader=Enigmail: enigContentNote=Enigmail: *Các tập tin đính kèm trong tin nhắn này chưa được ký tên hoặc mã hoá*\n\n possiblyPgpMime=Có thể tin nhắn đã được mã hoá hoặc ký tên bằng PGP/MIME; hãy dùng tính năng 'Giải mã/Xác minh' để kiểm chứng saveAttachmentHeader=Enigmail: Lưu tập tin đính kèm đã giải mã noTempDir=Không thấy thư mục tạm nào để chép vào\nXin đặt biến môi trưá»ng TEMP attachmentPgpKey=Có vẻ như tập tin đính kèm '%S' bạn Ä‘ang mở là tập tin khoá OpenPGP.\n\nNhấp 'Nhập' để nhập các khoá chứa trong đó hoặc 'Xem' để xem ná»™i dung tập tin trên cá»­a sổ trình duyệt beginPgpPart=********* *BẮT ÄẦU PHẦN Mà HOà hoặc Kà TÊN* ********* endPgpPart=********** *KẾT THÚC PHẦN Mà HOà hoặc Kà TÊN* ********** notePartEncrypted=Enigmail: *Má»™t phần tin nhắn CHƯA được ký tên hoặc mã hoá* noteCutMessage=Enigmail: *Tìm thấy nhiá»u khối tin nhắn -- đã huá»· giải mã/xác minh* decryptOkNoSig=Cảnh báo\n\nGiải mã thành công, nhưng không thể xác minh chữ ký đúng cách được msgOvl.button.contAnyway=&Vẫn tiếp tục signature.verifiedOK=Äã xác minh thành công chữ ký cho tập tin đính kèm %S signature.verifyFailed=Không thể xác minh chữ ký cho tập tin đính kèm %S attachment.noMatchToSignature=Không thể đối chiếu tập tin đính kèm '%S' vá»›i tập tin chữ ký attachment.noMatchFromSignature=Không thể đối chiếu tập tin chữ ký '%S' vá»›i tập tin đính kèm fixBrokenExchangeMsg.failed=Thất bại khi sá»­a chữa tin nhắn. # enigmail.msgViewColumn.label=Enigmail # enigmailPep.msgViewColumn.label=Enigmail/p≡p # wksNoIdentity=This key is not linked to any of your email accounts. Please add an account for at least one of the following email addresse(s):\n\n%S # wksConfirmSuccess=Confirmation email sent. # wksConfirmFailure=Sending the confirmation email failed. # autocrypt.importSetupKey.accountPreconfigured=Your account is already correctly configured for Autocrypt.\n\nDo you really want to overwrite your settings with this setup message? # autocrypt.importSetupKey.selfCreated=This message was created by your currently running instance of Enigmail.\n\nPlease switch to the email client to which you want to transfer the settings, and click on the message on that email client to import the settings. # autocrypt.importSetupKey.invalidMessage=Error - could not read setup message. The message seems to be corrupted. Please try to create a new setup message on your "other" device. # autocrypt.importSetupKey.invalidKey=Error - the key could not be imported. The key is either not supported by your version of GnuPG, or it got corrupted. # autocrypt.importSetupKey.wrongPasswd=The password you entered is wrong. Do you want to retry? # autocrypt.importSetupKey.success=The Autocrypt setup message was processed successfully. Autocrypt is now available for your account '%S'. ##################################################################### # Strings in enigmailMsgComposeOverlay.js ##################################################################### keysToExport=Chá»n các khoá OpenPGP để Chèn keysToUse=Chá»n (các) khoá OpenPGP để dùng cho %S pubKey=Khoá công khai cho %S\n windowLocked=Cá»­a sổ soạn tin nhắn đã bị khoá; huá»· gá»­i tin sendUnencrypted=Không khởi chạy Enigmail được.\nGá»­i tin nhắn không mã hoá chứ? composeSpecifyEmail=Xin chỉ định địa chỉ email chính mà bạn sẽ dùng để chá»n khoá ký tên cho các tin nhắn gá»­i Ä‘i.\nNếu để trống thì địa chỉ ÄẾN TỪ cá»§a tin nhắn sẽ được dùng để chá»n khoá ký tên. sendingHiddenRcpt=Tin nhắn này có chứa ngưá»i nhận dạng BCC (bản sao ẩn danh). Nếu được mã hoá, nó có thể che giấu những ngưá»i nhận BCC nhưng ngưá»i dùng má»™t số sản phẩm (VD: PRP Corp.) sẽ không thể giải mã tin nhắn. Vì vậy, chúng tôi khuyên bạn tránh dùng email BCC vá»›i tin nhắn được mã hoá. sendWithHiddenBcc=Ẩn ngưá»i nhận dạng BCC sendWithShownBcc=Mã hoá thông thưá»ng sendingNews=Äã huá»· thao tác gá»­i được mã hoá.\n\nKhông thể mã hoá tin nhắn này vì nó có chứa ngưá»i nhận trong nhóm tin. Xin gá»­i lại tin nhắn không có mã hoá. sendToNewsWarning=Cảnh báo: bạn sắp gá»­i email được mã khoá đến má»™t nhóm tin.\n\nBạn không nên làm vậy vì nó chỉ phù hợp khi tất cả thành viên trong nhóm Ä‘á»u có thể giải mã tin nhắn, nghÄ©a là tin nhắn cần được mã hoá bằng khoá cá»§a tất cả những ngưá»i tham gia. Xin gá»­i thư này chỉ khi bạn biết chắc mình Ä‘ang làm gì.\n\nTiếp tục chứ? hasHTML=Cảnh báo thư HTML:\nTin nhắn này có thể chứa HTML và có khả năng làm cho việc ký tên/mã hoá thất bại. Äể tránh việc này trong tương lai, bạn nên bấm phím SHIFT khi nhấp vào nút Soạn tin/Trả lá»i để gá»­i thư được ký tên.\nNếu bạn ký tên thư theo mặc định, bạn nên bá» chá»n há»™p tuỳ chỉnh 'Soạn tin nhắn bằng HTML' để tắt thư HTML vÄ©nh viá»…n cho tài khoản thư này. strippingHTML=Tin nhắn có chứa thông tin định dạng HTML sẽ bị mất khi chuyển thành văn bản thông thưá»ng để ký tên/mã hoá. Bạn có muốn tiến hành không? msgCompose.button.sendAnyway=&Vẫn gá»­i tin nhắn attachWarning=Các tập tin đính kèm trong tin nhắn này không nằm trên máy, không thể mã hoá được chúng. Äể mã hoá, đầu tiên hãy lưu chúng vào máy rồi đính kèm. Bạn vẫn muốn gá»­i tin nhắn chứ? quotedPrintableWarn=Bạn đã bật cách mã hoá 'quoted-printable' để gá»­i tin nhắn. Nó có thể dẫn đến việc giải mã và/hoặc xác minh không đúng tin nhắn cá»§a bạn.\nBạn có muốn tắt gá»­i tin nhắn dạng 'quoted-printable' ngay? minimalLineWrapping=Bạn đã cài đặt bao dòng cho các ký tá»± %S. Äể việc mã hoá và/hoặc ký tên diá»…n ra đúng cách, cần đặt giá trị này ít nhất là 68.\nBạn có muốn đổi bao dòng thành 68 ký tá»± ngay? warning=Cảnh báo signIconClicked=Bạn đã chỉnh sá»­a thá»§ công việc ký tên. Vì vậy, khi bạn soạn tin nhắn này, bật (tắt) việc ký tên không còn phụ thuá»™c vào bật (tắt) mã hoá nữa. errorOwnKeyUnusable=ID khoá '%S' đã cấu hình cho danh tính hiện tại không tạo ra khoá OpenPGP dùng được nào.\n\nHãy chắc rằng bạn có má»™t khoá OpenPGP hợp lệ, chưa hết hạn và cài đặt tài khoản cá»§a bạn dẫn đến khoá đó.\nNếu khoá chưa hết hạn thì hãy kiểm tra xem bạn đã đặt Tín nhiệm chá»§ nhân thành đầy đủ hay tối cao chưa. msgCompose.cannotSaveDraft=Lá»—i khi lưu thư nháp # msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information - partially encrypted email. # msgCompose.partiallyEncrypted.mimeMsg=The message you are replying to contained both unencrypted and encrypted parts. Some encrypted message parts are invisible to you.\n\nIf the sender was not able to decrypt the hidden message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nWe recommend that you don't reply to the message, but create a new message containing your answer. # msgCompose.partiallyEncrypted.inlinePGP=The message you are replying to contained both unencrypted and encrypted parts. If the sender was not able to decrypt some message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nPlease consider removing all quoted text from your reply to this sender. msgCompose.internalEncryptionError=Lá»—i ná»™i vi: mã hoá cam kết đã bị tắt msgCompose.internalError=Äã xảy ra lá»—i ná»™i vi. msgCompose.toolbarTxt.signAndEncrypt=Tin nhắn này sẽ được ký tên và mã hoá msgCompose.toolbarTxt.signOnly=Tin nhắn này sẽ được ký tên msgCompose.toolbarTxt.encryptOnly=Tin nhắn này sẽ được mã hoá msgCompose.toolbarTxt.noEncryption=Tin nhắn này sẽ không được ký tên và mã hoá msgCompose.toolbarTxt.disabled=Äã tắt Enigmail cho danh tính được chá»n # msgCompose.protectSubject.tooltip=Protect the message subject # msgCompose.noSubjectProtection.tooltip=Do not protect the message subject msgCompose.encryptedSubjectStub=Tin nhắn đã mã hoá # msgCompose.protectSubject.dialogTitle=Enable Protection of Subject? # msgCompose.protectSubject.question=Regular encrypted emails contain the unredacted subject.\n\nWe have established a standard to hide the original subject in the encrypted message\nand replace it with a dummy text, such that the subject is only visible after the email is decrypted.\n\nDo you want to protect the subject in encrypted messages? # msgCompose.protectSubject.yesButton=&Protect subject # msgCompose.protectSubject.noButton=&Leave subject unprotected msgCompose.detailsButton.label=Chi tiết ... msgCompose.detailsButton.accessKey=D # msgCompose.pepSendUnknown=Unknown # msgCompose.pepSendUnsecure=Unsecure # msgCompose.pepSendSecure=Secure # msgCompose.pepSendTrusted=Secure & Trusted # pep.alert.disabledForIdentity=p≡p is disabled for the current identity. Please enable p≡p via the Enigmail/p≡p preferences. # pep.alert.weakReply=You’re about to forward or reply to a secure message as insecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? # note: should end with double newline: sendAborted=Äã huá»· thao tác gá»­i.\n\n # details: keyNotTrusted=Không đủ tín nhiệm đối vá»›i khoá '%S' keyNotFound=Không tìm thấy khoá '%S' keyRevoked=Äã huá»· khoá '%S' keyExpired=Khoá '%S' đã hết hạn statPGPMIME=PGP/MIME # statSMIME=S/MIME statSigned=Äà Kà TÊN statEncrypted=Äà Mà HOà statPlain=KHÔNG Kà TÊN và KHÔNG Mà HOà offlineSave=Lưu %1$S tin nhắn vào %2$S trong thư mục Tin nhắn chưa gá»­i? onlineSend=Gá»­i %1$S tin nhắn đến %2$S? encryptKeysNote=Lưu ý: Tin nhắn được mã hoá cho những ID ngưá»i dùng / Khoá sau đây: %S hiddenKey= signFailed=Lá»—i trong Enigmail; Mã hoá/ký tên thất bại; gá»­i tin nhắn không mã hoá? msgCompose.button.sendUnencrypted=&Gá»­i tin nhắn không mã hoá recipientsSelectionHdr=Chá»n ngưá»i nhận để mã hoá configureNow=Bạn chưa cấu hình bảo mật Enigmail cho danh tính được chá»n. Bạn có muốn cấu hình ngay? # encryption/signing status and associated reasons: encryptMessageAuto=Mã hoá tin nhắn (tá»± động) encryptMessageNorm=Mã hoá tin nhắn signMessageAuto=Ký tên tin nhắn (tá»± động) signMessageNorm=Ký tên tin nhắn encryptOff=Mã hoá: TẮT encryptOnWithReason=Mã hoá: BẬT (%S) encryptOffWithReason=Mã hoá: TẮT (%S) encryptOn=Mã hoá: BẬT signOn=Ký tên: BẬT signOff=Ký tên: TẮT signOnWithReason=Ký tên: BẬT (%S) signOffWithReason=Ký tên: TẮT (%S) reasonEnabledByDefault=bật theo mặc định reasonManuallyForced=bắt buá»™c thá»§ công reasonByRecipientRules=bắt buá»™c theo quy tắc cho ngưá»i nhận reasonByAutoEncryption=bắt buá»™c theo mã hoá tá»± động reasonByConflict=do mâu thuẫn giữa các quy tắc cho ngưá»i nhận reasonByEncryptionMode=do chế độ mã hoá # should not be used anymore: encryptYes=Tin nhắn sẽ được mã hoá encryptNo=Tin nhắn sẽ không được mã hoá # should not be used anymore: signYes=Tin nhắn sẽ được ký tên signNo=Tin nhắn sẽ không được ký tên # PGP/MIME status: pgpmimeNormal=Giao thức: PGP/MIME inlinePGPNormal=Giao thức: Inline PGP # smimeNormal=Protocol: S/MIME pgpmimeAuto=Giao thức: PGP/MIME (tá»± động) inlinePGPAuto=Giao thức: Inline PGP (tá»± động) # smimeAuto=Protocol: S/MIME (auto) # should not be used anymore pgpmimeYes=PGP/MIME sẽ được dùng pgpmimeNo=Inline PGP sẽ được dùng # Attach own key status (tooltip strings): attachOwnKeyNo=Khoá cá»§a chính bạn sẽ không được đính kèm attachOwnKeyYes=Khoá cá»§a chính bạn sẽ được đính kèm attachOwnKeyDisabled=Không thể đính kèm khoá cá»§a chính bạn. Bạn phải chá»n má»™t khoá cụ thể\ntrong mục OpenPGP cá»§a Cài đặt tài khoản để bật tính năng này. rulesConflict=Äã phát hiện mâu thuẫn trong quy tắc cho từng ngưá»i nhận\n%S\n\nGá»­i tin nhắn vá»›i những cài đặt này? msgCompose.button.configure=&Cấu hình msgCompose.button.send=&Gá»­i tin nhắn msgCompose.button.save=&Lưu tin nhắn # Strings in enigmailMsgHdrViewOverlay.js keyNeeded=Khoá công khai %S cần được xác minh chữ ký keyUsed=Khoá công khai %S được dùng để xác minh chữ ký clickDecrypt=; dùng tính năng 'Giải mã/Xác minh' clickDecryptRetry=; dùng tính năng 'Giải mã/Xác minh' để thá»­ lại clickDetailsButton=; nhấp vào nút 'Chi tiết' để biết thêm thông tin clickImportButton=; nhấp vào nút 'Nhập khoá' để nhập khoá keyTypeUnsupported=; loại khoá này không được há»— trợ bởi phiên bản GnuPG cá»§a bạn msgPart=Má»™t phần cá»§a tin nhắn %S msgSigned=đã ký tên msgSignedUnkownKey=đã ký tên vá»›i khoá lạ msgEncrypted=đã mã hoá msgSignedAndEnc=đã ký tên và mã hoá unverifiedSig=Chữ ký chưa được xác minh incompleteDecrypt=Giải mã không hoàn tất needKey=Lá»—i - không thấy khoá cá nhân/bí mật trùng khá»›p để giải mã tin nhắn failedDecrypt=Lá»—i - giải mã thất bại badPhrase=Lá»—i - sai mật khẩu failedDecryptVerify=Lá»—i - giải mã/xác minh thất bại viewInfo=; Xem > Thông tin bảo mật tin nhắn để biết chi tiết decryptedMsg=Tin nhắn đã giải mã decryptedMsgWithFormatError=Tin nhắn đã giải mã (định dạng đã được khôi phục cá»§a email PGP, bị há»ng có lẽ là do máy chá»§ Exchange cÅ©, vậy nên kết quả có thể không hoàn chỉnh để Ä‘á»c) usedAlgorithms=Äã dùng thuật toán: %S và %S # pepStatusInfo.text=p≡p Message Status. # pepStatusInfo.title.m3=Under Attack # pepStatusInfo.info.m3=This message is not secure and has been tampered with. # pepStatusInfo.title.m1=Mistrusted # pepStatusInfo.info.m1=This message has a communication partner that has previously been marked as mistrusted # pepStatusInfo.title.r0=Unknown # pepStatusInfo.info.r0=This message does not contain enough information to determine if it is secure. # pepStatusInfo.title.r1=Cannot Decrypt # pepStatusInfo.info.r1=This message cannot be decrypted because the key is not available. # pepStatusInfo.title.r2=Cannot Decrypt # pepStatusInfo.info.r2=This message cannot be decrypted because the key is not available. # pepStatusInfo.title.r3=Unsecure # pepStatusInfo.info.r3=This message is unsecure. # pepStatusInfo.title.r4=Unsecure for Some # pepStatusInfo.info.r4=This message is unsecure for some communication partners. # pepStatusInfo.title.r5=Unreliable Security # pepStatusInfo.info.r5=This message has unreliable protection. # pepStatusInfo.title.r6=Secure... # pepStatusInfo.info.r6=This message is secure but you still need to verify the identity of your communication partner. # pepStatusInfo.title.r7=Secure & Trusted # pepStatusInfo.info.r7=This message is secure and trusted. # pepStatusInfo.color.green=Green # pepStatusInfo.color.yellow=Yellow # pepStatusInfo.color.red=Red # pepRevokeTrust.question=Do you really want to cancel the trust for %S? # pepRevokeMistrust.question=Do you really want to re-trust the key for %S? # pepRevokeTrust.doRevoke=Cancel &trust # wksConfirmationReq=Web Key Directory Confirmation Request # wksConfirmationReq.message=This message has been sent by your email provider to confirm deployment of your OpenPGP public key\nin their Web Key Directory.\nProviding your public key helps others to discover your key and thus being able to encrypt messages to you.\n\nIf you want to deploy your key in the Web Key Directory now, please click on the button "Confirm Request" in the status bar.\nOtherwise, simply ignore this message. # wksConfirmationReq.button.label=Confirm Request # autocryptSetupReq=Perform Autocrypt Setup # autocryptSetupReq.button.label=Start Setup # autocryptSetupReq.setupMsg.desc=This message contains all information to transfer your Autocrypt settings along with your secret key securely from your original device. # autocryptSetupReq.setupMsg.backup=You can keep this message and use it as a backup for your secret key. If you want to do this, you should write down the password and store it securely. # autocryptSetupReq.message.import=To import the settings and key(s) in Enigmail, please click on the "Start Setup" button in the status bar. # autocryptSetupReq.message.sent=Please click on the message on your new device and follow the instuctions to import the settings. # strings in pref-enigmail.js # oldGpgVersion20=Enigmail initialization failed.\n\nYou are using GnuPG version %1$S, which is not supported anymore. Enigmail requires GnuPG version %2$S or newer. Please upgrade your GnuPG installation, or Enigmail will not work. locateGpg=Äịnh vị chương trình GnuPG invalidGpgPath=Không chạy được GnuPG vá»›i đưá»ng dẫn đã cung cấp. Vì vậy, Enigmail sẽ bị tắt cho đến khi bạn đổi lại đưá»ng dẫn đến GnuPG hoặc đến khi bạn tái khởi chạy ứng dụng. warningsAreReset=Äã cài lại tất cả cảnh báo. prefs.gpgFound=Äã tìm thấy GnuPG trong %S prefs.gpgNotFound=Không tìm thấy GnuPG prefs.warnAskNever=Cảnh báo: bật tuỳ chá»n này sẽ dẫn đến email không được mã hoá mà không kèm thông tin gì khác nếu không có khoá cho má»™t trong những ngưá»i nhận -- Enigmail sẽ không thông báo cho bạn nếu Ä‘iá»u này xảy ra! prefs.warnIdleTimeForUnknownAgent=Không thể kết nối đến gpg-agent. Có lẽ hệ thống cá»§a bạn sá»­ dụng má»™t công cụ chuyên biệt để xá»­ lý mật khẩu (VD: gnome-keyring, seahorse-agent, trình quản lý ví KDE, ...). Äáng tiếc là Enigmail không thể kiểm soát thá»i gian chá» cho công cụ mà bạn Ä‘ang dùng. Vậy nên cài đặt thá»i gian chá» tương ứng trong Enigmail sẽ bị bá» qua. prefEnigmail.oneKeyserverOnly=Lá»—i - bạn chỉ có thể chỉ định má»™t máy chá»§ quản lý khoá để tá»± động tải vá» các khoá OpenPGP còn thiếu. # Strings used in core.jsm # (said file also re-uses some strings from above) enterAdminPin=Xin gõ PIN QUẢN TRỊ SmartCard cá»§a bạn enterCardPin=Xin gõ PIN SmartCard cá»§a bạn notInit=Lá»—i - Dịch vụ Enigmail chưa được khởi chạy badCommand=Lá»—i - lệnh mã hoá thất bại cmdLine=dòng lệnh và kết xuất: notRequired=Lá»—i - không yêu cầu mã hoá notComplete=Lá»—i - chưa hoàn tất tạo khoá invalidEmail=Lá»—i - (các) địa chỉ email không hợp lệ noPassphrase=Lá»—i - chưa cung cấp mật khẩu noPGPblock=Lá»—i - Không thấy khối dữ liệu OpenPGP được bảo vệ nào hợp lệ unverifiedReply=Phần tin nhắn thụt lá» (hồi đáp) có lẽ đã được chỉnh sá»­a keyInMessageBody=Tìm thấy khoá trong tin nhắn. Nhấp 'Nhập khoá' để nhập khoá sigMismatch=Lá»—i - Chữ ký không trùng khá»›p cantImport=Lá»—i khi nhập khoá công khai\n\n doImportOne=Nhập %1$S (%2$S)? doImportMultiple=Nhập những khoá sau?\n\n%S previewFailed=Không thể Ä‘á»c tập tin khoá công khai. # Strings used in errorHandling.jsm sc.wrongCardAvailable=SmartCard %1$S tìm thấy trong trình Ä‘á»c cá»§a bạn không thể dùng để xá»­ lý tin nhắn được.\nVui lòng chèn SmartCard %2$S cá»§a bạn và lặp lại thao tác. sc.insertCard=Thao tác này cần SmartCard %S cá»§a bạn.\nXin chèn SmartCard cần thiết và lặp lại thao tác. sc.removeCard=Thao tác không cần SmartCard nào trong trình Ä‘á»c.\nXin lấy SmartCard cá»§a bạn ra và lặp lại thao tác. sc.noCardAvailable=Không tìm thấy SmartCard nào trong trình Ä‘á»c cá»§a bạn.\nXin chèn SmartCard cá»§a bạn và lặp lại thao tác. sc.noReaderAvailable=Không thể truy cập trình Ä‘á»c SmartCard cá»§a bạn.\nXin nối trình Ä‘á»c SmartCard cá»§a bạn vào, gắn thẻ, và lặp lại thao tác. keyError.keySpecNotFound=Không thể so sánh địa chỉ email "%S" vá»›i khoá trong vòng khoá cá»§a bạn. keyError.keyIdNotFound=Không tìm thấy ID khoá đã cấu hình "%S" trong vòng khoá cá»§a bạn. keyError.resolutionAction=Xin chá»n má»™t khoá hợp lệ trong mục OpenPGP cá»§a Cài đặt tài khoản. missingPassphrase=Mật khẩu còn thiếu errorHandling.gpgAgentInvalid=Hệ thống Ä‘ang chạy phiên bản gpg-agent không phù hợp vá»›i phiên bản GnuPG cá»§a bạn. errorHandling.gpgAgentError=GnuPG đã báo cáo má»™t lá»—i trong giao tiếp vá»›i gpg-agent (má»™t thành tố cá»§a GnuPG). errorHandling.dirmngrError=GnuPG đã báo cáo má»™t lá»—i trong giao tiếp vá»›i dirmngr (má»™t thành tố cá»§a GnuPG). errorHandling.pinentryError=GnuPG không thể yêu cầu mật khẩu qua pinentry. errorHandling.readFaq=Äây là lá»—i cài đặt hoặc cấu hình hệ thống đã ngăn cản Enigmail hoạt động bình thưá»ng và không thể tá»± động xá»­ lý.\n\nChúng tôi chân thành khuyên bạn nhận tư vấn từ trang há»— trợ cá»§a chúng tôi tại https://enigmail.net/faq. gpgNotFound=Không thể tìm được chương trình '%S' GnuPG.\nHãy bảo đảm là bạn đã đặt đúng đưá»ng dẫn thá»±c thi GnuPG trong Tuỳ chỉnh cá»§a Enigmail. gpgNotInPath=Không thể tìm được tập tin chạy GnuPG trong ÄÆ¯á»œNG DẪN.\nHãy bảo đảm là bạn đã đặt đúng đưá»ng dẫn thá»±c thi GnuPG trong Tuỳ chỉnh cá»§a Enigmail. enigmailNotAvailable=Dịch vụ trá»ng yếu cá»§a Enigmail không hoạt động prefGood=Chữ ký tốt từ %S prefBad=Chữ ký XẤU từ %S failCancel=Lá»—i - Ngưá»i dùng đã huá»· nhận khoá failNoServer=Lá»—i - không có máy chá»§ quản lý khoá nào được chỉ định để nhận khoá failNoID=Lá»—i - Không có ID khoá nào được chỉ định để nhận khoá failKeyExtract=Lá»—i - lệnh trích xuất khoá đã thất bại notFirstBlock=Lá»—i - Khối OpenPGP đầu tiên chứ không phải khối khoá công khai importKeyConfirm=Nhập (các) khoá công khai được nhúng trong tin nhắn? failKeyImport=Lá»—i - nhập khoá thất bại fileWriteFailed=Chép vào tập tin %S thất bại importKey=Nhập khoá công khai %S từ máy chá»§ quản lý khoá: uploadKey=Gá»­i khoá công khai %S đến máy chá»§ quản lý khoá: keyId=ID khoá keyAndSigDate=ID khoá: 0x%1$S / Äã ký vào: %2$S keyFpr=Vân tay cá»§a khoá: %S noEmailProvided=Bạn đã không cung cấp địa chỉ email! keyAlreadySigned=Khoá đã được ký tên rồi, bạn không thể ký nó hai lần. ##################################################################### # Strings used in enigmailKeySelection.js ##################################################################### selKeyExpired=%S đã hết hạn createdHeader=Äã tạo atLeastOneKey=Không có khoá nào được chá»n! Bạn phải chá»n ít nhất má»™t khoá để chấp nhận há»™p thoại này fewerKeysThanRecipients=Bạn đã chá»n số khoá nhá» hÆ¡n số ngưá»i nhận. Có chắc là danh sách khoá để mã hoá là đầy đủ? userSel.button.goBack=Chá»n thêm khoá userSel.secretKeySel.title=Chá»n má»™t khoá OpenPGP bí mật để ký tên tin nhắn cá»§a bạn userSel.problemNoKey=Không có khoá nào hợp lệ userSel.problemMultipleKeys=Nhiá»u khoá # should be same as thunderbird ENTITY sendLaterCmd.label: sendLaterCmd.label=Gá»­i Ä‘i sau # Strings used in enigmailAttachmentDialog.js # pgpMimeNote=NOTE: PGP/MIME is not supported by all email clients. If you are unsure, select the %S option. first=thứ nhất second=thứ nhì # Strings used in am-enigprefs.js / enigmailEditIdentity.js encryptKeyHeader=Chá»n khoá OpenPGP để mã hoá identityName=Danh tính: %S # switchPepMode=You are currently using the 'p≡p Junior' mode of Enigmail.\n\nBy enabling OpenPGP or S/MIME for an account, you are disabling p≡p and use the 'regular' mode of Enigmail without p≡p. # enableEnigmail=&Disable p≡p # Strings used in enigmailSingleRcptSettings.js noEncryption=Bạn đã kích hoạt mã hoá, nhưng lại chưa chá»n khoá. Äể mã hoá các thư gá»­i đến %1$S, bạn cần chỉ định má»™t (hay má»™t vài) khoá hợp lệ từ danh sách khoá. Bạn có muốn tắt mã hoá cho %2$S không? noKeyToUse=(không có gì - không mã hoá) noEmptyRule=Quy tắc không được rá»—ng! Xin đặt má»™t địa chỉ email vào trưá»ng Quy tắc. invalidAddress=(Các) địa chỉ email bạn đã nhập không hợp lệ. Bạn không nên nhập tên cá»§a ngưá»i nhận, chỉ địa chỉ email thôi. V.D:\nKhông hợp lệ: Má»™t vài cái tên \nHợp lệ: some.name@address.net # noCurlyBrackets=The curly brackets {} have a special meaning and should not be used in an email address. If you want to modify the matching behavior for this rule, use the 'Apply rule if recipient ...' option.\nMore information is available from the Help button. # Strings used in enigmailRulesEditor.js never=Không bao giá» always=Luôn luôn possible=Có thể deleteRule=Xoá quy tắc được chá»n chứ? nextRcpt=(Ngưá»i nhận kế tiếp) negateRule=Không addKeyToRule=Thêm khoá %1$S (%2$S) vào quy tắc cho từng ngưá»i nhận # Strings used in enigmailSearchKey.js needOnline=Hàm bạn đã chá»n không có sẵn trong chế độ ngoại tuyến. Xin hãy trá»±c tuyến và thá»­ lại. protocolNotSupported=Giao thức '%S://' bạn đã chá»n không được há»— trợ tải xuống các khoá OpenPGP. gpgkeysDisabled=Nó có thể giúp bật tuỳ chá»n 'extensions.enigmail.useGpgKeysTool' noKeyserverConn=Không thể kết nối đến máy chá»§ quản lý khoá tại %S. keyDownloadFailed=Thất bại khi tải xuống khoá từ máy chá»§ quản lý khoá. Tin nhắn trạng thái là:\n%S internalError=Äã xảy ra lá»—i ná»™i vi. Không thể tải xuống hoặc nhập khoá. noKeyFound=Thành thật xin lá»—i, không thấy khoá nào phù hợp vá»›i tiêu chuẩn tìm kiếm đã chỉ định. # keyDownload.keyUnavailable=We are sorry, but the key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their key by email. # gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. gpgKeysFailed=Thất bại khi tìm hoặc tải xuống khoá từ máy chá»§ quản lý khoá: không thể chạy gpgkeys_%S. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Cài đặt tín nhiệm chá»§ nhân thất bại # Strings in enigmailSignKeyDlg.js signKeyFailed=Ký tên khoá thất bại alreadySigned.label=Lưu ý: khoá %S đã được ký tên vá»›i khoá cá nhân được chá»n. alreadySignedexportable.label=Lưu ý: khoá %S đã được ký là có thể xuất vá»›i khoá cá nhân được chá»n. Chữ ký cục bá»™ là vô nghÄ©a. partlySigned.label=Lưu ý: Má»™t vài ID ngưá»i dùng cá»§a khoá %S đã được ký vá»›i khoá cá nhân được chá»n. noTrustedOwnKeys=Không tìm thấy khoá nào đủ tư cách để ký tên! Bạn cần ít nhất má»™t khoá cá nhân hoàn toàn đáng tin để ký tên khoá. # Strings in enigmailKeyManager.js keyMan.loadingKeys=Äang nạp khoá, xin chá» ... keyValid.unknown=không rõ keyValid.invalid=không hợp lệ keyValid.disabled=đã tắt keyValid.revoked=đã huá»· keyValid.expired=đã hết hạn keyValid.noSubkey=không có khoá phụ hợp lệ keyTrust.untrusted=không đáng tin keyTrust.marginal=má»™t chút keyTrust.full=đáng tin keyTrust.ultimate=tối cao keyTrust.group=(nhóm) keyType.public=c.khai keyType.publicAndSec=c.khai/b.mật keyMan.enableKey=Bật khoá keyMan.disableKey=Tắt khoá userAtt.photo=Thuá»™c tính ngưá»i dùng (ảnh JPEG) asciiArmorFile=Tập tin ASCII được bảo vệ (*.asc) importKeyFile=Nhập tập tin khoá OpenPGP gnupgFile=Các tập tin GnuPG # createKeyOK=Your Key has been generated saveRevokeCertAs=Tạo & Lưu chứng nhận huá»· # revokeCertOK=The revocation certificate has been successfully created. You can use it to invalidate your public key, e.g. in case you would lose your secret key. revokeCertFailed=Không thể tạo chứng nhận huá»·. addUidOK=Äã thêm thành công ID ngưá»i dùng addUidFailed=Thất bại khi thêm ID ngưá»i dùng noKeySelected=Bạn nên chá»n ít nhất má»™t khoá để thá»±c hiện thao tác được chá»n exportToFile=Xuất khoá công khai vào tập tin exportKeypairToFile=Nhập bí mật và khoá công khai vào tập tin exportSecretKey=Bạn có muốn thêm khoá bí mật vào tập tin khoá OpenPGP đã lưu? saveKeysOK=Äã lưu thành công các khoá saveKeysFailed=Lưu khoá thất bại importKeysFailed=Nhập khoá thất bại enableKeyFailed=Bật/tắt khoá thất bại specificPubKeyFilename=%1$S (0x%2$S) c.khai specificPubSecKeyFilename=%1$S (0x%2$S) c.khai-b.mật defaultPubKeyFilename=Exported-public-keys defaultPubSecKeyFilename=Exported-public-and-secret-keys noSecretKeys=Không thấy các khoá bí mật.\n\nBạn có muốn tạo khoá cá»§a chính bạn ngay? sendKeysOk=Gá»­i (các) khoá thành công sendKeysFailed=Gá»­i khoá thất bại receiveKeysOk=Cập nhật (các) khoá thành công receiveKeysFailed=Tải khoá xuống thất bại importFromClip=Bạn có muốn nhập (má»™t số) khoá từ clipboard? importFromUrl=Tải vá» khoá công khai từ URL này: copyToClipbrdFailed=Không thể sao chép (các) khoá được chá»n vào clipboard. copyToClipbrdOK=Äã sao chép (các) khoá vào clipboard deleteSecretKey=CẢNH BÃO: Bạn sắp xoá má»™t khoá bí mật!\nNếu xoá khoá bí mật thì bạn sẽ không thể giải mã bất kỳ tin nhắn nào đã được mã hoá vá»›i khoá đó cÅ©ng như không thể huá»· khoá cá»§a bạn nữa.\n\nCó chắc là bạn muốn xoá CẢ HAI, khoá bí mật và khoá công khai\n'%S'? deleteMix=CẢNH BÃO: Bạn sắp xoá các khoá bí mật!\nNếu xoá khoá bí mật thì bạn sẽ không thể giải mã bất kỳ tin nhắn nào đã được mã hoá vá»›i khoá đó nữa.\n\nCó chắc là bạn muốn xoá CẢ HAI, khoá bí mật và khoá công khai được chá»n? deletePubKey=Bạn có muốn xoá khoá công khai\n'%S'? deleteSelectedPubKey=Bạn có muốn xoá các khoá công khai? deleteKeyFailed=Không thể xoá khoá. revokeKeyQuestion=Bạn Ä‘ang chuẩn bị huá»· khoá '%S'.\n\nBạn sẽ không thể ký tên vá»›i khoá này nữa, và má»™t khi đã phân phối, ngưá»i khác sẽ không thể mã hoá vá»›i khoá đó. Bạn vẫn có thể sá»­ dụng khoá này để giải mã tin nhắn cÅ©.\n\nBạn có muốn tiếp tục? revokeKeyOk=Khoá đã bị huá»·. Nếu khoá cá»§a bạn đã có trên máy chá»§ quản lý khoá thì bạn nên tải nó lên lại để những ngưá»i khác có thể thấy là nó đã bị huá»·. revokeKeyFailed=Không thể huá»· khoá. # revokeKeyNotPresent=You have no key (0x%S) which fits to this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before the revocation certificate! # revokeKeyAlreadyRevoked=The key 0x%S has already been revoked. refreshAllQuestion=Bạn chưa chá»n khoá nào cả. Bạn có muốn làm má»›i TOÀN BỘ khoá? # refreshKeyServiceOn.warn=Warning: Your keys are currently being refreshed in the background as safely as possible.\nRefreshing all your keys at once will unnecessarily reveal information about you.\nDo you really want to do this? refreshKey.warn=Cảnh báo: tuỳ vào số lượng khoá và tốc độ kết nối, làm má»›i toàn bá»™ khoá có thể tốn rất nhiá»u thá»i gian! downloadContactsKeys.warn=Cảnh báo: tuỳ vào số lượng liên hệ và tốc độ kết nối, việc tải vá» toàn bá»™ khoá có thể tốn rất nhiá»u thá»i gian! downloadContactsKeys.importFrom=Nhập các liên hệ từ danh bạ '%S'? keyMan.button.exportSecKey=Xuất &các khoá bí mật keyMan.button.exportPubKey=Chỉ xuất &các khoá công khai keyMan.button.import=&Nhập keyMan.button.refreshAll=&Làm má»›i toàn bá»™ khoá keyMan.button.revokeKey=&Huá»· khoá keyMan.button.skip=&Bá» qua khoá keylist.noOtherUids=Không có danh tính nào khác keylist.hasOtherUids=CÅ©ng được biết đến như là keylist.noPhotos=Không có sẵn ảnh keylist.hasPhotos=Ảnh keyMan.addphoto.filepicker.title=Chá»n ảnh để thêm vào keyMan.addphoto.warnLargeFile=Tập tin bạn đã chá»n vượt quá 25 kB.\nKhông nên thêm các tập tin quá lá»›n vì khoá cÅ©ng sẽ trở nên rất nặng. keyMan.addphoto.noJpegFile=Có vẻ như tập tin đã chá»n không phải định dạng JPEG. Xin chá»n tập tin khác. keyMan.addphoto.failed=Không thể thêm ảnh này. # noWksIdentity=The key %S does not have a WKS identity. # keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key "%1$S (%2$S)" for encrypting messages? # keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key "%1$S (%2$S)" for future messages? # keyman.addBlacklistKey.button=&Blacklist the key # keyman.removeBlacklistKey.button=&Remove key from Blacklist # Strings in enigmailManageUidDlg.xul changePrimUidFailed=Thất bại khi đổi ID ngưá»i dùng chính changePrimUidOK=Äã đổi thành công ID ngưá»i dùng chính revokeUidFailed=Thất bại khi huá»· ID ngưá»i dùng %S revokeUidOK=Äã huá»· thành công ID ngưá»i dùng %S. Nếu khoá cá»§a bạn đã có trên máy chá»§ quản lý khoá thì bạn nên tải nó lên lại để những ngưá»i khác có thể thấy là nó đã bị huá»·. revokeUidQuestion=Có chắc là bạn muốn huá»· ID ngưá»i dùng %S? # Strings in enigmailKeyImportInfo.xul importInfoTitle=THÀNH CÔNG! Äã nhập các khoá importInfoBits=Các bit importInfoCreated=Äã tạo importInfoFpr=Vân tay importInfoDetails=(Chi tiết) importInfoNoKeys=Chưa nhập khoá nào. # Strings in enigmailKeyDetailsDlg.xul keyTypePublic=khoá công khai keyTypePrimary=khoá chính keyTypeSubkey=khoá phụ keyTypePair=cặp khoá keyExpiryNever=không bao giá» keyAlgorithm_1=RSA keyAlgorithm_2=RSA keyAlgorithm_3=RSA keyAlgorithm_16=ELG keyAlgorithm_17=DSA keyAlgorithm_18=ECDH keyAlgorithm_19=ECDSA keyAlgorithm_20=ELG keyAlgorithm_22=EDDSA keyUsageEncrypt=Mã hoá keyUsageSign=Ký tên keyUsageCertify=Chứng nhận keyUsageAuthentication=Xác minh keyDoesNotExpire=Khoá chưa hết hạn # Strings in enigmailGenCardKey.xul keygen.started=Xin chá» khi khoá Ä‘ang được tạo .... keygen.completed=Äã tạo khoá. ID má»›i cá»§a khoá là: 0x%S keygen.keyBackup=Äã sao lưu khoá vào %S keygen.passRequired=Xin chỉ định mật khẩu nếu bạn muốn tạo bản sao lưu khoá cá»§a mình ngoài SmartCard. # Strings in enigmailSetCardPin.xul cardPin.processFailed=Äổi PIN thất bại # Strings in enigRetrieveProgres.xul keyserverProgress.refreshing=Äang làm má»›i các khoá, xin chá» ... keyserverProgress.uploading=Äang tải các khoá lên, xin chá» ... # keyserverProgress.wksUploadFailed=Could not upload your key to the Web Key Service # keyserverProgress.wksUploadCompleted=Your public key was successfully submitted to your provider. You will receive an email to confirm that you initiated the upload. keyserverTitle.refreshing=Làm má»›i các khoá keyserverTitle.uploading=Tải khoá lên # Strings in enigmailSetupWizard passphrase.min8keys=Mật khẩu phải chứa ít nhất 8 ký tá»±! setupWizard.reallyCancel=Có chắc là bạn muốn đóng Trình hướng dẫn cài đặt Enigmail không? setupWizard.invalidGpg=Tập tin bạn chỉ định không phải tập tin chạy GnuPG. Hãy chỉ định tập tin khác. setupWizard.specifyFile=Bạn cần chỉ định ít nhất má»™t tập tin khoá công khai để tiếp tục. setupWizard.installFailed=Có vẻ như quá trình cài đặt đã thất bại. Xin thá»­ lại hoặc cài đặt thá»§ công GnuPG và chỉ đưá»ng đến nó bằng nút Duyệt tìm. # setupWizard.downloadForbidden=For your own security, we will not download GnuPG. Please visit https://gnupg.org/ in order to download GnuPG. # setupWizard.downloadImpossible=We cannot download GnuPG currently. Please try later or visit https://gnupg.org/ in order to download GnuPG. setupWizard.hashSumError=Trình hướng dẫn không thể xác minh tập tin đã tải có toàn vẹn không. Nó có thể há»ng hoặc bị can thiệp. Bạn vẫn muốn tiếp tục cài đặt chứ? setupWizard.importSettingsFile=Chỉ định tập tin sao lưu để nạp setupWizard.invalidSettingsFile=Tập tin đã chỉ định không phải là tập tin sao lưu cài đặt Enigmail chính xác. setupWizard.gpgConfExists=Tập tin cấu hình GnuPG đã tồn tại. Bạn có muốn chép đè nó vá»›i tập tin từ bản cài đặt cÅ©? # setupWizard.noGpgHomeDir=It appears that you configured %S to use for GnuPG. However, this is not a directory - you cannot use it. # setupWizard.unmachtedIds=The following identities of your old setup could not be matched:\n%S\nThe settings for these identities were skipped. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=Äã có lá»—i khi tải vá» GnuPG. Xin kiểm tra nhật ký khung lệnh để biết thêm chi tiết. installGnuPG.installFailed=Äã có lá»—i khi cài đặt GnuPG. Xin kiểm tra nhật ký khung lệnh để biết thêm chi tiết. # Strings in enigmailAddUidDlg.xul addUidDlg.nameOrEmailError=Bạn phải Ä‘iá»n tên và địa chỉ email addUidDlg.nameMinLengthError=Tên phải chứa ít nhất 5 ký tá»± addUidDlg.invalidEmailError=Bạn phải chỉ định má»™t địa chỉ email hợp lệ # Strings in enigmailCardDetails.js Carddetails.NoASCII=Smartcard OpenPGP chỉ há»— trợ các ký tá»± ASCII trong Tên/Há» tên. # network error types errorType.SecurityCertificate=Chứng nhận bảo mật trên dịch vụ web không hợp lệ. errorType.SecurityProtocol=Giao thức bảo mật được dùng bởi dịch vụ web không quen thuá»™c. errorType.Network=Äã xảy ra lá»—i mạng. # filter stuff filter.folderRequired=Bạn phải chá»n má»™t thư mục đích. filter.decryptMove.label=Giải mã vÄ©nh viá»…n (Enigmail) filter.decryptCopy.label=Tạo bản sao đã giải mã (Enigmail) filter.decryptMove.warnExperimental=Cảnh báo - thao tác lá»c "Giải mã vÄ©nh viá»…n" có thể huá»· hoại tin nhắn.\n\nChúng tôi chân thành khuyên bạn thá»­ bá»™ lá»c "Tạo bản sao đã giải mã", kiểm tra cẩn thận kết quả và chỉ bắt đầu dùng bá»™ lá»c này má»™t khi bạn hài lòng vá»›i kết quả thu được. # filter.tempPepFilterDesc=Temporary filter to store sent message unencrypted # filter.term.pgpencrypted.label=OpenPGP Encrypted # filter.encrypt.label=Encrypt to key (Enigmail) # filter.keyRequired=You must select a recipient key. # filter.keyNotFound=Could not find an encryption key for "%S". # filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for "%S" you will no longer be able to read the emails. # strings in enigmailConvert.jsm converter.decryptBody.failed=Không thể giải mã tin nhắn vá»›i tiêu Ä‘á»\n"%S".\nBạn muốn thá»­ lại vá»›i mật khẩu khác hay là bá» qua tin nhắn? converter.decryptAtt.failed=Không thể giải mã tập tin đính kèm "%1$S"\ncá»§a tin nhắn vá»›i tiêu Ä‘á»\n"%2$S".\nBạn muốn thá»­ lại vá»›i mật khẩu khác hay là bá» qua tin nhắn? saveLogFile.title=Lưu tập tin nhật ký # strings in gpg.jsm unknownSigningAlg=Thuật toán ký tên không quen thuá»™c (ID: %S) unknownHashAlg=Hash viết mã không quen thuá»™c (ID: %S) # strings in keyRing.jsm keyring.photo=Ảnh keyRing.pubKeyRevoked=Khoá %1$S (ID khoá %2$S) đã bị huá»·. keyRing.pubKeyExpired=Khoá %1$S (ID khoá %2$S) đã hết hạn. keyRing.pubKeyNotForSigning=Khoá %1$S (ID khoá %2$S) không thể dùng để ký tên. keyRing.pubKeyNotForEncryption=Khoá %1$S (ID khoá %2$S) không thể dùng để mã hoá. keyRing.keyDisabled=Khoá %1$S (ID khoá %2$S) đã bị tắt; không thể dùng được. keyRing.keyNotTrusted=Khoá %1$S (ID khoá %2$S) không đủ độ tin cậy. Xin đặt mức độ tin cậy cá»§a khoá lên "tối cao" để dùng ký tên. keyRing.keyInvalid=Khoá %1$S (ID khoá %2$S) không hợp lệ (VD: nó không có chữ tá»± ký). keyRing.signSubKeysRevoked=Tất cả khoá phụ cá»§a khoá %1$S (ID khoá %2$S) Ä‘á»u bị huá»·. keyRing.signSubKeysExpired=Tất cả khoá phụ cá»§a khoá %1$S (ID khoá %2$S) đã hết hạn. keyRing.signSubKeysUnusable=Tất cả khoá phụ cá»§a khoá %1$S (ID khoá %2$S) đã bị huá»·, hết hạn hoặc không sá»­ dụng được. keyRing.encSubKeysRevoked=Tất cả khoá phụ mã hoá cá»§a khoá %1$S (ID khoá %2$S) đã bị huá»·. keyRing.encSubKeysExpired=Tất cả khoá phụ mã hoá cá»§a khoá %1$S (ID khoá %2$S) đã hết hạn. keyRing.noSecretKey=Có vẻ như bạn không có khoá bí mật cho %1$S (ID khoá %2$S) trong vòng khoá; bạn không thể dùng khoá này để ký tên. keyRing.encSubKeysUnusable=Tất cả khoá phụ mã hoá cá»§a khoá %1$S (ID khoá %2$S) đã bị huá»·, hết hạn hoặc không sá»­ dụng được. #strings in exportSettingsWizard.js cannotWriteToFile=Không thể lưu vào tập tin '%S'. Xin chá»n tập tin khác. dataExportError=Äã xảy ra lá»—i trong khi xuất dữ liệu cá»§a bạn. enigmailSettings=Cài đặt Enigmail defaultBackupFileName=Enigmail-export specifyExportFile=Chỉ định tên tập tin để xuất homedirParamNotSUpported=Những tham số thêm để cấu hình đưá»ng dẫn như là --homedir và --keyring không được há»— trợ để xuất/khôi phục cài đặt. Xin dùng các phương thức khác như là cài đặt biến môi trưá»ng GNUPGHOME. #strings in expiry.jsm expiry.keyExpiresSoon=Khoá %1$S cá»§a bạn sẽ hết hạn trong %2$S ngày.\n\nChúng tôi khuyên bạn tạo má»™t cặp khoá má»›i và cấu hình tài khoản tương ứng để sá»­ dụng chúng. # expiry.keysExpireSoon=The following of your keys will expire in less than %1$S days:\n%2$S We recommend that you create new keys and configure your accounts to use the new keys. # expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to ultimate in key properties. # expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to ultimate in key properties. # expiry.OpenKeyManager=Open Enigmail Key Management # expiry.OpenKeyProperties=Open Key Properties #strings in pEpDecrypt.jsm # pEpDecrypt.cannotDecrypt=This is an encrypted message. Unfortunately you don't have the secret key to decrypt the message. #strings in gpgAgent.jsm # gpghomedir.notexists=The directory '%S' containing your OpenPGP keys does not exist and cannot be created. # gpghomedir.notwritable=The directory '%S' containing your OpenPGP keys is not writable. # gpghomedir.notdirectory=The directory '%S' containing your OpenPGP keys is a file instead of a directory. # gpghomedir.notusable=Please fix the directory permissions or change the location of your GnuPG "home" directory. GnuPG cannot work correctly otherwise. #strings in pepTrustWords.js # pepTrustWords.cannotVerifyOwnId=Cannot verify p≡p Trustwords for own account. # pepTrustWords.cannotFindKey=Cannot find key for %S. # pepTrustWords.cannotStoreChange=Could not change trust for %S. # pepTrustWords.generalFailure=Cannot obtain trustwords for %S. # pepTrustWords.partnerFingerprint=Fingerprint for %S: #strings in mimeWkdHandler.jsm # wkdMessage.body.req=Your email provider processed your request to upload your public key to the OpenPGP Web Key Directory.\n\nPlease click the confirmation button in the Enigmail header to complete the publishing of your public key. # wkdMessage.body.process=This is an email related to the automatic processing to upload your public key to the OpenPGP Web Key Directory.\n\nYou do not need to take any manual action at this point. #strings in pepHandshake.js # pepPrivacyStatus.RatingBrokenSuggestion=Either you or the sender should resend the message. # pepPrivacyStatus.RatingHaveNoKeySuggestionOutgoing=If you composed this message, your key is not available. # pepPrivacyStatus.RatingMistrustSuggestion=Re-establish the connection with your communication partner and try to complete another handshake. # pepPrivacyStatus.RatingReliableSuggestion=Complete a handshake with your communication partner by exchanging trustwords in person or over the phone. A handshake is needed only once per partner and will ensure secure and trusted communication. # pepPrivacyStatus.RatingTrustedSuggestion=No action needed! # pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware this message may not be secure. # pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Please add the necessary information. # pepPrivacyStatus.RatingUnderAttackSuggestion=Separately verify the content of this message with your communication partner. # pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least secure. # pepPrivacyStatus.RatingUnencryptedSuggestion=Please ask your communication partner to use an encryption solution or install p≡p. # pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or no signature. Ask your communication partner to upgrade their encryption solution or install p≡p. # pepPrivacyStatus.RatingBrokenExplanation=This message has broken encryption or formatting. # pepPrivacyStatus.RatingHaveNoKeyExplanation=This message cannot be decrypted because the key is not available. # pepPrivacyStatus.RatingMistrustExplanation=This message has a communication partner that has previously been marked as mistrusted. # pepPrivacyStatus.RatingReliableExplanation=This message is secure but you still need to verify the identity of your communication partner. # pepPrivacyStatus.RatingTrustedExplanation=This message is secure and trusted. # pepPrivacyStatus.RatingUndefinedExplanation=This message does not contain enough information to determine if it is secure. # pepPrivacyStatus.RatingUnderAttackExplanation=This message is not secure and has been tampered with. # pepPrivacyStatus.RatingUnencryptedExplanation=This message is unsecure. # pepPrivacyStatus.RatingUnencryptedForSomeExplanation=This message is unsecure for some communication partners. # pepPrivacyStatus.RatingUnreliableExplanation=This message has unreliable protection. # pepPrivacyStatus.RatingBrokenText=Broken # pepPrivacyStatus.RatingHaveNoKeyText=Cannot Decrypt # pepPrivacyStatus.RatingMistrustText=Mistrusted # pepPrivacyStatus.RatingReliableText=Secure # pepPrivacyStatus.RatingTrustedText=Secure & Trusted # pepPrivacyStatus.RatingUndefinedText=Unknown # pepPrivacyStatus.RatingUnderAttackText=Under Attack # pepPrivacyStatus.RatingUnencryptedForSomeText=Unsecure for Some # pepPrivacyStatus.RatingUnencryptedText=Unsecure # pepPrivacyStatus.RatingUnreliableText=Unreliable Security # handshakeDlg.button.initHandshake=Handshake... # handshakeDlg.button.stopTrust=Stop Trusting # handshakeDlg.button.reTrust=Stop Mistrusting # handshakeDlg.label.outgoingMessage=Outgoing message # handshakeDlg.label.incomingMessage=Incoming message # handshakeDlg.error.noPeers=Cannot handshake without any correspondents. # handshakeDlg.error.noProtection=Please enable protection in order to use the Handshake function. # enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device # enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup #strings in autocrypt.jsm # autocrypt.setupMsg.subject=Autocrypt Setup Message # autocrypt.setupMsg.msgBody=To set up your new device for Autocrypt, please follow the instuctions that should be presented by your new device. # autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code presented on your old device, and then import the contained key into your keyring. #strings in upgradeInfo.html # upgradeInfo.doctitle=What's New in Enigmail v2.0? # upgradeInfo.welcome1=Welcome to the new Enigmail version 2.0! # upgradeInfo.welcome2=The release contains a lot of new and changed features. Please take a minute to find out what's new: # upgradeInfo.encSubject.title=Encrypting the Message Subject # upgradeInfo.encSubject.desc=We developed a new method that moves the email subject into the encrypted message, and replaces the visible subject with "Encrypted Message". Once such a message is decrypted, the original subject is replaced automatically. Hiding the subject is on by default; there is a preference to turn it off if you don't like it. (Note: this feature requires the message to be sent with PGP/MIME.) # upgradeInfo.buttons.title=Changed behavior of Encrypt and Sign Buttons # upgradeInfo.buttons.desc=The Encrypt and Sign buttons in the message composer window now work for both the OpenPGP and S/MIME protocols. If both algorithms are possible, then Enigmail will try to prefer the one for which all keys are available. # upgradeInfo.autocrypt.title=Support for Autocrypt # upgradeInfo.autocrypt.desc=Enigmail now supports Autocrypt, a new standard to distribute keys as part of sent messages. Enigmail automatically imports keys from Autocrypt-compliant messages, such that over time more and more emails can be encrypted. # upgradeInfo.pEp.title=New p≡p Junior Mode (Pretty Easy Privacy) # upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. You currently need to manually install p≡p for this purpose; this will change in a future release. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. # upgradeInfo.bottom.desc=Please visit our documentation for help on using Enigmail. # pep.missingGnuPG=In order to use Enigmail/p≡p, GnuPG is required. As we could not find it, we suggest to download and install it for you. #strings in enigmailAbout.html # aboutEnigmail.tabName=About Enigmail # aboutEnigmail.title=OpenPGP support provided by Enigmail # aboutEnigmail.team=Enigmail is developed by the Enigmail Team: # aboutEnigmail.projectLeader=Lead Developer: # aboutEnigmail.usability=Usability: # aboutEnigmail.documentation=Documentation: # aboutEnigmail.testing=Testing: # aboutEnigmail.userSupport=User Support: # aboutEnigmail.localization=Localization: See the Enigmail Language Packs page # aboutEnigmail.Credits=Credits: # aboutEnigmail.origAuthor=Original author of the Enigmail extension # aboutEnigmail.icons=Icons: # aboutEnigmail.formerMembers=Former team members: # aboutEnigmail.projectHosting=Project hosting: # aboutEnigmail.licenseSupportTitle=License & Support # aboutEnigmail.license=Enigmail OpenPGP is open source and licensed under the %S # aboutEnigmail.support=Support and download is available from www.enigmail.net. enigmail-2.0.8/lang/vi/help/000077500000000000000000000000001334302754500156035ustar00rootroot00000000000000enigmail-2.0.8/lang/vi/help/compose.html000066400000000000000000000121131334302754500201340ustar00rootroot00000000000000 Trợ giúp Enigmail: Soạn Tin nhắn

Trợ giúp Enigmail

Sử dụng Enigmail trong khi soạn tin nhắn

Trình đơn Enigmail trong cửa sổ Thư/Soạn
Ký tên tin nhắn
Bật/Tắt khi gá»­i thư được ký. Ngưá»i dùng được thông báo, nếu không ký tên được.
Mã hóa tin nhắn

Bật/Tắt mã hóa cho tất cả ngưá»i nhận trước khi gá»­i. Ngưá»i dùng được thông báo, nếu không mã hóa được.

Nếu Hiển thị lá»±a chá»n khi cần thiết được đặt trong Tùy thích -> thẻ Chá»n Khóa, má»™t danh sách các khóa sẽ bật lên nếu có địa chỉ trong danh sách những ngưá»i nhận cho tin nhắn cho ngưá»i mà bạn không có khóa công.

Nếu Không bao giá» hiển thị thoại lá»±a chá»n khóa OpenPGP được đặt trong Tùy thích -> thẻ Chá»n Khóa, và có địa chỉ trong danh sách những ngưá»i nhận cho tin nhắn cho ngưá»i mà bạn không có khóa công, tin nhắn sẽ được gá»­i mà không được mã hóa.

Sử dụng PGP/MIME cho tin nhắn này
Bật/Tắt việc sử dụng PGP/MIME cho tin nhắn này.

Nếu bạn biết (những) ngưá»i nhận có thể Ä‘á»c thư bằng cách dùng định dạng PGP/MIME thì bạn nên sá»­ dụng nó.

Tính năng này phụ thuộc vào các thiết lập trong Tùy thích -> thẻ PGP/MIME đang được đặt để Cho phép sử dụng PGP/MIME hoặc Luôn luôn sử dụng PGP/MIME.

Tùy chá»n mặc định cá»§a soạn tin
  • Các Tùy chá»n cá»§a Ký tên/Mã hóa...: lối tắt đến Thiết lập Tài khoản -> Các tùy chá»n cá»§a OpenPGP.
  • Các tùy chá»n cá»§a Gá»­i tin...: lối tắt đến Tùy thích -> thẻ Gá»­i tin.
  • Các tùy chá»n cá»§a chá»n khóa...: lối tắt đến Tùy thích -> thẻ Chá»n Khóa.
  • Các tùy chá»n cá»§a PGP/MIME...: lối tắt đến Tùy thích -> thẻ PGP/MIME.
Hủy bước mã hóa

Nếu bị trục trặc khi thật sá»± gá»­i thư, chẳng hạn như máy chá»§ POP không chấp nhận yêu cầu, Enigmail sẽ không biết gì vá» nó, và tin nhắn được mã hóa sẽ tiếp tục được hiển thị trong cá»­a sổ Soạn tin. Chá»n mục trình đơn này sẽ há»§y bước mã hóa/ký tên, rồi trở ngược lại văn bản ban đầu cá»§a cá»­a sổ Soạn tin.

Tùy chá»n này là má»™t sá»­a chữa tạm thá»i nhưng cÅ©ng có thể được sá»­ dụng để giải mã các văn bản trích dẫn khi trả lá»i các tin nhắn được mã hóa. Enigmail sẽ tá»± động giải mã tin trích dẫn, nhưng nếu không làm được vì lý do nào đó thì bạn có thể sá»­ dụng mục trình đơn này để ép buá»™c nó.

Chèn khóa công
Chèn khối giáp khóa công ASCII ở vị trí con trá» hiện tại trong cá»­a sổ Soạn tin. Bạn sẽ được há»i nhắc địa chỉ thư Ä‘iện tá»­ cá»§a (các) khóa để được chèn vào. Các khóa được chèn theo cách này sẽ tá»± động được Enigmai nhận diện ở đầu tiếp nhận. Sau khi chèn khóa, bạn vẫn có thể chá»n để ký tên/mã hóa thưl khi cần thiết. Ngoài ra, đừng chèn nhiá»u hÆ¡n má»™t khối khóa trong má»™t tin nhắn, chỉ cần Ä‘iá»n rõ nhiá»u địa chỉ thư Ä‘iện tá»­, phân biệt bằng dấu phẩy hoặc dấu cách, khi được nhắc.
Xóa cụm từ mật khẩu đưá»c lưu
Xóa cụm từ mật khẩu được nhá»› tạm. Hữu ích nếu bạn có nhiá»u cụm từ mật khẩu.
Trợ giúp
Hiển thị tin tức Trợ giúp từ trang web (trang này).

Trợ giúp thêm nữa có sẵn trên Trang web Trợ giúp Enigmail

enigmail-2.0.8/lang/vi/help/editRcptRule.html000066400000000000000000000141401334302754500210770ustar00rootroot00000000000000 Trợ giúp Enigmail: Sửa đổi Quy Tắc của OpenPGP

Trợ giúp Enigmail

Sử dụng Chỉnh sửa Quy tắc của Enigmail: Sửa đổi Quy Tắc của OpenPGP

Trong Chỉnh sá»­a Quy tắc, bạn có thể Ä‘iá»n rõ các mặc định cho má»—i ngưá»i nhận để bật mã hóa lên, ký tên và PGP/MIME, và để xác định (các) khóa OpenPGP nào để sá»­ dụng. Trong há»™p thoại này, bạn có thể Ä‘iá»n rõ các quy tắc cho má»™t ngưá»i nhận duy nhất, và cho má»™t nhóm ngưá»i nhận vá»›i các thuá»™c tính rất giống nhau.

Äặt Quy tắc cá»§a OpenPGP cho
Chứa các địa chỉ email cá»§a ngưá»i nhận (không có tên, tức là chỉ cần má»™t địa chỉ như somebody@email.domain). Bạn có thể Ä‘iá»n rõ má»™t số địa chỉ thư Ä‘iện tá»­, phân biệt bằng dấu cách. Các địa chỉ Ä‘iá»n rõ ở đây có thể chỉ gồm có phần miá»n để thư gá»­i đến bất kỳ địa chỉ nào tại miá»n đó sẽ được so sánh, ví dụn như @email.domain sẽ cho phép so sánh vá»›i body@email.domain, somebody@email.domain, anybody@email.domain, v.v.
Ãp dụng quy tắc nếu ngưá»i nhận ...
This modifies the matching of the email addresses. If multiple addresses are entered, the setting will apply to all. The examples below are based on body@email.domain entered in the OpenPGP Rules field above.
  • Chính xác là: vá»›i thiết lập này, các quy tắc sẽ chỉ kích hoạt ở những thư Ä‘iện tá»­ đến body@email.domain (chính xác, không so sánh chữ hoa/thưá»ng).
  • Chứa : vá»›i thiết lập này, bất kỳ địa chỉ thư Ä‘iện tá»­ nào có chứa chuá»—i được so sánh, ví dụ như anybody@email.domain hoặc body@email.domain.net
  • Bắt đầu vá»›i: vá»›i thiết lập này, bất kỳ địa chỉ thư Ä‘iện tá»­ nào bắt đầu vá»›i chuá»—i được so sánh, ví dụ như body@email.domain.net, body@email.domain-name.com.
  • Kết thúc bằng: vá»›i thiết lập này, bất kỳ địa chỉ thư Ä‘iện tá»­ nào kết thúc vá»›i chuá»—i được so sánh, ví dụ như anybody@email.domain , somebody@email.domain .
Tiếp tục với quy tắc kế tiếp cho địa chỉ trùng hợp
Bật chức năng này lên sẽ cho phép bạn xác định má»™t quy tắc nhưng không phải Ä‘iá»n rõ má»™t KeyID trong trưá»ng Sá»­ dụng những khóa OpenPGP sau đây:, để địa chỉ thư Ä‘iện tá»­ được dùng để kiếm má»™t chiếc khóa ở thá»i Ä‘iểm gá»­i. Ngoài ra, các quy tắc khác nữa cho cùng (các) địa chỉ cÅ©ng sẽ được xá»­ lý.
Äừng kiểm soát thêm quy tắc nữa cho địa chỉ trùng hợp
Bật chức năng này lên ngưng xá»­ lý bất kỳ quy tắc nào khác cho (các) địa chỉ trùng hợp nếu quy tắc này trùng hợp; nghÄ©a là xá»­ lý quy tắc tiếp tục vá»›i ngưá»i nhận kế tiếp.
Sử dụng các khóa OpenPGP sau đây:
Sá»­ dụng nút Chá»n (các) Khóa.. để chá»n các khóa cá»§a ngưá»i nhận dùng để mã hóa. Như hành động bên trên, không có thêm quy tắc nào nữa cho (các) địa chỉ trùng hợp được xá»­ lý.
Mặc định cho Ký tên
Enable or disable message signing. This either uses or overrides what you have specified in the message composition window. The values are:
  • Không bao giá»: tắt ký tên, ngay cả khi nó đã được bật lên trong cá»­a sổ viết tin nhắn (baÍc bỏ các giá trị khác)
  • Có, nếu được chá»n từ trong Soạn Tin nhắn: để việc ký tên như đã được Ä‘iá»n rõ trong cá»­a sổ soạn tin nhắn
  • Luôn luôn: bật ký tên lên, ngay cả nếu nó đã không được bật lên trong cá»­a sổ soạn tin nhắn
These signing settings are applied for all rules that match. If one of the rules disables signing, the message will not be signed, regardless of other rules that specify Always.
Mã hóa
Bật hoặc tắt việc mã hóa tin nhắn. Các thiết lập cho phép và ý nghĩa của chúng cũng giống như cho việc ký tên tin nhắn.
PGP/MIME
Bật hoặc tắt việc sử dụng PGP/MIME (RFC 3156) để mã hóa tin nhắn. Nếu PGP/MIME bị tắt, các tin nhắn được mã hoá bằng cách dùng "PGP trực tiếp". Các giá trị được cho phép và ý nghĩa của chúng cũng giống như cho việc ký tên tin nhắn.

Các quy tắc được xá»­ lý theo thứ tá»± hiển thị trong danh sách trong Chỉnh sá»­a Quy tắc cá»§a OpenPGP. Bất cứ khi nào má»™t quy tắc trùng hợp vá»›i má»™t ngưá»i nhận và chứa má»™t ID khóa OpenPGP, ngoài việc sá»­ dụng ID khóa được Ä‘iá»n rõ, ngưá»i nhận không được lưu ý đến nữa khi tiếp tục xá»­ lý các quy tắc khác.


Trợ Giúp thêm nữa có sẵn trên trang Thiết lập Từng-Ngưá»i nhận cá»§a Enigmail

enigmail-2.0.8/lang/vi/help/initError.html000066400000000000000000000045001334302754500204450ustar00rootroot00000000000000 Enigmail Help: How to Resolve Problems with Initializing OpenPGP

Enigmail Help

How to Resolve Problems with Initializing OpenPGP

There are several reasons why initializing OpenPGP does not succeed. The most common ones are described below; for more information please visit the Enigmail Support page.

GnuPG could not be found

In order for OpenPGP to work, the tool GnuPG needs to be installed. If GnuPG cannot be found, then first make sure that the executable gpg.exe (on Windows; gpg on other platforms) is installed on your computer. If GnuPG is installed, and OpenPGP cannot find it, then you need to manually set the path to GnuPG in the OpenPGP Preferences (menu OpenPGP > Preferences)

Enigmime failed to initialize

OpenPGP works only if it is built using the same build environment as Thunderbird or SeaMonkey was built. This means that you can use the official Enigmail releases only if you use the official releases of Thunderbird or SeaMonkey provided by mozilla.org.

If you use a Thunderbird or SeaMonkey version coming from some other source (e.g. the provider of your Linux distribution), or if you built the application yourself, you should either use an Enigmail version built by the same source, or build Enigmail yourself. For building Enigmail, refer to the Source Code section on the Enigmail home page. Please don't file any bug report concerning this problem, it is not solvable.

Further help is available on the Enigmail Support Web Site.

enigmail-2.0.8/lang/vi/help/messenger.html000066400000000000000000000121651334302754500204660ustar00rootroot00000000000000 Trợ giúp Enigmail: Äá»c tin nhắn

Trợ giúp Enigmail

Sá»­ dụng Enigmail khi Ä‘á»c tin nhắn

Nút Giải mã trong cửa sổ Thư chính
Nút này có thể được dùng cho nhiá»u mục đích: giải mã, xác nhận, hoặc nhập các khóa công vào. Thông thưá»ng thì việc giải mã/xác nhận xảy ra tá»± động, mặc dù Ä‘iá»u này có thể bị tắt qua má»™t tùy thích. Tuy nhiên, nếu Ä‘iá»u này không làm được thì má»™t thông báo lá»—i ngắn sẽ thưá»ng xuất hiện trong dòng trạng thái cá»§a Enigmail. Nếu bạn nhấn nút Giải mã, bạn sẽ có thể thấy má»™t thông báo lá»—i chi tiết hÆ¡n, kể luôn kết qá»§a cá»§a lệnh GnuPG.
Các biểu tượng cá»§a Bút và Khóa trong hiển thị Äầu đỠTin nhắn
The Pen and Key icons in the Message Header display indicate if the message you are reading was signed and/or encrypted and if the signature is good, i.e. the message has not been changed since it was signed. If the message has been changed, the Pen icon will change to a Broken Pen to indicate that the signature is bad. Right clicking on either the Pen or Key icons will bring up a menu with the following options:
  • Tin tức Bảo mật cá»§a OpenPGP: cho phép bạn xem trạng thái kết xuất từ GnuPG cho tin nhắn.
  • Chép tin tức Bảo mật cá»§a OpenPGP: chép tình trạng kết xuất từ GnuPG vào bá»™ nhá»› tạm; để dán vào má»™t tin nhắn trả lá»i, v.v.
  • Xem ID Hình cá»§a OpenPGP: cho phép bạn xem các ID Hình cá»§a ngưá»i gá»­i tin nhắn, nếu há» có má»™t hình ảnh được nhúng vào Khóa Công cá»§a há». ( Tùy chá»n này sẽ chỉ được bật lên nếu má»™t ID Hình có sẵn trong khóa cá»§a há».)
  • Tin tức Bảo mật cá»§a S/MIME: cho phép bạn xem tin tức Bảo mật cá»§a S/MIME cho tin nhắn.

Nếu bạn không có tùy chá»n-máy phục vụ khóa tá»± động-lấy-khóa đặt trong tập tin gpg.conf cá»§a bạn và bạn Ä‘á»c tin nhắn mà đã được ký tên hoặc mã hóa, bạn sẽ thấy má»™t biểu tượng Bút trong khu vá»±c hiển thị đầu đỠvá»›i má»™t Dấu Há»itrên đó, dòng trạng thái Enigmail trong khu vá»±c đầu đỠsẽ nói là Má»™t phần tin nhắn đã được ký; nhấn biểu tượng bút để có chi tiết và tin nhắn trong Cá»­a sổ tin nhắn sẽ hiển thị tất cả các OpenPGP chỉ số khối tin và ngăn chặn các chữ ký.

Bạn cÅ©ng có thể thấy Ä‘iá»u này nếu bạn có tùy chá»n-máy phục vụ khóa tá»± động-lấy-khóa đặt trong tập tin gpg.conf cá»§a bạn và khoá OpenPGP không có sẵn trên máy phục vụ khóa mặc định.

Nhấp vào biểu tượng Bút và dấu Há»i sẽ Ä‘em đến má»™t cá»­a sổ cho biết rằng khóa không có sẵn trong vòng khoá cá»§a bạn. Nhấn OK sẽ Ä‘em đến má»™t cá»­a sổ khác vá»›i má»™t danh sách các máy phục vụ khóa để từ đó bạn có thể chá»n để tải xuống khoá công cá»§a ngưá»i gá»­i.

Äể cấu hình danh sách các máy phục vụ khóa mà bạn muốn sá»­ dụng, hãy vào thẻ Enigmail -> Tùy thích -> Căn bản và nhập địa chỉ máy phục vụ khóa vào há»™p (Các) máy phục vụ khóa:, phân biệt bằng dấu phẩy. Máy phục vụ khóa đầu tiên trong danh sách sẽ được dùng làm mặc định.

Mở các đính kèm được mã hóa / nhập các khóa OpenPGP đính kèm
Các đính kèm có tên là *.pgp, *.asc và *.gpg được nhận diện là các đính kèm có thể được đặc biệt xá»­ lý bởi Enigmail. Nhấn phải vào má»™t đính kèm như vậy cho phép hai mục trình đơn đặc biệt trong trình đơn ngữ cảnh: Giải mã và Mở ra và Giải mã và Lưu lại. Sá»­ dụng hai mục trình đơn này nếu bạn muốn Enigmail giải mã má»™t đính kèm trước khi mở hoặc lưu nó. Nếu má»™t đính kèm được nhận diện là má»™t tập tin khóa OpenPGP, bạn được má»i để nhập các khóa vào những vòng khóa cá»§a bạn.

Trợ Giúp thêm nữa có sẵn trên Trang web Trợ giúp của Enigmail

enigmail-2.0.8/lang/vi/help/rulesEditor.html000066400000000000000000000074361334302754500210040ustar00rootroot00000000000000 Trợ giúp Enigmail: Chỉnh sửa Quy tắc

Trợ giúp Enigmail

Sử dụng Chỉnh sửa Quy tắc của Enigmail

Trong Chỉnh sá»­a Quy tắc, bạn có thể Ä‘iá»n rõ các mặc định cho má»—i ngưá»i nhận để bật mã hóa lên, ký tên và PGP/MIME, và để xác định (các) khóa OpenPGP nào để sá»­ dụng. Má»—i quy tắc bao gồm 5 lÄ©nh vá»±c và được biểu hiện trên má»™t dòng đơn:

Thư điện tử
(Các) thư Ä‘iện tá»­ từ trưá»ng To:, Cc: và Bcc: để so sánh. Việc trùng hợp dá»±a vào chuá»—i phụ (Những chi tiết khác có thể được tìm thấy trong há»™p thoại Sá»­a đổi Quy Tắc)
(Các) khóa OpenPGP
má»™t danh sách cá»§a các ID khóa OpenPGP để sá»­ dụng cho ngưá»i nhận
Ký tên
enable or disable message signing. This either uses or overrides what you have specified in the message composition window. The values are:
  • Không bao giá»: tắt ký tên, ngay cả khi nó đã được bật lên trong cá»­a sổ viết tin nhắn (baÍc bỏ các giá trị khác)
  • Có thể: để việc ký tên như đã được Ä‘iá»n rõ trong cá»­a sổ soạn tin nhắn
  • Luôn luôn: bật ký tên lên, ngay cả nếu nó đã không được bật lên trong cá»­a sổ soạn tin nhắn

Các thiết lập ký tên này được áp dụng cho tất cả các quy tắc trùng hợp. Nếu má»™t trong những quy tắc tắt việc ký tên thì tin nhắn sẽ không được ký, ngay cả những quy tắc khác có Ä‘iá»n rõ là Luôn luôn.

Mã hóa
bật hoặc tắt việc mã hóa tin nhắn. Các thiết lập cho phép và ý nghĩa của chúng cũng giống như cho việc ký tên tin nhắn.
PGP/MIME
Bật hoặc tắt việc sử dụng PGP/MIME (RFC 3156) để mã hóa tin nhắn. Nếu PGP/MIME bị tắt, các tin nhắn được mã hoá bằng cách dùng "PGP trực tiếp". Các giá trị được cho phép và ý nghĩa của chúng cũng giống như cho việc ký tên tin nhắn.

Các quy tắc được xá»­ lý theo thứ tá»± hiển thị trong danh sách. Bất cứ khi nào má»™t quy tắc trùng hợp vá»›i má»™t ngưá»i nhận và chứa má»™t ID khóa OpenPGP, ngoài việc sá»­ dụng ID khóa được Ä‘iá»n rõ, ngưá»i nhận không được lưu ý đến nữa khi tiếp tục xá»­ lý các quy tắc khác.

Lưu ý: Chỉnh sửa quy tắc chưa được hoàn tất. Có thể viết thêm một số quy tắc tiên tiến hơn bằng cách trực tiếp chỉnh sửa tập tin quy tắc (các quy tắc này sau đó không nên được chỉnh sửa nữa trong chỉnh sửa quy tắc). Tin tức thêm nữa để trực tiếp chỉnh sửa tập tin có sẵn trên Trang chủ Enigmail


Giúp hơn nữa có sẵn trên Enigmail Help web page

enigmail-2.0.8/lang/vi/help/sendingPrefs.html000066400000000000000000000047771334302754500211370ustar00rootroot00000000000000 Enigmail Help: Edit OpenPGP Rule

Enigmail Help

Defining Preferences to Send Encrypted

In the Sending Preferences you can choose the general model and preferences for encryption.

Convenient Encryption
With these settings, emails are encrypted without confirmation whenever possible.

This setup is appropriate, if you just want to improve your privacy by sending emails encyrpted instead of unencrypted if that's possible.

The effect is like sending emails as letters instead of postcards. Unlike postcards, letters usually hide their contents while in transit.

Note however that as with letters you can't be sure that nobody is opening the letter while it is in transit (although, some technical effort is necessary for that).

A concrete risk is that you accidentally use "faked keys" you got from somewhere or somebody claiming that the key belongs to the person you want to send emails to. To avoid this risk, you can either use the trust model of PGP (see below) or you should always verify, whether the fingerprint of a public key is correct.

Manual Encryption
This option allows you to specify the different preferences for encryption according to your needs. You can specify
  • whether replies to encrypted/signed emails should automatically also be encrypted/signed-
  • whether to use the trust model of OpenPGP to accept keys (this means that to use a key you either have to sign the key or have enough other people you trust having signed the key).
  • whether you want to automatically send emails encrypted if all keys are accepted.
  • whether and when you want to finally confirm sending an email.
If it is important for you that content you send encrypted can't be read by other people or organizations, you should use the manual preferences at least choose the option to accept keys only if you or other people signed them. While this model reduces the risk of using faked keys, it requires that you actively sign keys and declare owner trust using the key managament dialog. enigmail-2.0.8/lang/zh-CN/000077500000000000000000000000001334302754500151545ustar00rootroot00000000000000enigmail-2.0.8/lang/zh-CN/am-enigprefs.properties000066400000000000000000000001171334302754500216460ustar00rootroot00000000000000# Strings used in the Mozill AccountManager prefPanel-enigprefs=OpenPGP 安全 enigmail-2.0.8/lang/zh-CN/enigmail.dtd000066400000000000000000001556661334302754500174610ustar00rootroot00000000000000 Mozilla 公共许å¯è¯ 2.0 授æƒçš„å¼€æºè½¯ä»¶ã€‚"> ' æ¥æŒ‡å®šç”µå­é‚®ä»¶åœ°å€"> ' å­—ç¬¦æ¥æŒ‡å®šé¢å‘ GnuPG 的电å­é‚®ä»¶åœ°å€ã€‚如果收件人有旧的 Hushmail 密钥就ç¦ç”¨ã€‚"> OpenPGP 安全)"> 注æ„:密钥生æˆè¿‡ç¨‹å¯èƒ½ä¼šæŒç»­æ•°åˆ†é’Ÿã€‚生æˆå¯†é’¥çš„过程中请ä¸è¦é€€å‡ºæœ¬ç¨‹åºã€‚在此期间æµè§ˆç½‘页或者执行能产生大é‡ç£ç›˜æ“作的程åºå°†å¸®åŠ©å¡«å……â€œéšæœºæ•°æ± â€å¹¶èƒ½åŠ é€Ÿå¯†é’¥åˆ›å»ºè¿›ç¨‹ã€‚å¯†é’¥åˆ›å»ºç»“æŸæ—¶æ‚¨å°†æ”¶åˆ°å®Œæˆé€šçŸ¥ã€‚"> ' 是无效的"> 注æ„:密钥生æˆè¿‡ç¨‹å¯èƒ½ä¼šæŒç»­æ•°åˆ†é’Ÿã€‚ 生æˆå¯†é’¥çš„过程中请ä¸è¦é€€å‡ºæœ¬ç¨‹åºã€‚密钥生æˆç»“æŸæ—¶æ‚¨å°†æ”¶åˆ°å®Œæˆé€šçŸ¥ã€‚"> 注æ„: Enigmail å°†æ€»æ˜¯éªŒè¯æ¯ä¸ªå¸å·æˆ–身份标识邮件的数 å­—ç­¾å,而无论它是å¦è¢«å…许或ä¸"> å…¬é’¥æ˜¯ç»™å…¶ä»–äººç”¨ä»¥å‘æ‚¨å‘é€åŠ å¯†é‚®ä»¶çš„ä¸œè¥¿ã€‚æ‚¨å¯ä»¥å°†å®ƒåˆ†å‘给任何人。"> ç§é’¥æ˜¯ä»…供您自己使用的用æ¥è§£å¯†è¿™äº›é‚®ä»¶ï¼Œä»¥åŠç­¾åè¦å‘出的邮件时使用。 您应该ä¸å°†å®ƒæ³„露给任何人。"> ç§é’¥æ˜¯ä»…供您自己使用的用æ¥è§£å¯†è¿™äº›é‚®ä»¶ï¼Œä»¥åŠç­¾åè¦å‘出的邮件时使用。 您应该ä¸å°†å®ƒæ³„露给任何人。 为了您的ç§é’¥çš„安全,您需è¦åœ¨æŽ¥ä¸‹æ¥çš„ä¸¤ä¸ªå¯¹è¯æ¡†ä¸­è¾“入一个å£ä»¤ã€‚"> å£ä»¤æ˜¯ç”¨æ¥ä¿æŠ¤æ‚¨çš„ç§é’¥çš„密ç ã€‚它用以é¿å…您的ç§é’¥è¢«æ»¥ç”¨ã€‚"> 䏿ލè使用元音 (e.g. ä, é, ñ) 和特定语言的字符。"> 使用 Enigmail 首选项中的备份å‘导,从您的旧电脑导出您的数æ®ï¼š 使用本å‘导将您的数æ®å¯¼å…¥æ‚¨çš„æ–°ç”µè„‘: "> 感谢您使用 Enigmail。"> 使用本å‘导从您的旧电脑导出您的数æ®ï¼š 使用本å‘导将您的数æ®å¯¼å…¥æ‚¨çš„æ–°ç”µè„‘: "> enigmail-2.0.8/lang/zh-CN/enigmail.properties000066400000000000000000001433311334302754500210640ustar00rootroot00000000000000Enigmail=Enigmail ##################################################################### # Strings used within enigmailCommon.js and enigmailCommon.jsm ##################################################################### enigAlert=Enigmail 警告 enigConfirm=Enigmail 确认 # enigInfo=Enigmail Information enigError=Enigmail 错误 enigPrompt=Enigmail æç¤º dlgYes=是 dlgNo=å¦ dlgKeepSetting=è®°ä½è®¾ç½®ä¸‹æ¬¡ä¸å†è¯¢é—® dlgNoPrompt=ä¸å†æ˜¾ç¤ºæ­¤å¯¹è¯æ¡† dlg.button.delete=删除(&D) dlg.button.cancel=å–æ¶ˆ(&C) dlg.button.close=关闭(&C) dlg.button.continue=ç»§ç»­(&T) dlg.button.skip=忽略(&S) dlg.button.overwrite=覆盖(&O) dlg.button.view=查看(&V) dlg.button.retry=回å¤(&R) dlg.button.ignore=忽略(&I) # dlg.button.install=&Install # dlg.button.ok=&OK repeatPrefix=\n\n此警告将会é‡å¤å‡ºçް %S repeatSuffixSingular=次 repeatSuffixPlural=或更多次 noRepeat=\n\n在您å‡çº§ Enigmail 之å‰ï¼Œæ­¤è­¦å‘Šå°†ä¸å†å‡ºçŽ°ã€‚ pgpNotSupported=æ‚¨ä¼¼ä¹Žåœ¨åŒæ—¶ä½¿ç”¨ Enigmail å’Œ PGP 6.x \n\né—æ†¾çš„æ˜¯ï¼ŒPGP 6.x 存在一些问题,致使 Enigmail 无法正常工作。因此, Enigmail ä¸å†æ”¯æŒ PGP 6.x;请用 GnuPG (GPG)æ¥ä»£æ›¿ã€‚\n\n如果您在转移到 GnuPG 上需è¦å¸®åŠ©ï¼Œè¯·æŸ¥è¯¢ Enigmail 主页上的帮助章节。 initErr.howToFixIt=为了使用 Enigmail,GnuPG 是必须的。如果您还未安装 GnuPG,最简å•的方法是使用斜线的“安装å‘å¯¼â€æŒ‰é’®ã€‚ initErr.setupWizard.button=安装å‘导(&S) passphraseCleared=å£ä»¤å·²è¢«æ¸…除。 cannotClearPassphrase=æ‚¨åœ¨ä½¿ç”¨éžæ ‡å‡†çš„工具 (例如 gnome-keyring) 进行密钥处ç†ã€‚å› æ­¤ä¸èƒ½åœ¨ Enigmail 内部清除å£ä»¤ã€‚ noPhotoAvailable=æ— å¯ç”¨ç…§ç‰‡ debugLog.title=Enigmail 调试日志 error.photoPathNotReadable=照片路径 '%S' ä¸å¯è¯» # generalError=Error: %S # Strings in configure.jsm enigmailCommon.versionSignificantlyChanged=Enigmail 的新版本在首选项和选项的处ç†ä¸Šæœ‰æ˜¾è‘—çš„å˜åŒ–。我们在å°è¯•转移旧版本的设置到此新版本。但我们ä¸èƒ½è‡ªåŠ¨å®Œæˆæ‰€æœ‰æƒ…况。请仔细检查新产生的首选项和选项。 enigmailCommon.checkPreferences=请检查首选项 ... preferences.defaultToPgpMime=默认的消æ¯ç¼–ç å·²ä»Žå†…ç½®PGP改为PGP/MIME。推èä¿æŒè¿™ä¸ªé»˜è®¤è®¾ç½®ã€‚\n\n如果你想继续使用内置PGP,å¯ä»¥åœ¨è´¦æˆ·è®¾ç½®çš„安全中更改这个选项。 ##################################################################### # Strings in enigmailAbout.js ##################################################################### usingVersion=当å‰è¿è¡Œçš„ Enigmail 版本 %S # enigmailPepVersion=Enigmail/p≡p version %S usingAgent=使用 %S 工具的 %S 程åºè¿›è¡ŒåŠ å¯†æˆ–è§£å¯† agentError=错误: 无法访问 Enigmail æœåŠ¡ï¼ ##################################################################### # Strings in enigmailKeygen.js ##################################################################### accessError=访问 Enigmail æœåŠ¡æ—¶å‘生错误 onlyGPG=密钥创建功能仅支æŒä½¿ç”¨ GnuPG (䏿”¯æŒ PGP)ï¼ keygenComplete=密钥创建结æŸï¼ 该密钥将用于标识 <%S> 的数字签å。 revokeCertRecommended=我们强烈推è为您的密钥创将一个撤销è¯ä¹¦ã€‚当您的ç§é’¥ä¸¢å¤±æˆ–被窃å–的时候,您å¯ä»¥é€šè¿‡æ­¤è¯ä¹¦å°†æ‚¨çš„密钥失效。您希望立å³åˆ›å»ºä¸€ä¸ªè¿™æ ·çš„æ’¤é”€è¯ä¹¦ä¹ˆï¼Ÿ keyMan.button.generateCert=生æˆè¯ä¹¦(&G) genCompleteNoSign=密钥创建结æŸï¼ genGoing=å¯†é’¥åˆ›å»ºæ­£åœ¨æ‰§è¡Œä¸­ï¼ passNoMatch=å£ä»¤ä¸ç¬¦ï¼›è¯·é‡æ–°è¾“å…¥ passCheckBox=如果ä¸ä¸ºå¯†é’¥è®¾ç½®å£ä»¤è¯·é€‰æ‹©æ­¤é¡¹ passUserName=请为此标识设置用户å keygen.missingUserName=未为选中的账户指定姓å,请在账户设置的“姓åâ€ä¸­è¾“入。 keygen.passCharProblem=您在您的å£ä»¤ä¸­ä½¿ç”¨äº†ç‰¹æ®Šå­—ç¬¦ã€‚é—æ†¾çš„æ˜¯è¿™å¯èƒ½å¯¼è‡´å…¶ä»–应用程åºå‡ºçŽ°é—®é¢˜ã€‚æˆ‘ä»¬æŽ¨èæ‚¨é€‰æ‹©ä¸€ä¸ªåªåŒ…å«ä¸‹åˆ—字符的å£ä»¤ï¼ša-z A-Z 0-9 /.;:-,!?(){}[]%* passSpaceProblem=因为技术原因,您的å£ä»¤å¯èƒ½ä¸èƒ½ä»¥ç©ºæ ¼å­—符开头或结尾。 changePassFailed=更改å£ä»¤å¤±è´¥ã€‚ keyConfirm=为“%Sâ€åˆ›å»ºå…¬é’¥å’Œç§é’¥ä¹ˆï¼Ÿ keyMan.button.generateKey=生æˆå¯†é’¥(&G) keyAbort=中止密钥生æˆï¼Ÿ keyMan.button.generateKeyAbort=放弃密钥生æˆ(&A) keyMan.button.generateKeyContinue=继续密钥生æˆ(&C) expiryTooLong=您ä¸èƒ½åˆ›å»ºæœ‰æ•ˆæœŸè¶…过 100 年的密钥。 expiryTooLongShorter=您ä¸èƒ½åˆ›å»ºæœ‰æ•ˆæœŸè¶…过 90 年的密钥。 expiryTooShort=您的密钥必须至少在一天内有效。 keyGenFailed=密钥生æˆå¤±è´¥ï¼Œè¯·æ£€æŸ¥ Enigmail 终端 (èœå• 安全 > 调试 Enigmail) 了解详细信æ¯ã€‚ setKeyExpirationDateFailed=过期时间ä¸èƒ½æ›´æ”¹ # Strings in enigmailMessengerOverlay.js securityInfo=Enigmail 安全信æ¯\n\n enigHeader=Enigmail : enigContentNote=Enigmail : *æœ¬é‚®ä»¶çš„é™„ä»¶æœªè¢«æ•°å­—ç­¾åæˆ–加密*\n\n possiblyPgpMime=本邮件å¯èƒ½ä½¿ç”¨ PGP/MIME æ–¹å¼åŠ å¯†æˆ–æ•°å­—ç­¾åï¼›ç‚¹å‡»â€œè§£å¯†â€æŒ‰é’®ä»¥éªŒè¯ saveAttachmentHeader=Enigmail : ä¿å­˜å·²è§£å¯†é™„ä»¶ noTempDir=无法写入临时目录\n请设置有效的环境å˜é‡ TEMP attachmentPgpKey=æ‚¨è¦æ‰“开的附件“%Sâ€æ˜¯ä¸€ä¸ª OpenPGP 密钥文件。\n\n点击“是â€ä»¥å¯¼å…¥è¯¥é™„件中的密钥或者点击“å¦â€ä»¥ä¾¿åœ¨æµè§ˆå™¨ä¸­æŸ¥çœ‹æ–‡ä»¶å†…容 beginPgpPart=********* *BEGIN ENCRYPTED or SIGNED PART* ********* endPgpPart=********** *END ENCRYPTED or SIGNED PART* ********** notePartEncrypted=Enigmail : *该邮件的æŸäº›éƒ¨åˆ†â€œæœªç»â€æ•°å­—ç­¾åæˆ–加密* noteCutMessage=Enigmail: *找到多个消æ¯å— -- 解密/验è¯ä¸­æ­¢* decryptOkNoSig=警告\n\n解密æˆåŠŸï¼Œä½†æ— æ³•éªŒè¯æ•°å­—ç­¾å的正确性 msgOvl.button.contAnyway=åšæŒç»§ç»­(&C) signature.verifiedOK=附件 %S 的签åéªŒè¯æˆåŠŸ signature.verifyFailed=附件 %S çš„ç­¾åæœªèƒ½éªŒè¯ attachment.noMatchToSignature=附件 '%S' ä¸åŒ¹é…ç­¾åæ–‡ä»¶ attachment.noMatchFromSignature=ç­¾åæ–‡ä»¶ '%S' ä¸åŒ¹é…附件 fixBrokenExchangeMsg.failed=ä¿®å¤æ¶ˆæ¯æœªæˆåŠŸã€‚ # enigmail.msgViewColumn.label=Enigmail # enigmailPep.msgViewColumn.label=Enigmail/p≡p # wksNoIdentity=This key is not linked to any of your email accounts. Please add an account for at least one of the following email addresse(s):\n\n%S # wksConfirmSuccess=Confirmation email sent. # wksConfirmFailure=Sending the confirmation email failed. # autocrypt.importSetupKey.accountPreconfigured=Your account is already correctly configured for Autocrypt.\n\nDo you really want to overwrite your settings with this setup message? # autocrypt.importSetupKey.selfCreated=This message was created by your currently running instance of Enigmail.\n\nPlease switch to the email client to which you want to transfer the settings, and click on the message on that email client to import the settings. # autocrypt.importSetupKey.invalidMessage=Error - could not read setup message. The message seems to be corrupted. Please try to create a new setup message on your "other" device. # autocrypt.importSetupKey.invalidKey=Error - the key could not be imported. The key is either not supported by your version of GnuPG, or it got corrupted. # autocrypt.importSetupKey.wrongPasswd=The password you entered is wrong. Do you want to retry? # autocrypt.importSetupKey.success=The Autocrypt setup message was processed successfully. Autocrypt is now available for your account '%S'. ##################################################################### # Strings in enigmailMsgComposeOverlay.js ##################################################################### keysToExport=选择è¦åµŒå…¥çš„ OpenPGP 密钥 keysToUse=选择用于 %S çš„ OpenPGP 密钥 pubKey=%S 的公钥\n windowLocked=编辑窗å£å·²é”定;å‘é€å–消 sendUnencrypted=åˆå§‹åŒ– Enigmail 失败。\nå‘逿œªåŠ å¯†çš„é‚®ä»¶å—? composeSpecifyEmail=请指定您è¦ä½¿ç”¨çš„主è¦é‚®ä»¶åœ°å€ï¼Œè¯¥åœ°å€å°†è¢«ç”¨äºŽä¸ºå¾…å‘邮件选择数字签å密钥。\n å¦‚æžœä¿æŒæ­¤é¡¹ç©ºç™½ï¼Œé‚®ä»¶çš„ FROM 地å€å°†è¢«ç”¨äºŽé€‰æ‹©æ•°å­—ç­¾å密钥。 sendingHiddenRcpt=此邮件有 BCC(密é€ï¼‰æ”¶ä»¶äººã€‚如果此消æ¯å·²åŠ å¯†ï¼Œå®ƒå¯ä»¥éšè—坆逿”¶ä»¶äººï¼Œä½†ä¸€äº›äº§å“(例如 PGP)的用户将ä¸èƒ½è§£å¯†è¯¥é‚®ä»¶ã€‚有鉴于此,我们建议ä¸è¦åŒæ—¶ä½¿ç”¨å¯†é€ä¸Žé‚®ä»¶åŠ å¯†ã€‚ sendWithHiddenBcc=éšè—坆逿”¶ä»¶äºº sendWithShownBcc=正常加密 sendingNews=加密的å‘逿“ä½œå·²å–æ¶ˆã€‚\n\næ­¤é‚®ä»¶åŒ…å«æ–°é—»ç»„收件人,因此ä¸èƒ½è¢«åŠ å¯†ã€‚è¯·é‡æ–°å‘逿œªåŠ å¯†çš„å‰¯æœ¬ã€‚ sendToNewsWarning=警告:您å³å°†å‘é€ä¸€å°åŠ å¯†çš„é‚®ä»¶åˆ°ä¸€ä¸ªæ–°é—»ç»„ã€‚\n\n仅在该组的所有æˆå‘˜éƒ½èƒ½è§£å¯†è¯¥é‚®ä»¶æ—¶æ‰é¼“励这么åšï¼Œå› ä¸ºè¿™æ‰æœ‰æ„义。请仅在您明确知é“他们能åšåˆ°è¿™ç‚¹çš„æƒ…况下å‘逿­¤é‚®ä»¶ã€‚\n\nç»§ç»­å—? hasHTML=HTML 邮件警告:\n此邮件å¯èƒ½å«æœ‰ HTML,这有å¯èƒ½å¯¼è‡´æ•°å­—ç­¾å/åŠ å¯†å¤±è´¥ã€‚ä¸ºé˜²æ­¢å†æ¬¡å‡ºçŽ°æ­¤ç±»æç¤ºï¼Œæ‚¨åº”该在按下 SHIFT é”®çš„åŒæ—¶ç‚¹å‡» 撰写/å›žå¤ æŒ‰é’®ä»¥ä¾¿å‘逿•°å­—ç­¾å邮件。\nå¦‚æžœæ‚¨é€‰æ‹©äº†é»˜è®¤æƒ…å†µä¸‹æ•°å­—ç­¾åæ‰€æœ‰é‚®ä»¶ï¼Œé‚£ä¹ˆæ‚¨åº”è¯¥å–æ¶ˆé€‰é¡¹å¯¹è¯æ¡†ä¸­çš„“撰写 HTML é‚®ä»¶â€æ¥æ°¸ä¹…关闭此邮件户的 HTML 邮件功能。 strippingHTML=å°†é‚®ä»¶è½¬æ¢æˆçº¯æ–‡æœ¬è¿›è¡Œæ•°å­—ç­¾å/加密会导致 HTML 邮件中包å«çš„æ ¼å¼ä¿¡æ¯ä¸¢å¤±ã€‚您希望继续执行å—? msgCompose.button.sendAnyway=åšæŒå‘é€é‚®ä»¶(&S) attachWarning=本邮件的附件没有本地副本,ä¸èƒ½è¢«åŠ å¯†ã€‚è¦åŠ å¯†æ­¤ç±»é™„ä»¶ï¼Œæ‚¨å¿…é¡»å°†å…¶ä¿å­˜è‡³æœ¬åœ°ç¡¬ç›˜ç„¶åŽé‡æ–°å¢žåŠ å…¶ä¸ºé™„ä»¶ã€‚æ‚¨ä»è¦ç»§ç»­å—? quotedPrintableWarn=您选择了在å‘é€é‚®ä»¶æ—¶è¿›è¡Œâ€œquoted-printableâ€ç¼–ç ã€‚è¿™å¯èƒ½ä¼šå¯¼è‡´æ‚¨çš„邮件无法被正确解密或验è¯ã€‚\n 您希望立å³å…³é—­â€œå‘é€â€œquoted-printableâ€é‚®ä»¶â€é€‰é¡¹å—? minimalLineWrapping=您已ç»è®¾ç½®äº†åœ¨ %S 个字符处自动æ¢è¡Œã€‚此值必须ä¸å°äºŽ 68 以ä¿è¯æ­£ç¡®åŠ å¯†æˆ–æ•°å­—ç­¾å。\n您希望立å³å°†è‡ªåЍæ¢è¡Œè®¾ç½®ä¸º 68 个字符å—? warning=警告 signIconClicked=æ‚¨å·²ç»æ‰‹å·¥æ›´æ”¹äº†æ•°å­—ç­¾å设置。因此,您撰写此邮件时,关闭或激活邮件数字签åå°†ä¸å†ä¾èµ–于关闭或激活邮件加密。 errorOwnKeyUnusable=为当å‰è´¦æˆ·é…置的密钥ID‘%Sâ€™ä¸æ˜¯æœ‰æ•ˆçš„OpenGPG密钥。\n\nè¯·ç¡®è®¤ä½ æœ‰ä¸€ä¸ªæœ‰æ•ˆã€æœªè¿‡æœŸçš„OpenGPG密钥并且你的账户指å‘这个密钥。\n如果你的密钥没有过期,那么检查你是å¦ä¸ºå¯†é’¥è®¾ç½®äº†å®Œå…¨ä¿¡ä»»ã€‚ msgCompose.cannotSaveDraft=ä¿å­˜è‰ç¨¿æ—¶å‡ºé”™ # msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information - partially encrypted email. # msgCompose.partiallyEncrypted.mimeMsg=The message you are replying to contained both unencrypted and encrypted parts. Some encrypted message parts are invisible to you.\n\nIf the sender was not able to decrypt the hidden message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nWe recommend that you don't reply to the message, but create a new message containing your answer. # msgCompose.partiallyEncrypted.inlinePGP=The message you are replying to contained both unencrypted and encrypted parts. If the sender was not able to decrypt some message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nPlease consider removing all quoted text from your reply to this sender. msgCompose.internalEncryptionError=内部错误:ä¿è¯åР坆已ç¦ç”¨ msgCompose.internalError=å‘生内部错误。 msgCompose.toolbarTxt.signAndEncrypt=此消æ¯å°†è¢«ç­¾å和加密 msgCompose.toolbarTxt.signOnly=此消æ¯å°†è¢«ç­¾å msgCompose.toolbarTxt.encryptOnly=此消æ¯å°†è¢«åР坆 msgCompose.toolbarTxt.noEncryption=此消æ¯å°†ä¸è¢«ç­¾å且ä¸è¢«åР坆 msgCompose.toolbarTxt.disabled=Enigmail 已对选定的身份ç¦ç”¨ # msgCompose.protectSubject.tooltip=Protect the message subject # msgCompose.noSubjectProtection.tooltip=Do not protect the message subject msgCompose.encryptedSubjectStub=已加密的邮件 # msgCompose.protectSubject.dialogTitle=Enable Protection of Subject? # msgCompose.protectSubject.question=Regular encrypted emails contain the unredacted subject.\n\nWe have established a standard to hide the original subject in the encrypted message\nand replace it with a dummy text, such that the subject is only visible after the email is decrypted.\n\nDo you want to protect the subject in encrypted messages? # msgCompose.protectSubject.yesButton=&Protect subject # msgCompose.protectSubject.noButton=&Leave subject unprotected msgCompose.detailsButton.label=详细信æ¯... msgCompose.detailsButton.accessKey=D # msgCompose.pepSendUnknown=Unknown # msgCompose.pepSendUnsecure=Unsecure # msgCompose.pepSendSecure=Secure # msgCompose.pepSendTrusted=Secure & Trusted # pep.alert.disabledForIdentity=p≡p is disabled for the current identity. Please enable p≡p via the Enigmail/p≡p preferences. # pep.alert.weakReply=You’re about to forward or reply to a secure message as insecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? # note: should end with double newline: sendAborted=å‘逿“ä½œå·²å–æ¶ˆã€‚\n\n # details: keyNotTrusted=对“%Sâ€å¯†é’¥æ²¡æœ‰è¶³å¤Ÿçš„ä¿¡ä»» keyNotFound=找ä¸åˆ°â€œ%Sâ€å¯†é’¥ keyRevoked=密钥“%Sâ€å·²åºŸé™¤ keyExpired=密钥“%Sâ€å·²è¿‡æœŸ statPGPMIME=PGP/MIME # statSMIME=S/MIME statSigned=已数字签å statEncrypted=已加密 statPlain=纯文本 offlineSave=将待å‘邮件 %S ä¿å­˜è‡³å‘件箱中的 %S 目录? onlineSend=ç«‹å³å°†é‚®ä»¶ %S å‘é€ç»™ %S? encryptKeysNote=注æ„: 此邮件已使用下列用户/密钥标识的密钥加密: %S hiddenKey=<密钥已éšè—> signFailed=Enigmail 错误;加密/æ•°å­—ç­¾å失败;å‘逿œªåŠ å¯†é‚®ä»¶ï¼Ÿ msgCompose.button.sendUnencrypted=å‘逿œªåŠ å¯†çš„é‚®ä»¶(&S) recipientsSelectionHdr=选择加密收件人 configureNow=您未将选择的标识é…置为使用 Enigmail 安全邮件 (Enigmail) 。立å³é…置? # encryption/signing status and associated reasons: encryptMessageAuto=加密邮件(自动) encryptMessageNorm=加密邮件 signMessageAuto=ç­¾å邮件(自动) signMessageNorm=ç­¾å邮件 encryptOff=加密:关 encryptOnWithReason=加密:开 (%S) encryptOffWithReason=加密:关 (%S) encryptOn=加密:开 signOn=ç­¾å:开 signOff=ç­¾å:关 signOnWithReason=ç­¾å:开 (%S) signOffWithReason=ç­¾å:关 (%S) reasonEnabledByDefault=默认å¯ç”¨ reasonManuallyForced=手动强制 reasonByRecipientRules=收件人规则强制 reasonByAutoEncryption=自动加密强制 reasonByConflict=æ”¶ä»¶äººè§„åˆ™å†²çª reasonByEncryptionMode=加密模å¼å†²çª # should not be used anymore: encryptYes=邮件将被加密 encryptNo=邮件将ä¸è¢«åР坆 # should not be used anymore: signYes=邮件将被数字签å signNo=邮件将ä¸è¢«æ•°å­—ç­¾å # PGP/MIME status: pgpmimeNormal=å议:PGP/MIME inlinePGPNormal=å议:内嵌 PGP # smimeNormal=Protocol: S/MIME pgpmimeAuto=å议:PGP/MIME(自动) inlinePGPAuto=å议:内嵌 PGP(自动) # smimeAuto=Protocol: S/MIME (auto) # should not be used anymore pgpmimeYes=PGP/MIME 将被使用 pgpmimeNo=å†…è” PGP 将被使用 # Attach own key status (tooltip strings): attachOwnKeyNo=您拥有的密钥将ä¸ä¼šé™„加 attachOwnKeyYes=您拥有的密钥将被附加 attachOwnKeyDisabled=您自己的密钥无法附加。您必须在“账户设置â€ä¸­çš„ OpenPGP 部分选择一个密钥æ‰èƒ½ä½¿ç”¨æ­¤åŠŸèƒ½ã€‚ rulesConflict=检测到与收件人规则冲çª\n%S\n\n使用这些设置å‘é€é‚®ä»¶ï¼Ÿ msgCompose.button.configure=é…ç½®(&C) msgCompose.button.send=å‘逿¶ˆæ¯(&S) msgCompose.button.save=ä¿å­˜æ¶ˆæ¯(&S) # Strings in enigmailMsgHdrViewOverlay.js keyNeeded=需è¦å…¬é’¥ %S ä»¥éªŒè¯æ•°å­—ç­¾å keyUsed=使用公钥 %S æ¥éªŒè¯ç­¾å clickDecrypt=;请点击解密按钮 clickDecryptRetry=;请点击解密按钮é‡è¯• clickDetailsButton=;点击“详细信æ¯â€æŒ‰é’®èŽ·å–æ›´å¤šä¿¡æ¯ clickImportButton=ï¼›ç‚¹å‡»â€œå¯¼å…¥å¯†é’¥â€æŒ‰é’®ä¸‹è½½å¯†é’¥ keyTypeUnsupported=;您的 GnuPG ç‰ˆæœ¬çš„å¯†é’¥ç±»åž‹ä¸æ”¯æŒ msgPart=邮件包å«å·² %S 部分 msgSigned=æ•°å­—ç­¾å msgSignedUnkownKey=使用未知密钥签å msgEncrypted=加密 msgSignedAndEnc=æ•°å­—ç­¾å并加密 unverifiedSig=未验è¯çš„æ•°å­—ç­¾å incompleteDecrypt=解密ä¸å®Œæ•´ needKey=错误 - 需è¦ä½¿ç”¨ç§é’¥è¿›è¡Œé‚®ä»¶è§£å¯† failedDecrypt=错误 - 解密失败 badPhrase=错误 - å£ä»¤ä¸ç¬¦ failedDecryptVerify=错误 - 解密/验è¯å¤±è´¥ mdcError=错误 - 报文未å—åˆ°å®Œæ•´çš„ä¿æŠ¤ viewInfo=;选择“查看 > Enigmail ä¿¡æ¯â€æŸ¥çœ‹è¯¦ç»†ä¿¡æ¯ decryptedMsg=已解密的邮件 decryptedMsgWithFormatError=已解密消æ¯ï¼ˆå·²æ¢å¤æ ¼å¼å¼‚常的 PHP 邮件,这å¯èƒ½æ˜¯ç”±äºŽä¸€ä¸ªæ—§ç‰ˆæœ¬çš„ Exchange æœåŠ¡å™¨å¯¼è‡´ï¼Œå› æ­¤è¿™å¯èƒ½å¹¶ä¸å®Œæ•´ï¼‰ usedAlgorithms=使用算法:%S å’Œ %S # pepStatusInfo.text=p≡p Message Status. # pepStatusInfo.title.m3=Under Attack # pepStatusInfo.info.m3=This message is not secure and has been tampered with. # pepStatusInfo.title.m1=Mistrusted # pepStatusInfo.info.m1=This message has a communication partner that has previously been marked as mistrusted # pepStatusInfo.title.r0=Unknown # pepStatusInfo.info.r0=This message does not contain enough information to determine if it is secure. # pepStatusInfo.title.r1=Cannot Decrypt # pepStatusInfo.info.r1=This message cannot be decrypted because the key is not available. # pepStatusInfo.title.r2=Cannot Decrypt # pepStatusInfo.info.r2=This message cannot be decrypted because the key is not available. # pepStatusInfo.title.r3=Unsecure # pepStatusInfo.info.r3=This message is unsecure. # pepStatusInfo.title.r4=Unsecure for Some # pepStatusInfo.info.r4=This message is unsecure for some communication partners. # pepStatusInfo.title.r5=Unreliable Security # pepStatusInfo.info.r5=This message has unreliable protection. # pepStatusInfo.title.r6=Secure... # pepStatusInfo.info.r6=This message is secure but you still need to verify the identity of your communication partner. # pepStatusInfo.title.r7=Secure & Trusted # pepStatusInfo.info.r7=This message is secure and trusted. # pepStatusInfo.color.green=Green # pepStatusInfo.color.yellow=Yellow # pepStatusInfo.color.red=Red # pepRevokeTrust.question=Do you really want to cancel the trust for %S? # pepRevokeMistrust.question=Do you really want to re-trust the key for %S? # pepRevokeTrust.doRevoke=Cancel &trust # wksConfirmationReq=Web Key Directory Confirmation Request # wksConfirmationReq.message=This message has been sent by your email provider to confirm deployment of your OpenPGP public key\nin their Web Key Directory.\nProviding your public key helps others to discover your key and thus being able to encrypt messages to you.\n\nIf you want to deploy your key in the Web Key Directory now, please click on the button "Confirm Request" in the status bar.\nOtherwise, simply ignore this message. # wksConfirmationReq.button.label=Confirm Request # autocryptSetupReq=Perform Autocrypt Setup # autocryptSetupReq.button.label=Start Setup # autocryptSetupReq.setupMsg.desc=This message contains all information to transfer your Autocrypt settings along with your secret key securely from your original device. # autocryptSetupReq.setupMsg.backup=You can keep this message and use it as a backup for your secret key. If you want to do this, you should write down the password and store it securely. # autocryptSetupReq.message.import=To import the settings and key(s) in Enigmail, please click on the "Start Setup" button in the status bar. # autocryptSetupReq.message.sent=Please click on the message on your new device and follow the instuctions to import the settings. # strings in pref-enigmail.js # oldGpgVersion20=Enigmail initialization failed.\n\nYou are using GnuPG version %1$S, which is not supported anymore. Enigmail requires GnuPG version %2$S or newer. Please upgrade your GnuPG installation, or Enigmail will not work. locateGpg=å®šä½ GnuPG ç¨‹åº invalidGpgPath=指定的 GnuPG 执行路径ä¸å¯ç”¨ã€‚ Enigmail åŠŸèƒ½å°†è¢«å…³é—­ç›´è‡³æ‚¨å°†è¯¥è·¯å¾„é‡æ–°æŒ‡å‘ GnuPG æˆ–ç›´è‡³æ‚¨é‡æ–°å¯åŠ¨ç¨‹åºã€‚ warningsAreReset=所有警告已ç»å¤ä½ prefs.gpgFound=GnuPG 在 %S 找到 prefs.gpgNotFound=未能å‘现 GnuPG prefs.warnAskNever=警告: 选择此项将导致在任何一个收件人没有公钥时都会使邮件ä¸èƒ½è¢«åŠ å¯†çš„ç»“æžœ -- 此时Enigmail也ä¸èƒ½é€šçŸ¥åˆ°ä½ ! prefs.warnIdleTimeForUnknownAgent=无法连接到 gpg-agent。也许您的系统使用了一个特殊工具进行å£ä»¤å¤„ç†ï¼ˆä¾‹å¦‚ gnome-keyringã€seahorse-agentã€KDE 钱包管ç†å™¨...ï¼‰ã€‚é—æ†¾çš„æ˜¯ Enigmail 无法控制您所使用的工具的å£ä»¤è¶…时。因此,Enigmail 中设置的超时将被忽略。 prefEnigmail.oneKeyserverOnly=错误 - 您åªèƒ½æŒ‡å®šä¸€ä¸ªå¯†é’¥æœåŠ¡å™¨ç”¨äºŽè‡ªåŠ¨ä¸‹è½½ç¼ºå¤±çš„ OpenPGP 密钥。 # Strings used in core.jsm # (said file also re-uses some strings from above) enterAdminPin=请输入您的智能å¡ç®¡ç†è¯†åˆ«ç  enterCardPin=请输入您的智能å¡è¯†åˆ«ç  notInit=错误 - Enigmail æœåŠ¡æœªåˆå§‹åŒ– badCommand=错误 - 加密命令失败 cmdLine=命令åŠè¾“å…¥: notRequired=错误 - 无需加密 notComplete=错误 - å¯†é’¥åˆ›å»ºæœªå®Œæˆ invalidEmail=错误 - æ— æ•ˆé‚®ä»¶åœ°å€ noPassphrase=错误 - 未æä¾›å£ä»¤ noPGPblock=错误 - 未找到任何有效 ASCII ARMORED OpenPGP æ•°æ®æ®µ unverifiedReply=邮件的缩进部分 (回å¤) å¯èƒ½å·²è¢«ä¿®æ”¹ keyInMessageBody=消æ¯ä¸»ä½“中找到密钥。点击“导入密钥â€å¯¼å…¥å®ƒ sigMismatch=错误 - æ•°å­—ç­¾åä¸ç¬¦ cantImport=导入公钥时å‘生错误\n\n doImportOne=导入 %1$S (%2$S)? doImportMultiple=导入下列密钥?\n\n%S previewFailed=无法读å–公钥文件。 # Strings used in errorHandling.jsm sc.wrongCardAvailable=在您的读å¡å™¨ä¸­æ‰¾åˆ°çš„æ™ºèƒ½å¡ %S ä¸èƒ½ç”¨æ¥å¤„ç†è¯¥é‚®ä»¶ã€‚\n请æ’å…¥æ‚¨çš„æ™ºèƒ½å¡ %S,然åŽé‡æ–°è¿›è¡Œæ­¤æ“作。 sc.insertCard=æ­¤æ“ä½œéœ€è¦æ‚¨çš„æ™ºèƒ½å¡ %S。\n请æ’入所需的智能å¡ï¼Œç„¶åŽé‡æ–°è¿›è¡Œæ­¤æ“作。 sc.removeCard=æ­¤æ“作ä¸éœ€è¦æ™ºèƒ½å¡æ”¾åœ¨è¯»å¡å™¨ä¸­ã€‚\n请从读å¡å™¨ä¸­åŽ»é™¤æ‚¨çš„æ™ºèƒ½å¡ï¼Œç„¶åŽé‡æ–°è¿›è¡Œæ­¤æ“作。 sc.noCardAvailable=您的读å¡å™¨ä¸­æ— æ™ºèƒ½å¡ \n è¯·å°†æ™ºèƒ½å¡æ’入读å¡å™¨å¹¶é‡è¯• sc.noReaderAvailable=无法访问您的智能å¡è¯»å¡å™¨ \n 请连接您的智能å¡è¯»å¡å™¨ï¼Œæ’入您的智能å¡ï¼Œå¹¶é‡è¯• keyError.keySpecNotFound=电å­é‚®ä»¶åœ°å€ "%S" 无法匹é…到您的钥匙环上的密钥。 keyError.keyIdNotFound=å·²é…置的密钥 ID "%S" 无法在您的钥匙环中找到。 keyError.resolutionAction=请在您的“账户设置â€ä¸­çš„ OpenPGP 部分选择一个有效密钥。 missingPassphrase=缺少å£ä»¤ errorHandling.gpgAgentInvalid=您的系统è¿è¡Œçš„ gpg-agent 版本ä¸é€‚åˆæ‚¨çš„ GnuPG 版本。 errorHandling.gpgAgentError=GnuPG 与 gpg-agent (GnuPG 的一个组件) 通信时报告了一个错误。 errorHandling.dirmngrError=GnuPG 与 dirmngr (GnuPG 的一个组件) 通信时报告了一个错误。 errorHandling.pinentryError=GnuPG 无法通过 pinentry 查询您的å£ä»¤ã€‚ errorHandling.readFaq=一个安装或é…置的错误阻止了Enigmail正常è¿è¡Œï¼Œå¹¶æ— æ³•自动修正。\n\n强烈推è在支æŒé¡µé¢å‚考:https://enigmail.net/faq gpgNotFound=ä¸èƒ½åœ¨ '%S' 定ä½åˆ°GnuPG程åº.\n确认你在Enigmail傿•°ä¸­å·²ç»æ­£ç¡®è®¾ç½®GnuPG坿‰§è¡Œç¨‹åºè·¯å¾„ gpgNotInPath=ä¸èƒ½åœ¨è¿™ä¸ªè·¯å¾„定ä½åˆ°GnuPG程åº.\n确认你在Enigmail傿•°ä¸­å·²ç»æ­£ç¡®è®¾ç½®GnuPG坿‰§è¡Œç¨‹åºè·¯å¾„ enigmailNotAvailable=Enigmail 核心æœåŠ¡ä¸å¯ç”¨ prefGood=该邮件已ç»ç”± %S æ•°å­—ç­¾å,且在传输过程中未被篡改过 prefBad=该邮件已ç»ç”± %S æ•°å­—ç­¾å,但“已被â€ç¯¡æ”¹ failCancel=错误 - 密钥接收被用户中断 failNoServer=错误 - 为指定接收密钥使用的密钥æœåС噍 failNoID=错误 - æœªæŒ‡å®šè¦æŽ¥æ”¶çš„å¯†é’¥çš„å¯†é’¥æ ‡è¯† failKeyExtract=错误 - 密钥æå–命令失败 notFirstBlock=错误 - 第一个 OpenPGP æ®µä¸æ˜¯å…¬é’¥æ®µ importKeyConfirm=从邮件中导入嵌入的密钥么? failKeyImport=错误 - 密钥导入失败 fileWriteFailed=写入文件 %S 失败 importKey=从密钥æœåС噍坼入公钥 %S: uploadKey=将公钥 %S å‘é€åˆ°å¯†é’¥æœåС噍: keyId=密钥标识 keyAndSigDate=密钥标识: 0x%S / ç­¾åæ—¥æœŸ: %S keyFpr=密钥指纹: %S noEmailProvided=您未æä¾›é‚®ä»¶åœ°å€ï¼ keyAlreadySigned=该密钥已被签署,您ä¸èƒ½å¯¹å…¶é‡å¤ç­¾ç½²ã€‚ ##################################################################### # Strings used in enigmailKeySelection.js ##################################################################### selKeyExpired=%S 已过期 createdHeader=已创建 atLeastOneKey=æœªé€‰æ‹©å¯†é’¥ï¼æ‚¨å¿…é¡»è‡³å°‘é€‰æ‹©ä¸€ä¸ªå¯†é’¥ä»¥æŽ¥å—æ­¤å¯¹è¯æ¡† fewerKeysThanRecipients=您选择了一个比收件人人数还å°çš„æ•°å­—。您确定è¦ç”¨ä½œåŠ å¯†çš„å¯†é’¥åˆ—è¡¨å·²å®Œæˆï¼Ÿ userSel.button.goBack=选择更多密钥 userSel.secretKeySel.title=选择一个秘密的 OpenPGP 密钥æ¥ç­¾æ³¨æ‚¨çš„æ¶ˆæ¯ userSel.problemNoKey=没有有效的密钥 userSel.problemMultipleKeys=多个密钥 # should be same as thunderbird ENTITY sendLaterCmd.label: sendLaterCmd.label=以åŽå‘é€ # Strings used in enigmailAttachmentDialog.js # pgpMimeNote=NOTE: PGP/MIME is not supported by all email clients. If you are unsure, select the %S option. first=第一个 second=第二个 # Strings used in am-enigprefs.js / enigmailEditIdentity.js encryptKeyHeader=选择加密用的 OpenPGP 密钥 identityName=标识: %S # switchPepMode=You are currently using the 'p≡p Junior' mode of Enigmail.\n\nBy enabling OpenPGP or S/MIME for an account, you are disabling p≡p and use the 'regular' mode of Enigmail without p≡p. # enableEnigmail=&Disable p≡p # Strings used in enigmailSingleRcptSettings.js noEncryption=æ‚¨å·²ç»æ¿€æ´»åŠ å¯†åŠŸèƒ½ï¼Œä½†æ‚¨å¹¶æœªé€‰æ‹©ä»»ä½•å¯†é’¥ã€‚è¦åР坆å‘é€ç»™ %S çš„é‚®ä»¶ï¼Œæ‚¨å¿…é¡»ä»Žæ‚¨çš„å¯†é’¥åˆ—è¡¨ä¸­é€‰æ‹©ä¸€ä¸ªæˆ–å¤šä¸ªæœ‰æ•ˆå¯†é’¥ã€‚æ‚¨å¸Œæœ›å–æ¶ˆå¯¹ %S 的加密么? noKeyToUse=(æ—  - ä¸åР坆) noEmptyRule=规则ä¸èƒ½ä¸ºç©ºï¼è¯·åœ¨è§„则区域输入电å­é‚®ä»¶åœ°å€ã€‚ invalidAddress=您输入的电å­é‚®ä»¶åœ°å€æ— æ•ˆã€‚请ä¸è¦è®¾ç½®æ”¶ä»¶äººå§“å,仅输入电å­é‚®ä»¶åœ°å€å³å¯ã€‚例如:\n正确的: 张三 \n错误的: zhang.san@address.net # noCurlyBrackets=The curly brackets {} have a special meaning and should not be used in an email address. If you want to modify the matching behavior for this rule, use the 'Apply rule if recipient ...' option.\nMore information is available from the Help button. # Strings used in enigmailRulesEditor.js never=ä»Žä¸ always=总是 possible=å¯èƒ½ deleteRule=确实è¦åˆ é™¤é€‰ä¸­çš„规则? nextRcpt=(下一收件人) negateRule=éž addKeyToRule=添加密钥 %S (%S) 到收件人规则 # Strings used in enigmailSearchKey.js needOnline=您选择的功能ä¸èƒ½åœ¨ç¦»çº¿çжæ€ä¸‹ä½¿ç”¨ã€‚请连线é‡è¯•。 protocolNotSupported=æš‚ä¸æ”¯æŒä½¿ç”¨â€œ%S://â€å议下载 OpenPGP 密钥。 gpgkeysDisabled=å¼€å¯â€œextensions.enigmail.useGpgKeysToolâ€ä¹Ÿè®¸ä¼šæœ‰å¸®åŠ©ã€‚ noKeyserverConn=无法连接密钥æœåС噍 %S。 keyDownloadFailed=从密钥æœåŠ¡å™¨ä¸‹è½½å¯†é’¥å¤±è´¥ã€‚çŠ¶æ€ä¿¡æ¯ä¸º:\n%S internalError=å‘生内部错误。密钥无法被下载或导入。 noKeyFound=éžå¸¸æŠ±æ­‰ï¼Œæ‰¾ä¸åˆ°ä»»ä½•ç¬¦åˆæœç´¢æ¡ä»¶çš„密钥。\n请注æ„,密钥标识应该使用“0xâ€å¼€å¤´(例如 0xABCDEF12)。 # keyDownload.keyUnavailable=We are sorry, but the key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their key by email. # gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. gpgKeysFailed=从密钥æœåŠ¡å™¨æŸ¥æ‰¾æˆ–ä¸‹è½½å¯†é’¥å¤±è´¥: 无法执行 gpgkeys_%S。 # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=设置密钥信任级别失败 # Strings in enigmailSignKeyDlg.js signKeyFailed=密钥签署失败 alreadySigned.label=注æ„:该密钥 %S å·²ç»ç”¨é€‰å®šçš„密钥签å。 alreadySignedexportable.label=注æ„:密钥 %S å·²ç»ä½¿ç”¨é€‰å®šçš„ç§é’¥ç­¾åå¯è¾“å‡ºã€‚æœ¬åœ°ç­¾åæ²¡æœ‰æ„义。 partlySigned.label=注æ„:密钥 %S 的一些用户IDå·²ç»ä½¿ç”¨é€‰å®šçš„ç§é’¥ç­¾å。 noTrustedOwnKeys=没有找到å¯ç­¾åçš„å¯†é’¥ï¼æ‚¨éœ€è¦è‡³å°‘一个完全å—信任的ç§é’¥ä½œä¸ºç­¾å密钥。 # Strings in enigmailKeyManager.js keyMan.loadingKeys=加载密钥, 请ç¨å€™ ... keyValid.unknown=未知 keyValid.invalid=无效 keyValid.disabled=å·²ç¦ç”¨ keyValid.revoked=已撤销 keyValid.expired=已过期 keyValid.noSubkey=无有效å­å¯†é’¥ keyTrust.untrusted=ä¸ä¿¡ä»» keyTrust.marginal=åŠä¿¡åŠç–‘ keyTrust.full=ä¿¡ä»» keyTrust.ultimate=完全信任 keyTrust.group=(组) keyType.public=公钥 keyType.publicAndSec=公钥/ç§é’¥ keyMan.enableKey=å¯ç”¨å¯†é’¥ keyMan.disableKey=ç¦ç”¨å¯†é’¥ userAtt.photo=用户属性 (JPEG 图åƒ) asciiArmorFile=ASCII æ ¼å¼ä¿å­˜æ–‡ä»¶ (*.asc) importKeyFile=导入 OpenPGP 密钥文件 gnupgFile=GnuPG 文件 # createKeyOK=Your Key has been generated saveRevokeCertAs=创建并ä¿å­˜æ’¤é”€è¯ä¹¦ # revokeCertOK=The revocation certificate has been successfully created. You can use it to invalidate your public key, e.g. in case you would lose your secret key. revokeCertFailed=无法创建撤销è¯ä¹¦ã€‚ addUidOK=添加用户标识æˆåŠŸ addUidFailed=添加用户标识失败 noKeySelected=è¦æ‰§è¡Œâ€œé€‰å–â€ç±»åž‹å¯†é’¥æ“作您必须至少选å–一个密钥 exportToFile=将公有密钥导出到文件 exportKeypairToFile=导出ç§é’¥å’Œå…¬é’¥åˆ°æ–‡ä»¶ exportSecretKey=您希望在ä¿å­˜çš„ OpenPGP 密钥文件中包å«ç§é’¥ä¹ˆï¼Ÿ saveKeysOK=æˆåŠŸä¿å­˜å¯†é’¥ saveKeysFailed=ä¿å­˜å¯†é’¥å¤±è´¥ importKeysFailed=导入密钥失败 enableKeyFailed=å¯ç”¨/ç¦ç”¨å¯†é’¥å¤±è´¥ specificPubKeyFilename=%S (0x%S) 公钥 specificPubSecKeyFilename=%S (0x%S) 公钥+ç§é’¥ defaultPubKeyFilename=已导出的公钥 defaultPubSecKeyFilename=已导出的公钥/ç§é’¥ noSecretKeys=未找到ç§é’¥ã€‚\n\n您希望立å³åˆ›å»ºè‡ªå·±çš„密钥么? sendKeysOk=密钥å‘逿ˆåŠŸ sendKeysFailed=å‘é€å¯†é’¥å¤±è´¥ receiveKeysOk=密钥更新æˆåŠŸ receiveKeysFailed=下载密钥失败 importFromClip=您希望从剪贴æ¿å¯¼å…¥å¯†é’¥ä¹ˆï¼Ÿ importFromUrl=从此网å€ä¸‹è½½å…¬é’¥ï¼š copyToClipbrdFailed=无法将选中的密钥å¤åˆ¶åˆ°å‰ªè´´æ¿ã€‚ copyToClipbrdOK=密钥已被å¤åˆ¶åˆ°å‰ªè´´æ¿ deleteSecretKey=警告: 您正在试图删除ç§é’¥ï¼\n如果您删除了ç§é’¥ï¼Œæ‚¨å°†æ— æ³•解密任何为该密钥加密的邮件。\n\næ‚¨ç¡®å®žè¦æŠŠé€‰ä¸­çš„ç§é’¥å’Œå…¬é’¥â€œéƒ½â€åˆ é™¤ä¹ˆï¼Ÿ deleteMix=警告: 您正在试图删除ç§é’¥ï¼\n如果您删除了ç§é’¥ï¼Œæ‚¨å°†æ— æ³•解密任何为该密钥加密的邮件。\n\næ‚¨ç¡®å®žè¦æŠŠé€‰ä¸­çš„ç§é’¥å’Œå…¬é’¥â€œéƒ½â€åˆ é™¤ä¹ˆï¼Ÿ deletePubKey=您希望删除此公钥\n'%S'? deleteSelectedPubKey=您确实è¦åˆ é™¤æ­¤å…¬é’¥ä¹ˆï¼Ÿ deleteKeyFailed=该密钥ä¸èƒ½åˆ é™¤ã€‚ revokeKeyQuestion=您å³å°†åºŸé™¤å¯†é’¥â€œ%Sâ€ã€‚\n\n您将ä¸èƒ½å†ä½¿ç”¨æ­¤å¯†é’¥ç­¾å,并且一旦分å‘,其他人将ä¸èƒ½å†ä½¿ç”¨è¯¥å¯†é’¥æ¥åŠ å¯†ã€‚æ‚¨ä»ç„¶å¯ä»¥ä½¿ç”¨æ­¤å¯†é’¥è§£å¯†æ—§çš„邮件。\n\n您确定è¦ç»§ç»­å—? revokeKeyOk=è¯¥å¯†é’¥å·²ç»æˆåŠŸæ’¤é”€ã€‚å¦‚æžœæ‚¨æ›¾ç»å°†å¯†é’¥ä¸Šä¼ åˆ°äº†æŸä¸ªå¯†é’¥æœåŠ¡å™¨ï¼Œæ‚¨åº”è¯¥é‡æ–°ä¸Šä¼ ä¸€æ¬¡ï¼Œä»¥ä¾¿å…¶ä»–人能得到您的密钥撤销信æ¯ã€‚ revokeKeyFailed=该密钥ä¸èƒ½æ’¤é”€ã€‚ # revokeKeyNotPresent=You have no key (0x%S) which fits to this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before the revocation certificate! # revokeKeyAlreadyRevoked=The key 0x%S has already been revoked. refreshAllQuestion=您未选择任何密钥。您想更新“所有â€çš„密钥么? # refreshKeyServiceOn.warn=Warning: Your keys are currently being refreshed in the background as safely as possible.\nRefreshing all your keys at once will unnecessarily reveal information about you.\nDo you really want to do this? refreshKey.warn=警告: æ ¹æ®å¯†é’¥æ•°é‡å’Œè¿žæŽ¥é€Ÿåº¦çš„ä¸åŒï¼Œæ›´æ–°æ‰€æœ‰å¯†é’¥å¯èƒ½è€—费很长时间ï¼\n\n继续? downloadContactsKeys.warn=警告:å–决于è”系人的数é‡å’Œè¿žæŽ¥é€Ÿåº¦ï¼Œä¸‹è½½æ‰€æœ‰å¯†é’¥å¯èƒ½æ˜¯ä¸€ä¸ªç›¸å½“æ¼«é•¿çš„è¿‡ç¨‹ï¼ downloadContactsKeys.importFrom=从通讯录 '%S' 导入è”系人? keyMan.button.exportSecKey=导出ç§é’¥(&E) keyMan.button.exportPubKey=åªå¯¼å‡ºå…¬é’¥(&P) keyMan.button.import=导入(&I) keyMan.button.refreshAll=刷新所有密钥(&R) keyMan.button.revokeKey=废除密钥(&R) keyMan.button.skip=跳过密钥(&S) keylist.noOtherUids=已没有其他身份 keylist.hasOtherUids=也称为 keylist.noPhotos=没有å¯ç”¨çš„照片 keylist.hasPhotos=照片 keyMan.addphoto.filepicker.title=é€‰æ‹©è¦æ·»åŠ çš„ç…§ç‰‡ keyMan.addphoto.warnLargeFile=您已ç»é€‰æ‹©çš„æ–‡ä»¶è¶…过了 25 kB。\nä¸æŽ¨èæ·»åŠ å¾ˆå¤§çš„æ–‡ä»¶ï¼Œå› ä¸ºè¿™ä¼šå¯¼è‡´å¾—åˆ°çš„å¯†é’¥éžå¸¸å¤§ã€‚ keyMan.addphoto.noJpegFile=é€‰æ‹©çš„æ–‡ä»¶ä¸æ˜¯ JPEG 文件。请选择其他文件。 keyMan.addphoto.failed=此照片ä¸èƒ½è¢«æ·»åŠ ã€‚ # noWksIdentity=The key %S does not have a WKS identity. # keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key "%1$S (%2$S)" for encrypting messages? # keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key "%1$S (%2$S)" for future messages? # keyman.addBlacklistKey.button=&Blacklist the key # keyman.removeBlacklistKey.button=&Remove key from Blacklist # Strings in enigmailManageUidDlg.xul changePrimUidFailed=修改主用户标识失败 changePrimUidOK=æˆåŠŸä¿®æ”¹ä¸»ç”¨æˆ·æ ‡è¯† revokeUidFailed=撤销用户标识 %S 失败 revokeUidOK=æˆåŠŸæ’¤é”€ç”¨æˆ·æ ‡è¯† %S。如果您曾ç»å°†å¯†é’¥ä¸Šä¼ åˆ°äº†æŸä¸ªå¯†é’¥æœåŠ¡å™¨ï¼Œæ‚¨åº”è¯¥é‡æ–°ä¸Šä¼ ä¸€æ¬¡ï¼Œä»¥ä¾¿å…¶ä»–人能得到您的密钥撤销信æ¯ã€‚ revokeUidQuestion=æ‚¨ç¡®å®žè¦æ’¤é”€ç”¨æˆ·æ ‡è¯† %S 么? # Strings in enigmailKeyImportInfo.xul importInfoTitle=æˆåŠŸï¼å¯†é’¥å·²å¯¼å…¥ importInfoBits=ä½ importInfoCreated=创建时间 importInfoFpr=指纹 importInfoDetails=(详细信æ¯) importInfoNoKeys=没有导入密钥。 # Strings in enigmailKeyDetailsDlg.xul keyTypePublic=公钥 keyTypePrimary=主密钥 keyTypeSubkey=å­å¯†é’¥ keyTypePair=密钥对 keyExpiryNever=ä»Žä¸ keyAlgorithm_1=RSA keyAlgorithm_2=RSA keyAlgorithm_3=RSA keyAlgorithm_16=ELG keyAlgorithm_17=DSA keyAlgorithm_18=ECC keyAlgorithm_19=ECC keyAlgorithm_20=ELG keyAlgorithm_22=EDDSA keyUsageEncrypt=加密 keyUsageSign=ç­¾å keyUsageCertify=è¯æ˜Ž keyUsageAuthentication=èº«ä»½éªŒè¯ keyDoesNotExpire=密钥ä¸ä¼šè¿‡æœŸ # Strings in enigmailGenCardKey.xul keygen.started=正在生æˆå¯†é’¥ï¼Œè¯·è€å¿ƒç­‰å¾……… keygen.completed=密钥已生æˆã€‚新密钥ID为: 0x%S keygen.keyBackup=密钥已被备份为 %S keygen.passRequired=如果您希望在智能å¡å¤–部为自己的密钥创建备份,请设置一个å£ä»¤ã€‚ # Strings in enigmailSetCardPin.xul cardPin.processFailed=æ›´æ¢è¯†åˆ«ç å¤±è´¥ # Strings in enigRetrieveProgres.xul keyserverProgress.refreshing=密钥刷新中,请等待 ... keyserverProgress.uploading=密钥上传中,请等待 ... # keyserverProgress.wksUploadFailed=Could not upload your key to the Web Key Service # keyserverProgress.wksUploadCompleted=Your public key was successfully submitted to your provider. You will receive an email to confirm that you initiated the upload. keyserverTitle.refreshing=刷新密钥 keyserverTitle.uploading=上传密钥 # Strings in enigmailSetupWizard passphrase.min8keys=您的å£ä»¤è‡³å°‘è¦åŒ…å«8ä¸ªå­—ç¬¦ï¼ setupWizard.reallyCancel=你真的想退出 Enigmail 安装å‘导? setupWizard.invalidGpg=æ‚¨æŒ‡å®šçš„æ–‡ä»¶ä¸æ˜¯ä¸€ä¸ª GnuPG 程åºã€‚请指定å¦ä¸€ä¸ªæ–‡ä»¶ã€‚ setupWizard.specifyFile=æ‚¨éœ€è¦æŒ‡å®šè‡³å°‘一个公钥文件æ‰èƒ½ç»§ç»­ã€‚ setupWizard.installFailed=看起æ¥å®‰è£…未æˆåŠŸã€‚è¯·é‡è¯•安装,或者手动安装 GnuPG ç„¶åŽä½¿ç”¨â€œæµè§ˆâ€æŒ‰é’®å®šä½ã€‚ # setupWizard.downloadForbidden=For your own security, we will not download GnuPG. Please visit https://gnupg.org/ in order to download GnuPG. # setupWizard.downloadImpossible=We cannot download GnuPG currently. Please try later or visit https://gnupg.org/ in order to download GnuPG. setupWizard.hashSumError=本å‘导未能验è¯å·²ä¸‹è½½æ–‡ä»¶çš„完整性。此文件å¯èƒ½å·²æŸå或者被篡改。您è¦ç»§ç»­å®‰è£…å—? setupWizard.importSettingsFile=指定è¦è½½å…¥çš„备份文件 setupWizard.invalidSettingsFile=æŒ‡å®šæ–‡ä»¶ä¸æ˜¯æ­£ç¡®çš„ Enigmail 设置备份文件。 setupWizard.gpgConfExists=GnuPG é…置文件已ç»å­˜åœ¨ã€‚您是å¦è¦ä½¿ç”¨æ‚¨çš„æ—§å®‰è£…覆盖它。 # setupWizard.noGpgHomeDir=It appears that you configured %S to use for GnuPG. However, this is not a directory - you cannot use it. # setupWizard.unmachtedIds=The following identities of your old setup could not be matched:\n%S\nThe settings for these identities were skipped. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=å°è¯•下载 GnuPG æ—¶å‡ºé”™ã€‚è¯·æ£€æŸ¥æŽ§åˆ¶å°æ—¥å¿—获å–进一步细节。 installGnuPG.installFailed=å°è¯•安装 GnuPG æ—¶å‡ºé”™ã€‚è¯·æ£€æŸ¥æŽ§åˆ¶å°æ—¥å¿—获å–进一步细节。 # Strings in enigmailAddUidDlg.xul addUidDlg.nameOrEmailError=您必须填写一个å称和一个电å­é‚®ä»¶åœ°å€ addUidDlg.nameMinLengthError=åç§°ä¸èƒ½å°‘于5个字符 addUidDlg.invalidEmailError=您必须指定一个有效的电å­é‚®ä»¶åœ°å€ # Strings in enigmailCardDetails.js Carddetails.NoASCII=OpenPGP 智能å¡åªæ”¯æŒ ASCII 字符的å/å称。 # network error types errorType.SecurityCertificate=网络æœåŠ¡å‘ˆé€’çš„å®‰å…¨è¯ä¹¦æ— æ•ˆã€‚ errorType.SecurityProtocol=网络æœåŠ¡ä½¿ç”¨çš„å®‰å…¨å议未知。 errorType.Network=å‘生网络错误。 # filter stuff filter.folderRequired=您必须选择一个目标文件夹。 filter.decryptMove.label=永久解密 (Enigmail) filter.decryptCopy.label=创建解密的副本 (Enigmail) filter.decryptMove.warnExperimental=警告 - “永久解密â€è¿‡æ»¤å™¨å¯èƒ½å¯¼è‡´æ¶ˆæ¯è¢«æ‘§æ¯ã€‚\n\n我们强烈建议您先å°è¯•“创建解密的副本â€è¿‡æ»¤å™¨ï¼Œä»”细测试其结果,åªåœ¨å®Œå…¨ç¡®å®šè¯¥è¿‡æ»¤å™¨çš„结果是您想è¦çš„æ•ˆæžœæ—¶ä½¿ç”¨æ­¤è¿‡æ»¤å™¨ã€‚ # filter.tempPepFilterDesc=Temporary filter to store sent message unencrypted # filter.term.pgpencrypted.label=OpenPGP Encrypted # filter.encrypt.label=Encrypt to key (Enigmail) # filter.keyRequired=You must select a recipient key. # filter.keyNotFound=Could not find an encryption key for "%S". # filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for "%S" you will no longer be able to read the emails. # strings in enigmailConvert.jsm converter.decryptBody.failed=未能解密主题为“%Sâ€çš„邮件。\n您想使用å¦ä¸€ä¸ªå£ä»¤é‡è¯•å—,或者您想跳过此邮件å—? converter.decryptAtt.failed=未能解密附件“%1$Sâ€ï¼Œé‚®ä»¶ä¸»é¢˜ä¸ºâ€œ%2$Sâ€ã€‚\n您想使用å¦ä¸€ä¸ªå£ä»¤é‡è¯•å—,或者您想跳过此邮件å—? saveLogFile.title=ä¿å­˜æ—¥å¿—文件 # strings in gpg.jsm unknownSigningAlg=未知签å算法 (ID: %S) unknownHashAlg=未知加密算法 (ID: %S) # strings in keyRing.jsm keyring.photo=照片 keyRing.pubKeyRevoked=密钥 %1$S (密钥 ID %2$S) 已废除。 keyRing.pubKeyExpired=密钥 %1$S (密钥 ID %2$S) 已过期。 keyRing.pubKeyNotForSigning=密钥 %1$S (密钥 ID %2$S) 无法用作签å。 keyRing.pubKeyNotForEncryption=密钥 %1$S (密钥 ID %2$S) 无法用作加密。 keyRing.keyDisabled=密钥 %1$S (密钥 ID %2$S) å·²ç¦ç”¨ï¼Œä¸èƒ½ä½¿ç”¨å®ƒã€‚ keyRing.keyNotTrusted=密钥 %1$S (密钥 ID %2$S) ä¸è¶³å¤Ÿå¯ä¿¡ã€‚请设置您的密钥的信任级别至“终æžâ€ä»¥ä½¿ç”¨å®ƒè¿›è¡Œç­¾å。 keyRing.keyInvalid=密钥 %1$S (密钥 ID %2$S) 无效(例如,它没有自签å)。 keyRing.signSubKeysRevoked=密钥 %1$S (密钥 ID %2$S) 的所有签åå­å¯†é’¥å‡å·²åºŸé™¤ã€‚ keyRing.signSubKeysExpired=密钥 %1$S (密钥 ID %2$S) 的所有签åå­å¯†é’¥å‡å·²è¿‡æœŸã€‚ keyRing.signSubKeysUnusable=密钥 %1$S (密钥 ID %2$S) 的所有签åå­å¯†é’¥å‡å·²åºŸé™¤ã€è¿‡æœŸæˆ–者无法使用。 keyRing.encSubKeysRevoked=密钥 %1$S (密钥 ID %2$S) 的所有加密å­å¯†é’¥å‡å·²åºŸé™¤ã€‚ keyRing.encSubKeysExpired=密钥 %1$S (密钥 ID %2$S) 的所有加密å­å¯†é’¥å‡å·²è¿‡æœŸã€‚ keyRing.noSecretKey=您的钥匙链似乎没有 %1$S (密钥 ID %2$S) çš„ç§é’¥ï¼Œæ‚¨ä¸èƒ½ä½¿ç”¨è¯¥å¯†é’¥è¿›è¡Œç­¾å。 keyRing.encSubKeysUnusable=密钥 %1$S (密钥 ID %2$S) 的所有加密å­å¯†é’¥å‡å·²åºŸé™¤ã€è¿‡æœŸæˆ–者无法使用。 #strings in exportSettingsWizard.js cannotWriteToFile=无法ä¿å­˜åˆ°æ–‡ä»¶â€œ%Sâ€ã€‚请指定其他文件å。 dataExportError=å¯¼å‡ºæ‚¨çš„æ•°æ®æ—¶å‘生错误。 enigmailSettings=Enigmail设置 defaultBackupFileName=Enigmail导出结果 specifyExportFile=指定导出文件å homedirParamNotSUpported=䏿”¯æŒä½¿ç”¨é™„åŠ å‚æ•°æŒ‡å®šé…置文件路径(如--homedirå’Œ--keyring)æ¥å¯¼å‡º/æ¢å¤è®¾ç½®ã€‚请使用代替方法如设置环境å˜é‡GUNPGHOME。 #strings in expiry.jsm expiry.keyExpiresSoon=你的密钥%1$S将在%2$S内过期。\n\n推è釿–°ç”Ÿæˆå¯†é’¥å¹¶ä½¿ç”¨æ–°å¯†é’¥é…置相应的账户。 # expiry.keysExpireSoon=The following of your keys will expire in less than %1$S days:\n%2$S We recommend that you create new keys and configure your accounts to use the new keys. # expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to ultimate in key properties. # expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to ultimate in key properties. # expiry.OpenKeyManager=Open Enigmail Key Management # expiry.OpenKeyProperties=Open Key Properties #strings in pEpDecrypt.jsm # pEpDecrypt.cannotDecrypt=This is an encrypted message. Unfortunately you don't have the secret key to decrypt the message. #strings in gpgAgent.jsm # gpghomedir.notexists=The directory '%S' containing your OpenPGP keys does not exist and cannot be created. # gpghomedir.notwritable=The directory '%S' containing your OpenPGP keys is not writable. # gpghomedir.notdirectory=The directory '%S' containing your OpenPGP keys is a file instead of a directory. # gpghomedir.notusable=Please fix the directory permissions or change the location of your GnuPG "home" directory. GnuPG cannot work correctly otherwise. #strings in pepTrustWords.js # pepTrustWords.cannotVerifyOwnId=Cannot verify p≡p Trustwords for own account. # pepTrustWords.cannotFindKey=Cannot find key for %S. # pepTrustWords.cannotStoreChange=Could not change trust for %S. # pepTrustWords.generalFailure=Cannot obtain trustwords for %S. # pepTrustWords.partnerFingerprint=Fingerprint for %S: #strings in mimeWkdHandler.jsm # wkdMessage.body.req=Your email provider processed your request to upload your public key to the OpenPGP Web Key Directory.\n\nPlease click the confirmation button in the Enigmail header to complete the publishing of your public key. # wkdMessage.body.process=This is an email related to the automatic processing to upload your public key to the OpenPGP Web Key Directory.\n\nYou do not need to take any manual action at this point. #strings in pepHandshake.js # pepPrivacyStatus.RatingBrokenSuggestion=Either you or the sender should resend the message. # pepPrivacyStatus.RatingHaveNoKeySuggestionOutgoing=If you composed this message, your key is not available. # pepPrivacyStatus.RatingMistrustSuggestion=Re-establish the connection with your communication partner and try to complete another handshake. # pepPrivacyStatus.RatingReliableSuggestion=Complete a handshake with your communication partner by exchanging trustwords in person or over the phone. A handshake is needed only once per partner and will ensure secure and trusted communication. # pepPrivacyStatus.RatingTrustedSuggestion=No action needed! # pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware this message may not be secure. # pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Please add the necessary information. # pepPrivacyStatus.RatingUnderAttackSuggestion=Separately verify the content of this message with your communication partner. # pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least secure. # pepPrivacyStatus.RatingUnencryptedSuggestion=Please ask your communication partner to use an encryption solution or install p≡p. # pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or no signature. Ask your communication partner to upgrade their encryption solution or install p≡p. # pepPrivacyStatus.RatingBrokenExplanation=This message has broken encryption or formatting. # pepPrivacyStatus.RatingHaveNoKeyExplanation=This message cannot be decrypted because the key is not available. # pepPrivacyStatus.RatingMistrustExplanation=This message has a communication partner that has previously been marked as mistrusted. # pepPrivacyStatus.RatingReliableExplanation=This message is secure but you still need to verify the identity of your communication partner. # pepPrivacyStatus.RatingTrustedExplanation=This message is secure and trusted. # pepPrivacyStatus.RatingUndefinedExplanation=This message does not contain enough information to determine if it is secure. # pepPrivacyStatus.RatingUnderAttackExplanation=This message is not secure and has been tampered with. # pepPrivacyStatus.RatingUnencryptedExplanation=This message is unsecure. # pepPrivacyStatus.RatingUnencryptedForSomeExplanation=This message is unsecure for some communication partners. # pepPrivacyStatus.RatingUnreliableExplanation=This message has unreliable protection. # pepPrivacyStatus.RatingBrokenText=Broken # pepPrivacyStatus.RatingHaveNoKeyText=Cannot Decrypt # pepPrivacyStatus.RatingMistrustText=Mistrusted # pepPrivacyStatus.RatingReliableText=Secure # pepPrivacyStatus.RatingTrustedText=Secure & Trusted # pepPrivacyStatus.RatingUndefinedText=Unknown # pepPrivacyStatus.RatingUnderAttackText=Under Attack # pepPrivacyStatus.RatingUnencryptedForSomeText=Unsecure for Some # pepPrivacyStatus.RatingUnencryptedText=Unsecure # pepPrivacyStatus.RatingUnreliableText=Unreliable Security # handshakeDlg.button.initHandshake=Handshake... # handshakeDlg.button.stopTrust=Stop Trusting # handshakeDlg.button.reTrust=Stop Mistrusting # handshakeDlg.label.outgoingMessage=Outgoing message # handshakeDlg.label.incomingMessage=Incoming message # handshakeDlg.error.noPeers=Cannot handshake without any correspondents. # handshakeDlg.error.noProtection=Please enable protection in order to use the Handshake function. # enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device # enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup #strings in autocrypt.jsm # autocrypt.setupMsg.subject=Autocrypt Setup Message # autocrypt.setupMsg.msgBody=To set up your new device for Autocrypt, please follow the instuctions that should be presented by your new device. # autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code presented on your old device, and then import the contained key into your keyring. #strings in upgradeInfo.html # upgradeInfo.doctitle=What's New in Enigmail v2.0? # upgradeInfo.welcome1=Welcome to the new Enigmail version 2.0! # upgradeInfo.welcome2=The release contains a lot of new and changed features. Please take a minute to find out what's new: # upgradeInfo.encSubject.title=Encrypting the Message Subject # upgradeInfo.encSubject.desc=We developed a new method that moves the email subject into the encrypted message, and replaces the visible subject with "Encrypted Message". Once such a message is decrypted, the original subject is replaced automatically. Hiding the subject is on by default; there is a preference to turn it off if you don't like it. (Note: this feature requires the message to be sent with PGP/MIME.) # upgradeInfo.buttons.title=Changed behavior of Encrypt and Sign Buttons # upgradeInfo.buttons.desc=The Encrypt and Sign buttons in the message composer window now work for both the OpenPGP and S/MIME protocols. If both algorithms are possible, then Enigmail will try to prefer the one for which all keys are available. # upgradeInfo.autocrypt.title=Support for Autocrypt # upgradeInfo.autocrypt.desc=Enigmail now supports Autocrypt, a new standard to distribute keys as part of sent messages. Enigmail automatically imports keys from Autocrypt-compliant messages, such that over time more and more emails can be encrypted. # upgradeInfo.pEp.title=New p≡p Junior Mode (Pretty Easy Privacy) # upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. You currently need to manually install p≡p for this purpose; this will change in a future release. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. # upgradeInfo.bottom.desc=Please visit our documentation for help on using Enigmail. # pep.missingGnuPG=In order to use Enigmail/p≡p, GnuPG is required. As we could not find it, we suggest to download and install it for you. #strings in enigmailAbout.html # aboutEnigmail.tabName=About Enigmail # aboutEnigmail.title=OpenPGP support provided by Enigmail # aboutEnigmail.team=Enigmail is developed by the Enigmail Team: # aboutEnigmail.projectLeader=Lead Developer: # aboutEnigmail.usability=Usability: # aboutEnigmail.documentation=Documentation: # aboutEnigmail.testing=Testing: # aboutEnigmail.userSupport=User Support: # aboutEnigmail.localization=Localization: See the Enigmail Language Packs page # aboutEnigmail.Credits=Credits: # aboutEnigmail.origAuthor=Original author of the Enigmail extension # aboutEnigmail.icons=Icons: # aboutEnigmail.formerMembers=Former team members: # aboutEnigmail.projectHosting=Project hosting: # aboutEnigmail.licenseSupportTitle=License & Support # aboutEnigmail.license=Enigmail OpenPGP is open source and licensed under the %S # aboutEnigmail.support=Support and download is available from www.enigmail.net. enigmail-2.0.8/lang/zh-CN/enigmail.properties.big5000066400000000000000000000146541334302754500217160ustar00rootroot00000000000000Enigmail=Enigmail # Strings used within enigmailCommon.js enigAlert=Enigmail ֪ͨ enigConfirm=Enigmail È·ÈÏ enigError=Enigmail ´íÎó enigPrompt=Enigmail Ìáʾ dlgYes=È·¶¨ dlgNo=·ñ dlgNever=Ï´β»ÐëÔÙÎÊÎÒ specifyEmail=ÇëÖ¸¶¨ÄúµÄÖ÷ÒªÓÊÖ·ÒÔÓÃì¶Ç©Ö¤¼Ä³öÓʼþʱʹÓá£\n Èç¹ûÄúÒªÓ᰼ijö¡±µÄÓÊÖ·×÷Ϊǩ֤Çë°Ñ´ËÀ¸Öÿա£\n\n×¢Ò⣺Enigmail 0.60 ÒÔÉÏÒÑ°Ñ default signing key Õ⺬ºýµÄÑ¡ÏîÈ¥³ý. usingFrom=¡°¼Ä³ö¡±ÓÊÖ·½«»áÓÃì¶Ç©Ö¤¼Ä³öµÄÓʼþ usingId=ʹÓÃÕß %S ½«»áÓÃì¶Ç©Ö¤¼Ä³öµÄÓʼþ configNow=ÄúҪΪ enigmail %S ½øÐÐÉ趨Â𣿠configEnigmail=É趨 Enigmail£¿ turnOffFlowed=Mozilla ÖÐµÄ Allow flowed text (RFC 2646) ÊÇÔ¤ÖÃÑ¡Ïî¡£\nµ«È´»áÔÚ½øÐÐÉú´¿ÎÄ×ÖµÄÓʼþ½øÐÐÇ©ÃûÈÏ֤ʱ·¢ÉúÎÊÌâ¡£\nËùÒÔÎÒÃǽ¨Òé°Ñ´Ë׫Ïî¹ØÉÏ¡£\n\nÄúÒª Enigmail ΪÄúÖ´Ðйرա¡Allow flowed text (RFC 2646) Õâ¸öÑ¡ÏîÂð? repeatPrefix=\n\n´ËÌáʾ½«»áÔÙ³öÏÖ%S repeatSuffixSingular=´Î¡£ repeatSuffixPlural=´Î¡£ noRepeat=\n\n´ËÌáʾ½«²»»áÔÙ³öÏÖÖµ½ÄãÏ´θüРEnigmail¡£ noLogDir=ÇëΪ½ø½×Æ«ºÃÉ趨ÖеÄÈÕ־·¾¶½øÐÐÉ趨ÒÔ±ãÐÂÔöÈÕÖ¾µµ noLogFile=ÈÕÖ¾µµ°¸²»´æÔÚ£¡ restartForLog=ÇëÖØÐÂÆô¶¯ Mozilla ÒÔ±ãÐÂÔöÈÕÖ¾µµ # Strings in enigmailAbout.js usingVersion=Enigmail %S ÔÚÖ´ÐÐÖÐ versionWarning=¾¯¸æ£ºEnigMime °æ±¾ %S ²»Ð­µ÷ enigmimeWarning=¾¯¸æ£º EnigMime Ä£×é²»´æÔÚ usingAgent=ʹÓà %S Ö´Ðеµ %S ÒÔ¼ÓÃÜ»ò½âÃÜ agentError=´íÎ󣺲»ÄÜ´æÈ¡ enigmail ʧ°Ü£¡ # Strings in enigmailKeygen.js accessError=´æÈ¡ enigmail ʧ°Ü onlyGPG=²úÉúеÄÔ¿³×Ö»ÄÜÔÚGPGÖÐʹÓã¨PGP ½«²»ÄÜʹÓã©£¡ genComplete=²úÉúеÄÔ¿³×Íê³É£¡\nʹÓÃÕßÔ¿³× <%S> ½«»áÔÚδÀ´ÓÃì¶¼ÓÃÜ»òǩ֤ genCompleteNoSign=²úÉúеÄÔ¿³×Íê³É£¡ genGoing=²úÉúеÄÔ¿³×ÕýÔÚ½øÐÐÖУ¡ passNoMatch=ÊäÈëµÄÃÜÂë²»Ïàͬ£¬ÇëÖØÊäÈë passCheckBox=²»ÓÃÃÜÂëÇëÑ¡Ôñ´ËÏî passUserName=´ËÈÏÖ¤µÄʹÓÃÕßÃû³ÆÎª keyConfirm=ҪΪ'%S'²úÉúµÄ¹«¿ªºÍÒþÃܵÄÔ¿³×Â𣿠keyAbort=ÖÐÖ¹Ô¿³×²úÉúÂ𣿠# Strings in enigmailMessengerOverlay.js securityInfo=OpenPGP °²È«×ÊѶ\n\n enigHeader=Enigmail: enigNote=Note from Enigmail: Attachments to this message have not been signed or encrypted. enigContentNote=Enigmail: *Attachments to this message have not been signed or encrypted*\r\n\r\n # Make Comment due to this translation will not display right. # enigNote=Enigmail:´ËÓʼþÖеĸ½¼þ²¢Ã»Óо­¹ý¼ÓÃÜ»òǩ֤¡£ # enigContentNote=Enigmail: *´ËÓʼþÖеĸ½¼þ²¢Ã»Óо­¹ý¼ÓÃÜ»òǩ֤*\r\n\r\n noDecrypted=ûÓпɽâÂëµÄÐÅÏ¢¿ÉÒÔ´¢´æ£¡\nÇëÔÚµµ°¸Ä¿Â¼Ñ¡Óô¢´æ noMessage=ûÓÐÐÅÏ¢¿ÉÒÔ´¢´æ£¡ useButton=ÇëÔÚĿ¼ÖÐÑ¡Ôñ½âÂëÓëÇ©ÃûÈÏÖ¤ÒÔ½âÂë saveHeader=Enigmail£º´¢´æ½âÂëááµÄÐÅÏ¢ # Strings in enigmailMsgComposeOverlay.js keysToExport=»ã³öʹÓÃÕߵĹ«¿ªÔ¿³×µÄÓÊÖ· exportPrompt=Enigmail Ô¿³×»ã³ö pubKey=%SʹÓÃÕß¹«¿ªÔ¿³×\n windowLocked=±àдÓʼþÒѱ»Ïú¶¨£¬¼Ä³ö±»È¡Ïû sendUnencrypted=EnigmailÆô¶¯Ê§³£¡£\n¼Ä³öδ¼ÓÃܵÄÓʼþÂ𣿠composeSpecifyEmail=ÇëÖ¸¶¨ÄúµÄÖ÷ÒªÓÊÖ·ÒÔÓÃì¶Ç©Ö¤¼Ä³öÓʼþʱʹÓá£\n Èç¹ûÄúÒªÓ᰼ijö¡±µÄÓÊÖ·×÷Ϊǩ֤Çë°Ñ´ËÀ¸Öÿա£ sendingBCC=´ËÓʼþÓÐÒþÃÜÊÕÐÅÕßBCC¡£Èç¹û¼ÓÃÜ´ËÓʼþËùÓеÄÊÕÐÅÕß¶¼¿ÉÒÔͨ¹ý¼ì²ì¼ÓÃÜÔ¿³×Ãûµ¥µÃ֪˭ÊÇÒþÃÜÊÕÐÅÕßÖÂʹÒþÃܱ£°²Ê§Ð§¡£\n\n°´È·¶¨ÒԼ̼¨¼ÓÃÜ»òÈ¡ÏûÖÐÖ¹¼Ä³ö¡£ sendingNews=¼ÓÃܼijöÖÐÖ¹.\n\nÓÉì¶ÓÐÐÂÎÅ×éµÄ´æÔÚ´ËÓʼþ²»ÄܼÓÃÜ¡£ÇëÓò»¼ÓÃܵķ½·¨ÖØÐ¼ijö¡£ sendingPGPMIME=ÓʼþÖеĸ½¼þÒ²»áÒ»ÆðµÄ±»¼ÓÃÜ»òǩ֤£¬Ö»ÓÐÄÜÖ§Ô®PGP/MIME¸ñʽµÄµçÓʳÌʽ¿ÉÒÔ¶ÁÈ¡´ËÀàÓʼþ¡£ÒÑÖªµÄÖ§Ô®µçÓʳÌʽÓÐ Enigmail, Evolution, and Mutt¡£\n °´È·¶¨ÒԼ̼¨Ê¹ÓÃPGP/MIME¸ñʽ»òÈ¡ÏûʹÓÃǶÈë¸ñʽ¼Ä³ö¡£ noPGPMIME=PGP/MIME²»´æÔÚ£¡\n ÓÃǶÈë¸ñʽ¼ÓÃÜ»òǩ֤£¿ hasHTML=HTML Óʼþ¾¯¸æ£º\n´ËÓʼþ´øÓÐHTML¸ñʽÕâ¿ÉÄÜ»áʹµ½¼ÓÃÜ»òǩ֤ʧ°Ü¡£ÎªÁ˱ÜÃâ´ËÀàÎÊÌâµÄ·¢ÉúÄú¿ÉÒÔÔڼijö»ò»Ø¸²Óʼþʱ°´ÏÂSHIFT¼üÒԼijöǩ֤µÄÓʼþ¡£\nÈç¹ûÄúÊÇÔ¤ÖüÓÃÜ»òǩ֤¼Ä³öÓʼþÄúÓ¦¸ÃÔÚÈ¡ÏûÑ¡Ôñ±àдHTML¸ñʽÓʼþÑ¡ÏîÒÔÈ¡ÏûHTML¸ñʽµÄÓʼþ¡£ strippingHTML="ÓʼþÖк¬ÓеĸñʽHTML½«»áÔÚת»»³É´¿ÎÄ×Ö¸ñʽ¼ÓÃÜ»òǩ֤ʱʧЧ¡£ÄúÒª¼Ì¼¨Â𣿠sendAborted=¼Ä³öÖÐÖ¹¡£\n\n statPGPMIME=PGP/MIME statSigned=ÒÑǩ֤ statEncrypted=ÒѼÓÃÜ statPlain=´¿ÎÄ×Ö offlineSave=´¢´æ %S Óʼþ %S µ½Î´¼Ä³öµÄÓʼþÂ𣿠onlineSend=¼Ä³ö %S Óʼþµ½ %SÂ𣿠offlineNote=ÄãÏÖÔÚÕýʹÓÃÀëÏßģʽ¡£Òª´¢´æ´ËÓʼþµ½Î´¼Ä³öµÄÓʼþÂ𣿠signFailed=Enigmail·¢Éú´íÎ󣬼ÓÃÜ»òǩ֤ʧ°ÜÒª¼Ä³öδ¼ÓÃܵÄÓʼþÂ𣿠# Strings in enigmailMsgHdrViewOverlay.js keyNeeded=ÐèÒª¹«¿ªÔ¿³×±àºÅ %S ÒÔ×÷Ç©ÃûÈÏÖ¤ clickDecrypt=£»°´Ï¡¸½âÃÜ¡¹¼ü clickDecryptRetry=£»°´Ï¡¸½âÃÜ¡¹¼üÖØÊÔ clickPen=£»°´Ï±Êͼ£¿ clickPenDetails=£»°´Ï¶ϱÊͼȡµÃÏêϸµÄ×ÊÁÏ£¿ clickQueryPenDetails=£»°´Ï±ÊͼȡµÃÏêϸµÄ×ÊÁÏ£¿ clickKey=£»°´Ï¶ÏÔ¿³×ͼ£¿ clickKeyDetails=£»°´Ï¶ÏÔ¿³×ͼȡµÃÏêϸµÄ×ÊÁÏ£¿ reloadImapMessage=ÖØÐÂÔØÈëÍêÕûµÄIMAPÓʼþÒÔ½øÐнâÂëÓëÇ©ÃûÈÏÖ¤£¿ reloadImapError=´íÎó£­IMAPÓʼþ¹ý´óÎÞ·¨½øÐнâÂëÓëÇ©ÃûÈÏÖ¤ unverifiedSig=δÈÏÖ¤µÄÇ©Ãû incompleteDecrypt=½âÃܲ»ÍêÕû failedSig=´íÎó£­Ç©ÃûÈÏ֤ʧ°Ü needKey=´íÎó£­ÐèÒªÒþÃܵÄÔ¿³×ÒÔ½øÐÐÓʼþ½âÂë failedDecrypt=´íÎó£­½âÂëʧ°Ü badPhrase=´íÎó£­ÃÜÂë´íÎó failedDecryptVerify=´íÎó£­½âÂëÓëÇ©ÃûÈÏ֤ʧ°Ü viewInfo=; View > Message security info for details decryptedMsg=ÒѽâÂë Óʼþ # Strings in enigmailNavigatorOverlay.js navEncryptError=¼ÓÃÜ»òǩ֤ʱʧ°Ü¡£\n navDecryptError=½âÂëʱʧ°Ü¡£\n # Strings in pref-enigmail-adv.js testNoSvc=EnigTest£ºEnigmail ´æÈ¡Ê§°Ü testNoEmail=EnigTest£ºÇëÊäÈëÓÊÖ·ÒÔ±ã²âÊÔ # Strings in pref-enigmail.js uninstallConfirm=ÄúÕæµÄҪɾ³ýËùÓÐÔÚMozilla component ºÍ chrome Ŀ¼ÄÚÓë EnigMail Óйصĵµ°¸Â𣿠uninstallFailOverlay=ÓÉ춸²¸ÇµÄRDFÒÆ³ý EnigMail ʧ°Ü£»²»É¾³ý chrome jar µµ°¸ uninstallFailDelete=ɾ³ýµµ°¸Ê±·¢ÉúÎÊÌâ uninstallFail=ÒÆ³ý EnigMail ʧ°Ü uninstallSuccess=EnigMail Òѱ»ÒƳý # Strings used in components/enigmail.js # (said file also re-uses some strings given above) enterPass=ÇëÊäÈëÄú %S µÄÃÜÂë rememberPass=¼ÇÒä %S ·ÖÖÓ notInit=´íÎó£­Enigmail »¹Î´³õʼ»¯ badCommand=´íÎó£­¼Ó½âÖ¸Áîʧ°Ü cmdLine=Ö¸ÁîģʽºÍÊä³ö£º notRequired=´íÎó£­²»Ðë¼ÓÃÜ notComplete=´íÎó£­²úÉúÔ¿³×δÍê³É invalidEmail=´íÎó£­²»ÕýÈ·µÄÓÊÖ· noPassphrase=´íÎó£­ÎÞÃÜÂëÌṩ noPGPblock=´íÎó£­Ã»ÓÐÎÄ×ÖʽµÄ PGP ×ÊÁÏ decryptToImport=°´Ï½âÂëÒÔ»ãÈëÓʼþÄڵĹ«¿ªÔ¿³× extraText=¸½¼ÓÎÄ×ÖÖк¬Óиü¶àµÄ PGP ×ÊÁÏ¡£°´Ï½âÃܼü toVerify=ÒÔÇ©ÃûÈÏÖ¤¡£ sigMismatch=´íÎó£­Ç©ÃûÈÏ֤ʧÅä cantImport=»ãÈ빫¿ªÔ¿³×ʧ°Ü\n\n prefUntrusted=²»±»ÐÅÈ뵀 prefRevoked=ÒѷϳýµÄ prefExpiredKey=ÓâÆÚµÄÔ¿³× prefExpired=ÓâÆÚµÄ prefGood=³É¹¦ÈÏÖ¤%SµÄÇ©Ãû prefBad=ʧ°ÜÈÏÖ¤%SµÄÇ©Ãû failFingerprint=´íÎó£­²ÉÖ¸ÎÆÖ¸Áîʧ°Ü failMultiple=´íÎó£­%SÓжà¸ö¹«¿ªÔ¿³× failNoKey=´íÎó£­ÕÒ²»µ½µÄ%S¹«¿ªÔ¿³× failOnlyGPG=´íÎó£­Ö»ÓÐGPGÔ¿³×¿ÉÒÔ´ÓÔ¿³×ËÅ·þÆ÷ÖÐÈ¡µÃ failCancel=´íÎó£­´ÓÔ¿³×ËÅ·þÆ÷ÖÐÈ¡µÃÔ¿³×±»Ê¹ÓÃÕßÈ¡Ïû failNoServer=´íÎó£­Ã»ÓÐÖ¸¶¨µÄÔ¿³×ËÅ·þÆ÷ÒÔÈ¡µÃÔ¿³× failNoID=´íÎó£­Ã»ÓÐÖ¸¶¨µÄÔ¿³×±àºÅ failKeyExtract=´íÎó£­Ô¿³×È¡µÃÖ¸Áîʧ°Ü notFirstBlock=´íÎó£­µÚÒ» PGP×ÊÁϷǹ«¿ªÔ¿³××ÊÁÏ importKeyConfirm=ÔÚµÄǶÈëµÄÓʼþÖлãÈ빫¿ªÔ¿³× importKey=´Ó»ãÈëÔ¿³×ËÅ·þÆ÷¹«¿ªÔ¿³×±àºÅ%S enigmail-2.0.8/lang/zh-CN/help/000077500000000000000000000000001334302754500161045ustar00rootroot00000000000000enigmail-2.0.8/lang/zh-CN/help/compose.html000066400000000000000000000070131334302754500204400ustar00rootroot00000000000000 Enigmail 帮助: 撰写邮件

Enigmail 帮助

在撰写邮件时使用 Enigmail

  • 邮件/撰写窗å£ä¸­çš„ Enigmail èœå•
    • æ•°å­—ç­¾å邮件: å¯ç”¨/ç¦ç”¨å‘逿•°å­—ç­¾å邮件。数字签å失败时用户将收到æç¤ºã€‚
    • 加密邮件: 在邮件å‘出之å‰å¯ç”¨/ç¦ç”¨é’ˆå¯¹æ‰€æœ‰æ”¶ä»¶äººçš„邮件加密。加密失败时用户将收到æç¤ºã€‚

      如果您在 选项 -> 密钥选择 标签中设置了 在需è¦çš„æ—¶å€™æç¤ºé€‰å–密钥 , 当无法找到您的邮件收件人中æŸä¸ªæ”¶ä»¶äººåœ°å€å¯¹åº”的公用密钥时将会弹出一个密钥列表。

      如果您在 选项 -> 密钥选择 标签中设置了 ä¸è¦æç¤ºé€‰å–密钥 , 当无法找到您的邮件收件人中æŸä¸ªæ”¶ä»¶äººåœ°å€å¯¹åº”的公用密钥时, å°†ä¸åР坆å‘é€é‚®ä»¶ã€‚

    • 在本邮件中使用 PGP/MIME: å¯ç”¨/ç¦æ­¢åœ¨å½“å‰é‚®ä»¶ä¸­ä½¿ç”¨ PGP/MIME。

      å¦‚æžœæ‚¨ç¡®è®¤æ‚¨çš„æ”¶ä»¶äººèƒ½å¤Ÿå¤„ç† PGP/MIME æ ¼å¼çš„邮件, 您应该使用它。

      è¦ä½¿ç”¨æœ¬åŠŸèƒ½, 您必须设置 选项 -> PGP/MIME 标签中的 å…许使用 PGP/MIME 或 总是使用 PGP/MIME。

    • 默认撰写选项: å­èœå•。
      • æ•°å­—ç­¾å/加密选项...: 访问 叿ˆ·è®¾ç½® -> OpenPGP é€‰é¡¹çš„å¿«æ·æ–¹å¼
      • å‘é€é€‰é¡¹...: 访问 选项 -> å‘é€ æ ‡ç­¾çš„å¿«æ·æ–¹å¼ã€‚
      • 密钥选择选项...: 访问 选项 -> 密钥选择 æ ‡ç­¾çš„å¿«æ·æ–¹å¼ã€‚
      • PGP/MIME 选项...: 访问 选项 -> PGP/MIME æ ‡ç­¾çš„å¿«æ·æ–¹å¼ã€‚
    • å–æ¶ˆåР坆: Enigmail ä¸ä¼šæŽ¢æµ‹åˆ°å‘é€é‚®ä»¶è¿‡ç¨‹ä¸­çš„错误,例如 POP 未接å—请求,当因出现此类情况导致å‘é€é‚®ä»¶å¤±è´¥æ—¶ï¼Œæ¯«æ— æ„义的已加密信件将会显示在邮件撰写窗å£ä¸­ã€‚通过选择此èœå•您å¯ä»¥å–消加密/æ•°å­—ç­¾åï¼Œå°†é‚®ä»¶æ’°å†™çª—å£æ¢å¤æˆåŽŸå§‹æ–‡æœ¬ã€‚
      作为一个临时的解决方案,该选项也å¯ç”¨äºŽåœ¨å›žå¤æŸåŠ å¯†é‚®ä»¶æ—¶è§£å¯†è¢«å¼•ç”¨çš„æ–‡æœ¬ã€‚Enigmail 应该å¯ä»¥è‡ªåŠ¨è§£å¯†è¢«å¼•ç”¨çš„é‚®ä»¶ï¼Œä½†æ˜¯å¦‚æžœå®ƒæ²¡èƒ½è‡ªåŠ¨è§£å¯†ï¼Œæ‚¨å¯ä»¥ä½¿ç”¨æ­¤èœå•强制其执行解密动作。
    • æ’入公用密钥: 在邮件撰写窗å£çš„当å‰å…‰æ ‡ä½ç½®æ’å…¥ ASCII-armored æ ¼å¼çš„公用密钥段。它还将æç¤ºæ‚¨è¾“å…¥è¦æ’入的密钥对应的邮件地å€ã€‚ä»¥è¿™ç§æ–¹å¼æ’入的密钥å¯ä»¥è¢«æŽ¥å—方的 Enigmail 自动识别。æ’入密钥之åŽï¼Œæ‚¨ä»å¯ä»¥æ ¹æ®éœ€è¦é€‰æ‹©å¯¹é‚®ä»¶è¿›è¡Œæ•°å­—ç­¾å/加密。除此之外,请ä¸è¦åœ¨é‚®ä»¶ä¸­æ’入多个密钥段; è¿™ç§æƒ…况下åªè¦åœ¨æŽ¥æ”¶åˆ°æç¤ºçš„æ—¶å€™æŒ‡å®šå¤šä¸ªç”¨é€—å·æˆ–者空格分隔的邮件地å€å³å¯ã€‚
    • 清除缓存的å£ä»¤: 清除缓存的å£ä»¤ã€‚å¦‚æžœæ‚¨åŒæ—¶ä½¿ç”¨å¤šä¸ªå£ä»¤è¿™ä¸ªåŠŸèƒ½å°†ä¼šå¾ˆæœ‰ç”¨ã€‚
    • 帮助: 从网站获å–å¸®åŠ©ä¿¡æ¯ (本页)。

您å¯ä»¥ä»Ž Enigmail 帮助网页获得更多的帮助

enigmail-2.0.8/lang/zh-CN/help/editRcptRule.html000066400000000000000000000121261334302754500214020ustar00rootroot00000000000000 Enigmail 帮助: 编辑 OpenPGP 规则

Enigmail 帮助

使用 Enigmail 规则编辑器: 编辑 OpenPGP 规则

在规则编辑器中,您å¯ä»¥ä¸ºæ¯ä¸ªæ”¶ä»¶äººå•独指定 加密,数字签åå’Œ PGP/MIME,并定义è¦ä½¿ç”¨çš„ OpenPGP 密钥。通过这个 å¯¹è¯æ¡†ï¼Œæ‚¨å¯ä»¥ä¸ºå•个收件人定义规则,也å¯ä»¥ä¸ºå…·æœ‰ç›¸ä¼¼å±žæ€§çš„一组 收件人定义规则。

  • 为如下收件人设置 OpenPGP 规则: åŒ…å«æ”¶ä»¶äººçš„电å­é‚®ä»¶åœ°å€ (ä¸åŒ…å«å§“å,例如: 类似 somebody@email.domain 的电å­é‚®ä»¶åœ°å€)。您å¯ä»¥ä½¿ç”¨ç©ºæ ¼åˆ†éš”多个ä¸åŒçš„电å­é‚®ä»¶åœ°å€ã€‚ 电å­é‚®ä»¶åœ°å€ä»…包å«åŸŸå部分则å¯ä»¥åŒ¹é…å‘往该域的任何邮件, 例如: @email.domain å°†åŒ¹é… body@email.domain〠somebody@email.domainã€anybody@email.domain 等等。
  • å¦‚æžœæ”¶ä»¶äººåœ°å€ ...: 此项修改邮件地å€çš„匹é…规则。 如果输入了多个地å€ï¼Œè¯¥è®¾ç½®å°†åº”用于所有地å€ã€‚ 下é¢çš„示例å‡å®šåœ¨ä¸Šé¢çš„ OpenPGP 规则 æ ä¸­è¾“入了 body@email.domain。
    • 与上述æŸé‚®ä»¶åœ°å€å®Œå…¨ç›¸åŒ: ä½¿ç”¨æ­¤è®¾ç½®ï¼Œåªæœ‰é‚®ä»¶åœ°å€ä¸Ž body@email.domain å®Œå…¨ç›¸åŒæ‰ä¼šè§¦å‘规则(完全相åŒï¼Œå¤§å°å†™æ•感匹é…)。
    • 包å«ä¸Šè¿°é‚®ä»¶åœ°å€ä¸­çš„字符: 使用此设置,任何包å«ä¸Šè¿°å­—符的邮件地å€éƒ½å°†è¢« 匹é…到, 例如: anybody@email.domain 或 body@email.domain.net
    • 以上述æŸé‚®ä»¶åœ°å€å¼€å¤´: 使用此设置,任何以上述字符开头的邮件地å€éƒ½å°†è¢« 匹é…到,例如: body@email.domain.net〠body@email.domain-name.com。
    • 以上述æŸé‚®ä»¶åœ°å€ç»“å°¾: 使用此设置,任何以上述字符结尾的邮件地å€éƒ½å°†è¢« 匹é…到,例如: anybody@email.domain〠somebody@email.domain。
  • 如果邮件地å€ç¬¦åˆæ¡ä»¶åˆ™æµ‹è¯•下一æ¡è§„则
    通过å¯ç”¨æ­¤åŠŸèƒ½ï¼Œæ‚¨å°†å¯ä»¥ä¸å¿…为æŸä¸ªé‚®ä»¶åœ°å€åœ¨ 使用下列 OpenPGP 密钥进行加密或数字签å: æ ä¸­æŒ‡å®š 密钥,直到å‘é€çš„æ—¶å€™å†ä¸ºå‘往该地å€çš„邮件选择一个è¦ä½¿ç”¨çš„密钥。 此外,匹é…这些邮件地å€çš„åŽç»­è§„则还会相继处ç†ã€‚
  • 如果邮件地å€ç¬¦åˆæ¡ä»¶åˆ™ä¸å†æµ‹è¯•åŽç»­è§„则
    å¯ç”¨æ­¤åŠŸèƒ½å°†ä¼šåœæ­¢å¤„ç†ä»»ä½•匹é…这些邮件地å€çš„åŽç»­è§„则; 例如: 如果邮件地å€ç¬¦åˆ æ¡ä»¶åˆ™æµ‹è¯•下一æ¡è§„则。
  • 使用下列 OpenPGP 密钥进行加密或数字签å:
    通过 选择密钥(S)... 按钮选择加密用的收件人密钥。 与上é¢çš„动作相åŒï¼Œæ­¤é¡¹è§„则匹é…åŽå°†ä¸å†å¤„ç†èƒ½å¤ŸåŒ¹é…çš„åŽç»­è§„则。
  • æ•°å­—ç­¾å: å¯ç”¨æˆ–ç¦ç”¨ 电å­é‚®ä»¶æ•°å­—ç­¾å。此选项将使用或者å–代您在邮件撰写窗å£é€‰æ‹©çš„设置。 其值为:
    • 从ä¸: ç¦ç”¨æ•°å­—ç­¾å,å³ä¾¿å·²ç»åœ¨é‚®ä»¶æ’°å†™çª—å£åšå‡ºé€‰æ‹© (å–代其他值)
    • 在撰写邮件时选择: 使用在邮件撰写窗å£ä¸­é€‰æ‹©çš„设置
    • 总是: å¯ç”¨æ•°å­—ç­¾å,å³ä¾¿æ‚¨åœ¨é‚®ä»¶æ’°å†™çª—å£ å¹¶æœª å¯ç”¨æ•°å­—ç­¾å
这些数字签å设置将应用于所有匹é…的规则。如果有任æ„ä¸€æ¡ è§„åˆ™ç¦ç”¨äº†æ•°å­—ç­¾å,ä¸ç®¡å…¶ä»–è§„åˆ™æ˜¯å¦æŒ‡å®šäº†æ€»æ˜¯è¿›è¡Œæ•°å­—ç­¾å,该邮件都ä¸ä¼šè¢«æ•°å­—ç­¾å.
  • 加密: å¯ç”¨æˆ–ç¦ç”¨ 邮件加密。å¯é€‰çš„设置åŠå…¶å«ä¹‰åŒæ•°å­—ç­¾å.
  • PGP/MIME: å¯ç”¨æˆ–ç¦ç”¨ PGP/MIME (RFC 3156) 邮件编ç ã€‚ 如果ç¦ç”¨äº† PGP/MIME,信件将使用 "åµŒå…¥å¼ PGP" ç¼–ç ã€‚å¯é€‰çš„设置åŠå…¶å«ä¹‰åŒæ•°å­—ç­¾å。

所有的规则将会按照 OpenPGP 规则编辑器 列表中的顺åºé€ä¸ªå¤„ç†ã€‚å½“ä»»ä¸€åŒ…å« OpenPGP 密钥标识的规则æˆåŠŸåŒ¹é…一个收件人,我们除了为这个收件人使用规则中包å«çš„密钥之外,还将在åŽç»­çš„规则 测试中忽略该收件人。


您å¯ä»¥ä»Ž Enigmail æ¯æ”¶ä»¶äººè®¾ç½®å¸®åЩ页 获得更多帮助

enigmail-2.0.8/lang/zh-CN/help/initError.html000066400000000000000000000045421334302754500207540ustar00rootroot00000000000000 Enigmail Help: How to Resolve Problems with Initializing OpenPGP

Enigmail Help

How to Resolve Problems with Initializing OpenPGP

There are several reasons why initializing OpenPGP does not succeed. The most common ones are described below; for more information please visit the Enigmail Support page.

GnuPG could not be found

In order for OpenPGP to work, the tool GnuPG needs to be installed. If GnuPG cannot be found, then first make sure that the executable gpg.exe (on Windows; gpg on other platforms) is installed on your computer. If GnuPG is installed, and OpenPGP cannot find it, then you need to manually set the path to GnuPG in the OpenPGP Preferences (menu OpenPGP > Preferences)

Enigmime failed to initialize

OpenPGP works only if it is built using the same build environment as Thunderbird or SeaMonkey was built. This means that you can use the official Enigmail releases only if you use the official releases of Thunderbird or SeaMonkey provided by mozilla.org.

If you use a Thunderbird or SeaMonkey version coming from some other source (e.g. the provider of your Linux distribution), or if you built the application yourself, you should either use an Enigmail version built by the same source, or build Enigmail yourself. For building Enigmail, refer to the Source Code section on the Enigmail home page. Please don't file any bug report concerning this problem, it is not solvable.

Further help is available on the Enigmail Support Web Site.

enigmail-2.0.8/lang/zh-CN/help/messenger.html000066400000000000000000000074611334302754500207720ustar00rootroot00000000000000 Enigmail 帮助: 阅读邮件

Enigmail 帮助

在阅读邮件的时候使用 Enigmail

  • 主邮件窗å£ä¸­çš„解密按钮
    这个按钮有多ç§ç”¨é€”: 解密ã€éªŒè¯æˆ–导入 公用密钥。一般情况下 解密/éªŒè¯ åŠ¨ä½œåº”è¯¥è‡ªåŠ¨æ‰§è¡Œ(å¯ä»¥ä»Žå±žæ€§è®¾ç½®é‡Œç¦ç”¨è‡ªåŠ¨è§£å¯†/验è¯)。 当å‘生错误时 Enigmail 状æ€è¡Œä¼šæ˜¾ç¤ºä¸€ä¸ªç®€çŸ­çš„错误信æ¯ã€‚这时如果您点击 解密按钮,您将会看到错误的详细信æ¯ï¼Œä»¥åŠ GnuPG 命令的输出信æ¯ã€‚
  • 邮件头显示区域中的钢笔图标和钥匙图标
    这些在邮件头显示区域中显示的 钢笔 å’Œ 钥匙 图标å¯ä»¥æŒ‡ç¤ºæ‚¨æ­£åœ¨é˜…读的邮件 是å¦ç»è¿‡æ•°å­—ç­¾åæˆ–加密以åŠè¿™ä¸ªæ•°å­—ç­¾åæ˜¯å¦å®Œå¥½ï¼Œä¾‹å¦‚: 该邮件在数字签å之åŽä¸ºè¢«ç¯¡æ”¹ã€‚如果邮件 å·²ç»è¢«ç¯¡æ”¹ï¼Œé‚£ä¸ª 钢笔 å›¾æ ‡å°†ä¼šå˜æˆä¸€ä¸ª 折断的钢笔 æ¥æŒ‡ç¤ºæ•°å­—ç­¾åå·²ç» é­åˆ°ç ´å。在钢笔或者钥匙图标上é¢ç‚¹å‡»å³é”®å°†ä¼šå‡ºçŽ°å¸¦æœ‰å¦‚ä¸‹é€‰é¡¹çš„èœå•:
    • OpenPGP 安全信æ¯: å…许您查看该邮件的 GnuPG 命令输出的状æ€ä¿¡æ¯ã€‚
    • å¤åˆ¶ OpenPGP 安全信æ¯: å°† GnuPG 输出的状æ€ä¿¡æ¯å¤åˆ¶åˆ°å‰ªè´´æ¿ï¼›ä»¥ä¾¿ç²˜è´´åˆ° 回å¤é‚®ä»¶ä¸­ï¼Œç­‰ç­‰ã€‚
    • 查看 OpenPGP 相片: 如果å‘件人在他的公用密钥中嵌入了相片,这个 选项将å…许您查看它。 (此选项仅在密钥中存在相片时å¯ç”¨ã€‚)
    • S/MIME 安全信æ¯: å…许您查看该邮件的 S/MIME 安全信æ¯ã€‚

    如果您的 gpg.conf 文件中没有设置 keyserver-options auto-key-retrieve,当您阅读一å°ç»è¿‡æ•°å­—ç­¾åæˆ–者 加密的邮件的时候,您会看到邮件头显示区域的 钢笔 å›¾æ ‡ä¸Šé¢æœ‰ä¸ª é—®å·ï¼Œ 邮件头区域中的 Enigmail 状æ€è¡Œå°†ä¼šæ˜¾ç¤º 邮件包å«å·² æ•°å­—ç­¾å 部分 ;请点击“钢笔â€å›¾æ ‡æŸ¥çœ‹è¯¦ç»†ä¿¡æ¯ 并且邮件正文显示部分 将显示全部 OpenPGP 段指示符å·å’Œå…¨éƒ¨æ•°å­—ç­¾åæ®µã€‚

    䏿žœå³ä½¿æ‚¨åœ¨ gpg.conf 文件中设置了 keyserver-options auto-key-retrieve,当无法从默认密钥æœåŠ¡å™¨æ‰¾åˆ°å‘件人的密钥时您也会看到此æç¤ºã€‚

    点击该 带有问å·çš„钢笔 å°†ä¼šå¼¹å‡ºä¸€ä¸ªçª—å£æç¤ºæ‚¨çš„å¯†é’¥é“¾ä¸åŒ…å«è¯¥å‘件人的密钥。 此时点击“确定â€å°±ä¼šå¼¹å‡ºå¦ä¸€ä¸ªå¸¦æœ‰å¯†é’¥æœåŠ¡å™¨åˆ—è¡¨çš„çª—å£ä»¥ä¾¿æ‚¨ä»Žä¸­é€‰æ‹©ä¸€ä¸ªæœåС噍æ¥ä¸‹è½½ å‘件人的公用密钥。

    您å¯ä»¥é€šè¿‡åœ¨ Enigmail -> 选项 -> 基本 标签的 密钥æœåС噍: 框中输入以逗å·åˆ†éš”的密钥æœåŠ¡å™¨åœ°å€æ¥é…ç½®ä¸Šé¢æåˆ°çš„å¯†é’¥æœåŠ¡å™¨åˆ—è¡¨çª—å£ä¸­æ˜¾ç¤ºçš„æœåŠ¡å™¨ã€‚ 这里所填写的第一个密钥æœåŠ¡å™¨å°†è¢«ä½œä¸ºé»˜è®¤å¯†é’¥æœåŠ¡å™¨ã€‚

  • 查看加密的附件 / 导入附件中的 OpenPGP 密钥
    Enigmail 将自动识别文件å为 *.pgp〠*.asc å’Œ *.gpg 的附件并对其进行特别处ç†ã€‚ 在此类附件上é¢ç‚¹å‡»å³é”®å¼¹å‡ºçš„èœå•将会有两个特殊的选项: 解密并打开 å’Œ 解密并ä¿å­˜ã€‚如果您希望利用 Enigmail 查看或ä¿å­˜åŠ å¯†çš„é™„ä»¶ï¼Œ å¯ä»¥ä½¿ç”¨è¿™ä¸¤ä¸ªé€‰é¡¹ã€‚如果附件被识别为 OpenPGP 密钥文件,Enigmail 将引导您将它导入您的密钥链。

您å¯ä»¥ä»Ž Enigmail 帮助网页获得更多帮助

enigmail-2.0.8/lang/zh-CN/help/rulesEditor.html000066400000000000000000000056171334302754500213040ustar00rootroot00000000000000 Enigmail帮助: 规则编辑器

Enigmail帮助

使用 Enigmail 规则编辑器

在规则编辑器中您å¯ä»¥ä¸ºæ¯ä¸ªæ”¶ä»¶äººé»˜è®¤è®¾ç½®åР坆ã€ç­¾åå’ŒPGP/MIME,以åŠå®šä¹‰ä½¿ç”¨æŸä¸ª OpenPGP 密钥。æ¯ä¸€æ¡è§„则由5个字段组æˆï¼Œå¹¶ä¸”æ¯æ¡è§„则å ä¸€è¡Œ:

  • 电å­é‚®ä»¶: è¦ä»Ž To:ã€Cc: å’Œ Bcc: 字段 中匹é…的电å­é‚®ä»¶åœ°å€ã€‚该匹é…使用 å­å­—串 åŒ¹é…æ–¹å¼å·¥ä½œ(详细信æ¯è¯·è§ è§„åˆ™ç¼–è¾‘å¯¹è¯æ¡†)
  • OpenPGP 密钥: 为收件人使用的 OpenPGP 密钥标识的列表
  • æ•°å­—ç­¾å: å¯ç”¨æˆ–ç¦ç”¨ 电å­é‚®ä»¶æ•°å­—ç­¾å。此选项将使用或者å–代您在邮件撰写窗å£é€‰æ‹©çš„设置。 其值为:
    • 从ä¸: ç¦ç”¨æ•°å­—ç­¾å,å³ä¾¿å·²ç»åœ¨é‚®ä»¶æ’°å†™çª—å£åšå‡ºé€‰æ‹© (å–代其他值)
    • 在撰写邮件时选择: 使用在邮件撰写窗å£ä¸­é€‰æ‹©çš„设置
    • 总是: å¯ç”¨æ•°å­—ç­¾å,å³ä¾¿æ‚¨åœ¨é‚®ä»¶æ’°å†™çª—å£ å¹¶æœª å¯ç”¨æ•°å­—ç­¾å
这些数字签å设置将应用于所有匹é…的规则。如果有任æ„ä¸€æ¡ è§„åˆ™ç¦ç”¨äº†æ•°å­—ç­¾å,ä¸ç®¡å…¶ä»–è§„åˆ™æ˜¯å¦æŒ‡å®šäº†æ€»æ˜¯è¿›è¡Œæ•°å­—ç­¾å,该邮件都ä¸ä¼šè¢«æ•°å­—ç­¾å。
  • 加密: å¯ç”¨æˆ–ç¦ç”¨ 邮件加密。å¯é€‰çš„设置åŠå…¶å«ä¹‰åŒæ•°å­—ç­¾å。
  • PGP/MIME: å¯ç”¨æˆ–ç¦ç”¨ PGP/MIME (RFC 3156) 邮件编ç ã€‚ 如果ç¦ç”¨äº† PGP/MIME,信件将使用 "åµŒå…¥å¼ PGP" ç¼–ç ã€‚å¯é€‰çš„设置åŠå…¶å«ä¹‰åŒæ•°å­—ç­¾å。

所有的规则将会按照 OpenPGP 规则编辑器 列表中的顺åºé€ä¸ªå¤„ç†ã€‚å½“ä»»ä¸€åŒ…å« OpenPGP 密钥标识的规则æˆåŠŸåŒ¹é…一个收件人,我们除了为这个收件人使用规则中包å«çš„密钥之外,还将在åŽç»­çš„规则 测试中忽略该收件人。

注æ„: 规则编辑器的功能还ä¸å®Œå…¨ã€‚ ä½ å¯ä»¥é€šè¿‡ç›´æŽ¥ç¼–辑规则文件æ¥å†™æ›´å¤šé«˜çº§çš„规则(ä¸è¦å†åœ¨è§„则编辑器中编辑这些规则)。直接编辑规则文件的更详细帮助 å¯ä»¥ Enigmail 的主页上找到


您å¯ä»¥ä»Ž Enigmail 帮助web页上获得更多的帮助信æ¯

enigmail-2.0.8/lang/zh-CN/help/sendingPrefs.html000066400000000000000000000047771334302754500214400ustar00rootroot00000000000000 Enigmail Help: Edit OpenPGP Rule

Enigmail Help

Defining Preferences to Send Encrypted

In the Sending Preferences you can choose the general model and preferences for encryption.

Convenient Encryption
With these settings, emails are encrypted without confirmation whenever possible.

This setup is appropriate, if you just want to improve your privacy by sending emails encyrpted instead of unencrypted if that's possible.

The effect is like sending emails as letters instead of postcards. Unlike postcards, letters usually hide their contents while in transit.

Note however that as with letters you can't be sure that nobody is opening the letter while it is in transit (although, some technical effort is necessary for that).

A concrete risk is that you accidentally use "faked keys" you got from somewhere or somebody claiming that the key belongs to the person you want to send emails to. To avoid this risk, you can either use the trust model of PGP (see below) or you should always verify, whether the fingerprint of a public key is correct.

Manual Encryption
This option allows you to specify the different preferences for encryption according to your needs. You can specify
  • whether replies to encrypted/signed emails should automatically also be encrypted/signed-
  • whether to use the trust model of OpenPGP to accept keys (this means that to use a key you either have to sign the key or have enough other people you trust having signed the key).
  • whether you want to automatically send emails encrypted if all keys are accepted.
  • whether and when you want to finally confirm sending an email.
If it is important for you that content you send encrypted can't be read by other people or organizations, you should use the manual preferences at least choose the option to accept keys only if you or other people signed them. While this model reduces the risk of using faked keys, it requires that you actively sign keys and declare owner trust using the key managament dialog. enigmail-2.0.8/lang/zh-TW/000077500000000000000000000000001334302754500152065ustar00rootroot00000000000000enigmail-2.0.8/lang/zh-TW/am-enigprefs.properties000066400000000000000000000001221334302754500216740ustar00rootroot00000000000000# Strings used in the Mozill AccountManager prefPanel-enigprefs=OpenPGP 安全性 enigmail-2.0.8/lang/zh-TW/enigmail.dtd000066400000000000000000001463761334302754500175110ustar00rootroot00000000000000 ã€ä¾†æŒ‡å®šEmail地å€"> ã€ä¾†ç‚ºGnuPG指定Email地å€ï¼Œæ”¶ä»¶äººæœ‰èˆŠç‰ˆHushmail密鑰時請ç¦ç”¨ã€‚"> OpenPGP 安全性)"> 注æ„:生æˆå¯†é‘°éœ€è¦æ•¸åˆ†é¾æ™‚間。在此期間請ä¸è¦é€€å‡ºç¨‹å¼ã€‚活跃的网é ç€è¦½æˆ–ç£ç›¤æ“作å¯ä»¥åˆ·æ–°ã€Žéš¨æ©Ÿæ± ã€ï¼Œå¾žè€ŒåŠ å¿«é€Ÿåº¦ã€‚å¯†é‘°ç”Ÿæˆå®Œæˆæ™‚您將會得到æç¤ºã€‚"> ã€æ˜¯ç„¡æ•ˆçš„。"> 注æ„:密鑰生æˆéœ€è¦æ•¸åˆ†é˜çš„æ™‚間。密鑰生æˆéŽç¨‹ä¸­è«‹å‹¿é€€å‡ºç¨‹å¼ã€‚密鑰生æˆå®Œæˆæ™‚您將會收到æç¤ºã€‚"> 注æ„:無論是å¦å•Ÿç”¨ï¼ŒEnigmail將始終驗證所有帳號或身份的郵件中的簽å。"> 公鑰 是 用來讓其他人 寄加密訊æ¯çµ¦æ‚¨çš„。您å¯ä»¥ç™¼çµ¦ä»»ä½•人。"> ç§é‘° 是 用來讓您自己 解開加密郵件或簽署郵件用的。 ä¸è¦æ´©æ¼çµ¦ä»»ä½•人。"> ç§é‘° 是 用來讓您自己 解開加密郵件或簽署郵件用的。 ä¸è¦æ´©æ¼çµ¦ä»»ä½•人。 為了讓您的ç§é‘°æœ‰å¤šä¸€å±¤ä¿è­·ï¼Œæ‚¨å°‡åœ¨æŽ¥ä¸‹ä¾†å…©å€‹è¦–窗被æç¤ºè¼¸å…¥å¯†èªžã€‚"> 密語 是用來ä¿è­·æ‚¨çš„ç§é‘°çš„密碼,å¯é˜²æ­¢æ‚¨çš„ç§é‘°è¢«æ¿«ç”¨ã€‚"> ä¸ å»ºè­°æ‚¨ä½¿ç”¨è®ŠéŸ³å­—æ¯ï¼ˆä¾‹å¦‚ äã€Ã©ã€Ã±ï¼‰æˆ–其他語言的特殊字元。"> 感è¬ä½¿ç”¨Enigmail。"> enigmail-2.0.8/lang/zh-TW/enigmail.properties000066400000000000000000001432621334302754500211210ustar00rootroot00000000000000Enigmail=Enigmail ##################################################################### # Strings used within enigmailCommon.js and enigmailCommon.jsm ##################################################################### enigAlert=Enigmail 警告 enigConfirm=Enigmail ç¢ºèª # enigInfo=Enigmail Information enigError=Enigmail 錯誤 enigPrompt=Enigmail æç¤º dlgYes=是 (&Y) dlgNo=å¦ (&N) dlgKeepSetting=è¨˜ä½æˆ‘的答案,ä¸è¦å†å•我 dlgNoPrompt=ä¸å†é¡¯ç¤ºæ­¤å°è©±æ¡† dlg.button.delete=刪除 (&D) dlg.button.cancel=å–æ¶ˆ (&C) dlg.button.close=關閉 (&C) dlg.button.continue=繼續 (&T) dlg.button.skip=ç•¥éŽ (&S) # dlg.button.overwrite=&Overwrite dlg.button.view=檢視 (&V) dlg.button.retry=é‡è©¦ (&R) dlg.button.ignore=忽略 (&I) # dlg.button.install=&Install # dlg.button.ok=&OK repeatPrefix=\n\n該警告é‡è¤‡ %S。 repeatSuffixSingular=次 repeatSuffixPlural=次 noRepeat=\n\n您å‡ç´š Enigmail å‰å°‡ä¸å†é‡è¤‡å‡ºç¾æ­¤è­¦å‘Šã€‚ pgpNotSupported=æ‚¨ä¼¼ä¹Žæ­£åŒæ™‚使用 Enigmail å’Œ PGP 6.x。\n\nPGP 6.x 有諸多å•é¡Œï¼Œé€ æˆ Enigmail 無法正常工作。因此,Enigmail ä¸å†æ”¯æŒ PGP 6.x,請改用 GnuPG(GPG)。\n\n如果您需è¦è½‰æ›è‡³ GnuPG 的幫助,請åƒè€ƒ Enigmail 網站的 Help 段è½ã€‚ initErr.howToFixIt=å¿…é ˆè¦æœ‰ GnuPG æ‰èƒ½ä½¿ç”¨ Enigmailã€‚è‹¥æ‚¨é‚„æ²’æœ‰å®‰è£ GnuPG,最簡單的方å¼å°±æ˜¯ç›´æŽ¥ä½¿ç”¨ä¸‹æ–¹çš„「安è£ç²¾éˆã€ã€‚ initErr.setupWizard.button=安è£ç²¾éˆ (&S) passphraseCleared=已清除密碼。 # cannotClearPassphrase=You are using a non-standard tool (such as gnome-keyring) for passphrase handling. Clearing the passphrase is therefore not possible from within Enigmail. noPhotoAvailable=ç„¡å¯ç”¨ç…§ç‰‡ debugLog.title=Enigmail 除錯紀錄 error.photoPathNotReadable=無法讀å–照片路徑「%Sã€ã€‚ # generalError=Error: %S # Strings in configure.jsm enigmailCommon.versionSignificantlyChanged=這個新版的 Enigmail 在處ç†è¨­å®šèˆ‡é¸é …ä¸Šæœ‰å¤§å¹…åº¦çš„è®Šæ›´ã€‚æˆ‘å€‘å·²å˜—è©¦ç§»è½‰èˆŠç‰ˆçš„è¨­å®šåˆ°é€™å€‹ç‰ˆæœ¬ï¼Œä½†ç„¡æ³•è‡ªå‹•è½‰æ›æ‰€æœ‰è¨­å®šã€‚è«‹å†æ¬¡æª¢æŸ¥æ–°çš„設定有沒有å•題。 enigmailCommon.checkPreferences=檢查å好設定… # preferences.defaultToPgpMime=We have changed the default message encoding in Enigmail from Inline-PGP to PGP/MIME. We recommend you keep this as default.\n\nIf you still wish to use Inline-PGP by default, you can do so in the Account Settings under OpenPGP Security. ##################################################################### # Strings in enigmailAbout.js ##################################################################### usingVersion=使用 Enigmail 版本 %S # enigmailPepVersion=Enigmail/p≡p version %S usingAgent=使用 %1$S 執行檔 %2$S 來進行加解密 agentError=錯誤: ç„¡æ³•å­˜å– Enigmime æœå‹™ï¼ ##################################################################### # Strings in enigmailKeygen.js ##################################################################### accessError=å­˜å– Enigmail æœå‹™æ™‚發生錯誤 onlyGPG=Enigmail 僅能使用 GnuPGï¼ˆéž PGPï¼‰ç”¢ç”Ÿé‡‘é‘°ï¼ keygenComplete=金鑰產生完æˆï¼å°‡ä½¿ç”¨ <%S> 身份簽署。 revokeCertRecommended=我們強烈建議您為金鑰產生撤銷憑證。當金鑰éºå¤±æˆ–æ´©æ¼æ™‚,å¯ä½¿ç”¨è©²æ†‘證讓金鑰失效。您è¦ç”¢ç”Ÿé€™æ¨£çš„æ’¤éŠ·æ†‘è­‰å—Žï¼Ÿ keyMan.button.generateCert=產生憑證 (&G) genCompleteNoSign=金鑰產生完æˆï¼ genGoing=å·²åœ¨ç”¢ç”Ÿé‡‘é‘°ï¼ passNoMatch=密語ä¸ç›¸åŒï¼Œè«‹é‡æ–°è¼¸å…¥ã€‚ passCheckBox=è‹¥ä¸è¦ç‚ºé‡‘é‘°æŒ‡å®šå¯†èªžè«‹å‹¾é¸æ­¤æ¬„ä½ passUserName=請指定此身份的使用者å稱。 # keygen.missingUserName=There is no name specified for the selected account/identity. Please enter a value in the field "Your name" in the account settings. keygen.passCharProblem=您在密語中使用特殊字元,但å¯èƒ½æœƒåœ¨å…¶ä»–應用程å¼ä¸­é€ æˆå•題。我們建議您åªä½¿ç”¨ä¸‹åˆ—å­—å…ƒ:\na-z A-Z 0-9 /.;:-,!?(){}[]%* passSpaceProblem=由於技術å•題,您的密語ä¸èƒ½ä»¥ç©ºç™½é–‹å§‹æˆ–çµæŸã€‚ changePassFailed=密語更改失敗。 keyConfirm=是å¦ç‚ºã€Œ%Sã€ç”¢ç”Ÿå…¬é‘°å’Œç§é‘°ï¼Ÿ keyMan.button.generateKey=產生金鑰 (&G) keyAbort=åœæ­¢ç”¢ç”Ÿé‡‘鑰? keyMan.button.generateKeyAbort=åœæ­¢ç”¢ç”Ÿé‡‘é‘° (&A) keyMan.button.generateKeyContinue=繼續產生金鑰 (&C) expiryTooLong=æ‚¨ç„¡æ³•å»ºç«‹ä¸€æŠŠè¶…éŽ 100 å¹´å¾Œæ‰æœƒéŽæœŸçš„金鑰。 expiryTooLongShorter=æ‚¨ç„¡æ³•å»ºç«‹ä¸€æŠŠè¶…éŽ 90 å¹´å¾Œæ‰æœƒéŽæœŸçš„金鑰。 expiryTooShort=您的金鑰必須至少有效 1 天。 keyGenFailed=金鑰產生失敗。請檢查 Enigmail 主控å°ï¼ˆé¸å–® > Enigmail > Enigmail 除錯)以å–得更多資訊。 setKeyExpirationDateFailed=ç„¡æ³•è®Šæ›´éŽæœŸæ—¥ # Strings in enigmailMessengerOverlay.js securityInfo=Enigmail 安全資訊\n\n\n enigHeader=Enigmail: enigContentNote=Enigmail: * 此訊æ¯é™„件尚未經簽署或加密 *\n\n\n possiblyPgpMime=å¯èƒ½æ˜¯ç”± PGP/MIME 加密或簽署的訊æ¯ï¼Œè«‹é»žæ“Šã€Œè§£å¯†ã€æŒ‰éˆ•以驗證。 saveAttachmentHeader=Enigmail: 儲存解密附件 noTempDir=找ä¸åˆ°å¯å¯«å…¥çš„站存目錄,\n請設定 TEMP ç’°å¢ƒåƒæ•¸ attachmentPgpKey=您正è¦é–‹å•Ÿçš„附件「%Sã€å¯èƒ½æ˜¯ OpenPGP 金鑰。\n\n點擊「匯入ã€ä¾†åŒ¯å…¥åŒ…å«çš„金鑰,或點擊「檢視ã€åœ¨ç€è¦½å™¨è¦–窗中檢視該檔案 beginPgpPart=********* *BEGIN ENCRYPTED or SIGNED PART* ********* endPgpPart=********** *END ENCRYPTED or SIGNED PART* ********** notePartEncrypted=Enigmail: * 此訊æ¯éƒ¨åˆ†å…§å®¹æœªç¶“簽署或加密 * noteCutMessage=Enigmail: * 發ç¾å¤šå€‹è¨Šæ¯å€å¡Šï¼Œçµ‚止解密/é©—è­‰ * decryptOkNoSig=警告\n\nå·²æˆåŠŸè§£å¯†ï¼Œä½†ç„¡æ³•æ­£ç¢ºé©—è­‰ç°½ç«  msgOvl.button.contAnyway=還是繼續 (&C) signature.verifiedOK=æˆåŠŸé©—è­‰é™„ä»¶ %S 的簽章 signature.verifyFailed=無法驗證附件 %S 的簽章 attachment.noMatchToSignature=簽章檔案中沒有與「%Sã€ç¬¦åˆçš„簽章 attachment.noMatchFromSignature=附件中沒有與「%Sã€ç¬¦åˆçš„簽章 fixBrokenExchangeMsg.failed=並未æˆåŠŸä¿®å¾©è¨Šæ¯ã€‚ # enigmail.msgViewColumn.label=Enigmail # enigmailPep.msgViewColumn.label=Enigmail/p≡p # wksNoIdentity=This key is not linked to any of your email accounts. Please add an account for at least one of the following email addresse(s):\n\n%S # wksConfirmSuccess=Confirmation email sent. # wksConfirmFailure=Sending the confirmation email failed. # autocrypt.importSetupKey.accountPreconfigured=Your account is already correctly configured for Autocrypt.\n\nDo you really want to overwrite your settings with this setup message? # autocrypt.importSetupKey.selfCreated=This message was created by your currently running instance of Enigmail.\n\nPlease switch to the email client to which you want to transfer the settings, and click on the message on that email client to import the settings. # autocrypt.importSetupKey.invalidMessage=Error - could not read setup message. The message seems to be corrupted. Please try to create a new setup message on your "other" device. # autocrypt.importSetupKey.invalidKey=Error - the key could not be imported. The key is either not supported by your version of GnuPG, or it got corrupted. # autocrypt.importSetupKey.wrongPasswd=The password you entered is wrong. Do you want to retry? # autocrypt.importSetupKey.success=The Autocrypt setup message was processed successfully. Autocrypt is now available for your account '%S'. ##################################################################### # Strings in enigmailMsgComposeOverlay.js ##################################################################### keysToExport=鏿“‡è¦æ’入的 OpenPGP 金鑰 keysToUse=鏿“‡è¦ç”¨ä¾† %S çš„ OpenPGP 金鑰 pubKey=%S 的公鑰\n windowLocked=編輯窗å£å·²éŽ–å®šï¼Œå·²å–æ¶ˆå‚³é€ã€‚ sendUnencrypted=Enigmail åˆå§‹åŒ–失敗。\n是å¦è¦å¯„逿œªåŠ å¯†çš„è¨Šæ¯ï¼Ÿ composeSpecifyEmail=請指定您的主è¦é›»å­éƒµä»¶åœ°å€ï¼Œå®ƒå°‡åœ¨å¯„é€è¨Šæ¯æ™‚ç”¨ä¾†é¸æ“‡è¦ç°½ç½²é‡‘鑰。\n若您留空,將ä¾ç…§è¨Šæ¯çš„寄件地å€ä¾†é¸æ“‡ç°½ç½²ç”¨é‡‘鑰。 sendingHiddenRcpt=æ­¤è¨Šæ¯æœ‰å¯†ä»¶å‰¯æœ¬æ”¶ä»¶äººã€‚è‹¥æ­¤è¨Šæ¯æ˜¯åŠ å¯†è¨Šæ¯ï¼Œæ‚¨å¯ä»¥éš±è—密件副本收件者,但æŸäº›ç”¢å“使用者(例如 PGP)將無法解密該訊æ¯ã€‚因此我們建議您ä¸è¦åŠ å¯†æœ‰å¯†ä»¶å‰¯æœ¬æ”¶ä»¶è€…çš„è¨Šæ¯ã€‚ sendWithHiddenBcc=éš±è—密件副本收件者 sendWithShownBcc=正常加密 sendingNews=åŠ å¯†å‚³é€æ“作中止。\n\n因為有新èžç¾¤çµ„收件者,無法加密此訊æ¯ã€‚è«‹å–æ¶ˆåŠ å¯†å¾Œå†ç™¼é€ã€‚ sendToNewsWarning=警告:您正è¦å‘æ–°èžç¾¤çµ„傳é€åŠ å¯†éƒµä»¶ã€‚\n\nåªæœ‰æ–°èžç¾¤çµ„的所有æˆå“¡éƒ½èƒ½è§£å¯†è¨Šæ¯çš„æƒ…å†µä¸‹æ‰æœ‰æ„義(也就是說,訊æ¯éœ€è¦ä½¿ç”¨ç¾¤çµ„中所有æˆå“¡çš„é‡‘é‘°åŠ å¯†ï¼‰ï¼Œå› æ­¤ä¸æŽ¨è–¦é€™æ¨£åšã€‚請確定您知é“自己正在åšä»€éº¼ã€‚\n\nè¦ç¹¼çºŒå—Žï¼Ÿ hasHTML=HTML 郵件警告:\n此訊æ¯åŒ…å« HTML,å¯èƒ½æœƒä½¿ç°½ç½²æˆ–加密失敗。為é¿å…這個情况,您應該在點擊「寫信/å›žè¦†ã€æ™‚æŒ‰ä½ Shift éµä¾†å‚³é€ç¶“簽署的郵件。\n如果您é è¨­è¦ç°½ç½²éƒµä»¶ï¼Œæ‚¨æ‡‰è©²ç‚ºæ­¤å¸³è™Ÿå–æ¶ˆé¸æ“‡ã€Œç”¨ HTML æ ¼å¼æ’°å¯«éƒµä»¶ã€ä¾†æ°¸ä¹…åœç”¨ HTML。 strippingHTML=訊æ¯ä¸­çš„ HTML æ ¼å¼å°‡åœ¨è½‰æ›æˆç´”文字以進行簽署/加密消失。您è¦ç¹¼çºŒå—Žï¼Ÿ msgCompose.button.sendAnyway=還是傳é€è¨Šæ¯ (&S) attachWarning=此訊æ¯çš„附件ä¸åœ¨æœ¬æ©Ÿï¼Œç„¡æ³•加密。若è¦åŠ å¯†é™„ä»¶ï¼Œè«‹å…ˆå°‡å®ƒå€‘å„²å­˜è‡³æœ¬æ©Ÿå¾Œå†æ–°å¢žç‚ºé™„件。您還是è¦ç™¼é€è¨Šæ¯å—Žï¼Ÿ quotedPrintableWarn=您為è¦å‚³é€çš„訊æ¯å•Ÿç”¨äº†ã€Œquoted-printableã€ç·¨ç¢¼ã€‚å¯èƒ½æœƒåœ¨è§£å¯†æˆ–驗證時出ç¾éŒ¯èª¤ã€‚\n您是å¦è¦é—œé–‰ä»¥ã€Œquoted-printableã€ç·¨ç¢¼ç™¼é€è¨Šæ¯ï¼Ÿ minimalLineWrapping=您設定æ¯è¡Œåœ¨ %S 字元後æ›è¡Œã€‚為了正確加密和簽署,這個值應至少為 68。\n您ç¾åœ¨æ˜¯å¦æƒ³æ”¹æˆ 68 字元後æ›è¡Œï¼Ÿ warning=警告 signIconClicked=您已經手動修改簽章。所以當您撰寫郵件的時候,啟(åœï¼‰ç”¨ç°½ç½²ä¸å†è·Ÿéš¨å•Ÿï¼ˆåœï¼‰ç”¨åŠ å¯†ã€‚ # errorOwnKeyUnusable=The key ID '%S' configured for the current identity does not yield a usable OpenPGP key.\n\nPlease ensure that you have a valid, not expired OpenPGP key and that your account settings point to that key.\nIf your key is not expired, then check if you did set Owner trust to full or ultimate. # msgCompose.cannotSaveDraft=Error while saving draft # msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information - partially encrypted email. # msgCompose.partiallyEncrypted.mimeMsg=The message you are replying to contained both unencrypted and encrypted parts. Some encrypted message parts are invisible to you.\n\nIf the sender was not able to decrypt the hidden message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nWe recommend that you don't reply to the message, but create a new message containing your answer. # msgCompose.partiallyEncrypted.inlinePGP=The message you are replying to contained both unencrypted and encrypted parts. If the sender was not able to decrypt some message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nPlease consider removing all quoted text from your reply to this sender. msgCompose.internalEncryptionError=內部錯誤: promised encryption disabled # msgCompose.internalError=An internal error has occurred. msgCompose.toolbarTxt.signAndEncrypt=å°‡ç°½ç½²ä¸¦åŠ å¯†æ­¤è¨Šæ¯ msgCompose.toolbarTxt.signOnly=å°‡ç°½ç½²æ­¤è¨Šæ¯ msgCompose.toolbarTxt.encryptOnly=å°‡åŠ å¯†æ­¤è¨Šæ¯ msgCompose.toolbarTxt.noEncryption=將䏿œƒç°½ç½²ä¸¦åŠ å¯†æ­¤è¨Šæ¯ msgCompose.toolbarTxt.disabled=å·²ç‚ºæ‰€é¸æ“‡çš„身分åœç”¨ Enigmail # msgCompose.protectSubject.tooltip=Protect the message subject # msgCompose.noSubjectProtection.tooltip=Do not protect the message subject # msgCompose.encryptedSubjectStub=Encrypted Message # msgCompose.protectSubject.dialogTitle=Enable Protection of Subject? # msgCompose.protectSubject.question=Regular encrypted emails contain the unredacted subject.\n\nWe have established a standard to hide the original subject in the encrypted message\nand replace it with a dummy text, such that the subject is only visible after the email is decrypted.\n\nDo you want to protect the subject in encrypted messages? # msgCompose.protectSubject.yesButton=&Protect subject # msgCompose.protectSubject.noButton=&Leave subject unprotected # msgCompose.detailsButton.label=Details ... msgCompose.detailsButton.accessKey=D # msgCompose.pepSendUnknown=Unknown # msgCompose.pepSendUnsecure=Unsecure # msgCompose.pepSendSecure=Secure # msgCompose.pepSendTrusted=Secure & Trusted # pep.alert.disabledForIdentity=p≡p is disabled for the current identity. Please enable p≡p via the Enigmail/p≡p preferences. # pep.alert.weakReply=You’re about to forward or reply to a secure message as insecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? # note: should end with double newline: sendAborted=已中止傳é€ã€‚\n # details: keyNotTrusted=金鑰「%Sã€çš„信任等級ä¸è¶³ keyNotFound=找ä¸åˆ°é‡‘鑰「%S〠keyRevoked=金鑰「%Sã€å·²è¢«æ’¤éŠ· keyExpired=金鑰「%Sã€å·²éŽæœŸ statPGPMIME=PGP/MIME # statSMIME=S/MIME statSigned=已簽署 statEncrypted=已加密 statPlain=未簽署或加密 offlineSave=è¦å„²å­˜çµ¦ %2$S çš„ %1$S å°è¨Šæ¯åˆ°æœªå¯„出訊æ¯ä¿¡ä»¶åŒ£ä¸­å—Žï¼Ÿ onlineSend=è¦å¯„é€ %1$S å°è¨Šæ¯çµ¦ %1$S 嗎? encryptKeysNote=註: 此訊æ¯ä»¥ä½¿ç”¨ä¸‹åˆ—使用者身分/金鑰加密: %S hiddenKey=<金鑰已隱è—> signFailed=Enigmail 發生錯誤,加密/簽署失敗,è¦å¯„逿œªåŠ å¯†çš„è¨Šæ¯å—Žï¼Ÿ msgCompose.button.sendUnencrypted=傳逿œªåŠ å¯†çš„è¨Šæ¯ (&S) recipientsSelectionHdr=鏿“‡è¦åŠ å¯†çš„æ”¶ä»¶äºº configureNow=您尚未為這個身份設定 Enigmail 安全資訊,您è¦ç¾åœ¨è¨­å®šå—Žï¼Ÿ # encryption/signing status and associated reasons: # encryptMessageAuto=Encrypt Message (auto) # encryptMessageNorm=Encrypt Message # signMessageAuto=Sign Message (auto) # signMessageNorm=Sign Message encryptOff=加密: é—œ encryptOnWithReason=加密: é–‹ (%S) encryptOffWithReason=加密: é—œ (%S) encryptOn=加密: é–‹ signOn=簽署: é–‹ signOff=簽署: é—œ signOnWithReason=簽署: é–‹ (%S) signOffWithReason=簽署: é—œ (%S) reasonEnabledByDefault=é è¨­é–‹å•Ÿ reasonManuallyForced=手動強制 reasonByRecipientRules=因收件者è¦å‰‡è€Œå¼·åˆ¶ reasonByAutoEncryption=因自動加密而強制 reasonByConflict=因收件者è¦å‰‡è¡çª reasonByEncryptionMode=å› åŠ å¯†æ¨¡å¼ # should not be used anymore: encryptYes=訊æ¯å°‡è¢«åР坆 encryptNo=訊æ¯å°‡ä¸è¢«åР坆 # should not be used anymore: signYes=訊æ¯å°‡è¢«ç°½ç½² signNo=訊æ¯å°‡ä¸è¢«ç°½ç½² # PGP/MIME status: # pgpmimeNormal=Protocol: PGP/MIME # inlinePGPNormal=Protocol: Inline PGP # smimeNormal=Protocol: S/MIME # pgpmimeAuto=Protocol: PGP/MIME (auto) # inlinePGPAuto=Protocol: Inline PGP (auto) # smimeAuto=Protocol: S/MIME (auto) # should not be used anymore pgpmimeYes=將使用 PGP/MIME pgpmimeNo=將使用行內 PGP # Attach own key status (tooltip strings): # attachOwnKeyNo=Your own key will not be attached # attachOwnKeyYes=Your own key will be attached # attachOwnKeyDisabled=Your own key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. rulesConflict=嵿¸¬åˆ°æ”¶ä»¶è€…è¦å‰‡è¡çªã€‚\n%S\n\n您是è¦ä»ç„¶æŒ‰ç…§æ­¤è¨­å®šå‚³é€è¨Šæ¯å—Žï¼Ÿ msgCompose.button.configure=設定 (&C) msgCompose.button.send=傳é€è¨Šæ¯ (&S) msgCompose.button.save=å„²å­˜è¨Šæ¯ (&S) # Strings in enigmailMsgHdrViewOverlay.js keyNeeded=需è¦å…¬é‘° %S æ‰èƒ½é©—證簽å keyUsed=已用公鑰 %S 驗證簽章 clickDecrypt=ï¼Œé»žæ“Šã€Œè§£å¯†ã€æŒ‰éˆ• clickDecryptRetry=ï¼Œé»žæ“Šã€Œè§£å¯†ã€æŒ‰éˆ•以é‡è©¦ clickDetailsButton=ï¼Œé»žæ“Šã€Œè©³ç´°è³‡è¨Šã€æŒ‰éˆ•å–得更多資訊 clickImportButton=ï¼Œé»žæ“Šã€ŒåŒ¯å…¥é‡‘é‘°ã€æŒ‰éˆ•下載金鑰 keyTypeUnsupported=,您的版本的 GnuPG 䏿”¯æ´è©²é¡žåž‹é‡‘é‘° msgPart=郵件 %S 的片段 msgSigned=已簽署 msgSignedUnkownKey=已用未知金鑰簽署 msgEncrypted=已加密 msgSignedAndEnc=已簽署並加密 unverifiedSig=未驗證的簽章 incompleteDecrypt=è§£å¯†æœªå®Œæˆ needKey=錯誤 - 缺少用於解密訊æ¯çš„ç§é‘° failedDecrypt=錯誤 - 解密失敗 badPhrase=錯誤 - 密語無效 failedDecryptVerify=錯誤 - 解密/驗證失敗 mdcError=錯誤 - è¨Šæ¯æœªå—到完整的ä¿è­· viewInfo=,請åƒè€ƒæª¢è¦– > 訊æ¯å®‰å…¨æ€§è³‡è¨Š decryptedMsg=è§£å¯†å¾Œçš„è¨Šæ¯ decryptedMsgWithFormatError=已解密的訊æ¯ï¼ˆå¯èƒ½å› èˆŠç‰ˆçš„ Exchange 伺æœå™¨æ¯€æäº† PGP 郵件,已æ¢å¾©çš„內容å¯èƒ½ä¸èƒ½æ­£å¸¸é–±è®€ï¼‰ # usedAlgorithms=Used Algorithms: %1$S and %2$S # pepStatusInfo.text=p≡p Message Status. # pepStatusInfo.title.m3=Under Attack # pepStatusInfo.info.m3=This message is not secure and has been tampered with. # pepStatusInfo.title.m1=Mistrusted # pepStatusInfo.info.m1=This message has a communication partner that has previously been marked as mistrusted # pepStatusInfo.title.r0=Unknown # pepStatusInfo.info.r0=This message does not contain enough information to determine if it is secure. # pepStatusInfo.title.r1=Cannot Decrypt # pepStatusInfo.info.r1=This message cannot be decrypted because the key is not available. # pepStatusInfo.title.r2=Cannot Decrypt # pepStatusInfo.info.r2=This message cannot be decrypted because the key is not available. # pepStatusInfo.title.r3=Unsecure # pepStatusInfo.info.r3=This message is unsecure. # pepStatusInfo.title.r4=Unsecure for Some # pepStatusInfo.info.r4=This message is unsecure for some communication partners. # pepStatusInfo.title.r5=Unreliable Security # pepStatusInfo.info.r5=This message has unreliable protection. # pepStatusInfo.title.r6=Secure... # pepStatusInfo.info.r6=This message is secure but you still need to verify the identity of your communication partner. # pepStatusInfo.title.r7=Secure & Trusted # pepStatusInfo.info.r7=This message is secure and trusted. # pepStatusInfo.color.green=Green # pepStatusInfo.color.yellow=Yellow # pepStatusInfo.color.red=Red # pepRevokeTrust.question=Do you really want to cancel the trust for %S? # pepRevokeMistrust.question=Do you really want to re-trust the key for %S? # pepRevokeTrust.doRevoke=Cancel &trust # wksConfirmationReq=Web Key Directory Confirmation Request # wksConfirmationReq.message=This message has been sent by your email provider to confirm deployment of your OpenPGP public key\nin their Web Key Directory.\nProviding your public key helps others to discover your key and thus being able to encrypt messages to you.\n\nIf you want to deploy your key in the Web Key Directory now, please click on the button "Confirm Request" in the status bar.\nOtherwise, simply ignore this message. # wksConfirmationReq.button.label=Confirm Request # autocryptSetupReq=Perform Autocrypt Setup # autocryptSetupReq.button.label=Start Setup # autocryptSetupReq.setupMsg.desc=This message contains all information to transfer your Autocrypt settings along with your secret key securely from your original device. # autocryptSetupReq.setupMsg.backup=You can keep this message and use it as a backup for your secret key. If you want to do this, you should write down the password and store it securely. # autocryptSetupReq.message.import=To import the settings and key(s) in Enigmail, please click on the "Start Setup" button in the status bar. # autocryptSetupReq.message.sent=Please click on the message on your new device and follow the instuctions to import the settings. # strings in pref-enigmail.js # oldGpgVersion20=Enigmail initialization failed.\n\nYou are using GnuPG version %1$S, which is not supported anymore. Enigmail requires GnuPG version %2$S or newer. Please upgrade your GnuPG installation, or Enigmail will not work. locateGpg=尋找 GnuPG ç¨‹å¼ invalidGpgPath=無法執行指定路徑下的 GnuPGã€‚åœ¨æ‚¨é‡æ–°å•Ÿå‹•軟體或更改路徑å‰å°‡ç„¡æ³•使用 Enigmail。 warningsAreReset=å·²é‡è¨­æ‰€æœ‰è­¦å‘Šã€‚ prefs.gpgFound=在 %S 找到 GnuPG prefs.gpgNotFound=找ä¸åˆ° GnuPG prefs.warnAskNever=警告: 啟用該é¸é …會造æˆç•¶æ‚¨ç¼ºå°‘ä»»ä½•æ”¶ä»¶è€…çš„å…¬é‘°æ™‚å‚³é€æœªåŠ å¯†çš„éƒµä»¶ï¼Œä¸” Enigmail 將䏿œƒæé†’您。 prefs.warnIdleTimeForUnknownAgent=無法連線至 gpg-agent。å¯èƒ½æ˜¯æ‚¨çš„系統使用了特別的工具來管ç†å¯†èªžï¼ˆä¾‹: gnome-keyring, seahorse-agent, KDE wallet manager ç­‰ç­‰ï¼‰ã€‚å¯æƒœçš„æ˜¯ Enigmail 無法控制您使用的工具的密語逾時設定,所以 Enigmail 當中的逾時設定將被忽略。 prefEnigmail.oneKeyserverOnly=錯誤 - 您僅能指定一組金鑰伺æœå™¨ä¾†è‡ªå‹•下載缺少的 OpenPGP 金鑰。 # Strings used in core.jsm # (said file also re-uses some strings from above) enterAdminPin=請输入您智慧å¡çš„ç®¡ç† PIN 碼 enterCardPin=è«‹è¼¸å…¥æ‚¨çš„æ™ºæ…§å¡ PIN 碼 notInit=錯誤 - Enigmail æœå‹™å°šæœªåˆå§‹åŒ– badCommand=錯誤 - 加密指令失敗 cmdLine=命令列和輸出資料: notRequired=錯誤 - 無加密需求 notComplete=錯誤 - é‡‘é‘°å°šæœªç”¢ç”Ÿå®Œæˆ invalidEmail=錯誤 - é›»å­éƒµä»¶åœ°å€ç„¡æ•ˆ noPassphrase=錯誤 - 未指定密語 noPGPblock=錯誤 - 找ä¸åˆ°æœ‰æ•ˆçš„ armored OpenPGP 資料å€å¡Š unverifiedReply=訊æ¯çš„縮排部分(引用文章)å¯èƒ½è¢«ä¿®æ”¹éŽ # keyInMessageBody=Key in message body found. Click 'Import Key' to import the key sigMismatch=錯誤 - 簽章ä¸ç¬¦ cantImport=匯入公鑰時發生錯誤\n\n # doImportOne=Import %1$S (%2$S)? # doImportMultiple=Import the following keys?\n\n%S # previewFailed=Can't read public key file. # Strings used in errorHandling.jsm sc.wrongCardAvailable=è®€å¡æ©Ÿä¸­çš„æ™ºæ…§å¡ %S 無法用於處ç†è¨Šæ¯ã€‚\nè«‹æ’å…¥æ™ºæ…§å¡ %S 後é‡è©¦ã€‚ sc.insertCard=æ­¤æ“ä½œéœ€è¦æ‚¨çš„æ™ºæ…§å¡ %S。\nè«‹æ’入智慧å¡å¾Œé‡è©¦ã€‚ sc.removeCard=è®€å¡æ©Ÿä¸­ä¸èƒ½æœ‰æ™ºæ…§å¡ã€‚\n請移除智慧å¡å¾Œé‡è©¦ã€‚ sc.noCardAvailable=è®€å¡æ©Ÿä¸­æ‰¾ä¸åˆ°ä»»ä½•智慧å¡ã€‚\nè«‹æ’入智慧å¡å¾Œé‡è©¦ã€‚ sc.noReaderAvailable=ç„¡æ³•å­˜å–æ‚¨çš„æ™ºæ…§å¡è®€å¡æ©Ÿ\nè«‹é€£çµæ‚¨çš„è®€å¡æ©Ÿä¸¦æ’入智慧å¡å¾Œé‡è©¦ã€‚ # keyError.keySpecNotFound=The email address "%S" cannot be matched to a key on your keyring. # keyError.keyIdNotFound=The configured key ID "%S" cannot be found on your keyring. # keyError.resolutionAction=Please select a valid key in the OpenPGP section of your Account Settings. # missingPassphrase=Missing passphrase # errorHandling.gpgAgentInvalid=Your system is running a version of gpg-agent that is not suitable for your GnuPG version. # errorHandling.gpgAgentError=GnuPG reported an error in the communication with gpg-agent (a component of GnuPG). # errorHandling.dirmngrError=GnuPG reported an error in the communication with dirmngr (a component of GnuPG). # errorHandling.pinentryError=GnuPG cannot query your passphrase via pinentry. # errorHandling.readFaq=This is a system setup or configuration error that prevents Enigmail from working properly and cannot be fixed automatically.\n\nWe strongly recommend that you consult our support web site at https://enigmail.net/faq. gpgNotFound=找ä¸åˆ° GnuPG 程å¼ã€Œ%Sã€ã€‚\n請確定你已經在 Enigmail å好設定中設定正確的 GnuPG 執行檔路徑。 gpgNotInPath=無法在 PATH 環境變數的路徑中找到 GnuPG。\n請確定你已經在 Enigmail å好設定中設定正確的 GnuPG 執行檔路徑。 # enigmailNotAvailable=Enigmail core Service not available prefGood=來自 %S 的有效簽章 prefBad=來自 %S 的無效簽章 failCancel=錯誤 - ä½¿ç”¨è€…å–æ¶ˆæŽ¥æ”¶é‡‘é‘° failNoServer=錯誤 - 未指定è¦å¾žå“ªå°é‡‘鑰伺æœå™¨å–得金鑰 failNoID=錯誤 - 未指定è¦ä¸‹è¼‰çš„金鑰身分 failKeyExtract=錯誤 - 金鑰解壓縮指令失敗 notFirstBlock=錯誤 -第一個 OpenPGP å€å¡Šä¸æ˜¯å…¬é‘°å€å¡Š importKeyConfirm=è¦åŒ¯å…¥è¨Šæ¯ä¸­åµŒå…¥çš„公鑰嗎? failKeyImport=錯誤 - 金鑰匯入失敗 fileWriteFailed=檔案 %S 寫入失敗 importKey=自下列金鑰伺æœå™¨åŒ¯å…¥å…¬é‘° %S: uploadKey=傳é€å…¬é‘° %S 發é€åˆ°é‡‘鑰伺æœå™¨: keyId=金鑰 ID keyAndSigDate=金鑰 ID:0x%1$S / 簽署於 %2$S keyFpr=金鑰指紋: %S noEmailProvided=未指定電å­éƒµä»¶åœ°å€ï¼ keyAlreadySigned=已經簽署éŽé€™æŠŠé‡‘鑰,您ä¸èƒ½å†æ¬¡ç°½ç½²ã€‚ ##################################################################### # Strings used in enigmailKeySelection.js ##################################################################### selKeyExpired=å·²éŽæœŸ %S createdHeader=已建立 atLeastOneKey=æœªé¸æ“‡é‡‘é‘°ï¼æ‚¨å¿…é ˆè‡³å°‘é¸æ“‡ä¸€æŠŠé‡‘é‘°æ‰èƒ½æŽ¥å—æ­¤å°è©± fewerKeysThanRecipients=æ‚¨é¸æ“‡çš„金鑰數é‡å°‘於收件者數é‡ï¼Œæ‚¨ç¢ºå®šæ­¤åŠ å¯†é‡‘é‘°æ¸…å–®æ˜¯å®Œæ•´çš„å—Žï¼Ÿ userSel.button.goBack=鏿“‡æ›´å¤šé‡‘é‘° userSel.secretKeySel.title=鏿“‡ä¸€æŠŠ OpenPGP ç§é‘°ä¾†ç°½ç½²æ‚¨çš„è¨Šæ¯ userSel.problemNoKey=無有效金鑰 userSel.problemMultipleKeys=多é‡é‡‘é‘° # should be same as thunderbird ENTITY sendLaterCmd.label: sendLaterCmd.label=ç¨å¾Œå†å¯„ # Strings used in enigmailAttachmentDialog.js # pgpMimeNote=NOTE: PGP/MIME is not supported by all email clients. If you are unsure, select the %S option. first=第一 second=第二 # Strings used in am-enigprefs.js / enigmailEditIdentity.js encryptKeyHeader=鏿“‡ç”¨ä¾†åŠ å¯†çš„ OpenPGP 金鑰 identityName=身份: %S # switchPepMode=You are currently using the 'p≡p Junior' mode of Enigmail.\n\nBy enabling OpenPGP or S/MIME for an account, you are disabling p≡p and use the 'regular' mode of Enigmail without p≡p. # enableEnigmail=&Disable p≡p # Strings used in enigmailSingleRcptSettings.js noEncryption=æ‚¨å·²ç¶“å•Ÿç”¨åŠ å¯†ï¼Œä½†æ‚¨æ²’æœ‰é¸æ“‡æ‰€ä½¿ç”¨çš„金鑰。您需è¦å¾žæ‚¨çš„金鑰清單中指定有效的金鑰來發é€åŠ å¯†éƒµä»¶çµ¦ %1$S。您是å¦è¦ç‚º %2$S å–æ¶ˆåŠ å¯†ï¼Ÿ noKeyToUse=(無 — ä¸åŠ å¯†ï¼‰ noEmptyRule=è¦å‰‡ä¸èƒ½ç‚ºç©ºï¼è«‹åœ¨è¦å‰‡æ¬„ä½ä¸­è¼¸å…¥é›»å­éƒµä»¶åœ°å€ã€‚ invalidAddress=您輸入的電å­éƒµä»¶åœ°å€ç„¡æ•ˆã€‚è«‹ä¸è¦è¼¸å…¥æ”¶ä»¶äººçš„å字,åªéœ€è¦é›»å­éƒµä»¶åœ°å€å³å¯ã€‚例如:\n無效:Some Name \n有效:some.name@address.net # noCurlyBrackets=The curly brackets {} have a special meaning and should not be used in an email address. If you want to modify the matching behavior for this rule, use the 'Apply rule if recipient ...' option.\nMore information is available from the Help button. # Strings used in enigmailRulesEditor.js never=å¾žä¸ always=總是 possible=å¯èƒ½ deleteRule=真的è¦è¦åˆ é™¤æ‰€é¸çš„è¦å‰‡å—Žï¼Ÿ nextRcpt=(下個收件者) negateRule=éž addKeyToRule=將金鑰 %1$S(%2$S)加入至收件人è¦å‰‡ # Strings used in enigmailSearchKey.js needOnline=æ‚¨é¸æ“‡çš„功能在離線模å¼ä¸‹ç„¡æ³•使用。請連線後é‡è©¦ã€‚ protocolNotSupported=ç„¡æ³•ä½¿ç”¨æ‚¨é¸æ“‡çš„通訊å”定「%S://ã€ä¾†ä¸‹è¼‰ OpenPGP 金鑰。 gpgkeysDisabled=啟用「extensions.enigmail.useGpgKeysToolã€é¸é …å¯èƒ½æœƒæœ‰å¹«åŠ©ã€‚ noKeyserverConn=無法連線至金鑰伺æœå™¨ %S。 keyDownloadFailed=從金鑰伺æœå™¨ä¸‹è¼‰é‡‘鑰失敗。錯誤資訊如下:\n%S internalError=發生內部錯誤。無法下載或匯入金鑰。 noKeyFound=很抱歉,找ä¸åˆ°ç¬¦åˆæœå°‹æ¢ä»¶çš„金鑰。\n請注æ„金鑰 ID å‰éœ€è¦åŠ  0x 字樣(例如 0xABCDEF12)。 # keyDownload.keyUnavailable=We are sorry, but the key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their key by email. # gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. gpgKeysFailed=從金鑰伺æœå™¨æœå°‹æˆ–下載金鑰失敗: 無法執行 gpgkeys_%S。 # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=設定所有人信任程度失敗 # Strings in enigmailSignKeyDlg.js signKeyFailed=金鑰簽署失敗 alreadySigned.label=註: 已使用指定的ç§é‘°ç°½ç½²é‡‘é‘° %S。 # alreadySignedexportable.label=Note: the key %S is already signed exportable with the selected secret key. A local signature does not make sense. partlySigned.label=註: å·²ä½¿ç”¨é¸æ“‡çš„ç§é‘°ç°½ç½²é‡‘é‘° %S çš„æŸäº›ä½¿ç”¨è€…身分。 # noTrustedOwnKeys=No eligible key found for signing! You need at least one fully trusted secret key in order to sign keys. # Strings in enigmailKeyManager.js keyMan.loadingKeys=金鑰載入中,請ç¨å€™â€¦ keyValid.unknown=未知 keyValid.invalid=無效 keyValid.disabled=å·²åœç”¨ keyValid.revoked=已撤銷 keyValid.expired=已失效 keyValid.noSubkey=無有效的å­é‘° keyTrust.untrusted=ä¸ä¿¡ä»» keyTrust.marginal=部分信任 keyTrust.full=å—ä¿¡ä»» keyTrust.ultimate=完全信任 keyTrust.group=(群組) keyType.public=公鑰 keyType.publicAndSec=公鑰/ç§é‘° keyMan.enableKey=啟用金鑰 keyMan.disableKey=åœç”¨é‡‘é‘° userAtt.photo=使用者屬性(JPEG 圖片) asciiArmorFile=ASCII Armored 檔案(*.asc) importKeyFile=匯入 OpenPGP 金鑰檔案 gnupgFile=GnuPG 檔案 # createKeyOK=Your Key has been generated saveRevokeCertAs=建立並儲存撤銷憑證 # revokeCertOK=The revocation certificate has been successfully created. You can use it to invalidate your public key, e.g. in case you would lose your secret key. revokeCertFailed=無法建立撤銷憑證。 addUidOK=使用者 ID 新增æˆåŠŸ addUidFailed=使用者 ID 新增失敗 noKeySelected=您需è¦é¸æ“‡è‡³å°‘一把金鑰æ‰èƒ½é€²è¡Œé¸æ“‡çš„æ“ä½œã€‚ exportToFile=導出公鑰至檔案 exportKeypairToFile=匯出公鑰與ç§é‘°è‡³æª”案 exportSecretKey=您想è¦åœ¨å„²å­˜çš„ OpenPGP 金鑰檔案中加入ç§é‘°å—Žï¼Ÿ saveKeysOK=æˆåŠŸå„²å­˜é‡‘é‘° saveKeysFailed=金鑰儲存失敗 importKeysFailed=金鑰匯入失敗 enableKeyFailed=啟(åœï¼‰ç”¨é‡‘鑰失敗 specificPubKeyFilename=%S (0x%S) 公鑰 specificPubSecKeyFilename=%S (0x%S) 公鑰-ç§é‘° defaultPubKeyFilename=匯入公鑰 defaultPubSecKeyFilename=匯入公鑰和ç§é‘° noSecretKeys=未找到ç§é‘°ã€‚\n\n是å¦è¦ç«‹åˆ»ç”¢ç”Ÿæ‚¨è‡ªå·±çš„金鑰? sendKeysOk=金鑰傳逿ˆåŠŸ sendKeysFailed=金鑰傳é€å¤±æ•— receiveKeysOk=金鑰更新æˆåŠŸ receiveKeysFailed=金鑰下載失敗 importFromClip=您想è¦å¾žå‰ªè²¼ç°¿ä¸­åŒ¯å…¥é‡‘鑰嗎? # importFromUrl=Download public key from this URL: copyToClipbrdFailed=ç„¡æ³•è¤‡è£½é¸æ“‡çš„金鑰到剪貼簿。 copyToClipbrdOK=已複製金鑰至剪貼簿。 deleteSecretKey=警告:您正è¦åˆ é™¤ä¸€æŠŠç§é‘°ï¼\n如果您删除了您的ç§é‘°ï¼Œæ‚¨å°‡ä¸å†èƒ½å¤ è§£é–‹ä»»ä½•為該ç§é‘°åŠ å¯†çš„è¨Šæ¯ï¼Œä¹Ÿå°‡ç„¡æ³•撤銷您的金鑰了。\n\n您真的è¦åˆ é™¤å…¬é‘°å’Œç§é‘°\n「%Sã€å—Žï¼Ÿ deleteMix=警告:您正è¦åˆ é™¤ä¸€å€‹ç§é‘°ï¼\n如果您删除了您的ç§é‘°ï¼Œæ‚¨å°‡ä¸å†èƒ½å¤ è§£å¯†ä»»ä½•為該ç§é‘°åŠ å¯†çš„éƒµä»¶ã€‚\n\n您真的è¦åˆ é™¤å…¬é‘°å’Œç§é‘°å°\n%S嗎? deletePubKey=您是è¦åˆ é™¤å…¬é‘°\n%S嗎? deleteSelectedPubKey=您是è¦åˆ é™¤å…¬é‘°å—Žï¼Ÿ deleteKeyFailed=無法删除金鑰。 revokeKeyQuestion=您å³å°‡æ’¤éŠ·é‡‘é‘°ã€Œ%Sã€ã€‚\n\n您將ä¸å†èƒ½ä½¿ç”¨è©²é‡‘鑰進行簽署,且一旦公開後,其他人也將ä¸å†èƒ½ä½¿ç”¨è©²é‡‘鑰進行加密。您還是能使用該金鑰解開舊訊æ¯ã€‚\n\n您è¦ç¹¼çºŒå—Žï¼Ÿ revokeKeyOk=金鑰已被撤銷。如果您的金鑰在æŸé‡‘鑰伺æœå™¨ä¸Šï¼Œå»ºè­°æ‚¨é‡æ–°ä¸Šå‚³ä¸€æ¬¡ï¼Œè®“其它人å¯ä»¥å¾—知撤銷消æ¯ã€‚ revokeKeyFailed=無法撤銷金鑰。 # revokeKeyNotPresent=You have no key (0x%S) which fits to this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before the revocation certificate! # revokeKeyAlreadyRevoked=The key 0x%S has already been revoked. refreshAllQuestion=æ‚¨å°šæœªé¸æ“‡ä»»ä½•金鑰,您是å¦è¦é‡æ–°æ•´ç†æ‰€æœ‰é‡‘鑰? # refreshKeyServiceOn.warn=Warning: Your keys are currently being refreshed in the background as safely as possible.\nRefreshing all your keys at once will unnecessarily reveal information about you.\nDo you really want to do this? refreshKey.warn=警告: 視金鑰數é‡èˆ‡é€£ç·šé€Ÿåº¦è€Œå®šï¼Œé‡æ–°æ•´ç†é‡‘é‘°å¯èƒ½è¦èŠ±ä¸Šä¸å°‘æ™‚é–“ï¼ downloadContactsKeys.warn=警告: 視è¯çµ¡äººæ•¸é‡èˆ‡é€£ç·šé€Ÿåº¦è€Œå®šï¼Œä¸‹è¼‰é‡‘é‘°å¯èƒ½è¦èŠ±ä¸€é»žæ™‚é–“ï¼ downloadContactsKeys.importFrom=è¦å¾žé€šè¨ŠéŒ„「%Sã€åŒ¯å…¥è¯çµ¡äººå—Žï¼Ÿ keyMan.button.exportSecKey=匯出ç§é‘° (&S) keyMan.button.exportPubKey=僅匯出公鑰 (&P) keyMan.button.import=匯入 (&I) keyMan.button.refreshAll=釿–°è¼‰å…¥æ‰€æœ‰é‡‘é‘° (&R) keyMan.button.revokeKey=撤銷金鑰 (&R) keyMan.button.skip=ç•¥éŽé‡‘é‘° (&S) keylist.noOtherUids=無其它身份 keylist.hasOtherUids=別å keylist.noPhotos=無相片 keylist.hasPhotos=相片 keyMan.addphoto.filepicker.title=鏿“‡è¦åŠ å…¥çš„ç›¸ç‰‡ keyMan.addphoto.warnLargeFile=æ‚¨é¸æ“‡çš„æª”æ¡ˆè¶…éŽ 25 kB。\nä¸æŽ¨è–¦æ‚¨åŠ å…¥å¤§æª”æ¡ˆï¼Œå› ç‚ºé€™æ¨£æœƒä½¿æ‚¨çš„é‡‘é‘°ä¹Ÿè®Šå¤§ã€‚ keyMan.addphoto.noJpegFile=鏿“‡çš„æª”æ¡ˆä¸æ˜¯ JPEG æª”æ¡ˆï¼Œè«‹é‡æ–°é¸æ“‡ã€‚ keyMan.addphoto.failed=無法新增相片。 # noWksIdentity=The key %S does not have a WKS identity. # keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key "%1$S (%2$S)" for encrypting messages? # keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key "%1$S (%2$S)" for future messages? # keyman.addBlacklistKey.button=&Blacklist the key # keyman.removeBlacklistKey.button=&Remove key from Blacklist # Strings in enigmailManageUidDlg.xul changePrimUidFailed=主è¦ä½¿ç”¨è€… ID 變更失敗 changePrimUidOK=主è¦ä½¿ç”¨è€… ID 變更æˆåŠŸ revokeUidFailed=用戶ID %S 撤銷失敗 revokeUidOK=å·²æˆåŠŸæ’¤éŠ·ä½¿ç”¨è€… ID %S,若您曾將金鑰上傳到金鑰伺æœå™¨ï¼Œå»ºè­°æ‚¨é‡æ–°ä¸Šå‚³ä¸€æ¬¡ï¼Œè®“其它人能夠得知金鑰已撤銷。 revokeUidQuestion=æ‚¨çœŸçš„æƒ³è¦æ’¤éŠ·ä½¿ç”¨è€… ID %S 嗎? # Strings in enigmailKeyImportInfo.xul # importInfoTitle=SUCCESS! Keys imported # importInfoBits=Bits # importInfoCreated=Created # importInfoFpr=Fingerprint # importInfoDetails=(Details) # importInfoNoKeys=No keys imported. # Strings in enigmailKeyDetailsDlg.xul keyTypePublic=公鑰 keyTypePrimary=主金鑰 keyTypeSubkey=å­é‘° keyTypePair=é‡‘é‘°å° keyExpiryNever=å¾žä¸ keyAlgorithm_1=RSA keyAlgorithm_2=RSA keyAlgorithm_3=RSA keyAlgorithm_16=ELG keyAlgorithm_17=DSA keyAlgorithm_18=ECC keyAlgorithm_19=ECC keyAlgorithm_20=ELG # keyAlgorithm_22=EDDSA keyUsageEncrypt=加密 keyUsageSign=簽署 keyUsageCertify=ç¢ºèª keyUsageAuthentication=é©—è­‰ # keyDoesNotExpire=Key does not expire # Strings in enigmailGenCardKey.xul keygen.started=è«‹ç¨å€™é‡‘鑰產生… keygen.completed=已產生金鑰。新金鑰 ID 為: 0x%S keygen.keyBackup=已備份金鑰至 %S keygen.passRequired=如果您需è¦åœ¨æ™ºæ…§å¡å¤–åšé‡‘鑰備份,請指定一組密語。 # Strings in enigmailSetCardPin.xul cardPin.processFailed=PIN 碼修改失敗 # Strings in enigRetrieveProgres.xul keyserverProgress.refreshing=æ­£åœ¨é‡æ–°æ•´ç†é‡‘鑰,請ç¨å€™â€¦ keyserverProgress.uploading=正在上傳金鑰,請ç¨å€™â€¦ # keyserverProgress.wksUploadFailed=Could not upload your key to the Web Key Service # keyserverProgress.wksUploadCompleted=Your public key was successfully submitted to your provider. You will receive an email to confirm that you initiated the upload. keyserverTitle.refreshing=釿–°æ•´ç†é‡‘é‘° keyserverTitle.uploading=上傳金鑰 # Strings in enigmailSetupWizard passphrase.min8keys=最少應有 8 å­—å…ƒçš„å¯†èªžï¼ setupWizard.reallyCancel=您確定è¦é—œé–‰ Enigmail 設定精éˆå—Žï¼Ÿ setupWizard.invalidGpg=æ‚¨æŒ‡å®šçš„æª”æ¡ˆä¸æ˜¯ GnuPG 執行檔,請指定å¦ä¸€å€‹æª”案。 setupWizard.specifyFile=您需è¦è‡³å°‘指定一個公鑰檔案æ‰èƒ½ç¹¼çºŒã€‚ setupWizard.installFailed=看來安è£ä¸¦æœªæˆåŠŸï¼Œè«‹é‡è©¦å®‰è£ç¨‹å¼ï¼Œæˆ–æ‰‹å‹•å®‰è£ GnuPG 並用ç€è¦½æŒ‰éˆ•手動尋找該程å¼ã€‚ # setupWizard.downloadForbidden=For your own security, we will not download GnuPG. Please visit https://gnupg.org/ in order to download GnuPG. # setupWizard.downloadImpossible=We cannot download GnuPG currently. Please try later or visit https://gnupg.org/ in order to download GnuPG. setupWizard.hashSumError=本精éˆç„¡æ³•驗證已下載檔案的完整性,此檔案å¯èƒ½å·²ææ¯€æˆ–被竄改。您還è¦ç¹¼çºŒå®‰è£å—Žï¼Ÿ # setupWizard.importSettingsFile=Specify backup file to load from # setupWizard.invalidSettingsFile=The specified file is not a correct Enigmail Settings backup file. # setupWizard.gpgConfExists=The GnuPG config file already exists. Do you want to overwrite it with the one from your old installation? # setupWizard.noGpgHomeDir=It appears that you configured %S to use for GnuPG. However, this is not a directory - you cannot use it. # setupWizard.unmachtedIds=The following identities of your old setup could not be matched:\n%S\nThe settings for these identities were skipped. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=嘗試下載 GnuPG 時發生錯誤,若需更多資訊,請檢查主控å°çš„記錄。 installGnuPG.installFailed=å®‰è£ GnuPG 時發生錯誤,若需更多資訊,請檢查主控å°çš„記錄。 # Strings in enigmailAddUidDlg.xul addUidDlg.nameOrEmailError=您需è¦è¾“入一個å字和一個電å­éƒµä»¶åœ°å€ addUidDlg.nameMinLengthError=åå­—è‡³å°‘éœ€è¦æœ‰ 5 個字元 addUidDlg.invalidEmailError=æ‚¨å¿…é ˆæŒ‡å®šä¸€å€‹æœ‰æ•ˆçš„éƒµç®±åœ°å€ # Strings in enigmailCardDetails.js Carddetails.NoASCII=OpenPGP 智慧å¡åƒ…支æ´åœ¨å§“忬„ä½ä¸­ä½¿ç”¨ ASCII 字元。 # network error types errorType.SecurityCertificate=ç¶²é æœå‹™æä¾›çš„安全性憑證無效。 errorType.SecurityProtocol=ç¶²é æœå‹™ä½¿ç”¨æœªçŸ¥çš„安全通訊å”定。 errorType.Network=發生網路錯誤。 # filter stuff filter.folderRequired=æ‚¨å¿…é ˆé¸æ“‡ç›®çš„資訊夾。 filter.decryptMove.label=永久解密(Enigmail) filter.decryptCopy.label=建立已解密的副本(Enigmail) filter.decryptMove.warnExperimental=è­¦å‘Šï¼šéŽæ¿¾å™¨è¡Œç‚ºã€Œæ°¸ä¹…解密ã€å¯èƒ½æœƒæ¯€æè¨Šæ¯ã€‚\n\n我們強烈建議您先使用「建立已解密的副本ã€éŽæ¿¾å™¨ï¼Œå°å¿ƒæ¸¬è©¦ä¸€ä¸‹çµæžœï¼Œç¢ºèªçµæžœæ»¿æ„後å†ä½¿ç”¨ã€Œæ°¸ä¹…解密ã€éŽæ¿¾å™¨ã€‚ # filter.tempPepFilterDesc=Temporary filter to store sent message unencrypted # filter.term.pgpencrypted.label=OpenPGP Encrypted # filter.encrypt.label=Encrypt to key (Enigmail) # filter.keyRequired=You must select a recipient key. # filter.keyNotFound=Could not find an encryption key for "%S". # filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for "%S" you will no longer be able to read the emails. # strings in enigmailConvert.jsm converter.decryptBody.failed=無法解密主旨為「%Sã€çš„訊æ¯ã€‚\n\n您想è¦ä½¿ç”¨ä¸åŒçš„密語å†è©¦ä¸€æ¬¡ï¼Œæˆ–是跳éŽè©²è¨Šæ¯ï¼Ÿ converter.decryptAtt.failed=無法解密主旨為「%2$Sã€è¨Šæ¯çš„附件「%1$Sã€ã€‚\n\n您想è¦ä½¿ç”¨ä¸åŒçš„密語å†è©¦ä¸€æ¬¡ï¼Œæˆ–是跳éŽè©²è¨Šæ¯ï¼Ÿ saveLogFile.title=儲存紀錄檔 # strings in gpg.jsm # unknownSigningAlg=Unknown signing algorithm (ID: %S) # unknownHashAlg=Unknown cryptographic hash (ID: %S) # strings in keyRing.jsm # keyring.photo=Photo # keyRing.pubKeyRevoked=The key %1$S (key ID %2$S) is revoked. # keyRing.pubKeyExpired=The key %1$S (key ID %2$S) has expired. # keyRing.pubKeyNotForSigning=The key %1$S (key ID %2$S) cannot be used for signing. # keyRing.pubKeyNotForEncryption=The key %1$S (key ID %2$S) cannot be used for encryption. # keyRing.keyDisabled=The key %1$S (key ID %2$S) is disabled; it cannot be used. # keyRing.keyNotTrusted=The key %1$S (key ID %2$S) is not trusted enough. Please set the trust level of your key to "ultimate" to use it for signing. # keyRing.keyInvalid=The key %1$S (key ID %2$S) is not valid. Please consider verifying it correctly. Alternatively use the Default encryption settings in the Enigmail preferences dialog. # keyRing.signSubKeysRevoked=All signing-subkeys of key %1$S (key ID %2$S) are revoked. # keyRing.signSubKeysExpired=All signing-subkeys of key %1$S (key ID %2$S) have expired. # keyRing.signSubKeysUnusable=All signing-subkeys of key %1$S (key ID %2$S) are revoked, expired or otherwise unusable. # keyRing.encSubKeysRevoked=All encryption subkeys of key %1$S (key ID %2$S) are revoked. # keyRing.encSubKeysExpired=All encryption subkeys of key %1$S (key ID %2$S) have expired. # keyRing.noSecretKey=You do not seem to have the secret key for %1$S (key ID %2$S) on your keyring; you cannot use the key for signing. # keyRing.encSubKeysUnusable=All encryption subkeys of key %1$S (key ID %2$S) are revoked, expired or otherwise unusable. #strings in exportSettingsWizard.js # cannotWriteToFile=Cannot save to file '%S'. Please select a different file. # dataExportError=An error occurred during exporting your data. # enigmailSettings=EnigmailSettings # defaultBackupFileName=Enigmail-export # specifyExportFile=Specify file name for exporting # homedirParamNotSUpported=Additional params that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. #strings in expiry.jsm # expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use the new key. # expiry.keysExpireSoon=The following of your keys will expire in less than %1$S days:\n%2$S We recommend that you create new keys and configure your accounts to use the new keys. # expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to ultimate in key properties. # expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to ultimate in key properties. # expiry.OpenKeyManager=Open Enigmail Key Management # expiry.OpenKeyProperties=Open Key Properties #strings in pEpDecrypt.jsm # pEpDecrypt.cannotDecrypt=This is an encrypted message. Unfortunately you don't have the secret key to decrypt the message. #strings in gpgAgent.jsm # gpghomedir.notexists=The directory '%S' containing your OpenPGP keys does not exist and cannot be created. # gpghomedir.notwritable=The directory '%S' containing your OpenPGP keys is not writable. # gpghomedir.notdirectory=The directory '%S' containing your OpenPGP keys is a file instead of a directory. # gpghomedir.notusable=Please fix the directory permissions or change the location of your GnuPG "home" directory. GnuPG cannot work correctly otherwise. #strings in pepTrustWords.js # pepTrustWords.cannotVerifyOwnId=Cannot verify p≡p Trustwords for own account. # pepTrustWords.cannotFindKey=Cannot find key for %S. # pepTrustWords.cannotStoreChange=Could not change trust for %S. # pepTrustWords.generalFailure=Cannot obtain trustwords for %S. # pepTrustWords.partnerFingerprint=Fingerprint for %S: #strings in mimeWkdHandler.jsm # wkdMessage.body.req=Your email provider processed your request to upload your public key to the OpenPGP Web Key Directory.\n\nPlease click the confirmation button in the Enigmail header to complete the publishing of your public key. # wkdMessage.body.process=This is an email related to the automatic processing to upload your public key to the OpenPGP Web Key Directory.\n\nYou do not need to take any manual action at this point. #strings in pepHandshake.js # pepPrivacyStatus.RatingBrokenSuggestion=Either you or the sender should resend the message. # pepPrivacyStatus.RatingHaveNoKeySuggestionOutgoing=If you composed this message, your key is not available. # pepPrivacyStatus.RatingMistrustSuggestion=Re-establish the connection with your communication partner and try to complete another handshake. # pepPrivacyStatus.RatingReliableSuggestion=Complete a handshake with your communication partner by exchanging trustwords in person or over the phone. A handshake is needed only once per partner and will ensure secure and trusted communication. # pepPrivacyStatus.RatingTrustedSuggestion=No action needed! # pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware this message may not be secure. # pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Please add the necessary information. # pepPrivacyStatus.RatingUnderAttackSuggestion=Separately verify the content of this message with your communication partner. # pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least secure. # pepPrivacyStatus.RatingUnencryptedSuggestion=Please ask your communication partner to use an encryption solution or install p≡p. # pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or no signature. Ask your communication partner to upgrade their encryption solution or install p≡p. # pepPrivacyStatus.RatingBrokenExplanation=This message has broken encryption or formatting. # pepPrivacyStatus.RatingHaveNoKeyExplanation=This message cannot be decrypted because the key is not available. # pepPrivacyStatus.RatingMistrustExplanation=This message has a communication partner that has previously been marked as mistrusted. # pepPrivacyStatus.RatingReliableExplanation=This message is secure but you still need to verify the identity of your communication partner. # pepPrivacyStatus.RatingTrustedExplanation=This message is secure and trusted. # pepPrivacyStatus.RatingUndefinedExplanation=This message does not contain enough information to determine if it is secure. # pepPrivacyStatus.RatingUnderAttackExplanation=This message is not secure and has been tampered with. # pepPrivacyStatus.RatingUnencryptedExplanation=This message is unsecure. # pepPrivacyStatus.RatingUnencryptedForSomeExplanation=This message is unsecure for some communication partners. # pepPrivacyStatus.RatingUnreliableExplanation=This message has unreliable protection. # pepPrivacyStatus.RatingBrokenText=Broken # pepPrivacyStatus.RatingHaveNoKeyText=Cannot Decrypt # pepPrivacyStatus.RatingMistrustText=Mistrusted # pepPrivacyStatus.RatingReliableText=Secure # pepPrivacyStatus.RatingTrustedText=Secure & Trusted # pepPrivacyStatus.RatingUndefinedText=Unknown # pepPrivacyStatus.RatingUnderAttackText=Under Attack # pepPrivacyStatus.RatingUnencryptedForSomeText=Unsecure for Some # pepPrivacyStatus.RatingUnencryptedText=Unsecure # pepPrivacyStatus.RatingUnreliableText=Unreliable Security # handshakeDlg.button.initHandshake=Handshake... # handshakeDlg.button.stopTrust=Stop Trusting # handshakeDlg.button.reTrust=Stop Mistrusting # handshakeDlg.label.outgoingMessage=Outgoing message # handshakeDlg.label.incomingMessage=Incoming message # handshakeDlg.error.noPeers=Cannot handshake without any correspondents. # handshakeDlg.error.noProtection=Please enable protection in order to use the Handshake function. # enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device # enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup #strings in autocrypt.jsm # autocrypt.setupMsg.subject=Autocrypt Setup Message # autocrypt.setupMsg.msgBody=To set up your new device for Autocrypt, please follow the instuctions that should be presented by your new device. # autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code presented on your old device, and then import the contained key into your keyring. #strings in upgradeInfo.html # upgradeInfo.doctitle=What's New in Enigmail v2.0? # upgradeInfo.welcome1=Welcome to the new Enigmail version 2.0! # upgradeInfo.welcome2=The release contains a lot of new and changed features. Please take a minute to find out what's new: # upgradeInfo.encSubject.title=Encrypting the Message Subject # upgradeInfo.encSubject.desc=We developed a new method that moves the email subject into the encrypted message, and replaces the visible subject with "Encrypted Message". Once such a message is decrypted, the original subject is replaced automatically. Hiding the subject is on by default; there is a preference to turn it off if you don't like it. (Note: this feature requires the message to be sent with PGP/MIME.) # upgradeInfo.buttons.title=Changed behavior of Encrypt and Sign Buttons # upgradeInfo.buttons.desc=The Encrypt and Sign buttons in the message composer window now work for both the OpenPGP and S/MIME protocols. If both algorithms are possible, then Enigmail will try to prefer the one for which all keys are available. # upgradeInfo.autocrypt.title=Support for Autocrypt # upgradeInfo.autocrypt.desc=Enigmail now supports Autocrypt, a new standard to distribute keys as part of sent messages. Enigmail automatically imports keys from Autocrypt-compliant messages, such that over time more and more emails can be encrypted. # upgradeInfo.pEp.title=New p≡p Junior Mode (Pretty Easy Privacy) # upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. You currently need to manually install p≡p for this purpose; this will change in a future release. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. # upgradeInfo.bottom.desc=Please visit our documentation for help on using Enigmail. # pep.missingGnuPG=In order to use Enigmail/p≡p, GnuPG is required. As we could not find it, we suggest to download and install it for you. #strings in enigmailAbout.html # aboutEnigmail.tabName=About Enigmail # aboutEnigmail.title=OpenPGP support provided by Enigmail # aboutEnigmail.team=Enigmail is developed by the Enigmail Team: # aboutEnigmail.projectLeader=Lead Developer: # aboutEnigmail.usability=Usability: # aboutEnigmail.documentation=Documentation: # aboutEnigmail.testing=Testing: # aboutEnigmail.userSupport=User Support: # aboutEnigmail.localization=Localization: See the Enigmail Language Packs page # aboutEnigmail.Credits=Credits: # aboutEnigmail.origAuthor=Original author of the Enigmail extension # aboutEnigmail.icons=Icons: # aboutEnigmail.formerMembers=Former team members: # aboutEnigmail.projectHosting=Project hosting: # aboutEnigmail.licenseSupportTitle=License & Support # aboutEnigmail.license=Enigmail OpenPGP is open source and licensed under the %S # aboutEnigmail.support=Support and download is available from www.enigmail.net. enigmail-2.0.8/lang/zh-TW/enigmail.properties.big5000066400000000000000000000146541334302754500217500ustar00rootroot00000000000000Enigmail=Enigmail # Strings used within enigmailCommon.js enigAlert=Enigmail ³qª¾ enigConfirm=Enigmail ½T»{ enigError=Enigmail ¿ù»~ enigPrompt=Enigmail ´£¥Ü dlgYes=½T©w dlgNo=§_ dlgNever=¤U¦¸¤£¶·¦A°Ý§Ú specifyEmail=½Ð«ü©w±zªº¥D­n¶l§}¥H¥Î©óñÃÒ±H¥X¶l¥ó®É¨Ï¥Î¡C\n ¦pªG±z­n¥Î¡§±H¥X¡¨ªº¶l§}§@¬°Ã±ÃÒ½Ð§â¦¹Äæ¸mªÅ¡C\n\nª`·N¡GEnigmail 0.60 ¥H¤W¤w§â default signing key ³o§t½kªº¿ï¶µ¥h°£. usingFrom=¡§±H¥X¡¨¶l§}±N·|¥Î©óñÃÒ±H¥Xªº¶l¥ó usingId=¨Ï¥ÎªÌ %S ±N·|¥Î©óñÃÒ±H¥Xªº¶l¥ó configNow=±z­n¬° enigmail %S ¶i¦æ³]©w¶Ü¡H configEnigmail=³]©w Enigmail¡H turnOffFlowed=Mozilla ¤¤ªº Allow flowed text (RFC 2646) ¬O¹w¸m¿ï¶µ¡C\n¦ý«o·|¦b¶i¦æ¥Í¯Â¤å¦rªº¶l¥ó¶i¦æÃ±¦W»{ÃҮɵo¥Í°ÝÃD¡C\n©Ò¥H§Ú­Ì«ØÄ³§â¦¹¼¶¶µÃö¤W¡C\n\n±z­n Enigmail ¬°±z°õ¦æÃö³¬¡@Allow flowed text (RFC 2646) ³o­Ó¿ï¶µ¶Ü? repeatPrefix=\n\n¦¹´£¥Ü±N·|¦A¥X²{%S repeatSuffixSingular=¦¸¡C repeatSuffixPlural=¦¸¡C noRepeat=\n\n¦¹´£¥Ü±N¤£·|¦A¥X²{­P¨ì§A¤U¦¸§ó·s Enigmail¡C noLogDir=½Ð¬°¶i¶¥°¾¦n³]©w¤¤ªº¤é»x¸ô®|¶i¦æ³]©w¥H«K·s¼W¤é»xÀÉ noLogFile=¤é»xÀɮפ£¦s¦b¡I restartForLog=½Ð­«·s±Ò°Ê Mozilla ¥H«K·s¼W¤é»xÀÉ # Strings in enigmailAbout.js usingVersion=Enigmail %S ¦b°õ¦æ¤¤ versionWarning=ĵ§i¡GEnigMime ª©¥» %S ¤£¨ó½Õ enigmimeWarning=ĵ§i¡G EnigMime ¼Ò²Õ¤£¦s¦b usingAgent=¨Ï¥Î %S °õ¦æÀÉ %S ¥H¥[±K©Î¸Ñ±K agentError=¿ù»~¡G¤£¯à¦s¨ú enigmail ¥¢±Ñ¡I # Strings in enigmailKeygen.js accessError=¦s¨ú enigmail ¥¢±Ñ onlyGPG=²£¥Í·sªºÆ_°Í¥u¯à¦bGPG¤¤¨Ï¥Î¡]PGP ±N¤£¯à¨Ï¥Î¡^¡I genComplete=²£¥Í·sªºÆ_°Í§¹¦¨¡I\n¨Ï¥ÎªÌÆ_°Í <%S> ±N·|¦b¥¼¨Ó¥Î©ó¥[±K©ÎñÃÒ genCompleteNoSign=²£¥Í·sªºÆ_°Í§¹¦¨¡I genGoing=²£¥Í·sªºÆ_°Í¥¿¦b¶i¦æ¤¤¡I passNoMatch=¿é¤Jªº±K½X¤£¬Û¦P¡A½Ð­«¿é¤J passCheckBox=¤£¥Î±K½X½Ð¿ï¾Ü¦¹¶µ passUserName=¦¹»{ÃÒªº¨Ï¥ÎªÌ¦WºÙ¬° keyConfirm=­n¬°'%S'²£¥Íªº¤½¶}©MÁô±KªºÆ_°Í¶Ü¡H keyAbort=¤¤¤îÆ_°Í²£¥Í¶Ü¡H # Strings in enigmailMessengerOverlay.js securityInfo=OpenPGP ¦w¥þ¸ê°T\n\n enigHeader=Enigmail: enigNote=Note from Enigmail: Attachments to this message have not been signed or encrypted. enigContentNote=Enigmail: *Attachments to this message have not been signed or encrypted*\r\n\r\n # Make Comment due to this translation will not display right. # enigNote=Enigmail:¦¹¶l¥ó¤¤ªºªþ¥ó¨Ã¨S¦³¸g¹L¥[±K©ÎñÃÒ¡C # enigContentNote=Enigmail: *¦¹¶l¥ó¤¤ªºªþ¥ó¨Ã¨S¦³¸g¹L¥[±K©ÎñÃÒ*\r\n\r\n noDecrypted=¨S¦³¥i¸Ñ½Xªº«H®§¥i¥HÀx¦s¡I\n½Ð¦bÀɮץؿý¿ï¥ÎÀx¦s noMessage=¨S¦³«H®§¥i¥HÀx¦s¡I useButton=½Ð¦b¥Ø¿ý¤¤¿ï¾Ü¸Ñ½X»Pñ¦W»{ÃÒ¥H¸Ñ½X saveHeader=Enigmail¡GÀx¦s¸Ñ½X«áªº«H®§ # Strings in enigmailMsgComposeOverlay.js keysToExport=¶×¥X¨Ï¥ÎªÌªº¤½¶}Æ_°Íªº¶l§} exportPrompt=Enigmail Æ_°Í¶×¥X pubKey=%S¨Ï¥ÎªÌ¤½¶}Æ_°Í\n windowLocked=½s¼g¶l¥ó¤w³Q¾P©w¡A±H¥X³Q¨ú®ø sendUnencrypted=Enigmail±Ò°Ê¥¢±`¡C\n±H¥X¥¼¥[±Kªº¶l¥ó¶Ü¡H composeSpecifyEmail=½Ð«ü©w±zªº¥D­n¶l§}¥H¥Î©óñÃÒ±H¥X¶l¥ó®É¨Ï¥Î¡C\n ¦pªG±z­n¥Î¡§±H¥X¡¨ªº¶l§}§@¬°Ã±ÃÒ½Ð§â¦¹Äæ¸mªÅ¡C sendingBCC=¦¹¶l¥ó¦³Áô±K¦¬«HªÌBCC¡C¦pªG¥[±K¦¹¶l¥ó©Ò¦³ªº¦¬«HªÌ³£¥i¥H³q¹LÀ˹î¥[±KÆ_°Í¦W³æ±oª¾½Ö¬OÁô±K¦¬«HªÌ­P¨ÏÁô±K«O¦w¥¢®Ä¡C\n\n«ö½T©w¥HÄ~ÁZ¥[±K©Î¨ú®ø¤¤¤î±H¥X¡C sendingNews=¥[±K±H¥X¤¤¤î.\n\n¥Ñ©ó¦³·s»D²Õªº¦s¦b¦¹¶l¥ó¤£¯à¥[±K¡C½Ð¥Î¤£¥[±Kªº¤èªk­«·s±H¥X¡C sendingPGPMIME=¶l¥ó¤¤ªºªþ¥ó¤]·|¤@°_ªº³Q¥[±K©ÎñÃÒ¡A¥u¦³¯à¤ä´©PGP/MIME®æ¦¡ªº¹q¶lµ{¦¡¥i¥HŪ¨ú¦¹Ãþ¶l¥ó¡C¤wª¾ªº¤ä´©¹q¶lµ{¦¡¦³ Enigmail, Evolution, and Mutt¡C\n «ö½T©w¥HÄ~ÁZ¨Ï¥ÎPGP/MIME®æ¦¡©Î¨ú®ø¨Ï¥Î´O¤J®æ¦¡±H¥X¡C noPGPMIME=PGP/MIME¤£¦s¦b¡I\n ¥Î´O¤J®æ¦¡¥[±K©ÎñÃÒ¡H hasHTML=HTML ¶l¥óĵ§i¡G\n¦¹¶l¥ó±a¦³HTML®æ¦¡³o¥i¯à·|¨Ï¨ì¥[±K©ÎñÃÒ¥¢±Ñ¡C¬°¤FÁ×§K¦¹Ãþ°ÝÃDªºµo¥Í±z¥i¥H¦b±H¥X©Î¦^Âжl¥ó®É«ö¤USHIFTÁä¥H±H¥XñÃÒªº¶l¥ó¡C\n¦pªG±z¬O¹w¸m¥[±K©ÎñÃÒ±H¥X¶l¥ó±zÀ³¸Ó¦b¨ú®ø¿ï¾Ü½s¼gHTML®æ¦¡¶l¥ó¿ï¶µ¥H¨ú®øHTML®æ¦¡ªº¶l¥ó¡C strippingHTML="¶l¥ó¤¤§t¦³ªº®æ¦¡HTML±N·|¦bÂà´«¦¨¯Â¤å¦r®æ¦¡¥[±K©ÎñÃҮɥ¢®Ä¡C±z­nÄ~ÁZ¶Ü¡H sendAborted=±H¥X¤¤¤î¡C\n\n statPGPMIME=PGP/MIME statSigned=¤wñÃÒ statEncrypted=¤w¥[±K statPlain=¯Â¤å¦r offlineSave=Àx¦s %S ¶l¥ó %S ¨ì¥¼±H¥Xªº¶l¥ó¶Ü¡H onlineSend=±H¥X %S ¶l¥ó¨ì %S¶Ü¡H offlineNote=§A²{¦b¥¿¨Ï¥ÎÂ÷½u¼Ò¦¡¡C­nÀx¦s¦¹¶l¥ó¨ì¥¼±H¥Xªº¶l¥ó¶Ü¡H signFailed=Enigmailµo¥Í¿ù»~¡A¥[±K©ÎñÃÒ¥¢±Ñ­n±H¥X¥¼¥[±Kªº¶l¥ó¶Ü¡H # Strings in enigmailMsgHdrViewOverlay.js keyNeeded=»Ý­n¤½¶}Æ_°Í½s¸¹ %S ¥H§@ñ¦W»{ÃÒ clickDecrypt=¡F«ö¤U¡u¸Ñ±K¡vÁä clickDecryptRetry=¡F«ö¤U¡u¸Ñ±K¡vÁä­«¸Õ clickPen=¡F«ö¤Uµ§¹Ï¡H clickPenDetails=¡F«ö¤UÂ_µ§¹Ï¨ú±o¸Ô²Óªº¸ê®Æ¡H clickQueryPenDetails=¡F«ö¤Uµ§¹Ï¨ú±o¸Ô²Óªº¸ê®Æ¡H clickKey=¡F«ö¤UÂ_Æ_°Í¹Ï¡H clickKeyDetails=¡F«ö¤UÂ_Æ_°Í¹Ï¨ú±o¸Ô²Óªº¸ê®Æ¡H reloadImapMessage=­«·s¸ü¤J§¹¾ãªºIMAP¶l¥ó¥H¶i¦æ¸Ñ½X»Pñ¦W»{ÃÒ¡H reloadImapError=¿ù»~¡ÐIMAP¶l¥ó¹L¤jµLªk¶i¦æ¸Ñ½X»Pñ¦W»{ÃÒ unverifiedSig=¥¼»{ÃÒªºÃ±¦W incompleteDecrypt=¸Ñ±K¤£§¹¾ã failedSig=¿ù»~¡Ðñ¦W»{ÃÒ¥¢±Ñ needKey=¿ù»~¡Ð»Ý­nÁô±KªºÆ_°Í¥H¶i¦æ¶l¥ó¸Ñ½X failedDecrypt=¿ù»~¡Ð¸Ñ½X¥¢±Ñ badPhrase=¿ù»~¡Ð±K½X¿ù»~ failedDecryptVerify=¿ù»~¡Ð¸Ñ½X»Pñ¦W»{ÃÒ¥¢±Ñ viewInfo=; View > Message security info for details decryptedMsg=¤w¸Ñ½XÊú¶l¥ó # Strings in enigmailNavigatorOverlay.js navEncryptError=¥[±K©ÎñÃҮɥ¢±Ñ¡C\n navDecryptError=¸Ñ½X®É¥¢±Ñ¡C\n # Strings in pref-enigmail-adv.js testNoSvc=EnigTest¡GEnigmail ¦s¨ú¥¢±Ñ testNoEmail=EnigTest¡G½Ð¿é¤J¶l§}¥H«K´ú¸Õ # Strings in pref-enigmail.js uninstallConfirm=±z¯uªº­n§R°£©Ò¦³¦bMozilla component ©M chrome ¥Ø¿ý¤º»P EnigMail ¦³ÃöªºÀÉ®×¶Ü¡H uninstallFailOverlay=¥Ñ©óÂл\ªºRDF²¾°£ EnigMail ¥¢±Ñ¡F¤£§R°£ chrome jar ÀÉ®× uninstallFailDelete=§R°£Àɮ׮ɵo¥Í°ÝÃD uninstallFail=²¾°£ EnigMail ¥¢±Ñ uninstallSuccess=EnigMail ¤w³Q²¾°£ # Strings used in components/enigmail.js # (said file also re-uses some strings given above) enterPass=½Ð¿é¤J±z %S ªº±K½X rememberPass=°O¾Ð %S ¤ÀÄÁ notInit=¿ù»~¡ÐEnigmail ÁÙ¥¼ªì©l¤Æ badCommand=¿ù»~¡Ð¥[¸Ñ«ü¥O¥¢±Ñ cmdLine=«ü¥O¼Ò¦¡©M¿é¥X¡G notRequired=¿ù»~¡Ð¤£¶·¥[±K notComplete=¿ù»~¡Ð²£¥ÍÆ_°Í¥¼§¹¦¨ invalidEmail=¿ù»~¡Ð¤£¥¿½Tªº¶l§} noPassphrase=¿ù»~¡ÐµL±K½X´£¨Ñ noPGPblock=¿ù»~¡Ð¨S¦³¤å¦r¦¡ªº PGP ¸ê®Æ decryptToImport=«ö¤U¸Ñ½X¥H¶×¤J¶l¥ó¤ºªº¤½¶}Æ_°Í extraText=ªþ¥[¤å¦r¤¤§t¦³§ó¦hªº PGP ¸ê®Æ¡C«ö¤U¸Ñ±KÁä toVerify=¥Hñ¦W»{ÃÒ¡C sigMismatch=¿ù»~¡Ðñ¦W»{ÃÒ¥¢°t cantImport=¶×¤J¤½¶}Æ_°Í¥¢±Ñ\n\n prefUntrusted=¤£³Q«H¥ôªº prefRevoked=¤w¼o°£ªº prefExpiredKey=¹O´ÁªºÆ_°Í prefExpired=¹O´Áªº prefGood=¦¨¥\»{ÃÒ%SªºÃ±¦W prefBad=¥¢±Ñ»{ÃÒ%SªºÃ±¦W failFingerprint=¿ù»~¡Ðªö«ü¯¾«ü¥O¥¢±Ñ failMultiple=¿ù»~¡Ð%S¦³¦h­Ó¤½¶}Æ_°Í failNoKey=¿ù»~¡Ð§ä¤£¨ìªº%S¤½¶}Æ_°Í failOnlyGPG=¿ù»~¡Ð¥u¦³GPGÆ_°Í¥i¥H±qÆ_°Í¦øªA¾¹¤¤¨ú±o failCancel=¿ù»~¡Ð±qÆ_°Í¦øªA¾¹¤¤¨ú±oÆ_°Í³Q¨Ï¥ÎªÌ¨ú®ø failNoServer=¿ù»~¡Ð¨S¦³«ü©wªºÆ_°Í¦øªA¾¹¥H¨ú±oÆ_°Í failNoID=¿ù»~¡Ð¨S¦³«ü©wªºÆ_°Í½s¸¹ failKeyExtract=¿ù»~¡ÐÆ_°Í¨ú±o«ü¥O¥¢±Ñ notFirstBlock=¿ù»~¡Ð²Ä¤@ PGP¸ê®Æ«D¤½¶}Æ_°Í¸ê®Æ importKeyConfirm=¦bªº´O¤Jªº¶l¥ó¤¤¶×¤J¤½¶}Æ_°Í importKey=±q¶×¤JÆ_°Í¦øªA¾¹¤½¶}Æ_°Í½s¸¹%S enigmail-2.0.8/lang/zh-TW/help/000077500000000000000000000000001334302754500161365ustar00rootroot00000000000000enigmail-2.0.8/lang/zh-TW/help/compose.html000066400000000000000000000100761334302754500204750ustar00rootroot00000000000000 Enigmail Help: Message Composition

Enigmail Help

Using Enigmail when composing messages

Enigmail menu in Mail/Compose window
Sign message
Enable/Disable sending signed mail. User is notified, if signing fails.
Encrypt message

Enable/Disable encryption to all recipient(s) before sending. User is notified, if encryption fails.

If Display selection when necessary is set in Preferences -> Key Selection tab, a list of keys will pop up if there are addresses in the list of recipients for the message for whom you have no public key.

If Never display OpenPGP key selection dialog is set in Preferences -> Key Selection tab, and there are addresses in the list of recipients for the message for whom you have no public key, the message will be sent unencrypted.

Use PGP/MIME for this message
Enable/Disable the use of PGP/MIME for this message.

If you know the recipient(s) can read mail using the PGP/MIME format, you should use it.

This feature is dependent on the settings in Preferences -> PGP/MIME tab being set to Allow to use PGP/MIME or Always use PGP/MIME.

Default composition options
  • Signing/Encryption Options...: shortcut to Account Settings -> OpenPGP Options.
  • Send options...: shortcut to Preferences -> Send tab.
  • Key selection options...: shortcut to Preferences -> Key Selection tab.
  • PGP/MIME options...: shortcut to Preferences -> PGP/MIME tab.
Undo encryption

If there is a failure when actually sending mail, such as the POP server not accepting the request, Enigmail will not know about it, and the encrypted message will continue to be displayed in the Compose window. Choosing this menu item will undo the encryption/signing, reverting the Compose window back to its original text.

As a temporary fix, this option may also be used to decrypt the quoted text when replying to encrypted messages. Enigmail should automatically decrypt the quoted message, but if that fails for some reason, you can use this menu item to force it.

Insert public key
insert ASCII-armored public key block at the current cursor location in the Compose window. You will be prompted for the email addresses of the key(s) to be inserted. Keys inserted in this manner will automatically be recognized at the receiving end by Enigmail. After key insertion, you may still choose to sign/encrypt the mail as needed. Also, do not insert more than one key block in a message; just specify multiple email addresses, separated by commas or spaces, when prompted.
Clear save passphrase
Clears cached passphrase. Useful if you have multiple passphrases.
Help
Displays Help information from the website (this page).

Further help is available on the Enigmail Help web page

enigmail-2.0.8/lang/zh-TW/help/editRcptRule.html000066400000000000000000000115601334302754500214350ustar00rootroot00000000000000 Enigmail Help: Edit OpenPGP Rule

Enigmail Help

Using the Enigmail Rules Editor: Edit OpenPGP Rule

In the Rules Editor, you can specify defaults per recipient for enabling encryption, signing and PGP/MIME, and to define what OpenPGP key(s) to use. In this dialog, you can specify the rules for a single recipient, and for a group of recipients with very similar attributes.

Set OpenPGP Rules for
Contains the email addresses of the recipients (without names, i.e. just an address like somebody@email.domain). You can specify several email addresses, separated by spaces. The address specified here can consist of only the domain section so that mail to any address at that domain will be matched, e.g. @email.domain will allow matching to body@email.domain, somebody@email.domain, anybody@email.domain, etc.
Apply rule if recipient ...
This modifies the matching of the email addresses. If multiple addresses are entered, the setting will apply to all. The examples below are based on body@email.domain entered in the OpenPGP Rules field above.
  • Is exactly: with this setting, the rule will only trigger on emails to body@email.domain (exact, case insensitive matching).
  • Contains: with this setting, any email address containing the string is matched, e.g. anybody@email.domain or body@email.domain.net
  • Begins with: with this setting, any email address starting with the string is matched, e.g. body@email.domain.net, body@email.domain-name.com.
  • Ends with: with this setting, any email address ending with the string is matched, e.g. anybody@email.domain , somebody@email.domain.
Continue with the next rule for the matching address
Enabling this function will allow you to define a rule but not have to specify a KeyID in the Use the following OpenPGP keys: field, so that the email address is used to check for a key at the time of sending. Also, further rules for the same address(es) will be processed as well.
Do not check further rules for the matching address
Enabling this function stops processing any other rules for the matching address(es) if this rule is matched; i.e. rule processing continues with the next recipient.
Use the following OpenPGP keys:
Use the Select Key(s).. button to select the recipient keys to be used for encryption. As in the action above, no further rules for the matching address(es) are processed.
Default for Signing
Enable or disable message signing. This either uses or overrides what you have specified in the message composition window. The values are:
  • Never: disable signing, even if it was enabled in the message composition window (overrules the other values)
  • Yes, if selected from in Message Composition: leave signing as specified in the message composition window
  • Always: enable signing, even if it was not enabled in the message composition window
These signing settings are applied for all rules that match. If one of the rules disables signing, the message will not be signed, regardless of other rules that specify Always.
Encryption
Enable or disable message encryption. The allowed settings and their meaning are the same as for message signing.
PGP/MIME
Enable or disable the use of the PGP/MIME (RFC 3156) message encoding. If PGP/MIME is disabled, the messages are encoded using "inline PGP". The allowed values and their meaning are the same as for message signing.

The rules are processed in the order displayed in the list in the OpenPGP Rules Editor. Whenever a rule matches a recipient and contains a OpenPGP Key ID, in addition to using the specified Key ID, the recipient is not considered anymore when processing further rules.


Further help is available on the Enigmail Per-Recipient Settings page

enigmail-2.0.8/lang/zh-TW/help/initError.html000066400000000000000000000045421334302754500210060ustar00rootroot00000000000000 Enigmail Help: How to Resolve Problems with Initializing OpenPGP

Enigmail Help

How to Resolve Problems with Initializing OpenPGP

There are several reasons why initializing OpenPGP does not succeed. The most common ones are described below; for more information please visit the Enigmail Support page.

GnuPG could not be found

In order for OpenPGP to work, the tool GnuPG needs to be installed. If GnuPG cannot be found, then first make sure that the executable gpg.exe (on Windows; gpg on other platforms) is installed on your computer. If GnuPG is installed, and OpenPGP cannot find it, then you need to manually set the path to GnuPG in the OpenPGP Preferences (menu OpenPGP > Preferences)

Enigmime failed to initialize

OpenPGP works only if it is built using the same build environment as Thunderbird or SeaMonkey was built. This means that you can use the official Enigmail releases only if you use the official releases of Thunderbird or SeaMonkey provided by mozilla.org.

If you use a Thunderbird or SeaMonkey version coming from some other source (e.g. the provider of your Linux distribution), or if you built the application yourself, you should either use an Enigmail version built by the same source, or build Enigmail yourself. For building Enigmail, refer to the Source Code section on the Enigmail home page. Please don't file any bug report concerning this problem, it is not solvable.

Further help is available on the Enigmail Support Web Site.

enigmail-2.0.8/lang/zh-TW/help/messenger.html000066400000000000000000000101221334302754500210100ustar00rootroot00000000000000 Enigmail Help: Message Reading

Enigmail Help

Using Enigmail when reading messages

Decrypt button in main Mail window
This button can be used for several purposes: decrypt, verify, or import public keys. Normally decryption/verification happens automatically, although this can be disabled through a preference. However, if this fails, usually a short error message will appear in the Enigmail status line. If you click the Decrypt button, you will be able to see a more detailed error message, including the output from the GnuPG command.
Pen and Key icons in Message Header display
The Pen and Key icons in the Message Header display indicate if the message you are reading was signed and/or encrypted and if the signature is good, i.e. the message has not been changed since it was signed. If the message has been changed, the Pen icon will change to a Broken Pen to indicate that the signature is bad. Right clicking on either the Pen or Key icons will bring up a menu with the following options:
  • OpenPGP Security info: allows you to view the output status from GnuPG for the message.
  • Copy OpenPGP Security info: copies the output status from GnuPG to the clipboard; to paste into a reply message, etc.
  • View OpenPGP Photo ID: allows you to view the Photo ID of the person who sent the message, if they have a photo embedded in their Public Key. (This option will only be enabled if a Photo ID exists in their key.)
  • S/MIME Security info: allows you to view the S/MIME Security Info for the message.

If you do not have keyserver-options auto-key-retrieve set in your gpg.conf file and you read a message which is signed or encrypted, you will see a Pen icon in the headers display area with a Question mark on it, the Enigmail status line in the headers area will say Part of the message signed; click pen icon for details and the message in the Message Pane will show all the OpenPGP message block indicators and the signature block.

You may also see this if you have keyserver-options auto-key-retrieve set in your gpg.conf file and the OpenPGP key is not available on the default keyserver.

Clicking on the Pen and Question mark icon will bring up a window advising that the key is unavailable in your keyring. Clicking on OK will bring up another window with a list of keyservers from which you can select to download the sender's public key from.

To configure the list of keyservers you wish to use, go to Enigmail -> Preferences -> Basic tab and enter the keyserver addresses in the Keyserver(s): box, separated by a comma. The first keyserver in the list will be used as the default.

Opening encrypted attachments / importing attached OpenPGP keys
Attachments named *.pgp, *.asc and *.gpg are recognized as attachments that can be handled specially by Enigmail. Right clicking on such an attachment enables two special menu items in the context menu: Decrypt and Open and Decrypt and Save. Use these two menu items if you want Enigmail to decrypt an attachment before opening or saving it. If an attachment is recognized as an OpenPGP key file, you are offered to import the keys it into your keyrings.

Further help is available on the Enigmail Help web page

enigmail-2.0.8/lang/zh-TW/help/rulesEditor.html000066400000000000000000000060331334302754500213270ustar00rootroot00000000000000 Enigmail Help: Rules Editor

Enigmail Help

Using the Enigmail Rules Editor

In the Rules Editor, you can specify defaults per recipient for enabling encryption, signing and PGP/MIME, and to define what OpenPGP key(s) to use. Each rule consists of 5 fields and is represented on a single line:

Email
The e-mail(s) from the To:, Cc: and Bcc: fields to match. The matching works on substrings (Further details can be found in the Edit Rule dialog)
OpenPGP Key(s)
a list of OpenPGP Key ID's to use for the recipient
Sign
enable or disable message signing. This either uses or overrides what you have specified in the message composition window. The values are:
  • Never: disable signing, even if it was enabled in the message composition window (overrules the other values)
  • Possible: leave signing as specified in the message composition window
  • Always: enable signing, even if it was not enabled in the message composition window

These signing settings are applied for all rules that match. If one of the rules disables signing, the message will not be signed, regardless of other rules that specify Always.

Encrypt
enable or disable message encryption. The allowed settings and their meaning are the same as for message signing.
PGP/MIME
enable or disable the use of the PGP/MIME (RFC 3156) message encoding. If PGP/MIME is disabled, the messages are encoded using "inline PGP". The allowed values and their meaning a re the same as for message signing.

The rules are processed in the order displayed in the list. Whenever a rule matches a recipient and contains a OpenPGP Key ID, in addition to using the specified Key ID, the recipient is not considered anymore when processing further rules.

Note: The rule editor is not yet complete. It is possible to write some more advanced rules by directly editing the rules file (these rules should then not be edited anymore in the rule editor). Further information for directly editing the file is available on the Enigmail Homepage


Further help is available on the Enigmail Help web page

enigmail-2.0.8/lang/zh-TW/help/sendingPrefs.html000066400000000000000000000047771334302754500214720ustar00rootroot00000000000000 Enigmail Help: Edit OpenPGP Rule

Enigmail Help

Defining Preferences to Send Encrypted

In the Sending Preferences you can choose the general model and preferences for encryption.

Convenient Encryption
With these settings, emails are encrypted without confirmation whenever possible.

This setup is appropriate, if you just want to improve your privacy by sending emails encyrpted instead of unencrypted if that's possible.

The effect is like sending emails as letters instead of postcards. Unlike postcards, letters usually hide their contents while in transit.

Note however that as with letters you can't be sure that nobody is opening the letter while it is in transit (although, some technical effort is necessary for that).

A concrete risk is that you accidentally use "faked keys" you got from somewhere or somebody claiming that the key belongs to the person you want to send emails to. To avoid this risk, you can either use the trust model of PGP (see below) or you should always verify, whether the fingerprint of a public key is correct.

Manual Encryption
This option allows you to specify the different preferences for encryption according to your needs. You can specify
  • whether replies to encrypted/signed emails should automatically also be encrypted/signed-
  • whether to use the trust model of OpenPGP to accept keys (this means that to use a key you either have to sign the key or have enough other people you trust having signed the key).
  • whether you want to automatically send emails encrypted if all keys are accepted.
  • whether and when you want to finally confirm sending an email.
If it is important for you that content you send encrypted can't be read by other people or organizations, you should use the manual preferences at least choose the option to accept keys only if you or other people signed them. While this model reduces the risk of using faked keys, it requires that you actively sign keys and declare owner trust using the key managament dialog. enigmail-2.0.8/package/000077500000000000000000000000001334302754500147075ustar00rootroot00000000000000enigmail-2.0.8/package/.gitIgnore000066400000000000000000000000161334302754500166340ustar00rootroot00000000000000buildDate.jsm enigmail-2.0.8/package/.gitattributes000066400000000000000000000000131334302754500175740ustar00rootroot00000000000000*.rdf text enigmail-2.0.8/package/Makefile000066400000000000000000000066671334302754500163660ustar00rootroot00000000000000# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. DEPTH = .. include $(DEPTH)/config/autoconf.mk PREFFILES = prefs/defaultPrefs.js MODFILES = \ addrbook.jsm \ amPrefsService.jsm \ app.jsm \ armor.jsm \ attachment.jsm \ autocrypt.jsm \ card.jsm \ clipboard.jsm \ commandLine.jsm \ configBackup.jsm \ configure.jsm \ constants.jsm \ core.jsm \ data.jsm \ decryption.jsm \ persistentCrypto.jsm \ dialog.jsm \ encryption.jsm \ errorHandling.jsm \ events.jsm \ execution.jsm \ funcs.jsm \ files.jsm \ filters.jsm \ filtersWrapper.jsm \ fixExchangeMsg.jsm \ gpgAgent.jsm \ glodaMime.jsm \ glodaUtils.jsm \ gpg.jsm \ hash.jsm \ httpProxy.jsm \ installGnuPG.jsm \ installPep.jsm \ key.jsm \ keyEditor.jsm \ keyRing.jsm \ keyUsability.jsm \ keyRefreshService.jsm \ keyserver.jsm \ keyserverUris.jsm \ lazy.jsm \ locale.jsm \ localizeHtml.jsm \ log.jsm \ mime.jsm \ mimeDecrypt.jsm \ mimeEncrypt.jsm \ mimeVerify.jsm \ msgCompFields.jsm \ msgRead.jsm \ os.jsm \ openpgp.jsm \ overlays.jsm \ passwordCheck.jsm \ passwords.jsm \ pEp.jsm \ pEpAdapter.jsm \ pEpDecrypt.jsm \ pEpFilter.jsm \ pEpListener.jsm \ pEpKeySync.jsm \ pgpmimeHandler.jsm \ pipeConsole.jsm \ prefs.jsm \ protocolHandler.jsm \ rng.jsm \ rules.jsm \ send.jsm \ singletons.jsm \ socks5Proxy.jsm \ stdlib.jsm \ streams.jsm \ system.jsm \ time.jsm \ timer.jsm \ tor.jsm \ trust.jsm \ uris.jsm \ verify.jsm \ versioning.jsm \ webKey.jsm \ wkdLookup.jsm \ windows.jsm \ wksMimeHandler.jsm \ zbase32.jsm DATE_FMT = +%Y%m%d-%H%M SOURCE_DATE_EPOCH ?= $(shell date +%s) # first try GNU /bin/date syntax; if that doesn't work, try BSD # /bin/date syntax. If that still fails, ignore SOURCE_DATE_EPOCH ENIG_BUILD_DATE=$(shell TZ=UTC date $(DATE_FMT) -d "@$(SOURCE_DATE_EPOCH)" 2>/dev/null || \ TZ=UTC date -r "$(SOURCE_DATE_EPOCH)" $(DATE_FMT) || \ TZ=UTC date $(DATE_FMT) ) all: deploy deploy: $(PREFFILES) $(MODFILES) $(DEPTH)/util/install -m 644 $(DIST)/modules/preferences $(PREFFILES) $(DEPTH)/util/install -m 644 $(DIST)/modules $(MODFILES) echo '"use strict";' > $(DIST)/modules/buildDate.jsm echo 'var EXPORTED_SYMBOLS = ["EnigmailBuildDate"];' >> $(DIST)/modules/buildDate.jsm echo 'const EnigmailBuildDate = "$(ENIG_BUILD_DATE)";' >> $(DIST)/modules/buildDate.jsm clean: $(DEPTH)/util/install -u $(DIST)/modules/preferences $(PREFFILES) $(DEPTH)/util/install -u $(DIST)/modules $(MODFILES) enigmail-2.0.8/package/addrbook.jsm000066400000000000000000000024411334302754500172100ustar00rootroot00000000000000/*global Components: false */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailAddrbook"]; /* * Functionality related to the Thunderbird address book * */ const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; const ABMANAGER = "@mozilla.org/abmanager;1"; var EnigmailAddrbook = { /** * Look up the address book card for a given email address * * @param emailAddr: String - email address to find * * @return if found: Object: * - card: nsIAbCard for found email address * - directory: nsIAbDirectory of found card * NULL if not found */ lookupEmailAddress: function(emailAddr) { let abm = Cc[ABMANAGER].getService(Ci.nsIAbManager); let enumerator = abm.directories; while (enumerator.hasMoreElements()) { let abd = enumerator.getNext().QueryInterface(Ci.nsIAbDirectory); try { let crd = abd.cardForEmailAddress(emailAddr); if (crd) return { directory: abd, card: crd }; } catch (x) {} } return null; } }; enigmail-2.0.8/package/amPrefsService.jsm000066400000000000000000000050231334302754500203400ustar00rootroot00000000000000/*global Components: false */ /*jshint -W097 */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; const { classes: Cc, interfaces: Ci, manager: Cm, results: Cr, utils: Cu, Constructor: CC } = Components; Cm.QueryInterface(Ci.nsIComponentRegistrar); Cu.import("resource://gre/modules/XPCOMUtils.jsm"); /*global XPCOMUtils: false */ const CATEGORY = "mailnews-accountmanager-extensions"; const CATEGORY_ENTRY = "enigmail-account-manager-extension"; const PREF_SERVICE_NAME = "@mozilla.org/accountmanager/extension;1?name=enigprefs"; var EXPORTED_SYMBOLS = ["EnigmailAmPrefsService"]; var EnigmailAmPrefsService = { startup: function(reason) { try { var catMan = Cc["@mozilla.org/categorymanager;1"].getService(Ci.nsICategoryManager); catMan.addCategoryEntry(CATEGORY, CATEGORY_ENTRY, PREF_SERVICE_NAME, false, true); this.factory = new Factory(EnigmailPrefService); } catch (ex) {} }, shutdown: function(reason) { var catMan = Cc["@mozilla.org/categorymanager;1"].getService(Ci.nsICategoryManager); catMan.deleteCategoryEntry(CATEGORY, CATEGORY_ENTRY, false); if (this.factory) { this.factory.unregister(); } } }; function EnigmailPrefService() {} EnigmailPrefService.prototype = { name: "enigprefs", chromePackageName: "enigmail", classID: Components.ID("{943b06a2-24d2-4d38-b0f0-a45f959e331a}"), classDescription: "Enigmail Account Manager Extension Service", contractID: PREF_SERVICE_NAME, QueryInterface: XPCOMUtils.generateQI([Components.interfaces.nsIMsgAccountManagerExtension]), showPanel: function(server) { // show Enigmail panel for POP3, IMAP, NNTP and "movemail" (unix) account types switch (server.type) { case "nntp": case "imap": case "pop3": case "movemail": return true; } return false; } }; class Factory { constructor(component) { this.component = component; this.register(); Object.freeze(this); } createInstance(outer, iid) { if (outer) { throw Cr.NS_ERROR_NO_AGGREGATION; } return new this.component(); } register() { Cm.registerFactory(this.component.prototype.classID, this.component.prototype.classDescription, this.component.prototype.contractID, this); } unregister() { Cm.unregisterFactory(this.component.prototype.classID, this); } } enigmail-2.0.8/package/app.jsm000066400000000000000000000045041334302754500162050ustar00rootroot00000000000000/*global Components: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailApp"]; const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; Cu.import("resource://enigmail/lazy.jsm"); /*global EnigmailLazy: false */ const getEnigmailLog = EnigmailLazy.loader("enigmail/log.jsm", "EnigmailLog"); const DIR_SERV_CONTRACTID = "@mozilla.org/file/directory_service;1"; const ENIG_EXTENSION_GUID = "{847b3a00-7ab1-11d4-8f02-006008948af5}"; const SEAMONKEY_ID = "{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}"; const XPCOM_APPINFO = "@mozilla.org/xre/app-info;1"; var EnigmailApp = { /** * Platform application name (e.g. Thunderbird) */ getName: function() { return Cc[XPCOM_APPINFO].getService(Ci.nsIXULAppInfo).name; }, /** * Platform (Gecko) version number (e.g. 42.0) * The platform version for SeaMonkey and for Thunderbird are identical * (unlike the application version numbers) */ getPlatformVersion: function() { return Cc[XPCOM_APPINFO].getService(Ci.nsIXULAppInfo).platformVersion; }, /** * Return the directory holding the current profile as nsIFile object */ getProfileDirectory: function() { let ds = Cc[DIR_SERV_CONTRACTID].getService(Ci.nsIProperties); return ds.get("ProfD", Ci.nsIFile); }, isSuite: function() { // return true if Seamonkey, false otherwise return Cc[XPCOM_APPINFO].getService(Ci.nsIXULAppInfo).ID == SEAMONKEY_ID; }, /** * Get Enigmail version */ getVersion: function() { getEnigmailLog().DEBUG("app.jsm: getVersion\n"); getEnigmailLog().DEBUG("app.jsm: installed version: " + EnigmailApp._version + "\n"); return EnigmailApp._version; }, /** * Get Enigmail installation directory */ getInstallLocation: function() { return EnigmailApp._installLocation; }, setVersion: function(version) { EnigmailApp._version = version; }, setInstallLocation: function(location) { EnigmailApp._installLocation = location; }, initAddon: function(addon) { EnigmailApp.setVersion(addon.version); EnigmailApp.setInstallLocation(addon.installPath); } }; enigmail-2.0.8/package/armor.jsm000066400000000000000000000200131334302754500165360ustar00rootroot00000000000000/*global Components: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailArmor"]; Components.utils.import("resource://enigmail/constants.jsm"); /* global EnigmailConstants: false */ Components.utils.import("resource://enigmail/log.jsm"); /* global EnigmailLog: false */ const Ci = Components.interfaces; // Locates STRing in TEXT occurring only at the beginning of a line function indexOfArmorDelimiter(text, str, offset) { let currentOffset = offset; while (currentOffset < text.length) { let loc = text.indexOf(str, currentOffset); if (loc === -1 || loc === 0 || text.charAt(loc - 1) == "\n") { return loc; } currentOffset = loc + str.length; } return -1; } function searchBlankLine(str, then) { var offset = str.search(/\n\s*\r?\n/); if (offset === -1) { return ""; } else { return then(offset); } } function indexOfNewline(str, off, then) { var offset = str.indexOf("\n", off); if (offset === -1) { return ""; } else { return then(offset); } } var EnigmailArmor = { /** * Locates offsets bracketing PGP armored block in text, * starting from given offset, and returns block type string. * * @param text: String - ASCII armored text * @param offset: Number - offset to start looking for block * @param indentStr: String - prefix that is used for all lines (such as "> ") * @param beginIndexObj: Object - o.value will contain offset of first character of block * @param endIndexObj: Object - o.value will contain offset of last character of block (newline) * @param indentStrObj: Object - o.value will contain indent of 1st line * * @return String - type of block found (e.g. MESSAGE, PUBLIC KEY) * If no block is found, an empty String is returned; */ locateArmoredBlock: function(text, offset, indentStr, beginIndexObj, endIndexObj, indentStrObj) { EnigmailLog.DEBUG("armor.jsm: Enigmail.locateArmoredBlock: " + offset + ", '" + indentStr + "'\n"); beginIndexObj.value = -1; endIndexObj.value = -1; var beginIndex = indexOfArmorDelimiter(text, indentStr + "-----BEGIN PGP ", offset); if (beginIndex == -1) { var blockStart = text.indexOf("-----BEGIN PGP "); if (blockStart >= 0) { var indentStart = text.search(/\n.*-----BEGIN PGP /) + 1; indentStrObj.value = text.substring(indentStart, blockStart); indentStr = indentStrObj.value; beginIndex = indexOfArmorDelimiter(text, indentStr + "-----BEGIN PGP ", offset); } } if (beginIndex == -1) return ""; // Locate newline at end of armor header offset = text.indexOf("\n", beginIndex); if (offset == -1) return ""; var endIndex = indexOfArmorDelimiter(text, indentStr + "-----END PGP ", offset); if (endIndex == -1) return ""; // Locate newline at end of PGP block endIndex = text.indexOf("\n", endIndex); if (endIndex == -1) { // No terminating newline endIndex = text.length - 1; } var blockHeader = text.substr(beginIndex, offset - beginIndex + 1); var blockRegex = new RegExp("^" + indentStr + "-----BEGIN PGP (.{1,30})-----\\s*\\r?\\n"); var matches = blockHeader.match(blockRegex); var blockType = ""; if (matches && (matches.length > 1)) { blockType = matches[1]; EnigmailLog.DEBUG("armor.jsm: Enigmail.locateArmoredBlock: blockType=" + blockType + "\n"); } if (blockType == "UNVERIFIED MESSAGE") { // Skip any unverified message block return EnigmailArmor.locateArmoredBlock(text, endIndex + 1, indentStr, beginIndexObj, endIndexObj, indentStrObj); } beginIndexObj.value = beginIndex; endIndexObj.value = endIndex; return blockType; }, /** * locateArmoredBlocks returns an array of ASCII Armor block positions * * @param text: String - text containing ASCII armored block(s) * * @return Array of objects with the following structure: * obj.begin: Number * obj.end: Number * obj.indent: String * obj.blocktype: String * * if no block was found, an empty array is returned */ locateArmoredBlocks: function(text) { var beginObj = {}; var endObj = {}; var indentStrObj = {}; var blocks = []; var i = 0; var b; while ((b = EnigmailArmor.locateArmoredBlock(text, i, "", beginObj, endObj, indentStrObj)) !== "") { blocks.push({ begin: beginObj.value, end: endObj.value, indent: indentStrObj.value ? indentStrObj.value : "", blocktype: b }); i = endObj.value; } EnigmailLog.DEBUG("armor.jsm: locateArmorBlocks: Found " + blocks.length + " Blocks\n"); return blocks; }, extractSignaturePart: function(signatureBlock, part) { EnigmailLog.DEBUG("armor.jsm: Enigmail.extractSignaturePart: part=" + part + "\n"); return searchBlankLine(signatureBlock, function(offset) { return indexOfNewline(signatureBlock, offset + 1, function(offset) { var beginIndex = signatureBlock.indexOf("-----BEGIN PGP SIGNATURE-----", offset + 1); if (beginIndex == -1) { return ""; } if (part === EnigmailConstants.SIGNATURE_TEXT) { return signatureBlock.substr(offset + 1, beginIndex - offset - 1). replace(/^- -/, "-"). replace(/\n- -/g, "\n-"). replace(/\r- -/g, "\r-"); } return indexOfNewline(signatureBlock, beginIndex, function(offset) { var endIndex = signatureBlock.indexOf("-----END PGP SIGNATURE-----", offset); if (endIndex == -1) { return ""; } var signBlock = signatureBlock.substr(offset, endIndex - offset); return searchBlankLine(signBlock, function(armorIndex) { if (part == EnigmailConstants.SIGNATURE_HEADERS) { return signBlock.substr(1, armorIndex); } return indexOfNewline(signBlock, armorIndex + 1, function(armorIndex) { if (part == EnigmailConstants.SIGNATURE_ARMOR) { return signBlock.substr(armorIndex, endIndex - armorIndex). replace(/\s*/g, ""); } else { return ""; } }); }); }); }); }); }, /** * Remove all headers from an OpenPGP Armored message and replace them * with a set of new headers. * * @param armorText: String - ASCII armored message * @param headers: Object - key/value pairs of new headers to insert * * @return String - new armored message */ replaceArmorHeaders: function(armorText, headers) { let text = armorText.replace(/\r\n/g, "\n"); let i = text.search(/\n/); if (i < 0) return armorText; let m = text.substr(0, i + 1); for (let j in headers) { m += j + ": " + headers[j] + "\n"; } i = text.search(/\n\n/); if (i < 0) return armorText; m += text.substr(i + 1); return m; }, /** * Get a list of all headers found in an armor message * * @param text String - ASCII armored message * * @return Object: key/value pairs of headers. All keys are in lowercase. */ getArmorHeaders: function(text) { let headers = {}; let b = this.locateArmoredBlocks(text); if (b.length === 0) { return headers; } let msg = text.substr(b[0].begin); let lx = new RegExp("\\n" + b[0].indent + "\\r?\\n"); let hdrEnd = msg.search(lx); if (hdrEnd < 0) return headers; let lines = msg.substr(0, hdrEnd).split(/\r?\n/); let rx = new RegExp("^" + b[0].indent + "([^: ]+)(: )(.*)"); // skip 1st line (ARMOR-line) for (let i = 1; i < lines.length; i++) { let m = lines[i].match(rx); if (m && m.length >= 4) { headers[m[1].toLowerCase()] = m[3]; } } return headers; } }; enigmail-2.0.8/package/attachment.jsm000066400000000000000000000037561334302754500175650ustar00rootroot00000000000000/*global Components: false, escape: false, unescape: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailAttachment"]; const Cu = Components.utils; Cu.import("resource://enigmail/lazy.jsm"); /*global EnigmailLazy: false */ Cu.import("resource://enigmail/execution.jsm"); /*global EnigmailExecution: false */ Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ Cu.import("resource://enigmail/passwords.jsm"); /*global EnigmailPassword: false */ Cu.import("resource://enigmail/gpg.jsm"); /*global EnigmailGpg: false */ Cu.import("resource://enigmail/data.jsm"); /*global EnigmailData: false */ const getGpgAgent = EnigmailLazy.loader("enigmail/gpgAgent.jsm", "EnigmailGpgAgent"); var EnigmailAttachment = { getFileName: function(parent, byteData) { EnigmailLog.DEBUG("attachment.jsm: getFileName\n"); const args = EnigmailGpg.getStandardArgs(true). concat(EnigmailPassword.command()). concat(["--decrypt"]); const listener = EnigmailExecution.newSimpleListener( function _stdin(pipe) { EnigmailLog.DEBUG("attachment.jsm: getFileName: _stdin\n"); pipe.write(byteData); pipe.write("\n"); pipe.close(); }); listener.stdout = function(data) {}; const proc = EnigmailExecution.execStart(getGpgAgent().agentPath, args, false, parent, listener, {}); if (!proc) { return null; } proc.wait(); const matches = listener.stderrData.match(/^(\[GNUPG:\] PLAINTEXT [0-9]+ [0-9]+ )(.*)$/m); if (matches && (matches.length > 2)) { var filename = matches[2]; if (filename.indexOf(" ") > 0) { filename = filename.replace(/ .*$/, ""); } return EnigmailData.convertToUnicode(unescape(filename), "utf-8"); } else { return null; } } }; enigmail-2.0.8/package/autocrypt.jsm000066400000000000000000000773341334302754500174720ustar00rootroot00000000000000/*global Components: false*/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; /** * Module for dealing with received Autocrypt headers, level 0 * See details at https://github.com/mailencrypt/autocrypt */ var EXPORTED_SYMBOLS = ["EnigmailAutocrypt"]; const Cc = Components.classes; const Ci = Components.interfaces; const Cr = Components.results; const Cu = Components.utils; Cu.import("resource://gre/modules/Sqlite.jsm"); /* global Sqlite: false */ Cu.import("resource:///modules/jsmime.jsm"); /*global jsmime: false*/ Cu.import("resource://enigmail/core.jsm"); /*global EnigmailCore: false */ Cu.import("resource://enigmail/log.jsm"); /* global EnigmailLog: false*/ Cu.import("resource://enigmail/locale.jsm"); /* global EnigmailLocale: false*/ Cu.import("resource://enigmail/funcs.jsm"); /* global EnigmailFuncs: false*/ Cu.import("resource://enigmail/mime.jsm"); /* global EnigmailMime: false*/ Cu.import("resource://gre/modules/PromiseUtils.jsm"); /* global PromiseUtils: false */ Cu.import("resource://enigmail/timer.jsm"); /*global EnigmailTimer: false */ Cu.import("resource://enigmail/key.jsm"); /*global EnigmailKey: false */ Cu.import("resource://enigmail/keyRing.jsm"); /*global EnigmailKeyRing: false */ Cu.import("resource://enigmail/openpgp.jsm"); /*global EnigmailOpenPGP: false */ Cu.import("resource://enigmail/mime.jsm"); /*global EnigmailMime: false */ Cu.import("resource://enigmail/rng.jsm"); /*global EnigmailRNG: false */ Cu.import("resource://enigmail/send.jsm"); /*global EnigmailSend: false */ Cu.import("resource://enigmail/streams.jsm"); /*global EnigmailStreams: false */ Cu.import("resource://enigmail/armor.jsm"); /*global EnigmailArmor: false */ Cu.import("resource://enigmail/data.jsm"); /*global EnigmailData: false */ Cu.import("resource://enigmail/rules.jsm"); /*global EnigmailRules: false */ Cu.import("resource://enigmail/keyEditor.jsm"); /*global EnigmailKeyEditor: false */ Cu.import("resource://enigmail/stdlib.jsm"); /*global EnigmailStdlib: false */ Cu.import("resource://enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ Cu.import("resource://enigmail/constants.jsm"); /*global EnigmailConstants: false */ var gCreatedSetupIds = []; var EnigmailAutocrypt = { /** * Process the "Autocrypt:" header and if successful store the update in the database * * @param fromAddr: String - Address of sender (From: header) * @param headerDataArr: Array of String: all instances of the Autocrypt: header found in the message * @param dateSent: String - Date: field of the message * @param autoCryptEnabled: Boolean - if true, autocrypt is enabled for the context of the message * * @return Promise (success) - success: Number (0 = success, 1+ = failure) */ processAutocryptHeader: function(fromAddr, headerDataArr, dateSent, autoCryptEnabled = false) { EnigmailLog.DEBUG("autocrypt.jsm: processAutocryptHeader(): from=" + fromAddr + "\n"); return new Promise((resolve, reject) => { // critical parameters: {param: mandatory} const CRITICAL = { addr: true, keydata: true, type: false, // That's actually oboslete according to the Level 1 spec. "prefer-encrypt": false }; try { fromAddr = EnigmailFuncs.stripEmail(fromAddr).toLowerCase(); } catch (ex) { reject("processAutocryptHeader error " + ex); return; } let foundTypes = {}; let paramArr = []; for (let hdrNum = 0; hdrNum < headerDataArr.length; hdrNum++) { let hdr = headerDataArr[hdrNum].replace(/[\r\n \t]/g, ""); let k = hdr.search(/keydata=/); if (k > 0) { let d = hdr.substr(k); if (d.search(/"/) < 0) { hdr = hdr.replace(/keydata=/, 'keydata="') + '"'; } } paramArr = EnigmailMime.getAllParameters(hdr); for (let i in CRITICAL) { if (CRITICAL[i]) { // found mandatory parameter if (!(i in paramArr)) { EnigmailLog.DEBUG("autocrypt.jsm: processAutocryptHeader: cannot find param '" + i + "'\n"); resolve(1); return; // do nothing if not all mandatory parts are present } } } for (let i in paramArr) { if (i.substr(0, 1) !== "_") { if (!(i in CRITICAL)) { EnigmailLog.DEBUG("autocrypt.jsm: processAutocryptHeader: unknown critical param " + i + "\n"); resolve(2); return; // do nothing if an unknown critical parameter is found } } } paramArr.addr = paramArr.addr.toLowerCase(); if (fromAddr !== paramArr.addr) { EnigmailLog.DEBUG("autocrypt.jsm: processAutocryptHeader: from Addr " + fromAddr + " != " + paramArr.addr.toLowerCase() + "\n"); resolve(3); return; } if (!("type" in paramArr)) { paramArr.type = "1"; } else { paramArr.type = paramArr.type.toLowerCase(); if (paramArr.type !== "1") { EnigmailLog.DEBUG("autocrypt.jsm: processAutocryptHeader: unknown type " + paramArr.type + "\n"); resolve(4); return; // we currently only support 1 (=OpenPGP) } } try { let keyData = atob(paramArr.keydata); } catch (ex) { EnigmailLog.DEBUG("autocrypt.jsm: processAutocryptHeader: key is not base64-encoded\n"); resolve(5); return; } if (paramArr.type in foundTypes) { EnigmailLog.DEBUG("autocrypt.jsm: processAutocryptHeader: duplicate header for type=" + paramArr.type + "\n"); resolve(6); return; // do not process anything if more than one Autocrypt header for the same type is found } foundTypes[paramArr.type] = 1; } if (!("prefer-encrypt" in paramArr)) { paramArr["prefer-encrypt"] = "nopreference"; } let lastDate = jsmime.headerparser.parseDateHeader(dateSent); let now = new Date(); if (lastDate > now) { lastDate = now; } paramArr.dateSent = lastDate; if (("_enigmail_artificial" in paramArr) && (paramArr._enigmail_artificial === "yes")) { if ("_enigmail_fpr" in paramArr) { paramArr.fpr = paramArr._enigmail_fpr; } paramArr.keydata = ""; paramArr.autocryptDate = 0; } else { paramArr.autocryptDate = lastDate; } let conn; openAutocryptDb().then( function onConnection(connection) { conn = connection; return checkDatabaseStructure(conn); }, function onError(error) { EnigmailLog.DEBUG("autocrypt.jsm: processAutocryptHeader: could not open database\n"); resolve(7); } ).then( function _f() { return findUserRecord(conn, [fromAddr], paramArr.type); } ).then( function gotData(resultObj) { EnigmailLog.DEBUG("autocrypt.jsm: got " + resultObj.numRows + " rows\n"); if (resultObj.data.length === 0) { return appendUser(conn, paramArr); } else { return updateUser(conn, paramArr, resultObj.data, autoCryptEnabled); } } ).then( function _done() { EnigmailLog.DEBUG("autocrypt.jsm: OK - closing connection\n"); conn.close(); resolve(0); } ).catch( function _err(reason) { EnigmailLog.DEBUG("autocrypt.jsm: error - closing connection: " + reason + "\n"); conn.close(); resolve(8); } ); }); }, /** * Import autocrypt OpenPGP keys for a given list of email addresses * @param emailAddr: Array of String - emai addresses * * @return Promise().resolve { } */ importAutocryptKeys: function(emailAddr) { EnigmailLog.DEBUG("autocrypt.jsm importAutocryptKeys()\n"); return new Promise((resolve, reject) => { this.getOpenPGPKeyForEmail(emailAddr). then(keyArr => { let importedKeys = []; let now = new Date(); for (let i in keyArr) { if ((now - keyArr[i].lastAutocrypt) / (1000 * 60 * 60 * 24) < 366) { // only import keys received less than 12 months ago try { let keyData = atob(keyArr[i].keyData); if (keyData.length > 1) { let keysObj = {}; let pubkey = EnigmailOpenPGP.enigmailFuncs.bytesToArmor(EnigmailOpenPGP.openpgp.enums.armor.public_key, keyData); EnigmailKeyRing.importKey(null, false, pubkey, keyArr[i].fpr, {}, keysObj); if (keysObj.value) { importedKeys = importedKeys.concat(keysObj.value); if (keysObj.value.length > 0) { let key = EnigmailKeyRing.getKeyById(keysObj.value[0]); // enable encryption if state (prefer-encrypt) is "mutual"; // otherwise, disable it explicitely let signEncrypt = (keyArr[i].state === "mutual" ? 1 : 0); if (key && key.fpr) { let ruleObj = { email: "{" + EnigmailConstants.AC_RULE_PREFIX + keyArr[i].email + "}", keyList: "0x" + key.fpr, sign: signEncrypt, encrypt: signEncrypt, pgpMime: 2, flags: 0 }; EnigmailRules.insertOrUpdateRule(ruleObj); } } } } } catch (ex) { EnigmailLog.DEBUG("autocrypt.jsm importAutocryptKeys: exception " + ex.toString() + "\n"); } } } resolve(importedKeys); }); }); }, /** * Find an autocrypt OpenPGP key for a given list of email addresses * @param emailAddr: Array of String - emai addresses * * @return Promise().resolve { fpr, keyData, lastAutocrypt} */ getOpenPGPKeyForEmail: function(emailAddr) { EnigmailLog.DEBUG("autocrypt.jsm: getOpenPGPKeyForEmail(" + emailAddr.join(",") + ")\n"); let conn; return new Promise((resolve, reject) => { openAutocryptDb().then( function onConnection(connection) { conn = connection; return checkDatabaseStructure(conn); }, function onError(error) { EnigmailLog.DEBUG("autocrypt.jsm: getOpenPGPKeyForEmail: could not open database [" + error + "]\n"); reject("getOpenPGPKeyForEmail1 error " + error); return; } ).then( function _f() { return findUserRecord(conn, emailAddr, "1"); } ).then( function gotData(resultObj) { EnigmailLog.DEBUG("autocrypt.jsm: getOpenPGPKeyForEmail got " + resultObj.numRows + " rows\n"); conn.close(); if (resultObj.data.length === 0) { resolve(null); return; } else { let retArr = []; for (let i in resultObj.data) { let record = resultObj.data[i]; retArr.push({ email: record.getResultByName("email"), fpr: record.getResultByName("fpr"), keyData: record.getResultByName("keydata"), state: record.getResultByName("state"), lastAutocrypt: new Date(record.getResultByName("last_seen_autocrypt")) }); } resolve(retArr); return; } } ). catch((err) => { conn.close(); reject("getOpenPGPKeyForEmail2 error " + err); return; }); }); }, /** * Create Autocrypt Setup Message * * @param identity: Object - nsIMsgIdentity * * @return Promise({str, passwd}): * msg: String - complete setup message * passwd: String - backup password */ createSetupMessage: function(identity) { EnigmailLog.DEBUG("autocrypt.jsm: createSetupMessage()\n"); return new Promise((resolve, reject) => { let keyId = ""; let key; if (!EnigmailCore.getService(null, false)) { reject(0); return; } if (identity.getIntAttribute("pgpKeyMode") === 1) { keyId = identity.getCharAttribute("pgpkeyId"); } if (keyId.length > 0) { key = EnigmailKeyRing.getKeyById(keyId); } else { key = EnigmailKeyRing.getSecretKeyByUserId(identity.email); } if (!key) { EnigmailLog.DEBUG("autocrypt.jsm: createSetupMessage: no key found for " + identity.email + "\n"); reject(1); return; } let keyData = EnigmailKeyRing.extractSecretKey(true, "0x" + key.fpr, {}, {}); if (!keyData || keyData.length === 0) { EnigmailLog.DEBUG("autocrypt.jsm: createSetupMessage: no key found for " + identity.email + "\n"); reject(1); return; } let ac = EnigmailFuncs.getAccountForIdentity(identity); let preferEncrypt = ac.incomingServer.getIntValue("acPreferEncrypt") > 0 ? "mutual" : "nopreference"; let innerMsg = EnigmailArmor.replaceArmorHeaders(keyData, { 'Autocrypt-Prefer-Encrypt': preferEncrypt }) + '\r\n'; if (!innerMsg || innerMsg.length === 0) { EnigmailLog.DEBUG("autocrypt.jsm: createSetupMessage: empty key data after replaceArmorHeaders\n"); reject(1); return; } let bkpCode = createBackupCode(); let enc = { data: innerMsg, passwords: bkpCode, armor: true }; // create symmetrically encrypted message EnigmailOpenPGP.openpgp.encrypt(enc).then(msg => { let msgData = EnigmailArmor.replaceArmorHeaders(msg.data, { 'Passphrase-Format': 'numeric9x4', 'Passphrase-Begin': bkpCode.substr(0, 2) }).replace(/\n/g, "\r\n"); let m = createBackupOuterMsg(identity.email, msgData); resolve({ msg: m, passwd: bkpCode }); }).catch(e => { EnigmailLog.DEBUG("autocrypt.jsm: createSetupMessage: error " + e + "\n"); reject(2); return; }); }); }, /** * Create and send the Autocrypt Setup Message to yourself * The message is sent asynchronously. * * @param identity: Object - nsIMsgIdentity * * @return Promise(passwd): * passwd: String - backup password * */ sendSetupMessage: function(identity) { EnigmailLog.DEBUG("autocrypt.jsm: sendSetupMessage()\n"); let self = this; return new Promise((resolve, reject) => { self.createSetupMessage(identity).then(res => { let composeFields = Cc["@mozilla.org/messengercompose/composefields;1"].createInstance(Ci.nsIMsgCompFields); composeFields.characterSet = "UTF-8"; composeFields.messageId = EnigmailRNG.generateRandomString(27) + "-enigmail"; composeFields.from = identity.email; composeFields.to = identity.email; gCreatedSetupIds.push(composeFields.messageId); let now = new Date(); let mimeStr = "Message-Id: " + composeFields.messageId + "\r\n" + "Date: " + now.toUTCString() + "\r\n" + res.msg; if (EnigmailSend.sendMessage(mimeStr, composeFields, null)) { resolve(res.passwd); } else { reject(99); return; } }); }); }, /** * get the data of the attachment of a setup message * * @param attachmentUrl: String - URL of the attachment * * @return Promise(Object): * attachmentData: String - complete attachment data * passphraseFormat: String - extracted format from the header (e.g. numeric9x4) [optional] * passphraseHint: String - 1st two digits of the password [optional] */ getSetupMessageData: function(attachmentUrl) { EnigmailLog.DEBUG("autocrypt.jsm: getSetupMessageData()\n"); return new Promise((resolve, reject) => { let s = EnigmailStreams.newStringStreamListener(data => { let start = {}, end = {}; let msgType = EnigmailArmor.locateArmoredBlock(data, 0, "", start, end, {}); if (msgType === "MESSAGE") { EnigmailLog.DEBUG("autocrypt.jsm: getSetupMessageData: got backup key\n"); let armorHdr = EnigmailArmor.getArmorHeaders(data); let passphraseFormat = "generic"; if ("passphrase-format" in armorHdr) { passphraseFormat = armorHdr["passphrase-format"]; } let passphraseHint = ""; if ("passphrase-begin" in armorHdr) { passphraseHint = armorHdr["passphrase-begin"]; } resolve({ attachmentData: data, passphraseFormat: passphraseFormat, passphraseHint: passphraseHint }); } else { reject("getSetupMessageData"); return; } }); let channel = EnigmailStreams.createChannel(attachmentUrl); channel.asyncOpen(s, null); }); }, /** * @return Promise(Object): * fpr: String - FPR of the imported key * preferEncrypt: String - Autocrypt preferEncrypt value (e.g. mutual) */ handleBackupMessage: function(passwd, attachmentData, fromAddr) { EnigmailLog.DEBUG("autocrypt.jsm: handleBackupMessage()\n"); return new Promise((resolve, reject) => { let start = {}, end = {}; let msgType = EnigmailArmor.locateArmoredBlock(attachmentData, 0, "", start, end, {}); let encMessage = EnigmailOpenPGP.openpgp.message.readArmored(attachmentData.substring(start.value, end.value)); let enc = { message: encMessage, password: passwd, format: 'utf8' }; EnigmailOpenPGP.openpgp.decrypt(enc).then(msg => { EnigmailLog.DEBUG("autocrypt.jsm: handleBackupMessage: data: " + msg.data.length + "\n"); let setupData = importSetupKey(msg.data); if (setupData) { EnigmailKeyEditor.setKeyTrust(null, "0x" + setupData.fpr, "5", function(returnCode) { if (returnCode === 0) { let id = EnigmailStdlib.getIdentityForEmail(EnigmailFuncs.stripEmail(fromAddr).toLowerCase()); let ac = EnigmailFuncs.getAccountForIdentity(id.identity); ac.incomingServer.setBoolValue("enableAutocrypt", true); ac.incomingServer.setIntValue("acPreferEncrypt", (setupData.preferEncrypt === "mutual" ? 1 : 0)); id.identity.setCharAttribute("pgpkeyId", "0x" + setupData.fpr); id.identity.setBoolAttribute("enablePgp", true); id.identity.setBoolAttribute("pgpSignEncrypted", true); id.identity.setBoolAttribute("pgpMimeMode", true); id.identity.setIntAttribute("pgpKeyMode", 1); EnigmailPrefs.setPref("juniorMode", 1); resolve(setupData); } else { reject("keyImportFailed"); return; } }); } else { reject("keyImportFailed"); return; } }). catch(err => { reject("wrongPasswd"); return; }); }); }, /** * Determine if a message id was self-created (only during same TB session) */ isSelfCreatedSetupMessage: function(messageId) { return (gCreatedSetupIds.indexOf(messageId) >= 0); }, /** * Check if an account is set up with OpenPGP and if the configured key is valid * * @param emailAddr: String - email address identifying the account * * @return Boolean: true: account is valid / false: OpenPGP not configured or key not valid */ isAccountSetupForPgp: function(emailAddr) { let id = EnigmailStdlib.getIdentityForEmail(EnigmailFuncs.stripEmail(emailAddr).toLowerCase()); let keyObj = null; if (!(id && id.identity)) return false; if (!id.identity.getBoolAttribute("enablePgp")) return false; if (id.identity.getIntAttribute("pgpKeyMode") === 1) { keyObj = EnigmailKeyRing.getKeyById(id.identity.getCharAttribute("pgpkeyId")); } else { keyObj = EnigmailKeyRing.getSecretKeyByUserId(emailAddr); } if (!keyObj) return false; if (!keyObj.secretAvailable) return false; let o = keyObj.getEncryptionValidity(); if (!o.keyValid) return false; o = keyObj.getSigningValidity(); if (!o.keyValid) return false; return true; } }; /** * use a promise to open the autocrypt database. * * it's possible that there will be an NS_ERROR_STORAGE_BUSY * so we're willing to retry for a little while. * * @param resolve: function to call when promise succeeds * @param reject: function to call when promise fails * @param waitms: Integer - number of milliseconds to wait before trying again in case of NS_ERROR_STORAGE_BUSY * @param maxtime: Integer - unix epoch (in milliseconds) of the point at which we should give up. */ function _openAutocryptDb_inner(resolve, reject, waitms, maxtime) { EnigmailLog.DEBUG("autocrypt.jsm: _openAutocryptDb_inner()\n"); Sqlite.openConnection({ path: "enigmail.sqlite", sharedMemoryCache: false }). then(connection => { resolve(connection); }). catch(error => { let now = Date.now(); if (now > maxtime) { reject(error); return; } EnigmailTimer.setTimeout(function() { _openAutocryptDb_inner(resolve, reject, waitms, maxtime); }, waitms); }); } /** * Provide an sqlite conection object asynchronously, retrying if needed * * @return Promise (connection) - the Sqlite database object */ function openAutocryptDb() { EnigmailLog.DEBUG("autocrypt.jsm: openAutocryptDb()\n"); return new Promise((resolve, reject) => { _openAutocryptDb_inner(resolve, reject, 100, Date.now() + 10000); }); } /** * Ensure that the database structure matches the latest version * (table is available) * * @param connection: Object - SQLite connection * * @return Promise */ function checkDatabaseStructure(connection) { EnigmailLog.DEBUG("autocrypt.jsm: checkDatabaseStructure\n"); let deferred = PromiseUtils.defer(); connection.tableExists("autocrypt_keydata").then( function onSuccess(exists) { EnigmailLog.DEBUG("autocrypt.jsm: checkDatabaseStructure - success\n"); if (!exists) { createAutocryptTable(connection, deferred); } else { deferred.resolve(); } }, function onError(error) { EnigmailLog.DEBUG("autocrypt.jsm: checkDatabaseStructure - error\n"); deferred.reject(error); } ); return deferred.promise; } /** * Create the "autocrypt_keydata" table and the corresponding index * * @param connection: Object - SQLite connection * @param deferred: Promise */ function createAutocryptTable(connection, deferred) { EnigmailLog.DEBUG("autocrypt.jsm: createAutocryptTable\n"); connection.execute("create table autocrypt_keydata (" + "email text not null, " + // email address of correspondent "keydata text not null, " + // base64-encoded key as received "fpr text, " + // fingerprint of key "type text not null, " + // key type (currently only 1==OpenPGP) "last_seen_autocrypt text, " + "last_seen text not null, " + "state text not null);"). // timestamp of last mail received for the email/type combination then( function _ok() { EnigmailLog.DEBUG("autocrypt.jsm: createAutocryptTable - index\n"); connection.execute("create unique index autocrypt_keydata_i1 on autocrypt_keydata(email, type)"). then(function _f() { deferred.resolve(); }); } ); } /** * Find the database record for a given email address and type * * @param connection: Object - SQLite connection * @param emails Array of String - Email addresses to search * @param type: String - type to search (in lowercase) * * @return Promise */ function findUserRecord(connection, emails, type) { EnigmailLog.DEBUG("autocrypt.jsm: findUserRecord\n"); let deferred = PromiseUtils.defer(); let data = []; let queryParam = { type: type, e0: emails[0] }; let numRows = 0; let search = ":e0"; for (let i = 1; i < emails.length; i++) { search += ", :e" + i; queryParam["e" + i] = emails[i].toLowerCase(); } connection.execute( "select * from autocrypt_keydata where email in (" + search + ") and type = :type", queryParam, function _onRow(row) { EnigmailLog.DEBUG("autocrypt.jsm: findUserRecord - got row\n"); data.push(row); ++numRows; } ).then(function _f() { deferred.resolve({ data: data, numRows: numRows }); }); return deferred.promise; } /** * Create new database record for an Autorypt header * * @param connection: Object - SQLite connection * @param paramsArr: Object - the Autocrypt header parameters * * @return Promise */ function appendUser(connection, paramsArr) { EnigmailLog.DEBUG("autocrypt.jsm: appendUser(" + paramsArr.addr + ")\n"); let deferred = PromiseUtils.defer(); if (!("fpr" in paramsArr)) { getFprForKey(paramsArr); } if (paramsArr.autocryptDate == 0) { // do not insert record for non-autocrypt mail deferred.resolve(); return deferred.promise; } connection.executeTransaction(function _trx() { connection.execute("insert into autocrypt_keydata (email, keydata, fpr, type, last_seen_autocrypt, last_seen, state) values " + "(:email, :keyData, :fpr, :type, :lastAutocrypt, :lastSeen, :state)", { email: paramsArr.addr.toLowerCase(), keyData: paramsArr.keydata, fpr: ("fpr" in paramsArr ? paramsArr.fpr : ""), type: paramsArr.type, lastAutocrypt: paramsArr.dateSent.toJSON(), lastSeen: paramsArr.dateSent.toJSON(), state: paramsArr["prefer-encrypt"] }).then( function _ok() { EnigmailLog.DEBUG("autocrypt.jsm: appendUser - OK\n"); deferred.resolve(); } ).catch(function _err() { deferred.reject("appendUser"); }); }); return deferred.promise; } /** * Update the record for an email address and type, if the email we got is newer * than the latest record we already stored * * @param connection: Object - SQLite connection * @param paramsArr: Object - the Autocrypt header parameters * @param resultRows: Array of mozIStorageRow - records stored in the database * @param autoCryptEnabled: Boolean: is autocrypt enabled for this transaction * * @return Promise */ function updateUser(connection, paramsArr, resultRows, autoCryptEnabled) { EnigmailLog.DEBUG("autocrypt.jsm: updateUser\n"); let currData = resultRows[0]; let deferred = PromiseUtils.defer(); let lastSeen = new Date(currData.getResultByName("last_seen")); let lastAutocrypt = new Date(currData.getResultByName("last_seen_autocrypt")); if (lastSeen >= paramsArr.dateSent) { EnigmailLog.DEBUG("autocrypt.jsm: updateUser: not a new latest message\n"); EnigmailTimer.setTimeout(function _f() { deferred.resolve(); }, 0); return deferred.promise; } EnigmailLog.DEBUG("autocrypt.jsm: updateUser: updating latest message\n"); let updateStr; let updateObj; if (paramsArr.autocryptDate > 0) { lastAutocrypt = paramsArr.autocryptDate; if (!("fpr" in paramsArr)) { getFprForKey(paramsArr); } if (autoCryptEnabled) { updateRuleForEmail(paramsArr.addr, paramsArr["prefer-encrypt"]); } updateStr = "update autocrypt_keydata set state = :state, keydata = :keyData, last_seen_autocrypt = :lastAutocrypt, " + "fpr = :fpr, last_seen = :lastSeen where email = :email and type = :type"; updateObj = { email: paramsArr.addr.toLowerCase(), state: paramsArr["prefer-encrypt"], keyData: paramsArr.keydata, fpr: ("fpr" in paramsArr ? paramsArr.fpr : ""), type: paramsArr.type, lastAutocrypt: lastAutocrypt.toJSON(), lastSeen: paramsArr.dateSent.toJSON() }; } else { updateStr = "update autocrypt_keydata set state = :state, last_seen = :lastSeen where email = :email and type = :type"; updateObj = { email: paramsArr.addr.toLowerCase(), state: paramsArr["prefer-encrypt"], type: paramsArr.type, lastSeen: paramsArr.dateSent.toJSON() }; } if (!("fpr" in paramsArr)) { getFprForKey(paramsArr); } connection.executeTransaction(function _trx() { connection.execute(updateStr, updateObj).then( function _ok() { deferred.resolve(); } ).catch(function _err() { deferred.reject("update failed"); }); }); return deferred.promise; } /** * Set the fpr attribute for a given key parameter object */ function getFprForKey(paramsArr) { try { let keyData = atob(paramsArr.keydata); let err = {}; let keyInfo = EnigmailKey.getKeyListFromKeyBlock(keyData, err, false); if (keyInfo.length === 1) { paramsArr.fpr = keyInfo[0].fpr; } } catch (x) {} } /** * Create the 9x4 digits backup code as defined in the Autocrypt spec * * @return String: xxxx-xxxx-... */ function createBackupCode() { let bkpCode = ""; let crypto = EnigmailOpenPGP.enigmailFuncs.getCrypto(); for (let i = 0; i < 9; i++) { if (i > 0) bkpCode += "-"; let a = new Uint8Array(4); crypto.getRandomValues(a); for (let j = 0; j < 4; j++) { bkpCode += String(a[j] % 10); } } return bkpCode; } function createBackupOuterMsg(toEmail, encryptedMsg) { let boundary = EnigmailMime.createBoundary(); let msgStr = 'To: ' + toEmail + '\r\n' + 'From: ' + toEmail + '\r\n' + 'Autocrypt-Setup-Message: v1\r\n' + 'Subject: ' + EnigmailLocale.getString("autocrypt.setupMsg.subject") + '\r\n' + 'Content-type: multipart/mixed; boundary="' + boundary + '"\r\n\r\n' + '--' + boundary + '\r\n' + 'Content-Type: text/plain\r\n\r\n' + EnigmailLocale.getString("autocryptSetupReq.setupMsg.desc") + '\r\n\r\n' + EnigmailLocale.getString("autocrypt.setupMsg.msgBody") + '\r\n\r\n' + EnigmailLocale.getString("autocryptSetupReq.setupMsg.backup") + '\r\n' + '--' + boundary + '\r\n' + 'Content-Type: application/autocrypt-setup\r\n' + 'Content-Disposition: attachment; filename="autocrypt-setup-message.html"\r\n\r\n' + '\r\n' + '

' + EnigmailLocale.getString("autocrypt.setupMsg.fileTxt") + '

\r\n' + '
\r\n' +
    encryptedMsg +
    '
\r\n' + '--' + boundary + '--\r\n'; return msgStr; } /** * @return Object: * fpr: String - FPR of the imported key * preferEncrypt: String - Autocrypt preferEncrypt value (e.g. mutual) */ function importSetupKey(keyData) { EnigmailLog.DEBUG("autocrypt.jsm: importSetupKey()\n"); let preferEncrypt = "nopreference"; // Autocrypt default according spec let start = {}, end = {}, keyObj = {}; let msgType = EnigmailArmor.locateArmoredBlock(keyData, 0, "", start, end, {}); if (msgType === "PRIVATE KEY BLOCK") { let headers = EnigmailArmor.getArmorHeaders(keyData); if ("autocrypt-prefer-encrypt" in headers) { preferEncrypt = headers["autocrypt-prefer-encrypt"]; } let r = EnigmailKeyRing.importKey(null, false, keyData, "", {}, keyObj); if (r === 0 && keyObj.value && keyObj.value.length > 0) { return { fpr: keyObj.value[0], preferEncrypt: preferEncrypt }; } } return null; } function updateRuleForEmail(email, preferEncrypt) { let node = EnigmailRules.getRuleByEmail(EnigmailConstants.AC_RULE_PREFIX + email); if (node) { let signEncrypt = (preferEncrypt === "mutual" ? "1" : "0"); if (node.getAttribute("sign") !== signEncrypt || node.getAttribute("encrypt") !== signEncrypt) { node.setAttribute("sign", signEncrypt); node.setAttribute("encrypt", signEncrypt); EnigmailRules.saveRulesFile(); } } } enigmail-2.0.8/package/bootstrap.js000066400000000000000000000076141334302754500172720ustar00rootroot00000000000000/*global Components: false */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; /* global APP_SHUTDOWN: false */ const Cu = Components.utils; const Cc = Components.classes; const Ci = Components.interfaces; Cu.importGlobalProperties(["XMLHttpRequest"]); var gAllModules = []; function install() {} function uninstall() {} function startup(data, reason) { try { const { EnigmailApp } = Cu.import("resource://enigmail/app.jsm", {}); const { EnigmailCore } = Cu.import("resource://enigmail/core.jsm", {}); const { EnigmailAmPrefsService } = Cu.import("resource://enigmail/amPrefsService.jsm", {}); const { EnigmailPgpmimeHander } = Cu.import("resource://enigmail/pgpmimeHandler.jsm", {}); loadListOfModules(); EnigmailApp.initAddon(data); EnigmailAmPrefsService.startup(reason); EnigmailCore.startup(reason); EnigmailPgpmimeHander.startup(reason); } catch (ex) { logException(ex); } } function shutdown(data, reason) { try { const { EnigmailMsgRead } = Cu.import("resource://enigmail/msgRead.jsm", {}); EnigmailMsgRead.onShutdown(reason); const { subprocess } = Cu.import("resource://enigmail/subprocess.jsm", {}); subprocess.onShutdown(); if (reason === APP_SHUTDOWN) return; const { EnigmailCore } = Cu.import("resource://enigmail/core.jsm", {}); const { EnigmailAmPrefsService } = Cu.import("resource://enigmail/amPrefsService.jsm", {}); const { EnigmailPgpmimeHander } = Cu.import("resource://enigmail/pgpmimeHandler.jsm", {}); const { EnigmailOverlays } = Cu.import("resource://enigmail/overlays.jsm", {}); const { EnigmailWindows } = Cu.import("resource://enigmail/windows.jsm", {}); const { Services } = Components.utils.import("resource://gre/modules/Services.jsm", {}); shutdownModule(EnigmailWindows, reason); shutdownModule(EnigmailOverlays, reason); shutdownModule(EnigmailAmPrefsService, reason); shutdownModule(EnigmailCore, reason); shutdownModule(EnigmailPgpmimeHander, reason); unloadModules(); // HACK WARNING: The Addon Manager does not properly clear all addon related caches on update; // in order to fully update images and locales, their caches need clearing here Services.obs.notifyObservers(null, "chrome-flush-caches", null); } catch (ex) { logException(ex); } } /** * Perform shutdown of a module */ function shutdownModule(module, reason) { try { module.shutdown(reason); } catch (ex) {} } /** * Load list of all Enigmail modules that can be potentially loaded */ function loadListOfModules() { let request = new XMLHttpRequest(); request.open("GET", "resource://enigmail/all-modules.txt", true); // async=true request.responseType = "text"; request.onerror = function(event) {}; request.onload = function(event) { if (request.response) { gAllModules = []; let modules = request.response.split(/[\r\n]/); for (let mod of modules) { mod = mod.replace(/^modules/, ""); gAllModules.push(mod); } } else request.onerror(event); }; request.send(); } /** * Unload all Enigmail modules that were potentially loaded */ function unloadModules() { for (let mod of gAllModules) { try { // cannot unload filtersWrapper as you can't unregister filters in TB if (mod !== "filtersWrapper.jsm") { Cu.unload("resource://enigmail" + mod); } } catch (ex) {} } } function logException(exc) { try { const { Services } = Cu.import("resource://gre/modules/Services.jsm"); Services.console.logStringMessage(exc.toString() + "\n" + exc.stack); } catch (x) {} } enigmail-2.0.8/package/card.jsm000066400000000000000000000022731334302754500163370ustar00rootroot00000000000000/*global Components: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailCard"]; const Cu = Components.utils; Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ Cu.import("resource://enigmail/execution.jsm"); /*global EnigmailExecution: false */ Cu.import("resource://enigmail/gpg.jsm"); /*global EnigmailGpg: false */ var EnigmailCard = { getCardStatus: function(exitCodeObj, errorMsgObj) { EnigmailLog.DEBUG("card.jsm: EnigmailCard.getCardStatus\n"); const args = EnigmailGpg.getStandardArgs(false). concat(["--no-verbose", "--status-fd", "2", "--fixed-list-mode", "--with-colons", "--card-status"]); const statusMsgObj = {}; const statusFlagsObj = {}; const outputTxt = EnigmailExecution.execCmd(EnigmailGpg.agentPath, args, "", exitCodeObj, statusFlagsObj, statusMsgObj, errorMsgObj); if ((exitCodeObj.value === 0) && !outputTxt) { exitCodeObj.value = -1; return ""; } return outputTxt; } }; enigmail-2.0.8/package/chrome.manifest000077500000000000000000000036261334302754500177260ustar00rootroot00000000000000content enigmail chrome/content/ locale enigmail en-US chrome/locale/en-US/ # Skin for TBird Mac OS X skin enigmail classic/1.0 chrome/skin/tb-mac/ application!={92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a} os=Darwin # Skin for TBird Windows skin enigmail classic/1.0 chrome/skin/tb-win-xp/ application!={92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a} os=WINNT osversion<6 skin enigmail classic/1.0 chrome/skin/aero/ application!={92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a} os=WINNT osversion>=6 skin enigmail classic/1.0 chrome/skin/tb-win-xp/ application!={92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a} os=OS2 # Skin for TBird other OS (e.g. Linux) skin enigmail classic/1.0 chrome/skin/tb-linux/ application!={92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a} os=Linux skin enigmail classic/1.0 chrome/skin/tb-linux/ application!={92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a} os=SunOS skin enigmail classic/1.0 chrome/skin/tb-linux/ application!={92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a} os=FreeBSD skin enigmail classic/1.0 chrome/skin/tb-linux/ application!={92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a} os=OpenBSD skin enigmail classic/1.0 chrome/skin/tb-linux/ application!={92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a} os=NetBSD skin enigmail classic/1.0 chrome/skin/tb-linux/ application!={92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a} os=AIX skin enigmail classic/1.0 chrome/skin/tb-linux/ application!={92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a} os=HP-UX skin enigmail classic/1.0 chrome/skin/tb-linux/ application!={92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a} os=DragonFly # Skin for SeaMonkey skin enigmail classic/1.0 chrome/skin/classic-seamonkey/ application={92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a} skin enigmail modern/1.0 chrome/skin/modern/ # Resource module registration resource enigmail modules/ enigmail-2.0.8/package/clipboard.jsm000066400000000000000000000072511334302754500173660ustar00rootroot00000000000000/*global Components: false */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailClipboard"]; // Import the Services module for future use, if we're not in // a browser window where it's already loaded. Components.utils.import('resource://gre/modules/Services.jsm'); const Ci = Components.interfaces; const Cc = Components.classes; // Create a constructor for the built-in supports-string class. const nsSupportsString = Components.Constructor("@mozilla.org/supports-string;1", "nsISupportsString"); function SupportsString(str) { // Create an instance of the supports-string class var res = nsSupportsString(); // Store the JavaScript string that we want to wrap in the new nsISupportsString object res.data = str; return res; } // Create a constructor for the built-in transferable class const nsTransferable = Components.Constructor("@mozilla.org/widget/transferable;1", "nsITransferable"); // Create a wrapper to construct an nsITransferable instance and set its source to the given window, when necessary function Transferable(source) { let res = nsTransferable(); if ('init' in res) { // When passed a Window object, find a suitable privacy context for it. if (source instanceof Ci.nsIDOMWindow) source = source.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIWebNavigation); res.init(source); } return res; } var EnigmailClipboard = { /** * Get the content string of a clipboard * * @param window : nsIWindow or nsIDOMWindow of caller * @param clipBoardType: Number - clipboard type according to nsIClipboard * * @return String - content of clipBoard */ getClipboardContent: function(window, clipBoardType) { if (!window) throw "erorr - window must not be null"; let clipBoard = Cc["@mozilla.org/widget/clipboard;1"].getService(Ci.nsIClipboard); let data = {}; let cBoardContent = ""; if (clipBoardType !== clipBoard.kSelectionClipboard || clipBoard.supportsSelectionClipboard()) { try { let transferable = Transferable(window); transferable.addDataFlavor("text/unicode"); clipBoard.getData(transferable, clipBoardType); let flavour = {}; let length = {}; transferable.getAnyTransferData(flavour, data, length); cBoardContent = data.value.QueryInterface(Ci.nsISupportsString).data; } catch (ex) {} } return cBoardContent; }, /** * Set the global (and if available, the selection clipboard) * * @param str: String - data to set * @param clipBoardType: Number - clipboard type according to nsIClipboard. * If not provided, the global plus the selection clipboard will be used * * @return Boolean: true - success / false - failure */ setClipboardContent: function(str, clipBoardType) { let useClipboard = clipBoardType; if (clipBoardType === undefined) { useClipboard = Ci.nsIClipboard.kGlobalClipboard; } try { let clipBoard = Cc["@mozilla.org/widget/clipboard;1"].getService(Ci.nsIClipboard); let clipBoardHlp = Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper); clipBoardHlp.copyStringToClipboard(str, useClipboard); if (clipBoard.supportsSelectionClipboard() && (useClipboard === Ci.nsIClipboard.kSelectionClipboard || clipBoardType === undefined)) { clipBoardHlp.copyStringToClipboard(str, Ci.nsIClipboard.kSelectionClipboard); } } catch (ex) { return false; } return true; } }; enigmail-2.0.8/package/commandLine.jsm000066400000000000000000000033221334302754500176500ustar00rootroot00000000000000/*global Components: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailCommandLine"]; const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; Cu.import("resource://gre/modules/XPCOMUtils.jsm"); /*global XPCOMUtils: false */ const NS_ENIGCLINE_SERVICE_CID = Components.ID("{847b3ab1-7ab1-11d4-8f02-006008948af5}"); const NS_CLINE_SERVICE_CONTRACTID = "@mozilla.org/enigmail/cline-handler;1"; const nsICommandLineHandler = Ci.nsICommandLineHandler; const nsIFactory = Ci.nsIFactory; function Handler() {} Handler.prototype = { classDescription: "Enigmail Key Management CommandLine Service", classID: NS_ENIGCLINE_SERVICE_CID, contractID: NS_CLINE_SERVICE_CONTRACTID, QueryInterface: XPCOMUtils.generateQI([nsICommandLineHandler, nsIFactory]), // nsICommandLineHandler handle: function(cmdLine) { if (cmdLine.handleFlag("pgpkeyman", false)) { cmdLine.preventDefault = true; // do not open main app window const wwatch = Cc["@mozilla.org/embedcomp/window-watcher;1"].getService(Ci.nsIWindowWatcher); wwatch.openWindow(null, "chrome://enigmail/content/enigmailKeyManager.xul", "_blank", "chrome,dialog=no,all", cmdLine); } }, helpInfo: " -pgpkeyman Open the OpenPGP key management.\n", lockFactory: function(lock) {} }; var EnigmailCommandLine = { Handler: Handler, categoryRegistry: { category: "command-line-handler", entry: "m-cline-enigmail", serviceName: NS_CLINE_SERVICE_CONTRACTID } }; enigmail-2.0.8/package/configBackup.jsm000066400000000000000000000143451334302754500200240ustar00rootroot00000000000000/*global Components: false */ /*jshint -W097 */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailConfigBackup"]; const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; Cu.import("resource://enigmail/log.jsm"); /* global EnigmailLog: false */ Cu.import("resource://enigmail/rules.jsm"); /* global EnigmailRules: false */ Cu.import("resource://enigmail/files.jsm"); /* global EnigmailFiles: false */ Cu.import("resource://enigmail/prefs.jsm"); /* global EnigmailPrefs: false */ const TYPE_BOOL = 1; const TYPE_CHAR = 2; const TYPE_INT = 3; const IdentityPref = { enablePgp: TYPE_BOOL, pgpkeyId: TYPE_CHAR, pgpKeyMode: TYPE_INT, pgpSignPlain: TYPE_BOOL, pgpSignEncrypted: TYPE_BOOL, defaultSigningPolicy: TYPE_INT, defaultEncryptionPolicy: TYPE_INT, openPgpHeaderMode: TYPE_INT, openPgpUrlName: TYPE_CHAR, pgpMimeMode: TYPE_BOOL, attachPgpKey: TYPE_BOOL, autoEncryptDrafts: TYPE_BOOL }; var EnigmailConfigBackup = { getAccountManager: function() { let amService = Cc["@mozilla.org/messenger/account-manager;1"].getService(Ci.nsIMsgAccountManager); return amService; }, /** * itereate over all identities and execute a callback function for each found element * * @param callbackFunc function - the callback for each identity * The function takes the identity as 1st argument, i.e. * callbackFunc(nsIMsgIdentity) * @return - undefined */ forAllIdentitites: function(callbackFunc) { let amService = this.getAccountManager(); amService.LoadAccounts(); // ensure accounts are really loaded let a = amService.allIdentities; for (let i = 0; i < a.length; i++) { let id = a.queryElementAt(i, Ci.nsIMsgIdentity); try { callbackFunc(id); } catch (ex) { EnigmailLog.DEBUG("configBackup.jsm: forAllIdentitites: exception " + ex.toString() + "\n"); } } }, /** * backup Enigmail preferences to a file * * @param outputFile nsIFile - handle to file to be saved * * @return 0: success, other values: failure */ backupPrefs: function(outputFile) { EnigmailLog.DEBUG("configBackup.jsm: backupPrefs\n"); // user preference let prefObj = { enigmailPrefs: EnigmailPrefs.getAllPrefs(), mailIdentities: {} }; function getIdentityPrefs(identity) { if (!identity.getBoolAttribute("enablePgp")) return; // do nothing if Enigmail disabled let keyObj = { emailAddress: identity.email.toLowerCase(), identityName: identity.identityName }; for (let pref in IdentityPref) { switch (IdentityPref[pref]) { case TYPE_BOOL: keyObj[pref] = identity.getBoolAttribute(pref); break; case TYPE_INT: keyObj[pref] = identity.getIntAttribute(pref); break; case TYPE_CHAR: keyObj[pref] = identity.getCharAttribute(pref); break; } } prefObj.mailIdentities[identity.key] = keyObj; } this.forAllIdentitites(getIdentityPrefs); // per-recipient rules (aka pgpRules.xml) var rulesFile = EnigmailRules.getRulesFile(); if (rulesFile.exists()) { prefObj.rules = EnigmailFiles.readFile(rulesFile); } let jsonStr = JSON.stringify(prefObj); // serialize everything to UTF-8 encoded JSON. if (EnigmailFiles.writeFileContents(outputFile, jsonStr)) { return 0; } return -1; }, /** * Restore Enigmail preferences from a file as generated by backpPrefs() * * @param inputFile nsIFile - handle to file to be saved * * @return Object: { * retVal: Number - 0: success, other values: failure * unmatchedIds: Array (String): keys of identities * } */ restorePrefs: function(inputFile) { EnigmailLog.DEBUG("configBackup.jsm: restorePrefs\n"); var prefObj; var returnObj = { retVal: -1, unmatchedIds: [] }; function setIdentityPref(identity) { for (let k in prefObj.mailIdentities) { if (prefObj.mailIdentities[k].emailAddress === identity.email.toLowerCase()) { EnigmailLog.DEBUG("configBackup.jsm: setIdentityPref: restoring values for " + identity.email + "\n"); prefObj.mailIdentities[k].foundMatchingEmail = true; let keyObj = prefObj.mailIdentities[k]; for (let pref in IdentityPref) { switch (IdentityPref[pref]) { case TYPE_BOOL: identity.setBoolAttribute(pref, keyObj[pref]); break; case TYPE_INT: identity.setIntAttribute(pref, keyObj[pref]); break; case TYPE_CHAR: identity.setCharAttribute(pref, keyObj[pref]); break; } } return; } } EnigmailLog.DEBUG("configBackup.jsm: setIdentityPref: no matching data for " + identity.email + "\n"); } // Profile must be a single UTF-8 encoded JSON object. try { let jsonStr = EnigmailFiles.readFile(inputFile); prefObj = JSON.parse(jsonStr); var nsIPB = Ci.nsIPrefBranch; var branch = EnigmailPrefs.getPrefBranch(); // Set all options recorded in the JSON file. for (let name in prefObj.enigmailPrefs) { EnigmailPrefs.setPref(name, prefObj.enigmailPrefs[name]); } this.forAllIdentitites(setIdentityPref); for (let i in prefObj.mailIdentities) { if (!("foundMatchingEmail" in prefObj.mailIdentities[i])) { returnObj.unmatchedIds.push(prefObj.mailIdentities[i].identityName); } } let am = this.getAccountManager(); am.saveAccountInfo(); EnigmailPrefs.savePrefs(); if ("rules" in prefObj) { EnigmailRules.loadRulesFromString(prefObj.rules); EnigmailRules.saveRulesFile(); } } catch (ex) { EnigmailLog.ERROR("configBackup.jsm: restorePrefs - exception " + ex.toString() + "\n"); return returnObj; } returnObj.retVal = 0; return returnObj; } }; enigmail-2.0.8/package/configure.jsm000066400000000000000000000223101334302754500174010ustar00rootroot00000000000000/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ /*global Components: false */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailConfigure"]; const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; /*global EnigmailLog: false, EnigmailPrefs: false, EnigmailTimer: false, EnigmailApp: false, EnigmailLocale: false, EnigmailDialog: false, EnigmailWindows: false */ Cu.import("resource://enigmail/log.jsm"); Cu.import("resource://enigmail/prefs.jsm"); Cu.import("resource://enigmail/timer.jsm"); Cu.import("resource://enigmail/app.jsm"); Cu.import("resource://enigmail/locale.jsm"); Cu.import("resource://enigmail/dialog.jsm"); Cu.import("resource://enigmail/windows.jsm"); Cu.import("resource://enigmail/core.jsm"); /* global EnigmailCore: false */ Cu.import("resource://enigmail/pEpAdapter.jsm"); /* global EnigmailPEPAdapter: false */ Cu.import("resource://enigmail/installPep.jsm"); /* global EnigmailInstallPep: false */ Cu.import("resource://enigmail/stdlib.jsm"); /* global EnigmailStdlib: false */ Cu.import("resource://enigmail/lazy.jsm"); /* global EnigmailLazy: false */ /** * Upgrade sending prefs * (v1.6.x -> v1.7 ) */ function upgradePrefsSending() { EnigmailLog.DEBUG("enigmailCommon.jsm: upgradePrefsSending()\n"); var cbs = EnigmailPrefs.getPref("confirmBeforeSend"); var ats = EnigmailPrefs.getPref("alwaysTrustSend"); var ksfr = EnigmailPrefs.getPref("keepSettingsForReply"); EnigmailLog.DEBUG("enigmailCommon.jsm: upgradePrefsSending cbs=" + cbs + " ats=" + ats + " ksfr=" + ksfr + "\n"); // Upgrade confirmBeforeSend (bool) to confirmBeforeSending (int) switch (cbs) { case false: EnigmailPrefs.setPref("confirmBeforeSending", 0); // never break; case true: EnigmailPrefs.setPref("confirmBeforeSending", 1); // always break; } // Upgrade alwaysTrustSend (bool) to acceptedKeys (int) switch (ats) { case false: EnigmailPrefs.setPref("acceptedKeys", 0); // valid break; case true: EnigmailPrefs.setPref("acceptedKeys", 1); // all break; } // if all settings are default settings, use convenient encryption if (cbs === false && ats === true && ksfr === true) { EnigmailPrefs.setPref("encryptionModel", 0); // convenient EnigmailLog.DEBUG("enigmailCommon.jsm: upgradePrefsSending() encryptionModel=0 (convenient)\n"); } else { EnigmailPrefs.setPref("encryptionModel", 1); // manually EnigmailLog.DEBUG("enigmailCommon.jsm: upgradePrefsSending() encryptionModel=1 (manually)\n"); } // clear old prefs EnigmailPrefs.getPrefBranch().clearUserPref("confirmBeforeSend"); EnigmailPrefs.getPrefBranch().clearUserPref("alwaysTrustSend"); } /** * Replace short key IDs with FPR in identity settings * (v1.9 -> v2.0) */ function replaceKeyIdWithFpr() { try { const GetKeyRing = EnigmailLazy.loader("enigmail/keyRing.jsm", "EnigmailKeyRing"); var accountManager = Cc["@mozilla.org/messenger/account-manager;1"].getService(Ci.nsIMsgAccountManager); for (var i = 0; i < accountManager.allIdentities.length; i++) { var id = accountManager.allIdentities.queryElementAt(i, Ci.nsIMsgIdentity); if (id.getBoolAttribute("enablePgp")) { let keyId = id.getCharAttribute("pgpkeyId"); if (keyId.search(/^(0x)?[a-fA-F0-9]{8}$/) === 0) { EnigmailCore.getService(); let k = GetKeyRing().getKeyById(keyId); if (k) { id.setCharAttribute("pgpkeyId", "0x" + k.fpr); } else { id.setCharAttribute("pgpkeyId", ""); } } } } } catch (ex) { EnigmailDialog.alert("config upgrade: error" + ex.toString()); } } /** * Change the default to PGP/MIME for all accounts, except nntp * (v1.8.x -> v1.9) */ function defaultPgpMime() { let accountManager = Cc["@mozilla.org/messenger/account-manager;1"].getService(Ci.nsIMsgAccountManager); let changedSomething = false; for (let acct = 0; acct < accountManager.accounts.length; acct++) { let ac = accountManager.accounts.queryElementAt(acct, Ci.nsIMsgAccount); if (ac.incomingServer.type.search(/(pop3|imap|movemail)/) >= 0) { for (let i = 0; i < ac.identities.length; i++) { let id = ac.identities.queryElementAt(i, Ci.nsIMsgIdentity); if (id.getBoolAttribute("enablePgp") && !id.getBoolAttribute("pgpMimeMode")) { changedSomething = true; } id.setBoolAttribute("pgpMimeMode", true); } } } if (EnigmailPrefs.getPref("advancedUser") && changedSomething) { EnigmailDialog.alert(null, EnigmailLocale.getString("preferences.defaultToPgpMime")); } } /** * set the Autocrypt prefer-encrypt option to "mutual" for all existing * accounts */ function setAutocryptForOldAccounts() { try { let accountManager = Cc["@mozilla.org/messenger/account-manager;1"].getService(Ci.nsIMsgAccountManager); let changedSomething = false; for (let acct = 0; acct < accountManager.accounts.length; acct++) { let ac = accountManager.accounts.queryElementAt(acct, Ci.nsIMsgAccount); if (ac.incomingServer.type.search(/(pop3|imap|movemail)/) >= 0) { ac.incomingServer.setIntValue("acPreferEncrypt", 1); } } } catch (ex) {} } /** * Determine if pEp is avaliable, and if it is not available, * whether it can be downaloaded and installed. This does not * trigger installation. */ function isPepInstallable() { if (EnigmailPEPAdapter.isPepAvailable(false)) { return true; } return EnigmailInstallPep.isPepInstallerAvailable(); } function displayUpgradeInfo() { EnigmailLog.DEBUG("configure.jsm: displayUpgradeInfo()\n"); try { EnigmailWindows.openMailTab("chrome://enigmail/content/upgradeInfo.html"); } catch (ex) {} } var EnigmailConfigure = { configureEnigmail: function(win, startingPreferences) { EnigmailLog.DEBUG("configure.jsm: configureEnigmail()\n"); if (!EnigmailStdlib.hasConfiguredAccounts()) { EnigmailLog.DEBUG("configure.jsm: configureEnigmail: no account configured. Waiting 60 seconds.\n"); // try again in 60 seconds EnigmailTimer.setTimeout( function _f() { EnigmailConfigure.configureEnigmail(win, startingPreferences); }, 60000); return; } let oldVer = EnigmailPrefs.getPref("configuredVersion"); let vc = Cc["@mozilla.org/xpcom/version-comparator;1"].getService(Ci.nsIVersionComparator); if (oldVer === "") { EnigmailPrefs.setPref("configuredVersion", EnigmailApp.getVersion()); if (EnigmailPrefs.getPref("juniorMode") === 0 || (!isPepInstallable())) { // start wizard if pEp Junior Mode is forced off or if pep cannot // be installed/used EnigmailWindows.openSetupWizard(win, false); } } else { if (vc.compare(oldVer, "1.7a1pre") < 0) { // 1: rules only // => assignKeysByRules true; rest false // 2: rules & email addresses (normal) // => assignKeysByRules/assignKeysByEmailAddr/assignKeysManuallyIfMissing true // 3: email address only (no rules) // => assignKeysByEmailAddr/assignKeysManuallyIfMissing true // 4: manually (always prompt, no rules) // => assignKeysManuallyAlways true // 5: no rules, no key selection // => assignKeysByRules/assignKeysByEmailAddr true upgradePrefsSending(); } if (vc.compare(oldVer, "1.7") < 0) { // open a modal dialog. Since this might happen during the opening of another // window, we have to do this asynchronously EnigmailTimer.setTimeout( function _cb() { var doIt = EnigmailDialog.confirmDlg(win, EnigmailLocale.getString("enigmailCommon.versionSignificantlyChanged"), EnigmailLocale.getString("enigmailCommon.checkPreferences"), EnigmailLocale.getString("dlg.button.close")); if (!startingPreferences && doIt) { // same as: // - EnigmailWindows.openPrefWindow(window, true, 'sendingTab'); // but // - without starting the service again because we do that right now // - and modal (waiting for its end) win.openDialog("chrome://enigmail/content/pref-enigmail.xul", "_blank", "chrome,resizable=yes,modal", { 'showBasic': true, 'clientType': 'thunderbird', 'selectTab': 'sendingTab' }); } }, 100); } if (vc.compare(oldVer, "1.9a2pre") < 0) { defaultPgpMime(); } if (vc.compare(oldVer, "2.0a1pre") < 0) { this.upgradeTo20(); } if (vc.compare(oldVer, "2.0.1a2pre") < 0) { this.upgradeTo201(); } } EnigmailPrefs.setPref("configuredVersion", EnigmailApp.getVersion()); EnigmailPrefs.savePrefs(); }, upgradeTo20: function() { EnigmailPrefs.setPref("juniorMode", 0); // disable pEp if upgrading from older version replaceKeyIdWithFpr(); displayUpgradeInfo(); }, upgradeTo201: function() { setAutocryptForOldAccounts(); } }; enigmail-2.0.8/package/constants.jsm000066400000000000000000000102231334302754500174340ustar00rootroot00000000000000/*global Components: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailConstants"]; var EnigmailConstants = { POSSIBLE_PGPMIME: -2081, // possible values for // - encryptByRule, signByRules, pgpmimeByRules // - encryptForced, signForced, pgpmimeForced (except CONFLICT) // NOTE: // - values 0/1/2 are used with this fixed semantics in the persistent rules // - see also enigmailEncryptionDlg.xul ENIG_NEVER: 0, ENIG_UNDEF: 1, ENIG_ALWAYS: 2, ENIG_FORCE_SMIME: 3, ENIG_AUTO_ALWAYS: 22, ENIG_CONFLICT: 99, ENIG_FINAL_UNDEF: -1, ENIG_FINAL_NO: 0, ENIG_FINAL_YES: 1, ENIG_FINAL_FORCENO: 10, ENIG_FINAL_FORCEYES: 11, ENIG_FINAL_SMIME: 97, // use S/MIME (automatically chosen) ENIG_FINAL_FORCESMIME: 98, // use S/MIME (forced by user) ENIG_FINAL_CONFLICT: 99, MIME_HANDLER_UNDEF: 0, MIME_HANDLER_SMIME: 1, MIME_HANDLER_PGPMIME: 2, ICONTYPE_INFO: 1, ICONTYPE_QUESTION: 2, ICONTYPE_ALERT: 3, ICONTYPE_ERROR: 4, FILTER_MOVE_DECRYPT: "enigmail@enigmail.net#filterActionMoveDecrypt", FILTER_COPY_DECRYPT: "enigmail@enigmail.net#filterActionCopyDecrypt", FILTER_ENCRYPT: "enigmail@enigmail.net#filterActionEncrypt", FILTER_TERM_PGP_ENCRYPTED: "enigmail@enigmail.net#filterTermPGPEncrypted", /* taken over from old nsIEnigmail */ /* Cleartext signature parts */ SIGNATURE_TEXT: 1, SIGNATURE_HEADERS: 2, SIGNATURE_ARMOR: 3, /* User interaction flags */ UI_INTERACTIVE: 0x01, UI_ALLOW_KEY_IMPORT: 0x02, UI_UNVERIFIED_ENC_OK: 0x04, UI_PGP_MIME: 0x08, UI_TEST: 0x10, UI_RESTORE_STRICTLY_MIME: 0x20, UI_IGNORE_MDC_ERROR: 0x40, // force decryption, even if we got an MDC error /* Send message flags */ SEND_SIGNED: 0x0001, // 1 SEND_ENCRYPTED: 0x0002, // 2 SEND_DEFAULT: 0x0004, // 4 SEND_LATER: 0x0008, // 8 SEND_WITH_CHECK: 0x0010, // 16 SEND_ALWAYS_TRUST: 0x0020, // 32 SEND_ENCRYPT_TO_SELF: 0x0040, // 64 SEND_PGP_MIME: 0x0080, // 128 SEND_TEST: 0x0100, // 256 SAVE_MESSAGE: 0x0200, // 512 SEND_STRIP_WHITESPACE: 0x0400, // 1024 SEND_ATTACHMENT: 0x0800, // 2048 ENCRYPT_HEADERS: 0x1000, // 4096 SEND_VERBATIM: 0x2000, // 8192 /* Status flags */ GOOD_SIGNATURE: 0x00000001, BAD_SIGNATURE: 0x00000002, UNVERIFIED_SIGNATURE: 0x00000004, EXPIRED_SIGNATURE: 0x00000008, EXPIRED_KEY_SIGNATURE: 0x00000010, EXPIRED_KEY: 0x00000020, REVOKED_KEY: 0x00000040, NO_PUBKEY: 0x00000080, NO_SECKEY: 0x00000100, IMPORTED_KEY: 0x00000200, INVALID_RECIPIENT: 0x00000400, MISSING_PASSPHRASE: 0x00000800, BAD_PASSPHRASE: 0x00001000, BAD_ARMOR: 0x00002000, NODATA: 0x00004000, DECRYPTION_INCOMPLETE: 0x00008000, DECRYPTION_FAILED: 0x00010000, DECRYPTION_OKAY: 0x00020000, MISSING_MDC: 0x00040000, TRUSTED_IDENTITY: 0x00080000, PGP_MIME_SIGNED: 0x00100000, PGP_MIME_ENCRYPTED: 0x00200000, DISPLAY_MESSAGE: 0x00400000, INLINE_KEY: 0x00800000, PARTIALLY_PGP: 0x01000000, PHOTO_AVAILABLE: 0x02000000, OVERFLOWED: 0x04000000, CARDCTRL: 0x08000000, SC_OP_FAILURE: 0x10000000, UNKNOWN_ALGO: 0x20000000, SIG_CREATED: 0x40000000, END_ENCRYPTION: 0x80000000, /*** key handling functions ***/ EXTRACT_SECRET_KEY: 0x01, /* Keyserver Action Flags */ SEARCH_KEY: 0x01, DOWNLOAD_KEY: 0x02, UPLOAD_KEY: 0x04, REFRESH_KEY: 0x08, UPLOAD_WKD: 0x10, /* attachment handling */ /* per-recipient rules */ AC_RULE_PREFIX: "autocrypt://", CARD_PIN_CHANGE: 1, CARD_PIN_UNBLOCK: 2, CARD_ADMIN_PIN_CHANGE: 3, /* Bootstrapped Addon constants */ APP_STARTUP: 1, // The application is starting up. APP_SHUTDOWN: 2, // The application is shutting down. ADDON_ENABLE: 3, // The add-on is being enabled. ADDON_DISABLE: 4, // The add-on is being disabled. (Also sent during uninstallation) ADDON_INSTALL: 5, // The add-on is being installed. ADDON_UNINSTALL: 6, // The add-on is being uninstalled. ADDON_UPGRADE: 7, // The add-on is being upgraded. ADDON_DOWNGRADE: 8 // The add-on is being downgraded. }; enigmail-2.0.8/package/core.jsm000066400000000000000000000364271334302754500163660ustar00rootroot00000000000000/*global Components: false */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; const { classes: Cc, interfaces: Ci, manager: Cm, results: Cr, utils: Cu, Constructor: CC } = Components; Cm.QueryInterface(Ci.nsIComponentRegistrar); Cu.import("resource://enigmail/subprocess.jsm"); /*global subprocess: false */ Cu.import("resource://enigmail/lazy.jsm"); /*global EnigmailLazy: false */ // load all modules lazily to avoid possible cross-reference errors const getEnigmailConsole = EnigmailLazy.loader("enigmail/pipeConsole.jsm", "EnigmailConsole"); const getEnigmailGpgAgent = EnigmailLazy.loader("enigmail/gpgAgent.jsm", "EnigmailGpgAgent"); const getEnigmailMimeEncrypt = EnigmailLazy.loader("enigmail/mimeEncrypt.jsm", "EnigmailMimeEncrypt"); const getEnigmailProtocolHandler = EnigmailLazy.loader("enigmail/protocolHandler.jsm", "EnigmailProtocolHandler"); const getEnigmailFiltersWrapper = EnigmailLazy.loader("enigmail/filtersWrapper.jsm", "EnigmailFiltersWrapper"); const getEnigmailLog = EnigmailLazy.loader("enigmail/log.jsm", "EnigmailLog"); const getEnigmailOS = EnigmailLazy.loader("enigmail/os.jsm", "EnigmailOS"); const getEnigmailLocale = EnigmailLazy.loader("enigmail/locale.jsm", "EnigmailLocale"); const getEnigmailCommandLine = EnigmailLazy.loader("enigmail/commandLine.jsm", "EnigmailCommandLine"); const getEnigmailPrefs = EnigmailLazy.loader("enigmail/prefs.jsm", "EnigmailPrefs"); const getEnigmailVerify = EnigmailLazy.loader("enigmail/mimeVerify.jsm", "EnigmailVerify"); const getEnigmailWindows = EnigmailLazy.loader("enigmail/windows.jsm", "EnigmailWindows"); const getEnigmailDialog = EnigmailLazy.loader("enigmail/dialog.jsm", "EnigmailDialog"); const getEnigmailConfigure = EnigmailLazy.loader("enigmail/configure.jsm", "EnigmailConfigure"); const getEnigmailApp = EnigmailLazy.loader("enigmail/app.jsm", "EnigmailApp"); const getEnigmailKeyRefreshService = EnigmailLazy.loader("enigmail/keyRefreshService.jsm", "EnigmailKeyRefreshService"); const getEnigmailKeyServer = EnigmailLazy.loader("enigmail/keyserver.jsm", "EnigmailKeyServer"); const getEnigmailWksMimeHandler = EnigmailLazy.loader("enigmail/wksMimeHandler.jsm", "EnigmailWksMimeHandler"); const getEnigmailPEPAdapter = EnigmailLazy.loader("enigmail/pEpAdapter.jsm", "EnigmailPEPAdapter"); const getEnigmailOverlays = EnigmailLazy.loader("enigmail/overlays.jsm", "EnigmailOverlays"); var EXPORTED_SYMBOLS = ["EnigmailCore"]; // Interfaces const nsIEnvironment = Ci.nsIEnvironment; var gPreferredGpgPath = null; var gOverwriteEnvVar = []; var gEnigmailService = null; // Global Enigmail Service var gEnvList = null; // currently filled from enigmail.js var EnigmailCore = { /** * Create a new instance of Enigmail, or return the already existing one */ createInstance: function() { if (!gEnigmailService) { gEnigmailService = new Enigmail(); } return gEnigmailService; }, startup: function(reason) { let env = getEnvironment(); initializeLogDirectory(); initializeLogging(env); getEnigmailLog().DEBUG("core.jsm: startup()\n"); getEnigmailPrefs().startup(reason); let self = this; this.factories = []; function continueStartup() { getEnigmailLog().DEBUG("core.jsm: startup.continueStartup()\n"); try { let mimeEncrypt = getEnigmailMimeEncrypt(); mimeEncrypt.startup(reason); getEnigmailOverlays().startup(reason); let cLineReg = getEnigmailCommandLine().categoryRegistry; let catMan = Cc["@mozilla.org/categorymanager;1"].getService(Ci.nsICategoryManager); catMan.addCategoryEntry(cLineReg.category, cLineReg.entry, cLineReg.serviceName, false, true); self.factories.push(new Factory(getEnigmailProtocolHandler())); self.factories.push(new Factory(getEnigmailCommandLine().Handler)); self.factories.push(new Factory(mimeEncrypt.Handler)); } catch (ex) { getEnigmailLog().DEBUG("core.jsm: startup.continueStartup: error " + ex.message + "\n" + ex.stack + "\n"); } } getEnigmailVerify().registerContentTypeHandler(); getEnigmailWksMimeHandler().registerContentTypeHandler(); getEnigmailFiltersWrapper().onStartup(); getEnigmailPEPAdapter().initialize().then(continueStartup).catch(continueStartup); }, shutdown: function(reason) { getEnigmailLog().DEBUG("core.jsm: shutdown():\n"); let cLineReg = getEnigmailCommandLine().categoryRegistry; let catMan = Cc["@mozilla.org/categorymanager;1"].getService(Ci.nsICategoryManager); catMan.deleteCategoryEntry(cLineReg.category, cLineReg.entry, false); if (this.factories) { for (let fct of this.factories) { fct.unregister(); } } getEnigmailFiltersWrapper().onShutdown(); getEnigmailPEPAdapter().onShutdown(); getEnigmailVerify().unregisterContentTypeHandler(); getEnigmailGpgAgent().finalize(); getEnigmailLocale().shutdown(); getEnigmailLog().onShutdown(); getEnigmailLog().setLogLevel(3); gEnigmailService = null; }, version: "", init: function(enigmailVersion) { this.version = enigmailVersion; }, /** * get and or initialize the Enigmail service, * including the handling for upgrading old preferences to new versions * * @win: - nsIWindow: parent window (optional) * @startingPreferences - Boolean: true - called while switching to new preferences * (to avoid re-check for preferences) */ getService: function(win, startingPreferences) { // Lazy initialization of Enigmail JS component (for efficiency) if (gEnigmailService) { return gEnigmailService.initialized ? gEnigmailService : null; } try { this.createInstance(); return gEnigmailService.getService(win, startingPreferences); } catch (ex) { return null; } }, getEnigmailService: function() { return gEnigmailService; }, setEnigmailService: function(v) { gEnigmailService = v; }, /** * obtain a list of all environment variables * * @return: Array of Strings with the following structrue * variable_name=variable_content */ getEnvList: function() { return gEnvList; }, addToEnvList: function(str) { gEnvList.push(str); }, setEnvVariable: function(varname, value) { for (let i = 0; i < gEnvList.length; i++) { if (gEnvList[i].startsWith(varname + "=")) { gEnvList[i] = varname + "=" + value; break; } } } }; /////////////////////////////////////////////////////////////////////////////// // Enigmail encryption/decryption service /////////////////////////////////////////////////////////////////////////////// function getLogDirectoryPrefix() { try { return getEnigmailPrefs().getPrefBranch().getCharPref("logDirectory") || ""; } catch (ex) { return ""; } } function initializeLogDirectory() { const prefix = getLogDirectoryPrefix(); if (prefix) { getEnigmailLog().setLogLevel(5); getEnigmailLog().setLogDirectory(prefix); getEnigmailLog().DEBUG("core.jsm: Logging debug output to " + prefix + "/enigdbug.txt\n"); } } function initializeLogging(env) { const nspr_log_modules = env.get("NSPR_LOG_MODULES"); const matches = nspr_log_modules.match(/enigmail.js:(\d+)/); if (matches && (matches.length > 1)) { getEnigmailLog().setLogLevel(Number(matches[1])); getEnigmailLog().WARNING("core.jsm: Enigmail: LogLevel=" + matches[1] + "\n"); } } function initializeSubprocessLogging(env) { const nspr_log_modules = env.get("NSPR_LOG_MODULES"); const matches = nspr_log_modules.match(/subprocess:(\d+)/); subprocess.registerLogHandler(function(txt) { getEnigmailLog().ERROR("subprocess.jsm: " + txt); }); if (matches && matches.length > 1 && matches[1] > 2) { subprocess.registerDebugHandler(function(txt) { getEnigmailLog().DEBUG("subprocess.jsm: " + txt); }); } } function initializeAgentInfo() { if (!getEnigmailOS().isDosLike && !getEnigmailGpgAgent().isDummy()) { EnigmailCore.addToEnvList("GPG_AGENT_INFO=" + getEnigmailGpgAgent().gpgAgentInfo.envStr); } } function failureOn(ex, status) { status.initializationError = getEnigmailLocale().getString("enigmailNotAvailable"); getEnigmailLog().ERROR("core.jsm: Enigmail.initialize: Error - " + status.initializationError + "\n"); getEnigmailLog().DEBUG("core.jsm: Enigmail.initialize: exception=" + ex.toString() + "\n"); throw Components.results.NS_ERROR_FAILURE; } function getEnvironment(status) { try { return Cc["@mozilla.org/process/environment;1"].getService(nsIEnvironment); } catch (ex) { failureOn(ex, status); } return null; } function initializeEnvironment(env) { // Initialize global environment variables list let passEnv = ["GNUPGHOME", "GPGDIR", "ETC", "ALLUSERSPROFILE", "APPDATA", "LOCALAPPDATA", "BEGINLIBPATH", "COMMONPROGRAMFILES", "COMSPEC", "DBUS_SESSION_BUS_ADDRESS", "DISPLAY", "ENIGMAIL_PASS_ENV", "ENDLIBPATH", "GTK_IM_MODULE", "HOME", "HOMEDRIVE", "HOMEPATH", "LOCPATH", "LOGNAME", "LD_LIBRARY_PATH", "MOZILLA_FIVE_HOME", "NLSPATH", "PATH", "PATHEXT", "PROGRAMFILES", "PWD", "QT_IM_MODULE", "SHELL", "SYSTEMDRIVE", "SYSTEMROOT", "TEMP", "TMP", "TMPDIR", "TZ", "TZDIR", "UNIXROOT", "USER", "USERPROFILE", "WINDIR", "XAUTHORITY", "XMODIFIERS" ]; gEnvList = []; // if (!getEnigmailPrefs().getPref("gpgLocaleEn")) { // passEnv = passEnv.concat([ // "LANG", "LANGUAGE", "LC_ALL", "LC_COLLATE", "LC_CTYPE", // "LC_MESSAGES", "LC_MONETARY", "LC_NUMERIC", "LC_TIME" // ]); // } // else if (getEnigmailOS().getOS() === "WINNT") { // // force output on Windows to EN-US // EnigmailCore.addToEnvList("LC_ALL=en_US"); // EnigmailCore.addToEnvList("LANG=en_US"); // } EnigmailCore.addToEnvList("LC_ALL=C"); EnigmailCore.addToEnvList("LANG=C"); const passList = env.get("ENIGMAIL_PASS_ENV"); if (passList) { const passNames = passList.split(":"); for (var k = 0; k < passNames.length; k++) { passEnv.push(passNames[k]); } } for (var j = 0; j < passEnv.length; j++) { const envName = passEnv[j]; let envValue; if (envName in gOverwriteEnvVar) { envValue = gOverwriteEnvVar[envName]; } else { envValue = env.get(envName); } if (envValue) { EnigmailCore.addToEnvList(envName + "=" + envValue); } } getEnigmailLog().DEBUG("core.jsm: Enigmail.initialize: Ec.envList = " + gEnvList + "\n"); } function Enigmail() { this.wrappedJSObject = this; } Enigmail.prototype = { initialized: false, initializationAttempted: false, initializationError: "", initialize: function(domWindow, version) { this.initializationAttempted = true; getEnigmailLog().DEBUG("core.jsm: Enigmail.initialize: START\n"); if (this.initialized) return; this.environment = getEnvironment(this); initializeSubprocessLogging(this.environment); initializeEnvironment(this.environment); try { getEnigmailConsole().write("Initializing Enigmail service ...\n"); } catch (ex) { failureOn(ex, this); } getEnigmailGpgAgent().setAgentPath(domWindow, this, gPreferredGpgPath); getEnigmailGpgAgent().detectGpgAgent(domWindow, this); initializeAgentInfo(); getEnigmailKeyRefreshService().start(getEnigmailKeyServer()); this.initialized = true; getEnigmailLog().DEBUG("core.jsm: Enigmail.initialize: END\n"); }, reinitialize: function() { getEnigmailLog().DEBUG("core.jsm: Enigmail.reinitialize:\n"); this.initialized = false; this.initializationAttempted = true; getEnigmailConsole().write("Reinitializing Enigmail service ...\n"); initializeEnvironment(this.environment); getEnigmailGpgAgent().setAgentPath(null, this, gPreferredGpgPath); this.initialized = true; }, perferGpgPath: function(gpgPath) { getEnigmailLog().DEBUG("core.jsm: Enigmail.perferGpgPath = " + gpgPath + "\n"); gPreferredGpgPath = gpgPath; }, overwriteEnvVar: function(envVar) { let envLines = envVar.split(/\n/); gOverwriteEnvVar = []; for (let i = 0; i < envLines.length; i++) { let j = envLines[i].indexOf("="); if (j > 0) { gOverwriteEnvVar[envLines[i].substr(0, j)] = envLines[i].substr(j + 1); } } }, getService: function(win, startingPreferences) { if (!win) { win = getEnigmailWindows().getBestParentWin(); } getEnigmailLog().DEBUG("core.jsm: svc = " + this + "\n"); if (!this.initialized) { const firstInitialization = !this.initializationAttempted; try { // Initialize enigmail EnigmailCore.init(getEnigmailApp().getVersion()); this.initialize(win, getEnigmailApp().getVersion()); try { // Reset alert count to default value getEnigmailPrefs().getPrefBranch().clearUserPref("initAlert"); } catch (ex) {} } catch (ex) { if (firstInitialization) { // Display initialization error alert const errMsg = (this.initializationError ? this.initializationError : getEnigmailLocale().getString("accessError")) + "\n\n" + getEnigmailLocale().getString("initErr.howToFixIt"); const checkedObj = { value: false }; if (getEnigmailPrefs().getPref("initAlert")) { const r = getEnigmailDialog().longAlert(win, "Enigmail: " + errMsg, getEnigmailLocale().getString("dlgNoPrompt"), null, getEnigmailLocale().getString("initErr.setupWizard.button"), null, checkedObj); if (r >= 0 && checkedObj.value) { getEnigmailPrefs().setPref("initAlert", false); } if (r == 1) { // start setup wizard getEnigmailWindows().openSetupWizard(win, false); return Enigmail.getService(win); } } if (getEnigmailPrefs().getPref("initAlert")) { this.initializationAttempted = false; gEnigmailService = null; } } return null; } const configuredVersion = getEnigmailPrefs().getPref("configuredVersion"); getEnigmailLog().DEBUG("core.jsm: getService: last used version: " + configuredVersion + "\n"); if (firstInitialization && this.initialized && getEnigmailGpgAgent().agentType === "pgp") { getEnigmailDialog().alert(win, getEnigmailLocale().getString("pgpNotSupported")); } if (this.initialized && (getEnigmailApp().getVersion() != configuredVersion)) { getEnigmailConfigure().configureEnigmail(win, startingPreferences); } } return this.initialized ? this : null; } }; // Enigmail.prototype class Factory { constructor(component) { this.component = component; this.register(); Object.freeze(this); } createInstance(outer, iid) { if (outer) { throw Cr.NS_ERROR_NO_AGGREGATION; } return new this.component(); } register() { Cm.registerFactory(this.component.prototype.classID, this.component.prototype.classDescription, this.component.prototype.contractID, this); } unregister() { Cm.unregisterFactory(this.component.prototype.classID, this); } } enigmail-2.0.8/package/data.jsm000066400000000000000000000101601334302754500163310ustar00rootroot00000000000000/*global Components: false, EnigmailLog: false, unescape: false, atob: false, btoa: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailData"]; const Cc = Components.classes; const Ci = Components.interfaces; const SCRIPTABLEUNICODECONVERTER_CONTRACTID = "@mozilla.org/intl/scriptableunicodeconverter"; const HEX_TABLE = "0123456789abcdef"; function converter(charset) { let unicodeConv = Cc[SCRIPTABLEUNICODECONVERTER_CONTRACTID].getService(Ci.nsIScriptableUnicodeConverter); unicodeConv.charset = charset || "utf-8"; return unicodeConv; } var EnigmailData = { getUnicodeData: function(data) { // convert output from subprocess to Unicode var tmpStream = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(Ci.nsIStringInputStream); tmpStream.setData(data, data.length); var inStream = Cc["@mozilla.org/scriptableinputstream;1"].createInstance(Ci.nsIScriptableInputStream); inStream.init(tmpStream); return inStream.read(tmpStream.available()); }, extractMessageId: function(uri) { var messageId = ""; var matches = uri.match(/^enigmail:message\/(.+)/); if (matches && (matches.length > 1)) { messageId = matches[1]; } return messageId; }, extractMimeMessageId: function(uri) { var messageId = ""; var matches = uri.match(/^enigmail:mime-message\/(.+)/); if (matches && (matches.length > 1)) { messageId = matches[1]; } return messageId; }, decodeQuotedPrintable: function(str) { return unescape(str.replace(/%/g, "=25").replace(new RegExp('=', 'g'), '%')); }, decodeBase64: function(str) { return atob(str.replace(/[\s\r\n]*/g, "")); }, /*** * Encode a string in base64, with a max. line length of 72 characters */ encodeBase64: function(str) { return btoa(str).replace(/(.{72})/g, "$1\r\n"); }, convertToUnicode: function(text, charset) { if (!text || (charset && (charset.toLowerCase() == "iso-8859-1"))) { return text; } // Encode plaintext try { return converter(charset).ConvertToUnicode(text); } catch (ex) { return text; } }, convertFromUnicode: function(text, charset) { if (!text) { return ""; } try { return converter(charset).ConvertFromUnicode(text); } catch (ex) { return text; } }, convertGpgToUnicode: function(text) { if (typeof(text) === "string") { text = text.replace(/\\x3a/ig, "\\e3A"); var a = text.search(/\\x[0-9a-fA-F]{2}/); while (a >= 0) { var ch = unescape('%' + text.substr(a + 2, 2)); var r = new RegExp("\\" + text.substr(a, 4)); text = text.replace(r, ch); a = text.search(/\\x[0-9a-fA-F]{2}/); } text = EnigmailData.convertToUnicode(text, "utf-8").replace(/\\e3A/g, ":"); } return text; }, pack: function(value, bytes) { let str = ''; let mask = 0xff; for (let j = 0; j < bytes; j++) { str = String.fromCharCode((value & mask) >> j * 8) + str; mask <<= 8; } return str; }, unpack: function(str) { let len = str.length; let value = 0; for (let j = 0; j < len; j++) { value <<= 8; value |= str.charCodeAt(j); } return value; }, bytesToHex: function(str) { let len = str.length; let hex = ''; for (let j = 0; j < len; j++) { let charCode = str.charCodeAt(j); hex += HEX_TABLE.charAt((charCode & 0xf0) >> 4) + HEX_TABLE.charAt((charCode & 0x0f)); } return hex; }, /** * Convert an ArrayBuffer (or Uint8Array) object into a string */ arrayBufferToString: function(buffer) { const MAXLEN = 102400; let uArr = new Uint8Array(buffer); let ret = ""; let len = buffer.byteLength; for (let j = 0; j < Math.floor(len / MAXLEN) + 1; j++) { ret += String.fromCharCode.apply(null, uArr.subarray(j * MAXLEN, ((j + 1) * MAXLEN))); } return ret; } }; enigmail-2.0.8/package/decryption.jsm000066400000000000000000000715611334302754500176140ustar00rootroot00000000000000/*global Components: false, EnigmailData: false, EnigmailLog: false, EnigmailPrefs: false, EnigmailLocale: false, EnigmailArmor: false, EnigmailExecution: false, EnigmailDialog: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailDecryption"]; const Ci = Components.interfaces; const Cu = Components.utils; Cu.import("resource://enigmail/core.jsm"); /*global EnigmailCore: false */ Cu.import("resource://enigmail/data.jsm"); Cu.import("resource://enigmail/log.jsm"); Cu.import("resource://enigmail/prefs.jsm"); Cu.import("resource://enigmail/armor.jsm"); Cu.import("resource://enigmail/locale.jsm"); Cu.import("resource://enigmail/data.jsm"); Cu.import("resource://enigmail/execution.jsm"); Cu.import("resource://enigmail/dialog.jsm"); Cu.import("resource://enigmail/httpProxy.jsm"); /*global EnigmailHttpProxy: false */ Cu.import("resource://enigmail/gpgAgent.jsm"); /*global EnigmailGpgAgent: false */ Cu.import("resource://enigmail/files.jsm"); /*global EnigmailFiles: false */ Cu.import("resource://enigmail/gpg.jsm"); /*global EnigmailGpg: false */ Cu.import("resource://enigmail/errorHandling.jsm"); /*global EnigmailErrorHandling: false */ Cu.import("resource://enigmail/keyRing.jsm"); /*global EnigmailKeyRing: false */ Cu.import("resource://enigmail/key.jsm"); /*global EnigmailKey: false */ Cu.import("resource://enigmail/passwords.jsm"); /*global EnigmailPassword: false */ Cu.import("resource://enigmail/constants.jsm"); /*global EnigmailConstants: false */ Cu.import("resource://enigmail/funcs.jsm"); /*global EnigmailFuncs: false */ const STATUS_ERROR = EnigmailConstants.BAD_SIGNATURE | EnigmailConstants.DECRYPTION_FAILED; const STATUS_DECRYPTION_OK = EnigmailConstants.DECRYPTION_OKAY; const STATUS_GOODSIG = EnigmailConstants.GOOD_SIGNATURE; const NS_WRONLY = 0x02; function statusObjectFrom(signatureObj, exitCodeObj, statusFlagsObj, keyIdObj, userIdObj, sigDetailsObj, errorMsgObj, blockSeparationObj, encToDetailsObj) { return { signature: signatureObj, exitCode: exitCodeObj, statusFlags: statusFlagsObj, keyId: keyIdObj, userId: userIdObj, sigDetails: sigDetailsObj, message: errorMsgObj, blockSeparation: blockSeparationObj, encToDetails: encToDetailsObj }; } function newStatusObject() { return statusObjectFrom({ value: "" }, {}, {}, {}, {}, {}, {}, {}, {}); } var EnigmailDecryption = { decryptMessageStart: function(win, verifyOnly, noOutput, listener, statusFlagsObj, errorMsgObj, mimeSignatureFile, maxOutputLength) { EnigmailLog.DEBUG("decryption.jsm: decryptMessageStart: verifyOnly=" + verifyOnly + "\n"); if (!EnigmailCore.getService(win)) { EnigmailLog.ERROR("decryption.jsm: decryptMessageStart: not yet initialized\n"); errorMsgObj.value = EnigmailLocale.getString("notInit"); return null; } if (EnigmailKeyRing.isGeneratingKey()) { errorMsgObj.value = EnigmailLocale.getString("notComplete"); return null; } var args = EnigmailGpg.getStandardArgs(true); let logFile = EnigmailErrorHandling.getTempLogFile(); args.push("--log-file"); args.push(EnigmailFiles.getEscapedFilename(EnigmailFiles.getFilePath(logFile))); var keyserver = EnigmailPrefs.getPref("autoKeyRetrieve"); if (keyserver && keyserver !== "") { keyserver = keyserver.trim(); args.push("--keyserver-options"); var keySrvArgs = "auto-key-retrieve"; var srvProxy = EnigmailHttpProxy.getHttpProxy(keyserver); if (srvProxy) { keySrvArgs += ",http-proxy=" + srvProxy; } args.push(keySrvArgs); args.push("--keyserver"); args.push(keyserver); } if (EnigmailGpg.getGpgFeature("supports-sender") && win && win.gFolderDisplay && win.gFolderDisplay.selectedMessage) { var fromAddr = win.gFolderDisplay.selectedMessage.author; try { fromAddr = EnigmailFuncs.stripEmail(fromAddr); if (fromAddr.search(/[a-zA-Z0-9]@.*[\(\)]/) >= 0) { fromAddr = false; } } catch (ex) { fromAddr = false; } if (fromAddr) { args.push("--sender"); args.push(fromAddr.toLowerCase()); } } if (noOutput) { args.push("--verify"); if (mimeSignatureFile) { args.push(mimeSignatureFile); args.push("-"); } } else { if (maxOutputLength) { args.push("--max-output"); args.push(String(maxOutputLength)); } args.push("--decrypt"); } if (!listener) { listener = {}; } if ("done" in listener) { listener.outerDone = listener.done; } listener.done = function(exitCode) { EnigmailErrorHandling.appendLogFileToDebug(logFile); if (this.outerDone) { this.outerDone(exitCode); } }; let proc = EnigmailExecution.execStart(EnigmailGpgAgent.agentPath, args, !verifyOnly, win, listener, statusFlagsObj); if (statusFlagsObj.value & EnigmailConstants.MISSING_PASSPHRASE) { EnigmailLog.ERROR("decryption.jsm: decryptMessageStart: Error - no passphrase supplied\n"); errorMsgObj.value = EnigmailLocale.getString("noPassphrase"); return null; } return proc; }, decryptMessageEnd: function(stderrStr, exitCode, outputLen, verifyOnly, noOutput, uiFlags, retStatusObj) { EnigmailLog.DEBUG("decryption.jsm: decryptMessageEnd: uiFlags=" + uiFlags + ", verifyOnly=" + verifyOnly + ", noOutput=" + noOutput + "\n"); stderrStr = stderrStr.replace(/\r\n/g, "\n"); EnigmailLog.DEBUG("decryption.jsm: decryptMessageEnd: stderrStr=\n" + stderrStr + "\n"); var interactive = uiFlags & EnigmailConstants.UI_INTERACTIVE; var pgpMime = uiFlags & EnigmailConstants.UI_PGP_MIME; var allowImport = uiFlags & EnigmailConstants.UI_ALLOW_KEY_IMPORT; var unverifiedEncryptedOK = uiFlags & EnigmailConstants.UI_UNVERIFIED_ENC_OK; var j; retStatusObj.statusFlags = 0; retStatusObj.errorMsg = ""; retStatusObj.blockSeparation = ""; var errorMsg = EnigmailErrorHandling.parseErrorOutput(stderrStr, retStatusObj); if (retStatusObj.statusFlags & STATUS_ERROR) { retStatusObj.errorMsg = errorMsg; } else { retStatusObj.errorMsg = ""; } if (pgpMime) { retStatusObj.statusFlags |= verifyOnly ? EnigmailConstants.PGP_MIME_SIGNED : EnigmailConstants.PGP_MIME_ENCRYPTED; } var statusMsg = retStatusObj.statusMsg; exitCode = EnigmailExecution.fixExitCode(exitCode, retStatusObj); if ((exitCode === 0) && !noOutput && !outputLen && ((retStatusObj.statusFlags & (STATUS_DECRYPTION_OK | STATUS_GOODSIG)) === 0)) { exitCode = -1; } if (retStatusObj.statusFlags & EnigmailConstants.DISPLAY_MESSAGE && retStatusObj.extendedStatus.search(/\bdisp:/) >= 0) { EnigmailDialog.alert(null, statusMsg); return -1; } var errLines; if (statusMsg) { errLines = statusMsg.split(/\r?\n/); } else { // should not really happen ... errLines = stderrStr.split(/\r?\n/); } // possible STATUS Patterns (see GPG dod DETAILS.txt): // one of these should be set for a signature: var newsigPat = /^NEWSIG /i; var trustedsigPat = /^TRUST_(FULLY|ULTIMATE) /i; var goodsigPat = /^GOODSIG (\w{16}) (.*)$/i; var badsigPat = /^BADSIG (\w{16}) (.*)$/i; var expsigPat = /^EXPSIG (\w{16}) (.*)$/i; var expkeysigPat = /^EXPKEYSIG (\w{16}) (.*)$/i; var revkeysigPat = /^REVKEYSIG (\w{16}) (.*)$/i; var errsigPat = /^ERRSIG (\w{16}) (.*)$/i; // additional infos for good signatures: var validSigPat = /^VALIDSIG (\w+) (.*) (\d+) (.*)/i; // hint for a certain key id: var userIdHintPat = /^USERID_HINT (\w{16}) (.*)$/i; // to find out for which recipients the email was encrypted: var encToPat = /^ENC_TO (\w{16}) (.*)$/i; var matches; var signed = false; var goodOrExpOrRevSignature = false; var sigKeyId = ""; // key of sender var sigUserId = ""; // user ID of sender var sigDetails = ""; var sigTrusted = false; var encToDetails = ""; var encToArray = []; // collect ENC_TO lines here for (j = 0; j < errLines.length; j++) { EnigmailLog.DEBUG("decryption.jsm: decryptMessageEnd: process: " + errLines[j] + "\n"); // ENC_TO entry // - collect them for later processing to print details matches = errLines[j].match(encToPat); if (matches && (matches.length > 2)) { encToArray.push("0x" + matches[1]); } // USERID_HINT entry // - NOTE: NO END of loop // ERROR: wrong to set userId because ecom is NOT the sender: //matches = errLines[j].match(userIdHintPat); //if (matches && (matches.length > 2)) { // sigKeyId = matches[1]; // sigUserId = matches[2]; //} // check for one of the possible SIG entries: matches = errLines[j].match(newsigPat); if (matches) { if (signed) { EnigmailLog.DEBUG("decryption.jsm: decryptMessageEnd: multiple SIGN entries - ignoring previous signature\n"); } signed = true; goodOrExpOrRevSignature = false; sigKeyId = ""; sigUserId = ""; sigDetails = ""; sigTrusted = false; continue; } matches = errLines[j].match(trustedsigPat); if (matches) { sigTrusted = true; continue; } matches = errLines[j].match(validSigPat); if (matches && (matches.length > 4)) { if (matches[4].length == 40) { // in case of several subkeys refer to the main key ID. // Only works with PGP V4 keys (Fingerprint length ==40) sigKeyId = matches[4]; } if (matches && (matches.length > 2)) { sigDetails = errLines[j].substr(9); } continue; } // GOODSIG entry matches = errLines[j].match(goodsigPat); if (matches && (matches.length > 2)) { if (signed) { EnigmailLog.DEBUG("decryption.jsm: decryptMessageEnd: OOPS: multiple SIGN entries\n"); } signed = true; goodOrExpOrRevSignature = true; sigKeyId = matches[1]; sigUserId = matches[2]; } else { // BADSIG entry => signature found but bad matches = errLines[j].match(badsigPat); if (matches && (matches.length > 2)) { if (signed) { EnigmailLog.DEBUG("decryption.jsm: decryptMessageEnd: OOPS: multiple SIGN entries\n"); } signed = true; goodOrExpOrRevSignature = false; sigKeyId = matches[1]; sigUserId = matches[2]; } else { // EXPSIG entry => expired signature found matches = errLines[j].match(expsigPat); if (matches && (matches.length > 2)) { if (signed) { EnigmailLog.DEBUG("decryption.jsm: decryptMessageEnd: OOPS: multiple SIGN entries\n"); } signed = true; goodOrExpOrRevSignature = true; sigKeyId = matches[1]; sigUserId = matches[2]; } else { // EXPKEYSIG entry => signature found but key expired matches = errLines[j].match(expkeysigPat); if (matches && (matches.length > 2)) { if (signed) { EnigmailLog.DEBUG("decryption.jsm: decryptMessageEnd: OOPS: multiple SIGN entries\n"); } signed = true; goodOrExpOrRevSignature = true; sigKeyId = matches[1]; sigUserId = matches[2]; } else { // REVKEYSIG entry => signature found but key revoked matches = errLines[j].match(revkeysigPat); if (matches && (matches.length > 2)) { if (signed) { EnigmailLog.DEBUG("decryption.jsm: decryptMessageEnd: OOPS: multiple SIGN entries\n"); } signed = true; goodOrExpOrRevSignature = true; sigKeyId = matches[1]; sigUserId = matches[2]; } else { // ERRSIG entry => signature found but key not usable or unavailable matches = errLines[j].match(errsigPat); if (matches && (matches.length > 2)) { if (signed) { EnigmailLog.DEBUG("decryption.jsm: decryptMessageEnd: OOPS: multiple SIGN entries\n"); } signed = true; goodOrExpOrRevSignature = false; sigKeyId = matches[1]; // no user id with ecom istatus entry } } } } } } } // end loop of processing errLines if (sigTrusted) { retStatusObj.statusFlags |= EnigmailConstants.TRUSTED_IDENTITY; } if (sigUserId && sigKeyId && EnigmailPrefs.getPref("displaySecondaryUid")) { let keyObj = EnigmailKeyRing.getKeyById(sigKeyId); if (keyObj) { if (keyObj.photoAvailable) { retStatusObj.statusFlags |= EnigmailConstants.PHOTO_AVAILABLE; } sigUserId = EnigmailKeyRing.getValidUids(sigKeyId).join("\n"); } } else if (sigUserId) { sigUserId = EnigmailData.convertToUnicode(sigUserId, "UTF-8"); } // add list of keys used for encryption if known (and their user IDs) if known // Parsed status messages are something like (here the German version): // [GNUPG:] ENC_TO AAAAAAAAAAAAAAAA 1 0 // [GNUPG:] ENC_TO 5B820D2D4553884F 16 0 // [GNUPG:] ENC_TO 37904DF2E631552F 1 0 // [GNUPG:] ENC_TO BBBBBBBBBBBBBBBB 1 0 // gpg: verschlüsselt mit 3072-Bit RSA Schlüssel, ID BBBBBBBB, erzeugt 2009-11-28 // "Joe Doo " // [GNUPG:] NO_SECKEY E71712DF47BBCC40 // gpg: verschlüsselt mit RSA Schlüssel, ID AAAAAAAA // [GNUPG:] NO_SECKEY AAAAAAAAAAAAAAAA if (encToArray.length > 0) { // for each key also show an associated user ID if known: for (var encIdx = 0; encIdx < encToArray.length; ++encIdx) { var localKeyId = encToArray[encIdx]; // except for ID 00000000, which signals hidden keys if (localKeyId != "0x0000000000000000") { let localKey = EnigmailKeyRing.getKeyById(localKeyId); if (localKey) { encToArray[encIdx] += " (" + localKey.userId + ")"; } } else { encToArray[encIdx] = EnigmailLocale.getString("hiddenKey"); } } encToDetails = "\n " + encToArray.join(",\n ") + "\n"; } retStatusObj.userId = sigUserId; retStatusObj.keyId = sigKeyId; retStatusObj.sigDetails = sigDetails; retStatusObj.encToDetails = encToDetails; if (signed) { if (goodOrExpOrRevSignature) { retStatusObj.errorMsg = EnigmailLocale.getString("prefGood", [sigUserId]); /* + ", " + EnigmailLocale.getString("keyId") + " 0x" + sigKeyId.substring(8,16); */ } else { if (sigUserId.length > 0) { retStatusObj.errorMsg = EnigmailLocale.getString("prefBad", [sigUserId]); } if (!exitCode) exitCode = 1; } } if (retStatusObj.statusFlags & EnigmailConstants.UNVERIFIED_SIGNATURE) { retStatusObj.keyId = EnigmailKey.extractPubkey(statusMsg); if (retStatusObj.statusFlags & EnigmailConstants.DECRYPTION_OKAY) { exitCode = 0; } } if (exitCode !== 0) { // Error processing EnigmailLog.DEBUG("decryption.jsm: decryptMessageEnd: command execution exit code: " + exitCode + "\n"); } return exitCode; }, /** * Decrypts a PGP ciphertext and returns the the plaintext * *in @parent a window object *in @uiFlags see flag options in EnigmailConstants, UI_INTERACTIVE, UI_ALLOW_KEY_IMPORT *in @cipherText a string containing a PGP Block *out @signatureObj *out @exitCodeObj contains the exit code *out @statusFlagsObj see status flags in nslEnigmail.idl, GOOD_SIGNATURE, BAD_SIGNATURE *out @keyIdObj holds the key id *out @userIdObj holds the user id *out @sigDetailsObj *out @errorMsgObj error string *out @blockSeparationObj *out @encToDetailsObj returns in details, which keys the mesage was encrypted for (ENC_TO entries) * * @return string plaintext ("" if error) * */ decryptMessage: function(parent, uiFlags, cipherText, signatureObj, exitCodeObj, statusFlagsObj, keyIdObj, userIdObj, sigDetailsObj, errorMsgObj, blockSeparationObj, encToDetailsObj) { const esvc = EnigmailCore.getEnigmailService(); EnigmailLog.DEBUG("enigmail.js: Enigmail.decryptMessage: " + cipherText.length + " bytes, " + uiFlags + "\n"); if (!cipherText) return ""; var interactive = uiFlags & EnigmailConstants.UI_INTERACTIVE; var allowImport = uiFlags & EnigmailConstants.UI_ALLOW_KEY_IMPORT; var unverifiedEncryptedOK = uiFlags & EnigmailConstants.UI_UNVERIFIED_ENC_OK; var oldSignature = signatureObj.value; EnigmailLog.DEBUG("enigmail.js: Enigmail.decryptMessage: oldSignature=" + oldSignature + "\n"); signatureObj.value = ""; exitCodeObj.value = -1; statusFlagsObj.value = 0; keyIdObj.value = ""; userIdObj.value = ""; errorMsgObj.value = ""; var beginIndexObj = {}; var endIndexObj = {}; var indentStrObj = {}; var blockType = EnigmailArmor.locateArmoredBlock(cipherText, 0, "", beginIndexObj, endIndexObj, indentStrObj); if (!blockType || blockType == "SIGNATURE") { // return without displaying a message return ""; } var publicKey = (blockType == "PUBLIC KEY BLOCK"); var verifyOnly = (blockType == "SIGNED MESSAGE"); var pgpBlock = cipherText.substr(beginIndexObj.value, endIndexObj.value - beginIndexObj.value + 1); if (indentStrObj.value) { var indentRegexp = new RegExp("^" + indentStrObj.value, "gm"); pgpBlock = pgpBlock.replace(indentRegexp, ""); if (indentStrObj.value.substr(-1) == " ") { var indentRegexpStr = "^" + indentStrObj.value.replace(/ $/m, "$"); indentRegexp = new RegExp(indentRegexpStr, "gm"); pgpBlock = pgpBlock.replace(indentRegexp, ""); } } // HACK to better support messages from Outlook: if there are empty lines, drop them if (pgpBlock.search(/MESSAGE-----\r?\n\r?\nVersion/) >= 0) { EnigmailLog.DEBUG("enigmail.js: Enigmail.decryptMessage: apply Outlook empty line workaround\n"); pgpBlock = pgpBlock.replace(/\r?\n\r?\n/g, "\n"); } var head = cipherText.substr(0, beginIndexObj.value); var tail = cipherText.substr(endIndexObj.value + 1, cipherText.length - endIndexObj.value - 1); if (publicKey) { if (!allowImport) { errorMsgObj.value = EnigmailLocale.getString("keyInMessageBody"); statusFlagsObj.value |= EnigmailConstants.DISPLAY_MESSAGE; statusFlagsObj.value |= EnigmailConstants.INLINE_KEY; return ""; } // Import public key exitCodeObj.value = EnigmailKeyRing.importKey(parent, true, pgpBlock, "", errorMsgObj); if (exitCodeObj.value === 0) { statusFlagsObj.value |= EnigmailConstants.IMPORTED_KEY; } return ""; } var newSignature = ""; if (verifyOnly) { newSignature = EnigmailArmor.extractSignaturePart(pgpBlock, EnigmailConstants.SIGNATURE_ARMOR); if (oldSignature && (newSignature != oldSignature)) { EnigmailLog.ERROR("enigmail.js: Enigmail.decryptMessage: Error - signature mismatch " + newSignature + "\n"); errorMsgObj.value = EnigmailLocale.getString("sigMismatch"); statusFlagsObj.value |= EnigmailConstants.DISPLAY_MESSAGE; return ""; } } var startErrorMsgObj = {}; var noOutput = false; var listener = EnigmailExecution.newSimpleListener( function _stdin(pipe) { pipe.write(pgpBlock); pipe.close(); }); var maxOutput = pgpBlock.length * 100; // limit output to 100 times message size // to avoid DoS attack var proc = EnigmailDecryption.decryptMessageStart(parent, verifyOnly, noOutput, listener, statusFlagsObj, startErrorMsgObj, null, maxOutput); if (!proc) { errorMsgObj.value = startErrorMsgObj.value; statusFlagsObj.value |= EnigmailConstants.DISPLAY_MESSAGE; return ""; } // Wait for child to close proc.wait(); var plainText = EnigmailData.getUnicodeData(listener.stdoutData); var retStatusObj = {}; var exitCode = EnigmailDecryption.decryptMessageEnd(EnigmailData.getUnicodeData(listener.stderrData), listener.exitCode, plainText.length, verifyOnly, noOutput, uiFlags, retStatusObj); exitCodeObj.value = exitCode; statusFlagsObj.value = retStatusObj.statusFlags; errorMsgObj.value = retStatusObj.errorMsg; // do not return anything if gpg signales DECRYPTION_FAILED // (which could be possible in case of MDC errors) if ((uiFlags & EnigmailConstants.UI_IGNORE_MDC_ERROR) && (retStatusObj.statusFlags & EnigmailConstants.MISSING_MDC)) { EnigmailLog.DEBUG("enigmail.js: Enigmail.decryptMessage: ignoring MDC error\n"); } else if (retStatusObj.statusFlags & EnigmailConstants.DECRYPTION_FAILED) { plainText = ""; } userIdObj.value = retStatusObj.userId; keyIdObj.value = retStatusObj.keyId; sigDetailsObj.value = retStatusObj.sigDetails; if (encToDetailsObj) { encToDetailsObj.value = retStatusObj.encToDetails; } blockSeparationObj.value = retStatusObj.blockSeparation; if ((head.search(/\S/) >= 0) || (tail.search(/\S/) >= 0)) { statusFlagsObj.value |= EnigmailConstants.PARTIALLY_PGP; } if (exitCodeObj.value === 0) { // Normal return var doubleDashSeparator = false; try { doubleDashSeparator = EnigmailPrefs.getPrefBranch().getBoolPref("doubleDashSeparator"); } catch (ex) {} if (doubleDashSeparator && (plainText.search(/(\r|\n)-- +(\r|\n)/) < 0)) { // Workaround for MsgCompose stripping trailing spaces from sig separator plainText = plainText.replace(/(\r|\n)--(\r|\n)/, "$1-- $2"); } statusFlagsObj.value |= EnigmailConstants.DISPLAY_MESSAGE; if (verifyOnly && indentStrObj.value) { plainText = plainText.replace(/^/gm, indentStrObj.value); } return EnigmailDecryption.inlineInnerVerification(parent, uiFlags, plainText, statusObjectFrom(signatureObj, exitCodeObj, statusFlagsObj, keyIdObj, userIdObj, sigDetailsObj, errorMsgObj, blockSeparationObj, encToDetailsObj)); } var pubKeyId = keyIdObj.value; if (statusFlagsObj.value & EnigmailConstants.BAD_SIGNATURE) { if (verifyOnly && indentStrObj.value) { // Probably replied message that could not be verified errorMsgObj.value = EnigmailLocale.getString("unverifiedReply") + "\n\n" + errorMsgObj.value; return ""; } // Return bad signature (for checking later) signatureObj.value = newSignature; } else if (pubKeyId && (statusFlagsObj.value & EnigmailConstants.UNVERIFIED_SIGNATURE)) { var innerKeyBlock; if (verifyOnly) { // Search for indented public key block in signed message var innerBlockType = EnigmailArmor.locateArmoredBlock(pgpBlock, 0, "- ", beginIndexObj, endIndexObj, indentStrObj); if (innerBlockType == "PUBLIC KEY BLOCK") { innerKeyBlock = pgpBlock.substr(beginIndexObj.value, endIndexObj.value - beginIndexObj.value + 1); innerKeyBlock = innerKeyBlock.replace(/- -----/g, "-----"); statusFlagsObj.value |= EnigmailConstants.INLINE_KEY; EnigmailLog.DEBUG("enigmail.js: Enigmail.decryptMessage: innerKeyBlock found\n"); } } if (allowImport) { var importedKey = false; if (innerKeyBlock) { var importErrorMsgObj = {}; var exitStatus = EnigmailKeyRing.importKey(parent, true, innerKeyBlock, pubKeyId, importErrorMsgObj); importedKey = (exitStatus === 0); if (exitStatus > 0) { EnigmailDialog.alert(parent, EnigmailLocale.getString("cantImport") + importErrorMsgObj.value); } } if (importedKey) { // Recursive call; note that EnigmailConstants.UI_ALLOW_KEY_IMPORT is unset // to break the recursion var uiFlagsDeep = interactive ? EnigmailConstants.UI_INTERACTIVE : 0; signatureObj.value = ""; return EnigmailDecryption.decryptMessage(parent, uiFlagsDeep, pgpBlock, signatureObj, exitCodeObj, statusFlagsObj, keyIdObj, userIdObj, sigDetailsObj, errorMsgObj); } } if (plainText && !unverifiedEncryptedOK) { // Append original PGP block to unverified message plainText = "-----BEGIN PGP UNVERIFIED MESSAGE-----\r\n" + plainText + "-----END PGP UNVERIFIED MESSAGE-----\r\n\r\n" + pgpBlock; } } return verifyOnly ? "" : plainText; }, inlineInnerVerification: function(parent, uiFlags, text, statusObject) { EnigmailLog.DEBUG("enigmail.js: Enigmail.inlineInnerVerification\n"); if (text && text.indexOf("-----BEGIN PGP SIGNED MESSAGE-----") === 0) { var status = newStatusObject(); var newText = EnigmailDecryption.decryptMessage(parent, uiFlags, text, status.signature, status.exitCode, status.statusFlags, status.keyId, status.userId, status.sigDetails, status.message, status.blockSeparation, status.encToDetails); if (status.exitCode.value === 0) { text = newText; // merge status into status object: statusObject.statusFlags.value = statusObject.statusFlags.value | status.statusFlags.value; statusObject.keyId.value = status.keyId.value; statusObject.userId.value = status.userId.value; statusObject.sigDetails.value = status.sigDetails.value; statusObject.message.value = status.message.value; // we don't merge encToDetails } } return text; }, decryptAttachment: function(parent, outFile, displayName, byteData, exitCodeObj, statusFlagsObj, errorMsgObj) { const esvc = EnigmailCore.getEnigmailService(); EnigmailLog.DEBUG("enigmail.js: Enigmail.decryptAttachment: parent=" + parent + ", outFileName=" + outFile.path + "\n"); let attachmentHead = byteData.substr(0, 200); if (attachmentHead.match(/-----BEGIN PGP \w{5,10} KEY BLOCK-----/)) { // attachment appears to be a PGP key file if (EnigmailDialog.confirmDlg(parent, EnigmailLocale.getString("attachmentPgpKey", [displayName]), EnigmailLocale.getString("keyMan.button.import"), EnigmailLocale.getString("dlg.button.view"))) { let preview = EnigmailKey.getKeyListFromKeyBlock(byteData, errorMsgObj); exitCodeObj.keyList = preview; let exitStatus = 0; if (errorMsgObj.value === "") { if (preview.length > 0) { if (preview.length == 1) { exitStatus = EnigmailDialog.confirmDlg(parent, EnigmailLocale.getString("doImportOne", [preview[0].name, preview[0].id])); } else { exitStatus = EnigmailDialog.confirmDlg(parent, EnigmailLocale.getString("doImportMultiple", [ preview.map(function(a) { return "\t" + a.name + " (" + a.id + ")"; }). join("\n") ])); } if (exitStatus) { exitCodeObj.value = EnigmailKeyRing.importKey(parent, false, byteData, "", errorMsgObj); statusFlagsObj.value = EnigmailConstants.IMPORTED_KEY; } else { exitCodeObj.value = 0; statusFlagsObj.value = EnigmailConstants.DISPLAY_MESSAGE; } } } } else { exitCodeObj.value = 0; statusFlagsObj.value = EnigmailConstants.DISPLAY_MESSAGE; } return true; } //var outFileName = EnigmailFiles.getEscapedFilename(EnigmailFiles.getFilePathReadonly(outFile.QueryInterface(Ci.nsIFile), NS_WRONLY)); let args = EnigmailGpg.getStandardArgs(true); args.push("--yes"); args = args.concat(EnigmailPassword.command()); args.push("-d"); statusFlagsObj.value = 0; let listener = EnigmailExecution.newSimpleListener( function _stdin(pipe) { pipe.write(byteData); pipe.close(); }); let proc = EnigmailExecution.execStart(EnigmailGpgAgent.agentPath, args, false, parent, listener, statusFlagsObj); if (!proc) { return false; } // Wait for child STDOUT to close proc.wait(); let statusMsgObj = {}; let cmdLineObj = {}; exitCodeObj.value = EnigmailExecution.execEnd(listener, statusFlagsObj, statusMsgObj, cmdLineObj, errorMsgObj); if (listener.stdoutData.length > 0) { return EnigmailFiles.writeFileContents(outFile, listener.stdoutData); } return false; } }; enigmail-2.0.8/package/dialog.jsm000066400000000000000000000353771334302754500167000ustar00rootroot00000000000000/*global Components: false, EnigmailLocale: false, EnigmailLog: false, EnigmailWindows: false, EnigmailPrefs: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailDialog"]; const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; Cu.import("resource://enigmail/locale.jsm"); Cu.import("resource://enigmail/log.jsm"); Cu.import("resource://enigmail/windows.jsm"); Cu.import("resource://enigmail/prefs.jsm"); Cu.import("resource://enigmail/constants.jsm"); /* global EnigmailConstants: false */ const BUTTON_POS_0 = 1; const BUTTON_POS_1 = 1 << 8; const BUTTON_POS_2 = 1 << 16; const gPromptSvc = Cc["@mozilla.org/embedcomp/prompt-service;1"].getService(Ci.nsIPromptService); const LOCAL_FILE_CONTRACTID = "@mozilla.org/file/local;1"; var EnigmailDialog = { /*** * Confirmation dialog with OK / Cancel buttons (both customizable) * * @win: nsIWindow - parent window to display modal dialog; can be null * @mesg: String - message text * @okLabel: String - OPTIONAL label for OK button * @cancelLabel: String - OPTIONAL label for cancel button * * @return: Boolean - true: OK pressed / false: Cancel or ESC pressed */ confirmDlg: function(win, mesg, okLabel, cancelLabel) { let buttonPressed = EnigmailDialog.msgBox(win, { msgtext: mesg, button1: okLabel ? okLabel : EnigmailLocale.getString("dlg.button.ok"), cancelButton: cancelLabel ? cancelLabel : EnigmailLocale.getString("dlg.button.cancel"), iconType: EnigmailConstants.ICONTYPE_QUESTION, dialogTitle: EnigmailLocale.getString("enigConfirm") }, null); return (buttonPressed === 0); }, /** * Displays an alert dialog. * * @win: nsIWindow - parent window to display modal dialog; can be null * @mesg: String - message text * * no return value */ alert: function(win, mesg) { EnigmailDialog.msgBox(win, { msgtext: mesg, button1: EnigmailLocale.getString("dlg.button.close"), iconType: EnigmailConstants.ICONTYPE_ALERT, dialogTitle: EnigmailLocale.getString("enigAlert") }, null); }, /** * Displays an information dialog. * * @win: nsIWindow - parent window to display modal dialog; can be null * @mesg: String - message text * * no return value */ info: function(win, mesg) { EnigmailDialog.msgBox(win, { msgtext: mesg, button1: EnigmailLocale.getString("dlg.button.close"), iconType: EnigmailConstants.ICONTYPE_INFO, dialogTitle: EnigmailLocale.getString("enigInfo") }, null); }, /** * Displays an alert dialog with 1-3 optional buttons. * * @win: nsIWindow - parent window to display modal dialog; can be null * @mesg: String - message text * @checkboxLabel: String - if not null, display checkbox with text; the * checkbox state is returned in checkedObj.value * @button-Labels: String - use "&" to indicate access key * use "buttonType:label" or ":buttonType" to indicate special button types * (buttonType is one of cancel, help, extra1, extra2) * @checkedObj: Object - holding the checkbox value * * @return: 0-2: button Number pressed * -1: ESC or close window button pressed * */ longAlert: function(win, mesg, checkboxLabel, okLabel, labelButton2, labelButton3, checkedObj) { var result = { value: -1, checked: false }; if (!win) { win = EnigmailWindows.getBestParentWin(); } win.openDialog("chrome://enigmail/content/enigmailMsgBox.xul", "_blank", "chrome,dialog,modal,centerscreen,resizable,titlebar", { msgtext: mesg, checkboxLabel: checkboxLabel, iconType: EnigmailConstants.ICONTYPE_ALERT, button1: okLabel, button2: labelButton2, button3: labelButton3 }, result); if (checkboxLabel) { checkedObj.value = result.checked; } return result.value; }, /** * Displays a message box with 1-3 optional buttons. * * @win: nsIWindow - parent window to display modal dialog; can be null * @argsObj: Object: * - msgtext: String - message text * - dialogTitle: String - title of the dialog * - checkboxLabel: String - if not null, display checkbox with text; the * checkbox state is returned in checkedObj.value * - iconType: Number - Icon type: 1=Message / 2=Question / 3=Alert / 4=Error * * - buttonX: String - Button label (button 1-3) [button1 = "accept" button] * use "&" to indicate access key * - cancelButton String - Label for cancel button * use "buttonType:label" or ":buttonType" to indicate special button types * (buttonType is one of cancel, help, extra1, extra2) * if no button is provided, OK will be displayed * * @checkedObj: Object - holding the checkbox value * * @return: 0-2: button Number pressed * -1: cancel button, ESC or close window button pressed * */ msgBox: function(win, argsObj, checkedObj) { var result = { value: -1, checked: false }; if (!win) { win = EnigmailWindows.getBestParentWin(); } win.openDialog("chrome://enigmail/content/enigmailMsgBox.xul", "", "chrome,dialog,modal,centerscreen,resizable", argsObj, result); if (argsObj.checkboxLabel) { checkedObj.value = result.checked; } return result.value; }, /** * Display a dialog with a message and a text entry field * * @win: nsIWindow - parent window to display modal dialog; can be null * @mesg: String - message text * @valueObj: Object - object to hold the entered text in .value * * @return: Boolean - true if OK was pressed / false otherwise */ promptValue: function(win, mesg, valueObj) { return gPromptSvc.prompt(win, EnigmailLocale.getString("enigPrompt"), mesg, valueObj, "", {}); }, /** * Display an alert message with an OK button and a checkbox to hide * the message in the future. * In case the checkbox was pressed in the past, the dialog is skipped * * @win: nsIWindow - the parent window to hold the modal dialog * @mesg: String - the localized message to display * @prefText: String - the name of the Enigmail preference to read/store the * the future display status */ alertPref: function(win, mesg, prefText) { const display = true; const dontDisplay = false; let prefValue = EnigmailPrefs.getPref(prefText); if (prefValue === display) { let checkBoxObj = { value: false }; let buttonPressed = EnigmailDialog.msgBox(win, { msgtext: mesg, dialogTitle: EnigmailLocale.getString("enigInfo"), iconType: EnigmailConstants.ICONTYPE_INFO, checkboxLabel: EnigmailLocale.getString("dlgNoPrompt") }, checkBoxObj); if (checkBoxObj.value && buttonPressed === 0) { EnigmailPrefs.setPref(prefText, dontDisplay); } } }, /** * Display an alert dialog together with the message "this dialog will be * displayed |counter| more times". * If |counter| is 0, the dialog is not displayed. * * @win: nsIWindow - the parent window to hold the modal dialog * @countPrefName: String - the name of the Enigmail preference to read/store the * the |counter| value * @mesg: String - the localized message to display * */ alertCount: function(win, countPrefName, mesg) { let alertCount = EnigmailPrefs.getPref(countPrefName); if (alertCount <= 0) return; alertCount--; EnigmailPrefs.setPref(countPrefName, alertCount); if (alertCount > 0) { mesg += EnigmailLocale.getString("repeatPrefix", [alertCount]) + " "; mesg += (alertCount == 1) ? EnigmailLocale.getString("repeatSuffixSingular") : EnigmailLocale.getString("repeatSuffixPlural"); } else { mesg += EnigmailLocale.getString("noRepeat"); } EnigmailDialog.alert(win, mesg); }, /** * Display a confirmation dialog with OK / Cancel buttons (both customizable) and * a checkbox to remember the selected choice. * * * @win: nsIWindow - parent window to display modal dialog; can be null * @mesg: String - message text * @prefText String - the name of the Enigmail preference to read/store the * the future display status. * the default action is chosen * @okLabel: String - OPTIONAL label for OK button * @cancelLabel: String - OPTIONAL label for cancel button * * @return: Boolean - true: 1 pressed / 0: Cancel pressed / -1: ESC pressed * * If the dialog is not displayed: * - if @prefText is type Boolean: return 1 * - if @prefText is type Number: return the last choice of the user */ confirmPref: function(win, mesg, prefText, okLabel, cancelLabel) { const notSet = 0; const yes = 1; const no = 2; const display = true; const dontDisplay = false; var prefValue = EnigmailPrefs.getPref(prefText); if (typeof(prefValue) != "boolean") { // number: remember user's choice switch (prefValue) { case notSet: { let checkBoxObj = { value: false }; let buttonPressed = EnigmailDialog.msgBox(win, { msgtext: mesg, button1: okLabel ? okLabel : EnigmailLocale.getString("dlg.button.ok"), cancelButton: cancelLabel ? cancelLabel : EnigmailLocale.getString("dlg.button.cancel"), checkboxLabel: EnigmailLocale.getString("dlgKeepSetting"), iconType: EnigmailConstants.ICONTYPE_QUESTION, dialogTitle: EnigmailLocale.getString("enigConfirm") }, checkBoxObj); if (checkBoxObj.value) { EnigmailPrefs.setPref(prefText, (buttonPressed === 0 ? yes : no)); } return (buttonPressed === 0 ? 1 : 0); } case yes: return 1; case no: return 0; default: return -1; } } else { // boolean: "do not show this dialog anymore" (and return default) switch (prefValue) { case display: { let checkBoxObj = { value: false }; let buttonPressed = EnigmailDialog.msgBox(win, { msgtext: mesg, button1: okLabel ? okLabel : EnigmailLocale.getString("dlg.button.ok"), cancelButton: cancelLabel ? cancelLabel : EnigmailLocale.getString("dlg.button.cancel"), checkboxLabel: EnigmailLocale.getString("dlgNoPrompt"), iconType: EnigmailConstants.ICONTYPE_QUESTION, dialogTitle: EnigmailLocale.getString("enigConfirm") }, checkBoxObj); if (checkBoxObj.value) { EnigmailPrefs.setPref(prefText, false); } return (buttonPressed === 0 ? 1 : 0); } case dontDisplay: return 1; default: return -1; } } }, /** * Display a "open file" or "save file" dialog * * win: nsIWindow - parent window * title: String - window title * displayDir: String - optional: directory to be displayed * save: Boolean - true = Save file / false = Open file * defaultExtension: String - optional: extension for the type of files to work with, e.g. "asc" * defaultName: String - optional: filename, incl. extension, that should be suggested to * the user as default, e.g. "keys.asc" * filterPairs: Array - optional: [title, extension], e.g. ["Pictures", "*.jpg; *.png"] * * return value: nsIFile object representing the file to load or save */ filePicker: function(win, title, displayDir, save, defaultExtension, defaultName, filterPairs) { EnigmailLog.DEBUG("enigmailCommon.jsm: filePicker: " + save + "\n"); let filePicker = Cc["@mozilla.org/filepicker;1"].createInstance(); filePicker = filePicker.QueryInterface(Ci.nsIFilePicker); let mode = save ? Ci.nsIFilePicker.modeSave : Ci.nsIFilePicker.modeOpen; filePicker.init(win, title, mode); if (displayDir) { var localFile = Cc[LOCAL_FILE_CONTRACTID].createInstance(Ci.nsIFile); try { localFile.initWithPath(displayDir); filePicker.displayDirectory = localFile; } catch (ex) {} } if (defaultExtension) { filePicker.defaultExtension = defaultExtension; } if (defaultName) { filePicker.defaultString = defaultName; } let nfilters = 0; if (filterPairs && filterPairs.length) { nfilters = filterPairs.length / 2; } for (let index = 0; index < nfilters; index++) { filePicker.appendFilter(filterPairs[2 * index], filterPairs[2 * index + 1]); } filePicker.appendFilters(Ci.nsIFilePicker.filterAll); let inspector = Cc["@mozilla.org/jsinspector;1"].createInstance(Ci.nsIJSInspector); let gotFile = null; filePicker.open(res => { if (res != Ci.nsIFilePicker.returnOK && res != Ci.nsIFilePicker.returnReplace) { inspector.exitNestedEventLoop(); return; } gotFile = filePicker.file.QueryInterface(Ci.nsIFile); inspector.exitNestedEventLoop(); }); inspector.enterNestedEventLoop(0); // wait for async process to terminate return gotFile; }, /** * Displays a dialog with success/failure information after importing * keys. * * @param win: nsIWindow - parent window to display modal dialog; can be null * @param keyList: Array of String - imported keyIDs * * @return: 0-2: button Number pressed * -1: ESC or close window button pressed * */ keyImportDlg: function(win, keyList) { var result = { value: -1, checked: false }; if (!win) { win = EnigmailWindows.getBestParentWin(); } win.openDialog("chrome://enigmail/content/enigmailKeyImportInfo.xul", "", "chrome,dialog,modal,centerscreen,resizable", { keyList: keyList }, result); return result.value; }, /** * return a pre-initialized prompt service */ getPromptSvc: function() { return gPromptSvc; } }; EnigmailWindows.alert = EnigmailDialog.alert; enigmail-2.0.8/package/encryption.jsm000066400000000000000000000430341334302754500176200ustar00rootroot00000000000000/*global Components: false, EnigmailCore: false, EnigmailLog: false, EnigmailPrefs: false, EnigmailApp: false, EnigmailLocale: false, EnigmailDialog: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailEncryption"]; const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; Cu.import("resource://enigmail/core.jsm"); Cu.import("resource://enigmail/data.jsm"); /*global EnigmailData: false */ Cu.import("resource://enigmail/log.jsm"); Cu.import("resource://enigmail/prefs.jsm"); Cu.import("resource://enigmail/app.jsm"); Cu.import("resource://enigmail/locale.jsm"); Cu.import("resource://enigmail/dialog.jsm"); Cu.import("resource://enigmail/gpgAgent.jsm"); /*global EnigmailGpgAgent: false */ Cu.import("resource://enigmail/gpg.jsm"); /*global EnigmailGpg: false */ Cu.import("resource://enigmail/errorHandling.jsm"); /*global EnigmailErrorHandling: false */ Cu.import("resource://enigmail/execution.jsm"); /*global EnigmailExecution: false */ Cu.import("resource://enigmail/files.jsm"); /*global EnigmailFiles: false */ Cu.import("resource://enigmail/passwords.jsm"); /*global EnigmailPassword: false */ Cu.import("resource://enigmail/funcs.jsm"); /*global EnigmailFuncs: false */ Cu.import("resource://enigmail/keyRing.jsm"); /*global EnigmailKeyRing: false */ Cu.import("resource://enigmail/constants.jsm"); /*global EnigmailConstants: false */ const gMimeHashAlgorithms = [null, "sha1", "ripemd160", "sha256", "sha384", "sha512", "sha224", "md5"]; const ENC_TYPE_MSG = 0; const ENC_TYPE_ATTACH_BINARY = 1; const ENC_TYPE_ATTACH_ASCII = 2; const GPG_COMMENT_OPT = "Using GnuPG with %s - https://www.enigmail.net/"; var EnigmailEncryption = { getEncryptCommand: function(fromMailAddr, toMailAddr, bccMailAddr, hashAlgorithm, sendFlags, isAscii, errorMsgObj, logFileObj) { EnigmailLog.DEBUG("encryption.jsm: getEncryptCommand: hashAlgorithm=" + hashAlgorithm + "\n"); try { fromMailAddr = EnigmailFuncs.stripEmail(fromMailAddr); toMailAddr = EnigmailFuncs.stripEmail(toMailAddr); bccMailAddr = EnigmailFuncs.stripEmail(bccMailAddr); } catch (ex) { errorMsgObj.value = EnigmailLocale.getString("invalidEmail"); return null; } var defaultSend = sendFlags & EnigmailConstants.SEND_DEFAULT; var signMsg = sendFlags & EnigmailConstants.SEND_SIGNED; var encryptMsg = sendFlags & EnigmailConstants.SEND_ENCRYPTED; var usePgpMime = sendFlags & EnigmailConstants.SEND_PGP_MIME; var useDefaultComment = false; try { useDefaultComment = EnigmailPrefs.getPref("useDefaultComment"); } catch (ex) {} var hushMailSupport = false; try { hushMailSupport = EnigmailPrefs.getPref("hushMailSupport"); } catch (ex) {} var detachedSig = (usePgpMime || (sendFlags & EnigmailConstants.SEND_ATTACHMENT)) && signMsg && !encryptMsg; var toAddrList = toMailAddr.split(/\s*,\s*/); var bccAddrList = bccMailAddr.split(/\s*,\s*/); var k; var encryptArgs = EnigmailGpg.getStandardArgs(true); if (!useDefaultComment) encryptArgs = encryptArgs.concat(["--comment", GPG_COMMENT_OPT.replace(/%s/, EnigmailApp.getName())]); var angledFromMailAddr = ((fromMailAddr.search(/^0x/) === 0) || hushMailSupport) ? fromMailAddr : "<" + fromMailAddr + ">"; angledFromMailAddr = angledFromMailAddr.replace(/(["'`])/g, "\\$1"); if (signMsg && hashAlgorithm) { encryptArgs = encryptArgs.concat(["--digest-algo", hashAlgorithm]); } if (logFileObj) { logFileObj.value = EnigmailErrorHandling.getTempLogFile(); encryptArgs.push("--log-file"); encryptArgs.push(EnigmailFiles.getEscapedFilename(EnigmailFiles.getFilePath(logFileObj.value))); } if (encryptMsg) { switch (isAscii) { case ENC_TYPE_MSG: encryptArgs.push("-a"); encryptArgs.push("-t"); break; case ENC_TYPE_ATTACH_ASCII: encryptArgs.push("-a"); } encryptArgs.push("--encrypt"); if (signMsg) encryptArgs.push("--sign"); if (sendFlags & EnigmailConstants.SEND_ALWAYS_TRUST) { encryptArgs.push("--trust-model"); encryptArgs.push("always"); } if ((sendFlags & EnigmailConstants.SEND_ENCRYPT_TO_SELF) && fromMailAddr) encryptArgs = encryptArgs.concat(["--encrypt-to", angledFromMailAddr]); for (k = 0; k < toAddrList.length; k++) { toAddrList[k] = toAddrList[k].replace(/'/g, "\\'"); if (toAddrList[k].length > 0) { encryptArgs.push("-r"); if (toAddrList[k].search(/^GROUP:/) === 0) { // groups from gpg.conf file encryptArgs.push(toAddrList[k].substr(6)); } else { encryptArgs.push((hushMailSupport || (toAddrList[k].search(/^0x/) === 0)) ? toAddrList[k] : "<" + toAddrList[k] + ">"); } } } for (k = 0; k < bccAddrList.length; k++) { bccAddrList[k] = bccAddrList[k].replace(/'/g, "\\'"); if (bccAddrList[k].length > 0) { encryptArgs.push("--hidden-recipient"); encryptArgs.push((hushMailSupport || (bccAddrList[k].search(/^0x/) === 0)) ? bccAddrList[k] : "<" + bccAddrList[k] + ">"); } } } else if (detachedSig) { encryptArgs = encryptArgs.concat(["-s", "-b"]); switch (isAscii) { case ENC_TYPE_MSG: encryptArgs = encryptArgs.concat(["-a", "-t"]); break; case ENC_TYPE_ATTACH_ASCII: encryptArgs.push("-a"); } } else if (signMsg) { encryptArgs = encryptArgs.concat(["-t", "--clearsign"]); } if (fromMailAddr) { encryptArgs = encryptArgs.concat(["-u", angledFromMailAddr]); } return encryptArgs; }, /** * Determine if the sender key ID or user ID can be used for signing and/or encryption * * @param sendFlags: Number - the send Flags; need to contain SEND_SIGNED and/or SEND_ENCRYPTED * @param fromMailAddr: String - the sender email address or key ID * * @return Object: * - keyId: String - the found key ID, or null if fromMailAddr is not valid * - errorMsg: String - the erorr message if key not valid, or null if key is valid */ determineOwnKeyUsability: function(sendFlags, fromMailAddr) { EnigmailLog.DEBUG("encryption.jsm: determineOwnKeyUsability: sendFlags=" + sendFlags + ", sender=" + fromMailAddr + "\n"); let keyList = []; let ret = { keyId: null, errorMsg: null }; let sign = (sendFlags & EnigmailConstants.SEND_SIGNED ? true : false); let encrypt = (sendFlags & EnigmailConstants.SEND_ENCRYPTED ? true : false); if (fromMailAddr.search(/^(0x)?[A-Z0-9]+$/) === 0) { // key ID specified let key = EnigmailKeyRing.getKeyById(fromMailAddr); keyList.push(key); } else { // email address specified keyList = EnigmailKeyRing.getKeysByUserId(fromMailAddr); } if (keyList.length === 0) { ret.errorMsg = EnigmailLocale.getString("errorOwnKeyUnusable", fromMailAddr); return ret; } if (sign) { keyList = keyList.reduce(function _f(p, keyObj) { if (keyObj && keyObj.getSigningValidity().keyValid) p.push(keyObj); return p; }, []); } if (encrypt) { keyList = keyList.reduce(function _f(p, keyObj) { if (keyObj && keyObj.getEncryptionValidity().keyValid) p.push(keyObj); return p; }, []); } if (keyList.length === 0) { if (sign) { ret.errorMsg = EnigmailErrorHandling.determineInvSignReason(fromMailAddr); } else { ret.errorMsg = EnigmailErrorHandling.determineInvRcptReason(fromMailAddr); } } else { ret.keyId = keyList[0].fpr; } return ret; }, encryptMessageStart: function(win, uiFlags, fromMailAddr, toMailAddr, bccMailAddr, hashAlgorithm, sendFlags, listener, statusFlagsObj, errorMsgObj) { EnigmailLog.DEBUG("encryption.jsm: encryptMessageStart: uiFlags=" + uiFlags + ", from " + fromMailAddr + " to " + toMailAddr + ", hashAlgorithm=" + hashAlgorithm + " (" + EnigmailData.bytesToHex( EnigmailData.pack(sendFlags, 4)) + ")\n"); let keyUseability = this.determineOwnKeyUsability(sendFlags, fromMailAddr); if (!keyUseability.keyId) { EnigmailLog.DEBUG("encryption.jsm: encryptMessageStart: own key invalid\n"); errorMsgObj.value = keyUseability.errorMsg; statusFlagsObj.value = EnigmailConstants.INVALID_RECIPIENT | EnigmailConstants.NO_SECKEY | EnigmailConstants.DISPLAY_MESSAGE; return null; } var pgpMime = uiFlags & EnigmailConstants.UI_PGP_MIME; var hashAlgo = gMimeHashAlgorithms[EnigmailPrefs.getPref("mimeHashAlgorithm")]; if (hashAlgorithm) { hashAlgo = hashAlgorithm; } errorMsgObj.value = ""; if (!sendFlags) { EnigmailLog.DEBUG("encryption.jsm: encryptMessageStart: NO ENCRYPTION!\n"); errorMsgObj.value = EnigmailLocale.getString("notRequired"); return null; } if (!EnigmailCore.getService(win)) { EnigmailLog.ERROR("encryption.jsm: encryptMessageStart: not yet initialized\n"); errorMsgObj.value = EnigmailLocale.getString("notInit"); return null; } let logFileObj = {}; let encryptArgs = EnigmailEncryption.getEncryptCommand(fromMailAddr, toMailAddr, bccMailAddr, hashAlgo, sendFlags, ENC_TYPE_MSG, errorMsgObj, logFileObj); if (!encryptArgs) return null; var signMsg = sendFlags & EnigmailConstants.SEND_SIGNED; if (!listener) { listener = {}; } if ("done" in listener) { listener.outerDone = listener.done; } listener.done = function(exitCode) { EnigmailErrorHandling.appendLogFileToDebug(logFileObj.value); if (this.outerDone) { this.outerDone(exitCode); } }; var proc = EnigmailExecution.execStart(EnigmailGpgAgent.agentPath, encryptArgs, signMsg, win, listener, statusFlagsObj); if (statusFlagsObj.value & EnigmailConstants.MISSING_PASSPHRASE) { EnigmailLog.ERROR("encryption.jsm: encryptMessageStart: Error - no passphrase supplied\n"); errorMsgObj.value = ""; } if (pgpMime && errorMsgObj.value) { EnigmailDialog.alert(win, errorMsgObj.value); } return proc; }, encryptMessageEnd: function(fromMailAddr, stderrStr, exitCode, uiFlags, sendFlags, outputLen, retStatusObj) { EnigmailLog.DEBUG("encryption.jsm: encryptMessageEnd: uiFlags=" + uiFlags + ", sendFlags=" + EnigmailData.bytesToHex(EnigmailData.pack(sendFlags, 4)) + ", outputLen=" + outputLen + "\n"); var pgpMime = uiFlags & EnigmailConstants.UI_PGP_MIME; var defaultSend = sendFlags & EnigmailConstants.SEND_DEFAULT; var signMsg = sendFlags & EnigmailConstants.SEND_SIGNED; var encryptMsg = sendFlags & EnigmailConstants.SEND_ENCRYPTED; retStatusObj.statusFlags = 0; retStatusObj.errorMsg = ""; retStatusObj.blockSeparation = ""; if (!EnigmailCore.getService().initialized) { EnigmailLog.ERROR("encryption.jsm: encryptMessageEnd: not yet initialized\n"); retStatusObj.errorMsg = EnigmailLocale.getString("notInit"); return -1; } EnigmailErrorHandling.parseErrorOutput(stderrStr, retStatusObj); exitCode = EnigmailExecution.fixExitCode(exitCode, retStatusObj); if ((exitCode === 0) && !outputLen) { exitCode = -1; } if (exitCode !== 0 && (signMsg || encryptMsg)) { // GnuPG might return a non-zero exit code, even though the message was correctly // signed or encryped -> try to fix the exit code var correctedExitCode = 0; if (signMsg) { if (!(retStatusObj.statusFlags & EnigmailConstants.SIG_CREATED)) correctedExitCode = exitCode; } if (encryptMsg) { if (!(retStatusObj.statusFlags & EnigmailConstants.END_ENCRYPTION)) correctedExitCode = exitCode; } exitCode = correctedExitCode; } EnigmailLog.DEBUG("encryption.jsm: encryptMessageEnd: command execution exit code: " + exitCode + "\n"); if (retStatusObj.statusFlags & EnigmailConstants.DISPLAY_MESSAGE) { if (retStatusObj.extendedStatus.search(/\bdisp:/) >= 0) { retStatusObj.errorMsg = retStatusObj.statusMsg; } else { if (fromMailAddr.search(/^0x/) === 0) { fromMailAddr = fromMailAddr.substr(2); } if (fromMailAddr.search(/^[A-F0-9]{8,40}$/i) === 0) { fromMailAddr = "[A-F0-9]+" + fromMailAddr; } let s = new RegExp("^(\\[GNUPG:\\] )?INV_(RECP|SGNR) [0-9]+ (\\<|0x)?" + fromMailAddr + "\\>?", "m"); if (retStatusObj.statusMsg.search(s) >= 0) { retStatusObj.errorMsg += "\n\n" + EnigmailLocale.getString("keyError.resolutionAction"); } else if (retStatusObj.statusMsg.length > 0) { retStatusObj.errorMsg = retStatusObj.statusMsg; } } } else if (retStatusObj.statusFlags & EnigmailConstants.INVALID_RECIPIENT) { retStatusObj.errorMsg = retStatusObj.statusMsg; } else if (exitCode !== 0) { retStatusObj.errorMsg = EnigmailLocale.getString("badCommand"); } return exitCode; }, encryptMessage: function(parent, uiFlags, plainText, fromMailAddr, toMailAddr, bccMailAddr, sendFlags, exitCodeObj, statusFlagsObj, errorMsgObj) { EnigmailLog.DEBUG("enigmail.js: Enigmail.encryptMessage: " + plainText.length + " bytes from " + fromMailAddr + " to " + toMailAddr + " (" + sendFlags + ")\n"); exitCodeObj.value = -1; statusFlagsObj.value = 0; errorMsgObj.value = ""; if (!plainText) { EnigmailLog.DEBUG("enigmail.js: Enigmail.encryptMessage: NO ENCRYPTION!\n"); exitCodeObj.value = 0; EnigmailLog.DEBUG(" <=== encryptMessage()\n"); return plainText; } var defaultSend = sendFlags & EnigmailConstants.SEND_DEFAULT; var signMsg = sendFlags & EnigmailConstants.SEND_SIGNED; var encryptMsg = sendFlags & EnigmailConstants.SEND_ENCRYPTED; if (encryptMsg) { // First convert all linebreaks to newlines plainText = plainText.replace(/\r\n/g, "\n"); plainText = plainText.replace(/\r/g, "\n"); // we need all data in CRLF according to RFC 4880 plainText = plainText.replace(/\n/g, "\r\n"); } var listener = EnigmailExecution.newSimpleListener( function _stdin(pipe) { pipe.write(plainText); pipe.close(); }, function _done(exitCode) {}); var proc = EnigmailEncryption.encryptMessageStart(parent, uiFlags, fromMailAddr, toMailAddr, bccMailAddr, null, sendFlags, listener, statusFlagsObj, errorMsgObj); if (!proc) { exitCodeObj.value = -1; EnigmailLog.DEBUG(" <=== encryptMessage()\n"); return ""; } // Wait for child pipes to close proc.wait(); var retStatusObj = {}; exitCodeObj.value = EnigmailEncryption.encryptMessageEnd(fromMailAddr, EnigmailData.getUnicodeData(listener.stderrData), listener.exitCode, uiFlags, sendFlags, listener.stdoutData.length, retStatusObj); statusFlagsObj.value = retStatusObj.statusFlags; statusFlagsObj.statusMsg = retStatusObj.statusMsg; errorMsgObj.value = retStatusObj.errorMsg; if ((exitCodeObj.value === 0) && listener.stdoutData.length === 0) exitCodeObj.value = -1; if (exitCodeObj.value === 0) { // Normal return EnigmailLog.DEBUG(" <=== encryptMessage()\n"); return EnigmailData.getUnicodeData(listener.stdoutData); } // Error processing EnigmailLog.DEBUG("enigmail.js: Enigmail.encryptMessage: command execution exit code: " + exitCodeObj.value + "\n"); return ""; }, encryptAttachment: function(parent, fromMailAddr, toMailAddr, bccMailAddr, sendFlags, inFile, outFile, exitCodeObj, statusFlagsObj, errorMsgObj) { EnigmailLog.DEBUG("encryption.jsm: EnigmailEncryption.encryptAttachment infileName=" + inFile.path + "\n"); statusFlagsObj.value = 0; sendFlags |= EnigmailConstants.SEND_ATTACHMENT; let asciiArmor = false; try { asciiArmor = EnigmailPrefs.getPrefBranch().getBoolPref("inlineAttachAsciiArmor"); } catch (ex) {} const asciiFlags = (asciiArmor ? ENC_TYPE_ATTACH_ASCII : ENC_TYPE_ATTACH_BINARY); let args = EnigmailEncryption.getEncryptCommand(fromMailAddr, toMailAddr, bccMailAddr, "", sendFlags, asciiFlags, errorMsgObj); if (!args) { return null; } const signMessage = (sendFlags & EnigmailConstants.SEND_SIGNED); if (signMessage) { args = args.concat(EnigmailPassword.command()); } //const inFilePath = EnigmailFiles.getEscapedFilename(EnigmailFiles.getFilePathReadonly(inFile.QueryInterface(Ci.nsIFile))); const fileContents = EnigmailFiles.readBinaryFile(inFile.QueryInterface(Ci.nsIFile)); const inFileName = inFile.QueryInterface(Ci.nsIFile).leafName; const outFilePath = EnigmailFiles.getEscapedFilename(EnigmailFiles.getFilePathReadonly(outFile.QueryInterface(Ci.nsIFile))); args = args.concat(["--yes", "-o", outFilePath, "--set-filename", inFileName]); let cmdErrorMsgObj = {}; const msg = EnigmailExecution.execCmd(EnigmailGpgAgent.agentPath, args, fileContents, exitCodeObj, statusFlagsObj, {}, cmdErrorMsgObj); if (exitCodeObj.value !== 0) { if (cmdErrorMsgObj.value) { errorMsgObj.value = EnigmailFiles.formatCmdLine(EnigmailGpgAgent.agentPath, args); errorMsgObj.value += "\n" + cmdErrorMsgObj.value; } else { errorMsgObj.value = "An unknown error has occurred"; } return ""; } return msg; } }; enigmail-2.0.8/package/errorHandling.jsm000066400000000000000000000514551334302754500202320ustar00rootroot00000000000000/*global Components: false, EnigmailLog: false, EnigmailLocale: false, EnigmailData: false, EnigmailCore: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailErrorHandling"]; const Ci = Components.interfaces; const Cu = Components.utils; Cu.import("resource://enigmail/log.jsm"); Cu.import("resource://enigmail/locale.jsm"); Cu.import("resource://enigmail/data.jsm"); Cu.import("resource://enigmail/core.jsm"); Cu.import("resource://enigmail/system.jsm"); /* global EnigmailSystem: false */ Cu.import("resource://enigmail/constants.jsm"); /* global EnigmailConstants: false */ Cu.import("resource://enigmail/lazy.jsm"); /* global EnigmailLazy: false */ const getEnigmailKeyRing = EnigmailLazy.loader("enigmail/keyRing.jsm", "EnigmailKeyRing"); const getEnigmailGpg = EnigmailLazy.loader("enigmail/gpg.jsm", "EnigmailGpg"); const getEnigmailFiles = EnigmailLazy.loader("enigmail/files.jsm", "EnigmailFiles"); const getEnigmailRNG = EnigmailLazy.loader("enigmail/rng.jsm", "EnigmailRNG"); const gStatusFlags = { GOODSIG: EnigmailConstants.GOOD_SIGNATURE, BADSIG: EnigmailConstants.BAD_SIGNATURE, ERRSIG: EnigmailConstants.UNVERIFIED_SIGNATURE, EXPSIG: EnigmailConstants.EXPIRED_SIGNATURE, REVKEYSIG: EnigmailConstants.GOOD_SIGNATURE, EXPKEYSIG: EnigmailConstants.EXPIRED_KEY_SIGNATURE, KEYEXPIRED: EnigmailConstants.EXPIRED_KEY, KEYREVOKED: EnigmailConstants.REVOKED_KEY, NO_PUBKEY: EnigmailConstants.NO_PUBKEY, NO_SECKEY: EnigmailConstants.NO_SECKEY, IMPORTED: EnigmailConstants.IMPORTED_KEY, INV_RECP: EnigmailConstants.INVALID_RECIPIENT, MISSING_PASSPHRASE: EnigmailConstants.MISSING_PASSPHRASE, BAD_PASSPHRASE: EnigmailConstants.BAD_PASSPHRASE, BADARMOR: EnigmailConstants.BAD_ARMOR, NODATA: EnigmailConstants.NODATA, ERROR: EnigmailConstants.BAD_SIGNATURE | EnigmailConstants.DECRYPTION_FAILED, DECRYPTION_FAILED: EnigmailConstants.DECRYPTION_FAILED, DECRYPTION_OKAY: EnigmailConstants.DECRYPTION_OKAY, CARDCTRL: EnigmailConstants.CARDCTRL, SC_OP_FAILURE: EnigmailConstants.SC_OP_FAILURE, UNKNOWN_ALGO: EnigmailConstants.UNKNOWN_ALGO, SIG_CREATED: EnigmailConstants.SIG_CREATED, END_ENCRYPTION: EnigmailConstants.END_ENCRYPTION, INV_SGNR: 0x100000000, IMPORT_OK: 0x200000000, FAILURE: 0x400000000, DECRYPTION_INFO: 0x800000000 }; // taken from libgpg-error: gpg-error.h const GPG_SOURCE_SYSTEM = { GPG_ERR_SOURCE_UNKNOWN: 0, GPG_ERR_SOURCE_GCRYPT: 1, GPG_ERR_SOURCE_GPG: 2, GPG_ERR_SOURCE_GPGSM: 3, GPG_ERR_SOURCE_GPGAGENT: 4, GPG_ERR_SOURCE_PINENTRY: 5, GPG_ERR_SOURCE_SCD: 6, GPG_ERR_SOURCE_GPGME: 7, GPG_ERR_SOURCE_KEYBOX: 8, GPG_ERR_SOURCE_KSBA: 9, GPG_ERR_SOURCE_DIRMNGR: 10, GPG_ERR_SOURCE_GSTI: 11, GPG_ERR_SOURCE_GPA: 12, GPG_ERR_SOURCE_KLEO: 13, GPG_ERR_SOURCE_G13: 14, GPG_ERR_SOURCE_ASSUAN: 15, GPG_ERR_SOURCE_TLS: 17, GPG_ERR_SOURCE_ANY: 31 }; /** * Handling of specific error codes from GnuPG * * @param c Object - the retStatusObj * @param errorNumber String - the error number as printed by GnuPG */ function handleErrorCode(c, errorNumber) { if (errorNumber && errorNumber.search(/^[0-9]+$/) === 0) { let errNum = Number(errorNumber); let sourceSystem = errNum >> 24; let errorCode = errNum & 0xFFFFFF; switch (errorCode) { case 11: // bad Passphrase case 87: // bad PIN badPassphrase(c); break; case 177: // no passphrase case 178: // no PIN missingPassphrase(c); break; case 99: // operation canceled if (sourceSystem === GPG_SOURCE_SYSTEM.GPG_ERR_SOURCE_PINENTRY) { missingPassphrase(c); } break; case 77: // no agent case 78: // agent error case 80: // assuan server fault case 81: // assuan error c.statusFlags |= EnigmailConstants.DISPLAY_MESSAGE; c.retStatusObj.extendedStatus += "disp:get_passphrase "; c.retStatusObj.statusMsg = EnigmailLocale.getString("errorHandling.gpgAgentError") + "\n\n" + EnigmailLocale.getString("errorHandling.readFaq"); c.isError = true; break; case 85: // no pinentry case 86: // pinentry error c.statusFlags |= EnigmailConstants.DISPLAY_MESSAGE; c.retStatusObj.extendedStatus += "disp:get_passphrase "; c.retStatusObj.statusMsg = EnigmailLocale.getString("errorHandling.pinentryError") + "\n\n" + EnigmailLocale.getString("errorHandling.readFaq"); c.isError = true; break; case 92: // no dirmngr case 93: // dirmngr error c.statusFlags |= EnigmailConstants.DISPLAY_MESSAGE; c.retStatusObj.extendedStatus += "disp:get_passphrase "; c.retStatusObj.statusMsg = EnigmailLocale.getString("errorHandling.dirmngrError") + "\n\n" + EnigmailLocale.getString("errorHandling.readFaq"); c.isError = true; break; case 2: case 3: case 149: case 188: c.statusFlags |= EnigmailConstants.UNKNOWN_ALGO; break; case 15: c.statusFlags |= EnigmailConstants.BAD_ARMOR; break; case 58: c.statusFlags |= EnigmailConstants.NODATA; break; } } } /** * Special treatment for some ERROR messages from GnuPG * * extendedStatus are preceeded by "disp:" if an error message is set in statusMsg * * isError is set to true if this is a hard error that makes further processing of * the status codes useless */ function handleError(c) { /* check_hijacking: gpg-agent was hijacked by some other process (like gnome-keyring) proc_pkt.plaintext: multiple plaintexts seen pkdecrypt_failed: public key decryption failed keyedit.passwd: error changing the passphrase card_key_generate: key generation failed (card) key_generate: key generation failed keyserver_send: keyserver send failed get_passphrase: gpg-agent cannot query the passphrase from pinentry (GnuPG 2.0.x) */ var lineSplit = c.statusLine.split(/ +/); if (lineSplit.length > 0) { if (lineSplit.length >= 3) { // first check if the error code is a specifically treated hard failure handleErrorCode(c, lineSplit[2]); if (c.isError) return true; } switch (lineSplit[1]) { case "check_hijacking": c.statusFlags |= EnigmailConstants.DISPLAY_MESSAGE; c.retStatusObj.extendedStatus += "disp:invalid_gpg_agent "; c.retStatusObj.statusMsg = EnigmailLocale.getString("errorHandling.gpgAgentInvalid") + "\n\n" + EnigmailLocale.getString("errorHandling.readFaq"); c.isError = true; break; case "get_passphrase": c.statusFlags |= EnigmailConstants.DISPLAY_MESSAGE; c.retStatusObj.extendedStatus += "disp:get_passphrase "; c.retStatusObj.statusMsg = EnigmailLocale.getString("errorHandling.pinentryError") + "\n\n" + EnigmailLocale.getString("errorHandling.readFaq"); c.isError = true; break; case "proc_pkt.plaintext": c.retStatusObj.extendedStatus += "multiple_plaintexts "; c.isError = true; break; case "pkdecrypt_failed": c.retStatusObj.extendedStatus += "pubkey_decrypt "; handleErrorCode(c, lineSplit[2]); break; case "keyedit.passwd": c.retStatusObj.extendedStatus += "passwd_change_failed "; break; case "card_key_generate": case "key_generate": c.retStatusObj.extendedStatus += "key_generate_failure "; break; case "keyserver_send": c.retStatusObj.extendedStatus += "keyserver_send_failed "; c.isError = true; break; default: return false; } return true; } else { return false; } } // handle GnuPG FAILURE message (GnuPG 2.1.10 and newer) function failureMessage(c) { let lineSplit = c.statusLine.split(/ +/); if (lineSplit.length >= 3) { handleErrorCode(c, lineSplit[2]); } } function missingPassphrase(c) { c.statusFlags |= EnigmailConstants.MISSING_PASSPHRASE; if (c.retStatusObj.statusMsg.indexOf(EnigmailLocale.getString("missingPassphrase")) < 0) { c.statusFlags |= EnigmailConstants.DISPLAY_MESSAGE; c.flag = 0; EnigmailLog.DEBUG("errorHandling.jsm: missingPassphrase: missing passphrase\n"); c.retStatusObj.statusMsg += EnigmailLocale.getString("missingPassphrase") + "\n"; } } function badPassphrase(c) { c.statusFlags |= EnigmailConstants.MISSING_PASSPHRASE; if (!(c.statusFlags & EnigmailConstants.BAD_PASSPHRASE)) { c.statusFlags |= EnigmailConstants.BAD_PASSPHRASE; c.flag = 0; EnigmailLog.DEBUG("errorHandling.jsm: badPassphrase: bad passphrase\n"); c.retStatusObj.statusMsg += EnigmailLocale.getString("badPhrase") + "\n"; } } function invalidSignature(c) { if (c.isError) return; var lineSplit = c.statusLine.split(/ +/); c.statusFlags |= EnigmailConstants.DISPLAY_MESSAGE; c.flag = 0; let keySpec = lineSplit[2]; if (keySpec) { EnigmailLog.DEBUG("errorHandling.jsm: invalidRecipient: detected invalid sender " + keySpec + " / code: " + lineSplit[1] + "\n"); c.retStatusObj.errorMsg += EnigmailErrorHandling.determineInvSignReason(keySpec); } } function invalidRecipient(c) { if (c.isError) return; var lineSplit = c.statusLine.split(/ +/); c.statusFlags |= EnigmailConstants.DISPLAY_MESSAGE; c.flag = 0; let keySpec = lineSplit[2]; if (keySpec) { EnigmailLog.DEBUG("errorHandling.jsm: invalidRecipient: detected invalid recipient " + keySpec + " / code: " + lineSplit[1] + "\n"); c.retStatusObj.errorMsg += EnigmailErrorHandling.determineInvRcptReason(keySpec); } } function importOk(c) { var lineSplit = c.statusLine.split(/ +/); if (lineSplit.length > 1) { EnigmailLog.DEBUG("errorHandling.jsm: importOk: key imported: " + lineSplit[2] + "\n"); } else { EnigmailLog.DEBUG("errorHandling.jsm: importOk: key without FPR imported\n"); } } function unverifiedSignature(c) { var lineSplit = c.statusLine.split(/ +/); if (lineSplit.length > 7 && lineSplit[7] == "4") { c.flag = EnigmailConstants.UNKNOWN_ALGO; } } function noData(c) { // Recognize only "NODATA 1" if (c.statusLine.search(/NODATA 1\b/) < 0) { c.flag = 0; } } function decryptionInfo(c) { // Recognize "DECRYPTION_INFO 0 1 2" if (c.statusLine.search(/DECRYPTION_INFO /) >= 0) { let lineSplit = c.statusLine.split(/ +/); let mdcMethod = lineSplit[1]; let aeadAlgo = lineSplit.length > 3 ? lineSplit[3] : "0"; if (mdcMethod === "0" && aeadAlgo === "0") { c.statusFlags |= EnigmailConstants.MISSING_MDC; c.statusFlags |= EnigmailConstants.DECRYPTION_FAILED; // be sure to fail c.flag = EnigmailConstants.MISSING_MDC; EnigmailLog.DEBUG("errorHandling.jsm: missing MDC!\n"); c.retStatusObj.statusMsg += EnigmailLocale.getString("mdcError") + "\n"; } } } function decryptionFailed(c) { c.inDecryptionFailed = true; } function cardControl(c) { var lineSplit = c.statusLine.split(/ +/); if (lineSplit[1] == "3") { c.detectedCard = lineSplit[2]; } else { c.errCode = Number(lineSplit[1]); if (c.errCode == 1) c.requestedCard = lineSplit[2]; } } function setupFailureLookup() { var result = {}; result[EnigmailConstants.DECRYPTION_FAILED] = decryptionFailed; result[EnigmailConstants.NODATA] = noData; result[EnigmailConstants.CARDCTRL] = cardControl; result[EnigmailConstants.UNVERIFIED_SIGNATURE] = unverifiedSignature; result[EnigmailConstants.MISSING_PASSPHRASE] = missingPassphrase; result[EnigmailConstants.BAD_PASSPHRASE] = badPassphrase; result[gStatusFlags.INV_RECP] = invalidRecipient; result[gStatusFlags.INV_SGNR] = invalidSignature; result[gStatusFlags.IMPORT_OK] = importOk; result[gStatusFlags.FAILURE] = failureMessage; result[gStatusFlags.DECRYPTION_INFO] = decryptionInfo; return result; } function ignore() {} const failureLookup = setupFailureLookup(); function handleFailure(c, errorFlag) { c.flag = gStatusFlags[errorFlag]; // yields known flag or undefined (failureLookup[c.flag] || ignore)(c); // if known flag, story it in our status if (c.flag) { c.statusFlags |= c.flag; } } function newContext(errOutput, retStatusObj) { retStatusObj.statusMsg = ""; retStatusObj.errorMsg = ""; retStatusObj.extendedStatus = ""; retStatusObj.blockSeparation = ""; return { errOutput: errOutput, retStatusObj: retStatusObj, errArray: [], statusArray: [], errCode: 0, detectedCard: null, requestedCard: null, errorMsg: "", statusPat: /^\[GNUPG:\] /, statusFlags: 0, plaintextCount: 0, withinCryptoMsg: false, cryptoStartPat: /^BEGIN_DECRYPTION/, cryptoEndPat: /^END_DECRYPTION/, plaintextPat: /^PLAINTEXT /, plaintextLengthPat: /^PLAINTEXT_LENGTH / }; } function splitErrorOutput(errOutput) { var errLines = errOutput.split(/\r?\n/); // Discard last null string, if any if ((errLines.length > 1) && !errLines[errLines.length - 1]) { errLines.pop(); } return errLines; } function parseErrorLine(errLine, c) { if (errLine.search(c.statusPat) === 0) { // status line c.statusLine = errLine.replace(c.statusPat, ""); c.statusArray.push(c.statusLine); // extract first word as flag var matches = c.statusLine.match(/^((\w+)\b)/); if (matches && (matches.length > 1)) { let isError = (matches[1] == "ERROR"); (isError ? handleError : handleFailure)(c, matches[1]); } } else { // non-status line (details of previous status command) if (!getEnigmailGpg().getGpgFeature("decryption-info")) { if (errLine == "gpg: WARNING: message was not integrity protected") { // workaround for Gpg < 2.0.8 that don't fail on missing MDC for old // algorithms like CAST5 c.statusFlags |= EnigmailConstants.DECRYPTION_FAILED; c.inDecryptionFailed = true; } } c.errArray.push(errLine); // save details of DECRYPTION_FAILED message ass error message if (c.inDecryptionFailed) { c.errorMsg += errLine; } } } function detectForgedInsets(c) { // detect forged message insets let hasUnencryptedText = false; let hasEncryptedPart = false; for (var j = 0; j < c.statusArray.length; j++) { if (c.statusArray[j].search(c.cryptoStartPat) === 0) { c.withinCryptoMsg = true; hasEncryptedPart = true; } else if (c.withinCryptoMsg && c.statusArray[j].search(c.cryptoEndPat) === 0) { c.withinCryptoMsg = false; } else if (c.statusArray[j].search(c.plaintextPat) === 0) { if (!c.withinCryptoMsg) hasUnencryptedText = true; ++c.plaintextCount; if ((c.statusArray.length > j + 1) && (c.statusArray[j + 1].search(c.plaintextLengthPat) === 0)) { var matches = c.statusArray[j + 1].match(/(\w+) (\d+)/); if (matches.length >= 3) { c.retStatusObj.blockSeparation += (c.withinCryptoMsg ? "1" : "0") + ":" + matches[2] + " "; } } else { // strange: we got PLAINTEXT XX, but not PLAINTEXT_LENGTH XX c.retStatusObj.blockSeparation += (c.withinCryptoMsg ? "1" : "0") + ":0 "; } } } if (c.plaintextCount > 1 || (hasEncryptedPart && hasUnencryptedText)) { c.statusFlags |= (EnigmailConstants.DECRYPTION_FAILED | EnigmailConstants.BAD_SIGNATURE); } } function buildErrorMessageForCardCtrl(c, errCode, detectedCard) { var errorMsg = ""; switch (errCode) { case 1: if (detectedCard) { errorMsg = EnigmailLocale.getString("sc.wrongCardAvailable", [c.detectedCard, c.requestedCard]); } else { errorMsg = EnigmailLocale.getString("sc.insertCard", [c.requestedCard]); } break; case 2: errorMsg = EnigmailLocale.getString("sc.removeCard"); break; case 4: errorMsg = EnigmailLocale.getString("sc.noCardAvailable"); break; case 5: errorMsg = EnigmailLocale.getString("sc.noReaderAvailable"); break; } return errorMsg; } function parseErrorOutputWith(c) { EnigmailLog.DEBUG("errorHandling.jsm: parseErrorOutputWith: status message: \n" + c.errOutput + "\n"); c.errLines = splitErrorOutput(c.errOutput); c.isError = false; // set to true if a hard error was found // parse all error lines c.inDecryptionFailed = false; // to save details of encryption failed messages for (var j = 0; j < c.errLines.length; j++) { var errLine = c.errLines[j]; parseErrorLine(errLine, c); if (c.isError) break; } if ((c.statusFlags & EnigmailConstants.DECRYPTION_OKAY) && (c.statusFlags & EnigmailConstants.DECRYPTION_FAILED)) { c.statusFlags &= ~EnigmailConstants.DECRYPTION_OKAY; } detectForgedInsets(c); c.retStatusObj.blockSeparation = c.retStatusObj.blockSeparation.replace(/ $/, ""); c.retStatusObj.statusFlags = c.statusFlags; if (c.retStatusObj.statusMsg.length === 0) c.retStatusObj.statusMsg = c.statusArray.join("\n"); if (c.errorMsg.length === 0) { c.errorMsg = c.errArray.map(function f(str, idx) { return EnigmailSystem.convertNativeToUnicode(str); }, EnigmailSystem).join("\n"); } else { c.errorMsg = EnigmailSystem.convertNativeToUnicode(c.errorMsg); } if ((c.statusFlags & EnigmailConstants.CARDCTRL) && c.errCode > 0) { c.errorMsg = buildErrorMessageForCardCtrl(c, c.errCode, c.detectedCard); c.statusFlags |= EnigmailConstants.DISPLAY_MESSAGE; } EnigmailLog.DEBUG("errorHandling.jsm: parseErrorOutputWith: statusFlags = " + EnigmailData.bytesToHex(EnigmailData.pack(c.statusFlags, 4)) + "\n"); EnigmailLog.DEBUG("errorHandling.jsm: parseErrorOutputWith: return with c.errorMsg = " + c.errorMsg + "\n"); return c.errorMsg; } var EnigmailErrorHandling = { parseErrorOutput: function(errOutput, retStatusObj) { var context = newContext(errOutput, retStatusObj); return parseErrorOutputWith(context); }, /** * Determin why a given key or userID cannot be used for signing * * @param keySpec String - key ID or user ID * * @return String - the reason(s) as message to display to the user * "" in case the key is valid */ determineInvSignReason: function(keySpec) { EnigmailLog.DEBUG("errorHandling.jsm: determineInvSignReason: keySpec: " + keySpec + "\n"); let reasonMsg = ""; if (keySpec.search(/^(0x)?[0-9A-F]+$/) === 0) { let key = getEnigmailKeyRing().getKeyById(keySpec); if (!key) { reasonMsg = EnigmailLocale.getString("keyError.keyIdNotFound", keySpec); } else { let r = key.getSigningValidity(); if (!r.keyValid) reasonMsg = r.reason; } } else { let keys = getEnigmailKeyRing().getKeysByUserId(keySpec); if (!keys || keys.length === 0) { reasonMsg = EnigmailLocale.getString("keyError.keySpecNotFound", keySpec); } else { for (let i in keys) { let r = keys[i].getSigningValidity(); if (!r.keyValid) reasonMsg += r.reason + "\n"; } } } return reasonMsg; }, /** * Determin why a given key or userID cannot be used for encryption * * @param keySpec String - key ID or user ID * * @return String - the reason(s) as message to display to the user * "" in case the key is valid */ determineInvRcptReason: function(keySpec) { EnigmailLog.DEBUG("errorHandling.jsm: determineInvRcptReason: keySpec: " + keySpec + "\n"); let reasonMsg = ""; if (keySpec.search(/^(0x)?[0-9A-F]+$/) === 0) { let key = getEnigmailKeyRing().getKeyById(keySpec); if (!key) { reasonMsg = EnigmailLocale.getString("keyError.keyIdNotFound", keySpec); } else { let r = key.getEncryptionValidity(); if (!r.keyValid) reasonMsg = r.reason; } } else { let keys = getEnigmailKeyRing().getKeysByUserId(keySpec); if (!keys || keys.length === 0) { reasonMsg = EnigmailLocale.getString("keyError.keySpecNotFound", keySpec); } else { for (let i in keys) { let r = keys[i].getEncryptionValidity(); if (!r.keyValid) reasonMsg += r.reason + "\n"; } } } return reasonMsg; }, /** * Get a unique file to use for logging with --log-file */ getTempLogFile: function() { let logFile = getEnigmailFiles().getTempDirObj().clone(); logFile.normalize(); logFile.append("gpgOutput." + getEnigmailRNG().generateRandomString(6)); return logFile; }, /** * Append the content of a file (such as created via --log-file) to the * debug log, and delete the file afterwards * * @param logFile: nsIFile object */ appendLogFileToDebug: function(logFile) { if (logFile && logFile.exists() && logFile.isFile()) { let logData = getEnigmailFiles().readFile(logFile); EnigmailLog.DEBUG(`errorHandling.jsm: Process terminated. Human-readable output from gpg:\n-----\n${logData}-----\n`); try { logFile.remove(false); } catch (ex) {} } } }; enigmail-2.0.8/package/events.jsm000066400000000000000000000023361334302754500167320ustar00rootroot00000000000000/*global Components: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailEvents"]; const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ Cu.import("resource://enigmail/timer.jsm"); /*global EnigmailTimer: false */ /**** DEPRECATED - use EnigmailTimer instead *****/ var EnigmailEvents = { /** * dispatch event aynchronously to the main thread * * @callbackFunction: Function - any function specification * @sleepTimeMs: Number - optional number of miliseconds to delay * (0 if not specified) * @arrayOfArgs: Array - arguments to pass to callbackFunction */ dispatchEvent: function(callbackFunction, sleepTimeMs, arrayOfArgs) { EnigmailLog.DEBUG("enigmailCommon.jsm: dispatchEvent f=" + callbackFunction.name + "\n"); return EnigmailTimer.setTimeout(() => { callbackFunction(arrayOfArgs); }, sleepTimeMs); } }; enigmail-2.0.8/package/execution.jsm000066400000000000000000000327021334302754500174310ustar00rootroot00000000000000/*global Components: false, EnigmailData: false, EnigmailFiles: false, EnigmailLog: false, subprocess: false, EnigmailErrorHandling: false, EnigmailCore: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; const EXPORTED_SYMBOLS = ["EnigmailExecution"]; const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; Cu.import("resource://enigmail/data.jsm"); Cu.import("resource://enigmail/files.jsm"); Cu.import("resource://enigmail/log.jsm"); Cu.import("resource://enigmail/subprocess.jsm"); Cu.import("resource://enigmail/errorHandling.jsm"); Cu.import("resource://enigmail/core.jsm"); Cu.import("resource://enigmail/lazy.jsm"); /* global EnigmailLazy: false */ Cu.import("resource://enigmail/constants.jsm"); /* global EnigmailConstants: false */ const loadOS = EnigmailLazy.loader("enigmail/os.jsm", "EnigmailOS"); var EnigmailExecution = { agentType: "", /** * execStart Listener Object * * The listener object must implement at least the following methods: * * stdin(pipe) - OPTIONAL - write data to subprocess stdin via |pipe| hanlde * stdout(data) - receive |data| from subprocess stdout * stderr(data) - receive |data| from subprocess stderr * done(exitCode) - receive signal when subprocess has terminated */ /** * start a subprocess (usually gpg) that gets and/or receives data via stdin/stdout/stderr. * * @command: either: String - full path to executable * or: nsIFile object referencing executable * @args: Array of Strings: command line parameters for executable * @needPassphrase: Boolean - is a passphrase required for the action? * if true, the password may be promted using a dialog * (unless alreday cached or gpg-agent is used) * @domWindow: nsIWindow - window on top of which password dialog is shown * @listener: Object - Listener to interact with subprocess; see spec. above * @statusflagsObj: Object - .value will hold status Flags * * @return: handle to subprocess */ execStart: function(command, args, needPassphrase, domWindow, listener, statusFlagsObj) { EnigmailLog.WRITE("execution.jsm: execStart: " + "command = " + EnigmailFiles.formatCmdLine(command, args) + ", needPassphrase=" + needPassphrase + ", domWindow=" + domWindow + ", listener=" + listener + "\n"); listener = listener || {}; statusFlagsObj.value = 0; let proc = null; listener.command = command; EnigmailLog.CONSOLE("enigmail> " + EnigmailFiles.formatCmdLine(command, args) + "\n"); try { proc = subprocess.call({ command: command, arguments: args, environment: EnigmailCore.getEnvList(), charset: null, bufferedOutput: true, stdin: function(pipe) { if (listener.stdin) listener.stdin(pipe); }, stdout: function(data) { listener.stdout(data); }, stderr: function(data) { listener.stderr(data); }, done: function(result) { try { listener.done(result.exitCode); } catch (ex) { EnigmailLog.writeException("execution.jsm", ex); } }, mergeStderr: false }); } catch (ex) { EnigmailLog.ERROR("execution.jsm: execStart: subprocess.call failed with '" + ex.toString() + "'\n"); EnigmailLog.DEBUG(" enigmail> DONE with FAILURE\n"); return null; } EnigmailLog.DEBUG(" enigmail> DONE\n"); return proc; }, /* requirements for listener object: exitCode stderrData */ execEnd: function(listener, statusFlagsObj, statusMsgObj, cmdLineObj, errorMsgObj, blockSeparationObj) { EnigmailLog.DEBUG("execution.jsm: execEnd:\n"); cmdLineObj.value = listener.command; let exitCode = listener.exitCode; const errOutput = listener.stderrData; EnigmailLog.DEBUG("execution.jsm: execEnd: exitCode = " + exitCode + "\n"); EnigmailLog.DEBUG("execution.jsm: execEnd: errOutput = " + errOutput + "\n"); const retObj = {}; errorMsgObj.value = EnigmailErrorHandling.parseErrorOutput(errOutput, retObj); statusFlagsObj.value = retObj.statusFlags; statusMsgObj.value = retObj.statusMsg; if (!blockSeparationObj) blockSeparationObj = {}; blockSeparationObj.value = retObj.blockSeparation; if (errOutput.search(/jpeg image of size \d+/) > -1) { statusFlagsObj.value |= EnigmailConstants.PHOTO_AVAILABLE; } if (blockSeparationObj && blockSeparationObj.value.indexOf(" ") > 0) { exitCode = 2; } EnigmailLog.CONSOLE(EnigmailData.convertFromUnicode(errorMsgObj.value) + "\n"); return exitCode; }, /** * Resolve the path to the command and execute it if available * Returns output from simpleExecCmd */ resolveAndSimpleExec: function(command, args, exitCodeObj, errorMsgObj) { const resolvedCommand = EnigmailFiles.resolvePathWithEnv(command); if (resolvedCommand === null) { return null; } return EnigmailExecution.simpleExecCmd(resolvedCommand, args, exitCodeObj, errorMsgObj); }, /** * Execute a command and return the output from stdout * No input and no statusFlags are returned. */ simpleExecCmd: function(command, args, exitCodeObj, errorMsgObj) { EnigmailLog.WRITE("execution.jsm: EnigmailExecution.simpleExecCmd: command = " + command + " " + args.join(" ") + "\n"); let outputData = ""; let errOutput = ""; errorMsgObj.value = ""; exitCodeObj.value = -1; EnigmailLog.CONSOLE("enigmail> " + EnigmailFiles.formatCmdLine(command, args) + "\n"); try { subprocess.call({ command: command, arguments: args, charset: null, environment: EnigmailCore.getEnvList(), done: function(result) { exitCodeObj.value = result.exitCode; outputData = result.stdout; errOutput = result.stderr; }, mergeStderr: false }).wait(); } catch (ex) { EnigmailLog.ERROR("execution.jsm: EnigmailExecution.simpleExecCmd: " + command.path + " failed\n"); EnigmailLog.DEBUG(" enigmail> DONE with FAILURE\n"); exitCodeObj.value = -1; } EnigmailLog.DEBUG(" enigmail> DONE\n"); if (errOutput) { errorMsgObj.value = errOutput; } EnigmailLog.DEBUG("execution.jsm: EnigmailExecution.simpleExecCmd: exitCode = " + exitCodeObj.value + "\n"); EnigmailLog.DEBUG("execution.jsm: EnigmailExecution.simpleExecCmd: errOutput = " + errOutput + "\n"); return outputData; }, /** * Execute a command and return the output from stdout. * Accepts input and returns error message and statusFlags. */ execCmd: function(command, args, input, exitCodeObj, statusFlagsObj, statusMsgObj, errorMsgObj, retStatusObj) { EnigmailLog.WRITE("execution.jsm: EnigmailExecution.execCmd: subprocess = '" + command.path + "'\n"); if ((typeof input) != "string") input = ""; let preInput = ""; let outputData = ""; let errOutput = ""; EnigmailLog.CONSOLE("enigmail> " + EnigmailFiles.formatCmdLine(command, args) + "\n"); const procBuilder = new EnigmailExecution.processBuilder(); procBuilder.setCommand(command); procBuilder.setArguments(args); procBuilder.setEnvironment(EnigmailCore.getEnvList()); procBuilder.setStdin( function(pipe) { if (input.length > 0 || preInput.length > 0) { pipe.write(preInput + input); } pipe.close(); } ); procBuilder.setStdout( function(data) { outputData += data; } ); procBuilder.setStderr( function(data) { errOutput += data; } ); procBuilder.setDone( function(result) { exitCodeObj.value = result.exitCode; } ); const proc = procBuilder.build(); try { subprocess.call(proc).wait(); } catch (ex) { EnigmailLog.ERROR("execution.jsm: EnigmailExecution.execCmd: subprocess.call failed with '" + ex.toString() + "'\n"); EnigmailLog.DEBUG(" enigmail> DONE with FAILURE\n"); exitCodeObj.value = -1; } EnigmailLog.DEBUG(" enigmail> DONE\n"); if (proc.resultData) outputData = proc.resultData; if (proc.errorData) errOutput = proc.errorData; EnigmailLog.DEBUG("execution.jsm: EnigmailExecution.execCmd: exitCode = " + exitCodeObj.value + "\n"); EnigmailLog.DEBUG("execution.jsm: EnigmailExecution.execCmd: errOutput = " + errOutput + "\n"); if (!retStatusObj) { retStatusObj = {}; } errorMsgObj.value = EnigmailErrorHandling.parseErrorOutput(errOutput, retStatusObj); statusFlagsObj.value = retStatusObj.statusFlags; statusMsgObj.value = retStatusObj.statusMsg; const blockSeparation = retStatusObj.blockSeparation; exitCodeObj.value = EnigmailExecution.fixExitCode(exitCodeObj.value, statusFlagsObj); if (blockSeparation.indexOf(" ") > 0) { exitCodeObj.value = 2; } EnigmailLog.CONSOLE(errorMsgObj.value + "\n"); return outputData; }, /** * Fix the exit code of GnuPG (which may be wrong in some circumstances) * * @exitCode: Number - the exitCode obtained from GnuPG * @statusFlagsObj: Object - the statusFlagsObj as received from parseErrorOutput() * * @return: Number - fixed exit code */ fixExitCode: function(exitCode, statusFlagsObj) { EnigmailLog.DEBUG("execution.jsm: EnigmailExecution.fixExitCode: agentType: " + EnigmailExecution.agentType + " exitCode: " + exitCode + " statusFlags " + statusFlagsObj.statusFlags + "\n"); const statusFlags = statusFlagsObj.statusFlags; if (exitCode !== 0) { if ((statusFlags & (EnigmailConstants.BAD_PASSPHRASE | EnigmailConstants.UNVERIFIED_SIGNATURE)) && (statusFlags & EnigmailConstants.DECRYPTION_OKAY)) { EnigmailLog.DEBUG("enigmailCommon.jsm: Enigmail.fixExitCode: Changing exitCode for decrypted msg " + exitCode + "->0\n"); exitCode = 0; } if ((EnigmailExecution.agentType === "gpg") && (exitCode == 256) && (loadOS().getOS() == "WINNT")) { EnigmailLog.WARNING("enigmailCommon.jsm: Enigmail.fixExitCode: Using gpg and exit code is 256. You seem to use cygwin-gpg, activating countermeasures.\n"); if (statusFlags & (EnigmailConstants.BAD_PASSPHRASE | EnigmailConstants.UNVERIFIED_SIGNATURE)) { EnigmailLog.WARNING("enigmailCommon.jsm: Enigmail.fixExitCode: Changing exitCode 256->2\n"); exitCode = 2; } else { EnigmailLog.WARNING("enigmailCommon.jsm: Enigmail.fixExitCode: Changing exitCode 256->0\n"); exitCode = 0; } } } else { if (statusFlags & (EnigmailConstants.INVALID_RECIPIENT | EnigmailConstants.DECRYPTION_FAILED | EnigmailConstants.BAD_ARMOR | EnigmailConstants.MISSING_PASSPHRASE | EnigmailConstants.BAD_PASSPHRASE)) { exitCode = 1; } else if (typeof(statusFlagsObj.extendedStatus) === "string" && statusFlagsObj.extendedStatus.search(/\bdisp:/) >= 0) { exitCode = 1; } } return exitCode; }, processBuilder: function() { this.process = {}; this.setCommand = function(command) { this.process.command = command; }; this.setArguments = function(args) { this.process.arguments = args; }; this.setEnvironment = function(envList) { this.process.environment = envList; }; this.setStdin = function(stdin) { this.process.stdin = stdin; }; this.setStdout = function(stdout) { this.process.stdout = stdout; }; this.setStderr = function(stderr) { this.process.stderr = stderr; }; this.setDone = function(done) { this.process.done = done; }; this.build = function() { this.process.charset = null; this.process.mergeStderr = false; this.process.resultData = ""; this.process.errorData = ""; this.process.exitCode = -1; return this.process; }; return this; }, execCmd2: function(command, args, stdinFunc, stdoutFunc, doneFunc) { EnigmailLog.CONSOLE("enigmail> " + EnigmailFiles.formatCmdLine(command, args) + "\n"); const procBuilder = new EnigmailExecution.processBuilder(); procBuilder.setCommand(command); procBuilder.setArguments(args); procBuilder.setEnvironment(EnigmailCore.getEnvList()); procBuilder.setStdin(stdinFunc); procBuilder.setStdout(stdoutFunc); procBuilder.setDone(doneFunc); const proc = procBuilder.build(); subprocess.call(proc).wait(); }, /** * simple listener for using with execStart * * stdinFunc: optional function to write to stdin * doneFunc : optional function that is called when the process is terminated */ newSimpleListener: function(stdinFunc, doneFunc) { const simpleListener = { stdoutData: "", stderrData: "", exitCode: -1, stdin: function(pipe) { if (stdinFunc) { stdinFunc(pipe); } else { pipe.close(); } }, stdout: function(data) { simpleListener.stdoutData += data; }, stderr: function(data) { simpleListener.stderrData += data; }, done: function(exitCode) { simpleListener.exitCode = exitCode; if (doneFunc) { doneFunc(exitCode); } } }; return simpleListener; } }; enigmail-2.0.8/package/files.jsm000066400000000000000000000356661334302754500165440ustar00rootroot00000000000000/*global Components: false, EnigmailLog: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; const EXPORTED_SYMBOLS = ["EnigmailFiles"]; const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; Cu.import("resource://enigmail/data.jsm"); /* global EnigmailData: false */ Cu.import("resource://enigmail/os.jsm"); /* global EnigmailOS: false */ Cu.import("resource://enigmail/core.jsm"); /* global EnigmailCore: false */ Cu.import("resource://enigmail/lazy.jsm"); /* global EnigmailLazy: false */ Cu.importGlobalProperties(["TextDecoder"]); const { OS } = Cu.import("resource://gre/modules/osfile.jsm", {}); const lazyStream = EnigmailLazy.loader("enigmail/streams.jsm", "EnigmailStreams"); const lazyLog = EnigmailLazy.loader("enigmail/log.jsm", "EnigmailLog"); const NS_FILE_CONTRACTID = "@mozilla.org/file/local;1"; const NS_LOCALFILEOUTPUTSTREAM_CONTRACTID = "@mozilla.org/network/file-output-stream;1"; const NS_IOSERVICE_CONTRACTID = "@mozilla.org/network/io-service;1"; const NS_SCRIPTABLEINPUTSTREAM_CONTRACTID = "@mozilla.org/scriptableinputstream;1"; const DIRSERVICE_CONTRACTID = "@mozilla.org/file/directory_service;1"; const NS_RDONLY = 0x01; const NS_WRONLY = 0x02; const NS_CREATE_FILE = 0x08; const NS_TRUNCATE = 0x20; const DEFAULT_FILE_PERMS = 0x180; // equals 0600 function potentialWindowsExecutable(file) { if (EnigmailOS.isDosLike) { return file + ".exe"; } return file; } var EnigmailFiles = { /** * potentialWindowsExecutable appends .exe to a file * * @param String file - file path or executable name to append .exe to * * @return String file - modified file path or executable name */ potentialWindowsExecutable: potentialWindowsExecutable, isAbsolutePath: function(filePath, isDosLike) { // Check if absolute path if (isDosLike) { return ((filePath.search(/^\w+:\\/) === 0) || (filePath.search(/^\\\\/) === 0) || (filePath.search(/^\/\//) === 0)); } else { return (filePath.search(/^\//) === 0); } }, /** * resolvePathWithEnv tries to resolve an file's path with the environment PATH variable. * * @param String file - file to be resolved * * @return String foundPath - Returns found path. If no path is found, returns null. */ resolvePathWithEnv: function(executable) { let envSvc = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment); const foundPath = EnigmailFiles.resolvePath(potentialWindowsExecutable(executable), envSvc.get("PATH"), EnigmailOS.isDosLike); if (foundPath !== null) { foundPath.normalize(); } return foundPath; }, resolvePath: function(filePath, envPath, isDosLike) { lazyLog().DEBUG("files.jsm: resolvePath: filePath=" + filePath + "\n"); if (EnigmailFiles.isAbsolutePath(filePath, isDosLike)) return filePath; if (!envPath) return null; const fileNames = filePath.split(";"); const pathDirs = envPath.split(isDosLike ? ";" : ":"); for (let i = 0; i < fileNames.length; i++) { for (let j = 0; j < pathDirs.length; j++) { try { const pathDir = Cc[NS_FILE_CONTRACTID].createInstance(Ci.nsIFile); lazyLog().DEBUG("files.jsm: resolvePath: checking for " + pathDirs[j] + "/" + fileNames[i] + "\n"); EnigmailFiles.initPath(pathDir, pathDirs[j]); try { if (pathDir.exists() && pathDir.isDirectory()) { pathDir.appendRelativePath(fileNames[i]); if (pathDir.exists() && !pathDir.isDirectory()) { return pathDir; } } } catch (ex) {} } catch (ex) {} } } return null; }, createFileStream: function(filePath, permissions) { try { let localFile; if (typeof filePath == "string") { localFile = Cc[NS_FILE_CONTRACTID].createInstance(Ci.nsIFile); EnigmailFiles.initPath(localFile, filePath); } else { localFile = filePath.QueryInterface(Ci.nsIFile); } if (localFile.exists()) { if (localFile.isDirectory() || !localFile.isWritable()) throw Components.results.NS_ERROR_FAILURE; if (!permissions) permissions = localFile.permissions; } if (!permissions) permissions = DEFAULT_FILE_PERMS; const flags = NS_WRONLY | NS_CREATE_FILE | NS_TRUNCATE; const fileStream = Cc[NS_LOCALFILEOUTPUTSTREAM_CONTRACTID].createInstance(Ci.nsIFileOutputStream); fileStream.init(localFile, flags, permissions, 0); return fileStream; } catch (ex) { lazyLog().ERROR("files.jsm: createFileStream: Failed to create " + filePath + "\n"); return null; } }, // path initialization function // uses persistentDescriptor in case that initWithPath fails // (seems to happen frequently with UTF-8 characters in path names) initPath: function(localFileObj, pathStr) { localFileObj.initWithPath(pathStr); if (!localFileObj.exists()) { localFileObj.persistentDescriptor = pathStr; } }, /** * Read the contents of a text file into a string * * @param fileObj: Object (nsIFile) * * @return String (file contents) */ readFile: function(fileObj) { let fileContents = ""; if (fileObj.exists()) { let inspector = Cc["@mozilla.org/jsinspector;1"].createInstance(Ci.nsIJSInspector); let decoder = new TextDecoder(); OS.File.read(fileObj.path).then(arr => { fileContents = EnigmailData.arrayBufferToString(arr); // Convert the array to a text inspector.exitNestedEventLoop(); }).catch(err => { inspector.exitNestedEventLoop(); }); inspector.enterNestedEventLoop(0); // wait for async process to terminate } return fileContents; }, /** Read the contents of a file with binary data into a string * @param fileObj: Object (nsIFile) * * @return String (file contents) */ readBinaryFile: function(fileObj) { let fileContents = ""; if (fileObj.exists()) { let inspector = Cc["@mozilla.org/jsinspector;1"].createInstance(Ci.nsIJSInspector); OS.File.read(fileObj.path).then(arr => { for (let i = 0; i < arr.length; i++) { fileContents += String.fromCharCode(arr[i]); } inspector.exitNestedEventLoop(); }).catch(err => { inspector.exitNestedEventLoop(); }); inspector.enterNestedEventLoop(0); // wait for async process to terminate } return fileContents; }, formatCmdLine: function(command, args) { function getQuoted(str) { str = str.toString(); let i = str.indexOf(" "); if (i >= 0) { return '"' + str + '"'; } else { return str; } } if (command instanceof Ci.nsIFile) { command = EnigmailFiles.getFilePathDesc(command); } const cmdStr = getQuoted(command) + " "; const argStr = args.map(getQuoted).join(" ").replace(/\\\\/g, '\\'); return cmdStr + argStr; }, getFilePathDesc: function(nsFileObj) { if (EnigmailOS.getOS() == "WINNT") { return nsFileObj.persistentDescriptor; } else { return nsFileObj.path; } }, getFilePath: function(nsFileObj) { return EnigmailData.convertToUnicode(EnigmailFiles.getFilePathDesc(nsFileObj), "utf-8"); }, getEscapedFilename: function(fileNameStr) { if (EnigmailOS.isDosLike) { // escape the backslashes and the " character (for Windows and OS/2) fileNameStr = fileNameStr.replace(/([\\"])/g, "\\$1"); } if (EnigmailOS.getOS() == "WINNT") { // replace leading "\\" with "//" fileNameStr = fileNameStr.replace(/^\\\\*/, "//"); } return fileNameStr; }, /** * get the temporary folder * * @return nsIFile object holding a reference to the temp directory */ getTempDirObj: function() { const TEMPDIR_PROP = "TmpD"; try { const dsprops = Cc[DIRSERVICE_CONTRACTID].getService(). QueryInterface(Ci.nsIProperties); return dsprops.get(TEMPDIR_PROP, Ci.nsIFile); } catch (ex) { // let's guess ... const tmpDirObj = Cc[NS_FILE_CONTRACTID].createInstance(Ci.nsIFile); if (EnigmailOS.getOS() == "WINNT") { tmpDirObj.initWithPath("C:/TEMP"); } else { tmpDirObj.initWithPath("/tmp"); } return tmpDirObj; } }, /** * get the temporary folder as string * * @return String containing the temp directory name */ getTempDir: function() { return EnigmailFiles.getTempDirObj().path; }, /** * create a new folder as subfolder of the temporary directory * * @param dirName String - name of subfolder * @param unique Boolean - if true, the directory is guaranteed to be unique * * @return nsIFile object holding a reference to the created directory */ createTempSubDir: function(dirName, unique = false) { const localFile = EnigmailFiles.getTempDirObj().clone(); localFile.append(dirName); if (unique) { localFile.createUnique(Ci.nsIFile.DIRECTORY_TYPE, 509 /* = 0775 */ ); } else { localFile.create(Ci.nsIFile.DIRECTORY_TYPE, 509 /* = 0775 */ ); } return localFile; }, /** * Ensure that a directory exists and is writeable. * * @param dirObj Object - nsIFile object for the directory to test * @param permissions Number - file permissions in Unix style (e.g. 0700) * * @return Number: * 0 - OK: directory exists (or was created) and is writeable * 1 - NOK: Directory does not exist (and cannot be created) * 2 - NOK: Directory exists but is readonly (and cannot be modified) * 3 - NOK: File object with required name exists but is not a directory */ ensureWritableDirectory: function(dirObj, permissions) { let retVal = -1; try { if (dirObj.isDirectory()) { try { if (dirObj.isWritable()) { retVal = 0; } else { dirObj.permissions = permissions; retVal = 0; } } catch (x) { retVal = 2; } } else { retVal = 3; } } catch (x) { // directory doesn't exist try { dirObj.create(Ci.nsIFile.DIRECTORY_TYPE, permissions); retVal = 0; } catch (x2) { retVal = 1; } } return retVal; }, /** * Write data to a file * @filePath |string| or |nsIFile| object - the file to be created * @data |string| - the data to write to the file * @permissions |number| - file permissions according to Unix spec (0600 by default) * * @return true if data was written successfully, false otherwise */ writeFileContents: function(filePath, data, permissions) { try { const fileOutStream = EnigmailFiles.createFileStream(filePath, permissions); if (data.length) { if (fileOutStream.write(data, data.length) != data.length) { throw Components.results.NS_ERROR_FAILURE; } fileOutStream.flush(); } fileOutStream.close(); } catch (ex) { lazyLog().ERROR("files.jsm: writeFileContents: Failed to write to " + filePath + "\n"); return false; } return true; }, /** * Create a text file from the contents of a given URL * * @param srcUrl: String - the URL to download * @param outFile: nsIFile object - the file to create * * no return value */ writeUrlToFile: function(srcUrl, outFile) { lazyLog().DEBUG("files.jsm: writeUrlToFile(" + outFile.path + ")\n"); var ioServ = Cc[NS_IOSERVICE_CONTRACTID].getService(Ci.nsIIOService); var msgUri = ioServ.newURI(srcUrl, null, null); var channel = lazyStream().createChannelFromURI(msgUri); var istream = channel.open(); var fstream = Cc["@mozilla.org/network/safe-file-output-stream;1"].createInstance(Ci.nsIFileOutputStream); var buffer = Cc["@mozilla.org/network/buffered-output-stream;1"].createInstance(Ci.nsIBufferedOutputStream); fstream.init(outFile, 0x04 | 0x08 | 0x20, 0x180, 0); // write, create, truncate buffer.init(fstream, 8192); while (istream.available() > 0) { buffer.writeFrom(istream, istream.available()); } // Close the output streams if (buffer instanceof Ci.nsISafeOutputStream) buffer.finish(); else buffer.close(); if (fstream instanceof Ci.nsISafeOutputStream) fstream.finish(); else fstream.close(); // Close the input stream istream.close(); }, // return the useable path (for gpg) of a file object getFilePathReadonly: function(nsFileObj, creationMode) { if (creationMode === null) creationMode = NS_RDONLY; return nsFileObj.path; }, /** * Create an empty ZIP file * * @param nsFileObj - nsIFile object: reference to the file to be created * * @return nsIZipWriter object allow to perform write operations on the ZIP file */ createZipFile: function(nsFileObj) { const zipW = Cc['@mozilla.org/zipwriter;1'].createInstance(Ci.nsIZipWriter); zipW.open(nsFileObj, NS_WRONLY | NS_CREATE_FILE | NS_TRUNCATE); return zipW; }, /** * Open a ZIP file for reading * * @param nsFileObj - nsIFile object: reference to the file to be created * * @return nsIZipReader object allow to perform read operations on the ZIP file */ openZipFile: function(nsFileObj) { const zipR = Cc['@mozilla.org/libjar/zip-reader;1'].createInstance(Ci.nsIZipReader); zipR.open(nsFileObj); return zipR; }, /** * Unpack a ZIP file to a directory * * @param zipFile - nsIZipReader object: file to be extracted * @param targetDir - nsIFile object: target directory * * @return Boolean: true if extraction successfull, false otherwise */ extractZipFile: function(zipFile, targetDir) { // create missing parent directories function createDirWithParents(dirObj) { if (!dirObj.parent.exists()) { createDirWithParents(dirObj.parent); } dirObj.create(dirObj.DIRECTORY_TYPE, 493); } try { let zipReader = EnigmailFiles.openZipFile(zipFile); let f = zipReader.findEntries("*"); while (f.hasMore()) { let t = targetDir.clone(); let i = f.getNext(); let entry = zipReader.getEntry(i); if (!EnigmailOS.isDosLike) { t.initWithPath(t.path + "/" + i); } else { t.initWithPath(t.path + "\\" + i); } if (!t.parent.exists()) { createDirWithParents(t.parent); } if (!(entry.isDirectory || i.search(/[\/\\]$/) >= 0)) { zipReader.extract(i, t); } } zipReader.close(); return true; } catch (ex) { lazyLog().ERROR("files.jsm: extractZipFile: Failed to create ZIP: " + ex + "\n"); return false; } } }; enigmail-2.0.8/package/filters.jsm000066400000000000000000000410041334302754500170710ustar00rootroot00000000000000/*global Components: false, EnigmailPersistentCrypto: false, EnigmailCore: false, EnigmailLog: false, EnigmailLocale: false, EnigmailLazy: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailFilters"]; const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; Cu.import("resource://enigmail/lazy.jsm"); Cu.import("resource://enigmail/locale.jsm"); Cu.import("resource://enigmail/core.jsm"); Cu.import("resource://enigmail/persistentCrypto.jsm"); Cu.import("resource://enigmail/log.jsm"); Cu.import("resource://enigmail/funcs.jsm"); /* global EnigmailFuncs: false */ Cu.import("resource://enigmail/keyRing.jsm"); /* global EnigmailKeyRing: false */ Cu.import("resource://enigmail/streams.jsm"); /* global EnigmailStreams: false */ Cu.import("resource://enigmail/constants.jsm"); /* global EnigmailConstants: false */ Cu.import("resource://enigmail/data.jsm"); /* global EnigmailData: false */ Cu.import("resource:///modules/jsmime.jsm"); /*global jsmime: false*/ Cu.import("resource://gre/modules/NetUtil.jsm"); /*global NetUtil: false*/ Cu.import("resource://enigmail/mime.jsm"); /* global EnigmailMime: false */ const getDialog = EnigmailLazy.loader("enigmail/dialog.jsm", "EnigmailDialog"); var gNewMailListenerInitiated = false; /** * filter action for creating a decrypted version of the mail and * deleting the original mail at the same time */ const filterActionMoveDecrypt = { apply: function(aMsgHdrs, aActionValue, aListener, aType, aMsgWindow) { EnigmailLog.DEBUG("filters.jsm: filterActionMoveDecrypt: Move to: " + aActionValue + "\n"); var msgHdrs = []; for (var i = 0; i < aMsgHdrs.length; i++) { msgHdrs.push(aMsgHdrs.queryElementAt(i, Ci.nsIMsgDBHdr)); } EnigmailPersistentCrypto.dispatchMessages(msgHdrs, aActionValue, aListener, true); }, isValidForType: function(type, scope) { return true; }, validateActionValue: function(value, folder, type) { getDialog().alert(null, EnigmailLocale.getString("filter.decryptMove.warnExperimental")); if (value === "") { return EnigmailLocale.getString("filter.folderRequired"); } return null; } }; /** * filter action for creating a decrypted copy of the mail, leaving the original * message untouched */ const filterActionCopyDecrypt = { apply: function(aMsgHdrs, aActionValue, aListener, aType, aMsgWindow) { EnigmailLog.DEBUG("filters.jsm: filterActionCopyDecrypt: Copy to: " + aActionValue + "\n"); var msgHdrs = []; for (var i = 0; i < aMsgHdrs.length; i++) { msgHdrs.push(aMsgHdrs.queryElementAt(i, Ci.nsIMsgDBHdr)); } EnigmailPersistentCrypto.dispatchMessages(msgHdrs, aActionValue, aListener, false); }, isValidForType: function(type, scope) { EnigmailLog.DEBUG("filters.jsm: filterActionCopyDecrypt.isValidForType(" + type + ")\n"); return true; }, validateActionValue: function(value, folder, type) { EnigmailLog.DEBUG("filters.jsm: filterActionCopyDecrypt.validateActionValue(" + value + ")\n"); if (value === "") { return EnigmailLocale.getString("filter.folderRequired"); } return null; } }; /** * filter action for to encrypt a mail to a specific key */ const filterActionEncrypt = { apply: function(aMsgHdrs, aActionValue, aListener, aType, aMsgWindow) { // Ensure KeyRing is loaded. if (aMsgWindow) { EnigmailCore.getService(aMsgWindow.domWindow); } else { EnigmailCore.getService(); } EnigmailKeyRing.getAllKeys(); EnigmailLog.DEBUG("filters.jsm: filterActionEncrypt: Encrypt to: " + aActionValue + "\n"); let keyObj = EnigmailKeyRing.getKeyById(aActionValue); if (keyObj === null) { EnigmailLog.DEBUG("filters.jsm: failed to find key by id: " + aActionValue + "\n"); let keyId = EnigmailKeyRing.getValidKeyForRecipient(aActionValue); if (keyId) { keyObj = EnigmailKeyRing.getKeyById(keyId); } } if (keyObj === null && aListener) { EnigmailLog.DEBUG("filters.jsm: no valid key - aborting\n"); aListener.OnStartCopy(); aListener.OnStopCopy(1); return; } EnigmailLog.DEBUG("filters.jsm: key to encrypt to: " + JSON.stringify(keyObj) + ", userId: " + keyObj.userId + "\n"); var msgHdrs = []; for (let i = 0; i < aMsgHdrs.length; i++) { let msg = aMsgHdrs.queryElementAt(i, Ci.nsIMsgDBHdr); // Maybe skip messages here if they are already encrypted to // the target key? There might be some use case for unconditionally // encrypting here. E.g. to use the local preferences and remove all // other recipients. // Also not encrypting to already encrypted messages would make the // behavior less transparent as it's not obvious. msgHdrs.push(msg); } if (msgHdrs.length) { EnigmailPersistentCrypto.dispatchMessages(msgHdrs, null /* same folder */ , aListener, true /* move */ , keyObj /* target key */ ); } }, isValidForType: function(type, scope) { return true; }, validateActionValue: function(value, folder, type) { // Initialize KeyRing. Ugly as it blocks the GUI but // we need it. EnigmailCore.getService(); EnigmailKeyRing.getAllKeys(); EnigmailLog.DEBUG("filters.jsm: validateActionValue: Encrypt to: " + value + "\n"); if (value === "") { return EnigmailLocale.getString("filter.keyRequired"); } let keyObj = EnigmailKeyRing.getKeyById(value); if (keyObj === null) { EnigmailLog.DEBUG("filters.jsm: failed to find key by id. Looking for uid.\n"); let keyId = EnigmailKeyRing.getValidKeyForRecipient(value); if (keyId) { keyObj = EnigmailKeyRing.getKeyById(keyId); } } if (keyObj === null) { return EnigmailLocale.getString("filter.keyNotFound", [value]); } if (!keyObj.secretAvailable) { // We warn but we allow it. There might be use cases where // thunderbird + enigmail is used as a gateway filter with // the secret not available on one machine and the decryption // is intended to happen on different systems. getDialog().alert(null, EnigmailLocale.getString("filter.warn.keyNotSecret", [value])); } return null; } }; function isPGPEncrypted(data) { // We only check the first mime subpart for application/pgp-encrypted. // If it is text/plain or text/html we look into that for the // message marker. // If there are no subparts we just look in the body. // // This intentionally does not match more complex cases // with sub parts beeing encrypted etc. as auto processing // these kinds of mails will be error prone and better not // done through a filter var mimeTree = EnigmailMime.getMimeTree(data, true); if (!(mimeTree.subParts.length)) { // No subParts. Check for PGP Marker in Body return mimeTree.body.indexOf('-----BEGIN PGP MESSAGE-----') >= 0; } // Check the type of the first subpart. var firstPart = mimeTree.subParts[0]; var ct = firstPart.fullContentType; if (typeof(ct) == "string") { ct = ct.replace(/[\r\n]/g, " "); // Proper PGP/MIME ? if (ct.search(/application\/pgp-encrypted/i) >= 0) { return true; } // Look into text/plain pgp messages and text/html messages. if (ct.search(/text\/plain/i) >= 0 || ct.search(/text\/html/i) >= 0) { return firstPart.body.indexOf('-----BEGIN PGP MESSAGE-----') >= 0; } } return false; } /** * filter term for OpenPGP Encrypted mail */ const filterTermPGPEncrypted = { id: EnigmailConstants.FILTER_TERM_PGP_ENCRYPTED, name: EnigmailLocale.getString("filter.term.pgpencrypted.label"), needsBody: true, match: function(aMsgHdr, searchValue, searchOp) { var folder = aMsgHdr.folder; var stream = folder.getMsgInputStream(aMsgHdr, {}); var messageSize = folder.hasMsgOffline(aMsgHdr.messageKey) ? aMsgHdr.offlineMessageSize : aMsgHdr.messageSize; var scriptInput = Components.classes["@mozilla.org/scriptableinputstream;1"].createInstance(); var data; try { data = NetUtil.readInputStreamToString(stream, messageSize); } catch (ex) { EnigmailLog.DEBUG("filters.jsm: filterTermPGPEncrypted: failed to get data.\n"); // If we don't know better to return false. stream.close(); return false; } var isPGP = isPGPEncrypted(data); stream.close(); return ((searchOp == Ci.nsMsgSearchOp.Is && isPGP) || (searchOp == Ci.nsMsgSearchOp.Isnt && !isPGP)); }, getEnabled: function(scope, op) { return true; }, getAvailable: function(scope, op) { return true; }, getAvailableOperators: function(scope, length) { length.value = 2; return [Ci.nsMsgSearchOp.Is, Ci.nsMsgSearchOp.Isnt]; } }; /** * Add a custom filter action. If the filter already exists, do nothing * (for example, if addon is disabled and re-enabled) * * @param filterObj - nsIMsgFilterCustomAction */ function addFilterIfNotExists(filterObj) { let filterService = Cc["@mozilla.org/messenger/services/filters;1"].getService(Ci.nsIMsgFilterService); let foundFilter = null; try { foundFilter = filterService.getCustomAction(filterObj.id); } catch (ex) {} if (!foundFilter) { EnigmailLog.DEBUG("filters.jsm: addFilterIfNotExists: " + filterObj.id + "\n"); filterService.addCustomAction(filterObj); } } function initNewMailListener() { EnigmailLog.DEBUG("filters.jsm: initNewMailListener()\n"); if (!gNewMailListenerInitiated) { let notificationService = Cc["@mozilla.org/messenger/msgnotificationservice;1"] .getService(Ci.nsIMsgFolderNotificationService); notificationService.addListener(newMailListener, notificationService.msgAdded); } gNewMailListenerInitiated = true; } function shutdownNewMailListener() { EnigmailLog.DEBUG("filters.jsm: shutdownNewMailListener()\n"); if (gNewMailListenerInitiated) { let notificationService = Cc["@mozilla.org/messenger/msgnotificationservice;1"] .getService(Ci.nsIMsgFolderNotificationService); notificationService.removeListener(newMailListener); gNewMailListenerInitiated = false; } } function getIdentityForSender(senderEmail, msgServer) { let accountManager = Cc["@mozilla.org/messenger/account-manager;1"].getService(Ci.nsIMsgAccountManager); let identities = accountManager.getIdentitiesForServer(msgServer); for (let i = 0; i < identities.length; i++) { let id = identities.queryElementAt(i, Ci.nsIMsgIdentity); if (id.email.toLowerCase() === senderEmail.toLowerCase()) { return id; } } return null; } var consumerList = []; function JsmimeEmitter(requireBody) { this.requireBody = requireBody; this.mimeTree = { partNum: "", headers: null, body: "", parent: null, subParts: [] }; this.stack = []; this.currPartNum = ""; } JsmimeEmitter.prototype = { createPartObj: function(partNum, headers, parent) { return { partNum: partNum, headers: headers, body: "", parent: parent, subParts: [] }; }, getMimeTree: function() { return this.mimeTree.subParts[0]; }, /** JSMime API **/ startMessage: function() { this.currentPart = this.mimeTree; }, endMessage: function() {}, startPart: function(partNum, headers) { EnigmailLog.DEBUG("filters.jsm: JsmimeEmitter.startPart: partNum=" + partNum + "\n"); //this.stack.push(partNum); let newPart = this.createPartObj(partNum, headers, this.currentPart); if (partNum.indexOf(this.currPartNum) === 0) { // found sub-part this.currentPart.subParts.push(newPart); } else { // found same or higher level this.currentPart.subParts.push(newPart); } this.currPartNum = partNum; this.currentPart = newPart; }, endPart: function(partNum) { EnigmailLog.DEBUG("filters.jsm: JsmimeEmitter.startPart: partNum=" + partNum + "\n"); this.currentPart = this.currentPart.parent; }, deliverPartData: function(partNum, data) { EnigmailLog.DEBUG("filters.jsm: JsmimeEmitter.deliverPartData: partNum=" + partNum + "\n"); if (this.requireBody) { if (typeof(data) === "string") { this.currentPart.body += data; } else { this.currentPart.body += EnigmailData.arrayBufferToString(data); } } } }; function processIncomingMail(url, requireBody, aMsgHdr) { EnigmailLog.DEBUG("filters.jsm: processIncomingMail()\n"); let inputStream = EnigmailStreams.newStringStreamListener(msgData => { let opt = { strformat: "unicode", bodyformat: "decode" }; try { let e = new JsmimeEmitter(requireBody); let p = new jsmime.MimeParser(e, opt); p.deliverData(msgData); for (let c of consumerList) { try { c.consumeMessage(e.getMimeTree(), msgData, aMsgHdr); } catch (ex) { EnigmailLog.DEBUG("filters.jsm: processIncomingMail: exception: " + ex.toString() + "\n"); } } } catch (ex) {} }); try { let channel = EnigmailStreams.createChannel(url); channel.asyncOpen(inputStream, null); } catch (e) { EnigmailLog.DEBUG("filters.jsm: processIncomingMail: open stream exception " + e.toString() + "\n"); } } function getRequireMessageProcessing(aMsgHdr) { let isInbox = aMsgHdr.folder.getFlag(Ci.nsMsgFolderFlags.CheckNew) || aMsgHdr.folder.getFlag(Ci.nsMsgFolderFlags.Inbox); let requireBody = false; let inboxOnly = true; let selfSentOnly = false; let processReadMail = false; for (let c of consumerList) { if (!c.incomingMailOnly) { inboxOnly = false; } if (!c.unreadOnly) { processReadMail = true; } if (!c.headersOnly) { requireBody = true; } if (c.selfSentOnly) { selfSentOnly = true; } } if (!processReadMail && aMsgHdr.isRead) return null; if (inboxOnly && !isInbox) return null; if (selfSentOnly) { let sender = EnigmailFuncs.parseEmails(aMsgHdr.author, true); let id = null; if (sender && sender[0]) { id = getIdentityForSender(sender[0].email, aMsgHdr.folder.server); } if (!id) return null; } EnigmailLog.DEBUG("filters.jsm: getRequireMessageProcessing: author: " + aMsgHdr.author + "\n"); let messenger = Cc["@mozilla.org/messenger;1"].getService(Ci.nsIMessenger); let msgSvc = messenger.messageServiceFromURI(aMsgHdr.folder.getUriForMsg(aMsgHdr)); let u = {}; msgSvc.GetUrlForUri(aMsgHdr.folder.getUriForMsg(aMsgHdr), u, null); let op = (u.value.spec.indexOf("?") > 0 ? "&" : "?"); let url = u.value.spec + op + "header=enigmailFilter"; return { url: url, requireBody: requireBody }; } const newMailListener = { msgAdded: function(aMsgHdr) { EnigmailLog.DEBUG("filters.jsm: newMailListener.msgAdded() - got new mail in " + aMsgHdr.folder.prettiestName + "\n"); if (consumerList.length === 0) return; let ret = getRequireMessageProcessing(aMsgHdr); if (ret) { processIncomingMail(ret.url, ret.requireBody, aMsgHdr); } } }; /** messageStructure - Object: - partNum: String - MIME part number - headers: Object(nsIStructuredHeaders) - MIME part headers - body: String or typedarray - the body part - parent: Object(messageStructure) - link to the parent part - subParts: Array of Object(messageStructure) - array of the sub-parts */ var EnigmailFilters = { onStartup: function() { let filterService = Cc["@mozilla.org/messenger/services/filters;1"].getService(Ci.nsIMsgFilterService); filterService.addCustomTerm(filterTermPGPEncrypted); initNewMailListener(); }, onShutdown: function() { shutdownNewMailListener(); }, /** * add a new consumer to listen to new mails * * @param consumer - Object * - headersOnly: Boolean - needs full message body? [FUTURE] * - incomingMailOnly: Boolean - only work on folder(s) that obtain new mail * (Inbox and folders that listen to new mail) * - unreadOnly: Boolean - only process unread mails * - selfSentOnly: Boolean - only process mails with sender Email == Account Email * - consumeMessage: function(messageStructure, rawMessageData, nsIMsgHdr) */ addNewMailConsumer: function(consumer) { EnigmailLog.DEBUG("filters.jsm: addNewMailConsumer()\n"); consumerList.push(consumer); }, removeNewMailConsumer: function(consumer) { }, moveDecrypt: filterActionMoveDecrypt, copyDecrypt: filterActionCopyDecrypt, encrypt: filterActionEncrypt }; enigmail-2.0.8/package/filtersWrapper.jsm000066400000000000000000000105431334302754500204360ustar00rootroot00000000000000/*global Components: false */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailFiltersWrapper"]; const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; var gNewMailListenerInitiated = false; var gEnigmailFilters = null; let { EnigmailConstants } = Cu.import("resource://enigmail/constants.jsm"); let { EnigmailLocale } = Cu.import("resource://enigmail/locale.jsm"); /** * filter action for creating a decrypted version of the mail and * deleting the original mail at the same time */ const filterActionMoveDecrypt = { id: EnigmailConstants.FILTER_MOVE_DECRYPT, name: EnigmailLocale.getString("filter.decryptMove.label"), value: "movemessage", apply: function(aMsgHdrs, aActionValue, aListener, aType, aMsgWindow) { if (gEnigmailFilters) { gEnigmailFilters.moveDecrypt.apply(aMsgHdrs, aActionValue, aListener, aType, aMsgWindow); } else { aListener.OnStartCopy(); aListener.OnStopCopy(0); } }, isValidForType: function(type, scope) { return gEnigmailFilters ? gEnigmailFilters.moveDecrypt.isValidForType(type, scope) : false; }, validateActionValue: function(value, folder, type) { if (gEnigmailFilters) { return gEnigmailFilters.moveDecrypt.validateActionValue(value, folder, type); } return null; }, allowDuplicates: false, isAsync: true, needsBody: true }; /** * filter action for creating a decrypted copy of the mail, leaving the original * message untouched */ const filterActionCopyDecrypt = { id: EnigmailConstants.FILTER_COPY_DECRYPT, name: EnigmailLocale.getString("filter.decryptCopy.label"), value: "copymessage", apply: function(aMsgHdrs, aActionValue, aListener, aType, aMsgWindow) { if (gEnigmailFilters) { gEnigmailFilters.copyDecrypt.apply(aMsgHdrs, aActionValue, aListener, aType, aMsgWindow); } else { aListener.OnStartCopy(); aListener.OnStopCopy(0); } }, isValidForType: function(type, scope) { return gEnigmailFilters ? gEnigmailFilters.copyDecrypt.isValidForType() : false; }, validateActionValue: function(value, folder, type) { if (gEnigmailFilters) { return gEnigmailFilters.copyDecrypt.validateActionValue(value, folder, type); } return null; }, allowDuplicates: false, isAsync: true, needsBody: true }; /** * filter action for to encrypt a mail to a specific key */ const filterActionEncrypt = { id: EnigmailConstants.FILTER_ENCRYPT, name: EnigmailLocale.getString("filter.encrypt.label"), value: "encryptto", apply: function(aMsgHdrs, aActionValue, aListener, aType, aMsgWindow) { if (gEnigmailFilters) { gEnigmailFilters.encrypt.apply(aMsgHdrs, aActionValue, aListener, aType, aMsgWindow); } else { aListener.OnStartCopy(); aListener.OnStopCopy(0); } }, isValidForType: function(type, scope) { return gEnigmailFilters ? gEnigmailFilters.encrypt.isValidForType() : false; }, validateActionValue: function(value, folder, type) { if (gEnigmailFilters) { return gEnigmailFilters.encrypt.validateActionValue(value, folder, type); } return null; }, allowDuplicates: false, isAsync: true, needsBody: true }; /** * Add a custom filter action. If the filter already exists, do nothing * (for example, if addon is disabled and re-enabled) * * @param filterObj - nsIMsgFilterCustomAction */ function addFilterIfNotExists(filterObj) { let filterService = Cc["@mozilla.org/messenger/services/filters;1"].getService(Ci.nsIMsgFilterService); let foundFilter = null; try { foundFilter = filterService.getCustomAction(filterObj.id); } catch (ex) {} if (!foundFilter) { filterService.addCustomAction(filterObj); } } var EnigmailFiltersWrapper = { onStartup: function() { let { EnigmailFilters } = Cu.import("resource://enigmail/filters.jsm"); gEnigmailFilters = EnigmailFilters; addFilterIfNotExists(filterActionMoveDecrypt); addFilterIfNotExists(filterActionCopyDecrypt); addFilterIfNotExists(filterActionEncrypt); gEnigmailFilters.onStartup(); }, onShutdown: function() { gEnigmailFilters.onShutdown(); gEnigmailFilters = null; } }; enigmail-2.0.8/package/fixExchangeMsg.jsm000066400000000000000000000326121334302754500203260ustar00rootroot00000000000000/*global Components: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailFixExchangeMsg"]; const Cu = Components.utils; Cu.import("resource:///modules/MailUtils.js"); /*global MailUtils: false */ Cu.import("resource://enigmail/core.jsm"); /*global EnigmailCore: false */ Cu.import("resource://enigmail/funcs.jsm"); /*global EnigmailFuncs: false */ Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ Cu.import("resource://enigmail/streams.jsm"); /*global EnigmailStreams: false */ const EC = EnigmailCore; const Cc = Components.classes; const Ci = Components.interfaces; const IOSERVICE_CONTRACTID = "@mozilla.org/network/io-service;1"; /* * Fix a broken message from MS-Exchange and replace it with the original message * * @param nsIMsgDBHdr hdr Header of the message to fix (= pointer to message) * @param String brokenByApp Type of app that created the message. Currently one of * exchange, iPGMail * @param String destFolderUri optional destination Folder URI * * @return Promise; upon success, the promise returns the messageKey */ var EnigmailFixExchangeMsg = { fixExchangeMessage: function(hdr, brokenByApp, destFolderUri) { var self = this; return new Promise( function fixExchangeMessage_p(resolve, reject) { let msgUriSpec = hdr.folder.getUriForMsg(hdr); EnigmailLog.DEBUG("fixExchangeMsg.jsm: fixExchangeMessage: msgUriSpec: " + msgUriSpec + "\n"); self.hdr = hdr; self.destFolder = hdr.folder; self.resolve = resolve; self.reject = reject; self.brokenByApp = brokenByApp; if (destFolderUri) { self.destFolder = MailUtils.getFolderForURI(destFolderUri, false); } let messenger = Cc["@mozilla.org/messenger;1"].createInstance(Ci.nsIMessenger); self.msgSvc = messenger.messageServiceFromURI(msgUriSpec); let p = self.getMessageBody(); p.then( function resolved(fixedMsgData) { EnigmailLog.DEBUG("fixExchangeMsg.jsm: fixExchangeMessage: got fixedMsgData\n"); self.copyToTargetFolder(fixedMsgData); }); p.catch( function rejected(reason) { EnigmailLog.DEBUG("fixExchangeMsg.jsm: fixExchangeMessage: caught rejection: " + reason + "\n"); reject(); return; }); } ); }, getMessageBody: function() { EnigmailLog.DEBUG("fixExchangeMsg.jsm: getMessageBody:\n"); var self = this; return new Promise( function(resolve, reject) { let u = {}; self.msgSvc.GetUrlForUri(self.hdr.folder.getUriForMsg(self.hdr), u, null); let op = (u.value.spec.indexOf("?") > 0 ? "&" : "?"); let url = u.value.spec; // + op + 'part=' + part+"&header=enigmailConvert"; EnigmailLog.DEBUG("fixExchangeMsg.jsm: getting data from URL " + url + "\n"); let s = EnigmailStreams.newStringStreamListener( function analyzeData(data) { EnigmailLog.DEBUG("fixExchangeMsg.jsm: analyzeDecryptedData: got " + data.length + " bytes\n"); if (EnigmailLog.getLogLevel() > 5) { EnigmailLog.DEBUG("*** start data ***\n'" + data + "'\n***end data***\n"); } let hdrEnd = data.search(/\r?\n\r?\n/); if (hdrEnd <= 0) { // cannot find end of header data reject(0); return; } let hdrLines = data.substr(0, hdrEnd).split(/\r?\n/); let hdrObj = self.getFixedHeaderData(hdrLines); if (hdrObj.headers.length === 0 || hdrObj.boundary.length === 0) { reject(1); return; } let boundary = hdrObj.boundary; let body; switch (self.brokenByApp) { case "exchange": body = self.getCorrectedExchangeBodyData(data.substr(hdrEnd + 2), boundary); break; case "iPGMail": body = self.getCorrectediPGMailBodyData(data.substr(hdrEnd + 2), boundary); break; default: EnigmailLog.ERROR("fixExchangeMsg.jsm: getMessageBody: unknown appType " + self.brokenByApp + "\n"); reject(99); return; } if (body) { resolve(hdrObj.headers + "\r\n" + body); return; } else { reject(2); return; } } ); var ioServ = Components.classes[IOSERVICE_CONTRACTID].getService(Components.interfaces.nsIIOService); try { let channel = EnigmailStreams.createChannel(url); channel.asyncOpen(s, null); } catch (e) { EnigmailLog.DEBUG("fixExchangeMsg.jsm: getMessageBody: exception " + e + "\n"); } } ); }, /** * repair header data, such that they are working for PGP/MIME * * @return: object: { * headers: String - all headers ready for appending to message * boundary: String - MIME part boundary (incl. surrounding "" or '') * } */ getFixedHeaderData: function(hdrLines) { EnigmailLog.DEBUG("fixExchangeMsg.jsm: getFixedHeaderData: hdrLines[]:'" + hdrLines.length + "'\n"); let r = { headers: "", boundary: "" }; for (let i = 0; i < hdrLines.length; i++) { if (hdrLines[i].search(/^content-type:/i) >= 0) { // Join the rest of the content type lines together. // See RFC 2425, section 5.8.1 let contentTypeLine = hdrLines[i]; i++; while (i < hdrLines.length) { // Does the line start with a space or a tab, followed by something else? if (hdrLines[i].search(/^[ \t]+?/) === 0) { contentTypeLine += hdrLines[i]; i++; } else { // we got the complete content-type header contentTypeLine = contentTypeLine.replace(/[\r\n]/g, ""); let h = EnigmailFuncs.getHeaderData(contentTypeLine); r.boundary = h.boundary || ""; break; } } } else { r.headers += hdrLines[i] + "\r\n"; } } r.boundary = r.boundary.replace(/^(['"])(.*)(['"])/, "$2"); r.headers += 'Content-Type: multipart/encrypted;\r\n' + ' protocol="application/pgp-encrypted";\r\n' + ' boundary="' + r.boundary + '"\r\n' + 'X-Enigmail-Info: Fixed broken PGP/MIME message\r\n'; return r; }, /** * Get corrected body for MS-Exchange messages */ getCorrectedExchangeBodyData: function(bodyData, boundary) { EnigmailLog.DEBUG("fixExchangeMsg.jsm: getCorrectedExchangeBodyData: boundary='" + boundary + "'\n"); let boundRx = new RegExp("^--" + boundary, "gm"); let match = boundRx.exec(bodyData); if (match.index < 0) { EnigmailLog.DEBUG("fixExchangeMsg.jsm: getCorrectedExchangeBodyData: did not find index of mime type to skip\n"); return null; } let skipStart = match.index; // found first instance -- that's the message part to ignore match = boundRx.exec(bodyData); if (match.index <= 0) { EnigmailLog.DEBUG("fixExchangeMsg.jsm: getCorrectedExchangeBodyData: did not find boundary of PGP/MIME version identification\n"); return null; } let versionIdent = match.index; if (bodyData.substring(skipStart, versionIdent).search(/^content-type:[ \t]*text\/(plain|html)/mi) < 0) { EnigmailLog.DEBUG("fixExchangeMsg.jsm: getCorrectedExchangeBodyData: first MIME part is not content-type text/plain or text/html\n"); return null; } match = boundRx.exec(bodyData); if (match.index < 0) { EnigmailLog.DEBUG("fixExchangeMsg.jsm: getCorrectedExchangeBodyData: did not find boundary of PGP/MIME encrypted data\n"); return null; } let encData = match.index; let mimeHdr = Cc["@mozilla.org/messenger/mimeheaders;1"].createInstance(Ci.nsIMimeHeaders); mimeHdr.initialize(bodyData.substring(versionIdent, encData)); let ct = mimeHdr.extractHeader("content-type", false); if (!ct || ct.search(/application\/pgp-encrypted/i) < 0) { EnigmailLog.DEBUG("fixExchangeMsg.jsm: getCorrectedExchangeBodyData: wrong content-type of version-identification\n"); EnigmailLog.DEBUG(" ct = '" + ct + "'\n"); return null; } mimeHdr.initialize(bodyData.substr(encData, 5000)); ct = mimeHdr.extractHeader("content-type", false); if (!ct || ct.search(/application\/octet-stream/i) < 0) { EnigmailLog.DEBUG("fixExchangeMsg.jsm: getCorrectedExchangeBodyData: wrong content-type of PGP/MIME data\n"); EnigmailLog.DEBUG(" ct = '" + ct + "'\n"); return null; } return bodyData.substr(versionIdent); }, /** * Get corrected body for iPGMail messages */ getCorrectediPGMailBodyData: function(bodyData, boundary) { EnigmailLog.DEBUG("fixExchangeMsg.jsm: getCorrectediPGMailBodyData: boundary='" + boundary + "'\n"); let boundRx = new RegExp("^--" + boundary, "gm"); let match = boundRx.exec(bodyData); if (match.index < 0) { EnigmailLog.DEBUG("fixExchangeMsg.jsm: getCorrectediPGMailBodyData: did not find index of mime type to skip\n"); return null; } let skipStart = match.index; // found first instance -- that's the message part to ignore match = boundRx.exec(bodyData); if (match.index <= 0) { EnigmailLog.DEBUG("fixExchangeMsg.jsm: getCorrectediPGMailBodyData: did not find boundary of text/plain msg part\n"); return null; } let encData = match.index; match = boundRx.exec(bodyData); if (match.index < 0) { EnigmailLog.DEBUG("fixExchangeMsg.jsm: getCorrectediPGMailBodyData: did not find end boundary of PGP/MIME encrypted data\n"); return null; } let mimeHdr = Cc["@mozilla.org/messenger/mimeheaders;1"].createInstance(Ci.nsIMimeHeaders); mimeHdr.initialize(bodyData.substr(encData, 5000)); let ct = mimeHdr.extractHeader("content-type", false); if (!ct || ct.search(/application\/pgp-encrypted/i) < 0) { EnigmailLog.DEBUG("fixExchangeMsg.jsm: getCorrectediPGMailBodyData: wrong content-type of PGP/MIME data\n"); EnigmailLog.DEBUG(" ct = '" + ct + "'\n"); return null; } return "--" + boundary + "\r\n" + "Content-Type: application/pgp-encrypted\r\n" + "Content-Description: PGP/MIME version identification\r\n\r\n" + "Version: 1\r\n\r\n" + bodyData.substring(encData, match.index). replace(/^Content-Type: +application\/pgp-encrypted/im, "Content-Type: application/octet-stream") + "--" + boundary + "--\r\n"; }, copyToTargetFolder: function(msgData) { var self = this; var tempFile = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIProperties).get("TmpD", Ci.nsIFile); tempFile.append("message.eml"); tempFile.createUnique(0, 384); // octal 0600 - since octal is deprected in JS // ensure that file gets deleted on exit, if something goes wrong ... var extAppLauncher = Cc["@mozilla.org/mime;1"].getService(Ci.nsPIExternalAppLauncher); var foStream = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream); foStream.init(tempFile, 2, 0x200, false); // open as "write only" foStream.write(msgData, msgData.length); foStream.close(); extAppLauncher.deleteTemporaryFileOnExit(tempFile); // note: nsIMsgFolder.copyFileMessage seems to have a bug on Windows, when // the nsIFile has been already used by foStream (because of Windows lock system?), so we // must initialize another nsIFile object, pointing to the temporary file var fileSpec = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile); fileSpec.initWithPath(tempFile.path); var copyListener = { QueryInterface: function(iid) { if (iid.equals(Ci.nsIMsgCopyServiceListener) || iid.equals(Ci.nsISupports)) { return this; } throw Components.results.NS_NOINTERFACE; }, msgKey: null, GetMessageId: function(messageId) {}, OnProgress: function(progress, progressMax) {}, OnStartCopy: function() {}, SetMessageKey: function(key) { this.msgKey = key; }, OnStopCopy: function(statusCode) { if (statusCode !== 0) { EnigmailLog.DEBUG("fixExchangeMsg.jsm: error copying message: " + statusCode + "\n"); tempFile.remove(false); self.reject(3); return; } EnigmailLog.DEBUG("fixExchangeMsg.jsm: copy complete\n"); EnigmailLog.DEBUG("fixExchangeMsg.jsm: deleting message key=" + self.hdr.messageKey + "\n"); let msgArray = Cc["@mozilla.org/array;1"].createInstance(Ci.nsIMutableArray); msgArray.appendElement(self.hdr, false); self.hdr.folder.deleteMessages(msgArray, null, true, false, null, false); EnigmailLog.DEBUG("fixExchangeMsg.jsm: deleted original message\n"); tempFile.remove(false); self.resolve(this.msgKey); return; } }; let copySvc = Cc["@mozilla.org/messenger/messagecopyservice;1"].getService(Ci.nsIMsgCopyService); copySvc.CopyFileMessage(fileSpec, this.destFolder, null, false, this.hdr.flags, null, copyListener, null); } }; enigmail-2.0.8/package/funcs.jsm000066400000000000000000000314401334302754500165420ustar00rootroot00000000000000/*global Components: false, btoa: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailFuncs"]; /* * Common Enigmail crypto-related GUI functionality * */ const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ Cu.import("resource://enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ Cu.import("resource://enigmail/locale.jsm"); /*global EnigmailLocale: false */ Cu.import("resource://enigmail/data.jsm"); /*global EnigmailData: false */ var gTxtConverter = null; var EnigmailFuncs = { /** * get a list of plain email addresses without name or surrounding <> * @param mailAddrs |string| - address-list encdoded in Unicode as specified in RFC 2822, 3.4 * separated by , or ; * * @return |string| - list of pure email addresses separated by "," */ stripEmail: function(mailAddresses) { // EnigmailLog.DEBUG("funcs.jsm: stripEmail(): mailAddresses=" + mailAddresses + "\n"); const SIMPLE = "[^<>,]+"; // RegExp for a simple email address (e.g. a@b.c) const COMPLEX = "[^<>,]*<[^<>, ]+>"; // RegExp for an address containing <...> (e.g. Name ) const MatchAddr = new RegExp("^(" + SIMPLE + "|" + COMPLEX + ")(," + SIMPLE + "|," + COMPLEX + ")*$"); let mailAddrs = mailAddresses; let qStart, qEnd; while ((qStart = mailAddrs.indexOf('"')) >= 0) { qEnd = mailAddrs.indexOf('"', qStart + 1); if (qEnd < 0) { EnigmailLog.ERROR("funcs.jsm: stripEmail: Unmatched quote in mail address: '" + mailAddresses + "'\n"); throw Components.results.NS_ERROR_FAILURE; } mailAddrs = mailAddrs.substring(0, qStart) + mailAddrs.substring(qEnd + 1); } // replace any ";" by ","; remove leading/trailing "," mailAddrs = mailAddrs.replace(/[,;]+/g, ",").replace(/^,/, "").replace(/,$/, ""); if (mailAddrs.length === 0) return ""; // having two <..> <..> in one email, or things like is an error if (mailAddrs.search(MatchAddr) < 0) { EnigmailLog.ERROR("funcs.jsm: stripEmail: Invalid <..> brackets in mail address: '" + mailAddresses + "'\n"); throw Components.results.NS_ERROR_FAILURE; } // We know that the "," and the < > are at the right places, thus we can split by "," let addrList = mailAddrs.split(/,/); for (let i in addrList) { // Extract pure e-mail address list (strip out anything before angle brackets and any whitespace) addrList[i] = addrList[i].replace(/^([^<>]*<)([^<>]+)(>)$/, "$2").replace(/\s/g, ""); } // remove repeated, trailing and leading "," (again, as there may be empty addresses) mailAddrs = addrList.join(",").replace(/,,/g, ",").replace(/^,/, "").replace(/,$/, ""); return mailAddrs; }, /** * get an array of email object (email, name) from an address string * @param mailAddrs |string| - address-list as specified in RFC 2822, 3.4 * separated by ","; encoded according to RFC 2047 * * @return |array| of object */ parseEmails: function(mailAddrs, encoded = true) { try { let hdr = Cc["@mozilla.org/messenger/headerparser;1"].createInstance(Ci.nsIMsgHeaderParser); if (encoded) { return hdr.parseEncodedHeader(mailAddrs, "utf-8"); } return hdr.parseDecodedHeader(mailAddrs); } catch (ex) {} return []; }, /** * Hide all menu entries and other XUL elements that are considered for * advanced users. The XUL items must contain 'advanced="true"' or * 'advanced="reverse"'. * * @obj: |object| - XUL tree element * @attribute: |string| - attribute to set or remove (i.e. "hidden" or "collapsed") * @dummy: |object| - anything * * no return value */ collapseAdvanced: function(obj, attribute, dummy) { EnigmailLog.DEBUG("funcs.jsm: collapseAdvanced:\n"); var advancedUser = EnigmailPrefs.getPref("advancedUser"); obj = obj.firstChild; while (obj) { if ("getAttribute" in obj) { if (obj.getAttribute("advanced") == "true") { if (advancedUser) { obj.removeAttribute(attribute); } else { obj.setAttribute(attribute, "true"); } } else if (obj.getAttribute("advanced") == "reverse") { if (advancedUser) { obj.setAttribute(attribute, "true"); } else { obj.removeAttribute(attribute); } } } obj = obj.nextSibling; } }, /** * determine default values for signing and encryption. * Translates "old-style" defaults (pre-Enigmail v1.0) to "current" defaults * * @identiy - nsIMsgIdentity object * * no return values */ getSignMsg: function(identity) { EnigmailLog.DEBUG("funcs.jsm: getSignMsg: identity.key=" + identity.key + "\n"); var sign = null; EnigmailPrefs.getPref("configuredVersion"); // dummy call to getPref to ensure initialization var prefRoot = EnigmailPrefs.getPrefRoot(); if (prefRoot.getPrefType("mail.identity." + identity.key + ".pgpSignPlain") === 0) { if (prefRoot.getPrefType("mail.identity." + identity.key + ".pgpSignMsg") === 0) { sign = identity.getBoolAttribute("pgpAlwaysSign"); identity.setBoolAttribute("pgpSignEncrypted", sign); identity.setBoolAttribute("pgpSignPlain", sign); } else { sign = identity.getIntAttribute("pgpSignMsg"); identity.setBoolAttribute("pgpSignEncrypted", sign == 1); identity.setBoolAttribute("pgpSignPlain", sign > 0); } prefRoot.deleteBranch("mail.identity." + identity.key + ".pgpSignMsg"); prefRoot.deleteBranch("mail.identity." + identity.key + ".pgpAlwaysSign"); } }, /** * this function tries to mimic the Thunderbird plaintext viewer * * @plainTxt - |string| containing the plain text data * * @ return HTML markup to display mssage */ formatPlaintextMsg: function(plainTxt) { if (!gTxtConverter) gTxtConverter = Cc["@mozilla.org/txttohtmlconv;1"].createInstance(Ci.mozITXTToHTMLConv); var prefRoot = EnigmailPrefs.getPrefRoot(); var fontStyle = ""; // set the style stuff according to perferences switch (prefRoot.getIntPref("mail.quoted_style")) { case 1: fontStyle = "font-weight: bold; "; break; case 2: fontStyle = "font-style: italic; "; break; case 3: fontStyle = "font-weight: bold; font-style: italic; "; break; } switch (prefRoot.getIntPref("mail.quoted_size")) { case 1: fontStyle += "font-size: large; "; break; case 2: fontStyle += "font-size: small; "; break; } fontStyle += "color: " + prefRoot.getCharPref("mail.citation_color") + ";"; var convFlags = Ci.mozITXTToHTMLConv.kURLs; if (prefRoot.getBoolPref("mail.display_glyph")) convFlags |= Ci.mozITXTToHTMLConv.kGlyphSubstitution; if (prefRoot.getBoolPref("mail.display_struct")) convFlags |= Ci.mozITXTToHTMLConv.kStructPhrase; // start processing the message plainTxt = plainTxt.replace(/\r\n/g, "\n").replace(/\r/g, "\n"); var lines = plainTxt.split(/\n/); var oldCiteLevel = 0; var citeLevel = 0; var preface = ""; var logLineStart = { value: 0 }; var isSignature = false; for (var i = 0; i < lines.length; i++) { preface = ""; oldCiteLevel = citeLevel; if (lines[i].search(/^[> \t]*>$/) === 0) lines[i] += " "; citeLevel = gTxtConverter.citeLevelTXT(lines[i], logLineStart); if (citeLevel > oldCiteLevel) { preface = ''; for (let j = 0; j < citeLevel - oldCiteLevel; j++) { preface += '
'; } preface += '
\n';
      }
      else if (citeLevel < oldCiteLevel) {
        preface = '
'; for (let j = 0; j < oldCiteLevel - citeLevel; j++) preface += "
"; preface += '
\n';
      }

      if (logLineStart.value > 0) {
        preface += '' +
          gTxtConverter.scanTXT(lines[i].substr(0, logLineStart.value), convFlags) +
          '';
      }
      else if (lines[i] == "-- ") {
        preface += '
'; isSignature = true; } lines[i] = preface + gTxtConverter.scanTXT(lines[i].substr(logLineStart.value), convFlags); } var r = '
' + lines.join("\n") + (isSignature ? '
' : '') + '
'; //EnigmailLog.DEBUG("funcs.jsm: r='"+r+"'\n"); return r; }, /** * extract the data fields following a header. * e.g. ContentType: xyz; Aa=b; cc=d * @data: |string| containing a single header * * @return |array| of |arrays| containing pairs of aa/b and cc/d */ getHeaderData: function(data) { EnigmailLog.DEBUG("funcs.jsm: getHeaderData: " + data.substr(0, 100) + "\n"); var a = data.split(/\n/); var res = []; for (let i = 0; i < a.length; i++) { if (a[i].length === 0) break; let b = a[i].split(/;/); // extract "abc = xyz" tuples for (let j = 0; j < b.length; j++) { let m = b[j].match(/^(\s*)([^=\s;]+)(\s*)(=)(\s*)(.*)(\s*)$/); if (m) { // m[2]: identifier / m[6]: data res[m[2].toLowerCase()] = m[6].replace(/\s*$/, ""); EnigmailLog.DEBUG("funcs.jsm: getHeaderData: " + m[2].toLowerCase() + " = " + res[m[2].toLowerCase()] + "\n"); } } if (i === 0 && a[i].indexOf(";") < 0) break; if (i > 0 && a[i].search(/^\s/) < 0) break; } return res; }, /*** * Get the text for the encrypted subject (either configured by user or default) */ getProtectedSubjectText: function() { if (EnigmailPrefs.getPref("protectedSubjectText").length > 0) { return EnigmailData.convertToUnicode(EnigmailPrefs.getPref("protectedSubjectText"), "utf-8"); } else { return EnigmailLocale.getString("msgCompose.encryptedSubjectStub"); } }, cloneObj: function(orig) { let newObj; if (typeof orig !== "object" || orig === null || orig === undefined) { return orig; } if ("clone" in orig && typeof orig.clone === "function") { return orig.clone(); } if (Array.isArray(orig) && orig.length > 0) { newObj = []; for (let i in orig) { if (typeof orig[i] === "object") { newObj.push(this.cloneObj(orig[i])); } else { newObj.push(orig[i]); } } } else { newObj = {}; for (let i in orig) { if (typeof orig[i] === "object") { newObj[i] = this.cloneObj(orig[i]); } else newObj[i] = orig[i]; } } return newObj; }, /** * Compare two MIME part numbers to determine which of the two is earlier in the tree * MIME part numbers have the structure "x.y.z...", e.g 1, 1.2, 2.3.1.4.5.1.2 * * @param mime1, mime2 - String the two mime part numbers to compare. * * @return Number (one of -2, -1, 0, 1 , 2) * - Negative number if mime1 is before mime2 * - Positive number if mime1 is after mime2 * - 0 if mime1 and mime2 are equal * - if mime1 is a parent of mime2 the return value is -2 * - if mime2 is a parent of mime1 the return value is 2 * * Throws an error if mime1 or mime2 do not comply to the required format */ compareMimePartLevel: function(mime1, mime2) { let s = new RegExp("^[0-9]+(\\.[0-9]+)*$"); if (mime1.search(s) < 0) throw "Invalid mime1"; if (mime2.search(s) < 0) throw "Invalid mime2"; let a1 = mime1.split(/\./); let a2 = mime2.split(/\./); for (let i = 0; i < Math.min(a1.length, a2.length); i++) { if (Number(a1[i]) < Number(a2[i])) return -1; if (Number(a1[i]) > Number(a2[i])) return 1; } if (a2.length > a1.length) return -2; if (a2.length < a1.length) return 2; return 0; }, /** * Get the nsIMsgAccount associated with a given nsIMsgIdentity */ getAccountForIdentity: function(identity) { let accountManager = Cc["@mozilla.org/messenger/account-manager;1"].getService(Ci.nsIMsgAccountManager); for (let acct = 0; acct < accountManager.accounts.length; acct++) { let ac = accountManager.accounts.queryElementAt(acct, Ci.nsIMsgAccount); for (let i = 0; i < ac.identities.length; i++) { let id = ac.identities.queryElementAt(i, Ci.nsIMsgIdentity); if (id.key === identity.key) { return ac; } } } return null; } }; enigmail-2.0.8/package/glodaMime.jsm000066400000000000000000000020601334302754500173160ustar00rootroot00000000000000/*global Components: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ /* This module is a shim module to make it easier to load the Gloda EnigmailMime utilities from the various potential sources */ "use strict"; var EXPORTED_SYMBOLS = ["msgHdrToMimeMessage", "MimeMessage", "MimeContainer", "MimeBody", "MimeUnknown", "MimeMessageAttachment" ]; const Cu = Components.utils; /*global MsgHdrToMimeMessage: false */ try { // TB with omnijar Cu.import("resource:///modules/gloda/mimemsg.js"); } catch (ex) { // "old style" TB Cu.import("resource://app/modules/gloda/mimemsg.js"); } // The original naming is inconsistent with JS standards for classes vs functions // Thus we rename it here. const msgHdrToMimeMessage = MsgHdrToMimeMessage; // We don't need to explicitly create the other variables, since they will be // imported into the current namespace anyway enigmail-2.0.8/package/glodaUtils.jsm000066400000000000000000000013731334302754500175350ustar00rootroot00000000000000/*global Components: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ /* This module is a shim module to make it easier to load GlodaUtils from the various potential sources */ "use strict"; var EXPORTED_SYMBOLS = ["GlodaUtils"]; const Cu = Components.utils; try { // TB with omnijar Cu.import("resource:///modules/gloda/utils.js"); } catch (ex) { // "old style" TB Cu.import("resource://app/modules/gloda/utils.js"); } // We don't define the exported symbol here - that is on purpose // The goal of this module is simply to simplify loading of the component enigmail-2.0.8/package/gpg.jsm000066400000000000000000000301661334302754500162050ustar00rootroot00000000000000/*global Components: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; const EXPORTED_SYMBOLS = ["EnigmailGpg"]; const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; Cu.import("resource://enigmail/files.jsm"); /*global EnigmailFiles: false */ Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ Cu.import("resource://enigmail/locale.jsm"); /*global EnigmailLocale: false */ Cu.import("resource://enigmail/dialog.jsm"); /*global EnigmailDialog: false */ Cu.import("resource://enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ Cu.import("resource://enigmail/execution.jsm"); /*global EnigmailExecution: false */ Cu.import("resource://enigmail/subprocess.jsm"); /*global subprocess: false */ Cu.import("resource://enigmail/core.jsm"); /*global EnigmailCore: false */ Cu.import("resource://enigmail/os.jsm"); /*global EnigmailOS: false */ Cu.import("resource://enigmail/versioning.jsm"); /*global EnigmailVersioning: false */ Cu.import("resource://enigmail/lazy.jsm"); /*global EnigmailLazy: false */ const getGpgAgent = EnigmailLazy.loader("enigmail/gpgAgent.jsm", "EnigmailGpgAgent"); const getDialog = EnigmailLazy.loader("enigmail/dialog.jsm", "EnigmailDialog"); const MINIMUM_GPG_VERSION = "2.0.14"; const GPG_BATCH_OPT_LIST = ["--batch", "--no-tty", "--no-verbose", "--status-fd", "2"]; function pushTrimmedStr(arr, str, splitStr) { // Helper function for pushing a string without leading/trailing spaces // to an array str = str.replace(/^ */, "").replace(/ *$/, ""); if (str.length > 0) { if (splitStr) { const tmpArr = str.split(/[\t ]+/); for (let i = 0; i < tmpArr.length; i++) { arr.push(tmpArr[i]); } } else { arr.push(str); } } return (str.length > 0); } function getDirmngrTorStatus(exitCodeObj) { const command = getGpgAgent().resolveToolPath("gpg-connect-agent"); if (command === null) { return null; } const args = ["--dirmngr"]; EnigmailLog.CONSOLE("enigmail> " + EnigmailFiles.formatCmdLine(command, args) + "\n"); let stdout = ""; try { exitCodeObj.value = subprocess.call({ command: command, arguments: args, environment: EnigmailCore.getEnvList(), stdin: function(stdin) { stdin.write("GETINFO tor\r\n"); stdin.write("bye\r\n"); stdin.write("\r\n"); stdin.close(); }, stdout: function(data) { stdout += data; } }).wait(); } catch (ex) { exitCodeObj.value = -1; EnigmailLog.DEBUG("enigmail> DONE with FAILURE\n"); } return stdout; } function dirmngrConfiguredWithTor() { if (!EnigmailGpg.getGpgFeature("supports-dirmngr")) return false; const exitCodeObj = { value: null }; const output = getDirmngrTorStatus(exitCodeObj); if (output === null || exitCodeObj.value < 0) { return false; } return output.match(/Tor mode is enabled/) !== null; } var EnigmailGpg = { agentVersion: "", _agentPath: null, get agentPath() { return this._agentPath; }, setAgentPath: function(path) { this._agentPath = path; }, /** * return the minimum version of GnuPG that is supported by Enigmail */ getMinimumGpgVersion: function() { return MINIMUM_GPG_VERSION; }, /*** determine if a specific feature is available in the GnuPG version used @param featureName: String; one of the following values: version-supported - is the gpg version supported at all (true for gpg >= 2.0.10) supports-gpg-agent - is gpg-agent is auto-started (true for gpg >= 2.0.16) keygen-passphrase - can the passphrase be specified when generating keys (false for gpg 2.1 and 2.1.1) windows-photoid-bug - is there a bug in gpg with the output of photoid on Windows (true for gpg < 2.0.16) genkey-no-protection - is "%no-protection" supported for generting keys (true for gpg >= 2.1) search-keys-cmd - what command to use to terminate the --search-key operation. ("save" for gpg > 2.1; "quit" otherwise) socks-on-windows - is SOCKS proxy supported on Windows (true for gpg >= 2.0.20) supports-dirmngr - is dirmngr supported (true for gpg >= 2.1) supports-ecc-keys - are ECC (elliptic curve) keys supported (true for gpg >= 2.1) supports-sender - does gnupg understand the --sender argument (true for gpg >= 2.1.15) supports-wkd - does gpg support wkd (web key directory) (true for gpg >= 2.1.19) export-result - does gpg print EXPORTED when exporting keys (true for gpg >= 2.1.10) decryption-info - does gpg print DECRYPTION_INFO (true for gpg >= 2.0.19) @return: depending on featureName - Boolean unless specified differently: (true if feature is available / false otherwise) If the feature cannot be found, undefined is returned */ getGpgFeature: function(featureName) { let gpgVersion = EnigmailGpg.agentVersion; if (!gpgVersion || typeof(gpgVersion) != "string" || gpgVersion.length === 0) { return undefined; } gpgVersion = gpgVersion.replace(/-.*$/, ""); if (gpgVersion.search(/^\d+\.\d+/) < 0) { // not a valid version number return undefined; } switch (featureName) { case "version-supported": return EnigmailVersioning.greaterThanOrEqual(gpgVersion, MINIMUM_GPG_VERSION); case "supports-gpg-agent": return EnigmailVersioning.greaterThanOrEqual(gpgVersion, "2.0.16"); case "keygen-passphrase": return EnigmailVersioning.lessThan(gpgVersion, "2.1") || EnigmailVersioning.greaterThanOrEqual(gpgVersion, "2.1.2"); case "genkey-no-protection": return EnigmailVersioning.greaterThan(gpgVersion, "2.1"); case "windows-photoid-bug": return EnigmailVersioning.lessThan(gpgVersion, "2.0.16"); case "supports-dirmngr": return EnigmailVersioning.greaterThan(gpgVersion, "2.1"); case "supports-ecc-keys": return EnigmailVersioning.greaterThan(gpgVersion, "2.1"); case "socks-on-windows": return EnigmailVersioning.greaterThanOrEqual(gpgVersion, "2.0.20"); case "search-keys-cmd": // returns a string if (EnigmailVersioning.greaterThan(gpgVersion, "2.1")) { return "save"; } else return "quit"; case "supports-sender": return EnigmailVersioning.greaterThanOrEqual(gpgVersion, "2.1.15"); case "export-result": return EnigmailVersioning.greaterThanOrEqual(gpgVersion, "2.1.10"); case "decryption-info": return EnigmailVersioning.greaterThanOrEqual(gpgVersion, "2.0.19"); case "supports-wkd": return EnigmailVersioning.greaterThanOrEqual(gpgVersion, "2.1.19"); } return undefined; }, /** * get the standard arguments to pass to every GnuPG subprocess * * @withBatchOpts: Boolean - true: use --batch and some more options * false: don't use --batch and co. * * @return: Array of String - the list of arguments */ getStandardArgs: function(withBatchOpts) { // return the arguments to pass to every GnuPG subprocess let r = ["--charset", "utf-8", "--display-charset", "utf-8", "--no-auto-check-trustdb"]; // mandatory parameters to add in all cases try { let p = EnigmailPrefs.getPref("agentAdditionalParam").replace(/\\\\/g, "\\"); let i = 0; let last = 0; let foundSign = ""; let startQuote = -1; while ((i = p.substr(last).search(/['"]/)) >= 0) { if (startQuote == -1) { startQuote = i; foundSign = p.substr(last).charAt(i); last = i + 1; } else if (p.substr(last).charAt(i) == foundSign) { // found enquoted part if (startQuote > 1) pushTrimmedStr(r, p.substr(0, startQuote), true); pushTrimmedStr(r, p.substr(startQuote + 1, last + i - startQuote - 1), false); p = p.substr(last + i + 1); last = 0; startQuote = -1; foundSign = ""; } else { last = last + i + 1; } } pushTrimmedStr(r, p, true); } catch (ex) {} if (withBatchOpts) { r = r.concat(GPG_BATCH_OPT_LIST); } return r; }, // returns the output of --with-colons --list-config getGnupgConfig: function(exitCodeObj, errorMsgObj) { if (!EnigmailGpg.agentPath) { exitCodeObj.value = 0; return ""; } const args = EnigmailGpg.getStandardArgs(true). concat(["--fixed-list-mode", "--with-colons", "--list-config"]); const statusMsgObj = {}; const cmdErrorMsgObj = {}; const statusFlagsObj = {}; const listText = EnigmailExecution.execCmd(EnigmailGpg.agentPath, args, "", exitCodeObj, statusFlagsObj, statusMsgObj, cmdErrorMsgObj); if (exitCodeObj.value !== 0) { errorMsgObj.value = EnigmailLocale.getString("badCommand"); if (cmdErrorMsgObj.value) { errorMsgObj.value += "\n" + EnigmailFiles.formatCmdLine(EnigmailGpg.agentPath, args); errorMsgObj.value += "\n" + cmdErrorMsgObj.value; } return ""; } return listText.replace(/(\r\n|\r)/g, "\n"); }, /** * return an array containing the aliases and the email addresses * of groups defined in gpg.conf * * @return: array of objects with the following properties: * - alias: group name as used by GnuPG * - keylist: list of keys (any form that GnuPG accepts), separated by ";" * * (see docu for gnupg parameter --group) */ getGpgGroups: function() { const exitCodeObj = {}; const errorMsgObj = {}; const cfgStr = EnigmailGpg.getGnupgConfig(exitCodeObj, errorMsgObj); if (exitCodeObj.value !== 0) { getDialog().alert(errorMsgObj.value); return null; } const groups = []; const cfg = cfgStr.split(/\n/); for (let i = 0; i < cfg.length; i++) { if (cfg[i].indexOf("cfg:group") === 0) { const groupArr = cfg[i].split(/:/); groups.push({ alias: groupArr[2], keylist: groupArr[3] }); } } return groups; }, /** * Force GnuPG to recalculate the trust db. This is sometimes required after importing keys. * * no return value */ recalcTrustDb: function() { EnigmailLog.DEBUG("enigmailCommon.jsm: recalcTrustDb:\n"); const command = EnigmailGpg.agentPath; const args = EnigmailGpg.getStandardArgs(false). concat(["--check-trustdb"]); try { const proc = subprocess.call({ command: EnigmailGpg.agentPath, arguments: args, environment: EnigmailCore.getEnvList(), charset: null, mergeStderr: false }); proc.wait(); } catch (ex) { EnigmailLog.ERROR("enigmailCommon.jsm: recalcTrustDb: subprocess.call failed with '" + ex.toString() + "'\n"); throw ex; } }, signingAlgIdToString: function(id) { // RFC 4880 Sec. 9.1, RFC 6637 Sec. 5 and draft-koch-eddsa-for-openpgp-03 Sec. 8 switch (parseInt(id, 10)) { case 1: case 2: case 3: return "RSA"; case 16: return "Elgamal"; case 17: return "DSA"; case 18: return "ECDH"; case 19: return "ECDSA"; case 20: return "ELG"; case 22: return "EDDSA"; default: return EnigmailLocale.getString("unknownSigningAlg", [parseInt(id, 10)]); } }, hashAlgIdToString: function(id) { // RFC 4880 Sec. 9.4 switch (parseInt(id, 10)) { case 1: return "MD5"; case 2: return "SHA-1"; case 3: return "RIPE-MD/160"; case 8: return "SHA256"; case 9: return "SHA384"; case 10: return "SHA512"; case 11: return "SHA224"; default: return EnigmailLocale.getString("unknownHashAlg", [parseInt(id, 10)]); } }, /** * For versions of GPG 2.1 and higher, checks to see if the dirmngr is configured to use Tor * * @return Boolean - True if dirmngr is configured with Tor. False otherwise */ dirmngrConfiguredWithTor: dirmngrConfiguredWithTor }; enigmail-2.0.8/package/gpgAgent.jsm000066400000000000000000000571361334302754500171720ustar00rootroot00000000000000/*global Components: false, unescape: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailGpgAgent"]; const Cu = Components.utils; Cu.import("resource://gre/modules/ctypes.jsm"); /*global ctypes: false */ Cu.import("resource://enigmail/subprocess.jsm"); /*global subprocess: false */ Cu.import("resource://enigmail/core.jsm"); /*global EnigmailCore: false */ Cu.import("resource://enigmail/files.jsm"); /*global EnigmailFiles: false */ Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ Cu.import("resource://enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ Cu.import("resource://enigmail/os.jsm"); /*global EnigmailOS: false */ Cu.import("resource://enigmail/locale.jsm"); /*global EnigmailLocale: false */ Cu.import("resource://enigmail/windows.jsm"); /*global EnigmailWindows: false */ Cu.import("resource://enigmail/app.jsm"); /*global EnigmailApp: false */ Cu.import("resource://enigmail/execution.jsm"); /*global EnigmailExecution: false */ Cu.import("resource://enigmail/passwords.jsm"); /*global EnigmailPassword: false */ Cu.import("resource://enigmail/system.jsm"); /*global EnigmailSystem: false */ Cu.import("resource://enigmail/data.jsm"); /*global EnigmailData: false */ Cu.import("resource://enigmail/lazy.jsm"); /*global EnigmailLazy: false */ const getEnigmailGpg = EnigmailLazy.loader("enigmail/gpg.jsm", "EnigmailGpg"); const getDialog = EnigmailLazy.loader("enigmail/dialog.jsm", "EnigmailDialog"); const Cc = Components.classes; const Ci = Components.interfaces; const NS_LOCAL_FILE_CONTRACTID = "@mozilla.org/file/local;1"; const DIR_SERV_CONTRACTID = "@mozilla.org/file/directory_service;1"; const NS_LOCALFILEOUTPUTSTREAM_CONTRACTID = "@mozilla.org/network/file-output-stream;1"; const DEFAULT_FILE_PERMS = 0x180; // equals 0600 // Making this a var makes it possible to test windows things on linux var nsIWindowsRegKey = Ci.nsIWindowsRegKey; var gIsGpgAgent = -1; const DUMMY_AGENT_INFO = "none"; function cloneOrNull(v) { if (v && typeof v.clone === "function") { return v.clone(); } else { return v; } } function extractAgentInfo(fullStr) { if (fullStr) { return fullStr. replace(/[\r\n]/g, ""). replace(/^.*=/, ""). replace(/;.*$/, ""); } else { return ""; } } function getHomedirFromParam(param) { let i = param.search(/--homedir/); if (i >= 0) { param = param.substr(i + 9); let m = param.match(/^(\s*)([^\\]".+[^\\]")/); if (m && m.length > 2) { param = m[2].substr(1); let j = param.search(/[^\\]"/); return param.substr(1, j); } m = param.match(/^(\s*)([^\\]'.+[^\\]')/); if (m && m.length > 2) { param = m[2].substr(1); let j = param.search(/[^\\]'/); return param.substr(1, j); } m = param.match(/^(\s*)(\S+)/); if (m && m.length > 2) { return m[2]; } } return null; } var EnigmailGpgAgent = { agentType: "", agentPath: null, connGpgAgentPath: null, gpgconfPath: null, gpgAgentInfo: { preStarted: false, envStr: "" }, gpgAgentProcess: null, gpgAgentIsOptional: true, isDummy: function() { return EnigmailGpgAgent.gpgAgentInfo.envStr === DUMMY_AGENT_INFO; }, resetGpgAgent: function() { EnigmailLog.DEBUG("gpgAgent.jsm: resetGpgAgent\n"); gIsGpgAgent = -1; }, isCmdGpgAgent: function(pid) { EnigmailLog.DEBUG("gpgAgent.jsm: isCmdGpgAgent:\n"); const environment = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment); let ret = false; let path = environment.get("PATH"); if (!path || path.length === 0) { path = "/bin:/usr/bin:/usr/local/bin"; } const psCmd = EnigmailFiles.resolvePath("ps", path, false); let outStr = ""; const proc = { command: psCmd, arguments: ["-o", "comm", "-p", pid], environment: EnigmailCore.getEnvList(), charset: null, stdout: function(data) { outStr += data; } }; try { subprocess.call(proc).wait(); EnigmailLog.DEBUG("gpgAgent.jsm: isCmdGpgAgent: got data: '" + outStr + "'\n"); var data = outStr.replace(/[\r\n]/g, " "); if (data.search(/gpg-agent/) >= 0) { ret = true; } } catch (ex) {} return ret; }, isAgentTypeGpgAgent: function() { // determine if the used agent is a gpg-agent EnigmailLog.DEBUG("gpgAgent.jsm: isAgentTypeGpgAgent:\n"); // to my knowledge there is no other agent than gpg-agent on Windows if (EnigmailOS.getOS() == "WINNT") return true; if (gIsGpgAgent >= 0) { return gIsGpgAgent == 1; } let pid = -1; let exitCode = -1; let outStr = ""; if (!EnigmailCore.getService()) return false; const proc = { command: EnigmailGpgAgent.connGpgAgentPath, arguments: [], charset: null, environment: EnigmailCore.getEnvList(), stdin: function(pipe) { pipe.write("/subst\n"); pipe.write("/serverpid\n"); pipe.write("/echo pid: ${get serverpid}\n"); pipe.write("/bye\n"); pipe.close(); }, stdout: function(data) { outStr += data; } }; try { exitCode = subprocess.call(proc).wait(); if (exitCode) pid = -2; const data = outStr.replace(/[\r\n]/g, ""); if (data.search(/^pid: [0-9]+$/) === 0) { pid = data.replace(/^pid: /, ""); } } catch (ex) {} EnigmailLog.DEBUG("gpgAgent.jsm: isAgentTypeGpgAgent: pid=" + pid + "\n"); EnigmailGpgAgent.isCmdGpgAgent(pid); let isAgent = false; try { isAgent = EnigmailGpgAgent.isCmdGpgAgent(pid); gIsGpgAgent = isAgent ? 1 : 0; } catch (ex) {} return isAgent; }, getAgentMaxIdle: function() { EnigmailLog.DEBUG("gpgAgent.jsm: getAgentMaxIdle:\n"); let maxIdle = -1; if (!EnigmailCore.getService()) return maxIdle; const DEFAULT = 7; const CFGVALUE = 9; let outStr = ""; const proc = { command: EnigmailGpgAgent.gpgconfPath, arguments: ["--list-options", "gpg-agent"], charset: null, environment: EnigmailCore.getEnvList(), stdout: function(data) { outStr += data; } }; subprocess.call(proc).wait(); const lines = outStr.split(/[\r\n]/); for (let i = 0; i < lines.length; i++) { EnigmailLog.DEBUG("gpgAgent.jsm: getAgentMaxIdle: line: " + lines[i] + "\n"); if (lines[i].search(/^default-cache-ttl:/) === 0) { const m = lines[i].split(/:/); if (m[CFGVALUE].length === 0) { maxIdle = Math.round(m[DEFAULT] / 60); } else { maxIdle = Math.round(m[CFGVALUE] / 60); } break; } } return maxIdle; }, setAgentMaxIdle: function(idleMinutes) { EnigmailLog.DEBUG("gpgAgent.jsm: setAgentMaxIdle:\n"); if (!EnigmailCore.getService()) return; const RUNTIME = 8; const proc = { command: EnigmailGpgAgent.gpgconfPath, arguments: ["--runtime", "--change-options", "gpg-agent"], environment: EnigmailCore.getEnvList(), charset: null, mergeStderr: true, stdin: function(pipe) { pipe.write("default-cache-ttl:" + RUNTIME + ":" + (idleMinutes * 60) + "\n"); pipe.write("max-cache-ttl:" + RUNTIME + ":" + (idleMinutes * 600) + "\n"); pipe.close(); }, stdout: function(data) { EnigmailLog.DEBUG("gpgAgent.jsm: setAgentMaxIdle.stdout: " + data + "\n"); } }; try { let exitCode = subprocess.call(proc); EnigmailLog.DEBUG("gpgAgent.jsm: setAgentMaxIdle.stdout: gpgconf exitCode=" + exitCode + "\n"); } catch (ex) { EnigmailLog.DEBUG("gpgAgent.jsm: setAgentMaxIdle: exception: " + ex.toString() + "\n"); } }, getMaxIdlePref: function(win) { let maxIdle = EnigmailPrefs.getPref("maxIdleMinutes"); try { if (EnigmailCore.getService(win)) { if (EnigmailGpgAgent.gpgconfPath && EnigmailGpgAgent.connGpgAgentPath) { if (EnigmailGpgAgent.isAgentTypeGpgAgent()) { const m = EnigmailGpgAgent.getAgentMaxIdle(); if (m > -1) maxIdle = m; } } } } catch (ex) {} return maxIdle; }, setMaxIdlePref: function(minutes) { EnigmailPrefs.setPref("maxIdleMinutes", minutes); if (EnigmailGpgAgent.isAgentTypeGpgAgent()) { try { EnigmailGpgAgent.setAgentMaxIdle(minutes); } catch (ex) {} } }, /** * Determine the "gpg home dir", i.e. the directory where gpg.conf and the keyring are * stored using the "additional parameter" and gpgconf. * * @return String - directory name, or NULL (in case the command did not succeed) */ getGpgHomeDir: function() { let param = EnigmailPrefs.getPref("agentAdditionalParam"); if (param) { let hd = getHomedirFromParam(param); if (hd) return hd; } if (EnigmailGpgAgent.gpgconfPath === null) return null; const command = EnigmailGpgAgent.gpgconfPath; let args = ["--list-dirs"]; let exitCode = -1; let outStr = ""; EnigmailLog.DEBUG("gpgAgent.jsm: getGpgHomeDir: calling subprocess with '" + command.path + "'\n"); EnigmailLog.CONSOLE("enigmail> " + EnigmailFiles.formatCmdLine(command, args) + "\n"); const proc = { command: command, arguments: args, environment: EnigmailCore.getEnvList(), charset: null, stdout: function(data) { outStr += data; }, mergeStderr: false }; try { exitCode = subprocess.call(proc).wait(); } catch (ex) { EnigmailLog.ERROR("gpgAgent.jsm: getGpgHomeDir: subprocess.call failed with '" + ex.toString() + "'\n"); EnigmailLog.DEBUG(" enigmail> DONE with FAILURE\n"); throw ex; } let m = outStr.match(/^(homedir:)(.*)$/mi); if (m && m.length > 2) { return EnigmailData.convertGpgToUnicode(unescape(m[2])); } return null; }, /** * @param domWindow: Object - parent window, may be NULL * @param esvc: Object - Enigmail service object * @param preferredPath: String - try to use specific path to locate gpg */ setAgentPath: function(domWindow, esvc, preferredPath) { EnigmailLog.DEBUG("gpgAgent.jsm: setAgentPath()\n"); let agentPath = ""; try { if (preferredPath) { agentPath = preferredPath; } else { agentPath = EnigmailPrefs.getPrefBranch().getCharPref("agentPath"); } } catch (ex) {} var agentType = "gpg"; var agentName = ""; EnigmailGpgAgent.resetGpgAgent(); if (agentPath) { // Locate GnuPG executable // Append default .exe extension for DOS-Like systems, if needed if (EnigmailOS.isDosLike && (agentPath.search(/\.\w+$/) < 0)) { agentPath += ".exe"; } try { let pathDir = Cc[NS_LOCAL_FILE_CONTRACTID].createInstance(Ci.nsIFile); if (!EnigmailFiles.isAbsolutePath(agentPath, EnigmailOS.isDosLike)) { // path relative to Mozilla installation dir const ds = Cc[DIR_SERV_CONTRACTID].getService(); const dsprops = ds.QueryInterface(Ci.nsIProperties); pathDir = dsprops.get("CurProcD", Ci.nsIFile); const dirs = agentPath.split(new RegExp(EnigmailOS.isDosLike ? "\\\\" : "/")); for (let i = 0; i < dirs.length; i++) { if (dirs[i] != ".") { pathDir.append(dirs[i]); } } pathDir.normalize(); } else { // absolute path EnigmailFiles.initPath(pathDir, agentPath); } if (!(pathDir.isFile() /* && pathDir.isExecutable()*/ )) { throw Components.results.NS_ERROR_FAILURE; } agentPath = pathDir.QueryInterface(Ci.nsIFile); } catch (ex) { esvc.initializationError = EnigmailLocale.getString("gpgNotFound", [agentPath]); EnigmailLog.ERROR("gpgAgent.jsm: initialize: Error - " + esvc.initializationError + "\n"); throw Components.results.NS_ERROR_FAILURE; } } else { agentPath = this.resolveGpgPath(esvc.environment); if (!agentPath) { esvc.initializationError = EnigmailLocale.getString("gpgNotInPath"); EnigmailLog.ERROR("gpgAgent.jsm: Error - " + esvc.initializationError + "\n"); throw Components.results.NS_ERROR_FAILURE; } } agentPath.normalize(); // replace a/../b with b EnigmailLog.CONSOLE("EnigmailAgentPath=" + EnigmailFiles.getFilePathDesc(agentPath) + "\n\n"); EnigmailGpgAgent.agentType = agentType; EnigmailGpgAgent.agentPath = agentPath; getEnigmailGpg().setAgentPath(agentPath); EnigmailExecution.agentType = agentType; const command = agentPath; let args = []; if (agentType == "gpg") { args = ["--batch", "--no-tty", "--charset", "utf-8", "--display-charset", "utf-8", "--version", "--version"]; } let exitCode = -1; let outStr = ""; let errStr = ""; EnigmailLog.DEBUG("gpgAgent.jsm: setAgentPath: calling subprocess with '" + command.path + "'\n"); EnigmailLog.CONSOLE("enigmail> " + EnigmailFiles.formatCmdLine(command, args) + "\n"); const proc = { command: command, arguments: args, environment: EnigmailCore.getEnvList(), charset: null, stdout: function(data) { outStr += data; }, stderr: function(data) { errStr += data; }, mergeStderr: false }; try { exitCode = subprocess.call(proc).wait(); } catch (ex) { EnigmailLog.ERROR("gpgAgent.jsm: setAgentPath: subprocess.call failed with '" + ex.toString() + "'\n"); EnigmailLog.DEBUG(" enigmail> DONE with FAILURE\n"); throw ex; } EnigmailLog.DEBUG(" enigmail> DONE\n"); outStr = EnigmailSystem.convertNativeToUnicode(outStr); if (exitCode !== 0) { EnigmailLog.ERROR("gpgAgent.jsm: setAgentPath: gpg failed with exitCode " + exitCode + " msg='" + outStr + " " + errStr + "'\n"); throw Components.results.NS_ERROR_FAILURE; } EnigmailLog.CONSOLE(outStr + "\n"); // detection for Gpg4Win wrapper if (outStr.search(/^gpgwrap.*;/) === 0) { const outLines = outStr.split(/[\n\r]+/); const firstLine = outLines[0]; outLines.splice(0, 1); outStr = outLines.join("\n"); agentPath = firstLine.replace(/^.*;[ \t]*/, ""); EnigmailLog.CONSOLE("gpg4win-gpgwrapper detected; EnigmailAgentPath=" + agentPath + "\n\n"); } const versionParts = outStr.replace(/[\r\n].*/g, "").replace(/ *\(gpg4win.*\)/i, "").split(/ /); const gpgVersion = versionParts[versionParts.length - 1]; EnigmailLog.DEBUG("gpgAgent.jsm: detected GnuPG version '" + gpgVersion + "'\n"); getEnigmailGpg().agentVersion = gpgVersion; if (!getEnigmailGpg().getGpgFeature("version-supported")) { if (!domWindow) { domWindow = EnigmailWindows.getBestParentWin(); } getDialog().alert(domWindow, EnigmailLocale.getString("oldGpgVersion20", [gpgVersion, getEnigmailGpg().getMinimumGpgVersion()])); throw Components.results.NS_ERROR_FAILURE; } EnigmailGpgAgent.gpgconfPath = EnigmailGpgAgent.resolveToolPath("gpgconf"); EnigmailGpgAgent.connGpgAgentPath = EnigmailGpgAgent.resolveToolPath("gpg-connect-agent"); EnigmailGpgAgent.checkGpgHomeDir(domWindow, esvc); EnigmailLog.DEBUG("gpgAgent.jsm: setAgentPath: gpgconf found: " + (EnigmailGpgAgent.gpgconfPath ? "yes" : "no") + "\n"); }, /** * Determine the location of the GnuPG executable * * @param env: Object: nsIEnvironment to use * * @return Object: nsIFile pointing to gpg, or NULL */ resolveGpgPath: function(env) { EnigmailLog.DEBUG("gpgAgent.jsm: resolveGpgPath()\n"); let agentName = ""; if (EnigmailOS.isDosLike) { agentName = "gpg2.exe;gpg.exe"; } else { agentName = "gpg2;gpg"; } // Resolve relative path using PATH environment variable const envPath = env.get("PATH"); let agentPath = EnigmailFiles.resolvePath(agentName, envPath, EnigmailOS.isDosLike); if (!agentPath && EnigmailOS.isDosLike) { // DOS-like systems: search for GPG in c:\gnupg, c:\gnupg\bin, d:\gnupg, d:\gnupg\bin let gpgPath = "c:\\gnupg;c:\\gnupg\\bin;d:\\gnupg;d:\\gnupg\\bin"; agentPath = EnigmailFiles.resolvePath(agentName, gpgPath, EnigmailOS.isDosLike); } if ((!agentPath) && EnigmailOS.isWin32) { // Look up in Windows Registry const installDir = ["Software\\GNU\\GNUPG", "Software\\GNUPG"]; try { for (let i = 0; i < installDir.length && !agentPath; i++) { let gpgPath = EnigmailOS.getWinRegistryString(installDir[i], "Install Directory", nsIWindowsRegKey.ROOT_KEY_LOCAL_MACHINE); agentPath = EnigmailFiles.resolvePath(agentName, gpgPath, EnigmailOS.isDosLike()); if (!agentPath) { gpgPath += "\\bin"; agentPath = EnigmailFiles.resolvePath(agentName, gpgPath, EnigmailOS.isDosLike()); } } } catch (ex) {} if (!agentPath) { // try to determine the default PATH from the registry after the installation // if we could not get any information from the registry try { let winPath = EnigmailOS.getWinRegistryString("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment", "Path", nsIWindowsRegKey.ROOT_KEY_LOCAL_MACHINE); agentPath = EnigmailFiles.resolvePath(agentName, winPath, EnigmailOS.isDosLike); } catch (ex) {} } if (!agentPath) { // default for gpg4win 3.0 let gpgPath = "C:\\Program Files\\GnuPG\\bin;C:\\Program Files (x86)\\GnuPG\\bin"; agentPath = EnigmailFiles.resolvePath(agentName, gpgPath, EnigmailOS.isDosLike); } } if (!agentPath && !EnigmailOS.isDosLike) { // Unix-like systems: check /usr/bin and /usr/local/bin let gpgPath = "/usr/bin:/usr/local/bin"; agentPath = EnigmailFiles.resolvePath(agentName, gpgPath, EnigmailOS.isDosLike); } if (!agentPath) { return null; } return agentPath.QueryInterface(Ci.nsIFile); }, // resolve the path for GnuPG helper tools resolveToolPath: function(fileName) { let filePath = cloneOrNull(EnigmailGpgAgent.agentPath); if (filePath) { // try to get the install directory of gpg/gpg2 executable filePath.normalize(); filePath = filePath.parent; } if (filePath) { filePath.append(EnigmailFiles.potentialWindowsExecutable(fileName)); if (filePath.exists()) { filePath.normalize(); return filePath; } } return EnigmailFiles.resolvePathWithEnv(fileName); }, detectGpgAgent: function(domWindow, esvc) { EnigmailLog.DEBUG("gpgAgent.jsm: detectGpgAgent\n"); var gpgAgentInfo = esvc.environment.get("GPG_AGENT_INFO"); if (gpgAgentInfo && gpgAgentInfo.length > 0) { EnigmailLog.DEBUG("gpgAgent.jsm: detectGpgAgent: GPG_AGENT_INFO variable available\n"); // env. variable suggests running gpg-agent EnigmailGpgAgent.gpgAgentInfo.preStarted = true; EnigmailGpgAgent.gpgAgentInfo.envStr = gpgAgentInfo; EnigmailGpgAgent.gpgAgentIsOptional = false; } else { EnigmailLog.DEBUG("gpgAgent.jsm: detectGpgAgent: no GPG_AGENT_INFO variable set\n"); EnigmailGpgAgent.gpgAgentInfo.preStarted = false; if (!getEnigmailGpg().getGpgFeature("supports-gpg-agent")) { esvc.initializationError = EnigmailLocale.getString("gpgAgent.noAutostart", getEnigmailGpg().agentVersion); EnigmailLog.ERROR("gpgAgent.jsm: Error - " + esvc.initializationError + "\n"); throw Components.results.NS_ERROR_FAILURE; } var command = null; var outStr = ""; var errorStr = ""; var exitCode = -1; EnigmailGpgAgent.gpgAgentIsOptional = false; EnigmailGpgAgent.gpgAgentInfo.envStr = DUMMY_AGENT_INFO; var envFile = Components.classes[NS_LOCAL_FILE_CONTRACTID].createInstance(Ci.nsIFile); EnigmailFiles.initPath(envFile, EnigmailGpgAgent.determineGpgHomeDir(esvc)); envFile.append("gpg-agent.conf"); if (!envFile.exists()) { EnigmailLog.DEBUG("gpgAgent.jsm: detectGpgAgent: writing gpg-agent.conf file\n"); let data = "default-cache-ttl " + (EnigmailPassword.getMaxIdleMinutes() * 60) + "\n"; data += "max-cache-ttl 999999\n"; try { var flags = 0x02 | 0x08 | 0x20; var fileOutStream = Cc[NS_LOCALFILEOUTPUTSTREAM_CONTRACTID].createInstance(Ci.nsIFileOutputStream); fileOutStream.init(envFile, flags, 384, 0); // 0600 fileOutStream.write(data, data.length); fileOutStream.flush(); fileOutStream.close(); } catch (ex) {} // ignore file write errors } } EnigmailLog.DEBUG("gpgAgent.jsm: detectGpgAgent: GPG_AGENT_INFO='" + EnigmailGpgAgent.gpgAgentInfo.envStr + "'\n"); }, /** * Determine the GnuPG home directory based on the same logic as GnuPG, but without involving * any external tool. * * @return String - the path to the gpg home directory */ determineGpgHomeDir: function(esvc) { let param = EnigmailPrefs.getPref("agentAdditionalParam"); if (param) { let hd = getHomedirFromParam(param); if (hd) return hd; } let homeDir = esvc.environment.get("GNUPGHOME"); if (!homeDir && EnigmailOS.isWin32) { homeDir = EnigmailOS.getWinRegistryString("Software\\GNU\\GNUPG", "HomeDir", nsIWindowsRegKey.ROOT_KEY_CURRENT_USER); if (!homeDir) { homeDir = esvc.environment.get("USERPROFILE") || esvc.environment.get("SystemRoot"); if (homeDir) homeDir += "\\Application Data\\GnuPG"; } if (!homeDir) homeDir = "C:\\gnupg"; } if (!homeDir) homeDir = esvc.environment.get("HOME") + "/.gnupg"; return homeDir; }, /** * Check if the users directory for GnuPG exists and is writeable. * Throw exception if directory cannot be created or adjusted. */ checkGpgHomeDir: function(domWindow, esvc) { EnigmailLog.DEBUG("gpgAgent.jsm: checkGpgHomeDir:\n"); let homeDir = EnigmailGpgAgent.getGpgHomeDir(); if (!homeDir) homeDir = EnigmailGpgAgent.determineGpgHomeDir(esvc); EnigmailLog.DEBUG("gpgAgent.jsm: checkGpgHomeDir: got homedir = '" + homeDir + "'\n"); let homeDirObj = Components.classes[NS_LOCAL_FILE_CONTRACTID].createInstance(Ci.nsIFile); EnigmailFiles.initPath(homeDirObj, homeDir); if (homeDirObj.exists()) { homeDirObj.normalize(); // resolve symlinks etc. } let dirType = EnigmailFiles.ensureWritableDirectory(homeDirObj, 0x1C0); // 0700 let errMsg = ""; switch (dirType) { case 1: errMsg = "gpghomedir.notexists"; break; case 2: errMsg = "gpghomedir.notwritable"; break; case 3: errMsg = "gpghomedir.notdirectory"; break; } if (errMsg.length > 0) { if (!domWindow) { domWindow = EnigmailWindows.getBestParentWin(); } getDialog().alert(domWindow, EnigmailLocale.getString(errMsg, homeDir) + "\n\n" + EnigmailLocale.getString("gpghomedir.notusable")); throw Components.results.NS_ERROR_FAILURE; } }, finalize: function() { if (EnigmailGpgAgent.gpgAgentProcess) { EnigmailLog.DEBUG("gpgAgent.jsm: EnigmailGpgAgent.finalize: stopping gpg-agent\n"); try { const proc = { command: EnigmailGpgAgent.connGpgAgentPath, arguments: ['killagent', '/bye'], environment: EnigmailCore.getEnvList() }; subprocess.call(proc).wait(); } catch (ex) { EnigmailLog.ERROR("gpgAgent.jsm: EnigmailGpgAgent.finalize ERROR: " + ex + "\n"); } } } }; enigmail-2.0.8/package/hash.jsm000066400000000000000000000103051334302754500163440ustar00rootroot00000000000000/*global Components: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailHash"]; const Cu = Components.utils; Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ Cu.import("resource://enigmail/windows.jsm"); /*global EnigmailWindows: false */ Cu.import("resource://enigmail/locale.jsm"); /*global EnigmailLocale: false */ Cu.import("resource://enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ Cu.import("resource://enigmail/encryption.jsm"); /*global EnigmailEncryption: false */ Cu.import("resource://enigmail/dialog.jsm"); /*global EnigmailDialog: false */ Cu.import("resource://enigmail/constants.jsm"); /*global EnigmailConstants: false */ const Ci = Components.interfaces; const keyAlgorithms = []; const mimeHashAlgorithms = [null, "sha1", "ripemd160", "sha256", "sha384", "sha512", "sha224", "md5"]; var EnigmailHash = { determineAlgorithm: function(win, uiFlags, fromMailAddr, hashAlgoObj) { EnigmailLog.DEBUG("hash.jsm: determineAlgorithm\n"); if (!win) { win = EnigmailWindows.getMostRecentWindow(); } const sendFlags = EnigmailConstants.SEND_TEST | EnigmailConstants.SEND_SIGNED; const hashAlgo = mimeHashAlgorithms[EnigmailPrefs.getPref("mimeHashAlgorithm")]; if (typeof(keyAlgorithms[fromMailAddr]) != "string") { // hash algorithm not yet known const testUiFlags = EnigmailConstants.UI_TEST; const listener = { stdoutData: "", stderrData: "", exitCode: -1, stdin: function(pipe) { pipe.write("Dummy Test"); pipe.close(); }, stdout: function(data) { this.stdoutData += data; }, stderr: function(data) { this.stderrData += data; }, done: function(exitCode) { this.exitCode = exitCode; } }; let errorMsgObj = {}; let statusFlagsObj = {}; const proc = EnigmailEncryption.encryptMessageStart(win, testUiFlags, fromMailAddr, "", "", hashAlgo, sendFlags, listener, statusFlagsObj, errorMsgObj); if (!proc) { hashAlgoObj.errorMsg = errorMsgObj.value; hashAlgoObj.statusFlags = statusFlagsObj.value; return 1; } proc.wait(); const msgText = listener.stdoutData; const exitCode = listener.exitCode; const retStatusObj = {}; let exitCode2 = EnigmailEncryption.encryptMessageEnd(fromMailAddr, listener.stderrData, exitCode, testUiFlags, sendFlags, 10, retStatusObj); if ((exitCode2 === 0) && !msgText) exitCode2 = 1; // if (exitCode2 > 0) exitCode2 = -exitCode2; if (exitCode2 !== 0) { // Abormal return if (retStatusObj.statusFlags & EnigmailConstants.BAD_PASSPHRASE) { // "Unremember" passphrase on error return retStatusObj.errorMsg = EnigmailLocale.getString("badPhrase"); } EnigmailDialog.alert(win, retStatusObj.errorMsg); return exitCode2; } let hashAlgorithm = "sha1"; // default as defined in RFC 4880, section 7 is MD5 -- but that's outdated const m = msgText.match(/^(Hash: )(.*)$/m); if (m && (m.length > 2) && (m[1] == "Hash: ")) { hashAlgorithm = m[2].toLowerCase(); } else { EnigmailLog.DEBUG("hash.jsm: determineAlgorithm: no hashAlgorithm specified - using MD5\n"); } for (let i = 1; i < mimeHashAlgorithms.length; i++) { if (mimeHashAlgorithms[i] === hashAlgorithm) { EnigmailLog.DEBUG("hash.jsm: determineAlgorithm: found hashAlgorithm " + hashAlgorithm + "\n"); keyAlgorithms[fromMailAddr] = hashAlgorithm; hashAlgoObj.value = hashAlgorithm; return 0; } } EnigmailLog.ERROR("hash.jsm: determineAlgorithm: no hashAlgorithm found\n"); return 2; } else { EnigmailLog.DEBUG("hash.jsm: determineAlgorithm: hashAlgorithm " + keyAlgorithms[fromMailAddr] + " is cached\n"); hashAlgoObj.value = keyAlgorithms[fromMailAddr]; } return 0; } }; enigmail-2.0.8/package/httpProxy.jsm000066400000000000000000000055721334302754500174540ustar00rootroot00000000000000/*global Components: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailHttpProxy"]; const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; Cu.import("resource://enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ const NS_PREFS_SERVICE_CID = "@mozilla.org/preferences-service;1"; function getPasswdForHost(hostname, userObj, passwdObj) { var loginmgr = Cc["@mozilla.org/login-manager;1"].getService(Ci.nsILoginManager); // search HTTP password 1st var logins = loginmgr.findLogins({}, "http://" + hostname, "", ""); if (logins.length > 0) { userObj.value = logins[0].username; passwdObj.value = logins[0].password; return true; } // look for any other password for same host logins = loginmgr.getAllLogins({}); for (var i = 0; i < logins.lenth; i++) { if (hostname == logins[i].hostname.replace(/^.*:\/\//, "")) { userObj.value = logins[i].username; passwdObj.value = logins[i].password; return true; } } return false; } var EnigmailHttpProxy = { /** * get Proxy for a given hostname as configured in Mozilla * * @hostname: String - the host to check if there is a proxy. * * @return: String - proxy host URL to provide to GnuPG * null if no proxy required */ getHttpProxy: function(hostName) { var proxyHost = null; if (((typeof hostName) !== 'undefined') && EnigmailPrefs.getPref("respectHttpProxy")) { // determine proxy host var prefsSvc = Cc[NS_PREFS_SERVICE_CID].getService(Ci.nsIPrefService); var prefRoot = prefsSvc.getBranch(null); var useProxy = prefRoot.getIntPref("network.proxy.type"); if (useProxy == 1) { var proxyHostName = prefRoot.getCharPref("network.proxy.http"); var proxyHostPort = prefRoot.getIntPref("network.proxy.http_port"); var noProxy = prefRoot.getCharPref("network.proxy.no_proxies_on").split(/[ ,]/); for (var i = 0; i < noProxy.length; i++) { var proxySearch = new RegExp(noProxy[i].replace(/\./g, "\\.").replace(/\*/g, ".*") + "$", "i"); if (noProxy[i] && hostName.search(proxySearch) >= 0) { i = noProxy.length + 1; proxyHostName = null; } } if (proxyHostName) { var userObj = {}; var passwdObj = {}; if (getPasswdForHost(proxyHostName, userObj, passwdObj)) { proxyHostName = userObj.value + ":" + passwdObj.value + "@" + proxyHostName; } } if (proxyHostName && proxyHostPort) { proxyHost = "http://" + proxyHostName + ":" + proxyHostPort; } } } return proxyHost; } }; enigmail-2.0.8/package/install.rdf000066400000000000000000000036211334302754500170540ustar00rootroot00000000000000 {847b3a00-7ab1-11d4-8f02-006008948af5} 2.0.8 2 true {3550f703-e582-4d05-9a08-453d09bdfdc6} 52.0 60.* {92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a} 2.46 2.57 Enigmail OpenPGP message encryption and authentication Enigmail Team https://www.enigmail.net/ chrome://enigmail/content/enigmailAbout.xul chrome://enigmail/content/pref-enigmail.xul chrome://enigmail/skin/enigmail-about.svg enigmail-2.0.8/package/installGnuPG.jsm000066400000000000000000000507511334302754500200010ustar00rootroot00000000000000/*global Components: false, escape: false, unescape: false, Uint8Array: false */ /* eslint no-invalid-this: 0 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["InstallGnuPG"]; /* Usage: InstallGnuPG.start(progressListener). progressListener needs to implement the following methods: void onError (errorMessage) boolean onWarning (message) void onProgress (event) void onLoaded (event) // fired when instllation complete void onDownloaded () // fired when download complete, before installation void onStart (requestObj) requestObj: abort(): cancel download onWarning can return true if the warning should be ignored, false otherwise */ var Cu = Components.utils; Cu.importGlobalProperties(["XMLHttpRequest"]); Cu.import("resource://gre/modules/XPCOMUtils.jsm"); /*global XPCOMUtils: false */ Cu.import("resource://enigmail/subprocess.jsm"); /*global subprocess: false */ Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ Cu.import("resource://enigmail/os.jsm"); /*global EnigmailOS: false */ Cu.import("resource://enigmail/app.jsm"); /*global EnigmailApp: false */ Cu.import("resource://gre/modules/PromiseUtils.jsm"); /* global PromiseUtils: false */ Cu.import("resource://enigmail/files.jsm"); /*global EnigmailFiles: false */ const Cc = Components.classes; const Ci = Components.interfaces; const EXEC_FILE_PERMS = 0x1C0; // 0700 const NS_LOCALFILEOUTPUTSTREAM_CONTRACTID = "@mozilla.org/network/file-output-stream;1"; const DIR_SERV_CONTRACTID = "@mozilla.org/file/directory_service;1"; const NS_LOCAL_FILE_CONTRACTID = "@mozilla.org/file/local;1"; const XPCOM_APPINFO = "@mozilla.org/xre/app-info;1"; const GPG_QUERY_URL = "https://www.enigmail.net/service/getGnupgDownload.svc"; function toHexString(charCode) { return ("0" + charCode.toString(16)).slice(-2); } function sanitizeFileName(str) { // remove shell escape, #, ! and / from string return str.replace(/[`/#!]/g, ""); } function sanitizeHash(str) { return str.replace(/[^a-hA-H0-9]/g, ""); } // Adapted from the patch for mozTCPSocket error reporting (bug 861196). function createTCPErrorFromFailedXHR(xhr) { let status = xhr.channel.QueryInterface(Ci.nsIRequest).status; let errType; let errName; if ((status & 0xff0000) === 0x5a0000) { // Security module const nsINSSErrorsService = Ci.nsINSSErrorsService; let nssErrorsService = Cc['@mozilla.org/nss_errors_service;1'].getService(nsINSSErrorsService); let errorClass; // getErrorClass will throw a generic NS_ERROR_FAILURE if the error code is // somehow not in the set of covered errors. try { errorClass = nssErrorsService.getErrorClass(status); } catch (ex) { errorClass = 'SecurityProtocol'; } if (errorClass == nsINSSErrorsService.ERROR_CLASS_BAD_CERT) { errType = 'SecurityCertificate'; } else { errType = 'SecurityProtocol'; } // NSS_SEC errors (happen below the base value because of negative vals) if ((status & 0xffff) < Math.abs(nsINSSErrorsService.NSS_SEC_ERROR_BASE)) { // The bases are actually negative, so in our positive numeric space, we // need to subtract the base off our value. let nssErr = Math.abs(nsINSSErrorsService.NSS_SEC_ERROR_BASE) - (status & 0xffff); switch (nssErr) { case 11: // SEC_ERROR_EXPIRED_CERTIFICATE, sec(11) errName = 'SecurityExpiredCertificateError'; break; case 12: // SEC_ERROR_REVOKED_CERTIFICATE, sec(12) errName = 'SecurityRevokedCertificateError'; break; // per bsmith, we will be unable to tell these errors apart very soon, // so it makes sense to just folder them all together already. case 13: // SEC_ERROR_UNKNOWN_ISSUER, sec(13) case 20: // SEC_ERROR_UNTRUSTED_ISSUER, sec(20) case 21: // SEC_ERROR_UNTRUSTED_CERT, sec(21) case 36: // SEC_ERROR_CA_CERT_INVALID, sec(36) errName = 'SecurityUntrustedCertificateIssuerError'; break; case 90: // SEC_ERROR_INADEQUATE_KEY_USAGE, sec(90) errName = 'SecurityInadequateKeyUsageError'; break; case 176: // SEC_ERROR_CERT_SIGNATURE_ALGORITHM_DISABLED, sec(176) errName = 'SecurityCertificateSignatureAlgorithmDisabledError'; break; default: errName = 'SecurityError'; break; } } else { let sslErr = Math.abs(nsINSSErrorsService.NSS_SSL_ERROR_BASE) - (status & 0xffff); switch (sslErr) { case 3: // SSL_ERROR_NO_CERTIFICATE, ssl(3) errName = 'SecurityNoCertificateError'; break; case 4: // SSL_ERROR_BAD_CERTIFICATE, ssl(4) errName = 'SecurityBadCertificateError'; break; case 8: // SSL_ERROR_UNSUPPORTED_CERTIFICATE_TYPE, ssl(8) errName = 'SecurityUnsupportedCertificateTypeError'; break; case 9: // SSL_ERROR_UNSUPPORTED_VERSION, ssl(9) errName = 'SecurityUnsupportedTLSVersionError'; break; case 12: // SSL_ERROR_BAD_CERT_DOMAIN, ssl(12) errName = 'SecurityCertificateDomainMismatchError'; break; default: errName = 'SecurityError'; break; } } } else { errType = 'Network'; switch (status) { // connect to host:port failed case 0x804B000C: // NS_ERROR_CONNECTION_REFUSED, network(13) errName = 'ConnectionRefusedError'; break; // network timeout error case 0x804B000E: // NS_ERROR_NET_TIMEOUT, network(14) errName = 'NetworkTimeoutError'; break; // hostname lookup failed case 0x804B001E: // NS_ERROR_UNKNOWN_HOST, network(30) errName = 'DomainNotFoundError'; break; case 0x804B0047: // NS_ERROR_NET_INTERRUPT, network(71) errName = 'NetworkInterruptError'; break; default: errName = 'NetworkError'; break; } } return { name: errName, type: errType }; } function Installer(progressListener) { this.progressListener = progressListener; } Installer.prototype = { installMacOs: function(deferred) { EnigmailLog.DEBUG("installGnuPG.jsm: installMacOs\n"); var exitCode = -1; var mountPath = Cc[NS_LOCAL_FILE_CONTRACTID].createInstance(Ci.nsIFile); mountPath.initWithPath("/Volumes/" + this.mount); if (mountPath.exists()) { let p = mountPath.path + " "; let i = 1; mountPath.initWithPath(p + i); while (mountPath.exists() && i < 10) { ++i; mountPath.initWithPath(p + i); } if (mountPath.exists()) { throw "Error - cannot mount package"; } } this.mountPath = mountPath; EnigmailLog.DEBUG("installGnuPG.jsm: installMacOs - mount Package\n"); var cmd = Cc[NS_LOCAL_FILE_CONTRACTID].createInstance(Ci.nsIFile); cmd.initWithPath("/usr/bin/open"); var args = ["-W", this.installerFile.path]; var proc = { command: cmd, arguments: args, charset: null, done: function(result) { exitCode = result.exitCode; } }; try { subprocess.call(proc).wait(); if (exitCode) throw "Installer failed with exit code " + exitCode; } catch (ex) { EnigmailLog.ERROR("installGnuPG.jsm: installMacOs: subprocess.call failed with '" + ex.toString() + "'\n"); throw ex; } EnigmailLog.DEBUG("installGnuPG.jsm: installMacOs - run installer\n"); args = ["-W", this.mountPath.path + "/" + this.command]; proc = { command: cmd, arguments: args, charset: null, done: function(result) { if (result.exitCode !== 0) { deferred.reject("Installer failed with exit code " + result.exitCode); } else deferred.resolve(); } }; try { subprocess.call(proc); } catch (ex) { EnigmailLog.ERROR("installGnuPG.jsm: installMacOs: subprocess.call failed with '" + ex.toString() + "'\n"); throw ex; } }, cleanupMacOs: function() { EnigmailLog.DEBUG("installGnuPG.jsm.cleanupMacOs: unmount package\n"); var cmd = Cc[NS_LOCAL_FILE_CONTRACTID].createInstance(Ci.nsIFile); cmd.initWithPath("/usr/sbin/diskutil"); var args = ["eject", this.mountPath.path]; var proc = { command: cmd, arguments: args, charset: null, done: function(result) { if (result.exitCode) EnigmailLog.ERROR("Installer failed with exit code " + result.exitCode); } }; try { subprocess.call(proc).wait(); } catch (ex) { EnigmailLog.ERROR("installGnuPG.jsm.cleanupMacOs: subprocess.call failed with '" + ex.toString() + "'\n"); } EnigmailLog.DEBUG("installGnuPG.jsm: cleanupMacOs - remove package\n"); this.installerFile.remove(false); }, /** * Create the gpg4win installer config file * @return nsIFile - config object file */ createGpg4WinCfgFile: function() { EnigmailLog.DEBUG("installGnuPG.jsm: createGpg4WinCfgFile\n"); let tmpFile = EnigmailFiles.getTempDirObj().clone(); tmpFile.append("gpg4win.ini"); tmpFile.createUnique(tmpFile.NORMAL_FILE_TYPE, EXEC_FILE_PERMS); let dataStr = "[gpg4win]\r\n"; let cfgKeys = [ "inst_gpgol", "inst_gpgex", "inst_kleopatra", "inst_gpa", "inst_claws_mail", "inst_compendium", "inst_desktop", "inst_quick_launch_bar" ]; // disable optional components by default for (let i of cfgKeys) { dataStr += " " + i + " = false\r\n"; } dataStr += " inst_start_menu = true\r\n"; if (EnigmailFiles.writeFileContents(tmpFile, dataStr)) { return tmpFile; } return null; }, installWindows: function(deferred) { EnigmailLog.DEBUG("installGnuPG.jsm: installWindows\n"); try { // use runwAsync in order to get UAC approval on Windows 7 / 8 if required var obs = { QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver]), observe: function(proc, aTopic, aData) { EnigmailLog.DEBUG("installGnuPG.jsm: installWindows.observe: topic='" + aTopic + "' \n"); if (aTopic == "process-finished") { EnigmailLog.DEBUG("installGnuPG.jsm: installWindows finished\n"); deferred.resolve(); } else if (aTopic == "process-failed") { deferred.reject("Installer could not be started"); } } }; this.gpg4WinCfgFile = this.createGpg4WinCfgFile(); let cfgFile = EnigmailFiles.getFilePath(this.gpg4WinCfgFile); let params = []; if (cfgFile) { if (cfgFile.indexOf('"') >= 0) cfgFile = '"' + cfgFile + '"'; params.push('/C=' + cfgFile); } EnigmailLog.DEBUG("installGnuPG.jsm: installWindows: executing " + this.installerFile.path + " " + params.join(" ") + "\n"); var proc = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess); proc.init(this.installerFile); proc.runwAsync(params, params.length, obs, false); } catch (ex) { deferred.reject("Installer could not be started"); } }, cleanupWindows: function() { EnigmailLog.DEBUG("installGnuPG.jsm: cleanupWindows - remove package\n"); this.installerFile.remove(false); if (this.gpg4WinCfgFile) this.gpg4WinCfgFile.remove(false); }, installUnix: function() {}, /** * Chech the SHA256 hash sum of this.installerFile */ checkHashSum: function() { EnigmailLog.DEBUG("installGnuPG.jsm: checkHashSum\n"); var istream = Components.classes["@mozilla.org/network/file-input-stream;1"] .createInstance(Components.interfaces.nsIFileInputStream); // open for reading istream.init(this.installerFile, 0x01, 292, 0); // octal 0444 - octal literals are deprecated var ch = Components.classes["@mozilla.org/security/hash;1"] .createInstance(Components.interfaces.nsICryptoHash); ch.init(ch.SHA256); const PR_UINT32_MAX = 0xffffffff; // read entire file ch.updateFromStream(istream, PR_UINT32_MAX); var gotHash = ch.finish(false); // convert the binary hash data to a hex string. var hashStr = ""; for (let i in gotHash) { hashStr += toHexString(gotHash.charCodeAt(i)); } if (this.hash != hashStr) { EnigmailLog.DEBUG("installGnuPG.jsm: checkHashSum - hash sums don't match: " + hashStr + "\n"); } else EnigmailLog.DEBUG("installGnuPG.jsm: checkHashSum - hash sum OK\n"); return this.hash == hashStr; }, getDownloadUrl: function(on) { let deferred = PromiseUtils.defer(); function reqListener() { // "this" is set by the calling XMLHttpRequest if (typeof(this.responseXML) == "object") { EnigmailLog.DEBUG("installGnuPG.jsm: getDownloadUrl.reqListener: got: " + this.responseText + "\n"); if (!this.responseText) { onError({ type: "Network" }); return; } if (typeof(this.responseText) == "string") { EnigmailLog.DEBUG("installPep.jsm: getDownloadUrl.reqListener: got: " + this.responseText + "\n"); try { let doc = JSON.parse(this.responseText); self.url = doc.url; self.hash = sanitizeHash(doc.hash); self.command = doc.command; self.mount = sanitizeFileName(doc.mountPath); deferred.resolve(); } catch (ex) { EnigmailLog.DEBUG("installPep.jsm: getDownloadUrl.reqListener: exception: " + ex.toString() + "\n"); onError({ type: "Network" }); } } } } function onError(error) { deferred.reject("error"); if (self.progressListener) { return self.progressListener.onError(error); } return false; } EnigmailLog.DEBUG("installGnuPG.jsm: getDownloadUrl: start request\n"); let queryUrl = GPG_QUERY_URL; // if ENIGMAIL_GPG_DOWNLOAD_URL env variable is set, use that instead of the // official URL (for testing) let env = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment); if (env.get("ENIGMAIL_GPG_DOWNLOAD_URL")) { queryUrl = env.get("ENIGMAIL_GPG_DOWNLOAD_URL"); } var self = this; try { var xulRuntime = Cc[XPCOM_APPINFO].getService(Ci.nsIXULRuntime); var platform = xulRuntime.XPCOMABI.toLowerCase(); var os = EnigmailOS.getOS().toLowerCase(); var oReq = new XMLHttpRequest(); oReq.onload = reqListener; oReq.addEventListener("error", function(e) { var error = createTCPErrorFromFailedXHR(oReq); onError(error); }, false); oReq.open("get", queryUrl + "?vEnigmail=" + escape(EnigmailApp.getVersion()) + "&os=" + escape(os) + "&platform=" + escape(platform), true); oReq.send(); } catch (ex) { deferred.reject(ex); EnigmailLog.writeException("installGnuPG.jsm", ex); if (self.progressListener) self.progressListener.onError("installGnuPG.downloadFailed"); } return deferred.promise; }, performDownload: function() { EnigmailLog.DEBUG("installGnuPG.jsm: performDownload: " + this.url + "\n"); var self = this; var deferred = PromiseUtils.defer(); function onProgress(event) { if (event.lengthComputable) { var percentComplete = event.loaded / event.total; EnigmailLog.DEBUG("installGnuPG.jsm: performDownload: " + percentComplete * 100 + "% loaded\n"); } else { EnigmailLog.DEBUG("installGnuPG.jsm: performDownload: got " + event.loaded + "bytes\n"); } if (self.progressListener) self.progressListener.onProgress(event); } function onError(error) { deferred.reject("error"); if (self.progressListener) self.progressListener.onError(error); } function onLoaded(event) { EnigmailLog.DEBUG("installGnuPG.jsm: performDownload: downloaded " + event.loaded + "bytes\n"); if (self.progressListener) self.progressListener.onDownloaded(); try { // "this" is set by the calling XMLHttpRequest performInstall(this.response).then(function _f() { performCleanup(); }); } catch (ex) { EnigmailLog.writeException("installGnuPG.jsm", ex); if (self.progressListener) self.progressListener.onError("installGnuPG.installFailed"); } } function performInstall(response) { var arraybuffer = response; // not responseText EnigmailLog.DEBUG("installGnuPG.jsm: performDownload: bytes " + arraybuffer.byteLength + "\n"); try { var flags = 0x02 | 0x08 | 0x20; var fileOutStream = Cc[NS_LOCALFILEOUTPUTSTREAM_CONTRACTID].createInstance(Ci.nsIFileOutputStream); self.installerFile = EnigmailFiles.getTempDirObj().clone(); switch (EnigmailOS.getOS()) { case "Darwin": self.installerFile.append("GnuPG-Installer.dmg"); self.performCleanup = self.cleanupMacOs; break; case "WINNT": self.installerFile.append("gpg4win.exe"); self.performCleanup = self.cleanupWindows; break; default: self.installerFile.append("gpg-installer.bin"); self.performCleanup = null; } self.installerFile.createUnique(self.installerFile.NORMAL_FILE_TYPE, EXEC_FILE_PERMS); EnigmailLog.DEBUG("installGnuPG.jsm: performDownload: writing file to " + self.installerFile.path + "\n"); fileOutStream.init(self.installerFile, flags, EXEC_FILE_PERMS, 0); var binStr = Cc["@mozilla.org/binaryoutputstream;1"].createInstance(Ci.nsIBinaryOutputStream); binStr.setOutputStream(fileOutStream.QueryInterface(Ci.nsIOutputStream)); var buf = new Uint8Array(arraybuffer); binStr.writeByteArray(buf, buf.length); binStr.flush(); binStr.close(); fileOutStream.close(); if (!self.checkHashSum()) { var cont = true; if (self.progressListener) { cont = self.progressListener.onWarning("hashSumMismatch"); } if (!cont) { deferred.reject("Aborted due to hash sum error"); return null; } } switch (EnigmailOS.getOS()) { case "Darwin": self.installMacOs(deferred); break; case "WINNT": self.installWindows(deferred); break; default: self.installUnix(deferred); } } catch (ex) { deferred.reject(ex); EnigmailLog.writeException("installGnuPG.jsm", ex); if (self.progressListener) self.progressListener.onError("installGnuPG.installFailed"); } return deferred.promise; } function performCleanup() { EnigmailLog.DEBUG("installGnuPG.jsm: performCleanup:\n"); try { if (self.performCleanup) self.performCleanup(); } catch (ex) {} if (self.progressListener) { EnigmailLog.DEBUG("installGnuPG.jsm: performCleanup - onLoaded()\n"); self.progressListener.onLoaded(); } } try { // create a XMLHttpRequest object var oReq = new XMLHttpRequest(); oReq.addEventListener("load", onLoaded, false); oReq.addEventListener("error", function(e) { var error = createTCPErrorFromFailedXHR(oReq); onError(error); }, false); oReq.addEventListener("progress", onProgress, false); oReq.open("get", this.url, true); oReq.responseType = "arraybuffer"; if (self.progressListener) self.progressListener.onStart({ abort: function() { oReq.abort(); } }); oReq.send(); } catch (ex) { deferred.reject(ex); EnigmailLog.writeException("installGnuPG.jsm", ex); if (self.progressListener) self.progressListener.onError("installGnuPG.downloadFailed"); } } }; var InstallGnuPG = { // check if there is a downloadable item for the given platform // returns true if item available checkAvailability: function() { switch (EnigmailOS.getOS()) { case "Darwin": case "WINNT": return true; } return false; }, startInstaller: function(progressListener) { var i = new Installer(progressListener); i.getDownloadUrl(i). then(function _dl() { i.performDownload(); }); return i; } }; enigmail-2.0.8/package/installPep.jsm000066400000000000000000000450671334302754500175510ustar00rootroot00000000000000/*global Components: false, escape: false, unescape: false, Uint8Array: false */ /* eslint no-invalid-this: 0 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailInstallPep"]; const Cu = Components.utils; const Cc = Components.classes; const Ci = Components.interfaces; Cu.importGlobalProperties(["XMLHttpRequest"]); Cu.import("resource://gre/modules/XPCOMUtils.jsm"); /*global XPCOMUtils: false */ Cu.import("resource://enigmail/subprocess.jsm"); /*global subprocess: false */ Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ Cu.import("resource://enigmail/os.jsm"); /*global EnigmailOS: false */ Cu.import("resource://enigmail/app.jsm"); /*global EnigmailApp: false */ Cu.import("resource://enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ Cu.import("resource://gre/modules/PromiseUtils.jsm"); /* global PromiseUtils: false */ Cu.import("resource://enigmail/files.jsm"); /*global EnigmailFiles: false */ const EXEC_FILE_PERMS = 0x1C0; // 0700 const NS_LOCALFILEOUTPUTSTREAM_CONTRACTID = "@mozilla.org/network/file-output-stream;1"; const DIR_SERV_CONTRACTID = "@mozilla.org/file/directory_service;1"; const NS_LOCAL_FILE_CONTRACTID = "@mozilla.org/file/local;1"; const XPCOM_APPINFO = "@mozilla.org/xre/app-info;1"; const PEP_QUERY_URL = "https://www.enigmail.net/service/getPepDownload.svc"; const PEP_MAX_VERSION = "1.*"; // accept any pEp package versions 0.* and 1.*, but not 2.0 // install modes const INSTALL_AUTO = 0; const INSTALL_MANUAL = 1; const INSTALL_UPDATE = 2; var gInstallInProgress = 0; function toHexString(charCode) { return ("0" + charCode.toString(16)).slice(-2); } function sanitizeHash(str) { return str.replace(/[^a-hA-H0-9]/g, ""); } // Adapted from the patch for mozTCPSocket error reporting (bug 861196). function createTCPErrorFromFailedXHR(xhr) { let status = xhr.channel.QueryInterface(Ci.nsIRequest).status; let errType; let errName; if ((status & 0xff0000) === 0x5a0000) { // Security module const nsINSSErrorsService = Ci.nsINSSErrorsService; let nssErrorsService = Cc['@mozilla.org/nss_errors_service;1'].getService(nsINSSErrorsService); let errorClass; // getErrorClass will throw a generic NS_ERROR_FAILURE if the error code is // somehow not in the set of covered errors. try { errorClass = nssErrorsService.getErrorClass(status); } catch (ex) { errorClass = 'SecurityProtocol'; } if (errorClass == nsINSSErrorsService.ERROR_CLASS_BAD_CERT) { errType = 'SecurityCertificate'; } else { errType = 'SecurityProtocol'; } // NSS_SEC errors (happen below the base value because of negative vals) if ((status & 0xffff) < Math.abs(nsINSSErrorsService.NSS_SEC_ERROR_BASE)) { // The bases are actually negative, so in our positive numeric space, we // need to subtract the base off our value. let nssErr = Math.abs(nsINSSErrorsService.NSS_SEC_ERROR_BASE) - (status & 0xffff); switch (nssErr) { case 11: // SEC_ERROR_EXPIRED_CERTIFICATE, sec(11) errName = 'SecurityExpiredCertificateError'; break; case 12: // SEC_ERROR_REVOKED_CERTIFICATE, sec(12) errName = 'SecurityRevokedCertificateError'; break; // per bsmith, we will be unable to tell these errors apart very soon, // so it makes sense to just folder them all together already. case 13: // SEC_ERROR_UNKNOWN_ISSUER, sec(13) case 20: // SEC_ERROR_UNTRUSTED_ISSUER, sec(20) case 21: // SEC_ERROR_UNTRUSTED_CERT, sec(21) case 36: // SEC_ERROR_CA_CERT_INVALID, sec(36) errName = 'SecurityUntrustedCertificateIssuerError'; break; case 90: // SEC_ERROR_INADEQUATE_KEY_USAGE, sec(90) errName = 'SecurityInadequateKeyUsageError'; break; case 176: // SEC_ERROR_CERT_SIGNATURE_ALGORITHM_DISABLED, sec(176) errName = 'SecurityCertificateSignatureAlgorithmDisabledError'; break; default: errName = 'SecurityError'; break; } } else { let sslErr = Math.abs(nsINSSErrorsService.NSS_SSL_ERROR_BASE) - (status & 0xffff); switch (sslErr) { case 3: // SSL_ERROR_NO_CERTIFICATE, ssl(3) errName = 'SecurityNoCertificateError'; break; case 4: // SSL_ERROR_BAD_CERTIFICATE, ssl(4) errName = 'SecurityBadCertificateError'; break; case 8: // SSL_ERROR_UNSUPPORTED_CERTIFICATE_TYPE, ssl(8) errName = 'SecurityUnsupportedCertificateTypeError'; break; case 9: // SSL_ERROR_UNSUPPORTED_VERSION, ssl(9) errName = 'SecurityUnsupportedTLSVersionError'; break; case 12: // SSL_ERROR_BAD_CERT_DOMAIN, ssl(12) errName = 'SecurityCertificateDomainMismatchError'; break; default: errName = 'SecurityError'; break; } } } else { errType = 'Network'; switch (status) { // connect to host:port failed case 0x804B000C: // NS_ERROR_CONNECTION_REFUSED, network(13) errName = 'ConnectionRefusedError'; break; // network timeout error case 0x804B000E: // NS_ERROR_NET_TIMEOUT, network(14) errName = 'NetworkTimeoutError'; break; // hostname lookup failed case 0x804B001E: // NS_ERROR_UNKNOWN_HOST, network(30) errName = 'DomainNotFoundError'; break; case 0x804B0047: // NS_ERROR_NET_INTERRUPT, network(71) errName = 'NetworkInterruptError'; break; default: errName = 'NetworkError'; break; } } return { name: errName, type: errType }; } function Installer(progressListener) { this.progressListener = progressListener; } Installer.prototype = { cleanupOnOs: function() { EnigmailLog.DEBUG("installPep.jsm.cleanupOnOs():\n"); if (this.installerFile) { try { let extAppLauncher = Cc["@mozilla.org/mime;1"].getService(Ci.nsPIExternalAppLauncher); extAppLauncher.deleteTemporaryFileOnExit(this.installerFile); } catch (ex) {} } if (this.progressListener) { this.progressListener.onInstalled(); } }, checkHashSum: function() { EnigmailLog.DEBUG("installPep.jsm: checkHashSum\n"); var istream = Cc["@mozilla.org/network/file-input-stream;1"] .createInstance(Ci.nsIFileInputStream); // open for reading istream.init(this.installerFile, 0x01, 292, 0); // octal 0444 - octal literals are deprecated var ch = Cc["@mozilla.org/security/hash;1"].createInstance(Ci.nsICryptoHash); ch.init(ch.SHA256); const PR_UINT32_MAX = 0xffffffff; // read entire file ch.updateFromStream(istream, PR_UINT32_MAX); var gotHash = ch.finish(false); // convert the binary hash data to a hex string. var hashStr = ""; for (let i in gotHash) { hashStr += toHexString(gotHash.charCodeAt(i)); } if (this.hash != hashStr) { EnigmailLog.DEBUG("installPep.jsm: checkHashSum - hash sums don't match: " + hashStr + "\n"); } else EnigmailLog.DEBUG("installPep.jsm: checkHashSum - hash sum OK\n"); return this.hash == hashStr; }, getUrlObj: function() { let o = { url: this.url, hash: this.hash, comamnd: this.command, mount: this.mount, pepVersion: this.pepVersion }; return o; }, getDownloadUrl: function(on, installType) { EnigmailLog.DEBUG("installPep.jsm: getDownloadUrl: installType=" + installType + "\n"); let deferred = PromiseUtils.defer(); function reqListener() { // "this" is set by the calling XMLHttpRequest if (!this.responseText) { onError({ type: "Network" }); return; } if (typeof(this.responseText) == "string") { EnigmailLog.DEBUG("installPep.jsm: getDownloadUrl.reqListener: got: " + this.responseText + "\n"); try { let doc = JSON.parse(this.responseText); self.url = doc.url; self.pepVersion = doc.pepVersion; self.hash = sanitizeHash(doc.hash); deferred.resolve(); } catch (ex) { EnigmailLog.DEBUG("installPep.jsm: getDownloadUrl.reqListener: exception: " + ex.toString() + "\n"); onError({ type: "JSON" }); } } } function onError(error) { deferred.reject("error"); gInstallInProgress = 0; if (self.progressListener) { return self.progressListener.onError(error); } return false; } EnigmailLog.DEBUG("installPep.jsm: getDownloadUrl: start request\n"); let queryUrl = PEP_QUERY_URL; // if ENIGMAIL_PEP_DOWNLOAD_URL env variable is set, use that instead of the // official URL (for testing) let env = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment); if (env.get("ENIGMAIL_PEP_DOWNLOAD_URL")) { queryUrl = env.get("ENIGMAIL_PEP_DOWNLOAD_URL"); } var self = this; try { var xulRuntime = Cc[XPCOM_APPINFO].getService(Ci.nsIXULRuntime); var platform = xulRuntime.XPCOMABI.toLowerCase(); var os = EnigmailOS.getOS().toLowerCase(); // create a XMLHttpRequest object var oReq = new XMLHttpRequest(); oReq.onload = reqListener; oReq.addEventListener("error", function(e) { var error = createTCPErrorFromFailedXHR(oReq); onError(error); }, false); queryUrl = queryUrl + "?vEnigmail=" + escape(EnigmailApp.getVersion()) + "&os=" + escape(os) + "&platform=" + escape(platform); switch (installType) { case INSTALL_MANUAL: queryUrl += "&queryType=manual"; break; case INSTALL_UPDATE: queryUrl += "&queryType=update"; } EnigmailLog.DEBUG("installPep.jsm: getDownloadUrl: accessing '" + queryUrl + "'\n"); oReq.open("get", queryUrl, true); oReq.send(); } catch (ex) { deferred.reject(ex); EnigmailLog.writeException("installPep.jsm", ex); if (self.progressListener) self.progressListener.onError({ type: "installPep.downloadFailed" }); } return deferred.promise; }, performDownload: function() { EnigmailLog.DEBUG("installPep.jsm: performDownload: " + this.url + "\n"); var self = this; var deferred = PromiseUtils.defer(); function onProgress(event) { if (event.lengthComputable) { var percentComplete = event.loaded / event.total; EnigmailLog.DEBUG("installPep.jsm: performDownload: " + percentComplete * 100 + "% loaded\n"); } else { EnigmailLog.DEBUG("installPep.jsm: performDownload: got " + event.loaded + "bytes\n"); } } function onError(error) { deferred.reject("error"); if (self.progressListener) self.progressListener.onError(error); } function onLoaded(event) { EnigmailLog.DEBUG("installPep.jsm: performDownload: downloaded " + event.loaded + "bytes\n"); try { // "this" is set by the calling XMLHttpRequest performInstall(this.response).then(function _f() { performCleanup(); gInstallInProgress = 0; }); } catch (ex) { EnigmailLog.writeException("installPep.jsm", ex); gInstallInProgress = 0; if (self.progressListener) self.progressListener.onError({ type: "installPep.installFailed" }); } } function performInstall(response) { var arraybuffer = response; // not responseText EnigmailLog.DEBUG("installPep.jsm: performInstall: bytes " + arraybuffer.byteLength + "\n"); try { var flags = 0x02 | 0x08 | 0x20; var fileOutStream = Cc[NS_LOCALFILEOUTPUTSTREAM_CONTRACTID].createInstance(Ci.nsIFileOutputStream); self.installerFile = EnigmailFiles.getTempDirObj().clone(); self.performCleanup = self.cleanupOnOs; self.installerFile.append("pepmda.zip"); self.installerFile.createUnique(self.installerFile.NORMAL_FILE_TYPE, EXEC_FILE_PERMS); EnigmailLog.DEBUG("installPep.jsm: performInstall: writing file to " + self.installerFile.path + "\n"); fileOutStream.init(self.installerFile, flags, EXEC_FILE_PERMS, 0); var binStr = Cc["@mozilla.org/binaryoutputstream;1"].createInstance(Ci.nsIBinaryOutputStream); binStr.setOutputStream(fileOutStream.QueryInterface(Ci.nsIOutputStream)); var buf = new Uint8Array(arraybuffer); binStr.writeByteArray(buf, buf.length); binStr.flush(); binStr.close(); fileOutStream.close(); if (!self.checkHashSum()) { EnigmailLog.ERROR("installPep.jsm: performInstall: HASH sum mismatch!\n"); deferred.reject("Aborted due to hash sum error"); return null; } let tempDir = EnigmailApp.getProfileDirectory(); tempDir.append("pep_tmp"); tempDir.createUnique(Ci.nsIFile.DIRECTORY_TYPE, 509 /* = 0775 */ ); let pepDir = EnigmailApp.getProfileDirectory(); pepDir.append("pepmda"); if (EnigmailFiles.extractZipFile(self.installerFile, tempDir)) { if (pepDir.exists()) { if (self.progressListener) { self.progressListener.stopPep(); } pepDir.remove(true); } pepDir = tempDir.clone(); pepDir.append("pepmda"); pepDir.moveTo(EnigmailApp.getProfileDirectory(), "pepmda"); tempDir.remove(true); deferred.resolve(); } else { deferred.reject("Could not unzip " + self.installerFile.path + " to " + tempDir.path + "\n"); } } catch (ex) { deferred.reject(ex); EnigmailLog.writeException("installPep.jsm", ex); if (self.progressListener) self.progressListener.onError({ type: "installPep.installFailed" }); } return deferred.promise; } function performCleanup() { EnigmailLog.DEBUG("installPep.jsm: performCleanup:\n"); try { if (self.performCleanup) self.performCleanup(); } catch (ex) {} } try { // "main" part of performDownload if (!this.url || this.url.length === 0) { onError({ type: "downloadPep.noURL" }); return; } var oReq = new XMLHttpRequest(); oReq.addEventListener("load", onLoaded, false); oReq.addEventListener("error", function(e) { var error = createTCPErrorFromFailedXHR(oReq); onError(error); }, false); oReq.addEventListener("progress", onProgress, false); oReq.open("get", this.url, true); oReq.responseType = "arraybuffer"; oReq.send(); } catch (ex) { deferred.reject(ex); EnigmailLog.writeException("installPep.jsm", ex); if (self.progressListener) self.progressListener.onError({ type: "installPep.downloadFailed" }); } } }; var EnigmailInstallPep = { /** * Start downloading and installing pEp * * @param progressListener: Object (optional) * progressListener needs to implement the following methods: * void onError ({type: errorType, name: errorName}) * void onInstalled () * @param manualInstall: Boolean: if true, ignore pEpAutoDownload option * * @return Installer object or null (if not installation started) */ startInstaller: function(progressListener, manualInstall = false) { EnigmailLog.DEBUG("installPep.jsm: startInstaller()\n"); if (!manualInstall) { if (!EnigmailPrefs.getPref("pEpAutoDownload")) return null; } if (gInstallInProgress > 0) return null; gInstallInProgress = 1; let i = new Installer(progressListener); i.getDownloadUrl(i, manualInstall ? INSTALL_MANUAL : INSTALL_AUTO). then(function _gotUrl() { i.performDownload(); }).catch(function _err() { gInstallInProgress = 0; i.cleanupOnOs(); }); return i; }, /** * Determine if pEp installer is available online * * @param manualInstall: Boolean: if true, ignore pEpAutoDownload option * * @return true: installer for current platform is online available * false: otherwise */ isPepInstallerAvailable: function(manualInstall = false) { EnigmailLog.DEBUG("installPep.jsm: isPepInstallerAvailable()\n"); if (!manualInstall) { // don't download anything if auto-download is disabled if (!EnigmailPrefs.getPref("pEpAutoDownload")) return false; } let inspector = Cc["@mozilla.org/jsinspector;1"].createInstance(Ci.nsIJSInspector); let urlObj = null; let i = new Installer(null); i.getDownloadUrl(i, manualInstall ? INSTALL_MANUAL : INSTALL_AUTO). then(function _gotUrl() { urlObj = i.getUrlObj(); inspector.exitNestedEventLoop(); }). catch(function _err(data) { inspector.exitNestedEventLoop(); }); inspector.enterNestedEventLoop(0); return (urlObj ? urlObj.url !== null && urlObj.url !== "" : false); }, /** * Determine if an update to pEp is available online * * @param manualInstall: Boolean: if true, ignore pEpAutoDownload option * @param currentPepVersion: the current version of pEp * * @return true: installer for current platform is online available * false: otherwise */ isPepUpdateAvailable: function(manualInstall = false, currentPepVersion) { EnigmailLog.DEBUG("installPep.jsm: isPepUpdateAvailable()\n"); if (!manualInstall) { // don't download anything if auto-download is disabled if (!EnigmailPrefs.getPref("pEpAutoDownload")) return false; } let inspector = Cc["@mozilla.org/jsinspector;1"].createInstance(Ci.nsIJSInspector); let urlObj = null; let i = new Installer(null); i.getDownloadUrl(i, INSTALL_UPDATE). then(function _gotUrl() { urlObj = i.getUrlObj(); inspector.exitNestedEventLoop(); }). catch(function _err(data) { inspector.exitNestedEventLoop(); }); inspector.enterNestedEventLoop(0); let vc = Cc["@mozilla.org/xpcom/version-comparator;1"].getService(Ci.nsIVersionComparator); if (urlObj && ("pepVersion" in urlObj)) { // current version older than available version // and available version <= PEP_MAX_VERSION? if (vc.compare(currentPepVersion, urlObj.pepVersion) < 0 && vc.compare(urlObj.pepVersion, PEP_MAX_VERSION) < 0) return true; } return false; } }; enigmail-2.0.8/package/key.jsm000066400000000000000000000200221334302754500162060ustar00rootroot00000000000000/*global Components: false, Math: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailKey"]; const Cu = Components.utils; const KEY_BLOCK_UNKNOWN = 0; const KEY_BLOCK_KEY = 1; const KEY_BLOCK_REVOCATION = 2; const SIG_TYPE_REVOCATION = 0x20; Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ Cu.import("resource://enigmail/armor.jsm"); /*global EnigmailArmor: false */ Cu.import("resource://enigmail/locale.jsm"); /*global EnigmailLocale: false */ Cu.import("resource://enigmail/files.jsm"); /*global EnigmailFiles: false */ Cu.import("resource://enigmail/gpg.jsm"); /*global EnigmailGpg: false */ Cu.import("resource://enigmail/execution.jsm"); /*global EnigmailExecution: false */ Cu.import("resource://enigmail/openpgp.jsm"); /*global EnigmailOpenPGP: false */ Cu.import("resource://enigmail/lazy.jsm"); /*global EnigmailLazy: false */ const getKeyRing = EnigmailLazy.loader("enigmail/keyRing.jsm", "EnigmailKeyRing"); const getDialog = EnigmailLazy.loader("enigmail/dialog.jsm", "EnigmailDialog"); var EnigmailKey = { /** * Format a key fingerprint * @fingerprint |string| - unformated OpenPGP fingerprint * * @return |string| - formatted string */ formatFpr: function(fingerprint) { //EnigmailLog.DEBUG("key.jsm: EnigmailKey.formatFpr(" + fingerprint + ")\n"); // format key fingerprint let r = ""; const fpr = fingerprint.match(/(....)(....)(....)(....)(....)(....)(....)(....)(....)?(....)?/); if (fpr && fpr.length > 2) { fpr.shift(); r = fpr.join(" "); } return r; }, // Extract public key from Status Message extractPubkey: function(statusMsg) { const matchb = statusMsg.match(/(^|\n)NO_PUBKEY (\w{8})(\w{8})/); if (matchb && (matchb.length > 3)) { EnigmailLog.DEBUG("enigmailCommon.jsm:: Enigmail.extractPubkey: NO_PUBKEY 0x" + matchb[3] + "\n"); return matchb[2] + matchb[3]; } else { return null; } }, /** * import a revocation certificate form a given keyblock string. * Ask the user before importing the cert, and display an error * message in case of failures. */ importRevocationCert: function(keyId, keyBlockStr) { let key = getKeyRing().getKeyById(keyId); if (key) { if (key.keyTrust === "r") { // Key has already been revoked getDialog().info(null, EnigmailLocale.getString("revokeKeyAlreadyRevoked", keyId)); } else { let userId = key.userId + " - 0x" + key.keyId; if (!getDialog().confirmDlg(null, EnigmailLocale.getString("revokeKeyQuestion", userId), EnigmailLocale.getString("keyMan.button.revokeKey"))) { return; } let errorMsgObj = {}; if (getKeyRing().importKey(null, false, keyBlockStr, keyId, errorMsgObj) > 0) { getDialog().alert(null, errorMsgObj.value); } } } else { // Suitable key for revocation certificate is not present in keyring getDialog().alert(null, EnigmailLocale.getString("revokeKeyNotPresent", keyId)); } }, /** * Split armored blocks into an array of strings */ splitArmoredBlocks: function(keyBlockStr) { let myRe = /-----BEGIN PGP (PUBLIC|PRIVATE) KEY BLOCK-----/g; let myArray; let retArr = []; let startIndex = -1; while ((myArray = myRe.exec(keyBlockStr)) !== null) { if (startIndex >= 0) { let s = keyBlockStr.substring(startIndex, myArray.index); retArr.push(s); } startIndex = myArray.index; } retArr.push(keyBlockStr.substring(startIndex)); return retArr; }, /** * Get details (key ID, UID) of the data contained in a OpenPGP key block * * @param keyBlockStr String: the contents of one or more public keys * @param errorMsgObj Object: obj.value will contain an error message in case of failures * @param interactive Boolean: if in interactive mode, may display dialogs (default: true) * * @return Array of objects with the following structure: * - id (key ID) * - fpr * - name (the UID of the key) * - state (one of "old" [existing key], "new" [new key], "invalid" [key cannot not be imported]) */ getKeyListFromKeyBlock: function(keyBlockStr, errorMsgObj, interactive = true) { EnigmailLog.DEBUG("key.jsm: getKeyListFromKeyBlock\n"); let blocks; let isBinary = false; errorMsgObj.value = ""; if (keyBlockStr.search(/-----BEGIN PGP (PUBLIC|PRIVATE) KEY BLOCK-----/) >= 0) { blocks = this.splitArmoredBlocks(keyBlockStr); } else { isBinary = true; blocks = [EnigmailOpenPGP.enigmailFuncs.bytesToArmor(EnigmailOpenPGP.openpgp.enums.armor.public_key, keyBlockStr)]; } let keyList = []; let key = {}; for (let b of blocks) { let m = EnigmailOpenPGP.openpgp.message.readArmored(b); for (let i = 0; i < m.packets.length; i++) { let packetType = EnigmailOpenPGP.openpgp.enums.read(EnigmailOpenPGP.openpgp.enums.packet, m.packets[i].tag); switch (packetType) { case "publicKey": case "secretKey": key = { id: m.packets[i].getKeyId().toHex().toUpperCase(), fpr: m.packets[i].getFingerprint().toUpperCase(), name: null, isSecret: false }; if (!(key.id in keyList)) { keyList[key.id] = key; } if (packetType === "secretKey") { keyList[key.id].isSecret = true; } break; case "userid": if (!key.name) { key.name = m.packets[i].userid.replace(/[\r\n]+/g, " "); } break; case "signature": if (m.packets[i].signatureType === SIG_TYPE_REVOCATION) { let keyId = m.packets[i].issuerKeyId.toHex().toUpperCase(); if (keyId in keyList) { keyList[keyId].revoke = true; } else { keyList[keyId] = { revoke: true, id: keyId }; } } break; } } } let retArr = []; for (let k in keyList) { retArr.push(keyList[k]); } if (interactive && retArr.length === 1) { key = retArr[0]; if (("revoke" in key) && (!("name" in key))) { this.importRevocationCert(key.id, blocks.join("\n")); errorMsgObj.value = ""; return []; } } return retArr; }, /** * Get details of a key block to import. Works identically as getKeyListFromKeyBlock(); * except that the input is a file instead of a string * * @param file nsIFile object - file to read * @param errorMsgObj Object - obj.value will contain error message * * @return Array (same as for getKeyListFromKeyBlock()) */ getKeyListFromKeyFile: function(path, errorMsgObj) { var contents = EnigmailFiles.readFile(path); return this.getKeyListFromKeyBlock(contents, errorMsgObj); }, /** * Compare 2 KeyIds of possible different length (short, long, FPR-length, with or without prefixed * 0x are accepted) * * @param keyId1 string * @param keyId2 string * * @return true or false, given the comparison of the last minimum-length characters. */ compareKeyIds: function(keyId1, keyId2) { var keyId1Raw = keyId1.replace(/^0x/, "").toUpperCase(); var keyId2Raw = keyId2.replace(/^0x/, "").toUpperCase(); var minlength = Math.min(keyId1Raw.length, keyId2Raw.length); if (minlength < keyId1Raw.length) { // Limit keyId1 to minlength keyId1Raw = keyId1Raw.substr(-minlength, minlength); } if (minlength < keyId2Raw.length) { // Limit keyId2 to minlength keyId2Raw = keyId2Raw.substr(-minlength, minlength); } return (keyId1Raw === keyId2Raw); } }; enigmail-2.0.8/package/keyEditor.jsm000066400000000000000000001202751334302754500173700ustar00rootroot00000000000000/*global Components: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailKeyEditor"]; const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; Cu.import("resource://enigmail/core.jsm"); /*global EnigmailCore: false */ Cu.import("resource://enigmail/key.jsm"); /*global EnigmailKey: false */ Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ Cu.import("resource://enigmail/os.jsm"); /*global EnigmailOS: false */ Cu.import("resource://enigmail/files.jsm"); /*global EnigmailFiles: false */ Cu.import("resource://enigmail/locale.jsm"); /*global EnigmailLocale: false */ Cu.import("resource://enigmail/data.jsm"); /*global EnigmailData: false */ Cu.import("resource://enigmail/execution.jsm"); /*global EnigmailExecution: false */ Cu.import("resource://enigmail/gpgAgent.jsm"); /*global EnigmailGpgAgent: false */ Cu.import("resource://enigmail/gpg.jsm"); /*global EnigmailGpg: false */ Cu.import("resource://enigmail/keyRing.jsm"); /*global EnigmailKeyRing: false */ Cu.import("resource://enigmail/errorHandling.jsm"); /*global EnigmailErrorHandling: false */ Cu.import("resource://enigmail/constants.jsm"); /*global EnigmailConstants: false */ const GET_BOOL = "GET_BOOL"; const GET_LINE = "GET_LINE"; const GET_HIDDEN = "GET_HIDDEN"; const NS_PROMPTSERVICE_CONTRACTID = "@mozilla.org/embedcomp/prompt-service;1"; function GpgEditorInterface(reqObserver, callbackFunc, inputData) { this._reqObserver = reqObserver; this._callbackFunc = callbackFunc; this._inputData = inputData; if (this._inputData && this._inputData.cardAdmin) { this._saveCmd = "quit"; } else this._saveCmd = "save"; } GpgEditorInterface.prototype = { _stdin: null, _data: "", _txt: "", _exitCode: 0, errorMsg: "", setStdin: function(pipe) { this._stdin = pipe; if (this._data.length > 0) this.processData(); }, gotData: function(data) { //EnigmailLog.DEBUG("keyEditor.jsm: GpgEditorInterface.gotData: '"+data+"'\n"); this._data += data.replace(/\r\n/g, "\n"); this.processData(); }, processData: function() { //EnigmailLog.DEBUG("keyEditor.jsm: GpgEditorInterface.processData\n"); var txt = ""; while (this._data.length > 0 && this._stdin) { var index = this._data.indexOf("\n"); if (index < 0) { txt = this._data; this._data = ""; } else { txt = this._data.substr(0, index); this._data = this._data.substr(index + 1); } this.nextLine(txt); } }, closeStdin: function() { EnigmailLog.DEBUG("keyEditor.jsm: GpgEditorInterface.closeStdin:\n"); if (this._stdin) { this._stdin.close(); this._stdin = null; } }, onComplete: function(parentCallback, exitCode) { EnigmailLog.DEBUG("keyEdit.jsm: GpgEditorInterface.onComplete: exitCode=" + exitCode + "\n"); if (exitCode === 0) exitCode = this._exitCode; EnigmailLog.DEBUG("keyEdit.jsm: GpgEditorInterface.onComplete: returning exitCode " + exitCode + "\n"); parentCallback(exitCode, this.errorMsg); }, writeLine: function(inputData) { EnigmailLog.DEBUG("keyEdit.jsm: GpgEditorInterface.writeLine: '" + inputData + "'\n"); this._stdin.write(inputData + "\n"); }, nextLine: function(txt) { if (txt.indexOf("[GNUPG:]") >= 0) { if (this._reqObserver) { var newTxt = this._reqObserver.onDataAvailable(txt); if (newTxt.length > 0) { txt = newTxt; } } this._txt = txt; this.processLine(txt); } }, doCheck: function(inputType, promptVal) { var a = this._txt.split(/ /); return ((a[1] == inputType) && (a[2] == promptVal)); }, getText: function() { return this._txt; }, handleGpgError: function(lineTxt) { let retStatusObj = {}; EnigmailErrorHandling.parseErrorOutput(lineTxt, retStatusObj); return retStatusObj; }, processLine: function(txt) { EnigmailLog.DEBUG("keyEdit.jsm: GpgEditorInterface.processLine: '" + txt + "'\n"); var r = { quitNow: false, exitCode: -1 }; try { if (txt.indexOf("[GNUPG:] BAD_PASSPHRASE") >= 0 || txt.indexOf("[GNUPG:] SC_OP_FAILURE 2") >= 0) { EnigmailLog.DEBUG("keyEdit.jsm: GpgEditorInterface.processLine: detected bad passphrase\n"); r.exitCode = -2; r.quitNow = true; this.errorMsg = EnigmailLocale.getString("badPhrase"); } else if (txt.indexOf("[GNUPG:] ERROR ") >= 0 || txt.indexOf("[GNUPG:] FAILURE ") >= 0) { EnigmailLog.DEBUG("keyEdit.jsm: GpgEditorInterface.processLine: detected GnuPG ERROR message\n"); let statusObj = this.handleGpgError(txt); if (statusObj.statusFlags & EnigmailConstants.DISPLAY_MESSAGE) { this.errorMsg = statusObj.statusMsg; r.exitCode = -3; r.quitNow = true; } } else if (txt.indexOf("[GNUPG:] NO_CARD_AVAILABLE") >= 0) { EnigmailLog.DEBUG("keyEdit.jsm: GpgEditorInterface.processLine: detected missing card\n"); this.errorMsg = EnigmailLocale.getString("sc.noCardAvailable"); r.exitCode = -3; r.quitNow = true; } else if (txt.indexOf("[GNUPG:] ENIGMAIL_FAILURE") === 0) { EnigmailLog.DEBUG("keyEdit.jsm: GpgEditorInterface.processLine: detected general failure\n"); r.exitCode = -3; r.quitNow = true; this.errorMsg = txt.substr(26); } else if (txt.indexOf("[GNUPG:] ALREADY_SIGNED") >= 0) { EnigmailLog.DEBUG("keyEdit.jsm: GpgEditorInterface.processLine: detected key already signed\n"); this.errorMsg = EnigmailLocale.getString("keyAlreadySigned"); r.exitCode = -1; r.quitNow = true; } else if (txt.indexOf("[GNUPG:] MISSING_PASSPHRASE") >= 0) { EnigmailLog.DEBUG("keyEdit.jsm: GpgEditorInterface.processLine: detected missing passphrase\n"); this.errorMsg = EnigmailLocale.getString("noPassphrase"); r.exitCode = -2; this._exitCode = -2; r.quitNow = true; } else if (txt.indexOf("[GNUPG:] GET_") < 0) { // return if no "GET" statement return; } } catch (ex) { txt = ""; r.quitNow = true; } if (!r.quitNow) { if (txt.indexOf("[GNUPG:] GOT_IT") < 0) { if (this._callbackFunc) { this._callbackFunc(this._inputData, this, r); if (r.exitCode === 0) { this.writeLine(r.writeTxt); } else { if (r.errorMsg && r.errorMsg.length > 0) this.errorMsg = r.errorMsg; } } else { r.quitNow = true; r.exitCode = 0; } } else { r.exitCode = 0; } } if (r.quitNow) { try { this.writeLine(this._saveCmd); this.closeStdin(); } catch (ex) { EnigmailLog.DEBUG("no more data\n"); } } if (r.exitCode !== null) this._exitCode = r.exitCode; }, QueryInterface: function(iid) { if (!iid.equals(Ci.nsISupports)) throw Components.results.NS_ERROR_NO_INTERFACE; return this; } }; function editKey(parent, needPassphrase, userId, keyId, editCmd, inputData, callbackFunc, requestObserver, parentCallback) { EnigmailLog.DEBUG("keyEdit.jsm: editKey: parent=" + parent + ", editCmd=" + editCmd + "\n"); if (!EnigmailCore.getService(parent)) { EnigmailLog.ERROR("keyEdit.jsm: Enigmail.editKey: not yet initialized\n"); parentCallback(-1, EnigmailLocale.getString("notInit")); return -1; } var keyIdList = keyId.split(" "); var args = EnigmailGpg.getStandardArgs(false); var statusFlags = {}; args = args.concat(["--no-tty", "--no-verbose", "--status-fd", "1", "--logger-fd", "1", "--command-fd", "0"]); if (userId) args = args.concat(["-u", userId]); var editCmdArr; if (typeof(editCmd) == "string") { editCmdArr = [editCmd]; } else { editCmdArr = editCmd; } if (editCmdArr[0] == "revoke") { // escape backslashes and ' characters args = args.concat(["-a", "-o"]); args.push(EnigmailFiles.getEscapedFilename(inputData.outFile.path)); args.push("--gen-revoke"); args = args.concat(keyIdList); } else if (editCmdArr[0].indexOf("--") === 0) { args = args.concat(editCmd); args = args.concat(keyIdList); } else { args = args.concat(["--ask-cert-level", "--edit-key", keyId]); args = args.concat(editCmd); } var command = EnigmailGpgAgent.agentPath; EnigmailLog.CONSOLE("enigmail> " + EnigmailFiles.formatCmdLine(command, args) + "\n"); var keyEdit = new GpgEditorInterface(requestObserver, callbackFunc, inputData); try { EnigmailExecution.execCmd2(command, args, keyEdit.setStdin.bind(keyEdit), keyEdit.gotData.bind(keyEdit), function(result) { EnigmailKeyRing.updateKeys(keyIdList); keyEdit.onComplete(parentCallback, 0); // ignore exit code from GnuPG } ); } catch (ex) { EnigmailLog.ERROR("keyEditor.jsm: editKey: " + command.path + " failed\n"); parentCallback(-1, ""); } return null; } function runKeyTrustCheck(callbackFunc) { EnigmailLog.DEBUG("keyEdit.jsm: runKeyTrustCheck()\n"); let args = EnigmailGpg.getStandardArgs(true); args = args.concat(["--yes", "--check-trustdb"]); EnigmailExecution.execCmd2(EnigmailGpgAgent.agentPath, args, null, function stdout(data) { EnigmailLog.DEBUG(data); }, function(result) { EnigmailLog.DEBUG("keyEdit.jsm: runKeyTrustCheck: done\n"); }); } /* * NOTE: the callbackFunc used in every call to the key editor needs to be implemented like this: * callbackFunc(returnCode, errorMsg) * returnCode = 0 in case of success * returnCode != 0 and errorMsg set in case of failure */ var EnigmailKeyEditor = { setKeyTrust: function(parent, keyId, trustLevel, callbackFunc) { EnigmailLog.DEBUG("keyEdit.jsm: Enigmail.setKeyTrust: trustLevel=" + trustLevel + ", keyId=" + keyId + "\n"); return editKey(parent, false, null, keyId, "trust", { trustLevel: trustLevel }, keyTrustCallback, null, function _f(returnCode, errorMsg) { runKeyTrustCheck(); EnigmailKeyRing.updateKeys([keyId]); callbackFunc(returnCode, errorMsg); }); }, /** * Call editKey() to set the expiration date of the chosen key and subkeys * * @param Object parent * @param String keyId e.g. 8D18EB22FDF633A2 * @param Array subKeys List of Integer values, e.g. [0,1,3] * "0" should allways be set because it's the main key. * @param Integer expiryLength A number between 1 and 100 * @param Integer timeScale 1 or 30 or 365 meaning days, months, years * @param Boolean noExpiry True: Expire never. False: Use expiryLength. * @param Function callbackFunc will be executed by editKey() * @return Integer * returnCode = 0 in case of success * returnCode != 0 and errorMsg set in case of failure */ setKeyExpiration: function(parent, keyId, subKeys, expiryLength, timeScale, noExpiry, callbackFunc) { EnigmailLog.DEBUG("keyEdit.jsm: Enigmail.setKeyExpiry: keyId=" + keyId + "\n"); expiryLength = String(expiryLength); if (noExpiry === true) { expiryLength = "0"; } else { switch (parseInt(timeScale, 10)) { case 365: expiryLength += "y"; break; case 30: expiryLength += "m"; break; case 7: expiryLength += "w"; break; } } return editKey(parent, true, null, keyId, "", /* "expire", */ { expiryLength: expiryLength, subKeys: subKeys, currentSubKey: false }, keyExpiryCallback, /* contains the gpg communication logic */ null, callbackFunc); }, signKey: function(parent, userId, keyId, signLocally, trustLevel, callbackFunc) { EnigmailLog.DEBUG("keyEdit.jsm: Enigmail.signKey: trustLevel=" + trustLevel + ", userId=" + userId + ", keyId=" + keyId + "\n"); return editKey(parent, true, userId, keyId, (signLocally ? "lsign" : "sign"), { trustLevel: trustLevel, usePassphrase: true }, signKeyCallback, null, function _f(returnCode, errorMsg) { runKeyTrustCheck(); EnigmailKeyRing.updateKeys([keyId]); callbackFunc(returnCode, errorMsg); }); }, genRevokeCert: function(parent, keyId, outFile, reasonCode, reasonText, callbackFunc) { EnigmailLog.DEBUG("keyEdit.jsm: Enigmail.genRevokeCert: keyId=" + keyId + "\n"); /** * GnuPG < 2.1 does not properly report failures; * therefore we check if the revokation certificate was really generated */ function checkGeneratedCert(exitCode, errorMsg) { if (!outFile.exists()) { exitCode = 1; errorMsg = ""; } callbackFunc(exitCode, errorMsg); } return editKey(parent, true, null, keyId, "revoke", { outFile: outFile, reasonCode: reasonCode, reasonText: EnigmailData.convertFromUnicode(reasonText), usePassphrase: true }, revokeCertCallback, null, checkGeneratedCert); }, addUid: function(parent, keyId, name, email, comment, callbackFunc) { EnigmailLog.DEBUG("keyEdit.jsm: Enigmail.addUid: keyId=" + keyId + ", name=" + name + ", email=" + email + "\n"); return editKey(parent, true, null, keyId, "adduid", { email: email, name: name, comment: comment, nameAsked: 0, emailAsked: 0, usePassphrase: true }, addUidCallback, null, callbackFunc); }, deleteKey: function(parent, keyId, deleteSecretKey, callbackFunc) { EnigmailLog.DEBUG("keyEdit.jsm: Enigmail.addUid: keyId=" + keyId + ", deleteSecretKey=" + deleteSecretKey + "\n"); var cmd = ["--yes", (deleteSecretKey ? "--delete-secret-and-public-key" : "--delete-key")]; return editKey(parent, false, null, keyId, cmd, { usePassphrase: true }, deleteKeyCallback, null, callbackFunc); }, changePassphrase: function(parent, keyId, oldPw, newPw, callbackFunc) { EnigmailLog.DEBUG("keyEdit.jsm: Enigmail.changePassphrase: keyId=" + keyId + "\n"); var pwdObserver = new ChangePasswdObserver(); return editKey(parent, false, null, keyId, "passwd", { oldPw: oldPw, newPw: newPw, step: 0, observer: pwdObserver, usePassphrase: true }, changePassphraseCallback, pwdObserver, callbackFunc); }, enableDisableKey: function(parent, keyId, disableKey, callbackFunc) { EnigmailLog.DEBUG("keyEdit.jsm: Enigmail.enableDisableKey: keyId=" + keyId + ", disableKey=" + disableKey + "\n"); var cmd = (disableKey ? "disable" : "enable"); return editKey(parent, false, null, keyId, cmd, { usePassphrase: true }, null, null, callbackFunc); }, setPrimaryUid: function(parent, keyId, idNumber, callbackFunc) { EnigmailLog.DEBUG("keyEdit.jsm: Enigmail.setPrimaryUid: keyId=" + keyId + ", idNumber=" + idNumber + "\n"); return editKey(parent, true, null, keyId, "", { idNumber: idNumber, step: 0, usePassphrase: true }, setPrimaryUidCallback, null, callbackFunc); }, deleteUid: function(parent, keyId, idNumber, callbackFunc) { EnigmailLog.DEBUG("keyEdit.jsm: Enigmail.deleteUid: keyId=" + keyId + ", idNumber=" + idNumber + "\n"); return editKey(parent, true, null, keyId, "", { idNumber: idNumber, step: 0, usePassphrase: true }, deleteUidCallback, null, callbackFunc); }, revokeUid: function(parent, keyId, idNumber, callbackFunc) { EnigmailLog.DEBUG("keyEdit.jsm: Enigmail.revokeUid: keyId=" + keyId + ", idNumber=" + idNumber + "\n"); return editKey(parent, true, null, keyId, "", { idNumber: idNumber, step: 0, usePassphrase: true }, revokeUidCallback, null, callbackFunc); }, addPhoto: function(parent, keyId, photoFile, callbackFunc) { EnigmailLog.DEBUG("keyEdit.jsm: Enigmail.addPhoto: keyId=" + keyId + "\n"); var photoFileName = EnigmailFiles.getEscapedFilename(EnigmailFiles.getFilePath(photoFile.QueryInterface(Ci.nsIFile))); return editKey(parent, true, null, keyId, "addphoto", { file: photoFileName, step: 0, usePassphrase: true }, addPhotoCallback, null, function _f(returnCode, errorMsg) { runKeyTrustCheck(); EnigmailKeyRing.updateKeys([keyId]); callbackFunc(returnCode, errorMsg); }); }, genCardKey: function(parent, name, email, comment, expiry, backupPasswd, requestObserver, callbackFunc) { EnigmailLog.DEBUG("keyEdit.jsm: Enigmail.genCardKey: \n"); var generateObserver = new EnigCardAdminObserver(requestObserver, EnigmailOS.isDosLike); return editKey(parent, false, null, "", ["--with-colons", "--card-edit"], { step: 0, name: EnigmailData.convertFromUnicode(name), email: email, comment: EnigmailData.convertFromUnicode(comment), expiry: expiry, backupPasswd: backupPasswd, cardAdmin: true, backupKey: (backupPasswd.length > 0 ? "Y" : "N"), parent: parent }, genCardKeyCallback, generateObserver, callbackFunc); }, cardAdminData: function(parent, name, firstname, lang, sex, url, login, forcepin, callbackFunc) { EnigmailLog.DEBUG("keyEdit.jsm: Enigmail.cardAdminData: parent=" + parent + ", name=" + name + ", firstname=" + firstname + ", lang=" + lang + ", sex=" + sex + ", url=" + url + ", login=" + login + ", forcepin=" + forcepin + "\n"); var adminObserver = new EnigCardAdminObserver(null, EnigmailOS.isDosLike); return editKey(parent, false, null, "", ["--with-colons", "--card-edit"], { step: 0, name: name, firstname: firstname, lang: lang, sex: sex, url: url, login: login, cardAdmin: true, forcepin: forcepin }, cardAdminDataCallback, adminObserver, callbackFunc); }, cardChangePin: function(parent, action, oldPin, newPin, adminPin, pinObserver, callbackFunc) { EnigmailLog.DEBUG("keyEdit.jsm: Enigmail.cardChangePin: parent=" + parent + ", action=" + action + "\n"); var adminObserver = new EnigCardAdminObserver(pinObserver, EnigmailOS.isDosLike); return editKey(parent, true, null, "", ["--with-colons", "--card-edit"], { step: 0, pinStep: 0, cardAdmin: true, action: action, oldPin: oldPin, newPin: newPin, adminPin: adminPin }, cardChangePinCallback, adminObserver, callbackFunc); } }; // EnigmailKeyEditor function signKeyCallback(inputData, keyEdit, ret) { ret.writeTxt = ""; ret.errorMsg = ""; if (keyEdit.doCheck(GET_BOOL, "sign_uid.okay")) { ret.exitCode = 0; ret.writeTxt = "Y"; } else if (keyEdit.doCheck(GET_BOOL, "keyedit.sign_all.okay")) { ret.exitCode = 0; ret.writeTxt = "Y"; } else if (keyEdit.doCheck(GET_LINE, "sign_uid.expire")) { ret.exitCode = 0; ret.writeTxt = "0"; } else if (keyEdit.doCheck(GET_LINE, "trustsig_prompt.trust_value")) { ret.exitCode = 0; ret.writeTxt = "0"; } else if (keyEdit.doCheck(GET_LINE, "trustsig_prompt.trust_depth")) { ret.exitCode = 0; ret.writeTxt = ""; } else if (keyEdit.doCheck(GET_LINE, "trustsig_prompt.trust_regexp")) { ret.exitCode = 0; ret.writeTxt = "0"; } else if (keyEdit.doCheck(GET_LINE, "siggen.valid")) { ret.exitCode = 0; ret.writeTxt = "0"; } else if (keyEdit.doCheck(GET_BOOL, "sign_uid.local_promote_okay")) { ret.exitCode = 0; ret.writeTxt = "Y"; } else if (keyEdit.doCheck(GET_BOOL, "sign_uid.replace_expired_okay")) { ret.exitCode = 0; ret.writeTxt = "Y"; } else if (keyEdit.doCheck(GET_LINE, "sign_uid.class")) { ret.exitCode = 0; ret.writeTxt = String(inputData.trustLevel); } else if (keyEdit.doCheck(GET_HIDDEN, "passphrase.adminpin.ask")) { getPin(inputData.parent, EnigmailLocale.getString("enterAdminPin"), ret); } else if (keyEdit.doCheck(GET_HIDDEN, "passphrase.pin.ask")) { getPin(inputData.parent, EnigmailLocale.getString("enterCardPin"), ret); } else if (keyEdit.doCheck(GET_LINE, "keyedit.prompt")) { ret.exitCode = 0; ret.quitNow = true; } else { ret.quitNow = true; EnigmailLog.ERROR("Unknown command prompt: " + keyEdit.getText() + "\n"); ret.exitCode = -1; } } function keyTrustCallback(inputData, keyEdit, ret) { ret.writeTxt = ""; ret.errorMsg = ""; if (keyEdit.doCheck(GET_LINE, "edit_ownertrust.value")) { ret.exitCode = 0; ret.writeTxt = String(inputData.trustLevel); } else if (keyEdit.doCheck(GET_BOOL, "edit_ownertrust.set_ultimate.okay")) { ret.exitCode = 0; ret.writeTxt = "Y"; } else if (keyEdit.doCheck(GET_LINE, "keyedit.prompt")) { ret.exitCode = 0; ret.quitNow = true; } else if (keyEdit.doCheck(GET_HIDDEN, "passphrase.adminpin.ask")) { getPin(inputData.parent, EnigmailLocale.getString("enterAdminPin"), ret); } else if (keyEdit.doCheck(GET_HIDDEN, "passphrase.pin.ask")) { getPin(inputData.parent, EnigmailLocale.getString("enterCardPin"), ret); } else { ret.quitNow = true; EnigmailLog.ERROR("Unknown command prompt: " + keyEdit.getText() + "\n"); ret.exitCode = -1; } } /** * * @param Array inputData Has the keys ... * expiryLength (String): e.g. 8m = 8 month, 5 = 5 days, 3y = 3 years, 0 = never * subKeys (array): list of still unprocessed subkeys * currentSubKey (Integer or false): current subkey in progress * @param Object keyEdit Readonly messages from GPG. * @param Object ret */ function keyExpiryCallback(inputData, keyEdit, ret) { EnigmailLog.DEBUG("keyEdit.jsm: keyExpiryCallback()\n"); ret.writeTxt = ""; ret.errorMsg = ""; if (inputData.subKeys.length === 0) { // zero keys are submitted to edit: this must be a mistake. ret.exitCode = -1; ret.quitNow = true; } else if (keyEdit.doCheck(GET_LINE, "keyedit.prompt")) { if (inputData.currentSubKey === false) { // currently no subkey is selected. Chose the first subkey. inputData.currentSubKey = inputData.subKeys[0]; ret.exitCode = 0; ret.writeTxt = "key " + inputData.currentSubKey; } else if (inputData.currentSubKey === inputData.subKeys[0]) { // a subkey is selected. execute command "expire" ret.exitCode = 0; ret.writeTxt = "expire"; } else { // if (inputData.currentSubKey === inputData.subKeys[0]) // unselect the previous used subkey ret.exitCode = 0; ret.writeTxt = "key " + inputData.currentSubKey; inputData.currentSubKey = false; } } else if (keyEdit.doCheck(GET_LINE, "keygen.valid")) { // submit the expiry length. ret.exitCode = 0; ret.writeTxt = inputData.expiryLength; // processing of the current subkey is through. // remove current subkey from list of "to be processed keys". inputData.subKeys.splice(0, 1); // if the list of "to be processed keys" is empty, then quit. if (inputData.subKeys.length === 0) { ret.quitNow = true; } } else if (keyEdit.doCheck(GET_HIDDEN, "passphrase.adminpin.ask")) { getPin(inputData.parent, EnigmailLocale.getString("enterAdminPin"), ret); } else if (keyEdit.doCheck(GET_HIDDEN, "passphrase.pin.ask")) { getPin(inputData.parent, EnigmailLocale.getString("enterCardPin"), ret); } else { ret.quitNow = true; EnigmailLog.ERROR("Unknown command prompt: " + keyEdit.getText() + "\n"); ret.exitCode = -1; } } function addUidCallback(inputData, keyEdit, ret) { ret.writeTxt = ""; ret.errorMsg = ""; if (keyEdit.doCheck(GET_LINE, "keygen.name")) { ++inputData.nameAsked; if (inputData.nameAsked == 1) { ret.exitCode = 0; ret.writeTxt = inputData.name; } else { ret.exitCode = -1; ret.quitNow = true; ret.errorMsg = "Invalid name (too short)"; } } else if (keyEdit.doCheck(GET_LINE, "keygen.email")) { ++inputData.emailAsked; if (inputData.emailAsked == 1) { ret.exitCode = 0; ret.writeTxt = inputData.email; } else { ret.exitCode = -1; ret.quitNow = true; ret.errorMsg = "Invalid email"; } } else if (keyEdit.doCheck(GET_LINE, "keygen.comment")) { ret.exitCode = 0; if (inputData.comment) { ret.writeTxt = inputData.comment; } else { ret.writeTxt = ""; } } else if (keyEdit.doCheck(GET_LINE, "keyedit.prompt")) { ret.exitCode = 0; ret.quitNow = true; } else if (keyEdit.doCheck(GET_HIDDEN, "passphrase.adminpin.ask")) { getPin(inputData.parent, EnigmailLocale.getString("enterAdminPin"), ret); } else if (keyEdit.doCheck(GET_HIDDEN, "passphrase.pin.ask")) { getPin(inputData.parent, EnigmailLocale.getString("enterCardPin"), ret); } else { ret.quitNow = true; EnigmailLog.ERROR("Unknown command prompt: " + keyEdit.getText() + "\n"); ret.exitCode = -1; } } function revokeCertCallback(inputData, keyEdit, ret) { ret.writeTxt = ""; ret.errorMsg = ""; if (keyEdit.doCheck(GET_LINE, "ask_revocation_reason.code")) { ret.exitCode = 0; ret.writeTxt = String(inputData.reasonCode); } else if (keyEdit.doCheck(GET_LINE, "ask_revocation_reason.text")) { ret.exitCode = 0; ret.writeTxt = ""; } else if (keyEdit.doCheck(GET_BOOL, "gen_revoke.okay")) { ret.exitCode = 0; ret.writeTxt = "Y"; } else if (keyEdit.doCheck(GET_BOOL, "ask_revocation_reason.okay")) { ret.exitCode = 0; ret.writeTxt = "Y"; } else if (keyEdit.doCheck(GET_BOOL, "openfile.overwrite.okay")) { ret.exitCode = 0; ret.writeTxt = "Y"; } else if (keyEdit.doCheck(GET_HIDDEN, "passphrase.adminpin.ask")) { getPin(inputData.parent, EnigmailLocale.getString("enterAdminPin"), ret); } else if (keyEdit.doCheck(GET_HIDDEN, "passphrase.pin.ask")) { getPin(inputData.parent, EnigmailLocale.getString("enterCardPin"), ret); } else if (keyEdit.doCheck(GET_LINE, "keyedit.prompt")) { ret.exitCode = 0; ret.quitNow = true; } else { ret.quitNow = true; EnigmailLog.ERROR("Unknown command prompt: " + keyEdit.getText() + "\n"); ret.exitCode = -1; } } function setPrimaryUidCallback(inputData, keyEdit, ret) { ret.writeTxt = ""; ret.errorMsg = ""; if (keyEdit.doCheck(GET_LINE, "keyedit.prompt")) { ++inputData.step; switch (inputData.step) { case 1: ret.exitCode = 0; ret.writeTxt = "uid " + inputData.idNumber; break; case 2: ret.exitCode = 0; ret.writeTxt = "primary"; break; case 3: ret.exitCode = 0; ret.quitNow = true; break; default: ret.exitCode = -1; ret.quitNow = true; } } else { ret.quitNow = true; EnigmailLog.ERROR("Unknown command prompt: " + keyEdit.getText() + "\n"); ret.exitCode = -1; } } function changePassphraseCallback(inputData, keyEdit, ret) { ret.writeTxt = ""; ret.errorMsg = ""; if (keyEdit.doCheck(GET_HIDDEN, "passphrase.enter")) { switch (inputData.observer.passphraseStatus) { case 0: ret.writeTxt = inputData.oldPw; ret.exitCode = 0; break; case 1: ret.writeTxt = inputData.newPw; ret.exitCode = 0; break; case -1: ret.exitCode = -2; ret.quitNow = true; break; } } else if (keyEdit.doCheck(GET_BOOL, "change_passwd.empty.okay")) { ret.writeTxt = "Y"; ret.exitCode = 0; } else if (keyEdit.doCheck(GET_LINE, "keyedit.prompt")) { ret.exitCode = 0; ret.quitNow = true; } else { ret.quitNow = true; EnigmailLog.ERROR("Unknown command prompt: " + keyEdit.getText() + "\n"); ret.exitCode = -1; } } function deleteUidCallback(inputData, keyEdit, ret) { ret.writeTxt = ""; ret.errorMsg = ""; if (keyEdit.doCheck(GET_LINE, "keyedit.prompt")) { ++inputData.step; switch (inputData.step) { case 1: ret.exitCode = 0; ret.writeTxt = "uid " + inputData.idNumber; break; case 2: ret.exitCode = 0; ret.writeTxt = "deluid"; break; case 4: ret.exitCode = 0; ret.quitNow = true; break; default: ret.exitCode = -1; ret.quitNow = true; } } else if (keyEdit.doCheck(GET_BOOL, "keyedit.remove.uid.okay")) { ++inputData.step; ret.exitCode = 0; ret.writeTxt = "Y"; } else if (keyEdit.doCheck(GET_HIDDEN, "passphrase.adminpin.ask")) { getPin(inputData.parent, EnigmailLocale.getString("enterAdminPin"), ret); } else if (keyEdit.doCheck(GET_HIDDEN, "passphrase.pin.ask")) { getPin(inputData.parent, EnigmailLocale.getString("enterCardPin"), ret); } else { ret.quitNow = true; EnigmailLog.ERROR("Unknown command prompt: " + keyEdit.getText() + "\n"); ret.exitCode = -1; } } function revokeUidCallback(inputData, keyEdit, ret) { ret.writeTxt = ""; ret.errorMsg = ""; if (keyEdit.doCheck(GET_LINE, "keyedit.prompt")) { ++inputData.step; switch (inputData.step) { case 1: ret.exitCode = 0; ret.writeTxt = "uid " + inputData.idNumber; break; case 2: ret.exitCode = 0; ret.writeTxt = "revuid"; break; case 7: ret.exitCode = 0; ret.quitNow = true; break; default: ret.exitCode = -1; ret.quitNow = true; } } else if (keyEdit.doCheck(GET_BOOL, "keyedit.revoke.uid.okay")) { ++inputData.step; ret.exitCode = 0; ret.writeTxt = "Y"; } else if (keyEdit.doCheck(GET_LINE, "ask_revocation_reason.code")) { ++inputData.step; ret.exitCode = 0; ret.writeTxt = "0"; // no reason specified } else if (keyEdit.doCheck(GET_LINE, "ask_revocation_reason.text")) { ++inputData.step; ret.exitCode = 0; ret.writeTxt = ""; } else if (keyEdit.doCheck(GET_BOOL, "ask_revocation_reason.okay")) { ++inputData.step; ret.exitCode = 0; ret.writeTxt = "Y"; } else if (keyEdit.doCheck(GET_HIDDEN, "passphrase.adminpin.ask")) { getPin(inputData.parent, EnigmailLocale.getString("enterAdminPin"), ret); } else if (keyEdit.doCheck(GET_HIDDEN, "passphrase.pin.ask")) { getPin(inputData.parent, EnigmailLocale.getString("enterCardPin"), ret); } else { ret.quitNow = true; EnigmailLog.ERROR("Unknown command prompt: " + keyEdit.getText() + "\n"); ret.exitCode = -1; } } function deleteKeyCallback(inputData, keyEdit, ret) { ret.writeTxt = ""; ret.errorMsg = ""; if (keyEdit.doCheck(GET_BOOL, "delete_key.secret.okay")) { ret.exitCode = 0; ret.writeTxt = "Y"; } else if (keyEdit.doCheck(GET_BOOL, "keyedit.remove.subkey.okay")) { ret.exitCode = 0; ret.writeTxt = "Y"; } else if (keyEdit.doCheck(GET_BOOL, "delete_key.okay")) { ret.exitCode = 0; ret.writeTxt = "Y"; } else if (keyEdit.doCheck(GET_HIDDEN, "passphrase.adminpin.ask")) { getPin(inputData.parent, EnigmailLocale.getString("enterAdminPin"), ret); } else if (keyEdit.doCheck(GET_HIDDEN, "passphrase.pin.ask")) { getPin(inputData.parent, EnigmailLocale.getString("enterCardPin"), ret); } else { ret.quitNow = true; EnigmailLog.ERROR("Unknown command prompt: " + keyEdit.getText() + "\n"); ret.exitCode = -1; } } function getPin(domWindow, promptMsg, ret) { EnigmailLog.DEBUG("keyEdit.jsm: getPin: \n"); var passwdObj = { value: "" }; var dummyObj = {}; var success = false; var promptService = Cc[NS_PROMPTSERVICE_CONTRACTID].getService(Ci.nsIPromptService); success = promptService.promptPassword(domWindow, EnigmailLocale.getString("Enigmail"), promptMsg, passwdObj, null, dummyObj); if (!success) { ret.errorMsg = EnigmailLocale.getString("noPassphrase"); ret.quitNow = true; return false; } EnigmailLog.DEBUG("keyEdit.jsm: getPin: got pin\n"); ret.writeTxt = passwdObj.value; return true; } function genCardKeyCallback(inputData, keyEdit, ret) { ret.writeTxt = ""; ret.errorMsg = ""; var pinObj = {}; if (keyEdit.doCheck(GET_LINE, "cardedit.prompt")) { if (inputData.step === 0) { ret.exitCode = 0; ret.writeTxt = "admin"; } else if (inputData.step == 1) { ret.exitCode = 0; ret.writeTxt = "generate"; } else { ret.exitCode = 0; ret.quitNow = true; ret.writeTxt = "quit"; } ++inputData.step; } else if (keyEdit.doCheck(GET_LINE, "cardedit.genkeys.backup_enc") || keyEdit.doCheck(GET_BOOL, "cardedit.genkeys.backup_enc")) { ret.exitCode = 0; ret.writeTxt = String(inputData.backupKey); } else if (keyEdit.doCheck(GET_BOOL, "cardedit.genkeys.replace_keys")) { ret.exitCode = 0; ret.writeTxt = "Y"; } else if (keyEdit.doCheck(GET_HIDDEN, "passphrase.adminpin.ask")) { getPin(inputData.parent, EnigmailLocale.getString("enterAdminPin"), ret); } else if (keyEdit.doCheck(GET_HIDDEN, "passphrase.pin.ask")) { getPin(inputData.parent, EnigmailLocale.getString("enterCardPin"), ret); } else if (keyEdit.doCheck(GET_HIDDEN, "passphrase.enter")) { ret.exitCode = 0; ret.writeTxt = inputData.backupPasswd; } else if (keyEdit.doCheck(GET_LINE, "keygen.valid")) { ret.exitCode = 0; ret.writeTxt = String(inputData.expiry); } else if (keyEdit.doCheck(GET_LINE, "cardedit.genkeys.size")) { ret.exitCode = 0; ret.writeTxt = "2048"; } else if (keyEdit.doCheck(GET_LINE, "keygen.name")) { ret.exitCode = 0; ret.writeTxt = inputData.name; } else if (keyEdit.doCheck(GET_LINE, "keygen.email")) { ret.exitCode = 0; ret.writeTxt = inputData.email; } else if (keyEdit.doCheck(GET_LINE, "keygen.comment")) { ret.exitCode = 0; if (inputData.comment) { ret.writeTxt = inputData.comment; } else { ret.writeTxt = ""; } } else { ret.quitNow = true; EnigmailLog.ERROR("Unknown command prompt: " + keyEdit.getText() + "\n"); ret.exitCode = -1; } } function cardAdminDataCallback(inputData, keyEdit, ret) { ret.writeTxt = ""; ret.errorMsg = ""; var pinObj = {}; if (keyEdit.doCheck(GET_LINE, "cardedit.prompt")) { ++inputData.step; ret.exitCode = 0; switch (inputData.step) { case 1: ret.writeTxt = "admin"; break; case 2: ret.writeTxt = "name"; break; case 3: ret.writeTxt = "lang"; break; case 4: ret.writeTxt = "sex"; break; case 5: ret.writeTxt = "url"; break; case 6: ret.writeTxt = "login"; break; case 7: if (inputData.forcepin !== 0) { ret.writeTxt = "forcesig"; } else { ret.writeTxt = "quit"; ret.exitCode = 0; ret.quitNow = true; } break; default: ret.writeTxt = "quit"; ret.exitCode = 0; ret.quitNow = true; break; } } else if (keyEdit.doCheck(GET_HIDDEN, "passphrase.adminpin.ask")) { getPin(inputData.parent, EnigmailLocale.getString("enterAdminPin"), ret); } else if (keyEdit.doCheck(GET_HIDDEN, "passphrase.pin.ask")) { getPin(inputData.parent, EnigmailLocale.getString("enterCardPin"), ret); } else if (keyEdit.doCheck(GET_LINE, "keygen.smartcard.surname")) { ret.exitCode = 0; ret.writeTxt = inputData.name.replace(/^$/, "-"); } else if (keyEdit.doCheck(GET_LINE, "keygen.smartcard.givenname")) { ret.exitCode = 0; ret.writeTxt = inputData.firstname.replace(/^$/, "-"); } else if (keyEdit.doCheck(GET_LINE, "cardedit.change_sex")) { ret.exitCode = 0; ret.writeTxt = inputData.sex; } else if (keyEdit.doCheck(GET_LINE, "cardedit.change_lang")) { ret.exitCode = 0; ret.writeTxt = inputData.lang.replace(/^$/, "-"); } else if (keyEdit.doCheck(GET_LINE, "cardedit.change_url")) { ret.exitCode = 0; ret.writeTxt = inputData.url.replace(/^$/, "-"); } else if (keyEdit.doCheck(GET_LINE, "cardedit.change_login")) { ret.exitCode = 0; ret.writeTxt = inputData.login.replace(/^$/, "-"); } else { ret.quitNow = true; EnigmailLog.ERROR("Unknown command prompt: " + keyEdit.getText() + "\n"); ret.exitCode = -1; } } function cardChangePinCallback(inputData, keyEdit, ret) { ret.writeTxt = ""; ret.errorMsg = ""; if (keyEdit.doCheck(GET_LINE, "cardedit.prompt")) { ++inputData.step; ret.exitCode = 0; switch (inputData.step) { case 1: ret.writeTxt = "admin"; break; case 2: ret.writeTxt = "passwd"; break; default: ret.writeTxt = "quit"; ret.exitCode = 0; ret.quitNow = true; break; } } else if (keyEdit.doCheck(GET_HIDDEN, "passphrase.adminpin.ask")) { ret.exitCode = 0; ret.writeTxt = inputData.adminPin; } else if (keyEdit.doCheck(GET_HIDDEN, "passphrase.pin.ask")) { ret.exitCode = 0; ret.writeTxt = inputData.oldPin; } else if (keyEdit.doCheck(GET_HIDDEN, "passphrase.pin.new.ask") || keyEdit.doCheck(GET_HIDDEN, "passphrase.pin.repeat") || keyEdit.doCheck(GET_HIDDEN, "passphrase.ask") || keyEdit.doCheck(GET_HIDDEN, "passphrase.adminpin.new.ask")) { ret.exitCode = 0; ret.writeTxt = inputData.newPin; } else if (keyEdit.doCheck(GET_LINE, "cardutil.change_pin.menu")) { ret.exitCode = 0; ++inputData.pinStep; if (inputData.pinStep == 1) { ret.writeTxt = inputData.action.toString(); } else { ret.writeTxt = "Q"; } } else { ret.exitCode = -1; ret.quitNow = true; EnigmailLog.ERROR("Unknown command prompt: " + keyEdit.getText() + "\n"); } } function addPhotoCallback(inputData, keyEdit, ret) { ret.writeTxt = ""; ret.errorMsg = ""; if (keyEdit.doCheck(GET_LINE, "keyedit.prompt")) { ret.exitCode = 0; ret.writeTxt = "save"; ret.quitNow = true; } else if (keyEdit.doCheck(GET_LINE, "photoid.jpeg.add")) { if (inputData.step === 0) { ++inputData.step; ret.exitCode = 0; ret.writeTxt = inputData.file; } else { ret.exitCode = -1; ret.quitNow = true; } } else if (keyEdit.doCheck(GET_BOOL, "photoid.jpeg.size")) { ret.exitCode = 0; ret.writeTxt = "Y"; // add large file } else if (keyEdit.doCheck(GET_HIDDEN, "passphrase.adminpin.ask")) { getPin(inputData.parent, EnigmailLocale.getString("enterAdminPin"), ret); } else if (keyEdit.doCheck(GET_HIDDEN, "passphrase.pin.ask")) { getPin(inputData.parent, EnigmailLocale.getString("enterCardPin"), ret); } else { ret.quitNow = true; EnigmailLog.ERROR("Unknown command prompt: " + keyEdit.getText() + "\n"); ret.exitCode = -1; } } function EnigCardAdminObserver(guiObserver, isDosLike) { this._guiObserver = guiObserver; this._isDosLike = isDosLike; } EnigCardAdminObserver.prototype = { _guiObserver: null, _failureCode: 0, onDataAvailable: function(data) { var ret = ""; EnigmailLog.DEBUG("keyEdit.jsm: enigCardAdminObserver.onDataAvailable: data=" + data + "\n"); if (this._isDosLike && data.indexOf("[GNUPG:] BACKUP_KEY_CREATED") === 0) { data = data.replace(/\//g, "\\"); } if (data.indexOf("[GNUPG:] SC_OP_FAILURE") >= 0) { data = data.substr(23); if (data == "2") { data = "[GNUPG:] BAD_PASSPHRASE 0"; this._failureCode = 2; } else this._failureCode = 1; } if (this._failureCode == 1) { ret = "[GNUPG:] ENIGMAIL_FAILURE " + data; } if (this._guiObserver) { this._guiObserver.onDataAvailable(data); } return ret; } }; function ChangePasswdObserver() {} ChangePasswdObserver.prototype = { _failureCode: 0, passphraseStatus: 0, onDataAvailable: function(data) { var ret = ""; EnigmailLog.DEBUG("keyEdit.jsm: ChangePasswdObserver.onDataAvailable: data=" + data + "\n"); if (this._failureCode) { ret = "[GNUPG:] ENIGMAIL_FAILURE " + data; } if (data.indexOf("[GNUPG:] GOOD_PASSPHRASE") >= 0) { this.passphraseStatus = 1; } else if (data.indexOf("[GNUPG:] BAD_PASSPHRASE") >= 0) { this.passphraseStatus = -1; } return ret; } }; enigmail-2.0.8/package/keyRefreshService.jsm000066400000000000000000000121351334302754500210540ustar00rootroot00000000000000/*global Components: false */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; const EXPORTED_SYMBOLS = ["EnigmailKeyRefreshService"]; const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ Cu.import("resource://enigmail/keyRing.jsm"); /*global EnigmailKeyRing: false */ Cu.import("resource://enigmail/rng.jsm"); /*global EnigmailRNG: false */ Cu.import("resource://enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ Cu.import("resource://enigmail/keyserver.jsm"); /*global EnigmailKeyServer: false */ Cu.import("resource://enigmail/keyserverUris.jsm"); /*global EnigmailKeyserverURIs: false */ const ONE_HOUR_IN_MILLISEC = 60 * 60 * 1000; let gTimer = null; function getTimer() { if (gTimer === null) gTimer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); return gTimer; } const HOURS_PER_WEEK_ENIGMAIL_IS_ON_PREF = "hoursPerWeekEnigmailIsOn"; const SECONDS_MIN_DELAY = "refreshMinDelaySeconds"; function calculateMaxTimeForRefreshInMilliseconds(totalPublicKeys) { const millisecondsAvailableForRefresh = EnigmailPrefs.getPref(HOURS_PER_WEEK_ENIGMAIL_IS_ON_PREF) * ONE_HOUR_IN_MILLISEC; return Math.floor(millisecondsAvailableForRefresh / totalPublicKeys); } function calculateWaitTimeInMilliseconds(totalPublicKeys) { const randomNumber = EnigmailRNG.generateRandomUint32(); const maxTimeForRefresh = calculateMaxTimeForRefreshInMilliseconds(totalPublicKeys); const minDelay = EnigmailPrefs.getPref(SECONDS_MIN_DELAY) * 1000; EnigmailLog.DEBUG("keyRefreshService.jsm: Wait time = random number: " + randomNumber + " % max time for refresh: " + maxTimeForRefresh + "\n"); let millisec = randomNumber % maxTimeForRefresh; if (millisec < minDelay) { millisec += minDelay; } EnigmailLog.DEBUG("keyRefreshService.jsm: Time until next refresh in milliseconds: " + millisec + "\n"); return millisec; } function refreshKey() { const timer = getTimer(); refreshWith(EnigmailKeyServer, timer, true); } function restartTimerInOneHour(timer) { timer.initWithCallback(refreshKey, ONE_HOUR_IN_MILLISEC, Ci.nsITimer.TYPE_ONE_SHOT); } function setupNextRefresh(timer, waitTime) { timer.initWithCallback(refreshKey, waitTime, Ci.nsITimer.TYPE_ONE_SHOT); } function logMissingInformation(keyIdsExist, validKeyserversExist) { if (!keyIdsExist) { EnigmailLog.DEBUG("keyRefreshService.jsm: No keys available to refresh yet. Will recheck in an hour.\n"); } if (!validKeyserversExist) { EnigmailLog.DEBUG("keyRefreshService.jsm: Either no keyservers exist or the protocols specified are invalid. Will recheck in an hour.\n"); } } function getRandomKeyId(randomNumber) { const keyRingLength = EnigmailKeyRing.getAllKeys().keyList.length; if (keyRingLength === 0) { return null; } return EnigmailKeyRing.getAllKeys().keyList[randomNumber % keyRingLength].keyId; } function refreshKeyIfReady(keyserver, readyToRefresh, keyId) { if (readyToRefresh) { EnigmailLog.DEBUG("keyRefreshService.jsm: refreshing key ID " + keyId + "\n"); keyserver.refresh(keyId); } } function refreshWith(keyserver, timer, readyToRefresh) { const keyId = getRandomKeyId(EnigmailRNG.generateRandomUint32()); const keyIdsExist = keyId !== null; const validKeyserversExist = EnigmailKeyserverURIs.validKeyserversExist(); if (keyIdsExist && validKeyserversExist) { refreshKeyIfReady(keyserver, readyToRefresh, keyId); const waitTime = calculateWaitTimeInMilliseconds(EnigmailKeyRing.getAllKeys().keyList.length); setupNextRefresh(timer, waitTime); } else { logMissingInformation(keyIdsExist, validKeyserversExist); restartTimerInOneHour(timer); } } /** * Starts a process to continuously refresh keys on a random time interval and in random order. * * The default time period for all keys to be refreshed is one week, although the user can specifically set this in their preferences * The wait time to refresh the next key is selected at random, from a range of zero milliseconds to the maximum time to refresh a key * * The maximum time to refresh a single key is calculated by averaging the total refresh time by the total number of public keys to refresh * For example, if a user has 12 public keys to refresh, the maximum time to refresh a single key (by default) will be: milliseconds per week divided by 12 * * This service does not keep state, it will restart each time Enigmail is initialized. * * @param keyserver | dependency injected for testability */ function start(keyserver) { if (EnigmailPrefs.getPref("keyRefreshOn")) { EnigmailLog.DEBUG("keyRefreshService.jsm: Started\n"); const timer = getTimer(); refreshWith(keyserver, timer, false); } } /* This module intializes the continuous key refresh functionality. This includes randomly selecting th key to refresh and the timing to wait between each refresh */ var EnigmailKeyRefreshService = { start: start }; enigmail-2.0.8/package/keyRing.jsm000066400000000000000000002330631334302754500170410ustar00rootroot00000000000000/*global Components: false, btoa: false */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailKeyRing"]; const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; Cu.import("resource://enigmail/core.jsm"); /*global EnigmailCore: false */ Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ Cu.import("resource://enigmail/execution.jsm"); /*global EnigmailExecution: false */ Cu.import("resource://enigmail/locale.jsm"); /*global EnigmailLocale: false */ Cu.import("resource://enigmail/files.jsm"); /*global EnigmailFiles: false */ Cu.import("resource://enigmail/gpg.jsm"); /*global EnigmailGpg: false */ Cu.import("resource://enigmail/trust.jsm"); /*global EnigmailTrust: false */ Cu.import("resource://enigmail/armor.jsm"); /*global EnigmailArmor: false */ Cu.import("resource://enigmail/os.jsm"); /*global EnigmailOS: false */ Cu.import("resource://enigmail/time.jsm"); /*global EnigmailTime: false */ Cu.import("resource://enigmail/data.jsm"); /*global EnigmailData: false */ Cu.import("resource://enigmail/subprocess.jsm"); /*global subprocess: false */ Cu.import("resource://enigmail/funcs.jsm"); /*global EnigmailFuncs: false */ Cu.import("resource://enigmail/lazy.jsm"); /*global EnigmailLazy: false */ Cu.import("resource://enigmail/key.jsm"); /*global EnigmailKey: false */ Cu.import("resource://enigmail/timer.jsm"); /*global EnigmailTimer: false */ Cu.import("resource://gre/modules/Services.jsm"); /* global Services: false */ Cu.import("resource://enigmail/constants.jsm"); /*global EnigmailConstants: false */ const getDialog = EnigmailLazy.loader("enigmail/dialog.jsm", "EnigmailDialog"); const getWindows = EnigmailLazy.loader("enigmail/windows.jsm", "EnigmailWindows"); const getKeyUsability = EnigmailLazy.loader("enigmail/keyUsability.jsm", "EnigmailKeyUsability"); const getOpenPGP = EnigmailLazy.loader("enigmail/openpgp.jsm", "EnigmailOpenPGP"); const NS_RDONLY = 0x01; const NS_WRONLY = 0x02; const NS_CREATE_FILE = 0x08; const NS_TRUNCATE = 0x20; const DEFAULT_FILE_PERMS = 0x180; // equals 0600 const NS_LOCALFILEOUTPUTSTREAM_CONTRACTID = "@mozilla.org/network/file-output-stream;1"; // field ID's of key list (as described in the doc/DETAILS file in the GnuPG distribution) const ENTRY_ID = 0; const KEY_TRUST_ID = 1; const KEY_SIZE_ID = 2; const KEY_ALGO_ID = 3; const KEY_ID = 4; const CREATED_ID = 5; const EXPIRY_ID = 6; const UID_ID = 7; const OWNERTRUST_ID = 8; const USERID_ID = 9; const SIG_TYPE_ID = 10; const KEY_USE_FOR_ID = 11; const UNKNOWN_SIGNATURE = "[User ID not found]"; const KEYTYPE_DSA = 1; const KEYTYPE_RSA = 2; const KEYTYPE_ECC = 3; const ALGO_SYMBOL = { 1: "RSA", 2: "RSA", 3: "RSA", 16: "ELG", 17: "DSA", 18: "ECDH", 19: "ECDSA", 20: "ELG", 22: "EDDSA" }; let gKeygenProcess = null; let gKeyListObj = null; let gKeyIndex = []; let gSubkeyIndex = []; let gKeyCheckDone = false; let gLoadingKeys = false; /* This module operates with a Key Store (array) containing objects with the following properties: * keyList [Array] of |KeyObject|: - keyId - 16 digits (8-byte) public key ID (/not/ preceeded with 0x) - userId - main user ID - fpr - fingerprint - fprFormatted - a formatted version of the fingerprint followin the scheme .... .... .... - expiry - Expiry date as printable string - expiryTime - Expiry time as seconds after 01/01/1970 - created - Key creation date as printable string - keyTrust - key trust code as provided by GnuPG (calculated key validity) - keyUseFor - key usage type as provided by GnuPG (key capabilities) - ownerTrust - owner trust as provided by GnuPG - photoAvailable - [Boolean] true if photo is available - secretAvailable - [Boolean] true if secret key is available - algorithm - public key algorithm type (number) - algoSym - public key algorithm type (String, e.g. RSA) - keySize - size of public key - type - "pub" or "grp" - userIds - [Array]: - Contains ALL UIDs (including the primary UID) * userId - User ID * keyTrust - trust level of user ID * uidFpr - fingerprint of the user ID * type - one of "uid" (regular user ID), "uat" (photo) * uatNum - photo number (starting with 0 for each key) - subKeys - [Array]: * keyId - subkey ID (16 digits (8-byte)) * expiry - Expiry date as printable string * expiryTime - Expiry time as seconds after 01/01/1970 * created - Key creation date as printable string * keyTrust - key trust code as provided by GnuPG * keyUseFor - key usage type as provided by GnuPG * algorithm - subkey algorithm type (number) * algoSym - subkey algorithm type (String, e.g. RSA) * keySize - subkey size * type - "sub" - signatures - [Array]: list of signature objects * userId * uidLabel * created * fpr * sigList: Array of object: { userId, created, signerKeyId, sigType, sigKnown } - methods: * hasSubUserIds * getKeyExpiry * getEncryptionValidity * getSigningValidity * getPubKeyValidity * clone * getMinimalPubKey * getVirtualKeySize * keySortList [Array]: used for quickly sorting the keys - userId (in lower case) - keyId - keyNum * trustModel: [String]. One of: - p: pgp/classical - t: always trust - a: auto (:0) (default, currently pgp/classical) - T: TOFU - TP: TOFU+PGP */ const TRUSTLEVELS_SORTED = EnigmailTrust.trustLevelsSorted(); var EnigmailKeyRing = { /** * Get the complete list of all public keys, optionally sorted by a column * * @param win - optional |object| holding the parent window for displaying error messages * @param sortColumn - optional |string| containing the column name for sorting. One of: * userid, keyid, keyidshort, fpr, keytype, validity, trust, expiry * @param sortDirection - |number| 1 = ascending / -1 = descending * * @return keyListObj - |object| { keyList, keySortList } (see above) */ getAllKeys: function(win, sortColumn, sortDirection) { if (gKeyListObj.keySortList.length === 0) { loadKeyList(win, sortColumn, sortDirection); getWindows().keyManReloadKeys(); if (!gKeyCheckDone) { gKeyCheckDone = true; runKeyUsabilityCheck(); } } else { if (sortColumn) { gKeyListObj.keySortList.sort(getSortFunction(sortColumn.toLowerCase(), gKeyListObj, sortDirection)); } } return gKeyListObj; }, /** * get a list of all (valid, usable) keys that have a secret key * * @param Boolean onlyValidKeys: if true, only filter valid usable keys * * @return Array of KeyObjects containing the found keys (sorted by userId) **/ getAllSecretKeys: function(onlyValidKeys = false) { this.getAllKeys(); // ensure keylist is loaded; let res = []; this.getAllKeys(); // ensure keylist is loaded; if (!onlyValidKeys) { for (let key of gKeyListObj.keyList) { if (key.secretAvailable) res.push(key); } } else { for (let key of gKeyListObj.keyList) { if (key.secretAvailable && key.keyUseFor.search(/D/) < 0) { // key is not disabled and _usable_ for encryption signing and certification if (key.keyUseFor.search(/E/) >= 0 && key.keyUseFor.search(/S/) >= 0 && key.keyUseFor.search(/C/) >= 0) { res.push(key); } } } } res.sort(function(a, b) { return a.userId == b.userId ? (a.keyId < b.keyId ? -1 : 1) : (a.userId.toLowerCase() < b.userId.toLowerCase() ? -1 : 1); }); return res; }, /** * get 1st key object that matches a given key ID or subkey ID * * @param keyId - String: key Id with 16 characters (preferred) or 8 characters), * or fingerprint (40 or 32 characters). * Optionally preceeded with "0x" * @param noLoadKeys - Boolean [optional]: do not try to load the key list first * * @return Object - found KeyObject or null if key not found */ getKeyById: function(keyId, noLoadKeys) { EnigmailLog.DEBUG("keyRing.jsm: getKeyById: " + keyId + "\n"); let s; if (keyId.search(/^0x/) === 0) { keyId = keyId.substr(2); } if (!noLoadKeys) { this.getAllKeys(); // ensure keylist is loaded; } let keyObj = gKeyIndex[keyId]; if (keyObj === undefined) { keyObj = gSubkeyIndex[keyId]; } return keyObj !== undefined ? keyObj : null; }, /** * get all key objects that match a given user ID * * @param searchTerm - String: a regular expression to match against all UIDs of the keys. * The search is always performed case-insensitively * An empty string will return no result * @param onlyValidUid - Boolean: if true (default), invalid (e.g. revoked) UIDs are not matched * * @return Array of KeyObjects with the found keys (array length is 0 if no key found) */ getKeysByUserId: function(searchTerm, onlyValidUid = true) { EnigmailLog.DEBUG("keyRing.jsm: getKeysByUserId: '" + searchTerm + "'\n"); let s = new RegExp(searchTerm, "i"); let res = []; this.getAllKeys(); // ensure keylist is loaded; if (searchTerm === "") return res; for (let i in gKeyListObj.keyList) { let k = gKeyListObj.keyList[i]; for (let j in k.userIds) { if (k.userIds[j].type === "uid" && k.userIds[j].userId.search(s) >= 0) { if (!onlyValidUid || (!EnigmailTrust.isInvalid(k.userIds[j].keyTrust))) { res.push(k); continue; } } } } return res; }, /** * Specialized function for getSecretKeyByUserId() that takes into account * the specifics of email addresses in UIDs. * * @param emailAddr: String - email address to search for without any angulars * or names * * @return KeyObject with the found key, or null if no key found */ getSecretKeyByEmail: function(emailAddr) { // sanitize email address emailAddr = emailAddr.replace(/([\.\[\]\-\\])/g, "\\$1"); let searchTerm = "(<" + emailAddr + ">| " + emailAddr + "$|^" + emailAddr + "$)"; return this.getSecretKeyByUserId(searchTerm); }, /** * get the "best" possible secret key for a given user ID * * @param searchTerm - String: a regular expression to match against all UIDs of the keys. * The search is always performed case-insensitively * @return KeyObject with the found key, or null if no key found */ getSecretKeyByUserId: function(searchTerm) { EnigmailLog.DEBUG("keyRing.jsm: getSecretKeyByUserId: '" + searchTerm + "'\n"); let keyList = this.getKeysByUserId(searchTerm, true); let foundKey = null; for (let key of keyList) { if (key.secretAvailable && key.getEncryptionValidity().keyValid && key.getSigningValidity().keyValid) { if (!foundKey) { foundKey = key; } else { // prefer RSA or DSA over ECC (long-term: change this once ECC keys are widely supported) if (foundKey.algoSym === key.algoSym && foundKey.keySize === key.keySize) { if (key.expiryTime > foundKey.expiryTime) foundKey = key; } else if (foundKey.algoSym.search(/^(DSA|RSA)$/) < 0 && key.algoSym.search(/^(DSA|RSA)$/) === 0) { foundKey = key; } else { if (key.getVirtualKeySize() > foundKey.getVirtualKeySize()) foundKey = key; } } } } return foundKey; }, /** * get a list of keys for a given set of (sub-) key IDs * * @param keyIdList: Array of key IDs OR String, with space-separated list of key IDs */ getKeyListById: function(keyIdList) { EnigmailLog.DEBUG("keyRing.jsm: getKeyListById: '" + keyIdList + "'\n"); let keyArr; if (typeof keyIdList === "string") { keyArr = keyIdList.split(/ +/); } else { keyArr = keyIdList; } let ret = []; for (let i in keyArr) { let r = this.getKeyById(keyArr[i]); if (r) ret.push(r); } return ret; }, importKeyFromFile: function(inputFile, errorMsgObj, importedKeysObj) { EnigmailLog.DEBUG("keyRing.jsm: EnigmailKeyRing.importKeyFromFile: fileName=" + inputFile.path + "\n"); var command = EnigmailGpg.agentPath; var args = EnigmailGpg.getStandardArgs(false).concat(["--no-verbose", "--status-fd", "2", "--no-auto-check-trustdb", "--import"]); importedKeysObj.value = ""; var fileName = EnigmailFiles.getEscapedFilename((inputFile.QueryInterface(Ci.nsIFile)).path); args.push(fileName); var statusFlagsObj = {}; var statusMsgObj = {}; var exitCodeObj = {}; var output = EnigmailExecution.execCmd(command, args, "", exitCodeObj, statusFlagsObj, statusMsgObj, errorMsgObj); EnigmailLog.DEBUG("keyRing.jsm: EnigmailKeyRing.importKeyFromFile: error=" + errorMsgObj.value + "\n"); var statusMsg = statusMsgObj.value; var keyList = []; let importedKeys = []; let importSum = 0; let importUnchanged = 0; // IMPORT_RES 0 if (statusMsg) { let import_res = statusMsg.match(/^IMPORT_RES ([0-9]+) ([0-9]+) ([0-9]+) 0 ([0-9]+)/m); if (import_res !== null) { // Normal importSum = parseInt(import_res[1], 10); importUnchanged = parseInt(import_res[4], 10); exitCodeObj.value = 0; var statusLines = statusMsg.split(/\r?\n/); for (let j = 0; j < statusLines.length; j++) { var matches = statusLines[j].match(/IMPORT_OK ([0-9]+) (\w+)/); if (matches && (matches.length > 2)) { if (typeof(keyList[matches[2]]) != "undefined") { keyList[matches[2]] |= Number(matches[1]); } else keyList[matches[2]] = Number(matches[1]); importedKeys.push(matches[2]); EnigmailLog.DEBUG("keyRing.jsm: EnigmailKeyRing.importKeyFromFile: imported " + matches[2] + ":" + matches[1] + "\n"); } } for (let j in keyList) { importedKeysObj.value += j + ":" + keyList[j] + ";"; } } } if (importedKeys.length > 0) { EnigmailKeyRing.updateKeys(importedKeys); } else if (importSum > importUnchanged) { EnigmailKeyRing.clearCache(); } return exitCodeObj.value; }, /** * Get groups defined in gpg.conf in the same structure as KeyObject * * @return Array of KeyObject, with type = "grp" */ getGroups: function() { let groups = EnigmailGpg.getGpgGroups(); let r = []; for (var i = 0; i < groups.length; i++) { let keyObj = new KeyObject(["grp"]); keyObj.keyTrust = "g"; keyObj.userId = EnigmailData.convertGpgToUnicode(groups[i].alias).replace(/\\e3A/g, ":"); keyObj.keyId = keyObj.userId; var grpMembers = EnigmailData.convertGpgToUnicode(groups[i].keylist).replace(/\\e3A/g, ":").split(/[,;]/); for (var grpIdx = 0; grpIdx < grpMembers.length; grpIdx++) { keyObj.userIds.push({ userId: grpMembers[grpIdx], keyTrust: "q" }); } r.push(keyObj); } return r; }, /** * empty the key cache, such that it will get loaded next time it is accessed * * no input or return values */ clearCache: function() { EnigmailLog.DEBUG("keyRing.jsm: EnigmailKeyRing.clearCache\n"); gKeyListObj = { keyList: [], keySortList: [] }; gKeyIndex = []; gSubkeyIndex = []; }, /** * Check if the cache is empty * * @return Boolean: true: cache cleared */ getCacheEmpty: function() { return (gKeyIndex.length === 0); }, /** * Get a list of UserIds for a given key. * Only the Only UIDs with highest trust level are returned. * * @param String keyId key, optionally preceeded with 0x * * @return Array of String: list of UserIds */ getValidUids: function(keyId) { let r = []; let keyObj = this.getKeyById(keyId); if (keyObj) { const TRUSTLEVELS_SORTED = EnigmailTrust.trustLevelsSorted(); let hideInvalidUid = true; let maxTrustLevel = TRUSTLEVELS_SORTED.indexOf(keyObj.keyTrust); if (EnigmailTrust.isInvalid(keyObj.keyTrust)) { // pub key not valid (anymore)-> display all UID's hideInvalidUid = false; } for (let i in keyObj.userIds) { if (keyObj.userIds[i].type !== "uat") { if (hideInvalidUid) { let thisTrust = TRUSTLEVELS_SORTED.indexOf(keyObj.userIds[i].keyTrust); if (thisTrust > maxTrustLevel) { r = [keyObj.userIds[i].userId]; maxTrustLevel = thisTrust; } else if (thisTrust === maxTrustLevel) { r.push(keyObj.userIds[i].userId); } // else do not add uid } else if (!EnigmailTrust.isInvalid(keyObj.userIds[i].keyTrust) || !hideInvalidUid) { // UID valid OR key not valid, but invalid keys allowed r.push(keyObj.userIds[i].userId); } } } } return r; }, /** * Export public and possibly secret key(s) to a file * * @param includeSecretKey Boolean - if true, secret keys are exported * @param userId String - space or comma separated list of keys to export. Specification by * key ID, fingerprint, or userId * @param outputFile String or nsIFile - output file name or Object - or NULL * @param exitCodeObj Object - o.value will contain exit code * @param errorMsgObj Object - o.value will contain error message from GnuPG * * @return String - if outputFile is NULL, the key block data; "" if a file is written */ extractKey: function(includeSecretKey, userId, outputFile, exitCodeObj, errorMsgObj) { EnigmailLog.DEBUG("keyRing.jsm: EnigmailKeyRing.extractKey: " + userId + "\n"); let args = EnigmailGpg.getStandardArgs(true).concat(["-a", "--export"]); if (userId) { args = args.concat(userId.split(/[ ,\t]+/)); } const cmdErrorMsgObj = {}; let keyBlock = EnigmailExecution.execCmd(EnigmailGpg.agentPath, args, "", exitCodeObj, {}, {}, cmdErrorMsgObj); if ((exitCodeObj.value === 0) && !keyBlock) { exitCodeObj.value = -1; } if (exitCodeObj.value !== 0) { errorMsgObj.value = EnigmailLocale.getString("failKeyExtract"); if (cmdErrorMsgObj.value) { errorMsgObj.value += "\n" + EnigmailFiles.formatCmdLine(EnigmailGpg.agentPath, args); errorMsgObj.value += "\n" + cmdErrorMsgObj.value; } return ""; } if (includeSecretKey) { const secKeyBlock = this.extractSecretKey(false, userId, exitCodeObj, cmdErrorMsgObj); if (keyBlock.substr(-1, 1).search(/[\r\n]/) < 0) { keyBlock += "\n"; } keyBlock += secKeyBlock; } if (outputFile) { if (!EnigmailFiles.writeFileContents(outputFile, keyBlock, DEFAULT_FILE_PERMS)) { exitCodeObj.value = -1; errorMsgObj.value = EnigmailLocale.getString("fileWriteFailed", [outputFile]); } return ""; } return keyBlock; }, /** * Export secret key(s) to a file * * @param minimalKey Boolean - if true, reduce key to minimum required * @param userId String - space or comma separated list of keys to export. Specification by * key ID, fingerprint, or userId * @param exitCodeObj Object - o.value will contain exit code * @param errorMsgObj Object - o.value will contain error message from GnuPG * * @return String */ extractSecretKey: function(minimalKey, userId, exitCodeObj, errorMsgObj) { let args = EnigmailGpg.getStandardArgs(true); if (minimalKey) { args.push("--export-options"); args.push("export-minimal,no-export-attributes"); } args.push("-a"); args.push("--export-secret-keys"); if (userId) { args = args.concat(userId.split(/[ ,\t]+/)); } let cmdErrorMsgObj = {}; const secKeyBlock = EnigmailExecution.execCmd(EnigmailGpg.agentPath, args, "", exitCodeObj, {}, {}, cmdErrorMsgObj); if (secKeyBlock) { exitCodeObj.value = 0; } else { exitCodeObj.value = -1; } if (exitCodeObj.value !== 0) { errorMsgObj.value = EnigmailLocale.getString("failKeyExtract"); if (cmdErrorMsgObj.value) { errorMsgObj.value += "\n" + EnigmailFiles.formatCmdLine(EnigmailGpg.agentPath, args); errorMsgObj.value += "\n" + cmdErrorMsgObj.value; } return ""; } return secKeyBlock; }, /** * Export the ownertrust database from GnuPG * @param outputFile String or nsIFile - output file name or Object - or NULL * @param exitCodeObj Object - o.value will contain exit code * @param errorMsgObj Object - o.value will contain error message from GnuPG * * @return String - if outputFile is NULL, the key block data; "" if a file is written */ extractOwnerTrust: function(outputFile, exitCodeObj, errorMsgObj) { let args = EnigmailGpg.getStandardArgs(true).concat(["--export-ownertrust"]); let trustData = EnigmailExecution.execCmd(EnigmailGpg.agentPath, args, "", exitCodeObj, {}, {}, errorMsgObj); if (outputFile) { if (!EnigmailFiles.writeFileContents(outputFile, trustData, DEFAULT_FILE_PERMS)) { exitCodeObj.value = -1; errorMsgObj.value = EnigmailLocale.getString("fileWriteFailed", [outputFile]); } return ""; } return trustData; }, /** * Import the ownertrust database into GnuPG * @param inputFile String or nsIFile - input file name or Object - or NULL * @param errorMsgObj Object - o.value will contain error message from GnuPG * * @return exit code */ importOwnerTrust: function(inputFile, errorMsgObj) { let args = EnigmailGpg.getStandardArgs(true).concat(["--import-ownertrust"]); let exitCodeObj = {}; try { let trustData = EnigmailFiles.readFile(inputFile); EnigmailExecution.execCmd(EnigmailGpg.agentPath, args, trustData, exitCodeObj, {}, {}, errorMsgObj); } catch (ex) {} return exitCodeObj.value; }, /** * import key from provided key data * * @param parent nsIWindow * @param isInteractive Boolean - if true, display confirmation dialog * @param keyBlock String - data containing key * @param keyId String - key ID expected to import (no meaning) * @param errorMsgObj Object - o.value will contain error message from GnuPG * @param importedKeysObj Object - [OPTIONAL] o.value will contain an array of the key FPRs imported * * @return Integer - exit code: * ExitCode == 0 => success * ExitCode > 0 => error * ExitCode == -1 => Cancelled by user */ importKey: function(parent, isInteractive, keyBlock, keyId, errorMsgObj, importedKeysObj) { EnigmailLog.DEBUG("keyRing.jsm: EnigmailKeyRing.importKey: id=" + keyId + ", " + isInteractive + "\n"); const beginIndexObj = {}; const endIndexObj = {}; const blockType = EnigmailArmor.locateArmoredBlock(keyBlock, 0, "", beginIndexObj, endIndexObj, {}); if (!blockType) { errorMsgObj.value = EnigmailLocale.getString("noPGPblock"); return 1; } if (blockType.search(/^(PUBLIC|PRIVATE) KEY BLOCK$/) !== 0) { errorMsgObj.value = EnigmailLocale.getString("notFirstBlock"); return 1; } const pgpBlock = keyBlock.substr(beginIndexObj.value, endIndexObj.value - beginIndexObj.value + 1); if (isInteractive) { if (!(getDialog().confirmDlg(parent, EnigmailLocale.getString("importKeyConfirm"), EnigmailLocale.getString("keyMan.button.import")))) { errorMsgObj.value = EnigmailLocale.getString("failCancel"); return -1; } } const args = EnigmailGpg.getStandardArgs(false).concat(["--no-verbose", "--status-fd", "2", "--no-auto-check-trustdb", "--import"]); const exitCodeObj = {}; const statusMsgObj = {}; EnigmailExecution.execCmd(EnigmailGpg.agentPath, args, pgpBlock, exitCodeObj, {}, statusMsgObj, errorMsgObj); const statusMsg = statusMsgObj.value; if (!importedKeysObj) { importedKeysObj = {}; } importedKeysObj.value = []; let exitCode = 1; if (statusMsg && (statusMsg.search(/^IMPORT_RES /m) > -1)) { exitCode = 0; // Normal return if (statusMsg.search(/^IMPORT_OK /m) > -1) { let l = statusMsg.split(/\r|\n/); for (let i = 0; i < l.length; i++) { const matches = l[i].match(/^(IMPORT_OK [0-9]+ )(([0-9a-fA-F]{8}){2,5})/); if (matches && (matches.length > 2)) { EnigmailLog.DEBUG("enigmail.js: Enigmail.importKey: IMPORTED 0x" + matches[2] + "\n"); importedKeysObj.value.push(matches[2]); } } if (importedKeysObj.value.length > 0) { EnigmailKeyRing.updateKeys(importedKeysObj.value); } } } return exitCode; }, /** * Extract a photo ID from a key, store it as file and return the file object. * @keyId: String - Key ID * @photoNumber: Number - number of the photo on the key, starting with 0 * @exitCodeObj: Object - value holds exitCode (0 = success) * @errorMsgObj: Object - value holds errorMsg * * @return: nsIFile object or null in case no data / error. */ getPhotoFile: function(keyId, photoNumber, exitCodeObj, errorMsgObj) { EnigmailLog.DEBUG("keyRing.js: EnigmailKeyRing.getPhotoFile, keyId=" + keyId + " photoNumber=" + photoNumber + "\n"); const args = EnigmailGpg.getStandardArgs(false). concat(["--no-secmem-warning", "--no-verbose", "--no-auto-check-trustdb", "--batch", "--no-tty", "--no-verbose", "--status-fd", "1", "--attribute-fd", "2", "--fixed-list-mode", "--list-keys", keyId ]); const photoDataObj = {}; const outputTxt = EnigmailExecution.simpleExecCmd(EnigmailGpg.agentPath, args, exitCodeObj, photoDataObj); if (!outputTxt) { exitCodeObj.value = -1; return null; } if (EnigmailOS.isDosLike && EnigmailGpg.getGpgFeature("windows-photoid-bug")) { // workaround for error in gpg photoDataObj.value = photoDataObj.value.replace(/\r\n/g, "\n"); } // [GNUPG:] ATTRIBUTE A053069284158FC1E6770BDB57C9EB602B0717E2 2985 let foundPicture = -1; let skipData = 0; let imgSize = -1; const statusLines = outputTxt.split(/[\n\r+]/); for (let i = 0; i < statusLines.length; i++) { const matches = statusLines[i].match(/\[GNUPG:\] ATTRIBUTE ([A-F\d]+) (\d+) (\d+) (\d+) (\d+) (\d+) (\d+) (\d+)/); if (matches && matches[3] == "1") { // attribute is an image foundPicture++; if (foundPicture === photoNumber) { imgSize = Number(matches[2]); break; } else { skipData += Number(matches[2]); } } } if (foundPicture >= 0 && foundPicture === photoNumber) { if (photoDataObj.value.search(/^gpg: /) === 0) { // skip disturbing gpg output let i = photoDataObj.value.search(/\n/) + 1; skipData += i; } const pictureData = photoDataObj.value.substr(16 + skipData, imgSize); if (!pictureData.length) { return null; } try { const flags = NS_WRONLY | NS_CREATE_FILE | NS_TRUNCATE; const picFile = EnigmailFiles.getTempDirObj(); picFile.append(keyId + ".jpg"); picFile.createUnique(picFile.NORMAL_FILE_TYPE, DEFAULT_FILE_PERMS); const fileStream = Cc[NS_LOCALFILEOUTPUTSTREAM_CONTRACTID].createInstance(Ci.nsIFileOutputStream); fileStream.init(picFile, flags, DEFAULT_FILE_PERMS, 0); if (fileStream.write(pictureData, pictureData.length) !== pictureData.length) { fileStream.close(); throw Components.results.NS_ERROR_FAILURE; } fileStream.flush(); fileStream.close(); // delete picFile upon exit let extAppLauncher = Cc["@mozilla.org/mime;1"].getService(Ci.nsPIExternalAppLauncher); extAppLauncher.deleteTemporaryFileOnExit(picFile); return picFile; } catch (ex) { exitCodeObj.value = -1; return null; } } return null; }, isGeneratingKey: function() { return gKeygenProcess !== null; }, /** * Generate a new key pair with GnuPG * * @name: String - name part of UID * @comment: String - comment part of UID (brackets are added) * @comment: String - email part of UID (<> will be added) * @expiryDate: Number - Unix timestamp of key expiry date; 0 if no expiry * @keyLength: Number - size of key in bytes (e.g 4096) * @keyType: Number - 1 = DSA / 2 = RSA * @passphrase: String - password; null if no password * @listener: Object - { * function onDataAvailable(data) {...}, * function onStopRequest(exitCode) {...} * } * * @return: handle to process */ generateKey: function(name, comment, email, expiryDate, keyLength, keyType, passphrase, listener) { EnigmailLog.WRITE("keyRing.jsm: generateKey:\n"); if (EnigmailKeyRing.isGeneratingKey()) { // key generation already ongoing throw Components.results.NS_ERROR_FAILURE; } const args = EnigmailGpg.getStandardArgs(true).concat(["--gen-key"]); EnigmailLog.CONSOLE(EnigmailFiles.formatCmdLine(EnigmailGpg.agentPath, args)); let inputData = "%echo Generating key\nKey-Type: "; switch (keyType) { case KEYTYPE_DSA: inputData += "DSA\nKey-Length: " + keyLength + "\nSubkey-Type: 16\nSubkey-Length: " + keyLength + "\n"; break; case KEYTYPE_RSA: inputData += "RSA\nKey-Usage: sign,auth\nKey-Length: " + keyLength; inputData += "\nSubkey-Type: RSA\nSubkey-Usage: encrypt\nSubkey-Length: " + keyLength + "\n"; break; case KEYTYPE_ECC: inputData += "EDDSA\nKey-Curve: Ed25519\nKey-Usage: sign\n"; inputData += "Subkey-Type: ECDH\nSubkey-Curve: Curve25519\nSubkey-Usage: encrypt\n"; break; default: return null; } if (name.replace(/ /g, "").length) { inputData += "Name-Real: " + name + "\n"; } if (comment && comment.replace(/ /g, "").length) { inputData += "Name-Comment: " + comment + "\n"; } inputData += "Name-Email: " + email + "\n"; inputData += "Expire-Date: " + String(expiryDate) + "\n"; EnigmailLog.CONSOLE(inputData + " \n"); if (passphrase.length) { inputData += "Passphrase: " + passphrase + "\n"; } else { if (EnigmailGpg.getGpgFeature("genkey-no-protection")) { inputData += "%echo no-protection\n"; inputData += "%no-protection\n"; } } inputData += "%commit\n%echo done\n"; let proc = null; try { proc = subprocess.call({ command: EnigmailGpg.agentPath, arguments: args, environment: EnigmailCore.getEnvList(), charset: null, stdin: function(pipe) { pipe.write(inputData); pipe.close(); }, stderr: function(data) { listener.onDataAvailable(data); }, done: function(result) { gKeygenProcess = null; try { if (result.exitCode === 0) { EnigmailKeyRing.clearCache(); } listener.onStopRequest(result.exitCode); } catch (ex) {} }, mergeStderr: false }); } catch (ex) { EnigmailLog.ERROR("keyRing.jsm: generateKey: subprocess.call failed with '" + ex.toString() + "'\n"); throw ex; } gKeygenProcess = proc; EnigmailLog.DEBUG("keyRing.jsm: generateKey: subprocess = " + proc + "\n"); return proc; }, /** * try to find valid key for encryption to passed email address * * @param details if not null returns error in details.msg * * @return: found key ID (without leading "0x") or null */ getValidKeyForRecipient: function(emailAddr, minTrustLevelIndex, details) { EnigmailLog.DEBUG("keyRing.jsm: getValidKeyForRecipient(): emailAddr=\"" + emailAddr + "\"\n"); const TRUSTLEVELS_SORTED = EnigmailTrust.trustLevelsSorted(); const fullTrustIndex = TRUSTLEVELS_SORTED.indexOf("f"); emailAddr = emailAddr.toLowerCase(); var embeddedEmailAddr = "<" + emailAddr + ">"; // note: we can't take just the first matched because we might have faked keys as duplicates var foundKeyId = null; var foundTrustLevel = null; var foundKeyTrustIndex = null; let k = this.getAllKeys(null, "validity", -1); let keyList = k.keyList; let keySortList = k.keySortList; // **** LOOP to check against each key // - note: we have sorted the keys according to validity // to abort the loop as soon as we reach keys that are not valid enough for (var idx = 0; idx < keySortList.length; idx++) { var keyObj = keyList[keySortList[idx].keyNum]; var keyTrust = keyObj.keyTrust; var keyTrustIndex = TRUSTLEVELS_SORTED.indexOf(keyTrust); //EnigmailLog.DEBUG("keyRing.jsm: getValidKeyForRecipient(): check key " + keyObj.keyId + "\n"); // key trust (our sort criterion) too low? // => *** regular END of the loop if (keyTrustIndex < minTrustLevelIndex) { if (!foundKeyId) { if (details) { details.msg = "ProblemNoKey"; } let msg = "no key with enough trust level for '" + emailAddr + "' found"; EnigmailLog.DEBUG("keyRing.jsm: getValidKeyForRecipient(): " + msg + "\n"); } return foundKeyId; // **** regular END OF LOOP (return NULL or found single key) } // key valid for encryption? if (keyObj.keyUseFor.indexOf("E") < 0) { //EnigmailLog.DEBUG("keyRing.jsm: getValidKeyForRecipient(): skip key " + keyObj.keyId + " (not provided for encryption)\n"); continue; // not valid for encryption => **** CONTINUE the LOOP } // key disabled? if (keyObj.keyUseFor.indexOf("D") >= 0) { //EnigmailLog.DEBUG("keyRing.jsm: getValidKeyForRecipient(): skip key " + keyObj.keyId + " (disabled)\n"); continue; // disabled => **** CONTINUE the LOOP } // check against the user ID var userId = keyObj.userId.toLowerCase(); if (userId && (userId == emailAddr || userId.indexOf(embeddedEmailAddr) >= 0)) { if (keyTrustIndex < minTrustLevelIndex) { EnigmailLog.DEBUG("keyRing.jsm: getValidKeyForRecipient(): matching key=" + keyObj.keyId + " found but not enough trust\n"); } else { // key with enough trust level found EnigmailLog.DEBUG("keyRing.jsm: getValidKeyForRecipient(): key=" + keyObj.keyId + " keyTrust=\"" + keyTrust + "\" found\n"); // immediately return if a fully or ultimately trusted key is found // (faked keys should not be an issue here, so we don't have to check other keys) if (keyTrustIndex >= fullTrustIndex) { return keyObj.keyId; } if (foundKeyId != keyObj.keyId) { // new matching key found (note: might find same key via subkeys) if (foundKeyId) { // different matching keys found if (foundKeyTrustIndex > keyTrustIndex) { return foundKeyId; // OK, previously found key has higher trust level } // error because we have two keys with same trust level // => let the user decide (to prevent from using faked keys with default trust level) if (details) { details.msg = "ProblemMultipleKeys"; } let msg = "multiple matching keys with same trust level found for '" + emailAddr + "' "; EnigmailLog.DEBUG("keyRing.jsm: getValidKeyForRecipient(): " + msg + " trustLevel=\"" + keyTrust + "\" (0x" + foundKeyId + " and 0x" + keyObj.keyId + ")\n"); return null; } // save found key to compare with other matching keys (handling of faked keys) foundKeyId = keyObj.keyId; foundKeyTrustIndex = keyTrustIndex; } continue; // matching key found (again) => **** CONTINUE the LOOP (don't check Sub-UserIDs) } } // check against the sub user ID // (if we are here, the primary user ID didn't match) // - Note: sub user IDs have NO owner trust for (var subUidIdx = 1; subUidIdx < keyObj.userIds.length; subUidIdx++) { var subUidObj = keyObj.userIds[subUidIdx]; var subUserId = subUidObj.userId.toLowerCase(); var subUidTrust = subUidObj.keyTrust; var subUidTrustIndex = TRUSTLEVELS_SORTED.indexOf(subUidTrust); //EnigmailLog.DEBUG("keyRing.jsm: getValidKeyForRecipient(): check subUid " + subUidObj.keyId + "\n"); if (subUserId && (subUserId == emailAddr || subUserId.indexOf(embeddedEmailAddr) >= 0)) { if (subUidTrustIndex < minTrustLevelIndex) { EnigmailLog.DEBUG("keyRing.jsm: getValidKeyForRecipient(): matching subUid=" + keyObj.keyId + " found but not enough trust\n"); } else { // subkey with enough trust level found EnigmailLog.DEBUG("keyRing.jsm: getValidKeyForRecipient(): matching subUid in key=" + keyObj.keyId + " keyTrust=\"" + keyTrust + "\" found\n"); if (keyTrustIndex >= fullTrustIndex) { // immediately return if a fully or ultimately trusted key is found // (faked keys should not be an issue here, so we don't have to check other keys) return keyObj.keyId; } if (foundKeyId != keyObj.keyId) { // new matching key found (note: might find same key via different subkeys) if (foundKeyId) { // different matching keys found if (foundKeyTrustIndex > subUidTrustIndex) { return foundKeyId; // OK, previously found key has higher trust level } // error because we have two keys with same trust level // => let the user decide (to prevent from using faked keys with default trust level) if (details) { details.msg = "ProblemMultipleKeys"; } let msg = "multiple matching keys with same trust level found for '" + emailAddr + "' "; EnigmailLog.DEBUG("keyRing.jsm: getValidKeyForRecipient(): " + msg + " trustLevel=\"" + keyTrust + "\" (0x" + foundKeyId + " and 0x" + keyObj.keyId + ")\n"); return null; } // save found key to compare with other matching keys (handling of faked keys) foundKeyId = keyObj.keyId; foundKeyTrustIndex = subUidTrustIndex; } } } } } // **** LOOP to check against each key if (!foundKeyId) { EnigmailLog.DEBUG("keyRing.jsm: getValidKeyForRecipient(): no key for '" + emailAddr + "' found\n"); } return foundKeyId; }, /** * Determine the key ID for a set of given addresses * * @param addresses: Array of String - email addresses * @param minTrustLevel: String - f for Fully trusted keys / ? for any valid key * @param details: Object - holds details for invalid keys: * - errArray: { * * addr: email addresses * * msg: related error * } * @param resultingArray: Array of String - list of found key IDs * * @return Boolean: true if at least one key missing; false otherwise */ getValidKeysForAllRecipients: function(addresses, minTrustLevel, details, resultingArray) { let minTrustLevelIndex = TRUSTLEVELS_SORTED.indexOf(minTrustLevel); // check whether each address is or has a key: let keyMissing = false; if (details) { details.errArray = []; } for (let i = 0; i < addresses.length; i++) { let addr = addresses[i]; // try to find current address in key list: var found = false; var errMsg = null; if (addr.indexOf('@') >= 0) { // try email match: var addrErrDetails = {}; let keyId = this.getValidKeyForRecipient(addr, minTrustLevelIndex, addrErrDetails); if (details && addrErrDetails.msg) { errMsg = addrErrDetails.msg; } if (keyId) { found = true; resultingArray.push("0x" + keyId.toUpperCase()); } } else { // try key match: var keyObj = this.getKeyById(addr); if (keyObj) { // if found, check whether the trust level is enough if (TRUSTLEVELS_SORTED.indexOf(keyObj.keyTrust) >= minTrustLevelIndex) { found = true; resultingArray.push("0x" + keyObj.keyId.toUpperCase()); } } } if (!found) { // no key for this address found keyMissing = true; if (details) { if (!errMsg) { errMsg = "ProblemNoKey"; } var detailsElem = {}; detailsElem.addr = addr; detailsElem.msg = errMsg; details.errArray.push(detailsElem); } EnigmailLog.DEBUG("keyRing.jsm: doValidKeysForAllRecipients(): return null (no single valid key found for=\"" + addr + "\" with minTrustLevel=\"" + minTrustLevel + "\")\n"); } } return keyMissing; }, /** * Rebuild the quick access search indexes after the key list was loaded */ rebuildKeyIndex: function() { gKeyIndex = []; gSubkeyIndex = []; for (let i in gKeyListObj.keyList) { let k = gKeyListObj.keyList[i]; gKeyIndex[k.keyId] = k; gKeyIndex[k.fpr] = k; gKeyIndex[k.keyId.substr(-8, 8)] = k; // add subkeys for (let j in k.subKeys) { gSubkeyIndex[k.subKeys[j].keyId] = k; } } }, /** * Update specific keys in the key cache. If the key objects don't exist yet, * they will be created * * @param keys: Array of String - key IDs or fingerprints */ updateKeys: function(keys) { EnigmailLog.DEBUG("keyRing.jsm: updateKeys(" + keys.join(",") + ")\n"); let uniqueKeys = [...new Set(keys)]; // make key IDs unique deleteKeysFromCache(uniqueKeys); if (gKeyListObj.keyList.length > 0) { loadKeyList(null, null, 1, uniqueKeys); } else { loadKeyList(null, null, 1); } getWindows().keyManReloadKeys(); } }; // EnigmailKeyRing /************************ INTERNAL FUNCTIONS ************************/ /** * returns the output of --with-colons --list[-secret]-keys */ function getUserIdList(secretOnly, exitCodeObj, statusFlagsObj, errorMsgObj) { let args = EnigmailGpg.getStandardArgs(true); if (secretOnly) { args = args.concat(["--with-fingerprint", "--fixed-list-mode", "--with-colons", "--list-secret-keys"]); } else { args = args.concat(["--with-fingerprint", "--fixed-list-mode", "--with-colons", "--list-keys"]); } statusFlagsObj.value = 0; const cmdErrorMsgObj = {}; let listText = EnigmailExecution.execCmd(EnigmailGpg.agentPath, args, "", exitCodeObj, statusFlagsObj, {}, cmdErrorMsgObj); if (!(statusFlagsObj.value & EnigmailConstants.BAD_SIGNATURE)) { // ignore exit code as recommended by GnuPG authors exitCodeObj.value = 0; } if (exitCodeObj.value !== 0) { errorMsgObj.value = EnigmailLocale.getString("badCommand"); if (cmdErrorMsgObj.value) { errorMsgObj.value += "\n" + EnigmailFiles.formatCmdLine(EnigmailGpg.agentPath, args); errorMsgObj.value += "\n" + cmdErrorMsgObj.value; } return ""; } listText = listText.replace(/(\r\n|\r)/g, "\n"); return listText; } /** * Get key list from GnuPG. If the keys may be pre-cached already * * @param win - Object : parent window for displaying error messages * @param secretOnly - Boolean : true: get secret keys / false: get public keys * @param onlyKeys - Array of String: only load data for specified key IDs * * @return Promise(Array of : separated key list entries as specified in GnuPG doc/DETAILS) */ function obtainKeyList(win, secretOnly, onlyKeys = null) { return new Promise((resolve, reject) => { EnigmailLog.DEBUG("keyRing.jsm: obtainKeyList\n"); let args = EnigmailGpg.getStandardArgs(true); if (secretOnly) { args = args.concat(["--with-fingerprint", "--fixed-list-mode", "--with-colons", "--list-secret-keys"]); } else { args = args.concat(["--with-fingerprint", "--fixed-list-mode", "--with-colons", "--list-keys"]); } if (onlyKeys) { args = args.concat(onlyKeys); } let statusFlagsObj = {}; let keyListStr = ""; let listener = { stdout: data => { keyListStr += data; }, stderr: data => {}, done: exitCode => { resolve(keyListStr.split(/\n/)); } }; EnigmailExecution.execStart(EnigmailGpg.agentPath, args, false, win, listener, statusFlagsObj); }); } function sortByUserId(keyListObj, sortDirection) { return function(a, b) { return (a.userId < b.userId) ? -sortDirection : sortDirection; }; } const sortFunctions = { keyid: function(keyListObj, sortDirection) { return function(a, b) { return (a.keyId < b.keyId) ? -sortDirection : sortDirection; }; }, keyidshort: function(keyListObj, sortDirection) { return function(a, b) { return (a.keyId.substr(-8, 8) < b.keyId.substr(-8, 8)) ? -sortDirection : sortDirection; }; }, fpr: function(keyListObj, sortDirection) { return function(a, b) { return (keyListObj.keyList[a.keyNum].fpr < keyListObj.keyList[b.keyNum].fpr) ? -sortDirection : sortDirection; }; }, keytype: function(keyListObj, sortDirection) { return function(a, b) { return (keyListObj.keyList[a.keyNum].secretAvailable < keyListObj.keyList[b.keyNum].secretAvailable) ? -sortDirection : sortDirection; }; }, validity: function(keyListObj, sortDirection) { return function(a, b) { return (EnigmailTrust.trustLevelsSorted().indexOf(EnigmailTrust.getTrustCode(keyListObj.keyList[a.keyNum])) < EnigmailTrust.trustLevelsSorted().indexOf(EnigmailTrust.getTrustCode( keyListObj.keyList[b.keyNum]))) ? -sortDirection : sortDirection; }; }, trust: function(keyListObj, sortDirection) { return function(a, b) { return (EnigmailTrust.trustLevelsSorted().indexOf(keyListObj.keyList[a.keyNum].ownerTrust) < EnigmailTrust.trustLevelsSorted().indexOf(keyListObj.keyList[b.keyNum].ownerTrust)) ? - sortDirection : sortDirection; }; }, expiry: function(keyListObj, sortDirection) { return function(a, b) { return (keyListObj.keyList[a.keyNum].expiryTime < keyListObj.keyList[b.keyNum].expiryTime) ? -sortDirection : sortDirection; }; } }; function getSortFunction(type, keyListObj, sortDirection) { return (sortFunctions[type] || sortByUserId)(keyListObj, sortDirection); } /** * Return string with all colon-separated data of key list entry of given key. * - key may be pub or sub key. * * @param String keyId of 8 or 16 chars key with optionally leading 0x * @return String entry of first found user IDs with keyId or null if none */ function getKeyListEntryOfKey(keyId) { keyId = keyId.replace(/^0x/, ""); let statusFlags = {}; let errorMsg = {}; let exitCodeObj = {}; let listText = getUserIdList(false, exitCodeObj, statusFlags, errorMsg); // listText contains lines such as: // tru::0:1407688184:1424970931:3:1:5 // pub:f:1024:17:D581C6F8EBB80E50:1107251639:::-:::scESC: // fpr:::::::::492A198AEA5EBE5574A1CE00D581C6F8EBB80E50: // uid:f::::1107251639::2D505D1F6E744365B3B35FF11F32A19779E3A417::Giosue Vitaglione : // sub:f:2048:16:2223D7E0301A66C6:1107251647::::::e: // search for key or subkey let regexKey = new RegExp("^(pub|sub):[^:]*:[^:]*:[^:]*:[A-Fa-f0-9]*" + keyId + ":", "m"); let foundPos = listText.search(regexKey); if (foundPos < 0) { return null; } // find area of key entries in key list // note: if subkey matches, key entry starts before let regexPub = new RegExp("^pub:", "gm"); let startPos; if (listText[foundPos] == "p") { // ^pub: // KEY matches startPos = foundPos; } else { // SUBKEY matches // search for pub entry right before sub entry startPos = 0; let match = regexPub.exec(listText.substr(0, foundPos)); while (match && match.index < foundPos) { startPos = match.index; match = regexPub.exec(listText); } } // find end of entry (next pub entry or end): let match = regexPub.exec(listText.substr(startPos + 1)); let res; if (match && match.index) { res = listText.substring(startPos, startPos + 1 + match.index); } else { res = listText.substring(startPos); } return res; } /** * Load the key list into memory and return it sorted by a specified column * * @param win - |object| holding the parent window for displaying error messages * @param sortColumn - |string| containing the column name for sorting. One of: * userid, keyid, keyidshort, fpr, keytype, validity, trust, expiry. * Null will sort by userid. * @param sortDirection - |number| 1 = ascending / -1 = descending * @param onlyKeys - |array| of Strings: if defined, only (re-)load selected key IDs * * no return value */ function loadKeyList(win, sortColumn, sortDirection, onlyKeys = null) { EnigmailLog.DEBUG("keyRing.jsm: loadKeyList( " + onlyKeys + ")\n"); if (gLoadingKeys) { waitForKeyList(); return; } gLoadingKeys = true; let aGpgUserList, aGpgSecretsList; try { const TRUSTLEVELS_SORTED = EnigmailTrust.trustLevelsSorted(); obtainKeyList(win, false, onlyKeys) .then(keyList => { return new Promise((resolve, reject) => { if (!keyList) { reject(); } aGpgUserList = keyList; EnigmailLog.DEBUG("keyRing.jsm: loadKeyList: got pubkey lines: " + keyList.length + "\n"); let r = obtainKeyList(win, true, onlyKeys); resolve(r); }); }) .then(keyList => { EnigmailLog.DEBUG("keyRing.jsm: loadKeyList: got seckey lines: " + keyList.length + "\n"); aGpgSecretsList = keyList; if ((!onlyKeys) && ((!aGpgSecretsList) || aGpgSecretsList.length === 0)) { gLoadingKeys = false; if (getDialog().confirmDlg(EnigmailLocale.getString("noSecretKeys"), EnigmailLocale.getString("keyMan.button.generateKey"), EnigmailLocale.getString("keyMan.button.skip"))) { getWindows().openKeyGen(); EnigmailKeyRing.clearCache(); EnigmailKeyRing.loadKeyList(); } } else { createAndSortKeyList(aGpgUserList, aGpgSecretsList, sortColumn, sortDirection, onlyKeys === null); gLoadingKeys = false; } }) .catch(() => { EnigmailLog.ERROR("keyRing.jsm: loadKeyList: error\n"); gLoadingKeys = false; }); waitForKeyList(); } catch (ex) { EnigmailLog.ERROR("keyRing.jsm: loadKeyList: exception: " + ex.toString()); } } // returns the output of --with-colons --list-sig function getKeySig(keyId, exitCodeObj, errorMsgObj) { const args = EnigmailGpg.getStandardArgs(true). concat(["--with-fingerprint", "--fixed-list-mode", "--with-colons", "--list-sig"]). concat(keyId.split(" ")); const statusFlagsObj = {}; const cmdErrorMsgObj = {}; const listText = EnigmailExecution.execCmd(EnigmailGpg.agentPath, args, "", exitCodeObj, statusFlagsObj, {}, cmdErrorMsgObj); if (!(statusFlagsObj.value & EnigmailConstants.BAD_SIGNATURE)) { // ignore exit code as recommended by GnuPG authors exitCodeObj.value = 0; } if (exitCodeObj.value !== 0) { errorMsgObj.value = EnigmailLocale.getString("badCommand"); if (cmdErrorMsgObj.value) { errorMsgObj.value += "\n" + EnigmailFiles.formatCmdLine(EnigmailGpg.agentPath, args); errorMsgObj.value += "\n" + cmdErrorMsgObj.value; } return ""; } return listText; } /** * Return signatures for a given key list * * @param String gpgKeyList Output from gpg such as produced by getKeySig() * Only the first public key is processed! * @param Boolean ignoreUnknownUid true if unknown signer's UIDs should be filtered out * * @return Array of Object: * - uid * - uidLabel * - creationDate * - sigList: [uid, creationDate, signerKeyId, sigType ] */ function extractSignatures(gpgKeyList, ignoreUnknownUid) { EnigmailLog.DEBUG("keyRing.jsm: extractSignatures: " + gpgKeyList + "\n"); var listObj = {}; let havePub = false; let currUid = "", keyId = "", fpr = ""; const lineArr = gpgKeyList.split(/\n/); for (let i = 0; i < lineArr.length; i++) { // process lines such as: // tru::1:1395895453:1442881280:3:1:5 // pub:f:4096:1:C1B875ED336XX959:2299509307:1546189300::f:::scaESCA: // fpr:::::::::102A1C8CC524A966849C33D7C8B157EA336XX959: // uid:f::::1388511201::67D5B96DC564598D4D4D9E0E89F5B83C9931A154::Joe Fox : // sig:::1:C8B157EA336XX959:2299509307::::Joe Fox :13x:::::2: // sub:e:2048:1:B214734F0F5C7041:1316219469:1199912694:::::e: // sub:f:2048:1:70E7A471DABE08B0:1316221524:1546189300:::::s: const lineTokens = lineArr[i].split(/:/); switch (lineTokens[ENTRY_ID]) { case "pub": if (havePub) { return listObj; } havePub = true; keyId = lineTokens[KEY_ID]; break; case "fpr": if (fpr === "") fpr = lineTokens[USERID_ID]; break; case "uid": case "uat": currUid = lineTokens[UID_ID]; listObj[currUid] = { userId: lineTokens[ENTRY_ID] == "uat" ? EnigmailLocale.getString("keyring.photo") : EnigmailData.convertGpgToUnicode(lineTokens[USERID_ID]), rawUserId: lineTokens[USERID_ID], keyId: keyId, fpr: fpr, created: EnigmailTime.getDateTime(lineTokens[CREATED_ID], true, false), sigList: [] }; break; case "sig": if (lineTokens[SIG_TYPE_ID].substr(0, 2).toLowerCase() !== "1f") { // ignrore revoked signature let sig = { userId: EnigmailData.convertGpgToUnicode(lineTokens[USERID_ID]), created: EnigmailTime.getDateTime(lineTokens[CREATED_ID], true, false), signerKeyId: lineTokens[KEY_ID], sigType: lineTokens[SIG_TYPE_ID], sigKnown: lineTokens[USERID_ID] != UNKNOWN_SIGNATURE }; if (!ignoreUnknownUid || sig.userId != UNKNOWN_SIGNATURE) { listObj[currUid].sigList.push(sig); } } break; } } return listObj; } /** * Create a list of objects representing the keys in a key list. * The internal cache is first deleted. * * @param keyListString: Array of String formatted output from GnuPG for key listing * @param keyListObj: Object holding the resulting key list: * obj.keyList: Array holding key objects * obj.keySortList: Array holding values to make sorting easier * @param reset: Boolean - true: delete existting key cache * * no return value */ function createKeyObjects(keyListString, keyListObj, reset = true) { if (reset) { keyListObj.keyList = []; keyListObj.keySortList = []; keyListObj.trustModel = "?"; } appendKeyItems(keyListString, keyListObj); } /** * Append key objects to a given key cache * * @param keyListString: array of |string| formatted output from GnuPG for key listing * @param keyListObj: |object| holding the resulting key list * obj.keyList: Array holding key objects * obj.keySortList: Array holding values to make sorting easier * * no return value */ function appendKeyItems(keyListString, keyListObj) { let keyObj = {}; let uatNum = 0; // counter for photos (counts per key) let numKeys = 0; const TRUSTLEVELS_SORTED = EnigmailTrust.trustLevelsSorted(); for (let i = 0; i < keyListString.length; i++) { const listRow = keyListString[i].split(/:/); if (listRow.length >= 0) { switch (listRow[ENTRY_ID]) { case "pub": keyObj = new KeyObject(listRow); uatNum = 0; ++numKeys; keyListObj.keyList.push(keyObj); break; case "fpr": // only take first fpr line, this is the fingerprint of the primary key and what we want if (keyObj.fpr === "") { keyObj.fpr = listRow[USERID_ID]; } break; case "uid": if (listRow[USERID_ID].length === 0) { listRow[USERID_ID] = "-"; } if (typeof(keyObj.userId) !== "string") { keyObj.userId = EnigmailData.convertGpgToUnicode(listRow[USERID_ID]); if (TRUSTLEVELS_SORTED.indexOf(listRow[KEY_TRUST_ID]) < TRUSTLEVELS_SORTED.indexOf(keyObj.keyTrust)) { // reduce key trust if primary UID is less trusted than public key keyObj.keyTrust = listRow[KEY_TRUST_ID]; } } keyObj.userIds.push({ userId: EnigmailData.convertGpgToUnicode(listRow[USERID_ID]), keyTrust: listRow[KEY_TRUST_ID], uidFpr: listRow[UID_ID], type: "uid" }); break; case "sub": keyObj.subKeys.push({ keyId: listRow[KEY_ID], expiry: EnigmailTime.getDateTime(listRow[EXPIRY_ID], true, false), expiryTime: Number(listRow[EXPIRY_ID]), keyTrust: listRow[KEY_TRUST_ID], keyUseFor: listRow[KEY_USE_FOR_ID], keySize: listRow[KEY_SIZE_ID], algorithm: listRow[KEY_ALGO_ID], algoSym: ALGO_SYMBOL[listRow[KEY_ALGO_ID]], created: EnigmailTime.getDateTime(listRow[CREATED_ID], true, false), type: "sub" }); break; case "uat": if (listRow[USERID_ID].indexOf("1 ") === 0) { const userId = EnigmailLocale.getString("userAtt.photo"); keyObj.userIds.push({ userId: userId, keyTrust: listRow[KEY_TRUST_ID], uidFpr: listRow[UID_ID], type: "uat", uatNum: uatNum }); keyObj.photoAvailable = true; ++uatNum; } break; case "tru": keyListObj.trustModel = "?"; if (listRow[KEY_TRUST_ID].indexOf("t") >= 0) { switch (listRow[KEY_SIZE_ID]) { case "0": keyListObj.trustModel = "p"; break; case "1": keyListObj.trustModel = "t"; break; case "6": keyListObj.trustModel = "TP"; break; case "7": keyListObj.trustModel = "T"; break; } } else { if (listRow[KEY_SIZE_ID] === "0") { keyListObj.trustModel = "a"; } } } } } // (re-) build key sort list (quick index to keys) keyListObj.keySortList = []; for (let i = 0; i < keyListObj.keyList.length; i++) { let keyObj = keyListObj.keyList[i]; keyListObj.keySortList.push({ userId: keyObj.userId.toLowerCase(), keyId: keyObj.keyId, fpr: keyObj.fpr, keyNum: i }); } } /** * Handle secret keys for which gpg 2.0 does not create a public key record */ function appendUnkownSecretKey(keyId, aKeyList, startIndex, endIndex) { EnigmailLog.DEBUG("keyRing.jsm: appendUnkownSecretKey: keyId: " + keyId + "\n"); let keyListStr = []; for (let j = startIndex; j < endIndex; j++) { keyListStr.push(aKeyList[j]); } // make the listing a "public" key keyListStr[0] = keyListStr[0].replace(/^sec/, "pub"); appendKeyItems(keyListStr, gKeyListObj); EnigmailKeyRing.rebuildKeyIndex(); let k = EnigmailKeyRing.getKeyById(keyId, true); if (k) { k.secretAvailable = true; k.keyUseFor = ""; k.keyTrust = "i"; k.ownerTrust = "i"; } } /** * Delete a set of keys from the key cache. Does not rebuild key indexes. * Not found keys are skipped. * * @param keyList: Array of Strings: key IDs (or fpr) to delete * * @return Array of deleted key objects */ function deleteKeysFromCache(keyList) { EnigmailLog.DEBUG("keyRing.jsm: deleteKeysFromCache(" + keyList.join(",") + ")\n"); let deleted = []; let foundKeys = []; for (let keyId of keyList) { let k = EnigmailKeyRing.getKeyById(keyId, true); if (k) { foundKeys.push(k); } } for (let k of foundKeys) { let foundIndex = -1; for (let i = 0; i < gKeyListObj.keyList.length; i++) { if (gKeyListObj.keyList[i].fpr == k.fpr) { foundIndex = i; break; } } if (foundIndex >= 0) { gKeyListObj.keyList.splice(foundIndex, 1); deleted.push(k); } } return deleted; } function createAndSortKeyList(aGpgUserList, aGpgSecretsList, sortColumn, sortDirection, resetKeyCache) { EnigmailLog.DEBUG("keyRing.jsm: createAndSortKeyList()\n"); if (typeof sortColumn !== "string") sortColumn = "userid"; if (!sortDirection) sortDirection = 1; createKeyObjects(aGpgUserList, gKeyListObj, resetKeyCache); // create a hash-index on key ID (8 and 16 characters and fingerprint) // in a single array EnigmailKeyRing.rebuildKeyIndex(); let startRow = -1; let lastKeyId = ""; // search and mark keys that have secret keys for (let i = 0; i < aGpgSecretsList.length; i++) { let listRow = aGpgSecretsList[i].split(/:/); if (listRow.length >= 0) { if (listRow[ENTRY_ID] == "sec") { if (startRow >= 0) { // handle secret key not found on public key ring appendUnkownSecretKey(lastKeyId, aGpgSecretsList, startRow, i); } startRow = -1; let k = EnigmailKeyRing.getKeyById(listRow[KEY_ID], true); if (k && typeof(k) === "object") { k.secretAvailable = true; } else { startRow = i; lastKeyId = listRow[KEY_ID]; } } } } if (startRow >= 0) { // handle secret key not found on public key ring appendUnkownSecretKey(lastKeyId, aGpgSecretsList, startRow, aGpgSecretsList.length); } gKeyListObj.keySortList.sort(getSortFunction(sortColumn.toLowerCase(), gKeyListObj, sortDirection)); } function runKeyUsabilityCheck() { EnigmailLog.DEBUG("keyRing.jsm: runKeyUsabilityCheck()\n"); EnigmailTimer.setTimeout(function _f() { try { let msg = getKeyUsability().keyExpiryCheck(); if (msg && msg.length > 0) { getDialog().info(null, msg); } else { getKeyUsability().checkOwnertrust(); } } catch (ex) { EnigmailLog.DEBUG("keyRing.jsm: runKeyUsabilityCheck: exception " + ex.message + "\n" + ex.stack + "\n"); } }, 60 * 1000); // 1 minute } function waitForKeyList() { let mainThread = Services.tm.mainThread; while (gLoadingKeys) mainThread.processNextEvent(true); } /************************ IMPLEMENTATION of KeyObject ************************/ function KeyObject(lineArr) { if (lineArr[ENTRY_ID] === "pub") { this.keyId = lineArr[KEY_ID]; this.expiry = EnigmailTime.getDateTime(lineArr[EXPIRY_ID], true, false); this.expiryTime = Number(lineArr[EXPIRY_ID]); this.created = EnigmailTime.getDateTime(lineArr[CREATED_ID], true, false); this.keyTrust = lineArr[KEY_TRUST_ID]; this.keyUseFor = lineArr[KEY_USE_FOR_ID]; this.ownerTrust = lineArr[OWNERTRUST_ID]; this.algorithm = lineArr[KEY_ALGO_ID]; this.algoSym = ALGO_SYMBOL[lineArr[KEY_ALGO_ID]]; this.keySize = lineArr[KEY_SIZE_ID]; } else { this.keyId = ""; this.expiry = ""; this.expiryTime = 0; this.created = ""; this.keyTrust = ""; this.keyUseFor = ""; this.ownerTrust = ""; this.algorithm = ""; this.algoSym = ""; this.keySize = ""; } this.type = lineArr[ENTRY_ID]; this.userIds = []; this.subKeys = []; this.fpr = ""; this.minimalKeyBlock = null; this.photoAvailable = false; this.secretAvailable = false; this._sigList = null; } KeyObject.prototype = { /** * gettter that returns a list of all signatures found on the key * * @return Array of Object, or null in case of error: * - uid * - uidLabel * - creationDate * - sigList: Array of object: { uid, creationDate, signerKeyId, sigType } */ get signatures() { if (this._sigList === null) { let exitCodeObj = {}, errorMsgObj = {}; let r = getKeySig(this.keyId, exitCodeObj, errorMsgObj); if (r.length > 0) { this._sigList = extractSignatures(r, false); } } return this._sigList; }, /** * create a copy of the object */ clone: function() { let cp = new KeyObject(["copy"]); for (let i in this) { if (i !== "signatures" && i !== "fprFormatted") { // caution: don't try to evaluate this[i] if i==="signatures"; // it would immediately get all signatures for the key (slow!) if (typeof this[i] !== "function") { if (typeof this[i] === "object") { cp[i] = EnigmailFuncs.cloneObj(this[i]); } else cp[i] = this[i]; } } } return cp; }, /** * Does the key have secondary user IDs? * * @return: Boolean - true if yes; false if no */ hasSubUserIds: function() { let nUid = 0; for (let i in this.userIds) { if (this.userIds[i].type === "uid") ++nUid; } return nUid >= 2; }, /** * Get a formatted version of the fingerprint: * 1234 5678 90AB CDEF .... .... * * @return String - the formatted fingerprint */ get fprFormatted() { let f = EnigmailKey.formatFpr(this.fpr); if (f.length === 0) f = this.fpr; return f; }, /** * Is the function to set owner trust available for the key? * Requirements: The key is signed with at least medium validity level, * or the secret key is available. * * @return Boolean true if yes */ isOwnerTrustUseful: function() { if (this.secretAvailable) return true; if (this.keyTrust.search(/^[fu]/) === 0) return true; return false; }, /** * Determine if the public key is valid. If not, return a description why it's not * * @return Object: * - keyValid: Boolean (true if key is valid) * - reason: String (explanation of invalidity) */ getPubKeyValidity: function() { let retVal = { keyValid: false, reason: "" }; if (this.keyTrust.search(/r/i) >= 0) { // public key revoked retVal.reason = EnigmailLocale.getString("keyRing.pubKeyRevoked", [this.userId, "0x" + this.keyId]); } else if (this.keyTrust.search(/e/i) >= 0) { // public key expired retVal.reason = EnigmailLocale.getString("keyRing.pubKeyExpired", [this.userId, "0x" + this.keyId]); } else if (this.keyTrust.search(/d/i) >= 0 || this.keyUseFor.search(/D/i) >= 0) { // public key disabled retVal.reason = EnigmailLocale.getString("keyRing.keyDisabled", [this.userId, "0x" + this.keyId]); } else if (this.keyTrust.search(/i/i) >= 0) { // public key invalid retVal.reason = EnigmailLocale.getString("keyRing.keyInvalid", [this.userId, "0x" + this.keyId]); } else retVal.keyValid = true; return retVal; }, /** * Check whether a key can be used for signing and return a description of why not * * @return Object: * - keyValid: Boolean (true if key is valid) * - reason: String (explanation of invalidity) */ getSigningValidity: function() { let retVal = this.getPubKeyValidity(); if (!retVal.keyValid) return retVal; if (!this.secretAvailable) { retVal.reason = EnigmailLocale.getString("keyRing.noSecretKey", [this.userId, "0x" + this.keyId]); retVal.keyValid = false; } else if (this.keyUseFor.search(/S/) < 0) { retVal.keyValid = false; if (this.keyTrust.search(/u/i) < 0) { // public key invalid retVal.reason = EnigmailLocale.getString("keyRing.keyNotTrusted", [this.userId, "0x" + this.keyId]); } else { let expired = 0, revoked = 0, unusable = 0, found = 0; // public key is valid; check for signing subkeys for (let sk in this.subKeys) { if (this.subKeys[sk].keyUseFor.search(/[sS]/) >= 0) { // found subkey usable for signing ++found; if (this.subKeys[sk].keyTrust.search(/e/i) >= 0) ++expired; if (this.subKeys[sk].keyTrust.search(/r/i) >= 0) ++revoked; if (this.subKeys[sk].keyTrust.search(/[di-]/i) >= 0 || this.subKeys[sk].keyUseFor.search(/D/) >= 0) ++unusable; } } if (found > 0 && (expired > 0 || revoked > 0)) { if (found === expired) { retVal.reason = EnigmailLocale.getString("keyRing.signSubKeysExpired", [this.userId, "0x" + this.keyId]); } else if (found === revoked) { retVal.reason = EnigmailLocale.getString("keyRing.signSubKeysRevoked", [this.userId, "0x" + this.keyId]); } else { retVal.reason = EnigmailLocale.getString("keyRing.signSubKeysUnusable", [this.userId, "0x" + this.keyId]); } } else retVal.reason = EnigmailLocale.getString("keyRing.pubKeyNotForSigning", [this.userId, "0x" + this.keyId]); } } return retVal; }, /** * Check whether a key can be used for encryption and return a description of why not * * @return Object: * - keyValid: Boolean (true if key is valid) * - reason: String (explanation of invalidity) */ getEncryptionValidity: function() { let retVal = this.getPubKeyValidity(); if (!retVal.keyValid) return retVal; if (this.keyUseFor.search(/E/) < 0) { retVal.keyValid = false; if (this.keyTrust.search(/u/i) < 0) { // public key invalid retVal.reason = EnigmailLocale.getString("keyRing.keyInvalid", [this.userId, "0x" + this.keyId]); } else { let expired = 0, revoked = 0, unusable = 0, found = 0; // public key is valid; check for encryption subkeys for (let sk in this.subKeys) { if (this.subKeys[sk].keyUseFor.search(/[eE]/) >= 0) { // found subkey usable for signing ++found; if (this.subKeys[sk].keyTrust.search(/e/i) >= 0) ++expired; if (this.subKeys[sk].keyTrust.search(/r/i) >= 0) ++revoked; if (this.subKeys[sk].keyTrust.search(/[di-]/i) >= 0 || this.subKeys[sk].keyUseFor.search(/D/) >= 0) ++unusable; } } if (found > 0 && (expired > 0 || revoked > 0)) { if (found === expired) { retVal.reason = EnigmailLocale.getString("keyRing.encSubKeysExpired", [this.userId, "0x" + this.keyId]); } else if (found === revoked) { retVal.reason = EnigmailLocale.getString("keyRing.encSubKeysRevoked", [this.userId, "0x" + this.keyId]); } else { retVal.reason = EnigmailLocale.getString("keyRing.encSubKeysUnusable", [this.userId, "0x" + this.keyId]); } } else retVal.reason = EnigmailLocale.getString("keyRing.pubKeyNotForEncryption", [this.userId, "0x" + this.keyId]); } } return retVal; }, /** * Determine the next expiry date of the key. This is either the public key expiry date, * or the maximum expiry date of a signing or encryption subkey. I.e. this returns the next * date at which the key cannot be used for signing and/or encryption anymore * * @return Number - The expiry date as seconds after 01/01/1970 */ getKeyExpiry: function() { let expiryDate = Number.MAX_VALUE; let encryption = -1; let signing = -1; // check public key expiry date if (this.expiryTime > 0) { expiryDate = this.expiryTime; } for (let sk in this.subKeys) { if (this.subKeys[sk].keyUseFor.search(/[eE]/) >= 0) { let expiry = this.subKeys[sk].expiryTime; if (expiry === 0) expiry = Number.MAX_VALUE; encryption = Math.max(encryption, expiry); } else if (this.subKeys[sk].keyUseFor.search(/[sS]/) >= 0) { let expiry = this.subKeys[sk].expiryTime; if (expiry === 0) expiry = Number.MAX_VALUE; signing = Math.max(signing, expiry); } } if (expiryDate > encryption) { if (this.keyUseFor.search(/[eE]/) < 0) { expiryDate = encryption; } } if (expiryDate > signing) { if (this.keyUseFor.search(/[Ss]/) < 0) { expiryDate = signing; } } return expiryDate; }, /** * Export the minimum key for the public key object: * public key, primary user ID, newest encryption subkey * * @return Object: * - exitCode (0 = success) * - errorMsg (if exitCode != 0) * - keyData: BASE64-encded string of key data */ getMinimalPubKey: function() { EnigmailLog.DEBUG("keyRing.jsm: KeyObject.getMinimalPubKey: " + this.keyId + "\n"); let retObj = { exitCode: 0, errorMsg: "", keyData: "" }; // TODO: remove ECC special case once OpenPGP.js supports it let isECC = (this.algoSym.search(/(ECDH|ECDSA|EDDSA)/) >= 0); if (!this.minimalKeyBlock) { let args = EnigmailGpg.getStandardArgs(true); if (!isECC) { args = args.concat(["--export-options", "export-minimal,no-export-attributes", "-a", "--export", this.fpr]); } else { args = args.concat(["--export-options", "export-minimal,no-export-attributes", "--export", this.fpr]); } const statusObj = {}; const exitCodeObj = {}; let keyBlock = EnigmailExecution.simpleExecCmd(EnigmailGpg.agentPath, args, exitCodeObj, statusObj); let exportOK = true; if (EnigmailGpg.getGpgFeature("export-result")) { // GnuPG 2.1.10+ let r = new RegExp("^\\[GNUPG:\\] EXPORTED " + this.fpr, "m"); if (statusObj.value.search(r) < 0) { retObj.exitCode = 2; retObj.errorMsg = EnigmailLocale.getString("failKeyExtract"); exportOK = false; } } else { // GnuPG older than 2.1.10 if (keyBlock.length < 50) { retObj.exitCode = 2; retObj.errorMsg = EnigmailLocale.getString("failKeyExtract"); exportOK = false; } } if (exportOK) { this.minimalKeyBlock = null; if (isECC) { this.minimalKeyBlock = btoa(keyBlock); } else { let minKey = getStrippedKey(keyBlock); if (minKey) { this.minimalKeyBlock = btoa(String.fromCharCode.apply(null, minKey)); } } if (!this.minimalKeyBlock) { retObj.exitCode = 1; retObj.errorMsg = "No valid (sub-)key"; } } } retObj.keyData = this.minimalKeyBlock; return retObj; }, /** * Obtain a "virtual" key size that allows to compare different algorithms with each other * e.g. elliptic curve keys have small key sizes with high cryptographic strength * * * @return Number: a virtual size */ getVirtualKeySize: function() { EnigmailLog.DEBUG("keyRing.jsm: KeyObject.getVirtualKeySize: " + this.keyId + "\n"); switch (this.algoSym) { case "DSA": return this.keySize / 2; case "ECDSA": return this.keySize * 8; case "EDDSA": return this.keySize * 32; default: return this.keySize; } } }; /** * Get a minimal stripped key containing only: * - The public key * - the primary UID + its self-signature * - the newest valild encryption key + its signature packet * * @param armoredKey - String: Key data (in OpenPGP armored format) * * @return Uint8Array, or null */ function getStrippedKey(armoredKey) { EnigmailLog.DEBUG("keyRing.jsm: KeyObject.getStrippedKey()\n"); try { let openpgp = getOpenPGP().openpgp; let msg = openpgp.key.readArmored(armoredKey); if (!msg || msg.keys.length === 0) return null; let key = msg.keys[0]; let uid = key.getPrimaryUser(); if (!uid || !uid.user) return null; let foundSubKey = null; let foundCreationDate = new Date(0); // go backwards through the subkeys as the newest key is usually // later in the list for (let i = key.subKeys.length - 1; i >= 0; i--) { if (key.subKeys[i].subKey.created > foundCreationDate && key.subKeys[i].isValidEncryptionKey(key.primaryKey)) { foundCreationDate = key.subKeys[i].subKey.created; foundSubKey = key.subKeys[i]; } } if (!foundSubKey) return null; let p = new openpgp.packet.List(); p.push(key.primaryKey); p.concat(uid.user.toPacketlist()); p.concat(foundSubKey.toPacketlist()); return p.write(); } catch (ex) { EnigmailLog.DEBUG("keyRing.jsm: KeyObject.getStrippedKey: ERROR " + ex.message + "\n"); } return null; } EnigmailKeyRing.clearCache(); enigmail-2.0.8/package/keyUsability.jsm000066400000000000000000000234271334302754500201100ustar00rootroot00000000000000/*global Components: false, Number: false, Math: false, Date: false, JSON: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailKeyUsability"]; const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; Cu.import("resource://enigmail/locale.jsm"); /*global EnigmailLocale: false */ Cu.import("resource://enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ Cu.import("resource://enigmail/core.jsm"); /*global EnigmailCore: false */ Cu.import("resource://enigmail/constants.jsm"); /*global EnigmailConstants: false */ Cu.import("resource://enigmail/lazy.jsm"); /*global EnigmailLazy: false */ const getDialog = EnigmailLazy.loader("enigmail/dialog.jsm", "EnigmailDialog"); const getWindows = EnigmailLazy.loader("enigmail/windows.jsm", "EnigmailWindows"); const getKeyRing = EnigmailLazy.loader("enigmail/keyRing.jsm", "EnigmailKeyRing"); const DAY = 86400; // number of seconds of 1 day var EnigmailKeyUsability = { /** * Check whether some key pairs expire in less than N days from now. * * @param keySpecArr - Array: list of key IDs or User IDs * @param numDay - Number: number of days from now * * @return Array - list of keys that will expire */ getExpiryForKeySpec: function(keySpecArr, numDays) { EnigmailLog.DEBUG("keyUsability.jsm: getExpiryForKeySpec()\n"); let now = Math.floor(Date.now() / 1000); let enigmailSvc = EnigmailCore.getService(); if (!enigmailSvc) return []; let result = keySpecArr.reduce(function(p, keySpec) { let key; if (keySpec.search(/^(0x)?[0-9A-F]{8,40}$/i) === 0) { key = getKeyRing().getKeyById(keySpec); } else { key = getKeyRing().getSecretKeyByEmail(keySpec); } if (!key) return p; let maxExpiry = Number.MIN_VALUE; let maxKey = null; let ex = key.getKeyExpiry(); if (ex > maxExpiry) { maxExpiry = ex; maxKey = key; } if (maxExpiry < now + (DAY * numDays) && maxExpiry >= now) p.push(maxKey); return p; }, []); result = uniqueKeyList(result); return result; }, /** * Determine the configured key specifications for all identities * where Enigmail is enabled * * @return Array of Strings - list of keyId and email addresses */ getKeysSpecForIdentities: function() { EnigmailLog.DEBUG("keyUsability.jsm: getKeysSpecForIdentities()\n"); let accountManager = Cc["@mozilla.org/messenger/account-manager;1"].getService(Ci.nsIMsgAccountManager); let keySpecList = []; for (let acct = 0; acct < accountManager.accounts.length; acct++) { let ac = accountManager.accounts.queryElementAt(acct, Ci.nsIMsgAccount); for (let i = 0; i < ac.identities.length; i++) { let id = ac.identities.queryElementAt(i, Ci.nsIMsgIdentity); if (id.getBoolAttribute("enablePgp")) { if (id.getIntAttribute("pgpKeyMode") === 1) { keySpecList.push(id.getCharAttribute("pgpkeyId")); } else { keySpecList.push(id.email); } } } } return keySpecList; }, /** * Check if all keys of all configured identities are still valid in N days. * (N is configured via warnKeyExpiryNumDays; 0 = disable the check) * * @return Array of keys - the keys that have expired since the last check * null in case no check was performed */ getNewlyExpiredKeys: function() { EnigmailLog.DEBUG("keyUsability.jsm: getNewlyExpiredKeys()\n"); let numDays = EnigmailPrefs.getPref("warnKeyExpiryNumDays"); if (numDays < 1) return null; let now = Date.now(); let lastResult = { expiredList: [], lastCheck: 0 }; let lastRes = EnigmailPrefs.getPref("keyCheckResult"); if (lastRes.length > 0) { lastResult = JSON.parse(lastRes); } if (now - lastResult.lastCheck < DAY * 1000) return null; let keys = this.getKeysSpecForIdentities(); if (keys.length === 0) { lastResult.lastCheck = now; EnigmailPrefs.setPref("keyCheckResult", JSON.stringify(lastResult)); return []; } let expired = this.getExpiryForKeySpec(keys, numDays); let expiredList = expired.reduce(function _f(p, key) { p.push(key.keyId); return p; }, []); let newResult = { expiredList: expiredList, lastCheck: now }; EnigmailPrefs.setPref("keyCheckResult", JSON.stringify(newResult)); let warnList = expired.reduce(function _f(p, key) { if (lastResult.expiredList.indexOf(key.keyId) < 0) { p.push(key); } return p; }, []); return warnList; }, keyExpiryCheck: function() { EnigmailLog.DEBUG("keyUsability.jsm: keyExpiryCheck()\n"); let expiredKeys = this.getNewlyExpiredKeys(); if (!expiredKeys || expiredKeys.length === 0) return ""; let numDays = EnigmailPrefs.getPref("warnKeyExpiryNumDays"); if (expiredKeys.length === 1) { return EnigmailLocale.getString("expiry.keyExpiresSoon", [getKeyDesc(expiredKeys[0]), numDays]); } else { let keyDesc = ""; for (let i = 0; i < expiredKeys.length; i++) { keyDesc += "- " + getKeyDesc(expiredKeys[i]) + "\n"; } return EnigmailLocale.getString("expiry.keysExpireSoon", [numDays, keyDesc]); } }, /** * Check whether some key pairs (i.e. key with a secret key) have an * ownertrust of less than "ultimate". * * @param keySpecArr - Array: list of key IDs or User IDs * * @return Array - list of keys that have ownertrust below "ultimate" */ getOwnerTrustForKeySpec: function(keySpecArr) { EnigmailLog.DEBUG("keyUsability.jsm: getOwnerTrustForKeySpec()\n"); let enigmailSvc = EnigmailCore.getService(); if (!enigmailSvc) return []; let result = keySpecArr.reduce(function(p, keySpec) { let key; if (keySpec.search(/^(0x)?[0-9A-F]{8,40}$/i) === 0) { key = getKeyRing().getKeyById(keySpec); if (!key) return p; } else { key = getKeyRing().getSecretKeyByEmail(keySpec); if (!key) return p; } let ot = key.ownerTrust; if (ot !== "u") p.push(key); return p; }, []); result = uniqueKeyList(result); return result; }, /** * Check if all keys of all configured identities have "ultimate" ownertrust * * @return String Message listing the keys that have less ownertrust * resultObj.Count: Number of those keys * resultObj.KeyId: KeyId (only if a single key is concerned) */ keyOwnerTrustCheck: function(resultObj) { EnigmailLog.DEBUG("keyUsability.jsm: keyOwnerTrustCheck()\n"); resultObj.Count = 0; let keys = this.getKeysSpecForIdentities(); if (keys.length === 0) { return ""; } let keysMissingOwnertrust = this.getOwnerTrustForKeySpec(keys); if (!keysMissingOwnertrust || keysMissingOwnertrust.length === 0) return ""; resultObj.Count = keysMissingOwnertrust.length; if (keysMissingOwnertrust.length === 1) { let keyDesc = getKeyDesc(keysMissingOwnertrust[0]); resultObj.keyId = keysMissingOwnertrust[0].keyId; return EnigmailLocale.getString("expiry.keyMissingOwnerTrust", keyDesc); } else { let keyDesc = ""; for (let i = 0; i < keysMissingOwnertrust.length; i++) { keyDesc += "- " + getKeyDesc(keysMissingOwnertrust[i]) + "\n"; } return EnigmailLocale.getString("expiry.keysMissingOwnerTrust", keyDesc); } }, /** * Run the check for Ownertrust ("You rely on certifications") and * Display a message if something needs to be done */ checkOwnertrust: function() { EnigmailLog.DEBUG("keyUsability.jsm: checkOwnertrust\n"); var resultObj = {}; let msg = this.keyOwnerTrustCheck(resultObj); if (msg && (msg.length > 0) && EnigmailPrefs.getPref("warnOnMissingOwnerTrust")) { let actionButtonText = ""; if (resultObj && resultObj.Count === 1) { // single key is concerned actionButtonText = EnigmailLocale.getString("expiry.OpenKeyProperties"); } else { // Multiple keys concerned actionButtonText = EnigmailLocale.getString("expiry.OpenKeyManager"); } let checkedObj = {}; let r = getDialog().msgBox(null, { msgtext: msg, dialogTitle: EnigmailLocale.getString("enigInfo"), checkboxLabel: EnigmailLocale.getString("dlgNoPrompt"), button1: EnigmailLocale.getString("dlg.button.close"), button2: actionButtonText, iconType: EnigmailConstants.ICONTYPE_INFO }, checkedObj); if (r >= 0 && checkedObj.value) { // Do not show me this dialog again EnigmailPrefs.setPref("warnOnMissingOwnerTrust", false); } if (r == 1) { if (resultObj && resultObj.Count === 1) { // single key is concerned, open key details dialog getWindows().openKeyDetails(null, resultObj.keyId, false); } else { // Multiple keys concerned, open Key Manager getWindows().openKeyManager(null); } } } } }; /** * Remove duplicate key Object elements from an array * * @param arr - Array of key Objects to be worked on * * @return Array - the array without duplicates */ function uniqueKeyList(arr) { return arr.reduce(function(p, c) { let r = p.find(function _f(e, i, a) { return e.keyId === c.keyId; }); if (r === undefined) p.push(c); return p; }, []); } function getKeyDesc(key) { return '"' + key.userId + '" (key ID ' + key.fprFormatted + ')'; } enigmail-2.0.8/package/keyserver.jsm000066400000000000000000000555471334302754500174610ustar00rootroot00000000000000/*global Components:false */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; const EXPORTED_SYMBOLS = ["EnigmailKeyServer"]; const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; Cu.importGlobalProperties(["XMLHttpRequest"]); Cu.import("resource://enigmail/subprocess.jsm"); /*global subprocess: false */ Cu.import("resource://enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ Cu.import("resource://enigmail/files.jsm"); /*global EnigmailFiles: false */ Cu.import("resource://enigmail/os.jsm"); /*global EnigmailOS: false */ Cu.import("resource://enigmail/gpgAgent.jsm"); /*global EnigmailGpgAgent: false */ Cu.import("resource://enigmail/gpg.jsm"); /*global EnigmailGpg: false */ Cu.import("resource://enigmail/httpProxy.jsm"); /*global EnigmailHttpProxy: false */ Cu.import("resource://enigmail/core.jsm"); /*global EnigmailCore: false */ Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ Cu.import("resource://enigmail/tor.jsm"); /*global EnigmailTor: false */ Cu.import("resource://enigmail/locale.jsm"); /*global EnigmailLocale: false */ Cu.import("resource://enigmail/keyRing.jsm"); /*global EnigmailKeyRing: false */ Cu.import("resource://enigmail/keyserverUris.jsm"); /*global EnigmailKeyserverURIs: false */ Cu.import("resource://enigmail/funcs.jsm"); /*global EnigmailFuncs: false */ Cu.import("resource://enigmail/stdlib.jsm"); /*global EnigmailStdlib: false */ Cu.import("resource://enigmail/dialog.jsm"); /*global EnigmailDialog: false */ Cu.import("resource://enigmail/webKey.jsm"); /*global EnigmailWks: false */ Cu.import("resource://enigmail/constants.jsm"); /*global EnigmailConstants: false */ const IOSERVICE_CONTRACTID = "@mozilla.org/network/io-service;1"; const ENIG_DEFAULT_HKP_PORT = "11371"; const ENIG_DEFAULT_HKPS_PORT = "443"; const ENIG_DEFAULT_LDAP_PORT = "389"; function matchesKeyserverAction(action, flag) { return (action & flag) === flag; } function getRequestAction(actionFlags, keys) { if (matchesKeyserverAction(actionFlags, EnigmailConstants.DOWNLOAD_KEY)) { return ["--recv-keys"].concat(keys); } if (matchesKeyserverAction(actionFlags, EnigmailConstants.SEARCH_KEY)) { return ["--search-keys"].concat(keys); } if (matchesKeyserverAction(actionFlags, EnigmailConstants.UPLOAD_KEY)) { return ["--send-keys"].concat(keys); } if (matchesKeyserverAction(actionFlags, EnigmailConstants.REFRESH_KEY)) { return ["--refresh-keys"]; } return null; } function getInputData(actionFlags) { if (matchesKeyserverAction(actionFlags, EnigmailConstants.SEARCH_KEY)) { return "quit\n"; } return null; } function buildProxyInfo(uri, proxyHost) { if (proxyHost !== null) { return ["--keyserver-options", "http-proxy=" + proxyHost]; } return []; } function buildStandardArgs(action) { if (matchesKeyserverAction(action, EnigmailConstants.SEARCH_KEY)) { return EnigmailGpg.getStandardArgs(false).concat(["--command-fd", "0", "--fixed-list", "--with-colons"]); } return EnigmailGpg.getStandardArgs(true); } function flatten(arrOfArr) { return arrOfArr.reduce(function(a, b) { return a.concat(b); }, []); } function isDownload(action) { return matchesKeyserverAction(action, EnigmailConstants.REFRESH_KEY) || matchesKeyserverAction(action, EnigmailConstants.DOWNLOAD_KEY); } function gpgRequest(keyId, uri, action, usingTor) { const proxyHost = getProxyModule().getHttpProxy(uri.keyserverName); const args = flatten([ buildStandardArgs(action), ["--keyserver", uri], buildProxyInfo(uri, proxyHost), getRequestAction(action, keyId) ]); return { command: EnigmailGpgAgent.agentPath, args: args, usingTor: usingTor, keyId: keyId, inputData: getInputData(action), envVars: [], isDownload: isDownload(action) }; } function requestOverTorWithSocks(keyId, uri, torProperties, action) { const args = flatten([ buildStandardArgs(action), ["--keyserver", uri], buildProxyInfo(uri, torProperties.args), getRequestAction(action, keyId) ]); return { command: EnigmailGpgAgent.agentPath, args: args, keyId: keyId, usingTor: true, envVars: [], isDownload: isDownload(action) }; } function requestOverTorWithHelper(keyId, uri, torProperties, action) { const args = flatten([ torProperties.args, buildStandardArgs(action), ["--keyserver", uri], getRequestAction(action, keyId) ]); return { command: torProperties.command, args: args, keyId: keyId, usingTor: true, envVars: torProperties.envVars, isDownload: isDownload(action) }; } function buildRequests(keyId, action, tor) { let torProperties = tor.getTorNotAvailableProperties(); const uris = EnigmailKeyserverURIs.buildKeyserverUris(); const requests = []; if (tor.isPreferred(action)) { // tor is preferred or required torProperties = tor.torProperties(); if (tor.isRequired(action) && !torProperties.isAvailable) { EnigmailLog.CONSOLE("Unable to perform action with key " + keyId + " because Tor is required but not available.\n"); return []; } uris.forEach(function(uri) { if (torProperties.helper !== null) { requests.push(requestOverTorWithHelper(keyId, uri, torProperties.helper, action)); } if (torProperties.socks !== null) { requests.push(requestOverTorWithSocks(keyId, uri, torProperties.socks, action)); } }); } if (!tor.isRequired(action) || torProperties.useTorMode) { uris.forEach(function(uri) { requests.push(gpgRequest(keyId, uri, action, torProperties.useTorMode)); }); } return requests; } function stringContains(stringToCheck, substring) { return stringToCheck.indexOf(substring) > -1; } function convertRequestArgsToStrings(args) { return args.map(function(a) { return a.toString(); }); } function execute(request, listener, subproc) { EnigmailLog.CONSOLE("enigmail> " + EnigmailFiles.formatCmdLine(request.command, request.args) + "\n\n"); const envVars = request.envVars.concat(EnigmailCore.getEnvList()); let exitCode = null; let proc = null; try { proc = subproc.call({ command: request.command, arguments: convertRequestArgsToStrings(request.args), environment: envVars, charset: null, stdin: request.inputData, done: function(result) { try { if (result.exitCode === 0 && request.isDownload) { if (typeof(request.keyId) === "string") { EnigmailKeyRing.updateKeys([request.keyId]); } else EnigmailKeyRing.updateKeys(request.keyId); } if (exitCode === null) { exitCode = result.exitCode; } listener.done(exitCode); } catch (ex) { EnigmailLog.ERROR("keyserver.jsm: execute: subprocess.call failed at finish with '" + ex.message + "'\n"); } }, stdout: function(data) { listener.stdout(data); }, stderr: function(data) { if (data.search(/^\[GNUPG:\] ERROR/m) >= 0) { exitCode = 4; } listener.stderr(data); }, mergeStderr: false }); } catch (ex) { EnigmailLog.ERROR("keyserver.jsm: execute: subprocess.call failed with '" + ex.message + "'\n"); throw ex; } if (proc === null) { EnigmailLog.ERROR("keyserver.jsm: execute: subprocess failed due to unknown reasons\n"); } return proc; } function executeRefresh(request, subproc) { let stdout = ""; let stderr = ""; let successful = false; const listener = { done: function(exitCode) { successful = stringContains(stderr, "IMPORT_OK"); }, stderr: function(data) { stderr += data; }, stdout: function(data) { stdout += data; } }; execute(request, listener, subproc).wait(); return successful; } function invalidArgumentsExist(actionFlags, keyserver, searchTerms, errorMsgObj) { if (!keyserver) { errorMsgObj.value = EnigmailLocale.getString("failNoServer"); return true; } if (!searchTerms && !matchesKeyserverAction(actionFlags, EnigmailConstants.REFRESH_KEY)) { errorMsgObj.value = EnigmailLocale.getString("failNoID"); return true; } return false; } function build(actionFlags, keyserver, searchTerms, errorMsgObj) { if (invalidArgumentsExist(actionFlags, keyserver, searchTerms, errorMsgObj)) { return null; } const searchTermsList = searchTerms.split(" "); return gpgRequest(searchTermsList, keyserver.trim(), actionFlags); } /** * search, download or upload key on, from or to a keyserver * * @actionFlags: Integer - flags (bitmap) to determine the required action * (see EnigmailConstants - Keyserver action flags for details) * @keyserver: String - keyserver URL (optionally incl. protocol) * @searchTerms: String - space-separated list of search terms or key IDs * @listener: Object - execStart Listener Object. See execStart for details. * @errorMsgObj: Object - object to hold error message in .value * * @return: Subprocess object, or null in case process could not be started */ function access(actionFlags, keyserver, searchTerms, listener, errorMsgObj) { if (keyserver.search(/^(hkps:\/\/)?keys.mailvelope.com$/i) === 0) { if (matchesKeyserverAction(actionFlags, EnigmailConstants.UPLOAD_KEY) || matchesKeyserverAction(actionFlags, EnigmailConstants.DOWNLOAD_KEY)) { // special API for mailvelope.com return accessHkp(actionFlags, keyserver, searchTerms, listener, errorMsgObj); } } const request = build(actionFlags, keyserver, searchTerms, errorMsgObj, EnigmailHttpProxy); if (request === null) return null; return execute(request, listener, subprocess); } function buildHkpPayload(actionFlags, searchTerms) { let payLoad = null; if (matchesKeyserverAction(actionFlags, EnigmailConstants.UPLOAD_KEY)) { let keyData = EnigmailKeyRing.extractKey(false, searchTerms, null, {}, {}); if (keyData.length === 0) return null; payLoad = "keytext=" + encodeURIComponent(keyData); return payLoad; } else if (matchesKeyserverAction(actionFlags, EnigmailConstants.DOWNLOAD_KEY)) { return ""; } // other actions are not yet implemented return null; } /** * Access a HKP server directly (without gpg involved) * Same API as access() * currently only key uploading is supported */ function accessHkp(actionFlags, keyserver, searchTerms, listener, errorMsgObj) { EnigmailLog.DEBUG("keyserver.jsm: accessHkp()\n"); const ERROR_MSG = "[GNUPG:] ERROR X"; function downloadNextKey() { if (searchTerms.length > 0) { accessHkp(actionFlags, keyserver, searchTerms, listener, errorMsgObj); } else { listener.done(0); } } let keySrv = parseKeyserverUrl(keyserver); let protocol = "https"; // protocol is always hkps (which equals to https in TB) let payLoad = buildHkpPayload(actionFlags, searchTerms); if (payLoad === null) return null; let errorCode = 0; let method = "GET"; let xmlReq = new XMLHttpRequest(); xmlReq.onload = function _onLoad() { EnigmailLog.DEBUG("keyserver.jsm: onload(): status=" + xmlReq.status + "\n"); if (matchesKeyserverAction(actionFlags, EnigmailConstants.UPLOAD_KEY)) { if (xmlReq.status >= 400) { EnigmailLog.DEBUG("keyserver.jsm: onload: " + xmlReq.responseText + "\n"); listener.stderr(ERROR_MSG); errorCode = 1; } } else if (matchesKeyserverAction(actionFlags, EnigmailConstants.DOWNLOAD_KEY)) { if (xmlReq.status >= 400 && xmlReq.status < 500) { downloadNextKey(); } else if (xmlReq.status >= 500) { EnigmailLog.DEBUG("keyserver.jsm: onload: " + xmlReq.responseText + "\n"); listener.stderr(ERROR_MSG); errorCode = 1; } else { let r = importHkpKey(xmlReq.responseText, listener); if (r !== 0) { listener.done(r); } else { downloadNextKey(); } } return; } listener.done(errorCode); }; xmlReq.onerror = function(e) { EnigmailLog.DEBUG("keyserver.jsm: onerror: " + e + "\n"); listener.stderr(ERROR_MSG); listener.done(1); }; xmlReq.onloadend = function() { EnigmailLog.DEBUG("keyserver.jsm: loadEnd:\n"); }; let url = protocol + "://" + keySrv.host + ":" + keySrv.port; if (matchesKeyserverAction(actionFlags, EnigmailConstants.UPLOAD_KEY)) { url += "/pks/add"; method = "POST"; } else if (matchesKeyserverAction(actionFlags, EnigmailConstants.DOWNLOAD_KEY)) { let keys = searchTerms.split(/ +/); if (searchTerms.length > 0) { let keyId = keys[0]; if (keyId.indexOf("0x") !== 0) { keyId = "0x" + keyId; } url += "/pks/lookup?search=" + keyId + "&op=get&options=mr"; keys.shift(); // remove 1st key searchTerms = keys.join(" "); } else { listener.done(0); return null; } } xmlReq.open(method, url); xmlReq.send(payLoad); // return the same API as subprocess return { wait: function() { throw Components.results.NS_ERROR_FAILURE; }, kill: function() { xmlReq.abort(); } }; } function importHkpKey(keyData, listener) { EnigmailLog.DEBUG("keyserver.jsm: importHkpKey()\n"); if (keyData.length > 0) { let errorMsgObj = {}; return EnigmailKeyRing.importKey(null, false, keyData, "", errorMsgObj); } return 0; } /** * Refresh will refresh a key over Tor if Tor is available and over hkps if hkps is configured * and available. * * @param String keyId - ID of the key to be refreshed */ function refresh(keyId) { EnigmailLog.DEBUG("keyserver.jsm: Trying to refresh key: " + keyId + " at time: " + new Date().toUTCString() + "\n"); const refreshAction = EnigmailConstants.DOWNLOAD_KEY; const requests = buildRequests(keyId, refreshAction, EnigmailTor, EnigmailHttpProxy); for (let i = 0; i < requests.length; i++) { const successStatus = executeRefresh(requests[i], subprocess); if (successStatus || i === requests.length - 1) { logRefreshAction(successStatus, requests[i].usingTor, keyId); return; } } } function logRefreshAction(successStatus, usingTor, keyId) { if (successStatus) { EnigmailLog.CONSOLE("Refreshed key " + keyId + " over Tor: " + usingTor + ". Refreshed successfully: " + successStatus + "\n\n"); } else { EnigmailLog.CONSOLE("Failed to refresh key " + keyId + "\n\n"); } } let currentProxyModule = null; function getProxyModule() { if (currentProxyModule === null) { currentProxyModule = EnigmailHttpProxy; } return currentProxyModule; } /** * Upload/refresh keys to/from keyservers. * * @param win - |object| holding the parent window for the dialog. * @param keys - |array| with key objects for the keys to upload/refresh * @param access - |EnigmailConstants| UPLOAD_WKS, UPLOAD_KEY or REFRESH_KEY * @param hideProgess - |boolean| do not display progress dialogs * @param callbackFunc - |function| called when the key server operation finishes * params: exitCode, errorMsg, displayErrorMsg * @param resultObj - |object| with member importedKeys (|number| containing the number of imported keys) * * no return value */ function keyServerUpDownload(win, keys, access, hideProgess, callbackFunc, resultObj) { let keyList = keys.map(function(x) { return "0x" + x.keyId.toString(); }).join(" "); EnigmailLog.DEBUG("keyserver.jsm: keyServerUpDownload: keyId=" + keyList + "\n"); const ioService = Cc[IOSERVICE_CONTRACTID].getService(Ci.nsIIOService); if (ioService && ioService.offline) { EnigmailDialog.alert(win, EnigmailLocale.getString("needOnline")); return; } let keyDlObj = { accessType: access, keyServer: resultObj.value, keyList: keyList, fprList: [], senderIdentities: [], cbFunc: callbackFunc }; if (access === EnigmailConstants.UPLOAD_WKD) { for (let key of keys) { // UPLOAD_WKD needs a nsIMsgIdentity try { for (let uid of key.userIds) { let email = EnigmailFuncs.stripEmail(uid.userId); let maybeIdent = EnigmailStdlib.getIdentityForEmail(email); if (maybeIdent && maybeIdent.identity) { keyDlObj.senderIdentities.push(maybeIdent.identity); keyDlObj.fprList.push(key.fpr); } } if (keyDlObj.senderIdentities.length === 0) { let uids = key.userIds.map(function(x) { return " - " + x.userId; }).join("\n"); if (!hideProgess) { EnigmailDialog.alert(win, EnigmailLocale.getString("noWksIdentity", [uids])); } return; } } catch (ex) { EnigmailLog.DEBUG(ex + "\n"); return; } } } else { let autoKeyServer = EnigmailPrefs.getPref("autoKeyServerSelection") ? EnigmailPrefs.getPref("keyserver").split(/[ ,;]/g)[0] : null; if (autoKeyServer) { keyDlObj.keyServer = autoKeyServer; } else { let inputObj = {}; let resultObj = {}; switch (access) { case EnigmailConstants.REFRESH_KEY: inputObj.upload = false; inputObj.keyId = ""; break; case EnigmailConstants.DOWNLOAD_KEY: inputObj.upload = false; inputObj.keyId = keyList; break; case EnigmailConstants.UPLOAD_KEY: inputObj.upload = true; inputObj.keyId = keyList; break; default: inputObj.upload = true; inputObj.keyId = ""; } win.openDialog("chrome://enigmail/content/enigmailKeyserverDlg.xul", "", "dialog,modal,centerscreen", inputObj, resultObj); keyDlObj.keyServer = resultObj.value; } if (!keyDlObj.keyServer) { return; } } if (!hideProgess) { win.openDialog("chrome://enigmail/content/enigRetrieveProgress.xul", "", "dialog,modal,centerscreen", keyDlObj, resultObj); } else { resultObj.fprList = []; let observer = { isCanceled: false, onProgress: function() {}, onFinished: function(resultStatus, errorMsg, displayError) { resultObj.result = (resultStatus === 0); callbackFunc(resultStatus, errorMsg, displayError); }, onUpload: function(fpr) { resultObj.fprList.push(fpr); } }; performWkdUpload(keyDlObj, null, observer); } } /** * Do the WKD upload and interact with a progress receiver * * @param keyList: Object: * - fprList (String - fingerprint) * - senderIdentities (nsIMsgIdentity) * @param win: nsIWindow - parent window * @param observer: Object: * - onProgress: function(percentComplete [0 .. 100]) * called after processing of every key (indpendent of status) * - onUpload: function(fpr) * called after successful uploading of a key * - onFinished: function(completionStatus, errorMessage, displayError) * - isCanceled: Boolean - used to determine if process is canceled */ function performWkdUpload(keyList, win, observer) { try { let uploads = []; let numKeys = keyList.senderIdentities.length; // For each key fpr/sender identity pair, check whenever WKS is supported // Result is an array of booleans for (let i = 0; i < numKeys; i++) { let keyFpr = keyList.fprList[i]; let senderIdent = keyList.senderIdentities[i]; let was_uploaded = new Promise(function(resolve, reject) { EnigmailLog.DEBUG("keyserver.jsm: performWkdLoad: ident=" + senderIdent.email + ", key=" + keyFpr + "\n"); EnigmailWks.isWksSupportedAsync(senderIdent.email, win, function(is_supported) { if (observer.isCanceled) { EnigmailLog.DEBUG("keyserver.jsm: performWkdLoad: canceled by user\n"); reject("canceled"); } EnigmailLog.DEBUG("keyserver.jsm: performWkdLoad: ident=" + senderIdent.email + ", supported=" + is_supported + "\n"); resolve(is_supported); }); }).then(function(is_supported) { let senderIdent = keyList.senderIdentities[i]; if (is_supported) { let keyFpr = keyList.fprList[i]; return new Promise(function(resolve, reject) { EnigmailWks.submitKey(senderIdent, { 'fpr': keyFpr }, win, function(success) { observer.onProgress((i + 1) / numKeys * 100); if (success) { observer.onUpload(keyFpr); resolve(senderIdent); } else { reject(); } }); }); } else { observer.onProgress((i + 1) / numKeys * 100); return Promise.resolve(null); } }); uploads.push(was_uploaded); } Promise.all(uploads).catch(function(reason) { let errorMsg = EnigmailLocale.getString("keyserverProgress.wksUploadFailed"); observer.onFinished(-1, errorMsg, true); }).then(function(senders) { let uploaded_uids = []; if (senders) { senders.forEach(function(val) { if (val !== null) { uploaded_uids.push(val.email); } }); } observer.onProgress(100); observer.onFinished(0); }); } catch (ex) { EnigmailLog.DEBUG(ex); } } /** * parse a keyserver specification and return host, protocol and port * * @param keyserver: String - name of keyserver with optional protocol and port. * E.g. keys.gnupg.net, hkps://keys.gnupg.net:443 * * @return Object: {port, host, protocol} (all Strings) */ function parseKeyserverUrl(keyserver) { if (keyserver.length > 1024) { // insane length of keyserver is forbidden throw Components.results.NS_ERROR_FAILURE; } keyserver = keyserver.toLowerCase(); let protocol = ""; if (keyserver.search(/^[a-zA-Z0-9_.-]+:\/\//) === 0) { protocol = keyserver.replace(/^([a-zA-Z0-9_.-]+)(:\/\/.*)/, "$1"); keyserver = keyserver.replace(/^[a-zA-Z0-9_.-]+:\/\//, ""); } else { protocol = "hkp"; } let port = ""; switch (protocol) { case "hkp": port = ENIG_DEFAULT_HKP_PORT; break; case "hkps": port = ENIG_DEFAULT_HKPS_PORT; break; case "ldap": port = ENIG_DEFAULT_LDAP_PORT; break; } var m = keyserver.match(/^(.+)(:)(\d+)$/); if (m && m.length == 4) { keyserver = m[1]; port = m[3]; } if (keyserver === "keys.mailvelope.com") { protocol = "hkps"; port = ENIG_DEFAULT_HKPS_PORT; } return { protocol: protocol, host: keyserver, port: port }; } var EnigmailKeyServer = { access: access, refresh: refresh, keyServerUpDownload: keyServerUpDownload, parseKeyserverUrl: parseKeyserverUrl, performWkdUpload: performWkdUpload }; enigmail-2.0.8/package/keyserverUris.jsm000066400000000000000000000076011334302754500203100ustar00rootroot00000000000000/*global Components:false */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; const EXPORTED_SYMBOLS = ["EnigmailKeyserverURIs"]; const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; Cu.import("resource://enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ Cu.import("resource://enigmail/os.jsm"); /*global EnigmailOS: false */ const KEYSERVER_PREF = "keyserver"; const AUTO_KEYSERVER_SELECTION_PREF = "autoKeyServerSelection"; const supportedProtocols = { "hkps": "443", "hkp": "11371", "ldap": "389" }; function buildUriFor(protocol, keyserver) { return { protocol: protocol, domain: keyserver, port: supportedProtocols[protocol] }; } function addUriOptionsForPoolKeyservers(keyserver, uris) { if (keyserver === "hkps.pool.sks-keyservers.net") { uris.push(buildUriFor("hkps", keyserver)); } if (keyserver === "pool.sks-keyservers.net") { uris.push(buildUriFor("hkps", "hkps.pool.sks-keyservers.net")); uris.push(buildUriFor("hkp", keyserver)); } } function buildUriOptionsFor(keyserver) { const uris = []; const keyserverProtocolAndDomain = keyserver.split("://"); const protocolIncluded = keyserverProtocolAndDomain.length === 2; const isPoolKeyserver = ["hkps.pool.sks-keyservers.net", "pool.sks-keyservers.net"].indexOf(keyserver) > -1; if (isPoolKeyserver) { addUriOptionsForPoolKeyservers(keyserver, uris); } else if (protocolIncluded) { uris.push(buildUriFor(keyserverProtocolAndDomain[0].toLowerCase(), keyserverProtocolAndDomain[1])); } else { uris.push(buildUriFor("hkps", keyserver)); uris.push(buildUriFor("hkp", keyserver)); } return uris; } function getUserDefinedKeyserverURIs() { const keyservers = EnigmailPrefs.getPref(KEYSERVER_PREF).split(/\s*[,;]\s*/g); return EnigmailPrefs.getPref(AUTO_KEYSERVER_SELECTION_PREF) ? [keyservers[0]] : keyservers; } function combineIntoURI(protocol, domain, port) { // HACK: Returns hkps.pool.sks-keyservers.net only because // GnuPG version 2.1.14 in Windows does not parse // hkps://hkps.pool.sks-keyservers.net:443 correctly if (domain === "hkps.pool.sks-keyservers.net" && EnigmailOS.isDosLike) { return domain; } else { return protocol + "://" + domain + ":" + port; } } function isValidProtocol(uri) { return uri.match(/:\/\//) === null || /^(hkps|hkp|ldap):\/\//i.test(uri); } function validProtocolsExist() { const validKeyserverUris = getUserDefinedKeyserverURIs().filter(isValidProtocol); return validKeyserverUris.length > 0; } /** * Construct the full URIs for making gpg requests. * This takes the specified keyservers and adds the relevant protocol and port. * When no specific protocol is defined by the user, 2 URIs will be built, for hkps and hkp. * * @return array of all URIs to try refreshing keys over */ function buildKeyserverUris() { const uris = getUserDefinedKeyserverURIs().filter(isValidProtocol).map(function(keyserver) { return buildUriOptionsFor(keyserver); }).reduce(function(a, b) { return a.concat(b); }); return uris.map(function(uri) { return combineIntoURI(uri.protocol, uri.domain, uri.port); }); } /** * Checks if the keyservers specified are valid. * Key refreshes will not be attempted without valid keyservers. * A valid keyserver is one that is non-empty and consists of * - the keyserverDomain * - may include a protocol from hkps, hkp or ldap * - may include the port * * @return true if keyservers exist and are valid, false otherwise. */ function validKeyserversExist() { return EnigmailPrefs.getPref(KEYSERVER_PREF).trim() !== "" && validProtocolsExist(); } var EnigmailKeyserverURIs = { buildKeyserverUris: buildKeyserverUris, validKeyserversExist: validKeyserversExist }; enigmail-2.0.8/package/lazy.jsm000066400000000000000000000011701334302754500164000ustar00rootroot00000000000000/*global Components: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; const EXPORTED_SYMBOLS = ["EnigmailLazy"]; const Cu = Components.utils; var EnigmailLazy = { loader: function(component, name) { let holder = null; return function() { if (holder === null) { const into = {}; Cu.import("resource://" + component, into); holder = into[name]; } return holder; }; } }; enigmail-2.0.8/package/locale.jsm000066400000000000000000000077471334302754500167000ustar00rootroot00000000000000/*global Components: false, EnigmailLog: false, EnigmailOS: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailLocale"]; Components.utils.import("resource://enigmail/log.jsm"); const Cc = Components.classes; const Ci = Components.interfaces; var gEnigStringBundle = null; var EnigmailLocale = { get: function() { try { return Cc["@mozilla.org/intl/nslocaleservice;1"].getService(Ci.nsILocaleService).getApplicationLocale(); } catch (ex) { return { getCategory: function(whatever) { // always return the application locale return Cc["@mozilla.org/intl/localeservice;1"].getService(Ci.mozILocaleService).getAppLocaleAsBCP47(); } }; } }, /** * Retrieve a localized string from the enigmail.properties stringbundle * * @param aStr: String - properties key * @param subPhrases: String or Array of Strings - [Optional] additional input to be embedded * in the resulting localized text * * @return String: the localized string */ getString: function(aStr, subPhrases) { if (!gEnigStringBundle) { try { /* HACK: The string bundle cache is cleared on addon shutdown, however it doesn't appear to do so reliably. Errors can erratically happen on next load of the same file in certain instances. (at minimum, when strings are added/removed) The apparently accepted solution to reliably load new versions is to always create bundles with a unique URL so as to bypass the cache. This is accomplished by passing a random number in a parameter after a '?'. (this random ID is otherwise ignored) The loaded string bundle is still cached on startup and should still be cleared out of the cache on addon shutdown. This just bypasses the built-in cache for repeated loads of the same path so that a newly installed update loads cleanly. */ let bundlePath = "chrome://enigmail/locale/enigmail.properties?" + Math.random(); EnigmailLog.DEBUG("locale.jsm: loading stringBundle " + bundlePath + "\n"); let strBundleService = Cc["@mozilla.org/intl/stringbundle;1"].getService(Ci.nsIStringBundleService); gEnigStringBundle = strBundleService.createBundle(bundlePath); } catch (ex) { EnigmailLog.ERROR("locale.jsm: Error in instantiating stringBundleService\n"); } } if (gEnigStringBundle) { try { if (subPhrases) { if (typeof(subPhrases) == "string") { return gEnigStringBundle.formatStringFromName(aStr, [subPhrases], 1); } else { return gEnigStringBundle.formatStringFromName(aStr, subPhrases, subPhrases.length); } } else { return gEnigStringBundle.GetStringFromName(aStr); } } catch (ex) { EnigmailLog.ERROR("locale.jsm: Error in querying stringBundleService for string '" + aStr + "'\n"); } } return aStr; }, /** * Get the locale for the User Interface * * @return String Locale (xx-YY) */ getUILocale: function() { let ps = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefService); let uaPref = ps.getBranch("general.useragent."); try { return uaPref.getComplexValue("locale", Ci.nsISupportsString).data; } catch (e) {} return this.get().getCategory("NSILOCALE_MESSAGES").substr(0, 5); }, shutdown: function(reason) { // flush string bundles on shutdown of the addon, such that it's no longer cached try { gEnigStringBundle = null; let strBundleService = Cc["@mozilla.org/intl/stringbundle;1"].getService(Ci.nsIStringBundleService); strBundleService.flushBundles(); } catch (e) {} } }; enigmail-2.0.8/package/localizeHtml.jsm000066400000000000000000000044261334302754500200570ustar00rootroot00000000000000/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ /*global Components: false */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailLocalizeHtml"]; const Cu = Components.utils; Cu.import("resource://enigmail/locale.jsm"); /* global EnigmailLocale: false */ Cu.import("resource://enigmail/buildDate.jsm"); /* global EnigmailBuildDate: false */ Cu.import("resource://enigmail/app.jsm"); /* global EnigmailApp: false */ Cu.import("resource://enigmail/core.jsm"); /* global EnigmailCore: false */ Cu.import("resource://enigmail/gpgAgent.jsm"); /* global EnigmailGpgAgent: false */ function getEnigmailVersion() { let versionStr = EnigmailApp.getVersion() + " (" + EnigmailBuildDate + ")"; return EnigmailLocale.getString("usingVersion", versionStr); } function getGpgWorking() { var enigmailSvc = EnigmailCore.getService(); var agentStr; if (enigmailSvc) { agentStr = EnigmailLocale.getString("usingAgent", [EnigmailGpgAgent.agentType, EnigmailGpgAgent.agentPath.path]); } else { agentStr = EnigmailLocale.getString("agentError"); if (enigmailSvc && enigmailSvc.initializationError) agentStr += "\n" + enigmailSvc.initializationError; } return agentStr; } var EnigmailLocalizeHtml = { getAllElementsWithAttribute: function(doc, attribute) { let matchingElements = []; let allElements = doc.getElementsByTagName('*'); for (let i = 0, n = allElements.length; i < n; i++) { if (allElements[i].getAttribute(attribute) !== null) { matchingElements.push(allElements[i]); } } return matchingElements; }, onPageLoad: function(doc) { let elem = this.getAllElementsWithAttribute(doc, "txtId"); for (let i = 0; i < elem.length; i++) { let node = elem[i]; let txtId = node.getAttribute("txtId"); let param = node.getAttribute("txtParam"); switch (txtId) { case "FNC_enigmailVersion": node.innerHTML = getEnigmailVersion(); break; case "FNC_isGpgWorking": node.innerHTML = getGpgWorking(); break; default: node.innerHTML = EnigmailLocale.getString(txtId, param); } } } }; enigmail-2.0.8/package/log.jsm000066400000000000000000000115761334302754500162150ustar00rootroot00000000000000/*global Components: false, EnigmailConsole: false, dump: false, EnigmailFiles: false*/ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailLog"]; const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; Cu.import("resource://enigmail/pipeConsole.jsm"); Cu.import("resource://enigmail/files.jsm"); Cu.import("resource://enigmail/os.jsm"); /*global EnigmailOS: false */ const XPCOM_APPINFO = "@mozilla.org/xre/app-info;1"; const NS_IOSERVICE_CONTRACTID = "@mozilla.org/network/io-service;1"; var EnigmailLog = { level: 3, data: null, directory: null, fileStream: null, setLogLevel: function(newLogLevel) { EnigmailLog.level = newLogLevel; }, getLogLevel: function() { return EnigmailLog.level; }, setLogDirectory: function(newLogDirectory) { EnigmailLog.directory = newLogDirectory + (EnigmailOS.isDosLike ? "\\" : "/"); EnigmailLog.createLogFiles(); }, createLogFiles: function() { if (EnigmailLog.directory && (!EnigmailLog.fileStream) && EnigmailLog.level >= 5) { EnigmailLog.fileStream = EnigmailFiles.createFileStream(EnigmailLog.directory + "enigdbug.txt"); } }, onShutdown: function() { if (EnigmailLog.fileStream) { EnigmailLog.fileStream.close(); } EnigmailLog.fileStream = null; }, getLogData: function(version, prefs) { let ioServ = Cc[NS_IOSERVICE_CONTRACTID].getService(Ci.nsIIOService); let oscpu = ""; let platform = ""; try { let httpHandler = ioServ.getProtocolHandler("http"); httpHandler = httpHandler.QueryInterface(Ci.nsIHttpProtocolHandler); oscpu = httpHandler.oscpu; platform = httpHandler.platform; } catch (ex) {} let data = "Enigmail version " + version + "\n" + "OS/CPU=" + oscpu + "\n" + "Platform=" + platform + "\n" + "Non-default preference values:\n"; let p = prefs.getPrefBranch().getChildList(""); for (let i in p) { if (prefs.getPrefBranch().prefHasUserValue(p[i])) { data += p[i] + ": " + prefs.getPref(p[i]) + "\n"; } } let otherPref = ["dom.workers.maxPerDomain"]; let root = prefs.getPrefRoot(); for (let op of otherPref) { try { data += op + ": " + root.getIntPref(op) + "\n"; } catch (ex) { data += ex.toString() + "\n"; } } return data + "\n" + EnigmailLog.data; }, WRITE: function(str) { function withZeroes(val, digits) { return ("0000" + val.toString()).substr(-digits); } var d = new Date(); var datStr = d.getFullYear() + "-" + withZeroes(d.getMonth() + 1, 2) + "-" + withZeroes(d.getDate(), 2) + " " + withZeroes(d.getHours(), 2) + ":" + withZeroes(d.getMinutes(), 2) + ":" + withZeroes(d.getSeconds(), 2) + "." + withZeroes(d.getMilliseconds(), 3) + " "; if (EnigmailLog.level >= 4) dump(datStr + str); if (EnigmailLog.data === null) { EnigmailLog.data = ""; let appInfo = Cc[XPCOM_APPINFO].getService(Ci.nsIXULAppInfo); EnigmailLog.WRITE("Mozilla Platform: " + appInfo.name + " " + appInfo.version + "\n"); } // truncate first part of log data if it grow too much if (EnigmailLog.data.length > 5120000) { EnigmailLog.data = EnigmailLog.data.substr(-400000); } EnigmailLog.data += datStr + str; if (EnigmailLog.fileStream) { EnigmailLog.fileStream.write(datStr, datStr.length); EnigmailLog.fileStream.write(str, str.length); } }, DEBUG: function(str) { try { EnigmailLog.WRITE("[DEBUG] " + str); } catch (ex) {} }, WARNING: function(str) { EnigmailLog.WRITE("[WARN] " + str); EnigmailConsole.write(str); }, ERROR: function(str) { try { var consoleSvc = Cc["@mozilla.org/consoleservice;1"].getService(Ci.nsIConsoleService); var scriptError = Cc["@mozilla.org/scripterror;1"].createInstance(Ci.nsIScriptError); scriptError.init(str, null, null, 0, 0, scriptError.errorFlag, "Enigmail"); consoleSvc.logMessage(scriptError); } catch (ex) {} EnigmailLog.WRITE("[ERROR] " + str); }, CONSOLE: function(str) { if (EnigmailLog.level >= 3) { EnigmailLog.WRITE("[CONSOLE] " + str); } EnigmailConsole.write(str); }, /** * Log an exception including the stack trace * * referenceInfo: String - arbitraty text to write before the exception is logged * ex: exception object */ writeException: function(referenceInfo, ex) { EnigmailLog.ERROR(referenceInfo + ": caught exception: " + ex.name + "\n" + "Message: '" + ex.message + "'\n" + "File: " + ex.fileName + "\n" + "Line: " + ex.lineNumber + "\n" + "Stack: " + ex.stack + "\n"); } }; enigmail-2.0.8/package/mime.jsm000066400000000000000000000351571334302754500163640ustar00rootroot00000000000000/*global Components: false, escape: false, btoa: false*/ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailMime"]; const Cc = Components.classes; const Ci = Components.interfaces; Components.utils.import("resource:///modules/jsmime.jsm"); /*global jsmime: false*/ Components.utils.import("resource://enigmail/data.jsm"); /*global EnigmailData: false */ Components.utils.import("resource://enigmail/rng.jsm"); /*global EnigmailRNG: false */ Components.utils.import("resource://enigmail/streams.jsm"); /*global EnigmailStreams: false */ var EnigmailMime = { /*** * create a string of random characters suitable to use for a boundary in a * MIME message following RFC 2045 * * @return: string of 33 random characters and digits */ createBoundary: function() { return EnigmailRNG.generateRandomString(33); }, /*** * determine the "boundary" part of a mail content type. * * @contentTypeStr: the string containing all parts of a content-type. * (e.g. multipart/mixed; boundary="xyz") --> returns "xyz" * * @return: String containing the boundary parameter; or "" */ getBoundary: function(contentTypeStr) { return EnigmailMime.getParameter(contentTypeStr, "boundary"); }, /*** * determine the "protocol" part of a mail content type. * * @contentTypeStr: the string containing all parts of a content-type. * (e.g. multipart/signed; protocol="xyz") --> returns "xyz" * * @return: String containing the protocol parameter; or "" */ getProtocol: function(contentTypeStr) { return EnigmailMime.getParameter(contentTypeStr, "protocol"); }, /*** * determine an arbitrary "parameter" part of a mail header. * * @param headerStr: the string containing all parts of the header. * @param parameter: the parameter we are looking for * * * 'multipart/signed; protocol="xyz"', 'protocol' --> returns "xyz" * * @return: String containing the parameter; or "" */ getParameter: function(headerStr, parameter) { let paramsArr = EnigmailMime.getAllParameters(headerStr); parameter = parameter.toLowerCase(); if (parameter in paramsArr) { return paramsArr[parameter]; } else return ""; }, /*** * get all parameter attributes of a mail header. * * @param headerStr: the string containing all parts of the header. * * @return: Array of Object containing the key value pairs * * 'multipart/signed; protocol="xyz"'; boundary="xxx" * --> returns [ ["protocol": "xyz"], ["boundary": "xxx"] ] */ getAllParameters: function(headerStr) { headerStr = headerStr.replace(/[\r\n]+[ \t]+/g, ""); let hdrMap = jsmime.headerparser.parseParameterHeader(";" + headerStr, true, true); let paramArr = []; let i = hdrMap.entries(); let p = i.next(); while (p.value) { paramArr[p.value[0].toLowerCase()] = p.value[1]; p = i.next(); } return paramArr; }, /*** * determine the "charset" part of a mail content type. * * @contentTypeStr: the string containing all parts of a content-type. * (e.g. multipart/mixed; charset="utf-8") --> returns "utf-8" * * @return: String containing the charset parameter; or null */ getCharset: function(contentTypeStr) { return EnigmailMime.getParameter(contentTypeStr, "charset"); }, /** * Convert a MIME header value into a UTF-8 encoded representation following RFC 2047 */ encodeHeaderValue: function(aStr) { let ret = ""; if (aStr.search(/[^\x01-\x7F]/) >= 0) { // eslint-disable-line no-control-regex let s = EnigmailData.convertFromUnicode(aStr, "utf-8"); ret = "=?UTF-8?B?" + btoa(s) + "?="; } else { ret = aStr; } return ret; }, /** * format MIME header with maximum length of 72 characters. */ formatHeaderData: function(hdrValue) { let header; if (Array.isArray(hdrValue)) { header = hdrValue.join("").split(" "); } else { header = hdrValue.split(" "); } let line = ""; let lines = []; for (let i = 0; i < header.length; i++) { if (line.length + header[i].length >= 72) { lines.push(line + "\r\n"); line = " " + header[i]; } else { line += " " + header[i]; } } lines.push(line); return lines.join("").trim(); }, /** * Correctly encode and format a set of email addresses for RFC 2047 */ formatEmailAddress: function(addressData) { const adrArr = addressData.split(/, */); for (let i in adrArr) { try { const m = adrArr[i].match(/(.*[\w\s]+?)<([\w-][\w.-]+@[\w-][\w.-]+[a-zA-Z]{1,4})>/); if (m && m.length == 3) { adrArr[i] = this.encodeHeaderValue(m[1]) + " <" + m[2] + ">"; } } catch (ex) {} } return adrArr.join(", "); }, /** * Extract the subject from the 1st line of the message body, if the message body starts * with: "Subject: ...\r?\n\r?\n". * * @param msgBody - String: message body * * @return * if subject is found: * Object: * - messageBody - String: message body without subject * - subject - String: extracted subject * * if subject not found: null */ extractSubjectFromBody: function(msgBody) { let m = msgBody.match(/^(\r?\n?Subject: [^\r\n]+\r?\n\r?\n)/i); if (m && m.length > 0) { let subject = m[0].replace(/[\r\n]/g, ""); subject = subject.substr(9); msgBody = msgBody.substr(m[0].length); return { messageBody: msgBody, subject: subject }; } return null; }, /*** * determine if the message data contains a first mime part with content-type = "text/rfc822-headers" * if so, extract the corresponding field(s) */ extractProtectedHeaders: function(contentData) { // find first MIME delimiter. Anything before that delimiter is the top MIME structure let m = contentData.search(/^--/m); let protectedHdr = ["subject", "date", "from", "to", "cc", "reply-to", "references", "newsgroups", "followup-to", "message-id" ]; let newHeaders = {}; // read headers of first MIME part and extract the boundary parameter let outerHdr = Cc["@mozilla.org/messenger/mimeheaders;1"].createInstance(Ci.nsIMimeHeaders); outerHdr.initialize(contentData.substr(0, m)); let ct = outerHdr.extractHeader("content-type", false) || ""; if (ct === "") return null; let startPos = -1, endPos = -1, bound = ""; if (ct.search(/^multipart\//i) === 0) { // multipart/xyz message type if (m < 5) { return null; } bound = EnigmailMime.getBoundary(ct); if (bound === "") return null; // search for "outer" MIME delimiter(s) let r = new RegExp("^--" + bound, "mg"); startPos = -1; endPos = -1; // 1st match: start of 1st MIME-subpart let match = r.exec(contentData); if (match && match.index) { startPos = match.index; } // 2nd match: end of 1st MIME-subpart match = r.exec(contentData); if (match && match.index) { endPos = match.index; } if (startPos < 0 || endPos < 0) return null; } else { startPos = contentData.length; endPos = 0; } let headers = Cc["@mozilla.org/messenger/mimeheaders;1"].createInstance(Ci.nsIMimeHeaders); headers.initialize(contentData.substring(0, startPos)); for (let i in protectedHdr) { if (headers.hasHeader(protectedHdr[i])) { newHeaders[protectedHdr[i]] = jsmime.headerparser.decodeRFC2047Words(headers.extractHeader(protectedHdr[i], true)) || undefined; } } // contentBody holds the complete 1st MIME part let contentBody = contentData.substring(startPos + bound.length + 3, endPos); let i = contentBody.search(/^[A-Za-z]/m); // skip empty lines if (i > 0) { contentBody = contentBody.substr(i); } headers.initialize(contentBody); let innerCt = headers.extractHeader("content-type", false) || ""; if (innerCt.search(/^text\/rfc822-headers/i) === 0) { let charset = EnigmailMime.getCharset(innerCt); let ctt = headers.extractHeader("content-transfer-encoding", false) || ""; // determine where the headers end and the MIME-subpart body starts let bodyStartPos = contentBody.search(/\r?\n\s*\r?\n/) + 1; if (bodyStartPos < 10) return null; bodyStartPos += contentBody.substr(bodyStartPos).search(/^[A-Za-z]/m); let ctBodyData = contentBody.substr(bodyStartPos); if (ctt.search(/^base64/i) === 0) { ctBodyData = EnigmailData.decodeBase64(ctBodyData) + "\n"; } else if (ctt.search(/^quoted-printable/i) === 0) { ctBodyData = EnigmailData.decodeQuotedPrintable(ctBodyData) + "\n"; } if (charset) { ctBodyData = EnigmailData.convertToUnicode(ctBodyData, charset); } // get the headers of the MIME-subpart body --> that's the ones we need let bodyHdr = Cc["@mozilla.org/messenger/mimeheaders;1"].createInstance(Ci.nsIMimeHeaders); bodyHdr.initialize(ctBodyData); for (let i in protectedHdr) { if (bodyHdr.hasHeader(protectedHdr[i])) { newHeaders[protectedHdr[i]] = jsmime.headerparser.decodeRFC2047Words(bodyHdr.extractHeader(protectedHdr[i], true)) || undefined; } } } else { startPos = -1; endPos = -1; } return { newHeaders: newHeaders, startPos: startPos, endPos: endPos, securityLevel: 0 }; }, /** * Get the part number from a URI spec (e.g. mailbox:///folder/xyz?part=1.2.3.5) * * @param spec: String - the URI spec to inspect * * @return String: the mime part number (or "" if none found) */ getMimePartNumber: function(spec) { let m = spec.match(/([\?&]part=)(\d+(\.\d+)*)/); if (m && m.length >= 3) { return m[2]; } return ""; }, /** * Try to determine if the message structure is a known MIME structure, * based on the MIME part number and the uriSpec. * * @param mimePartNumber: String - the MIME part we are requested to decrypt * @param uriSpec: String - the URI spec of the message (or msg part) loaded by TB * * @return Boolean: true: regular message structure, MIME part is safe to be decrypted * false: otherwise */ isRegularMimeStructure: function(mimePartNumber, uriSpec) { if (mimePartNumber.length === 0) return true; if (mimePartNumber === "1") return true; if (!uriSpec) return true; // is the message a subpart of a complete attachment? let msgPart = this.getMimePartNumber(uriSpec); if (msgPart.length > 0) { // load attached messages if (mimePartNumber.indexOf(msgPart) === 0 && mimePartNumber.substr(msgPart.length).search(/^(\.1)+$/) === 0) return true; // load attachments of attached messages if (msgPart.indexOf(mimePartNumber) === 0 && uriSpec.search(/[\?&]filename=/) > 0) return true; } return false; }, /** * Parse a MIME message and return a tree structur of TreeObject * * @param url: String - the URL to load and parse * @param getBody: Boolean - if true, delivers the body text of each MIME part * @param callbackFunc Function - the callback function that is called asynchronously * when parsing is complete. * Function signature: callBackFunc(TreeObject) * * @return undefined */ getMimeTreeFromUrl: function(url, getBody, callbackFunc) { function onData(data) { let tree = getMimeTree(data); callbackFunc(tree); } let chan = EnigmailStreams.createChannel(url); let bufferListener = EnigmailStreams.newStringStreamListener(onData); chan.asyncOpen(bufferListener, null); }, getMimeTree: getMimeTree }; /** * Parse a MIME message and return a tree structure of TreeObject. * * TreeObject contains the following main parts: * - partNum: String * - headers: Map, containing all headers. * Special headers for contentType and charset * - body: String, if getBody == true * - subParts: Array of TreeObject * * @param mimeStr: String - a MIME structure to parse * @param getBody: Boolean - if true, delivers the body text of each MIME part * * @return TreeObject, or NULL in case of failure */ function getMimeTree(mimeStr, getBody = false) { let mimeTree = { partNum: "", headers: null, body: "", parent: null, subParts: [] }, stack = [], currentPart = "", currPartNum = ""; const jsmimeEmitter = { createPartObj: function(partNum, headers, parent) { let ct; if (headers.has("content-type")) { ct = headers.contentType.type; let it = headers.get("content-type").entries(); for (let i of it) { ct += '; ' + i[0] + '="' + i[1] + '"'; } } return { partNum: partNum, headers: headers, fullContentType: ct, body: "", parent: parent, subParts: [] }; }, /** JSMime API **/ startMessage: function() { currentPart = mimeTree; }, endMessage: function() {}, startPart: function(partNum, headers) { //dump("mime.jsm: jsmimeEmitter.startPart: partNum=" + partNum + "\n"); partNum = "1" + (partNum !== "" ? "." : "") + partNum; let newPart = this.createPartObj(partNum, headers, currentPart); if (partNum.indexOf(currPartNum) === 0) { // found sub-part currentPart.subParts.push(newPart); } else { // found same or higher level currentPart.subParts.push(newPart); } currPartNum = partNum; currentPart = newPart; }, endPart: function(partNum) { //dump("mime.jsm: jsmimeEmitter.startPart: partNum=" + partNum + "\n"); currentPart = currentPart.parent; }, deliverPartData: function(partNum, data) { //dump("mime.jsm: jsmimeEmitter.deliverPartData: partNum=" + partNum + " / " + typeof data + "\n"); if (typeof(data) === "string") { currentPart.body += data; } else { currentPart.body += EnigmailData.arrayBufferToString(data); } } }; let opt = { strformat: "unicode", bodyformat: getBody ? "decode" : "none" }; try { let p = new jsmime.MimeParser(jsmimeEmitter, opt); p.deliverData(mimeStr); return mimeTree.subParts[0]; } catch (ex) { return null; } } enigmail-2.0.8/package/mimeDecrypt.jsm000066400000000000000000000602771334302754500177200ustar00rootroot00000000000000/*global Components: false */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailMimeDecrypt"]; /** * Module for handling PGP/MIME encrypted messages * implemented as an XPCOM object */ /*global atob: false */ const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; Cu.import("resource://enigmail/core.jsm"); /*global EnigmailCore: false */ Cu.import("resource://enigmail/mimeVerify.jsm"); /*global EnigmailVerify: false */ Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ Cu.import("resource://enigmail/locale.jsm"); /*global EnigmailLocale: false */ Cu.import("resource://enigmail/data.jsm"); /*global EnigmailData: false */ Cu.import("resource://enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ Cu.import("resource://enigmail/decryption.jsm"); /*global EnigmailDecryption: false */ Cu.import("resource://enigmail/mime.jsm"); /*global EnigmailMime: false */ Cu.import("resource://enigmail/uris.jsm"); /*global EnigmailURIs: false */ Cu.import("resource://enigmail/constants.jsm"); /*global EnigmailConstants: false */ Cu.import("resource://enigmail/singletons.jsm"); /*global EnigmailSingletons: false */ const APPSHELL_MEDIATOR_CONTRACTID = "@mozilla.org/appshell/window-mediator;1"; const PGPMIME_JS_DECRYPTOR_CONTRACTID = "@mozilla.org/mime/pgp-mime-js-decrypt;1"; const PGPMIME_JS_DECRYPTOR_CID = Components.ID("{7514cbeb-2bfd-4b2c-829b-1a4691fa0ac8}"); const ENCODING_DEFAULT = 0; const ENCODING_BASE64 = 1; const ENCODING_QP = 2; const LAST_MSG = EnigmailSingletons.lastDecryptedMessage; var gDebugLogLevel = 0; var gNumProc = 0; var EnigmailMimeDecrypt = { /** * create a new instance of a PGP/MIME decryption handler */ newPgpMimeHandler: function() { return new MimeDecryptHandler(); }, /** * Return a fake empty attachment with information that the message * was not decrypted * * @return {String}: MIME string (HTML text) */ emptyAttachment: function() { EnigmailLog.DEBUG("mimeDecrypt.jsm: emptyAttachment()\n"); let encPart = EnigmailLocale.getString("mimeDecrypt.encryptedPart.attachmentLabel"); let concealed = EnigmailLocale.getString("mimeDecrypt.encryptedPart.concealedData"); let retData = `Content-Type: message/rfc822; name="${encPart}.eml" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="${encPart}.eml" Content-Type: text/html

${concealed}

`; return retData; }, /** * Wrap the decrypted output into a message/rfc822 attachment * * @param {String} decryptingMimePartNum: requested MIME part number * @param {Object} uri: nsIURI object of the decrypted message * * @return {String}: prefix for message data */ pretendAttachment: function(decryptingMimePartNum, uri) { if (decryptingMimePartNum === "1" || !uri) return ""; let msg = ""; let mimePartNumber = EnigmailMime.getMimePartNumber(uri.spec); if (mimePartNumber === decryptingMimePartNum + ".1") { msg = 'Content-Type: message/rfc822; name="attachment.eml"\r\n' + 'Content-Transfer-Encoding: 7bit\r\n' + 'Content-Disposition: attachment; filename="attachment.eml"\r\n\r\n'; try { let dbHdr = uri.QueryInterface(Ci.nsIMsgMessageUrl).messageHeader; if (dbHdr.subject) msg += `Subject: ${dbHdr.subject}\r\n`; if (dbHdr.author) msg += `From: ${dbHdr.author}\r\n`; if (dbHdr.recipients) msg += `To: ${dbHdr.recipients}\r\n`; if (dbHdr.ccList) msg += `Cc: ${dbHdr.ccList}\r\n`; } catch (x) {} } return msg; } }; //////////////////////////////////////////////////////////////////// // handler for PGP/MIME encrypted messages // data is processed from libmime -> nsPgpMimeProxy function MimeDecryptHandler() { EnigmailLog.DEBUG("mimeDecrypt.jsm: MimeDecryptHandler()\n"); // always log this one this.mimeSvc = null; this.initOk = false; this.boundary = ""; this.pipe = null; this.closePipe = false; this.statusStr = ""; this.outQueue = ""; this.dataLength = 0; this.bytesWritten = 0; this.mimePartCount = 0; this.headerMode = 0; this.xferEncoding = ENCODING_DEFAULT; this.matchedPgpDelimiter = 0; this.exitCode = null; this.msgWindow = null; this.msgUriSpec = null; this.returnStatus = null; this.proc = null; this.statusDisplayed = false; this.uri = null; this.backgroundJob = false; this.decryptedHeaders = {}; this.mimePartNumber = ""; this.dataIsBase64 = null; this.base64Cache = ""; } MimeDecryptHandler.prototype = { inStream: Cc["@mozilla.org/scriptableinputstream;1"].createInstance(Ci.nsIScriptableInputStream), onStartRequest: function(request, uri) { if (!EnigmailCore.getService()) // Ensure Enigmail is initialized return; EnigmailLog.DEBUG("mimeDecrypt.jsm: onStartRequest\n"); // always log this one ++gNumProc; if (gNumProc > EnigmailPrefs.getPref("maxNumProcesses")) { EnigmailLog.DEBUG("mimeDecrypt.jsm: number of parallel requests above threshold - ignoring requst\n"); return; } this.initOk = true; this.mimeSvc = request.QueryInterface(Ci.nsIPgpMimeProxy); if ("mimePart" in this.mimeSvc) { this.mimePartNumber = this.mimeSvc.mimePart; } else { this.mimePartNumber = ""; } this.pipe = null; this.closePipe = false; this.exitCode = null; this.msgWindow = EnigmailVerify.lastMsgWindow; this.msgUriSpec = EnigmailVerify.lastMsgUri; this.statusDisplayed = false; this.returnStatus = null; this.dataLength = 0; this.decryptedData = ""; this.mimePartCount = 0; this.bytesWritten = 0; this.matchedPgpDelimiter = 0; this.dataIsBase64 = null; this.base64Cache = ""; this.outQueue = ""; this.statusStr = ""; this.headerMode = 0; this.decryptedHeaders = {}; this.xferEncoding = ENCODING_DEFAULT; this.boundary = EnigmailMime.getBoundary(this.mimeSvc.contentType); if (uri) { this.uri = uri.QueryInterface(Ci.nsIURI).clone(); EnigmailLog.DEBUG("mimeDecrypt.jsm: onStartRequest: uri='" + this.uri.spec + "'\n"); } if (!this.isReloadingLastMessage()) { EnigmailSingletons.clearLastDecryptedMessage(); } }, processData: function(data) { // detect MIME part boundary if (data.indexOf(this.boundary) >= 0) { LOCAL_DEBUG("mimeDecrypt.jsm: processData: found boundary\n"); ++this.mimePartCount; this.headerMode = 1; return; } // found PGP/MIME "body" if (this.mimePartCount == 2) { if (this.headerMode == 1) { // we are in PGP/MIME main part headers if (data.search(/\r|\n/) === 0) { // end of Mime-part headers reached this.headerMode = 2; return; } else { if (data.search(/^content-transfer-encoding:\s*/i) >= 0) { // extract content-transfer-encoding data = data.replace(/^content-transfer-encoding:\s*/i, ""); data = data.replace(/;.*/, "").toLowerCase().trim(); if (data.search(/base64/i) >= 0) { this.xferEncoding = ENCODING_BASE64; } else if (data.search(/quoted-printable/i) >= 0) { this.xferEncoding = ENCODING_QP; } } } } else { // PGP/MIME main part body if (this.xferEncoding == ENCODING_QP) { this.cacheData(EnigmailData.decodeQuotedPrintable(data)); } else { this.cacheData(data); } } } }, onDataAvailable: function(req, sup, stream, offset, count) { // get data from libmime if (!this.initOk) return; this.inStream.init(stream); if (count > 0) { var data = this.inStream.read(count); if (this.mimePartCount == 0 && this.dataIsBase64 === null) { // try to determine if this could be a base64 encoded message part this.dataIsBase64 = this.isBase64Encoding(data); } if (!this.dataIsBase64) { if (data.search(/[\r\n][^\r\n]+[\r\n]/) >= 0) { // process multi-line data line by line let lines = data.replace(/\r\n/g, "\n").split(/\n/); for (let i = 0; i < lines.length; i++) { this.processData(lines[i] + "\r\n"); } } else this.processData(data); } else { this.base64Cache += data; } } }, /** * Try to determine if data is base64 endoded */ isBase64Encoding: function(str) { let ret = false; str = str.replace(/[\r\n]/, ""); if (str.search(/^[A-Za-z0-9+/=]+$/) === 0) { let excess = str.length % 4; str = str.substring(0, str.length - excess); try { let s = atob(str); // if the conversion succeds, we have a base64 encoded message ret = true; } catch (ex) { // not a base64 encoded } } return ret; }, // cache encrypted data for writing to subprocess cacheData: function(str) { if (gDebugLogLevel > 4) LOCAL_DEBUG("mimeDecrypt.jsm: cacheData: " + str.length + "\n"); this.outQueue += str; }, processBase64Message: function() { LOCAL_DEBUG("mimeDecrypt.jsm: processBase64Message\n"); try { this.base64Cache = EnigmailData.decodeBase64(this.base64Cache); } catch (ex) { // if decoding failed, try non-encoded version } let lines = this.base64Cache.replace(/\r\n/g, "\n").split(/\n/); for (let i = 0; i < lines.length; i++) { this.processData(lines[i] + "\r\n"); } }, /** * Determine if we are reloading the same message as the previous one * * @return Boolean */ isReloadingLastMessage: function() { if (!this.uri) return false; if (!LAST_MSG.lastMessageURI) return false; if (("lastMessageData" in LAST_MSG) && LAST_MSG.lastMessageData === "") return false; if (this.isUrlEnigmailConvert()) return false; let currMsg = EnigmailURIs.msgIdentificationFromUrl(this.uri); if (LAST_MSG.lastMessageURI.folder === currMsg.folder && LAST_MSG.lastMessageURI.msgNum === currMsg.msgNum) { return true; } return false; }, isUrlEnigmailConvert: function() { if (!this.uri) return false; return (this.uri.spec.search(/[&?]header=enigmailConvert/) >= 0); }, onStopRequest: function(request, win, status) { LOCAL_DEBUG("mimeDecrypt.jsm: onStopRequest\n"); --gNumProc; if (!this.initOk) return; if (this.dataIsBase64) { this.processBase64Message(); } this.msgWindow = EnigmailVerify.lastMsgWindow; this.msgUriSpec = EnigmailVerify.lastMsgUri; let url = {}; let currMsg = EnigmailURIs.msgIdentificationFromUrl(this.uri); this.backgroundJob = false; if (this.uri) { // return if not decrypting currently displayed message (except if // printing, replying, etc) this.backgroundJob = (this.uri.spec.search(/[&?]header=(print|quotebody|enigmailConvert)/) >= 0); try { var messenger = Cc["@mozilla.org/messenger;1"].getService(Ci.nsIMessenger); if (!EnigmailPrefs.getPref("autoDecrypt")) { // "decrypt manually" mode let manUrl = {}; if (EnigmailVerify.getManualUri()) { let msgSvc = messenger.messageServiceFromURI(EnigmailVerify.getManualUri()); msgSvc.GetUrlForUri(EnigmailVerify.getManualUri(), manUrl, null); } else { manUrl.value = { spec: "enigmail://invalid/message" }; } // print a message if not message explicitly decrypted let currUrlSpec = this.uri.spec.replace(/(\?.*)(number=[0-9]*)(&.*)?$/, "?$2"); let manUrlSpec = manUrl.value.spec.replace(/(\?.*)(number=[0-9]*)(&.*)?$/, "?$2"); if ((!this.backgroundJob) && currUrlSpec.indexOf(manUrlSpec) !== 0) { this.handleManualDecrypt(); return; } } if (this.msgUriSpec) { let msgSvc = messenger.messageServiceFromURI(this.msgUriSpec); msgSvc.GetUrlForUri(this.msgUriSpec, url, null); } if (this.uri.spec.search(/[&?]header=[^&]+/) > 0 && this.uri.spec.search(/[&?]examineEncryptedParts=true/) < 0) { if (this.uri.spec.search(/[&?]header=(filter|enigmailFilter)(&.*)?$/) > 0) { EnigmailLog.DEBUG("mimeDecrypt.jsm: onStopRequest: detected incoming message processing\n"); return; } } if (this.uri.spec.search(/[&?]header=[^&]+/) < 0 && this.uri.spec.search(/[&?]part=[.0-9]+/) < 0 && this.uri.spec.search(/[&?]examineEncryptedParts=true/) < 0) { if (this.uri && url && url.value) { if ("path" in url) { // TB < 57 if (url.value.host !== this.uri.host || url.value.path !== this.uri.path) return; } else { // TB >= 57 if (url.value.host !== this.uri.host || url.value.pathQueryRef !== this.uri.pathQueryRef) return; } } } } catch (ex) { EnigmailLog.writeException("mimeDecrypt.js", ex); EnigmailLog.DEBUG("mimeDecrypt.jsm: error while processing " + this.msgUriSpec + "\n"); } } let spec = this.uri ? this.uri.spec : null; EnigmailLog.DEBUG(`mimeDecrypt.jsm: checking MIME structure for ${this.mimePartNumber} / ${spec}\n`); if (!EnigmailMime.isRegularMimeStructure(this.mimePartNumber, spec, false)) { if (!this.isUrlEnigmailConvert()) { this.returnData(EnigmailMimeDecrypt.emptyAttachment()); } else { throw "mimeDecrypt.jsm: Cannot decrypt messages with mixed (encrypted/non-encrypted) content"; } return; } if (!this.isReloadingLastMessage()) { if (this.xferEncoding == ENCODING_BASE64) { this.outQueue = EnigmailData.decodeBase64(this.outQueue) + "\n"; } var statusFlagsObj = {}; var errorMsgObj = {}; var windowManager = Cc[APPSHELL_MEDIATOR_CONTRACTID].getService(Ci.nsIWindowMediator); win = windowManager.getMostRecentWindow(null); var maxOutput = this.outQueue.length * 100; // limit output to 100 times message size // to avoid DoS attack this.proc = EnigmailDecryption.decryptMessageStart(win, false, false, this, statusFlagsObj, errorMsgObj, null, maxOutput); if (!this.proc) return; if (this.bytesWritten === 0 && this.outQueue.length === 0) { // write something to gpg such that the process doesn't get stuck this.outQueue = "NO DATA\n"; } if (this.pipe) { this.pipe.write(this.outQueue); this.bytesWritten += this.outQueue.length; this.outQueue = ""; this.pipe.close(); } else { EnigmailLog.DEBUG("mimeDecrypt.jsm: onStopRequest: pipe not yet ready\n"); this.closePipe = true; } // wait here for this.proc to terminate this.proc.wait(); this.returnStatus = {}; EnigmailDecryption.decryptMessageEnd(this.statusStr, this.exitCode, this.dataLength, false, false, EnigmailConstants.UI_PGP_MIME, this.returnStatus); let mdcError = ((this.returnStatus.statusFlags & EnigmailConstants.DECRYPTION_FAILED) || !(this.returnStatus.statusFlags & EnigmailConstants.DECRYPTION_OKAY)); if (!this.isUrlEnigmailConvert()) { // don't return decrypted data if decryption failed (because it's likely an MDC error), // unless we are called for permanent decryption if (mdcError) { this.decryptedData = ""; } } this.displayStatus(); // HACK: remove filename from 1st HTML and plaintext parts to make TB display message without attachment this.decryptedData = this.decryptedData.replace(/^Content-Disposition: inline; filename="msg.txt"/m, "Content-Disposition: inline"); this.decryptedData = this.decryptedData.replace(/^Content-Disposition: inline; filename="msg.html"/m, "Content-Disposition: inline"); let prefix = EnigmailMimeDecrypt.pretendAttachment(this.mimePartNumber, this.uri); this.returnData(prefix + this.decryptedData); // don't remember the last message if it contains an embedded PGP/MIME message // to avoid ending up in a loop if (this.mimePartNumber === "1" && this.decryptedData.search(/^Content-Type:[\t ]+multipart\/encrypted/mi) < 0 && !mdcError) { LAST_MSG.lastMessageData = this.decryptedData; LAST_MSG.lastMessageURI = currMsg; LAST_MSG.lastStatus = this.returnStatus; LAST_MSG.lastStatus.decryptedHeaders = this.decryptedHeaders; LAST_MSG.lastStatus.mimePartNumber = this.mimePartNumber; } else { LAST_MSG.lastMessageURI = null; LAST_MSG.lastMessageData = ""; } this.decryptedData = ""; EnigmailLog.DEBUG("mimeDecrypt.jsm: onStopRequest: process terminated\n"); // always log this one this.proc = null; } else { this.returnStatus = LAST_MSG.lastStatus; this.decryptedHeaders = LAST_MSG.lastStatus.decryptedHeaders; this.mimePartNumber = LAST_MSG.lastStatus.mimePartNumber; this.exitCode = 0; this.displayStatus(); this.returnData(LAST_MSG.lastMessageData); } }, displayStatus: function() { EnigmailLog.DEBUG("mimeDecrypt.jsm: displayStatus\n"); if (this.exitCode === null || this.msgWindow === null || this.statusDisplayed) return; let uriSpec = (this.uri ? this.uri.spec : null); try { EnigmailLog.DEBUG("mimeDecrypt.jsm: displayStatus for uri " + uriSpec + "\n"); let headerSink = EnigmailSingletons.messageReader; if (headerSink && this.uri && !this.backgroundJob) { headerSink.processDecryptionResult(this.uri, "modifyMessageHeaders", JSON.stringify(this.decryptedHeaders), this.mimePartNumber); headerSink.updateSecurityStatus( this.msgUriSpec, this.exitCode, this.returnStatus.statusFlags, this.returnStatus.keyId, this.returnStatus.userId, this.returnStatus.sigDetails, this.returnStatus.errorMsg, this.returnStatus.blockSeparation, this.uri, JSON.stringify({ encryptedTo: this.returnStatus.encToDetails }), this.mimePartNumber); } else { this.updateHeadersInMsgDb(); } this.statusDisplayed = true; } catch (ex) { EnigmailLog.writeException("mimeDecrypt.jsm", ex); } LOCAL_DEBUG("mimeDecrypt.jsm: displayStatus done\n"); }, // API for decryptMessage Listener stdin: function(pipe) { EnigmailLog.DEBUG("mimeDecrypt.jsm: stdin()\n"); if (this.closePipe) { if (this.outQueue.length > 0) { pipe.write(this.outQueue); this.bytesWritten += this.outQueue.length; this.outQueue = ""; } EnigmailLog.DEBUG("mimeDecrypt.jsm: stdin: closing pipe\n"); pipe.close(); this.pipe = null; } else { this.pipe = pipe; } }, stdout: function(s) { // write data back to libmime //LOCAL_DEBUG("mimeDecrypt.jsm: stdout:"+s.length+"\n"); this.dataLength += s.length; this.decryptedData += s; }, stderr: function(s) { LOCAL_DEBUG("mimeDecrypt.jsm: stderr\n"); this.statusStr += s; }, done: function(result) { let exitCode = result.exitCode; LOCAL_DEBUG("mimeDecrypt.jsm: done: " + exitCode + "\n"); if (gDebugLogLevel > 4) LOCAL_DEBUG("mimeDecrypt.jsm: done: decrypted data='" + this.decryptedData + "'\n"); // ensure newline at the end of the stream if (!this.decryptedData.endsWith("\n")) { this.decryptedData += "\r\n"; } var verifyData = this.decryptedData; try { this.extractEncryptedHeaders(); } catch (ex) {} let i = this.decryptedData.search(/\n\r?\n/); if (i > 0) { var hdr = this.decryptedData.substr(0, i).split(/\r?\n/); for (let j = 0; j < hdr.length; j++) { if (hdr[j].search(/^\s*content-type:\s+text\/(plain|html)/i) >= 0) { LOCAL_DEBUG("mimeDecrypt.jsm: done: adding multipart/mixed around " + hdr[j] + "\n"); this.addWrapperToDecryptedResult(); break; } } } this.exitCode = exitCode; }, addWrapperToDecryptedResult: function() { if (!this.isUrlEnigmailConvert()) { let wrapper = EnigmailMime.createBoundary(); this.decryptedData = 'Content-Type: multipart/mixed; boundary="' + wrapper + '"\r\n' + 'Content-Disposition: inline\r\n\r\n' + '--' + wrapper + '\r\n' + this.decryptedData + '\r\n' + '--' + wrapper + '--\r\n'; } }, extractContentType: function(data) { let i = data.search(/\n\r?\n/); if (i <= 0) return null; let headers = Cc["@mozilla.org/messenger/mimeheaders;1"].createInstance(Ci.nsIMimeHeaders); headers.initialize(data.substr(0, i)); return headers.extractHeader("content-type", false); }, // return data to libMime returnData: function(data) { EnigmailLog.DEBUG("mimeDecrypt.jsm: returnData: " + data.length + " bytes\n"); let proto = null; let ct = this.extractContentType(data); if (ct && ct.search(/multipart\/signed/i) >= 0) { proto = EnigmailMime.getProtocol(ct); } try { if (proto && proto.search(/application\/(pgp|pkcs7|x-pkcs7)-signature/i) >= 0) { EnigmailLog.DEBUG("mimeDecrypt.jsm: returnData: using direct verification\n"); this.mimeSvc.contentType = ct; if ("mimePart" in this.mimeSvc) { this.mimeSvc.mimePart = this.mimeSvc.mimePart + ".1"; } let veri = EnigmailVerify.newVerifier(proto); veri.onStartRequest(this.mimeSvc, this.uri); veri.onTextData(data); veri.onStopRequest(null, null, 0); } else { if ("outputDecryptedData" in this.mimeSvc) { this.mimeSvc.outputDecryptedData(data, data.length); } else { let gConv = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(Ci.nsIStringInputStream); gConv.setData(data, data.length); this.mimeSvc.onStartRequest(null, null); this.mimeSvc.onDataAvailable(null, null, gConv, 0, data.length); this.mimeSvc.onStopRequest(null, null, 0); } } } catch (ex) { EnigmailLog.ERROR("mimeDecrypt.jsm: returnData(): mimeSvc.onDataAvailable failed:\n" + ex.toString()); } }, handleManualDecrypt: function() { try { let headerSink = EnigmailSingletons.messageReader; if (headerSink && this.uri && !this.backgroundJob) { headerSink.updateSecurityStatus( this.msgUriSpec, EnigmailConstants.POSSIBLE_PGPMIME, 0, "", "", "", EnigmailLocale.getString("possiblyPgpMime"), "", this.uri, null, ""); } } catch (ex) {} return 0; }, updateHeadersInMsgDb: function() { if (this.mimePartNumber !== "1") return; if (!this.uri) return; if (this.decryptedHeaders && ("subject" in this.decryptedHeaders)) { try { let msgDbHdr = this.uri.QueryInterface(Ci.nsIMsgMessageUrl).messageHeader; msgDbHdr.subject = EnigmailData.convertFromUnicode(this.decryptedHeaders.subject, "utf-8"); } catch (x) {} } }, extractEncryptedHeaders: function() { let r = EnigmailMime.extractProtectedHeaders(this.decryptedData); if (!r) return; this.decryptedHeaders = r.newHeaders; if (r.startPos >= 0 && r.endPos > r.startPos) { this.decryptedData = this.decryptedData.substr(0, r.startPos) + this.decryptedData.substr(r.endPos); } } }; //////////////////////////////////////////////////////////////////// // General-purpose functions, not exported function LOCAL_DEBUG(str) { if (gDebugLogLevel) EnigmailLog.DEBUG(str); } function initModule() { var env = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment); var nspr_log_modules = env.get("NSPR_LOG_MODULES"); var matches = nspr_log_modules.match(/mimeDecrypt:(\d+)/); if (matches && (matches.length > 1)) { gDebugLogLevel = matches[1]; } } enigmail-2.0.8/package/mimeEncrypt.jsm000066400000000000000000000624141334302754500177250ustar00rootroot00000000000000/*global Components: false, EnigmailLog: false, EnigmailDialog: false, EnigmailFuncs: false */ /*jshint -W097 */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; /** * Module for creating PGP/MIME signed and/or encrypted messages * implemented as XPCOM component */ var EXPORTED_SYMBOLS = ["EnigmailMimeEncrypt"]; const Cc = Components.classes; const Ci = Components.interfaces; const Cr = Components.results; const Cu = Components.utils; Cu.import("resource://gre/modules/XPCOMUtils.jsm"); /*global XPCOMUtils: false */ Cu.import("resource:///modules/jsmime.jsm"); /*global jsmime: false*/ Cu.import("resource://enigmail/funcs.jsm"); Cu.import("resource://enigmail/dialog.jsm"); Cu.import("resource://enigmail/log.jsm"); Cu.import("resource://enigmail/encryption.jsm"); /*global EnigmailEncryption: false */ Cu.import("resource://enigmail/mime.jsm"); /*global EnigmailMime: false */ Cu.import("resource://enigmail/hash.jsm"); /*global EnigmailHash: false */ Cu.import("resource://enigmail/data.jsm"); /*global EnigmailData: false */ Cu.import("resource://enigmail/msgCompFields.jsm"); /*global EnigmailMsgCompFields: false */ Cu.import("resource://enigmail/constants.jsm"); /*global EnigmailConstants: false */ Cu.import("resource://enigmail/pEpAdapter.jsm"); /*global EnigmailPEPAdapter: false */ const PGPMIME_JS_ENCRYPT_CONTRACTID = "@mozilla.org/messengercompose/composesecure;1"; const PGPMIME_JS_ENCRYPT_CID = Components.ID("{1b040e64-e704-42b9-b05a-942e569afffc}"); const APPSHELL_MEDIATOR_CONTRACTID = "@mozilla.org/appshell/window-mediator;1"; const kMsgComposeSecureCID = "{dd753201-9a23-4e08-957f-b3616bf7e012}"; const maxBufferLen = 102400; const MIME_SIGNED = 1; const MIME_ENCRYPTED = 2; var gDebugLogLevel = 0; function PgpMimeEncrypt() {} PgpMimeEncrypt.prototype = { classDescription: "Enigmail JS Encryption Handler", classID: PGPMIME_JS_ENCRYPT_CID, contractID: PGPMIME_JS_ENCRYPT_CONTRACTID, QueryInterface: XPCOMUtils.generateQI([Ci.nsIMsgComposeSecure, Ci.nsIStreamListener, Ci.nsIEnigScriptableMsgCompose]), // private variables inStream: Cc["@mozilla.org/scriptableinputstream;1"].createInstance(Ci.nsIScriptableInputStream), msgCompFields: null, smimeCompose: null, useSmime: false, outStringStream: null, // 0: processing headers // 1: processing body // 2: skipping header inputMode: 0, dataLength: 0, headerData: "", encapsulate: null, encHeader: null, cryptoBoundary: null, win: null, pipe: null, proc: null, statusStr: "", encryptedData: "", hashAlgorithm: null, pipeQueue: "", outQueue: "", closePipe: false, cryptoMode: 0, exitCode: -1, inspector: null, checkSMime: true, // nsIStreamListener interface onStartRequest: function(request) { EnigmailLog.DEBUG("mimeEncrypt.js: onStartRequest\n"); this.encHeader = null; }, onDataAvailable: function(req, sup, stream, offset, count) { LOCAL_DEBUG("mimeEncrypt.js: onDataAvailable\n"); this.inStream.init(stream); var data = this.inStream.read(count); //LOCAL_DEBUG("mimeEncrypt.js: >"+data+"<\n"); }, onStopRequest: function(request, win, status) { EnigmailLog.DEBUG("mimeEncrypt.js: onStopRequest\n"); }, disableSMimeCheck: function() { this.useSmime = false; this.checkSMime = false; }, // nsIMsgComposeSecure interface requiresCryptoEncapsulation: function(msgIdentity, msgCompFields) { EnigmailLog.DEBUG("mimeEncrypt.js: requiresCryptoEncapsulation\n"); try { if (EnigmailPEPAdapter.usingPep()) { try { return msgIdentity.getBoolAttribute("enablePEP"); } catch (ex) { return false; } } else { if (this.checkSMime) { // Remember to use original CID, not CONTRACTID, to avoid infinite looping! this.smimeCompose = Components.classesByID[kMsgComposeSecureCID].createInstance(Ci.nsIMsgComposeSecure); this.useSmime = this.smimeCompose.requiresCryptoEncapsulation(msgIdentity, msgCompFields); } if (this.useSmime) return true; var securityInfo = msgCompFields.securityInfo; if (!securityInfo) return false; try { if (EnigmailMsgCompFields.isEnigmailCompField(securityInfo)) { return (EnigmailMsgCompFields.getValue(securityInfo, "sendFlags") & (EnigmailConstants.SEND_SIGNED | EnigmailConstants.SEND_ENCRYPTED | EnigmailConstants.SEND_VERBATIM)) !== 0; } else return false; } catch (ex) { return false; } } } catch (ex) { EnigmailLog.writeException("mimeEncrypt.js", ex); throw (ex); } }, beginCryptoEncapsulation: function(outStream, recipientList, msgCompFields, msgIdentity, sendReport, isDraft) { EnigmailLog.DEBUG("mimeEncrypt.js: beginCryptoEncapsulation\n"); if (EnigmailPEPAdapter.usingPep()) { this.recipientList = recipientList; this.msgIdentity = msgIdentity; this.outStream = outStream; this.msgCompFields = msgCompFields; this.isDraft = isDraft; this.inspector = Cc["@mozilla.org/jsinspector;1"].createInstance(Ci.nsIJSInspector); this.outStringStream = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(Ci.nsIStringInputStream); return null; } if (this.checkSMime && (!this.smimeCompose)) { LOCAL_DEBUG("mimeEncrypt.js: beginCryptoEncapsulation: ERROR MsgComposeSecure not instantiated\n"); throw Cr.NS_ERROR_FAILURE; } if (this.useSmime) return this.smimeCompose.beginCryptoEncapsulation(outStream, recipientList, msgCompFields, msgIdentity, sendReport, isDraft); if (!outStream) throw Cr.NS_ERROR_NULL_POINTER; try { this.outStream = outStream; this.isDraft = isDraft; this.msgCompFields = msgCompFields; var securityInfo = msgCompFields.securityInfo; if (!securityInfo) throw Cr.NS_ERROR_FAILURE; this.enigmailFlags = EnigmailMsgCompFields.getEnigmailValues(securityInfo); this.outStringStream = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(Ci.nsIStringInputStream); var windowManager = Cc[APPSHELL_MEDIATOR_CONTRACTID].getService(Ci.nsIWindowMediator); this.win = windowManager.getMostRecentWindow(null); if (this.enigmailFlags.sendFlags & EnigmailConstants.SEND_VERBATIM) { this.recipientList = recipientList; this.msgIdentity = msgIdentity; this.msgCompFields = msgCompFields; this.inputMode = 2; return null; } if (this.enigmailFlags.sendFlags & EnigmailConstants.SEND_PGP_MIME) { if (this.enigmailFlags.sendFlags & EnigmailConstants.SEND_ENCRYPTED) { // applies to encrypted and signed & encrypted this.cryptoMode = MIME_ENCRYPTED; } else if (this.enigmailFlags.sendFlags & EnigmailConstants.SEND_SIGNED) { this.cryptoMode = MIME_SIGNED; let hashAlgoObj = {}; if (EnigmailHash.determineAlgorithm(this.win, this.enigmailFlags.UIFlags, this.enigmailFlags.senderEmailAddr, hashAlgoObj) === 0) { this.hashAlgorithm = hashAlgoObj.value; } else { if ("statusFlags" in hashAlgoObj && hashAlgoObj.statusFlags !== 0 && hashAlgoObj.errorMsg) { EnigmailDialog.alert(this.win, hashAlgoObj.errorMsg); } throw Cr.NS_ERROR_FAILURE; } } } else throw Cr.NS_ERROR_NOT_IMPLEMENTED; this.cryptoBoundary = EnigmailMime.createBoundary(); this.startCryptoHeaders(); } catch (ex) { EnigmailLog.writeException("mimeEncrypt.js", ex); throw (ex); } return null; }, startCryptoHeaders: function() { EnigmailLog.DEBUG("mimeEncrypt.js: startCryptoHeaders\n"); if (this.cryptoMode == MIME_SIGNED) this.signedHeaders1(false); if (this.cryptoMode == MIME_ENCRYPTED) this.encryptedHeaders(); this.writeSecureHeaders(); }, writeSecureHeaders: function() { this.encHeader = EnigmailMime.createBoundary(); let allHdr = ""; let visibleHdr = ""; let addrParser = jsmime.headerparser.parseAddressingHeader; let newsParser = function(s) { return jsmime.headerparser.parseStructuredHeader("Newsgroups", s); }; let noParser = function(s) { return s; }; let h = { from: { field: "From", parser: addrParser }, replyTo: { field: "Reply-To", parser: addrParser }, to: { field: "To", parser: addrParser }, cc: { field: "Cc", parser: addrParser }, newsgroups: { field: "Newsgroups", parser: newsParser }, followupTo: { field: "Followup-To", parser: addrParser }, messageId: { field: "Message-Id", parser: noParser } }; // visible headers list let vH = [ 'from', 'to', 'subject', 'cc' ]; for (let i in h) { if (this.msgCompFields[i] && this.msgCompFields[i].length > 0) { allHdr += jsmime.headeremitter.emitStructuredHeader(h[i].field, h[i].parser(this.msgCompFields[i]), {}); } if (vH.indexOf(i) >= 0 && this.msgCompFields[i].length > 0) { visibleHdr += jsmime.headeremitter.emitStructuredHeader(h[i].field, h[i].parser(this.msgCompFields[i]), {}); } } if (this.enigmailFlags.originalSubject && this.enigmailFlags.originalSubject.length > 0) { allHdr += jsmime.headeremitter.emitStructuredHeader("subject", this.enigmailFlags.originalSubject, {}); visibleHdr += jsmime.headeremitter.emitStructuredHeader("subject", this.enigmailFlags.originalSubject, {}); } // special handling for references and in-reply-to if (this.enigmailFlags.originalReferences && this.enigmailFlags.originalReferences.length > 0) { allHdr += jsmime.headeremitter.emitStructuredHeader("references", this.enigmailFlags.originalReferences, {}); let bracket = this.enigmailFlags.originalReferences.lastIndexOf("<"); if (bracket >= 0) { allHdr += jsmime.headeremitter.emitStructuredHeader("in-reply-to", this.enigmailFlags.originalReferences.substr(bracket), {}); } } let w = 'Content-Type: multipart/mixed; boundary="' + this.encHeader + '";\r\n' + ' protected-headers="v1"\r\n' + allHdr + '\r\n' + "--" + this.encHeader + "\r\n"; if (this.cryptoMode == MIME_ENCRYPTED && this.enigmailFlags.sendFlags & EnigmailConstants.ENCRYPT_HEADERS) { w += 'Content-Type: text/rfc822-headers; protected-headers="v1"\r\n' + 'Content-Disposition: inline\r\n\r\n' + visibleHdr + "\r\n--" + this.encHeader + "\r\n"; } this.writeToPipe(w); if (this.cryptoMode == MIME_SIGNED) this.writeOut(w); }, encryptedHeaders: function(isEightBit) { EnigmailLog.DEBUG("mimeEncrypt.js: encryptedHeaders\n"); let subj = ""; if (this.enigmailFlags.sendFlags & EnigmailConstants.ENCRYPT_HEADERS) { subj = jsmime.headeremitter.emitStructuredHeader("subject", EnigmailFuncs.getProtectedSubjectText(), {}); } this.writeOut(subj + "Content-Type: multipart/encrypted;\r\n" + " protocol=\"application/pgp-encrypted\";\r\n" + " boundary=\"" + this.cryptoBoundary + "\"\r\n" + "\r\n" + "This is an OpenPGP/MIME encrypted message (RFC 4880 and 3156)\r\n" + "--" + this.cryptoBoundary + "\r\n" + "Content-Type: application/pgp-encrypted\r\n" + "Content-Description: PGP/MIME version identification\r\n" + "\r\n" + "Version: 1\r\n" + "\r\n" + "--" + this.cryptoBoundary + "\r\n" + "Content-Type: application/octet-stream; name=\"encrypted.asc\"\r\n" + "Content-Description: OpenPGP encrypted message\r\n" + "Content-Disposition: inline; filename=\"encrypted.asc\"\r\n" + "\r\n"); }, signedHeaders1: function(isEightBit) { LOCAL_DEBUG("mimeEncrypt.js: signedHeaders1\n"); this.writeOut("Content-Type: multipart/signed; micalg=pgp-" + this.hashAlgorithm.toLowerCase() + ";\r\n" + " protocol=\"application/pgp-signature\";\r\n" + " boundary=\"" + this.cryptoBoundary + "\"\r\n" + (isEightBit ? "Content-Transfer-Encoding: 8bit\r\n\r\n" : "\r\n") + "This is an OpenPGP/MIME signed message (RFC 4880 and 3156)\r\n" + "--" + this.cryptoBoundary + "\r\n"); }, signedHeaders2: function() { LOCAL_DEBUG("mimeEncrypt.js: signedHeaders2\n"); this.writeOut("\r\n--" + this.cryptoBoundary + "\r\n" + "Content-Type: application/pgp-signature; name=\"signature.asc\"\r\n" + "Content-Description: OpenPGP digital signature\r\n" + "Content-Disposition: attachment; filename=\"signature.asc\"\r\n\r\n"); }, finishCryptoHeaders: function() { EnigmailLog.DEBUG("mimeEncrypt.js: finishCryptoHeaders\n"); this.writeOut("\r\n--" + this.cryptoBoundary + "--\r\n"); }, finishCryptoEncapsulation: function(abort, sendReport) { EnigmailLog.DEBUG("mimeEncrypt.js: finishCryptoEncapsulation\n"); if (EnigmailPEPAdapter.usingPep()) { this.processPepEncryption(); return; } if (this.checkSMime && (!this.smimeCompose)) throw Cr.NS_ERROR_NOT_INITIALIZED; if (this.useSmime) { this.smimeCompose.finishCryptoEncapsulation(abort, sendReport); return; } if ((this.enigmailFlags.sendFlags & EnigmailConstants.SEND_VERBATIM) !== 0) { this.flushOutput(); return; } let statusFlagsObj = {}; let errorMsgObj = {}; let proc = EnigmailEncryption.encryptMessageStart(this.win, this.enigmailFlags.UIFlags, this.enigmailFlags.senderEmailAddr, this.enigmailFlags.recipients, this.enigmailFlags.bccRecipients, this.hashAlgorithm, this.enigmailFlags.sendFlags, this, statusFlagsObj, errorMsgObj); if (!proc) throw Cr.NS_ERROR_FAILURE; try { if (this.encapsulate) this.writeToPipe("--" + this.encapsulate + "--\r\n"); if (this.encHeader) { this.writeToPipe("\r\n--" + this.encHeader + "--\r\n"); if (this.cryptoMode == MIME_SIGNED) this.writeOut("\r\n--" + this.encHeader + "--\r\n"); } this.flushInput(); if (!this.pipe) { this.closePipe = true; } else this.pipe.close(); // wait here for proc to terminate proc.wait(); LOCAL_DEBUG("mimeEncrypt.js: finishCryptoEncapsulation: exitCode = " + this.exitCode + "\n"); if (this.exitCode !== 0) throw Cr.NS_ERROR_FAILURE; if (this.cryptoMode == MIME_SIGNED) this.signedHeaders2(); this.encryptedData = this.encryptedData.replace(/\r/g, "").replace(/\n/g, "\r\n"); // force CRLF this.writeOut(this.encryptedData); this.finishCryptoHeaders(); this.flushOutput(); } catch (ex) { EnigmailLog.writeException("mimeEncrypt.js", ex); throw (ex); } }, mimeCryptoWriteBlock: function(buffer, length) { if (gDebugLogLevel > 4) LOCAL_DEBUG("mimeEncrypt.js: mimeCryptoWriteBlock: " + length + "\n"); if (EnigmailPEPAdapter.usingPep()) { this.pipeQueue += buffer.substr(0, length); return null; } if (this.checkSMime && (!this.smimeCompose)) throw Cr.NS_ERROR_NOT_INITIALIZED; if (this.useSmime) return this.smimeCompose.mimeCryptoWriteBlock(buffer, length); try { let line = buffer.substr(0, length); if (this.inputMode === 0) { if ((this.enigmailFlags.sendFlags & EnigmailConstants.SEND_VERBATIM) !== 0) { line = EnigmailData.decodeQuotedPrintable(line.replace("=\r\n", "")); } if ((this.enigmailFlags.sendFlags & EnigmailConstants.SEND_VERBATIM) === 0 || line.match(/^(From|To|Subject|Message-ID|Date|User-Agent|MIME-Version):/i) === null) { this.headerData += line; } if (line.replace(/[\r\n]/g, "").length === 0) { this.inputMode = 1; if (this.cryptoMode == MIME_ENCRYPTED) { if (!this.encHeader) { let ct = this.getHeader("content-type", false); if ((ct.search(/text\/plain/i) === 0) || (ct.search(/text\/html/i) === 0)) { this.encapsulate = EnigmailMime.createBoundary(); this.writeToPipe('Content-Type: multipart/mixed; boundary="' + this.encapsulate + '"\r\n\r\n'); this.writeToPipe("--" + this.encapsulate + "\r\n"); } } } else if (this.cryptoMode == MIME_SIGNED) { let ct = this.getHeader("content-type", true); let hdr = EnigmailFuncs.getHeaderData(ct); hdr.boundary = hdr.boundary || ""; hdr.boundary = hdr.boundary.replace(/['"]/g, ""); } this.writeToPipe(this.headerData); if (this.cryptoMode == MIME_SIGNED || (this.enigmailFlags.sendFlags & EnigmailConstants.SEND_VERBATIM) !== 0) { this.writeOut(this.headerData); } } } else if (this.inputMode == 1) { if (this.cryptoMode == MIME_SIGNED) { // special treatments for various special cases with PGP/MIME signed messages if (line.substr(0, 5) == "From ") { LOCAL_DEBUG("mimeEncrypt.js: added >From\n"); this.writeToPipe(">"); } } this.writeToPipe(line); if (this.cryptoMode == MIME_SIGNED) { this.writeOut(line); } else if ((this.enigmailFlags.sendFlags & EnigmailConstants.SEND_VERBATIM) !== 0) { this.writeOut(EnigmailData.decodeQuotedPrintable(line.replace("=\r\n", ""))); } } else if (this.inputMode == 2) { if (line.replace(/[\r\n]/g, "").length === 0) { this.inputMode = 0; } } } catch (ex) { EnigmailLog.writeException("mimeEncrypt.js", ex); throw (ex); } return null; }, writeOut: function(str) { if (gDebugLogLevel > 4) LOCAL_DEBUG("mimeEncrypt.js: writeOut: " + str.length + "\n"); this.outQueue += str; if (this.outQueue.length > maxBufferLen) this.flushOutput(); }, flushOutput: function() { LOCAL_DEBUG("mimeEncrypt.js: flushOutput: " + this.outQueue.length + "\n"); this.outStringStream.setData(this.outQueue, this.outQueue.length); var writeCount = this.outStream.writeFrom(this.outStringStream, this.outQueue.length); if (writeCount < this.outQueue.length) { LOCAL_DEBUG("mimeEncrypt.js: flushOutput: wrote " + writeCount + " instead of " + this.outQueue.length + " bytes\n"); } this.outQueue = ""; }, writeToPipe: function(str) { if (gDebugLogLevel > 4) LOCAL_DEBUG("mimeEncrypt.js: writeToPipe: " + str.length + "\n"); if (this.pipe) { this.pipeQueue += str; if (this.pipeQueue.length > maxBufferLen) this.flushInput(); } else this.pipeQueue += str; }, flushInput: function() { LOCAL_DEBUG("mimeEncrypt.js: flushInput\n"); if (!this.pipe) return; this.pipe.write(this.pipeQueue); this.pipeQueue = ""; }, getHeader: function(hdrStr, fullHeader) { var foundIndex = 0; var res = ""; var hdrLines = this.headerData.split(/[\r\n]+/); var i; for (i = 0; i < hdrLines.length; i++) { if (hdrLines[i].length > 0) { if (fullHeader && res !== "") { if (hdrLines[i].search(/^\s+/) === 0) { res += hdrLines[i].replace(/\s*[\r\n]*$/, ""); } else return res; } else { let j = hdrLines[i].indexOf(":"); if (j > 0) { let h = hdrLines[i].substr(0, j).replace(/\s*$/, ""); let re = new RegExp("^" + hdrStr + "$", "i"); if (h.search(re) === 0) { foundIndex = 1; res = hdrLines[i].substr(j + 1).replace(/^\s*/, ""); if (!fullHeader) return res; } } } } } return res; }, // API for decryptMessage Listener stdin: function(pipe) { LOCAL_DEBUG("mimeEncrypt.js: stdin\n"); if (this.pipeQueue.length > 0) { pipe.write(this.pipeQueue); this.pipeQueue = ""; } if (this.closePipe) { pipe.close(); } else { this.pipe = pipe; } }, stdout: function(s) { LOCAL_DEBUG("mimeEncrypt.js: stdout:" + s.length + "\n"); this.encryptedData += s; this.dataLength += s.length; }, stderr: function(s) { LOCAL_DEBUG("mimeEncrypt.js: stderr\n"); this.statusStr += s; }, done: function(exitCode) { EnigmailLog.DEBUG("mimeEncrypt.js: done: " + exitCode + "\n"); let retStatusObj = {}; this.exitCode = EnigmailEncryption.encryptMessageEnd(this.enigmailFlags.senderEmailAddr, this.statusStr, exitCode, this.enigmailFlags.UIFlags, this.enigmailFlags.sendFlags, this.dataLength, retStatusObj); if (this.exitCode !== 0) EnigmailDialog.alert(this.win, retStatusObj.errorMsg); }, processPepEncryption: function() { EnigmailLog.DEBUG("mimeEncrypt.js: processPepEncryption:\n"); let self = this; let resultObj = null; let originalSubject = null; let sendFlags = 0; this.outQueue = ""; if ((!this.isDraft) || self.msgIdentity.getBoolAttribute("autoEncryptDrafts")) { let securityInfo = this.msgCompFields.securityInfo; if (!securityInfo) throw Cr.NS_ERROR_FAILURE; this.enigmailFlags = EnigmailMsgCompFields.getEnigmailValues(securityInfo); try { originalSubject = this.enigmailFlags.originalSubject; sendFlags = this.enigmailFlags.sendFlags; } catch (ex) {} let fromAddr = jsmime.headerparser.parseAddressingHeader(self.msgIdentity.email); let toAddr; let encryptFlags = 0; if (!this.isDraft) { toAddr = jsmime.headerparser.parseAddressingHeader(this.recipientList); if (!self.msgIdentity.getBoolAttribute("attachPepKey")) { encryptFlags = 0x4; // do not attach own key } } else { toAddr = fromAddr; sendFlags = EnigmailConstants.SEND_ENCRYPTED; encryptFlags = 0x2 + 0x4; // unsigned message; do not attach own key } if (sendFlags & EnigmailConstants.SEND_ENCRYPTED) { let s = jsmime.headeremitter.emitStructuredHeader("from", fromAddr, {}); s += jsmime.headeremitter.emitStructuredHeader("to", toAddr, {}); if (originalSubject !== null) { s += jsmime.headeremitter.emitStructuredHeader("subject", originalSubject, {}); } EnigmailPEPAdapter.pep.encryptMimeString(s + this.pipeQueue, null, encryptFlags).then(function _f(res) { EnigmailLog.DEBUG("mimeEncrypt.js: processPepEncryption: got result\n"); if ((typeof(res) === "object") && ("result" in res)) { resultObj = res.result.outParams; } else EnigmailLog.DEBUG("mimeEncrypt.js: processPepEncryption: typeof res=" + typeof(res) + "\n"); if (self.inspector && self.inspector.eventLoopNestLevel > 0) { // unblock the waiting lock in finishCryptoEncapsulation self.inspector.exitNestedEventLoop(); } }).catch(function _error(err) { EnigmailLog.DEBUG("mimeEncrypt.js: processPepEncryption: ERROR\n"); try { EnigmailLog.DEBUG(err.code + ": " + ("exception" in err ? err.exception.toString() : err.message) + "\n"); } catch (x) { EnigmailLog.DEBUG(JSON.stringify(err) + "\n"); } if (self.inspector && self.inspector.eventLoopNestLevel > 0) { // unblock the waiting lock in finishCryptoEncapsulation self.inspector.exitNestedEventLoop(); } }); // wait here for PEP to terminate this.inspector.enterNestedEventLoop(0); } } if (resultObj !== null) { this.outQueue = EnigmailPEPAdapter.stripMsgHeadersFromEncryption(resultObj); } if (this.outQueue === "") { if (originalSubject !== null) { this.outQueue = jsmime.headeremitter.emitStructuredHeader("subject", originalSubject, {}) + this.pipeQueue; } else { this.outQueue = this.pipeQueue; } } this.outStringStream.setData(this.outQueue, this.outQueue.length); let writeCount = this.outStream.writeFrom(this.outStringStream, this.outQueue.length); if (writeCount < this.outQueue.length) { EnigmailLog.DEBUG("mimeEncrypt.js: flushOutput: wrote " + writeCount + " instead of " + this.outQueue.length + " bytes\n"); } this.outQueue = ""; } }; //////////////////////////////////////////////////////////////////// // General-purpose functions, not exported function LOCAL_DEBUG(str) { if (gDebugLogLevel) EnigmailLog.DEBUG(str); } function initModule() { var env = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment); var nspr_log_modules = env.get("NSPR_LOG_MODULES"); var matches = nspr_log_modules.match(/mimeEncrypt:(\d+)/); if (matches && (matches.length > 1)) { gDebugLogLevel = matches[1]; LOCAL_DEBUG("mimeEncrypt.js: enabled debug logging\n"); } } var EnigmailMimeEncrypt = { Handler: PgpMimeEncrypt, startup: function(reason) { initModule(); }, shutdown: function(reason) { } }; enigmail-2.0.8/package/mimeVerify.jsm000066400000000000000000000462441334302754500175500ustar00rootroot00000000000000/*global Components: false */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailVerify"]; /** * Module for handling PGP/MIME signed messages * implemented as JS module */ const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; Cu.import("resource://gre/modules/XPCOMUtils.jsm"); /*global XPCOMUtils: false */ Cu.import("resource://enigmail/funcs.jsm"); /*global EnigmailFuncs: false */ Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ Cu.import("resource://enigmail/files.jsm"); /*global EnigmailFiles: false */ Cu.import("resource://enigmail/mime.jsm"); /*global EnigmailMime: false */ Cu.import("resource://enigmail/data.jsm"); /*global EnigmailData: false */ Cu.import("resource://enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ Cu.import("resource://enigmail/constants.jsm"); /*global EnigmailConstants: false */ Cu.import("resource://enigmail/decryption.jsm"); /*global EnigmailDecryption: false */ Cu.import("resource://enigmail/singletons.jsm"); /*global EnigmailSingletons: false */ const APPSHELL_MEDIATOR_CONTRACTID = "@mozilla.org/appshell/window-mediator;1"; const PGPMIME_PROTO = "application/pgp-signature"; const maxBufferLen = 102400; var gDebugLog = false; // MimeVerify Constructor function MimeVerify(protocol) { if (!protocol) { protocol = PGPMIME_PROTO; } this.protocol = protocol; this.verifyEmbedded = false; this.partiallySigned = false; this.inStream = Cc["@mozilla.org/scriptableinputstream;1"].createInstance(Ci.nsIScriptableInputStream); } const EnigmailVerify = { lastMsgWindow: null, lastMsgUri: null, manualMsgUri: null, currentCtHandler: EnigmailConstants.MIME_HANDLER_UNDEF, setMsgWindow: function(msgWindow, msgUriSpec) { LOCAL_DEBUG("mimeVerify.jsm: setMsgWindow: " + msgUriSpec + "\n"); this.lastMsgWindow = msgWindow; this.lastMsgUri = msgUriSpec; }, newVerifier: function(protocol) { EnigmailLog.DEBUG("mimeVerify.jsm: newVerifier: " + (protocol || "null") + "\n"); let v = new MimeVerify(protocol); return v; }, setManualUri: function(msgUriSpec) { LOCAL_DEBUG("mimeVerify.jsm: setManualUri: " + msgUriSpec + "\n"); this.manualMsgUri = msgUriSpec; }, getManualUri: function() { EnigmailLog.DEBUG("mimeVerify.jsm: getManualUri\n"); return this.manualMsgUri; }, /*** * register a PGP/MIME verify object the same way PGP/MIME encrypted mail is handled */ registerContentTypeHandler: function() { EnigmailLog.DEBUG("mimeVerify.jsm: registerContentTypeHandler\n"); let reg = Components.manager.QueryInterface(Ci.nsIComponentRegistrar); let pgpMimeClass = Components.classes["@mozilla.org/mimecth;1?type=multipart/encrypted"]; reg.registerFactory( pgpMimeClass, "Enigmail PGP/MIME verification", "@mozilla.org/mimecth;1?type=multipart/signed", null); this.currentCtHandler = EnigmailConstants.MIME_HANDLER_PGPMIME; }, unregisterContentTypeHandler: function() { EnigmailLog.DEBUG("mimeVerify.jsm: unregisterContentTypeHandler\n"); let reg = Components.manager.QueryInterface(Ci.nsIComponentRegistrar); let sMimeClass = Components.classes["@mozilla.org/nsCMSDecoder;1"]; reg.registerFactory(sMimeClass, "S/MIME verification", "@mozilla.org/mimecth;1?type=multipart/signed", null); this.currentCtHandler = EnigmailConstants.MIME_HANDLER_SMIME; } }; // MimeVerify implementation // verify the signature of PGP/MIME signed messages MimeVerify.prototype = { dataCount: 0, foundMsg: false, startMsgStr: "", msgWindow: null, msgUriSpec: null, statusDisplayed: false, exitCode: null, window: null, inStream: null, sigFile: null, sigData: "", mimePartNumber: "", QueryInterface: XPCOMUtils.generateQI([Ci.nsIStreamListener]), startStreaming: function(window, msgWindow, msgUriSpec) { LOCAL_DEBUG("mimeVerify.jsm: startStreaming\n"); this.msgWindow = msgWindow; this.msgUriSpec = msgUriSpec; this.window = window; var messenger = Cc["@mozilla.org/messenger;1"].getService(Ci.nsIMessenger); var msgSvc = messenger.messageServiceFromURI(this.msgUriSpec); msgSvc.streamMessage(this.msgUriSpec, this, this.msgWindow, null, false, null, false); }, verifyData: function(window, msgWindow, msgUriSpec, data) { LOCAL_DEBUG("mimeVerify.jsm: streamFromChannel\n"); this.msgWindow = msgWindow; this.msgUriSpec = msgUriSpec; this.window = window; this.onStartRequest(); this.onTextData(data); this.onStopRequest(); }, parseContentType: function() { let contentTypeLine = this.mimeSvc.contentType; // Eat up CRLF's. contentTypeLine = contentTypeLine.replace(/[\r\n]/g, ""); EnigmailLog.DEBUG("mimeVerify.jsm: parseContentType: " + contentTypeLine + "\n"); let protoRx = RegExp("protocol\\s*=\\s*[\\'\\\"]" + this.protocol + "[\\\"\\']", "i"); if (contentTypeLine.search(/multipart\/signed/i) >= 0 && contentTypeLine.search(protoRx) > 0) { EnigmailLog.DEBUG("mimeVerify.jsm: parseContentType: found MIME signed message\n"); this.foundMsg = true; let hdr = EnigmailFuncs.getHeaderData(contentTypeLine); hdr.boundary = hdr.boundary || ""; hdr.micalg = hdr.micalg || ""; this.boundary = hdr.boundary.replace(/['"]/g, ""); } }, onStartRequest: function(request, uri) { EnigmailLog.DEBUG("mimeVerify.jsm: onStartRequest\n"); // always log this one this.uri = uri ? uri.QueryInterface(Ci.nsIURI).clone() : null; this.mimeSvc = request.QueryInterface(Ci.nsIPgpMimeProxy); this.msgUriSpec = EnigmailVerify.lastMsgUri; if ("mimePart" in this.mimeSvc) { this.mimePartNumber = this.mimeSvc.mimePart; } else { this.mimePartNumber = ""; } this.dataCount = 0; this.foundMsg = false; this.backgroundJob = false; this.startMsgStr = ""; this.boundary = ""; this.proc = null; this.closePipe = false; this.pipe = null; this.readMode = 0; this.keepData = ""; this.last80Chars = ""; this.signedData = ""; this.statusStr = ""; this.returnStatus = null; this.statusDisplayed = false; this.protectedHeaders = null; this.parseContentType(); }, onDataAvailable: function(req, sup, stream, offset, count) { LOCAL_DEBUG("mimeVerify.jsm: onDataAvailable: " + count + "\n"); if (count > 0) { this.inStream.init(stream); var data = this.inStream.read(count); this.onTextData(data); } }, onTextData: function(data) { LOCAL_DEBUG("mimeVerify.jsm: onTextData\n"); this.dataCount += data.length; this.keepData += data; if (this.readMode === 0) { // header data let i = this.findNextMimePart(); if (i >= 0) { i += 2 + this.boundary.length; if (this.keepData[i] == "\n") { ++i; } else if (this.keepData[i] == "\r") { ++i; if (this.keepData[i] == "\n") ++i; } this.keepData = this.keepData.substr(i); data = this.keepData; this.readMode = 1; } else { this.keepData = data.substr(-this.boundary.length - 3); } } if (this.readMode === 1) { // "real data" if (data.indexOf("-") >= 0) { // only check current line for speed reasons let i = this.findNextMimePart(); if (i >= 0) { // end of "read data found" if (this.keepData[i - 2] == '\r' && this.keepData[i - 1] == '\n') { --i; } this.signedData = this.keepData.substr(0, i - 1); this.keepData = this.keepData.substr(i); this.readMode = 2; } } else return; } if (this.readMode === 2) { let i = this.keepData.indexOf("--" + this.boundary + "--"); if (i >= 0) { // ensure that we keep everything until we got the "end" boundary if (this.keepData[i - 2] == '\r' && this.keepData[i - 1] == '\n') { --i; } this.keepData = this.keepData.substr(0, i - 1); this.readMode = 3; } } if (this.readMode === 3) { // signature data if (this.protocol === PGPMIME_PROTO) { let xferEnc = this.getContentTransferEncoding(); if (xferEnc.search(/base64/i) >= 0) { let bound = this.getBodyPart(); this.keepData = EnigmailData.decodeBase64(this.keepData.substring(bound.start, bound.end)) + "\n"; } else if (xferEnc.search(/quoted-printable/i) >= 0) { let bound = this.getBodyPart(); let qp = this.keepData.substring(bound.start, bound.end); this.keepData = EnigmailData.decodeQuotedPrintable(qp) + "\n"; } // extract signature data let s = Math.max(this.keepData.search(/^-----BEGIN PGP /m), 0); let e = Math.max(this.keepData.search(/^-----END PGP /m), this.keepData.length - 30); this.sigData = this.keepData.substring(s, e + 30); } else { this.sigData = ""; } this.keepData = ""; this.readMode = 4; // ignore any further data } }, getBodyPart: function() { let start = this.keepData.search(/(\n\n|\r\n\r\n)/); if (start < 0) { start = 0; } let end = this.keepData.indexOf("--" + this.boundary + "--") - 1; if (end < 0) { end = this.keepData.length; } return { start: start, end: end }; }, // determine content-transfer encoding of mime part, assuming that whole // message is in this.keepData getContentTransferEncoding: function() { let enc = "7bit"; let m = this.keepData.match(/^(content-transfer-encoding:)(.*)$/mi); if (m && m.length > 2) { enc = m[2].trim().toLowerCase(); } return enc; }, findNextMimePart: function() { let startOk = false; let endOk = false; let i = this.keepData.indexOf("--" + this.boundary); if (i === 0) startOk = true; if (i > 0) { if (this.keepData[i - 1] == '\r' || this.keepData[i - 1] == '\n') startOk = true; } if (!startOk) return -1; if (i + this.boundary.length + 2 < this.keepData.length) { if (this.keepData[i + this.boundary.length + 2] == '\r' || this.keepData[i + this.boundary.length + 2] == '\n' || this.keepData.substr(i + this.boundary.length + 2, 2) == '--') endOk = true; } // else // endOk = true; if (i >= 0 && startOk && endOk) { return i; } return -1; }, onStopRequest: function() { EnigmailLog.DEBUG("mimeVerify.jsm: onStopRequest\n"); this.msgWindow = EnigmailVerify.lastMsgWindow; this.msgUriSpec = EnigmailVerify.lastMsgUri; let url = {}; this.backgroundJob = false; // don't try to verify if no message found // if (this.verifyEmbedded && (!this.foundMsg)) return; // TODO - check if (this.readMode < 4) { // we got incomplete data; simply return what we got this.returnData(this.signedData.length > 0 ? this.signedData : this.keepData); return; } this.protectedHeaders = EnigmailMime.extractProtectedHeaders(this.signedData); if (this.protectedHeaders && this.protectedHeaders.startPos >= 0 && this.protectedHeaders.endPos > this.protectedHeaders.startPos) { let r = this.signedData.substr(0, this.protectedHeaders.startPos) + this.signedData.substr(this.protectedHeaders.endPos); this.returnData(r); } else { this.returnData(this.signedData); } if (this.uri) { // return if not decrypting currently displayed message (except if // printing, replying, etc) this.backgroundJob = (this.uri.spec.search(/[&?]header=(print|quotebody|enigmailConvert)/) >= 0); try { var messenger = Cc["@mozilla.org/messenger;1"].getService(Ci.nsIMessenger); if (!EnigmailPrefs.getPref("autoDecrypt")) { // "decrypt manually" mode let manUrl = {}; if (EnigmailVerify.getManualUri()) { let msgSvc = messenger.messageServiceFromURI(EnigmailVerify.getManualUri()); msgSvc.GetUrlForUri(EnigmailVerify.getManualUri(), manUrl, null); } else { manUrl.value = { spec: "enigmail://invalid/message" }; } // print a message if not message explicitly decrypted let currUrlSpec = this.uri.spec.replace(/(\?.*)(number=[0-9]*)(&.*)?$/, "?$2"); let manUrlSpec = manUrl.value.spec.replace(/(\?.*)(number=[0-9]*)(&.*)?$/, "?$2"); if ((!this.backgroundJob) && currUrlSpec != manUrlSpec) { return; // this.handleManualDecrypt(); } } if (this.msgUriSpec) { let msgSvc = messenger.messageServiceFromURI(this.msgUriSpec); msgSvc.GetUrlForUri(this.msgUriSpec, url, null); } if (this.uri.spec.search(/[&?]header=[a-zA-Z0-9]*$/) < 0 && this.uri.spec.search(/[&?]part=[.0-9]+/) < 0 && this.uri.spec.search(/[&?]examineEncryptedParts=true/) < 0) { if (this.uri.spec.search(/[&?]header=filter&.*$/) > 0) return; if (this.uri && url && url.value) { if ("path" in url) { // TB < 57 if (url.value.host !== this.uri.host || url.value.path !== this.uri.path) return; } else { // TB >= 57 if (url.value.host !== this.uri.host || url.value.pathQueryRef !== this.uri.pathQueryRef) return; } } } } catch (ex) { EnigmailLog.writeException("mimeVerify.jsm", ex); EnigmailLog.DEBUG("mimeVerify.jsm: error while processing " + this.msgUriSpec + "\n"); } } if (this.protocol === PGPMIME_PROTO) { var windowManager = Cc[APPSHELL_MEDIATOR_CONTRACTID].getService(Ci.nsIWindowMediator); var win = windowManager.getMostRecentWindow(null); // create temp file holding signature data this.sigFile = EnigmailFiles.getTempDirObj(); this.sigFile.append("data.sig"); this.sigFile.createUnique(this.sigFile.NORMAL_FILE_TYPE, 0x180); EnigmailFiles.writeFileContents(this.sigFile, this.sigData, 0x180); var statusFlagsObj = {}; var errorMsgObj = {}; this.proc = EnigmailDecryption.decryptMessageStart(win, true, true, this, statusFlagsObj, errorMsgObj, EnigmailFiles.getEscapedFilename(EnigmailFiles.getFilePath(this.sigFile))); if (this.pipe) { EnigmailLog.DEBUG("mimeVerify.jsm: onStopRequest: closing pipe\n"); // always log this one this.pipe.close(); } else this.closePipe = true; } }, // return data to libMime returnData: function(data) { EnigmailLog.DEBUG("mimeVerify.jsm: returnData: " + data.length + " bytes\n"); let m = data.match(/^(content-type: +)([\w/]+)/im); if (m && m.length >= 3) { let contentType = m[2]; if (contentType.search(/^text/i) === 0) { // add multipart/mixed boundary to work around TB bug (empty forwarded message) let bound = EnigmailMime.createBoundary(); data = 'Content-Type: multipart/mixed; boundary="' + bound + '"\n' + 'Content-Disposition: inline\n\n--' + bound + '\n' + data + '\n--' + bound + '--\n'; } } if ("outputDecryptedData" in this.mimeSvc) { this.mimeSvc.outputDecryptedData(data, data.length); } else { let gConv = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(Ci.nsIStringInputStream); gConv.setData(data, data.length); try { this.mimeSvc.onStartRequest(null, null); this.mimeSvc.onDataAvailable(null, null, gConv, 0, data.length); this.mimeSvc.onStopRequest(null, null, 0); } catch (ex) { EnigmailLog.ERROR("mimeVerify.jsm: returnData(): mimeSvc.onDataAvailable failed:\n" + ex.toString()); } } }, // API for decryptMessage Listener stdin: function(pipe) { LOCAL_DEBUG("mimeVerify.jsm: stdin\n"); if (this.signedData.length > 0) { LOCAL_DEBUG("mimeVerify.jsm: writing " + this.signedData.length + " bytes\n"); // ensure all lines end with CRLF as specified in RFC 3156, section 5 this.signedData = this.signedData.replace(/\r\n/g, "\n").replace(/\n/g, "\r\n"); pipe.write(this.signedData); } if (this.closePipe) { pipe.close(); } else { this.pipe = pipe; } }, stdout: function(s) { LOCAL_DEBUG("mimeVerify.jsm: stdout:" + s.length + "\n"); this.dataLength += s.length; }, stderr: function(s) { LOCAL_DEBUG("mimeVerify.jsm: stderr\n"); this.statusStr += s; }, done: function(exitCode) { LOCAL_DEBUG("mimeVerify.jsm: done: " + exitCode + "\n"); this.exitCode = exitCode; //LOCAL_DEBUG("mimeVerify.jsm: "+this.statusStr+"\n"); this.returnStatus = {}; EnigmailDecryption.decryptMessageEnd(this.statusStr, this.exitCode, this.dataLength, true, // verifyOnly true, EnigmailConstants.UI_PGP_MIME, this.returnStatus); if (this.partiallySigned) this.returnStatus.statusFlags |= EnigmailConstants.PARTIALLY_PGP; this.displayStatus(); if (this.sigFile) this.sigFile.remove(false); }, setMsgWindow: function(msgWindow, msgUriSpec) { EnigmailLog.DEBUG("mimeVerify.jsm: setMsgWindow: " + msgUriSpec + "\n"); if (!this.msgWindow) { this.msgWindow = msgWindow; this.msgUriSpec = msgUriSpec; } }, displayStatus: function() { EnigmailLog.DEBUG("mimeVerify.jsm: displayStatus\n"); if (this.exitCode === null || this.msgWindow === null || this.statusDisplayed || this.backgroundJob) return; try { LOCAL_DEBUG("mimeVerify.jsm: displayStatus displaying result\n"); let headerSink = EnigmailSingletons.messageReader; if (this.protectedHeaders) { headerSink.processDecryptionResult(this.uri, "modifyMessageHeaders", JSON.stringify(this.protectedHeaders.newHeaders), this.mimePartNumber); } if (headerSink) { headerSink.updateSecurityStatus(this.lastMsgUri, this.exitCode, this.returnStatus.statusFlags, this.returnStatus.keyId, this.returnStatus.userId, this.returnStatus.sigDetails, this.returnStatus.errorMsg, this.returnStatus.blockSeparation, this.uri, JSON.stringify({ encryptedTo: this.returnStatus.encToDetails }), this.mimePartNumber); } this.statusDisplayed = true; } catch (ex) { EnigmailLog.writeException("mimeVerify.jsm", ex); } } }; //////////////////////////////////////////////////////////////////// // General-purpose functions, not exported function LOCAL_DEBUG(str) { if (gDebugLog) EnigmailLog.DEBUG(str); } function initModule() { var env = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment); var nspr_log_modules = env.get("NSPR_LOG_MODULES"); var matches = nspr_log_modules.match(/mimeVerify:(\d+)/); if (matches && (matches.length > 1)) { if (matches[1] > 2) gDebugLog = true; } } initModule(); enigmail-2.0.8/package/msgCompFields.jsm000066400000000000000000000075761334302754500201750ustar00rootroot00000000000000/*global Components XPCOMUtils */ /* jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ 'use strict'; var EXPORTED_SYMBOLS = ["EnigmailMsgCompFields"]; Components.utils.import("resource://gre/modules/XPCOMUtils.jsm"); const Ci = Components.interfaces; // components defined in this file const ENIG_ENIGMSGCOMPFIELDS_CONTRACTID = "@mozdev.org/enigmail/composefields;1"; const ENIG_ENIGMSGCOMPFIELDS_CID = Components.ID("{847b3a30-7ab1-11d4-8f02-006008948af5}"); /** * This object extends nsIMsgSMIMECompFields and nsIMsgCompFields. * As this can't be done directly anymore, we abuse nsIMsgSearchValue * to store a JSON string in the "str" field. * * The Enigmail-specific values should not be accessed directly, but via * EnigmailMsgCompFields.getValue and EnigmailMsgCompFields.setValue * */ function MessageCompFields(smimeCompFields) { this._parent = smimeCompFields; // nsIMsgCompFields and nsIMsgSMIMECompFields values const members = ["from", "replyTo", "to", "cc", "bcc", "fcc", "fcc2", "newsgroups", "newshost", "newspostUrl", "followupTo", "subject", "attachments", "organization", "references", "priority", "messageId", "characterSet", "defaultCharacterSet", "templateName", "draftId", "returnReceipt", "receiptHeaderType", "attachVCard", "forcePlainText", "useMultipartAlternative", "uuEncodeAttachments", "bodyIsAsciiOnly", "forceMsgEncoding", "otherRandomHeaders", "body", "temporaryFiles", "attachmentsArray", "addAttachment", "removeAttachment", "removeAttachments", "ConvertBodyToPlainText", "checkCharsetConversion", "needToCheckCharset", "securityInfo", "senderReply", "allReply", "splitRecipients", "listReply", "requireEncryptMessage", "signMessage" ]; this._parent = smimeCompFields; if (smimeCompFields) { for (let m in members) { this[m] = smimeCompFields[m]; } } // nsIMsgSearchValue attributes this.str = "{}"; this.date = null; this.status = null; this.size = null; this.msgKey = null; this.age = null; this.folder = null; this.label = null; this.junkStatus = null; this.junkPercent = null; } MessageCompFields.prototype = { classDescription: "Enigmail Msg Compose Fields", classID: ENIG_ENIGMSGCOMPFIELDS_CID, contractID: ENIG_ENIGMSGCOMPFIELDS_CONTRACTID, QueryInterface: XPCOMUtils.generateQI([ Ci.nsIMsgSearchValue, // we abuse nsIMsgSearchValue as we cannot create a custom QueryInterface anymore Ci.nsIMsgSMIMECompFields, Ci.nsIMsgCompFields ]), toString: function() { return ""; } }; var EnigmailMsgCompFields = { CompFields: MessageCompFields, createObject: function(smimeCompFields) { return new MessageCompFields(smimeCompFields); }, setValue: function(enigCompFields, fieldName, value) { let cf = enigCompFields.QueryInterface(Ci.nsIMsgSearchValue); let o = {}; try { o = JSON.parse(cf.str); } catch (ex) {} o[fieldName] = value; cf.str = JSON.stringify(o); }, getEnigmailValues: function(enigCompFields) { let cf = '{}'; try { cf = enigCompFields.QueryInterface(Ci.nsIMsgSearchValue); } catch (x) {} let o = {}; try { o = JSON.parse(cf.str); } catch (ex) { return null; } return o; }, getValue: function(enigCompFields, fieldName) { let o = this.getEnigmailValues(enigCompFields); if (!o) return null; return o[fieldName]; }, isEnigmailCompField: function(enigCompFields) { try { let cf = enigCompFields.QueryInterface(Ci.nsIMsgSearchValue); return true; } catch (ex) { return false; } } }; enigmail-2.0.8/package/msgRead.jsm000066400000000000000000000157131334302754500170130ustar00rootroot00000000000000/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ /*global Components: false */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailMsgRead"]; const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; /** * Message-reading related functions */ Cu.import("resource://enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ Cu.import("resource://enigmail/app.jsm"); /*global EnigmailApp: false */ Cu.import("resource://enigmail/versioning.jsm"); /*global EnigmailVersioning: false */ const ExtraHeaders = ["autocrypt", "openpgp"]; var EnigmailMsgRead = { /** * Ensure that Thunderbird prepares certain headers during message reading */ ensureExtraAddonHeaders: function() { let r = EnigmailPrefs.getPrefRoot(); // is the Mozilla Platform number >= 59? let isPlatform59 = EnigmailVersioning.greaterThanOrEqual(EnigmailApp.getPlatformVersion(), "59.0a1"); let prefName = (isPlatform59 ? "mailnews.headers.extraAddonHeaders" : "mailnews.headers.extraExpandedHeaders"); let hdr = r.getCharPref(prefName); if (hdr !== "*") { // do nothing if extraAddonHeaders is "*" (all headers) for (let h of ExtraHeaders) { let sr = new RegExp("\\b" + h + "\\b", "i"); if (hdr.search(h) < 0) { if (hdr.length > 0) hdr += " "; hdr += h; } } r.setCharPref(prefName, hdr); } if (isPlatform59) { this.cleanupOldPref(); } }, /** * Clean up extraExpandedHeaders after upgrading to TB 59 and newer, or upon shutdown. */ cleanupOldPref: function() { let r = EnigmailPrefs.getPrefRoot(); let hdr = r.getCharPref("mailnews.headers.extraExpandedHeaders"); for (let h of ExtraHeaders) { let sr = new RegExp("\\b" + h + "\\b", "i"); if (hdr.search(h) >= 0) { hdr = hdr.replace(sr, " "); } } r.setCharPref("mailnews.headers.extraExpandedHeaders", hdr.trim()); }, /** * Get a mail URL from a uriSpec * * @param uriSpec: String - URI of the desired message * * @return Object: nsIURL or nsIMsgMailNewsUrl object */ getUrlFromUriSpec: function(uriSpec) { try { if (!uriSpec) return null; let messenger = Cc["@mozilla.org/messenger;1"].getService(Ci.nsIMessenger); let msgService = messenger.messageServiceFromURI(uriSpec); let urlObj = {}; msgService.GetUrlForUri(uriSpec, urlObj, null); let url = urlObj.value; if (url.scheme == "file") { return url; } else { return url.QueryInterface(Ci.nsIMsgMailNewsUrl); } } catch (ex) { return null; } }, /** * Determine if an attachment is possibly signed */ checkSignedAttachment: function(attachmentObj, index, currentAttachments) { function escapeRegex(string) { return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string } var attachmentList; if (index !== null) { attachmentList = attachmentObj; } else { attachmentList = currentAttachments; for (let i = 0; i < attachmentList.length; i++) { if (attachmentList[i].url == attachmentObj.url) { index = i; break; } } if (index === null) return false; } var signed = false; var findFile; var attName = this.getAttachmentName(attachmentList[index]).toLowerCase().replace(/\+/g, "\\+"); // check if filename is a signature if ((this.getAttachmentName(attachmentList[index]).search(/\.(sig|asc)$/i) > 0) || (attachmentList[index].contentType.match(/^application\/pgp-signature/i))) { findFile = new RegExp(escapeRegex(attName.replace(/\.(sig|asc)$/, ""))); } else if (attName.search(/\.pgp$/i) > 0) { findFile = new RegExp(escapeRegex(attName.replace(/\.pgp$/, "")) + "(\\.pgp)?\\.(sig|asc)$"); } else { findFile = new RegExp(escapeRegex(attName) + "\\.(sig|asc)$"); } for (let i in attachmentList) { if ((i != index) && (this.getAttachmentName(attachmentList[i]).toLowerCase().search(findFile) === 0)) signed = true; } return signed; }, /** * Get the name of an attachment from the attachment object */ getAttachmentName: function(attachment) { if ("name" in attachment) { // Thunderbird return attachment.name; } else // SeaMonkey return attachment.displayName; }, /** * Escape text such that it can be used as HTML text */ escapeTextForHTML: function(text, hyperlink) { // Escape special characters if (text.indexOf("&") > -1) text = text.replace(/&/g, "&"); if (text.indexOf("<") > -1) text = text.replace(/") > -1) text = text.replace(/>/g, ">"); if (text.indexOf("\"") > -1) text = text.replace(/"/g, """); if (!hyperlink) return text; // Hyperlink email addresses (we accept at most 1024 characters before and after the @) var addrs = text.match(/\b[A-Za-z0-9_+.-]{1,1024}@[A-Za-z0-9.-]{1,1024}\b/g); var newText, offset, loc; if (addrs && addrs.length) { newText = ""; offset = 0; for (var j = 0; j < addrs.length; j++) { var addr = addrs[j]; loc = text.indexOf(addr, offset); if (loc < offset) break; if (loc > offset) newText += text.substr(offset, loc - offset); // Strip any period off the end of address addr = addr.replace(/[.]$/, ""); if (!addr.length) continue; newText += "" + addr + ""; offset = loc + addr.length; } newText += text.substr(offset, text.length - offset); text = newText; } // Hyperlink URLs (we don't accept URLS or more than 1024 characters length) var urls = text.match(/\b(http|https|ftp):\S{1,1024}\s/g); if (urls && urls.length) { newText = ""; offset = 0; for (var k = 0; k < urls.length; k++) { var url = urls[k]; loc = text.indexOf(url, offset); if (loc < offset) break; if (loc > offset) newText += text.substr(offset, loc - offset); // Strip delimiters off the end of URL url = url.replace(/\s$/, ""); url = url.replace(/([),.']|>|")$/, ""); if (!url.length) continue; newText += "" + url + ""; offset = loc + url.length; } newText += text.substr(offset, text.length - offset); text = newText; } return text; }, onShutdown: function(reason) { try { let isPlatform59 = EnigmailVersioning.greaterThanOrEqual(EnigmailApp.getPlatformVersion(), "59.0a1"); if (isPlatform59) return; EnigmailMsgRead.cleanupOldPref(); } catch (ex) {} } }; enigmail-2.0.8/package/openpgp.jsm000066400000000000000000000172451334302754500171030ustar00rootroot00000000000000/* * This Source Code Form is licensed under the GNU LGPL 3.0 license. * */ "use strict"; /** * This code is taken from openpgp.js * * Do OpenPGP packet parsing */ /* global Components: false */ /* eslint no-invalid-this: 0 */ var EXPORTED_SYMBOLS = ["EnigmailOpenPGP"]; const Cu = Components.utils; const Cc = Components.classes; const Ci = Components.interfaces; var window; var document; const { Services } = Cu.import("resource://gre/modules/Services.jsm"); var crc_table = [0x00000000, 0x00864cfb, 0x018ad50d, 0x010c99f6, 0x0393e6e1, 0x0315aa1a, 0x021933ec, 0x029f7f17, 0x07a18139, 0x0727cdc2, 0x062b5434, 0x06ad18cf, 0x043267d8, 0x04b42b23, 0x05b8b2d5, 0x053efe2e, 0x0fc54e89, 0x0f430272, 0x0e4f9b84, 0x0ec9d77f, 0x0c56a868, 0x0cd0e493, 0x0ddc7d65, 0x0d5a319e, 0x0864cfb0, 0x08e2834b, 0x09ee1abd, 0x09685646, 0x0bf72951, 0x0b7165aa, 0x0a7dfc5c, 0x0afbb0a7, 0x1f0cd1e9, 0x1f8a9d12, 0x1e8604e4, 0x1e00481f, 0x1c9f3708, 0x1c197bf3, 0x1d15e205, 0x1d93aefe, 0x18ad50d0, 0x182b1c2b, 0x192785dd, 0x19a1c926, 0x1b3eb631, 0x1bb8faca, 0x1ab4633c, 0x1a322fc7, 0x10c99f60, 0x104fd39b, 0x11434a6d, 0x11c50696, 0x135a7981, 0x13dc357a, 0x12d0ac8c, 0x1256e077, 0x17681e59, 0x17ee52a2, 0x16e2cb54, 0x166487af, 0x14fbf8b8, 0x147db443, 0x15712db5, 0x15f7614e, 0x3e19a3d2, 0x3e9fef29, 0x3f9376df, 0x3f153a24, 0x3d8a4533, 0x3d0c09c8, 0x3c00903e, 0x3c86dcc5, 0x39b822eb, 0x393e6e10, 0x3832f7e6, 0x38b4bb1d, 0x3a2bc40a, 0x3aad88f1, 0x3ba11107, 0x3b275dfc, 0x31dced5b, 0x315aa1a0, 0x30563856, 0x30d074ad, 0x324f0bba, 0x32c94741, 0x33c5deb7, 0x3343924c, 0x367d6c62, 0x36fb2099, 0x37f7b96f, 0x3771f594, 0x35ee8a83, 0x3568c678, 0x34645f8e, 0x34e21375, 0x2115723b, 0x21933ec0, 0x209fa736, 0x2019ebcd, 0x228694da, 0x2200d821, 0x230c41d7, 0x238a0d2c, 0x26b4f302, 0x2632bff9, 0x273e260f, 0x27b86af4, 0x252715e3, 0x25a15918, 0x24adc0ee, 0x242b8c15, 0x2ed03cb2, 0x2e567049, 0x2f5ae9bf, 0x2fdca544, 0x2d43da53, 0x2dc596a8, 0x2cc90f5e, 0x2c4f43a5, 0x2971bd8b, 0x29f7f170, 0x28fb6886, 0x287d247d, 0x2ae25b6a, 0x2a641791, 0x2b688e67, 0x2beec29c, 0x7c3347a4, 0x7cb50b5f, 0x7db992a9, 0x7d3fde52, 0x7fa0a145, 0x7f26edbe, 0x7e2a7448, 0x7eac38b3, 0x7b92c69d, 0x7b148a66, 0x7a181390, 0x7a9e5f6b, 0x7801207c, 0x78876c87, 0x798bf571, 0x790db98a, 0x73f6092d, 0x737045d6, 0x727cdc20, 0x72fa90db, 0x7065efcc, 0x70e3a337, 0x71ef3ac1, 0x7169763a, 0x74578814, 0x74d1c4ef, 0x75dd5d19, 0x755b11e2, 0x77c46ef5, 0x7742220e, 0x764ebbf8, 0x76c8f703, 0x633f964d, 0x63b9dab6, 0x62b54340, 0x62330fbb, 0x60ac70ac, 0x602a3c57, 0x6126a5a1, 0x61a0e95a, 0x649e1774, 0x64185b8f, 0x6514c279, 0x65928e82, 0x670df195, 0x678bbd6e, 0x66872498, 0x66016863, 0x6cfad8c4, 0x6c7c943f, 0x6d700dc9, 0x6df64132, 0x6f693e25, 0x6fef72de, 0x6ee3eb28, 0x6e65a7d3, 0x6b5b59fd, 0x6bdd1506, 0x6ad18cf0, 0x6a57c00b, 0x68c8bf1c, 0x684ef3e7, 0x69426a11, 0x69c426ea, 0x422ae476, 0x42aca88d, 0x43a0317b, 0x43267d80, 0x41b90297, 0x413f4e6c, 0x4033d79a, 0x40b59b61, 0x458b654f, 0x450d29b4, 0x4401b042, 0x4487fcb9, 0x461883ae, 0x469ecf55, 0x479256a3, 0x47141a58, 0x4defaaff, 0x4d69e604, 0x4c657ff2, 0x4ce33309, 0x4e7c4c1e, 0x4efa00e5, 0x4ff69913, 0x4f70d5e8, 0x4a4e2bc6, 0x4ac8673d, 0x4bc4fecb, 0x4b42b230, 0x49ddcd27, 0x495b81dc, 0x4857182a, 0x48d154d1, 0x5d26359f, 0x5da07964, 0x5cace092, 0x5c2aac69, 0x5eb5d37e, 0x5e339f85, 0x5f3f0673, 0x5fb94a88, 0x5a87b4a6, 0x5a01f85d, 0x5b0d61ab, 0x5b8b2d50, 0x59145247, 0x59921ebc, 0x589e874a, 0x5818cbb1, 0x52e37b16, 0x526537ed, 0x5369ae1b, 0x53efe2e0, 0x51709df7, 0x51f6d10c, 0x50fa48fa, 0x507c0401, 0x5542fa2f, 0x55c4b6d4, 0x54c82f22, 0x544e63d9, 0x56d11cce, 0x56575035, 0x575bc9c3, 0x57dd8538 ]; function initialize() { const { EnigmailLog } = Cu.import("resource://enigmail/log.jsm", {}); EnigmailLog.DEBUG("openpgp.jsm: initialize()\n"); try { let appShellSvc = Cc["@mozilla.org/appshell/appShellService;1"].getService(Ci.nsIAppShellService); window = appShellSvc.hiddenDOMWindow; document = window.document; Services.scriptloader.loadSubScript("resource://enigmail/stdlib/openpgp-lib.js", null, "UTF-8"); //this.openpgp = window.openpgp; } catch (ex) { EnigmailLog.ERROR("openpgp.jsm: initialize: error: " + ex.message + "\n"); } } var EnigmailOpenPGP = { get openpgp() { if (!window) { initialize(); } return window.openpgp; }, enigmailFuncs: { /** * Convert a string to an Uint8Array * * @param str: String with binary data * @return Uint8Array */ str2Uint8Array: function(str) { var buf = new ArrayBuffer(str.length); var bufView = new Uint8Array(buf); for (var i = 0, strLen = str.length; i < strLen; i++) { bufView[i] = str.charCodeAt(i); } return bufView; }, /** * Create CRC24 checksum * * @param input: Uint8Array of input data * * @return Number */ createcrc24: function(input) { var crc = 0xB704CE; var index = 0; while (input.length - index > 16) { crc = crc << 8 ^ crc_table[(crc >> 16 ^ input[index]) & 0xff]; crc = crc << 8 ^ crc_table[(crc >> 16 ^ input[index + 1]) & 0xff]; crc = crc << 8 ^ crc_table[(crc >> 16 ^ input[index + 2]) & 0xff]; crc = crc << 8 ^ crc_table[(crc >> 16 ^ input[index + 3]) & 0xff]; crc = crc << 8 ^ crc_table[(crc >> 16 ^ input[index + 4]) & 0xff]; crc = crc << 8 ^ crc_table[(crc >> 16 ^ input[index + 5]) & 0xff]; crc = crc << 8 ^ crc_table[(crc >> 16 ^ input[index + 6]) & 0xff]; crc = crc << 8 ^ crc_table[(crc >> 16 ^ input[index + 7]) & 0xff]; crc = crc << 8 ^ crc_table[(crc >> 16 ^ input[index + 8]) & 0xff]; crc = crc << 8 ^ crc_table[(crc >> 16 ^ input[index + 9]) & 0xff]; crc = crc << 8 ^ crc_table[(crc >> 16 ^ input[index + 10]) & 0xff]; crc = crc << 8 ^ crc_table[(crc >> 16 ^ input[index + 11]) & 0xff]; crc = crc << 8 ^ crc_table[(crc >> 16 ^ input[index + 12]) & 0xff]; crc = crc << 8 ^ crc_table[(crc >> 16 ^ input[index + 13]) & 0xff]; crc = crc << 8 ^ crc_table[(crc >> 16 ^ input[index + 14]) & 0xff]; crc = crc << 8 ^ crc_table[(crc >> 16 ^ input[index + 15]) & 0xff]; index += 16; } for (var j = index; j < input.length; j++) { crc = crc << 8 ^ crc_table[(crc >> 16 ^ input[index++]) & 0xff]; } return crc & 0xffffff; }, /** * Create an ASCII armored string from binary data. The message data is NOT * checked for correctness, only the CRC is added at the end. * * @param msgType: Number - type of OpenPGP message to create (ARMOR Enum) * @param str: String - binary OpenPGP message * * @return String: ASCII armored OpenPGP message */ bytesToArmor: function(msgType, str) { const ARMOR_TYPE = EnigmailOpenPGP.openpgp.enums.armor; let hdr = ""; switch (msgType) { case ARMOR_TYPE.signed: case ARMOR_TYPE.message: hdr = "MESSAGE"; break; case ARMOR_TYPE.public_key: hdr = "PUBLIC KEY BLOCK"; break; case ARMOR_TYPE.private_key: hdr = "PRIVATE KEY BLOCK"; break; case ARMOR_TYPE.signature: hdr = "SIGNATURE"; break; } let crc = EnigmailOpenPGP.enigmailFuncs.createcrc24(EnigmailOpenPGP.enigmailFuncs.str2Uint8Array(str)); let crcAsc = String.fromCharCode(crc >> 16) + String.fromCharCode(crc >> 8 & 0xFF) + String.fromCharCode(crc & 0xFF); let s = "-----BEGIN PGP " + hdr + "-----\n\n" + btoa(str).replace(/(.{72})/g, "$1\n") + "\n" + "=" + btoa(crcAsc) + "\n" + "-----END PGP " + hdr + "-----\n"; return s; }, getCrypto: function() { if (!window) { initialize(); } return window.crypto; } } }; enigmail-2.0.8/package/os.jsm000066400000000000000000000051771334302754500160550ustar00rootroot00000000000000/*global Components: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; const EXPORTED_SYMBOLS = ["EnigmailOS"]; const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; const XPCOM_APPINFO = "@mozilla.org/xre/app-info;1"; // Cu.import("chrome://enigmail/content/modules/lazy.jsm"); /* global EnigmailLazy: false */ // const getExecution = EnigmailLazy.loader("enigmail/execution.jsm", "EnigmailExecution"); let operatingSystem = null; function getOS() { if (operatingSystem === null) { operatingSystem = Cc[XPCOM_APPINFO].getService(Ci.nsIXULRuntime).OS; } return operatingSystem; } function isDosLike() { return getOS() === "WINNT" || getOS() === "OS2"; } function isMac() { return getOS() === "Darwin"; } function isWin32() { return getOS() === "WINNT"; } var EnigmailOS = { /* * getOS uses the Mozilla nsIXULRuntime Component to retrieve the OS Target * * @return String - OS Identifier */ getOS: getOS, /** * isDosLike identifies whether the host computer is MS-DOS based * * @return Boolean - True if local host is MS-DOS based. False otherwise. */ isDosLike: isDosLike(), /** * isWin32 identifies whether the running system is a Windows (32 or 64 bit) machine * * @return Boolean - True if local host is a Windows machine. False otherwise. */ isWin32: isWin32(), /** * isMac identifies whether the running system is a Mac * * @return Boolean - True if local host is a derivative of Darwin. False otherwise. */ isMac: isMac(), /** * get a Windows registry value (string) * * @param keyPath String - the path of the registry (e.g. Software\\GNU\\GnuPG) * @param keyName String - the name of the key to get (e.g. InstallDir) * @param rootKey Number - HKLM, HKCU, etc. (according to constants in nsIWindowsRegKey) * * @return String - the found registry value (or empty string if not found) */ getWinRegistryString: function(keyPath, keyName, rootKey) { const registry = Cc["@mozilla.org/windows-registry-key;1"].createInstance(Ci.nsIWindowsRegKey); let retval = ""; try { registry.open(rootKey, keyPath, registry.ACCESS_READ); retval = registry.readStringValue(keyName); registry.close(); } catch (ex) {} return retval; }, getNullFile: function() { if (this.isDosLike) { return "NUL"; } else { return "/dev/null"; } } }; enigmail-2.0.8/package/overlays.jsm000066400000000000000000000521771334302754500173020ustar00rootroot00000000000000/*global Components: false*/ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ /** * Load overlays in a similar way as XUL did for non-bootstrapped addons * Unlike "real" XUL, overlays are only loaded over window URLs, and no longer * over any xul file that is loaded somewhere. * * * Prepare the XUL files: * * 1. Elements can be referenced by ID, or by CSS selector (document.querySelector()). * To use the a CSS Selector query, define the attribute "overlay_target" * e.g. * * 3. inline scripts are not supported * * 4. if you add buttons to a toolbar using in your XUL, add the * following attributes to the toolbarpalette: * targetToolbox="some_id" --> the ID of the *toolbox* where the buttons are added * targetToolbar="some_id" --> the ID of the *toolbar* where the buttons are added * * Prepare the JavaScript: * 1. Event listeners registering for "load" now need to listen to "load-"+MY_ADDON_ID */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailOverlays"]; const { classes: Cc, interfaces: Ci, utils: Cu } = Components; const APP_SHUTDOWN = 2; const { Services } = Cu.import("resource://gre/modules/Services.jsm", {}); Cu.importGlobalProperties(["XMLHttpRequest"]); // the following constants need to be customized for each addon const BASE_PATH = "chrome://enigmail/content/"; const MY_ADDON_ID = "enigmail"; const overlays = { // main mail reading window "chrome://messenger/content/messenger.xul": [ "columnOverlay.xul", { // Overlay for Thunderbird (and other non-SeaMonkey apps) url: "messengerOverlay-tbird.xul", application: "!{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}" }, { // Overlay for SeaMonkey url: "messengerOverlay-sm.xul", application: "{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}" }, "enigmailMessengerOverlay.xul", "enigmailMsgHdrViewOverlay.xul" ], // single message reader window "chrome://messenger/content/messageWindow.xul": [{ // Overlay for Thunderbird (and other non-SeaMonkey apps) url: "messengerOverlay-tbird.xul", application: "!{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}" }, { // Overlay for SeaMonkey url: "messengerOverlay-sm.xul", application: "{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}" }, "enigmailMessengerOverlay.xul", "enigmailMsgHdrViewOverlay.xul" ], "chrome://messenger/content/messengercompose/messengercompose.xul": [{ // Overlay for Thunderbird (and other non-SeaMonkey apps) url: "enigmailMsgComposeOverlay.xul", application: "!{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}" }, { // Overlay for SeaMonkey url: "enigmailMsgComposeOverlay-sm.xul", application: "{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}" }], "chrome://messenger/content/FilterEditor.xul": ["enigmailFilterEditorOverlay.xul"], "chrome://messenger/content/FilterListDialog.xul": ["enigmailFilterListOverlay.xul"], "chrome://messenger/content/am-identity-edit.xul": [ "enigmailAmIdEditOverlay.xul", "enigmailEditIdentity.xul" ], "chrome://messenger/content/addressbook/addressbook.xul": ["enigmailAbCardViewOverlay.xul"], "chrome://enigmail/content/editSingleAccount.xul": ["enigmailEditIdentity.xul"], // // // Overlay for privacy preferences in Thunderbird "chrome://messenger/content/preferences/preferences.xul": ["enigmailPrivacyOverlay.xul"], // // Overlay for Customize Toolbar (Windows, Linux) "chrome://global/content/customizeToolbar.xul": ["enigmailCustToolOverlay.xul"], "chrome://messenger/content/customizeToolbar.xul": ["enigmailCustToolOverlay.xul"], // // // Overlay for Account Manager "chrome://messenger/content/AccountManager.xul": ["accountManagerOverlay.xul"], "chrome://messenger/content/msgPrintEngine.xul": ["enigmailMsgPrintOverlay.xul"] }; ///////// Enigmail-specific part start const { EnigmailLog } = Cu.import("resource://enigmail/log.jsm", {}); function DEBUG_LOG(str) { EnigmailLog.DEBUG(str); } function ERROR_LOG(str) { EnigmailLog.ERROR(str); } ///////// Enigmail-specific part end var WindowListener = { setupUI: function(window, overlayDefs) { DEBUG_LOG("overlays.jsm: setupUI(" + window.document.location.href + ")\n"); loadOverlays(window, overlayDefs).then(ignore => {}).catch(ignore => {}); }, tearDownUI: function(window) { let document = window.document; // unload UI elements let s = document.querySelectorAll("[overlay_source='" + MY_ADDON_ID + "']"); for (let i = 0; i < s.length; i++) { let p = s[i].parentNode; p.removeChild(s[i]); } let e = new Event("unload-" + MY_ADDON_ID); window.dispatchEvent(e); // unload CSS s = document.querySelectorAll("overlayed_css[source='" + MY_ADDON_ID + "']"); for (let i = 0; i < s.length; i++) { unloadCSS(s[i].getAttribute("href"), window); let p = s[i].parentNode; p.removeChild(s[i]); } }, // nsIWindowMediatorListener functions onOpenWindow: function(xulWindow) { // A new window has opened let domWindow = xulWindow.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindow); // Wait for it to finish loading domWindow.addEventListener("load", function listener() { domWindow.removeEventListener("load", listener, false); for (let w in overlays) { // If this is a relevant window then setup its UI if (domWindow.document.location.href.startsWith(w)) WindowListener.setupUI(domWindow, overlays[w]); } }, false); }, onCloseWindow: function(xulWindow) {}, onWindowTitleChange: function(xulWindow, newTitle) {} }; /** * Determine if an overlay exists for a window, and if so * load it */ function loadUiForWindow(domWindow) { for (let w in overlays) { // If this is a relevant window then setup its UI if (domWindow.document.location.href.startsWith(w)) WindowListener.setupUI(domWindow, overlays[w]); } } var EnigmailOverlays = { /** * Called by bootstrap.js upon startup of the addon * (e.g. enabling, instalation, update, application startup) * * @param reason: Number - bootstrap "reason" constant */ startup: function(reason) { DEBUG_LOG("overlays.jsm: startup()\n"); let wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator); // Wait for any new windows to open wm.addListener(WindowListener); // Get the list of windows already open let windows = wm.getEnumerator(null); while (windows.hasMoreElements()) { try { let domWindow = windows.getNext().QueryInterface(Ci.nsIDOMWindow); DEBUG_LOG("overlays.jsm: startup: found window: " + domWindow.document.location.href + "\n"); if (domWindow.document.location.href === "about:blank") { // a window is available, but it's not yet fully loaded // ==> add an event listener to fire when the window is completely loaded domWindow.addEventListener("load", function loadUi() { domWindow.removeEventListener("load", loadUi, false); loadUiForWindow(domWindow); }, false); } else { loadUiForWindow(domWindow); } } catch (ex) { DEBUG_LOG("overlays.jsm: startup: error " + ex.message + "\n"); } } }, /** * Called by bootstrap.js upon shutdown of the addon * (e.g. disabling, uninstalling, update, application shutdown) * * @param reason: Number - bootstrap "reason" constant */ shutdown: function(reason) { DEBUG_LOG("overlay.jsm: initiating shutdown\n"); // When the application is shutting down we normally don't have to clean // up any UI changes made if (reason == APP_SHUTDOWN) return; let wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator); // Stop listening for any new windows to open wm.removeListener(WindowListener); // Get the list of windows already open let windows = wm.getEnumerator(null); while (windows.hasMoreElements()) { let domWindow = windows.getNext().QueryInterface(Ci.nsIDOMWindow); WindowListener.tearDownUI(domWindow); // If this is a window opened by the addon, then close it if (domWindow.document.location.href.startsWith(BASE_PATH)) domWindow.close(); } DEBUG_LOG("overlay.jsm: shutdown complete\n"); }, /** * Load overlays (See below) */ loadOverlays: loadOverlays, /** * Load insert a single overlay (see below) */ insertXul: insertXul }; function getAppId() { return Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULAppInfo).ID; } /** * Load XUL into window * @param srcUrl: String - URL of XUL to load * @param window: Object - target window * @param document: Object - document in target window */ function insertXul(srcUrl, window, document, callback) { function injectDOM(xul) { function $(id) { return document.getElementById(id); } function $$(q) { return document.querySelector(q); } function getToolbarNthTag(toolbar, tagName, elemIndex) { if (elemIndex >= 0) { let s = new RegExp("^" + tagName + "[0-9]+$"); let node = toolbar.firstChild; let n = -1; while (node) { if (node.id.search(s) === 0) n++; if (n == elemIndex) return node; node = node.nextSibling; } } return null; } /** * get toolbar element for separator, spacer and spring */ function getToolbarElem(toolbar, currentset, index) { if (currentset[index] && (currentset[index].search(/^(separator|spacer|spring)$/) === 0)) { let target = currentset[index]; let foundIndex = -1; // find the n-th separator/spacer/spring for (let i = 0; i < index + 1; i++) { if (currentset[i] === target) ++foundIndex; } return getToolbarNthTag(toolbar, target, foundIndex); } return null; } /** * Add a button at the correct place on a toolbar. * Buttons are always added to the toolbar palette. Whether or not the button is added to the * toolbar depends on: * 1. if it's in the currentset of the toolbar (i.e. added previously) * 2. if it's defined a default button and the button has never been added to the toolbar before * * @param palette: Object - the toolbar palette containing all buttons (also invisible ones) * @param toolbarButton Object - the button to add * @param toolbarId String - the ID of the toolbar where the button shall be added * */ function addToolbarButton(palette, toolbarButton, toolbarId) { DEBUG_LOG("overlays.jsm: adding button '" + toolbarButton.id + " to " + toolbarId + "'\n"); let toolbar = $(toolbarId); let buttonId = toolbarButton.id; let firstRun = false; let currentset = toolbar.getAttribute("currentset").split(/,/); if (toolbar.getAttribute("currentset").length === 0) { currentset = toolbar.getAttribute("defaultset").split(/,/); } toolbarButton.setAttribute("overlay_source", MY_ADDON_ID); palette.appendChild(toolbarButton); let index = currentset.indexOf(buttonId); if (index >= 0) { // button was added before let before = null; for (let i = index + 1; i < currentset.length; i++) { if (currentset[i].search(/^(separator|spacer|spring)$/) < 0) { before = $(currentset[i]); } else { before = getToolbarElem(toolbar, currentset, i); } if (before) break; } toolbar.insertItem(buttonId, before); } } // loadOverlay for the poor function addNode(target, node) { // helper: insert according to position function insertX(nn, attr, callbackFunc) { if (!nn.hasAttribute(attr)) { return false; } let places = nn.getAttribute(attr) .split(',') .map(p => p.trim()) .filter(p => Boolean(p)); for (let p of places) { let pn = $$('#' + target.id + ' > #' + p); if (!pn) { continue; } if (callbackFunc) callbackFunc(pn); return true; } return false; } node.setAttribute("overlay_source", MY_ADDON_ID); // bring the node to be inserted into the document let nn = document.importNode(node, true); // try to insert according to insertafter/before if (insertX(nn, 'insertafter', pn => pn.parentNode.insertBefore(nn, pn.nextSibling)) || insertX(nn, 'insertbefore', pn => pn.parentNode.insertBefore(nn, pn))) {} // just append else { target.appendChild(nn); } return nn; } if (document.location) DEBUG_LOG("overlays.jsm: injectDOM: gonna stuff: " + srcUrl + " into: " + document.location.href + "\n"); try { let rootNode = null; for (let n = document.documentElement.firstChild; n; n = n.nextSibling) { if (n.nodeType == n.ELEMENT_NODE) { rootNode = n; break; } } if (!rootNode) { ERROR_LOG("overlays.jsm: injectDOM: no root node found\n"); } // Add all overlays for (let i in xul) { let target; if (xul[i].hasAttribute("id")) { target = $(xul[i].id); } else if (xul[i].hasAttribute("overlay_target")) { target = $$(xul[i].getAttribute("overlay_target")); if (target && !target.hasAttribute("id")) { target.id = MY_ADDON_ID + "_overlay_" + i; } } else { target = rootNode; } if (xul[i].tagName === "toolbarpalette") { let toolboxId = xul[i].getAttribute("targetToolbox"); let toolbarId = xul[i].getAttribute("targetToolbar"); let defaultSet = xul[i].getAttribute("targetToolbarDefaultset"); if (!toolboxId) { DEBUG_LOG("overlays.jsm: injectDOM: cannot overlay toolbarpalette: no target toolbox defined\n"); continue; } if (!toolbarId) { DEBUG_LOG("overlays.jsm: injectDOM: cannot overlay toolbarpalette: no target toolbar defined\n"); continue; } if (defaultSet) { let toolbar = $(toolbarId); if (toolbar) { toolbar.setAttribute("defaultset", defaultSet); } } let toolbox = $(toolboxId); let palette = toolbox.palette; let c = xul[i].children; while (c.length > 0) { // added toolbar buttons are removed from the palette's children if (c[0].tagName && c[0].tagName === "toolbarbutton") { addToolbarButton(palette, c[0], toolbarId); } } } else if (!target) { DEBUG_LOG("overlays.jsm: injectDOM: no target for " + xul[i].tagName + ", not inserting\n"); continue; } // insert all children for (let n of xul[i].children) { if (n.nodeType != n.ELEMENT_NODE) { continue; } let nn = addNode(target, n); } } } catch (ex) { ERROR_LOG("overlays.jsm: injectDOM: failed to inject xul " + ex.message + "\n"); } } DEBUG_LOG("overlays.jsm: insertXul(" + srcUrl + ")\n"); let xmlReq = new XMLHttpRequest(); xmlReq.onload = function() { DEBUG_LOG("loaded: " + srcUrl + "\n"); let document = xmlReq.responseXML; // clean the document a bit let emptyNodes = document.evaluate( "//text()[normalize-space(.) = '']", document, null, 7, null); for (let i = 0, e = emptyNodes.snapshotLength; i < e; ++i) { let n = emptyNodes.snapshotItem(i); n.parentNode.removeChild(n); } // prepare all elements to be inserted let xul = []; let foundElement = false; for (let n = document.documentElement.firstChild; n; n = n.nextSibling) { if (n.nodeType != n.ELEMENT_NODE) { continue; } if (n.tagName === "script" || n.tagName === "link") { foundElement = true; continue; } foundElement = true; xul.push(n); } if (!foundElement) { ERROR_LOG("No element to overlay found. Maybe a parsing error?\n"); return; } injectDOM(xul); // load css into window let css = document.getElementsByTagName("link"); for (let i = 0; i < css.length; i++) { let rel = css[i].getAttribute("rel"); if (rel && rel === "stylesheet") { loadCss(css[i].getAttribute("href"), window); } } // load scripts into window let sc = document.getElementsByTagName("script"); for (let i = 0; i < sc.length; i++) { let src = sc[i].getAttribute("src"); if (src) { loadScript(src, window); } } if (callback) { callback(0); } }; xmlReq.onerror = xmlReq.onabort = function() { ERROR_LOG("Failed to load " + srcUrl + "\n"); callback(0); }; xmlReq.overrideMimeType("application/xml"); xmlReq.open("GET", BASE_PATH + srcUrl); // Elevate the request, so DTDs will work. Not a security issue since we // always load from BASE_PATH, and that is our privileged chrome package. // This is no different than regular overlays. let sec = Cc['@mozilla.org/scriptsecuritymanager;1'].getService(Ci.nsIScriptSecurityManager); try { xmlReq.channel.owner = sec.getSystemPrincipal(); } catch (ex) { ERROR_LOG("Failed to set system principal\n"); } xmlReq.send(); } /** * Load one or more overlays into a window. * * @param window: nsIDOMWindow - the target window * @param overlayDefsArr: Array - the list of overlays to load * either: String - the XUL filename * or : Object: * url: String - the XUL filename, * application: String - the target application ID (use ! to exclude an application) * * @return Promise (numOverlays - the number of overlays loaded) */ function loadOverlays(window, overlayDefsArr) { let p = new Promise((resolve, reject) => { function loadOverlay(window, overlayDefs, index) { DEBUG_LOG("overlays.jsm: loadOverlay(" + index + ")\n"); try { if (index < overlayDefs.length) { let overlayDef = overlayDefs[index]; let document = window.document; let url = overlayDef; if (typeof(overlayDef) !== "string") { url = overlayDef.url; if (overlayDef.application.substr(0, 1) === "!") { if (overlayDef.application.indexOf(getAppId()) > 0) { DEBUG_LOG("overlays.jsm: loadOverlay: skipping " + url + "\n"); loadOverlay(window, overlayDefs, index + 1); return; } } else if (overlayDef.application.indexOf(getAppId()) < 0) { DEBUG_LOG("overlays.jsm: loadOverlay: skipping " + url + "\n"); loadOverlay(window, overlayDefs, index + 1); return; } } let observer = function(result) { loadOverlay(window, overlayDefs, index + 1); }; insertXul(url, window, document, observer); } else { DEBUG_LOG("overlays.jsm: loadOverlay: completed\n"); let e = new Event("load-" + MY_ADDON_ID); window.dispatchEvent(e); DEBUG_LOG("overlays.jsm: loadOverlay: event completed\n"); resolve(index); } } catch (ex) { ERROR_LOG("overlays.jsm: could not overlay for " + window.document.location.href + ":\n" + ex.message + "\n"); reject(index); } } loadOverlay(window, overlayDefsArr, 0); }); return p; } function unloadCSS(url, targetWindow) { let domWindowUtils = targetWindow.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils); domWindowUtils.removeSheetUsingURIString(url, 1); } function loadCss(url, targetWindow) { DEBUG_LOG("overlays.jsm: loadCss(" + url + ")\n"); try { let domWindowUtils = targetWindow.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils); domWindowUtils.loadSheetUsingURIString(url, 1); let document = targetWindow.document; let e = document.createElement("overlayed_css"); e.setAttribute("href", url); e.setAttribute("source", MY_ADDON_ID); let node = document.firstChild; while (node && (!node.tagName)) { node = node.nextSibling; } if (node) node.appendChild(e); } catch (ex) { ERROR_LOG("Error while loading CSS " + url + ":\n" + ex.message + "\n"); } } function loadScript(url, targetWindow) { let loader = Cc["@mozilla.org/moz/jssubscript-loader;1"].getService(Ci.mozIJSSubScriptLoader); try { loader.loadSubScript(url, targetWindow); } catch (ex) { ERROR_LOG("Error while loading script " + url + ":\n" + ex.message + "\n"); } } enigmail-2.0.8/package/pEp.jsm000066400000000000000000001063061334302754500161540ustar00rootroot00000000000000/*global Components: false */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ /* eslint no-invalid-this: 0 */ /** * This module serves to integrate pEp into Enigmail * * The module is still a prototype - not ready for daily use! */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailpEp"]; const FT_CALL_FUNCTION = "callFunction"; const FT_CREATE_SESSION = "createSession"; var gPepHome = null; var gPepServerPath = null; var gLogFunction = null; var gShuttingDown = false; var gPepAdapterApiVer = "0.0.0"; const Cu = Components.utils; const Cc = Components.classes; const Ci = Components.interfaces; Cu.importGlobalProperties(["XMLHttpRequest"]); Cu.import("resource://enigmail/subprocess.jsm"); /*global subprocess: false */ Cu.import("resource://gre/modules/PromiseUtils.jsm"); /* global PromiseUtils: false */ Cu.import("resource://enigmail/timer.jsm"); /*global EnigmailTimer: false */ Cu.import("resource://enigmail/files.jsm"); /*global EnigmailFiles: false */ Cu.import("resource://enigmail/core.jsm"); /*global EnigmailCore: false */ Cu.import("resource://enigmail/os.jsm"); /*global EnigmailOS: false */ var gRequestId = 1; var gConnectionInfo = null; var gRetryCount = 0; var gTbListener = null; var gRequestQueue = []; var gXmlReq; var EnigmailpEp = { /** * In case of failures, an error object with the following structure is returned to the * catch() method of the promise: * code : String, one of: PEP-ERROR, PEP-unavailable * exception: JavaScript exception object (may be null) * message : an error message describing the failure */ /* * pEpPerson: * - user_id * - username * - address */ /** * get the pEp version number * * @return: Promise. * then: String - version identifier * catch: Error object (see above) */ getPepVersion: function() { DEBUG_LOG("getPepVersion()"); let onLoad = function(responseObj) { let version = null; if ("result" in responseObj) { version = responseObj.result.return; } return version; }; return this._callPepFunction(FT_CALL_FUNCTION, "serverVersion", [], onLoad); }, getPepHomeDir: function() { if (gPepHome) return gPepHome; let env = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment); let pepHomeDir = env.get("PEPHOME"); if (pepHomeDir === "") { if (EnigmailOS.isDosLike) { pepHomeDir = (env.get("LocalAppData") + "\\pEp"); } else { pepHomeDir = (env.get("HOME") + "/.pEp"); } } DEBUG_LOG("pEpAdapter.jsm: getPepHomeDir() = '" + pepHomeDir + "'"); gPepHome = pepHomeDir; return pepHomeDir; }, /** * Provide the pEp Connection info. If necessary, load the data from file * * @return String - URL to connecto to pEp JSON Server */ getConnectionInfo: function() { DEBUG_LOG("getConnectionInfo()"); if (!gConnectionInfo) { let fileHandle = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile); EnigmailFiles.initPath(fileHandle, this.getPepHomeDir()); fileHandle.append("json-token"); if (!fileHandle.exists()) { /* try legacy place for up to (30) Krombach */ let env = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment); let tmpDir = env.get("TEMP"); let userName = env.get("USER"); fileHandle = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile); EnigmailFiles.initPath(fileHandle, (tmpDir !== "" ? tmpDir : "/tmp")); fileHandle.append("pEp-json-token-" + (userName !== "" ? userName : "XXX")); } let jsonData = EnigmailFiles.readBinaryFile(fileHandle); if (jsonData.length > 0) { try { // we cannot use parseJSON here, it won't work before TB has finished initialization gConnectionInfo = this.parseJSON(jsonData); if (gConnectionInfo.address === "0.0.0.0") { gConnectionInfo.address = "127.0.0.1"; } } catch (ex) {} } } let o = gConnectionInfo; if (!gConnectionInfo) { o = { // provide a default (that should fail) address: "127.0.0.1", port: 0, path: "/none/", pathQueryRef: "/none/", security_token: "" }; } return "http://" + o.address + ":" + o.port + ("path" in o ? o.path : o.pathQueryRef); }, /** * get the path to the GnuPG executable, and the env. variables GNUPGHOME and GPG_AGENT_INFO * * @return: Promise. * then: String - Full path to gpg executable * catch: Error object (see above) */ getGpgEnv: function() { DEBUG_LOG("getGpgEnv()"); let onLoad = function(responseObj) { if ("result" in responseObj) { return responseObj.result.return; } return responseObj; }; return this._callPepFunction(FT_CALL_FUNCTION, "getGpgEnvironment", [], onLoad); }, /** * Register a debugging log function. * The log function must have the form f(logDataStr) * * @param logFunction: function - the function to register */ registerLogHandler: function(logFunction) { gLogFunction = logFunction; DEBUG_LOG("registered log handler"); }, /** * encrypt a message using the pEp server * * @param fromAddr : String - sender Email address * @param toAddrList: Array of String - array with all recipients * @param subject : String - the message subject * @param message : String - the message to encrypt * @param pEpMode : optional Number - the PEP encryption mode: * 0: none - message is not encrypted * 1: inline PGP + PGP extensions * 2: S/MIME (RFC5751) * 3: PGP/MIME (RFC3156) * 4: pEp encryption format * * @return: Promise. * then: returned result (message Object) * catch: Error object (see above) */ encryptMessage: function(fromAddr, toAddrList, subject, messageObj, pEpMode) { DEBUG_LOG("encryptMessage (" + fromAddr + ")"); if (pEpMode === null) pEpMode = 4; if (!toAddrList) toAddrList = []; if (typeof(toAddrList) === "string") toAddrList = [toAddrList]; messageObj.from = { "user_id": "", "username": "anonymous", "address": fromAddr }; messageObj.to = toAddrList.reduce(function _f(p, addr) { p.push({ "user_id": "", "username": "anonymous", "address": addr }); return p; }, []); let msgId = "enigmail-" + String(gRequestId++); messageObj.shortmsg = subject; messageObj.id = msgId; messageObj.dir = 1; try { let params = [ messageObj, // pep messge object [], // extra ["OP"], // dest pEpMode, // encryption_format 0 // encryption flags ]; return this._callPepFunction(FT_CALL_FUNCTION, "encrypt_message", params); } catch (ex) { let deferred = PromiseUtils.defer(); deferred.reject(makeError("PEP-ERROR", ex)); return deferred.promise; } }, /** * encrypt a message using the pEp server * * @param mimeStr : String - complete MIME message * @param pEpMode : optional Number - the PEP encryption mode: * 0: none - message is not encrypted * 1: inline PGP + PGP extensions * 2: S/MIME (RFC5751) * 3: PGP/MIME (RFC3156) * 4: pEp encryption format * @param encryptFlags: optional Number - bitmap for encryption modes * 0x0: default * 0x1: force encryption * 0x2: force unsigned message * 0x4: do not attach own key * * @return: Promise. * then: returned result (message Object) * catch: Error object (see above) */ encryptMimeString: function(mimeStr, pEpMode, encryptFlags = 0) { DEBUG_LOG("encryptMimeString()"); if (pEpMode === null) pEpMode = 4; try { let params = [ mimeStr, // mimetext mimeStr.length, // size [], // extra ["OP"], // resulting data pEpMode, // encryption_format encryptFlags // encryption flags ]; return this._callPepFunction(FT_CALL_FUNCTION, "MIME_encrypt_message", params); } catch (ex) { let deferred = PromiseUtils.defer(); deferred.reject(makeError("PEP-ERROR", ex)); return deferred.promise; } }, /** * decrypt a message using the pEp server * * @param message : String - the message to decrypt * @param sender : pEpPerson - sender information * @param to : Array of pEpPerson - recipients (To) information * @param sender : Array of pEpPerson - recipients (Cc) information * @param replyTo : Array of pEpPerson - Reply-to information * * @return: Promise. * then: returned result * catch: Error object (see above) */ decryptMessage: function(message, sender, to, cc, replyTo) { DEBUG_LOG("decryptMessage()"); if (!sender) sender = "*"; let msgId = "enigmail-" + String(gRequestId++); if (typeof(message) === "object") { message.shortmsg = "pEp"; message.longmsg = "RFC 3156 message"; message.msgId = msgId; message.dir = 0; } else { message = { // src message "shortmsg": "pEp", "longmsg": message, msgId: msgId, dir: 0 }; } message.from = sender; message.to = to; if (cc) { message.cc = cc; } if (replyTo) { message.reply_to = replyTo; } try { let params = [ message, // pEp Message Obj ["OP"], // msg Output ["OP"], // StringList Output ["OP"], // pep rating Output ["OP"] // flags ]; return this._callPepFunction(FT_CALL_FUNCTION, "decrypt_message", params); } catch (ex) { let deferred = PromiseUtils.defer(); deferred.reject(makeError("PEP-ERROR", ex)); return deferred.promise; } }, /** * decrypt a complete mime string using the pEp server * * @param mimeStr : String - complete MIME message * * @return: Promise. * then: returned result (message Object) * catch: Error object (see above) */ decryptMimeString: function(mimeStr) { DEBUG_LOG("decryptMimeString()"); try { let params = [ mimeStr, // mimetext mimeStr.length, // size ["OP"], // extra ["OP"], // resulting data ["OP"], // rating ["OP"] // decryption flags ]; return this._callPepFunction(FT_CALL_FUNCTION, "MIME_decrypt_message", params); } catch (ex) { let deferred = PromiseUtils.defer(); deferred.reject(makeError("PEP-ERROR", ex)); return deferred.promise; } }, /** * determine the rating (=trust level) of a pEp Identity * * @param userId : Object - pEp Identity to check * * @return: Promise. * then: returned result * catch: Error object (see above) */ getIdentityRating: function(userId) { DEBUG_LOG("getIdentityRating()"); try { let params = [{ "address": userId.address }, [""] // rating ]; return this._callPepFunction(FT_CALL_FUNCTION, "identity_rating", params); } catch (ex) { let deferred = PromiseUtils.defer(); deferred.reject(makeError("PEP-ERROR", ex)); return deferred.promise; } }, /** * tell pEp our own user identity * * @param idObject - Object: * - address: email Address * - user_id: user ID (usually TOFU_email@address) * - username: name of person (Firstname Lastname), * * @return: Promise. * then: returned result * catch: Error object (see above) */ setMyself: function(idObject) { DEBUG_LOG("setMyself()"); try { idObject.user_id = "pEp_own_userId"; let params = [idObject]; return this._callPepFunction(FT_CALL_FUNCTION, "myself", params); } catch (ex) { let deferred = PromiseUtils.defer(); deferred.reject(makeError("PEP-ERROR", ex)); return deferred.promise; } }, /** * Update an identity * * @param idObject - Object: * - address: email Address * - user_id: user ID (usually TOFU_email@address) * - username: name of person (Firstname Lastname) */ updateIdentity: function(idObject) { DEBUG_LOG("updateIdentity()"); try { let params = [idObject]; return this._callPepFunction(FT_CALL_FUNCTION, "update_identity", params); } catch (ex) { let deferred = PromiseUtils.defer(); deferred.reject(makeError("PEP-ERROR", ex)); return deferred.promise; } }, /** * get all own identities from pEp * * @return: Promise. * then: returned result * catch: Error object (see above) */ getOwnIdentities: function() { DEBUG_LOG("getOwnIdentities()"); try { let params = [ ["OP"] ]; return this._callPepFunction(FT_CALL_FUNCTION, "own_identities_retrieve", params); } catch (ex) { let deferred = PromiseUtils.defer(); deferred.reject(makeError("PEP-ERROR", ex)); return deferred.promise; } }, /** * check the trustwords for a pair of keys * * @param id1: Object - the 1st pEp ID to check * @param id2: Object - the 2nd pEp ID to check * @param language: String - language (2-letter ISOCODE) * @param longList: Boolean - if true, return complete list of trustWords, otherwise * return short list (default = false) * * @return: Promise. * then: returned result * catch: Error object (see above) */ getTrustWords: function(id1, id2, language, longList = false) { DEBUG_LOG("getTrustWords()"); try { let params = [ id1, id2, language.toUpperCase(), ["OP"], // words ["OP"], // words_size longList ]; return this._callPepFunction(FT_CALL_FUNCTION, "get_trustwords", params); } catch (ex) { let deferred = PromiseUtils.defer(); deferred.reject(makeError("PEP-ERROR", ex)); return deferred.promise; } }, /** * set the trust level of a user identity in pEp to "trusted" * * @param idObject: Object - pEp Identity object * * @return: Promise. * then: returned result * catch: Error object (see above) */ trustIdentity: function(idObject) { DEBUG_LOG("trustIdentity()"); try { if ("comm_type" in idObject) { delete idObject.comm_type; } let params = [idObject]; return this._callPepFunction(FT_CALL_FUNCTION, "trust_personal_key", params); } catch (ex) { let deferred = PromiseUtils.defer(); deferred.reject(makeError("PEP-ERROR", ex)); return deferred.promise; } }, /** * reset the trust level of a user identity in pEp * * @param idObject: Object - pEp Identity object * * @return: Promise. * then: returned result * catch: Error object (see above) */ resetIdentityTrust: function(idObject) { DEBUG_LOG("resetIdentityTrust()"); try { if ("comm_type" in idObject) { delete idObject.comm_type; } let params = [idObject]; return this._callPepFunction(FT_CALL_FUNCTION, "key_reset_trust", params); } catch (ex) { let deferred = PromiseUtils.defer(); deferred.reject(makeError("PEP-ERROR", ex)); return deferred.promise; } }, /** * reset the trust level of a user identity in pEp * * @param idObject: Object - pEp Identity object * * @return: Promise. * then: returned result * catch: Error object (see above) */ mistrustIdentity: function(idObject) { DEBUG_LOG("mistrustIdentity()"); try { let params = [idObject]; return this._callPepFunction(FT_CALL_FUNCTION, "key_mistrusted", params); } catch (ex) { let deferred = PromiseUtils.defer(); deferred.reject(makeError("PEP-ERROR", ex)); return deferred.promise; } }, /** * reset the trust level of a user identity in pEp * * @param partnerId: Object - pEp Identity object of partner * @param resultValue: Number - Handshake result value (from pEp sync.h): * SYNC_HANDSHAKE_CANCEL = -1 * SYNC_HANDSHAKE_ACCEPTED = 0 * SYNC_HANDSHAKE_REJECTED = 1 * * @return: Promise. * then: returned result * catch: Error object (see above) */ deliverHandshakeResult: function(partnerId, resultValue) { DEBUG_LOG("deliverHandshakeResult()"); try { let params = [partnerId, resultValue]; return this._callPepFunction(FT_CALL_FUNCTION, "deliverHandshakeResult", params); } catch (ex) { let deferred = PromiseUtils.defer(); deferred.reject(makeError("PEP-ERROR", ex)); return deferred.promise; } }, /** * get list of languaes for which pEp trustwords are available * * @return: Promise. * then: returned result * catch: Error object (see above) */ getLanguageList: function() { DEBUG_LOG("getLanguageList()"); try { let params = [ ["OP"] // list of languages ]; return this._callPepFunction(FT_CALL_FUNCTION, "get_languagelist", params); } catch (ex) { let deferred = PromiseUtils.defer(); deferred.reject(makeError("PEP-ERROR", ex)); return deferred.promise; } }, /** * Process the output from pEp for the language list and return an array of languages * * @param languageStr - String: string of pEp output * * @return Array of Object: * - short: 2-Letter ISO-Codes * - long: Language name in the language * - desc: Describing sentence in the language */ processLanguageList: function(languageStr) { if ((typeof(languageStr) === "object") && ("result" in languageStr)) { let inArr = languageStr.result.outParams[0].split(/\n/); let outArr = inArr.reduce(function _f(p, langLine) { let y = langLine.split(/","/); if (langLine.length > 0) p.push({ short: y[0].replace(/^"/, ""), long: y[1], desc: y[2].replace(/"$/, "") }); return p; }, []); return outArr; } return []; }, /** * determine the trust rating that an outgoing message would receive * * @param from: Object (pEpPerson) - sender * @param to: Array of Object (pEpPerson) - array with all recipients * @param message: String - the message to encrypt * * @return: Promise. * then: returned result * catch: Error object (see above) */ outgoingMessageRating: function(from, to, message) { DEBUG_LOG("outgoingMessageRating()"); if (!to) to = []; try { let msgId = "enigmail-" + String(gRequestId++); let params = [{ // src message "id": msgId, "dir": 1, "longmsg": message, "from": from, "to": to }, "O" ]; return this._callPepFunction(FT_CALL_FUNCTION, "outgoing_message_rating", params); } catch (ex) { let deferred = PromiseUtils.defer(); deferred.reject(makeError("PEP-ERROR", ex)); return deferred.promise; } }, /** * Get list of all blaclisted keys (fpr) */ blacklistGetKeyList: function() { DEBUG_LOG("blacklistGetKeyList()"); try { let params = [ "O" ]; return this._callPepFunction(FT_CALL_FUNCTION, "blacklist_retrieve", params); } catch (ex) { let deferred = PromiseUtils.defer(); deferred.reject(makeError("PEP-ERROR", ex)); return deferred.promise; } }, blacklistAddKey: function(fpr) { DEBUG_LOG("blacklistAddKey()"); try { let params = [ fpr ]; return this._callPepFunction(FT_CALL_FUNCTION, "blacklist_add", params); } catch (ex) { let deferred = PromiseUtils.defer(); deferred.reject(makeError("PEP-ERROR", ex)); return deferred.promise; } }, blacklistDeleteKey: function(fpr) { DEBUG_LOG("blacklistDeleteKey()"); try { let params = [ fpr ]; return this._callPepFunction(FT_CALL_FUNCTION, "blacklist_delete", params); } catch (ex) { let deferred = PromiseUtils.defer(); deferred.reject(makeError("PEP-ERROR", ex)); return deferred.promise; } }, startKeyserverLookup: function() { DEBUG_LOG("startKeyserverLookup()"); try { return this._callPepFunction(FT_CALL_FUNCTION, "startKeyserverLookup", []); } catch (ex) { let deferred = PromiseUtils.defer(); deferred.reject(makeError("PEP-ERROR", ex)); return deferred.promise; } }, stopKeyserverLookup: function() { DEBUG_LOG("stopKeyserverLookup()"); try { return this._callPepFunction(FT_CALL_FUNCTION, "stopKeyserverLookup", []); } catch (ex) { let deferred = PromiseUtils.defer(); deferred.reject(makeError("PEP-ERROR", ex)); return deferred.promise; } }, startKeySync: function() { DEBUG_LOG("startKeySync()"); try { return this._callPepFunction(FT_CALL_FUNCTION, "startKeySync", []); } catch (ex) { let deferred = PromiseUtils.defer(); deferred.reject(makeError("PEP-ERROR", ex)); return deferred.promise; } }, stopKeySync: function() { DEBUG_LOG("stopKeySync()"); try { return this._callPepFunction(FT_CALL_FUNCTION, "stopKeySync", []); } catch (ex) { let deferred = PromiseUtils.defer(); deferred.reject(makeError("PEP-ERROR", ex)); return deferred.promise; } }, /** * Enable or disable the passive mode for pEp. * Passive mode means that no key is attached to a message * * @param isPassive: Boolean - true: enable passive mode / false: disable passive mode */ setPassiveMode: function(isPassive) { DEBUG_LOG("setPassiveMode()"); try { let params = [ isPassive ]; return this._callPepFunction(FT_CALL_FUNCTION, "config_passive_mode", params); } catch (ex) { let deferred = PromiseUtils.defer(); deferred.reject(makeError("PEP-ERROR", ex)); return deferred.promise; } }, /** * Stop the pEp adapter. * * @return: Promise. */ shutdown: function() { DEBUG_LOG("shutdown()"); let deferred = PromiseUtils.defer(); gShuttingDown = true; let onLoad = function() { dropXmlRequest(); gConnectionInfo = null; gShuttingDown = false; return 0; }; return this._callPepFunction(FT_CALL_FUNCTION, "shutdown", [], onLoad, onLoad). then(x => { onLoad(); }). catch(x => { onLoad(); }); }, registerTbListener: function(port, securityToken) { gTbListener = { port: port, securityToken: securityToken }; return this.registerListener(); }, registerListener: function() { DEBUG_LOG("registerListener()"); try { if (gTbListener) { let params = [ "127.0.0.1", gTbListener.port, gTbListener.securityToken ]; return this._callPepFunction(FT_CALL_FUNCTION, "registerEventListener", params); } else { let deferred = PromiseUtils.defer(); deferred.resolve(0); return deferred.promise; } } catch (ex) { let deferred = PromiseUtils.defer(); deferred.reject(makeError("PEP-ERROR", ex)); return deferred.promise; } }, unregisterListener: function(port, securityToken) { DEBUG_LOG("unregisterListener()"); gShuttingDown = true; try { if (gTbListener) { let params = [ "127.0.0.1", gTbListener.port, gTbListener.securityToken ]; return this._callPepFunction(FT_CALL_FUNCTION, "unregisterEventListener", params); } else { let deferred = PromiseUtils.defer(); deferred.resolve(0); return deferred.promise; } } catch (ex) { let deferred = PromiseUtils.defer(); deferred.reject(makeError("PEP-ERROR", ex)); return deferred.promise; } }, /** * parse a JSON string. Ensure that character codes < 32 are correctly escaped first * * @param str - String: string in JSON notation * * @return whatever JSON.parse returns */ parseJSON: function(str) { for (let i = 0; i < str.length; i++) { if (str.charCodeAt(i) < 32) { let c = str.charCodeAt(i); if (!(c == 13 || c == 10)) { str = str.substr(0, i) + "\\u" + c.toLocaleString("en-US", { useGrouping: false, minimumIntegerDigits: 4 }) + str.substr(i + 1); } } } try { return JSON.parse(str); } catch (x) { return null; } }, setServerPath: function(pathName) { DEBUG_LOG("setServerPath() = " + pathName); gPepServerPath = pathName; }, setAdapterApiVersion: function(v) { DEBUG_LOG("setAdapterApiVersion(" + v + ")"); gPepAdapterApiVer = v; }, /** * Check if the pEp adapter fulfills at least a given API version. * * @param requiredVersion: String - min. version, e.g. 1.2.3 * * @return Boolean (true = yes) */ checkAdapterApiLevel: function(requiredVersion) { let vc = Cc["@mozilla.org/xpcom/version-comparator;1"].getService(Ci.nsIVersionComparator); return vc.compare(gPepAdapterApiVer, requiredVersion) >= 0; }, /******************* internal (private) methods *********************/ /** * Asynchronously call a pEp function * * @param funcType - String: one of FT_CALL_FUNCTION and FT_CREATE_SESSION * @param functionName - String: the pEp function name * @param paramsArr - Array : parameter array for pEp function * @param onLoadListener - function: if the call is successful, callback function of the form: * funcName(responseObj) * @param onErrorListene - function: if the call fails, callback function of the form: * funcName(responseText) * @param deferred - object: optional PromiseUtils.defer() object * * @return Object - a Promise */ _callPepFunction: function(funcType, functionName, paramsArr, onLoadListener, onErrorListener, deferred) { DEBUG_LOG("_callPepFunction(" + funcType + ", " + functionName + ")"); if (!deferred) deferred = PromiseUtils.defer(); let self = this; let conn = this.getConnectionInfo(); let functionCall = { "security_token": (gConnectionInfo ? gConnectionInfo.security_token : ""), "method": functionName, "params": paramsArr, "id": gRequestId++, "jsonrpc": "2.0" }; let loadListener = onLoadListener; if (!onLoadListener) { loadListener = function(obj) { return obj; }; } let errorListener = onErrorListener; if (!onErrorListener) { errorListener = function(txt) { return txt; }; } let onloadFunc = function _f() { try { DEBUG_LOG("XMLHttpRequest: onload()"); let parsedObj = self.parseJSON(this.responseText); if ((typeof(parsedObj) === "object") && ("error" in parsedObj)) { if (parsedObj.error.code === -32600) { // wrong security token gConnectionInfo = null; self.getConnectionInfo(); ++gRetryCount; if (gRetryCount < 2) { self.registerListener() .then(function _f() { self._callPepFunction(funcType, functionName, paramsArr, loadListener, errorListener, deferred); }); return; } } } else { gRetryCount = 0; } let r = loadListener(parsedObj); if (typeof(r) === "object" && "result" in r && "return" in r.result && "status" in r.result.return) { if (r.result.return.status !== 0) { DEBUG_LOG("_callPepFunction: '" + functionName + "' returned with error: " + JSON.stringify(r)); } } deferred.resolve(r); } catch (ex) { deferred.reject(makeError("PEP-ERROR", ex, this.responseText)); } }; let onerrorFunc = function(e) { DEBUG_LOG("XMLHttpRequest: got error: " + e); dropXmlRequest(); if (!gShuttingDown) { self._startPepServer(funcType, deferred, functionCall, onLoadListener, function _f() { let r = errorListener(this.responseText); deferred.resolve(r); }); } else { deferred.resolve({ result: -1 }); } }; let url = conn + funcType; let data = JSON.stringify(functionCall); executeXmlRequest(url, data, onloadFunc, onerrorFunc); return deferred.promise; }, /** * internal function to start pEp server if not available */ _startPepServer: function(funcType, deferred, functionCall, onLoadListener) { DEBUG_LOG("_startPepServer:(" + funcType + ")"); let self = this; if (!gPepServerPath) { DEBUG_LOG("_startPepServer: cannot find executable"); deferred.reject(makeError("PEP-unavailable", null, "Cannot find JSON-PEP executable")); } let exec = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile); try { exec.initWithPath(gPepServerPath); if ((!exec.exists()) || (!exec.isExecutable())) { DEBUG_LOG("_startPepServer: executable not available"); deferred.reject(makeError("PEP-unavailable", null, "Cannot find JSON-PEP executable")); return; } EnigmailCore.getService(null, true); let resourcesDir = exec.parent.parent; resourcesDir.append("share"); resourcesDir.append("pEp"); let resDirPath = undefined; if (resourcesDir && resourcesDir.exists()) { resDirPath = resourcesDir.path; } let env = []; let envAppData = null, envUserProfile = null; let envHome = null, envGnuPgHome = null; EnigmailCore.getEnvList().map(function(item) { if (item.startsWith("APPDATA=")) envAppData = item.substr(8); else if (item.startsWith("USERPROFILE=")) envUserProfile = item.substr(12); else if (item.startsWith("HOME=")) envHome = item.substr(5); else if (item.startsWith("GNUPGHOME=")) envGnuPgHome = item.substr(10); env.push(item); }); if (EnigmailOS.isDosLike) { if (envHome === null) { envHome = (envUserProfile === null ? "\\" : envUserProfile); env.push("HOME=" + envHome); } if (envGnuPgHome === null) { envGnuPgHome = (envAppData === null ? "" : envAppData) + "\\gnupg"; env.push("GNUPGHOME=" + envGnuPgHome); } } let foundGnuPG = true; let stderrData = ""; let process = subprocess.call({ workdir: resDirPath, command: exec, charset: null, environment: env, mergeStderr: false, stdin: function(stdin) { // do nothing }, stdout: function(data) { DEBUG_LOG("stdout from pep-json-server: " + data); }, stderr: function(data) { if (stderrData.length < 2048) { stderrData += data; if (stderrData.length > 0) { if (stderrData.search(/PEP_INIT_(CANNOT_DETERMINE_GPG_VERSION|UNSUPPORTED_GPG_VERSION|GPGME_INIT_FAILED|CANNOT_LOAD_GPGME)/) >= 0) { foundGnuPG = false; deferred.reject(makeError("GNUPG-UNAVAILABLE", null, "gpg not found")); } } } } }); if (!self.checkAdapterApiLevel("0.14.0")) { if (!EnigmailOS.isDosLike) process.wait(); } else { process.wait(); } DEBUG_LOG("_startPepServer: JSON startup done"); if (!foundGnuPG) { return; } DEBUG_LOG("_startPepServer: JSON server started"); gConnectionInfo = null; // wait trying to access the pEp server for 1 second such that it can open the connection // and write the connection info file EnigmailTimer.setTimeout(function _f() { self.getConnectionInfo(); functionCall.security_token = (gConnectionInfo ? gConnectionInfo.security_token : ""); let url = self.getConnectionInfo() + funcType; let onloadFunc = function _onload() { DEBUG_LOG("XMLHttpRequest: onload()"); try { let parsedObj = self.parseJSON(this.responseText); let r = onLoadListener(parsedObj); deferred.resolve(r); } catch (ex) { deferred.reject(makeError("PEP-ERROR", ex, this.responseText)); } }; let onerrorFunc = function(e) { DEBUG_LOG("XMLHttpRequest: got error: " + e); dropXmlRequest(); deferred.reject(makeError("PEP-unavailable", null, "Cannot establish connection to PEP service")); }; let data = JSON.stringify(functionCall); executeXmlRequest(url, data, onloadFunc, onerrorFunc); }, 1000); } catch (ex) { deferred.reject(makeError("PEP-unavailable", ex, "Cannot start PEP service")); } } }; function DEBUG_LOG(logStr) { if (gLogFunction) gLogFunction("pEp.jsm: " + logStr + "\n"); } function makeError(str, ex, msg) { let o = { code: str, exception: ex, message: (msg ? msg : (ex ? ex.toString() : "")) }; return o; } function dropXmlRequest() { if (gXmlReq) { gXmlReq.abort(); } gXmlReq = null; } /** * Establish connection to pEp JSON server and send request. * The connection is kept open to allow for per-connection settings in pEp; * All requests are queued and processed one after the other. * * @param url: String - the URL to call, using POST * @param data: String - JSON object to send * @param onloadFunc Function - onload function of XMLHttpRequest * @param onerrorFunc Function - onerror function of XMLHttpRequest */ function executeXmlRequest(url, data, onloadFunc, onerrorFunc) { DEBUG_LOG("executeXmlRequest(" + url + ")"); let req = { url: url, data: data, onloadFunc: onloadFunc, onerrorFunc: onerrorFunc, reqId: gRequestId }; gRequestQueue.push(req); if (!gXmlReq) { gXmlReq = new XMLHttpRequest(); gXmlReq.onloadend = function() { DEBUG_LOG("executeXmlRequest: onloadEnd"); processNextXmlRequest(); }; } processNextXmlRequest(); } /** * Process next request from request queue */ function processNextXmlRequest() { DEBUG_LOG("processNextXmlRequest(): length = " + gRequestQueue.length); if (gXmlReq && gRequestQueue.length > 0) { DEBUG_LOG("processNextXmlRequest: readyState == " + gXmlReq.readyState); if (gXmlReq.readyState === 0 || gXmlReq.readyState === 4) { let r = gRequestQueue.shift(); gXmlReq.onload = r.onloadFunc.bind(gXmlReq); gXmlReq.onerror = r.onerrorFunc.bind(gXmlReq); gXmlReq.open("POST", r.url); gXmlReq.send(r.data); } } } enigmail-2.0.8/package/pEpAdapter.jsm000066400000000000000000001100341334302754500174460ustar00rootroot00000000000000/*global Components: false */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; /** * Module for interfacing to pEp (Enigmail-specific functions) */ const Cu = Components.utils; const Cc = Components.classes; const Ci = Components.interfaces; Cu.import("resource://enigmail/core.jsm"); /*global EnigmailCore: false */ Cu.import("resource://enigmail/pEp.jsm"); /*global EnigmailpEp: false */ Cu.import("resource://enigmail/pEpListener.jsm"); /*global EnigmailpEpListener: false */ Cu.import("resource://enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ Cu.import("resource://enigmail/os.jsm"); /*global EnigmailOS: false */ Cu.import("resource://enigmail/mime.jsm"); /*global EnigmailMime: false */ Cu.import("resource://gre/modules/PromiseUtils.jsm"); /* global PromiseUtils: false */ Cu.import("resource://enigmail/rng.jsm"); /*global EnigmailRNG: false */ Cu.import("resource://enigmail/lazy.jsm"); /*global EnigmailLazy: false */ Cu.import("resource://enigmail/streams.jsm"); /*global EnigmailStreams: false */ Cu.import("resource://enigmail/addrbook.jsm"); /*global EnigmailAddrbook: false */ Cu.import("resource://enigmail/locale.jsm"); /*global EnigmailLocale: false */ Cu.import("resource://enigmail/funcs.jsm"); /*global EnigmailFuncs: false */ Cu.import("resource://enigmail/pEpFilter.jsm"); /*global EnigmailPEPFilter: false */ Cu.import("resource://enigmail/subprocess.jsm"); /*global subprocess: false */ Cu.import("resource://enigmail/installPep.jsm"); /*global EnigmailInstallPep: false */ Cu.import("resource:///modules/jsmime.jsm"); /*global jsmime: false*/ Cu.import("resource://enigmail/pEpKeySync.jsm"); /*global EnigmailPEPKeySync: false */ Cu.import("resource://enigmail/timer.jsm"); /*global EnigmailTimer: false */ Cu.import("resource://enigmail/filters.jsm"); /*global EnigmailFilters: false */ Cu.import("resource://enigmail/files.jsm"); /*global EnigmailFiles: false */ Cu.import("resource://enigmail/app.jsm"); /*global EnigmailApp: false */ const getDialog = EnigmailLazy.loader("enigmail/dialog.jsm", "EnigmailDialog"); const getInstallGnuPG = EnigmailLazy.loader("enigmail/installGnuPG.jsm", "InstallGnuPG"); const getGpgAgent = EnigmailLazy.loader("enigmail/gpgAgent.jsm", "EnigmailGpgAgent"); // pEp JSON Server executable name const PEP_SERVER_EXECUTABLE = "pep-json-server"; var gPepVersion = null; var gSecurityToken = null; var gPepAvailable = null; var gPepListenerPort = -1; var gOwnIdentities = []; var gJmObservers = null; var gJmObserverId = 0; var gAttemptedInstall = false; var EXPORTED_SYMBOLS = ["EnigmailPEPAdapter"]; function pepCallback(dataObj) { EnigmailLog.DEBUG("pEpAdapter.jsm: pepCallback()\n"); if ("method" in dataObj) { switch (dataObj.method) { case "messageToSend": EnigmailLog.DEBUG("pEpAdapter.jsm: pepCallback: messageToSend\n"); EnigmailPEPKeySync.sendMessage(dataObj.params[0]); return 0; case "notifyHandshake": EnigmailLog.DEBUG("pEpAdapter.jsm: pepCallback: notifyHandshake\n"); EnigmailPEPKeySync.notifyHandshake(dataObj.params); return 0; } } return 1; } function startListener() { EnigmailLog.DEBUG("pEpAdapter.jsm: startListener():\n"); gSecurityToken = EnigmailRNG.generateRandomString(40); gPepListenerPort = EnigmailpEpListener.createListener(pepCallback, gSecurityToken); if (gPepListenerPort < 0) { EnigmailLog.DEBUG("pEpAdapter.jsm: startListener: could not open socket\n"); return; } EnigmailpEp.registerTbListener(gPepListenerPort, gSecurityToken).then(function _ok(data) { EnigmailLog.DEBUG("pEpAdapter.jsm: startListener: registration with pEp OK\n"); }).catch(function _fail(data) { EnigmailLog.DEBUG("pEpAdapter.jsm: startListener: registration with pEp failed\n"); }); } var EnigmailPEPAdapter = { pep: EnigmailpEp, filter: EnigmailPEPFilter, /** * Get the pEp JSON server version numbers. * * @return Object: * - null if the module is not initialized * - Object with String members: * api: the JSON API version number, or "" if pEp is unavailable * package: the package version number, or null if no package * engine: the pEp engine version number, or "" if pEp is unavailable */ getPepVersion: function() { return gPepVersion; }, /** * Get the pEp package version number. * * @return String: * - null if no package or the module is not initialized * - a non-empty string if the pEp package version is configured */ getPepPackageVersion: function() { let version = this.getPepVersion(); if (version && "package" in version) return version.package; return null; }, /** * Determine if pEp is available * * @return: Boolean: true - pEp is available / false - pEp is not usable */ usingPep: function() { if (!this.getPepJuniorMode()) return false; if ((gPepVersion !== null) && gPepVersion.api.length > 0) { return true; } return false; }, /** * Determine the location of the pep-json-server * * @return Object: nsIFile if found, null otherwise */ getPepMiniDesktopAdapterBinaryFile: function() { EnigmailLog.DEBUG("pEpAdapter: getPepMiniDesktopAdapterBinaryFile()\n"); let execFile = EnigmailFiles.resolvePathWithEnv(PEP_SERVER_EXECUTABLE); if (!execFile || !execFile.exists() || !execFile.isExecutable()) { let pepmda = EnigmailApp.getProfileDirectory(); pepmda.append("pepmda"); pepmda.append("bin"); execFile = EnigmailFiles.resolvePath( EnigmailFiles.potentialWindowsExecutable(PEP_SERVER_EXECUTABLE), pepmda.path, EnigmailOS.isDosLike); if (!execFile || !execFile.exists() || !execFile.isExecutable()) { execFile = null; } } return execFile; }, /** * Determine if the pEp JSON adapter is available at all * * @param attemptInstall: Boolean - try to install pEp if possible * * @return Boolean - true if pEp is available / false otherwise */ isPepAvailable: function(attemptInstall = true) { if (gPepAvailable === null) { EnigmailLog.DEBUG("pEpAdapter: isPepAvailable()\n"); gPepAvailable = false; let execFile = this.getPepMiniDesktopAdapterBinaryFile(); if (execFile && execFile.exists() && execFile.isExecutable()) { EnigmailCore.getService(null, true); let pepVersionStr = ""; let resourcesDir = execFile.parent.parent; resourcesDir.append("share"); resourcesDir.append("pEp"); let resDirPath = undefined; if (resourcesDir && resourcesDir.exists()) { resDirPath = resourcesDir.path; } let process = subprocess.call({ workdir: resDirPath, command: execFile, arguments: ["--version"], charset: null, environment: EnigmailCore.getEnvList(), mergeStderr: false, stdin: function(stdin) { // do nothing }, stdout: function(data) { pepVersionStr += data; }, stderr: function(data) { // do nothing } }); process.wait(); EnigmailLog.DEBUG("pEpAdapter.jsm: isPepAvailable: got version '" + pepVersionStr + "'\n"); if (pepVersionStr.search(/pEp JSON/i) >= 0) { let m = pepVersionStr.match(/^\s+version\s+(\d+\.\d+\.\d+)/im); gPepAvailable = true; if (m && m.length > 1) { EnigmailpEp.setAdapterApiVersion(m[1]); } } else { EnigmailpEp.setAdapterApiVersion("0.10.0"); } } else if (attemptInstall) { this.installPep(); } } EnigmailLog.DEBUG("pEpAdapter.jsm: isPepAvailable() = " + gPepAvailable + "\n"); return gPepAvailable; }, /** * try to download and install pEp (runs asynchronously!) * * @param isManual: Boolean: is installation manually requested */ installPep: function(isManual = false) { EnigmailLog.DEBUG("pEpAdapter.jsm: installPep()\n"); gAttemptedInstall = true; let self = this; let progressListener = { onError: function(err) { EnigmailLog.DEBUG("pEpAdapter.jsm: installPep: got error " + err.type + "\n"); gPepAvailable = false; }, onInstalled: function() { EnigmailLog.DEBUG("pEpAdapter.jsm: installPep: installation completed\n"); gPepAvailable = null; self.initialize(); }, stopPep: function() { EnigmailpEp.shutdown(); } }; EnigmailInstallPep.startInstaller(progressListener, isManual); }, /** * check if an update to the pEp engine is available online. * If yes, ask user if it should be installed. */ checkForPepUpdate: function() { let updateMode = EnigmailPrefs.getPref("pEpAutoUpdate"); // don't try if update disabled if (updateMode === 2) return; // check once a week let now = Math.floor(Date.now() / 1000); if (now < EnigmailPrefs.getPref("pEpLastUpdate") + 604800) return; let currVer = this.getPepPackageVersion(); if (!currVer) return; if (!this.usingPep()) return; currVer = currVer.replace(/ .*/, ""); EnigmailPrefs.setPref("pEpLastUpdate", now); if (!EnigmailInstallPep.isPepUpdateAvailable(false, currVer)) return; let update = getDialog().confirmPref(null, EnigmailLocale.getString("pep.updateAvailable"), "pEpAutoUpdate", EnigmailLocale.getString("dlg.button.install"), EnigmailLocale.getString("dlg.button.ignore")); if (update > 0) { this.installPep(true); } }, /** * Determine if pEp should be used or Enigmail * * @return: Boolean: true - use pEp / false - use Enigmail */ getPepJuniorMode: function() { let mode = EnigmailPrefs.getPref("juniorMode"); if (mode === 0) return false; // manual pEp or automatic mode if (mode === 2 || (!this.isAccountCryptEnabled())) { return this.isPepAvailable(true); } return false; }, /** * Determine if any account is enabled for crypto (S/MIME or Enigmail) * * @return: Boolean: true if at least one account is enabled for S/MIME or Enigmail, * false otherwise */ isAccountCryptEnabled: function() { // automatic mode: go through all identities let amService = Components.classes["@mozilla.org/messenger/account-manager;1"].getService(Ci.nsIMsgAccountManager); amService.LoadAccounts(); let ids = amService.allIdentities; for (let i = 0; i < ids.length; i++) { let msgId = ids.queryElementAt(i, Ci.nsIMsgIdentity); if ((msgId.getUnicharAttribute("signing_cert_name") !== "") || (msgId.getUnicharAttribute("encryption_cert_name") !== "") || msgId.getBoolAttribute("enablePgp")) { return true; } } return false; }, /** * Thunderbird shutdown callback (called from enigmail.js) */ onShutdown: function() { EnigmailLog.DEBUG("pEpAdapter.jsm: onShutdown()\n"); if (gPepListenerPort > 0) { let inspector = Cc["@mozilla.org/jsinspector;1"].createInstance(Ci.nsIJSInspector); EnigmailTimer.setTimeout(function _f() { // wait at most 1 second to continue shutdown if (gPepListenerPort > 0) { inspector.exitNestedEventLoop(); } }, 1000); EnigmailpEp.unregisterListener().then(function _ok(data) { EnigmailLog.DEBUG("pEpAdapter.jsm: onShutdown: de-registring from pEp OK\n"); gPepListenerPort = -1; inspector.exitNestedEventLoop(); }).catch(function _fail(data) { EnigmailLog.DEBUG("pEpAdapter.jsm: onShutdown: de-registring from pEp failed\n"); gPepListenerPort = -1; inspector.exitNestedEventLoop(); }); // onShutdown should be synchronus in order for Thunderbird to wait // with shutting down until we're completed inspector.enterNestedEventLoop(0); EnigmailpEp.registerLogHandler(null); } }, /** * Initialize the pEpAdapter (should be called during startup of application) * * @return Promise */ initialize: function() { EnigmailLog.DEBUG("pEpAdapter.jsm: initialize:\n"); let deferred = PromiseUtils.defer(); let self = this; EnigmailpEp.registerLogHandler(EnigmailLog.DEBUG); if (gJmObservers === null) { gJmObservers = {}; EnigmailPrefs.registerPrefObserver("juniorMode", self.handleJuniorModeChange); } let pEpMode = EnigmailPrefs.getPref("juniorMode"); // force using Enigmail (do not use pEp) if (pEpMode === 0) { deferred.resolve(); return deferred.promise; } // automatic mode, with Crypto enabled (do not use pEp) if (this.isAccountCryptEnabled() && pEpMode !== 2) { deferred.resolve(); return deferred.promise; } let execFile = this.getPepMiniDesktopAdapterBinaryFile(); if (execFile) { EnigmailpEp.setServerPath(execFile.path); } else if (pEpMode === 2) { // if force pEp mode, and pEp not found, try to install it if (!gAttemptedInstall) this.installPep(); deferred.resolve(); return deferred.promise; } try { EnigmailpEp.getPepVersion().then(function _success(data) { EnigmailLog.DEBUG("pEpAdapter.jsm: initialize: success '" + JSON.stringify(data) + "'\n"); if (data === null) { gPepVersion = { api: "0.10.0", package: null, engine: "0.9.0" }; } else if (typeof(data) === "object") { if ("api_version" in data) { gPepVersion = { api: data.api_version, package: data.package_version, engine: data.engine_version }; } else { gPepVersion = { api: data.version, package: data.version, engine: data.version }; } } if (gPepVersion) { startListener(); if (EnigmailPrefs.getPref("autoKeyRetrieve").length > 0) { EnigmailpEp.startKeyserverLookup(); } else { EnigmailpEp.stopKeyserverLookup(); } EnigmailpEp.startKeySync(); self.setupIncomingFilter(); self.handleJuniorModeChange(); } return EnigmailpEp.getGpgEnv(); }). then(function _gotGpgEnv(gpgEnv) { EnigmailLog.DEBUG("pEpAdapter.jsm: initialize: got GnuPG env '" + JSON.stringify(gpgEnv) + "'\n"); let envStr = ""; if (gpgEnv && typeof gpgEnv === "object" && "gnupg_path" in gpgEnv) { EnigmailLog.DEBUG("pEpAdapter.jsm: initialize: got GnuPG path '" + gpgEnv.gnupg_path + "'\n"); if (typeof(gpgEnv.gpg_agent_info) === "string" && gpgEnv.gpg_agent_info.length > 0) { envStr += "GPG_AGENT_INFO=" + gpgEnv.gpg_agent_info + "\n"; } if (typeof(gpgEnv.gnupg_home) === "string" && gpgEnv.gnupg_home.length > 0) { envStr += "GNUPGHOME=" + gpgEnv.gnupg_home + "\n"; } let gpgFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile); gpgFile.initWithPath(gpgEnv.gnupg_path); if (!gpgFile.exists()) { // this should not really happen ... deferred.resolve(); return; } let enigmailSvc = EnigmailCore.createInstance(); enigmailSvc.perferGpgPath(gpgEnv.gnupg_path); enigmailSvc.overwriteEnvVar(envStr); if (enigmailSvc.initialized) { enigmailSvc.reinitialize(); } else { enigmailSvc.initialize(null, false); } } self.setOwnIdentities(0); deferred.resolve(); }). catch(function failed(err) { EnigmailLog.DEBUG("pEpAdapter.jsm: initialize: error during pEp init:\n"); EnigmailLog.DEBUG(" " + err.code + ": " + ("exception" in err && err.exception ? err.exception.toString() : err.message) + "\n"); if (err.code === "GNUPG-UNAVAILABLE") { // GnuPG not found, try to install it installMissingGnuPG(); } gPepVersion = { api: "", package: null, engine: "" }; deferred.resolve(); }); } catch (ex) { deferred.resolve(); } return deferred.promise; }, setOwnIdentities: function(accountNum) { let self = this; let accountManager = Cc["@mozilla.org/messenger/account-manager;1"].getService(Ci.nsIMsgAccountManager); let id; // pEp currently only supports 1 identity per account, we therefore only set the 1st id of each accunt if (accountManager.accounts.length > accountNum) { let ac = accountManager.accounts.queryElementAt(accountNum, Ci.nsIMsgAccount); try { id = ac.identities.queryElementAt(0, Ci.nsIMsgIdentity); } catch (ex) { id = null; } if (!id) { self.setOwnIdentities(accountNum + 1); return; } let pepId = { address: id.email.toLowerCase(), user_id: "", username: id.fullName }; EnigmailLog.DEBUG("pEpAdapter.jsm: setOwnIdentities: " + id.identityName + "\n"); self.pep.setMyself(pepId).then( function _ok(data) { if (data) { let myId = self.processOwnIdentity(data); } let deferred = PromiseUtils.defer(); deferred.resolve(); return deferred; }).then( function _ok() { self.setOwnIdentities(accountNum + 1); }).catch( function _err(data) { EnigmailLog.DEBUG("pEpAdapter.jsm: setOwnIdentities: ERROR: '" + JSON.stringify(data) + "'\n"); }); } else { EnigmailLog.DEBUG("pEpAdapter.jsm: setOwnIdentities: done.\n"); } }, processOwnIdentity: function(identityData) { EnigmailLog.DEBUG("pEpAdapter.jsm: processOwnIdentity()\n"); if ("result" in identityData) { let id = identityData.result.outParams[0]; gOwnIdentities[id.address.toLowerCase()] = id; return id; } return null; }, /** * get the pEp Identity of own emails (i.e. for those what we should have a secret key) * for a given email address. * * @param emailAddress: String - my own email address * * @return Object: pEp Identity or null (if not found) */ getOwnIdentityForEmail: function(emailAddress) { emailAddress = emailAddress.toLowerCase(); if (emailAddress in gOwnIdentities) { return gOwnIdentities[emailAddress]; } return null; }, /** * Get a MIME tree as String from the pEp-internal message object * * @param resObj: Object - result object from encryption * * @return String - a MIME string, or "" if no message extracted */ stripMsgHeadersFromEncryption: function(resObj) { let mimeStr = ""; if (Array.isArray(resObj) && typeof(resObj[0]) === "string") { mimeStr = resObj[0]; } let startPos = mimeStr.search(/\r?\n\r?\n/); if (startPos < 0) return ""; let headers = Cc["@mozilla.org/messenger/mimeheaders;1"].createInstance(Ci.nsIMimeHeaders); headers.initialize(mimeStr.substring(0, startPos)); let n = headers.headerNames; let printHdr = ""; while (n.hasMore()) { let hdr = n.getNext(); if (hdr.search(/^(from|to|mime-version|subject|message-id)$/i) < 0) { printHdr += hdr + ": " + EnigmailMime.formatHeaderData(headers.extractHeader(hdr, true)) + "\r\n"; } else if (hdr.search(/^subject$/i) === 0) { // workaround for encoding bug in jsmime let s = headers.extractHeader(hdr, true); if (s === "pap") { s = "p≡p"; } printHdr += "Subject: " + EnigmailMime.formatHeaderData(s) + "\r\n"; } } return printHdr + "\r\n" + mimeStr.substr(startPos); }, /** * Get the encryption quality rating for a list of recipients * * @param sender: - Object msgIAddressObject message sender * @param recipients: - Array of Object msgIAddressObject message recipients * * @return Number: quality of encryption (-3 ... 9) */ getOutgoingMessageRating: function(sender, recipients) { let resultObj = null; let inspector = Cc["@mozilla.org/jsinspector;1"].createInstance(Ci.nsIJSInspector); let from = this.emailToPepPerson(sender); let to = []; if (recipients.length === 0) { return 0; } for (let i of recipients) { to.push(EnigmailPEPAdapter.emailToPepPerson(i)); } EnigmailPEPAdapter.pep.outgoingMessageRating(from, to, "test").then(function _step2(res) { EnigmailLog.DEBUG("pEpAdapter.jsm: outgoingMessageRating: SUCCESS\n"); if ((typeof(res) === "object") && ("result" in res)) { resultObj = res.result.outParams; } else EnigmailLog.DEBUG("pEpAdapter.jsm: outgoingMessageRating: typeof res=" + typeof(res) + "\n"); if (inspector && inspector.eventLoopNestLevel > 0) { // unblock the waiting lock in finishCryptoEncapsulation inspector.exitNestedEventLoop(); } }).catch(function _error(err) { EnigmailLog.DEBUG("pEpAdapter.jsm: outgoingMessageRating: ERROR\n"); EnigmailLog.DEBUG(err.code + ": " + ("exception" in err ? err.exception.toString() : err.message) + "\n"); if (inspector && inspector.eventLoopNestLevel > 0) { // unblock the waiting lock in finishCryptoEncapsulation inspector.exitNestedEventLoop(); } }); // wait here for PEP to terminate inspector.enterNestedEventLoop(0); if (resultObj && Array.isArray(resultObj) && "rating" in resultObj[0]) { return resultObj[0].rating; } return 3; // unencrypted }, /** * Obtain a list of supported languages for trustwords * * @return Promise, delivering Array of Object: * - short: 2-Letter ISO-Codes * - long: Language name in the language * - desc: Describing sentence in the language */ getSupportedLanguages: function() { let deferred = PromiseUtils.defer(); EnigmailpEp.getLanguageList().then(function _success(res) { let outArr = EnigmailpEp.processLanguageList(res); deferred.resolve(outArr); }).catch(function _err(err) { deferred.resolve([]); }); return deferred.promise; }, getIdentityForEmail: function(emailAddress) { let deferred = PromiseUtils.defer(); EnigmailpEp.updateIdentity({ address: emailAddress }).then(function _ok(data) { if (("result" in data) && typeof data.result === "object" && typeof data.result.outParams[0] === "object") { if ("username" in data.result.outParams[0] && data.result.outParams[0].username) { let u = jsmime.headerparser.parseAddressingHeader(data.result.outParams[0].username, true); if (Array.isArray(u) && u.length > 0) { data.result.outParams[0].username = u[0].name; } } } deferred.resolve(data); }).catch(function _err(data) { deferred.reject(data); }); return deferred.promise; }, /** * Convert an msgIAddressObject object into a pEpPerson object * If no name given, the name is looked up in the address book * * @param emailObj - Object msgIAddressObject * * @return pEpPerson object */ emailToPepPerson: function(emailObj) { let p = { user_id: "", username: "unknown", address: "" }; if (!emailObj) return p; if ("email" in emailObj) { p.address = emailObj.email; } if ("name" in emailObj && emailObj.name.length > 0) { p.username = emailObj.name; } else { let addr = EnigmailAddrbook.lookupEmailAddress(p.address); if (addr) { if (addr.card.displayName.length > 0) { p.username = addr.card.displayName; } else { p.username = (addr.card.firstName + " " + addr.card.lastName).trim(); } } } if (p.username.length === 0 || p.username === "unknown") { p.username = p.address.replace(/@.*$/, ""); } return p; }, /** * Update the last sent date for PGP/MIME messages. We only do this such that * we don't unnecessarily process earlier inline-PGP messages */ processPGPMIME: function(headerData) { EnigmailLog.DEBUG("pEpAdapter.jsm: processPGPMIME\n"); // placeholder for pEp-specific actions on PGP/MIME messages }, /** * Update the last sent date for inline-PGP messages. We do this to make sure * that pEp can potentially derive information from the message (such as extracting an * attached key). */ processInlinePGP: function(msgUri, headerData) { EnigmailLog.DEBUG("pEpAdapter.jsm: processInlinePGP: " + msgUri + "\n"); if (!("from" in headerData) && ("date" in headerData)) return; let stream = EnigmailStreams.newStringStreamListener( function analyzeData(data) { EnigmailLog.DEBUG("pEpAdapter.jsm: processInlinePGP: got " + data.length + " bytes\n"); if (data.indexOf("From -") === 0) { // remove 1st line from Mails stored in msgbox format data = data.replace(/^From .*\r?\n/, ""); } EnigmailpEp.decryptMimeString(data). then(function _ignore() {}). catch(function _ignore() {}); } ); try { var channel = EnigmailStreams.createChannel(msgUri.spec); channel.asyncOpen(stream, null); } catch (e) { EnigmailLog.DEBUG("pEpAdapter.jsm: processInlinePGP: exception " + e.toString() + "\n"); } }, /** * prepare the relevant data for the Trustwords dialog * * @param emailAddress: String - the email address of the peer to verify * @param headerData: either: Object - nsIMsgHdr object for the message * (to identify the ideal own identity) * or: String - email address of own identity * @return Promise(object) */ prepareTrustWordsDlg: function(emailAddress, headerData) { let deferred = PromiseUtils.defer(); let emailId = null; let useOwnId = null; let emailIdRating = null; let useLocale = "en"; let ownIds = []; let supportedLocale = []; let uiLocale = EnigmailLocale.getUILocale().substr(0, 2).toLowerCase(); emailAddress = emailAddress.toLowerCase(); let allEmails = ""; if (typeof(headerData) === "string") { allEmails = headerData; } else { if ("from" in headerData) { allEmails += headerData.from.headerValue + ","; } if ("to" in headerData) { allEmails += headerData.to.headerValue + ","; } if ("cc" in headerData) { allEmails += headerData.cc.headerValue + ","; } } let emailsInMessage = ""; try { emailsInMessage = EnigmailFuncs.stripEmail(allEmails.toLowerCase()).split(/,/); } catch (ex) { deferred.reject("pepTrustWords.generalFailure"); return deferred.promise; } EnigmailPEPAdapter.pep.getOwnIdentities().then(function _gotOwnIds(data) { if (("result" in data) && typeof data.result.outParams[0] === "object" && Array.isArray(data.result.outParams[0])) { ownIds = data.result.outParams[0]; } for (let i = 0; i < ownIds.length; i++) { if (ownIds[i].address.toLowerCase() === emailAddress) { deferred.reject("cannotVerifyOwnId"); } useOwnId = ownIds[0]; for (let j = 0; j < emailsInMessage.length; j++) { if (ownIds[i].address.toLowerCase() === emailsInMessage[j]) { useOwnId = ownIds[i]; break; } } } return EnigmailPEPAdapter.getIdentityForEmail(emailAddress); }).then(function _gotIdentityForEmail(data) { if (("result" in data) && typeof data.result === "object" && typeof data.result.outParams[0] === "object") { emailId = data.result.outParams[0]; } else { deferred.reject("cannotFindKey"); } return EnigmailPEPAdapter.pep.getIdentityRating(emailId); }).then(function _gotIdentityRating(data) { if ("result" in data && Array.isArray(data.result.outParams) && typeof(data.result.outParams[0]) === "object" && "rating" in data.result.outParams[0]) { emailIdRating = data.result.outParams[0]; } return EnigmailPEPAdapter.getSupportedLanguages(); }).then(function _gotLocale(localeList) { supportedLocale = localeList; for (let i = 0; i < localeList.length; i++) { if (localeList[i].short === uiLocale) { useLocale = localeList[i].short; } } return EnigmailPEPAdapter.getTrustWordsForLocale(useOwnId, emailId, useLocale, false); }).then(function _gotTrustWords(data) { if (("result" in data) && typeof data.result === "object" && typeof data.result.outParams[1] === "string") { let trustWords = data.result.outParams[1]; deferred.resolve({ ownId: useOwnId, otherId: emailId, userRating: emailIdRating, locale: useLocale, supportedLocale: supportedLocale, trustWords: trustWords, dialogMode: 0 }); } else { deferred.reject("generalFailure"); } }).catch(function _err(errorMsg) { deferred.reject(errorMsg); }); return deferred.promise; }, /** * Get the trustwords for a pair of pEpPerson's and a given language * * @param ownId: Object - pEpPerson object of own id * @param otherId: Object - pEpPerson object of other person's identity * * @return Promise(data) */ getTrustWordsForLocale: function(ownId, otherId, language, longWords) { return EnigmailPEPAdapter.pep.getTrustWords(ownId, otherId, language, longWords); }, resetTrustForEmail: function(emailAddr) { let deferred = PromiseUtils.defer(); EnigmailPEPAdapter.getIdentityForEmail(emailAddr). then(function _gotIdentityForEmail(data) { if (("result" in data) && typeof data.result === "object" && typeof data.result.outParams[0] === "object") { let emailId = data.result.outParams[0]; EnigmailPEPAdapter.pep.resetIdentityTrust(emailId).then( function _ok() { deferred.resolve(); } ).catch(function _err() { deferred.resolve(); }); } }); return deferred.promise; }, getRatingsForEmails: function(emailArr) { EnigmailLog.DEBUG("pEpAdapter.getRatingsForEmails(" + emailArr.length + ")\n"); let deferred = PromiseUtils.defer(); let identities = []; function getNextIdentity(emailNum) { if (emailNum >= emailArr.length) { EnigmailLog.DEBUG("pEpAdapter.getRatingsForEmails: done\n"); deferred.resolve(identities); return; } if (emailArr[emailNum].indexOf("@") < 0) { // skip if not an email address getNextIdentity(emailNum + 1); return; } let identity = null; let rating = 3; // default rating: no key available EnigmailPEPAdapter.getIdentityForEmail(emailArr[emailNum]).then( function _gotIdentity(data) { if (data && ("result" in data) && typeof data.result === "object" && typeof data.result.outParams[0] === "object") { identity = data.result.outParams[0]; return EnigmailPEPAdapter.pep.getIdentityRating(identity); } else { let deferred = PromiseUtils.defer(); deferred.resolve({ status: 0 }); return deferred.promise; } }).then( function _gotRating(data) { if ("result" in data && Array.isArray(data.result.outParams) && typeof(data.result.outParams[0]) === "object" && "rating" in data.result.outParams[0]) { rating = data.result.outParams[0].rating; } identities.push({ email: emailArr[emailNum], user_id: identity, rating: rating }); getNextIdentity(emailNum + 1); }).catch( function _err(data) { EnigmailLog.DEBUG("pEpAdapter.getIdentitiesForEmails: ERROR: " + JSON.stringify(data) + "\n"); deferred.reject(data); }); } getNextIdentity(0); return deferred.promise; }, calculateColorFromRating: function(rating) { let color = "grey"; if (rating === -2 || rating === 2) { color = "grey"; } else if (rating < 0) { color = "red"; } else if (rating < 6) { color = "grey"; } else if (rating >= 7) { color = "green"; } else { color = "yellow"; } return color; }, /** * Get CSS class for pEp rating */ getRatingClass: function(rating) { let setClass = ""; let color = this.calculateColorFromRating(rating); switch (color) { case "grey": setClass = "enigmailPepIdentityUnknown"; break; case "red": setClass = "enigmailPepIdentityMistrust"; break; case "yellow": setClass = "enigmailPepIdentityReliable"; break; case "green": setClass = "enigmailPepIdentityTrusted"; } return setClass; }, getRatingLabel: function(ratingNum) { let ratingDesc = "Undefined"; switch (ratingNum) { case 1: ratingDesc = "CannotDecrypt"; break; case 2: ratingDesc = "HaveNoKey"; break; case 3: ratingDesc = "Unencrypted"; break; case 4: ratingDesc = "UnencryptedForSome"; break; case 5: ratingDesc = "Unreliable"; break; case 6: ratingDesc = "Reliable"; break; case 7: case 8: case 9: ratingDesc = "Trusted"; break; case -2: ratingDesc = "Broken"; break; case -1: ratingDesc = "Mistrust"; break; case -3: ratingDesc = "UnderAttack"; break; } return ratingDesc; }, setupIncomingFilter: function() { EnigmailFilters.addNewMailConsumer({ headersOnly: false, incomingMailOnly: true, unreadOnly: false, selfSentOnly: true, consumeMessage: EnigmailPEPFilter.newMailConsumer.bind(EnigmailPEPFilter) }); }, registerJuniorModeObserver: function(observer) { if (gJmObservers === null) { gJmObservers = {}; EnigmailPrefs.registerPrefObserver("juniorMode", this.handleJuniorModeChange); } let observerId = "O" + (gJmObserverId++); gJmObservers[observerId] = observer; return observerId; }, unregisterJuniorModeObserver: function(observerId) { if (observerId in gJmObservers) { delete gJmObservers[observerId]; } }, handleJuniorModeChange: function() { for (let i in gJmObservers) { try { gJmObservers[i](); } catch (ex) {} } } }; function installMissingGnuPG() { if (!(EnigmailOS.isMac || EnigmailOS.isWin32)) return; if (getDialog().confirmDlg(null, EnigmailLocale.getString("pep.missingGnuPG"), EnigmailLocale.getString("dlg.button.install"))) { let listener = { onStart: function(oReq) { this.oReq = oReq; }, onError: function() {}, onProgress: function() {}, onDownloaded: function() {}, onLoaded: function() { EnigmailpEp.shutdown().then(x => { let env = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment); let gpgPath = getGpgAgent().resolveGpgPath(env); if (gpgPath) { let p = env.get("PATH"); if (EnigmailOS.isDosLike) { p = p.replace(/;$/, ""); p += ";" + gpgPath.parent.path + ";"; } else { p += ":" + gpgPath.parent.path; } env.set("PATH", p); EnigmailCore.setEnvVariable("PATH", p); } EnigmailTimer.setTimeout(function _f() { // wait at 0.5 seconds t, then re-initialize EnigmailPEPAdapter.initialize(); }, 500); }); }, onWarning: function() { return false; }, stopPep: function() { EnigmailpEp.shutdown(); } }; getInstallGnuPG().startInstaller(listener); } } enigmail-2.0.8/package/pEpDecrypt.jsm000066400000000000000000000440151334302754500175050ustar00rootroot00000000000000/*global Components: false */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; /** * Module for interfacing to pEp (Enigmal-specific functions) */ const Cu = Components.utils; const Cc = Components.classes; const Ci = Components.interfaces; const COLOR_UNDEF = -471142; Cu.import("resource://enigmail/pEp.jsm"); /*global EnigmailpEp: false */ Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ Cu.import("resource://enigmail/pEpAdapter.jsm"); /*global EnigmailPEPAdapter: false */ Cu.import("resource://enigmail/mime.jsm"); /*global EnigmailMime: false */ Cu.import("resource://enigmail/locale.jsm"); /*global EnigmailLocale: false */ Cu.import("resource://enigmail/mimeVerify.jsm"); /*global EnigmailVerify: false */ Cu.import("resource://enigmail/uris.jsm"); /*global EnigmailURIs: false */ Cu.import("resource://enigmail/streams.jsm"); /*global EnigmailStreams: false */ Cu.import("resource://enigmail/data.jsm"); /*global EnigmailData: false */ Cu.import("resource:///modules/jsmime.jsm"); /*global jsmime: false*/ Cu.import("resource://enigmail/singletons.jsm"); /*global EnigmailSingletons: false */ Cu.import("resource://enigmail/funcs.jsm"); /*global EnigmailFuncs: false */ Cu.import("resource://enigmail/mimeDecrypt.jsm"); /*global EnigmailMimeDecrypt: false */ var EXPORTED_SYMBOLS = ["EnigmailPEPDecrypt"]; const LAST_MSG = EnigmailSingletons.lastDecryptedMessage; var inStream = Cc["@mozilla.org/scriptableinputstream;1"].createInstance(Ci.nsIScriptableInputStream); var EnigmailPEPDecrypt = { /** * create a new PEP decryption object (for PGP/MIME handling) * * @param contentType - String: the value of the RFC 822 Content-Type * * @return Object */ getDecryptionService: function(contentType) { return new PEPDecryptor(contentType); }, /** * Decrypt a message using pEp * * @param isPgpMime: Boolean - true if PGP/MIME decryption, false for inline-PGP (or unknown) * @param msgData: String - the message to be decrypted * @param adr: Object - * from: email, [to, cc, reply_to]: Array of emails * @param contentType: String - the content-type string (only required for PGP/MIME) * * @return null - if decryption unsuccessful * Object: - if decryption successful * - longmsg - String: the decrypted message * - shortmsg - String; message subject (if any) * - rating: - Number: the pEp rating of how securely the message was tansmitted * - fpr: - Array of String: the list of fingerprints used for the message * - persons: - Object: * - from: pEpPerson * - to: Array of pEpPerson * - cc: Array of pEpPerson * - reply_to: Array of pEpPerson */ decryptMessageData: function(isPgpMime, msgData, adr, contentType) { let s = msgData.search(/^-----BEGIN PGP MESSAGE-----/m); let e = msgData.search(/^-----END PGP MESSAGE-----/m); let pgpData = s >= 0 && e > s ? msgData.substring(s, e + 27) : msgData; if (!adr) adr = {}; if (!("from" in adr)) { adr.from = { email: "unknown@localhost" }; } if (!("to" in adr)) adr.to = []; if (!("cc" in adr)) adr.cc = []; let from = EnigmailPEPAdapter.emailToPepPerson(adr.from); let to = []; for (let i of adr.to) { to.push(EnigmailPEPAdapter.emailToPepPerson(i)); } let cc = []; for (let i of adr.cc) { cc.push(EnigmailPEPAdapter.emailToPepPerson(i)); } let replyTo; if ("replyTo" in adr) { replyTo = []; for (let i of adr.replyTo) { replyTo.push(EnigmailPEPAdapter.emailToPepPerson(i)); } } if (isPgpMime) { return decryptPgpMime(msgData, from, to, cc, replyTo); } else { return decryptInlinePgp(pgpData, from, to, cc, replyTo); } }, getEmailsFromMessage: function(url) { EnigmailLog.DEBUG("pEpDecrypt.jsm: getEmailsFromMessage:\n"); let inspector = Cc["@mozilla.org/jsinspector;1"].createInstance(Ci.nsIJSInspector); let addresses = { from: null, to: [], cc: [] }; let s = EnigmailStreams.newStringStreamListener( function analyzeData(data) { EnigmailLog.DEBUG("pEpDecrypt.jsm: getEmailsFromMessage: got " + data.length + " bytes\n"); let i = data.search(/\n\r?\n/); if (i < 0) i = data.length; let hdr = Cc["@mozilla.org/messenger/mimeheaders;1"].createInstance(Ci.nsIMimeHeaders); hdr.initialize(data.substr(0, i)); if (hdr.hasHeader("from")) { addresses.from = hdr.getHeader("from")[0]; } if (hdr.hasHeader("to")) { addresses.to = hdr.getHeader("to"); } if (hdr.hasHeader("cc")) { addresses.cc = hdr.getHeader("cc"); } if (hdr.hasHeader("reply-to")) { addresses.replyTo = hdr.getHeader("reply-to"); } if (inspector && inspector.eventLoopNestLevel > 0) { // unblock the waiting lock inspector.exitNestedEventLoop(); } } ); try { var channel = EnigmailStreams.createChannel(url); channel.asyncOpen(s, null); // wait here for message parsing to terminate inspector.enterNestedEventLoop(0); } catch (e) { EnigmailLog.DEBUG("pEpDecrypt.jsm: getEmailsFromMessage: exception " + e + "\n"); } return addresses; } }; /** * decryption handler for PGP/MIME messages (nsIStreamListener) */ function PEPDecryptor(contentType) { this.contentType = contentType; this.sourceData = ""; this.uri = null; this.backgroundJob = false; this.decryptedData = ""; this.decryptedHeaders = {}; this.mimePartNumber = ""; this.requestingSubpart = false; this.ignoreMessage = false; } PEPDecryptor.prototype = { onStartRequest: function(request, uri) { EnigmailLog.DEBUG("pEpDecrypt.jsm: onStartRequest\n"); this.mimeSvc = request.QueryInterface(Ci.nsIPgpMimeProxy); this.msgWindow = EnigmailVerify.lastMsgWindow; if (uri) { this.uri = uri.QueryInterface(Ci.nsIURI).clone(); EnigmailLog.DEBUG("pEpDecrypt.jsm: onStartRequest: uri='" + this.uri.spec + "'\n"); this.backgroundJob = (this.uri.spec.search(/[&?]header=(filter|print|quotebody|enigmailConvert)/) >= 0); this.requestingSubpart = (this.uri.spec.search(/[&?]part=/) >= 0); this.ignoreMessage = (this.uri.spec.search(/[&?]header=enigmailFilter/) >= 0); } if (!this.isReloadingLastMessage()) { LAST_MSG.lastMessageData = ""; LAST_MSG.lastMessageURI = null; } if ("mimePart" in this.mimeSvc) { this.mimePartNumber = this.mimeSvc.mimePart; } else { this.mimePartNumber = ""; } }, onDataAvailable: function(req, sup, stream, offset, count) { if (count > 0) { inStream.init(stream); this.sourceData += inStream.read(count); } }, onStopRequest: function() { // make the string a complete MIME message let spec = this.uri ? this.uri.spec : null; if (!EnigmailMime.isRegularMimeStructure(this.mimePartNumber, spec) || this.ignoreMessage) { if (!this.isUrlEnigmailConvert()) { this.decryptedData = EnigmailMimeDecrypt.emptyAttachment(); } else { throw "pEpDecrypt.jsm: Cannot decrypt messages with mixed (encrypted/non-encrypted) content"; } this.returnData(); return; } if (this.isReloadingLastMessage()) { EnigmailLog.DEBUG("pEpDecrypt.jsm: onStopRequest: returning same data as before\n"); this.decryptedData = LAST_MSG.lastMessageData; this.returnData(); if (!this.backgroundJob) { // only display the decrption/verification status if not background-Job this.decryptedHeaders = LAST_MSG.lastPepStatus.decryptedHeaders; this.mimePartNumber = LAST_MSG.lastPepStatus.mimePartNumber; this.displayStatus(LAST_MSG.lastPepStatus.rating, LAST_MSG.lastPepStatus.fpr, LAST_MSG.lastPepStatus.dec.persons); } return; } let wrapper = EnigmailMime.createBoundary(); this.decryptedData = 'Content-Type: multipart/mixed; boundary="' + wrapper + '"\r\n' + 'Content-Disposition: inline\r\n\r\n' + '--' + wrapper + '\r\n' + 'Content-Type: text/plain; charset="UTF-8"\r\n\r\n' + EnigmailData.convertFromUnicode(EnigmailLocale.getString("pEpDecrypt.cannotDecrypt"), "UTF-8") + '\r\n--' + wrapper + '--\r\n'; this.sourceData = "Content-Type: " + this.contentType + "\r\n\r\n" + this.sourceData; let addresses; if (this.uri && (!this.backgroundJob) && (!this.requestingSubpart)) { addresses = EnigmailPEPDecrypt.getEmailsFromMessage(this.uri.spec); } let dec = EnigmailPEPDecrypt.decryptMessageData(true, this.sourceData, addresses, this.contentType); let rating = COLOR_UNDEF; let fpr = []; if (dec) { this.decryptedData = dec.longmsg; if (dec.shortmsg && dec.shortmsg.length > 0) { this.decryptedHeaders.subject = dec.shortmsg; } rating = dec.rating; fpr = dec.fpr; this.extractEncryptedHeaders(); // HACK: remove filename from 1st HTML part to make TB display message without attachment this.decryptedData = this.decryptedData.replace(/^Content-Disposition: inline; filename="msg.txt"/m, "Content-Disposition: inline"); this.decryptedData = this.decryptedData.replace(/^Content-Disposition: inline; filename="msg.html"/m, "Content-Disposition: inline"); if (this.mimePartNumber !== "1") { this.addWrapperToDecryptedResult(); } else { let i = this.decryptedData.search(/\n\r?\n/); if (i > 0) { let hdr = this.decryptedData.substr(0, i); if (hdr.search(/^content-type:\s+text\/(plain|html)/im) >= 0) { EnigmailLog.DEBUG("pEpDecrypt.jsm: done: adding multipart/mixed around '" + hdr + "'\n"); this.addWrapperToDecryptedResult(); } } } let prefix = EnigmailMimeDecrypt.pretendAttachment(this.mimePartNumber, this.uri); if (prefix.length > 0) { this.decryptedData = prefix + this.decryptedData; } if (!this.backgroundJob) { // only display the decrption/verification status if not background-Job this.displayStatus(rating, fpr, dec.persons); LAST_MSG.lastPepStatus = { rating: rating, fpr: fpr, dec: dec, decryptedHeaders: this.decryptedHeaders, mimePartNumber: this.mimePartNumber }; } } if (this.mimePartNumber === "1" && this.decryptedData.search(/^Content-Type:[\t ]+multipart\/encrypted/mi) < 0) { LAST_MSG.lastMessageURI = EnigmailURIs.msgIdentificationFromUrl(this.uri); LAST_MSG.lastMessageData = this.decryptedData; } else { LAST_MSG.lastMessageURI = null; LAST_MSG.lastMessageData = ""; } this.returnData(); }, isUrlEnigmailConvert: function() { if (!this.uri) return false; return (this.uri.spec.search(/[&?]header=enigmailConvert/) >= 0); }, addWrapperToDecryptedResult: function() { if (!this.isUrlEnigmailConvert()) { let wrapper = EnigmailMime.createBoundary(); let head = 'Content-Type: multipart/mixed; boundary="' + wrapper + '"\r\n' + 'Content-Disposition: inline\r\n\r\n' + '--' + wrapper + '\r\n'; this.decryptedData = head + this.decryptedData + '\r\n' + '--' + wrapper + '--\r\n'; } }, returnData: function() { if ("outputDecryptedData" in this.mimeSvc) { this.mimeSvc.outputDecryptedData(this.decryptedData, this.decryptedData.length); } else { let gConv = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(Ci.nsIStringInputStream); gConv.setData(this.decryptedData, this.decryptedData.length); this.mimeSvc.onDataAvailable(null, null, gConv, 0, this.decryptedData.length); this.mimeSvc.onStopRequest(null, null, 0); } }, displayStatus: function(rating, fpr, persons) { EnigmailLog.DEBUG("pEpDecrypt.jsm: displayStatus\n"); if (this.msgWindow === null || this.backgroundJob || this.requestingSubpart) return; let uriSpec = (this.uri ? this.uri.spec : null); try { EnigmailLog.DEBUG("pEpDecrypt.jsm: displayStatus for uri " + uriSpec + "\n"); let headerSink = EnigmailSingletons.messageReader; if (headerSink && this.uri) { let r = { fpr: fpr.join(","), persons: persons, rating: rating }; headerSink.processDecryptionResult(this.uri, "modifyMessageHeaders", JSON.stringify(this.decryptedHeaders), this.mimePartNumber); headerSink.processDecryptionResult(this.uri, "displayPepStatus", JSON.stringify(r), this.mimePartNumber); } } catch (ex) { EnigmailLog.writeException("pEpDecrypt.jsm", ex); } EnigmailLog.DEBUG("pEpDecrypt.jsm: displayStatus done\n"); }, /** * Determine if we are reloading the same message as the previous one * * @return Boolean */ isReloadingLastMessage: function() { if (!this.uri) return false; if (!LAST_MSG.lastMessageURI) return false; if (("lastMessageData" in LAST_MSG) && LAST_MSG.lastMessageData === "") return false; if (this.isUrlEnigmailConvert()) return false; let currMsg = EnigmailURIs.msgIdentificationFromUrl(this.uri); if (LAST_MSG.lastMessageURI.folder === currMsg.folder && LAST_MSG.lastMessageURI.msgNum === currMsg.msgNum) { return true; } return false; }, /** * extract protected headers from the message and modify decrypted data to not * contain them anymore */ extractEncryptedHeaders: function() { let r = EnigmailMime.extractProtectedHeaders(this.decryptedData); if (!r) return; this.decryptedHeaders = r.newHeaders; if (r.startPos >= 0 && r.endPos > r.startPos) { this.decryptedData = this.decryptedData.substr(0, r.startPos) + this.decryptedData.substr(r.endPos); } } }; function decryptPgpMime(msgData, from, to, cc, replyTo) { let inspector = Cc["@mozilla.org/jsinspector;1"].createInstance(Ci.nsIJSInspector); let resultObj; let msgStr = ""; let mapAddr = function _map(x) { return x.address; }; if (to) { msgStr += to.map(mapAddr).join(", ") + ", "; } if (cc) { msgStr += cc.map(mapAddr).join(", ") + ", "; } if (replyTo) { msgStr += replyTo.map(mapAddr).join(", ") + ", "; } msgStr = msgStr.replace(/, [, ]+/g, ", ").replace(/, $/, ""); if (msgStr.length > 0) { msgStr = "To: " + msgStr + "\r\n"; } msgStr = "From:" + from.address + "\r\n" + msgStr + msgData; EnigmailpEp.decryptMimeString(msgStr).then(function _step2(res) { EnigmailLog.DEBUG("pEpDecrypt.jsm: decryptMessage: SUCCESS\n"); if ((typeof(res) === "object") && ("result" in res)) { resultObj = res.result.outParams; } else EnigmailLog.DEBUG("pEpDecrypt.jsm: decryptMessage: typeof res=" + typeof(res) + "\n"); if (inspector && inspector.eventLoopNestLevel > 0) { // unblock the waiting lock in finishCryptoEncapsulation inspector.exitNestedEventLoop(); } }).catch(function _error(err) { EnigmailLog.DEBUG("pEpDecrypt.jsm: processPepEncryption: ERROR\n"); try { EnigmailLog.DEBUG(err.code + ": " + ("exception" in err ? err.exception.toString() : err.message) + "\n"); } catch (x) { EnigmailLog.DEBUG(JSON.stringify(err) + "\n"); } if (inspector && inspector.eventLoopNestLevel > 0) { // unblock the waiting lock in finishCryptoEncapsulation inspector.exitNestedEventLoop(); } }); // wait here for PEP to terminate inspector.enterNestedEventLoop(0); if (resultObj && (typeof(resultObj[3]) === "string")) { let msgSubject = ""; let i = resultObj[3].search(/\r?\n\r?\n/); if (i > 0) { let hdr = Cc["@mozilla.org/messenger/mimeheaders;1"].createInstance(Ci.nsIMimeHeaders); hdr.initialize(resultObj[3].substr(0, i)); if (hdr.hasHeader("subject")) { msgSubject = jsmime.headerparser.decodeRFC2047Words(hdr.extractHeader("subject", true)) || ""; } } return { longmsg: resultObj[3], shortmsg: msgSubject, persons: { from: from, to: to, cc: cc, reply_to: replyTo }, rating: resultObj[1].rating, fpr: resultObj[2] }; } else return null; } function decryptInlinePgp(pgpData, from, to, cc, replyTo) { let inspector = Cc["@mozilla.org/jsinspector;1"].createInstance(Ci.nsIJSInspector); let resultObj; EnigmailpEp.decryptMessage(pgpData, from, to, cc, replyTo).then(function _step2(res) { EnigmailLog.DEBUG("pEpDecrypt.jsm: decryptMessage: SUCCESS\n"); if ((typeof(res) === "object") && ("result" in res)) { resultObj = res.result.outParams; } else EnigmailLog.DEBUG("pEpDecrypt.jsm: decryptMessage: typeof res=" + typeof(res) + "\n"); if (inspector && inspector.eventLoopNestLevel > 0) { // unblock the waiting lock in finishCryptoEncapsulation inspector.exitNestedEventLoop(); } }).catch(function _error(err) { EnigmailLog.DEBUG("pEpDecrypt.jsm: processPepEncryption: ERROR\n"); try { EnigmailLog.DEBUG(err.code + ": " + ("exception" in err ? err.exception.toString() : err.message) + "\n"); } catch (x) { EnigmailLog.DEBUG(JSON.stringify(err) + "\n"); } if (inspector && inspector.eventLoopNestLevel > 0) { // unblock the waiting lock in finishCryptoEncapsulation inspector.exitNestedEventLoop(); } }); // wait here for PEP to terminate inspector.enterNestedEventLoop(0); if (resultObj && (typeof(resultObj[3]) === "object")) { return { longmsg: resultObj[3].longmsg, shortmsg: "", // resultObj[3].shortmsg, persons: { from: resultObj[3].from, to: resultObj[3].to, cc: resultObj[3].cc, reply_to: resultObj[3].reply_to }, rating: resultObj[1].rating, fpr: resultObj[2] }; } else return null; } enigmail-2.0.8/package/pEpFilter.jsm000066400000000000000000000134261334302754500173220ustar00rootroot00000000000000/*global Components: false */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; /** * Module for interfacing to pEp (Enigmail-specific functions) */ const Cu = Components.utils; const Cc = Components.classes; const Ci = Components.interfaces; Cu.import("resource://enigmail/locale.jsm"); /*global EnigmailLocale: false */ Cu.import("resource://enigmail/funcs.jsm"); /*global EnigmailFuncs: false */ Cu.import("resource://enigmail/constants.jsm"); /*global EnigmailConstants: false */ Cu.import("resource://gre/modules/Services.jsm"); /* global Services */ Cu.import("resource://enigmail/timer.jsm"); /* global EnigmailTimer: false */ Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ Cu.import("resource://enigmail/lazy.jsm"); /*global EnigmailLazy: false */ const getPepAdapter = EnigmailLazy.loader("enigmail/pEpAdapter.jsm", "EnigmailPEPAdapter"); // pEp JSON Server executable name const DECRYPT_FILTER_NAME = "pEp-Decrypt-on-Sending"; const AUTOPROCESS_FILTER_NAME = "pEp-Process-Sync-Message"; const AUTOPROCESS_HEADER = "pep-auto-consume"; const PEP_DECRYPT_FLAGS = { own_private_key: 1, consume: 2, ignore: 4 }; var EXPORTED_SYMBOLS = ["EnigmailPEPFilter"]; var EnigmailPEPFilter = { DECRYPT_FILTER_NAME: DECRYPT_FILTER_NAME, AUTOPROCESS_FILTER_NAME: AUTOPROCESS_FILTER_NAME, /** * Delete an existing standard pEp filter rule for storing unencrypted * sent messages (if trusted server is disabled) * * @param identity - Object: nsIMsgIdentity for relevant account */ deleteDecryptedCopyFilter: function(identity) { let acct = EnigmailFuncs.getAccountForIdentity(identity); let filters = acct.incomingServer.getFilterList(null); let pepFilter = filters.getFilterNamed(DECRYPT_FILTER_NAME); if (pepFilter) { filters.removeFilter(pepFilter); } }, /** * Check and/or create the pEp standard filter rule for saving sent messages * in decrypted form (if trusted server is enabled) * * @param identity - Object: nsIMsgIdentity for relevant account * * @return Object: Filter rule (nsIMsgFilter) */ ensureDecryptedCopyFilter: function(identity) { let acct = EnigmailFuncs.getAccountForIdentity(identity); let filters = acct.incomingServer.getFilterList(null); let pepFilter = filters.getFilterNamed(DECRYPT_FILTER_NAME); if (pepFilter) { let searchTerm = pepFilter.searchTerms.queryElementAt(0, Ci.nsIMsgSearchTerm); let action = pepFilter.getActionAt(0); if (searchTerm && action && pepFilter.searchTerms.length === 1 && searchTerm.matchAll && pepFilter.actionCount === 1 && pepFilter.filterType === Ci.nsMsgFilterType.PostOutgoing && action.type === Ci.nsMsgFilterAction.Custom && action.customAction.id === EnigmailConstants.FILTER_MOVE_DECRYPT) { // set outbox action.strValue = identity.fccFolder; pepFilter.enabled = true; } else { filters.removeFilter(pepFilter); pepFilter = null; } } if (!pepFilter) { pepFilter = filters.createFilter(DECRYPT_FILTER_NAME); let searchTerm = pepFilter.createTerm(); searchTerm.matchAll = true; let action = pepFilter.createAction(); action.type = Ci.nsMsgFilterAction.Custom; action.customId = EnigmailConstants.FILTER_MOVE_DECRYPT; action.strValue = identity.fccFolder; pepFilter.appendTerm(searchTerm); pepFilter.appendAction(action); pepFilter.enabled = true; pepFilter.filterType = Ci.nsMsgFilterType.PostOutgoing; pepFilter.filterDesc = EnigmailLocale.getString("filter.tempPepFilterDesc"); filters.insertFilterAt(0, pepFilter); } return pepFilter; }, newMailConsumer: function(messageStruct, rawMessageData, msgHdr) { EnigmailLog.DEBUG("pEpFilter.jsm: newMailConsumer()\n"); let processAttempts = 0; function delMsg(msgHdr) { let folderInfoObj = {}; msgHdr.folder.getDBFolderInfoAndDB(folderInfoObj).DeleteMessage(msgHdr.messageKey, null, true); } function processMailWithPep() { EnigmailLog.DEBUG("pEpFilter.jsm: newMailConsumer: processMailWithPep(" + msgHdr.messageKey + ")\n"); getPepAdapter().pep.decryptMimeString(rawMessageData). then(resultObj => { let e = msgHdr.propertyEnumerator; if (!e.hasMore()) { EnigmailLog.DEBUG("pEpFilter.jsm: newMailConsumer: message " + msgHdr.messageKey + " was deleted\n"); return; } if (resultObj && "result" in resultObj) { let decryptFlag = resultObj.result.outParams[0]; EnigmailLog.DEBUG("pEpFilter.jsm: newMailConsumer: flag for " + msgHdr.messageKey + ": " + decryptFlag + "\n"); if (++processAttempts > 3) { // ignore messages after more than 3 attempts return; } switch (decryptFlag) { case PEP_DECRYPT_FLAGS.ignore: EnigmailLog.DEBUG("pEpFilter.jsm: newMailConsumer: next round\n"); EnigmailTimer.setTimeout(function _f() { processMailWithPep(); }, 600000); // 10 minutes break; case PEP_DECRYPT_FLAGS.consume: delMsg(msgHdr); break; default: return; } } }). catch(err => { }); } if (getPepAdapter().usingPep()) { // ensure line ends are CRLF rawMessageData.replace(/\r?\n/g, "\n").replace(/\n/g, "\r\n"); let c = messageStruct.headers.getRawHeader("pep-auto-consume"); if (c && c.join("").toLowerCase() === "yes") { processMailWithPep(); } } } }; enigmail-2.0.8/package/pEpKeySync.jsm000066400000000000000000000520731334302754500174630ustar00rootroot00000000000000/*global Components: false*/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailPEPKeySync"]; const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; Cu.import("resource://enigmail/rng.jsm"); /*global EnigmailRNG: false */ Cu.import("resource://enigmail/mime.jsm"); /*global EnigmailMime: false */ Cu.import("resource:///modules/jsmime.jsm"); /*global jsmime: false*/ Cu.import("resource://enigmail/data.jsm"); /*global EnigmailData: false */ Cu.import("resource://enigmail/files.jsm"); /*global EnigmailFiles: false */ Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ Cu.import("resource://enigmail/send.jsm"); /*global EnigmailSend: false */ Cu.import("resource://enigmail/locale.jsm"); /*global EnigmailLocale: false */ Cu.import("resource://enigmail/pEp.jsm"); /*global EnigmailpEp: false */ Cu.import("resource://enigmail/lazy.jsm"); /*global EnigmailLazy: false */ Cu.import("resource://gre/modules/PromiseUtils.jsm"); /* global PromiseUtils: false */ const getWindows = EnigmailLazy.loader("enigmail/windows.jsm", "EnigmailWindows"); const testMessage = { "dir": 1, "shortmsg": "pEp", "longmsg": "this message was encrypted with p≡p https://pEp-project.org", "attachments": [{ "value": "VmVyc2lvbjogMQ==", "size": 10, "mime_type": "application/pgp-encrypted" }, { "value": "LS0tLS1CRUdJTiBQR1AgTUVTU0FHRS0tLS0tCgpoUUlNQThNZGNTR0taTkJxQVEvL1NBUzZUTVlOOHZtUDFJZnoreTk4QUU1Wjc3QXZOck8vdHo5MFlNN21leldyCndhM0lYdjVXMTBrMnJ2dmZDSkpEQWlqMHE3Y3EzaUJlZ3kweGZHMVlkUzlPT3BoYTg4MjBRRy91Z3kwRGxjWk0KeCtZR3dPS2lpbUF2dWUxR2NNeUc4V3BTZ05aV25zeVBib2tUQXFVMlVKY09ReTdhRnd3cmhQZ0JJOTQzSWlqRgpyandYKzZVQnNwakpTODV5ZXVwbTVqaTR6OUg5VnBSRW5ZMkVmN0dEVHJudGVyRDZlTkhMbXh2djhhdVIyZytPCmZPVmgycytqTTVsOFZDTDBpOGhuVUZYYjZNUXZ0encrM3dwVUNDSTdoeTNhMEpocXdJWi9tWDc1VTVnS1VPVTYKZlVSWktJVWNZRS84OTZPRzh4Q0x4ZThqWW1ldnoyLzdZbEREbEd4ZHZvbUFuSkVJUThPTWY2VjBBc0ZZTHkwWQpIVSszWk9Vb1k1VTFEZE14Mlp4a3cxY1YxZFp0eE9wS1VsaTQ1WlNzOXM5bUpvVHNtaEtZSVhER1BYNXpKZHpYCm5sM05lbVJZNUZlR2ZuNktCOCtaV0RlZ3RtamtQaTI4b1VNTk5WUmd5bmVaRTRqemRiSTNobGNJa0RjZjhHbGYKSGg0S1laK294bVBYMWh6RWhHK0VSOXRIRTBsVWNmWGMvNWQ0a3pESnliZks2amt1SzZiUWh3ay95eVgyWk1tcApLQUJ4QUg2V2NiS2lDTEVlTWpJTlJCMk9ndkI1ZlJiSHVTU0s4Mk8zQWlSeW9vKzdQZWJIekwyMG04YmlPUlJ0CmhYQmFVUGVWUmRkai9XTTA5MlJXeVZ1SFNYcHBZNkJBSHFwUGNIS0o2YWtCV2RCanUrZ3lYelhhM1lmeitycUYKQWd3REs5Y2F4Uld5NFRZQkQvMFFJeW5KZnQwQjN3TTNxUXBnRnNWdFIvZ2ZDR2k2TGp1Y1NTMGRzQjZ2RVRETwp5ZGgyV3dXMzl4bTcxUHV2ck9GVk9oOTlRNUFaY2VIOURMVkxxdGc3Z0dGZ1pOWmQ2bVEyck5lWVdLNVluaW1NClEzLzRicTBIS2YvN3liNlJ1dm55UWlQdVNEUHdjUmNlaWhNN3V1blFZNzVhZ1pQVlNGWVplUk9OMHhrWHV5dVkKTk9NQWFnM3RXTCticEdScU1aTE9PRHhRZXArc0FNbENrbUdkZEtETFpkUnZndWRWaWw4dEI3ejVSUk44NVJjUAo0aWs5SkZ0SzU5YkkvdTdqbmdaaUhOSmkvcVNsd0lKMHRVZzlmMTd5OFFFNjRVc256aDhld2JFcThjcDVJd05BCm5FNFo3cjNDeEFVMTd3eXI0UytqTFd4N2tjempiNFcvUEEwVnBuTGg4bFEzRzAxR2Q5bnB6R2NSMVpPVWZkUG4KN0dSZ2dtaXFOb1Y4YUJvZ2RDaDdwOFF3MFRySFpKVzR4dytyajFaQ2poZWVSUEtMUExoVlBEMjVHVktIeDRCMAowMHF6MW4xM1YrSzRTNTF3VUNGT3Bra1oyK0J6MXF4TFNUemlvSGJSTk1aK0FRZmttM3o1WEhKM0kzMHlTMzR4CjlUTTM4MWpaK0ZhU09ybGc1eE1TRUttb1U3aFI1Nm5tU2RsL2FvaWpwMkZvZmdDM2RTZm0zN2pjWGMrTEhnd0oKaU9QejhacDVEQXZtWkdxL0Znb004eEZXSDc2TW5GK2RiUklOajJQYTdzQXZwTlNUMVM5dUl3V2JKNVhqVVdKbQo1V051Uk9Mc0VnNXFPVWdKaGdKU2RIUHBueVNka2ZieVV6c0hlK2VpM1oxeTB5L2hhbkpQbnpTMUhwVW9HdExzCkFSVjVlSUZRbnRmbWZMaTlFcVBycWZYMEMvSGxRYVp4U0lrd3o4dUMvL29acXJOZFMxRnhGUVpZcjEwdFNKalEKck8wVHl4SHlhUG5pMUd3Nkh5OThneXhsdU0wK1FnR0k4OFR6UTk5ZmU4ZmRUQW9ZLzVqcmZaRDk3V1BzQVFVNAp5eWRmQWtzOS90aUswd29ZSDJKdXgzakFKZ1VKNFBUZEQ5WE9OeWtnSXpNZWVxbHE4Zms0dExlVEVSeWRkZUpOClNwRVVwcUN4cVc2eUJzZEJla3ZQSnhpcWc4QjBJZ0dLNG01LzJ5UUY0QjZBMHp6SkRzU3JFN0V4OVY2YlBqOHEKK3NIbTZJUzZqdi9nYzlMNkhFOUhwOTBvMlNoT2ttcTVrV3VJVXU3Mzl5cmR5ejFVNDRPeUQwajJWS0VVOWZZNQp6Y2dwWkpnbHdXazU4WnU5dmlTanpuNUFLMW50MWRhTlRLYjZaUUJNUmMrWmowUU4yRW82RTBSNGRDV0Y0RUN1CmVFQXZHRGtVM3ZZdWFwa3E3cVM1ZUwwUXRXelZkRW1aUEV3UHdaWFFKUzlYSUhxU2hPcjMxSi91SXZoZ3A5VHQKRWZrWUdWclJDS3FsVkFzekE0dU1PR0NROWhxYlQyRERvbFNYSllyZVErSGZxalREMmhCR21RWFdVTnd6dEVNMQo2clFJOHJ2cW1rTkdwNDhsWnhLdVNkNnhGc1FQU2l2d09vU0NiaTZJakwvM3RPS0ZyUDNtM2tXdjVUT2JLN1l5Cmx0UFQwL013dW1LMmpiSVhVNy9PcTB4RWVNRnZPZTJPcmZRRkFCVVlwRDJwcnZpeWFUd09NemEwMW9PcUNVQlUKTUgzdVQ4OWtFMTRBaTYwYWRJaC9RUCtDSzlBSkM1WEFhakY4QmFkTEZJaGZoR0hJeTBTVGhlM3NOTnFKUEs3VApkbU9PRjFSTkIzbzVpNTFhN2xGejlkRzZTeThPWm43anBkTU9PMVd6SU04ODBKVit4RUxFY3dSUW1UczFjZGVSCjJSMm1WL0c0R09yQXJISmhBcE5STkl5dUd0NGpoT1FhUFM2bSsvWDJMSHNUTmFjc0ZWSlRaT296WldscG1XZngKK3RaUExDaC85QzJLc3pJT25PNnArRms3a2xCRkpsRE4vaVE5TlhZQnVWRThUTWdzNUxManhieGxYVk9TSnI5Rgpmd2VLeFJaa2FydlRMSXZzTmlCcnlkb1VlLzRLOTc0ekJYT1lLUDNlOXRINC95TjJWQUM4RGlMZFdTY291eHlzCmVpK2p1UU5KVVZ3M2tFUmJuc3BOdDMzdSt2cHc5R3NxZWl1dnFtUWw0NVZvUng3LzRFOFJQK2l0S3pxK3kzWSsKVHgwNDFZSUxhcVBtaHo1VzdXeEFwbjNMWUpuMHoxem01TGExOHh0RmIzT1NlT3RabTdpZTRXSUgvRERKNC9sZwpvRE5OaFZ1cTZ4Q3BFaTJydFZURk94S3JGRWZHakxPYmZkcjVRZmRZNmovUzkwWkpvTnVGNDJtOFlJbyt0Ny9tCnhNdGQ4YTM5WHFQMXp6Q25uK3RhUlo4MG5uSThhMXpDSk1lZzFPbmE3eGJDL2dhR29ialFBSlYvSVh5cTY1UlAKNVdKQVZLbkFScEl4c3IyVWZkWTZ4bGUwNWhRSnN0UUx5M01Nc2IreGFScjFxNnBnaHJLSlpWbnF6WDNJL1VBSwpmUjZkS3l0QzRuWkxoQjRGeUdRdHYwSWlEMnNOUDIwQU9Ea1lDVFphR2lsKzZQZk9YWEc5dmF0cXZvTWd0Q0R4CmdyRzZ4M21GOVVtYlJnSG5qa3BYVVIzQVo3empLNGVJU2xLVDFVR2tEQWlJdWFMMU5qcEsvWWpxbDZPUWNLUFoKR21vQmpObm5JbGJKNFhRRVdPenZyUUtVTm1ER0NZUWtLUE9JdnN6TnpjQWkvVFZ6RkNVYkFRRG95L2JEZWVjUgpGejhMdzR1STJkek15bkQ0ZUU4NDRtbVg4RTdSamduc1psTERmOHRjZVBnaHpydzI0TE1ScXpSRU9OTE5CVlFkCmw1MDJyV1hMR2ljL2pVQVFyY2toVTA1Qk1leDNreDJtb0doVzQ4OVFZWTJTU1dsaEh5RTB5N1A4eVloRTF2ZHMKZVk3SWJEbXZrQjVhWDFyeHBPQkQ5NHlKQnpUdE5NVnMzaTl0Zi9BQ2xQbGpDSCtBZEw4V2tYRzZYMVVFWWV2dAp2cHBHMG1NR0N0WEZnL2pEZkxuZGZQY3A2SlNjK0RBcGFVVndLR0kvQnd5QnBHdG5pU1NOalBVK3hhRVhvZWNmCkJSdEd3dmltcDBPS1pERndwWWgzdkpQV01GUE8rTlVWRVVxcGQ2ZWNsZng1SHhKMU1TRXVIWjEyQlpMNEdhREwKdnFDV0dFOTFoOEcxeEgxb1ZkdUZXWitzdXJIMEZjZHE2bW9nNG4vL09pVlUzWm5pb0dHWEpFWmcyUVplQ01BMgpPR3B5Uk9XVzJUYzVYZWYwL3BoN3lSVXdiQlB3VjhIbVpHVlBXUHB1M1FIbWhPR2t2RHE0SHJhWEorZ3Y4bFpQCkg3SlNISWxDRXAzNnJVanJ6UXdNd3VVQ2JOMWViMW8vQ3BRWEhEbThnV1RFMllIODYzZjV1UzhHNjdIYTQzWWQKK2dHV3lwVjA1VjUvVVVQTDlmQi9hVWk3N2VxUG1qaTJRekFRMWNIZENRYzJ0Y2dXc0tlbU85dWZCcWFmSXlpbAoyM2NFM0p4dlJTRlVPWjJnRkRpYVNaVWgzL2tLQU1aZERIWUZ3U1BOMkdhY1c5ZEI2SEhKWDZQS2YrWXJPcUJ6CjN1RDNoN0crZ2tUS1BjY29wcXBtdW5FR0hZeGZWZjBlN1RRRWVURk1FS2c3VUFMamlLVnZNdU1aV21ML3VieUIKZ0dQWW9yMDgyekhSUE9PajJ6RUNiUERZam5URUxEWUNzakVzMVlFLzMwdTBVRFd3dnBQajd0UDRDeGhYTjRoVwpSYlRDaUJKUjB0ZVZOWGFRemJwMmhSSXJ6YkdhNWZVMC91TG1PTUxhTlpZaEhrQkp6SVRHYU1YdU1tM2hJeHpuClB1anhtazlNaEhJY2t0RDVTNFVpbklyYUZUdVlrUTZOOUlUL0pmeGQ0bHU4SldjUUlsaTZiZjI4SmtYSzZ3TFMKY3kweDdDVWJkbUtsYTUzVnpNeFhQcUsray9xL2MxV3NibU91K1pRTlBHTnBKQ2IzQUlPYVM4V1NHYmljNkY1TAphVmhKb3RveUxtelY5b0J3bzIyQVA2eENlVkVUcERhaFJJTDdHTGczRUFCbTV6VDhqalc2eFZFS0FyalJEb3I3CkR1OFFPWmdhY0JBNWVORVAzY0d1ZUZrc2plSW5aUmVIbEY5M2FDUGhkNTRUTHFmTXNrQ2xKN3FuaVI5UlBKNnkKZUNBSFRGS0ZRQjFCM0lEWElmVnlkZ0UrMWVHYU1yQU5uTG1oc2F4TjFXTUtsN0U5dmRkVkxPczN4UTRrMWxsNwozZWYweTllWnJ6TGl2Y2tSRmdseVI5SWRiRXlVOXdHVktXWlVRWTRtRnZFZ1hpandQN2JsazUrRDgyMHpCemN3Ci8yakw3TGp6dzkwdkV3TFo5My91RVA4cmZQTXVZOXYvQWJIc3JCem9lMFpmNXEyalJUMG81djRxeXVJS0pIakcKZi9xcUs5bTZydmgyY0IzSVJ1QWFmSUlLZDNMYlR3UkdXWlNseFdEY2kvR1NRY3VmNWRFVVNpMFRqdGhXdEx3bApVRGErcGlIQVZmVm5td3hEbUd5QmJjNFJNbWtPa09razB4K2RMVGllb2c4RCt0eExsWWhWNU1ZbjNqU0JTQU9OCitZRTRCaFVTWG1yU0FtUXdmMS83dHl3M2JMb1VvbjRYbmhVVG1uOWtXTUo3Q1VMY0I5RWxoQzRiWG1aTytYTk8KQzVVb0o1ZUxySDRYTW9PU21WbDZ6S2lURVZRUGc1VGhDWUxpZ1V0MFhaRzJ0cUpqd0ZkNHlybW5XcSsxaisyRgpHbEVYejM0aGNiVW5xOFN5elFKVnNVL3JFMml0cDlTQWR4QUgvWVpRQmVJSlFFQ1huMjhEZTJOLzF4N29tZlBZCkcvMDNyemtXcjNxRHJkV1B1cTZoYWgxa1M1NHVDTEFCMnhUYmpyTW1mVEd2cTN4YytPTlpDUVRyU214Y25Pa3oKZStjQUFLc0JoSU1VZyttSkpLd2orUDZKalAxVnBzNmxOOThXbUdxWFB5UTgyUnR6TkZQUlRidVczSjZXd2dkdApLaW5xKy9xOHdKMVpHSWRCWW1vUlM1SUZRYkl1VnNFak9hZGhNY0JaQTExaFAzVUFUS0FlWVdrRXVaQktwSnN1CnAxVTAyTmJvbmlZSG5oRnFHYjFBQWcrNDlHVkNyYmpwVnBvNGx1NjVxYy9Ua0hjYVlIZExnY2dtK0RFbzNQSEwKMnpJclRjQ0IzcEUxU1FzR3Y2M0M5djEwT0xpNW1qNGVwbGNnQ0h0VjF2NTNrK2VXYmlpYmhRVlQ0c0JkZjFqRgpPdDhmVm51Ni9pbTRLMG1QZEJON2tjS3B5MlNRUytYRnlEaHlRK0FieEVWeHF4azIwZ3hmY0lheUNYQjErVE5FCmovMDQ3NXU4YWdwTWIzdk56aTRtR2U0K0d3aUt4ampnZjBTWXp5Tk45Z09EVjVhTVRtTkJYMFpvemZKS3hPM3IKNi9CZ0lYZmx1aFVhVUc0MnAvSUhNOEh6OFpwa2p0WmZJV2tHUi82elZPb25iVUZLa1lLYzJuTjdHaUlnY3RrNgpWSHN3N0NnNG9QbzNqYk1vamp4QUpSQVg0SlBFWEEyZFYvMTBSZkhZNkQ2K0Z2Z3VrRmVFdmdlQXEyMjhHcXNkCmh6S0hYdkc2THNiTkVPY3p2ZnlURFZwVVoxa2Z1SjVuWjlLOGJTeE1yZjhxd0d0c2UwdldzeDd6SDJIZTV2a3AKaGhuWkYzSVZnNWRQMTJ0T1U3cEtIbUZqNHBrVVRSd0JMMzBkUzBjSE1EWGx3eUQweVBmY1U3M25tMVRjN0FRSwo2b21JUWo5OUhDc2dFV3JYUjc4WmFuSTIvOFErSFlPWlcxaEdRZVBtNExtaElsK0hCeUt3dU9RN0hyZVNONDMwCnU4NmxhbWpZei9IeGV3STJ1VTdXYXVIOGs1a09yTkVCYVJkSTh4NVhGL3M5elJLc0NKdlZ2K0g1d0VVdXFSMnkKbzVLNk85dE85anloSTFublp5SXJoZHE4UTFWUTVaQk5DeVFYaE1td2N6cFFwVDJGMHAxSHBHQVFOSHg5cU9DUwpFbTIzaDFpQUROWGRBeXpoZkg0cHlIQmNSWGRrR3BBaVhWUHIzTi9iMGtJS2c3VXkyVkFjYUhMV1cvTWE1cmhwCk5RVUJJRGtUQUdLSVdGdERSbGNWR1RBcUFlaWlFYjFFckpBb0xVc29nTHJzWEZyei9lSDNNQm0rcGkxSnZUcmkKQWVXM3pLZSsxcW9qMWlkanRiems4TjZYTG1ZRjhEMlZZYlliYW5JalNLeHhTRDkvMkFXNWhtNU9pTUZCNkw3YQphQ2QzNzgzZUNKM0NPY3N3TzJtSUFLU2lmK2NtMDN5UWJieU9XMG96RXRYUC9kLzdudW5WcEVIUkpjeXhyb2svCkxnZ09WWlhuR2swOS95LzhIdFZvOUR0MmttWFFtWkIzRjdUeThpRzBhR3ZhaEhqQ0NZU2hTWmxMVGMvalBvN3YKRlp4UmVqVEtxYTZoazF4Sm9rR1IzVjgwRWRhZGhNRVA1ekJvYWl2VmF6VGI5NEtiaHhldzRUME1HaWZ2NngzUgpuSktjc09LYVdSOERyR014OWZDVkF4a1JIR2hSTEQwWm5MSm9DTXc4YjBqWUpuZTFjNXI4Q1dtRytLVk1jK3g1ClFkd3JjTnZ4VkZsbmdFdDQ3UGdMNGkzcEwwZ2o4OXQwa2lGV0c2SmdlTzJobEpCS2xuZ3hYVE52ZW5Dd1JKcUQKWDdNeTZVQllvdU1JV01EZ3BHeHFxMEtaQ2ZPOG5rMm1UU2tpbXNFdFRlKzlMYlh6eVk0QUVJRjVFZGk5NWJkVQpYL091NFhLa1FTY1NBWFpFT2NlbU9RaTRjT1hXMUNjOFd3T0JtTzlmQVBXWElPTjVhM3lucXdlcWZCZWxtVTUxCmxEczlITC8vRHVzMTYrWUR1NTM0MmJmVFpiYzF4K3lzYklzTUIwYW5hUDUvTnNiVE5yUTV5YXR6MWFMSGhiU3AKSFVXYmNXbWdoLzdrMnI0bXZUNld0WCsvLzBubnNIWlNUZ0ExblZNSW9Bei9Sb1FTU2dxNVNpZGE2T3ZrMXBscAo1c3VUdmRhNC8rSGxBME1WYWVHQW1aUFFPTS9VNnpJN25Sb2xyVGkxcm0yV1RoQ1UxalorYXB5RTcyOEhYRTVSCnd5bHVDblU0K3NDbVd2ekQ0bWF6VExIQ0g3cElWbHAySTB5akVmQWFmbWZCQTRCVXlMTUlVRmJtN05BVk5ueU4KMmZXSlJYK3JwRS81WWtrMkR5RVU4blVlcE9xbjBvaS95dTdBV0szOVN6R0R5TVRNSmR5YnpPK0Rneno2MURUYQp5ZGVvSStibzUvZklwWkNMVytKS1orai8wS0dHMENmZkNacWtVdk9wNjVrYjZmRWtBYnZENFNXdThOTWVSWHBBCms0Y0dRbW00cUducWcwYzFhL0h0d0c3VUN4NFRzU0V4SUdRMU5rRllwa3pOWUxJZUFQZ1FJaE12TkRSczROVzAKRk5BTUZEU25TcmJKMTJ5WDlEazZoZEI3c3FQQU55bTZwNXFjYmtvUHhUczZnUlV6aTk1clR3MnJ4UlhCQ3lSdQpScTI0MDBqWlRZQ2tFZWpBUDFNYjdyY2J0ZnJUbTBJTUs2TGZIaXUvZHZheUdUcUMrTkhXYkhQeERidzM3bkJsCldnblNsY0VRckhRdjUvSVpncFBJUDZacFFiWnZmNW1ZdVJTSC9rWDJjbmRPVHAzOEMvM3lJclZuRXNiN3o0VngKSGl6T2dlakttRjdMWU9HN3RsY29NT0NGODVsMyt3cWxWL2xJRlhGTGZTaHMvMzU3UmhvajJRUDVBSkJhZmVyOApiTUFtdDM2dDlmVGkzall4ZXlZSnhCSHF2blJRcU1ESTh5dVJ4emRmQlQ0WEs3L0JyckVmOUNEUGhkTk9tNS9PCldZZ25NY0x2RnJvTkFPK3dIR1JXenhsM29MV3dUVmRvblVaaENEcGJtN0hQY0xISVF6ZkRlakNlUUtZVytwcGYKQ0JhY0p6UEpSUURQQnBBZ2s4MXA4K3A4ZTJTS1QzVHUyYUt1U3BRUHhPTlN6RTk5c2Zla0J3blNFZGt0NElDbQpQK2VIV1lsczJDR0NGS2dEZ1ZOUWFiU21UWTJmalR3SklidGZNdGdLNjJBRjZDTUl4amJBVXV5c1h2V1U1VHpOCjIvdlhaWWN0aTVFSWRhTGdOOVB1ZWNYc0VUVEZqRlp2OW94UkJLVCtLQUFZS2VJVUQyZk1BcnppdDd0VWZGQXIKbzVmM2FPS2RoRVZQT3pjR1AyNnh6YTZySE5BTGYxdldPVktrcmZ4b0w2VGxMUGh6dlZCTStYYVZ3aTNvTlNkUApKd25XNFBUb1dnak94bGFuTkV1MjNrczVCYVFJUXE3MlBJTWVhRDBLTC82UFdyeUdPQlU2ZEFBb0FMZmJWbWdkCnplNFF3OEd6ZWdRQlpqemxlSWY5SFN6emFwRWFNdG1Pc0tndkxuN1RhMlhaWk45Nmt3VTdoTHR5QStGMlBlSkcKUDhUMnR0V2I5VUg5a0ZxZ0lnY1FTWUxWSjdXV0pnT3Jaa2pyaVNpU1NvSW1XbzNWSlZnLzZ5andWNVp3VmNsTAp4Uks1eE1hSHlVdUhJUHp0NjY2SUF6L3JRZ2NETHl1M2ZDTzhqRVBrckRrS1k5M05BSnFWWjJpYThZeFFCVFVYCnlXOElLdlZGbmlyc0NaYUNpWUFFY1FXZkViUURlVHJhNlprSUJlWHNtRWRWNWhza2VaUjhNUzNIeHZDYWxSdFQKa3NHZ09mU3p5cEg5U1lOMCtudWtVcVdGMFBSY2tiakcwaE0xVWdRYlVWNWlDa3hwSmlKWkpRVjBxZk9KaDFLZQpsRkdIdU5YMjd3VzYvQWY1N3ZrdDB0UnVYaGpYdnlvQWE0eVFTVDV2RmpTaHFKK29DTnhadC8ydTFaRDlKZVhvCm5ONEQ5cDJKS3J6YTlWWWREaW00NjZlbEtDS1dGeTdULzhEdERreGFWbmRTRlhoQ2VCZmFNSG5oRURpa1pWYkYKNUlYL2JDZS95SVZJWDc5aGFlYlI1TnVSMTNFUkE1WVM0QS9CSlRQbUl1Y1p0YmxXdUlSNlF5eHBMdUFZY24zUwpTNVgwZUViTXZ2QTdCUEJFQTV2OWZIRndvMzhlQXBzSVNxM2JMUzRiQXA0d05jOHpnWGIyK2FGY1U4SUc1VmkzCmM5YXBpWEF1UWg2bmxVZXJJUmNqdysvNjE1NnVEbG16NjUxZ3ZRQTlsb1hzdWlBL0xMZG9HaFNHRTZiTlFCN0cKMFBJUFlpZWorenduenppaHlYbWpMWDdFUUpWckQwcE15MEM4WXZ6RTZyOEg1UHdwQzRFcUZxSWdBZTcvaHRldQp0bTJ5Nkk5QXBrMDBiWUYzeU9JZzFkNnFORTUrVEJuMWIyRThGcFZEd1FHU1VjZy9LdE1Cc2pJcEY0UWdNMzd3CittQmtMY1c5L25vVXJPS0sya3ZyaFEraUlrZ3ltemJBdmVPZGgvY2xMUGU3TjBiQ1cwSzRNN01XblBnK3p4V2IKM3B1QWx6bGdHY2RRaVFPaDlFekd1dS9xeXd5YlNac09TdVRVbHk3cEpGT0VqM09LdDlQdTY4UTRmeGhBa3FGMQpvUWozZmxnaTNkRGhpeU82SnNPY0h1d3ExYldoaTNrbnI2cHFKbTgwMDFWZ3FhTVFQaU1MbXlwWmF3SUl6YXd3CkxoTVoxaHZaZUxxMlFDV0xuZzRVUjk4cisxUHZjYkJTQUhHQlZXRVY3cHpCSklYdmpEWlg4RG9raDZhQlFlSGIKUVduUm1jNFhqcWFoMkRFRGc5aUdRTk9JSFY0NzFmVDFEck9FRnNXMXZUTEk2VC9lenZxYWRlbkMwaGUxY2g3eApEbTBxVk9maS9NbGhoY0w1VVF5dDBkK0lsNXdDS1h2Rk0yaDNGZTFwM01sTUFwMlJxbHZzK2xUcm1GUkowMDRhCkpLOTd1Qlk2ZmVUL1NHYjVjZUIvR3lCck1mc1NBWWhTaURQY0RwemkvdFMyWksrYzhHczFBK011dXhmcWxQdkcKVzdLZk9WQUxBamNyaWZ2QlErcjEzdTRBSUVDWU5rMVJuYXNHdWU1dGd6dVlLaGpmTGJJTFRkYVBDazFoS2taSgpreVpteThndUtVRFpOMVUxdjhIWEpxdU9aNUpFYnR1SHdLNmU0Zk13Y0NQWmZMcllHUkxRY1dzRjg0akdsQ2c1CmZYdG1XT2huN084emxTS1JJdXhSdTk1bFEwakJoRXh1OFhZMkgxbktZQnlFWjBGem5NVDBsWkJLaytRRkVlVEsKUTFGY2pka1Z2NllaWTFJaU1kamo2eDJseUV5Q3F5RVFQUEYrYlZVVDY3b2RKTUpOTUlPcFRicGRCaHo2K0srMwovTmhzc01SWkhzWnlFYy9MS2JtUVhaYXhTVGpNbnc1c1JjMkVzZjZCdXkvNTRpcWYzZXRaYW9GQXhsVXc1UGZrCnk4cTVvUXFTcGRCZjdUUkpmZDU2dlhNckFqTjJQYUJPdU56cm9heG1FQXNhV3pjVDdRZ1pkTEFDbC9xNFZGN0MKL0l4Y2NkZ2N0cmhSWk1hRmsyQTlvMThJc093QlBMMkhnZUI5K3NhSWY3ZG1KWGpObHNQQjNrRytLUDFxT2VOYwpKbVdLeGtqSWRXWkRGazZIMzFYb3dScCt0ZDhzMG1SQ0QrdEpQMmsrblJVWnBjeXEvNERQaGNzaVFqdzMzKy9yCkR0Q3UwUXJ6MkRMeVVsaDdCUFpVeXluc0lZREh5NG1QakQ4enVFaFU1N25jell1eGdkelFNUHhiMHpROExuRUYKOFN5dnNnPT0KPVdvQWYKLS0tLS1FTkQgUEdQIE1FU1NBR0UtLS0tLQo=", "size": 9170, "mime_type": "application/octet-stream", "filename": "msg.asc" }], "from": { "address": "enigtest@brunschwig.net", "fpr": "35639B7D397A4737F11C6160CA45EF9C1C17AB90", "user_id": "pEp_own_userId", "username": "anonymous", "comm_type": 255, "me": true, "flags": 1 }, "to": [{ "address": "enigtest@brunschwig.net", "fpr": "F871CDB8990483FD6B305B8F319B7AE82E21E970", "user_id": "f827eb96-2f4f-11e7-8fa4-4be0b4159ac2", "username": "Patrick Brunschwig", "comm_type": 56, "lang": "en", "me": false, "flags": 0 }], "opt_fields": [{ "key": "pEp-auto-consume", "value": "yes" }, { "key": "X-pEp-Version", "value": "1.0" }], "enc_format": 3 }; const keySyncMsg = { "jsonrpc": "2.0", "id": 2002, "security_token": "mmhqlMwmlFBwd5NO3UK7jD18FRs7wW0rm5KetnSe", "method": "notifyHandshake", "params": [{ "address": "enigtest@brunschwig.net", "fpr": "7A0D51844B9C06849E3C313F9B299A39D1CCD0BD", "user_id": "pEp_own_userId", "username": "anonymous", "comm_type": 255, "me": false, "flags": 0 }, { "address": "enigtest@brunschwig.net", "fpr": "F871CDB8990483FD6B305B8F319B7AE82E21E970", "user_id": "fcb950d2-3931-11e7-a0bf-97c07b2bb40e", "username": "anonymous", "comm_type": 255, "lang": "en", "me": false, "flags": 0 }, { "sync_handshake_signal": 1 }] }; const CRLF = "\r\n"; var EnigmailPEPKeySync = { notifyHandshake: function(pepParams) { EnigmailLog.DEBUG("pEpMessage.notifyHandshake()\n"); let myId = pepParams[0]; let partnerId = pepParams[1]; let uiLocale = EnigmailLocale.getUILocale().substr(0, 2).toLowerCase(); let useLocale = uiLocale; let supportedLocale = []; EnigmailpEp.getLanguageList().then(function _success(res) { let deferred = PromiseUtils.defer(); EnigmailLog.DEBUG("pEpMessage.notifyHandshake: got language list 1: " + JSON.stringify(res) + "\n"); let localeList = EnigmailpEp.processLanguageList(res); supportedLocale = localeList; for (let i = 0; i < localeList.length; i++) { if (localeList[i].short === uiLocale) { useLocale = localeList[i].short; } } return EnigmailpEp.getTrustWords(myId, partnerId, useLocale, false); }).then(function _displayDialog(data) { // open trustwords dialog if (("result" in data) && typeof data.result === "object" && typeof data.result.outParams[1] === "string") { try { let trustWords = data.result.outParams[1]; let win = getWindows().getBestParentWin(); let inputObj = { supportedLocale: supportedLocale, locale: useLocale, trustWords: trustWords, dialogMode: 1, ownId: myId, otherId: partnerId }; win.openDialog("chrome://enigmail/content/pepTrustWords.xul", "", "dialog,modal,centerscreen", inputObj); } catch (ex) { EnigmailLog.DEBUG("pEpMessage.notifyHandshake: caught exception: " + ex.toString() + "\n"); } } }).catch(function _err(err) { EnigmailLog.DEBUG("pEpMessage.notifyHandshake: caught error: " + JSON.stringify(err) + "\n"); }); }, /** * Convert a pEp message into a regular MIME string * * @param pepMessage: Object - pEp message object * * @return Object: * - data: String - message string * - compFields: nsIMsgCompFields object */ mimeStringFromMessage: function(pepMessage) { EnigmailLog.DEBUG("pEpMessage.mimeStringFromMessage()\n"); let boundary = EnigmailMime.createBoundary(); let msgFormat = "plain"; let now = new Date(); let composeFields = Cc["@mozilla.org/messengercompose/composefields;1"].createInstance(Ci.nsIMsgCompFields); composeFields.characterSet = "UTF-8"; composeFields.messageId = EnigmailRNG.generateRandomString(27) + "-enigmail"; let mimeStr = "Message-Id: " + composeFields.messageId + CRLF; mimeStr += "Date: " + now.toUTCString() + CRLF; if ("enc_format" in pepMessage && pepMessage.enc_format === 3) { msgFormat = "pgpmime"; } if ("from" in pepMessage) { let m = this.createAddress(pepMessage.from); let addr = jsmime.headerparser.parseAddressingHeader(m, false); mimeStr += jsmime.headeremitter.emitStructuredHeader("From", addr, {}); composeFields.from = pepMessage.from.address; } if ("to" in pepMessage) { let m = ""; for (let i of pepMessage.to) { if (m.length > 0) { m += ", "; } m += this.createAddress(i); } let addr = jsmime.headerparser.parseAddressingHeader(m, false); mimeStr += jsmime.headeremitter.emitStructuredHeader("To", addr, {}); composeFields.to = m; } if ("cc" in pepMessage) { let m = ""; for (let i of pepMessage.to) { if (m.length > 0) { m += ", "; } m += this.createAddress(i); } let addr = jsmime.headerparser.parseAddressingHeader(m, false); mimeStr += jsmime.headeremitter.emitStructuredHeader("Cc", addr, {}); composeFields.cc = m; } if ("shortmsg" in pepMessage) { mimeStr += jsmime.headeremitter.emitStructuredHeader("Subject", pepMessage.shortmsg, {}); } if ("opt_fields" in pepMessage) { for (let i of pepMessage.opt_fields) { mimeStr += i.key + ": " + i.value + CRLF; } } if (msgFormat === "pgpmime") { mimeStr += 'Content-Type: multipart/encrypted;' + CRLF + ' protocol="application/pgp-encrypted";' + CRLF + ' boundary="' + boundary + '"' + CRLF; } else if ("attachments" in pepMessage) { msgFormat = "multipart"; mimeStr += 'Content-Type: multipart/mixed;' + CRLF + ' boundary="' + boundary + '"' + CRLF; } else { mimeStr += 'Content-Type: text/plain; charset="UTF-8"' + CRLF; } mimeStr += CRLF; if ("longmsg" in pepMessage && msgFormat !== "multipart") { mimeStr += EnigmailData.convertFromUnicode(pepMessage.longmsg, "utf-8") + CRLF; } if (msgFormat !== "plain") { if ("longmsg" in pepMessage && msgFormat === "multipart") { mimeStr += "--" + boundary + CRLF; mimeStr += 'Content-Type: text/plain; charset="UTF-8"' + CRLF + CRLF; mimeStr += EnigmailData.convertFromUnicode(pepMessage.longmsg, "utf-8") + CRLF; } if ("attachments" in pepMessage) { for (let att of pepMessage.attachments) { mimeStr += "--" + boundary + CRLF; mimeStr += "Content-Type: " + att.mime_type; if ("filename" in att) { att.filename = att.filename.replace(/^file:\/\//i, ""); mimeStr += '; name="' + att.filename + '"'; } mimeStr += CRLF + "Content-Transfer-Encoding: base64" + CRLF + CRLF; mimeStr += att.value.replace(/(.{72})/g, "$1\r\n") + CRLF; } } mimeStr += "--" + boundary + "--" + CRLF; } return { data: mimeStr, compFields: composeFields }; }, createAddress: function(pepUserId) { let m = ""; if ("username" in pepUserId) { m = pepUserId.username + " "; } m += "<" + pepUserId.address + ">"; return m; }, sendMessage: function(pepMessage, listener = null) { EnigmailLog.DEBUG("pEpMessage.sendMessage()\n"); let msg = this.mimeStringFromMessage(pepMessage); return EnigmailSend.sendMessage(msg.data, msg.compFields, listener); }, getTestMessage: function() { return testMessage; }, getTestKeySync: function() { return keySyncMsg; } }; enigmail-2.0.8/package/pEpListener.jsm000066400000000000000000000142761334302754500176660ustar00rootroot00000000000000/*global Components: false */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ /** * This module serves to integrate pEp into Enigmail * * The module is still a prototype - not ready for daily use! */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailpEpListener"]; const Cu = Components.utils; const Cc = Components.classes; const Ci = Components.interfaces; const MIN_PORT_NUM = 15900; const MAX_PORT_NUM = 15991; Cu.import("resource://gre/modules/XPCOMUtils.jsm"); /*global XPCOMUtils: false */ Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ Cu.import("resource://enigmail/data.jsm"); /*global EnigmailData: false */ const HTTP_OK = "200"; const HTTP_ERR_BAD_REQUEST = "400"; const HTTP_ERR_UNAUTHORIZED = "401"; const HTTP_ERR_INTERNAL_ERROR = "500"; const HTTP_ERR_NOT_IMPLEMENTED = "501"; function PepListener(callBackFunction, securityToken) { this.callBackFunction = callBackFunction; this.securityToken = securityToken; } function getHttpBody(req) { let i = req.search(/\r?\n\r?\n/); if (i > 0) { ++i; return req.substr(i); } return req; } /** * Create a HTTP resonse to send back */ function createHttpResponse(statusCode, messageData) { let dt = new Date(); let retObj; let statusMsg; if (statusCode === HTTP_OK) { retObj = { jsonrpc: "2.0", result: { outParams: [], return: { status: 0, hex: "PEP_STATUS_OK" } }, id: messageData }; statusMsg = "OK"; } else { retObj = { jsonrpc: "2.0", error: { code: -statusCode, message: messageData } }; statusMsg = messageData; } let data = JSON.stringify(retObj); let msg = "HTTP/1.1 " + statusCode + " " + statusMsg + "\r\n" + "Content-Type: text/plain\r\n" + "Date: " + dt.toUTCString() + "\r\n" + "Content-Length: " + (data.length + 2) + "\r\n\r\n" + data + "\r\n"; return msg; } PepListener.prototype = { QueryInterface: XPCOMUtils.generateQI([Ci.nsIServerSocketListener]), reader: { self: null, onInputStreamReady: function(input) { let sin = Cc["@mozilla.org/scriptableinputstream;1"].createInstance(Ci.nsIScriptableInputStream); sin.init(input); let requestData = ""; try { while (sin.available()) { requestData += sin.read(512); } } catch (ex) { EnigmailLog.DEBUG("pEpListener.onInputStreamReady: input stream closed\n"); return; } EnigmailLog.DEBUG("pEpListener.onInputStreamReady: got data '" + requestData + "'\n"); let responseData = this.self.handleHttpRequest(requestData); EnigmailLog.DEBUG("pEpListener.onInputStreamReady: sending response '" + responseData + "'\n"); this.self.output.write(responseData, responseData.length); this.self.output.flush(); let tm = Cc["@mozilla.org/thread-manager;1"].getService(); input.asyncWait(this.self.reader, 0, 0, tm.mainThread); } }, onSocketAccepted: function(serverSocket, clientSocket) { EnigmailLog.DEBUG("pEpListener.onSocketAccepted: New connection on " + serverSocket.port + "\n"); this.clientSocket = clientSocket; this.serverSocket = serverSocket; this.input = clientSocket.openInputStream(0, 0, 0).QueryInterface(Ci.nsIAsyncInputStream); this.output = clientSocket.openOutputStream(Ci.nsITransport.OPEN_BLOCKING, 0, 0); this.reader.self = this; let tm = Cc["@mozilla.org/thread-manager;1"].getService(); this.input.asyncWait(this.reader, 0, 0, tm.mainThread); }, onStopListening: function(serverSocket, status) { EnigmailLog.DEBUG("pEpListener.onStopListening: Closing connection on " + serverSocket.port + "\n"); }, /** * handle a HTTP request and return the HTTP response message string * * @param requestData - String: HTTP request * * @return String: HTTP response */ handleHttpRequest: function(requestData) { let responseData = ""; let obj; if (requestData.search(/^POST/i) === 0) { requestData = getHttpBody(requestData); requestData = EnigmailData.convertToUnicode(requestData, "utf-8"); try { obj = JSON.parse(requestData); } catch (ex) { return createHttpResponse(HTTP_ERR_BAD_REQUEST, "Bad request: no proper JSON object."); } try { let tok = this.securityToken; if ("security_token" in obj && obj.security_token === this.securityToken) { let msgId = 1; if ("id" in obj) { msgId = obj.id; } if (this.callBackFunction) { let r = this.callBackFunction(obj); if (r === 0) { return createHttpResponse(HTTP_OK, msgId); } return createHttpResponse(HTTP_ERR_NOT_IMPLEMENTED, "Method not implemented."); } return createHttpResponse(HTTP_OK, msgId); } else { return createHttpResponse(HTTP_ERR_UNAUTHORIZED, "Wrong security token."); } } catch (ex) { EnigmailLog.writeException("pEpListener.handleHttpRequest", ex); return createHttpResponse(HTTP_ERR_INTERNAL_ERROR, "Internal exception."); } } return createHttpResponse(HTTP_ERR_BAD_REQUEST, "Bad request: unsupported HTTP method."); } }; var EnigmailpEpListener = { /** * returns port number or -1 in case of failure */ createListener: function(callBackFunction, securityToken) { let serverSocket = Cc["@mozilla.org/network/server-socket;1"].createInstance(Ci.nsIServerSocket); let portNum = MIN_PORT_NUM; while (portNum < MAX_PORT_NUM) { try { serverSocket.init(portNum, true, -1); let l = new PepListener(callBackFunction, securityToken); serverSocket.asyncListen(l); EnigmailLog.DEBUG("pEpListener.createListener: Listening on port " + portNum + "\n"); return portNum; } catch (ex) { if (ex.name === "NS_ERROR_SOCKET_ADDRESS_IN_USE") { ++portNum; } else portNum = MAX_PORT_NUM + 1; } } return -1; } }; enigmail-2.0.8/package/passwordCheck.jsm000066400000000000000000000230411334302754500202220ustar00rootroot00000000000000/*jshint -W097 */ /* Taken from jquery.complexify (WTFPL 2.0) */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailPasswordCheck"]; var EnigmailPasswordCheck = { /** * Check password quality * * password: String: the password to evaluate * * return: object: valid: Boolean - is password valid or not * complexity: Number - complexity of password (values between 0 and 100) */ checkQuality: function(password) { return evaluateSecurity(password); } }; /********* Helper functions and variables */ const COMPLEXIFY_BANLIST = '123456|password|12345678|1234|pussy|12345|dragon|qwerty|696969|mustang|letmein|baseball|master|michael|football|shadow|monkey|abc123|pass|fuckme|6969|jordan|harley|ranger|iwantu|jennifer|hunter|fuck|2000|test|batman|trustno1|thomas|tigger|robert|access|love|buster|1234567|soccer|hockey|killer|george|sexy|andrew|charlie|superman|asshole|fuckyou|dallas|jessica|panties|pepper|1111|austin|william|daniel|golfer|summer|heather|hammer|yankees|joshua|maggie|biteme|enter|ashley|thunder|cowboy|silver|richard|fucker|orange|merlin|michelle|corvette|bigdog|cheese|matthew|121212|patrick|martin|freedom|ginger|blowjob|nicole|sparky|yellow|camaro|secret|dick|falcon|taylor|111111|131313|123123|bitch|hello|scooter|please|porsche|guitar|chelsea|black|diamond|nascar|jackson|cameron|654321|computer|amanda|wizard|xxxxxxxx|money|phoenix|mickey|bailey|knight|iceman|tigers|purple|andrea|horny|dakota|aaaaaa|player|sunshine|morgan|starwars|boomer|cowboys|edward|charles|girls|booboo|coffee|xxxxxx|bulldog|ncc1701|rabbit|peanut|john|johnny|gandalf|spanky|winter|brandy|compaq|carlos|tennis|james|mike|brandon|fender|anthony|blowme|ferrari|cookie|chicken|maverick|chicago|joseph|diablo|sexsex|hardcore|666666|willie|welcome|chris|panther|yamaha|justin|banana|driver|marine|angels|fishing|david|maddog|hooters|wilson|butthead|dennis|fucking|captain|bigdick|chester|smokey|xavier|steven|viking|snoopy|blue|eagles|winner|samantha|house|miller|flower|jack|firebird|butter|united|turtle|steelers|tiffany|zxcvbn|tomcat|golf|bond007|bear|tiger|doctor|gateway|gators|angel|junior|thx1138|porno|badboy|debbie|spider|melissa|booger|1212|flyers|fish|porn|matrix|teens|scooby|jason|walter|cumshot|boston|braves|yankee|lover|barney|victor|tucker|princess|mercedes|5150|doggie|' + 'zzzzzz|gunner|horney|bubba|2112|fred|johnson|xxxxx|tits|member|boobs|donald|bigdaddy|bronco|penis|voyager|rangers|birdie|trouble|white|topgun|bigtits|bitches|green|super|qazwsx|magic|lakers|rachel|slayer|scott|2222|asdf|video|london|7777|marlboro|srinivas|internet|action|carter|jasper|monster|teresa|jeremy|11111111|bill|crystal|peter|pussies|cock|beer|rocket|theman|oliver|prince|beach|amateur|7777777|muffin|redsox|star|testing|shannon|murphy|frank|hannah|dave|eagle1|11111|mother|nathan|raiders|steve|forever|angela|viper|ou812|jake|lovers|suckit|gregory|buddy|whatever|young|nicholas|lucky|helpme|jackie|monica|midnight|college|baby|cunt|brian|mark|startrek|sierra|leather|232323|4444|beavis|bigcock|happy|sophie|ladies|naughty|giants|booty|blonde|fucked|golden|0|fire|sandra|pookie|packers|einstein|dolphins|chevy|winston|warrior|sammy|slut|8675309|zxcvbnm|nipples|power|victoria|asdfgh|vagina|toyota|travis|hotdog|paris|rock|xxxx|extreme|redskins|erotic|dirty|ford|freddy|arsenal|access14|wolf|nipple|iloveyou|alex|florida|eric|legend|movie|success|rosebud|jaguar|great|cool|cooper|1313|scorpio|mountain|madison|987654|brazil|lauren|japan|naked|squirt|stars|apple|alexis|aaaa|bonnie|peaches|jasmine|kevin|matt|qwertyui|danielle|beaver|4321|4128|runner|swimming|dolphin|gordon|casper|stupid|shit|saturn|gemini|apples|august|3333|canada|blazer|cumming|hunting|kitty|rainbow|112233|arthur|cream|calvin|shaved|surfer|samson|kelly|paul|mine|king|racing|5555|eagle|hentai|newyork|little|redwings|smith|sticky|cocacola|animal|broncos|private|skippy|marvin|blondes|enjoy|girl|apollo|parker|qwert|time|sydney|women|voodoo|magnum|juice|abgrtyu|777777|dreams|maxwell|music|rush2112|russia|scorpion|rebecca|tester|mistress|phantom|billy|6666|albert|111111|11111111|112233|' + '121212|123123|123456|1234567|12345678|131313|232323|654321|666666|696969|777777|7777777|8675309|987654|abcdef|password1|password12|password123|twitter'.split('|'); const options = { minimumChars: 8, strengthScaleFactor: 1, bannedPasswords: COMPLEXIFY_BANLIST, banMode: 'strict' // (strict|loose) }; const MIN_COMPLEXITY = 30; // 8 chars with Upper, Lower and Number //var MAX_COMPLEXITY = 120; // 25 chars, all charsets const MAX_COMPLEXITY = 60; const CHARSETS = [ // Commonly Used //////////////////// [0x0020, 0x0020], // Space [0x0030, 0x0039], // Numbers [0x0041, 0x005A], // Uppercase [0x0061, 0x007A], // Lowercase [0x0021, 0x002F], // Punctuation [0x003A, 0x0040], // Punctuation [0x005B, 0x0060], // Punctuation [0x007B, 0x007E], // Punctuation // Everything Else //////////////////// [0x0080, 0x00FF], // Latin-1 Supplement [0x0100, 0x017F], // Latin Extended-A [0x0180, 0x024F], // Latin Extended-B [0x0250, 0x02AF], // IPA Extensions [0x02B0, 0x02FF], // Spacing Modifier Letters [0x0300, 0x036F], // Combining Diacritical Marks [0x0370, 0x03FF], // Greek [0x0400, 0x04FF], // Cyrillic [0x0530, 0x058F], // Armenian [0x0590, 0x05FF], // Hebrew [0x0600, 0x06FF], // Arabic [0x0700, 0x074F], // Syriac [0x0780, 0x07BF], // Thaana [0x0900, 0x097F], // Devanagari [0x0980, 0x09FF], // Bengali [0x0A00, 0x0A7F], // Gurmukhi [0x0A80, 0x0AFF], // Gujarati [0x0B00, 0x0B7F], // Oriya [0x0B80, 0x0BFF], // Tamil [0x0C00, 0x0C7F], // Telugu [0x0C80, 0x0CFF], // Kannada [0x0D00, 0x0D7F], // Malayalam [0x0D80, 0x0DFF], // Sinhala [0x0E00, 0x0E7F], // Thai [0x0E80, 0x0EFF], // Lao [0x0F00, 0x0FFF], // Tibetan [0x1000, 0x109F], // Myanmar [0x10A0, 0x10FF], // Georgian [0x1100, 0x11FF], // Hangul Jamo [0x1200, 0x137F], // Ethiopic [0x13A0, 0x13FF], // Cherokee [0x1400, 0x167F], // Unified Canadian Aboriginal Syllabics [0x1680, 0x169F], // Ogham [0x16A0, 0x16FF], // Runic [0x1780, 0x17FF], // Khmer [0x1800, 0x18AF], // Mongolian [0x1E00, 0x1EFF], // Latin Extended Additional [0x1F00, 0x1FFF], // Greek Extended [0x2000, 0x206F], // General Punctuation [0x2070, 0x209F], // Superscripts and Subscripts [0x20A0, 0x20CF], // Currency Symbols [0x20D0, 0x20FF], // Combining Marks for Symbols [0x2100, 0x214F], // Letterlike Symbols [0x2150, 0x218F], // Number Forms [0x2190, 0x21FF], // Arrows [0x2200, 0x22FF], // Mathematical Operators [0x2300, 0x23FF], // Miscellaneous Technical [0x2400, 0x243F], // Control Pictures [0x2440, 0x245F], // Optical Character Recognition [0x2460, 0x24FF], // Enclosed Alphanumerics [0x2500, 0x257F], // Box Drawing [0x2580, 0x259F], // Block Elements [0x25A0, 0x25FF], // Geometric Shapes [0x2600, 0x26FF], // Miscellaneous Symbols [0x2700, 0x27BF], // Dingbats [0x2800, 0x28FF], // Braille Patterns [0x2E80, 0x2EFF], // CJK Radicals Supplement [0x2F00, 0x2FDF], // Kangxi Radicals [0x2FF0, 0x2FFF], // Ideographic Description Characters [0x3000, 0x303F], // CJK Symbols and Punctuation [0x3040, 0x309F], // Hiragana [0x30A0, 0x30FF], // Katakana [0x3100, 0x312F], // Bopomofo [0x3130, 0x318F], // Hangul Compatibility Jamo [0x3190, 0x319F], // Kanbun [0x31A0, 0x31BF], // Bopomofo Extended [0x3200, 0x32FF], // Enclosed CJK Letters and Months [0x3300, 0x33FF], // CJK Compatibility [0x3400, 0x4DB5], // CJK Unified Ideographs Extension A [0x4E00, 0x9FFF], // CJK Unified Ideographs [0xA000, 0xA48F], // Yi Syllables [0xA490, 0xA4CF], // Yi Radicals [0xAC00, 0xD7A3], // Hangul Syllables [0xD800, 0xDB7F], // High Surrogates [0xDB80, 0xDBFF], // High Private Use Surrogates [0xDC00, 0xDFFF], // Low Surrogates [0xE000, 0xF8FF], // Private Use [0xF900, 0xFAFF], // CJK Compatibility Ideographs [0xFB00, 0xFB4F], // Alphabetic Presentation Forms [0xFB50, 0xFDFF], // Arabic Presentation Forms-A [0xFE20, 0xFE2F], // Combining Half Marks [0xFE30, 0xFE4F], // CJK Compatibility Forms [0xFE50, 0xFE6F], // Small Form Variants [0xFE70, 0xFEFE], // Arabic Presentation Forms-B [0xFEFF, 0xFEFF], // Specials [0xFF00, 0xFFEF], // Halfwidth and Fullwidth Forms [0xFFF0, 0xFFFD] // Specials ]; function additionalComplexityForCharset(str, charset) { for (var i = str.length - 1; i >= 0; i--) { if (charset[0] <= str.charCodeAt(i) && str.charCodeAt(i) <= charset[1]) { return charset[1] - charset[0] + 1; } } return 0; } function inBanlist(str) { if (options.banMode === 'strict') { for (var i = 0; i < options.bannedPasswords.length; i++) { if (options.bannedPasswords[i].indexOf(str) !== -1) { return true; } } return false; } else { return (options.bannedPasswords.indexOf(str) > -1 ? true : false); } } function evaluateSecurity(password) { var complexity = 0, valid = false; // Reset complexity to 0 when banned password is found if (!inBanlist(password)) { // Add character complexity for (var i = CHARSETS.length - 1; i >= 0; i--) { complexity += additionalComplexityForCharset(password, CHARSETS[i]); } } else { complexity = 1; } // Use natural log to produce linear scale complexity = Math.log(Math.pow(complexity, password.length)) * (1 / options.strengthScaleFactor); valid = (complexity > MIN_COMPLEXITY && password.length >= options.minimumChars); // Scale to percentage, so it can be used for a progress bar complexity = (complexity / MAX_COMPLEXITY) * 100; complexity = (complexity > 100) ? 100 : complexity; return { valid: valid, complexity: complexity }; } enigmail-2.0.8/package/passwords.jsm000066400000000000000000000042531334302754500174530ustar00rootroot00000000000000/*global Components: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailPassword"]; const Cu = Components.utils; Cu.import("resource://enigmail/lazy.jsm"); /*global EnigmailLazy: false */ Cu.import("resource://enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ Cu.import("resource://enigmail/core.jsm"); /*global EnigmailCore: false */ Cu.import("resource://enigmail/subprocess.jsm"); /*global subprocess: false */ const gpgAgent = EnigmailLazy.loader("enigmail/gpgAgent.jsm", "EnigmailGpgAgent"); const getDialog = EnigmailLazy.loader("enigmail/dialog.jsm", "EnigmailDialog"); const getLocale = EnigmailLazy.loader("enigmail/locale.jsm", "EnigmailLocale"); var EnigmailPassword = { /* * Get GnuPG command line options for receiving the password depending * on the various user and system settings (gpg-agent/no passphrase) * * @return: Array the GnuPG command line options */ command: function() { return ["--use-agent"]; }, getMaxIdleMinutes: function() { try { return EnigmailPrefs.getPref("maxIdleMinutes"); } catch (ex) {} return 5; }, clearPassphrase: function(win) { // clear all passphrases from gpg-agent by reloading the config if (!EnigmailCore.getService()) return; let exitCode = -1; let isError = 0; const proc = { command: gpgAgent().connGpgAgentPath, arguments: [], charset: null, environment: EnigmailCore.getEnvList(), stdin: function(pipe) { pipe.write("RELOADAGENT\n"); pipe.write("/bye\n"); pipe.close(); }, stdout: function(data) { if (data.search(/^ERR/m) >= 0) { ++isError; } } }; try { exitCode = subprocess.call(proc).wait(); } catch (ex) {} if (isError === 0) { getDialog().alert(win, getLocale().getString("passphraseCleared")); } else { getDialog().alert(win, getLocale().getString("cannotClearPassphrase")); } } }; enigmail-2.0.8/package/persistentCrypto.jsm000066400000000000000000001344731334302754500210370ustar00rootroot00000000000000/*global Components: false*/ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailPersistentCrypto"]; const Cu = Components.utils; Cu.import("resource://enigmail/lazy.jsm"); /*global EnigmailLazy: false */ Cu.import("resource://gre/modules/AddonManager.jsm"); /*global AddonManager: false */ Cu.import("resource://gre/modules/XPCOMUtils.jsm"); /*global XPCOMUtils: false */ Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ Cu.import("resource://enigmail/armor.jsm"); /*global EnigmailArmor: false */ Cu.import("resource://enigmail/locale.jsm"); /*global EnigmailLocale: false */ Cu.import("resource://enigmail/execution.jsm"); /*global EnigmailExecution: false */ Cu.import("resource://enigmail/glodaUtils.jsm"); /*global GlodaUtils: false */ Cu.import("resource:///modules/MailUtils.js"); /*global MailUtils: false */ Cu.import("resource://enigmail/core.jsm"); /*global EnigmailCore: false */ Cu.import("resource://enigmail/gpg.jsm"); /*global EnigmailGpg: false */ Cu.import("resource://enigmail/streams.jsm"); /*global EnigmailStreams: false */ Cu.import("resource://enigmail/passwords.jsm"); /*global EnigmailPassword: false */ Cu.import("resource://enigmail/mime.jsm"); /*global EnigmailMime: false */ Cu.import("resource://enigmail/data.jsm"); /*global EnigmailData: false */ Cu.import("resource://enigmail/attachment.jsm"); /*global EnigmailAttachment: false */ Cu.import("resource://enigmail/timer.jsm"); /*global EnigmailTimer: false */ Cu.import("resource://enigmail/constants.jsm"); /*global EnigmailConstants: false */ Cu.import("resource:///modules/jsmime.jsm"); /*global jsmime: false*/ Cu.import("resource://enigmail/stdlib.jsm"); /*global EnigmailStdlib: false*/ Cu.import("resource://enigmail/encryption.jsm"); /*global EnigmailEncryption: false*/ Cu.import("resource://gre/modules/NetUtil.jsm"); /*global NetUtil: false*/ /*global MimeBody: false, MimeUnknown: false, MimeMessageAttachment: false */ /*global msgHdrToMimeMessage: false, MimeMessage: false, MimeContainer: false */ Cu.import("resource://enigmail/glodaMime.jsm"); const getGpgAgent = EnigmailLazy.loader("enigmail/gpgAgent.jsm", "EnigmailGpgAgent"); const getDecryption = EnigmailLazy.loader("enigmail/decryption.jsm", "EnigmailDecryption"); const getDialog = EnigmailLazy.loader("enigmail/dialog.jsm", "EnigmailDialog"); const Cc = Components.classes; const Ci = Components.interfaces; const STATUS_OK = 0; const STATUS_FAILURE = 1; const STATUS_NOT_REQUIRED = 2; const IOSERVICE_CONTRACTID = "@mozilla.org/network/io-service;1"; /* * Decrypt a message and copy it to a folder * * @param nsIMsgDBHdr hdr Header of the message * @param String destFolder Folder URI * @param Boolean move If true the original message will be deleted * * @return a Promise that we do that */ var EnigmailPersistentCrypto = { /*** * dispatchMessages * * Because Thunderbird throws all messages at once at us thus we have to rate limit the dispatching * of the message processing. Because there is only a negligible performance gain when dispatching * several message at once we serialize to not overwhelm low power devices. * * If targetFolder is null the message will be copied / moved in the same folder as the original * message. * * If targetKey is not null the message will be encrypted again to the targetKey. * * The function is implemented asynchronously. * * Parameters * aMsgHdrs: Array of nsIMsgDBHdr * targetFolder: String; target folder URI or null * copyListener: listener for async request (nsIMsgCopyServiceListener) * move: Boolean: type of action; true = "move" / false = "copy" * targetKey: KeyObject of target key if encryption is requested * **/ dispatchMessages: function(aMsgHdrs, targetFolder, copyListener, move, targetKey) { EnigmailLog.DEBUG("persistentCrypto.jsm: dispatchMessages()\n"); if (copyListener) { copyListener.OnStartCopy(); } let promise = EnigmailPersistentCrypto.cryptMessage(aMsgHdrs[0], targetFolder, move, targetKey); var processNext = function(data) { aMsgHdrs.splice(0, 1); if (aMsgHdrs.length > 0) { EnigmailPersistentCrypto.dispatchMessages(aMsgHdrs, targetFolder, copyListener, move, targetKey); } else { // last message was finished processing if (copyListener) { copyListener.OnStopCopy(0); } EnigmailLog.DEBUG("persistentCrypto.jsm: dispatchMessages - DONE\n"); } }; promise.then(processNext); promise.catch(function(err) { processNext(null); }); }, /*** * cryptMessage * * Decrypts a message. If targetKey is not null it * encrypts a message to the target key afterwards. * * Parameters * hdr: nsIMsgDBHdr of the message to encrypt * destFolder: String; target folder URI * move: Boolean: type of action; true = "move" / false = "copy" * targetKey: KeyObject of target key if encryption is requested **/ cryptMessage: function(hdr, destFolder, move, targetKey) { return new Promise( function(resolve, reject) { let msgUriSpec = hdr.folder.getUriForMsg(hdr); const msgSvc = Cc["@mozilla.org/messenger;1"].createInstance(Ci.nsIMessenger).messageServiceFromURI(msgUriSpec); const crypt = new CryptMessageIntoFolder(destFolder, move, resolve, targetKey); try { msgHdrToMimeMessage(hdr, crypt, crypt.messageParseCallback, true, { examineEncryptedParts: false, partsOnDemand: false }); } catch (ex) { reject("msgHdrToMimeMessage failed"); } return; } ); } }; function CryptMessageIntoFolder(destFolder, move, resolve, targetKey) { this.destFolder = destFolder; this.move = move; this.resolve = resolve; this.targetKey = targetKey; this.foundPGP = 0; this.mime = null; this.hdr = null; this.decryptionTasks = []; this.subject = ""; } CryptMessageIntoFolder.prototype = { messageParseCallback: function(hdr, mime) { this.hdr = hdr; this.mime = mime; var self = this; try { if (!mime) { this.resolve(true); return; } if (!("content-type" in mime.headers)) { mime.headers["content-type"] = ["text/plain"]; } var ct = getContentType(getHeaderValue(mime, 'content-type')); var pt = getProtocol(getHeaderValue(mime, 'content-type')); this.subject = GlodaUtils.deMime(getHeaderValue(mime, 'subject')); if (!ct) { this.resolve(true); return; } this.walkMimeTree(this.mime, this.mime); this.decryptINLINE(this.mime); if (this.foundPGP < 0) { // decryption failed this.resolve(true); return; } for (let i in this.mime.allAttachments) { let a = this.mime.allAttachments[i]; let suffixIndexEnd = a.name.toLowerCase().lastIndexOf('.pgp'); if (suffixIndexEnd < 0) { suffixIndexEnd = a.name.toLowerCase().lastIndexOf('.asc'); } if (suffixIndexEnd > 0 && a.contentType.search(/application\/pgp-signature/i) < 0) { // possible OpenPGP attachment let p = self.decryptAttachment(a, a.name.substring(0, suffixIndexEnd)); this.decryptionTasks.push(p); } else { let p = this.readAttachment(a); this.decryptionTasks.push(p); } } Promise.all(this.decryptionTasks).then( function(tasks) { self.allTasks = tasks; for (let a in tasks) { switch (tasks[a].status) { case STATUS_NOT_REQUIRED: tasks[a].name = tasks[a].origName; break; case STATUS_OK: ++self.foundPGP; break; case STATUS_FAILURE: // attachment did not decrypt successfully self.resolve(true); return; default: // no valid result?! tasks[a].name = tasks[a].origName; } } if (self.foundPGP === 0 && !self.targetKey) { self.resolve(true); return; } // No dest folder. Let's use the same folder. if (!self.destFolder) { // We need to use the URI and not the folderURL folderURL // would work for IMAP but fail for Local Folders. self.destFolder = hdr.folder.URI; } let rfc822Headers; if (self.targetKey) { // If we encrypt we don't want to include all headers // int the encrypted message. So we only pass // content headers and store the rest. rfc822Headers = mime.headers; var contentHeaders = []; contentHeaders["content-type"] = getHeaderValue(self.mime, 'content-type'); contentHeaders["content-transfer-encoding"] = getHeaderValue(self.mime, 'content-transfer-encoding'); contentHeaders["content-disposition"] = getHeaderValue(self.mime, 'content-disposition'); self.mime.headers = contentHeaders; } // Build the new message let msg = ""; if (self.foundPGP) { // A decrypted message msg = self.mimeToString(self.mime, true); } else { // Not found pgp. Copy the msg for encryption // we avoid mimeToString as mimeToString is not // really a direct conversion but has awareness of // crypto tasks and will not work properly for messages // that are not encrypted. EnigmailLog.DEBUG("persistentCrypto.jsm: did not find encryption. Using original.\n"); var folder = hdr.folder; var stream = folder.getMsgInputStream(hdr, {}); var messageSize = folder.hasMsgOffline(hdr.messageKey) ? hdr.offlineMessageSize : hdr.messageSize; var scriptInput = Components.classes["@mozilla.org/scriptableinputstream;1"].createInstance(); try { msg = NetUtil.readInputStreamToString(stream, messageSize); } catch (ex) { EnigmailLog.DEBUG("persistentCrypto.jsm: failed to get plain data: " + ex + "\n"); // Uhm,.. What to do? Ok let's give mimeToString a chance. msg = self.mimeToString(self.mime, true); } stream.close(); } if (!msg || msg === "") { // no message data found self.resolve(true); return; } // Encrypt the message if a target key is given. if (self.targetKey) { msg = self.encryptToKey(rfc822Headers, msg); if (!msg) { // do nothing (still better than destroying the message) self.resolve(true); return; } } //XXX Do we wanna use the tmp for this? var tempFile = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIProperties).get("TmpD", Ci.nsIFile); tempFile.append("message.eml"); tempFile.createUnique(0, 384); // == 0600, octal is deprecated // ensure that file gets deleted on exit, if something goes wrong ... var extAppLauncher = Cc["@mozilla.org/mime;1"].getService(Ci.nsPIExternalAppLauncher); var foStream = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream); foStream.init(tempFile, 2, 0x200, false); // open as "write only" foStream.write(msg, msg.length); foStream.close(); extAppLauncher.deleteTemporaryFileOnExit(tempFile); // // This was taken from the HeaderToolsLite Example Addon "original by Frank DiLecce" // // this is interesting: nsIMsgFolder.copyFileMessage seems to have a bug on Windows, when // the nsIFile has been already used by foStream (because of Windows lock system?), so we // must initialize another nsIFile object, pointing to the temporary file var fileSpec = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile); fileSpec.initWithPath(tempFile.path); const copySvc = Cc["@mozilla.org/messenger/messagecopyservice;1"].getService(Ci.nsIMsgCopyService); var copyListener = { QueryInterface: function(iid) { if (iid.equals(Ci.nsIMsgCopyServiceListener) || iid.equals(Ci.nsISupports)) { return this; } EnigmailLog.DEBUG("persistentCrypto.jsm: copyListener error\n"); throw Components.results.NS_NOINTERFACE; }, GetMessageId: function(messageId) {}, OnProgress: function(progress, progressMax) {}, OnStartCopy: function() { EnigmailLog.DEBUG("persistentCrypto.jsm: copyListener: OnStartCopy()\n"); }, SetMessageKey: function(key) { EnigmailLog.DEBUG("persistentCrypto.jsm: copyListener: SetMessageKey(" + key + ")\n"); }, OnStopCopy: function(statusCode) { EnigmailLog.DEBUG("persistentCrypto.jsm: copyListener: OnStopCopy()\n"); if (statusCode !== 0) { EnigmailLog.DEBUG("persistentCrypto.jsm: Error copying message: " + statusCode + "\n"); try { tempFile.remove(false); } catch (ex) { try { fileSpec.remove(false); } catch (e2) { EnigmailLog.DEBUG("persistentCrypto.jsm: Could not delete temp file\n"); } } self.resolve(true); return; } EnigmailLog.DEBUG("persistentCrypto.jsm: Copy complete\n"); if (self.move) { deleteOriginalMail(self.hdr); } try { tempFile.remove(false); } catch (ex) { try { fileSpec.remove(false); } catch (e2) { EnigmailLog.DEBUG("persistentCrypto.jsm: Could not delete temp file\n"); } } EnigmailLog.DEBUG("persistentCrypto.jsm: Cave Johnson. We're done\n"); self.resolve(true); } }; EnigmailLog.DEBUG("persistentCrypto.jsm: copySvc ready for copy\n"); try { if (self.mime.headers.subject) { self.hdr.subject = self.mime.headers.subject.join(); } } catch (ex) {} copySvc.CopyFileMessage(fileSpec, MailUtils.getFolderForURI(self.destFolder, false), self.hdr, false, 0, "", copyListener, null); } ).catch( function catchErr(errorMsg) { EnigmailLog.DEBUG("persistentCrypto.jsm: Promise.catchErr: " + errorMsg + "\n"); self.resolve(false); } ); } catch (ex) { EnigmailLog.DEBUG("persistentCrypto.jsm: messageParseCallback: caught error " + ex.toString() + "\n"); self.resolve(false); } }, encryptToKey: function(rfc822Headers, inputMsg) { let exitCodeObj = {}; let statusFlagsObj = {}; let errorMsgObj = {}; EnigmailLog.DEBUG("persistentCrypto.jsm: Encrypting message.\n"); let encmsg = ""; try { encmsg = EnigmailEncryption.encryptMessage(null, 0, inputMsg, "0x" + this.targetKey.fpr, "0x" + this.targetKey.fpr, "", EnigmailConstants.SEND_ENCRYPTED | EnigmailConstants.SEND_ALWAYS_TRUST, exitCodeObj, statusFlagsObj, errorMsgObj ); } catch (ex) { EnigmailLog.DEBUG("persistentCrypto.jsm: Encryption failed: " + ex + "\n"); return null; } // Build the pgp-encrypted mime structure let msg = ""; // First the original headers for (let header in rfc822Headers) { if (header != "content-type" && header != "content-transfer-encoding" && header != "content-disposition") { msg += prettyPrintHeader(header, rfc822Headers[header]) + "\n"; } } // Then multipart/encrypted ct let boundary = EnigmailMime.createBoundary(); msg += "Content-Transfer-Encoding: 7Bit\n"; msg += "Content-Type: multipart/encrypted; "; msg += "boundary=\"" + boundary + "\"; protocol=\"application/pgp-encrypted\"\n\n"; msg += "This is an OpenPGP/MIME encrypted message (RFC 4880 and 3156)\n"; // pgp-encrypted part msg += "--" + boundary + "\n"; msg += "Content-Type: application/pgp-encrypted\n"; msg += "Content-Disposition: attachment\n"; msg += "Content-Transfer-Encoding: 7Bit\n\n"; msg += "Version: 1\n\n"; // the octet stream msg += "--" + boundary + "\n"; msg += "Content-Type: application/octet-stream; name=\"encrypted.asc\"\n"; msg += "Content-Description: OpenPGP encrypted message\n"; msg += "Content-Disposition: inline; filename=\"encrypted.asc\"\n"; msg += "Content-Transfer-Encoding: 7Bit\n\n"; msg += encmsg; // Bottom boundary msg += "\n--" + boundary + "--\n"; // Fix up the line endings to be a proper dosish mail msg = msg.replace(/\r/ig, "").replace(/\n/ig, "\r\n"); return msg; }, readAttachment: function(attachment, strippedName) { return new Promise( function(resolve, reject) { EnigmailLog.DEBUG("persistentCrypto.jsm: readAttachment\n"); let o; var f = function _cb(data) { EnigmailLog.DEBUG("persistentCrypto.jsm: readAttachment - got data (" + data.length + ")\n"); o = { type: "attachment", data: data, name: strippedName ? strippedName : attachment.name, partName: attachment.partName, origName: attachment.name, status: STATUS_NOT_REQUIRED }; resolve(o); }; try { var bufferListener = EnigmailStreams.newStringStreamListener(f); var ioServ = Cc[IOSERVICE_CONTRACTID].getService(Components.interfaces.nsIIOService); var msgUri = ioServ.newURI(attachment.url, null, null); var channel = EnigmailStreams.createChannelFromURI(msgUri); channel.asyncOpen(bufferListener, msgUri); } catch (ex) { reject(o); } } ); }, decryptAttachment: function(attachment, strippedName) { var self = this; return new Promise( function(resolve, reject) { EnigmailLog.DEBUG("persistentCrypto.jsm: decryptAttachment\n"); self.readAttachment(attachment, strippedName).then( function(o) { var attachmentHead = o.data.substr(0, 30); if (attachmentHead.match(/-----BEGIN PGP \w{5,10} KEY BLOCK-----/)) { // attachment appears to be a PGP key file, we just go-a-head resolve(o); return; } var enigmailSvc = EnigmailCore.getService(); var args = EnigmailGpg.getStandardArgs(true); args = args.concat(EnigmailPassword.command()); args.push("-d"); var statusMsgObj = {}; var cmdLineObj = {}; var exitCode = -1; var statusFlagsObj = {}; var errorMsgObj = {}; statusFlagsObj.value = 0; var listener = EnigmailExecution.newSimpleListener( function _stdin(pipe) { // try to get original file name if file does not contain suffix if (strippedName.indexOf(".") < 0) { let s = EnigmailAttachment.getFileName(null, o.data); if (s) o.name = s; } pipe.write(o.data); pipe.close(); } ); do { var proc = EnigmailExecution.execStart(getGpgAgent().agentPath, args, false, null, listener, statusFlagsObj); if (!proc) { resolve(o); return; } // Wait for child STDOUT to close proc.wait(); EnigmailExecution.execEnd(listener, statusFlagsObj, statusMsgObj, cmdLineObj, errorMsgObj); if ((listener.stdoutData && listener.stdoutData.length > 0) || (statusFlagsObj.value & EnigmailConstants.DECRYPTION_OKAY)) { EnigmailLog.DEBUG("persistentCrypto.jsm: decryptAttachment: decryption OK\n"); exitCode = 0; } else if (statusFlagsObj.value & (EnigmailConstants.DECRYPTION_FAILED | EnigmailConstants.MISSING_MDC)) { EnigmailLog.DEBUG("persistentCrypto.jsm: decryptAttachment: decryption without MDC protection\n"); exitCode = 0; } else if (statusFlagsObj.value & EnigmailConstants.DECRYPTION_FAILED) { EnigmailLog.DEBUG("persistentCrypto.jsm: decryptAttachment: decryption failed\n"); // since we cannot find out if the user wants to cancel // we should ask let msg = EnigmailLocale.getString("converter.decryptAtt.failed", [attachment.name, self.subject]); if (!getDialog().confirmDlg(null, msg, EnigmailLocale.getString("dlg.button.retry"), EnigmailLocale.getString("dlg.button.skip"))) { o.status = STATUS_FAILURE; resolve(o); return; } } else if (statusFlagsObj.value & EnigmailConstants.DECRYPTION_INCOMPLETE) { // failure; message not complete EnigmailLog.DEBUG("persistentCrypto.jsm: decryptAttachment: decryption incomplete\n"); o.status = STATUS_FAILURE; resolve(o); return; } else { // there is nothing to be decrypted EnigmailLog.DEBUG("persistentCrypto.jsm: decryptAttachment: no decryption required\n"); o.status = STATUS_NOT_REQUIRED; resolve(o); return; } } while (exitCode !== 0); EnigmailLog.DEBUG("persistentCrypto.jsm: decryptAttachment: decrypted to " + listener.stdoutData.length + " bytes\n"); o.data = listener.stdoutData; o.status = STATUS_OK; resolve(o); } ); } ); }, /* * The following functions walk the MIME message structure and decrypt if they find something to decrypt */ // the sunny world of PGP/MIME walkMimeTree: function(mime, parent) { EnigmailLog.DEBUG("persistentCrypto.jsm: walkMimeTree:\n"); let ct = getContentType(getHeaderValue(mime, 'content-type')); EnigmailLog.DEBUG("persistentCrypto.jsm: walkMimeTree: part=" + mime.partName + " - " + ct + "\n"); // assign part name on lowest possible level -> that's where the attachment // really belongs to for (let i in mime.allAttachments) { mime.allAttachments[i].partName = mime.partName; } if (this.isPgpMime(mime) || this.isSMime(mime)) { let p = this.decryptPGPMIME(parent, mime.partName); this.decryptionTasks.push(p); } else if (this.isBrokenByExchange(mime)) { let p = this.decryptAttachment(mime.parts[0].parts[2], "decrypted.txt"); mime.isBrokenByExchange = true; mime.parts[0].parts[2].name = "ignore.txt"; this.decryptionTasks.push(p); } else if (typeof(mime.body) == "string") { EnigmailLog.DEBUG(" body size: " + mime.body.length + "\n"); } for (var i in mime.parts) { this.walkMimeTree(mime.parts[i], mime); } }, /*** * * Detect if mime part is PGP/MIME message that got modified by MS-Exchange: * * - multipart/mixed Container with * - application/pgp-encrypted Attachment with name "PGPMIME Version Identification" * - application/octet-stream Attachment with name "encrypted.asc" having the encrypted content in base64 * - see: * - https://www.enigmail.net/forum/viewtopic.php?f=4&t=425 * - https://sourceforge.net/p/enigmail/forum/support/thread/4add2b69/ */ isBrokenByExchange: function(mime) { EnigmailLog.DEBUG("persistentCrypto.jsm: isBrokenByExchange:\n"); try { if (mime.parts && mime.parts.length && mime.parts.length == 1 && mime.parts[0].parts && mime.parts[0].parts.length && mime.parts[0].parts.length == 3 && mime.parts[0].headers["content-type"][0].indexOf("multipart/mixed") >= 0 && mime.parts[0].parts[0].size === 0 && mime.parts[0].parts[0].headers["content-type"][0].search(/multipart\/encrypted/i) < 0 && mime.parts[0].parts[0].headers["content-type"][0].indexOf("text/plain") >= 0 && mime.parts[0].parts[1].headers["content-type"][0].indexOf("application/pgp-encrypted") >= 0 && mime.parts[0].parts[1].headers["content-type"][0].search(/multipart\/encrypted/i) < 0 && mime.parts[0].parts[1].headers["content-type"][0].search(/PGPMIME Versions? Identification/i) >= 0 && mime.parts[0].parts[2].headers["content-type"][0].indexOf("application/octet-stream") >= 0 && mime.parts[0].parts[2].headers["content-type"][0].indexOf("encrypted.asc") >= 0) { EnigmailLog.DEBUG("persistentCrypto.jsm: isBrokenByExchange: found message broken by MS-Exchange\n"); return true; } } catch (ex) {} return false; }, isPgpMime: function(mime) { EnigmailLog.DEBUG("persistentCrypto.jsm: isPgpMime:\n"); try { var ct = mime.contentType; if (!ct) return false; if (!('content-type' in mime.headers)) return false; var pt = getProtocol(getHeaderValue(mime, 'content-type')); if (!pt) return false; if (ct.toLowerCase() == "multipart/encrypted" && pt == "application/pgp-encrypted") { return true; } } catch (ex) { //EnigmailLog.DEBUG("persistentCrypto.jsm: isPgpMime:"+ex+"\n"); } return false; }, // smime-type=enveloped-data isSMime: function(mime) { EnigmailLog.DEBUG("persistentCrypto.jsm: isSMime:\n"); try { var ct = mime.contentType; if (!ct) return false; if (!('content-type' in mime.headers)) return false; var pt = getSMimeProtocol(getHeaderValue(mime, 'content-type')); if (!pt) return false; if (ct.toLowerCase() == "application/pkcs7-mime" && pt == "enveloped-data") { return true; } } catch (ex) { EnigmailLog.DEBUG("persistentCrypto.jsm: isSMime:" + ex + "\n"); } return false; }, decryptPGPMIME: function(mime, part) { EnigmailLog.DEBUG("persistentCrypto.jsm: decryptPGPMIME: part=" + part + "\n"); var self = this; return new Promise( function(resolve, reject) { var m = Cc["@mozilla.org/messenger/mimeheaders;1"].createInstance(Ci.nsIMimeHeaders); var messenger = Cc["@mozilla.org/messenger;1"].getService(Ci.nsIMessenger); let msgSvc = messenger.messageServiceFromURI(self.hdr.folder.getUriForMsg(self.hdr)); let u = {}; msgSvc.GetUrlForUri(self.hdr.folder.getUriForMsg(self.hdr), u, null); let op = (u.value.spec.indexOf("?") > 0 ? "&" : "?"); let url = u.value.spec + op + 'part=' + part + "&header=enigmailConvert"; EnigmailLog.DEBUG("persistentCrypto.jsm: getting data from URL " + url + "\n"); let s = EnigmailStreams.newStringStreamListener( function analyzeDecryptedData(data) { EnigmailLog.DEBUG("persistentCrypto.jsm: analyzeDecryptedData: got " + data.length + " bytes\n"); if (EnigmailLog.getLogLevel() > 5) { EnigmailLog.DEBUG("*** start data ***\n'" + data + "'\n***end data***\n"); } let subpart = mime.parts[0]; let o = { type: "mime", name: "", origName: "", data: "", partName: part, status: STATUS_OK }; if (data.length === 0) { // fail if no data found o.status = STATUS_FAILURE; resolve(o); return; } let bodyIndex = data.search(/\n\s*\r?\n/); if (bodyIndex < 0) { bodyIndex = 0; } else { ++bodyIndex; } if (data.substr(bodyIndex).search(/\r?\n$/) === 0) { o.status = STATUS_FAILURE; resolve(o); return; } m.initialize(data.substr(0, bodyIndex)); let ct = m.extractHeader("content-type", false) || ""; if (part.length > 0 && part.search(/[^01.]/) < 0) { if (ct.search(/protected-headers/i) >= 0) { if (m.hasHeader("subject")) { let subject = m.extractHeader("subject", false) || ""; self.mime.headers.subject = [subject]; } } else if (self.mime.headers.subject.join("") === "p≡p") { let subject = getPepSubject(data); if (subject) { self.mime.headers.subject = [subject]; } } } let boundary = getBoundary(getHeaderValue(mime, 'content-type')); if (!boundary) boundary = EnigmailMime.createBoundary(); // append relevant headers mime.headers['content-type'] = "multipart/mixed; boundary=\"" + boundary + "\""; o.data = "--" + boundary + "\r\n"; o.data += "Content-Type: " + ct + "\r\n"; let h = m.headerNames; while (h.hasMore()) { let hdr = h.getNext(); if (hdr.search(/^content-type$/i) < 0) { try { EnigmailLog.DEBUG("persistentCrypto.jsm: getUnstructuredHeader: hdr=" + hdr + "\n"); let hdrVal = m.getUnstructuredHeader(hdr.toLowerCase()); o.data += hdr + ": " + hdrVal + "\r\n"; } catch (ex) { try { let hdrVal = m.getRawHeader(hdr.toLowerCase()); o.data += hdr + ": " + hdrVal + "\r\n"; } catch (ex) { EnigmailLog.DEBUG("persistentCrypto.jsm: getUnstructuredHeader: exception " + ex.toString() + "\n"); } } } } EnigmailLog.DEBUG("persistentCrypto.jsm: getUnstructuredHeader: done\n"); o.data += data.substr(bodyIndex); if (subpart) { subpart.body = undefined; subpart.headers['content-type'] = ct; } resolve(o); } ); try { var channel = EnigmailStreams.createChannel(url); channel.asyncOpen(s, null); } catch (e) { EnigmailLog.DEBUG("persistentCrypto.jsm: decryptPGPMIME: exception " + e.toString() + "\n"); } } ); }, //inline wonderland decryptINLINE: function(mime) { EnigmailLog.DEBUG("persistentCrypto.jsm: decryptINLINE:\n"); if (typeof mime.body !== 'undefined') { let ct = getContentType(getHeaderValue(mime, 'content-type')); if (ct == "text/html") { mime.body = this.stripHTMLFromArmoredBlocks(mime.body); } var exitCodeObj = {}; var statusFlagsObj = {}; var userIdObj = {}; var sigDetailsObj = {}; var errorMsgObj = {}; var keyIdObj = {}; var blockSeparationObj = { value: "" }; var encToDetailsObj = {}; var signatureObj = {}; signatureObj.value = ""; const uiFlags = EnigmailConstants.UI_INTERACTIVE | EnigmailConstants.UI_UNVERIFIED_ENC_OK | EnigmailConstants.UI_IGNORE_MDC_ERROR; var plaintexts = []; var blocks = EnigmailArmor.locateArmoredBlocks(mime.body); var tmp = []; for (let i = 0; i < blocks.length; i++) { if (blocks[i].blocktype == "MESSAGE") { tmp.push(blocks[i]); } } blocks = tmp; if (blocks.length < 1) { return 0; } let charset = "utf-8"; for (let i = 0; i < blocks.length; i++) { let plaintext = null; do { let ciphertext = mime.body.substring(blocks[i].begin, blocks[i].end + 1); if (ciphertext.length === 0) { break; } let hdr = ciphertext.search(/(\r\r|\n\n|\r\n\r\n)/); if (hdr > 0) { let chset = ciphertext.substr(0, hdr).match(/^(charset:)(.*)$/mi); if (chset && chset.length == 3) { charset = chset[2].trim(); } } plaintext = getDecryption().decryptMessage(null, uiFlags, ciphertext, signatureObj, exitCodeObj, statusFlagsObj, keyIdObj, userIdObj, sigDetailsObj, errorMsgObj, blockSeparationObj, encToDetailsObj); if (!plaintext || plaintext.length === 0) { if (statusFlagsObj.value & EnigmailConstants.DISPLAY_MESSAGE) { getDialog().alert(null, errorMsgObj.value); this.foundPGP = -1; return -1; } if (statusFlagsObj.value & (EnigmailConstants.DECRYPTION_FAILED | EnigmailConstants.MISSING_MDC)) { EnigmailLog.DEBUG("persistentCrypto.jsm: decryptINLINE: no MDC protection, decrypting anyway\n"); } if (statusFlagsObj.value & EnigmailConstants.DECRYPTION_FAILED) { // since we cannot find out if the user wants to cancel // we should ask let msg = EnigmailLocale.getString("converter.decryptBody.failed", this.subject); if (!getDialog().confirmDlg(null, msg, EnigmailLocale.getString("dlg.button.retry"), EnigmailLocale.getString("dlg.button.skip"))) { this.foundPGP = -1; return -1; } } else if (statusFlagsObj.value & EnigmailConstants.DECRYPTION_INCOMPLETE) { this.foundPGP = -1; return -1; } } if (ct == "text/html") { plaintext = plaintext.replace(/\n/ig, "
\n"); } if (i == 0 && this.mime.headers.subject && this.mime.headers.subject[0] === "pEp" && mime.partName.length > 0 && mime.partName.search(/[^01.]/) < 0) { let m = EnigmailMime.extractSubjectFromBody(plaintext); if (m) { plaintext = m.messageBody; this.mime.headers.subject = [m.subject]; } } if (plaintext) { plaintexts.push(plaintext); } } while (!plaintext || plaintext === ""); } var decryptedMessage = mime.body.substring(0, blocks[0].begin) + plaintexts[0]; for (let i = 1; i < blocks.length; i++) { decryptedMessage += mime.body.substring(blocks[i - 1].end + 1, blocks[i].begin + 1) + plaintexts[i]; } decryptedMessage += mime.body.substring(blocks[(blocks.length - 1)].end + 1); // enable base64 encoding if non-ASCII character(s) found let j = decryptedMessage.search(/[^\x01-\x7F]/); // eslint-disable-line no-control-regex if (j >= 0) { mime.headers['content-transfer-encoding'] = ['base64']; mime.body = EnigmailData.encodeBase64(decryptedMessage); } else { mime.body = decryptedMessage; mime.headers['content-transfer-encoding'] = ['8bit']; } let origCharset = getCharset(getHeaderValue(mime, 'content-type')); if (origCharset) { mime.headers['content-type'] = getHeaderValue(mime, 'content-type').replace(origCharset, charset); } else { mime.headers['content-type'] = getHeaderValue(mime, 'content-type') + "; charset=" + charset; } this.foundPGP = 1; return 1; } if (typeof mime.parts !== 'undefined' && mime.parts.length > 0) { var ret = 0; for (let part in mime.parts) { ret += this.decryptINLINE(mime.parts[part]); } return ret; } let ct = getContentType(getHeaderValue(mime, 'content-type')); EnigmailLog.DEBUG("persistentCrypto.jsm: Decryption skipped: " + ct + "\n"); return 0; }, stripHTMLFromArmoredBlocks: function(text) { var index = 0; var begin = text.indexOf("-----BEGIN PGP"); var end = text.indexOf("-----END PGP"); while (begin > -1 && end > -1) { let sub = text.substring(begin, end); sub = sub.replace(/(<([^>]+)>)/ig, ""); sub = sub.replace(/&[A-z]+;/ig, ""); text = text.substring(0, begin) + sub + text.substring(end); index = end + 10; begin = text.indexOf("-----BEGIN PGP", index); end = text.indexOf("-----END PGP", index); } return text; }, /****** * * We have the technology we can rebuild. * * Function to reassemble the message from the MIME Tree * into a String. * ******/ mimeToString: function(mime, topLevel) { EnigmailLog.DEBUG("persistentCrypto.jsm: mimeToString: part: '" + mime.partName + "', is of type '" + typeof(mime) + "'\n"); let ct = getContentType(getHeaderValue(mime, 'content-type')); if (!ct) { return ""; } let boundary = getBoundary(getHeaderValue(mime, 'content-type')); let msg = ""; if (mime.isBrokenByExchange) { EnigmailLog.DEBUG("persistentCrypto.jsm: mimeToString: MS-Exchange fix\n"); for (let j in this.allTasks) { if (this.allTasks[j].partName == mime.parts[0].partName) { boundary = EnigmailMime.createBoundary(); msg += getRfc822Headers(mime.headers, ct, "content-type"); msg += 'Content-Type: multipart/mixed; boundary="' + boundary + '"\r\n\r\n'; msg += "This is a multi-part message in MIME format."; msg += "\r\n--" + boundary + "\r\n"; msg += this.allTasks[j].data; msg += "\r\n--" + boundary + "--\r\n"; return msg; } } } else if (mime instanceof MimeMessageAttachment) { for (let j in this.allTasks) { if (this.allTasks[j].partName == mime.partName && this.allTasks[j].origName == mime.name) { let a = this.allTasks[j]; EnigmailLog.DEBUG("persistentCrypto.jsm: mimeToString: attaching " + j + " as '" + a.name + "'\n"); for (let header in mime.headers) { if (!(a.status == STATUS_OK && header == "content-type")) { msg += prettyPrintHeader(header, mime.headers[header]) + "\r\n"; } } if (a.type == "attachment") { if (a.status == STATUS_OK) { msg += "Content-Type: application/octet-stream; name=\"" + a.name + "\"\r\n"; msg += "Content-Disposition: attachment; filename\"" + a.name + "\"\r\n"; } msg += "Content-Transfer-Encoding: base64\r\n\r\n"; msg += EnigmailData.encodeBase64(a.data) + "\r\n"; } } } } else if (mime instanceof MimeContainer || mime instanceof MimeUnknown) { for (let j in this.allTasks) { if (this.allTasks[j].partName == mime.partName && this.allTasks[j].type == "mime") { let a = this.allTasks[j]; msg += a.data; mime.noBottomBoundary = true; } } } else if (mime instanceof MimeMessage && ct.substr(0, 5) == "text/") { let subct = mime.parts[0].headers['content-type']; if (subct) { mime.headers['content-type'] = subct; } subct = mime.parts[0].headers['content-transfer-encoding']; if (subct) { mime.headers['content-transfer-encoding'] = subct; } msg += getRfc822Headers(mime.headers, ct); msg += "\r\n" + mime.parts[0].body + "\r\n"; return msg; } else { if (!topLevel && (mime instanceof MimeMessage)) { let mimeName = mime.name; if (!mimeName || mimeName === "") { mimeName = getHeaderValue(mime, 'subject') + ".eml"; } msg += 'Content-Type: message/rfc822; name="' + EnigmailMime.encodeHeaderValue(mimeName) + '\r\n'; msg += 'Content-Transfer-Encoding: 7bit\r\n'; msg += 'Content-Disposition: attachment; filename="' + EnigmailMime.encodeHeaderValue(mimeName) + '"\r\n\r\n'; } msg += getRfc822Headers(mime.headers, ct); msg += "\r\n"; if (mime.body) { msg += mime.body + "\r\n"; } else if ((mime instanceof MimeMessage) && ct.substr(0, 5) != "text/") { msg += "This is a multi-part message in MIME format.\r\n"; } } for (let i in mime.parts) { let subPart = this.mimeToString(mime.parts[i], false); if (subPart.length > 0) { if (boundary && !(mime instanceof MimeMessage)) { msg += "--" + boundary + "\r\n"; } msg += subPart + "\r\n"; } } if (ct.indexOf("multipart/") === 0 && !(mime instanceof MimeContainer)) { if (!mime.noBottomBoundary) { msg += "--" + boundary + "--\r\n"; } } return msg; } }; /** * Format a mime header * * e.g. content-type -> Content-Type */ function formatHeader(headerLabel) { return headerLabel.replace(/^.|(-.)/g, function(match) { return match.toUpperCase(); }); } function formatMimeHeader(headerLabel, headerValue) { if (headerLabel.search(/^(sender|from|reply-to|to|cc|bcc)$/i) === 0) { return formatHeader(headerLabel) + ": " + EnigmailMime.formatHeaderData(EnigmailMime.formatEmailAddress(headerValue)); } else { return formatHeader(headerLabel) + ": " + EnigmailMime.formatHeaderData(EnigmailMime.encodeHeaderValue(headerValue)); } } function prettyPrintHeader(headerLabel, headerData) { let hdrData = ""; if (Array.isArray(headerData)) { let h = []; for (let i in headerData) { h.push(formatMimeHeader(headerLabel, GlodaUtils.deMime(headerData[i]))); } return h.join("\r\n"); } else { return formatMimeHeader(headerLabel, GlodaUtils.deMime(String(headerData))); } } function getHeaderValue(mimeStruct, header) { EnigmailLog.DEBUG("persistentCrypto.jsm: getHeaderValue: '" + header + "'\n"); try { if (header in mimeStruct.headers) { if (typeof mimeStruct.headers[header] == "string") { return mimeStruct.headers[header]; } else { return mimeStruct.headers[header].join(" "); } } else { return ""; } } catch (ex) { EnigmailLog.DEBUG("persistentCrypto.jsm: getHeaderValue: header not present\n"); return ""; } } /*** * get the formatted headers for MimeMessage objects * * @headerArr: Array of headers (key/value pairs), such as mime.headers * @ignoreHeadersArr: Array of headers to exclude from returning * * @return: String containing formatted header list */ function getRfc822Headers(headerArr, contentType, ignoreHeadersArr) { let hdrs = ""; let ignore = []; if (contentType.indexOf("multipart/") >= 0) { ignore = ['content-transfer-encoding', 'content-disposition', 'content-description' ]; } if (ignoreHeadersArr) { ignore = ignore.concat(ignoreHeadersArr); } for (let i in headerArr) { if (ignore.indexOf(i) < 0) { hdrs += prettyPrintHeader(i, headerArr[i]) + "\r\n"; } } return hdrs; } function getContentType(shdr) { try { shdr = String(shdr); return shdr.match(/([A-z-]+\/[A-z-]+)/)[1].toLowerCase(); } catch (e) { EnigmailLog.DEBUG("persistentCrypto.jsm: getContentType: " + e + "\n"); return null; } } // return the content of the boundary parameter function getBoundary(shdr) { try { shdr = String(shdr); return EnigmailMime.getBoundary(shdr); } catch (e) { EnigmailLog.DEBUG("persistentCrypto.jsm: getBoundary: " + e + "\n"); return null; } } function getCharset(shdr) { try { shdr = String(shdr); return EnigmailMime.getParameter(shdr, 'charset').toLowerCase(); } catch (e) { EnigmailLog.DEBUG("persistentCrypto.jsm: getCharset: " + e + "\n"); return null; } } function getProtocol(shdr) { try { shdr = String(shdr); return EnigmailMime.getProtocol(shdr).toLowerCase(); } catch (e) { EnigmailLog.DEBUG("persistentCrypto.jsm: getProtocol: " + e + "\n"); return ""; } } function getSMimeProtocol(shdr) { try { shdr = String(shdr); return shdr.match(/smime-type="?([A-z0-9'()+_,-./:=?]+)"?/)[1].toLowerCase(); } catch (e) { EnigmailLog.DEBUG("persistentCrypto.jsm: getSMimeProtocol: " + e + "\n"); return ""; } } function getPepSubject(mimeString) { EnigmailLog.DEBUG("persistentCrypto.jsm: getPepSubject()\n"); let subject = null; let emitter = { ct: "", firstPlainText: false, startPart: function(partNum, headers) { EnigmailLog.DEBUG("persistentCrypto.jsm: getPepSubject.startPart: partNum=" + partNum + "\n"); try { this.ct = String(headers.getRawHeader("content-type")).toLowerCase(); if (!subject && !this.firstPlainText) { let s = headers.getRawHeader("subject"); if (s) { subject = String(s); this.firstPlainText = true; } } } catch (ex) { this.ct = ""; } }, endPart: function(partNum) {}, deliverPartData: function(partNum, data) { EnigmailLog.DEBUG("persistentCrypto.jsm: getPepSubject.deliverPartData: partNum=" + partNum + " ct=" + this.ct + "\n"); if (!this.firstPlainText && this.ct.search(/^text\/plain/) === 0) { // check data this.firstPlainText = true; let o = EnigmailMime.extractSubjectFromBody(data); if (o) { subject = o.subject; } } } }; let opt = { strformat: "unicode", bodyformat: "decode" }; try { let p = new jsmime.MimeParser(emitter, opt); p.deliverData(mimeString); } catch (ex) {} return subject; } /** * Lazy deletion of original messages */ function deleteOriginalMail(msgHdr) { EnigmailLog.DEBUG("persistentCrypto.jsm: deleteOriginalMail(" + msgHdr.messageKey + ")\n"); let delMsg = function() { try { EnigmailLog.DEBUG("persistentCrypto.jsm: deleting original message " + msgHdr.messageKey + "\n"); EnigmailStdlib.msgHdrsDelete([msgHdr]); } catch (e) { EnigmailLog.DEBUG("persistentCrypto.jsm: deletion failed. Error: " + e.toString() + "\n"); } }; EnigmailTimer.setTimeout(delMsg, 500); } enigmail-2.0.8/package/pgpmimeHandler.jsm000066400000000000000000000203061334302754500203570ustar00rootroot00000000000000/*global Components: false */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; /** * Module for handling PGP/MIME encrypted and/or signed messages * implemented as an XPCOM object */ const { classes: Cc, interfaces: Ci, manager: Cm, results: Cr, utils: Cu, Constructor: CC } = Components; Cm.QueryInterface(Ci.nsIComponentRegistrar); var EXPORTED_SYMBOLS = ["EnigmailPgpmimeHander"]; Cu.import("resource://gre/modules/XPCOMUtils.jsm"); /*global XPCOMUtils: false */ Cu.import("resource://enigmail/core.jsm"); /*global EnigmailCore: false */ Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ Cu.import("resource://enigmail/mimeDecrypt.jsm"); /*global EnigmailMimeDecrypt: false */ Cu.import("resource://enigmail/mimeVerify.jsm"); /*global EnigmailVerify: false */ Cu.import("resource://enigmail/wksMimeHandler.jsm"); /*global EnigmailWksMimeHandler: false */ Cu.import("resource://enigmail/mime.jsm"); /*global EnigmailMime: false */ Cu.import("resource://enigmail/pEpDecrypt.jsm"); /*global EnigmailPEPDecrypt: false */ Cu.import("resource://enigmail/pEpAdapter.jsm"); /*global EnigmailPEPAdapter: false */ Cu.import("resource://enigmail/singletons.jsm"); /*global EnigmailSingletons: false */ const PGPMIME_JS_DECRYPTOR_CONTRACTID = "@mozilla.org/mime/pgp-mime-js-decrypt;1"; const PGPMIME_JS_DECRYPTOR_CID = Components.ID("{7514cbeb-2bfd-4b2c-829b-1a4691fa0ac8}"); //////////////////////////////////////////////////////////////////// // handler for PGP/MIME encrypted and PGP/MIME signed messages // data is processed from libmime -> nsPgpMimeProxy var gConv; var inStream; var gLastEncryptedUri = ""; const throwErrors = { onDataAvailable: function() { throw "error"; }, onStartRequest: function() { throw "error"; }, onStopRequest: function() { throw "error"; } }; /** * UnknownProtoHandler is a default handler for unkonwn protocols. It ensures that the * signed message part is always displayed without any further action. */ function UnknownProtoHandler() { if (!gConv) { gConv = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(Ci.nsIStringInputStream); } if (!inStream) { inStream = Cc["@mozilla.org/scriptableinputstream;1"].createInstance(Ci.nsIScriptableInputStream); } } UnknownProtoHandler.prototype = { onStartRequest: function(request) { this.mimeSvc = request.QueryInterface(Ci.nsIPgpMimeProxy); if (!("outputDecryptedData" in this.mimeSvc)) { this.mimeSvc.onStartRequest(null, null); } this.bound = EnigmailMime.getBoundary(this.mimeSvc.contentType); /* readMode: 0: before message 1: inside message 2: afer message */ this.readMode = 0; }, onDataAvailable: function(req, sup, stream, offset, count) { if (count > 0) { inStream.init(stream); let data = inStream.read(count); let l = data.replace(/\r\n/g, "\n").split(/\n/); if (data.search(/\n$/) >= 0) { l.pop(); } let startIndex = 0; let endIndex = l.length; if (this.readMode < 2) { for (let i = 0; i < l.length; i++) { if (l[i].indexOf("--") === 0 && l[i].indexOf(this.bound) === 2) { ++this.readMode; if (this.readMode === 1) { startIndex = i + 1; } else if (this.readMode === 2) { endIndex = i - 1; } } } if (this.readMode >= 1 && startIndex < l.length) { let out = l.slice(startIndex, endIndex).join("\n") + "\n"; if ("outputDecryptedData" in this.mimeSvc) { this.mimeSvc.outputDecryptedData(out, out.length); } else { gConv.setData(out, out.length); this.mimeSvc.onDataAvailable(null, null, gConv, 0, out.length); } } } } }, onStopRequest: function() { if (!("outputDecryptedData" in this.mimeSvc)) { this.mimeSvc.onStopRequest(null, null, 0); } } }; function PgpMimeHandler() { EnigmailLog.DEBUG("pgpmimeHandler.js: PgpMimeHandler()\n"); // always log this one } PgpMimeHandler.prototype = { classDescription: "Enigmail JS Decryption Handler", classID: PGPMIME_JS_DECRYPTOR_CID, contractID: PGPMIME_JS_DECRYPTOR_CONTRACTID, QueryInterface: XPCOMUtils.generateQI([Ci.nsIStreamListener]), inStream: Cc["@mozilla.org/scriptableinputstream;1"].createInstance(Ci.nsIScriptableInputStream), onStartRequest: function(request, uri) { let mimeSvc = request.QueryInterface(Ci.nsIPgpMimeProxy); let ct = mimeSvc.contentType; if (!EnigmailCore.getService()) { // Ensure Enigmail is initialized if (ct.search(/application\/(x-)?pkcs7-signature/i) > 0) { return this.handleSmime(uri); } return null; } EnigmailLog.DEBUG("pgpmimeHandler.js: onStartRequest\n"); EnigmailLog.DEBUG("pgpmimeHandler.js: ct= " + ct + "\n"); let cth = null; if (ct.search(/^multipart\/encrypted/i) === 0) { if (uri) { let u = uri.QueryInterface(Ci.nsIURI); gLastEncryptedUri = u.spec; } // PGP/MIME encrypted message if (EnigmailPEPAdapter.usingPep()) { cth = EnigmailPEPDecrypt.getDecryptionService(ct); } else cth = EnigmailMimeDecrypt.newPgpMimeHandler(); } else if (ct.search(/^multipart\/signed/i) === 0) { if (ct.search(/application\/pgp-signature/i) > 0) { // PGP/MIME signed message cth = EnigmailVerify.newVerifier(); } else if (ct.search(/application\/(x-)?pkcs7-signature/i) > 0) { let lastUriSpec = ""; if (uri) { let u = uri.QueryInterface(Ci.nsIURI); lastUriSpec = u.spec; } // S/MIME signed message if (lastUriSpec !== gLastEncryptedUri && EnigmailVerify.lastMsgWindow) { // if message is displayed then handle like S/MIME message return this.handleSmime(uri); } else { // otherwise just make sure message body is returned cth = EnigmailVerify.newVerifier("application/(x-)?pkcs7-signature"); } } } else if (ct.search(/application\/vnd.gnupg.wks/i) === 0) { cth = EnigmailWksMimeHandler.newHandler(); } if (!cth) { EnigmailLog.ERROR("pgpmimeHandler.js: unknown protocol for content-type: " + ct + "\n"); cth = new UnknownProtoHandler(); } if (cth) { this.onDataAvailable = cth.onDataAvailable.bind(cth); this.onStopRequest = cth.onStopRequest.bind(cth); return cth.onStartRequest(request, uri); } return null; }, onDataAvailable: function(req, sup, stream, offset, count) {}, onStopRequest: function(request, win, status) {}, handleSmime: function(uri) { this.contentHandler = throwErrors; if (uri) { uri = uri.QueryInterface(Ci.nsIURI).clone(); } let headerSink = EnigmailSingletons.messageReader; headerSink.handleSMimeMessage(uri); }, getMessengerWindow: function() { let windowManager = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator); let winEnum = windowManager.getEnumerator(null); while (winEnum.hasMoreElements()) { let thisWin = winEnum.getNext(); if (thisWin.location.href.search(/\/messenger.xul$/) > 0) { return thisWin; } } return null; } }; class Factory { constructor(component) { this.component = component; this.register(); Object.freeze(this); } createInstance(outer, iid) { if (outer) { throw Cr.NS_ERROR_NO_AGGREGATION; } return new this.component(); } register() { Cm.registerFactory(this.component.prototype.classID, this.component.prototype.classDescription, this.component.prototype.contractID, this); } unregister() { Cm.unregisterFactory(this.component.prototype.classID, this); } } var EnigmailPgpmimeHander = { startup: function(reason) { try { this.factory = new Factory(PgpMimeHandler); } catch (ex) {} }, shutdown: function(reason) { if (this.factory) { this.factory.unregister(); } } }; enigmail-2.0.8/package/pipeConsole.jsm000066400000000000000000000012671334302754500177100ustar00rootroot00000000000000/*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailConsole"]; const MAX_SIZE = 32768; var dataCache = ""; var gotNewData = false; var EnigmailConsole = { write: function(data) { dataCache += data; if (dataCache.length > MAX_SIZE) { dataCache = dataCache.substr(-MAX_SIZE, MAX_SIZE); } gotNewData = true; }, hasNewData: function() { return gotNewData; }, getData: function() { gotNewData = false; return dataCache; } }; enigmail-2.0.8/package/prefs.jsm000066400000000000000000000174041334302754500165470ustar00rootroot00000000000000/*global Components: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailPrefs"]; const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ Cu.import("resource://enigmail/files.jsm"); /*global EnigmailFiles: false */ const { Services } = Cu.import("resource://gre/modules/Services.jsm"); const ENIGMAIL_PREFS_ROOT = "extensions.enigmail."; const p = { service: null, branch: null, root: null, defaultBranch: null }; function initPrefService() { try { p.service = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefService); p.root = p.service.getBranch(null); p.branch = p.service.getBranch(ENIGMAIL_PREFS_ROOT); p.defaultBranch = p.service.getDefaultBranch(null); try { if (p.branch.getCharPref("logDirectory")) { EnigmailLog.setLogLevel(5); } } catch (ex) {} // don't log anythign if accessing logDirectory fails } catch (ex) { EnigmailLog.ERROR("prefs.jsm: Error in instantiating PrefService\n"); EnigmailLog.ERROR(ex.toString()); } } var gPrefs = {}; /** * Load a preference default value * This function is called while loading defaultPrefs.js */ function pref(key, val) { gPrefs[key] = val; } /** * Load default preferences for bootstrapped addon */ function setDefaultPrefs() { EnigmailLog.DEBUG("prefs.jsm: setDefaultPrefs()\n"); Services.scriptloader.loadSubScript("resource://enigmail/preferences/defaultPrefs.js", {}, "UTF-8"); let branch = p.defaultBranch; for (let key in gPrefs) { let val = gPrefs[key]; switch (typeof val) { case "boolean": branch.setBoolPref(key, val); break; case "number": branch.setIntPref(key, val); break; case "string": branch.setCharPref(key, val); break; } } } var EnigmailPrefs = { startup: function(reason) { try { initPrefService(); setDefaultPrefs(); } catch (ex) { EnigmailLog.ERROR("prefs.jsm: Error while loading default prefs: " + ex.message + "\n"); } }, getPrefRoot: function() { if (!p.branch) { initPrefService(); } return p.root; }, getPrefBranch: function() { if (!p.branch) { initPrefService(); } return p.branch; }, getPref: function(prefName) { if (!p.branch) { initPrefService(); } var prefValue = null; try { var prefType = p.branch.getPrefType(prefName); // Get pref value switch (prefType) { case p.branch.PREF_BOOL: prefValue = p.branch.getBoolPref(prefName); break; case p.branch.PREF_INT: prefValue = p.branch.getIntPref(prefName); break; case p.branch.PREF_STRING: prefValue = p.branch.getCharPref(prefName); break; default: prefValue = undefined; break; } } catch (ex) { // Failed to get pref value EnigmailLog.ERROR("prefs.jsm: getPref: unknown prefName:" + prefName + " \n"); } return prefValue; }, /** * Store a user preference. * * @param String prefName An identifier. * @param any value The value to be stored. Allowed types: Boolean OR Integer OR String. * * @return Boolean Was the value stored successfully? */ setPref: function(prefName, value) { EnigmailLog.DEBUG("prefs.jsm: setPref: " + prefName + ", " + value + "\n"); if (!p.branch) { initPrefService(); } // Discover the type of the preference, as stored in the user preferences. // If the preference identifier doesn't exist yet, it returns 0. In that // case the type depends on the argument "value". var prefType; prefType = p.branch.getPrefType(prefName); if (prefType === 0) { switch (typeof value) { case "boolean": prefType = p.branch.PREF_BOOL; break; case "number": prefType = p.branch.PREF_INT; break; case "string": prefType = p.branch.PREF_STRING; break; default: prefType = 0; break; } } var retVal = false; // Save the preference only and if only the type is bool, int or string. switch (prefType) { case p.branch.PREF_BOOL: p.branch.setBoolPref(prefName, value); retVal = true; break; case p.branch.PREF_INT: p.branch.setIntPref(prefName, value); retVal = true; break; case p.branch.PREF_STRING: p.branch.setCharPref(prefName, value); retVal = true; break; default: break; } return retVal; }, /** * Save the Mozilla preferences file (prefs.js) * * no return value */ savePrefs: function() { EnigmailLog.DEBUG("prefs.jsm: savePrefs\n"); try { p.service.savePrefFile(null); } catch (ex) {} }, /** * Compiles all Enigmail preferences into an object */ getAllPrefs: function() { EnigmailLog.DEBUG("prefs.js: getAllPrefs\n"); var retObj = { value: 0 }; var branch = this.getPrefBranch(); var allPrefs = branch.getChildList("", retObj); var prefObj = {}; var nsIPB = Components.interfaces.nsIPrefBranch; for (var q in allPrefs) { var name = allPrefs[q]; /* * agentPath is system-depend, configuredVersion build-depend and * advancedUser must be set in order to save the profile. */ if (name == "agentPath" || name == "configuredVersion") { continue; } switch (branch.getPrefType(name)) { case nsIPB.PREF_STRING: prefObj[name] = branch.getCharPref(name); break; case nsIPB.PREF_INT: prefObj[name] = branch.getIntPref(name); break; case nsIPB.PREF_BOOL: prefObj[name] = branch.getBoolPref(name); break; default: EnigmailLog.ERROR("Pref '" + name + "' has unknown type\n"); } } return prefObj; }, /** * register a listener to listen to a change in the Enigmail preferences. * * @param prefName: String - name of Enigmail preference * @param observerFunc: Function - callback function to be triggered * * @return Object: observer object (to be used to deregister the observer) */ registerPrefObserver: function(prefName, observerFunc) { EnigmailLog.DEBUG("prefs.jsm: registerPrefObserver(" + prefName + ")\n"); let branch = this.getPrefRoot(); let observer = { observe: function(aSubject, aTopic, aData) { try { if (String(aData) == ENIGMAIL_PREFS_ROOT + this.prefName) { EnigmailLog.DEBUG("prefs.jsm: preference observed: " + aData + "\n"); observerFunc(); } } catch (ex) {} }, prefName: prefName, QueryInterface: function(iid) { if (iid.equals(Ci.nsIObserver) || iid.equals(Ci.nsISupportsWeakReference) || iid.equals(Ci.nsISupports)) return this; throw Components.results.NS_NOINTERFACE; } }; branch.addObserver(ENIGMAIL_PREFS_ROOT, observer, false); return observer; }, /** * de-register an observer created by registerPrefObserver(). * * @param observer: Object - observer object returned by registerPrefObserver */ unregisterPrefObserver(observer) { EnigmailLog.DEBUG("prefs.jsm: unregisterPrefObserver(" + observer.prefName + ")\n"); let branch = this.getPrefRoot(); branch.removeObserver(ENIGMAIL_PREFS_ROOT, observer); } }; enigmail-2.0.8/package/prefs/000077500000000000000000000000001334302754500160265ustar00rootroot00000000000000enigmail-2.0.8/package/prefs/.eslintrc.js000066400000000000000000000000671334302754500202700ustar00rootroot00000000000000module.exports = { "rules": { "strict": 0, } } enigmail-2.0.8/package/prefs/defaultPrefs.js000077500000000000000000000246351334302754500210250ustar00rootroot00000000000000/* global pref: false */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ /** * Default pref values for Enigmail */ // use pEp or Enigmail engine for encryption/decryption // 0: force using Enigmail // 1: automatic mode (use pEp if Enigmail and S/MIME are not configured for any identity) // 2: force using pEp pref("extensions.enigmail.juniorMode", 1); // the last configured Enigmail version pref("extensions.enigmail.configuredVersion", ""); // Hide prefs and menu entries from non-advanced users pref("extensions.enigmail.advancedUser", false); // additional parameter(s) to pass to GnuPG pref("extensions.enigmail.agentAdditionalParam", ""); // path to gpg executable pref("extensions.enigmail.agentPath", ""); // ** enigmail keySel preferences: // use rules to assign keys pref("extensions.enigmail.assignKeysByRules", true); // use email addresses to assign keys pref("extensions.enigmail.assignKeysByEmailAddr", true); // use manual dialog to assign missing keys pref("extensions.enigmail.assignKeysManuallyIfMissing", true); // always srats manual dialog for keys pref("extensions.enigmail.assignKeysManuallyAlways", false); // automatically download missing keys from keyserver pref("extensions.enigmail.autoKeyRetrieve", ""); // enable automatically decrypt/verify pref("extensions.enigmail.autoDecrypt", true); // enable X-Enigmail-xxx headers pref("extensions.enigmail.addHeaders", false); // countdown for alerts when composing inline PGP HTML msgs pref("extensions.enigmail.composeHtmlAlertCount", 3); // show warning message when clicking on sign icon pref("extensions.enigmail.displaySignWarn", true); // display warning as info for partially signed message pref("extensions.enigmail.displayPartiallySigned", true); // try to match secondary uid to from address pref("extensions.enigmail.displaySecondaryUid", true); // treat '-- ' as signature separator pref("extensions.enigmail.doubleDashSeparator", true); // last state of dialog to choose encryption method if there are attachments pref("extensions.enigmail.encryptAttachments", 1); // skip the attachments dialog pref("extensions.enigmail.encryptAttachmentsSkipDlg", 0); // Encrypt to self pref("extensions.enigmail.encryptToSelf", true); // enable 'Decrypt & open' for double click on attachment (if possible) pref("extensions.enigmail.handleDoubleClick", true); // disable '<' and '>' around email addresses pref("extensions.enigmail.hushMailSupport", false); // display alert for 'failed to initialize enigmime' pref("extensions.enigmail.initAlert", true); // use -a for encrypting attachments for inline PGP pref("extensions.enigmail.inlineAttachAsciiArmor", false); // extension to append for inline-encrypted attachments pref("extensions.enigmail.inlineAttachExt", ".pgp"); // extension to append for inline-signed attachments pref("extensions.enigmail.inlineSigAttachExt", ".sig"); // debug log directory (if set, also enabled debugging) pref("extensions.enigmail.logDirectory", ""); // display all or no keys by default in the key manager pref("extensions.enigmail.keyManShowAllKeys", true); // list of keyservers to use pref("extensions.enigmail.keyserver", "hkps://hkps.pool.sks-keyservers.net, hkps://keys.mailvelope.com, hkps://pgp.mit.edu"); // auto select the first keyserver in the key server list pref("extensions.enigmail.autoKeyServerSelection", true); // keep passphrase for ... minutes pref("extensions.enigmail.maxIdleMinutes", 5); // maximum number of parallel decrypt processes that Enigmaik will handle // (requests aboved the threshold are ignored) pref("extensions.enigmail.maxNumProcesses", 3); // GnuPG hash algorithm // 0: automatic seletion (i.e. let GnuPG choose) // 1: SHA1, 2: RIPEMD160, 3: SHA256, 4: SHA384, 5: SHA512, 6: SHA224 pref("extensions.enigmail.mimeHashAlgorithm", 0); // no passphrase for GnuPG key needed pref("extensions.enigmail.noPassphrase", false); // show quoted printable warning message (and remember selected state) pref("extensions.enigmail.quotedPrintableWarn", 0); // use http proxy settings as set in Mozilla/Thunderbird pref("extensions.enigmail.respectHttpProxy", true); // selection for which encryption model to prefer // 0: convenient encryption settings DEFAULT // 1: manual encryption settings pref("extensions.enigmail.encryptionModel", 0); // enable encryption for replies to encrypted mails pref("extensions.enigmail.keepSettingsForReply", true); // Warn if a key expires in less than N days. // 0 will disable the check pref("extensions.enigmail.warnKeyExpiryNumDays", 30); // holds the last result of the dayily key expiry check pref("extensions.enigmail.keyCheckResult", ""); // selection for which keys to accept // 0: accept valid/authenticated keys // 1: accept all keys (except disabled, ...) DEFAULT pref("extensions.enigmail.acceptedKeys", 1); // selection for automatic send encrypted if all keys valid // 0: never // 1: if all keys found and accepted DEFAULT pref("extensions.enigmail.autoSendEncrypted", 1); // enable automatic lookup of keys using Web Key Directory (WKD) // (see https://tools.ietf.org/html/draft-koch-openpgp-webkey-service) // 0: no // 1: yes DEFAULT pref("extensions.enigmail.autoWkdLookup", 1); // ask to confirm before sending // 0: never DEFAULT // 1: always // 2: if send encrypted // 3: if send unencrypted // 4: if send (un)encrypted due to rules pref("extensions.enigmail.confirmBeforeSending", 0); // show "Missing Trust in own keys" message (and remember selected state) pref("extensions.enigmail.warnOnMissingOwnerTrust", true); // use GnuPG's default instead of Enigmail/Mozilla comment of for signed messages pref("extensions.enigmail.useDefaultComment", true); // allow encryption to newsgroups pref("extensions.enigmail.encryptToNews", false); pref("extensions.enigmail.warnOnSendingNewsgroups", true); // set locale for GnuPG calls to en-US (Windows only) pref("extensions.enigmail.gpgLocaleEn", true); // use PGP/MIME (0=never, 1=allow, 2=always) // pref("extensions.enigmail.usePGPMimeOption",1); -- OBSOLETE, see mail.identity.default.pgpMimeMode // Use gpg for keyserver operations (vs. Thunderbird) pref("extensions.enigmail.useGpgKeysTool", true); // show "conflicting rules" message (and remember selected state) pref("extensions.enigmail.warnOnRulesConflict", 0); // display a warning when the passphrase is cleared pref("extensions.enigmail.warnClearPassphrase", true); // display a warning if the GnuPG version is deprecated pref("extensions.enigmail.warnDeprecatedGnuPG", true); // warn if gpg-agent is found and "remember passphrase for X minutes is active" pref("extensions.enigmail.warnGpgAgentAndIdleTime", true); // display a warning when all keys are to be refreshed pref("extensions.enigmail.warnRefreshAll", true); // display a warning when the keys for all contacts are downloaded pref("extensions.enigmail.warnDownloadContactKeys", true); // wrap HTML messages before sending inline PGP messages pref("extensions.enigmail.wrapHtmlBeforeSend", true); // automatically download pepmda if it is available (without askin user) pref("extensions.enigmail.pEpAutoDownload", true); // holds the last result of the last check for pEp updates pref("extensions.enigmail.pEpLastUpdate", 0); // automatically update pEp? pref("extensions.enigmail.pEpAutoUpdate", 0); // enable encryption/signing of headers like subject, from, to // 1: default: ask user at 1st time use / 0: off / 2: on pref("extensions.enigmail.protectedHeaders", 1); pref("extensions.enigmail.protectedSubjectText", ""); // do reset the "references" and "in-reply-to" headers? pref("extensions.enigmail.protectReferencesHdr", false); // tor configuration pref("extensions.enigmail.torIpAddr", "127.0.0.1"); pref("extensions.enigmail.torServicePort", "9050"); pref("extensions.enigmail.torBrowserBundlePort", "9150"); // gpg tor actions pref("extensions.enigmail.downloadKeyWithTor", false); pref("extensions.enigmail.downloadKeyRequireTor", false); pref("extensions.enigmail.searchKeyWithTor", false); pref("extensions.enigmail.searchKeyRequireTor", false); pref("extensions.enigmail.uploadKeyWithTor", false); pref("extensions.enigmail.uploadKeyRequireTor", false); pref("extensions.enigmail.refreshAllKeysWithTor", false); pref("extensions.enigmail.refreshAllKeysRequireTor", false); // Hours per week that Enigmail is available for refreshing keys // The smaller the hours available, the more often the refresh // will happen to accommodate. pref("extensions.enigmail.hoursPerWeekEnigmailIsOn", 40); // The minimum number of seconds to wait between refreshing keys. // Applied if the refresh frequence from hoursPerWeekEnigmailIsOn // goes too low pref("extensions.enigmail.refreshMinDelaySeconds", 300); // Toggle to have user keys continuously refreshed pref("extensions.enigmail.keyRefreshOn", true); // enable experimental features. // WARNING: such features may unfinished functions or tests that can break // existing functionality in Enigmail and Thunderbird! pref("extensions.enigmail.enableExperiments", false); /* Default pref values for the enigmail per-identity settings */ pref("mail.identity.default.enablePgp", false); pref("mail.identity.default.pgpkeyId", ""); pref("mail.identity.default.pgpKeyMode", 0); pref("mail.identity.default.pgpSignPlain", false); pref("mail.identity.default.pgpSignEncrypted", true); pref("mail.identity.default.defaultSigningPolicy", 0); pref("mail.identity.default.defaultEncryptionPolicy", 0); pref("mail.identity.default.openPgpHeaderMode", 0); pref("mail.identity.default.openPgpUrlName", ""); pref("mail.identity.default.pgpMimeMode", true); pref("mail.identity.default.attachPgpKey", false); pref("mail.identity.default.attachPepKey", true); pref("mail.identity.default.autoEncryptDrafts", true); pref("mail.identity.default.protectSubject", true); pref("mail.identity.default.warnWeakReply", false); pref("mail.identity.default.enablePEP", true); /* Default pref values for the enigmail per-account settings */ pref("mail.server.default.enableAutocrypt", true); // see https://autocrypt.org pref("mail.server.default.acPreferEncrypt", 0); // prefer S/MIME or PGP/MIME (0: S/MIME, 1: PGP/MIME) pref("mail.identity.default.mimePreferOpenPGP", 1); /* Other settings (change Mozilla behaviour) */ // disable flowed text by default pref("mailnews.send_plaintext_flowed", false); // disable loading of IMAP parts on demand pref("mail.server.default.mime_parts_on_demand", false); enigmail-2.0.8/package/protocolHandler.jsm000066400000000000000000000161311334302754500205630ustar00rootroot00000000000000/*global Components: false, EnigmailCore: false, XPCOMUtils: false, EnigmailData: false, EnigmailLog: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailProtocolHandler"]; const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; Cu.import("resource://gre/modules/XPCOMUtils.jsm"); Cu.import("resource://enigmail/core.jsm"); Cu.import("resource://enigmail/data.jsm"); Cu.import("resource://enigmail/log.jsm"); Cu.import("resource://enigmail/streams.jsm"); /*global EnigmailStreams: false */ Cu.import("resource://enigmail/uris.jsm"); /*global EnigmailURIs: false */ Cu.import("resource://enigmail/keyRing.jsm"); /*global EnigmailKeyRing: false */ const NS_SIMPLEURI_CONTRACTID = "@mozilla.org/network/simple-uri;1"; const NS_ENIGMAILPROTOCOLHANDLER_CONTRACTID = "@mozilla.org/network/protocol;1?name=enigmail"; const NS_ENIGMAILPROTOCOLHANDLER_CID = Components.ID("{847b3a11-7ab1-11d4-8f02-006008948af5}"); const ASS_CONTRACTID = "@mozilla.org/appshell/appShellService;1"; const WMEDIATOR_CONTRACTID = "@mozilla.org/appshell/window-mediator;1"; const nsIProtocolHandler = Ci.nsIProtocolHandler; var EC = EnigmailCore; const gDummyPKCS7 = 'Content-Type: multipart/mixed;\r\n boundary="------------060503030402050102040303\r\n\r\nThis is a multi-part message in MIME format.\r\n--------------060503030402050102040303\r\nContent-Type: application/x-pkcs7-mime\r\nContent-Transfer-Encoding: 8bit\r\n\r\n\r\n--------------060503030402050102040303\r\nContent-Type: application/x-enigmail-dummy\r\nContent-Transfer-Encoding: 8bit\r\n\r\n\r\n--------------060503030402050102040303--\r\n'; function EnigmailProtocolHandler() {} EnigmailProtocolHandler.prototype = { classDescription: "Enigmail Protocol Handler", classID: NS_ENIGMAILPROTOCOLHANDLER_CID, contractID: NS_ENIGMAILPROTOCOLHANDLER_CONTRACTID, scheme: "enigmail", defaultPort: -1, protocolFlags: nsIProtocolHandler.URI_INHERITS_SECURITY_CONTEXT | nsIProtocolHandler.URI_LOADABLE_BY_ANYONE | nsIProtocolHandler.URI_NORELATIVE | nsIProtocolHandler.URI_NOAUTH | nsIProtocolHandler.URI_OPENING_EXECUTES_SCRIPT, QueryInterface: XPCOMUtils.generateQI([nsIProtocolHandler]), newURI: function(aSpec, originCharset, aBaseURI) { EnigmailLog.DEBUG("protocolHandler.jsm: EnigmailProtocolHandler.newURI: aSpec='" + aSpec + "'\n"); // cut of any parameters potentially added to the URI; these cannot be handled if (aSpec.substr(0, 14) == "enigmail:dummy") aSpec = "enigmail:dummy"; var uri = Cc[NS_SIMPLEURI_CONTRACTID].createInstance(Ci.nsIURI); try { // TB <= 58 uri.spec = aSpec; } catch (x) { aSpec = aSpec.substr(9); let i = aSpec.indexOf("?"); try { // TB < 60 uri.scheme = "enigmail"; if (i >= 0) { uri.query = aSpec.substr(i + 1); uri.pathQueryRef = aSpec.substr(0, i); } else { uri.pathQueryRef = aSpec; } } catch (ex) { uri = uri.mutate().setScheme("enigmail").finalize(); if (i >= 0) { uri = uri.mutate().setQuery(aSpec.substr(i + 1)).finalize(); uri = uri.mutate().setPathQueryRef(aSpec.substr(0, i)).finalize(); } else { uri = uri.mutate().setPathQueryRef(aSpec).finalize(); } } } return uri; }, newChannel: function(aURI) { EnigmailLog.DEBUG("protocolHandler.jsm: EnigmailProtocolHandler.newChannel: URI='" + aURI.spec + "'\n"); var messageId = EnigmailData.extractMessageId(aURI.spec); var mimeMessageId = EnigmailData.extractMimeMessageId(aURI.spec); var contentType, contentCharset, contentData; if (messageId) { // Handle enigmail:message/... if (!EC.getEnigmailService()) { throw Components.results.NS_ERROR_FAILURE; } if (EnigmailURIs.getMessageURI(messageId)) { var messageUriObj = EnigmailURIs.getMessageURI(messageId); contentType = messageUriObj.contentType; contentCharset = messageUriObj.contentCharset; contentData = messageUriObj.contentData; EnigmailLog.DEBUG("protocolHandler.jsm: EnigmailProtocolHandler.newChannel: messageURL=" + messageUriObj.originalUrl + ", content length=" + contentData.length + ", " + contentType + ", " + contentCharset + "\n"); // do NOT delete the messageUriObj now from the list, this will be done once the message is unloaded (fix for bug 9730). } else if (mimeMessageId) { this.handleMimeMessage(mimeMessageId); } else { contentType = "text/plain"; contentCharset = ""; contentData = "Enigmail error: invalid URI " + aURI.spec; } let channel = EnigmailStreams.newStringChannel(aURI, contentType, "UTF-8", contentData); return channel; } if (aURI.spec == aURI.scheme + ":dummy") { // Dummy PKCS7 content (to access mimeEncryptedClass) return EnigmailStreams.newStringChannel(aURI, "message/rfc822", "", gDummyPKCS7); } var winName, spec; if (aURI.spec == "about:" + aURI.scheme) { // About Enigmail // winName = "about:"+enigmail; winName = "about:enigmail"; spec = "chrome://enigmail/content/enigmailAbout.xul"; } else if (aURI.spec == aURI.scheme + ":console") { // Display enigmail console messages winName = "enigmail:console"; spec = "chrome://enigmail/content/enigmailConsole.xul"; } else if (aURI.spec == aURI.scheme + ":keygen") { // Display enigmail key generation console winName = "enigmail:keygen"; spec = "chrome://enigmail/content/enigmailKeygen.xul"; } else { // Display Enigmail about page winName = "about:enigmail"; spec = "chrome://enigmail/content/enigmailAbout.xul"; } var windowManager = Cc[WMEDIATOR_CONTRACTID].getService(Ci.nsIWindowMediator); var winEnum = windowManager.getEnumerator(null); var recentWin = null; while (winEnum.hasMoreElements() && !recentWin) { var thisWin = winEnum.getNext(); if (thisWin.location.href == spec) { recentWin = thisWin; } } if (recentWin) { recentWin.focus(); } else { var appShellSvc = Cc[ASS_CONTRACTID].getService(Ci.nsIAppShellService); var domWin = appShellSvc.hiddenDOMWindow; domWin.open(spec, "_blank", "chrome,menubar,toolbar,resizable"); } throw Components.results.NS_ERROR_FAILURE; }, handleMimeMessage: function(messageId) { // EnigmailLog.DEBUG("protocolHandler.jsm: EnigmailProtocolHandler.handleMimeMessage: messageURL="+messageUriObj.originalUrl+", content length="+contentData.length+", "+contentType+", "+contentCharset+"\n"); EnigmailLog.DEBUG("protocolHandler.jsm: EnigmailProtocolHandler.handleMimeMessage: messageURL=, content length=, , \n"); }, allowPort: function(port, scheme) { // non-standard ports are not allowed return false; } }; enigmail-2.0.8/package/rng.jsm000066400000000000000000000045061334302754500162150ustar00rootroot00000000000000/*global Components: false */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; const EXPORTED_SYMBOLS = ["EnigmailRNG"]; const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; Cu.import("resource://enigmail/openpgp.jsm"); /*global EnigmailOpenPGP: false */ const SECURITY_RANDOM_GENERATOR = "@mozilla.org/security/random-generator;1"; let crypto = null; function getCrypto() { if (crypto === null) { crypto = EnigmailOpenPGP.enigmailFuncs.getCrypto(); // get the browser crypto API } return crypto; } /** * Create a string of random characters of the set A-Z a-z 0-9 with numChars length, * using the browser crypto API that gets cryptographically strong random values * * @param numChar: Number - the length of the string to return * * @return String */ function generateRandomString(numChars) { // Map of characters that are allowed to be returned const charMap = new Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); const charMapLength = charMap.length; // 62 for the set A-Z a-z 0-9 let randNumArray = new Uint16Array(numChars); getCrypto().getRandomValues(randNumArray); let randomString = ""; for (let i = 0; i < numChars; i++) { // compute the modulo to get numbers between 0 and (charMapLength - 1) // Uint16 range 65536 modulo 62 is only 2, this minimal statistical imbalance is acceptable let modulo = randNumArray[i] % charMapLength; randomString += charMap[modulo]; } return randomString; } /** * Generates a random UInt32 for use in randomising key selection and wait times between refreshing keys. * * @return random UInt32 */ function generateRandomUint32() { let randomNumber = new Uint32Array(1); getCrypto().getRandomValues(randomNumber); return randomNumber[0]; } var EnigmailRNG = { generateRandomUint32: generateRandomUint32, generateRandomString: generateRandomString }; enigmail-2.0.8/package/rules.jsm000066400000000000000000000517701334302754500165660ustar00rootroot00000000000000/*global Components: false, EnigmailFuncs: false, EnigmailLog: false, EnigmailOS: false, EnigmailFiles: false, EnigmailApp: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailRules"]; const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; Cu.import("resource://enigmail/funcs.jsm"); Cu.import("resource://enigmail/log.jsm"); Cu.import("resource://enigmail/os.jsm"); Cu.import("resource://enigmail/files.jsm"); Cu.import("resource://enigmail/app.jsm"); Cu.import("resource://enigmail/core.jsm"); /*global EnigmailCore: false */ Cu.import("resource://enigmail/constants.jsm"); /*global EnigmailConstants: false */ Cu.import("resource://enigmail/dialog.jsm"); /*global EnigmailDialog: false */ const NS_RDONLY = 0x01; const NS_WRONLY = 0x02; const NS_CREATE_FILE = 0x08; const NS_TRUNCATE = 0x20; const DEFAULT_FILE_PERMS = 0x180; // equals 0600 const rulesListHolder = { rulesList: null }; var EnigmailRules = { getRulesFile: function() { EnigmailLog.DEBUG("rules.jsm: getRulesFile()\n"); var rulesFile = EnigmailApp.getProfileDirectory(); rulesFile.append("pgprules.xml"); return rulesFile; }, loadRulesFile: function() { var flags = NS_RDONLY; var rulesFile = this.getRulesFile(); if (rulesFile.exists()) { var fileContents = EnigmailFiles.readFile(rulesFile); return this.loadRulesFromString(fileContents); } return false; }, loadRulesFromString: function(contents) { EnigmailLog.DEBUG("rules.jsm: loadRulesFromString()\n"); if (contents.length === 0 || contents.search(/^\s*$/) === 0) { return false; } var domParser; try { domParser = new DOMParser(); } catch (ex) { domParser = Cc["@mozilla.org/xmlextras/domparser;1"].createInstance(Ci.nsIDOMParser); } rulesListHolder.rulesList = domParser.parseFromString(contents, "text/xml"); return true; }, saveRulesFile: function() { EnigmailLog.DEBUG("rules.jsm: saveRulesFile()\n"); var flags = NS_WRONLY | NS_CREATE_FILE | NS_TRUNCATE; var domSerializer; try { domSerializer = new XMLSerializer(); } catch (ex) { domSerializer = Cc["@mozilla.org/xmlextras/xmlserializer;1"].createInstance(Ci.nsIDOMSerializer); } var rulesFile = this.getRulesFile(); if (rulesFile) { if (rulesListHolder.rulesList) { // the rule list is not empty -> write into file return EnigmailFiles.writeFileContents(rulesFile.path, domSerializer.serializeToString(rulesListHolder.rulesList.firstChild), DEFAULT_FILE_PERMS); } else { // empty rule list -> delete rules file try { rulesFile.remove(false); } catch (ex) {} return true; } } else { return false; } }, getRulesData: function(rulesListObj) { EnigmailLog.DEBUG("rules.jsm: getRulesData()\n"); var ret = true; if (!rulesListHolder.rulesList) { ret = this.loadRulesFile(); } if (rulesListHolder.rulesList) { rulesListObj.value = rulesListHolder.rulesList; return ret; } rulesListObj.value = null; return false; }, /** * Create new rule * * @param appendToEnd: Boolean - true: append rule at the end of the rules list * false: insert rule at the start of the rules list * @param toAddress: String - Adress(es) to match. Multiple email addresses are separated by spaces. * The matching is done on substrings, with curly brackets ({}) defining substring boundaries: * "{" is equivalent to ^ in regexp * "}" is equivalent to $ in regexp * @param keyList: String - space separated list of key IDs (starting with 0x) * If keyList === ".", use the email address * @param sign: Number - 0/1/2 as defined below * @param encrypt: Number - 0/1/2 as defined below * @param pgpMime: Number - 0/1/2 as defined below * @param flags: Number - 0: no flags / 1: negate rule * * sign/encrypt/pgpMime values: * 0: Disable the action (= "Never") * 1: Use the setting in Message Composition * 2: Enable the action (= "Always") */ addRule: function(appendToEnd, toAddress, keyList, sign, encrypt, pgpMime, flags) { EnigmailLog.DEBUG("rules.jsm: addRule()\n"); var domParser; if (!rulesListHolder.rulesList) { try { domParser = new DOMParser(); } catch (ex) { domParser = Cc["@mozilla.org/xmlextras/domparser;1"].createInstance(Ci.nsIDOMParser); } rulesListHolder.rulesList = domParser.parseFromString("", "text/xml"); } var negate = (flags & 1); var rule = rulesListHolder.rulesList.createElement("pgpRule"); rule.setAttribute("email", toAddress.toLowerCase()); rule.setAttribute("keyId", keyList); rule.setAttribute("sign", sign); rule.setAttribute("encrypt", encrypt); rule.setAttribute("pgpMime", pgpMime); rule.setAttribute("negateRule", flags); var origFirstChild = rulesListHolder.rulesList.firstChild.firstChild; if (origFirstChild && (!appendToEnd)) { rulesListHolder.rulesList.firstChild.insertBefore(rule, origFirstChild); rulesListHolder.rulesList.firstChild.insertBefore(rulesListHolder.rulesList.createTextNode(EnigmailOS.isDosLike ? "\r\n" : "\n"), origFirstChild); } else { rulesListHolder.rulesList.firstChild.appendChild(rule); rulesListHolder.rulesList.firstChild.appendChild(rulesListHolder.rulesList.createTextNode(EnigmailOS.isDosLike ? "\r\n" : "\n")); } }, /** * Create new rule or update existing rule if the rule already exists. * The key to decide if the rule exists is the email address (must match 1:1) * * @param ruleObj: Object with attributes {keyList, sign, encrypt, pgpMime, flags} * @return: Number: 0 - no update / 1 - rule updated / 2 - new rule created */ insertOrUpdateRule: function(ruleObj) { if ((!("email" in ruleObj)) || ruleObj.email.length === 0) return 0; let node = this.getRuleByEmail(ruleObj.email); if (node) { node.setAttribute("keyId", ruleObj.keyList); node.setAttribute("sign", ruleObj.sign); node.setAttribute("encrypt", ruleObj.encrypt); node.setAttribute("pgpMime", ruleObj.pgpMime); node.setAttribute("negateRule", ruleObj.flags); this.saveRulesFile(); return 1; } // no rule matched, let's add the rule at the start of the list this.addRule(false, ruleObj.email, ruleObj.keyList, ruleObj.sign, ruleObj.encrypt, ruleObj.pgpMime, ruleObj.flags); this.saveRulesFile(); return 2; }, /** * Get a rule if it matches exactly one email address * * @param emailAddr: String - emailAddress to search * * @return Object: node object (DOM object) */ getRuleByEmail: function(emailAddr) { emailAddr = emailAddr.toLowerCase(); if (emailAddr.search(/^\{.*\}$/) < 0) { emailAddr = "{" + emailAddr + "}"; } let rulesListObj = {}; this.getRulesData(rulesListObj); let rulesList = rulesListObj.value; if (rulesList) { for (let node = rulesList.firstChild.firstChild; node; node = node.nextSibling) { if (node.tagName == "pgpRule") { try { let nodeEmail = node.getAttribute("email"); if (!nodeEmail) { continue; } if (nodeEmail.toLowerCase() === emailAddr) { return node; } } catch (ex) { EnigmailLog.DEBUG("rules.jsm: getRuleByEmail(): ignore exception: " + ex.description + "\n"); } } } } return null; }, clearRules: function() { rulesListHolder.rulesList = null; }, DEBUG_EmailList: function(name, list) { EnigmailLog.DEBUG(" " + name + ":\n"); for (let i = 0; i < list.length; i++) { let elem = list[i]; let str = " [" + i + "]: "; if (elem.orig) { str += "orig: '" + elem.orig + "' "; } if (elem.addr) { str += "addr: '" + elem.addr + "' "; } if (elem.keys) { str += "keys: '" + elem.keys + "' "; } EnigmailLog.DEBUG(str + "\n"); } }, /** * process resulting sign/encryp/pgpMime mode for passed string of email addresses and * use rules and interactive rule dialog to replace emailAddrsStr by known keys * Input parameters: * @emailAddrsStr: comma and space separated string of addresses to process * @startDialogForMissingKeys: true: start dialog for emails without key(s) * Output parameters: * @matchedKeysObj.value: comma separated string of matched keys AND email addresses for which no key was found (or "") * @matchedKeysObj.addrKeysList: all email/keys mappings (array of objects with addr as string and keys as comma separated string) * (does NOT contain emails for which no key was found) * @matchedKeysObj.addrNoKeyList: list of emails that don't have a key according to rules * @flagsObj: return value for combined sign/encrype/pgpMime mode * values might be: 0='never', 1='maybe', 2='always', 3='conflict' * * @return: false if error occurred or processing was canceled */ mapAddrsToKeys: function(emailAddrsStr, startDialogForMissingKeys, window, matchedKeysObj, flagsObj) { EnigmailLog.DEBUG("rules.jsm: mapAddrsToKeys(): emailAddrsStr=\"" + emailAddrsStr + "\" startDialogForMissingKeys=" + startDialogForMissingKeys + "\n"); let enigmailSvc = EnigmailCore.getService(); if (!enigmailSvc) { EnigmailLog.DEBUG("EnigmailCore Service is down\n"); return false; } // initialize return value and the helper variables for them: matchedKeysObj.value = ""; flagsObj.value = false; let flags = {}; // object to be able to modify flags in subfunction flags.sign = EnigmailConstants.ENIG_UNDEF; // default sign flag is: maybe flags.encrypt = EnigmailConstants.ENIG_UNDEF; // default encrypt flag is: maybe flags.pgpMime = EnigmailConstants.ENIG_UNDEF; // default pgpMime flag is: maybe // create openList: list of addresses not processed by rules yet // - each entry has // - orig: the original full email address // - addr: the lowercased pure email address to check against rules and keys // - elements will be moved // - to addrKeysList if a matching rule with keys was found // - to addrNoKeyList if a rule with "do not process further rules" ("." as key) applies let emailAddrList = ("," + emailAddrsStr + ",").split(/\s*,\s*/); let openList = []; for (let i = 0; i < emailAddrList.length; ++i) { let orig = emailAddrList[i]; if (orig) { let addr = null; try { addr = EnigmailFuncs.stripEmail(orig.toLowerCase()); } catch (ex) {} if (addr) { let elem = { orig: orig, addr: addr }; openList.push(elem); } } } //this.DEBUG_EmailList("openList", openList); let addrKeysList = []; // NEW: list of found email addresses and their associated keys let addrNoKeyList = []; // NEW: list of email addresses that have no key according to rules // process recipient rules let rulesListObj = {}; if (this.getRulesData(rulesListObj)) { let rulesList = rulesListObj.value; if (rulesList.firstChild.nodeName == "parsererror") { EnigmailDialog.alert(window, "Invalid pgprules.xml file:\n" + rulesList.firstChild.textContent); return false; } EnigmailLog.DEBUG("rules.jsm: mapAddrsToKeys(): rules successfully loaded; now process them\n"); // go through all rules to find match with email addresses // - note: only if the key field has a value, an address is done with processing for (let node = rulesList.firstChild.firstChild; node; node = node.nextSibling) { if (node.tagName == "pgpRule") { try { let rule = {}; rule.email = node.getAttribute("email"); if (!rule.email) { continue; } rule.negate = false; if (node.getAttribute("negateRule")) { rule.negate = Number(node.getAttribute("negateRule")); } if (!rule.negate) { rule.keyId = node.getAttribute("keyId"); rule.sign = node.getAttribute("sign"); rule.encrypt = node.getAttribute("encrypt"); rule.pgpMime = node.getAttribute("pgpMime"); this.mapRuleToKeys(rule, openList, flags, addrKeysList, addrNoKeyList); } // no negate rule handling (turned off in dialog) } catch (ex) { EnigmailLog.DEBUG("rules.jsm: mapAddrsToKeys(): ignore exception: " + ex.description + "\n"); } } } } // NOTE: here we have // - openList: the addresses not having any key assigned yet // (and not marked as don't process any other rule) // - addresses with "don't process other rules" are in addrNoKeyList //this.DEBUG_EmailList("openList", openList); //this.DEBUG_EmailList("addrKeysList", addrKeysList); //this.DEBUG_EmailList("addrnoKeyList", addrnoKeyList); // if requested: start dialog to add new rule for each missing key if (startDialogForMissingKeys) { let inputObj = {}; let resultObj = {}; for (let i = 0; i < openList.length; i++) { let theAddr = openList[i].addr; // start dialog only if the email address contains a @ or no 0x at the beginning: // - reason: newsgroups have neither @ nor 0x if (theAddr.indexOf("@") != -1 || theAddr.indexOf("0x") !== 0) { inputObj.toAddress = "{" + theAddr + "}"; inputObj.options = ""; inputObj.command = "add"; window.openDialog("chrome://enigmail/content/enigmailSingleRcptSettings.xul", "", "dialog,modal,centerscreen,resizable", inputObj, resultObj); if (resultObj.cancelled === true) { return false; } if (!resultObj.negate) { this.mapRuleToKeys(resultObj, openList, flags, addrKeysList, addrNoKeyList); } // no negate rule handling (turned off in dialog) } } } // return value of OLD interface: // IFF we found keys, return keys AND unprocessed addresses in matchedKeysObj.value as comma-separated string if (addrKeysList.length > 0) { let tmpList = addrKeysList.concat(addrNoKeyList).concat(openList); matchedKeysObj.value = tmpList[0].keys; for (let idx = 1; idx < tmpList.length; ++idx) { if (tmpList[idx].keys) { matchedKeysObj.value += ", " + tmpList[idx].keys; } else { matchedKeysObj.value += ", " + tmpList[idx].addr; } } // sort key list and make it unique? } // return value of NEW interface: // return // - in matchedKeysObj.addrKeysList: found email/keys mappings (array of objects with addr and keys) // - in matchedKeysObj.addrNoKeyList: list of unprocessed emails matchedKeysObj.addrKeysList = addrKeysList; if (openList.length > 0) { matchedKeysObj.addrNoKeyList = addrNoKeyList.concat(openList); } else { matchedKeysObj.addrNoKeyList = addrNoKeyList; } // return result from combining flags flagsObj.sign = flags.sign; flagsObj.encrypt = flags.encrypt; flagsObj.pgpMime = flags.pgpMime; flagsObj.value = true; EnigmailLog.DEBUG(" found keys:\n"); for (let i = 0; i < matchedKeysObj.addrKeysList.length; i++) { EnigmailLog.DEBUG(" " + matchedKeysObj.addrKeysList[i].addr + ": " + matchedKeysObj.addrKeysList[i].keys + "\n"); } EnigmailLog.DEBUG(" addresses without keys:\n"); for (let i = 0; i < matchedKeysObj.addrNoKeyList.length; i++) { EnigmailLog.DEBUG(" " + matchedKeysObj.addrNoKeyList[i].addr + "\n"); } EnigmailLog.DEBUG(" old returned value:\n"); EnigmailLog.DEBUG(" " + matchedKeysObj.value + "\n"); return true; }, mapRuleToKeys: function(rule, openList, flags, addrKeysList, addrNoKeyList) { //EnigmailLog.DEBUG("rules.jsm: mapRuleToKeys() rule.email='" + rule.email + "'\n"); let ruleList = rule.email.toLowerCase().split(/[ ,;]+/); for (let ruleIndex = 0; ruleIndex < ruleList.length; ++ruleIndex) { let ruleEmailElem = ruleList[ruleIndex]; // ruleEmailElem has format such as '{name@qqq.de}' or '@qqq' or '{name' or '@qqq.de}' //EnigmailLog.DEBUG(" process ruleElem: '" + ruleEmailElem + "'\n"); for (let openIndex = 0; openIndex < openList.length; ++openIndex) { let addr = openList[openIndex].addr; // search with { and } around because these are used a begin and end markers in the rules: let idx = ('{' + addr + '}').indexOf(ruleEmailElem); if (idx < 0) { addr = EnigmailConstants.AC_RULE_PREFIX + addr; idx = ('{' + addr + '}').indexOf(ruleEmailElem); } if (idx >= 0) { if (ruleEmailElem == rule.email) { EnigmailLog.DEBUG("rules.jsm: mapRuleToKeys(): for '" + addr + "' ('" + openList[openIndex].orig + "') found matching rule element '" + ruleEmailElem + "'\n"); } else { EnigmailLog.DEBUG("rules.jsm: mapRuleToKeys(): for '" + addr + "' ('" + openList[openIndex].orig + "') found matching rule element '" + ruleEmailElem + "' from '" + rule.email + "'\n"); } // process rule: // NOTE: rule.keyId might be: // - keys: => assign keys to all matching emails // and mark matching address as no longer open // - ".": signals "Do not check further rules for the matching address" // => mark all matching address as no longer open, but assign no keys // (thus, add it to the addrNoKeyList) // - empty: Either if "Continue with next rule for the matching address" // OR: if "Use the following OpenPGP keys:" with no keys and // warning (will turn off encryption) acknowledged // => then we only process the flags // process sign/encrypt/ppgMime settings flags.sign = this.combineFlagValues(flags.sign, Number(rule.sign)); flags.encrypt = this.combineFlagValues(flags.encrypt, Number(rule.encrypt)); flags.pgpMime = this.combineFlagValues(flags.pgpMime, Number(rule.pgpMime)); if (rule.keyId) { // move found address from openAdresses to corresponding list (with keys added) let elem = openList.splice(openIndex, 1)[0]; --openIndex; // IMPORTANT because we remove element in the array we iterate on if (rule.keyId != ".") { // keys exist: assign keys as comma-separated string let ids = rule.keyId.replace(/[ ,;]+/g, ", "); elem.keys = ids; addrKeysList.push(elem); } else { // '.': no further rule processing and no key: addr was (finally) processed but without any key addrNoKeyList.push(elem); } } } } } }, /** * check for the attribute of type "sign"/"encrypt"/"pgpMime" of the passed node * and combine its value with oldVal and check for conflicts * values might be: 0='never', 1='maybe', 2='always', 3='conflict' * @oldVal: original input value * @newVal: new value to combine with * @return: result value after applying the rule (0/1/2) * and combining it with oldVal */ combineFlagValues: function(oldVal, newVal) { //EnigmailLog.DEBUG("rules.jsm: combineFlagValues(): oldVal=" + oldVal + " newVal=" + newVal + "\n"); // conflict remains conflict if (oldVal === EnigmailConstants.ENIG_CONFLICT) { return EnigmailConstants.ENIG_CONFLICT; } // 'never' and 'always' triggers conflict: if ((oldVal === EnigmailConstants.ENIG_NEVER && newVal === EnigmailConstants.ENIG_ALWAYS) || (oldVal === EnigmailConstants.ENIG_ALWAYS && newVal === EnigmailConstants.ENIG_NEVER)) { return EnigmailConstants.ENIG_CONFLICT; } // if there is any 'never' return 'never' // - thus: 'never' and 'maybe' => 'never' if (oldVal === EnigmailConstants.ENIG_NEVER || newVal === EnigmailConstants.ENIG_NEVER) { return EnigmailConstants.ENIG_NEVER; } // if there is any 'always' return 'always' // - thus: 'always' and 'maybe' => 'always' if (oldVal === EnigmailConstants.ENIG_ALWAYS || newVal === EnigmailConstants.ENIG_ALWAYS) { return EnigmailConstants.ENIG_ALWAYS; } // here, both values are 'maybe', which we return then return EnigmailConstants.ENIG_UNDEF; // maybe } }; enigmail-2.0.8/package/send.jsm000066400000000000000000000121241334302754500163530ustar00rootroot00000000000000/*global Components: false */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailSend"]; const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ Cu.import("resource://enigmail/files.jsm"); /*global EnigmailFiles: false */ Cu.import("resource://enigmail/stdlib.jsm"); /*global EnigmailStdlib: false */ Cu.import("resource://enigmail/funcs.jsm"); /*global EnigmailFuncs: false */ Cu.import("resource://gre/modules/Services.jsm"); /*global Services: false */ Cu.import("resource://enigmail/rng.jsm"); /*global EnigmailRNG: false */ Cu.import("resource:///modules/mailServices.js"); /*global MailServices: false */ var EnigmailSend = { /** * Send out an email * * @param msgData - String: complete MIME string of email (including all headers etc.) * @param compFields - Object: compose fields (nsIMsgCompFields) * @param listener - Object: progress listener (nsIMsgSendListener) * * @return Boolean - true: everything was OK to send the message */ sendMessage: function(msgData, compFields, listener = null) { EnigmailLog.DEBUG("EnigmailSend.sendMessage()\n"); let tmpFile, msgIdentity; try { tmpFile = EnigmailFiles.getTempDirObj(); tmpFile.append("message.eml"); tmpFile.createUnique(0, 384); // == 0600, octal is deprecated } catch (ex) { return false; } EnigmailFiles.writeFileContents(tmpFile, msgData); EnigmailLog.DEBUG("EnigmailSend.sendMessage: wrote file: " + tmpFile.path + "\n"); try { msgIdentity = EnigmailStdlib.getIdentityForEmail(compFields.from); } catch (ex) { msgIdentity = EnigmailStdlib.getDefaultIdentity(); } if (!msgIdentity) { return false; } EnigmailLog.DEBUG("EnigmailSend.sendMessage: identity key: " + msgIdentity.identity.key + "\n"); let acct = EnigmailFuncs.getAccountForIdentity(msgIdentity.identity); if (!acct) return false; EnigmailLog.DEBUG("EnigmailSend.sendMessage: account key: " + acct.key + "\n"); let msgSend = Cc["@mozilla.org/messengercompose/send;1"].createInstance(Ci.nsIMsgSend); msgSend.sendMessageFile(msgIdentity.identity, acct.key, compFields, tmpFile, true, // Delete File On Completion false, (Services.io.offline ? Ci.nsIMsgSend.nsMsgQueueForLater : Ci.nsIMsgSend.nsMsgDeliverNow), null, listener, null, ""); // password return true; }, /** * Send message (simplified API) * * @param aParams: Object - * - identity: Object - The identity the user picked to send the message * - to: String - The recipients. This is a comma-separated list of * valid email addresses that must be escaped already. You probably want to use * nsIMsgHeaderParser.MakeFullAddress to deal with names that contain commas. * - cc (optional) Same remark. * - bcc (optional) Same remark. * - returnReceipt (optional) Boolean: ask for a receipt * - receiptType (optional) Number: default: take from identity * - requestDsn (optional) Boolean: request a Delivery Status Notification * - securityInfo (optional) * * @param body: complete message source * @param callbackFunc: function(Boolean) - return true if message was sent successfully * false otherwise * * @return Boolean - true: everything was OK to send the message */ simpleSendMessage: function(aParams, body, callbackFunc) { EnigmailLog.DEBUG("EnigmailSend.simpleSendMessage()\n"); let fields = Cc["@mozilla.org/messengercompose/composefields;1"] .createInstance(Ci.nsIMsgCompFields); let identity = aParams.identity; fields.from = identity.email; fields.to = aParams.to; if ("cc" in aParams) fields.cc = aParams.cc; if ("bcc" in aParams) fields.bcc = aParams.bcc; fields.returnReceipt = ("returnReceipt" in aParams) ? aParams.returnReceipt : identity.requestReturnReceipt; fields.receiptHeaderType = ("receiptType" in aParams) ? aParams.receiptType : identity.receiptHeaderType; fields.DSN = ("requestDsn" in aParams) ? aParams.requestDsn : identity.requestDSN; if ("securityInfo" in aParams) fields.securityInfo = aParams.securityInfo; fields.messageId = EnigmailRNG.generateRandomString(27) + "-enigmail"; body = "Message-Id: " + fields.messageId + "\r\n" + body; let listener = { onStartSending: function() {}, onProgress: function() {}, onStatus: function() {}, onGetDraftFolderURI: function() {}, onStopSending: function(aMsgID, aStatus, aMsg, aReturnFile) { if (callbackFunc) callbackFunc(true); }, onSendNotPerformed: function(aMsgID, aStatus) { if (callbackFunc) callbackFunc(false); } }; return this.sendMessage(body, fields, listener); } }; enigmail-2.0.8/package/singletons.jsm000066400000000000000000000013311334302754500176050ustar00rootroot00000000000000/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailSingletons"]; var EnigmailSingletons = { // handle to most recent message reader window messageReader: null, // information about the last PGP/MIME decrpyted message (pEp and mimeDecrypt) lastDecryptedMessage: {}, clearLastDecryptedMessage: function() { let lm = this.lastDecryptedMessage; lm.lastMessageData = ""; lm.lastMessageURI = null; lm.lastStatus = {}; lm.lastPepStatus = {}; } }; EnigmailSingletons.clearLastDecryptedMessage(); enigmail-2.0.8/package/socks5Proxy.jsm000066400000000000000000000074761334302754500177110ustar00rootroot00000000000000/*global Components: false */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; const EXPORTED_SYMBOLS = ["EnigmailSocks5Proxy"]; const CC = Components.Constructor; const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; Cu.import("resource://gre/modules/XPCOMUtils.jsm"); /*global XPCOMUtils:false */ Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false*/ Cu.import("resource://enigmail/lazy.jsm"); /*global EnigmailLazy: false */ const getEnigmailPrefs = EnigmailLazy.loader("enigmail/prefs.jsm", "EnigmailPrefs"); const CHECK_TOR_URI = "https://check.torproject.org/api/ip"; const EXPECTED_TOR_EXISTS_RESPONSE = "\"IsTor\":true"; const TOR_IP_ADDR_PREF = "torIpAddr"; const CONNECTION_FLAGS = 0; const SECONDS_TO_WAIT_FOR_CONNECTION = -1; function createCheckTorURIChannel() { EnigmailLog.DEBUG("socks5proxy.jsm: createCheckTorURIChannel()\n"); const ioservice = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService); return ioservice.newChannel2(CHECK_TOR_URI, "UTF-8", null, null, null, null, null, null); } function protocolProxyService() { return Cc["@mozilla.org/network/protocol-proxy-service;1"].getService(Ci.nsIProtocolProxyService); } function createScriptableInputStream(inputStream) { return CC("@mozilla.org/scriptableinputstream;1", "nsIScriptableInputStream", "init")(inputStream); } function buildListener(hasFoundTor, isDoneChecking) { EnigmailLog.DEBUG("socks5proxy.jsm: buildListener()\n"); const listener = { onStartRequest: function(request, context) {}, onStopRequest: function(request, context, statusCode) { isDoneChecking(); }, onDataAvailable: function(request, context, inputStream, offset, count) { const response = createScriptableInputStream(inputStream).read(count); hasFoundTor(response.indexOf(EXPECTED_TOR_EXISTS_RESPONSE) !== -1); }, QueryInterface: XPCOMUtils.generateQI([Ci.nsIRequestObserver, Ci.nsIStreamListener]) }; return listener; } function getCurrentThread() { return Cc["@mozilla.org/thread-manager;1"].getService(Ci.nsIThreadManager).currentThread; } function filterWith(portPref) { EnigmailLog.DEBUG("socks5proxy.jsm: filterWith()\n"); const port = getEnigmailPrefs().getPref(portPref); const failoverProxy = null; return { applyFilter: function(proxyService, uri, proxyInfo) { return proxyService.newProxyInfo("socks", getEnigmailPrefs().getPref(TOR_IP_ADDR_PREF), port, CONNECTION_FLAGS, SECONDS_TO_WAIT_FOR_CONNECTION, failoverProxy); }, QueryInterface: XPCOMUtils.generateQI([Ci.nsIProtocolProxyFilter]) }; } /** * Checks if Tor is running * * @param portPref - string: the preferences key of either torServicePort or torBrowserBundlePort * * @return true if a running Tor service has been found, false otherwise */ function checkTorExists(portPref) { EnigmailLog.DEBUG("socks5proxy.jsm: checkTorExists()\n"); const pps = protocolProxyService().registerFilter(filterWith(portPref), 1); let doneCheckingTor = false; let foundTor = false; function isDoneChecking() { doneCheckingTor = true; } function hasFoundTor(val) { foundTor = val; } const listener = buildListener(hasFoundTor, isDoneChecking); const sharedContext = null; const ioservice = createCheckTorURIChannel().asyncOpen(listener, sharedContext); const currentThread = getCurrentThread(); while (!doneCheckingTor) { currentThread.processNextEvent(true); } return foundTor; } var EnigmailSocks5Proxy = { checkTorExists: checkTorExists, torIpAddr: function() { EnigmailLog.DEBUG("socks5proxy.jsm: torIpAddr()\n"); return getEnigmailPrefs().getPref(TOR_IP_ADDR_PREF); } }; enigmail-2.0.8/package/stdlib.jsm000066400000000000000000000071701334302754500167100ustar00rootroot00000000000000/*global Components: false */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ /** * Wrapper library for TB-stdlib to avoid naming conflicts */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailStdlib"]; const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; Cu.import("resource://enigmail/stdlib/compose.jsm"); /* global composeInIframe: false, getEditorForIframe, quoteMsgHdr: false, citeString, htmlToPlainText: false, simpleWrap, plainTextToHtml: false, replyAllParams, determineComposeHtml: false, composeMessageTo, getSignatureContentsForAccount: false */ Cu.import("resource://enigmail/stdlib/misc.jsm"); /* global gIdentities: false, fillIdentities: false, getIdentities: false, getDefaultIdentity: false, getIdentityForEmail, range: false, MixIn: false, combine: false, entries, NS_FAILED: false, NS_SUCCEEDED, dateAsInMessageList: false, escapeHtml: false, sanitize: false, parseMimeLine, encodeUrlParameters: false, decodeUrlParameters, systemCharset, isOSX: false, isWindows: false, isAccel: false hasConfiguredAccounts: false */ Cu.import("resource://enigmail/stdlib/msgHdrUtils.jsm"); /* global msgHdrToMessageBody: false, msgHdrToNeckoURL: false, msgHdrGetTags: false, msgUriToMsgHdr, msgHdrGetUri: false, msgHdrFromNeckoUrl: false, msgHdrSetTags: false, msgHdrIsDraft: false, msgHdrIsSent: false, msgHdrIsArchive: false, msgHdrIsInbox: false, msgHdrIsRss: false, msgHdrIsNntp: false, msgHdrIsJunk: false, msgHdrsMarkAsRead: false, msgHdrsArchive: false, msgHdrsDelete, getMail3Pane: false, msgHdrGetHeaders: false, msgHdrsModifyRaw */ var EnigmailStdlib = { // compose.jsm 'composeInIframe': composeInIframe, 'getEditorForIframe': getEditorForIframe, 'quoteMsgHdr': quoteMsgHdr, 'citeString': citeString, 'htmlToPlainText': htmlToPlainText, 'simpleWrap': simpleWrap, 'plainTextToHtml': plainTextToHtml, 'replyAllParams': replyAllParams, 'determineComposeHtml': determineComposeHtml, 'composeMessageTo': composeMessageTo, 'getSignatureContentsForAccount': getSignatureContentsForAccount, // misc.jsm 'gIdentities': gIdentities, 'fillIdentities': fillIdentities, 'getIdentities': getIdentities, 'getDefaultIdentity': getDefaultIdentity, 'getIdentityForEmail': getIdentityForEmail, 'hasConfiguredAccounts': hasConfiguredAccounts, 'range': range, 'MixIn': MixIn, 'combine': combine, 'entries': entries, 'NS_FAILED': NS_FAILED, 'NS_SUCCEEDED': NS_SUCCEEDED, 'dateAsInMessageList': dateAsInMessageList, 'escapeHtml': escapeHtml, 'sanitize': sanitize, 'parseMimeLine': parseMimeLine, 'encodeUrlParameters': encodeUrlParameters, 'decodeUrlParameters': decodeUrlParameters, 'systemCharset': systemCharset, 'isOSX': isOSX, 'isWindows': isWindows, 'isAccel': isAccel, // msgHdrUtils.jsm 'msgHdrToMessageBody': msgHdrToMessageBody, 'msgHdrToNeckoURL': msgHdrToNeckoURL, 'msgHdrGetTags': msgHdrGetTags, 'msgUriToMsgHdr': msgUriToMsgHdr, 'msgHdrGetUri': msgHdrGetUri, 'msgHdrFromNeckoUrl': msgHdrFromNeckoUrl, 'msgHdrSetTags': msgHdrSetTags, 'msgHdrIsDraft': msgHdrIsDraft, 'msgHdrIsSent': msgHdrIsSent, 'msgHdrIsArchive': msgHdrIsArchive, 'msgHdrIsInbox': msgHdrIsInbox, 'msgHdrIsRss': msgHdrIsRss, 'msgHdrIsNntp': msgHdrIsNntp, 'msgHdrIsJunk': msgHdrIsJunk, 'msgHdrsMarkAsRead': msgHdrsMarkAsRead, 'msgHdrsArchive': msgHdrsArchive, 'msgHdrsDelete': msgHdrsDelete, 'getMail3Pane': getMail3Pane, 'msgHdrGetHeaders': msgHdrGetHeaders, 'msgHdrsModifyRaw': msgHdrsModifyRaw }; enigmail-2.0.8/package/streams.jsm000066400000000000000000000143511334302754500171040ustar00rootroot00000000000000/*global Components: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailStreams"]; const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; Cu.import("resource://gre/modules/XPCOMUtils.jsm"); /*global XPCOMUtils: false */ Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ Cu.import("resource://enigmail/timer.jsm"); /*global EnigmailTimer: false */ Cu.import("resource://gre/modules/Services.jsm"); /* global Services: false */ const NS_STRING_INPUT_STREAM_CONTRACTID = "@mozilla.org/io/string-input-stream;1"; const NS_INPUT_STREAM_CHNL_CONTRACTID = "@mozilla.org/network/input-stream-channel;1"; const IOSERVICE_CONTRACTID = "@mozilla.org/network/io-service;1"; var EnigmailStreams = { /** * Create a new channel from a URL. * * @param url: String - URL specification * * @return: channel */ createChannel: function(url) { let ioServ = Cc[IOSERVICE_CONTRACTID].getService(Ci.nsIIOService); let channel; if ("newChannel2" in ioServ) { // TB >= 48 let loadingPrincipal = Services.scriptSecurityManager.getSystemPrincipal(); channel = ioServ.newChannel2(url, null, null, null, loadingPrincipal, null, 0, Ci.nsIContentPolicy.TYPE_DOCUMENT); } else { channel = ioServ.newChannel(url, null, null); } return channel; }, /** * Create a new channel from a URI. * * @param uri: Object - nsIURI * * @return: channel */ createChannelFromURI: function(uri) { let ioServ = Cc[IOSERVICE_CONTRACTID].getService(Ci.nsIIOService); let channel; if ("newChannelFromURI2" in ioServ) { // TB >= 48 let loadingPrincipal = Services.scriptSecurityManager.getSystemPrincipal(); channel = ioServ.newChannelFromURI2(uri, null, loadingPrincipal, null, 0, Ci.nsIContentPolicy.TYPE_DOCUMENT); } else { channel = ioServ.newChannelFromURI(uri); } return channel; }, /** * create an nsIStreamListener object to read String data from an nsIInputStream * * @onStopCallback: Function - function(data) that is called when the stream has stopped * string data is passed as |data| * * @return: the nsIStreamListener to pass to the stream */ newStringStreamListener: function(onStopCallback) { EnigmailLog.DEBUG("enigmailCommon.jsm: newStreamListener\n"); return { data: "", inStream: Cc["@mozilla.org/binaryinputstream;1"].createInstance(Ci.nsIBinaryInputStream), _onStopCallback: onStopCallback, QueryInterface: XPCOMUtils.generateQI([Ci.nsIStreamListener, Ci.nsIRequestObserver]), onStartRequest: function(channel, ctxt) { // EnigmailLog.DEBUG("enigmailCommon.jsm: stringListener.onStartRequest\n"); }, onStopRequest: function(channel, ctxt, status) { // EnigmailLog.DEBUG("enigmailCommon.jsm: stringListener.onStopRequest: "+ctxt+"\n"); this.inStream = null; var cbFunc = this._onStopCallback; var cbData = this.data; EnigmailTimer.setTimeout(function _cb() { cbFunc(cbData); }); }, onDataAvailable: function(req, sup, stream, offset, count) { // get data from stream // EnigmailLog.DEBUG("enigmailCommon.jsm: stringListener.onDataAvailable: "+count+"\n"); this.inStream.setInputStream(stream); this.data += this.inStream.readBytes(count); } }; }, /** * create a nsIInputStream object that is fed with string data * * @uri: nsIURI - object representing the URI that will deliver the data * @contentType: String - the content type as specified in nsIChannel * @contentCharset: String - the character set; automatically determined if null * @data: String - the data to feed to the stream * * @return nsIChannel object */ newStringChannel: function(uri, contentType, contentCharset, data) { EnigmailLog.DEBUG("enigmailCommon.jsm: newStringChannel\n"); const inputStream = Cc[NS_STRING_INPUT_STREAM_CONTRACTID].createInstance(Ci.nsIStringInputStream); inputStream.setData(data, -1); if (!contentCharset || contentCharset.length === 0) { const ioServ = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService); const netUtil = ioServ.QueryInterface(Ci.nsINetUtil); const newCharset = {}; const hadCharset = {}; let mimeType; try { // Gecko >= 43 mimeType = netUtil.parseResponseContentType(contentType, newCharset, hadCharset); } catch (ex) { // Gecko < 43 mimeType = netUtil.parseContentType(contentType, newCharset, hadCharset); } contentCharset = newCharset.value; } const isc = Cc[NS_INPUT_STREAM_CHNL_CONTRACTID].createInstance(Ci.nsIInputStreamChannel); isc.setURI(uri); isc.contentStream = inputStream; const chan = isc.QueryInterface(Ci.nsIChannel); if (contentType && contentType.length) chan.contentType = contentType; if (contentCharset && contentCharset.length) chan.contentCharset = contentCharset; EnigmailLog.DEBUG("enigmailCommon.jsm: newStringChannel - done\n"); return chan; }, newFileChannel: function(uri, file, contentType, deleteOnClose) { EnigmailLog.DEBUG("enigmailCommon.jsm: newFileChannel for '" + file.path + "'\n"); let inputStream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream); let behaviorFlags = Ci.nsIFileInputStream.CLOSE_ON_EOF; if (deleteOnClose) { behaviorFlags |= Ci.nsIFileInputStream.DELETE_ON_CLOSE; } const ioFlags = 0x01; // readonly const perm = 0; inputStream.init(file, ioFlags, perm, behaviorFlags); const isc = Cc[NS_INPUT_STREAM_CHNL_CONTRACTID].createInstance(Ci.nsIInputStreamChannel); isc.setURI(uri); isc.contentStream = inputStream; const chan = isc.QueryInterface(Ci.nsIChannel); if (contentType && contentType.length) chan.contentType = contentType; EnigmailLog.DEBUG("enigmailCommon.jsm: newStringChannel - done\n"); return chan; } }; enigmail-2.0.8/package/system.jsm000066400000000000000000000165021334302754500167520ustar00rootroot00000000000000/*global Components: false */ /*jshint -W097 */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailSystem"]; const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; Cu.import("resource://gre/modules/ctypes.jsm"); /* global ctypes: false */ Cu.import("resource://enigmail/os.jsm"); /* global EnigmailOS: false */ Cu.import("resource://enigmail/data.jsm"); /* global EnigmailData: false */ Cu.import("resource://enigmail/subprocess.jsm"); /* global subprocess: false */ Cu.import("resource://enigmail/log.jsm"); /* global EnigmailLog: false */ Cu.import("resource://enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ var gKernel32Dll = null; var gSystemCharset = null; const CODEPAGE_MAPPING = { "437": "ISO-8859-1", "855": "IBM855", "866": "IBM866", "874": "ISO-8859-11", "932": "Shift_JIS", "936": "GB2312", "950": "BIG5", "1200": "UTF-16LE", "1201": "UTF-16BE", "1250": "windows-1250", "1251": "windows-1251", "1252": "windows-1252", "1253": "windows-1253", "1254": "windows-1254", "1255": "windows-1255", "1256": "windows-1256", "1257": "windows-1257", "1258": "windows-1258", "20866": "KOI8-R", "20932": "EUC-JP", "28591": "ISO-8859-1", "28592": "ISO-8859-2", "28593": "ISO-8859-3", "28594": "ISO-8859-4", "28595": "ISO-8859-5", "28596": "ISO-8859-6", "28597": "ISO-8859-7", "28598": "ISO-8859-8", "28599": "ISO-8859-9", "28603": "ISO-8859-13", "28605": "ISO-8859-15", "38598": "ISO-8859-8", "50220": "ISO-2022-JP", "50221": "ISO-2022-JP", "50222": "ISO-2022-JP", "50225": "ISO-2022-KR", "50227": "ISO-2022-CN", "50229": "ISO-2022-CN", "51932": "EUC-JP", "51949": "EUC-KR", "52936": "HZ-GB2312", "65000": "UTF-7", "65001": "UTF-8" }; /** * Get the default codepage that is set on Windows (which equals to the chatset of the console output of gpg) */ function getWindowsCopdepage() { EnigmailLog.DEBUG("system.jsm: getWindowsCopdepage\n"); if (EnigmailPrefs.getPref("gpgLocaleEn")) { return "437"; } let output = ""; let env = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment); let sysRoot = env.get("SystemRoot"); if (!sysRoot || sysRoot.length === 0) { sysRoot = "C:\\windows"; } try { let p = subprocess.call({ command: sysRoot + "\\system32\\chcp.com", arguments: [], environment: [], charset: null, mergeStderr: false, stdout: function(data) { output += data; } }); p.wait(); output = output.replace(/[\r\n]/g, ""); output = output.replace(/^(.*[: ])([0-9]+)([^0-9].*)?$/, "$2"); } catch (ex) { output = "437"; } return output; } /** * Get the charset defined with LC_ALL or locale. That's the charset used by gpg console output */ function getUnixCharset() { EnigmailLog.DEBUG("system.jsm: getUnixCharset\n"); let env = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment); let lc = env.get("LC_ALL"); if (lc.length === 0) { let places = [ "/usr/bin/locale", "/usr/local/bin/locale", "/opt/bin/locale" ]; var localeFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile); for (let i = 0; i < places.length; i++) { localeFile.initWithPath(places[i]); if (localeFile.exists()) break; } if (!localeFile.exists()) return "iso-8859-1"; let output = ""; let p = subprocess.call({ command: localeFile, arguments: [], environment: [], charset: null, mergeStderr: false, stdout: function(data) { output += data; } }); p.wait(); let m = output.match(/^(LC_ALL=)(.*)$/m); if (m && m.length > 2) { lc = m[2].replace(/"/g, ""); } else return "iso-8859-1"; } let i = lc.search(/[.@]/); if (i < 0) return "iso-8859-1"; lc = lc.substr(i + 1); return lc; } function getKernel32Dll() { if (!gKernel32Dll) { if (EnigmailOS.isWin32) { gKernel32Dll = ctypes.open("kernel32.dll"); } else { return null; } } return gKernel32Dll; } var EnigmailSystem = { determineSystemCharset: function() { EnigmailLog.DEBUG("system.jsm: determineSystemCharset\n"); if (!gSystemCharset) { if (EnigmailOS.isWin32) { gSystemCharset = getWindowsCopdepage(); } else { gSystemCharset = getUnixCharset(); } } EnigmailLog.DEBUG("system.jsm: determineSystemCharset: charset='" + gSystemCharset + "'\n"); return gSystemCharset; }, /** * Convert system output coming in a native charset into Unicode (Gecko-platfrom) * applying an appropriate charset conversion * * @param str String - input string in native charset * @param cs String - [Optional] character set (Unix), or codepage (Windows). * If not specified, determine the system default. * * @param String - output in Unicode format. If something failed, the unmodified * input isreturned. */ convertNativeToUnicode: function(str, cs) { try { if (!cs) cs = this.determineSystemCharset(); if (EnigmailOS.isWin32) { if (cs in CODEPAGE_MAPPING) { return EnigmailData.convertToUnicode(str, CODEPAGE_MAPPING[cs]); } else { let charSetNum = Number(cs); if (Number.isNaN(charSetNum)) { return EnigmailData.convertToUnicode(str, cs); } else return EnigmailData.convertToUnicode(this.winConvertNativeToUnichar(str, Number(cs)), "UTF-8"); } } else { return EnigmailData.convertToUnicode(str, cs); } } catch (ex) { EnigmailLog.DEBUG("system.jsm: convertNativeToUnicode: exception +" + ex.toString() + "\n"); return str; } }, /** * Convert from native Windows output (often Codepage 437) to a Mozilla Unichar string * * @param byteStr: String - the data to convert in the current Windows codepage * * @return String: the Unicode string directly display-able */ winConvertNativeToUnichar: function(byteStr, codePage) { /* int MultiByteToWideChar( _In_ UINT CodePage, _In_ DWORD dwFlags, _In_ LPCSTR lpMultiByteStr, _In_ int cbMultiByte, _Out_opt_ LPWSTR lpWideCharStr, _In_ int cchWideChar ); */ if (!getKernel32Dll()) { return byteStr; } var multiByteToWideChar = gKernel32Dll.declare("MultiByteToWideChar", ctypes.winapi_abi, ctypes.int, // return value ctypes.unsigned_int, // Codepage ctypes.uint32_t, // dwFlags ctypes.char.ptr, // input string ctypes.int, // cbMultiByte ctypes.jschar.ptr, // widechar string ctypes.int // ccWideChar ); let n = multiByteToWideChar(codePage, 0, byteStr, byteStr.length, null, 0); if (n > 0) { let OutStrType = ctypes.jschar.array(n + 1); let outStr = new OutStrType(); multiByteToWideChar(codePage, 0, byteStr, byteStr.length, outStr.addressOfElement(0), n); let r = new RegExp(String.fromCharCode(9516), "g"); return outStr.readString().replace(r, ""); } else return byteStr; } }; enigmail-2.0.8/package/tests/000077500000000000000000000000001334302754500160515ustar00rootroot00000000000000enigmail-2.0.8/package/tests/.eslintrc.js000066400000000000000000000000671334302754500203130ustar00rootroot00000000000000module.exports = { "rules": { "strict": 0, } } enigmail-2.0.8/package/tests/Makefile000066400000000000000000000005311334302754500175100ustar00rootroot00000000000000# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. DEPTH = ../.. include $(DEPTH)/config/autoconf.mk UNITTEST = ifneq ($(TB_PATH),"") UNITTEST = $(JSUNIT) main.js endif all: $(UNITTEST) enigmail-2.0.8/package/tests/armor-test.js000066400000000000000000000124471334302754500205140ustar00rootroot00000000000000/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false, component: false, Cc: false, Ci: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); testing("armor.jsm"); /*global EnigmailArmor: false */ component("enigmail/constants.jsm"); /*global EnigmailConstants: fales */ test(function shouldLocateEnigmailArmoredBlock() { const text = " -----BEGIN PGP SIGNATURE-----\n" + " Version: GnuPG/MacGPG2 v2.0.22 (Darwin)\n" + " Comment: GPGTools - https://gpgtools.org\n" + "\n" + " iQIcBAEBCgAGBQJVSkxrAAoJEFco/AmgID3sm68QALBa6I6r7LLopA8R+S/CpO66\n" + " 6qQm0zidQ7bhMDNiKPD+/TG/Blvu0n10Cnt5Wk6lD7dwPKAsHVq1fGUva4rkEbi4\n" + " R9nx7BQGBiFCpYl3K1bHJ/QrnYms5wpKseqGtW+8wq8wKx68sWi83xsKN2Ml2SGA\n" + " 95nvbvaQ6yQlynGXhPhGhdT3L2tdPsulnSwnd3NZJ83U73aYIN5jc5+UyWduLqho\n" + " xnD127JQYb8X2UjdXyOnA/E/VHvCWt9+Ck9s6VdwUSEBs41vJ/kyrmPE6u9sIQX7\n" + " 9ZujMzN05+9A1Mtwp4dsDIbLMeX6FS44CqcGiUKzyx5ewiYq9lcAReM52i+4kmBM\n" + " 4B/yLXDrWWOBiUCUQaOWC8PyBAc2cHLf62m6+oEfEMMCXli/XZuBC442qYuWNgf+\n" + " yLLhyaA27rqMxmhdFtKSOzrRaxkTTb1oQFQwHYfeHT7kFpPjq4p1Jv+p8w0pcq0P\n" + " j5hiLABLveEcLn4fEpqLROdi/Vz6Mp2nnbhcz+xe/w2KWmGgfl/kg2T/9YVeLox9\n" + " kaqVqNezYPfFZ1iQgGKNBXl1SMqHtTRAvHfH1k0E8qg3t222KU2pALp0A/LSvu/T\n" + " P3g8OIpqWRI0uBZQ/Gp/S1Fjb3DHfE+Y3IhVf5SkhjIYIvViSrbGqGUmK+jwGMia\n" + " o29CFuiGhiz3ISDRKrtH\n" + " =MeaY\n" + " -----END PGP SIGNATURE-----"; const beginIndexObj = {}; const endIndexObj = {}; const indentStrObj = {}; const indentStr = ""; const blockType = EnigmailArmor.locateArmoredBlock(text, 0, indentStr, beginIndexObj, endIndexObj, indentStrObj); Assert.equal(0, beginIndexObj.value); Assert.equal(" ", indentStrObj.value); Assert.equal("SIGNATURE", blockType); }); test(function shouldExtractSignaturePart() { const signature = { text: "Hello I'm here.\n please contact me via this email! \n", header: "Version: GnuPG/MacGPG2 v2.0.22 (Darwin)\n" + "Comment: GPGTools - https://gpgtools.org\n", armor: "iQIcBAEBCgAGBQJVSkxrAAoJEFco/AmgID3sm68QALBa6I6r7LLopA8R+S/CpO66\n" + "6qQm0zidQ7bhMDNiKPD+/TG/Blvu0n10Cnt5Wk6lD7dwPKAsHVq1fGUva4rkEbi4\n" + "R9nx7BQGBiFCpYl3K1bHJ/QrnYms5wpKseqGtW+8wq8wKx68sWi83xsKN2Ml2SGA\n" + "95nvbvaQ6yQlynGXhPhGhdT3L2tdPsulnSwnd3NZJ83U73aYIN5jc5+UyWduLqho\n" + "xnD127JQYb8X2UjdXyOnA/E/VHvCWt9+Ck9s6VdwUSEBs41vJ/kyrmPE6u9sIQX7\n" + "9ZujMzN05+9A1Mtwp4dsDIbLMeX6FS44CqcGiUKzyx5ewiYq9lcAReM52i+4kmBM\n" + "4B/yLXDrWWOBiUCUQaOWC8PyBAc2cHLf62m6+oEfEMMCXli/XZuBC442qYuWNgf+\n" + "yLLhyaA27rqMxmhdFtKSOzrRaxkTTb1oQFQwHYfeHT7kFpPjq4p1Jv+p8w0pcq0P\n" + "j5hiLABLveEcLn4fEpqLROdi/Vz6Mp2nnbhcz+xe/w2KWmGgfl/kg2T/9YVeLox9\n" + "kaqVqNezYPfFZ1iQgGKNBXl1SMqHtTRAvHfH1k0E8qg3t222KU2pALp0A/LSvu/T\n" + "P3g8OIpqWRI0uBZQ/Gp/S1Fjb3DHfE+Y3IhVf5SkhjIYIvViSrbGqGUmK+jwGMia\n" + "o29CFuiGhiz3ISDRKrtH\n" + "=MeaY" }; const signature_block = "\n\n" + signature.text + "-----BEGIN PGP SIGNATURE-----\n" + signature.header + "\n" + signature.armor + "\n" + "-----END PGP SIGNATURE-----"; const signature_text = EnigmailArmor.extractSignaturePart(signature_block, EnigmailConstants.SIGNATURE_TEXT); const signature_headers = EnigmailArmor.extractSignaturePart(signature_block, EnigmailConstants.SIGNATURE_HEADERS); const signature_armor = EnigmailArmor.extractSignaturePart(signature_block, EnigmailConstants.SIGNATURE_ARMOR); Assert.equal(signature.text, signature_text); Assert.equal(signature.header, signature_headers); Assert.equal(signature.armor.replace(/\s*/g, ""), signature_armor); }); test(function shouldGetArmorHeaders() { const text = "> -----BEGIN PGP SIGNATURE-----\n" + "> Version: GnuPG/MacGPG2 v2.0.22 (Darwin)\n" + "> Comment: GPGTools - https://gpgtools.org\n" + "> \n" + "> iQIcBAEBCgAGBQJVSkxrAAoJEFco/AmgID3sm68QALBa6I6r7LLopA8R+S/CpO66\n" + "> 6qQm0zidQ7bhMDNiKPD+/TG/Blvu0n10Cnt5Wk6lD7dwPKAsHVq1fGUva4rkEbi4\n" + "> R9nx7BQGBiFCpYl3K1bHJ/QrnYms5wpKseqGtW+8wq8wKx68sWi83xsKN2Ml2SGA\n" + "> 95nvbvaQ6yQlynGXhPhGhdT3L2tdPsulnSwnd3NZJ83U73aYIN5jc5+UyWduLqho\n" + "> xnD127JQYb8X2UjdXyOnA/E/VHvCWt9+Ck9s6VdwUSEBs41vJ/kyrmPE6u9sIQX7\n" + "> 9ZujMzN05+9A1Mtwp4dsDIbLMeX6FS44CqcGiUKzyx5ewiYq9lcAReM52i+4kmBM\n" + "> 4B/yLXDrWWOBiUCUQaOWC8PyBAc2cHLf62m6+oEfEMMCXli/XZuBC442qYuWNgf+\n" + "> yLLhyaA27rqMxmhdFtKSOzrRaxkTTb1oQFQwHYfeHT7kFpPjq4p1Jv+p8w0pcq0P\n" + "> j5hiLABLveEcLn4fEpqLROdi/Vz6Mp2nnbhcz+xe/w2KWmGgfl/kg2T/9YVeLox9\n" + "> kaqVqNezYPfFZ1iQgGKNBXl1SMqHtTRAvHfH1k0E8qg3t222KU2pALp0A/LSvu/T\n" + "> P3g8OIpqWRI0uBZQ/Gp/S1Fjb3DHfE+Y3IhVf5SkhjIYIvViSrbGqGUmK+jwGMia\n" + "> o29CFuiGhiz3ISDRKrtH\n" + "> =MeaY\n" + "> -----END PGP SIGNATURE-----"; let hdr = EnigmailArmor.getArmorHeaders(text); Assert.ok("version" in hdr); Assert.ok("comment" in hdr); Assert.equal(hdr.comment, "GPGTools - https://gpgtools.org"); }); enigmail-2.0.8/package/tests/autocrypt-test.js000066400000000000000000000223711334302754500214230ustar00rootroot00000000000000/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false */ /*global dump: false */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /* global setupTestAccounts: false, withTestGpgHome: false, withEnigmail: false, component: false */ testing("autocrypt.jsm"); /*global EnigmailAutocrypt: false */ component("enigmail/keyRing.jsm"); /*global EnigmailKeyRing: false */ component("enigmail/stdlib.jsm"); /* global EnigmailStdlib: false */ const pubkey1 = `mQENBFdGIzkBCADKys5q0rYiTr/FYdoupmNAJ0o20XWuFp/V58qsnQAMcAY2pCB/ydx9Y7 A80QjZPuVcE5QdROfvvkMXAA47ZxZrH79Kaqj11DS5XOgtLVtITGtWvrYqIFujxP42ICWB h7LXUwrHfi93FX74ucXoWo/PZndbo+JBxc0ZsrHUdu24grTDuqLZQ8mRCx5U4tf+zEVIU6 kXubFzq8aPSnjfEg6MhXxSRictjIBKM0Ez2QwZmh1vAEmvn0kr0VaJJ7xVRgIH1CgNh/WW tbr0lrblKCkFkTFnQfslWvSEko+LqvwgBSKyKg8VtWbYftnBkn8FPbP5Brp3wYgBc/c7mr LROqAFABEBAAG0ImRldi10aWdlciA8ZGV2LXRpZ2VyQHRlc3Qubm90cmVhbD6JATcEEwEI ACEFAldGIzkCGwMFCwkIBwIGFQgJCgsCBBYCAwECHgECF4AACgkQhDnhcEaXfEb3/gf/V0 da3gXN5TNOsWZKj/fI2FhQBglJ2vlEamnppwtnWZGktdFZ1h6ymzQ9PY3IidbKctqs/QQW KtIBVh5k02fvUe99nsFZmINcLeajdu7IqvKxtFBuEwZAA1Bw9dhM3JRQM8z+l+CtbFh6dV ufU7q5vVEXciCkhdn172QYTMAXNYE4Tfh7eaEAOdRyFcwiAGZ826pOp7Al52frK+MtaXa9 D2fRINlDXD9+IIR80sig2B4iBGeY+qAmE6bFuw7MtBya6uKupLjtAD/v48Z5wBYuU0jPld 4KH88IWksbQo1zW/O+1N7J1/U9ZGNwpvS+wtfyjlOpTS3YWGmY8sVturZqTrkBDQRXRiM5 AQgAsDN5j4viE5E8H5N9cfzQ9ZO5BUk66yI2DVEeasqZWFCkRA+uFHcTF6YpCoSn4/Jsvq vUWVh63uV5vdAiU9+4sNFT8nkP7zD0LQthFtgEXqNo11NR7yvDRT3TOAnGaa+bLyoU/SLX zSwctZksrQjzQJVSohQNznhj95XH3UEsUydHqje7ljp7NHWAJx+Tlp2Yh6q060/gwh37zs fdVbaVtjeaAYECX3z6L7JB4KBb9KGlmDmOMngVUuR8XWWE+LEx0m7B+kZ+vZhUOSDDomBP +8jGJmXlcIt8+LIBq0NeXs/YINCc89saUPw/V6X/NFRkekKFzIprCzwhg0LWl8oXAwARAQ ABiQEfBBgBCAAJBQJXRiM5AhsMAAoJEIQ54XBGl3xGUvEH/jVTBoRfJ8ohc4Ahal8TyIm8 vdT/Ax/ddyyaLnCxkLFt0noBlA7062N1Fvv86Ts93EFrK9nF3g20gXKBKETo/vJRqtODIr wtCMfzPbS/FkQweLtUDZXed0nq/Yaxk60H2HmWm+n9/126F3QIt7is0E3dY0e6DYJGRHnn +lWnUs/8Ba16Zb/os3GgwEQwr4LPEty6CFQU2DNl5HmajeB1oEqmeDZ2f/y87GRpdCoTgu dQiHMPdm2kPVbeAA6945W6Y2LSA5Hm+yS8s2dBs4+sEiW97owLz6vcak8Aw+7JFxL2JkoZ uN28dueoVcFQw3uX0snoBXgo3LYsK71JoufrXhY=`; const pubkey2 = `mQINBFVHm5sBEACs94Ln+RMdeyBpWQtTZ/NZnwntsB10Wd3HTgo5sdA/OOFOJrWetJfAZ/ HRxiSu1bwRaFVC8p061ftTbxf8bsdfsykYJQQqPODfcO0/oY2n/Z93ya8KTzjXR3qBQ1P7 f5x71yeuo7Zrj7B0G44Xjfy+1L0eka9paBqmm3U5cUew5wSr772LcflipWfncWXD2rBqgR fR339lRHd3Vwo7V8jje8rlP9msOuTMWCvQuQvpEkfIioXA7QipP2f0aPzsavNjFnAfC9rm 2FDs6lX4syTMVUWy8IblRYo6MjhNaJFlBJkTCl0bugT9Ge0ZUifuAI0ihVGBpMSh4GF2B3 ZPidwGSjgx1sojNHzU/3vBa9DuOmW95qrDNotvz61xYueTpOYK6ZeT880QMDvxXG9S5/H1 KJxuOF1jx1DibAn9sfP4gtiQFI3FWMV9w3YrrqidoWSZBqyBO0Toqt5fNdRyH4ET6HlJAQ mFQUbqqnZrc07s/aITZN36d9eupCZQfW6e80UkXRPCU53vhh0GQey9reDyVCsV7xi6oXk1 fqlpDYigQwEr4+yJ+1qAjtSVHJhFE0inQWkUwc2nxef6n7v/M9HszhP/aABadVE49oDaRm 54PtA1l0mCT8IHcVR4ZDkaNwrHJtidEQcQ/+YVV3g7UJI9+g2nPvgMhk86AzBIlGpG+wAR AQABtCthbm9ueW1vdXMgc3RyaWtlIDxzdHJpa2UuZGV2dGVzdEBnbWFpbC5jb20+iQI9BB MBCgAnBQJVR5ubAhsDBQkHhh+ABQsJCAcDBRUKCQgLBRYCAwEAAh4BAheAAAoJEHgWFzGc 4xHEt/4P/1zf/2VsEwpJVlqwoLiJGQbViCRW34W8rTyL45GjRYAgDXrWLDPqxSbotXTXi7 2Dwug6a/Pn1VI1R2ZaBsWXH8qUYtSV/0b/2HfqUyDhaiuASywMdSfTAXa+popNccD5yPCJ VBD0xmPCAmrOciYePMMNBk4SCDV5DJcCyGhEAkSeGsXy+m2bXb1pTbg6OpqDIPCqlmNQ8Z yAZNzWIyRWcqUY+B6xcZk+n50wG9A0TCOvVjsZ+E8Khyha2tfz1WFPmoy0rMD4g2ggvII3 v4elosBQW0pxYdkwBAwk6g3DMyUzR6GcNcZnuvnZVBbjCpqXtDJ7UcjjcP8zvzDYlXAY74 gM8Nu7/89Pw676rVUXtS7c/LUB8Z75FACi7d65Kp8Q6sNYVfi/mTggNwEAuAkjp9acEGvk 67q2we+lEoeAwCyfBiBu5TmYriLyAvfyoyeMhRjV0FdBaRh+4CkVgSG4/eTLFcnHVB2Zzh X7Uw0qoxM8R+caP75XoVUyXmIpC/UZTrF4IGDUc4jbIqSGU2/Kln4Z8vQpuCw0vavbT93j SCyqaIbKqemK8D0rbaoxJq5RLkwU6gJ3dOpQdDRuqUAkfbEZd8yVRSmfugRhCTbdAA5/1k dgoWv9xZU7asdsm5cpHpy7lM7ponHsA+B+ykApDqDzPIHDZBoeqKl6qNe2BYOYuQINBFVH m5sBEADBX28bR5QxbrGNVPT3jM60IT+m/GTLH6lm4OcZomAej/XrBOcX/0BYtOqqP7Dur8 k0A8fcLkZCSBse1m6fvfACo8Vbeunv4IrST5FgXh7bYPZseIy5U7Xn0dLqpVXJRqMt3ULS /Rwy18Xx8j9sXJJDAKIqZ4MHwgBknPeeBnD4aG6bJAuBEI6RW5lhbG8WFJfCniFuRnim+V D6ucf93x3NkL0TWY0l0PbUdW92sLfiKp1nmz+1dRoBckT701sMs2pk48O5Y/vP6OEDzFzj GdA1r9YkblXjN9VxhSN00Wlmcq1DqEU36+Mqi4YIQsuF3NfS13+U2lhjlR5HpRxdDMfHjF Ylk5hlOtuvopseYTlMykFl8D7y0qSFIAiqVl6pdlSBU84bOLHoCUGens+Ul7m0UShwZdVm MifFw/fJwISZI8D5vGkM3rE7TxrHAQ/O1fJnGZNBRgn8LjnZjRGA/u1fweptFY0NyzO5lO zTWI6HBJl1hMave2l0vtwBPLrRbbRhy6Z77BNfE9a2w7Y4aFeshjEpWxE8bQIyMrBGaRai Q2lpXmA6XYZxQ8xOUfstsAR1TM+JboXJDuTw+YhaVa2W7Z/RzdtNnahWCCjptFq60DuggL wAGnjr5HctpLgwvLVKCeDfU8nchzCkL7Hikh2LC7ySUR/VzORag/TkjxYRRwARAQABiQIl BBgBCgAPBQJVR5ubAhsMBQkHhh+AAAoJEHgWFzGc4xHEo+UP/02AIUR0349zGk9a4D5Jv0 07y+d0tWKPL0V2btaq9xQzoM51CtuT0ZoqTO8A0uFmEhCkw++reQcWOz1Nn+MarPjjJwMj hTPS/H1qiwTXmuwx92xLL0pajloq7oWYwlxsgVGCMDYE0TOMN8p/Vc+eoJaWZh8yO1xJGD P98RHbZQWwYN6qLzE4y/ECTHxqi9UKc68qHNVH9ZgtTXnmgLAkEvXzRV1UOEEttJ6rrgPr TubjsIG+ckZK5mlivy+UW6XN0WBE0oetKjT8/Cb1dQYiX/8MJkGcIUFRurU7gtGW3ncSTd r6WRXaQtfnRn9JG1aSXNYB/xZWzCBdykZp+tLuu4A3LVeOzn064hqf3rz2N7b8dWMk5WL5 LIUhXYoYc7232RkNSiiKndeJNryvTowFt9anuMj4pFgGveClQc9+QGyMVdTe6G5kOJkKG8 ydHKFEFObtsTLaut4lHTtxn+06QO/LKtQTXqNEyOyfYhbyX7xDbCbu4/MA23MzTs1hhwgI y4+UejU/Yeny6VkBodA3bFyEYKWPoMDDgfdlZbzjv3qAN4Qq+ollo8K3gJgH0QONrUaRY8 4/hil05T4EnUZiXdzPWvhMv5lEK+pTMlO8FbOG31+aB8rxCg+wp1ovyC/fp5XjZaLHcyPA WAXKLBn4tb400iHp7byO85tF/H0OOI1K`; setupTestAccounts("strike.devtest@gmail.com", "0x781617319CE311C4"); /* global Sqlite */ test(function prepareDb() { // Drop autocrypt_keydata table (if it exists) do_test_pending(); Sqlite.openConnection({ path: "enigmail.sqlite", sharedMemoryCache: false }). then(connection => { connection.execute("drop table autocrypt_keydata;").then(ok => { connection.close(); dump("dropped table\n"); do_test_finished(); }).catch(err => { do_test_finished(); }); }); JSUnit.waitForAsyncTest(); // wait until that's done before starting the next test }); // testing: extractMessageId test(function processHeader() { const hdr0 = "type=1; addr=dev-tiger@test.notreal; keydata=" + pubkey1; const hdr1 = "type=1; addr=dev-tiger@test.notreal; keydata=" + pubkey2; let d0 = new Date(); d0.setTime(Date.now() - 5 * 86400 * 1000); // 5 days ago const sentDate = d0.toUTCString(); let d1 = new Date(); d1.setTime(Date.now() - 4 * 86400 * 1000); // 4 days ago const updateDate = d1.toUTCString(); do_test_pending(); EnigmailAutocrypt.processAutocryptHeader("dev-tiger@test.notreal", [hdr0], sentDate). then(result => { Assert.equal(0, result); return EnigmailAutocrypt.getOpenPGPKeyForEmail(["dev-tiger@test.notreal"]); }).then(result => { Assert.equal(1, result.length); Assert.equal(sentDate, result[0].lastAutocrypt.toUTCString()); Assert.equal("8C140834F2D683E9A016D3098439E17046977C46", result[0].fpr); Assert.equal(pubkey1.replace(/[\r\n ]/g, ""), result[0].keyData); return EnigmailAutocrypt.processAutocryptHeader("dev-tiger@test.notreal", [hdr1], updateDate); }).then(result => { Assert.equal(0, result); return EnigmailAutocrypt.getOpenPGPKeyForEmail(["dev-tiger@test.notreal"]); }).then(result => { Assert.equal(1, result.length); Assert.equal(updateDate, result[0].lastAutocrypt.toUTCString()); Assert.equal("65537E212DC19025AD38EDB2781617319CE311C4", result[0].fpr); Assert.equal(pubkey2.replace(/[\r\n ]/g, ""), result[0].keyData); // this should not change anything, update in the past return EnigmailAutocrypt.processAutocryptHeader("dev-tiger@test.notreal", [hdr0], sentDate); }).then(result => { Assert.equal(0, result); return EnigmailAutocrypt.getOpenPGPKeyForEmail(["dev-tiger@test.notreal"]); }).then(result => { Assert.equal(1, result.length); Assert.equal(updateDate, result[0].lastAutocrypt.toUTCString()); Assert.equal("65537E212DC19025AD38EDB2781617319CE311C4", result[0].fpr); Assert.equal(pubkey2.replace(/[\r\n ]/g, ""), result[0].keyData); do_test_finished(); }). catch(err => { Assert.equal(err, 1); do_test_finished(); }); }); test(withTestGpgHome(withEnigmail(function shouldGetKeyFunctions() { const publicKey = do_get_file("resources/dev-strike.asc", false); const secretKey = do_get_file("resources/dev-strike.sec", false); EnigmailKeyRing.importKeyFromFile(publicKey, {}, {}); EnigmailKeyRing.importKeyFromFile(secretKey, {}, {}); let inspector = Cc["@mozilla.org/jsinspector;1"].createInstance(Ci.nsIJSInspector); let id = EnigmailStdlib.getIdentityForEmail("strike.devtest@gmail.com").identity; Assert.equal(id.email, "strike.devtest@gmail.com"); EnigmailAutocrypt.createSetupMessage(id).then(res => { Assert.ok(res); Assert.equal(res.passwd.length, 44); Assert.ok(res.msg.length > 9500); Assert.equal(res.msg.substr(0, 100), "To: strike.devtest@gmail.com\r\nFrom: strike.devtest@gmail.com\r\nAutocrypt-Setup-Message: v1\r\nSubject: "); return EnigmailAutocrypt.handleBackupMessage(res.passwd, res.msg, "strike.devtest@gmail.com"); }).then(res => { Assert.ok(res); Assert.equal(res.fpr, "65537E212DC19025AD38EDB2781617319CE311C4"); inspector.exitNestedEventLoop(); }).catch(err => { Assert.equal(err, 0); inspector.exitNestedEventLoop(); }); inspector.enterNestedEventLoop(0); }))); enigmail-2.0.8/package/tests/core-test.js000066400000000000000000000052131334302754500203150ustar00rootroot00000000000000/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false, withTestGpgHome:false */ /*global withEnigmail: false, EnigmailCore: false, Enigmail: false, component: false, Cc: false, Ci: false, withEnvironment: false, nsIEnvironment: false, Ec: false, EnigmailPrefs: false, EnigmailOS: false, EnigmailArmor: false, withLogFiles: false, assertLogContains: false, assertLogDoesNotContain: false */ /*jshint -W120 */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); testing("core.jsm"); component("enigmail/prefs.jsm"); //component("enigmail/core.jsm"); component("enigmail/log.jsm"); /*global EnigmailLog: false */ component("enigmail/files.jsm"); /*global EnigmailFiles: false */ function newEnigmail(f) { var oldEnigmail = EnigmailCore.getEnigmailService(); try { var enigmail = new Enigmail(); EnigmailCore.setEnigmailService(enigmail); f(enigmail); } finally { EnigmailCore.setEnigmailService(oldEnigmail); } } // testing: initialize test(function initializeWillPassEnvironmentIfAskedTo() { EnigmailPrefs.setPref('keyRefreshOn', true); var window = JSUnit.createStubWindow(); withEnvironment({ "ENIGMAIL_PASS_ENV": "STUFF:BLARG", "STUFF": "testing" }, function() { newEnigmail(function(enigmail) { enigmail.initialize(window, ""); Assert.assertArrayContains(EnigmailCore.getEnvList(), "STUFF=testing"); }); }); }); test(function initializeWillNotPassEnvironmentsNotAskedTo() { EnigmailPrefs.setPref('keyRefreshOn', true); var window = JSUnit.createStubWindow(); var environment = Cc["@mozilla.org/process/environment;1"].getService(nsIEnvironment); environment.set("ENIGMAIL_PASS_ENV", "HOME"); environment.set("STUFF", "testing"); newEnigmail(function(enigmail) { enigmail.initialize(window, ""); Assert.assertArrayNotContains(EnigmailCore.getEnvList(), "STUFF=testing"); }); }); test(function initializeWillNotSetEmptyEnvironmentValue() { EnigmailPrefs.setPref('keyRefreshOn', true); var window = JSUnit.createStubWindow(); var environment = Cc["@mozilla.org/process/environment;1"].getService(nsIEnvironment); environment.set("APPDATA", ""); newEnigmail(function(enigmail) { enigmail.initialize(window, ""); Assert.assertArrayNotContains(EnigmailCore.getEnvList(), "APPDATA="); }); }); enigmail-2.0.8/package/tests/customAssert.jsm000066400000000000000000000021361334302754500212620ustar00rootroot00000000000000/*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; const CustomAssert = { registerExtraAssertionsOn: function(assertModule) { assertModule.assertContains = CustomAssert.assertContains; assertModule.assertArrayContains = CustomAssert.assertArrayContains; assertModule.assertArrayNotContains = CustomAssert.assertArrayNotContains; }, assertContains: function(actual, expected, message) { var msg = message || "Searching for <".concat(expected) .concat("> to be contained within ") .concat("<").concat(actual).concat(">"); this.report(actual.search(expected) == -1, actual, expected, msg); }, assertArrayContains: function(array, value, message) { this.report(array.indexOf(value) == -1, array, value, message, "contains"); }, assertArrayNotContains: function(array, value, message) { this.report(array.indexOf(value) > -1, array, value, message, "not contains"); } }; enigmail-2.0.8/package/tests/data-test.js000066400000000000000000000024771334302754500203070ustar00rootroot00000000000000/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false */ /*global EnigmailData: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); testing("data.jsm"); // testing: extractMessageId test(function extractMessageIdExtractsARegularMessageId() { var result = EnigmailData.extractMessageId("enigmail:message/foobar"); Assert.equal("foobar", result); }); test(function extractMessageIdReturnsAnEmptyStringWhenItCantMatch() { var result = EnigmailData.extractMessageId("enigmail:mime-message/foobar"); Assert.equal("", result); }); // testing: extractMimeMessageId test(function extractMimeMessageIdExtractsARegularMessageId() { var result = EnigmailData.extractMimeMessageId("enigmail:mime-message/fluff"); Assert.equal("fluff", result); }); test(function extractMimeMessageIdReturnsAnEmptyStringWhenItCantMatch() { var result = EnigmailData.extractMimeMessageId("enigmail:message/mess"); Assert.equal("", result); }); enigmail-2.0.8/package/tests/decryption-test.js000066400000000000000000000057251334302754500215550ustar00rootroot00000000000000/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false, component: false, Cc: false, Ci: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global withEnigmail: false, withTestGpgHome: false */ testing("decryption.jsm"); /*global EnigmailDecryption: false */ component("enigmail/keyRing.jsm"); /*global EnigmailKeyRing: fales */ component("enigmail/armor.jsm"); /*global EnigmailArmor: fales */ component("enigmail/constants.jsm"); /*global EnigmailConstants: fales */ test(withTestGpgHome(withEnigmail(function shouldDecryptMessage() { let secretKeyFile = do_get_file("resources", false); secretKeyFile.append("dev-strike.sec"); const importedKeysObj = {}; let r = EnigmailKeyRing.importKeyFromFile(secretKeyFile, {}, importedKeysObj); Assert.equal(0, r); var encryptResult = "-----BEGIN PGP MESSAGE-----\n" + "Version: GnuPG v2.0.22 (GNU/Linux)\n" + "\n" + "hQIMA9U1Yju2Dp5xAQ//eeoS38nAWPdJslfVaEuUhthZk4WxAua97+JNGX9vDiae\n" + "jKJbjmQ5T2Sl2wvSqwjEIKzzjRAzr6SYuL9xaRkt3/BbMpSm/aSjc/cWNgcKtbHt\n" + "u8u9Ha016XZke3/EpjLqMcXmK1eT9oa+UqR8u+B3ggOjz5BrjW+FMR+zfyiWv1cb\n" + "6U4KO0YHuOq7G0lO4i3ro0ckhzZqCBLfCiQSfnF8R7p/KfQdUFBIdB41OALP0q4x\n" + "UD+CNWhbIjyhfE0VX5KUn/5S5Se31VjKjfeo+5fN8HRUVQYu8uj2F+gPvALF5KKW\n" + "an63O3IcUvZo6yOSoMjkMVJBHZRY6An2if+GXm330yQD3CDaonuihR+e+k6sd0kj\n" + "hpwQs+4/uE96slRMqQMx573krc/p/WUWwG5qexOvwxzcqEdE5LYPEMKdH1fUX3tC\n" + "kktNpSU8gJqluTk6cvtjCfMSwcEyKFmM13/RoitAw22DVOdLlcTHxbaNsIoxeRk/\n" + "rxpsraIEs2H4uyF19K1nLioGkyubeUKPnBTB6qAwp0ZhZ1RleMwHRTFQU+jpbi51\n" + "t87E+JI0UuLd14pDb7YJUKenHvAqa1jHAZKEfa2XFMfT/1MZzohlwjNpcPhYFWeB\n" + "zq3cg/m/J5sb+FpdD42nfYnLsSYu7CwcTX8MU2vrSwHyHnmux6SjDXGrAaddWsrS\n" + "RwGvjZsiFW/E82l2eMj5Zpm6HXY8kZx9TBSbWLSgU44nBhDvX1MrIGdd+rmYT2xt\n" + "j4KAKpyV51VzmJUOqHrb7bPv70ncMx0w\n" + "=uadZ\n" + "-----END PGP MESSAGE-----\n\n"; const parentWindow = JSUnit.createStubWindow(); const exitCodeObj = {}; const statusFlagObj = {}; const errorMsgObj = {}; const decryptResult = EnigmailDecryption.decryptMessage(parentWindow, EnigmailConstants.UI_TEST, encryptResult, {}, exitCodeObj, statusFlagObj, {}, {}, {}, errorMsgObj, {}, {}, "STRIKEfreedom@Qu1to" ); Assert.equal(0, exitCodeObj.value); Assert.equal(0, errorMsgObj.value); Assert.equal("Hello there!", decryptResult); Assert.equal(true, (statusFlagObj.value & (EnigmailConstants.DISPLAY_MESSAGE | EnigmailConstants.DECRYPTION_OKAY)) !== 0); const blockType = EnigmailArmor.locateArmoredBlock(encryptResult, 0, "", {}, {}, {}); Assert.equal("MESSAGE", blockType); }))); enigmail-2.0.8/package/tests/encryption-test.js000066400000000000000000000106421334302754500215610ustar00rootroot00000000000000/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false, component: false, Cc: false, Ci: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global withEnigmail: false, withTestGpgHome: false */ testing("encryption.jsm"); /*global EnigmailEncryption: false */ component("enigmail/keyRing.jsm"); /*global EnigmailKeyRing: false */ component("enigmail/armor.jsm"); /*global EnigmailArmor: false */ component("enigmail/locale.jsm"); /*global EnigmailLocale: false */ component("enigmail/constants.jsm"); /*global EnigmailConstants: false */ test(withTestGpgHome(withEnigmail(function shouldSignMessage() { const secretKey = do_get_file("resources/dev-strike.sec", false); const revocationCert = do_get_file("resources/dev-strike.rev", false); const errorMsgObj = {}; const importedKeysObj = {}; EnigmailKeyRing.importKeyFromFile(secretKey, errorMsgObj, importedKeysObj); const parentWindow = JSUnit.createStubWindow(); const plainText = "Hello there!"; const strikeAccount = "strike.devtest@gmail.com"; const exitCodeObj = {}; const statusFlagObj = {}; const encryptResult = EnigmailEncryption.encryptMessage(parentWindow, EnigmailConstants.UI_TEST, plainText, strikeAccount, strikeAccount, "", EnigmailConstants.SEND_TEST | EnigmailConstants.SEND_SIGNED, exitCodeObj, statusFlagObj, errorMsgObj ); Assert.equal(0, exitCodeObj.value); Assert.equal(0, errorMsgObj.value); Assert.equal(true, (statusFlagObj.value == EnigmailConstants.SIG_CREATED)); const blockType = EnigmailArmor.locateArmoredBlock(encryptResult, 0, "", {}, {}, {}); Assert.equal("SIGNED MESSAGE", blockType); let r = EnigmailEncryption.determineOwnKeyUsability(EnigmailConstants.SEND_SIGNED, "strike.devtest@gmail.com"); Assert.equal(r.keyId, "65537E212DC19025AD38EDB2781617319CE311C4"); EnigmailKeyRing.importKeyFromFile(revocationCert, errorMsgObj, importedKeysObj); r = EnigmailEncryption.determineOwnKeyUsability(EnigmailConstants.SEND_SIGNED, "0x65537E212DC19025AD38EDB2781617319CE311C4"); Assert.equal(r.errorMsg, EnigmailLocale.getString("keyRing.pubKeyRevoked", ["anonymous strike ", "0x781617319CE311C4"])); }))); test(withTestGpgHome(withEnigmail(function shouldEncryptMessage() { const publicKey = do_get_file("resources/dev-strike.asc", false); const errorMsgObj = {}; const importedKeysObj = {}; EnigmailKeyRing.importKeyFromFile(publicKey, errorMsgObj, importedKeysObj); const parentWindow = JSUnit.createStubWindow(); const plainText = "Hello there!"; const strikeAccount = "strike.devtest@gmail.com"; const exitCodeObj = {}; const statusFlagObj = {}; const encryptResult = EnigmailEncryption.encryptMessage(parentWindow, EnigmailConstants.UI_TEST, plainText, strikeAccount, strikeAccount, "", EnigmailConstants.SEND_TEST | EnigmailConstants.SEND_ENCRYPTED | EnigmailConstants.SEND_ALWAYS_TRUST, exitCodeObj, statusFlagObj, errorMsgObj ); Assert.equal(0, exitCodeObj.value); Assert.equal(0, errorMsgObj.value); Assert.equal(true, (statusFlagObj.value & EnigmailConstants.END_ENCRYPTION) !== 0); const blockType = EnigmailArmor.locateArmoredBlock(encryptResult, 0, "", {}, {}, {}); Assert.equal("MESSAGE", blockType); let r = EnigmailEncryption.determineOwnKeyUsability(EnigmailConstants.SEND_ENCRYPTED, "strike.devtest@gmail.com"); Assert.equal(r.keyId, "65537E212DC19025AD38EDB2781617319CE311C4"); }))); test(withTestGpgHome(withEnigmail(function shouldGetErrorReason() { let r = EnigmailEncryption.determineOwnKeyUsability(EnigmailConstants.SEND_SIGNED, "strike.devtest@gmail.com"); let expected = EnigmailLocale.getString("keyRing.noSecretKey", ["anonymous strike ", "0x781617319CE311C4"]) + "\n"; Assert.equal(r.errorMsg, expected); r = EnigmailEncryption.determineOwnKeyUsability(EnigmailConstants.SEND_SIGNED | EnigmailConstants.SEND_ENCRYPTED, "nobody@notfound.net"); expected = EnigmailLocale.getString("errorOwnKeyUnusable", "nobody@notfound.net"); Assert.equal(r.errorMsg, expected); }))); enigmail-2.0.8/package/tests/errorHandling-test.js000066400000000000000000000203411334302754500221620ustar00rootroot00000000000000/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false */ /*global decryptionFailed: false, newContext: false, detectForgedInsets: false */ /*global component: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global withTestGpgHome: false */ testing("errorHandling.jsm"); /*global EnigmailErrorHandling: false, Ci: false */ component("enigmail/locale.jsm"); /*global EnigmailLocale: false */ component("enigmail/constants.jsm"); /*global EnigmailConstants: false */ test(function decryptionFailedWillSetDecryptionFailedFlag() { var context = {}; decryptionFailed(context); Assert.equal(context.inDecryptionFailed, true, "expected decryption failing to set the correct flag in the context"); }); test(function shouldExtractSingleBlockSeparation() { var testStatusArray = [ "BEGIN_DECRYPTION", "DECRYPTION_INFO 2 9", "PLAINTEXT 62 1431644287 text.txt", "PLAINTEXT_LENGTH 15", "DECRYPTION_FAILED", "END_DECRYPTION" ]; var context = newContext({}, {}, {}, {}); context.statusArray = testStatusArray; detectForgedInsets(context); Assert.equal(context.retStatusObj.blockSeparation, "1:15 "); }); test(function shouldExtractMultipleBlockSeparation() { var testStatusArray = [ "FILE_START 3 file1.gpg", "ENC_TO D535623BB60E9E71 1 0", "USERID_HINT D535623BB60E9E71 anonymous strike ", "NEED_PASSPHRASE D535623BB60E9E71 781617319CE311C4 1 0", "GOOD_PASSPHRASE", "BEGIN_DECRYPTION", "DECRYPTION_INFO 2 9", "PLAINTEXT 62 1432677982 test", "PLAINTEXT_LENGTH 14", "DECRYPTION_OKAY", "GOODMDC", "END_DECRYPTION", "FILE_DONE", "FILE_START 3 file0.gpg", "ENC_TO D535623BB60E9E71 1 0", "GOOD_PASSPHRASE", "BEGIN_DECRYPTION", "DECRYPTION_INFO 2 9", "PLAINTEXT 62 1432677982 test", "PLAINTEXT_LENGTH 14", "DECRYPTION_OKAY", "GOODMDC", "END_DECRYPTION", "FILE_DONE", "PLAINTEXT 62 1432677982 test", "PLAINTEXT_LENGTH 15" ]; var context = newContext({}, {}, {}, {}); context.statusArray = testStatusArray; detectForgedInsets(context); Assert.equal(context.retStatusObj.blockSeparation, "1:14 1:14 0:15 "); }); test(function shouldHandleNoDataErrors() { const errorOutput = "gpg: no valid OpenPGP data found.\n" + "[GNUPG:] NODATA 1\n" + "[GNUPG:] NODATA 2\n" + "gpg: decrypt_message failed: Unknown system error\n"; const result = EnigmailErrorHandling.parseErrorOutput(errorOutput, {}); Assert.assertContains(result, "no valid OpenPGP data found"); }); test(function shouldHandleErrorOutput() { const errorOutput = "[GNUPG:] USERID_HINT 781617319CE311C4 anonymous strike \n" + "[GNUPG:] NEED_PASSPHRASE 781617319CE311C4 781617319CE311C4 1 0\n" + "gpg-agent[14654]: command get_passphrase failed: Operation cancelled\n" + "gpg: cancelled by user\n" + "[GNUPG:] MISSING_PASSPHRASE\n" + "gpg: skipped \"\": Operation cancelled\n" + "[GNUPG:] INV_SGNR 0 \n" + "gpg: [stdin]: clearsign failed: Operation cancelled\n"; const retStatusObj = {}; EnigmailErrorHandling.parseErrorOutput(errorOutput, retStatusObj); Assert.assertContains(retStatusObj.statusMsg, EnigmailLocale.getString("missingPassphrase")); Assert.equal(retStatusObj.extendedStatus, ""); }); test(function shouldHandleFailedEncryption() { const errorOutput = "gpg: encrypted with 4096-bit RSA key, ID B60E9E71, created 2015-05-04\n" + "\"anonymous strike \"\n" + "[GNUPG:] BEGIN_DECRYPTION\n" + "[GNUPG:] DECRYPTION_INFO 2 9\n" + "[GNUPG:] PLAINTEXT 62 1431644287 text.txt\n" + "[GNUPG:] PLAINTEXT_LENGTH 15\n" + "File `textd.txt' exists. Overwrite? (y/N) y\n" + "gpg: mdc_packet with invalid encoding\n" + "[GNUPG:] DECRYPTION_FAILED\n" + "gpg: decryption failed: Invalid packet\n" + "[GNUPG:] END_DECRYPTION"; const result = EnigmailErrorHandling.parseErrorOutput(errorOutput, {}); Assert.assertContains(result, "decryption failed: Invalid packet"); }); test(withTestGpgHome(function shouldHandleSuccessfulImport() { const errorOutput = "gpg: key 9CE311C4: public key \"anonymous strike \" imported\n" + "[GNUPG:] IMPORTED 781617319CE311C4 anonymous strike \n" + "[GNUPG:] IMPORT_OK 1 65537E212DC19025AD38EDB2781617319CE311C4\n" + "gpg: key 9CE311C4: secret key imported\n" + "[GNUPG:] IMPORT_OK 17 65537E212DC19025AD38EDB2781617319CE311C4\n" + "[GNUPG:] IMPORT_OK 0 65537E212DC19025AD38EDB2781617319CE311C4\n" + "gpg: key 9CE311C4: \"anonymous strike \" not changed\n" + "gpg: Total number processed: 2\n" + "gpg: imported: 1 (RSA: 1)\n" + "gpg: unchanged: 1\n" + "gpg: secret keys read: 1\n" + "gpg: secret keys imported: 1\n" + "[GNUPG:] IMPORT_RES 2 0 1 1 1 0 0 0 0 1 1 0 0 0"; const result = EnigmailErrorHandling.parseErrorOutput(errorOutput, {}); Assert.assertContains(result, "secret key imported"); })); test(function shouldHandleUnverifiedSignature() { const errorOutput = "gpg: B60E9E71: There is no assurance this key belongs to the named user\n" + "\n" + "pub 4096R/B60E9E71 2015-05-04 anonymous strike \n" + " Primary key fingerprint: 6553 7E21 2DC1 9025 AD38 EDB2 7816 1731 9CE3 11C4\n" + " Subkey fingerprint: D093 CD82 3BE1 3BD3 81EE FF7A D535 623B B60E 9E71\n" + "\n" + "It is NOT certain that the key belongs to the person named\n" + "in the user ID. If you *really* know what you are doing,\n" + "you may answer the next question with yes.\n" + "\n" + "[GNUPG:] USERID_HINT D535623BB60E9E71 anonymous strike \n" + "Use this key anyway? (y/N) y"; const result = EnigmailErrorHandling.parseErrorOutput(errorOutput, {}); Assert.assertContains(result, "Use this key anyway"); }); test(function shouldHandleEncryptionFailedNoPublicKey() { const errorOutput = "gpg: iapazmino@thoughtworks.com: skipped: No public key\n" + "[GNUPG:] INV_RECP 0 iapazmino@thoughtworks.com\n" + "gpg: salida3.xtxt: encryption failed: No public key"; const o = {}; const result = EnigmailErrorHandling.parseErrorOutput(errorOutput, o); Assert.assertContains(result, "No public key"); Assert.equal(o.errorMsg, EnigmailLocale.getString("keyError.keySpecNotFound", "iapazmino@thoughtworks.com")); }); test(function shouldHandleErrors() { const errorOutput = "gpg: problem with the agent: Invalid IPC response \n" + "gpg: /dev/fd/5:0: key generation canceled\n" + "\n" + "Status text: [GNUPG:] NEED_PASSPHRASE_SYM 3 3 2 \n" + "[GNUPG:] ERROR get_passphrase 260 \n" + "[GNUPG:] MISSING_PASSPHRASE \n" + "[GNUPG:] KEY_NOT_CREATED"; const result = EnigmailErrorHandling.parseErrorOutput(errorOutput, {}); Assert.assertContains(result, "Invalid IPC response"); }); test(function shouldHandleInvalidSender() { const errorOutput = "gpg: skipped \"0x12345678\": No secret key\n" + "[GNUPG:] INV_SGNR 9 0x12345678\n" + "[GNUPG:] FAILURE sign 17\n" + "gpg: signing failed: No secret key\n"; const retStatusObj = {}; EnigmailErrorHandling.parseErrorOutput(errorOutput, retStatusObj); Assert.assertContains(retStatusObj.errorMsg, EnigmailLocale.getString("keyError.keyIdNotFound", "0x12345678")); }); test(function shouldHandleFailures() { const errorOutput = "[GNUPG:] BEGIN_SIGNING H2\n" + "[gpg: signing failed: No pinentry\n" + "[GNUPG:] FAILURE sign 67108949\n" + "gpg: [stdin]: clearsign failed: No pinentry\n"; const retStatusObj = {}; EnigmailErrorHandling.parseErrorOutput(errorOutput, retStatusObj); Assert.ok((retStatusObj.statusFlags & EnigmailConstants.DISPLAY_MESSAGE) !== 0); Assert.assertContains(retStatusObj.statusMsg, EnigmailLocale.getString("errorHandling.pinentryError")); }); enigmail-2.0.8/package/tests/execution-test.js000066400000000000000000000031701334302754500213700ustar00rootroot00000000000000/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false, component: false, Cc: false, Ci: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global withEnigmail: false, withTestGpgHome: false */ testing("execution.jsm"); /*global EnigmailExecution: false */ component("enigmail/gpgAgent.jsm"); /*global EnigmailGpgAgent: false */ component("enigmail/gpg.jsm"); /*global EnigmailGpg: false */ test(withTestGpgHome(withEnigmail(function shouldExecCmd() { const command = EnigmailGpgAgent.agentPath; const args = EnigmailGpg.getStandardArgs(false). concat(["--no-tty", "--status-fd", "1", "--logger-fd", "1", "--command-fd", "0"]). concat(["--list-packets", "resources/dev-strike.asc"]); let output = ""; EnigmailExecution.execCmd2(command, args, function(pipe) { //Assert.equal(stdin, 0); }, function(stdout) { output += stdout; }, function(result) { Assert.deepEqual(result, { "exitCode": 0, "stdout": "", "stderr": "" }); } ); Assert.assertContains(output, ":public key packet:"); Assert.assertContains(output, ":user ID packet:"); Assert.assertContains(output, ":signature packet:"); Assert.assertContains(output, ":public sub key packet:"); }))); enigmail-2.0.8/package/tests/expiry-test.js000066400000000000000000000127111334302754500207060ustar00rootroot00000000000000/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false */ /*global do_test_finished: false, component: false, Cc: false, Ci: false, setupTestAccounts: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global withEnigmail: false, withTestGpgHome: false */ testing("keyUsability.jsm"); /*global EnigmailKeyUsability: false */ component("enigmail/keyRing.jsm"); /*global EnigmailKeyRing: false */ component("enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ component("enigmail/locale.jsm"); /*global EnigmailLocale: false */ /*global Math: false, Date: false, uniqueKeyList: false, DAY: false */ setupTestAccounts(); test(function shouldCheckKeyExpiry() { EnigmailKeyRing.clearCache(); let keyListObj = EnigmailKeyRing.getAllKeys(); let now = Math.floor(Date.now() / 1000); let a = [{ keyId: "123" }, { keyId: "456" }, { keyId: "123" }, { keyId: "763" }, { keyId: "456" }]; let b = uniqueKeyList(a); Assert.equal(b.length, 3); keyListObj.keySortList.push(1); // ensure that key list is not reloaded keyListObj.keyList.push(createKeyObj("ABCDEF0123456789", "user1@enigmail-test.net", now + DAY * 5, true)); keyListObj.keyList.push(createKeyObj("DBCDEF0123456789", "user2@enigmail-test.net", now - DAY * 5, true)); keyListObj.keyList.push(createKeyObj("EBCDEF0123456789", "user2@enigmail-test.net", now + DAY * 100, true)); keyListObj.keyList.push(createKeyObj("CBCDEF0123456789", "user3@enigmail-test.net", 0, true)); keyListObj.keyList.push(createKeyObj("BBCDEF0123456789", "user4@enigmail-test.net", now - DAY * 5, true)); keyListObj.keyList.push(createKeyObj("FBCDEF0123456789", "user5@enigmail-test.net", now - DAY * 5, true)); keyListObj.keyList.push(createKeyObj("ACCDEF0123456789", "user5@enigmail-test.net", now + DAY * 5, true)); EnigmailKeyRing.rebuildKeyIndex(); let k = EnigmailKeyUsability.getExpiryForKeySpec([], 10); Assert.equal(k.length, 0); k = EnigmailKeyUsability.getExpiryForKeySpec(["0xABCDEF0123456789", "BBCDEF0123456789", "CBCDEF0123456789"], 10); Assert.equal(k.map(getKeyId).join(" "), "ABCDEF0123456789"); k = EnigmailKeyUsability.getExpiryForKeySpec(["user1@enigmail-test.net", "user2@enigmail-test.net", "user5@enigmail-test.net"], 10); Assert.equal(k.map(getKeyId).join(" "), "ABCDEF0123456789 ACCDEF0123456789"); }); test(function shouldCheckKeySpecs() { let a = EnigmailKeyUsability.getKeysSpecForIdentities(); Assert.equal(a.join(" "), "ABCDEF0123456789 user2@enigmail-test.net user4@enigmail-test.net"); }); test(function shouldGetNewlyExpiredKeys() { EnigmailPrefs.setPref("keyCheckResult", ""); EnigmailPrefs.setPref("warnKeyExpiryNumDays", 10); let a = EnigmailKeyUsability.getNewlyExpiredKeys(); Assert.equal(a.map(getKeyId).join(" "), "ABCDEF0123456789"); EnigmailPrefs.setPref("warnKeyExpiryNumDays", 101); a = EnigmailKeyUsability.getNewlyExpiredKeys(); Assert.equal(a, null); let keyCheckResult = JSON.parse(EnigmailPrefs.getPref("keyCheckResult", "")); keyCheckResult.lastCheck = Date.now() - 86401000; EnigmailPrefs.setPref("keyCheckResult", JSON.stringify(keyCheckResult)); a = EnigmailKeyUsability.getNewlyExpiredKeys(); Assert.equal(a.map(getKeyId).join(" "), "EBCDEF0123456789"); keyCheckResult = JSON.parse(EnigmailPrefs.getPref("keyCheckResult", "")); keyCheckResult.lastCheck = Date.now() - 86401000; EnigmailPrefs.setPref("keyCheckResult", JSON.stringify(keyCheckResult)); a = EnigmailKeyUsability.getNewlyExpiredKeys(); Assert.equal(a.length, 0); }); test(function shouldDoKeyExpiryCheck() { EnigmailPrefs.setPref("keyCheckResult", ""); EnigmailPrefs.setPref("warnKeyExpiryNumDays", 101); let str = EnigmailKeyUsability.keyExpiryCheck(); Assert.equal(str, EnigmailLocale.getString("expiry.keysExpireSoon", [101, '- "user1@enigmail-test.net" (key ID 123456781234567812345678ABCDEF0123456789)\n' + '- "user2@enigmail-test.net" (key ID 123456781234567812345678EBCDEF0123456789)\n' ])); let keyCheckResult = JSON.parse(EnigmailPrefs.getPref("keyCheckResult", "")); keyCheckResult.lastCheck = Date.now() - 86401000; EnigmailPrefs.setPref("keyCheckResult", JSON.stringify(keyCheckResult)); EnigmailPrefs.setPref("warnKeyExpiryNumDays", 10); str = EnigmailKeyUsability.keyExpiryCheck(); Assert.equal(str, ""); }); function getKeyId(key) { return key.keyId; } function createKeyObj(keyId, userId, expiryDate, hasSecretKey) { return { keyId: keyId, userId: userId, fpr: "123456781234567812345678" + keyId, expiryTime: expiryDate, keyUseFor: "escESC", secretAvailable: hasSecretKey, keyTrust: "u", type: "pub", userIds: [{ userId: userId, type: "uid", keyTrust: "u" }], subKeys: [], signatures: [], getEncryptionValidity: function() { return { keyValid: true, reason: "" }; }, getSigningValidity: function() { return { keyValid: true, reason: "" }; }, getKeyExpiry: function() { if (this.expiryTime === 0) return Number.MAX_VALUE; return this.expiryTime; }, get fprFormatted() { return this.fpr; } }; } enigmail-2.0.8/package/tests/files-test.js000066400000000000000000000055711334302754500204760ustar00rootroot00000000000000/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false, component: false */ /*global EnigmailCore: false, Cc: false, Ci: false, EnigmailFiles: false, EnigmailLog: false, EnigmailPrefs: false */ /*global Components: false */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global TestHelper: false, addMacPaths: false */ testing("files.jsm"); component("enigmail/os.jsm"); /*global EnigmailOS: false */ // testing: readFile test(function readFileReturnsContentOfExistingFile() { var md = do_get_cwd().clone(); md = md.parent.parent; md.append("uuid_enig.txt"); var result = EnigmailFiles.readFile(md); Assert.assertContains(result, "847b3a00-7ab1-11d4-8f02-006008948af5"); }); test(function readFileReturnsEmptyStringForNonExistingFile() { var md = do_get_cwd().clone(); md = md.parent.parent; md.append("THIS_FILE_DOESNT_EXIST"); var result = EnigmailFiles.readFile(md); Assert.equal("", result); }); test(function shouldFormatCmdLine() { var md = do_get_cwd(); Assert.equal(EnigmailFiles.formatCmdLine(md, ["1", "2", "3"]), do_get_cwd().path + " 1 2 3"); }); test(function shouldNotAppendExeInDosLikeEnvironment() { TestHelper.resetting(EnigmailOS, "isDosLike", true, function() { const expectedPath = "C:\\Program Files\\GnuPG\\bin\\gpg.exe"; const actualPath = EnigmailFiles.resolvePath(expectedPath, "C:\\Program Files\\GnuPG\\bin", true); Assert.equal(actualPath, expectedPath); }); }); test(function checkDirectory() { let md = do_get_cwd(); Assert.equal(0, EnigmailFiles.ensureWritableDirectory(md, 0x1C0)); md.append("should-exist"); Assert.equal(0, EnigmailFiles.ensureWritableDirectory(md, 0x1C0)); try { md.permissions = 0; Assert.equal(0, EnigmailFiles.ensureWritableDirectory(md, 0x1C0)); } catch (x) { // don't try if permissions cannot be modified } md.remove(true); md.create(Ci.nsIFile.FILE_TYPE, 0x1C0); Assert.equal(3, EnigmailFiles.ensureWritableDirectory(md, 0x1C0)); md.remove(false); let env = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment); if (env.get("USER") !== "root") { md.initWithPath("/does/not/exist"); Assert.equal(1, EnigmailFiles.ensureWritableDirectory(md, 0x1C0)); if (EnigmailOS.isDosLike) { let envS = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment); let sysRoot = envS.get("SystemRoot"); md.initWithPath(sysRoot); } else md.initWithPath("/"); Assert.equal(2, EnigmailFiles.ensureWritableDirectory(md, 0x1C0)); } }); enigmail-2.0.8/package/tests/filters-test.js000066400000000000000000000057721334302754500210470ustar00rootroot00000000000000/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false, component: false */ /*global EnigmailCore: false, Cc: false, Ci: false, EnigmailFiles: false, EnigmailLog: false, EnigmailPrefs: false */ /*global Components: false */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global TestHelper: false, addMacPaths: false */ testing("filters.jsm"); /* global JsmimeEmitter: false, EnigmailFilters: false, processIncomingMail: false */ component("enigmail/files.jsm"); /* global EnigmailFiles: false */ // testing: JsmimeEmitter test(function mimeEmitterBasicTest() { let msgPart = 0; let msgStruct = [ ["1", "multipart/mixed"], ["1.1", "text/plain; part=1"], ["1.2", "multipart/mixed; part=2"], ["1.2.1", "text/plain; part=2.1"], ["1.3", "text/plain; part=3"] ]; function walkMimeTree(node) { Assert.equal(msgStruct[msgPart][0], node.partNum); Assert.equal(msgStruct[msgPart][1], node.headers["content-type"]); ++msgPart; for (let i of node.subParts) { walkMimeTree(i); } } let p = new JsmimeEmitter(false); p.startMessage(); p.startPart("1", { "content-type": "multipart/mixed" }); p.deliverPartData("1", ""); p.startPart("1.1", { "content-type": "text/plain; part=1" }); p.deliverPartData("1.1", "test1"); p.endPart("1.1"); p.startPart("1.2", { "content-type": "multipart/mixed; part=2" }); p.deliverPartData("1.2", "test2"); p.startPart("1.2.1", { "content-type": "text/plain; part=2.1" }); p.deliverPartData("1.2.1", "test2.1"); p.endPart("1.2.1"); p.endPart("1.2"); p.startPart("1.3", { "content-type": "text/plain; part=3" }); p.deliverPartData("1.3", "test3"); p.endPart("1.3"); p.endPart("1"); p.endMessage(); let t = p.getMimeTree(); walkMimeTree(t); }); // testing: processIncomingMail test(function processIncomingMailTest() { var testString = "Subject: Test\r\nContent-Type: text/plain\r\n\r\nThis is a test\r\n"; EnigmailFilters.addNewMailConsumer({ consumeMessage: function(msg, rawMessageData) { try { Assert.equal(rawMessageData, testString); let ct = msg.headers.contentType.type; Assert.equal(ct, "text/plain"); } catch (ex) { Assert.equal(ex.toString(), ""); } do_test_finished(); } }); var md = do_get_cwd().clone(); md.append("test-message.txt"); var ioService = Components.classes["@mozilla.org/network/io-service;1"] .getService(Components.interfaces.nsIIOService); EnigmailFiles.writeFileContents(md, testString, null); do_test_pending(); var fileUri = ioService.newFileURI(md); processIncomingMail(fileUri.spec, true); }); enigmail-2.0.8/package/tests/funcs-test.js000066400000000000000000000047321334302754500205100ustar00rootroot00000000000000/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, EnigmailApp: false */ /*global EnigmailFuncs: false, rulesListHolder: false, EC: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); testing("funcs.jsm"); var EnigmailFuncsTests = { testStripEmail(str, res) { let addr; addr = EnigmailFuncs.stripEmail(str); Assert.equal(addr, res); } }; test(function stripEmail() { EnigmailFuncsTests.testStripEmail("some stuff ", "a@b.de"); EnigmailFuncsTests.testStripEmail("\"some stuff\" a@b.de", "a@b.de"); EnigmailFuncsTests.testStripEmail("\"some, stuff\" a@b.de", "a@b.de"); EnigmailFuncsTests.testStripEmail("some stuff , xyz", "a@b.de,xy@a.xx"); EnigmailFuncsTests.testStripEmail(" a@b.de , ", "a@b.de,aa@bb.de"); EnigmailFuncsTests.testStripEmail(" ,,,,;;;; , ; , ;", ""); EnigmailFuncsTests.testStripEmail(";", ""); EnigmailFuncsTests.testStripEmail(" ,,oneRule,;;; , ;", "oneRule"); EnigmailFuncsTests.testStripEmail(" ,,,nokey,;;;; , nokey2 ; , ;", "nokey,nokey2"); EnigmailFuncsTests.testStripEmail(",,,newsgroupa ", "newsgroupa"); // test invalid email addresses: Assert.throws( function() { EnigmailFuncs.stripEmail(" a@b.de , "); } ); Assert.throws( function() { EnigmailFuncs.stripEmail("\"some stuff a@b.de"); } ); Assert.throws( function() { EnigmailFuncs.stripEmail(""); } ); }); test(function compareMimePartLevel() { Assert.throws( function() { EnigmailFuncs.compareMimePartLevel("1.2.e", "1.2"); } ); let e = EnigmailFuncs.compareMimePartLevel("1.1", "1.1.2"); Assert.equal(e, -2); e = EnigmailFuncs.compareMimePartLevel("1.1", "1.2.2"); Assert.equal(e, -1); e = EnigmailFuncs.compareMimePartLevel("1", "2"); Assert.equal(e, -1); e = EnigmailFuncs.compareMimePartLevel("1.2", "1.1.2"); Assert.equal(e, 1); e = EnigmailFuncs.compareMimePartLevel("1.2.2", "1.2"); Assert.equal(e, 2); e = EnigmailFuncs.compareMimePartLevel("1.2.2", "1.2.2"); Assert.equal(e, 0); }); enigmail-2.0.8/package/tests/gpg-test.js000066400000000000000000000205111334302754500201400ustar00rootroot00000000000000/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false */ /*global TestHelper: false, withEnvironment: false, nsIWindowsRegKey: true */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global TestHelper: false, withEnvironment: false, withEnigmail: false, component: false, withTestGpgHome: false, osUtils: false */ testing("gpg.jsm"); /*global EnigmailGpg: false, getGpgFeature: false, lazyEnv: true, usesDirmngr: false, dirmngrConfiguredWithTor: false */ component("enigmail/execution.jsm"); /*global EnigmailExecution: false, MINIMUM_GPG_VERSION: false */ component("enigmail/subprocess.jsm"); /*global subprocess: false */ component("enigmail/files.jsm"); /*global EnigmailFiles: false */ component("enigmail/os.jsm"); /*global EnigmailOS: false */ component("enigmail/gpgAgent.jsm"); /*global EnigmailGpgAgent: false */ component("enigmail/versioning.jsm"); /*global EnigmailVersioning: false */ function withStubFormatCmdLine(f) { return function() { TestHelper.resetting(EnigmailFiles, "formatCmdLine", function(executable) { return ""; }, function() { f(); }); }; } test(withStubFormatCmdLine(function shouldUseResolveToolPathWhenCheckingDirmngrConfiguration() { TestHelper.resetting(EnigmailGpgAgent, "resolveToolPath", function(executable) { Assert.equal(executable, "gpg-connect-agent"); return; }, function() { TestHelper.resetting(subprocess, "call", function(subprocObj) { return { wait: function() {} }; }, function() { dirmngrConfiguredWithTor(); }); }); })); test(withStubFormatCmdLine(function returnsFalseWhenNotConfiguredToUseTor() { TestHelper.resetting(EnigmailGpg, "getGpgFeature", function(feature) { return false; }, function() { Assert.equal(dirmngrConfiguredWithTor(), false); }); })); test(withStubFormatCmdLine(function returnsTrueWhenConfiguredToUseTor() { TestHelper.resetting(EnigmailGpg, "getGpgFeature", function(feature) { return true; }, function() { TestHelper.resetting(EnigmailGpgAgent, "resolveToolPath", function(executable) { return { path: "/usr/bin/gpg-connect-agent" }; }, function() { TestHelper.resetting(subprocess, "call", function(subprocObj) { subprocObj.stdout("OK - Tor mode is enabled\n OK closing connection\n"); if (typeof subprocObj.done === "function") { subprocObj.done({ exitCode: 0 }); } return { wait: function() { return 0; } }; }, function() { Assert.equal(dirmngrConfiguredWithTor(), true); }); }); }); })); test(withStubFormatCmdLine(function returnsFalseWhenNotConfiguredToUseTor() { TestHelper.resetting(EnigmailGpg, "getGpgFeature", function(feature) { return true; }, function() { TestHelper.resetting(EnigmailGpgAgent, "resolveToolPath", function(executable) { return { path: "/usr/bin/gpg-connect-agent" }; }, function() { TestHelper.resetting(subprocess, "call", function(subprocObj) { subprocObj.stdout("OK - Tor mode is NOT enabled\n OK closing connection\n"); if (typeof subprocObj.done === "function") { subprocObj.done({ exitCode: 0 }); } return { wait: function() { return 0; } }; }, function() { Assert.equal(dirmngrConfiguredWithTor(), false); }); }); }); })); test(withStubFormatCmdLine(function returnsFalseWhenGpgConnectAgentPathIsNotFound() { TestHelper.resetting(EnigmailGpgAgent, "resolveToolPath", function(executable) { return null; }, function() { Assert.equal(dirmngrConfiguredWithTor(), false); }); })); test(withStubFormatCmdLine(function returnsFalseWhenExitCodeIndicatesErrorInExecution() { TestHelper.resetting(EnigmailGpgAgent, "resolveToolPath", function(executable) { return { path: "/usr/bin/gpg-connect-agent" }; }, function() { TestHelper.resetting(subprocess, "call", function(subprocObj) { subprocObj.stdout(""); subprocObj.done(); return { wait: function() {} }; }, function() { Assert.equal(dirmngrConfiguredWithTor(), false); }); }); })); test(function testGetGpgFeatureForWhenVersionIsSupported() { TestHelper.resetting(EnigmailGpg, "agentVersion", MINIMUM_GPG_VERSION, function() { const output = EnigmailGpg.getGpgFeature("version-supported"); Assert.equal(output, true); }); }); test(function testGetGpgFeatureForWhenVersionIsSupported() { TestHelper.resetting(EnigmailGpg, "agentVersion", "2.0.0", function() { const output = EnigmailGpg.getGpgFeature("version-supported"); Assert.equal(output, false); }); }); test(function testGetGpgFeatureForWhenVersionSupportsGpgAgent() { TestHelper.resetting(EnigmailGpg, "agentVersion", "2.0.0", function() { const output = EnigmailGpg.getGpgFeature("supports-gpg-agent"); Assert.equal(output, true); }); }); test(function testGetGpgFeatureForWhenVersionDoesNotSupportGpgAgent() { TestHelper.resetting(EnigmailGpg, "agentVersion", "1.4", function() { const output = EnigmailGpg.getGpgFeature("supports-gpg-agent"); Assert.equal(output, false); }); }); test(function testGetGpgFeatureForWhenVersionDoesNotSupportKeygenPassPhrase() { TestHelper.resetting(EnigmailGpg, "agentVersion", "2.1", function() { const output = EnigmailGpg.getGpgFeature("keygen-passphrase"); Assert.equal(output, false); }); }); test(function testGetGpgFeatureForWhenVersionSupportsKeygenPassPhrase() { TestHelper.resetting(EnigmailGpg, "agentVersion", "2.1.2", function() { const output = EnigmailGpg.getGpgFeature("keygen-passphrase"); Assert.equal(output, true); }); }); test(function testGetGpgFeatureForWhenVersionSupportsGenKeyNoProtection() { TestHelper.resetting(EnigmailGpg, "agentVersion", "2.1.2", function() { const output = EnigmailGpg.getGpgFeature("genkey-no-protection"); Assert.equal(output, true); }); }); test(function testGetGpgFeatureForWhenVersionDoesNotSupportSender() { TestHelper.resetting(EnigmailGpg, "agentVersion", "2.1.14", function() { const output = EnigmailGpg.getGpgFeature("supports-sender"); Assert.equal(output, false); }); }); test(function testGetGpgFeatureForWhenVersionDoesSupportSender() { TestHelper.resetting(EnigmailGpg, "agentVersion", "2.1.15", function() { const output = EnigmailGpg.getGpgFeature("supports-sender"); Assert.equal(output, true); }); }); test(function testGetGpgFeatureForWhenVersionDoesNotSupportGenKeyNoProtection() { TestHelper.resetting(EnigmailGpg, "agentVersion", "2.0", function() { const output = EnigmailGpg.getGpgFeature("genkey-no-protection"); Assert.equal(output, false); }); }); test(function testGetGpgFeatureForWhenVersionSupportsWindowsPhotoidBug() { TestHelper.resetting(EnigmailGpg, "agentVersion", "2.0.16", function() { const output = EnigmailGpg.getGpgFeature("windows-photoid-bug"); Assert.equal(output, false); }); }); test(function testGetGpgFeatureForWhenVersionDoesNotSupportWindowsPhotoidBug() { TestHelper.resetting(EnigmailGpg, "agentVersion", "2.0.15", function() { const output = EnigmailGpg.getGpgFeature("windows-photoid-bug"); Assert.equal(output, true); }); }); test(function testGetGpgFeatureForUnkownFeature() { TestHelper.resetting(EnigmailGpg, "agentVersion", "2.0.15", function() { const output = EnigmailGpg.getGpgFeature("I_am_unsupported"); Assert.equal(output, undefined); }); }); test(function testGetGpgFeatureForNullAgentVersion() { TestHelper.resetting(EnigmailGpg, "agentVersion", null, function() { const output = EnigmailGpg.getGpgFeature("version-supported"); Assert.equal(output, undefined); }); }); test(function testGetGpgFeatureForInvalidAgentVersion() { TestHelper.resetting(EnigmailGpg, "agentVersion", "not a digit", function() { const output = EnigmailGpg.getGpgFeature("version-supported"); Assert.equal(output, undefined); }); }); enigmail-2.0.8/package/tests/gpg-wks-client000077500000000000000000000000461334302754500206320ustar00rootroot00000000000000#!/bin/sh echo "I don't do anything" enigmail-2.0.8/package/tests/gpg-wks-client.c000077500000000000000000000005341334302754500210550ustar00rootroot00000000000000/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ #include #include #include int main( ) { printf("I don't do anything\n"); return 0; } enigmail-2.0.8/package/tests/gpgAgent-test.js000066400000000000000000000174161334302754500211310ustar00rootroot00000000000000/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false */ /*global TestHelper: false, withEnvironment: false, nsIWindowsRegKey: true */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global TestHelper: false, withEnvironment: false, withEnigmail: false, component: false, withTestGpgHome: false, osUtils: false, EnigmailFiles */ testing("gpgAgent.jsm"); /*global EnigmailGpgAgent: false, EnigmailOS: false, getHomedirFromParam: false */ component("enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ component("enigmail/gpg.jsm"); /*global EnigmailGpg: false */ // testing: determineGpgHomeDir // environment: GNUPGHOME // isWin32: // registry Software\GNU\GNUPG\HomeDir // environment: USERPROFILE + \Application Data\GnuPG // environment: SystemRoot + \Application Data\GnuPG // c:\gnupg // environment: HOME + .gnupg test(function determineGpgHomeDirReturnsGNUPGHOMEIfExists() { withEnvironment({ "GNUPGHOME": "stuffResult1" }, function(e) { var enigmail = { environment: e }; Assert.equal("stuffResult1", EnigmailGpgAgent.determineGpgHomeDir(enigmail)); }); }); // this test cannot be reliably performed on Windows if (JSUnit.getOS() != "WINNT") { test(function determineGpgHomeDirReturnsHomePlusGnupgForNonWindowsIfNoGNUPGHOMESpecificed() { withEnvironment({ "HOME": "/my/little/home" }, function(e) { e.set("GNUPGHOME", null); var enigmail = { environment: e }; Assert.equal("/my/little/home/.gnupg", EnigmailGpgAgent.determineGpgHomeDir(enigmail)); }); }); } test(function determineGpgHomeDirReturnsRegistryValueForWindowsIfExists() { withEnvironment({}, function(e) { e.set("GNUPGHOME", null); resetting(EnigmailOS, 'getWinRegistryString', function(a, b, c) { if (a === "Software\\GNU\\GNUPG" && b === "HomeDir" && c === "foo bar") { return "\\foo\\bar\\gnupg"; } else { return "\\somewhere\\else"; } }, function() { resetting(EnigmailOS, 'isWin32', true, function() { var enigmail = { environment: e }; nsIWindowsRegKey = { ROOT_KEY_CURRENT_USER: "foo bar" }; Assert.equal("\\foo\\bar\\gnupg", EnigmailGpgAgent.determineGpgHomeDir(enigmail)); }); }); }); }); test(function determineGpgHomeDirReturnsUserprofileIfItExists() { withEnvironment({ "USERPROFILE": "\\bahamas" }, function(e) { e.set("GNUPGHOME", null); resetting(EnigmailOS, 'getWinRegistryString', function(a, b, c) {}, function() { resetting(EnigmailOS, 'isWin32', true, function() { var enigmail = { environment: e }; nsIWindowsRegKey = { ROOT_KEY_CURRENT_USER: "foo bar" }; Assert.equal("\\bahamas\\Application Data\\GnuPG", EnigmailGpgAgent.determineGpgHomeDir(enigmail)); }); }); }); }); test(function determineGpgHomeDirReturnsSystemrootIfItExists() { withEnvironment({ "SystemRoot": "\\tahiti", "USERPROFILE": null }, function(e) { e.set("GNUPGHOME", null); resetting(EnigmailOS, 'getWinRegistryString', function(a, b, c) {}, function() { resetting(EnigmailOS, 'isWin32', true, function() { var enigmail = { environment: e }; nsIWindowsRegKey = { ROOT_KEY_CURRENT_USER: "foo bar" }; Assert.equal("\\tahiti\\Application Data\\GnuPG", EnigmailGpgAgent.determineGpgHomeDir(enigmail)); }); }); }); }); test(function determineGpgHomeDirReturnsDefaultForWin32() { withEnvironment({ "SystemRoot": null, "USERPROFILE": null }, function(e) { e.set("GNUPGHOME", null); resetting(EnigmailOS, 'getWinRegistryString', function(a, b, c) {}, function() { resetting(EnigmailOS, 'isWin32', true, function() { var enigmail = { environment: e }; nsIWindowsRegKey = { ROOT_KEY_CURRENT_USER: "foo bar" }; Assert.equal("C:\\gnupg", EnigmailGpgAgent.determineGpgHomeDir(enigmail)); }); }); }); }); function withGpgFeatures(features, f) { resetting(EnigmailGpg, 'getGpgFeature', function(feature) { return features.indexOf(feature) != -1; }, f); } // // setAgentPath test(withEnigmail(function setAgentPathDefaultValues(enigmail) { withEnvironment({}, function(e) { enigmail.environment = e; EnigmailGpgAgent.setAgentPath(JSUnit.createStubWindow(), enigmail); Assert.equal("gpg", EnigmailGpgAgent.agentType); Assert.equal("gpg", EnigmailGpgAgent.agentPath.leafName.substr(0, 3)); Assert.equal("gpgconf", EnigmailGpgAgent.gpgconfPath.leafName.substr(0, 7)); Assert.equal("gpg-connect-agent", EnigmailGpgAgent.connGpgAgentPath.leafName.substr(0, 17)); // Basic check to test if GnuPG version was properly extracted Assert.ok(EnigmailGpg.agentVersion.search(/^[2-9]\.[0-9]+(\.[0-9]+)?/) === 0); }); })); // // resolveToolPath test(withEnigmail(function resolveToolPathDefaultValues(enigmail) { withEnvironment({}, function(e) { resetting(EnigmailGpgAgent, 'agentPath', "/usr/bin/gpg-agent", function() { enigmail.environment = e; var result = EnigmailGpgAgent.resolveToolPath("sort"); Assert.equal("sort", result.leafName.substr(0, 4)); }); }); })); // route cannot be tested reliably on non-Unix systems // test(withEnigmail(function resolveToolPathFromPATH(enigmail) { // withEnvironment({PATH: "/sbin"}, function(e) { // resetting(EnigmailGpgAgent, 'agentPath', "/usr/bin/gpg-agent", function() { // enigmail.environment = e; // var result = EnigmailGpgAgent.resolveToolPath("route"); // Assert.equal("/sbin/route", result.path); // }); // }); // })); // detectGpgAgent test(withEnigmail(function detectGpgAgentSetsAgentInfoFromEnvironmentVariable(enigmail) { withEnvironment({ GPG_AGENT_INFO: "a happy agent" }, function(e) { enigmail.environment = e; EnigmailGpgAgent.detectGpgAgent(JSUnit.createStubWindow(), enigmail); Assert.ok(EnigmailGpgAgent.gpgAgentInfo.preStarted); Assert.equal("a happy agent", EnigmailGpgAgent.gpgAgentInfo.envStr); Assert.ok(!EnigmailGpgAgent.gpgAgentIsOptional); }); })); test(withEnigmail(function detectGpgAgentWithNoAgentInfoInEnvironment(enigmail) { withEnvironment({}, function(e) { enigmail.environment = e; EnigmailGpgAgent.detectGpgAgent(JSUnit.createStubWindow(), enigmail); Assert.ok(!EnigmailGpgAgent.gpgAgentInfo.preStarted); Assert.ok(!EnigmailGpgAgent.gpgAgentIsOptional); Assert.equal("none", EnigmailGpgAgent.gpgAgentInfo.envStr); }); })); //getGpgHomeDir test(withTestGpgHome(withEnigmail(function shouldGetGpgHomeDir() { let homedirExpected = osUtils.OS.Path.join(EnigmailFiles.getTempDir(), ".gnupgTest"); let homeDir = EnigmailGpgAgent.getGpgHomeDir(); Assert.equal(homedirExpected, homeDir); }))); // getHomedirFromParam test(function shouldGetHomedirFromParam() { let hd = getHomedirFromParam('--homedir /some1/path'); Assert.equal(hd, "/some1/path"); hd = getHomedirFromParam('--opt1 --homedir /some2/path --opt2'); Assert.equal(hd, "/some2/path"); hd = getHomedirFromParam('--opt1 --homedir "C:\\My Path\\is\\Very \\"long 1\\"" --opt2'); Assert.equal(hd, 'C:\\My Path\\is\\Very \\"long 1\\"'); hd = getHomedirFromParam('--opt1 --homedir "C:\\My Path\\is\\Very \\"long 2\\"" --opt2 "Some \\"more\\" fun"'); Assert.equal(hd, 'C:\\My Path\\is\\Very \\"long 2\\"'); }); enigmail-2.0.8/package/tests/installGnuPG-test.js000066400000000000000000000020021334302754500217250ustar00rootroot00000000000000/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false */ /*global do_test_finished: false, component: false, Cc: false, Ci: false, setupTestAccounts: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global withEnigmail: false, withTestGpgHome: false */ testing("installGnuPG.jsm"); /*global EnigmailInstallGnuPG: false, Installer: false */ test(function shouldCheckHashSum() { let inst = new Installer(null); inst.installerFile = do_get_file("resources/dev-strike.asc", false); inst.hash = "041af0b00ea712bf5ebe349e5cceda148e0797539ee85acd8e06ac8921c6667d"; // SHA256 sum of installerFile Assert.ok(inst.checkHashSum()); }); enigmail-2.0.8/package/tests/key-test.js000066400000000000000000000440551334302754500201640ustar00rootroot00000000000000/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, */ /*global Components: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false, component: false, Cc: false, Ci: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ /* eslint no-useless-concat: 0*/ "use strict"; /*global EnigmailFiles: false */ do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global withEnigmail: false, withTestGpgHome: false, getKeyListEntryOfKey: false, gKeyListObj: true */ testing("key.jsm"); /*global EnigmailKey: false */ component("enigmail/files.jsm"); /*global EnigmailFiles: false */ component("enigmail/openpgp.jsm"); /*global EnigmailOpenPGP: false */ //EnigmailOpenPGP.initialize(); // make sure OpenPGP is initialized and available test(function shouldGetKeyDetails() { const publicKey = do_get_file("resources/dev-strike.asc", false); const secretKey = do_get_file("resources/dev-strike.sec", false); const pubKeyData = EnigmailFiles.readFile(publicKey); let keyList = EnigmailKey.getKeyListFromKeyBlock(pubKeyData, {}); Assert.ok(keyList.length === 1); let k = keyList[0]; Assert.equal(k.id, "781617319CE311C4"); Assert.equal(k.name, "anonymous strike "); Assert.equal(k.fpr, "65537E212DC19025AD38EDB2781617319CE311C4"); Assert.equal(k.isSecret, false); const secKeyData = EnigmailFiles.readFile(secretKey); keyList = EnigmailKey.getKeyListFromKeyBlock(secKeyData, {}); Assert.ok(keyList.length === 1); k = keyList[0]; Assert.equal(k.name, "anonymous strike "); Assert.equal(k.fpr, "65537E212DC19025AD38EDB2781617319CE311C4"); Assert.equal(k.isSecret, true); }); test(function shouldSplitKeys() { const publicKey1 = do_get_file("resources/dev-strike.asc", false); const publicKey2 = do_get_file("resources/dev-tiger.asc", false); const pubKeyData = EnigmailFiles.readFile(publicKey1) + "\r\n" + EnigmailFiles.readFile(publicKey2); let keyBlocks = EnigmailKey.splitArmoredBlocks(pubKeyData); Assert.equal(keyBlocks.length, 2); let keyList = EnigmailKey.getKeyListFromKeyBlock(pubKeyData, {}); Assert.equal(keyList.length, 2); let k = keyList[1]; Assert.equal(k.name, "dev-tiger "); Assert.equal(k.fpr, "8C140834F2D683E9A016D3098439E17046977C46"); Assert.equal(k.isSecret, false); }); test(function shouldMergePubAndSec() { const keyList = EnigmailKey.getKeyListFromKeyBlock( "-----BEGIN PGP PUBLIC KEY BLOCK-----" + "\n" + "Comment: GPGTools - https://gpgtools.org" + "\n" + "\n" + "mQINBFVHm5sBEACs94Ln+RMdeyBpWQtTZ/NZnwntsB10Wd3HTgo5sdA/OOFOJrWe" + "\n" + "tJfAZ/HRxiSu1bwRaFVC8p061ftTbxf8bsdfsykYJQQqPODfcO0/oY2n/Z93ya8K" + "\n" + "TzjXR3qBQ1P7f5x71yeuo7Zrj7B0G44Xjfy+1L0eka9paBqmm3U5cUew5wSr772L" + "\n" + "cflipWfncWXD2rBqgRfR339lRHd3Vwo7V8jje8rlP9msOuTMWCvQuQvpEkfIioXA" + "\n" + "7QipP2f0aPzsavNjFnAfC9rm2FDs6lX4syTMVUWy8IblRYo6MjhNaJFlBJkTCl0b" + "\n" + "ugT9Ge0ZUifuAI0ihVGBpMSh4GF2B3ZPidwGSjgx1sojNHzU/3vBa9DuOmW95qrD" + "\n" + "Notvz61xYueTpOYK6ZeT880QMDvxXG9S5/H1KJxuOF1jx1DibAn9sfP4gtiQFI3F" + "\n" + "WMV9w3YrrqidoWSZBqyBO0Toqt5fNdRyH4ET6HlJAQmFQUbqqnZrc07s/aITZN36" + "\n" + "d9eupCZQfW6e80UkXRPCU53vhh0GQey9reDyVCsV7xi6oXk1fqlpDYigQwEr4+yJ" + "\n" + "+1qAjtSVHJhFE0inQWkUwc2nxef6n7v/M9HszhP/aABadVE49oDaRm54PtA1l0mC" + "\n" + "T8IHcVR4ZDkaNwrHJtidEQcQ/+YVV3g7UJI9+g2nPvgMhk86AzBIlGpG+wARAQAB" + "\n" + "tCthbm9ueW1vdXMgc3RyaWtlIDxzdHJpa2UuZGV2dGVzdEBnbWFpbC5jb20+iQI9" + "\n" + "BBMBCgAnBQJVR5ubAhsDBQkHhh+ABQsJCAcDBRUKCQgLBRYCAwEAAh4BAheAAAoJ" + "\n" + "EHgWFzGc4xHEt/4P/1zf/2VsEwpJVlqwoLiJGQbViCRW34W8rTyL45GjRYAgDXrW" + "\n" + "LDPqxSbotXTXi72Dwug6a/Pn1VI1R2ZaBsWXH8qUYtSV/0b/2HfqUyDhaiuASywM" + "\n" + "dSfTAXa+popNccD5yPCJVBD0xmPCAmrOciYePMMNBk4SCDV5DJcCyGhEAkSeGsXy" + "\n" + "+m2bXb1pTbg6OpqDIPCqlmNQ8ZyAZNzWIyRWcqUY+B6xcZk+n50wG9A0TCOvVjsZ" + "\n" + "+E8Khyha2tfz1WFPmoy0rMD4g2ggvII3v4elosBQW0pxYdkwBAwk6g3DMyUzR6Gc" + "\n" + "NcZnuvnZVBbjCpqXtDJ7UcjjcP8zvzDYlXAY74gM8Nu7/89Pw676rVUXtS7c/LUB" + "\n" + "8Z75FACi7d65Kp8Q6sNYVfi/mTggNwEAuAkjp9acEGvk67q2we+lEoeAwCyfBiBu" + "\n" + "5TmYriLyAvfyoyeMhRjV0FdBaRh+4CkVgSG4/eTLFcnHVB2ZzhX7Uw0qoxM8R+ca" + "\n" + "P75XoVUyXmIpC/UZTrF4IGDUc4jbIqSGU2/Kln4Z8vQpuCw0vavbT93jSCyqaIbK" + "\n" + "qemK8D0rbaoxJq5RLkwU6gJ3dOpQdDRuqUAkfbEZd8yVRSmfugRhCTbdAA5/1kdg" + "\n" + "oWv9xZU7asdsm5cpHpy7lM7ponHsA+B+ykApDqDzPIHDZBoeqKl6qNe2BYOYuQIN" + "\n" + "BFVHm5sBEADBX28bR5QxbrGNVPT3jM60IT+m/GTLH6lm4OcZomAej/XrBOcX/0BY" + "\n" + "tOqqP7Dur8k0A8fcLkZCSBse1m6fvfACo8Vbeunv4IrST5FgXh7bYPZseIy5U7Xn" + "\n" + "0dLqpVXJRqMt3ULS/Rwy18Xx8j9sXJJDAKIqZ4MHwgBknPeeBnD4aG6bJAuBEI6R" + "\n" + "W5lhbG8WFJfCniFuRnim+VD6ucf93x3NkL0TWY0l0PbUdW92sLfiKp1nmz+1dRoB" + "\n" + "ckT701sMs2pk48O5Y/vP6OEDzFzjGdA1r9YkblXjN9VxhSN00Wlmcq1DqEU36+Mq" + "\n" + "i4YIQsuF3NfS13+U2lhjlR5HpRxdDMfHjFYlk5hlOtuvopseYTlMykFl8D7y0qSF" + "\n" + "IAiqVl6pdlSBU84bOLHoCUGens+Ul7m0UShwZdVmMifFw/fJwISZI8D5vGkM3rE7" + "\n" + "TxrHAQ/O1fJnGZNBRgn8LjnZjRGA/u1fweptFY0NyzO5lOzTWI6HBJl1hMave2l0" + "\n" + "vtwBPLrRbbRhy6Z77BNfE9a2w7Y4aFeshjEpWxE8bQIyMrBGaRaiQ2lpXmA6XYZx" + "\n" + "Q8xOUfstsAR1TM+JboXJDuTw+YhaVa2W7Z/RzdtNnahWCCjptFq60DuggLwAGnjr" + "\n" + "5HctpLgwvLVKCeDfU8nchzCkL7Hikh2LC7ySUR/VzORag/TkjxYRRwARAQABiQIl" + "\n" + "BBgBCgAPBQJVR5ubAhsMBQkHhh+AAAoJEHgWFzGc4xHEo+UP/02AIUR0349zGk9a" + "\n" + "4D5Jv007y+d0tWKPL0V2btaq9xQzoM51CtuT0ZoqTO8A0uFmEhCkw++reQcWOz1N" + "\n" + "n+MarPjjJwMjhTPS/H1qiwTXmuwx92xLL0pajloq7oWYwlxsgVGCMDYE0TOMN8p/" + "\n" + "Vc+eoJaWZh8yO1xJGDP98RHbZQWwYN6qLzE4y/ECTHxqi9UKc68qHNVH9ZgtTXnm" + "\n" + "gLAkEvXzRV1UOEEttJ6rrgPrTubjsIG+ckZK5mlivy+UW6XN0WBE0oetKjT8/Cb1" + "\n" + "dQYiX/8MJkGcIUFRurU7gtGW3ncSTdr6WRXaQtfnRn9JG1aSXNYB/xZWzCBdykZp" + "\n" + "+tLuu4A3LVeOzn064hqf3rz2N7b8dWMk5WL5LIUhXYoYc7232RkNSiiKndeJNryv" + "\n" + "TowFt9anuMj4pFgGveClQc9+QGyMVdTe6G5kOJkKG8ydHKFEFObtsTLaut4lHTtx" + "\n" + "n+06QO/LKtQTXqNEyOyfYhbyX7xDbCbu4/MA23MzTs1hhwgIy4+UejU/Yeny6VkB" + "\n" + "odA3bFyEYKWPoMDDgfdlZbzjv3qAN4Qq+ollo8K3gJgH0QONrUaRY84/hil05T4E" + "\n" + "nUZiXdzPWvhMv5lEK+pTMlO8FbOG31+aB8rxCg+wp1ovyC/fp5XjZaLHcyPAWAXK" + "\n" + "LBn4tb400iHp7byO85tF/H0OOI1K" + "\n" + "=CVNK" + "\n" + "-----END PGP PUBLIC KEY BLOCK-----" + "\n" + "-----BEGIN PGP PRIVATE KEY BLOCK-----" + "\n" + "Comment: GPGTools - https://gpgtools.org" + "\n" + "\n" + "lQc+BFVHm5sBEACs94Ln+RMdeyBpWQtTZ/NZnwntsB10Wd3HTgo5sdA/OOFOJrWe" + "\n" + "tJfAZ/HRxiSu1bwRaFVC8p061ftTbxf8bsdfsykYJQQqPODfcO0/oY2n/Z93ya8K" + "\n" + "TzjXR3qBQ1P7f5x71yeuo7Zrj7B0G44Xjfy+1L0eka9paBqmm3U5cUew5wSr772L" + "\n" + "cflipWfncWXD2rBqgRfR339lRHd3Vwo7V8jje8rlP9msOuTMWCvQuQvpEkfIioXA" + "\n" + "7QipP2f0aPzsavNjFnAfC9rm2FDs6lX4syTMVUWy8IblRYo6MjhNaJFlBJkTCl0b" + "\n" + "ugT9Ge0ZUifuAI0ihVGBpMSh4GF2B3ZPidwGSjgx1sojNHzU/3vBa9DuOmW95qrD" + "\n" + "Notvz61xYueTpOYK6ZeT880QMDvxXG9S5/H1KJxuOF1jx1DibAn9sfP4gtiQFI3F" + "\n" + "WMV9w3YrrqidoWSZBqyBO0Toqt5fNdRyH4ET6HlJAQmFQUbqqnZrc07s/aITZN36" + "\n" + "d9eupCZQfW6e80UkXRPCU53vhh0GQey9reDyVCsV7xi6oXk1fqlpDYigQwEr4+yJ" + "\n" + "+1qAjtSVHJhFE0inQWkUwc2nxef6n7v/M9HszhP/aABadVE49oDaRm54PtA1l0mC" + "\n" + "T8IHcVR4ZDkaNwrHJtidEQcQ/+YVV3g7UJI9+g2nPvgMhk86AzBIlGpG+wARAQAB" + "\n" + "/gMDAtfSz5hVoDvp4Vugj4T3VQk8mJ3uYDZmPbNL8SK18VTIVpd3xgrjTP+JEtB+" + "\n" + "aw1WQK4Qik0BdKAu9Lv6wz4u/QNC8q4x3lBcoYleD6iXRL2Tpnh7RcEakIoxIeFH" + "\n" + "joBTZOI+v0HUlyVvSkIaEhE60UvdX+If9p9sx5+uHdYRRfOkM3SZMxLxCUVHMp1e" + "\n" + "ZBcmW+x9UiyA07wXyvAhlS2/iTijDtQFRqK8xs9w7zn0A12afksGtPEL7J5MRqQs" + "\n" + "BuxUrWSKVQ3DkgWXd56qEtbKuklKXe9t93eMPvcFQ2ZVhgic436dygtpNgkGliVq" + "\n" + "Di83wUjorTZFMeC0uhvQ2akfQxvj5TgYoI0rFABvn/6He1LBSWyiu6ZK1nC1PKUc" + "\n" + "KLGQGfq+kbHwJg3q0wIJ5+e1v6hZ9HClhaRsR4ADnTDnp3mGqPxDWvQox1S2+ESx" + "\n" + "8N6AcZ+q47D78IE4EzF4LyQ0g9FdDiNsPwqN4oS2/ZkXb/IbFoVoottU7915KqZO" + "\n" + "6kiJvpMcZrs4TJ4zR++CGBEvJDfUE4RoQHQe/XLA1RJXIwXr3kWPvB2Tc16vdhkh" + "\n" + "LZ9z/HOrPW6SI/UwVYFHpmJIYj3nHdjGcyWwz0KmQ3H5+AYe36afwJws6TFx/QLi" + "\n" + "fqlOkcaBaiQwpcpuSX2y4rTgcjDEaVdPGmvs2m5vKv66a8yybIl2P0veVTutGtC8" + "\n" + "DfQaggqZWQYHmXXvGUnBM+H9YSBJ2g3W3w51fKcN2FtX42OsVxXqZkqlGR2zBE00" + "\n" + "ilVZmiv6ajV9mmO7W8EV9TPqjrYuEDf2M57LllQ7OB1p1v6CtqIyVSL/Jak6ckMT" + "\n" + "5VdqMoup6ib5j4CR+C4i7Btu+gkXhW775l/jbFlUXKE5Vn+LAAIOpxiVZ2Z7azL6" + "\n" + "sNwxtfmpaTAgIvHGSysgPeXeEN3fgTsfZ0PYaqlEHggsYDDU4XvXIOKcUmrr6zEI" + "\n" + "KXeeS0+V3nxSIb9kQHYZyUFvNv98gCCj0wgNl+LoVJ9NvMkaOrCS0jkRaxJicQfa" + "\n" + "bu4XL9XbUBESuHvG6jiK6DNlhT1j3qFFcRBO7COI3OQ0JD7Y1XPYYR48EP69Fwe0" + "\n" + "82LZH5dq9kslpn8VsuygTum9jYFnE5UVLfmjbroFu9YlLE54T0CdZ4UQEWTrZiuz" + "\n" + "TXYf13FaVEgfAim+hjdUUVSCptsX2crC7Vrsk/xMjT2ETU1w/yZb5BVoCvbK/eaf" + "\n" + "sqQAPGElSp0YlI/mgpbc5rRQzcSXghenjOol/gJM0MbFJuyQ93sLW0Gi7zEeBxQi" + "\n" + "aO/Ua4F4VhPilPf+T66fNMM0bG29X5j41eRrN0m1ly4M+jOOIyocLcUamgFsRDTe" + "\n" + "XG9kHZUylAJqNMwQvDzbVSTbHKjhOTa3PyinrTwauYiQP6fIbd4JWkIW88cBynbR" + "\n" + "IHHCYYGxZoDUDd366QyNHKTd5wxw1MicK54tUDcUVDq8NKC+yGuGi6WLYt4WdNEg" + "\n" + "pYb/MzxGRzbhVEHNbfFEr5e706VcQlglpPcMTUctzRVF18wWHzPVbHdZiTBXdr0t" + "\n" + "hJkRNaAvnmQMvP0bXk+QDGW24Z66Yz0X2YzFo4Rdp/MAm/1KwagIu0hIGbwk8egq" + "\n" + "tq6Q5zyyiSp7dVvcNAPaEzEKZXRSrSjyNwQw0CHI940SRgK5JDkAMHZWK8vg8Ih4" + "\n" + "DR7m69XmYXwvTScrQqkFa+8XIb5QqeH7W3Qe4aKiC6QOJav/ptYLZ+s1TTzeIOA8" + "\n" + "5zxhWPj81YgifDtWPc4MG+Y0QuSzMdMue+/oJUt6lyQmtCthbm9ueW1vdXMgc3Ry" + "\n" + "aWtlIDxzdHJpa2UuZGV2dGVzdEBnbWFpbC5jb20+iQI9BBMBCgAnBQJVR5ubAhsD" + "\n" + "BQkHhh+ABQsJCAcDBRUKCQgLBRYCAwEAAh4BAheAAAoJEHgWFzGc4xHEt/4P/1zf" + "\n" + "/2VsEwpJVlqwoLiJGQbViCRW34W8rTyL45GjRYAgDXrWLDPqxSbotXTXi72Dwug6" + "\n" + "a/Pn1VI1R2ZaBsWXH8qUYtSV/0b/2HfqUyDhaiuASywMdSfTAXa+popNccD5yPCJ" + "\n" + "VBD0xmPCAmrOciYePMMNBk4SCDV5DJcCyGhEAkSeGsXy+m2bXb1pTbg6OpqDIPCq" + "\n" + "lmNQ8ZyAZNzWIyRWcqUY+B6xcZk+n50wG9A0TCOvVjsZ+E8Khyha2tfz1WFPmoy0" + "\n" + "rMD4g2ggvII3v4elosBQW0pxYdkwBAwk6g3DMyUzR6GcNcZnuvnZVBbjCpqXtDJ7" + "\n" + "UcjjcP8zvzDYlXAY74gM8Nu7/89Pw676rVUXtS7c/LUB8Z75FACi7d65Kp8Q6sNY" + "\n" + "Vfi/mTggNwEAuAkjp9acEGvk67q2we+lEoeAwCyfBiBu5TmYriLyAvfyoyeMhRjV" + "\n" + "0FdBaRh+4CkVgSG4/eTLFcnHVB2ZzhX7Uw0qoxM8R+caP75XoVUyXmIpC/UZTrF4" + "\n" + "IGDUc4jbIqSGU2/Kln4Z8vQpuCw0vavbT93jSCyqaIbKqemK8D0rbaoxJq5RLkwU" + "\n" + "6gJ3dOpQdDRuqUAkfbEZd8yVRSmfugRhCTbdAA5/1kdgoWv9xZU7asdsm5cpHpy7" + "\n" + "lM7ponHsA+B+ykApDqDzPIHDZBoeqKl6qNe2BYOYnQc+BFVHm5sBEADBX28bR5Qx" + "\n" + "brGNVPT3jM60IT+m/GTLH6lm4OcZomAej/XrBOcX/0BYtOqqP7Dur8k0A8fcLkZC" + "\n" + "SBse1m6fvfACo8Vbeunv4IrST5FgXh7bYPZseIy5U7Xn0dLqpVXJRqMt3ULS/Rwy" + "\n" + "18Xx8j9sXJJDAKIqZ4MHwgBknPeeBnD4aG6bJAuBEI6RW5lhbG8WFJfCniFuRnim" + "\n" + "+VD6ucf93x3NkL0TWY0l0PbUdW92sLfiKp1nmz+1dRoBckT701sMs2pk48O5Y/vP" + "\n" + "6OEDzFzjGdA1r9YkblXjN9VxhSN00Wlmcq1DqEU36+Mqi4YIQsuF3NfS13+U2lhj" + "\n" + "lR5HpRxdDMfHjFYlk5hlOtuvopseYTlMykFl8D7y0qSFIAiqVl6pdlSBU84bOLHo" + "\n" + "CUGens+Ul7m0UShwZdVmMifFw/fJwISZI8D5vGkM3rE7TxrHAQ/O1fJnGZNBRgn8" + "\n" + "LjnZjRGA/u1fweptFY0NyzO5lOzTWI6HBJl1hMave2l0vtwBPLrRbbRhy6Z77BNf" + "\n" + "E9a2w7Y4aFeshjEpWxE8bQIyMrBGaRaiQ2lpXmA6XYZxQ8xOUfstsAR1TM+JboXJ" + "\n" + "DuTw+YhaVa2W7Z/RzdtNnahWCCjptFq60DuggLwAGnjr5HctpLgwvLVKCeDfU8nc" + "\n" + "hzCkL7Hikh2LC7ySUR/VzORag/TkjxYRRwARAQAB/gMDAtfSz5hVoDvp4ZpoCdrR" + "\n" + "S4An9JABiMWCTG4IUYuShVQKJJR3KtZ0C5D4gH4BUlEGDsUtY3/6deakvzedbVxv" + "\n" + "mb59QoU8GuHZ/iWAlsY+37YIBu9kbywIFDDGJeD9th9cXPpuQ31kEvwE37gsNn5p" + "\n" + "IB38oB3mgWoLi2nH4AAVNZXPNBTJ7rS1pi69v4BepUTbglb805ypmWJllzhyRUvm" + "\n" + "DAU/8cu0cPWaaBU4s8Mi7SLv2s+i9EPYNzDkBEy7RYvZApP7G8x447iYPRvmaFnB" + "\n" + "Fd3Ctpd3xkZhZatDV6MJCEfssIdy5yARV4zwCcZ5JDGXGlxoiPH6A3b11SwPOEMv" + "\n" + "QJ0PRZ334XLK93hwzxjYKBJ8hBrR2oPvRUOAVs2/J8JSASYrufyqkXnYJ1EBnP3H" + "\n" + "5TwbjRQ9Qmg1ScFCzTfYgu5emiIF5LFAfTasZGSJvjrXFVeocCswHUvHztzJmpbt" + "\n" + "BAov3Lw6lBkxdvhZomyx74CGOnyz/eFD/khvIV/oms5lR8NNrkpkRGZ/xCN8Kmau" + "\n" + "KhRBebGVEITzOWJQHz0QMhuTloVvtDbDDgqW8gH8eVQJkQCDw8Wd79uj0kw1Xaln" + "\n" + "nseFPLCRNRN0js7cCGW95fVtawRNBCNYambNCLthkBfzT0+1/ULRC2JrP1rutr6D" + "\n" + "sye0S44kNyXKhM72Hamu4XygYlzRsYQflv2PgypjVmkdcZ2rwomMVdqQll3Q7jde" + "\n" + "kWKDpKdx7lR2pnDoXmn43VR1X4uD1PHab56tYE0JUrKDgqZJqzCwJXc3FcPV7LgD" + "\n" + "8pISoMZJ5+84UiRBvNN7N24kpLd9k97Iz29qY6u86Uy/f7/X77qur58r6K04vTfH" + "\n" + "8nA/ybc/9Ube6oyQ44A2NEwBrP3NUA6lHNPeaYBO2RGxTJJU2Edxuy3bJMpEkBhU" + "\n" + "CeWWIZnuxojF+pGjiPLArVZg6Mahc0GlYoiA66cxTuoGHM/wO5Xl0f33L0jny3Kv" + "\n" + "I9OWvUJbKs+J8G6q0zorl5nNmPpTwGYLJkUKhLtMhjS+jf5XA7b5jN1079/oToXu" + "\n" + "Xsfl6J7vnwJt7gglLRpK8iw3xlF4X4AWodBLj36HEyOgTimJXLt2fdpIrkiutUFF" + "\n" + "qdWdZeK+sII8ZAyrfgvwxvmairFK3ylbPwA340jsRQeA8boOOSiDV0cPOszQi1Rt" + "\n" + "Ygnae9or6faA3lqe+fRQi5JsmnJ1jLMe0mxw1mMOR4YLCMjgBc0CTMkY5kmCykA7" + "\n" + "NCQBec2Fueu9cxsu7LJO4+OAUF+i+G/BWPzvWqyJrLk52tME2TxyVL5PRZvqAcrK" + "\n" + "CV+d9IKxH4Ng40qPXL1gM27wWrrFa6RGq12oGvTqkVcomImzqK1ASSPWU3bSYiOy" + "\n" + "2JOQvjLxjQw6emNYG09SlKrzNmXlbrZ4BfolL4eI8H2+3+UG4l/cXxPnLEeQzkvu" + "\n" + "XuW5yajWoNBocEICcopmv8QgpwgiTUstmOTMFXD1EbVasonaH5R+wxBMB4Y1K+ot" + "\n" + "eRawIyFA75FO8HCPoTBe5+Qb6G8+5i7nsgDtHG337G8JFz3hE3U++90zbYxxtjYx" + "\n" + "Y2PYHfOwsDE8IDu1ZqzuB7lgrNADzOzelhSrcaW/jNHPGlxcsPTXl7S2QazgIPqk" + "\n" + "kZ9g4ceXSsZOV9Yl4Bu2ODeUiVeYGGEXwJ7WAKNvaR3bMbhl+iwIQFy3A12/fz0w" + "\n" + "B16C9qp7P9+5FEFWjlqi/28dSfECiDD4X4iyEe+sWTS86Cv0VsL300dIUQPIs65d" + "\n" + "ddkrIkcpM4jyabKTZcltiQIlBBgBCgAPBQJVR5ubAhsMBQkHhh+AAAoJEHgWFzGc" + "\n" + "4xHEo+UP/02AIUR0349zGk9a4D5Jv007y+d0tWKPL0V2btaq9xQzoM51CtuT0Zoq" + "\n" + "TO8A0uFmEhCkw++reQcWOz1Nn+MarPjjJwMjhTPS/H1qiwTXmuwx92xLL0pajloq" + "\n" + "7oWYwlxsgVGCMDYE0TOMN8p/Vc+eoJaWZh8yO1xJGDP98RHbZQWwYN6qLzE4y/EC" + "\n" + "THxqi9UKc68qHNVH9ZgtTXnmgLAkEvXzRV1UOEEttJ6rrgPrTubjsIG+ckZK5mli" + "\n" + "vy+UW6XN0WBE0oetKjT8/Cb1dQYiX/8MJkGcIUFRurU7gtGW3ncSTdr6WRXaQtfn" + "\n" + "Rn9JG1aSXNYB/xZWzCBdykZp+tLuu4A3LVeOzn064hqf3rz2N7b8dWMk5WL5LIUh" + "\n" + "XYoYc7232RkNSiiKndeJNryvTowFt9anuMj4pFgGveClQc9+QGyMVdTe6G5kOJkK" + "\n" + "G8ydHKFEFObtsTLaut4lHTtxn+06QO/LKtQTXqNEyOyfYhbyX7xDbCbu4/MA23Mz" + "\n" + "Ts1hhwgIy4+UejU/Yeny6VkBodA3bFyEYKWPoMDDgfdlZbzjv3qAN4Qq+ollo8K3" + "\n" + "gJgH0QONrUaRY84/hil05T4EnUZiXdzPWvhMv5lEK+pTMlO8FbOG31+aB8rxCg+w" + "\n" + "p1ovyC/fp5XjZaLHcyPAWAXKLBn4tb400iHp7byO85tF/H0OOI1K" + "\n" + "=h0dN" + "\n" + "-----END PGP PRIVATE KEY BLOCK-----", {}); Assert.equal(keyList.length, 1); let k = keyList[0]; Assert.ok(k.isSecret); Assert.equal(k.name, "anonymous strike "); }); test(function testBinary() { let data = atob( "mQINBFVHm5sBEACs94Ln+RMdeyBpWQtTZ/NZnwntsB10Wd3HTgo5sdA/OOFOJrWetJfAZ/HRxiSu1bwRaFVC8p061ftTbxf8bsdfsykYJQQqPODfcO0/oY2n/Z93ya8KTzjXR3qBQ1P7f5x71yeuo7Zrj7B0G44Xjfy+1L0eka9paBqmm3U5cUew5wSr772LcflipWfncWXD2rBqgRfR339lRHd3Vwo7V8jje8rlP9msOuTMWCvQuQvpEkfIioXA7QipP2f0aPzsavNjFnAfC9rm2FDs6lX4syTMVUWy8IblRYo6MjhNaJFlBJkTCl0bugT9Ge0ZUifuAI0ihVGBpMSh4GF2B3ZPidwGSjgx1sojNHzU/3vBa9DuOmW95qrDNotvz61xYueTpOYK6ZeT880QMDvxXG9S5/H1KJxuOF1jx1DibAn9sfP4gtiQFI3FWMV9w3YrrqidoWSZBqyBO0Toqt" + "5fNdRyH4ET6HlJAQmFQUbqqnZrc07s/aITZN36d9eupCZQfW6e80UkXRPCU53vhh0GQey9reDyVCsV7xi6oXk1fqlpDYigQwEr4+yJ+1qAjtSVHJhFE0inQWkUwc2nxef6n7v/M9HszhP/aABadVE49oDaRm54PtA1l0mCT8IHcVR4ZDkaNwrHJtidEQcQ/+YVV3g7UJI9+g2nPvgMhk86AzBIlGpG+wARAQABtCthbm9ueW1vdXMgc3RyaWtlIDxzdHJpa2UuZGV2dGVzdEBnbWFpbC5jb20+iQI9BBMBCgAnBQJVR5ubAhsDBQkHhh+ABQsJCAcDBRUKCQgLBRYCAwEAAh4BAheAAAoJEHgWFzGc4xHEt/4P/1zf/2VsEwpJVlqwoLiJGQbViCRW34W8rTyL45GjRYAgDXrWLDPqxSbotXTXi72Dwug6a/Pn1VI1R2ZaBsWXH8qUYtSV/0b/2Hfq" + "UyDhaiuASywMdSfTAXa+popNccD5yPCJVBD0xmPCAmrOciYePMMNBk4SCDV5DJcCyGhEAkSeGsXy+m2bXb1pTbg6OpqDIPCqlmNQ8ZyAZNzWIyRWcqUY+B6xcZk+n50wG9A0TCOvVjsZ+E8Khyha2tfz1WFPmoy0rMD4g2ggvII3v4elosBQW0pxYdkwBAwk6g3DMyUzR6GcNcZnuvnZVBbjCpqXtDJ7UcjjcP8zvzDYlXAY74gM8Nu7/89Pw676rVUXtS7c/LUB8Z75FACi7d65Kp8Q6sNYVfi/mTggNwEAuAkjp9acEGvk67q2we+lEoeAwCyfBiBu5TmYriLyAvfyoyeMhRjV0FdBaRh+4CkVgSG4/eTLFcnHVB2ZzhX7Uw0qoxM8R+caP75XoVUyXmIpC/UZTrF4IGDUc4jbIqSGU2/Kln4Z8vQpuCw0vavbT93jSCyqaIbKqemK8D0rbaoxJq" + "5RLkwU6gJ3dOpQdDRuqUAkfbEZd8yVRSmfugRhCTbdAA5/1kdgoWv9xZU7asdsm5cpHpy7lM7ponHsA+B+ykApDqDzPIHDZBoeqKl6qNe2BYOYuQINBFVHm5sBEADBX28bR5QxbrGNVPT3jM60IT+m/GTLH6lm4OcZomAej/XrBOcX/0BYtOqqP7Dur8k0A8fcLkZCSBse1m6fvfACo8Vbeunv4IrST5FgXh7bYPZseIy5U7Xn0dLqpVXJRqMt3ULS/Rwy18Xx8j9sXJJDAKIqZ4MHwgBknPeeBnD4aG6bJAuBEI6RW5lhbG8WFJfCniFuRnim+VD6ucf93x3NkL0TWY0l0PbUdW92sLfiKp1nmz+1dRoBckT701sMs2pk48O5Y/vP6OEDzFzjGdA1r9YkblXjN9VxhSN00Wlmcq1DqEU36+Mqi4YIQsuF3NfS13+U2lhjlR5HpRxdDMfHjFYlk5hl" + "OtuvopseYTlMykFl8D7y0qSFIAiqVl6pdlSBU84bOLHoCUGens+Ul7m0UShwZdVmMifFw/fJwISZI8D5vGkM3rE7TxrHAQ/O1fJnGZNBRgn8LjnZjRGA/u1fweptFY0NyzO5lOzTWI6HBJl1hMave2l0vtwBPLrRbbRhy6Z77BNfE9a2w7Y4aFeshjEpWxE8bQIyMrBGaRaiQ2lpXmA6XYZxQ8xOUfstsAR1TM+JboXJDuTw+YhaVa2W7Z/RzdtNnahWCCjptFq60DuggLwAGnjr5HctpLgwvLVKCeDfU8nchzCkL7Hikh2LC7ySUR/VzORag/TkjxYRRwARAQABiQIlBBgBCgAPBQJVR5ubAhsMBQkHhh+AAAoJEHgWFzGc4xHEo+UP/02AIUR0349zGk9a4D5Jv007y+d0tWKPL0V2btaq9xQzoM51CtuT0ZoqTO8A0uFmEhCkw++reQcWOz1Nn+" + "MarPjjJwMjhTPS/H1qiwTXmuwx92xLL0pajloq7oWYwlxsgVGCMDYE0TOMN8p/Vc+eoJaWZh8yO1xJGDP98RHbZQWwYN6qLzE4y/ECTHxqi9UKc68qHNVH9ZgtTXnmgLAkEvXzRV1UOEEttJ6rrgPrTubjsIG+ckZK5mlivy+UW6XN0WBE0oetKjT8/Cb1dQYiX/8MJkGcIUFRurU7gtGW3ncSTdr6WRXaQtfnRn9JG1aSXNYB/xZWzCBdykZp+tLuu4A3LVeOzn064hqf3rz2N7b8dWMk5WL5LIUhXYoYc7232RkNSiiKndeJNryvTowFt9anuMj4pFgGveClQc9+QGyMVdTe6G5kOJkKG8ydHKFEFObtsTLaut4lHTtxn+06QO/LKtQTXqNEyOyfYhbyX7xDbCbu4/MA23MzTs1hhwgIy4+UejU/Yeny6VkBodA3bFyEYKWPoMDDgfdlZbzjv3qA" + "N4Qq+ollo8K3gJgH0QONrUaRY84/hil05T4EnUZiXdzPWvhMv5lEK+pTMlO8FbOG31+aB8rxCg+wp1ovyC/fp5XjZaLHcyPAWAXKLBn4tb400iHp7byO85tF/H0OOI1K"); let keyList = EnigmailKey.getKeyListFromKeyBlock(data, {}); Assert.equal(keyList.length, 1); let k = keyList[0]; Assert.equal(k.id, "781617319CE311C4"); Assert.ok(!k.isSecret); Assert.equal(k.name, "anonymous strike "); }); enigmail-2.0.8/package/tests/keyEditor-test.js000066400000000000000000000104451334302754500213270ustar00rootroot00000000000000/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false, withTestGpgHome:false */ /*global Ec: false, Cc: false, Ci: false, do_print: false, EnigmailCore: false, EnigmailKeyEditor: false, Components: false, component: false, EnigmailPrefs: false, EnigmailExecution: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global withEnigmail: false */ testing("keyEditor.jsm"); /*global editKey: false */ component("enigmail/keyRing.jsm"); /*global EnigmailKeyRing: false */ component("enigmail/time.jsm"); /*global EnigmailTime: false */ test(withTestGpgHome(withEnigmail(function shouldEditKey() { importKeys(); do_test_pending(); var window = JSUnit.createStubWindow(); editKey( window, false, null, "781617319CE311C4", "trust", { trustLevel: 5 }, function(inputData, keyEdit, ret) { ret.writeTxt = ""; ret.errorMsg = ""; ret.quitNow = true; ret.exitCode = 0; }, null, function(exitCode, errorMsg) { Assert.equal(exitCode, 0); Assert.equal("", errorMsg); do_test_finished(); } ); }))); test(withTestGpgHome(withEnigmail(function shouldSetTrust() { importKeys(); do_test_pending(); var window = JSUnit.createStubWindow(); EnigmailKeyEditor.setKeyTrust(window, "781617319CE311C4", 5, function(exitCode, errorMsg) { Assert.equal(exitCode, 0); Assert.equal("", errorMsg); do_test_finished(); } ); }))); test(withTestGpgHome(withEnigmail(function shouldSignKey() { importKeys(); do_test_pending(); var window = JSUnit.createStubWindow(); EnigmailKeyEditor.signKey(window, "anonymous strike ", "781617319CE311C4", false, 5, function(exitCode, errorMsg) { Assert.equal(exitCode, -1); Assert.equal("The key is already signed, you cannot sign it twice.", errorMsg); do_test_finished(); } ); }))); test(withTestGpgHome(function importKeyForEdit() { const result = importKeys(); Assert.equal(result[0], 0); Assert.equal(result[1], 0); })); test(withTestGpgHome(withEnigmail(function shouldGetSecretKeys() { const secretKey = do_get_file("resources/dev-strike.sec", false); const errorMsgObj = {}; const importedKeysObj = {}; const window = JSUnit.createStubWindow(); const importResult = EnigmailKeyRing.importKeyFromFile(secretKey, errorMsgObj, importedKeysObj); const createDate = EnigmailTime.getDateTime(1430756251, true, false); const expectedKey = [{ userId: "anonymous strike ", keyId: "781617319CE311C4", created: createDate, keyTrust: "u" }]; do_test_pending(); EnigmailKeyEditor.setKeyTrust(window, "781617319CE311C4", 5, function() { let result = EnigmailKeyRing.getAllSecretKeys(); Assert.equal(result.length, 1); Assert.equal(result[0].userId, expectedKey[0].userId); Assert.equal(result[0].keyId, expectedKey[0].keyId); Assert.equal(result[0].created, expectedKey[0].created); Assert.equal(result[0].keyTrust, expectedKey[0].keyTrust); do_test_finished(); } ); }))); test(function shouldDoErrorHandling() { let nextCmd = ""; /* global GpgEditorInterface: false */ let editor = new GpgEditorInterface(null, null, ""); editor._stdin = { write: function processStdin(data) { nextCmd = data; } }; editor.gotData("[GNUPG:] FAILURE sign 85\n"); Assert.ok(editor.errorMsg.length > 0); Assert.equal("save\n", nextCmd); }); function importKeys() { var publicKey = do_get_file("resources/dev-strike.asc", false); var secretKey = do_get_file("resources/dev-strike.sec", false); var errorMsgObj = {}; var importedKeysObj = {}; var publicImportResult = EnigmailKeyRing.importKeyFromFile(publicKey, errorMsgObj, importedKeysObj); var secretImportResult = EnigmailKeyRing.importKeyFromFile(secretKey, errorMsgObj, importedKeysObj); return [publicImportResult, secretImportResult]; } enigmail-2.0.8/package/tests/keyRefreshService-test.js000066400000000000000000000213101334302754500230110ustar00rootroot00000000000000/*global do_load_module: false, do_get_file: false, do_get_cwd: false, test: false, Assert: false, resetting: false */ /*global Cc: false, Ci: false, testing: false, component: false*/ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global TestHelper: false, withEnigmail: false, withTestGpgHome: false, withLogFiles: false, assertLogContains: false, assertLogDoesNotContain: false, withPreferences: false */ testing("keyRefreshService.jsm"); /*global EnigmailKeyRefreshService: false, calculateMaxTimeForRefreshInMilliseconds, HOURS_PER_WEEK_ENIGMAIL_IS_ON_PREF, calculateWaitTimeInMilliseconds, startWith, ONE_HOUR_IN_MILLISEC, refreshWith, refreshKey: false, getRandomKeyId: false, setupNextRefresh: false */ component("enigmail/keyRing.jsm"); /*global EnigmailKeyRing: false */ component("enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ component("enigmail/rng.jsm"); /*global EnigmailRNG: false */ component("enigmail/keyserverUris.jsm"); /*global EnigmailKeyserverURIs: false */ function withKeys(f) { return function() { try { EnigmailKeyRing.clearCache(); f(); } finally { EnigmailKeyRing.clearCache(); } }; } const emptyFunction = function() {}; const HOURS_PER_WEEK_ENIGMAIL_IS_ON = 40; test(function calculateMaxTimeForRefreshForFortyHoursAWeek() { let totalKeys = 3; let millisecondsAvailableForRefresh = HOURS_PER_WEEK_ENIGMAIL_IS_ON * 60 * 60 * 1000; let maxTimeForRefresh = millisecondsAvailableForRefresh / totalKeys; EnigmailPrefs.setPref(HOURS_PER_WEEK_ENIGMAIL_IS_ON_PREF, 40); Assert.ok(calculateMaxTimeForRefreshInMilliseconds(totalKeys) == maxTimeForRefresh); }); test(function calculateMaxTimeForRefreshForTenHoursAWeek() { let totalKeys = 2; let millisecondsAvailableForRefresh = HOURS_PER_WEEK_ENIGMAIL_IS_ON * 60 * 60 * 1000; let maxTimeForRefresh = millisecondsAvailableForRefresh / totalKeys; EnigmailPrefs.setPref(HOURS_PER_WEEK_ENIGMAIL_IS_ON_PREF, 40); Assert.ok(calculateMaxTimeForRefreshInMilliseconds(totalKeys) == maxTimeForRefresh); }); test(function waitTimeShouldBeLessThanMax() { let totalKeys = 4; let millisecondsAvailableForRefresh = HOURS_PER_WEEK_ENIGMAIL_IS_ON * 60 * 60 * 1000; let maxTimeForRefresh = millisecondsAvailableForRefresh / totalKeys; EnigmailPrefs.setPref(HOURS_PER_WEEK_ENIGMAIL_IS_ON_PREF, 40); Assert.ok(calculateWaitTimeInMilliseconds(totalKeys) <= maxTimeForRefresh); }); test(function calculateNewTimeEachCall() { let totalKeys = 3; let firstTime = calculateWaitTimeInMilliseconds(totalKeys); let secondTime = calculateWaitTimeInMilliseconds(totalKeys); EnigmailPrefs.setPref(HOURS_PER_WEEK_ENIGMAIL_IS_ON_PREF, 40); Assert.ok(firstTime != secondTime); }); test(function calculateWaitTimeReturnsWholeNumber() { const totalKeys = 11; EnigmailPrefs.setPref(HOURS_PER_WEEK_ENIGMAIL_IS_ON_PREF, 40); const number = calculateWaitTimeInMilliseconds(totalKeys); Assert.equal(number % 1, 0); }); function importKeys() { const publicKey = do_get_file("resources/dev-tiger.asc", false); const anotherKey = do_get_file("resources/notaperson.asc", false); const strikeKey = do_get_file("resources/dev-strike.asc", false); EnigmailKeyRing.importKeyFromFile(publicKey, {}, {}); EnigmailKeyRing.importKeyFromFile(anotherKey, {}, {}); EnigmailKeyRing.importKeyFromFile(strikeKey, {}, {}); } function importAndReturnOneKey() { EnigmailKeyRing.importKeyFromFile(do_get_file("resources/dev-strike.asc", false), {}, {}); return EnigmailKeyRing.getAllKeys().keyList[0].keyId; } test(withTestGpgHome(withEnigmail(withKeys(function shouldBeAbleToGetAllKeyIdsFromKeyList() { importKeys(); const publicKeyId = "8439E17046977C46"; const anotherKeyId = "8A411E28A056E2A3"; const strikeKeyId = "781617319CE311C4"; Assert.equal(getRandomKeyId(0), publicKeyId); Assert.equal(getRandomKeyId(1), anotherKeyId); Assert.equal(getRandomKeyId(2), strikeKeyId); Assert.equal(getRandomKeyId(3), publicKeyId); Assert.equal(getRandomKeyId(4), anotherKeyId); })))); test(withTestGpgHome(withEnigmail(withKeys(function shouldReturnNullIfNoKeysAvailable() { Assert.equal(getRandomKeyId(100), null); })))); test(withTestGpgHome(withEnigmail(withKeys(function shouldGetDifferentRandomKeys() { importKeys(); Assert.notEqual(getRandomKeyId(4), getRandomKeyId(5)); })))); test(withTestGpgHome(withEnigmail(withKeys(function ifOnlyOneKey_shouldGetOnlyKey() { const expectedKeyId = importAndReturnOneKey(); Assert.equal(getRandomKeyId(100), expectedKeyId); })))); test(withTestGpgHome(withEnigmail(withKeys(function refreshesKeyOnlyIfWaitTimeHasBeenSetup_AndRefreshIsReady() { TestHelper.resetting(EnigmailKeyserverURIs, "validKeyserversExist", function() { return true; }, function() { EnigmailPrefs.setPref("keyserver", "keyserver.1"); const expectedKeyId = importAndReturnOneKey(); const timer = { initWithCallbackWasCalled: false, initWithCallback: function(f, timeUntilNextRefresh, timerType) { timer.initWithCallbackWasCalled = true; } }; const keyserver = { refreshWasCalled: false, refresh: function(keyId) { Assert.equal(keyId, expectedKeyId); keyserver.refreshWasCalled = true; } }; refreshWith(keyserver, timer, false); Assert.equal(keyserver.refreshWasCalled, false, "keyserver.refresh was called and shouldn't have been"); Assert.equal(timer.initWithCallbackWasCalled, true, "timer.initWithCallback was not called"); refreshWith(keyserver, timer, true); Assert.equal(keyserver.refreshWasCalled, true, "keyserver.refresh was not called"); Assert.equal(timer.initWithCallbackWasCalled, true, "timer.initWithCallback was not called"); }); })))); test(withTestGpgHome(withEnigmail(withKeys(function setUpRefreshTimer_withWaitTime() { const expectedRandomTime = EnigmailRNG.generateRandomUint32(); const timer = { initWithCallbackWasCalled: false, initWithCallback: function(f, time, timerType) { Assert.equal(time, expectedRandomTime); Assert.equal(timerType, Ci.nsITimer.TYPE_ONE_SHOT); timer.initWithCallbackWasCalled = true; } }; setupNextRefresh(timer, expectedRandomTime); Assert.equal(timer.initWithCallbackWasCalled, true, "timer.initWithCallback was not called"); })))); test(withTestGpgHome(withEnigmail(withKeys(function whenNoKeysExist_retryInOneHour() { TestHelper.resetting(EnigmailKeyserverURIs, "validKeyserversExist", function() { return true; }, function() { const timer = { initWithCallbackWasCalled: false, initWithCallback: function(f, time, timerType) { Assert.equal(time, ONE_HOUR_IN_MILLISEC); Assert.equal(timerType, Ci.nsITimer.TYPE_ONE_SHOT); timer.initWithCallbackWasCalled = true; } }; const keyserver = {}; refreshWith(keyserver, timer, false); Assert.equal(timer.initWithCallbackWasCalled, true, "timer.initWithCallback was not called"); assertLogContains("keyRefreshService.jsm: No keys available to refresh yet. Will recheck in an hour."); }); })))); test(withPreferences(function ifKeyserverListIsInvalid_checkAgainInAnHour() { TestHelper.resetting(EnigmailKeyserverURIs, "validKeyserversExist", function() { return false; }, function() { const timer = { initWithCallbackWasCalled: false, initWithCallback: function(f, time, timerType) { Assert.equal(time, ONE_HOUR_IN_MILLISEC); Assert.equal(timerType, Ci.nsITimer.TYPE_ONE_SHOT); timer.initWithCallbackWasCalled = true; } }; const keyserver = {}; refreshWith(keyserver, timer, false); assertLogContains("keyRefreshService.jsm: Either no keyservers exist or the protocols specified are invalid. Will recheck in an hour."); Assert.equal(timer.initWithCallbackWasCalled, true, "timer.initWithCallback was not called"); }); })); test(withLogFiles(withPreferences(function keyRefreshServiceIsTurnedOnByDefault() { const keyRefreshStartMessage = "keyRefreshService.jsm: Started"; const keyserver = {}; EnigmailKeyRefreshService.start(keyserver); assertLogContains(keyRefreshStartMessage); }))); test(withLogFiles(withPreferences(function keyRefreshServiceStartsWhenPreferenceIsOn() { TestHelper.resetting(EnigmailKeyserverURIs, "validKeyserversExist", function() { return false; }, function() { const keyRefreshStartMessage = "keyRefreshService.jsm: Started"; const keyserver = {}; EnigmailPrefs.setPref("keyRefreshOn", true); EnigmailKeyRefreshService.start(keyserver); assertLogContains(keyRefreshStartMessage); }); }))); enigmail-2.0.8/package/tests/keyRing-test.js000066400000000000000000001012521334302754500207750ustar00rootroot00000000000000/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, */ /*global Components: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false, component: false, Cc: false, Ci: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ /* eslint no-useless-concat: 0*/ "use strict"; /*global EnigmailFiles: false */ do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global withEnigmail: false, withTestGpgHome: false, getKeyListEntryOfKey: false, gKeyListObj: true */ component("enigmail/trust.jsm"); /*global EnigmailTrust: false */ component("enigmail/locale.jsm"); /*global EnigmailLocale: false */ /*global getUserIdList: false, createAndSortKeyList: false, Number: false */ testing("keyRing.jsm"); /*global EnigmailKeyRing: false */ test(withTestGpgHome(withEnigmail(function shouldImportFromFileAndGetKeyDetails() { const publicKey = do_get_file("resources/dev-strike.asc", false); const errorMsgObj = {}; const importedKeysObj = {}; const importResult = EnigmailKeyRing.importKeyFromFile(publicKey, errorMsgObj, importedKeysObj); Assert.assertContains(importedKeysObj.value, "65537E212DC19025AD38EDB2781617319CE311C4"); Assert.equal(importResult, 0, errorMsgObj); const keyDetails = EnigmailKeyRing.getValidUids("0xD535623BB60E9E71").join("\n"); Assert.assertContains(keyDetails, "strike.devtest@gmail.com"); }))); test(withTestGpgHome(withEnigmail(function shouldGetKeyListEntryOfKey() { const publicKey = do_get_file("resources/dev-strike.asc", false); const importResult = EnigmailKeyRing.importKeyFromFile(publicKey, {}, {}); const keyDetails = getKeyListEntryOfKey("0xD535623BB60E9E71"); // Output from GnuPG varies sligtly between different versions (new output data is added // at the end of the list). Therefore each line is only compared to the length provided below let expectedListing = [ "pub:-:4096:1:781617319CE311C4:1430756251:1556986651::-:::scESC:", "fpr:::::::::65537E212DC19025AD38EDB2781617319CE311C4:", "uid:-::::1430756251::DB54FB278F6AE719DE0DE881B17D4C762F5752A9::anonymous strike :", "sub:-:4096:1:D535623BB60E9E71:1430756251:1556986651:::::e:" ]; let keyDetList = keyDetails.split(/\n\r?/); for (let i = 0; i < expectedListing.length; i++) { Assert.equal(keyDetList[i].substr(0, expectedListing[i].length), expectedListing[i]); } }))); test(withTestGpgHome(withEnigmail(function shouldGetKeyFunctions() { const publicKey = do_get_file("resources/dev-strike.asc", false); const secretKey = do_get_file("resources/dev-strike.sec", false); EnigmailKeyRing.importKeyFromFile(publicKey, {}, {}); EnigmailKeyRing.importKeyFromFile(secretKey, {}, {}); // search for key ID let k = EnigmailKeyRing.getKeyById("0x9CE311C4"); Assert.equal(k.subKeys[0].keyId, "D535623BB60E9E71"); // search for subkey ID k = EnigmailKeyRing.getKeyById("0xD535623BB60E9E71"); Assert.equal(k.fpr, "65537E212DC19025AD38EDB2781617319CE311C4"); Assert.equal(gKeyListObj.keySortList.length, 1); EnigmailKeyRing.clearCache(); Assert.equal(gKeyListObj.keySortList.length, 0); // search for fingerprint k = EnigmailKeyRing.getKeyById("65537E212DC19025AD38EDB2781617319CE311C4"); Assert.equal(k.fpr, "65537E212DC19025AD38EDB2781617319CE311C4"); let s = k.signatures; let fpr = "DB54FB278F6AE719DE0DE881B17D4C762F5752A9"; Assert.equal(fpr in s, true); if (fpr in s) { Assert.equal(s[fpr].sigList[0].signerKeyId, "781617319CE311C4"); } let ka = EnigmailKeyRing.getKeysByUserId("devtest@gmail.com>$"); Assert.equal(ka.length, 1); ka = EnigmailKeyRing.getAllSecretKeys(); Assert.equal(ka.length, 1); ka = EnigmailKeyRing.getKeyListById("0x9CE311C4 D535623BB60E9E71"); // the space is on purpose(!) Assert.equal(ka.length, 2); }))); test(withTestGpgHome(withEnigmail(function shouldGetUserIdList() { const publicKey = do_get_file("resources/dev-strike.asc", false); const secretKey = do_get_file("resources/dev-strike.sec", false); EnigmailKeyRing.importKeyFromFile(publicKey, {}, {}); EnigmailKeyRing.importKeyFromFile(secretKey, {}, {}); let l = null; l = getUserIdList(false, {}, {}, {}); Assert.notEqual(l, null); l = getUserIdList(true, {}, {}, {}); Assert.notEqual(l, null); }))); test(withTestGpgHome(withEnigmail(function shouldCleanupClearCache() { const publicKey = do_get_file("resources/dev-strike.asc", false); const secretKey = do_get_file("resources/dev-strike.sec", false); EnigmailKeyRing.importKeyFromFile(publicKey, {}, {}); EnigmailKeyRing.importKeyFromFile(secretKey, {}, {}); EnigmailKeyRing.getAllKeys(); Assert.notEqual(gKeyListObj.keyList.length, 0); EnigmailKeyRing.clearCache(); Assert.equal(gKeyListObj.keyList.length, 0); }))); test(withTestGpgHome(withEnigmail(function shouldImportFromTextAndGetKeyDetails() { EnigmailKeyRing.importKey( JSUnit.createStubWindow(), false, "-----BEGIN PGP PUBLIC KEY BLOCK-----" + "\n" + "Comment: GPGTools - https://gpgtools.org" + "\n" + "\n" + "mQINBFVHm5sBEACs94Ln+RMdeyBpWQtTZ/NZnwntsB10Wd3HTgo5sdA/OOFOJrWe" + "\n" + "tJfAZ/HRxiSu1bwRaFVC8p061ftTbxf8bsdfsykYJQQqPODfcO0/oY2n/Z93ya8K" + "\n" + "TzjXR3qBQ1P7f5x71yeuo7Zrj7B0G44Xjfy+1L0eka9paBqmm3U5cUew5wSr772L" + "\n" + "cflipWfncWXD2rBqgRfR339lRHd3Vwo7V8jje8rlP9msOuTMWCvQuQvpEkfIioXA" + "\n" + "7QipP2f0aPzsavNjFnAfC9rm2FDs6lX4syTMVUWy8IblRYo6MjhNaJFlBJkTCl0b" + "\n" + "ugT9Ge0ZUifuAI0ihVGBpMSh4GF2B3ZPidwGSjgx1sojNHzU/3vBa9DuOmW95qrD" + "\n" + "Notvz61xYueTpOYK6ZeT880QMDvxXG9S5/H1KJxuOF1jx1DibAn9sfP4gtiQFI3F" + "\n" + "WMV9w3YrrqidoWSZBqyBO0Toqt5fNdRyH4ET6HlJAQmFQUbqqnZrc07s/aITZN36" + "\n" + "d9eupCZQfW6e80UkXRPCU53vhh0GQey9reDyVCsV7xi6oXk1fqlpDYigQwEr4+yJ" + "\n" + "+1qAjtSVHJhFE0inQWkUwc2nxef6n7v/M9HszhP/aABadVE49oDaRm54PtA1l0mC" + "\n" + "T8IHcVR4ZDkaNwrHJtidEQcQ/+YVV3g7UJI9+g2nPvgMhk86AzBIlGpG+wARAQAB" + "\n" + "tCthbm9ueW1vdXMgc3RyaWtlIDxzdHJpa2UuZGV2dGVzdEBnbWFpbC5jb20+iQI9" + "\n" + "BBMBCgAnBQJVR5ubAhsDBQkHhh+ABQsJCAcDBRUKCQgLBRYCAwEAAh4BAheAAAoJ" + "\n" + "EHgWFzGc4xHEt/4P/1zf/2VsEwpJVlqwoLiJGQbViCRW34W8rTyL45GjRYAgDXrW" + "\n" + "LDPqxSbotXTXi72Dwug6a/Pn1VI1R2ZaBsWXH8qUYtSV/0b/2HfqUyDhaiuASywM" + "\n" + "dSfTAXa+popNccD5yPCJVBD0xmPCAmrOciYePMMNBk4SCDV5DJcCyGhEAkSeGsXy" + "\n" + "+m2bXb1pTbg6OpqDIPCqlmNQ8ZyAZNzWIyRWcqUY+B6xcZk+n50wG9A0TCOvVjsZ" + "\n" + "+E8Khyha2tfz1WFPmoy0rMD4g2ggvII3v4elosBQW0pxYdkwBAwk6g3DMyUzR6Gc" + "\n" + "NcZnuvnZVBbjCpqXtDJ7UcjjcP8zvzDYlXAY74gM8Nu7/89Pw676rVUXtS7c/LUB" + "\n" + "8Z75FACi7d65Kp8Q6sNYVfi/mTggNwEAuAkjp9acEGvk67q2we+lEoeAwCyfBiBu" + "\n" + "5TmYriLyAvfyoyeMhRjV0FdBaRh+4CkVgSG4/eTLFcnHVB2ZzhX7Uw0qoxM8R+ca" + "\n" + "P75XoVUyXmIpC/UZTrF4IGDUc4jbIqSGU2/Kln4Z8vQpuCw0vavbT93jSCyqaIbK" + "\n" + "qemK8D0rbaoxJq5RLkwU6gJ3dOpQdDRuqUAkfbEZd8yVRSmfugRhCTbdAA5/1kdg" + "\n" + "oWv9xZU7asdsm5cpHpy7lM7ponHsA+B+ykApDqDzPIHDZBoeqKl6qNe2BYOYuQIN" + "\n" + "BFVHm5sBEADBX28bR5QxbrGNVPT3jM60IT+m/GTLH6lm4OcZomAej/XrBOcX/0BY" + "\n" + "tOqqP7Dur8k0A8fcLkZCSBse1m6fvfACo8Vbeunv4IrST5FgXh7bYPZseIy5U7Xn" + "\n" + "0dLqpVXJRqMt3ULS/Rwy18Xx8j9sXJJDAKIqZ4MHwgBknPeeBnD4aG6bJAuBEI6R" + "\n" + "W5lhbG8WFJfCniFuRnim+VD6ucf93x3NkL0TWY0l0PbUdW92sLfiKp1nmz+1dRoB" + "\n" + "ckT701sMs2pk48O5Y/vP6OEDzFzjGdA1r9YkblXjN9VxhSN00Wlmcq1DqEU36+Mq" + "\n" + "i4YIQsuF3NfS13+U2lhjlR5HpRxdDMfHjFYlk5hlOtuvopseYTlMykFl8D7y0qSF" + "\n" + "IAiqVl6pdlSBU84bOLHoCUGens+Ul7m0UShwZdVmMifFw/fJwISZI8D5vGkM3rE7" + "\n" + "TxrHAQ/O1fJnGZNBRgn8LjnZjRGA/u1fweptFY0NyzO5lOzTWI6HBJl1hMave2l0" + "\n" + "vtwBPLrRbbRhy6Z77BNfE9a2w7Y4aFeshjEpWxE8bQIyMrBGaRaiQ2lpXmA6XYZx" + "\n" + "Q8xOUfstsAR1TM+JboXJDuTw+YhaVa2W7Z/RzdtNnahWCCjptFq60DuggLwAGnjr" + "\n" + "5HctpLgwvLVKCeDfU8nchzCkL7Hikh2LC7ySUR/VzORag/TkjxYRRwARAQABiQIl" + "\n" + "BBgBCgAPBQJVR5ubAhsMBQkHhh+AAAoJEHgWFzGc4xHEo+UP/02AIUR0349zGk9a" + "\n" + "4D5Jv007y+d0tWKPL0V2btaq9xQzoM51CtuT0ZoqTO8A0uFmEhCkw++reQcWOz1N" + "\n" + "n+MarPjjJwMjhTPS/H1qiwTXmuwx92xLL0pajloq7oWYwlxsgVGCMDYE0TOMN8p/" + "\n" + "Vc+eoJaWZh8yO1xJGDP98RHbZQWwYN6qLzE4y/ECTHxqi9UKc68qHNVH9ZgtTXnm" + "\n" + "gLAkEvXzRV1UOEEttJ6rrgPrTubjsIG+ckZK5mlivy+UW6XN0WBE0oetKjT8/Cb1" + "\n" + "dQYiX/8MJkGcIUFRurU7gtGW3ncSTdr6WRXaQtfnRn9JG1aSXNYB/xZWzCBdykZp" + "\n" + "+tLuu4A3LVeOzn064hqf3rz2N7b8dWMk5WL5LIUhXYoYc7232RkNSiiKndeJNryv" + "\n" + "TowFt9anuMj4pFgGveClQc9+QGyMVdTe6G5kOJkKG8ydHKFEFObtsTLaut4lHTtx" + "\n" + "n+06QO/LKtQTXqNEyOyfYhbyX7xDbCbu4/MA23MzTs1hhwgIy4+UejU/Yeny6VkB" + "\n" + "odA3bFyEYKWPoMDDgfdlZbzjv3qAN4Qq+ollo8K3gJgH0QONrUaRY84/hil05T4E" + "\n" + "nUZiXdzPWvhMv5lEK+pTMlO8FbOG31+aB8rxCg+wp1ovyC/fp5XjZaLHcyPAWAXK" + "\n" + "LBn4tb400iHp7byO85tF/H0OOI1K" + "\n" + "=CVNK" + "\n" + "-----END PGP PUBLIC KEY BLOCK-----" + "\n" + "-----BEGIN PGP PRIVATE KEY BLOCK-----" + "\n" + "Comment: GPGTools - https://gpgtools.org" + "\n" + "\n" + "lQc+BFVHm5sBEACs94Ln+RMdeyBpWQtTZ/NZnwntsB10Wd3HTgo5sdA/OOFOJrWe" + "\n" + "tJfAZ/HRxiSu1bwRaFVC8p061ftTbxf8bsdfsykYJQQqPODfcO0/oY2n/Z93ya8K" + "\n" + "TzjXR3qBQ1P7f5x71yeuo7Zrj7B0G44Xjfy+1L0eka9paBqmm3U5cUew5wSr772L" + "\n" + "cflipWfncWXD2rBqgRfR339lRHd3Vwo7V8jje8rlP9msOuTMWCvQuQvpEkfIioXA" + "\n" + "7QipP2f0aPzsavNjFnAfC9rm2FDs6lX4syTMVUWy8IblRYo6MjhNaJFlBJkTCl0b" + "\n" + "ugT9Ge0ZUifuAI0ihVGBpMSh4GF2B3ZPidwGSjgx1sojNHzU/3vBa9DuOmW95qrD" + "\n" + "Notvz61xYueTpOYK6ZeT880QMDvxXG9S5/H1KJxuOF1jx1DibAn9sfP4gtiQFI3F" + "\n" + "WMV9w3YrrqidoWSZBqyBO0Toqt5fNdRyH4ET6HlJAQmFQUbqqnZrc07s/aITZN36" + "\n" + "d9eupCZQfW6e80UkXRPCU53vhh0GQey9reDyVCsV7xi6oXk1fqlpDYigQwEr4+yJ" + "\n" + "+1qAjtSVHJhFE0inQWkUwc2nxef6n7v/M9HszhP/aABadVE49oDaRm54PtA1l0mC" + "\n" + "T8IHcVR4ZDkaNwrHJtidEQcQ/+YVV3g7UJI9+g2nPvgMhk86AzBIlGpG+wARAQAB" + "\n" + "/gMDAtfSz5hVoDvp4Vugj4T3VQk8mJ3uYDZmPbNL8SK18VTIVpd3xgrjTP+JEtB+" + "\n" + "aw1WQK4Qik0BdKAu9Lv6wz4u/QNC8q4x3lBcoYleD6iXRL2Tpnh7RcEakIoxIeFH" + "\n" + "joBTZOI+v0HUlyVvSkIaEhE60UvdX+If9p9sx5+uHdYRRfOkM3SZMxLxCUVHMp1e" + "\n" + "ZBcmW+x9UiyA07wXyvAhlS2/iTijDtQFRqK8xs9w7zn0A12afksGtPEL7J5MRqQs" + "\n" + "BuxUrWSKVQ3DkgWXd56qEtbKuklKXe9t93eMPvcFQ2ZVhgic436dygtpNgkGliVq" + "\n" + "Di83wUjorTZFMeC0uhvQ2akfQxvj5TgYoI0rFABvn/6He1LBSWyiu6ZK1nC1PKUc" + "\n" + "KLGQGfq+kbHwJg3q0wIJ5+e1v6hZ9HClhaRsR4ADnTDnp3mGqPxDWvQox1S2+ESx" + "\n" + "8N6AcZ+q47D78IE4EzF4LyQ0g9FdDiNsPwqN4oS2/ZkXb/IbFoVoottU7915KqZO" + "\n" + "6kiJvpMcZrs4TJ4zR++CGBEvJDfUE4RoQHQe/XLA1RJXIwXr3kWPvB2Tc16vdhkh" + "\n" + "LZ9z/HOrPW6SI/UwVYFHpmJIYj3nHdjGcyWwz0KmQ3H5+AYe36afwJws6TFx/QLi" + "\n" + "fqlOkcaBaiQwpcpuSX2y4rTgcjDEaVdPGmvs2m5vKv66a8yybIl2P0veVTutGtC8" + "\n" + "DfQaggqZWQYHmXXvGUnBM+H9YSBJ2g3W3w51fKcN2FtX42OsVxXqZkqlGR2zBE00" + "\n" + "ilVZmiv6ajV9mmO7W8EV9TPqjrYuEDf2M57LllQ7OB1p1v6CtqIyVSL/Jak6ckMT" + "\n" + "5VdqMoup6ib5j4CR+C4i7Btu+gkXhW775l/jbFlUXKE5Vn+LAAIOpxiVZ2Z7azL6" + "\n" + "sNwxtfmpaTAgIvHGSysgPeXeEN3fgTsfZ0PYaqlEHggsYDDU4XvXIOKcUmrr6zEI" + "\n" + "KXeeS0+V3nxSIb9kQHYZyUFvNv98gCCj0wgNl+LoVJ9NvMkaOrCS0jkRaxJicQfa" + "\n" + "bu4XL9XbUBESuHvG6jiK6DNlhT1j3qFFcRBO7COI3OQ0JD7Y1XPYYR48EP69Fwe0" + "\n" + "82LZH5dq9kslpn8VsuygTum9jYFnE5UVLfmjbroFu9YlLE54T0CdZ4UQEWTrZiuz" + "\n" + "TXYf13FaVEgfAim+hjdUUVSCptsX2crC7Vrsk/xMjT2ETU1w/yZb5BVoCvbK/eaf" + "\n" + "sqQAPGElSp0YlI/mgpbc5rRQzcSXghenjOol/gJM0MbFJuyQ93sLW0Gi7zEeBxQi" + "\n" + "aO/Ua4F4VhPilPf+T66fNMM0bG29X5j41eRrN0m1ly4M+jOOIyocLcUamgFsRDTe" + "\n" + "XG9kHZUylAJqNMwQvDzbVSTbHKjhOTa3PyinrTwauYiQP6fIbd4JWkIW88cBynbR" + "\n" + "IHHCYYGxZoDUDd366QyNHKTd5wxw1MicK54tUDcUVDq8NKC+yGuGi6WLYt4WdNEg" + "\n" + "pYb/MzxGRzbhVEHNbfFEr5e706VcQlglpPcMTUctzRVF18wWHzPVbHdZiTBXdr0t" + "\n" + "hJkRNaAvnmQMvP0bXk+QDGW24Z66Yz0X2YzFo4Rdp/MAm/1KwagIu0hIGbwk8egq" + "\n" + "tq6Q5zyyiSp7dVvcNAPaEzEKZXRSrSjyNwQw0CHI940SRgK5JDkAMHZWK8vg8Ih4" + "\n" + "DR7m69XmYXwvTScrQqkFa+8XIb5QqeH7W3Qe4aKiC6QOJav/ptYLZ+s1TTzeIOA8" + "\n" + "5zxhWPj81YgifDtWPc4MG+Y0QuSzMdMue+/oJUt6lyQmtCthbm9ueW1vdXMgc3Ry" + "\n" + "aWtlIDxzdHJpa2UuZGV2dGVzdEBnbWFpbC5jb20+iQI9BBMBCgAnBQJVR5ubAhsD" + "\n" + "BQkHhh+ABQsJCAcDBRUKCQgLBRYCAwEAAh4BAheAAAoJEHgWFzGc4xHEt/4P/1zf" + "\n" + "/2VsEwpJVlqwoLiJGQbViCRW34W8rTyL45GjRYAgDXrWLDPqxSbotXTXi72Dwug6" + "\n" + "a/Pn1VI1R2ZaBsWXH8qUYtSV/0b/2HfqUyDhaiuASywMdSfTAXa+popNccD5yPCJ" + "\n" + "VBD0xmPCAmrOciYePMMNBk4SCDV5DJcCyGhEAkSeGsXy+m2bXb1pTbg6OpqDIPCq" + "\n" + "lmNQ8ZyAZNzWIyRWcqUY+B6xcZk+n50wG9A0TCOvVjsZ+E8Khyha2tfz1WFPmoy0" + "\n" + "rMD4g2ggvII3v4elosBQW0pxYdkwBAwk6g3DMyUzR6GcNcZnuvnZVBbjCpqXtDJ7" + "\n" + "UcjjcP8zvzDYlXAY74gM8Nu7/89Pw676rVUXtS7c/LUB8Z75FACi7d65Kp8Q6sNY" + "\n" + "Vfi/mTggNwEAuAkjp9acEGvk67q2we+lEoeAwCyfBiBu5TmYriLyAvfyoyeMhRjV" + "\n" + "0FdBaRh+4CkVgSG4/eTLFcnHVB2ZzhX7Uw0qoxM8R+caP75XoVUyXmIpC/UZTrF4" + "\n" + "IGDUc4jbIqSGU2/Kln4Z8vQpuCw0vavbT93jSCyqaIbKqemK8D0rbaoxJq5RLkwU" + "\n" + "6gJ3dOpQdDRuqUAkfbEZd8yVRSmfugRhCTbdAA5/1kdgoWv9xZU7asdsm5cpHpy7" + "\n" + "lM7ponHsA+B+ykApDqDzPIHDZBoeqKl6qNe2BYOYnQc+BFVHm5sBEADBX28bR5Qx" + "\n" + "brGNVPT3jM60IT+m/GTLH6lm4OcZomAej/XrBOcX/0BYtOqqP7Dur8k0A8fcLkZC" + "\n" + "SBse1m6fvfACo8Vbeunv4IrST5FgXh7bYPZseIy5U7Xn0dLqpVXJRqMt3ULS/Rwy" + "\n" + "18Xx8j9sXJJDAKIqZ4MHwgBknPeeBnD4aG6bJAuBEI6RW5lhbG8WFJfCniFuRnim" + "\n" + "+VD6ucf93x3NkL0TWY0l0PbUdW92sLfiKp1nmz+1dRoBckT701sMs2pk48O5Y/vP" + "\n" + "6OEDzFzjGdA1r9YkblXjN9VxhSN00Wlmcq1DqEU36+Mqi4YIQsuF3NfS13+U2lhj" + "\n" + "lR5HpRxdDMfHjFYlk5hlOtuvopseYTlMykFl8D7y0qSFIAiqVl6pdlSBU84bOLHo" + "\n" + "CUGens+Ul7m0UShwZdVmMifFw/fJwISZI8D5vGkM3rE7TxrHAQ/O1fJnGZNBRgn8" + "\n" + "LjnZjRGA/u1fweptFY0NyzO5lOzTWI6HBJl1hMave2l0vtwBPLrRbbRhy6Z77BNf" + "\n" + "E9a2w7Y4aFeshjEpWxE8bQIyMrBGaRaiQ2lpXmA6XYZxQ8xOUfstsAR1TM+JboXJ" + "\n" + "DuTw+YhaVa2W7Z/RzdtNnahWCCjptFq60DuggLwAGnjr5HctpLgwvLVKCeDfU8nc" + "\n" + "hzCkL7Hikh2LC7ySUR/VzORag/TkjxYRRwARAQAB/gMDAtfSz5hVoDvp4ZpoCdrR" + "\n" + "S4An9JABiMWCTG4IUYuShVQKJJR3KtZ0C5D4gH4BUlEGDsUtY3/6deakvzedbVxv" + "\n" + "mb59QoU8GuHZ/iWAlsY+37YIBu9kbywIFDDGJeD9th9cXPpuQ31kEvwE37gsNn5p" + "\n" + "IB38oB3mgWoLi2nH4AAVNZXPNBTJ7rS1pi69v4BepUTbglb805ypmWJllzhyRUvm" + "\n" + "DAU/8cu0cPWaaBU4s8Mi7SLv2s+i9EPYNzDkBEy7RYvZApP7G8x447iYPRvmaFnB" + "\n" + "Fd3Ctpd3xkZhZatDV6MJCEfssIdy5yARV4zwCcZ5JDGXGlxoiPH6A3b11SwPOEMv" + "\n" + "QJ0PRZ334XLK93hwzxjYKBJ8hBrR2oPvRUOAVs2/J8JSASYrufyqkXnYJ1EBnP3H" + "\n" + "5TwbjRQ9Qmg1ScFCzTfYgu5emiIF5LFAfTasZGSJvjrXFVeocCswHUvHztzJmpbt" + "\n" + "BAov3Lw6lBkxdvhZomyx74CGOnyz/eFD/khvIV/oms5lR8NNrkpkRGZ/xCN8Kmau" + "\n" + "KhRBebGVEITzOWJQHz0QMhuTloVvtDbDDgqW8gH8eVQJkQCDw8Wd79uj0kw1Xaln" + "\n" + "nseFPLCRNRN0js7cCGW95fVtawRNBCNYambNCLthkBfzT0+1/ULRC2JrP1rutr6D" + "\n" + "sye0S44kNyXKhM72Hamu4XygYlzRsYQflv2PgypjVmkdcZ2rwomMVdqQll3Q7jde" + "\n" + "kWKDpKdx7lR2pnDoXmn43VR1X4uD1PHab56tYE0JUrKDgqZJqzCwJXc3FcPV7LgD" + "\n" + "8pISoMZJ5+84UiRBvNN7N24kpLd9k97Iz29qY6u86Uy/f7/X77qur58r6K04vTfH" + "\n" + "8nA/ybc/9Ube6oyQ44A2NEwBrP3NUA6lHNPeaYBO2RGxTJJU2Edxuy3bJMpEkBhU" + "\n" + "CeWWIZnuxojF+pGjiPLArVZg6Mahc0GlYoiA66cxTuoGHM/wO5Xl0f33L0jny3Kv" + "\n" + "I9OWvUJbKs+J8G6q0zorl5nNmPpTwGYLJkUKhLtMhjS+jf5XA7b5jN1079/oToXu" + "\n" + "Xsfl6J7vnwJt7gglLRpK8iw3xlF4X4AWodBLj36HEyOgTimJXLt2fdpIrkiutUFF" + "\n" + "qdWdZeK+sII8ZAyrfgvwxvmairFK3ylbPwA340jsRQeA8boOOSiDV0cPOszQi1Rt" + "\n" + "Ygnae9or6faA3lqe+fRQi5JsmnJ1jLMe0mxw1mMOR4YLCMjgBc0CTMkY5kmCykA7" + "\n" + "NCQBec2Fueu9cxsu7LJO4+OAUF+i+G/BWPzvWqyJrLk52tME2TxyVL5PRZvqAcrK" + "\n" + "CV+d9IKxH4Ng40qPXL1gM27wWrrFa6RGq12oGvTqkVcomImzqK1ASSPWU3bSYiOy" + "\n" + "2JOQvjLxjQw6emNYG09SlKrzNmXlbrZ4BfolL4eI8H2+3+UG4l/cXxPnLEeQzkvu" + "\n" + "XuW5yajWoNBocEICcopmv8QgpwgiTUstmOTMFXD1EbVasonaH5R+wxBMB4Y1K+ot" + "\n" + "eRawIyFA75FO8HCPoTBe5+Qb6G8+5i7nsgDtHG337G8JFz3hE3U++90zbYxxtjYx" + "\n" + "Y2PYHfOwsDE8IDu1ZqzuB7lgrNADzOzelhSrcaW/jNHPGlxcsPTXl7S2QazgIPqk" + "\n" + "kZ9g4ceXSsZOV9Yl4Bu2ODeUiVeYGGEXwJ7WAKNvaR3bMbhl+iwIQFy3A12/fz0w" + "\n" + "B16C9qp7P9+5FEFWjlqi/28dSfECiDD4X4iyEe+sWTS86Cv0VsL300dIUQPIs65d" + "\n" + "ddkrIkcpM4jyabKTZcltiQIlBBgBCgAPBQJVR5ubAhsMBQkHhh+AAAoJEHgWFzGc" + "\n" + "4xHEo+UP/02AIUR0349zGk9a4D5Jv007y+d0tWKPL0V2btaq9xQzoM51CtuT0Zoq" + "\n" + "TO8A0uFmEhCkw++reQcWOz1Nn+MarPjjJwMjhTPS/H1qiwTXmuwx92xLL0pajloq" + "\n" + "7oWYwlxsgVGCMDYE0TOMN8p/Vc+eoJaWZh8yO1xJGDP98RHbZQWwYN6qLzE4y/EC" + "\n" + "THxqi9UKc68qHNVH9ZgtTXnmgLAkEvXzRV1UOEEttJ6rrgPrTubjsIG+ckZK5mli" + "\n" + "vy+UW6XN0WBE0oetKjT8/Cb1dQYiX/8MJkGcIUFRurU7gtGW3ncSTdr6WRXaQtfn" + "\n" + "Rn9JG1aSXNYB/xZWzCBdykZp+tLuu4A3LVeOzn064hqf3rz2N7b8dWMk5WL5LIUh" + "\n" + "XYoYc7232RkNSiiKndeJNryvTowFt9anuMj4pFgGveClQc9+QGyMVdTe6G5kOJkK" + "\n" + "G8ydHKFEFObtsTLaut4lHTtxn+06QO/LKtQTXqNEyOyfYhbyX7xDbCbu4/MA23Mz" + "\n" + "Ts1hhwgIy4+UejU/Yeny6VkBodA3bFyEYKWPoMDDgfdlZbzjv3qAN4Qq+ollo8K3" + "\n" + "gJgH0QONrUaRY84/hil05T4EnUZiXdzPWvhMv5lEK+pTMlO8FbOG31+aB8rxCg+w" + "\n" + "p1ovyC/fp5XjZaLHcyPAWAXKLBn4tb400iHp7byO85tF/H0OOI1K" + "\n" + "=h0dN" + "\n" + "-----END PGP PRIVATE KEY BLOCK-----", null, {}); const keyDetails = EnigmailKeyRing.getValidUids("0xD535623BB60E9E71").join("\n"); Assert.assertContains(keyDetails, "strike.devtest@gmail.com"); EnigmailKeyRing.getAllKeys(); Assert.notEqual(gKeyListObj.keyList.length, 0); // uses the key listing from shouldGetKeyValidityErrors let key = EnigmailKeyRing.getKeyById("D535623BB60E9E71"); let pubKey = key.getMinimalPubKey(); Assert.equal(pubKey.exitCode, 0); Assert.equal(pubKey.keyData.substr(0, 192), "xsFNBFVHm5sBEACs94Ln+RMdeyBpWQtTZ/NZnwntsB10Wd3HTgo5sdA/OOFOJrWe" + "tJfAZ/HRxiSu1bwRaFVC8p061ftTbxf8bsdfsykYJQQqPODfcO0/oY2n/Z93ya8K" + "TzjXR3qBQ1P7f5x71yeuo7Zrj7B0G44Xjfy+1L0eka9paBqmm3U5cUew5wSr772L"); Assert.equal(pubKey.keyData.substr(-52), "p1ovyC/fp5XjZaLHcyPAWAXKLBn4tb400iHp7byO85tF/H0OOI1K"); Assert.equal(pubKey.keyData.length, 2972); }))); test(function shouldCreateKeyListObject() { // from: "P:\Program Files (x86)\GNU\GnuPG\pub\gpg2.exe" --charset utf-8 --display-charset utf-8 --batch --no-tty --status-fd 2 --with-fingerprint --fixed-list-mode --with-colons --list-keys let keyInfo = [ // user with trust level "o" (unknown) "tru::1:1443339321:1451577200:3:1:5", "pub:o:4096:1:DEF9FC808A3FF001:1388513885:1546188604::u:::scaESCA:", "fpr:::::::::EA25EF48BF2001E41FAB0C1CDEF9FC808A3FF001:", "uid:o::::1389038412::44F73158EF0F47E4595B1FD8EC740519DE24B994::A User ID with CAPITAL letters :", "uid:o::::1389038405::3FC8999BDFF08EF4210026D3F1C064C072517376::A second User ID with CAPITAL letters :", "sub:o:4096:1:E2DEDFFB80C14584:1388513885:1546188604:::::e:" ]; // from: "P:\Program Files (x86)\GNU\GnuPG\pub\gpg2.exe" --charset utf-8 --display-charset utf-8 --batch --no-tty --status-fd 2 --with-fingerprint --fixed-list-mode --with-colons --list-secret-keys let secKeyInfo = [ "sec::4096:1:DEF9FC808A3FF001:1388513885:1546188604:::::::::", "fpr:::::::::EA25EF48BF2001E41FAB0C1CDEF9FC808A3FF001:", "uid:::::::44F73158EF0F47E4595B1FD8EC740519DE24B994::A User ID with CAPITAL letters :", "uid:::::::3FC8999BDFF08EF4210026D3F1C064C072517376::A second User ID with CAPITAL letters :", "ssb::4096:1:E2DEDFFB80C14584:1388513885::::::::::" ]; createAndSortKeyList(keyInfo, secKeyInfo, "validity", // sorted acc. to key validity -1); // descending let keyListObj = gKeyListObj; Assert.notEqual(keyListObj, null); Assert.notEqual(keyListObj.keySortList, null); Assert.notEqual(keyListObj.keySortList.length, null); Assert.equal(keyListObj.keySortList.length, 1); Assert.equal(keyListObj.keySortList[0].userId, "a user id with capital letters "); Assert.equal(keyListObj.keySortList[0].keyId, "DEF9FC808A3FF001"); Assert.notEqual(keyListObj.keyList, null); Assert.equal(keyListObj.keyList[keyListObj.keySortList[0].keyNum].userId, "A User ID with CAPITAL letters "); const TRUSTLEVELS_SORTED = EnigmailTrust.trustLevelsSorted(); let minTrustLevelIndex = TRUSTLEVELS_SORTED.indexOf("?"); let details = {}; let key = EnigmailKeyRing.getValidKeyForRecipient("user1@enigmail-test.de", minTrustLevelIndex, details); Assert.notEqual(key, null); Assert.equal(key, "DEF9FC808A3FF001"); minTrustLevelIndex = TRUSTLEVELS_SORTED.indexOf("f"); details = {}; key = EnigmailKeyRing.getValidKeyForRecipient("user1@enigmail-test.de", minTrustLevelIndex, details); Assert.equal(key, null); Assert.notEqual(details.msg, null); }); test(withTestGpgHome(withEnigmail(function shouldExportKey() { const publicKey = do_get_file("resources/dev-strike.asc", false); const secretKey = do_get_file("resources/dev-strike.sec", false); EnigmailKeyRing.importKeyFromFile(publicKey, {}, {}); EnigmailKeyRing.importKeyFromFile(secretKey, {}, {}); EnigmailKeyRing.getAllKeys(); let pub = EnigmailKeyRing.extractKey(false, "0x781617319CE311C4", null, {}, {}).replace(/\r\n/g, "\n"); Assert.equal(pub.substr(-50), "/H0OOI1K\n=CVNK\n-----END PGP PUBLIC KEY BLOCK-----\n"); let pubAndSec = EnigmailKeyRing.extractKey(true, "strike.devtest@gmail.com", null, {}, {}).replace(/\r\n/g, "\n"); Assert.equal(pubAndSec.substr(-37), "\n-----END PGP PRIVATE KEY BLOCK-----\n"); Assert.equal(pubAndSec.split(/\n/).length, 159); }))); const KeyRingHelper = { loadTestKeyList: function() { const pkFile = do_get_file("resources/pub-keys.asc", false); let publicKeys = EnigmailFiles.readFile(pkFile); let rows = publicKeys.split("\n"); let testKeyList = []; for (let i = 0; i < rows.length; ++i) { let row = rows[i]; if (row !== "" && row[0] != "#") { testKeyList.push(row); } } createAndSortKeyList(testKeyList, [], "validity", // sorted acc. to key validity -1); // descending let keyListObj = gKeyListObj; Assert.notEqual(keyListObj, null); Assert.notEqual(keyListObj.keySortList, null); Assert.notEqual(keyListObj.keySortList.length, null); } }; test(function testGetValidKeyForOneRecipient() { KeyRingHelper.loadTestKeyList(); const TRUSTLEVELS_SORTED = EnigmailTrust.trustLevelsSorted(); let minTrustLevelIndex = null; let details = null; let key = null; // unknown key: minTrustLevelIndex = TRUSTLEVELS_SORTED.indexOf("?"); details = {}; key = EnigmailKeyRing.getValidKeyForRecipient("unknown@enigmail-test.de", minTrustLevelIndex, details); Assert.equal(key, null); Assert.equal(details.msg, null); //Assert.equal(details.msg, "undefined"); // ordinary full trusted key: minTrustLevelIndex = TRUSTLEVELS_SORTED.indexOf("f"); details = {}; key = EnigmailKeyRing.getValidKeyForRecipient("full@enigmail-test.de", minTrustLevelIndex, details); Assert.equal(key, "0003AAAA00010001"); Assert.equal(details.msg, null); minTrustLevelIndex = TRUSTLEVELS_SORTED.indexOf("?"); details = {}; key = EnigmailKeyRing.getValidKeyForRecipient("full@enigmail-test.de", minTrustLevelIndex, details); Assert.equal(key, "0003AAAA00010001"); Assert.equal(details.msg, null); // key not valid for encryption: // - no details because it would take time to check details of such a key minTrustLevelIndex = TRUSTLEVELS_SORTED.indexOf("?"); details = {}; key = EnigmailKeyRing.getValidKeyForRecipient("no-encrypt@enigmail-test.de", minTrustLevelIndex, details); Assert.equal(key, null); Assert.equal(details.msg, null); // disabled key: // - no details because it would take time to check details of such a key minTrustLevelIndex = TRUSTLEVELS_SORTED.indexOf("?"); details = { all: "" }; key = EnigmailKeyRing.getValidKeyForRecipient("disabled@enigmail-test.de", minTrustLevelIndex, details); Assert.equal(key, null); Assert.equal(details.msg, null); // multiple non-trusted and one full trusted keys minTrustLevelIndex = TRUSTLEVELS_SORTED.indexOf("f"); details = {}; key = EnigmailKeyRing.getValidKeyForRecipient("multiple-onefull@enigmail-test.de", minTrustLevelIndex, details); Assert.equal(key, "0030AAAA00020001"); Assert.equal(details.msg, null); // multiple non-trusted and two full trusted keys (first taken) minTrustLevelIndex = TRUSTLEVELS_SORTED.indexOf("f"); details = {}; key = EnigmailKeyRing.getValidKeyForRecipient("multiple-twofull@enigmail-test.de", minTrustLevelIndex, details); Assert.equal(key, "0034AAAA00020001"); Assert.equal(details.msg, null); // multiple non-trusted and one marginal trusted keys minTrustLevelIndex = TRUSTLEVELS_SORTED.indexOf("f"); details = {}; key = EnigmailKeyRing.getValidKeyForRecipient("multiple-onemarginal@enigmail-test.de", minTrustLevelIndex, details); Assert.equal(key, null); Assert.equal(details.msg, "ProblemNoKey"); minTrustLevelIndex = TRUSTLEVELS_SORTED.indexOf("?"); details = {}; key = EnigmailKeyRing.getValidKeyForRecipient("multiple-onemarginal@enigmail-test.de", minTrustLevelIndex, details); Assert.equal(key, "0031AAAA00020001"); Assert.equal(details.msg, null); // multiple non-trusted keys with same trust level // (faked keys case if no special trust given) minTrustLevelIndex = TRUSTLEVELS_SORTED.indexOf("?"); details = {}; key = EnigmailKeyRing.getValidKeyForRecipient("multiple-nofull@enigmail-test.de", minTrustLevelIndex, details); Assert.equal(key, null); Assert.equal(details.msg, "ProblemMultipleKeys"); // some key with subkey that encrypts: // we return first main key minTrustLevelIndex = TRUSTLEVELS_SORTED.indexOf("?"); details = {}; key = EnigmailKeyRing.getValidKeyForRecipient("withsubkey-uid1@enigmail-test.de", minTrustLevelIndex, details); Assert.equal(key, "0040EEEE00010001"); Assert.equal(details.msg, null); details = {}; key = EnigmailKeyRing.getValidKeyForRecipient("withsubkey-uid2@enigmail-test.de", minTrustLevelIndex, details); Assert.equal(key, "0040EEEE00010001"); Assert.equal(details.msg, null); }); test(function testGetValidKeysForMultipleRecipients() { KeyRingHelper.loadTestKeyList(); const TRUSTLEVELS_SORTED = EnigmailTrust.trustLevelsSorted(); let minTrustLevel = null; let details = null; let addrs = null; let keys = null; let keyMissing = null; // some matching keys: minTrustLevel = "?"; addrs = ["full@enigmail-test.de", "multiple-onefull@enigmail-test.de", "multiple-twofull@enigmail-test.de", "multiple-onemarginal@enigmail-test.de", "withsubkey-uid1@enigmail-test.de", "withsubkey-uid2@enigmail-test.de" ]; details = {}; keys = []; keyMissing = EnigmailKeyRing.getValidKeysForAllRecipients(addrs, minTrustLevel, details, keys); Assert.equal(keyMissing, false); Assert.notEqual(keys, null); Assert.equal(keys.length, 6); Assert.equal(keys[0], "0x0003AAAA00010001"); Assert.equal(keys[1], "0x0030AAAA00020001"); Assert.equal(keys[2], "0x0034AAAA00020001"); Assert.equal(keys[3], "0x0031AAAA00020001"); Assert.equal(keys[4], "0x0040EEEE00010001"); Assert.equal(keys[5], "0x0040EEEE00010001"); Assert.equal(details.errArray.length, 0); // some non-matching keys: minTrustLevel = "?"; addrs = ["no-encrypt@enigmail-test.de", "disabled@enigmail-test.de", "multiple-nofull@enigmail-test.de" ]; details = {}; keys = []; keyMissing = EnigmailKeyRing.getValidKeysForAllRecipients(addrs, minTrustLevel, details, keys); Assert.equal(keyMissing, true); Assert.equal(keys.length, 0); Assert.notEqual(details, null); Assert.equal(details.errArray.length, 3); Assert.equal(details.errArray[0].msg, "ProblemNoKey"); Assert.equal(details.errArray[1].msg, "ProblemNoKey"); Assert.equal(details.errArray[2].msg, "ProblemMultipleKeys"); // just two keys: minTrustLevel = "?"; addrs = ["0x0040EEEE00010001", "0x0003AAAA00010001", "0003AAAA00010001" ]; details = {}; keys = []; keyMissing = EnigmailKeyRing.getValidKeysForAllRecipients(addrs, minTrustLevel, details, keys); Assert.equal(keyMissing, false); Assert.notEqual(keys, null); Assert.equal(keys.length, 3); Assert.equal(keys[0], "0x0040EEEE00010001"); Assert.equal(keys[1], "0x0003AAAA00010001"); Assert.equal(keys[2], "0x0003AAAA00010001"); Assert.equal(details.errArray.length, 0); // disabled key: // - this BEHAVIOR is PROBABLY WRONG: minTrustLevel = "?"; addrs = ["0005AAAA00010001"]; details = {}; keys = []; keyMissing = EnigmailKeyRing.getValidKeysForAllRecipients(addrs, minTrustLevel, details, keys); Assert.equal(keyMissing, false); Assert.notEqual(keys, null); Assert.equal(keys.length, 1); Assert.equal(keys[0], "0x0005AAAA00010001"); Assert.equal(details.errArray.length, 0); }); test(function shouldGetKeyValidityErrors() { // from: gpg2 --with-fingerprint --fixed-list-mode --with-colons --list-keys let keyInfo = [ // Key 1: Revoked key "tru::1:1443339321:1451577200:3:1:5", "pub:r:4096:1:DEF9FC808A3FF001:1388513885:1546188604::u:::sca:", "fpr:::::::::EA25EF48BF2001E41FAB0C1CDEF9FC808A3FF001:", "uid:r::::1389038412::44F73158EF0F47E4595B1FD8EC740519DE24B994::User ID 1 :", "sub:r:4096:1:E2DEDFFB80C14584:1388513885:1546188603:::::e:", // Key 2: valid public key, usable for signing, with expired subkeys for encryption "pub:u:1024:17:F05B29A5CEFE4B70:1136219252:::u:::scaSCA:::::::", "fpr:::::::::6D67E7817D588BEA263F41B9F05B29A5CEFE4B70:", "uid:u::::1446568426::560DE55D9C611718F777EDD11A84F126CCD71965::User ID 2 :::::::::", "sub:e:2048:1:B2417304FFC57041:1136219469:1199291469:::::e::::::", "sub:e:2048:1:770EA47A1DB0E8B0:1136221524:1293901524:::::s::::::", "sub:e:2048:1:805B29A5CEFB2B70:1199298291:1262370291:::::e::::::", "sub:e:2048:1:0F6B6901667E633C:1262537932:1325437132:::::e::::::", // Key 3: valid public key, usable subkey for encryption, no secret key "pub:u:1024:17:86345DFA372ADB32:1136219252:::u:::scESC:::::::", "fpr:::::::::9876E7817D588BEA263F41B986345DFA372ADB32:", "uid:u::::1446568426::560DE55D9C611718F777EDD11A84F126CCD71965::User ID 3 :::::::::", "sub:u:2048:1:B2417304FFC57041:1136219469::::::s::::::", "sub:u:2048:1:770EA47A1DB0E8B0:1136221524::::::e::::::" ]; // from: gpg2 --with-fingerprint --fixed-list-mode --with-colons --list-secret-keys let secKeyInfo = [ // Key 1 "sec::4096:1:DEF9FC808A3FF001:1388513885:1546188604:::::::::", "fpr:::::::::EA25EF48BF2001E41FAB0C1CDEF9FC808A3FF001:", "uid:::::::44F73158EF0F47E4595B1FD8EC740519DE24B994::User ID 1 :", "ssb::4096:1:E2DEDFFB80C14584:1388513885::::::::::", // Key 2 "sec:u:1024:17:F05B29A5CEFE4B70:1136219252:1507997328::u:::scaSCA:::::::", "fpr:::::::::6D67E7817D588BEA263F41B9F05B29A5CEFE4B70:", "uid:u::::1446568426::560DE55D9C611718F777EDD11A84F126CCD71965::User ID 2 :::::::::", "ssb:e:2048:1:B2417304FFC57041:1136219469:1199291469:::::e::::::", "ssb:e:2048:1:770EA47A1DB0E8B0:1136221524:1293901524:::::s::::::", "ssb:e:2048:1:805B29A5CEFB2B70:1199298291:1262370291:::::e::::::", "ssb:e:2048:1:0F6B6901667E633C:1262537932:1325437132:::::e::::::" // NO Key 3 ]; createAndSortKeyList(keyInfo, secKeyInfo, "validity", // sorted acc. to key validity -1); // descending let key = EnigmailKeyRing.getKeyById("DEF9FC808A3FF001"); let result = key.getSigningValidity(); Assert.equal(result.reason, EnigmailLocale.getString("keyRing.pubKeyRevoked", [key.userId, "0x" + key.keyId])); key = EnigmailKeyRing.getKeyById("F05B29A5CEFE4B70"); result = key.getEncryptionValidity(); Assert.equal(result.keyValid, false); Assert.equal(result.reason, EnigmailLocale.getString("keyRing.encSubKeysExpired", [key.userId, "0x" + key.keyId])); result = key.getSigningValidity(); Assert.equal(result.keyValid, true); key = EnigmailKeyRing.getKeyById("86345DFA372ADB32"); result = key.getSigningValidity(); Assert.equal(result.keyValid, false); Assert.equal(result.reason, EnigmailLocale.getString("keyRing.noSecretKey", [key.userId, "0x" + key.keyId])); result = key.getEncryptionValidity(); Assert.equal(result.keyValid, true); }); test(function shouldGetKeyExpiry() { // uses the key listing from shouldGetKeyValidityErrors let key = EnigmailKeyRing.getKeyById("DEF9FC808A3FF001"); Assert.equal(key.getKeyExpiry(), 1546188603); key = EnigmailKeyRing.getKeyById("F05B29A5CEFE4B70"); Assert.equal(key.getKeyExpiry(), 1325437132); key = EnigmailKeyRing.getKeyById("86345DFA372ADB32"); Assert.equal(key.getKeyExpiry(), Number.MAX_VALUE); }); test(function shouldClone() { // uses the key listing from shouldGetKeyValidityErrors let key = EnigmailKeyRing.getKeyById("DEF9FC808A3FF001"); let cp = key.clone(); Assert.equal(cp.fprFormatted, "EA25 EF48 BF20 01E4 1FAB 0C1C DEF9 FC80 8A3F F001"); Assert.equal(cp.getEncryptionValidity().keyValid, false); }); enigmail-2.0.8/package/tests/keyserver-test.js000066400000000000000000000540021334302754500214040ustar00rootroot00000000000000/*global test:false, component: false, testing: false, Assert: false, do_load_module: false, do_get_cwd: false */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global withPreferences: false, resetting: false, withEnvironment: false, withEnigmail: false, withTestGpgHome: false, getKeyListEntryOfKey: false, gKeyListObj: true */ testing("keyserver.jsm"); /*global validKeyserversExist: false, currentProxyModule: true, Ci, executeRefresh: false, gpgRequest: false, requestOverTorWithSocks: false, requestOverTorWithHelper: false, build: false, buildRequests: false parseKeyserverUrl: false */ component("enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ component("enigmail/gpgAgent.jsm"); /*global EnigmailGpgAgent: false */ component("enigmail/gpg.jsm"); /*global EnigmailGpg: false */ component("enigmail/locale.jsm"); /*global EnigmailLocale: false */ component("enigmail/constants.jsm"); /*global EnigmailConstants: false */ function setupKeyserverPrefs(keyservers, autoOn) { EnigmailPrefs.setPref("keyserver", keyservers); EnigmailPrefs.setPref("autoKeyServerSelection", autoOn); } function isGpgExecutable(fullPath) { let path = fullPath.replace(/^(.*\/)([^/]+)$/, "$2"); return (path.search(/^gpg/i) === 0); } function torNotAvailableProperties() { return { isAvailable: false, useTorMode: false, socks: null, helper: null }; } test(function setupRequestWithTorHelper() { const torArgs = ["--user", "randomUser", "--pass", "randomPassword", "/usr/bin/gpg2"]; const torProperties = { command: { path: "/usr/bin/torsocks" }, args: torArgs, envVars: ["TORSOCKS_USERNAME=abc", "TORSOCKS_PASSWORD=def"] }; const expectedArgs = torArgs .concat(EnigmailGpg.getStandardArgs(true)) .concat(["--keyserver", "hkps://keyserver.1:443"]) .concat(["--recv-keys", "1234"]); const action = EnigmailConstants.DOWNLOAD_KEY; const request = requestOverTorWithHelper("1234", "hkps://keyserver.1:443", torProperties, action); Assert.equal(request.command.path, "/usr/bin/torsocks"); Assert.deepEqual(request.args, expectedArgs); Assert.deepEqual(request.envVars, torProperties.envVars); }); test(function setupRequestWithTorHelperWithEnvVariables() { const torArgs = ["--user", "randomUser", "--pass", "randomPassword", "/usr/bin/gpg2"]; const torProperties = { command: { path: "/usr/bin/torsocks" }, args: torArgs, envVars: ["TORSOCKS_USERNAME=abc", "TORSOCKS_USERNAME=def"] }; const expectedArgs = torArgs .concat(EnigmailGpg.getStandardArgs(true)) .concat(["--keyserver", "hkps://keyserver.1:443"]) .concat(["--recv-keys", "1234"]); const action = EnigmailConstants.DOWNLOAD_KEY; const request = requestOverTorWithHelper("1234", "hkps://keyserver.1:443", torProperties, action); Assert.equal(request.command.path, "/usr/bin/torsocks"); Assert.deepEqual(request.args, expectedArgs); Assert.deepEqual(request.envVars, torProperties.envVars); }); test(withTestGpgHome(withEnigmail(function setupRequestWithTorGpgProxyArguments() { const gpgProxyArgs = ["socks5h://randomUser:randomPassword@127.0.0.1:9050"]; const torProperties = { command: "gpg", args: gpgProxyArgs, envVars: [] }; const expectedGpgProxyArgs = ["--keyserver-options", "http-proxy=socks5h://randomUser:randomPassword@127.0.0.1:9050"]; const expectedArgs = EnigmailGpg.getStandardArgs(true) .concat(["--keyserver", "hkps://keyserver.1:443"]) .concat(expectedGpgProxyArgs) .concat(["--recv-keys", "1234"]); const action = EnigmailConstants.DOWNLOAD_KEY; const request = requestOverTorWithSocks("1234", "hkps://keyserver.1:443", torProperties, action); Assert.ok(isGpgExecutable(request.command.path)); Assert.deepEqual(request.args, expectedArgs); }))); test(function testBuildNormalRequestWithStandardArgs() { const refreshKeyArgs = EnigmailGpg.getStandardArgs(true).concat(["--keyserver", "hkps://keyserver.1:443", "--recv-keys", "1234"]); const protocol = "hkps://keyserver.1:443"; const action = EnigmailConstants.DOWNLOAD_KEY; const useTor = false; const request = gpgRequest("1234", protocol, action, useTor); Assert.ok(isGpgExecutable(request.command.path)); Assert.deepEqual(request.args, refreshKeyArgs); Assert.equal(request.usingTor, false); }); test(function testBuildNormalRequestOverTorWithStandardArgs() { const refreshKeyArgs = EnigmailGpg.getStandardArgs(true).concat(["--keyserver", "hkps://keyserver.1:443", "--recv-keys", "1234"]); const protocol = "hkps://keyserver.1:443"; const action = EnigmailConstants.DOWNLOAD_KEY; const useTor = true; const request = gpgRequest("1234", protocol, action, useTor); Assert.ok(isGpgExecutable(request.command.path)); Assert.deepEqual(request.args, refreshKeyArgs); Assert.equal(request.isDownload, true); Assert.equal(request.usingTor, true); }); test(withEnigmail(function createsRegularRequests_whenUserDoesNotWantTor() { setupKeyserverPrefs("keyserver.1", true); const tor = { torProperties: function() { return { helper: null, socks: null, useTorMode: false, isAvailable: false }; }, isRequired: function() { return false; }, isPreferred: function() { return false; }, getTorNotAvailableProperties: torNotAvailableProperties }; const expectedKeyId = "1234"; const refreshAction = EnigmailConstants.DOWNLOAD_KEY; const requests = buildRequests(expectedKeyId, refreshAction, tor); Assert.equal(requests[0].command, EnigmailGpgAgent.agentPath); Assert.equal(requests[0].usingTor, false); Assert.deepEqual(requests[0].args, EnigmailGpg.getStandardArgs(true).concat(["--keyserver", "hkps://keyserver.1:443", "--recv-keys", expectedKeyId])); Assert.equal(requests[1].command, EnigmailGpgAgent.agentPath); Assert.equal(requests[1].usingTor, false); Assert.deepEqual(requests[1].args, EnigmailGpg.getStandardArgs(true).concat(["--keyserver", "hkp://keyserver.1:11371", "--recv-keys", expectedKeyId])); })); test(withEnigmail(function createsRequestsWithTorAndWithoutTor_whenTorExistsOverHelperAndSocksArguments(enigmail) { setupKeyserverPrefs("keyserver.1", true); const keyId = "1234"; const torArgs = ["--user", "randomUser", "--pass", "randomPassword", "/usr/bin/gpg2"]; const socksArgs = "socks5-hostname://someUser:somePass@127.0.0.1:9050"; const socks5HkpsArgs = EnigmailGpg.getStandardArgs(true).concat(["--keyserver", "hkps://keyserver.1:443", "--keyserver-options", "http-proxy=" + socksArgs, "--recv-keys", keyId]); const hkpsArgs = EnigmailGpg.getStandardArgs(true).concat(["--keyserver", "hkps://keyserver.1:443", "--recv-keys", keyId]); const hkpArgs = EnigmailGpg.getStandardArgs(true).concat(["--keyserver", "hkp://keyserver.1:11371", "--recv-keys", keyId]); const tor = { torProperties: function() { return { helper: { command: { path: "/usr/bin/torsocks" }, args: torArgs, envVars: [] }, socks: null, isAvailable: true }; }, isRequired: function(action) { return false; }, isPreferred: function(action) { return true; }, getTorNotAvailableProperties: torNotAvailableProperties }; const refreshAction = EnigmailConstants.DOWNLOAD_KEY; const requests = buildRequests(keyId, refreshAction, tor); Assert.equal(requests.length, 4); Assert.equal(requests[0].command.path, "/usr/bin/torsocks"); Assert.deepEqual(requests[0].args, torArgs.concat(hkpsArgs)); Assert.equal(requests[1].command.path, "/usr/bin/torsocks"); Assert.deepEqual(requests[1].args, torArgs.concat(hkpArgs)); Assert.ok(isGpgExecutable(requests[2].command.path)); Assert.deepEqual(requests[2].args, hkpsArgs); Assert.ok(isGpgExecutable(requests[3].command.path)); Assert.deepEqual(requests[3].args, hkpArgs); })); test(withEnigmail(function createsRequestsWithTorAndWithoutTor_whenTorExistsOverSocksOnly(enigmail) { setupKeyserverPrefs("keyserver.1", true); const keyId = "1234"; const torArgs = ["--user", "randomUser", "--pass", "randomPassword", "/usr/bin/gpg2"]; const socksArgs = "socks5-hostname://someUser:somePass@127.0.0.1:9050"; const socks5HkpsArgs = EnigmailGpg.getStandardArgs(true).concat(["--keyserver", "hkps://keyserver.1:443", "--keyserver-options", "http-proxy=" + socksArgs, "--recv-keys", keyId]); const hkpsArgs = EnigmailGpg.getStandardArgs(true).concat(["--keyserver", "hkps://keyserver.1:443", "--recv-keys", keyId]); const socks5HkpArgs = EnigmailGpg.getStandardArgs(true).concat(["--keyserver", "hkp://keyserver.1:11371", "--keyserver-options", "http-proxy=" + socksArgs, "--recv-keys", keyId]); const hkpArgs = EnigmailGpg.getStandardArgs(true).concat(["--keyserver", "hkp://keyserver.1:11371", "--recv-keys", keyId]); const tor = { torProperties: function() { return { helper: { command: { path: "/usr/bin/torsocks" }, args: torArgs, envVars: [] }, socks: { command: "gpg", args: socksArgs, envVars: [] }, isAvailable: true }; }, isRequired: function(action) { return false; }, isPreferred: function(action) { return true; }, getTorNotAvailableProperties: torNotAvailableProperties }; const refreshAction = EnigmailConstants.DOWNLOAD_KEY; const requests = buildRequests(keyId, refreshAction, tor); Assert.equal(requests.length, 6); Assert.equal(requests[0].command.path, "/usr/bin/torsocks"); Assert.deepEqual(requests[0].args, torArgs.concat(hkpsArgs)); Assert.ok(isGpgExecutable(requests[1].command.path)); Assert.deepEqual(requests[1].args, socks5HkpsArgs); Assert.equal(requests[2].command.path, "/usr/bin/torsocks"); Assert.deepEqual(requests[2].args, torArgs.concat(hkpArgs)); Assert.ok(isGpgExecutable(requests[3].command.path)); Assert.deepEqual(requests[3].args, socks5HkpArgs); Assert.ok(isGpgExecutable(requests[4].command.path)); Assert.deepEqual(requests[4].args, hkpsArgs); Assert.ok(isGpgExecutable(requests[4].command.path)); Assert.deepEqual(requests[5].args, hkpArgs); })); test(withEnigmail(function createsNormalRequests_whenTorDoesntExist() { setupKeyserverPrefs("keyserver.1", true); const keyId = "1234"; const hkpsArgs = EnigmailGpg.getStandardArgs(true).concat(["--keyserver", "hkps://keyserver.1:443", "--recv-keys", keyId]); const hkpArgs = EnigmailGpg.getStandardArgs(true).concat(["--keyserver", "hkp://keyserver.1:11371", "--recv-keys", keyId]); const tor = { torProperties: function() { return { helper: null, socks: null, useTorMode: false, isAvailable: false }; }, isRequired: function() { return false; }, isPreferred: function() { return true; }, getTorNotAvailableProperties: torNotAvailableProperties }; const refreshAction = EnigmailConstants.DOWNLOAD_KEY; const requests = buildRequests(keyId, refreshAction, tor); Assert.equal(requests.length, 2); Assert.ok(isGpgExecutable(requests[0].command.path)); Assert.deepEqual(requests[0].args, hkpsArgs); Assert.ok(isGpgExecutable(requests[1].command.path)); Assert.deepEqual(requests[1].args, hkpArgs); })); test(withEnigmail(function createsNormalRequests_whenTorUsesNormal() { setupKeyserverPrefs("keyserver.1", true); const keyId = "1234"; const hkpsArgs = EnigmailGpg.getStandardArgs(true).concat(["--keyserver", "hkps://keyserver.1:443", "--recv-keys", keyId]); const hkpArgs = EnigmailGpg.getStandardArgs(true).concat(["--keyserver", "hkp://keyserver.1:11371", "--recv-keys", keyId]); const tor = { torProperties: function() { return { helper: null, socks: null, useTorMode: true, isAvailable: true }; }, isRequired: function() { return false; }, isPreferred: function() { return true; }, getTorNotAvailableProperties: torNotAvailableProperties }; const refreshAction = EnigmailConstants.DOWNLOAD_KEY; const requests = buildRequests(keyId, refreshAction, tor); Assert.equal(requests.length, 2); Assert.ok(isGpgExecutable(requests[0].command.path)); Assert.deepEqual(requests[0].args, hkpsArgs); Assert.ok(isGpgExecutable(requests[1].command.path)); Assert.deepEqual(requests[1].args, hkpArgs); })); test(withEnigmail(function createsRequestsWithOnlyTor_whenTorIsRequired(enigmail) { setupKeyserverPrefs("keyserver.1", true); const keyId = "1234"; const torArgs = ["--user", "randomUser", "--pass", "randomPassword", "/usr/bin/gpg2"]; const socksArgs = "socks5-hostname://someUser:somePass@127.0.0.1:9050"; const socks5HkpsArgs = EnigmailGpg.getStandardArgs(true).concat(["--keyserver", "hkps://keyserver.1:443", "--keyserver-options", "http-proxy=" + socksArgs, "--recv-keys", keyId]); const hkpsArgs = EnigmailGpg.getStandardArgs(true).concat(["--keyserver", "hkps://keyserver.1:443", "--recv-keys", keyId]); const socks5HkpArgs = EnigmailGpg.getStandardArgs(true).concat(["--keyserver", "hkp://keyserver.1:11371", "--keyserver-options", "http-proxy=" + socksArgs, "--recv-keys", keyId]); const hkpArgs = EnigmailGpg.getStandardArgs(true).concat(["--keyserver", "hkp://keyserver.1:11371", "--recv-keys", keyId]); const tor = { torProperties: function() { return { helper: { command: { path: "/usr/bin/torsocks" }, args: torArgs, envVars: [] }, socks: { command: "gpg", args: socksArgs, envVars: [] }, isAvailable: true, useTorMode: false }; }, isRequired: function(action) { return true; }, isPreferred: function(action) { return true; }, getTorNotAvailableProperties: torNotAvailableProperties }; const refreshAction = EnigmailConstants.DOWNLOAD_KEY; const requests = buildRequests(keyId, refreshAction, tor); Assert.equal(requests.length, 4); Assert.equal(requests[0].command.path, "/usr/bin/torsocks"); Assert.deepEqual(requests[0].args, torArgs.concat(hkpsArgs)); Assert.ok(isGpgExecutable(requests[1].command.path)); Assert.deepEqual(requests[1].args, socks5HkpsArgs); Assert.equal(requests[2].command.path, "/usr/bin/torsocks"); Assert.deepEqual(requests[2].args, torArgs.concat(hkpArgs)); Assert.ok(isGpgExecutable(requests[3].command.path)); Assert.deepEqual(requests[3].args, socks5HkpArgs); })); test(withEnigmail(function returnNoRequests_whenTorIsRequiredButNotAvailable() { setupKeyserverPrefs("keyserver.1, keyserver.2", true); EnigmailPrefs.setPref("downloadKeyRequireTor", true); const tor = { torProperties: function() { return { socks: null, helper: null, isAvailable: false, useTorMode: false }; }, isRequired: function() { return true; }, isPreferred: function() { return true; }, getTorNotAvailableProperties: torNotAvailableProperties }; const refreshAction = EnigmailConstants.DOWNLOAD_KEY; const requests = buildRequests("1234", refreshAction, tor); Assert.equal(requests.length, 0); })); function setupAgentPathAndRequest(enigmail) { withEnvironment({}, function(e) { resetting(EnigmailGpgAgent, "agentPath", "/usr/bin/gpg-agent", function() { enigmail.environment = e; }); }); return { command: EnigmailGpgAgent.agentPath, envVars: [], args: EnigmailGpg.getStandardArgs(true).concat(["--keyserver", "hkp://keyserver.1:11371", "--recv-keys", "1234"]) }; } test(withEnigmail(function executeReportsFailure_whenReceivingConfigurationError(enigmail) { const simpleRequest = setupAgentPathAndRequest(enigmail); const subproc = { callWasCalled: false, call: function(proc) { subproc.callWasCalled = true; proc.stderr("gpg: keyserver receive failed: Configuration error\n"); proc.done(2); return { wait: function() {} }; } }; const result = executeRefresh(simpleRequest, subproc); Assert.equal(result, false); })); test(withEnigmail(function executeReportsSuccess_whenReceivingImportSuccessful(enigmail) { const simpleRequest = setupAgentPathAndRequest(enigmail); const subproc = { callWasCalled: false, call: function(proc) { subproc.callWasCalled = true; proc.stderr("[GNUPG:] IMPORT_OK "); proc.stderr("gpg: requesting key KEYID from hkps server keyserver.1\n"); proc.stderr("gpg: key KEYID: public key KEYOWNER imported\n"); proc.stderr("gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model\n"); proc.stderr("gpg: depth: 0 valid: 2 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 2u\n" + "gpg: Total number processed: 1\n" + "gpg: imported: 1 (RSA: 1)\n"); proc.done(0); return { wait: function() {} }; } }; const result = executeRefresh(simpleRequest, subproc); Assert.equal(result, true); })); test(function testBasicNormalQuery() { const actionflags = EnigmailConstants.REFRESH_KEY; const keyserver = "keyserver0005"; const searchterms = ""; const errormsgobj = {}; currentProxyModule = { getHttpProxy: function() { return null; } }; const expectedArgs = EnigmailGpg.getStandardArgs(true) .concat("--keyserver") .concat("keyserver0005") .concat("--refresh-keys"); const keyRequest = build(actionflags, keyserver, searchterms, errormsgobj); Assert.deepEqual(keyRequest.args, expectedArgs); Assert.equal(keyRequest.inputData, null); Assert.equal(keyRequest.isDownload, true); Assert.equal(errormsgobj.value, null); }); test(function testBasicNormalQueryWithHTTPPRoxy() { const actionflags = EnigmailConstants.REFRESH_KEY; const keyserver = "keyserver0005"; const searchterms = "1"; const errormsgobj = {}; currentProxyModule = { getHttpProxy: function() { return "someHttpProxy"; } }; const expectedArgs = EnigmailGpg.getStandardArgs(true) .concat("--keyserver") .concat("keyserver0005") .concat("--keyserver-options") .concat("http-proxy=someHttpProxy") .concat("--refresh-keys"); const keyRequest = build(actionflags, keyserver, searchterms, errormsgobj); Assert.deepEqual(keyRequest.args, expectedArgs); Assert.equal(keyRequest.inputData, null); Assert.equal(keyRequest.isDownload, true); Assert.equal(errormsgobj.value, null); }); test(function testBasicNormalQueryWithInputData() { const actionflags = EnigmailConstants.SEARCH_KEY; const keyserver = "keyserver0005"; const searchterms = "1"; const errormsgobj = {}; currentProxyModule = { getHttpProxy: function() { return null; } }; const expectedArgs = EnigmailGpg.getStandardArgs(false) .concat(["--command-fd", "0", "--fixed-list", "--with-colons"]) .concat("--keyserver") .concat("keyserver0005") .concat("--search-keys") .concat("1"); const keyRequest = build(actionflags, keyserver, searchterms, errormsgobj); Assert.deepEqual(keyRequest.args, expectedArgs); Assert.equal(keyRequest.inputData, "quit\n"); Assert.equal(keyRequest.isDownload, false); Assert.equal(errormsgobj.value, null); }); test(function testNormalReceiveKeyQuery() { const actionflags = EnigmailConstants.DOWNLOAD_KEY; const keyserver = "keyserver0005"; const searchterms = "0001"; const errormsgobj = {}; currentProxyModule = { getHttpProxy: function() { return null; } }; const expectedArgs = EnigmailGpg.getStandardArgs(true) .concat("--keyserver") .concat("keyserver0005") .concat("--recv-keys") .concat("0001"); const keyRequest = build(actionflags, keyserver, searchterms, errormsgobj); Assert.deepEqual(keyRequest.args, expectedArgs); Assert.equal(keyRequest.inputData, null); Assert.equal(keyRequest.isDownload, true); Assert.equal(errormsgobj.value, null); }); test(function testNormalUploadKeyRequest() { const actionflags = EnigmailConstants.UPLOAD_KEY; const keyserver = "keyserver0005"; const searchterms = "0001"; const errormsgobj = {}; currentProxyModule = { getHttpProxy: function() { return null; } }; const expectedArgs = EnigmailGpg.getStandardArgs(true) .concat("--keyserver") .concat("keyserver0005") .concat("--send-keys") .concat("0001"); const keyRequest = build(actionflags, keyserver, searchterms, errormsgobj); Assert.deepEqual(keyRequest.args, expectedArgs); Assert.equal(keyRequest.inputData, null); Assert.equal(keyRequest.isDownload, false); Assert.equal(errormsgobj.value, null); }); test(function testErrorQueryWithNoKeyserver() { const actionflags = EnigmailConstants.UPLOAD_KEY; const keyserver = null; const searchterms = "0001"; const errormsgobj = {}; currentProxyModule = { getHttpProxy: function() { return null; } }; const result = build(actionflags, keyserver, searchterms, errormsgobj); Assert.equal(result, null); Assert.equal(errormsgobj.value, EnigmailLocale.getString("failNoServer")); }); test(function testErrorSearchQueryWithNoID() { const actionflags = EnigmailConstants.SEARCH_KEY; const keyserver = "keyserver0005"; const searchterms = null; const errormsgobj = {}; currentProxyModule = { getHttpProxy: function() { return null; } }; const result = build(actionflags, keyserver, searchterms, errormsgobj); Assert.equal(result, null); Assert.equal(errormsgobj.value, EnigmailLocale.getString("failNoID")); }); test(function testParseUrl() { let srv = "abc.de.fg"; const HKP = "hkp"; const HKP_PORT = "11371"; let r = parseKeyserverUrl(srv); Assert.equal(r.host, srv); Assert.equal(r.protocol, HKP); Assert.equal(r.port, HKP_PORT); r = parseKeyserverUrl("hkps://" + srv); Assert.equal(r.host, srv); Assert.equal(r.protocol, "hkps"); Assert.equal(r.port, "443"); r = parseKeyserverUrl("ldap://" + srv + ":765"); Assert.equal(r.host, srv); Assert.equal(r.protocol, "ldap"); Assert.equal(r.port, "765"); }); enigmail-2.0.8/package/tests/keyserverUris-test.js000066400000000000000000000142421334302754500222510ustar00rootroot00000000000000/*global test:false, component: false, testing: false, Assert: false, do_load_module: false, do_get_cwd: false */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global TestHelper:false, resetting, withEnvironment, getKeyListEntryOfKey: false, gKeyListObj: true, withPreferences: false */ testing("keyserverUris.jsm"); /*global isValidProtocol: false, validKeyserversExist: false, buildKeyserverUris: false */ component("enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ component("enigmail/os.jsm"); /*global EnigmailOS: false */ function setupKeyserverPrefs(keyservers, autoOn) { EnigmailPrefs.setPref("keyserver", keyservers); EnigmailPrefs.setPref("autoKeyServerSelection", autoOn); } test(withPreferences(function organizeProtocols_withOneHkpsServer() { setupKeyserverPrefs("keyserver.1", true); const keyserverUris = buildKeyserverUris(); Assert.equal(keyserverUris[0], "hkps://keyserver.1:443"); Assert.equal(keyserverUris[1], "hkp://keyserver.1:11371"); Assert.equal(keyserverUris.length, 2); })); test(withPreferences(function buildUrisFromKeyservers_withoutSpecifiedProtocols() { setupKeyserverPrefs("keyserver.1, keyserver.2, keyserver.3", false); const keyserverUris = buildKeyserverUris(); Assert.equal(keyserverUris[0], "hkps://keyserver.1:443"); Assert.equal(keyserverUris[1], "hkp://keyserver.1:11371"); Assert.equal(keyserverUris[2], "hkps://keyserver.2:443"); Assert.equal(keyserverUris[3], "hkp://keyserver.2:11371"); Assert.equal(keyserverUris[4], "hkps://keyserver.3:443"); Assert.equal(keyserverUris[5], "hkp://keyserver.3:11371"); Assert.equal(keyserverUris.length, 6); })); test(withPreferences(function buildUrisFromKeyservers_withMixOfProtocols() { setupKeyserverPrefs("hkp://keyserver.1, hkps://keyserver.2, keyserver.3, hkps://keyserver.4, ldap://keyserver.5", false); const keyserverUris = buildKeyserverUris(); Assert.equal(keyserverUris[0], "hkp://keyserver.1:11371"); Assert.equal(keyserverUris[1], "hkps://keyserver.2:443"); Assert.equal(keyserverUris[2], "hkps://keyserver.3:443"); Assert.equal(keyserverUris[3], "hkp://keyserver.3:11371"); Assert.equal(keyserverUris[4], "hkps://keyserver.4:443"); Assert.equal(keyserverUris[5], "ldap://keyserver.5:389"); })); test(withPreferences(function should_UseCorrectCorrespondingHkpsAddressForHkpPoolServers_IfNonDos() { TestHelper.resetting(EnigmailOS, "isDosLike", false, function() { setupKeyserverPrefs("pool.sks-keyservers.net, keys.gnupg.net, pgp.mit.edu", true); const keyserverUris = buildKeyserverUris(); Assert.equal(keyserverUris.length, 2); Assert.equal(keyserverUris[0], "hkps://hkps.pool.sks-keyservers.net:443"); Assert.equal(keyserverUris[1], "hkp://pool.sks-keyservers.net:11371"); }); })); test(withPreferences(function should_UseCorrectCorrespondingHkpsAddressForHkpPoolServers_IfDos() { TestHelper.resetting(EnigmailOS, "isDosLike", true, function() { setupKeyserverPrefs("pool.sks-keyservers.net, keys.gnupg.net, pgp.mit.edu", true); const keyserverUris = buildKeyserverUris(); Assert.equal(keyserverUris.length, 2); Assert.equal(keyserverUris[0], "hkps.pool.sks-keyservers.net"); Assert.equal(keyserverUris[1], "hkp://pool.sks-keyservers.net:11371"); }); })); test(withPreferences(function should_AddProtocolAndPortForHkpsPoolServers_IfNotDos() { TestHelper.resetting(EnigmailOS, "isDosLike", false, function() { setupKeyserverPrefs("hkps.pool.sks-keyservers.net", false); const keyserverUris = buildKeyserverUris(); Assert.equal(keyserverUris.length, 1); Assert.equal(keyserverUris[0], "hkps://hkps.pool.sks-keyservers.net:443"); }); })); test(withPreferences(function shouldNot_AddProtocolAndPortForForHkpsPoolServers_IfDos() { TestHelper.resetting(EnigmailOS, "isDosLike", true, function() { setupKeyserverPrefs("hkps.pool.sks-keyservers.net", false); const keyserverUris = buildKeyserverUris(); Assert.equal(keyserverUris.length, 1); Assert.equal(keyserverUris[0], "hkps.pool.sks-keyservers.net"); }); })); test(withPreferences(function validKeyserversExistWithDefaultPreferences() { setupKeyserverPrefs("pool.sks-keyservers.net, keys.gnupg.net, pgp.mit.edu", true); Assert.equal(validKeyserversExist(), true); })); test(withPreferences(function noValidKeyserversExistWithEmptyKeyserverList() { setupKeyserverPrefs(" ", true); Assert.equal(validKeyserversExist(), false); })); test(withPreferences(function noValidKeyserversExistWhenAllProtocolsAreInvalid() { setupKeyserverPrefs("xyz://pool.sks-keyservers.net, abc://keys.gnupg.net, def://pgp.mit.edu", true); Assert.equal(validKeyserversExist(), false); })); test(withPreferences(function validKeyserversExistWhenOneProtocolIsValid() { setupKeyserverPrefs("hkps://pool.sks-keyservers.net, abc://keys.gnupg.net, def://pgp.mit.edu", true); Assert.equal(validKeyserversExist(), true); })); test(withPreferences(function buildUrisFromKeyservers_oneValidProtocol() { setupKeyserverPrefs("hkp://keys.gnupg.net, abc://pgp.mit.edu", true); const keyserverUris = buildKeyserverUris(); Assert.deepEqual(keyserverUris, ["hkp://keys.gnupg.net:11371"]); })); test(withPreferences(function considerPoolHkpsServerValidWithProtocolAndPortSpecified() { Assert.equal(isValidProtocol("hkps://hkps.pool.sks-keyservers.net:443"), true); })); test(withPreferences(function detectInvalidKeyserverWhenProtocolIsMadeOfTwoValidProtocols() { Assert.equal(isValidProtocol("hkpsldap://domain"), false); })); test(withPreferences(function detectInvalidKeyserverWhenProtocolIsMadeOfTwoValidProtocols() { setupKeyserverPrefs("HKPS://domain", true); const keyserverUris = buildKeyserverUris(); Assert.deepEqual(keyserverUris, ["hkps://domain:443"]); })); test(withPreferences(function considerCapitalSchemesLegitimate() { Assert.equal(isValidProtocol("HKPS://domain"), true); })); test(withPreferences(function considerLowerCaseAndCapitalSchemesLegitimate() { Assert.equal(isValidProtocol("HkP://domain"), true); })); enigmail-2.0.8/package/tests/locale-test.js000066400000000000000000000013411334302754500206220ustar00rootroot00000000000000/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false, component: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); testing("locale.jsm"); /*global EnigmailLocale: false */ test(function shouldReadProperty() { const importBtnValue = EnigmailLocale.getString("enigHeader"); Assert.equal("Enigmail:", importBtnValue); }); enigmail-2.0.8/package/tests/log-test.js000066400000000000000000000022731334302754500201510ustar00rootroot00000000000000/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false, component: false, Cc: false, Ci: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); testing("log.jsm"); /*global EnigmailLog: false */ component("enigmail/files.jsm"); /*global EnigmailFiles: false */ test(function shouldCreateLogFile() { EnigmailLog.setLogDirectory(do_get_cwd().path); EnigmailLog.setLogLevel(5); EnigmailLog.createLogFiles(); const filePath = EnigmailLog.directory + "enigdbug.txt"; const localFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile); EnigmailFiles.initPath(localFile, filePath); try { Assert.equal(localFile.exists(), true); } finally { EnigmailLog.onShutdown(); if (localFile.exists()) { localFile.remove(false); } EnigmailLog.createLogFiles(); } }); enigmail-2.0.8/package/tests/mailHelper.js000066400000000000000000000055111334302754500204730ustar00rootroot00000000000000/*global do_load_module: false, do_get_cwd: false, component: false, do_get_file: false, Components: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; component("/modules/mailServices.js"); /*global MailServices: false */ component("enigmail/files.jsm"); /*global EnigmailFiles: false */ component("/modules/iteratorUtils.jsm"); const MailHelper = { init: function() { if (!MailHelper.initialized) { try { MailServices.accounts.createLocalMailAccount(); } catch (ex) { // This will fail if someone already called this. } let localAccount = MailServices.accounts.FindAccountForServer(MailServices.accounts.localFoldersServer); let identity = MailServices.accounts.createIdentity(); identity.email = "tester@enigmail.org"; localAccount.addIdentity(identity); localAccount.defaultIdentity = identity; MailHelper.incomingServer = MailServices.accounts.localFoldersServer; MailHelper.rootFolder = MailHelper.incomingServer.rootMsgFolder; if (!MailHelper.rootFolder.containsChildNamed("EngimailTestInbox")) { MailHelper.rootFolder.createSubfolder("EngimailTestInbox", null); MailHelper.inboxFolder = MailHelper.rootFolder.getChildNamed("EngimailTestInbox"); MailHelper.inboxFolder.setFlag(Components.interfaces.nsMsgFolderFlags.Mail); MailHelper.inboxFolder.setFlag(Components.interfaces.nsMsgFolderFlags.Inbox); } MailHelper.initialized = true; } }, getRootFolder: function() { MailHelper.init(); return MailHelper.rootFolder; }, createMailFolder: function(name) { MailHelper.init(); let localRoot = MailHelper.rootFolder.QueryInterface(Components.interfaces.nsIMsgLocalMailFolder); let mailFolder = localRoot.createLocalSubfolder(name); mailFolder.setFlag(Components.interfaces.nsMsgFolderFlags.Mail); return mailFolder; }, cleanMailFolder: function(mailFolder) { MailHelper.init(); let it = mailFolder.subFolders; while (it.hasMoreElements()) { mailFolder.propagateDelete(it.getNext(), true, null); } }, loadEmailToMailFolder: function(emailFilePath, mailFolder) { let emailFile = do_get_file(emailFilePath, false); MailServices.copy.CopyFileMessage(emailFile, mailFolder, null, false, 0, null, null, null); }, fetchFirstMessageHeaderIn: function(mailFolder) { let folderInfo = {}; let msgDb = mailFolder.getDBFolderInfoAndDB(folderInfo); let enumerator = msgDb.EnumerateMessages(); if (enumerator.hasMoreElements()) { return enumerator.getNext().QueryInterface(Components.interfaces.nsIMsgDBHdr); } else return null; } }; enigmail-2.0.8/package/tests/main.js000066400000000000000000000031751334302754500173410ustar00rootroot00000000000000/*global do_subtest: false, Components: false */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; function execTest(filename) { const Cc = Components.classes; const Ci = Components.interfaces; let env = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment); let testcases = env.get("JS_TEST"); if (testcases && testcases.length > 0) { if (testcases.search(filename) >= 0) do_subtest(filename); } else do_subtest(filename); } execTest("armor-test.js"); execTest("data-test.js"); execTest("system-test.js"); execTest("decryption-test.js"); execTest("persistentCrypto-test.js"); execTest("errorHandling-test.js"); execTest("encryption-test.js"); execTest("gpgAgent-test.js"); execTest("core-test.js"); execTest("files-test.js"); execTest("streams-test.js"); execTest("key-test.js"); execTest("keyRing-test.js"); execTest("keyEditor-test.js"); execTest("keyserver-test.js"); execTest("keyserverUris-test.js"); execTest("locale-test.js"); execTest("log-test.js"); execTest("mime-test.js"); execTest("os-test.js"); execTest("prefs-test.js"); execTest("rules-test.js"); execTest("funcs-test.js"); execTest("mimeDecrypt-test.js"); execTest("expiry-test.js"); execTest("installGnuPG-test.js"); execTest("keyRefreshService-test.js"); execTest("tor-test.js"); execTest("versioning-test.js"); execTest("rng-test.js"); execTest("filters-test.js"); execTest("webKey-test.js"); execTest("autocrypt-test.js"); // execTest("pep-test.js"); // not yet enabled enigmail-2.0.8/package/tests/mime-test.js000066400000000000000000000113731334302754500203200ustar00rootroot00000000000000/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false */ /*global do_test_pending: false, do_test_finished: false */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); testing("mime.jsm"); /*global EnigmailMime: false */ test(function getBoundaryTest() { var got = EnigmailMime.getBoundary("application/pgp-encrypted;\n boundary='abc'; procol='any'\n"); Assert.equal(got, "'abc'", "get boundary 1"); got = EnigmailMime.getBoundary("application/pgp-encrypted; boundary='abc'; protocol='any'"); Assert.equal(got, "'abc'", "get boundary 2"); got = EnigmailMime.getBoundary('content-type: application/pgp-encrypted; boundary="abc"; protocol="any"'); Assert.equal(got, "abc", "get boundary 3"); got = EnigmailMime.getProtocol('content-type: application/pgp-encrypted; boundary="abc"; protocol="SHA123"'); Assert.equal(got, "SHA123", "get protocol 1"); got = EnigmailMime.getParameter('application/pgp-encrypted; boundary="abc"; protocol="any"', "BOUNDARY"); Assert.equal(got, "abc", "getParameter 1"); got = EnigmailMime.getParameter('parameter1=abc; Param2=\r\n abc\r\n\t\t\tdef', "param2"); Assert.equal(got, "abcdef", "getParameter 2"); got = EnigmailMime.getParameter('parameter1=abc; Param2=\r\n abc\r\n def', "notexist"); Assert.equal(got, "", "getParameter 3"); }); const msg1 = 'Content-Type: multipart/mixed; boundary="OuterBoundary"\r\n' + 'References: \r\n' + 'Subject: Outer hidden subject\r\n' + '\r\n' + '--OuterBoundary\r\n' + 'Content-Transfer-Encoding: base64\r\n' + 'Content-Type: text/rfc822-headers; charset="us-ascii";\r\n' + ' protected-headers="v1,<12345678@enigmail-test.net>"\r\n' + 'Content-Disposition: inline\r\n' + '\r\n' + 'U3ViamVjdDogVGhlIGhpZGRlbiBzdWJqZWN0CkRhdGU6IFN1biwgMjEgSnVuIDIwMTUgMT\r\n' + 'U6MTk6MzIgKzAyMDAKRnJvbTogU3RhcndvcmtzIDxzdHJpa2VmcmVlZG9tQGVuaWdtYWls\r\n' + 'LXRlc3QubmV0PgpUbzogUGF0cmljayA8cGF0cmlja0BlbmlnbWFpbC10ZXN0Lm5ldD4sIE\r\n' + 'JpbmdvIDxiaW5nb0BlbmlnbWFpbC10ZXN0Lm5ldD4KQ2M6IFBhdHJpY2sgPHBhdHJpY2sy\r\n' + 'QGVuaWdtYWlsLXRlc3QubmV0PiwgQmluZ28gPDJiaW5nb0BlbmlnbWFpbC10ZXN0Lm5ldD\r\n' + '4KUmVwbHktVG86IFN0YXJ3b3JrcyBhbHRlcm5hdGl2ZSA8YWx0ZXJuYXRpdmVAZW5pZ21h\r\n' + 'aWwtdGVzdC5uZXQ+Cg==\r\n' + '\r\n' + '--OuterBoundary\r\n' + 'Content-Type: multipart/mixed; boundary="innerContent"\r\n' + '\r\n' + '--innerContent\r\n' + 'Content-Type: text/plain; charset="us-ascii"\r\n' + '\r\n' + 'Hello World!\r\n' + '\r\n' + '--innerContent--\r\n' + '--OuterBoundary--\r\n\r\n'; const msg2 = 'Content-Type: multipart/mixed; boundary="OuterBoundary"\r\n' + 'References: \r\n' + 'Subject: Outer hidden subject\r\n' + '\r\n' + '--OuterBoundary\r\n' + 'Content-Type: multipart/mixed; boundary="innerContent"\r\n' + '\r\n' + '--innerContent\r\n' + 'Content-Type: text/plain; charset="us-ascii"\r\n' + '\r\n' + 'Hello World!\r\n' + '\r\n' + '--innerContent--\r\n' + '--OuterBoundary--\r\n\r\n'; test(function extractProtectedHeadersTest() { var r = EnigmailMime.extractProtectedHeaders(msg1); var expected = msg2; var got = r.startPos; Assert.equal(got, 117, "startPos of removed data"); got = r.endPos; Assert.equal(got, 767, "endPos of removed data"); got = r.newHeaders.subject; expected = "The hidden subject"; Assert.equal(got, expected, "subject"); got = r.newHeaders.from; expected = "Starworks "; Assert.equal(got, expected, "from"); got = r.newHeaders.to; expected = "Patrick , Bingo "; Assert.equal(got, expected, "to"); got = r.newHeaders.cc; expected = "Patrick , Bingo <2bingo@enigmail-test.net>"; Assert.equal(got, expected, "cc"); got = r.newHeaders["reply-to"]; expected = "Starworks alternative "; Assert.equal(got, expected, "reply-to"); got = r.newHeaders.date; expected = "Sun, 21 Jun 2015 15:19:32 +0200"; Assert.equal(got, expected, "date"); got = r.newHeaders.references; expected = ""; Assert.equal(got, expected, "references"); }); test(function getMimeTreeTest() { let tree = EnigmailMime.getMimeTree(msg1); Assert.ok(tree.headers.contentType.type, "multipart/mixed"); Assert.equal(tree.subParts[0].headers.contentType.type, "text/rfc822-headers"); Assert.equal(tree.subParts[0].headers.charset, "us-ascii"); Assert.equal(tree.subParts[1].subParts[0].headers.contentType.type, "text/plain"); }); enigmail-2.0.8/package/tests/mimeDecrypt-test.js000066400000000000000000000021731334302754500216510ustar00rootroot00000000000000/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EnigmailMime = { extractProtectedHeaders: function(str) { return { startPos: 10, endPos: 22, newHeaders: { subject: "The hidden subject" } }; } }; do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); testing("mimeDecrypt.jsm"); /* global EnigmailMimeDecrypt: false */ test(function extractEncryptedHeadersTest() { var dec = EnigmailMimeDecrypt.newPgpMimeHandler(); dec.decryptedData = 'This is a Hello World example'; dec.extractEncryptedHeaders(); var expected = 'This is a example'; var got = dec.decryptedData; Assert.equal(got, expected, "removed rfc822 header"); got = dec.decryptedHeaders.subject; expected = "The hidden subject"; Assert.equal(got, expected, "subject"); }); enigmail-2.0.8/package/tests/os-test.js000066400000000000000000000034341334302754500200110ustar00rootroot00000000000000/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false */ /*global TestHelper: false, withEnvironment: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global TestHelper: false, withEnigmail: false, component: false, withTestGpgHome: false, osUtils: false */ testing("os.jsm"); /*global EnigmailOS: false, operatingSystem: true, isMac: false, isDosLike: false, isWin32: false */ component("enigmail/execution.jsm"); /*global EnigmailExecution: false */ function withOS(os, f) { return function() { const oldOs = operatingSystem; operatingSystem = os; try { f(); } finally { operatingSystem = oldOs; } }; } test(withOS("Darwin", function shouldReturnTrueWhenSystemIsMac() { Assert.equal(isMac(), true); })); test(withOS("Linux", function shouldReturnFalseWhenSystemIsLinux() { Assert.equal(isMac(), false); })); test(withOS("Linux", function shouldReturnFalseWhenSystemIsLinux() { Assert.equal(isWin32(), false); })); test(withOS("WINNT", function shouldReturnTrueWhenSystemIsWin32() { Assert.equal(isWin32(), true); })); test(withOS("OS2", function shouldBeDosLikeWhenSystemIsWindows() { Assert.equal(isDosLike(), true); })); test(withOS("WINNT", function shouldBeDosLikeWhenSystemIsWindows32() { Assert.equal(isDosLike(), true); })); test(withOS("Darwin", function shouldNotBeDosLikeWhenSystemIsMac() { Assert.equal(isDosLike(), false); })); enigmail-2.0.8/package/tests/pEp-test.js000066400000000000000000000054071334302754500201160ustar00rootroot00000000000000/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false, component: false, Cc: false, Ci: false */ /*global dump: false */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global withEnigmail: false, withTestGpgHome: false */ testing("pEp.jsm"); /*global EnigmailpEp: false */ component("enigmail/keyRing.jsm"); /*global EnigmailKeyRing: fales */ test(withTestGpgHome(withEnigmail(function shouldEncryptMessage() { const publicKey = do_get_file("resources/dev-strike.asc", false); const errorMsgObj = {}; const importedKeysObj = {}; EnigmailKeyRing.importKeyFromFile(publicKey, errorMsgObj, importedKeysObj); const secretKey = do_get_file("resources/dev-strike.sec", false); EnigmailKeyRing.importKeyFromFile(secretKey, errorMsgObj, importedKeysObj); do_test_pending(); //EnigmailpEp.encryptMessage("strike.devtest@gmail.com", ["strike.devtest@gmail.com"], "Hello", "Test message", 1). EnigmailpEp.encryptMessage("strike.devtest@gmail.com", ["strike.devtest@gmail.com"], "Hello", {"longmsg":"Test message"}, 1). then(function _encryptedMessage(a) { let txt = a.result[0].longmsg; Assert.equal("-----BEGIN PGP MESSAGE-----", txt.substr(0, 27)); return EnigmailpEp.decryptMessage(txt, "strike.devtest@gmail.com"); }). then(function _decryptedMessage(b) { let txt = b.result[3].longmsg; Assert.equal("Subject: Hello\n\nTest message", txt.replace(/\r\n/g, "\n")); return EnigmailpEp.getPepVersion(); }). then(function _f(a) { Assert.ok(a && a.length > 0); return EnigmailpEp.setIdentity("strike.devtest@gmail.com", "Enigmail-UnitTest-User", "anonymous strike", "65537E212DC19025AD38EDB2781617319CE311C4"); }). then(function _f(a) { Assert.equal(0, a.result[0].status); return EnigmailpEp.getIdentity({ address: "strike.devtest@gmail.com"}); }). then(function _f(a) { Assert.equal("65537E212DC19025AD38EDB2781617319CE311C4", a.result[0].fpr); return EnigmailpEp.getIdentityRating("strike.devtest@gmail.com", "Enigmail-UnitTest-User"); }). then(function _f(a) { Assert.equal(6, a.result[0].color); return EnigmailpEp.getTrustWords("65537E212DC19025AD38EDB2781617319CE311C4", "en", 6); }). then(function _f(a) { Assert.equal("KATINKA NETTLE CULTIVATION PREFACE STANDARDIZE CHIMERA ", a.result[1]); do_test_finished(); }). catch(function _f(t) { Assert.equal("", "Error: " + t.code); do_test_finished(); }); }))); enigmail-2.0.8/package/tests/persistentCrypto-test.js000066400000000000000000000151671334302754500227770ustar00rootroot00000000000000/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false */ /*global Cc: false, Ci: false, Components: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global TestHelper: false, component: false, withTestGpgHome: false, withEnigmail: false */ TestHelper.loadDirectly("tests/mailHelper.js"); /*global MailHelper: false */ testing("persistentCrypto.jsm"); /*global EnigmailPersistentCrypto: false, Promise: false */ component("enigmail/keyRing.jsm"); /*global EnigmailKeyRing: false */ /*global msgHdrToMimeMessage: false, MimeMessage: false, MimeContainer: false */ component("enigmail/glodaMime.jsm"); component("enigmail/streams.jsm"); /*global EnigmailStreams: false */ const inspector = Cc["@mozilla.org/jsinspector;1"].createInstance(Ci.nsIJSInspector); const copyListener = { QueryInterface: function(iid) { if (iid.equals(Ci.nsIMsgCopyServiceListener) || iid.equals(Ci.nsISupports)) { return this; } throw Components.results.NS_NOINTERFACE; }, GetMessageId: function(messageId) {}, OnProgress: function(progress, progressMax) {}, OnStartCopy: function() {}, SetMessageKey: function(key) {} }; test(withTestGpgHome(withEnigmail(function messageIsCopiedToNewDir() { loadSecretKey(); MailHelper.cleanMailFolder(MailHelper.getRootFolder()); const sourceFolder = MailHelper.createMailFolder("source-box"); MailHelper.loadEmailToMailFolder("resources/encrypted-email.eml", sourceFolder); const header = MailHelper.fetchFirstMessageHeaderIn(sourceFolder); const targetFolder = MailHelper.createMailFolder("target-box"); const move = false; copyListener.OnStopCopy = function(statusCode) { Assert.equal(targetFolder.getTotalMessages(false), 1); Assert.equal(sourceFolder.getTotalMessages(false), 1); inspector.exitNestedEventLoop(); }; EnigmailPersistentCrypto.dispatchMessages([header], targetFolder.URI, copyListener, move); inspector.enterNestedEventLoop(0); }))); test(withTestGpgHome(withEnigmail(function messageIsMovedToNewDir() { loadSecretKey(); MailHelper.cleanMailFolder(MailHelper.rootFolder); const sourceFolder = MailHelper.createMailFolder("source-box"); MailHelper.loadEmailToMailFolder("resources/encrypted-email.eml", sourceFolder); const header = MailHelper.fetchFirstMessageHeaderIn(sourceFolder); const targetFolder = MailHelper.createMailFolder("target-box"); const move = true; EnigmailPersistentCrypto.dispatchMessages([header], targetFolder.URI, copyListener, move); inspector.enterNestedEventLoop(0); }))); test(withTestGpgHome(withEnigmail(function messageIsMovedAndDecrypted() { loadSecretKey(); MailHelper.cleanMailFolder(MailHelper.rootFolder); const sourceFolder = MailHelper.createMailFolder("source-box"); MailHelper.loadEmailToMailFolder("resources/encrypted-email.eml", sourceFolder); const header = MailHelper.fetchFirstMessageHeaderIn(sourceFolder); const targetFolder = MailHelper.createMailFolder("target-box"); const move = true; copyListener.OnStopCopy = function(statusCode) { Assert.equal(targetFolder.getTotalMessages(false), 1); inspector.exitNestedEventLoop(); }; EnigmailPersistentCrypto.dispatchMessages([header], targetFolder.URI, copyListener, move); inspector.enterNestedEventLoop(0); const dispatchedHeader = MailHelper.fetchFirstMessageHeaderIn(targetFolder); Assert.ok(dispatchedHeader !== null); do_test_pending(); msgHdrToMimeMessage( dispatchedHeader, null, function(header, mime) { Assert.ok(!mime.isEncrypted); Assert.assertContains(mime.parts[0].body, "This is encrypted"); do_test_finished(); }, false ); }))); test(withTestGpgHome(withEnigmail(function messageWithAttachemntIsMovedAndDecrypted() { loadSecretKey(); loadPublicKey(); MailHelper.cleanMailFolder(MailHelper.getRootFolder()); const sourceFolder = MailHelper.createMailFolder("source-box"); MailHelper.loadEmailToMailFolder("resources/encrypted-email-with-attachment.eml", sourceFolder); const header = MailHelper.fetchFirstMessageHeaderIn(sourceFolder); const targetFolder = MailHelper.createMailFolder("target-box"); const move = true; copyListener.OnStopCopy = function(statusCode) { inspector.exitNestedEventLoop(); }; EnigmailPersistentCrypto.dispatchMessages([header], targetFolder.URI, copyListener, move); inspector.enterNestedEventLoop(0); const dispatchedHeader = MailHelper.fetchFirstMessageHeaderIn(targetFolder); Assert.ok(dispatchedHeader !== null); do_test_pending(); msgHdrToMimeMessage( dispatchedHeader, null, function(header, mime) { Assert.ok(!mime.isEncrypted); Assert.assertContains(mime.parts[0].parts[0].body, "This is encrypted"); const atts = extractAttachments(mime); Assert.ok(!atts[0].isEncrypted); Assert.assertContains(atts[0].body, "This is an attachment."); do_test_finished(); }, false ); }))); var loadSecretKey = function() { const secretKey = do_get_file("resources/dev-strike.sec", false); EnigmailKeyRing.importKeyFromFile(secretKey, [], {}); }; var loadPublicKey = function() { const publicKey = do_get_file("resources/dev-strike.asc", false); EnigmailKeyRing.importKeyFromFile(publicKey, [], {}); }; function stringFromUrl(url) { const inspector = Cc["@mozilla.org/jsinspector;1"].getService(Ci.nsIJSInspector); let result = null; const p = new Promise(function(resolve, reject) { const iOService = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService); const uri = iOService.newURI(url, null, null); const attChannel = EnigmailStreams.createChannelFromURI(uri); const listener = EnigmailStreams.newStringStreamListener(function(data) { result = data; inspector.exitNestedEventLoop(); resolve(); }); attChannel.asyncOpen(listener, uri); }); if (!result) { inspector.enterNestedEventLoop({ value: 0 }); } return result; } function extractAttachment(att) { const name = att.name; const body = stringFromUrl(att.url); const isEncrypted = att.isEncrypted; return { name: name, body: body, isEncrypted: isEncrypted }; } function extractAttachments(msg) { const result = []; for (let i = 0; i < msg.allAttachments.length; i++) { result.push(extractAttachment(msg.allAttachments[i])); } return result; } enigmail-2.0.8/package/tests/pinentry-auto000077500000000000000000000024771334302754500206270ustar00rootroot00000000000000#!/bin/bash # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. # Emulates pinentry programs, with a static PIN # This can be used to bypass PIN requirement while using GnuPG/scdaemon # and automation. Another solution is to use PSCS/OpenSC. # Obviously, this is a hack, even if it's pretty damn clean. # This means, do not use this if you do not know what you are doing. # If you don't know what to put here, # you probably shouldn't be using this. # 123456 is the default for OpenPGP smartcards USER_PIN=STRIKEfreedom@Qu1to function tolower() { echo $1 | tr '[A-Z]' '[a-z]' } function reply_ok() { echo "OK $*" } function reply_d() { echo "D $*" echo "OK" } function error() { echo "ERR 83886355 unknown command" } function main() { echo "OK Your orders please" while read reply; do reply=$(tolower "$reply") case $reply in "getpin") reply_d $USER_PIN ;; "bye") reply_ok "closing connection" break ;; "getinfo pid") reply_d $BASHPID ;; *) # This generally includes OPTION, SETDESC, SETPROMPT # i.e. things we don't care for if we're not displaying # a prompt reply_ok ;; esac done } main exit 0 enigmail-2.0.8/package/tests/pinentry-auto.c000077500000000000000000000062271334302754500210450ustar00rootroot00000000000000/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ // Emulates pinentry programs, with a static PIN // This can be used to bypass PIN requirement while using GnuPG/scdaemon // and automation. Another solution is to use PSCS/OpenSC. // Obviously, this is a hack, even if it's pretty damn clean. // This means, do not use this if you do not know what you are doing. // This version of pinentry-auto is adapted for use on Windows, where // shell scripts can't be used as replacement for pinentry #include #include #include #define USER_PIN "STRIKEfreedom@Qu1to" size_t getline(char **lineptr, size_t *n, FILE *stream) { char *bufptr = NULL; char *p = bufptr; size_t size; int c; if (lineptr == NULL) { return -1; } if (stream == NULL) { return -1; } if (n == NULL) { return -1; } bufptr = *lineptr; size = *n; c = fgetc(stream); if (c == EOF) { return -1; } if (bufptr == NULL) { bufptr = malloc(128); if (bufptr == NULL) { return -1; } size = 128; } p = bufptr; while(c != EOF) { if ((p - bufptr) > (size - 1)) { size = size + 128; bufptr = realloc(bufptr, size); if (bufptr == NULL) { return -1; } } *p++ = c; if (c == '\n') { break; } c = fgetc(stream); } *p++ = '\0'; *lineptr = bufptr; *n = size; return p - bufptr - 1; } void toLowerCase(char* str) { int i; for (i = 0; i < strlen(str); i++) { if (str[i] >= 'A' && str[i] <= 'Z') { str[i] = str[i] + 32; } } } // remove trailing \r and \n from a string void chomp(char* str) { int i; for (i = strlen(str) - 1; i >= 0; i-- ) { if (str[i] == '\n' || str[i] == '\r') { str[i] = 0; } else { return; } } } void reply_d(char* str) { printf("D %s\n", str); printf("OK\n"); fflush(stdout); } void reply_pid() { printf("D %d\n", getpid()); printf("OK\n"); fflush(stdout); } void reply_ok(char* str) { printf("OK %s\n", str); fflush(stdout); } void error() { printf("ERR 83886355 unknown command\n"); fflush(stdout); } int main( ) { printf("OK Your orders please\n"); fflush(stdout); char *line = NULL; size_t size; int l = getline(&line, &size, stdin); while ( l != -1) { chomp(line); toLowerCase(line); if (strcmp(line, "getpin") == 0) { reply_d(USER_PIN); } else if (strcmp(line, "bye") == 0) { reply_ok("closing connection"); break; } else if (strcmp(line, "getinfo pid") == 0) { reply_pid(); } else { // This generally includes OPTION, SETDESC, SETPROMPT // i.e. things we don't care for if we're not displaying // a prompt reply_ok(""); } l = getline(&line, &size, stdin); } return 0; }enigmail-2.0.8/package/tests/prefs-test.js000066400000000000000000000014241334302754500205040ustar00rootroot00000000000000/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false, component: false, Cc: false, Ci: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); testing("prefs.jsm"); /*global EnigmailPrefs: false */ test(function shouldSetGetPreference() { const prefName = "mypref"; EnigmailPrefs.setPref(prefName, "yourpref"); Assert.equal("yourpref", EnigmailPrefs.getPref(prefName)); }); enigmail-2.0.8/package/tests/resources/000077500000000000000000000000001334302754500200635ustar00rootroot00000000000000enigmail-2.0.8/package/tests/resources/dev-strike.asc000066400000000000000000000061031334302754500226300ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Comment: GPGTools - https://gpgtools.org mQINBFVHm5sBEACs94Ln+RMdeyBpWQtTZ/NZnwntsB10Wd3HTgo5sdA/OOFOJrWe tJfAZ/HRxiSu1bwRaFVC8p061ftTbxf8bsdfsykYJQQqPODfcO0/oY2n/Z93ya8K TzjXR3qBQ1P7f5x71yeuo7Zrj7B0G44Xjfy+1L0eka9paBqmm3U5cUew5wSr772L cflipWfncWXD2rBqgRfR339lRHd3Vwo7V8jje8rlP9msOuTMWCvQuQvpEkfIioXA 7QipP2f0aPzsavNjFnAfC9rm2FDs6lX4syTMVUWy8IblRYo6MjhNaJFlBJkTCl0b ugT9Ge0ZUifuAI0ihVGBpMSh4GF2B3ZPidwGSjgx1sojNHzU/3vBa9DuOmW95qrD Notvz61xYueTpOYK6ZeT880QMDvxXG9S5/H1KJxuOF1jx1DibAn9sfP4gtiQFI3F WMV9w3YrrqidoWSZBqyBO0Toqt5fNdRyH4ET6HlJAQmFQUbqqnZrc07s/aITZN36 d9eupCZQfW6e80UkXRPCU53vhh0GQey9reDyVCsV7xi6oXk1fqlpDYigQwEr4+yJ +1qAjtSVHJhFE0inQWkUwc2nxef6n7v/M9HszhP/aABadVE49oDaRm54PtA1l0mC T8IHcVR4ZDkaNwrHJtidEQcQ/+YVV3g7UJI9+g2nPvgMhk86AzBIlGpG+wARAQAB tCthbm9ueW1vdXMgc3RyaWtlIDxzdHJpa2UuZGV2dGVzdEBnbWFpbC5jb20+iQI9 BBMBCgAnBQJVR5ubAhsDBQkHhh+ABQsJCAcDBRUKCQgLBRYCAwEAAh4BAheAAAoJ EHgWFzGc4xHEt/4P/1zf/2VsEwpJVlqwoLiJGQbViCRW34W8rTyL45GjRYAgDXrW LDPqxSbotXTXi72Dwug6a/Pn1VI1R2ZaBsWXH8qUYtSV/0b/2HfqUyDhaiuASywM dSfTAXa+popNccD5yPCJVBD0xmPCAmrOciYePMMNBk4SCDV5DJcCyGhEAkSeGsXy +m2bXb1pTbg6OpqDIPCqlmNQ8ZyAZNzWIyRWcqUY+B6xcZk+n50wG9A0TCOvVjsZ +E8Khyha2tfz1WFPmoy0rMD4g2ggvII3v4elosBQW0pxYdkwBAwk6g3DMyUzR6Gc NcZnuvnZVBbjCpqXtDJ7UcjjcP8zvzDYlXAY74gM8Nu7/89Pw676rVUXtS7c/LUB 8Z75FACi7d65Kp8Q6sNYVfi/mTggNwEAuAkjp9acEGvk67q2we+lEoeAwCyfBiBu 5TmYriLyAvfyoyeMhRjV0FdBaRh+4CkVgSG4/eTLFcnHVB2ZzhX7Uw0qoxM8R+ca P75XoVUyXmIpC/UZTrF4IGDUc4jbIqSGU2/Kln4Z8vQpuCw0vavbT93jSCyqaIbK qemK8D0rbaoxJq5RLkwU6gJ3dOpQdDRuqUAkfbEZd8yVRSmfugRhCTbdAA5/1kdg oWv9xZU7asdsm5cpHpy7lM7ponHsA+B+ykApDqDzPIHDZBoeqKl6qNe2BYOYuQIN BFVHm5sBEADBX28bR5QxbrGNVPT3jM60IT+m/GTLH6lm4OcZomAej/XrBOcX/0BY tOqqP7Dur8k0A8fcLkZCSBse1m6fvfACo8Vbeunv4IrST5FgXh7bYPZseIy5U7Xn 0dLqpVXJRqMt3ULS/Rwy18Xx8j9sXJJDAKIqZ4MHwgBknPeeBnD4aG6bJAuBEI6R W5lhbG8WFJfCniFuRnim+VD6ucf93x3NkL0TWY0l0PbUdW92sLfiKp1nmz+1dRoB ckT701sMs2pk48O5Y/vP6OEDzFzjGdA1r9YkblXjN9VxhSN00Wlmcq1DqEU36+Mq i4YIQsuF3NfS13+U2lhjlR5HpRxdDMfHjFYlk5hlOtuvopseYTlMykFl8D7y0qSF IAiqVl6pdlSBU84bOLHoCUGens+Ul7m0UShwZdVmMifFw/fJwISZI8D5vGkM3rE7 TxrHAQ/O1fJnGZNBRgn8LjnZjRGA/u1fweptFY0NyzO5lOzTWI6HBJl1hMave2l0 vtwBPLrRbbRhy6Z77BNfE9a2w7Y4aFeshjEpWxE8bQIyMrBGaRaiQ2lpXmA6XYZx Q8xOUfstsAR1TM+JboXJDuTw+YhaVa2W7Z/RzdtNnahWCCjptFq60DuggLwAGnjr 5HctpLgwvLVKCeDfU8nchzCkL7Hikh2LC7ySUR/VzORag/TkjxYRRwARAQABiQIl BBgBCgAPBQJVR5ubAhsMBQkHhh+AAAoJEHgWFzGc4xHEo+UP/02AIUR0349zGk9a 4D5Jv007y+d0tWKPL0V2btaq9xQzoM51CtuT0ZoqTO8A0uFmEhCkw++reQcWOz1N n+MarPjjJwMjhTPS/H1qiwTXmuwx92xLL0pajloq7oWYwlxsgVGCMDYE0TOMN8p/ Vc+eoJaWZh8yO1xJGDP98RHbZQWwYN6qLzE4y/ECTHxqi9UKc68qHNVH9ZgtTXnm gLAkEvXzRV1UOEEttJ6rrgPrTubjsIG+ckZK5mlivy+UW6XN0WBE0oetKjT8/Cb1 dQYiX/8MJkGcIUFRurU7gtGW3ncSTdr6WRXaQtfnRn9JG1aSXNYB/xZWzCBdykZp +tLuu4A3LVeOzn064hqf3rz2N7b8dWMk5WL5LIUhXYoYc7232RkNSiiKndeJNryv TowFt9anuMj4pFgGveClQc9+QGyMVdTe6G5kOJkKG8ydHKFEFObtsTLaut4lHTtx n+06QO/LKtQTXqNEyOyfYhbyX7xDbCbu4/MA23MzTs1hhwgIy4+UejU/Yeny6VkB odA3bFyEYKWPoMDDgfdlZbzjv3qAN4Qq+ollo8K3gJgH0QONrUaRY84/hil05T4E nUZiXdzPWvhMv5lEK+pTMlO8FbOG31+aB8rxCg+wp1ovyC/fp5XjZaLHcyPAWAXK LBn4tb400iHp7byO85tF/H0OOI1K =CVNK -----END PGP PUBLIC KEY BLOCK----- enigmail-2.0.8/package/tests/resources/dev-strike.rev000066400000000000000000000015571334302754500226660ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2 Comment: This is a revocation certificate iQIfBCABCAAJBQJWgkGuAh0AAAoJEHgWFzGc4xHEXlMP/1G7Ldp8fuKZc8rQ3UEf PKnL5jYmdjQdwhh/aX2Bf/a0J1IUryqQe8YdhtIQtKA9ikyVstaXCX/2BhmrIpr3 f5th6mOPUW38RWfCGWEa/fg+RmYyoU7NnCLG3zvHMQpOKOSYqx4l04JWMSdcV4fu DEkBRInijG1QaBUk+5mR0kI2igBGvuoGGZyA5bILeLM1Ua/Tso+r/t3x0rnY0Us+ AN+GNo0Y8zWQjx/9ShEEiMS4MxbL6s3vNcw3u19qBixtd63vBi4zmIj6WTw8Rrxr BozwZ/RX6+SFDkn2oXVpou/F+TVL4wv8bo1k7ZmdbeozwHLd44hXMWB1HaFAZEHZ Y9+geedO1XH/JaRhFNeuVUxrI6qKQFllxuMm1EiSriT9eLcYFxeY3WxtnvusL5fp cgl9sAOzbZQUUNNSYTTad5y8n5/Rzft3YiQQBhO1E5Wtz4wnPseWq/I7DGJ62jGO amhHRKqvdqlk4+Rst+aQ5ok7BXmZuh60VmkUAh4dmRkPNLBA5J8Ts6stDF0PS4oh ZDTEtA0cXDS2S9c/xQihWaadilrbJ/lVDNZ+CQiZNJ3Me0ChXcjUvJL7yZyyXVfH bdYhpv05fhaBZcqvWb50UWD+Hp95isYRYehw/RQpRrnS+mKvkvS+RO1QV0UkR+yY 68onQta97hWM9iZ1WzS+pcmH =3cc8 -----END PGP PUBLIC KEY BLOCK----- enigmail-2.0.8/package/tests/resources/dev-strike.sec000066400000000000000000000151241334302754500226370ustar00rootroot00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- Comment: GPGTools - https://gpgtools.org lQc+BFVHm5sBEACs94Ln+RMdeyBpWQtTZ/NZnwntsB10Wd3HTgo5sdA/OOFOJrWe tJfAZ/HRxiSu1bwRaFVC8p061ftTbxf8bsdfsykYJQQqPODfcO0/oY2n/Z93ya8K TzjXR3qBQ1P7f5x71yeuo7Zrj7B0G44Xjfy+1L0eka9paBqmm3U5cUew5wSr772L cflipWfncWXD2rBqgRfR339lRHd3Vwo7V8jje8rlP9msOuTMWCvQuQvpEkfIioXA 7QipP2f0aPzsavNjFnAfC9rm2FDs6lX4syTMVUWy8IblRYo6MjhNaJFlBJkTCl0b ugT9Ge0ZUifuAI0ihVGBpMSh4GF2B3ZPidwGSjgx1sojNHzU/3vBa9DuOmW95qrD Notvz61xYueTpOYK6ZeT880QMDvxXG9S5/H1KJxuOF1jx1DibAn9sfP4gtiQFI3F WMV9w3YrrqidoWSZBqyBO0Toqt5fNdRyH4ET6HlJAQmFQUbqqnZrc07s/aITZN36 d9eupCZQfW6e80UkXRPCU53vhh0GQey9reDyVCsV7xi6oXk1fqlpDYigQwEr4+yJ +1qAjtSVHJhFE0inQWkUwc2nxef6n7v/M9HszhP/aABadVE49oDaRm54PtA1l0mC T8IHcVR4ZDkaNwrHJtidEQcQ/+YVV3g7UJI9+g2nPvgMhk86AzBIlGpG+wARAQAB /gMDAtfSz5hVoDvp4Vugj4T3VQk8mJ3uYDZmPbNL8SK18VTIVpd3xgrjTP+JEtB+ aw1WQK4Qik0BdKAu9Lv6wz4u/QNC8q4x3lBcoYleD6iXRL2Tpnh7RcEakIoxIeFH joBTZOI+v0HUlyVvSkIaEhE60UvdX+If9p9sx5+uHdYRRfOkM3SZMxLxCUVHMp1e ZBcmW+x9UiyA07wXyvAhlS2/iTijDtQFRqK8xs9w7zn0A12afksGtPEL7J5MRqQs BuxUrWSKVQ3DkgWXd56qEtbKuklKXe9t93eMPvcFQ2ZVhgic436dygtpNgkGliVq Di83wUjorTZFMeC0uhvQ2akfQxvj5TgYoI0rFABvn/6He1LBSWyiu6ZK1nC1PKUc KLGQGfq+kbHwJg3q0wIJ5+e1v6hZ9HClhaRsR4ADnTDnp3mGqPxDWvQox1S2+ESx 8N6AcZ+q47D78IE4EzF4LyQ0g9FdDiNsPwqN4oS2/ZkXb/IbFoVoottU7915KqZO 6kiJvpMcZrs4TJ4zR++CGBEvJDfUE4RoQHQe/XLA1RJXIwXr3kWPvB2Tc16vdhkh LZ9z/HOrPW6SI/UwVYFHpmJIYj3nHdjGcyWwz0KmQ3H5+AYe36afwJws6TFx/QLi fqlOkcaBaiQwpcpuSX2y4rTgcjDEaVdPGmvs2m5vKv66a8yybIl2P0veVTutGtC8 DfQaggqZWQYHmXXvGUnBM+H9YSBJ2g3W3w51fKcN2FtX42OsVxXqZkqlGR2zBE00 ilVZmiv6ajV9mmO7W8EV9TPqjrYuEDf2M57LllQ7OB1p1v6CtqIyVSL/Jak6ckMT 5VdqMoup6ib5j4CR+C4i7Btu+gkXhW775l/jbFlUXKE5Vn+LAAIOpxiVZ2Z7azL6 sNwxtfmpaTAgIvHGSysgPeXeEN3fgTsfZ0PYaqlEHggsYDDU4XvXIOKcUmrr6zEI KXeeS0+V3nxSIb9kQHYZyUFvNv98gCCj0wgNl+LoVJ9NvMkaOrCS0jkRaxJicQfa bu4XL9XbUBESuHvG6jiK6DNlhT1j3qFFcRBO7COI3OQ0JD7Y1XPYYR48EP69Fwe0 82LZH5dq9kslpn8VsuygTum9jYFnE5UVLfmjbroFu9YlLE54T0CdZ4UQEWTrZiuz TXYf13FaVEgfAim+hjdUUVSCptsX2crC7Vrsk/xMjT2ETU1w/yZb5BVoCvbK/eaf sqQAPGElSp0YlI/mgpbc5rRQzcSXghenjOol/gJM0MbFJuyQ93sLW0Gi7zEeBxQi aO/Ua4F4VhPilPf+T66fNMM0bG29X5j41eRrN0m1ly4M+jOOIyocLcUamgFsRDTe XG9kHZUylAJqNMwQvDzbVSTbHKjhOTa3PyinrTwauYiQP6fIbd4JWkIW88cBynbR IHHCYYGxZoDUDd366QyNHKTd5wxw1MicK54tUDcUVDq8NKC+yGuGi6WLYt4WdNEg pYb/MzxGRzbhVEHNbfFEr5e706VcQlglpPcMTUctzRVF18wWHzPVbHdZiTBXdr0t hJkRNaAvnmQMvP0bXk+QDGW24Z66Yz0X2YzFo4Rdp/MAm/1KwagIu0hIGbwk8egq tq6Q5zyyiSp7dVvcNAPaEzEKZXRSrSjyNwQw0CHI940SRgK5JDkAMHZWK8vg8Ih4 DR7m69XmYXwvTScrQqkFa+8XIb5QqeH7W3Qe4aKiC6QOJav/ptYLZ+s1TTzeIOA8 5zxhWPj81YgifDtWPc4MG+Y0QuSzMdMue+/oJUt6lyQmtCthbm9ueW1vdXMgc3Ry aWtlIDxzdHJpa2UuZGV2dGVzdEBnbWFpbC5jb20+iQI9BBMBCgAnBQJVR5ubAhsD BQkHhh+ABQsJCAcDBRUKCQgLBRYCAwEAAh4BAheAAAoJEHgWFzGc4xHEt/4P/1zf /2VsEwpJVlqwoLiJGQbViCRW34W8rTyL45GjRYAgDXrWLDPqxSbotXTXi72Dwug6 a/Pn1VI1R2ZaBsWXH8qUYtSV/0b/2HfqUyDhaiuASywMdSfTAXa+popNccD5yPCJ VBD0xmPCAmrOciYePMMNBk4SCDV5DJcCyGhEAkSeGsXy+m2bXb1pTbg6OpqDIPCq lmNQ8ZyAZNzWIyRWcqUY+B6xcZk+n50wG9A0TCOvVjsZ+E8Khyha2tfz1WFPmoy0 rMD4g2ggvII3v4elosBQW0pxYdkwBAwk6g3DMyUzR6GcNcZnuvnZVBbjCpqXtDJ7 UcjjcP8zvzDYlXAY74gM8Nu7/89Pw676rVUXtS7c/LUB8Z75FACi7d65Kp8Q6sNY Vfi/mTggNwEAuAkjp9acEGvk67q2we+lEoeAwCyfBiBu5TmYriLyAvfyoyeMhRjV 0FdBaRh+4CkVgSG4/eTLFcnHVB2ZzhX7Uw0qoxM8R+caP75XoVUyXmIpC/UZTrF4 IGDUc4jbIqSGU2/Kln4Z8vQpuCw0vavbT93jSCyqaIbKqemK8D0rbaoxJq5RLkwU 6gJ3dOpQdDRuqUAkfbEZd8yVRSmfugRhCTbdAA5/1kdgoWv9xZU7asdsm5cpHpy7 lM7ponHsA+B+ykApDqDzPIHDZBoeqKl6qNe2BYOYnQc+BFVHm5sBEADBX28bR5Qx brGNVPT3jM60IT+m/GTLH6lm4OcZomAej/XrBOcX/0BYtOqqP7Dur8k0A8fcLkZC SBse1m6fvfACo8Vbeunv4IrST5FgXh7bYPZseIy5U7Xn0dLqpVXJRqMt3ULS/Rwy 18Xx8j9sXJJDAKIqZ4MHwgBknPeeBnD4aG6bJAuBEI6RW5lhbG8WFJfCniFuRnim +VD6ucf93x3NkL0TWY0l0PbUdW92sLfiKp1nmz+1dRoBckT701sMs2pk48O5Y/vP 6OEDzFzjGdA1r9YkblXjN9VxhSN00Wlmcq1DqEU36+Mqi4YIQsuF3NfS13+U2lhj lR5HpRxdDMfHjFYlk5hlOtuvopseYTlMykFl8D7y0qSFIAiqVl6pdlSBU84bOLHo CUGens+Ul7m0UShwZdVmMifFw/fJwISZI8D5vGkM3rE7TxrHAQ/O1fJnGZNBRgn8 LjnZjRGA/u1fweptFY0NyzO5lOzTWI6HBJl1hMave2l0vtwBPLrRbbRhy6Z77BNf E9a2w7Y4aFeshjEpWxE8bQIyMrBGaRaiQ2lpXmA6XYZxQ8xOUfstsAR1TM+JboXJ DuTw+YhaVa2W7Z/RzdtNnahWCCjptFq60DuggLwAGnjr5HctpLgwvLVKCeDfU8nc hzCkL7Hikh2LC7ySUR/VzORag/TkjxYRRwARAQAB/gMDAtfSz5hVoDvp4ZpoCdrR S4An9JABiMWCTG4IUYuShVQKJJR3KtZ0C5D4gH4BUlEGDsUtY3/6deakvzedbVxv mb59QoU8GuHZ/iWAlsY+37YIBu9kbywIFDDGJeD9th9cXPpuQ31kEvwE37gsNn5p IB38oB3mgWoLi2nH4AAVNZXPNBTJ7rS1pi69v4BepUTbglb805ypmWJllzhyRUvm DAU/8cu0cPWaaBU4s8Mi7SLv2s+i9EPYNzDkBEy7RYvZApP7G8x447iYPRvmaFnB Fd3Ctpd3xkZhZatDV6MJCEfssIdy5yARV4zwCcZ5JDGXGlxoiPH6A3b11SwPOEMv QJ0PRZ334XLK93hwzxjYKBJ8hBrR2oPvRUOAVs2/J8JSASYrufyqkXnYJ1EBnP3H 5TwbjRQ9Qmg1ScFCzTfYgu5emiIF5LFAfTasZGSJvjrXFVeocCswHUvHztzJmpbt BAov3Lw6lBkxdvhZomyx74CGOnyz/eFD/khvIV/oms5lR8NNrkpkRGZ/xCN8Kmau KhRBebGVEITzOWJQHz0QMhuTloVvtDbDDgqW8gH8eVQJkQCDw8Wd79uj0kw1Xaln nseFPLCRNRN0js7cCGW95fVtawRNBCNYambNCLthkBfzT0+1/ULRC2JrP1rutr6D sye0S44kNyXKhM72Hamu4XygYlzRsYQflv2PgypjVmkdcZ2rwomMVdqQll3Q7jde kWKDpKdx7lR2pnDoXmn43VR1X4uD1PHab56tYE0JUrKDgqZJqzCwJXc3FcPV7LgD 8pISoMZJ5+84UiRBvNN7N24kpLd9k97Iz29qY6u86Uy/f7/X77qur58r6K04vTfH 8nA/ybc/9Ube6oyQ44A2NEwBrP3NUA6lHNPeaYBO2RGxTJJU2Edxuy3bJMpEkBhU CeWWIZnuxojF+pGjiPLArVZg6Mahc0GlYoiA66cxTuoGHM/wO5Xl0f33L0jny3Kv I9OWvUJbKs+J8G6q0zorl5nNmPpTwGYLJkUKhLtMhjS+jf5XA7b5jN1079/oToXu Xsfl6J7vnwJt7gglLRpK8iw3xlF4X4AWodBLj36HEyOgTimJXLt2fdpIrkiutUFF qdWdZeK+sII8ZAyrfgvwxvmairFK3ylbPwA340jsRQeA8boOOSiDV0cPOszQi1Rt Ygnae9or6faA3lqe+fRQi5JsmnJ1jLMe0mxw1mMOR4YLCMjgBc0CTMkY5kmCykA7 NCQBec2Fueu9cxsu7LJO4+OAUF+i+G/BWPzvWqyJrLk52tME2TxyVL5PRZvqAcrK CV+d9IKxH4Ng40qPXL1gM27wWrrFa6RGq12oGvTqkVcomImzqK1ASSPWU3bSYiOy 2JOQvjLxjQw6emNYG09SlKrzNmXlbrZ4BfolL4eI8H2+3+UG4l/cXxPnLEeQzkvu XuW5yajWoNBocEICcopmv8QgpwgiTUstmOTMFXD1EbVasonaH5R+wxBMB4Y1K+ot eRawIyFA75FO8HCPoTBe5+Qb6G8+5i7nsgDtHG337G8JFz3hE3U++90zbYxxtjYx Y2PYHfOwsDE8IDu1ZqzuB7lgrNADzOzelhSrcaW/jNHPGlxcsPTXl7S2QazgIPqk kZ9g4ceXSsZOV9Yl4Bu2ODeUiVeYGGEXwJ7WAKNvaR3bMbhl+iwIQFy3A12/fz0w B16C9qp7P9+5FEFWjlqi/28dSfECiDD4X4iyEe+sWTS86Cv0VsL300dIUQPIs65d ddkrIkcpM4jyabKTZcltiQIlBBgBCgAPBQJVR5ubAhsMBQkHhh+AAAoJEHgWFzGc 4xHEo+UP/02AIUR0349zGk9a4D5Jv007y+d0tWKPL0V2btaq9xQzoM51CtuT0Zoq TO8A0uFmEhCkw++reQcWOz1Nn+MarPjjJwMjhTPS/H1qiwTXmuwx92xLL0pajloq 7oWYwlxsgVGCMDYE0TOMN8p/Vc+eoJaWZh8yO1xJGDP98RHbZQWwYN6qLzE4y/EC THxqi9UKc68qHNVH9ZgtTXnmgLAkEvXzRV1UOEEttJ6rrgPrTubjsIG+ckZK5mli vy+UW6XN0WBE0oetKjT8/Cb1dQYiX/8MJkGcIUFRurU7gtGW3ncSTdr6WRXaQtfn Rn9JG1aSXNYB/xZWzCBdykZp+tLuu4A3LVeOzn064hqf3rz2N7b8dWMk5WL5LIUh XYoYc7232RkNSiiKndeJNryvTowFt9anuMj4pFgGveClQc9+QGyMVdTe6G5kOJkK G8ydHKFEFObtsTLaut4lHTtxn+06QO/LKtQTXqNEyOyfYhbyX7xDbCbu4/MA23Mz Ts1hhwgIy4+UejU/Yeny6VkBodA3bFyEYKWPoMDDgfdlZbzjv3qAN4Qq+ollo8K3 gJgH0QONrUaRY84/hil05T4EnUZiXdzPWvhMv5lEK+pTMlO8FbOG31+aB8rxCg+w p1ovyC/fp5XjZaLHcyPAWAXKLBn4tb400iHp7byO85tF/H0OOI1K =h0dN -----END PGP PRIVATE KEY BLOCK----- enigmail-2.0.8/package/tests/resources/dev-tiger.asc000066400000000000000000000032461334302754500224460ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2 mQENBFdGIzkBCADKys5q0rYiTr/FYdoupmNAJ0o20XWuFp/V58qsnQAMcAY2pCB/ ydx9Y7A80QjZPuVcE5QdROfvvkMXAA47ZxZrH79Kaqj11DS5XOgtLVtITGtWvrYq IFujxP42ICWBh7LXUwrHfi93FX74ucXoWo/PZndbo+JBxc0ZsrHUdu24grTDuqLZ Q8mRCx5U4tf+zEVIU6kXubFzq8aPSnjfEg6MhXxSRictjIBKM0Ez2QwZmh1vAEmv n0kr0VaJJ7xVRgIH1CgNh/WWtbr0lrblKCkFkTFnQfslWvSEko+LqvwgBSKyKg8V tWbYftnBkn8FPbP5Brp3wYgBc/c7mrLROqAFABEBAAG0ImRldi10aWdlciA8ZGV2 LXRpZ2VyQHRlc3Qubm90cmVhbD6JATcEEwEIACEFAldGIzkCGwMFCwkIBwIGFQgJ CgsCBBYCAwECHgECF4AACgkQhDnhcEaXfEb3/gf/V0da3gXN5TNOsWZKj/fI2FhQ BglJ2vlEamnppwtnWZGktdFZ1h6ymzQ9PY3IidbKctqs/QQWKtIBVh5k02fvUe99 nsFZmINcLeajdu7IqvKxtFBuEwZAA1Bw9dhM3JRQM8z+l+CtbFh6dVufU7q5vVEX ciCkhdn172QYTMAXNYE4Tfh7eaEAOdRyFcwiAGZ826pOp7Al52frK+MtaXa9D2fR INlDXD9+IIR80sig2B4iBGeY+qAmE6bFuw7MtBya6uKupLjtAD/v48Z5wBYuU0jP ld4KH88IWksbQo1zW/O+1N7J1/U9ZGNwpvS+wtfyjlOpTS3YWGmY8sVturZqTrkB DQRXRiM5AQgAsDN5j4viE5E8H5N9cfzQ9ZO5BUk66yI2DVEeasqZWFCkRA+uFHcT F6YpCoSn4/JsvqvUWVh63uV5vdAiU9+4sNFT8nkP7zD0LQthFtgEXqNo11NR7yvD RT3TOAnGaa+bLyoU/SLXzSwctZksrQjzQJVSohQNznhj95XH3UEsUydHqje7ljp7 NHWAJx+Tlp2Yh6q060/gwh37zsfdVbaVtjeaAYECX3z6L7JB4KBb9KGlmDmOMngV UuR8XWWE+LEx0m7B+kZ+vZhUOSDDomBP+8jGJmXlcIt8+LIBq0NeXs/YINCc89sa UPw/V6X/NFRkekKFzIprCzwhg0LWl8oXAwARAQABiQEfBBgBCAAJBQJXRiM5AhsM AAoJEIQ54XBGl3xGUvEH/jVTBoRfJ8ohc4Ahal8TyIm8vdT/Ax/ddyyaLnCxkLFt 0noBlA7062N1Fvv86Ts93EFrK9nF3g20gXKBKETo/vJRqtODIrwtCMfzPbS/FkQw eLtUDZXed0nq/Yaxk60H2HmWm+n9/126F3QIt7is0E3dY0e6DYJGRHnn+lWnUs/8 Ba16Zb/os3GgwEQwr4LPEty6CFQU2DNl5HmajeB1oEqmeDZ2f/y87GRpdCoTgudQ iHMPdm2kPVbeAA6945W6Y2LSA5Hm+yS8s2dBs4+sEiW97owLz6vcak8Aw+7JFxL2 JkoZuN28dueoVcFQw3uX0snoBXgo3LYsK71JoufrXhY= =Yrbk -----END PGP PUBLIC KEY BLOCK----- enigmail-2.0.8/package/tests/resources/emptyRules.xml000066400000000000000000000000001334302754500227440ustar00rootroot00000000000000enigmail-2.0.8/package/tests/resources/encrypted-email-with-attachment.eml000066400000000000000000000200071334302754500267420ustar00rootroot00000000000000Delivered-To: strike.devtest@gmail.com Received: by 10.31.65.206 with SMTP id o197csp6107vka; Thu, 11 Jun 2015 10:04:06 -0700 (PDT) X-Received: by 10.13.254.69 with SMTP id o66mr13216940ywf.152.1434042246087; Thu, 11 Jun 2015 10:04:06 -0700 (PDT) Return-Path: Received: from mail-yh0-f45.google.com (mail-yh0-f45.google.com. [209.85.213.45]) by mx.google.com with ESMTPS id r184si124165yke.167.2015.06.11.10.04.05 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 11 Jun 2015 10:04:06 -0700 (PDT) Received-SPF: pass (google.com: domain of ipazmino@thoughtworks.com designates 209.85.213.45 as permitted sender) client-ip=209.85.213.45; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ipazmino@thoughtworks.com designates 209.85.213.45 as permitted sender) smtp.mail=ipazmino@thoughtworks.com Received: by mail-yh0-f45.google.com with SMTP id d80so1649421yhi.1 for ; Thu, 11 Jun 2015 10:04:05 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:date:from:user-agent:mime-version:to :subject:content-type; bh=GzgNMIbACo0qviXHTaTVeIJQ4iy/1HFPSyLGwM6Gutk=; b=RyNzxW4V5tq5wR+kX53P0C0ovcfCSIxpCqS/UFmupa5n1n1nnXgv1TEtAezexFBD08 VN4s7POnOIYENchLovB9iMhAynB0lIJJ2klU7SoCqJb8MQyC/Q9IT0pubLFRXifGHiY1 Oe1d348SShgxIKkDhZ/mtDDPFMS+/Rbw+Hw5CgIIfkbuSK7U+HmnhaW9WHzbNie01DAV mCQyiMh6lcnHP1AGg5VOzzABzIQo6J1CTgOCtrXyGKGb8vfda5rBH/hMcL2VEKTOP/N0 fBqj1UxvslPe4ideOYJfOsMGrAShln1yPis7WpbXf0SMCxrkdC8x752dYY1buDfM9jGk HtjQ== X-Gm-Message-State: ALoCoQl4o5R+0YzTR2jnS7qaqQ/rMEZNBLVGE2lLmVdqLWLpgWWodO5KHbJts7CsZC6Thm2kj6TN X-Received: by 10.129.76.79 with SMTP id z76mr13237331ywa.17.1434042245687; Thu, 11 Jun 2015 10:04:05 -0700 (PDT) Return-Path: Received: from iapazmino.local ([181.198.81.194]) by mx.google.com with ESMTPSA id u10sm819002ywu.3.2015.06.11.10.04.04 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 11 Jun 2015 10:04:04 -0700 (PDT) Message-ID: <5579BF87.1040804@thoughtworks.com> Date: Thu, 11 Jun 2015 12:04:07 -0500 From: =?UTF-8?B?SXbDoW4gUGF6bWnDsW8=?= User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:31.0) Gecko/20100101 Thunderbird/31.7.0 MIME-Version: 1.0 To: Fan Jiang Subject: Email with attachment Content-Type: multipart/mixed; boundary="------------030301020907070004050005" This is a multi-part message in MIME format. --------------030301020907070004050005 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit -----BEGIN PGP MESSAGE----- Charset: utf-8 Version: GnuPG/MacGPG2 v2.0.22 (Darwin) Comment: GPGTools - https://gpgtools.org hQIMA9U1Yju2Dp5xARAAipOGZCn+zFA4L1muc1y+ixqJqqNHXkBXoba6K0WS8bLO 9U6Nw5HBblT8+Lcj9uhY3MFEsFi/6ziu5Cebm+eWoUDyUrSY32XI8dc7QtrgGbb1 +Y/uGezuwr8BfQP53heWk5p/EICPi/3gHTa4HG2ajW8C+ttSltUehVfknraPjIZM pKws9AXs1lGZxoQc62Lnj2npqZafsjYZGKfAP9IE7ESPrPfBHKqS+E9wKQzU/Wy3 Zfqf6Y1CiwMOl7dLDzbCgcMvKKpdCgk03f8BfLv4qPBNy8HrvwZt9kPo9an/gaMY ToyaZYYUY9a7MYNI9MaTX7IzEWFdkuyjfJzk5u+WKaAVL6x8xdbZpnEWjP/jm4Zd c4YpTWclkriAhc69vucag22JtsvBkvd9IJklvr/wO/Oych8fGZd/ClkfAfKdPw5t 1IrQmYaBiPGpSTFuPrci1oXN5SXGu54IJ4r88hxMdOZKKDPHLfLVOkjDp6RHoJQd /KkaFheyQnM0tcX3ya/moKeJDDpyMtdZPznudqtMGjEnWb1RawmUsrpcP4rj1Dfm Pav7iYeLZMM1yYD/vb+DxpD7jQ9ALE9n1aIakzp9BS6NVvtTv0ojENesQVFT5zW/ x1P6Mwcp58CV6HdQqwhPZQ8sjPqimNM0AMIGo9C9I/pxyry935BX8l4rQ1AzYomF AgwD4vk09TV2dzQBD/91P00WN30F0m7i9dWCKZ7/Jr1q8LaQA35lbqF8uh+vSqmI OPbr9cCjn2SNIeKTD+NsmgZADPrGtBcJy5+sU2LK58laicS+nfzYIovjnyhddetG ahyoQrFmf8w3z67GElYv3EAIIPwqdr5HI7Sk2Xfx1n4t/8PhwREikXAM/iWnsI6m NQBlx+hH3Q1LkhATGgb1lnwswgDXSVmbI5zsFglR9UVmt1ENZrvGiQMN2hJPGgbP MVxV/UggcruDqIin8BlGEZR8USOY2y8FkiX1WNNP9VumJ9N9b02gHDPozPDH0DgK ulpGJKvCjYvgcFqbXRbTZ8kGGudxLYbWASl5s8wobo28J2VhlDJAhrL63wCmEP6g Nt1/pM8ePieCl9Jtb83Wis7K1wYoFA8hK/nqRV+v1RmLk9sDYLc1v3eFeLBaZCC6 6mOh9mZldqmL02+UCKHpS+BTdX5LaxMoQpFdh5kx8Blssf3dCS4pezS48rCEBEfU sfKCjL7Ii4WhhEw28e+Lc+QQo1xy/r/WzKFYulvqmUvyH6djKmDsMrSXXuwr4BJq 9/96aeNaJ6109sa66luMz8ru2h68fv0ozslJTA3CRCi/dq1blSegnFb/PA9M/xAp 75VjROvurfhTc+0fwV3r3cLiNOEj86Ih8VuoalQWKcRV0OHzXN6HJDwu481dxNLp AboMPK6dBDyYJEFuOB/kL377OPGU56jk6isMw7U5yODPR24+rwqSadFJNgMquyz5 1ivj7MsE+jBl7PgPTgXJQKLfS2QJi2j1oOsdA9KpAQ5I0CLmc4S1c8pTWihMUwaS VtoUm9wUS6WbwbLTg+v/HTPlN+7v0ngpYWI151m45cEF0mAfH9dH4dZ53DuNhv+0 HQFkcEIKW6Gr/V6qk/7N/wTtMk1WWAgyOlT/mhbocpV2/coxE0dAnGIgEGN7mik4 FUijTzdkSbhka/e1ckb5+ZxkWZeVXpEtBUW68PDOICotubA43p/+hicjxfK//aaZ 90bomYAXgCIUFp321ZVM6OS7wzbdRiRL+NTcPu6mMT2F8SnvaRFyORNJoE/QM284 pKMJL2DDzTuwaBUGzbKOzeVbEBOG9Y8e2hsKP5Pz/r+lw4Uq0P5zsrfLgxuVhrEb I5hGLyoGcdtIERJyJ46zttkRMNd1D0yu7ICg++BJ6Og6qCHgKfLWsiqOAw9TezjE CzKimQXAJzFpUsn4cnOuxF2qtdXHakYu70yCnWXHkgMgKqDeBcDA+v5yfF2Z1dCi YnW4p5TKyOliexjf3XxBZNsDO+xNuSh3HpnkHhuxzIQEEin/K+Hq8Swfd20vDLsi xXJQXo0Mph3v5TD6RA/tx59dioci0V2XfZMtdTlFgyTAE2K1PDGlLYmyDdvYYCAT 7LsYac6hcSTGHqaEeOVcaD5IYqwL6ngc6fTchcDKerLYSjfNcOUhIQUo7oNTKC5i LFMttrYdxZOP8IvkrP8dUCrK2cbPk+qnH1Ft6VYNJJ4t4ayKVLrRucY1oblvnTxl bGUleZ9nK46o1pkmBmdq6ka/PTN/XXdSsw41CL8+PeMHuohujmpWtQU90cBtC/SG 57E8LQ9ngDtSM0A6IJweIoGmk6Owu6wSwoHIJ/+WHZcDKQXhGh5r0c3q76BqIv4U 9sayYTw= =J17h -----END PGP MESSAGE----- --------------030301020907070004050005 Content-Type: application/octet-stream; name="attachment.txt.pgp" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="attachment.txt.pgp" hQIMA9U1Yju2Dp5xAQ/+PGGcKOhJ4CzNeAiZVkYOwJcNFW9gLGG0R0rKPqiRED/BxL9B1Oyi rKhAQ2cYTPLo/ba94K6PXzrjh+8pbNpLFzXgEm4Ps/YQLLf/G+37+yxGtUa1URQtGMwQFKD6 sOVBNSBjnSTzddHIsTha37J5XBbePVzKzRdJIr9DepxZSoB/39AJmudxSWMn9vdZS36T7Hri dNim6Rq7fFFAEftPcI9clh+nLtNJiLzMbyRN6IN9jlQGaL2qxU2LcuOBw4MtC9Zjrl37Sqir 54qfGZIZhuXAeO+HinbQKLppdwu/tnF6JATU2QwmlOffFOoOjze+0fs5unlML5xMZJF12cgP /l7MJuma1h102OHoqjILCTLOzw+sddFKIvKi8X8IjGFG3oh1iUM5UnkbMrcvtz2ULhJWxXOQ +51oKB1rhZPYk1heK2mKcFY2IkyBMGuvdPYj94CB95hS/VwxZWALqpIkc5C1xMkInak20I54 SjxiMnMGqUWYCHRJxmwA826AGo9yUA1acOnTDfANhHm96jzP+KW/bTvCTlUsXJCPqq/3Aqx6 0ok878zF+6y4S8S+M+RpVvgJhGQvROlqG3b0Ig+NKN0QrZIHyNCVpW3O6JZEefpKJeQxd921 cb/yPb6jjzcS671nvbXuTqJkh+NqCz1qleFRgU0KmqbLwkg9e3lqyj6FAgwD4vk09TV2dzQB D/0UItnL67tfoiQ16ZzmBvmA1Zb9ZPfmXvJu0VfUuhoUmeBPEiB2T3rOHg3p87axzl+sUYSw 8vxCzxJFopmfm+ffvBeBMjlz4zVHR1gJTqjClacN3KYanjjDivn4cWWbEzd4rozwJEYNFAl+ rBrFWVdVriIBDdocjiWI8XWK38VzqakcJ0s4l4Rk9+tVvtF/Gvb4pqe2dLa3qAMjRlWVQLEE uYMwSuIHvjCf84D2n230j7RmXDWHR0E3Ynz+nnOZ2MpqBWLeeTYRjzDl08eqnvWS9a4W7Il8 ktpVUMFEC0N0dvEK/Jy6Vq5pu8GBgMNyEU+CK5nFS/h85a42YTI883oRcTOKUuS354bFv44h sSro3C8qpiyb+K605slYqr5DCmt2MTtlE9ICDAIWahPsObB0dFgGHA20TjaIgpJ4SFYjGfu7 VkbppxzFKON+LV8dlxHq1tJz2bPR3KkioiY9xee5BuUkSV5DlpDXLiXChOAdsbbOQUDQTYWo KM2dHl2mUyr8rQlWWRP2UB8rCyiGc+wSwCmFoVJ2+aFwob/WlNfUXOqQg5v2wppypdq3d0Ei n9X6cVfny9Z0GtpjnfApf8Z3FJuBYbFlKoa4PKm5slHIcFy4fAGBCr/yn46I4CTSY344K41T Aef5/qfEu7mEUh80ce7fviTctBHCuNVl/02WK9LpAaRfFxf3gyD5/KsR4mGlYHrx7SWJC8QC leD/ueJMZZnT/fxRoufJczZmxy5q377TGMqzb0YLk03U2q2YUzOQvrjcgOUplgwdwzTic3sL zKz/AzLfDRGqm4sotQ8mqEn7h8V0yKjHYQ8/m9qyDA4oXmxOpJmvXdwgqPtOvflbO8+cI3tH svzeQmFLrGPW0Xc9bRm2i8IwZUYeCpBEF2EvivLh3AmrEklv8tkkzVPOWD4Ylm+cAmFgxOoQ p7OmQkearaUs9q3CwGUhJusYCvyzQxJtm3sN2FeFhp93uFDtyZUcZqlFdAuvpZdDtDtYgwIg qrzooq5tXa6KxuJd+UdGeKG9I8HmzlmqxzZl2DAl1gdw2ZIVCYSy1aW/qUD/1I3ggISA0egZ ehObQpbZd4Dor9o+fJAAuEgvCKAab5b7FxWEE3YdGPcMPC57BZUzJGzwcQ1giA7CJaBAmLGG B6v3LQnoRXP9jDatgxw9qvaW6r6IIzTBMJD932S0prHNzvHFD/KQmtw1cKmClU6yLVktFMSP 5rJSjw6txNSDOtzg8cKqhOxZr/LhdKTn0So/mJdLfUOB7zy1Tyyh8rqS7bB+toTitXGJ4YRL mCPO+bbNAC3B7c2+j+FscKCrQV0LTC0L2xrMJBmSi2uA25rf2DiT9y4lSVYxT834jsZRl0eH 2uKoiVuW/sY0/50hsLL/b7yngHxRVKv4W3CJ98FUlVJpBfDLPCWGAP3UWqrbdmVlHCIQRTyc zWtCnX080iBX7wu9yEOY+6hBEz7Xh2eyQ0oWhyGQRqGOAaYH+wVmiTybsqBtWjoxDQcTN3sR UnCsgwInlYiSNdeIUsqHwD2NImBhVscyutyzQOnmTP0DJkJKW3BPBb/AxXdKBR7chJpKlxvH vCYPnCJwaZB1 --------------030301020907070004050005-- enigmail-2.0.8/package/tests/resources/encrypted-email.eml000066400000000000000000000124561334302754500236540ustar00rootroot00000000000000Delivered-To: strike.devtest@gmail.com Received: by 10.31.65.206 with SMTP id o197csp1210819vka; Tue, 9 Jun 2015 14:43:46 -0700 (PDT) X-Received: by 10.170.150.7 with SMTP id r7mr28138075ykc.48.1433886226901; Tue, 09 Jun 2015 14:43:46 -0700 (PDT) Return-Path: Received: from mail-yh0-f51.google.com (mail-yh0-f51.google.com. [209.85.213.51]) by mx.google.com with ESMTPS id w5si3065379yhn.169.2015.06.09.14.43.46 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 09 Jun 2015 14:43:46 -0700 (PDT) Received-SPF: pass (google.com: domain of ipazmino@thoughtworks.com designates 209.85.213.51 as permitted sender) client-ip=209.85.213.51; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ipazmino@thoughtworks.com designates 209.85.213.51 as permitted sender) smtp.mail=ipazmino@thoughtworks.com Received: by mail-yh0-f51.google.com with SMTP id n67so11377426yha.3 for ; Tue, 09 Jun 2015 14:43:46 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:date:from:user-agent:mime-version:to :subject:content-type:content-transfer-encoding; bh=AermomlQzalDA9CuGKCBD4p7rP2ZQS2Zg0e1SUiY8qQ=; b=fOYbw+EF4vbNqfBSvvtC5s7bEd0kYimeTSKt+i8BkbbX4yxAvuZ1wTDXaSCgRd5qOm Kselu97ROnTLQbfOzrIgeUrKejArqfLQAAtITjkRtnSV8GMG5/WEVymno5pwEggxpwXb Ay306n+XOYYxYhAmdHi2tsk1FinFrwLOkDzskn0+iMdU5gwhVUQ7ev2OK0zQkr5E6yt5 RiVOIm2Jv7dOnkjB8weTIHwU9gDtcwHzCfzESZzdIHG6KeMIymaVFAjXRDH3WQjJjIye kjALl6ZB9Hg9xRIi8elzOMdKVQxzisGZAt0fyj0EOhTUSWc0CBVGwVSGMdXlX3KulUM3 bQKw== X-Gm-Message-State: ALoCoQlV/pZ0hMv+z935EHT9GOjCBMSyqOygMtRxMQ6lfoWHj45+E00QbbOWqX1xjoDKy8vlz2Ah X-Received: by 10.129.138.2 with SMTP id a2mr25624689ywg.149.1433886226643; Tue, 09 Jun 2015 14:43:46 -0700 (PDT) Return-Path: Received: from iapazmino.local ([181.198.81.194]) by mx.google.com with ESMTPSA id x185sm5097578ywf.44.2015.06.09.14.43.45 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 09 Jun 2015 14:43:46 -0700 (PDT) Message-ID: <55775E11.6090701@thoughtworks.com> Date: Tue, 09 Jun 2015 16:43:45 -0500 From: =?UTF-8?B?SXbDoW4gUGF6bWnDsW8=?= User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:31.0) Gecko/20100101 Thunderbird/31.7.0 MIME-Version: 1.0 To: Fan Jiang Subject: Encrypted email Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit -----BEGIN PGP MESSAGE----- Charset: utf-8 Version: GnuPG/MacGPG2 v2.0.22 (Darwin) Comment: GPGTools - https://gpgtools.org hQIMA9U1Yju2Dp5xAQ//ZKsVVDPBo/3swHQ5+97Rx9ASldxUTG8acN8gPYEGJ15s Jxmigu9Xy4aVad9T4GoGm7r8hfOGjeLu98RfSMt03X0nQCTqjo8epp/Lpx8TTCDS 5VexXsucQkJu55DtzI/ZM0GDb5JW19ONBt8+mYjgPputgOaqG8yETsYblDLlbZjo SE650TvcUmjCm+DRnymzvTJlM8WWRLNs2WwzHdaam/IDPoKggwBUK8mbvI5/+w1Y qFOlet+Feou/4VuN11e+IXT5cJnT8Gwb1hyYij+/CAAfyNeYAf2i8BaMh0LXG7ds 9pFz34whDOjAl4PK6AskTpmrhMcVviesVxa8ayvydxc5IkGvtypGY1M4SITvJLop 3Bdv0Chp8fy1RRGQCBwbIa+t67rL9Nl2LZvwo5Fpvj86iI6EqEG9BsJ8wsNgWbNN v85Iju3DEcz/pqhsr0gzw+xaUv3KDVMW8gGPDkRpHfWik1alL+Lcevu66C9ZodsO OOIJVCqXIsftagVjvPq3LFZCIEdF2Mm5wagD11ByZIrL/xlaeV+3Myengfbyg4O9 Oq8kmr7itGA3TmtVyeGsr81G1q9f2ZtlRiYIHzZOl0rgOLKq0gWm9nP1o65C3qyG Q3kixhkEYcfsLrUA8jbC0f92d7IrwfbQgv7i0+KexvlAHhMuOzkwE6WvFb7vtD2F AgwD4vk09TV2dzQBEADBVjJlctRTRryzoTMiZUFjKXXz1QuTdhgtxITdctQzh/MZ FLoUEBxyhVgRyLygRNIipy1g4jYWzB4ZkUa6Bn+HXxHBakmkMbWa4XnsXOdCDzU3 TYzKo8bnxBnod06A39F0S4CQ1EfEWKe+gcac2GoEVf0+eOSPxs2LEs6/pqLCOL3y XWkVeQPYaqlFMEst9D+7MDZwmpLarNpsHeV5xgrxWootaC99i3uUDcuuxzMEJfuq 0jvLPvTnSe1DJsL+de+bWRd+CC46blY9GOsMEPDU95+yMT66IW5CriBaszq9/0vT 88GV42KyZ/pzJ6n7sn4FYq5XHdkZDnbVpXJT36REt7QRiEDZExVdu5ofFrh7wf3b M9gxSqB6Y/XuLfUx4TadCmXpbEH1iypakOf8ltGcSWf/CC059jB7NX0v5Nhh2wK9 MnSMP6qOWvrnLxU8RR7S8ZjrisZYUKkKBrB9W0lq3cBjgjcwIhTnHITQEkNojVjB dYGmzlTUYM/y17Qi+m75ADVD2ZdHZ5/XjmM/c5kWTbO9WzMIFBexAEoPlroTweQU iM31j5iPWZWeBl+d26h+/6sYYnCZS50o32fLhmYIBv4lSs/AUex4V/VVeGdTyruW iwJkzC1Ztm0GD0RptqIraiEgQ8VzDecoS0VSLs2i2cOEhMhrXBHGXPf/HHiQc9Lp ASgrin2gjG15X0YgCBbfdVau9AJbab8Vx2q9H39qfC8kfj0hq2yzykVLphkbmDH8 K2qwPC/EKScKAp41O7duUnkEPKZDQl0Zg3Z4trupQX3ddTserb8osQm5iH+H7Y28 HO2bLb6tzApT8UyLSb45cTjceLRItsQpPHckWsJ0U7PzZrKob5mOEkj3M7bUCxg5 2JeHUNIahLQPMoXxdYQyB0o7I30/N315509A0cU6+M07VuoWmtGpFFY4qf1GAfLu je+IpUDOWm7Jr703JxXRqkaGvi7oHlDYOLKMQao7Pd4ExHlpRUErzBsduWLllO3j DHi0EYUxwkiCA5pqsSaspNJMTbUwAfNx7Badm6sW7KAfdvfwyFpBZUQy/g2GwCKm 32w9q3Gyrn3fSY5rpLRE63gQDcQxowE4jlNB0nu8VCsEdV1PRVo4pRQZWhOgezEf lNx2Cx6X9fvvQGlS88pQEig14sC2foO7BGyNdR931EZbeBbEO88OYu0MKaQt0kPj qAiZCAdrMedYFpeBjOYr8VwTuxXjtxdeCBUy5X4oHiz6AGAVxve1UP0pJfRy57Q/ CEnd8avVxfS5oQuUhjddx/duBTWzJ6HwynMqzIPXDVeMzAtc193WxFxm5oPXhbVV LzGa866hHbtBBsDUEnNxe/fPU8ZDQAcKqKmqdlK3pyjAGgumP4kuje+kjZCHeqzY V6cPJ9MblBHRzc0ruIy2tKOXkCx2XyGt2c7slatLSdsoE9aATN60d0/HoVL5RxUn YXC0rz/+VTBq+tYe6y7VbXnD9eJZznvBqaLbF3i7RD5thgJeevQTL2L3OqkozfQB 35YgnjdPRqCihuBLOMyplB/efy8KYDxmkUEyROgOIncmr/gxMiEz8SLU0OCXCwMg eO+ITTSXWeBMiSxrxeKHeR/OShe6OpRGbntWU1VXo/Gt9CBL3RFv9Ey6Ys1s9w9h TR5bLU7vrpRAmRve =YK4P -----END PGP MESSAGE----- enigmail-2.0.8/package/tests/resources/notaperson.asc000066400000000000000000000032521334302754500227450ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2 mQENBFdGI98BCACpdg8THYnpcUzCSDnRb3VryidfSge/OXMIdp4gfoout3/Bwpyq UGJsHklUVnvg6augYXXyBOkcJrmbxNKYt5Nba5wcnwmryTwxzsJEfTlY9OJJ3g/y U4y7xvFKTPdUGOCdxYaQ9nQI9ENpDAQ5vbPPhEhpt2ZerrqPmHd2qbN/VDcESuK4 TRYetcIj9517dzrhD/OuVkpV9tAN0kNgO0FXitDHO0ECmy8m1ZdDIJLERPW24Xjt hT4tmvvwDXp/TbIjKunxbrjvGrp2Ku9da+/un+EuYwh8Nz65c1H6ZEy6+MYkfxlr CLiVyR3w13hAAIJo4BHVsJ/I1EWGXhd6EzSHABEBAAG0JW5vdCBhIHBlcnNvbiA8 bm90YXBlcnNvbkBub3QuYXBlcnNvbj6JATcEEwEIACEFAldGI98CGwMFCwkIBwIG FQgJCgsCBBYCAwECHgECF4AACgkQikEeKKBW4qMeZAf/f618aVSaZrx3OM502ikg 3B4IsVnZcr4YJqYr15uIZ8edtFfU1cdevKMcRLCw5xx7AkUoTUYn04icisFVsw2s 0n+/AdR0VLSCT6HweD+C50W7LLHpwqbniC0dy0qzb5JpqvMJZgceRqnay1J4+97v 1u/mtGsniwV4ow7DT5kBQNZhUR68qjl/4XW/ONALvdUTPihgARDqulB37frXT8ig tD8T3eN+FloI/xykSdoNQ9szaJzjj9dsXlA531ZLjAB7Kr1rxhbQehNg3qrzlXlX GMI4nwcxH6pU7DSykstoe2GLeV+Iint7wHt54eu8rbKooygVEKz3+1Cp6DNGKJ97 f7kBDQRXRiPfAQgAzgXa86ciIVVGj1IsfWQvSZ2Z5EWbKu3mijPOivrOKyG0EbaW hL5moj09JSoIweR4ZE8eixWNL9vnNpzVo65NrJXyKBBXBU6nwaLUT5pTnIqe1Vl5 wbu1MPY+smTI9LybJFPKd5McA2kusN1EMhoovhFj797LY+48JF6c3dDH7KDQNL0s S17k8ggvYPhHqMxYh/29ec24tySL1RN6ZIAe1qckBSQbJ75qXOXBzNSXsPgtgCwZ B0aSXMsQy7vQwVmz3cB2NwDS7PLfb64dABrc+XMTp7gn9PNrYh98+/Xp7famQkrX 4SPPCYYXQvdv+D/3frxnwx+5AjtTlqqk/H9wzQARAQABiQEfBBgBCAAJBQJXRiPf AhsMAAoJEIpBHiigVuKjSn0H/19Wd5IQRXV2jCQWoC/JhIqYExNNgXZldWceElrz s80O9BYEZqzPGUFlFZ7JiWH2uZ8Z4xCbjQIa0LnyWradobl+1YWsE4faPJQNZ609 sopyclZlIHuQAdJsld0XML564gNYY/Cac6jyrgtwgB860+2hOyiD8oGU5bQKU0v6 +ADT6upPPWLlFHgcJbaSUm3OJ6bYUCM0A82FhQbuhS+BE9kL54yguRkAjdz7212T 9OIfHrBoZ4dx+WqYISYWeSZy94qd+WSUjtzIB2Piv3DyNlBB7hkMxXBUwui0vqsI 93ISStzk9gHm4dmjrMfDwtNYKSPAE7mVJyokghsLa8hgAqM= =yT8r -----END PGP PUBLIC KEY BLOCK----- enigmail-2.0.8/package/tests/resources/pub-keys.asc000066400000000000000000000116371334302754500223220ustar00rootroot00000000000000# test keylist as it could be returned from GPG # - Rows starting with # and empty rows are ignored # - Rows: Validity: q, Key ...0001, creation date, no expiratuon date, owner trust, user id, # # standard trust db entry: tru::1:1443339321:1451577200:3:1:5 # Key with full validity: pub:f:4096:1:0003AAAA00010001:1347189683:1473420083:::::escaESCA: fpr:::::::::CCCCCCCCCCCCCCCCCCCCCCCC0003AAAA00010001: uid:f::::1347189683::CCCCCCCCCCCCCCCCCCCCCCCC0003AAAA00010002::Validity full Key : # Key without encryption ability (no 'E'): pub:f:4096:1:0004AAAA00010001:1347189683:1473420083:::::scaSCA: fpr:::::::::CCCCCCCCCCCCCCCCCCCCCCCC0004AAAA00010001: uid:f::::1347189683::CCCCCCCCCCCCCCCCCCCCCCCC0004AAAA00010002::No encryption Key : # Disabled Key (key with 'D'): pub:f:4096:1:0005AAAA00010001:1347189683:1473420083:::::scaESCAD: fpr:::::::::CCCCCCCCCCCCCCCCCCCCCCCC0005AAAA00010001: uid:f::::1347189683::CCCCCCCCCCCCCCCCCCCCCCCC0005AAAA00010002::No encryption Key : # User with multiple keys (one fully trusted: 0030AAAA00020001): # Validity: o pub:o:4096:1:0030AAAA00010001:1347189683:1473420083:::::escaESCA: fpr:::::::::CCCCCCCCCCCCCCCCCCCCCCCC0030AAAA00010001: uid:o::::1347189683::CCCCCCCCCCCCCCCCCCCCCCCC0030AAAA00010002::Multiple validity onefull Key1 : # Validity: f pub:f:4096:1:0030AAAA00020001:1347189683:1473420083:::::escaESCA: fpr:::::::::CCCCCCCCCCCCCCCCCCCCCCCC0030AAAA00020001: uid:f::::1347189683::CCCCCCCCCCCCCCCCCCCCCCCC0030AAAA00020002::Multiple validity onefull Key2 : # Validity: q pub:q:4096:1:0030AAAA00030001:1347189683:1473420083:::::escaESCA: fpr:::::::::CCCCCCCCCCCCCCCCCCCCCCCC0030AAAA00030001: uid:q::::1347189683::CCCCCCCCCCCCCCCCCCCCCCCC0030AAAA00030002::Multiple validity onefull Key3 : # User with multiple keys (multiple fully trusted: 0030AAAA00020001): # Validity: o pub:o:4096:1:0034AAAA00010001:1347189683:1473420083:::::escaESCA: fpr:::::::::CCCCCCCCCCCCCCCCCCCCCCCC0034AAAA00010001: uid:o::::1347189683::CCCCCCCCCCCCCCCCCCCCCCCC0034AAAA00010002::Multiple validity twofull Key1 : # Validity: f pub:f:4096:1:0034AAAA00020001:1347189683:1473420083:::::escaESCA: fpr:::::::::CCCCCCCCCCCCCCCCCCCCCCCC0034AAAA00020001: uid:f::::1347189683::CCCCCCCCCCCCCCCCCCCCCCCC0034AAAA00020002::Multiple validity twofull Key2 : # Validity: f pub:f:4096:1:0034AAAA00030001:1347189683:1473420083:::::escaESCA: fpr:::::::::CCCCCCCCCCCCCCCCCCCCCCCC0034AAAA00030001: uid:f::::1347189683::CCCCCCCCCCCCCCCCCCCCCCCC0034AAAA00030002::Multiple validity twofull Key3 : # User with multiple keys (one marginal trusted): # Validity: o pub:o:4096:1:0031AAAA00010001:1388513885:1546188604:::::escaESCA: fpr:::::::::AAAAAAAAAAAAAAAAAAAAAAAA0031AAAA00010001: uid:o::::1389038412::AAAAAAAAAAAAAAAAAAAAAAAA0031AAAA00010002::Multiple validity nofull Key1 : # Validity: m pub:m:4096:1:0031AAAA00020001:1388513885:1546188604:::::escaESCA: fpr:::::::::AAAAAAAAAAAAAAAAAAAAAAAA0031AAAA00020001: uid:m::::1389038412::AAAAAAAAAAAAAAAAAAAAAAAA0031AAAA00020002::Multiple validity nofull Key2 : # Validity: q pub:q:4096:1:0031AAAA00030001:1388513885:1546188604:::::escaESCA: fpr:::::::::AAAAAAAAAAAAAAAAAAAAAAAA0031AAAA00030001: uid:q::::1389038412::AAAAAAAAAAAAAAAAAAAAAAAA0031AAAA00030002::Multiple validity nofull Key3 : # User with multiple keys (all have same trust kevel): # Validity: - pub:-:4096:1:0032AAAA00010001:1388513885:1546188604:::::escaESCA: fpr:::::::::AAAAAAAAAAAAAAAAAAAAAAAA0032AAAA00010001: uid:-::::1389038412::AAAAAAAAAAAAAAAAAAAAAAAA0032AAAA00010002::Multiple validity sametrust Key1 : # Validity: - pub:-:4096:1:0032AAAA00020001:1388513885:1546188604:::::escaESCA: fpr:::::::::AAAAAAAAAAAAAAAAAAAAAAAA0032AAAA00020001: uid:-::::1389038412::AAAAAAAAAAAAAAAAAAAAAAAA0032AAAA00020002::Multiple validity sametrust Key2 : # Validity: - pub:-:4096:1:0032AAAA00030001:1388513885:1546188604:::::escaESCA: fpr:::::::::AAAAAAAAAAAAAAAAAAAAAAAA0032AAAA00030001: uid:-::::1389038412::AAAAAAAAAAAAAAAAAAAAAAAA0032AAAA00030002::Multiple validity sametrust Key3 : # some key with subkey that encrypts: pub:q:4096:1:0040EEEE00010001:1421506625:1736866738::-:::scESC: fpr:::::::::EEEEEEEEEEEEEEEEEEEEEEEE0040EEEE00010001: uid:q::::1421507378::EEEEEEEEEEEEEEEEEEEEEEEE0040EEEE00010002::Some key with subkey UID1 : uid:q::::1421507365::EEEEEEEEEEEEEEEEEEEEEEEE0040EEEE00010003::Some key with subkey UID2 : uat:q::::1421507304::EEEEEEEEEEEEEEEEEEEEEEEE0040EEEE00010004::1 13273: sub:q:4096:1:0040EEEE00010005:1421506625:1516114625:::::e: enigmail-2.0.8/package/tests/resources/rules.xml000066400000000000000000000006661334302754500217470ustar00rootroot00000000000000 enigmail-2.0.8/package/tests/resources/rules2.xml000066400000000000000000000032571334302754500220300ustar00rootroot00000000000000 enigmail-2.0.8/package/tests/rng-test.js000066400000000000000000000013631334302754500201550ustar00rootroot00000000000000/* global test: false, do_load_module: false, do_get_cwd: false */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); testing("rng.jsm"); /*global EnigmailRNG: false, testing: false, Assert: false, bytesToUInt: false */ test(function getDifferentUint32() { Assert.notEqual(EnigmailRNG.generateRandomUint32(), EnigmailRNG.generateRandomUint32()); Assert.notEqual(EnigmailRNG.generateRandomString(15), EnigmailRNG.generateRandomString(15)); Assert.equal(EnigmailRNG.generateRandomString(15).length, 15); }); enigmail-2.0.8/package/tests/rules-test.js000066400000000000000000000377461334302754500205370ustar00rootroot00000000000000/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, EnigmailApp: false */ /*global component: false, withTestGpgHome: false, withEnigmail: false */ /*global EnigmailRules: false, rulesListHolder: false, EC: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); testing("rules.jsm"); component("enigmail/keyRing.jsm"); /*global EnigmailKeyRing: false */ // getRulesFile test(function getRulesFileReturnsTheFile() { EnigmailRules.clearRules(); let profD = EnigmailApp.getProfileDirectory().clone(); profD.append("pgprules.xml"); Assert.equal(profD.path, EnigmailRules.getRulesFile().path); }); // loadRulesFile test(function loadRulesFileReturnsFalseIfNoRulesFileExists() { EnigmailRules.clearRules(); var result = EnigmailRules.loadRulesFile(); Assert.ok(!result); }); test(function loadRulesFileReturnsFalseIfTheFileExistsButIsEmpty() { EnigmailRules.clearRules(); resetting(EnigmailRules, 'getRulesFile', function() { return do_get_file("resources/emptyRules.xml", false); }, function() { var result = EnigmailRules.loadRulesFile(); Assert.ok(!result); }); }); test(function loadRulesFileReturnsTrueIfTheFileExists() { EnigmailRules.clearRules(); resetting(EnigmailRules, 'getRulesFile', function() { return do_get_file("resources/rules.xml", false); }, function() { var result = EnigmailRules.loadRulesFile(); Assert.ok(result); }); }); function xmlToData(x) { var result = []; var node = x.firstChild.firstChild; while (node) { let name = node.tagName; let res = { tagName: name }; if (name) { let attrs = node.attributes; for (let i = 0; i < attrs.length; i++) { res[attrs[i].name] = attrs[i].value; } result.push(res); } node = node.nextSibling; } return result; } test(function loadRulesFileSetsRulesBasedOnTheFile() { EnigmailRules.clearRules(); resetting(EnigmailRules, 'getRulesFile', function() { return do_get_file("resources/rules.xml", false); }, function() { EnigmailRules.loadRulesFile(); var d = xmlToData(rulesListHolder.rulesList); var expected = [{ tagName: "pgpRule", email: "{user1@some.domain}", keyId: "0x1234ABCD", sign: "1", encrypt: "1", pgpMime: "1" }, { tagName: "pgpRule", email: "user2@some.domain", keyId: "0x1234ABCE", sign: "2", encrypt: "1", pgpMime: "0" }]; Assert.deepEqual(expected, d); }); }); // getRulesData test(function getRulesDataReturnsFalseAndNullIfNoRulesExist() { EnigmailRules.clearRules(); var res = {}; var ret = EnigmailRules.getRulesData(res); Assert.ok(!ret); Assert.equal(null, res.value); }); test(function getRulesDataReturnsTrueAndTheRulesListIfExist() { EnigmailRules.clearRules(); resetting(EnigmailRules, 'getRulesFile', function() { return do_get_file("resources/rules.xml", false); }, function() { var res = {}; var ret = EnigmailRules.getRulesData(res); Assert.ok(ret); Assert.equal(rulesListHolder.rulesList, res.value); }); }); // ***************************************************** // test mapAddrsToKeys(): // ***************************************************** var EnigmailRulesTests = { testSingleEmailToKeys(addr, arg2, arg3) { // second argument is optional (extracted addr from initial addr) let expVal; let expAddr; if (typeof(arg3) === 'undefined') { expAddr = addr; expVal = arg2; } else { expAddr = arg2; expVal = arg3; } // perform test: let matchedKeysRet = {}; let flagsRet = {}; let ret = EnigmailRules.mapAddrsToKeys(addr, false, null, matchedKeysRet, flagsRet); Assert.ok(ret); let expKL = [{ orig: addr, addr: expAddr, keys: expVal }]; Assert.deepEqual(matchedKeysRet.addrKeysList, expKL); Assert.equal(matchedKeysRet.value, expVal); } }; test(withTestGpgHome(withEnigmail(function mapAddrsToKeys_simpleFlags() { importKeys(); EnigmailRules.clearRules(); resetting(EnigmailRules, 'getRulesFile', function() { return do_get_file("resources/rules2.xml", false); }, function() { EnigmailRules.loadRulesFile(); let matchedKeysRet = {}; let flagsRet = {}; EnigmailRules.mapAddrsToKeys("sign@some.domain", false, null, matchedKeysRet, flagsRet); let expectedFlags = { value: true, sign: "2", encrypt: "1", pgpMime: "1" }; Assert.deepEqual(expectedFlags, flagsRet); EnigmailRules.mapAddrsToKeys("nosign@some.domain", false, null, matchedKeysRet, flagsRet); expectedFlags = { value: true, sign: "0", encrypt: "1", pgpMime: "1" }; Assert.deepEqual(expectedFlags, flagsRet); EnigmailRules.mapAddrsToKeys("encrypt@some.domain", false, null, matchedKeysRet, flagsRet); expectedFlags = { value: true, sign: "1", encrypt: "2", pgpMime: "1" }; Assert.deepEqual(expectedFlags, flagsRet); EnigmailRules.mapAddrsToKeys("noencrypt@some.domain", false, null, matchedKeysRet, flagsRet); expectedFlags = { value: true, sign: "1", encrypt: "0", pgpMime: "1" }; Assert.deepEqual(expectedFlags, flagsRet); }); }))); test(withEnigmail(function mapAddrsToKeys_signAndEncrypt() { EnigmailRules.clearRules(); resetting(EnigmailRules, 'getRulesFile', function() { return do_get_file("resources/rules2.xml", false); }, function() { EnigmailRules.loadRulesFile(); let emailAddrs = "sign@some.domain, encrypt@some.domain"; let matchedKeysRet = {}; let flagsRet = {}; let ret = EnigmailRules.mapAddrsToKeys(emailAddrs, false, null, matchedKeysRet, flagsRet); let expectedFlags = { value: true, sign: "2", encrypt: "2", pgpMime: "1" }; let expectedKeys = { value: "", // no matching key means no value addrKeysList: [], addrNoKeyList: [{ orig: "sign@some.domain", addr: "sign@some.domain" }, { orig: "encrypt@some.domain", addr: "encrypt@some.domain" }] }; Assert.ok(ret); Assert.deepEqual(expectedFlags, flagsRet); Assert.deepEqual(expectedKeys, matchedKeysRet); }); })); test(withEnigmail(function mapAddrsToKeys_conflict() { EnigmailRules.clearRules(); resetting(EnigmailRules, 'getRulesFile', function() { return do_get_file("resources/rules2.xml", false); }, function() { EnigmailRules.loadRulesFile(); let emailAddrs = "sign@some.domain, noencrypt@some.domain, nosign@some.domain, encrypt@some.domain"; let matchedKeysRet = {}; let flagsRet = {}; let ret = EnigmailRules.mapAddrsToKeys(emailAddrs, false, null, matchedKeysRet, flagsRet); let expectedFlags = { value: true, sign: "99", encrypt: "99", pgpMime: "1" }; let expectedKeys = { value: "", // no matching key means no value addrKeysList: [], addrNoKeyList: [{ orig: "sign@some.domain", addr: "sign@some.domain" }, { orig: "noencrypt@some.domain", addr: "noencrypt@some.domain" }, { orig: "nosign@some.domain", addr: "nosign@some.domain" }, { orig: "encrypt@some.domain", addr: "encrypt@some.domain" }] }; Assert.ok(ret); Assert.deepEqual(expectedFlags, flagsRet); Assert.deepEqual(expectedKeys, matchedKeysRet); }); })); test(withEnigmail(function mapAddrsToKeys_twoKeysAndNoKey() { EnigmailRules.clearRules(); resetting(EnigmailRules, 'getRulesFile', function() { return do_get_file("resources/rules2.xml", false); }, function() { EnigmailRules.loadRulesFile(); let emailAddrs = "two@some.domain, nokey@qqq.domain"; let matchedKeysRet = {}; let flagsRet = {}; let ret = EnigmailRules.mapAddrsToKeys(emailAddrs, false, null, matchedKeysRet, flagsRet); let expectedFlags = { value: true, sign: "1", encrypt: "1", pgpMime: "1" }; let expectedKeys = { value: "0x2222aaaa, 0x2222bbbb, nokey@qqq.domain", addrKeysList: [{ orig: "two@some.domain", addr: "two@some.domain", keys: "0x2222aaaa, 0x2222bbbb" }], addrNoKeyList: [{ orig: "nokey@qqq.domain", addr: "nokey@qqq.domain" }] }; Assert.ok(ret); Assert.deepEqual(expectedFlags, flagsRet); Assert.deepEqual(expectedKeys, matchedKeysRet); }); })); test(withEnigmail(function mapAddrsToKeys_noKeyAndSomeKeysReverse() { // important to test reverse order than in rules EnigmailRules.clearRules(); resetting(EnigmailRules, 'getRulesFile', function() { return do_get_file("resources/rules2.xml", false); }, function() { EnigmailRules.loadRulesFile(); let emailAddrs = "nokey@qqq.domain, two@some.domain, one@some.domain"; let matchedKeysRet = {}; let flagsRet = {}; let ret = EnigmailRules.mapAddrsToKeys(emailAddrs, false, null, matchedKeysRet, flagsRet); let expectedFlags = { value: true, sign: "1", encrypt: "1", pgpMime: "1" }; let expectedKeys = { value: "0x11111111, 0x2222aaaa, 0x2222bbbb, nokey@qqq.domain", addrKeysList: [{ orig: "one@some.domain", addr: "one@some.domain", keys: "0x11111111" }, { orig: "two@some.domain", addr: "two@some.domain", keys: "0x2222aaaa, 0x2222bbbb" }], addrNoKeyList: [{ orig: "nokey@qqq.domain", addr: "nokey@qqq.domain" }] }; Assert.ok(ret); Assert.deepEqual(expectedFlags, flagsRet); Assert.deepEqual(expectedKeys, matchedKeysRet); }); })); test(withEnigmail(function mapAddrsToKeys_spaces() { EnigmailRules.clearRules(); resetting(EnigmailRules, 'getRulesFile', function() { return do_get_file("resources/rules2.xml", false); }, function() { EnigmailRules.loadRulesFile(); let emailAddrs = " ,,oneRule,;;; , ;"; let matchedKeysRet = {}; let flagsRet = {}; let ret = EnigmailRules.mapAddrsToKeys(emailAddrs, false, null, matchedKeysRet, flagsRet); let expectedFlags = { value: true, sign: "1", encrypt: "1", pgpMime: "1" }; let expectedKeys = { value: "", addrKeysList: [], addrNoKeyList: [{ orig: "oneRule", addr: "onerule" }] }; Assert.ok(ret); Assert.deepEqual(expectedFlags, flagsRet); Assert.deepEqual(expectedKeys, matchedKeysRet); }); })); test(withEnigmail(function mapAddrsToKeys_manyKeys() { EnigmailRules.clearRules(); resetting(EnigmailRules, 'getRulesFile', function() { return do_get_file("resources/rules2.xml", false); }, function() { EnigmailRules.loadRulesFile(); let emailAddrs = "one@some.domain, two@some.domain, nokey@qqq.domain, nosign@some.domain, nofurtherrules@some.domain, nofurtherrules2@some.domain"; let matchedKeysRet = {}; let flagsRet = {}; let ret = EnigmailRules.mapAddrsToKeys(emailAddrs, false, null, matchedKeysRet, flagsRet); let expectedFlags = { value: true, sign: "0", encrypt: "1", pgpMime: "99" }; let expectedKeys = { value: "0x11111111, 0x2222aaaa, 0x2222bbbb, nofurtherrules@some.domain, nofurtherrules2@some.domain, nokey@qqq.domain, nosign@some.domain", addrKeysList: [{ orig: "one@some.domain", addr: "one@some.domain", keys: "0x11111111" }, { orig: "two@some.domain", addr: "two@some.domain", keys: "0x2222aaaa, 0x2222bbbb" }], addrNoKeyList: [{ orig: "nofurtherrules@some.domain", addr: "nofurtherrules@some.domain" }, { orig: "nofurtherrules2@some.domain", addr: "nofurtherrules2@some.domain" }, { orig: "nokey@qqq.domain", addr: "nokey@qqq.domain" }, { orig: "nosign@some.domain", addr: "nosign@some.domain" }] }; Assert.ok(ret); Assert.deepEqual(expectedFlags, flagsRet); Assert.deepEqual(expectedKeys, matchedKeysRet); Assert.deepEqual(expectedKeys.value, matchedKeysRet.value); Assert.deepEqual(expectedKeys.addrKeysList, matchedKeysRet.addrKeysList); Assert.deepEqual(expectedKeys.addrNoKeyList, matchedKeysRet.addrNoKeyList); }); })); test(withEnigmail(function mapAddrsToKeys_multipleMatches() { EnigmailRules.clearRules(); resetting(EnigmailRules, 'getRulesFile', function() { return do_get_file("resources/rules2.xml", false); }, function() { EnigmailRules.loadRulesFile(); let emailAddrs = "one@some.domain, nico@xx.com, patrick@xx.com, one@some.domain"; let matchedKeysRet = {}; let flagsRet = {}; let ret = EnigmailRules.mapAddrsToKeys(emailAddrs, false, null, matchedKeysRet, flagsRet); let expectedFlags = { value: true, sign: "1", encrypt: "1", pgpMime: "1" }; let expectedKeys = { value: "0x11111111, 0x11111111, 0xDOTCOMORDOTDE, 0xDOTCOMORDOTDE", addrKeysList: [{ orig: "one@some.domain", addr: "one@some.domain", keys: "0x11111111" }, { orig: "one@some.domain", addr: "one@some.domain", keys: "0x11111111" }, { orig: "nico@xx.com", addr: "nico@xx.com", keys: "0xDOTCOMORDOTDE" }, { orig: "patrick@xx.com", addr: "patrick@xx.com", keys: "0xDOTCOMORDOTDE" }], addrNoKeyList: [] }; Assert.ok(ret); Assert.deepEqual(expectedFlags, flagsRet); Assert.deepEqual(expectedKeys, matchedKeysRet); //Assert.deepEqual(expectedKeys.value, matchedKeysRet.value); //Assert.deepEqual(expectedKeys.addrNoKeyList, matchedKeysRet.addrNoKeyList); //Assert.deepEqual(expectedKeys.addrKeysList, matchedKeysRet.addrKeysList); //Assert.deepEqual(expectedKeys.addrKeysList[0], matchedKeysRet.addrKeysList[0]); //Assert.deepEqual(expectedKeys.addrKeysList[1], matchedKeysRet.addrKeysList[1]); //Assert.deepEqual(expectedKeys.addrKeysList[2], matchedKeysRet.addrKeysList[2]); //Assert.deepEqual(expectedKeys.addrKeysList[3], matchedKeysRet.addrKeysList[3]); }); })); test(withEnigmail(function mapAddrsToKeys_infix() { EnigmailRules.clearRules(); resetting(EnigmailRules, 'getRulesFile', function() { return do_get_file("resources/rules2.xml", false); }, function() { EnigmailRules.loadRulesFile(); EnigmailRulesTests.testSingleEmailToKeys("company@suffix.qqq", "0xCOMPREFIX"); EnigmailRulesTests.testSingleEmailToKeys("hello@computer.qqq", "0xCOMINFIX"); EnigmailRulesTests.testSingleEmailToKeys("hello@komputer.dcom", "0xCOMSUFFIX"); EnigmailRulesTests.testSingleEmailToKeys("company@postfix.dcom", "0xCOMSUFFIX"); EnigmailRulesTests.testSingleEmailToKeys("company@postfix.com", "0xDOTCOMORDOTDE"); EnigmailRulesTests.testSingleEmailToKeys("hello@komputer.de", "0xDOTCOMORDOTDE"); EnigmailRulesTests.testSingleEmailToKeys("aa@qqq.domain", "0xAAAAAAAA, 0xBBBBBBBB"); EnigmailRulesTests.testSingleEmailToKeys("xx@qqq.bb", "0xAAAAAAAA, 0xBBBBBBBB"); EnigmailRulesTests.testSingleEmailToKeys("aa@qqq.bb", "0xAAAAAAAA, 0xBBBBBBBB"); EnigmailRulesTests.testSingleEmailToKeys("hello@komputer.DE", "hello@komputer.de", "0xDOTCOMORDOTDE"); EnigmailRulesTests.testSingleEmailToKeys("xx@qqq.BB", "xx@qqq.bb", "0xAAAAAAAA, 0xBBBBBBBB"); }); })); function importKeys() { var publicKey = do_get_file("resources/dev-strike.asc", false); //var secretKey = do_get_file("resources/dev-strike.sec", false); var errorMsgObj = {}; var importedKeysObj = {}; var publicImportResult = EnigmailKeyRing.importKeyFromFile(publicKey, errorMsgObj, importedKeysObj); // var secretImportResult = EnigmailKeyRing.importKeyFromFile(secretKey, errorMsgObj, importedKeysObj); return [publicImportResult /*, secretImportResult */ ]; } enigmail-2.0.8/package/tests/streams-test.js000066400000000000000000000041301334302754500210400ustar00rootroot00000000000000/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false, component: false */ /*global Components: false, EnigmailCore: false, Cc: false, Ci: false, EnigmailFiles: false, EnigmailLog: false, EnigmailPrefs: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); testing("streams.jsm"); /*global EnigmailStreams: false */ component("enigmail/files.jsm"); function makeURI(aURL, aOriginCharset, aBaseURI) { var ioService = Components.classes["@mozilla.org/network/io-service;1"] .getService(Components.interfaces.nsIIOService); return ioService.newURI(aURL, aOriginCharset, aBaseURI); } // testing: newStringChannel test(function stringChannelTest() { var testString = "Hello world"; let uri = makeURI("dummy:none"); var ch = EnigmailStreams.newStringChannel(uri, "text/plain", "UTF-8", testString); do_test_pending(); var stringListener = EnigmailStreams.newStringStreamListener( function compareResults(gotData) { Assert.equal(testString, gotData); do_test_finished(); } ); ch.asyncOpen(stringListener, null); }); // testing: newFileChannel test(function readFileChannel() { var md = do_get_cwd().clone(); md.append("file-test.txt"); var testString = "Hello world\n \x00what's next"; EnigmailFiles.writeFileContents(md, testString, null); let uri = makeURI("dummy:none"); var ch = EnigmailStreams.newFileChannel(uri, md, "application/octet-stream", true); do_test_pending(); var stringListener = EnigmailStreams.newStringStreamListener( function compareResults(gotData) { Assert.equal(testString, gotData); // Assert.equal(md.exists(), false, "file was deleted:"); do_test_finished(); } ); ch.asyncOpen(stringListener, null); }); enigmail-2.0.8/package/tests/system-test.js000066400000000000000000000034401334302754500207110ustar00rootroot00000000000000/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false */ /*global TestHelper: false, withEnvironment: false, nsIWindowsRegKey: true */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global TestHelper: false, withEnvironment: false, withEnigmail: false, component: false, withTestGpgHome: false, osUtils: false, unescape: false */ testing("system.jsm"); /*global EnigmailSystem: false, Cc: false, Ci: false */ component("enigmail/os.jsm"); /*global EnigmailOS: false */ function testEncoding(charset, from, to) { from = unescape(from); to = unescape(to); let result = EnigmailSystem.convertNativeToUnicode(from, charset); Assert.equal(result, to, "Charset=" + charset); } // Test functions simulating a Windows environment test(function shouldTestWindowsCharsetConversion() { EnigmailOS.isWin32 = true; testEncoding("65001", "%E3%82%B5%E3%83%9D%E3%83%BC%E3", "%u30B5%u30DD%u30FC"); testEncoding("20932", "%A7%B1%A7%E0%A7%D5%A7%D5%A7%D6", "%u041F%u043E%u0434%u0434%u0435"); }); // Test functions simulating a Unix environment test(function shouldTestUnixCharsetConversion() { EnigmailOS.isWin32 = false; let env = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment); let lc = env.set("LC_ALL", "ru_RU.UTF-8"); let cs = EnigmailSystem.determineSystemCharset(); Assert.equal(cs, "UTF-8"); testEncoding(cs, "%E3%82%B5%E3%83%9D%E3%83%BC%E3", "%u30B5%u30DD%u30FC"); }); enigmail-2.0.8/package/tests/testHelper.js000066400000000000000000000213131334302754500205260ustar00rootroot00000000000000/*global do_load_module: false, do_get_cwd: false, Components: false, Assert: false, CustomAssert: false, FileUtils: false, JSUnit: false, EnigmailFiles: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; const osUtils = {}; Components.utils.import("resource://gre/modules/osfile.jsm", osUtils); Components.utils.import("resource://gre/modules/FileUtils.jsm", osUtils); var TestHelper = { loadDirectly: function(name) { do_load_module("file://" + do_get_cwd().parent.path + "/" + name); }, loadModule: function(name) { Components.utils.import("resource://" + name); }, testing: function(name) { TestHelper.currentlyTesting = name; }, registerTest: function(fn) { TestHelper.allTests = TestHelper.allTests || []; TestHelper.allTests.push(fn); }, resetting: function(on, prop, val, f) { let orgVal = on[prop]; on[prop] = val; try { return f(); } finally { on[prop] = orgVal; } }, runTests: function() { if (TestHelper.currentlyTesting) { TestHelper.loadDirectly(TestHelper.currentlyTesting); } if (TestHelper.allTests) { for (var i = 0; i < TestHelper.allTests.length; i++) { TestHelper.allTests[i](); } } }, initalizeGpgHome: function() { component("enigmail/files.jsm"); var homedir = osUtils.OS.Path.join(EnigmailFiles.getTempDir(), ".gnupgTest"); var workingDirectory = new osUtils.FileUtils.File(homedir); if (!workingDirectory.exists()) { workingDirectory.create(Components.interfaces.nsIFile.DIRECTORY_TYPE, 448); } var file = workingDirectory.clone(); file.append("gpg-agent.conf"); if (!file.exists()) { file.createUnique(Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 384); } var s = "pinentry-program " + do_get_cwd().path.replace(/\\/g, "/") + "/pinentry-auto"; if (JSUnit.getOS() == "WINNT") { s += ".exe"; } s += "\n"; let encoder = new TextEncoder(); let array = encoder.encode(s); let inspector = Components.classes["@mozilla.org/jsinspector;1"].createInstance(Components.interfaces.nsIJSInspector); osUtils.OS.File.writeAtomic(file.path, array, {}).then(x => { inspector.exitNestedEventLoop(); }).catch(err => { inspector.exitNestedEventLoop(); }); inspector.enterNestedEventLoop(0); // wait for async process to terminate var environment = Components.classes["@mozilla.org/process/environment;1"].getService(Components.interfaces.nsIEnvironment); environment.set("GNUPGHOME", workingDirectory.path); return homedir; }, removeGpgHome: function(homedir) { var workingDirectory = new osUtils.FileUtils.File(homedir); try { if (workingDirectory.exists()) workingDirectory.remove(true); } catch (ex) { // do nothing about it } } }; TestHelper.loadDirectly("tests/customAssert.jsm"); var testing = TestHelper.testing; var component = TestHelper.loadModule; var run_test = TestHelper.runTests; var test = TestHelper.registerTest; var resetting = TestHelper.resetting; var initalizeGpgHome = TestHelper.initalizeGpgHome; var removeGpgHome = TestHelper.removeGpgHome; function withEnvironment(vals, f) { var environment = Components.classes["@mozilla.org/process/environment;1"].getService(Components.interfaces.nsIEnvironment); var oldVals = {}; for (let key in vals) { oldVals[key] = environment.get(key); environment.set(key, vals[key]); } try { return f(environment); } finally { for (let key in oldVals) { environment.set(key, oldVals[key]); } } } function withTestGpgHome(f) { return function() { const homedir = initalizeGpgHome(); try { f(); } finally { removeGpgHome(homedir); } }; } function withPreferences(func) { return function() { const keyRefreshPrefs = EnigmailPrefs.getPref("keyRefreshOn"); const keyserverPrefs = EnigmailPrefs.getPref("keyserver"); try { func(); } finally { EnigmailPrefs.setPref("keyRefreshOn", keyRefreshPrefs); EnigmailPrefs.setPref("keyserver", keyserverPrefs); } }; } /** * Create a test account called Enigmail Unit Test with 3 identities: * - user1@enigmail-test.net - uses a specific key ID * - user2@enigmail-test.net - determine key be Email addresses * - user3@enigmail-test.net - Enigmail disabled * - user4@enigmail-test.net - determine key be Email addresses */ function setupTestAccounts(primaryEmail = null, primaryKeyId = null) { const UNITTEST_ACCT_NAME = "Enigmail Unit Test"; const Cc = Components.classes; const Ci = Components.interfaces; // sanity check let accountManager = Cc["@mozilla.org/messenger/account-manager;1"].getService(Ci.nsIMsgAccountManager); function reportError() { return "Your profile is not set up correctly for Enigmail Unit Tests\n" + "Please ensure that your profile contains exactly one Account of type POP3.\n" + "The account name must be set to '" + UNITTEST_ACCT_NAME + "'.\n" + "Alternatively, you can simply delete all accounts except for the Local Folders\n"; } function setIdentityData(ac, idNumber, idName, fullName, email, useEnigmail, keyId) { let id; if (ac.identities.length < idNumber - 1) throw "error - cannot add Identity with gaps"; else if (ac.identities.length === idNumber - 1) { id = accountManager.createIdentity(); ac.addIdentity(id); } else { id = ac.identities.queryElementAt(idNumber - 1, Ci.nsIMsgIdentity); } id.fullName = fullName; id.email = email; id.composeHtml = true; id.setBoolAttribute("enablePgp", useEnigmail); if (keyId) { id.setIntAttribute("pgpKeyMode", 1); id.setCharAttribute("pgpkeyId", keyId); } } function setupAccount(ac) { let is = ac.incomingServer; is.downloadOnBiff = false; is.doBiff = false; is.performingBiff = false; is.loginAtStartUp = false; if (primaryKeyId === null) primaryKeyId = "ABCDEF0123456789"; if (primaryEmail === null) primaryEmail = "user1@enigmail-test.net"; setIdentityData(ac, 1, "Enigmail Unit Test 1", "John Doe I.", primaryEmail, true, primaryKeyId); setIdentityData(ac, 2, "Enigmail Unit Test 2", "John Doe II.", "user2@enigmail-test.net", true); setIdentityData(ac, 3, "Enigmail Unit Test 3", "John Doe III.", "user3@enigmail-test.net", false); setIdentityData(ac, 4, "Enigmail Unit Test 4", "John Doe IV.", "user4@enigmail-test.net", true); } for (let acct = 0; acct < accountManager.accounts.length; acct++) { let ac = accountManager.accounts.queryElementAt(acct, Ci.nsIMsgAccount); if (ac.incomingServer.type !== "none") { if (ac.incomingServer.type !== "pop3" || ac.incomingServer.prettyName !== UNITTEST_ACCT_NAME) { throw reportError(); } } } let configured = 0; // try to configure existing account for (let acct = 0; acct < accountManager.accounts.length; acct++) { let ac = accountManager.accounts.queryElementAt(acct, Ci.nsIMsgAccount); if (ac.incomingServer.type !== "none") { setupAccount(ac); ++configured; } } // if no account existed, create new account if (configured === 0) { let ac = accountManager.createAccount(); let is = accountManager.createIncomingServer("dummy", "localhost", "pop3"); is.prettyName = UNITTEST_ACCT_NAME; ac.incomingServer = is; setupAccount(ac); } } Components.utils.import("resource://enigmail/core.jsm"); /*global EnigmailCore: false */ function withEnigmail(f) { return function() { try { const enigmail = EnigmailCore.createInstance(); const window = JSUnit.createStubWindow(); enigmail.initialize(window, ""); return f(EnigmailCore.getEnigmailService(), window); } finally { EnigmailCore.setEnigmailService(null); } }; } CustomAssert.registerExtraAssertionsOn(Assert); Components.utils.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ Components.utils.import("resource://enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ function withLogFiles(f) { return function() { try { EnigmailLog.setLogLevel(5); f(); } finally { EnigmailLog.onShutdown(); EnigmailLog.createLogFiles(); } }; } function assertLogContains(expected) { let failureMessage = "Expected log to contain: " + expected; Assert.ok(EnigmailLog.getLogData(EnigmailCore.version, EnigmailPrefs).indexOf(expected) !== -1, failureMessage); } function assertLogDoesNotContain(expected) { Assert.equal(EnigmailLog.getLogData(EnigmailCore.version, EnigmailPrefs).indexOf(expected), -1); } enigmail-2.0.8/package/tests/tor-test.js000066400000000000000000000263541334302754500202020ustar00rootroot00000000000000/*global do_load_module: false, do_get_cwd: false, testing: false, test: false, Assert:false, component: false, Cc: false, Ci: false */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global TestHelper: false, assertContains: false, withEnigmail: false, withTestGpgHome: false, withEnvironment: false, resetting: false */ testing("tor.jsm"); /*global createRandomCredential, EnigmailTor, torProperties, meetsOSConstraints, MINIMUM_CURL_SOCKS5H_VERSION, MINIMUM_CURL_SOCKS5_PROXY_VERSION, createHelperArgs, gpgProxyArgs, findTorExecutableHelper: false*/ component("enigmail/rng.jsm"); /*global EnigmailRNG*/ component("enigmail/gpg.jsm"); /*global EnigmailGpg: false */ component("enigmail/files.jsm"); /*global EnigmailFiles: false */ component("enigmail/os.jsm"); /*global EnigmailOS: false */ component("enigmail/versioning.jsm"); /*global EnigmailVersioning: false */ let self = this; // eslint-disable-line no-invalid-this function withStandardGpg(f) { return function() { EnigmailGpg.dirmngrConfiguredWithTor = function() { return false; }; try { f(); } finally {} }; } test(function evaluateGpgVersionWhenOsIsWindows() { TestHelper.resetting(EnigmailOS, "isDosLike", true, function() { TestHelper.resetting(EnigmailGpg, "agentVersion", "1.4.0", function() { TestHelper.resetting(EnigmailVersioning, "greaterThanOrEqual", function(version, minimumVersion) { Assert.equal(version, "1.4.0"); return false; }, function() { Assert.equal(meetsOSConstraints(), false); }); }); }); }); test(function evaluateMeetsMinimumCurlSocksVersion() { TestHelper.resetting(EnigmailOS, "isDosLike", false, function() { TestHelper.resetting(EnigmailVersioning, "versionFoundMeetsMinimumVersionRequired", function(executable, minimumVersion) { Assert.equal(executable, "curl"); Assert.deepEqual(minimumVersion, MINIMUM_CURL_SOCKS5_PROXY_VERSION); return true; }, function() { Assert.equal(meetsOSConstraints(), true); }); }); }); test(withEnigmail(function createHelperArgsForTorsocks1(enigmail) { EnigmailGpg.setAgentPath("/usr/bin/gpg2"); const firstSet = createHelperArgs("torsocks", false); Assert.deepEqual(firstSet[0], "/usr/bin/gpg2"); })); test(function createHelperArgsForTorsocks2() { EnigmailGpg.setAgentPath("/usr/bin/gpg"); const args = createHelperArgs("torsocks2", true); Assert.deepEqual(args[0], "--user"); Assert.deepEqual(args[2], "--pass"); Assert.deepEqual(args[4], "/usr/bin/gpg"); }); test(function createHelperArgsAlwaysReturnsRandomUserAndPass() { const firstSet = createHelperArgs("torsocks2", true); const secondSet = createHelperArgs("torsocks2", true); Assert.notEqual(firstSet[1], secondSet[1]); Assert.notEqual(firstSet[3], secondSet[3]); }); test(function createGpgProxyArgs_forWindows() { TestHelper.resetting(EnigmailOS, "isDosLike", true, function() { TestHelper.resetting(EnigmailRNG, "generateRandomUint32", function() { return "dummyData"; }, function() { const tor = { ip: "127.0.0.1", port: 9050 }; const versioning = { versionFoundMeetsMinimumVersionRequired: function(executable, minimum) { Assert.equal(executable, "curl"); Assert.deepEqual(minimum, MINIMUM_CURL_SOCKS5H_VERSION); return false; } }; const args = gpgProxyArgs(tor, versioning); Assert.deepEqual(args, "socks5-hostname://dummyData:dummyData@127.0.0.1:9050"); }); }); }); test(function createGpgProxyArgs_forLinux() { TestHelper.resetting(EnigmailOS, "isDosLike", false, function() { TestHelper.resetting(EnigmailRNG, "generateRandomUint32", function() { return "dummyData"; }, function() { const tor = { ip: "192.8.8.4", port: 9150 }; const versioning = { versionFoundMeetsMinimumVersionRequired: function(executable, minimum) { Assert.equal(executable, "curl"); Assert.deepEqual(minimum, MINIMUM_CURL_SOCKS5H_VERSION); return true; } }; const args = gpgProxyArgs(tor, versioning); Assert.equal(args, "socks5h://dummyData:dummyData@192.8.8.4:9150"); }); }); }); test(withStandardGpg(function testTorPropertiesSearchesForTor() { TestHelper.resetting(EnigmailVersioning, "versionFoundMeetsMinimumVersionRequired", function() { return true; }, function() { TestHelper.resetting(self, "usesDirmngr", function() { return false; }, function() { const system = { findTorWasCalled: false, findTor: function() { system.findTorWasCalled = true; return torOn9150; }, findTorExecutableHelperWasCalled: false, findTorExecutableHelper: function() { system.findTorExecutableHelperWasCalled = true; return { command: "torsocks", args: ["--user", "12345", "--pass", "12345", "/usr/bin/gpg2"] }; } }; torProperties(system); Assert.equal(system.findTorWasCalled, true); Assert.equal(system.findTorExecutableHelperWasCalled, true); }); }); })); test(function createGpgProxyArgs_forLinux_whenSystemDOESNTMeetSocks5hVersion() { TestHelper.resetting(EnigmailOS, "isDosLike", false, function() { TestHelper.resetting(EnigmailRNG, "generateRandomUint32", function() { return "dummyData"; }, function() { const tor = { ip: "192.8.8.4", port: 9150 }; const versioning = { versionFoundMeetsMinimumVersionRequiredWasCalled: false, versionFoundMeetsMinimumVersionRequired: function(executable, minimum) { Assert.equal(executable, "curl"); Assert.deepEqual(minimum, MINIMUM_CURL_SOCKS5H_VERSION); versioning.versionFoundMeetsMinimumVersionRequiredWasCalled = true; return false; } }; const args = gpgProxyArgs(tor, versioning); Assert.equal(args, "socks5-hostname://dummyData:dummyData@192.8.8.4:9150"); Assert.equal(versioning.versionFoundMeetsMinimumVersionRequiredWasCalled, true, "versionFoundMeetsMinimumVersionRequired was not called"); }); }); }); test(function returnsFailure_whenSystemCannotFindTor() { TestHelper.resetting(EnigmailVersioning, "versionFoundMeetsMinimumVersionRequired", function() { return true; }, function() { const system = { findTor: function() { return null; } }; const properties = torProperties(system); Assert.equal(properties.socks, null); Assert.equal(properties.helper, null); Assert.equal(properties.useTorMode, false); }); }); test(withStandardGpg(function returnsSuccessWithArgs_whenAbleToFindTorAndTorsocks() { TestHelper.resetting(EnigmailVersioning, "versionFoundMeetsMinimumVersionRequired", function() { return true; }, function() { TestHelper.resetting(self, "usesDirmngr", function() { return false; }, function() { TestHelper.resetting(EnigmailRNG, "generateRandomUint32", function() { return "dummyData"; }, function() { const torArgs = ["--user", "dummyUsername", "--pass", "dummyPassword", "/usr/bin/gpg2"]; const gpgArgs = "socks5h://dummyData:dummyData@127.0.0.1:9050"; const system = { findTor: function() { return { ip: "127.0.0.1", port: 9050 }; }, findTorExecutableHelper: function() { return { command: "torsocks", args: torArgs }; } }; const properties = torProperties(system); Assert.equal(properties.useTorMode, false); const socksProperties = properties.socks; const helperProperties = properties.helper; Assert.equal(helperProperties.command, "torsocks"); Assert.equal(helperProperties.args, torArgs); Assert.equal(socksProperties.command, "gpg"); Assert.equal(socksProperties.args, gpgArgs); }); }); }); })); const torOn9150 = { ip: "127.0.0.1", port: 9150 }; test(function testThatTorModeIsTrueWhenUserHasEnabledTorMode() { TestHelper.resetting(EnigmailVersioning, "versionFoundMeetsMinimumVersionRequired", function() { return true; }, function() { TestHelper.resetting(self, "usesDirmngr", function() { return true; }, function() { let dirmngrConfiguredWithTorFunctionWasCalled = false; TestHelper.resetting(EnigmailGpg, "dirmngrConfiguredWithTor", function() { return true; }, function() { dirmngrConfiguredWithTorFunctionWasCalled = true; const system = { findTor: function() { return torOn9150; }, findTorExecutableHelper: function() { return null; } }; const properties = torProperties(system); Assert.equal(properties.useTorMode, true); Assert.equal(properties.socks, null); Assert.equal(dirmngrConfiguredWithTorFunctionWasCalled, true, "dirmngrConfiguredWithTor() was not called"); }); }); }); }); function contains(string, substring) { return string.indexOf(substring) > -1; } test(function testUsingTorsocksWithEnvironmentVariables() { const versioning = { versionFoundMeetsMinimumVersionRequired: function() { return false; } }; TestHelper.resetting(EnigmailFiles, "resolvePathWithEnv", function(exe) { if (exe === "torsocks") { return { path: "/usr/bin/torsocks" }; } else { return null; } }, function() { const result = findTorExecutableHelper(versioning); Assert.equal(result.command.path, "/usr/bin/torsocks"); Assert.ok(contains(result.envVars[0], "TORSOCKS_USERNAME")); Assert.ok(contains(result.envVars[1], "TORSOCKS_PASSWORD")); Assert.equal(result.args.length, 1); }); }); test(function testUsingTorsocksWithCommandArguments() { const versioning = { versionFoundMeetsMinimumVersionRequired: function() { return true; } }; TestHelper.resetting(EnigmailFiles, "resolvePathWithEnv", function(exe) { if (exe === "torsocks") { return { path: "/usr/bin/torsocks" }; } else { return null; } }, function() { const result = findTorExecutableHelper(versioning); Assert.equal(result.command.path, "/usr/bin/torsocks"); Assert.equal(result.args.length, 5); Assert.equal(result.args[0], "--user"); Assert.equal(result.args[2], "--pass"); Assert.equal(result.args[4], "/usr/bin/gpg"); }); }); test(function testUseNothingIfNoTorHelpersAreAvailable() { const versioning = { findExecutable: function() { return null; } }; TestHelper.resetting(EnigmailFiles, "resolvePathWithEnv", function(exe) { return null; }, function() { const result = findTorExecutableHelper(versioning); Assert.equal(findTorExecutableHelper(versioning), null); }); }); test(function creatingRandomCredential() { Assert.equal(typeof createRandomCredential(), "string"); Assert.notEqual(createRandomCredential(), createRandomCredential()); }); enigmail-2.0.8/package/tests/versioning-test.js000066400000000000000000000052301334302754500215470ustar00rootroot00000000000000/*global testing: false, do_load_module: false, do_get_cwd: false, test: false, Assert:false, component: false */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global TestHelper: false, withEnigmail: false, withTestGpgHome: false */ testing("versioning.jsm"); /*global EnigmailVersioning: false, greaterThanOrEqual: false, createVersionRequest:false, versionFoundMeetsMinimumVersionRequired:false, greaterThan: false, lessThan: false */ component("enigmail/execution.jsm"); /*global EnigmailExecution:false */ test(function checkCurlVersionIsOver() { const curl749 = "curl 7.49.1 (x86_64-pc-linux-gnu) libcurl/7.49.1 OpenSSL/1.0.2h zlib/1.2.8 libidn/1.32 libssh2/1.7.0\n" + "Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp\n" + "Features: AsynchDNS IDN IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz TLS-SRP UnixSockets\n"; TestHelper.resetting(EnigmailExecution, "resolveAndSimpleExec", function() { return curl749; }, function() { const minimumCurlVersion = "7.21.7"; Assert.equal(versionFoundMeetsMinimumVersionRequired("curl", minimumCurlVersion), true); }); }); test(function checkCurlVersionIsLess() { const curl749 = "curl 7.49.1 (x86_64-pc-linux-gnu) libcurl/7.49.1 OpenSSL/1.0.2h zlib/1.2.8 libidn/1.32 libssh2/1.7.0\n" + "Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp\n" + "Features: AsynchDNS IDN IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz TLS-SRP UnixSockets\n"; TestHelper.resetting(EnigmailExecution, "resolveAndSimpleExec", function() { return curl749; }, function() { const absurdlyHighCurlRequirement = "100.100.100"; Assert.equal(versionFoundMeetsMinimumVersionRequired("curl", absurdlyHighCurlRequirement), false); }); }); test(function versionIsGreaterOrEqual() { Assert.equal(greaterThanOrEqual("7.12", "7.30"), false); Assert.equal(greaterThanOrEqual("7.12", "7.12"), true); Assert.equal(greaterThanOrEqual("7.12", "7.1"), true); }); test(function versionIsGreater() { Assert.equal(greaterThan("1.1", "1.0"), true); Assert.equal(greaterThan("1.0", "1.0"), false); Assert.equal(greaterThan("1.0", "1.1"), false); }); test(function versionIsLessThan() { Assert.equal(lessThan("1.1", "1.0"), false); Assert.equal(lessThan("1.0", "1.0"), false); Assert.equal(lessThan("1.0", "1.1"), true); }); enigmail-2.0.8/package/tests/webKey-test.js000066400000000000000000000174751334302754500206300ustar00rootroot00000000000000/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false */ /*global TestHelper: false, withEnvironment: false, nsIWindowsRegKey: true */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global TestHelper: false, withEnvironment: false, withEnigmail: false, component: false, withTestGpgHome: false, osUtils: false */ testing("webKey.jsm"); /*global EnigmailWks: false, GPG_WKS_CLIENT: false */ component("enigmail/execution.jsm"); /*global EnigmailExecution: false */ component("enigmail/subprocess.jsm"); /*global subprocess: false */ component("enigmail/files.jsm"); /*global EnigmailFiles: false */ component("enigmail/os.jsm"); /*global EnigmailOS: false */ component("enigmail/gpgAgent.jsm"); /*global EnigmailGpgAgent: false */ component("enigmail/send.jsm"); /*global EnigmailSend: false */ component("enigmail/log.jsm"); /*global EnigmailLog: false */ test(function getWksPathInBinDir() { TestHelper.resetting(EnigmailGpgAgent, "gpgconfPath", "TEST_PATH", function() { TestHelper.resetting(EnigmailWks, "wksClientPath", null, function() { TestHelper.resetting(EnigmailExecution, "execStart", function(path, args, wat, win, listener, ops) { Assert.equal(path, "TEST_PATH"); if (EnigmailOS.isDosLike) { listener.stdout("bindir:" + do_get_cwd().path + "\r\nlibexecdir:C:\\GnuPG\\lib\\exec\\dir\\test\r\n"); } else { listener.stdout("bindir:" + do_get_cwd().path + "\nlibexecdir:/lib/exec/dir/test\n"); } listener.done(0); return { 'wait': function() {} }; }, function() { let win = JSUnit.createStubWindow(); let handle = EnigmailWks.getWksClientPathAsync(win, function(ret) { let p = do_get_cwd().clone(); p.append(GPG_WKS_CLIENT); Assert.equal(p.path, ret.path); }); if (handle) { handle.wait(); } }); }); }); }); test(function getWksPathInLibexecDir() { TestHelper.resetting(EnigmailGpgAgent, "gpgconfPath", "TEST_PATH", function() { TestHelper.resetting(EnigmailWks, "wksClientPath", null, function() { TestHelper.resetting(EnigmailExecution, "execStart", function(path, args, wat, win, listener, ops) { Assert.equal(path, "TEST_PATH"); if (EnigmailOS.isDosLike) { listener.stdout("libexecdir:" + do_get_cwd().path + "\r\nbindir:C:\\GnuPG\\bin\\dir\\test\r\n"); } else { listener.stdout("libexecdir:" + do_get_cwd().path + "\nbindir:/bin/dir/test\n"); } listener.done(0); return { 'wait': function() {} }; }, function() { let win = JSUnit.createStubWindow(); let handle = EnigmailWks.getWksClientPathAsync(win, function(ret) { let p = do_get_cwd().clone(); p.append(GPG_WKS_CLIENT); Assert.equal(p.path, ret.path); }); if (handle) { handle.wait(); } }); }); }); }); test(function wksSubmitKey() { TestHelper.resetting(EnigmailWks, "wksClientPath", "WKS_CLIENT_DUMMY", function() { TestHelper.resetting(EnigmailExecution, "execStart", function(path, args, wat, win, listener, ops) { Assert.equal(path, "WKS_CLIENT_DUMMY"); listener.stdout( ` From: test1@example.com To: key-submit@example.com Subject: Key publishing request Wks-Draft-Version: 3 MIME-Version: 1.0 Content-Type: multipart/encrypted; protocol="application/pgp-encrypted"; boundary="=-=01-uhb5j5etxykdj5cqrpky=-=" Date: Thu, 27 Jul 2017 14:21:21 +0000 --=-=01-uhb5j5etxykdj5cqrpky=-= Content-Type: application/pgp-encrypted Version: 1 --=-=01-uhb5j5etxykdj5cqrpky=-= Content-Type: application/octet-stream -----BEGIN PGP MESSAGE----- lalala -----END PGP MESSAGE----- --=-=01-uhb5j5etxykdj5cqrpky=-=--` ); listener.done(0); return { 'wait': function() {} }; }, function() { TestHelper.resetting(EnigmailSend, "simpleSendMessage", function(op1, op2, op3, op4, op5) { Assert.equal(op1.identity.email, "test2@example.com"); Assert.equal(op1.to, "key-submit@example.com"); Assert.equal(op1.subject, "Key publishing request"); return true; }, function() { let win = JSUnit.createStubWindow(); let handle = EnigmailWks.submitKey({ 'email': 'test2@example.com' }, { 'fpr': '123' }, win, function(ret) { Assert.equal(true, ret); }); if (handle) { handle.wait(); } }); }); }); }); test(function wksConfirmKey() { TestHelper.resetting(EnigmailWks, "wksClientPath", "WKS_CLIENT_DUMMY", function() { TestHelper.resetting(EnigmailExecution, "execStart", function(path, args, wat, win, listener, ops) { Assert.equal(path, "WKS_CLIENT_DUMMY"); listener.done(0); return { 'wait': function() {} }; }, function() { TestHelper.resetting(EnigmailSend, "simpleSendMessage", function(op1, op2, op3, op4, op5) { Assert.equal(op1.identity.email, "test2@example.com"); Assert.equal(op1.to, "key-submit@example.com"); Assert.equal(op1.subject, "Key publishing confirmation"); return true; }, function() { let win = JSUnit.createStubWindow(); let mail = ` From: test1@example.com To: key-submit@example.com Subject: Key publishing confirmation Wks-Draft-Version: 3 MIME-Version: 1.0 Content-Type: multipart/encrypted; protocol="application/pgp-encrypted"; boundary="=-=01-uhb5j5etxykdj5cqrpky=-=" Date: Thu, 27 Jul 2017 14:21:21 +0000 --=-=01-uhb5j5etxykdj5cqrpky=-= Content-Type: application/pgp-encrypted Version: 1 --=-=01-uhb5j5etxykdj5cqrpky=-= Content-Type: application/octet-stream -----BEGIN PGP MESSAGE----- lalala -----END PGP MESSAGE----- --=-=01-uhb5j5etxykdj5cqrpky=-=--`; let handle = EnigmailWks.confirmKey({ 'email': 'test2@example.com' }, mail, win, function(ret) { Assert.equal(true, ret); }); if (handle) { handle.wait(); } }); }); }); }); test(function positiveWksSupportCheck() { TestHelper.resetting(EnigmailWks, "wksClientPath", "WKS_CLIENT_DUMMY", function() { TestHelper.resetting(EnigmailExecution, "execStart", function(path, args, wat, win, listener, ops) { Assert.equal(path, "WKS_CLIENT_DUMMY"); Assert.equal(args[0], "--supported"); Assert.equal(args[1], "test2@example.com"); listener.done(0); return { 'wait': function() {} }; }, function() { let win = JSUnit.createStubWindow(); let handle = EnigmailWks.isWksSupportedAsync('test2@example.com', win, function(ret) { Assert.equal(true, ret); }); if (handle) { handle.wait(); } }); }); }); test(function negativeWksSupportCheck() { TestHelper.resetting(EnigmailWks, "wksClientPath", "WKS_CLIENT_DUMMY", function() { TestHelper.resetting(EnigmailExecution, "execStart", function(path, args, wat, win, listener, ops) { Assert.equal(path, "WKS_CLIENT_DUMMY"); Assert.equal(args[0], "--supported"); Assert.equal(args[1], "test2@example.com"); listener.done(1); return { 'wait': function() {} }; }, function() { let win = JSUnit.createStubWindow(); let handle = EnigmailWks.isWksSupportedAsync('test2@example.com', win, function(ret) { Assert.equal(false, ret); }); if (handle) { handle.wait(); } }); }); }); enigmail-2.0.8/package/time.jsm000066400000000000000000000034411334302754500163620ustar00rootroot00000000000000/*global Components: false, EnigmailLocale: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailTime"]; const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; Cu.import("resource://enigmail/locale.jsm"); const DATE_2DIGIT = "2-digit"; const DATE_4DIGIT = "numeric"; var EnigmailTime = { /** * Transform a Unix-Timestamp to a human-readable date/time string * * @dateNum: Number - Unix timestamp * @withDate: Boolean - if true, include the date in the output * @withTime: Boolean - if true, include the time in the output * * @return: String - formatted date/time string */ getDateTime: function(dateNum, withDate, withTime) { if (dateNum && dateNum !== 0) { let dat = new Date(dateNum * 1000); let appLocale = EnigmailLocale.get(); var options = {}; if (withDate) { options.day = DATE_2DIGIT; options.month = DATE_2DIGIT; let year = dat.getFullYear(); if (year > 2099) { options.year = DATE_4DIGIT; } else { options.year = DATE_2DIGIT; } } if (withTime) { options.hour = DATE_2DIGIT; options.minute = DATE_2DIGIT; } let useLocale = appLocale.getCategory("NSILOCALE_TIME").substr(0, 5); useLocale = useLocale.replace(/_/g, "-"); try { return new Intl.DateTimeFormat(useLocale, options).format(dat); } catch (ex) { return new Intl.DateTimeFormat("en-US", options).format(dat); } } else { return ""; } } }; enigmail-2.0.8/package/timer.jsm000066400000000000000000000024571334302754500165520ustar00rootroot00000000000000/*global Components: false, EnigmailLog: false, EnigmailPrefs: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; const EXPORTED_SYMBOLS = ["EnigmailTimer"]; Components.utils.import("resource://gre/modules/Timer.jsm"); /* global setTimeout: false, clearTimeout: false */ const Cc = Components.classes; const Ci = Components.interfaces; var EnigmailTimer = { /** * wait a defined number of miliseconds, then call a callback function * asynchronously * * @param callbackFunction: Function - any function specification * @param sleepTimeMs: Number - optional number of miliseconds to delay * (0 if not specified) * * @return Number: timeoutID */ setTimeout: function(callbackFunction, sleepTimeMs = 0) { let timeoutID; function callbackWrapper() { callbackFunction(); try { clearTimeout(timeoutID); } catch (ex) {} } timeoutID = setTimeout(callbackWrapper, sleepTimeMs); return timeoutID; }, /** * Cancel a timeout callback * * @param Number: timeoutID */ clearTimeout: clearTimeout }; enigmail-2.0.8/package/tor.jsm000066400000000000000000000204341334302754500162310ustar00rootroot00000000000000/*global Components: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; const Ci = Components.interfaces; const Cu = Components.utils; Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false*/ Cu.import("resource://enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ Cu.import("resource://enigmail/rng.jsm"); /*global EnigmailRNG: false */ Cu.import("resource://enigmail/versioning.jsm"); /*global EnigmailVersioning: false */ Cu.import("resource://enigmail/os.jsm"); /*global EnigmailOS: false */ Cu.import("resource://enigmail/socks5Proxy.jsm"); /*global EnigmailSocks5Proxy: false */ Cu.import("resource://enigmail/gpg.jsm"); /*global EnigmailGpg: false */ Cu.import("resource://enigmail/files.jsm"); /*global EnigmailFiles: false */ Cu.import("resource://enigmail/constants.jsm"); /*global EnigmailConstants: false */ const EXPORTED_SYMBOLS = ["EnigmailTor"]; // Minimum for using socks5h:// prefix const MINIMUM_CURL_SOCKS5H_VERSION = "7.21.7"; // Minimum for using socks5 proxies with curl const MINIMUM_CURL_SOCKS5_PROXY_VERSION = "7.18.0"; const TORSOCKS_VERSION_2 = "2.0.0"; const TOR_SERVICE_PORT_PREF = "torServicePort"; const TOR_BROWSER_BUNDLE_PORT_PREF = "torBrowserBundlePort"; const NEW_CURL_PROTOCOL = "socks5h://"; const OLD_CURL_PROTOCOL = "socks5-hostname://"; const TOR_USER_PREFERENCES = { DOWNLOAD: { requires: "downloadKeyRequireTor", uses: "downloadKeyWithTor", constant: EnigmailConstants.DOWNLOAD_KEY }, SEARCH: { requires: "searchKeyRequireTor", uses: "searchKeyWithTor", constant: EnigmailConstants.SEARCH_KEY }, UPLOAD: { requires: "uploadKeyRequireTor", uses: "uploadKeyWithTor", constant: EnigmailConstants.UPLOAD_KEY }, REFRESH: { requires: "refreshAllKeysRequireTor", uses: "refreshAllKeysWithTor", constant: EnigmailConstants.REFRESH_KEY } }; function getAction(actionFlags) { for (let key in TOR_USER_PREFERENCES) { if (TOR_USER_PREFERENCES[key].constant & actionFlags) { return TOR_USER_PREFERENCES[key]; } } return null; } /** * Sets user preference about requiring requests only to be made over Tor * * @param actionFlags - long: A Keyserver action flag * * @return true if user has requested gpg requests to be attempted over Tor, false otherwise */ function isPreferred(actionFlags) { const action = getAction(actionFlags); return EnigmailPrefs.getPref(action.requires) || EnigmailPrefs.getPref(action.uses); } /** * Sets user preference about requiring requests only to be made over Tor * * @param actionFlags - long: A Keyserver action flag * * @return true if user has requested gpg requests ONLY to be attempted over Tor, false otherwise */ function isRequired(actionFlags) { return EnigmailPrefs.getPref(getAction(actionFlags).requires); } function combineIntoProxyhostURI(protocol, tor) { EnigmailLog.DEBUG("tor.jsm: combineIntoProxyhostURI()\n"); return protocol + createRandomCredential() + ":" + createRandomCredential() + "@" + tor.ip + ":" + tor.port; } function gpgProxyArgs(tor, versioning) { EnigmailLog.DEBUG("tor.jsm: gpgProxyArgs()\n"); if (EnigmailOS.isDosLike || !versioning.versionFoundMeetsMinimumVersionRequired("curl", MINIMUM_CURL_SOCKS5H_VERSION)) { return combineIntoProxyhostURI(OLD_CURL_PROTOCOL, tor); } else { return combineIntoProxyhostURI(NEW_CURL_PROTOCOL, tor); } } function createHelperArgs(helper, addAuth) { EnigmailLog.DEBUG("tor.jsm: createHelperArgs()\n"); let args = []; if (addAuth) { args = ["--user", createRandomCredential(), "--pass", createRandomCredential()]; } args.push(EnigmailGpg.agentPath); return args; } function buildEnvVars() { return [ "TORSOCKS_USERNAME=" + createRandomCredential(), "TORSOCKS_PASSWORD=" + createRandomCredential() ]; } function createRandomCredential() { return EnigmailRNG.generateRandomUint32().toString(); } function torOn(portPref) { EnigmailLog.DEBUG("tor.jsm: torOn()\n"); if (EnigmailSocks5Proxy.checkTorExists(portPref)) { const port = EnigmailPrefs.getPref(portPref); EnigmailLog.CONSOLE("Tor found on IP: " + EnigmailSocks5Proxy.torIpAddr() + ", port: " + port + "\n\n"); return { ip: EnigmailSocks5Proxy.torIpAddr(), port: port }; } return null; } function meetsOSConstraints() { if (EnigmailOS.isDosLike) { return EnigmailGpg.getGpgFeature("socks-on-windows"); } else { return EnigmailVersioning.versionFoundMeetsMinimumVersionRequired("curl", MINIMUM_CURL_SOCKS5_PROXY_VERSION); } } function useAuthOverArgs(helper, versioning) { if (helper === "torsocks2") { return versioning.versionFoundMeetsMinimumVersionRequired("torsocks2", TORSOCKS_VERSION_2); } return versioning.versionFoundMeetsMinimumVersionRequired("torsocks", TORSOCKS_VERSION_2); } function usesDirmngr() { return EnigmailGpg.getGpgFeature("supports-dirmngr"); } function findTorExecutableHelper(versioning) { EnigmailLog.DEBUG("tor.jsm: findTorExecutableHelper()\n"); const helper = EnigmailFiles.resolvePathWithEnv("torsocks2") || EnigmailFiles.resolvePathWithEnv("torsocks"); if (helper !== null) { const authOverArgs = useAuthOverArgs(helper, versioning); return { envVars: (authOverArgs ? [] : buildEnvVars()), command: helper, args: createHelperArgs(helper, authOverArgs) }; } else { return null; } } /** * Checks if Tor is running on specified ports in preferences for Tor browser bundle and Tor service * * @return true if Tor is running on either port, false if Tor is not running on either */ function findTor() { EnigmailLog.DEBUG("tor.jsm: findTor()\n"); const torOnBrowser = torOn(TOR_BROWSER_BUNDLE_PORT_PREF); if (torOnBrowser !== null) { return torOnBrowser; } return torOn(TOR_SERVICE_PORT_PREF); } const systemCaller = { findTor: findTor, findTorExecutableHelper: findTorExecutableHelper }; function buildSocksProperties(tor) { EnigmailLog.DEBUG("tor.jsm: buildSocksProperties()\n"); return { command: "gpg", args: gpgProxyArgs(tor, EnigmailVersioning), envVars: [] }; } function torNotAvailableProperties() { EnigmailLog.DEBUG("tor.jsm: torNotAvailableProperties()\n"); return { isAvailable: false, useTorMode: false, socks: null, helper: null }; } /** * Constructs object with properites about how we will use tor for key refreshes * * @param system - object with functions to locate Tor and Tor helpers * * @return object with * isAvailable - boolean, true if Tor is available, false otherwise * useTorMode - boolean, true if dirManager is available and configured to use Tor, false otherwise * socks - object with * command - the name of the gpg executable * args - proxy host URI * envVars - an empty array null if Tor is not available * helper - object with * envVars - environment variables, if we need them for the helper * command - the path to the helper executable * args - flags used with the helper, if we do not use environment variables If no helper is found, return null */ function torProperties(system) { EnigmailLog.DEBUG("tor.jsm: torProperties()\n"); const tor = system.findTor(); if (!meetsOSConstraints()) { EnigmailLog.DEBUG("tor.jsm: this version of curl does not support socks5 proxies \n"); return torNotAvailableProperties(); } if (tor === null) { return torNotAvailableProperties(); } const helper = system.findTorExecutableHelper(EnigmailVersioning); let socks = null; let useTorMode = false; if (usesDirmngr()) { useTorMode = EnigmailGpg.dirmngrConfiguredWithTor(); } else { socks = buildSocksProperties(tor); } return { isAvailable: true, useTorMode: useTorMode, socks: socks, helper: helper }; } var EnigmailTor = { torProperties: function() { return torProperties(systemCaller); }, getTorNotAvailableProperties: torNotAvailableProperties, isPreferred: isPreferred, isRequired: isRequired }; enigmail-2.0.8/package/trust.jsm000066400000000000000000000071361334302754500166120ustar00rootroot00000000000000/*global Components: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailTrust"]; Components.utils.import("resource://enigmail/locale.jsm"); /*global EnigmailLocale: false */ // trust flags according to GPG documentation: // - https://www.gnupg.org/documentation/manuals/gnupg.pdf // - sources: doc/DETAILS // In the order of trustworthy: // --------------------------------------------------------- // i = The key is invalid (e.g. due to a missing self-signature) // n = The key is not valid / Never trust this key // d/D = The key has been disabled // r = The key has been revoked // e = The key has expired // g = group (???) // --------------------------------------------------------- // ? = INTERNAL VALUE to separate invalid from unknown keys // see validKeysForAllRecipients() in enigmailMsgComposeHelper.js // --------------------------------------------------------- // o = Unknown (this key is new to the system) // - = Unknown validity (i.e. no value assigned) // q = Undefined validity (Not enough information for calculation) // '-' and 'q' may safely be treated as the same value for most purposes // --------------------------------------------------------- // m = Marginally trusted // --------------------------------------------------------- // f = Fully trusted / valid key // u = Ultimately trusted // --------------------------------------------------------- const TRUSTLEVELS_SORTED = "indDreg?o-qmfu"; const TRUSTLEVELS_SORTED_IDX_UNKNOWN = 7; // index of '?' var EnigmailTrust = { /** * @return - |string| containing the order of trust/validity values */ trustLevelsSorted: function() { return TRUSTLEVELS_SORTED; }, /** * @return - |boolean| whether the flag is invalid (neither unknown nor valid) */ isInvalid: function(flag) { return TRUSTLEVELS_SORTED.indexOf(flag) < TRUSTLEVELS_SORTED_IDX_UNKNOWN; }, /** * return a merged value of trust level "key disabled" * * @keyObj - |object| containing the key data * * @return - |string| containing the trust value or "D" for disabled keys */ getTrustCode: function(keyObj) { if (keyObj.keyUseFor.indexOf("D") >= 0) { return "D"; } else { return keyObj.keyTrust; } }, getTrustLabel: function(trustCode) { let keyTrust; switch (trustCode) { case 'q': keyTrust = EnigmailLocale.getString("keyValid.unknown"); break; case 'i': keyTrust = EnigmailLocale.getString("keyValid.invalid"); break; case 'd': case 'D': keyTrust = EnigmailLocale.getString("keyValid.disabled"); break; case 'r': keyTrust = EnigmailLocale.getString("keyValid.revoked"); break; case 'e': keyTrust = EnigmailLocale.getString("keyValid.expired"); break; case 'n': keyTrust = EnigmailLocale.getString("keyTrust.untrusted"); break; case 'm': keyTrust = EnigmailLocale.getString("keyTrust.marginal"); break; case 'f': keyTrust = EnigmailLocale.getString("keyTrust.full"); break; case 'u': keyTrust = EnigmailLocale.getString("keyTrust.ultimate"); break; case 'g': keyTrust = EnigmailLocale.getString("keyTrust.group"); break; case '-': keyTrust = "-"; break; default: keyTrust = ""; } return keyTrust; } }; enigmail-2.0.8/package/uris.jsm000066400000000000000000000104111334302754500164010ustar00rootroot00000000000000/*global Components: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailURIs"]; const Cu = Components.utils; Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ Cu.import("resource://enigmail/data.jsm"); /*global EnigmailData: false */ const messageIdList = {}; const encryptedUris = []; var EnigmailURIs = { createMessageURI: function(originalUrl, contentType, contentCharset, contentData, persist) { EnigmailLog.DEBUG("enigmail.js: Enigmail.createMessageURI: " + originalUrl + ", " + contentType + ", " + contentCharset + "\n"); const messageId = "msg" + Math.floor(Math.random() * 1.0e9); messageIdList[messageId] = { originalUrl: originalUrl, contentType: contentType, contentCharset: contentCharset, contentData: contentData, persist: persist }; return "enigmail:message/" + messageId; }, deleteMessageURI: function(uri) { EnigmailLog.DEBUG("enigmail.js: Enigmail.deleteMessageURI: " + uri + "\n"); const messageId = EnigmailData.extractMessageId(uri); if (!messageId) { return false; } else { return (delete messageIdList[messageId]); } }, getMessageURI: function(messageId) { return messageIdList[messageId]; }, /* * remember the fact a URI is encrypted * * @param String msgUri * * @return null */ rememberEncryptedUri: function(uri) { EnigmailLog.DEBUG("uris.jsm: rememberEncryptedUri: uri=" + uri + "\n"); if (encryptedUris.indexOf(uri) < 0) { encryptedUris.push(uri); } }, /* * unremember the fact a URI is encrypted * * @param String msgUri * * @return null */ forgetEncryptedUri: function(uri) { EnigmailLog.DEBUG("uris.jsm: forgetEncryptedUri: uri=" + uri + "\n"); const pos = encryptedUris.indexOf(uri); if (pos >= 0) { encryptedUris.splice(pos, 1); } }, /* * determine if a URI was remebered as encrypted * * @param String msgUri * * @return: Boolean true if yes, false otherwise */ isEncryptedUri: function(uri) { EnigmailLog.DEBUG("uris.jsm: isEncryptedUri: uri=" + uri + "\n"); return encryptedUris.indexOf(uri) >= 0; }, /** * Determine message number and folder from mailnews URI * * @param url - nsIURI object * * @return Object: * - msgNum: String - the message number, or "" if no URI Scheme fits * - folder: String - the folder (or newsgroup) name */ msgIdentificationFromUrl: function(url) { // sample URLs in Thunderbird // Local folder: mailbox:///some/path/to/folder?number=359360 // IMAP: imap://user@host:port/fetch>some>path>111 // NNTP: news://some.host/some.service.com?group=some.group.name&key=3510 // also seen: e.g. mailbox:///som/path/to/folder?number=4455522&part=1.1.2&filename=test.eml // mailbox:///...?number=4455522&part=1.1.2&filename=test.eml&type=application/x-message-display&filename=test.eml // imap://user@host:port>UID>some>path>10?header=filter&emitter=js&examineEncryptedParts=true if (!url) return null; EnigmailLog.DEBUG("uris.jsm: msgIdentificationFromUrl: url.pathQueryRef=" + ("path" in url ? url.path : url.pathQueryRef) + "\n"); let msgNum = ""; let msgFolder = ""; let pathQueryRef = ("path" in url ? url.path : url.pathQueryRef); if (url.schemeIs("mailbox")) { msgNum = pathQueryRef.replace(/(.*[?&]number=)([0-9]+)([^0-9].*)?/, "$2"); msgFolder = pathQueryRef.replace(/\?.*/, ""); } else if (url.schemeIs("imap")) { let p = unescape(pathQueryRef); msgNum = p.replace(/(.*>)([0-9]+)([^0-9].*)?/, "$2"); msgFolder = p.replace(/\?.*$/, "").replace(/>[^>]+$/, ""); } else if (url.schemeIs("news")) { msgNum = pathQueryRef.replace(/(.*[?&]key=)([0-9]+)([^0-9].*)?/, "$2"); msgFolder = pathQueryRef.replace(/(.*[?&]group=)([^&]+)(&.*)?/, "$2"); } EnigmailLog.DEBUG("uris.jsm: msgIdentificationFromUrl: msgNum=" + msgNum + " / folder=" + msgFolder + "\n"); return { msgNum: msgNum, folder: msgFolder.toLowerCase() }; } }; enigmail-2.0.8/package/verify.jsm000066400000000000000000000047571334302754500167430ustar00rootroot00000000000000/*global Components: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailVerifyAttachment"]; const Cu = Components.utils; Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ Cu.import("resource://enigmail/files.jsm"); /*global EnigmailFiles: false */ Cu.import("resource://enigmail/gpgAgent.jsm"); /*global EnigmailGpgAgent: false */ Cu.import("resource://enigmail/gpg.jsm"); /*global EnigmailGpg: false */ Cu.import("resource://enigmail/execution.jsm"); /*global EnigmailExecution: false */ Cu.import("resource://enigmail/time.jsm"); /*global EnigmailTime: false */ Cu.import("resource://enigmail/locale.jsm"); /*global EnigmailLocale: false */ Cu.import("resource://enigmail/decryption.jsm"); /*global EnigmailDecryption: false */ Cu.import("resource://enigmail/constants.jsm"); /*global EnigmailConstants: false */ const Ci = Components.interfaces; var EnigmailVerifyAttachment = { attachment: function(parent, verifyFile, sigFile, statusFlagsObj, errorMsgObj) { EnigmailLog.DEBUG("verify.jsm: EnigmailVerifyAttachment.attachment:\n"); const verifyFilePath = EnigmailFiles.getEscapedFilename(EnigmailFiles.getFilePathReadonly(verifyFile.QueryInterface(Ci.nsIFile))); const sigFilePath = EnigmailFiles.getEscapedFilename(EnigmailFiles.getFilePathReadonly(sigFile.QueryInterface(Ci.nsIFile))); const args = EnigmailGpg.getStandardArgs(true). concat(["--verify", sigFilePath, verifyFilePath]); const listener = EnigmailExecution.newSimpleListener(); const proc = EnigmailExecution.execStart(EnigmailGpgAgent.agentPath, args, false, parent, listener, statusFlagsObj); if (!proc) { return -1; } proc.wait(); const retObj = {}; EnigmailDecryption.decryptMessageEnd(listener.stderrData, listener.exitCode, 1, true, true, EnigmailConstants.UI_INTERACTIVE, retObj); if (listener.exitCode === 0) { const detailArr = retObj.sigDetails.split(/ /); const dateTime = EnigmailTime.getDateTime(detailArr[2], true, true); const msg1 = retObj.errorMsg.split(/\n/)[0]; const msg2 = EnigmailLocale.getString("keyAndSigDate", ["0x" + retObj.keyId, dateTime]); errorMsgObj.value = msg1 + "\n" + msg2; } else { errorMsgObj.value = retObj.errorMsg; } return listener.exitCode; } }; enigmail-2.0.8/package/versioning.jsm000066400000000000000000000106751334302754500176160ustar00rootroot00000000000000/*global Components: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; const EXPORTED_SYMBOLS = ["EnigmailVersioning"]; const Cu = Components.utils; const Cc = Components.classes; const Ci = Components.interfaces; Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ Cu.import("resource://enigmail/execution.jsm"); /*global EnigmailExecution: false */ let vc = null; function getVersionComparator() { if (vc === null) { vc = Cc["@mozilla.org/xpcom/version-comparator;1"].getService(Ci.nsIVersionComparator); } return vc; } /* * getVersion retrieves a version from a string * * @param String output - string to retrieve the version from * @param String executable - string to print when a version is not parseable * * @return String versionResponse - The first value that matches a version format */ function getVersion(output, executable) { const m = output.match(/\b(\d+\.\d+\.\d+)\b/); if (m) { const versionResponse = m[1]; EnigmailLog.DEBUG(executable + " version found: " + versionResponse + "\n"); return versionResponse; } else { return null; } } /** * Test the version number of any application (not gpg) */ function versionFoundMeetsMinimumVersionRequired(executable, minimumVersion) { const args = ["--version"]; const exitCodeObj = { value: null }; const output = EnigmailExecution.resolveAndSimpleExec(executable, args, exitCodeObj, {}); if (!output || exitCodeObj.value < 0) { EnigmailLog.DEBUG("executable not found: " + executable + "\n"); return false; } const version = getVersion(output, executable); if (!version) { EnigmailLog.DEBUG("couldn't find a version in the output from " + executable + " - total output: " + output + "\n"); return false; } return greaterThanOrEqual(version, minimumVersion); } function greaterThanOrEqual(versionWeHave, versionWeAreComparingWith) { return getVersionComparator().compare(versionWeHave, versionWeAreComparingWith) >= 0; } function greaterThan(versionWeHave, versionWeAreComparingWith) { return getVersionComparator().compare(versionWeHave, versionWeAreComparingWith) > 0; } function lessThan(versionWeHave, versionWeAreComparingWith) { return getVersionComparator().compare(versionWeHave, versionWeAreComparingWith) < 0; } var EnigmailVersioning = { /** * Uses Mozilla's Version Comparator Component to identify whether the version * we have is greater than or equal to the version we are comparing with * * @param String versionWeHave - version we have * @param String versionWeAreComparingWith - version we want to compare with * * @return Boolean - The result of versionWeHave >= versionWeAreComparingWith */ greaterThanOrEqual: greaterThanOrEqual, /** * Uses Mozilla's Version Comparator Component to identify whether the version * we have is greater than the version we are comparing with * * @param String versionWeHave - version we have * @param String versionWeAreComparingWith - version we want to compare with * * @return Boolean - The result of versionWeHave > versionWeAreComparingWith */ greaterThan: greaterThan, /** * Uses Mozilla's Version Comparator Component to identify whether the version * we have is less than the version we are comparing with * * @param String versionWeHave - version we have * @param String versionWeAreComparingWith - version we want to compare with * * @return Boolean - The result of versionWeHave < versionWeAreComparingWith */ lessThan: lessThan, /** * Uses Mozilla's Version Comparator Component to identify whether an executable version * meets the required version specified * * @param String executable - version of the executable * @param String minimumVersion - version we want to compare with * * @return Boolean - True if the executable version meets the minimum version required, * false if it does not or it does not exist, or if a version was not * parseable from its output */ versionFoundMeetsMinimumVersionRequired: versionFoundMeetsMinimumVersionRequired }; enigmail-2.0.8/package/webKey.jsm000066400000000000000000000213711334302754500166540ustar00rootroot00000000000000/*global Components: false */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ /* eslint no-invalid-this: 0 */ /** * This module serves to integrate WKS (Webkey service) into Enigmail */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailWks"]; const Cu = Components.utils; const Cc = Components.classes; const Ci = Components.interfaces; Cu.import("resource://enigmail/files.jsm"); /* global EnigmailFiles: false */ Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ Cu.import("resource://enigmail/core.jsm"); /*global EnigmailCore: false */ Cu.import("resource://enigmail/execution.jsm"); /*global EnigmailExecution: false */ Cu.import("resource://enigmail/gpgAgent.jsm"); /*global EnigmailGpgAgent: false */ Cu.import("resource://enigmail/stdlib.jsm"); /*global EnigmailStdlib: false */ Cu.import("resource://enigmail/send.jsm"); /*global EnigmailSend: false */ Cu.import("resource://enigmail/msgCompFields.jsm"); /*global EnigmailMsgCompFields: false */ Cu.import("resource://enigmail/constants.jsm"); /*global EnigmailConstants: false */ const GPG_WKS_CLIENT = "gpg-wks-client"; var EnigmailWks = { wksClientPath: null, /** * Get WKS Client path (gpg-wks-client) * * @param window : Object - parent window for dialog display * @param cb : Function(retValue) - callback function. * retValue: nsIFile Object to gpg-wks-client executable or NULL * @return : Object - NULL or a process handle */ getWksClientPathAsync: function(window, cb) { EnigmailLog.DEBUG("webKey.jsm: getWksClientPathAsync\n"); if (EnigmailWks.wksClientPath === null) { let listener = EnigmailExecution.newSimpleListener(null, function(ret) { if (ret === 0) { try { let stdout = listener.stdoutData; let libexecdir = /^libexecdir:(.+?)$/m.exec(stdout)[1]; if (libexecdir) { libexecdir = libexecdir.replace(/%3a/gi, ":"); } else { libexecdir = ""; } let wks_client = checkIfExists(libexecdir, GPG_WKS_CLIENT); if (!wks_client) { let bindir = /^bindir:(.+?)$/m.exec(stdout)[1]; if (bindir) { bindir = bindir.replace(/%3a/gi, ":"); } else { bindir = ""; } wks_client = checkIfExists(bindir, GPG_WKS_CLIENT); if (!wks_client) { cb(null); return; } } EnigmailWks.wksClientPath = wks_client; cb(wks_client); } catch (e) { EnigmailLog.DEBUG("webKey.jsm: getWksClientPathAsync: " + e.toString() + "\n"); cb(null); } } else { cb(null); } }); return EnigmailExecution.execStart(EnigmailGpgAgent.gpgconfPath, ["--list-dirs"], false, window, listener, { value: null }); } else { cb(EnigmailWks.wksClientPath); return null; } }, /** * Determine if WKS is supported by email provider * * @param email : String - user's email address * @param window: Object - parent window of dialog display * @param cb : Function(retValue) - callback function. * retValue: Boolean: true if WKS is supported / false otherwise * @return : Object - process handle */ isWksSupportedAsync: function(email, window, cb) { EnigmailLog.DEBUG("webKey.jsm: isWksSupportedAsync: email = " + email + "\n"); return EnigmailWks.getWksClientPathAsync(window, function(wks_client) { if (wks_client === null) { cb(false); } let listener = EnigmailExecution.newSimpleListener(null, function(ret) { cb(ret === 0); }); let proc = EnigmailExecution.execStart(wks_client, ["--supported", email], false, window, listener, { value: null }); if (proc === null) { cb(false); } }); }, /** * Submit a key to the email provider (= send publication request) * * @param ident : nsIMsgIdentity - user's ID * @param key : Enigmail KeyObject of user's key * @param window: Object - parent window of dialog display * @param cb : Function(retValue) - callback function. * retValue: Boolean: true if submit was successful / false otherwise * @return : Object - process handle */ submitKey: function(ident, key, window, cb) { EnigmailLog.DEBUG("webKey.jsm: submitKey: email = " + ident.email + "\n"); return EnigmailWks.getWksClientPathAsync(window, function(wks_client) { if (wks_client === null) { cb(false); return null; } let listener = EnigmailExecution.newSimpleListener(null, function(ret) { if (ret !== 0) { cb(false); return; } EnigmailLog.DEBUG("webKey.jsm: submitKey: send " + listener.stdoutData + "\n"); let si = EnigmailMsgCompFields.createObject(null); let subject = listener.stdoutData.match(/^Subject:[ \t]*(.+)$/im); let to = listener.stdoutData.match(/^To:[ \t]*(.+)$/im); if (subject !== null && to !== null) { EnigmailMsgCompFields.setValue(si, "sendFlags", EnigmailConstants.SEND_VERBATIM); if (!EnigmailSend.simpleSendMessage({ urls: [], identity: ident, to: to[1], subject: subject[1], securityInfo: si }, listener.stdoutData, cb )) { cb(false); } } else { cb(false); } }); return EnigmailExecution.execStart(wks_client, ["--create", key.fpr, ident.email], false, window, listener, { value: null }); }); }, /** * Submit a key to the email provider (= send publication request) * * @param ident : nsIMsgIdentity - user's ID * @param body : String - complete message source of the confirmation-request email obtained * from the email provider * @param window: Object - parent window of dialog display * @param cb : Function(retValue) - callback function. * retValue: Boolean: true if submit was successful / false otherwise * @return : Object - process handle */ confirmKey: function(ident, body, window, cb) { var sanitized = body.replace(/\r?\n/g, "\r\n"); EnigmailLog.DEBUG("webKey.jsm: confirmKey: ident=" + ident.email + "\n"); return EnigmailWks.getWksClientPathAsync(window, function(wks_client) { if (wks_client === null) { if (cb) { cb(false); } return; } let listener = EnigmailExecution.newSimpleListener(function(pipe) { try { pipe.write(sanitized); pipe.close(); } catch (e) { if (cb) { cb(false); } EnigmailLog.DEBUG(e + "\n"); } }, function(ret) { try { let si = EnigmailMsgCompFields.createObject(null); let subject = listener.stdoutData.match(/^Subject:[ \t]*(.+)$/im); let to = listener.stdoutData.match(/^To:[ \t]*(.+)$/im); if (subject !== null && to !== null) { EnigmailMsgCompFields.setValue(si, "sendFlags", EnigmailConstants.SEND_VERBATIM); if (!EnigmailSend.simpleSendMessage({ urls: [], identity: ident, to: to[1], subject: subject[1], securityInfo: si }, listener.stdoutData, cb )) { cb(false); } } } catch (e) { if (cb) { cb(false); } EnigmailLog.DEBUG(e + "\n"); } }); EnigmailExecution.execStart(wks_client, ["--receive"], false, window, listener, { value: null }); }); } }; /** * Check if a file exists and is executable * * @param path: String - directory name * @param execFileName: String - executable name * * @return Object - nsIFile if file exists; NULL otherwise */ function checkIfExists(path, execFileName) { EnigmailLog.DEBUG("webKey.jsm checkIfExists() path=" + path + " execFileName=" + execFileName + "\n"); let file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile); execFileName = EnigmailFiles.potentialWindowsExecutable(execFileName); EnigmailFiles.initPath(file, path); file.append(execFileName); if (file.exists() && file.isExecutable()) { return file; } else { return null; } } enigmail-2.0.8/package/windows.jsm000066400000000000000000000527701334302754500171270ustar00rootroot00000000000000/*global Components: false, escape: false */ /*jshint -W097 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailWindows"]; const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ Cu.import("resource://enigmail/core.jsm"); /*global EnigmailCore: false */ Cu.import("resource://enigmail/locale.jsm"); /*global EnigmailLocale: false */ Cu.import("resource://enigmail/keyRing.jsm"); /*global EnigmailKeyRing: false */ Cu.import("resource://enigmail/rules.jsm"); /*global EnigmailRules: false */ Cu.import("resource://enigmail/app.jsm"); /*global EnigmailApp: false */ Cu.import("resource://enigmail/pEpAdapter.jsm"); /*global EnigmailPEPAdapter: false */ Cu.import("resource://gre/modules/PromiseUtils.jsm"); /* global PromiseUtils: false */ Cu.import("resource://enigmail/stdlib.jsm"); /* global EnigmailStdlib: false */ const APPSHELL_MEDIATOR_CONTRACTID = "@mozilla.org/appshell/window-mediator;1"; const APPSHSVC_CONTRACTID = "@mozilla.org/appshell/appShellService;1"; const LOCAL_FILE_CONTRACTID = "@mozilla.org/file/local;1"; const IOSERVICE_CONTRACTID = "@mozilla.org/network/io-service;1"; var EnigmailWindows = { /** * Display the OpenPGP setup wizard window * * win : nsIWindow - the parent window * skipIntro: Boolean - optional, if true, skip the introduction page * * no return value */ openSetupWizard: function(win, skipIntro) { EnigmailLog.DEBUG("windows.jsm: openSetupWizard()\n"); if (!EnigmailStdlib.hasConfiguredAccounts()) { EnigmailLog.DEBUG("windows.jsm: openSetupWizard: no configured accounts\n"); return; } let param = ""; if (skipIntro) { param = "?skipIntro=true"; } win.open("chrome://enigmail/content/enigmailSetupWizard.xul" + param, "", "chrome,centerscreen,resizable"); }, /** * Open a window, or focus it if it is already open * * @winName : String - name of the window; used to identify if it is already open * @spec : String - window URL (e.g. chrome://enigmail/content/test.xul) * @winOptions: String - window options as defined in nsIWindow.open * @optObj : any - an Object, Array, String, etc. that is passed as parameter * to the window */ openWin: function(winName, spec, winOptions, optObj) { var windowManager = Cc[APPSHELL_MEDIATOR_CONTRACTID].getService(Ci.nsIWindowMediator); var winEnum = windowManager.getEnumerator(null); var recentWin = null; while (winEnum.hasMoreElements() && !recentWin) { var thisWin = winEnum.getNext(); if (thisWin.location.href == spec) { recentWin = thisWin; break; } if (winName && thisWin.name && thisWin.name == winName) { thisWin.focus(); break; } } if (recentWin) { recentWin.focus(); } else { var appShellSvc = Cc[APPSHSVC_CONTRACTID].getService(Ci.nsIAppShellService); var domWin = appShellSvc.hiddenDOMWindow; try { domWin.open(spec, winName, "chrome," + winOptions, optObj); } catch (ex) { domWin = windowManager.getMostRecentWindow(null); domWin.open(spec, winName, "chrome," + winOptions, optObj); } } }, /** * Determine the best possible window to serve as parent window for dialogs. * * @return: nsIWindow object */ getBestParentWin: function() { var windowManager = Cc[APPSHELL_MEDIATOR_CONTRACTID].getService(Ci.nsIWindowMediator); var bestFit = null; var winEnum = windowManager.getEnumerator(null); while (winEnum.hasMoreElements()) { var thisWin = winEnum.getNext(); if (thisWin.location.href.search(/\/messenger.xul$/) > 0) { bestFit = thisWin; } if (!bestFit && thisWin.location.href.search(/\/messengercompose.xul$/) > 0) { bestFit = thisWin; } } if (!bestFit) { winEnum = windowManager.getEnumerator(null); bestFit = winEnum.getNext(); } return bestFit; }, /** * Iterate through the frames of a window and return the first frame with a * matching name. * * @win: nsIWindow - XUL window to search * @frameName: String - name of the frame to seach * * @return: the frame object or null if not found */ getFrame: function(win, frameName) { EnigmailLog.DEBUG("windows.jsm: getFrame: name=" + frameName + "\n"); for (var j = 0; j < win.frames.length; j++) { if (win.frames[j].name == frameName) { return win.frames[j]; } } return null; }, getMostRecentWindow: function() { var windowManager = Cc[APPSHELL_MEDIATOR_CONTRACTID].getService(Ci.nsIWindowMediator); return windowManager.getMostRecentWindow(null); }, /** * Display the key help window * * @source - |string| containing the name of the file to display * * no return value */ openHelpWindow: function(source) { EnigmailWindows.openWin("enigmail:help", "chrome://enigmail/content/enigmailHelp.xul?src=" + source, "centerscreen,resizable"); }, /** * Display the "About Enigmail" window * * no return value */ openAboutWindow: function() { EnigmailWindows.openMailTab("chrome://enigmail/content/aboutEnigmail.html"); }, /** * Open the Enigmail Documentation page in a new window * * no return value */ openEnigmailDocu: function(parent) { if (!parent) { parent = this.getMostRecentWindow(); } parent.open("https://enigmail.net/faq/docu.php", "", "chrome,width=600,height=500,resizable"); }, /** * Display the Per-Recipient Rules editor window * * no return value */ openRulesEditor: function() { EnigmailWindows.openWin("enigmail:rulesEditor", "chrome://enigmail/content/enigmailRulesEditor.xul", "dialog,centerscreen,resizable"); }, /** * Display the OpenPGP key manager window * * no return value */ openKeyManager: function(win) { EnigmailCore.getService(win); EnigmailWindows.openWin("enigmail:KeyManager", "chrome://enigmail/content/enigmailKeyManager.xul", "resizable"); }, /** * If the Key Manager is open, dispatch an event to tell the key * manager to refresh the displayed keys */ keyManReloadKeys: function() { let windowManager = Cc[APPSHELL_MEDIATOR_CONTRACTID].getService(Ci.nsIWindowMediator); const winName = "enigmail:KeyManager"; const spec = "chrome://enigmail/content/enigmailKeygen.xul"; let winEnum = windowManager.getEnumerator(null); let recentWin = null; while (winEnum.hasMoreElements() && !recentWin) { let thisWin = winEnum.getNext(); if (thisWin.location.href == spec) { recentWin = thisWin; break; } if (thisWin.name && thisWin.name == winName) { let evt = new thisWin.Event("reload-keycache", { "bubbles": true, "cancelable": false }); thisWin.dispatchEvent(evt); break; } } }, /** * Display the key creation window * * no return value */ openKeyGen: function() { EnigmailWindows.openWin("enigmail:generateKey", "chrome://enigmail/content/enigmailKeygen.xul", "chrome,resizable=yes"); }, /** * Display the card details window * * no return value */ openCardDetails: function() { EnigmailWindows.openWin("enigmail:cardDetails", "chrome://enigmail/content/enigmailCardDetails.xul", "centerscreen"); }, /** * Display the console log window * * @win - |object| holding the parent window for the dialog * * no return value */ openConsoleWindow: function() { EnigmailWindows.openWin("enigmail:console", "chrome://enigmail/content/enigmailConsole.xul", "resizable,centerscreen"); }, /** * Display the window for the debug log file * * @win - |object| holding the parent window for the dialog * * no return value */ openDebugLog: function(win) { EnigmailWindows.openWin("enigmail:logFile", "chrome://enigmail/content/enigmailViewFile.xul?viewLog=1&title=" + escape(EnigmailLocale.getString("debugLog.title")), "resizable,centerscreen"); }, /** * Display the preferences dialog * * @win - |object| holding the parent window for the dialog * @showBasic - |boolean| true if only the 1st page of the preferences window * should be displayed / false otherwise * @selectTab - |string| ID of the tab element (in XUL) to display when opening * * no return value */ openPrefWindow: function(win, showBasic, selectTab) { EnigmailLog.DEBUG("windows.js: openPrefWindow\n"); EnigmailCore.getService(win, true); // true: starting preferences dialog let url; if (EnigmailPEPAdapter.usingPep()) { url = "chrome://enigmail/content/pref-pep.xul"; } else { url = "chrome://enigmail/content/pref-enigmail.xul"; } win.openDialog(url, "_blank", "chrome,resizable=yes", { 'showBasic': showBasic, 'clientType': 'thunderbird', 'selectTab': selectTab }); }, /** * Display the dialog for creating a new per-recipient rule * * @win - |object| holding the parent window for the dialog * @emailAddress - |string| containing the email address for the rule * * @return - always true */ createNewRule: function(win, emailAddress) { // make sure the rules database is loaded const enigmailSvc = EnigmailCore.getService(win); if (!enigmailSvc) { return false; } // open rule dialog EnigmailRules.getRulesData({}); const inputObj = { toAddress: "{" + emailAddress + "}", options: "", command: "add" }; win.openDialog("chrome://enigmail/content/enigmailSingleRcptSettings.xul", "", "dialog,modal,centerscreen,resizable", inputObj, {}); return true; }, /** * Display the dialog for changing the expiry date of one or several keys * * @win - |object| holding the parent window for the dialog * @userIdArr - |array| of |strings| containing the User IDs * @keyIdArr - |array| of |strings| containing the key IDs (eg. "0x12345678") to change * * @return Boolean - true if expiry date was changed; false otherwise */ editKeyExpiry: function(win, userIdArr, keyIdArr) { const inputObj = { keyId: keyIdArr, userId: userIdArr }; const resultObj = { refresh: false }; win.openDialog("chrome://enigmail/content/enigmailEditKeyExpiryDlg.xul", "", "dialog,modal,centerscreen,resizable", inputObj, resultObj); return resultObj.refresh; }, /** * Display the dialog for changing key trust of one or several keys * * @win - |object| holding the parent window for the dialog * @userIdArr - |array| of |strings| containing the User IDs * @keyIdArr - |array| of |strings| containing the key IDs (eg. "0x12345678") to change * * @return Boolean - true if key trust was changed; false otherwise */ editKeyTrust: function(win, userIdArr, keyIdArr) { const inputObj = { keyId: keyIdArr, userId: userIdArr }; const resultObj = { refresh: false }; win.openDialog("chrome://enigmail/content/enigmailEditKeyTrustDlg.xul", "", "dialog,modal,centerscreen,resizable", inputObj, resultObj); return resultObj.refresh; }, /** * Display the dialog for signing a key * * @win - |object| holding the parent window for the dialog * @userId - |string| containing the User ID (for displaing in the dialog only) * @keyId - |string| containing the key ID (eg. "0x12345678") * * @return Boolean - true if key was signed; false otherwise */ signKey: function(win, userId, keyId) { const inputObj = { keyId: keyId, userId: userId }; const resultObj = { refresh: false }; win.openDialog("chrome://enigmail/content/enigmailSignKeyDlg.xul", "", "dialog,modal,centerscreen,resizable", inputObj, resultObj); return resultObj.refresh; }, /** * Display the photo ID associated with a key * * @win - |object| holding the parent window for the dialog * @keyId - |string| containing the key ID (eg. "0x12345678") * @userId - |string| containing the User ID (for displaing in the dialog only) * @photoNumber - |number| UAT entry in the squence of appearance in the key listing, starting with 0 * no return value */ showPhoto: function(win, keyId, userId, photoNumber) { const enigmailSvc = EnigmailCore.getService(win); if (enigmailSvc) { if (!photoNumber) photoNumber = 0; if (keyId.search(/^0x/) < 0) { keyId = "0x" + keyId; } let exitCodeObj = {}; let photoFile = EnigmailKeyRing.getPhotoFile(keyId, photoNumber, exitCodeObj, {}); if (photoFile && exitCodeObj.value === 0) { if (!(photoFile.isFile() && photoFile.isReadable())) { EnigmailWindows.alert(win, EnigmailLocale.getString("error.photoPathNotReadable", photoFile.path)); } else { const photoUri = Cc[IOSERVICE_CONTRACTID].getService(Ci.nsIIOService). newFileURI(photoFile).spec; const argsObj = { photoUri: photoUri, userId: userId, keyId: keyId }; win.openDialog("chrome://enigmail/content/enigmailDispPhoto.xul", photoUri, "chrome,modal,resizable,dialog,centerscreen", argsObj); try { // delete the photo file photoFile.remove(false); } catch (ex) {} } } else { EnigmailWindows.alert(win, EnigmailLocale.getString("noPhotoAvailable")); } } }, /** * Display the OpenPGP Key Details window * * @win - |object| holding the parent window for the dialog * @keyId - |string| containing the key ID (eg. "0x12345678") * @refresh - |boolean| if true, cache is cleared and the key data is loaded from GnuPG * * @return Boolean - true: keylist needs to be refreshed * - false: no need to refresh keylist */ openKeyDetails: function(win, keyId, refresh) { const keyListObj = {}; if (!win) { win = this.getBestParentWin(); } keyId = keyId.replace(/^0x/, ""); if (refresh) { EnigmailKeyRing.clearCache(); } const inputObj = { keyId: keyId }; const resultObj = { refresh: false }; win.openDialog("chrome://enigmail/content/keyDetailsDlg.xul", "", "dialog,modal,centerscreen,resizable", inputObj, resultObj); if (resultObj.refresh) { EnigmailKeyRing.clearCache(); } return resultObj.refresh; }, /** * Display the dialog to search and/or download key(s) from a keyserver * * @win - |object| holding the parent window for the dialog * @inputObj - |object| with member searchList (|string| containing the keys to search) * @resultObj - |object| with member importedKeys (|number| containing the number of imporeted keys) * * no return value */ downloadKeys: function(win, inputObj, resultObj) { EnigmailLog.DEBUG("windows.jsm: downloadKeys: searchList=" + inputObj.searchList + "\n"); resultObj.importedKeys = 0; const ioService = Cc[IOSERVICE_CONTRACTID].getService(Ci.nsIIOService); if (ioService && ioService.offline) { EnigmailWindows.alert(win, EnigmailLocale.getString("needOnline")); return; } let valueObj = {}; if (inputObj.searchList) { valueObj = { keyId: "<" + inputObj.searchList.join("> <") + ">" }; } const keysrvObj = {}; if (inputObj.searchList && inputObj.autoKeyServer) { keysrvObj.value = inputObj.autoKeyServer; } else { win.openDialog("chrome://enigmail/content/enigmailKeyserverDlg.xul", "", "dialog,modal,centerscreen", valueObj, keysrvObj); } if (!keysrvObj.value) { return; } inputObj.keyserver = keysrvObj.value; if (!inputObj.searchList) { const searchval = keysrvObj.email. replace(/^(\s*)(.*)/, "$2"). replace(/\s+$/, ""); // trim spaces // special handling to convert fingerprints with spaces into fingerprint without spaces if (searchval.length == 49 && searchval.match(/^[0-9a-fA-F ]*$/) && searchval[4] == ' ' && searchval[9] == ' ' && searchval[14] == ' ' && searchval[19] == ' ' && searchval[24] == ' ' && searchval[29] == ' ' && searchval[34] == ' ' && searchval[39] == ' ' && searchval[44] == ' ') { inputObj.searchList = ["0x" + searchval.replace(/ /g, "")]; } else if (searchval.length == 40 && searchval.match(/^[0-9a-fA-F ]*$/)) { inputObj.searchList = ["0x" + searchval]; } else if (searchval.length == 8 && searchval.match(/^[0-9a-fA-F]*$/)) { // special handling to add the required leading 0x when searching for keys inputObj.searchList = ["0x" + searchval]; } else if (searchval.length == 16 && searchval.match(/^[0-9a-fA-F]*$/)) { inputObj.searchList = ["0x" + searchval]; } else { inputObj.searchList = searchval.split(/[,; ]+/); } } win.openDialog("chrome://enigmail/content/enigmailSearchKey.xul", "", "dialog,modal,centerscreen", inputObj, resultObj); }, /** * Open the Trustwords dialog for a specific pair of keys * * @param win: Object - nsIWindow * @param emailAddress: String - Email address of peer to verify * @param headerData: either: Object - nsIMsgHdr object for the message (to identify the ideal own identity) * or: String - own email address to compare with * * @return: Promise (resolve() case of success; rejection otherwise). */ verifyPepTrustWords: function(win, emailAddress, headerData) { let deferred = PromiseUtils.defer(); EnigmailPEPAdapter.prepareTrustWordsDlg(emailAddress, headerData). then(function _ok(inputObj) { win.openDialog("chrome://enigmail/content/pepTrustWords.xul", "", "dialog,modal,centerscreen", inputObj); deferred.resolve(); }). catch(function _err(errorMsg) { switch (errorMsg) { case "cannotVerifyOwnId": EnigmailWindows.alert(win, EnigmailLocale.getString("pepTrustWords.cannotVerifyOwnId")); break; case "cannotFindKey": EnigmailWindows.alert(win, EnigmailLocale.getString("pepTrustWords.cannotFindKey", emailAddress)); break; default: EnigmailWindows.alert(win, EnigmailLocale.getString("pepTrustWords.generalFailure", emailAddress)); break; } deferred.reject(); }); return deferred.promise; }, pepHandshake: function(window, direction, myself, peers) { let inputObj = { myself: myself, peers: peers, direction: direction }; window.openDialog("chrome://enigmail/content/pepHandshake.xul", "", "dialog,modal,centerscreen", inputObj); }, /** * Display Autocrypt Setup Passwd dialog. * * @param dlgMode: String - dialog mode: "input" / "display" * @param passwdType: String - type of password ("numeric9x4" / "generic") * @param password: String - password or initial two digits of password * * @return String entered password (in input mode) or NULL */ autocryptSetupPasswd: function(window, dlgMode, passwdType = "numeric9x4", password) { if (!window) { window = this.getBestParentWin(); } let inputObj = { password: null, passwdType: passwdType, dlgMode: dlgMode }; if (password) inputObj.initialPasswd = password; window.openDialog("chrome://enigmail/content/autocryptSetupPasswd.xul", "", "dialog,modal,centerscreen", inputObj); return inputObj.password; }, /** * Display dialog to initiate the Autocrypt Setup Message. * */ inititateAcSetupMessage: function(window) { if (!window) { window = this.getBestParentWin(); } window.openDialog("chrome://enigmail/content/autocryptInitiateBackup.xul", "", "dialog,centerscreen"); }, /** * Open a URL in a tab on the main window. The URL can either be a web page * (e.g. https://enigmail.net/ or a chrome document (e.g. chrome://enigmail/content/x.xul)) * * @param aURL: String - the URL to open * @param winName: String - name of the window; used to identify if it is already open */ openMailTab: function(aURL, windowName) { if (!EnigmailApp.isSuite()) { let tabs = EnigmailStdlib.getMail3Pane().document.getElementById("tabmail"); for (let i = 0; i < tabs.tabInfo.length; i++) { if ("openedUrl" in tabs.tabInfo[i] && tabs.tabInfo[i].openedUrl.startsWith(aURL)) { tabs.switchToTab(i); return; } } let gotTab = tabs.openTab("chromeTab", { chromePage: aURL }); gotTab.openedUrl = aURL; } else { EnigmailWindows.openWin(windowName, aURL, "resizable,centerscreen"); } }, shutdown: function(reason) { EnigmailLog.DEBUG("windows.jsm: shutdown()\n"); let tabs = EnigmailStdlib.getMail3Pane().document.getElementById("tabmail"); for (let i = tabs.tabInfo.length - 1; i >= 0; i--) { if ("openedUrl" in tabs.tabInfo[i] && tabs.tabInfo[i].openedUrl.startsWith("chrome://enigmail/")) { tabs.closeTab(tabs.tabInfo[i]); } } } }; enigmail-2.0.8/package/wkdLookup.jsm000066400000000000000000000225601334302754500174060ustar00rootroot00000000000000/*global Components: false*/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; /** * Lookup keys by email addresses using WKD. A an email address is lookep up at most * once a day. (see https://tools.ietf.org/html/draft-koch-openpgp-webkey-service) */ var EXPORTED_SYMBOLS = ["EnigmailWkdLookup"]; const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; Cu.importGlobalProperties(["XMLHttpRequest"]); Cu.import("resource://gre/modules/Sqlite.jsm"); /* global Sqlite: false */ Cu.import("resource://enigmail/log.jsm"); /* global EnigmailLog: false*/ Cu.import("resource://enigmail/funcs.jsm"); /* global EnigmailFuncs: false*/ Cu.import("resource://gre/modules/PromiseUtils.jsm"); /* global PromiseUtils: false */ Cu.import("resource://enigmail/keyRing.jsm"); /*global EnigmailKeyRing: false */ Cu.import("resource://enigmail/zbase32.jsm"); /*global EnigmailZBase32: false */ Cu.import("resource://enigmail/openpgp.jsm"); /*global EnigmailOpenPGP: false */ Cu.import("resource://enigmail/key.jsm"); /*global EnigmailKey: false */ Cu.import("resource://enigmail/data.jsm"); /*global EnigmailData: false */ var EnigmailWkdLookup = { /** * Try to import keys using WKD. Found keys are automatically imported * * @param emailList: Array - of email addresses (in lowercase) * * @return Promise() (Boolean): true - new keys found */ findKeys: function(emails) { return new Promise((resolve, reject) => { EnigmailLog.DEBUG("wkdLookup.jsm: findKeys(" + emails.join(",") + ")\n"); if (emails.length === 0) { resolve(false); return; } let self = this; // do a little sanity test such that we don't do the lookup for nothing too often for (let e of emails) { if (e.search(/.@.+\...+$/) < 0) { resolve(false); return; } } Promise.all(emails.map( function(mailAddr) { return self.determineLastAttempt(mailAddr.trim().toLowerCase()); })) .then(function(checks) { let toCheck = []; EnigmailLog.DEBUG("wkdLookup.jsm: findKeys: checks " + checks.length + "\n"); for (let i = 0; i < checks.length; i++) { if (checks[i]) { EnigmailLog.DEBUG("wkdLookup.jsm: findKeys: recheck " + emails[i] + "\n"); toCheck.push(emails[i]); } else { EnigmailLog.DEBUG("wkdLookup.jsm: findKeys: skip check " + emails[i] + "\n"); } } if (toCheck.length > 0) { Promise.all(toCheck.map((email) => { return self.downloadWkdKey(email); })).then((dataArr) => { let gotKeys = []; for (let i = 0; i < dataArr.length; i++) { if (dataArr[i] !== null) { gotKeys.push(dataArr[i]); } } if (gotKeys.length > 0) { importDownloadedKeys(gotKeys); resolve(true); } else resolve(false); }); } else { resolve(false); } }) .catch(() => { resolve(false); }); }); }, /** * Determine for an email address when we last attempted to * obtain a key via wkd * * @param email: String - email address * * @return Promise: true if new WKD lookup required */ determineLastAttempt: function(email) { EnigmailLog.DEBUG("wkdLookup.jsm: determineLastAttempt(" + email + ")\n"); let conn; return Sqlite.openConnection({ path: "enigmail.sqlite", sharedMemoryCache: false }).then(function onConnection(connection) { conn = connection; return checkDatabaseStructure(conn); }, function onError(error) { EnigmailLog.DEBUG("wkdLookup.jsm: determineLastAttempt: could not open database\n"); }).then(function _f() { return timeForRecheck(conn, email); }).then(function _done(val) { EnigmailLog.DEBUG("wkdLookup.jsm: OK - closing connection\n"); conn.close(); return Promise.resolve(val); }).catch(function _err(reason) { EnigmailLog.DEBUG("wkdLookup.jsm: error - closing connection: " + reason + "\n"); conn.close(); // in case something goes wrong we recheck anyway return Promise.resolve(true); }); }, /** * get the WKD URL for an email address * * @param email: String - email address * * @return String: URL (or null if not possible) */ getWkdUrlFromEmail: function(email) { email = email.toLowerCase().trim(); let at = email.indexOf("@"); let domain = email.substr(at + 1); let user = email.substr(0, at); var converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"]. createInstance(Ci.nsIScriptableUnicodeConverter); converter.charset = "UTF-8"; var data = converter.convertToByteArray(user, {}); var ch = Components.classes["@mozilla.org/security/hash;1"].createInstance(Components.interfaces.nsICryptoHash); ch.init(ch.SHA1); ch.update(data, data.length); let gotHash = ch.finish(false); let encodedHash = EnigmailZBase32.encode(gotHash); let url = "https://" + domain + "/.well-known/openpgpkey/hu/" + encodedHash; return url; }, downloadWkdKey: function(email) { EnigmailLog.DEBUG("wkdLookup.jsm: downloadWkdKey(" + email + ")\n"); return new Promise((resolve, reject) => { let oReq = new XMLHttpRequest(); oReq.addEventListener("load", function _f() { EnigmailLog.DEBUG("wkdLookup.jsm: downloadWkdKey: data for " + email + "\n"); try { let keyData = EnigmailData.arrayBufferToString(oReq.response); resolve(keyData); } catch (ex) { EnigmailLog.DEBUG("wkdLookup.jsm: downloadWkdKey: error " + ex.toString() + "\n"); resolve(null); } }); oReq.addEventListener("error", (e) => { EnigmailLog.DEBUG("wkdLookup.jsm: downloadWkdKey: error for " + email + "\n"); EnigmailLog.DEBUG(" got error: " + e + "\n"); resolve(null); }, false); oReq.overrideMimeType("application/octet-stream"); oReq.responseType = "arraybuffer"; oReq.open("GET", EnigmailWkdLookup.getWkdUrlFromEmail(email)); oReq.send(); }); } }; /** * Ensure that the database has the wkd_lookup_timestamp table. * * @param connection: Object - SQLite connection * * @return Promise */ function checkDatabaseStructure(connection) { EnigmailLog.DEBUG("wkdLookup.jsm: checkDatabaseStructure\n"); return connection.tableExists("wkd_lookup_timestamp").then( function onSuccess(exists) { EnigmailLog.DEBUG("wkdLookup.jsm: checkDatabaseStructure - success\n"); if (!exists) { return createAutoKeyLocateTable(connection); } else { return PromiseUtils.defer(); } }, function onError(error) { EnigmailLog.DEBUG("wkdLookup.jsm: checkDatabaseStructure - error\n"); Promise.reject(error); }); } /** * Create the "wkd_lookup_timestamp" table. * * @param connection: Object - SQLite connection * * @return Promise */ function createAutoKeyLocateTable(connection) { EnigmailLog.DEBUG("wkdLookup.jsm: createAutoKeyLocateTable\n"); return connection.execute( "create table wkd_lookup_timestamp (" + "email text not null primary key, " + // email address of correspondent "last_seen integer);"); // timestamp of last mail received for the email/type combination } /** * Check if enough time has passed since we looked-up the key for "email". * * @param connection: Object - SQLite connection * @param email: String - Email address to search (in lowercase) * * @return Promise (true if new lookup required) */ function timeForRecheck(connection, email) { EnigmailLog.DEBUG("wkdLookup.jsm: timeForRecheck\n"); let obj = { email: email, now: Date.now() }; return connection.execute( "select count(*) from wkd_lookup_timestamp where email = :email and :now - last_seen < 60*60*24", obj ).then(function(val) { return connection.execute( "insert or replace into wkd_lookup_timestamp values (:email, :now)", obj ).then(function() { return Promise.resolve(val); }); }).then(function(rows) { EnigmailLog.DEBUG("wkdLookup.jsm: timeForRecheck: " + rows.length + "\n"); return rows.length === 1 && rows[0].getResultByIndex(0) === 0; }, function(error) { EnigmailLog.DEBUG("wkdLookup.jsm: timeForRecheck - error" + error + "\n"); Promise.reject(error); }); } function importDownloadedKeys(keysArr) { EnigmailLog.DEBUG("wkdLookup.jsm: importDownloadedKeys(" + keysArr.length + ")\n"); let keyData = ""; for (let k in keysArr) { try { keyData += EnigmailOpenPGP.enigmailFuncs.bytesToArmor(EnigmailOpenPGP.openpgp.enums.armor.public_key, keysArr[k]); } catch (ex) { EnigmailLog.DEBUG("wkdLookup.jsm: importDownloadedKeys: exeption=" + ex + "\n"); } } let keyList = EnigmailKey.getKeyListFromKeyBlock(keyData, {}, false); for (let k in keyList) { EnigmailLog.DEBUG("wkdLookup.jsm: importDownloadedKeys: fpr=" + keyList[k].fpr + "\n"); } EnigmailKeyRing.importKey(null, false, keyData, "", {}, {}); } enigmail-2.0.8/package/wksMimeHandler.jsm000066400000000000000000000151311334302754500203350ustar00rootroot00000000000000/*global Components: false */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailWksMimeHandler"]; /** * Module for handling response messages from OpenPGP Web Key Service */ const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; Cu.import("resource://gre/modules/XPCOMUtils.jsm"); /*global XPCOMUtils: false */ Cu.import("resource://enigmail/mimeVerify.jsm"); /*global EnigmailVerify: false */ Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ Cu.import("resource://enigmail/locale.jsm"); /*global EnigmailLocale: false */ Cu.import("resource://enigmail/decryption.jsm"); /*global EnigmailDecryption: false */ Cu.import("resource://enigmail/singletons.jsm"); /*global EnigmailSingletons: false */ Cu.import("resource://enigmail/constants.jsm"); /*global EnigmailConstants: false */ const APPSHELL_MEDIATOR_CONTRACTID = "@mozilla.org/appshell/window-mediator;1"; var gDebugLog = false; var EnigmailWksMimeHandler = { /*** * register a PGP/MIME verify object the same way PGP/MIME encrypted mail is handled */ registerContentTypeHandler: function() { EnigmailLog.DEBUG("wksMimeHandler.jsm: registerContentTypeHandler()\n"); let reg = Components.manager.QueryInterface(Ci.nsIComponentRegistrar); let pgpMimeClass = Components.classes["@mozilla.org/mimecth;1?type=multipart/encrypted"]; reg.registerFactory( pgpMimeClass, "Enigmail WKD Response Handler", "@mozilla.org/mimecth;1?type=application/vnd.gnupg.wks", null); }, newHandler: function() { EnigmailLog.DEBUG("wksMimeHandler.jsm: newHandler()\n"); let v = new PgpWkdHandler(); return v; } }; // MimeVerify Constructor function PgpWkdHandler(protocol) { this.inStream = Cc["@mozilla.org/scriptableinputstream;1"].createInstance(Ci.nsIScriptableInputStream); } // PgpWkdHandler implementation PgpWkdHandler.prototype = { data: "", mimePartNumber: "", uri: null, backgroundJob: false, QueryInterface: XPCOMUtils.generateQI([Ci.nsIStreamListener]), onStartRequest: function(request, uri) { EnigmailLog.DEBUG("wksMimeHandler.jsm: onStartRequest\n"); // always log this one this.uri = uri ? uri.QueryInterface(Ci.nsIURI).clone() : null; this.mimeSvc = request.QueryInterface(Ci.nsIPgpMimeProxy); if ("mimePart" in this.mimeSvc) { this.mimePartNumber = this.mimeSvc.mimePart; } else { this.mimePartNumber = ""; } this.data = ""; this.msgWindow = EnigmailVerify.lastMsgWindow; this.backgroundJob = false; if (this.uri) { this.backgroundJob = (this.uri.spec.search(/[&?]header=(print|quotebody|enigmailConvert)/) >= 0); } }, onDataAvailable: function(req, sup, stream, offset, count) { LOCAL_DEBUG("wksMimeHandler.jsm: onDataAvailable: " + count + "\n"); if (count > 0) { this.inStream.init(stream); let data = this.inStream.read(count); this.data += data; } }, onStopRequest: function() { EnigmailLog.DEBUG("wksMimeHandler.jsm: onStopRequest\n"); if (this.data.search(/-----BEGIN PGP MESSAGE-----/i) >= 0) { this.decryptChallengeData(); } let jsonStr = this.requestToJsonString(this.data); let msg = ""; if (this.data.search(/^\s*type:\s+confirmation-request/mi) >= 0) { msg = EnigmailLocale.getString("wkdMessage.body.req"); } else { msg = EnigmailLocale.getString("wkdMessage.body.process"); } this.returnData(msg); this.displayStatus(jsonStr); }, decryptChallengeData: function() { EnigmailLog.DEBUG("wksMimeHandler.jsm: decryptChallengeData()\n"); let windowManager = Cc[APPSHELL_MEDIATOR_CONTRACTID].getService(Ci.nsIWindowMediator); let win = windowManager.getMostRecentWindow(null); let statusFlagsObj = {}; let res = EnigmailDecryption.decryptMessage(win, 0, this.data, {}, {}, statusFlagsObj, {}, {}, {}, {}, {}, {}); if (statusFlagsObj.value & EnigmailConstants.DECRYPTION_OKAY) { this.data = res; } EnigmailLog.DEBUG("wksMimeHandler.jsm: decryptChallengeData: decryption result: " + res + "\n"); }, // convert request data into JSON-string and parse it requestToJsonString: function() { // convert let lines = this.data.split(/\r?\n/); let s = '{'; for (let l of lines) { let m = l.match(/^([^\s:]+)(:\s*)([^\s].+)$/); if (m && m.length >= 4) { s += '"' + m[1].trim().toLowerCase() + '": "' + m[3].trim() + '",'; } } let o = {}; s = s.substr(0, s.length - 1) + "}"; return s; }, // return data to libMime returnData: function(message) { EnigmailLog.DEBUG("wksMimeHandler.jsm: returnData():\n"); let msg = 'Content-Type: text/plain; charset="utf-8"\r\n' + 'Content-Transfer-Encoding: 8bit\r\n\r\n' + message + '\r\n'; if ("outputDecryptedData" in this.mimeSvc) { this.mimeSvc.outputDecryptedData(msg, msg.length); } else { let gConv = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(Ci.nsIStringInputStream); gConv.setData(msg, msg.length); try { this.mimeSvc.onStartRequest(null, null); this.mimeSvc.onDataAvailable(null, null, gConv, 0, msg.length); this.mimeSvc.onStopRequest(null, null, 0); } catch (ex) { EnigmailLog.ERROR("wksMimeHandler.jsm: returnData(): mimeSvc.onDataAvailable failed:\n" + ex.toString()); } } }, displayStatus: function(jsonStr) { EnigmailLog.DEBUG("wksMimeHandler.jsm: displayStatus\n"); if (this.msgWindow === null || this.backgroundJob) return; try { LOCAL_DEBUG("wksMimeHandler.jsm: displayStatus displaying result\n"); let headerSink = EnigmailSingletons.messageReader; if (headerSink) { headerSink.processDecryptionResult(this.uri, "wksConfirmRequest", jsonStr, this.mimePartNumber); } } catch (ex) { EnigmailLog.writeException("wksMimeHandler.jsm", ex); } } }; //////////////////////////////////////////////////////////////////// // General-purpose functions, not exported function LOCAL_DEBUG(str) { if (gDebugLog) EnigmailLog.DEBUG(str); } function initModule() { var env = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment); var nspr_log_modules = env.get("NSPR_LOG_MODULES"); var matches = nspr_log_modules.match(/wksMimeHandler:(\d+)/); if (matches && (matches.length > 1)) { if (matches[1] > 2) gDebugLog = true; } } initModule(); enigmail-2.0.8/package/zbase32.jsm000066400000000000000000000043301334302754500166730ustar00rootroot00000000000000/* eslint no-invalid-this: 0 */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; var EXPORTED_SYMBOLS = ["EnigmailZBase32"]; const ZBase32Alphabet = "ybndrfg8ejkmcpqxot1uwisza345h769"; var EnigmailZBase32 = { a: ZBase32Alphabet, pad: "=", /** * Encode a string in Z-Base-32 encoding * * @param str String - input string * * @return String - econded string */ encode: function(str) { let a = this.a; let pad = this.pad; let len = str.length; let o = ""; let w, c, r = 0, sh = 0; for (let i = 0; i < len; i += 5) { // mask top 5 bits c = str.charCodeAt(i); w = 0xf8 & c; o += a.charAt(w >> 3); r = 0x07 & c; sh = 2; if ((i + 1) < len) { c = str.charCodeAt(i + 1); // mask top 2 bits w = 0xc0 & c; o += a.charAt((r << 2) + (w >> 6)); o += a.charAt((0x3e & c) >> 1); r = c & 0x01; sh = 4; } if ((i + 2) < len) { c = str.charCodeAt(i + 2); // mask top 4 bits w = 0xf0 & c; o += a.charAt((r << 4) + (w >> 4)); r = 0x0f & c; sh = 1; } if ((i + 3) < len) { c = str.charCodeAt(i + 3); // mask top 1 bit w = 0x80 & c; o += a.charAt((r << 1) + (w >> 7)); o += a.charAt((0x7c & c) >> 2); r = 0x03 & c; sh = 3; } if ((i + 4) < len) { c = str.charCodeAt(i + 4); // mask top 3 bits w = 0xe0 & c; o += a.charAt((r << 3) + (w >> 5)); o += a.charAt(0x1f & c); r = 0; sh = 0; } } // Calculate length of pad by getting the // number of words to reach an 8th octet. if (r != 0) { o += a.charAt(r << sh); } var padlen = 8 - (o.length % 8); if (padlen === 8) { return o; } if (padlen === 1 || padlen === 3 || padlen === 4 || padlen === 6) { return o + pad.repeat(padlen); } throw 'there was some kind of error:\npadlen:' + padlen + ' ,r:' + r + ' ,sh:' + sh + ', w:' + w; } }; enigmail-2.0.8/provisioning/000077500000000000000000000000001334302754500160425ustar00rootroot00000000000000enigmail-2.0.8/provisioning/Dockerfile000066400000000000000000000025471334302754500200440ustar00rootroot00000000000000# # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. # FROM ubuntu RUN apt-get update RUN apt-get upgrade -y RUN apt-get install -y zip RUN apt-get install -y wget RUN apt-get install -y xvfb RUN apt-get install -y thunderbird RUN apt-get install -y gnupg2 RUN apt-get install -y make RUN apt-get install -y python RUN apt-get install -y gcc RUN apt-get install -y psmisc RUN apt-get install -y language-pack-en-base RUN apt-get install -y mime-support RUN apt-get install -y rng-tools RUN apt-get install -y haveged RUN apt-get install -y nodejs RUN apt-get install -y curl RUN ln -s /usr/bin/nodejs /usr/bin/node RUN apt-get install -y npm RUN npm install -g eslint@2.12 RUN wget -O /tmp/jsunit-0.1.4.xpi https://www.enigmail.net/jsunit/jsunit-0.1.4.xpi RUN rm -rf /usr/lib/thunderbird-addons/extensions/jsunit@enigmail.net RUN unzip /tmp/jsunit-0.1.4.xpi -d /usr/lib/thunderbird-addons/extensions/jsunit@enigmail.net RUN rm -rf '/usr/lib/thunderbird-addons/extensions/{847b3a00-7ab1-11d4-8f02-006008948af5}' RUN echo "/enigmail-src/build/dist" > '/usr/lib/thunderbird-addons/extensions/{847b3a00-7ab1-11d4-8f02-006008948af5}' RUN useradd -Ums /bin/bash testuser WORKDIR /enigmail-src ENV LC_CTYPE en_US.UTF-8 ENV LANG en_US.UTF-8 enigmail-2.0.8/provisioning/README.md000066400000000000000000000053561334302754500173320ustar00rootroot00000000000000# enigmail-provisioning Contains provisioning scripts for developing Enigmail, for Vagrant and Docker If you have problems with permissions on the shared directory, this incantation is useful: chcon -Rt svirt_sandbox_file_t $DIR ## Should I setup with Docker or Vagrant? [Docker](https://www.docker.com) is a linux only virtual environment tool, which means it is easier to setup on a linux host. Mac OS X and Windows hosts will require the setup of a linux virtual machine for Docker to work because it is based on [LinuX Containers (LxC)](https://linuxcontainers.org). Docker’s virtual environments are lightweight versions of virtual machines. They aren’t distinct virtual computers with their own processors and hardware emulation. As a result, virtual environments place only a little extra load on the system. On the other hand, Docker’s isolation is not as good as a full virtual machine’s. Docker allows you to quickly create a specific, semi-isolated environment for short lived testing and debugging. [Vagrant](https://www.vagrantup.com) is a wrapper on top of a full virtual machine. Vagrant is better when you require full isolation, and it is more convenient to use when you already have vagrant tools and you don’t have Docker on your non-linux host machine. ## Quick Setup With Docker Please follow your [OS specific instructions](https://docs.docker.com/installation/#installation) to install docker on your system. Once docker is installed... 1. [Create a docker group.](https://docs.docker.com/installation/ubuntulinux/#create-a-docker-group) Creating this group will keep you from having to use sudo each time you call the docker client. 2. Start the docker daemon. Those platform specific instructions should be in the docker docs after the installation steps. If you created the docker user group in step one, this will be the only step that requires `sudo`. 3. `./provisioning/docker-init.sh` 4. `./provisioning/docker-build.sh` If you have problems with permissions while running this script, check out the `chcon` incantation above. 5. `./provisioning/docker-test.sh` ## Quick Setup With Vagrant Please follow your OS specific instructions to install the following tool dependencies on your system: * [Vagrant](https://www.vagrantup.com) * Vagrant compatible virtualization software (i.e. virtualbox, vmware...) Note: Virtualbox has default support on vagrant so if you use VMWare, AWS, etc. you must first install their respective vagrant plugins. Once the vagrant tools are installed... 1. `cd provisioning` 2. `vagrant up` - Call vagrant to grab an instance of Ubuntu and provision it 3. `vagrant ssh` - ssh into the Ubuntu machine 4. `cd /enigmail-src` - This will be the same directory as the main project folder. 5. `./build.sh ` 6. `./test.sh ` enigmail-2.0.8/provisioning/Vagrantfile000066400000000000000000000065621334302754500202400ustar00rootroot00000000000000# -*- mode: ruby -*- # vi: set ft=ruby : # # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. # # All Vagrant configuration is done below. The "2" in Vagrant.configure # configures the configuration version (we support older styles for # backwards compatibility). Please don't change it unless you know what # you're doing. Vagrant.configure(2) do |config| # The most common configuration options are documented and commented below. # For a complete reference, please see the online documentation at # https://docs.vagrantup.com. # Every Vagrant development environment requires a box. You can search for # boxes at https://atlas.hashicorp.com/search. config.vm.box = "ubuntu/trusty64" # Disable automatic box update checking. If you disable this, then # boxes will only be checked for updates when the user runs # `vagrant box outdated`. This is not recommended. # config.vm.box_check_update = false # Create a forwarded port mapping which allows access to a specific port # within the machine from a port on the host machine. In the example below, # accessing "localhost:8080" will access port 80 on the guest machine. # config.vm.network "forwarded_port", guest: 80, host: 8080 # Create a private network, which allows host-only access to the machine # using a specific IP. # config.vm.network "private_network", ip: "192.168.33.10" # Create a public network, which generally matched to bridged network. # Bridged networks make the machine appear as another physical device on # your network. # config.vm.network "public_network" # Share an additional folder to the guest VM. The first argument is # the path on the host to the actual folder. The second argument is # the path on the guest to mount the folder. And the optional third # argument is a set of non-required options. config.vm.synced_folder "../", "/enigmail-src" config.ssh.forward_x11 = true # Provider-specific configuration so you can fine-tune various # backing providers for Vagrant. These expose provider-specific options. # Example for VirtualBox: # # config.vm.provider "virtualbox" do |vb| # # Display the VirtualBox GUI when booting the machine # vb.gui = true # # # Customize the amount of memory on the VM: # vb.memory = "1024" # end # # View the documentation for the provider you are using for more # information on available options. # Define a Vagrant Push strategy for pushing to Atlas. Other push strategies # such as FTP and Heroku are also available. See the documentation at # https://docs.vagrantup.com/v2/push/atlas.html for more information. # config.push.define "atlas" do |push| # push.app = "YOUR_ATLAS_USERNAME/YOUR_APPLICATION_NAME" # end config.vm.provider :virtualbox do |vb| vb.gui = false if ARGV[0] == "up" if ENV["VB_GUI"] == "true" then vb.gui = true else puts("[info] VB_GUI environment variable not set so running headless") end end end # Enable provisioning with a shell script. Additional provisioners such as # Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the # documentation for more information about their specific syntax and use. config.vm.provision "shell", path: "provision-vagrant.sh" end enigmail-2.0.8/provisioning/docker-build.sh000077500000000000000000000010541334302754500207450ustar00rootroot00000000000000#!/usr/bin/env bash # # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. # if command -v realpath>/dev/null 2>&1; then CURRENT_FILE=`realpath "$0"` else CURRENT_FILE="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )/$(basename $0)" fi PROVISIONING_DIR=`dirname "$CURRENT_FILE"` ENIGMAIL_ROOT=`dirname "$PROVISIONING_DIR"` docker run -v $ENIGMAIL_ROOT:/enigmail-src -i -t enigmail-unit ./build.sh enigmail-2.0.8/provisioning/docker-init.sh000077500000000000000000000006321334302754500206120ustar00rootroot00000000000000#!/usr/bin/env bash # # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. # CURRENT_FILE=`realpath "$0"` PROVISIONING_DIR=`dirname "$CURRENT_FILE"` ENIGMAIL_ROOT=`dirname "$PROVISIONING_DIR"` pushd . cd $PROVISIONING_DIR docker build -t enigmail-unit . popd enigmail-2.0.8/provisioning/docker-test.sh000077500000000000000000000010741334302754500206270ustar00rootroot00000000000000#!/usr/bin/env bash # # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. # if command -v realpath>/dev/null 2>&1; then CURRENT_FILE=`realpath "$0"` else CURRENT_FILE="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )/$(basename $0)" fi PROVISIONING_DIR=`dirname "$CURRENT_FILE"` ENIGMAIL_ROOT=`dirname "$PROVISIONING_DIR"` docker run -v $ENIGMAIL_ROOT:/enigmail-src -i -u testuser -t enigmail-unit ./test.sh "$@" enigmail-2.0.8/provisioning/provision-travis.sh000077500000000000000000000023331334302754500217400ustar00rootroot00000000000000#!/usr/bin/env bash # # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. # export DEBIAN_FRONTEND=noninteractive echo "Provisioning ..." curl -s "http://git.fedorahosted.org/cgit/mailcap.git/plain/mime.types" > mime.types sudo apt-get install nodejs sudo apt-get install npm npm install -g eslint@2.12 sudo cp mime.types /etc/mime.types sudo echo "deb http://deb.torproject.org/torproject.org sid main" >> /etc/apt/sources.list gpg --keyserver keys.gnupg.net --recv 0xEE8CBC9E886DDD89 gpg --export A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89 | sudo apt-key add - sudo apt-get update sudo apt-get install deb.torproject.org-keyring sudo apt-get install -y tor sudo apt-get install -q -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" zip thunderbird xvfb gnupg2 wget -O /tmp/jsunit-0.1.4.xpi https://www.enigmail.net/jsunit/jsunit-0.1.4.xpi sudo unzip /tmp/jsunit-0.1.4.xpi -d /usr/lib/thunderbird-addons/extensions/jsunit@enigmail.net sudo /bin/bash -c "echo $TRAVIS_BUILD_DIR/build/dist > /usr/lib/thunderbird-addons/extensions/{847b3a00-7ab1-11d4-8f02-006008948af5}" enigmail-2.0.8/provisioning/provision-vagrant.sh000066400000000000000000000016531334302754500220730ustar00rootroot00000000000000#!/usr/bin/env bash # # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. # echo "Provisioning ..." apt-get update apt-get install -y zip thunderbird xvfb gnupg2 apt-get install -y xfce4 virtualbox-guest-dkms virtualbox-guest-utils virtualbox-guest-x11 apt-get install -y ntp apt-get install -y rng-tools haveged apt-get upgrade -y wget -O /tmp/jsunit-0.1.4.xpi https://www.enigmail.net/jsunit/jsunit-0.1.4.xpi rm -rf /usr/lib/thunderbird-addons/extensions/jsunit@enigmail.net unzip /tmp/jsunit-0.1.4.xpi -d /usr/lib/thunderbird-addons/extensions/jsunit@enigmail.net rm -rf '/usr/lib/thunderbird-addons/extensions/{847b3a00-7ab1-11d4-8f02-006008948af5}' echo "/enigmail-src/build/dist" > '/usr/lib/thunderbird-addons/extensions/{847b3a00-7ab1-11d4-8f02-006008948af5}' touch '/enigmail-src' enigmail-2.0.8/public/000077500000000000000000000000001334302754500145725ustar00rootroot00000000000000enigmail-2.0.8/public/thunderbird-enigmail.metainfo.xml000066400000000000000000000012051334302754500232100ustar00rootroot00000000000000 thunderbird-enigmail mozilla-thunderbird.desktop Enigmail OpenPGP message encryption and authentication for Thunderbird and SeaMonkey. https://www.enigmail.net CC0-1.0 MPL-2.0 patrick@enigmail.net enigmail-2.0.8/static_analysis/000077500000000000000000000000001334302754500165065ustar00rootroot00000000000000enigmail-2.0.8/static_analysis/eslint000077500000000000000000000020171334302754500177320ustar00rootroot00000000000000#!/usr/bin/env bash # # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. # # To run, install node and npm, then install eslint: # sudo npm install eslint -g # EsLint documentation is available from http://eslint.org WHICH_ESLINT=`which eslint 2>/dev/null` if [ "${WHICH_ESLINT}x" == "x" ]; then echo "You need to have eslint installed to run this script" echo " Install node.js and npm, then install eslint like this:" echo " sudo npm install -g eslint" exit 1 else if command -v realpath>/dev/null 2>&1; then CURRENT_FILE=`realpath "$0"` else CURRENT_FILE="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )/$(basename $0)" fi STATIC_ANALYSIS_DIR=`dirname "$CURRENT_FILE"` find "$1" -name "*.js" -exec eslint --quiet {} + && \ find "$1" -name "*.jsm" -exec eslint --quiet {} + if [ $? -ne 0 ]; then exit 1 fi fi enigmail-2.0.8/stdlib/000077500000000000000000000000001334302754500145755ustar00rootroot00000000000000enigmail-2.0.8/stdlib/LICENSE-openpgp.js.txt000066400000000000000000000172541334302754500205120ustar00rootroot00000000000000License for OpenPGP.js ====================== The original source code for OpenPGP.js is available from http://openpgpjs.org/ --------------------------------------------------------------------- GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. enigmail-2.0.8/stdlib/Makefile000066400000000000000000000010731334302754500162360ustar00rootroot00000000000000# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. DEPTH = .. include $(DEPTH)/config/autoconf.mk MODFILES = \ compose.jsm \ misc.jsm \ msgHdrUtils.jsm \ openpgp-lib.js \ openpgp.worker.min.js all: deploy deploy: $(MODFILES) $(DEPTH)/util/install -m 644 $(DIST)/modules/stdlib $(MODFILES) clean: $(DEPTH)/util/install -u $(DIST)/modules/stdlib $(MODFILES) enigmail-2.0.8/stdlib/compose.jsm000066400000000000000000000416521334302754500167650ustar00rootroot00000000000000/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ /** * @fileoverview Composition-related utils: quoting, wrapping text before * sending a message, converting back and forth between HTML and plain text... * @author Jonathan Protzenko */ var EXPORTED_SYMBOLS = [ 'composeInIframe', 'getEditorForIframe', 'quoteMsgHdr', 'citeString', 'htmlToPlainText', 'simpleWrap', 'plainTextToHtml', 'replyAllParams', 'determineComposeHtml', 'composeMessageTo', 'getSignatureContentsForAccount', ] const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components; Cu.import("resource://gre/modules/XPCOMUtils.jsm"); // for generateQI, defineLazyServiceGetter Cu.import("resource://gre/modules/NetUtil.jsm"); Cu.import("resource:///modules/gloda/mimemsg.js"); Cu.import("resource:///modules/mailServices.js"); Cu.import("resource://enigmail/stdlib/misc.jsm"); Cu.import("resource://enigmail/stdlib/msgHdrUtils.jsm"); Cu.import("resource://enigmail/log.jsm"); /** * Use the mailnews component to stream a message, and process it in a way * that's suitable for quoting (strip signature, remove images, stuff like * that). * @param {nsIMsgDBHdr} aMsgHdr The message header that you want to quote * @param {Function} k The continuation. This function will be passed quoted * text suitable for insertion in an HTML editor. You can pass this to * htmlToPlainText if you're running a plaintext editor. * @return */ function quoteMsgHdr(aMsgHdr, k) { let chunks = []; // Everyone knows that nsICharsetConverterManager and nsIUnicodeDecoder // are not to be used from scriptable code, right? And the error you'll // get if you try to do so is really meaningful, and that you'll have no // trouble figuring out where the error comes from... let unicodeConverter = Cc["@mozilla.org/intl/scriptableunicodeconverter"] .createInstance(Ci.nsIScriptableUnicodeConverter); unicodeConverter.charset = "UTF-8"; let listener = { /**@ignore*/ setMimeHeaders: function() {}, /**@ignore*/ onStartRequest: function( /* nsIRequest */ aRequest, /* nsISupports */ aContext) {}, /**@ignore*/ onStopRequest: function( /* nsIRequest */ aRequest, /* nsISupports */ aContext, /* int */ aStatusCode) { let data = chunks.join(""); k(data); }, /**@ignore*/ onDataAvailable: function( /* nsIRequest */ aRequest, /* nsISupports */ aContext, /* nsIInputStream */ aStream, /* int */ aOffset, /* int */ aCount) { // Fortunately, we have in Gecko 2.0 a nice wrapper let data = NetUtil.readInputStreamToString(aStream, aCount); // Now each character of the string is actually to be understood as a byte // of a UTF-8 string. // So charCodeAt is what we want here... let array = []; for (let i = 0; i < data.length; ++i) array[i] = data.charCodeAt(i); // Yay, good to go! chunks.push(unicodeConverter.convertFromByteArray(array, array.length)); }, QueryInterface: XPCOMUtils.generateQI([Ci.nsISupports, Ci.nsIStreamListener, Ci.nsIMsgQuotingOutputStreamListener, Ci.nsIRequestObserver ]) }; // Here's what we want to stream... let msgUri = msgHdrGetUri(aMsgHdr); /** * Quote a particular message specified by its URI. * * @param charset optional parameter - if set, force the message to be * quoted using this particular charset */ // void quoteMessage(in string msgURI, in boolean quoteHeaders, // in nsIMsgQuotingOutputStreamListener streamListener, // in string charset, in boolean headersOnly); let quoter = Cc["@mozilla.org/messengercompose/quoting;1"] .createInstance(Ci.nsIMsgQuote); quoter.quoteMessage(msgUri, false, listener, "", false, aMsgHdr); } function getEditorForIframe(aIframe) { let w = aIframe.contentWindow; let s = w.QueryInterface(Ci.nsIInterfaceRequestor) .getInterface(Ci.nsIWebNavigation) .QueryInterface(Ci.nsIInterfaceRequestor) .getInterface(Ci.nsIEditingSession); return s.getEditorForWindow(w); } function composeInIframe(aIframe, { msgHdr, compType, identity, }) { let fields = Cc["@mozilla.org/messengercompose/composefields;1"] .createInstance(Ci.nsIMsgCompFields); let params = Cc["@mozilla.org/messengercompose/composeparams;1"] .createInstance(Ci.nsIMsgComposeParams); params.identity = identity; if (msgHdr) { params.origMsgHdr = msgHdr; params.originalMsgURI = msgHdrGetUri(msgHdr); } params.composeFields = fields; params.type = compType; let compose = MailServices.compose.initCompose(params, getMail3Pane(), aIframe.docShell); EnigmailLog.DEBUG("editor= " + getEditorForIframe(aIframe).toString() + ", iframe= " + aIframe.toString() + "\n"); compose.initEditor(getEditorForIframe(aIframe), aIframe.contentWindow); } /** * A function that properly quotes a plaintext email. * @param {String} aStr The mail body that we're expected to quote. * @return {String} The quoted mail body with >'s properly taken care of. */ function citeString(aStr) { let l = aStr.length; return aStr.replace("\n", function(match, offset, str) { // http://mxr.mozilla.org/comm-central/source/mozilla/editor/libeditor/text/nsInternetCiter.cpp#96 if (offset < l - 1) { if (str[offset + 1] != ">" && str[offset + 1] != "\n" && str[offset + 1] != "\r") return "\n> "; else return "\n>"; } else { return match; } }, "g"); } /** * Wrap some text. Beware, that function doesn't do rewrapping, and only * operates on non-quoted lines. This is only useful in our very specific case * where the quoted lines have been properly wrapped for format=flowed already, * and the non-quoted lines are the only ones that need wrapping for * format=flowed. * Beware, this function will treat all lines starting with >'s as quotations, * even user-inserted ones. We would need support from the editor to proceed * otherwise, and the current textarea doesn't provide this. * This function, when breaking lines, will do space-stuffing per the RFC if * after the break the text starts with From or >. * @param {String} txt The text that should be wrapped. * @param {Number} width (optional) The width we should wrap to. Default to 72. * @return {String} The text with non-quoted lines wrapped. This is suitable for * sending as format=flowed. */ function simpleWrap(txt, width) { if (!width) width = 72; function maybeEscape(line) { if (line.indexOf("From") === 0 || line.indexOf(">") === 0) return (" " + line); else return line; } /** * That function takes a (long) line, and splits it into many lines. * @param soFar {Array String} an accumulator of the lines we've wrapped already * @param remaining {String} the remaining string to wrap */ function splitLongLine(soFar, remaining) { if (remaining.length > width) { // Start at the end of the line, and move back until we find a word // boundary. let i = width - 1; while (remaining[i] != " " && i > 0) i--; // We found a word boundary, break there if (i > 0) { // This includes the trailing space that indicates that we are wrapping // a long line with format=flowed. soFar.push(maybeEscape(remaining.substring(0, i + 1))); return splitLongLine(soFar, remaining.substring(i + 1, remaining.length)); } else { // No word boundary, break at the first space let j = remaining.indexOf(" "); if (j > 0) { // Same remark about the trailing space. soFar.push(maybeEscape(remaining.substring(0, j + 1))); return splitLongLine(soFar, remaining.substring(j + 1, remaining.length)); } else { // Make sure no one interprets this as a line continuation. soFar.push(remaining.trimRight()); return soFar.join("\n"); } } } else { // Same remark about the trailing space. soFar.push(maybeEscape(remaining.trimRight())); return soFar.join("\n"); } } let lines = txt.split(/\r?\n/); lines.forEach(function(line, i) { if (line.length > width && line[0] != ">") lines[i] = splitLongLine([], line); }); return lines.join("\n"); } /** * Convert HTML into text/plain suitable for insertion right away in the mail * body. If there is text with >'s at the beginning of lines, these will be * space-stuffed, and the same goes for Froms. <blockquote>s will be converted * with the suitable >'s at the beginning of the line, and so on... * This function also takes care of rewrapping at 72 characters, so your quoted * lines will be properly wrapped too. This means that you can add some text of * your own, and then pass this to simpleWrap, it should "just work" (unless * the user has edited a quoted line and made it longer than 990 characters, of * course). * @param {String} aHtml A string containing the HTML that's to be converted. * @return {String} A text/plain string suitable for insertion in a mail body. */ function htmlToPlainText(aHtml) { // Yes, this is ridiculous, we're instanciating composition fields just so // that they call ConvertBufPlainText for us. But ConvertBufToPlainText // really isn't easily scriptable, so... let fields = Cc["@mozilla.org/messengercompose/composefields;1"] .createInstance(Ci.nsIMsgCompFields); fields.body = aHtml; fields.forcePlainText = true; fields.ConvertBodyToPlainText(); return fields.body; } /** * @ignore */ function citeLevel(line) { let i; for (i = 0; line[i] == ">" && i < line.length; ++i) ; // nop return i; }; /** * Just try to convert quoted lines back to HTML markup (<blockquote>s). * @param {String} txt * @return {String} */ function plainTextToHtml(txt) { let lines = txt.split(/\r?\n/); let newLines = []; let level = 0; for (let line of lines) { let newLevel = citeLevel(line); if (newLevel > level) for (let i = level; i < newLevel; ++i) newLines.push('
'); if (newLevel < level) for (let i = newLevel; i < level; ++i) newLines.push('
'); let newLine = line[newLevel] == " " ? escapeHtml(line.substring(newLevel + 1, line.length)) : escapeHtml(line.substring(newLevel, line.length)); newLines.push(newLine); level = newLevel; } return newLines.join("\n"); } function parse(aMimeLine) { if (!aMimeLine) return [ [], [] ]; let emails = {}; let fullNames = {}; let names = {}; let numAddresses = MailServices.headerParser.parseHeadersWithArray(aMimeLine, emails, names, fullNames); return [names.value, emails.value]; } /** * Analyze a message header, and then return all the compose parameters for the * reply-all case. * @param {nsIIdentity} The identity you've picked for the reply. * @param {nsIMsgDbHdr} The message header. * @param {k} The function to call once we've determined all parameters. Take an * argument like * {{ to: [[name, email]], cc: [[name, email]], bcc: [[name, email]]}} */ function replyAllParams(aIdentity, aMsgHdr, k) { // Do the whole shebang to find out who to send to... let [ [author], [authorEmailAddress] ] = parse(aMsgHdr.author); let [recipients, recipientsEmailAddresses] = parse(aMsgHdr.recipients); let [ccList, ccListEmailAddresses] = parse(aMsgHdr.ccList); let [bccList, bccListEmailAddresses] = parse(aMsgHdr.bccList); authorEmailAddress = authorEmailAddress.toLowerCase(); recipientsEmailAddresses = recipientsEmailAddresses.map(x => x.toLowerCase()); ccListEmailAddresses = ccListEmailAddresses.map(x => x.toLowerCase()); bccListEmailAddresses = bccListEmailAddresses.map(x => x.toLowerCase()); let identity = aIdentity; let identityEmail = identity.email.toLowerCase(); let to = [], cc = [], bcc = []; let isReplyToOwnMsg = false; for (let currentIdentity of getIdentities()) { let email = currentIdentity.identity.email.toLowerCase(); if (email == authorEmailAddress) isReplyToOwnMsg = true; if (recipientsEmailAddresses.some(x => x == email)) isReplyToOwnMsg = false; if (ccListEmailAddresses.some(x => x == email)) isReplyToOwnMsg = false; } // Actually we are implementing the "Reply all" logic... that's better, no one // wants to really use reply anyway if (isReplyToOwnMsg) { to = recipients.map((r, i) => [r, recipientsEmailAddresses[i]]); } else { to = [ [author, authorEmailAddress] ]; } cc = ccList.map((cc, i) => [cc, ccListEmailAddresses[i]]). filter((e, i) => e[1] != identityEmail); if (!isReplyToOwnMsg) { cc = cc.concat(recipients.map((r, i) => [r, recipientsEmailAddresses[i]]).filter((e, i) => e[1] != identityEmail)); } bcc = bccList.map((bcc, i) => [bcc, bccListEmailAddresses]); let finish = function(to, cc, bcc) { let hashMap = {}; for (let [name, email] of to) hashMap[email] = null; cc = cc.filter(function([name, email]) { let r = (email in hashMap); hashMap[email] = null; return !r }); bcc = bcc.filter(function([name, email]) { let r = (email in hashMap); hashMap[email] = null; return !r }); k({ to: to, cc: cc, bcc: bcc }); } // Do we have a Reply-To header? msgHdrGetHeaders(aMsgHdr, function(aHeaders) { if (aHeaders.has("reply-to")) { let [names, emails] = parse(aHeaders.get("reply-to")); emails = emails.map(email => email.toLowerCase()); if (emails.length) { // Invariant: at this stage, we only have one item in to. cc = cc.concat([to[0]]); // move the to in cc to = combine(names, emails); } } finish(to, cc, bcc); }); } /** * This function replaces nsMsgComposeService::determineComposeHTML, which is * marked as [noscript], just to make our lives complicated. [insert random rant * here]. * * @param aIdentity (optional) You can specify the identity which you would like * to get the preference for. * @return a bool which is true if you should compose in HTML */ function determineComposeHtml(aIdentity) { if (!aIdentity) aIdentity = getDefaultIdentity().identity; if (aIdentity) { return (aIdentity.composeHtml == Ci.nsIMsgCompFormat.HTML); } else { return Cc["@mozilla.org/preferences-service;1"] .getService(Ci.nsIPrefService) .getBranch(null) .getBoolPref("mail.compose_html"); } } /** * Open a composition window for the given email address. * @param aEmail {String} * @param aDisplayedFolder {nsIMsgFolder} pass gFolderDisplay.displayedFolder */ function composeMessageTo(aEmail, aDisplayedFolder) { let fields = Cc["@mozilla.org/messengercompose/composefields;1"] .createInstance(Ci.nsIMsgCompFields); let params = Cc["@mozilla.org/messengercompose/composeparams;1"] .createInstance(Ci.nsIMsgComposeParams); fields.to = aEmail params.type = Ci.nsIMsgCompType.New; params.format = Ci.nsIMsgCompFormat.Default; if (aDisplayedFolder) { params.identity = MailServices.accounts .getFirstIdentityForServer(aDisplayedFolder.server); } params.composeFields = fields; MailServices.compose.OpenComposeWindowWithParams(null, params); } /** * Returns signature contents depending on account settings of the identity. * HTML signature is converted to plain text. * @param {nsIIdentity} The identity you've picked for the reply. * @return {String} plain text signature */ function getSignatureContentsForAccount(aIdentity) { let signature = ""; if (!aIdentity) return signature; if (aIdentity.attachSignature && aIdentity.signature) { let charset = systemCharset(); const replacementChar = Ci.nsIConverterInputStream.DEFAULT_REPLACEMENT_CHARACTER; let fstream = Cc["@mozilla.org/network/file-input-stream;1"] .createInstance(Ci.nsIFileInputStream); let cstream = Cc["@mozilla.org/intl/converter-input-stream;1"] .createInstance(Ci.nsIConverterInputStream); try { fstream.init(aIdentity.signature, -1, 0, 0); try { cstream.init(fstream, charset, 1024, replacementChar); } catch (e) { EnigmailLog.ERROR("ConverterInputStream init error: " + e + "\n charset: " + charset + "\n"); cstream.init(fstream, "UTF-8", 1024, replacementChar); } let str = {}; while (cstream.readString(4096, str) != 0) { signature += str.value; } if (aIdentity.signature.path.match(/\.html?$/)) { signature = htmlToPlainText(signature); } } catch (e) { EnigmailLog.ERROR("Signature file stream error: " + e + "\n"); } cstream.close(); fstream.close(); // required for stripSignatureIfNeeded working properly signature = signature.replace(/\r?\n/g, "\n"); } else { signature = aIdentity.htmlSigFormat ? htmlToPlainText(aIdentity.htmlSigText) : aIdentity.htmlSigText; } return signature; } enigmail-2.0.8/stdlib/misc.jsm000066400000000000000000000271451334302754500162540ustar00rootroot00000000000000/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ /** * @fileoverview This file provides various utilities: some helpers to deal with * identity management, some helpers for JS programming, some helpers for * low-level XPCOM stuff... */ var EXPORTED_SYMBOLS = [ // Identity management helpers 'gIdentities', 'fillIdentities', 'getIdentities', 'getDefaultIdentity', 'getIdentityForEmail', // Account management helpers: 'hasConfiguredAccounts', // JS programming helpers 'range', 'MixIn', 'combine', 'entries', // XPCOM helpers 'NS_FAILED', 'NS_SUCCEEDED', // Various formatting helpers 'dateAsInMessageList', 'escapeHtml', 'sanitize', 'parseMimeLine', // Useful for web content 'encodeUrlParameters', 'decodeUrlParameters', // Character set helpers 'systemCharset', // Platform-specific idioms 'isOSX', 'isWindows', 'isAccel' ] const { classes: Cc, interfaces: Ci, utils: Cu } = Components; Cu.import("resource:///modules/iteratorUtils.jsm"); // for fixIterator Cu.import("resource://gre/modules/XPCOMUtils.jsm"); Cu.import("resource:///modules/mailServices.js"); // That one doesn't belong to MailServices. XPCOMUtils.defineLazyServiceGetter(MailServices, "i18nDateFormatter", "@mozilla.org/intl/scriptabledateformat;1"); Cu.import("resource://enigmail/log.jsm"); let isOSX = ("nsILocalFileMac" in Ci); let isWindows = ("@mozilla.org/windows-registry-key;1" in Cc); function isAccel(event) { return isOSX && event.metaKey || event.ctrlKey; } /** * Low-level XPCOM-style macro. You might need this for the composition and * sending listeners which will pass you some status codes. * @param {Int} v The status code * @return {Bool} */ function NS_FAILED(v) { return (v & 0x80000000); } /** * Low-level XPCOM-style macro. You might need this for the composition and * sending listeners which will pass you some status codes. * @param {Int} v The status code * @return {Bool} */ function NS_SUCCEEDED(v) { return !NS_FAILED(v); } /** * Python-style range function to use in list comprehensions. * @param {Number} begin * @param {Number} end * @return {Generator} An iterator that yields from begin to end - 1. */ function* range(begin, end) { for (let i = begin; i < end; ++i) { yield i; } } /** * Helper function to simplify iteration over key/value store objects. * From https://esdiscuss.org/topic/es6-iteration-over-object-values * @param {Object} anObject */ function* entries(anObject) { for (let key of Object.keys(anObject)) { yield [key, anObject[key]]; } } /** * MixIn-style helper. Adds aMixIn properties, getters and setters to * aConstructor. * @param {Object} aConstructor * @param {Object} aMixIn */ function MixIn(aConstructor, aMixIn) { let proto = aConstructor.prototype; for (let [name, func] of entries(aMixIn)) { if (name.substring(0, 4) == "get_") proto.__defineGetter__(name.substring(4), func); else proto[name] = func; } } /** * A global pointer to all the identities known for the user. Feel free to call * fillIdentities again if you feel that the user has updated them! * The keys are email addresses, the values are nsIMsgIdentity objects. * * @const */ let gIdentities = {}; /** * This function you should call to populate the gIdentities global object. The * recommended time to call this is after the mail-startup-done event, although * doing this at overlay load-time seems to be fine as well. * There is a "default" key, that we guarantee to be non-null, by picking the * first account's first valid identity if the default account doesn't have any * valid identity associated. * @param aSkipNntp (optional) Should we avoid including nntp identities in the * list? * @deprecated Use getIdenties() instead */ function fillIdentities(aSkipNntp) { EnigmailLog.WARNING("fillIdentities is deprecated! Use getIdentities instead!\n"); EnigmailLog.DEBUG("Filling identities with skipnntp = " + aSkipNntp.toString() + "\n"); for (let currentIdentity of getIdentities(aSkipNntp)) { gIdentities[currentIdentity.identity.email] = currentIdentity.identity; if (currentIdentity.isDefault) { gIdentities["default"] = currentIdentity.identity; } } if (!("default" in gIdentities)) { gIdentities["default"] = getIdentities()[0].identity; } } /** * Returns the default identity in the form { boolean isDefault; nsIMsgIdentity identity } */ function getDefaultIdentity() { return getIdentities().find(x => x.isDefault); } /** * Returns a list of all identities in the form [{ boolean isDefault; nsIMsgIdentity identity }]. * It is assured that there is exactly one default identity. * If only the default identity is needed, getDefaultIdentity() can be used. * @param aSkipNntpIdentities (default: true) Should we avoid including nntp identities in the list? */ function getIdentities(aSkipNntpIdentities = true) { let identities = []; for (let account of fixIterator(MailServices.accounts.accounts, Ci.nsIMsgAccount)) { let server = account.incomingServer; if (aSkipNntpIdentities && (!server || server.type != "pop3" && server.type != "imap")) { continue; } for (let currentIdentity of fixIterator(account.identities, Ci.nsIMsgIdentity)) { // We're only interested in identities that have a real email. if (currentIdentity.email) { identities.push({ isDefault: (currentIdentity == MailServices.accounts.defaultAccount.defaultIdentity), identity: currentIdentity }); } } } if (identities.length == 0) { EnigmailLog.DEBUG("Didn't find any identities!\n"); } else { if (!identities.some(x => x.isDefault)) { EnigmailLog.DEBUG("Didn't find any default key - mark the first identity as default!\n"); identities[0].isDefault = true; } } return identities; } /* * Searches a given email address in all identities and returns the corresponding identity. * @param {String} anEmailAddress Email address to be searched in the identities * @returns {{Boolean} isDefault, {{nsIMsgIdentity} identity} if found, otherwise undefined */ function getIdentityForEmail(anEmailAddress) { return getIdentities(false).find(ident => ident.identity.email.toLowerCase() == anEmailAddress.toLowerCase()); } /** * A stupid formatting function that uses the i18nDateFormatter XPCOM component * to format a date just like in the message list * @param {Date} aDate a javascript Date object * @return {String} a string containing the formatted date */ function dateAsInMessageList(aDate) { const DATE_2DIGIT = "2-digit"; const DATE_4DIGIT = "numeric"; let now = new Date(); // Is it today? let isToday = now.getFullYear() == aDate.getFullYear() && now.getMonth() == aDate.getMonth() && now.getDate() == aDate.getDate(); let options = { hour: DATE_2DIGIT, minute: DATE_2DIGIT }; if (!isToday) { options.day = DATE_2DIGIT; options.month = DATE_2DIGIT; let year = aDate.getFullYear(); if (year > 2099) { options.year = DATE_4DIGIT; } else { options.year = DATE_2DIGIT; } } return new Intl.DateTimeFormat([], options).format(aDate); } const RE_SANITIZE = /[\u0000-\u0008\u000b-\u000c\u000e-\u001f]/g; /** * Helper function to remove non-printable characters from a string -- injecting * these in an XML or XHTML document would cause an error. * @param {String} s input text * @param {String} The sanitized string. */ function sanitize(s) { return (s || "").replace(RE_SANITIZE, ""); } /** * Helper function to escape some XML chars, so they display properly in * innerHTML. * @param {String} s input text * @return {String} The string with <, >, and & replaced by the corresponding entities. */ function escapeHtml(s) { s += ""; // stolen from selectionsummaries.js (thanks davida!) return sanitize(s.replace(/[<>&]/g, function(s) { switch (s) { case "<": return "<"; case ">": return ">"; case "&": return "&"; default: throw Error("Unexpected match"); } })); } /** * Wraps the low-level header parser stuff. * @param {String} aMimeLine a line that looks like "John <john@cheese.com>, Jane <jane@wine.com>" * @param {Boolean} aDontFix (optional) Default to false. Shall we return an * empty array in case aMimeLine is empty? * @return {Array} a list of { email, name } objects */ function parseMimeLine(aMimeLine, aDontFix) { if (aMimeLine == null) { EnigmailLog.DEBUG("Empty aMimeLine?!!\n"); return []; } let emails = {}; let fullNames = {}; let names = {}; let numAddresses = MailServices.headerParser.parseHeadersWithArray(aMimeLine, emails, names, fullNames); if (numAddresses) return [...range(0, numAddresses)].map(i => { return { email: emails.value[i], name: names.value[i], fullName: fullNames.value[i] }; }); else if (aDontFix) return []; else return [{ email: "", name: "-", fullName: "-" }]; } /** * Takes an object whose keys are the parameter names, whose values are strings * that are to be encoded in the url. * @param aObj * @return param1=val1¶m2=val2 etc. */ function encodeUrlParameters(aObj) { let kv = []; for (let [k, v] of entries(aObj)) { kv.push(k + "=" + encodeURIComponent(v)); } return kv.join("&"); } /** * Takes the entire query string and returns an object whose keys are the * parameter names and values are corresponding values. * @param aStr The entire query string * @return An object that holds the decoded data */ function decodeUrlParameters(aStr) { let params = {}; let i = aStr.indexOf("?"); if (i >= 0) { let query = aStr.substring(i + 1, aStr.length); let keyVals = query.split("&"); for (let keyVal of keyVals) { let [key, val] = keyVal.split("="); val = decodeURIComponent(val); params[key] = val; } } return params; } /** * Returns a system character set string, which is system code page on Windows, * LANG environment variable's encoding on Unix-like OS, otherwise UTF-8. * @return {String} a character set string */ function systemCharset() { let charset = "UTF-8"; if ("@mozilla.org/windows-registry-key;1" in Cc) { let registry = Cc["@mozilla.org/windows-registry-key;1"] .createInstance(Ci.nsIWindowsRegKey); registry.open(registry.ROOT_KEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\Nls\\CodePage", registry.ACCESS_READ); let codePage = registry.readStringValue("ACP"); if (codePage) { charset = "CP" + codePage; } registry.close(); } else { let env = Cc["@mozilla.org/process/environment;1"] .getService(Ci.nsIEnvironment); let lang = env.get("LANG").split("."); if (lang.length > 1) { charset = lang[1]; } } return charset; } function combine(a1, a2) { if (a1.length != a2.length) throw new Error("combine: the given arrays have different lengths"); return [...range(0, a1.length)].map(i => [a1[i], a2[i]]); } /** * Determine if at least one account / identity is configured * @return {Bool} */ function hasConfiguredAccounts() { let accountManager = Cc["@mozilla.org/messenger/account-manager;1"].getService(Ci.nsIMsgAccountManager); for (let acct = 0; acct < accountManager.accounts.length; acct++) { let ac = accountManager.accounts.queryElementAt(acct, Ci.nsIMsgAccount); if (ac.incomingServer.type !== "none") { if (ac.defaultIdentity.email.length > 0) return true; } } return false; } enigmail-2.0.8/stdlib/msgHdrUtils.jsm000066400000000000000000000346241334302754500175660ustar00rootroot00000000000000/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ /** * @fileoverview A whole bunch of utility functions that will abstract away * various low-level nsIMsgDbHdr operations. The idea is to save time by not * having to lookup how to do simple actions. * @author Jonathan Protzenko */ var EXPORTED_SYMBOLS = [ // Low-level XPCOM boring stuff 'msgHdrToMessageBody', 'msgHdrToNeckoURL', 'msgHdrGetTags', 'msgUriToMsgHdr', 'msgHdrGetUri', 'msgHdrFromNeckoUrl', 'msgHdrSetTags', // Quickly identify a message 'msgHdrIsDraft', 'msgHdrIsSent', 'msgHdrIsArchive', 'msgHdrIsInbox', 'msgHdrIsRss', 'msgHdrIsNntp', 'msgHdrIsJunk', // Actions on a set of message headers 'msgHdrsMarkAsRead', 'msgHdrsArchive', 'msgHdrsDelete', // Doesn't really belong here 'getMail3Pane', // Higher-level functions 'msgHdrGetHeaders', // Modify messages, raw. 'msgHdrsModifyRaw', ] const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components; // from mailnews/base/public/nsMsgFolderFlags.idl const nsMsgFolderFlags_SentMail = 0x00000200; const nsMsgFolderFlags_Drafts = 0x00000400; const nsMsgFolderFlags_Archive = 0x00004000; const nsMsgFolderFlags_Inbox = 0x00001000; const PR_WRONLY = 0x02; Cu.import("resource://gre/modules/XPCOMUtils.jsm"); // for defineLazyServiceGetter Cu.import("resource:///modules/gloda/mimemsg.js"); Cu.import("resource:///modules/gloda/utils.js"); Cu.import("resource:///modules/iteratorUtils.jsm"); // for toXPCOMArray Cu.import("resource://gre/modules/Services.jsm"); Cu.import("resource:///modules/mailServices.js"); Cu.import("resource://enigmail/stdlib/misc.jsm"); Cu.import("resource://enigmail/log.jsm"); // Adding a messenger lazy getter to the MailServices even though it's not a service XPCOMUtils.defineLazyGetter(MailServices, "messenger", function() { return Cc["@mozilla.org/messenger;1"].createInstance(Ci.nsIMessenger); }); /** * Get a given message header's uri. * @param {nsIMsgDbHdr} aMsg The message * @return {String} */ function msgHdrGetUri(aMsg) { return aMsg.folder.getUriForMsg(aMsg); } /** * Get a msgHdr from a message URI (msgHdr.URI). * @param {String} aUri The URI of the message * @return {nsIMsgDbHdr} */ function msgUriToMsgHdr(aUri) { try { let messageService = MailServices.messenger.messageServiceFromURI(aUri); return messageService.messageURIToMsgHdr(aUri); } catch (e) { dump("Unable to get " + aUri + " — returning null instead"); return null; } } /** * Tells if the message is in the account's inbox * @param {nsIMsgDbHdr} msgHdr The message header to examine * @return {bool} */ function msgHdrIsInbox(msgHdr) { return msgHdr.folder.getFlag(nsMsgFolderFlags_Inbox); } /** * Tells if the message is a draft message * @param {nsIMsgDbHdr} msgHdr The message header to examine * @return {bool} */ function msgHdrIsDraft(msgHdr) { return msgHdr.folder.getFlag(nsMsgFolderFlags_Drafts); } /** * Tells if the message is a sent message * @param {nsIMsgDbHdr} msgHdr The message header to examine * @return {bool} */ function msgHdrIsSent(msgHdr) { return msgHdr.folder.getFlag(nsMsgFolderFlags_SentMail); } /** * Tells if the message is an archived message * @param {nsIMsgDbHdr} msgHdr The message header to examine * @return {bool} */ function msgHdrIsArchive(msgHdr) { return msgHdr.folder.getFlag(nsMsgFolderFlags_Archive); } /** * Get a nsIMsgDbHdr from a Necko URL. * @param {String} The URL * @return {nsIMsgDbHdr} The message header. */ function msgHdrFromNeckoUrl(aUrl) { return aUrl.QueryInterface(Ci.nsIMsgMessageUrl).messageHeader; } /** * Get a string containing the body of a messsage. * @param {nsIMsgDbHdr} aMessageHeader The message header * @param {bool} aStripHtml Keep html? * @return {string} */ function msgHdrToMessageBody(aMessageHeader, aStripHtml, aLength) { let messenger = Cc["@mozilla.org/messenger;1"].createInstance(Ci.nsIMessenger); let listener = Cc["@mozilla.org/network/sync-stream-listener;1"].createInstance(Ci.nsISyncStreamListener); let uri = aMessageHeader.folder.getUriForMsg(aMessageHeader); messenger.messageServiceFromURI(uri).streamMessage(uri, listener, null, null, false, ""); let folder = aMessageHeader.folder; /* * AUTF8String getMsgTextFromStream(in nsIInputStream aStream, in ACString aCharset, in unsigned long aBytesToRead, in unsigned long aMaxOutputLen, in boolean aCompressQuotes, in boolean aStripHTMLTags, out ACString aContentType); */ return folder.getMsgTextFromStream( listener.inputStream, aMessageHeader.Charset, 2 * aLength, aLength, false, aStripHtml, {}); } /** * Get a nsIURI from a nsIMsgDBHdr * @param {nsIMsgDbHdr} aMsgHdr The message header * @return {nsIURI} */ function msgHdrToNeckoURL(aMsgHdr) { let uri = aMsgHdr.folder.getUriForMsg(aMsgHdr); let neckoURL = {}; let msgService = MailServices.messenger.messageServiceFromURI(uri); msgService.GetUrlForUri(uri, neckoURL, null); return neckoURL.value; } /** * Given a msgHdr, return a list of tag objects. This function * just does the messy work of understanding how tags are * stored in nsIMsgDBHdrs. * * @param {nsIMsgDbHdr} aMsgHdr the msgHdr whose tags we want * @return {nsIMsgTag array} a list of tag objects */ function msgHdrGetTags(aMsgHdr) { let keywords = aMsgHdr.getStringProperty("keywords"); let keywordList = keywords.split(' '); let keywordMap = {}; for (let keyword of keywordList) { keywordMap[keyword] = true; } let tagArray = MailServices.tags.getAllTags({}); let tags = tagArray.filter(tag => tag.key in keywordMap); return tags; } /** * Set the tags for a given msgHdr. * * @param {nsIMsgDBHdr} aMsgHdr * @param {nsIMsgTag array} aTags */ function msgHdrSetTags(aMsgHdr, aTags) { let oldTagList = msgHdrGetTags(aMsgHdr); let oldTags = {}; // hashmap for (let tag of oldTagList) oldTags[tag.key] = null; let newTags = {}; let newTagList = aTags; for (let tag of newTagList) newTags[tag.key] = null; let toAdd = newTagList.filter(x => !(x.key in oldTags)).map(x => x.key); let toRemove = oldTagList.filter(x => !(x.key in newTags)).map(x => x.key); let folder = aMsgHdr.folder; let msgHdr = toXPCOMArray([aMsgHdr], Ci.nsIMutableArray); folder.addKeywordsToMessages(msgHdr, toAdd.join(" ")); folder.removeKeywordsFromMessages(msgHdr, toRemove.join(" ")); aMsgHdr.folder.msgDatabase = null; } /** * Mark an array of msgHdrs read (or unread) * @param {nsIMsgDbHdr array} msgHdrs The message headers * @param {bool} read True to mark them read, false to mark them unread */ function msgHdrsMarkAsRead(msgHdrs, read) { let pending = {}; for (let msgHdr of msgHdrs) { if (msgHdr.isRead == read) continue; if (!pending[msgHdr.folder.URI]) { pending[msgHdr.folder.URI] = { folder: msgHdr.folder, msgs: Cc["@mozilla.org/array;1"].createInstance(Ci.nsIMutableArray) }; } pending[msgHdr.folder.URI].msgs.appendElement(msgHdr, false); } for (let [uri, { folder, msgs }] of entries(pending)) { folder.markMessagesRead(msgs, read); folder.msgDatabase = null; /* don't leak */ } } /** * Delete a set of messages. * @param {nsIMsgDbHdr array} msgHdrs The message headers */ function msgHdrsDelete(msgHdrs) { let pending = {}; for (let msgHdr of msgHdrs) { if (!pending[msgHdr.folder.URI]) { pending[msgHdr.folder.URI] = { folder: msgHdr.folder, msgs: Cc["@mozilla.org/array;1"].createInstance(Ci.nsIMutableArray) }; } pending[msgHdr.folder.URI].msgs.appendElement(msgHdr, false); } for (let [uri, { folder, msgs }] of entries(pending)) { folder.deleteMessages(msgs, getMail3Pane().msgWindow, false, false, null, true); folder.msgDatabase = null; /* don't leak */ } } /** * Get the main Thunderbird window. Used heavily to get a reference to globals * that are defined in mail/base/content/. * @return The window object for the main window. */ function getMail3Pane() { return Cc["@mozilla.org/appshell/window-mediator;1"] .getService(Ci.nsIWindowMediator) .getMostRecentWindow("mail:3pane"); } /** * Archive a set of messages * @param {nsIMsgDbHdr array} msgHdrs The message headers */ function msgHdrsArchive(msgHdrs) { /* See * http://mxr.mozilla.org/comm-central/source/suite/mailnews/mailWindowOverlay.js#1337 * * The window is here because otherwise we don't have access to * BatchMessageMover. * */ let mail3PaneWindow = getMail3Pane(); let batchMover = new mail3PaneWindow.BatchMessageMover(); batchMover.archiveMessages(msgHdrs.filter( x => !msgHdrIsArchive(x) && getMail3Pane().getIdentityForHeader(x).archiveEnabled )); } /** * Tell if a message is an RSS feed iteme * @param {nsIMsgDbHdr} msgHdr The message header * @return {Bool} */ function msgHdrIsRss(msgHdr) { return msgHdr.folder.server instanceof Ci.nsIRssIncomingServer; } /** * Tell if a message is a NNTP message * @param {nsIMsgDbHdr} msgHdr The message header * @return {Bool} */ function msgHdrIsNntp(msgHdr) { return msgHdr.folder.server instanceof Ci.nsINntpIncomingServer; } /** * Tell if a message has been marked as junk. * @param {nsIMsgDbHdr} msgHdr The message header * @return {Bool} */ function msgHdrIsJunk(aMsgHdr) { return aMsgHdr.getStringProperty("junkscore") == Ci.nsIJunkMailPlugin.IS_SPAM_SCORE; } /** * Recycling the HeaderHandlerBase from mimemsg.js */ function HeaderHandler(aHeaders) { this.headers = aHeaders; } HeaderHandler.prototype = { __proto__: MimeMessage.prototype.__proto__, // == HeaderHandlerBase }; /** * Creates a stream listener that will call k once done, passing it the string * that has been read. */ function createStreamListener(k) { return { _data: "", _stream: null, QueryInterface: XPCOMUtils.generateQI([Ci.nsIStreamListener, Ci.nsIRequestObserver]), // nsIRequestObserver onStartRequest: function(aRequest, aContext) {}, onStopRequest: function(aRequest, aContext, aStatusCode) { try { k(this._data); } catch (e) { dump("Error inside stream listener:\n" + e + "\n"); } }, // nsIStreamListener onDataAvailable: function(aRequest, aContext, aInputStream, aOffset, aCount) { if (this._stream == null) { this._stream = Cc["@mozilla.org/scriptableinputstream;1"].createInstance(Ci.nsIScriptableInputStream); this._stream.init(aInputStream); } this._data += this._stream.read(aCount); } }; } /** * @param aMsgHdr The message header whose headers you want * @param k A function that takes a HeaderHandler object (see mimemsg.js). * Such an object has a get function, a has function. It has a header property, * whose keys are lowercased header names, and whose values are list of * strings corresponding to the multiple entries found for that header. */ function msgHdrGetHeaders(aMsgHdr, k) { let uri = msgHdrGetUri(aMsgHdr); let messageService = MailServices.messenger.messageServiceFromURI(uri); let fallback = () => MsgHdrToMimeMessage(aMsgHdr, null, function(aMsgHdr, aMimeMsg) { k(aMimeMsg); }, true, { partsOnDemand: true, }); // This is intentionally disabled because there's a bug in Thunderbird that // renders the supposedly-useful streamHeaders function unusable. if (false && "streamHeaders" in messageService) { try { messageService.streamHeaders(uri, createStreamListener(aRawString => { let re = /\r?\n\s+/g; let str = aRawString.replace(re, " "); let lines = str.split(/\r?\n/); let obj = {}; for (let line of lines) { let i = line.indexOf(":"); if (i < 0) continue; let k = line.substring(0, i).toLowerCase(); let v = line.substring(i + 1).trim(); if (!(k in obj)) obj[k] = []; obj[k].push(v); } k(new HeaderHandler(obj)); }), null, true); } catch (e) { fallback(); } } else { fallback(); } } /** * @param aMsgHdrs The messages to modify * @param aTransformer A function which takes the input data, modifies it, and * returns the corresponding data. This is the _raw_ contents of the message. */ function msgHdrsModifyRaw(aMsgHdrs, aTransformer) { let toCopy = []; let toDelete = []; let copyNext = () => { dump("msgHdrModifyRaw: copying next\n"); let obj = toCopy.pop(); if (!obj) { msgHdrsDelete(toDelete); return; } let { msgHdr, tempFile } = obj; MailServices.copy.CopyFileMessage( tempFile, msgHdr.folder, null, false, msgHdr.flags, msgHdr.getStringProperty("keywords"), { QueryInterface: XPCOMUtils.generateQI([Ci.nsIMsgCopyServiceListener]), OnStartCopy: function() {}, OnProgress: function(aProgress, aProgressMax) {}, SetMessageKey: function(aKey) {}, GetMessageId: function(aMessageId) {}, OnStopCopy: function(aStatus) { if (NS_SUCCEEDED(aStatus)) { dump("msgHdrModifyRaw: copied successfully\n"); toDelete.push(msgHdr); tempFile.remove(false); } copyNext(); } }, null ); }; let count = aMsgHdrs.length; let tick = function() { if (--count == 0) copyNext(); } for (let aMsgHdr of aMsgHdrs) { let msgHdr = aMsgHdr; let uri = msgHdrGetUri(msgHdr); let messageService = MailServices.messenger.messageServiceFromURI(uri); messageService.streamMessage(uri, createStreamListener(function(aRawString) { let data = aTransformer(aRawString); if (!data) { dump("msgHdrModifyRaw: no data, aborting\n"); return; } let tempFile = Services.dirsvc.get("TmpD", Ci.nsIFile); tempFile.append("rethread.eml"); tempFile.createUnique(Ci.nsIFile.NORMAL_FILE_TYPE, parseInt("0600", 8)); let stream = Cc["@mozilla.org/network/file-output-stream;1"] .createInstance(Ci.nsIFileOutputStream); stream.init(tempFile, PR_WRONLY, parseInt("0600", 8), 0); stream.write(data, data.length); stream.close(); dump("msgHdrModifyRaw: wrote to file\n"); toCopy.push({ tempFile: tempFile, msgHdr: msgHdr }); tick(); }), null, null, false, ""); } } enigmail-2.0.8/test.sh000077500000000000000000000010721334302754500146320ustar00rootroot00000000000000#!/usr/bin/env bash # # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. # Xvfb :99 >/dev/null 2>&1 & export DISPLAY=:99 export PL_PATH=`which perl` export TB_PATH=${TB_PATH:-`which thunderbird`} if [ `id -u` -eq 0 ]; then echo "Warning: Running the test suite as root may cause some tests to fail." fi if [ "$#" -eq 0 ]; then util/run-tests.py else util/run-tests.py $@ fi RESULT=$? killall Xvfb exit $RESULT enigmail-2.0.8/ui/000077500000000000000000000000001334302754500137315ustar00rootroot00000000000000enigmail-2.0.8/ui/Makefile000066400000000000000000000006321334302754500153720ustar00rootroot00000000000000# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. # makefile for ui directory DEPTH = .. include ../config/autoconf.mk DIRS = content skin locale/en-US .PHONY: dirs $(DIRS) all: dirs dirs: $(DIRS) $(DIRS): $(MAKE) -C $@ clean: rm -fr $(DIST)/chrome enigmail-2.0.8/ui/content/000077500000000000000000000000001334302754500154035ustar00rootroot00000000000000enigmail-2.0.8/ui/content/Makefile000066400000000000000000000067011334302754500170470ustar00rootroot00000000000000# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. DEPTH = ../.. include $(DEPTH)/config/autoconf.mk UIFILES = \ autocryptInitiateBackup.xul \ autocryptInitiateBackup.js \ autocryptSetupPasswd.xul \ autocryptSetupPasswd.js \ columnOverlay.xul \ columnOverlay.js \ enigmailCommon.js \ enigmailAbCardViewOverlay.xul \ enigmailAbContactsPanel.xul \ enigmailAbOverlay.js \ aboutEnigmail.html \ enigmailAddUidDlg.js \ enigmailAddUidDlg.xul \ enigmailAdvancedIdentityDlg.js \ enigmailAdvancedIdentityDlg.xul \ enigmailMsgBox.js \ enigmailMsgBox.xul \ enigmailAttachmentsDialog.xul \ enigmailAttachmentsDialog.js \ enigmailAmIdEditOverlay.xul \ enigmailCheckLanguage.xul \ enigmailCardDetails.js \ enigmailCardDetails.xul \ enigmailConsole.xul \ enigmailConsole.js \ enigmailConsole.htm \ enigmailCustToolOverlay.js \ enigmailCustToolOverlay.xul \ enigmailDispPhoto.js \ enigmailDispPhoto.xul \ enigmailEditIdentity.js \ enigmailEditIdentity.xul \ enigmailEditKeyExpiryDlg.js \ enigmailEditKeyExpiryDlg.xul \ enigmailEditKeyTrustDlg.js \ enigmailEditKeyTrustDlg.xul \ enigmailEncryptionDlg.xul \ enigmailEncryptionDlg.js \ enigmailGenCardKey.js \ enigmailGenCardKey.xul \ enigmailGenericDisplay.js \ enigmailGenericDisplay.xul \ enigmailGenericDisplay.htm \ enigmailHelp.xul \ enigmailHelp.js \ enigmailImportPhoto.js \ enigmailImportPhoto.xul \ keyDetailsDlg.js \ keyDetailsDlg.xul \ enigmailKeyManager.xul \ enigmailKeyManager.js \ enigmailManageUidDlg.js \ enigmailManageUidDlg.xul \ enigmailRulesEditor.xul \ enigmailRulesEditor.js \ enigmailSearchKey.js \ enigmailSearchKey.xul \ enigmailKeyImportInfo.js \ enigmailKeyImportInfo.xul \ enigmailSingleRcptSettings.js \ enigmailSingleRcptSettings.xul \ enigmailSelectRule.js \ enigmailSelectRule.xul \ enigmailSetCardPin.js \ enigmailSetCardPin.xul \ enigmailSignKeyDlg.js \ enigmailSignKeyDlg.xul \ accountManagerOverlay.js \ accountManagerOverlay.xul \ pref-enigmail.xul \ pref-enigmail.js \ pref-pep.xul \ pref-pep.js \ am-enigprefs.xul \ am-enigprefs.js \ editSingleAccount.xul \ enigmailKeygen.xul \ enigmailKeygen.js \ enigmailKeygenConsole.htm \ enigmailKeyserverDlg.xul \ enigmailKeyserverDlg.js \ enigmailKeySelection.xul \ enigmailKeySelection.js \ enigmailMsgComposeOverlay.xul \ enigmailMsgComposeOverlay-sm.xul \ enigmailMsgComposeOverlay.js \ enigmailMsgComposeHelper.js \ messengerOverlay-tbird.xul \ messengerOverlay-sm.xul \ enigmailMessengerOverlay.xul \ enigmailMessengerOverlay.js \ enigmailMsgHdrViewOverlay.xul \ enigmailMsgHdrViewOverlay.js \ enigmailFilterEditorOverlay.xul \ enigmailFilterEditorOverlay.js \ enigmailFilterListOverlay.xul \ enigmailFilterListOverlay.js \ enigmailMsgPrintOverlay.xul \ enigmailMsgPrintOverlay.js \ enigmailPrivacyOverlay.js \ enigmailPrivacyOverlay.xul \ enigmailSetupWizard.js \ enigmailSetupWizard.xul \ enigmailWrapSelection.xul \ enigmailWrapSelection.js \ enigmailViewFile.js \ enigmailViewFile.xul \ enigRetrieveProgress.xul \ enigRetrieveProgress.js \ exportSettingsWizard.js \ exportSettingsWizard.xul \ upgradeInfo.html \ pepHandshake.xul \ pepHandshake.js \ pepPrepHandshake.xul \ pepPrepHandshake.js \ pepTrustWords.xul \ pepTrustWords.js all: deploy deploy: $(UIFILES) $(DEPTH)/util/install -m 644 $(DIST)/chrome/content $(UIFILES) enigmail-2.0.8/ui/content/aboutEnigmail.html000066400000000000000000000064471334302754500210640ustar00rootroot00000000000000

      


  • Patrick Brunschwig
  • Robert J. Hansen
  • Daniele Raffo
  • Olav Seyfarth
  • the team and the list/forum members

  • R. Saravanan:
  • Jochen Eisinger (Modern), Jan Gerber (Classic), Frank Gerhardt
  • Barry Porter, Shane M. Coughlan, Nicolai Josuttis, John Clizbe, Ludwig Hügelschäfer
  • Sourceforge.net

enigmail-2.0.8/ui/content/accountManagerOverlay.js000066400000000000000000000025741334302754500222420ustar00rootroot00000000000000/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ /* global Components: false */ "use strict"; Components.utils.import("resource://enigmail/pEpAdapter.jsm"); /*global EnigmailPEPAdapter: false */ var Enigmail = { usingPep: null, onLoad: function(event) { this.usingPep = EnigmailPEPAdapter.usingPep(); }, onClose: function(event) { let usingPep = EnigmailPEPAdapter.usingPep(); if (usingPep !== this.usingPep) { EnigmailPEPAdapter.handleJuniorModeChange(); } if (usingPep) { EnigmailPEPAdapter.setOwnIdentities(0); } }, onUnloadEnigmail: function() { window.removeEventListener("load-enigmail", Enigmail.onLoad, true); window.removeEventListener("unload-enigmail", Enigmail.onUnload, true); window.removeEventListener("dialogaccept", Enigmail.onClose, false); window.removeEventListener("dialogcancel", Enigmail.onClose, false); } }; window.addEventListener("load-enigmail", Enigmail.onLoad.bind(Enigmail), true); window.addEventListener("unload-enigmail", Enigmail.onUnloadEnigmail.bind(Enigmail), true); window.addEventListener("dialogaccept", Enigmail.onClose.bind(Enigmail), false); window.addEventListener("dialogcancel", Enigmail.onClose.bind(Enigmail), false); enigmail-2.0.8/ui/content/accountManagerOverlay.xul000066400000000000000000000007741334302754500224360ustar00rootroot00000000000000 enigmail-2.0.8/ui/content/enigmailCommon.js000066400000000000000000000601501334302754500207010ustar00rootroot00000000000000/*global Components: false, EnigmailFiles: false, EnigmailCore: false, EnigmailApp: false, EnigmailDialog: false, EnigmailWindows: false, EnigmailTime: false */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ /** * PLEASE NOTE: this module is legacy and must not be used for newe code - it will be removed! */ "use strict"; // enigmailCommon.js: shared JS functions for Enigmail // WARNING: This module functions must not be loaded in overlays to standard functionality! // Many of these components are not used in this file, but are instead used in other files that are loaded together with EnigmailCommon Components.utils.import("resource://enigmail/core.jsm"); /*global EnigmailCore: false */ Components.utils.import("resource://enigmail/funcs.jsm"); /*global EnigmailFuncs: false */ Components.utils.import("resource://enigmail/keyEditor.jsm"); /*global EnigmailKeyEditor: false */ Components.utils.import("resource://enigmail/key.jsm"); /*global EnigmailKey: false */ Components.utils.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ Components.utils.import("resource://enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ Components.utils.import("resource://enigmail/os.jsm"); /*global EnigmailOS: false */ Components.utils.import("resource://enigmail/locale.jsm"); /*global EnigmailLocale: false */ Components.utils.import("resource://enigmail/data.jsm"); /*global EnigmailData: false */ Components.utils.import("resource://enigmail/files.jsm"); /*global EnigmailFiles: false */ Components.utils.import("resource://enigmail/app.jsm"); /*global EnigmailApp: false */ Components.utils.import("resource://enigmail/dialog.jsm"); /*global EnigmailDialog: false */ Components.utils.import("resource://enigmail/windows.jsm"); /*global EnigmailWindows: false */ Components.utils.import("resource://enigmail/time.jsm"); /*global EnigmailTime: false */ Components.utils.import("resource://enigmail/timer.jsm"); /*global EnigmailTimer: false */ Components.utils.import("resource://enigmail/keyRing.jsm"); /*global EnigmailKeyRing: false */ Components.utils.import("resource://enigmail/trust.jsm"); /*global EnigmailTrust: false */ Components.utils.import("resource://enigmail/constants.jsm"); /*global EnigmailConstants: false */ Components.utils.import("resource://enigmail/errorHandling.jsm"); /*global EnigmailErrorHandling: false */ Components.utils.import("resource://enigmail/keyserver.jsm"); /*global EnigmailKeyServer: false */ Components.utils.import("resource://enigmail/events.jsm"); /*global EnigmailEvents: false */ Components.utils.import("resource://enigmail/gpg.jsm"); /*global EnigmailGpg: false */ Components.utils.import("resource://enigmail/gpgAgent.jsm"); /*global EnigmailGpgAgent: false */ Components.utils.import("resource://enigmail/streams.jsm"); /*global EnigmailStreams: false */ // The compatible Enigmime version var gEnigmailSvc; var gEnigPromptSvc; // Maximum size of message directly processed by Enigmail const ENIG_PROCESSINFO_CONTRACTID = "@mozilla.org/xpcom/process-info;1"; const ENIG_ENIGMAIL_CONTRACTID = "@mozdev.org/enigmail/enigmail;1"; const ENIG_STRINGBUNDLE_CONTRACTID = "@mozilla.org/intl/stringbundle;1"; const ENIG_LOCAL_FILE_CONTRACTID = "@mozilla.org/file/local;1"; const ENIG_DIRSERVICE_CONTRACTID = "@mozilla.org/file/directory_service;1"; const ENIG_MIME_CONTRACTID = "@mozilla.org/mime;1"; const ENIG_WMEDIATOR_CONTRACTID = "@mozilla.org/rdf/datasource;1?name=window-mediator"; const ENIG_ASS_CONTRACTID = "@mozilla.org/appshell/appShellService;1"; const ENIG_LOCALE_SVC_CONTRACTID = "@mozilla.org/intl/nslocaleservice;1"; const ENIG_DATE_FORMAT_CONTRACTID = "@mozilla.org/intl/scriptabledateformat;1"; const ENIG_ACCOUNT_MANAGER_CONTRACTID = "@mozilla.org/messenger/account-manager;1"; const ENIG_THREAD_MANAGER_CID = "@mozilla.org/thread-manager;1"; const ENIG_SIMPLEURI_CONTRACTID = "@mozilla.org/network/simple-uri;1"; const ENIG_SEAMONKEY_ID = "{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}"; const ENIG_STANDARD_URL_CONTRACTID = "@mozilla.org/network/standard-url;1"; const ENIG_SCRIPTABLEINPUTSTREAM_CONTRACTID = "@mozilla.org/scriptableinputstream;1"; const ENIG_BINARYINPUTSTREAM_CONTRACTID = "@mozilla.org/binaryinputstream;1"; const ENIG_SAVEASCHARSET_CONTRACTID = "@mozilla.org/intl/saveascharset;1"; const ENIG_STREAMCONVERTERSERVICE_CID_STR = "{892FFEB0-3F80-11d3-A16C-0050041CAF44}"; const ENIG_ISCRIPTABLEUNICODECONVERTER_CONTRACTID = "@mozilla.org/intl/scriptableunicodeconverter"; const ENIG_IOSERVICE_CONTRACTID = "@mozilla.org/network/io-service;1"; const ENIG_C = Components.classes; const ENIG_I = Components.interfaces; // Key algorithms const ENIG_KEYTYPE_DSA = 1; const ENIG_KEYTYPE_RSA = 2; // field ID's of key list (as described in the doc/DETAILS file in the GnuPG distribution) const ENIG_KEY_TRUST = 1; const ENIG_KEY_ID = 4; const ENIG_CREATED = 5; const ENIG_EXPIRY = 6; const ENIG_UID_ID = 7; const ENIG_OWNERTRUST = 8; const ENIG_USER_ID = 9; const ENIG_SIG_TYPE = 10; const ENIG_KEY_USE_FOR = 11; const ENIG_KEY_EXPIRED = "e"; const ENIG_KEY_REVOKED = "r"; const ENIG_KEY_INVALID = "i"; const ENIG_KEY_DISABLED = "d"; const ENIG_KEY_NOT_VALID = ENIG_KEY_EXPIRED + ENIG_KEY_REVOKED + ENIG_KEY_INVALID + ENIG_KEY_DISABLED; // GUI List: The corresponding image to set the "active" flag / checkbox const ENIG_IMG_NOT_SELECTED = "chrome://enigmail/content/check0.png"; const ENIG_IMG_SELECTED = "chrome://enigmail/content/check1.png"; const ENIG_IMG_DISABLED = "chrome://enigmail/content/check2.png"; // Encryption flags if (EnigmailConstants) { const ENIG_SIGN = EnigmailConstants.SEND_SIGNED; const ENIG_ENCRYPT = EnigmailConstants.SEND_ENCRYPTED; const ENIG_ENCRYPT_OR_SIGN = ENIG_ENCRYPT | ENIG_SIGN; } // UsePGPMimeOption values const PGP_MIME_NEVER = 0; const PGP_MIME_POSSIBLE = 1; const PGP_MIME_ALWAYS = 2; const ENIG_POSSIBLE_PGPMIME = EnigmailConstants.POSSIBLE_PGPMIME; const ENIG_PGP_DESKTOP_ATT = -2082; var gUsePGPMimeOptionList = ["usePGPMimeNever", "usePGPMimePossible", "usePGPMimeAlways" ]; // sending options: var gEnigEncryptionModel = ["encryptionModelConvenient", "encryptionModelManually" ]; var gEnigAcceptedKeys = ["acceptedKeysValid", "acceptedKeysAll" ]; var gEnigAutoSendEncrypted = ["autoSendEncryptedNever", "autoSendEncryptedIfKeys" ]; var gEnigConfirmBeforeSending = ["confirmBeforeSendingNever", "confirmBeforeSendingAlways", "confirmBeforeSendingIfEncrypted", "confirmBeforeSendingIfNotEncrypted", "confirmBeforeSendingIfRules" ]; const ENIG_BUTTON_POS_0 = 1; const ENIG_BUTTON_POS_1 = 1 << 8; const ENIG_BUTTON_POS_2 = 1 << 16; const ENIG_BUTTON_TITLE_IS_STRING = 127; const ENIG_HEADERMODE_KEYID = 0x01; const ENIG_HEADERMODE_URL = 0x10; function EnigGetFrame(win, frameName) { return EnigmailWindows.getFrame(win, frameName); } // Initializes enigmailCommon function EnigInitCommon(id) { EnigmailLog.DEBUG("enigmailCommon.js: EnigInitCommon: id=" + id + "\n"); gEnigPromptSvc = enigGetService("@mozilla.org/embedcomp/prompt-service;1", "nsIPromptService"); } function GetEnigmailSvc() { if (!gEnigmailSvc) gEnigmailSvc = EnigmailCore.getService(window); return gEnigmailSvc; } // maxBytes == -1 => read everything function EnigReadURLContents(url, maxBytes) { EnigmailLog.DEBUG("enigmailCommon.js: EnigReadURLContents: url=" + url + ", " + maxBytes + "\n"); var ioServ = enigGetService(ENIG_IOSERVICE_CONTRACTID, "nsIIOService"); if (!ioServ) throw Components.results.NS_ERROR_FAILURE; var fileChannel = EnigmailStreams.createChannel(url); var rawInStream = fileChannel.open(); var inStream = ENIG_C[ENIG_BINARYINPUTSTREAM_CONTRACTID].createInstance(ENIG_I.nsIBinaryInputStream); inStream.setInputStream(rawInStream); var available = inStream.available(); if ((maxBytes < 0) || (maxBytes > available)) maxBytes = available; var data = inStream.readBytes(maxBytes); inStream.close(); return data; } // maxBytes == -1 => read whole file function EnigReadFileContents(localFile, maxBytes) { EnigmailLog.DEBUG("enigmailCommon.js: EnigReadFileContents: file=" + localFile.leafName + ", " + maxBytes + "\n"); if (!localFile.exists() || !localFile.isReadable()) throw Components.results.NS_ERROR_FAILURE; var ioServ = enigGetService(ENIG_IOSERVICE_CONTRACTID, "nsIIOService"); if (!ioServ) throw Components.results.NS_ERROR_FAILURE; var fileURI = ioServ.newFileURI(localFile); return EnigReadURLContents(fileURI.asciiSpec, maxBytes); } /////////////////////////////////////////////////////////////////////////////// // write exception information function EnigWriteException(referenceInfo, ex) { EnigmailLog.writeException(referenceInfo, ex); } /////////////////////////////////////////////////////////////////////////////// function EnigAlert(mesg) { return EnigmailDialog.alert(window, mesg); } /** * Displays an alert dialog with 3-4 optional buttons. * checkBoxLabel: if not null, display checkbox with text; the checkbox state is returned in checkedObj * button-Labels: use "&" to indicate access key * use "buttonType:label" or ":buttonType" to indicate special button types * (buttonType is one of cancel, help, extra1, extra2) * return: 0-2: button Number pressed * -1: ESC or close window button pressed * */ function EnigLongAlert(mesg, checkBoxLabel, okLabel, labelButton2, labelButton3, checkedObj) { return EnigmailDialog.longAlert(window, mesg, checkBoxLabel, okLabel, labelButton2, labelButton3, checkedObj); } function EnigAlertPref(mesg, prefText) { return EnigmailDialog.alertPref(window, mesg, prefText); } // Confirmation dialog with OK / Cancel buttons (both customizable) function EnigConfirm(mesg, okLabel, cancelLabel) { return EnigmailDialog.confirmDlg(window, mesg, okLabel, cancelLabel); } function EnigError(mesg) { return gEnigPromptSvc.alert(window, EnigGetString("enigError"), mesg); } function EnigHelpWindow(source) { EnigmailWindows.openHelpWindow(source); } function EnigDisplayRadioPref(prefName, prefValue, optionElementIds) { EnigmailLog.DEBUG("enigmailCommon.js: EnigDisplayRadioPref: " + prefName + ", " + prefValue + "\n"); if (prefValue >= optionElementIds.length) return; var groupElement = document.getElementById("enigmail_" + prefName); var optionElement = document.getElementById(optionElementIds[prefValue]); if (groupElement && optionElement) { groupElement.selectedItem = optionElement; groupElement.value = prefValue; } } function EnigSetRadioPref(prefName, optionElementIds) { EnigmailLog.DEBUG("enigmailCommon.js: EnigSetRadioPref: " + prefName + "\n"); try { var groupElement = document.getElementById("enigmail_" + prefName); if (groupElement) { var optionElement = groupElement.selectedItem; var prefValue = optionElement.value; if (prefValue < optionElementIds.length) { EnigSetPref(prefName, prefValue); groupElement.value = prefValue; } } } catch (ex) {} } function EnigSavePrefs() { return EnigmailPrefs.savePrefs(); } function EnigGetPref(prefName) { return EnigmailPrefs.getPref(prefName); } function EnigGetDefaultPref(prefName) { EnigmailLog.DEBUG("enigmailCommon.js: EnigGetDefaultPref: prefName=" + prefName + "\n"); var prefValue = null; try { EnigmailPrefs.getPrefBranch().lockPref(prefName); prefValue = EnigGetPref(prefName); EnigmailPrefs.getPrefBranch().unlockPref(prefName); } catch (ex) {} return prefValue; } function EnigSetPref(prefName, value) { return EnigmailPrefs.setPref(prefName, value); } function EnigConvertFromUnicode(text, charset) { EnigmailLog.DEBUG("enigmailCommon.js: EnigConvertFromUnicode: " + charset + "\n"); if (!text) return ""; if (!charset) charset = "utf-8"; // Encode plaintext try { var unicodeConv = ENIG_C[ENIG_ISCRIPTABLEUNICODECONVERTER_CONTRACTID].getService(ENIG_I.nsIScriptableUnicodeConverter); unicodeConv.charset = charset; return unicodeConv.ConvertFromUnicode(text); } catch (ex) { EnigmailLog.DEBUG("enigmailCommon.js: EnigConvertFromUnicode: caught an exception\n"); return text; } } function EnigConvertToUnicode(text, charset) { // EnigmailLog.DEBUG("enigmailCommon.js: EnigConvertToUnicode: "+charset+"\n"); if (!text || !charset /*|| (charset.toLowerCase() == "iso-8859-1")*/ ) return text; // Encode plaintext try { var unicodeConv = ENIG_C[ENIG_ISCRIPTABLEUNICODECONVERTER_CONTRACTID].getService(ENIG_I.nsIScriptableUnicodeConverter); unicodeConv.charset = charset; return unicodeConv.ConvertToUnicode(text); } catch (ex) { EnigmailLog.DEBUG("enigmailCommon.js: EnigConvertToUnicode: caught an exception while converting'" + text + "' to " + charset + "\n"); return text; } } function EnigConvertGpgToUnicode(text) { return EnigmailData.convertGpgToUnicode(text); } function EnigFormatFpr(fingerprint) { return EnigmailKey.formatFpr(fingerprint); } ///////////////////////// // Console stuff ///////////////////////// // return the options passed to a window function EnigGetWindowOptions() { var winOptions = []; if (window.location.search) { var optList = window.location.search.substr(1).split(/&/); for (var i = 0; i < optList.length; i++) { var anOption = optList[i].split(new RegExp("=")); winOptions[anOption[0]] = unescape(anOption[1]); } } return winOptions; } function EnigRulesEditor() { EnigmailWindows.openRulesEditor(); } function EngmailCardDetails() { EnigmailWindows.openCardDetails(); } function EnigKeygen() { EnigmailWindows.openKeyGen(); } // retrieves a localized string from the enigmail.properties stringbundle function EnigGetString(aStr) { var argList = []; // unfortunately arguments.shift() doesn't work, so we use a workaround if (arguments.length > 1) for (var i = 1; i < arguments.length; i++) { argList.push(arguments[i]); } return EnigmailLocale.getString(aStr, (arguments.length > 1 ? argList : null)); } //get path for temporary directory (e.g. /tmp, C:\TEMP) function EnigGetTempDir() { return EnigmailFiles.getTempDir(); } // get the OS platform function EnigGetOS() { return EnigmailOS.getOS(); } function EnigGetVersion() { return EnigmailApp.getVersion(); } function EnigFilePicker(title, displayDir, save, defaultExtension, defaultName, filterPairs) { return EnigmailDialog.filePicker(window, title, displayDir, save, defaultExtension, defaultName, filterPairs); } // get keys from keyserver function EnigDownloadKeys(inputObj, resultObj) { return EnigmailWindows.downloadKeys(window, inputObj, resultObj); } // create new PGP Rule function EnigNewRule(emailAddress) { return EnigmailWindows.createNewRule(window, emailAddress); } function EnigGetTrustCode(keyObj) { return EnigmailTrust.getTrustCode(keyObj); } function EnigEditKeyTrust(userIdArr, keyIdArr) { return EnigmailWindows.editKeyTrust(window, userIdArr, keyIdArr); } function EnigEditKeyExpiry(userIdArr, keyIdArr) { return EnigmailWindows.editKeyExpiry(window, userIdArr, keyIdArr); } function EnigDisplayKeyDetails(keyId, refresh) { return EnigmailWindows.openKeyDetails(window, keyId, refresh); } function EnigSignKey(userId, keyId) { return EnigmailWindows.signKey(window, userId, keyId); } function EnigChangeKeyPwd(keyId, userId) { // gpg-agent used: gpg-agent will handle everything EnigmailKeyEditor.changePassphrase(window, "0x" + keyId, "", "", function _changePwdCb(exitCode, errorMsg) { if (exitCode !== 0) { EnigAlert(EnigGetString("changePassFailed") + "\n\n" + errorMsg); } }); } function EnigRevokeKey(keyId, userId, callbackFunc) { var enigmailSvc = GetEnigmailSvc(); if (!enigmailSvc) return false; var userDesc = "0x" + keyId + " - " + userId; if (!EnigConfirm(EnigGetString("revokeKeyQuestion", userDesc), EnigGetString("keyMan.button.revokeKey"))) return false; var tmpDir = EnigGetTempDir(); var revFile; try { revFile = ENIG_C[ENIG_LOCAL_FILE_CONTRACTID].createInstance(EnigGetLocalFileApi()); revFile.initWithPath(tmpDir); if (!(revFile.isDirectory() && revFile.isWritable())) { EnigAlert(EnigGetString("noTempDir")); return false; } } catch (ex) {} revFile.append("revkey.asc"); EnigmailKeyEditor.genRevokeCert(window, "0x" + keyId, revFile, "0", "", function _revokeCertCb(exitCode, errorMsg) { if (exitCode !== 0) { revFile.remove(false); EnigAlert(EnigGetString("revokeKeyFailed") + "\n\n" + errorMsg); return; } var errorMsgObj = {}; var keyList = {}; var r = EnigmailKeyRing.importKeyFromFile(revFile, errorMsgObj, keyList); revFile.remove(false); if (r !== 0) { EnigAlert(EnigGetString("revokeKeyFailed") + "\n\n" + EnigConvertGpgToUnicode(errorMsgObj.value)); } else { EnigAlert(EnigGetString("revokeKeyOk")); } if (callbackFunc) { callbackFunc(r === 0); } }); return true; } function EnigGetLocalFileApi() { return Components.interfaces.nsIFile; } function EnigShowPhoto(keyId, userId, photoNumber) { EnigmailWindows.showPhoto(window, keyId, userId, photoNumber); } function EnigGetFilePath(nsFileObj) { return EnigmailFiles.getFilePath(nsFileObj); } function EnigCreateRevokeCert(keyId, userId, callbackFunc) { var defaultFileName = userId.replace(/[<>]/g, ""); defaultFileName += " (0x" + keyId + ") rev.asc"; var outFile = EnigFilePicker(EnigGetString("saveRevokeCertAs"), "", true, "*.asc", defaultFileName, [EnigGetString("asciiArmorFile"), "*.asc"]); if (!outFile) return -1; var enigmailSvc = GetEnigmailSvc(); if (!enigmailSvc) return -1; EnigmailKeyEditor.genRevokeCert(window, "0x" + keyId, outFile, "1", "", function _revokeCertCb(exitCode, errorMsg) { if (exitCode !== 0) { EnigAlert(EnigGetString("revokeCertFailed") + "\n\n" + errorMsg); } else { EnigAlert(EnigGetString("revokeCertOK")); } if (callbackFunc) callbackFunc(exitCode === 0); }); return 0; } // return the label of trust for a given trust code function EnigGetTrustLabel(trustCode) { return EnigmailTrust.getTrustLabel(trustCode); } function EnigGetDateTime(dateNum, withDate, withTime) { return EnigmailTime.getDateTime(dateNum, withDate, withTime); } function enigCreateInstance(aURL, aInterface) { return ENIG_C[aURL].createInstance(ENIG_I[aInterface]); } function enigGetService(aURL, aInterface) { // determine how 'aInterface' is passed and handle accordingly switch (typeof(aInterface)) { case "object": return ENIG_C[aURL].getService(aInterface); case "string": return ENIG_C[aURL].getService(ENIG_I[aInterface]); default: return ENIG_C[aURL].getService(); } } function EnigCollapseAdvanced(obj, attribute, dummy) { return EnigmailFuncs.collapseAdvanced(obj, attribute, dummy); } /** * EnigOpenUrlExternally * * forces a uri to be loaded in an external browser * * @uri nsIUri object */ function EnigOpenUrlExternally(uri) { let eps = ENIG_C["@mozilla.org/uriloader/external-protocol-service;1"]. getService(ENIG_I.nsIExternalProtocolService); eps.loadURI(uri, null); } function EnigOpenURL(event, hrefObj) { var xulAppinfo = ENIG_C["@mozilla.org/xre/app-info;1"].getService(ENIG_I.nsIXULAppInfo); if (xulAppinfo.ID == ENIG_SEAMONKEY_ID) return; try { var ioservice = ENIG_C["@mozilla.org/network/io-service;1"]. getService(ENIG_I.nsIIOService); var iUri = ioservice.newURI(hrefObj.href, null, null); EnigOpenUrlExternally(iUri); event.preventDefault(); event.stopPropagation(); } catch (ex) {} } function EnigGetHttpUri(aEvent) { function hRefForClickEvent(aEvent, aDontCheckInputElement) { var href; var isKeyCommand = (aEvent.type == "command"); var target = isKeyCommand ? document.commandDispatcher.focusedElement : aEvent.target; if (target instanceof HTMLAnchorElement || target instanceof HTMLAreaElement || target instanceof HTMLLinkElement) { if (target.hasAttribute("href")) href = target.href; } else if (!aDontCheckInputElement && target instanceof HTMLInputElement) { if (target.form && target.form.action) href = target.form.action; } else { // we may be nested inside of a link node var linkNode = aEvent.originalTarget; while (linkNode && !(linkNode instanceof HTMLAnchorElement)) linkNode = linkNode.parentNode; if (linkNode) href = linkNode.href; } return href; } // getHttpUri main function let href = hRefForClickEvent(aEvent); if (!href) return null; EnigmailLog.DEBUG("enigmailAbout.js: interpretHtmlClick: href='" + href + "'\n"); var ioServ = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService); var uri = ioServ.newURI(href, null, null); if (Components.classes["@mozilla.org/uriloader/external-protocol-service;1"] .getService(Components.interfaces.nsIExternalProtocolService) .isExposedProtocol(uri.scheme) && (uri.schemeIs("http") || uri.schemeIs("https"))) return uri; return null; } /** * GUI List: Set the "active" flag and the corresponding image */ function EnigSetActive(element, status) { if (status >= 0) { element.setAttribute("active", status.toString()); } switch (status) { case 0: element.setAttribute("src", ENIG_IMG_NOT_SELECTED); break; case 1: element.setAttribute("src", ENIG_IMG_SELECTED); break; case 2: element.setAttribute("src", ENIG_IMG_DISABLED); break; default: element.setAttribute("active", -1); } } /** * Receive a GUI List and remove all entries * * @param XML-DOM (it will be changed!) */ function EnigCleanGuiList(guiList) { while (guiList.firstChild) { guiList.removeChild(guiList.firstChild); } } /** * create a new treecell element * * @param String label of the cell * * @return treecell node */ function createCell(label) { var cell = document.createElement("treecell"); cell.setAttribute("label", label); return cell; } /** * Process the output of GPG and return the key details * * @param String Values separated by colons and linebreaks * * @return Object with the following keys: * gUserId: Main user ID * calcTrust, * ownerTrust, * fingerprint, * showPhoto, * uidList: List of Pseudonyms and E-Mail-Addresses, * subkeyList: List of Subkeys */ function EnigGetKeyDetails(sigListStr) { var gUserId; var calcTrust; var ownerTrust; var fingerprint; var creationDate; var expiryDate; var uidList = []; var subkeyList = []; var showPhoto = false; var sigList = sigListStr.split(/[\n\r]+/); for (var i = 0; i < sigList.length; i++) { var aLine = sigList[i].split(/:/); switch (aLine[0]) { case "pub": gUserId = EnigConvertGpgToUnicode(aLine[9]); calcTrust = aLine[1]; if (aLine[11].indexOf("D") >= 0) { calcTrust = "d"; } ownerTrust = aLine[8]; creationDate = EnigmailTime.getDateTime(aLine[5], true, false); expiryDate = EnigmailTime.getDateTime(aLine[6], true, false); subkeyList.push(aLine); if (!gUserId) { gUserId = EnigConvertGpgToUnicode(aLine[9]); } else if (uidList !== false) { uidList.push(aLine); } break; case "uid": if (!gUserId) { gUserId = EnigConvertGpgToUnicode(aLine[9]); } else if (uidList !== false) { uidList.push(aLine); } break; case "uat": // User Attributes with "1 " in field 9 determine JPEG pictures if (aLine[9].search("1 ") === 0) { showPhoto = true; } break; case "sub": subkeyList.push(aLine); break; case "fpr": if (!fingerprint) { fingerprint = aLine[9]; } break; } } var keyDetails = { gUserId: gUserId, calcTrust: calcTrust, ownerTrust: ownerTrust, fingerprint: fingerprint, showPhoto: showPhoto, uidList: uidList, creationDate: creationDate, expiryDate: expiryDate, subkeyList: subkeyList }; return keyDetails; } enigmail-2.0.8/ui/content/enigmailConsole.htm000066400000000000000000000011451334302754500212260ustar00rootroot00000000000000 Enigmail Console
ENIGMAIL CONSOLE
enigmail-2.0.8/ui/content/enigmailConsole.js000066400000000000000000000070751334302754500210620ustar00rootroot00000000000000/*global Components: false */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; const Ci = Components.interfaces; Components.utils.import("resource://enigmail/core.jsm"); /*global EnigmailCore: false*/ Components.utils.import("resource://enigmail/pipeConsole.jsm"); /*global EnigmailConsole: false */ Components.utils.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ Components.utils.import("resource://enigmail/data.jsm"); /*global EnigmailData: false */ Components.utils.import("resource://enigmail/windows.jsm"); /*global EnigmailWindows: false */ /* global goUpdateCommand: false */ var gConsoleIntervalId; function consoleLoad() { EnigmailLog.DEBUG("enigmailConsole.js: consoleLoad\n"); let domWindowUtils = window.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils); domWindowUtils.loadSheetUsingURIString("chrome://enigmail/skin/enigmail.css", 1); top.controllers.insertControllerAt(0, CommandController); EnigmailCore.getService(window); // Refresh console every 2 seconds gConsoleIntervalId = window.setInterval(refreshConsole, 2000); updateData(); } function consoleUnload() { EnigmailLog.DEBUG("enigmailConsole.js: consoleUnload\n"); // Cancel console refresh if (window.consoleIntervalId) { window.clearInterval(gConsoleIntervalId); gConsoleIntervalId = null; } } function refreshConsole() { //EnigmailLog.DEBUG("enigmailConsole.js: refreshConsole():\n"); if (EnigmailConsole.hasNewData()) { EnigmailLog.DEBUG("enigmailConsole.js: refreshConsole(): hasNewData\n"); updateData(); } return false; } function updateData() { //EnigmailLog.DEBUG("enigmailConsole.js: updateData():\n"); var contentFrame = EnigmailWindows.getFrame(window, "contentFrame"); if (!contentFrame) return; var consoleElement = contentFrame.document.getElementById('console'); consoleElement.firstChild.data = EnigmailData.convertToUnicode(EnigmailConsole.getData(), "utf-8"); if (!contentFrame.mouseDownState) contentFrame.scrollTo(0, 9999); } function enigmailConsoleCopy() { var selText = getSelectionStr(); EnigmailLog.DEBUG("enigmailConsole.js: enigmailConsoleCopy: selText='" + selText + "'\n"); if (selText) { var clipHelper = Components.classes["@mozilla.org/widget/clipboardhelper;1"].createInstance(Components.interfaces.nsIClipboardHelper); clipHelper.copyString(selText); } return true; } function getSelectionStr() { try { var contentFrame = EnigmailWindows.getFrame(window, "contentFrame"); var sel = contentFrame.getSelection(); return sel.toString(); } catch (ex) { return ""; } } function isItemSelected() { EnigmailLog.DEBUG("enigmailConsole.js: isItemSelected\n"); return getSelectionStr() !== ""; } function UpdateCopyMenu() { EnigmailLog.DEBUG("enigmailConsole.js: UpdateCopyMenu\n"); goUpdateCommand("cmd_copy"); } var CommandController = { isCommandEnabled: function(aCommand) { switch (aCommand) { case "cmd_copy": return isItemSelected(); default: return false; } }, supportsCommand: function(aCommand) { switch (aCommand) { case "cmd_copy": return true; default: return false; } }, doCommand: function(aCommand) { switch (aCommand) { case "cmd_copy": enigmailConsoleCopy(); break; default: break; } }, onEvent: function(aEvent) {} }; enigmail-2.0.8/ui/content/enigmailConsole.xul000066400000000000000000000045541334302754500212550ustar00rootroot00000000000000 %enigmailDTD; %utilDTD; ]>
   
  
enigmail-2.0.8/ui/content/enigmailKeyserverDlg.js000066400000000000000000000053421334302754500220610ustar00rootroot00000000000000/*global Components: false */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; const Cu = Components.utils; const Ci = Components.interfaces; const { EnigmailLocale } = Cu.import("resource://enigmail/locale.jsm"); const { EnigmailPrefs } = Cu.import("resource://enigmail/prefs.jsm"); const { EnigmailDialog } = Cu.import("resource://enigmail/dialog.jsm"); function onLoad() { let domWindowUtils = window.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils); domWindowUtils.loadSheetUsingURIString("chrome://enigmail/skin/enigmail.css", 1); window.arguments[1].value = ""; let keyIdText = document.getElementById("keyIdText"); let searchCollapser = document.getElementById("searchCollapser"); let keyText; if (typeof(window.arguments[0].keyId) == "string") { var keyId = window.arguments[0].keyId; if (window.arguments[0].upload) { keyText = EnigmailLocale.getString("uploadKey", keyId); } else { keyText = EnigmailLocale.getString("importKey", keyId); } if (keyText.length > 400) { keyText = keyText.substr(0, 400) + " ..."; } keyIdText.firstChild.data = keyText; searchCollapser.setAttribute("collapsed", "true"); } else { keyIdText.setAttribute("collapsed", "true"); } var keyservers = EnigmailPrefs.getPref("keyserver").split(/[ ,;]/g); var menulist = document.getElementById("selectedServer"); var selected; for (var i = 0; i < keyservers.length; i++) { if (keyservers[i].length > 0 && (!window.arguments[0].upload || keyservers[i].slice(0, 10) != "keybase://")) { menulist.appendItem(keyservers[i]); if (selected === undefined) { selected = keyservers[i]; } } } document.getElementById("selectedServer").value = selected; } function onAccept() { let menulist = document.getElementById("selectedServer"); window.arguments[1].value = menulist.value; if (typeof(window.arguments[0].keyId) != "string") { window.arguments[1].email = document.getElementById("email").value; if (!window.arguments[1].email) { EnigmailDialog.alert(window, EnigmailLocale.getString("noEmailProvided")); return false; } } var selected = menulist.selectedIndex; if (selected !== 0) { let servers = [menulist.value]; let nodes = menulist.menupopup.getElementsByTagName('menuitem'); for (let i = 0, e = nodes.length; i < e; ++i) { if (i == selected) { continue; } servers.push(nodes[i].label); } EnigmailPrefs.setPref("keyserver", servers.join(', ')); } return true; } enigmail-2.0.8/ui/content/enigmailKeyserverDlg.xul000066400000000000000000000041361334302754500222550ustar00rootroot00000000000000 %brandDTD; %enigMailDTD; ]>

Changed behavior of Encrypt and Sign Buttons

enigmail-2.0.8/ui/locale/000077500000000000000000000000001334302754500151705ustar00rootroot00000000000000enigmail-2.0.8/ui/locale/en-US/000077500000000000000000000000001334302754500161175ustar00rootroot00000000000000enigmail-2.0.8/ui/locale/en-US/Makefile000066400000000000000000000013071334302754500175600ustar00rootroot00000000000000# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. DEPTH = ../../.. include $(DEPTH)/config/autoconf.mk LOCALEFILES = \ enigmail.dtd \ am-enigprefs.properties \ enigmail.properties HELPFILES = \ help/compose.html \ help/help.html\ help/messenger.html \ help/sendingPrefs.html \ help/editRcptRule.html \ help/initError.html \ help/rulesEditor.html all: deploy deploy: $(LOCALEFILES) $(HELPFILES) $(DEPTH)/util/install -m 644 $(DIST)/chrome/locale/en-US $(LOCALEFILES) $(DEPTH)/util/install -m 644 $(DIST)/chrome/locale/en-US/help $(HELPFILES) enigmail-2.0.8/ui/locale/en-US/am-enigprefs.properties000066400000000000000000000001211334302754500226040ustar00rootroot00000000000000# Strings used in the Mozill AccountManager prefPanel-enigprefs=OpenPGP Security enigmail-2.0.8/ui/locale/en-US/enigmail.dtd000066400000000000000000001755021334302754500204130ustar00rootroot00000000000000 Mozilla Public License 2.0."> The 'Autocrypt Key Transfer' requires that the email client on the other device is Autocrypt-compliant. While this is the easier solution, only a few apps currently support this standard. The other way is to 'Backup & restore' your settings. This will create a ZIP file with all required information and keys, that you can copy to your new device. Enigmail can directly import these settings; for other email clients, the ZIP file can be unpacked and handled manually."> OpenPGP Security)"> NOTE: Key generation may take up to several minutes to complete. Do not exit the application while key generation is in progress. Actively browsing or performing disk-intensive operations during key generation will replenish the 'randomness pool' and speed-up the process. You will be alerted when key generation is completed."> Autocrypt is a standard that defines how to achieve convenient end-to-end-encryption of e-mails. It specifies how e-mail programs negotiate encryption capabilities using regular e-mails."> NOTE: Key generation may take up to several minutes to complete. Do not exit the application while key generation is in progress. You will be alerted when key generation is completed."> Note: Enigmail will always verify signatures on emails for every account or identity, regardless of whether it is enabled or not"> public key is for others to send you encrypted emails. You can distribute it to everybody."> secret key is for you to decrypt these emails and to send signed emails. You should give it to nobody."> secret key is for you to decrypt these emails and to send signed emails. You should give it to nobody. To secure your secret key, you will be prompted for a passphrase in the following two dialogs."> passphrase is a password to protect your secret key. It prevents misuse of your secret key."> not recommended."> You will be prompted to enter your password for this. Please transfer the certificate to a medium which can be stored away safely such as a CD or USB stick. If somebody gains access to this certificate they can use it to render your key unusable."> export your data from your old computer using the backup wizard from the Enigmail Preferences import the data to your new computer using this wizard. "> Thank you for using Enigmail."> Please confirm the request that you will find in your inbox if you wish to do so."> export your data from your old computer using this wizard import the data to your new computer using the Setup Wizard. "> Please select below the account for which you want to transfer your key. We will display a setup code (password) on the following screen that you will need to enter on the other device in order to import your key and related settings."> Please switch to the other device now and open the message. You should be prompted for a setup code. Please type the following digits into the prompt:"> enigmail-2.0.8/ui/locale/en-US/enigmail.properties000066400000000000000000001477261334302754500220430ustar00rootroot00000000000000Enigmail=Enigmail ##################################################################### # Strings used within enigmailCommon.js and enigmailCommon.jsm ##################################################################### enigAlert=Enigmail Alert enigConfirm=Enigmail Confirm enigInfo=Enigmail Information enigError=Enigmail Error enigPrompt=Enigmail Prompt dlgYes=&Yes dlgNo=&No dlgKeepSetting=Remember my answer and do not ask me again dlgNoPrompt=Do not show me this dialog again dlg.button.delete=&Delete dlg.button.cancel=&Cancel dlg.button.close=&Close dlg.button.continue=Con&tinue dlg.button.skip=&Skip dlg.button.overwrite=&Overwrite dlg.button.view=&View dlg.button.retry=&Retry dlg.button.ignore=&Ignore dlg.button.install=&Install dlg.button.ok=&OK repeatPrefix=\n\nThis alert will repeat %S repeatSuffixSingular=more time. repeatSuffixPlural=more times. noRepeat=\n\nThis alert will not repeat until you upgrade Enigmail. pgpNotSupported=You seem to be using Enigmail together with PGP 6.x\n\nUnfortunately, PGP 6.x has a number of issues that prevent Enigmail from working correctly. Therefore, Enigmail does not support PGP 6.x anymore; please switch to GnuPG (GPG) instead.\n\nIf you need help on switching to GnuPG, check the Help section of the Enigmail homepage. initErr.howToFixIt=In order to use Enigmail, GnuPG is required. If you did not install GnuPG yet, the easiest way to do this is using the "Setup Wizard" button below. initErr.setupWizard.button=&Setup Wizard passphraseCleared=The passphrase has been cleared. cannotClearPassphrase=You are using a non-standard tool (such as gnome-keyring) for passphrase handling. Clearing the passphrase is therefore not possible from within Enigmail. noPhotoAvailable=No Photo available debugLog.title=Enigmail Debug Log error.photoPathNotReadable=Photo path '%S' is not readable generalError=Error: %S # Strings in configure.jsm enigmailCommon.versionSignificantlyChanged=This new version of Enigmail has significant changes in the handling of preferences and options. We tried to transfer the old settings to this new version. However, we cannot cover all cases automatically. Please double check the resulting new preferences and options. enigmailCommon.checkPreferences=Check Preferences ... preferences.defaultToPgpMime=We have changed the default message encoding in Enigmail from Inline-PGP to PGP/MIME. We recommend you keep this as default.\n\nIf you still wish to use Inline-PGP by default, you can do so in the Account Settings under OpenPGP Security. ##################################################################### # Strings in enigmailAbout.js ##################################################################### usingVersion=Running Enigmail version %S enigmailPepVersion=Enigmail/p≡p version %S usingAgent=Using %1$S executable %2$S to encrypt and decrypt agentError=ERROR: Failed to access Enigmail core service! ##################################################################### # Strings in enigmailKeygen.js ##################################################################### accessError=Error in accessing Enigmail service onlyGPG=Key generation only works with GnuPG (not with PGP)! keygenComplete=Key generation completed! Identity <%S> will be used for signing. revokeCertRecommended=We highly recommend to create a revocation certificate for your key. This certificate can be used to invalidate your key, e.g. in case your secret key gets lost or compromised. Do you want to create such a revocation certificate now? keyMan.button.generateCert=&Generate Certificate genCompleteNoSign=Key generation completed! genGoing=Key generation already in progress! passNoMatch=Passphrase entries do not match; please re-enter passCheckBox=Please check box if specifying no passphrase for key passUserName=Please specify user name for this identity keygen.missingUserName=There is no name specified for the selected account/identity. Please enter a value in the field "Your name" in the account settings. keygen.passCharProblem=You are using special characters in your passphrase. Unfortunately, this can cause troubles for other applications. We recommend you choose a passphrase consisting only of any of these characters:\na-z A-Z 0-9 /.;:-,!?(){}[]%* passSpaceProblem=Due to technical reasons, your passphrase may not start or end with a space character. changePassFailed=Changing the passphrase failed. keyConfirm=Generate public and secret key for '%S'? keyMan.button.generateKey=&Generate Key keyAbort=Abort key generation? keyMan.button.generateKeyAbort=&Abort Key Generation keyMan.button.generateKeyContinue=&Continue Key Generation expiryTooLong=You cannot create a key that expires in more than 100 years. expiryTooLongShorter=You cannot create a key that expires in more than 90 years. expiryTooShort=Your key must be valid for at least one day. keyGenFailed=The key generation failed. Please check the Enigmail console (Menu Enigmail > Debugging Options) for details. setKeyExpirationDateFailed=The expiration date could not be changed # Strings in enigmailMessengerOverlay.js securityInfo=Enigmail Security Info\n\n enigHeader=Enigmail: enigContentNote=Enigmail: *Attachments to this message have not been signed nor encrypted*\r\n\r\n possiblyPgpMime=Possibly PGP/MIME encrypted or signed message; use 'Decrypt/Verify' function to verify saveAttachmentHeader=Enigmail: Save decrypted attachment noTempDir=Could not find a temporary directory to write to\nPlease set the TEMP environment variable attachmentPgpKey=The attachment '%S' you are opening appears to be an OpenPGP key file.\n\nClick 'Import' to import the keys contained or 'View' to view the file contents in a browser window beginPgpPart=********* *BEGIN ENCRYPTED or SIGNED PART* ********* endPgpPart=********** *END ENCRYPTED or SIGNED PART* ********** notePartEncrypted=Enigmail: *Parts of the message have NOT been signed nor encrypted* noteCutMessage=Enigmail: *Multiple message blocks found -- decryption/verification aborted* decryptOkNoSig=Warning\n\nDecryption was successful, but the signature could not be verified correctly msgOvl.button.contAnyway=&Continue Anyway signature.verifiedOK=The signature for attachment %S was successfully verified signature.verifyFailed=The signature for attachment %S could not be verified attachment.noMatchToSignature=Could not match attachment '%S' to a signature file attachment.noMatchFromSignature=Could not match signature file '%S' to an attachment fixBrokenExchangeMsg.failed=Did not succeed to repair message. enigmail.msgViewColumn.label=Enigmail enigmailPep.msgViewColumn.label=Enigmail/p≡p wksNoIdentity=This key is not linked to any of your email accounts. Please add an account for at least one of the following email addresse(s):\n\n%S wksConfirmSuccess=Confirmation email sent. wksConfirmFailure=Sending the confirmation email failed. autocrypt.importSetupKey.accountPreconfigured=Your account is already correctly configured for Autocrypt.\n\nDo you really want to overwrite your settings with this setup message? autocrypt.importSetupKey.selfCreated=This message was created by your currently running instance of Enigmail.\n\nPlease switch to the email client to which you want to transfer the settings, and click on the message on that email client to import the settings. autocrypt.importSetupKey.invalidMessage=Error - could not read setup message. The message seems to be corrupted. Please try to create a new setup message on your "other" device. autocrypt.importSetupKey.invalidKey=Error - the key could not be imported. The key is either not supported by your version of GnuPG, or it got corrupted. autocrypt.importSetupKey.wrongPasswd=The password you entered is wrong. Do you want to retry? autocrypt.importSetupKey.success=The Autocrypt setup message was processed successfully. Autocrypt is now available for your account '%S'. ##################################################################### # Strings in enigmailMsgComposeOverlay.js ##################################################################### keysToExport=Select OpenPGP Keys to Insert keysToUse=Select OpenPGP Key(s) to use for %S pubKey=Public key for %S\n windowLocked=Compose window is locked; send cancelled sendUnencrypted=Failed to initialize Enigmail.\nSend unencrypted message? composeSpecifyEmail=Please specify your primary email address, which will be used to choose the signing key for outgoing messages.\n If you leave it blank, the FROM address of the message will be used to choose the signing key. sendingHiddenRcpt=This message has BCC (blind copy) recipients. If this message is encrypted, it is possible to hide the BCC recipients but users of some products (e.g. PGP Corp.) will not be able to decrypt the message. Given this, we recommend to avoid BCC-emails with encrypted messages. sendWithHiddenBcc=Hide BCC recipients sendWithShownBcc=Encrypt normally sendingNews=Encrypted send operation aborted.\n\nThis message cannot be encrypted because there are newsgroup recipients. Please re-send the message without encryption. sendToNewsWarning=Warning: you are about to send an encrypted email to a newsgroup.\n\nThis is discouraged because it only makes sense if all members of the group can decrypt the message, i.e. the message needs to be encrypted with the keys of all group participants. Please send this message only if you know exactly what you are doing.\n\nContinue? hasHTML=HTML email warning:\nThis message may contain HTML, which could cause signing/encryption to fail. To avoid this in the future, you should press the SHIFT key when clicking on the Compose/Reply button to send signed email.\nIf you sign email by default, you should uncheck the 'Compose Messages in HTML' preference box to permanently disable HTML email for this email account. strippingHTML=Message contains HTML formatting information that will be lost when converting to plain text for signing/encryption. Do you wish to proceed? msgCompose.button.sendAnyway=&Send Message Anyway attachWarning=Attachments to this message are not local, they cannot be encrypted. In order to encrypt the attachments, store them as local files first and attach these files. Do you wish to send the message anyway? quotedPrintableWarn=You have enabled 'quoted-printable' encoding for sending messages. This may result in incorrect decryption and/or verification of your message.\nDo you wish to turn off sending 'quoted-printable' messages now? minimalLineWrapping=You have set line wrapping to %S characters. For correct encryption and/or signing, this value needs to be at least 68.\nDo you wish to change line wrapping to 68 characters now? warning=Warning signIconClicked=You have manually modified signing. Therefore, while you are composing this message, (de)activating signing does not depend anymore on (de)activating encryption. errorOwnKeyUnusable=The key ID '%S' configured for the current identity does not yield a usable OpenPGP key.\n\nPlease ensure that you have a valid, not expired OpenPGP key and that your account settings point to that key.\nIf your key is not expired, then check if you did set Owner trust to full or ultimate. msgCompose.cannotSaveDraft=Error while saving draft msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information - partially encrypted email. msgCompose.partiallyEncrypted.mimeMsg=The message you are replying to contained both unencrypted and encrypted parts. Some encrypted message parts are invisible to you.\n\nIf the sender was not able to decrypt the hidden message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nWe recommend that you don't reply to the message, but create a new message containing your answer. msgCompose.partiallyEncrypted.inlinePGP=The message you are replying to contained both unencrypted and encrypted parts. If the sender was not able to decrypt some message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nPlease consider removing all quoted text from your reply to this sender. msgCompose.internalEncryptionError=Internal Error: promised encryption disabled msgCompose.internalError=An internal error has occurred. msgCompose.toolbarTxt.signAndEncrypt=This message will be signed and encrypted msgCompose.toolbarTxt.signOnly=This message will be signed msgCompose.toolbarTxt.encryptOnly=This message will be encrypted msgCompose.toolbarTxt.noEncryption=This message will be unsigned and unencrypted msgCompose.toolbarTxt.disabled=Enigmail is disabled for the selected identity msgCompose.protectSubject.tooltip=Protect the message subject msgCompose.noSubjectProtection.tooltip=Do not protect the message subject msgCompose.encryptedSubjectStub=Encrypted Message msgCompose.protectSubject.dialogTitle=Enable Protection of Subject? msgCompose.protectSubject.question=Regular encrypted emails contain the unredacted subject.\n\nWe have established a standard to hide the original subject in the encrypted message\nand replace it with a dummy text, such that the subject is only visible after the email is decrypted.\n\nDo you want to protect the subject in encrypted messages? msgCompose.protectSubject.yesButton=&Protect subject msgCompose.protectSubject.noButton=&Leave subject unprotected msgCompose.detailsButton.label=Details ... msgCompose.detailsButton.accessKey=D msgCompose.pepSendUnknown=Unknown msgCompose.pepSendUnsecure=Unsecure msgCompose.pepSendSecure=Secure msgCompose.pepSendTrusted=Secure & Trusted pep.alert.disabledForIdentity=p≡p is disabled for the current identity. Please enable p≡p via the Enigmail/p≡p preferences. pep.alert.weakReply=You’re about to forward or reply to a secure message as insecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? # note: should end with double newline: sendAborted=Send operation aborted.\n\n # details: keyNotTrusted=Not enough trust for key '%S' keyNotFound=Key '%S' not found keyRevoked=Key '%S' revoked keyExpired=Key '%S' expired statPGPMIME=PGP/MIME statSMIME=S/MIME statSigned=SIGNED statEncrypted=ENCRYPTED statPlain=UNSIGNED and UNENCRYPTED offlineSave=Save %1$S message to %2$S in Unsent Messages folder? onlineSend=Send %1$S message to %2$S? encryptKeysNote=Note: The message is encrypted for the following User ID's / Keys: %S hiddenKey= signFailed=Error in Enigmail: encryption/signing failed. Send the message unencrypted? msgCompose.button.sendUnencrypted=&Send Unencrypted Message recipientsSelectionHdr=Select Recipients for Encryption configureNow=You did not yet configure Enigmail security for the selected identity. Do you want to do this now? # encryption/signing status and associated reasons: encryptMessageAuto=Encrypt Message (auto) encryptMessageNorm=Encrypt Message signMessageAuto=Sign Message (auto) signMessageNorm=Sign Message encryptOff=Encryption: OFF encryptOnWithReason=Encryption: ON (%S) encryptOffWithReason=Encryption: OFF (%S) encryptOn=Encryption: ON signOn=Signing: ON signOff=Signing: OFF signOnWithReason=Signing: ON (%S) signOffWithReason=Signing: OFF (%S) reasonEnabledByDefault=enabled by default reasonManuallyForced=manually forced reasonByRecipientRules=forced by per-recipient rules reasonByAutoEncryption=forced by auto encryption reasonByConflict=due to conflict in per-recipient rules reasonByEncryptionMode=due to encryption mode # should not be used anymore: encryptYes=Message will be encrypted encryptNo=Message will not be encrypted # should not be used anymore: signYes=Message will be signed signNo=Message will not be signed # PGP/MIME status: pgpmimeNormal=Protocol: PGP/MIME inlinePGPNormal=Protocol: Inline PGP smimeNormal=Protocol: S/MIME pgpmimeAuto=Protocol: PGP/MIME (auto) inlinePGPAuto=Protocol: Inline PGP (auto) smimeAuto=Protocol: S/MIME (auto) # should not be used anymore pgpmimeYes=PGP/MIME will be used pgpmimeNo=Inline PGP will be used # Attach own key status (tooltip strings): attachOwnKeyNo=Your own key will not be attached attachOwnKeyYes=Your own key will be attached attachOwnKeyDisabled=Your own key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. rulesConflict=Conflicting per-recipient rules detected\n%S\n\nSend message with these settings? msgCompose.button.configure=&Configure msgCompose.button.send=&Send Message msgCompose.button.save=&Save Message # Strings in enigmailMsgHdrViewOverlay.js keyNeeded=Public key %S needed to verify signature keyUsed=Public key %S used to verify signature clickDecrypt=; use 'Decrypt/Verify' function clickDecryptRetry=; use 'Decrypt/Verify' function to retry clickDetailsButton=; click on 'Details' button for more information clickImportButton=; click on the 'Import Key' button to import the key keyTypeUnsupported=; the key type is not supported by your version of GnuPG msgPart=Part of the message %S msgSigned=signed msgSignedUnkownKey=signed with unknown key msgEncrypted=encrypted msgSignedAndEnc=signed and encrypted unverifiedSig=Unverified signature incompleteDecrypt=Decryption incomplete needKey=Error - no matching secret key found to decrypt message failedDecrypt=Error - decryption failed badPhrase=Error - bad passphrase mdcError=Error - message was not integrity protected failedDecryptVerify=Error - decryption/verification failed viewInfo=; View > Message security info for details decryptedMsg=Decrypted message decryptedMsgWithFormatError=Decrypted message (restored broken PGP email format probably caused by an old Exchange server, so that the result might not be perfect to read) usedAlgorithms=Used Algorithms: %1$S and %2$S pepStatusInfo.text=p≡p Message Status. pepStatusInfo.title.m3=Under Attack pepStatusInfo.info.m3=This message is not secure and has been tampered with. pepStatusInfo.title.m1=Mistrusted pepStatusInfo.info.m1=This message has a communication partner that has previously been marked as mistrusted pepStatusInfo.title.r0=Unknown pepStatusInfo.info.r0=This message does not contain enough information to determine if it is secure. pepStatusInfo.title.r1=Cannot Decrypt pepStatusInfo.info.r1=This message cannot be decrypted because the key is not available. pepStatusInfo.title.r2=Cannot Decrypt pepStatusInfo.info.r2=This message cannot be decrypted because the key is not available. pepStatusInfo.title.r3=Unsecure pepStatusInfo.info.r3=This message is unsecure. pepStatusInfo.title.r4=Unsecure for Some pepStatusInfo.info.r4=This message is unsecure for some communication partners. pepStatusInfo.title.r5=Unreliable Security pepStatusInfo.info.r5=This message has unreliable protection. pepStatusInfo.title.r6=Secure... pepStatusInfo.info.r6=This message is secure but you still need to verify the identity of your communication partner. pepStatusInfo.title.r7=Secure & Trusted pepStatusInfo.info.r7=This message is secure and trusted. pepStatusInfo.color.green=Green pepStatusInfo.color.yellow=Yellow pepStatusInfo.color.red=Red pepRevokeTrust.question=Do you really want to cancel the trust for %S? pepRevokeMistrust.question=Do you really want to re-trust the key for %S? pepRevokeTrust.doRevoke=Cancel &trust wksConfirmationReq=Web Key Directory Confirmation Request wksConfirmationReq.message=This message has been sent by your email provider to confirm deployment of your OpenPGP public key\nin their Web Key Directory.\nProviding your public key helps others to discover your key and thus being able to encrypt messages to you.\n\nIf you want to deploy your key in the Web Key Directory now, please click on the button "Confirm Request" in the status bar.\nOtherwise, simply ignore this message. wksConfirmationReq.button.label=Confirm Request autocryptSetupReq=Perform Autocrypt Setup autocryptSetupReq.button.label=Start Setup autocryptSetupReq.setupMsg.desc=This message contains all information to transfer your Autocrypt settings along with your secret key securely from your original device. autocryptSetupReq.setupMsg.backup=You can keep this message and use it as a backup for your secret key. If you want to do this, you should write down the password and store it securely. autocryptSetupReq.message.import=To import the settings and key(s) in Enigmail, please click on the "Start Setup" button in the status bar. autocryptSetupReq.message.sent=Please click on the message on your new device and follow the instuctions to import the settings. # strings in pref-enigmail.js oldGpgVersion20=Enigmail initialization failed.\n\nYou are using GnuPG version %1$S, which is not supported anymore. Enigmail requires GnuPG version %2$S or newer. Please upgrade your GnuPG installation, or Enigmail will not work. locateGpg=Locate GnuPG program invalidGpgPath=GnuPG cannot be executed with the path provided. Enigmail is therefore deactivated until you change the path to GnuPG again or until you restart the application. warningsAreReset=All warnings have been reset. prefs.gpgFound=GnuPG was found in %S prefs.gpgNotFound=Could not find GnuPG prefs.warnAskNever=Warning: activating this option will result in unencrypted emails without any further information if there is no key for one of the recipients -- Enigmail will not inform you if this happens! prefs.warnIdleTimeForUnknownAgent=Cannot connect to gpg-agent. Maybe your system uses a specialized tool for passphrase handling (e.g. gnome-keyring, seahorse-agent, KDE wallet manager, ...). Unfortunately Enigmail cannot control the passphrase timeout for the tool you are using. Therefore the respective timeout settings in Enigmail are disregarded. prefEnigmail.oneKeyserverOnly=Error - you can only specify one keyserver for automatic downloading of missing OpenPGP keys. # Strings used in core.jsm # (said file also re-uses some strings from above) enterAdminPin=Please type in the ADMIN PIN of your SmartCard enterCardPin=Please type your SmartCard PIN notInit=Error - Enigmail service not yet initialized badCommand=Error - encryption command failed cmdLine=command line and output: notRequired=Error - no encryption required notComplete=Error - key generation not yet completed invalidEmail=Error - invalid email address(es) noPassphrase=Error - no passphrase supplied noPGPblock=Error - No valid armored OpenPGP data block found unverifiedReply=Indented message part (reply) was probably modified keyInMessageBody=A key was found in the message body. Click 'Import Key' to import the key sigMismatch=Error - Signature mismatch cantImport=Error importing public key\n\n doImportOne=Import %1$S (%2$S)? doImportMultiple=Import the following keys?\n\n%S previewFailed=Can't read public key file. # Strings used in errorHandling.jsm sc.wrongCardAvailable=The SmartCard %1$S found in your reader cannot be used to process the message.\nPlease insert your SmartCard %2$S and repeat the operation. sc.insertCard=The operation requires your SmartCard %S.\nPlease insert the required SmartCard and repeat the operation. sc.removeCard=The operation requires no SmartCard to be in the reader.\nPlease remove your SmartCard and repeat the operation. sc.noCardAvailable=No SmartCard could be found in your reader\nPlease insert your SmartCard and repeat the operation. sc.noReaderAvailable=Your SmartCard reader could not be accessed\nPlease attach your SmartCard reader, insert your card, and repeat the operation. keyError.keySpecNotFound=The email address "%S" cannot be matched to a key on your keyring. keyError.keyIdNotFound=The configured key ID "%S" cannot be found on your keyring. keyError.resolutionAction=Please select a valid key in the OpenPGP section of your Account Settings. missingPassphrase=Missing passphrase errorHandling.gpgAgentInvalid=Your system is running a version of gpg-agent that is not suitable for your GnuPG version. errorHandling.gpgAgentError=GnuPG reported an error in the communication with gpg-agent (a component of GnuPG). errorHandling.dirmngrError=GnuPG reported an error in the communication with dirmngr (a component of GnuPG). errorHandling.pinentryError=GnuPG cannot query your passphrase via pinentry. errorHandling.readFaq=This is a system setup or configuration error that prevents Enigmail from working properly and cannot be fixed automatically.\n\nWe strongly recommend that you consult our support web site at https://enigmail.net/faq. gpgNotFound=Unable to locate GnuPG program '%S'.\nMake sure you have set the GnuPG executable path correctly in the Enigmail Preferences. gpgNotInPath=Unable to locate GnuPG executable in the PATH.\nMake sure you have set the GnuPG executable path correctly in the Enigmail Preferences. enigmailNotAvailable=Enigmail core Service not available prefGood=Good signature from %S prefBad=BAD signature from %S failCancel=Error - Key receive cancelled by user failNoServer=Error - No keyserver specified to receive key from failNoID=Error - No key ID specified to receive key for failKeyExtract=Error - key extraction command failed notFirstBlock=Error - First OpenPGP block not public key block importKeyConfirm=Import public key(s) embedded in message? failKeyImport=Error - key importing failed fileWriteFailed=Failed to write to file %S importKey=Import public key %S from keyserver: uploadKey=Send public key %S to keyserver: keyId=Key ID keyAndSigDate=Key ID: 0x%1$S / Signed on: %2$S keyFpr=Key fingerprint: %S noEmailProvided=You did not provide an email address! keyAlreadySigned=The key is already signed, you cannot sign it twice. ##################################################################### # Strings used in enigmailKeySelection.js ##################################################################### selKeyExpired=expired %S createdHeader=Created atLeastOneKey=No key selected! You have to select at least one key to accept this dialog fewerKeysThanRecipients=You have selected a smaller number of keys than recipients. Are you sure that the list of keys to encrypt is complete? userSel.button.goBack=Select more Keys userSel.secretKeySel.title=Select a Secret OpenPGP Key to Sign Your Messages userSel.problemNoKey=No valid key userSel.problemMultipleKeys=Multiple keys # should be same as thunderbird ENTITY sendLaterCmd.label: sendLaterCmd.label=Send Later # Strings used in enigmailAttachmentDialog.js pgpMimeNote=NOTE: PGP/MIME is not supported by all email clients. If you are unsure, select the %S option. first=first second=second # Strings used in am-enigprefs.js / enigmailEditIdentity.js encryptKeyHeader=Select OpenPGP Key for Encryption identityName=Identity: %S switchPepMode=You are currently using the 'p≡p Junior' mode of Enigmail.\n\nBy enabling OpenPGP or S/MIME for an account, you are disabling p≡p and use the 'regular' mode of Enigmail without p≡p. enableEnigmail=&Disable p≡p # Strings used in enigmailSingleRcptSettings.js noEncryption=You have activated encryption, but you did not select a key. In order to encrypt emails sent to %1$S, you need to specify one or several valid key(s) from your key list. Do you want to disable encryption for %2$S? noKeyToUse=(none - no encryption) noEmptyRule=The Rule may not be empty! Please set an email address in the Rule field. invalidAddress=The email address(es) you have entered are not valid. You should not set the names of the recipients, just the email addresses. E.g.:\nInvalid: Some Name \nValid: some.name@address.net noCurlyBrackets=The curly brackets {} have a special meaning and should not be used in an email address. If you want to modify the matching behavior for this rule, use the 'Apply rule if recipient ...' option.\nMore information is available from the Help button. # Strings used in enigmailRulesEditor.js never=Never always=Always possible=Possible deleteRule=Really delete the selected rule? nextRcpt=(Next recipient) negateRule=Not addKeyToRule=Add key %1$S (%2$S) to per-recipient rule # Strings used in enigmailSearchKey.js needOnline=The function you have selected is not available in offline mode. Please go online and try again. protocolNotSupported=The protocol '%S://' that you have selected is not supported for downloading OpenPGP keys. gpgkeysDisabled=It might help to enable the option 'extensions.enigmail.useGpgKeysTool'. noKeyserverConn=Could not connect to keyserver at %S. keyDownloadFailed=Failed to download key from keyserver. Status message is:\n%S internalError=An internal error occurred. The keys could not be downloaded or imported. noKeyFound=We could not find any key matching the specified search criteria. keyDownload.keyUnavailable=The key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their key by email. # gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. gpgKeysFailed=Failed to search or download key from keyserver: gpgkeys_%S could not be executed. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Setting owner trust failed # Strings in enigmailSignKeyDlg.js signKeyFailed=Key signing failed alreadySigned.label=Note: the key %S is already signed with the selected secret key. alreadySignedexportable.label=Note: the key %S is already signed exportable with the selected secret key. A local signature does not make sense. partlySigned.label=Note: some user IDs of key %S are already signed with the selected secret key. noTrustedOwnKeys=No eligible key found for signing! You need at least one fully trusted secret key in order to sign keys. # Strings in enigmailKeyManager.js keyMan.loadingKeys=Loading keys, please wait ... keyValid.unknown=unknown keyValid.invalid=invalid keyValid.disabled=disabled keyValid.revoked=revoked keyValid.expired=expired keyValid.noSubkey=no valid subkey keyTrust.untrusted=untrusted keyTrust.marginal=marginal keyTrust.full=trusted keyTrust.ultimate=ultimate keyTrust.group=(group) keyType.public=pub keyType.publicAndSec=pub/sec keyMan.enableKey=Enable Key keyMan.disableKey=Disable Key userAtt.photo=User attribute (JPEG image) asciiArmorFile=ASCII Armored Files (*.asc) importKeyFile=Import OpenPGP Key File gnupgFile=GnuPG Files createKeyOK=Your Key has been generated saveRevokeCertAs=Create & Save Revocation Certificate revokeCertOK=The revocation certificate has been successfully created. You can use it to invalidate your public key, e.g. in case you would lose your secret key. revokeCertFailed=The revocation certificate could not be created. addUidOK=User ID added successfully addUidFailed=Adding the User ID failed noKeySelected=You should select at least one key in order to perform the selected operation exportToFile=Export Public Key To File exportKeypairToFile=Export Secret and Public Key To File exportSecretKey=Do you want to include the secret key in the saved OpenPGP key file? saveKeysOK=The keys were successfully saved saveKeysFailed=Saving the keys failed importKeysFailed=Importing the keys failed enableKeyFailed=Enabling/disabling the keys failed specificPubKeyFilename=%1$S (0x%2$S) pub specificPubSecKeyFilename=%1$S (0x%2$S) pub-sec defaultPubKeyFilename=Exported-public-keys defaultPubSecKeyFilename=Exported-public-and-secret-keys noSecretKeys=No secret keys found.\n\nDo you want to generate your own key now? sendKeysOk=Key(s) sent successfully sendKeysFailed=Sending of keys failed receiveKeysOk=Key(s) updated successfully receiveKeysFailed=Downloading of keys failed importFromClip=Do you want to import some key(s) from clipboard? importFromUrl=Download public key from this URL: copyToClipbrdFailed=Could not copy the selected key(s) to the clipboard. copyToClipbrdOK=Key(s) copied to clipboard deleteSecretKey=WARNING: You are about to delete a secret key!\nIf you delete your secret key, you will no longer be able to decrypt any messages encrypted for that key, nor will you be able to revoke it.\n\nDo you really want to delete BOTH, the secret key and the public key\n'%S'? deleteMix=WARNING: You are about to delete secret keys!\nIf you delete your secret key, you will no longer be able to decrypt any messages encrypted for that key.\n\nDo you really want to delete BOTH, the selected secret and public keys? deletePubKey=Do you want to delete the public key\n'%S'? deleteSelectedPubKey=Do you want to delete the public keys? deleteKeyFailed=The key could not be deleted. revokeKeyQuestion=You are about to revoke the key '%S'.\n\nYou will no longer be able to sign with this key, and once distributed, others will no longer be able to encrypt with that key. You can still use the key to decrypt old messages.\n\nDo you want to proceed? revokeKeyOk=The key has been revoked. If your key is available on a key server, it is recommended to re-upload it, so that others can see the revocation. revokeKeyFailed=The key could not be revoked. revokeKeyNotPresent=You have no key (0x%S) which matches this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before importing the revocation certificate! revokeKeyAlreadyRevoked=The key 0x%S has already been revoked. refreshAllQuestion=You did not select any key. Would you like to refresh ALL keys? refreshKeyServiceOn.warn=Warning: Your keys are currently being refreshed in the background as safely as possible.\nRefreshing all your keys at once will unnecessarily reveal information about you.\nDo you really want to do this? refreshKey.warn=Warning: depending on the number of keys and the connection speed, refreshing all keys could be quite a lengthy process! downloadContactsKeys.warn=Warning: depending on the number of contacts and the connection speed, downloading all keys could be quite a lengthy process! downloadContactsKeys.importFrom=Import contacts from address book '%S'? keyMan.button.exportSecKey=Export &Secret Keys keyMan.button.exportPubKey=Export &Public Keys Only keyMan.button.import=&Import keyMan.button.refreshAll=&Refresh All Keys keyMan.button.revokeKey=&Revoke Key keyMan.button.skip=&Skip Key keylist.noOtherUids=Has no other identities keylist.hasOtherUids=Also known as keylist.noPhotos=No photo available keylist.hasPhotos=Photos keyMan.addphoto.filepicker.title=Select photo to add keyMan.addphoto.warnLargeFile=The file you have chosen is larger than 25 kB.\nIt is not recommended to add very large files as it causes very large keys. keyMan.addphoto.noJpegFile=The selected file does not appear to be a JPEG file. Please choose a different file. keyMan.addphoto.failed=The photo could not be added. noWksIdentity=The key %S does not have a WKS identity. keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key "%1$S (%2$S)" for encrypting messages? keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key "%1$S (%2$S)" for future messages? keyman.addBlacklistKey.button=&Blacklist the key keyman.removeBlacklistKey.button=&Remove key from Blacklist # Strings in enigmailManageUidDlg.xul changePrimUidFailed=Changing the primary User ID failed changePrimUidOK=The primary user ID was changed successfully revokeUidFailed=Revoking the user ID %S failed revokeUidOK=User ID %S was revoked successfully. If your key is available on a key server, it is recommended to re-upload it, so that others can see the revocation. revokeUidQuestion=Do you really want to revoke the user ID %S? # Strings in enigmailKeyImportInfo.xul importInfoTitle=SUCCESS! Keys imported importInfoBits=Bits importInfoCreated=Created importInfoFpr=Fingerprint importInfoDetails=(Details) importInfoNoKeys=No keys imported. # Strings in enigmailKeyDetailsDlg.xul keyTypePublic=public key keyTypePrimary=primary key keyTypeSubkey=subkey keyTypePair=key pair keyExpiryNever=never keyAlgorithm_1=RSA keyAlgorithm_2=RSA keyAlgorithm_3=RSA keyAlgorithm_16=ELG keyAlgorithm_17=DSA keyAlgorithm_18=ECDH keyAlgorithm_19=ECDSA keyAlgorithm_20=ELG keyAlgorithm_22=EDDSA keyUsageEncrypt=Encrypt keyUsageSign=Sign keyUsageCertify=Certify keyUsageAuthentication=Authentication keyDoesNotExpire=Key does not expire # Strings in enigmailGenCardKey.xul keygen.started=Please wait while the key is being generated .... keygen.completed=Key Generated. The new Key ID is: 0x%S keygen.keyBackup=The key is backed up as %S keygen.passRequired=Please specify a passphrase if you want to create a backup copy of your key outside your SmartCard. # Strings in enigmailSetCardPin.xul cardPin.processFailed=Failed to change PIN # Strings in enigRetrieveProgres.xul keyserverProgress.refreshing=Refreshing keys, please wait ... keyserverProgress.uploading=Uploading keys, please wait ... keyserverProgress.wksUploadFailed=Could not upload your key to the Web Key Service keyserverProgress.wksUploadCompleted=Your public key was successfully submitted to your provider. You will receive an email to confirm that you initiated the upload. keyserverTitle.refreshing=Refresh Keys keyserverTitle.uploading=Key Upload # Strings in enigmailSetupWizard passphrase.min8keys=Your passphrase should contain at least 8 characters! setupWizard.reallyCancel=Do you really want to close the Enigmail Setup Wizard? setupWizard.invalidGpg=The file you specified is not a GnuPG executable. Please specify a different file. setupWizard.specifyFile=You need to at least specify a public key file in order to proceed. setupWizard.installFailed=It seems that the installation was not successful. Please either retry the installation, or install GnuPG manually and locate it using the Browse button. setupWizard.downloadForbidden=For your own security, we will not download GnuPG. Please visit https://gnupg.org/ in order to download GnuPG. setupWizard.downloadImpossible=We cannot download GnuPG currently. Please try later or visit https://gnupg.org/ in order to download GnuPG. setupWizard.hashSumError=The wizard could not verify the integrity of the downloaded file. The file may be broken or tampered with. Do you want to continue the installation anyway? setupWizard.importSettingsFile=Specify backup file to load from setupWizard.invalidSettingsFile=The specified file is not a valid Enigmail Settings backup file. setupWizard.gpgConfExists=The GnuPG config file already exists. Do you want to overwrite it with the one from your old installation? setupWizard.noGpgHomeDir=It appears that you configured %S to be used with GnuPG. However, this is not a directory - you cannot use it. setupWizard.unmachtedIds=The following identities of your old setup could not be matched:\n%S\nThe settings for these identities were skipped. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=An error occurred while trying to download GnuPG. Please check the console log for further details. installGnuPG.installFailed=An error occurred while installing GnuPG. Please check the console log for further details. # Strings in enigmailAddUidDlg.xul addUidDlg.nameOrEmailError=You have to fill in a name and an email address addUidDlg.nameMinLengthError=The name must at least have 5 characters addUidDlg.invalidEmailError=You must specify a valid email address # Strings in enigmailCardDetails.js Carddetails.NoASCII=OpenPGP Smartcards only support ASCII characters in Firstname/Name. # network error types errorType.SecurityCertificate=The security certificate presented by the web service is not valid. errorType.SecurityProtocol=The security protocol used by the web service is unknown. errorType.Network=A network error has occurred. # filter stuff filter.folderRequired=You must select a target folder. filter.decryptMove.label=Decrypt permanently (Enigmail) filter.decryptCopy.label=Create decrypted Copy (Enigmail) filter.decryptMove.warnExperimental=Warning - the filter action "Decrypt permanently" may lead to destroyed messages.\n\nWe strongly recommend that you first try the "Create decrypted Copy" filter, test the result carefully, and only start using this filter once you are satisified with the result. filter.tempPepFilterDesc=Temporary filter to store sent message unencrypted filter.term.pgpencrypted.label=OpenPGP Encrypted filter.encrypt.label=Encrypt to key (Enigmail) filter.keyRequired=You must select a recipient key. filter.keyNotFound=Could not find an encryption key for "%S". filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for "%S" you will no longer be able to read the emails. # strings in enigmailConvert.jsm converter.decryptBody.failed=Could not decrypt message with subject\n"%S".\nDo you want to retry with a different passphrase or do you want to skip the message? converter.decryptAtt.failed=Could not decrypt attachment "%1$S"\nof message with subject\n"%2$S".\nDo you want to retry with a different passphrase or do you want to skip the message? saveLogFile.title=Save Log File # strings in gpg.jsm unknownSigningAlg=Unknown signing algorithm (ID: %S) unknownHashAlg=Unknown cryptographic hash (ID: %S) # strings in keyRing.jsm keyring.photo=Photo keyRing.pubKeyRevoked=The key %1$S (key ID %2$S) is revoked. keyRing.pubKeyExpired=The key %1$S (key ID %2$S) has expired. keyRing.pubKeyNotForSigning=The key %1$S (key ID %2$S) cannot be used for signing. keyRing.pubKeyNotForEncryption=The key %1$S (key ID %2$S) cannot be used for encryption. keyRing.keyDisabled=The key %1$S (key ID %2$S) is disabled; it cannot be used. keyRing.keyNotTrusted=The key %1$S (key ID %2$S) is not trusted enough. Please set the trust level of your key to "ultimate" to use it for signing. keyRing.keyInvalid=The key %1$S (key ID %2$S) is not valid. Please consider verifying it correctly. Alternatively use the Default encryption settings in the Enigmail preferences dialog. keyRing.signSubKeysRevoked=All signing-subkeys of key %1$S (key ID %2$S) are revoked. keyRing.signSubKeysExpired=All signing-subkeys of key %1$S (key ID %2$S) have expired. keyRing.signSubKeysUnusable=All signing-subkeys of key %1$S (key ID %2$S) are revoked, expired or otherwise unusable. keyRing.encSubKeysRevoked=All encryption subkeys of key %1$S (key ID %2$S) are revoked. keyRing.encSubKeysExpired=All encryption subkeys of key %1$S (key ID %2$S) have expired. keyRing.noSecretKey=You do not seem to have the secret key for %1$S (key ID %2$S) on your keyring; you cannot use the key for signing. keyRing.encSubKeysUnusable=All encryption subkeys of key %1$S (key ID %2$S) are revoked, expired or otherwise unusable. #strings in exportSettingsWizard.js cannotWriteToFile=Cannot save to file '%S'. Please select a different file. dataExportError=An error occurred during exporting your data. enigmailSettings=EnigmailSettings defaultBackupFileName=Enigmail-export specifyExportFile=Specify file name for exporting homedirParamNotSUpported=Additional parameters that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. #strings in expiry.jsm expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use it. expiry.keysExpireSoon=Your following keys will expire in less than %1$S days:\n%2$S We recommend that you create new keys and configure your accounts to use the new keys. expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to ultimate in key properties. expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to ultimate in key properties. expiry.OpenKeyManager=Open Enigmail Key Management expiry.OpenKeyProperties=Open Key Properties #strings in pEpDecrypt.jsm pEpDecrypt.cannotDecrypt=This is an encrypted message. Unfortunately you don't have the secret key to decrypt the message. #strings in gpgAgent.jsm gpghomedir.notexists=The directory '%S' containing your OpenPGP keys does not exist and cannot be created. gpghomedir.notwritable=The directory '%S' containing your OpenPGP keys is not writable. gpghomedir.notdirectory=The directory '%S' containing your OpenPGP keys is a file instead of a directory. gpghomedir.notusable=Please fix the directory permissions or change the location of your GnuPG "home" directory. GnuPG cannot work correctly otherwise. gpgAgent.noAutostart=You are using GnuPG version %S. This version requires that you pre-start gpg-agent before Thunderdbird is started, and that the environment variable "GPG_AGENT_INFO" is pre-loaded.\n\nThese preconditions are not met - you cannot use Enigmail until you resolve this issue. #strings in pepTrustWords.js pepTrustWords.cannotVerifyOwnId=Cannot verify p≡p Trustwords for own account. pepTrustWords.cannotFindKey=Cannot find key for %S. pepTrustWords.cannotStoreChange=Could not change trust for %S. pepTrustWords.generalFailure=Cannot obtain trustwords for %S. pepTrustWords.partnerFingerprint=Fingerprint for %S: #strings in mimeWkdHandler.jsm wkdMessage.body.req=Your email provider processed your request to upload your public key to the OpenPGP Web Key Directory.\n\nPlease click the confirmation button in the Enigmail header to complete the publishing of your public key. wkdMessage.body.process=This is an email related to the automatic processing to upload your public key to the OpenPGP Web Key Directory.\n\nYou do not need to take any manual action at this point. #strings in pepHandshake.js pepPrivacyStatus.RatingBrokenSuggestion=Either you or the sender should resend the message. pepPrivacyStatus.RatingHaveNoKeySuggestionOutgoing=If you composed this message, your key is not available. pepPrivacyStatus.RatingMistrustSuggestion=Re-establish the connection with your communication partner and try to complete another handshake. pepPrivacyStatus.RatingReliableSuggestion=Complete a handshake with your communication partner by exchanging trustwords in person or over the phone. A handshake is needed only once per partner and will ensure secure and trusted communication. pepPrivacyStatus.RatingTrustedSuggestion=No action needed! pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware that this message may not be secure. pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Please add the necessary information. pepPrivacyStatus.RatingUnderAttackSuggestion=Verify the content of this message with your communication partner using a different channel. pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least secure. pepPrivacyStatus.RatingUnencryptedSuggestion=Please ask your communication partner to use an encryption solution or install p≡p. pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or no signature. Ask your communication partner to upgrade their encryption solution or install p≡p. pepPrivacyStatus.RatingBrokenExplanation=This message has broken encryption or formatting. pepPrivacyStatus.RatingHaveNoKeyExplanation=This message cannot be decrypted because the key is not available. pepPrivacyStatus.RatingMistrustExplanation=This message has a communication partner that has previously been marked as mistrusted. pepPrivacyStatus.RatingReliableExplanation=This message is secure but you still need to verify the identity of your communication partner. pepPrivacyStatus.RatingTrustedExplanation=This message is secure and trusted. pepPrivacyStatus.RatingUndefinedExplanation=This message does not contain enough information to determine if it is secure. pepPrivacyStatus.RatingUnderAttackExplanation=This message is not secure and has been tampered with. pepPrivacyStatus.RatingUnencryptedExplanation=This message is unsecure. pepPrivacyStatus.RatingUnencryptedForSomeExplanation=This message is unsecure for some communication partners. pepPrivacyStatus.RatingUnreliableExplanation=This message has unreliable protection. pepPrivacyStatus.RatingBrokenText=Broken pepPrivacyStatus.RatingHaveNoKeyText=Cannot Decrypt pepPrivacyStatus.RatingMistrustText=Mistrusted pepPrivacyStatus.RatingReliableText=Secure pepPrivacyStatus.RatingTrustedText=Secure & Trusted pepPrivacyStatus.RatingUndefinedText=Unknown pepPrivacyStatus.RatingUnderAttackText=Under Attack pepPrivacyStatus.RatingUnencryptedForSomeText=Unsecure for Some pepPrivacyStatus.RatingUnencryptedText=Unsecure pepPrivacyStatus.RatingUnreliableText=Unreliable Security handshakeDlg.button.initHandshake=Handshake... handshakeDlg.button.stopTrust=Stop Trusting handshakeDlg.button.reTrust=Stop Mistrusting handshakeDlg.label.outgoingMessage=Outgoing message handshakeDlg.label.incomingMessage=Incoming message handshakeDlg.error.noPeers=Cannot handshake without any correspondents. handshakeDlg.error.noProtection=Please enable protection in order to use the Handshake function. enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup #strings in autocrypt.jsm autocrypt.setupMsg.subject=Autocrypt Setup Message autocrypt.setupMsg.msgBody=To set up your new device for Autocrypt, please follow the instuctions that should be presented by your new device. autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code presented on your old device, and then import the contained key onto your keyring. #strings in upgradeInfo.html upgradeInfo.doctitle=What's New in Enigmail v2.0? upgradeInfo.welcome1=Welcome to the new Enigmail version 2.0! upgradeInfo.welcome2=The release contains a lot of new and changed features. Please take a minute to find out what's new: upgradeInfo.encSubject.title=Encrypting the Message Subject upgradeInfo.encSubject.desc=We developed a new method that moves the email subject into the encrypted message, and replaces the visible subject with "Encrypted Message". Once such a message is decrypted, the original subject is replaced automatically. Hiding the subject is on by default; there is a preference to turn it off if you don't like it. (Note: this feature requires the message to be sent with PGP/MIME.) upgradeInfo.buttons.title=Changed behavior of Encrypt and Sign Buttons upgradeInfo.buttons.desc=The Encrypt and Sign buttons in the message composer window now work for both the OpenPGP and S/MIME protocols. If both algorithms are possible, then Enigmail will try to prefer the one for which all keys are available. upgradeInfo.autocrypt.title=Support for Autocrypt upgradeInfo.autocrypt.desc=Enigmail now supports Autocrypt, a new standard to distribute keys as part of sent messages. Enigmail automatically imports keys from Autocrypt-compliant messages, such that over time more and more emails can be encrypted. upgradeInfo.pEp.title=New p≡p Junior Mode (Pretty Easy Privacy) upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. upgradeInfo.bottom.desc=Please visit our documentation for help on using Enigmail. #strings in pEpAdapter.jsm pep.missingGnuPG=In order to use Enigmail/p≡p, GnuPG is required. As we could not find it, we suggest to download and install it for you. pep.updateAvailable=A new version of the Enigmail/p≡p crypto-engine is available. Would you like to download and install the update? #strings in enigmailAbout.html aboutEnigmail.tabName=About Enigmail aboutEnigmail.title=OpenPGP support provided by Enigmail aboutEnigmail.team=Enigmail is developed by the Enigmail Team: aboutEnigmail.projectLeader=Lead Developer: aboutEnigmail.usability=Usability: aboutEnigmail.documentation=Documentation: aboutEnigmail.testing=Testing: aboutEnigmail.userSupport=User Support: aboutEnigmail.localization=Localization: See the Enigmail Language Packs page aboutEnigmail.Credits=Credits: aboutEnigmail.origAuthor=Original author of the Enigmail extension aboutEnigmail.icons=Icons: aboutEnigmail.formerMembers=Former team members: aboutEnigmail.projectHosting=Project hosting: aboutEnigmail.licenseSupportTitle=License & Support aboutEnigmail.license=Enigmail OpenPGP is open source and licensed under the %S aboutEnigmail.support=Support and download is available from www.enigmail.net. #strings in mimeDecrypt.jsm mimeDecrypt.encryptedPart.attachmentLabel=Encrypted message part mimeDecrypt.encryptedPart.concealedData=This is an encrypted message part. For security reasons you need to open it in a separate window by clicking on the attachment. enigmail-2.0.8/ui/locale/en-US/help/000077500000000000000000000000001334302754500170475ustar00rootroot00000000000000enigmail-2.0.8/ui/locale/en-US/help/compose.html000066400000000000000000000100761334302754500214060ustar00rootroot00000000000000 Enigmail Help: Message Composition

Enigmail Help

Using Enigmail when composing messages

Enigmail menu in Mail/Compose window
Sign message
Enable/Disable sending signed mail. User is notified, if signing fails.
Encrypt message

Enable/Disable encryption to all recipient(s) before sending. User is notified, if encryption fails.

If Display selection when necessary is set in Preferences -> Key Selection tab, a list of keys will pop up if there are addresses in the list of recipients for the message for whom you have no public key.

If Never display OpenPGP key selection dialog is set in Preferences -> Key Selection tab, and there are addresses in the list of recipients for the message for whom you have no public key, the message will be sent unencrypted.

Use PGP/MIME for this message
Enable/Disable the use of PGP/MIME for this message.

If you know the recipient(s) can read mail using the PGP/MIME format, you should use it.

This feature is dependent on the settings in Preferences -> PGP/MIME tab being set to Allow to use PGP/MIME or Always use PGP/MIME.

Default composition options
  • Signing/Encryption Options...: shortcut to Account Settings -> OpenPGP Options.
  • Send options...: shortcut to Preferences -> Send tab.
  • Key selection options...: shortcut to Preferences -> Key Selection tab.
  • PGP/MIME options...: shortcut to Preferences -> PGP/MIME tab.
Undo encryption

If there is a failure when actually sending mail, such as the POP server not accepting the request, Enigmail will not know about it, and the encrypted message will continue to be displayed in the Compose window. Choosing this menu item will undo the encryption/signing, reverting the Compose window back to its original text.

As a temporary fix, this option may also be used to decrypt the quoted text when replying to encrypted messages. Enigmail should automatically decrypt the quoted message, but if that fails for some reason, you can use this menu item to force it.

Insert public key
insert ASCII-armored public key block at the current cursor location in the Compose window. You will be prompted for the email addresses of the key(s) to be inserted. Keys inserted in this manner will automatically be recognized at the receiving end by Enigmail. After key insertion, you may still choose to sign/encrypt the mail as needed. Also, do not insert more than one key block in a message; just specify multiple email addresses, separated by commas or spaces, when prompted.
Clear save passphrase
Clears cached passphrase. Useful if you have multiple passphrases.
Help
Displays Help information from the website (this page).

Further help is available on the Enigmail Help web page

enigmail-2.0.8/ui/locale/en-US/help/editRcptRule.html000066400000000000000000000116041334302754500223450ustar00rootroot00000000000000 Enigmail Help: Edit Per-Recipient Rule

Enigmail Help

Using the Enigmail Rules Editor: Edit Per-Recipient Rule

In the Rules Editor, you can specify defaults per recipient for enabling encryption, signing and PGP/MIME, and to define what OpenPGP key(s) to use. In this dialog, you can specify the rules for a single recipient, and for a group of recipients with very similar attributes.

Set Enigmail Rules for
Contains the email addresses of the recipients (without names, i.e. just an address like somebody@email.domain). You can specify several email addresses, separated by spaces. The address specified here can consist of only the domain section so that mail to any address at that domain will be matched, e.g. @email.domain will allow matching to body@email.domain, somebody@email.domain, anybody@email.domain, etc.
Apply rule if recipient ...
This modifies the matching of the email addresses. If multiple addresses are entered, the setting will apply to all. The examples below are based on body@email.domain entered in the Enigmail Rules field above.
  • Is exactly: with this setting, the rule will only trigger on emails to body@email.domain (exact, case insensitive matching).
  • Contains: with this setting, any email address containing the string is matched, e.g. anybody@email.domain or body@email.domain.net
  • Begins with: with this setting, any email address starting with the string is matched, e.g. body@email.domain.net, body@email.domain-name.com.
  • Ends with: with this setting, any email address ending with the string is matched, e.g. anybody@email.domain , somebody@email.domain.
Continue with the next rule for the matching address
Enabling this function will allow you to define a rule but not have to specify a KeyID in the Use the following OpenPGP keys: field, so that the email address is used to check for a key at the time of sending. Also, further rules for the same address(es) will be processed as well.
Do not check further rules for the matching address
Enabling this function stops processing any other rules for the matching address(es) if this rule is matched; i.e. rule processing continues with the next recipient.
Use the following OpenPGP keys:
Use the Select Key(s).. button to select the recipient keys to be used for encryption. As in the action above, no further rules for the matching address(es) are processed.
Default for Signing
Enable or disable message signing. This either uses or overrides what you have specified in the message composition window. The values are:
  • Never: disable signing, even if it was enabled in the message composition window (overrules the other values)
  • Yes, if selected from in Message Composition: leave signing as specified in the message composition window
  • Always: enable signing, even if it was not enabled in the message composition window
These signing settings are applied for all rules that match. If one of the rules disables signing, the message will not be signed, regardless of other rules that specify Always.
Encryption
Enable or disable message encryption. The allowed settings and their meaning are the same as for message signing.
PGP/MIME
Enable or disable the use of the PGP/MIME (RFC 3156) message encoding. If PGP/MIME is disabled, the messages are encoded using "inline PGP". The allowed values and their meaning are the same as for message signing.

The rules are processed in the order displayed in the list in the Per-Recipient Rules Editor. Whenever a rule matches a recipient and contains a OpenPGP Key ID, in addition to using the specified Key ID, the recipient is not considered anymore when processing further rules.


Further help is available on the Enigmail Per-Recipient Settings page

enigmail-2.0.8/ui/locale/en-US/help/help.html000066400000000000000000000103331334302754500206650ustar00rootroot00000000000000 Enigmail Help

Enigmail Help

Using Enigmail when reading messages

  • Decrypt button in main Mail window
    This button can be used for several purposes: decrypt, verify, or import public keys. Normally decryption/verification happens automatically, although this can be disabled through a preference. However, if this fails, usually a short error message will appear in the Enigmail status line. If you click the Decrypt button, you will be able to see a more detailed error message, including the output from the GnuPG command.
  • Pen and Key icons in Message Header display
    The Pen and Key icons in the Message Header display indicate if the message you are reading was signed and/or encrypted and if the signature is good, i.e. the message has not been changed since it was signed. If the message has been changed, the Pen icon will change to a Broken Pen to indicate that the signature is bad. Right clicking on either the Pen or Key icons will bring up a menu with the following options:
    • Enigmail Security info: allows you to view the output status from GnuPG for the message.
    • Copy Enigmail Security info: copies the output status from GnuPG to the clipboard; to paste into a reply message, etc.
    • View OpenPGP Photo ID: allows you to view the Photo ID of the person who sent the message, if they have a photo embedded in their Public Key. (This option will only be enabled if a Photo ID exists in their key.)
    • S/MIME Security info: allows you to view the S/MIME Security Info for the message.

    If you do not have keyserver-options auto-key-retrieve set in your gpg.conf file and you read a message which is signed or encrypted, you will see a Pen icon in the headers display area with a Question mark on it, the Enigmail status line in the headers area will say Part of the message signed; click pen icon for details and the message in the Message Pane will show all the OpenPGP message block indicators and the signature block.

    You may also see this if you have keyserver-options auto-key-retrieve set in your gpg.conf file and the OpenPGP key is not available on the default keyserver.

    Clicking on the Pen and Question mark icon will bring up a window advising that the key is unavailable in your keyring. Clicking on OK will bring up another window with a list of keyservers from which you can select to download the sender's public key from.

    To configure the list of keyservers you wish to use, go to Enigmail -> Preferences -> Basic tab and enter the keyserver addresses in the Keyserver(s): box, separated by a comma. The first keyserver in the list will be used as the default.

  • Opening encrypted attachments / importing attached OpenPGP keys
    Attachments named *.pgp, *.asc and *.gpg are recognized as attachments that can be handled specially by Enigmail. Right clicking on such an attachment enables two special menu items in the context menu: Decrypt and Open and Decrypt and Save. Use these two menu items if you want Enigmail to decrypt an attachment before opening or saving it. If an attachment is recognized as an OpenPGP key file, you are offered to import the keys it into your keyrings.

Further help is available on the Enigmail Help web page
If you have questions or comments about enigmail, please send a message to the Enigmail mailing list

Enigmail is open source and licensed under the Mozilla Public License 2.0

enigmail-2.0.8/ui/locale/en-US/help/initError.html000066400000000000000000000045671334302754500217260ustar00rootroot00000000000000 Enigmail Help: How to Resolve Problems with Initializing Enigmail

Enigmail Help

How to Resolve Problems with Initializing Enigmail

There are several reasons why initializing Enigmail does not succeed. The most common ones are described below; for more information please visit the Enigmail Support page.

GnuPG could not be found

In order for Enigmail to work, the tool GnuPG needs to be installed. If GnuPG cannot be found, then first make sure that the executable gpg.exe (on Windows; gpg on other platforms) is installed on your computer. If GnuPG is installed, and Enigmail cannot find it, then you need to manually set the path to GnuPG in the Enigmail Preferences (menu Enigmail > Preferences)

Enigmail Core Service failed to initialize

Enigmail works only if it is built using the same build environment as Thunderbird or SeaMonkey was built. This means that you can use the official Enigmail releases only if you use the official releases of Thunderbird or SeaMonkey provided by mozilla.org.

If you use a Thunderbird or SeaMonkey version coming from some other source (e.g. the provider of your Linux distribution), or if you built the application yourself, you should either use an Enigmail version built by the same source, or build Enigmail yourself. For building Enigmail, refer to the Source Code section on the Enigmail home page. Please don't file any bug report concerning this problem, it is not solvable.

Further help is available on the Enigmail Support Web Site.

enigmail-2.0.8/ui/locale/en-US/help/messenger.html000066400000000000000000000101421334302754500217230ustar00rootroot00000000000000 Enigmail Help: Message Reading

Enigmail Help

Using Enigmail when reading messages

Decrypt button in main Mail window
This button can be used for several purposes: decrypt, verify, or import public keys. Normally decryption/verification happens automatically, although this can be disabled through a preference. However, if this fails, usually a short error message will appear in the Enigmail status line. If you click the Decrypt button, you will be able to see a more detailed error message, including the output from the GnuPG command.
Pen and Key icons in Message Header display
The Pen and Key icons in the Message Header display indicate if the message you are reading was signed and/or encrypted and if the signature is good, i.e. the message has not been changed since it was signed. If the message has been changed, the Pen icon will change to a Broken Pen to indicate that the signature is bad. Right clicking on either the Pen or Key icons will bring up a menu with the following options:
  • Enigmail Security info: allows you to view the output status from GnuPG for the message.
  • Copy Enigmail Security info: copies the output status from GnuPG to the clipboard; to paste into a reply message, etc.
  • View OpenPGP Photo ID: allows you to view the Photo ID of the person who sent the message, if they have a photo embedded in their Public Key. (This option will only be enabled if a Photo ID exists in their key.)
  • S/MIME Security info: allows you to view the S/MIME Security Info for the message.

If you do not have keyserver-options auto-key-retrieve set in your gpg.conf file and you read a message which is signed or encrypted, you will see a Pen icon in the headers display area with a Question mark on it, the Enigmail status line in the headers area will say Part of the message signed; click pen icon for details and the message in the Message Pane will show all the OpenPGP message block indicators and the signature block.

You may also see this if you have keyserver-options auto-key-retrieve set in your gpg.conf file and the OpenPGP key is not available on the default keyserver.

Clicking on the Pen and Question mark icon will bring up a window advising that the key is unavailable in your keyring. Clicking on OK will bring up another window with a list of keyservers from which you can select to download the sender's public key from.

To configure the list of keyservers you wish to use, go to Enigmail -> Preferences -> Basic tab and enter the keyserver addresses in the Keyserver(s): box, separated by a comma. The first keyserver in the list will be used as the default.

Opening encrypted attachments / importing attached OpenPGP keys
Attachments named *.pgp, *.asc and *.gpg are recognized as attachments that can be handled specially by Enigmail. Right clicking on such an attachment enables two special menu items in the context menu: Decrypt and Open and Decrypt and Save. Use these two menu items if you want Enigmail to decrypt an attachment before opening or saving it. If an attachment is recognized as an OpenPGP key file, you are offered to import the keys it into your keyrings.

Further help is available on the Enigmail Help web page

enigmail-2.0.8/ui/locale/en-US/help/rulesEditor.html000066400000000000000000000060331334302754500222400ustar00rootroot00000000000000 Enigmail Help: Rules Editor

Enigmail Help

Using the Enigmail Rules Editor

In the Rules Editor, you can specify defaults per recipient for enabling encryption, signing and PGP/MIME, and to define what OpenPGP key(s) to use. Each rule consists of 5 fields and is represented on a single line:

Email
The e-mail(s) from the To:, Cc: and Bcc: fields to match. The matching works on substrings (Further details can be found in the Edit Rule dialog)
OpenPGP Key(s)
a list of OpenPGP Key ID's to use for the recipient
Sign
enable or disable message signing. This either uses or overrides what you have specified in the message composition window. The values are:
  • Never: disable signing, even if it was enabled in the message composition window (overrules the other values)
  • Possible: leave signing as specified in the message composition window
  • Always: enable signing, even if it was not enabled in the message composition window

These signing settings are applied for all rules that match. If one of the rules disables signing, the message will not be signed, regardless of other rules that specify Always.

Encrypt
enable or disable message encryption. The allowed settings and their meaning are the same as for message signing.
PGP/MIME
enable or disable the use of the PGP/MIME (RFC 3156) message encoding. If PGP/MIME is disabled, the messages are encoded using "inline PGP". The allowed values and their meaning a re the same as for message signing.

The rules are processed in the order displayed in the list. Whenever a rule matches a recipient and contains a OpenPGP Key ID, in addition to using the specified Key ID, the recipient is not considered anymore when processing further rules.

Note: The rule editor is not yet complete. It is possible to write some more advanced rules by directly editing the rules file (these rules should then not be edited anymore in the rule editor). Further information for directly editing the file is available on the Enigmail Homepage


Further help is available on the Enigmail Help web page

enigmail-2.0.8/ui/locale/en-US/help/sendingPrefs.html000066400000000000000000000047571334302754500224010ustar00rootroot00000000000000 Enigmail Help: Edit OpenPGP Rule

Enigmail Help

Defining Preferences to Send Encrypted

In the Sending Preferences you can choose the general model and preferences for encryption.

Convenient Encryption
With these settings, emails are encrypted without confirmation whenever possible.

This setup is appropriate, if you just want to improve your privacy by sending emails encrypted instead of unencrypted if that's possible.

The effect is like sending emails as letters instead of postcards. Unlike postcards, letters usually hide their contents while in transit.

Note however that as with letters you can't be sure that nobody is opening the letter while it is in transit (although, some technical effort is necessary for that).

A concrete risk is that you accidentally use "faked keys" you got from somewhere or somebody claiming that the key belongs to the person you want to send emails to. To avoid this risk, you can either use the trust model of PGP (see below) or you should always verify, whether the fingerprint of a public key is correct.

Manual Encryption
This option allows you to specify the different preferences for encryption according to your needs. You can specify
  • whether replies to encrypted/signed emails should automatically also be encrypted/signed-
  • whether to use the trust model of Enigmail to accept keys (this means that to use a key you either have to sign the key or have enough other people you trust having signed the key).
  • whether you want to automatically send emails encrypted if all keys are accepted.
  • whether and when you want to finally confirm sending an email.
If it is important for you that content you send encrypted can't be read by other people or organizations, you should use the manual preferences at least choose the option to accept keys only if you or other people signed them. While this model reduces the risk of using faked keys, it requires that you actively sign keys and declare owner trust using the key managament dialog. enigmail-2.0.8/ui/skin/000077500000000000000000000000001334302754500146755ustar00rootroot00000000000000enigmail-2.0.8/ui/skin/Makefile000066400000000000000000000353141334302754500163430ustar00rootroot00000000000000# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. DEPTH = ../.. include $(DEPTH)/config/autoconf.mk UIFILES = \ images/check0.png \ images/check1.png \ images/check2.png SKIN_TB_WIN_XP = \ tb-windows/enigmail.css \ common/enigmail-common.css \ common/enigmail-pEp.css \ common/enigmail-html.css \ images/enigmail-about.svg \ images/enigmail-logo.png \ tb-windows/images/enigEncInactive.png \ tb-windows/images/enigEncNotOk.png \ tb-windows/images/enigEncOk.png \ tb-windows/images/enigSignInactive.png \ tb-windows/images/enigSignNotOk.png \ tb-windows/images/enigSignOk.png \ tb-windows/images/enigSignUnkown.png \ images/twisty-open.png \ images/twisty-clsd.png \ images/spinning-wheel.png \ tb-windows/images/col-encrypted-signed.png \ tb-windows/images/enigSignActiveNone.png \ tb-windows/images/enigSignActivePlus.png \ tb-windows/images/enigSignActiveMinus.png \ tb-windows/images/enigSignActiveConflict.png \ tb-windows/images/enigSignInactiveNone.png \ tb-windows/images/enigSignInactivePlus.png \ tb-windows/images/enigSignInactiveMinus.png \ tb-windows/images/enigSignInactiveConflict.png \ tb-windows/images/enigSignForceYes.png \ tb-windows/images/enigSignForceNo.png \ tb-windows/images/enigEncActiveNone.png \ tb-windows/images/enigEncActivePlus.png \ tb-windows/images/enigEncActiveMinus.png \ tb-windows/images/enigEncActiveConflict.png \ tb-windows/images/enigEncInactiveNone.png \ tb-windows/images/enigEncInactivePlus.png \ tb-windows/images/enigEncInactiveMinus.png \ tb-windows/images/enigEncInactiveConflict.png \ tb-windows/images/enigEncForceYes.png \ tb-windows/images/enigEncForceNo.png \ images/decrypt-inactive-18.svg \ images/decrypt-active-18.svg \ images/encrypt-inactive-18.svg \ images/encrypt-active-18.svg \ images/encrypt-disabled-18.svg \ images/sign-active-18.svg \ images/sign-disabled-18.svg \ images/sign-inactive-18.svg \ images/importSuccess.png \ images/attach-active-18.svg \ images/attach-disabled-18.svg \ images/attach-inactive-18.svg \ images/warning-16.png \ images/password-error.svg \ images/col-pEpGreen.svg \ images/col-pEpYellow.svg \ images/col-pEpRed.svg \ images/pEpGreen.svg \ images/pEpGrey.svg \ images/pEpYellow.svg \ images/pEpRed.svg \ images/pEpEncryptActive.svg \ images/pEpEncryptInactive.svg \ images/pEpLogo.svg \ images/headerProtected-18.svg \ images/headerUnprotected-18.svg SKIN_AERO = \ tb-aero/enigmail.css \ common/enigmail-common.css \ common/enigmail-pEp.css \ common/enigmail-html.css \ images/enigmail-about.svg \ images/enigmail-logo.png \ tb-windows/images/enigEncInactive.png \ tb-windows/images/enigEncNotOk.png \ tb-windows/images/enigEncOk.png \ tb-windows/images/enigSignInactive.png \ tb-windows/images/enigSignNotOk.png \ tb-windows/images/enigSignOk.png \ tb-windows/images/enigSignUnkown.png \ images/importSuccess.png \ images/twisty-open.png \ images/twisty-clsd.png \ images/spinning-wheel.png \ tb-windows/images/col-encrypted-signed.png \ tb-windows/images/enigSignActiveNone.png \ tb-windows/images/enigSignActivePlus.png \ tb-windows/images/enigSignActiveMinus.png \ tb-windows/images/enigSignActiveConflict.png \ tb-windows/images/enigSignInactiveNone.png \ tb-windows/images/enigSignInactivePlus.png \ tb-windows/images/enigSignInactiveMinus.png \ tb-windows/images/enigSignInactiveConflict.png \ tb-windows/images/enigSignForceYes.png \ tb-windows/images/enigSignForceNo.png \ tb-windows/images/enigEncActiveNone.png \ tb-windows/images/enigEncActivePlus.png \ tb-windows/images/enigEncActiveMinus.png \ tb-windows/images/enigEncActiveConflict.png \ tb-windows/images/enigEncInactiveNone.png \ tb-windows/images/enigEncInactivePlus.png \ tb-windows/images/enigEncInactiveMinus.png \ tb-windows/images/enigEncInactiveConflict.png \ tb-windows/images/enigEncForceYes.png \ tb-windows/images/enigEncForceNo.png \ images/decrypt-inactive-18.svg \ images/decrypt-active-18.svg \ images/encrypt-inactive-18.svg \ images/encrypt-active-18.svg \ images/encrypt-disabled-18.svg \ images/sign-active-18.svg \ images/sign-disabled-18.svg \ images/sign-inactive-18.svg \ images/attach-active-18.svg \ images/attach-disabled-18.svg \ images/attach-inactive-18.svg \ images/password-error.svg \ images/warning-16.png \ images/col-pEpGreen.svg \ images/col-pEpYellow.svg \ images/col-pEpRed.svg \ images/pEpGreen.svg \ images/pEpGrey.svg \ images/pEpYellow.svg \ images/pEpRed.svg \ images/pEpEncryptActive.svg \ images/pEpEncryptInactive.svg \ images/pEpLogo.svg \ images/headerProtected-18.svg \ images/headerUnprotected-18.svg SKIN_TB_MAC = \ tb-mac/enigmail.css \ common/enigmail-common.css \ common/enigmail-pEp.css \ common/enigmail-html.css \ images/enigmail-about.svg \ images/enigmail-logo.png \ tb-mac/images/enigEncInactive.png \ tb-mac/images/enigEncNotOk.png \ tb-mac/images/enigEncOk.png \ tb-mac/images/enigSignInactive.png \ tb-mac/images/enigSignNotOk.png \ tb-mac/images/enigSignOk.png \ tb-mac/images/enigSignUnkown.png \ images/importSuccess.png \ images/twisty-open.png \ images/twisty-clsd.png \ images/spinning-wheel.png \ tb-mac/images/col-encrypted-signed.png \ tb-windows/images/enigSignActiveNone.png \ tb-windows/images/enigSignActivePlus.png \ tb-windows/images/enigSignActiveMinus.png \ tb-windows/images/enigSignActiveConflict.png \ tb-windows/images/enigSignInactiveNone.png \ tb-windows/images/enigSignInactivePlus.png \ tb-windows/images/enigSignInactiveMinus.png \ tb-windows/images/enigSignInactiveConflict.png \ tb-windows/images/enigSignForceYes.png \ tb-windows/images/enigSignForceNo.png \ tb-windows/images/enigEncActiveNone.png \ tb-windows/images/enigEncActivePlus.png \ tb-windows/images/enigEncActiveMinus.png \ tb-windows/images/enigEncActiveConflict.png \ tb-windows/images/enigEncInactiveNone.png \ tb-windows/images/enigEncInactivePlus.png \ tb-windows/images/enigEncInactiveMinus.png \ tb-windows/images/enigEncInactiveConflict.png \ tb-windows/images/enigEncForceYes.png \ tb-windows/images/enigEncForceNo.png \ images/decrypt-active-18.svg \ images/decrypt-inactive-18.svg \ images/encrypt-inactive-18.svg \ images/encrypt-active-18.svg \ images/encrypt-disabled-18.svg \ images/sign-active-18.svg \ images/sign-disabled-18.svg \ images/sign-inactive-18.svg \ images/attach-active-18.svg \ images/attach-disabled-18.svg \ images/attach-inactive-18.svg \ images/warning-16.png \ images/password-error.svg \ images/col-pEpGreen.svg \ images/col-pEpYellow.svg \ images/col-pEpRed.svg \ images/pEpGreen.svg \ images/pEpGrey.svg \ images/pEpYellow.svg \ images/pEpRed.svg \ images/pEpEncryptActive.svg \ images/pEpEncryptInactive.svg \ images/pEpLogo.svg \ images/headerProtected-18.svg \ images/headerUnprotected-18.svg SKIN_TB_LINUX = \ tb-linux/enigmail.css \ common/enigmail-common.css \ common/enigmail-pEp.css \ common/enigmail-html.css \ images/enigmail-about.svg \ images/enigmail-logo.png \ tb-linux/images/enigEncInactive.png \ tb-linux/images/enigEncNotOk.png \ tb-linux/images/enigEncOk.png \ tb-linux/images/enigSignInactive.png \ tb-linux/images/enigSignNotOk.png \ tb-linux/images/enigSignOk.png \ tb-linux/images/enigSignUnkown.png \ images/importSuccess.png \ images/twisty-open.png \ images/twisty-clsd.png \ images/spinning-wheel.png \ tb-linux/images/col-encrypted-signed.png \ tb-windows/images/enigSignActiveNone.png \ tb-windows/images/enigSignActivePlus.png \ tb-windows/images/enigSignActiveMinus.png \ tb-windows/images/enigSignActiveConflict.png \ tb-windows/images/enigSignInactiveNone.png \ tb-windows/images/enigSignInactivePlus.png \ tb-windows/images/enigSignInactiveMinus.png \ tb-windows/images/enigSignInactiveConflict.png \ tb-windows/images/enigSignForceNo.png \ tb-windows/images/enigSignForceYes.png \ tb-windows/images/enigEncActiveNone.png \ tb-windows/images/enigEncActivePlus.png \ tb-windows/images/enigEncActiveMinus.png \ tb-windows/images/enigEncActiveConflict.png \ tb-windows/images/enigEncInactiveNone.png \ tb-windows/images/enigEncInactivePlus.png \ tb-windows/images/enigEncInactiveMinus.png \ tb-windows/images/enigEncInactiveConflict.png \ tb-windows/images/enigEncForceNo.png \ tb-windows/images/enigEncForceYes.png \ images/decrypt-inactive-18.svg \ images/decrypt-active-18.svg \ images/encrypt-inactive-18.svg \ images/encrypt-active-18.svg \ images/encrypt-disabled-18.svg \ images/sign-active-18.svg \ images/sign-disabled-18.svg \ images/sign-inactive-18.svg \ images/attach-active-18.svg \ images/attach-disabled-18.svg \ images/attach-inactive-18.svg \ images/warning-16.png \ images/password-error.svg \ images/col-pEpGreen.svg \ images/col-pEpYellow.svg \ images/col-pEpRed.svg \ images/pEpGreen.svg \ images/pEpGrey.svg \ images/pEpYellow.svg \ images/pEpRed.svg \ images/pEpEncryptActive.svg \ images/pEpEncryptInactive.svg \ images/pEpLogo.svg \ images/headerProtected-18.svg \ images/headerUnprotected-18.svg SKIN_CLASSIC_SEAMONKEY = \ classic-seamonkey/enigmail.css \ common/enigmail-common.css \ common/enigmail-pEp.css \ common/enigmail-html.css \ images/enigmail-about.svg \ images/enigmail-logo.png \ classic-seamonkey/images/enigEncInactive.png \ classic-seamonkey/images/enigEncNotOk.png \ classic-seamonkey/images/enigEncOk.png \ classic-seamonkey/images/enigSignInactive.png \ classic-seamonkey/images/enigSignNotOk.png \ classic-seamonkey/images/enigSignOk.png \ classic-seamonkey/images/enigSignUnkown.png \ images/importSuccess.png \ images/twisty-open.png \ images/twisty-clsd.png \ images/spinning-wheel.png \ classic-seamonkey/images/col-encrypted-signed.png \ tb-windows/images/enigSignActiveNone.png \ tb-windows/images/enigSignActivePlus.png \ tb-windows/images/enigSignActiveMinus.png \ tb-windows/images/enigSignActiveConflict.png \ tb-windows/images/enigSignInactiveNone.png \ tb-windows/images/enigSignInactivePlus.png \ tb-windows/images/enigSignInactiveMinus.png \ tb-windows/images/enigSignInactiveConflict.png \ tb-windows/images/enigSignForceYes.png \ tb-windows/images/enigSignForceNo.png \ tb-windows/images/enigEncActiveNone.png \ tb-windows/images/enigEncActivePlus.png \ tb-windows/images/enigEncActiveMinus.png \ tb-windows/images/enigEncActiveConflict.png \ tb-windows/images/enigEncInactiveNone.png \ tb-windows/images/enigEncInactivePlus.png \ tb-windows/images/enigEncInactiveMinus.png \ tb-windows/images/enigEncInactiveConflict.png \ tb-windows/images/enigEncForceYes.png \ tb-windows/images/enigEncForceNo.png \ images/decrypt-inactive-24.svg \ images/decrypt-active-24.svg \ images/decrypt-inactive-30.svg \ images/decrypt-active-30.svg \ images/encrypt-inactive-24.svg \ images/encrypt-active-24.svg \ images/encrypt-disabled-24.svg \ images/sign-active-24.svg \ images/sign-disabled-24.svg \ images/sign-inactive-24.svg \ images/encrypt-inactive-30.svg \ images/encrypt-active-30.svg \ images/encrypt-disabled-30.svg \ images/sign-active-30.svg \ images/sign-disabled-30.svg \ images/sign-inactive-30.svg \ images/attach-inactive-24.svg \ images/attach-inactive-30.svg \ images/attach-disabled-24.svg \ images/attach-disabled-30.svg \ images/attach-active-24.svg \ images/attach-active-30.svg \ images/warning-16.png \ images/password-error.svg \ images/col-pEpGreen.svg \ images/col-pEpYellow.svg \ images/col-pEpRed.svg \ images/pEpGreen.svg \ images/pEpGrey.svg \ images/pEpYellow.svg \ images/pEpRed.svg \ images/pEpEncryptActive.svg \ images/pEpEncryptInactive.svg \ images/pEpLogo.svg \ images/headerProtected-24.svg \ images/headerUnprotected-24.svg \ images/headerProtected-30.svg \ images/headerUnprotected-30.svg # missing: modern-encrypt-disabled.png, modern-sign-disabled.png SKIN_MODERN = \ modern/enigmail.css \ common/enigmail-common.css \ common/enigmail-pEp.css \ common/enigmail-html.css \ images/enigmail-about.svg \ images/enigmail-logo.png \ images/enigdecrypt-act.png \ images/enigdecrypt-dis.png \ images/enigdecrypt-hov.png \ images/enigdecrypt.png \ tb-windows/images/enigEncInactive.png \ tb-windows/images/enigEncNotOk.png \ tb-windows/images/enigEncOk.png \ tb-windows/images/enigSignInactive.png \ tb-windows/images/enigSignNotOk.png \ tb-windows/images/enigSignOk.png \ images/enigSignUnkown.png \ images/modern-encrypt-active-force.png \ images/modern-encrypt-active.png \ images/modern-encrypt-inactive-force.png \ images/modern-encrypt-inactive.png \ images/modern-sign-active-force.png \ images/modern-sign-active.png \ images/modern-sign-inactive-force.png \ images/modern-sign-inactive.png \ images/modern-attach-active.png \ images/modern-attach-disabled.png \ images/modern-attach-inactive.png \ images/importSuccess.png \ images/twisty-open.png \ images/twisty-clsd.png \ images/spinning-wheel.png \ images/col-encrypted-signed.png \ tb-windows/images/enigSignActiveNone.png \ tb-windows/images/enigSignActivePlus.png \ tb-windows/images/enigSignActiveMinus.png \ tb-windows/images/enigSignActiveConflict.png \ tb-windows/images/enigSignInactiveNone.png \ tb-windows/images/enigSignInactivePlus.png \ tb-windows/images/enigSignInactiveMinus.png \ tb-windows/images/enigSignInactiveConflict.png \ tb-windows/images/enigSignForceYes.png \ tb-windows/images/enigSignForceNo.png \ tb-windows/images/enigEncActiveNone.png \ tb-windows/images/enigEncActivePlus.png \ tb-windows/images/enigEncActiveMinus.png \ tb-windows/images/enigEncActiveConflict.png \ tb-windows/images/enigEncInactiveNone.png \ tb-windows/images/enigEncInactivePlus.png \ tb-windows/images/enigEncInactiveMinus.png \ tb-windows/images/enigEncInactiveConflict.png \ tb-windows/images/enigEncForceYes.png \ tb-windows/images/enigEncForceNo.png \ images/modern-toolbar-background.png \ images/warning-16.png \ images/password-error.svg \ images/col-pEpGreen.svg \ images/col-pEpYellow.svg \ images/col-pEpRed.svg \ images/pEpGreen.svg \ images/pEpGrey.svg \ images/pEpYellow.svg \ images/pEpRed.svg \ images/pEpEncryptActive.svg \ images/pEpEncryptInactive.svg \ images/pEpLogo.svg all: deploy deploy: $(UIFILES) $(SKIN_TB_WIN_XP) $(SKIN_AERO) $(SKIN_TB_MAC) $(SKIN_TB_LINUX) $(SKIN_CLASSIC_SEAMONKEY) $(SKIN_MODERN) $(DEPTH)/util/install -m 644 $(DIST)/chrome/content $(UIFILES) $(DEPTH)/util/install -m 644 $(DIST)/chrome/skin/tb-win-xp $(SKIN_TB_WIN_XP) $(DEPTH)/util/install -m 644 $(DIST)/chrome/skin/aero $(SKIN_AERO) $(DEPTH)/util/install -m 644 $(DIST)/chrome/skin/tb-mac $(SKIN_TB_MAC) $(DEPTH)/util/install -m 644 $(DIST)/chrome/skin/tb-linux $(SKIN_TB_LINUX) $(DEPTH)/util/install -m 644 $(DIST)/chrome/skin/classic-seamonkey $(SKIN_CLASSIC_SEAMONKEY) $(DEPTH)/util/install -m 644 $(DIST)/chrome/skin/modern $(SKIN_MODERN) enigmail-2.0.8/ui/skin/README.txt000066400000000000000000000005271334302754500163770ustar00rootroot00000000000000classic: - windows - one css for classic windows - one css for aero scheme classic-seamokey: - classic theme of seamonkey modern: - modern theme of seamonkey tb-linux: - linux tb-mac: - apple for a new image: - add it to all css files in the subdirs here - add it to ../jar.mn file Note: - different schemes have different icon sizes enigmail-2.0.8/ui/skin/classic-seamonkey/000077500000000000000000000000001334302754500203075ustar00rootroot00000000000000enigmail-2.0.8/ui/skin/classic-seamonkey/enigmail.css000066400000000000000000000254201334302754500226110ustar00rootroot00000000000000/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ /* Enigmail styles for the SeaMonkey Classic style*/ @import url("chrome://enigmail/skin/enigmail-common.css"); /* common styles for all platforms */ @import url("chrome://enigmail/skin/enigmail-pEp.css"); /* styles related to pEp for all platforms */ #button-enigmail-decrypt { list-style-image : url("chrome://enigmail/skin/decrypt-active-30.svg"); } #button-enigmail-decrypt[disabled] { list-style-image : url("chrome://enigmail/skin/decrypt-inactive-30.svg"); } toolbar[iconsize="small"] #button-enigmail-decrypt { list-style-image : url("chrome://enigmail/skin/decrypt-active-24.svg"); } toolbar[iconsize="small"] #button-enigmail-decrypt[disabled] { list-style-image : url("chrome://enigmail/skin/decrypt-inactive-24.svg"); } /*************************************************** * Icons for compose toolbar: encryption ***************************************************/ #button-enigmail-encrypt { list-style-image : url("chrome://enigmail/skin/encrypt-inactive-30.svg"); } #button-enigmail-encrypt[disabled] { list-style-image : url("chrome://enigmail/skin/encrypt-disabled-30.svg"); } #button-enigmail-encrypt[encrypted="activeNone"] { list-style-image : url("chrome://enigmail/skin/encrypt-active-30.svg"); } #button-enigmail-encrypt[encrypted="forceYes"] { list-style-image : url("chrome://enigmail/skin/encrypt-active-30.svg"); } #button-enigmail-encrypt[encrypted="forceNo"] { list-style-image : url("chrome://enigmail/skin/encrypt-inactive-30.svg"); } toolbar[iconsize="small"] #button-enigmail-encrypt { list-style-image : url("chrome://enigmail/skin/encrypt-inactive-24.svg"); } toolbar[iconsize="small"] #button-enigmail-encrypt[disabled] { list-style-image : url("chrome://enigmail/skin/encrypt-disabled-24.svg"); } toolbar[iconsize="small"] #button-enigmail-encrypt[encrypted="activeNone"] { list-style-image : url("chrome://enigmail/skin/encrypt-active-24.svg"); } toolbar[iconsize="small"] #button-enigmail-encrypt[encrypted="forceYes"] { list-style-image : url("chrome://enigmail/skin/encrypt-active-24.svg"); } toolbar[iconsize="small"] #button-enigmail-encrypt[encrypted="forceNo"] { list-style-image : url("chrome://enigmail/skin/encrypt-inactive-24.svg"); } /*************************************************** * Icons for compose toolbar: signing ***************************************************/ #button-enigmail-sign { list-style-image : url("chrome://enigmail/skin/sign-inactive-30.svg"); } #button-enigmail-sign[disabled] { list-style-image : url("chrome://enigmail/skin/sign-disabled-30.svg"); } #button-enigmail-sign[signed="activeNone"] { list-style-image : url("chrome://enigmail/skin/sign-active-30.svg"); } #button-enigmail-sign[signed="forceYes"] { list-style-image : url("chrome://enigmail/skin/sign-active-30.svg"); } #button-enigmail-sign[signed="forceNo"] { list-style-image : url("chrome://enigmail/skin/sign-inactive-30.svg"); } toolbar[iconsize="small"] #button-enigmail-sign { list-style-image : url("chrome://enigmail/skin/sign-inactive-24.svg"); } toolbar[iconsize="small"] #button-enigmail-sign[disabled] { list-style-image : url("chrome://enigmail/skin/sign-disabled-24.svg"); } toolbar[iconsize="small"] #button-enigmail-sign[signed="activeNone"] { list-style-image : url("chrome://enigmail/skin/sign-active-24.svg"); } toolbar[iconsize="small"] #button-enigmail-sign[signed="forceYes"] { list-style-image : url("chrome://enigmail/skin/sign-active-24.svg"); } toolbar[iconsize="small"] #button-enigmail-sign[signed="forceNo"] { list-style-image : url("chrome://enigmail/skin/sign-inactive-24.svg"); } /*************************************************** * Icons for compose toolbar: attach own key ***************************************************/ #button-enigmail-attach { list-style-image : url("chrome://enigmail/skin/attach-inactive-30.svg"); } #button-enigmail-attach[disabled] { list-style-image : url("chrome://enigmail/skin/attach-disabled-30.svg"); } #button-enigmail-attach[addPubkey="true"] { list-style-image : url("chrome://enigmail/skin/attach-active-30.svg"); } toolbar[iconsize="small"] #button-enigmail-attach { list-style-image : url("chrome://enigmail/skin/attach-inactive-24.svg"); } toolbar[iconsize="small"] #button-enigmail-attach[disabled] { list-style-image : url("chrome://enigmail/skin/attach-disabled-24.svg"); } toolbar[iconsize="small"] #button-enigmail-attach[addPubkey="true"] { list-style-image : url("chrome://enigmail/skin/attach-active-24.svg"); } /*************************************************** * Icons for compose toolbar: Protect header ***************************************************/ #enigmail-toolbar-encryptHdr-button { list-style-image : url("chrome://enigmail/skin/headerUnprotected-30.svg"); } #enigmail-toolbar-encryptHdr-button[disabled] { list-style-image : url("chrome://enigmail/skin/headerUnprotected-30.svg"); } #enigmail-toolbar-encryptHdr-button[checked="true"] { list-style-image : url("chrome://enigmail/skin/headerProtected-30.svg"); } toolbar[iconsize="small"] #enigmail-toolbar-encryptHdr-button { list-style-image : url("chrome://enigmail/skin/headerUnprotected-24.svg"); } toolbar[iconsize="small"] #enigmail-toolbar-encryptHdr-button[disabled] { list-style-image : url("chrome://enigmail/skin/headerUnprotected-24.svg"); } toolbar[iconsize="small"] #enigmail-toolbar-encryptHdr-button[checked="true"] { list-style-image : url("chrome://enigmail/skin/headerProtected-24.svg"); } /*************************************************** * Icons for messenger status bar ***************************************************/ #enigmail-status-bar #enigmail-signed-status { list-style-image: none; visibility: collapse; } #enigmail-status-bar[signed="ok"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignOk.png"); visibility: visible; } #enigmail-status-bar[signed="notok"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignNotOk.png"); visibility: visible; } #enigmail-status-bar[signed="unknown"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignUnkown.png"); visibility: visible; } #enigmail-status-bar[signed="inactive"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignInactive.png"); visibility: visible; } #enigmail-status-bar #enigmail-encrypted-status { list-style-image: none; visibility: collapse; } #enigmail-status-bar[encrypted="ok"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncOk.png"); visibility: visible; } #enigmail-status-bar[encrypted="notok"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncNotOk.png"); visibility: visible; } #enigmail-status-bar[encrypted="inactive"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncInactive.png"); visibility: visible; } /*************************************************** * Icons for compose status bar: signed states ***************************************************/ #enigmail-status-bar[signed="forceYes"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignForceYes.png"); visibility: visible; } #enigmail-status-bar[signed="forceNo"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignForceNo.png"); visibility: visible; } #enigmail-status-bar[signed="inactiveNone"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignInactiveNone.png"); visibility: visible; } #enigmail-status-bar[signed="inactivePlus"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignInactivePlus.png"); visibility: visible; } #enigmail-status-bar[signed="inactiveMinus"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignInactiveMinus.png"); visibility: visible; } #enigmail-status-bar[signed="inactiveConflict"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignInactiveConflict.png"); visibility: visible; } #enigmail-status-bar[signed="activeNone"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignActiveNone.png"); visibility: visible; } #enigmail-status-bar[signed="activePlus"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignActivePlus.png"); visibility: visible; } #enigmail-status-bar[signed="activeMinus"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignActiveMinus.png"); visibility: visible; } #enigmail-status-bar[signed="activeConflict"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignActiveConflict.png"); visibility: visible; } /*************************************************** * Icons for compose status bar: encrypted states ***************************************************/ #enigmail-status-bar[encrypted="forceYes"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncForceYes.png"); visibility: visible; } #enigmail-status-bar[encrypted="forceNo"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncForceNo.png"); visibility: visible; } #enigmail-status-bar[encrypted="activeNone"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncActiveNone.png"); visibility: visible; } #enigmail-status-bar[encrypted="activePlus"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncActivePlus.png"); visibility: visible; } #enigmail-status-bar[encrypted="activeMinus"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncActiveMinus.png"); visibility: visible; } #enigmail-status-bar[encrypted="activeConflict"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncActiveConflict.png"); visibility: visible; } #enigmail-status-bar[encrypted="inactiveNone"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncInactiveNone.png"); visibility: visible; } #enigmail-status-bar[encrypted="inactivePlus"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncInactivePlus.png"); visibility: visible; } #enigmail-status-bar[encrypted="inactiveMinus"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncInactiveMinus.png"); visibility: visible; } #enigmail-status-bar[encrypted="inactiveConflict"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncInactiveConflict.png"); visibility: visible; } enigmail-2.0.8/ui/skin/classic-seamonkey/images/000077500000000000000000000000001334302754500215545ustar00rootroot00000000000000enigmail-2.0.8/ui/skin/classic-seamonkey/images/check0.png000066400000000000000000000002221334302754500234130ustar00rootroot00000000000000‰PNG  IHDR “båePLTEÿÿÿ¥ÙŸÝbKGDˆH pHYsÃÃÇo¨dtIMEÓ 0—·‘IDATxœc```¨?€10¸ 8±Ë[üIEND®B`‚enigmail-2.0.8/ui/skin/classic-seamonkey/images/check1.png000066400000000000000000000002471334302754500234230ustar00rootroot00000000000000‰PNG  IHDR “båePLTEÿÿÿ¥ÙŸÝbKGDˆH pHYsÃÃÇo¨dtIMEÓ þ/7{'IDATxœc```¨?ÀPïÀPçÀãÀàq€ÁñCò†ò q‹¶ûg&,IEND®B`‚enigmail-2.0.8/ui/skin/classic-seamonkey/images/check2.png000066400000000000000000000002261334302754500234210ustar00rootroot00000000000000‰PNG  IHDR &ÎàqbKGDÿÿÿ ½§“ pHYs  d_‘tIMEÓ  ‡óß#IDATxœcüÏ@°00008€SÞÁ‰ #K#Á084|ç®¶IEND®B`‚enigmail-2.0.8/ui/skin/classic-seamonkey/images/col-encrypted-signed.png000066400000000000000000000014021334302754500262760ustar00rootroot00000000000000‰PNG  IHDR x0}usRGB®ÎébKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEÛ çõó‚IDAT8Ë­’[HSaÇÿßÎÅÍÍÝuºL]Í„/3šAjµÄ"ì%¡‹QôTT½Q‰‘D/QQ=$TKyéAº`æ¥6cj.¶é<º³³sz¨—®‚~ð½ý¿ß>‚e8³v/¥d#‘x-Êòéâ–Á—‡52m¨‹Ç®Ú÷ ¥FÏ–Ê(-k5”‘CàEWòo³µøøTòáöBgšÉö’×ìaÈÔ³inôÁEòhè\i“¶b}«¾ØJ„p7D~WC­œeëð¶(SÉ E›=ºU• z ëzB,G~ €UÓ—o qn ƈè$þë ,®¦Z13ÿN*¹ÚjgÙôtd¦AôÞˆ ¡q<& ñ‹Q”2DÁBW¼€tF&Ô%;®eåxÈ2hpBˆ½5ÎK|ߢÀÈ•J£57Ð,…ºâÜ[€ÖBÁÆŠÄ\Ðÿ'yÄ7 ºÝ5e§"}°¹Vå`´&·¥Ê¥% :9ÕÊ:€Ä@(#‚¯®s|Ø×ø/ò…€¯­Ê¡ÐXÜf§K'‹ß(„ß<éå>÷—kì[•Ññ{³±‰ÞM…G{û]T[Kn©sRË€øÚª”Þâ6UnÑIóïÁfÖ#Øw|À§"””#IRµD‰Ýö}=£ ¯½mת³ë§©´Ñäšû°¤hÚ`~nZ·]'„A™ÝŒÄ¼ "l;yÞŸg÷;g4í6’ø”W½{:,Ì 5/%ÿЭÐSª,¨òŽ#1C ç|!I_%‰·ß¼|¢.7Ò¶ñ"fSm‰ÿñ™ÉÈHñy³c'ów¹/à?ñ¢˜*¾Ñ¤¹ÆIEND®B`‚enigmail-2.0.8/ui/skin/classic-seamonkey/images/enigEncInactive.png000066400000000000000000000012761334302754500253230ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÙþO¼>IDAT8Ë’AKA†ßùvf–ºn)»"+8 1K6‚ öÖ³·þOÐs) ’ÜDü ’SsÑ‹ ^ò ê¡`“›¢Äl0N”LOK}®Ãû|/ó} oP,Õ`0øÎ³–J¥Úówë­°¢EÑ—ÙÙÙ,}Ëçó¨×ë§o Êå²âœ×gÇÖ©T ¶m¯d³YÄq|úª`kkË%¢ÆÒÒÒ ç———0ÆàööJ)H)W¢(ÂÉÉÉ)I`YÖ× f|ßÇùù9„B Ùlâññ™LDT¬T*mzI@D "pÎ!¥„mÛ°maÂqôû}är9¸®ûãÅœóßWWW`Œajj ÝnwØÂó´Ö×u‘$ ŽŽŽZZëeëy˜ˆâ(Š”çyÐZCF£f³‰ùùyxž‡$Ip||ܺ¿¿_ÞØØ¸`°»»«Ä¹\N9Žƒn·‹ÉÉIœ¡×ë1=ÆXÑuÝI’ü5Ƭ … `{{{Êçóy%¥Äõõ5R©|ßGµZÅúúúÓ–e}ÖZÿÙÜÜì?œ1/,,(c Z­Òé4‚ ®ó‰B¡ÐÐÙ©¹¹9Ôj5„aˆééiŒ^ƒ„X]]ýïÖÖÖÞ'"ìïï\â{ù=IÇtÈb§IEND®B`‚enigmail-2.0.8/ui/skin/classic-seamonkey/images/enigEncNotOk.png000066400000000000000000000013321334302754500246040ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÙ1(îÄZIDAT8Ë“KHTqÆçoÎ8ÎK­Ð™t.…YQÑÓÉ„’D`„´,‚(hQD¹ˆ(*‚¨Uº‰Ú´ë±‰È1ƒˆ è‰’•:–¥è$Íä\ï¿E¡’z–‡óû8œó}•tçZƨspê–;ùý.Ó­¤;×Jæ,é²kµ][”Ó‰¬Ù§&ΨÿÁ‰ìùžP‹¹çR„<úï£ÊWan<ÓðމiáÌ€OføŸ™õFc8/¯‚¯ýHi†wMÅñÞwœN~”~wÞ&µhW+ˆó¢ É !¹8Ÿ:¡ùR¹³úBC"»ø™ŽÃ3xç Þ0xgbT-ƒ!ôA¤¶ õ|ùÉ´˜F»Ó~cÆnÔºzˆ½ï,ðçÂ?ðƒß„œ¢à$DþJ qÝ1«¢¿t"k—¢ý~þ‰ø|ôAaôŽ¢»¶ÊDx¤p½å8NÔØqÊ’Hì˜ K `` –¾iì#ûzäG¬Ü˜k­£Æîs–„=0؇øBØgÑOÚP5U°0 zìÃ{dèSyFìq—üK,m¸£ªî¢%¾|nG–—a_9ï€Ð ù«3uß«nIÅ+2bO»äWñv ;5ö^µPý𶩬ƒÅ!Rµ[ph€D¸È/Yó­=Ý[ëᨹ¿É"Þóä<ªæ2”þõéø‰2¿tÄ¡#>éa(eÉΜ[QÛn"UE¤6WÿPSæÅqW¡®¿7’¸pµÝ“éÎÄTØvüÓUÓNìoÁÅH­Æ\¬IEND®B`‚enigmail-2.0.8/ui/skin/classic-seamonkey/images/enigEncOk.png000066400000000000000000000013551334302754500241300ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÙçT]mIDAT8ËSMHTa=÷û™7ãÌ{3£ É óÔ$E¤)+‡ \¤HQIP -Ú¶Žš‚èg]¸tBD› G#È ŠéÆXþ¥Ž¨ãï̼y_‹µ=Û{Ϲ‡{Ï%lƒþh¥©,º ‚F¤:«nÆŸ¯¯Óvd&ÝùẠÐu,b~à[´êzßÕ¾%ùvÈdBv;Ô Ã]V&ÈÅê,tMöl)¿»GgäøPÔx&(¼iX©Ïldf’pïI=r©:ƒû¯'zĦãÉÕä ”»Š‘ë ÏCªoÙ…ðÕ4Ñø=6Ë6ãsq9©ƒq$¼(8|R÷ÁÎÍ#ÿ@3Þük›:`_I&`çœÞ0ìôˆy „R/ $up·×÷Ÿ@{ØT9û™¿ö F!ƒ°–t(k $t4@Z 2³SÈÌŽ½ÙpÆD{ØÌ1ÿ¾3/P¥,ò<5 • Àœ%°æ’ug˜VRõ|=Ù–ó×6›®â(k°}˜|÷Ë??Á]~B¯@65…_]·†iq®¾ôrï@¢#l*ÅcþÐIS+pÀNA{1ÑýöòL ËŠXTx ]ÖÂÔB6RÚÖ;”舘`¹˜?tÚÔ|YX qHÿQpO%Fž\Aië[€‡u†´µÀ¢sú{uË×̪sA2ó…ΛÒ=ÌL/´ÂSÞÚ?qàk+ª¸ð> õïÒ3=åM˜ÿÒ-ÐáoÀÈÓÖ¿U¶Ý¯Ag ÿåZ9CðlŒ°â £/ÎmL2gØ)~w#Èo%$ôIEND®B`‚enigmail-2.0.8/ui/skin/classic-seamonkey/images/enigSignInactive.png000066400000000000000000000006621334302754500255140ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEÙ»™V%2IDAT8ËÍÒ±JÃPÆñ/½m¥dk;X‚„ ê’‚ ‹|wŸ¤/ЭKöB^!ƒ ŒqŒí Á  Ü,…ÒÒ–›Ü'‡ ÈÍæ™Îòû‡£¡Á¸®{Ì9¿)Šâq2™¬ ¥Šg³Ù!$¶mûÁ0ŒÏétz š*6 ã¥ÓéôG£|߇iš›ÅbqBT±eYý^¯‡$I01 Ž–Ëe¨©âªª ¥Äv»EÇÈó|Ã;o5ÁBt»]!V»ÝîÊu]¦5ÁBDQ´JÓôÚqœ÷_Øÿ4ŵ€çyíý~ÿfYÖ©*®=R–e¨”²Rŵçܦ”’(Š´¢(* íï…1v?A)E’ò‘çùÝ_¸Ãðòp8<éºîqΟ˲|Ïç%þý|˳ÛU:¢IEND®B`‚enigmail-2.0.8/ui/skin/classic-seamonkey/images/enigSignNotOk.png000066400000000000000000000006631334302754500250050ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEÙ Ï¿Vf3IDAT8Ëcd ü)‘’ø÷å›%ïoûØæýúÈÀÀÀÀD¬æ×ìª?ðßd6^´Žá—Û“‡nœ¶Dð:‚]•ŸOû#Ÿ0ßï— ×.ÉóH0m½jÂÉÏD¬ffžB̺¦ Œçê4½-˜Ícy?2þ·g$V3L쟎ÿmû>ß~ùùã75fR430000~zÃðï͇wOþ|738õç#)š88þÜ|þîî«÷Z‡Üf````¤D3†¤jf```€‡ÁŸ>öϼǙy~H«%ü¹xBŸá‹")šQ øýËšQ>ŽùÏãÿDkF{´%ý]òÿŸ²žÿßLDþ|³¹sÍ–C•>x F ð} —ä<¯ òiÕŸ Ǿs~¿èpáà­´­8BþêjIEND®B`‚enigmail-2.0.8/ui/skin/classic-seamonkey/images/enigSignOk.png000066400000000000000000000007051334302754500243210ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEÙ¶ƒ;+EIDAT8ËÍÒ¿KqÇñÏÖiø+“PpÓÅ"¢XàDôŸ4 ý ­îAmŠCäV¡!GYáà)*ix޿ߦ†#ˆïÑÒ3=Ëë=<<,L+Ÿu²1ÖÔëèáË𬸚 Ç2[óG³—‚;Ù(Ÿ†¶™Õ\8æ .ÜÙ>O«§¡ ò.Op+/O{m¬8Hû'¦ÜÕ¯‰'áõ…„öcñ–cÅ€P ú°ƒNEÄ .Ôw)Î[Á”j° “ Tí]^^;C“³‚)Q!ß—º}©¶¾”íKÀýÿXŦ-¥ì Åù43ŸžcŦ?xn79ÊG(SVl ÑhÓسµÄ"Gt•²`°/•ºpYvñV¸ œƒ¾ª²”ù ›np”ò}î¯x¢îÞ¹¡7ŠcXÞ9?_Y©ì6[MXÌIEND®B`‚enigmail-2.0.8/ui/skin/classic-seamonkey/images/enigSignUnkown.png000066400000000000000000000007711334302754500252340ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEÙ¬^‚’yIDAT8˽’½OÂ@ÆŸëÇ"q! àEH'MDhŒ³»“ÿ;N²tcéNÒÄ¿€ÁÑÁH""†¡²)‹!ËbâG®íƒ¶!„@Y|“[Þ{~Ï]Þ÷!X¡,ËJ2Æò®ë^•J¥w¢Â•JeK–åG]×/(¥/†a‰ SJïTU§R)4 d2™Ïn·»©DÏÊå§éž[¯CUÕõN§s¸€—$ñ•N Ã0>ŠÅbRYöm¸o·Ãþ^.‡ïµ51v-ËrÈ"8›ÍÆ…àœÃ÷}ä €/I¯ ç ¬‹_ÉDæü$Ð+Q`ß÷1µ²S\L˜ƒZ­¦PJ/çÁ¶m¿ðÿ¤çÓ†ƒÁ`€Æ9³p¿ßß'€BB€É\Ƙ®išlÛ6q]WLæiö‚UÎÎ,œã8ljDš¦¡ÙlrY–Ÿ‡Ãá‘iš½EY Z­ÖÎx<¾‰Åb5ÆØ­çyÕjÕ îIÄØÿýg-Új¶ÝO`IEND®B`‚enigmail-2.0.8/ui/skin/classic-seamonkey/images/enigdecrypt-act.gif000066400000000000000000000012601334302754500253240ustar00rootroot00000000000000GIF89aÆÌΜœf4ÌÎ42œdfdfÌœšÌÌÎÌegÌkmÎln΃„ÖhjÍ‚ÕfhÌqsЉ‹Ø¹ºè–—ÜprÐ42dËÌí%ÁÁêikͤ¥àÑÒÔÑ×ñ“ÚãæêrtÐjlÎ29EÉÿÿ¬­ãÔÕñ424ÕÖñuwÑ€‚Õ¾ÉÓµÀÊ¥°»›§²‹œª~‘ XV­vt¼œÞ,DR7O\Ncp^r~t‡•‰˜£OM©53œ64dfdAXdl’prpDB¤ŒÇž­º}šŸu‰˜^u‡egeÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ù ,þ€‚ƒ„…†‡ˆ‰„ŒŠ‚’“•š¡”ˆ•˜˜›—£¦¡°°‰š™——–µ„ƒ±¿–»ÃÃÇͳ‚ ÃÔÆ ¶ ÚƒÔôôÛûï4XØÀ¡ƒ…{êøñäáBˆ(0‚ž$ö„ÀÄ%Lœ Wà‰ŒÕ[IïÁ’(œÜøÇ )T¬`Ñ‚‹/` Øv’…1dÌ QÆ…päŠQǾ:ŽÊر”‡Ó>~LfU‡•@XÂcÈ ƒˆ ÀJáì –+=ý ;enigmail-2.0.8/ui/skin/classic-seamonkey/images/enigdecrypt-dis.gif000066400000000000000000000012561334302754500253410ustar00rootroot00000000000000GIF89aÆüþÌÌšdüþdfÌœšœšüÌÎüüþü›ü¡Ÿü¯®üžœü®­ü¤¢ü´²üÒÑý¼ºü42dÞÝý%×ÖýŸüÅÃüÑÒÔßäý¶·üãæê¥£ü žü29EÉÿÿÊÉýããþ424ääþ§¥ü®¬ü¤£ü¾ÉÓµÀÊ¥°»›§²‹œª~‘ Õ–—ÜÀ¾ý,DR7O\Ncp^r~t‡•‰˜£xzÒegÌœšœAXdl’¤¢¤prШ©âž­º}šŸu‰˜^u‡›ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ù ,þ€‚ƒ„…†‡ˆ‰„ŒŠ‚’“•š¡”ˆ•˜˜›—£¦¡°°‰š™——–µ„ƒ±¿–»ÃÃÇͳ‚ ÃÔÆÒ ¶   ÙƒÔáòòÚùî0dÐ0¡^:}úmàP¡Ã €g`@„û!ØàЃˆ$ä8ââEAóRÊ+QB$€%3þ™`ÂÄ )T¬˜À¢A ´•$4áÅ 1dÌ 1¡Æ6‚Z¼‘oÀ¢0p$ÍÁTÇQ‡Q½qe>~äd  ¬F(;HeJO;enigmail-2.0.8/ui/skin/classic-seamonkey/images/enigdecrypt-hov.gif000066400000000000000000000012561334302754500253560ustar00rootroot00000000000000GIF89aÆüþüþÌœšüdfÌœšÌÎÌÌÎüœšœ›ü¡Ÿü¯®üžœü®­ü¤¢ü´²üÒÑý¼ºü42dÞÝý%×ÖýüþüŸüÅÃüÑÒÔßäý¶·üãæê¥£ü žü29EÉÿÿÊÉýããþ424ääþ§¥ü®¬ü¤£üqsоÉÓµÀÊ¥°»›§²‹œª~‘ Õ–—ÜÀ¾ý,DR7O\Ncp^r~t‡•‰˜£xzÒegÌAXdl’¤¢¤prШ©âž­º}šŸu‰˜^u‡›ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ù ,þ€‚ƒ„…†‡ˆ‰„ŒŠƒŽ’“ŽŸš›œˆŽ——ª‰žŸ°Œ®˜––µ³ƒ‚Œ°Â¼‚Ç‘ŸªÈšÅ ÈÇÍÒ Ú„Ç   Ùª½Èôô–û½0LÈ aÄ{ëøñÄ¡ƒ>€‚ž6 û BÀâ‡$JÐPAFŒ‚ꩤgâÄÈ Ljü3Š*V°h1ÁEƒ0à3IhBŒ2fШacÂ8pl B_„uFeäPª£é=¤Ów M,~Ñ$È„A B$4›re½I‚;enigmail-2.0.8/ui/skin/classic-seamonkey/images/enigdecrypt.gif000066400000000000000000000012561334302754500245640ustar00rootroot00000000000000GIF89aÆüþÌÌšdüþdfÌœšœšüÌÎüüþü›ü¡Ÿü¯®üžœü®­ü¤¢ü´²üÒÑý¼ºü42dÞÝý%×ÖýŸüÅÃüÑÒÔßäý¶·üãæê¥£ü žü29EÉÿÿÊÉýããþ424ääþ§¥ü®¬ü¤£ü¾ÉÓµÀÊ¥°»›§²‹œª~‘ Õ–—ÜÀ¾ý,DR7O\Ncp^r~t‡•‰˜£xzÒegÌœšœAXdl’¤¢¤prШ©âž­º}šŸu‰˜^u‡›ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ù ,þ€‚ƒ„…†‡ˆ‰„ŒŠ‚’“•š¡”ˆ•˜˜›—£¦¡°°‰š™——–µ„ƒ±¿–»ÃÃÇͳ‚ ÃÔÆÒ ¶   ÙƒÔáòòÚùî0dÐ0¡^:}úmàP¡Ã €g`@„û!ØàЃˆ$ä8ââEAóRÊ+QB$€%3þ™`ÂÄ )T¬˜À¢A ´•$4áÅ 1dÌ 1¡Æ6‚Z¼‘oÀ¢0p$ÍÁTÇQ‡Q½qe>~äd  ¬F(;HeJO;enigmail-2.0.8/ui/skin/classic-seamonkey/images/enigmail-send-small.png000066400000000000000000000046461334302754500261160ustar00rootroot00000000000000‰PNG  IHDR<fvšVsRGB®ÎébKGDÿÿÿ ½§“ pHYs''«³ïÉtIMEÙ !Ëw§Õ &IDATXÃÅ×}lçðïs/~÷ÙÆ‰“âÄ„¤p$…•– £Rµ¶¨SÔâ¬-¥›ÚÁ(­ t°©Ú€ m Òv]AT¤CR ¯-[LhRY‘J‰¨è"³@^ MhHJ¿íóÝóìs"‡I«vÒÉòãßýî¹çå÷9ÿãƒL°uëÖ»‹K¼ë].Ïã ¦Õócã7N%é÷L&S¸©©‰Þ/J¶yófY¹¿eÑ=‹ëfñº®CQ’Ë•D|i8|¡ájß&ÿ¼ù~ªd+V¬ªª*v=øðªGtJqâøçΞùøÚ—ƒc6»Ó'Ï«õG#Ñe‹+>úèJ®—ÜT ëëï*Q䫳X­$îÒbã± {öì[=:2º¶ãü§Ÿ€ã8—ÇS‹-ªºùº)Z­¦šŠY³j£ÑŒuîÙ³ç,¶oß¾þŒ–éWV‹…˜Qp @N¼Š•JæÐÏıs®±älfKu¶î€ôT¢ëÖ­A©Ûáp ?‘ ¢(œå^Áw)Ú Q$#@2‚Tb Õ1’T̆âKÔÞ»¶â³Î+±Ÿlh’ &<þ<_&£Y*…H@¸lô  &Á2iU±ëƒRœÅ¯ÿèû/à}°¼ch•ð¤h†@ÓMzöóÓkðÅåXì ’—‘¢@ó—\·[ìØtü÷äÃÐjðC¼­=×óž×ê‰ØñèÛ­¹¸þƒõ˜½¾ýë'\ö×`½%ï,[¿Z^4Úþý»z@"b¢íâÍŸÇ»O<…ž×ê¡§øÞ7Œ«†±¼ 9‚{Íf˜`î/ÚFå~ìVT½Øš1¾ÏÙhÄx¥‰„“™u1vO×/ë'M™ÛEÇöû°à׃f{ø¯íõl M÷¬G&_B’Ö1”V àuÕ˜aÆ8üýÇ øÞŸŽNÜ8{y2 U×Ñ>Õ²±g!fnXWJаÌf…ƒÀ "!ÆàpÜäeôÕu(ãQø6c<_q W†€Þt0†«£ãM¥@™w: Æ(a $»R èÑ(Î<ò"ZØ€€dá³XáuØPRS†ÀâZÌ+/E¹d‡‹èj=ía8ðœ LW`9V®ìMløÙ3aÑÒ_|‰ÆÄÝ)俨êüMgvQ@ËžßÜ1m÷îÝ{÷ ¯{½Ã)=5s>?•RÔ÷L&SxãÆ·oÊîÝ»ý¥¥%-rm]Ûãáu]G*•^žL*K{{/5|9ðÅí›òôÓO €×Òå÷?B)Ãé>ìèêøìãá‘á1‹Í¬öÇbñe<àÿüsx<ø|>TWWƒRcsÔÔÔAH~S!÷ò£:³ S†‡‡qùòå\Û¥K— ¤Ìæü cu„ÀÄì fÍše”™ls¹\;׬Ys«)Á`PJ‡4MÓ𔯌1”––Nïf2•1Ö>Õ²±uuu½+Ëò}^¯w™¦iBÇqeee „€J)EÑœÍûÂ9þ|ÇF;\M¥R£š¦Qn]×cŒ’ý›Â4MÓUU=óÌ3ÏLmJ¶:;H<ÏûAð ‚Pâr¹>ŸožÝn/7™L.:¥´gxxøÀŋυB¡Â¦ƒÁ)Mq:Ji:‘HL2% }3¦üpä0+Í«ºIEND®B`‚enigmail-2.0.8/ui/skin/classic-seamonkey/images/enigmail-send.png000066400000000000000000000102521334302754500247760ustar00rootroot00000000000000‰PNG  IHDRZ¯ùæØsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÙ9L9¡€*IDAThÞí™t”Õ™Ç?÷ý53I&? bH( HÑj¥Y…ª­­­vµÇ=®X\·µ‹B[l=V bìÖSkðôÈi·¥´ÛÚjQ#V -ø4ò+€üJÂ$™É̼3ï{÷™ “€û×î{Î=sç½Ï½ßû<÷yž{¿ï…ÿk8›Nßù΢zÍÜ%Ðne®®iïØvúy_W´üGoäÀßþö=Wé†õ»éÓ¦›S¦NµtÃÄs]Ú;:8üÁÁÔ¶}¾ë¸o&¤}Óøãc ð=߾粠Xý—n((+¯Àq]\ÏCú>BÓ0t]ÓhmÝî¾±åo½J¦&-[ö“ÎÆ2† žû™+ Â%¥ôôÄxuc$uäð!!„ ‚Éq ã­i3>8òTÓsÜ¢íïnøì@ciCýÖ·¾5ÄÔÚ±çaÛ6›7½ž>Þ~¼EI^ñp³a§ÒsöìÞµ¹%òb2eÛ\0m†¥|ÿŠ¥K¿QyNÀJùóÆ7|L¸¾O:ãðÁ¡6åe¼»š››“€jnnnvv]y¢£ÝH¥’x¾ÏȪQŽë.='à`(põرµJ)Ž= BÛ×ÜÜÜÖ_fåÊ•®fèí±X)%¡PHhš*:kàß4a™"9¾¤¼MÓ8tð€íyÞêd¥çW¡i©TJJ!º†í\¯4L•óKéñ…úãÛøSÅãŋ͗å0îsKèÓzÑ¢E5š¦‰âpË4銞0”§Z‡ œ,cEQ9óëf"tÃGú`÷ì¡¢#ÑÅý©.|þÇ(Í ÕóØÚžø³– ]í„‚(éãû¾zôÑG+Ž›šÐf–0‡Ò@QVRˆ\~uÏd¤ã¨D·æ¦z KùFx{Žï=á¾8±© 9dàçå «?|lňœàÀû×…' ½Ð¾WËx¶ÜŠ2ÿŠ&ÒCr.apsé(ФÊéò²¿ùzëßëØ´þN)>¥Ý0¡¼ο\Ì &J˜7d¯‚O‡ ÑÎ*=è>¦·§MÈÛ•%U"¸hHÎõJÁ”O­È L]ÃÐ\¾8{ ÷Ýp7Ïm¼–mXNgª6Þûi Sþ=+sý%khúêÝ(ŽMŸcCÒ8Q ÍÄFžœ=ÀŸ—NåÙ-7qüƒ {é!æÖ­ã??3ß/¼•“yñþ©üáo7õiŸNâ804S+f… 1U?Ó|vÙ»\ó‰_“LiOŽaÖè—Xôò‹|á©Ö¾É]õýw¹væ¯Q¹~n M ö ÉÔšàÓÁ ¡¼™UÎ÷·4½½ET¡µs6̽š%-Ï÷¿ùð„ÈNØ÷Aº˜é1ìªsM6Œ~NâåÓa¶^Tàæ?Ê÷ÜÎ}YÇsØ'ÓßÉì ³ë†ð‡¤±‚ þIÇR¶,-ÉšO@:d\ñœûfÍÜ9 ßz $«y.ží^¤”¼:ÔMÂJ{¬õà"åS[ó£G¶Øž¯§b$”ä¯ë§2€Bßçýñc¹$cS°05JeM¡hB.L.Lœò>ÿ›¯G#=¸wí‹ô lmÈßoä¹OLC0=ǵm<%1Q ‰ìÀ|¨mC"AôóÿÁ}CÑØ$ K‰öÂfvü¶…µ'zØjg8îdð\‡p"‰ÑÛKÆqJ¢ •ËÕ9P×ÇI¥Ò,ûM„MÃÙP”ä~û—Â1•T^t'Õ1n\ %ŒÕu\&Œvó«[À@è=›ãmÅ@aÎB¹÷fÎjê‚ÂOùÖìÝsˆN $s%Øçr ·òäþ›¹è¹eòsK–ɈçÞ…9-õ\Ñú…gÿ øüÿs¶¦^½úgõšnÞE?¶¨ ñŽã8ÏKw,¸ã£g‹«V=y•®›¿khh0Ï7ÎÒtßóèé顳³=Õ~ì¨ïyþ›¶ÊÜtç¿ÞùѰÅ'W=y™eXë?uÙåáp×óñ|%%Bt]CìswïÚÙ«TfÒm·}ýÜÙbÀ´žþ‰O’H$ygûÛ©':B¡LÓJŽª®¶êÇOÔž7Îô]¿h_Û¾sg‹«V­šLYYE&ã°cÇ{é®î®%ExíÚuF&ãÌ9røƒÍÛÞz#™Î8Ô5Œ·òЧŸ~üÜÙbuuð¥ãºtvS¾ëß•ËL hÇz¯Œõt™L_ú”–•;žgž[´,ëê‘•# ”‚®è @Û´Í¿æV=ý4³fÏp5]kO&“(©°Ö¹±ÅW×4Zº°Ç!„ £ý¸íûþêÏ^û9|©PJËʹþ†¾¬ CMIg¤ä,Øâ¶5ÁL˜_JŸ/Œ×ž%ºý˜£°R…f}ñ ¿þ›qïÆ¾Ô&˜¦…m§k¬€! 0tƒÞxÌPþY°Åt+BaæWM@hºDIÈ$ŽP\‘îåþt/N«ø­:­¾ÏÖns¬–±.ò‚ ”DJ©€á±Å5kµ EDÇL¡Ô õÑš>’–ï-=°ãà¦PvBs3 ÝRRC5p$Z°7æ½1ñ–["rÈOq¹a¡f–åNŸ§2ÄìœÂR  QŠ´„x¤b;ÀׯŽvxyÛšÆùÓo‰ ‘-êÜ\TF‘ôs'G?»Ù)ÿd9°kïm­#v¢ Ûž{¯µÓd@·¸Ð.&[ Ñ”27 ôOÖ•½±v"ˆ&Ô€íøPX6 ¶¸mMc0#©Õsfn_ù,ºð¸ôü—¸ùò'ùûö‹ùí›·ËŒ€7«¿ñyü$'3å%ni|x™a°E»ÂÀF’Y-úçÛÙôþ\º;‹ùï·nezÕ_ø·KiºzAŸ,û—ÛÙ´snVk Nz˜l1Ĥ¿Ù€ïþj³Ço$m[t§+™Tñ&?{{9Mϯî“YúÌ*fOØØ×ÏË ©á°EË"$sfÎ?ßr=H¥B”Np ç|¾6ý»¬ÜöPŸUžXp}–oùàgùµéTþ#[ë“IÜ3…J2rD¥ÝÙvy2ÜúÇy&IÉ_Å`»Sccc(ze+Oô&y/%å9'C~p]x”wQ^ÒuJâè›hn"®ƒé ¶(1ø&¡íµ·‰m~—¯~í:n÷< P† Á!ÓÌ~ÇêozÕï\ÞäÄ€Nå l±¾¾þ¶¸u;þ²µ±[—㮋çy„Ó6FÊ&ãùY¶˜ç/y¶è¹ï&•qYflºd^dðÝ©±±qP¶XYJå¤:&Ž­bܨ42V×nŽK%ã ~õÈ/²l1‰ôxØl±®šp}5åïbd‹‘HÄ>ãçA?5®˜ A îý)i tþ¯Q˜þÚ|í:U‘Ê9yçêïL à\ŽÝQ˜ýÅÈИÄé¦Öu˜1Æ@U9”i€Ð ËÌ]? ìûëÛËn"ðÖù”§²&ÕÁØ*5Š A?-ÅðÈ/²õH$2ô3×`“¸òÊ+?fšæMB”R9î¤ã8N xeýúõÛûËŸ>,Ò–ŸÄ¼yó®3 cZ]]555躎ïûôôôÐÕÕE{{;RJÇyjÆ ÇÏ ¹¹ùŸLÓœ3{öl ð<)%žç¡ë:B4MãàÁƒ´µµaÛöã÷Þ{oôœØâSO=E:ž3mÚ4B¡¶mÓÚÚJWWBLÓ¤²²’úúzjkkñ}ŸÃ‡¸ÿ¬¹@,›®i¸®ËÎ;éîî&ÿ°¼¼ü~ÇqÖ?~œÖÖV\×¥®®ß÷Y¾|yɹÐT4M›7zôh¤”¸®K4EÓ´•ëÖ­sÇ¡¬¬l—eYöôôà8J)JJJ0 cÎYK)1M30bÄ”Rtuu¡ë:}'Èx<ŽeY !ét¥T~Ý‹Î8“ÉK)),,Ì2ÆŽÇ9¼páB"‘ .`Á‚B)E0Dã8H)»‡í\MMMåååK<ÏCÓ4^ýuÂá0½½½hšf677Ÿ·xñ⃹»E”R º®cYº®cÛ6š¦½?¬²bÅ ,Ëú~UU^xá)ñFéì줫« ß÷1 ×u‘R‡™9s&RJ^{í5î¾ûîûûl|ÊsÉ%—–e]6kÖ, ÃèËP¡PˆŠŠ jkk™4iõõõTTTPZZŠiš¤R)8@4Åq.¾øâ×6nܨ†¤ñ=÷ÜÃèÑ£ç‡ÃáY—^z)"wÆB ©d2:::ؽ{7‰D‚îîîeMMMΠk\QQa³ª««ñ<۷o'‘H0eÊFŒÑ÷Þ0 jjj¨©©¡¥¥Ïó?É«•Ráæ[•®®.b±BˆÛ}ß§²²àÂ!yµ®ëa)%@ÏóÔv÷îÝØ¶Ý—.Ï$gÛ6J©cƒ¯X±]×g†B!|ßGæ>>ðÀMB¿®®îíùóç?·eË–Ú={ö|ÞuÝò 6ˆeË–5-]º´Iá××׿}Çw<'„ ´ š@\×E)uQQQÑ)f¸í¶Û;xðà´d2ÉÞ½{¯5jÔ¦¹sç>xã76åeî¼óÎÇÚÚÚ¦åûÙ¶”rÿ2—¦i`0øÀ«W¯þæ˜1cÞ)..ÆqœŠ†††í---÷­]»¶ø‰'žøfmmí;ý@Y²dÉþAMÃ0NY7€Å‹ÿ _·,«ëСCn½õÖ‡~þóŸ7ü½ï}ïygëééAÓ4„jÈ)3¿Á÷ÎÿÏd2444üiïÞ½×=óÌ3×Mœ8ñ•±X ß÷‡|æ ,_¾ü;eeeŒ9r@Oõ}ŸX,†¦i§ÄïéeÏž=Äãñ·–,Yò§ÁRf(TJ¯®®ž˜J¥úv¥T_ɧÎ`0xÊûÓËÑ£GÑuýÙ^x!yFàÆÆFöïßo¶¶6ÿÕW_Ý7iÒ¤ÉJ)zzzH¥Rø¾ßüa€J)’É$±XŒE‹=?[¤¾¾ÞÛ¿Ž1JmóæÍû[ZZŽÄãñ`2™ ;ŽC&“!ÇqgÀÉd2Ž=J:îxùå—ß2…‰D"Ê«ªªFNž<¹¼¶¶–êêjJKKóÞ‹)%Ñh”åË—¯è~q(l‘H$ȱÅÓc wͧŒ;6T___ºsçÎ}ݹ뽸ówÞ¿lÀ?<üóû¾vÓægVt÷еý!!ÉBHȲ<]øœ9uœ7_}‰ºY­È²z«¼TÀŸþðÏݱíG©SíÂum®KÃup]‡†ëâyï“L¥¹ù¶ï¥|VûäÌ©êwýúÞ»¾ñí‡ÚRi\§.¦2äP”ìtŽzÕÀsl‚Ï&°m޾{@ø^ueq@Y–ŸZ½®ŸR±€‹L÷º‹E5Êä…I:Wvã5fd™‹Ù ä²¢ºÎ›oe¦_½ àïñ“ko¸ióÚ¦QÌOÑÕw=ûˆ°WÁñ|ÔX' ?àÐðx~ƒ¶ö4«zúèìîƒBšÖ¾ `$Ý! Ê– e“Z)Ï-·oÁµ-F?ÍsìØ1î¸ãû¸ŽÃéSLj'ÛQUß÷QµIZ”EûeEáÐ[ÿÆ(›œ?EàÖQÃ:Ñx;Õr‰ŽT;Éô º®écËwsø7(røA0›6Gÿù›"‘¶°ãÉÒ䤱+ÙÖÁd¶@¹\%•ùæmw#i1$IB$Éó©ôÞ×YÛ?Àñ9àÄ¿¶Vôoׄªã[Eʹ $%JÍÈ3~l„¦d?¡x]Ý×,ÈKIš}È·^„(*@Ú±-[Å4YOÔ\<3L8#D€>tòñ—'¢áÐÖB­­­R4ÖB(¤ÒÂ(ŠB<ÑÆÑC‡ kWMßw¦‘u ßÍáÖò¨²Œß01J'Ƴ‡žûû»/£üåÕ³€¿º§+¼më-›ÚZ[zTEV„“çÎçŸP¬Z… Qš~Ï*¾¦ ß1©Œìäà} È@èÌ'žúë;@m®›Àlb—.æÌÌØH\)0/N‘=“i™†UÆ4,/¡Êç€<`î¥oà²ZàÏu€é©Ov˜¯V»mÑD®¢(%Ã×÷â‡eßÏLÚViÆùÏÜÀpKK‹'„‚ †a¸_¸Î%Zã âñ¸hiiñx\úªúɦ<ûÇG÷¬ì^}¢­} Sj^i&˜3%ÖÒ|ðÇ;~»¼)CO>r߆›žYÑÝ+:× \m^JçÇyóµÌ›²äÒ·w¬xðæÛïÙ̧NÜ2x&uÀžËm€øŠ5Ü3ø«`mÿ@¬bv…)Ïîzô®¯ë¡d*çÔE&“A EÉMçpªµQD€ð\ð\Î|ôþ¬)´¼)•ÿÑ” K™²ç‰_^{ÃÆMkeMúª)oΙÒquSÂs¦°È”›n߶ʼnyS¾·ÀT®fʇ‹LAÑAÿÌ”Pë ôŽkزÃï¼Ae±)™ž~ IΙRÞ•lK1™-^fʶyS„$ É K $F›rqäI«­ÿ E»H})GiJ^ÿ9LyeÖ”T*•vlËF‰iÍ%¢‡árSŽ>92öÊD4ÚzãÀ†Pk¼UŠÆš™’äèááa%—ËeíªéÃ4 9¼Zù’)†ÁÉñì¡ç_zoÖ”½¯ü¾î®ð¶­›—7… ¢ (àYÅ@Ötá;µ9S¦®0eâÓ zöo˘’Ï™•±£q¥­€y1³¤)¹\.ŸJ¥Œ\.ç¤R©¦är¹E¦¼6kÊÅ9SÖÏ™r~‘)kÖ¬™7e||ÜýÜåkq{ì±Ç”Z­æE"‘ù±?þ¸ÿ•_¢)ûöíÛ“L&ïojjšß¡Ú¶ëºØ¶í™¦y¢V«e9‡nß¾}ySöîÝ{_OOÏ3‰DBtuu-ÚhJ—ý§\¸pãÇcÛvE–å[•¥677?¸nÝ:166$“IqyÀKýÒq:fåÊ•Á‘#GbWš²oß¾»úúúŠÅb4 133ƒ¢(”ËelÛÆó<<Ï›ïÂ÷}„Xâ?E’¤§Òé4µZ èììÄ4M$I¢T*‘H$˜L¹\Æ0 4M£··Ó4šò /\ÛÝݽV–e,Ë"•J155…ïûø¾O$Á÷}&&&ð<ææfÚÚÚH$—€[hŠªª.½#Çq°,‹z½Îu×]‡ëº ¦¦¦X¿~=Fƒl6‹®ë³¥Î÷Qe¡)Bˆý’$1>>ŽeYLOOãyªªF©×ë477ÏßY?§OŸ¦R©Ì–ߟ­6ÃÃÃD"‘pR¥R!‹a–e¡ª*•JEQXµjB,Ëš_寯ÆèêêB1kÊðð°ÕÛÛ«)Š‚ã8†¢(Ôj5Ο?Okk+MMM³;ÙDbAú1›Ê£££Eepp0Ýh4ìp8¬…B!$I¢^¯£iÚübœ;wîd.—›PUuëªU«Bº®Kš¦¡( ªª"Iº®söìÙa°ÿþ™þþþx$¡V«Q,ÑuZ­Æèè(™Læù‘‘‘ïg?™L†×¯_¿I×õI’!ÄäÌÌ̬)Žãà8ªªâ8¶m¡PH¸®K½^§R©\aJ¡Pàí·ß^Ú”jµjf³Ù¸®ëT«UJ¥’h4¸®‹ã8^(:744”4†††\€ÁÁÁ¦ }fJ©TÚaÛv·$I8Ž£8Ž#êõº/I’oš¦eÛö¼);vìðæ¼»wïþâ¦ìܹó SvïÞ}…)ÿˆœ‰:˜IEND®B`‚enigmail-2.0.8/ui/skin/classic-seamonkey/images/enigmail-toolbar.png000066400000000000000000000127411334302754500255140ustar00rootroot00000000000000‰PNG  IHDRZ¯ùæØsRGB®ÎébKGDÿÿÿ ½§“ pHYs''«³ïÉtIMEÙ 0M,ðSaIDAThÞíšy”\Õ}ç?÷¾WïÕÞÕ«ÔÝ’ZjIH9’X l0Æ,±sÀã%Ï89ž ŒÉÄa†Ø±L<>¶Ás›`c'vŽã,F>™Ø„ÅD0Ò`0 -Hê–º¥ÖÖ[íõ¶{ïüñªJÝBÄ<Éü3÷œ×Uu«ÞûÞßïþî÷þ¾÷ׂyíg÷þ;rÿ m"ŒV  Z”2h¥ÑJ¡•$VÂBH!$Æ0ÍWm@k”ЍUê¨HñÁÍ_ocÙû·}› QFG!!]„eƒ„dóÁ„DÁÈÓ¯pÁU -‰´,¤”Í ¤h^„Žjeö¼¼Ÿzßo#¶°]:Öa%ÒZk„€ÇÛJ†h­ÐZ£µcXle“SxÞ“O¿[©ucâ§JIÁ|èãï! Œ6¨HŸl%ps}¸Ù.„e!-›¿ùÓ?yW†Oj­²óA…Lá!-«IË ¤”5Œ9 ¼ˆ”O|±õ„ªzßݲDÂ!èÔf°{n ÝÃ’Ì÷"Üÿß~XZÖkýƒËÒÞy™lžl¾7•¢Z*R.©–‹d²yª•"µJ…ÙéSÌN4Õr‰0 „p¢DÂEˆÏø ïQÛ¶±,›Ûþè¾Øb£ ‰T£B¾ñ¥Í"á8?Y¹f}ZJÁ²«ÍùBÒÕ³ˆî¾þØ­´¼*>ãcûíÝ#»ÖÚ¿÷Û¶+–eßåûÞýíû´6`4n6ð‘t&·ü’+®¦\œcvú$¾WÇoÔã×7] ¼FßóŸ( QQ„e'X¹f=7ÜôI~çÎ/±ú¼ 9ß÷¾&¥ä«ðš…ÑŠ?Þüi;‘pî»ôÊk“RZ Ÿs.¯îÚÁ—^[ܲ\J¤8m¥q¤ !‘2~B´û£(ƒ”R‡a°Ø×tµ£>ÔÑÕÓÙ¿t€•k×sìÈ!ØË’¡á.ŸïÞù BH„È&x½^åŧ·ÑÑÙÅòUkõ½¯^o'û6mÚ„m”£pÜä-çn¸ 5ÿ.ºœçº•D"AgO_ü@yà3À£(`ô=œ8:NßâAÖŸ1û^qíDb­´,FFF°µV£PQxùÐðj‚ÀçÔ±#œ8v”™S'ÈæòŒ¾±y`ݽäòYªtt ´arò½™Ý]])™9y‚ɉ1ò….†W¯cÉŠUØv‚T:ƒ´¬%"Ž¿8ªA³h`i´Ï+LŽ¢É2V­{W\wŽãrüÈa&ÆöS¯Ì‡u/bòèQ‚°ÎàÒa&F÷ãteÛ¹d*ÍÐð2¹½ýKp“±Sé ÑotL$vLŠj¥”µ-›þúoá&“m·ô/]N¶£Àèžôoâ•anr«‡–qèÐ :¯`õºwplâÒ’ ­lßß6Z÷ wñn¤Ñ£….ÎÝôNŒVøž×h.£ï“J¥©F’JµÁþÝ#\wí¯²vã%\óÞ÷°k×NÖ¬?Ÿ‹¯¼–#ãc9|pSY–Á¸ AÕFGL |Àk^  $âä mcÁޝÁÆßü:ù¾­ŒÝûè÷þúZã>Æ\Ý,šž {õ ü•µáq×Òµ½¯{áì´zxH5hµÀ ˆæ ¢Ô6ýÕ&=ò‰Äö?ÙÌû~ïž6Ãd{V°ø‚_#Ó»'•K‚°Q¦4ñ“/þˆ Q”@;{ÛùàoñΛ¿/›Àba™æï&\güèí4 0_¹õr½jé D>¯þã&Ƨ9q²Â? ßòFû—V¿wã´2h'ñ&NHã¤þÿUûè9™§þàÃgô}¸ÙÿÏiÏ~ãVžýÆ­ÿ*øá?{pYÀöû~‘°0D¥Ð‘AEL¤1‘& 5 p›=µSFÑi§Y–êÄhºÞc õz€Öš›¿¾åìÁµõ Ÿ@ÚXV3BÒ6#± ©@° BkŒ„u¹ÅÍÑ $ÿ3XÎŒ5{×_ÿ>Êo ¢ƒÒnªE $Â’š©«)Eœ,ÈÓ[¢¤ù11 4a½Îë¯À÷¢…ÀÒN‘Ìb»i ÑH©ˆXÄÀRJ„%xù§£…K®YY”¶À²ˆÁ¡ –ÑH_: P~ß@Bu†Z”V‚d¾'Û‰åJIÁã>ûÛBZfŒF›jQ¤$ÛwL •BZ¡V¾ÖúGòžùÊÕ—å‹a½ŽöƒXПéjËvHºqòÝH[ñÿØrE2ýN__?ë6\@:%Íá$“Ô+eª•2µj€t:G­V¦Q«ÊâìLª83un­Z9·äDŸ{h¤†-e)÷¿§5w+µÙ6B“êQgË_üX¦3Ù'W¬>!a`ÉòÒ¥ÐÕCgwß‚´õ µ@úLNbÿîW£‡FïòWþ¡»X?4åÛF¤P¤:„_MgòÎÆ‹/ã¹íÿ@inšt6·Pº1LÌlq "ÒJ°lx C+×…;žzBÜóÚj±nùÈUtôñýï<’Lgr_rÅûe6ׯpdìݽýÍã…Òª}£¢Eñw*B)jÌhÕêW„aÈäÄ!гS¼ÿÒ»&¦kN:ÕLèFñå|g·Õ×?À²•kˆ¢ˆ#‡øÞ[_^£ù¾ï{øóú‹³Ó<»í'8ŽÃ’XYÜòúë¯sÞyçµdª"•Îüæ9ç¾c¥­Ûp!#/g=/y7Ç''8~ôðÂIÚŒèîê"høØБfvú$µZ'áÆRñ&µX«Ô'' ª%t­„ëÂv\~®éÎÉt†Ëß÷«ìø_[QQÄÒ«ãI+@ßó¨6*ØJiŒ¢µÖ[ô \sÞFV¬9·y€Ââ˜ÛOµ¡p-»cïÅÉÈ®A‰ïû ÀN8\|ÅûyñgÛÑF34¼­t¹\Æ3¶V)nÿÂýÝ÷|æ··íyõ¥ ²òe2ùA´pÑ:B5ª‹³ u§ñj5fNeÿ3ÉŠK~cZ¤-Øh ¶—v<…ã¸$œ$B '&&(zÅæ:Ö @ÞùÕ?¿¹Ïö?ñý›ºtýUØé^0u¢Ù J³¤ÒøµFžŸæÔ‰I›·h“–Zä4øúMóÊ®çèìéCkã™ X,bG~€ª×9ôÄg‡¯»Û-–«™À1a HULTAup3 B” B›‘ñÜæ; ºzÈwt"m+Nš–KKrÎú¼ðôÿÄ÷ÏçâsPÛ«ÔðfgÉ& ‡ÿÂñ¡ëïnøµ:œ²`Jè`šÈ+¡SY´ª *›¬×)í&ì˜z˶H&Ó8n2>Âz½†W¯ã:ɇOïNZÐðÅr„¯ª<÷çP,5v£Ã90Ý@ÌÆÀa4ý:‡,ÿø¼4EÑ‹M† W,È\²iÝÊÁE=ý)×u-K KZh£KåJõ‘¯üÙ–¿oûAÄø¡iì£%Œ§9‰lµ)Ìk@ ÌÖçÐa:ªxu²–>Áw…-Ñ&Ç&&ÍØÄäK€gŒ©7•}ÅSæ„©B¡`‹ÅÈÖZS.ÖãÔÄX ‰òçË[æ6§ƒ’/ܹYeù^ÀÚ^äHíß]53ÓÁóÆ˜Ÿc -Å(šTebýÒR‰   Ìc¦îˆŠw±…Œe…ê\ÿü·{/…½mÖ¹ãݰöüU,î X·œ›?¿×~é©D¿³w’G«d²]ÜpçNÛÓ,^´›¢b±ØÎôŠw±Z¼ÿ“7ðéï=Ì?š™|;•"$I¹÷ýè¤èß½~y4¼¤(^ymŒÉÉ9¦§*<3«~9µH1Ùh"£ˆ"Áǯèõ­M[1¶”â/-ï½¹ð¶ï½~Yúÿ¾ûæ7¿É<ð ûÞ²íÚµ‹;wþ«¨Å§žzêìjññǧ··)e»ÈeLSIК;Óžs˲¨Õjc°m·™m´Ë}­<»Y—xï{ß{öàêêê:}ؼæ'í-àù™E&“yØüïßêH‰óa­Û5–5V³¢6 êgé{Ó!‰RÌÍ͆á¢MJ’É$¶m¿å¨[ï…LNN&—,Yâ½xëþÖTµÏ´Ü–Râº.ŽãÄ:WJöíÛ÷.­õ“Ƙl˽ó>66Öž>!D „¨qmž°m{ëÀÀ€×òd»>¹@-ZVàå—_–RnËd2éÞÞ^ÇÁq,Ë"‚ ˆSÀq;; ôçy½žçm ‚àVÏóÄáÇ#)å(ð!Ä£o²ØƒeYc–eý¤P(¤:::¸3•J‘N§Ï: óW‰RŠR©dOOO¯)•JH)+‰Dâ.àþÀ@kŽ?’H$– 0>>N£ÑhOÁü¼ÕüÏ_tuu¡”b||<733óµùÀ²5ñ»ví²-˺o`` )„ ŸÏ355…RŠ(ŠÚ×™ŸQŸRªµõO<±öÛßþv äºng6›m¯i­5sss(¥<¼õù̾3Ñh48|ø0RJòù¼®ÿÔ§>Å·¾õ­ØÕÍy¾¥»»;5Âúúú8vì–e‘L&Ϻ~ÏæòÖ€ëõ:©Tо¾>fff\)åZ€Ûn»í4°1æò|>RŠZ­F½^§Ñh`Û6¥R‰r¹ŒëºØ¶ÖšT*…1†Z­†mÛí5 ªÕ*ŽãÐÑÑA.—CJ‰mÛ!–Ü{ï½|îsŸ;M™™L&š¥V«‘N§) ,[¶ ˲¨T*”J¥6ôõõQ­VQJ‘Íf)—Ë$“I¦¦¦°m›|>O"‘ “É´Ù/‘H „èO&“§£ÚCY)%+W®l³XË}¹\Çq˜™™¡P(055E­V£%9Óéxß- T«U„är¹SbÛ6ƘžÅ‹ó裞.×uéíímï&gNËÅa277DzeËèííeÉ’%LMMÑÝÝÍÀÀÕj•r¹|¶pS©BˆØÕñAg κ1´Þ‡aH¹\&¢(Âu],ËjƒØ¶M"‘`hhˆ‰‰ ´ÖtvvÎçê Š"‚ 8íjàäþýûûº»»Eww÷Y‰¡T*5‹“à8QŸO®Zµj^á,ËbéÒ¥9rc ]]]- ß÷}´ÖqýXkÍÎ;—_xá…_šššú´çyv+J1(¥ð<¯ V­Vo»ùl¬&„`ppÉÉIâÿ±B-Í·Xüüç?¿ÇuÝ.»ì²ÑÅ‹ã8N´V«á8NÛÍ­¨þ§¨SÁ¢E‹8~ü8ÉdcÌL¹\Ž— ÖñÁØM7ÝÔØ²e‹íû¾× ,˲Y"‘X°Í?~¼íöd2yV’BÐÓÓÓšó‡?ûÙÏ6+maت›nº©²eË–°¶ME„a¸€*£(¢R©Ìi­sBˆ¢”2oŒIÄ]Û¶EÓµ­ 4Q Û¶Ÿ]s©æÑ_†ÜxãÞ±cÇÍny¨R©¼vðàÁµÅ|>ŸêééY•ÉdVZ–•BH)¥0Ƣ街^zétmQkM­V£Ñh´ÝE‘ ÃP´¬k jþú¶,ëMµÅr¹lÊåò?Y[¼çž{äæÍ›ãÚb ‚¤\.ß;::zmÓÕ‹‚ X¬” »»» !jµZ-Œ¢èmÕ×®]WÉŸyæ™öž©µ&Š"®»îº¬s×]wqÑEÑÙÙI.—cëÖ­òšk®Ñ­Äu]vìØñ–µÅÍ›7ÿŸÕ·mÛÆÕW_Í~ðƒ63µx\)Åè記U«Vé|>Öš™™ªÕ*žçqûí·¿=µØJ‹æ¿¶•£Ö,]ºTµT™¿ý¥Ûƒ>ø¶ïýg ¸ÿßþ%Ûÿì„#¼€“IEND®B`‚enigmail-2.0.8/ui/skin/classic-seamonkey/images/enigsend-act.gif000066400000000000000000000007101334302754500246020ustar00rootroot00000000000000GIF89a¥dfd42œ42dœœÌÎÌΜdfÌÌÎÌËÍœÍÏ ÎУÒÔ¬„ƒ®dfeœšÌÌвÌÎÉËšËÍ›ÊÍdgËËÍÌÏ ÎѨÿÿÿ»»»ÇÊšceÇ— ÈÊ›333 ™ehgÌиÊÌ›œšËÌf¦SËÍÌÿÿÌÿÿfÿÌ™3dgeÌ™fËÍËÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ù ?,åÀŸpH€Pl:ŸPâ`@ˆ:‚¡pX…Xƒ@h÷ ÞÚnsp ÚxmÜ ®# e[ˆgH  nf]Sb •”  ?Hv†G`Œ’ !"E­#$bÇ%|s¿wÓ&ÞÞ'FD«¬v(&)*ì+,-dBHCv&).+.Þ/0LL† `Ï„ŠW˜xñÆ9VLìÛׯÉCX¼Ø¸1ʼ! ¿|üâŒd‘ ;enigmail-2.0.8/ui/skin/classic-seamonkey/images/enigsend-dis.gif000066400000000000000000000023231334302754500246140ustar00rootroot00000000000000GIF89a çëõþŠ—£‰˜£ÛâéuƒŽ˜¢¬›§² ª´£®¸¥°»©³½¬¶Á±»Å¸Ã̵ÀÊöýþ’Ÿ§¥³À¤¥ªºÆÐ›œ¡ããäÛÛݲ¾Éº¼À¿Áı²µÂÃÅÖÖØêëìÅÆÈ}‰yŠjmt‹’¾ÉÓ‘”šˆŠÑÒÔÁÌÖ¦¨­ryƒ†ˆŽ|ƒ–my…·¸»òóó®°±y{~¨ª­÷÷ùÊËÌ‚„‹npw•˜ÓÚáÝÞágjqýýýŽ•Ð׿ãæêåéí¡¢¥ƒ…Xbmáí÷êîñ‘“•Z]dîñól’ÔØÜ¹º¼š›ÅÐÙ­®²cem{~…ÍÓ×MQY‹‘šÏØß$)4co{ILUÅÏØÊÓÝgz†‹œª29ECHRž­º%X_i^r~“£±,1 image/svg+xml enigmail-2.0.8/ui/skin/images/attach-active-24.svg000066400000000000000000000106441334302754500216300ustar00rootroot00000000000000 image/svg+xml enigmail-2.0.8/ui/skin/images/attach-active-30.svg000066400000000000000000000106411334302754500216220ustar00rootroot00000000000000 image/svg+xml enigmail-2.0.8/ui/skin/images/attach-disabled-18.svg000066400000000000000000000065401334302754500221270ustar00rootroot00000000000000 image/svg+xml enigmail-2.0.8/ui/skin/images/attach-disabled-24.svg000066400000000000000000000065501334302754500221250ustar00rootroot00000000000000 image/svg+xml enigmail-2.0.8/ui/skin/images/attach-disabled-30.svg000066400000000000000000000065721334302754500221260ustar00rootroot00000000000000 image/svg+xml enigmail-2.0.8/ui/skin/images/attach-inactive-18.svg000066400000000000000000000065431334302754500221650ustar00rootroot00000000000000 image/svg+xml enigmail-2.0.8/ui/skin/images/attach-inactive-24.svg000066400000000000000000000065431334302754500221620ustar00rootroot00000000000000 image/svg+xml enigmail-2.0.8/ui/skin/images/attach-inactive-30.svg000066400000000000000000000065741334302754500221630ustar00rootroot00000000000000 image/svg+xml enigmail-2.0.8/ui/skin/images/check0.bmp000066400000000000000000000001521334302754500177750ustar00rootroot00000000000000BMj>( ,ÄÄÿÿÿÀÀÀÀÀÀÀÀÀenigmail-2.0.8/ui/skin/images/check0.png000066400000000000000000000002221334302754500200010ustar00rootroot00000000000000‰PNG  IHDR “båePLTEÿÿÿ¥ÙŸÝbKGDˆH pHYsÃÃÇo¨dtIMEÓ 0—·‘IDATxœc```¨?€10¸ 8±Ë[üIEND®B`‚enigmail-2.0.8/ui/skin/images/check1.bmp000066400000000000000000000001521334302754500177760ustar00rootroot00000000000000BMj>( ,ÄÄÿÿÿÀwÀcÀAÀHÀ\@~@@Àenigmail-2.0.8/ui/skin/images/check1.png000066400000000000000000000002471334302754500200110ustar00rootroot00000000000000‰PNG  IHDR “båePLTEÿÿÿ¥ÙŸÝbKGDˆH pHYsÃÃÇo¨dtIMEÓ þ/7{'IDATxœc```¨?ÀPïÀPçÀãÀàq€ÁñCò†ò q‹¶ûg&,IEND®B`‚enigmail-2.0.8/ui/skin/images/check2.bmp000066400000000000000000000007021334302754500200000ustar00rootroot00000000000000BMÂ6( Œ  ÿÿÿÿÿÿÿÿÿÿÿÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÿÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÿÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÿÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÿÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÿÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÿÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÿÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÿÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿenigmail-2.0.8/ui/skin/images/check2.png000066400000000000000000000002261334302754500200070ustar00rootroot00000000000000‰PNG  IHDR &ÎàqbKGDÿÿÿ ½§“ pHYs  d_‘tIMEÓ  ‡óß#IDATxœcüÏ@°00008€SÞÁ‰ #K#Á084|ç®¶IEND®B`‚enigmail-2.0.8/ui/skin/images/col-encrypted-signed.png000066400000000000000000000016561334302754500226770ustar00rootroot00000000000000‰PNG  IHDR x0}usRGB®ÎébKGDÿÿÿ ½§“ pHYs˜˜6ÓGßtIMEÛ ) (€¼.IDAT8Ë’]lSeÇÿïé¨;gkíi»Âi×éJ7ÜP6¶n $&’ˆYœ`â…ÄL41&Ì™@H7&˜x1Z5‘+…HL &€LMÌ¢nL7bëZÆú1úEÏ9ý8=¯W%Ãdü]=yóòËóα¥ Õœo¼Í+›?ÝDq¾êÈù¥ÕÇÞ ŒMìzoYaD’$cxx¸P}S=¹ªA dI.“ZüÜ–áîÊWed&2Ðf‹øÐh+lÑïu4·¾þo¡”¢÷ÒÊ~/ÓbkØÙTLjå2U¡jY7¯Pj‹©¸˜È%ÞYÜG¿%„ ±‘{Îïï8c’O~±Ç#¶ñVUé1¢¿]NþÞÿʧ%íÁ«Ó[ûýcôȺ„‚.AÔ$HºYa)Ù=wk&<(®©þ"·Û¼ú³ícÏ¿d4ÊYoÅâl6qV3îL'&Ãã?ï|áƒXâþŠ<µMµ1ÜÁf¡³ˆaÌ,Tn#^Y@RÃú˜Õ¼tôx\ 7Õ§‡ÓËå»3á_~%,š6ðgúv\ùãÄÆ½÷T( <*ß^ú·wÇþŒö§¢ÜL)‚RâPÇ=+[ÛÞ?;È2 ”‚âÿÒw¤œM]ß[È»ò…Ô)$þ¾¾ÉÓl÷ÚúHˆ1Í8ႃ4ÀNœà‰6ÆžqÀeZY‘õ‡I¶îŒÿ•>"ç¼GsÑHERŒ«eík„RŠ®ï„7]¬ç»¢®®¨•©Z*¡¬ª´¢V :$Q,ÜËd?J¤_V¼gY“¥Áès¶¬Ù%%Õõÿó+o¡½÷sIEND®B`‚enigmail-2.0.8/ui/skin/images/col-pEpGreen.svg000066400000000000000000000065051334302754500211510ustar00rootroot00000000000000 image/svg+xml enigmail-2.0.8/ui/skin/images/col-pEpRed.svg000066400000000000000000000046471334302754500206300ustar00rootroot00000000000000 image/svg+xml enigmail-2.0.8/ui/skin/images/col-pEpYellow.svg000066400000000000000000000046641334302754500213700ustar00rootroot00000000000000 image/svg+xml enigmail-2.0.8/ui/skin/images/decrypt-active-18.svg000066400000000000000000000126551334302754500220450ustar00rootroot00000000000000 image/svg+xml enigmail-2.0.8/ui/skin/images/decrypt-active-24.svg000066400000000000000000000225061334302754500220360ustar00rootroot00000000000000 image/svg+xml enigmail-2.0.8/ui/skin/images/decrypt-active-30.svg000066400000000000000000000225061334302754500220330ustar00rootroot00000000000000 image/svg+xml enigmail-2.0.8/ui/skin/images/decrypt-inactive-18.svg000066400000000000000000000126671334302754500223770ustar00rootroot00000000000000 image/svg+xml enigmail-2.0.8/ui/skin/images/decrypt-inactive-24.svg000066400000000000000000000264411334302754500223670ustar00rootroot00000000000000 image/svg+xml enigmail-2.0.8/ui/skin/images/decrypt-inactive-30.svg000066400000000000000000000264411334302754500223640ustar00rootroot00000000000000 image/svg+xml enigmail-2.0.8/ui/skin/images/encrypt-active-16.png000066400000000000000000000015541334302754500220360ustar00rootroot00000000000000‰PNG  IHDRóÿagAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<þIDATxÚTR]HSa~Î9;›Ó¹4u‰¡$FÉ´ß‹(°$œš¹ o ‚ºèÊ‹Œ »ê*è"bjtUW…^(*Ê6IE†Q›²¡ËL§ì÷ìœíüô#;è ßy¿ï}žó¼Ï÷Rªª‚¢(øý~}D"p:T[[›Š}±°°@ÍÎΪÝÝÝÐ0ún*ˆ¢·Û@ @°277Wg6›Ý4MK ÃLµ··Ç½^/ír¹BdSEZÌÏÏÓ„¨¼¶¶ö¥Ãá`YV'N¥Rà8n$“É<$µ¹ÞÞ^E«×°t‘iff†îééQl6Ûx}}ý@2™”Ãáð›h4ú.›ÍÂjµ%#˜(  K1†‡‡]¡PH]\\L’Ô ÷x<•>ŸO í©cccMû±zÑèè¨~Ï絞±²²ò„¤ÊÄÄ­­¡¡¡D,{AZC:¾¹ß\ÝD>×$©ž)ÝŠ¥ÝR7´óþþ~¥XøçŸºpÑŽÈz¢\Ë“+·šøí-ÚÂÛŽ×Õ­MB⃷ÒRNúDÎÚZÓÐÕ ~jäîž¾O:¶H°4ÙpïÄ™«ØF¨Ìy”†$Û±üýýƒ;«euä´Ë˜¹À"—üLŒsªˆëU°˜x­3ˆR!N~´ ˜›1½[ÒL.´v ‚|nÏíQ¸¸ÞœÀäÏû¨®dÑqì9DžGY%°“3!’¯“bVƒOU¡ƒµ%65ŸFËq3®[FLHÀ»cA¦À`zCEZ¡ŽÈ&YO(P‰çŠLvª‡Û‘]OãÕW¾q ¶þ}þy $°)ƒ ‡‚½‘– °%UpµúÐÈÉf¨Õ,¨ñ¿UˆÂ³´â[Rè)cnÑÛ›èµ`® ‹xAù"7i}NûX…’Øœe:_j9o-(—£ÉþESÓ÷C.>£ùÊIØíl Cƒ5)à3 D&’*, Yn)·m_ª{l‰‹ÓÞµùÀopÎgNñ¿C~v5íCIIEND®B`‚enigmail-2.0.8/ui/skin/images/encrypt-active-18.png000066400000000000000000000017521334302754500220400ustar00rootroot00000000000000‰PNG  IHDRVÎŽWgAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<|IDATxÚtTKlU=óóÌ8±ÛÄv ÁIPlŠPi$6 YBÙu ¢bÓUA‚ P%„XA7¨«.Ø€‰ ‰M‚% 9¥Eu-¢Ú­k×ñOþ{2ãÌŸ;C MHŸôfÞ̽ï¼{Îyï1®ëâ`«T*c½^ïE–eéÓu'311ñûÌÌŒŽ‡4æA MÓN§Oò<ÿA(ZEqÌ0 EUÕ›’$]]]½"ËòÃ(ëëëoÅb±O‰„ØétÐjµ`YFÆ€ª|#•J} ÷ñ£A©T:N+~4??/f³Ù.Uò-ò…„jµz’À^#záZ­öq±XücyyùÖ¡@™Læõ•••0¨‚ œY[[»È0Œ+—Ë—s¹Ü Òíüäääc[[[¯,--}8Š{õõz# /x4hÂf2™¼ø`Òìì,ˆòç…B!‰D@®‘û¨ù@“ÍfsŒ4@8ÎÏÍÍýOÌx<>$ñKT­§ÛôA·} à ˜Í¶†j­fK3³—(ÁEp¨¨.:Ý=p<¿ß5µŸM\ùæÔyE5Sã!Y4 «ðäs–Ëï¬92ïö-ùxìÇÄóŸ¾ ?uÇjí\:ÑÛ~/_xæpàÆa Nû ‹jpÍ>ò8Šù. žyóç»×ß§à ë8Œ ³{ †6„n Žû̶ý/(ý DÁ£Ë¨Ú ظwó OSÿwI|Çòjóå‚Òs =4UùFž9ÉGZˆ†t(]âiêrø²l@·­Ù‘±¬M‹ZÞÂä¶gèp׆h+¸[eœB`æ ‚’Œ¦"×ãüœ_"Ò}kÄù6õoyŽááŽþ‘£úÐ!H*Ç„64`+—q‡­ãB- Cw17lã»ÙK…È EÝ6_¥áU¾P¸Ùf¼‚ü ¡Ež…” i"~#zy{ íq(ã\!‚ì@@ˆcpìhòÜf{ûªDöôí0/`„¤›,ö˜ ’ "Ÿ-À°”k¾(ñkGÄõ¾ì§¾“ñôôé¯7Ûoÿ»!]°<϶8ˆÑ)¢N½yï{,FLœ=.á9hþ¤]K/EÆï‹ñß¡å*·JP:Ùï Óv°}mûÏ’ º>p¢ÛG/JoMA½YŽÑž¸ßþ`-éœÝ—û 2IEND®B`‚enigmail-2.0.8/ui/skin/images/encrypt-active-18.svg000066400000000000000000000321131334302754500220460ustar00rootroot00000000000000 image/svg+xml enigmail-2.0.8/ui/skin/images/encrypt-active-24.png000066400000000000000000000022441334302754500220320ustar00rootroot00000000000000‰PNG  IHDRàw=øgAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<6IDATxÚ´UKh\Uþîsnæ•83NRÓG,Bb‚õ… H*qD»šB"Å……;ºp¡ˆ&]ª !Ñwѵ¦A, ­i)M:É4™±ÓyÞyÜ;sï¹þ'™$3íL̦‡ùîsþóÿßþǹ‚ã8¸—CÄ=2‚°ç¦ÅÅÅz"0Â?„sCCCË{éñè›&óóó­÷{<žwý~ÿ)zC’$T«U”J% »R©|A˜$Ñ‘‘ÖŒ eˆÈÐ1MÓ&;;;O†Ãaضl6‹\.ÆÜn·¤(Êi2òí=ºgˆš òö#2<¤ªªFu2>G†È Bâç].×°×ëm#ù‹¦iÞ¢µ7šÙi¢ééé}}}߇B!¬­­¥Ö××_[Ø–ÏÌÌp…WÚÛÛ¿¾d2ÉÈÁñññ¿÷¢r¹<êóù@†X,v¦Þ84w?d2™ïÈ{ƒAÑ0ŒÑ}•éÄÄ„fYÖƒœ=Ng ?· c>ŸŸ-‹vGGˆàñ}P…ø¨2Úx2éØB©AжHÉæÉ÷ï+ɤ ðR¤ãï Õà2]×¹Îf…ýo’/Nã1æÈgòfø·'è3ʺ©Iñ˪dêÍ”+–毊‡õzýR*¹– xnEhùíÁ×iÚh|ƒáG‡í:ÔGBƒvÐOé!7<-ZµÁZÝlnAЈ]E|å·ã¯oôÇiñÂjCˆ˜E:ÔV~¬…U¥$¹ *MÃKûu0s ²Ì ª=¤Ûƒóú}Ý$ú”ðáÛ› ²º†¯˜€Š image/svg+xml enigmail-2.0.8/ui/skin/images/encrypt-active-30.png000066400000000000000000000023101334302754500220210ustar00rootroot00000000000000‰PNG  IHDR;0®¢gAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ZIDATxÚÄWohSW?¯IÚ&æIMe+­È쇊VfWWØ(ûºŠŽ CúaXl(ˆ•VðCe8Ôe” ~p'clƒv°ÎQæ2˜ BY»e-Zm+mš´M^þ¼¿ñœ×4É3ú^exápï=ïÜû»çï½Éårð2Z¼¤f6"‡ƒØDÚôJž=‰téûæææY½{1zL=::êÇîbuuõa·Û ØÃ0 Id³YH§ÓL&y” !õ¶´´°/ <22BÚýP[[ë Š¢& ‚‰DR©ÔÊ¿ÛÖÖöhÃÀCCCdÚp]]¯¦¦FˆÇã‹Å “É(2•••`³ÙÀd2,ˤ9°,;ŽŸšÛÛÛW6äcžç¿ ƒ>2ïòò2ÌÍÍÁÂÂÂ/øéÒ}ÂÍûû¨ÃáØår¹Àjµ’ö x€Ï‘İƃƒƒý~ÿÍúúzEÓH$óóóÇ;::B²&ì.9În¯× 055%!¯åÇ ¥M§Çã!­Ðééé«Z Ô/!GküŒf³Ù ¸Ö„{6œÇǰÛíÔ°„}Ïó"eú, ÓüCÀ¡Pȇ.°Rº,--Ñã]]]QÀ·£Ñh†üó톀ÑD>¥È%Óaž&ô…îîn eã´–´Æ±ÕPTãI)X”Ô ÂüÔ]ZQ>GqAyM‡6 ¬„52Ì¥ÈÜthÝétçæ¹®šå˜u5–1ûßê+[˜³õñ! ‹*Þ½_û`Ç…kÓýH[5s?)‚‹žÐñ¦.`‘ có…yU ¯°'¶÷‘¾Dú³XÔð9–e‹MŸŸ¹Œ„‡ÔÜóÒ5: Òã2`I8…1âp®èN%dØô ðY%«ò ÔX]ÀifEà/n}¨ú~ìÀ@‰¬:6W8n¤4t•°íeÀäÏò[ 5®RçdïÇoÍ;ñia<ë×^›€Y¹úÙ-wêÒ˜ç0ZeNÅ;÷ÙïJúíóPš'Ù±‰„¾L–…ÒåÀ (šL«y=íSú廫óEÁ Wg·@šÍÁE˜Sx×x!+J¥ËbtwÓ‹F0il·W©xç/ÿ±šßpö6 À•xœ±(ÚO²qe|FUQFiщ4\( ôp[kßÕÎ™Š›ô~ÒZÿù NÞÚZ,4ô0xäA`Ä|±bVù'Ö@5+—–ÉÔ,o/ÌÙ±£…qm†Ö ü¶h*ð†Ÿ¸Të÷r1Wy¯¯[25Ñü›\nͼݎýøø|(Aè_8t© -ØäßûÇÿ!àõïc­Ê%ðdjçºôÞknèyÝ æ’KÇi‘àÔîF0 ²öí”÷1ÙÊûõ ˜‘[è¾Í Û•‚­‰ØÃ.*ãÎ+ð*vñ†þ¶˜2Ü—È?[7ü_µíô¶“f›yçÌÍ™’'S%ù«¤:‚¯<`7ó#Ž˜¹3IEND®B`‚enigmail-2.0.8/ui/skin/images/encrypt-active-30.svg000066400000000000000000000321131334302754500220400ustar00rootroot00000000000000 image/svg+xml enigmail-2.0.8/ui/skin/images/encrypt-active-force-16.png000066400000000000000000000015541334302754500231320ustar00rootroot00000000000000‰PNG  IHDRóÿagAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<þIDATxÚTR]HSa~Î9;›Ó¹4u‰¡$FÉ´ß‹(°$œš¹ o ‚ºèÊ‹Œ »ê*è"bjtUW…^(*Ê6IE†Q›²¡ËL§ì÷ìœíüô#;è ßy¿ï}žó¼Ï÷Rªª‚¢(øý~}D"p:T[[›Š}±°°@ÍÎΪÝÝÝÐ0ún*ˆ¢·Û@ @°277Wg6›Ý4MK ÃLµ··Ç½^/ír¹BdSEZÌÏÏÓ„¨¼¶¶ö¥Ãá`YV'N¥Rà8n$“É<$µ¹ÞÞ^E«×°t‘iff†îééQl6Ûx}}ý@2™”Ãáð›h4ú.›ÍÂjµ%#˜(  K1†‡‡]¡PH]\\L’Ô ÷x<•>ŸO í©cccMû±zÑèè¨~Ï絞±²²ò„¤ÊÄÄ­­¡¡¡D,{AZC:¾¹ß\ÝD>×$©ž)ÝŠ¥ÝR7´óþþ~¥XøçŸºpÑŽÈz¢\Ë“+·šøí-ÚÂÛŽ×Õ­MB⃷ÒRNúDÎÚZÓÐÕ ~jäîž¾O:¶H°4ÙpïÄ™«ØF¨Ìy”†$Û±üýýƒ;«euä´Ë˜¹À"—üLŒsªˆëU°˜x­3ˆR!N~´ ˜›1½[ÒL.´v ‚|nÏíQ¸¸ÞœÀäÏû¨®dÑqì9DžGY%°“3!’¯“bVƒOU¡ƒµ%65ŸFËq3®[FLHÀ»cA¦À`zCEZ¡ŽÈ&YO(P‰çŠLvª‡Û‘]OãÕW¾q ¶þ}þy $°)ƒ ‡‚½‘– °%UpµúÐÈÉf¨Õ,¨ñ¿UˆÂ³´â[Rè)cnÑÛ›èµ`® ‹xAù"7i}NûX…’Øœe:_j9o-(—£ÉþESÓ÷C.>£ùÊIØíl Cƒ5)à3 D&’*, Yn)·m_ª{l‰‹ÓÞµùÀopÎgNñ¿C~v5íCIIEND®B`‚enigmail-2.0.8/ui/skin/images/encrypt-active-force-18.png000066400000000000000000000017521334302754500231340ustar00rootroot00000000000000‰PNG  IHDRVÎŽWgAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<|IDATxÚtTKlU=óóÌ8±ÛÄv ÁIPlŠPi$6 YBÙu ¢bÓUA‚ P%„XA7¨«.Ø€‰ ‰M‚% 9¥Eu-¢Ú­k×ñOþ{2ãÌŸ;C MHŸôfÞ̽ï¼{Îyï1®ëâ`«T*c½^ïE–eéÓu'311ñûÌÌŒŽ‡4æA MÓN§Oò<ÿA(ZEqÌ0 EUÕ›’$]]]½"ËòÃ(ëëëoÅb±O‰„ØétÐjµ`YFÆ€ª|#•J} ÷ñ£A©T:N+~4??/f³Ù.Uò-ò…„jµz’À^#záZ­öq±XücyyùÖ¡@™Læõ•••0¨‚ œY[[»È0Œ+—Ë—s¹Ü Òíüäääc[[[¯,--}8Š{õõz# /x4hÂf2™¼ø`Òìì,ˆòç…B!‰D@®‘û¨ù@“ÍfsŒ4@8ÎÏÍÍýOÌx<>$ñKT­§ÛôA·} à ˜Í¶†j­fK3³—(ÁEp¨¨.:Ý=p<¿ß5µŸM\ùæÔyE5Sã!Y4 «ðäs–Ëï¬92ïö-ùxìÇÄóŸ¾ ?uÇjí\:ÑÛ~/_xæpàÆa Nû ‹jpÍ>ò8Šù. žyóç»×ß§à ë8Œ ³{ †6„n Žû̶ý/(ý DÁ£Ë¨Ú ظwó OSÿwI|Çòjóå‚Òs =4UùFž9ÉGZˆ†t(]âiêrø²l@·­Ù‘±¬M‹ZÞÂä¶gèp׆h+¸[eœB`æ ‚’Œ¦"×ãüœ_"Ò}kÄù6õoyŽááŽþ‘£úÐ!H*Ç„64`+—q‡­ãB- Cw17lã»ÙK…È EÝ6_¥áU¾P¸Ùf¼‚ü ¡Ež…” i"~#zy{ íq(ã\!‚ì@@ˆcpìhòÜf{ûªDöôí0/`„¤›,ö˜ ’ "Ÿ-À°”k¾(ñkGÄõ¾ì§¾“ñôôé¯7Ûoÿ»!]°<϶8ˆÑ)¢N½yï{,FLœ=.á9hþ¤]K/EÆï‹ñß¡å*·JP:Ùï Óv°}mûÏ’ º>p¢ÛG/JoMA½YŽÑž¸ßþ`-éœÝ—û 2IEND®B`‚enigmail-2.0.8/ui/skin/images/encrypt-active-force-24.png000066400000000000000000000022441334302754500231260ustar00rootroot00000000000000‰PNG  IHDRàw=øgAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<6IDATxÚ´UKh\Uþîsnæ•83NRÓG,Bb‚õ… H*qD»šB"Å……;ºp¡ˆ&]ª !Ñwѵ¦A, ­i)M:É4™±ÓyÞyÜ;sï¹þ'™$3íL̦‡ùîsþóÿßþǹ‚ã8¸—CÄ=2‚°ç¦ÅÅÅz"0Â?„sCCCË{éñè›&óóó­÷{<žwý~ÿ)zC’$T«U”J% »R©|A˜$Ñ‘‘ÖŒ eˆÈÐ1MÓ&;;;O†Ãaضl6‹\.ÆÜn·¤(Êi2òí=ºgˆš òö#2<¤ªªFu2>G†È Bâç].×°×ëm#ù‹¦iÞ¢µ7šÙi¢ééé}}}߇B!¬­­¥Ö××_[Ø–ÏÌÌp…WÚÛÛ¿¾d2ÉÈÁñññ¿÷¢r¹<êóù@†X,v¦Þ84w?d2™ïÈ{ƒAÑ0ŒÑ}•éÄÄ„fYÖƒœ=Ng ?· c>ŸŸ-‹vGGˆàñ}P…ø¨2Úx2éØB©AжHÉæÉ÷ï+ɤ ðR¤ãï Õà2]×¹Îf…ýo’/Nã1æÈgòfø·'è3ʺ©Iñ˪dêÍ”+–毊‡õzýR*¹– xnEhùíÁ×iÚh|ƒáG‡í:ÔGBƒvÐOé!7<-ZµÁZÝlnAЈ]E|å·ã¯oôÇiñÂjCˆ˜E:ÔV~¬…U¥$¹ *MÃKûu0s ²Ì ª=¤Ûƒóú}Ý$ú”ðáÛ› ²º†¯˜€Š2ïòò2ÌÍÍÁÂÂÂ/øéÒ}ÂÍûû¨ÃáØår¹Àjµ’ö x€Ï‘İƃƒƒý~ÿÍúúzEÓH$óóóÇ;::B²&ì.9În¯× 055%!¯åÇ ¥M§Çã!­Ðééé«Z Ô/!GküŒf³Ù ¸Ö„{6œÇǰÛíÔ°„}Ïó"eú, ÓüCÀ¡Pȇ.°Rº,--Ñã]]]QÀ·£Ñh†üó톀ÑD>¥È%Óaž&ô…îîn eã´–´Æ±ÕPTãI)X”Ô ÂüÔ]ZQ>GqAyM‡6 ¬„52Ì¥ÈÜthÝétçæ¹®šå˜u5–1ûßê+[˜³õñ! ‹*Þ½_û`Ç…kÓýH[5s?)‚‹žÐñ¦.`‘ có…yU ¯°'¶÷‘¾Dú³XÔð9–e‹MŸŸ¹Œ„‡ÔÜóÒ5: Òã2`I8…1âp®èN%dØô ðY%«ò ÔX]ÀifEà/n}¨ú~ìÀ@‰¬:6W8n¤4t•°íeÀäÏò[ 5®RçdïÇoÍ;ñia<ë×^›€Y¹úÙ-wêÒ˜ç0ZeNÅ;÷ÙïJúíóPš'Ù±‰„¾L–…ÒåÀ (šL«y=íSú廫óEÁ Wg·@šÍÁE˜Sx×x!+J¥ËbtwÓ‹F0il·W©xç/ÿ±šßpö6 À•xœ±(ÚO²qe|FUQFiщ4\( ôp[kßÕÎ™Š›ô~ÒZÿù NÞÚZ,4ô0xäA`Ä|±bVù'Ö@5+—–ÉÔ,o/ÌÙ±£…qm†Ö ü¶h*ð†Ÿ¸Të÷r1Wy¯¯[25Ñü›\nͼݎýøø|(Aè_8t© -ØäßûÇÿ!àõïc­Ê%ðdjçºôÞknèyÝ æ’KÇi‘àÔîF0 ²öí”÷1ÙÊûõ ˜‘[è¾Í Û•‚­‰ØÃ.*ãÎ+ð*vñ†þ¶˜2Ü—È?[7ü_µíô¶“f›yçÌÍ™’'S%ù«¤:‚¯<`7ó#Ž˜¹3IEND®B`‚enigmail-2.0.8/ui/skin/images/encrypt-disabled-16.png000066400000000000000000000014641334302754500223320ustar00rootroot00000000000000‰PNG  IHDRóÿabKGDÿÿÿ ½§“ pHYs  šœtIMEÞ *>c§WÁIDAT8Ëm’ÍKkWÅçä&áÆn[‘Pñ„¤Ž«g­I§Âk”Bë Gö?("<Óá{£÷h†Åø q(UH©j4÷Þ$zîͽ§ƒ|¼<è8{¯½ÖÚ[ÐÅÁÁBªÕ*333bqqQ3€r¹,ŠÅ¢Îf³h­YZZâ#‹EJ¥’ØÙÙùüððð—£££ŸÊåò§{{{r°@ ’ìîîJ¥Ôp:þsttôE4E)…mÛ4—®ëþ&„xÎåra¯GöÛÛÛryy9L&“¿¨×ëA¥Ry}uuõ¶Ùlb𿝑Häe.— ‹Å¢àÿ°¹¹ùíùù¹>>>®’oll|²¿¿ÿT*•t>ŸŸì‘[[[xž÷”’‹‹‹ß°P(ÈB¡ ×××oooÿH§Ó8Žóà à8Ž´ïû‰Z­†mÛÿ¬¬¬ô½ÖëõóD"ÁÍÍÍ0@ýâG¬/^!Þ¿¯¿‡µµµE¥Ô«‰‰‰éJ¥²‹Åþé'-ívûËÙÙÙoNOOÏ,Ëú9ŸÏ¿{ÿŒ¶×)²,ë«L&3íû> Ù¡¡¡ì ÔV«Åãã#SSS3'''sÀ»¶F >L¹¼¼äþþÓ4I¥Rh­ÑZ#¥Äu]Z­###ÑYB @ªçAH)ûÓÈd2ÌÍÍá8Íf³“º”A€zÃ{ê„a'/­5žç¡uç’¯¯¯QJáû>Ñhô£Zï ¤j}PГl–e066F2™$‰ôÿû Z`xªOv½†a`š&ggg$ \×%„‘°+Ám€1‘‚ÕÕUY«Õd<÷mÛ~ŠÅb†Bwm ×uñ¯Èf³oÌ&þ~uvvv¿™¶ ‹r¹,mll¼ÛÚÚú¶»»[bííí¯'‰ÔæææËJ¥òP©T’"‘ÈûT*uY, ƒ)N‹àúE4ÕbÃ;A¹\N™L&/øX´¶¶ö+ŒÅb¯9Þø|>o(*ê÷ûó¬}r'(|><<$†•Ö××ÕÕjU®žžJ ׇÃá?|DZXXøP_—A…BáÞòòò÷ýý}r:_NNNnµžÉdÌÎÎ~ÝÙÙ!Ö¦onnnƒVVVÍÍÍxWZ\\ô4æùù¹är¹B| èèøúúº)è¡Ýn/ðñèÿîºb¯×ëÛÞÞF×Ç·fÄÃ}Üßßëîî¾4Ô××÷ƒ» 6 ƒÁðÓjµBSžœœ Â+ƒø<³ÙlĻπÜn7f@KKK œÇãh„Wñ•d2™¨³³“ôz=a=>>ÞÈq'B-ÖðÖw¤„phhˆt:uuuÑÈÈ “Åb&ÔC ¬áWñ-(yÐ2H«ÕÒÀÀ€èÌápP0¤±±1Ñ j5<ðÊ ~;  öövêíí¥žžš™™oäP«Á+ƒø¿ÓR«ÕÄ·Hƒƒƒ¢£ùùyÑ!r¨Õƒà=::’®®®$I¡P(ù*ÅLø P[[™Íf1ÌÕÕUøF5h …^‰ü¶$©¥¥åéôô4ŽŽŠ#h4šššÃÄløF5h …^ÔÚÚúçïèè;ªT*â‡'†[È¡ ´ð°÷E ôÿÿè_F%šòfäIEND®B`‚enigmail-2.0.8/ui/skin/images/encrypt-disabled-18.svg000066400000000000000000000330321334302754500223430ustar00rootroot00000000000000 image/svg+xml enigmail-2.0.8/ui/skin/images/encrypt-disabled-24.png000066400000000000000000000011511334302754500223220ustar00rootroot00000000000000‰PNG  IHDRJ~õsbKGDÿ‡Ì¿ pHYs  šœtIMEÕ $èé#úIDATxÚµ“»oÓP‡?Ûq⼪@ L ñ˜Šx©R:0tê 101!þv´3HABbAª€­°0 …UT­Xh›8q~ÜCLj§† oçø~>ßÏGþ÷cm}ºÈ"P|åÃüÖ?÷–1[~8s§ŒEľ Ÿ†+z{Qž1“@tÙY9u»Ä¥‹¢dÙ÷õãè\òL.YXóykÛs×Ôº¶¹YX¨ó·‚_ÜËŒórù‹ÞÑ÷[7ÆuËh-¯õ>ë·òÅ\¦Òh©ÊO½»Ú\×MÝ|ÝyP7ý¥ à™#ÎjÚnû]rjïÍ@Öð¯eÃjXìâöÝa88 lº3¡GFD‡T®#Ü£{x~U¯†—ÊÕQ`nZÞák1c]©X{niƒw7DíüõÓ(t!?—\&ÌÚîÂV-¥$Q´ ˆ(a'Á2A Ó›$Œ;‘¢ø ‚; )pŒ’ ‰¦'ÈXÍÆÆä$ ªô‰PÓ@+ | u*ì~¬¢¦•¸!(Râ8?€:'øq?œVR5Íf>äß&ü$6’.vœm0ú9‡'u§zxìQÀ¥gc¢Æ€Iù›ç?ÑfÖ GoJøîQe€00&€…5±ÐñTh$ê7³§×H­êmFIEND®B`‚enigmail-2.0.8/ui/skin/images/encrypt-disabled-24.svg000066400000000000000000000330321334302754500223400ustar00rootroot00000000000000 image/svg+xml enigmail-2.0.8/ui/skin/images/encrypt-disabled-30.png000066400000000000000000000017001334302754500223170ustar00rootroot00000000000000‰PNG  IHDR;0®¢bKGDùC» pHYs  šœtIMEÞ %þuž‡MIDATHÇÅ—ÏK#gÇ?“IÂ4!Q!R¤ b±§îe^„’C‘ž<ŒºX/EOîPèµ—B¡žÄ“H–^¤Ð\„Åsaa¡R¨`Ä_yÇɼïä·—Mlv3‰,ûÂòæ™çÃóý>ïó2–1†±|¤•ì'øôôtXžŸ¼Ýþ xü:77÷OÜ\V©ONNŠÀŽã¼Èçó8ŽƒeYh­ ‚ß÷B(` ø~~~Þ{2¸\.?~›œœ,NLLÐl6»>aR¯×¹¿¿ |]*•þ|||< œÎÌÌŒÑl6¹¾¾æêêŠF£@:&“É`Û6Q!„Àó¼7ÀÜÂÂÂÝ@+¥v§§§Çóù<···œŸŸS«Õþ~þÒoýþvddä‹\.ÇÐÐa~.„øXë»âÃÃÃ¥b±x0;;K³Ù¤R©pqqñÒuÝ­.±6ðS6›Ý%‘Hpvv¦g®ë¾îë8AðM¡P@)E¥R¡Z­nwƒ¸®«]×}Y«Õ~÷ image/svg+xml enigmail-2.0.8/ui/skin/images/encrypt-inactive-16.png000066400000000000000000000014721334302754500223640ustar00rootroot00000000000000‰PNG  IHDRóÿagAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ÌIDATxÚlS_HSa?÷ÛŸ»©mÃQáÈRôIX=„ ”°5=DFø ÒK½ÔrcBb)A¢D½,’ÈžzðEF¶ž\=ý“(PhæÖnwwwÛ½óÑÆ:pøîw¾óç÷;ç\A×uâñ8?×××!•J :d||\PUU@1~¿ŸŸæšC©T‚`0cccljjJ‹D"³ÙĤÆØ«ÉÉÉl4e>ŸO[ZZª'jH0ˆU*•CN§ó‘ÃáÄP.—¡X,‚¢(s¨QtSfff4ò§XVË4::ʦ§§5›ÍöÒívʲ\ÝÞÞ~šÉd^:«Õz ÍQp8þ‹`xxØçõzãûûû9ìA3šx¥¡¡!ðx<€T`kk b±@0??Ï Ÿ8“Ó …BŒtaaöööÀårq:FáML$A¯V« ù|žœ~“}vvV«9"%¢’$ñ»ôãêA }}}gA ùwììì,c¿+ÙÔò©£­ÇÎÿL¥Ö¯={H¢ùD}Œh<ÝÞÞÞ( ³³3 ŠbÀÐ(hý¶ù¢®îî®n4o¢^7«¤Ói ‹ìv{½Qî‚ —Þ¼ÅÄàCƒšTÕ‚OwQGê 4Mã]&Áã÷~/.‚l2“wd²pæó— hö£>¯ïUªØ ¾@$Éd$L¼ÜvÈãJò=tífÎáçcÔ3" `RVÞp{OOàr‚´¾5 ‰"Mé&jÖHAû·PU¢B}XYYáo'w3Âůk,'ŠPÂd-’Ô‚æ{¨y‚ÞÞ^†ÍcTÆyé …B󺼚tØÊý¾·K–].ë­Õw›‡KjŸÚj{`Åù;0A"Áq ¨fD£}Lg?¥M¦'ýGÜèýöŸœ³_)à(~ý`E›VŠu¾IEND®B`‚enigmail-2.0.8/ui/skin/images/encrypt-inactive-18.png000066400000000000000000000016021334302754500223610ustar00rootroot00000000000000‰PNG  IHDRVÎŽWgAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<IDATxÚtT[H“a~·ÿŸ››¶óll2¬.‚&x(z×AÐU7Yv!ƒ±Jðz%]xSÔUÝv€ìªº ¤ÒsLm¹“º£ÿÜÜ©çýq±M}áÛÿoïû=ßó>ÏûMQ­V©9&&&t{{{ …¢_QRý¦Õj?ú|¾Šz \.GgX„‡jµº[E]¹\¦|>Ÿ- ßU*•offæCkkëñ@’$Ñèèèݶ¶¶Y‹Å¢fPþ ×d³Ù XÞž››{†Gy½^w*•zo·ÛOÄb±$ž ÷)@‡[ZZn€‰.“Él:Ž¡éééßõ@bí%8ΑHDBk·æççpºœ …Boü~ÿ@ˆÛŠF£,ÕòJþ˜šš*•J?·Ç?-Ô¹\.²Z­ Él6´#Ô7´&Óîî®F£Yíìì<$&Ø õ*•JÔì¶òàY„ݲ¸p¨x”½&“‰ª¤¥¬T¥D2O‚(6Š™9½¸¸ø¨X,á45(áÚÒQ`R<Þ§ÔjR>Ÿ3 ¯Ýn·çæýñRF-™u:Ýe½^OûûûÜêj1€mßÖ6­ ´ÜuJ ‡¯`ï,RW±.2¿ ‹•Ü;€±9¿ñ‡úù©Ãh¤/= Ðjøå«A¤ÆyDÄæ ,$²ƒ5`8­Tò‰d…–f¬öL–\ë÷°E5)raÍ~2[ËâC+â–·¶¶hÅh ¯X’)º¶ò“:¤ 岯&OÑÀˆjàÌ(‘HÈO uï:lÄÓsv{‡Ú¡ç¦Ë9‰¯° J.¬ÚÄr; image/svg+xml enigmail-2.0.8/ui/skin/images/encrypt-inactive-24.png000066400000000000000000000021611334302754500223570ustar00rootroot00000000000000‰PNG  IHDRàw=øgAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<IDATxÚ´U]hSg~ÏÉÏIÒœœÀ0û1¶ZÊRü)¥+*ƒ^¸T)^L/¼’2†ÃRð¢‚Ô‹ÑQÿЫ±é7Sa°)æO,u«©JìÖ&Î Mks’49MÎÙórJš&]o|á=ßwÎ÷}ïsÞçýùÃ0è}ŠHïYìüaÝMÃÃÃ;0| mêÐgÐßþYï³#˜CCC6 Û].×IÇs #‰¢HÅb‘ …åóùæ—–——/c_lppP¯P—"ns:—ý~ÿQEQH×uÊf³”Ëå̃’$Ù ß`ëyìm^—¢šÁų0¾×áp؉„ ã·rKè>|ï†Wn»Ý~^$ðíx-;5)êïï? oú|>J&“)ÈWˆÃ}kÜóC W½^¯œN§õL&óùÈÈÈĆ(Ò4í Ûí&6æçç¯T/Ý€Þ‚Qþ^eÙ†qbCiÚ××ç*•JÛxïTU­G#ǃOø§6V8 #hn(2sõn &؆‚Œ§"l¯h=áµ¥¥%¤Þ¾UA‡Ãí˜_AúíBîË8X€ë“Ø£Ö:ì0 EòxÚ ¶………wȲ'øüíµÑ;<¡©jü{!ü.ßN¦ ZäTŠB‘1JåÉ–2š›ýHçîx<îÇr/ôô޽:­XfggM—ùµ@(¸5Ýþ¤iÁã¦1tÅÍ› µAáØ«&,Ÿ‚†Ø‹5•Ý•«éW“[xgñå ôò`s/£7ÿºlœ ý¼ € VpvXõôô¬¬E£/ Ü‘„„ø4‘$õÃíü„Më*7Ä ÐsÿëõnÑh”PÊ6ÑäÇQ翯©Úšœ§Àâ"é‚P ã{lýš«=¨ä`3MÖZ("T7ey÷š)Þ½ ‹gPýÏü w×3l|M¡±‘J@ÊšAFÏ1¿÷(óö¹9r"KÒø=°énÆ5 ­úúd0¾8ÜXºººÈ *çÎSçô ðdN–)€ªþäí[:¦ªØöY`q^Ù]9õÐûù‚¡H$BJ&K_<}jg¹»%H[Cž‰ÑgSº_>_‡^‚þX À-ÂÎYÃÍåÏܳV6²öç/¨d™sck%'ý²s;-—Š´{:Æ4p-œ†ŽÙ+š^_,¹/øÝt-{mG¦göÙKz«& Ú¨ä¼SÓq1›)½á{Sö:¼’”o-Úpø/Ÿ²z‘P¾©¬  @em±> Û4™^ø4s’ô~%C+Õ Ó?‘èAyæ’ ý'À·'®IEND®B`‚enigmail-2.0.8/ui/skin/images/encrypt-inactive-24.svg000066400000000000000000000353111334302754500223750ustar00rootroot00000000000000 image/svg+xml enigmail-2.0.8/ui/skin/images/encrypt-inactive-30.png000066400000000000000000000024301334302754500223530ustar00rootroot00000000000000‰PNG  IHDR;0®¢gAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ªIDATxÚÄW]L›U~¿þ@ÿh;JÂV.¶ù[ Ëâ(3™²«i¼0è25‘ãa7r!LH¸ 1‘D£w,!^,êv¡&’¸¸e° ³2X”mZZ~Z m -”ú¼§ýXi?ÊW¼Ø›<9_ÏùÎ÷¼ÿçTÊd2ô4DCOItå¼ÜÛÛ{ ÃàИ›žn?õõõÔ~KRãêžžžz ƒ˜L&Òëõ$ImooÓææ&¥R)Z__Oá!à‹þþþøÿ&îîîfë®8Žz»ÝNétZòXø rJ&“>¼ÿÖÀÀÀ쉻ººØµ7].—Ób±’x<.À–²hµZª¬¬$F#Ö766SX:=88¸v ÊẺ:'»7‘HÐêê*E£Ñß±4üTp¼¡ÈGƒ¡Ùh4ÂÁû^ù×Xë(ÛâÎÎÎ 6›í‡††aI0dÒ‹C…wµ¾q'{†ã¿¸¸˜ÆÜ ¼î+«œàÊù#[[[‚4§DÊ‚é4pŠI°T‚û%³Ù¬Ã7|e×16åØ1q(Jã÷çûe*Çä"œªcÜÑÑáÔétFv1ÇäSÃÃÃKû³’±XL$Ç›—e14uÊ5ÊYŠ:ªi PNÔ4ïe«ù¹,‹AÈÉ"ê’‰1ªn­¼‡-…ÇÄÞ²ˆy£Üd¨•œ‡„»K•S[[ÛŽ+)ÃqËÐ6JIé#×®³ml+²˜imm-ÚÈM¤”T‡È‰Ð\M Å,æ]kccc<Þ8I¯*³LNNîš«­­Ý“Ô½¸D§nß¡jdôM4œ+ϧ¤N¤ y<2eËêKà<À‰ªUu,r––*á^ZÏÇÃaªJ5ظ³~Þ€¼ŸË)=»|O‹ “­T3Håí±#¡lÉ Z6e‰Ÿ›¼GÞ¹@~"?«"æ ÏÏÐööö]ëwßS9à@³±&St,²Bm6ze>H¯Î< ó¥¯óI ‘D¬ö:.ƒ\»:ì;9~‹ÞuâW¹æAeÅ8_p»X^X £·'èéiAÊrñ¼ô²‡ÁR#’ì<’ ò p†u-+Æ|¾ÊQ4†7a©a3ç¿\tÉYC䪧5\"Þ»7Eî5\ ²ßävé>ã:Vm1»ºͳsdÉÕw¤ªŠþ8ÑL!}Ö–™êC4ây‘üMîüO=ËúZÌ.pˆÖ2:ZDîó_ŸÎ-eCƪþjµÐ/ !ñW¥ìÈÙŽù×]ôv x >ÑùĆ\𥉉‰¦ÜµußÃ?Cš3q’>NÍ¡;ÿ¼ì$óGÒ?×C¢äo”Y™‡ÿ 0%€µ ¦”nIEND®B`‚enigmail-2.0.8/ui/skin/images/encrypt-inactive-30.svg000066400000000000000000000353111334302754500223720ustar00rootroot00000000000000 image/svg+xml enigmail-2.0.8/ui/skin/images/encrypt-inactive-force-16.png000066400000000000000000000014721334302754500234600ustar00rootroot00000000000000‰PNG  IHDRóÿagAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ÌIDATxÚlS_HSa?÷ÛŸ»©mÃQáÈRôIX=„ ”°5=DFø ÒK½ÔrcBb)A¢D½,’ÈžzðEF¶ž\=ý“(PhæÖnwwwÛ½óÑÆ:pøîw¾óç÷;ç\A×uâñ8?×××!•J :d||\PUU@1~¿ŸŸæšC©T‚`0cccljjJ‹D"³ÙĤÆØ«ÉÉÉl4e>ŸO[ZZª'jH0ˆU*•CN§ó‘ÃáÄP.—¡X,‚¢(s¨QtSfff4ò§XVË4::ʦ§§5›ÍöÒívʲ\ÝÞÞ~šÉd^:«Õz ÍQp8þ‹`xxØçõzãûûû9ìA3šx¥¡¡!ðx<€T`kk b±@0??Ï Ÿ8“Ó …BŒtaaöööÀårq:FáML$A¯V« ù|žœ~“}vvV«9"%¢’$ñ»ôãêA }}}gA ùwììì,c¿+ÙÔò©£­ÇÎÿL¥Ö¯={H¢ùD}Œh<ÝÞÞÞ( ³³3 ŠbÀÐ(hý¶ù¢®îî®n4o¢^7«¤Ói ‹ìv{½Qî‚ —Þ¼ÅÄàCƒšTÕ‚OwQGê 4Mã]&Áã÷~/.‚l2“wd²pæó— hö£>¯ïUªØ ¾@$Éd$L¼ÜvÈãJò=tífÎáçcÔ3" `RVÞp{OOàr‚´¾5 ‰"Mé&jÖHAû·PU¢B}XYYáo'w3Âůk,'ŠPÂd-’Ô‚æ{¨y‚ÞÞ^†ÍcTÆyé …B󺼚tØÊý¾·K–].ë­Õw›‡KjŸÚj{`Åù;0A"Áq ¨fD£}Lg?¥M¦'ýGÜèýöŸœ³_)à(~ý`E›VŠu¾IEND®B`‚enigmail-2.0.8/ui/skin/images/encrypt-inactive-force-18.png000066400000000000000000000016021334302754500234550ustar00rootroot00000000000000‰PNG  IHDRVÎŽWgAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<IDATxÚtT[H“a~·ÿŸ››¶óll2¬.‚&x(z×AÐU7Yv!ƒ±Jðz%]xSÔUÝv€ìªº ¤ÒsLm¹“º£ÿÜÜ©çýq±M}áÛÿoïû=ßó>ÏûMQ­V©9&&&t{{{ …¢_QRý¦Õj?ú|¾Šz \.GgX„‡jµº[E]¹\¦|>Ÿ- ßU*•offæCkkëñ@’$Ñèèèݶ¶¶Y‹Å¢fPþ ×d³Ù XÞž››{†Gy½^w*•zo·ÛOÄb±$ž ÷)@‡[ZZn€‰.“Él:Ž¡éééßõ@bí%8ΑHDBk·æççpºœ …Boü~ÿ@ˆÛŠF£,ÕòJþ˜šš*•J?·Ç?-Ô¹\.²Z­ Él6´#Ô7´&Óîî®F£Yíìì<$&Ø õ*•JÔì¶òàY„ݲ¸p¨x”½&“‰ª¤¥¬T¥D2O‚(6Š™9½¸¸ø¨X,á45(áÚÒQ`R<Þ§ÔjR>Ÿ3 ¯Ýn·çæýñRF-™u:Ýe½^OûûûÜêj1€mßÖ6­ ´ÜuJ ‡¯`ï,RW±.2¿ ‹•Ü;€±9¿ñ‡úù©Ãh¤/= Ðjøå«A¤ÆyDÄæ ,$²ƒ5`8­Tò‰d…–f¬öL–\ë÷°E5)raÍ~2[ËâC+â–·¶¶hÅh ¯X’)º¶ò“:¤ 岯&OÑÀˆjàÌ(‘HÈO uï:lÄÓsv{‡Ú¡ç¦Ë9‰¯° J.¬ÚÄr;|ï†Wn»Ý~^$ðíx-;5)êïï? oú|>J&“)ÈWˆÃ}kÜóC W½^¯œN§õL&óùÈÈÈĆ(Ò4í Ûí&6æçç¯T/Ý€Þ‚Qþ^eÙ†qbCiÚ××ç*•JÛxïTU­G#ǃOø§6V8 #hn(2sõn &؆‚Œ§"l¯h=áµ¥¥%¤Þ¾UA‡Ãí˜_AúíBîË8X€ë“Ø£Ö:ì0 EòxÚ ¶………wȲ'øüíµÑ;<¡©jü{!ü.ßN¦ ZäTŠB‘1JåÉ–2š›ýHçîx<îÇr/ôô޽:­XfggM—ùµ@(¸5Ýþ¤iÁã¦1tÅÍ› µAáØ«&,Ÿ‚†Ø‹5•Ý•«éW“[xgñå ôò`s/£7ÿºlœ ý¼ € VpvXõôô¬¬E£/ Ü‘„„ø4‘$õÃíü„Më*7Ä ÐsÿëõnÑh”PÊ6ÑäÇQ翯©Úšœ§Àâ"é‚P ã{lýš«=¨ä`3MÖZ("T7ey÷š)Þ½ ‹gPýÏü w×3l|M¡±‘J@ÊšAFÏ1¿÷(óö¹9r"KÒø=°énÆ5 ­úúd0¾8ÜXºººÈ *çÎSçô ðdN–)€ªþäí[:¦ªØöY`q^Ù]9õÐûù‚¡H$BJ&K_<}jg¹»%H[Cž‰ÑgSº_>_‡^‚þX À-ÂÎYÃÍåÏܳV6²öç/¨d™sck%'ý²s;-—Š´{:Æ4p-œ†ŽÙ+š^_,¹/øÝt-{mG¦göÙKz«& Ú¨ä¼SÓq1›)½á{Sö:¼’”o-Úpø/Ÿ²z‘P¾©¬  @em±> Û4™^ø4s’ô~%C+Õ Ó?‘èAyæ’ ý'À·'®IEND®B`‚enigmail-2.0.8/ui/skin/images/encrypt-inactive-force-30.png000066400000000000000000000024301334302754500234470ustar00rootroot00000000000000‰PNG  IHDR;0®¢gAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ªIDATxÚÄW]L›U~¿þ@ÿh;JÂV.¶ù[ Ëâ(3™²«i¼0è25‘ãa7r!LH¸ 1‘D£w,!^,êv¡&’¸¸e° ³2X”mZZ~Z m -”ú¼§ýXi?ÊW¼Ø›<9_ÏùÎ÷¼ÿçTÊd2ô4DCOItå¼ÜÛÛ{ ÃàИ›žn?õõõÔ~KRãêžžžz ƒ˜L&Òëõ$ImooÓææ&¥R)Z__Oá!à‹þþþøÿ&îîîfë®8Žz»ÝNétZòXø rJ&“>¼ÿÖÀÀÀ쉻ººØµ7].—Ób±’x<.À–²hµZª¬¬$F#Ö766SX:=88¸v ÊẺ:'»7‘HÐêê*E£Ñß±4üTp¼¡ÈGƒ¡Ùh4ÂÁû^ù×Xë(ÛâÎÎÎ 6›í‡††aI0dÒ‹C…wµ¾q'{†ã¿¸¸˜ÆÜ ¼î+«œàÊù#[[[‚4§DÊ‚é4pŠI°T‚û%³Ù¬Ã7|e×16åØ1q(Jã÷çûe*Çä"œªcÜÑÑáÔétFv1ÇäSÃÃÃKû³’±XL$Ç›—e14uÊ5ÊYŠ:ªi PNÔ4ïe«ù¹,‹AÈÉ"ê’‰1ªn­¼‡-…ÇÄÞ²ˆy£Üd¨•œ‡„»K•S[[ÛŽ+)ÃqËÐ6JIé#×®³ml+²˜imm-ÚÈM¤”T‡È‰Ð\M Å,æ]kccc<Þ8I¯*³LNNîš«­­Ý“Ô½¸D§nß¡jdôM4œ+ϧ¤N¤ y<2eËêKà<À‰ªUu,r––*á^ZÏÇÃaªJ5ظ³~Þ€¼ŸË)=»|O‹ “­T3Håí±#¡lÉ Z6e‰Ÿ›¼GÞ¹@~"?«"æ ÏÏÐööö]ëwßS9à@³±&St,²Bm6ze>H¯Î< ó¥¯óI ‘D¬ö:.ƒ\»:ì;9~‹ÞuâW¹æAeÅ8_p»X^X £·'èéiAÊrñ¼ô²‡ÁR#’ì<’ ò p†u-+Æ|¾ÊQ4†7a©a3ç¿\tÉYC䪧5\"Þ»7Eî5\ ²ßävé>ã:Vm1»ºͳsdÉÕw¤ªŠþ8ÑL!}Ö–™êC4ây‘üMîüO=ËúZÌ.pˆÖ2:ZDîó_ŸÎ-eCƪþjµÐ/ !ñW¥ìÈÙŽù×]ôv x >ÑùĆ\𥉉‰¦ÜµußÃ?Cš3q’>NÍ¡;ÿ¼ì$óGÒ?×C¢äo”Y™‡ÿ 0%€µ ¦”nIEND®B`‚enigmail-2.0.8/ui/skin/images/enigEncInactive.png000066400000000000000000000011261334302754500217030ustar00rootroot00000000000000‰PNG  IHDR ÎöÅbKGDÿÿÿ ½§“ pHYs  ’ù¥tIMEÓ (k©bãIDATxœ­“?ˆQÆ¿7oy»&‚É6z‰‹;±²ÊY,¤ˆ¤ˆÝ ázÿ€ é{-‹@@¬4°…w`'[ðšB MrˆláX_Ü}ïÙ$ä ïôƒføñ1ðz½Ž¹*• )¥NØëv»#R4O<ϳûý×* Ãa~)‹wÿ:|”KK9h­™Öš¤”7]7k-•J'\7kòù“#°mûºâ ¶¼\øìºYãy?”5›ÍÍ8Ž«`YÖÏZ­vÄ÷ý‹Óéô¹RÊ€ñ_WVV³F£a´ÖpçÞúúú­Åv»½Çñ…¹dì 1Æö I’s¾ïߘ7;Îe­õ*Ñ'ÆØ‹Åàœo/ˆè;ç|‹sþÊ¿Íåò*I’ªRª ¾ïoH)ŸÍ†¤Óé ús@¹\fQ]¢hˆ”RÊæœ¿sçvïi2Ùeãñˆ !¶Œ1hµZo¥” •J52™Ì™EàLŽ”ò¾1ƶmûšâMÇç•R—À€Éd—03ÇggÇœó;½^ïÛ>{ÓÆ5+õŸ}kžÌÁ…©‡DôKñ(‚á~Ç ¢„sþ˜1vŒˆDôÔ²¬mcÌK`‹oú¿ôþ­Íø æ'IEND®B`‚enigmail-2.0.8/ui/skin/images/enigEncNotOk.png000066400000000000000000000012411334302754500211710ustar00rootroot00000000000000‰PNG  IHDR ÎöÅbKGDÿÿÿ ½§“ pHYs  ’ù¥tIMEÓ "'*='.IDATxœS¿kSQþν7ô>"Ï©ä·×¦¶‚ÔÅ-J Ú¡ƒ\„ƒÿ€?pÎ5`x"‚ Y‚C‹–8tHEšAP[h­.ZIp©Ðû~Üw]ò MÑoúî9çû8çÜ{ijj æçç™Ö:`¿V«íâ?A‰i¡PjµÖr¹1ÀH)Æ­¤°Ñlš„Oçó4È”%¤ÕZ?pÝh­IkÍ”R7'c‰ÿj:;;ë8NÆärc»`YÖ5)å4>>ñÙq2¦P(ð1{{{{žH¥R?Ëåò}Ïó.EQt9×uGÐj­Gý¢ALNžÉˆ(Šf Nß-•J7 X,>€J¥òÒ÷ýó®;ò›ðð¹J©‹Œˆö ‚³žç]O’ÕjõªÖz8çŸú…Œ±Bˆµþçü»bEñšmoocŒé0 g”Rðض}{uuuƒµÛÚÙùÈ¥”+qcqqñ}·Û½¶m?>¹¼¼ü¶¿+"’J©…8އ,Ë*J)ßù¾. Ã+@ïIµÛÚÜܘ!"†ái­u–sþMq§^¯wz^€i4›†ˆbcŒîÅãÃ{ i·;ÀLLœª0Æ˲ªKKK_ÿtŒ±Hñ€ˆŽsηâ8~–J¥ÖŒ1¯€¾uÍæ€/Óùü›£jµRÝèîµ"IEND®B`‚enigmail-2.0.8/ui/skin/images/enigEncOk.png000066400000000000000000000011471334302754500205150ustar00rootroot00000000000000‰PNG  IHDR ÎöÅbKGDÿÿÿ ½§“ pHYs  ’ù¥tIMEÓ ÿ³ôIDATxœ¥’Íka‡Ÿ}w7›Mú‰Öh1~Er(%éA)Ôƒ_ˆ"âÝ‹àÑC<ñ ’€•^µ`lç?¤¬$'jÍ i“±Wh³RTK–ò¯á¿I¬$Í i») ·B ñ}·äò2ØôÜ<¹¼ ÈXŸ=úN®&’ž;wîÿüùó?×ÖÖÚB¥È C.\øvÙ²eÿ÷ïßÿ¿¡¡dø§òòrò]3ôÌ™3ÿ:ôΜ9ÿwíÚ¶ ;;ÛªŒ4€lèéÓ§ÿŸ÷ï‚ûVl…«µ@ålÙÝåhÞÕù¹ygoÿ²ÔÝ^$'htú ¥æ8o¶òïüpuîW¹;‹qæD{­õ4黎ÐÓ3pÞÜ›ŸÜ¥+Pf¥ŸÚ÷^…øþ8gOÑÈT-þ.„&Îa®c_îò¹.µ60r©àbª!Zk¨h«§¤¿¡—Z¤–ú™ü"\:u#lO·Z»h®C:dF̦…,íçéŠó"oÏ"Ðc5üžM„G¶‡×p Ès·ÒÒ8’þnvã Tœo¡IAiñÛd™ØLkÖydk\½‡UÃAžº ‰‰¾f²>*.è©´ô©¯cHÇ,ìÖOàî)žä±Í!Yé±43Ù¶r7$?“§i:øœ¦ÃÏ‰ÛØ&¯à3VäyEÓ%oLVú „DfÚdÒiCÂ× Á\……‘:šŽXéúê2¤e È`õ/éV£,-#Ñ:vS=âóMH…†á=ß@i«¯¿¤Ñq¿Ü«…ÛX!Èó<úoˆQ£ò˜Êˆh½ÍÖ¾…¾ "³òÄT>¦p=.UÓÑ=öG…;xks„!&µ÷±ÕÛ›=ɤXK8²% WüçŒ0ªÁš$ j9ÄnÛ›}˽ßÅÇrÇ?V‰õÕo•Üãßù?†Šç‰Bñ‹Æº¸­ê^IEND®B`‚\dGBASE UNENCRYPTED‰PNG  IHDRí&sRGB®ÎégAMA± üa pHYsÃÃÇo¨dñIDAT8O¥“¹ªZQ†­Ò%Ï`›"rËÖtDoI.—‹%‰G&“}“J¥OÂõÿ‰ jµzÇ‘Ífáóù P(äÂócÒjµbF³Êår(‹H&“¨V«‡ÃP*•Áu:Ý{‚°\.#‰€²¦³Õj!B¥RÝç³ýLeF#I$,c³ÙŒP(„ápˆX,¾M_„ÛD`¿ßÙl†ççg¤ÓiPKòù<ûßétÀq,ËI¹Mƒá“^¯Ç|>G»ÝF¡P@¥RA³ÙD¿ßÇd2Áv»…×ëý)„¼-£Ñ(æ¡\*•B¯×Ãf³Á`0`YR ‹v»«†Oà»öº^ ´ZÝn—eKPÊn¹\2;ì´Ûí?È_ý·ÈÉd2qÔG‚Öj5vºÝn\.¬×k¸\®Û¡üĹR©ÄJ¦5›N§ðx<´ rÞ¾òƒºÒ@yßÕMP‡Ã!æƒ8Z~*=“É`<c¿ßÃjµBpñÕ|°Ùlù¯ñpõºÚh4P¯×ÙnÒîžN'f|ƒï–ÓéÄù|F0d«D¿éîÅ·ûEù^¯Ý Ï‹ô7ž”Hô c ¼Z~T©IEND®B`‚€d"G__ UNUSED overlay layers below ___‰PNG  IHDRí&sRGB®ÎégAMA± üa pHYsÃÃÇo¨dIDAT8Oc£`Œ‚Q0 œàIEND®B`‚¢dGOVER rule ALWAYS‰PNG  IHDRí&sRGB®ÎégAMA± üa pHYsÃÃÇo¨d7IDAT8Oc£`¤ƒûÓÍJÿñ2”þøÆTT7f :¦`3„©¨n ÐÌ`ú(ë3¾©oxIEND®B`‚dGOVER rule NEVER‰PNG  IHDRí&sRGB®ÎégAMA± üa pHYsÃÃÇo¨d%IDAT8Oc£` 5pAKë?6 •&`3„¡Ò£€¦€ÈÍ¥¯¬ IEND®B`‚ºdGOVER user UNSET‰PNG  IHDRí&sRGB®ÎégAMA± üa pHYsÃÃÇo¨dOIDAT8Oc£`€óÚÚ´´ê¡\8‰ä \ÒÈ þl861²²AÈl¨4eÉ@ê 41ÉPê6ƒ°‰‘ h–Üðî.FÛe'IEND®B`‚®dGOVER user UNSET big crossed out‰PNG  IHDRí&sRGB®ÎégAMA± üa pHYsÃÃÇo¨dCIDAT8O½”KHÔQÆã›|;Jå"_EÍUJF«b­#-q%.Ý…ŠŠ[IñAJPêÂ6-d¬•/ˆ t“ â&AðQ¦õû†«02£¸ñÀǹ÷œïûî¹ÿùÿÇÿÌbAÚ‰Ù­=³Ö^¢‚Ú»ºnŽø¬SÏóÎB&xÚþ˜uBô³.–‰£C{Õÿš5‚NñÁè(¡ fݱYÿ‘Ùyaµzq@“êV¹ÔžÓ›…€×G®¥ï¬BC PZ}dêo`’uý®Y–Ìéeõ ̾қÍôòÇY…(D7@äMÁ* R«wàÔjO}…þ<¼vêwAøÇpÎ<TbÐx“EÖ½ôüʘ}Ò¡¬»à•o›%Iç,"$‚lÄO0}Ö5!†3ä%²€£,C|'½8ÜÔzÞy˜4ƒf[`ûÐlÓ)jõðný˜—O{Î\Ï»£> 7vÌÈ?Ø¿úmVJ/ñJ¦ 1ÀËãxÌõ_ƒŸûf¿0Ü 6„é#õÅs’˲¤"¾Ïtú±–1[#æ€ï`™zý*ñÄwÒÈ)ø¹"*Âè`ô£Qê/YiÏA8zÕŠ@¼tÎ"|@ÐGGösí 4Ý0ÙG½„ü ã ·dšZÜ\é"šÓˆ†˜ |˜#\ï@5ýÑè&·ÙûÁ{õáQ{ ôe†Þ:Â=ÐÎD“ˆ&·ð&S ^—œL®&wÀy †Y7RËw6×fÿpê&1!PõIEND®B`‚—dGOVER user SET exclamation mark‰PNG  IHDRí&sRGB®ÎégAMA± üa pHYsÃÃÇo¨d,IDAT8Oµ”¯KA†_Q䊂¿‚ÝbòP0Ú¬b1êíîÌœ‹¶Xbµ«‚ÁA0\0Èi=ñvwfoáÆotl¶o|ê /ß¾³àa'p”/@ê=H!.w Æ3>dÙiˆz2ï!Òk¨bѧ \±¬7Éøª?B”ßQù’OükqRo 2ý°ÅÛvqµ Y< =Ðæ&ÌÎЙÊ|Y]AÚyŸ0q†‰[ƒ~£É!±³>aâ ©2/è˜.mÓ'L†sd{X?Ñ:ö¡^<Gj[PÕ1DyUo!{lø„IfHGkd» 1^þ^ ›ÌNÑÄVÈø„>Ü9dÙEúÑò)ƒß"Mî<øYG˜Ó„¾¤ò[´ËS$Ÿæö'À’™êg±ÞIEND®B`‚<dGOVER rule CONFLICT flash‰PNG  IHDRí&sRGB®ÎégAMA± üa pHYsÃÃÇo¨dÑIDAT8O”=(…aÇÿt}'$ ’¤îp…U6)) d‘ÁbÑÍ€…Án (¡dñµIÉ ®…B7Éçu}þO)ºyï=õï<çÜóüžóžû¼¯µɇRP’‹“ߥ¢'©ñEjý*Š×¤•¢ ‹Që cQiÀ•Æg@ÒÔ vTBœ‰¯~“F®ov¥Þ H‚W)h H=q9qÚ<÷,U¹rïØÇÆJ€³hÐàü2ñðAâBWîÝì±´E¤]æu  è„ü6¹•+÷fn ņžKQ@ç¬OñWägXWP—ì¶x36¤ÒY Z}nO¥7ƒßHCŒ¡Ïæïʽà\6w?J‡÷Ò]XŠ„€›§ã-:nHd vwýl·Ç·™¢Ð¥ôÌKqMnùãÐ4 <òÀ#4K÷‹Ä¬Q‘ä¹rï8ŸÍýÀwðóøvƒá÷8`ßëìpWþm´Ÿâ–1M À–u—2ëZrS¼(ÃÄeÆ@òß@€i ý6K뎛QLÜź e»Ò#™å–1N{P[Kg™Èît ëÖçJã3 -ì»oPË™·C¸Ï¿®˜ô DdÔA›#gIEND®B`‚enigmail-2.0.8/ui/skin/images/enigSignInactive.png000066400000000000000000000004571334302754500221040ustar00rootroot00000000000000‰PNG  IHDR fùMÆbKGDÿÿÿ ½§“ pHYs  ­#½utIMEÓ 17Veví¼IDATxœµÓ± „0 Ðoé$ª0É‘HÇB…%2 ¢Dé©Ò¤ƒ‚|'8@ºâW±#=¹°©i<‘×wÃ9'˲ÜBC´ƒsb­EJ) òÞz[X¬µ€¢(²`cÌ®ÇñËö£,Ë,ø,+L[|žç,D)u u]'u]cš¦?f¼†Ñ÷=UU%1Æ,Dk½«‡a8®›÷žr§ !¬Oaf'{ücä¬ÉÌhÛ–îÀÄÌ|E€ž:é7ýR8I=|ÐIEND®B`‚enigmail-2.0.8/ui/skin/images/enigSignNotOk.png000066400000000000000000000013431334302754500213670ustar00rootroot00000000000000‰PNG  IHDR fùMÆbKGDòO'JÉI pHYs  ­#½utIMEÓ 4+?ÞçpIDATxœ]“½kAƳ»·{»·÷‘‹&jTˆ`@„ˆ66©…Á΀ ÚXøoXXØÚ#X« vÁ@PND¢ä;ÆìÝ^n?fg,²w¹ä©æyó¾Ãûˆ©©)ºš_ðm  Ô€aà 0œꀛ[;À°¬€ `f&ÃÄâ°ì³6Ù%AJ½)©îIÜ8Ã’i :ŽIàYìT,þU ®Iè™´] ¾=ðü‚o?¿±uml‚vc™ÊfH¥Ó¢¤B¼Xqêç;÷ÈLAŠA¹X`Àöyßh°áhÖ‹óK¾Ýß¾ÆO&.c6#¼J¡Äk¥xa‚ÓNz#Y±Ä0†Ò` ´›r®\§T6)W,Z® KÛ=°îŠLá[6ž6(&vœa¦ÙÁgi02 éþ]–dØJQÈ Lu`3º¼°¦Ól’´;¨(…T"”樄ÒJT”âš<»HÉs)—J‡À¼ZôË‹ ŸAkÚí=¢4&UÕ?NŸ4 €TI´(¢Ï|h+î¿lŒ¾{<ô+hîbD1¶’ØBcÔ¦y‘ ˆ„&Twð8µ>ÆP‰²ïˇÀЙzöi&€KÀpª¼hU§#¡I©[N(WBÙ`õ÷þöh¼ýööƒ{Y?8¢üì/|°óGGrßÖŠ“iYºò· GÖŠjr¥¨Xwwfïrýá\ HÄ‘ä¹@Ngós8F_òÖnœ¿×Kă>Ñ G\÷¹úôõ  93vŽ&¯Ûu‹ý¸J  üË»wr_|òãÀz>ÙûqŽrÿ5p ÷ù)„IEND®B`‚enigmail-2.0.8/ui/skin/images/enigSignOk.png000066400000000000000000000004541334302754500207100ustar00rootroot00000000000000‰PNG  IHDR fùMÆbKGDÿÿÿ ½§“ pHYs  ­#½utIMEÓ 0ùj‘¹IDATxœc` `DК©õÿÿÍÿz½ï:#ŠÁZ3µþðLeÈùxœ$ƒVé®BbdAâü?à™ÊÀÀÀÀðSþ'Ikär ðoLþÁ3Åï2¼2$|‹Ì`Fdß>{J’ÁjÌ8 f````»^øÿ•f?Ó'OH2`Aá¹30æ\>þÿëʯ$-Z¿ÀPK±ÃÐÁÿìÿÙ¥ÕÿØ0²¡„X€ÍeS§’mÑHh:öÝ µIIEND®B`‚enigmail-2.0.8/ui/skin/images/enigSignUnkown.png000066400000000000000000000006471334302754500216240ustar00rootroot00000000000000‰PNG  IHDR fùMÆbKGDòO'JÉI pHYs  ’ù¥tIMEÓ  #u&"4IDATxœ“¿jÂPÆ—*™¢ïݳ\ú• õz±Ð·¨Ä°`I_À.]…à(d‹ˆ£-·CM¸ùc*ý¦{¾ó݇˹b8Ò¤ÏõºâÝwZeÃó{—´Ûí„Ð'öœCçÜOò^(Š¢î|).—Ëñ‰"q»'îC›ñà0 ãõz}8“8~–õsìDÀív ý%á÷sXÝ"´SxL1å› ÖÌXËX%ƒŽI»ÂÏ:äùÏiMú‚c¿bY~œàÌ|=3‰Î2Rl.žHHÃLpÏ'¡ib"¢ „¥H2•¼;™Îdï}“Ž\ `ï[$ Z€žæ ©¢, ¥âƒ‡‹ŠRÎ,“³ M­k/Šáh9=/Ë¿¾Mªew%k ›‹”sÁu{#QYJáI„ÊKY,–Ë’SØDÍÙ?ýH¬,¤©˜*<.ÁY­¬ˆ««)¿C¢Rª’³Äùˆ<ûèqa-’Ja¸ð¤²,®Vå¸S€Z ®RŠ2h ùb:~º^(¬A˜Zl¥*Ë‹N¢çŠ2"‘ YXë#a.A¸¹UY­ooW¶cì¨ä('YKÃp>ŸÆWRX¡Øø®©¸—«u׎`Sè9ªNHËëP‹Ÿ P,M‹pf—iFý¾Ó•8»#£ƒUoR†aO" ¡ M )H’Øó± ãšàz]‰ÙCý0™É½E)ªM<Ù´2[2K fjjŸiòýîÆ+¨Ìýè7[c@R’Q“ÿéçgÏëË ß?:|q|rr¢Þ™í^Oj‹<ñ‰ÐÖ«øÖôk›¼>qgg>Bºè„/£LÛ"ø@“8Ñæ67Ÿl&gò˜„º3bµúæ­M€It›˜˜S•@Ý‹_ï½kìî¾*Vâ—Í·n4ŠÈ[ûÝl1çaâèô·þßG§§M9ÏyéÎûçè$x튮S@×z4^ïcðàÆÑÎÕEÿ"·wðŽ:úðáððãþ3W·Ô64Bt 1´—ñ“¸DGo.ú® ãçëõ;ï?Õ>ã>ƒU£À-W=²=0à åá:ø³Öï÷.ùëã~ÍåµOÌPµBÀ•÷Ö4ç0v‰P·z΋OµëëkDJð¤k+ç„hÎñ†Ìúßб—Î;F:tÃ0[x^óŽï¥£YLœ™sbí˜ÿÿü,:náyŠeµñ½t@¬±€%Tí˜e‡äæfð§pkØñÓkÞ_ÃÊ&ÿ<ô„æ *IEND®B`‚enigmail-2.0.8/ui/skin/images/enigdecrypt-dis.png000066400000000000000000000042411334302754500217430ustar00rootroot00000000000000‰PNG  IHDR2!oÓsRGB®Îé pHYs  šœtIMEÙ ;+è|Íï3IDATXÃÅXkl×>;sgg×kïÃõÚ€_k;ÌÃ4c5¯´VSÚR…‚Bä¿*EªÔ¨RU5UÕ‡’¶j¥W¨”BBØ”ÄJ@¨ ~áxýÚׯYÛxžÝyÝÙí»Œ‡õb\‚ÔóctæÞs¿óÝsÎ}Ìæø$dÓ2¯áÅÉjW°1ŒfŸ6ŒE á§¾~y&µú‘/ŠÓr(­šÖÊ$§Ç]îãe¹­Õipz\ ƒ™¥Ÿ‰°² •Ñ4㘤´ÈäÕ$õ™‘Ól2¦e4ÕÁ#„Ƽ}f³Y„¹¹…œ‹ÃaÏÏË3fç'}×n|††ÈÂlyY 4n¥pmÅW)G ¯¸—èäþ‡ƒÕµµ–à¤/8œ˜˜”e5Ëb1"TXR^TT¼‹OÆ{º{òm–µU Ûž¯HVEkä‹^‹%«¸´*žå8\.—Åî$½ Á€Ï?><웟ŸwWº[^;$J„ÏžùðÇ?y[%J’‰e3z!iYª-Œ1":ÆX¯@$-.­JJ‹<ÏW”—»\®éé .·°dkÃΣǸnÝ2´Ûó wïjšðë}#šÖÛ`N¤‹"ïi3ÀcUE‰’ÔÝß[\䀎ãyÞç÷s‰F‚´éz½#gVSu9œ««¥«ë R YU5¢$!„ˆ#}À0ÆH#¡M… NUÈáG¡Í6Àü£yw…;×aŸá¸P8 …C¡°–P™_D¡¬(×IJcIÙè˜?-ƒ©à¨*‰¢é¥ü<ö‹ˆfbYQ’´Vò >¿ßi·@,<»å9Žã8Î;4´nÝZ—ËE(f™Íà€âÒªôåb46ú€™X–øÒ—¥ªˆ¦áKºMë­1ÆãããÍ¿ƒÞ¡M›6jeÅ–o†‡GsrrÓ\š›—<Õ‘¹)(X£,í©"•VšÆªŠô)Ó"C»ó ò‰î°Û8ŽŽQ”j^öØœ¤´èr¹ˆÁÃÁÑò²²’bW®Í<=”%L±Óá²/\nýèQŒU@ˆ”ü’N„Å¢1V1V¢ÉJT‰^ÇXöO¹+Üdw{êÜž:—Ë GL&Öç÷yûnÞº¥Å/;lÙ‹ñØôlØ”eu9î’ÂP(tíN÷¹ó™˜%ıžßÒ:E4!‡0V‘ã$zÂB•¼ý½¶,Úbwj{‘­ ;‰Ÿ™›[ ºoø ¬à‚w<.Q”,ˆÐl(|±­£²¢Òjwp\0Û–¯ñÐûÒGd‰ 0Œ„È'ÑÄÄTóý`±;ÝvgpÒç÷ rǼ}Ý=½‡¼aÍ/jØYDPz{ûd¬Mf>gbÆÎÛw¹¹¹×ð¦ÀÀýƒÞÓ­­ý}ýdHóþ}Gý d] @Ê5QCcEMmÈ€!cH’ƒ=ŒFÚfËÓè®­ 'Ì/hõ¤Éè˜?Ç’%‹Â¼š€ë7;÷75ØÓ4·a>.ü›w~yüÄ›´ž$CN:ýÖÞúõþXZ\¨…ƒAHQ0bèA€Ç;¯¢~ù帢×;®nª«ÕÎ]"ÆìÜå÷Üá2›{‡Æ ÝÕÝõÞÏêtXC¡fpºµõ;'Þüî«- ;HKçg4ÊþÛÉ?ÿìï Ʋ‚ ÂŠŠˆ&+Øb6iûöîêí ŒŽŒ©ªšcµÖÖx<Õ•Öü¢ågYt~F…¦¦Æ†Æm>ÿHÉ«{GÇF[·ÍðĦ¿¯ÿƒÖ“ ;.·]¥(4ïn¾óùíÆ÷O\Ç,f“ Iˆ¦á1A¤(ƒ‘A ÐÙáHäÜßÏíÞ³Û]º–›áÆ'&ÛÚ?6›Ì[ê7UV”º=u­®û]д½~½§ükªL uâí_m®õ(j†k Á'õ-úC«ºhé·.Š24~ýüîÝ?Üåß|ý –§'k×?Á –±ZWëÙ¼m{cöûÝEQÊ/Z#Hª ©ëvÀKÒ‘ôµüÆ•Ž60Ò"+X%š¦IhR›Û¼+ßjþqæ¯]¾ZT¼f羕ÕÕqžŒ|#¡p4²»Úìöß¾÷.bh†FÍ»›ßÿËIQ’I%YEA”c1Y’ã’tåìé+mH$Wpš  `)µ91 RLÓ´ªª4M>vüð±ã>Ïa$¾×Ò².¥îBÊãšÑðÓ$É2™™$Ëú‹MªôžlÙ¶koýŽ=|4üIG{Çõ7.]pº_^_æv›X6²³[ž- 6í6•!‰„œþ¨&úòȶÚ9vèÈ11¼ûŸß½õ)8k6”ç°«‰VFØ'îòŸ÷¥º D=çg#ÌFG{zzîÝëZÙòü¥‹ÏþÄø×žÌk¢Èækx.®"јÝf+­Ù˜?Ug§¹H&Oý¾LÙ‰Äó/¦²Úú r2‘X>mE!Ò‘|Ò=1Uð‹ûòtIfš9Ò/WÝ}+ÿWù/ãsìáµÎ^«IEND®B`‚enigmail-2.0.8/ui/skin/images/enigdecrypt-hov.png000066400000000000000000000026131334302754500217610ustar00rootroot00000000000000‰PNG  IHDR2!¬£¶­PLTE%*!%0$)4,1<25?37@29E:=F,DR»àEA¹¨ÀѼDæ¤0@ZüÄ×¼€ŸíH®×¼x—ÿ»ãr63œO!-ÿøDˆñÒA)_<0¸2ÿ0šH(—SOSXpçeÛq˜²·’XÛzC*;žìÀÀºŒ¿˜“¢Òß‹Åó®ëÔò¿EW)³Õ)ËŸ 0æ#Œå:–e3nÛN¾m(F½äz®ëy‰UÛæ|[±l¨6gŒqáe‘:󵯸JRjm ¼Émøö-{ÙAŒxs©Ã˜@za}Xmv?¸kÌ<{„™¢˜´a_¸Î ¸‹†gÔ::2~¬›ËåýÝìfjQ¸}m0€eœaª¦bM“55І¾ßR÷n ߪÊ}uó»™¹T©ª†e¬©p¼ '¥,Y…0P!4z;%¥7wËeTÞÍe3¿.üü# ²Œ±ª-2UE²œ2eU=¨ò«èþfN’rAÊG~ŠŒÁ¡&Íä‚^ÍŽ 4ö5ÊJéÇ ÷gffÐÉ$ Þ+¡ü|éR­ŠR½¤Jº‡ëË›çºI³ZEA¹`—Á/¡ó“¤RY4+ç$ª•Ëý$xQ¹œ4ËŸ-áýDåž~ÿs8zIEND®B`‚enigmail-2.0.8/ui/skin/images/enigdecrypt.png000066400000000000000000000024101334302754500211620ustar00rootroot00000000000000‰PNG  IHDR2!¬£¶§PLTE%*$)4,1<25?37@29E:=F,DR†A¬O´ñQ)A BéP‘ªŒµMcs„kiÌEbH„Òû£ÝKl cýšî=öûÝîe»»{»‡j¯Ó¬¦¶[¡“ö% Ãžõw:%¶ýì!§ÀßNuGœVV·¿CsgÓÊ•r +¥MK‰Ý¹*IÊ?4f¿wmÛT² ibvÊK#O—ŽBVKõl4žn4ìrúIäUY_Ã^‚µˆ‰kÓ•vuE¯®6PœK¯D~ñ‹ï4…IxL LoËD½+5Jq¬Rv9jH4ånI¢3E%æ¡& ™ ‚Yú×ÎV±§xt¼Ì7K–ã¸;aßë÷‚ƒizÁÊ­4joÇ£ é<;¸ÀN#"òÆ|!"ªxÓäV=]­ë¹d4šà<–e‘ …µ%ZdÐZ®dvÝ+:×Ëœ_ŒY;µ êTcÌ0˜÷Ç(Fhn/ª\¯×«x“hÒånèy…YÎNmºkK8=¿?€Q3„jé$/£9gsw}ÁåŸÏdˆF♞¯ÆAA½Ÿ!mð†­,D£qñ†¹üXÉôÝ|ªGÉàüš!l´B©”VÜ×fÙÂg3>\ÉTŠs=™î—|ϺÓõ‰ú P_OÇ'›·T?uúÞýþŠSC$øèVaBÂG(B‰“òìÈõÈèâúod=Ë¿~ýÎaˆÀw š߀„JÞ“éØùÑ¡‹ƒC¹:"É@ÎùY¿¼UñÌ#BB5QÏÐ4"A`òÙÈ@èLðú’>¾Ÿl[X€¨DH[‘c=·SS×B}ÀñS´Â@“óŸ–çf&"Ò¶!òMUUMÅ#T5]—&SÏn»в½½'û/\›žUóòÞD–qÒ’tú.O¥¦f–óyÈ/ÏÏÍ<~8vö9T@BÆQVý¨Êk‘.è>w;•Ê´ªd@$ä6ò§ÞÇNô†`>5ýèþØððð—X;aéXhß;€K.ŠHIJ³Í¼,û†B )ÈÅ#Ô< Å‚ÿIPÈÿ¯~Έ¤Ž“G'IEND®B`‚enigmail-2.0.8/ui/skin/images/enigmail-about.svg000066400000000000000000000110571334302754500215640ustar00rootroot00000000000000 image/svg+xml enigmail-2.0.8/ui/skin/images/enigmail-logo.png000066400000000000000000000141471334302754500214020ustar00rootroot00000000000000‰PNG  IHDRðP'Iø|sBIT|dˆ pHYsgg&nXétEXtSoftwarewww.inkscape.org›î<äIDATxœíw`eÞÇ¿³-›Ý”Mo¤R@@PPºˆ„ª¢¢xXNPôÞóPï÷|ϳœ¢â‚¢¢x "EŠÒ!$$$„„4ÒHïÉf³}ß?"ef¶o’ Ïç?vö™yØÌwæy~•Âê#:‡„3Ð –CL 80DÀ‚ÃëÏ‹‰ø\ø» àr ÐhQÛ©€B­íÏ)C » ˜Ï¥0)Üé >˜ãOgPÔÍã­ÅÍ2ü|µ{®4â|U'´:bS#L…²‡šCQXè‹wgE!ÜÓÙäqEM2¬9\†ïó@tL ÇæŽõã»%‰àjñ9N\kÃ’ïòQÛ©°áÌ„¡‡MXÓ£½pîùT«Ä “"<¹2 iÁn6š04±™€Œ÷Áþe£ q¶Í¶:ÐÍ ¿=3ãBÜmr>a(bÇùбmqxÊø—Í@ÄçâÇÇGb˜»“MÏK ¬°ÇÁ¾'FÁ]hƒ¶¿«ß-IÒ³^„^¬VÝÊ»‚éeÜÒ\ÑÖƒ½MÈ­“¢½G /)ÃÜ07Þþ®ƒc'„J°(É;ó¬.0¤°Ê -qæ¡ì• ðñY¿Ó֣Ÿ÷—`kv4Zú¥œx¬Œÿ› g>û‚ ´E†øuç Òÿp«–Ћ“ü Š·²MŽq2ñeV-£x@¡ÖâƒS•˜¼9 ­2ë¹¢¼D˜åiÍt „!‡Už›àÃzL¦ÒàÁm—PÜ,3é\ª;±øÛË#±æÆûš=Ga(c±€Å.î‹d#®;U…¼:©Yça¨c±€ã|Åò˜‡k´:||¦Ê¢ó¾²’õX ›ü\ ¼7ñóñ@œ7ð3ÉÐH°-îBfÄxaÉ($ø‰ír ‹­Ð!!ë±óÕhîfßÏâr½UírÖó‡H„h*-:÷ÄüD_lYßX£ÕéðÁ©*üå@ÉÏìÎ`r„¾}$®7c¶^¬ÃòÝP³Øƒ,Áâ7°‹€Ëz¬¬¥ÇÒÓèµ8³áf'óP"ÔCˆm‹ô¢â8…Wî Å’Qþ8³;‰3ß-IÒ/<1&/M a'âs1ÜG„û"=±ttf ÷2z-‹Õ`(êÊ5ÙZ Œ·u´×PdfŒÄ,Øù‰¾øö»`=Ã$¬[½‰¾´mbœ¯§ŸK¡yt¶^¬ÃÁ¢ƒ×²KEk$•Ð:ØÄ ®NìǶÁÐêÔÕ‰þÎtâq ºc AÖ£,$ºâ¹qì>O£T‰5‡Ël0#Ó9Sь᧧ÊÛûu.w"ç«:¡ÒèÀçÒÿ§*Úlz-"`Â=ñLZÕçùµ¬Õ³1Œê|pª¾'Tïó Õøà»•Ÿ`*Úz°ú` ÞŸ Î-OÑâfþö‹mæDÀv¦ÔJƒž¥¼r ‡Š[0=Ú ..2ª;ðí¥z›Z@ ì|xº g+;07Þ"rk¥Øš]‹•mkÀpˆDˆLÄô/³ü¯/O ÁˬmÖpè©dÚg] .TwàÍcå8YnÛ%е”š‰fŽ•¶âXiÿ¯½dTw £ºÃ®×`pˆDˆŒiF3…®N\L‰òĤ,Üž‡½Mv»V·Rc–:¿Á¼h4G'ÎW /§+È^»?`ð[3"B¼·ÂãPØ‹ýW›í¶T_ž‚ô.iŬ/szZw¬žc܉< rsB’¿ rj»z*C.‡B„§3’ü]솇Fø!Ìãf¨æ}‘pòÐ!Wà,ï X,Zæ— x8Þ¹S0:^¬ïR]—^ÊeÊ07<–ì‘®pu‚F§CU»‡‹[°%³ Ãâˆñ1ús뺌®N$Î<ÌKðÅÝa s"ÀM/B|.Ç Ÿ\f ÷Âw¹½â|ÅñõÇ7w£K¡éû÷Ø`w,€$ø» Ð,S¡°±Û²ëpâ³]#9ÐH D¼¯ ‚Ü Pk‘[×…mÙu8RbúÞ?ÈÍ “#=0*À1Þ"¹;A"䃢€N¹Í2.ÖtþnSh3©vy¸§3<îÂF©M YÄ ÝÏp( Y/¤Ñ>ú×”µô Ø]ˆ- ã1-šžéï+ÆÌ/¼voþ6ß ‹ê³yq¸7Òƒö¹×›'X#åÜœxX3%ÏFœ¹¤'øö øë‡0&Hÿ¡õÈŽËø.·~.ügqfÞ¶â‹0>ÄO¥⓳ÕXµ¯¨/ÀÇKÄÇW‹â1'ŽžÎšäï‚Ç’ðMN=žú¾J ³XB$B<•ˆÅ#üçk<Ñ`j”'VO Ci‹ +÷á—bÃRoN‹ÀcÉ´ÏG|t—ëmga°F§Ž¶èˆ®’h/|ÅX–l´²§X€ýËFaüÆL\²ÑV!Ú[„ýOŽB´·Èä1Zå­r´ËUèRh UhPÝ!G~ƒG¼£½EˆòáÔs)Fm-/Ü ¹Z‹¿(AŒ·G–6˜L&û£G­ÁÓ» ÷aíÔÃÿA¢¼D8¸,/üT„ çªÍokXï”±.à‹ñHæ8µ™ÛzTxõ`é s%™Â¼D_,Jò5¹,¯ÇÁ§é±¿1Óêkû¹ðÛ3cäf^õOEáz‡/ý\löƒdl°;O0ÙPúÒ„ü˜ßˆí'ï –§aKf-ÎWÑ]9¿–µ¡Aª´(=•¢€çÄ »¦çÎÝŸ°Þ-yuRܵ1+Æã­‘ãk».7`Åž"4u;fªá­Q_:p¬¬Ù5]prñ@¬ciÝq!îàŠÜ:ëÞÂÓcÅÛ UâïG¯áHI+ºjK„˜—àƒÿ¹;N¿ç‚OŠðÀ…ixdÇeìÎo4ùš³cogPitØ[Є’fâýÄx0·ÊçR8ñlJ_x¢Z«ÃOM(jbôþ®LÖhuøþrVŒлš(l”¡¢­µ t+5rwÂÈß÷Å·ÃåPøû´HLß’mòÿÙ|Ü«OÌßWØ„ÏæÅ1îËššNVì¹jWßoRÛ©À¢oòp¶òæM÷ºsN>7‰~.´ïOŠX%à$ÌO¤—*jëQa§™z©¡ R%²®wâTy;,Kî ŸKaÇ#I˜¶%›ÕàÄFu‡³¾ÌÁ•†î¾Ï^»7 ÿœEûî ñÖw)1뫽·þë÷†ã­‘´1w‡KX¯ýuv=Ä.~)nÁÑÒVÖö§Rñù‚8½°H˜åOßêì;k0i½v­µÓ·dcQ’> / 3'l‰V§Ã™µøóþb=k¦½æî„EI~F¿×,Sâ·2ónæú.%îÙ”E˧nëQá³ó5ø÷Üá´1¡ë*m,Lb®3öÞ‰JÖ¼îCÅ-øµ¬Sn)2ÈçRøçŒ(LøÔô%½T©ÁŒ-9(lìÖûüßg«±æ¾Æ*¥rµ–&^øälÖL §U‰ •ôvÄd2›)õeV-¦Çxá¡úwEa\°;5=‡½`°X@[ŽîºÜ€“åmø×ýÑx|4ÝÂÖ_ä7HñôîBÆ¥ŸKA,ࢽÇ>>ȱÁîØùh’Ñï®hÇÝeY&ŸW«Óáñÿ泊¦Œ¥Èµ­l˜\Z°ÿªá›òDy›ž€^«±XÀE·Ò´êk‡JiâzCc«ÚåîC_º®=RƸ߾1æöå.ŸKAÄ7}Nl.n¡ À€;±æ_ùÓ8<“DÛW4H•Xºó øÏ%TwÈí=?=TÞ=Q1ë/0Š79ÐçŸOc½)3yuR5·ÜIJ¼³ÖOÀ–‡j,\´IJŸEa¦˜`SÆuÖcÍ2æëoʨaÃòÙ¢D}ó|lÕ ÌRX,ò±i~Ž?3†ñI¸ÿj3×Çú3ÕýÒ”ûLe;F~|¯,¥ùöD|.Þ™…Ì•id]gĘçKgu™fÚz˜ozcFK–Â.ÓohC·–%ÖÁà;Þ‡l®ÉÛ÷ÅýÑ_ûžpä¼8ï¨À[¿•ëuFèT¨±j_væ5àóq&9ÄÍ¥S¡Æ‡¯á“³ÌŠÉØÞ™…§SéË|{r¨¸+ö\5ú=¹Ú¶yŸöâ@Q3þÈPydÕÄ`ìÎod|h¹9an<= ª¢­×;§);E%`픇-»kÖ~d€+Î=ŸŠç®ãõ_Jõ rµk—Ό½ockúú6H•øËlË®c<¾(ÉÒ‡ÃGÜÿ„n¥× ¼™W[PÒ,£­`&„Jðù‚8¼øS‘Þß9D"ÄîÇF0†Znɬµû|m…XÀÅ®GG˜Tùq0cöœÇ¡ðâ„`<çg(¤^ò¤˜ði–§âýÙ1fQÓé€í9uxùçbÆÊ”nNØ07éZºÌC«ÓáÉ]WptùšÛæ©”@¤ÇûàTE;Zd*„y1!TÒÄq+%Í2|tÚ²bþý E{–Ždíµu­µyuRTwÈÑ UB­Ñ!Ú[„?¤öóLc± Í™Ïa­Ñ¬Õé°ùB ~¾Úl²à®µö0>è×ÜaŽÈÙÊLû"ÛJ@„§þRÒSÄg\.ßJm§s¶^‚ÔJWM±lL £x[d*,ÛU€}…ô  éÑ^ƒRÀfïÌu:`ó…ľ? «íT`Þ×¹XüÍeÖGµV‡õgª1â£óÅ ôŒŸúE6žØye@£_†"g*Û‘üq†ÙÛƒ½MóIŠš®t¹<;–¹ÚèÂíyŒâ̘%àÒ¦|qÏþPHËGåq(<„@†˜Ú]—0üýsØ|A߇—[×…»6fbÕ¾"š£Ý‰ÇÁsc‡Á[¬ï§Ôé€mÙuHøð¾¿lzì-Á0.ÿ}4Iï ÜÞ£¦å®ªµ:”µô`SF ÆmÈDú¶\Vé`DâÌcLÐ)lìÆq3Ã@&-¡UÖ®ÄÚ#× `°®Ž pÅç â:Ì r5Ö¡»}ÚzTxö‡Bü˜ßˆuÄ૬Z|xºŠÑ¿vW¨;>_x_1þ93¯,¥‰¿¾K‰EßäaNœ6¦Ç2ûLç½û£ôrr»•¤m¸€òÖº9AÄç¢]®B£TÕ/~{àêÄèµ(osLäQg×taùîÆ5Î|VO Ãë÷†÷¹ŽÜ…<|4'‹FøâéÝ…´P¹CÅ-8´îãµÄ.ÖL Ç+÷„ö9È=œ{Jæ%úâ¹ QÙ¦ïgÜWØ„“åmxsZ$VÞ5lÀëŽH€«Í•t©® %¿WÔdó;"l5¥²Å t§Ö%´L¥Á«K‘¶á£xox¬Áè÷*AîªqxgV&8ÁgÇz£àOã±zR£gÆxõçÞö«uÈ{J&o¾ˆ«MôØZ‚aƆ¸ÑþF‰~.à˜Qm†` ÷uaÜþ@‚ŸoϤgG€Ÿ‹õ+?µ†yE#× ë8ñÃsŒNy‰3ïΊ6)€‚Ï¥°zRîî§w2f~ø¹LNޏ2ùÐH?,ß]€ìýË©òÞ€kËÁbt +6Í3kLgL™ SÃ8w!9/ŽEAc7¤ ½PO…Z‹¦n%ê»”8YÞ†ßÊÚ&p¥¶SÊ69Bo‹Ùvæs°y~–ìÈï³ïp( “|ñÙ¼XVwèÜx¬=Rf•ž-œuZ”¦DyBªÐ Y¦dLta0“x%ùaýƒÃÍÎÀHòwÁ™?¦à“³Õxûx¥J8ñ8xbtÞževc§I ïï ï¼u_Þ£ÒÚ¼úý­XÒråo¿” jŸ®hgìåCQ½oCÍ©_©Rƒu§*ñîñJÈTƒ÷ÿyƒ¯sêð·ûÂiŸÏŽõFÍ_ïF~½R¥ñ¾bÖ·ò "½œqöùTÌü2µ ƒ¦PÛ¥@£T ßÛ–ñgŽ.  7HfùîÚX“¬ÐAnNØ»t$v>šdqú—C᥉!¨yýnT½6mk'cÓü8‹»²ñ¹ÖL Ç¥Uc11Œ=i›`œú.%Þ8byÏoL‰@Ϊ±´ž¸ƒ‘NU²îë]\Œ qÇÔ(O=ñª4:,ܞǸ÷t¶Ê­©ÓÁhË×9qÞŒ[Kƒ¦(`éèä½4qæ› C!Ø]Ș¬m ±>bœ|6Û'Xü0 ï¯À³?Zu#Æx‹pxy2«¡h°ÐޣƜ­—P×eÚS¦ÒàÉ]W°;¿+ö\¥yN5[½…øÇ¯å…¾.¤ £Û$X—ÐQ^"lžÏ\št°AQÀã£05Ú/ì-2«6¶ŒyÖÜæva:¯±,…ZË8Ž-O¸®KÁø}C. Íj°5»S£<1*ÐÁîB¸:qõ–Ö.nNèJ3&½Æ¯åiAø÷Ù›k:ðp¦ÏÅ3ªÖ‚ù×v²¡7¯NŠ1ë/à½û£ððHF;€Z«Ã¡¢üiqŸE~w~#fu ïΊ¨À^Aý˜OþhêV1Î…­Ìm‹L…{6eᛇ1!”¾¢ÔêtàŠ Õú‰DVaüE¤oÞ;è Ù±1ñÓ,œ©$½yìI¨‡æÆê§»An]F}œ1³² _&…{ Ú[7!ÍÝ*\ﬓô>¬Fºâ§‚&£…öÍ!u˜&„Iàç"@§Bªv9~-mc\1°¾Mqý V˜‚í ¶¥²MŽ%;òÑüÆ$šñ+Æ[ E9LÀG£T‰]—Ì—ß µKóºÌëȼ-e— V÷þøŽqû’•ÀÌ–…ñ´Ë4Úuà 5J[d´BN< <%‹“`;X\ÉP ÌQ¨pа¸þ&ÂÓ“#ômk:M°‹€‹`†"ëõ]JÖ½Á¶°®5·d²Ì-m¥…[˜azÐ=Ôgœ1„‹€‹­‹ d™Õ; Ö7ð§ª0:ȱ”æ`¥ ±Oî¼2ÐÓpö6ãÉ1ú9®ž">²V¦ápI+2ª;PÕ.‡ô÷ g¼Ä|Äùˆ1;Ö›Ñm§Pk±þÌÀ÷ ºS`µBß`Z´'fÆxëU! •mÒ?X£ÕaGn=dVFN©4Zd]ïÂŽÜzÆl)3ŠBÆŠT¤Ø¨ÿ•N<¿ç*>3P.–`[Œ ˜‰¹ñ>سt¤UîVj°ä»|ü4DZ¢8*ÁîB|*Ù`¸¤)tÈÕxæ‡BìÌ3ßšK°œ©J]×¥Àœÿäâbi¦r‚ý¨î#å“ ¼|w^¸+ØìPÈÊ69¶çÔaÝé*R%eèwç7H1û«KC*ÇÔÑ‘«µxû· ¼{¼©ÃÜì†X$B>Ü…<¸ yàq)t+5hïQ£²½WeȪé´Yb‚eô«€”´bÑ7yèÛ§oÁ:´:É ¿ƒƒ~ð–ÌZüqO¡^g`v°N¼yìþ÷è5{_Š@¸ã°«€j-–í*ÀŽ\ùŽÁ2ì&à™ éÛrqº‚döÂ..m‘áþ¯.õåPû`sŸ©lGú¶\ƒy”Á6ØTÀ[/Öá™ I& ÐOØDÀ7,Í?vÍ`u`[¬°R£Å¾/Äöæ^¾Á~X$àUùZd*Ìÿ:'˯)0°HÀǯµá#eØq©¥-ÄÒL ¥„Á)ßH 80DÀ‚CL 80ÿ,åƄىfIEND®B`‚enigmail-2.0.8/ui/skin/images/enigsend-dis.png000066400000000000000000000011401334302754500212150ustar00rootroot00000000000000‰PNG  IHDR2!¬£¶rPLTEëôÿÜãëÎ×఼ȓ¤µv‹ ™¨¸×Þæ¶ÁÌÌÒÙ…™¬½ÇÑÐÖÛÎÔÛ¹ÄÏ©¶Ã¢°¾ÉÑÛÚàèÎÖÞ™§·ÉÐØÅÍל«ºÇÐÙÁËÔÉÏÖÔÛã—§·Ÿ°ÑØá»»»ÿÿÿˆˆˆýýüÌÓÜÿÿÌW­+ÍbKGDˆH pHYs  šœtIMEÔ 7âƒ5ùtIDATxÚÕÓ]sª0€á´ËÆ­Ù¥ÖÄ(Q{œþÿ¿x¶Zfʹ;ïÌ>,Ç1Ë{YÜÿF^¡B´«ßW¡u5x¿úyµhém½® 6Sä}Üæ¹^+¨·1ãîý©1ÉùMÇl÷Q Ê„’C‹²]ÿÌǘ¡Íy˜Õ=FO×ùos&*)ë½ÅÕ¸žx„nþˆ= òhÌ¡ ]ÞkÝ<[lb)UÁæ0ìNŽ(Ì Ž~—ʶÂ"R¡ŒÉ± }±Ö&aÀ–Ö¶ XR›ŽÃzBhs†ÓùôY|ù^q¶ÂÇdsO¯–éü‡Î:¤Û„;±7 —‚NJØë¸ƒ±1—¾è}¸V1õâò˜iúêÎ_úœK•œëDó”…¯ÚôÓŸÙ {ØC Xô¶®b7‘‰ÃB¹mñºäút§“¨¿¯–<³Ì‰hòC±`JÈ¢ŸdžÎ<Ÿ*èQ·Í‰ Bj4 YBéÛ¤ù -΄Åý q‹û ØÁWÚyµ:˜IEND®B`‚enigmail-2.0.8/ui/skin/images/enigsend-hov.png000066400000000000000000000013711334302754500212400ustar00rootroot00000000000000‰PNG  IHDR2!¬£¶‡PLTEìôý£±½ÜâêÞåíÄÍׂ’žSak +ÔÜ䜧+1f¶b"5ADÌäöqû¸61çýF$ Ñó7$Æ{™"s;1 Ô o HæÌN”ë‡2–)ùCÂtÎȯD½%1›„åΫ£ o tɸNB£TcÂöý%øúx )–k áJwOR\.;üŒÌb:Õ¯IJ W‹Nio6¥îŽìnéH>áÂR31[IEND®B`‚enigmail-2.0.8/ui/skin/images/enigsend.png000066400000000000000000000013011334302754500204370ustar00rootroot00000000000000‰PNG  IHDR2!¬£¶‡PLTEìôý£±½ÜâêÞåíÄÍׂ’žSak +ÔÜ䜧+1ȽÀ;†IÛd0R·ÿ?Ýæ´#9Õc‹ñÀ'byA¾'³˜¦úœlv˜óÖì¶JòËDüÅ=ù„rT ÞqŠÌIEND®B`‚enigmail-2.0.8/ui/skin/images/headerProtected-16.svg000066400000000000000000000177701334302754500222250ustar00rootroot00000000000000 image/svg+xml enigmail-2.0.8/ui/skin/images/headerProtected-18.svg000066400000000000000000000177701334302754500222270ustar00rootroot00000000000000 image/svg+xml enigmail-2.0.8/ui/skin/images/headerProtected-24.svg000066400000000000000000000201411334302754500222060ustar00rootroot00000000000000 image/svg+xml enigmail-2.0.8/ui/skin/images/headerProtected-30.svg000066400000000000000000000201411334302754500222030ustar00rootroot00000000000000 image/svg+xml enigmail-2.0.8/ui/skin/images/headerUnprotected-16.svg000066400000000000000000000177701334302754500225700ustar00rootroot00000000000000 image/svg+xml enigmail-2.0.8/ui/skin/images/headerUnprotected-18.svg000066400000000000000000000177701334302754500225720ustar00rootroot00000000000000 image/svg+xml enigmail-2.0.8/ui/skin/images/headerUnprotected-24.svg000066400000000000000000000177701334302754500225670ustar00rootroot00000000000000 image/svg+xml enigmail-2.0.8/ui/skin/images/headerUnprotected-30.svg000066400000000000000000000177701334302754500225640ustar00rootroot00000000000000 image/svg+xml enigmail-2.0.8/ui/skin/images/importSuccess.png000066400000000000000000000152621334302754500215210ustar00rootroot00000000000000‰PNG  IHDR\bÝŸ´…bKGDùC» pHYs%%IR$ðtIMEá ,ô°þh?IDATxÚíi×uß÷v¿~û,˜}±’)n"¨ˆ”¨…"-R"cʲâŠcåC¤X©¸Tù»’JåC*QT©Š•Èe«\Ž%;ŽÊ•*‰I‘)R¡D ’ Ö,$0˜}yóö×Ý÷ž|xoö÷ƒÁȼU](Ìôëyýïsÿçœÿ=ç¶:þs³ŒßÜ;ûðƀ߀á®åC•°B9¬ü³óÙ÷¿9Y™î:9Ç`n˜¼-RK²à‰ê›Ú ¥Iè8Ûšúh‰¶Þߺë÷zR݉vÒÑ µòD  ¥V¸‹ˆP J”ó ;¦ý ý3gìxi‚cS§9;ó>yS$± ¿Ùç«RNœ)œ¶Ø&q1ß)›òˆû¿B1/E¸C+½2赡V¥üâ¿Îù'Ÿ¿ðòýGǧfú)ž¡"¬±„Xm°Xtí2¢Ö ¸Üx¤¤v ÆE‹Æ—M‘ž÷:ã[?²åÁáMÛ~ý™-Ÿø›t4…«Ý«§”Šñ[FKãñËá7ï*÷ž8˜¼è3aÇ(8," N"QEiu¡lÀ1#c}Œ 0b|Í„î-†…¶ÿ7äOe;·Ž”Æï{ ûÀÅ®DÇÓ½éž~½ͬxhCòAþ§&ûüèýoïÏŸg¤r QŽA'5ŽVèHí¥ !é6q\"ʽ À7ÜTL@`ÊaëÏ Æz¾Éy›õ~95œŒ©Ô'ß<£œÓûZwª=¾é³žã5¤˜†”b•pdø??–øü·N··(ïª a$@‹ãFènÝEslûšvÓë æÆI9I5û×â37@â#ˆ%”¢)1^'f9š9ÅDa™â0ʬÂ1)µ•îhÿþö•Ù×¶÷Øö¦­[µ…WŒß“ OÏöï=™èò‡ R„ˆ…ˆG:ê‹5ÓÛ´•V¯•îD7M‘fâ‘81Ci³Óê&¼êë,V qÇÑŠ|˜dÚ‰: ωÂ4„†Ð÷ÉcHÅòöô‰–x$±¹5ÚBS4½,Š© øHqìþþÌÙ¯ýéÉïn ‡Á›BÅq#N³½åvîlÝÏÞÔ¢Ž‡ÖšÐ”V‚š³”›p% …"êxôE{ØÓ´“áòKC<3ü…òä§Q*ËŒÉñÍÁ—Š#Û#Ê=t_÷]÷EhcÀ!ïú޹ãÙ /&³êBšh¡ v*E"ÖÂ'»?FW¼‹Žè&*ÊÇ—±P¢QÈÂ(hM¢Þ@qá¬Tvö!hâ^Œ[Ü-<¡f¸4Âk£¿DòÓ¨ D˜äðÔTüâ‡ûRÝÇ;ãû“^¢à"ÌT²»‡ŠCœÉŸk U"ë Q/M<¶‰îD/­^íJ"XUƒUœ:Þ•Cn7b,Õ8W‹ÂU1'JO¢$bÍ”*yĆ(×ǧҟ?ÃDyŠ„›øI/ñë^0Åô _Ùñë©_m6'[lÂâDÁ¦\>Òq=©>2% ¶ˆ£UÕ‚¥±9ëµãV±a‡R  "Ú¡;¾‰Ï÷|’Wõ+Ž"Ù€\eœóaç/¾´oËm¿û;»žX¸o|r•üÇ3'ÿñHeÄׂ õèHô‘Œ6á91*1¶jÕÚ¸5ßhW\¯Íš6êUÍ|å Ê’ŒÄi÷šñò b APæÝ™ãhín)‡efCÅ9ÀKA‰™J¶ëXîÔ#f¼×z€1/JorÉHíXrÖ¯…LTcMY>ÞÈxÏ;ÔêÕh<Ç¥=Þ…Ò“¹!Œ5k8‘ y¿ðæ˜ûÕE€dÎå|ñü£K#yð€˜Æ‹Æim¢(eüÐGf½ÇìôZL¾ëq\·ÄGÉ•Yö‚ kþVZ’‘(‹Š;@€Xa<{ž÷ 1}xâß;ÐuÏW[£-ó€g‚™ÏŒW& µÅ1àåz(%`D-RW'‹lLJÀÖz#%Aæ Uè9ãZŠ€B‰B”­&Ž‘(øœ€PU(R`¸4ª*ÖŸãð4ëÏží8–=•¶^‘Úo¼ÂH!>e1X»$Œ×7'àS…ͯ:Àªc—:çUÃB­œˆ­ 擺_7"š@…ˆ×Á$*¦Èª<‡&ÞJ>Ðs?ÝñN\ ÈMù“ÛÇÊãÕi¦­p´ÂÑ–¢”ª_QVF¯?ˆ\K¨-Q%mRÜî%FG9u,·J#JiÇá„:Í42RÍâØE W+¬ÖˆDC >C¥!|3oá.ÀD%³}´<‰‰H•›µÂU ¶„Á.Cb)0ÎF¼Mñé6í´˜ Т›ˆD\¤à ÄÑ ÉS’aÆæpP¸KîÖAŠ%¢£…°f´eSf°8BÅV‡…E)‘¥XM©tÕÊ}|,ŠI›­-*Ø%_H–X¸³a# „bÉSâCÜΣ‘OñÐŽIyI”Û8îŸ §9X8Ì‘‰SœòÏ…VËc/…ˆP @”©±„Š!æ 1‹ S³îY‹°¢ª‹ ˜å½Ìuác¹&nk7ãtxíl‰õ‘Š%‰Gâ ¦&T¤BIÊô‡g™1Ó”LGÇkáàòð׊ Ö¯>ÞÏÐ(3ƒ»hæk;¿J£˜ÁˆÃ´ j›%À(.ÇârÃ×ÕCM‡„Ÿæ#MwóÚób ¿ Œû“¼[<É·ÇÿбðÖVÈJØ Ö d°Õ„T+Ä.Ú§ö2´P 6cÀ™®²äHdèY6‰‡†¤jæÉøcÜ™¼d:Y“‘ë_|~y†£Åw­œ!À ௨.е€E”ªb¹ì:òlƒµ¦îo…`uBþQ‰Ó¬ZØÛFG´ Çu? )Ø"ý¥ΕÏá›b•"°d–_©,±p[ͨlíÓ¢ÀÊÜìQu§ëjÜÕV[Öy<`bŸ»v~„æD3+U7 V.q¼t‚Ný_Fý‘já*…7 J¤J¹¢aàÖHÕ7|YƒC\‹Z¸Þx[á®ÄÜ»—d<¹¢uû6 ¿<À+ÙWɆ3„6X.a¬MÛmø’9r3(I—‘K¢ÆãŽÄ~îMÞ…çy ¹Û"m‘S¥Ó¼:ó*%Sª:ð+\ÉÊNß]lÙ79ºK‡ºUOzOqËv¦w¬(¦m‘g§ŸçµÌkœÈ#ÐèõÐæí*HXÔM¿KŒ½‰Ûbûhòš‰¸‘£’¬Éñné]ƒA|)_‰H}/:gáªFöË©G-ˆåÊùYÖúm¯~´šVvx;yªãIÚ“íUɹaF9ÅùÊ9þlâÛäý,¨+SoWüî pZ@)faã !*1~'ñw¦î¤cSž»rÎðRæÞ)¼CX®T—ÐÔz.ó5ŒRìõì®ùÐâ'Æo7;¢Û‰z^Cò´X|ñ9W>Ë@©cÂù˜{ Z-›Õ¦Q”RÍÔ\£,ß.e”¥Yd"7€Rºéb;ùLûÃlNln¨•äLŽ·óGynòG-¼C ÌúÈ 5ŒÕåãð &ó]ih·D¶ñPì!ÚRmÄ£ñ†ç0êòüôóŒú£ø6¼ºRé†Õ ¶Q¦yós¸‡]‘Ý<”xˆæx3^Äk˜ÍM‰Kþ/dže*˜¬ÎîkãU‰Wvù9vy¹L³NÔ¢ÖPz¼6R$ˆñiçanz˜û»î'æÆrq /L¿À‘üNfû ´_½Ï«A\Ô<-¢åFq¸Ô´”µ(| £t‰°'º‡žh /Ñ0Ò¨ŠSŽ•3P9C(þµÌ¾%•.¿!C¬rR<Õú»šváÄ{ÊœÍqÁ¿È_Oü%ƒåáÚƒ¹>tê.¶n©eÖ¦†,¦vµ…Èjcøk,)+|Âýû¢·±»m7-‰–Ï?š?ÊK™—È• ¨pvö«u™e"5Åp?µˆ#×ÅÂq0bêòå2vRëO%ˆf‡³ƒ½Þ^š¢M SxA¨H…á`˜Ó…ÓÆTÁP׺–±.¥®T»-ĬG[ØJ%Èã,tv¹Õb1ZÈ{~U­Së5EZHóhÛ#HÝO$ixm_|ŽdóÊôË<=õ Æ׉ðVŠÃg…óz4P'|hu[øíäSD‡½,apµF”ÂZKQ ¼î¿Á#LÈÄÊV»Êp¦EµòIï!¶§¶³)ÕÚ°·&”l˜å•™—9]81ó:÷º)u´&ee-_¥´ºm<ÚòY¶É6R:U¥–…®5J)$¦ÃiÊ“>‡ì!&C”¾ª›sDÓ®;y$þ[lIn!L7<½dKL†“¼œy‰ò¹y€Ôõ-v¯†;µ&‚1þºòWüÛÞ?aGrDzjÙ9ýY #ìà+±ItÒã½\?9§²6Ðk`ïU·roìë}ŒM‰M+¦ð¯f^åXáoÏ£`‹µ›¸þuèWí4Ë2Ž’“eU&í,n$Z$økh÷ÚÙäµÑ¢Ú(Ê(³&ÐEiÚU;íN;i/]+W«ï(Fƒ†üK”mKxCÀnÀáK2ÍBúB®³R…5ÌppòMž‰þˆ‹•‹|¡ó xª~:í:.[»¶ò“öÓü—âeJ¦ÑKœõå2MððøRó?a_Ó>RÍ©†HÅV©Œð½‰¿åÍÜAüZ’£®AÜ-²ÐßU»šúËUi5ô-ÕÚŸ^çÅÌ‹\*_¢` ?çjú’›ùð¦ì×ûÙÆÖ+öItò!çvö·ìg{zûŠÅ<Óá4¯Í¼ÆxqŒrÅ¿Q†}”²ÀÃÚ%ÑË\4£àHöM+—øƒÎ? ¢#$dò‡®x‰Öw߉g=.Ê…Å6¾‚‰‹…^ÝÃÝÎÝìnÚMG¼£á¹¡„L¼2ý2Ó• ˜ù¾¯k&÷‹¬˜lèAõ‚B¡¡Œš?´’eÇl–iB˜ñ³|kð¿óó™×çªEë>å¨KSs_îüç|±õ 41"âÌ]S)ê³SêîøÝüÓŽß§5ÝŠs(†wroózæçüpâi¦ÌøœSmtý«=ðí*VW@)²Ô²c©w¡4È…Ò†+ÄsuxË­\kMg²“͉-ì‰ÜJŒb«×”ZмôpÑlÖ[ØÛLO¢§º{ƒªO%TëKΖϒó„bçfj£ë_í±Ybݺi”£”Ï»ùc¼6õ3^˜|âløUï|¥èkï㞎{ùZúëlÖ[Vª" ÛÄ£_àÍŸ`gÇN\§¾u6`&Èòwc˳“ÏÌ×6m€nDwYFY7J©ÿôÔ²ŒT%¼Yx‹13ÆMw°3¾ƒÞh_Z-|jË'yóü¯ÙdZ9dá.‰DÑBšÍN/Ÿï|‚=é=Õ¶˜c 4À¡Ü!ŽeO2æ\½Î}¥k Ì‹VK1Z÷~1¥43É™ò9.•.1ê­X+èiÎD'Û½íÜâÜ‚n°íG«j¥Ëé`Kb ÍÑÆµ¡„Œ#œ*žbº’¡–ÙHcýõpU- Â29üîk¹ŸÛ’·ái¯nϦr^Êã‰Î'ÙßÏϸ)ëpîZá³éǹ'q7›Û6‹Ä‚=TâÅéø³áÿAAü A# ,¼\Å0ÎåÏs|æ8‡³‡É‡ùÏïHu°£å>û ;ÝsC”[ÔfîJÝɇšï¬J¯ æeÙ–ùYægôç(ø•–¾/ÃoAŸ“{YUQ-\€P+g„ ~o åAá™×é‹ö‘t“8 æT3®çòHÓg)ÊœöÏê€( v:;Øß´Ÿ[›nÅÑõ?oÄ39^ú)gòg Pów'ꆀ­êü]·î‚4J|–úH»²<©ÃA¾yé¿ÑßÌ9À®Ä®úíàÄ£qÝü[ÇŠÌø~î¿AŸ×Å¿hû*;[v’J¦RĉÂqú‹ý<7õ<Ó~œTù+ J½Wå4åêù<°¦ýiÎÏ2P  ¡ÕJ“Цè‹õ±7º—mj[íÜ’¼…x$Ñ°ÌØ`x¯üý¥~rA–Àú‚¯e¥bÎkúÄ}ÅÓ£?àdþ8Òh´âÖ‹FD’îï¡ÝvÒiºèLtro÷½xQ¯®u ESäé‰ppæ×a0w­8®Ëª½8¹Â{äÃÏM<Ë}ÍØŸÜßðüM©M$¼mM›ð\/Þ¸ˆ~*˜âgÓ¯ñvæ]Î.*ÃF×ðZ“7teœþÂ[b[Ù“ØCDÕÏ^<×Ãs<Nµ¶¤Ø¡„ä‚' '˜ô'(†…[ø!³½=§X}=|.ã”E\®.ãVRàD 9Éó­¡?¥D‰¯‡ÝÉÝõA¯¥á„©jdñG8R8Ì7¿Aɯ,ЍnàóJÝðz±Ó´jñÖyX±”ü 's'ùÉÔOÈ›ü²5ÐUÇùb8˜ýG²G(TJ±«¾Ý.pœFV¹ˆ|-åJ»Ú”(Äù<íòXÇcxÊk¬¯vÑycúœÈGÀ©µ,ÜP W—-svj¸jN”╪GÏWF*­*]bÆÏòÃæ²/µÇ;¿¢û,r²p‚§Gžá’‰«ß]x“«ÑÊBœ®ÿ~u B (˜' 'è/õS0…ê¦Á«š©–ñ`œþB?Óa†²ñ7lx-åzι„(áPöM~:õ*—*—È×)$z;÷¿šþ5a%#ˆRUþÞpT²Ce¥>à1 é4Ý­ …ly†ï~—ƒ™_Î9мÉóVö?ø)¯M¾F¨n®0ÐÑMNóœ:ª ®ã$Äê„‘kâ@Ah8•?ÅÅÒ ¹0‡ÅR¶eÞ+g¨2Ä„?Ž-¼ÙàNs–³5Iw¾ØÔ…ê>J[ÛÈú9Îe߯nÊbYÜ«R/“¿Ü’Û™¹P¡ÌÁÉC´{¤t’Ïw?Á{Åó|ë½oq©p±jîïJŸí¾´ ±BÂM°¿i¿$j>É¥ÚkB_ºg(/Ù^'¡™ç¢ë-OXNOð̤Âu"ŒT†9S8GÙ–j)üNdAZo!¡’ìmÝSH¸‰9Àó½ÉÍÃe©ô:D@‚Å+×'®3·húËgxß¾‡§£ä‚<ƒ¥Ks›WnhË^Òš£P$Ý{Zö'ÜøàE€ÝM»¿ŸrSñ¾XϾa;JÞæÁ(”æ· W—Q e ¤*gVJÏ=WÛ¼ò&Ø ª¶!›2ÕhYYEg¤mÉ­ÜÛñᯧ¼ô’(Åý å%vF»ªïâ±Ü8²¬í†–7ЦÌÍ4fû4µhºb]tƺIF’?^è4HDgÛTûÌÇ»>>fÇ¥e,7êI¨]}jsÉßõ –›m£œZu¶ú¯2àØ¶ŒÛ[n?‘öÒõ3͸ÿãO÷>œÍ˜ÌÏÏnŸIÄf[bDÉ¢õEµŠÍ ÖQ†Ø¸&-Ríh¶Õ ;E’îH7Ÿé{dz[rÛß5Ì4åLw'º_ïNtÓ몶 XP¦vX…[]¨ø`Ì[†UȬu[EÊIÓï¦/Ñ÷FG¬ã?5\¡H{é=Ôù‰ÿó•]øB‹NC¨«mø”µˆÑÕ†ªè ×Â>ŒB™Z÷”­.!>Ðö€ÿG{¾>Зêû\ÒK®¬¥(m±¶?¹­å¶÷?×õø‰[?zBå+ VAW³Oô"èR×(°U°ÅT©$®â<Ñý9>Öñ±¡=Í{þ>ª£«{[s¤™´—þÃǺ{àhþ蓳‡¾f­ñ¬ª>A%‚8 1”, îZð¨Öa¿¨ ”ž×·¥ ² PVÅ£Ãi?õÛÝOîhýÐO¶¦¶þ»z—l(ϺÊåÃ÷ýbGëλzc½¾?ø¿[ÎÎõŽø“ˆVàXfKJ”PÕnËjI·ZnÜH /èU•Ù9TĈҥÛó¿Ë—¹5}ëøÇ»?þñÄBMjµ€D(-´<»#µSßž¾óËi§¹÷Dé$›¡ŒO9¨Ö`+GÏ})UÛ(B®ÂÊ7 ÜJ–<ÿZ™‡VžrióÚhÑÍìï~ó¶Ô­·$vK:Ɇ]ÑpïDÎù?Ά¹}O_üÁ‡dßúvî-ƃ)BB” R{³ÇºÄÒi5g–/g[ChrÓtFÛx¼ó‰Ã»“»ùlßcÿ¦Ékz}5ïDž<j/þ‰ÔÜXƒU–ÉòÔßO†ãûÇ*ãœÊÜ7]ÉpªpŠ÷ ïQ´r6_‹!¯ÂÂ7àÊ*!©ÓlKl§ÕmcÓm²5±yjsrËÌ–äÖg“Nò?·ym#Žv.ÿÊõE”rÞt´CDGèMöü5²9ºåKq{t¼2~›Bõ¸ÖéÍÙYÉ \e«Þ8ÖQÒº™]‰ÝtxÜÝrwak|ë7ú’}ßLGÓWü®¹USÊŸͮ¬‹ª¾ý&´!{@)uI°‹Ê¨´Ö/_1ÞZŸÛH‘`õ5ëºú¶@í¢Tõ'j :Çš_íÿýl€ÿƆñ¿¹wöàŒ¿ãÿ)+‹4À­IEND®B`‚enigmail-2.0.8/ui/skin/images/modern-attach-active.png000066400000000000000000000037541334302754500226600ustar00rootroot00000000000000‰PNG  IHDR2!›}ø„bKGDÿÿÿ ½§“ pHYs  šœtIMEÞ ;%•ûb9yIDATXÃݘ[lTÇÇ3ç¬wms1k{×PÛ Ø/™R¨ml ˜µUJÚ¦m®E"ªˆÔJíCªJ•Z ÚF%J0 ˆ†„ÚÁ ¢ ¥iš4¡åbⵃ ì5^¯/{.3}X×$´QÖæV1Ò¼¬ŽÎ™ÿþ/ß|Ÿ¸Óšû`™=Ý÷ä½ú°¾Iú…qO€h×F@¼µ!ÚµGýNqáâµ{â‘ëû—£®ýo†+Úƒ’cÿÍݘ™SÑZý¿¢A„é£sûÓrÌ©A D[Nsù­£xçüïôïÜìw“aúˆìZB 0‹œy ÐŽƒV´fÜäi¤çp®þ’Ô鈙Ûê­t¼›ž¦3ð~ݰ‰µ kG-™ùcÉ©¬E».H“¾Ëh$FjRJ¦ý`=Ö_ÎÀ{[G$/S¹îmá‚Vt½XMþÂj:ß}–¾x/©åë“H]%ÙE“È©\Œv¢áó\|ã¤çá^ocln>S}!m¦=ñÿzá—Èñ“ñä/º{Œhå"´EäÅ9äUÍÃ?uS–¯eðí_Ù^M ”O°b1Zi:Ž5Ð~ê#2V¾OÆ÷Ž‘¹¾¸·”+'‚ÖH)™T±˜ 'î^üjå 1ñUòjªÈœQŽÖŠŽC{1'?B÷žeä”N!ø•j„V\:Þ@4â#µp>‘ç§cwü­5iUÏÐåHe[Œ/*Þ3ÉKËUê–ŠšPqºë*É«œ‡¿¸¤­aýâvµ(œ@vy%èh~žH:f°qq­#üÊ |µÏ#3¦‚Ö¡QCÅQ¥L"Ùó:µ´kt×U‘_]…?TŠVж†= Ũî6rŠfW€NÈ©'’‚çÁŒpEß]‹²,rkæòÇ@ø0™y¢]izˆ] ƒô$/-×uÍV®Íõº¹äUÎM€@ÒÞ¸>]€ “=eü‚Žæ?éLÖ#?ÜFÁckp-›žÖó„7#ÇŒÃmÙ˸Âé‰jßÛK{ã>¼%&}ž/dÄu†!?ÅD„¤·~>ù5•øCeh¥ikØE¿,FELd—W"Pt47ÒÝåÁ3± Ïå?RøøQ¶E¬ýí‡ö“þÐóÄßXGhõÓH!p¬8-»žÃ·l/F lq¿XƒŸyÆuéÛUAÞüŠ$í¯ï!¦ P=í 2Ì®òD#]i˜Á™ ß^‹²m¢áÂM‡I]´«ù)ŠWlDJ3hqvûf¼KëÑþÇMº–˜#J'g€¾ÝµŒ²S4GXÊÑJ!¤1¬Líº Ú±ñÏ('sÖ<´cƒVô¶_ µ© ÏÂß#ÞÚHñê ÎnÛ„X²9¡5Œ’‰ÒÒ*9(03pb=¤ŒŸ€ôzf WNŸ%«lB ¦¤$ÚzŽö×_Á¬þœØÀ´•Cé4˜`B×Ö£³Ê†Þ­GÍİٕ«Hv»Êìú­é9ù¾DàËüsÛo°zºA\Û"Övpãk¨ªMÈS?#´j#†™ˆØ³Û7a×¼€Ê(A9.JiFr†ÏÛâÍwÎ$÷W¸6:ÖÁ˜¿­#´bvo”Î+œ9pŒ”qi¸®`lj”xô:ñHáË`|n€/}íx|>œxœó;~‡S³Už`àåô™âpüíÓ:ÉŠÚÅ8º†ì  ï¡o¡­A\ÛáÃýÛpúñŒ‡;8@FQ E%¤rÐŽƒäì¶ÍX ëÐB o‡Å IDATXÃݘÛOTWÆûœ3wAî22› ­EÅ[Ombª1¦·¿­õ¥ÄD{3jS)jf@åŽ-E@p`f¸ÍÞ»§XšêŠe%“ÌœÙgïõå[ßZk/1ÕšM`Vdr|3àÀ`“ئbmÔÁƒ=!"“£H¹@úŽ|ü¥U!V½Ÿè{2öÆÅþ¸¯®Ž&„ø; ´V9ý%ïÖ·'´´Ö(¥V<ÓZ3Ф«£é_ß»uýfbSoç#LGÆ_!„à÷ÁNz;ïØÏs ääïÆíñ%×)EãÕ¯‰G#è«‚èÑëÉD<áö‹€àÐÉ ¸Ü>„a0ؤ¿«Ã0qº½ÔÔŸÅátÙï¶ÞºÌäø¸=[8|êóaDkÍtdœÛ7.b𠆉aš6o‡?úÌ¡µF&ø îc{¯Ù™(s³ñEh¾ù-R&¨?ýn¡Þ6„ËíãÃãç¸×r•žÎ;!†L,bñ 󳩥_ùQ¦jJIbÓ“´46`šR&¨=qÓá¢÷a3C½!„aàõ¥Q}ôR)¯3:<@fn1[Ó2‰MOÚâtûHÅ7k=˜hil°™8tê œ.áþ†zCI&\^ªžàQû/6ˆŒìBÒÒsèn] RòŠÊ1-GŠŒH¹:M(E<¡õׄa •¢úØyLËIßÃfÂý톉˳…G>EJɃà5ž=}l3QQu)%mw®05ù€‚â {kIÕ¯—2"¥Â4WJ)$Øt a˜h%©9~—ÛË“ÂýíI&<[8XÖfb DzæN*ªNÐvû2SÏG“鸰ŒÀÞÚÕµ(R¾<—¯ÑZ3Ÿ"Øti‘ÉÁ£ç±n{B„ûBaàty©ª;ƒ”ŠÎÐ5&Çž°#{{*O ¥âÞoW˜ŽŒ °·ŽWñgÍY*lÁ¦ ÃD)IUÝœ./áþ6Â}mvŠ­ª;@wÇMDzV!{*O$³Vów6ˆÜe*êÖÖ4J%SÒÅR,k­1-'–ËC¸¿Ýátyy¯ö¤’tµÿlƒØž¹“òýÇ‘Jrÿî÷D+V^ þ=5¤âÇÚææbv“·-=Ó´÷…ì5ïIj¢gYE”í?Àƒ»?Ø ² J)Y¥&VQ)ĤVй™˜ýÛ4-fãÑÖôÞo$21b´´Œ|Þy·%­?Zb"€¿¬%Õú‘J§Dãpù–iF`:^†ÍLÆÁ]¤îÝ‚»#„ñ|ÀúÕ‰ìÛµ!fMÃí.A” š»woû–~¥Z¼¿Iéáj~I ñX­~¸Ý%¼¿ÿ€@ö·‰ôÔdÌfzO<‰sÒ<¤RlúúsNž8@D˶<õL# òóŒX°9êáËÚª½¸®å“”·»„)3“¨hãHú^ÒS“²9pNšÀöM_pª DxD Ÿ ààþ­†ÔÚtèŽÕêç##÷¥ÉÊ3!¹îÊ'éÓi˜ÍRz?5:þuIÙ³™Œ;±X¬Ø!Œ›8)%×,âì©ã4kÙ–á£H)Yµd9ÙçèÐ¥}ŽÀ×uiÿ½`…ÙüïPºZËòÄh𧔏鋲98’¶‡Œ;Ëä‚sÒ|¶mXÎï§ ¬I$ÃG;½ÙjñGä^º@Lûnô8¢jEJEeÀ”ß ],Oœ€ÇSÊ„i‰Ôµ‘–²ƒ´”í˜ÍAvÆN˜ƒ”Šk9wöM›Ç0l”)_.E^ˆè˜Îôò&•YOµcä^0&%Lõ2!=Œ?›À ;v’žº„ $´cÆÏ`Ǧˆðˆh†ò2ñÕÒÙˆ˜öÝé?äê™F©*¯E%%ÙY™Þk]QÇÏŸ@›Ã‡v ‚lÞ~o&RI¾ýf1™e šFñÊ('RIV/›Ã國ÞÝ=¦}Ä—uTŸtn †‡c±úqèû­†qrNöîÛ7,#ó̯4iÞš¡#Þ`íòyˆVíbé7xtÍØxåƒ&u©s«ø†qoõóçæÂ{º yóJ².œáîb‡µàåWÇ¢¤b특\Îý€¨˜Îô0%UÍ‘ªòVK) {½òV€@{…1§N5®›4kÍ ácJgݪùˆÈÖé=p4¾Ì]ãåžG2k¹ÙÞxé3¨Lå,Fã° >€u+çrŠjÓõŸñ5yBTºÔšÏ>A-˜Û·Š¸Yt—ë ‘ímð4É—¡”¤kÁ4î€ÒëW.àJž—‰Ñyñ¥×ñiÎÊÚø#?Ÿñ™ßÓ¿ýÈþk½qb­ClÏ!DÆt1žçå\ ëü)Ž;„§Ô]–ºÐ³ßkìÔY% º®süØA2R¶±?#„@/KÍ£:Ò{à¨[|ðT1G·ëŽf±rpÏFL&ÉlAI B „@zJ½ãÚÆÛk(žjîÔý¶hÕ GH}Ž=ÀÛŹ@]›Åб[ÿ‡VÐé?¬±è.ùXýê<üº–ÇSƒ” oy§´ÔSá´÷¿+Е¯S=|F¤¢6´ÚSû­êQ÷qksV[ŒF’ÞÀIEND®B`‚enigmail-2.0.8/ui/skin/images/modern-encrypt-active-force.png000066400000000000000000000034301334302754500241630ustar00rootroot00000000000000‰PNG  IHDR2!›}ø„bKGDì2XóJ pHYs  šœtIMEÞ 4úÒéu¥IDATXÃí˜kpUÕÇçä>rï Iî½Ä¼†`Ò`CÂ#ÄhbÌ#BlAm§u*SZ«´M§¥k ¬~iÇÑÚÎÔfuÚ´†‚ )$#™< ’˜Dàr_¹Iî9ç>Ï).1TËtͬçì=k¯ÿ^û¿×ÚKò…à&Ãð÷fÀÌM"ÿò™ãÈ2|Þu‘c'Úhmm¥õŒ&÷a5O¬_‹Édšöõ¤=Óvki¡‡ÞnáàÁœëëcÁ,®­¡8?‹#­:x€ÜYù<óÃïa4?{@\n/¿ò[Ú[±àŽ –Ö×S8Ë9iNWŸ‹Þ^4%Lw×i~öÌq:Ò§È™]SâõûyuçnÞk9ÂʇWÓPWõŸA!@’&>ƒJˆ7ö¦¦²’öŽS\¸àÉëp¦§}zd¼àbsÓZµ{F/ýê“@ˆq£A UÑPÕ)6+ÎsÝ]ÌÊÍàÕ×þ„/0ü߉FÙ³w?k¾òU2s²x}÷ï&GaDP !t¢9ùϽÏåçq‹3šò…üóÌFÂ:å·c1Äøùó¿œ0Rwïù„ŽÖ±¶~óò¯‘“t76’ã°L*!„H’D’¤SR<—Ë…Û?Œ‚”d#ÉÉɼóÞqº>t±ìÞ{PžÞÓ´µžâé-ßg¦Ó~c<öx#ôtòئÍÔß9ÿ —Šª™WüyÜnù5b±Ñp˜lG2&£‘=»ƒTûLroÍgöì<úûðy4mÞˆÃ>5Îâñø5'íébë¶íäÝ’~…ãÿ–‘ðØ~ ù†e™ÞA²ÙF,àÝÖa3²æ‘/Q]s7)Î,|^/Ç[[Çv4c×¾fÖ<´›5yúb<®“5ëV:ººéí;NÉ©V+)6V«“É„‚h4Š¢Åq¹‡ j`Ð5\Ï„³æœÙÍ©„# k£TT4UÅ5ØÏé¾AÊJæL%"ú5'U-YÁá}{x~ÇVº{/Ò70ÀGŠŠ4%ˆÅ–‚ÍfeNN€lýÏh}ÙØ5?þó6UeE±ƒÑ€,Zðužd¡ã~ÓJ•ì‰5,V+‘aÔ+‰ø4¥eÕ²ZÚŽ¶°óõ7yôË+ÉÍÍáܹóô óBS‚dºX÷õ;1È#`,E$e^^Rì, çײû­ƒdTTþö—C¬ûNSæˆ~mŽØÓf°výz^ØöSÊËËÉÍÍ!3c&Žô4üaÜ>^·¡' ‡HB8±Xœ˜ * ÇlhšIò‚©ˆH¨lÂþÑÇùæ·¿Ë}wýKħ)ç‘Ò¢¾±q{víBS”‰ÿŽô4 òò(ž[DnN`@ú5|ž!^<ô¯ØÄh`eHeì=j@U#•æ}äÑÇYZ]þÉ¢×IDª³ä‡yaÇv &F£‘H4Fp˜«L„€x$„ˆŒPRhbù¢’ÅEô¨61®ëpà÷o°¶ñ)–×T¨§r\$ªf£L]å"¾ö­Í<¹aÑh“Ñ@ŠÍ6~ÃÐÇIɤ9ì(Êí¼ aÎ!.,cc:t¶½Ïú§~@ýµ\§×õ‰ {ê î©,ƒ-?aKSÛž{n""ñ¸’„.$"" Ý줾ä ‹: MhÈ’Dõ’æWWOØ^º÷ʬ޼j(q²ëBŸÒ™¬«(³uÛvFƒA4%ÄÙ®!šHÔH0"#„Š.ð$áu›°X‡É²Û‰Æc$É2Ë÷9¯ºÆÒ½v~Ñ—X‰rôd÷u•ñÃä ¾}¬ö“m”-("0ì§¿§ŸÏKíâÅU EaÈ?Š,Ëè’‰¢â¹”`0[0˜m¬jÎd/ð´“ôg';¿¿Á3ýe¼.ôIZWQ @wg&Ë ¬ŽL”¸LÌhC7™Á˜JL6£ +¥•µ,®®&ufÖöi}òÊ1=ÎõèÕnŒE·—Ñüæ~|^:2Cn7ª6Ц„i?y-§¢ªŠòy…WØKDñë7bzœ»ÊJÙ°‰¯¼HQÉXuìqqôȪ–40o~ åó ²wù±ºa]”«íb,gY}5ŽŒL:NuàÈšE$–Ĭ£º¼„6Ë oI‡ÿþþ´ö~c—|†¤Ä(øà%„¿œìXzîÓ2Uyð²Ûëz@Ho½Û~Stãož–i"OÝÿù*%à^”€OIEND®B`‚enigmail-2.0.8/ui/skin/images/modern-encrypt-active.png000066400000000000000000000033401334302754500230670ustar00rootroot00000000000000‰PNG  IHDR2!›}ø„bKGDÿÿÿ ½§“ pHYs  šœtIMEÞ .cÜÕ mIDATXÃí˜{pTWÀ÷æîÝìnH²y4/ M 5$ÀalÿÑéX[gì 3@Ûq”©$†š*SbÐ’4I ËnvóÚ{ï>ïñÄØX;$aÁšé7óýqï9÷œïwÎýÎù¾Oò„`ˆ22488™#ò ÈÇÎGnÔÀ<ÓŠËåÂõf UåÏmàñ-›PU5îóIïö{ãvjÁ Mo´pôè.÷ô°ôŽJVÔÕRRÍqWMG7¿€§¿÷m,ËÇÄíñòü ¿áœë$Kï¨dͪUÍOŸÒ§£ÇMw_7†¢³ã?}ú¤§¥Æäâ{îYƒ úý¼´ïoµgÝÃX__ýïF!@’&ZW7S[Uʶó\¹:Ì“Û6“žšò¿söþ+nv4îä¡7àÌLáW¿üù110Ð5]ä°Ówe€êïb~^&/½ü¾á‘›ŽD8ø‡Ãlüâ—ÈÊÍæ•¿º -ˆ0MŠP²è6>]Ï-é)ÔV,ã‹ ™TVÜŽM‰ò³g~©³{`Z¿ÖÉÖ6^|þ×È & ÛÈM³MihA„H’D‚dRZ²·ÛÇ?‚‚¤D ‰‰‰¼ùÖ):Þssß=+Ñ5ƒ®î ´ºÎóÃß!#ÝycA}¬w»ÚytûVݹäC] °¸ä3x<^Þ÷D£Q"¡9i‰¨ ßÿñ^’äÝZÀ‚ùôööá¦qÇ6Òœ³ó%‹]³Ó¥®víÞCþ-©2ü_2_!ß²,ÓÝïF¶:ˆF"üÍušL‡…_þ<5µw“”žopS.×øŠF£ì?tŒ­ÅaOŒÿ…‹™dÏ¿•¶ŽNº{ǧD›ƒd»$‡»Ý†ªª!ˆD"hF ·g„€Šiàöz'µæ.ÀbM&Ù ¨°€¦cè:îþ^.ôôS^ºp6;b^³Sõêµ4:È3{wÑÙ}•ž¾>Þ×t`hlŽ$; s‡É1ÿˆÑ“ƒÓðãpè:kKì(Y´àk?˲´óøÕuôk9“sØìvÂ#ÉIv¦cÓ¬B”ï«£õD û^yG¾°Ž¼¼\._ §¯iÂ/ -@–ÒÁæ¯Þ‰"‚¥ ‘õÛëEŠ^bÙ’:üi˜~rh:ýs›¿ÙHæ¬}ļ¶8Sæ±iËžÝý***ÈËË%+3ƒ´ÔüÃ#x|>=^„™@pø„»"›-«¢‚PÔaø‘¤AP‹ Ë'Ç?ÑÜÌןø÷Þ=þn:6Íú)+.äkÛ¶spÿ~ M›|Ÿ–šBa~>%‹ŠÉËÍ„€€ßÀç⹦ÇyùÌvƆGІtÆóQ]ÐtŽú=<ÖÀššŠë»͘Ét zy «?û0Ïî݃¢ªX,‘( 036™±p¥´Håþåm$Š«˜c²Ý4áÈï^eSÃSÜ_[Étíø(•c¦`ºjµÈÔW-ç+ߨÁ“[·‰DP- IÇÄ œ’IIs¢i£ü¥ý6„5—˜°·™ÐÞú6[žú.ëï©c&6|”Î(D‰ gò5«×³veMü+S˜³ú°¾² &`víÞÃX €¡¹Ô1DÈPG,Â2Bè˜B ÃÞ=*6ûÙN'‘X”9>IªtâlçŒÂxE™zb¿q²•sg[)_ZÌðˆŸÞ®v|¾AêV¬  hú(Cþ1dYÆ”TŠKQ^\ˆbµ¡XqËg¼¦0§h}eím¨¶yØÓ²Ðb2Q‹Sµ‚%™¨lÅvʪêXQSCrF.öyθ¦¼rÔŒ1ýo'ÆòÛË9öúa|ƒ^Ld†<tc C qîìŒ`ŒÊêj*1Óù¦«×]|ˆš1î*/etëvö½ðÅ¥ãѱ×3ĉãÇ©^½žÅKJ©X\tC«(RËé\wÎÆP”N·½CÛù6‚º†Eµ’ý©ÔT”2ÏaCQn,Hóßߎkí7ú€OI¸ye³¸×µn¦ñSæÆLæ‚Ì’étRÝÿù'œÞÂ#ï8IEND®B`‚enigmail-2.0.8/ui/skin/images/modern-encrypt-inactive-force.png000066400000000000000000000033661334302754500245220ustar00rootroot00000000000000‰PNG  IHDR2!›}ø„bKGDì2XóJ pHYs  šœtIMEÞ ¡{@XƒIDATXÃí˜}lUwÇ?÷½÷œ¾Þ[ RZ 2íhi t´«…JŪ Ì6ßâˆ(²Mè„M1JdÓÉÌ–M—%sšh²„ÝH°]YÐÕÕ ­Ðô°vmy¹}¹½/½çœ{ïyóÂ]K»p[J6ŸäùãœóËï<ßß÷yù=e$bš,±‡£ VˆüÈG.FnׯW|C4Ÿi¥¥¥…–¿ŸÆátò…/ÞÇwwïÄétÎûÿ,Gæ-k)Ñ( oæäÉ\îë£ä®r>½i#«Wæpª¥†“'ÈÍ[É“?þ‡ã£Ä7<ÂK/ÿ޶–fJî*§¶¦†UyÞ)k:û|ôô¢H1º:{øù“?ÁëÉœ? ÞóÍÈèØxåUþyú÷< ƒW}üòW/ÐÚü6;þΓAŒ……X,V2³<44ý¯×ˆâOÐÐt)nå›_Ù>/`f•µâªÊÑ7޳ã«_cÉÒþøêïg Ktuv1컄®ÆP¤0{:Èõ¦ÑÓÝC(jP^¶·]ãÏý0tëŒtõ^IŠ‘æÖv~ûÒo°Ú êöÖ±Ôãžò="EL\èî #=`0ˆÍ)`J$ˆÃáàÝ÷.µ ÔÖlF‘º{{hm9Ï¡ƒ?$Û›u{<ôH»;xhß~j6¬™`² ùP¤0ã‰ew” iQYæJ_6«•×ÿò&Ù9KÉ]±’åËóéïÀ?äÀþ½x²ææfv]×oºèÝîNž8ü4ù‹3§~]±‰óèäcÙ™Xœ𦡯UÞ9ÛŠ¥b} %k×°â“ÅøGGùWKËĉjGŽÕ³ãK[…”ù/ˆºn“·‚öÎ.zû'Ü)Å-’.¤Š"‚àÆétbš&ªª‹Fg²¢àI›&àr¹0MY`UAIF‘e|ƒýôô RZtÇ\1nº¨rËVå¹gž «wˆ¾.I2& HÜb*¢(à´Ã…smˆB ši%¦êD™·€ÝagèÒ0Mj„«¾!R³€ÛíF–e¢ÑhT,'"ÉÔ{©£¶ªìÖ ¢¡$£•ëV³eû<ÿÌÓØNqU#r ˜‰™(Šš¦¡ª*YYY¸ÝnTUE×õC&&'þô;ëçóËIÖŽR«n˜$«.‡•êŠu|ãáý<¶gªªâtØIÅ€ëb³ÙEEQP·ÛÕú¾tžû»ÿÛ>³‰ÙØðA:«~D7­d¥§±¹¢þ”ƒpøÙgŒ0)mØlöDZ6M—Ë…¢(ƻյ[Ùº¹*±¾öéU½þÞÀ,\Ë4˜‹V—¯åÑk`REÓ4‰Çã"’D\#+ `ˆ±@ñH„h,†$Ƀ!r{ÐtÃ4fq\²öXšÎvÍêök·O%ñ­æVÚζRZRˆ?¤·» ¿„Õ›‘IÇjµbà¢pu!¥w~—Ë…+Åͽõ¹Sö ò’ù3ÿ”wÇ·ÌÏ>3]í¸‘L¯Õ0±¹\Ø]vœN«ÍŽŽ‹ ••Ônº›ìE‹IKϘזת:³Ñ™2ƺõ¥Ôÿõ8þÑ ¬†‡‘•q)FÛÙ3(QòÊJÊŠWMÛ/IÆ®[>h†ÎÝ¥E„÷ìã•—_¤°hâv<2 éÔ)*·l£xMeÅ«’ÚïF·ºmS”™NQÓt>WS…gÑÚÏ·ãÉÉ#®ÙØþõ]T•‘&ºoû8ÈÒøÎ¹yýj“.|v[r!xÿ¤€¿1Øÿ\{ùÃ2W¹ÿ†ì5–¿½Ý¶ ¦ñ gdšL«û¿ ÿ=-ýjæ2YIEND®B`‚enigmail-2.0.8/ui/skin/images/modern-encrypt-inactive.png000066400000000000000000000033031334302754500234150ustar00rootroot00000000000000‰PNG  IHDR2!›}ø„bKGDì2XóJ pHYs  šœtIMEÞ  í¤6+PIDATXÃí˜}lUwÇ?÷œsϽçܾßn«”¨L;Z(í*PAl”1“ÅÅ—ÄÑÉ6¡6Å(f&˜%ÛL4&sšh²„3I]YPëjV¨}CÖ®-/}»½··÷œsoÏ›´ÜѰ…¶\æl|’çs~¿s~Ï÷÷¼?ž‘˜ë²H.,ú?œÜ©_¢él ÍÍÍ4ÿå4^Yæó_x˜oïØŽ,Ë)?Ïsi`$eQˈǩë4'NçJo/e÷Wòé ëY±,SÍmÔŸ8N~Á2žýá÷ðz½= ƒÃ#¼üÊohmn¢ìþJj7mbyApÆžŽÞAzú{0´ÝüäÙÌÉJ‹ïÎÈèØ¿{õ5þ~ú>ò0[kª“k®ëâñx’Ï1-ÎëÇX_UEkÛ® Exz×c³2ÿ{@® òÒÏ~AKÓߨöÄ·f¸ÄØØ8ããa<¬ìêÏ Y[ú êÏ¢M |ý˥̜¢Ö¤iräÇØö•¯rÏ¢<~ÿÚoßÄxT£³£“áÁËØfC‹r©»ü`:Ý]ÝŒÇ*+Ö H?}áç„"ã·¯‘Ξ«³ÒHSK¿~ùW¢CÝ®:å(3ÖcZ<©‰‹]ídf¤‰DeÇq0b¼^/ï¼{™¸¨R»i#†nÐÕÓMKóöïû>¹Áì; äñ'ë¸ÔÕÎã»÷°iíÊ›ÜHÃCƒZ”‰˜Æâ{˰, €¸®sµ·QxãOo’›·ˆü¥ËX²¤¾¾~B£öîÙENöüÌL²mû–›ÞéêàÀÁCÞu“à×)š˜ºÞþ>–›…GV±, sÒàís-˜ÑQªÖ”Q¶j%K?YJht”47OݨeqøèI¶}q ÕŸú„hÛyKië褧oÊœüJ€ U%-@UdYÆu]LÓ$311r:ºa082’67]Åçóáº6º1Àò¢"bšŽ¡ë ôÑÝ;@yɽóшsËMÕ›·Ðpô/<€Îž!zûû¹¬é¸€¡ÅPi*²Ï·PýX®@´‰:~EEòJ ]¦ÑŒqmpˆ´ìñ=?ST•ÉqƒŒ4•ÙÈt“œï껥Œ†#ìßÿ…KòyôKMˆ\¹r•Þþ~ MG×bSþ QR´˲øý3M$‘H‹Å$‰°aâKË!¦éüõÍzûÎ^Ö•—Pç¡çÖ>’™Îö;xñàsTTTŸ¿ˆ{îÊ%'+“±È8á£Ã#hÑ0CCCD£QdYFUUÜé¾Íãñ`‰D‚ŒŒ eγiÞydUqߨµ›#‡chZò}NV&E……¬¸¯˜‚‚ÅÉl~ýöEA×uâñxT">ILÓ9yô }²ŽÚu·—Ûa6 P½z›z„Ÿ?„$Ëx½^&M‹Ø407™-ËÂ4M²³³QÓ4±m;©!—ãxíuÏð¹õ•ÌVŽbÁv\fË>¯@MÕj¾öÄžÞ¹Ó4‘½i@ÀuE‘@ €a†¢(Â{ÐqþŸìxælýÌæ"ÃñœJÛÈÎHgcU9Oíû1ûöîNŠÓ¦vCØE)–ÇÁçó!Šbr½¦v [6®K]cå¸Î¼>¬©\Ó`<ÄD,Æää$ápM×ñûý膦Óšr‰'Ó ÒCñÊ,ÛDÄÔT¿ç:çTýJÒÌúVS ­çZ(/+&‰ÐÓÕI(4Âúšh†Ž¦G M >ŠWS~ßÇñù|øüJʺÅ9÷ìŽëÌàšÊUt¶·¡¨²‚ALÇEôù|²@%l|¬­®¦vÃäÞu7é™)my˱™ ¿_ÄX½¦œ“>Fhtðð0º1¡%h=w#nSY]MEéræzÞlù¶‡–có@y Ñ»yõ•_R\2U ‡ió¯ÛîÙ-ËF’Dδý›¶ mÄu ¯ì#oñÖU”P$ñÎixû|Jg¿Ö Ÿ$~xc³”ϵ>LágœkÙ ÎÈt6­îÿý?nÜ®ØHã=IEND®B`‚enigmail-2.0.8/ui/skin/images/modern-sign-active-force.png000066400000000000000000000034221334302754500234400ustar00rootroot00000000000000‰PNG  IHDR2!›}ø„bKGDì2XóJ pHYs  šœtIMEÞ $zq‚gŸIDATXÃí˜{PT÷Ç?wye¹ÀÂ>Ù‚ÂàDyE… ‚0 ñÕ&餶ÓÐIÆJU’QÛÚ1¯†Ì„1q&±ÔÚ4ÿˆ“?Zm« +C±†¤UPÈË…ÀÞ½ì²÷Þþî@ u1Í0ýÍœ?îÌ™ó;ßó=çwÎ= CÓX'ðóá¡…€ äüÈ×®Fî–áÏúú±5·ÐÔÔDÓ‡ ³á[²}ëÏû}Â¥žÁy{µäñqj?h ºú$½]]d¬Êa]ÁZRc©kj¥¶ú$ÖøDžÿõÏ šiÀÝ®¨ÁVt!4MC„¯HßÀ o<Äù&«r().&9Þ4M§­«ÎîNdÉE{Û§¼ôü^LÆH4eÍ=BÈ¥=X’Ëí­g$|1k|O-UQæ `ÈnçíÃïòQC›{”²Ò}_ª›ɹæaÖææ°ïƒì.ß‚)Ò€*Û»+ðh\ësÐô±Háâ¿â— 7øÆÈ¿®ôùÍHÏõ>^Ûÿ-¶Ó”þäÇl.Ì›UÏ!Oû>Ùp“ÙÌêÔ¥ÔžiÆ5¡ðÇ×`ý|?æ”"4Ͻõ' ¾”˜0^!‘ÀèûæÿÕrOLpäè J¿÷}bâbyïÝ?Í Â!Ï1êÒXŸ@G{£.œì•„JÄöÿsJ¨NPÝ,*(Âsy?W"èùžZŠªú¤hkiåoþ]€ÊkgÔÿ×èßrÞ·›h‹û@?§êj()XÉŽüvŒË7&ƒ6&xÐ *AF´‚?B°_ýóéù-Ûö—:.R¶sÅ«Óýà™ðÐÑù)’ìäÛ)ö>xcÊõ&Í ¨\o:‹;ã-]}Dñ¡Ø/w´ñ\åË$DGÎêø—9 @£ÍÆ@÷%–%YxæáLi…p„ªŽ# W?¨a4õaA"€ÑmQ•Øø%´¶µÓyu2îÑ‹D„†&Š„†ê½ njôÜž ú9×Ô€56‚g7÷`LÛ0YS˜èjl òÃûÙhè#3ÊâgW”Ûç`Þ9uìû^yŽöÎ~ºº»¹&9ÑYr ÃÅPÌ3aúPŒ‘‘ØGFhniÁ>Ð9Æ‚!,€òµ×0fl@Pǧ0¡ÒÓPÍ–"Ü@x„_|šS<òP-g8üÞqÿî&¬Ö8z{?£«»pJdÉÁå®.FíCˆúPŒÑ1X—$â–(£».¢)«pO2•NózK1õ ü¨ü—X¢ sêi:EU¸DÂybëVþÙÜB{g?13+3ÒIY¾Œ„ÄDBÅ0@Ç¿?¹H€^uI¢÷“9š¬¥"¦¤môÔü pÓÝXËë¶êëÎPºc®ÉB¯ÁŸ¾(>+–%ñdùN޼sˆíÛ·yg%c¤0Q$Údâ‹3b"9) “y2ÍÐ4tCõeb^ZFû[U`]Á¡¶BjOçÉÝ{)ÉϾ³éWõ#ó2S°?Æ«¯¼Ì3/V 9e’äÕIŽÅd6“°(·g‚±±1$YÆö~3ÒHÁq\w|§=”cGÿΖ]¿`ýÚÔ9ÔÅ¢ïJHŽÂÜL »Ø½c•UU&Š^0.—‹«W»‰µXp8$A‡¦©,*ø€sLTªÿö¶þôWl,ÊÇæåDÑtDE„S”›/P±g•UUÓQ˜Þ0e'öv4MC’œ ´Øšyªâ%Ö­^áÕ+95㾚G†}/vUS™‹æ¬àé›`ÂDÑkP¯éëïÃápÈNœòɉä”t:œ²Âãeå¬ÊðÚš Ä-p¾ú£SD'è¼R”›ÅÓ/P×xn:s²••?—ôþo€ÌõLã/áýÓçÄ6~á¬L•;Øk}Î]t«å‘gIEND®B`‚enigmail-2.0.8/ui/skin/images/modern-sign-active.png000066400000000000000000000033441334302754500223470ustar00rootroot00000000000000‰PNG  IHDR2!›}ø„bKGDì2XóJ pHYs  šœtIMEÞ #6~4ÀçqIDATXÃí˜kPTçÇgod9 ‹{„ ÂàD¹E… Bp[/Ó43i§iè$“JÒQÛÚ ±IÚ˜™86Î$¶“Z›vê‡8ùÒ¤­Je$b\7kP ‚‚ÄåâB`ÏvÙsN?`V¤î:'ïÌóáÌ<ó>Ïÿý?·óC>Mã.8†OG†ïè¸KÎW@¾t9r».þÄ3€«µ ·ÛûÝfŒ&k¿ñ(›7>Édšs{¹¾¡9«ZòÄ ï4S_„þžò—ó`ù*²3’it·ÓP„Ô´ žûåO17_€ÀTS*º+š¦!Âââµ}û9åv‘¿¼˜5«W“•f¿A§£ÇCwo7² ³ã#^xnv[š2%æÜvœYÕŒõ71÷ †¤•‘‡–ª(30ìõò—oð~s#ë{”êªÝ_¨» 1“­#¬*)`÷«ûØVûö+ªìEì­#¤MrÉãÃý¡HEúßñ‰KЛ­‘1òß ž¨é»ìáå=¯Òæzªþ€ ¥Óêù¤‰¾4ŸÀîp°"g Ç[ L*|ï‘•¤~ºGv%Zhœþ¦ÃVE’E£_ÈÀxÿÜW­àä$ß:LÕw¾KRJ2o¾ñçiAø¤‰›@Œ4ÒÓÐÕÙÅX@£¸hq‰äßàÈ®Õjùå•„ÎïáBË>óüÈCKQÕˆ]míüñµ? Ó«¼¼w/)6óÿ}ýÏœ?B0H¢Ówp€cGYS¾Œš²NlKÖƒ&ƒ6‰&„Ð *ÆxZùŸÀd%Rÿ"*¿Õ›žæ\×Yª·leõм¨„&Ctu„$û9ã:ÆŽ‡OcË^‹ ^¡•Ëîó_GУë#JÉ~¾«ƒgw¾È‚Ä„iÿ"ç?Ðâr1Ø{ŽÅ™NžyD=·®‚PÕ Aáâ;GËÙÅ(¢DQˆnɈ¢¨$§-¤½£“î‹SátY$>6‹(k7¸ë_ šÄ34ÄI·€Ôäx~µ¡[îÚ©œ¸Ž‰ž–fv¾ûë¬ æ9£ïìŠrë,}hÇÞ>Èî—ž¥³{€žÞ^.I~4@–|˜E ¢‹ÃéÀbŽÅ–€wt”Ö¶6¼ƒ8’œX-zjW]–¿A¸Ž •¾æzö¶UââmDâÓŒrä›_+§íx3Þ<Äãß^Ojj ýýŸÐÓÛ‹ø%²äã|OcÞaDs,¶Ä$Rf”}è•1L³hÊ ‚SL páý÷x¥m5-MÍ|¿öç8çYgÔÓtŠªp+™gã‰ùOkÝ$9,ËÏ#{Ébdd+ZŸ9‹Þl&uaF؈ݑHá"{æ&úŽþ ÒÛÒÀ+®bšSU³‡Wb6ljOŸ—ˆ‡Æ¥‹3y²v ÿºŸÍ›7…g%[‚‹(’h·soz:£Þa²23±;¦Â MA@7Ü„ÁX€cQ5¯ï‚Ô¥ì蘒áð!žÜ¶ƒ5eE³›~Õ(â±´ ïÈcüö¥yæ×;ü2>I ëd¥%cw8X0?…`h’ññq$YÆõ¯V¤qL)\ö} ¿7–·ßú'Omý__UŒ:ƒ¼ø\CŒ|B‰1ê¨()À¿•m55ìܵ “Ñ€EÃ`/ö’ìtâóI‚MS™_þºÿ¸¨Ôÿãolüñ/XWYF4>ÌɈ¢h:æÅÇQYRÈêž§nûö«Mñ# ú¦ìÇ{Å‹¦iø|*­®Vž®{u•es÷‡¨j*3‘Šâ¥a0Q _h6‹x<ø|>Ù_Ç'ù‘ü2‚N‡_Vx¼º–òåùÌÔötbˆ66 †kõ¡²¤êž§±å$+ s¯±"Ë7Ù‚€¢Å°¼¤ˆ’üûf³þgŸŽ€öÓ§¦òÈ|’ì³!Kd¿Ÿq_¼ûó(É¿ïö,BªB4¢*êMR°¬£‡sex#ƒƒa§þÝŠ<¡P\ZJQnÑÚ‹Tf½|© æ0V³…û~Ç✩éxhp„ã”>´Ü¼Šr³nëEhþà̬k_(¤`0èù ýcÚ?lgÂ/a4Å|o:eE9ĉf ýírìÄé9Ýý†®KbƒþÎ­Íæ|¯u'¿ÁnhŽËàW+ÓÙ2¢Ìb¯õe:ÿ‹RîdóMдIEND®B`‚enigmail-2.0.8/ui/skin/images/modern-sign-inactive-force.png000066400000000000000000000034451334302754500237740ustar00rootroot00000000000000‰PNG  IHDR2!›}ø„bKGDì2XóJ pHYs  šœtIMEÞ $3A¢¯²IDATXÃí˜{pTõÇ?»›lö‘Í>òd— Ša“HÂ#1 AÐRZh§v˜ŽíTf¤”X¢`¨Å¶XD-ÎèP;U;ƒôa;8£}L õ ¢„mFHlMÁM6fÃæÞÝìãÞÛ? ;‰ e—‡:™þfÎwæÜó;ßó=çü~¿£ò ŠÂ X)üC3jfÈú?Ï]\/Ãç½´xZq»Ý¸ßl&U«å+_¿Í›îD«Õ^óýTœó]³®ãÈëÍ>|ˆ¾žÊ–Trsí2æÒänçÈáCØ ÙõÓ‘šš:åÿÀ… ˜-V #Š¢ R©>= ÞA{÷ý–6w eK*Yµr%EvË$Ó=^º{» ‰a:N¿ÏÏwý ‹Ù@4!ùýÞ_Q\\L¿—š«˜7¿8ñÔ’%éŠ ó‡ýÏóNskÖÝFÝú=—Ôud›8îñ³¬ª €=OícÛݱ˜2„Qž}æIb1‰@ €Ï磩ñ%òò 0‰1òï3Þ¤9×ïå‰_>EkËQÖßõ}Ö.¯žVOÇ&}j>†Åje©kGÞö Œ)¬[³‚ÿ²»ÝN$¡««‹ÂÂBt:åKk˜ãœ{í»V$å…¯°þöo““ŸËŸŸvZ‚86D ¬0Çî ³£“@X¡rñ"´ª0}îwØívb±²,ãt:éèèà½S§0e™O-I–Rlimç7{ŸA­‘yâé§É7ëÿgô/:B$B¶ÍÊðà‡_}•Ú›ªP‰>æÎ¡Œß– #›îÇ`0’¨ µßºÜ稻·•KK“‹Æèì~1ÄsôMt‘œN'’$!Ë2Òx­žïï§¾áÇhR4É#RÅÞÕyšw?Š#Û4­ã—rþ"€·ZZè;ÓMÁìÙ,ü‚»ÝŽ4΄$I(ŠBWw7oC›–€”D#º,#’$“kwÒ~ºƒî³§“Nod–Á@ºÑˆÁ p£‰Eñú|w»0Y,˜µöÙ…S@ôœ9‹ 2Ñõ¡‹ÅœtM‘¤Ëç`õ­_嵃/°ç±éè §·—Å ôÆtŒFV›•t½³ÉÄðÈžÖV†0Û²IÓ¥aT‚8ìN$i"èêêBcÊG-D1›2Iħ)í÷dçÙ˶ß!ÿ;w>‚cNw|k °†¾¾óôôöƒE€ ¢H`x£Þ€9;½Á@HQd‰”°Ÿ.²$׆Bï¹^£wÞxïmÙNM…‹t£!ùK£$K\N²23¸sÓ&NxZéè ÇfeQY) ŠoÀQXˆÁ˜¨ùÏ{§Ðèõ8 ã›Ø²­äçZ)))áä‰ÈŠ‚,+ôœéA6Ú8öF3î¹/}±½>D|ú¤hêê·îJqŽÅDVA!zî”/¼Fƒ,Ëèu:fed™™‰5;ÿè(%.yùy8l ¦LïºqÌ.Àd2áñxˆI¤gÓôòKlØz«k+¯îö+'‘Õå ö¯ã=Êï@ †D1®SdÏÅbµâÈË'‹2::Š ái9†“É´å’Y0I£¡ñÀßÙØp?«—U"_A]|"µ•´T5Ë«Êùî] l«¯'¢MM!}Â}(söl/‘XAQ©ÔȲ̚Û7_äBIÑ‘¢ÕräŰé‡?aí-µ$ãÃ¥$©÷ˆ¤¨Éš•ÁŠª Øñ;¶og÷ãObDbòA&„‚ø‡‡QA ¢R©h;îfëpóÒ…q½U²¦ì×ø âŒÈŠÌ•ÈòÊ…l3‘½ÞˆwÀ‹ ˆ¡ ÁÐ(‚D †P«ÕCwÔÝMí’²¸­é@\—¨?jY’IFÔ*u\VTU°eÇC4½u|2s¡ÐÔ>¯R!)i,©ª¢ªl~ÜÞꃓß-#;'¯>hI̯d‹j:fÚO¶¦×!†‚q6Bb˜P0Ȩ¡ôÆRªÊæ_ŸáCL–HF¦‹Fù¢ _~…†|ȨñÆA´ýËChL¢²ºšÅ%ESì%²ñ몇1Y⦠ú{Ù¿ï×ÜàúøvìôóvSÕ·®¥¤ÔÅâ’¢„ì™þèÓ™¢LÅXLâË+k0Ûrh·s®HLÃ×¾³‘šÅ.2Œúë>R½vìä5ýÆ&l)šÄJ𛓊}"+[Õ÷Ù¹Ò5L² Tÿ<Ú6#¦ñ3gd*]Å\ëó´þ ð§{½ëÆ%IEND®B`‚enigmail-2.0.8/ui/skin/images/modern-sign-inactive.png000066400000000000000000000033641334302754500227000ustar00rootroot00000000000000‰PNG  IHDR2!›}ø„bKGDì2XóJ pHYs  šœtIMEÞ %wkïiIDATXÃí˜}LÔ÷Ç_÷Àq çÝ<Ýygp¨ eˆÃuMWÍ’&fé’Õ¤ÎI'm-®³ÛìZ»®Mš¸.[»Äº‡n±I»‡dÝú Ñ––>‰xC-*t- XåààñûÝîîûûíRÄ‚óNÐ4¦ßäóÇ%Ÿß}>ïïûóôýèB’¦qãùáÁëz®“ó%/\Ž\­?>ì§9ÐJKK -o7‘b2ñÍoÝΖÍwa2™æÜžîã3¡9«ZÊØßlbÿþ}œíî¦dE_«YÅR_6-mÜ¿<·?ý)))Ó¾Ÿ!>ÃéÂjµ¡i:îÚ „ؽç÷mi¦dE·¬YCÛy‘Ωî ]½](ò8í§>ä;†Óa ‰Èüq÷¯),,¤¯/Huí-,^R˜xh©B\1€Á¡!þ´÷ÞojdíúÛ©Û°ë’ºž,;‡쪬`×Ó{ØvÏ&œö $i”çžý ñ¸  …h<ð 99yXm¶ÄùÏé`ÒŒœé òÔ¯ž¦µù]6Üý}Ö­®šQO’Ç.ú½¯éN—‹•þÅ|/€4¦±~m-/ÿm/n·›h4Jgg'>Ÿ³ÙLéÊjzÍ}ÕŠÆb¼øÒkl¸ã;,ÈÍæ¯/<7#I›"<®±Ðí¡£½ƒð¸FEùrLºqþþüp»ÝÄãqTUÅëõÒÞÞΉ“'±Ïw$ZBURlnmãw»ŸEoPyê™gÈuXþïíæüä%D£deºègÿë¯SsS%:9Ä¢E‹&AhÓ’ÕjcKÃX­6õ/¡ò[÷ƒ{ù¸ã$u÷7°feqÒâ±8]"+ï¾9:‚×ëEªªˆ‰\=××G}Ã1 Éõ‘@²wvœâ‘ÇŸÀ“eŸÑñK9ÿ€wš›9{º‹¼ü|–}ÅÛíFL0!„@Ó4:»ºÙ´e¦ÔTD…貌¡’íöÒvª®žOÃÉl±1Ïj%ÍfÃjµL6¸©·Ç†BniÀîtâ0 Üù¾i ºO÷ éìt~Äét$]AB\>«n¾7þù"»ž|„ö®~º{{ùDŽ Š,a±¥a³YqeºH³XqØí Œhmeh Gf©æTlZÛ‹SA@gg'{.z)†ÃžA">M+¿Ç;z.[~‡GxøáÇð,ÌãÎo¯%ÌR¿Uˆ‰ÜÐè=Ó‹fËäý·Þä{÷m§ºÌOšÍšüÐ(TÁåd~F:wmÞ̱@+í]ý,Èt±¼¤˜¥…7àñù°ÚÒ=8‰Áb!Ïë›4’™å"7ÛEQQÇCÕ4TU£ût7ª-“Co5±ñÞøÆW˰XRIħϋ¡®~ëÎD/pÚ™Ÿçã/Ïÿ™Òe7b0PU‹Ù̼ôt222pee1<:J‘ßONn^‡L§{†ŽZðäça·Û Ä…€´,_}…[àÖšŠÙM¿jñXUº”¡áõüòÉ'xèç G$YžÔ)pgãt¹ðääÇER͇q•ŒÌl2ò# ¼ô65<È­«*P¯ />Z‰JjŠžÕ•¥|÷î¶Õ׋Å0¥I›2ÓÓÓK4C’dt:=ªª²öŽäøÑŒfŒ&_þ›øÖ}½†d|¸”$5¢MÏüyéÔV–qߎGÙ±}ûDS¼ÀˆàâF&)†‡†Ð4QIt=|„­=ÆmµÕs÷BT5•+‘ÕË&ÁLeÄb±ì"I2’!¢Œ"É䈂^¯'¢‡š%\©í™Ä˜llzhmeìx”Æw³²¬è+Š2½Îët-••åT–,™uNÌúÍ>3mÇj1#+‘I6y%aTŠR|c1•%K®Îò!® ’U¨Ó¤ty^}ÿ†PÑ3<00 âè¿(c‚Šª*Ê‹ HÖ^¢2ëåC\ÜTæ'\?{÷ü–üŸNÇ¡aÞkl¤êæuû)/*¸ª[]Ó‘³~³Çã£ÑÀ‘¶hû ±ˆLŠ)•ìü…T—ûI·Y0&9–' äCÇçt÷Ÿ’ÄFõ[›Íù^ëZ:‘Ýø—Á/W¦³eDÌb¯õE:ÿFëW}ý©IEND®B`‚enigmail-2.0.8/ui/skin/images/modern-toolbar-background.png000066400000000000000000000056371334302754500237240ustar00rootroot00000000000000‰PNG  IHDR 3L›‚¡ ¥iCCPICC ProfileHÇ­–wPyÇÝ“0 aÈIÌ’ãÉ *à aÃ80(ˆ Y\5 "IYEW%ÈAÌ;È" œ‹PQ¹Žá®®ö«ºWõú÷éW¯¿ý:üª¾{X|~,@2/MàáL  ã^P`¤YìT¾“¿¿øÛ˜êÐÜúÀpN üoAåĤ²€üŽæ¤²“>d+›/H5§§±)?Çû– "\=Çq Ü:ÇÑ Ü5ßà‚°<™ÅÄ@Gêôtv¢C&#lÌãpy¯BØžÏâ œ…ðŠää”9®EX7úßtâþC3Z¬ÉbʼnyáYæïÊMå'±2Àÿ;’“„‹÷PG’/ð @Vä Bµ‰)ÞbæE¯ö[d.g¾žã…žÁ‹ÌNu‰XdËÕ{‘…‰ÁN‹Ì,]ËMc-² %@¬“ê(ÖaúˆgHZ-æX®;s‘3ãƒB9²z‘S½—z\Äu0@؃RPª@-8 ΂p\7Á]ÐúÀS Ãà ˜S`‚ Dh¤ iA)Ä€ì!7È €Â¡((âAB( ÚåC…P)tªƒ~….@W¡ÛP/ô„Æ ÷ГaXÖ†WÂ Ø ö†ƒàup¼΄sà½p1\ Ÿ‚›á«ð]¸ÁoàI@‘Pr(5”!ŠrAù¡"P±(j*U„ªD5 ÚP¨(jõEÓÐt´!Úí‰F³ÑÑÛÐèRt-º}ý=ˆž@ÇP0JŒ †‰ ÃÄa6ar1E˜Læ¦3Œ™Âb±rX¬ÖŽMÀnÁ`b±íØ^ìv‡Ã)à pv8? —†ËÅ•àNá®àîã†qŸð$¼*ÞïŽÀóðÙø"üIüeü}ü~† EÐ"ØüBa¡šÐF¸G&Ì©D¢1ˆ˜@ÜI,&6oŸ?H$u’5i ‰KÚA*&!Ý" ’>“¥Éúdr$YHÞK>An'?& P(ÚGJ%²—RG¹FyAù$A“0’`Jp$¶K”I4KÜ—x+IÔ’t’\/™)Y$yNòžä¸AJ[ÊEŠ%µMªLê‚Ô€Ô$•F5¡úQ“©Ô“ÔÛÔQiœ´¶´›4G:GºJúšô EÓ ¹ÐØ´]´jÚ Ú° VFG†)“ “/sZ¦[fBVZÖ\6Dv³l™ì%Y‘JN[Ž)—$·Oî¬\¿Ü—eÊËœ–Å,Û³¬aÙýeÓòËååcäóäåûä¿(ÐÜ(´(Ñ"h1´âµŽhujMkëh‡jïÖnÑÕ‘×aêdêÔë<Ó¥è:ènÔ­Ô}¨‡Õcè%êÕëчõ-ôãõËôïÀ–\ƒ£½+0+¬WðVT®0$:¦ÖÉùeµ½]©¹2bå•+¿['W?5‘6ñ2É6i3yoªoÊ6-3}hF1s7ÛnÖjöÎÜÀ<Æü˜ù# š…¯Ån‹‹o–V–ËË1+M«(«r«† ßQÀ¸e±v¶Þn}Ñú³¥MšÍY›¿l mmOÚŽ®ÒY³ªzÕºËî¸Èžneÿ³½ÈAÍåPéðÒQÑãXã8â¤ç”àtÊé­³±³À¹ÉyÚÅÆe«K»+ÊÕÃ5ϵÛMÚ-Ø­Ôí…»º{œ{½û„‡…ÇvOŒ§·çϦ2“ͬcNxYymõºîMöô.õ~é£ï#ðió…}½|ú>[­µš·ºÅø1ýú=÷×ñßèÿÛìÿ5ek^˜dtÒ7ž œ rÚô4X7XÜ"R2êZ* [¶5ìn¸b87¼5Q1¹ÖmíáµÃ‘‘¹‘ýëtÖm^w{½âú¤õ—6Hn`m8…‰ :õ•åǪdMF3£Ë£'Ø.ì#ì7GÎ!ÎXŒ]LaÌH¬]laìhœ]ÜÁ¸±x‡ø¢øq® ·”û.Á3¡"a:Ñ/ñDâlRhRc2>9*ùOš—È»ž¢’²9¥—oÀÏå‹6Úl<¼qBà-¨I…R×¥¶¦É &§K¨+üA8˜nŸ^–þiSȦs›©›y›»2ô3ödŒdºgþ²½…½¥#K-kgÖàV§­Ç·AÛ¢·ulרž³}x‡ÇŽÚĉ;Ï6Î.Ìþ¸+tW[ŽrÎŽœ¡<~¨Ï•Èäì¶Ý]ñ#úGîÝ{Ìö”ìùžÇÉ»“oœ_”ÿµ€]pç'“ŸŠšÝ»·{Ÿå¾cû±ûyûû8¨-¤fô=Ø|ˆ~(ïÐÇÃß.2/ª8B<"<"*ö)n-Ñ,Ù_òµ4¾´¯Ì¹¬±\©|OùôQÎÑûÇ5T(WäW|ù™ûó£ãÇ›+µ+‹ª°UéU¯ªCª;aüRW£X“_óí6 özU]ÝI¥“ûêázaýØ©ÈS=§]O·66o”kÌ?Îϼþ5ê×þ³Þg;Î1Î5œ×:_ÞDkÊk†š3š'Zâ[D­á­½¼.t´Ù¶5ýfôÛ‰‹jË.É^Úw™x9çòì•Ì+“íüöñ«qW‡:6t<½víáõ5×»ox߸uÓýæµN§Î+·ìn]¼msûÂÆ–»–w›»,ºš~·ø½©Û²»ùžÕ½Öëž¶ÞU½—ï;Ü¿úÀõÁ͇̇wûV÷õö÷?ˆ=â<}œôøÝ“ô'3Ow<Ã<Ë{.õ¼è…Ò‹Ê?ôþhYŠ. ºv½ |ùtˆ=ôæÏÔ?¿ç¼¢¼*Q©5½8æ>Öózíëá7ü73ã¹ÿ þ£ü­îÛó9þÕ561üNðnö}Á…'>šì˜ôŸ|1•<53÷IáSígÆçÎ/¡_Ff6}Å}-þ¦÷­í»÷÷g³É³³|–€5oPH±±¼?%ZD‰o<ЂŸŸ'ðw¼àŸçÀªv‚ðAÖ’h#)‰œû;Î×a33qþ+RcÍL´H-ˆ5)šý€xBœßfggZfg¿Õ Ã> }jÁ“Ï…!ØÃ! k·[¼‚ÿòÆÿdeŠæebKGDÿÿÿ ½§“ pHYs  šœtIMEÞ %Œ d{IDATHÇ핱 €0 Séÿ›£8(b»¨ ˆsâî–B³y¹¦$í·™8+_çáe¤PqP6‰_^h§°x¦ “šͤŠìiP'(½™ )Gñ¦< ‚ Ûô×h\Š7NÕ ¥~˜ýçs©Û×ÎçýÐkËËZÜÐ_fˆ”[ÎIEND®B`‚enigmail-2.0.8/ui/skin/images/pEpEncryptActive.svg000066400000000000000000000072011334302754500221100ustar00rootroot00000000000000 image/svg+xml enigmail-2.0.8/ui/skin/images/pEpEncryptInactive.svg000066400000000000000000000101051334302754500224340ustar00rootroot00000000000000 image/svg+xml enigmail-2.0.8/ui/skin/images/pEpGreen.svg000066400000000000000000000057311334302754500203760ustar00rootroot00000000000000 image/svg+xml enigmail-2.0.8/ui/skin/images/pEpGrey.svg000066400000000000000000000045561334302754500202500ustar00rootroot00000000000000 image/svg+xml enigmail-2.0.8/ui/skin/images/pEpLogo.svg000066400000000000000000000054661334302754500202430ustar00rootroot00000000000000 enigmail-2.0.8/ui/skin/images/pEpRed.svg000066400000000000000000000046441334302754500200520ustar00rootroot00000000000000 image/svg+xml enigmail-2.0.8/ui/skin/images/pEpYellow.svg000066400000000000000000000046771334302754500206210ustar00rootroot00000000000000 image/svg+xml enigmail-2.0.8/ui/skin/images/password-error.png000066400000000000000000000067071334302754500216530ustar00rootroot00000000000000‰PNG  IHDR‰ pHYs  šœ OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-ÛgAMA±Ž|ûQ“ cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅFâIDATxÚ”ÕMh\Uðß{3ÉÌt&iImE…j­Fl@t'(T)Š"ˆµEm‹¶`*µEê""daŠ¢ ¢ ˆºrc¡‚âNÔ~¤5©±ˆn-ö Mf’ÌdÞ¼çb>3©_góàrÏyÿûÿŸ{npéšA—ÁîÁf܆«à"Nã¾ÂïÝÄ K0ģ؋!ÿŒÓxŸ Ú)ÐÄ Œ56ü›ÜŠ1ŽþæbºãûJ£²ÿ‹çàETš>Œ‘%Û%óe⤽–$’…*•ºDÃx¬yäìGªN"™-J ®—yhå2Õˆ¨Æü¼ÞÍ÷J JŠE’¤³uû±6»q{ë_ÕªôÞxMjÝõJ¹œòû'2O<¢ðö˜øì9s{ˆŽý@oO“y#îOãÁÎÚ‰ìέRë×üØAªUI¹¢0>*Èå¤n¸Nvø)Å{IB4餱Ä7A(¿#uíZé;†…¼ü¡W‰k‚¾>š²0öV·ÜÜìa==¢Éi¥#ªß|_ÿI~EK¬ztBiûˆèø)Òé /烠MN[üüK’xéð¿øZ41%(ƒeÔ–,ʼnx¶(³m‹ÜKÏ7¶´‘{áYÙ]Û$ÅQÜ-86®PËg¢ªì3Ë^yE½g“Ó¢‰©º?úûäÇÊî~š¸¦ËgB$N¤o¹I¸jek¥­ÃŠOî;ÙjIzpC]*Yrìé}ý«/`VkDJõÛã«H…J;÷ªýô‹xfVtô¤ô]Eß0·oTE¤Z-ù/7Óf >jÝ–Ê"}ya!/>{Žl¦N)W„kÄ efŠdzÛöe;>hʆ7[…gz)WÔÎ_l‹A6£vþs bð.>íL›ÅFÚ¤°»ÞýP.wUгÌ{ïáæ»ó°ØHœ­øñ?ÄÖÏØÑ(à¿Kì&Öà¾Æ°«óúgOÀüÖMükN ôɪqIEND®B`‚enigmail-2.0.8/ui/skin/images/password-error.svg000066400000000000000000000065641334302754500216670ustar00rootroot00000000000000 image/svg+xml enigmail-2.0.8/ui/skin/images/sign-active-18.svg000066400000000000000000000231441334302754500213260ustar00rootroot00000000000000 image/svg+xml Highlight Highlight enigmail-2.0.8/ui/skin/images/sign-active-24.svg000066400000000000000000000231021334302754500213150ustar00rootroot00000000000000 image/svg+xml Highlight Highlight enigmail-2.0.8/ui/skin/images/sign-active-30.svg000066400000000000000000000230421334302754500213150ustar00rootroot00000000000000 image/svg+xml Highlight Highlight enigmail-2.0.8/ui/skin/images/sign-disabled-18.svg000066400000000000000000000243121334302754500216200ustar00rootroot00000000000000 image/svg+xml Highlight Highlight enigmail-2.0.8/ui/skin/images/sign-disabled-24.svg000066400000000000000000000243151334302754500216200ustar00rootroot00000000000000 image/svg+xml Highlight Highlight enigmail-2.0.8/ui/skin/images/sign-disabled-30.svg000066400000000000000000000243121334302754500216120ustar00rootroot00000000000000 image/svg+xml Highlight Highlight enigmail-2.0.8/ui/skin/images/sign-inactive-18.svg000066400000000000000000000271311334302754500216550ustar00rootroot00000000000000 image/svg+xml Highlight Highlight enigmail-2.0.8/ui/skin/images/sign-inactive-24.svg000066400000000000000000000270711334302754500216550ustar00rootroot00000000000000 image/svg+xml Highlight Highlight enigmail-2.0.8/ui/skin/images/sign-inactive-30.svg000066400000000000000000000270701334302754500216510ustar00rootroot00000000000000 image/svg+xml Highlight Highlight enigmail-2.0.8/ui/skin/images/spinning-wheel.png000066400000000000000000000066051334302754500216060ustar00rootroot00000000000000‰PNG  IHDR;0®¢ £iCCPICC ProfileHÇ­–wPyÇÝ“0 Y“ ™$Ç!’AT†Â†q`²¸+Šˆ$eEA\• k@ X0ï ‹Šr.DEå8†»ºÚ?®ê^×ëþô«×ß~~U_È},>?– …—.ôt¡‡GDÒqÙHÀ±Øi|ç€_ð·ñqéEâ®Ñœøß‚ʉMc ÃIc§ |Év6_jNO33?Ç{– "|tŽã¸}Žc¸g¾'8Ðax2‹%ˆ€4ÔéìxD‡LFØ„Çáò^‰°;ÅA8áå))©s\°^Ì¿éÄÿ‡fŒX“ÅŠó³ÌÞ›ÆOfmÿïHI.ÞCIr‚À+9"_ªOJõ3/f•ÿ"s9óýóœ ô Ydvškä"sXn>‹,L q^d–`éZn:3x‘©býØ4÷ ±~,ÓW0¯Á$øf ÂAˆ)Bj6d™A Èr‡|¡@(Іâ!$„r P!TUB‡¡èWètº õC hz}Q0–U`xÌ€a8^ ÇÃàl8Þ —õ𠸾 ߆aüžB %‡RG¡(W”?*‡ ¶  Pe¨ZTªÕº‹¡&PŸÑX4 MG¡íÐ^è4½½]„®D×£[ÑWÑwÑ#èIôw £Œ1ÄØb˜˜pL<&“)ÃÔaZ0×0ƒ˜1ÌG,+‡ÕÅZc½°ØDì&lö ¶Û‰íÇŽb§p8œ"ÎgóDZpé¸|\îîn7†û„'áÕðfx|$ž‡ÏÅ—áã/âð/ð3)‚6Á–àOà6Š G „;„1 ‘JÔ%Úƒ‰‰ÄíÄrbññ1ñ=‰DÒ ÙV“¸¤m¤rÒ)Ò Òé3Yšl@v%G‘…äÝäcäNòò{ …¢Cq¢DRÒ)») ”+”§”O4 c ¦Gb«D•D«Ä€ÄI‚¤¶¤³ä:ÉlÉ2É3’w$'¤R:R®R,©-RUR礆¥¦¨4ª)ÕŸšB-¢§Þ¤¾”ÆIëH»Ks¤ó¤H_‘¥¡hš4W›¶ƒv”v6&ƒ•Ñ•aÊ$ÊÊœ”é•™”•–µ •Í’­’½ +’CÉéÈ1å’åŠåNË É}‘W‘w–•ß%ß$? ?­°LÁI!V¡@¡YaPá‹"]Ñ]1Iq¯b›â%´’Òj¥L¥CJ×”&–É,³[Æ^V°ìô²‡Ê°²r ò&å#Ê=ÊS*ª*ž*|• •+*ªrªNª‰ª¥ªUÇÕhjj\µRµKj¯è²tgz2½œ~•>©®¬î¥.T?¬Þ«>£¡«¢‘«Ñ¬ñD“¨ÉÐŒÓ,ÕìÒœÔRÓòÓÊÑjÔz¨MÐfh'hÐîÖžÖÑÕ ÓÙ©Ó¦óRWA—©›­Û¨ûX¢ç¨·A¯Vïž>VŸ¡Ÿ¤P¿Ï6°4H0¨2¸cZr ö/Ç,·YÎ[^»|؈läl”aÔh4b,gìkœkÜfüf…ÖŠÈ{Wt¯ønbi’lrÔä‘©´©·i®i‡é;33¶Y•Ù=sй‡ùVóv󷆱‡,î[Ò,ý,wZvY~³²¶X5Y[kYG[W[3dŒ"Æ Œ‹ÍV›ó6Ÿm­lÓmOÛþegd—dwÜîåJÝ•±+®µ×°gÙ¶9Т~v9ª;²kŸ9i:qœêœ^8ë;':Ÿp~ãbâ"piq™vµuÝìÚé†rót+pëu—vq¯tê¡áïÑè1éié¹É³Ó ãåãµ×k˜©Âd3˜“ÞÖÞ›½¯ú}‚|*}žùø |;ü`?o¿}~Wi¯â­jóþLÿ}þOt6ü¶»:`uÕêç¦9ÝA´ õAǃ>»? Ñ †t…J†F…6„N‡¹…•„‰ÂW„o¿¡ÁhÄE†FÖEN­q_³ÍX”eT~ÔÐZݵYko®SZ—¼îÂzÉõ¬õg¢1ÑaÑÇ£¿²üYµ¬©fLuÌ$Û•}€ýšãÄ)åŒÇÚǖľˆ³+‰{o¿/~<Á1¡,a‚ëÊ­ä¾MôJ¬IœNòO:–4›–Üœ‚O‰N9Ç“æ%ñ®¦ª¦f¥öó ùù|ÑÛ û7L |uiPÚÚ´ötÄäôõ„?G22ª2>e†fžÉ¢fñ²z6lܵñE¶Gö/›Ð›Ø›ºrÔs¶çŒlvÞ|x ´%fK×VÍ­y[Ƕyn«ßNÜž´ý÷\“Ü’Ü;Âvtä©ämËýÁó‡Æ|‰|AþðN»5?¢äþØ»Ë|WŮ[…&…e…_‹ØE·~2ý©ü§ÙÝq»{‹­ŠíÁîáíÚ븷¾„Z’]2ºÏo_k)½´ ôÃþõûo–Y”Õ •û–·WhUì©øZ™P9XåRÕ\­\½«zú çàÀ!§CM5*5…5_~æþ|ÿ°çáÖZÚ²#Ø#Gž =Úý ã—†:¥ºÂºoÇxÇDõõW¬Ž+/n„…ã'¢Nôt;ÙÞdÔt¸Y®¹ð8%<õê×è_‡Nûœî:Ã8ÓtVûlu ­¥ jÝØ:Ù–Ð&jhï?ç}®«Ã®£å7ãߎW?_uAöBñEâż‹³—²/Muò;'.Ç_íZßõèJø•{WW_í½æsíÆuëWº»/ݰ¿qþ¦íÍs··Ún[Ýní±ìiùÝò÷–^«ÞÖ;ÖwÚûlú:úWö_p¸|×íîõ{Ì{·W ö… ÝŽÝçÜù ùÁÛ‡gm{Œy\ðDêIÙSå§µèÿÑ,²]qéyôìÑ({ôõŸi~Ë{Ny^öBíEÃK³—çÇ=Æû^­y5öšÿzf"ÿÔT¿Ñ{sö/§¿z&Ã'ÇÞ Þξ+z¯øþØ‹]SSO?¦|œ™.ø¤ø©þ3ãs÷—°//f2¿â¾–ÓÿÖñÝçûãÙ”ÙY>KÀš·($á¸8Þ€­¢Ä‚7žhÁÏÏø;^ðÏóaÀ‘N‚ðEŽÛÐAR9pš¯ÃææâüW¤Å™›-h‘ÚkR6;ûñ„8}¾ ÏÎδÍÎ~«C†}@çÇO>¾F`÷‡2lÜoðŠþËÿ~kdªQNbKGDÿÿÿ ½§“ pHYs  šœtIMEß  „õpCcIDATHǽ—1hâPÆ¿gNª´Í"å†vè"=7] ]:ä¦fêp‚pëA·’‚.‚Çc\O\JK¡ÜŠV¡Ø"h()ZÓw“!ï”Þq—ä¿<øåÿÿÞËû‡¨ªŠ¿Ñd2AµZ¥———hµZxxxÀx T*¡Óé|QU•ØVñîî.½¿¿g>2æþþ>œ–™±U±Xì³+`k¾‡¸öz½ÌÙuCƒŒ©iš;à Æ¼¹¹i¸ŽF£Œyvv¶é 8™L2f½^Ìf3çÁ©TŠ„B!Ó|yyA±X¤®ìêÃÃCÓ¤”¢^¯£Ûíf@&“!kkkæÍD)E¡Pøöüüì,8 "—Ë-Œ´²,Óáp˜wtæ¤Ói³êù V.—¿ÞÞÞÚšùÂÌu||L àív›Éüîӭ­-bÇ×maÊä8'''doo©|žûh4ún†}3×25 z~~ŽÕÕUð<õõuð<žç‰ÇãqîO"‹‘íím´Z-:Áßo2G*¶êõõš¦}€@ Ðå8î¿À¿Éúþ;"°sIEND®B`‚enigmail-2.0.8/ui/skin/images/twisty-clsd.png000066400000000000000000000003531334302754500211370ustar00rootroot00000000000000‰PNG  IHDR ¿#gAMAÖØÔOX2tEXtSoftwareAdobe ImageReadyqÉe<'PLTE]\Â]\Â]\ÂÉÉÉÕÕÕàààèèèîîîòòòøøøýýýÿÿÿjR útRNSegÌ ¾î;IDATcbRRRb`ÒZµj•ý¼ @òü¿ú÷z¦JLr@òýÿw@%#y¦7{öìùûÉ›¿¢(#IEND®B`‚enigmail-2.0.8/ui/skin/images/twisty-open.png000066400000000000000000000003501334302754500211500ustar00rootroot00000000000000‰PNG  IHDR ¿#gAMAÖØÔOX2tEXtSoftwareAdobe ImageReadyqÉe<'PLTE]\Â]\Â]\ÂÉÉÉÕÕÕàààèèèîîîòòòøøøýýýÿÿÿjR útRNSegÌ ¾î8IDAT[cbRRRb`ÒZµj•ý{ äÿÕ«×30ýSR’’ïß¿Š()É30½Ù³gÏx›ìì~IEND®B`‚enigmail-2.0.8/ui/skin/images/warning-16.png000066400000000000000000000073711334302754500205510ustar00rootroot00000000000000‰PNG  IHDRóÿa iCCPICC ProfileHÇ­—wTÓÉÇçWR -)¡7Az•Þ;ÒÁFH„BBP±£‹ ®]D°¢« Š®µbÁ‚Øë‚ˆŠ².l¨¼IèsÏþñÎysÎüòÉ{ï|g~3¿3€¢=K ÈF•Èáç £}˜‰IÉLÒ#@ 5`Âb‹ÞQQaà_Ëû[Ж떒\à+Ê®ˆ 9•#bç@>®Éó ´C»ÁÌ|„ßAVBÉN—±–„Sel-õ‰ö…ì™Êb ÓPäg°Óadk>‡Ç‡¼²;ƒÅÜyBNN.dE*dÓÔò¤ÿWÎÔ±œ,VúËÆ"-d?žHÍš þß%'[<Ú‡>¬Ô aP´dÌpÞª³rC% µ#Çù©‘U _äq¤þ¾—!Šñïg‹|áœ(à°üB!ùDâ¬8ï¶e ¥±ÐàåÇŽpª07z$?ZÀùÇŒr78l$ç2~vÄ(oMãC†+ =R˜› Ó‰ž+àÅG@V€Ü.ÊŠ ñT˜á1ê#GK4B~—& ˆ–ù`ê9¢ÑqaVl–Tƒ:d¯üŒØ Y,–È%†jãpýüe0—7¢ƒ«Ë'z$¶X5âmåfFËæ;(*ˆí̇ L6ØãLVH”L?ö^+Ó†ã ø?ÀbXSA.ȼ¶þ†~øOÖX@ÒXŽXF#¤-|øŒ…à/H\ ‹ó‘¶rA´³Êž– MÚZ ÈO!çàš¸Á§¬¶¸3î2ÇTí•èOô#ˆfc:ØPu6¬BÀû§í{$á)¡ƒð˜p“ÐE¸ Ba+ŽY¢?6²xðDšeäÿ ^‘ð'åLº`\ÀÈèRatߨn U;à>¸;Ôµã \Xâöp$Þ¸'›´þ¨P<¦âû\þÜŸDßc±+˜+8Œ¨HÓï;æõsßæˆCöÄ–a‡±ì v ;Ž5&v kÄZ±[ O¤+a´·h©¶,˜‡7êc]kÝgýå½³F¥ïäsgåK6„o®`¶—ž‘Ïô†_d.3˜Ï¶šÀ´µ¶±@ò}—}>Þ2¤ßm„qù»-ï4.%ИþÝÆ2àØSèï¿Û ÞÀíµ€íl±°@fÃ% E¸34€0¦pL¶À¸/àB@$ˆI`:œõ UÏsÁ"P JÁj°T€m`'¨ûÁ!ÐŽƒ3à¸ÚÁMp®^ð €÷`ABC舢‹!ˆ-âŒx þH$!)H:ÂGÄÈ\d1RЬE*H ò;r 9ƒ\B:»H7Ò‡¼A>£JEUQmÔˆ:£Þh(‹NCÓÑ<´]‚®DËÑ*tZžA¯ 7Ñ.ô%:ˆLc`z˜%æŒùb‘X2–† ±ùX V†UauX|××±.¬û„q:ÎÄ-áú Âãp6ž‡ÏÇWàx5^ŸÃ¯ãÝøþ@#h,®„`B"!0“PL(#ì&%œ‡;ª—ðžH$2ˆ&D'¸7“ˆ™Ä9ÄÄ-ÄÄÓÄbqD"i,Hî¤H‹”O*&m"í#"u’zIÉòd]²-9€œLæ“‹Èeä½ä“äNò3òœ’œ‘œ«\¤Gn¶Ü*¹]rMr×äzå†(ÊŠ;%–’IYD)§ÔQÎSPÞÊËËëË»ÈO–çÉ/”/—?(Q¾[þU…jNõ¥N¥Š©+©{¨§©w©oi4š1Í‹–L˧­¤ÕÐÎÒÑ>*Ь‚8 *ê:^)Ê))z+NW,T,S<¬xM±_INÉXÉW‰¥4_©Ré˜Òm¥Aeº²r¤rŽò å½Ê—”Ÿ«TŒUüU8*KTvªœUé¡ctº/M_LßE?OïU%ªš¨«fª–ªîWmSPSQ³W‹W›¥V©vB­‹1ŒÁŒlÆ*Æ!Æ-ÆçqÚã¼ÇqÇ-W7®sÜõñê^ê\õõê7Õ?k05ü5²4Öh4h<ÔÄ5Í5'kÎÔܪy^³¼êx·ñìñ%ã¿§…j™kEkÍÑÚ©Õª5¨­£¨-ÐÞ¤}V»_‡¡ã¥“©³^ç¤NŸ.]×C—§»^÷”î ¦Ó›™Í,gžcèiéé‰õvèµé é›èÇééÐh@1p6H3XoÐl0`¨kn8×°Ö𞑜‘³Q†ÑF££Æ&Æ ÆKŒŸ›¨››šÔš<0¥™zšæ™V™Þ0#š9›e™m1k7GÍÌ3Ì+ͯY Ž<‹-\&ð'TM¸mIµô¶,°¬µì¶bX…YY5X½šh81y⚉-¿Y;Xg[ï²¾o£bbSdÓdóÆÖÜ–m[i{ÃŽf`·À®Ñîµ½…=×~«ýºC¸ÃR‡f‡¯ŽNŽBÇ:Ç>'C§§ÍN·U£œW8_t!¸ø¸,p9îòÉÕÑ5ßõëßn–nYn{ÝžO2™Ä´kR»¾;Ë}‡{—Ó#Åc»G—§ž'˳Êó±—Çk·×3o3ïLï}Þ¯|¬}„>G}>øºúÎó=í‡ùú•øµù«øÇùWø? ÐH¨ tœx:ˆ´&èv°v0;¸&x Ä)d^ȹPjhLhEèã0ó0aXS8¾.üA„Q?¢!DG®‹|e•õÇdâä¨É•“ŸFÛDÏn‰¡Ç̈Ùó>Ö'vUìý8Ó8q\s¼büÔøšø ~ kº'&ÎK¼’¤™ÄKjL&%Ç'ïNœâ?eÔީS‹§Þšf2mÖ´KÓ5§gO?1CqkÆáBJBÊÞ”/¬HVk058usêÛ—½‘ý’ãÅYÏéãºs×rŸ¥¹§­M{žîž¾.½/Ã3£,£ŸçË«à½Î ÊÜ–ù!+2kOÖpvBörNJÎ1¾ ?‹.W'wVn‡ÀBP,èÊsÍÛ7 î!¢i¢Æ|UxÔi›ŠwxT|œ?óð,åYüY­³Íg/Ÿý¬0 ð·9øöœæ¹zsÍížç=oÇ|d~êüæ –,è]¸°zeQÖ¢«EÖEk‹Þ-NXÜ´D{ÉÂ%=¿þR[¬P,,¾½Ômé¶eø2Þ²¶åvË7-ÿVÂ)¹\j]ZVúe{Åå_m~-ÿuxeÚʶUŽ«¶®&®æ¯¾µÆsMõZåµ…k{Ö…¯«_Ï\_²þ݆.•Ù—mÛHÙ(ÞØUVÞ¸ÉpÓêM_*2*nVúTجµyùæ[8[:·zm­Û¦½­tÛçí¼íwv2®*ÛIÜY°ó鮸]-¿9ÿV³[swéî¯{ø{ºª£«ÏÕ8ÕÔìÕÚ»ª­×ö훺¯}¿ßþÆ:˺J‚ƒâƒ/~OùýÖ¡ÐC͇×1:²ù(ýhI=R?»~ !£¡«1©±ãXȱæ&·¦£Xý±ç¸ÞñÊj'V¤œ\rrøTá©ÁÓ‚ÓýgÒÏô4Ïh¾6ñìs“ϵ=ñBÀ…³-Þ-§.º_<~ÉõÒ±ËΗ®8^©ouh=zÕáêÑ6ǶúkN×Û]Ú›:&uœìôìzŸó~èCÉGÕŸœ?µ|NøülhæÒ—ò¯f_›¾…~{0œ3<,` YÒ£+š–À›=Ð’àÙÞã( ²û—´ ²;£”À¿±ìŽ&-Žìñ n!aðŒ²V#ÈTø+9~ÇzÔÎn¬ŽQš­,Þb‡‡ßj@jà«pxxhËðð×]Pì]NçÉî}’B„güíÒsÎUƒ¥ÿ¸ýþjø×­þbKGDÿÿÿ ½§“ pHYs  šœtIMEÞ êFÍhIDAT8Ë•’_LÍaÇ?¿ßï•Éœsptük9ÔEþ.ŠÓv6¶6ËÒhÒ…æß•Öa›FÑf– a ³afl]”•Åó§cL4b§£CNtpÎï}\H*Íx®ž÷Ý÷ý~ö}Þ†¨®H#JNdJ´Ò â¿Ë™äÛ›.rž|ýÖüoE:øÜ“ÿ(!k±änt‹’kEÿEWRîÎÛªÎ_&“²Òåñ3Ï%-Á}ÿfÐ^À½TLY þ§S$mÙ wû–¥Õÿ¤Wæn.ir^?ùoÁî<бšVZ^Ô_ %ö„ªÿNoºŸéOòLSIœÇ+ë¶%Ëëö…’0Ó+¦¬,¬·üjÞw”â+ÅKןq¶Ô‚®F3V‹}„bb’07õ%57lU"rNÓ´ÈÆ8·S×pyÏ»V²3&1lq »M—*mìŠG±ö¨ˆ}³€¨ì)ñU„]§ö+à3 Hù—ë'Ãi×Y±è ¥‡ýkmÐàn&^¬žõ®ž*bzDÌù"æ|¹Ûœ,ÁÎy}ç@0Câ3³Å”ºÂ=Öo*i©:`ôÒ†±£ÜJm]WÈé0ØWØÆßí,ù¾Ó  +©O©o¨9èýŠÉãæ{«u7ïK¿»EyvŽÔ¦Ÿ¢¯¯hmíkË’ó[[ϼ!>~ØÀhª ݰü61 +U§»ùé¦b÷Ž%KÛVGB³6Û0LE MÓ0®ßoÇ Ð1;«îÞË×>„Kr‚pš. 4 W k‚Rú Õqú(Çx7Ç~ÒmwGÈÛ0IEND®B`‚enigmail-2.0.8/ui/skin/modern/000077500000000000000000000000001334302754500161615ustar00rootroot00000000000000enigmail-2.0.8/ui/skin/modern/enigmail.css000066400000000000000000000210531334302754500204610ustar00rootroot00000000000000/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ /** * Enigmail styles for the SeaMonkey "Modern" theme */ @import url("chrome://enigmail/skin/enigmail-common.css"); /* common styles for all platforms */ @import url("chrome://enigmail/skin/enigmail-pEp.css"); /* styles related to pEp for all platforms */ #button-enigmail-decrypt { list-style-image : url("chrome://enigmail/skin/enigdecrypt.png"); } #button-enigmail-decrypt[disabled="true"], #button-enigmail-decrypt[disabled="true"]:hover, #button-enigmail-decrypt[disabled="true"]:hover:active { list-style-image : url("chrome://enigmail/skin/enigdecrypt-dis.png"); } #button-enigmail-decrypt:hover { list-style-image : url("chrome://enigmail/skin/enigdecrypt-hov.png"); } #button-enigmail-decrypt:hover:active { list-style-image : url("chrome://enigmail/skin/enigdecrypt-act.png"); } /*************************************************** * Icons for compose toolbar: encryption ***************************************************/ #button-enigmail-encrypt { list-style-image : url("chrome://enigmail/skin/modern-encrypt-inactive.png"); } #button-enigmail-encrypt[disabled] { list-style-image : url("chrome://enigmail/skin/modern-encrypt-disabled.png"); } #button-enigmail-encrypt[encrypted="activeNone"] { list-style-image : url("chrome://enigmail/skin/modern-encrypt-active.png"); } #button-enigmail-encrypt[encrypted="forceYes"] { list-style-image : url("chrome://enigmail/skin/modern-encrypt-active-force.png"); } #button-enigmail-encrypt[encrypted="forceNo"] { list-style-image : url("chrome://enigmail/skin/modern-encrypt-inactive-force.png"); } /*************************************************** * Icons for compose toolbar: signing ***************************************************/ #button-enigmail-sign { list-style-image : url("chrome://enigmail/skin/modern-sign-inactive.png"); } #button-enigmail-sign[disabled] { list-style-image : url("chrome://enigmail/skin/modern-sign-disabled.png"); } #button-enigmail-sign[signed="activeNone"] { list-style-image : url("chrome://enigmail/skin/modern-sign-active.png"); } #button-enigmail-sign[signed="forceYes"] { list-style-image : url("chrome://enigmail/skin/modern-sign-active-force.png"); } #button-enigmail-sign[signed="forceNo"] { list-style-image : url("chrome://enigmail/skin/modern-sign-inactive-force.png"); } /*************************************************** * Icons for compose toolbar: attach own key ***************************************************/ #button-enigmail-attach { list-style-image : url("chrome://enigmail/skin/modern-attach-inactive.png"); } #button-enigmail-attach[disabled] { list-style-image : url("chrome://enigmail/skin/modern-attach-disabled.png"); } #button-enigmail-attach[addPubkey="true"] { list-style-image : url("chrome://enigmail/skin/modern-attach-active.png"); } .enigmailToolbar { min-width: 50px; white-space: normal; color: WindowText; line-height: 1.4em; -moz-appearance: none !important; -moz-appearance: none; padding: 0px !important; margin: 0px !important; -moz-margin-start: 3px !important; border: none !important; background-color: transparent; background-image: url("chrome://enigmail/skin/modern-toolbar-background.png"); } /*************************************************** * Icons for messenger status bar ***************************************************/ #enigmail-status-bar #enigmail-signed-status { list-style-image: none; visibility: collapse; } #enigmail-status-bar[signed="ok"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignOk.png"); visibility: visible; } #enigmail-status-bar[signed="notok"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignNotOk.png"); visibility: visible; } #enigmail-status-bar[signed="unknown"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignUnkown.png"); visibility: visible; } #enigmail-status-bar[signed="inactive"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignInactive.png"); visibility: visible; } #enigmail-status-bar #enigmail-encrypted-status { list-style-image: none; visibility: collapse; } #enigmail-status-bar[encrypted="ok"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncOk.png"); visibility: visible; } #enigmail-status-bar[encrypted="notok"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncNotOk.png"); visibility: visible; } #enigmail-status-bar[encrypted="inactive"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncInactive.png"); visibility: visible; } /*************************************************** * Icons for compose status bar: signed states ***************************************************/ #enigmail-status-bar[signed="forceYes"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignForceYes.png"); visibility: visible; } #enigmail-status-bar[signed="forceNo"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignForceNo.png"); visibility: visible; } #enigmail-status-bar[signed="inactiveNone"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignInactiveNone.png"); visibility: visible; } #enigmail-status-bar[signed="inactivePlus"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignInactivePlus.png"); visibility: visible; } #enigmail-status-bar[signed="inactiveMinus"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignInactiveMinus.png"); visibility: visible; } #enigmail-status-bar[signed="inactiveConflict"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignInactiveConflict.png"); visibility: visible; } #enigmail-status-bar[signed="activeNone"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignActiveNone.png"); visibility: visible; } #enigmail-status-bar[signed="activePlus"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignActivePlus.png"); visibility: visible; } #enigmail-status-bar[signed="activeMinus"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignActiveMinus.png"); visibility: visible; } #enigmail-status-bar[signed="activeConflict"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignActiveConflict.png"); visibility: visible; } /*************************************************** * Icons for compose status bar: encrypted states ***************************************************/ #enigmail-status-bar[encrypted="forceYes"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncForceYes.png"); visibility: visible; } #enigmail-status-bar[encrypted="forceNo"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncForceNo.png"); visibility: visible; } #enigmail-status-bar[encrypted="activeNone"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncActiveNone.png"); visibility: visible; } #enigmail-status-bar[encrypted="activePlus"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncActivePlus.png"); visibility: visible; } #enigmail-status-bar[encrypted="activeMinus"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncActiveMinus.png"); visibility: visible; } #enigmail-status-bar[encrypted="activeConflict"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncActiveConflict.png"); visibility: visible; } #enigmail-status-bar[encrypted="inactiveNone"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncInactiveNone.png"); visibility: visible; } #enigmail-status-bar[encrypted="inactivePlus"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncInactivePlus.png"); visibility: visible; } #enigmail-status-bar[encrypted="inactiveMinus"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncInactiveMinus.png"); visibility: visible; } #enigmail-status-bar[encrypted="inactiveConflict"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncInactiveConflict.png"); visibility: visible; } enigmail-2.0.8/ui/skin/tb-aero/000077500000000000000000000000001334302754500162265ustar00rootroot00000000000000enigmail-2.0.8/ui/skin/tb-aero/enigmail.css000066400000000000000000000212151334302754500205260ustar00rootroot00000000000000/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ /** * Enigmail styles for Windows (Aero Theme) */ @import url("chrome://global/skin/"); @import url("chrome://enigmail/skin/enigmail-common.css"); /* common styles for all platforms */ @import url("chrome://enigmail/skin/enigmail-pEp.css"); /* styles related to pEp for all platforms */ @namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"); #button-enigmail-decrypt { list-style-image : url("chrome://enigmail/skin/decrypt-active-18.svg"); } #button-enigmail-decrypt[disabled] { list-style-image : url("chrome://enigmail/skin/decrypt-inactive-18.svg"); } /*************************************************** * Icons for compose toolbar: encryption ***************************************************/ #button-enigmail-encrypt { list-style-image : url("chrome://enigmail/skin/encrypt-inactive-18.svg"); } /* hide label unless text-only mode is enabled */ toolbar:not([mode="text"]) #button-enigmail-encrypt .toolbarbutton-text { display: none; } #button-enigmail-encrypt[disabled] { list-style-image : url("chrome://enigmail/skin/encrypt-disabled-18.svg"); } #button-enigmail-encrypt[encrypted="activeNone"] { list-style-image : url("chrome://enigmail/skin/encrypt-active-18.svg"); } #button-enigmail-encrypt[encrypted="forceYes"] { list-style-image : url("chrome://enigmail/skin/encrypt-active-18.svg"); } #button-enigmail-encrypt[encrypted="forceNo"] { list-style-image : url("chrome://enigmail/skin/encrypt-inactive-18.svg"); } /*************************************************** * Icons for compose toolbar: signing ***************************************************/ #button-enigmail-sign { list-style-image : url("chrome://enigmail/skin/sign-inactive-18.svg"); } /* hide label unless text-only mode is enabled */ toolbar:not([mode="text"]) #button-enigmail-sign .toolbarbutton-text { display: none; } #button-enigmail-sign[disabled] { list-style-image : url("chrome://enigmail/skin/sign-disabled-18.svg"); } #button-enigmail-sign[signed="activeNone"] { list-style-image : url("chrome://enigmail/skin/sign-active-18.svg"); } #button-enigmail-sign[signed="forceYes"] { list-style-image : url("chrome://enigmail/skin/sign-active-18.svg"); } #button-enigmail-sign[signed="forceNo"] { list-style-image : url("chrome://enigmail/skin/sign-inactive-18.svg"); } /*************************************************** * Icons for compose toolbar: attach own key ***************************************************/ #button-enigmail-attach { list-style-image : url("chrome://enigmail/skin/attach-inactive-18.svg"); } #button-enigmail-attach[disabled] { list-style-image : url("chrome://enigmail/skin/attach-disabled-18.svg"); } #button-enigmail-attach[addPubkey="true"] { list-style-image : url("chrome://enigmail/skin/attach-active-18.svg"); } /*************************************************** * Icons for messenger status bar ***************************************************/ #enigmail-status-bar #enigmail-signed-status { list-style-image: none; visibility: collapse; } #enigmail-status-bar[signed="ok"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignOk.png"); visibility: visible; } #enigmail-status-bar[signed="notok"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignNotOk.png"); visibility: visible; } #enigmail-status-bar[signed="unknown"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignUnkown.png"); visibility: visible; } #enigmail-status-bar[signed="inactive"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignInactive.png"); visibility: visible; } #enigmail-status-bar #enigmail-encrypted-status { list-style-image: none; visibility: collapse; } #enigmail-status-bar[encrypted="ok"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncOk.png"); visibility: visible; } #enigmail-status-bar[encrypted="notok"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncNotOk.png"); visibility: visible; } #enigmail-status-bar[encrypted="inactive"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncInactive.png"); visibility: visible; } /*************************************************** * Icons for compose toolbar: Protect header ***************************************************/ #enigmail-toolbar-encryptHdr-button { list-style-image : url("chrome://enigmail/skin/headerUnprotected-18.svg"); } #enigmail-toolbar-encryptHdr-button[disabled] { list-style-image : url("chrome://enigmail/skin/headerUnprotected-18.svg"); } #enigmail-toolbar-encryptHdr-button[checked="true"] { list-style-image : url("chrome://enigmail/skin/headerProtected-18.svg"); } /*************************************************** * Icons for compose status bar: signed states ***************************************************/ #enigmail-status-bar[signed="forceYes"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignForceYes.png"); visibility: visible; } #enigmail-status-bar[signed="forceNo"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignForceNo.png"); visibility: visible; } #enigmail-status-bar[signed="inactiveNone"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignInactiveNone.png"); visibility: visible; } #enigmail-status-bar[signed="inactivePlus"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignInactivePlus.png"); visibility: visible; } #enigmail-status-bar[signed="inactiveMinus"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignInactiveMinus.png"); visibility: visible; } #enigmail-status-bar[signed="inactiveConflict"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignInactiveConflict.png"); visibility: visible; } #enigmail-status-bar[signed="activeNone"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignActiveNone.png"); visibility: visible; } #enigmail-status-bar[signed="activePlus"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignActivePlus.png"); visibility: visible; } #enigmail-status-bar[signed="activeMinus"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignActiveMinus.png"); visibility: visible; } #enigmail-status-bar[signed="activeConflict"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignActiveConflict.png"); visibility: visible; } /*************************************************** * Icons for compose status bar: encrypted states ***************************************************/ #enigmail-status-bar[encrypted="forceYes"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncForceYes.png"); visibility: visible; } #enigmail-status-bar[encrypted="forceNo"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncForceNo.png"); visibility: visible; } #enigmail-status-bar[encrypted="activeNone"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncActiveNone.png"); visibility: visible; } #enigmail-status-bar[encrypted="activePlus"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncActivePlus.png"); visibility: visible; } #enigmail-status-bar[encrypted="activeMinus"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncActiveMinus.png"); visibility: visible; } #enigmail-status-bar[encrypted="activeConflict"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncActiveConflict.png"); visibility: visible; } #enigmail-status-bar[encrypted="inactiveNone"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncInactiveNone.png"); visibility: visible; } #enigmail-status-bar[encrypted="inactivePlus"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncInactivePlus.png"); visibility: visible; } #enigmail-status-bar[encrypted="inactiveMinus"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncInactiveMinus.png"); visibility: visible; } #enigmail-status-bar[encrypted="inactiveConflict"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncInactiveConflict.png"); visibility: visible; } enigmail-2.0.8/ui/skin/tb-aero/images/000077500000000000000000000000001334302754500174735ustar00rootroot00000000000000enigmail-2.0.8/ui/skin/tb-aero/images/enigmail-settings-small.png000066400000000000000000000030051334302754500247300ustar00rootroot00000000000000‰PNG  IHDR ‰øÌsRGB®ÎébKGDÿÿÿ ½§“ pHYs''«³ïÉtIMEÙ  /Ú<ƒT…IDATHÇu•MlT×Ç÷}μ™yx<ƒ‹E‘â`hŒÀB•ÛdQÔEŦR¢."ETøײ@MÒR©­,U,Zµ¨mº˜` „J©@i¥EÝ´qA”*C"Ž¡¸‰É`?f<3oÞÜ÷nÔƒ]·wuï=:ÿ£{ι¿#Xµ.\¸À8yòä3ÉdòG†aì4)å•J¥òã¾¾¾Î;ÇÁƒ›>â¿ÏŸ?¿¿§§çíB¡`‹E\×%933óbooï[¹\ŽC‡­8qâD¤»»»¶iÓ¦úµk×Fu]?Þh4Ã0޹®;äû~¢X,&9²¸âc¬p]÷è¶mÛ¸qãÆñã«LßÞ²eËkóóó?Ž®´ÕRÊ}‘H„¹¹¹?¯¾Ïf³,--½‹Å¨Õj_^mÓ”R̓çy!¾ï7Ÿ¦”bxxß÷5MÓð<ÏZ- Æ^Ùù¹”² ‹‰3›·|a÷'Ó·»:ªù釈Ų/Ÿþ¼bú3-³ù©çÞ˜˜¸~û«{k/½wÿ[ßþùð§w~5wÂ=;·+þùI¨>2DÏÅB)ä£{™Î'òᤦl[ˆÌÖO?Sù®/~w·ðû7_–Ë˨áo"Â16S=ðü×à7g -¯ À_/#¦¦aø*ÝŠlVáKû~êmÜÔ!‚e’ ‹áÇyùÔ×yö+RõW&íOƒž ¸ý(!ÞüW¯?NÄ¥K—þ²¸¸¨|¯¢¨—y¥¹?ü³ËÍýù÷ÔÄÄ„ùûš>(—Ë@ìvRéVüj €¾s3âiy Û‰Q®xÔjš¦=éMÓxðàONB½Hמnv¤–øÝ/^e{ôÞâ Û¶oçúõëܼyÃ0žt¢RŠ šFKëF~ðý#,-,ÐÕýKåéTŠ–Ö4ý_ Z|ÔŒÞ샋/þ­««ëYËüúr†_CŽãP­V©T*Äc1––=¾±[¢“Ïçßé6„}“““n*õüضYÇ4ÿ·oþ¶mYµ¨³Ù€L`YVuÝo<{ö,½½½är¹g,Ëú‰¦i_´0 ÿ(¥<ÖßßkllŒ¾¾¾õBˆ'BÊå2¥R ß÷immŲ,:;;¹uëÖJq]—ÙÙYæçç× ¬Ì!Žã°k×.¢Ñ(wïÞ%‘H`Û6Ñh”­[·¢”bõ,YбRª½{÷R,BÉdR²´´Dww7µZ––̦€¢¯T*¹€r]·AÓ4 …¾ï°2±u]¯üå9‚T”ð×hIEND®B`‚enigmail-2.0.8/ui/skin/tb-aero/images/enigmail-settings.png000066400000000000000000000036141334302754500236300ustar00rootroot00000000000000‰PNG  IHDR0 ˆº£sRGB®ÎébKGDÿÿÿ ½§“ pHYs''«³ïÉtIMEÙ  :ø ñx IDATXýVlS×þî{Ï?ží$ŽI{$¡R#~¤dÄj»ñG(+Méº-Û´UÙ’•&uªºÁ¤Žf]V EB*Õ¦ŠI•Vw5S‡F£*`¢Û4ØT*BŠM¹qS“¸Y<Ç¿ã÷üî½ûü˜á%„ õJ–î=÷ÜsÞwýs?‚{Œ@ à „¼ ÂvÆX+A„ cìÎùÑ®®®ù¥Î“{o'„œ¨¼9¬6› P(J¥ÔT*•åœwuuu¹ï@`KEEÅùöövëøø8b±X¦P(ÄjµR—ËU)I¢Ñ肦iÝÝÝg– ØDQŒtttx¯_¿®ƒÁ)ÆX€aÆåœ·Š¢Øo±Xòx<öñññc¬iÏž=w]—´€g×­[W“ËåØÕ«W?Ò4mëܧi&!€U¶Fj]Þ“ªªž¶X,ÛœN§#ÿÀËw aòäêÕ«MápXQeß§Ÿ…ir>J)4"›Éa26ÁEÙ;33ë««Íœó¯Å2D išÏáp`zzÚ¤iZˆR†C—ù¼ôËñŸÙ©°»æK›ÍUU1Šeˆ X,: ! ”J)3ò9tà0ãÐ4›L&¨ªêXvMÓÀ9‡ªªÐ4mÉ:)íSJ±dιÈ9—ný066†……´··K_yµd—ÞúÝK8ñö~|ø×_ c ×hš†3'ŒiúΛ}Ð(çv™£ÑËÎ1ãPŠVj{ÿo1ëñãÇ }Ô‰ÉÏ98çhjì2CãÃÀÈ'âŠm'N‡‰Î"‡¶ïŠDG€Î¯àlÀ7oÓôÔ{͑πÈ'@v-f»«Uœ:u*»víZ{&“Y’5£££(‹‹î;N„Ãa:??ï8räH¡¬Ð¼^/Ö¬Yøñkÿ\$„ÇÐúâ·õy86®ä‰‰ $“I€ÿåïBD|ã©øùÞŸàjð¿ŽXlð÷óƒxâÉoAE<þø—qFîÀ’­‚sŽU«V¡®®NßìüÙxïõçálëÅàoƒõ_éÀ¶ÝO@%¼ýï›üÿá¯ÞÅ>ƒÃûõs.\X¢(úúϯ=‡§:¶ãÙ­vü¡¯<·ÛwtêüÞùõ÷ñØc­zPI’Œ0Æàñxʺûß¼ù*\úý¿ÐÕ@à`Whi¹ýa¡PÈÁÔÔ»ÝÛžñö ;ÀŸóyzõ(>üËèíþ~ôU ~OoÈ öùB¡|©Õ¿hƒƒƒÙ 6ØEQøÓ§¸ŸñGT} ï¦)cL‹D"ºÓ÷ZƒAÃûñÇeK_Ô ÷rðûýBÈ ¶h½Õâƒ>àœíééY¹.òûýí„&“©Òd2YK £”BUUµX,f9ç]===÷¯‹ü~ÿ“ÉtÞëõZS©r¹\†RJQ©Åb©Ùlv1ÖÙÛÛ»|]ä÷ûm„Hcc£7›Íª‰DbŠsÞ`˜sN´BúEQ|H–e{:NpΛvïÞ½|]ät:k4Mc‰Dâ#ÆØÖ7nÐL&B¬Vk¤®®î$cì´(ŠÛÌf³£P(ÜŸ.²Ûí¦d2©PJ÷MLLÐd2yKiÈf³ˆF£œRº7ŸÏs‹Åb°|]ÄóI’„|>obŒ…(¥(Ð÷ïßÉÉÉpCCƒE’$0Æ–¯‹cNB8ç„sn¨‹ÀcŒ ‚Jéòuç7c œó%뤴¿˜ŸÎ¢‹/Š¥õØØXÆív[ggg©Çãqº\®BÉïÒ¥KšÉdBee% —Ëëëë¥X,Y–É®]»Œ;vŒ ‚³Ù Pœs¬ÔÇ­}}}Šþ'˲ Î9l6A€,Ë( +¶ÍÌÌ2ŽŽ‚sY–át:333+¶ÒTQ(ŠÆAx [É®'hmmÍUUUÙ—Ò<0??¿$³Ìf3R©-½íeJwXº²û ú<•J_Q:†ªÞ|ú._¾ B°qãF$ „B!är9ÀÎ;qöìYBP[[{×[l¨‹¬V+dYÖ7[ZZpíÚ5¸ÝnŒŒŒÀív£¹¹„Äãq@[[†‡‡ÑÖÖ¦Ÿ›]Áÿ«ŠP(„úúz¸Ýn ¡¹¹çÎÓÀÐÐjkkõ w")C`³ÙÊJ_577‹Å‚H$‚Í›7ãÊ•+e ªªªŒ†r¹\C\.—.Ä6mÚ„P(„h4Ц¦&ÔÔÔ***ÏçË‚.Zv»]GàóùH$ʜׯ_¯Ïãñ8|>Jr¿ººúž´t:]¦óF"‘0¬ƒ;>æ‹ÓEÿ¦%,Ý ’÷IEND®B`‚enigmail-2.0.8/ui/skin/tb-aero/images/enigmail-toolbar-small.png000066400000000000000000000025361334302754500245420ustar00rootroot00000000000000‰PNG  IHDR0_úWsRGB®ÎébKGDùC» pHYs''«³ïÉtIMEÙ ºf¥¶ÞIDATHÇí–MlTUÇïõuhm™Öa&|´¶…P VÚAkµ „&š.X™èBãBwn`Ñ…‰$nܰ6B*QR•ˆP”O«¡”v”ieÒIû˜NgÞ÷»×Å0SËGËÚp’›÷rßùŸ{Ï=ÿÿyW‰Ÿúß—©R2PKOEEQ)À÷ñ-“¹tšÜyö}òÊðð°B°”I)úMB y¦½EQxó<ÑÑQ×E-ƒ““¨ªúHãÆØ¡U«àn²´¶´011~çβ«ßc>Ÿ§©©i!@0dÛ¶mœ9s]×—ÿÓÕÕUIWÍçó)yª±‘íÝÝ|wâçÏŸ§X,âû>¾ïcYÎÜ?„¬8ýýý5¤$ŸÏ£ÍÍÍ!ïVaýúõôöö288Èå+Wð}¿R…ýo¿I!ØÌ¯¿]àÊÅ ¼ûÞd³ÙR€r Ãàû¡!ú^y…ŽŽ|O0uc˜¹¢ÃèÅ ­®aÓ–†††Èårh¹\!žçñõÑ£lio¯€í¢‹¶B%cJF~bGÏ~>}Ïû!„/Ket\—oާ¦¦†víÂó>Ξ½»Qd¡P@ª–¯o½Eýú—ð\ƒt2ެ^íר´i;ߎ8ì{µ‡T&ÏïWGОdQë#|éûdó'Y¹òeÙܹü4zí B¡zìÜßÌΦ9xèsåà¡ÿPùµÕzà-…§ŸÝ‚ô§‘î vî6Á*sþODvÜÇ õÞ‰IŠéi-‹œAšI7‹]˜Å¶ÜûÅô ÆÕµíçìWÃ$SR)ƒ]ªŸì§eë‹÷ù>–óc9ÿ_äº}±£Ú´T)BHŒ¢ï­ÜÙòÇÃä\=~½í²~µ& R|ç£Ã75`äÞzÏgg–óõxÙ¯­µíý/Ëy7ÓÛQ´,ŠZ–ójìÂ,Šåò鱟«ñAŒ»öÃa9ŸMÝ•s–];Éè6ízƒ¶çº”eûÁÃ?Ðqd¤tenK)+THVî BÇÁ¶mz{{Q‰„\ªa,gš”MÓhhhxä†"„`vv¶Ä2(—Ë•®30t]',ôƒúúzÒé4†a,»º®ëضM]]ÝB€ªª*¢Ñ(“““‹Å%Á™L†X,¶p¶m …ˆÅbLLL°fÍ"‘š¦Urv]Çqhmm­€mÛF³,«R¢ÚÚZ6nÜÈØØÓÓÓ•y)%íííTWW“L&I&“twwcšfieG×u‰Çã455±víÚÊê333¸®K2™$ÐØØH<Dz¬…!¥±±±ö<UU+à 6H$Èçó•©¾ïsóæM‚Á ëÖ­Ciš•þ0==M±X$FI$¤ÓiZZZPÎ;'ÇYDáP(D8Æ÷ýRçÕ4t]'‰ ë:ÍÍ͆A*•B“R*UUU!R’Ë娫«“±X ×u ƒA ÃÀ0 úúú«±§§gQ­9‚išØ¶ã8•TlÛ¦¡¡aùûÁ0MÏóp]Û¶ñ<˲*ÿ‰eûA4ejjŠB¡€ahšF8&‰Üçû/&s­•¥4ÊIEND®B`‚enigmail-2.0.8/ui/skin/tb-aero/images/enigmail-toolbar.png000066400000000000000000000041011334302754500234220ustar00rootroot00000000000000‰PNG  IHDRHìù5sRGB®ÎébKGDÿÿÿ ½§“ pHYs''«³ïÉtIMEÙ 8 ?™ÁIDATXÃí˜khTÙÀçÞ;3É<Ì`&º›ÔhlH\㣘íúw£Eˆ` º•~°-Ø/K±¥¸ ¥[Wý ôõA—ý ‹µ —j]D·TiEMÕ& >M¢16“É$¹óÈ}ž~ç&£yèîKÁ‡93wþÿÿyü¿{àe›£‰+W®`Æs H)gW(Š¢¿xœ¶÷Ž¢²3w]€–Íf©¯¯§¢¢â Íxj³,‹ÎÎN&&&°mEUUÃqœgºëº]J9mw‡ëׯSYY‰a8Žƒ·‚寽Æ7X½z5¥¥¥/¼RJÚÛÛ©¬¬¤¤¤„T*…ã¸9º®#„`EC—.]¢©© ŸÏ÷BnÞ¼I(¤|þ|¤”躎c?YA*•ÀçóѸf gÏžeÓ¦M”””<×ÌÿþËÄ“cô òzÝ7H¥RøŸl‘¢ëº' …ØØÜÌ™3gH$X–5c7 ƒsçÎQóÊ<ªF©ª(sœ>þ˜µk×Òôã_ç ¤Óé‚YE"¶µ¶ráÂnݺ…mÛÏ(O¥Rhf‚æ¦7xµº)|˜–MÕ¢¥¬nlâôéÓäÝßÛ¢©- Ѷ};§NŸæÚµkhšVஎ㰴nk׬äú¿®ñç“`ëÆUD_©GJIgg'‰DbzÉÑQ®^½JË[o‰DÈf³†iYX¦Iii)‰ÇwÐSYîüç:øío<Ù?ž8Îüùóéïï8®¹®[ ¼¿¿Ÿ‘d’Í--(Š@ xÆïûz:H÷õaŒ0<þmªòž{÷ˆ–•Q]]=ÇT5g´çv'ã‡m‚ª¨ÊÃxœŠŠ îݽM ͹ªã ضMbd„š%K¼YçÛ½‹¿$]Œ+Jp] ;=ÎÈÈ0µ Bdtø`/íŸbé–_066Æîw~J_| )%‘HDjy^¸`Á´¾ÐLjÖ´â Erù&ÞC2~P8FVâòçÿeða+‚A\×eMÓ›œþà>,víÚ…‡Ù·ÿŒÁô£7M¤•9Ž´ÇpÌ4Ò‰€câØ†©ñ«÷ß÷dü>¿7Ö8 f‹Öï»Mºæ0d×ÂÊŒà#¸vËHSZ±†Ãû?­e®t0‘Náš ã@iı²I\3…k¦1'Ò¸ÎÌòsH¥pÍa@’¸F+=Œké8–Ž™Maš3[Ðæ2«ÛÆ¥³íà¿Ëãx‚þûƒX†dÝåÌ ±ÅJ–Ô¾þ5ýüàÒ¡Ÿ€/ª‚”6Ò–¸H;W`¥#±)Ý\“O²™+.$H—±±,oÿîÄä];ñ.¸àJ+5„ª!En,TU ª jJ®ûTT¡ ©  ‰‚›ÕùÛ…îÂ\üè]„HIA®qe.?Hò¿M}>9Îý§ð™ë8´½w4·‚Àêïz\$¦ì™ú%¹Žz^$‹y¾Eã"/ЊÅEž‹‹¼<ÍE™LfVš˜®···{\$]×ihh(.544‹&ï‹V¬ør÷E¡åååÞ}‘g €‹_”‹ñxüX¾\‹Å0Mó‡dWÀE7> !¾óèÑ£cáp˜p8L(òÎaëÖ­Ç>ýôÓY¸hÛ¶9¹H±³ººšh4ŠÇq(++£²²’[·nÑÜÜ,ŸÓ4bË–-‡lÛþ§Ïçû^GGÇöÒÒRFGGY¿~ý‡Êt\Ô××ÇæÍ›‰Åb¢Ñ( , ªªŠd2ùÉDZ,‹ÑÑQ ÃàñãÇ—€A˲ !„ ™LOsQOÑht.’(Šill|Õ²,†‡‡ó‡M,»ùàÁƒ;𦩉D¿ßaH)§pQ"AMMÍ3´··÷OÁ`0_'nÛ¶ýóòòòúüËž®ëtww¯ìèè诫««Y·n]w:®Åbøýþ)\´páŒoUUUùà«Ïd2èºN À0 îß¿Ïøøøp<Ï–••¥ººº~600Ù»wï'çÏŸGSÅÜ·o_`¦`Ú¹s'¶mãóù¼tî8Îäût®&|>oÞ¼ÝÝÝd2R©”ÐÒÒ‚˜+[^¾|YÖÖÖz¤ë:º®‡1 ƒžž‚Á 6løb\”wÍ|õÊ[~%¶mÏšÒ•çÉñ¶m{éÚ²,LÓô”çÏÈEBÌJŽtttÐÛÛ‹ªªd2¯n,Z´¿ßO  ‹1—ž¢µÿíH6ÈC|sÙIEND®B`‚enigmail-2.0.8/ui/skin/tb-linux/000077500000000000000000000000001334302754500164375ustar00rootroot00000000000000enigmail-2.0.8/ui/skin/tb-linux/enigmail.css000066400000000000000000000211751334302754500207440ustar00rootroot00000000000000/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ /** * Enigmail styles for Linux */ @import url("chrome://global/skin/"); @import url("chrome://enigmail/skin/enigmail-common.css"); /* common styles for all platforms */ @import url("chrome://enigmail/skin/enigmail-pEp.css"); /* styles related to pEp for all platforms */ @namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"); #button-enigmail-decrypt { list-style-image : url("chrome://enigmail/skin/decrypt-active-18.svg"); } #button-enigmail-decrypt[disabled] { list-style-image : url("chrome://enigmail/skin/decrypt-inactive-18.svg"); } /*************************************************** * Icons for compose toolbar: encryption ***************************************************/ #button-enigmail-encrypt { list-style-image : url("chrome://enigmail/skin/encrypt-inactive-18.svg"); } /* hide label unless text-only mode is enabled */ toolbar:not([mode="text"]) #button-enigmail-encrypt .toolbarbutton-text { display: none; } #button-enigmail-encrypt[disabled] { list-style-image : url("chrome://enigmail/skin/encrypt-disabled-18.svg"); } #button-enigmail-encrypt[encrypted="activeNone"] { list-style-image : url("chrome://enigmail/skin/encrypt-active-18.svg"); } #button-enigmail-encrypt[encrypted="forceYes"] { list-style-image : url("chrome://enigmail/skin/encrypt-active-18.svg"); } #button-enigmail-encrypt[encrypted="forceNo"] { list-style-image : url("chrome://enigmail/skin/encrypt-inactive-18.svg"); } /*************************************************** * Icons for compose toolbar: signing ***************************************************/ #button-enigmail-sign { list-style-image : url("chrome://enigmail/skin/sign-inactive-18.svg"); } /* hide label unless text-only mode is enabled */ toolbar:not([mode="text"]) #button-enigmail-sign .toolbarbutton-text { display: none; } #button-enigmail-sign[disabled] { list-style-image : url("chrome://enigmail/skin/sign-disabled-18.svg"); } #button-enigmail-sign[signed="activeNone"] { list-style-image : url("chrome://enigmail/skin/sign-active-18.svg"); } #button-enigmail-sign[signed="forceYes"] { list-style-image : url("chrome://enigmail/skin/sign-active-18.svg"); } #button-enigmail-sign[signed="forceNo"] { list-style-image : url("chrome://enigmail/skin/sign-inactive-18.svg"); } /*************************************************** * Icons for compose toolbar: attach own key ***************************************************/ #button-enigmail-attach { list-style-image : url("chrome://enigmail/skin/attach-inactive-18.svg"); } #button-enigmail-attach[disabled] { list-style-image : url("chrome://enigmail/skin/attach-disabled-18.svg"); } #button-enigmail-attach[addPubkey="true"] { list-style-image : url("chrome://enigmail/skin/attach-active-18.svg"); } /*************************************************** * Icons for compose toolbar: Protect header ***************************************************/ #enigmail-toolbar-encryptHdr-button { list-style-image : url("chrome://enigmail/skin/headerUnprotected-18.svg"); } #enigmail-toolbar-encryptHdr-button[disabled] { list-style-image : url("chrome://enigmail/skin/headerUnprotected-18.svg"); } #enigmail-toolbar-encryptHdr-button[checked="true"] { list-style-image : url("chrome://enigmail/skin/headerProtected-18.svg"); } /*************************************************** * Icons for messenger status bar ***************************************************/ #enigmail-status-bar #enigmail-signed-status { list-style-image: none; visibility: collapse; } #enigmail-status-bar[signed="ok"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignOk.png"); visibility: visible; } #enigmail-status-bar[signed="notok"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignNotOk.png"); visibility: visible; } #enigmail-status-bar[signed="unknown"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignUnkown.png"); visibility: visible; } #enigmail-status-bar[signed="inactive"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignInactive.png"); visibility: visible; } #enigmail-status-bar #enigmail-encrypted-status { list-style-image: none; visibility: collapse; } #enigmail-status-bar[encrypted="ok"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncOk.png"); visibility: visible; } #enigmail-status-bar[encrypted="notok"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncNotOk.png"); visibility: visible; } #enigmail-status-bar[encrypted="inactive"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncInactive.png"); visibility: visible; } /*************************************************** * Icons for compose status bar: signed states ***************************************************/ #enigmail-status-bar[signed="forceYes"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignForceYes.png"); visibility: visible; } #enigmail-status-bar[signed="forceNo"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignForceNo.png"); visibility: visible; } #enigmail-status-bar[signed="inactiveNone"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignInactiveNone.png"); visibility: visible; } #enigmail-status-bar[signed="inactivePlus"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignInactivePlus.png"); visibility: visible; } #enigmail-status-bar[signed="inactiveMinus"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignInactiveMinus.png"); visibility: visible; } #enigmail-status-bar[signed="inactiveConflict"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignInactiveConflict.png"); visibility: visible; } #enigmail-status-bar[signed="activeNone"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignActiveNone.png"); visibility: visible; } #enigmail-status-bar[signed="activePlus"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignActivePlus.png"); visibility: visible; } #enigmail-status-bar[signed="activeMinus"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignActiveMinus.png"); visibility: visible; } #enigmail-status-bar[signed="activeConflict"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignActiveConflict.png"); visibility: visible; } /*************************************************** * Icons for compose status bar: encrypted states ***************************************************/ #enigmail-status-bar[encrypted="forceYes"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncForceYes.png"); visibility: visible; } #enigmail-status-bar[encrypted="forceNo"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncForceNo.png"); visibility: visible; } #enigmail-status-bar[encrypted="activeNone"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncActiveNone.png"); visibility: visible; } #enigmail-status-bar[encrypted="activePlus"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncActivePlus.png"); visibility: visible; } #enigmail-status-bar[encrypted="activeMinus"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncActiveMinus.png"); visibility: visible; } #enigmail-status-bar[encrypted="activeConflict"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncActiveConflict.png"); visibility: visible; } #enigmail-status-bar[encrypted="inactiveNone"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncInactiveNone.png"); visibility: visible; } #enigmail-status-bar[encrypted="inactivePlus"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncInactivePlus.png"); visibility: visible; } #enigmail-status-bar[encrypted="inactiveMinus"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncInactiveMinus.png"); visibility: visible; } #enigmail-status-bar[encrypted="inactiveConflict"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncInactiveConflict.png"); visibility: visible; } enigmail-2.0.8/ui/skin/tb-linux/images/000077500000000000000000000000001334302754500177045ustar00rootroot00000000000000enigmail-2.0.8/ui/skin/tb-linux/images/check0.bmp000066400000000000000000000001521334302754500215370ustar00rootroot00000000000000BMj>( ,ÄÄÿÿÿÀÀÀÀÀÀÀÀÀenigmail-2.0.8/ui/skin/tb-linux/images/check0.png000066400000000000000000000002221334302754500215430ustar00rootroot00000000000000‰PNG  IHDR “båePLTEÿÿÿ¥ÙŸÝbKGDˆH pHYsÃÃÇo¨dtIMEÓ 0—·‘IDATxœc```¨?€10¸ 8±Ë[üIEND®B`‚enigmail-2.0.8/ui/skin/tb-linux/images/check1.bmp000066400000000000000000000001521334302754500215400ustar00rootroot00000000000000BMj>( ,ÄÄÿÿÿÀwÀcÀAÀHÀ\@~@@Àenigmail-2.0.8/ui/skin/tb-linux/images/check1.png000066400000000000000000000002471334302754500215530ustar00rootroot00000000000000‰PNG  IHDR “båePLTEÿÿÿ¥ÙŸÝbKGDˆH pHYsÃÃÇo¨dtIMEÓ þ/7{'IDATxœc```¨?ÀPïÀPçÀãÀàq€ÁñCò†ò q‹¶ûg&,IEND®B`‚enigmail-2.0.8/ui/skin/tb-linux/images/check2.bmp000066400000000000000000000007021334302754500215420ustar00rootroot00000000000000BMÂ6( Œ  ÿÿÿÿÿÿÿÿÿÿÿÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÿÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÿÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÿÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÿÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÿÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÿÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÿÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÿÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿenigmail-2.0.8/ui/skin/tb-linux/images/check2.png000066400000000000000000000002261334302754500215510ustar00rootroot00000000000000‰PNG  IHDR &ÎàqbKGDÿÿÿ ½§“ pHYs  d_‘tIMEÓ  ‡óß#IDATxœcüÏ@°00008€SÞÁ‰ #K#Á084|ç®¶IEND®B`‚enigmail-2.0.8/ui/skin/tb-linux/images/col-encrypted-signed.png000066400000000000000000000014021334302754500244260ustar00rootroot00000000000000‰PNG  IHDR x0}usRGB®ÎébKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEÛ çõó‚IDAT8Ë­’[HSaÇÿßÎÅÍÍÝuºL]Í„/3šAjµÄ"ì%¡‹QôTT½Q‰‘D/QQ=$TKyéAº`æ¥6cj.¶é<º³³sz¨—®‚~ð½ý¿ß>‚e8³v/¥d#‘x-Êòéâ–Á—‡52m¨‹Ç®Ú÷ ¥FÏ–Ê(-k5”‘CàEWòo³µøøTòáöBgšÉö’×ìaÈÔ³inôÁEòhè\i“¶b}«¾ØJ„p7D~WC­œeëð¶(SÉ E›=ºU• z ëzB,G~ €UÓ—o qn ƈè$þë ,®¦Z13ÿN*¹ÚjgÙôtd¦AôÞˆ ¡q<& ñ‹Q”2DÁBW¼€tF&Ô%;®eåxÈ2hpBˆ½5ÎK|ߢÀÈ•J£57Ð,…ºâÜ[€ÖBÁÆŠÄ\Ðÿ'yÄ7 ºÝ5e§"}°¹Vå`´&·¥Ê¥% :9ÕÊ:€Ä@(#‚¯®s|Ø×ø/ò…€¯­Ê¡ÐXÜf§K'‹ß(„ß<éå>÷—kì[•Ññ{³±‰ÞM…G{û]T[Kn©sRË€øÚª”Þâ6UnÑIóïÁfÖ#Øw|À§"””#IRµD‰Ýö}=£ ¯½mת³ë§©´Ñäšû°¤hÚ`~nZ·]'„A™ÝŒÄ¼ "l;yÞŸg÷;g4í6’ø”W½{:,Ì 5/%ÿЭÐSª,¨òŽ#1C ç|!I_%‰·ß¼|¢.7Ò¶ñ"fSm‰ÿñ™ÉÈHñy³c'ów¹/à?ñ¢˜*¾Ñ¤¹ÆIEND®B`‚enigmail-2.0.8/ui/skin/tb-linux/images/enigEncInactive.png000066400000000000000000000012761334302754500234530ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÙþO¼>IDAT8Ë’AKA†ßùvf–ºn)»"+8 1K6‚ öÖ³·þOÐs) ’ÜDü ’SsÑ‹ ^ò ê¡`“›¢Äl0N”LOK}®Ãû|/ó} oP,Õ`0øÎ³–J¥Úówë­°¢EÑ—ÙÙÙ,}Ëçó¨×ë§o Êå²âœ×gÇÖ©T ¶m¯d³YÄq|úª`kkË%¢ÆÒÒÒ ç———0ÆàööJ)H)W¢(ÂÉÉÉ)I`YÖ× f|ßÇùù9„B Ùlâññ™LDT¬T*mzI@D "pÎ!¥„mÛ°maÂqôû}är9¸®ûãÅœóßWWW`Œajj ÝnwØÂó´Ö×u‘$ ŽŽŽZZëeëy˜ˆâ(Š”çyÐZCF£f³‰ùùyxž‡$Ip||ܺ¿¿_ÞØØ¸`°»»«Ä¹\N9Žƒn·‹ÉÉIœ¡×ë1=ÆXÑuÝI’ü5Ƭ … `{{{Êçóy%¥Äõõ5R©|ßGµZÅúúúÓ–e}ÖZÿÙÜÜì?œ1/,,(c Z­Òé4‚ ®ó‰B¡ÐÐÙ©¹¹9Ôj5„aˆééiŒ^ƒ„X]]ýïÖÖÖÞ'"ìïï\â{ù=IÇtÈb§IEND®B`‚enigmail-2.0.8/ui/skin/tb-linux/images/enigEncNotOk.png000066400000000000000000000013321334302754500227340ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÙ1(îÄZIDAT8Ë“KHTqÆçoÎ8ÎK­Ð™t.…YQÑÓÉ„’D`„´,‚(hQD¹ˆ(*‚¨Uº‰Ú´ë±‰È1ƒˆ è‰’•:–¥è$Íä\ï¿E¡’z–‡óû8œó}•tçZƨspê–;ùý.Ó­¤;×Jæ,é²kµ][”Ó‰¬Ù§&ΨÿÁ‰ìùžP‹¹çR„<úï£ÊWan<ÓðމiáÌ€OføŸ™õFc8/¯‚¯ýHi†wMÅñÞwœN~”~wÞ&µhW+ˆó¢ É !¹8Ÿ:¡ùR¹³úBC"»ø™ŽÃ3xç Þ0xgbT-ƒ!ôA¤¶ õ|ùÉ´˜F»Ó~cÆnÔºzˆ½ï,ðçÂ?ðƒß„œ¢à$DþJ qÝ1«¢¿t"k—¢ý~þ‰ø|ôAaôŽ¢»¶ÊDx¤p½å8NÔØqÊ’Hì˜ K `` –¾iì#ûzäG¬Ü˜k­£Æîs–„=0؇øBØgÑOÚP5U°0 zìÃ{dèSyFìq—üK,m¸£ªî¢%¾|nG–—a_9ï€Ð ù«3uß«nIÅ+2bO»äWñv ;5ö^µPý𶩬ƒÅ!Rµ[ph€D¸È/Yó­=Ý[ëᨹ¿É"Þóä<ªæ2”þõéø‰2¿tÄ¡#>éa(eÉΜ[QÛn"UE¤6WÿPSæÅqW¡®¿7’¸pµÝ“éÎÄTØvüÓUÓNìoÁÅH­Æ\¬IEND®B`‚enigmail-2.0.8/ui/skin/tb-linux/images/enigEncOk.png000066400000000000000000000013551334302754500222600ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÙçT]mIDAT8ËSMHTa=÷û™7ãÌ{3£ É óÔ$E¤)+‡ \¤HQIP -Ú¶Žš‚èg]¸tBD› G#È ŠéÆXþ¥Ž¨ãï̼y_‹µ=Û{Ϲ‡{Ï%lƒþh¥©,º ‚F¤:«nÆŸ¯¯Óvd&ÝùẠÐu,b~à[´êzßÕ¾%ùvÈdBv;Ô Ã]V&ÈÅê,tMöl)¿»GgäøPÔx&(¼iX©Ïldf’pïI=r©:ƒû¯'zĦãÉÕä ”»Š‘ë ÏCªoÙ…ðÕ4Ñø=6Ë6ãsq9©ƒq$¼(8|R÷ÁÎÍ#ÿ@3Þük›:`_I&`çœÞ0ìôˆy „R/ $up·×÷Ÿ@{ØT9û™¿ö F!ƒ°–t(k $t4@Z 2³SÈÌŽ½ÙpÆD{ØÌ1ÿ¾3/P¥,ò<5 • Àœ%°æ’ug˜VRõ|=Ù–ó×6›®â(k°}˜|÷Ë??Á]~B¯@65…_]·†iq®¾ôrï@¢#l*ÅcþÐIS+pÀNA{1ÑýöòL ËŠXTx ]ÖÂÔB6RÚÖ;”舘`¹˜?tÚÔ|YX qHÿQpO%Fž\Aië[€‡u†´µÀ¢sú{uË×̪sA2ó…ΛÒ=ÌL/´ÂSÞÚ?qàk+ª¸ð> õïÒ3=åM˜ÿÒ-ÐáoÀÈÓÖ¿U¶Ý¯Ag ÿåZ9CðlŒ°â £/ÎmL2gØ)~w#Èo%$ôIEND®B`‚enigmail-2.0.8/ui/skin/tb-linux/images/enigSignInactive.png000066400000000000000000000006621334302754500236440ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEÙ»™V%2IDAT8ËÍÒ±JÃPÆñ/½m¥dk;X‚„ ê’‚ ‹|wŸ¤/ЭKöB^!ƒ ŒqŒí Á  Ü,…ÒÒ–›Ü'‡ ÈÍæ™Îòû‡£¡Á¸®{Ì9¿)Šâq2™¬ ¥Šg³Ù!$¶mûÁ0ŒÏétz š*6 ã¥ÓéôG£|߇iš›ÅbqBT±eYý^¯‡$I01 Ž–Ëe¨©âªª ¥Äv»EÇÈó|Ã;o5ÁBt»]!V»ÝîÊu]¦5ÁBDQ´JÓôÚqœ÷_Øÿ4ŵ€çyíý~ÿfYÖ©*®=R–e¨”²Rŵçܦ”’(Š´¢(* íï…1v?A)E’ò‘çùÝ_¸Ãðòp8<éºîqΟ˲|Ïç%þý|˳ÛU:¢IEND®B`‚enigmail-2.0.8/ui/skin/tb-linux/images/enigSignNotOk.png000066400000000000000000000006631334302754500231350ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEÙ Ï¿Vf3IDAT8Ëcd ü)‘’ø÷å›%ïoûØæýúÈÀÀÀÀD¬æ×ìª?ðßd6^´Žá—Û“‡nœ¶Dð:‚]•ŸOû#Ÿ0ßï— ×.ÉóH0m½jÂÉÏD¬ffžB̺¦ Œçê4½-˜Ícy?2þ·g$V3L쟎ÿmû>ß~ùùã75fR430000~zÃðï͇wOþ|738õç#)š88þÜ|þîî«÷Z‡Üf````¤D3†¤jf```€‡ÁŸ>öϼǙy~H«%ü¹xBŸá‹")šQ øýËšQ>ŽùÏãÿDkF{´%ý]òÿŸ²žÿßLDþ|³¹sÍ–C•>x F ð} —ä<¯ òiÕŸ Ǿs~¿èpáà­´­8BþêjIEND®B`‚enigmail-2.0.8/ui/skin/tb-linux/images/enigSignOk.png000066400000000000000000000007051334302754500224510ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEÙ¶ƒ;+EIDAT8ËÍÒ¿KqÇñÏÖiø+“PpÓÅ"¢XàDôŸ4 ý ­îAmŠCäV¡!GYáà)*ix޿ߦ†#ˆïÑÒ3=Ëë=<<,L+Ÿu²1ÖÔëèáË𬸚 Ç2[óG³—‚;Ù(Ÿ†¶™Õ\8æ .ÜÙ>O«§¡ ò.Op+/O{m¬8Hû'¦ÜÕ¯‰'áõ…„öcñ–cÅ€P ú°ƒNEÄ .Ôw)Î[Á”j° “ Tí]^^;C“³‚)Q!ß—º}©¶¾”íKÀýÿXŦ-¥ì Åù43ŸžcŦ?xn79ÊG(SVl ÑhÓسµÄ"Gt•²`°/•ºpYvñV¸ œƒ¾ª²”ù ›np”ò}î¯x¢îÞ¹¡7ŠcXÞ9?_Y©ì6[MXÌIEND®B`‚enigmail-2.0.8/ui/skin/tb-linux/images/enigSignUnkown.png000066400000000000000000000007711334302754500233640ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEÙ¬^‚’yIDAT8˽’½OÂ@ÆŸëÇ"q! àEH'MDhŒ³»“ÿ;N²tcéNÒÄ¿€ÁÑÁH""†¡²)‹!ËbâG®íƒ¶!„@Y|“[Þ{~Ï]Þ÷!X¡,ËJ2Æò®ë^•J¥w¢Â•JeK–åG]×/(¥/†a‰ SJïTU§R)4 d2™Ïn·»©DÏÊå§éž[¯CUÕõN§s¸€—$ñ•N Ã0>ŠÅbRYöm¸o·Ãþ^.‡ïµ51v-ËrÈ"8›ÍÆ…àœÃ÷}ä €/I¯ ç ¬‹_ÉDæü$Ð+Q`ß÷1µ²S\L˜ƒZ­¦PJ/çÁ¶m¿ðÿ¤çÓ†ƒÁ`€Æ9³p¿ßß'€BB€É\Ƙ®išlÛ6q]WLæiö‚UÎÎ,œã8ljDš¦¡ÙlrY–Ÿ‡Ãá‘iš½EY Z­ÖÎx<¾‰Åb5ÆØ­çyÕjÕ îIÄØÿýg-Új¶ÝO`IEND®B`‚enigmail-2.0.8/ui/skin/tb-linux/images/enigmail-settings-small.png000066400000000000000000000026711334302754500251510ustar00rootroot00000000000000‰PNG  IHDR ‰øÌsRGB®ÎébKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÙ9.ý§n9IDATHÇ}”]l“×ÇçµMcËŽ«Äo ¥àÐÄ$Q²ñ!ª*D§HÍT µZW2èÝvG×,¤Ctb†UÝE%Øå$@M(Y%\†ª¶HvíR§-Mó…º)fù²ÝØÁ¯ãóæ=» É ;Ò¹8GþçyþúŸŸà¡õæ‰N”Rx½^¤,Q’%P`EJRñÎ_Þ^V¯=xèøÃ±Å»—€0Pf€€çmbžcoü~™€ý¡ìRšgžÜôÄ1½º†ÜÌ Ùì¬YãxÁ²¬’ÿþÏŸ€“€Zµa³ÕêOT½jJi|ÿâüÐÀÐÓ©ÉÌÖ±;—,¥ŠÕ5U‡v6/{Q)…Y’º_÷{ún~“ :sèº_ïzcº¾©Î?vgrp;Ü¢uÿqìB”R|›èå­¿öÞ=¼¥‰Ï# {â“?ò}î-jªሩy=3›Ë_í>EëþãËFX|väÅ'c±O/©¶gÖ®[˜si¿ü3­"õý§jg£3ô<쎟Úõ“–ŒrØ¿e|ªŸ­õß±wÏwÅJr€†à »· ³v팊G¯¶=ìAáõ_Qò=^^6”øFÜìûѯà©HD¡{ ÆZ¡d"rìQ±ØçrI`ÑÀ‘ü~æÜ¯‰TUÿÏÝŒ»Êé›J#E6íòðaú.¿Ù[†–øräïKS,å@YE"‘(á+}Øòÿâå×^§/| ߆6TîàïÄ9ñÁ`-¦Y\™Äb±ÈÜÜw¾¾NssFjˆ?w!vå]ÖÃ<¶ÖÅÕðÇí~í §Ó‰Óù#ž;r†¦Öß‘–N¾û>{_y“áI‹¹ÙYnÆ?¢©±§Ó¹2ÊJ)Q_W«òånaU›šÙX*Ã0Šèµ[ùé“LgRX–RJ)ñ €”fÓ¦³¹ýÙÚuø¼,eÁö£P(eñâŽd²3LLL MÓ²‹é_ì lhðöÙüì¯MÓ´Í[óKñ^öu…†Ýn›MŽœ€!kB–¤XHèêê²<RJJ¥B à  i‹5‡CI)Õ²g:::p8šRêç·RÊ= ÿ4 ão¦iöÚl6NŸ>½:Pîó@¾]SSó^ Ø£ë:x½Þçü~ÿà­ÏVBÔêºþª”ÒˆÇãçŸN¥R[ÇÆÆ.)¥ŠÕÕÕ‡-Ëú?ŸOÅb±•™L†Ý»wˆ©©)úûû°-*.Ó4½½½D£QèééÁ²,ü~?'NœÀ4M’ɤ ­ÊƒD"ASS“““tttÐÝÝM¡PÀårqíÚ5„æAYYG¥­­ ˲8{ö,$NS(ˆD"466>šuuuÊëõ Ã0ؼy3RJ Ã`Ë–-:tˆt:u«ð@Ó¦s¹œ¾qãF*++±,‹––”R(¥hii!—Ë111±:†‡‡ÌÎ.ð`þ<Ð4ìvû|2™\âÁ×’ñ‹Ü¤ÌIEND®B`‚enigmail-2.0.8/ui/skin/tb-linux/images/enigmail-settings.png000066400000000000000000000037451334302754500240460ustar00rootroot00000000000000‰PNG  IHDR,aUHðsRGB®ÎébKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÙ  Óc¬ÚeIDATHÇ¥–ml[ÕÇÇïŽ}ëØijš44(¡I Ê(E…½H‚²Ä[-&±}Ù¤}™[Øè²òešöÄTA@+SÕ±ŠÂ$Öv# ]Ç­Iš4/MÝ8]'vì{í{ï³I,—Ú]»éêZzÎùŸŸŸó<ç—ñÏáp(–e£8N,ËBDèÞõR͵ŽZÏwl~| èÀoþöÍ7rÙ¹œG)Äç÷™ amÍ mÁ¡ì³,ûËÀñ+J…Óå|¶©%Z73ÒÇFƇ2fµ,kiZ7æ²óOŽ'N_HÏ+›£^§ÓñíjU‰m˾/ÜPÏgŸ Ú–e?ܽ륡Šðx|çsç§fNÞps‡31™|x抈EÄ·ñ¶»°,Ë L|1Þ½ë¥ÛwóÊlÛÖ.K,"œü×;¤Îàбu¾@yÒGïïäÔ¸`ZBÀ/\»R8ø!¸\ Ë_}ù4ECÜ·õ‡U‰;#€ÝÙêçàþ_ñ•õnçCw» €|ñyàNq~ú.«£6€ ¼]+ÇË’§÷oZwËõÊ]· £(°ní‚V8 g¡½~›kÛàäÌÍΩ3c?TKxúÔ§{Õ† ßDŸþ=ø“›gƒëZ h»oƒaÀØg°õ~ð+Z¶ñaßqUKøìИƒþ>8;ũ ð‹ØxóÂ+ã0<¹ið{Á¸I7LOOU?<¥Té‘m[±ÂOкò[¡yÍBìØÒ¤uмnáç à{_0:vÇË'C&°¿z{ß{ÿ=²çÕWWHžˆlÙú˜ôí“—_ù¬j]+¸B‚+$þ«à ‰Ó‘;ïþš¼²çe¹÷þ{¤òЍ¬ Ñ4U«šØúýÞy÷{ÏÓõã_ÒrË<õÂïØþâ>Þ8jðÞÁ79~üSV­jFÓ4+æÒQI¬<yðÛ¤ïhŸ8˜_ ·±ù;¿f)‰o5Ùþâ>Z[#V%±(¶kq'Pg‹Ñ®¹f%÷\Ÿ#tk‘…nC@›…&¶I§/`™ÂÈ™ÓØ¶‚ÀPrU8‰sêÜô ;ò÷ç깪!™Dbê§‹€jIp‰Øh€¿r•¨.^B »ø¶.»8£Ô‚KÛ¶½à.Î —îîþ\zÇŽÿîÒñøUºt<ަiÛžúúz8Vóóó躎išX–e†Q‘m¹\î½jäU=/ nVJõƒÁºb±hž9s&gš¦§Óiz<- s¹Ü¾`0xå.­”zÖçóÕ†¡çóù¡R©ô¨ˆ¬‘MÓ|¼P(œ.•J†Ïçó*¥®Ü¥ûÜn7º®Û"òpWW×E.½{÷îÃ0NjšæÔuýê\:‰ "U]º««kpûý~DD»ìá‰ýýýLLL0::*íí파ŒX"lkkÓ“É$¶mãñxˆD"ŒŽŽ–¢Ñ¨kjj ¯×«yòÉ'/%>pà@çààà‘T*eûý~&'' ƒÎúúúÂÌÌŒ˜¦)–e‰a’J¥DÓ4W&“Áãñ "öììlm—žÝ´lÙ2åt:~¿ÇC±XDDðûý‹Ÿ¶…BÓ4U.—«íÒétZÒé4™L€††¼^/¶m“L&ËÂáp€óçÏ …H§Óµ]Ú0 r¹¦iâv»Éf³$“I@ùt]G×u,ËB)…mÛ”J% è^n[¶l)Åãqš¦‘ÉdÊTµFcc#ù|‡ÃA>Ÿ¯^±XL­X±Ânjjâĉ(¥ˆF£´µµ177Çðð0…B€;þþ~”R„Ãaš››9wîÓÓÓŽÞÞ^¹¨*z{{Åår•«½½d2I:fhhˆP(Dgg'k×®-çÿöÛo'“Éà÷ûq¹\,‰^Ò ¦i–©†‡‡‰F£D"ŠÅ"­­­ ðùçŸS_¿àÇŽ# -UFí–®$îìì Nãv»™œœ¤££ƒÁÁÁ2ñ¦M›Ê9^ú¤½„8‹©JbÇCCC‘H„ŽŽfff8uê---eâ|>®ëeâX,¦.:¼X,æÜMMMúêÕ«±m›b±H±X¼âª˜˜˜ ‘Høboo¯­wqÁ¦¦¦ñåË—k>Ÿ·Û}Éß[ªå¥aYÅb]×I¥R¹D"q]U—6 ã…™™™ç¹j—&£ëúE.½$lz*•z 8ð¸t°þ‚³ŠÄ`KÇIEND®B`‚enigmail-2.0.8/ui/skin/tb-linux/images/enigmail-toolbar-small.png000066400000000000000000000027731334302754500247560ustar00rootroot00000000000000‰PNG  IHDR0_úWsRGB®ÎébKGDùC» pHYs''«³ïÉtIMEÙ 2é¥À{IDATHÇí–]lTEÇÿsïôÞ»¥Û]Z¶Ò†~°-+Pè‡Á*RLÆ6, HˆŸ4’H jÑê³òÆ"PÁ4©–ú@$h¤„ºà¶]º…ÚÒí~övïÞÝ;÷ŽX±hñÍ„“Ìœd2g&9ÿs~3¤ýØøpÎ1[ã ÜÆÉïOƒxÀ>³7à€>ê ö}¸÷ã ”Røk~ÌÝ fà‹¶VØ(˜¦EúÀ-B˜¦ ˲ñÓƒ÷îÝÃàÀ 8ç„©©)Ô××cll ©T ”R‚ðÀ˲ fÀ×—.]@MÍrhi d³c(..A$c ’$!''’$!žˆãøÉïKDŽŽ#‘ŒáÛcG±ýíw²w''!Lgß²Lx< =PDUU´·Ÿ€Ó•‡Àí!ø|È:ä9®{û6ØJÓé4Æ2º†êêjx½^ÀøÄ8r2¢¡*+<ذv~9wÁè8œºº»Á²¬Öt†±ñ0êêêPWWš£Àíö K¢¹y-”ܰd4=?¼g‘Jé(Y¸Kž]B.^¼ØÃaí¡&3¨ìrˆŠÜp–­g ]ƒ ˆÐ—>Ãíê ®¹ÍèëëãË—U›Í6ùyë—º`S”¨ÏçC4ÅØØ8L=Æ9OV¦ƒe¤À d2zf|"’).žOº»»¡(Štû–-ŸíÞ³«/k˜¤¥¼Rºµ¹ˆsn†ˆ‘ ‚ËE0³IhS“‰Žö£ßØz}SŠ,EQ†€®~mí€Ã°{uhè‘BR„H ™ˆ(³{е)%æõ÷œ8yþâÃÅýHÝé¹{ºã éú-?œDi$œ.ð”O‹òmÑÛþìhb’ñ$fÍbýG´~EöØËÿ3Øû”Oyð”ÿtut€sBfè HWGÇ <¸¿´nãFвªª8çM3pÃëEÙŒ ?h£š ÃX'I›Í/…Ã0¨$I?h£–eMŽB*B¡PlåÊ• ŠÅb8wîB¡jjjæ–——&“Éó ‚Pà»v-Àa—Ëõrooï#ÁCCCEñÝE‹}P__ÿ^AAAâÔ©SvMÓ ¦eäeUUö߯^}si]Ýa—Ëííí€ @„¯ûûûw8Ÿ¢(~]×ÑÐÐp¥¤¤äŽªªÎjeeåû~˜VE–åýÃÃÃ;EªªK5M[σÝn_111±†sþê#…tùòexÑår B„`0褔"•Jq›ÍvÅãñˆƒƒƒ\×õŠ¢äúýþùÂtpCc#æÍ›·œr¨¿¿¿Òëõ. ­ùùùMÓÌÎÎΉÄ[e¥¥Ïkš†x<ŽX,–C§¥¡”[–u]UÕÑŠŠŠ×-Ë2TU“L&sEQý†ax‡]Ó´eŠ¢´8N9ç0MÓÌf³ Ãáð.§ÓiWUõS·Û½Üét^€L&Ãoݺåñûý[E¹âv»B~¬­­Õ„Rº&çpΫl6Û'.—‹2Æ^Êf³ÓïaŒñ¼¼¼úx<¾>77œóû< „´qÎë !œs^®ë: 0ƶ¥Ói.Ë21 ét:$Š¢&Ëò©Tj§ ·€ÖÖÖvè€ÎÎÎv»½ À6ÆcDE˜¦ ƘÎ655=žªªöܼyóÌÈÈH~6›-Íd2N§3¨(J4N2ÆžŒü×=Ôì;…Ó]©;IEND®B`‚enigmail-2.0.8/ui/skin/tb-linux/images/enigmail-toolbar.png000066400000000000000000000034221334302754500236400ustar00rootroot00000000000000‰PNG  IHDRHìù5sRGB®ÎébKGDùC» pHYs''«³ïÉtIMEÙ 8è’IDATXÃíX]L›×~ŽýcŒ‡ƒó% `¤@a”mžGK´«uÖJP²!­šz³EÜ-Ó¤],Q´ti+íb“JÒîGËn¢e»Ù–”¦UwE*ªmƒÉ¶k ¥ÃŸmð|þ¾ó·‹Ä?¶ƒ‘&•#ùûœ÷9Ïû¾ç{ŸÏDJ‰§Ù,xÊMY?yûêo‘Îævdp.Ç›£oUdp €Üa¿¸Á¢”²Ô/¿~Iî´=²Q²¹ÁE”RƒA ‚ÆØ†ƒBJãõß[­6 kˆD" ”V2¥^¯¡P¨´™s!Di¾~Ì9!V+pûö¼^ï€M ž¸¿¿~¿>Ÿ¯b0çç?AxzssqXu>ƒ¥¥ÿ¢¡¡¡2ƒ¢KÀøøxYãÁ‰þtí ÜÄ©SCPì3Ñiüî÷Wqê¥!,,Ìcaa¾ò=àœÂétÂçóm™Á;ïÜDÏÑCH-'ñ—¿^Çr2 [‚C‡;pãÆuþÀG[]dFÉ¿+i îfu Hl.µµË©pSâ;ß~BŒ½{”r¨-øa*<‰S/ màœ„hnVãããb1vû&ú¿|3S1œýñöï¸n¿ªâÍÑßàÈ—º1žD¡P¨ì")%’ÉäãÅLûÆ×¿ Ã4ÐÔä.±ó4{ÀÇß®ÿ…B¿¼ø+YŸÓgG~$¯Ž¾ MÓ°ª¯"ýï×Ñèî„ õ‚‚­f‘N'a'Ör9hŸÅÑßs¶£Ã¥ƒ¼öÆ«øÙONʦi1ÇchkmÃꔉg¼/ÀÖØ È<¨Ųƒ³q?ô\þk Ÿ-ÌáÌ+¾²l+´¶¶Ì‚ I—4ÈB² ¸¹ É]7Á…a>4Q.ã¶|õÙg/~oøô/ŠóŸ|—C˜ _ä2„‘]KC4¸ Ø*¨±Š᯽öÆ«?¬t!Iµ‚óÁèsòø‹gÐÐ~Iè3a,.$à9؃B>‰ÞƒÿîÇoýú=íìœB>'…™° ah «Iš§9˜zºN·_p6·…Xìò?þðçç¥ýŸX^““šÙRX3éWúÙ§N2±ÿ˜z:É?¬fƒ<횬Դšê¿—9¬R㬒×t¦š\´žÁ6÷ÕÆà âµ§‹ötÑçYU½»¡‹Êºh7uQ{{ÇVëu‘{“.*ö™°ÏãFZË`øû?ÀáÃGÐÛÛ‡—_~©D nO¦Â“Õ]´º¨ìÓtOíé¢Ï©.ª­&?NíBÑ·Ö °§‹jc0::ŠL&³#ƒñxW®\)pâĉÝÊYR1ŸD"d'–¿ØÓ#«yÀë•ííí¤]¤( t]G:–Ùl¶z¥Ói@vtt¢"„€RRkűV«„Äb1)„ Š¢Tgàõz ‰BvuuUtW"‘Hkš¶/“ÉÀb± ©© èºwïÞãÓ´··š¦‘X,&+dŠ …Bû8çèííí¶X,H§Ó˜˜˜ˆöõõa~þ1ºˆ1ŸÏWdqqQF"477£P(`zz:ªë:, Ün7Âá0êëëýUo²”©TªXÉz!µ²²§Ó ]×!„@ww7¤”ˆF£BÀétbqqñkªªVf „€Ç㨪*5M#ÅžL&áp8 ë:&&&H>Ÿ'¹\޲¶¶‡ÃMÓ¶§‹b±˜Ô4¬^B´µµÝàœcddŠ¢È¾¾>œ;wBÜ¿CzWd „‰D‡CNNNÊP($ƒÁ t¹\˜=c·Û166&—––PŒÓÝ»wIKK îܹCªÆ€1ö-Ó4 ©ªês@à}Î9Ž;&óù<ìv; Ã@<G6›…Åb!äéÓ§¾‡]ºTA>Ÿ¿³³³ø‚ñÞÉ“'qüøq0ÆÀ+2,õbÆ566>¾„B!ùè”R˜¦ ÆX—Íf‹š¦ Ó4QWWÎ9cH¥R×B¡t8ÈçóÕ6?èì.—¤”ÂårE)¥ ”‚1Îy €RZؼopp°<À‹CCÐoݺ%)¥¤h¬È RtÙæ}Û.™™LæòôôôóŠ¢€1vÐ0Œ!UUõS«ÕšÑu]§”>¹.†ÛíF}}=t]G.—ƒa@]]ü~?æææ «Õq¹í~þüùšÖK)ÿÏþñºpá‚4ÞÖžÿDfkÀ¢îuGIEND®B`‚enigmail-2.0.8/ui/skin/tb-mac/000077500000000000000000000000001334302754500160405ustar00rootroot00000000000000enigmail-2.0.8/ui/skin/tb-mac/Makefile.in000066400000000000000000000030261334302754500201060ustar00rootroot00000000000000#!gmake # # The contents of this file are subject to the Mozilla Public # License Version 1.1 (the "MPL"); you may not use this file # except in compliance with the MPL. You may obtain a copy of # the MPL at https://www.mozilla.org/MPL/ # # Software distributed under the MPL is distributed on an "AS # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or # implied. See the MPL for the specific language governing # rights and limitations under the MPL. # # The Original Code is Enigmail. # # The Initial Developer of the Original Code is Ramalingam Saravanan. # Portions created by Ramalingam Saravanan are # Copyright (C) 2001 Ramalingam Saravanan. All Rights Reserved. # # Contributor(s): # # Alternatively, the contents of this file may be used under the # terms of the GNU General Public License (the "GPL"), in which case # the provisions of the GPL are applicable instead of # those above. If you wish to allow use of your version of this # file only under the terms of the GPL and not to allow # others to use your version of this file under the MPL, indicate # your decision by deleting the provisions above and replace them # with the notice and other provisions required by the GPL. # If you do not delete the provisions above, a recipient # may use your version of this file under either the MPL or the # GPL. # DEPTH = ../../../../../.. topsrcdir = @top_srcdir@ srcdir = @srcdir@ VPATH = @srcdir@ include $(DEPTH)/config/autoconf.mk include $(topsrcdir)/config/config.mk include $(topsrcdir)/config/rules.mk enigmail-2.0.8/ui/skin/tb-mac/enigmail.css000066400000000000000000000206031334302754500203400ustar00rootroot00000000000000/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ /** * Enigmail styles for Mac OS X */ @import url("chrome://global/skin/"); @import url("chrome://enigmail/skin/enigmail-common.css"); /* common styles for all platforms */ @import url("chrome://enigmail/skin/enigmail-pEp.css"); /* styles related to pEp for all platforms */ @namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"); #button-enigmail-decrypt { list-style-image : url("chrome://enigmail/skin/decrypt-active-18.svg"); } #button-enigmail-decrypt[disabled] { list-style-image : url("chrome://enigmail/skin/decrypt-inactive-18.svg"); } /*************************************************** * Icons for compose toolbar: encryption ***************************************************/ #button-enigmail-encrypt { list-style-image : url("chrome://enigmail/skin/encrypt-inactive-18.svg"); } /* hide label unless text-only mode is enabled */ toolbar:not([mode="text"]) #button-enigmail-encrypt .toolbarbutton-text { display: none; } #button-enigmail-encrypt[disabled] { list-style-image : url("chrome://enigmail/skin/encrypt-disabled-18.svg"); } #button-enigmail-encrypt[encrypted="activeNone"] { list-style-image : url("chrome://enigmail/skin/encrypt-active-18.svg"); } #button-enigmail-encrypt[encrypted="forceYes"] { list-style-image : url("chrome://enigmail/skin/encrypt-active-18.svg"); } #button-enigmail-encrypt[encrypted="forceNo"] { list-style-image : url("chrome://enigmail/skin/encrypt-inactive-18.svg"); } /*************************************************** * Icons for compose toolbar: signing ***************************************************/ #button-enigmail-sign { list-style-image : url("chrome://enigmail/skin/sign-inactive-18.svg"); } /* hide label unless text-only mode is enabled */ toolbar:not([mode="text"]) #button-enigmail-sign .toolbarbutton-text { display: none; } #button-enigmail-sign[disabled] { list-style-image : url("chrome://enigmail/skin/sign-disabled-18.svg"); } #button-enigmail-sign[signed="activeNone"] { list-style-image : url("chrome://enigmail/skin/sign-active-18.svg"); } #button-enigmail-sign[signed="forceYes"] { list-style-image : url("chrome://enigmail/skin/sign-active-18.svg"); } #button-enigmail-sign[signed="forceNo"] { list-style-image : url("chrome://enigmail/skin/sign-inactive-18.svg"); } /*************************************************** * Icons for compose toolbar: attach own key ***************************************************/ #button-enigmail-attach { list-style-image : url("chrome://enigmail/skin/attach-inactive-18.svg"); } #button-enigmail-attach[disabled] { list-style-image : url("chrome://enigmail/skin/attach-disabled-18.svg"); } #button-enigmail-attach[addPubkey="true"] { list-style-image : url("chrome://enigmail/skin/attach-active-18.svg"); } /*************************************************** * Icons for compose toolbar: Protect header ***************************************************/ #enigmail-toolbar-encryptHdr-button { list-style-image : url("chrome://enigmail/skin/headerUnprotected-18.svg"); } #enigmail-toolbar-encryptHdr-button[disabled] { list-style-image : url("chrome://enigmail/skin/headerUnprotected-18.svg"); } #enigmail-toolbar-encryptHdr-button[checked="true"] { list-style-image : url("chrome://enigmail/skin/headerProtected-18.svg"); } /*************************************************** * Icons for messenger status bar ***************************************************/ #enigmail-status-bar #enigmail-signed-status { list-style-image: none; visibility: collapse; } #enigmail-status-bar[signed="ok"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignOk.png"); visibility: visible; } #enigmail-status-bar[signed="notok"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignNotOk.png"); visibility: visible; } #enigmail-status-bar[signed="unknown"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignUnkown.png"); visibility: visible; } #enigmail-status-bar[signed="inactive"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignInactive.png"); visibility: visible; } #enigmail-status-bar #enigmail-encrypted-status { list-style-image: none; visibility: collapse; } #enigmail-status-bar[encrypted="ok"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncOk.png"); visibility: visible; } #enigmail-status-bar[encrypted="notok"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncNotOk.png"); visibility: visible; } #enigmail-status-bar[encrypted="inactive"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncInactive.png"); visibility: visible; } /*************************************************** * Icons for compose status bar: signed states ***************************************************/ #enigmail-signing-status[disabled] { visibility: collapse; } #enigmail-signing-status[signed="forceYes"] { list-style-image: url("chrome://enigmail/skin/enigSignForceYes.png"); visibility: visible; } #enigmail-signing-status[signed="forceNo"] { list-style-image: url("chrome://enigmail/skin/enigSignForceNo.png"); visibility: visible; } #enigmail-signing-status[signed="inactiveNone"] { list-style-image: url("chrome://enigmail/skin/enigSignInactiveNone.png"); visibility: visible; } #enigmail-signing-status[signed="inactivePlus"] { list-style-image: url("chrome://enigmail/skin/enigSignInactivePlus.png"); visibility: visible; } #enigmail-signing-status[signed="inactiveMinus"] { list-style-image: url("chrome://enigmail/skin/enigSignInactiveMinus.png"); visibility: visible; } #enigmail-signing-status[signed="inactiveConflict"] { list-style-image: url("chrome://enigmail/skin/enigSignInactiveConflict.png"); visibility: visible; } #enigmail-signing-status[signed="activeNone"] { list-style-image: url("chrome://enigmail/skin/enigSignActiveNone.png"); visibility: visible; } #enigmail-signing-status[signed="activePlus"] { list-style-image: url("chrome://enigmail/skin/enigSignActivePlus.png"); visibility: visible; } #enigmail-signing-status[signed="activeMinus"] { list-style-image: url("chrome://enigmail/skin/enigSignActiveMinus.png"); visibility: visible; } #enigmail-signing-status[signed="activeConflict"] { list-style-image: url("chrome://enigmail/skin/enigSignActiveConflict.png"); visibility: visible; } /*************************************************** * Icons for compose status bar: encrypted states ***************************************************/ #enigmail-encryption-status[disabled] { visibility: collapse; } #enigmail-encryption-status[encrypted="inactiveNone"] { list-style-image: url("chrome://enigmail/skin/enigEncInactiveNone.png"); visibility: visible; } #enigmail-encryption-status[encrypted="forceYes"] { list-style-image: url("chrome://enigmail/skin/enigEncForceYes.png"); visibility: visible; } #enigmail-encryption-status[encrypted="forceNo"] { list-style-image: url("chrome://enigmail/skin/enigEncForceNo.png"); visibility: visible; } #enigmail-encryption-status[encrypted="activeNone"] { list-style-image: url("chrome://enigmail/skin/enigEncActiveNone.png"); visibility: visible; } #enigmail-encryption-status[encrypted="activePlus"] { list-style-image: url("chrome://enigmail/skin/enigEncActivePlus.png"); visibility: visible; } #enigmail-encryption-status[encrypted="activeMinus"] { list-style-image: url("chrome://enigmail/skin/enigEncActiveMinus.png"); visibility: visible; } #enigmail-encryption-status[encrypted="activeConflict"] { list-style-image: url("chrome://enigmail/skin/enigEncActiveConflict.png"); visibility: visible; } #enigmail-encryption-status[encrypted="inactivePlus"] { list-style-image: url("chrome://enigmail/skin/enigEncInactivePlus.png"); visibility: visible; } #enigmail-encryption-status[encrypted="inactiveMinus"] { list-style-image: url("chrome://enigmail/skin/enigEncInactiveMinus.png"); visibility: visible; } #enigmail-encryption-status[encrypted="inactiveConflict"] { list-style-image: url("chrome://enigmail/skin/enigEncInactiveConflict.png"); visibility: visible; } enigmail-2.0.8/ui/skin/tb-mac/images/000077500000000000000000000000001334302754500173055ustar00rootroot00000000000000enigmail-2.0.8/ui/skin/tb-mac/images/col-encrypted-signed.png000066400000000000000000000020031334302754500240250ustar00rootroot00000000000000‰PNG  IHDR w}YsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÛ  é=ÁƒIDATHǽÕ_lSUðï9÷ÜÝ[Ú{ÛÛ5¬ËXvgÓ9,ƒBD·Éб¨‰ MÌL|àE}QWL‘W÷¸G’!þ˜¬‹ÆÀE3BöÇ.v“kW6ÚŽv·½÷p:D×.$ü’óô;ç|¾999‡ BMÅZun’@ ‡v~:ý ¶Xé‹!¡l´JÆpàÄïÙ=R §¢<â>ÛÄ÷gg‘OüÛÙ?yªZ|rpGÐé Žkú{jná»Õ»‰Ë½{Þ¿óÃzŸþ/~&¬SÉ1R÷ò+MŽFÌqÞènh‘hlêô®þjq—¿mŒ9û¯´F˜^Ë$a[2Dw¶±B]`ÌQ €0DT 8ÝžjpnH]‹/ç3ѽç×<`j ªsËþZ‹<ð[Õý0 ¸Ya ˆ¨‚H(Ý[BéÞíï$@r ª[@\kïÖ·5ÔÛ%˜¹ˆ+ Ê38¨Ü3›Ajøó›L }ƒ€°·E×"½º£¾Ü̶é+Püã8¯‚)A”sKX>}“ÜϾÐ|rlŽÇ;™!5\ñíênØ*þ÷C”Œêœ q-üš.ÕÖÀ6nƒ©{9»¸G‘c®ísuiž ÜÙÜ76³C­Ù¸ª…:(!Ù 49Ø©ƒŠqoä ]®¥°Vo€¹Ú lkmdÑÜ7zªùÝѳ–XöÛÅÌ3EçrË:öÚÚsßKBzü2±Ëß ŒˆVÜ~KwQZƒ´ýu0wäÁñÿ¼ÔÁ·¯æäþ½Áõ¤tüØþ lßQÌ_º`™Ï©Ä±jð—QÝèA~⤆>0íE,|õÎ_]Zqƒ/ã©}VþäeeÈ,š£E¹0уYõO5¾‹[¥¥‡Æüù.Ž'TŒ·¾}óá›)Ð'åãOãÁƒ¨)wæIEND®B`‚enigmail-2.0.8/ui/skin/tb-mac/images/enigEncInactive.png000066400000000000000000000012761334302754500230540ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÙþO¼>IDAT8Ë’AKA†ßùvf–ºn)»"+8 1K6‚ öÖ³·þOÐs) ’ÜDü ’SsÑ‹ ^ò ê¡`“›¢Äl0N”LOK}®Ãû|/ó} oP,Õ`0øÎ³–J¥Úówë­°¢EÑ—ÙÙÙ,}Ëçó¨×ë§o Êå²âœ×gÇÖ©T ¶m¯d³YÄq|úª`kkË%¢ÆÒÒÒ ç———0ÆàööJ)H)W¢(ÂÉÉÉ)I`YÖ× f|ßÇùù9„B Ùlâññ™LDT¬T*mzI@D "pÎ!¥„mÛ°maÂqôû}är9¸®ûãÅœóßWWW`Œajj ÝnwØÂó´Ö×u‘$ ŽŽŽZZëeëy˜ˆâ(Š”çyÐZCF£f³‰ùùyxž‡$Ip||ܺ¿¿_ÞØØ¸`°»»«Ä¹\N9Žƒn·‹ÉÉIœ¡×ë1=ÆXÑuÝI’ü5Ƭ … `{{{Êçóy%¥Äõõ5R©|ßGµZÅúúúÓ–e}ÖZÿÙÜÜì?œ1/,,(c Z­Òé4‚ ®ó‰B¡ÐÐÙ©¹¹9Ôj5„aˆééiŒ^ƒ„X]]ýïÖÖÖÞ'"ìïï\â{ù=IÇtÈb§IEND®B`‚enigmail-2.0.8/ui/skin/tb-mac/images/enigEncNotOk.png000066400000000000000000000013321334302754500223350ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÙ1(îÄZIDAT8Ë“KHTqÆçoÎ8ÎK­Ð™t.…YQÑÓÉ„’D`„´,‚(hQD¹ˆ(*‚¨Uº‰Ú´ë±‰È1ƒˆ è‰’•:–¥è$Íä\ï¿E¡’z–‡óû8œó}•tçZƨspê–;ùý.Ó­¤;×Jæ,é²kµ][”Ó‰¬Ù§&ΨÿÁ‰ìùžP‹¹çR„<úï£ÊWan<ÓðމiáÌ€OføŸ™õFc8/¯‚¯ýHi†wMÅñÞwœN~”~wÞ&µhW+ˆó¢ É !¹8Ÿ:¡ùR¹³úBC"»ø™ŽÃ3xç Þ0xgbT-ƒ!ôA¤¶ õ|ùÉ´˜F»Ó~cÆnÔºzˆ½ï,ðçÂ?ðƒß„œ¢à$DþJ qÝ1«¢¿t"k—¢ý~þ‰ø|ôAaôŽ¢»¶ÊDx¤p½å8NÔØqÊ’Hì˜ K `` –¾iì#ûzäG¬Ü˜k­£Æîs–„=0؇øBØgÑOÚP5U°0 zìÃ{dèSyFìq—üK,m¸£ªî¢%¾|nG–—a_9ï€Ð ù«3uß«nIÅ+2bO»äWñv ;5ö^µPý𶩬ƒÅ!Rµ[ph€D¸È/Yó­=Ý[ëᨹ¿É"Þóä<ªæ2”þõéø‰2¿tÄ¡#>éa(eÉΜ[QÛn"UE¤6WÿPSæÅqW¡®¿7’¸pµÝ“éÎÄTØvüÓUÓNìoÁÅH­Æ\¬IEND®B`‚enigmail-2.0.8/ui/skin/tb-mac/images/enigEncOk.png000066400000000000000000000013551334302754500216610ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÙçT]mIDAT8ËSMHTa=÷û™7ãÌ{3£ É óÔ$E¤)+‡ \¤HQIP -Ú¶Žš‚èg]¸tBD› G#È ŠéÆXþ¥Ž¨ãï̼y_‹µ=Û{Ϲ‡{Ï%lƒþh¥©,º ‚F¤:«nÆŸ¯¯Óvd&ÝùẠÐu,b~à[´êzßÕ¾%ùvÈdBv;Ô Ã]V&ÈÅê,tMöl)¿»GgäøPÔx&(¼iX©Ïldf’pïI=r©:ƒû¯'zĦãÉÕä ”»Š‘ë ÏCªoÙ…ðÕ4Ñø=6Ë6ãsq9©ƒq$¼(8|R÷ÁÎÍ#ÿ@3Þük›:`_I&`çœÞ0ìôˆy „R/ $up·×÷Ÿ@{ØT9û™¿ö F!ƒ°–t(k $t4@Z 2³SÈÌŽ½ÙpÆD{ØÌ1ÿ¾3/P¥,ò<5 • Àœ%°æ’ug˜VRõ|=Ù–ó×6›®â(k°}˜|÷Ë??Á]~B¯@65…_]·†iq®¾ôrï@¢#l*ÅcþÐIS+pÀNA{1ÑýöòL ËŠXTx ]ÖÂÔB6RÚÖ;”舘`¹˜?tÚÔ|YX qHÿQpO%Fž\Aië[€‡u†´µÀ¢sú{uË×̪sA2ó…ΛÒ=ÌL/´ÂSÞÚ?qàk+ª¸ð> õïÒ3=åM˜ÿÒ-ÐáoÀÈÓÖ¿U¶Ý¯Ag ÿåZ9CðlŒ°â £/ÎmL2gØ)~w#Èo%$ôIEND®B`‚enigmail-2.0.8/ui/skin/tb-mac/images/enigSignInactive.png000066400000000000000000000006621334302754500232450ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEÙ»™V%2IDAT8ËÍÒ±JÃPÆñ/½m¥dk;X‚„ ê’‚ ‹|wŸ¤/ЭKöB^!ƒ ŒqŒí Á  Ü,…ÒÒ–›Ü'‡ ÈÍæ™Îòû‡£¡Á¸®{Ì9¿)Šâq2™¬ ¥Šg³Ù!$¶mûÁ0ŒÏétz š*6 ã¥ÓéôG£|߇iš›ÅbqBT±eYý^¯‡$I01 Ž–Ëe¨©âªª ¥Äv»EÇÈó|Ã;o5ÁBt»]!V»ÝîÊu]¦5ÁBDQ´JÓôÚqœ÷_Øÿ4ŵ€çyíý~ÿfYÖ©*®=R–e¨”²Rŵçܦ”’(Š´¢(* íï…1v?A)E’ò‘çùÝ_¸Ãðòp8<éºîqΟ˲|Ïç%þý|˳ÛU:¢IEND®B`‚enigmail-2.0.8/ui/skin/tb-mac/images/enigSignNotOk.png000066400000000000000000000006631334302754500225360ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEÙ Ï¿Vf3IDAT8Ëcd ü)‘’ø÷å›%ïoûØæýúÈÀÀÀÀD¬æ×ìª?ðßd6^´Žá—Û“‡nœ¶Dð:‚]•ŸOû#Ÿ0ßï— ×.ÉóH0m½jÂÉÏD¬ffžB̺¦ Œçê4½-˜Ícy?2þ·g$V3L쟎ÿmû>ß~ùùã75fR430000~zÃðï͇wOþ|738õç#)š88þÜ|þîî«÷Z‡Üf````¤D3†¤jf```€‡ÁŸ>öϼǙy~H«%ü¹xBŸá‹")šQ øýËšQ>ŽùÏãÿDkF{´%ý]òÿŸ²žÿßLDþ|³¹sÍ–C•>x F ð} —ä<¯ òiÕŸ Ǿs~¿èpáà­´­8BþêjIEND®B`‚enigmail-2.0.8/ui/skin/tb-mac/images/enigSignOk.png000066400000000000000000000007051334302754500220520ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEÙ¶ƒ;+EIDAT8ËÍÒ¿KqÇñÏÖiø+“PpÓÅ"¢XàDôŸ4 ý ­îAmŠCäV¡!GYáà)*ix޿ߦ†#ˆïÑÒ3=Ëë=<<,L+Ÿu²1ÖÔëèáË𬸚 Ç2[óG³—‚;Ù(Ÿ†¶™Õ\8æ .ÜÙ>O«§¡ ò.Op+/O{m¬8Hû'¦ÜÕ¯‰'áõ…„öcñ–cÅ€P ú°ƒNEÄ .Ôw)Î[Á”j° “ Tí]^^;C“³‚)Q!ß—º}©¶¾”íKÀýÿXŦ-¥ì Åù43ŸžcŦ?xn79ÊG(SVl ÑhÓسµÄ"Gt•²`°/•ºpYvñV¸ œƒ¾ª²”ù ›np”ò}î¯x¢îÞ¹¡7ŠcXÞ9?_Y©ì6[MXÌIEND®B`‚enigmail-2.0.8/ui/skin/tb-mac/images/enigSignUnkown.png000066400000000000000000000007711334302754500227650ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEÙ¬^‚’yIDAT8˽’½OÂ@ÆŸëÇ"q! àEH'MDhŒ³»“ÿ;N²tcéNÒÄ¿€ÁÑÁH""†¡²)‹!ËbâG®íƒ¶!„@Y|“[Þ{~Ï]Þ÷!X¡,ËJ2Æò®ë^•J¥w¢Â•JeK–åG]×/(¥/†a‰ SJïTU§R)4 d2™Ïn·»©DÏÊå§éž[¯CUÕõN§s¸€—$ñ•N Ã0>ŠÅbRYöm¸o·Ãþ^.‡ïµ51v-ËrÈ"8›ÍÆ…àœÃ÷}ä €/I¯ ç ¬‹_ÉDæü$Ð+Q`ß÷1µ²S\L˜ƒZ­¦PJ/çÁ¶m¿ðÿ¤çÓ†ƒÁ`€Æ9³p¿ßß'€BB€É\Ƙ®išlÛ6q]WLæiö‚UÎÎ,œã8ljDš¦¡ÙlrY–Ÿ‡Ãá‘iš½EY Z­ÖÎx<¾‰Åb5ÆØ­çyÕjÕ îIÄØÿýg-Új¶ÝO`IEND®B`‚enigmail-2.0.8/ui/skin/tb-mac/images/enigmail-decrypt-inactive.png000066400000000000000000000011131334302754500250440ustar00rootroot00000000000000‰PNG  IHDR Ùs²bKGDÿ‡Ì¿ pHYs  šœtIMEÕ5è׳ÜIDATxÚíÔ?kQðßlBH,4˜¨ ¢HH¥ØQPÄB$_Áʯ ©l,¢vV~ ‹”ŠEbec£©Œ5óG’‹Lf&kÈŸÂÆÓ ÷¾{Î;÷½y7H5ÿþ½@/¼þæÜ¸Ÿî\ÈwÀ¹í Áæ>é’m,iX6ªa w¡=˾÷sVA`8£ ï²oËIÔé&ÐqÀq •d?Ôœ‰„ˆü2Ph—”±æ/ÎJ|7®eD9«à ŒD(´ì… ÷²ÜŒºI}Y´Ã|¡)‚·.»¡nnI̹šÕµ·ÿÄvžZ·¤n-£oøêšØ´TjZì¦Ï…êB ©MZ•6FÕ|0î"–¼2é„Õìšã¢ƒÄÊ:‰4×Í¢?¯+´ïéßûh¢rV;ná}å8áy¶rÅfq©›@bïÜîú¾3F<®dãâcz±hÞX¡lÞ˜S~{h=ËÑSSç;ÁÓ•ô±…Ê>©xujp—²…„Îr? +{h•´ö/ ä`a/A<(‘Šhç5E¤Uí¿;ô£•ͱ®-ôhO²«SºHÒ ŸÛ‘¦¦MÍN¤júùSß‘©0Ý8 þÊ,¨ÞSªdIEND®B`‚enigmail-2.0.8/ui/skin/tb-mac/images/enigmail-decrypt-small-inactive.png000066400000000000000000000010351334302754500261550ustar00rootroot00000000000000‰PNG  IHDRJ~õsbKGDÿ‡Ì¿ pHYs  šœtIMEÕ ¹8ˆ5®IDATxÚåÒ¿kAÆñÏNöâåc% XXXV6ÆÚÎÂÊÒÂ?C°ÿÿµ³‹‚…A$*‚‡óë’ón÷vÇÂÍz&¢öÌÀ0Ï÷yæ}ùW£ëniüƒ¶ïþµÇ)Å™+K³Çþ®ßÞö„”={öM+4Í_„t±(5DÊPŒAS0. ’CÎïí8mNñÈŤ°c --'«Àv$¦tõ 옕×@LÍ›¯KC߬H̉:öœ4Å‘H•4è+½5é¢Ï8oB´ ˆr2eRصnCW®ç“%/µµ½pÙGCDÙA…2îÈê:ôÍÙ—9gܪ¯& ŒF*åGúYˆQC*(«Àõ/5µ­Ik å9Þº`ÝC3¦4+Û”Âjœ±nQCn¢Bv²bӉ݃>Äo^ ­ 77Ç6´* ç¸¬¿|µ‡1MB›”Ûî^*c)˜®€-äÅåÃUÇÎDQ¦_Ý 3‚#@‰B6òø' ôڬ ë‹nâ„RQïH4¶_=½'Œz½sS 7ÉêY’#sýsEñàü†Kº=Þ¨·ÛIEND®B`‚enigmail-2.0.8/ui/skin/tb-mac/images/enigmail-decrypt-small.png000066400000000000000000000016251334302754500243620ustar00rootroot00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs  šœtIMEÕ ®ø1F"IDATxÚí•¿o#UÇ?ïyíll'ç8Â4‡R\œ"HuIh KAEIÁ_"¥½‰–EŠ”$Ò%ᄜT§ +XÀa;ñúÇz½7±Û8ètb¤Ñ[½};ßùÎÎwüoÿyS;;;ŸÙW7¾ÜØØøÆ0ÆÜ____[XX˜yÑ;Î`ÿ[ÀZ €ïûôû}ƒóóócÈf³h­q]÷…ÐîVóä3$ €$IÒZ“Ëå´Ö(¥þ6ãÇOûü, û,½žðFI0ÆÜÄqŒˆ(c žçquu@>Ÿ'ŸÏ³¸¸xSÜ  ÕjáyJ)ŠÅ"½^ŒŸH‚ˆŽsÿ^‘8ާÄq*• •J%•¡µ–$I‡£”¢\.#"4 oÈ{o)´ÖÌϸˆÈ%J à °ÖrzzJ¡P`ee…‹‹ –——™ý‘Õj­"2a ¢(ÂZ«Œ1„aH·Û¥ÙlÒjµèõzÄqŒïûœŸŸ³¶¶ÆÑÑõzz½ÎÁÁ«««œM²¢(J3°ÖŠçyDQ4Åf\ûr¹Ì`0 Š"–––ÈårÔj5Úí6…B0 'Í1U"kí„Ö U©ÆD¥®K‘Ífq­õ¤Ý§Æ]äº.Ý‹/ˆš_á8iQÏï–àÙáçTðŸvQ¾§Ùl²½½M©T¢X,âºn*Ù±’©ÕjR*• Ýâíå)ºu’f iÝ+˜{íMN8äòò’jµ:a×h4PJÑívÓ:‘¯ONN~ô;s»ŸÈƒ>½½LëwÈÓÃ>Ì•ÞÇ„Q°··÷‘ïûd2™‰HÔ'›››  °ûˆ‡bD¬¹…[s¦u½&‘˜­­­½šKÎí(‘kC‡é÷£Gÿ»Á7‡ ö&XÜýáËèÀG·ûƒ(cÓzüùk‡(à`G5¿½N( û¬Ã“Çßí>«ü.;yRC„x¾b ¢‘›Éö<ƒÑžz‰{FFžzþ ¨¹Î˜ç…ÚIEND®B`‚enigmail-2.0.8/ui/skin/tb-mac/images/enigmail-decrypt.png000066400000000000000000000016771334302754500232630ustar00rootroot00000000000000‰PNG  IHDR szzô pHYs  šœgAMA±Ž|ûQ“ cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅF5IDATxÚì–OHYÇ?3J0²µÅDX\Ù¶@¥V(lAEDrÞSí¥§žR/"e÷Ð[/Ý£)–ÅÓšìEöÏEYØM!µKšI4é&™ïõ’ ™d&¦Ô¶0Lf~ï½ïg¾¿ß O‘Rò9C¹¸¸hììì¼¾þDº---Ýl½B°¼¼üIÔ·¶¶Ü߀z½þQÅÃá°«åpÇ}Y,ÑuR©D<G×u"‘ˆ›F£}‰=|–÷Ÿ'‘H`›“”_ý㎵,«KË×^!„À0 àT*±¹¹‰¦i¬¬¬xÆíííq·ð3Éd’P(äÉë@g8ŽC£Ñp…[±¿¿Ïôô4óóó Ð4ÅÅE„d2fff<ëµk©A¶mS­V)‹ *•ŠG¼V«‘Ëå˜ÅqÒé4RJ¤”¤ÓiÇaaa££#ßµ}K ¥¤^¯S«Õ0M³g)t]'£ª*Ùl–D"Áää¤ÛÄÛÛÛ$“IÆÆÆ8;;ólãöxBpzzz®x«\˜‘‘7777ç–chh¨k=ßôÛ„ýÄáá!š¦õì©swÁ›ì¤] þKn… ûüwÎÆîýN&“p]˜ššê@A, ð«Ê7ß®¢¨ý}µðÛ‹'Äb1666zŽõB°¾¾î&´¨”ò*ÿ©¿ínhåäÕUþ¯6X[[£Zõ:7<<ìöKg¸©Têz{â—Ÿ"¹ àØ’Wÿ|Ý“€mœ¥R©kïÓ/ƒA »­q$núûãµÿœ°Ú3 0 ÿ9êÀWœä.ÈEQ<‰Ícð@[ÝëîšæYôB°L`¨U@ô}*n#Â?="¯ÀÈûØ)%Õï~àng;æUoÞ]:T (ÍûE…Õæ†Œ.€ÏïÙ×–tä­ëIEND®B`‚enigmail-2.0.8/ui/skin/tb-mac/images/enigmail-options-small-inactive.png000066400000000000000000000011511334302754500261750ustar00rootroot00000000000000‰PNG  IHDRJ~õsbKGDÿ‡Ì¿ pHYs  šœtIMEÕ $èé#úIDATxÚµ“»oÓP‡?Ûq⼪@ L ñ˜Šx©R:0tê 101!þv´3HABbAª€­°0 …UT­Xh›8q~ÜCLj§† oçø~>ßÏGþ÷cm}ºÈ"P|åÃüÖ?÷–1[~8s§ŒEľ Ÿ†+z{Qž1“@tÙY9u»Ä¥‹¢dÙ÷õãè\òL.YXóykÛs×Ôº¶¹YX¨ó·‚_ÜËŒórù‹ÞÑ÷[7ÆuËh-¯õ>ë·òÅ\¦Òh©ÊO½»Ú\×MÝ|ÝyP7ý¥ à™#ÎjÚnû]rjïÍ@Öð¯eÃjXìâöÝa88 lº3¡GFD‡T®#Ü£{x~U¯†—ÊÕQ`nZÞák1c]©X{niƒw7DíüõÓ(t!?—\&ÌÚîÂV-¥$Q´ ˆ(a'Á2A Ó›$Œ;‘¢ø ‚; )pŒ’ ‰¦'ÈXÍÆÆä$ ªô‰PÓ@+ | u*ì~¬¢¦•¸!(Râ8?€:'øq?œVR5Íf>äß&ü$6’.vœm0ú9‡'u§zxìQÀ¥gc¢Æ€Iù›ç?ÑfÖ GoJøîQe€00&€…5±ÐñTh$ê7³§×H­êmFIEND®B`‚enigmail-2.0.8/ui/skin/tb-mac/images/enigmail-options-small.png000066400000000000000000000020021334302754500243710ustar00rootroot00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs  šœtIMEÕ Mì=dIDATxÚÕ•ÍoE‡ŸÝõÚŽ×v¬Ør RC# ”áP$r@¨à`‰ qê‰â_àŽ í™[¤ 8V!DÈ Ôø¢%Md5mb{ìµ÷kfg8$´¶d§7FšÃjfßg~¿wÞyáÿ>¬i6íìì,«ÀÓ€~¾YYY¹ùŸ[[[ŽeYç<Ïû°\.¿çyŽã ¥$úý~š$ɧI’\6Æì®®®êqqìI)åsù|þòüüü»õz4MBÐívÑZS(×uß7Æ|,¥<3)NfÒ‚ã8Õëõ•l6ëìîîúBˆ«ZëmcŒ ¼–Ëå.‹Å™l6ûzÇ÷€KS[´±±ñöâââµZ½½½V³Ù|³Ñhlÿ»¾¹¹ioÍÎÎ~677W:<<ÔBˆåµµµŸ§²( Ë¥R‰f³iö÷÷¯ h4¦Ñh|Ùét>ã˜jµjGQtqª¬¯¯ç•ROch·Û¢Ýn=ÉÆ^¯÷Õ`0H+• Q½0 ‚R’$3Ýn!D_L´Z­V†×uév»å©’†¡%¥¤ÓéÜŸ“F§ÓÁ÷}Â0Dñð:¸¶Áym2WzqýÙ‚W-E¡ç;¿dØ÷s¢òei?ñ|±XvZ‡{bλwø`ùnŒU**žyååó/bL†œq^ÄòÆK0–º h,ë¥ÊÁþîÜú®2Ñ"­ÀhP½«èd%ÁÎ-a»cíE+ÿF&£±³ ½€V§ä • ‡ >‰!KŒQc* HbC¦xÔÇ1&dÂÈ âÒHæûüxk™Ûþ«äsÎÖ¶9[ûž$R(c(8 “S*Žä„™\€—±qí„GêEžœXªì¡ƒ>ÆÖÄñezÀEJA¤5¶¥QJS¬@µxÈ u|I¢ÔÐ~BšœRh2>>õ}€„Œ›cÆ+P«–øóïß^/s³ÿ3^Œ›CÉQÅ2>MµHIˆÓ"±Éqv!æ™sûÇ' bâ BœÆ((Pòa€!Éi ¸eì|ô]tÿîéù*¸}Òôh$§,ß'Óo ŽîDh ¾+kcìñ}©'l|G`»ý¶ ÓÅ=±^lÀÛþÝøäÚØž‘¿ÖvÍõë¤À?ÝÄJÀPÖЛä%ÝÓŒœ“©áÊ3'ó¾S'ß) ÿؔޱÛþIEND®B`‚enigmail-2.0.8/ui/skin/tb-windows/000077500000000000000000000000001334302754500167725ustar00rootroot00000000000000enigmail-2.0.8/ui/skin/tb-windows/enigmail.css000066400000000000000000000212041334302754500212700ustar00rootroot00000000000000/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ /** * Enigmail styles for Windows XP */ @import url("chrome://global/skin/"); @import url("chrome://enigmail/skin/enigmail-common.css"); /* common styles for all platforms */ @import url("chrome://enigmail/skin/enigmail-pEp.css"); /* styles related to pEp for all platforms */ @namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"); #button-enigmail-decrypt { list-style-image : url("chrome://enigmail/skin/decrypt-active-18.svg"); } #button-enigmail-decrypt[disabled] { list-style-image : url("chrome://enigmail/skin/decrypt-inactive-18.svg"); } /*************************************************** * Icons for compose toolbar: encryption ***************************************************/ #button-enigmail-encrypt { list-style-image : url("chrome://enigmail/skin/encrypt-inactive-18.svg"); } /* hide label unless text-only mode is enabled */ toolbar:not([mode="text"]) #button-enigmail-encrypt .toolbarbutton-text { display: none; } #button-enigmail-encrypt[disabled] { list-style-image : url("chrome://enigmail/skin/encrypt-disabled-18.svg"); } #button-enigmail-encrypt[encrypted="activeNone"] { list-style-image : url("chrome://enigmail/skin/encrypt-active-18.svg"); } #button-enigmail-encrypt[encrypted="forceYes"] { list-style-image : url("chrome://enigmail/skin/encrypt-active-18.svg"); } #button-enigmail-encrypt[encrypted="forceNo"] { list-style-image : url("chrome://enigmail/skin/encrypt-inactive-18.svg"); } /*************************************************** * Icons for compose toolbar: signing ***************************************************/ #button-enigmail-sign { list-style-image : url("chrome://enigmail/skin/sign-inactive-18.svg"); } /* hide label unless text-only mode is enabled */ toolbar:not([mode="text"]) #button-enigmail-sign .toolbarbutton-text { display: none; } #button-enigmail-sign[disabled] { list-style-image : url("chrome://enigmail/skin/sign-disabled-18.svg"); } #button-enigmail-sign[signed="activeNone"] { list-style-image : url("chrome://enigmail/skin/sign-active-18.svg"); } #button-enigmail-sign[signed="forceYes"] { list-style-image : url("chrome://enigmail/skin/sign-active-18.svg"); } #button-enigmail-sign[signed="forceNo"] { list-style-image : url("chrome://enigmail/skin/sign-inactive-18.svg"); } /*************************************************** * Icons for compose toolbar: attach own key ***************************************************/ #button-enigmail-attach { list-style-image : url("chrome://enigmail/skin/attach-inactive-18.svg"); } #button-enigmail-attach[disabled] { list-style-image : url("chrome://enigmail/skin/attach-disabled-18.svg"); } #button-enigmail-attach[addPubkey="true"] { list-style-image : url("chrome://enigmail/skin/attach-active-18.svg"); } /*************************************************** * Icons for compose toolbar: Protect header ***************************************************/ #enigmail-toolbar-encryptHdr-button { list-style-image : url("chrome://enigmail/skin/headerUnprotected-18.svg"); } #enigmail-toolbar-encryptHdr-button[disabled] { list-style-image : url("chrome://enigmail/skin/headerUnprotected-18.svg"); } #enigmail-toolbar-encryptHdr-button[checked="true"] { list-style-image : url("chrome://enigmail/skin/headerProtected-18.svg"); } /*************************************************** * Icons for messenger status bar ***************************************************/ #enigmail-status-bar #enigmail-signed-status { list-style-image: none; visibility: collapse; } #enigmail-status-bar[signed="ok"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignOk.png"); visibility: visible; } #enigmail-status-bar[signed="notok"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignNotOk.png"); visibility: visible; } #enigmail-status-bar[signed="unknown"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignUnkown.png"); visibility: visible; } #enigmail-status-bar[signed="inactive"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignInactive.png"); visibility: visible; } #enigmail-status-bar #enigmail-encrypted-status { list-style-image: none; visibility: collapse; } #enigmail-status-bar[encrypted="ok"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncOk.png"); visibility: visible; } #enigmail-status-bar[encrypted="notok"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncNotOk.png"); visibility: visible; } #enigmail-status-bar[encrypted="inactive"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncInactive.png"); visibility: visible; } /*************************************************** * Icons for compose status bar: signed states ***************************************************/ #enigmail-status-bar[signed="forceYes"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignForceYes.png"); visibility: visible; } #enigmail-status-bar[signed="forceNo"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignForceNo.png"); visibility: visible; } #enigmail-status-bar[signed="inactiveNone"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignInactiveNone.png"); visibility: visible; } #enigmail-status-bar[signed="inactivePlus"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignInactivePlus.png"); visibility: visible; } #enigmail-status-bar[signed="inactiveMinus"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignInactiveMinus.png"); visibility: visible; } #enigmail-status-bar[signed="inactiveConflict"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignInactiveConflict.png"); visibility: visible; } #enigmail-status-bar[signed="activeNone"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignActiveNone.png"); visibility: visible; } #enigmail-status-bar[signed="activePlus"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignActivePlus.png"); visibility: visible; } #enigmail-status-bar[signed="activeMinus"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignActiveMinus.png"); visibility: visible; } #enigmail-status-bar[signed="activeConflict"] #enigmail-signed-status { list-style-image: url("chrome://enigmail/skin/enigSignActiveConflict.png"); visibility: visible; } /*************************************************** * Icons for compose status bar: encrypted states ***************************************************/ #enigmail-status-bar[encrypted="forceYes"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncForceYes.png"); visibility: visible; } #enigmail-status-bar[encrypted="forceNo"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncForceNo.png"); visibility: visible; } #enigmail-status-bar[encrypted="activeNone"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncActiveNone.png"); visibility: visible; } #enigmail-status-bar[encrypted="activePlus"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncActivePlus.png"); visibility: visible; } #enigmail-status-bar[encrypted="activeMinus"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncActiveMinus.png"); visibility: visible; } #enigmail-status-bar[encrypted="activeConflict"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncActiveConflict.png"); visibility: visible; } #enigmail-status-bar[encrypted="inactiveNone"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncInactiveNone.png"); visibility: visible; } #enigmail-status-bar[encrypted="inactivePlus"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncInactivePlus.png"); visibility: visible; } #enigmail-status-bar[encrypted="inactiveMinus"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncInactiveMinus.png"); visibility: visible; } #enigmail-status-bar[encrypted="inactiveConflict"] #enigmail-encrypted-status { list-style-image: url("chrome://enigmail/skin/enigEncInactiveConflict.png"); visibility: visible; } enigmail-2.0.8/ui/skin/tb-windows/images/000077500000000000000000000000001334302754500202375ustar00rootroot00000000000000enigmail-2.0.8/ui/skin/tb-windows/images/check0.bmp000066400000000000000000000001521334302754500220720ustar00rootroot00000000000000BMj>( ,ÄÄÿÿÿÀÀÀÀÀÀÀÀÀenigmail-2.0.8/ui/skin/tb-windows/images/check0.png000066400000000000000000000002221334302754500220760ustar00rootroot00000000000000‰PNG  IHDR “båePLTEÿÿÿ¥ÙŸÝbKGDˆH pHYsÃÃÇo¨dtIMEÓ 0—·‘IDATxœc```¨?€10¸ 8±Ë[üIEND®B`‚enigmail-2.0.8/ui/skin/tb-windows/images/check1.bmp000066400000000000000000000001521334302754500220730ustar00rootroot00000000000000BMj>( ,ÄÄÿÿÿÀwÀcÀAÀHÀ\@~@@Àenigmail-2.0.8/ui/skin/tb-windows/images/check1.png000066400000000000000000000002471334302754500221060ustar00rootroot00000000000000‰PNG  IHDR “båePLTEÿÿÿ¥ÙŸÝbKGDˆH pHYsÃÃÇo¨dtIMEÓ þ/7{'IDATxœc```¨?ÀPïÀPçÀãÀàq€ÁñCò†ò q‹¶ûg&,IEND®B`‚enigmail-2.0.8/ui/skin/tb-windows/images/check2.bmp000066400000000000000000000007021334302754500220750ustar00rootroot00000000000000BMÂ6( Œ  ÿÿÿÿÿÿÿÿÿÿÿÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÿÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÿÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÿÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÿÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÿÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÿÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÿÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÿÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿenigmail-2.0.8/ui/skin/tb-windows/images/check2.png000066400000000000000000000002261334302754500221040ustar00rootroot00000000000000‰PNG  IHDR &ÎàqbKGDÿÿÿ ½§“ pHYs  d_‘tIMEÓ  ‡óß#IDATxœcüÏ@°00008€SÞÁ‰ #K#Á084|ç®¶IEND®B`‚enigmail-2.0.8/ui/skin/tb-windows/images/col-encrypted-signed.png000066400000000000000000000014021334302754500247610ustar00rootroot00000000000000‰PNG  IHDR x0}usRGB®ÎébKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEÛ çõó‚IDAT8Ë­’[HSaÇÿßÎÅÍÍÝuºL]Í„/3šAjµÄ"ì%¡‹QôTT½Q‰‘D/QQ=$TKyéAº`æ¥6cj.¶é<º³³sz¨—®‚~ð½ý¿ß>‚e8³v/¥d#‘x-Êòéâ–Á—‡52m¨‹Ç®Ú÷ ¥FÏ–Ê(-k5”‘CàEWòo³µøøTòáöBgšÉö’×ìaÈÔ³inôÁEòhè\i“¶b}«¾ØJ„p7D~WC­œeëð¶(SÉ E›=ºU• z ëzB,G~ €UÓ—o qn ƈè$þë ,®¦Z13ÿN*¹ÚjgÙôtd¦AôÞˆ ¡q<& ñ‹Q”2DÁBW¼€tF&Ô%;®eåxÈ2hpBˆ½5ÎK|ߢÀÈ•J£57Ð,…ºâÜ[€ÖBÁÆŠÄ\Ðÿ'yÄ7 ºÝ5e§"}°¹Vå`´&·¥Ê¥% :9ÕÊ:€Ä@(#‚¯®s|Ø×ø/ò…€¯­Ê¡ÐXÜf§K'‹ß(„ß<éå>÷—kì[•Ññ{³±‰ÞM…G{û]T[Kn©sRË€øÚª”Þâ6UnÑIóïÁfÖ#Øw|À§"””#IRµD‰Ýö}=£ ¯½mת³ë§©´Ñäšû°¤hÚ`~nZ·]'„A™ÝŒÄ¼ "l;yÞŸg÷;g4í6’ø”W½{:,Ì 5/%ÿЭÐSª,¨òŽ#1C ç|!I_%‰·ß¼|¢.7Ò¶ñ"fSm‰ÿñ™ÉÈHñy³c'ów¹/à?ñ¢˜*¾Ñ¤¹ÆIEND®B`‚enigmail-2.0.8/ui/skin/tb-windows/images/enigEncActiveConflict.png000066400000000000000000000017711334302754500251410ustar00rootroot00000000000000‰PNG  IHDRí&sRGB®ÎégAMA± üa pHYsÃÃÇo¨dŽIDAT8O…Ô[LWðÅ [­i-šÆ¶1…ˆ¡o« 1^¤AôPŸŒ£HR±´ÙPlˆ$HJ±V!x)Oõò`bê j¹(‹€ì p¬‹ºî.ËììÀ._ÿ³œb6´ñKþ™sΜýí™o3K龜Â$«ãXâÉö‚Ï‹Ÿ,Ø$—‰‰b‘)HŒœO%š«m!ÚÙôe¢öõåíÝÂÓxXˆÚ v%J$I@âÌ92 ã@OåIbbu/¶v§¨ÞGß±÷i¾ðµf‹€ó{výñ ?;ºð +‘Ld>P ®‹ÃDv ¿ß"™èê(IšA›í<ôü{nÞ–¯…»akj Ôå°{ùÇ7UYtAˆhrð¯Ñ’Š®g'—dõÕlçàËjö=ÞÌÞÖ ákÛ)”ª5캅õ;Eìß°õ±ý€ŽÎÆõ:¾¤ø·˜Ï‘Ttu—.Éê¯ÝÁ†«–}mYìmË>Ç^1è8Ä¬Wærpik–ØQœîФ ð½ Q:Z3]RÑõ¼liJ÷Ùe¬¿¨ç@o)z¼O våGÖ›ìlämeãÓOØ?9†½®àú p5Æ‹ÌSR画b…µ»ìKåMC뢌G<÷Xï?/üÊ)¡+•¼ xK*kıF4ê'" t¢ цxI½+%‚®TÜ €á@_)뽿 ×¸)Œž+]—¹·.Õ¶BgÕªŽr[Ï@}I³t ]@/àѯ¢.Œ;‘½^¢$i¢©Öî‹«oëi<öOìoßÍÁ¿ã‘Á&V.®ÁÆêíú9 Ú&AP!T~H2CZ²Å°š1)S|’ AoÒ‡‚›eå–;sní9›mÖ;G·Íi¿ž3OA N×7<ÜÏý»à¾5Ùp·æk¹–&WóŽö¯ÍÛ«Ôöÿ¡H=†>4Ö@£W(µÕ€»¡kU¿sÃݾWëi/àÅÉk§›¨ä¨§ ÿu„Ÿwswnr·1?/#ýb@ÌwâÇ£Tœ:I…ñZÄ&„ÇÎaæÖž­ËgL…úàÐ)$C=>UCtÔPÉyš’î2„_鑜ïfò‹p ÕÈæðš õs¶:¤Â6HN=Dg=•¸ót‘»áýY$‚X޼„·³BP#›ÃgÙWà½Wy~‰€™Ýø]œm¡ Þyî>Ûdié¸Ác«j$;nëA­×²ŸDÆ/C¦¤£o™¬‹.‘*Ï?BòÇR’Ýú)÷ï‚ûVl…«µ@ålÙÝåhÞÕù¹ygoÿ²ÔÝ^$'htú ¥æ8o¶òïüpuîW¹;‹qæD{­õ4黎ÐÓ3pÞÜ›ŸÜ¥+Pf¥ŸÚ÷^…øþ8gOÑÈT-þ.„&Îa®c_îò¹.µ60r©àbª!Zk¨h«§¤¿¡—Z¤–ú™ü"\:u#lO·Z»h®C:dF̦…,íçéŠó"oÏ"Ðc5üžM„G¶‡×p Ès·ÒÒ8’þnvã Tœo¡IAiñÛd™ØLkÖydk\½‡UÃAžº ‰‰¾f²>*.è©´ô©¯cHÇ,ìÖOàî)žä±Í!Yé±43Ù¶r7$?“§i:øœ¦ÃÏ‰ÛØ&¯à3VäyEÓ%oLVú „DfÚdÒiCÂ× Á\……‘:šŽXéúê2¤e È`õ/éV£,-#Ñ:vS=âóMH…†á=ß@i«¯¿¤Ñq¿Ü«…ÛX!Èó<úoˆQ£ò˜Êˆh½ÍÖ¾…¾ "³òÄT>¦p=.UÓÑ=öG…;xks„!&µ÷±ÕÛ›=ɤXK8²% WüçŒ0ªÁš$ j9ÄnÛ›}˽ßÅÇrÇ?V‰õÕo•Üãßù?†Šç‰Bñ‹Æº¸­ê^IEND®B`‚enigmail-2.0.8/ui/skin/tb-windows/images/enigEncActivePlus.png000066400000000000000000000013311334302754500243130ustar00rootroot00000000000000‰PNG  IHDRí&sRGB®ÎégAMA± üa pHYsÃÃÇo¨dnIDAT8O¥ßKSaÇwÕ@wƒ(I²¤°Rg"Q Qˆ1Á.“ ¨ª]$™"™ÌU3&e I _ÒEA„ͲrËmέ½gó5gm윹ílNûöžÃ1J–ÚúÀÏó>Îó¨6ÂÕ”«v6îhw4loûܰ­B)ÿ’ÔÝšÏÍÖÑÈøeJ-Up6ç5)íìpµíQ»Ûò9~â*ø)lµ4Ệà“Óp^ߕܥÏÍ‘¥ŸZó^ÿþå'OÐðX5âþvGÏbúÆî—O·hƒ'‘œïð¡¼­Š öS”tk|¡Er®›É/À¥/¨WF6‡§£@;k©A*h`ׂ·×RÁyŽF~{‰€K¡çðt–…•‘Íá5îÍ÷Ü)„87‚„¿ƒÝø<Î4Ò§‡8{—mÒ´ðΣ+ÊÈÆ¸LÔã>»‘‘޼f².ºH Tœ{€ä·a¤+»õc¸; _)cëCdéA¶60Ùm¶rD?“ÍÓÔÂ3š =E:fg›¼„Ï\`ï5*Ý­*]r2!Kï‘ðD L'-ˆûLà,ø2XCSa]YZ€¸`é«”¤jeTõW11KÒù¨g75 6£C28ÿÐ1øzŠ›|ÝEõŽ{o`¸ns)'½—W…k#AÌejOo ám·ØÚ7±è¨CòkÒÑw ½š_ázTœCzíœz˜·E)­/æú™tª‹­Þ aò8“ö`9îà ”f¾ÛZ~®Â •aYä±îg·5ÉßRm5ʳõÉ$ö—ceéû‘jJ;{#‡‘)J;KTªŸLwë}âq¶/IEND®B`‚enigmail-2.0.8/ui/skin/tb-windows/images/enigEncForceNo.png000066400000000000000000000012431334302754500235710ustar00rootroot00000000000000‰PNG  IHDRí&sRGB®ÎégAMA± üa pHYsÃÃÇo¨d8IDAT8O¥’ËjZQ†}öœvÐW(¤Ž;)ôJg™uä Ñ‘ Þ­Qj‹ˆÆ„Po õ‚÷+ÞµàÉ 8pà@;ëß³6çÈѦ4MXì}öå;ÿ^kÉþ&F#W*•>µZýI¥R½–ÿO5 ×Èd2ðûýÐjµaûq2ò“““ël6‹B¡€D"J¥‚H$N÷8¸ÉdzBP–J%D£Qk›Í&b±ôzý¿Ãy·oèÙÃáA.//™c›Í†p8ŒÁ`€x<>MÇ•‡‰À@ÓéWWWH¥R ”är9öÝn·ÁqìvûJ¸ò0=7›Í˜ÍfhµZÈçó(—Ëh4èõzÇÈv&8¶}þydˆ}{yz®92F_×ï—Åb‘óP.™L¢Ûíâææý~Ÿ¹¤Ìçs8’ ¼ý„Â|¾ ñf_"”Z«Óé0·½½½Åb±`QèÇ»é$…ÿ朠V«•£<´Z­²Ñëõ" b¹\b³ÙÀöµ¶‚)ö\”¯8W,Ù“©Í&“ |>u‚†÷|¡¶TÐׯ/?¤ C0¹fP·Û-ç/qÔüôôt:Ñh„»»;8°C¼ø×êiO[°8Y‹h  ÞžÃðtä©=¦Üç‚)ŸµU£ J‹©eh‘ÂmÎgyû5Zv¾;«ý|Ë ïÁš ¢bçe²æÂ­%4É âÆ¤9u"1×I¡Ž6Zºó#G(´+a§d®ë@—ØC1U”œ8¥Ç\OV¡½´·­Ò\\‹[:”&é{%ÁãДþz­J¬.}K±¸&oÿQb²øÒ˜þ|¶b¬ey{ƒÊÈø ¿8+\H …IEND®B`‚enigmail-2.0.8/ui/skin/tb-windows/images/enigEncInactive.png000066400000000000000000000012761334302754500240060ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÙþO¼>IDAT8Ë’AKA†ßùvf–ºn)»"+8 1K6‚ öÖ³·þOÐs) ’ÜDü ’SsÑ‹ ^ò ê¡`“›¢Äl0N”LOK}®Ãû|/ó} oP,Õ`0øÎ³–J¥Úówë­°¢EÑ—ÙÙÙ,}Ëçó¨×ë§o Êå²âœ×gÇÖ©T ¶m¯d³YÄq|úª`kkË%¢ÆÒÒÒ ç———0ÆàööJ)H)W¢(ÂÉÉÉ)I`YÖ× f|ßÇùù9„B Ùlâññ™LDT¬T*mzI@D "pÎ!¥„mÛ°maÂqôû}är9¸®ûãÅœóßWWW`Œajj ÝnwØÂó´Ö×u‘$ ŽŽŽZZëeëy˜ˆâ(Š”çyÐZCF£f³‰ùùyxž‡$Ip||ܺ¿¿_ÞØØ¸`°»»«Ä¹\N9Žƒn·‹ÉÉIœ¡×ë1=ÆXÑuÝI’ü5Ƭ … `{{{Êçóy%¥Äõõ5R©|ßGµZÅúúúÓ–e}ÖZÿÙÜÜì?œ1/,,(c Z­Òé4‚ ®ó‰B¡ÐÐÙ©¹¹9Ôj5„aˆééiŒ^ƒ„X]]ýïÖÖÖÞ'"ìïï\â{ù=IÇtÈb§IEND®B`‚enigmail-2.0.8/ui/skin/tb-windows/images/enigEncInactiveConflict.png000066400000000000000000000014631334302754500254660ustar00rootroot00000000000000‰PNG  IHDRí&sRGB®ÎégAMA± üa pHYsÃÃÇo¨dÈIDAT8O¥’]L’aÇOÝÔMÝÕºió¶‹.ºj«‹¼é&וëªu×U[·nm"ŒT4D'øAĦ6E0_) NüD™ ´5QY1ƒøòïy^_knZ‹þÛÙyÏyÞç·sÎsèo’ËåUõõõƆ††™Lv_JÿŸ8´©©)i·ÛáõzÑ××…B!—Ž+“J¥ªjnnNNNNÂï÷Ãét" Âb±@©TVomm½À¡8== «Õ ^5÷‹‹‹Cccã¿ÃYµxÛëëë"ÄápˆkµZ cmm 6–·<¨ZÈ\VÒ5‘®Ÿ.6™LˆD"‡Ûí‰ÏçãP(„d,‚`{M¾ôš>”[¨®ü”ÎI×O—F£¹®V«F±´´„©©)ÌÌÌ`aaápï76°²c·ç*ößpÐM¡²œný±êŽŽŽ*M¸\.¬¬¬`kk «««b•|±X ÛŸâøG½Á`€ÙlF&“A>ŸG*ºŒH÷Íopv˜Us0ó<ºÉÀFrYBBÙ‹'€Ø2_³ÍÍMF¾ rfu:®`êï‡]û8ó}äì6„¼Ÿð–¢À<‹£ô±üŠîгîíí­b—|ùyëìqÒé4ºººØ?‡bÝ\œh{t»¨?«Ýw‘€Y— “ZÂWæyœsÓð’4ågt‰8t~~sss°Ùlâîîíí‰ÖÓÓó ÌU–QM±ƒ’ðVøÃGØ`•2Ïcx%-%Ø8î‘^¯G.—Ãàà ¸Jü›çŽLbФ.))Zj£xIs‚ñ<;äô‚øã …cÆs«rñ:ɤã Eô±K!oŽE)IEND®B`‚enigmail-2.0.8/ui/skin/tb-windows/images/enigEncInactiveMinus.png000066400000000000000000000011471334302754500250170ustar00rootroot00000000000000‰PNG  IHDRí&sRGB®ÎégAMA± üa pHYsÃÃÇo¨düIDAT8O¥“IkšQ†]u×þ· ä§tÙßÑ]WNˆ""Æ)¥.DA u@ã¬8E]ä“:`.tWÞÞsûY(¤‰ÚWï=çáLŸä-)•J©L&s+Šor¹ü“xý"¨V«Åb1d2x½^¨T*¥ø|™ôz½T§ÓͲÙ, …’É$*• B¡ÔjõepƒÁðž ,•J‡Ã ¬él4ˆD"Ðh4çÃY¶Ÿ©ìÁ`À!ñxœg|ssƒ`0ˆ~¿h4 Ö¦/bÈi"°ÏçÃxôááŸ.— ~¿ÏÏÏØï÷˜Ï縻»;Ê&.‹E^2­Ùãã#Ün7m‚’ÙW6¨ ”ùÎŽÐîÕ^2u:R$ÐòSé÷÷÷‡X¯×°Ùl¿˜X5ìvûGö5¾¯^´V«¡Z­òݤÝÝn·ÜXÿ€ÏÖíí-v»_%úMwGÝÎ çp8üet'>_.ÐK&>_(‰ä&YÕþÞæ ¡IEND®B`‚enigmail-2.0.8/ui/skin/tb-windows/images/enigEncInactiveNone.png000066400000000000000000000011341334302754500246170ustar00rootroot00000000000000‰PNG  IHDRí&sRGB®ÎégAMA± üa pHYsÃÃÇo¨dñIDAT8O¥“¹ªZQ†­Ò%Ï`›"rËÖtDoI.—‹%‰G&“}“J¥OÂõÿ‰ jµzÇ‘Ífáóù P(äÂócÒjµbF³Êår(‹H&“¨V«‡ÃP*•Áu:Ý{‚°\.#‰€²¦³Õj!B¥RÝç³ýLeF#I$,c³ÙŒP(„ápˆX,¾M_„ÛD`¿ßÙl†ççg¤ÓiPKòù<ûßétÀq,ËI¹Mƒá“^¯Ç|>G»ÝF¡P@¥RA³ÙD¿ßÇd2Áv»…×ëý)„¼-£Ñ(æ¡\*•B¯×Ãf³Á`0`YR ‹v»«†Oà»öº^ ´ZÝn—eKPÊn¹\2;ì´Ûí?È_ý·ÈÉd2qÔG‚Öj5vºÝn\.¬×k¸\®Û¡üĹR©ÄJ¦5›N§ðx<´ rÞ¾òƒºÒ@yßÕMP‡Ã!æƒ8Z~*=“É`<c¿ßÃjµBpñÕ|°Ùlù¯ñpõºÚh4P¯×ÙnÒîžN'f|ƒï–ÓéÄù|F0d«D¿éîÅ·ûEù^¯Ý Ï‹ô7ž”Hô c ¼Z~T©IEND®B`‚enigmail-2.0.8/ui/skin/tb-windows/images/enigEncInactivePlus.png000066400000000000000000000012001334302754500246350ustar00rootroot00000000000000‰PNG  IHDRí&sRGB®ÎégAMA± üa pHYsÃÃÇo¨dIDAT8O¥“IkZQÇ]u—~·]ôä+tÙ}¿AWéÊ‰à€ˆˆ5Š¥.DÁ ´Ä9*‰ºðIPÄ… ¥›ößw.ÏÐkRû‡ÃÕ{Ïùq¦'zIr¹\,‘Hœ2™ì«T*ý \ÿŸªR©Æáp©T 777P(ráù4i4±Z­§Óiär9Äb1‹Eøý~\^^ž×jµg%`¡P@ eMg­VC0„R©üw8ŸíG*»Ûí2H$a›L&ø|>t:„B!ðmú,„¼Nv»Ýè÷ûˆF£H$ –d2öÿîîÇÁl6¯…×I¯×¿×ét ¨×ëÈf³¸½½EµZE«ÕÂýý=f³\.×!äe 1åâñ8šÍ&¦Ó)Úí6Ë’Z01ŸÏY5|ß„°ãÚCiµË– ”Ýh4b¶Z­ØiµZ“æO碋Ÿg¢‹ï`vH5õ‘ ¥R‰‡ËåÛí“Év»ý‘ü…PÑ_ÁäÄOœËçó¬dZ³‡‡8NÚ9o_øAíh ¼ïø º>7’ÍfóA-?•žL&Ñëõ°X,puuõ”_Í[‹ÅòŽÿßWÇÁ­T*(—Ël7iw×ë53¾‡ûö\¿÷º¾¾Æf³×ëe«D¿éno‚ÛqÓpv»ÝFwÂóé¢2áùD‰D¿7ñîew–ÙGIEND®B`‚enigmail-2.0.8/ui/skin/tb-windows/images/enigEncNotOk.png000066400000000000000000000013321334302754500232670ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÙ1(îÄZIDAT8Ë“KHTqÆçoÎ8ÎK­Ð™t.…YQÑÓÉ„’D`„´,‚(hQD¹ˆ(*‚¨Uº‰Ú´ë±‰È1ƒˆ è‰’•:–¥è$Íä\ï¿E¡’z–‡óû8œó}•tçZƨspê–;ùý.Ó­¤;×Jæ,é²kµ][”Ó‰¬Ù§&ΨÿÁ‰ìùžP‹¹çR„<úï£ÊWan<ÓðމiáÌ€OføŸ™õFc8/¯‚¯ýHi†wMÅñÞwœN~”~wÞ&µhW+ˆó¢ É !¹8Ÿ:¡ùR¹³úBC"»ø™ŽÃ3xç Þ0xgbT-ƒ!ôA¤¶ õ|ùÉ´˜F»Ó~cÆnÔºzˆ½ï,ðçÂ?ðƒß„œ¢à$DþJ qÝ1«¢¿t"k—¢ý~þ‰ø|ôAaôŽ¢»¶ÊDx¤p½å8NÔØqÊ’Hì˜ K `` –¾iì#ûzäG¬Ü˜k­£Æîs–„=0؇øBØgÑOÚP5U°0 zìÃ{dèSyFìq—üK,m¸£ªî¢%¾|nG–—a_9ï€Ð ù«3uß«nIÅ+2bO»äWñv ;5ö^µPý𶩬ƒÅ!Rµ[ph€D¸È/Yó­=Ý[ëᨹ¿É"Þóä<ªæ2”þõéø‰2¿tÄ¡#>éa(eÉΜ[QÛn"UE¤6WÿPSæÅqW¡®¿7’¸pµÝ“éÎÄTØvüÓUÓNìoÁÅH­Æ\¬IEND®B`‚enigmail-2.0.8/ui/skin/tb-windows/images/enigEncOk.png000066400000000000000000000013551334302754500226130ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÙçT]mIDAT8ËSMHTa=÷û™7ãÌ{3£ É óÔ$E¤)+‡ \¤HQIP -Ú¶Žš‚èg]¸tBD› G#È ŠéÆXþ¥Ž¨ãï̼y_‹µ=Û{Ϲ‡{Ï%lƒþh¥©,º ‚F¤:«nÆŸ¯¯Óvd&ÝùẠÐu,b~à[´êzßÕ¾%ùvÈdBv;Ô Ã]V&ÈÅê,tMöl)¿»GgäøPÔx&(¼iX©Ïldf’pïI=r©:ƒû¯'zĦãÉÕä ”»Š‘ë ÏCªoÙ…ðÕ4Ñø=6Ë6ãsq9©ƒq$¼(8|R÷ÁÎÍ#ÿ@3Þük›:`_I&`çœÞ0ìôˆy „R/ $up·×÷Ÿ@{ØT9û™¿ö F!ƒ°–t(k $t4@Z 2³SÈÌŽ½ÙpÆD{ØÌ1ÿ¾3/P¥,ò<5 • Àœ%°æ’ug˜VRõ|=Ù–ó×6›®â(k°}˜|÷Ë??Á]~B¯@65…_]·†iq®¾ôrï@¢#l*ÅcþÐIS+pÀNA{1ÑýöòL ËŠXTx ]ÖÂÔB6RÚÖ;”舘`¹˜?tÚÔ|YX qHÿQpO%Fž\Aië[€‡u†´µÀ¢sú{uË×̪sA2ó…ΛÒ=ÌL/´ÂSÞÚ?qàk+ª¸ð> õïÒ3=åM˜ÿÒ-ÐáoÀÈÓÖ¿U¶Ý¯Ag ÿåZ9CðlŒ°â £/ÎmL2gØ)~w#Èo%$ôIEND®B`‚enigmail-2.0.8/ui/skin/tb-windows/images/enigSignActiveConflict.png000066400000000000000000000014351334302754500253310ustar00rootroot00000000000000‰PNG  IHDR_sRGB®ÎégAMA± üa pHYsÃÃÇo¨d²IDAT8O”mH“QÇφ#]˜„ä"?h”%“²0¨ü"&‰b‹%DBß©i…ÔÄUdõ!(èUÊÄŒÀ”´ÀÓ@’ *|[[ º1ÓgÛ3_æNÿ뫱 þáÏ=÷>Ïùíœ{÷\Z­&›õ­oR¿*7Å3‘V‰uŒê‘ÎG”·@d\zyI±J¦ÞêÄ[cÖŒô­Žmu…[QÜ1@b ŽCœ Øy¢R%ee ØpS¾k¼Í飕ǿõ)OšöÊS[5zÀ´€¥/]¬ÐCJZd-Ãdûm–.³íi;L…,ÞÇö=êrÀ¶ø‰Šá6kæˆv*©áú&Ûo±"`â^Ö#ù> ¯8yö2kñ…X0ßvºÆýk=/Ï'}ülYgúT¦Íh¯ (å!±‰O+{%ªÁI'b~q¼âQ¨Ìè$f¢-¬BëaQÝß_•3 1×Öò•¥pkØ—AôÀç´T®~aIEND®B`‚enigmail-2.0.8/ui/skin/tb-windows/images/enigSignActiveMinus.png000066400000000000000000000006251334302754500246630ustar00rootroot00000000000000‰PNG  IHDR_sRGB®ÎégAMA± üa pHYsÃÃÇo¨d*IDAT8Oc ¼Ü¢%qƒFàÝUJüP! ô/”…®Î“V}¸Öþã§ËËþßßÿùâ$I[¨édØížoŸî üçЂÿ³š“ÿß_úéL¹ ‘.E0þ=êýÿéfÍÿûk¼þßÝ;õÿÛÃ}ÿ±ùA• ûö¨óÿ·‡Íÿ?^/øo¥Íÿ³õ²ŸNf1H@•Ø ûú öÿ—{eÿo/2|{®‰Wª”0!†ýßoÏòx‹çmªwVißÚêøçõµ†ÄvAKë?6 •f`¸¹H!ïíɉÀtæôÿÕ¥š„\†Í0†J30¬©W?ôõú¶ÿ¯´ÿ¿Ò¡õçÚ,ý;${ZrY^"øt_î‰ .ãýõ ,P©a1¬+bëåIEND®B`‚enigmail-2.0.8/ui/skin/tb-windows/images/enigSignActiveNone.png000066400000000000000000000005731334302754500244710ustar00rootroot00000000000000‰PNG  IHDRí&sRGB®ÎégAMA± üa pHYsÃÃÇo¨dIDAT8Oc ¼Ü¢%qƒFàÝUJüP!ÊÁÕyÒª×ÚütyÙÿû[â?_œ$i •"€ ½½ÑóíÓ=ÿïZðVsòÿûËB?)$ßå0C¿=êýÿéfÍÿûk¼þßÝ;õÿÛÃ}ÿ±ùA•‘ ýö¨óÿ·‡Íÿ?^/øo¥Íÿ³õ²ŸNf1H@•°úõAíÿ/÷Êþß^døö\¯*T)ñ`„ú¿=Ëã-ž·©j(ÜY¥a|e«ÖŸÓÛêÿQÍP¸¹H!ïíɉÀtêôÿÔ¦šT1ÖÔ«úz}Ûÿ×Úÿ_©×úsm–þŠ @Kî/ËKäŸnàË=QÁe 1€áUªÀ¯IEND®B`‚enigmail-2.0.8/ui/skin/tb-windows/images/enigSignActivePlus.png000066400000000000000000000006341334302754500245130ustar00rootroot00000000000000‰PNG  IHDR_sRGB®ÎégAMA± üa pHYsÃÃÇo¨d1IDAT8Oc ¼Ü¢%qƒFàÝUJüP! ô/”…®Î“V}¸Öþã§ËËþßßÿùâ$I[¨édØížoŸî üçЂÿ³š“ÿß_úéL¹ ‘.E0þ=êýÿéfÍÿûk¼þßÝ;õÿÛÃ}ÿ±ùA• ûö¨óÿ·‡Íÿ?^/øo¥Íÿ³õ²ŸNf1H@•Ø ûú öÿ—{eÿo/2|{®‰Wª”0F†’Yéÿ`Œþï·gy¼Åó6É.ÃeàUÆ·¶:þy}­áQ†Á BÇ0ps‘BÞÛ“éÌéÿ«K5ÿˆv:†5õꇾ^ßöÿõöÿW:´þ\›¥‡¨@7-¹¿,/‘?|º/÷D—ñþz¨~€ËÀA u©C®ŽîLIEND®B`‚enigmail-2.0.8/ui/skin/tb-windows/images/enigSignForceNo.png000066400000000000000000000007221334302754500237650ustar00rootroot00000000000000‰PNG  IHDRí&sRGB®ÎégAMA± üa pHYsÃÃÇo¨dgIDAT8Oc L™2EbòäÉüP!ÊASS“ê¬Y³>ž;wîÿüùó?×ÖÖÚB¥È C.\øvÙ²eÿ÷ïßÿ¿¡¡dø§òòrò]3ôÌ™3ÿ:ôΜ9ÿwíÚ¶ ;;ÛªŒ4€lèéÓ§ÿŸ€»ï!÷n]*‚K!¯ÁG Ö8Æv`) \–‚4´á’»8µ"*\6Û Ÿïðç4˜ã8»œó³4MlÛþ€’*îõz„À²¬{]×çÝn÷4U¬ëús¥Ri´Ûm ‡C†±Ç{D›¦Ù¨Õj˜N§èt:h6›;“ÉÄÓTqžçR"ŽcA€(Š–Œ±ÃR,„@µZ…b±Z­NÇaZ,„€ïû‹ÙlvÚï÷ß~=bü#P ¸®[^¯×¯¦iî«â+ûúë#…ax€J)s¼Ù6À9·(¥Ä÷}-MÓ\ßÝÞ ¼y0Æ.[­(¥F’òEÑÅ_x³mÀó¼ã$IëõºË9ʲìe0dø÷ûB1³c¾nùIEND®B`‚enigmail-2.0.8/ui/skin/tb-windows/images/enigSignInactiveConflict.png000066400000000000000000000012061334302754500256540ustar00rootroot00000000000000‰PNG  IHDRí&sRGB®ÎégAMA± üa pHYsÃÃÇo¨dIDAT8OÕ“ËkQÆ?¡ ;W>ÖBÁtµ.t¡ ˆ€Û`h` 1u1L’UÔ¤%& SBhÌ"ºqá+1ˆ„Ĩ›ˆT|m*JÑ6*˜™{çÆiI¥ml]ùÁåpî¹ç7ßÜ6¢x<¾;‹ …BÛí©W0N&“ ­V‹ÒétG×õÃvióRÐL&3ŸËå¨\.“ßïWðEŸÏ·yçKÐf³I•J…R© …Þ\.×i{ÙÆÔm4T¯×©T*Q"‘ ¿®/¶Æ÷!ddûØb·­¯Õ µZªÕ*ñÎOhçöËKð™9ÌÊ.È1lµ[×Ö è¸¦í•²¦ð¬s‚ãSiàຮA½^ï0Ø&"˜þt ¢}æ(&Ró6f¥þªÖ±ÛcÖ ^ÌÝ=úÈѺç íúŧ<ÄWhv ô"v‰8»» šã1ªÀU.¦ä-ÙÙ.)Ž+ŸÏ˵ je 'ºy|  èûcP‘·âG•woâ½¼Žã+öšŸ©[ÝS~]”ÍfåŸP%åF\Ãdç=}y:ô•£ÊîÃâz„ÿj‡ÝhšVi·ÛT,É0 +¿î‡*I§º“xG…ß>½œa§UN@æU¼e'íÀáp|s:UÇ3æv»G>d—–%ü¸bñÊ ãYe¨y® —í–ÿFÀ/¦ÈÀ­iµ{IEND®B`‚enigmail-2.0.8/ui/skin/tb-windows/images/enigSignInactiveMinus.png000066400000000000000000000005771334302754500252200ustar00rootroot00000000000000‰PNG  IHDR_sRGB®ÎégAMA± üa pHYsÃÃÇo¨dIDAT8Oc L™2EbòäÉüP!òASS“ê¬Y³>ž;wîÿ¢E‹>×ÖÖÚB¥H Ã.\øvÙ²eÿ÷ïßÿ¿¡¡áÿüùó?•——“îR˜agΜùèСÿsæÌù¿k×.°ÁÙÙÙ~PeÄdÃNŸ>ýÿäÉ“ÿ÷îÝûÚ´iÿëëë?eeeI@•Ø ;vìØÿÇÿFÌÛÒÒRU¨RÂ`„Œ5`R¸MÃ@`âĉÆÀ„ûhÀ?b » ¥õ†J30³S( %„\†Í0†J30ºvíÚÿÝ»wÿ†åŸžžž;${XXX|ÉÈÈ8\RR’›——g L¸,P©a4+ø¥ŒIEND®B`‚enigmail-2.0.8/ui/skin/tb-windows/images/enigSignInactiveNone.png000066400000000000000000000005611334302754500250150ustar00rootroot00000000000000‰PNG  IHDRí&sRGB®ÎégAMA± üa pHYsÃÃÇo¨dIDAT8Oc L™2EbòäÉüP!ÊASS“ê¬Y³>ž;wîÿüùó?×ÖÖÚB¥È C.\øvÙ²eÿ÷ïßÿ¿¡¡dø§òòrò]3ôÌ™3ÿ:ôΜ9ÿwíÚ¶ ;;ÛªŒ4€lèéÓ§ÿŸž;wîÿ¢E‹>×ÖÖÚB¥H Ã.\øvÙ²eÿ÷ïßÿ¿¡¡áÿüùó?•——“îR˜agΜùèСÿsæÌù¿k×.°ÁÙÙÙ~PeÄdÃNŸ>ýÿäÉ“ÿ÷îÝûÚ´iÿëëë?eeeI@•Ø ;vìØÿÇÿFÌÛÒÒRU¨RÂ`Vú—¡ôÇ0FÀXc&…Û$» —'N4&Ü?@þeÌ t Àì”Jg@CAIãÑ.CÇ0PXXxèÚµkÿwïÞý–zzzîèÁ€……Å—ŒŒŒÃ%%%¹yyyÆÀ„Ë•Âp8ˆE1CSD8Í,IEND®B`‚enigmail-2.0.8/ui/skin/tb-windows/images/enigSignNotOk.png000066400000000000000000000006631334302754500234700ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEÙ Ï¿Vf3IDAT8Ëcd ü)‘’ø÷å›%ïoûØæýúÈÀÀÀÀD¬æ×ìª?ðßd6^´Žá—Û“‡nœ¶Dð:‚]•ŸOû#Ÿ0ßï— ×.ÉóH0m½jÂÉÏD¬ffžB̺¦ Œçê4½-˜Ícy?2þ·g$V3L쟎ÿmû>ß~ùùã75fR430000~zÃðï͇wOþ|738õç#)š88þÜ|þîî«÷Z‡Üf````¤D3†¤jf```€‡ÁŸ>öϼǙy~H«%ü¹xBŸá‹")šQ øýËšQ>ŽùÏãÿDkF{´%ý]òÿŸ²žÿßLDþ|³¹sÍ–C•>x F ð} —ä<¯ òiÕŸ Ǿs~¿èpáà­´­8BþêjIEND®B`‚enigmail-2.0.8/ui/skin/tb-windows/images/enigSignOk.png000066400000000000000000000007051334302754500230040ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEÙ¶ƒ;+EIDAT8ËÍÒ¿KqÇñÏÖiø+“PpÓÅ"¢XàDôŸ4 ý ­îAmŠCäV¡!GYáà)*ix޿ߦ†#ˆïÑÒ3=Ëë=<<,L+Ÿu²1ÖÔëèáË𬸚 Ç2[óG³—‚;Ù(Ÿ†¶™Õ\8æ .ÜÙ>O«§¡ ò.Op+/O{m¬8Hû'¦ÜÕ¯‰'áõ…„öcñ–cÅ€P ú°ƒNEÄ .Ôw)Î[Á”j° “ Tí]^^;C“³‚)Q!ß—º}©¶¾”íKÀýÿXŦ-¥ì Åù43ŸžcŦ?xn79ÊG(SVl ÑhÓسµÄ"Gt•²`°/•ºpYvñV¸ œƒ¾ª²”ù ›np”ò}î¯x¢îÞ¹¡7ŠcXÞ9?_Y©ì6[MXÌIEND®B`‚enigmail-2.0.8/ui/skin/tb-windows/images/enigSignUnkown.png000066400000000000000000000007711334302754500237170ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEÙ¬^‚’yIDAT8˽’½OÂ@ÆŸëÇ"q! àEH'MDhŒ³»“ÿ;N²tcéNÒÄ¿€ÁÑÁH""†¡²)‹!ËbâG®íƒ¶!„@Y|“[Þ{~Ï]Þ÷!X¡,ËJ2Æò®ë^•J¥w¢Â•JeK–åG]×/(¥/†a‰ SJïTU§R)4 d2™Ïn·»©DÏÊå§éž[¯CUÕõN§s¸€—$ñ•N Ã0>ŠÅbRYöm¸o·Ãþ^.‡ïµ51v-ËrÈ"8›ÍÆ…àœÃ÷}ä €/I¯ ç ¬‹_ÉDæü$Ð+Q`ß÷1µ²S\L˜ƒZ­¦PJ/çÁ¶m¿ðÿ¤çÓ†ƒÁ`€Æ9³p¿ßß'€BB€É\Ƙ®išlÛ6q]WLæiö‚UÎÎ,œã8ljDš¦¡ÙlrY–Ÿ‡Ãá‘iš½EY Z­ÖÎx<¾‰Åb5ÆØ­çyÕjÕ îIÄØÿýg-Új¶ÝO`IEND®B`‚enigmail-2.0.8/ui/skin/tb-windows/images/enigdecrypt-act.gif000066400000000000000000000012601334302754500240070ustar00rootroot00000000000000GIF89aÆÌΜœf4ÌÎ42œdfdfÌœšÌÌÎÌegÌkmÎln΃„ÖhjÍ‚ÕfhÌqsЉ‹Ø¹ºè–—ÜprÐ42dËÌí%ÁÁêikͤ¥àÑÒÔÑ×ñ“ÚãæêrtÐjlÎ29EÉÿÿ¬­ãÔÕñ424ÕÖñuwÑ€‚Õ¾ÉÓµÀÊ¥°»›§²‹œª~‘ XV­vt¼œÞ,DR7O\Ncp^r~t‡•‰˜£OM©53œ64dfdAXdl’prpDB¤ŒÇž­º}šŸu‰˜^u‡egeÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ù ,þ€‚ƒ„…†‡ˆ‰„ŒŠ‚’“•š¡”ˆ•˜˜›—£¦¡°°‰š™——–µ„ƒ±¿–»ÃÃÇͳ‚ ÃÔÆ ¶ ÚƒÔôôÛûï4XØÀ¡ƒ…{êøñäáBˆ(0‚ž$ö„ÀÄ%Lœ Wà‰ŒÕ[IïÁ’(œÜøÇ )T¬`Ñ‚‹/` Øv’…1dÌ QÆ…päŠQǾ:ŽÊر”‡Ó>~LfU‡•@XÂcÈ ƒˆ ÀJáì –+=ý ;enigmail-2.0.8/ui/skin/tb-windows/images/enigdecrypt-hov.gif000066400000000000000000000012561334302754500240410ustar00rootroot00000000000000GIF89aÆüþüþÌœšüdfÌœšÌÎÌÌÎüœšœ›ü¡Ÿü¯®üžœü®­ü¤¢ü´²üÒÑý¼ºü42dÞÝý%×ÖýüþüŸüÅÃüÑÒÔßäý¶·üãæê¥£ü žü29EÉÿÿÊÉýããþ424ääþ§¥ü®¬ü¤£üqsоÉÓµÀÊ¥°»›§²‹œª~‘ Õ–—ÜÀ¾ý,DR7O\Ncp^r~t‡•‰˜£xzÒegÌAXdl’¤¢¤prШ©âž­º}šŸu‰˜^u‡›ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ù ,þ€‚ƒ„…†‡ˆ‰„ŒŠƒŽ’“ŽŸš›œˆŽ——ª‰žŸ°Œ®˜––µ³ƒ‚Œ°Â¼‚Ç‘ŸªÈšÅ ÈÇÍÒ Ú„Ç   Ùª½Èôô–û½0LÈ aÄ{ëøñÄ¡ƒ>€‚ž6 û BÀâ‡$JÐPAFŒ‚ꩤgâÄÈ Ljü3Š*V°h1ÁEƒ0à3IhBŒ2fШacÂ8pl B_„uFeäPª£é=¤Ów M,~Ñ$È„A B$4›re½I‚;enigmail-2.0.8/ui/skin/tb-windows/images/enigdecrypt.gif000066400000000000000000000012561334302754500232470ustar00rootroot00000000000000GIF89aÆüþÌÌšdüþdfÌœšœšüÌÎüüþü›ü¡Ÿü¯®üžœü®­ü¤¢ü´²üÒÑý¼ºü42dÞÝý%×ÖýŸüÅÃüÑÒÔßäý¶·üãæê¥£ü žü29EÉÿÿÊÉýããþ424ääþ§¥ü®¬ü¤£ü¾ÉÓµÀÊ¥°»›§²‹œª~‘ Õ–—ÜÀ¾ý,DR7O\Ncp^r~t‡•‰˜£xzÒegÌœšœAXdl’¤¢¤prШ©âž­º}šŸu‰˜^u‡›ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ù ,þ€‚ƒ„…†‡ˆ‰„ŒŠ‚’“•š¡”ˆ•˜˜›—£¦¡°°‰š™——–µ„ƒ±¿–»ÃÃÇͳ‚ ÃÔÆÒ ¶   ÙƒÔáòòÚùî0dÐ0¡^:}úmàP¡Ã €g`@„û!ØàЃˆ$ä8ââEAóRÊ+QB$€%3þ™`ÂÄ )T¬˜À¢A ´•$4áÅ 1dÌ 1¡Æ6‚Z¼‘oÀ¢0p$ÍÁTÇQ‡Q½qe>~äd  ¬F(;HeJO;enigmail-2.0.8/ui/skin/tb-windows/images/enigmail-settings-small.png000066400000000000000000000026711334302754500255040ustar00rootroot00000000000000‰PNG  IHDR ‰øÌsRGB®ÎébKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÙ9.ý§n9IDATHÇ}”]l“×ÇçµMcËŽ«Äo ¥àÐÄ$Q²ñ!ª*D§HÍT µZW2èÝvG×,¤Ctb†UÝE%Øå$@M(Y%\†ª¶HvíR§-Mó…º)fù²ÝØÁ¯ãóæ=» É ;Ò¹8GþçyþúŸŸà¡õæ‰N”Rx½^¤,Q’%P`EJRñÎ_Þ^V¯=xèøÃ±Å»—€0Pf€€çmbžcoü~™€ý¡ìRšgžÜôÄ1½º†ÜÌ Ùì¬YãxÁ²¬’ÿþÏŸ€“€Zµa³ÕêOT½jJi|ÿâüÐÀÐÓ©ÉÌÖ±;—,¥ŠÕ5U‡v6/{Q)…Y’º_÷{ún~“ :sèº_ïzcº¾©Î?vgrp;Ü¢uÿqìB”R|›èå­¿öÞ=¼¥‰Ï# {â“?ò}î-jªሩy=3›Ë_í>EëþãËFX|väÅ'c±O/©¶gÖ®[˜si¿ü3­"õý§jg£3ô<쎟Úõ“–ŒrØ¿e|ªŸ­õß±wÏwÅJr€†à »· ³v팊G¯¶=ìAáõ_Qò=^^6”øFÜìûѯà©HD¡{ ÆZ¡d"rìQ±ØçrI`ÑÀ‘ü~æÜ¯‰TUÿÏÝŒ»Êé›J#E6íòðaú.¿Ù[†–øräïKS,å@YE"‘(á+}Øòÿâå×^§/| ߆6TîàïÄ9ñÁ`-¦Y\™Äb±ÈÜÜw¾¾NssFjˆ?w!vå]ÖÃ<¶ÖÅÕðÇí~í §Ó‰Óù#ž;r†¦Öß‘–N¾û>{_y“áI‹¹ÙYnÆ?¢©±§Ó¹2ÊJ)Q_W«òånaU›šÙX*Ã0Šèµ[ùé“LgRX–RJ)ñ €”fÓ¦³¹ýÙÚuø¼,eÁö£P(eñâŽd²3LLL MÓ²‹é_ì lhðöÙüì¯MÓ´Í[óKñ^öu…†Ýn›MŽœ€!kB–¤XHèêê²<RJJ¥B à  i‹5‡CI)Õ²g:::p8šRêç·RÊ= ÿ4 ão¦iöÚl6NŸ>½:Pîó@¾]SSó^ Ø£ë:x½Þçü~ÿà­ÏVBÔêºþª”ÒˆÇãçŸN¥R[ÇÆÆ.)¥ŠÕÕÕ‡-Ëú?ŸOÅb±•™L†Ý»wˆ©©)úûû°-*.Ó4½½½D£QèééÁ²,ü~?'NœÀ4M’ɤ ­ÊƒD"ASS“““tttÐÝÝM¡PÀårqíÚ5„æAYYG¥­­ ˲8{ö,$NS(ˆD"466>šuuuÊëõ Ã0ؼy3RJ Ã`Ë–-:tˆt:u«ð@Ó¦s¹œ¾qãF*++±,‹––”R(¥hii!—Ë111±:†‡‡ÌÎ.ð`þ<Ð4ìvû|2™\âÁ×’ñ‹Ü¤ÌIEND®B`‚enigmail-2.0.8/ui/skin/tb-windows/images/enigmail-settings.png000066400000000000000000000036021334302754500243710ustar00rootroot00000000000000‰PNG  IHDR0 ˆº£sRGB®ÎébKGDÿÿÿ ½§“ pHYs''«³ïÉtIMEÙ 2»Ê7ùIDATXÃÝ–mlS×Ç÷úú%ç}uLœ@…„*¥4 Lt0$ZhÅÊË¢²ÂèP7mêÄ>Q§ÀVoÓ¦QЪ¡eêXÕn¨k'¶vPh‚YH(â8ÇÁ&qœØ& ½÷œ}È˲Œ¼±~˜z¾Ü#=Ïyžû?ÏsÎùÁÿÓ¨Þ¿O©Þ¿O™ËeA+TUÙ®ªê:Ã%Š‚¡ª¦+†a|$¥â`$¡-m­ŒBš†û b†hôÎômª(ÊgÛ+·adí`‘ë»|,%ùKGlÇœJ!¿tdzøÑ³Ù;Ú±X¬|ÚªïL_ôg6o”ÇsT¢eHÕ’-ŸßV%ëêëäGI÷¢b‰–!Ñ2䙳ÿhÒdÍ–_þÊyôøò™Íå䯙ܦÒápàvç°íÇGxïý9~6Å«?ýeÏñâÁ·ØõúÛœ¨×øà/¿§¡á nw>‡@N+a¢Å’-·|½RÖÕ×IÕ’%ÿþчT°æ©¯NT0ýU1QÁΟü€ãgS8²ó¨y³Ž¯ÕRû³ã .ýóoã5U0m%‘H uàÌÍ`K©Ve¾BÍÏïÔ¾³³Š×hüèè褫+ŒÙl!‘HŒ^ù *`SpêÏoR†ãgR£æÅ<ýý_3¶É'êuv½þ6‹e#1&*°÷11˜»"yy.6>–$ã‰l¤9½HHbdµÄb}º$p»!D˜ ŸR›t/™îtGžûøü ™s{±e<¾ãýQeòe7¦À8€´ÉŽ3EÝ’A 1ú5flÙ/Þðx<ŠÇãù|¹ÈãñT¨ª:ÊEF‰¢(†ªªã\äõzž‹ª««G¸hÕª´òòr¥½½P(D*•"•JÑhtÐ0ŒJ¯×;w.òx<#\TTdÒ{zz’‰D¢(Š´ÙlzNNŽÃn·«­­­÷ ÃXçõzçÆE𦽼`Á{OOÏP0lÇã£\¤—$“ÉB¡P{<v¹\V“É4w.2 cSvv6×®]†alõz½ÿÁEÇF›KJJLápøá¸hõêÕSr‘×ë !ÌùùùÿÙíŸ??þX0\Ûß߯!p8X,¤”ôöö"„Àl6“žž@,ãþýû¨ª*sssOíÞ½{z.jhhX[\\¬Øl6t]Çb±àt:‘R’™™I?RJ\.š¦át:‰D" (~¿f.:s挒——ÇéÓ§ñûý!(++#33]ש¯¯G×u\.ÅÅÅ466R^^ŽÏç›™‹b±·o߯0 rssñûýø|> F¨[b±ØøÖhš†®ë¤R)"‘È,¸hûvV®\Iyy9—/_fÆ ÓqýúõƒA¬V+ÝÝÝ´´´ÌæMQïA­ä@?{÷îåêÕ«\l¸4î¸óÛ;8ñ»Zš¯ß h£ªªêoò\ä ÐÏüô |>.1˜J²¼h¥%Ëijj ªò›<ºx n·û\ô_ç`LÀ­Pñ>***سg7ü-4_¿AYYoü#ím7 …Bc fÃEnà"¥%Ëðù|ÔÖÖ²lÙ2Zn¶+xå‡?¯Á¸hDANNK—.EJ‰Íf£¡±‰–›mhªBYYÍ×oÐÙÙI8Æl6Ï…‹Ü<¿åâñ8.\wSÐÔÔDiÉr.\ˆb¢‚¸HŒqQ………¬X±âß\4rŒÏ…ôõõ!„ ÌŽ‹"‘ÈÁsçÎ`Ž\$¥Œwww¹è_ûé™xœHýÇIEND®B`‚enigmail-2.0.8/ui/skin/tb-windows/images/enigmail-toolbar-small.png000066400000000000000000000027731334302754500253110ustar00rootroot00000000000000‰PNG  IHDR0_úWsRGB®ÎébKGDùC» pHYs''«³ïÉtIMEÙ 2é¥À{IDATHÇí–]lTEÇÿsïôÞ»¥Û]Z¶Ò†~°-+Pè‡Á*RLÆ6, HˆŸ4’H jÑê³òÆ"PÁ4©–ú@$h¤„ºà¶]º…ÚÒí~övïÞÝ;÷ŽX±hñÍ„“Ìœd2g&9ÿs~3¤ýØøpÎ1[ã ÜÆÉïOƒxÀ>³7à€>ê ö}¸÷ã ”Røk~ÌÝ fà‹¶VØ(˜¦EúÀ-B˜¦ ˲ñÓƒ÷îÝÃàÀ 8ç„©©)Ô××cll ©T ”R‚ðÀ˲ fÀ×—.]@MÍrhi d³c(..A$c ’$!''’$!žˆãøÉïKDŽŽ#‘ŒáÛcG±ýíw²w''!Lgß²Lx< =PDUU´·Ÿ€Ó•‡Àí!ø|È:ä9®{û6ØJÓé4Æ2º†êêjx½^ÀøÄ8r2¢¡*+<ذv~9wÁè8œºº»Á²¬Öt†±ñ0êêêPWWš£Àíö K¢¹y-”ܰd4=?¼g‘Jé(Y¸Kž]B.^¼ØÃaí¡&3¨ìrˆŠÜp–­g ]ƒ ˆÐ—>Ãíê ®¹ÍèëëãË—U›Í6ùyë—º`S”¨ÏçC4ÅØØ8L=Æ9OV¦ƒe¤À d2zf|"’).žOº»»¡(Štû–-ŸíÞ³«/k˜¤¥¼Rºµ¹ˆsn†ˆ‘ ‚ËE0³IhS“‰Žö£ßØz}SŠ,EQ†€®~mí€Ã°{uhè‘BR„H ™ˆ(³{е)%æõ÷œ8yþâÃÅýHÝé¹{ºã éú-?œDi$œ.ð”O‹òmÑÛþìhb’ñ$fÍbýG´~EöØËÿ3Øû”Oyð”ÿtut€sBfè HWGÇ <¸¿´nãFвªª8çM3pÃëEÙŒ ?h£š ÃX'I›Í/…Ã0¨$I?h£–eMŽB*B¡PlåÊ• ŠÅb8wîB¡jjjæ–——&“Éó ‚Pà»v-Àa—Ëõrooï#ÁCCCEñÝE‹}P__ÿ^AAAâÔ©SvMÓ ¦eäeUUö߯^}si]Ýa—Ëííí€ @„¯ûûûw8Ÿ¢(~]×ÑÐÐp¥¤¤äŽªªÎjeeåû~˜VE–åýÃÃÃ;EªªK5M[σÝn_111±†sþê#…tùòexÑår B„`0褔"•Jq›ÍvÅãñˆƒƒƒ\×õŠ¢äúýþùÂtpCc#æÍ›·œr¨¿¿¿Òëõ. ­ùùùMÓÌÎÎΉÄ[e¥¥Ïkš†x<ŽX,–C§¥¡”[–u]UÕÑŠŠŠ×-Ë2TU“L&sEQý†ax‡]Ó´eŠ¢´8N9ç0MÓÌf³ Ãáð.§ÓiWUõS·Û½Üét^€L&Ãoݺåñûý[E¹âv»B~¬­­Õ„Rº&çpΫl6Û'.—‹2Æ^Êf³ÓïaŒñ¼¼¼úx<¾>77œóû< „´qÎë !œs^®ë: 0ƶ¥Ói.Ë21 ét:$Š¢&Ëò©Tj§ ·€ÖÖÖvè€ÎÎÎv»½ À6ÆcDE˜¦ ƘÎ655=žªªöܼyóÌÈÈH~6›-Íd2N§3¨(J4N2ÆžŒü×=Ôì;…Ó]©;IEND®B`‚enigmail-2.0.8/ui/skin/tb-windows/images/enigmail-toolbar.png000066400000000000000000000034221334302754500241730ustar00rootroot00000000000000‰PNG  IHDRHìù5sRGB®ÎébKGDùC» pHYs''«³ïÉtIMEÙ 8è’IDATXÃíX]L›×~ŽýcŒ‡ƒó% `¤@a”mžGK´«uÖJP²!­šz³EÜ-Ó¤],Q´ti+íb“JÒîGËn¢e»Ù–”¦UwE*ªmƒÉ¶k ¥ÃŸmð|þ¾ó·‹Ä?¶ƒ‘&•#ùûœ÷9Ïû¾ç{ŸÏDJ‰§Ù,xÊMY?yûêo‘Îævdp.Ç›£oUdp €Üa¿¸Á¢”²Ô/¿~Iî´=²Q²¹ÁE”RƒA ‚ÆØ†ƒBJãõß[­6 kˆD" ”V2¥^¯¡P¨´™s!Di¾~Ì9!V+pûö¼^ï€M ž¸¿¿~¿>Ÿ¯b0çç?AxzssqXu>ƒ¥¥ÿ¢¡¡¡2ƒ¢KÀøøxYãÁ‰þtí ÜÄ©SCPì3Ñiüî÷Wqê¥!,,Ìcaa¾ò=àœÂétÂçóm™Á;ïÜDÏÑCH-'ñ—¿^Çr2 [‚C‡;pãÆuþÀG[]dFÉ¿+i îfu Hl.µµË©pSâ;ß~BŒ½{”r¨-øa*<‰S/ màœ„hnVãããb1vû&ú¿|3S1œýñöï¸n¿ªâÍÑßàÈ—º1žD¡P¨ì")%’ÉäãÅLûÆ×¿ Ã4ÐÔä.±ó4{ÀÇß®ÿ…B¿¼ø+YŸÓgG~$¯Ž¾ MÓ°ª¯"ýï×Ñèî„ õ‚‚­f‘N'a'Ör9hŸÅÑßs¶£Ã¥ƒ¼öÆ«øÙONʦi1ÇchkmÃꔉg¼/ÀÖØ È<¨Ųƒ³q?ô\þk Ÿ-ÌáÌ+¾²l+´¶¶Ì‚ I—4ÈB² ¸¹ É]7Á…a>4Q.ã¶|õÙg/~oøô/ŠóŸ|—C˜ _ä2„‘]KC4¸ Ø*¨±Š᯽öÆ«?¬t!Iµ‚óÁèsòø‹gÐÐ~Iè3a,.$à9؃B>‰ÞƒÿîÇoýú=íìœB>'…™° ah «Iš§9˜zºN·_p6·…Xìò?þðçç¥ýŸX^““šÙRX3éWúÙ§N2±ÿ˜z:É?¬fƒ<횬Դšê¿—9¬R㬒×t¦š\´žÁ6÷ÕÆà âµ§‹ötÑçYU½»¡‹Êºh7uQ{{ÇVëu‘{“.*ö™°ÏãFZË`øû?ÀáÃGÐÛÛ‡—_~©D nO¦Â“Õ]´º¨ìÓtOíé¢Ï©.ª­&?NíBÑ·Ö °§‹jc0::ŠL&³#ƒñxW®\)pâĉÝÊYR1ŸD"d'–¿ØÓ#«yÀë•ííí¤]¤( t]G:–Ùl¶z¥Ói@vtt¢"„€RRkűV«„Äb1)„ Š¢Tgàõz ‰BvuuUtW"‘Hkš¶/“ÉÀb± ©© èºwïÞãÓ´··š¦‘X,&+dŠ …Bû8çèííí¶X,H§Ó˜˜˜ˆöõõa~þ1ºˆ1ŸÏWdqqQF"477£P(`zz:ªë:, Ün7Âá0êëëýUo²”©TªXÉz!µ²²§Ó ]×!„@ww7¤”ˆF£BÀétbqqñkªªVf „€Ç㨪*5M#ÅžL&áp8 ë:&&&H>Ÿ'¹\޲¶¶‡ÃMÓ¶§‹b±˜Ô4¬^B´µµÝàœcddŠ¢È¾¾>œ;wBÜ¿CzWd „‰D‡CNNNÊP($ƒÁ t¹\˜=c·Û166&—––PŒÓÝ»wIKK îܹCªÆ€1ö-Ó4 ©ªês@à}Î9Ž;&óù<ìv; Ã@<G6›…Åb!äéÓ§¾‡]ºTA>Ÿ¿³³³ø‚ñÞÉ“'qüøq0ÆÀ+2,õbÆ566>¾„B!ùè”R˜¦ ÆX—Íf‹š¦ Ó4QWWÎ9cH¥R×B¡t8ÈçóÕ6?èì.—¤”ÂårE)¥ ”‚1Îy €RZؼopp°<À‹CCÐoݺ%)¥¤h¬È RtÙæ}Û.™™LæòôôôóŠ¢€1vÐ0Œ!UUõS«ÕšÑu]§”>¹.†ÛíF}}=t]G.—ƒa@]]ü~?æææ «Õq¹í~þüùšÖK)ÿÏþñºpá‚4ÞÖžÿDfkÀ¢îuGIEND®B`‚enigmail-2.0.8/ui/skin/tb-windows/images/enigsend-act.gif000066400000000000000000000007101334302754500232650ustar00rootroot00000000000000GIF89a¥dfd42œ42dœœÌÎÌΜdfÌÌÎÌËÍœÍÏ ÎУÒÔ¬„ƒ®dfeœšÌÌвÌÎÉËšËÍ›ÊÍdgËËÍÌÏ ÎѨÿÿÿ»»»ÇÊšceÇ— ÈÊ›333 ™ehgÌиÊÌ›œšËÌf¦SËÍÌÿÿÌÿÿfÿÌ™3dgeÌ™fËÍËÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ù ?,åÀŸpH€Pl:ŸPâ`@ˆ:‚¡pX…Xƒ@h÷ ÞÚnsp ÚxmÜ ®# e[ˆgH  nf]Sb •”  ?Hv†G`Œ’ !"E­#$bÇ%|s¿wÓ&ÞÞ'FD«¬v(&)*ì+,-dBHCv&).+.Þ/0LL† `Ï„ŠW˜xñÆ9VLìÛׯÉCX¼Ø¸1ʼ! ¿|üâŒd‘ ;enigmail-2.0.8/ui/skin/tb-windows/images/enigsend-dis.gif000066400000000000000000000023231334302754500232770ustar00rootroot00000000000000GIF89a çëõþŠ—£‰˜£ÛâéuƒŽ˜¢¬›§² ª´£®¸¥°»©³½¬¶Á±»Å¸Ã̵ÀÊöýþ’Ÿ§¥³À¤¥ªºÆÐ›œ¡ããäÛÛݲ¾Éº¼À¿Áı²µÂÃÅÖÖØêëìÅÆÈ}‰yŠjmt‹’¾ÉÓ‘”šˆŠÑÒÔÁÌÖ¦¨­ryƒ†ˆŽ|ƒ–my…·¸»òóó®°±y{~¨ª­÷÷ùÊËÌ‚„‹npw•˜ÓÚáÝÞágjqýýýŽ•Ð׿ãæêåéí¡¢¥ƒ…Xbmáí÷êîñ‘“•Z]dîñól’ÔØÜ¹º¼š›ÅÐÙ­®²cem{~…ÍÓ×MQY‹‘šÏØß$)4co{ILUÅÏØÊÓÝgz†‹œª29ECHRž­º%X_i^r~“£±,1 0) { if (testcases.search(filename) >= 0) do_subtest(filename); } else do_subtest(filename); } // the subprocess tests execTest("enigmailMsgComposeOverlay-test.js"); enigmail-2.0.8/util/000077500000000000000000000000001334302754500142715ustar00rootroot00000000000000enigmail-2.0.8/util/Expression.py000066400000000000000000000153761334302754500170160ustar00rootroot00000000000000# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. """ Parses and evaluates simple statements for Preprocessor: Expression currently supports the following grammar, whitespace is ignored: expression : and_cond ( '||' expression ) ? ; and_cond: test ( '&&' and_cond ) ? ; test: unary ( ( '==' | '!=' ) unary ) ? ; unary : '!'? value ; value : [0-9]+ # integer | 'defined(' \w+ ')' | \w+ # string identifier or value; """ import re class Expression: def __init__(self, expression_string): """ Create a new expression with this string. The expression will already be parsed into an Abstract Syntax Tree. """ self.content = expression_string self.offset = 0 self.__ignore_whitespace() self.e = self.__get_logical_or() if self.content: raise Expression.ParseError, self def __get_logical_or(self): """ Production: and_cond ( '||' expression ) ? """ if not len(self.content): return None rv = Expression.__AST("logical_op") # test rv.append(self.__get_logical_and()) self.__ignore_whitespace() if self.content[:2] != '||': # no logical op needed, short cut to our prime element return rv[0] # append operator rv.append(Expression.__ASTLeaf('op', self.content[:2])) self.__strip(2) self.__ignore_whitespace() rv.append(self.__get_logical_or()) self.__ignore_whitespace() return rv def __get_logical_and(self): """ Production: test ( '&&' and_cond ) ? """ if not len(self.content): return None rv = Expression.__AST("logical_op") # test rv.append(self.__get_equality()) self.__ignore_whitespace() if self.content[:2] != '&&': # no logical op needed, short cut to our prime element return rv[0] # append operator rv.append(Expression.__ASTLeaf('op', self.content[:2])) self.__strip(2) self.__ignore_whitespace() rv.append(self.__get_logical_and()) self.__ignore_whitespace() return rv def __get_equality(self): """ Production: unary ( ( '==' | '!=' ) unary ) ? """ if not len(self.content): return None rv = Expression.__AST("equality") # unary rv.append(self.__get_unary()) self.__ignore_whitespace() if not re.match('[=!]=', self.content): # no equality needed, short cut to our prime unary return rv[0] # append operator rv.append(Expression.__ASTLeaf('op', self.content[:2])) self.__strip(2) self.__ignore_whitespace() rv.append(self.__get_unary()) self.__ignore_whitespace() return rv def __get_unary(self): """ Production: '!'? value """ # eat whitespace right away, too not_ws = re.match('!\s*', self.content) if not not_ws: return self.__get_value() rv = Expression.__AST('not') self.__strip(not_ws.end()) rv.append(self.__get_value()) self.__ignore_whitespace() return rv def __get_value(self): """ Production: ( [0-9]+ | 'defined(' \w+ ')' | \w+ ) Note that the order is important, and the expression is kind-of ambiguous as \w includes 0-9. One could make it unambiguous by removing 0-9 from the first char of a string literal. """ rv = None m = re.match('defined\s*\(\s*(\w+)\s*\)', self.content) if m: word_len = m.end() rv = Expression.__ASTLeaf('defined', m.group(1)) else: word_len = re.match('[0-9]*', self.content).end() if word_len: value = int(self.content[:word_len]) rv = Expression.__ASTLeaf('int', value) else: word_len = re.match('\w*', self.content).end() if word_len: rv = Expression.__ASTLeaf('string', self.content[:word_len]) else: raise Expression.ParseError, self self.__strip(word_len) self.__ignore_whitespace() return rv def __ignore_whitespace(self): ws_len = re.match('\s*', self.content).end() self.__strip(ws_len) return def __strip(self, length): """ Remove a given amount of chars from the input and update the offset. """ self.content = self.content[length:] self.offset += length def evaluate(self, context): """ Evaluate the expression with the given context """ # Helper function to evaluate __get_equality results def eval_equality(tok): left = opmap[tok[0].type](tok[0]) right = opmap[tok[2].type](tok[2]) rv = left == right if tok[1].value == '!=': rv = not rv return rv # Helper function to evaluate __get_logical_and and __get_logical_or results def eval_logical_op(tok): left = opmap[tok[0].type](tok[0]) right = opmap[tok[2].type](tok[2]) if tok[1].value == '&&': return left and right elif tok[1].value == '||': return left or right raise Expression.ParseError, self # Mapping from token types to evaluator functions # Apart from (non-)equality, all these can be simple lambda forms. opmap = { 'logical_op': eval_logical_op, 'equality': eval_equality, 'not': lambda tok: not opmap[tok[0].type](tok[0]), 'string': lambda tok: context[tok.value], 'defined': lambda tok: tok.value in context, 'int': lambda tok: tok.value} return opmap[self.e.type](self.e); class __AST(list): """ Internal class implementing Abstract Syntax Tree nodes """ def __init__(self, type): self.type = type super(self.__class__, self).__init__(self) class __ASTLeaf: """ Internal class implementing Abstract Syntax Tree leafs """ def __init__(self, type, value): self.value = value self.type = type def __str__(self): return self.value.__str__() def __repr__(self): return self.value.__repr__() class ParseError(StandardError): """ Error raised when parsing fails. It has two members, offset and content, which give the offset of the error and the offending content. """ def __init__(self, expression): self.offset = expression.offset self.content = expression.content[:3] def __str__(self): return 'Unexpected content at offset {0}, "{1}"'.format(self.offset, self.content) class Context(dict): """ This class holds variable values by subclassing dict, and while it truthfully reports True and False on name in context it returns the variable name itself on context["name"] to reflect the ambiguity between string literals and preprocessor variables. """ def __getitem__(self, key): if key in self: return super(self.__class__, self).__getitem__(key) return key enigmail-2.0.8/util/JarMaker.py000066400000000000000000000423101334302754500163370ustar00rootroot00000000000000# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. '''jarmaker.py provides a python class to package up chrome content by processing jar.mn files. See the documentation for jar.mn on MDC for further details on the format. ''' import sys import os import os.path import errno import re import logging from time import localtime from optparse import OptionParser from MozZipFile import ZipFile from cStringIO import StringIO from datetime import datetime from utils import pushback_iter, lockFile from Preprocessor import Preprocessor from buildlist import addEntriesToListFile if sys.platform == "win32": from ctypes import windll, WinError CreateHardLink = windll.kernel32.CreateHardLinkA __all__ = ['JarMaker'] class ZipEntry: '''Helper class for jar output. This class defines a simple file-like object for a zipfile.ZipEntry so that we can consecutively write to it and then close it. This methods hooks into ZipFile.writestr on close(). ''' def __init__(self, name, zipfile): self._zipfile = zipfile self._name = name self._inner = StringIO() def write(self, content): 'Append the given content to this zip entry' self._inner.write(content) return def close(self): 'The close method writes the content back to the zip file.' self._zipfile.writestr(self._name, self._inner.getvalue()) def getModTime(aPath): if not os.path.isfile(aPath): return 0 mtime = os.stat(aPath).st_mtime return localtime(mtime) class JarMaker(object): '''JarMaker reads jar.mn files and process those into jar files or flat directories, along with chrome.manifest files. ''' ignore = re.compile('\s*(\#.*)?$') jarline = re.compile('(?:(?P[\w\d.\-\_\\\/]+).jar\:)|(?:\s*(\#.*)?)\s*$') relsrcline = re.compile('relativesrcdir\s+(?P.+?):') regline = re.compile('\%\s+(.*)$') entryre = '(?P\*)?(?P\+?)\s+' entryline = re.compile(entryre + '(?P[\w\d.\-\_\\\/\+\@]+)\s*(\((?P\%?)(?P[\w\d.\-\_\\\/\@]+)\))?\s*$') def __init__(self, outputFormat = 'flat', useJarfileManifest = True, useChromeManifest = False): self.outputFormat = outputFormat self.useJarfileManifest = useJarfileManifest self.useChromeManifest = useChromeManifest self.pp = Preprocessor() self.topsourcedir = None self.sourcedirs = [] self.localedirs = None self.l10nbase = None self.l10nmerge = None self.relativesrcdir = None self.rootManifestAppId = None def getCommandLineParser(self): '''Get a optparse.OptionParser for jarmaker. This OptionParser has the options for jarmaker as well as the options for the inner PreProcessor. ''' # HACK, we need to unescape the string variables we get, # the perl versions didn't grok strings right p = self.pp.getCommandLineParser(unescapeDefines = True) p.add_option('-f', type="choice", default="jar", choices=('jar', 'flat', 'symlink'), help="fileformat used for output", metavar="[jar, flat, symlink]") p.add_option('-v', action="store_true", dest="verbose", help="verbose output") p.add_option('-q', action="store_false", dest="verbose", help="verbose output") p.add_option('-e', action="store_true", help="create chrome.manifest instead of jarfile.manifest") p.add_option('--both-manifests', action="store_true", dest="bothManifests", help="create chrome.manifest and jarfile.manifest") p.add_option('-s', type="string", action="append", default=[], help="source directory") p.add_option('-t', type="string", help="top source directory") p.add_option('-c', '--l10n-src', type="string", action="append", help="localization directory") p.add_option('--l10n-base', type="string", action="store", help="base directory to be used for localization (requires relativesrcdir)") p.add_option('--locale-mergedir', type="string", action="store", help="base directory to be used for l10n-merge (requires l10n-base and relativesrcdir)") p.add_option('--relativesrcdir', type="string", help="relativesrcdir to be used for localization") p.add_option('-j', type="string", help="jarfile directory") p.add_option('--root-manifest-entry-appid', type="string", help="add an app id specific root chrome manifest entry.") return p def processIncludes(self, includes): '''Process given includes with the inner PreProcessor. Only use this for #defines, the includes shouldn't generate content. ''' self.pp.out = StringIO() for inc in includes: self.pp.do_include(inc) includesvalue = self.pp.out.getvalue() if includesvalue: logging.info("WARNING: Includes produce non-empty output") self.pp.out = None pass def finalizeJar(self, jarPath, chromebasepath, register, doZip=True): '''Helper method to write out the chrome registration entries to jarfile.manifest or chrome.manifest, or both. The actual file processing is done in updateManifest. ''' # rewrite the manifest, if entries given if not register: return chromeManifest = os.path.join(os.path.dirname(jarPath), '..', 'chrome.manifest') if self.useJarfileManifest: self.updateManifest(jarPath + '.manifest', chromebasepath.format(''), register) addEntriesToListFile(chromeManifest, ['manifest chrome/{0}.manifest' .format(os.path.basename(jarPath))]) if self.useChromeManifest: self.updateManifest(chromeManifest, chromebasepath.format('chrome/'), register) # If requested, add a root chrome manifest entry (assumed to be in the parent directory # of chromeManifest) with the application specific id. In cases where we're building # lang packs, the root manifest must know about application sub directories. if self.rootManifestAppId: rootChromeManifest = os.path.join(os.path.normpath(os.path.dirname(chromeManifest)), '..', 'chrome.manifest') rootChromeManifest = os.path.normpath(rootChromeManifest) chromeDir = os.path.basename(os.path.dirname(os.path.normpath(chromeManifest))) logging.info("adding '%s' entry to root chrome manifest appid=%s" % (chromeDir, self.rootManifestAppId)) addEntriesToListFile(rootChromeManifest, ['manifest %s/chrome.manifest application=%s' % (chromeDir, self.rootManifestAppId)]) def updateManifest(self, manifestPath, chromebasepath, register): '''updateManifest replaces the % in the chrome registration entries with the given chrome base path, and updates the given manifest file. ''' lock = lockFile(manifestPath + '.lck') try: myregister = dict.fromkeys(map(lambda s: s.replace('%', chromebasepath), register.iterkeys())) manifestExists = os.path.isfile(manifestPath) mode = (manifestExists and 'r+b') or 'wb' mf = open(manifestPath, mode) if manifestExists: # import previous content into hash, ignoring empty ones and comments imf = re.compile('(#.*)?$') for l in re.split('[\r\n]+', mf.read()): if imf.match(l): continue myregister[l] = None mf.seek(0) for k in myregister.iterkeys(): mf.write(k + os.linesep) mf.close() finally: lock = None def makeJar(self, infile, jardir): '''makeJar is the main entry point to JarMaker. It takes the input file, the output directory, the source dirs and the top source dir as argument, and optionally the l10n dirs. ''' # making paths absolute, guess srcdir if file and add to sourcedirs _normpath = lambda p: os.path.normpath(os.path.abspath(p)) self.topsourcedir = _normpath(self.topsourcedir) self.sourcedirs = [_normpath(p) for p in self.sourcedirs] if self.localedirs: self.localedirs = [_normpath(p) for p in self.localedirs] elif self.relativesrcdir: self.localedirs = self.generateLocaleDirs(self.relativesrcdir) if isinstance(infile, basestring): logging.info("processing " + infile) self.sourcedirs.append(_normpath(os.path.dirname(infile))) pp = self.pp.clone() pp.out = StringIO() pp.do_include(infile) lines = pushback_iter(pp.out.getvalue().splitlines()) try: while True: l = lines.next() m = self.jarline.match(l) if not m: raise RuntimeError(l) if m.group('jarfile') is None: # comment continue self.processJarSection(m.group('jarfile'), lines, jardir) except StopIteration: # we read the file pass return def generateLocaleDirs(self, relativesrcdir): if os.path.basename(relativesrcdir) == 'locales': # strip locales l10nrelsrcdir = os.path.dirname(relativesrcdir) else: l10nrelsrcdir = relativesrcdir locdirs = [] # generate locales dirs, merge, l10nbase, en-US if self.l10nmerge: locdirs.append(os.path.join(self.l10nmerge, l10nrelsrcdir)) if self.l10nbase: locdirs.append(os.path.join(self.l10nbase, l10nrelsrcdir)) if self.l10nmerge or not self.l10nbase: # add en-US if we merge, or if it's not l10n locdirs.append(os.path.join(self.topsourcedir, relativesrcdir, 'en-US')) return locdirs def processJarSection(self, jarfile, lines, jardir): '''Internal method called by makeJar to actually process a section of a jar.mn file. jarfile is the basename of the jarfile or the directory name for flat output, lines is a pushback_iterator of the lines of jar.mn, the remaining options are carried over from makeJar. ''' # chromebasepath is used for chrome registration manifests # {0} is getting replaced with chrome/ for chrome.manifest, and with # an empty string for jarfile.manifest chromebasepath = '{0}' + os.path.basename(jarfile) if self.outputFormat == 'jar': chromebasepath = 'jar:' + chromebasepath + '.jar!' chromebasepath += '/' jarfile = os.path.join(jardir, jarfile) jf = None if self.outputFormat == 'jar': #jar jarfilepath = jarfile + '.jar' try: os.makedirs(os.path.dirname(jarfilepath)) except OSError as error: if error.errno != errno.EEXIST: raise jf = ZipFile(jarfilepath, 'a', lock = True) outHelper = self.OutputHelper_jar(jf) else: outHelper = getattr(self, 'OutputHelper_' + self.outputFormat)(jarfile) register = {} # This loop exits on either # - the end of the jar.mn file # - an line in the jar.mn file that's not part of a jar section # - on an exception raised, close the jf in that case in a finally try: while True: try: l = lines.next() except StopIteration: # we're done with this jar.mn, and this jar section self.finalizeJar(jarfile, chromebasepath, register) if jf is not None: jf.close() # reraise the StopIteration for makeJar raise if self.ignore.match(l): continue m = self.relsrcline.match(l) if m: relativesrcdir = m.group('relativesrcdir') self.localedirs = self.generateLocaleDirs(relativesrcdir) continue m = self.regline.match(l) if m: rline = m.group(1) register[rline] = 1 continue m = self.entryline.match(l) if not m: # neither an entry line nor chrome reg, this jar section is done self.finalizeJar(jarfile, chromebasepath, register) if jf is not None: jf.close() lines.pushback(l) return self._processEntryLine(m, outHelper, jf) finally: if jf is not None: jf.close() return def _processEntryLine(self, m, outHelper, jf): out = m.group('output') src = m.group('source') or os.path.basename(out) # pick the right sourcedir -- l10n, topsrc or src if m.group('locale'): src_base = self.localedirs elif src.startswith('/'): # path/in/jar/file_name.xul (/path/in/sourcetree/file_name.xul) # refers to a path relative to topsourcedir, use that as base # and strip the leading '/' src_base = [self.topsourcedir] src = src[1:] else: # use srcdirs and the objdir (current working dir) for relative paths src_base = self.sourcedirs + [os.getcwd()] # check if the source file exists realsrc = None for _srcdir in src_base: if os.path.isfile(os.path.join(_srcdir, src)): realsrc = os.path.join(_srcdir, src) break if realsrc is None: if jf is not None: jf.close() raise RuntimeError('File "{0}" not found in {1}' .format(src, ', '.join(src_base))) if m.group('optPreprocess'): outf = outHelper.getOutput(out) inf = open(realsrc) pp = self.pp.clone() if src[-4:] == '.css': pp.setMarker('%') pp.out = outf pp.do_include(inf) pp.warnUnused(realsrc) outf.close() inf.close() return # copy or symlink if newer or overwrite if (m.group('optOverwrite') or (getModTime(realsrc) > outHelper.getDestModTime(m.group('output')))): if self.outputFormat == 'symlink': outHelper.symlink(realsrc, out) return outf = outHelper.getOutput(out) # open in binary mode, this can be images etc inf = open(realsrc, 'rb') outf.write(inf.read()) outf.close() inf.close() class OutputHelper_jar(object): '''Provide getDestModTime and getOutput for a given jarfile. ''' def __init__(self, jarfile): self.jarfile = jarfile def getDestModTime(self, aPath): try : info = self.jarfile.getinfo(aPath) return info.date_time except: return 0 def getOutput(self, name): return ZipEntry(name, self.jarfile) class OutputHelper_flat(object): '''Provide getDestModTime and getOutput for a given flat output directory. The helper method ensureDirFor is used by the symlink subclass. ''' def __init__(self, basepath): self.basepath = basepath def getDestModTime(self, aPath): return getModTime(os.path.join(self.basepath, aPath)) def getOutput(self, name): out = self.ensureDirFor(name) # remove previous link or file try: os.remove(out) except OSError as e: if e.errno != errno.ENOENT: raise return open(out, 'wb') def ensureDirFor(self, name): out = os.path.join(self.basepath, name) outdir = os.path.dirname(out) if not os.path.isdir(outdir): try: os.makedirs(outdir) except OSError as error: if error.errno != errno.EEXIST: raise return out class OutputHelper_symlink(OutputHelper_flat): '''Subclass of OutputHelper_flat that provides a helper for creating a symlink including creating the parent directories. ''' def symlink(self, src, dest): out = self.ensureDirFor(dest) # remove previous link or file try: os.remove(out) except OSError as e: if e.errno != errno.ENOENT: raise if sys.platform != "win32": os.symlink(src, out) else: # On Win32, use ctypes to create a hardlink rv = CreateHardLink(out, src, None) if rv == 0: raise WinError() def main(): jm = JarMaker() p = jm.getCommandLineParser() (options, args) = p.parse_args() jm.processIncludes(options.I) jm.outputFormat = options.f jm.sourcedirs = options.s jm.topsourcedir = options.t if options.e: jm.useChromeManifest = True jm.useJarfileManifest = False if options.bothManifests: jm.useChromeManifest = True jm.useJarfileManifest = True if options.l10n_base: if not options.relativesrcdir: p.error('relativesrcdir required when using l10n-base') if options.l10n_src: p.error('both l10n-src and l10n-base are not supported') jm.l10nbase = options.l10n_base jm.relativesrcdir = options.relativesrcdir jm.l10nmerge = options.locale_mergedir elif options.locale_mergedir: p.error('l10n-base required when using locale-mergedir') jm.localedirs = options.l10n_src if options.root_manifest_entry_appid: jm.rootManifestAppId = options.root_manifest_entry_appid noise = logging.INFO if options.verbose is not None: noise = (options.verbose and logging.DEBUG) or logging.WARN if sys.version_info[:2] > (2,3): logging.basicConfig(format = "%(message)s") else: logging.basicConfig() logging.getLogger().setLevel(noise) topsrc = options.t topsrc = os.path.normpath(os.path.abspath(topsrc)) if not args: infile = sys.stdin else: infile, = args jm.makeJar(infile, options.j) if __name__ == "__main__": main() enigmail-2.0.8/util/MozZipFile.py000066400000000000000000000116461334302754500167030ustar00rootroot00000000000000# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. import zipfile import time import binascii, struct import zlib import os from utils import lockFile class ZipFile(zipfile.ZipFile): """ Class with methods to open, read, write, close, list zip files. Subclassing zipfile.ZipFile to allow for overwriting of existing entries, though only for writestr, not for write. """ def __init__(self, file, mode="r", compression=zipfile.ZIP_STORED, lock = False): if lock: assert isinstance(file, basestring) self.lockfile = lockFile(file + '.lck') else: self.lockfile = None if mode == 'a' and lock: # appending to a file which doesn't exist fails, but we can't check # existence util we hold the lock if (not os.path.isfile(file)) or os.path.getsize(file) == 0: mode = 'w' zipfile.ZipFile.__init__(self, file, mode, compression) self._remove = [] self.end = self.fp.tell() self.debug = 0 def writestr(self, zinfo_or_arcname, bytes): """Write contents into the archive. The contents is the argument 'bytes', 'zinfo_or_arcname' is either a ZipInfo instance or the name of the file in the archive. This method is overloaded to allow overwriting existing entries. """ if not isinstance(zinfo_or_arcname, zipfile.ZipInfo): zinfo = zipfile.ZipInfo(filename=zinfo_or_arcname, date_time=time.localtime(time.time())) zinfo.compress_type = self.compression # Add some standard UNIX file access permissions (-rw-r--r--). zinfo.external_attr = (0x81a4 & 0xFFFF) << 16L else: zinfo = zinfo_or_arcname # Now to the point why we overwrote this in the first place, # remember the entry numbers if we already had this entry. # Optimizations: # If the entry to overwrite is the last one, just reuse that. # If we store uncompressed and the new content has the same size # as the old, reuse the existing entry. doSeek = False # store if we need to seek to the eof after overwriting if self.NameToInfo.has_key(zinfo.filename): # Find the last ZipInfo with our name. # Last, because that's catching multiple overwrites i = len(self.filelist) while i > 0: i -= 1 if self.filelist[i].filename == zinfo.filename: break zi = self.filelist[i] if ((zinfo.compress_type == zipfile.ZIP_STORED and zi.compress_size == len(bytes)) or (i + 1) == len(self.filelist)): # make sure we're allowed to write, otherwise done by writestr below self._writecheck(zi) # overwrite existing entry self.fp.seek(zi.header_offset) if (i + 1) == len(self.filelist): # this is the last item in the file, just truncate self.fp.truncate() else: # we need to move to the end of the file afterwards again doSeek = True # unhook the current zipinfo, the writestr of our superclass # will add a new one self.filelist.pop(i) self.NameToInfo.pop(zinfo.filename) else: # Couldn't optimize, sadly, just remember the old entry for removal self._remove.append(self.filelist.pop(i)) zipfile.ZipFile.writestr(self, zinfo, bytes) self.filelist.sort(lambda l, r: cmp(l.header_offset, r.header_offset)) if doSeek: self.fp.seek(self.end) self.end = self.fp.tell() def close(self): """Close the file, and for mode "w" and "a" write the ending records. Overwritten to compact overwritten entries. """ if not self._remove: # we don't have anything special to do, let's just call base r = zipfile.ZipFile.close(self) self.lockfile = None return r if self.fp.mode != 'r+b': # adjust file mode if we originally just wrote, now we rewrite self.fp.close() self.fp = open(self.filename, 'r+b') all = map(lambda zi: (zi, True), self.filelist) + \ map(lambda zi: (zi, False), self._remove) all.sort(lambda l, r: cmp(l[0].header_offset, r[0].header_offset)) # empty _remove for multiple closes self._remove = [] lengths = [all[i+1][0].header_offset - all[i][0].header_offset for i in xrange(len(all)-1)] lengths.append(self.end - all[-1][0].header_offset) to_pos = 0 for (zi, keep), length in zip(all, lengths): if not keep: continue oldoff = zi.header_offset # python <= 2.4 has file_offset if hasattr(zi, 'file_offset'): zi.file_offset = zi.file_offset + to_pos - oldoff zi.header_offset = to_pos self.fp.seek(oldoff) content = self.fp.read(length) self.fp.seek(to_pos) self.fp.write(content) to_pos += length self.fp.truncate() zipfile.ZipFile.close(self) self.lockfile = None enigmail-2.0.8/util/Preprocessor.py000066400000000000000000000372531334302754500173430ustar00rootroot00000000000000""" This is a very primitive line based preprocessor, for times when using a C preprocessor isn't an option. """ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. import sys import os import os.path import re from optparse import OptionParser import errno # hack around win32 mangling our line endings # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/65443 if sys.platform == "win32": import msvcrt msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY) os.linesep = '\n' import Expression __all__ = ['Preprocessor', 'preprocess'] class Preprocessor: """ Class for preprocessing text files. """ class Error(RuntimeError): def __init__(self, cpp, MSG, context): self.file = cpp.context['FILE'] self.line = cpp.context['LINE'] self.key = MSG RuntimeError.__init__(self, (self.file, self.line, self.key, context)) def __init__(self): self.context = Expression.Context() for k,v in {'FILE': '', 'LINE': 0, 'DIRECTORY': os.path.abspath('.')}.iteritems(): self.context[k] = v self.actionLevel = 0 self.disableLevel = 0 # ifStates can be # 0: hadTrue # 1: wantsTrue # 2: #else found self.ifStates = [] self.checkLineNumbers = False self.writtenLines = 0 self.filters = [] self.cmds = {} for cmd, level in {'define': 0, 'undef': 0, 'if': sys.maxint, 'ifdef': sys.maxint, 'ifndef': sys.maxint, 'else': 1, 'elif': 1, 'elifdef': 1, 'elifndef': 1, 'endif': sys.maxint, 'expand': 0, 'literal': 0, 'filter': 0, 'unfilter': 0, 'include': 0, 'includesubst': 0, 'error': 0}.iteritems(): self.cmds[cmd] = (level, getattr(self, 'do_' + cmd)) self.out = sys.stdout self.setMarker('#') self.LE = '\n' self.varsubst = re.compile('@(?P\w+)@', re.U) def warnUnused(self, file): if self.actionLevel == 0: sys.stderr.write('{0}: WARNING: no preprocessor directives found\n'.format(file)) elif self.actionLevel == 1: sys.stderr.write('{0}: WARNING: no useful preprocessor directives found\n'.format(file)) pass def setLineEndings(self, aLE): """ Set the line endings to be used for output. """ self.LE = {'cr': '\x0D', 'lf': '\x0A', 'crlf': '\x0D\x0A'}[aLE] def setMarker(self, aMarker): """ Set the marker to be used for processing directives. Used for handling CSS files, with pp.setMarker('%'), for example. The given marker may be None, in which case no markers are processed. """ self.marker = aMarker if aMarker: self.instruction = re.compile('{0}(?P[a-z]+)(?:\s(?P.*))?$' .format(aMarker), re.U) self.comment = re.compile(aMarker, re.U) else: class NoMatch(object): def match(self, *args): return False self.instruction = self.comment = NoMatch() def clone(self): """ Create a clone of the current processor, including line ending settings, marker, variable definitions, output stream. """ rv = Preprocessor() rv.context.update(self.context) rv.setMarker(self.marker) rv.LE = self.LE rv.out = self.out return rv def applyFilters(self, aLine): for f in self.filters: aLine = f[1](aLine) return aLine def write(self, aLine): """ Internal method for handling output. """ if self.checkLineNumbers: self.writtenLines += 1 ln = self.context['LINE'] if self.writtenLines != ln: self.out.write('//@line {line} "{file}"{le}'.format(line=ln, file=self.context['FILE'], le=self.LE)) self.writtenLines = ln filteredLine = self.applyFilters(aLine) if filteredLine != aLine: self.actionLevel = 2 # ensure our line ending. Only need to handle \n, as we're reading # with universal line ending support, at least for files. filteredLine = re.sub('\n', self.LE, filteredLine) self.out.write(filteredLine) def handleCommandLine(self, args, defaultToStdin = False): """ Parse a commandline into this parser. Uses OptionParser internally, no args mean sys.argv[1:]. """ p = self.getCommandLineParser() (options, args) = p.parse_args(args=args) includes = options.I if options.output: dir = os.path.dirname(options.output) if dir and not os.path.exists(dir): try: os.makedirs(dir) except OSError as error: if error.errno != errno.EEXIST: raise self.out = open(options.output, 'w') if defaultToStdin and len(args) == 0: args = [sys.stdin] includes.extend(args) if includes: for f in includes: self.do_include(f, False) self.warnUnused(f) pass def getCommandLineParser(self, unescapeDefines = False): escapedValue = re.compile('".*"$') numberValue = re.compile('\d+$') def handleE(option, opt, value, parser): for k,v in os.environ.iteritems(): self.context[k] = v def handleD(option, opt, value, parser): vals = value.split('=', 1) if len(vals) == 1: vals.append(1) elif unescapeDefines and escapedValue.match(vals[1]): # strip escaped string values vals[1] = vals[1][1:-1] elif numberValue.match(vals[1]): vals[1] = int(vals[1]) self.context[vals[0]] = vals[1] def handleU(option, opt, value, parser): del self.context[value] def handleF(option, opt, value, parser): self.do_filter(value) def handleLE(option, opt, value, parser): self.setLineEndings(value) def handleMarker(option, opt, value, parser): self.setMarker(value) p = OptionParser() p.add_option('-I', action='append', type="string", default = [], metavar="FILENAME", help='Include file') p.add_option('-E', action='callback', callback=handleE, help='Import the environment into the defined variables') p.add_option('-D', action='callback', callback=handleD, type="string", metavar="VAR[=VAL]", help='Define a variable') p.add_option('-U', action='callback', callback=handleU, type="string", metavar="VAR", help='Undefine a variable') p.add_option('-F', action='callback', callback=handleF, type="string", metavar="FILTER", help='Enable the specified filter') p.add_option('-o', '--output', type="string", default=None, metavar="FILENAME", help='Output to the specified file '+ 'instead of stdout') p.add_option('--line-endings', action='callback', callback=handleLE, type="string", metavar="[cr|lr|crlf]", help='Use the specified line endings [Default: OS dependent]') p.add_option('--marker', action='callback', callback=handleMarker, type="string", help='Use the specified marker instead of #') return p def handleLine(self, aLine): """ Handle a single line of input (internal). """ if self.actionLevel == 0 and self.comment.match(aLine): self.actionLevel = 1 m = self.instruction.match(aLine) if m: args = None cmd = m.group('cmd') try: args = m.group('args') except IndexError: pass if cmd not in self.cmds: raise Preprocessor.Error(self, 'INVALID_CMD', aLine) level, cmd = self.cmds[cmd] if (level >= self.disableLevel): cmd(args) if cmd != 'literal': self.actionLevel = 2 elif self.disableLevel == 0 and not self.comment.match(aLine): self.write(aLine) pass # Instruction handlers # These are named do_'instruction name' and take one argument # Variables def do_define(self, args): m = re.match('(?P\w+)(?:\s(?P.*))?', args, re.U) if not m: raise Preprocessor.Error(self, 'SYNTAX_DEF', args) val = 1 if m.group('value'): val = self.applyFilters(m.group('value')) try: val = int(val) except: pass self.context[m.group('name')] = val def do_undef(self, args): m = re.match('(?P\w+)$', args, re.U) if not m: raise Preprocessor.Error(self, 'SYNTAX_DEF', args) if args in self.context: del self.context[args] # Logic def ensure_not_else(self): if len(self.ifStates) == 0 or self.ifStates[-1] == 2: sys.stderr.write('WARNING: bad nesting of #else\n') def do_if(self, args, replace=False): if self.disableLevel and not replace: self.disableLevel += 1 return val = None try: e = Expression.Expression(args) val = e.evaluate(self.context) except Exception: # XXX do real error reporting raise Preprocessor.Error(self, 'SYNTAX_ERR', args) if type(val) == str: # we're looking for a number value, strings are false val = False if not val: self.disableLevel = 1 if replace: if val: self.disableLevel = 0 self.ifStates[-1] = self.disableLevel else: self.ifStates.append(self.disableLevel) pass def do_ifdef(self, args, replace=False): if self.disableLevel and not replace: self.disableLevel += 1 return if re.match('\W', args, re.U): raise Preprocessor.Error(self, 'INVALID_VAR', args) if args not in self.context: self.disableLevel = 1 if replace: if args in self.context: self.disableLevel = 0 self.ifStates[-1] = self.disableLevel else: self.ifStates.append(self.disableLevel) pass def do_ifndef(self, args, replace=False): if self.disableLevel and not replace: self.disableLevel += 1 return if re.match('\W', args, re.U): raise Preprocessor.Error(self, 'INVALID_VAR', args) if args in self.context: self.disableLevel = 1 if replace: if args not in self.context: self.disableLevel = 0 self.ifStates[-1] = self.disableLevel else: self.ifStates.append(self.disableLevel) pass def do_else(self, args, ifState = 2): self.ensure_not_else() hadTrue = self.ifStates[-1] == 0 self.ifStates[-1] = ifState # in-else if hadTrue: self.disableLevel = 1 return self.disableLevel = 0 def do_elif(self, args): if self.disableLevel == 1: if self.ifStates[-1] == 1: self.do_if(args, replace=True) else: self.do_else(None, self.ifStates[-1]) def do_elifdef(self, args): if self.disableLevel == 1: if self.ifStates[-1] == 1: self.do_ifdef(args, replace=True) else: self.do_else(None, self.ifStates[-1]) def do_elifndef(self, args): if self.disableLevel == 1: if self.ifStates[-1] == 1: self.do_ifndef(args, replace=True) else: self.do_else(None, self.ifStates[-1]) def do_endif(self, args): if self.disableLevel > 0: self.disableLevel -= 1 if self.disableLevel == 0: self.ifStates.pop() # output processing def do_expand(self, args): lst = re.split('__(\w+)__', args, re.U) do_replace = False def vsubst(v): if v in self.context: return str(self.context[v]) return '' for i in range(1, len(lst), 2): lst[i] = vsubst(lst[i]) lst.append('\n') # add back the newline self.write(reduce(lambda x, y: x+y, lst, '')) def do_literal(self, args): self.write(args + self.LE) def do_filter(self, args): filters = [f for f in args.split(' ') if hasattr(self, 'filter_' + f)] if len(filters) == 0: return current = dict(self.filters) for f in filters: current[f] = getattr(self, 'filter_' + f) filterNames = current.keys() filterNames.sort() self.filters = [(fn, current[fn]) for fn in filterNames] return def do_unfilter(self, args): filters = args.split(' ') current = dict(self.filters) for f in filters: if f in current: del current[f] filterNames = current.keys() filterNames.sort() self.filters = [(fn, current[fn]) for fn in filterNames] return # Filters # # emptyLines # Strips blank lines from the output. def filter_emptyLines(self, aLine): if aLine == '\n': return '' return aLine # slashslash # Strips everything after // def filter_slashslash(self, aLine): if (aLine.find('//') == -1): return aLine [aLine, rest] = aLine.split('//', 1) if rest: aLine += '\n' return aLine # spaces # Collapses sequences of spaces into a single space def filter_spaces(self, aLine): return re.sub(' +', ' ', aLine).strip(' ') # substition # helper to be used by both substition and attemptSubstitution def filter_substitution(self, aLine, fatal=True): def repl(matchobj): varname = matchobj.group('VAR') if varname in self.context: return str(self.context[varname]) if fatal: raise Preprocessor.Error(self, 'UNDEFINED_VAR', varname) return matchobj.group(0) return self.varsubst.sub(repl, aLine) def filter_attemptSubstitution(self, aLine): return self.filter_substitution(aLine, fatal=False) # File ops def do_include(self, args, filters=True): """ Preprocess a given file. args can either be a file name, or a file-like object. Files should be opened, and will be closed after processing. """ isName = type(args) == str or type(args) == unicode oldWrittenLines = self.writtenLines oldCheckLineNumbers = self.checkLineNumbers self.checkLineNumbers = False if isName: try: args = str(args) if filters: args = self.applyFilters(args) if not os.path.isabs(args): args = os.path.join(self.context['DIRECTORY'], args) args = open(args, 'rU') except Preprocessor.Error: raise except: raise Preprocessor.Error(self, 'FILE_NOT_FOUND', str(args)) self.checkLineNumbers = bool(re.search('\.(js|jsm|java)(?:\.in)?$', args.name)) oldFile = self.context['FILE'] oldLine = self.context['LINE'] oldDir = self.context['DIRECTORY'] if args.isatty(): # we're stdin, use '-' and '' for file and dir self.context['FILE'] = '-' self.context['DIRECTORY'] = '' else: abspath = os.path.abspath(args.name) self.context['FILE'] = abspath self.context['DIRECTORY'] = os.path.dirname(abspath) self.context['LINE'] = 0 self.writtenLines = 0 for l in args: self.context['LINE'] += 1 self.handleLine(l) args.close() self.context['FILE'] = oldFile self.checkLineNumbers = oldCheckLineNumbers self.writtenLines = oldWrittenLines self.context['LINE'] = oldLine self.context['DIRECTORY'] = oldDir def do_includesubst(self, args): args = self.filter_substitution(args) self.do_include(args) def do_error(self, args): raise Preprocessor.Error(self, 'Error: ', str(args)) def main(): pp = Preprocessor() pp.handleCommandLine(None, True) return def preprocess(includes=[sys.stdin], defines={}, output = sys.stdout, line_endings='\n', marker='#'): pp = Preprocessor() pp.context.update(defines) pp.setLineEndings(line_endings) pp.setMarker(marker) pp.out = output for f in includes: pp.do_include(f, False) if __name__ == "__main__": main() enigmail-2.0.8/util/build.mk000077500000000000000000000027501334302754500157300ustar00rootroot00000000000000PLY_INC_PATH = -I$(topsrcdir)/mozilla/other-licenses/ply XPIDL_GEN_DIR = _xpidlgen MDDEPDIR = .deps REPORT_BUILD = $(info $(notdir $<)) PYTHON_PATH = $(PYTHON) $(topsrcdir)/mozilla/config/pythonpath.py MAKEJAR = $(PYTHON) $(topsrcdir)/mozilla/config/JarMaker.py \ $(QUIET) -j $(FINAL_TARGET)/chrome \ $(MAKE_JARS_FLAGS) $(XULPPFLAGS) $(DEFINES) $(ACDEFINES) \ $(JAR_MANIFEST) $(VPATH)/jar.mn ifneq ($(XPIDLSRCS),) XPIDL_DEPS = \ $(LIBXUL_DIST)/sdk/bin/header.py \ $(LIBXUL_DIST)/sdk/bin/typelib.py \ $(LIBXUL_DIST)/sdk/bin/xpidl.py \ $(NULL) xpidl-preqs = \ $(call mkdir_deps,$(XPIDL_GEN_DIR)) \ $(call mkdir_deps,$(MDDEPDIR)) \ $(NULL) XPIDL_HEADERS_FILES := $(patsubst %.idl,$(XPIDL_GEN_DIR)/%.h, $(XPIDLSRCS)) XPIDL_HEADERS_DEST := $(DIST)/include XPT_MODULE_DEST := $(DIST)/bin/components # generate intermediate .xpt files into $(XPIDL_GEN_DIR), then link # into $(XPIDL_MODULE).xpt and export it to $(FINAL_TARGET)/components. $(XPIDL_GEN_DIR)/%.xpt: %.idl $(XPIDL_DEPS) $(xpidl-preqs) $(srcdir)/../util/xptgen $(PYTHON) $(topsrcdir) $(srcdir) $(DEPTH) $@ ; \ $(INSTALL) $(patsubst %.xpt,%.h, $@) $(XPIDL_HEADERS_DEST) XPT_PY = $(filter %/xpt.py,$(XPIDL_LINK)) xpidl-idl2xpt = $(patsubst %.idl,$(XPIDL_GEN_DIR)/%.xpt,$(XPIDLSRCS)) xpidl-module-deps = $(xpidl-idl2xpt) $(GLOBAL_DEPS) $(XPT_PY) $(XPIDL_GEN_DIR)/$(XPIDL_MODULE).xpt: $(xpidl-module-deps) $(XPIDL_LINK) $@ $(xpidl-idl2xpt) ; \ $(XPIDL_LINK) $@ $(xpidl-idl2xpt) ; \ $(INSTALL) $@ $(XPT_MODULE_DEST) endif enigmail-2.0.8/util/buildlist.py000066400000000000000000000023431334302754500166400ustar00rootroot00000000000000# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. '''A generic script to add entries to a file if the entry does not already exist. Usage: buildlist.py [ ...] ''' from __future__ import print_function import sys import os from utils import lockFile def addEntriesToListFile(listFile, entries): """Given a file |listFile| containing one entry per line, add each entry in |entries| to the file, unless it is already present.""" lock = lockFile(listFile + ".lck") try: if os.path.exists(listFile): f = open(listFile) existing = set(x.strip() for x in f.readlines()) f.close() else: existing = set() f = open(listFile, 'a') for e in entries: if e not in existing: f.write("{0}\n".format(e)) existing.add(e) f.close() finally: lock = None if __name__ == '__main__': if len(sys.argv) < 3: print("Usage: buildlist.py [ ...]", file=sys.stderr) sys.exit(1) addEntriesToListFile(sys.argv[1], sys.argv[2:]) enigmail-2.0.8/util/checkFiles.py000077500000000000000000000345121334302754500167130ustar00rootroot00000000000000#!/usr/bin/env python from __future__ import print_function import os import re import sys root = "." if len(sys.argv) > 1: root = sys.argv[1] #print "root: ", root ################################################################# # read in label and property files: ################################################################# # read in dtd labels and check for duplicates: dtdFilename = os.path.join(root,"ui","locale","en-US","enigmail.dtd") dtdLabels = re.findall(r'ENTITY[ \t]*(enigmail[^ \t"]*)[ \t]*"', open(dtdFilename).read()) #print dtdLabels #print len(dtdLabels) dtdLabels.sort() prev=None for label in dtdLabels: if label == prev: print("DUPLICATE label in enigmail.dtd file:", label) sys.exit(1) # read in property labels and check for duplicates: propFilename = os.path.join(root,"ui","locale","en-US","enigmail.properties") propLabels = [] for line in open(propFilename, 'r'): if re.match('[ \t]*#.*', line): continue match = re.match('[ \t]*([^ \t=]+)[ \t]*=.*', line) if match: label = match.group(1) #print label propLabels += [label] #print propLabels #print len(propLabels) propLabels.sort() prev=None for label in propLabels: if label == prev: print("DUPLICATE property in enigmail.properties file:", label) sys.exit(1) ################################################################# # used thunderbird labels and properties: ################################################################# tbLabels = [ "12511", "copyCmd.accesskey", "copyCmd.label", "sendMessageCheckWindowTitle", "sendMessageCheckLabel", "sendMessageCheckSendButtonLabel", "CheckMsg", "FNC_enigmailVersion", "FNC_isGpgWorking", ] ################################################################# # read in label and property files: ################################################################# allMissingLabels = [] allFoundLabels = [] numLabels = 0 def checkLabel (label, fromFilename): global numLabels numLabels += 1 # ignore used thunderbird labels: if label in tbLabels: return if label in dtdLabels: global allFoundLabels if not label in allFoundLabels: allFoundLabels += [label] else: print("MISSING LABEL: " + label) global allMissingLabels allMissingLabels += [ (label, fromFilename) ] allMissingProps = [] allFoundProps = [] numProps = 0 def checkProperty (label, fromFilename): global numProps numProps += 1 # ignore used thunderbird labels: if label in tbLabels: return # ignore "keyAlgorithm_..." if label.find("keyAlgorithm_") == 0: return # ignore "errorType..." if label.find("errorType") == 0: return if label in propLabels: global allFoundProps if not label in allFoundProps: allFoundProps += [label] else: print("MISSING PROPERTY: " + label) global allMissingProps allMissingProps += [ (label, fromFilename) ] ################################################################# # check XUL files: ################################################################# allLines = "" def checkXUL (filename): # print "----------------------------------------" print(" checkXUL() " + filename) global allLines allLines += open(filename, 'r').read() inComment = False for line in open(filename, 'r'): # process comments # - can't deal with multiple comments in one line if inComment: commentEnd = line.find("-->") if (commentEnd >= 0): # end of multiline comment: line = line[commentEnd+3:] #print line inComment = False else: # stay inside multiline comment: #print "ignore: ", line continue commentBeg = line.find("",commentBeg) if (commentEnd >= 0): # comment in one line: line = line[0:commentBeg] + line[commentEnd+3:] #print line else: # begin of multiline comment: line = line[0:commentBeg] inComment = True # extract and check labels: match = re.search('&([^;"<]*);', line) if match: label = match.group(1) #print " " + label checkLabel(label,filename) match = re.search('[csn]\.getString *\("([^;"]*)"', line) if match: label = match.group(1) #print " " + label checkProperty(label,filename) matches = re.findall('EnigGetString *\("([^;"]*)"', line) for label in matches: #print " " + label checkProperty(label,filename) matches = re.findall("EnigGetString *\('([^;']*)'", line) for label in matches: #print " " + label checkProperty(label,filename) matches = re.findall('\.onError *\("([^;"]*)"', line) for label in matches: #print " " + label checkProperty(label,filename) def checkJS (filename): #print "----------------------------------------" print(" checkJS() " + filename) global allLines allLines += open(filename, 'r').read() inComment = False for line in open(filename, 'r'): # process comments # - can't deal with multiple comments in one line if inComment: commentEnd = line.find("*/") if (commentEnd >= 0): # end of multiline comment: line = line[commentEnd+2:] #print line inComment = False else: # stay inside multiline comment: #print "ignore: ", line continue commentBeg = line.find("/*") if commentBeg >= 0: #print line commentEnd = line.find("*/",commentBeg) if (commentEnd >= 0): # comment in one line: line = line[0:commentBeg] + line[commentEnd+3:] #print line else: # begin of multiline comment: line = line[0:commentBeg] inComment = True commentBeg = line.find("//") if commentBeg >= 0: line = line[0:commentBeg] # extract and check labels: matches = re.findall('\.getString *\("([^;"]*)"', line) for label in matches: #print " " + label checkProperty(label,filename) matches = re.findall("\.getString *\('([^;']*)'", line) for label in matches: #print " " + label checkProperty(label,filename) matches = re.findall('EnigGetString *\("([^;"]*)"', line) for label in matches: #print " " + label checkProperty(label,filename) matches = re.findall("EnigGetString *\('([^;']*)'", line) for label in matches: #print " " + label checkProperty(label,filename) matches = re.findall('\.onError *\("([^;"]*)"', line) for label in matches: #print " " + label checkProperty(label,filename) def checkHTML (filename): # print "----------------------------------------" print(" checkHTML() " + filename) global allLines allLines += open(filename, 'r').read() inComment = False for line in open(filename, 'r'): # process comments # - can't deal with multiple comments in one line if inComment: commentEnd = line.find("-->") if (commentEnd >= 0): # end of multiline comment: line = line[commentEnd+3:] #print line inComment = False else: # stay inside multiline comment: #print "ignore: ", line continue commentBeg = line.find("",commentBeg) if (commentEnd >= 0): # comment in one line: line = line[0:commentBeg] + line[commentEnd+3:] #print line else: # begin of multiline comment: line = line[0:commentBeg] inComment = True # extract and check labels: matches = re.findall('txtId *= *"([^;"]*)"', line) for label in matches: #print " " + label checkProperty(label,filename) def checkAllXULFiles(): # check XUL files: path = os.path.join(root) for path, dirs, files in os.walk(path): for name in files: #if name.endswith(".xul"): if name.endswith(".xul"): filename = os.path.join(path,name) checkXUL(filename) def checkAllJSFiles(): # check JS/JSM files: path = os.path.join(root) for path, dirs, files in os.walk(path): if str(path).find("build") < 0: for name in files: if name.endswith(".js") or name.endswith(".jsm"): filename = os.path.join(path,name) checkJS(filename) def checkAllHtmlFiles(): # check HTML files: path = os.path.join(root,"ui","content") for path, dirs, files in os.walk(path): for name in files: #if name.endswith(".html"): if name.endswith(".html"): filename = os.path.join(path,name) checkHTML(filename) def processLabelResults(): # Labels: knownLabelBugs=0 if len(allMissingLabels) != knownLabelBugs: print("") print("All Missing Labels:") print("===================") for missing in allMissingLabels: print(" ", missing[0], " (defined in " + missing[1] + ")") print("missing ", len(allMissingLabels), "out of", numLabels, "labels") sys.exit(1) else: #print "all", numLabels, "labels (except the", knownLabelBugs, "standard errors) are defined" print("all", numLabels, "labels usages are defined") # Properties: knownPropBugs=0 if len(allMissingProps) != knownPropBugs: print("") print("All Missing Properties:") print("=======================") for missing in allMissingProps: print(" ", missing[0], " (defined in " + missing[1] + ")") print("missing ", len(allMissingProps), "out of", numProps, "properties") sys.exit(1) else: #print "all", numProps, "properties (except the", knownPropBugs, "standard errors) are defined" print("all", numProps, "property usages are defined") unusedFile = open('unused.txt',"w") print("") print("=============================================") print("dtdLabels: ", len(dtdLabels)) print("found Labels: ", len(allFoundLabels)) unusedFile.write('unused labels:\n') numUnusedLabels=0 for label in dtdLabels: if not label in allFoundLabels: #print " ", label if allLines.find(label) >= 0: print("false positive (or correct because in comment)?: ", label) else: numUnusedLabels += 1 unusedFile.write(' '+label+'\n') print("unused labels in 'unused.txt'") print("") print("=============================================") print("propLabels: ", len(propLabels)) print("found Props: ", len(allFoundProps)) unusedFile.write('\nunused properties:\n') numUnusedProps=0 for label in propLabels: # ignore "keyAlgorithm_..." if label.find("keyAlgorithm_") == 0: continue # ignore "errorType..." if label.find("errorType") == 0: continue if not label in allFoundProps: #print " ", label if allLines.find(label) >= 0: print("false positive (or correct because in comment)?: ", label) else: numUnusedProps += 1 unusedFile.write(' '+label+'\n') print("unused props in 'unused.txt'") print("") print("=============================================") print("dtdLabels: ", len(dtdLabels)) print("found Labels: ", len(allFoundLabels)) print("UNUSED Labels: ", numUnusedLabels, " (after double check)") print("=============================================") print("propLabels: ", len(propLabels)) print("found Props: ", len(allFoundProps)) print("UNUSED Props: ", numUnusedProps, " (after double check)") #--------------------------------------------- # check icons #--------------------------------------------- # return all rows in CSS files that should be equal def checkCSS (filename): #print "----------------------------------------" print(" checkCSS " + filename) response = [] for line in open(filename, 'r'): # grep status-bar and list-style-image rows # extract and check labels: match = re.search('#enigmail-status-bar.*{', line) if match: row = match.group() #print " " + row response += [row.strip().replace(' ','')] match = re.search('list-style-image.*enig[ES].*;', line) if match: row = match.group() #print " " + row response += [row.strip().replace(' ','')] return response def checkAllCSSFiles (): # reference is classic/enigmail.css: classicCSS = os.path.join(root,"ui","skin","classic","enigmail.css") rows = checkCSS (classicCSS) #print "-----------" #print rows #print "-----------" # other CSS files: otherFiles = [ os.path.join(root,"ui","skin","classic-seamonkey","enigmail.css"), os.path.join(root,"ui","skin","classic","enigmail-aero.css"), os.path.join(root,"ui","skin","modern","enigmail.css"), os.path.join(root,"ui","skin","tb-linux","enigmail.css"), os.path.join(root,"ui","skin","tb-mac","enigmail.css"), ]; # find critical differences between CSS files: for file in otherFiles: otherRows = checkCSS (file) if rows != otherRows: if len(rows) > len(otherRows): print("ERROR:") else: print("WARNING:") print(" icon entries in ") print(" ", classicCSS) print(" and") print(" ", file) print(" differ") print(" first differences:") diffs = 0; for i in range(0,min(len(rows),len(otherRows))): #print "-------" #print rows[i] #print otherRows[i] if rows[i] != otherRows[i]: diffs += 1 # this difference is OK: if rows[i].find("enigmail-settings.png") and otherRows[i].find("enigmail-send.png"): continue print(rows[i]) print(otherRows[i]) if diffs > 10: print("...") print("ERROR => ABORT") sys.exit(1) if diffs > 10: print("ERROR => ABORT") sys.exit(1) for i in range(min(len(rows),len(otherRows)),max(len(rows),len(otherRows))): if i >= len(rows): print(" only in", file + ":") print(" " + otherRows[i]) # this is NOT an error elif i >= len(otherRows): print(" only in", classicCSS + ":") print(" " + rows[i]) print("ERROR => ABORT") sys.exit(1) #--------------------------------------------- # main() #--------------------------------------------- # after inits on top... print("") checkAllXULFiles() print("") checkAllJSFiles() print("") checkAllHtmlFiles() print("") processLabelResults() print("") #checkAllCSSFiles() enigmail-2.0.8/util/fixlang.pl000077500000000000000000000072241334302754500162660ustar00rootroot00000000000000#!/usr/bin/perl # check for missing entries in language specific dtd and properties files # and add the english default for them sub trim { # ($str) my $str = @_[0]; $str =~ s/\s*$//; $str =~ s/^\s*//; return $str; } # Load DTD file sub loaddtd { # ($file) my $file = @_[0]; #print "+ Loading $file\n"; my $tab={}; my $line=0; my $fic; my $ind; my $val; open($fic, $file) || die "Could not open $file"; my $prev=0; while (<$fic>) { my $buf = $_; ++$line; $buf =~ s/\n//; $buf =~ s/\r//; if (length(trim($buf)) == 0) { #print "+ empty\n"; } elsif ($buf =~ /^$'/i) { #print "+ comment\n"; } elsif ($buf =~ /^\s*$'/i) { #print "empty string $1\n"; next; } elsif ($buf =~ /^\s*$'/i) { $ind=trim($1); #print "+ Line '$ind'\n"; $val=$2; if ($ind eq "enigmail.ruleEmail.tooltip" || $ind eq "enigmail.searchForKey.example" || $ind eq "enigmail.noHushMailSupport.label" || $ind eq "enigmail.noHushMailSupport.tooltip") { $val =~ s/\/>/g; } $tab->{$ind} = "$1\"$val\">"; $prev=0; } elsif ($buf =~ /^{$ind} = "$1\"$2"; $prev=$ind; } elsif ($prev && $buf =~ /^(.*)">$/) { #print "+ End '$prev'\n"; $tab->{$prev} .= "\n$1\">"; $prev=0; } elsif ($prev) { #print "+ Cont. '$prev'\n"; $tab->{$prev} .= "\n$buf"; } else { die ("- in $file on line $line: unknown ($buf). ABORT!\n"); } } close($fic); return $tab; } # Load properties file sub loadprop { # ($file) my $file = @_[0]; #print "+ Loading $file\n"; my $tab={}; my $fic; my $ind; open($fic, $file) || die "Could not open $file"; while (<$fic>) { my $buf = $_; $buf =~ s/\n//; $buf =~ s/\r//; if (length(trim($buf)) == 0) { #print "+ empty\n"; } elsif ($buf =~ /^\s*#/) { #print "+ comments\n"; } elsif ($buf =~ /^\s*([A-Za-z0-9._]+)\s*=\s*(.*)/) { #print "+ Value '$1'\n"; $ind=trim($1); $tab->{$ind} = "$1=$2"; } else { print ("\tIgnored ($buf) !\n"); } } return $tab; } ($#ARGV > 0) || die ("usage fixlang.pl fromdir destdir\n fromdir: original en-US locale directory\n destdir: locale lanugage dir\n"); my $from=$ARGV[0]; my $dest=$ARGV[1]; (-f "$from/enigmail.dtd") || die ("$from/enigmail.dtd not found\n"); (-f "$dest/enigmail.dtd") || die ("$dest/enigmail.dtd not found\n"); (-f "$from/enigmail.properties") || die ("$from/enigmail.properties not found\n"); (-f "$dest/enigmail.properties") || die ("$dest/enigmail.properties not found\n"); my $endtd = loaddtd("$from/enigmail.dtd"); my $frdtd = loaddtd("$dest/enigmail.dtd"); print "+ Writing $dest/enigmail.dtd\n"; open(OUT, ">$dest/enigmail.dtd.gen") || die "Cannot write to $dest/enigmail.dtd"; for my $ind (sort keys %$endtd) { if ($frdtd->{$ind}) { print OUT "{$ind}\n"; } else { # print "\tAdding missing $ind\n"; print OUT "{$ind}\n"; } } close(OUT); my $enprop = loadprop("$from/enigmail.properties"); my $frprop = loadprop("$dest/enigmail.properties"); print "+ Writing $dest/enigmail.properties\n"; open(OUT, ">$dest/enigmail.properties.gen") || die "Cannot write to $dest/enigmail.properties"; for my $ind (sort keys %$enprop) { if ($frprop->{$ind}) { print OUT "$frprop->{$ind}\n"; } else { #print "\tAdding missing $ind\n"; print OUT "$enprop->{$ind}\n"; } } close(OUT); enigmail-2.0.8/util/genxpi000077500000000000000000000111551334302754500155140ustar00rootroot00000000000000#!/bin/sh # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. # # This script generates the Enigmail XPI # echo "genxpi: Generating $1 in $3" if [ $# -lt 5 ]; then echo "Wrong number of parameters" exit 1 fi xpiFile=$1 xpiVersion="$2" distDir="$3" srcDir=$4 xpiModule=$5 enableLang=$6 cd ${srcDir} cwd=`pwd` cd "$distDir" targetDir=`pwd` cd "$cwd" cp ${srcDir}/package/install.rdf ${targetDir}/install.rdf cp ${srcDir}/package/bootstrap.js ${targetDir}/bootstrap.js # Prepare chrome.manifest cat ${srcDir}/package/chrome.manifest \ > ${targetDir}/chrome.manifest # Prepare languages other than en-US if [ "$enableLang" = "yes" ]; then if [ -s ${srcDir}/lang/current-languages.txt ]; then echo '' >> ${targetDir}/chrome.manifest echo '# Additional languages' >> ${targetDir}/chrome.manifest for lang in `cat ${srcDir}/lang/current-languages.txt`; do echo 'locale enigmail '$lang' chrome/locale/'$lang'/' >> ${targetDir}/chrome.manifest done fi fi cd "$targetDir" find modules -name "*.js*" | LC_ALL=C sort > modules/all-modules.txt echo "Creating ${xpiFile} file" zip -9 --must-match\ ../${xpiFile} \ modules/preferences/defaultPrefs.js \ modules/addrbook.jsm \ modules/amPrefsService.jsm \ modules/app.jsm \ modules/armor.jsm \ modules/attachment.jsm \ modules/autocrypt.jsm \ modules/buildDate.jsm \ modules/card.jsm \ modules/clipboard.jsm \ modules/commandLine.jsm \ modules/configure.jsm \ modules/constants.jsm \ modules/data.jsm \ modules/decryption.jsm \ modules/persistentCrypto.jsm \ modules/dialog.jsm \ modules/encryption.jsm \ modules/core.jsm \ modules/configBackup.jsm \ modules/errorHandling.jsm \ modules/funcs.jsm \ modules/gpgAgent.jsm \ modules/protocolHandler.jsm \ modules/events.jsm \ modules/execution.jsm \ modules/files.jsm \ modules/filters.jsm \ modules/filtersWrapper.jsm \ modules/fixExchangeMsg.jsm \ modules/glodaMime.jsm \ modules/glodaUtils.jsm \ modules/gpg.jsm \ modules/hash.jsm \ modules/httpProxy.jsm \ modules/installGnuPG.jsm \ modules/installPep.jsm \ modules/key.jsm \ modules/keyEditor.jsm \ modules/keyRing.jsm \ modules/keyUsability.jsm \ modules/keyRefreshService.jsm \ modules/keyserver.jsm \ modules/keyserverUris.jsm \ modules/lazy.jsm \ modules/locale.jsm \ modules/localizeHtml.jsm \ modules/log.jsm \ modules/mime.jsm \ modules/mimeDecrypt.jsm \ modules/mimeEncrypt.jsm \ modules/mimeVerify.jsm \ modules/msgCompFields.jsm \ modules/msgRead.jsm \ modules/os.jsm \ modules/openpgp.jsm \ modules/overlays.jsm \ modules/passwordCheck.jsm \ modules/passwords.jsm \ modules/pEp.jsm \ modules/pEpAdapter.jsm \ modules/pEpDecrypt.jsm \ modules/pEpFilter.jsm \ modules/pEpListener.jsm \ modules/pEpKeySync.jsm \ modules/pgpmimeHandler.jsm \ modules/pipeConsole.jsm \ modules/prefs.jsm \ modules/rng.jsm \ modules/rules.jsm \ modules/send.jsm \ modules/singletons.jsm \ modules/socks5Proxy.jsm \ modules/stdlib/compose.jsm \ modules/stdlib/misc.jsm \ modules/stdlib/msgHdrUtils.jsm \ modules/stdlib/openpgp-lib.js \ modules/stdlib/openpgp.worker.min.js \ modules/stdlib.jsm \ modules/streams.jsm \ modules/subprocess.jsm \ modules/enigmailprocess_shared_unix.js \ modules/enigmailprocess_worker_common.js \ modules/enigmailprocess_common.jsm \ modules/enigmailprocess_shared_win.js \ modules/enigmailprocess_worker_unix.js \ modules/enigmailprocess_main.jsm \ modules/enigmailprocess_unix.jsm \ modules/enigmailprocess_worker_win.js \ modules/enigmailprocess_shared.js \ modules/enigmailprocess_win.jsm \ modules/system.jsm \ modules/time.jsm \ modules/timer.jsm \ modules/tor.jsm \ modules/trust.jsm \ modules/uris.jsm \ modules/verify.jsm \ modules/versioning.jsm \ modules/webKey.jsm \ modules/wkdLookup.jsm \ modules/windows.jsm \ modules/wksMimeHandler.jsm \ modules/zbase32.jsm \ modules/all-modules.txt \ chrome/content/*.* \ chrome/skin/aero/*.* \ chrome/skin/modern/*.* \ chrome/skin/tb-mac/*.* \ chrome/skin/classic-seamonkey/*.* \ chrome/skin/tb-linux/*.* \ chrome/skin/tb-win-xp/*.* \ chrome/locale/*/*.* \ chrome/locale/*/help/*.* \ bootstrap.js \ chrome.manifest \ install.rdf enigmail-2.0.8/util/header.py000066400000000000000000000424461334302754500161050ustar00rootroot00000000000000#!/usr/bin/env python # header.py - Generate C++ header files from IDL. # # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. """Print a C++ header file for the IDL files specified on the command line""" import sys, os.path, re, xpidl, itertools, glob printdoccomments = False if printdoccomments: def printComments(fd, clist, indent): for c in clist: fd.write("%s%s\n" % (indent, c)) else: def printComments(fd, clist, indent): pass def firstCap(str): return str[0].upper() + str[1:] def attributeParamName(a): return "a" + firstCap(a.name) def attributeParamNames(a): l = [attributeParamName(a)] if a.implicit_jscontext: l.insert(0, "cx") return ", ".join(l) def attributeNativeName(a, getter): binaryname = a.binaryname is not None and a.binaryname or firstCap(a.name) return "%s%s" % (getter and 'Get' or 'Set', binaryname) def attributeReturnType(a, macro): """macro should be NS_IMETHOD or NS_IMETHODIMP""" if (a.nostdcall): return macro == "NS_IMETHOD" and "virtual nsresult" or "nsresult" else: return macro def attributeParamlist(a, getter): l = ["%s%s" % (a.realtype.nativeType(getter and 'out' or 'in'), attributeParamName(a))] if a.implicit_jscontext: l.insert(0, "JSContext* cx") return ", ".join(l) def attributeAsNative(a, getter): deprecated = a.deprecated and "NS_DEPRECATED " or "" params = {'deprecated': deprecated, 'returntype': attributeReturnType(a, 'NS_IMETHOD'), 'binaryname': attributeNativeName(a, getter), 'paramlist': attributeParamlist(a, getter)} return "%(deprecated)s%(returntype)s %(binaryname)s(%(paramlist)s)" % params def methodNativeName(m): return m.binaryname is not None and m.binaryname or firstCap(m.name) def methodReturnType(m, macro): """macro should be NS_IMETHOD or NS_IMETHODIMP""" if m.nostdcall and m.notxpcom: return "%s%s" % (macro == "NS_IMETHOD" and "virtual " or "", m.realtype.nativeType('in').strip()) elif m.nostdcall: return "%snsresult" % (macro == "NS_IMETHOD" and "virtual " or "") elif m.notxpcom: return "%s_(%s)" % (macro, m.realtype.nativeType('in').strip()) else: return macro def methodAsNative(m): return "%s %s(%s)" % (methodReturnType(m, 'NS_IMETHOD'), methodNativeName(m), paramlistAsNative(m)) def paramlistAsNative(m, empty='void'): l = [paramAsNative(p) for p in m.params] if m.implicit_jscontext: l.append("JSContext* cx") if m.optional_argc: l.append('uint8_t _argc') if not m.notxpcom and m.realtype.name != 'void': l.append(paramAsNative(xpidl.Param(paramtype='out', type=None, name='_retval', attlist=[], location=None, realtype=m.realtype))) if len(l) == 0: return empty return ", ".join(l) def paramAsNative(p): return "%s%s" % (p.nativeType(), p.name) def paramlistNames(m): names = [p.name for p in m.params] if m.implicit_jscontext: names.append('cx') if m.optional_argc: names.append('_argc') if not m.notxpcom and m.realtype.name != 'void': names.append('_retval') if len(names) == 0: return '' return ', '.join(names) header = """/* * DO NOT EDIT. THIS FILE IS GENERATED FROM %(filename)s */ #ifndef __gen_%(basename)s_h__ #define __gen_%(basename)s_h__ """ include = """ #ifndef __gen_%(basename)s_h__ #include "%(basename)s.h" #endif """ jsvalue_include = """ #include "js/Value.h" """ infallible_includes = """ #include "mozilla/Assertions.h" #include "mozilla/DebugOnly.h" """ header_end = """/* For IDL files that don't want to include root IDL files. */ #ifndef NS_NO_VTABLE #define NS_NO_VTABLE #endif """ footer = """ #endif /* __gen_%(basename)s_h__ */ """ forward_decl = """class %(name)s; /* forward declaration */ """ def idl_basename(f): """returns the base name of a file with the last extension stripped""" return os.path.basename(f).rpartition('.')[0] def print_header(idl, fd, filename): fd.write(header % {'filename': filename, 'basename': idl_basename(filename)}) foundinc = False for inc in idl.includes(): if not foundinc: foundinc = True fd.write('\n') fd.write(include % {'basename': idl_basename(inc.filename)}) if idl.needsJSTypes(): fd.write(jsvalue_include) # Include some extra files if any attributes are infallible. for iface in [p for p in idl.productions if p.kind == 'interface']: for attr in [m for m in iface.members if isinstance(m, xpidl.Attribute)]: if attr.infallible: fd.write(infallible_includes) break fd.write('\n') fd.write(header_end) for p in idl.productions: if p.kind == 'include': continue if p.kind == 'cdata': fd.write(p.data) continue if p.kind == 'forward': fd.write(forward_decl % {'name': p.name}) continue if p.kind == 'interface': write_interface(p, fd) continue if p.kind == 'typedef': printComments(fd, p.doccomments, '') fd.write("typedef %s %s;\n\n" % (p.realtype.nativeType('in'), p.name)) fd.write(footer % {'basename': idl_basename(filename)}) iface_header = r""" /* starting interface: %(name)s */ #define %(defname)s_IID_STR "%(iid)s" #define %(defname)s_IID \ {0x%(m0)s, 0x%(m1)s, 0x%(m2)s, \ { %(m3joined)s }} """ uuid_decoder = re.compile(r"""(?P[a-f0-9]{8})- (?P[a-f0-9]{4})- (?P[a-f0-9]{4})- (?P[a-f0-9]{4})- (?P[a-f0-9]{12})$""", re.X) iface_prolog = """ { public: NS_DECLARE_STATIC_IID_ACCESSOR(%(defname)s_IID) """ iface_epilog = """}; NS_DEFINE_STATIC_IID_ACCESSOR(%(name)s, %(defname)s_IID) /* Use this macro when declaring classes that implement this interface. */ #define NS_DECL_%(macroname)s """ iface_forward = """ /* Use this macro to declare functions that forward the behavior of this interface to another object. */ #define NS_FORWARD_%(macroname)s(_to) """ iface_forward_safe = """ /* Use this macro to declare functions that forward the behavior of this interface to another object in a safe way. */ #define NS_FORWARD_SAFE_%(macroname)s(_to) """ iface_template_prolog = """ #if 0 /* Use the code below as a template for the implementation class for this interface. */ /* Header file */ class %(implclass)s : public %(name)s { public: NS_DECL_ISUPPORTS NS_DECL_%(macroname)s %(implclass)s(); private: ~%(implclass)s(); protected: /* additional members */ }; /* Implementation file */ NS_IMPL_ISUPPORTS(%(implclass)s, %(name)s) %(implclass)s::%(implclass)s() { /* member initializers and constructor code */ } %(implclass)s::~%(implclass)s() { /* destructor code */ } """ example_tmpl = """%(returntype)s %(implclass)s::%(nativeName)s(%(paramList)s) { return NS_ERROR_NOT_IMPLEMENTED; } """ iface_template_epilog = """/* End of implementation class template. */ #endif """ attr_infallible_tmpl = """\ inline %(realtype)s%(nativename)s(%(args)s) { %(realtype)sresult; mozilla::DebugOnly rv = %(nativename)s(%(argnames)s&result); MOZ_ASSERT(NS_SUCCEEDED(rv)); return result; } """ def write_interface(iface, fd): if iface.namemap is None: raise Exception("Interface was not resolved.") def write_const_decls(g): fd.write(" enum {\n") enums = [] for c in g: printComments(fd, c.doccomments, ' ') basetype = c.basetype value = c.getValue() enums.append(" %(name)s = %(value)s%(signed)s" % { 'name': c.name, 'value': value, 'signed': (not basetype.signed) and 'U' or ''}) fd.write(",\n".join(enums)) fd.write("\n };\n\n") def write_method_decl(m): printComments(fd, m.doccomments, ' ') fd.write(" /* %s */\n" % m.toIDL()) fd.write(" %s = 0;\n\n" % methodAsNative(m)) def write_attr_decl(a): printComments(fd, a.doccomments, ' ') fd.write(" /* %s */\n" % a.toIDL()); fd.write(" %s = 0;\n" % attributeAsNative(a, True)) if a.infallible: fd.write(attr_infallible_tmpl % {'realtype': a.realtype.nativeType('in'), 'nativename': attributeNativeName(a, getter=True), 'args': '' if not a.implicit_jscontext else 'JSContext* cx', 'argnames': '' if not a.implicit_jscontext else 'cx, '}) if not a.readonly: fd.write(" %s = 0;\n" % attributeAsNative(a, False)) fd.write("\n") defname = iface.name.upper() if iface.name[0:2] == 'ns': defname = 'NS_' + defname[2:] names = uuid_decoder.match(iface.attributes.uuid).groupdict() m3str = names['m3'] + names['m4'] names['m3joined'] = ", ".join(["0x%s" % m3str[i:i+2] for i in xrange(0, 16, 2)]) if iface.name[2] == 'I': implclass = iface.name[:2] + iface.name[3:] else: implclass = '_MYCLASS_' names.update({'defname': defname, 'macroname': iface.name.upper(), 'name': iface.name, 'iid': iface.attributes.uuid, 'implclass': implclass}) fd.write(iface_header % names) printComments(fd, iface.doccomments, '') fd.write("class ") foundcdata = False for m in iface.members: if isinstance(m, xpidl.CDATA): foundcdata = True if not foundcdata: fd.write("NS_NO_VTABLE ") if iface.attributes.deprecated: fd.write("MOZ_DEPRECATED ") fd.write(iface.name) if iface.base: fd.write(" : public %s" % iface.base) fd.write(iface_prolog % names) for key, group in itertools.groupby(iface.members, key=type): if key == xpidl.ConstMember: write_const_decls(group) # iterator of all the consts else: for member in group: if key == xpidl.Attribute: write_attr_decl(member) elif key == xpidl.Method: write_method_decl(member) elif key == xpidl.CDATA: fd.write(" %s" % member.data) else: raise Exception("Unexpected interface member: %s" % member) fd.write(iface_epilog % names) for member in iface.members: if isinstance(member, xpidl.Attribute): fd.write("\\\n %s; " % attributeAsNative(member, True)) if not member.readonly: fd.write("\\\n %s; " % attributeAsNative(member, False)) elif isinstance(member, xpidl.Method): fd.write("\\\n %s; " % methodAsNative(member)) if len(iface.members) == 0: fd.write('\\\n /* no methods! */') elif not member.kind in ('attribute', 'method'): fd.write('\\') fd.write(iface_forward % names) def emitTemplate(tmpl, tmpl_notxpcom=None): if tmpl_notxpcom == None: tmpl_notxpcom = tmpl for member in iface.members: if isinstance(member, xpidl.Attribute): fd.write(tmpl % {'asNative': attributeAsNative(member, True), 'nativeName': attributeNativeName(member, True), 'paramList': attributeParamNames(member)}) if not member.readonly: fd.write(tmpl % {'asNative': attributeAsNative(member, False), 'nativeName': attributeNativeName(member, False), 'paramList': attributeParamNames(member)}) elif isinstance(member, xpidl.Method): if member.notxpcom: fd.write(tmpl_notxpcom % {'asNative': methodAsNative(member), 'nativeName': methodNativeName(member), 'paramList': paramlistNames(member)}) else: fd.write(tmpl % {'asNative': methodAsNative(member), 'nativeName': methodNativeName(member), 'paramList': paramlistNames(member)}) if len(iface.members) == 0: fd.write('\\\n /* no methods! */') elif not member.kind in ('attribute', 'method'): fd.write('\\') emitTemplate("\\\n %(asNative)s { return _to %(nativeName)s(%(paramList)s); } ") fd.write(iface_forward_safe % names) # Don't try to safely forward notxpcom functions, because we have no # sensible default error return. Instead, the caller will have to # implement them. emitTemplate("\\\n %(asNative)s { return !_to ? NS_ERROR_NULL_POINTER : _to->%(nativeName)s(%(paramList)s); } ", "\\\n %(asNative)s; ") fd.write(iface_template_prolog % names) for member in iface.members: if isinstance(member, xpidl.ConstMember) or isinstance(member, xpidl.CDATA): continue fd.write("/* %s */\n" % member.toIDL()) if isinstance(member, xpidl.Attribute): fd.write(example_tmpl % {'implclass': implclass, 'returntype': attributeReturnType(member, 'NS_IMETHODIMP'), 'nativeName': attributeNativeName(member, True), 'paramList': attributeParamlist(member, True)}) if not member.readonly: fd.write(example_tmpl % {'implclass': implclass, 'returntype': attributeReturnType(member, 'NS_IMETHODIMP'), 'nativeName': attributeNativeName(member, False), 'paramList': attributeParamlist(member, False)}) elif isinstance(member, xpidl.Method): fd.write(example_tmpl % {'implclass': implclass, 'returntype': methodReturnType(member, 'NS_IMETHODIMP'), 'nativeName': methodNativeName(member), 'paramList': paramlistAsNative(member, empty='')}) fd.write('\n') fd.write(iface_template_epilog) if __name__ == '__main__': from optparse import OptionParser o = OptionParser() o.add_option('-I', action='append', dest='incdirs', default=['.'], help="Directory to search for imported files") o.add_option('--cachedir', dest='cachedir', default=None, help="Directory in which to cache lex/parse tables.") o.add_option('-o', dest='outfile', default=None, help="Output file (default is stdout)") o.add_option('-d', dest='depfile', default=None, help="Generate a make dependency file") o.add_option('--regen', action='store_true', dest='regen', default=False, help="Regenerate IDL Parser cache") options, args = o.parse_args() file = args[0] if args else None if options.cachedir is not None: if not os.path.isdir(options.cachedir): os.mkdir(options.cachedir) sys.path.append(options.cachedir) # The only thing special about a regen is that there are no input files. if options.regen: if options.cachedir is None: print >>sys.stderr, "--regen useless without --cachedir" # Delete the lex/yacc files. Ply is too stupid to regenerate them # properly for fileglobs in [os.path.join(options.cachedir, f) for f in ["xpidllex.py*", "xpidlyacc.py*"]]: for filename in glob.glob(fileglobs): os.remove(filename) # Instantiate the parser. p = xpidl.IDLParser(outputdir=options.cachedir) if options.regen: sys.exit(0) if options.depfile is not None and options.outfile is None: print >>sys.stderr, "-d requires -o" sys.exit(1) if options.outfile is not None: outfd = open(options.outfile, 'w') closeoutfd = True else: outfd = sys.stdout closeoutfd = False idl = p.parse(open(file).read(), filename=file) idl.resolve(options.incdirs, p) print_header(idl, outfd, file) if closeoutfd: outfd.close() if options.depfile is not None: dirname = os.path.dirname(options.depfile) if dirname: try: os.makedirs(dirname) except: pass depfd = open(options.depfile, 'w') deps = [dep.replace('\\', '/') for dep in idl.deps] print >>depfd, "%s: %s" % (options.outfile, " ".join(deps)) for dep in deps: print >>depfd, "%s:" % dep enigmail-2.0.8/util/install000077500000000000000000000020211334302754500156600ustar00rootroot00000000000000#!/bin/sh # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. # install files at a target place # # usage: # install [ -m xxx] [-u] target_dir source_files ... # # -m exec mode of files # -u uninstall # files TARGETMODE="" INSTALLMODE="i" if [ "$1" = "-m" ]; then TARGETMODE=$2 shift 2 fi if [ "$1" = "-u" ]; then INSTALLMODE="u" shift fi TARGETDIR=$1 mkdir -p ${TARGETDIR} shift while [ $# -gt 0 ]; do SRCFILE=$1 BASEFILE=$(basename $1) if [ $INSTALLMODE = "i" ]; then if [ ! -f ${TARGETDIR}/${BASEFILE} ] || [ ${SRCFILE} -nt ${TARGETDIR}/${BASEFILE} ]; then # install file if newer than existing file cp ${SRCFILE} ${TARGETDIR}/${BASEFILE} || exit 1 if [ "$TARGETMODE" != "" ]; then chmod $TARGETMODE ${TARGETDIR}/${BASEFILE} || exit 1 fi fi else # uninstall files rm -f ${TARGETDIR}/${BASEFILE} fi shift done enigmail-2.0.8/util/make-lang-xpi.pl000066400000000000000000000025241334302754500172630ustar00rootroot00000000000000#!/usr/bin/perl # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. # # generate jar.mn from a list of language packs # sub usage() { print "Usage: make-lang-xpi.pl [-ng] \n"; } if (@ARGV != 2 && @ARGV != 3) { usage(); exit -1; } my $useGen = "+"; my ($inputfile, $outdir); if ($ARGV[0] eq "-ng") { ($useGen, $inputfile, $outdir)= @ARGV; } else { ($inputfile, $outdir) = @ARGV; } open INFILE, "$inputfile"; open OUTFILE, ">$outdir/jar.mn"; print OUTFILE "chrome.jar:\n"; my @genFiles = ( "enigmail.properties", "enigmail.dtd" ); my @files = ( "am-enigprefs.properties", "help/compose.html", "help/editRcptRule.html", "help/messenger.html", "help/rulesEditor.html", "help/sendingPrefs.html", ); while ($_ = ) { #print STDERR $_; chomp(); $lang = $_; foreach $file (@genFiles) { if ($useGen eq "+") { printf OUTFILE "\tlocale/%s/%s\t(%s/%s.gen)\n", $lang, $file, $lang, $file; } else { printf OUTFILE "\tlocale/%s/%s\t(%s/%s)\n", $lang, $file, $lang, $file; } } foreach $file (@files) { printf OUTFILE "\tlocale/%s/%s\t(%s/%s)\n", $lang, $file, $lang, $file; } } close INFILE; close OUTFILE; enigmail-2.0.8/util/ply/000077500000000000000000000000001334302754500150755ustar00rootroot00000000000000enigmail-2.0.8/util/ply/__init__.py000066400000000000000000000001221334302754500172010ustar00rootroot00000000000000# PLY package # Author: David Beazley (dave@dabeaz.com) __all__ = ['lex','yacc'] enigmail-2.0.8/util/ply/lex.py000066400000000000000000001174431334302754500162510ustar00rootroot00000000000000# ----------------------------------------------------------------------------- # ply: lex.py # # Copyright (C) 2001-2009, # David M. Beazley (Dabeaz LLC) # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # * Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # * Neither the name of the David Beazley or Dabeaz LLC may be used to # endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # ----------------------------------------------------------------------------- __version__ = "3.3" __tabversion__ = "3.2" # Version of table file used import re, sys, types, copy, os # This tuple contains known string types try: # Python 2.6 StringTypes = (types.StringType, types.UnicodeType) except AttributeError: # Python 3.0 StringTypes = (str, bytes) # Extract the code attribute of a function. Different implementations # are for Python 2/3 compatibility. if sys.version_info[0] < 3: def func_code(f): return f.func_code else: def func_code(f): return f.__code__ # This regular expression is used to match valid token names _is_identifier = re.compile(r'^[a-zA-Z0-9_]+$') # Exception thrown when invalid token encountered and no default error # handler is defined. class LexError(Exception): def __init__(self,message,s): self.args = (message,) self.text = s # Token class. This class is used to represent the tokens produced. class LexToken(object): def __str__(self): return "LexToken(%s,%r,%d,%d)" % (self.type,self.value,self.lineno,self.lexpos) def __repr__(self): return str(self) # This object is a stand-in for a logging object created by the # logging module. class PlyLogger(object): def __init__(self,f): self.f = f def critical(self,msg,*args,**kwargs): self.f.write((msg % args) + "\n") def warning(self,msg,*args,**kwargs): self.f.write("WARNING: "+ (msg % args) + "\n") def error(self,msg,*args,**kwargs): self.f.write("ERROR: " + (msg % args) + "\n") info = critical debug = critical # Null logger is used when no output is generated. Does nothing. class NullLogger(object): def __getattribute__(self,name): return self def __call__(self,*args,**kwargs): return self # ----------------------------------------------------------------------------- # === Lexing Engine === # # The following Lexer class implements the lexer runtime. There are only # a few public methods and attributes: # # input() - Store a new string in the lexer # token() - Get the next token # clone() - Clone the lexer # # lineno - Current line number # lexpos - Current position in the input string # ----------------------------------------------------------------------------- class Lexer: def __init__(self): self.lexre = None # Master regular expression. This is a list of # tuples (re,findex) where re is a compiled # regular expression and findex is a list # mapping regex group numbers to rules self.lexretext = None # Current regular expression strings self.lexstatere = {} # Dictionary mapping lexer states to master regexs self.lexstateretext = {} # Dictionary mapping lexer states to regex strings self.lexstaterenames = {} # Dictionary mapping lexer states to symbol names self.lexstate = "INITIAL" # Current lexer state self.lexstatestack = [] # Stack of lexer states self.lexstateinfo = None # State information self.lexstateignore = {} # Dictionary of ignored characters for each state self.lexstateerrorf = {} # Dictionary of error functions for each state self.lexreflags = 0 # Optional re compile flags self.lexdata = None # Actual input data (as a string) self.lexpos = 0 # Current position in input text self.lexlen = 0 # Length of the input text self.lexerrorf = None # Error rule (if any) self.lextokens = None # List of valid tokens self.lexignore = "" # Ignored characters self.lexliterals = "" # Literal characters that can be passed through self.lexmodule = None # Module self.lineno = 1 # Current line number self.lexoptimize = 0 # Optimized mode def clone(self,object=None): c = copy.copy(self) # If the object parameter has been supplied, it means we are attaching the # lexer to a new object. In this case, we have to rebind all methods in # the lexstatere and lexstateerrorf tables. if object: newtab = { } for key, ritem in self.lexstatere.items(): newre = [] for cre, findex in ritem: newfindex = [] for f in findex: if not f or not f[0]: newfindex.append(f) continue newfindex.append((getattr(object,f[0].__name__),f[1])) newre.append((cre,newfindex)) newtab[key] = newre c.lexstatere = newtab c.lexstateerrorf = { } for key, ef in self.lexstateerrorf.items(): c.lexstateerrorf[key] = getattr(object,ef.__name__) c.lexmodule = object return c # ------------------------------------------------------------ # writetab() - Write lexer information to a table file # ------------------------------------------------------------ def writetab(self,tabfile,outputdir=""): if isinstance(tabfile,types.ModuleType): return basetabfilename = tabfile.split(".")[-1] filename = os.path.join(outputdir,basetabfilename)+".py" tf = open(filename,"w") tf.write("# %s.py. This file automatically created by PLY (version %s). Don't edit!\n" % (tabfile,__version__)) tf.write("_tabversion = %s\n" % repr(__version__)) tf.write("_lextokens = %s\n" % repr(self.lextokens)) tf.write("_lexreflags = %s\n" % repr(self.lexreflags)) tf.write("_lexliterals = %s\n" % repr(self.lexliterals)) tf.write("_lexstateinfo = %s\n" % repr(self.lexstateinfo)) tabre = { } # Collect all functions in the initial state initial = self.lexstatere["INITIAL"] initialfuncs = [] for part in initial: for f in part[1]: if f and f[0]: initialfuncs.append(f) for key, lre in self.lexstatere.items(): titem = [] for i in range(len(lre)): titem.append((self.lexstateretext[key][i],_funcs_to_names(lre[i][1],self.lexstaterenames[key][i]))) tabre[key] = titem tf.write("_lexstatere = %s\n" % repr(tabre)) tf.write("_lexstateignore = %s\n" % repr(self.lexstateignore)) taberr = { } for key, ef in self.lexstateerrorf.items(): if ef: taberr[key] = ef.__name__ else: taberr[key] = None tf.write("_lexstateerrorf = %s\n" % repr(taberr)) tf.close() # ------------------------------------------------------------ # readtab() - Read lexer information from a tab file # ------------------------------------------------------------ def readtab(self,tabfile,fdict): if isinstance(tabfile,types.ModuleType): lextab = tabfile else: if sys.version_info[0] < 3: exec("import %s as lextab" % tabfile) else: env = { } exec("import %s as lextab" % tabfile, env,env) lextab = env['lextab'] if getattr(lextab,"_tabversion","0.0") != __version__: raise ImportError("Inconsistent PLY version") self.lextokens = lextab._lextokens self.lexreflags = lextab._lexreflags self.lexliterals = lextab._lexliterals self.lexstateinfo = lextab._lexstateinfo self.lexstateignore = lextab._lexstateignore self.lexstatere = { } self.lexstateretext = { } for key,lre in lextab._lexstatere.items(): titem = [] txtitem = [] for i in range(len(lre)): titem.append((re.compile(lre[i][0],lextab._lexreflags | re.VERBOSE),_names_to_funcs(lre[i][1],fdict))) txtitem.append(lre[i][0]) self.lexstatere[key] = titem self.lexstateretext[key] = txtitem self.lexstateerrorf = { } for key,ef in lextab._lexstateerrorf.items(): self.lexstateerrorf[key] = fdict[ef] self.begin('INITIAL') # ------------------------------------------------------------ # input() - Push a new string into the lexer # ------------------------------------------------------------ def input(self,s): # Pull off the first character to see if s looks like a string c = s[:1] if not isinstance(c,StringTypes): raise ValueError("Expected a string") self.lexdata = s self.lexpos = 0 self.lexlen = len(s) # ------------------------------------------------------------ # begin() - Changes the lexing state # ------------------------------------------------------------ def begin(self,state): if not state in self.lexstatere: raise ValueError("Undefined state") self.lexre = self.lexstatere[state] self.lexretext = self.lexstateretext[state] self.lexignore = self.lexstateignore.get(state,"") self.lexerrorf = self.lexstateerrorf.get(state,None) self.lexstate = state # ------------------------------------------------------------ # push_state() - Changes the lexing state and saves old on stack # ------------------------------------------------------------ def push_state(self,state): self.lexstatestack.append(self.lexstate) self.begin(state) # ------------------------------------------------------------ # pop_state() - Restores the previous state # ------------------------------------------------------------ def pop_state(self): self.begin(self.lexstatestack.pop()) # ------------------------------------------------------------ # current_state() - Returns the current lexing state # ------------------------------------------------------------ def current_state(self): return self.lexstate # ------------------------------------------------------------ # skip() - Skip ahead n characters # ------------------------------------------------------------ def skip(self,n): self.lexpos += n # ------------------------------------------------------------ # opttoken() - Return the next token from the Lexer # # Note: This function has been carefully implemented to be as fast # as possible. Don't make changes unless you really know what # you are doing # ------------------------------------------------------------ def token(self): # Make local copies of frequently referenced attributes lexpos = self.lexpos lexlen = self.lexlen lexignore = self.lexignore lexdata = self.lexdata while lexpos < lexlen: # This code provides some short-circuit code for whitespace, tabs, and other ignored characters if lexdata[lexpos] in lexignore: lexpos += 1 continue # Look for a regular expression match for lexre,lexindexfunc in self.lexre: m = lexre.match(lexdata,lexpos) if not m: continue # Create a token for return tok = LexToken() tok.value = m.group() tok.lineno = self.lineno tok.lexpos = lexpos i = m.lastindex func,tok.type = lexindexfunc[i] if not func: # If no token type was set, it's an ignored token if tok.type: self.lexpos = m.end() return tok else: lexpos = m.end() break lexpos = m.end() # If token is processed by a function, call it tok.lexer = self # Set additional attributes useful in token rules self.lexmatch = m self.lexpos = lexpos newtok = func(tok) # Every function must return a token, if nothing, we just move to next token if not newtok: lexpos = self.lexpos # This is here in case user has updated lexpos. lexignore = self.lexignore # This is here in case there was a state change break # Verify type of the token. If not in the token map, raise an error if not self.lexoptimize: if not newtok.type in self.lextokens: raise LexError("%s:%d: Rule '%s' returned an unknown token type '%s'" % ( func_code(func).co_filename, func_code(func).co_firstlineno, func.__name__, newtok.type),lexdata[lexpos:]) return newtok else: # No match, see if in literals if lexdata[lexpos] in self.lexliterals: tok = LexToken() tok.value = lexdata[lexpos] tok.lineno = self.lineno tok.type = tok.value tok.lexpos = lexpos self.lexpos = lexpos + 1 return tok # No match. Call t_error() if defined. if self.lexerrorf: tok = LexToken() tok.value = self.lexdata[lexpos:] tok.lineno = self.lineno tok.type = "error" tok.lexer = self tok.lexpos = lexpos self.lexpos = lexpos newtok = self.lexerrorf(tok) if lexpos == self.lexpos: # Error method didn't change text position at all. This is an error. raise LexError("Scanning error. Illegal character '%s'" % (lexdata[lexpos]), lexdata[lexpos:]) lexpos = self.lexpos if not newtok: continue return newtok self.lexpos = lexpos raise LexError("Illegal character '%s' at index %d" % (lexdata[lexpos],lexpos), lexdata[lexpos:]) self.lexpos = lexpos + 1 if self.lexdata is None: raise RuntimeError("No input string given with input()") return None # Iterator interface def __iter__(self): return self def next(self): t = self.token() if t is None: raise StopIteration return t __next__ = next # ----------------------------------------------------------------------------- # ==== Lex Builder === # # The functions and classes below are used to collect lexing information # and build a Lexer object from it. # ----------------------------------------------------------------------------- # ----------------------------------------------------------------------------- # get_caller_module_dict() # # This function returns a dictionary containing all of the symbols defined within # a caller further down the call stack. This is used to get the environment # associated with the yacc() call if none was provided. # ----------------------------------------------------------------------------- def get_caller_module_dict(levels): try: raise RuntimeError except RuntimeError: e,b,t = sys.exc_info() f = t.tb_frame while levels > 0: f = f.f_back levels -= 1 ldict = f.f_globals.copy() if f.f_globals != f.f_locals: ldict.update(f.f_locals) return ldict # ----------------------------------------------------------------------------- # _funcs_to_names() # # Given a list of regular expression functions, this converts it to a list # suitable for output to a table file # ----------------------------------------------------------------------------- def _funcs_to_names(funclist,namelist): result = [] for f,name in zip(funclist,namelist): if f and f[0]: result.append((name, f[1])) else: result.append(f) return result # ----------------------------------------------------------------------------- # _names_to_funcs() # # Given a list of regular expression function names, this converts it back to # functions. # ----------------------------------------------------------------------------- def _names_to_funcs(namelist,fdict): result = [] for n in namelist: if n and n[0]: result.append((fdict[n[0]],n[1])) else: result.append(n) return result # ----------------------------------------------------------------------------- # _form_master_re() # # This function takes a list of all of the regex components and attempts to # form the master regular expression. Given limitations in the Python re # module, it may be necessary to break the master regex into separate expressions. # ----------------------------------------------------------------------------- def _form_master_re(relist,reflags,ldict,toknames): if not relist: return [] regex = "|".join(relist) try: lexre = re.compile(regex,re.VERBOSE | reflags) # Build the index to function map for the matching engine lexindexfunc = [ None ] * (max(lexre.groupindex.values())+1) lexindexnames = lexindexfunc[:] for f,i in lexre.groupindex.items(): handle = ldict.get(f,None) if type(handle) in (types.FunctionType, types.MethodType): lexindexfunc[i] = (handle,toknames[f]) lexindexnames[i] = f elif handle is not None: lexindexnames[i] = f if f.find("ignore_") > 0: lexindexfunc[i] = (None,None) else: lexindexfunc[i] = (None, toknames[f]) return [(lexre,lexindexfunc)],[regex],[lexindexnames] except Exception: m = int(len(relist)/2) if m == 0: m = 1 llist, lre, lnames = _form_master_re(relist[:m],reflags,ldict,toknames) rlist, rre, rnames = _form_master_re(relist[m:],reflags,ldict,toknames) return llist+rlist, lre+rre, lnames+rnames # ----------------------------------------------------------------------------- # def _statetoken(s,names) # # Given a declaration name s of the form "t_" and a dictionary whose keys are # state names, this function returns a tuple (states,tokenname) where states # is a tuple of state names and tokenname is the name of the token. For example, # calling this with s = "t_foo_bar_SPAM" might return (('foo','bar'),'SPAM') # ----------------------------------------------------------------------------- def _statetoken(s,names): nonstate = 1 parts = s.split("_") for i in range(1,len(parts)): if not parts[i] in names and parts[i] != 'ANY': break if i > 1: states = tuple(parts[1:i]) else: states = ('INITIAL',) if 'ANY' in states: states = tuple(names) tokenname = "_".join(parts[i:]) return (states,tokenname) # ----------------------------------------------------------------------------- # LexerReflect() # # This class represents information needed to build a lexer as extracted from a # user's input file. # ----------------------------------------------------------------------------- class LexerReflect(object): def __init__(self,ldict,log=None,reflags=0): self.ldict = ldict self.error_func = None self.tokens = [] self.reflags = reflags self.stateinfo = { 'INITIAL' : 'inclusive'} self.files = {} self.error = 0 if log is None: self.log = PlyLogger(sys.stderr) else: self.log = log # Get all of the basic information def get_all(self): self.get_tokens() self.get_literals() self.get_states() self.get_rules() # Validate all of the information def validate_all(self): self.validate_tokens() self.validate_literals() self.validate_rules() return self.error # Get the tokens map def get_tokens(self): tokens = self.ldict.get("tokens",None) if not tokens: self.log.error("No token list is defined") self.error = 1 return if not isinstance(tokens,(list, tuple)): self.log.error("tokens must be a list or tuple") self.error = 1 return if not tokens: self.log.error("tokens is empty") self.error = 1 return self.tokens = tokens # Validate the tokens def validate_tokens(self): terminals = {} for n in self.tokens: if not _is_identifier.match(n): self.log.error("Bad token name '%s'",n) self.error = 1 if n in terminals: self.log.warning("Token '%s' multiply defined", n) terminals[n] = 1 # Get the literals specifier def get_literals(self): self.literals = self.ldict.get("literals","") # Validate literals def validate_literals(self): try: for c in self.literals: if not isinstance(c,StringTypes) or len(c) > 1: self.log.error("Invalid literal %s. Must be a single character", repr(c)) self.error = 1 continue except TypeError: self.log.error("Invalid literals specification. literals must be a sequence of characters") self.error = 1 def get_states(self): self.states = self.ldict.get("states",None) # Build statemap if self.states: if not isinstance(self.states,(tuple,list)): self.log.error("states must be defined as a tuple or list") self.error = 1 else: for s in self.states: if not isinstance(s,tuple) or len(s) != 2: self.log.error("Invalid state specifier %s. Must be a tuple (statename,'exclusive|inclusive')",repr(s)) self.error = 1 continue name, statetype = s if not isinstance(name,StringTypes): self.log.error("State name %s must be a string", repr(name)) self.error = 1 continue if not (statetype == 'inclusive' or statetype == 'exclusive'): self.log.error("State type for state %s must be 'inclusive' or 'exclusive'",name) self.error = 1 continue if name in self.stateinfo: self.log.error("State '%s' already defined",name) self.error = 1 continue self.stateinfo[name] = statetype # Get all of the symbols with a t_ prefix and sort them into various # categories (functions, strings, error functions, and ignore characters) def get_rules(self): tsymbols = [f for f in self.ldict if f[:2] == 't_' ] # Now build up a list of functions and a list of strings self.toknames = { } # Mapping of symbols to token names self.funcsym = { } # Symbols defined as functions self.strsym = { } # Symbols defined as strings self.ignore = { } # Ignore strings by state self.errorf = { } # Error functions by state for s in self.stateinfo: self.funcsym[s] = [] self.strsym[s] = [] if len(tsymbols) == 0: self.log.error("No rules of the form t_rulename are defined") self.error = 1 return for f in tsymbols: t = self.ldict[f] states, tokname = _statetoken(f,self.stateinfo) self.toknames[f] = tokname if hasattr(t,"__call__"): if tokname == 'error': for s in states: self.errorf[s] = t elif tokname == 'ignore': line = func_code(t).co_firstlineno file = func_code(t).co_filename self.log.error("%s:%d: Rule '%s' must be defined as a string",file,line,t.__name__) self.error = 1 else: for s in states: self.funcsym[s].append((f,t)) elif isinstance(t, StringTypes): if tokname == 'ignore': for s in states: self.ignore[s] = t if "\\" in t: self.log.warning("%s contains a literal backslash '\\'",f) elif tokname == 'error': self.log.error("Rule '%s' must be defined as a function", f) self.error = 1 else: for s in states: self.strsym[s].append((f,t)) else: self.log.error("%s not defined as a function or string", f) self.error = 1 # Sort the functions by line number for f in self.funcsym.values(): if sys.version_info[0] < 3: f.sort(lambda x,y: cmp(func_code(x[1]).co_firstlineno,func_code(y[1]).co_firstlineno)) else: # Python 3.0 f.sort(key=lambda x: func_code(x[1]).co_firstlineno) # Sort the strings by regular expression length for s in self.strsym.values(): if sys.version_info[0] < 3: s.sort(lambda x,y: (len(x[1]) < len(y[1])) - (len(x[1]) > len(y[1]))) else: # Python 3.0 s.sort(key=lambda x: len(x[1]),reverse=True) # Validate all of the t_rules collected def validate_rules(self): for state in self.stateinfo: # Validate all rules defined by functions for fname, f in self.funcsym[state]: line = func_code(f).co_firstlineno file = func_code(f).co_filename self.files[file] = 1 tokname = self.toknames[fname] if isinstance(f, types.MethodType): reqargs = 2 else: reqargs = 1 nargs = func_code(f).co_argcount if nargs > reqargs: self.log.error("%s:%d: Rule '%s' has too many arguments",file,line,f.__name__) self.error = 1 continue if nargs < reqargs: self.log.error("%s:%d: Rule '%s' requires an argument", file,line,f.__name__) self.error = 1 continue if not f.__doc__: self.log.error("%s:%d: No regular expression defined for rule '%s'",file,line,f.__name__) self.error = 1 continue try: c = re.compile("(?P<%s>%s)" % (fname,f.__doc__), re.VERBOSE | self.reflags) if c.match(""): self.log.error("%s:%d: Regular expression for rule '%s' matches empty string", file,line,f.__name__) self.error = 1 except re.error: _etype, e, _etrace = sys.exc_info() self.log.error("%s:%d: Invalid regular expression for rule '%s'. %s", file,line,f.__name__,e) if '#' in f.__doc__: self.log.error("%s:%d. Make sure '#' in rule '%s' is escaped with '\\#'",file,line, f.__name__) self.error = 1 # Validate all rules defined by strings for name,r in self.strsym[state]: tokname = self.toknames[name] if tokname == 'error': self.log.error("Rule '%s' must be defined as a function", name) self.error = 1 continue if not tokname in self.tokens and tokname.find("ignore_") < 0: self.log.error("Rule '%s' defined for an unspecified token %s",name,tokname) self.error = 1 continue try: c = re.compile("(?P<%s>%s)" % (name,r),re.VERBOSE | self.reflags) if (c.match("")): self.log.error("Regular expression for rule '%s' matches empty string",name) self.error = 1 except re.error: _etype, e, _etrace = sys.exc_info() self.log.error("Invalid regular expression for rule '%s'. %s",name,e) if '#' in r: self.log.error("Make sure '#' in rule '%s' is escaped with '\\#'",name) self.error = 1 if not self.funcsym[state] and not self.strsym[state]: self.log.error("No rules defined for state '%s'",state) self.error = 1 # Validate the error function efunc = self.errorf.get(state,None) if efunc: f = efunc line = func_code(f).co_firstlineno file = func_code(f).co_filename self.files[file] = 1 if isinstance(f, types.MethodType): reqargs = 2 else: reqargs = 1 nargs = func_code(f).co_argcount if nargs > reqargs: self.log.error("%s:%d: Rule '%s' has too many arguments",file,line,f.__name__) self.error = 1 if nargs < reqargs: self.log.error("%s:%d: Rule '%s' requires an argument", file,line,f.__name__) self.error = 1 for f in self.files: self.validate_file(f) # ----------------------------------------------------------------------------- # validate_file() # # This checks to see if there are duplicated t_rulename() functions or strings # in the parser input file. This is done using a simple regular expression # match on each line in the given file. # ----------------------------------------------------------------------------- def validate_file(self,filename): import os.path base,ext = os.path.splitext(filename) if ext != '.py': return # No idea what the file is. Return OK try: f = open(filename) lines = f.readlines() f.close() except IOError: return # Couldn't find the file. Don't worry about it fre = re.compile(r'\s*def\s+(t_[a-zA-Z_0-9]*)\(') sre = re.compile(r'\s*(t_[a-zA-Z_0-9]*)\s*=') counthash = { } linen = 1 for l in lines: m = fre.match(l) if not m: m = sre.match(l) if m: name = m.group(1) prev = counthash.get(name) if not prev: counthash[name] = linen else: self.log.error("%s:%d: Rule %s redefined. Previously defined on line %d",filename,linen,name,prev) self.error = 1 linen += 1 # ----------------------------------------------------------------------------- # lex(module) # # Build all of the regular expression rules from definitions in the supplied module # ----------------------------------------------------------------------------- def lex(module=None,object=None,debug=0,optimize=0,lextab="lextab",reflags=0,nowarn=0,outputdir="", debuglog=None, errorlog=None): global lexer ldict = None stateinfo = { 'INITIAL' : 'inclusive'} lexobj = Lexer() lexobj.lexoptimize = optimize global token,input if errorlog is None: errorlog = PlyLogger(sys.stderr) if debug: if debuglog is None: debuglog = PlyLogger(sys.stderr) # Get the module dictionary used for the lexer if object: module = object if module: _items = [(k,getattr(module,k)) for k in dir(module)] ldict = dict(_items) else: ldict = get_caller_module_dict(2) # Collect parser information from the dictionary linfo = LexerReflect(ldict,log=errorlog,reflags=reflags) linfo.get_all() if not optimize: if linfo.validate_all(): raise SyntaxError("Can't build lexer") if optimize and lextab: try: lexobj.readtab(lextab,ldict) token = lexobj.token input = lexobj.input lexer = lexobj return lexobj except ImportError: pass # Dump some basic debugging information if debug: debuglog.info("lex: tokens = %r", linfo.tokens) debuglog.info("lex: literals = %r", linfo.literals) debuglog.info("lex: states = %r", linfo.stateinfo) # Build a dictionary of valid token names lexobj.lextokens = { } for n in linfo.tokens: lexobj.lextokens[n] = 1 # Get literals specification if isinstance(linfo.literals,(list,tuple)): lexobj.lexliterals = type(linfo.literals[0])().join(linfo.literals) else: lexobj.lexliterals = linfo.literals # Get the stateinfo dictionary stateinfo = linfo.stateinfo regexs = { } # Build the master regular expressions for state in stateinfo: regex_list = [] # Add rules defined by functions first for fname, f in linfo.funcsym[state]: line = func_code(f).co_firstlineno file = func_code(f).co_filename regex_list.append("(?P<%s>%s)" % (fname,f.__doc__)) if debug: debuglog.info("lex: Adding rule %s -> '%s' (state '%s')",fname,f.__doc__, state) # Now add all of the simple rules for name,r in linfo.strsym[state]: regex_list.append("(?P<%s>%s)" % (name,r)) if debug: debuglog.info("lex: Adding rule %s -> '%s' (state '%s')",name,r, state) regexs[state] = regex_list # Build the master regular expressions if debug: debuglog.info("lex: ==== MASTER REGEXS FOLLOW ====") for state in regexs: lexre, re_text, re_names = _form_master_re(regexs[state],reflags,ldict,linfo.toknames) lexobj.lexstatere[state] = lexre lexobj.lexstateretext[state] = re_text lexobj.lexstaterenames[state] = re_names if debug: for i in range(len(re_text)): debuglog.info("lex: state '%s' : regex[%d] = '%s'",state, i, re_text[i]) # For inclusive states, we need to add the regular expressions from the INITIAL state for state,stype in stateinfo.items(): if state != "INITIAL" and stype == 'inclusive': lexobj.lexstatere[state].extend(lexobj.lexstatere['INITIAL']) lexobj.lexstateretext[state].extend(lexobj.lexstateretext['INITIAL']) lexobj.lexstaterenames[state].extend(lexobj.lexstaterenames['INITIAL']) lexobj.lexstateinfo = stateinfo lexobj.lexre = lexobj.lexstatere["INITIAL"] lexobj.lexretext = lexobj.lexstateretext["INITIAL"] lexobj.lexreflags = reflags # Set up ignore variables lexobj.lexstateignore = linfo.ignore lexobj.lexignore = lexobj.lexstateignore.get("INITIAL","") # Set up error functions lexobj.lexstateerrorf = linfo.errorf lexobj.lexerrorf = linfo.errorf.get("INITIAL",None) if not lexobj.lexerrorf: errorlog.warning("No t_error rule is defined") # Check state information for ignore and error rules for s,stype in stateinfo.items(): if stype == 'exclusive': if not s in linfo.errorf: errorlog.warning("No error rule is defined for exclusive state '%s'", s) if not s in linfo.ignore and lexobj.lexignore: errorlog.warning("No ignore rule is defined for exclusive state '%s'", s) elif stype == 'inclusive': if not s in linfo.errorf: linfo.errorf[s] = linfo.errorf.get("INITIAL",None) if not s in linfo.ignore: linfo.ignore[s] = linfo.ignore.get("INITIAL","") # Create global versions of the token() and input() functions token = lexobj.token input = lexobj.input lexer = lexobj # If in optimize mode, we write the lextab if lextab and optimize: lexobj.writetab(lextab,outputdir) return lexobj # ----------------------------------------------------------------------------- # runmain() # # This runs the lexer as a main program # ----------------------------------------------------------------------------- def runmain(lexer=None,data=None): if not data: try: filename = sys.argv[1] f = open(filename) data = f.read() f.close() except IndexError: sys.stdout.write("Reading from standard input (type EOF to end):\n") data = sys.stdin.read() if lexer: _input = lexer.input else: _input = input _input(data) if lexer: _token = lexer.token else: _token = token while 1: tok = _token() if not tok: break sys.stdout.write("(%s,%r,%d,%d)\n" % (tok.type, tok.value, tok.lineno,tok.lexpos)) # ----------------------------------------------------------------------------- # @TOKEN(regex) # # This decorator function can be used to set the regex expression on a function # when its docstring might need to be set in an alternative way # ----------------------------------------------------------------------------- def TOKEN(r): def set_doc(f): if hasattr(r,"__call__"): f.__doc__ = r.__doc__ else: f.__doc__ = r return f return set_doc # Alternative spelling of the TOKEN decorator Token = TOKEN enigmail-2.0.8/util/ply/yacc.py000066400000000000000000003727541334302754500164100ustar00rootroot00000000000000# ----------------------------------------------------------------------------- # ply: yacc.py # # Copyright (C) 2001-2009, # David M. Beazley (Dabeaz LLC) # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # * Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # * Neither the name of the David Beazley or Dabeaz LLC may be used to # endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # ----------------------------------------------------------------------------- # # This implements an LR parser that is constructed from grammar rules defined # as Python functions. The grammer is specified by supplying the BNF inside # Python documentation strings. The inspiration for this technique was borrowed # from John Aycock's Spark parsing system. PLY might be viewed as cross between # Spark and the GNU bison utility. # # The current implementation is only somewhat object-oriented. The # LR parser itself is defined in terms of an object (which allows multiple # parsers to co-exist). However, most of the variables used during table # construction are defined in terms of global variables. Users shouldn't # notice unless they are trying to define multiple parsers at the same # time using threads (in which case they should have their head examined). # # This implementation supports both SLR and LALR(1) parsing. LALR(1) # support was originally implemented by Elias Ioup (ezioup@alumni.uchicago.edu), # using the algorithm found in Aho, Sethi, and Ullman "Compilers: Principles, # Techniques, and Tools" (The Dragon Book). LALR(1) has since been replaced # by the more efficient DeRemer and Pennello algorithm. # # :::::::: WARNING ::::::: # # Construction of LR parsing tables is fairly complicated and expensive. # To make this module run fast, a *LOT* of work has been put into # optimization---often at the expensive of readability and what might # consider to be good Python "coding style." Modify the code at your # own risk! # ---------------------------------------------------------------------------- __version__ = "3.3" __tabversion__ = "3.2" # Table version #----------------------------------------------------------------------------- # === User configurable parameters === # # Change these to modify the default behavior of yacc (if you wish) #----------------------------------------------------------------------------- yaccdebug = 1 # Debugging mode. If set, yacc generates a # a 'parser.out' file in the current directory debug_file = 'parser.out' # Default name of the debugging file tab_module = 'parsetab' # Default name of the table module default_lr = 'LALR' # Default LR table generation method error_count = 3 # Number of symbols that must be shifted to leave recovery mode yaccdevel = 0 # Set to True if developing yacc. This turns off optimized # implementations of certain functions. resultlimit = 40 # Size limit of results when running in debug mode. pickle_protocol = 0 # Protocol to use when writing pickle files import re, types, sys, os.path # Compatibility function for python 2.6/3.0 if sys.version_info[0] < 3: def func_code(f): return f.func_code else: def func_code(f): return f.__code__ # Compatibility try: MAXINT = sys.maxint except AttributeError: MAXINT = sys.maxsize # Python 2.x/3.0 compatibility. def load_ply_lex(): if sys.version_info[0] < 3: import lex else: import ply.lex as lex return lex # This object is a stand-in for a logging object created by the # logging module. PLY will use this by default to create things # such as the parser.out file. If a user wants more detailed # information, they can create their own logging object and pass # it into PLY. class PlyLogger(object): def __init__(self,f): self.f = f def debug(self,msg,*args,**kwargs): self.f.write((msg % args) + "\n") info = debug def warning(self,msg,*args,**kwargs): self.f.write("WARNING: "+ (msg % args) + "\n") def error(self,msg,*args,**kwargs): self.f.write("ERROR: " + (msg % args) + "\n") critical = debug # Null logger is used when no output is generated. Does nothing. class NullLogger(object): def __getattribute__(self,name): return self def __call__(self,*args,**kwargs): return self # Exception raised for yacc-related errors class YaccError(Exception): pass # Format the result message that the parser produces when running in debug mode. def format_result(r): repr_str = repr(r) if '\n' in repr_str: repr_str = repr(repr_str) if len(repr_str) > resultlimit: repr_str = repr_str[:resultlimit]+" ..." result = "<%s @ 0x%x> (%s)" % (type(r).__name__,id(r),repr_str) return result # Format stack entries when the parser is running in debug mode def format_stack_entry(r): repr_str = repr(r) if '\n' in repr_str: repr_str = repr(repr_str) if len(repr_str) < 16: return repr_str else: return "<%s @ 0x%x>" % (type(r).__name__,id(r)) #----------------------------------------------------------------------------- # === LR Parsing Engine === # # The following classes are used for the LR parser itself. These are not # used during table construction and are independent of the actual LR # table generation algorithm #----------------------------------------------------------------------------- # This class is used to hold non-terminal grammar symbols during parsing. # It normally has the following attributes set: # .type = Grammar symbol type # .value = Symbol value # .lineno = Starting line number # .endlineno = Ending line number (optional, set automatically) # .lexpos = Starting lex position # .endlexpos = Ending lex position (optional, set automatically) class YaccSymbol: def __str__(self): return self.type def __repr__(self): return str(self) # This class is a wrapper around the objects actually passed to each # grammar rule. Index lookup and assignment actually assign the # .value attribute of the underlying YaccSymbol object. # The lineno() method returns the line number of a given # item (or 0 if not defined). The linespan() method returns # a tuple of (startline,endline) representing the range of lines # for a symbol. The lexspan() method returns a tuple (lexpos,endlexpos) # representing the range of positional information for a symbol. class YaccProduction: def __init__(self,s,stack=None): self.slice = s self.stack = stack self.lexer = None self.parser= None def __getitem__(self,n): if n >= 0: return self.slice[n].value else: return self.stack[n].value def __setitem__(self,n,v): self.slice[n].value = v def __getslice__(self,i,j): return [s.value for s in self.slice[i:j]] def __len__(self): return len(self.slice) def lineno(self,n): return getattr(self.slice[n],"lineno",0) def set_lineno(self,n,lineno): self.slice[n].lineno = lineno def linespan(self,n): startline = getattr(self.slice[n],"lineno",0) endline = getattr(self.slice[n],"endlineno",startline) return startline,endline def lexpos(self,n): return getattr(self.slice[n],"lexpos",0) def lexspan(self,n): startpos = getattr(self.slice[n],"lexpos",0) endpos = getattr(self.slice[n],"endlexpos",startpos) return startpos,endpos def error(self): raise SyntaxError # ----------------------------------------------------------------------------- # == LRParser == # # The LR Parsing engine. # ----------------------------------------------------------------------------- class LRParser: def __init__(self,lrtab,errorf): self.productions = lrtab.lr_productions self.action = lrtab.lr_action self.goto = lrtab.lr_goto self.errorfunc = errorf def errok(self): self.errorok = 1 def restart(self): del self.statestack[:] del self.symstack[:] sym = YaccSymbol() sym.type = '$end' self.symstack.append(sym) self.statestack.append(0) def parse(self,input=None,lexer=None,debug=0,tracking=0,tokenfunc=None): if debug or yaccdevel: if isinstance(debug,int): debug = PlyLogger(sys.stderr) return self.parsedebug(input,lexer,debug,tracking,tokenfunc) elif tracking: return self.parseopt(input,lexer,debug,tracking,tokenfunc) else: return self.parseopt_notrack(input,lexer,debug,tracking,tokenfunc) # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # parsedebug(). # # This is the debugging enabled version of parse(). All changes made to the # parsing engine should be made here. For the non-debugging version, # copy this code to a method parseopt() and delete all of the sections # enclosed in: # # #--! DEBUG # statements # #--! DEBUG # # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! def parsedebug(self,input=None,lexer=None,debug=None,tracking=0,tokenfunc=None): lookahead = None # Current lookahead symbol lookaheadstack = [ ] # Stack of lookahead symbols actions = self.action # Local reference to action table (to avoid lookup on self.) goto = self.goto # Local reference to goto table (to avoid lookup on self.) prod = self.productions # Local reference to production list (to avoid lookup on self.) pslice = YaccProduction(None) # Production object passed to grammar rules errorcount = 0 # Used during error recovery # --! DEBUG debug.info("PLY: PARSE DEBUG START") # --! DEBUG # If no lexer was given, we will try to use the lex module if not lexer: lex = load_ply_lex() lexer = lex.lexer # Set up the lexer and parser objects on pslice pslice.lexer = lexer pslice.parser = self # If input was supplied, pass to lexer if input is not None: lexer.input(input) if tokenfunc is None: # Tokenize function get_token = lexer.token else: get_token = tokenfunc # Set up the state and symbol stacks statestack = [ ] # Stack of parsing states self.statestack = statestack symstack = [ ] # Stack of grammar symbols self.symstack = symstack pslice.stack = symstack # Put in the production errtoken = None # Err token # The start state is assumed to be (0,$end) statestack.append(0) sym = YaccSymbol() sym.type = "$end" symstack.append(sym) state = 0 while 1: # Get the next symbol on the input. If a lookahead symbol # is already set, we just use that. Otherwise, we'll pull # the next token off of the lookaheadstack or from the lexer # --! DEBUG debug.debug('') debug.debug('State : %s', state) # --! DEBUG if not lookahead: if not lookaheadstack: lookahead = get_token() # Get the next token else: lookahead = lookaheadstack.pop() if not lookahead: lookahead = YaccSymbol() lookahead.type = "$end" # --! DEBUG debug.debug('Stack : %s', ("%s . %s" % (" ".join([xx.type for xx in symstack][1:]), str(lookahead))).lstrip()) # --! DEBUG # Check the action table ltype = lookahead.type t = actions[state].get(ltype) if t is not None: if t > 0: # shift a symbol on the stack statestack.append(t) state = t # --! DEBUG debug.debug("Action : Shift and goto state %s", t) # --! DEBUG symstack.append(lookahead) lookahead = None # Decrease error count on successful shift if errorcount: errorcount -=1 continue if t < 0: # reduce a symbol on the stack, emit a production p = prod[-t] pname = p.name plen = p.len # Get production function sym = YaccSymbol() sym.type = pname # Production name sym.value = None # --! DEBUG if plen: debug.info("Action : Reduce rule [%s] with %s and goto state %d", p.str, "["+",".join([format_stack_entry(_v.value) for _v in symstack[-plen:]])+"]",-t) else: debug.info("Action : Reduce rule [%s] with %s and goto state %d", p.str, [],-t) # --! DEBUG if plen: targ = symstack[-plen-1:] targ[0] = sym # --! TRACKING if tracking: t1 = targ[1] sym.lineno = t1.lineno sym.lexpos = t1.lexpos t1 = targ[-1] sym.endlineno = getattr(t1,"endlineno",t1.lineno) sym.endlexpos = getattr(t1,"endlexpos",t1.lexpos) # --! TRACKING # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # The code enclosed in this section is duplicated # below as a performance optimization. Make sure # changes get made in both locations. pslice.slice = targ try: # Call the grammar rule with our special slice object del symstack[-plen:] del statestack[-plen:] p.callable(pslice) # --! DEBUG debug.info("Result : %s", format_result(pslice[0])) # --! DEBUG symstack.append(sym) state = goto[statestack[-1]][pname] statestack.append(state) except SyntaxError: # If an error was set. Enter error recovery state lookaheadstack.append(lookahead) symstack.pop() statestack.pop() state = statestack[-1] sym.type = 'error' lookahead = sym errorcount = error_count self.errorok = 0 continue # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! else: # --! TRACKING if tracking: sym.lineno = lexer.lineno sym.lexpos = lexer.lexpos # --! TRACKING targ = [ sym ] # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # The code enclosed in this section is duplicated # above as a performance optimization. Make sure # changes get made in both locations. pslice.slice = targ try: # Call the grammar rule with our special slice object p.callable(pslice) # --! DEBUG debug.info("Result : %s", format_result(pslice[0])) # --! DEBUG symstack.append(sym) state = goto[statestack[-1]][pname] statestack.append(state) except SyntaxError: # If an error was set. Enter error recovery state lookaheadstack.append(lookahead) symstack.pop() statestack.pop() state = statestack[-1] sym.type = 'error' lookahead = sym errorcount = error_count self.errorok = 0 continue # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! if t == 0: n = symstack[-1] result = getattr(n,"value",None) # --! DEBUG debug.info("Done : Returning %s", format_result(result)) debug.info("PLY: PARSE DEBUG END") # --! DEBUG return result if t == None: # --! DEBUG debug.error('Error : %s', ("%s . %s" % (" ".join([xx.type for xx in symstack][1:]), str(lookahead))).lstrip()) # --! DEBUG # We have some kind of parsing error here. To handle # this, we are going to push the current token onto # the tokenstack and replace it with an 'error' token. # If there are any synchronization rules, they may # catch it. # # In addition to pushing the error token, we call call # the user defined p_error() function if this is the # first syntax error. This function is only called if # errorcount == 0. if errorcount == 0 or self.errorok: errorcount = error_count self.errorok = 0 errtoken = lookahead if errtoken.type == "$end": errtoken = None # End of file! if self.errorfunc: global errok,token,restart errok = self.errok # Set some special functions available in error recovery token = get_token restart = self.restart if errtoken and not hasattr(errtoken,'lexer'): errtoken.lexer = lexer tok = self.errorfunc(errtoken) del errok, token, restart # Delete special functions if self.errorok: # User must have done some kind of panic # mode recovery on their own. The # returned token is the next lookahead lookahead = tok errtoken = None continue else: if errtoken: if hasattr(errtoken,"lineno"): lineno = lookahead.lineno else: lineno = 0 if lineno: sys.stderr.write("yacc: Syntax error at line %d, token=%s\n" % (lineno, errtoken.type)) else: sys.stderr.write("yacc: Syntax error, token=%s" % errtoken.type) else: sys.stderr.write("yacc: Parse error in input. EOF\n") return else: errorcount = error_count # case 1: the statestack only has 1 entry on it. If we're in this state, the # entire parse has been rolled back and we're completely hosed. The token is # discarded and we just keep going. if len(statestack) <= 1 and lookahead.type != "$end": lookahead = None errtoken = None state = 0 # Nuke the pushback stack del lookaheadstack[:] continue # case 2: the statestack has a couple of entries on it, but we're # at the end of the file. nuke the top entry and generate an error token # Start nuking entries on the stack if lookahead.type == "$end": # Whoa. We're really hosed here. Bail out return if lookahead.type != 'error': sym = symstack[-1] if sym.type == 'error': # Hmmm. Error is on top of stack, we'll just nuke input # symbol and continue lookahead = None continue t = YaccSymbol() t.type = 'error' if hasattr(lookahead,"lineno"): t.lineno = lookahead.lineno t.value = lookahead lookaheadstack.append(lookahead) lookahead = t else: symstack.pop() statestack.pop() state = statestack[-1] # Potential bug fix continue # Call an error function here raise RuntimeError("yacc: internal parser error!!!\n") # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # parseopt(). # # Optimized version of parse() method. DO NOT EDIT THIS CODE DIRECTLY. # Edit the debug version above, then copy any modifications to the method # below while removing #--! DEBUG sections. # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! def parseopt(self,input=None,lexer=None,debug=0,tracking=0,tokenfunc=None): lookahead = None # Current lookahead symbol lookaheadstack = [ ] # Stack of lookahead symbols actions = self.action # Local reference to action table (to avoid lookup on self.) goto = self.goto # Local reference to goto table (to avoid lookup on self.) prod = self.productions # Local reference to production list (to avoid lookup on self.) pslice = YaccProduction(None) # Production object passed to grammar rules errorcount = 0 # Used during error recovery # If no lexer was given, we will try to use the lex module if not lexer: lex = load_ply_lex() lexer = lex.lexer # Set up the lexer and parser objects on pslice pslice.lexer = lexer pslice.parser = self # If input was supplied, pass to lexer if input is not None: lexer.input(input) if tokenfunc is None: # Tokenize function get_token = lexer.token else: get_token = tokenfunc # Set up the state and symbol stacks statestack = [ ] # Stack of parsing states self.statestack = statestack symstack = [ ] # Stack of grammar symbols self.symstack = symstack pslice.stack = symstack # Put in the production errtoken = None # Err token # The start state is assumed to be (0,$end) statestack.append(0) sym = YaccSymbol() sym.type = '$end' symstack.append(sym) state = 0 while 1: # Get the next symbol on the input. If a lookahead symbol # is already set, we just use that. Otherwise, we'll pull # the next token off of the lookaheadstack or from the lexer if not lookahead: if not lookaheadstack: lookahead = get_token() # Get the next token else: lookahead = lookaheadstack.pop() if not lookahead: lookahead = YaccSymbol() lookahead.type = '$end' # Check the action table ltype = lookahead.type t = actions[state].get(ltype) if t is not None: if t > 0: # shift a symbol on the stack statestack.append(t) state = t symstack.append(lookahead) lookahead = None # Decrease error count on successful shift if errorcount: errorcount -=1 continue if t < 0: # reduce a symbol on the stack, emit a production p = prod[-t] pname = p.name plen = p.len # Get production function sym = YaccSymbol() sym.type = pname # Production name sym.value = None if plen: targ = symstack[-plen-1:] targ[0] = sym # --! TRACKING if tracking: t1 = targ[1] sym.lineno = t1.lineno sym.lexpos = t1.lexpos t1 = targ[-1] sym.endlineno = getattr(t1,"endlineno",t1.lineno) sym.endlexpos = getattr(t1,"endlexpos",t1.lexpos) # --! TRACKING # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # The code enclosed in this section is duplicated # below as a performance optimization. Make sure # changes get made in both locations. pslice.slice = targ try: # Call the grammar rule with our special slice object del symstack[-plen:] del statestack[-plen:] p.callable(pslice) symstack.append(sym) state = goto[statestack[-1]][pname] statestack.append(state) except SyntaxError: # If an error was set. Enter error recovery state lookaheadstack.append(lookahead) symstack.pop() statestack.pop() state = statestack[-1] sym.type = 'error' lookahead = sym errorcount = error_count self.errorok = 0 continue # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! else: # --! TRACKING if tracking: sym.lineno = lexer.lineno sym.lexpos = lexer.lexpos # --! TRACKING targ = [ sym ] # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # The code enclosed in this section is duplicated # above as a performance optimization. Make sure # changes get made in both locations. pslice.slice = targ try: # Call the grammar rule with our special slice object p.callable(pslice) symstack.append(sym) state = goto[statestack[-1]][pname] statestack.append(state) except SyntaxError: # If an error was set. Enter error recovery state lookaheadstack.append(lookahead) symstack.pop() statestack.pop() state = statestack[-1] sym.type = 'error' lookahead = sym errorcount = error_count self.errorok = 0 continue # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! if t == 0: n = symstack[-1] return getattr(n,"value",None) if t == None: # We have some kind of parsing error here. To handle # this, we are going to push the current token onto # the tokenstack and replace it with an 'error' token. # If there are any synchronization rules, they may # catch it. # # In addition to pushing the error token, we call call # the user defined p_error() function if this is the # first syntax error. This function is only called if # errorcount == 0. if errorcount == 0 or self.errorok: errorcount = error_count self.errorok = 0 errtoken = lookahead if errtoken.type == '$end': errtoken = None # End of file! if self.errorfunc: global errok,token,restart errok = self.errok # Set some special functions available in error recovery token = get_token restart = self.restart if errtoken and not hasattr(errtoken,'lexer'): errtoken.lexer = lexer tok = self.errorfunc(errtoken) del errok, token, restart # Delete special functions if self.errorok: # User must have done some kind of panic # mode recovery on their own. The # returned token is the next lookahead lookahead = tok errtoken = None continue else: if errtoken: if hasattr(errtoken,"lineno"): lineno = lookahead.lineno else: lineno = 0 if lineno: sys.stderr.write("yacc: Syntax error at line %d, token=%s\n" % (lineno, errtoken.type)) else: sys.stderr.write("yacc: Syntax error, token=%s" % errtoken.type) else: sys.stderr.write("yacc: Parse error in input. EOF\n") return else: errorcount = error_count # case 1: the statestack only has 1 entry on it. If we're in this state, the # entire parse has been rolled back and we're completely hosed. The token is # discarded and we just keep going. if len(statestack) <= 1 and lookahead.type != '$end': lookahead = None errtoken = None state = 0 # Nuke the pushback stack del lookaheadstack[:] continue # case 2: the statestack has a couple of entries on it, but we're # at the end of the file. nuke the top entry and generate an error token # Start nuking entries on the stack if lookahead.type == '$end': # Whoa. We're really hosed here. Bail out return if lookahead.type != 'error': sym = symstack[-1] if sym.type == 'error': # Hmmm. Error is on top of stack, we'll just nuke input # symbol and continue lookahead = None continue t = YaccSymbol() t.type = 'error' if hasattr(lookahead,"lineno"): t.lineno = lookahead.lineno t.value = lookahead lookaheadstack.append(lookahead) lookahead = t else: symstack.pop() statestack.pop() state = statestack[-1] # Potential bug fix continue # Call an error function here raise RuntimeError("yacc: internal parser error!!!\n") # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # parseopt_notrack(). # # Optimized version of parseopt() with line number tracking removed. # DO NOT EDIT THIS CODE DIRECTLY. Copy the optimized version and remove # code in the #--! TRACKING sections # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! def parseopt_notrack(self,input=None,lexer=None,debug=0,tracking=0,tokenfunc=None): lookahead = None # Current lookahead symbol lookaheadstack = [ ] # Stack of lookahead symbols actions = self.action # Local reference to action table (to avoid lookup on self.) goto = self.goto # Local reference to goto table (to avoid lookup on self.) prod = self.productions # Local reference to production list (to avoid lookup on self.) pslice = YaccProduction(None) # Production object passed to grammar rules errorcount = 0 # Used during error recovery # If no lexer was given, we will try to use the lex module if not lexer: lex = load_ply_lex() lexer = lex.lexer # Set up the lexer and parser objects on pslice pslice.lexer = lexer pslice.parser = self # If input was supplied, pass to lexer if input is not None: lexer.input(input) if tokenfunc is None: # Tokenize function get_token = lexer.token else: get_token = tokenfunc # Set up the state and symbol stacks statestack = [ ] # Stack of parsing states self.statestack = statestack symstack = [ ] # Stack of grammar symbols self.symstack = symstack pslice.stack = symstack # Put in the production errtoken = None # Err token # The start state is assumed to be (0,$end) statestack.append(0) sym = YaccSymbol() sym.type = '$end' symstack.append(sym) state = 0 while 1: # Get the next symbol on the input. If a lookahead symbol # is already set, we just use that. Otherwise, we'll pull # the next token off of the lookaheadstack or from the lexer if not lookahead: if not lookaheadstack: lookahead = get_token() # Get the next token else: lookahead = lookaheadstack.pop() if not lookahead: lookahead = YaccSymbol() lookahead.type = '$end' # Check the action table ltype = lookahead.type t = actions[state].get(ltype) if t is not None: if t > 0: # shift a symbol on the stack statestack.append(t) state = t symstack.append(lookahead) lookahead = None # Decrease error count on successful shift if errorcount: errorcount -=1 continue if t < 0: # reduce a symbol on the stack, emit a production p = prod[-t] pname = p.name plen = p.len # Get production function sym = YaccSymbol() sym.type = pname # Production name sym.value = None if plen: targ = symstack[-plen-1:] targ[0] = sym # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # The code enclosed in this section is duplicated # below as a performance optimization. Make sure # changes get made in both locations. pslice.slice = targ try: # Call the grammar rule with our special slice object del symstack[-plen:] del statestack[-plen:] p.callable(pslice) symstack.append(sym) state = goto[statestack[-1]][pname] statestack.append(state) except SyntaxError: # If an error was set. Enter error recovery state lookaheadstack.append(lookahead) symstack.pop() statestack.pop() state = statestack[-1] sym.type = 'error' lookahead = sym errorcount = error_count self.errorok = 0 continue # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! else: targ = [ sym ] # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # The code enclosed in this section is duplicated # above as a performance optimization. Make sure # changes get made in both locations. pslice.slice = targ try: # Call the grammar rule with our special slice object p.callable(pslice) symstack.append(sym) state = goto[statestack[-1]][pname] statestack.append(state) except SyntaxError: # If an error was set. Enter error recovery state lookaheadstack.append(lookahead) symstack.pop() statestack.pop() state = statestack[-1] sym.type = 'error' lookahead = sym errorcount = error_count self.errorok = 0 continue # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! if t == 0: n = symstack[-1] return getattr(n,"value",None) if t == None: # We have some kind of parsing error here. To handle # this, we are going to push the current token onto # the tokenstack and replace it with an 'error' token. # If there are any synchronization rules, they may # catch it. # # In addition to pushing the error token, we call call # the user defined p_error() function if this is the # first syntax error. This function is only called if # errorcount == 0. if errorcount == 0 or self.errorok: errorcount = error_count self.errorok = 0 errtoken = lookahead if errtoken.type == '$end': errtoken = None # End of file! if self.errorfunc: global errok,token,restart errok = self.errok # Set some special functions available in error recovery token = get_token restart = self.restart if errtoken and not hasattr(errtoken,'lexer'): errtoken.lexer = lexer tok = self.errorfunc(errtoken) del errok, token, restart # Delete special functions if self.errorok: # User must have done some kind of panic # mode recovery on their own. The # returned token is the next lookahead lookahead = tok errtoken = None continue else: if errtoken: if hasattr(errtoken,"lineno"): lineno = lookahead.lineno else: lineno = 0 if lineno: sys.stderr.write("yacc: Syntax error at line %d, token=%s\n" % (lineno, errtoken.type)) else: sys.stderr.write("yacc: Syntax error, token=%s" % errtoken.type) else: sys.stderr.write("yacc: Parse error in input. EOF\n") return else: errorcount = error_count # case 1: the statestack only has 1 entry on it. If we're in this state, the # entire parse has been rolled back and we're completely hosed. The token is # discarded and we just keep going. if len(statestack) <= 1 and lookahead.type != '$end': lookahead = None errtoken = None state = 0 # Nuke the pushback stack del lookaheadstack[:] continue # case 2: the statestack has a couple of entries on it, but we're # at the end of the file. nuke the top entry and generate an error token # Start nuking entries on the stack if lookahead.type == '$end': # Whoa. We're really hosed here. Bail out return if lookahead.type != 'error': sym = symstack[-1] if sym.type == 'error': # Hmmm. Error is on top of stack, we'll just nuke input # symbol and continue lookahead = None continue t = YaccSymbol() t.type = 'error' if hasattr(lookahead,"lineno"): t.lineno = lookahead.lineno t.value = lookahead lookaheadstack.append(lookahead) lookahead = t else: symstack.pop() statestack.pop() state = statestack[-1] # Potential bug fix continue # Call an error function here raise RuntimeError("yacc: internal parser error!!!\n") # ----------------------------------------------------------------------------- # === Grammar Representation === # # The following functions, classes, and variables are used to represent and # manipulate the rules that make up a grammar. # ----------------------------------------------------------------------------- import re # regex matching identifiers _is_identifier = re.compile(r'^[a-zA-Z0-9_-]+$') # ----------------------------------------------------------------------------- # class Production: # # This class stores the raw information about a single production or grammar rule. # A grammar rule refers to a specification such as this: # # expr : expr PLUS term # # Here are the basic attributes defined on all productions # # name - Name of the production. For example 'expr' # prod - A list of symbols on the right side ['expr','PLUS','term'] # prec - Production precedence level # number - Production number. # func - Function that executes on reduce # file - File where production function is defined # lineno - Line number where production function is defined # # The following attributes are defined or optional. # # len - Length of the production (number of symbols on right hand side) # usyms - Set of unique symbols found in the production # ----------------------------------------------------------------------------- class Production(object): reduced = 0 def __init__(self,number,name,prod,precedence=('right',0),func=None,file='',line=0): self.name = name self.prod = tuple(prod) self.number = number self.func = func self.callable = None self.file = file self.line = line self.prec = precedence # Internal settings used during table construction self.len = len(self.prod) # Length of the production # Create a list of unique production symbols used in the production self.usyms = [ ] for s in self.prod: if s not in self.usyms: self.usyms.append(s) # List of all LR items for the production self.lr_items = [] self.lr_next = None # Create a string representation if self.prod: self.str = "%s -> %s" % (self.name," ".join(self.prod)) else: self.str = "%s -> " % self.name def __str__(self): return self.str def __repr__(self): return "Production("+str(self)+")" def __len__(self): return len(self.prod) def __nonzero__(self): return 1 def __getitem__(self,index): return self.prod[index] # Return the nth lr_item from the production (or None if at the end) def lr_item(self,n): if n > len(self.prod): return None p = LRItem(self,n) # Precompute the list of productions immediately following. Hack. Remove later try: p.lr_after = Prodnames[p.prod[n+1]] except (IndexError,KeyError): p.lr_after = [] try: p.lr_before = p.prod[n-1] except IndexError: p.lr_before = None return p # Bind the production function name to a callable def bind(self,pdict): if self.func: self.callable = pdict[self.func] # This class serves as a minimal standin for Production objects when # reading table data from files. It only contains information # actually used by the LR parsing engine, plus some additional # debugging information. class MiniProduction(object): def __init__(self,str,name,len,func,file,line): self.name = name self.len = len self.func = func self.callable = None self.file = file self.line = line self.str = str def __str__(self): return self.str def __repr__(self): return "MiniProduction(%s)" % self.str # Bind the production function name to a callable def bind(self,pdict): if self.func: self.callable = pdict[self.func] # ----------------------------------------------------------------------------- # class LRItem # # This class represents a specific stage of parsing a production rule. For # example: # # expr : expr . PLUS term # # In the above, the "." represents the current location of the parse. Here # basic attributes: # # name - Name of the production. For example 'expr' # prod - A list of symbols on the right side ['expr','.', 'PLUS','term'] # number - Production number. # # lr_next Next LR item. Example, if we are ' expr -> expr . PLUS term' # then lr_next refers to 'expr -> expr PLUS . term' # lr_index - LR item index (location of the ".") in the prod list. # lookaheads - LALR lookahead symbols for this item # len - Length of the production (number of symbols on right hand side) # lr_after - List of all productions that immediately follow # lr_before - Grammar symbol immediately before # ----------------------------------------------------------------------------- class LRItem(object): def __init__(self,p,n): self.name = p.name self.prod = list(p.prod) self.number = p.number self.lr_index = n self.lookaheads = { } self.prod.insert(n,".") self.prod = tuple(self.prod) self.len = len(self.prod) self.usyms = p.usyms def __str__(self): if self.prod: s = "%s -> %s" % (self.name," ".join(self.prod)) else: s = "%s -> " % self.name return s def __repr__(self): return "LRItem("+str(self)+")" # ----------------------------------------------------------------------------- # rightmost_terminal() # # Return the rightmost terminal from a list of symbols. Used in add_production() # ----------------------------------------------------------------------------- def rightmost_terminal(symbols, terminals): i = len(symbols) - 1 while i >= 0: if symbols[i] in terminals: return symbols[i] i -= 1 return None # ----------------------------------------------------------------------------- # === GRAMMAR CLASS === # # The following class represents the contents of the specified grammar along # with various computed properties such as first sets, follow sets, LR items, etc. # This data is used for critical parts of the table generation process later. # ----------------------------------------------------------------------------- class GrammarError(YaccError): pass class Grammar(object): def __init__(self,terminals): self.Productions = [None] # A list of all of the productions. The first # entry is always reserved for the purpose of # building an augmented grammar self.Prodnames = { } # A dictionary mapping the names of nonterminals to a list of all # productions of that nonterminal. self.Prodmap = { } # A dictionary that is only used to detect duplicate # productions. self.Terminals = { } # A dictionary mapping the names of terminal symbols to a # list of the rules where they are used. for term in terminals: self.Terminals[term] = [] self.Terminals['error'] = [] self.Nonterminals = { } # A dictionary mapping names of nonterminals to a list # of rule numbers where they are used. self.First = { } # A dictionary of precomputed FIRST(x) symbols self.Follow = { } # A dictionary of precomputed FOLLOW(x) symbols self.Precedence = { } # Precedence rules for each terminal. Contains tuples of the # form ('right',level) or ('nonassoc', level) or ('left',level) self.UsedPrecedence = { } # Precedence rules that were actually used by the grammer. # This is only used to provide error checking and to generate # a warning about unused precedence rules. self.Start = None # Starting symbol for the grammar def __len__(self): return len(self.Productions) def __getitem__(self,index): return self.Productions[index] # ----------------------------------------------------------------------------- # set_precedence() # # Sets the precedence for a given terminal. assoc is the associativity such as # 'left','right', or 'nonassoc'. level is a numeric level. # # ----------------------------------------------------------------------------- def set_precedence(self,term,assoc,level): assert self.Productions == [None],"Must call set_precedence() before add_production()" if term in self.Precedence: raise GrammarError("Precedence already specified for terminal '%s'" % term) if assoc not in ['left','right','nonassoc']: raise GrammarError("Associativity must be one of 'left','right', or 'nonassoc'") self.Precedence[term] = (assoc,level) # ----------------------------------------------------------------------------- # add_production() # # Given an action function, this function assembles a production rule and # computes its precedence level. # # The production rule is supplied as a list of symbols. For example, # a rule such as 'expr : expr PLUS term' has a production name of 'expr' and # symbols ['expr','PLUS','term']. # # Precedence is determined by the precedence of the right-most non-terminal # or the precedence of a terminal specified by %prec. # # A variety of error checks are performed to make sure production symbols # are valid and that %prec is used correctly. # ----------------------------------------------------------------------------- def add_production(self,prodname,syms,func=None,file='',line=0): if prodname in self.Terminals: raise GrammarError("%s:%d: Illegal rule name '%s'. Already defined as a token" % (file,line,prodname)) if prodname == 'error': raise GrammarError("%s:%d: Illegal rule name '%s'. error is a reserved word" % (file,line,prodname)) if not _is_identifier.match(prodname): raise GrammarError("%s:%d: Illegal rule name '%s'" % (file,line,prodname)) # Look for literal tokens for n,s in enumerate(syms): if s[0] in "'\"": try: c = eval(s) if (len(c) > 1): raise GrammarError("%s:%d: Literal token %s in rule '%s' may only be a single character" % (file,line,s, prodname)) if not c in self.Terminals: self.Terminals[c] = [] syms[n] = c continue except SyntaxError: pass if not _is_identifier.match(s) and s != '%prec': raise GrammarError("%s:%d: Illegal name '%s' in rule '%s'" % (file,line,s, prodname)) # Determine the precedence level if '%prec' in syms: if syms[-1] == '%prec': raise GrammarError("%s:%d: Syntax error. Nothing follows %%prec" % (file,line)) if syms[-2] != '%prec': raise GrammarError("%s:%d: Syntax error. %%prec can only appear at the end of a grammar rule" % (file,line)) precname = syms[-1] prodprec = self.Precedence.get(precname,None) if not prodprec: raise GrammarError("%s:%d: Nothing known about the precedence of '%s'" % (file,line,precname)) else: self.UsedPrecedence[precname] = 1 del syms[-2:] # Drop %prec from the rule else: # If no %prec, precedence is determined by the rightmost terminal symbol precname = rightmost_terminal(syms,self.Terminals) prodprec = self.Precedence.get(precname,('right',0)) # See if the rule is already in the rulemap map = "%s -> %s" % (prodname,syms) if map in self.Prodmap: m = self.Prodmap[map] raise GrammarError("%s:%d: Duplicate rule %s. " % (file,line, m) + "Previous definition at %s:%d" % (m.file, m.line)) # From this point on, everything is valid. Create a new Production instance pnumber = len(self.Productions) if not prodname in self.Nonterminals: self.Nonterminals[prodname] = [ ] # Add the production number to Terminals and Nonterminals for t in syms: if t in self.Terminals: self.Terminals[t].append(pnumber) else: if not t in self.Nonterminals: self.Nonterminals[t] = [ ] self.Nonterminals[t].append(pnumber) # Create a production and add it to the list of productions p = Production(pnumber,prodname,syms,prodprec,func,file,line) self.Productions.append(p) self.Prodmap[map] = p # Add to the global productions list try: self.Prodnames[prodname].append(p) except KeyError: self.Prodnames[prodname] = [ p ] return 0 # ----------------------------------------------------------------------------- # set_start() # # Sets the starting symbol and creates the augmented grammar. Production # rule 0 is S' -> start where start is the start symbol. # ----------------------------------------------------------------------------- def set_start(self,start=None): if not start: start = self.Productions[1].name if start not in self.Nonterminals: raise GrammarError("start symbol %s undefined" % start) self.Productions[0] = Production(0,"S'",[start]) self.Nonterminals[start].append(0) self.Start = start # ----------------------------------------------------------------------------- # find_unreachable() # # Find all of the nonterminal symbols that can't be reached from the starting # symbol. Returns a list of nonterminals that can't be reached. # ----------------------------------------------------------------------------- def find_unreachable(self): # Mark all symbols that are reachable from a symbol s def mark_reachable_from(s): if reachable[s]: # We've already reached symbol s. return reachable[s] = 1 for p in self.Prodnames.get(s,[]): for r in p.prod: mark_reachable_from(r) reachable = { } for s in list(self.Terminals) + list(self.Nonterminals): reachable[s] = 0 mark_reachable_from( self.Productions[0].prod[0] ) return [s for s in list(self.Nonterminals) if not reachable[s]] # ----------------------------------------------------------------------------- # infinite_cycles() # # This function looks at the various parsing rules and tries to detect # infinite recursion cycles (grammar rules where there is no possible way # to derive a string of only terminals). # ----------------------------------------------------------------------------- def infinite_cycles(self): terminates = {} # Terminals: for t in self.Terminals: terminates[t] = 1 terminates['$end'] = 1 # Nonterminals: # Initialize to false: for n in self.Nonterminals: terminates[n] = 0 # Then propagate termination until no change: while 1: some_change = 0 for (n,pl) in self.Prodnames.items(): # Nonterminal n terminates iff any of its productions terminates. for p in pl: # Production p terminates iff all of its rhs symbols terminate. for s in p.prod: if not terminates[s]: # The symbol s does not terminate, # so production p does not terminate. p_terminates = 0 break else: # didn't break from the loop, # so every symbol s terminates # so production p terminates. p_terminates = 1 if p_terminates: # symbol n terminates! if not terminates[n]: terminates[n] = 1 some_change = 1 # Don't need to consider any more productions for this n. break if not some_change: break infinite = [] for (s,term) in terminates.items(): if not term: if not s in self.Prodnames and not s in self.Terminals and s != 'error': # s is used-but-not-defined, and we've already warned of that, # so it would be overkill to say that it's also non-terminating. pass else: infinite.append(s) return infinite # ----------------------------------------------------------------------------- # undefined_symbols() # # Find all symbols that were used the grammar, but not defined as tokens or # grammar rules. Returns a list of tuples (sym, prod) where sym in the symbol # and prod is the production where the symbol was used. # ----------------------------------------------------------------------------- def undefined_symbols(self): result = [] for p in self.Productions: if not p: continue for s in p.prod: if not s in self.Prodnames and not s in self.Terminals and s != 'error': result.append((s,p)) return result # ----------------------------------------------------------------------------- # unused_terminals() # # Find all terminals that were defined, but not used by the grammar. Returns # a list of all symbols. # ----------------------------------------------------------------------------- def unused_terminals(self): unused_tok = [] for s,v in self.Terminals.items(): if s != 'error' and not v: unused_tok.append(s) return unused_tok # ------------------------------------------------------------------------------ # unused_rules() # # Find all grammar rules that were defined, but not used (maybe not reachable) # Returns a list of productions. # ------------------------------------------------------------------------------ def unused_rules(self): unused_prod = [] for s,v in self.Nonterminals.items(): if not v: p = self.Prodnames[s][0] unused_prod.append(p) return unused_prod # ----------------------------------------------------------------------------- # unused_precedence() # # Returns a list of tuples (term,precedence) corresponding to precedence # rules that were never used by the grammar. term is the name of the terminal # on which precedence was applied and precedence is a string such as 'left' or # 'right' corresponding to the type of precedence. # ----------------------------------------------------------------------------- def unused_precedence(self): unused = [] for termname in self.Precedence: if not (termname in self.Terminals or termname in self.UsedPrecedence): unused.append((termname,self.Precedence[termname][0])) return unused # ------------------------------------------------------------------------- # _first() # # Compute the value of FIRST1(beta) where beta is a tuple of symbols. # # During execution of compute_first1, the result may be incomplete. # Afterward (e.g., when called from compute_follow()), it will be complete. # ------------------------------------------------------------------------- def _first(self,beta): # We are computing First(x1,x2,x3,...,xn) result = [ ] for x in beta: x_produces_empty = 0 # Add all the non- symbols of First[x] to the result. for f in self.First[x]: if f == '': x_produces_empty = 1 else: if f not in result: result.append(f) if x_produces_empty: # We have to consider the next x in beta, # i.e. stay in the loop. pass else: # We don't have to consider any further symbols in beta. break else: # There was no 'break' from the loop, # so x_produces_empty was true for all x in beta, # so beta produces empty as well. result.append('') return result # ------------------------------------------------------------------------- # compute_first() # # Compute the value of FIRST1(X) for all symbols # ------------------------------------------------------------------------- def compute_first(self): if self.First: return self.First # Terminals: for t in self.Terminals: self.First[t] = [t] self.First['$end'] = ['$end'] # Nonterminals: # Initialize to the empty set: for n in self.Nonterminals: self.First[n] = [] # Then propagate symbols until no change: while 1: some_change = 0 for n in self.Nonterminals: for p in self.Prodnames[n]: for f in self._first(p.prod): if f not in self.First[n]: self.First[n].append( f ) some_change = 1 if not some_change: break return self.First # --------------------------------------------------------------------- # compute_follow() # # Computes all of the follow sets for every non-terminal symbol. The # follow set is the set of all symbols that might follow a given # non-terminal. See the Dragon book, 2nd Ed. p. 189. # --------------------------------------------------------------------- def compute_follow(self,start=None): # If already computed, return the result if self.Follow: return self.Follow # If first sets not computed yet, do that first. if not self.First: self.compute_first() # Add '$end' to the follow list of the start symbol for k in self.Nonterminals: self.Follow[k] = [ ] if not start: start = self.Productions[1].name self.Follow[start] = [ '$end' ] while 1: didadd = 0 for p in self.Productions[1:]: # Here is the production set for i in range(len(p.prod)): B = p.prod[i] if B in self.Nonterminals: # Okay. We got a non-terminal in a production fst = self._first(p.prod[i+1:]) hasempty = 0 for f in fst: if f != '' and f not in self.Follow[B]: self.Follow[B].append(f) didadd = 1 if f == '': hasempty = 1 if hasempty or i == (len(p.prod)-1): # Add elements of follow(a) to follow(b) for f in self.Follow[p.name]: if f not in self.Follow[B]: self.Follow[B].append(f) didadd = 1 if not didadd: break return self.Follow # ----------------------------------------------------------------------------- # build_lritems() # # This function walks the list of productions and builds a complete set of the # LR items. The LR items are stored in two ways: First, they are uniquely # numbered and placed in the list _lritems. Second, a linked list of LR items # is built for each production. For example: # # E -> E PLUS E # # Creates the list # # [E -> . E PLUS E, E -> E . PLUS E, E -> E PLUS . E, E -> E PLUS E . ] # ----------------------------------------------------------------------------- def build_lritems(self): for p in self.Productions: lastlri = p i = 0 lr_items = [] while 1: if i > len(p): lri = None else: lri = LRItem(p,i) # Precompute the list of productions immediately following try: lri.lr_after = self.Prodnames[lri.prod[i+1]] except (IndexError,KeyError): lri.lr_after = [] try: lri.lr_before = lri.prod[i-1] except IndexError: lri.lr_before = None lastlri.lr_next = lri if not lri: break lr_items.append(lri) lastlri = lri i += 1 p.lr_items = lr_items # ----------------------------------------------------------------------------- # == Class LRTable == # # This basic class represents a basic table of LR parsing information. # Methods for generating the tables are not defined here. They are defined # in the derived class LRGeneratedTable. # ----------------------------------------------------------------------------- class VersionError(YaccError): pass class LRTable(object): def __init__(self): self.lr_action = None self.lr_goto = None self.lr_productions = None self.lr_method = None def read_table(self,module): if isinstance(module,types.ModuleType): parsetab = module else: if sys.version_info[0] < 3: exec("import %s as parsetab" % module) else: env = { } exec("import %s as parsetab" % module, env, env) parsetab = env['parsetab'] if parsetab._tabversion != __tabversion__: raise VersionError("yacc table file version is out of date") self.lr_action = parsetab._lr_action self.lr_goto = parsetab._lr_goto self.lr_productions = [] for p in parsetab._lr_productions: self.lr_productions.append(MiniProduction(*p)) self.lr_method = parsetab._lr_method return parsetab._lr_signature def read_pickle(self,filename): try: import cPickle as pickle except ImportError: import pickle in_f = open(filename,"rb") tabversion = pickle.load(in_f) if tabversion != __tabversion__: raise VersionError("yacc table file version is out of date") self.lr_method = pickle.load(in_f) signature = pickle.load(in_f) self.lr_action = pickle.load(in_f) self.lr_goto = pickle.load(in_f) productions = pickle.load(in_f) self.lr_productions = [] for p in productions: self.lr_productions.append(MiniProduction(*p)) in_f.close() return signature # Bind all production function names to callable objects in pdict def bind_callables(self,pdict): for p in self.lr_productions: p.bind(pdict) # ----------------------------------------------------------------------------- # === LR Generator === # # The following classes and functions are used to generate LR parsing tables on # a grammar. # ----------------------------------------------------------------------------- # ----------------------------------------------------------------------------- # digraph() # traverse() # # The following two functions are used to compute set valued functions # of the form: # # F(x) = F'(x) U U{F(y) | x R y} # # This is used to compute the values of Read() sets as well as FOLLOW sets # in LALR(1) generation. # # Inputs: X - An input set # R - A relation # FP - Set-valued function # ------------------------------------------------------------------------------ def digraph(X,R,FP): N = { } for x in X: N[x] = 0 stack = [] F = { } for x in X: if N[x] == 0: traverse(x,N,stack,F,X,R,FP) return F def traverse(x,N,stack,F,X,R,FP): stack.append(x) d = len(stack) N[x] = d F[x] = FP(x) # F(X) <- F'(x) rel = R(x) # Get y's related to x for y in rel: if N[y] == 0: traverse(y,N,stack,F,X,R,FP) N[x] = min(N[x],N[y]) for a in F.get(y,[]): if a not in F[x]: F[x].append(a) if N[x] == d: N[stack[-1]] = MAXINT F[stack[-1]] = F[x] element = stack.pop() while element != x: N[stack[-1]] = MAXINT F[stack[-1]] = F[x] element = stack.pop() class LALRError(YaccError): pass # ----------------------------------------------------------------------------- # == LRGeneratedTable == # # This class implements the LR table generation algorithm. There are no # public methods except for write() # ----------------------------------------------------------------------------- class LRGeneratedTable(LRTable): def __init__(self,grammar,method='LALR',log=None): if method not in ['SLR','LALR']: raise LALRError("Unsupported method %s" % method) self.grammar = grammar self.lr_method = method # Set up the logger if not log: log = NullLogger() self.log = log # Internal attributes self.lr_action = {} # Action table self.lr_goto = {} # Goto table self.lr_productions = grammar.Productions # Copy of grammar Production array self.lr_goto_cache = {} # Cache of computed gotos self.lr0_cidhash = {} # Cache of closures self._add_count = 0 # Internal counter used to detect cycles # Diagonistic information filled in by the table generator self.sr_conflict = 0 self.rr_conflict = 0 self.conflicts = [] # List of conflicts self.sr_conflicts = [] self.rr_conflicts = [] # Build the tables self.grammar.build_lritems() self.grammar.compute_first() self.grammar.compute_follow() self.lr_parse_table() # Compute the LR(0) closure operation on I, where I is a set of LR(0) items. def lr0_closure(self,I): self._add_count += 1 # Add everything in I to J J = I[:] didadd = 1 while didadd: didadd = 0 for j in J: for x in j.lr_after: if getattr(x,"lr0_added",0) == self._add_count: continue # Add B --> .G to J J.append(x.lr_next) x.lr0_added = self._add_count didadd = 1 return J # Compute the LR(0) goto function goto(I,X) where I is a set # of LR(0) items and X is a grammar symbol. This function is written # in a way that guarantees uniqueness of the generated goto sets # (i.e. the same goto set will never be returned as two different Python # objects). With uniqueness, we can later do fast set comparisons using # id(obj) instead of element-wise comparison. def lr0_goto(self,I,x): # First we look for a previously cached entry g = self.lr_goto_cache.get((id(I),x),None) if g: return g # Now we generate the goto set in a way that guarantees uniqueness # of the result s = self.lr_goto_cache.get(x,None) if not s: s = { } self.lr_goto_cache[x] = s gs = [ ] for p in I: n = p.lr_next if n and n.lr_before == x: s1 = s.get(id(n),None) if not s1: s1 = { } s[id(n)] = s1 gs.append(n) s = s1 g = s.get('$end',None) if not g: if gs: g = self.lr0_closure(gs) s['$end'] = g else: s['$end'] = gs self.lr_goto_cache[(id(I),x)] = g return g # Compute the LR(0) sets of item function def lr0_items(self): C = [ self.lr0_closure([self.grammar.Productions[0].lr_next]) ] i = 0 for I in C: self.lr0_cidhash[id(I)] = i i += 1 # Loop over the items in C and each grammar symbols i = 0 while i < len(C): I = C[i] i += 1 # Collect all of the symbols that could possibly be in the goto(I,X) sets asyms = { } for ii in I: for s in ii.usyms: asyms[s] = None for x in asyms: g = self.lr0_goto(I,x) if not g: continue if id(g) in self.lr0_cidhash: continue self.lr0_cidhash[id(g)] = len(C) C.append(g) return C # ----------------------------------------------------------------------------- # ==== LALR(1) Parsing ==== # # LALR(1) parsing is almost exactly the same as SLR except that instead of # relying upon Follow() sets when performing reductions, a more selective # lookahead set that incorporates the state of the LR(0) machine is utilized. # Thus, we mainly just have to focus on calculating the lookahead sets. # # The method used here is due to DeRemer and Pennelo (1982). # # DeRemer, F. L., and T. J. Pennelo: "Efficient Computation of LALR(1) # Lookahead Sets", ACM Transactions on Programming Languages and Systems, # Vol. 4, No. 4, Oct. 1982, pp. 615-649 # # Further details can also be found in: # # J. Tremblay and P. Sorenson, "The Theory and Practice of Compiler Writing", # McGraw-Hill Book Company, (1985). # # ----------------------------------------------------------------------------- # ----------------------------------------------------------------------------- # compute_nullable_nonterminals() # # Creates a dictionary containing all of the non-terminals that might produce # an empty production. # ----------------------------------------------------------------------------- def compute_nullable_nonterminals(self): nullable = {} num_nullable = 0 while 1: for p in self.grammar.Productions[1:]: if p.len == 0: nullable[p.name] = 1 continue for t in p.prod: if not t in nullable: break else: nullable[p.name] = 1 if len(nullable) == num_nullable: break num_nullable = len(nullable) return nullable # ----------------------------------------------------------------------------- # find_nonterminal_trans(C) # # Given a set of LR(0) items, this functions finds all of the non-terminal # transitions. These are transitions in which a dot appears immediately before # a non-terminal. Returns a list of tuples of the form (state,N) where state # is the state number and N is the nonterminal symbol. # # The input C is the set of LR(0) items. # ----------------------------------------------------------------------------- def find_nonterminal_transitions(self,C): trans = [] for state in range(len(C)): for p in C[state]: if p.lr_index < p.len - 1: t = (state,p.prod[p.lr_index+1]) if t[1] in self.grammar.Nonterminals: if t not in trans: trans.append(t) state = state + 1 return trans # ----------------------------------------------------------------------------- # dr_relation() # # Computes the DR(p,A) relationships for non-terminal transitions. The input # is a tuple (state,N) where state is a number and N is a nonterminal symbol. # # Returns a list of terminals. # ----------------------------------------------------------------------------- def dr_relation(self,C,trans,nullable): dr_set = { } state,N = trans terms = [] g = self.lr0_goto(C[state],N) for p in g: if p.lr_index < p.len - 1: a = p.prod[p.lr_index+1] if a in self.grammar.Terminals: if a not in terms: terms.append(a) # This extra bit is to handle the start state if state == 0 and N == self.grammar.Productions[0].prod[0]: terms.append('$end') return terms # ----------------------------------------------------------------------------- # reads_relation() # # Computes the READS() relation (p,A) READS (t,C). # ----------------------------------------------------------------------------- def reads_relation(self,C, trans, empty): # Look for empty transitions rel = [] state, N = trans g = self.lr0_goto(C[state],N) j = self.lr0_cidhash.get(id(g),-1) for p in g: if p.lr_index < p.len - 1: a = p.prod[p.lr_index + 1] if a in empty: rel.append((j,a)) return rel # ----------------------------------------------------------------------------- # compute_lookback_includes() # # Determines the lookback and includes relations # # LOOKBACK: # # This relation is determined by running the LR(0) state machine forward. # For example, starting with a production "N : . A B C", we run it forward # to obtain "N : A B C ." We then build a relationship between this final # state and the starting state. These relationships are stored in a dictionary # lookdict. # # INCLUDES: # # Computes the INCLUDE() relation (p,A) INCLUDES (p',B). # # This relation is used to determine non-terminal transitions that occur # inside of other non-terminal transition states. (p,A) INCLUDES (p', B) # if the following holds: # # B -> LAT, where T -> epsilon and p' -L-> p # # L is essentially a prefix (which may be empty), T is a suffix that must be # able to derive an empty string. State p' must lead to state p with the string L. # # ----------------------------------------------------------------------------- def compute_lookback_includes(self,C,trans,nullable): lookdict = {} # Dictionary of lookback relations includedict = {} # Dictionary of include relations # Make a dictionary of non-terminal transitions dtrans = {} for t in trans: dtrans[t] = 1 # Loop over all transitions and compute lookbacks and includes for state,N in trans: lookb = [] includes = [] for p in C[state]: if p.name != N: continue # Okay, we have a name match. We now follow the production all the way # through the state machine until we get the . on the right hand side lr_index = p.lr_index j = state while lr_index < p.len - 1: lr_index = lr_index + 1 t = p.prod[lr_index] # Check to see if this symbol and state are a non-terminal transition if (j,t) in dtrans: # Yes. Okay, there is some chance that this is an includes relation # the only way to know for certain is whether the rest of the # production derives empty li = lr_index + 1 while li < p.len: if p.prod[li] in self.grammar.Terminals: break # No forget it if not p.prod[li] in nullable: break li = li + 1 else: # Appears to be a relation between (j,t) and (state,N) includes.append((j,t)) g = self.lr0_goto(C[j],t) # Go to next set j = self.lr0_cidhash.get(id(g),-1) # Go to next state # When we get here, j is the final state, now we have to locate the production for r in C[j]: if r.name != p.name: continue if r.len != p.len: continue i = 0 # This look is comparing a production ". A B C" with "A B C ." while i < r.lr_index: if r.prod[i] != p.prod[i+1]: break i = i + 1 else: lookb.append((j,r)) for i in includes: if not i in includedict: includedict[i] = [] includedict[i].append((state,N)) lookdict[(state,N)] = lookb return lookdict,includedict # ----------------------------------------------------------------------------- # compute_read_sets() # # Given a set of LR(0) items, this function computes the read sets. # # Inputs: C = Set of LR(0) items # ntrans = Set of nonterminal transitions # nullable = Set of empty transitions # # Returns a set containing the read sets # ----------------------------------------------------------------------------- def compute_read_sets(self,C, ntrans, nullable): FP = lambda x: self.dr_relation(C,x,nullable) R = lambda x: self.reads_relation(C,x,nullable) F = digraph(ntrans,R,FP) return F # ----------------------------------------------------------------------------- # compute_follow_sets() # # Given a set of LR(0) items, a set of non-terminal transitions, a readset, # and an include set, this function computes the follow sets # # Follow(p,A) = Read(p,A) U U {Follow(p',B) | (p,A) INCLUDES (p',B)} # # Inputs: # ntrans = Set of nonterminal transitions # readsets = Readset (previously computed) # inclsets = Include sets (previously computed) # # Returns a set containing the follow sets # ----------------------------------------------------------------------------- def compute_follow_sets(self,ntrans,readsets,inclsets): FP = lambda x: readsets[x] R = lambda x: inclsets.get(x,[]) F = digraph(ntrans,R,FP) return F # ----------------------------------------------------------------------------- # add_lookaheads() # # Attaches the lookahead symbols to grammar rules. # # Inputs: lookbacks - Set of lookback relations # followset - Computed follow set # # This function directly attaches the lookaheads to productions contained # in the lookbacks set # ----------------------------------------------------------------------------- def add_lookaheads(self,lookbacks,followset): for trans,lb in lookbacks.items(): # Loop over productions in lookback for state,p in lb: if not state in p.lookaheads: p.lookaheads[state] = [] f = followset.get(trans,[]) for a in f: if a not in p.lookaheads[state]: p.lookaheads[state].append(a) # ----------------------------------------------------------------------------- # add_lalr_lookaheads() # # This function does all of the work of adding lookahead information for use # with LALR parsing # ----------------------------------------------------------------------------- def add_lalr_lookaheads(self,C): # Determine all of the nullable nonterminals nullable = self.compute_nullable_nonterminals() # Find all non-terminal transitions trans = self.find_nonterminal_transitions(C) # Compute read sets readsets = self.compute_read_sets(C,trans,nullable) # Compute lookback/includes relations lookd, included = self.compute_lookback_includes(C,trans,nullable) # Compute LALR FOLLOW sets followsets = self.compute_follow_sets(trans,readsets,included) # Add all of the lookaheads self.add_lookaheads(lookd,followsets) # ----------------------------------------------------------------------------- # lr_parse_table() # # This function constructs the parse tables for SLR or LALR # ----------------------------------------------------------------------------- def lr_parse_table(self): Productions = self.grammar.Productions Precedence = self.grammar.Precedence goto = self.lr_goto # Goto array action = self.lr_action # Action array log = self.log # Logger for output actionp = { } # Action production array (temporary) log.info("Parsing method: %s", self.lr_method) # Step 1: Construct C = { I0, I1, ... IN}, collection of LR(0) items # This determines the number of states C = self.lr0_items() if self.lr_method == 'LALR': self.add_lalr_lookaheads(C) # Build the parser table, state by state st = 0 for I in C: # Loop over each production in I actlist = [ ] # List of actions st_action = { } st_actionp = { } st_goto = { } log.info("") log.info("state %d", st) log.info("") for p in I: log.info(" (%d) %s", p.number, str(p)) log.info("") for p in I: if p.len == p.lr_index + 1: if p.name == "S'": # Start symbol. Accept! st_action["$end"] = 0 st_actionp["$end"] = p else: # We are at the end of a production. Reduce! if self.lr_method == 'LALR': laheads = p.lookaheads[st] else: laheads = self.grammar.Follow[p.name] for a in laheads: actlist.append((a,p,"reduce using rule %d (%s)" % (p.number,p))) r = st_action.get(a,None) if r is not None: # Whoa. Have a shift/reduce or reduce/reduce conflict if r > 0: # Need to decide on shift or reduce here # By default we favor shifting. Need to add # some precedence rules here. sprec,slevel = Productions[st_actionp[a].number].prec rprec,rlevel = Precedence.get(a,('right',0)) if (slevel < rlevel) or ((slevel == rlevel) and (rprec == 'left')): # We really need to reduce here. st_action[a] = -p.number st_actionp[a] = p if not slevel and not rlevel: log.info(" ! shift/reduce conflict for %s resolved as reduce",a) self.sr_conflicts.append((st,a,'reduce')) Productions[p.number].reduced += 1 elif (slevel == rlevel) and (rprec == 'nonassoc'): st_action[a] = None else: # Hmmm. Guess we'll keep the shift if not rlevel: log.info(" ! shift/reduce conflict for %s resolved as shift",a) self.sr_conflicts.append((st,a,'shift')) elif r < 0: # Reduce/reduce conflict. In this case, we favor the rule # that was defined first in the grammar file oldp = Productions[-r] pp = Productions[p.number] if oldp.line > pp.line: st_action[a] = -p.number st_actionp[a] = p chosenp,rejectp = pp,oldp Productions[p.number].reduced += 1 Productions[oldp.number].reduced -= 1 else: chosenp,rejectp = oldp,pp self.rr_conflicts.append((st,chosenp,rejectp)) log.info(" ! reduce/reduce conflict for %s resolved using rule %d (%s)", a,st_actionp[a].number, st_actionp[a]) else: raise LALRError("Unknown conflict in state %d" % st) else: st_action[a] = -p.number st_actionp[a] = p Productions[p.number].reduced += 1 else: i = p.lr_index a = p.prod[i+1] # Get symbol right after the "." if a in self.grammar.Terminals: g = self.lr0_goto(I,a) j = self.lr0_cidhash.get(id(g),-1) if j >= 0: # We are in a shift state actlist.append((a,p,"shift and go to state %d" % j)) r = st_action.get(a,None) if r is not None: # Whoa have a shift/reduce or shift/shift conflict if r > 0: if r != j: raise LALRError("Shift/shift conflict in state %d" % st) elif r < 0: # Do a precedence check. # - if precedence of reduce rule is higher, we reduce. # - if precedence of reduce is same and left assoc, we reduce. # - otherwise we shift rprec,rlevel = Productions[st_actionp[a].number].prec sprec,slevel = Precedence.get(a,('right',0)) if (slevel > rlevel) or ((slevel == rlevel) and (rprec == 'right')): # We decide to shift here... highest precedence to shift Productions[st_actionp[a].number].reduced -= 1 st_action[a] = j st_actionp[a] = p if not rlevel: log.info(" ! shift/reduce conflict for %s resolved as shift",a) self.sr_conflicts.append((st,a,'shift')) elif (slevel == rlevel) and (rprec == 'nonassoc'): st_action[a] = None else: # Hmmm. Guess we'll keep the reduce if not slevel and not rlevel: log.info(" ! shift/reduce conflict for %s resolved as reduce",a) self.sr_conflicts.append((st,a,'reduce')) else: raise LALRError("Unknown conflict in state %d" % st) else: st_action[a] = j st_actionp[a] = p # Print the actions associated with each terminal _actprint = { } for a,p,m in actlist: if a in st_action: if p is st_actionp[a]: log.info(" %-15s %s",a,m) _actprint[(a,m)] = 1 log.info("") # Print the actions that were not used. (debugging) not_used = 0 for a,p,m in actlist: if a in st_action: if p is not st_actionp[a]: if not (a,m) in _actprint: log.debug(" ! %-15s [ %s ]",a,m) not_used = 1 _actprint[(a,m)] = 1 if not_used: log.debug("") # Construct the goto table for this state nkeys = { } for ii in I: for s in ii.usyms: if s in self.grammar.Nonterminals: nkeys[s] = None for n in nkeys: g = self.lr0_goto(I,n) j = self.lr0_cidhash.get(id(g),-1) if j >= 0: st_goto[n] = j log.info(" %-30s shift and go to state %d",n,j) action[st] = st_action actionp[st] = st_actionp goto[st] = st_goto st += 1 # ----------------------------------------------------------------------------- # write() # # This function writes the LR parsing tables to a file # ----------------------------------------------------------------------------- def write_table(self,modulename,outputdir='',signature=""): basemodulename = modulename.split(".")[-1] filename = os.path.join(outputdir,basemodulename) + ".py" try: f = open(filename,"w") f.write(""" # %s # This file is automatically generated. Do not edit. _tabversion = %r _lr_method = %r _lr_signature = %r """ % (filename, __tabversion__, self.lr_method, signature)) # Change smaller to 0 to go back to original tables smaller = 1 # Factor out names to try and make smaller if smaller: items = { } for s,nd in self.lr_action.items(): for name,v in nd.items(): i = items.get(name) if not i: i = ([],[]) items[name] = i i[0].append(s) i[1].append(v) f.write("\n_lr_action_items = {") for k,v in items.items(): f.write("%r:([" % k) for i in v[0]: f.write("%r," % i) f.write("],[") for i in v[1]: f.write("%r," % i) f.write("]),") f.write("}\n") f.write(""" _lr_action = { } for _k, _v in _lr_action_items.items(): for _x,_y in zip(_v[0],_v[1]): if not _x in _lr_action: _lr_action[_x] = { } _lr_action[_x][_k] = _y del _lr_action_items """) else: f.write("\n_lr_action = { "); for k,v in self.lr_action.items(): f.write("(%r,%r):%r," % (k[0],k[1],v)) f.write("}\n"); if smaller: # Factor out names to try and make smaller items = { } for s,nd in self.lr_goto.items(): for name,v in nd.items(): i = items.get(name) if not i: i = ([],[]) items[name] = i i[0].append(s) i[1].append(v) f.write("\n_lr_goto_items = {") for k,v in items.items(): f.write("%r:([" % k) for i in v[0]: f.write("%r," % i) f.write("],[") for i in v[1]: f.write("%r," % i) f.write("]),") f.write("}\n") f.write(""" _lr_goto = { } for _k, _v in _lr_goto_items.items(): for _x,_y in zip(_v[0],_v[1]): if not _x in _lr_goto: _lr_goto[_x] = { } _lr_goto[_x][_k] = _y del _lr_goto_items """) else: f.write("\n_lr_goto = { "); for k,v in self.lr_goto.items(): f.write("(%r,%r):%r," % (k[0],k[1],v)) f.write("}\n"); # Write production table f.write("_lr_productions = [\n") for p in self.lr_productions: if p.func: f.write(" (%r,%r,%d,%r,%r,%d),\n" % (p.str,p.name, p.len, p.func,p.file,p.line)) else: f.write(" (%r,%r,%d,None,None,None),\n" % (str(p),p.name, p.len)) f.write("]\n") f.close() except IOError: e = sys.exc_info()[1] sys.stderr.write("Unable to create '%s'\n" % filename) sys.stderr.write(str(e)+"\n") return # ----------------------------------------------------------------------------- # pickle_table() # # This function pickles the LR parsing tables to a supplied file object # ----------------------------------------------------------------------------- def pickle_table(self,filename,signature=""): try: import cPickle as pickle except ImportError: import pickle outf = open(filename,"wb") pickle.dump(__tabversion__,outf,pickle_protocol) pickle.dump(self.lr_method,outf,pickle_protocol) pickle.dump(signature,outf,pickle_protocol) pickle.dump(self.lr_action,outf,pickle_protocol) pickle.dump(self.lr_goto,outf,pickle_protocol) outp = [] for p in self.lr_productions: if p.func: outp.append((p.str,p.name, p.len, p.func,p.file,p.line)) else: outp.append((str(p),p.name,p.len,None,None,None)) pickle.dump(outp,outf,pickle_protocol) outf.close() # ----------------------------------------------------------------------------- # === INTROSPECTION === # # The following functions and classes are used to implement the PLY # introspection features followed by the yacc() function itself. # ----------------------------------------------------------------------------- # ----------------------------------------------------------------------------- # get_caller_module_dict() # # This function returns a dictionary containing all of the symbols defined within # a caller further down the call stack. This is used to get the environment # associated with the yacc() call if none was provided. # ----------------------------------------------------------------------------- def get_caller_module_dict(levels): try: raise RuntimeError except RuntimeError: e,b,t = sys.exc_info() f = t.tb_frame while levels > 0: f = f.f_back levels -= 1 ldict = f.f_globals.copy() if f.f_globals != f.f_locals: ldict.update(f.f_locals) return ldict # ----------------------------------------------------------------------------- # parse_grammar() # # This takes a raw grammar rule string and parses it into production data # ----------------------------------------------------------------------------- def parse_grammar(doc,file,line): grammar = [] # Split the doc string into lines pstrings = doc.splitlines() lastp = None dline = line for ps in pstrings: dline += 1 p = ps.split() if not p: continue try: if p[0] == '|': # This is a continuation of a previous rule if not lastp: raise SyntaxError("%s:%d: Misplaced '|'" % (file,dline)) prodname = lastp syms = p[1:] else: prodname = p[0] lastp = prodname syms = p[2:] assign = p[1] if assign != ':' and assign != '::=': raise SyntaxError("%s:%d: Syntax error. Expected ':'" % (file,dline)) grammar.append((file,dline,prodname,syms)) except SyntaxError: raise except Exception: raise SyntaxError("%s:%d: Syntax error in rule '%s'" % (file,dline,ps.strip())) return grammar # ----------------------------------------------------------------------------- # ParserReflect() # # This class represents information extracted for building a parser including # start symbol, error function, tokens, precedence list, action functions, # etc. # ----------------------------------------------------------------------------- class ParserReflect(object): def __init__(self,pdict,log=None): self.pdict = pdict self.start = None self.error_func = None self.tokens = None self.files = {} self.grammar = [] self.error = 0 if log is None: self.log = PlyLogger(sys.stderr) else: self.log = log # Get all of the basic information def get_all(self): self.get_start() self.get_error_func() self.get_tokens() self.get_precedence() self.get_pfunctions() # Validate all of the information def validate_all(self): self.validate_start() self.validate_error_func() self.validate_tokens() self.validate_precedence() self.validate_pfunctions() self.validate_files() return self.error # Compute a signature over the grammar def signature(self): try: from hashlib import md5 except ImportError: from md5 import md5 try: sig = md5() if self.start: sig.update(self.start.encode('latin-1')) if self.prec: sig.update("".join(["".join(p) for p in self.prec]).encode('latin-1')) if self.tokens: sig.update(" ".join(self.tokens).encode('latin-1')) for f in self.pfuncs: if f[3]: sig.update(f[3].encode('latin-1')) except (TypeError,ValueError): pass return sig.digest() # ----------------------------------------------------------------------------- # validate_file() # # This method checks to see if there are duplicated p_rulename() functions # in the parser module file. Without this function, it is really easy for # users to make mistakes by cutting and pasting code fragments (and it's a real # bugger to try and figure out why the resulting parser doesn't work). Therefore, # we just do a little regular expression pattern matching of def statements # to try and detect duplicates. # ----------------------------------------------------------------------------- def validate_files(self): # Match def p_funcname( fre = re.compile(r'\s*def\s+(p_[a-zA-Z_0-9]*)\(') for filename in self.files.keys(): base,ext = os.path.splitext(filename) if ext != '.py': return 1 # No idea. Assume it's okay. try: f = open(filename) lines = f.readlines() f.close() except IOError: continue counthash = { } for linen,l in enumerate(lines): linen += 1 m = fre.match(l) if m: name = m.group(1) prev = counthash.get(name) if not prev: counthash[name] = linen else: self.log.warning("%s:%d: Function %s redefined. Previously defined on line %d", filename,linen,name,prev) # Get the start symbol def get_start(self): self.start = self.pdict.get('start') # Validate the start symbol def validate_start(self): if self.start is not None: if not isinstance(self.start,str): self.log.error("'start' must be a string") # Look for error handler def get_error_func(self): self.error_func = self.pdict.get('p_error') # Validate the error function def validate_error_func(self): if self.error_func: if isinstance(self.error_func,types.FunctionType): ismethod = 0 elif isinstance(self.error_func, types.MethodType): ismethod = 1 else: self.log.error("'p_error' defined, but is not a function or method") self.error = 1 return eline = func_code(self.error_func).co_firstlineno efile = func_code(self.error_func).co_filename self.files[efile] = 1 if (func_code(self.error_func).co_argcount != 1+ismethod): self.log.error("%s:%d: p_error() requires 1 argument",efile,eline) self.error = 1 # Get the tokens map def get_tokens(self): tokens = self.pdict.get("tokens",None) if not tokens: self.log.error("No token list is defined") self.error = 1 return if not isinstance(tokens,(list, tuple)): self.log.error("tokens must be a list or tuple") self.error = 1 return if not tokens: self.log.error("tokens is empty") self.error = 1 return self.tokens = tokens # Validate the tokens def validate_tokens(self): # Validate the tokens. if 'error' in self.tokens: self.log.error("Illegal token name 'error'. Is a reserved word") self.error = 1 return terminals = {} for n in self.tokens: if n in terminals: self.log.warning("Token '%s' multiply defined", n) terminals[n] = 1 # Get the precedence map (if any) def get_precedence(self): self.prec = self.pdict.get("precedence",None) # Validate and parse the precedence map def validate_precedence(self): preclist = [] if self.prec: if not isinstance(self.prec,(list,tuple)): self.log.error("precedence must be a list or tuple") self.error = 1 return for level,p in enumerate(self.prec): if not isinstance(p,(list,tuple)): self.log.error("Bad precedence table") self.error = 1 return if len(p) < 2: self.log.error("Malformed precedence entry %s. Must be (assoc, term, ..., term)",p) self.error = 1 return assoc = p[0] if not isinstance(assoc,str): self.log.error("precedence associativity must be a string") self.error = 1 return for term in p[1:]: if not isinstance(term,str): self.log.error("precedence items must be strings") self.error = 1 return preclist.append((term,assoc,level+1)) self.preclist = preclist # Get all p_functions from the grammar def get_pfunctions(self): p_functions = [] for name, item in self.pdict.items(): if name[:2] != 'p_': continue if name == 'p_error': continue if isinstance(item,(types.FunctionType,types.MethodType)): line = func_code(item).co_firstlineno file = func_code(item).co_filename p_functions.append((line,file,name,item.__doc__)) # Sort all of the actions by line number p_functions.sort() self.pfuncs = p_functions # Validate all of the p_functions def validate_pfunctions(self): grammar = [] # Check for non-empty symbols if len(self.pfuncs) == 0: self.log.error("no rules of the form p_rulename are defined") self.error = 1 return for line, file, name, doc in self.pfuncs: func = self.pdict[name] if isinstance(func, types.MethodType): reqargs = 2 else: reqargs = 1 if func_code(func).co_argcount > reqargs: self.log.error("%s:%d: Rule '%s' has too many arguments",file,line,func.__name__) self.error = 1 elif func_code(func).co_argcount < reqargs: self.log.error("%s:%d: Rule '%s' requires an argument",file,line,func.__name__) self.error = 1 elif not func.__doc__: self.log.warning("%s:%d: No documentation string specified in function '%s' (ignored)",file,line,func.__name__) else: try: parsed_g = parse_grammar(doc,file,line) for g in parsed_g: grammar.append((name, g)) except SyntaxError: e = sys.exc_info()[1] self.log.error(str(e)) self.error = 1 # Looks like a valid grammar rule # Mark the file in which defined. self.files[file] = 1 # Secondary validation step that looks for p_ definitions that are not functions # or functions that look like they might be grammar rules. for n,v in self.pdict.items(): if n[0:2] == 'p_' and isinstance(v, (types.FunctionType, types.MethodType)): continue if n[0:2] == 't_': continue if n[0:2] == 'p_' and n != 'p_error': self.log.warning("'%s' not defined as a function", n) if ((isinstance(v,types.FunctionType) and func_code(v).co_argcount == 1) or (isinstance(v,types.MethodType) and func_code(v).co_argcount == 2)): try: doc = v.__doc__.split(" ") if doc[1] == ':': self.log.warning("%s:%d: Possible grammar rule '%s' defined without p_ prefix", func_code(v).co_filename, func_code(v).co_firstlineno,n) except Exception: pass self.grammar = grammar # ----------------------------------------------------------------------------- # yacc(module) # # Build a parser # ----------------------------------------------------------------------------- def yacc(method='LALR', debug=yaccdebug, module=None, tabmodule=tab_module, start=None, check_recursion=1, optimize=0, write_tables=1, debugfile=debug_file,outputdir='', debuglog=None, errorlog = None, picklefile=None): global parse # Reference to the parsing method of the last built parser # If pickling is enabled, table files are not created if picklefile: write_tables = 0 if errorlog is None: errorlog = PlyLogger(sys.stderr) # Get the module dictionary used for the parser if module: _items = [(k,getattr(module,k)) for k in dir(module)] pdict = dict(_items) else: pdict = get_caller_module_dict(2) # Collect parser information from the dictionary pinfo = ParserReflect(pdict,log=errorlog) pinfo.get_all() if pinfo.error: raise YaccError("Unable to build parser") # Check signature against table files (if any) signature = pinfo.signature() # Read the tables try: lr = LRTable() if picklefile: read_signature = lr.read_pickle(picklefile) else: read_signature = lr.read_table(tabmodule) if optimize or (read_signature == signature): try: lr.bind_callables(pinfo.pdict) parser = LRParser(lr,pinfo.error_func) parse = parser.parse return parser except Exception: e = sys.exc_info()[1] errorlog.warning("There was a problem loading the table file: %s", repr(e)) except VersionError: e = sys.exc_info() errorlog.warning(str(e)) except Exception: pass if debuglog is None: if debug: debuglog = PlyLogger(open(debugfile,"w")) else: debuglog = NullLogger() debuglog.info("Created by PLY version %s (http://www.dabeaz.com/ply)", __version__) errors = 0 # Validate the parser information if pinfo.validate_all(): raise YaccError("Unable to build parser") if not pinfo.error_func: errorlog.warning("no p_error() function is defined") # Create a grammar object grammar = Grammar(pinfo.tokens) # Set precedence level for terminals for term, assoc, level in pinfo.preclist: try: grammar.set_precedence(term,assoc,level) except GrammarError: e = sys.exc_info()[1] errorlog.warning("%s",str(e)) # Add productions to the grammar for funcname, gram in pinfo.grammar: file, line, prodname, syms = gram try: grammar.add_production(prodname,syms,funcname,file,line) except GrammarError: e = sys.exc_info()[1] errorlog.error("%s",str(e)) errors = 1 # Set the grammar start symbols try: if start is None: grammar.set_start(pinfo.start) else: grammar.set_start(start) except GrammarError: e = sys.exc_info()[1] errorlog.error(str(e)) errors = 1 if errors: raise YaccError("Unable to build parser") # Verify the grammar structure undefined_symbols = grammar.undefined_symbols() for sym, prod in undefined_symbols: errorlog.error("%s:%d: Symbol '%s' used, but not defined as a token or a rule",prod.file,prod.line,sym) errors = 1 unused_terminals = grammar.unused_terminals() if unused_terminals: debuglog.info("") debuglog.info("Unused terminals:") debuglog.info("") for term in unused_terminals: errorlog.warning("Token '%s' defined, but not used", term) debuglog.info(" %s", term) # Print out all productions to the debug log if debug: debuglog.info("") debuglog.info("Grammar") debuglog.info("") for n,p in enumerate(grammar.Productions): debuglog.info("Rule %-5d %s", n, p) # Find unused non-terminals unused_rules = grammar.unused_rules() for prod in unused_rules: errorlog.warning("%s:%d: Rule '%s' defined, but not used", prod.file, prod.line, prod.name) if len(unused_terminals) == 1: errorlog.warning("There is 1 unused token") if len(unused_terminals) > 1: errorlog.warning("There are %d unused tokens", len(unused_terminals)) if len(unused_rules) == 1: errorlog.warning("There is 1 unused rule") if len(unused_rules) > 1: errorlog.warning("There are %d unused rules", len(unused_rules)) if debug: debuglog.info("") debuglog.info("Terminals, with rules where they appear") debuglog.info("") terms = list(grammar.Terminals) terms.sort() for term in terms: debuglog.info("%-20s : %s", term, " ".join([str(s) for s in grammar.Terminals[term]])) debuglog.info("") debuglog.info("Nonterminals, with rules where they appear") debuglog.info("") nonterms = list(grammar.Nonterminals) nonterms.sort() for nonterm in nonterms: debuglog.info("%-20s : %s", nonterm, " ".join([str(s) for s in grammar.Nonterminals[nonterm]])) debuglog.info("") if check_recursion: unreachable = grammar.find_unreachable() for u in unreachable: errorlog.warning("Symbol '%s' is unreachable",u) infinite = grammar.infinite_cycles() for inf in infinite: errorlog.error("Infinite recursion detected for symbol '%s'", inf) errors = 1 unused_prec = grammar.unused_precedence() for term, assoc in unused_prec: errorlog.error("Precedence rule '%s' defined for unknown symbol '%s'", assoc, term) errors = 1 if errors: raise YaccError("Unable to build parser") # Run the LRGeneratedTable on the grammar if debug: errorlog.debug("Generating %s tables", method) lr = LRGeneratedTable(grammar,method,debuglog) if debug: num_sr = len(lr.sr_conflicts) # Report shift/reduce and reduce/reduce conflicts if num_sr == 1: errorlog.warning("1 shift/reduce conflict") elif num_sr > 1: errorlog.warning("%d shift/reduce conflicts", num_sr) num_rr = len(lr.rr_conflicts) if num_rr == 1: errorlog.warning("1 reduce/reduce conflict") elif num_rr > 1: errorlog.warning("%d reduce/reduce conflicts", num_rr) # Write out conflicts to the output file if debug and (lr.sr_conflicts or lr.rr_conflicts): debuglog.warning("") debuglog.warning("Conflicts:") debuglog.warning("") for state, tok, resolution in lr.sr_conflicts: debuglog.warning("shift/reduce conflict for %s in state %d resolved as %s", tok, state, resolution) already_reported = {} for state, rule, rejected in lr.rr_conflicts: if (state,id(rule),id(rejected)) in already_reported: continue debuglog.warning("reduce/reduce conflict in state %d resolved using rule (%s)", state, rule) debuglog.warning("rejected rule (%s) in state %d", rejected,state) errorlog.warning("reduce/reduce conflict in state %d resolved using rule (%s)", state, rule) errorlog.warning("rejected rule (%s) in state %d", rejected, state) already_reported[state,id(rule),id(rejected)] = 1 warned_never = [] for state, rule, rejected in lr.rr_conflicts: if not rejected.reduced and (rejected not in warned_never): debuglog.warning("Rule (%s) is never reduced", rejected) errorlog.warning("Rule (%s) is never reduced", rejected) warned_never.append(rejected) # Write the table file if requested if write_tables: lr.write_table(tabmodule,outputdir,signature) # Write a pickled version of the tables if picklefile: lr.pickle_table(picklefile,signature) # Build the parser lr.bind_callables(pinfo.pdict) parser = LRParser(lr,pinfo.error_func) parse = parser.parse return parser enigmail-2.0.8/util/run-jsunit000077500000000000000000000015001334302754500163310ustar00rootroot00000000000000#!/bin/sh # Wrapper script for running jsunit test # 1: path to perl exe # 2: to perl thunderbird exe # 3 - n parameters to thunderbird TMPFILE=jsunit.result perlpath=$1 tbpath=$2 shift 2 PL_PATH=${perlpath} "${tbpath}" "$@" | tee ${TMPFILE} echo "" if [ `grep -c "^TestResult: failed : 0" ${TMPFILE}` -eq 0 ]; then echo "=========================================" echo "Tests failed" echo "Testfile: "`pwd`"/${TMPFILE}" echo "=========================================" echo "" #grep -v Succeed ${TMPFILE} egrep 'TestResult:|Error:|Succeed.*OK|Executing sub-test' ${TMPFILE} echo "" echo "Testfile: "`pwd`"/${TMPFILE}" res=1 else echo "=========================================" echo "All tests succeeded" echo "=========================================" rm -f ${TMPFILE} res=0 fi exit ${res} enigmail-2.0.8/util/run-tests.py000077500000000000000000000155531334302754500166230ustar00rootroot00000000000000#!/usr/bin/env python # # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. # from __future__ import print_function import sys import os import subprocess import select import re import random class TestRunner: IGNORED_TESTS = ['./ipc/tests'] TEST_OUTPUT_FILE = 'test_output.log' @staticmethod def is_test_file(file): return file.endswith("-test.js") @staticmethod def is_ignored(root, file): for ign in TestRunner.IGNORED_TESTS: if os.path.join(root, file).startswith(ign): return True return False @staticmethod def all_tests(): for root, dirs, files in os.walk("."): for file in files: if TestRunner.is_test_file(file) and not TestRunner.is_ignored(root, file): yield os.path.join(root, file) def __init__(self, tbpath, tests): self.tbpath = tbpath self.tests = tests def reset_total(self): self.total_executed = 0 self.total_succeeded = 0 self.total_failed = 0 def reset_stats(self): self.executed = 0 self.succeeded = 0 self.failed = 0 def run(self): with open(TestRunner.TEST_OUTPUT_FILE, 'w') as test_output: self.test_output = test_output self.reset_total() for t in self.tests: self.run_test(t) return (self.total_executed, self.total_succeeded, self.total_failed) def start_poll(self, tsk): poll = select.poll() poll.register(tsk.stdout,select.POLLIN | select.POLLHUP) poll.register(tsk.stderr,select.POLLIN | select.POLLHUP) return poll def check_output(self, rfd, std, on): if rfd == std.fileno(): line = std.readline() if len(line) > 0: on(line[:-1]) def poll(self, pollc, events, poll, tsk, on_stdout, on_stderr): for event in events: (rfd,event) = event if event & select.POLLIN: self.check_output(rfd, tsk.stdout, on_stdout) self.check_output(rfd, tsk.stderr, on_stderr) if event & select.POLLHUP: poll.unregister(rfd) pollc = pollc - 1 if pollc > 0: events = poll.poll() return (pollc, events) def polling(self, tsk, on_stdout, on_stderr): pollc = 2 poll = self.start_poll(tsk) events = poll.poll() while pollc > 0 and len(events) > 0: (pollc, events) = self.poll(pollc, events, poll, tsk, on_stdout, on_stderr) return tsk.wait() def is_jsunit(self, str): return str.startswith("TestResult: ") or str.startswith("AssertionError: ") or str.startswith("RuntimeError: ") def extract_number(self, str): return int(re.search('\d+', str).group(0)) def analyze_output(self, str): if str.startswith("TestResult: executed :"): self.executed = self.extract_number(str) elif str.startswith("TestResult: succeeded:"): self.succeeded = self.extract_number(str) elif str.startswith("TestResult: failed :"): self.failed = self.extract_number(str) elif str.startswith("Succeed: "): pass else: print(str) def write_to_log(self): def ret(str): if self.test_output: self.test_output.write(str + "\n") self.test_output.flush() return ret def combine(self, left, right): def ret(str): left(str) right(str) return ret def reporting(self): def ret(str): if self.is_jsunit(str): self.analyze_output(str) return ret def add_stats(self): self.total_executed = self.total_executed + self.executed self.total_succeeded = self.total_succeeded + self.succeeded self.total_failed = self.total_failed + self.failed def spin_test(self, dir_name, tmp_file): tsk = subprocess.Popen([self.tbpath, '-jsunit', os.path.basename(tmp_file)], stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=dir_name) ret = self.polling(tsk, self.combine(self.write_to_log(), self.reporting()), self.write_to_log()) self.add_stats() return ret def run_test(self, t): test_name = os.path.basename(t) dir_name = os.path.dirname(t) tmp_file = t.replace(".js", "-loader.js") print("running", t, test_name) self.reset_stats() try: with open(tmp_file, 'w') as f: f.write("do_subtest(\"" + test_name + "\");\n") return self.spin_test(dir_name, tmp_file) finally: os.remove(tmp_file) class OptionsEvaluator: SEED_OPTION = ['--seed=', '-s='] HELP_OPTION = ['-h', '--help'] @staticmethod def print_help(): print('Usage: run-tests.py [OPTION] [PATH TO TEST FILES]') print('') print('By default, this will run all the tests in random order based on a seed, which will be printed before the tests. You can rerun an order by using the -seed option below.') print(' [OPTIONS]') print(' --seed=\t Specify a seed to get the same shuffle order more than once') print(' -h, --help\t Print usage') @staticmethod def random_shuffle(seed, tests): if seed: random.seed(seed) else: seed = random.randint(0, sys.maxsize) random.seed(seed) print("Seed used for random shuffle: %d" % seed) random.shuffle(tests) return tests def evaluate(self): for op in OptionsEvaluator.HELP_OPTION: if op in sys.argv: self.print_help() sys.exit(1) if len(sys.argv) == 1: return OptionsEvaluator.random_shuffle(False, [f for f in TestRunner.all_tests()]) elif len(sys.argv) == 2: tests = [f for f in TestRunner.all_tests()] elif len(sys.argv) > 2: tests = [f for f in sys.argv[2:]] if self.grab_seed(): return OptionsEvaluator.random_shuffle(self.grab_seed(), tests) else: return OptionsEvaluator.random_shuffle(False, [f for f in sys.argv[1:]]) def grab_seed(self): for op in OptionsEvaluator.SEED_OPTION: for arg in sys.argv: if op in arg: return arg.split(op)[1] return False if __name__ == '__main__': tbpath = os.environ.get('TB_PATH', '/usr/bin/thunderbird') tests = OptionsEvaluator().evaluate() (ran, suc, fail) = TestRunner(tbpath, tests).run() print("Ran " + str(ran) + " tests") if fail > 0: print(" Had " + str(fail) + " failures") sys.exit(1) enigmail-2.0.8/util/typelib.py000066400000000000000000000270331334302754500163200ustar00rootroot00000000000000#!/usr/bin/env python # typelib.py - Generate XPCOM typelib files from IDL. # # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. """Generate an XPIDL typelib for the IDL files specified on the command line""" import os import sys import xpidl, xpt # A map of xpidl.py types to xpt.py types TypeMap = { # nsresult is not strictly an xpidl.py type, but it's useful here 'nsresult': xpt.Type.Tags.uint32, # builtins 'boolean': xpt.Type.Tags.boolean, 'void': xpt.Type.Tags.void, 'int16_t': xpt.Type.Tags.int16, 'int32_t': xpt.Type.Tags.int32, 'int64_t': xpt.Type.Tags.int64, 'uint8_t': xpt.Type.Tags.uint8, 'uint16_t': xpt.Type.Tags.uint16, 'uint32_t': xpt.Type.Tags.uint32, 'uint64_t': xpt.Type.Tags.uint64, 'octet': xpt.Type.Tags.uint8, 'short': xpt.Type.Tags.int16, 'long': xpt.Type.Tags.int32, 'long long': xpt.Type.Tags.int64, 'unsigned short': xpt.Type.Tags.uint16, 'unsigned long': xpt.Type.Tags.uint32, 'unsigned long long': xpt.Type.Tags.uint64, 'float': xpt.Type.Tags.float, 'double': xpt.Type.Tags.double, 'char': xpt.Type.Tags.char, 'string': xpt.Type.Tags.char_ptr, 'wchar': xpt.Type.Tags.wchar_t, 'wstring': xpt.Type.Tags.wchar_t_ptr, # special types 'nsid': xpt.Type.Tags.nsIID, 'domstring': xpt.Type.Tags.DOMString, 'astring': xpt.Type.Tags.AString, 'utf8string': xpt.Type.Tags.UTF8String, 'cstring': xpt.Type.Tags.CString, 'jsval': xpt.Type.Tags.jsval } # XXXkhuey dipper types should go away (bug 677784) def isDipperType(type): return type == xpt.Type.Tags.DOMString or type == xpt.Type.Tags.AString or type == xpt.Type.Tags.CString or type == xpt.Type.Tags.UTF8String def build_interface(iface, ifaces): def get_type(type, calltype, iid_is=None, size_is=None): """ Return the appropriate xpt.Type object for this param """ while isinstance(type, xpidl.Typedef): type = type.realtype if isinstance(type, xpidl.Builtin): if type.name == 'string' and size_is != None: return xpt.StringWithSizeType(size_is, size_is) elif type.name == 'wstring' and size_is != None: return xpt.WideStringWithSizeType(size_is, size_is) else: tag = TypeMap[type.name] isPtr = (tag == xpt.Type.Tags.char_ptr or tag == xpt.Type.Tags.wchar_t_ptr) return xpt.SimpleType(tag, pointer=isPtr, reference=False) if isinstance(type, xpidl.Array): # NB: For an Array we pass down the iid_is to get the type of T. # This allows Arrays of InterfaceIs types to work. return xpt.ArrayType(get_type(type.type, calltype, iid_is), size_is, #XXXkhuey length_is duplicates size_is (bug 677788), size_is) if isinstance(type, xpidl.Interface) or isinstance(type, xpidl.Forward): xptiface = None for i in ifaces: if i.name == type.name: xptiface = i if not xptiface: xptiface = xpt.Interface(name=type.name) ifaces.append(xptiface) return xpt.InterfaceType(xptiface) if isinstance(type, xpidl.Native): if type.specialtype: # XXXkhuey jsval is marked differently in the typelib and in the headers :-( isPtr = (type.isPtr(calltype) or type.isRef(calltype)) and not type.specialtype == 'jsval' isRef = type.isRef(calltype) and not type.specialtype == 'jsval' return xpt.SimpleType(TypeMap[type.specialtype], pointer=isPtr, reference=isRef) elif iid_is != None: return xpt.InterfaceIsType(iid_is) else: # void ptr return xpt.SimpleType(TypeMap['void'], pointer=True, reference=False) raise Exception("Unknown type!") def get_nsresult(): return xpt.SimpleType(TypeMap['nsresult']) def build_nsresult_param(): return xpt.Param(get_nsresult()) def get_result_type(m): if not m.notxpcom: return get_nsresult() return get_type(m.realtype, '') def build_result_param(m): return xpt.Param(get_result_type(m)) def build_retval_param(m): type = get_type(m.realtype, 'out') if isDipperType(type.tag): # NB: The retval bit needs to be set here, contrary to what the # xpt spec says. return xpt.Param(type, in_=True, retval=True, dipper=True) return xpt.Param(type, in_=False, out=True, retval=True) def build_attr_param(a, getter=False, setter=False): if not (getter or setter): raise Exception("Attribute param must be for a getter or a setter!") type = get_type(a.realtype, getter and 'out' or 'in') if setter: return xpt.Param(type) else: if isDipperType(type.tag): # NB: The retval bit needs to be set here, contrary to what the # xpt spec says. return xpt.Param(type, in_=True, retval=True, dipper=True) return xpt.Param(type, in_=False, out=True, retval=True) if iface.namemap is None: raise Exception("Interface was not resolved.") consts = [] methods = [] def build_const(c): consts.append(xpt.Constant(c.name, get_type(c.basetype, ''), c.getValue())) def build_method(m): params = [] def build_param(p): def findattr(p, attr): if hasattr(p, attr) and getattr(p, attr): for i, param in enumerate(m.params): if param.name == getattr(p, attr): return i return None iid_is = findattr(p, 'iid_is') size_is = findattr(p, 'size_is') in_ = p.paramtype.count("in") out = p.paramtype.count("out") dipper = False type = get_type(p.realtype, p.paramtype, iid_is=iid_is, size_is=size_is) if out and isDipperType(type.tag): out = False dipper = True return xpt.Param(type, in_, out, p.retval, p.shared, dipper, p.optional) for p in m.params: params.append(build_param(p)) if not m.notxpcom and m.realtype.name != 'void': params.append(build_retval_param(m)) methods.append(xpt.Method(m.name, build_result_param(m), params, getter=False, setter=False, notxpcom=m.notxpcom, constructor=False, hidden=m.noscript, optargc=m.optional_argc, implicit_jscontext=m.implicit_jscontext)) def build_attr(a): # Write the getter methods.append(xpt.Method(a.name, build_nsresult_param(), [build_attr_param(a, getter=True)], getter=True, setter=False, constructor=False, hidden=a.noscript, optargc=False, implicit_jscontext=a.implicit_jscontext)) # And maybe the setter if not a.readonly: methods.append(xpt.Method(a.name, build_nsresult_param(), [build_attr_param(a, setter=True)], getter=False, setter=True, constructor=False, hidden=a.noscript, optargc=False, implicit_jscontext=a.implicit_jscontext)) for member in iface.members: if isinstance(member, xpidl.ConstMember): build_const(member) elif isinstance(member, xpidl.Attribute): build_attr(member) elif isinstance(member, xpidl.Method): build_method(member) elif isinstance(member, xpidl.CDATA): pass else: raise Exception("Unexpected interface member: %s" % member) parent = None if iface.base: for i in ifaces: if i.name == iface.base: parent = i if not parent: parent = xpt.Interface(name=iface.base) ifaces.append(parent) return xpt.Interface(iface.name, iface.attributes.uuid, methods=methods, constants=consts, resolved=True, parent=parent, scriptable=iface.attributes.scriptable, function=iface.attributes.function, builtinclass=iface.attributes.builtinclass) def write_typelib(idl, fd, filename): """ Generate the typelib. """ # We only care about interfaces ifaces = [] for p in idl.productions: if p.kind == 'interface': ifaces.append(build_interface(p, ifaces)) typelib = xpt.Typelib(interfaces=ifaces) typelib.writefd(fd) if __name__ == '__main__': from optparse import OptionParser o = OptionParser() o.add_option('-I', action='append', dest='incdirs', default=['.'], help="Directory to search for imported files") o.add_option('--cachedir', dest='cachedir', default=None, help="Directory in which to cache lex/parse tables.") o.add_option('-o', dest='outfile', default=None, help="Output file") o.add_option('-d', dest='depfile', default=None, help="Generate a make dependency file") o.add_option('--regen', action='store_true', dest='regen', default=False, help="Regenerate IDL Parser cache") options, args = o.parse_args() file = args[0] if args else None if options.cachedir is not None: if not os.path.isdir(options.cachedir): os.mkdir(options.cachedir) sys.path.append(options.cachedir) if options.regen: if options.cachedir is None: print >>sys.stderr, "--regen requires --cachedir" sys.exit(1) p = xpidl.IDLParser(outputdir=options.cachedir, regen=True) sys.exit(0) if options.depfile is not None and options.outfile is None: print >>sys.stderr, "-d requires -o" sys.exit(1) if options.outfile is not None: outfd = open(options.outfile, 'wb') closeoutfd = True else: raise "typelib generation requires an output file" p = xpidl.IDLParser(outputdir=options.cachedir) idl = p.parse(open(file).read(), filename=file) idl.resolve(options.incdirs, p) write_typelib(idl, outfd, file) if closeoutfd: outfd.close() if options.depfile is not None: depfd = open(options.depfile, 'w') deps = [dep.replace('\\', '/') for dep in idl.deps] print >>depfd, "%s: %s" % (options.outfile, " ".join(deps)) for dep in deps: print >>depfd, "%s:" % dep enigmail-2.0.8/util/utils.py000066400000000000000000000065651334302754500160170ustar00rootroot00000000000000# >>sys.stderr, This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. '''Utility methods to be used by python build infrastructure. ''' import os import errno import sys import time import stat class LockFile(object): '''LockFile is used by the lockFile method to hold the lock. This object should not be used directly, but only through the lockFile method below. ''' def __init__(self, lockfile): self.lockfile = lockfile def __del__(self): while True: try: os.remove(self.lockfile) break except OSError as e: if e.errno == errno.EACCES: # another process probably has the file open, we'll retry. # just a short sleep since we want to drop the lock ASAP # (but we need to let some other process close the file first) time.sleep(0.1) else: # re-raise unknown errors raise def lockFile(lockfile, max_wait = 600): '''Create and hold a lockfile of the given name, with the given timeout. To release the lock, delete the returned object. ''' while True: try: fd = os.open(lockfile, os.O_EXCL | os.O_RDWR | os.O_CREAT) # we created the lockfile, so we're the owner break except OSError as e: if (e.errno == errno.EEXIST or (sys.platform == "win32" and e.errno == errno.EACCES)): pass else: # should not occur raise try: # the lock file exists, try to stat it to get its age # and read its contents to report the owner PID f = open(lockfile, "r") s = os.stat(lockfile) except EnvironmentError as e: if e.errno == errno.ENOENT or e.errno == errno.EACCES: # we didn't create the lockfile, so it did exist, but it's # gone now. Just try again continue sys.exit("{0} exists but stat() failed: {1}" .format(lockfile, e.strerror)) # we didn't create the lockfile and it's still there, check # its age now = int(time.time()) if now - s[stat.ST_MTIME] > max_wait: pid = f.readline().rstrip() sys.exit("{0} has been locked for more than " "{1} seconds (PID {2})".format(lockfile, max_wait, pid)) # it's not been locked too long, wait a while and retry f.close() time.sleep(1) # if we get here. we have the lockfile. Convert the os.open file # descriptor into a Python file object and record our PID in it f = os.fdopen(fd, "w") f.write("{0}\n".format(os.getpid())) f.close() return LockFile(lockfile) class pushback_iter(object): '''Utility iterator that can deal with pushed back elements. This behaves like a regular iterable, just that you can call iter.pushback(item) to get the given item as next item in the iteration. ''' def __init__(self, iterable): self.it = iter(iterable) self.pushed_back = [] def __iter__(self): return self def __nonzero__(self): if self.pushed_back: return True try: self.pushed_back.insert(0, self.it.next()) except StopIteration: return False else: return True def next(self): if self.pushed_back: return self.pushed_back.pop() return self.it.next() def pushback(self, item): self.pushed_back.append(item) enigmail-2.0.8/util/xpidl.py000066400000000000000000001330431334302754500157670ustar00rootroot00000000000000#!/usr/bin/env python # xpidl.py - A parser for cross-platform IDL (XPIDL) files. # # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. """A parser for cross-platform IDL (XPIDL) files.""" import sys, os.path, re from ply import lex, yacc """A type conforms to the following pattern: def isScriptable(self): 'returns True or False' def nativeType(self, calltype): 'returns a string representation of the native type calltype must be 'in', 'out', or 'inout' Interface members const/method/attribute conform to the following pattern: name = 'string' def toIDL(self): 'returns the member signature as IDL' """ def attlistToIDL(attlist): if len(attlist) == 0: return '' attlist = list(attlist) attlist.sort(cmp=lambda a,b: cmp(a[0], b[0])) return '[%s] ' % ','.join(["%s%s" % (name, value is not None and '(%s)' % value or '') for name, value, aloc in attlist]) _paramsHardcode = { 2: ('array', 'shared', 'iid_is', 'size_is', 'retval'), 3: ('array', 'size_is', 'const'), } def paramAttlistToIDL(attlist): if len(attlist) == 0: return '' # Hack alert: g_hash_table_foreach is pretty much unimitatable... hardcode # quirk attlist = list(attlist) sorted = [] if len(attlist) in _paramsHardcode: for p in _paramsHardcode[len(attlist)]: i = 0 while i < len(attlist): if attlist[i][0] == p: sorted.append(attlist[i]) del attlist[i] continue i += 1 sorted.extend(attlist) return '[%s] ' % ', '.join(["%s%s" % (name, value is not None and ' (%s)' % value or '') for name, value, aloc in sorted]) def unaliasType(t): while t.kind == 'typedef': t = t.realtype assert t is not None return t def getBuiltinOrNativeTypeName(t): t = unaliasType(t) if t.kind == 'builtin': return t.name elif t.kind == 'native': assert t.specialtype is not None return '[%s]' % t.specialtype else: return None class BuiltinLocation(object): def get(self): return "" def __str__(self): return self.get() class Builtin(object): kind = 'builtin' location = BuiltinLocation def __init__(self, name, nativename, signed=False, maybeConst=False): self.name = name self.nativename = nativename self.signed = signed self.maybeConst = maybeConst def isScriptable(self): return True def nativeType(self, calltype, shared=False, const=False): if const: print >>sys.stderr, IDLError("[const] doesn't make sense on builtin types.", self.location, warning=True) const = 'const ' elif calltype == 'in' and self.nativename.endswith('*'): const = 'const ' elif shared: if not self.nativename.endswith('*'): raise IDLError("[shared] not applicable to non-pointer types.", self.location) const = 'const ' else: const = '' return "%s%s %s" % (const, self.nativename, calltype != 'in' and '*' or '') builtinNames = [ Builtin('boolean', 'bool'), Builtin('void', 'void'), Builtin('octet', 'uint8_t'), Builtin('short', 'int16_t', True, True), Builtin('long', 'int32_t', True, True), Builtin('long long', 'int64_t', True, False), Builtin('unsigned short', 'uint16_t', False, True), Builtin('unsigned long', 'uint32_t', False, True), Builtin('unsigned long long', 'uint64_t', False, False), Builtin('float', 'float', True, False), Builtin('double', 'double', True, False), Builtin('char', 'char', True, False), Builtin('string', 'char *', False, False), Builtin('wchar', 'char16_t', False, False), Builtin('wstring', 'char16_t *', False, False), ] builtinMap = {} for b in builtinNames: builtinMap[b.name] = b class Location(object): _line = None def __init__(self, lexer, lineno, lexpos): self._lineno = lineno self._lexpos = lexpos self._lexdata = lexer.lexdata self._file = getattr(lexer, 'filename', "") def __eq__(self, other): return self._lexpos == other._lexpos and \ self._file == other._file def resolve(self): if self._line: return startofline = self._lexdata.rfind('\n', 0, self._lexpos) + 1 endofline = self._lexdata.find('\n', self._lexpos, self._lexpos + 80) self._line = self._lexdata[startofline:endofline] self._colno = self._lexpos - startofline def pointerline(self): def i(): for i in xrange(0, self._colno): yield " " yield "^" return "".join(i()) def get(self): self.resolve() return "%s line %s:%s" % (self._file, self._lineno, self._colno) def __str__(self): self.resolve() return "%s line %s:%s\n%s\n%s" % (self._file, self._lineno, self._colno, self._line, self.pointerline()) class NameMap(object): """Map of name -> object. Each object must have a .name and .location property. Setting the same name twice throws an error.""" def __init__(self): self._d = {} def __getitem__(self, key): if key in builtinMap: return builtinMap[key] return self._d[key] def __iter__(self): return self._d.itervalues() def __contains__(self, key): return key in builtinMap or key in self._d def set(self, object): if object.name in builtinMap: raise IDLError("name '%s' is a builtin and cannot be redeclared" % (object.name), object.location) if object.name.startswith("_"): object.name = object.name[1:] if object.name in self._d: old = self._d[object.name] if old == object: return if isinstance(old, Forward) and isinstance(object, Interface): self._d[object.name] = object elif isinstance(old, Interface) and isinstance(object, Forward): pass else: raise IDLError("name '%s' specified twice. Previous location: %s" % (object.name, self._d[object.name].location), object.location) else: self._d[object.name] = object def get(self, id, location): try: return self[id] except KeyError: raise IDLError("Name '%s' not found", location) class IDLError(Exception): def __init__(self, message, location, warning=False): self.message = message self.location = location self.warning = warning def __str__(self): return "%s: %s, %s" % (self.warning and 'warning' or 'error', self.message, self.location) class Include(object): kind = 'include' def __init__(self, filename, location): self.filename = filename self.location = location def __str__(self): return "".join(["include '%s'\n" % self.filename]) def resolve(self, parent): def incfiles(): yield self.filename for dir in parent.incdirs: yield os.path.join(dir, self.filename) for file in incfiles(): if not os.path.exists(file): continue self.IDL = parent.parser.parse(open(file).read(), filename=file) self.IDL.resolve(parent.incdirs, parent.parser) for type in self.IDL.getNames(): parent.setName(type) parent.deps.extend(self.IDL.deps) return raise IDLError("File '%s' not found" % self.filename, self.location) class IDL(object): def __init__(self, productions): self.productions = productions self.deps = [] def setName(self, object): self.namemap.set(object) def getName(self, id, location): try: return self.namemap[id] except KeyError: raise IDLError("type '%s' not found" % id, location) def hasName(self, id): return id in self.namemap def getNames(self): return iter(self.namemap) def __str__(self): return "".join([str(p) for p in self.productions]) def resolve(self, incdirs, parser): self.namemap = NameMap() self.incdirs = incdirs self.parser = parser for p in self.productions: p.resolve(self) def includes(self): for p in self.productions: if p.kind == 'include': yield p def needsJSTypes(self): for p in self.productions: if p.kind == 'interface' and p.needsJSTypes(): return True return False class CDATA(object): kind = 'cdata' _re = re.compile(r'\n+') def __init__(self, data, location): self.data = self._re.sub('\n', data) self.location = location def resolve(self, parent): pass def __str__(self): return "cdata: %s\n\t%r\n" % (self.location.get(), self.data) def count(self): return 0 class Typedef(object): kind = 'typedef' def __init__(self, type, name, location, doccomments): self.type = type self.name = name self.location = location self.doccomments = doccomments def __eq__(self, other): return self.name == other.name and self.type == other.type def resolve(self, parent): parent.setName(self) self.realtype = parent.getName(self.type, self.location) def isScriptable(self): return self.realtype.isScriptable() def nativeType(self, calltype): return "%s %s" % (self.name, calltype != 'in' and '*' or '') def __str__(self): return "typedef %s %s\n" % (self.type, self.name) class Forward(object): kind = 'forward' def __init__(self, name, location, doccomments): self.name = name self.location = location self.doccomments = doccomments def __eq__(self, other): return other.kind == 'forward' and other.name == self.name def resolve(self, parent): # Hack alert: if an identifier is already present, move the doccomments # forward. if parent.hasName(self.name): for i in xrange(0, len(parent.productions)): if parent.productions[i] is self: break for i in xrange(i + 1, len(parent.productions)): if hasattr(parent.productions[i], 'doccomments'): parent.productions[i].doccomments[0:0] = self.doccomments break parent.setName(self) def isScriptable(self): return True def nativeType(self, calltype): return "%s %s" % (self.name, calltype != 'in' and '* *' or '*') def __str__(self): return "forward-declared %s\n" % self.name class Native(object): kind = 'native' modifier = None specialtype = None specialtypes = { 'nsid': None, 'domstring': 'nsAString', 'utf8string': 'nsACString', 'cstring': 'nsACString', 'astring': 'nsAString', 'jsval': 'JS::Value' } def __init__(self, name, nativename, attlist, location): self.name = name self.nativename = nativename self.location = location for name, value, aloc in attlist: if value is not None: raise IDLError("Unexpected attribute value", aloc) if name in ('ptr', 'ref'): if self.modifier is not None: raise IDLError("More than one ptr/ref modifier", aloc) self.modifier = name elif name in self.specialtypes.keys(): if self.specialtype is not None: raise IDLError("More than one special type", aloc) self.specialtype = name if self.specialtypes[name] is not None: self.nativename = self.specialtypes[name] else: raise IDLError("Unexpected attribute", aloc) def __eq__(self, other): return self.name == other.name and \ self.nativename == other.nativename and \ self.modifier == other.modifier and \ self.specialtype == other.specialtype def resolve(self, parent): parent.setName(self) def isScriptable(self): if self.specialtype is None: return False if self.specialtype == 'nsid': return self.modifier is not None return self.modifier == 'ref' def isPtr(self, calltype): return self.modifier == 'ptr' def isRef(self, calltype): return self.modifier == 'ref' def nativeType(self, calltype, const=False, shared=False): if shared: if calltype != 'out': raise IDLError("[shared] only applies to out parameters.") const = True if self.specialtype is not None and calltype == 'in': const = True if self.specialtype == 'jsval': if calltype == 'out' or calltype == 'inout': return "JS::MutableHandleValue " return "JS::HandleValue " if self.isRef(calltype): m = '& ' elif self.isPtr(calltype): m = '*' + ((self.modifier == 'ptr' and calltype != 'in') and '*' or '') else: m = calltype != 'in' and '*' or '' return "%s%s %s" % (const and 'const ' or '', self.nativename, m) def __str__(self): return "native %s(%s)\n" % (self.name, self.nativename) class Interface(object): kind = 'interface' def __init__(self, name, attlist, base, members, location, doccomments): self.name = name self.attributes = InterfaceAttributes(attlist, location) self.base = base self.members = members self.location = location self.namemap = NameMap() self.doccomments = doccomments self.nativename = name for m in members: if not isinstance(m, CDATA): self.namemap.set(m) def __eq__(self, other): return self.name == other.name and self.location == other.location def resolve(self, parent): self.idl = parent # Hack alert: if an identifier is already present, libIDL assigns # doc comments incorrectly. This is quirks-mode extraordinaire! if parent.hasName(self.name): for member in self.members: if hasattr(member, 'doccomments'): member.doccomments[0:0] = self.doccomments break self.doccomments = parent.getName(self.name, None).doccomments if self.attributes.function: has_method = False for member in self.members: if member.kind is 'method': if has_method: raise IDLError("interface '%s' has multiple methods, but marked 'function'" % self.name, self.location) else: has_method = True parent.setName(self) if self.base is not None: realbase = parent.getName(self.base, self.location) if realbase.kind != 'interface': raise IDLError("interface '%s' inherits from non-interface type '%s'" % (self.name, self.base), self.location) if self.attributes.scriptable and not realbase.attributes.scriptable: print >>sys.stderr, IDLError("interface '%s' is scriptable but derives from non-scriptable '%s'" % (self.name, self.base), self.location, warning=True) if self.attributes.scriptable and realbase.attributes.builtinclass and not self.attributes.builtinclass: raise IDLError("interface '%s' is not builtinclass but derives from builtinclass '%s'" % (self.name, self.base), self.location) for member in self.members: member.resolve(self) # The number 250 is NOT arbitrary; this number is the maximum number of # stub entries defined in xpcom/reflect/xptcall/public/genstubs.pl # Do not increase this value without increasing the number in that # location, or you WILL cause otherwise unknown problems! if self.countEntries() > 250 and not self.attributes.builtinclass: raise IDLError("interface '%s' has too many entries" % self.name, self.location) def isScriptable(self): # NOTE: this is not whether *this* interface is scriptable... it's # whether, when used as a type, it's scriptable, which is true of all # interfaces. return True def nativeType(self, calltype, const=False): return "%s%s %s" % (const and 'const ' or '', self.name, calltype != 'in' and '* *' or '*') def __str__(self): l = ["interface %s\n" % self.name] if self.base is not None: l.append("\tbase %s\n" % self.base) l.append(str(self.attributes)) if self.members is None: l.append("\tincomplete type\n") else: for m in self.members: l.append(str(m)) return "".join(l) def getConst(self, name, location): # The constant may be in a base class iface = self while name not in iface.namemap and iface is not None: iface = self.idl.getName(self.base, self.location) if iface is None: raise IDLError("cannot find symbol '%s'" % name, c.location) c = iface.namemap.get(name, location) if c.kind != 'const': raise IDLError("symbol '%s' is not a constant", c.location) return c.getValue() def needsJSTypes(self): for m in self.members: if m.kind == "attribute" and m.type == "jsval": return True if m.kind == "method" and m.needsJSTypes(): return True return False def countEntries(self): ''' Returns the number of entries in the vtable for this interface. ''' total = sum(member.count() for member in self.members) if self.base is not None: realbase = self.idl.getName(self.base, self.location) total += realbase.countEntries() return total class InterfaceAttributes(object): uuid = None scriptable = False builtinclass = False function = False deprecated = False noscript = False def setuuid(self, value): self.uuid = value.lower() def setscriptable(self): self.scriptable = True def setfunction(self): self.function = True def setnoscript(self): self.noscript = True def setbuiltinclass(self): self.builtinclass = True def setdeprecated(self): self.deprecated = True actions = { 'uuid': (True, setuuid), 'scriptable': (False, setscriptable), 'builtinclass': (False, setbuiltinclass), 'function': (False, setfunction), 'noscript': (False, setnoscript), 'deprecated': (False, setdeprecated), 'object': (False, lambda self: True), } def __init__(self, attlist, location): def badattribute(self): raise IDLError("Unexpected interface attribute '%s'" % name, location) for name, val, aloc in attlist: hasval, action = self.actions.get(name, (False, badattribute)) if hasval: if val is None: raise IDLError("Expected value for attribute '%s'" % name, aloc) action(self, val) else: if val is not None: raise IDLError("Unexpected value for attribute '%s'" % name, aloc) action(self) if self.uuid is None: raise IDLError("interface has no uuid", location) def __str__(self): l = [] if self.uuid: l.append("\tuuid: %s\n" % self.uuid) if self.scriptable: l.append("\tscriptable\n") if self.builtinclass: l.append("\tbuiltinclass\n") if self.function: l.append("\tfunction\n") return "".join(l) class ConstMember(object): kind = 'const' def __init__(self, type, name, value, location, doccomments): self.type = type self.name = name self.value = value self.location = location self.doccomments = doccomments def resolve(self, parent): self.realtype = parent.idl.getName(self.type, self.location) self.iface = parent basetype = self.realtype while isinstance(basetype, Typedef): basetype = basetype.realtype if not isinstance(basetype, Builtin) or not basetype.maybeConst: raise IDLError("const may only be a short or long type, not %s" % self.type, self.location) self.basetype = basetype def getValue(self): return self.value(self.iface) def __str__(self): return "\tconst %s %s = %s\n" % (self.type, self.name, self.getValue()) def count(self): return 0 class Attribute(object): kind = 'attribute' noscript = False readonly = False implicit_jscontext = False nostdcall = False binaryname = None null = None undefined = None deprecated = False infallible = False def __init__(self, type, name, attlist, readonly, location, doccomments): self.type = type self.name = name self.attlist = attlist self.readonly = readonly self.location = location self.doccomments = doccomments for name, value, aloc in attlist: if name == 'binaryname': if value is None: raise IDLError("binaryname attribute requires a value", aloc) self.binaryname = value continue if name == 'Null': if value is None: raise IDLError("'Null' attribute requires a value", aloc) if readonly: raise IDLError("'Null' attribute only makes sense for setters", aloc); if value not in ('Empty', 'Null', 'Stringify'): raise IDLError("'Null' attribute value must be 'Empty', 'Null' or 'Stringify'", aloc); self.null = value elif name == 'Undefined': if value is None: raise IDLError("'Undefined' attribute requires a value", aloc) if readonly: raise IDLError("'Undefined' attribute only makes sense for setters", aloc); if value not in ('Empty', 'Null'): raise IDLError("'Undefined' attribute value must be 'Empty' or 'Null'", aloc); self.undefined = value else: if value is not None: raise IDLError("Unexpected attribute value", aloc) if name == 'noscript': self.noscript = True elif name == 'implicit_jscontext': self.implicit_jscontext = True elif name == 'deprecated': self.deprecated = True elif name == 'nostdcall': self.nostdcall = True elif name == 'infallible': self.infallible = True else: raise IDLError("Unexpected attribute '%s'" % name, aloc) def resolve(self, iface): self.iface = iface self.realtype = iface.idl.getName(self.type, self.location) if (self.null is not None and getBuiltinOrNativeTypeName(self.realtype) != '[domstring]'): raise IDLError("'Null' attribute can only be used on DOMString", self.location) if (self.undefined is not None and getBuiltinOrNativeTypeName(self.realtype) != '[domstring]'): raise IDLError("'Undefined' attribute can only be used on DOMString", self.location) if self.infallible and not self.realtype.kind == 'builtin': raise IDLError('[infallible] only works on builtin types ' '(numbers, booleans, and raw char types)', self.location) if self.infallible and not iface.attributes.builtinclass: raise IDLError('[infallible] attributes are only allowed on ' '[builtinclass] interfaces', self.location) def toIDL(self): attribs = attlistToIDL(self.attlist) readonly = self.readonly and 'readonly ' or '' return "%s%sattribute %s %s;" % (attribs, readonly, self.type, self.name) def isScriptable(self): if not self.iface.attributes.scriptable: return False return not self.noscript def __str__(self): return "\t%sattribute %s %s\n" % (self.readonly and 'readonly ' or '', self.type, self.name) def count(self): return self.readonly and 1 or 2 class Method(object): kind = 'method' noscript = False notxpcom = False binaryname = None implicit_jscontext = False nostdcall = False optional_argc = False deprecated = False def __init__(self, type, name, attlist, paramlist, location, doccomments, raises): self.type = type self.name = name self.attlist = attlist self.params = paramlist self.location = location self.doccomments = doccomments self.raises = raises for name, value, aloc in attlist: if name == 'binaryname': if value is None: raise IDLError("binaryname attribute requires a value", aloc) self.binaryname = value continue if value is not None: raise IDLError("Unexpected attribute value", aloc) if name == 'noscript': self.noscript = True elif name == 'notxpcom': self.notxpcom = True elif name == 'implicit_jscontext': self.implicit_jscontext = True elif name == 'optional_argc': self.optional_argc = True elif name == 'deprecated': self.deprecated = True elif name == 'nostdcall': self.nostdcall = True else: raise IDLError("Unexpected attribute '%s'" % name, aloc) self.namemap = NameMap() for p in paramlist: self.namemap.set(p) def resolve(self, iface): self.iface = iface self.realtype = self.iface.idl.getName(self.type, self.location) for p in self.params: p.resolve(self) for p in self.params: if p.retval and p != self.params[-1]: raise IDLError("'retval' parameter '%s' is not the last parameter" % p.name, self.location) if p.size_is: found_size_param = False for size_param in self.params: if p.size_is == size_param.name: found_size_param = True if getBuiltinOrNativeTypeName(size_param.realtype) != 'unsigned long': raise IDLError("is_size parameter must have type 'unsigned long'", self.location) if not found_size_param: raise IDLError("could not find is_size parameter '%s'" % p.size_is, self.location) def isScriptable(self): if not self.iface.attributes.scriptable: return False return not (self.noscript or self.notxpcom) def __str__(self): return "\t%s %s(%s)\n" % (self.type, self.name, ", ".join([p.name for p in self.params])) def toIDL(self): if len(self.raises): raises = ' raises (%s)' % ','.join(self.raises) else: raises = '' return "%s%s %s (%s)%s;" % (attlistToIDL(self.attlist), self.type, self.name, ", ".join([p.toIDL() for p in self.params]), raises) def needsJSTypes(self): if self.implicit_jscontext: return True if self.type == "jsval": return True for p in self.params: t = p.realtype if isinstance(t, Native) and t.specialtype == "jsval": return True return False def count(self): return 1 class Param(object): size_is = None iid_is = None const = False array = False retval = False shared = False optional = False null = None undefined = None def __init__(self, paramtype, type, name, attlist, location, realtype=None): self.paramtype = paramtype self.type = type self.name = name self.attlist = attlist self.location = location self.realtype = realtype for name, value, aloc in attlist: # Put the value-taking attributes first! if name == 'size_is': if value is None: raise IDLError("'size_is' must specify a parameter", aloc) self.size_is = value elif name == 'iid_is': if value is None: raise IDLError("'iid_is' must specify a parameter", aloc) self.iid_is = value elif name == 'Null': if value is None: raise IDLError("'Null' must specify a parameter", aloc) if value not in ('Empty', 'Null', 'Stringify'): raise IDLError("'Null' parameter value must be 'Empty', 'Null', or 'Stringify'", aloc); self.null = value elif name == 'Undefined': if value is None: raise IDLError("'Undefined' must specify a parameter", aloc) if value not in ('Empty', 'Null'): raise IDLError("'Undefined' parameter value must be 'Empty' or 'Null'", aloc); self.undefined = value else: if value is not None: raise IDLError("Unexpected value for attribute '%s'" % name, aloc) if name == 'const': self.const = True elif name == 'array': self.array = True elif name == 'retval': self.retval = True elif name == 'shared': self.shared = True elif name == 'optional': self.optional = True else: raise IDLError("Unexpected attribute '%s'" % name, aloc) def resolve(self, method): self.realtype = method.iface.idl.getName(self.type, self.location) if self.array: self.realtype = Array(self.realtype) if (self.null is not None and getBuiltinOrNativeTypeName(self.realtype) != '[domstring]'): raise IDLError("'Null' attribute can only be used on DOMString", self.location) if (self.undefined is not None and getBuiltinOrNativeTypeName(self.realtype) != '[domstring]'): raise IDLError("'Undefined' attribute can only be used on DOMString", self.location) def nativeType(self): kwargs = {} if self.shared: kwargs['shared'] = True if self.const: kwargs['const'] = True try: return self.realtype.nativeType(self.paramtype, **kwargs) except IDLError, e: raise IDLError(e.message, self.location) except TypeError, e: raise IDLError("Unexpected parameter attribute", self.location) def toIDL(self): return "%s%s %s %s" % (paramAttlistToIDL(self.attlist), self.paramtype, self.type, self.name) class Array(object): def __init__(self, basetype): self.type = basetype def isScriptable(self): return self.type.isScriptable() def nativeType(self, calltype, const=False): return "%s%s*" % (const and 'const ' or '', self.type.nativeType(calltype)) class IDLParser(object): keywords = { 'const': 'CONST', 'interface': 'INTERFACE', 'in': 'IN', 'inout': 'INOUT', 'out': 'OUT', 'attribute': 'ATTRIBUTE', 'raises': 'RAISES', 'readonly': 'READONLY', 'native': 'NATIVE', 'typedef': 'TYPEDEF', 'Infinity': 'INFINITY' } tokens = [ 'IDENTIFIER', 'CDATA', 'INCLUDE', 'IID', 'NUMBER', 'HEXNUM', 'LSHIFT', 'RSHIFT', 'NATIVEID', ] tokens.extend(keywords.values()) states = ( ('nativeid', 'exclusive'), ) hexchar = r'[a-fA-F0-9]' t_NUMBER = r'-?\d+' t_HEXNUM = r'0x%s+' % hexchar t_LSHIFT = r'<<' t_RSHIFT= r'>>' literals = '"(){}[],;:=|+-*' t_ignore = ' \t' def t_multilinecomment(self, t): r'/\*(?s).*?\*/' t.lexer.lineno += t.value.count('\n') if t.value.startswith("/**"): self._doccomments.append(t.value) def t_singlelinecomment(self, t): r'(?m)//.*?$' def t_IID(self, t): return t t_IID.__doc__ = r'%(c)s{8}-%(c)s{4}-%(c)s{4}-%(c)s{4}-%(c)s{12}' % {'c': hexchar} def t_IDENTIFIER(self, t): r'(unsigned\ long\ long|unsigned\ short|unsigned\ long|long\ long)(?!_?[A-Za-z][A-Za-z_0-9])|_?[A-Za-z][A-Za-z_0-9]*' t.type = self.keywords.get(t.value, 'IDENTIFIER') return t def t_LCDATA(self, t): r'(?s)%\{[ ]*C\+\+[ ]*\n(?P.*?\n?)%\}[ ]*(C\+\+)?' t.type = 'CDATA' t.value = t.lexer.lexmatch.group('cdata') t.lexer.lineno += t.value.count('\n') return t def t_INCLUDE(self, t): r'\#include[ \t]+"[^"\n]+"' inc, value, end = t.value.split('"') t.value = value return t def t_directive(self, t): r'\#(?P[a-zA-Z]+)[^\n]+' raise IDLError("Unrecognized directive %s" % t.lexer.lexmatch.group('directive'), Location(lexer=self.lexer, lineno=self.lexer.lineno, lexpos=self.lexer.lexpos)) def t_newline(self, t): r'\n+' t.lexer.lineno += len(t.value) def t_nativeid_NATIVEID(self, t): r'[^()\n]+(?=\))' t.lexer.begin('INITIAL') return t t_nativeid_ignore = '' def t_ANY_error(self, t): raise IDLError("unrecognized input", Location(lexer=self.lexer, lineno=self.lexer.lineno, lexpos=self.lexer.lexpos)) precedence = ( ('left', '|'), ('left', 'LSHIFT', 'RSHIFT'), ('left', '+', '-'), ('left', '*'), ('left', 'UMINUS'), ) def p_idlfile(self, p): """idlfile : productions""" p[0] = IDL(p[1]) def p_productions_start(self, p): """productions : """ p[0] = [] def p_productions_cdata(self, p): """productions : CDATA productions""" p[0] = list(p[2]) p[0].insert(0, CDATA(p[1], self.getLocation(p, 1))) def p_productions_include(self, p): """productions : INCLUDE productions""" p[0] = list(p[2]) p[0].insert(0, Include(p[1], self.getLocation(p, 1))) def p_productions_interface(self, p): """productions : interface productions | typedef productions | native productions""" p[0] = list(p[2]) p[0].insert(0, p[1]) def p_typedef(self, p): """typedef : TYPEDEF IDENTIFIER IDENTIFIER ';'""" p[0] = Typedef(type=p[2], name=p[3], location=self.getLocation(p, 1), doccomments=p.slice[1].doccomments) def p_native(self, p): """native : attributes NATIVE IDENTIFIER afternativeid '(' NATIVEID ')' ';'""" p[0] = Native(name=p[3], nativename=p[6], attlist=p[1]['attlist'], location=self.getLocation(p, 2)) def p_afternativeid(self, p): """afternativeid : """ # this is a place marker: we switch the lexer into literal identifier # mode here, to slurp up everything until the closeparen self.lexer.begin('nativeid') def p_anyident(self, p): """anyident : IDENTIFIER | CONST""" p[0] = {'value': p[1], 'location': self.getLocation(p, 1)} def p_attributes(self, p): """attributes : '[' attlist ']' | """ if len(p) == 1: p[0] = {'attlist': []} else: p[0] = {'attlist': p[2], 'doccomments': p.slice[1].doccomments} def p_attlist_start(self, p): """attlist : attribute""" p[0] = [p[1]] def p_attlist_continue(self, p): """attlist : attribute ',' attlist""" p[0] = list(p[3]) p[0].insert(0, p[1]) def p_attribute(self, p): """attribute : anyident attributeval""" p[0] = (p[1]['value'], p[2], p[1]['location']) def p_attributeval(self, p): """attributeval : '(' IDENTIFIER ')' | '(' IID ')' | """ if len(p) > 1: p[0] = p[2] def p_interface(self, p): """interface : attributes INTERFACE IDENTIFIER ifacebase ifacebody ';'""" atts, INTERFACE, name, base, body, SEMI = p[1:] attlist = atts['attlist'] doccomments = [] if 'doccomments' in atts: doccomments.extend(atts['doccomments']) doccomments.extend(p.slice[2].doccomments) l = lambda: self.getLocation(p, 2) if body is None: # forward-declared interface... must not have attributes! if len(attlist) != 0: raise IDLError("Forward-declared interface must not have attributes", list[0][3]) if base is not None: raise IDLError("Forward-declared interface must not have a base", l()) p[0] = Forward(name=name, location=l(), doccomments=doccomments) else: p[0] = Interface(name=name, attlist=attlist, base=base, members=body, location=l(), doccomments=doccomments) def p_ifacebody(self, p): """ifacebody : '{' members '}' | """ if len(p) > 1: p[0] = p[2] def p_ifacebase(self, p): """ifacebase : ':' IDENTIFIER | """ if len(p) == 3: p[0] = p[2] def p_members_start(self, p): """members : """ p[0] = [] def p_members_continue(self, p): """members : member members""" p[0] = list(p[2]) p[0].insert(0, p[1]) def p_member_cdata(self, p): """member : CDATA""" p[0] = CDATA(p[1], self.getLocation(p, 1)) def p_member_const(self, p): """member : CONST IDENTIFIER IDENTIFIER '=' number ';' """ p[0] = ConstMember(type=p[2], name=p[3], value=p[5], location=self.getLocation(p, 1), doccomments=p.slice[1].doccomments) # All "number" products return a function(interface) def p_number_decimal(self, p): """number : NUMBER""" n = int(p[1]) p[0] = lambda i: n def p_number_hex(self, p): """number : HEXNUM""" n = int(p[1], 16) p[0] = lambda i: n def p_number_identifier(self, p): """number : IDENTIFIER""" id = p[1] loc = self.getLocation(p, 1) p[0] = lambda i: i.getConst(id, loc) def p_number_paren(self, p): """number : '(' number ')'""" p[0] = p[2] def p_number_neg(self, p): """number : '-' number %prec UMINUS""" n = p[2] p[0] = lambda i: - n(i) def p_number_add(self, p): """number : number '+' number | number '-' number | number '*' number""" n1 = p[1] n2 = p[3] if p[2] == '+': p[0] = lambda i: n1(i) + n2(i) elif p[2] == '-': p[0] = lambda i: n1(i) - n2(i) else: p[0] = lambda i: n1(i) * n2(i) def p_number_shift(self, p): """number : number LSHIFT number | number RSHIFT number""" n1 = p[1] n2 = p[3] if p[2] == '<<': p[0] = lambda i: n1(i) << n2(i) else: p[0] = lambda i: n1(i) >> n2(i) def p_number_bitor(self, p): """number : number '|' number""" n1 = p[1] n2 = p[3] p[0] = lambda i: n1(i) | n2(i) def p_member_att(self, p): """member : attributes optreadonly ATTRIBUTE IDENTIFIER IDENTIFIER ';'""" if 'doccomments' in p[1]: doccomments = p[1]['doccomments'] elif p[2] is not None: doccomments = p[2] else: doccomments = p.slice[3].doccomments p[0] = Attribute(type=p[4], name=p[5], attlist=p[1]['attlist'], readonly=p[2] is not None, location=self.getLocation(p, 3), doccomments=doccomments) def p_member_method(self, p): """member : attributes IDENTIFIER IDENTIFIER '(' paramlist ')' raises ';'""" if 'doccomments' in p[1]: doccomments = p[1]['doccomments'] else: doccomments = p.slice[2].doccomments p[0] = Method(type=p[2], name=p[3], attlist=p[1]['attlist'], paramlist=p[5], location=self.getLocation(p, 3), doccomments=doccomments, raises=p[7]) def p_paramlist(self, p): """paramlist : param moreparams | """ if len(p) == 1: p[0] = [] else: p[0] = list(p[2]) p[0].insert(0, p[1]) def p_moreparams_start(self, p): """moreparams :""" p[0] = [] def p_moreparams_continue(self, p): """moreparams : ',' param moreparams""" p[0] = list(p[3]) p[0].insert(0, p[2]) def p_param(self, p): """param : attributes paramtype IDENTIFIER IDENTIFIER""" p[0] = Param(paramtype=p[2], type=p[3], name=p[4], attlist=p[1]['attlist'], location=self.getLocation(p, 3)) def p_paramtype(self, p): """paramtype : IN | INOUT | OUT""" p[0] = p[1] def p_optreadonly(self, p): """optreadonly : READONLY | """ if len(p) > 1: p[0] = p.slice[1].doccomments else: p[0] = None def p_raises(self, p): """raises : RAISES '(' idlist ')' | """ if len(p) == 1: p[0] = [] else: p[0] = p[3] def p_idlist(self, p): """idlist : IDENTIFIER""" p[0] = [p[1]] def p_idlist_continue(self, p): """idlist : IDENTIFIER ',' idlist""" p[0] = list(p[3]) p[0].insert(0, p[1]) def p_error(self, t): if not t: raise IDLError("Syntax Error at end of file. Possibly due to missing semicolon(;), braces(}) or both", None) else: location = Location(self.lexer, t.lineno, t.lexpos) raise IDLError("invalid syntax", location) def __init__(self, outputdir=''): self._doccomments = [] self.lexer = lex.lex(object=self, outputdir=outputdir, lextab='xpidllex', optimize=1) self.parser = yacc.yacc(module=self, outputdir=outputdir, debug=0, tabmodule='xpidlyacc', optimize=1) def clearComments(self): self._doccomments = [] def token(self): t = self.lexer.token() if t is not None and t.type != 'CDATA': t.doccomments = self._doccomments self._doccomments = [] return t def parse(self, data, filename=None): if filename is not None: self.lexer.filename = filename self.lexer.lineno = 1 self.lexer.input(data) idl = self.parser.parse(lexer=self) if filename is not None: idl.deps.append(filename) return idl def getLocation(self, p, i): return Location(self.lexer, p.lineno(i), p.lexpos(i)) if __name__ == '__main__': p = IDLParser() for f in sys.argv[1:]: print "Parsing %s" % f p.parse(open(f).read(), filename=f) enigmail-2.0.8/util/xpidllex.py000066400000000000000000000032401334302754500164730ustar00rootroot00000000000000# xpidllex.py. This file automatically created by PLY (version 3.3). Don't edit! _tabversion = '3.3' _lextokens = {'TYPEDEF': 1, 'INCLUDE': 1, 'RSHIFT': 1, 'LSHIFT': 1, 'ATTRIBUTE': 1, 'NATIVEID': 1, 'INFINITY': 1, 'NUMBER': 1, 'NATIVE': 1, 'IID': 1, 'READONLY': 1, 'RAISES': 1, 'CDATA': 1, 'IN': 1, 'INTERFACE': 1, 'CONST': 1, 'IDENTIFIER': 1, 'OUT': 1, 'INOUT': 1, 'HEXNUM': 1} _lexreflags = 0 _lexliterals = '"(){}[],;:=|+-*' _lexstateinfo = {'nativeid': 'exclusive', 'INITIAL': 'inclusive'} _lexstatere = {'nativeid': [('(?P[^()\\n]+(?=\\)))', [None, ('t_nativeid_NATIVEID', 'NATIVEID')])], 'INITIAL': [('(?P/\\*(?s).*?\\*/)|(?P(?m)//.*?$)|(?P[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12})|(?P(unsigned\\ long\\ long|unsigned\\ short|unsigned\\ long|long\\ long)(?!_?[A-Za-z][A-Za-z_0-9])|_?[A-Za-z][A-Za-z_0-9]*)|(?P(?s)%\\{[ ]*C\\+\\+[ ]*\\n(?P.*?\\n?)%\\}[ ]*(C\\+\\+)?)|(?P\\#include[ \\t]+"[^"\\n]+")|(?P\\#(?P[a-zA-Z]+)[^\\n]+)|(?P\\n+)|(?P0x[a-fA-F0-9]+)|(?P-?\\d+)|(?P<<)|(?P>>)', [None, ('t_multilinecomment', 'multilinecomment'), ('t_singlelinecomment', 'singlelinecomment'), ('t_IID', 'IID'), ('t_IDENTIFIER', 'IDENTIFIER'), None, ('t_LCDATA', 'LCDATA'), None, None, ('t_INCLUDE', 'INCLUDE'), ('t_directive', 'directive'), None, ('t_newline', 'newline'), (None, 'HEXNUM'), (None, 'NUMBER'), (None, 'LSHIFT'), (None, 'RSHIFT')])]} _lexstateignore = {'nativeid': '', 'INITIAL': ' \t'} _lexstateerrorf = {'nativeid': 't_ANY_error', 'INITIAL': 't_ANY_error'} enigmail-2.0.8/util/xpidlyacc.py000066400000000000000000000307051334302754500166300ustar00rootroot00000000000000 # ../../xpcom/idl-parser/xpidlyacc.py # This file is automatically generated. Do not edit. _tabversion = '3.2' _lr_method = 'LALR' _lr_signature = '\xf49\xfe(JB\\\xfa\x9brG\t\xc9\xc9\x12\xfb' _lr_action_items = {'CONST':([6,25,42,47,48,82,84,104,],[14,14,45,45,-28,-29,-41,-42,]),'NATIVEID':([43,],[50,]),'NUMBER':([62,65,66,77,78,79,80,81,83,],[68,68,68,68,68,68,68,68,68,]),'LSHIFT':([67,68,69,70,75,76,92,93,94,95,96,97,98,],[80,-30,-32,-31,80,-34,-33,-35,-37,-36,-38,-39,80,]),'RSHIFT':([67,68,69,70,75,76,92,93,94,95,96,97,98,],[81,-30,-32,-31,81,-34,-33,-35,-37,-36,-38,-39,81,]),'INOUT':([28,64,74,85,],[-13,-14,90,-14,]),'NATIVE':([0,2,5,7,8,9,10,28,31,44,61,],[-14,-14,-14,-14,-14,-14,23,-13,-8,-21,-9,]),')':([33,34,50,64,68,69,70,72,73,75,76,86,92,93,94,95,96,97,98,99,103,106,107,108,111,],[38,39,57,-44,-30,-32,-31,-45,87,92,-34,-43,-33,-35,-37,-36,-38,-39,-40,-45,-46,-47,109,-55,-56,]),'(':([14,16,17,30,37,60,62,65,66,77,78,79,80,81,83,101,],[-12,27,-11,-10,43,64,65,65,65,65,65,65,65,65,65,105,]),'+':([67,68,69,70,75,76,92,93,94,95,96,97,98,],[77,-30,-32,-31,77,-34,-33,-35,-37,-36,77,77,77,]),'*':([67,68,69,70,75,76,92,93,94,95,96,97,98,],[78,-30,-32,-31,78,-34,-33,78,-37,78,78,78,78,]),'-':([62,65,66,67,68,69,70,75,76,77,78,79,80,81,83,92,93,94,95,96,97,98,],[66,66,66,79,-30,-32,-31,79,-34,66,66,66,66,66,66,-33,-35,-37,-36,79,79,79,]),',':([14,15,16,17,26,38,39,72,99,106,108,],[-12,25,-20,-11,-17,-18,-19,85,85,-47,110,]),'IID':([27,],[34,]),'READONLY':([28,42,47,48,49,82,84,104,],[-13,-14,-14,-28,55,-29,-41,-42,]),';':([24,29,36,40,41,52,57,67,68,69,70,71,76,87,92,93,94,95,96,97,98,100,109,],[31,-25,-23,-24,44,-22,61,82,-30,-32,-31,84,-34,-54,-33,-35,-37,-36,-38,-39,-40,104,-53,]),'IDENTIFIER':([3,6,12,22,23,25,27,28,35,42,45,47,48,49,51,56,59,62,63,65,66,77,78,79,80,81,82,83,84,88,89,90,91,102,104,105,110,],[12,17,24,29,30,17,33,-13,40,-14,51,-14,-28,56,58,60,63,69,71,69,69,69,69,69,69,69,-29,69,-41,102,-48,-49,-50,106,-42,108,108,]),'=':([58,],[62,]),'OUT':([28,64,74,85,],[-13,-14,91,-14,]),'TYPEDEF':([0,2,5,7,8,9,31,44,61,],[3,3,3,3,3,3,-8,-21,-9,]),'RAISES':([87,],[101,]),'IN':([28,64,74,85,],[-13,-14,89,-14,]),'[':([0,2,5,7,8,9,31,42,44,47,48,61,64,82,84,85,104,],[6,6,6,6,6,6,-8,6,-21,6,-28,-9,6,-29,-41,6,-42,]),'INCLUDE':([0,2,5,7,8,9,31,44,61,],[7,7,7,7,7,7,-8,-21,-9,]),']':([14,15,16,17,18,26,32,38,39,],[-12,-15,-20,-11,28,-17,-16,-18,-19,]),':':([29,],[35,]),'ATTRIBUTE':([28,42,47,48,49,54,55,82,84,104,],[-13,-14,-14,-28,-52,59,-51,-29,-41,-42,]),'CDATA':([0,2,5,7,8,9,31,42,44,47,48,61,82,84,104,],[9,9,9,9,9,9,-8,48,-21,48,-28,-9,-29,-41,-42,]),'INTERFACE':([0,2,5,7,8,9,10,28,31,44,61,],[-14,-14,-14,-14,-14,-14,22,-13,-8,-21,-9,]),'{':([29,36,40,],[-25,42,-24,]),'$end':([0,1,2,4,5,7,8,9,11,13,19,20,21,31,44,61,],[-2,-1,-2,0,-2,-2,-2,-2,-6,-5,-4,-7,-3,-8,-21,-9,]),'}':([42,46,47,48,53,82,84,104,],[-26,52,-26,-28,-27,-29,-41,-42,]),'|':([67,68,69,70,75,76,92,93,94,95,96,97,98,],[83,-30,-32,-31,83,-34,-33,-35,-37,-36,-38,-39,-40,]),'HEXNUM':([62,65,66,77,78,79,80,81,83,],[70,70,70,70,70,70,70,70,70,]),} _lr_action = { } for _k, _v in _lr_action_items.items(): for _x,_y in zip(_v[0],_v[1]): if not _x in _lr_action: _lr_action[_x] = { } _lr_action[_x][_k] = _y del _lr_action_items _lr_goto_items = {'members':([42,47,],[46,53,]),'attribute':([6,25,],[15,15,]),'number':([62,65,66,77,78,79,80,81,83,],[67,75,76,93,94,95,96,97,98,]),'productions':([0,2,5,7,8,9,],[1,11,13,19,20,21,]),'raises':([87,],[100,]),'ifacebody':([36,],[41,]),'attlist':([6,25,],[18,32,]),'native':([0,2,5,7,8,9,],[8,8,8,8,8,8,]),'typedef':([0,2,5,7,8,9,],[2,2,2,2,2,2,]),'attributeval':([16,],[26,]),'optreadonly':([49,],[54,]),'ifacebase':([29,],[36,]),'afternativeid':([30,],[37,]),'param':([64,85,],[72,99,]),'member':([42,47,],[47,47,]),'idlfile':([0,],[4,]),'paramlist':([64,],[73,]),'moreparams':([72,99,],[86,103,]),'interface':([0,2,5,7,8,9,],[5,5,5,5,5,5,]),'idlist':([105,110,],[107,111,]),'paramtype':([74,],[88,]),'anyident':([6,25,],[16,16,]),'attributes':([0,2,5,7,8,9,42,47,64,85,],[10,10,10,10,10,10,49,49,74,74,]),} _lr_goto = { } for _k, _v in _lr_goto_items.items(): for _x,_y in zip(_v[0],_v[1]): if not _x in _lr_goto: _lr_goto[_x] = { } _lr_goto[_x][_k] = _y del _lr_goto_items _lr_productions = [ ("S' -> idlfile","S'",1,None,None,None), ('idlfile -> productions','idlfile',1,'p_idlfile','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1092), ('productions -> ','productions',0,'p_productions_start','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1096), ('productions -> CDATA productions','productions',2,'p_productions_cdata','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1100), ('productions -> INCLUDE productions','productions',2,'p_productions_include','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1105), ('productions -> interface productions','productions',2,'p_productions_interface','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1110), ('productions -> typedef productions','productions',2,'p_productions_interface','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1111), ('productions -> native productions','productions',2,'p_productions_interface','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1112), ('typedef -> TYPEDEF IDENTIFIER IDENTIFIER ;','typedef',4,'p_typedef','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1117), ('native -> attributes NATIVE IDENTIFIER afternativeid ( NATIVEID ) ;','native',8,'p_native','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1124), ('afternativeid -> ','afternativeid',0,'p_afternativeid','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1131), ('anyident -> IDENTIFIER','anyident',1,'p_anyident','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1137), ('anyident -> CONST','anyident',1,'p_anyident','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1138), ('attributes -> [ attlist ]','attributes',3,'p_attributes','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1143), ('attributes -> ','attributes',0,'p_attributes','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1144), ('attlist -> attribute','attlist',1,'p_attlist_start','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1152), ('attlist -> attribute , attlist','attlist',3,'p_attlist_continue','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1156), ('attribute -> anyident attributeval','attribute',2,'p_attribute','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1161), ('attributeval -> ( IDENTIFIER )','attributeval',3,'p_attributeval','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1165), ('attributeval -> ( IID )','attributeval',3,'p_attributeval','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1166), ('attributeval -> ','attributeval',0,'p_attributeval','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1167), ('interface -> attributes INTERFACE IDENTIFIER ifacebase ifacebody ;','interface',6,'p_interface','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1172), ('ifacebody -> { members }','ifacebody',3,'p_ifacebody','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1201), ('ifacebody -> ','ifacebody',0,'p_ifacebody','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1202), ('ifacebase -> : IDENTIFIER','ifacebase',2,'p_ifacebase','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1207), ('ifacebase -> ','ifacebase',0,'p_ifacebase','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1208), ('members -> ','members',0,'p_members_start','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1213), ('members -> member members','members',2,'p_members_continue','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1217), ('member -> CDATA','member',1,'p_member_cdata','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1222), ('member -> CONST IDENTIFIER IDENTIFIER = number ;','member',6,'p_member_const','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1226), ('number -> NUMBER','number',1,'p_number_decimal','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1234), ('number -> HEXNUM','number',1,'p_number_hex','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1239), ('number -> IDENTIFIER','number',1,'p_number_identifier','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1244), ('number -> ( number )','number',3,'p_number_paren','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1250), ('number -> - number','number',2,'p_number_neg','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1254), ('number -> number + number','number',3,'p_number_add','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1259), ('number -> number - number','number',3,'p_number_add','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1260), ('number -> number * number','number',3,'p_number_add','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1261), ('number -> number LSHIFT number','number',3,'p_number_shift','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1272), ('number -> number RSHIFT number','number',3,'p_number_shift','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1273), ('number -> number | number','number',3,'p_number_bitor','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1282), ('member -> attributes optreadonly ATTRIBUTE IDENTIFIER IDENTIFIER ;','member',6,'p_member_att','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1288), ('member -> attributes IDENTIFIER IDENTIFIER ( paramlist ) raises ;','member',8,'p_member_method','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1304), ('paramlist -> param moreparams','paramlist',2,'p_paramlist','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1319), ('paramlist -> ','paramlist',0,'p_paramlist','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1320), ('moreparams -> ','moreparams',0,'p_moreparams_start','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1328), ('moreparams -> , param moreparams','moreparams',3,'p_moreparams_continue','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1332), ('param -> attributes paramtype IDENTIFIER IDENTIFIER','param',4,'p_param','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1337), ('paramtype -> IN','paramtype',1,'p_paramtype','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1345), ('paramtype -> INOUT','paramtype',1,'p_paramtype','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1346), ('paramtype -> OUT','paramtype',1,'p_paramtype','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1347), ('optreadonly -> READONLY','optreadonly',1,'p_optreadonly','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1351), ('optreadonly -> ','optreadonly',0,'p_optreadonly','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1352), ('raises -> RAISES ( idlist )','raises',4,'p_raises','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1359), ('raises -> ','raises',0,'p_raises','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1360), ('idlist -> IDENTIFIER','idlist',1,'p_idlist','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1367), ('idlist -> IDENTIFIER , idlist','idlist',3,'p_idlist_continue','/builds/slave/rel-m-rel-xr_osx64_bld-0000000/build/xpcom/idl-parser/xpidl.py',1371), ] enigmail-2.0.8/util/xpt.py000077500000000000000000001441701334302754500154700ustar00rootroot00000000000000#!/usr/bin/env python # Copyright 2010,2011 Mozilla Foundation. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the # distribution. # # THIS SOFTWARE IS PROVIDED BY THE MOZILLA FOUNDATION ``AS IS'' AND ANY # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE MOZILLA FOUNDATION OR # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # The views and conclusions contained in the software and documentation # are those of the authors and should not be interpreted as representing # official policies, either expressed or implied, of the Mozilla # Foundation. """ A module for working with XPCOM Type Libraries. The XPCOM Type Library File Format is described at: http://www.mozilla.org/scriptable/typelib_file.html . It is used to provide type information for calling methods on XPCOM objects from scripting languages such as JavaScript. This module provides a set of classes representing the parts of a typelib in a high-level manner, as well as methods for reading and writing them from files. The usable public interfaces are currently: Typelib.read(input_file) - read a typelib from a file on disk or file-like object, return a Typelib object. xpt_dump(filename) - read a typelib from a file on disk, dump the contents to stdout in a human-readable format. Typelib() - construct a new Typelib object Interface() - construct a new Interface object Method() - construct a new object representing a method defined on an Interface Constant() - construct a new object representing a constant defined on an Interface Param() - construct a new object representing a parameter to a method SimpleType() - construct a new object representing a simple data type InterfaceType() - construct a new object representing a type that is an IDL-defined interface """ from __future__ import with_statement import os, sys import struct import operator # header magic XPT_MAGIC = "XPCOM\nTypeLib\r\n\x1a" TYPELIB_VERSION = (1, 2) class FileFormatError(Exception): pass class DataError(Exception): pass # Magic for creating enums def M_add_class_attribs(attribs): def foo(name, bases, dict_): for v, k in attribs: dict_[k] = v return type(name, bases, dict_) return foo def enum(*names): class Foo(object): __metaclass__ = M_add_class_attribs(enumerate(names)) def __setattr__(self, name, value): # this makes it read-only raise NotImplementedError return Foo() # Descriptor types as described in the spec class Type(object): """ Data type of a method parameter or return value. Do not instantiate this class directly. Rather, use one of its subclasses. """ _prefixdescriptor = struct.Struct(">B") Tags = enum( # The first 18 entries are SimpleTypeDescriptor 'int8', 'int16', 'int32', 'int64', 'uint8', 'uint16', 'uint32', 'uint64', 'float', 'double', 'boolean', 'char', 'wchar_t', 'void', # the following four values are only valid as pointers 'nsIID', 'DOMString', 'char_ptr', 'wchar_t_ptr', # InterfaceTypeDescriptor 'Interface', # InterfaceIsTypeDescriptor 'InterfaceIs', # ArrayTypeDescriptor 'Array', # StringWithSizeTypeDescriptor 'StringWithSize', # WideStringWithSizeTypeDescriptor 'WideStringWithSize', #XXX: These are also SimpleTypes (but not in the spec) # http://hg.mozilla.org/mozilla-central/annotate/0e0e2516f04e/xpcom/typelib/xpt/tools/xpt_dump.c#l69 'UTF8String', 'CString', 'AString', 'jsval', ) def __init__(self, pointer=False, reference=False): self.pointer = pointer self.reference = reference if reference and not pointer: raise Exception("If reference is True pointer must be True too") @staticmethod def decodeflags(byte): """ Given |byte|, an unsigned uint8 containing flag bits, decode the flag bits as described in http://www.mozilla.org/scriptable/typelib_file.html#TypeDescriptor and return a dict of flagname: (True|False) suitable for passing to Type.__init__ as **kwargs. """ return {'pointer': bool(byte & 0x80), 'reference': bool(byte & 0x20), } def encodeflags(self): """ Encode the flag bits of this Type object. Returns a byte. """ flags = 0 if self.pointer: flags |= 0x80 if self.reference: flags |= 0x20 return flags @staticmethod def read(typelib, map, data_pool, offset): """ Read a TypeDescriptor at |offset| from the mmaped file |map| with data pool offset |data_pool|. Returns (Type, next offset), where |next offset| is an offset suitable for reading the data following this TypeDescriptor. """ start = data_pool + offset - 1 (data,) = Type._prefixdescriptor.unpack_from(map, start) # first three bits are the flags flags = data & 0xE0 flags = Type.decodeflags(flags) # last five bits is the tag tag = data & 0x1F offset += Type._prefixdescriptor.size t = None if tag <= Type.Tags.wchar_t_ptr or tag >= Type.Tags.UTF8String: t = SimpleType.get(data, tag, flags) elif tag == Type.Tags.Interface: t, offset = InterfaceType.read(typelib, map, data_pool, offset, flags) elif tag == Type.Tags.InterfaceIs: t, offset = InterfaceIsType.read(typelib, map, data_pool, offset, flags) elif tag == Type.Tags.Array: t, offset = ArrayType.read(typelib, map, data_pool, offset, flags) elif tag == Type.Tags.StringWithSize: t, offset = StringWithSizeType.read(typelib, map, data_pool, offset, flags) elif tag == Type.Tags.WideStringWithSize: t, offset = WideStringWithSizeType.read(typelib, map, data_pool, offset, flags) return t, offset def write(self, typelib, file): """ Write a TypeDescriptor to |file|, which is assumed to be seeked to the proper position. For types other than SimpleType, this is not sufficient for writing the TypeDescriptor, and the subclass method must be called. """ file.write(Type._prefixdescriptor.pack(self.encodeflags() | self.tag)) class SimpleType(Type): """ A simple data type. (SimpleTypeDescriptor from the typelib specification.) """ _cache = {} def __init__(self, tag, **kwargs): Type.__init__(self, **kwargs) self.tag = tag @staticmethod def get(data, tag, flags): """ Get a SimpleType object representing |data| (a TypeDescriptorPrefix). May return an already-created object. If no cached object is found, construct one with |tag| and |flags|. """ if data not in SimpleType._cache: SimpleType._cache[data] = SimpleType(tag, **flags) return SimpleType._cache[data] def __str__(self): s = "unknown" if self.tag == Type.Tags.char_ptr and self.pointer: return "string" if self.tag == Type.Tags.wchar_t_ptr and self.pointer: return "wstring" for t in dir(Type.Tags): if self.tag == getattr(Type.Tags, t): s = t break if self.pointer: if self.reference: s += " &" else: s += " *" return s class InterfaceType(Type): """ A type representing a pointer to an IDL-defined interface. (InterfaceTypeDescriptor from the typelib specification.) """ _descriptor = struct.Struct(">H") def __init__(self, iface, pointer=True, **kwargs): if not pointer: raise DataError, "InterfaceType is not valid with pointer=False" Type.__init__(self, pointer=pointer, **kwargs) self.iface = iface self.tag = Type.Tags.Interface @staticmethod def read(typelib, map, data_pool, offset, flags): """ Read an InterfaceTypeDescriptor at |offset| from the mmaped file |map| with data pool offset |data_pool|. Returns (InterfaceType, next offset), where |next offset| is an offset suitable for reading the data following this InterfaceTypeDescriptor. """ if not flags['pointer']: return None, offset start = data_pool + offset - 1 (iface_index,) = InterfaceType._descriptor.unpack_from(map, start) offset += InterfaceType._descriptor.size iface = None # interface indices are 1-based if iface_index > 0 and iface_index <= len(typelib.interfaces): iface = typelib.interfaces[iface_index - 1] return InterfaceType(iface, **flags), offset def write(self, typelib, file): """ Write an InterfaceTypeDescriptor to |file|, which is assumed to be seeked to the proper position. """ Type.write(self, typelib, file) # write out the interface index (1-based) file.write(InterfaceType._descriptor.pack(typelib.interfaces.index(self.iface) + 1)) def __str__(self): if self.iface: return self.iface.name return "unknown interface" class InterfaceIsType(Type): """ A type representing an interface described by one of the other arguments to the method. (InterfaceIsTypeDescriptor from the typelib specification.) """ _descriptor = struct.Struct(">B") _cache = {} def __init__(self, param_index, pointer=True, **kwargs): if not pointer: raise DataError, "InterfaceIsType is not valid with pointer=False" Type.__init__(self, pointer=pointer, **kwargs) self.param_index = param_index self.tag = Type.Tags.InterfaceIs @staticmethod def read(typelib, map, data_pool, offset, flags): """ Read an InterfaceIsTypeDescriptor at |offset| from the mmaped file |map| with data pool offset |data_pool|. Returns (InterfaceIsType, next offset), where |next offset| is an offset suitable for reading the data following this InterfaceIsTypeDescriptor. May return a cached value. """ if not flags['pointer']: return None, offset start = data_pool + offset - 1 (param_index,) = InterfaceIsType._descriptor.unpack_from(map, start) offset += InterfaceIsType._descriptor.size if param_index not in InterfaceIsType._cache: InterfaceIsType._cache[param_index] = InterfaceIsType(param_index, **flags) return InterfaceIsType._cache[param_index], offset def write(self, typelib, file): """ Write an InterfaceIsTypeDescriptor to |file|, which is assumed to be seeked to the proper position. """ Type.write(self, typelib, file) file.write(InterfaceIsType._descriptor.pack(self.param_index)) def __str__(self): return "InterfaceIs *" class ArrayType(Type): """ A type representing an Array of elements of another type, whose size and length are passed as separate parameters to a method. (ArrayTypeDescriptor from the typelib specification.) """ _descriptor = struct.Struct(">BB") def __init__(self, element_type, size_is_arg_num, length_is_arg_num, pointer=True, **kwargs): if not pointer: raise DataError, "ArrayType is not valid with pointer=False" Type.__init__(self, pointer=pointer, **kwargs) self.element_type = element_type self.size_is_arg_num = size_is_arg_num self.length_is_arg_num = length_is_arg_num self.tag = Type.Tags.Array @staticmethod def read(typelib, map, data_pool, offset, flags): """ Read an ArrayTypeDescriptor at |offset| from the mmaped file |map| with data pool offset |data_pool|. Returns (ArrayType, next offset), where |next offset| is an offset suitable for reading the data following this ArrayTypeDescriptor. """ if not flags['pointer']: return None, offset start = data_pool + offset - 1 (size_is_arg_num, length_is_arg_num) = ArrayType._descriptor.unpack_from(map, start) offset += ArrayType._descriptor.size t, offset = Type.read(typelib, map, data_pool, offset) return ArrayType(t, size_is_arg_num, length_is_arg_num, **flags), offset def write(self, typelib, file): """ Write an ArrayTypeDescriptor to |file|, which is assumed to be seeked to the proper position. """ Type.write(self, typelib, file) file.write(ArrayType._descriptor.pack(self.size_is_arg_num, self.length_is_arg_num)) self.element_type.write(typelib, file) def __str__(self): return "%s []" % str(self.element_type) class StringWithSizeType(Type): """ A type representing a UTF-8 encoded string whose size and length are passed as separate arguments to a method. (StringWithSizeTypeDescriptor from the typelib specification.) """ _descriptor = struct.Struct(">BB") def __init__(self, size_is_arg_num, length_is_arg_num, pointer=True, **kwargs): if not pointer: raise DataError, "StringWithSizeType is not valid with pointer=False" Type.__init__(self, pointer=pointer, **kwargs) self.size_is_arg_num = size_is_arg_num self.length_is_arg_num = length_is_arg_num self.tag = Type.Tags.StringWithSize @staticmethod def read(typelib, map, data_pool, offset, flags): """ Read an StringWithSizeTypeDescriptor at |offset| from the mmaped file |map| with data pool offset |data_pool|. Returns (StringWithSizeType, next offset), where |next offset| is an offset suitable for reading the data following this StringWithSizeTypeDescriptor. """ if not flags['pointer']: return None, offset start = data_pool + offset - 1 (size_is_arg_num, length_is_arg_num) = StringWithSizeType._descriptor.unpack_from(map, start) offset += StringWithSizeType._descriptor.size return StringWithSizeType(size_is_arg_num, length_is_arg_num, **flags), offset def write(self, typelib, file): """ Write a StringWithSizeTypeDescriptor to |file|, which is assumed to be seeked to the proper position. """ Type.write(self, typelib, file) file.write(StringWithSizeType._descriptor.pack(self.size_is_arg_num, self.length_is_arg_num)) def __str__(self): return "string_s" class WideStringWithSizeType(Type): """ A type representing a UTF-16 encoded string whose size and length are passed as separate arguments to a method. (WideStringWithSizeTypeDescriptor from the typelib specification.) """ _descriptor = struct.Struct(">BB") def __init__(self, size_is_arg_num, length_is_arg_num, pointer=True, **kwargs): if not pointer: raise DataError, "WideStringWithSizeType is not valid with pointer=False" Type.__init__(self, pointer=pointer, **kwargs) self.size_is_arg_num = size_is_arg_num self.length_is_arg_num = length_is_arg_num self.tag = Type.Tags.WideStringWithSize @staticmethod def read(typelib, map, data_pool, offset, flags): """ Read an WideStringWithSizeTypeDescriptor at |offset| from the mmaped file |map| with data pool offset |data_pool|. Returns (WideStringWithSizeType, next offset), where |next offset| is an offset suitable for reading the data following this WideStringWithSizeTypeDescriptor. """ if not flags['pointer']: return None, offset start = data_pool + offset - 1 (size_is_arg_num, length_is_arg_num) = WideStringWithSizeType._descriptor.unpack_from(map, start) offset += WideStringWithSizeType._descriptor.size return WideStringWithSizeType(size_is_arg_num, length_is_arg_num, **flags), offset def write(self, typelib, file): """ Write a WideStringWithSizeTypeDescriptor to |file|, which is assumed to be seeked to the proper position. """ Type.write(self, typelib, file) file.write(WideStringWithSizeType._descriptor.pack(self.size_is_arg_num, self.length_is_arg_num)) def __str__(self): return "wstring_s" class Param(object): """ A parameter to a method, or the return value of a method. (ParamDescriptor from the typelib specification.) """ _descriptorstart = struct.Struct(">B") def __init__(self, type, in_=True, out=False, retval=False, shared=False, dipper=False, optional=False): """ Construct a Param object with the specified |type| and flags. Params default to "in". """ self.type = type self.in_ = in_ self.out = out self.retval = retval self.shared = shared self.dipper = dipper self.optional = optional @staticmethod def decodeflags(byte): """ Given |byte|, an unsigned uint8 containing flag bits, decode the flag bits as described in http://www.mozilla.org/scriptable/typelib_file.html#ParamDescriptor and return a dict of flagname: (True|False) suitable for passing to Param.__init__ as **kwargs """ return {'in_': bool(byte & 0x80), 'out': bool(byte & 0x40), 'retval': bool(byte & 0x20), 'shared': bool(byte & 0x10), 'dipper': bool(byte & 0x08), #XXX: Not in the spec, see: # http://hg.mozilla.org/mozilla-central/annotate/0e0e2516f04e/xpcom/typelib/xpt/public/xpt_struct.h#l456 'optional': bool(byte & 0x04), } def encodeflags(self): """ Encode the flags of this Param. Return a byte suitable for writing to a typelib file. """ flags = 0 if self.in_: flags |= 0x80 if self.out: flags |= 0x40 if self.retval: flags |= 0x20 if self.shared: flags |= 0x10 if self.dipper: flags |= 0x08 if self.optional: flags |= 0x04 return flags @staticmethod def read(typelib, map, data_pool, offset): """ Read a ParamDescriptor at |offset| from the mmaped file |map| with data pool offset |data_pool|. Returns (Param, next offset), where |next offset| is an offset suitable for reading the data following this ParamDescriptor. """ start = data_pool + offset - 1 (flags,) = Param._descriptorstart.unpack_from(map, start) # only the first five bits are flags flags &= 0xFC flags = Param.decodeflags(flags) offset += Param._descriptorstart.size t, offset = Type.read(typelib, map, data_pool, offset) p = Param(t, **flags) return p, offset def write(self, typelib, file): """ Write a ParamDescriptor to |file|, which is assumed to be seeked to the correct position. """ file.write(Param._descriptorstart.pack(self.encodeflags())) self.type.write(typelib, file) def prefix(self): """ Return a human-readable string representing the flags set on this Param. """ s = "" if self.out: if self.in_: s = "inout " else: s = "out " else: s = "in " if self.dipper: s += "dipper " if self.retval: s += "retval " if self.shared: s += "shared " if self.optional: s += "optional " return s def __str__(self): return self.prefix() + str(self.type) class Method(object): """ A method of an interface, defining its associated parameters and return value. (MethodDescriptor from the typelib specification.) """ _descriptorstart = struct.Struct(">BIB") def __init__(self, name, result, params=[], getter=False, setter=False, notxpcom=False, constructor=False, hidden=False, optargc=False, implicit_jscontext=False): self.name = name self._name_offset = 0 self.getter = getter self.setter = setter self.notxpcom = notxpcom self.constructor = constructor self.hidden = hidden self.optargc = optargc self.implicit_jscontext = implicit_jscontext self.params = list(params) if result and not isinstance(result, Param): raise Exception("result must be a Param!") self.result = result def read_params(self, typelib, map, data_pool, offset, num_args): """ Read |num_args| ParamDescriptors representing this Method's arguments from the mmaped file |map| with data pool at the offset |data_pool|, starting at |offset| into self.params. Returns the offset suitable for reading the data following the ParamDescriptor array. """ for i in range(num_args): p, offset = Param.read(typelib, map, data_pool, offset) self.params.append(p) return offset def read_result(self, typelib, map, data_pool, offset): """ Read a ParamDescriptor representing this Method's return type from the mmaped file |map| with data pool at the offset |data_pool|, starting at |offset| into self.result. Returns the offset suitable for reading the data following the ParamDescriptor. """ self.result, offset = Param.read(typelib, map, data_pool, offset) return offset @staticmethod def decodeflags(byte): """ Given |byte|, an unsigned uint8 containing flag bits, decode the flag bits as described in http://www.mozilla.org/scriptable/typelib_file.html#MethodDescriptor and return a dict of flagname: (True|False) suitable for passing to Method.__init__ as **kwargs """ return {'getter': bool(byte & 0x80), 'setter': bool(byte & 0x40), 'notxpcom': bool(byte & 0x20), 'constructor': bool(byte & 0x10), 'hidden': bool(byte & 0x08), # Not in the spec, see # http://hg.mozilla.org/mozilla-central/annotate/0e0e2516f04e/xpcom/typelib/xpt/public/xpt_struct.h#l489 'optargc': bool(byte & 0x04), 'implicit_jscontext': bool(byte & 0x02), } def encodeflags(self): """ Encode the flags of this Method object, return a byte suitable for writing to a typelib file. """ flags = 0 if self.getter: flags |= 0x80 if self.setter: flags |= 0x40 if self.notxpcom: flags |= 0x20 if self.constructor: flags |= 0x10 if self.hidden: flags |= 0x08 if self.optargc: flags |= 0x04 if self.implicit_jscontext: flags |= 0x02 return flags @staticmethod def read(typelib, map, data_pool, offset): """ Read a MethodDescriptor at |offset| from the mmaped file |map| with data pool offset |data_pool|. Returns (Method, next offset), where |next offset| is an offset suitable for reading the data following this MethodDescriptor. """ start = data_pool + offset - 1 flags, name_offset, num_args = Method._descriptorstart.unpack_from(map, start) # only the first seven bits are flags flags &= 0xFE flags = Method.decodeflags(flags) name = Typelib.read_string(map, data_pool, name_offset) m = Method(name, None, **flags) offset += Method._descriptorstart.size offset = m.read_params(typelib, map, data_pool, offset, num_args) offset = m.read_result(typelib, map, data_pool, offset) return m, offset def write(self, typelib, file): """ Write a MethodDescriptor to |file|, which is assumed to be seeked to the right position. """ file.write(Method._descriptorstart.pack(self.encodeflags(), self._name_offset, len(self.params))) for p in self.params: p.write(typelib, file) self.result.write(typelib, file) def write_name(self, file, data_pool_offset): """ Write this method's name to |file|. Assumes that |file| is currently seeked to an unused portion of the data pool. """ if self.name: self._name_offset = file.tell() - data_pool_offset + 1 file.write(self.name + "\x00") else: self._name_offset = 0 class Constant(object): """ A constant value of a specific type defined on an interface. (ConstantDesciptor from the typelib specification.) """ _descriptorstart = struct.Struct(">I") # Actual value is restricted to this set of types #XXX: the spec lies, the source allows a bunch more # http://hg.mozilla.org/mozilla-central/annotate/9c85f9aaec8c/xpcom/typelib/xpt/src/xpt_struct.c#l689 typemap = {Type.Tags.int16: '>h', Type.Tags.uint16: '>H', Type.Tags.int32: '>i', Type.Tags.uint32: '>I'} def __init__(self, name, type, value): self.name = name self._name_offset = 0 self.type = type self.value = value @staticmethod def read(typelib, map, data_pool, offset): """ Read a ConstDescriptor at |offset| from the mmaped file |map| with data pool offset |data_pool|. Returns (Constant, next offset), where |next offset| is an offset suitable for reading the data following this ConstDescriptor. """ start = data_pool + offset - 1 (name_offset,) = Constant._descriptorstart.unpack_from(map, start) name = Typelib.read_string(map, data_pool, name_offset) offset += Constant._descriptorstart.size # Read TypeDescriptor t, offset = Type.read(typelib, map, data_pool, offset) c = None if isinstance(t, SimpleType) and t.tag in Constant.typemap: tt = Constant.typemap[t.tag] start = data_pool + offset - 1 (val,) = struct.unpack_from(tt, map, start) offset += struct.calcsize(tt) c = Constant(name, t, val) return c, offset def write(self, typelib, file): """ Write a ConstDescriptor to |file|, which is assumed to be seeked to the proper position. """ file.write(Constant._descriptorstart.pack(self._name_offset)) self.type.write(typelib, file) tt = Constant.typemap[self.type.tag] file.write(struct.pack(tt, self.value)) def write_name(self, file, data_pool_offset): """ Write this constants's name to |file|. Assumes that |file| is currently seeked to an unused portion of the data pool. """ if self.name: self._name_offset = file.tell() - data_pool_offset + 1 file.write(self.name + "\x00") else: self._name_offset = 0 def __repr__(self): return "Constant(%s, %s, %d)" % (self.name, str(self.type), self.value) class Interface(object): """ An Interface represents an object, with its associated methods and constant values. (InterfaceDescriptor from the typelib specification.) """ _direntry = struct.Struct(">16sIII") _descriptorstart = struct.Struct(">HH") UNRESOLVED_IID = "00000000-0000-0000-0000-000000000000" def __init__(self, name, iid=UNRESOLVED_IID, namespace="", resolved=False, parent=None, methods=[], constants=[], scriptable=False, function=False, builtinclass=False): self.resolved = resolved #TODO: should validate IIDs! self.iid = iid self.name = name self.namespace = namespace # if unresolved, all the members following this are unusable self.parent = parent self.methods = list(methods) self.constants = list(constants) self.scriptable = scriptable self.function = function self.builtinclass = builtinclass # For sanity, if someone constructs an Interface and passes # in methods or constants, then it's resolved. if self.methods or self.constants: # make sure it has a valid IID if self.iid == Interface.UNRESOLVED_IID: raise DataError, "Cannot instantiate Interface %s containing methods or constants with an unresolved IID" % self.name self.resolved = True # These are only used for writing out the interface self._descriptor_offset = 0 self._name_offset = 0 self._namespace_offset = 0 self.xpt_filename = None def __repr__(self): return "Interface('%s', '%s', '%s', methods=%s)" % (self.name, self.iid, self.namespace, self.methods) def __str__(self): return "Interface(name='%s', iid='%s')" % (self.name, self.iid) def __hash__(self): return hash((self.name, self.iid)) def __cmp__(self, other): c = cmp(self.iid, other.iid) if c != 0: return c c = cmp(self.name, other.name) if c != 0: return c c = cmp(self.namespace, other.namespace) if c != 0: return c # names and IIDs are the same, check resolved if self.resolved != other.resolved: if self.resolved: return -1 else: return 1 else: # both unresolved, but names and IIDs are the same, so equal return 0 #TODO: actually compare methods etc return 0 def read_descriptor(self, typelib, map, data_pool): offset = self._descriptor_offset if offset == 0: return start = data_pool + offset - 1 parent, num_methods = Interface._descriptorstart.unpack_from(map, start) if parent > 0 and parent <= len(typelib.interfaces): self.parent = typelib.interfaces[parent - 1] # Read methods offset += Interface._descriptorstart.size for i in range(num_methods): m, offset = Method.read(typelib, map, data_pool, offset) self.methods.append(m) # Read constants start = data_pool + offset - 1 (num_constants, ) = struct.unpack_from(">H", map, start) offset = offset + struct.calcsize(">H") for i in range(num_constants): c, offset = Constant.read(typelib, map, data_pool, offset) self.constants.append(c) # Read flags start = data_pool + offset - 1 (flags, ) = struct.unpack_from(">B", map, start) offset = offset + struct.calcsize(">B") # only the first two bits are flags flags &= 0xE0 if flags & 0x80: self.scriptable = True if flags & 0x40: self.function = True if flags & 0x20: self.builtinclass = True self.resolved = True def write_directory_entry(self, file): """ Write an InterfaceDirectoryEntry for this interface to |file|, which is assumed to be seeked to the correct offset. """ file.write(Interface._direntry.pack(Typelib.string_to_iid(self.iid), self._name_offset, self._namespace_offset, self._descriptor_offset)) def write(self, typelib, file, data_pool_offset): """ Write an InterfaceDescriptor to |file|, which is assumed to be seeked to the proper position. If this interface is not resolved, do not write any data. """ if not self.resolved: self._descriptor_offset = 0 return self._descriptor_offset = file.tell() - data_pool_offset + 1 parent_idx = 0 if self.parent: parent_idx = typelib.interfaces.index(self.parent) + 1 file.write(Interface._descriptorstart.pack(parent_idx, len(self.methods))) for m in self.methods: m.write(typelib, file) file.write(struct.pack(">H", len(self.constants))) for c in self.constants: c.write(typelib, file) flags = 0 if self.scriptable: flags |= 0x80 if self.function: flags |= 0x40 if self.builtinclass: flags |= 0x20 file.write(struct.pack(">B", flags)) def write_names(self, file, data_pool_offset): """ Write this interface's name and namespace to |file|, as well as the names of all of its methods and constants. Assumes that |file| is currently seeked to an unused portion of the data pool. """ if self.name: self._name_offset = file.tell() - data_pool_offset + 1 file.write(self.name + "\x00") else: self._name_offset = 0 if self.namespace: self._namespace_offset = file.tell() - data_pool_offset + 1 file.write(self.namespace + "\x00") else: self._namespace_offset = 0 for m in self.methods: m.write_name(file, data_pool_offset) for c in self.constants: c.write_name(file, data_pool_offset) class Typelib(object): """ A typelib represents one entire typelib file and all the interfaces referenced within, whether defined entirely within the typelib or merely referenced by name or IID. Typelib objects may be instantiated directly and populated with data, or the static Typelib.read method may be called to read one from a file. """ _header = struct.Struct(">16sBBHIII") def __init__(self, version=TYPELIB_VERSION, interfaces=[], annotations=[]): """ Instantiate a new Typelib. """ self.version = version self.interfaces = list(interfaces) self.annotations = list(annotations) self.filename = None @staticmethod def iid_to_string(iid): """ Convert a 16-byte IID into a UUID string. """ def hexify(s): return ''.join(["%02x" % ord(x) for x in s]) return "%s-%s-%s-%s-%s" % (hexify(iid[:4]), hexify(iid[4:6]), hexify(iid[6:8]), hexify(iid[8:10]), hexify(iid[10:])) @staticmethod def string_to_iid(iid_str): """ Convert a UUID string into a 16-byte IID. """ s = iid_str.replace('-','') return ''.join([chr(int(s[i:i+2], 16)) for i in range(0, len(s), 2)]) @staticmethod def read_string(map, data_pool, offset): if offset == 0: return "" sz = map.find('\x00', data_pool + offset - 1) if sz == -1: return "" return map[data_pool + offset - 1:sz] @staticmethod def read(input_file): """ Read a typelib from |input_file| and return the constructed Typelib object. |input_file| can be a filename or a file-like object. """ filename = "" data = None expected_size = None if isinstance(input_file, basestring): filename = input_file with open(input_file, "rb") as f: st = os.fstat(f.fileno()) data = f.read(st.st_size) expected_size = st.st_size else: data = input_file.read() (magic, major_ver, minor_ver, num_interfaces, file_length, interface_directory_offset, data_pool_offset) = Typelib._header.unpack_from(data) if magic != XPT_MAGIC: raise FileFormatError, "Bad magic: %s" % magic xpt = Typelib((major_ver, minor_ver)) xpt.filename = filename if expected_size and file_length != expected_size: raise FileFormatError, "File is of wrong length, got %d bytes, expected %d" % (expected_size, file_length) #XXX: by spec this is a zero-based file offset. however, # the xpt_xdr code always subtracts 1 from data offsets # (because that's what you do in the data pool) so it # winds up accidentally treating this as 1-based. # Filed as: https://bugzilla.mozilla.org/show_bug.cgi?id=575343 interface_directory_offset -= 1 # make a half-hearted attempt to read Annotations, # since XPIDL doesn't produce any anyway. start = Typelib._header.size (anno, ) = struct.unpack_from(">B", data, start) islast = anno & 0x80 tag = anno & 0x7F if tag == 0: # EmptyAnnotation xpt.annotations.append(None) # We don't bother handling PrivateAnnotations or anything for i in range(num_interfaces): # iid, name, namespace, interface_descriptor start = interface_directory_offset + i * Interface._direntry.size ide = Interface._direntry.unpack_from(data, start) iid = Typelib.iid_to_string(ide[0]) name = Typelib.read_string(data, data_pool_offset, ide[1]) namespace = Typelib.read_string(data, data_pool_offset, ide[2]) iface = Interface(name, iid, namespace) iface._descriptor_offset = ide[3] iface.xpt_filename = xpt.filename xpt.interfaces.append(iface) for iface in xpt.interfaces: iface.read_descriptor(xpt, data, data_pool_offset) return xpt def __repr__(self): return "" % len(self.interfaces) def _sanityCheck(self): """ Check certain assumptions about data contained in this typelib. Sort the interfaces array by IID, check that all interfaces referenced by methods exist in the array. """ self.interfaces.sort() for i in self.interfaces: if i.parent and i.parent not in self.interfaces: raise DataError, "Interface %s has parent %s not present in typelib!" % (i.name, i.parent.name) for m in i.methods: for n, p in enumerate(m.params): if isinstance(p, InterfaceType) and \ p.iface not in self.interfaces: raise DataError, "Interface method %s::%s, parameter %d references interface %s not present in typelib!" % (i.name, m.name, n, p.iface.name) if isinstance(m.result, InterfaceType) and m.result.iface not in self.interfaces: raise DataError, "Interface method %s::%s, result references interface %s not present in typelib!" % (i.name, m.name, m.result.iface.name) def writefd(self, fd): # write out space for a header + one empty annotation, # padded to 4-byte alignment. headersize = (Typelib._header.size + 1) if headersize % 4: headersize += 4 - headersize % 4 fd.write("\x00" * headersize) # save this offset, it's the interface directory offset. interface_directory_offset = fd.tell() # write out space for an interface directory fd.write("\x00" * Interface._direntry.size * len(self.interfaces)) # save this offset, it's the data pool offset. data_pool_offset = fd.tell() # write out all the interface descriptors to the data pool for i in self.interfaces: i.write_names(fd, data_pool_offset) i.write(self, fd, data_pool_offset) # now, seek back and write the header file_len = fd.tell() fd.seek(0) fd.write(Typelib._header.pack(XPT_MAGIC, TYPELIB_VERSION[0], TYPELIB_VERSION[1], len(self.interfaces), file_len, interface_directory_offset, data_pool_offset)) # write an empty annotation fd.write(struct.pack(">B", 0x80)) # now write the interface directory #XXX: bug-compatible with existing xpt lib, put it one byte # ahead of where it's supposed to be. fd.seek(interface_directory_offset - 1) for i in self.interfaces: i.write_directory_entry(fd) def write(self, output_file): """ Write the contents of this typelib to |output_file|, which can be either a filename or a file-like object. """ self._sanityCheck() if isinstance(output_file, basestring): with open(output_file, "wb") as f: self.writefd(f) else: self.writefd(output_file) def dump(self, out): """ Print a human-readable listing of the contents of this typelib to |out|, in the format of xpt_dump. """ out.write("""Header: Major version: %d Minor version: %d Number of interfaces: %d Annotations:\n""" % (self.version[0], self.version[1], len(self.interfaces))) for i, a in enumerate(self.annotations): if a is None: out.write(" Annotation #%d is empty.\n" % i) out.write("\nInterface Directory:\n") for i in self.interfaces: out.write(" - %s::%s (%s):\n" % (i.namespace, i.name, i.iid)) if not i.resolved: out.write(" [Unresolved]\n") else: if i.parent: out.write(" Parent: %s::%s\n" % (i.parent.namespace, i.parent.name)) out.write(""" Flags: Scriptable: %s BuiltinClass: %s Function: %s\n""" % (i.scriptable and "TRUE" or "FALSE", i.builtinclass and "TRUE" or "FALSE", i.function and "TRUE" or "FALSE")) out.write(" Methods:\n") if len(i.methods) == 0: out.write(" No Methods\n") else: for m in i.methods: out.write(" %s%s%s%s%s%s%s %s %s(%s);\n" % ( m.getter and "G" or " ", m.setter and "S" or " ", m.hidden and "H" or " ", m.notxpcom and "N" or " ", m.constructor and "C" or " ", m.optargc and "O" or " ", m.implicit_jscontext and "J" or " ", str(m.result.type), m.name, m.params and ", ".join(str(p) for p in m.params) or "" )) out.write(" Constants:\n") if len(i.constants) == 0: out.write(" No Constants\n") else: for c in i.constants: out.write(" %s %s = %d;\n" % (c.type, c.name, c.value)) def xpt_dump(file): """ Dump the contents of |file| to stdout in the format of xpt_dump. """ t = Typelib.read(file) t.dump(sys.stdout) def xpt_link(inputs): """ Link all of the xpt files in |inputs| together and return the result as a Typelib object. All entries in inputs may be filenames or file-like objects. """ def read_input(i): if isinstance(i, Typelib): return i return Typelib.read(i) if not inputs: print >>sys.stderr, "Usage: xpt_link " return None # This is the aggregate list of interfaces. interfaces = [] # This will be a dict of replaced interface -> replaced with # containing interfaces that were replaced with interfaces from # another typelib, and the interface that replaced them. merged_interfaces = {} for f in inputs: t = read_input(f) interfaces.extend(t.interfaces) # Sort interfaces by name so we can merge adjacent duplicates interfaces.sort(key=operator.attrgetter('name')) Result = enum('Equal', # Interfaces the same, doesn't matter 'NotEqual', # Interfaces differ, keep both 'KeepFirst', # Replace second interface with first 'KeepSecond')# Replace first interface with second def compare(i, j): """ Compare two interfaces, determine if they're equal or completely different, or should be merged (and indicate which one to keep in that case). """ if i == j: # Arbitrary, just pick one return Result.Equal if i.name != j.name: if i.iid == j.iid and i.iid != Interface.UNRESOLVED_IID: # Same IID but different names: raise an exception. raise DataError, \ "Typelibs contain definitions of interface %s" \ " with different names (%s (%s) vs %s (%s))!" % \ (i.iid, i.name, i.xpt_filename, j.name, j.xpt_filename) # Otherwise just different interfaces. return Result.NotEqual # Interfaces have the same name, so either they need to be merged # or there's a data error. Sort out which one to keep if i.resolved != j.resolved: # prefer resolved interfaces over unresolved if j.resolved: assert i.iid == j.iid or i.iid == Interface.UNRESOLVED_IID # keep j return Result.KeepSecond else: assert i.iid == j.iid or j.iid == Interface.UNRESOLVED_IID # replace j with i return Result.KeepFirst elif i.iid != j.iid: # Prefer unresolved interfaces with valid IIDs if j.iid == Interface.UNRESOLVED_IID: # replace j with i assert not j.resolved return Result.KeepFirst elif i.iid == Interface.UNRESOLVED_IID: # keep j assert not i.resolved return Result.KeepSecond else: # Same name but different IIDs: raise an exception. raise DataError, \ "Typelibs contain definitions of interface %s" \ " with different IIDs (%s (%s) vs %s (%s))!" % \ (i.name, i.iid, i.xpt_filename, \ j.iid, j.xpt_filename) raise DataError, "No idea what happened here: %s:%s (%s), %s:%s (%s)" % \ (i.name, i.iid, i.xpt_filename, j.name, j.iid, j.xpt_filename) # Compare interfaces pairwise to find duplicates that should be merged. i = 1 while i < len(interfaces): res = compare(interfaces[i-1], interfaces[i]) if res == Result.NotEqual: i += 1 elif res == Result.Equal: # Need to drop one but it doesn't matter which del interfaces[i] elif res == Result.KeepFirst: merged_interfaces[interfaces[i]] = interfaces[i-1] del interfaces[i] elif res == Result.KeepSecond: merged_interfaces[interfaces[i-1]] = interfaces[i] del interfaces[i-1] # Now fixup any merged interfaces def checkType(t): if isinstance(t, InterfaceType) and t.iface in merged_interfaces: t.iface = merged_interfaces[t.iface] elif isinstance(t, ArrayType) and \ isinstance(t.element_type, InterfaceType) and \ t.element_type.iface in merged_interfaces: t.element_type.iface = merged_interfaces[t.element_type.iface] for i in interfaces: # Replace parent references if i.parent in merged_interfaces: i.parent = merged_interfaces[i.parent] for m in i.methods: # Replace InterfaceType params and return values checkType(m.result.type) for p in m.params: checkType(p.type) # Re-sort interfaces (by IID) interfaces.sort() return Typelib(interfaces=interfaces) if __name__ == '__main__': if len(sys.argv) < 3: print >>sys.stderr, "xpt " sys.exit(1) if sys.argv[1] == 'dump': xpt_dump(sys.argv[2]) elif sys.argv[1] == 'link': xpt_link(sys.argv[3:]).write(sys.argv[2]) enigmail-2.0.8/util/xptgen000077500000000000000000000024351334302754500155300ustar00rootroot00000000000000#!/bin/sh # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. ## Wrapper script for creating xpt files from idl files # Parameters # 1 - python directory # 2 - additional interfaces dir # 3 - Directory of typelib.py # 4 - DIST directory # 4 .. n - idl file name mkdir -p _xpidlgen PYTHON=$1 SDK_DIR=$2 TYPELIB_DIR=$3 DIST=$4 shift 4 XPTFILES="" while [ $# -gt 0 ]; do XPIFILE=$1 XPTFILE=`basename $1 | sed s/.idl$/.xpt/` XPTFILES="$XPTFILES _xpidlgen/$XPTFILE" ${PYTHON} \ ${TYPELIB_DIR}/typelib.py \ -I${SDK_DIR} \ -o _xpidlgen/${XPTFILE} \ ${XPIFILE} if [ $? -ne 0 ]; then echo "** Could not create xpt file for $XPIFILE" exit 1 fi # ${PYTHON} -u ${TOPDIR}/mozilla/config/pythonpath.py \ # -I${TOPDIR}/mozilla/xpcom/typelib/xpt/tools \ # ${DEPTH}/mozilla/dist/sdk/bin/header.py \ # -I${TOPDIR}/mailnews/extensions/enigmail/public \ # -I../../../../mozilla/dist/idl \ # ${SRCDIR}/${XPTBASE}.idl \ # -d .deps/${XPTBASE}.pp \ # -o ${HDRFILE} shift done mkdir -p ${DIST}/components ${PYTHON} \ ${TYPELIB_DIR}/xpt.py \ link \ ${DIST}/components/enigmail.xpt \ $XPTFILES enigmail-2.0.8/uuid_enig.txt000066400000000000000000000010001334302754500160140ustar00rootroot00000000000000uuid_enig.txt: UUIDs used by Enigmail -------------------------------------- 5 Apr 2001 A block of 256 UUIDs was generated by running uuidgen, ranging from /* 847b3a00-7ab1-11d4-8f02-006008948af5 */ to /* 847b3aff-7ab1-11d4-8f02-006008948af5 */ with the 7th and 8th hex digits varying from 00 to ff. Of these, the following UUIDs are being used as IIDs and CIDs: nsIEnigMail IID "847b3a00-7ab1-11d4-8f02-006008948af5" nsIEnigMsgCompFields IID "847b3a30-7ab1-11d4-8f02-006008948af5"