From cvs at cvs.gnupg.org Tue May 1 16:18:48 2018 From: cvs at cvs.gnupg.org (by emma peel) Date: Tue, 01 May 2018 16:18:48 +0200 Subject: [git] GPG-ERROR - branch, master, updated. libgpg-error-1.30-2-g7e2517a Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "Error codes used by GnuPG et al.". The branch, master has been updated via 7e2517a29619c35257b38aa137b6772e471d7e4e (commit) from be7653e1fee62496a58b7fe5e3e259ed74cbf657 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 7e2517a29619c35257b38aa137b6772e471d7e4e Author: emma peel Date: Sun Apr 15 08:54:29 2018 +0000 po: new Spanish translation Signed-off-by: Daniel Kahn Gillmor diff --git a/po/es.po b/po/es.po new file mode 100644 index 0000000..d975c41 --- /dev/null +++ b/po/es.po @@ -0,0 +1,1360 @@ +# +# Copyright (C) 2018 g10 Code GmbH +# This file is distributed under the same license as the libgpg-error package. +# emma peel , 2018 +# +msgid "" +msgstr "" +"Project-Id-Version: libgpg-error 1.30-beta4\n" +"Report-Msgid-Bugs-To: translations at gnupg.org\n" +"PO-Revision-Date: 2018-04-15 08:52+0000\n" +"Language-Team: es \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Last-Translator: Tails translators \n" +"X-Generator: Poedit 1.8.11\n" + +msgid "Unspecified source" +msgstr "Fuente no especificada" + +msgid "gcrypt" +msgstr "gcrypt" + +msgid "GnuPG" +msgstr "GnuPG" + +msgid "GpgSM" +msgstr "GpgSM" + +msgid "GPG Agent" +msgstr "GPG Agent" + +msgid "Pinentry" +msgstr "Pinentry" + +msgid "SCD" +msgstr "SCD" + +msgid "GPGME" +msgstr "GPGME" + +msgid "Keybox" +msgstr "Keybox" + +msgid "KSBA" +msgstr "KSBA" + +msgid "Dirmngr" +msgstr "Dirmngr" + +msgid "GSTI" +msgstr "GSTI" + +msgid "GPA" +msgstr "GPA" + +msgid "Kleopatra" +msgstr "Kleopatra" + +msgid "G13" +msgstr "G13" + +msgid "Assuan" +msgstr "Assuan" + +msgid "TLS" +msgstr "TLS" + +msgid "Any source" +msgstr "Cualquier origen" + +msgid "User defined source 1" +msgstr "Origen determinado por el usuario 1" + +msgid "User defined source 2" +msgstr "Origen determinado por el usuario 2" + +msgid "User defined source 3" +msgstr "Origen determinado por el usuario 3" + +msgid "User defined source 4" +msgstr "Origen determinado por el usuario 4" + +msgid "Unknown source" +msgstr "Origen desconocido" + +msgid "Success" +msgstr "?xito" + +msgid "General error" +msgstr "Error general" + +msgid "Unknown packet" +msgstr "Paquete desconocido" + +msgid "Unknown version in packet" +msgstr "Versi?n desconocida en el paquete" + +msgid "Invalid public key algorithm" +msgstr "Algoritmo de clave p?blica no v?lido" + +msgid "Invalid digest algorithm" +msgstr "Algoritmo de resumen seleccionado no v?lido" + +msgid "Bad public key" +msgstr "Clave p?blica incorrecta" + +msgid "Bad secret key" +msgstr "Clave secreta incorrecta" + +msgid "Bad signature" +msgstr "Firma incorrecta" + +msgid "No public key" +msgstr "No hay clave p?blica" + +msgid "Checksum error" +msgstr "Error de checksum" + +msgid "Bad passphrase" +msgstr "Frase contrase?a err?nea" + +msgid "Invalid cipher algorithm" +msgstr "El algoritmo de cifrado seleccionado no es correcto" + +msgid "Cannot open keyring" +msgstr "No se puede abrir el anillo de claves" + +msgid "Invalid packet" +msgstr "Paquete incorrecto" + +msgid "Invalid armor" +msgstr "Armadura incorrecta" + +msgid "No user ID" +msgstr "No hay identificador de usuario" + +msgid "No secret key" +msgstr "No tenemos la clave secreta" + +msgid "Wrong secret key used" +msgstr "Clave secreta" + +msgid "Bad session key" +msgstr "Clave incorrecta de sesi?n" + +msgid "Unknown compression algorithm" +msgstr "Algoritmo de compresi?n desconocido" + +msgid "Number is not prime" +msgstr "El n?mero no es primo" + +msgid "Invalid encoding method" +msgstr "M?todo de codificaci?n incorrecto" + +msgid "Invalid encryption scheme" +msgstr "Esquema de cifrado incorrecto" + +msgid "Invalid signature scheme" +msgstr "Esquema de firmado incorrecto" + +msgid "Invalid attribute" +msgstr "Atributo incorrecto" + +msgid "No value" +msgstr "No hay valor" + +msgid "Not found" +msgstr "No hallado" + +msgid "Value not found" +msgstr "Valor no encontrado" + +msgid "Syntax error" +msgstr "Error de sintaxis" + +msgid "Bad MPI value" +msgstr "Valor MPI incorrecto" + +msgid "Invalid passphrase" +msgstr "Frase contrase?a err?nea" + +msgid "Invalid signature class" +msgstr "Clase de firma incorrecta" + +msgid "Resources exhausted" +msgstr "Recursos agotados" + +msgid "Invalid keyring" +msgstr "Anillo de claves incorrecto" + +msgid "Trust DB error" +msgstr "Error de la base de datos de confianza" + +msgid "Bad certificate" +msgstr "Certficado incorrecto" + +msgid "Invalid user ID" +msgstr "Identificador de usuario no v?lido" + +msgid "Unexpected error" +msgstr "Error inesperado" + +msgid "Time conflict" +msgstr "Conflicto de tiempo" + +msgid "Keyserver error" +msgstr "Error del servidor de claves" + +msgid "Wrong public key algorithm" +msgstr "Algoritmo de clave p?blica equivocado" + +msgid "Tribute to D. A." +msgstr "Tributo a D. A." + +msgid "Weak encryption key" +msgstr "Clave de cifrado d?bil" + +msgid "Invalid key length" +msgstr "Longitud incorrecta de clave" + +msgid "Invalid argument" +msgstr "Argumento incorrecto" + +msgid "Syntax error in URI" +msgstr "Error de sintaxis en la URI" + +msgid "Invalid URI" +msgstr "URI incorrecta" + +msgid "Network error" +msgstr "Error de red" + +msgid "Unknown host" +msgstr "Host desconocido" + +msgid "Selftest failed" +msgstr "Ha fallado el auto-test" + +msgid "Data not encrypted" +msgstr "Los datos no est?n cifrados" + +msgid "Data not processed" +msgstr "Los datos no han sido procesados" + +msgid "Unusable public key" +msgstr "Clave p?blica no se puede usar" + +msgid "Unusable secret key" +msgstr "Clave secreta no se puede usar" + +msgid "Invalid value" +msgstr "Valor incorrecto" + +msgid "Bad certificate chain" +msgstr "Cadena de certificados incorrecta" + +msgid "Missing certificate" +msgstr "Certificado faltante" + +msgid "No data" +msgstr "No hay datos" + +msgid "Bug" +msgstr "Bug" + +msgid "Not supported" +msgstr "No disponible" + +msgid "Invalid operation code" +msgstr "C?digo de operaci?n desconocido" + +msgid "Timeout" +msgstr "Vida m?xima" + +msgid "Internal error" +msgstr "Error interno" + +msgid "EOF (gcrypt)" +msgstr "Fin de fichero (gcrypt)" + +msgid "Invalid object" +msgstr "Objecto incorrecto" + +msgid "Provided object is too short" +msgstr "El objeto es demasiado corto" + +msgid "Provided object is too large" +msgstr "El objeto es demasiado grande" + +msgid "Missing item in object" +msgstr "Falta un item en el objeto" + +msgid "Not implemented" +msgstr "No est? implementado" + +msgid "Conflicting use" +msgstr "Uso incompatible" + +msgid "Invalid cipher mode" +msgstr "Modo de cifrado incorrecto" + +msgid "Invalid flag" +msgstr "Etiqueta incorrecta" + +msgid "Invalid handle" +msgstr "" + +msgid "Result truncated" +msgstr "Resultado truncado" + +msgid "Incomplete line" +msgstr "L?nea incompleta" + +msgid "Invalid response" +msgstr "Respuesta no v?lida" + +msgid "No agent running" +msgstr "No hay ning?n agente en ejecuci?n" + +msgid "Agent error" +msgstr "Error del agente" + +msgid "Invalid data" +msgstr "Datos no v?lidos" + +msgid "Unspecific Assuan server fault" +msgstr "Error no especificado del servidor Assuan" + +msgid "General Assuan error" +msgstr "Error general de Assuan" + +msgid "Invalid session key" +msgstr "Clave de sesi?n no v?lida" + +msgid "Invalid S-expression" +msgstr "S-expression no v?lida" + +msgid "Unsupported algorithm" +msgstr "Algoritmo no soportado" + +msgid "No pinentry" +msgstr "No hay Pinentry" + +msgid "pinentry error" +msgstr "error de pinentry" + +msgid "Bad PIN" +msgstr "PIN incorrecto" + +msgid "Invalid name" +msgstr "Nombre no v?lido" + +msgid "Bad data" +msgstr "Datos corruptos" + +msgid "Invalid parameter" +msgstr "Par?metro incorrecto" + +msgid "Wrong card" +msgstr "Tarjeta incorrecta" + +msgid "No dirmngr" +msgstr "No existe dirmngr" + +msgid "dirmngr error" +msgstr "Error de dirmngr" + +msgid "Certificate revoked" +msgstr "Certificado revocado" + +msgid "No CRL known" +msgstr "No hay ning?n CRL conocido." + +msgid "CRL too old" +msgstr "CRL es demasiado antiguo" + +msgid "Line too long" +msgstr "L?nea demasiado larga" + +msgid "Not trusted" +msgstr "No confiable" + +msgid "Operation cancelled" +msgstr "Operaci?n cancelada" + +msgid "Bad CA certificate" +msgstr "Certificado CA incorrecto" + +msgid "Certificate expired" +msgstr "Certificado caducado" + +msgid "Certificate too young" +msgstr "Cadena de certificados demasiado joven" + +msgid "Unsupported certificate" +msgstr "Certificado no soportado" + +msgid "Unknown S-expression" +msgstr "S-expression desconocida" + +msgid "Unsupported protection" +msgstr "Protecci?n no soportada" + +msgid "Corrupted protection" +msgstr "Protecci?n corrompida" + +msgid "Ambiguous name" +msgstr "Nombre ambiguo" + +msgid "Card error" +msgstr "Error de tarjeta" + +msgid "Card reset required" +msgstr "Hay que resetear la tarjeta" + +msgid "Card removed" +msgstr "Tarjeta removida" + +msgid "Invalid card" +msgstr "Tarjeta no v?lida" + +msgid "Card not present" +msgstr "La tarjeta no est?" + +msgid "No PKCS15 application" +msgstr "No hay aplicaci?n PKCS15" + +msgid "Not confirmed" +msgstr "Sin confirmar" + +msgid "Configuration error" +msgstr "Error de configuraci?n" + +msgid "No policy match" +msgstr "No coincide ninguna pol?tica" + +msgid "Invalid index" +msgstr "?ndice incorrecto" + +msgid "Invalid ID" +msgstr "Identificador no v?lido" + +msgid "No SmartCard daemon" +msgstr "No hay agente de SmartCard" + +msgid "SmartCard daemon error" +msgstr "Error del agente SmartCard" + +msgid "Unsupported protocol" +msgstr "Protocolo no soportado" + +msgid "Bad PIN method" +msgstr "M?todo de PIN incorrecto" + +msgid "Card not initialized" +msgstr "Tarjeta no arrancada" + +msgid "Unsupported operation" +msgstr "Operaci?n no soportada" + +msgid "Wrong key usage" +msgstr "Uso de clave incorrecto" + +msgid "Nothing found" +msgstr "No se ha encontrado nada" + +msgid "Wrong blob type" +msgstr "Tipo de blob incorrecto" + +msgid "Missing value" +msgstr "Falta un valor" + +msgid "Hardware problem" +msgstr "Problema de hardware" + +msgid "PIN blocked" +msgstr "PIN bloqueado" + +msgid "Conditions of use not satisfied" +msgstr "Condiciones de uso no satisfechas" + +msgid "PINs are not synced" +msgstr "Los PINs no est?n sincronizados" + +msgid "Invalid CRL" +msgstr "CRL no v?lido" + +msgid "BER error" +msgstr "Error BER" + +msgid "Invalid BER" +msgstr "BER no v?lido" + +msgid "Element not found" +msgstr "No se ha encontrado el elemento" + +msgid "Identifier not found" +msgstr "No se ha encontrado el identificador" + +msgid "Invalid tag" +msgstr "Etiqueta no v?lida" + +msgid "Invalid length" +msgstr "Longitud incorrecta" + +msgid "Invalid key info" +msgstr "Informaci?n de clave incorrecta" + +msgid "Unexpected tag" +msgstr "Etiqueta inesperada" + +msgid "Not DER encoded" +msgstr "No est? encodeado en DER" + +msgid "No CMS object" +msgstr "No hay objeto CMS" + +msgid "Invalid CMS object" +msgstr "Objeto CMS no v?lido" + +msgid "Unknown CMS object" +msgstr "Objeto CMS desconocido" + +msgid "Unsupported CMS object" +msgstr "Objeto CMS no soportado" + +msgid "Unsupported encoding" +msgstr "Encoding no soportado" + +msgid "Unsupported CMS version" +msgstr "Versi?n CMS no soportada" + +msgid "Unknown algorithm" +msgstr "Algoritmo desconocido" + +msgid "Invalid crypto engine" +msgstr "Motor de cifrado no v?lido" + +msgid "Public key not trusted" +msgstr "Clave p?blica no confiable" + +msgid "Decryption failed" +msgstr "Descifrado fallido" + +msgid "Key expired" +msgstr "Clave caducada" + +msgid "Signature expired" +msgstr "Firma caducada" + +msgid "Encoding problem" +msgstr "Problema de codificaci?n" + +msgid "Invalid state" +msgstr "Estado no v?lido" + +msgid "Duplicated value" +msgstr "Valor duplicado" + +msgid "Missing action" +msgstr "Acci?n faltante" + +msgid "ASN.1 module not found" +msgstr "No se ha encontrado el M?dulo ASN.1" + +msgid "Invalid OID string" +msgstr "Cadena OID no v?lida" + +msgid "Invalid time" +msgstr "Hora equivocada" + +msgid "Invalid CRL object" +msgstr "Objecto CRL incorrecto" + +msgid "Unsupported CRL version" +msgstr "Versi?n CRL no soportada" + +msgid "Invalid certificate object" +msgstr "Certificado de objeto incorrecto" + +msgid "Unknown name" +msgstr "Nombre desconocido" + +msgid "A locale function failed" +msgstr "Una funci?n locale ha fallado" + +# What is not locked? the translation depends on the gender of the thing locked (bloqueado/bloqueada) +msgid "Not locked" +msgstr "No est? bloqueada" + +msgid "Protocol violation" +msgstr "Violaci?n de protocolo" + +msgid "Invalid MAC" +msgstr "Mac incorrecta" + +msgid "Invalid request" +msgstr "Consulta no v?lida" + +msgid "Unknown extension" +msgstr "Extensi?n desconocida" + +msgid "Unknown critical extension" +msgstr "Extensi?n cr?tica desconocida" + +# needs information about the subject, because it has gender in Spanish and probably other languages too +msgid "Locked" +msgstr "Bloqueada" + +msgid "Unknown option" +msgstr "Opci?n desconocida" + +msgid "Unknown command" +msgstr "Orden desconocida" + +msgid "Not operational" +msgstr "No operativo" + +msgid "No passphrase given" +msgstr "No se ha dado ninguna frase contrase?a" + +msgid "No PIN given" +msgstr "No se ha dado ning?n PIN" + +# gender information missing +msgid "Not enabled" +msgstr "No habilitado" + +msgid "No crypto engine" +msgstr "No hay ning?n motor de cifrado" + +msgid "Missing key" +msgstr "Falta la clave" + +msgid "Too many objects" +msgstr "Demasiados objetos" + +msgid "Limit reached" +msgstr "Se ha alcanzado el l?mite" + +msgid "Not initialized" +msgstr "Sin inicializar" + +msgid "Missing issuer certificate" +msgstr "Falta el certificado del emisor" + +msgid "No keyserver available" +msgstr "No hay ning?n servidor de claves disponible" + +msgid "Invalid elliptic curve" +msgstr "Curva el?ptica incorrecta" + +msgid "Unknown elliptic curve" +msgstr "Curva el?ptica desconocida" + +msgid "Duplicated key" +msgstr "Clave duplicada" + +msgid "Ambiguous result" +msgstr "Resultado ambiguo" + +msgid "No crypto context" +msgstr "No hay contexto de cifrado" + +msgid "Wrong crypto context" +msgstr "Contexto de cifrado incorrecto" + +msgid "Bad crypto context" +msgstr "Contexto de cifrado equivocado" + +msgid "Conflict in the crypto context" +msgstr "Conflicto en el contexto de cifrado" + +msgid "Broken public key" +msgstr "Clave p?blica rota" + +msgid "Broken secret key" +msgstr "Clave secreta rota" + +msgid "Invalid MAC algorithm" +msgstr "Algoritmo MAC no v?lido" + +msgid "Operation fully cancelled" +msgstr "Operaci?n cancelada definitivamente" + +msgid "Operation not yet finished" +msgstr "Operaci?n a?n no terminada" + +msgid "Buffer too short" +msgstr "Buffer demasiado corto" + +msgid "Invalid length specifier in S-expression" +msgstr "Especificador de largo no v?lido en S-expression" + +msgid "String too long in S-expression" +msgstr "Cadena demasiado larga en S-expression" + +msgid "Unmatched parentheses in S-expression" +msgstr "Par?ntesis incompleto en S-expression" + +msgid "S-expression not canonical" +msgstr "S-expression no can?nica" + +msgid "Bad character in S-expression" +msgstr "Caracter err?neo en la S-expression" + +msgid "Bad quotation in S-expression" +msgstr "" + +msgid "Zero prefix in S-expression" +msgstr "Prefijo cero en S-expression" + +msgid "Nested display hints in S-expression" +msgstr "" + +msgid "Unmatched display hints" +msgstr "" + +msgid "Unexpected reserved punctuation in S-expression" +msgstr "" + +msgid "Bad hexadecimal character in S-expression" +msgstr "" + +msgid "Odd hexadecimal numbers in S-expression" +msgstr "" + +msgid "Bad octal character in S-expression" +msgstr "" + +msgid "All subkeys are expired or revoked" +msgstr "Todas las subclaves est?n caducadas o revocadas" + +msgid "Database is corrupted" +msgstr "La base de datos est? corrompida" + +msgid "Server indicated a failure" +msgstr "El servidor ha indicado un fallo" + +msgid "No name" +msgstr "" + +msgid "No key" +msgstr "" + +msgid "Legacy key" +msgstr "Clave heredada" + +msgid "Request too short" +msgstr "Consulta demasiado corta" + +msgid "Request too long" +msgstr "Consulta demasiado larga" + +msgid "Object is in termination state" +msgstr "" + +msgid "No certificate chain" +msgstr "No hay cadena de certificados" + +msgid "Certificate is too large" +msgstr "" + +msgid "Invalid record" +msgstr "" + +msgid "The MAC does not verify" +msgstr "" + +msgid "Unexpected message" +msgstr "Mensaje inesperado" + +msgid "Compression or decompression failed" +msgstr "Han fallado la compresi?n o la descompresi?n" + +msgid "A counter would wrap" +msgstr "" + +msgid "Fatal alert message received" +msgstr "" + +msgid "No cipher algorithm" +msgstr "No hay algoritmo de cifrado" + +msgid "Missing client certificate" +msgstr "Falta el certificado de cliente" + +msgid "Close notification received" +msgstr "Recibida notificaci?n de cierre" + +msgid "Ticket expired" +msgstr "Ticket caducado" + +msgid "Bad ticket" +msgstr "Ticket err?neo" + +msgid "Unknown identity" +msgstr "Identidad desconocida" + +msgid "Bad certificate message in handshake" +msgstr "Mensaje err?neo de certificado en el handshake" + +msgid "Bad certificate request message in handshake" +msgstr "Mensaje err?neo de pedido de certificado en el handshake" + +msgid "Bad certificate verify message in handshake" +msgstr "Mensaje err?neo de verificaci?n de certificado en el handshake" + +msgid "Bad change cipher message in handshake" +msgstr "Mensaje err?neo de cambio de cifrado en el handshake" + +msgid "Bad client hello message in handshake" +msgstr "Mensaje err?neo de hola del cliente en el handshake" + +msgid "Bad server hello message in handshake" +msgstr "Mensaje err?neo de hola del servidor en el handshake" + +msgid "Bad server hello done message in handshake" +msgstr "" + +msgid "Bad finished message in handshake" +msgstr "Mensaje mal terminado en el handshake" + +msgid "Bad server key exchange message in handshake" +msgstr "" + +msgid "Bad client key exchange message in handshake" +msgstr "" + +msgid "Bogus string" +msgstr "" + +msgid "Forbidden" +msgstr "Prohibido" + +msgid "Key disabled" +msgstr "" + +msgid "Not possible with a card based key" +msgstr "La operaci?n no es posible con una clave basada en tarjeta" + +msgid "Invalid lock object" +msgstr "" + +msgid "True" +msgstr "" + +msgid "False" +msgstr "" + +msgid "General IPC error" +msgstr "" + +msgid "IPC accept call failed" +msgstr "" + +msgid "IPC connect call failed" +msgstr "" + +msgid "Invalid IPC response" +msgstr "" + +msgid "Invalid value passed to IPC" +msgstr "" + +msgid "Incomplete line passed to IPC" +msgstr "" + +msgid "Line passed to IPC too long" +msgstr "La l?nea pasada a IPC es demasiado larga" + +msgid "Nested IPC commands" +msgstr "?rdenes IPC anidadas" + +msgid "No data callback in IPC" +msgstr "" + +msgid "No inquire callback in IPC" +msgstr "" + +msgid "Not an IPC server" +msgstr "" + +msgid "Not an IPC client" +msgstr "" + +msgid "Problem starting IPC server" +msgstr "" + +msgid "IPC read error" +msgstr "" + +msgid "IPC write error" +msgstr "" + +msgid "Too much data for IPC layer" +msgstr "" + +msgid "Unexpected IPC command" +msgstr "Orden IPC inesperada" + +msgid "Unknown IPC command" +msgstr "Orden IPC desconocida" + +msgid "IPC syntax error" +msgstr "Error de sintaxis IPC" + +msgid "IPC call has been cancelled" +msgstr "" + +msgid "No input source for IPC" +msgstr "" + +msgid "No output source for IPC" +msgstr "" + +msgid "IPC parameter error" +msgstr "" + +msgid "Unknown IPC inquire" +msgstr "" + +msgid "Crypto engine too old" +msgstr "" + +msgid "Screen or window too small" +msgstr "" + +msgid "Screen or window too large" +msgstr "" + +msgid "Required environment variable not set" +msgstr "" + +msgid "User ID already exists" +msgstr "" + +msgid "Name already exists" +msgstr "El nombre ya existe" + +msgid "Duplicated name" +msgstr "" + +msgid "Object is too young" +msgstr "" + +msgid "Object is too old" +msgstr "El objeto es demasiado antiguo" + +msgid "Unknown flag" +msgstr "" + +msgid "Invalid execution order" +msgstr "" + +msgid "Already fetched" +msgstr "Ya se ha descargado" + +msgid "Try again later" +msgstr "" + +msgid "Wrong name" +msgstr "Nombre incorrecto" + +msgid "System bug detected" +msgstr "Detectado error del sistema" + +msgid "Unknown DNS error" +msgstr "Error DNS desconocido" + +msgid "Invalid DNS section" +msgstr "Secci?n DNS incorrecta" + +msgid "Invalid textual address form" +msgstr "" + +msgid "Missing DNS query packet" +msgstr "" + +msgid "Missing DNS answer packet" +msgstr "" + +msgid "Connection closed in DNS" +msgstr "" + +msgid "Verification failed in DNS" +msgstr "" + +msgid "DNS Timeout" +msgstr "" + +msgid "General LDAP error" +msgstr "" + +msgid "General LDAP attribute error" +msgstr "" + +msgid "General LDAP name error" +msgstr "" + +msgid "General LDAP security error" +msgstr "" + +msgid "General LDAP service error" +msgstr "" + +msgid "General LDAP update error" +msgstr "" + +msgid "Experimental LDAP error code" +msgstr "C?digo de error experimental de LDAP" + +msgid "Private LDAP error code" +msgstr "C?digo de error privado de LDAP" + +msgid "Other general LDAP error" +msgstr "" + +msgid "LDAP connecting failed (X)" +msgstr "" + +msgid "LDAP referral limit exceeded" +msgstr "" + +msgid "LDAP client loop" +msgstr "" + +msgid "No LDAP results returned" +msgstr "" + +msgid "LDAP control not found" +msgstr "" + +msgid "Not supported by LDAP" +msgstr "" + +msgid "LDAP connect error" +msgstr "" + +msgid "Out of memory in LDAP" +msgstr "" + +msgid "Bad parameter to an LDAP routine" +msgstr "" + +msgid "User cancelled LDAP operation" +msgstr "Operaci?n LDAP cancelada por el usuario" + +msgid "Bad LDAP search filter" +msgstr "" + +msgid "Unknown LDAP authentication method" +msgstr "" + +msgid "Timeout in LDAP" +msgstr "" + +msgid "LDAP decoding error" +msgstr "Error de decoding de LDAP" + +msgid "LDAP encoding error" +msgstr "" + +msgid "LDAP local error" +msgstr "Error local de LDAP" + +msgid "Cannot contact LDAP server" +msgstr "No se puede conectar al servidor LDAP" + +msgid "LDAP success" +msgstr "?xito LDAP" + +msgid "LDAP operations error" +msgstr "Error de operaci?n de LDAP" + +msgid "LDAP protocol error" +msgstr "" + +msgid "Time limit exceeded in LDAP" +msgstr "" + +msgid "Size limit exceeded in LDAP" +msgstr "" + +msgid "LDAP compare false" +msgstr "" + +msgid "LDAP compare true" +msgstr "" + +msgid "LDAP authentication method not supported" +msgstr "" + +msgid "Strong(er) LDAP authentication required" +msgstr "" + +msgid "Partial LDAP results+referral received" +msgstr "" + +msgid "LDAP referral" +msgstr "" + +msgid "Administrative LDAP limit exceeded" +msgstr "" + +msgid "Critical LDAP extension is unavailable" +msgstr "Extensi?n cr?tica LDAP no disponible" + +msgid "Confidentiality required by LDAP" +msgstr "Confidencialidad requerida por LDAP" + +msgid "LDAP SASL bind in progress" +msgstr "" + +msgid "No such LDAP attribute" +msgstr "Ese atributo LDAP no existe" + +msgid "Undefined LDAP attribute type" +msgstr "" + +msgid "Inappropriate matching in LDAP" +msgstr "" + +msgid "Constraint violation in LDAP" +msgstr "" + +msgid "LDAP type or value exists" +msgstr "" + +msgid "Invalid syntax in LDAP" +msgstr "" + +msgid "No such LDAP object" +msgstr "No existe ese objeto LDAP" + +msgid "LDAP alias problem" +msgstr "" + +msgid "Invalid DN syntax in LDAP" +msgstr "" + +msgid "LDAP entry is a leaf" +msgstr "La entrada de LDAP es una hoja" + +msgid "LDAP alias dereferencing problem" +msgstr "" + +msgid "LDAP proxy authorization failure (X)" +msgstr "" + +msgid "Inappropriate LDAP authentication" +msgstr "" + +msgid "Invalid LDAP credentials" +msgstr "" + +msgid "Insufficient access for LDAP" +msgstr "" + +msgid "LDAP server is busy" +msgstr "" + +msgid "LDAP server is unavailable" +msgstr "" + +msgid "LDAP server is unwilling to perform" +msgstr "" + +msgid "Loop detected by LDAP" +msgstr "Bucle detectado por LDAP" + +msgid "LDAP naming violation" +msgstr "" + +msgid "LDAP object class violation" +msgstr "" + +msgid "LDAP operation not allowed on non-leaf" +msgstr "" + +msgid "LDAP operation not allowed on RDN" +msgstr "" + +msgid "Already exists (LDAP)" +msgstr "Ya existe (LDAP)" + +msgid "Cannot modify LDAP object class" +msgstr "" + +msgid "LDAP results too large" +msgstr "" + +msgid "LDAP operation affects multiple DSAs" +msgstr "" + +msgid "Virtual LDAP list view error" +msgstr "" + +msgid "Other LDAP error" +msgstr "Error diferente de LDAP" + +msgid "Resources exhausted in LCUP" +msgstr "" + +msgid "Security violation in LCUP" +msgstr "" + +msgid "Invalid data in LCUP" +msgstr "" + +msgid "Unsupported scheme in LCUP" +msgstr "" + +msgid "Reload required in LCUP" +msgstr "" + +msgid "LDAP cancelled" +msgstr "LDAP cancelado" + +msgid "No LDAP operation to cancel" +msgstr "" + +msgid "Too late to cancel LDAP" +msgstr "" + +msgid "Cannot cancel LDAP" +msgstr "No se puede cancelar LDAP" + +msgid "LDAP assertion failed" +msgstr "" + +msgid "Proxied authorization denied by LDAP" +msgstr "" + +msgid "User defined error code 1" +msgstr "Origen determinado por el usuario 1" + +msgid "User defined error code 2" +msgstr "Origen determinado por el usuario 2" + +msgid "User defined error code 3" +msgstr "Origen determinado por el usuario 3" + +msgid "User defined error code 4" +msgstr "Origen determinado por el usuario 4" + +msgid "User defined error code 5" +msgstr "" + +msgid "User defined error code 6" +msgstr "" + +msgid "User defined error code 7" +msgstr "" + +msgid "User defined error code 8" +msgstr "" + +msgid "User defined error code 9" +msgstr "" + +msgid "User defined error code 10" +msgstr "" + +msgid "User defined error code 11" +msgstr "" + +msgid "User defined error code 12" +msgstr "" + +msgid "User defined error code 13" +msgstr "" + +msgid "User defined error code 14" +msgstr "" + +msgid "User defined error code 15" +msgstr "" + +msgid "User defined error code 16" +msgstr "" + +msgid "System error w/o errno" +msgstr "" + +msgid "Unknown system error" +msgstr "Error desconocido del sistema" + +msgid "End of file" +msgstr "Fin del fichero" + +msgid "Unknown error code" +msgstr "C?digo de error desconocido" + +msgid "argument not expected" +msgstr "par?metro inesperado" + +msgid "read error" +msgstr "error de lectura" + +msgid "keyword too long" +msgstr "palabra clave demasiado larga" + +msgid "missing argument" +msgstr "falta el par?metro" + +msgid "invalid argument" +msgstr "par?metro incorrecto" + +msgid "invalid command" +msgstr "orden inv?lida" + +msgid "invalid alias definition" +msgstr "definici?n de alias inv?lida" + +msgid "out of core" +msgstr "memoria desbordada" + +msgid "invalid option" +msgstr "opci?n inv?lida" + +#, c-format +msgid "missing argument for option \"%.50s\"\n" +msgstr "falta par?metro para la opci?n \"%.50s\"\n" + +#, c-format +msgid "invalid argument for option \"%.50s\"\n" +msgstr "par?metro incorrecto para la opci?n \"%.50s\"\n" + +#, c-format +msgid "option \"%.50s\" does not expect an argument\n" +msgstr "la opci?n \"%.50s\" no necesita par?metros\n" + +#, c-format +msgid "invalid command \"%.50s\"\n" +msgstr "orden inv?lida \"%.50s\"\n" + +#, c-format +msgid "option \"%.50s\" is ambiguous\n" +msgstr "la opci?n \"%.50s\" es ambigua\n" + +#, c-format +msgid "command \"%.50s\" is ambiguous\n" +msgstr "la orden \"%.50s\" es ambigua\n" + +msgid "out of core\n" +msgstr "memoria desbordada\n" + +#, c-format +msgid "invalid option \"%.50s\"\n" +msgstr "opci?n inv?lida \"%.50s\"\n" + +msgid "Please report bugs to .\n" +msgstr "Reporta los problemas encontrados en .\n" + +#, c-format +msgid "warning: could not recognize %s\n" +msgstr "advertencia: no se pudo entender %s\n" ----------------------------------------------------------------------- Summary of changes: po/{zh_CN.po => es.po} | 1001 +++++++++++++++++++----------------------------- 1 file changed, 391 insertions(+), 610 deletions(-) copy po/{zh_CN.po => es.po} (54%) hooks/post-receive -- Error codes used by GnuPG et al. http://git.gnupg.org From cvs at cvs.gnupg.org Tue May 1 16:18:59 2018 From: cvs at cvs.gnupg.org (by emma peel) Date: Tue, 01 May 2018 16:18:59 +0200 Subject: [git] GPG-ERROR - branch, Spanish_trans, deleted. gpgrt-1.29-6-ga498adf Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "Error codes used by GnuPG et al.". The branch, Spanish_trans has been deleted was a498adfc84c93f0b7584d761e2481ff6a24cb969 ----------------------------------------------------------------------- a498adfc84c93f0b7584d761e2481ff6a24cb969 po: new Spanish translation ----------------------------------------------------------------------- hooks/post-receive -- Error codes used by GnuPG et al. http://git.gnupg.org From cvs at cvs.gnupg.org Tue May 1 19:56:25 2018 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Tue, 01 May 2018 19:56:25 +0200 Subject: [git] GPG-ERROR - branch, master, updated. libgpg-error-1.30-4-gc4567a0 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "Error codes used by GnuPG et al.". The branch, master has been updated via c4567a0ad64a18f88bfc58459961acca1bdb5fdb (commit) via b26a227173e8e9b91be14f06ee781c6e214e50ff (commit) from 7e2517a29619c35257b38aa137b6772e471d7e4e (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit c4567a0ad64a18f88bfc58459961acca1bdb5fdb Author: Werner Koch Date: Tue May 1 19:45:42 2018 +0200 po: Enable Spanish translation -- Signed-off-by: Werner Koch diff --git a/po/LINGUAS b/po/LINGUAS index bff6ab5..33a80b7 100644 --- a/po/LINGUAS +++ b/po/LINGUAS @@ -3,6 +3,7 @@ cs da de eo +es fr hu it commit b26a227173e8e9b91be14f06ee781c6e214e50ff Author: Werner Koch Date: Tue May 1 19:35:28 2018 +0200 core,w32: Avoid recursive use of npth_unprotect. * src/w32-estream.c (reader): Use standard free. (writer): Ditto. -- There are two errors: The minor one is that we allocated with calloc but released with _gpgrt_free. The major one is the recursive use of npth_unprotect due to the syscall_clamp mechanism: 1. Around the call to _gpgrt_w32_poll 2. By gpgrt_lock_lock on behalf of a the custom allocation handler in the worker threads at their _gpgrt_free. This problem was exhibited by GnuPG's dirmngr component. GnuPG-bug-id: 3937 Signed-off-by: Werner Koch diff --git a/src/init.c b/src/init.c index 7b3eda3..81ebd0f 100644 --- a/src/init.c +++ b/src/init.c @@ -300,7 +300,11 @@ _gpg_err_set_errno (int err) /* Internal tracing functions. Except for TRACE_FP we use flockfile - * and funlockfile to protect their use. */ + * and funlockfile to protect their use. + * + * Warning: Take care with the trace functions - they may not use any + * of our services, in particular not the syscall clamp mechanism for + * reasons explained in w32-stream.c:create_reader. */ static FILE *trace_fp; static int trace_save_errno; static int trace_with_errno; diff --git a/src/w32-estream.c b/src/w32-estream.c index c1bf212..6f916b0 100644 --- a/src/w32-estream.c +++ b/src/w32-estream.c @@ -239,7 +239,7 @@ reader (void *arg) CloseHandle (ctx->have_space_ev); CloseHandle (ctx->thread_hd); DeleteCriticalSection (&ctx->mutex); - _gpgrt_free (ctx); + free (ctx); /* Standard free! See comment in create_reader. */ return 0; } @@ -256,6 +256,13 @@ create_reader (estream_cookie_w32_pollable_t pcookie) sec_attr.nLength = sizeof sec_attr; sec_attr.bInheritHandle = FALSE; + /* The CTX must be allocated in standard system memory so that we + * won't use any custom allocation handler which may use our lock + * primitives for its implementation. The problem here is that the + * syscall clamp mechanism (e.g. nPth) would be called recursively: + * 1. For example by the caller of _gpgrt_w32_poll and 2. by + * gpgrt_lock_lock on behalf of the the custom allocation and free + * functions. */ ctx = calloc (1, sizeof *ctx); if (!ctx) { @@ -542,7 +549,7 @@ writer (void *arg) CloseHandle (ctx->thread_hd); DeleteCriticalSection (&ctx->mutex); trace (("%p: writer is destroyed", ctx)); - _gpgrt_free (ctx); + free (ctx); /* Standard free! See comment in create_writer. */ return 0; } @@ -559,6 +566,7 @@ create_writer (estream_cookie_w32_pollable_t pcookie) sec_attr.nLength = sizeof sec_attr; sec_attr.bInheritHandle = FALSE; + /* See comment at create_reader. */ ctx = calloc (1, sizeof *ctx); if (!ctx) { ----------------------------------------------------------------------- Summary of changes: po/LINGUAS | 1 + src/init.c | 6 +++++- src/w32-estream.c | 12 ++++++++++-- 3 files changed, 16 insertions(+), 3 deletions(-) hooks/post-receive -- Error codes used by GnuPG et al. http://git.gnupg.org From cvs at cvs.gnupg.org Wed May 2 14:07:49 2018 From: cvs at cvs.gnupg.org (by Andre Heinecke) Date: Wed, 02 May 2018 14:07:49 +0200 Subject: [git] GnuPG - branch, STABLE-BRANCH-2-2, updated. gnupg-2.2.6-35-g3bd7932 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, STABLE-BRANCH-2-2 has been updated via 3bd793256e2e4be52075d50ccf2df70c4a2e1a0f (commit) from a598bbeeafa30f7854230eed212b76d5c5c77f86 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 3bd793256e2e4be52075d50ccf2df70c4a2e1a0f Author: Andre Heinecke Date: Wed May 2 14:01:33 2018 +0200 common,w32: Hide spawned processes by default * common/exechelp-w32.c (gnupg_spawn_process): Use SW_HIDE instead of SW_MINIMIZE. -- Spawning minimized shows icons in the task bar so users see that background processes are started, which is unusual. I'm pretty sure that the intention of the code was to hide the window if not in spawn debug mode. This is also what GPGME does. This fixes dirmngr_ldap process windows and other spurious reports about e.g. a gpgv console window from loadswdb. GnuPG-Bug-Id: T3937 Signed-off-by: Andre Heinecke diff --git a/common/exechelp-w32.c b/common/exechelp-w32.c index 2c44e2c..da17450 100644 --- a/common/exechelp-w32.c +++ b/common/exechelp-w32.c @@ -555,7 +555,7 @@ gnupg_spawn_process (const char *pgmname, const char *argv[], memset (&si, 0, sizeof si); si.cb = sizeof (si); si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; - si.wShowWindow = DEBUG_W32_SPAWN? SW_SHOW : SW_MINIMIZE; + si.wShowWindow = DEBUG_W32_SPAWN? SW_SHOW : SW_HIDE; si.hStdInput = inpipe[0] == INVALID_HANDLE_VALUE? nullhd[0] : inpipe[0]; si.hStdOutput = outpipe[1] == INVALID_HANDLE_VALUE? nullhd[1] : outpipe[1]; si.hStdError = errpipe[1] == INVALID_HANDLE_VALUE? nullhd[2] : errpipe[1]; ----------------------------------------------------------------------- Summary of changes: common/exechelp-w32.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Wed May 2 18:47:40 2018 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Wed, 02 May 2018 18:47:40 +0200 Subject: [git] GnuPG - branch, STABLE-BRANCH-2-2, updated. gnupg-2.2.6-38-g007dde9 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, STABLE-BRANCH-2-2 has been updated via 007dde93cc3971cb51d08e8c082e172506ae7f80 (commit) via ddfd39e91a532fd31cd0c20c5d4cf9643acc58bd (commit) via 6365338816092845b0e08f25731f8eccc605d042 (commit) from 3bd793256e2e4be52075d50ccf2df70c4a2e1a0f (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 007dde93cc3971cb51d08e8c082e172506ae7f80 Author: Werner Koch Date: Wed May 2 18:40:01 2018 +0200 dirmngr: Implement timeout for dirmngr_ldap under Windows. * dirmngr/dirmngr_ldap.c (alarm_thread) [W32]: New. (set_timeout): Implement for W32. -- GnuPG-bug-id: 3937 Signed-off-by: Werner Koch diff --git a/dirmngr/dirmngr_ldap.c b/dirmngr/dirmngr_ldap.c index e05c779..8452c3b 100644 --- a/dirmngr/dirmngr_ldap.c +++ b/dirmngr/dirmngr_ldap.c @@ -381,16 +381,56 @@ catch_alarm (int dummy) } #endif + +#ifdef HAVE_W32_SYSTEM +static DWORD CALLBACK +alarm_thread (void *arg) +{ + HANDLE timer = arg; + + WaitForSingleObject (timer, INFINITE); + _exit (10); + + return 0; +} +#endif + + static void set_timeout (my_opt_t myopt) { + if (myopt->alarm_timeout) + { #ifdef HAVE_W32_SYSTEM - /* FIXME for W32. */ - (void)myopt; + static HANDLE timer; + LARGE_INTEGER due_time; + + /* A negative value is a relative time. */ + due_time.QuadPart = (unsigned long long)-10000000 * myopt->alarm_timeout; + + if (!timer) + { + SECURITY_ATTRIBUTES sec_attr; + DWORD tid; + + memset (&sec_attr, 0, sizeof sec_attr); + sec_attr.nLength = sizeof sec_attr; + sec_attr.bInheritHandle = FALSE; + + /* Create a manual resetable timer. */ + timer = CreateWaitableTimer (NULL, TRUE, NULL); + /* Intially set the timer. */ + SetWaitableTimer (timer, &due_time, 0, NULL, NULL, 0); + + if (CreateThread (&sec_attr, 0, alarm_thread, timer, 0, &tid)) + log_error ("failed to create alarm thread\n"); + } + else /* Retrigger the timer. */ + SetWaitableTimer (timer, &due_time, 0, NULL, NULL, 0); #else - if (myopt->alarm_timeout) - alarm (myopt->alarm_timeout); + alarm (myopt->alarm_timeout); #endif + } } commit ddfd39e91a532fd31cd0c20c5d4cf9643acc58bd Author: Werner Koch Date: Wed May 2 17:06:22 2018 +0200 build: New configure option to help with nPth debugging. * configure.ac: Add option --enable-npth-debug -- This requires a not yet release nPth version to have an effect. Signed-off-by: Werner Koch diff --git a/configure.ac b/configure.ac index f2814dd..e94bd30 100644 --- a/configure.ac +++ b/configure.ac @@ -963,6 +963,17 @@ else *** we need the support of the New Portable Threads Library. ***]]) fi +# +# Enable debugging of nPth +# +AC_ARG_ENABLE(npth-debug, + AC_HELP_STRING([--enable-npth-debug], + [build with debug version of npth]), + [if test $enableval = yes ; then + AC_DEFINE(NPTH_ENABLE_DEBUG,1, + [Build with debug version of nPth]) + fi]) + # commit 6365338816092845b0e08f25731f8eccc605d042 Author: Werner Koch Date: Tue May 1 19:48:44 2018 +0200 speedo: Install Spanish translation for Libgpg-error. -- Signed-off-by: Werner Koch diff --git a/build-aux/speedo/w32/inst.nsi b/build-aux/speedo/w32/inst.nsi index b89876e..df08fb0 100644 --- a/build-aux/speedo/w32/inst.nsi +++ b/build-aux/speedo/w32/inst.nsi @@ -743,6 +743,8 @@ Section "-libgpg-error" SEC_libgpg_error File share/locale/de/LC_MESSAGES/libgpg-error.mo SetOutPath "$INSTDIR\share\locale\eo\LC_MESSAGES" File share/locale/eo/LC_MESSAGES/libgpg-error.mo + SetOutPath "$INSTDIR\share\locale\es\LC_MESSAGES" + File share/locale/es/LC_MESSAGES/libgpg-error.mo SetOutPath "$INSTDIR\share\locale\fr\LC_MESSAGES" File share/locale/fr/LC_MESSAGES/libgpg-error.mo SetOutPath "$INSTDIR\share\locale\hu\LC_MESSAGES" @@ -1249,6 +1251,9 @@ Section "-un.libgpg-error" Delete "$INSTDIR\share\locale\eo\LC_MESSAGES\libgpg-error.mo" RMDir "$INSTDIR\share\locale\eo\LC_MESSAGES" RMDir "$INSTDIR\share\locale\eo" + Delete "$INSTDIR\share\locale\es\LC_MESSAGES\libgpg-error.mo" + RMDir "$INSTDIR\share\locale\es\LC_MESSAGES" + RMDir "$INSTDIR\share\locale\es" Delete "$INSTDIR\share\locale\fr\LC_MESSAGES\libgpg-error.mo" RMDir "$INSTDIR\share\locale\fr\LC_MESSAGES" RMDir "$INSTDIR\share\locale\fr" ----------------------------------------------------------------------- Summary of changes: build-aux/speedo/w32/inst.nsi | 5 +++++ configure.ac | 11 ++++++++++ dirmngr/dirmngr_ldap.c | 48 +++++++++++++++++++++++++++++++++++++++---- 3 files changed, 60 insertions(+), 4 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Wed May 2 19:10:37 2018 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Wed, 02 May 2018 19:10:37 +0200 Subject: [git] GnuPG - branch, STABLE-BRANCH-2-2, updated. gnupg-2.2.6-39-gf7f3043 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, STABLE-BRANCH-2-2 has been updated via f7f3043653abe699602f910ddd09c1405675c7f6 (commit) from 007dde93cc3971cb51d08e8c082e172506ae7f80 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit f7f3043653abe699602f910ddd09c1405675c7f6 Author: Werner Koch Date: Wed May 2 19:03:07 2018 +0200 gpg: Fix "Too many open files" when using --multifile. * common/miscellaneous.c (is_file_compressed): Don't cache the file. -- This seems to be a pretty old bug. The fix is easy and also reveals that -z0 can be used as a workaround. GnuPG-bug-id: 3951 Signed-off-by: Werner Koch diff --git a/common/miscellaneous.c b/common/miscellaneous.c index caeb66f..62ac05a 100644 --- a/common/miscellaneous.c +++ b/common/miscellaneous.c @@ -401,6 +401,7 @@ is_file_compressed (const char *s, int *ret_rc) *ret_rc = gpg_error_from_syserror (); return 0; } + iobuf_ioctl (a, IOBUF_IOCTL_NO_CACHE, 1, NULL); if ( iobuf_get_filelength( a, &overflow ) < 6 && !overflow) { *ret_rc = 0; ----------------------------------------------------------------------- Summary of changes: common/miscellaneous.c | 1 + 1 file changed, 1 insertion(+) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Wed May 2 20:29:10 2018 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Wed, 02 May 2018 20:29:10 +0200 Subject: [git] GnuPG - branch, STABLE-BRANCH-2-2, updated. gnupg-2.2.6-40-gd26363e Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, STABLE-BRANCH-2-2 has been updated via d26363e4f1933781c86cbe87077fbf1b9a2b64d8 (commit) from f7f3043653abe699602f910ddd09c1405675c7f6 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit d26363e4f1933781c86cbe87077fbf1b9a2b64d8 Author: Werner Koch Date: Wed May 2 19:44:10 2018 +0200 gpg: Fix minor memory leak in the compress filter. * g10/compress.c (push_compress_filter2): Return an error if no filter was pushed. (push_compress_filter): Ditto. (handle_compressed): Free CFX if no filter was pushed. * g10/import.c (read_block): Ditto. -- GnuPG-bug-id: 3898, 3930 Signed-off-by: Werner Koch diff --git a/g10/compress.c b/g10/compress.c index 67c9c9b..e7a6f2b 100644 --- a/g10/compress.c +++ b/g10/compress.c @@ -319,7 +319,8 @@ handle_compressed (ctrl_t ctrl, void *procctx, PKT_compressed *cd, cfx = xmalloc_clear (sizeof *cfx); cfx->release = release_context; cfx->algo = cd->algorithm; - push_compress_filter(cd->buf,cfx,cd->algorithm); + if (push_compress_filter(cd->buf, cfx, cd->algorithm)) + xfree (cfx); } if( callback ) rc = callback(cd->buf, passthru ); @@ -329,16 +330,20 @@ handle_compressed (ctrl_t ctrl, void *procctx, PKT_compressed *cd, return rc; } -void +gpg_error_t push_compress_filter(IOBUF out,compress_filter_context_t *zfx,int algo) { - push_compress_filter2(out,zfx,algo,0); + return push_compress_filter2(out,zfx,algo,0); } -void + +/* Push a compress filter and return 0 if that succeeded. */ +gpg_error_t push_compress_filter2(IOBUF out,compress_filter_context_t *zfx, int algo,int rel) { + gpg_error_t err = gpg_error (GPG_ERR_FALSE); + if(algo>=0) zfx->algo=algo; else @@ -353,16 +358,20 @@ push_compress_filter2(IOBUF out,compress_filter_context_t *zfx, case COMPRESS_ALGO_ZIP: case COMPRESS_ALGO_ZLIB: iobuf_push_filter2(out,compress_filter,zfx,rel); + err = 0; break; #endif #ifdef HAVE_BZIP2 case COMPRESS_ALGO_BZIP2: iobuf_push_filter2(out,compress_filter_bz2,zfx,rel); + err = 0; break; #endif default: BUG(); } + + return err; } diff --git a/g10/filter.h b/g10/filter.h index 9e4b1e5..2c1e513 100644 --- a/g10/filter.h +++ b/g10/filter.h @@ -140,9 +140,10 @@ void unarmor_pump_release (UnarmorPump x); int unarmor_pump (UnarmorPump x, int c); /*-- compress.c --*/ -void push_compress_filter(iobuf_t out,compress_filter_context_t *zfx,int algo); -void push_compress_filter2(iobuf_t out,compress_filter_context_t *zfx, - int algo,int rel); +gpg_error_t push_compress_filter (iobuf_t out, compress_filter_context_t *zfx, + int algo); +gpg_error_t push_compress_filter2 (iobuf_t out,compress_filter_context_t *zfx, + int algo, int rel); /*-- cipher.c --*/ int cipher_filter( void *opaque, int control, diff --git a/g10/import.c b/g10/import.c index 71e3955..c07f67f 100644 --- a/g10/import.c +++ b/g10/import.c @@ -767,7 +767,7 @@ valid_keyblock_packet (int pkttype) * Meta data (ring trust packets) are only considered of WITH_META is set. * PENDING_PKT should be initialized to NULL and not changed by the caller. * Return: 0 = okay, -1 no more blocks or another errorcode. - * The int at at R_V3KEY counts the number of unsupported v3 + * The int at R_V3KEY counts the number of unsupported v3 * keyblocks. */ static int @@ -856,7 +856,9 @@ read_block( IOBUF a, int with_meta, { compress_filter_context_t *cfx = xmalloc_clear( sizeof *cfx ); pkt->pkt.compressed->buf = NULL; - push_compress_filter2(a,cfx,pkt->pkt.compressed->algorithm,1); + if (push_compress_filter2 (a, cfx, + pkt->pkt.compressed->algorithm, 1)) + xfree (cfx); /* e.g. in case of compression_algo NONE. */ } free_packet (pkt, &parsectx); init_packet(pkt); ----------------------------------------------------------------------- Summary of changes: g10/compress.c | 17 +++++++++++++---- g10/filter.h | 7 ++++--- g10/import.c | 6 ++++-- 3 files changed, 21 insertions(+), 9 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Wed May 2 20:44:27 2018 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Wed, 02 May 2018 20:44:27 +0200 Subject: [git] GPG-ERROR - branch, master, updated. libgpg-error-1.30-6-g1a52350 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "Error codes used by GnuPG et al.". The branch, master has been updated via 1a5235083013da96cf4cac361cc60011029ad0cc (commit) via 10a984d25048a09d1c489224bae866372e8066a1 (commit) from c4567a0ad64a18f88bfc58459961acca1bdb5fdb (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 1a5235083013da96cf4cac361cc60011029ad0cc Author: Werner Koch Date: Wed May 2 20:36:45 2018 +0200 Post release updates -- diff --git a/NEWS b/NEWS index d1f112e..b604db9 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,7 @@ +Noteworthy changes in version 1.32 (unreleased) [C24/A24/R_] +----------------------------------------------- + + Noteworthy changes in version 1.31 (2018-05-02) [C24/A24/R2] ----------------------------------------------- diff --git a/configure.ac b/configure.ac index 6711987..9a462dc 100644 --- a/configure.ac +++ b/configure.ac @@ -29,7 +29,7 @@ min_automake_version="1.14" # See below for the LT versions. m4_define([mym4_package],[libgpg-error]) m4_define([mym4_major], [1]) -m4_define([mym4_minor], [31]) +m4_define([mym4_minor], [32]) # Below is m4 magic to extract and compute the revision number, the # decimalized short revision number, a beta version string, and a flag commit 10a984d25048a09d1c489224bae866372e8066a1 Author: Werner Koch Date: Wed May 2 20:28:38 2018 +0200 Release 1.31. * configure.ac: Set LT version to C24/A24/R2. diff --git a/NEWS b/NEWS index 9fb494a..d1f112e 100644 --- a/NEWS +++ b/NEWS @@ -1,11 +1,15 @@ -Noteworthy changes in version 1.31 (unreleased) [C24/A24/R_] +Noteworthy changes in version 1.31 (2018-05-02) [C24/A24/R2] ----------------------------------------------- + * Fixes another problem with gpgrt_poll under Windows. [#3937] + + * New translation for Spanish. + Noteworthy changes in version 1.30 (2018-04-30) [C24/A24/R1] ----------------------------------------------- - * Fix for a hang on Windows when using gpgrt_poll under nPth. + * Fixes a hang on Windows when using gpgrt_poll under nPth. * Build fix for Solaris. [#3869] diff --git a/configure.ac b/configure.ac index 050272e..6711987 100644 --- a/configure.ac +++ b/configure.ac @@ -51,7 +51,7 @@ AC_INIT([mym4_package],[mym4_version], [https://bugs.gnupg.org]) # Note that added error codes don't constitute an interface change. LIBGPG_ERROR_LT_CURRENT=24 LIBGPG_ERROR_LT_AGE=24 -LIBGPG_ERROR_LT_REVISION=1 +LIBGPG_ERROR_LT_REVISION=2 ################################################ AC_SUBST(LIBGPG_ERROR_LT_CURRENT) ----------------------------------------------------------------------- Summary of changes: NEWS | 12 ++++++++++-- configure.ac | 4 ++-- 2 files changed, 12 insertions(+), 4 deletions(-) hooks/post-receive -- Error codes used by GnuPG et al. http://git.gnupg.org From cvs at cvs.gnupg.org Wed May 2 22:22:06 2018 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Wed, 02 May 2018 22:22:06 +0200 Subject: [git] gnupg-doc - branch, master, updated. 388146b485a87758bba9f8bca0b5d47f114515b9 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GnuPG website and other docs". The branch, master has been updated via 388146b485a87758bba9f8bca0b5d47f114515b9 (commit) from 4b55f30463662f44ef8e52b4e35a7487b3131dac (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 388146b485a87758bba9f8bca0b5d47f114515b9 Author: Werner Koch Date: Wed May 2 22:14:42 2018 +0200 swdb: Release gnupg 2.2.7 and libgpg-error 1.31. diff --git a/web/index.org b/web/index.org index 05f58e6..8dbc895 100644 --- a/web/index.org +++ b/web/index.org @@ -65,6 +65,11 @@ The latest release news:\\ # GnuPG's latest news are available as [[http://feedvalidator.org/check.cgi?url%3Dhttps://www.gnupg.org/news.en.rss][RSS 2.0 compliant]] feed. Just # point or paste the [[news.en.rss][RSS file]] into your aggregator. +** GnuPG 2.2.7 released (2018-05-02) + +We are pleased to announce the availability of GnuPG version 2.2.7. +This is a maintenance release fixing a few problems. {[[https://lists.gnupg.org/pipermail/gnupg-announce/2018q2/000424.html][more]]} + ** GnuPG Made Easy 1.11.1 released (2018-04-20) [[file:software/gpgme/index.org][GPGME]] is a library that allows to add support for cryptography to a diff --git a/web/swdb.mac b/web/swdb.mac index caa5219..b23b2cd 100644 --- a/web/swdb.mac +++ b/web/swdb.mac @@ -10,17 +10,17 @@ # # GnuPG-2.2 # -#+macro: gnupg22_ver 2.2.6 -#+macro: gnupg22_date 2018-04-09 -#+macro: gnupg22_size 6450k -#+macro: gnupg22_sha1 295298debcc2c12f02a2f2fdf04aecb6d6aae396 -#+macro: gnupg22_sha2 e64d8c5fa2d05938a5080cb784a98ac21be0812f2a26f844b18f0d6a0e711984 +#+macro: gnupg22_ver 2.2.7 +#+macro: gnupg22_date 2018-05-02 +#+macro: gnupg22_size 6475k +#+macro: gnupg22_sha1 e222cda63409a86992369df8976f6c7511e10ea0 +#+macro: gnupg22_sha2 d95b361ee6ef7eff86af40c8c72bf9313736ac9f7010d6604d78bf83818e976e #+macro: gnupg22_branch STABLE-BRANCH-2-2 -#+macro: gnupg22_w32_ver 2.2.6_20180409 -#+macro: gnupg22_w32_date 2018-04-09 -#+macro: gnupg22_w32_size 3837k -#+macro: gnupg22_w32_sha1 c9fe66788ea40bc57a189aa13e7c83add9baec40 -#+macro: gnupg22_w32_sha2 5d426b19d9cc3d7d3c0db0dfb58af1b6a36f4ea1cfd55901bb6864e865fcccc6 +#+macro: gnupg22_w32_ver 2.2.7_20180502 +#+macro: gnupg22_w32_date 2018-05-02 +#+macro: gnupg22_w32_size 3914k +#+macro: gnupg22_w32_sha1 a00f7119c85dd837336f13be3174178d0cf8d85e +#+macro: gnupg22_w32_sha2 2d7ffedb1737e4dbed7f89377c3273b5cc27ee0fd9c70a417bd602203fc419ee # @@ -126,16 +126,16 @@ # # LIBGPG-ERROR # -#+macro: libgpg_error_ver 1.30 -#+macro: libgpg_error_date 2018-04-30 -#+macro: libgpg_error_size 876k -#+macro: libgpg_error_sha1 f9357bc404cc3c2ac5c808d665310bd5af344eb7 -#+macro: libgpg_error_sha2 238c6e87adf52b0147081927c981730756a0526ad0733201142a676786847ed7 -#+macro: gpgrt_ver 1.30 -#+macro: gpgrt_date 2018-04-30 -#+macro: gpgrt_size 876k -#+macro: gpgrt_sha1 f9357bc404cc3c2ac5c808d665310bd5af344eb7 -#+macro: gpgrt_sha2 238c6e87adf52b0147081927c981730756a0526ad0733201142a676786847ed7 +#+macro: libgpg_error_ver 1.31 +#+macro: libgpg_error_date 2018-05-02 +#+macro: libgpg_error_size 880k +#+macro: libgpg_error_sha1 2bafad316d4e3e12bae4822b14ed9020090e6acf +#+macro: libgpg_error_sha2 40d0a823c9329478063903192a1f82496083b277265904878f4bc09e0db7a4ef +#+macro: gpgrt_ver 1.31 +#+macro: gpgrt_date 2018-05-02 +#+macro: gpgrt_size 880k +#+macro: gpgrt_sha1 2bafad316d4e3e12bae4822b14ed9020090e6acf +#+macro: gpgrt_sha2 40d0a823c9329478063903192a1f82496083b277265904878f4bc09e0db7a4ef # ----------------------------------------------------------------------- Summary of changes: web/index.org | 5 +++++ web/swdb.mac | 40 ++++++++++++++++++++-------------------- 2 files changed, 25 insertions(+), 20 deletions(-) hooks/post-receive -- The GnuPG website and other docs http://git.gnupg.org From cvs at cvs.gnupg.org Thu May 3 03:44:16 2018 From: cvs at cvs.gnupg.org (by Ben McGinnes) Date: Thu, 03 May 2018 03:44:16 +0200 Subject: [git] gnupg-doc - branch, master, updated. c0cc013600b91023819fcab53d2c35af58acbbc1 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GnuPG website and other docs". The branch, master has been updated via c0cc013600b91023819fcab53d2c35af58acbbc1 (commit) from 388146b485a87758bba9f8bca0b5d47f114515b9 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit c0cc013600b91023819fcab53d2c35af58acbbc1 Author: Ben McGinnes Date: Thu May 3 11:34:35 2018 +1000 docs: GPGME page * Tightened the grammar a little. diff --git a/web/software/gpgme/index.org b/web/software/gpgme/index.org index 8f6af5e..c679295 100644 --- a/web/software/gpgme/index.org +++ b/web/software/gpgme/index.org @@ -7,18 +7,19 @@ /GnuPG Made Easy/ (GPGME) is a library designed to make access to GnuPG easier for applications. It provides a High-Level Crypto API for encryption, decryption, signing, signature verification and key - management. Currently it uses GnuPG as its backend but the API isn't - restricted to this engine; in fact we have already developed a - backend for CMS (S/MIME). + management. Currently it uses GnuPG's OpenPGP backend as the + default, but the API isn't restricted to this engine. We have, in + fact, already developed a backend for CMS (S/MIME). Because the direct use of GnuPG from an application can be a complicated programming task, it is suggested that all software should try to use GPGME instead. This way bug fixes or improvements can be done at a central place and every application benefits from - this. + this. Furthermore, there is no guarentee that any particular + command line option will remain exactly the same at any given point Especially authors of @@html:@@MUAs@@html:@@ should consider to use GPGME. + reader">@@MUAs@@html:@@ should consider using GPGME. See [[../../download/index.org::#gpgme][download]] section to download the latest tarball. The manual can be read [[https://www.gnupg.org/documentation/manuals/gpgme/][here]]. The current version is {{{gpgme_ver}}}. ----------------------------------------------------------------------- Summary of changes: web/software/gpgme/index.org | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) hooks/post-receive -- The GnuPG website and other docs http://git.gnupg.org From cvs at cvs.gnupg.org Thu May 3 14:11:49 2018 From: cvs at cvs.gnupg.org (by Maximilian Krambach) Date: Thu, 03 May 2018 14:11:49 +0200 Subject: [git] GPGME - branch, javascript-binding, updated. gpgme-1.11.1-19-g6f67814 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GnuPG Made Easy". The branch, javascript-binding has been updated via 6f67814eb45725bc7f3736a2638bad0a7470f17a (commit) from fda7b13f1b673962ce34b6f429158a7eb9cef47b (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 6f67814eb45725bc7f3736a2638bad0a7470f17a Author: Maximilian Krambach Date: Thu May 3 14:12:10 2018 +0200 js: changed Key class stub -- * src/Key.js: A Key object cannot offer more than basic functionality outside a connection, so it now requires a connection to be present. diff --git a/lang/js/src/Key.js b/lang/js/src/Key.js index 30449d6..1e0d319 100644 --- a/lang/js/src/Key.js +++ b/lang/js/src/Key.js @@ -30,11 +30,42 @@ import { isFingerprint } from './Helpers' import { gpgme_error } from './Errors' import { createMessage } from './Message'; import { permittedOperations } from './permittedOperations'; +import { Connection } from './Connection'; + + +export function createKey(fingerprint, parent){ + if (!isFingerprint(fingerprint)){ + return gpgme_error('KEY_INVALID'); + } + if ( parent instanceof Connection){ + return new GPGME_Key(fingerprint, parent); + } else if ( parent.hasOwnProperty('connection') && + parent.connection instanceof Connection){ + return new GPGME_Key(fingerprint, parent.connection); + } +} export class GPGME_Key { - constructor(fingerprint){ + constructor(fingerprint, connection){ this.fingerprint = fingerprint; + this.connection = connection; + } + + set connection(conn){ + if (this._connection instanceof Connection) { + gpgme_error('CONN_ALREADY_CONNECTED'); + } else if (conn instanceof Connection ) { + this._connection = conn; + } + } + + get connection(){ + if (!this._connection instanceof Connection){ + return gpgme_error('CONN_NO_CONNECT'); + } else { + return this._connection; + } } set fingerprint(fpr){ @@ -51,55 +82,56 @@ export class GPGME_Key { * hasSecret returns true if a secret subkey is included in this Key */ get hasSecret(){ - return checkKey(this._fingerprint, 'secret'); + return this.checkKey('secret'); } get isRevoked(){ - return checkKey(this._fingerprint, 'revoked'); + return this.checkKey('revoked'); } get isExpired(){ - return checkKey(this._fingerprint, 'expired'); + return this.checkKey('expired'); } get isDisabled(){ - return checkKey(this._fingerprint, 'disabled'); + return this.checkKey('disabled'); } get isInvalid(){ - return checkKey(this._fingerprint, 'invalid'); + return this.checkKey('invalid'); } get canEncrypt(){ - return checkKey(this._fingerprint, 'can_encrypt'); + return this.checkKey('can_encrypt'); } get canSign(){ - return checkKey(this._fingerprint, 'can_sign'); + return this.checkKey('can_sign'); } get canCertify(){ - return checkKey(this._fingerprint, 'can_certify'); + return this.checkKey('can_certify'); } get canAuthenticate(){ - return checkKey(this._fingerprint, 'can_authenticate'); + return this.checkKey('can_authenticate'); } get isQualified(){ - return checkKey(this._fingerprint, 'is_qualified'); + return this.checkKey('is_qualified'); } get armored(){ - let me = this; - return new Promise(function(resolve, reject){ - let conn = new Connection(); - conn.setFlag('armor', true); - conn.post('export',{'fpr': me._fingerprint}); + let msg = createMessage ('export_key'); + msg.setParameter('armor', true); + if (msg instanceof Error){ + return gpgme_error('INVALID_KEY'); + } + this.connection.post(msg).then(function(result){ + return result.data; }); // TODO return value not yet checked. Should result in an armored block // in correct encoding - // TODO openpgpjs also returns secKey if private = true? } /** @@ -114,21 +146,21 @@ export class GPGME_Key { * @returns {Array} */ get subkeys(){ - return checkKey(this._fingerprint, 'subkeys').then(function(result){ + return this.checkKey('subkeys').then(function(result){ // TBD expecting a list of fingerprints if (!Array.isArray(result)){ result = [result]; } let resultset = []; for (let i=0; i < result.length; i++){ - let subkey = new GPGME_Key(result[i]); + let subkey = new GPGME_Key(result[i], this.connection); if (subkey instanceof GPGME_Key){ resultset.push(subkey); } } return Promise.resolve(resultset); }, function(error){ - //TODO checkKey fails + //TODO this.checkKey fails }); } @@ -137,7 +169,7 @@ export class GPGME_Key { * @returns {Date|null} TBD */ get timestamp(){ - return checkKey(this._fingerprint, 'timestamp'); + return this.checkKey('timestamp'); //TODO GPGME: -1 if the timestamp is invalid, and 0 if it is not available. } @@ -146,7 +178,7 @@ export class GPGME_Key { * @returns {Date|null} TBD */ get expires(){ - return checkKey(this._fingerprint, 'expires'); + return this.checkKey('expires'); // TODO convert to Date; check for 0 } @@ -155,51 +187,47 @@ export class GPGME_Key { * @returns {String|Array} The user ids associated with this key */ get userIds(){ - return checkKey(this._fingerprint, 'uids'); + return this.checkKey('uids'); } /** * @returns {String} The public key algorithm supported by this subkey */ get pubkey_algo(){ - return checkKey(this._fingerprint, 'pubkey_algo'); + return this.checkKey('pubkey_algo'); } -}; -/** - * generic function to query gnupg information on a key. - * @param {*} fingerprint The identifier of the Keyring - * @param {*} property The gpgme-json property to check - * - */ -function checkKey(fingerprint, property){ - return Promise.reject(gpgme_error('NOT_YET_IMPLEMENTED')); - if (!property || !permittedOperations[keyinfo].hasOwnProperty(property)){ - return Promise.reject(gpgme_error('PARAM_WRONG')); - } - return new Promise(function(resolve, reject){ - if (!isFingerprint(fingerprint)){ - reject(gpgme_error('KEY_INVALID')); + /** + * generic function to query gnupg information on a key. + * @param {*} property The gpgme-json property to check. + * TODO: check if Promise.then(return) + */ + checkKey(property){ + return gpgme_error('NOT_YET_IMPLEMENTED'); + // TODO: async is not what is to be ecpected from Key information :( + if (!property || typeof(property) !== 'string' || + !permittedOperations['keyinfo'].hasOwnProperty(property)){ + return gpgme_error('PARAM_WRONG'); } let msg = createMessage ('keyinfo'); if (msg instanceof Error){ - reject(gpgme_error('PARAM_WRONG')); + return gpgme_error('PARAM_WRONG'); } msg.setParameter('fingerprint', this.fingerprint); - return (this.connection.post(msg)).then(function(result, error){ + this.connection.post(msg).then(function(result, error){ if (error){ - reject(gpgme_error('GNUPG_ERROR',error.msg)); + return gpgme_error('GNUPG_ERROR',error.msg); } else if (result.hasOwnProperty(property)){ - resolve(result[property]); + return result[property]; } else if (property == 'secret'){ - // TBD property undefined means "not true" in case of secret? - resolve(false); + // TBD property undefined means "not true" in case of secret? + return false; } else { - reject(gpgme_error('CONN_UNEXPECTED_ANSWER')); + return gpgme_error('CONN_UNEXPECTED_ANSWER'); } }, function(error){ - //TODO error handling + return gpgme_error('GENERIC_ERROR'); }); - }); + } }; \ No newline at end of file diff --git a/lang/js/src/Keyring.js b/lang/js/src/Keyring.js index d1f4122..2cf87c2 100644 --- a/lang/js/src/Keyring.js +++ b/lang/js/src/Keyring.js @@ -61,6 +61,7 @@ export class GPGME_Keyring { if (include_secret){ msg.setParameter('with-secret', true); } + let me = this; this.connection.post(msg).then(function(result){ let fpr_list = []; @@ -72,7 +73,7 @@ export class GPGME_Keyring { fpr_list = result.keys; } for (let i=0; i < fpr_list.length; i++){ - let newKey = new GPGME_Key(fpr_list[i]); + let newKey = new GPGME_Key(fpr_list[i], me._connection); if (newKey instanceof GPGME_Key){ resultset.push(newKey); } diff --git a/lang/js/src/gpgmejs_openpgpjs.js b/lang/js/src/gpgmejs_openpgpjs.js index c80d5a8..b233f0f 100644 --- a/lang/js/src/gpgmejs_openpgpjs.js +++ b/lang/js/src/gpgmejs_openpgpjs.js @@ -26,9 +26,10 @@ import { GpgME } from "./gpgmejs"; import {GPGME_Keyring} from "./Keyring" - import { GPGME_Key } from "./Key"; + import { GPGME_Key, createKey } from "./Key"; import { isFingerprint } from "./Helpers" import { gpgme_error } from "./Errors" +import { Connection } from "./Connection"; export class GpgME_openpgpmode { @@ -47,7 +48,7 @@ initGpgME(connection, config = {}){ if (connection && typeof(config) ==='object'){ this._config = config; - if (!this._GPGME){ + if (!this._GpgME){ this._GpgME = new GpgME(connection, config); } if (!this._keyring){ @@ -223,7 +224,7 @@ class GPGME_Keyring_openpgpmode { if ( !key.fingerprint || ! isFingerprint(key.fingerprint)){ return Promise.reject(gpgme_error('PARAM_WRONG')); } - let key_to_delete = new GPGME_Key(key.fingerprint); + let key_to_delete = createKey(key.fingerprint, this._gpgme_keyring_GpgME); return key_to_delete.deleteKey(key.secret); } } @@ -233,15 +234,22 @@ class GPGME_Keyring_openpgpmode { * Offers the Key information as the openpgpmode wants */ class GPGME_Key_openpgpmode { - constructor(value){ - this.init = value; + constructor(value, connection){ + this.init(value, connection); } - set init (value){ + /** + * Can be either constructed using an existing GPGME_Key, or a fingerprint + * and a connection + * @param {String|GPGME_Key} value + * @param {Connection} connection + */ + init (value, connection){ if (!this._GPGME_Key && value instanceof GPGME_Key){ this._GPGME_Key = value; - } else if (!this._GPGME_Key && isFingerprint(value)){ - this._GPGME_Key = new GPGME_Key(value); + } else if (!this._GPGME_Key && isFingerprint(value) && + connection instanceof Connection){ + this._GPGME_Key = createKey(value, connection); } } @@ -264,6 +272,8 @@ class GPGME_Key_openpgpmode { /** * creates GPGME_Key_openpgpmode from GPGME_Keys + * @param {GPGME_Key|Array} input keys + * @returns {Array} */ function translateKeys(input){ if (!input){ diff --git a/lang/js/src/index.js b/lang/js/src/index.js index 90fe99e..fc406c6 100644 --- a/lang/js/src/index.js +++ b/lang/js/src/index.js @@ -36,9 +36,12 @@ function init(config){ return new Promise(function(resolve, reject){ let connection = new Connection; // TODO: Delayed reaction is ugly. We need to listen to the port's - // event listener in isConnected, but this takes some time (<5ms) to - // disconnect if there is no successfull connection. + // event listener in isConnected, but in some cases this takes some + // time (<5ms) to disconnect if there is no successfull connection. let delayedreaction = function(){ + if (connection === undefined) { + reject(gpgme_error('CONN_NO_CONNECT')); + } if (connection.isConnected === true){ if (_conf.api_style && _conf.api_style === 'gpgme_openpgpjs'){ resolve(new GpgME_openpgpmode(connection, _conf)); diff --git a/lang/js/test/inputvalues.js b/lang/js/test/inputvalues.js index f6cd75a..7752b82 100644 --- a/lang/js/test/inputvalues.js +++ b/lang/js/test/inputvalues.js @@ -1,12 +1,10 @@ - -import {GPGME_Key} from "../src/Key" +import { gpgme_error } from "../src/Errors"; export const helper_params = { validLongId: '0A0A0A0A0A0A0A0A', - validGPGME_Key: new GPGME_Key('ADDBC303B6D31026F5EB4591A27EABDF283121BB'), - validKeys: [new GPGME_Key('A1E3BC45BDC8E87B74F4392D53B151A1368E50F3'), + validKeys: ['A1E3BC45BDC8E87B74F4392D53B151A1368E50F3', 'ADDBC303B6D31026F5EB4591A27EABDF283121BB', - new GPGME_Key('EE17AEE730F88F1DE7713C54BBE0A4FF7851650A')], + 'EE17AEE730F88F1DE7713C54BBE0A4FF7851650A'], validFingerprint: '9A9A7A7A8A9A9A7A7A8A9A9A7A7A8A9A9A7A7A8A', validFingerprints: ['9A9A7A7A8A9A9A7A7A8A9A9A7A7A8A9A9A7A7A8A', '9AAE7A338A9A9A7A7A8A9A9A7A7A8A9A9A7A7DDA'], @@ -14,10 +12,10 @@ export const helper_params = { invalidFingerprint: [{hello:'World'}], invalidKeyArray: {curiosity:'uncat'}, invalidKeyArray_OneBad: [ - new GPGME_Key('12AE9F3E41B33BF77DF52B6BE8EE1992D7909B08'), + '12AE9F3E41B33BF77DF52B6BE8EE1992D7909B08', 'E1D18E6E994FA9FE9360Bx0E687B940FEFEB095A', '3AEA7FE4F5F416ED18CEC63DD519450D9C0FAEE5'], - invalidErrorCode: 'Please type in all your passwords.' + invalidErrorCode: 'Please type in all your passwords.', } export const message_params = { @@ -28,10 +26,12 @@ export const message_params = { valid_op: 'encrypt', invalid_param_names: [22,'dance', {}], validparam_name_0: 'mime', - invalid_values_0: [2134, 'All your passwords', new GPGME_Key('12AE9F3E41B33BF77DF52B6BE8EE1992D7909B08'), null] + invalid_values_0: [2134, 'All your passwords', gpgme_error('12AE9F3E41B33BF77DF52B6BE8EE1992D7909B08'), null] } } - +export const whatever_params = { + four_invalid_params: ['<(((-<', '>?;==;~~', '^^', '{{{{o}}}}'] +} export default { helper_params: helper_params, ----------------------------------------------------------------------- Summary of changes: lang/js/src/Key.js | 124 ++++++++++++++++++++++++--------------- lang/js/src/Keyring.js | 3 +- lang/js/src/gpgmejs_openpgpjs.js | 26 +++++--- lang/js/src/index.js | 7 ++- lang/js/test/inputvalues.js | 18 +++--- 5 files changed, 110 insertions(+), 68 deletions(-) hooks/post-receive -- GnuPG Made Easy http://git.gnupg.org From cvs at cvs.gnupg.org Thu May 3 14:22:39 2018 From: cvs at cvs.gnupg.org (by Andre Heinecke) Date: Thu, 03 May 2018 14:22:39 +0200 Subject: [git] gnupg-doc - branch, master, updated. 0c6360d688fa0d37e17d15f938fde14824dfe011 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GnuPG website and other docs". The branch, master has been updated via 0c6360d688fa0d37e17d15f938fde14824dfe011 (commit) from c0cc013600b91023819fcab53d2c35af58acbbc1 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 0c6360d688fa0d37e17d15f938fde14824dfe011 Author: Andre Heinecke Date: Thu May 3 14:21:31 2018 +0200 swdb: Release Gpg4win 3.1.1 -- diff --git a/web/swdb.mac b/web/swdb.mac index b23b2cd..9adaf35 100644 --- a/web/swdb.mac +++ b/web/swdb.mac @@ -51,17 +51,17 @@ # # Gpg4win # -#+macro: gpg4win_ver 3.1.0 -#+macro: gpg4win_date 2018-04-13 -#+macro: gpg4win_src_size 5292k -#+macro: gpg4win_src_sha1 d0a0c7665d4bc724a5f1a83763c526754be47024 -#+macro: gpg4win_src_sha2 6d697372ec4c75a29c6daa6aca00060455825966c079efac6370140929b2c4f8 -#+macro: gpg4win_exe_size 27592k -#+macro: gpg4win_exe_sha1 fb9f39199d7b096d1397dad4aa0719de5ff05b31 -#+macro: gpg4win_exe_sha2 a416aca375a80eada7edc69efdf3757988310a2f1723cd6190d9e3113d787301 -#+macro: gpg4win_isrc_size 222756k -#+macro: gpg4win_isrc_sha1 23e9a6bc7fb1eceda7ece3a6655a09789c673ef5 -#+macro: gpg4win_isrc_sha2 ca40ade2dcb55f08d412d768f7946f9199a28edc189c4dc430dcd990b2fb8315 +#+macro: gpg4win_ver 3.1.1 +#+macro: gpg4win_date 2018-05-03 +#+macro: gpg4win_src_size 5300k +#+macro: gpg4win_src_sha1 dc0bc06c7d57be522177ee05200f704e8103bc59 +#+macro: gpg4win_src_sha2 3a98b015cbcaa5faa24a564bfbb52ac08a653bcbcd869c6e42f36b9152145b6b +#+macro: gpg4win_exe_size 27680k +#+macro: gpg4win_exe_sha1 369040c292358d68d8328d5a9b97d71f80cdf3d7 +#+macro: gpg4win_exe_sha2 b2144904f103dad48328fe125eb182c4dcfbe8093d48b74691613e0d2ed26033 +#+macro: gpg4win_isrc_size 222860k +#+macro: gpg4win_isrc_sha1 b3e4e57ecb05308aeff8e30876c0c4ce956b0234 +#+macro: gpg4win_isrc_sha2 bd2219638a2c0856f28c2c415c5a89a263885a31c4e141552348d9ae7bf3bbac # ----------------------------------------------------------------------- Summary of changes: web/swdb.mac | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) hooks/post-receive -- The GnuPG website and other docs http://git.gnupg.org From cvs at cvs.gnupg.org Thu May 3 14:29:50 2018 From: cvs at cvs.gnupg.org (by Andre Heinecke) Date: Thu, 03 May 2018 14:29:50 +0200 Subject: [git] GPG-ERROR - branch, master, updated. libgpg-error-1.31-2-g6eb80ab Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "Error codes used by GnuPG et al.". The branch, master has been updated via 6eb80abcde5ad776379069871e4156b28ef69712 (commit) from 1a5235083013da96cf4cac361cc60011029ad0cc (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 6eb80abcde5ad776379069871e4156b28ef69712 Author: Andre Heinecke Date: Thu May 3 14:27:51 2018 +0200 doc: Fix yat2m name for native w32 build * doc/Makefile.am: Handle not cross compiling but building for windows. Signed-off-by: Andre Heinecke diff --git a/doc/Makefile.am b/doc/Makefile.am index 76af5be..6f3e5a1 100644 --- a/doc/Makefile.am +++ b/doc/Makefile.am @@ -49,10 +49,15 @@ CLEANFILES += yat2m-for-build yat2m-for-build: yat2m.c $(CC_FOR_BUILD) -o $@ $(srcdir)/yat2m.c else +if HAVE_W32_SYSTEM +YAT2M_CMD = ./yat2m.exe +YAT2M_DEP = yat2m.exe +else YAT2M_CMD = ./yat2m YAT2M_DEP = yat2m endif endif +endif yat2m-stamp: $(myman_sources) $(srcdir)/version.texi @rm -f yat2m-stamp.tmp ----------------------------------------------------------------------- Summary of changes: doc/Makefile.am | 5 +++++ 1 file changed, 5 insertions(+) hooks/post-receive -- Error codes used by GnuPG et al. http://git.gnupg.org From cvs at cvs.gnupg.org Thu May 3 18:05:57 2018 From: cvs at cvs.gnupg.org (by Maximilian Krambach) Date: Thu, 03 May 2018 18:05:57 +0200 Subject: [git] GPGME - branch, javascript-binding, updated. gpgme-1.11.1-20-gc755287 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GnuPG Made Easy". The branch, javascript-binding has been updated via c755287ba845c4cbbf1d50e5aafecb2e687c7ac9 (commit) from 6f67814eb45725bc7f3736a2638bad0a7470f17a (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit c755287ba845c4cbbf1d50e5aafecb2e687c7ac9 Author: Maximilian Krambach Date: Thu May 3 18:03:22 2018 +0200 js: Added browser testing for unit tests -- * Added unittests to be run inside a Browser. To be able to access the non-exposed functions and classes, a testing bundle will be created, containing the tests (unittests.js) and the items to be tested. * src/Helpelpers, src/Key, src/Keyring: fixed some errors found during testing. diff --git a/lang/js/BrowserTestExtension/browsertest.html b/lang/js/BrowserTestExtension/browsertest.html index d2c6396..ce037a1 100644 --- a/lang/js/BrowserTestExtension/browsertest.html +++ b/lang/js/BrowserTestExtension/browsertest.html @@ -14,9 +14,11 @@ + + diff --git a/lang/js/BrowserTestExtension/runbrowsertest.js b/lang/js/BrowserTestExtension/runbrowsertest.js index 39bc3fb..308c716 100644 --- a/lang/js/BrowserTestExtension/runbrowsertest.js +++ b/lang/js/BrowserTestExtension/runbrowsertest.js @@ -19,3 +19,4 @@ */ mocha.run(); +Gpgmejs_test.unittests(); diff --git a/lang/js/BrowserTestExtension/tests/encryptTest.js b/lang/js/BrowserTestExtension/tests/encryptTest.js index e600000..2178efa 100644 --- a/lang/js/BrowserTestExtension/tests/encryptTest.js +++ b/lang/js/BrowserTestExtension/tests/encryptTest.js @@ -18,8 +18,7 @@ * SPDX-License-Identifier: LGPL-2.1+ */ describe('Encryption', function(){ - - it('Successfull encrypt', function(done){ + it('Successfull encrypt', function(){ let prm = Gpgmejs.init(); prm.then(function(context){ context.encrypt( @@ -29,10 +28,6 @@ describe('Encryption', function(){ expect(answer.data).to.be.a("string"); expect(answer.data).to.include('BEGIN PGP MESSAGE'); expect(answer.data).to.include('END PGP MESSAGE'); - done(); - }, function(err){ - expect(err).to.be.undefined; - done(); }); }); }); @@ -44,11 +39,10 @@ describe('Encryption', function(){ inputvalues.encrypt.good.data, null).then(function(answer){ expect(answer).to.be.undefined; - done(); }, function(error){ expect(error).to.be.an('Error'); expect(error.code).to.equal('MSG_INCOMPLETE'); - done() + //TODO: MSG_INCOMPLETE desired, GNUPG_ERROR coming }); }); }); @@ -61,11 +55,9 @@ describe('Encryption', function(){ expect(answer).to.be.undefined; }, function(error){ expect(error).to.be.an.instanceof(Error); - expect(error.code).to.equal('MSG_INCOMPLETE'); - done(); + expect(error.code).to.equal('PARAM_WRONG'); }); }); }); - // TODO check different valid parameter }); diff --git a/lang/js/README_testing b/lang/js/README_testing new file mode 100644 index 0000000..b61ca1a --- /dev/null +++ b/lang/js/README_testing @@ -0,0 +1,14 @@ +Test extension: + +The test extension contains tests with mocha and chai. It will be packed as an +extra extension (see build_extension.sh). + +Tests from BrowserTestExtension/tests will be run against the gpgmejs.bundle.js +itself. They aim to test the outward facing functionality and API. + +Unittests as defined in ./unittests.js will be bundled in +gpgmejs_unittests.bundle.js, and test the separate components of gpgmejs, +which mostly are not exported. + +The BrowserExtension can be installed the same way as the DemoExtension +(see README). \ No newline at end of file diff --git a/lang/js/build_extensions.sh b/lang/js/build_extensions.sh index b99a362..91d5479 100755 --- a/lang/js/build_extensions.sh +++ b/lang/js/build_extensions.sh @@ -1,11 +1,13 @@ #/!bin/bash npx webpack --config webpack.conf.js +npx webpack --config webpack.conf_unittests.js mkdir -p BrowserTestExtension/libs cp node_modules/chai/chai.js \ node_modules/mocha/mocha.css \ node_modules/mocha/mocha.js \ - build/gpgmejs.bundle.js BrowserTestExtension/libs + build/gpgmejs.bundle.js \ + build/gpgmejs_unittests.bundle.js BrowserTestExtension/libs rm -rf build/extensions mkdir -p build/extensions zip -r build/extensions/browsertest.zip BrowserTestExtension diff --git a/lang/js/src/Helpers.js b/lang/js/src/Helpers.js index 9a69f85..ea056ff 100644 --- a/lang/js/src/Helpers.js +++ b/lang/js/src/Helpers.js @@ -91,9 +91,9 @@ export function isFingerprint(string){ return hextest(string, 40); }; /** - * check if the input is a valid Hex string with a length of 16 + * TODO no usage; check if the input is a valid Hex string with a length of 16 */ -export function isLongId(string){ +function isLongId(string){ return hextest(string, 16); }; diff --git a/lang/js/src/Key.js b/lang/js/src/Key.js index 1e0d319..6d3cf17 100644 --- a/lang/js/src/Key.js +++ b/lang/js/src/Key.js @@ -61,6 +61,9 @@ export class GPGME_Key { } get connection(){ + if (!this._fingerprint){ + return gpgme_error('KEY_INVALID'); + } if (!this._connection instanceof Connection){ return gpgme_error('CONN_NO_CONNECT'); } else { @@ -75,6 +78,9 @@ export class GPGME_Key { } get fingerprint(){ + if (!this._fingerprint){ + return gpgme_error('KEY_INVALID'); + } return this._fingerprint; } @@ -125,7 +131,7 @@ export class GPGME_Key { let msg = createMessage ('export_key'); msg.setParameter('armor', true); if (msg instanceof Error){ - return gpgme_error('INVALID_KEY'); + return gpgme_error('KEY_INVALID'); } this.connection.post(msg).then(function(result){ return result.data; @@ -203,6 +209,9 @@ export class GPGME_Key { * TODO: check if Promise.then(return) */ checkKey(property){ + if (!this._fingerprint){ + return gpgme_error('KEY_INVALID'); + } return gpgme_error('NOT_YET_IMPLEMENTED'); // TODO: async is not what is to be ecpected from Key information :( if (!property || typeof(property) !== 'string' || diff --git a/lang/js/src/Keyring.js b/lang/js/src/Keyring.js index 2cf87c2..4596035 100644 --- a/lang/js/src/Keyring.js +++ b/lang/js/src/Keyring.js @@ -20,7 +20,7 @@ import {createMessage} from './Message' import {GPGME_Key} from './Key' -import { isFingerprint, isLongId } from './Helpers'; +import { isFingerprint } from './Helpers'; import { gpgme_error } from './Errors'; import { Connection } from './Connection'; diff --git a/lang/js/unittest_inputvalues.js b/lang/js/unittest_inputvalues.js new file mode 100644 index 0000000..3450afd --- /dev/null +++ b/lang/js/unittest_inputvalues.js @@ -0,0 +1,45 @@ +import {Connection} from "./src/Connection"; +import {createKey} from "./src/Key"; + +let conn = new Connection; + +export const helper_params = { + validLongId: '0A0A0A0A0A0A0A0A', + validKeys: ['A1E3BC45BDC8E87B74F4392D53B151A1368E50F3', + createKey('ADDBC303B6D31026F5EB4591A27EABDF283121BB', conn), + 'EE17AEE730F88F1DE7713C54BBE0A4FF7851650A'], + validFingerprint: '9A9A7A7A8A9A9A7A7A8A9A9A7A7A8A9A9A7A7A8A', + validFingerprints: ['9A9A7A7A8A9A9A7A7A8A9A9A7A7A8A9A9A7A7A8A', + '9AAE7A338A9A9A7A7A8A9A9A7A7A8A9A9A7A7DDA'], + invalidLongId: '9A9A7A7A8A9A9A7A7A8A', + invalidFingerprints: [{hello:'World'}, ['kekekeke'], new Uint32Array(40)], + invalidKeyArray: {curiosity:'uncat'}, + invalidKeyArray_OneBad: [ + createKey('12AE9F3E41B33BF77DF52B6BE8EE1992D7909B08', conn), + 'E1D18E6E994FA9FE9360Bx0E687B940FEFEB095A', + '3AEA7FE4F5F416ED18CEC63DD519450D9C0FAEE5'], + invalidErrorCode: 'Please type in all your passwords.', + validGPGME_Key: createKey('ADDBC303B6D31026F5EB4591A27EABDF283121BB', conn), + valid_openpgplike: { primaryKey: { + getFingerprint: function(){ + return '85DE2A8BA5A5AB3A8A7BE2000B8AED24D7534BC2';} + } + } +} + +export const message_params = { + invalid_op_action : 'dance', + invalid_op_type : [234, 34, '<>'], + valid_encrypt_data: "????? ???????", + invalid_param_test: { + valid_op: 'encrypt', + invalid_param_names: [22,'dance', {}], + validparam_name_0: 'mime', + invalid_values_0: [2134, 'All your passwords', + createKey('12AE9F3E41B33BF77DF52B6BE8EE1992D7909B08', conn), null] + } +} + +export const whatever_params = { + four_invalid_params: ['<(((-<', '>?;==;~~', '^^', '{{{{o}}}}'] +} diff --git a/lang/js/unittests.js b/lang/js/unittests.js new file mode 100644 index 0000000..0a1b4b4 --- /dev/null +++ b/lang/js/unittests.js @@ -0,0 +1,321 @@ +/* gpgme.js - Javascript integration for gpgme + * Copyright (C) 2018 Bundesamt f?r Sicherheit in der Informationstechnik + * + * This file is part of GPGME. + * + * GPGME is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * GPGME 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * SPDX-License-Identifier: LGPL-2.1+ + */ +import "./node_modules/mocha/mocha"; +import "./node_modules/chai/chai"; +import { helper_params as hp } from "./unittest_inputvalues"; +import { message_params as mp } from "./unittest_inputvalues"; +import { whatever_params as wp } from "./unittest_inputvalues"; +import { Connection } from "./src/Connection"; +import { gpgme_error } from "./src/Errors"; +import { toKeyIdArray , isFingerprint } from "./src/Helpers"; +import { GPGME_Key , createKey } from "./src/Key"; +import { GPGME_Keyring } from "./src/Keyring"; +import {GPGME_Message, createMessage} from "./src/Message"; +import { setTimeout } from "timers"; + +mocha.setup('bdd'); +var expect = chai.expect; +chai.config.includeStack = true; + +function unittests (){ + describe('Connection testing', function(){ + + it('Connecting', function(done) { + let conn0 = new Connection; + let delayed = function(){ + expect(conn0.isConnected).to.be.true; + expect(conn0.connect).to.be.a('function'); + expect(conn0.disconnect).to.be.a('function'); + expect(conn0.post).to.be.a('function'); + done(); + }; + setTimeout(delayed, 5); + + }); + + it('Disconnecting', function(done) { + let conn0 = new Connection; + let delayed = function(){ + conn0.disconnect(); // TODO fails! + expect(conn0.isConnected).to.be.false; + done(); + }; + setTimeout(delayed, 5); + }); + + // broken + // it('Connect info still only available after a delay', function(done){ + // // if false, all delayed connections can be refactored + // let conn0 = new Connection; + // expect(conn0.isConnected).to.be.undefined; + // // + // }) + }); + + describe('Error Object handling', function(){ + + it('check the Timeout error', function(){ + let test0 = gpgme_error('CONN_TIMEOUT'); + + expect(test0).to.be.an.instanceof(Error); + expect(test0.code).to.equal('CONN_TIMEOUT'); + }); + + it('Error Object returns generic code if code is not listed', function(){ + let test0 = gpgme_error(hp.invalidErrorCode); + + expect(test0).to.be.an.instanceof(Error); + expect(test0.code).to.equal('GENERIC_ERROR'); + }); + + it('Warnings like PARAM_IGNORED should not return errors', function(){ + let test0 = gpgme_error('PARAM_IGNORED'); + + expect(test0).to.be.null; + }); + }); + + describe('Fingerprint checking', function(){ + + it('isFingerprint(): valid Fingerprint', function(){ + let test0 = isFingerprint(hp.validFingerprint); + + expect(test0).to.be.true; + }); + + it('isFingerprint(): invalid Fingerprints', function(){ + for (let i=0; i < hp.invalidFingerprints.length; i++){ + let test0 = isFingerprint(hp.invalidFingerprints[i]); + + expect(test0).to.be.false; + } + }); + }); + + describe('toKeyIdArray() (converting input to fingerprint', function(){ + + it('Correct fingerprint string', function(){ + let test0 = toKeyIdArray(hp.validFingerprint); + + expect(test0).to.be.an('array'); + expect(test0).to.include(hp.validFingerprint); + }); + + it('correct GPGME_Key', function(){ + expect(hp.validGPGME_Key).to.be.an.instanceof(GPGME_Key); + let test0 = toKeyIdArray(hp.validGPGME_Key); + + expect(test0).to.be.an('array'); + expect(test0).to.include(hp.validGPGME_Key.fingerprint); + }); + + it('openpgpjs-like object', function(){ + let test0 = toKeyIdArray(hp.valid_openpgplike); + + expect(test0).to.be.an('array').with.lengthOf(1); + console.log(test0); + expect(test0).to.include( + hp.valid_openpgplike.primaryKey.getFingerprint()); + }); + + it('Array of valid inputs', function(){ + let test0 = toKeyIdArray(hp.validKeys); + expect(test0).to.be.an('array'); + expect(test0).to.have.lengthOf(hp.validKeys.length); + }); + + it('Incorrect inputs', function(){ + + it('valid Long ID', function(){ + let test0 = toKeyIdArray(hp.validLongId); + + expect(test0).to.be.empty; + }); + + it('invalidFingerprint', function(){ + let test0 = toKeyIdArray(hp.invalidFingerprint); + + expect(test0).to.be.empty; + }); + + it('invalidKeyArray', function(){ + let test0 = toKeyIdArray(hp.invalidKeyArray); + + expect(test0).to.be.empty; + }); + + it('Partially invalid array', function(){ + let test0 = toKeyIdArray(hp.invalidKeyArray_OneBad); + + expect(test0).to.be.an('array'); + expect(test0).to.have.lengthOf( + hp.invalidKeyArray_OneBad.length - 1); + }); + }); + }); + + describe('GPGME_Key', function(){ + + it('correct Key initialization', function(){ + let conn = new Connection; + let key = createKey(hp.validFingerprint, conn); + + expect(key).to.be.an.instanceof(GPGME_Key); + expect(key.connection).to.be.an.instanceof(Connection); + // TODO not implemented yet: Further Key functionality + }); + + it('Key can use the connection', function(){ + let conn = new Connection; + let key = createKey(hp.validFingerprint, conn); + + expect(key.connection.isConnected).to.be.true; + + key.connection.disconnect(); + expect(key.connection.isConnected).to.be.false; + }); + + it('createKey returns error if parameters are wrong', function(){ + let conn = new Connection; + for (let i=0; i< 4; i++){ + let key0 = createKey(wp.four_invalid_params[i], conn); + + expect(key0).to.be.an.instanceof(Error); + expect(key0.code).to.equal('PARAM_WRONG'); + } + for (let i=0; i< 4; i++){ + let key0 = createKey( + hp.validFingerprint, wp.four_invalid_params[i]); + + expect(key0).to.be.an.instanceof(Error); + expect(key0.code).to.equal('PARAM_WRONG'); + } + }); + it('bad GPGME_Key returns Error if used', function(){ + let conn = new Connection; + for (let i=0; i < 4; i++){ + let key = new GPGME_Key(wp.four_invalid_params[i], conn); + + expect(key.connection).to.be.an.instanceof(Error); + expect(key.connection.code).to.equal('KEY_INVALID'); + } + }); + }); + + describe('GPGME_Keyring', function(){ + + it('correct initialization', function(){ + let conn = new Connection; + let keyring = new GPGME_Keyring(conn); + + expect(keyring).to.be.an.instanceof(GPGME_Keyring); + expect(keyring.connection).to.be.an.instanceof(Connection); + expect(keyring.getKeys).to.be.a('function'); + expect(keyring.getSubset).to.be.a('function'); + }); + + it('Keyring should return errors if not connected', function(){ + let keyring = new GPGME_Keyring; + + expect(keyring).to.be.an.instanceof(GPGME_Keyring); + expect(keyring.connection).to.be.an.instanceof(Error); + expect(keyring.connection.code).to.equal('CONN_NO_CONNECT'); + expect(keyring.getKeys).to.be.an.instanceof(Error); + expect(keyring.getkeys.code).to.equal('CONN_NO_CONNECT'); + }); + //TODO not yet implemented: + // getKeys(pattern, include_secret) //note: pattern can be null + // getSubset(flags, pattern) + // available Boolean flags: secret revoked expired + }); + + describe('GPGME_Message', function(){ + + it('creating encrypt Message', function(){ + let test0 = createMessage('encrypt'); + + expect(test0).to.be.an.instanceof(GPGME_Message); + expect(test0.isComplete).to.be.false; + }); + + it('Message is complete after setting mandatoy data', function(){ + let test0 = createMessage('encrypt'); + test0.setParameter('data', mp.valid_encrypt_data); + test0.setParameter('keys', hp.validFingerprints); + + expect(test0.isComplete).to.be.true; + }); + + it('Complete Message contains the data that was set', function(){ + let test0 = createMessage('encrypt'); + test0.setParameter('data', mp.valid_encrypt_data); + test0.setParameter('keys', hp.validFingerprints); + + expect(test0.message).to.not.be.null; + expect(test0.message).to.have.keys('op', 'data', 'keys'); + expect(test0.message.op).to.equal('encrypt'); + expect(test0.message.data).to.equal( + mp.valid_encrypt_data); + }); + + it ('Not accepting non-allowed operation', function(){ + let test0 = createMessage(mp.invalid_op_action); + + expect(test0).to.be.an.instanceof(Error); + expect(test0.code).to.equal('MSG_WRONG_OP'); + }); + it('Not accepting wrong parameter type', function(){ + let test0 = createMessage(mp.invalid_op_type); + + expect(test0).to.be.an.instanceof(Error); + expect(test0.code).to.equal('PARAM_WRONG'); + }); + + it('Not accepting wrong parameter name', function(){ + let test0 = createMessage(mp.invalid_param_test.valid_op); + for (let i=0; + i < mp.invalid_param_test.invalid_param_names.length; i++){ + let ret = test0.setParameter( + mp.invalid_param_test.invalid_param_names[i], + 'Somevalue'); + + expect(ret).to.be.an.instanceof(Error); + expect(ret.code).to.equal('PARAM_WRONG'); + } + }); + + it('Not accepting wrong parameter value', function(){ + let test0 = createMessage(mp.invalid_param_test.valid_op); + for (let j=0; + j < mp.invalid_param_test.invalid_values_0.length; j++){ + let ret = test0.setParameter( + mp.invalid_param_test.validparam_name_0, + mp.invalid_param_test.invalid_values_0[j]); + + expect(ret).to.be.an.instanceof(Error); + expect(ret.code).to.equal('PARAM_WRONG'); + } + }); + }); + + mocha.run(); +} + +export default {unittests}; \ No newline at end of file diff --git a/lang/js/BrowserTestExtension/runbrowsertest.js b/lang/js/webpack.conf_unittests.js similarity index 69% copy from lang/js/BrowserTestExtension/runbrowsertest.js copy to lang/js/webpack.conf_unittests.js index 39bc3fb..4b903be 100644 --- a/lang/js/BrowserTestExtension/runbrowsertest.js +++ b/lang/js/webpack.conf_unittests.js @@ -16,6 +16,19 @@ * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1+ + * + * This is the configuration file for building the gpgmejs-Library with webpack */ +const path = require('path'); -mocha.run(); +module.exports = { + entry: './unittests.js', + mode: 'production', + output: { + path: path.resolve(__dirname, 'build'), + filename: 'gpgmejs_unittests.bundle.js', + libraryTarget: 'var', + libraryExport: 'default', + library: 'Gpgmejs_test' + } +}; ----------------------------------------------------------------------- Summary of changes: lang/js/BrowserTestExtension/browsertest.html | 2 + lang/js/BrowserTestExtension/runbrowsertest.js | 1 + lang/js/BrowserTestExtension/tests/encryptTest.js | 14 +- lang/js/README_testing | 14 + lang/js/build_extensions.sh | 4 +- lang/js/src/Helpers.js | 4 +- lang/js/src/Key.js | 11 +- lang/js/src/Keyring.js | 2 +- .../inputvalues.js => unittest_inputvalues.js} | 26 +- lang/js/unittests.js | 321 +++++++++++++++++++++ .../{webpack.conf.js => webpack.conf_unittests.js} | 7 +- 11 files changed, 376 insertions(+), 30 deletions(-) create mode 100644 lang/js/README_testing copy lang/js/{test/inputvalues.js => unittest_inputvalues.js} (60%) create mode 100644 lang/js/unittests.js copy lang/js/{webpack.conf.js => webpack.conf_unittests.js} (91%) hooks/post-receive -- GnuPG Made Easy http://git.gnupg.org From cvs at cvs.gnupg.org Fri May 4 09:26:41 2018 From: cvs at cvs.gnupg.org (by Andre Heinecke) Date: Fri, 04 May 2018 09:26:41 +0200 Subject: [git] GpgOL - branch, master, updated. gpgol-2.1.1-5-gaed389f Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GnuPG extension for MS Outlook". The branch, master has been updated via aed389f9ce639db48dcfc84cb495a2b180496207 (commit) from 07811afb552bfc1e51aea25a39cb52327831198b (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit aed389f9ce639db48dcfc84cb495a2b180496207 Author: Andre Heinecke Date: Fri May 4 09:23:38 2018 +0200 Fix crash when looking at msgs without content type * src/mapihelp.cpp (change_message_class_ipm_note): Check for ct before using it in string comparison. -- The codepath is reached for temporary, discarded mails, e.g. when a Reply All in the Inline editor is canceled through Escape. This fixes: dc48589b3d429d7d156c75b4e7bc784b140f40ce GnuPG-Bug-Id: T3960 diff --git a/src/mapihelp.cpp b/src/mapihelp.cpp index 1be66b6..16e45eb 100644 --- a/src/mapihelp.cpp +++ b/src/mapihelp.cpp @@ -1073,7 +1073,7 @@ change_message_class_ipm_note (LPMESSAGE message) decide. */ newvalue = get_msgcls_from_pgp_lines (message, &has_no_body); - if (!newvalue && has_no_body && !strcmp (ct, "multipart/mixed")) + if (!newvalue && has_no_body && ct && !strcmp (ct, "multipart/mixed")) { /* This is uncommon. But some Exchanges might break a PGP/MIME mail this way. Let's take a look at the attachments. Maybe it's ----------------------------------------------------------------------- Summary of changes: src/mapihelp.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) hooks/post-receive -- GnuPG extension for MS Outlook http://git.gnupg.org From cvs at cvs.gnupg.org Fri May 4 10:04:21 2018 From: cvs at cvs.gnupg.org (by Andre Heinecke) Date: Fri, 04 May 2018 10:04:21 +0200 Subject: [git] GPGME - branch, master, updated. gpgme-1.11.1-4-g26820ba Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GnuPG Made Easy". The branch, master has been updated via 26820ba62920acfe2775bce8fc2bc8b3f17b1c10 (commit) from 6b267c56fd6e54fb1c254455c04495534260b547 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 26820ba62920acfe2775bce8fc2bc8b3f17b1c10 Author: Andre Heinecke Date: Fri May 4 10:03:42 2018 +0200 qt: Respect --disable-gpg-test for tests * lang/qt/Makefile.am: Respect --disable-gpg-test -- This is similar to the core switch to disable the tests. diff --git a/lang/qt/Makefile.am b/lang/qt/Makefile.am index ab85960..a1b83e8 100644 --- a/lang/qt/Makefile.am +++ b/lang/qt/Makefile.am @@ -19,6 +19,12 @@ # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA -SUBDIRS = src tests doc +if RUN_GPG_TESTS +tests = tests +else +tests = +endif + +SUBDIRS = src ${tests} doc EXTRA_DIST = README ----------------------------------------------------------------------- Summary of changes: lang/qt/Makefile.am | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) hooks/post-receive -- GnuPG Made Easy http://git.gnupg.org From cvs at cvs.gnupg.org Fri May 4 12:56:51 2018 From: cvs at cvs.gnupg.org (by Maximilian Krambach) Date: Fri, 04 May 2018 12:56:51 +0200 Subject: [git] GPGME - branch, javascript-binding, updated. gpgme-1.11.1-21-gcf07584 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GnuPG Made Easy". The branch, javascript-binding has been updated via cf075846fb48c8d71937100d2c45069d37d54a38 (commit) from c755287ba845c4cbbf1d50e5aafecb2e687c7ac9 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit cf075846fb48c8d71937100d2c45069d37d54a38 Author: Maximilian Krambach Date: Fri May 4 12:56:59 2018 +0200 js: fixing errors found by testing -- * Key.js: Error code for wrong parameter in createKey should be "PARAM_WRONG" * Helpers.js: The property openpgpjs-like Objects were checked for in toKeyIdArray was not defined. * src/permittedOperations.js: updated more expectations and assumptions for the native API diff --git a/lang/js/src/Helpers.js b/lang/js/src/Helpers.js index ea056ff..fd0e720 100644 --- a/lang/js/src/Helpers.js +++ b/lang/js/src/Helpers.js @@ -48,7 +48,7 @@ export function toKeyIdArray(input){ if (input[i] instanceof GPGME_Key){ fpr = input[i].fingerprint; } else if (input[i].hasOwnProperty('primaryKey') && - input[i].primaryKey.hasOwnProperty(getFingerprint)){ + input[i].primaryKey.hasOwnProperty('getFingerprint')){ fpr = input[i].primaryKey.getFingerprint(); } if (isFingerprint(fpr) === true){ diff --git a/lang/js/src/Key.js b/lang/js/src/Key.js index 6d3cf17..075a190 100644 --- a/lang/js/src/Key.js +++ b/lang/js/src/Key.js @@ -35,13 +35,15 @@ import { Connection } from './Connection'; export function createKey(fingerprint, parent){ if (!isFingerprint(fingerprint)){ - return gpgme_error('KEY_INVALID'); + return gpgme_error('PARAM_WRONG'); } if ( parent instanceof Connection){ return new GPGME_Key(fingerprint, parent); } else if ( parent.hasOwnProperty('connection') && parent.connection instanceof Connection){ return new GPGME_Key(fingerprint, parent.connection); + } else { + return gpgme_error('PARAM_WRONG'); } } diff --git a/lang/js/src/permittedOperations.js b/lang/js/src/permittedOperations.js index 274e037..59597aa 100644 --- a/lang/js/src/permittedOperations.js +++ b/lang/js/src/permittedOperations.js @@ -122,55 +122,96 @@ export const permittedOperations = { type: ['plaintext'], data: ['data'], params: ['base64', 'mime'], - infos: [] // pending. Info about signatures and validity - //signature: [{Key Fingerprint, valid boolean}] + infos: [] // TODO pending. Info about signatures and validity + //{ + //signatures: [{ + //Key : Fingerprint, + //valid: + // }] } }, - /** - keyinfo: { // querying the Key's information. - required: ['fingerprint'], - anser: { + /** TBD: querying the Key's information (keyinfo) + TBD name: { + required: { + 'fingerprint': { + allowed: ['string'] + }, + }, + answer: { type: ['TBD'], data: [], - params: ['hasSecret', 'isRevoked', 'isExpired', 'armored', - 'timestamp', 'expires', 'pubkey_algo'], + params: ['hasSecret','isRevoked','isExpired','armored', + 'timestamp','expires','pubkey_algo'], infos: ['subkeys', 'userIds'] + // {'hasSecret': , + // 'isRevoked': , + // 'isExpired': , + // 'armored': , // armored public Key block + // 'timestamp': , // + // 'expires': , + // 'pubkey_algo': TBD // TBD (optional?), + // 'userIds': Array, + // 'subkeys': Array Fingerprints of Subkeys + // } }*/ /** listkeys:{ - optional: ['with-secret', 'pattern'], + required: {}; + optional: { + 'with-secret':{ + allowed: ['boolean'] + },{ + 'pattern': { + allowed: ['string'] + } + }, answer: { - type: ['TBD'], //Array of fingerprints? - infos: ['TBD'] //the property with infos + type: ['TBD'], + infos: ['TBD'] + // keys: Array Fingerprints representing the results }, */ /** importkey: { - required: ['keyarmored'], + required: { + 'keyarmored': { + allowed: ['string'] + } + }, answer: { type: ['TBD'], - infos: [''], // for each key if import was a success, if it was an update + infos: ['TBD'], + // for each key if import was a success, + // and if it was an update of preexisting key } }, */ /** deletekey: { - required: ['fingerprint'], + pinentry: true, + required: { + 'fingerprint': { + allowed: ['string'], + // array_allowed: TBD Allow several Keys to be deleted at once? + }, + optional: { + 'TBD' //Flag to delete secret Key ? + } answer: { type ['TBD'], - infos: [''] //success:true? in gpgme, an error NO_ERROR is returned + infos: [''] + // TBD (optional) Some kind of 'ok' if delete was successful. } } */ /** - *get armored secret different treatment from keyinfo! - */ - - /** - * TBD key modification requests? + *TBD get armored secret different treatment from keyinfo! + * TBD key modification? + * encryptsign: TBD + * verify: TBD */ } diff --git a/lang/js/unittests.js b/lang/js/unittests.js index 0a1b4b4..6c0d189 100644 --- a/lang/js/unittests.js +++ b/lang/js/unittests.js @@ -109,7 +109,7 @@ function unittests (){ }); }); - describe('toKeyIdArray() (converting input to fingerprint', function(){ + describe('toKeyIdArray() (converting input to fingerprint)', function(){ it('Correct fingerprint string', function(){ let test0 = toKeyIdArray(hp.validFingerprint); ----------------------------------------------------------------------- Summary of changes: lang/js/src/Helpers.js | 2 +- lang/js/src/Key.js | 4 +- lang/js/src/permittedOperations.js | 81 ++++++++++++++++++++++++++++---------- lang/js/unittests.js | 2 +- 4 files changed, 66 insertions(+), 23 deletions(-) hooks/post-receive -- GnuPG Made Easy http://git.gnupg.org From cvs at cvs.gnupg.org Sat May 5 04:59:05 2018 From: cvs at cvs.gnupg.org (by Ben McGinnes) Date: Sat, 05 May 2018 04:59:05 +0200 Subject: [git] GPGME - branch, master, updated. gpgme-1.11.1-5-g46da79e Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GnuPG Made Easy". The branch, master has been updated via 46da79e3de99a7b65748994921d6aab73b9974e7 (commit) from 26820ba62920acfe2775bce8fc2bc8b3f17b1c10 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 46da79e3de99a7b65748994921d6aab73b9974e7 Author: Ben McGinnes Date: Sat May 5 12:27:17 2018 +1000 python: key expiration datetime stamp tests * Changed the expiration date for the generated test key to NYE this century, rather than the NYE this millennium as originally suggested in job #3815. * This covers the lifetimes of current users (except, maybe, some very healthy millennials) as well as the 32-bit clock end date in 2038; without falling foul of OpenPGP's 2106 expiration. diff --git a/lang/python/tests/t-callbacks.py b/lang/python/tests/t-callbacks.py index 9a70cda..b311e3d 100755 --- a/lang/python/tests/t-callbacks.py +++ b/lang/python/tests/t-callbacks.py @@ -88,7 +88,7 @@ Name-Real: Joe Tester Name-Comment: with stupid passphrase Name-Email: joe+gpg at example.org Passphrase: Crypt0R0cks -Expire-Date: 2020-12-31 +Expire-Date: 2099-12-31 """ ----------------------------------------------------------------------- Summary of changes: lang/python/tests/t-callbacks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) hooks/post-receive -- GnuPG Made Easy http://git.gnupg.org From cvs at cvs.gnupg.org Mon May 7 08:35:13 2018 From: cvs at cvs.gnupg.org (by Ineiev) Date: Mon, 07 May 2018 08:35:13 +0200 Subject: [git] GnuPG - branch, STABLE-BRANCH-2-2, updated. gnupg-2.2.7-2-ged12a1d Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, STABLE-BRANCH-2-2 has been updated via ed12a1dabaf928e8620fc26ca426c935e1a8a880 (commit) from 2e2ab4b69c324c6e324780bbe73a0d2f8ea86e09 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit ed12a1dabaf928e8620fc26ca426c935e1a8a880 Author: Ineiev Date: Sun May 6 05:58:23 2018 +0000 doc: Update description of displayed trust values. * doc/trust-values.texi: New file. * doc/Makefile.am (EXTRA_DIST): Add trust-values.texi. * doc/gnupg.texi (Trust Values): New chapter. * doc/gpg.texi (OpenPGP Key Management): Update the description of how trust values are displayed, replace table with a reference to Trust Values. * doc/gpg.texi (GPG Examples): Add @mansect trust values. -- Signed-off-by: Ineiev diff --git a/doc/Makefile.am b/doc/Makefile.am index a857c8e..d47d83e 100644 --- a/doc/Makefile.am +++ b/doc/Makefile.am @@ -49,7 +49,8 @@ EXTRA_DIST = samplekeys.asc mksamplekeys com-certs.pem qualified.txt \ gnupg-card-architecture.png gnupg-card-architecture.pdf \ FAQ gnupg7.texi mkdefsinc.c defsincdate \ opt-homedir.texi see-also-note.texi specify-user-id.texi \ - gpgv.texi yat2m.c ChangeLog-2011 whats-new-in-2.1.txt + gpgv.texi yat2m.c ChangeLog-2011 whats-new-in-2.1.txt \ + trust-values.texi BUILT_SOURCES = gnupg-module-overview.png gnupg-module-overview.pdf \ gnupg-card-architecture.png gnupg-card-architecture.pdf \ diff --git a/doc/gnupg.texi b/doc/gnupg.texi index 7154fc8..3364148 100644 --- a/doc/gnupg.texi +++ b/doc/gnupg.texi @@ -140,6 +140,7 @@ the administration and the architecture. * Invoking GPGSM:: Using the S/MIME protocol. * Invoking SCDAEMON:: How to handle Smartcards. * Specify a User ID:: How to Specify a User Id. +* Trust Values:: How GnuPG displays trust values. * Helper Tools:: Description of small helper tools * Web Key Service:: Tools for the Web Key Service @@ -179,6 +180,11 @@ the administration and the architecture. @anchor{how-to-specify-a-user-id} @include specify-user-id.texi + at node Trust Values + at chapter Trust Values + at anchor{trust-values} + at cindex trust values + at include trust-values.texi @include tools.texi @include wks.texi diff --git a/doc/gpg.texi b/doc/gpg.texi index 2888050..805a01f 100644 --- a/doc/gpg.texi +++ b/doc/gpg.texi @@ -1040,38 +1040,13 @@ signing. @c man:.RS The listing shows you the key with its secondary keys and all user -ids. The primary user id is indicated by a dot, and selected keys or -user ids are indicated by an asterisk. The trust -value is displayed with the primary key: the first is the assigned owner -trust and the second is the calculated trust value. Letters are used for -the values: +IDs. The primary user ID is indicated by a dot, and selected keys or +user IDs are indicated by an asterisk. The trust +value is displayed with the primary key: "trust" is the assigned owner +trust and "validity" is the calculated validity of the key. Validity +values are also displayed for all user IDs. +For possible values of trust, @pxref{trust-values}. @c man:.RE - - at table @asis - - @item - - No ownertrust assigned / not yet calculated. - - @item e - Trust - calculation has failed; probably due to an expired key. - - @item q - Not enough information for calculation. - - @item n - Never trust this key. - - @item m - Marginally trusted. - - @item f - Fully trusted. - - @item u - Ultimately trusted. - - at end table @c ******** End Edit-key Options ********** @item --sign-key @var{name} @@ -3798,6 +3773,10 @@ which is equivalent to imports only the user ids of a key containing the strings "Alfa" or "Alpha" but not the string "test". + at mansect trust values + at ifset isman + at include trust-values.texi + at end ifset @mansect return value @chapheading RETURN VALUE diff --git a/doc/trust-values.texi b/doc/trust-values.texi new file mode 100644 index 0000000..634a784 --- /dev/null +++ b/doc/trust-values.texi @@ -0,0 +1,47 @@ + at c Copyright (C) 2018 Free Software Foundation, Inc. + at c This is part of the GnuPG manual. + at c For copying conditions, see the file gnupg.texi. + +Trust values are used to indicate ownertrust and validity of keys and +user IDs. They are displayed with letters or strings: + + at table @asis + + @item - + @itemx unknown + No ownertrust assigned / not yet calculated. + + @item e + @itemx expired + + Trust calculation has failed; probably due to an expired key. + + @item q + @itemx undefined, undef + Not enough information for calculation. + + @item n + @itemx never + Never trust this key. + + @item m + @itemx marginal + Marginally trusted. + + @item f + @itemx full + Fully trusted. + + @item u + @itemx ultimate + Ultimately trusted. + + @item r + @itemx revoked + For validity only: the key or the user ID has been revoked. + + @item ? + @itemx err + The program encountered an unknown trust value. + + at end table ----------------------------------------------------------------------- Summary of changes: doc/Makefile.am | 3 ++- doc/gnupg.texi | 6 ++++++ doc/gpg.texi | 41 ++++++++++------------------------------- doc/trust-values.texi | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 65 insertions(+), 32 deletions(-) create mode 100644 doc/trust-values.texi hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Mon May 7 18:31:32 2018 From: cvs at cvs.gnupg.org (by Maximilian Krambach) Date: Mon, 07 May 2018 18:31:32 +0200 Subject: [git] GPGME - branch, javascript-binding, updated. gpgme-1.11.1-22-g8f3d83e Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GnuPG Made Easy". The branch, javascript-binding has been updated via 8f3d83e5f0903323ec92f588f60dcecb0ae96de4 (commit) from cf075846fb48c8d71937100d2c45069d37d54a38 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 8f3d83e5f0903323ec92f588f60dcecb0ae96de4 Author: Maximilian Krambach Date: Mon May 7 18:27:25 2018 +0200 js: fixing errors found by testing: encrypt/decrypt -- * Key.js: Error code for wrong parameter in createKey should be "PARAM_WRONG" * Helpers.js: The property openpgpjs-like Objects were checked for in toKeyIdArray was not defined. * src/permittedOperations.js: updated more expectations and assumptions for the native API * new Problems: - There seems to be a message size limit of about 21 MB for nativeMessaging, much lower than the documented 4GB. - Some bytes are lost with random data in an encrypt-decrypt roundtrip. The culprit is unclear. diff --git a/lang/js/BrowserTestExtension/browsertest.html b/lang/js/BrowserTestExtension/browsertest.html index ce037a1..d12e03c 100644 --- a/lang/js/BrowserTestExtension/browsertest.html +++ b/lang/js/BrowserTestExtension/browsertest.html @@ -18,6 +18,7 @@ + diff --git a/lang/js/BrowserTestExtension/tests/encryptDecryptTest.js b/lang/js/BrowserTestExtension/tests/encryptDecryptTest.js new file mode 100644 index 0000000..7abf2d9 --- /dev/null +++ b/lang/js/BrowserTestExtension/tests/encryptDecryptTest.js @@ -0,0 +1,72 @@ +/* gpgme.js - Javascript integration for gpgme + * Copyright (C) 2018 Bundesamt f?r Sicherheit in der Informationstechnik + * + * This file is part of GPGME. + * + * GPGME is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * GPGME 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * SPDX-License-Identifier: LGPL-2.1+ + */ + +describe('Encryption and Decryption', function () { + it('Successful encrypt and decrypt', function (done) { + let prm = Gpgmejs.init(); + prm.then(function (context) { + context.encrypt( + inputvalues.encrypt.good.data, + inputvalues.encrypt.good.fingerprint).then( function(answer){ + expect(answer).to.not.be.empty; + expect(answer.data).to.be.a("string"); + expect(answer.data).to.include('BEGIN PGP MESSAGE'); + expect(answer.data).to.include('END PGP MESSAGE'); + context.decrypt(answer.data).then(function(result){ + expect(result).to.not.be.empty; + expect(result.data).to.be.a('string'); + expect(result.data).to.equal(inputvalues.encrypt.good.data); + done(); + }); + }); + }); + }); + +/** + * Fails with random data! Some bytes (up to 100) of the original are missing in + * the result + */ +/** + for (let i=0; i< 20; i++) { + it('Successful encrypt 1 MB '+ i+ '/20', function (done) { + let prm = Gpgmejs.init(); + let data = bigString(0.1); + prm.then(function (context) { + context.encrypt(data, + inputvalues.encrypt.good.fingerprint).then( + function (answer){ + expect(answer).to.not.be.empty; + expect(answer.data).to.be.a("string"); + expect(answer.data).to.include( + 'BEGIN PGP MESSAGE'); + expect(answer.data).to.include( + 'END PGP MESSAGE'); + context.decrypt(answer.data).then( + function(result){ + expect(result).to.not.be.empty; + expect(result.data).to.be.a('string'); + expect(result.data).to.equal(data); + done(); + }); + }); + }); + }).timeout(10000); + };*/ +}); \ No newline at end of file diff --git a/lang/js/BrowserTestExtension/tests/encryptTest.js b/lang/js/BrowserTestExtension/tests/encryptTest.js index 2178efa..37b319e 100644 --- a/lang/js/BrowserTestExtension/tests/encryptTest.js +++ b/lang/js/BrowserTestExtension/tests/encryptTest.js @@ -17,47 +17,133 @@ * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1+ */ -describe('Encryption', function(){ - it('Successfull encrypt', function(){ +describe('Encryption', function () { + it('Successful encrypt', function (done) { let prm = Gpgmejs.init(); - prm.then(function(context){ + prm.then(function (context) { context.encrypt( - inputvalues.encrypt.good.data, - inputvalues.encrypt.good.fingerprint).then(function(answer){ + inputvalues.encrypt.good.data, + inputvalues.encrypt.good.fingerprint).then(function (answer) { expect(answer).to.not.be.empty; expect(answer.data).to.be.a("string"); expect(answer.data).to.include('BEGIN PGP MESSAGE'); expect(answer.data).to.include('END PGP MESSAGE'); + done(); }); }); }); - it('Sending encryption without keys fails', function(){ + it('Successful encrypt 5 MB', function (done) { let prm = Gpgmejs.init(); - prm.then(function(context){ + let data = bigString(5); + prm.then(function (context) { + context.encrypt( + data, + inputvalues.encrypt.good.fingerprint).then(function (answer) { + expect(answer).to.not.be.empty; + expect(answer.data).to.be.a("string"); + expect(answer.data).to.include('BEGIN PGP MESSAGE'); + expect(answer.data).to.include('END PGP MESSAGE'); + done(); + }); + }); + }).timeout(5000); + + it('Successful encrypt 20 MB', function (done) { + let prm = Gpgmejs.init(); + let data = bigString(20); + prm.then(function (context) { + context.encrypt( + data, + inputvalues.encrypt.good.fingerprint).then(function (answer) { + expect(answer).to.not.be.empty; + expect(answer.data).to.be.a("string"); + expect(answer.data).to.include('BEGIN PGP MESSAGE'); + expect(answer.data).to.include('END PGP MESSAGE'); + done(); + }); + }); + }).timeout(20000); + +/** + it('Successful encrypt 30 MB', function (done) { + // TODO: There seems to be a limit imposed at least by chrome at about 21 MB + let prm = Gpgmejs.init(); + let data = bigString(30); + prm.then(function (context) { + context.encrypt( + data, + inputvalues.encrypt.good.fingerprint).then(function (answer) { + expect(answer).to.not.be.empty; + expect(answer.data).to.be.a("string"); + expect(answer.data).to.include('BEGIN PGP MESSAGE'); + expect(answer.data).to.include('END PGP MESSAGE'); + done(); + }); + }); + }).timeout(20000); +*/ + + it('Sending encryption without keys fails', function (done) { + let prm = Gpgmejs.init(); + prm.then(function (context) { context.encrypt( inputvalues.encrypt.good.data, - null).then(function(answer){ + null).then(function (answer) { expect(answer).to.be.undefined; }, function(error){ expect(error).to.be.an('Error'); expect(error.code).to.equal('MSG_INCOMPLETE'); - //TODO: MSG_INCOMPLETE desired, GNUPG_ERROR coming + done(); }); }); }); - it('Sending encryption without data fails', function(){ + it('Sending encryption without data fails', function (done) { let prm = Gpgmejs.init(); - prm.then(function(context){ + prm.then(function (context) { context.encrypt( - null,inputvalues.encrypt.good.keyid).then(function(answer){ + null, inputvalues.encrypt.good.keyid).then(function (answer) { expect(answer).to.be.undefined; - }, function(error){ + }, function (error) { expect(error).to.be.an.instanceof(Error); - expect(error.code).to.equal('PARAM_WRONG'); + expect(error.code).to.equal('MSG_INCOMPLETE'); + done(); + }); + }); + }); + + + it('Sending encryption with non existing keys fails', function (done) { + let prm = Gpgmejs.init(); + prm.then(function (context) { + context.encrypt( + inputvalues.encrypt.good.data, + inputvalues.encrypt.bad.fingerprint).then(function (answer) { + expect(answer).to.be.undefined; + }, function(error){ + expect(error).to.be.an('Error'); + expect(error.code).to.not.be.undefined; + expect(error.code).to.equal('GNUPG_ERROR'); + done(); }); }); }); + + it('Overly large message ( >= 48MB) is rejected', function (done) { + let prm = Gpgmejs.init(); + prm.then(function (context) { + context.encrypt( + bigString(48), + inputvalues.encrypt.good.fingerprint).then(function (answer) { + expect(answer).to.be.undefined; + }, function(error){ + expect(error).to.be.an.instanceof(Error); + // TODO who is throwing the error here? + // It is not a GPGME_Error! + done(); + }); + }); + }).timeout(8000); // TODO check different valid parameter }); diff --git a/lang/js/BrowserTestExtension/tests/inputvalues.js b/lang/js/BrowserTestExtension/tests/inputvalues.js index 1761c82..3cd1e92 100644 --- a/lang/js/BrowserTestExtension/tests/inputvalues.js +++ b/lang/js/BrowserTestExtension/tests/inputvalues.js @@ -23,6 +23,9 @@ var inputvalues = { good:{ data : 'Hello World.', fingerprint : 'CDC3A2B2860625CCBFC5A5A9FC6D1B604967FC40' + }, + bad: { + fingerprint: 'CDC3A2B2860625CCBFC5AAAAAC6D1B604967FC4A' } }, init: { @@ -30,3 +33,12 @@ var inputvalues = { } }; + +function bigString(megabytes){ + let maxlength = 1024 * 1024 * megabytes; + let uint = new Uint8Array(maxlength); + for (let i= 0; i < maxlength; i++){ + uint[i] = Math.random() * Math.floor(256); + } + return new TextDecoder('utf-8').decode(uint); +} diff --git a/lang/js/src/Connection.js b/lang/js/src/Connection.js index a198bdc..2c8792d 100644 --- a/lang/js/src/Connection.js +++ b/lang/js/src/Connection.js @@ -99,11 +99,12 @@ export class Connection{ me._connection.onMessage.removeListener(listener) reject(gpgme_error('CONN_EMPTY_GPG_ANSWER')); } else if (msg.type === "error"){ - me._connection.onMessage.removeListener(listener) + me._connection.onMessage.removeListener(listener); reject(gpgme_error('GNUPG_ERROR', msg.msg)); } else { let answer_result = answer.add(msg); if (answer_result !== true){ + me._connection.onMessage.removeListener(listener); reject(answer_result); } if (msg.more === true){ @@ -127,8 +128,12 @@ export class Connection{ }, 5000); }]).then(function(result){ return result; - }, function(error){ - return error; + }, function(reject){ + if(!reject instanceof Error) { + return gpgme_error('GNUPG_ERROR', reject); + } else { + return reject; + } }); } }); @@ -196,7 +201,7 @@ class Answer{ this._response.push(msg[key]); } else { - return gpgme_error('CONN_UNEXPECTED_ANSWER', key); + return gpgme_error('CONN_UNEXPECTED_ANSWER'); } break; } diff --git a/lang/js/src/Message.js b/lang/js/src/Message.js index c42480f..6a59c3e 100644 --- a/lang/js/src/Message.js +++ b/lang/js/src/Message.js @@ -84,9 +84,22 @@ export class GPGME_Message { let checktype = function(val){ switch(typeof(val)){ case 'string': + if (poparam.allowed.indexOf(typeof(val)) >= 0 + && val.length > 0) { + return true; + } + return gpgme_error('PARAM_WRONG'); + break; case 'number': + if ( + poparam.allowed.indexOf('number') >= 0 + && isNaN(value) === false){ + return true; + } + return gpgme_error('PARAM_WRONG'); + break; case 'boolean': - if (poparam.allowed.indexOf(typeof(val)) >= 0){ + if (poparam.allowed.indexOf('boolean') >= 0){ return true; } return gpgme_error('PARAM_WRONG'); @@ -102,7 +115,9 @@ export class GPGME_Message { return res; } } - return true; + if (val.length > 0) { + return true; + } } else if (val instanceof Uint8Array){ if (poparam.allowed.indexOf('Uint8Array') >= 0){ return true; diff --git a/lang/js/unittests.js b/lang/js/unittests.js index 6c0d189..c437d59 100644 --- a/lang/js/unittests.js +++ b/lang/js/unittests.js @@ -130,7 +130,6 @@ function unittests (){ let test0 = toKeyIdArray(hp.valid_openpgplike); expect(test0).to.be.an('array').with.lengthOf(1); - console.log(test0); expect(test0).to.include( hp.valid_openpgplike.primaryKey.getFingerprint()); }); @@ -255,7 +254,7 @@ function unittests (){ expect(test0.isComplete).to.be.false; }); - it('Message is complete after setting mandatoy data', function(){ + it('Message is complete after setting mandatory data', function(){ let test0 = createMessage('encrypt'); test0.setParameter('data', mp.valid_encrypt_data); test0.setParameter('keys', hp.validFingerprints); @@ -263,6 +262,13 @@ function unittests (){ expect(test0.isComplete).to.be.true; }); + it('Message is not complete after mandatory data is empty', function(){ + let test0 = createMessage('encrypt'); + test0.setParameter('data', ''); + test0.setParameter('keys', hp.validFingerprints); + expect(test0.isComplete).to.be.false; + }); + it('Complete Message contains the data that was set', function(){ let test0 = createMessage('encrypt'); test0.setParameter('data', mp.valid_encrypt_data); @@ -315,7 +321,6 @@ function unittests (){ }); }); - mocha.run(); } export default {unittests}; \ No newline at end of file ----------------------------------------------------------------------- Summary of changes: lang/js/BrowserTestExtension/browsertest.html | 1 + .../tests/encryptDecryptTest.js | 72 +++++++++++++ lang/js/BrowserTestExtension/tests/encryptTest.js | 114 ++++++++++++++++++--- lang/js/BrowserTestExtension/tests/inputvalues.js | 12 +++ lang/js/src/Connection.js | 13 ++- lang/js/src/Message.js | 19 +++- lang/js/unittests.js | 11 +- 7 files changed, 219 insertions(+), 23 deletions(-) create mode 100644 lang/js/BrowserTestExtension/tests/encryptDecryptTest.js hooks/post-receive -- GnuPG Made Easy http://git.gnupg.org From cvs at cvs.gnupg.org Tue May 8 18:34:06 2018 From: cvs at cvs.gnupg.org (by Maximilian Krambach) Date: Tue, 08 May 2018 18:34:06 +0200 Subject: [git] GPGME - branch, javascript-binding, updated. gpgme-1.11.1-23-gcca4062 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GnuPG Made Easy". The branch, javascript-binding has been updated via cca40627b0afa2efc85ef7f5f1a1060a221ff2a2 (commit) from 8f3d83e5f0903323ec92f588f60dcecb0ae96de4 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit cca40627b0afa2efc85ef7f5f1a1060a221ff2a2 Author: Maximilian Krambach Date: Tue May 8 18:33:41 2018 +0200 js: more testing -- * Tests: Under certain circumstances, some data change during encrypt-decrypt. Committing the current state so the problem can be discussed. * Fixes: - disconnecting the test ports after tests are complete - fixed passing of the error message from gpgme-json diff --git a/lang/js/BrowserTestExtension/testkey.pub b/lang/js/BrowserTestExtension/testkey.pub new file mode 100644 index 0000000..cfc329f --- /dev/null +++ b/lang/js/BrowserTestExtension/testkey.pub @@ -0,0 +1,30 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQENBFrsKEkBCADKw4Wt8J6M/88qD8PO6lSMCxH1cpwH8iK0uPaFFYsJkkXo7kWf +PTAtrV+REqF/o80dvYcdLvRsV21pvncZz/HXLu1yQ18mC3XObrKokbdgrTTKA5XE +BZkNsqyaMMJauT18H4hYkSg62/tTdO1cu/zWv/LFf7Xyn6+uA74ovXCJlO1s0N2c +PShtr98QRzPMf2owgVk37JnDNp4gGVDGHxSZOuUwxgYAZYnA8SFc+c+3ZrQfY870 ++O4j3Mz4p7yD13AwP4buQLBsb/icxekeQCqpRJhLH9f7MdEcGXa1x36RcEkHdu+M +yJ392eMgD+dKNfRCtyTPhjZTxvbNELIBYICfABEBAAG0EHRlc3RAZXhhbXBsZS5v +cmeJAVQEEwEIAD4WIQTUFzW5Ejb9uIIEjFojAWNe7/DLBQUCWuwoSQIbAwUJA8Jn +AAULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRAjAWNe7/DLBf9kB/wOQ/S60HGw +Fq07W9N01HWULyhHKoMmcHL6rfZ64oDqLxolPSasz7WAMW1jN4qtWJ0mFzwO83V6 +kaBe+wF6Kqir6udFSBW9rPcFg6/VZXPltT0a6uacIHq6DyQ5iMW4YQWbVy9OR2rN +GkYo1JCBR0XdRJYCSX3yB4TWv/eXnZ37/WjmiTOIZh35rjs+NuU/S5JPDfAp2/k7 +0DevQeBsv+UjVXjWpNTZmPbvDnd995uSmC6UY4hzyP84ORYMYn9n1QAR0goxDN6U +unOf9Rlp1oMzdxMool/d1MlCxg2h3jheuhv7lgUF4KpvHOuEPXQ7UO417E0TYcDZ +1J8Nsv87SZeEuQENBFrsKEkBCADjoEBhG/QPqZHg8VyoD1xYRAWGxyDJkX/GrSs6 +yE+x2hk5FoQCajxKa/d4AVxOnJpdwhAfeXeSNaql5Ejgzax+Tdj9BV6vtGVJVv0p +O7bgAiZxkA6RHxtNqhpPnPQoXvUzkzpRgpuL+Nj4yIg7z1ITH6KQH4u5SI9vd+j/ +8i9Taz67pdZwuJjac8qBuJHjzAo1bjYctFYUSG5pbmMQyNLySzgiNkFa4DajODlt +3RuqVGP316Fk+Sy2+60tC/HlX8jgMyMONfOGBQx6jk8tvAphS/LAqrrNepnagIyL +UGKU+L8cB2g1PGGp2biBFWqZbudZoyRBet/0yH/zirBdQJw1ABEBAAGJATwEGAEI +ACYWIQTUFzW5Ejb9uIIEjFojAWNe7/DLBQUCWuwoSQIbDAUJA8JnAAAKCRAjAWNe +7/DLBf0pCACPp5hBuUWngu2Hqvg+tNiujfsiYzId3MffFxEk3CbXeHcJ5F32NDJ9 +PYCnra4L8wSv+NZt9gIa8lFwoFSFQCjzH7KE86XcV3MhfdJTNb/+9CR7Jq3e/4Iy +0N5ip7PNYMCyakcAsxvsNCJKrSaDuYe/OAoTXRBtgRWE2uyT315em02Lkr+2Cc/Q +k6H+vlNOHGRgnpI/OZZjnUuUfBUvMGHr1phW+y7aeymC9PnUGdViRdJe23nntMSD +A+0/I7ESO9JsWvJbyBmuiZpu9JjScOjYH9xpQLqRNyw4WHpZriN69F0t9Mmd7bM1 ++UyPgbPEr0iWMeyctYsuOLeUyQKMscDT +=QyY6 +-----END PGP PUBLIC KEY BLOCK----- diff --git a/lang/js/BrowserTestExtension/testkey.sec b/lang/js/BrowserTestExtension/testkey.sec new file mode 100644 index 0000000..ced8f3e --- /dev/null +++ b/lang/js/BrowserTestExtension/testkey.sec @@ -0,0 +1,57 @@ +-----BEGIN PGP PRIVATE KEY BLOCK----- + +lQOYBFrsKEkBCADKw4Wt8J6M/88qD8PO6lSMCxH1cpwH8iK0uPaFFYsJkkXo7kWf +PTAtrV+REqF/o80dvYcdLvRsV21pvncZz/HXLu1yQ18mC3XObrKokbdgrTTKA5XE +BZkNsqyaMMJauT18H4hYkSg62/tTdO1cu/zWv/LFf7Xyn6+uA74ovXCJlO1s0N2c +PShtr98QRzPMf2owgVk37JnDNp4gGVDGHxSZOuUwxgYAZYnA8SFc+c+3ZrQfY870 ++O4j3Mz4p7yD13AwP4buQLBsb/icxekeQCqpRJhLH9f7MdEcGXa1x36RcEkHdu+M +yJ392eMgD+dKNfRCtyTPhjZTxvbNELIBYICfABEBAAEAB/wLJ0gyMjs2fFfT83wM +5Lzz2yQIwV4t3bblBAujdHTqeN5Zmsm/oakFyjSokULK96Kv0R4ej9eoIgMFvxFk +HRkrggxTrbsNJ7I6QcKYHTPeIIj318ykNL6fj0WJUcdPIENukXl5jbqNyk3/4D2y +TTDySyq6jHTgvMH4K4KJUSpglvSJPntTk9RhuFGHAF+sNR9atygDYctAaERMRtSg +LCoSt/AoX5GRMlQjXT9oqQjwSQoZyF4s8HMC8wdTFIE/E0L4IVdHVp8sz2UszNtT +W/evmCA+KVruKjRH/Fhrq4hHkEamW28+j4L6uAyagONP7BONs+S5Oo2zTT9+tV2R +ILTZBADdgLuAgF6C5Lu9jCF6DfFgaT/uafMyQNkEGNlxOHMWHTgLHe475V2eG9gA +amd4yXKyEFKU1PWnvlGuicQSGdzVcwmq61msvXgYD0FK3LP3yWzKnE4X1tzrC9Vp +/uHJxKjewCuyt1f5in919v+T8TbUxBYKC0zX/qWtX+10cTx77QQA6leqhToJ95Yc +u4UBrKMEO+y2v8Svb3LG7yI5oY8tkw0EkJ/kpZ8xTAfZYCe6fXdvVE3PHg2lrxyc +Wv/EU3QY/qA3G82mbXYeJ2jNZaTNYo4MylMrt4Mx25x4ke7JlsE8SVrQ+4CrHkqp +OjSIa7fppLrQ78uW980AtN8NNQGrlTsD/A9aoA60Igxy1Q3K2uSyDCyjLknv57ym +ZSBD3/t7m0l6Q6gbdfhNGosT+Hd4y3actqEqzXZHW2VG4dKZ/wRNkxtSm9adU9vs +EHyzxjb6mKIH32zAG5TaFT20hC+NK6lsyHr9UE2ZrS6ma2sLxGW2O40hqNsdD+5m +NrqeBc2I/js1PMK0EHRlc3RAZXhhbXBsZS5vcmeJAVQEEwEIAD4WIQTUFzW5Ejb9 +uIIEjFojAWNe7/DLBQUCWuwoSQIbAwUJA8JnAAULCQgHAgYVCgkICwIEFgIDAQIe +AQIXgAAKCRAjAWNe7/DLBf9kB/wOQ/S60HGwFq07W9N01HWULyhHKoMmcHL6rfZ6 +4oDqLxolPSasz7WAMW1jN4qtWJ0mFzwO83V6kaBe+wF6Kqir6udFSBW9rPcFg6/V +ZXPltT0a6uacIHq6DyQ5iMW4YQWbVy9OR2rNGkYo1JCBR0XdRJYCSX3yB4TWv/eX +nZ37/WjmiTOIZh35rjs+NuU/S5JPDfAp2/k70DevQeBsv+UjVXjWpNTZmPbvDnd9 +95uSmC6UY4hzyP84ORYMYn9n1QAR0goxDN6UunOf9Rlp1oMzdxMool/d1MlCxg2h +3jheuhv7lgUF4KpvHOuEPXQ7UO417E0TYcDZ1J8Nsv87SZeEnQOYBFrsKEkBCADj +oEBhG/QPqZHg8VyoD1xYRAWGxyDJkX/GrSs6yE+x2hk5FoQCajxKa/d4AVxOnJpd +whAfeXeSNaql5Ejgzax+Tdj9BV6vtGVJVv0pO7bgAiZxkA6RHxtNqhpPnPQoXvUz +kzpRgpuL+Nj4yIg7z1ITH6KQH4u5SI9vd+j/8i9Taz67pdZwuJjac8qBuJHjzAo1 +bjYctFYUSG5pbmMQyNLySzgiNkFa4DajODlt3RuqVGP316Fk+Sy2+60tC/HlX8jg +MyMONfOGBQx6jk8tvAphS/LAqrrNepnagIyLUGKU+L8cB2g1PGGp2biBFWqZbudZ +oyRBet/0yH/zirBdQJw1ABEBAAEAB/4lN3gXOI4OuoOcsvHak4pebx61Mt0YP9cT +qZASIBqxok5x8E28pFh/tYfkYdqRCtdNYZOnxcEoUWh5j6nfwZkEnJ9P/T8GPNk7 +pMKnKXmExi05b5uGHD8nU1rSbf/YkvAF0vpbxd4/RDxbbtQhbUwGzusSI+pBLM0w +5TreEB+vRGBc2gOvXXOtKLNEa7M9rH2EwbAkP3jOGGwgk6adxbQdBcRxq4merqhL +YrVz73bCj8TDc0fsNJyIaZZJ++ejfBFYavsF1pvx9z7FNFi8rSXoiB3SBtaWGfhr +bwNaMZrDc7TRIq/fgGaL6g//bzcWrr1YaHXZ10Bgx6UymDOlYkCpBADm0Hv46sPw +07SO8+IACcaQliOto1pndOPwTimCeo58/7rf8I2a5uuJloGrnPwAX65bKDnUALp6 +X3lnXRNMhnB3Uewx4i00LQmjsxhJfQiGLpMv0j58tn64s7GqQzGVV1JKcQm992RV +jFOydyjZ+K4LGWEOITG/bZrMEVNGCM+OnQQA/Haz8xN0NFSlq7tyfFc0pkx/TiCX +xGfBqbO0wU2b5GMnZbY/06HENpidIzpa231VQaw5/nPTvfhlLKW1iGAkc148cX1q +lL9w2ksXuaHR3LXud2VcfVTIdxU/7h7u1dD/85+c0+7jlGObD9cXKxlM6OjpIJz1 +l5/1h3C5S0TuxHkEAL/3BGihkhNfv1Xx0rWu0/732usX/nE/A9C26hGu41FUf3fp +0ilonKpKZUEwWt5hWSEFCSrznNVekiO0rxvuu3RVegvzThPNU4Pf4JZtJpRVhvUQ +d9ulxJw7V9rs75uNBatTNC0kXuGoXhehw4Bn93xa67gYGd3LfrH+oT0GCDpTSHCJ +ATwEGAEIACYWIQTUFzW5Ejb9uIIEjFojAWNe7/DLBQUCWuwoSQIbDAUJA8JnAAAK +CRAjAWNe7/DLBf0pCACPp5hBuUWngu2Hqvg+tNiujfsiYzId3MffFxEk3CbXeHcJ +5F32NDJ9PYCnra4L8wSv+NZt9gIa8lFwoFSFQCjzH7KE86XcV3MhfdJTNb/+9CR7 +Jq3e/4Iy0N5ip7PNYMCyakcAsxvsNCJKrSaDuYe/OAoTXRBtgRWE2uyT315em02L +kr+2Cc/Qk6H+vlNOHGRgnpI/OZZjnUuUfBUvMGHr1phW+y7aeymC9PnUGdViRdJe +23nntMSDA+0/I7ESO9JsWvJbyBmuiZpu9JjScOjYH9xpQLqRNyw4WHpZriN69F0t +9Mmd7bM1+UyPgbPEr0iWMeyctYsuOLeUyQKMscDT +=hkUm +-----END PGP PRIVATE KEY BLOCK----- diff --git a/lang/js/BrowserTestExtension/tests/encryptDecryptTest.js b/lang/js/BrowserTestExtension/tests/encryptDecryptTest.js index 7abf2d9..e28dd66 100644 --- a/lang/js/BrowserTestExtension/tests/encryptDecryptTest.js +++ b/lang/js/BrowserTestExtension/tests/encryptDecryptTest.js @@ -24,30 +24,144 @@ describe('Encryption and Decryption', function () { prm.then(function (context) { context.encrypt( inputvalues.encrypt.good.data, - inputvalues.encrypt.good.fingerprint).then( function(answer){ + inputvalues.encrypt.good.fingerprint).then(function (answer) { expect(answer).to.not.be.empty; expect(answer.data).to.be.a("string"); expect(answer.data).to.include('BEGIN PGP MESSAGE'); expect(answer.data).to.include('END PGP MESSAGE'); - context.decrypt(answer.data).then(function(result){ + context.decrypt(answer.data).then(function (result) { expect(result).to.not.be.empty; expect(result.data).to.be.a('string'); expect(result.data).to.equal(inputvalues.encrypt.good.data); + context.connection.disconnect(); done(); }); }); }); }); + /** + * Fails with random data! Some bytes (up to 100) of the original are missing in + * the result +*/ /** - * Fails with random data! Some bytes (up to 100) of the original are missing in - * the result - */ + for (let j = 0; j < 10; j++){ + it('Successful encrypt and decrypt specific sets: ', + function (done) { + let prm = Gpgmejs.init(); + let data = bigBoringString(5); //see ./inputvalues.js + expect(Object.prototype.toString.call(data)).to.equal("[object String]"); + prm.then(function (context) { + context.encrypt(data, + inputvalues.encrypt.good.fingerprint).then( + function (answer) { + expect(answer).to.not.be.empty; + expect(answer.data).to.be.a("string"); + expect(answer.data).to.include( + 'BEGIN PGP MESSAGE'); + expect(answer.data).to.include( + 'END PGP MESSAGE'); + context.decrypt(answer.data).then( + function (result) { + if (data.length !== result.data.length) { + + for (let k = 0; k < data.length; k++) { + if (data[k] !== result.data[k]) { + console.log(k); + console.log(data[k - 2] + data[k - 1] + data[k] + data[k + 1]); + console.log(result.data[k - 2] + result.data[k - 1] + result.data[k] + result.data[k + 1]); + break; + } + } + } + expect(result).to.not.be.empty; + expect(result.data).to.be.a('string'); + expect(result.data).to.equal(data); + context.connection.disconnect(); + done(); + + }); + }); + }); + }).timeout(5000); + } + + + it('Roundtrip does not destroy trailing whitespace', + function (done) { + let prm = Gpgmejs.init(); + prm.then(function (context) { + let data = 'Keks. \rKeks \n Keks \r\n'; + context.encrypt(data, + inputvalues.encrypt.good.fingerprint).then( + function (answer) { + expect(answer).to.not.be.empty; + expect(answer.data).to.be.a("string"); + expect(answer.data).to.include( + 'BEGIN PGP MESSAGE'); + expect(answer.data).to.include( + 'END PGP MESSAGE'); + context.decrypt(answer.data).then( + function (result) { + expect(result).to.not.be.empty; + expect(result.data).to.be.a('string'); + expect(result.data).to.equal(data); + context.connection.disconnect(); + done(); + + }); + }); + }); + }).timeout(3000); + + it('Test with simple non-ascii input', + function (done) { + let prm = Gpgmejs.init(); + prm.then(function (context) { + let data = ''; + for (let i=0; i < 1024 * 1024 * 0.1; i++){ + data += inputvalues.encrypt.good.data_nonascii; + } + context.encrypt(data, + inputvalues.encrypt.good.fingerprint).then( + function (answer) { + expect(answer).to.not.be.empty; + expect(answer.data).to.be.a("string"); + expect(answer.data).to.include( + 'BEGIN PGP MESSAGE'); + expect(answer.data).to.include( + 'END PGP MESSAGE'); + console.log(answer); + context.decrypt(answer.data).then( + function (result) { + expect(result).to.not.be.empty; + expect(result.data).to.be.a('string'); + if (data.length !== result.data.length) { + + for (let k = 0; k < data.length; k++) { + if (data[k] !== result.data[k]) { + console.log(k); + console.log(data[k - 2] + data[k - 1] + data[k] + data[k + 1]); + console.log(result.data[k - 2] + result.data[k - 1] + result.data[k] + result.data[k + 1]); + break; + } + } + } + console.log(data.length - result.data.length); + expect(result.data).to.equal(data); + context.connection.disconnect(); + done(); + + }); + }); + }); + }).timeout(3000); +*/ /** - for (let i=0; i< 20; i++) { - it('Successful encrypt 1 MB '+ i+ '/20', function (done) { + for (let i=0; i< 100; i++) { + it('Successful encrypt random data '+ (i+1) + '/100', function (done) { let prm = Gpgmejs.init(); - let data = bigString(0.1); + let data = bigString(0.2); // << set source data here prm.then(function (context) { context.encrypt(data, inputvalues.encrypt.good.fingerprint).then( @@ -63,10 +177,62 @@ describe('Encryption and Decryption', function () { expect(result).to.not.be.empty; expect(result.data).to.be.a('string'); expect(result.data).to.equal(data); + context.connection.disconnect(); done(); }); }); }); - }).timeout(10000); - };*/ + }).timeout(5000); + }; +*/ + +/** still fails + it('Successful encrypt 0.8 MB Uint8Array', function (done) { + let prm = Gpgmejs.init(); + let data = bigUint8(0.8); + prm.then(function (context) { + context.encrypt(data, + inputvalues.encrypt.good.fingerprint).then( + function (answer){ + expect(answer).to.not.be.empty; + expect(answer.data).to.be.a("string"); + expect(answer.data).to.include( + 'BEGIN PGP MESSAGE'); + expect(answer.data).to.include( + 'END PGP MESSAGE'); + context.decrypt(answer.data).then( + function(result){ + expect(result).to.not.be.empty; + expect(result.data).to.be.a('string'); + expect(result.data).to.equal(data); + done(); + }); + }); + }); + }).timeout(5000); +*/ + + it('Decrypt simple non-ascii', + function (done) { + let prm = Gpgmejs.init(); + prm.then(function (context) { + data = encryptedData; + context.decrypt(data).then( + function (result) { + expect(result).to.not.be.empty; + expect(result.data).to.be.a('string'); + expect(result.data).to.equal(inputvalues.encrypt.good.data_nonascii); + context.encrypt(inputvalues.encrypt.good.data_nonascii, inputvalues.encrypt.good.fingerprint).then( + function(result){ + context.decrypt(result.data).then(function(answer){ + expect(answer.data).to.equal(inputvalues.encrypt.good.data_nonascii); + context.connection.disconnect(); + done(); + }); + }); + }); + + }); + }).timeout(8000); + }); \ No newline at end of file diff --git a/lang/js/BrowserTestExtension/tests/encryptTest.js b/lang/js/BrowserTestExtension/tests/encryptTest.js index 37b319e..2e95151 100644 --- a/lang/js/BrowserTestExtension/tests/encryptTest.js +++ b/lang/js/BrowserTestExtension/tests/encryptTest.js @@ -28,6 +28,7 @@ describe('Encryption', function () { expect(answer.data).to.be.a("string"); expect(answer.data).to.include('BEGIN PGP MESSAGE'); expect(answer.data).to.include('END PGP MESSAGE'); + context.connection.disconnect(); done(); }); }); @@ -44,11 +45,13 @@ describe('Encryption', function () { expect(answer.data).to.be.a("string"); expect(answer.data).to.include('BEGIN PGP MESSAGE'); expect(answer.data).to.include('END PGP MESSAGE'); + context.connection.disconnect(); done(); }); }); }).timeout(5000); +/** it('Successful encrypt 20 MB', function (done) { let prm = Gpgmejs.init(); let data = bigString(20); @@ -60,11 +63,12 @@ describe('Encryption', function () { expect(answer.data).to.be.a("string"); expect(answer.data).to.include('BEGIN PGP MESSAGE'); expect(answer.data).to.include('END PGP MESSAGE'); + context.connection.disconnect(); done(); }); }); }).timeout(20000); - +*/ /** it('Successful encrypt 30 MB', function (done) { // TODO: There seems to be a limit imposed at least by chrome at about 21 MB @@ -78,6 +82,7 @@ describe('Encryption', function () { expect(answer.data).to.be.a("string"); expect(answer.data).to.include('BEGIN PGP MESSAGE'); expect(answer.data).to.include('END PGP MESSAGE'); + context.connection.disconnect(); done(); }); }); @@ -94,6 +99,7 @@ describe('Encryption', function () { }, function(error){ expect(error).to.be.an('Error'); expect(error.code).to.equal('MSG_INCOMPLETE'); + context.connection.disconnect(); done(); }); }); @@ -108,6 +114,7 @@ describe('Encryption', function () { }, function (error) { expect(error).to.be.an.instanceof(Error); expect(error.code).to.equal('MSG_INCOMPLETE'); + context.connection.disconnect(); done(); }); }); @@ -125,10 +132,11 @@ describe('Encryption', function () { expect(error).to.be.an('Error'); expect(error.code).to.not.be.undefined; expect(error.code).to.equal('GNUPG_ERROR'); + context.connection.disconnect(); done(); }); }); - }); + }).timeout(5000);; it('Overly large message ( >= 48MB) is rejected', function (done) { let prm = Gpgmejs.init(); @@ -141,6 +149,7 @@ describe('Encryption', function () { expect(error).to.be.an.instanceof(Error); // TODO who is throwing the error here? // It is not a GPGME_Error! + context.connection.disconnect(); done(); }); }); diff --git a/lang/js/BrowserTestExtension/tests/inputvalues.js b/lang/js/BrowserTestExtension/tests/inputvalues.js index 3cd1e92..bc8c97b 100644 --- a/lang/js/BrowserTestExtension/tests/inputvalues.js +++ b/lang/js/BrowserTestExtension/tests/inputvalues.js @@ -22,7 +22,8 @@ var inputvalues = { encrypt: { good:{ data : 'Hello World.', - fingerprint : 'CDC3A2B2860625CCBFC5A5A9FC6D1B604967FC40' + fingerprint : 'D41735B91236FDB882048C5A2301635EEFF0CB05', + data_nonascii: '??u?erste ?? f?r ?oquis at h?me! ?????? ????\n' }, bad: { fingerprint: 'CDC3A2B2860625CCBFC5AAAAAC6D1B604967FC4A' @@ -42,3 +43,62 @@ function bigString(megabytes){ } return new TextDecoder('utf-8').decode(uint); } + +function bigUint8(megabytes){ + let maxlength = 1024 * 1024 * megabytes; + let uint = new Uint8Array(maxlength); + for (let i= 0; i < maxlength; i++){ + uint[i] = Math.random() * Math.floor(256); + } + return uint; +} + +function bigBoringString(megabytes){ + let maxlength = 1024 * 1024 * megabytes; + let string = ''; + let chars = ' ?0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; + for (let i= 0; i < maxlength; i++){ + string = string + chars[Math.floor(Math.random() * chars.length)]; + } + return string; +} + +function slightlyLessBoringString(megabytes, set){ + let maxlength = 1024 * 1024 * megabytes; + let string = ''; + let chars = ''; + if (!set){ + + } else if (set ===1 ) { + chars = '\n\"\r \''; + } else if (set === 2 ) { + chars = '()=?`#+-{}[]'; + } else if (set === 3){ + chars = '^?/'; + //'*<>\\^?/'; + } else if (set ===4) { + chars = '???????~??||@'; + } else { + chars = '*<>\n\"\r?$%&/()=?`#+-{}[] \''; //fails! + + } + for (let i= 0; i < maxlength; i++){ + string = string + chars[Math.floor(Math.random() * chars.length)]; + } + return string; +} + +var encryptedData = + '-----BEGIN PGP MESSAGE-----\n' + + '\n' + + 'hQEMA6B8jfIUScGEAQgAlANd3uyhmhYLzVcfz4LEqA8tgUC3n719YH0iuKEzG/dv\n' + + 'B8fsIK2HoeQh2T3/Cc2LBMjgn4K33ksG3k2MqrbIvxWGUQlOAuggc259hquWtX9B\n' + + 'EcEoOAeh5DuZT/b8CM5seJKNEpPzNxbEDiGikp9DV9gfIQTTUnrDjAu5YtgCN9vA\n' + + '3PJxihioH8ODoQw2jlYSkqgXpBVP2Fbx7qgTuxGNu5w36E0/P93//4hDXcKou7ez\n' + + 'o0+NEGSkbaY+OPk1k7k9n+vBSC3F440dxsTNs5WmRvx9XZEotJkUBweE+8XaoLCn\n' + + '3RrtyD/lj63qi3dbyI5XFLuPU1baFskJ4UAmI4wNhdJ+ASailpnFBnNgiFBh3ZfB\n' + + 'G5Rmd3ocSL7l6lq1bVK9advXb7vcne502W1ldAfHgTdQgc2CueIDFUYAaXP2OvhP\n' + + 'isGL7jOlDCBKwep67ted0cTRPLWkk3NSuLIlvD5xs6L4z3rPu92gXYgbZoMMdP0N\n' + + 'kSAQYOHplfA7YJWkrlRm\n' + + '=zap6\n' + + '-----END PGP MESSAGE-----\n'; \ No newline at end of file diff --git a/lang/js/src/Errors.js b/lang/js/src/Errors.js index d26aab1..b71004a 100644 --- a/lang/js/src/Errors.js +++ b/lang/js/src/Errors.js @@ -110,7 +110,7 @@ export function gpgme_error(code = 'GENERIC_ERROR', info){ } return null; } else if (code === 'GNUPG_ERROR'){ - return new GPGME_Error(code, info.msg); + return new GPGME_Error(code, info); } else { return new GPGME_Error('GENERIC_ERROR'); diff --git a/lang/js/src/gpgmejs.js b/lang/js/src/gpgmejs.js index 9475b2b..c1a0137 100644 --- a/lang/js/src/gpgmejs.js +++ b/lang/js/src/gpgmejs.js @@ -170,18 +170,19 @@ function putData(message, data){ if (!data){ return gpgme_error('PARAM_WRONG'); } else if (data instanceof Uint8Array){ - let decoder = new TextDecoder('utf8'); message.setParameter('base64', true); - message.setParameter ('data', decoder.decode(data)); + message.setParameter ('data', btoa(data)); } else if (typeof(data) === 'string') { message.setParameter('base64', false); message.setParameter('data', data); - } else if ( typeof(data) === 'object' && data.hasOwnProperty(getText)){ + } else if ( typeof(data) === 'object' && data.hasOwnProperty('getText')){ let txt = data.getText(); if (txt instanceof Uint8Array){ - let decoder = new TextDecoder('utf8'); message.setParameter('base64', true); - message.setParameter ('data', decoder.decode(txt)); + message.setParameter ('data', btoa(txt)); + } + else { + return gpgme_error('PARAM_WRONG'); } } else { return gpgme_error('PARAM_WRONG'); ----------------------------------------------------------------------- Summary of changes: lang/js/BrowserTestExtension/testkey.pub | 30 ++++ lang/js/BrowserTestExtension/testkey.sec | 57 +++++++ .../tests/encryptDecryptTest.js | 186 +++++++++++++++++++-- lang/js/BrowserTestExtension/tests/encryptTest.js | 13 +- lang/js/BrowserTestExtension/tests/inputvalues.js | 62 ++++++- lang/js/src/Errors.js | 2 +- lang/js/src/gpgmejs.js | 11 +- 7 files changed, 342 insertions(+), 19 deletions(-) create mode 100644 lang/js/BrowserTestExtension/testkey.pub create mode 100644 lang/js/BrowserTestExtension/testkey.sec hooks/post-receive -- GnuPG Made Easy http://git.gnupg.org From cvs at cvs.gnupg.org Wed May 9 16:48:47 2018 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Wed, 09 May 2018 16:48:47 +0200 Subject: [git] GPGME - branch, master, updated. gpgme-1.11.1-7-ge54b110 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GnuPG Made Easy". The branch, master has been updated via e54b110aec3165a32ff9551d0c5227b88aa3dd4f (commit) via e2a8a87bf9cfae5d4e8a5953c2a5303b44feb398 (commit) from 46da79e3de99a7b65748994921d6aab73b9974e7 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit e54b110aec3165a32ff9551d0c5227b88aa3dd4f Author: Werner Koch Date: Wed May 9 16:41:05 2018 +0200 json: Improve auto-base64 encoding to not split UTF-8 chars. * src/gpgme-json.c (make_data_object): Switch to Base64 also for UTF-8 characters. Signed-off-by: Werner Koch diff --git a/src/gpgme-json.c b/src/gpgme-json.c index f1e9f25..fb5f149 100644 --- a/src/gpgme-json.c +++ b/src/gpgme-json.c @@ -610,7 +610,8 @@ make_data_object (cjson_t result, gpgme_data_t data, size_t chunksize, { gpg_error_t err; char *buffer; - size_t buflen; + const char *s; + size_t buflen, n; int c; if (!base64 || base64 == -1) /* Make sure that we really have a string. */ @@ -629,13 +630,18 @@ make_data_object (cjson_t result, gpgme_data_t data, size_t chunksize, base64 = 0; if (!buflen) log_fatal ("Appended Nul byte got lost\n"); - if (memchr (buffer, 0, buflen-1)) - { - buflen--; /* Adjust for the extra nul byte. */ - base64 = 1; - } - /* Fixme: We might want to do more advanced heuristics than to - * only look for a Nul. */ + /* Figure out if there is any Nul octet in the buffer. In that + * case we need to Base-64 the buffer. Due to problems with the + * browser's Javascript we use Base-64 also in case an UTF-8 + * character is in the buffer. This is because the chunking may + * split an UTF-8 characters and JS can't handle this. */ + for (s=buffer, n=0; n < buflen -1; s++, n++) + if (!*s || (*s & 0x80)) + { + buflen--; /* Adjust for the extra nul byte. */ + base64 = 1; + break; + } } /* Adjust the chunksize if we need to do base64 conversion. */ commit e2a8a87bf9cfae5d4e8a5953c2a5303b44feb398 Author: Werner Koch Date: Wed May 9 16:39:30 2018 +0200 core: Make the status-fd monitor work for all gpgsm commands. * src/engine-gpgsm.c (status_handler): Call the status monitor also here. Signed-off-by: Werner Koch diff --git a/src/engine-gpgsm.c b/src/engine-gpgsm.c index da7e524..7b22183 100644 --- a/src/engine-gpgsm.c +++ b/src/engine-gpgsm.c @@ -1013,8 +1013,17 @@ status_handler (void *opaque, int fd) *(rest++) = 0; r = _gpgme_parse_status (line + 2); + if (gpgsm->status.mon_cb && r != GPGME_STATUS_PROGRESS) + { + /* Note that we call the monitor even if we do + * not know the status code (r < 0). */ + err = gpgsm->status.mon_cb (gpgsm->status.mon_cb_value, + line + 2, rest); + } + else + err = 0; - if (r >= 0) + if (r >= 0 && !err) { if (gpgsm->status.fnc) { ----------------------------------------------------------------------- Summary of changes: src/engine-gpgsm.c | 11 ++++++++++- src/gpgme-json.c | 22 ++++++++++++++-------- 2 files changed, 24 insertions(+), 9 deletions(-) hooks/post-receive -- GnuPG Made Easy http://git.gnupg.org From cvs at cvs.gnupg.org Wed May 9 19:44:18 2018 From: cvs at cvs.gnupg.org (by Maximilian Krambach) Date: Wed, 09 May 2018 19:44:18 +0200 Subject: [git] GPGME - branch, javascript-binding, updated. gpgme-1.11.1-30-gc92326c Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GnuPG Made Easy". The branch, javascript-binding has been updated via c92326cc257cf7c8b6c0ddc43ec81573c409bc64 (commit) via 5f5bf024a83625b8f8bac4779b1c2236637c23e0 (commit) via e54b110aec3165a32ff9551d0c5227b88aa3dd4f (commit) via e2a8a87bf9cfae5d4e8a5953c2a5303b44feb398 (commit) via 46da79e3de99a7b65748994921d6aab73b9974e7 (commit) via 26820ba62920acfe2775bce8fc2bc8b3f17b1c10 (commit) via 6b267c56fd6e54fb1c254455c04495534260b547 (commit) from cca40627b0afa2efc85ef7f5f1a1060a221ff2a2 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit c92326cc257cf7c8b6c0ddc43ec81573c409bc64 Author: Maximilian Krambach Date: Wed May 9 19:40:57 2018 +0200 js: more testing of nativeMessaging connection -- * There were some inconsistencies between utf-8, transfer and browsers' utf16, which broke characters that were split between individual messages. src/Connection now contains a workaround that reassembles javascripts' format from passed base64 strings. This needs someone more experienced looking. * Added several new tests which were failing during initial debugging of this issue * reorganized BrowsertestExtension to avoid cluttering. diff --git a/lang/js/BrowserTestExtension/browsertest.html b/lang/js/BrowserTestExtension/browsertest.html index d12e03c..c379ef5 100644 --- a/lang/js/BrowserTestExtension/browsertest.html +++ b/lang/js/BrowserTestExtension/browsertest.html @@ -12,14 +12,11 @@ - - - diff --git a/lang/js/BrowserTestExtension/index.html b/lang/js/BrowserTestExtension/index.html new file mode 100644 index 0000000..05d413b --- /dev/null +++ b/lang/js/BrowserTestExtension/index.html @@ -0,0 +1,40 @@ + + + + + + + +

gpgmejs - Tests

+

+ The unittests rely on a separately packaged version of gpgmejs, + with the different classes and functions exposed. These tests and their + input values can be found in gpgme/lang/js/test. They do not test the + overall functionality, but the individual behaviour of the components. +

+

+

+ The functionality tests, to be found in + gpgme/lang/js/BrowserTestExtension, check the overall functionality of + the standard packaged version of gpgmejs. +

+

+ + diff --git a/lang/js/BrowserTestExtension/browsertest.html b/lang/js/BrowserTestExtension/longTests.html similarity index 78% copy from lang/js/BrowserTestExtension/browsertest.html copy to lang/js/BrowserTestExtension/longTests.html index d12e03c..8ff969b 100644 --- a/lang/js/BrowserTestExtension/browsertest.html +++ b/lang/js/BrowserTestExtension/longTests.html @@ -12,14 +12,10 @@ - - - - - + diff --git a/lang/js/BrowserTestExtension/popup.js b/lang/js/BrowserTestExtension/popup.js index 4764df5..12beb1e 100644 --- a/lang/js/BrowserTestExtension/popup.js +++ b/lang/js/BrowserTestExtension/popup.js @@ -39,6 +39,6 @@ document.addEventListener('DOMContentLoaded', function() { chrome.tabs.create({ - url: './browsertest.html' + url: './index.html' }); }); diff --git a/lang/js/BrowserTestExtension/runbrowsertest.js b/lang/js/BrowserTestExtension/runbrowsertest.js index 308c716..39bc3fb 100644 --- a/lang/js/BrowserTestExtension/runbrowsertest.js +++ b/lang/js/BrowserTestExtension/runbrowsertest.js @@ -19,4 +19,3 @@ */ mocha.run(); -Gpgmejs_test.unittests(); diff --git a/lang/js/BrowserTestExtension/runbrowsertest.js b/lang/js/BrowserTestExtension/rununittests.js similarity index 99% copy from lang/js/BrowserTestExtension/runbrowsertest.js copy to lang/js/BrowserTestExtension/rununittests.js index 308c716..f85ed8b 100644 --- a/lang/js/BrowserTestExtension/runbrowsertest.js +++ b/lang/js/BrowserTestExtension/rununittests.js @@ -17,6 +17,5 @@ * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1+ */ - -mocha.run(); Gpgmejs_test.unittests(); +mocha.run(); diff --git a/lang/js/BrowserTestExtension/tests/encryptDecryptTest.js b/lang/js/BrowserTestExtension/tests/encryptDecryptTest.js index e28dd66..a66e153 100644 --- a/lang/js/BrowserTestExtension/tests/encryptDecryptTest.js +++ b/lang/js/BrowserTestExtension/tests/encryptDecryptTest.js @@ -19,7 +19,7 @@ */ describe('Encryption and Decryption', function () { - it('Successful encrypt and decrypt', function (done) { + it('Successful encrypt and decrypt simple string', function (done) { let prm = Gpgmejs.init(); prm.then(function (context) { context.encrypt( @@ -39,54 +39,6 @@ describe('Encryption and Decryption', function () { }); }); }); - - /** - * Fails with random data! Some bytes (up to 100) of the original are missing in - * the result -*/ -/** - for (let j = 0; j < 10; j++){ - it('Successful encrypt and decrypt specific sets: ', - function (done) { - let prm = Gpgmejs.init(); - let data = bigBoringString(5); //see ./inputvalues.js - expect(Object.prototype.toString.call(data)).to.equal("[object String]"); - prm.then(function (context) { - context.encrypt(data, - inputvalues.encrypt.good.fingerprint).then( - function (answer) { - expect(answer).to.not.be.empty; - expect(answer.data).to.be.a("string"); - expect(answer.data).to.include( - 'BEGIN PGP MESSAGE'); - expect(answer.data).to.include( - 'END PGP MESSAGE'); - context.decrypt(answer.data).then( - function (result) { - if (data.length !== result.data.length) { - - for (let k = 0; k < data.length; k++) { - if (data[k] !== result.data[k]) { - console.log(k); - console.log(data[k - 2] + data[k - 1] + data[k] + data[k + 1]); - console.log(result.data[k - 2] + result.data[k - 1] + result.data[k] + result.data[k + 1]); - break; - } - } - } - expect(result).to.not.be.empty; - expect(result.data).to.be.a('string'); - expect(result.data).to.equal(data); - context.connection.disconnect(); - done(); - - }); - }); - }); - }).timeout(5000); - } - - it('Roundtrip does not destroy trailing whitespace', function (done) { let prm = Gpgmejs.init(); @@ -112,88 +64,22 @@ describe('Encryption and Decryption', function () { }); }); }); - }).timeout(3000); - - it('Test with simple non-ascii input', - function (done) { - let prm = Gpgmejs.init(); - prm.then(function (context) { - let data = ''; - for (let i=0; i < 1024 * 1024 * 0.1; i++){ - data += inputvalues.encrypt.good.data_nonascii; - } - context.encrypt(data, - inputvalues.encrypt.good.fingerprint).then( - function (answer) { - expect(answer).to.not.be.empty; - expect(answer.data).to.be.a("string"); - expect(answer.data).to.include( - 'BEGIN PGP MESSAGE'); - expect(answer.data).to.include( - 'END PGP MESSAGE'); - console.log(answer); - context.decrypt(answer.data).then( - function (result) { - expect(result).to.not.be.empty; - expect(result.data).to.be.a('string'); - if (data.length !== result.data.length) { - - for (let k = 0; k < data.length; k++) { - if (data[k] !== result.data[k]) { - console.log(k); - console.log(data[k - 2] + data[k - 1] + data[k] + data[k + 1]); - console.log(result.data[k - 2] + result.data[k - 1] + result.data[k] + result.data[k + 1]); - break; - } - } - } - console.log(data.length - result.data.length); - expect(result.data).to.equal(data); - context.connection.disconnect(); - done(); + }).timeout(5000); - }); - }); - }); - }).timeout(3000); -*/ -/** - for (let i=0; i< 100; i++) { - it('Successful encrypt random data '+ (i+1) + '/100', function (done) { - let prm = Gpgmejs.init(); - let data = bigString(0.2); // << set source data here + for (let j = 0; j < inputvalues.encrypt.good.data_nonascii_32.length; j++){ + it('Roundtrip with >1MB non-ascii input meeting default chunksize (' + (j + 1) + '/' + inputvalues.encrypt.good.data_nonascii_32.length + ')', + function (done) { + let input = inputvalues.encrypt.good.data_nonascii_32[j]; + expect(input).to.have.length(32); + let prm = Gpgmejs.init(); prm.then(function (context) { + let data = ''; + for (let i=0; i < 34 * 1024; i++){ + data += input; + } context.encrypt(data, inputvalues.encrypt.good.fingerprint).then( - function (answer){ - expect(answer).to.not.be.empty; - expect(answer.data).to.be.a("string"); - expect(answer.data).to.include( - 'BEGIN PGP MESSAGE'); - expect(answer.data).to.include( - 'END PGP MESSAGE'); - context.decrypt(answer.data).then( - function(result){ - expect(result).to.not.be.empty; - expect(result.data).to.be.a('string'); - expect(result.data).to.equal(data); - context.connection.disconnect(); - done(); - }); - }); - }); - }).timeout(5000); - }; -*/ - -/** still fails - it('Successful encrypt 0.8 MB Uint8Array', function (done) { - let prm = Gpgmejs.init(); - let data = bigUint8(0.8); - prm.then(function (context) { - context.encrypt(data, - inputvalues.encrypt.good.fingerprint).then( - function (answer){ + function (answer) { expect(answer).to.not.be.empty; expect(answer.data).to.be.a("string"); expect(answer.data).to.include( @@ -201,38 +87,39 @@ describe('Encryption and Decryption', function () { expect(answer.data).to.include( 'END PGP MESSAGE'); context.decrypt(answer.data).then( - function(result){ + function (result) { expect(result).to.not.be.empty; expect(result.data).to.be.a('string'); expect(result.data).to.equal(data); - done(); - }); - }); - }); - }).timeout(5000); -*/ - - it('Decrypt simple non-ascii', - function (done) { - let prm = Gpgmejs.init(); - prm.then(function (context) { - data = encryptedData; - context.decrypt(data).then( - function (result) { - expect(result).to.not.be.empty; - expect(result.data).to.be.a('string'); - expect(result.data).to.equal(inputvalues.encrypt.good.data_nonascii); - context.encrypt(inputvalues.encrypt.good.data_nonascii, inputvalues.encrypt.good.fingerprint).then( - function(result){ - context.decrypt(result.data).then(function(answer){ - expect(answer.data).to.equal(inputvalues.encrypt.good.data_nonascii); context.connection.disconnect(); done(); }); + }); + }); + }).timeout(5000); + }; + + it('Encrypt-decrypt simple non-ascii', function (done) { + //FAILS TODO: Check newline at the end + let prm = Gpgmejs.init(); + prm.then(function (context) { + data = encryptedData; + context.decrypt(data).then( + function (result) { + expect(result).to.not.be.empty; + expect(result.data).to.be.a('string'); + expect(result.data).to.equal(inputvalues.encrypt.good.data_nonascii); + context.encrypt(inputvalues.encrypt.good.data_nonascii, inputvalues.encrypt.good.fingerprint).then( + function(result){ + context.decrypt(result.data).then(function(answer){ + expect(answer.data).to.equal('??u?erste ?? f?r ?oquis at h?me! ?????? ????'); + context.connection.disconnect(); + done(); }); }); + }); - }); - }).timeout(8000); + }); + }).timeout(6000); -}); \ No newline at end of file +}); diff --git a/lang/js/BrowserTestExtension/tests/encryptTest.js b/lang/js/BrowserTestExtension/tests/encryptTest.js index 2e95151..5ef68a3 100644 --- a/lang/js/BrowserTestExtension/tests/encryptTest.js +++ b/lang/js/BrowserTestExtension/tests/encryptTest.js @@ -49,7 +49,7 @@ describe('Encryption', function () { done(); }); }); - }).timeout(5000); + }).timeout(10000); /** it('Successful encrypt 20 MB', function (done) { diff --git a/lang/js/BrowserTestExtension/tests/inputvalues.js b/lang/js/BrowserTestExtension/tests/inputvalues.js index bc8c97b..e23b778 100644 --- a/lang/js/BrowserTestExtension/tests/inputvalues.js +++ b/lang/js/BrowserTestExtension/tests/inputvalues.js @@ -23,7 +23,23 @@ var inputvalues = { good:{ data : 'Hello World.', fingerprint : 'D41735B91236FDB882048C5A2301635EEFF0CB05', - data_nonascii: '??u?erste ?? f?r ?oquis at h?me! ?????? ????\n' + data_nonascii: '??u?erste ?? f?r ?oquis at h?me! ?????? ????', + data_nonascii_32: [ + 'K?K?K?K?K?K?K?K?K?K?K?K?K?K?K?K?', + '????????????????????????????????', //fails result has 3 chars more + '????????????????????????????????', //fails 3 chars + '????????????????????????????????', + '??????????????????????A?????????', //fails 2 chars + '???????????????????????A????????', //is okay if 2 chunksizes. + '????????????????????????????????', + '?AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA?', + '?AAAA?AAAAAAAAAAAAAAAAAAAAAAAAA?', + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA??', + '?AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA?', + '?AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA?', + '?||||||||||||||||||||||||||||||?', + '????????????????????????????????' + ] }, bad: { fingerprint: 'CDC3A2B2860625CCBFC5AAAAAC6D1B604967FC4A' @@ -56,7 +72,7 @@ function bigUint8(megabytes){ function bigBoringString(megabytes){ let maxlength = 1024 * 1024 * megabytes; let string = ''; - let chars = ' ?0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; + let chars = ' 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; for (let i= 0; i < maxlength; i++){ string = string + chars[Math.floor(Math.random() * chars.length)]; } @@ -101,4 +117,101 @@ var encryptedData = 'isGL7jOlDCBKwep67ted0cTRPLWkk3NSuLIlvD5xs6L4z3rPu92gXYgbZoMMdP0N\n' + 'kSAQYOHplfA7YJWkrlRm\n' + '=zap6\n' + - '-----END PGP MESSAGE-----\n'; \ No newline at end of file + '-----END PGP MESSAGE-----\n'; +var encryptedBroken = '-----BEGIN PGP MESSAGE-----\n' + +'\n' + +'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\n' + +'E14StpggdK8=\n' + +'=enm3\n' + +'-----END PGP MESSAGE-----\n'; \ No newline at end of file diff --git a/lang/js/BrowserTestExtension/tests/longRunningTests.js b/lang/js/BrowserTestExtension/tests/longRunningTests.js new file mode 100644 index 0000000..0f32ca9 --- /dev/null +++ b/lang/js/BrowserTestExtension/tests/longRunningTests.js @@ -0,0 +1,53 @@ +describe('Long running Encryption/Decryption', function () { + for (let i=0; i< 100; i++) { + it('Successful encrypt/decrypt completely random data ' + (i+1) + '/100', function (done) { + let prm = Gpgmejs.init(); + let data = bigString(2); + prm.then(function (context) { + context.encrypt(data, + inputvalues.encrypt.good.fingerprint).then( + function (answer){ + expect(answer).to.not.be.empty; + expect(answer.data).to.be.a("string"); + expect(answer.data).to.include( + 'BEGIN PGP MESSAGE'); + expect(answer.data).to.include( + 'END PGP MESSAGE'); + context.decrypt(answer.data).then( + function(result){ + expect(result).to.not.be.empty; + expect(result.data).to.be.a('string'); + expect(result.data).to.equal(data); + context.connection.disconnect(); + done(); + }); + }); + }); + }).timeout(5000); + }; + + it('Successful encrypt 1 MB Uint8Array', function (done) { + let prm = Gpgmejs.init(); + let data = bigUint8(1); + prm.then(function (context) { + context.encrypt(data, + inputvalues.encrypt.good.fingerprint).then( + function (answer){ + expect(answer).to.not.be.empty; + expect(answer.data).to.be.a("string"); + expect(answer.data).to.include( + 'BEGIN PGP MESSAGE'); + expect(answer.data).to.include( + 'END PGP MESSAGE'); + context.decrypt(answer.data).then( + function(result){ + expect(result).to.not.be.empty; + expect(result.data).to.be.a('string'); + expect(result.data).to.equal(data); + done(); + }); + }); + }); + }).timeout(5000); + +}); diff --git a/lang/js/BrowserTestExtension/unittests.html b/lang/js/BrowserTestExtension/unittests.html new file mode 100644 index 0000000..6f7da3f --- /dev/null +++ b/lang/js/BrowserTestExtension/unittests.html @@ -0,0 +1,17 @@ + + + + + + + + +

Unit tests

+
+ + + + + + + diff --git a/lang/js/src/Connection.js b/lang/js/src/Connection.js index 2c8792d..64621f6 100644 --- a/lang/js/src/Connection.js +++ b/lang/js/src/Connection.js @@ -181,7 +181,8 @@ class Answer{ if (!this._response.hasOwnProperty(key)){ this._response[key] = ''; } - this._response[key] = this._response[key].concat(msg[key]); + // console.log(msg[key]); + this._response[key] += msg[key]; } //params should not change through the message else if (poa.params.indexOf(key) >= 0){ @@ -214,6 +215,22 @@ class Answer{ * TODO: does not care yet if completed. */ get message(){ + let keys = Object.keys(this._response); + let poa = permittedOperations[this.operation].answer; + for (let i=0; i < keys.length; i++) { + if (poa.data.indexOf(keys[i]) >= 0){ + if (this._response.base64 == true){ + let respatob = atob(this._response[keys[i]]); + + let result = decodeURIComponent( + respatob.split('').map(function(c) { + return '%' + + ('00' + c.charCodeAt(0).toString(16)).slice(-2); + }).join('')); + this._response[keys[i]] = result; + } + } + } return this._response; } } commit 5f5bf024a83625b8f8bac4779b1c2236637c23e0 Merge: cca4062 e54b110 Author: Maximilian Krambach Date: Wed May 9 16:55:50 2018 +0200 Merge branch 'master' into javascript-binding ----------------------------------------------------------------------- Summary of changes: lang/js/BrowserTestExtension/browsertest.html | 3 - lang/js/BrowserTestExtension/index.html | 40 +++++ .../{browsertest.html => longTests.html} | 6 +- lang/js/BrowserTestExtension/popup.js | 2 +- lang/js/BrowserTestExtension/runbrowsertest.js | 1 - .../{runbrowsertest.js => rununittests.js} | 3 +- .../tests/encryptDecryptTest.js | 191 +++++---------------- lang/js/BrowserTestExtension/tests/encryptTest.js | 2 +- lang/js/BrowserTestExtension/tests/inputvalues.js | 119 ++++++++++++- .../BrowserTestExtension/tests/longRunningTests.js | 53 ++++++ lang/js/BrowserTestExtension/unittests.html | 17 ++ lang/js/src/Connection.js | 19 +- lang/python/tests/t-callbacks.py | 2 +- lang/qt/Makefile.am | 8 +- lang/qt/src/qgpgmenewcryptoconfig.cpp | 6 +- src/engine-gpgsm.c | 11 +- src/gpgme-json.c | 22 ++- 17 files changed, 322 insertions(+), 183 deletions(-) create mode 100644 lang/js/BrowserTestExtension/index.html copy lang/js/BrowserTestExtension/{browsertest.html => longTests.html} (78%) copy lang/js/BrowserTestExtension/{runbrowsertest.js => rununittests.js} (99%) create mode 100644 lang/js/BrowserTestExtension/tests/longRunningTests.js create mode 100644 lang/js/BrowserTestExtension/unittests.html hooks/post-receive -- GnuPG Made Easy http://git.gnupg.org From cvs at cvs.gnupg.org Fri May 11 09:07:43 2018 From: cvs at cvs.gnupg.org (by Andre Heinecke) Date: Fri, 11 May 2018 09:07:43 +0200 Subject: [git] GpgOL - branch, master, updated. gpgol-2.1.1-6-g8539f6b Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GnuPG extension for MS Outlook". The branch, master has been updated via 8539f6bc595d5539d2a528fe5349c8749549ac68 (commit) from aed389f9ce639db48dcfc84cb495a2b180496207 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 8539f6bc595d5539d2a528fe5349c8749549ac68 Author: Andre Heinecke Date: Fri May 11 09:05:09 2018 +0200 Stop prasing on non whitepspace before PGP Message * src/mapihelp.cpp (get_msgcls_from_pgp_lines): Again break on non whitespace before message marker. -- The problem here is that for inline messages a full quote in the response could cause GpgOL to use the full quote as the message instead of the reply. Outlook itself formats its quotes in a way that would cause this. While this might break again MTA's which insert stuff above a Message we have to do this. GnuPG-Bug-Id: T3964 diff --git a/src/mapihelp.cpp b/src/mapihelp.cpp index 16e45eb..f5ec627 100644 --- a/src/mapihelp.cpp +++ b/src/mapihelp.cpp @@ -744,14 +744,19 @@ get_msgcls_from_pgp_lines (LPMESSAGE message, bool *r_nobody = nullptr) msgcls = xstrdup ("IPM.Note.GpgOL.PGPMessage"); break; } - -#if 0 - This might be too strict for some broken implementations. Lets - look anywhere in the first 1k. else if (!trailing_ws_p (p)) - break; /* Text before the PGP message - don't take this as a - proper message. */ -#endif + { + /* We have text before the message. In that case we need + to break because some bad MUA's like Outlook do not insert + quote characters before a replied to message. In that case + the reply to an inline Mail from an Outlook without GpgOL + enabled could cause the behavior that we would detect + the original message. + */ + log_debug ("%s:%s: Detected non whitespace %c before a PGP Marker", + SRCNAME, __func__, *p); + break; + } } ----------------------------------------------------------------------- Summary of changes: src/mapihelp.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) hooks/post-receive -- GnuPG extension for MS Outlook http://git.gnupg.org From cvs at cvs.gnupg.org Sat May 12 06:01:37 2018 From: cvs at cvs.gnupg.org (by Ben McGinnes) Date: Sat, 12 May 2018 06:01:37 +0200 Subject: [git] gnupg-doc - branch, ben/w3c-as2, created. c8a74117ce7a28a4393aff79035405f497a35a24 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GnuPG website and other docs". The branch, ben/w3c-as2 has been created at c8a74117ce7a28a4393aff79035405f497a35a24 (commit) - Log ----------------------------------------------------------------- commit c8a74117ce7a28a4393aff79035405f497a35a24 Author: Ben McGinnes Date: Sat May 12 13:52:39 2018 +1000 docs: OpenPGP over Activity Streams 2.0 * First draft of the extension to W3C's Activity Streams 2.0 and ActivityPub protocols in the form emailed to the original W3C team members who developed those two protocols. * Putting it here because it should be added somewhere until a more permanent home is found for it and in the unlikely event I get hit by a bus it should still be of benefit to the world. diff --git a/misc/w3c/as2/OpenPGPoverActivityStreams.org b/misc/w3c/as2/OpenPGPoverActivityStreams.org new file mode 100644 index 0000000..dfaf9e0 --- /dev/null +++ b/misc/w3c/as2/OpenPGPoverActivityStreams.org @@ -0,0 +1,1266 @@ +#+TITLE: Active Cryptography: OpenPGP over Activity Streams 2.0 +#+STARTUP: showall +#+LATEX_COMPILER: xelatex +#+LATEX_CLASS: article +#+LATEX_CLASS_OPTIONS: [12pt] +#+LATEX_HEADER: \usepackage{xltxtra} +#+LATEX_HEADER: \usepackage[margin=1in]{geometry} +#+LATEX_HEADER: \setmainfont[Ligatures={Common}]{Times New Roman} +#+LATEX_HEADER: \author{Ben McGinnes } + + +* Introduction + :PROPERTIES: + :CUSTOM_ID: intro + :END: + + | Version: | 0.0.1-draft-001 | + | Author: | Ben McGinnes | + | Author GPG Key: | DB4724E6FA4286C92B4E55C4321E4E2373590E5D | + | Language: | Australian English, British English | + | xml:lang: | en-AU, en-GB, en | + + This document provides a specification for using OpenPGP + cryptography with the Activity Streams 2.0 transport method. It was + devised with particular attention towards providing end-user + encryption and verification on federated ActivityPub based instances + (e.g. Mastodon and Pleroma). + + This proposal is not an official part of the W3C's protocols, but is + offered as an optional means of addressing some of the security + issues identified as lacking or missing in those protocols. As such + it is offered under the same terms as any [[https://www.ietf.org/][IETF]] or [[https://www.w3.org][W3 Consortium]] + standards or proposals as free for any use. Example code, however, + may be released under the same terms as the GnuPG Project or some + other license as relevant. Example code will be provided separately + from this document. + + +** Motivation + :PROPERTIES: + :CUSTOM_ID: intro-motive + :END: + + The current Presidential Administration in the USA has diverged + considerably from the policies of his predecessors with recent + legislative and regulatory changes which are set to enable a far + greater implementation of authoritarian policies and agendas, as + well as enabling those policies to be enforced beyond the territory + of the United States of America. This sets a dangerous precedent + with regards to the freedom of all people around the globe to + communicate freely and privately, particularly when they may become + subject to matters which are entirely legal where they live, but + which the United States legislates against. + + The legislative and regulatory changes in the United States of most + concern to the rest of the world at the present time are: the + removal of Net Neutrality provisions by the FCC, the CLOUD Act and + the SESTA/FOSTA Act. The latter being the attempt to enforce + American laws regarding adult content, primarily of a sexual + nature, globally. They also remove the ?safe harbour? provisions + which previously permitted hosting providers to ignore what their + customers were doing, in turn making those providers tools of the + state who must police the actions of end users and actively censor + them. + + +** Approach + :PROPERTIES: + :CUSTOM_ID: intro-approach + :END: + + Over the course of the last decade or a little more, a great deal + of communication online has shifted towards using social media + networks. Email is still good for many things, but it is not good + for everything and various types of social networks fill that need. + + Modifying the underlying protocols or specifications of proprietary + networks, such as Twitter and Facebook, is generally not possible. + It is also clear that these networks will act against some or even + all of their own user base in order to achieve the goals of those + running the companies in question. + + In the case of Facebook that is in the form of surveillance of + large populations and subsequent manipulation of them. In the case + of Twitter it is in the form of banning those who vehemently oppose + Nazism or who discuss or promote adult entertainment of various + types, primarily pornography and sex work, regardless of the + jurisdiction to which the end user is actually subject. + + Open standards and protocols, however, can be leveraged freely and + as necessary. This is what Phil Zimmermann did back in 1991 when + he released the first version of Pretty Good Privacy for use with + Email, USENET and, very likely, FidoNet (or FidoNet style) BBS + networks. The same approach may be utilised now with social + networks which themselves provide an open specification and where + that specification provides the means for extending or advancing + itself. + + There is clearly grounds for social network users to have access to + the tools to send and receive end-to-end encrypted private messages + via their social network accounts and identities. Likewise there + is a need for end users to be able to prove, should they wish to do + so, that a message was not modified in transit; either by their own + server of another within the federated networks in use. + + This current proposal applies to the W3 Consortium's [[https://www.w3.org/TR/activitystreams-core/][Activity + Streams 2.0]] and [[https://www.w3.org/TR/activitypub/][ActivityPub]] protocols; the latter being based upon + the former. + + +** Cryptographic Implementation Choice + :PROPERTIES: + :CUSTOM_ID: intro-crypto-choice + :END: + + The cryptographic choice with regards to the GnuPG Project was + limited to the two engines which GnuPG currently supports: OpenPGP + and S/MIME. Since the intended outcome of this proposal is to + provide a means of securing or preventing content manipulation to + end users directly, the OpenPGP model was selected. + + It would, however, be possible to switch the security focus to the + server level in order to utilise S/MIME or some future advancement + may necessitate or simply favour utilising a different + cryptographic implementation or method. As a consequence this + proposal is designed to more easily enable swapping one method for + another. + + Note that this is separate and in addition to the use of a PEM key + by ActivityPub servers for each of their users. In those cases the + private key is generated by the ActivityPub server when the user + account is created. As a consequence it is inherently flawed from + a user security perspective. It does, however, move the complexity + out of the user level and back to the server level. Whereas this + proposal does not. + + +** Definitions + :PROPERTIES: + :CUSTOM_ID: intro-definitions + :END: + + *IMPORTANT:* Everything in this proposal is optional. The + definitions listed here are within the context of the proposal + itself. + + This document uses the terms defined in [[https://tools.ietf.org/html/rfc4880][RFC 4880]] and in the same + way. + + The key words: "*must*", "*must not*", "*required*", "*shall*", + "*shall not*", "*should*", "*should not*", "*recommended*", + "*may*", and "*optional*" to be interpreted as defined in [[https://tools.ietf.org/html/rfc2119][RFC 2119]]. + + The following terms have these definitions: + + - *AP* means ActivityPub. + - *AS* means Activity Streams. + - *AS2* means Activity Streams 2.0. + - *AC* means Active Cryptography or Activity Cryptography; the + working title for the protocol extension. + + The document also draws on the same RFCs cited by both the Activity + Streams [[https://www.w3.org/TR/activitystreams-core/][core]] and [[https://www.w3.org/TR/activitystreams-vocabulary/][vocabulary]] documents, as well as the [[https://www.w3.org/TR/activitypub/][ActivityPub]] + protocol definition. + + +* Cryptographic Activities + :PROPERTIES: + :CUSTOM_ID: crypto + :END: + + This section introduces the new objects, collections, activity types + and properties necessary to implement OpenPGP functions with + Activity Streams 2.0 and ActivityPub. + + +** Cryptographic protocol + :PROPERTIES: + :CUSTOM_ID: crypto-protocol + :END: + + In order to handle any situations in which servers and/or clients + may implement multiple cryptographic protocols, a property *must* be + set for any cryptographic object or activity. + + #+begin_src javascript + { "cryptographic-protocol": "openpgp" } + #+end_src + + Where the relevant JSON data is already clearly part of a + cryptographic object or activity this proprty *may* be defined as + =protocol=. + + #+begin_src javascript + { "protocol": "openpgp" } + #+end_src + + +** MIME and file types + :PROPERTIES: + :CUSTOM_ID: crypto-mime-types + :END: + + The media or content types utilised are adapted from the PGP/MIME + types defined in [[https://tools.ietf.org/html/rfc2015][RFC 2015]] and [[https://tools.ietf.org/html/rfc3156][RFC 3156]]. Specifically this covers + the =pgp-keys=, =application/pgp-encrypted= and + =application/pgp-signed= MIME types. + + In addition to these an implementation *may* utilise + =application/pgp-encrypted+activitystreams= and *may* utilise + =application/pgp-signed+activitystreams= to indicate an Activity + Stream object (i.e. an =application/activity+json= object) is + either entirely affected by the cryptographic function or the + object is OpenPGP data which contains an ActivityPub or Activity + Strams object or activity type which will need to be processed upon + decryption or signature validation. + + +** Keys + :PROPERTIES: + :CUSTOM_ID: crypto-keys + :END: + + Unlike the PEM key included with ActivityPub instances, OpenPGP + keys are always intended to be generated by the end user(s) + controlling a given actor's account and not controlled or accessed + by the server, even when that server is controlled by a single + user. + + There are also valid reasons or use cases for assigning multiple + keys to an actor or using the same key with multiple actors. This + is particularly the case if proof of OpenPGP key control was + adopted as an alternative means of providing authentication between + a client and server, in addition to OAuth methods. + + Though there is already a well established network of public + keyservers, the SKS keyserver pool, and from GPG 2.1 there is an + alternative method of retrieving keys associated with a domain name + built-in; there are also valid reasons for not using these methods + of providing access to a public key used with activities. + + Likewise, there is a need for serving key information with actor + information and referencing it with objects and activities where + necessary. This would effectively turn an ActivityPub instance + into a limited public keyserver for the keys assigned to actors + under its purview, though it may not maintain or serve copies of + those keys containing full web-of-trust signatures, particularly if + there are size constraints or bandwidth limitations.[fn:1] + + +*** Public keys and Actors + :PROPERTIES: + :CUSTOM_ID: crypto-actor + :END: + + In order to enable access to cryptographic information controlled + at the user level we need to add an optional property to actors; + one where the absence of it equates to a value of =None= or + =null=. + + Since it is theoretically possible for multiple cryptographic + protocols to be in use, in addition to the Linked Data and HTTP + Signatures referenced in the ActivityPub specification, this + optional property *must* contain an array of JSON data listing the + =protocol= or =cryptographic-protocol=, the =cryptoContext= for a + URI of a collection containing more relevant data, the + =publicKeys= for an additional URI just for checking public key + data and *may* contain a =primaryKeyID= referencing the preferred + key ID used with the actor. + + Here is an example using the same actor example in the ActivityPub + specification. Note that the key ID or fingerprint used here does + not exist on the keyservers and is really just a SHA1 sum of the + actor's name. + + #+begin_src javascript + { + "@context": ["https://www.w3.org/ns/activitystreams", + {"@language": "ja"}], + "type": "Person", + "id": "https://kenzoishii.example.com/", + "following": "https://kenzoishii.example.com/following.json", + "followers": "https://kenzoishii.example.com/followers.json", + "liked": "https://kenzoishii.example.com/liked.json", + "inbox": "https://kenzoishii.example.com/inbox.json", + "outbox": "https://kenzoishii.example.com/feed.json", + "preferredUsername": "kenzoishii", + "name": "????", + "summary": "??????????", + "icon": [ + "https://kenzoishii.example.com/image/165987aklre4" + ], + "cryptoProtocols": [ { + "protocol": "openpgp", + "cryptoContext": "https://kenzoishii.example.com/openpgp.json", + "publicKeys": "https://kenzoishii.example.com/openpgpkeys.json", + "primaryKeyID": "3A1222F4BE79DB2AF069FADCF507B8E7E6EF68BF" + } ] + } + #+end_src + + A slight variation demonstrating how multiple cryptographic + implementations could be utilised along with not specifying a + primary key ID may appear more like this: + + #+begin_src javascript + { + "@context": ["https://www.w3.org/ns/activitystreams", + {"@language": "ja"}], + "type": "Person", + "id": "https://kenzoishii.example.com/", + "following": "https://kenzoishii.example.com/following.json", + "followers": "https://kenzoishii.example.com/followers.json", + "liked": "https://kenzoishii.example.com/liked.json", + "inbox": "https://kenzoishii.example.com/inbox.json", + "outbox": "https://kenzoishii.example.com/feed.json", + "preferredUsername": "kenzoishii", + "name": "????", + "summary": "??????????", + "icon": [ + "https://kenzoishii.example.com/image/165987aklre4" + ], + "cryptoProtocols": [ { + "protocol": "openpgp", + "cryptoContext": "https://kenzoishii.example.com/openpgp.json", + "publicKeys": "https://kenzoishii.example.com/openpgpkeys.json", + "primaryKeyID": "3A1222F4BE79DB2AF069FADCF507B8E7E6EF68BF" + }, + { + "protocol": "smime", + "cryptoContext": "https://kenzoishii.example.com/smime.json", + "publicKeys": "https://kenzoishii.example.com/smimekeys.json" + } ] + } + #+end_src + + As the example suggests, this would enable utilising both a client + controlled cryptographic method in the form of OpenPGP and a + server controlled or authorised cryptographic method in the form + of S/MIME.[fn:2] + + +*** Cryptography Context + :PROPERTIES: + :CUSTOM_ID: crypto-context + :END: + + The cryptography contexts referenced from the actor define all the + ways in which any key or keys are used in relation to actions and + objects by or for that actor. First by identifying the keys and + subkeys and then by defining which type of objects they're used in + relation to. As well as whether the account is configured to + always use them, as *may* be the case with signatures or not. + + The Cryptography Context is a collection of nested collections and + objects dealing with each key or subkey type and the ways they're + used in regards to activities or other objects. + + In the following examples I use my current key in conjunction with + an imaginary (not-yet-existing) ActivityPub instance on my own + domain, =snuffy.adversary.org=.[fn:3] + + The =keys= item *must* contain a =keyinfo= item for each public + key associated with the actor account. + + The =keyinfo= item *must* contain =keyIDs= data for the primary key + and all enabled subkeys of the key. + + The =keyinfo= item *must* contain a =type= property which + indicates both the key's cryptographic protocol and version number + of that protocol. Most current OpenPGP keys are version 4 keys. + + The =keyinfo= item *may* contain =keyIDs= data for /revoked/ or + /disabled/ keys previously used with the actor or revoked subkeys of + an active key. Where this data is included the =keyID= item + *must* contain an =enabled= property with a boolean value of + /*True*/ or /*False*/. Additionally a =revoked= property *may* be + included, also with a boolean value of /*True*/ or /*False*/. + + Where the =enabled= and =revoked= properties are not included, the + default values are assumed to be that =enabled= is /*True*/ and + =revoked= is /*False*/. + + The =keyinfo= item *may* contain =userIDs= data for some or all of + the userIDs listed on the key itself. + + The =keyinfo= item *may* contain a =keyfiles= property with direct + links to either or both of the GPG or PGP binary key formats or + the ASCII armoured key file format. + + The =keyinfo= item *must* contain the =publicKeys= property pointing + to a JSON encoded URL containing at least the minimised version of + the public key. + + A =keyID= item *must* contain an =id= property of the full key ID + which is the hexadecimal key fingerprint without spaces. The =id= + property *must not* be either the short or long key ID formats. + + A =keyID= item *must* contain a =type= property with a value + indicating whether the key is the /*primary*/ (certification) key + or a /*subkey*/. + + A =keyID= item *may* contain a =fingerprint= property with the + full key ID in a human readable format. This is the finterprint + format which most OpenPGP users will be familiar with and normally + presents the fingerprint with spaces between hexadecimal groupings + of four characters each. + + A =keyID= item *must* contain an =algorithm= property with a value + indicating which asymmetric cryptographic algorithm *or* which + elliptic curve algorithm it uses. + + A =keyID= item *must* contain a =size= property with an integer + value of the bit size of the key or subkey. + + A =keyID= item *must* contain properties for each of the four + capabilities a key or subkey may possess: =certification=, + =encryption=, =signing= and =authentication=. The values for each + property are boolean strings; /*True*/ or /*False*/. + + A =keyID= item *must* contain a =timestamp= property with an + integer value of the number of seconds since the epoch since the + key or subkey was last modified. This will usually be the + timestamp of the key's creation, but may indicate some other + modification such as changing an expiration date or revoking the + key or subkey. + + The remaining items address the three basic functions for which + OpenPGP keys can be used with Activity Streams: signing, + encryption and authentication. In addition to those three + functions and policies, additional use case policies *may* be + appended: refreshing a key from the keyservers, encrypting email + notifications regarding activities to the relevant email address + for the actor account.[fn:4] + + Each of these items *must* include a =policy= property which + stipulates whether or not that function is available and the + consistency of that use. Possible policy values are /*must*/, + /*may*/ and /*never*/. Recommended default values are /*may*/ + unless the relevant key or subkey type is unavailable, in which + case the correct value is /*never*/. + + If the policy value for an item is either /*must*/ or /*may*/ then + the =authorizedKeyIDs= property *must* include an array with all + full key IDs of the primary key and relevant subkeys to perform + that task. If the policy value is /*never*/ then the + =authorizedKeyIDs= *may* be =None= or =null=. + + #+begin_src javascript + { + "@context": "https://www.w3.org/ns/activitystreams", + "id": "https://snuffy.adversary.org/openpgp.json", + "summary": "OpenPGP use and keys with this stream", + "type": "openpgpCollection", + "cryptographic-protocol": "openpgp", + "totalItems": 6, + "items": [ + { + "type": "openpgpKeys", + "totalItems": 1, + "items": [ + { + "id": "keyinfo", + "type": "openpgpKeyV4", + "timestamp": 1514332912, + "lastUpdated": 1524951377, + "keyIDs": [ + { + "id": "DB4724E6FA4286C92B4E55C4321E4E2373590E5D", + "type": "primary", + "fingerprint": "DB47 24E6 FA42 86C9 2B4E 55C4 321E 4E23 7359 0E5D", + "algorithm": "RSA", + "size": 4096, + "certification": True, + "signing": True, + "encryption": False, + "Authentication": False, + "timestamp": 1343480251 + }, + { + "id": "B7F0FE759387430DD0C58BDB7FF2D37135C7553C", + "type": "subkey", + "fingerprint": "B7F0 FE75 9387 430D D0C5 8BDB 7FF2 D371 35C7 553C", + "algorithm": "RSA", + "size": 3072, + "certification": False, + "signing": True, + "encryption": False, + "Authentication": False, + "timestamp": 1343480419 + }, + { + "id": "9CBEF6B7E0DF72CF91009AA5C98BAA1862E4484D", + "type": "subkey", + "fingerprint": "9CBE F6B7 E0DF 72CF 9100 9AA5 C98B AA18 62E4 484D", + "algorithm": "ELG", + "size": 4096, + "certification": False, + "signing": False, + "encryption": True, + "Authentication": False, + "timestamp": 1343480559 + }, + { + "id": "A48B28F39A83E63C55B8F30E48723A7579041EC6", + "type": "subkey", + "fingerprint": "A48B 28F3 9A83 E63C 55B8 F30E 4872 3A75 7904 1EC6", + "algorithm": "DSA", + "size": 3072, + "certification": False, + "signing": True, + "encryption": False, + "Authentication": False + "timestamp": 1514332912 + } + ], + "userIDs": [ + { + "name": "Ben McGinnes", + "comment": None, + "email": "ben#adversary.org" + }, + { + "name": "Ben McGinnes", + "comment": None, + "email": "ben#gnupg.org" + } + ], + "keyfiles": [ + { + "url": "http://www.adversary.org/ben-key.asc", + "Content-Type", "application/pgp-signature", + "summary": "ASCII armored openpgp keyfile, full key" + }, + { + "url": "http://www.adversary.org/ben-key.gpg", + "Content-Type", "application/pgp-keys", + "summary": "Binary openpgp keyfile, full key" + }, + { + "url": "http://www.adversary.org/ben-key-clean.asc", + "Content-Type", "application/pgp-signature", + "summary": "ASCII armored openpgp keyfile, clean key" + }, + { + "url": "http://www.adversary.org/ben-key-clean.gpg", + "Content-Type", "application/pgp-keys", + "summary": "Binary openpgp keyfile, clean key" + }, + { + "url": "http://www.adversary.org/ben-key-min.asc", + "Content-Type", "application/pgp-signature", + "summary": "ASCII armored openpgp keyfile, minimised key" + }, + { + "url": "http://www.adversary.org/ben-key-min.gpg", + "Content-Type", "application/pgp-keys", + "summary": "Binary openpgp keyfile, minimised key" + } ], + "publicKeys": "https://snuffy.adversary.org/openpgpkeys.json" + } + ] + }, + { + "type": "content-signing", + "policy": "May", + "authorizedKeyIDs": [ "DB4724E6FA4286C92B4E55C4321E4E2373590E5D", + "B7F0FE759387430DD0C58BDB7FF2D37135C7553C", + "A48B28F39A83E63C55B8F30E48723A7579041EC6" ] + }, + { + "type": "encryption", + "policy": "May", + "authorizedKeyIDs": [ "DB4724E6FA4286C92B4E55C4321E4E2373590E5D", + "9CBEF6B7E0DF72CF91009AA5C98BAA1862E4484D" ] + }, + { + "type": "authentication", + "policy": "Never", + "authorizedKeyIDs": None + }, + { + "type": "refresh" + "policy": "May", + "authorizedKeyIDs": [ "DB4724E6FA4286C92B4E55C4321E4E2373590E5D" ] + }, + { + "type": "email-encryption", + "policy": "Must", + "authorizedKeyIDs": [ "DB4724E6FA4286C92B4E55C4321E4E2373590E5D", + "9CBEF6B7E0DF72CF91009AA5C98BAA1862E4484D" ] + } + ] + } + #+end_src + + There are numerous ways in which OpenPGP may be leveraged by a + server to provide authentication mechanisms for an actor utilising + either signatures, encrypted tokens to be decrypted and used like + OAuth or even using the authentication subkey type in a manner + similar to TLS or SSH. For this example these possibilities are + disregarded in order to demonstrate how a policy may be set to not + use one possible function. + + A server might also use the public keys in a more traditional + manner for OpenPGP and certain other cryptographic implementations + (e.g. S/MIME) if end users receive email notifications of + activites. In that circumstance the server could, if the public + key had a subkey with the encryption capability and the relevant + matching policy, encrypt those emailed notifications. + + Also note that while default and recommended key generation + stipulates that OpenPGP primary (certification) keys *should not* + have the encryption capability, it is still advisable to include + that primary key ID as authorized for any function granted to any + of its subkeys. The reason being that not every OpenPGP + implementation correctly interprets the relationship between the + primary key and those subkeys (e.g. some of the JavaScript + implementations). By explicitly including the primary as + authorized, even for those tasks for which it does not have the + capability we avoid unnecessary false error reports with certain + OpenPGP implementations. + + If an actor has multiple keys assigned to it, it *should* be + permitted to extend the policy section to provide for different + policies for each key. + + For instance it may be preferred to have one main key which is + always refreshed from the keyservers, but a backup key which is + only updated manually by an end user. The following example + demonstrates how a single type can be expanded to cover multiple + policies. Where there is only one policy, as in the larger + example above it is assumed that the =policies= property has a + value of =1= and *may* be omitted. + + #+begin_src javascript + { + "type": "email-encryption", + "policies": 2, + { + "policy": "Must", + "authorizedKeyIDs": [ "DB4724E6FA4286C92B4E55C4321E4E2373590E5D", + "9CBEF6B7E0DF72CF91009AA5C98BAA1862E4484D" ] + }, + { + "policy": "May": + "authorizedKeyIDs": [ "6468C3737B7B3F396827EC15371AC5BFA04AE313", + "BA212621459C5135409D5F5DDE7D158D34DF2F7F" ] + } + } + #+end_src + + +*** Serving Public Keys + :PROPERTIES: + :CUSTOM_ID: crypto-keyserving + :END: + + The =openpgpKeys.json= file contains a lot of matching data to the + main context file by necessity since both need to include the key + ID data and both will usually include someuser ID data. Both of + which being data about the public key which is available from the + public key itself. The main differences, however, are that the + context file provides the information on the circumstances under + which the public key either can, should or must be used; but does + not include a copy of the public key itself. While the other file + only has data about the key itself and a copy of at least the + minimised key (or keys if there are multiple keys assigned to an + actor or stream). + + #+begin_src javascript + { + "@context": "https://www.w3.org/ns/activitystreams", + "id": "https://snuffy.adversary.org/openpgpkeys.json", + "stream": "https://snuffy.adversary.org/", + "summary": "OpenPGP public keys for this stream.", + "type": "openpgpKeys", + "cryptographic-protocol": "openpgp", + "totalItems": 1, + "items": [ + { + "type": "openpgpKey", + "keyVersion": 4, + "totalItems": 2, + "lastUpdated": 1524951377, + "items": [ + { + "type": "openpgpKeyData", + "timestamp": 1514332912, + "keyIDs": [ + { + "id": "DB4724E6FA4286C92B4E55C4321E4E2373590E5D", + "type": "primary", + "fingerprint": "DB47 24E6 FA42 86C9 2B4E 55C4 321E 4E23 7359 0E5D", + "cipher": "RSA", + "size": 4096, + "certification": True, + "signing": True, + "encryption": False, + "Authentication": False, + "timestamp": 1343480251 + }, + { + "id": "B7F0FE759387430DD0C58BDB7FF2D37135C7553C", + "type": "subkey", + "fingerprint": "B7F0 FE75 9387 430D D0C5 8BDB 7FF2 D371 35C7 553C", + "cipher": "RSA", + "size": 3072, + "certification": False, + "signing": True, + "encryption": False, + "Authentication": False, + "timestamp": 1343480419 + }, + { + "id": "9CBEF6B7E0DF72CF91009AA5C98BAA1862E4484D", + "type": "subkey", + "fingerprint": "9CBE F6B7 E0DF 72CF 9100 9AA5 C98B AA18 62E4 484D", + "cipher": "ELG", + "size": 4096, + "certification": False, + "signing": False, + "encryption": True, + "Authentication": False, + "timestamp": 1343480559 + }, + { + "id": "A48B28F39A83E63C55B8F30E48723A7579041EC6", + "type": "subkey", + "fingerprint": "A48B 28F3 9A83 E63C 55B8 F30E 4872 3A75 7904 1EC6", + "cipher": "DSA", + "size": 3072, + "certification": False, + "signing": True, + "encryption": False, + "Authentication": False, + "timestamp": 1514332912 + } ], + "userIDs": [ + { + "name": "Ben McGinnes", + "comment": None, + "email": "ben#adversary.org" + }, + { + "name": "Ben McGinnes", + "comment": None, + "email": "ben#gnupg.org" + } ], + "keyfiles": [ + { + "url": "http://www.adversary.org/ben-key.asc", + "Content-Type", "application/pgp-signature", + "summary": "ASCII armored openpgp keyfile, full key" + }, + { + "url": "http://www.adversary.org/ben-key.gpg", + "Content-Type", "application/pgp-keys", + "summary": "Binary openpgp keyfile, full key" + }, + { + "url": "http://www.adversary.org/ben-key-clean.asc", + "Content-Type", "application/pgp-signature", + "summary": "ASCII armored openpgp keyfile, clean key" + }, + { + "url": "http://www.adversary.org/ben-key-clean.gpg", + "Content-Type", "application/pgp-keys", + "summary": "Binary openpgp keyfile, clean key" + }, + { + "url": "http://www.adversary.org/ben-key-min.asc", + "Content-Type", "application/pgp-signature", + "summary": "ASCII armored openpgp keyfile, minimised key" + }, + { + "url": "http://www.adversary.org/ben-key-min.gpg", + "Content-Type", "application/pgp-keys", + "summary": "Binary openpgp keyfile, minimised key" + } ] + }, + { + "keyblockASCII": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFAT4bsBEADDsKVDXPxbY88oDXwoNeTQ6KaKxxZ9fE2PGv3dtUBqCX8opuVz\nLaJ19UBuTjiFdgqY+jx2hYBKl026q2btg7Ijhcstbu3HZ3NzxDGk2JGFMUe0WHxC\ndLSf5MuFbCFu17zwCmkT1my9Fcb++0UkwCFnVaKzXB1oS8gnl1Hjr3jbmH8LhUAi\nYXfSIZPbLb+LGxVhEKldUBVlmjbDvbiMFe2c+X2nixA64Vtaqo4q6D78401CQXns\nZ8Z4lA9pXj6sB/4d+zFLtyvSmsq0ccTbmwmw0kk5FYnM7Gn75kCviXQZyT5wt2EE\nDv7zwRgs9Ih009Y4+xyrCt/ks34sWTPFDXhys7h9E0ujCJ65pxOl9pRXo1Mii6SF\n/0a5gHQZwaZ+a2wMoMD7tWw9d1OFNEOKAxv8ZY4Kk4kFp/Nq2Rb9wIVLY8TQhX34\nn9zIEnRwt/BiC9xo/2U+FxKrWTvZieJDNsrETnmRRcwWsfp16RBFUNe6bakSkxZ3\nqbVZesg1qExB9xbfzm00/c4mWr40wfE/UZsJnszzmNUBVtKCJJT5SmwP3xrHAssS\n0SeGhRwqJ+sUCfyjvo8zHCIkRS5CDiJ9Mc8rN3vSJuAf6dxr3NrExrRuMTpO0zaq\n2JPz4CF1Efu1YoggDhSltliRTw+Nhy7JxsIMKWLRimtfjxXDVH18plJ0bQARAQAB\ntCBCZW4gTWNHaW5uZXMgPGJlbkBhZHZlcnNhcnkub3JnPokCfwQTAQoAaQIbAwIe\nAQIXgAIZAQwLCg0JDAgLBwQBAwIHFQoJCAsDAgUWAgMBABYhBNtHJOb6QobJK05V\nxDIeTiNzWQ5dBQJaOjS/JBhoa3BzOi8vaGtwcy5wb29sLnNrcy1rZXlzZXJ2ZXJz\nLm5ldAAKCRAyHk4jc1kOXa/YD/9qnQOd39KlR035Gm9g1lOCCpjiVctZ225LipKb\nPUNtH6aXo4QkFuVaGdkKdHd4YUiAlxD0BGe7WVj8wnRrS0uo4Nt8+wqFmkalXRu/\nExIFuJqPN/UxQpxnQxZRNraohBX4/q/G6OcOcR24lvinbckpaA5cLaaahcaXQgy/\nzGh9vpv15ldbIlFcony4B/cIxBYm9H4AgF4/tl1CK4uC4t7ZeuctXjyPt0XM+fdN\nK9X4xr+Q5LZ+Z8QWMDEzaxLSiZoUxehdlGQprELQDSngjP8PoKcgXzjA9mCxQ7zN\nCuoq+R1OV7fPmtgJxkw5LWvS4CEiIeh37epfBxz0tu0U1iy+Swgzx1cD39ENVoqI\nkaddAy09Vfr8BYWkMFBsLnA7FMCJineaDZV9bu2vBCeGT3zsb5lLUWcJoFqE2gtl\nBKCVBTniMcSCb0O5ztT4R0E/BUfYlVkAJYRUTCytYmilp9Vx6VckFRqECzB34OyD\n3hLCeof/uy4lmU0WSi0bkPgFvyF0jSZvPDwfqPRN9jGRamul9j9UJXgQZWEXsmOr\n/8Lh+Mwhzm5Y3pLns8us8cpEZAl2ykz/aPHYVJ9CvI0a4V9dsil3wod+Ll7iaZHP\nR8CPQHsGDVW7/8tyK2NvXfOhjbnYKWeV7UHrjsd8NmL5UmniwDW/GUnrGGz5z9Ky\nVxq1QrQ7QmVuIE1jR2lubmVzIChiYWNrdXAgZW1haWwgYWRkcmVzcykgPGJlbm1j\nZ2lubmVzQGdtYWlsLmNvbT6JAnwEEwEKAGYCGwMCHgECF4AMCwoNCQwICwcEAQMC\nBxUKCQgLAwIFFgIDAQAWIQTbRyTm+kKGyStOVcQyHk4jc1kOXQUCWjo1HSQYaGtw\nczovL2lwdjQucG9vbC5za3Mta2V5c2VydmVycy5uZXQACgkQMh5OI3NZDl2U6w/8\nDOc2qm3aXr/vcdsLVRTS0cpN9Mz0EOiQVsFqfLHUo90kAUCfVxJu51qILpm7oXwf\nR+MXOSNqLMNQt6/PTjUMedWttVWlHVQTtyRwNSrY+5h2OBJln+VCcatIDLt97pgH\nkeih/PCHFuhOoy08YUutLnara1aSXEQqqvGZcYsZPc1znLgludkIUyfyhbu7umB6\n5BkPEgomBpNUqZ6Z5NNrqQNflI5yNCe0yN93Qfja7YBPafk1OXjumjIP3SjGo9+Z\nkre4A6i88DAxmZQLNsTD4aoqrm5S2NfnoqZXIiJqfAwj+n/LhaT3J8VjheUeOJVx\nMCEzgKaHLTMK0ClcTIpajsPqklBEGzgL8bgU79hbZCOXM7wEz9Kz8YEN2PrblaXp\n5/MfZoTHejfZuwZ1GcsbMCyTumbhLqbwpyHQADPbpgx+gcV587Wty4RzZglIbMu6\nK7r5z6PN32df6chXBS2tdFk2uH8JKHY2eMhCdxZPsPVJn9mOF7EoXLmmpjMqynmj\nsLHD3fFgcZn4DPRoczU+6jfbB29QUsd++plY0j3zhr5iE/+KCwFiDUK3qMgXBbbE\nWSSgnj08AognfdZCslsWrr54WsUD2X5twwfV9iR7JQMs7bq0vfo5zpBTNuskk7N/\nY8gQ/560t4kMdDqIeFtT8cauWcbD6HNfLPF1ara6vrm0LkJlbiBNY0dpbm5lcyA8\nYmVuLm1jZ2lubmVzQHBpcmF0ZXBhcnR5Lm9yZy5hdT6JAnYEEwEKAGACGwMCHgEC\nF4AMCwoNCQwICwcEAQMCBxUKCQgLAwIFFgIDAQAWIQTbRyTm+kKGyStOVcQyHk4j\nc1kOXQUCWjo1WB4YaGtwOi8vcG9vbC5za3Mta2V5c2VydmVycy5uZXQACgkQMh5O\nI3NZDl2qKRAAiZAwfN1WNzx6P9Ts5jtSCt+3zGohZftQ382C5quud6NCKuO9//ql\nuepriQk+5TJ58nXgz8T6BUzDGTTAVh26czsVKw7CEqPHD1psOSFUZV7nW13Z3YJO\ng3oKelg1LfSSKCYlWS1K7eBCT/2Uo/NV/yQfNqLoFYmxQX7u0fzTyLvCfBC6NIrf\nYCQTS77NP3lKpDLLkIyh9pKcOttljKv7uxz1Bpf3ozpfbSKVJaOgm/F8qQQkmtXy\nbu/8N5k5VJCodPFyU7HOiouzUv1hFQeqyZRsdgOILWJbC2r5Y57mMEshgfdBebwU\nYqyjvtRq9DKumQMJwTTGYshqEIgugUpBcqDfl1ZIDtQWyGkr96q5FP6z+48/pFa5\nOEQdFwjL5OPBLOJVLeKoj05XpG5JPPkgxHoQAw+FDZDXN22QYjeZmpOQi4kXb9DK\nAPHnAMk6aDFdVHzPtN/15+jByvhGVb4XttMVhbpOrUwrGOgVaVFVoi/w8mufkF8c\niCCYRSDzJJlC99XLqclISmuhMypzTpEFI5IIConC5oznicXLa8hY8O09HGx0dTr/\nOeteQOg423XIHf0XoERshtZcoACsszQYWGrGG6WCxz9js14VLevfinpSxlTk0MI/\njSuv8ZQACiNO3aDqTo8nzjGR1vATP3lxoJobDdHwCZ9D/0LNFIECDCO0KUJlbiBN\nY0dpbm5lcyA8YmVuLm1jZ2lubmVzQHBpcmF0ZS5vcmcuYXU+iQJbBDABCABFBQJX\naN76Ph0gcGlyYXRlLm9yZy5hdSBubyBsb25nZXIgZm9yd2FyZHMgbWFpbCB0byBw\naXJhdGVwYXJ0eS5vcmcuYXUuAAoJEDIeTiNzWQ5dxKAP/A5KmG+O6g+HK/tCkR3x\ntdLTKwUtF4LGmexzI00cHTNWrrPXKGIsxZM+Bf4+YDls6VhwJFTJBddoE+8WIw4C\nQdtxJp151xkqsZxInjS99ch9OylqcjXTKvHC3myX/cYWnSAXTbS31SgPruUZX5sk\nLTqcd+GfT1S8OzQRwGtPfWVRwvR6IyhoJKG8j6o+OPFfvqEJSTzHkOMYn5pYY6Ji\nIZktthrnKCvStSGNn9QArBKLtZKDuDHHq+dpu8fZngtnrMigwn4a3Sak0lVKh+CU\nUkBPxLzMJYB/4ecKBIGSyY+0NHzEJ58zzNFgk9M/xjhcVzbrzDnBtphtJGeJszu9\nPtwmQIvLbIwa/uDYXKWWYnSE2hMslyGSV0qe/5aOF29PAUXybhy+Bp1iHAjYCMJ7\nGTC8p48wCBVBImyW9DZrZsCAnazewbEZa7mPeUyUpvio+BfGSDm8LnmdzpkMTZi0\nEA+06qvFCOx2IXDBm1Q+HKfsiq4ft5cnCcKNAu5YtKELoh3dT9+smhMJYkqpJJqK\nUWdQZu1abxFok9W4hHEBQHYbBZlVfZydOeCRZs4tqMHxQk3kFYJtalWWnUrfJaG5\nIDrEPju4T5njOh98S3aRwlFCtUDz94rinRRAzgK5+8nB84lkUNrm6VE/nNa5RkC6\nAY0mAyooRF89BpFbHVTJE3REtCtrZXliYXNlLmlvL2FkdmVyc2FyeSA8YWR2ZXJz\nYXJ5QGtleWJhc2UuaW8+iQJ8BBMBCgBmAhsDAh4BAheADAsKDQkMCAsHBAEDAgcV\nCgkICwMCBRYCAwEAFiEE20ck5vpChskrTlXEMh5OI3NZDl0FAlo6NX0kGGh0dHA6\nLy9pcHY0LnBvb2wuc2tzLWtleXNlcnZlcnMubmV0AAoJEDIeTiNzWQ5d1YwP/1CR\nc8GFMNyu3wypeUW/+DTzEhUigtdHx1e+XO+CkouhIHbXHlIoIZjuKOxoaAxaCXo3\nW24HE4N9BCp7NE2aJ2vIWnvzNiv1YDxBnUx/+kUzuLIUSVGNjqhN+bV8MZ4uix+m\nc3WaN36BX6FF7lzavQ6C54cijl0HRc77Scyw/OdlOBtviNCB6Lr7hBHMIEyCUn5E\n4fIyZz1SZDzL9ZZL2IUhSFZAmm6Ff6yqd0uQVLmXyS++lGpuWrIPxtYGPWA0W8GQ\nmQUrOn8EhPz/Z2oVMoAcZfEElRXftf96FG+kCps+WVpSgixzrZIgTQMVDB1SqQRC\n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\nuQ==\n=P42o\n-----END PGP PUBLIC KEY BLOCK-----\n" + } + ] + } + ] + } + #+end_src + + Note the main =timestamp= is the date the key itself was last + modified and will usually match the timestamp of the last subkey + to be added or the timestamp of the most recent self-certification + of a key. Whereas the =lastUpdated= property notes the last time + the copy of the public key was updated on the server serving that + data. Such an update *should* normally be the result of a client + uploading the key to the actor account, but *may* be the result of + the server refreshing key data from the SKS keyserver network. + + +** Signatures + :PROPERTIES: + :CUSTOM_ID: crypto-signing + :END: + + Signing activities as a means of providing assurance that they + genuinely originate with the client and have not been modified in + transi will most likely be one of the most common uses of these + functions. + + There are, however, issues with possibility that a server may + render the content differently to the author's system or sanitize + the content in an unexpected manner. Also the author might use + another content format (e.g. Markdown) which is intended to be + rendered into HTML by the server. + + The solution to this problem is a new object type, the Signed + Note. + + A Signed Note *must* contain a =source= property containing the + original data transmitted, even if the mediaType is =text/html= as + the server may still render it differently. + + A Signed Note *must* contain a =signatures= property which *must* + specify the protocol and *must* include a detached signature file + for the source data. + + The =scope= property specifies which source properties were signed, + usually this should only be the subject and content or just the + content. + + The =signatures= property *may* include a signature for the + expected rendered output. As with the source signature, the + =scope= property specifies which rendered output properties were + signed. + + Since the order will matter with regards to the =scope= a + =signedData= property must be included with with each signature. + + This is followed by the detached =signature= in ASCII armoured + (radix64) format and some additional data pertaining to the key or + subkey used to sign the data as =signingKeyID=, the algorithms used + as the =pubkeyAlgorithm= and the digital =hashAlgorithm=, and the + =timestamp= of the signature. + + It *should* be possible for anyone with the Signed Note object to + take the signedData and the detached signature, save them both to + files and then manually verify them with OpenPGP compliant software + (e.g. =gpg=, or =gpg.exe=). + + #+begin_src javascript + { + "@context": ["https://www.w3.org/ns/activitystreams", + { "@language": "en" } ], + "type": "Signed Note", + "id": "http://snuffy.adversary.org/posted/thing", + "subject": "GnuPG rocks", + "content": "

So, what should be signed, what was written or what was rendered?

", + "source": { + "subject": "GnuPG rocks", + "content": "So, what *should* be signed, what was written or what was rendered?", + "mediaType": "text/markdown" + }, + "signatures": { + "cryptographic-protocol": "openpgp", + { + "scope": { "source": ["subject", "content"] }, + "signedData": "GnuPG rocksSo, what *should* be signed, what was written or what was rendered?", + "signature": "-----BEGIN PGP SIGNATURE-----\n\niHUEABEKAB0WIQSkiyjzmoPmPFW48w5Icjp1eQQexgUCWuVpjAAKCRBIcjp1eQQe\nxhXcAP0e5qTuD4wO+fyL+0djvoAmZtPAzg4zyf5Tn5dZZVzOhAEA4B1I7ApWHpTr\nIJ0SwT/wy0vc5guSt/gru7SLANnBZGI=\n=fwud\n-----END PGP SIGNATURE-----\n", + "signingKeyID": "A48B28F39A83E63C55B8F30E48723A7579041EC6", + "pubkeyAlgorithm": "DSA", + "hashAlgorithm": "SHA512", + "timestamp": 1524984204 + }, + { + "scope": { "expectedRender": ["subject", "content"] }, + "signedData": "GnuPG rocks

So, what should be signed, what was written or what was rendered?

", + "signature": "-----BEGIN PGP SIGNATURE-----\n\niHUEABEKAB0WIQSkiyjzmoPmPFW48w5Icjp1eQQexgUCWuVsKQAKCRBIcjp1eQQe\nxoYFAP4oOZSYXTAKd673B4PqZQp47kdYxRUfR7tdKBh8qV2YVgEA8m+/foWZO9xy\nm9v3zzeI/BYpGCeKZ7eqe29exQpvKds=\n=FDKU\n-----END PGP SIGNATURE-----\n", + "signingKeyID": "A48B28F39A83E63C55B8F30E48723A7579041EC6", + "pubkeyAlgorithm": "DSA", + "hashAlgorithm": "SHA512", + "timestamp": 1524984204 + } + } + } + #+end_src + + +** Encryption + :PROPERTIES: + :CUSTOM_ID: crypto-encryption + :END: + + Encrypting activity content or content and subjects will meet the + needs of many feature requests on numerous instances. There are, + however, some variations of methods which may be worth examining, + along with issues pertaining to availability of metadata and what + options, if any, exist for providing any measure of forward + secrecy. + + There are multiple issues to be addressed when dealing with + encrypted activities, objects or portions of either. Some of these + issues relate to whether the ciphertext contains additional + embedded JSON data to be interpreted or rendered by the recipient + upon decryption, while others relate more to the addressing or + total number of recipients or how to treat data when not all the + intended recipients have a public ky available. + + Still, one problem it readily solves is in providing end-to-end + encrypted messages between two single actors. + + +*** Encrypted Private Messages + :PROPERTIES: + :CUSTOM_ID: crypto-encryption-privmsg + :END: + + There are essentially two methods of sending an encrypted private + message: one in which the encrypted content is just the message + being sent, which *may* contain content or markup intended to be + parsed or rendered at the recipient's end; and the other being + when the encrypted content contains embedded JSON data matching + the Activity Streams 2.0 specification and possibly the + ActivityPub specificationto be interpreted by software at the + recipient's end. + + Regardless of which it is, the sending of it requires another new + AP object, the Encrypted Note. + + The Encrypted Note *must* contain an =encrypted= property. + + Thw =encrypted= property *may* contain a =subject= property. + + Thw =encrypted= property *must* contain a =content= property in + which then encrypted data is inserted in radix64 ASCII armoured + format. + + Thw =encrypted= property *should* contain a =mediaType= property + with a value of =application/pgp-encrypted= or + =application/pgp-encrypted+activitystreams=. + + Thw =encrypted= property *may* contain a =signingKeyID= property + containing the =id= of the key used to sign the encrypted content, + if any. Alternatively the =signingKeyID= property *may* be an + array of multiple keys or subkeys if more than one key was used to + sign the data. + + Thw =encrypted= property *may* contain a =recipientKeyIDs= + property containing an array of the key IDs to which the encrypted + data has been encrypted. If the recipients have been hidden then + the =recipientKeyIDs= property *may* be excluded or explicitly set + to either =None=, =null=, or /*Hidden*/. + + Thw =encrypted= property *must* contain a =cipher= property with a + value of the symmetric cipher used to encrypt the =content= data. + + Thw =encrypted= property *must* contain an =encryptedAlgorithm= + property containing a value of the asymmetric encryption or + elliptic curve algorithms of the =recipientKeyIDs=. If there + multiple algorithms then this data *must* be included in an + array. This requirement remains even if the =recipientKeyIDs= + property is =None=, =null= or /*Hidden*/. + + Thw =encrypted= property *may* contain a =hash= property with a + value of the hash digest algorithm used to sign the =content= + data, if any. + + Thw =encrypted= property *may* contain a =signingAlgorithm= + property with a value of the digital signature algorithm of the + key used to sign the =content= data. If multiple keys were used + to sign the data and those keys used different signing algorithms + then this *may* be an array containing each algorithm. + + Thw =encrypted= property *should* contain a =timestamp=, except + where enough of the data regarding the encrypted =content= does + not include an actual timestamp. + + The following example is about as simple as it gets. The + =content= is encrypted and signed, in this case simply containing + a small Markdown text file.[fn:5] + + #+begin_src javascript + { + "@context": ["https://www.w3.org/ns/activitystreams", + { "@language": "en-AU" } ], + "type": "Encrypted Note", + "id": "http://snuffy.adversary.org/posted/encrypted-thing", + "to": "http://snuffy.adversary.org/inbox", + "subject": "Secret Message", + "cryptographic-protocol": "openpgp", + "encrypted": { + "subject": "Secret Message", + "content": "-----BEGIN PGP MESSAGE-----\n\n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\nBzIvDuNDNcYV\n=elBL\n-----END PGP MESSAGE-----\n", + "mediaType": "application/pgp-encrypted", + "signingKeyID": "A48B28F39A83E63C55B8F30E48723A7579041EC6", + "recipientKeyIDs": [ "9CBEF6B7E0DF72CF91009AA5C98BAA1862E4484D" ], + "cipher": "TWOFISH", + "encryptionAlgorithm": "ELG", + "hash": "SHA512", + "signingAlgorithm": "DSA", + "timestamp": 1524996957 + } + } + #+end_src + + A more complete and possibly more effective method, however, is in + the following example. Like the preceding one, the Encrypted Note + object contains OpenPGP encrypted data in the =content= property. + A =summary= is optional and *may* indicate that the content is + encrypted if the Encrypted Note is being posted publicly (see next + section). + + The encrypted data, however is an entire ActivityPub object + including source format which may be rendered by a recipient's + software and which *may* include a Signed Note as described above. + + #+begin_src javascript + { + "@context": ["https://www.w3.org/ns/activitystreams", + { "@language": "en-AU" } ], + "type": "Encrypted Note", + "id": "http://snuffy.adversary.org/posted/encrypted-thing", + "to": "http://snuffy.adversary.org/inbox", + "cryptographic-protocol": "openpgp", + "encrypted": { + "content": "-----BEGIN PGP MESSAGE-----\n\n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\nO8rHVVfv5pA7bk3Fqy39QZz2OgR0PExy\n=DCuG\n-----END PGP MESSAGE-----\n", + "mediaType": "application/pgp-encrypted+activitystreams", + "signingKeyID": None, + "recipientKeyIDs": [ "9CBEF6B7E0DF72CF91009AA5C98BAA1862E4484D" ], + "cipher": "TWOFISH", + "encryptionAlgorithm": "ELG", + "timestamp": None + } + } + #+end_src + + This second method of encrypting ActivityPub or Activity Streams + data would enable providing signed information without revealing + publicly which key actually signed the that data except to the + intended recipient(s). + + +*** Encrypted Public Messages + :PROPERTIES: + :CUSTOM_ID: crypto-encryption-pubmsg + :END: + + It would be possible to post an encrypted message publicly, but in + which the recipients' key IDs were hidden using any of the + =hidden-recipient= (=-R=), =hidden-encrypt-to= or =throw-keyids= + options available when using GPG. For such messages the second of + the two options in the previous section is likely to be the most + useful, but it could be used with the first. + + This would enable the use of a public stream of objects and + activities as a ?dead drop? as a means of providing anonymous or + pseudonymous communication with any other party and without + requiring a means by which that party might be directly identified + by others. + + +** Authentication + :PROPERTIES: + :CUSTOM_ID: crypto-auth + :END: + + There are multiple methods by which OpenPGP keys could be employed + to provide authentication services between a client and server, In + particular as an alternative to using passwords or two-factor + authentication when used in conjunction with OAuth tokens for + sessions. + + These methods have the additional advantage of providing a means by + which a remote server could confirm the identity of a user of + another server without requiring the transfer of any sensitive or + secure data between the two servers. For the most part this + advantage stems from confirming a status is signed by the same key + as used on that remote server, but it could also be used to + directly authenticate in order to access any private messages of a + local user intended for that user and in the local user's + ActivityPub outbox. + + +*** Authentication With Signing Keys + :PROPERTIES: + :CUSTOM_ID: crypto-auth-sign + :END: + + Utilising signing keys or subkeys would enable a means of + authentication with a server without requiring an ongoing session + between the client and the server. This could be used to + facilitate a secure update or activity even across an insecure + connection without compromising the security of the account + itself as the server would be able to determine the authenticity + of the activity and any relevant objects by verifying the + signature alone. + + +*** Authentication With Encryption Keys + :PROPERTIES: + :CUSTOM_ID: crypto-auth-encrypt + :END: + + Utilising encryption subkeys would enable a means of establishing + a secure session's token exchange which does not rely on the + transmission of a password, two-factor authentication or other API + key, as is most commonly utilised. Instead the server simply + issues the token for that session in an encrypted format. Since + only an authorised user or client with control of the OpenPGP key + could decrypt the data and obtain the token. + + +*** Authentication With Authentication Keys + :PROPERTIES: + :CUSTOM_ID: crypto-auth-squared + :END: + + OpenPGP authentication keys or subkeys are intended for use with + protocols like SSH or other remote access. In spite of the name + they may be less useful in this use case. Nevertheless, it would + be possible to configure a server to accept connections utilising + an authentication key or subkey to establish an authorised + connection from the client to the server. + + +* Additional Technical Notes + :PROPERTIES: + :CUSTOM_ID: tech + :END: + + +** Data size limitations + :PROPERTIES: + :CUSTOM_ID: tech-size + :END: + + Since the conversion of encrypted binary data in the GnuPG format + to radix64 encoded ASCII text generally adds to the size of the + output data, determined according to both the size of the original + input data and the size of the keys to which that data is + encrypted, the maximum message size *should not* be arbitrarily + limited in the same way that many ActivityPub objects are limited. + The common limitation of five hundred characters per status to be + found with many Mastodon servers, for instance, would severly + hamper the ability to usefully employ any of these options. + + +** Metadata and Forward Secrecy + :PROPERTIES: + :CUSTOM_ID: tech-metadata + :END: + + The nature of ActivityPub and Activity Streams 2.0 data is such + that there is an inherent leakage of metadata with each object and + activity posted to a stream. As a consequence there are certain + limitations on what can or should be concealed. There are, + however, methods of mitigating that leakage. A good example being + the second message encryption method described above. + + Forward secrecy is a little more difficult with a messaging format + like this, even where it appears to be a stream to an end user. + This is due to each object being separate packages in that stream + rather than the data being transmitted as a single encrypted + session originating with the author and ending with the recipient + in real time. Even in those circumstances in which the overall + communication (e.g. a conversation) does occur in real time or near + real time. + + Nevertheless, between using OpenPGP keys with pseudonymous + identifiers linked to the ActivityPub stream end points and + minimising the amount of data revealed by encrypted content, there + are points which can facilitate this process. In many respects + this could be done in a manner not too dissimilar to the use of + anonymous remailers and posts to the old [[nntp://alt.anonymous.messages][alt.anonymous.messages]] + USENET news group. + + +* References + :PROPERTIES: + :CUSTOM_ID: refs + :END: + + TBA. + + +** Normative References + :PROPERTIES: + :CUSTOM_ID: refs-norm + :END: + + +** Non-Normative References + :PROPERTIES: + :CUSTOM_ID: refs-non-norm + :END: + + +** Informative References + :PROPERTIES: + :CUSTOM_ID: refs-inform + :END: + + +* Copyright and Licensing + :PROPERTIES: + :CUSTOM_ID: copyright-and-license + :END: + + +** Copyright (C) The GnuPG Project, 2018 + :PROPERTIES: + :CUSTOM_ID: copyright + :END: + + Copyright ? Benjamin D. McGinnes, 2018. + Copyright ? The GnuPG Project, 2018. + + +** License GPL compatible + :PROPERTIES: + :CUSTOM_ID: license + :END: + + This file is free software; as a special exception the author gives + unlimited permission to copy and/or distribute it, with or without + modifications, as long as this notice is preserved. + + This file is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY, to the extent permitted by law; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. + + +* Footnotes + +[fn:1] As a point of comparison, the author's current public key in +ASCII armoured format with all the web-of-trust signatures included is +approximately 100KB in size, whereas the same key exported in its most +minimal and concise form is approximately 13KB. Most keys will be +smaller than that (the author's key is a 4Kb RSA certification and +signing primary key with a 3Kb RSA signing subkey, a 4Kb El-Gamal +encryption subkey and a 3Kb DSA2 signing subkey). + +[fn:2] Though the GnuPG Project is most well known for implementing +the OpenPGP protocol, it does include support for S/MIME amongst the +cryptographic engines (i.e. =gpgsm= or =gpgsm.exe= on Windows). + +[fn:3] Named after the Woolly Mammoth character in /Sesame Street/, of +course, and who was originally believed to be Big Bird's imaginary +friend. + +[fn:4] Since an actor contact email address may be different from any +of the user IDs listed on the public key, servers should be configured +with their own means of matching key IDs to email addresses. In GnuPG +this is what the =group= option is used for and various MUAs have +their own solutions (e.g. Enigmail's Per-Recipient Record and Mutt's +=crypt-hook=). It is also *recommended* that servers automatically +encrypt such notifications with the =trust model= set to /*always*/, +otherwise the server will need to be configured with its own key which +signs or locally signs all the keys uploaded by clients. + +[fn:5] The session key for the encrypted message in this example is: +10:CAADC2A355B8DFA2798CCC42386544DDE490EBDFA12CFD663197EBAA61460879 + +[fn:6] The session key for the second encrypted message example is: +10:63A611B7B935B654100104F057BBF3B76D725AFCE45AFB83623A9C480DAED732 ----------------------------------------------------------------------- hooks/post-receive -- The GnuPG website and other docs http://git.gnupg.org From cvs at cvs.gnupg.org Sun May 13 13:29:56 2018 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Sun, 13 May 2018 13:29:56 +0200 Subject: [git] GnuPG - branch, STABLE-BRANCH-2-2, updated. gnupg-2.2.7-3-g1ced88e Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, STABLE-BRANCH-2-2 has been updated via 1ced88edf4ce7aeb13f9d962645957ba9fa0d635 (commit) from ed12a1dabaf928e8620fc26ca426c935e1a8a880 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 1ced88edf4ce7aeb13f9d962645957ba9fa0d635 Author: Werner Koch Date: Sun May 13 13:21:57 2018 +0200 doc: Fix URL in NEWS. -- diff --git a/NEWS b/NEWS index 0de8d0b..bf1ca41 100644 --- a/NEWS +++ b/NEWS @@ -38,7 +38,7 @@ Noteworthy changes in version 2.2.7 (2018-05-02) * agent,dirmngr: New sub-command "getenv" for "getinfo" to ease debugging. - See-also: gnupg-announce/2018q2/000422.html + See-also: gnupg-announce/2018q2/000424.html Noteworthy changes in version 2.2.6 (2018-04-09) ----------------------------------------------------------------------- Summary of changes: NEWS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Sun May 13 13:40:02 2018 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Sun, 13 May 2018 13:40:02 +0200 Subject: [git] GnuPG - branch, master, updated. gnupg-2.2.7-123-g68ba4e0 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via 68ba4e0308a99eb595caf7111ac31102f17d63e2 (commit) via 7b7576637ddfb6e426e77a86b05af6d828e585d5 (commit) via 1ced88edf4ce7aeb13f9d962645957ba9fa0d635 (commit) via ed12a1dabaf928e8620fc26ca426c935e1a8a880 (commit) via 2e2ab4b69c324c6e324780bbe73a0d2f8ea86e09 (commit) via d31d149196832ed6b8849017d8bcd0852c6ca96c (commit) via 0afa5e158ada716d65046f1567fa14e7c24d0439 (commit) via 71a6e90649a681487fd2fa5b4e19c46d301c2a4f (commit) via d26363e4f1933781c86cbe87077fbf1b9a2b64d8 (commit) via f7f3043653abe699602f910ddd09c1405675c7f6 (commit) via 007dde93cc3971cb51d08e8c082e172506ae7f80 (commit) via ddfd39e91a532fd31cd0c20c5d4cf9643acc58bd (commit) via 6365338816092845b0e08f25731f8eccc605d042 (commit) via 3bd793256e2e4be52075d50ccf2df70c4a2e1a0f (commit) via a598bbeeafa30f7854230eed212b76d5c5c77f86 (commit) via f9fbfc64e402bd41815a68426f55565fa6d5c726 (commit) via d22506a343cec61b7d1a48c970b63a8458b267ab (commit) via 5789afc840cf79ba2a8cebd9d772ef9c3868c5e9 (commit) via cc66108253c58583d6bad3d1e2da2b004701d0f0 (commit) via bb8894760fe87cf46a42599f11eab7e7c7a8eb71 (commit) via 1de4462974113ac18cf98f903e97cd1127fa842f (commit) via 705d8e9cf0d109005b3441766270c0e584f7847d (commit) via 71903eee89496e3f1d0a24536bced6ff16df6783 (commit) via 460e3812be711bd18195053d74aa736215f21eee (commit) via d2ad715441a960ec1e7584022c18042269436812 (commit) via 41734c2756cf2eb81b71e2b24813319059d16619 (commit) via 7cfb2c929d60d53f918d7b371dade448bc752d30 (commit) via 64c1fddb253061a9773c6c4ed2a9c5a54702d21b (commit) via a44ed3d9a1ad5bd96694f10ea5523c517982017e (commit) via acd6d5ff7436bb7fba171ced3294046a14fb777d (commit) via 21b2e88a7e6c3d7313773c9ffb3e0d1fb2af45df (commit) via a5290dace7f85d66272af3e14f9f2bc43d2a4af8 (commit) via e12475429578add12a53fb2232cb45dc9e2aae1b (commit) via 3b1ee413a65bf566aa8e5f29a5a2cd5a94e66faa (commit) via f747b8f0734338baa1e608b193b213aca2c577e8 (commit) via c31abf84659dbda5503dd9f3aa3449520bcd1b84 (commit) via 40fcddd3a98b778f9f31654adf4c06037e8b8e5d (commit) via 69c3e7acb744e1e5606a4d946e3b948704cfbbae (commit) via 23a714598c247d78cfda46a6dc338b17e17cc194 (commit) via e2bd152a928d79ddfb95fd2f7911c80a1a8d5a21 (commit) via bbb5bfacc0d1f179cfec94fd32fee01a09df0f1d (commit) via 327fece0aed2c9974659c72304f9fd1f461d460c (commit) via bb2680a45ab27427d33861802617211052242a33 (commit) via 789d240cb40ab36406a7c57ad49897e0bafbb41e (commit) from 1793f2c46a1ae8befb4d2046c9f3da6e2c685e43 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 68ba4e0308a99eb595caf7111ac31102f17d63e2 Author: Werner Koch Date: Sun May 13 13:31:19 2018 +0200 doc: Include release info for 2.2.7 -- Signed-off-by: Werner Koch diff --git a/NEWS b/NEWS index d10d52b..48f4fdb 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,41 @@ Noteworthy changes in version 2.3.0 (unreleased) ------------------------------------------------ + Changes also found in 2.2.7: + + * gpg: New option --no-symkey-cache to disable the passphrase cache + for symmetrical en- and decryption. + + * gpg: The ERRSIG status now prints the fingerprint if that is part + of the signature. + + * gpg: Relax emitting of FAILURE status lines + + * gpg: Add a status flag to "sig" lines printed with --list-sigs. + + * gpg: Fix "Too many open files" when using --multifile. [#3951] + + * ssh: Return an error for unknown ssh-agent flags. [#3880] + + * dirmngr: Fix a regression since 2.1.16 which caused corrupted CRL + caches under Windows. [#2448,#3923] + + * dirmngr: Fix a CNAME problem with pools and TLS. Also use a fixed + mapping of keys.gnupg.net to sks-keyservers.net. [#3755] + + * dirmngr: Try resurrecting dead hosts earlier (from 3 to 1.5 hours). + + * dirmngr: Fallback to CRL if no default OCSP responder is configured. + + * dirmngr: Implement CRL fetching via https. Here a redirection to + http is explictly allowed. + + * dirmngr: Make LDAP searching and CRL fetching work under Windows. + This stopped working with 2.1. [#3937] + + * agent,dirmngr: New sub-command "getenv" for "getinfo" to ease + debugging. + Changes also found in 2.2.6: * gpg,gpgsm: New option --request-origin to pretend requests coming @@ -209,6 +244,7 @@ Noteworthy changes in version 2.3.0 (unreleased) Version 2.2.4 (2017-12-20) Version 2.2.5 (2018-02-22) Version 2.2.6 (2018-04-09) + Version 2.2.7 (2018-05-02) Noteworthy changes in version 2.2.0 (2017-08-28) commit 7b7576637ddfb6e426e77a86b05af6d828e585d5 Merge: 1793f2c 1ced88e Author: Werner Koch Date: Sun May 13 13:29:40 2018 +0200 Merge branch 'STABLE-BRANCH-2-2' into master -- Resolved Conflicts: NEWS - removed configure.ac - removed Signed-off-by: Werner Koch diff --cc g10/filter.h index cd177f4,2c1e513..6daf273 --- a/g10/filter.h +++ b/g10/filter.h @@@ -177,17 -140,14 +177,18 @@@ void unarmor_pump_release (Unarm int unarmor_pump (UnarmorPump x, int c); /*-- compress.c --*/ - void push_compress_filter(iobuf_t out,compress_filter_context_t *zfx,int algo); - void push_compress_filter2(iobuf_t out,compress_filter_context_t *zfx, - int algo,int rel); + gpg_error_t push_compress_filter (iobuf_t out, compress_filter_context_t *zfx, + int algo); + gpg_error_t push_compress_filter2 (iobuf_t out,compress_filter_context_t *zfx, + int algo, int rel); /*-- cipher.c --*/ -int cipher_filter( void *opaque, int control, - iobuf_t chain, byte *buf, size_t *ret_len); +int cipher_filter_cfb (void *opaque, int control, + iobuf_t chain, byte *buf, size_t *ret_len); + +/*-- cipher-aead.c --*/ +int cipher_filter_aead (void *opaque, int control, + iobuf_t chain, byte *buf, size_t *ret_len); /*-- textfilter.c --*/ int text_filter( void *opaque, int control, ----------------------------------------------------------------------- Summary of changes: Makefile.am | 75 +- NEWS | 36 + agent/command.c | 18 + build-aux/getswdb.sh | 4 +- build-aux/speedo/w32/inst.nsi | 7 + common/exechelp-w32.c | 2 +- common/miscellaneous.c | 1 + configure.ac | 12 +- dirmngr/certcache.c | 5 + dirmngr/crlcache.c | 7 +- dirmngr/crlfetch.c | 163 +- dirmngr/dirmngr.c | 3 +- dirmngr/dirmngr_ldap.c | 51 +- dirmngr/http-ntbtls.c | 4 +- dirmngr/http.c | 60 +- dirmngr/http.h | 6 +- dirmngr/ks-action.c | 6 +- dirmngr/ks-engine-hkp.c | 6 +- dirmngr/ks-engine-http.c | 41 +- dirmngr/ks-engine.h | 10 +- dirmngr/ldap-wrapper-ce.c | 1 + dirmngr/ldap-wrapper.c | 757 +++++---- dirmngr/ldap.c | 12 +- dirmngr/loadswdb.c | 2 +- dirmngr/server.c | 121 +- doc/DETAILS | 30 +- doc/Makefile.am | 3 +- doc/dirmngr.texi | 7 +- doc/examples/vsnfd.prf | 2 +- doc/gnupg.texi | 6 + doc/gpg.texi | 60 +- doc/trust-values.texi | 47 + g10/card-util.c | 2 +- g10/compress.c | 28 +- g10/filter.h | 7 +- g10/getkey.c | 21 +- g10/gpg.c | 5 +- g10/import.c | 6 +- g10/keydb.h | 8 +- g10/keyedit.c | 2 +- g10/keylist.c | 15 +- g10/mainproc.c | 63 +- g10/options.h | 4 +- g10/packet.h | 2 + g10/passphrase.c | 5 +- g10/pkclist.c | 2 +- g10/revoke.c | 2 +- po/ca.po | 53 +- po/cs.po | 52 +- po/da.po | 61 +- po/de.po | 52 +- po/el.po | 53 +- po/eo.po | 53 +- po/es.po | 3643 +++++++++++++++++------------------------ po/et.po | 53 +- po/fi.po | 53 +- po/fr.po | 54 +- po/gl.po | 53 +- po/hu.po | 53 +- po/id.po | 53 +- po/it.po | 53 +- po/ja.po | 155 +- po/nb.po | 52 +- po/pl.po | 61 +- po/pt.po | 53 +- po/ro.po | 57 +- po/ru.po | 53 +- po/sk.po | 53 +- po/sv.po | 61 +- po/tr.po | 61 +- po/uk.po | 55 +- po/zh_CN.po | 57 +- po/zh_TW.po | 52 +- sm/call-dirmngr.c | 41 +- 74 files changed, 3305 insertions(+), 3582 deletions(-) create mode 100644 doc/trust-values.texi hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Mon May 14 15:20:34 2018 From: cvs at cvs.gnupg.org (by NIIBE Yutaka) Date: Mon, 14 May 2018 15:20:34 +0200 Subject: [git] GnuPG - branch, master, updated. gnupg-2.2.7-124-g49bbbd9 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via 49bbbd9dc5e1d4809e508ff4ab32fa238588917d (commit) from 68ba4e0308a99eb595caf7111ac31102f17d63e2 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 49bbbd9dc5e1d4809e508ff4ab32fa238588917d Author: NIIBE Yutaka Date: Mon May 14 22:18:43 2018 +0900 po: Fix Danish translation. -- Debian-bug-id: 898552 Reported-by: Jonas Smedegaard Signed-off-by: NIIBE Yutaka diff --git a/po/da.po b/po/da.po index c8cd33c..74951b0 100644 --- a/po/da.po +++ b/po/da.po @@ -5065,7 +5065,7 @@ msgstr "tilbagekaldskommentar: " #. q = quit #. msgid "iImMqQsS" -msgstr "iImMqQsS" +msgstr "iIhHaAsS" msgid "No trust value assigned to:\n" msgstr "Ingen tillidsv?rdi tildelt til:\n" ----------------------------------------------------------------------- Summary of changes: po/da.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Mon May 14 15:40:13 2018 From: cvs at cvs.gnupg.org (by NIIBE Yutaka) Date: Mon, 14 May 2018 15:40:13 +0200 Subject: [git] GnuPG - branch, master, updated. gnupg-2.2.7-125-g61b1508 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via 61b1508281cda47b65c2bbd99cdef67fd6855c7c (commit) from 49bbbd9dc5e1d4809e508ff4ab32fa238588917d (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 61b1508281cda47b65c2bbd99cdef67fd6855c7c Author: NIIBE Yutaka Date: Mon May 14 22:39:44 2018 +0900 po: Fix Swedish and Turkish translations. -- Signed-off-by: NIIBE Yutaka diff --git a/po/sv.po b/po/sv.po index 2c93ebe..2f85206 100644 --- a/po/sv.po +++ b/po/sv.po @@ -5152,7 +5152,7 @@ msgstr "sp?rrningskommentar: " #. q = quit #. msgid "iImMqQsS" -msgstr "iImHhAsS" +msgstr "iIhHaAsS" msgid "No trust value assigned to:\n" msgstr "Inget tillitsv?rde tilldelat till:\n" diff --git a/po/tr.po b/po/tr.po index 4b41e97..f78c1a4 100644 --- a/po/tr.po +++ b/po/tr.po @@ -5088,7 +5088,7 @@ msgstr "y?r?rl?kten kald?rma a??klamas?: " #. q = quit #. msgid "iImMqQsS" -msgstr "bBmMaAkK" +msgstr "bBmMkKaA" msgid "No trust value assigned to:\n" msgstr "G?ven de?eri belirtilmemi?:\n" @@ -5121,7 +5121,7 @@ msgid " s = skip this key\n" msgstr " a = bu anahtar? atla\n" msgid " q = quit\n" -msgstr " ? = ??k\n" +msgstr " k = ??k\n" #, c-format msgid "" ----------------------------------------------------------------------- Summary of changes: po/sv.po | 2 +- po/tr.po | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Mon May 14 16:23:23 2018 From: cvs at cvs.gnupg.org (by Maximilian Krambach) Date: Mon, 14 May 2018 16:23:23 +0200 Subject: [git] GPGME - branch, javascript-binding, updated. gpgme-1.11.1-31-g987b317 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GnuPG Made Easy". The branch, javascript-binding has been updated via 987b31746809dfe04966e37edd759a448a28d975 (commit) from c92326cc257cf7c8b6c0ddc43ec81573c409bc64 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 987b31746809dfe04966e37edd759a448a28d975 Author: Maximilian Krambach Date: Mon May 14 16:23:24 2018 +0200 js: Tests and improvements for openpgp mode -- * Added openpgp - Mode tests to the browsertest Extension. These tests require openpgp, which should not be a hard dependency for the main project. Packing openpgpjs into the extension is still TODO * Fixes: - openpgp mode API now correctly handles parameters as an object, similar to openpgpjs - proper check and parsing of openpgpjs Message Objects diff --git a/lang/js/BrowserTestExtension/index.html b/lang/js/BrowserTestExtension/index.html index 05d413b..c49aeda 100644 --- a/lang/js/BrowserTestExtension/index.html +++ b/lang/js/BrowserTestExtension/index.html @@ -34,6 +34,13 @@ Functionality tests with larger/longer running data sets. +
  • + + Testing openPGP mode. + - Please notice that, due to comparing + the inputs and outputs with openpgpjs objects, this test + requires a copy of openpgpjs in libs. +
  • diff --git a/lang/js/BrowserTestExtension/openpgpModeTest.html b/lang/js/BrowserTestExtension/openpgpModeTest.html new file mode 100644 index 0000000..e7a12be --- /dev/null +++ b/lang/js/BrowserTestExtension/openpgpModeTest.html @@ -0,0 +1,23 @@ + + + + + + + +

    Openpgp mode test

    +
    + + + + + + + + + + + + + + diff --git a/lang/js/BrowserTestExtension/tests/encryptDecryptTest.js b/lang/js/BrowserTestExtension/tests/encryptDecryptTest.js index a66e153..5c53403 100644 --- a/lang/js/BrowserTestExtension/tests/encryptDecryptTest.js +++ b/lang/js/BrowserTestExtension/tests/encryptDecryptTest.js @@ -99,8 +99,7 @@ describe('Encryption and Decryption', function () { }).timeout(5000); }; - it('Encrypt-decrypt simple non-ascii', function (done) { - //FAILS TODO: Check newline at the end + it('Decrypt simple non-ascii', function (done) { let prm = Gpgmejs.init(); prm.then(function (context) { data = encryptedData; @@ -108,18 +107,10 @@ describe('Encryption and Decryption', function () { function (result) { expect(result).to.not.be.empty; expect(result.data).to.be.a('string'); - expect(result.data).to.equal(inputvalues.encrypt.good.data_nonascii); - context.encrypt(inputvalues.encrypt.good.data_nonascii, inputvalues.encrypt.good.fingerprint).then( - function(result){ - context.decrypt(result.data).then(function(answer){ - expect(answer.data).to.equal('??u?erste ?? f?r ?oquis at h?me! ?????? ????'); - context.connection.disconnect(); - done(); - }); - }); - }); - + expect(result.data).to.equal( + '??u?erste ?? f?r ?oquis at h?me! ?????? ????\n'); + done(); + }); }); - }).timeout(6000); - + }).timeout(3000); }); diff --git a/lang/js/BrowserTestExtension/tests/inputValues_openpgpjs.js b/lang/js/BrowserTestExtension/tests/inputValues_openpgpjs.js new file mode 100644 index 0000000..945955b --- /dev/null +++ b/lang/js/BrowserTestExtension/tests/inputValues_openpgpjs.js @@ -0,0 +1,32 @@ +const openpgpInputs = { + pubKeyArmored: '-----BEGIN PGP PUBLIC KEY BLOCK-----\n' + + '\n' + + 'mQENBFrsKEkBCADKw4Wt8J6M/88qD8PO6lSMCxH1cpwH8iK0uPaFFYsJkkXo7kWf\n' + + 'PTAtrV+REqF/o80dvYcdLvRsV21pvncZz/HXLu1yQ18mC3XObrKokbdgrTTKA5XE\n' + + 'BZkNsqyaMMJauT18H4hYkSg62/tTdO1cu/zWv/LFf7Xyn6+uA74ovXCJlO1s0N2c\n' + + 'PShtr98QRzPMf2owgVk37JnDNp4gGVDGHxSZOuUwxgYAZYnA8SFc+c+3ZrQfY870\n' + + '+O4j3Mz4p7yD13AwP4buQLBsb/icxekeQCqpRJhLH9f7MdEcGXa1x36RcEkHdu+M\n' + + 'yJ392eMgD+dKNfRCtyTPhjZTxvbNELIBYICfABEBAAG0EHRlc3RAZXhhbXBsZS5v\n' + + 'cmeJAVQEEwEIAD4WIQTUFzW5Ejb9uIIEjFojAWNe7/DLBQUCWuwoSQIbAwUJA8Jn\n' + + 'AAULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRAjAWNe7/DLBf9kB/wOQ/S60HGw\n' + + 'Fq07W9N01HWULyhHKoMmcHL6rfZ64oDqLxolPSasz7WAMW1jN4qtWJ0mFzwO83V6\n' + + 'kaBe+wF6Kqir6udFSBW9rPcFg6/VZXPltT0a6uacIHq6DyQ5iMW4YQWbVy9OR2rN\n' + + 'GkYo1JCBR0XdRJYCSX3yB4TWv/eXnZ37/WjmiTOIZh35rjs+NuU/S5JPDfAp2/k7\n' + + '0DevQeBsv+UjVXjWpNTZmPbvDnd995uSmC6UY4hzyP84ORYMYn9n1QAR0goxDN6U\n' + + 'unOf9Rlp1oMzdxMool/d1MlCxg2h3jheuhv7lgUF4KpvHOuEPXQ7UO417E0TYcDZ\n' + + '1J8Nsv87SZeEuQENBFrsKEkBCADjoEBhG/QPqZHg8VyoD1xYRAWGxyDJkX/GrSs6\n' + + 'yE+x2hk5FoQCajxKa/d4AVxOnJpdwhAfeXeSNaql5Ejgzax+Tdj9BV6vtGVJVv0p\n' + + 'O7bgAiZxkA6RHxtNqhpPnPQoXvUzkzpRgpuL+Nj4yIg7z1ITH6KQH4u5SI9vd+j/\n' + + '8i9Taz67pdZwuJjac8qBuJHjzAo1bjYctFYUSG5pbmMQyNLySzgiNkFa4DajODlt\n' + + '3RuqVGP316Fk+Sy2+60tC/HlX8jgMyMONfOGBQx6jk8tvAphS/LAqrrNepnagIyL\n' + + 'UGKU+L8cB2g1PGGp2biBFWqZbudZoyRBet/0yH/zirBdQJw1ABEBAAGJATwEGAEI\n' + + 'ACYWIQTUFzW5Ejb9uIIEjFojAWNe7/DLBQUCWuwoSQIbDAUJA8JnAAAKCRAjAWNe\n' + + '7/DLBf0pCACPp5hBuUWngu2Hqvg+tNiujfsiYzId3MffFxEk3CbXeHcJ5F32NDJ9\n' + + 'PYCnra4L8wSv+NZt9gIa8lFwoFSFQCjzH7KE86XcV3MhfdJTNb/+9CR7Jq3e/4Iy\n' + + '0N5ip7PNYMCyakcAsxvsNCJKrSaDuYe/OAoTXRBtgRWE2uyT315em02Lkr+2Cc/Q\n' + + 'k6H+vlNOHGRgnpI/OZZjnUuUfBUvMGHr1phW+y7aeymC9PnUGdViRdJe23nntMSD\n' + + 'A+0/I7ESO9JsWvJbyBmuiZpu9JjScOjYH9xpQLqRNyw4WHpZriN69F0t9Mmd7bM1\n' + + '+UyPgbPEr0iWMeyctYsuOLeUyQKMscDT\n' + + '=QyY6\n' + + '-----END PGP PUBLIC KEY BLOCK-----\n' +}; diff --git a/lang/js/BrowserTestExtension/tests/inputvalues.js b/lang/js/BrowserTestExtension/tests/inputvalues.js index e23b778..38ee6aa 100644 --- a/lang/js/BrowserTestExtension/tests/inputvalues.js +++ b/lang/js/BrowserTestExtension/tests/inputvalues.js @@ -22,15 +22,18 @@ var inputvalues = { encrypt: { good:{ data : 'Hello World.', + // Fingerprint of a key that has been imported to gnupg (i.e. see testkey.pub; testkey.sec) fingerprint : 'D41735B91236FDB882048C5A2301635EEFF0CB05', data_nonascii: '??u?erste ?? f?r ?oquis at h?me! ?????? ????', + + // used for checking encoding consistency in > 2MB messages. data_nonascii_32: [ 'K?K?K?K?K?K?K?K?K?K?K?K?K?K?K?K?', - '????????????????????????????????', //fails result has 3 chars more - '????????????????????????????????', //fails 3 chars + '????????????????????????????????', + '????????????????????????????????', '????????????????????????????????', - '??????????????????????A?????????', //fails 2 chars - '???????????????????????A????????', //is okay if 2 chunksizes. + '??????????????????????A?????????', + '???????????????????????A????????', '????????????????????????????????', '?AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA?', '?AAAA?AAAAAAAAAAAAAAAAAAAAAAAAA?', @@ -42,15 +45,21 @@ var inputvalues = { ] }, bad: { + // valid Hex value, but not usable (not imported to gnupg, or bogus fingerprint) fingerprint: 'CDC3A2B2860625CCBFC5AAAAAC6D1B604967FC4A' } }, init: { - invalid_startups: [{all_passwords: true}, 'openpgpmode', {api_style:"frankenstein"}] + // some parameters + invalid_startups: [ + {all_passwords: true}, + 'openpgpmode', + {api_style:"frankenstein"} + ] } - }; +// (Pseudo-)Random String from a Uint8Array, given approx. size in Megabytes function bigString(megabytes){ let maxlength = 1024 * 1024 * megabytes; let uint = new Uint8Array(maxlength); @@ -60,6 +69,7 @@ function bigString(megabytes){ return new TextDecoder('utf-8').decode(uint); } +// (Pseudo-)Random Uint8Array, given size in Megabytes function bigUint8(megabytes){ let maxlength = 1024 * 1024 * megabytes; let uint = new Uint8Array(maxlength); @@ -69,6 +79,7 @@ function bigUint8(megabytes){ return uint; } +// (Pseudo-)Random string with very limited charset (ascii only, no control chars) function bigBoringString(megabytes){ let maxlength = 1024 * 1024 * megabytes; let string = ''; @@ -79,24 +90,22 @@ function bigBoringString(megabytes){ return string; } +// Some String with simple chars, with different characteristics, but still +// expected to occur in an averag message function slightlyLessBoringString(megabytes, set){ let maxlength = 1024 * 1024 * megabytes; let string = ''; let chars = ''; - if (!set){ - - } else if (set ===1 ) { + if (set ===1 ) { chars = '\n\"\r \''; } else if (set === 2 ) { chars = '()=?`#+-{}[]'; } else if (set === 3){ chars = '^?/'; - //'*<>\\^?/'; } else if (set ===4) { chars = '???????~??||@'; } else { - chars = '*<>\n\"\r?$%&/()=?`#+-{}[] \''; //fails! - + chars = '*<>\n\"\r?$%&/()=?`#+-{}[] \''; } for (let i= 0; i < maxlength; i++){ string = string + chars[Math.floor(Math.random() * chars.length)]; @@ -104,6 +113,7 @@ function slightlyLessBoringString(megabytes, set){ return string; } +// Data encrypted with testKey var encryptedData = '-----BEGIN PGP MESSAGE-----\n' + '\n' + @@ -118,100 +128,3 @@ var encryptedData = 'kSAQYOHplfA7YJWkrlRm\n' + '=zap6\n' + '-----END PGP MESSAGE-----\n'; -var encryptedBroken = '-----BEGIN PGP MESSAGE-----\n' + -'\n' + -'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\n' + -'E14StpggdK8=\n' + -'=enm3\n' + -'-----END PGP MESSAGE-----\n'; \ No newline at end of file diff --git a/lang/js/BrowserTestExtension/tests/longRunningTests.js b/lang/js/BrowserTestExtension/tests/longRunningTests.js index 0f32ca9..f67cbdf 100644 --- a/lang/js/BrowserTestExtension/tests/longRunningTests.js +++ b/lang/js/BrowserTestExtension/tests/longRunningTests.js @@ -27,6 +27,7 @@ describe('Long running Encryption/Decryption', function () { }; it('Successful encrypt 1 MB Uint8Array', function (done) { + //TODO: this succeeds, but result may be bogus (String with byte values as numbers) let prm = Gpgmejs.init(); let data = bigUint8(1); prm.then(function (context) { diff --git a/lang/js/BrowserTestExtension/tests/openpgpModeTest.js b/lang/js/BrowserTestExtension/tests/openpgpModeTest.js new file mode 100644 index 0000000..98b6e1d --- /dev/null +++ b/lang/js/BrowserTestExtension/tests/openpgpModeTest.js @@ -0,0 +1,196 @@ +/* gpgme.js - Javascript integration for gpgme + * Copyright (C) 2018 Bundesamt f?r Sicherheit in der Informationstechnik + * + * This file is part of GPGME. + * + * GPGME is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * GPGME 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + * SPDX-License-Identifier: LGPL-2.1+ + */ + +describe('Encrypting-Decrypting in openpgp mode, using a Message object', function () { + it('Simple Encrypt-Decrypt', function (done) { + let prm = Gpgmejs.init({api_style: 'gpgme_openpgpjs'}); + prm.then(function (context) { + context.encrypt({ + data: openpgp.message.fromText(inputvalues.encrypt.good.data), + publicKeys: inputvalues.encrypt.good.fingerprint} + ).then(function (answer) { + expect(answer).to.not.be.empty; + expect(answer).to.be.an("object"); + expect(answer.data).to.include('BEGIN PGP MESSAGE'); + expect(answer.data).to.include('END PGP MESSAGE'); + let msg = openpgp.message.fromText(answer.data); + context.decrypt({message:msg}).then(function (result) { + expect(result).to.not.be.empty; + expect(result.data).to.be.a('string'); + expect(result.data).to.equal(inputvalues.encrypt.good.data); + context._GpgME.connection.disconnect(); + done(); + }); + }); + }); + }); + it('Encrypt-Decrypt, sending Uint8Array as data', function (done) { + //TODO! fails. Reason is that atob<->btoa destroys the uint8Array, + // resulting in a string of constituyent numbers + // (error already occurs in encryption) + + let prm = Gpgmejs.init({api_style: 'gpgme_openpgpjs'}); + prm.then(function (context) { + let input = bigUint8(0.3); + expect(input).to.be.an.instanceof(Uint8Array); + context.encrypt({ + data: input, + publicKeys: inputvalues.encrypt.good.fingerprint} + ).then(function (answer) { + expect(answer).to.not.be.empty; + expect(answer.data).to.be.a("string"); + expect(answer.data).to.include('BEGIN PGP MESSAGE'); + expect(answer.data).to.include('END PGP MESSAGE'); + context.decrypt({message:answer.data}).then(function (result) { + expect(result).to.not.be.empty; + expect(result.data).to.be.an.instanceof(Uint8Array); + expect(result.data).to.equal(input); + context._GpgME.connection.disconnect(); + done(); + }); + }); + }); + }); + it('Keys as Fingerprints', function(done){ + let prm = Gpgmejs.init({api_style: 'gpgme_openpgpjs'}); + let input = inputvalues.encrypt.good.data_nonascii; + prm.then(function (context) { + context.encrypt({ + data: input, + publicKeys: inputvalues.encrypt.good.fingerprint} + ).then(function (answer) { + expect(answer).to.not.be.empty; + expect(answer.data).to.be.a("string"); + expect(answer.data).to.include('BEGIN PGP MESSAGE'); + expect(answer.data).to.include('END PGP MESSAGE'); + context.decrypt({message:answer.data}).then(function (result) { + expect(result).to.not.be.empty; + expect(result.data).to.be.a('string'); + expect(result.data).to.equal(input); + context._GpgME.connection.disconnect(); + done(); + }); + }); + }); + }); + it('Keys as openpgp Keys', function(){ + let prm = Gpgmejs.init({api_style: 'gpgme_openpgpjs'}); + let data = inputvalues.encrypt.good.data_nonascii; + let key = openpgp.key.readArmored(openpgpInputs.pubKeyArmored); + expect(key).to.be.an('object'); + prm.then(function (context) { + context.encrypt({ + data: data, + publicKeys: [key]} + ).then( function (answer) { + expect(answer).to.not.be.empty; + expect(answer.data).to.be.a("string"); + expect(answer.data).to.include('BEGIN PGP MESSAGE'); + expect(answer.data).to.include('END PGP MESSAGE'); + context.decrypt({message:answer.data}).then( function (result){ + expect(result).to.not.be.empty; + expect(result.data).to.be.a('string'); + expect(result.data).to.equal(data); + context._GpgME.connection.disconnect(); + done(); + }); + }); + }); + }); + it('Trying to send non-implemented parameters: passwords', function(done){ + let prm = Gpgmejs.init({api_style: 'gpgme_openpgpjs'}); + let data = 'Hello World'; + let key = inputvalues.encrypt.good.fingerprint; + prm.then(function (context) { + context.encrypt({ + data: data, + publicKeys: [key], + passwords: 'My secret password'} + ).then( function(){}, + function(error){ + expect(error).to.be.an.instanceof(Error); + expect(error.code).equal('NOT_IMPLEMENTED'); + done(); + }); + }); + }); + it('Trying to send non-implemented parameters: signature', function(done){ + let prm = Gpgmejs.init({api_style: 'gpgme_openpgpjs'}); + let data = 'Hello World'; + let key = inputvalues.encrypt.good.fingerprint; + prm.then(function (context) { + context.encrypt({ + data: data, + publicKeys: [key], + signature: {any: 'value'} + }).then( + function(){}, + function(error){ + expect(error).to.be.an.instanceof(Error); + expect(error.code).equal('NOT_IMPLEMENTED'); + done(); + }); + }); + }); +}); + +describe('Keyring in openpgp mode', function(){ + it('Check Existence and structure of Keyring after init', function(done){ + let prm = Gpgmejs.init({api_style: 'gpgme_openpgpjs'}); + prm.then(function (context) { + expect(context.Keyring).to.be.an('object'); + expect(context.Keyring.getPublicKeys).to.be.a('function'); + expect(context.Keyring.deleteKey).to.be.a('function'); + expect(context.Keyring.getDefaultKey).to.be.a('function'); + done(); + }); + }); + // TODO: gpgme key interface not yet there +}); + +describe('Decrypting and verification in openpgp mode', function(){ + it('Decrypt', function(){ + let msg = openpgp.message.fromText(inputvalues.encryptedData); + let prm = Gpgmejs.init({api_style: 'gpgme_openpgpjs'}); + prm.then(function (context) { + context.decrypt({message: msg}) + .then(function(answer){ + expect(answer.data).to.be.a('string'); + expect(result.data).to.equal('??u?erste ?? f?r ?oquis at h?me! ?????? ????\n'); + done(); + }); + }); + }); + it('Decryption attempt with bad data returns gnupg error', function(done){ + let msg = openpgp.message.fromText(bigString(0.1)); + let prm = Gpgmejs.init({api_style: 'gpgme_openpgpjs'}); + prm.then(function (context) { + context.decrypt({message: msg}) + .then( function(){}, + function(error){ + expect(error).to.be.an.instanceof(Error); + expect(error.code).to.equal('GNUPG_ERROR'); + expect(error.message).to.be.a('string'); + // TBD: Type of error + done(); + }); + }); + }).timeout(4000); +}); diff --git a/lang/js/src/Connection.js b/lang/js/src/Connection.js index 64621f6..1931a55 100644 --- a/lang/js/src/Connection.js +++ b/lang/js/src/Connection.js @@ -181,7 +181,6 @@ class Answer{ if (!this._response.hasOwnProperty(key)){ this._response[key] = ''; } - // console.log(msg[key]); this._response[key] += msg[key]; } //params should not change through the message diff --git a/lang/js/src/gpgmejs.js b/lang/js/src/gpgmejs.js index c1a0137..d106f4f 100644 --- a/lang/js/src/gpgmejs.js +++ b/lang/js/src/gpgmejs.js @@ -80,7 +80,6 @@ export class GpgME { let pubkeys = toKeyIdArray(publicKeys); msg.setParameter('keys', pubkeys); - putData(msg, data); if (wildcard === true){msg.setParameter('throw-keyids', true); }; @@ -171,19 +170,32 @@ function putData(message, data){ return gpgme_error('PARAM_WRONG'); } else if (data instanceof Uint8Array){ message.setParameter('base64', true); + // TODO: btoa turns the array into a string + // of comma separated of numbers + // atob(data).split(',') would result in a "normal" array of numbers + // atob(btoa(data)).split(',') would result in a "normal" array of numbers + // would result in a "normal" array of numbers message.setParameter ('data', btoa(data)); + } else if (typeof(data) === 'string') { message.setParameter('base64', false); message.setParameter('data', data); - } else if ( typeof(data) === 'object' && data.hasOwnProperty('getText')){ + } else if ( + typeof(data) === 'object' && + typeof(data.getText) === 'function' + ){ let txt = data.getText(); if (txt instanceof Uint8Array){ message.setParameter('base64', true); message.setParameter ('data', btoa(txt)); } - else { + else if (typeof(txt) === 'string'){ + message.setParameter('base64', false); + message.setParameter ('data', txt); + } else { return gpgme_error('PARAM_WRONG'); } + } else { return gpgme_error('PARAM_WRONG'); } diff --git a/lang/js/src/gpgmejs_openpgpjs.js b/lang/js/src/gpgmejs_openpgpjs.js index b233f0f..9c8cd2c 100644 --- a/lang/js/src/gpgmejs_openpgpjs.js +++ b/lang/js/src/gpgmejs_openpgpjs.js @@ -25,10 +25,10 @@ */ import { GpgME } from "./gpgmejs"; - import {GPGME_Keyring} from "./Keyring" + import {GPGME_Keyring} from "./Keyring"; import { GPGME_Key, createKey } from "./Key"; - import { isFingerprint } from "./Helpers" - import { gpgme_error } from "./Errors" + import { isFingerprint } from "./Helpers"; + import { gpgme_error } from "./Errors"; import { Connection } from "./Connection"; @@ -60,8 +60,8 @@ import { Connection } from "./Connection"; /** * Encrypt Message * Supported: - * @param {String|Uint8Array} data - * //an openpgp Message also accepted here. TODO: is this wanted? + * @param {String|Message} data + * an openpgp Message is accepted here. * @param {Key|Array} publicKeys * //Strings of Fingerprints * @param {Boolean} wildcard @@ -86,36 +86,39 @@ import { Connection } from "./Connection"; * @async * @static */ - encrypt({data = '', publicKeys = '', privateKeys, passwords=null, - sessionKey = null, filename, compression, armor=true, detached=false, - signature=null, returnSessionKey=null, wildcard=false, date=null}) { - if (passwords !== null - || sessionKey !== null - || signature !== null - || returnSessionKey !== null - || date !== null + encrypt(options) { + if (!options || typeof(options) !== 'object'){ + return Promise.reject(gpgme_error('PARAM_WRONG')); + } + if (options.passwords + || options.sessionKey + || options.signature + || options.returnSessionKey + || (options.hasOwnProperty('date') && options.date !== null) ){ - return Promise.reject(GPMGEJS_Error('NOT_IMPLEMENTED')); + return Promise.reject(gpgme_error('NOT_IMPLEMENTED')); } - if ( privateKeys - || compression - || armor === false - || detached == true){ - return Promise.reject(gpgme_error('NOT_YET_IMPLEMENTED')); + if ( options.privateKeys + || options.compression + || (options.hasOwnProperty('armor') && options.armor === false) + || (options.hasOwnProperty('detached') && options.detached == true) + ){ + return Promise.reject(gpgme_error('NOT_YET_IMPLEMENTED')); } - if (filename){ + if (options.filename){ if (this._config.unconsidered_params === 'warn'){ - GPMGEJS_Error('PARAM_IGNORED'); + gpgme_error('PARAM_IGNORED'); } else if (this._config.unconsidered_params === 'error'){ - return Promise.reject(GPMGEJS_Error('NOT_IMPLEMENTED')); + return Promise.reject(gpgme_error('NOT_IMPLEMENTED')); } } - return this._GpgME.encrypt(data, translateKeys(publicKeys), wildcard); + return this._GpgME.encrypt( + options.data, options.publicKeys, options.wildcard); } /** Decrypt Message * supported openpgpjs parameters: - * @param {Message|Uint8Array|String} message Message object from openpgpjs + * @param {Message|String} message Message object from openpgpjs * Unsupported: * @param {String|Array} passwords * @param {Key|Array} privateKeys @@ -128,26 +131,33 @@ import { Connection } from "./Connection"; * @param {Key|Array} publicKeys * * @returns {Promise} decrypted and verified message in the form: - * { data:Uint8Array|String, filename:String, signatures:[{ keyid:String, valid:Boolean }] } + * { data:String, filename:String, signatures:[{ keyid:String, valid:Boolean }] } * @async * @static */ - decrypt({ message, privateKeys, passwords=null, sessionKeys, - publicKeys, format='utf8', signature=null, date= null}) { - if (passwords !== null || sessionKeys || privateKeys){ + decrypt(options) { + if (options.passwords + || options.sessionKeys + || options.privateKeys + ){ return Promise.reject(gpgme_error('NOT_IMPLEMENTED')); } - if ( format !== 'utf8' || signature){ + if ((options.hasOwnProperty('format') && options.format !== 'utf8') + || options.signature + ){ return Promise.reject(gpgme_error('NOT_YET_IMPLEMENTED')); } - if (date !== null || publicKeys){ + if ((options.hasOwnProperty('date') && options.date !== null) + || options.publicKeys + ){ if (this._config.unconsidered_params === 'warn'){ GPMGEJS_Error('PARAM_IGNORED'); } else if (this._config.unconsidered_params === 'reject'){ return Promise.reject(GPMGEJS_Error('NOT_IMPLEMENTED')); } } - return this._GpgME.decrypt(message); + return this._GpgME.decrypt(options.message); + // TODO: translate between: // openpgp: // { data:Uint8Array|String, @@ -276,14 +286,15 @@ class GPGME_Key_openpgpmode { * @returns {Array} */ function translateKeys(input){ + //TODO: does not check if inpout is okay! if (!input){ return null; } if (!Array.isArray(input)){ input = [input]; } - let resultset; - for (let i=0; i< input.length; i++){ + let resultset = []; + for (let i=0; i< input.length; i++) { resultset.push(new GPGME_Key_openpgpmode(input[i])); } return resultset; ----------------------------------------------------------------------- Summary of changes: lang/js/BrowserTestExtension/index.html | 7 + .../{browsertest.html => openpgpModeTest.html} | 8 +- .../tests/encryptDecryptTest.js | 21 +-- .../tests/inputValues_openpgpjs.js | 32 ++++ lang/js/BrowserTestExtension/tests/inputvalues.js | 131 +++----------- .../BrowserTestExtension/tests/longRunningTests.js | 1 + .../BrowserTestExtension/tests/openpgpModeTest.js | 196 +++++++++++++++++++++ lang/js/src/Connection.js | 1 - lang/js/src/gpgmejs.js | 18 +- lang/js/src/gpgmejs_openpgpjs.js | 77 ++++---- 10 files changed, 327 insertions(+), 165 deletions(-) copy lang/js/BrowserTestExtension/{browsertest.html => openpgpModeTest.html} (73%) create mode 100644 lang/js/BrowserTestExtension/tests/inputValues_openpgpjs.js create mode 100644 lang/js/BrowserTestExtension/tests/openpgpModeTest.js hooks/post-receive -- GnuPG Made Easy http://git.gnupg.org From cvs at cvs.gnupg.org Mon May 14 16:37:20 2018 From: cvs at cvs.gnupg.org (by Maximilian Krambach) Date: Mon, 14 May 2018 16:37:20 +0200 Subject: [git] GPGME - branch, javascript-binding, updated. gpgme-1.11.1-32-gd1ca90e Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GnuPG Made Easy". The branch, javascript-binding has been updated via d1ca90ef75aa4ab61cb8f7563be6fc55012a3900 (commit) from 987b31746809dfe04966e37edd759a448a28d975 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit d1ca90ef75aa4ab61cb8f7563be6fc55012a3900 Author: Maximilian Krambach Date: Mon May 14 16:36:05 2018 +0200 js: remove non-browser tests -- * The majority of tests needs to be run in a nativeMessaging context. Offering the few tests that don't need this context at two places introduces issues with maintainability. All tests now removed can be found in ./unittests.js diff --git a/lang/js/package.json b/lang/js/package.json index a794188..be52a55 100644 --- a/lang/js/package.json +++ b/lang/js/package.json @@ -4,9 +4,6 @@ "description": "javascript part of a nativeMessaging gnupg integration", "main": "src/index.js", "private": true, - "scripts": { - "test": "mocha" - }, "keywords": [], "author": "", "license": "", diff --git a/lang/js/test/Helpers.js b/lang/js/test/Helpers.js deleted file mode 100644 index 6b5a538..0000000 --- a/lang/js/test/Helpers.js +++ /dev/null @@ -1,97 +0,0 @@ -/* gpgme.js - Javascript integration for gpgme - * Copyright (C) 2018 Bundesamt f?r Sicherheit in der Informationstechnik - * - * This file is part of GPGME. - * - * GPGME is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 of - * the License, or (at your option) any later version. - * - * GPGME 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, see . - * SPDX-License-Identifier: LGPL-2.1+ - */ - -import { expect } from "../node_modules/chai/chai"; -import { gpgme_error} from "../src/Errors"; -import { GPGME_Key } from "../src/Key"; -import { isLongId, isFingerprint, toKeyIdArray } from "../src/Helpers" -import { helper_params } from "./inputvalues"; - -export function Helpertest(){ - describe('Error Object handling', function(){ - it('check the Timeout error', function(){ - let test0 = gpgme_error('CONN_TIMEOUT'); - expect(test0).to.be.an.instanceof(Error); - expect(test0.code).to.equal('CONN_TIMEOUT'); - }); - it('Error Object returns generic code if code is not listed', function(){ - let test0 = gpgme_error(helper_params.invalidErrorCode); - expect(test0).to.be.an.instanceof(Error); - expect(test0.code).to.equal('GENERIC_ERROR'); - }); - - it('Warnings like PARAM_IGNORED should not return errors', function(){ - let test0 = gpgme_error('PARAM_IGNORED'); - expect(test0).to.be.null; - }); - }); - - describe('Fingerprint checking', function(){ - it('isFingerprint(): valid Fingerprint', function(){ - let test0 = isFingerprint(helper_params.validFingerprint); - expect(test0).to.be.true; - }); - it('isFingerprint(): invalid Fingerprint', function(){ - let test0 = isFingerprint(helper_params.invalidFingerprint); - expect(test0).to.be.false; - }); - }); - describe('Converting to Fingerprint', function(){ - it('Correct Inputs', function(){ - it('Fingerprint string', function(){ - let test0 = toKeyIdArray(helper_params.validFingerprint); - expect(test0).to.be.an('array'); - expect(test0).to.include(helper_params.validFingerprint); - }); - it('GPGME_Key', function(){ - expect(helper_params.validGPGME_Key).to.be.an.instanceof(GPGME_Key); - let test0 = toKeyIdArray(helper_params.validGPGME_Key); - expect(test0).to.be.an('array'); - expect(test0).to.include(helper_params.validGPGME_Key.fingerprint); - }); - it('Array of valid inputs', function(){ - let test0 = toKeyIdArray(helper_params.validKeys); - expect(test0).to.be.an('array'); - expect(test0).to.have.lengthOf(helper_params.validKeys.length); - }); - }); - describe('Incorrect inputs', function(){ - it('valid Long ID', function(){ - let test0 = toKeyIdArray(helper_params.validLongId); - expect(test0).to.be.empty; - }); - it('invalidFingerprint', function(){ - let test0 = toKeyIdArray(helper_params.invalidFingerprint); - expect(test0).to.be.empty; - }); - it('invalidKeyArray', function(){ - let test0 = toKeyIdArray(helper_params.invalidKeyArray); - expect(test0).to.be.empty; - }); - it('Partially invalid array', function(){ - let test0 = toKeyIdArray(helper_params.invalidKeyArray_OneBad); - expect(test0).to.be.an('array'); - expect(test0).to.have.lengthOf( - helper_params.invalidKeyArray_OneBad.length - 1); - }); - }); - }); -}; -export default Helpertest; \ No newline at end of file diff --git a/lang/js/test/Message.js b/lang/js/test/Message.js deleted file mode 100644 index a7dd3af..0000000 --- a/lang/js/test/Message.js +++ /dev/null @@ -1,93 +0,0 @@ -/* gpgme.js - Javascript integration for gpgme - * Copyright (C) 2018 Bundesamt f?r Sicherheit in der Informationstechnik - * - * This file is part of GPGME. - * - * GPGME is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 of - * the License, or (at your option) any later version. - * - * GPGME 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, see . - * SPDX-License-Identifier: LGPL-2.1+ - */ - -import { expect } from "../node_modules/chai/chai"; -import { GPGME_Message, createMessage } from "../src/Message"; - -import { message_params as mp, helper_params as hp} from "./inputvalues"; - -export function Messagetest(){ - - describe('Message Object', function(){ - describe('correct initialization of an encrypt Message', function(){ - it('creating Message', function(){ - let test0 = createMessage('encrypt'); - expect(test0).to.be.an.instanceof(GPGME_Message); - expect(test0.isComplete).to.be.false; - }); - it('Message is complete after setting mandatoy data', function(){ - let test0 = createMessage('encrypt'); - test0.setParameter('data', mp.valid_encrypt_data); - test0.setParameter('keys', hp.validFingerprints); - expect(test0.isComplete).to.be.true; - }); - it('Complete Message contains the data that was set', function(){ - let test0 = createMessage('encrypt'); - test0.setParameter('data', mp.valid_encrypt_data); - test0.setParameter('keys', hp.validFingerprints); - - expect(test0.message).to.not.be.null; - expect(test0.message).to.have.keys('op', 'data', 'keys'); - expect(test0.message.op).to.equal('encrypt'); - expect(test0.message.data).to.equal( - mp.valid_encrypt_data); - }); - }); - - describe('Incorrect initialization', function(){ - it('non-allowed operation', function(){ - let test0 = createMessage(mp.invalid_op_action); - expect(test0).to.be.an.instanceof(Error); - expect(test0.code).to.equal('MSG_WRONG_OP'); - }); - it('wrong parameter type in constructor', function(){ - let test0 = createMessage(mp.invalid_op_type); - expect(test0).to.be.an.instanceof(Error); - expect(test0.code).to.equal('PARAM_WRONG'); - }); - }); - - describe('Setting wrong parameters', function(){ - it('Wrong parameter name', function(){ - let test0 = createMessage(mp.invalid_param_test.valid_op); - for (let i=0; i < mp.invalid_param_test.invalid_param_names.length; i++){ - let ret = test0.setParameter( - mp.invalid_param_test.invalid_param_names[i], - 'Somevalue'); - expect(ret).to.be.an.instanceof(Error); - expect(ret.code).to.equal('PARAM_WRONG'); - } - }); - it('Wrong parameter value', function(){ - let test0 = createMessage(mp.invalid_param_test.valid_op); - for (let j=0; - j < mp.invalid_param_test.invalid_values_0.length; - j++){ - let ret = test0.setParameter( - mp.invalid_param_test.validparam_name_0, - mp.invalid_param_test.invalid_values_0[j]); - expect(ret).to.be.an.instanceof(Error); - expect(ret.code).to.equal('PARAM_WRONG'); - } - }); - }); - }); -} -export default Messagetest; \ No newline at end of file diff --git a/lang/js/test/index.js b/lang/js/test/index.js deleted file mode 100644 index b852051..0000000 --- a/lang/js/test/index.js +++ /dev/null @@ -1,28 +0,0 @@ -/* gpgme.js - Javascript integration for gpgme - * Copyright (C) 2018 Bundesamt f?r Sicherheit in der Informationstechnik - * - * This file is part of GPGME. - * - * GPGME is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 of - * the License, or (at your option) any later version. - * - * GPGME 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, see . - * SPDX-License-Identifier: LGPL-2.1+ - */ -import { Helpertest } from "./Helpers"; -import { Messagetest } from "./Message"; - -/** - * Unit tests. - */ - -Helpertest(); -Messagetest(); diff --git a/lang/js/test/inputvalues.js b/lang/js/test/inputvalues.js deleted file mode 100644 index 7752b82..0000000 --- a/lang/js/test/inputvalues.js +++ /dev/null @@ -1,39 +0,0 @@ -import { gpgme_error } from "../src/Errors"; - -export const helper_params = { - validLongId: '0A0A0A0A0A0A0A0A', - validKeys: ['A1E3BC45BDC8E87B74F4392D53B151A1368E50F3', - 'ADDBC303B6D31026F5EB4591A27EABDF283121BB', - 'EE17AEE730F88F1DE7713C54BBE0A4FF7851650A'], - validFingerprint: '9A9A7A7A8A9A9A7A7A8A9A9A7A7A8A9A9A7A7A8A', - validFingerprints: ['9A9A7A7A8A9A9A7A7A8A9A9A7A7A8A9A9A7A7A8A', - '9AAE7A338A9A9A7A7A8A9A9A7A7A8A9A9A7A7DDA'], - invalidLongId: '9A9A7A7A8A9A9A7A7A8A', - invalidFingerprint: [{hello:'World'}], - invalidKeyArray: {curiosity:'uncat'}, - invalidKeyArray_OneBad: [ - '12AE9F3E41B33BF77DF52B6BE8EE1992D7909B08', - 'E1D18E6E994FA9FE9360Bx0E687B940FEFEB095A', - '3AEA7FE4F5F416ED18CEC63DD519450D9C0FAEE5'], - invalidErrorCode: 'Please type in all your passwords.', -} - -export const message_params = { - invalid_op_action : 'dance', - invalid_op_type : [234, 34, '<>'], - valid_encrypt_data: "????? ???????", - invalid_param_test: { - valid_op: 'encrypt', - invalid_param_names: [22,'dance', {}], - validparam_name_0: 'mime', - invalid_values_0: [2134, 'All your passwords', gpgme_error('12AE9F3E41B33BF77DF52B6BE8EE1992D7909B08'), null] - } -} -export const whatever_params = { - four_invalid_params: ['<(((-<', '>?;==;~~', '^^', '{{{{o}}}}'] -} - -export default { - helper_params: helper_params, - message_params: message_params -} \ No newline at end of file diff --git a/lang/js/test/mocha.opts b/lang/js/test/mocha.opts deleted file mode 100644 index 65adc1c..0000000 --- a/lang/js/test/mocha.opts +++ /dev/null @@ -1,4 +0,0 @@ ---require babel-register ---reporter spec ---ui bdd ---colors ----------------------------------------------------------------------- Summary of changes: lang/js/package.json | 3 -- lang/js/test/Helpers.js | 97 --------------------------------------------- lang/js/test/Message.js | 93 ------------------------------------------- lang/js/test/index.js | 28 ------------- lang/js/test/inputvalues.js | 39 ------------------ lang/js/test/mocha.opts | 4 -- 6 files changed, 264 deletions(-) delete mode 100644 lang/js/test/Helpers.js delete mode 100644 lang/js/test/Message.js delete mode 100644 lang/js/test/index.js delete mode 100644 lang/js/test/inputvalues.js delete mode 100644 lang/js/test/mocha.opts hooks/post-receive -- GnuPG Made Easy http://git.gnupg.org From cvs at cvs.gnupg.org Mon May 14 19:08:37 2018 From: cvs at cvs.gnupg.org (by Maximilian Krambach) Date: Mon, 14 May 2018 19:08:37 +0200 Subject: [git] GPGME - branch, javascript-binding, updated. gpgme-1.11.1-33-g6b4caee Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GnuPG Made Easy". The branch, javascript-binding has been updated via 6b4caee039af6fd97912426aff143745bf7e191a (commit) from d1ca90ef75aa4ab61cb8f7563be6fc55012a3900 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 6b4caee039af6fd97912426aff143745bf7e191a Author: Maximilian Krambach Date: Mon May 14 19:02:49 2018 +0200 js: Testing lare messages -- * Some assumption on messages were wrong. Now the tests use more reasonable sizes. * bigString now uses the full utf8-extent, with the exception of U+0000. This code gets dropped during the encryption-decryption process. diff --git a/lang/js/BrowserTestExtension/tests/encryptTest.js b/lang/js/BrowserTestExtension/tests/encryptTest.js index 5ef68a3..521ed27 100644 --- a/lang/js/BrowserTestExtension/tests/encryptTest.js +++ b/lang/js/BrowserTestExtension/tests/encryptTest.js @@ -36,7 +36,7 @@ describe('Encryption', function () { it('Successful encrypt 5 MB', function (done) { let prm = Gpgmejs.init(); - let data = bigString(5); + let data = fixedLengthString(5); prm.then(function (context) { context.encrypt( data, @@ -51,10 +51,9 @@ describe('Encryption', function () { }); }).timeout(10000); -/** it('Successful encrypt 20 MB', function (done) { let prm = Gpgmejs.init(); - let data = bigString(20); + let data = fixedLengthString(20); prm.then(function (context) { context.encrypt( data, @@ -68,12 +67,10 @@ describe('Encryption', function () { }); }); }).timeout(20000); -*/ -/** - it('Successful encrypt 30 MB', function (done) { - // TODO: There seems to be a limit imposed at least by chrome at about 21 MB + + it('Successful encrypt 50 MB', function (done) { let prm = Gpgmejs.init(); - let data = bigString(30); + let data = fixedLengthString(50); prm.then(function (context) { context.encrypt( data, @@ -87,7 +84,6 @@ describe('Encryption', function () { }); }); }).timeout(20000); -*/ it('Sending encryption without keys fails', function (done) { let prm = Gpgmejs.init(); @@ -120,7 +116,6 @@ describe('Encryption', function () { }); }); - it('Sending encryption with non existing keys fails', function (done) { let prm = Gpgmejs.init(); prm.then(function (context) { @@ -138,21 +133,24 @@ describe('Encryption', function () { }); }).timeout(5000);; - it('Overly large message ( >= 48MB) is rejected', function (done) { + it('Overly large message ( > 65MB) is rejected', function (done) { let prm = Gpgmejs.init(); prm.then(function (context) { context.encrypt( - bigString(48), + fixedLengthString(65), inputvalues.encrypt.good.fingerprint).then(function (answer) { expect(answer).to.be.undefined; }, function(error){ expect(error).to.be.an.instanceof(Error); - // TODO who is throwing the error here? - // It is not a GPGME_Error! + // expect(error.code).to.equal('GNUPG_ERROR'); + // TODO: there is a 64 MB hard limit at least in chrome at: + // chromium//extensions/renderer/messaging_util.cc: + // kMaxMessageLength context.connection.disconnect(); done(); }); }); }).timeout(8000); + // TODO check different valid parameter }); diff --git a/lang/js/BrowserTestExtension/tests/inputvalues.js b/lang/js/BrowserTestExtension/tests/inputvalues.js index 38ee6aa..52e3a7b 100644 --- a/lang/js/BrowserTestExtension/tests/inputvalues.js +++ b/lang/js/BrowserTestExtension/tests/inputvalues.js @@ -59,14 +59,27 @@ var inputvalues = { } }; -// (Pseudo-)Random String from a Uint8Array, given approx. size in Megabytes -function bigString(megabytes){ - let maxlength = 1024 * 1024 * megabytes; +// (Pseudo-)Random String covering all of utf8. +function bigString(length){ + var uint = ''; + let arr = []; + for (let i= 0; i < length; i++){ + arr.push(String.fromCharCode( + Math.floor(Math.random() * 10174) + 1) + ); + } + return arr.join(''); +} + +function fixedLengthString(megabytes){ + let maxlength = 1024 * 1024 * megabytes / 2; let uint = new Uint8Array(maxlength); - for (let i= 0; i < maxlength; i++){ - uint[i] = Math.random() * Math.floor(256); + for (let i = 0; i < maxlength; i++){ + uint[i] = Math.floor(Math.random()* 256); } - return new TextDecoder('utf-8').decode(uint); + let td = new TextDecoder('ascii'); + let result = td.decode(uint); + return result; } // (Pseudo-)Random Uint8Array, given size in Megabytes @@ -82,19 +95,19 @@ function bigUint8(megabytes){ // (Pseudo-)Random string with very limited charset (ascii only, no control chars) function bigBoringString(megabytes){ let maxlength = 1024 * 1024 * megabytes; - let string = ''; + let string = []; let chars = ' 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; for (let i= 0; i < maxlength; i++){ - string = string + chars[Math.floor(Math.random() * chars.length)]; + string.push(chars[Math.floor(Math.random() * chars.length)]); } - return string; + return string.join(''); } // Some String with simple chars, with different characteristics, but still // expected to occur in an averag message function slightlyLessBoringString(megabytes, set){ let maxlength = 1024 * 1024 * megabytes; - let string = ''; + let string = []; let chars = ''; if (set ===1 ) { chars = '\n\"\r \''; @@ -108,9 +121,9 @@ function slightlyLessBoringString(megabytes, set){ chars = '*<>\n\"\r?$%&/()=?`#+-{}[] \''; } for (let i= 0; i < maxlength; i++){ - string = string + chars[Math.floor(Math.random() * chars.length)]; + string.push(chars[Math.floor(Math.random() * chars.length)]); } - return string; + return string.join(''); } // Data encrypted with testKey diff --git a/lang/js/BrowserTestExtension/tests/longRunningTests.js b/lang/js/BrowserTestExtension/tests/longRunningTests.js index f67cbdf..c95bebd 100644 --- a/lang/js/BrowserTestExtension/tests/longRunningTests.js +++ b/lang/js/BrowserTestExtension/tests/longRunningTests.js @@ -1,8 +1,8 @@ describe('Long running Encryption/Decryption', function () { - for (let i=0; i< 100; i++) { + for (let i=0; i < 100; i++) { it('Successful encrypt/decrypt completely random data ' + (i+1) + '/100', function (done) { let prm = Gpgmejs.init(); - let data = bigString(2); + let data = bigString(2*1024*1024); prm.then(function (context) { context.encrypt(data, inputvalues.encrypt.good.fingerprint).then( @@ -17,13 +17,24 @@ describe('Long running Encryption/Decryption', function () { function(result){ expect(result).to.not.be.empty; expect(result.data).to.be.a('string'); + if (result.data.length !== data.length) { + console.log('diff: ' + (result.data.length - data.length)); + for (let i=0; i < result.data.length; i++){ + if (result.data[i] !== data[i]){ + console.log('position: ' + i); + console.log('result : '+ result.data.charCodeAt(i) + result.data[i-2] + result.data[i-1] + result.data[i] + result.data[i+1] + result.data[i+2]); + console.log('original: ' + data.charCodeAt(i) + data[i-2] + data[i-1] + data[i] + data[i+1] + data[i+2]); + break; + } + } + } expect(result.data).to.equal(data); context.connection.disconnect(); done(); }); }); }); - }).timeout(5000); + }).timeout(8000); }; it('Successful encrypt 1 MB Uint8Array', function (done) { ----------------------------------------------------------------------- Summary of changes: lang/js/BrowserTestExtension/tests/encryptTest.js | 26 +++++++-------- lang/js/BrowserTestExtension/tests/inputvalues.js | 37 +++++++++++++++------- .../BrowserTestExtension/tests/longRunningTests.js | 17 ++++++++-- 3 files changed, 51 insertions(+), 29 deletions(-) hooks/post-receive -- GnuPG Made Easy http://git.gnupg.org From cvs at cvs.gnupg.org Tue May 15 05:51:55 2018 From: cvs at cvs.gnupg.org (by Ben McGinnes) Date: Tue, 15 May 2018 05:51:55 +0200 Subject: [git] GPGME - branch, ben/howto-dita, updated. gpgme-1.11.1-9-gf64d259 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GnuPG Made Easy". The branch, ben/howto-dita has been updated via f64d259e1d2a844fdc68c2676dff64e807a97a22 (commit) from f0063afa71bc7e71f19d174acc2fde26f0c11850 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit f64d259e1d2a844fdc68c2676dff64e807a97a22 Author: Ben McGinnes Date: Tue May 15 13:50:14 2018 +1000 docs: python bindings howto * Added metadata, author info, version number and xml:lang data. diff --git a/lang/python/docs/dita/gpgme-python-howto.ditamap b/lang/python/docs/dita/gpgme-python-howto.ditamap index 99dde6c..e66c9f4 100644 --- a/lang/python/docs/dita/gpgme-python-howto.ditamap +++ b/lang/python/docs/dita/gpgme-python-howto.ditamap @@ -1,9 +1,31 @@ - + GPGME Python Bindings HOWTO + + Ben McGinnes + + + + + + + + + + + + + + + + + + + + diff --git a/lang/python/docs/dita/howto/part-1.dita b/lang/python/docs/dita/howto/part-1.dita index 12488f8..a4e675c 100644 --- a/lang/python/docs/dita/howto/part-1.dita +++ b/lang/python/docs/dita/howto/part-1.dita @@ -1,6 +1,6 @@ - + Introducing the Python Bindings diff --git a/lang/python/docs/dita/howto/part-2.dita b/lang/python/docs/dita/howto/part-2.dita index 6ddd174..1706dc3 100644 --- a/lang/python/docs/dita/howto/part-2.dita +++ b/lang/python/docs/dita/howto/part-2.dita @@ -1,6 +1,6 @@ - + Preparation and Setting Up diff --git a/lang/python/docs/dita/howto/part-3.dita b/lang/python/docs/dita/howto/part-3.dita index 37cd3ba..d19f0eb 100644 --- a/lang/python/docs/dita/howto/part-3.dita +++ b/lang/python/docs/dita/howto/part-3.dita @@ -1,6 +1,6 @@ - + Working With Keys diff --git a/lang/python/docs/dita/howto/part-4.dita b/lang/python/docs/dita/howto/part-4.dita index b79a04e..3b805e0 100644 --- a/lang/python/docs/dita/howto/part-4.dita +++ b/lang/python/docs/dita/howto/part-4.dita @@ -1,6 +1,6 @@ - + The Fun Stuff diff --git a/lang/python/docs/dita/howto/part-5.dita b/lang/python/docs/dita/howto/part-5.dita index 77849a0..a779391 100644 --- a/lang/python/docs/dita/howto/part-5.dita +++ b/lang/python/docs/dita/howto/part-5.dita @@ -1,6 +1,6 @@ - + Generating Keys diff --git a/lang/python/docs/dita/howto/part-6.dita b/lang/python/docs/dita/howto/part-6.dita index 01b9427..f86fb04 100644 --- a/lang/python/docs/dita/howto/part-6.dita +++ b/lang/python/docs/dita/howto/part-6.dita @@ -1,6 +1,6 @@ - + Miscellaneous Work-arounds diff --git a/lang/python/docs/dita/howto/part01/docs-source.dita b/lang/python/docs/dita/howto/part01/docs-source.dita index f0a8aff..a9924b4 100644 --- a/lang/python/docs/dita/howto/part01/docs-source.dita +++ b/lang/python/docs/dita/howto/part01/docs-source.dita @@ -1,6 +1,6 @@ - + Documentation Source Files diff --git a/lang/python/docs/dita/howto/part01/examples.dita b/lang/python/docs/dita/howto/part01/examples.dita index afa6619..6671a18 100644 --- a/lang/python/docs/dita/howto/part01/examples.dita +++ b/lang/python/docs/dita/howto/part01/examples.dita @@ -1,6 +1,6 @@ - + Examples diff --git a/lang/python/docs/dita/howto/part01/introduction.dita b/lang/python/docs/dita/howto/part01/introduction.dita index 7b18eb8..9b77b38 100644 --- a/lang/python/docs/dita/howto/part01/introduction.dita +++ b/lang/python/docs/dita/howto/part01/introduction.dita @@ -1,6 +1,6 @@ - + Introduction diff --git a/lang/python/docs/dita/howto/part01/python2-vs-python3.dita b/lang/python/docs/dita/howto/part01/python2-vs-python3.dita index 9766276..cc70b35 100644 --- a/lang/python/docs/dita/howto/part01/python2-vs-python3.dita +++ b/lang/python/docs/dita/howto/part01/python2-vs-python3.dita @@ -1,6 +1,6 @@ - + Python 2 vs. Python 3 diff --git a/lang/python/docs/dita/howto/part02/c-api.dita b/lang/python/docs/dita/howto/part02/c-api.dita index 67736ab..ac8fdd0 100644 --- a/lang/python/docs/dita/howto/part02/c-api.dita +++ b/lang/python/docs/dita/howto/part02/c-api.dita @@ -1,6 +1,6 @@ - + A C API diff --git a/lang/python/docs/dita/howto/part02/context.dita b/lang/python/docs/dita/howto/part02/context.dita index 4b137af..cddde52 100644 --- a/lang/python/docs/dita/howto/part02/context.dita +++ b/lang/python/docs/dita/howto/part02/context.dita @@ -1,6 +1,6 @@ - + Context diff --git a/lang/python/docs/dita/howto/part02/daesh.dita b/lang/python/docs/dita/howto/part02/daesh.dita index 0d02f45..8839710 100644 --- a/lang/python/docs/dita/howto/part02/daesh.dita +++ b/lang/python/docs/dita/howto/part02/daesh.dita @@ -1,6 +1,6 @@ - + The gnupg package created and maintained by Isis Lovecruft diff --git a/lang/python/docs/dita/howto/part02/differences-to-others.dita b/lang/python/docs/dita/howto/part02/differences-to-others.dita index dd3521f..083e523 100644 --- a/lang/python/docs/dita/howto/part02/differences-to-others.dita +++ b/lang/python/docs/dita/howto/part02/differences-to-others.dita @@ -1,6 +1,6 @@ - + Difference between the Python bindings and other GnuPG Python packages diff --git a/lang/python/docs/dita/howto/part02/fundamentals.dita b/lang/python/docs/dita/howto/part02/fundamentals.dita index a81faf5..2c713b0 100644 --- a/lang/python/docs/dita/howto/part02/fundamentals.dita +++ b/lang/python/docs/dita/howto/part02/fundamentals.dita @@ -1,6 +1,6 @@ - + Fundamentals diff --git a/lang/python/docs/dita/howto/part02/gpgme-concepts.dita b/lang/python/docs/dita/howto/part02/gpgme-concepts.dita index 436111b..fd83f44 100644 --- a/lang/python/docs/dita/howto/part02/gpgme-concepts.dita +++ b/lang/python/docs/dita/howto/part02/gpgme-concepts.dita @@ -1,6 +1,6 @@ - + GPGME Concepts diff --git a/lang/python/docs/dita/howto/part02/installation.dita b/lang/python/docs/dita/howto/part02/installation.dita index 4e35dc9..148a615 100644 --- a/lang/python/docs/dita/howto/part02/installation.dita +++ b/lang/python/docs/dita/howto/part02/installation.dita @@ -1,6 +1,6 @@ - + GPGME Python bindings installation diff --git a/lang/python/docs/dita/howto/part02/installing.dita b/lang/python/docs/dita/howto/part02/installing.dita index 91a0cf4..879f6ca 100644 --- a/lang/python/docs/dita/howto/part02/installing.dita +++ b/lang/python/docs/dita/howto/part02/installing.dita @@ -1,6 +1,6 @@ - + Installing diff --git a/lang/python/docs/dita/howto/part02/no-pypi.dita b/lang/python/docs/dita/howto/part02/no-pypi.dita index 8f2b601..5b07c29 100644 --- a/lang/python/docs/dita/howto/part02/no-pypi.dita +++ b/lang/python/docs/dita/howto/part02/no-pypi.dita @@ -1,6 +1,6 @@ - + No PyPI diff --git a/lang/python/docs/dita/howto/part02/no-rest.dita b/lang/python/docs/dita/howto/part02/no-rest.dita index 82cf8e8..2ebb347 100644 --- a/lang/python/docs/dita/howto/part02/no-rest.dita +++ b/lang/python/docs/dita/howto/part02/no-rest.dita @@ -1,6 +1,6 @@ - + No REST diff --git a/lang/python/docs/dita/howto/part02/pyme.dita b/lang/python/docs/dita/howto/part02/pyme.dita index 3ced2dc..b08e2ce 100644 --- a/lang/python/docs/dita/howto/part02/pyme.dita +++ b/lang/python/docs/dita/howto/part02/pyme.dita @@ -1,6 +1,6 @@ - + The PyME package maintained by Martin Albrecht diff --git a/lang/python/docs/dita/howto/part02/python-bindings.dita b/lang/python/docs/dita/howto/part02/python-bindings.dita index 6590fee..cd73f6a 100644 --- a/lang/python/docs/dita/howto/part02/python-bindings.dita +++ b/lang/python/docs/dita/howto/part02/python-bindings.dita @@ -1,6 +1,6 @@ - + Python Bindings diff --git a/lang/python/docs/dita/howto/part02/python-gnupg.dita b/lang/python/docs/dita/howto/part02/python-gnupg.dita index f083a7a..6c52b1b 100644 --- a/lang/python/docs/dita/howto/part02/python-gnupg.dita +++ b/lang/python/docs/dita/howto/part02/python-gnupg.dita @@ -1,6 +1,6 @@ - + The python-gnupg package maintained by Vinay Sajip diff --git a/lang/python/docs/dita/howto/part02/requirements.dita b/lang/python/docs/dita/howto/part02/requirements.dita index 584219d..89cde68 100644 --- a/lang/python/docs/dita/howto/part02/requirements.dita +++ b/lang/python/docs/dita/howto/part02/requirements.dita @@ -1,6 +1,6 @@ - + Requirements diff --git a/lang/python/docs/dita/howto/part03/get-key.dita b/lang/python/docs/dita/howto/part03/get-key.dita index 1e3309c..a49a0f7 100644 --- a/lang/python/docs/dita/howto/part03/get-key.dita +++ b/lang/python/docs/dita/howto/part03/get-key.dita @@ -1,6 +1,6 @@ - + Get Key diff --git a/lang/python/docs/dita/howto/part03/key-counting.dita b/lang/python/docs/dita/howto/part03/key-counting.dita index b26fbd2..a78a7e6 100644 --- a/lang/python/docs/dita/howto/part03/key-counting.dita +++ b/lang/python/docs/dita/howto/part03/key-counting.dita @@ -1,6 +1,6 @@ - + Counting Keys diff --git a/lang/python/docs/dita/howto/part03/key-selection.dita b/lang/python/docs/dita/howto/part03/key-selection.dita index 3e51a4d..41baf36 100644 --- a/lang/python/docs/dita/howto/part03/key-selection.dita +++ b/lang/python/docs/dita/howto/part03/key-selection.dita @@ -1,6 +1,6 @@ - + Key Selection diff --git a/lang/python/docs/dita/howto/part04/basic-functions.dita b/lang/python/docs/dita/howto/part04/basic-functions.dita index a0c64b5..0e8493e 100644 --- a/lang/python/docs/dita/howto/part04/basic-functions.dita +++ b/lang/python/docs/dita/howto/part04/basic-functions.dita @@ -1,6 +1,6 @@ - + Basic Functions diff --git a/lang/python/docs/dita/howto/part04/clear-signing.dita b/lang/python/docs/dita/howto/part04/clear-signing.dita index c610492..f774d06 100644 --- a/lang/python/docs/dita/howto/part04/clear-signing.dita +++ b/lang/python/docs/dita/howto/part04/clear-signing.dita @@ -1,6 +1,6 @@ - + Clear Signatures diff --git a/lang/python/docs/dita/howto/part04/decryption.dita b/lang/python/docs/dita/howto/part04/decryption.dita index e3918c5..4261e69 100644 --- a/lang/python/docs/dita/howto/part04/decryption.dita +++ b/lang/python/docs/dita/howto/part04/decryption.dita @@ -1,6 +1,6 @@ - + Decryption diff --git a/lang/python/docs/dita/howto/part04/default-signing.dita b/lang/python/docs/dita/howto/part04/default-signing.dita index d3a227b..7e2926d 100644 --- a/lang/python/docs/dita/howto/part04/default-signing.dita +++ b/lang/python/docs/dita/howto/part04/default-signing.dita @@ -1,6 +1,6 @@ - + Default Signatures diff --git a/lang/python/docs/dita/howto/part04/detached-signing.dita b/lang/python/docs/dita/howto/part04/detached-signing.dita index 38406ef..ff1e8c4 100644 --- a/lang/python/docs/dita/howto/part04/detached-signing.dita +++ b/lang/python/docs/dita/howto/part04/detached-signing.dita @@ -1,6 +1,6 @@ - + Detached Signatures diff --git a/lang/python/docs/dita/howto/part04/encrypt-to-many.dita b/lang/python/docs/dita/howto/part04/encrypt-to-many.dita index df3454f..34c18b4 100644 --- a/lang/python/docs/dita/howto/part04/encrypt-to-many.dita +++ b/lang/python/docs/dita/howto/part04/encrypt-to-many.dita @@ -1,6 +1,6 @@ - + Encrypting to Multiple Keys diff --git a/lang/python/docs/dita/howto/part04/encrypt-to-one.dita b/lang/python/docs/dita/howto/part04/encrypt-to-one.dita index 2abbe06..275bc19 100644 --- a/lang/python/docs/dita/howto/part04/encrypt-to-one.dita +++ b/lang/python/docs/dita/howto/part04/encrypt-to-one.dita @@ -1,6 +1,6 @@ - + Encrypting to One Key diff --git a/lang/python/docs/dita/howto/part04/encryption.dita b/lang/python/docs/dita/howto/part04/encryption.dita index 572cc9d..63f11f3 100644 --- a/lang/python/docs/dita/howto/part04/encryption.dita +++ b/lang/python/docs/dita/howto/part04/encryption.dita @@ -1,6 +1,6 @@ - + Encryption diff --git a/lang/python/docs/dita/howto/part04/signing-key-selection.dita b/lang/python/docs/dita/howto/part04/signing-key-selection.dita index 34d02b4..1256dad 100644 --- a/lang/python/docs/dita/howto/part04/signing-key-selection.dita +++ b/lang/python/docs/dita/howto/part04/signing-key-selection.dita @@ -1,6 +1,6 @@ - + Signing Key Selection diff --git a/lang/python/docs/dita/howto/part04/signing.dita b/lang/python/docs/dita/howto/part04/signing.dita index 289e374..b1c1b92 100644 --- a/lang/python/docs/dita/howto/part04/signing.dita +++ b/lang/python/docs/dita/howto/part04/signing.dita @@ -1,6 +1,6 @@ - + Signing Text and Files diff --git a/lang/python/docs/dita/howto/part04/verification.dita b/lang/python/docs/dita/howto/part04/verification.dita index d50482a..1b0a8fe 100644 --- a/lang/python/docs/dita/howto/part04/verification.dita +++ b/lang/python/docs/dita/howto/part04/verification.dita @@ -1,6 +1,6 @@ - + Signature Verification diff --git a/lang/python/docs/dita/howto/part05/add-uid.dita b/lang/python/docs/dita/howto/part05/add-uid.dita index 4265d42..d740329 100644 --- a/lang/python/docs/dita/howto/part05/add-uid.dita +++ b/lang/python/docs/dita/howto/part05/add-uid.dita @@ -1,6 +1,6 @@ - + Adding a User ID diff --git a/lang/python/docs/dita/howto/part05/certification.dita b/lang/python/docs/dita/howto/part05/certification.dita index 072c774..a764e10 100644 --- a/lang/python/docs/dita/howto/part05/certification.dita +++ b/lang/python/docs/dita/howto/part05/certification.dita @@ -1,6 +1,6 @@ - + Key Certification diff --git a/lang/python/docs/dita/howto/part05/key-creation.dita b/lang/python/docs/dita/howto/part05/key-creation.dita index 6478bf9..d7152df 100644 --- a/lang/python/docs/dita/howto/part05/key-creation.dita +++ b/lang/python/docs/dita/howto/part05/key-creation.dita @@ -1,6 +1,6 @@ - + Creating Keys and Subkeys diff --git a/lang/python/docs/dita/howto/part05/primary-key.dita b/lang/python/docs/dita/howto/part05/primary-key.dita index 5401dc9..2d09250 100644 --- a/lang/python/docs/dita/howto/part05/primary-key.dita +++ b/lang/python/docs/dita/howto/part05/primary-key.dita @@ -1,6 +1,6 @@ - + Primary Key Creation diff --git a/lang/python/docs/dita/howto/part05/rev-uid.dita b/lang/python/docs/dita/howto/part05/rev-uid.dita index 18d6efb..abe8d8d 100644 --- a/lang/python/docs/dita/howto/part05/rev-uid.dita +++ b/lang/python/docs/dita/howto/part05/rev-uid.dita @@ -1,6 +1,6 @@ - + Revoking a User ID diff --git a/lang/python/docs/dita/howto/part05/subkeys.dita b/lang/python/docs/dita/howto/part05/subkeys.dita index 8149197..47222c5 100644 --- a/lang/python/docs/dita/howto/part05/subkeys.dita +++ b/lang/python/docs/dita/howto/part05/subkeys.dita @@ -1,6 +1,6 @@ - + Subkey Creation diff --git a/lang/python/docs/dita/howto/part05/user-ids.dita b/lang/python/docs/dita/howto/part05/user-ids.dita index 9308c0a..9220954 100644 --- a/lang/python/docs/dita/howto/part05/user-ids.dita +++ b/lang/python/docs/dita/howto/part05/user-ids.dita @@ -1,6 +1,6 @@ - + User IDs diff --git a/lang/python/docs/dita/howto/part06/group-lines.dita b/lang/python/docs/dita/howto/part06/group-lines.dita index 5a63d15..50d63df 100644 --- a/lang/python/docs/dita/howto/part06/group-lines.dita +++ b/lang/python/docs/dita/howto/part06/group-lines.dita @@ -1,6 +1,6 @@ - + Group Lines diff --git a/lang/python/docs/dita/howto/version-info.dita b/lang/python/docs/dita/howto/version-info.dita new file mode 100644 index 0000000..6776820 --- /dev/null +++ b/lang/python/docs/dita/howto/version-info.dita @@ -0,0 +1,14 @@ + + + + + Documentation Version + +

    Version: 0.1.1

    +

    Author: Ben McGinnes <ben at gnupg.org>

    +

    Author GPG Key ID: DB4724E6FA4286C92B4E55C4321E4E2373590E5D

    +

    Language: Australian English, British English

    + +
    +
    ----------------------------------------------------------------------- Summary of changes: lang/python/docs/dita/gpgme-python-howto.ditamap | 24 +++++++++++++++++++++- lang/python/docs/dita/howto/part-1.dita | 2 +- lang/python/docs/dita/howto/part-2.dita | 2 +- lang/python/docs/dita/howto/part-3.dita | 2 +- lang/python/docs/dita/howto/part-4.dita | 2 +- lang/python/docs/dita/howto/part-5.dita | 2 +- lang/python/docs/dita/howto/part-6.dita | 2 +- .../python/docs/dita/howto/part01/docs-source.dita | 2 +- lang/python/docs/dita/howto/part01/examples.dita | 2 +- .../docs/dita/howto/part01/introduction.dita | 2 +- .../docs/dita/howto/part01/python2-vs-python3.dita | 2 +- lang/python/docs/dita/howto/part02/c-api.dita | 2 +- lang/python/docs/dita/howto/part02/context.dita | 2 +- lang/python/docs/dita/howto/part02/daesh.dita | 2 +- .../dita/howto/part02/differences-to-others.dita | 2 +- .../docs/dita/howto/part02/fundamentals.dita | 2 +- .../docs/dita/howto/part02/gpgme-concepts.dita | 2 +- .../docs/dita/howto/part02/installation.dita | 2 +- lang/python/docs/dita/howto/part02/installing.dita | 2 +- lang/python/docs/dita/howto/part02/no-pypi.dita | 2 +- lang/python/docs/dita/howto/part02/no-rest.dita | 2 +- lang/python/docs/dita/howto/part02/pyme.dita | 2 +- .../docs/dita/howto/part02/python-bindings.dita | 2 +- .../docs/dita/howto/part02/python-gnupg.dita | 2 +- .../docs/dita/howto/part02/requirements.dita | 2 +- lang/python/docs/dita/howto/part03/get-key.dita | 2 +- .../docs/dita/howto/part03/key-counting.dita | 2 +- .../docs/dita/howto/part03/key-selection.dita | 2 +- .../docs/dita/howto/part04/basic-functions.dita | 2 +- .../docs/dita/howto/part04/clear-signing.dita | 2 +- lang/python/docs/dita/howto/part04/decryption.dita | 2 +- .../docs/dita/howto/part04/default-signing.dita | 2 +- .../docs/dita/howto/part04/detached-signing.dita | 2 +- .../docs/dita/howto/part04/encrypt-to-many.dita | 2 +- .../docs/dita/howto/part04/encrypt-to-one.dita | 2 +- lang/python/docs/dita/howto/part04/encryption.dita | 2 +- .../dita/howto/part04/signing-key-selection.dita | 2 +- lang/python/docs/dita/howto/part04/signing.dita | 2 +- .../docs/dita/howto/part04/verification.dita | 2 +- lang/python/docs/dita/howto/part05/add-uid.dita | 2 +- .../docs/dita/howto/part05/certification.dita | 2 +- .../docs/dita/howto/part05/key-creation.dita | 2 +- .../python/docs/dita/howto/part05/primary-key.dita | 2 +- lang/python/docs/dita/howto/part05/rev-uid.dita | 2 +- lang/python/docs/dita/howto/part05/subkeys.dita | 2 +- lang/python/docs/dita/howto/part05/user-ids.dita | 2 +- .../python/docs/dita/howto/part06/group-lines.dita | 2 +- lang/python/docs/dita/howto/version-info.dita | 14 +++++++++++++ 48 files changed, 83 insertions(+), 47 deletions(-) create mode 100644 lang/python/docs/dita/howto/version-info.dita hooks/post-receive -- GnuPG Made Easy http://git.gnupg.org From cvs at cvs.gnupg.org Tue May 15 06:47:35 2018 From: cvs at cvs.gnupg.org (by Ben McGinnes) Date: Tue, 15 May 2018 06:47:35 +0200 Subject: [git] GPGME - branch, ben/howto-dita, updated. gpgme-1.11.1-10-gaa4875b Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GnuPG Made Easy". The branch, ben/howto-dita has been updated via aa4875bd06f151bde74972b2dd4220b32a34f39e (commit) from f64d259e1d2a844fdc68c2676dff64e807a97a22 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit aa4875bd06f151bde74972b2dd4220b32a34f39e Author: Ben McGinnes Date: Tue May 15 14:46:11 2018 +1000 docs: python howto DITA * Corrected a minor markup typo. diff --git a/lang/python/docs/dita/howto/part04/encrypt-to-many.dita b/lang/python/docs/dita/howto/part04/encrypt-to-many.dita index 34c18b4..9afbc65 100644 --- a/lang/python/docs/dita/howto/part04/encrypt-to-many.dita +++ b/lang/python/docs/dita/howto/part04/encrypt-to-many.dita @@ -7,7 +7,7 @@

    Encrypting to multiple keys essentially just expands upon the key selection process and the recipients from the previous examples.

    The following example encrypts a message (text) to everyone with an email - address on the gnupg.org domain,You probably don't really want to do + address on the gnupg.org domain,You probably don't really want to do this. Searching the keyservers for "gnupg.org" produces over 400 results, the majority of which aren't actually at the gnupg.org domain, but just included a comment regarding the project in their key somewhere. but does not encrypt to a default key or other ----------------------------------------------------------------------- Summary of changes: lang/python/docs/dita/howto/part04/encrypt-to-many.dita | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) hooks/post-receive -- GnuPG Made Easy http://git.gnupg.org From cvs at cvs.gnupg.org Tue May 15 08:57:48 2018 From: cvs at cvs.gnupg.org (by Ben McGinnes) Date: Tue, 15 May 2018 08:57:48 +0200 Subject: [git] GPGME - branch, ben/howto-dita, updated. gpgme-1.11.1-11-gbb81532 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GnuPG Made Easy". The branch, ben/howto-dita has been updated via bb8153269b3f75d286aad51aca7be1f83cb410c8 (commit) from aa4875bd06f151bde74972b2dd4220b32a34f39e (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit bb8153269b3f75d286aad51aca7be1f83cb410c8 Author: Ben McGinnes Date: Tue May 15 16:55:40 2018 +1000 meta: .gitignore * Added certain DITA XML generated files and output to exclusions, as well as oXygenXML Editor backup filenames, diff --git a/.gitignore b/.gitignore index e5bf69d..eea9911 100644 --- a/.gitignore +++ b/.gitignore @@ -48,6 +48,11 @@ nosetests.xml .project .pydevproject +# DITA XML output +temp/ +out/ +*.bak + # Assorted Apple crap default.profraw .DS_Store ----------------------------------------------------------------------- Summary of changes: .gitignore | 5 +++++ 1 file changed, 5 insertions(+) hooks/post-receive -- GnuPG Made Easy http://git.gnupg.org From cvs at cvs.gnupg.org Tue May 15 09:01:06 2018 From: cvs at cvs.gnupg.org (by Erwin Bronkhorst) Date: Tue, 15 May 2018 09:01:06 +0200 Subject: [git] GpgOL - branch, master, updated. gpgol-2.1.1-7-gb22996a Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GnuPG extension for MS Outlook". The branch, master has been updated via b22996a01b8c90a81c71df0caed0f6f3e20a1f79 (commit) from 8539f6bc595d5539d2a528fe5349c8749549ac68 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit b22996a01b8c90a81c71df0caed0f6f3e20a1f79 Author: Erwin Bronkhorst Date: Mon May 14 22:38:17 2018 +0200 Add Dutch translation * configure.ac: Bump required GPGME version. * po/LINUGUAS: Add dutch. * po/nl.po: New. * po/po/fr.po: Remove spurious file. (cherry picked from commit 64f0522227fa50a11e44e07d4b07cbef9fb8c126) Commit message amended and: Signed-off-by: Andre Heinecke diff --git a/configure.ac b/configure.ac index 821621b..2d1fab6 100644 --- a/configure.ac +++ b/configure.ac @@ -40,7 +40,7 @@ GPGOL_FORMS_REVISION=335 NEED_GPG_ERROR_VERSION=1.9 NEED_GPGME_API=1 -NEED_GPGME_VERSION=1.9.0 +NEED_GPGME_VERSION=1.11.0 NEED_LIBASSUAN_API=2 NEED_LIBASSUAN_VERSION=2.0.0 diff --git a/po/LINGUAS b/po/LINGUAS index 9d388de..343d8de 100644 --- a/po/LINGUAS +++ b/po/LINGUAS @@ -3,5 +3,6 @@ de sv pt fr +nl zh_CN zh_TW diff --git a/po/nl.po b/po/nl.po new file mode 100644 index 0000000..a17ca7d --- /dev/null +++ b/po/nl.po @@ -0,0 +1,1254 @@ +# nl.po - Dutch translation for GpgOL +# Copyright (C) 2018 g10 Code GmbH +# This file is distributed under the same license as the GpgOL package. +# Erwin Bronkhorst , 2018. +# +msgid "" +msgstr "" +"Project-Id-Version: GpgOL 2.1.1\n" +"Report-Msgid-Bugs-To: bug-gpgol at g10code.com\n" +"POT-Creation-Date: 2018-05-14 22:29+0200\n" +"PO-Revision-Date: 2018-05-14 22:49+0200\n" +"Last-Translator: Erwin Bronkhorst \n" +"Language-Team: \n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 1.8.11\n" + +#: src/addin-options.cpp:42 src/gpgoladdin.cpp:1264 src/gpgoladdin.cpp:1347 +#: src/gpgoladdin.cpp:1426 src/olflange-dlgs.cpp:43 +msgid "General" +msgstr "Algemeen" + +#: src/addin-options.cpp:43 src/olflange-dlgs.cpp:44 +msgid "Enable the S/MIME support" +msgstr "S/MIME-ondersteuning inschakelen" + +#: src/addin-options.cpp:45 +msgid "Enable simplified interface (experimental)" +msgstr "Vereenvoudigde interface inschakelen (experimenteel)" + +#: src/addin-options.cpp:48 src/olflange-dlgs.cpp:46 +msgid "Message sending" +msgstr "Versturen van bericht" + +#: src/addin-options.cpp:49 src/olflange-dlgs.cpp:47 +msgid "&Encrypt new messages by default" +msgstr "Nieuwe berichten standaard &versleutelen" + +#: src/addin-options.cpp:50 src/olflange-dlgs.cpp:48 +msgid "&Sign new messages by default" +msgstr "Nieuwe berichten standaard &ondertekenen" + +#: src/addin-options.cpp:51 +msgid "&Send OpenPGP mails without attachments as PGP/Inline" +msgstr "OpenPGP-e-mailberichten zonder bijlage als PGP/Inline verzenden" + +#: src/addin-options.cpp:53 +msgid "S&elect crypto settings automatically for reply and forward" +msgstr "" +"Bij beantwoorden en doorsturen de versleutelings-instellingen automatisch " +"selecteren" + +#: src/addin-options.cpp:55 +msgid "&Resolve recipient keys automatically" +msgstr "Automatisch sleutels van ontvanger opzoeken" + +#: src/addin-options.cpp:58 +msgid "Debug..." +msgstr "Debug..." + +#: src/addin-options.cpp:59 +msgid "Configure GnuPG" +msgstr "GnuPG configureren" + +#: src/addin-options.cpp:60 +msgid "Version " +msgstr "Versie" + +#: src/addin-options.cpp:134 src/ribbon-callbacks.cpp:1794 +msgid "" +"Could not find Kleopatra.\n" +"Please reinstall Gpg4win with the Kleopatra component enabled." +msgstr "" +"Kleopatra kon niet gevonden worden.\n" +"Installeer Gpg4win opnieuw met het Kleopatra-component ingeschakeld." + +#: src/addin-options.cpp:136 src/addin-options.cpp:196 +#: src/cmdbarcontrols.cpp:105 src/engine.c:377 src/explorers.cpp:204 +#: src/explorers.cpp:209 src/gpgoladdin.cpp:387 src/gpgoladdin.cpp:943 +#: src/gpgoladdin.cpp:986 src/gpgoladdin.cpp:1071 src/gpgoladdin.cpp:1073 +#: src/gpgoladdin.cpp:1110 src/gpgoladdin.cpp:1264 src/gpgoladdin.cpp:1347 +#: src/gpgoladdin.cpp:1353 src/gpgoladdin.cpp:1426 src/gpgoladdin.cpp:1430 +#: src/mail.cpp:838 src/main.c:467 src/message.cpp:303 +#: src/ribbon-callbacks.cpp:134 src/ribbon-callbacks.cpp:248 +#: src/ribbon-callbacks.cpp:263 src/ribbon-callbacks.cpp:275 +#: src/ribbon-callbacks.cpp:312 src/ribbon-callbacks.cpp:324 +#: src/ribbon-callbacks.cpp:669 src/ribbon-callbacks.cpp:686 +#: src/ribbon-callbacks.cpp:700 src/ribbon-callbacks.cpp:713 +#: src/ribbon-callbacks.cpp:736 src/ribbon-callbacks.cpp:796 +#: src/ribbon-callbacks.cpp:1078 src/ribbon-callbacks.cpp:1112 +#: src/ribbon-callbacks.cpp:1124 src/ribbon-callbacks.cpp:1149 +#: src/ribbon-callbacks.cpp:1733 src/ribbon-callbacks.cpp:1744 +#: src/ribbon-callbacks.cpp:1796 src/wks-helper.cpp:442 +#: src/cryptcontroller.cpp:298 +msgid "GpgOL" +msgstr "GpgOL" + +#: src/addin-options.cpp:195 +msgid "Changing the interface requires a restart of Outlook." +msgstr "Het wijzigen van de interface vereist een herstart van Outlook." + +#: src/attached-file-events.cpp:54 +msgid "Error creating file for attachment." +msgstr "Fout bij het maken van bestand voor de bijlage" + +#: src/attached-file-events.cpp:67 +msgid "Error reading attachment." +msgstr "Fout bij het lezen van de bijlage" + +#: src/attached-file-events.cpp:78 src/attached-file-events.cpp:92 +msgid "Error writing attachment." +msgstr "Fout bij het schrijven van de bijlage" + +#: src/attached-file-events.cpp:213 +msgid "" +"Sorry, we are not able to decrypt this attachment.\n" +"\n" +"Please use the decrypt/verify button to decrypt the\n" +"entire message again. Then open this attachment." +msgstr "" +"Sorry, we kunnen de bijlage niet ontcijferen.\n" +"\n" +"Gebruik de knop \"Ontcijferen/verifi?ren\" om het hele\n" +"bericht opnieuw te ontcijferen. Open daarna de bijlage." + +#: src/cmdbarcontrols.cpp:104 +msgid "Could not start certificate manager" +msgstr "De certificaat-manager kan niet worden gestart" + +#: src/common.c:239 +msgid "GpgOL - Save attachment" +msgstr "GpgOL - Bijlage opslaan" + +#: src/common.c:1073 +msgid "GpgOL Error" +msgstr "GpgOL Fout" + +#: src/config-dialog.c:38 +msgid "Debug output (for analysing problems)" +msgstr "Debug-uitvoer (voor probleemanalyse)" + +#: src/engine.c:374 +msgid "" +"The user interface server is not available or could not be started in time. " +"You may want to try again." +msgstr "" +"De gebruikers-interface-server is niet beschikbaar of kon niet op tijd " +"worden gestart. Je kunt het opnieuw proberen." + +#: src/explorers.cpp:126 +msgid "GnuPG Certificate &Manager" +msgstr "GnuPG Certificaat-manager" + +#: src/explorers.cpp:140 +msgid "Remove GpgOL flags from this folder" +msgstr "GpgOL-vlaggen van deze map verwijderen" + +#: src/explorers.cpp:167 +msgid "Open the certificate manager" +msgstr "De certificaat-manager openen" + +#: src/explorers.cpp:194 +msgid "" +"You are about to start the process of reversing messages created by GpgOL to " +"prepare deinstalling of GpgOL. Running this command will put GpgOL into a " +"disabled state so that messages are not anymore processed by GpgOL.\n" +"\n" +"You should convert all folders one after the other with this command, close " +"Outlook and then deinstall GpgOL.\n" +"\n" +"Note that if you start Outlook again with GpgOL still being installed, GpgOL " +"will again process messages." +msgstr "" +"U staat op het punt om berichten terug te draaien die zijn gemaakt door " +"GpgOL om het de?nstalleren van GpgOL voor te bereiden. Door het uitvoeren " +"van dit commando zal GpgOL in een uitgeschakelde toestand komen, zodat " +"berichten niet meer door GpgOL verwerkt worden.\n" +"\n" +"U moet alle mappen een voor een converteren met dit commando, Outlook " +"afsluien en dan GpgOL de?nstalleren.\n" +"\n" +"Let op dat GpgOL deze bestanden opnieuw zal verwerekn als u Outlook start " +"terwijl GpgOL nog ge?nstalleerd is." + +#: src/explorers.cpp:208 +msgid "Do you want to revert this folder?" +msgstr "Wil je deze map herstellen?" + +#: src/gpgoladdin.cpp:519 src/mail.cpp:1806 src/mail.cpp:1877 +msgid "GpgOL: Encrypted Message" +msgstr "GpgOL: Versleuteld bericht" + +#: src/gpgoladdin.cpp:520 src/mail.cpp:1807 src/mail.cpp:1878 +msgid "GpgOL: Trusted Sender Address" +msgstr "GpgOL: Vertrouwd Afzenderadres" + +#: src/gpgoladdin.cpp:879 +msgid "Encrypt the message" +msgstr "Het bericht versleutelen" + +#: src/gpgoladdin.cpp:881 +msgid "Encrypts the message and all attachments before sending" +msgstr "Versleutelt het bericht en alle bijlagen voor verzending" + +#: src/gpgoladdin.cpp:883 +msgid "Sign the message" +msgstr "Het bericht ondertekenen" + +#: src/gpgoladdin.cpp:885 +msgid "Sign the message and all attachments before sending" +msgstr "Het bericht en alle bijlagen ondertekenen voor verzending" + +#: src/gpgoladdin.cpp:888 +msgid "Sign and encrypt the message" +msgstr "Het bericht ondertekenen en versleutelen" + +#: src/gpgoladdin.cpp:890 +msgid "" +"Encrypting and cryptographically signing a message means that the recipients " +"can be sure that no one modified the message and only the recipients can " +"read it" +msgstr "" +"Het versleutelen en cryptografisch ondertekenen van een bericht betekent dat " +"de ontvangers er zeker van kunnen zijn dat niemand het bericht heeft " +"aangepast en dat alleen de ontvangers het kunnen lezen" + +#: src/gpgoladdin.cpp:894 +msgid "Open the settings dialog for GpgOL" +msgstr "Het instellingen-scherm voor GpgOL openen" + +#: src/gpgoladdin.cpp:944 src/gpgoladdin.cpp:1074 +msgid "Secure" +msgstr "Beveiligen" + +#: src/gpgoladdin.cpp:945 src/gpgoladdin.cpp:1075 src/gpgoladdin.cpp:1270 +msgid "Sign" +msgstr "Ondertekenen" + +#: src/gpgoladdin.cpp:946 src/gpgoladdin.cpp:1076 src/gpgoladdin.cpp:1268 +#: src/gpgoladdin.cpp:1275 +msgid "Encrypt" +msgstr "Versleutelen" + +#: src/gpgoladdin.cpp:988 src/gpgoladdin.cpp:1269 src/gpgoladdin.cpp:1275 +#: src/gpgoladdin.cpp:1351 src/gpgoladdin.cpp:1354 src/gpgoladdin.cpp:1355 +msgid "Decrypt" +msgstr "Ontcijferen" + +#: src/gpgoladdin.cpp:1078 +msgid "&Print decrypted" +msgstr "Ontcijferd afdrukken" + +#: src/gpgoladdin.cpp:1136 +msgid "Start the Certificate Management Software" +msgstr "De Certificaat-manager-software starten" + +#: src/gpgoladdin.cpp:1138 +msgid "" +"Open GPA or Kleopatra to manage your certificates. You can use this you to " +"generate your own certificates. " +msgstr "" +"Open GPA of Kleopatra om uw certificaten te beheren. U kunt dit gebruiken om " +"eigen certificaten te genereren. " + +#: src/gpgoladdin.cpp:1142 +msgid "Encrypt the text of the message" +msgstr "De tekst van het bericht versleutelen" + +#: src/gpgoladdin.cpp:1144 +msgid "" +"Choose the certificates for which the message should be encrypted and " +"replace the text with the encrypted message." +msgstr "" +"Kies de certificaten waarmee de berichten moeten worden versleuteld en " +"vervang de tekst met het versleutelde bericht." + +#: src/gpgoladdin.cpp:1148 +msgid "Add a file as an encrypted attachment" +msgstr "Een bestand toevoegen als een versleutelde bijlage" + +#: src/gpgoladdin.cpp:1150 +msgid "Encrypts a file and adds it as an attachment to the message. " +msgstr "" +"Versleutelt een bestand en voegt het als een bijlage toe aan het bericht." + +#: src/gpgoladdin.cpp:1153 +msgid "Add a file as an encrypted attachment with a signature" +msgstr "Een bestand als versleutelde bijlage met een handtekening toevoegen" + +#: src/gpgoladdin.cpp:1155 +msgid "" +"Encrypts a file, signs it and adds both the encrypted file and the signature " +"as attachments to the message. " +msgstr "" +"Versleutelt een bestand, ondertekent het en voegt zowel het versleutelde " +"bestand als de handtekening als bijlage toe aan het bericht. " + +#: src/gpgoladdin.cpp:1158 +msgid "Decrypt the message" +msgstr "Het bericht ontcijferen" + +#: src/gpgoladdin.cpp:1160 +msgid "" +"Look for PGP or S/MIME encrypted data in the message text and decrypt it." +msgstr "" +"Naar PGP- of S/MIME-versleutelde data zoeken in de bericht-tekst en het " +"ontcijferen." + +#: src/gpgoladdin.cpp:1163 +msgid "Add a signature of the message" +msgstr "Een handtekening aan het bericht toevoegen" + +#: src/gpgoladdin.cpp:1165 +msgid "" +"Appends a signed copy of the message text in an opaque signature. An opaque " +"signature ensures that the signed text is not modified by embedding it in " +"the signature itself. The combination of the signed message text and your " +"signature is added below the plain text. The message will not be encrypted!" +msgstr "" +"Voegt een ondertekende kopie van de bericht-tekst toe in een opaque " +"handtekening. Een opaque handtekening garandeert dat de ondertekende tekst " +"niet is aangepast door dit in de handtekening zelf te verwerken. De " +"combinatie van de ondertekende bericht-tekst en uw handtekening wordt onder " +"de platte tekst toegevoegd. Het bericht zal niet versleuteld worden!" + +#: src/gpgoladdin.cpp:1172 +msgid "Open the settings dialog for GpgOL." +msgstr "Het instellingen-scherm voor GpgOL openen." + +#: src/gpgoladdin.cpp:1265 src/gpgoladdin.cpp:1348 src/gpgoladdin.cpp:1427 +msgid "Start Certificate Manager" +msgstr "Certifcaat-manager starten" + +#: src/gpgoladdin.cpp:1267 src/gpgoladdin.cpp:1350 +msgid "Textbody" +msgstr "Hoofdtekst" + +#: src/gpgoladdin.cpp:1271 src/gpgoladdin.cpp:1352 +msgid "Verify" +msgstr "Verifi?ren" + +#: src/gpgoladdin.cpp:1272 +msgid "Attachments" +msgstr "Bijlagen" + +#: src/gpgoladdin.cpp:1273 +msgid "Encrypted file" +msgstr "Versleuteld bestand" + +#: src/gpgoladdin.cpp:1274 +msgid "Encrypted file and Signature" +msgstr "Verleuteld bestand en Handtekening" + +#: src/gpgoladdin.cpp:1353 src/gpgoladdin.cpp:1430 src/gpgoladdin.cpp:1431 +msgid "Save and decrypt" +msgstr "Opslaan en ontcijferen" + +#: src/inspectors.cpp:690 +msgid "&encrypt message with GnuPG" +msgstr "bericht met GnuPG versleutelen" + +#: src/inspectors.cpp:704 +msgid "&sign message with GnuPG" +msgstr "bericht met GnuPG ondertekenen" + +#: src/inspectors.cpp:730 +msgid "GpgOL Decrypt/Verify" +msgstr "GpgOL Ontcijferen/Verifi?ren" + +#: src/inspectors.cpp:791 +msgid "Encrypt message with GnuPG" +msgstr "Bericht met GnuPG versleutelen" + +#: src/inspectors.cpp:807 +msgid "Sign message with GnuPG" +msgstr "Bericht met GnuPG ondertekenen" + +#: src/inspectors.cpp:924 +msgid "" +"This is a signed and encrypted message.\n" +"Click for more information. " +msgstr "" +"Dit is een ondertekend en versleuteld bericht.\n" +"Klik hier voor meer informatie. " + +#: src/inspectors.cpp:930 +msgid "" +"This is a signed message.\n" +"Click for more information. " +msgstr "" +"Dit is een ondertekend bericht.\n" +"Klik hier voor meer informatie. " + +#: src/inspectors.cpp:936 +msgid "" +"This is an encrypted message.\n" +"Click for more information. " +msgstr "" +"Dit is een versleuteld bericht.\n" +"Klik hier voor meer informatie. " + +#: src/mail.cpp:325 +msgid "" +"Not all attachments were encrypted or signed.\n" +"The unsigned / unencrypted attachments are:\n" +"\n" +msgstr "" +"Niet alle bijlagen zijn versleuteld of ondertekend.\n" +"De niet-versleutelde/ondertekende bijlagen zijn:\n" +"\n" + +#: src/mail.cpp:330 +msgid "" +"Not all attachments were signed.\n" +"The unsigned attachments are:\n" +"\n" +msgstr "" +"Niet alle bijlagen zijn ondertekend.\n" +"De niet-ondertekende bijlagen zijn:\n" +"\n" + +#: src/mail.cpp:335 +msgid "" +"Not all attachments were encrypted.\n" +"The unencrypted attachments are:\n" +"\n" +msgstr "" +"Niet alle bijlagen zijn versleuteld.\n" +"De niet-versleutelde bijlagen zijn:\n" +"\n" + +#: src/mail.cpp:375 +msgid "" +"Note: The attachments may be encrypted or signed on a file level but the " +"GpgOL status does not apply to them." +msgstr "" +"Let op: De bijlagen zouden op bestands-niveau versleuteld of ondertekend " +"kunnen zijn, maar de GpgOL-status is daarop niet van toepassing." + +#: src/mail.cpp:378 +msgid "GpgOL Warning" +msgstr "GpgOL Waarschuwing" + +#: src/mail.cpp:836 +#, c-format +msgid "" +"Crypto operation failed:\n" +"%s" +msgstr "" +"Crypto-bewerking mislukt:\n" +"(%s)" + +#: src/mail.cpp:937 +msgid "Pubkey directory confirmation" +msgstr "Bevestiging van map publieke sleutel" + +#: src/mail.cpp:938 +msgid "" +"This is a confirmation request to publish your Pubkey in the directory for " +"your domain.\n" +"\n" +"

    If you did not request to publish your Pubkey in your providers " +"directory, simply ignore this message.

    \n" +msgstr "" +"Dit is een verzoek om te bevestigen dat u uw publieke sleutel wilt " +"publiceren in de map voor uw domein.\n" +"\n" +"

    Als u niet heeft verzocht om uw publieke sleutel in de map van uw " +"provider te publiceren, negeer dan dit bericht.

    \n" + +#: src/mail.cpp:946 +msgid "message" +msgstr "bericht" + +#: src/mail.cpp:947 +msgid "Please wait while the message is being decrypted / verified..." +msgstr "Een moment geduld voordat het bericht is ontcijferd / geverifieerd..." + +#: src/mail.cpp:1246 +msgid "GpgOL: Oops, G Suite Sync account detected" +msgstr "GpgOL: Oeps, G Suite Sync account gevonden" + +#: src/mail.cpp:1248 +msgid "" +"G Suite Sync breaks outgoing crypto mails with attachments.\n" +"Using crypto and attachments with G Suite Sync is not supported.\n" +"\n" +"See: https://dev.gnupg.org/T3545 for details." +msgstr "" +"G Suite Sync beschadigt uitgaande crypto-berichten met bijlagen.\n" +"Het gebruik van crypto en bijlagen met G Suite Sync wordt niet ondersteund.\n" +"\n" +"Zie: https://dev.gnupg.org/T3545 voor details." + +#: src/mail.cpp:2066 +msgid "Security Level 4" +msgstr "Veiligheidsniveau 4" + +#: src/mail.cpp:2070 +msgid "Trust Level 4" +msgstr "Vertrouwensniveau 4" + +#: src/mail.cpp:2074 +msgid "Security Level 3" +msgstr "Veiligheidsniveau 3" + +#: src/mail.cpp:2078 +msgid "Trust Level 3" +msgstr "Vertrouwensniveau 3" + +#: src/mail.cpp:2082 +msgid "Security Level 2" +msgstr "Veiligheidsniveau 2" + +#: src/mail.cpp:2086 +msgid "Trust Level 2" +msgstr "Vertrouwensniveau 2" + +#: src/mail.cpp:2090 +msgid "Encrypted" +msgstr "Versleuteld" + +#: src/mail.cpp:2099 src/mail.cpp:2101 src/ribbon-callbacks.cpp:1646 +msgid "Insecure" +msgstr "Onveilig" + +#: src/mail.cpp:2113 +msgid "Signed and encrypted message" +msgstr "Ondertekend en versleuteld bericht" + +#: src/mail.cpp:2117 +msgid "Signed message" +msgstr "Ondertekend bericht" + +#: src/mail.cpp:2121 +msgid "Encrypted message" +msgstr "Versleuteld bericht" + +#: src/mail.cpp:2124 src/ribbon-callbacks.cpp:1669 +msgid "Insecure message" +msgstr "Onveilig bericht" + +#: src/mail.cpp:2135 src/mail.cpp:2146 +msgid "You cannot be sure who sent, modified and read the message in transit." +msgstr "" +"Het is niet zeker wie het bericht heeft verzonden of onderweg aangepast of " +"gelezen heeft." + +#: src/mail.cpp:2138 +msgid "The message was signed but the verification failed with:" +msgstr "Het bericht is ondertekend, maar de verificatie is mislukt met:" + +#: src/mail.cpp:2156 +msgid "The encryption was VS-NfD-compliant." +msgstr "De versleuteling is conform VS-NfD." + +#: src/mail.cpp:2160 +msgid "The encryption was not VS-NfD-compliant." +msgstr "De versleuteling is niet conform VS-NfD." + +#: src/mail.cpp:2164 +msgid "You cannot be sure who sent the message because it is not signed." +msgstr "" +"Het is niet zeker wie dit bericht heeft verzonden omdat het niet is " +"ondertekend" + +#: src/mail.cpp:2187 +msgid "You signed this message." +msgstr "U heeft dit bericht ondertekend." + +#: src/mail.cpp:2191 +msgid "The senders identity was certified by yourself." +msgstr "De identiteit van de verzender is door uzelf gecertificeerd." + +#: src/mail.cpp:2195 +msgid "The sender is allowed to certify identities for you." +msgstr "De verzender heeft toestemming om identiteiten voor u te certificeren." + +#: src/mail.cpp:2208 +msgid "The senders identity was certified by several trusted people." +msgstr "" +"De identiteit van de verzender is gecertificeerd door verschillende " +"vertrouwde mensen." + +#: src/mail.cpp:2213 +#, c-format +msgid "" +"The senders identity is certified by the trusted issuer:\n" +"'%s'\n" +msgstr "" +"De identiteit van de verzender is gecertificeerd door de vertrouwde " +"verlener:\n" +"'%s'\n" + +#: src/mail.cpp:2221 +msgid "Some trusted people have certified the senders identity." +msgstr "" +"Enkele vertrouwde personen hebben de identiteit van de verzender " +"gecertificeerd." + +#: src/mail.cpp:2231 +#, c-format +msgid "" +"The senders address is trusted, because you have established a communication " +"history with this address starting on %s.\n" +"You encrypted %i and verified %i messages since." +msgstr "" +"Het adres van de verzender is vertrouwd, omdat u een communicatie-" +"geschiedenis heb opgebouwd met dit adres vanaf %s.\n" +"U heeft sindsdien %i berichten versleuteld en %i berichten geverifieerd." + +#: src/mail.cpp:2247 +msgid "The senders signature was verified for the first time." +msgstr "De handtekening van de verzender is voor het eerst geverifieerd." + +#: src/mail.cpp:2254 +#, c-format +msgid "" +"The senders address is not trustworthy yet because you only verified %i " +"messages and encrypted %i messages to it since %s." +msgstr "" +"Het adres van de verzender is nog niet betrouwbaar omdat u nog maar %i " +"berichten heeft geverifieerd en %i berichten heeft versleuteld sinds %s." + +#: src/mail.cpp:2268 +msgid "But the sender address is not trustworthy because:" +msgstr "Maar het adres van de verzender is niet betrouwbaar vanwege:" + +#: src/mail.cpp:2269 +msgid "The sender address is not trustworthy because:" +msgstr "Het adres van de verzender is niet betrouwbaar vanwege:" + +#: src/mail.cpp:2277 +msgid "The signature is invalid: \n" +msgstr "De handtekening is ongeldig:\n" + +#: src/mail.cpp:2282 +msgid "There was an error verifying the signature.\n" +msgstr "Fout bij het verifi?ren van de handtekening.\n" + +#: src/mail.cpp:2286 +msgid "The signature is expired.\n" +msgstr "De handtekening is verlopen.\n" + +#: src/mail.cpp:2290 +msgid "The used key" +msgstr "De gebruikte sleutel" + +#: src/mail.cpp:2290 +msgid "The used certificate" +msgstr "Het gebruikte certificaat" + +#: src/mail.cpp:2298 +msgid "is not available." +msgstr "is niet beschikbaar." + +#: src/mail.cpp:2302 +msgid "is revoked." +msgstr "is ingetrokken." + +#: src/mail.cpp:2306 +msgid "is expired." +msgstr "is verlopen." + +#: src/mail.cpp:2310 +msgid "is not meant for signing." +msgstr "is niet bedoeld voor ondertekening." + +#: src/mail.cpp:2314 src/mail.cpp:2318 +msgid "could not be checked for revocation." +msgstr "kan niet worden geverifieerd op intrekking." + +#: src/mail.cpp:2323 +msgid "is not the same as the key that was used for this address in the past." +msgstr "" +"is niet dezelfde als de sleutel die in het verleden voor dit adres is " +"gebruikt." + +#: src/mail.cpp:2329 +#, c-format +msgid "does not claim the address: \"%s\"." +msgstr "claimt het adres: \"%s\" niet." + +#: src/mail.cpp:2342 +msgid "is not certified by any trustworthy key." +msgstr "is niet certificeerd door een betrouwbare sleutel." + +#: src/mail.cpp:2346 +msgid "" +"is not certified by a trustworthy Certificate Authority or the Certificate " +"Authority is unknown." +msgstr "" +"is niet gecertificeerd door een betrouwbare certificeringsinstantie of de " +"certificeringsinstantie is onbekend." + +#: src/mail.cpp:2351 +msgid "The sender marked this address as revoked." +msgstr "De verzender heeft dit adres als ingetrokken gemarkeerd." + +#: src/mail.cpp:2355 +msgid "is marked as not trustworthy." +msgstr "is gemarkeerd als onbetrouwbaar." + +#: src/mail.cpp:2365 +msgid "The signature is VS-NfD-compliant." +msgstr "De handtekening is conform VS-NfD." + +#: src/mail.cpp:2369 +msgid "The signature is not VS-NfD-compliant." +msgstr "De handtekening is niet conform VS-NfD." + +#: src/mail.cpp:2377 +msgid "The encryption is VS-NfD-compliant." +msgstr "De versleuteling is conform VS-NfD." + +#: src/mail.cpp:2381 +msgid "The encryption is not VS-NfD-compliant." +msgstr "De versleuteling is niet conform VS-NfD." + +#: src/mail.cpp:2392 +msgid "Click here to change the key used for this address." +msgstr "Klik hier om de sleutel voor dit adres te wijzigen." + +#: src/mail.cpp:2396 +msgid "Click here for details about the key." +msgstr "Klik hier voor details over de sleutel." + +#: src/mail.cpp:2397 +msgid "Click here for details about the certificate." +msgstr "Klik hier voor details over het certificaat." + +#: src/mail.cpp:2401 +msgid "Click here to search the key on the configured keyserver." +msgstr "Klik hier om de sleutel op de geconfigureerde keyserver te zoeken." + +#: src/mail.cpp:2402 +msgid "Click here to search the certificate on the configured X509 keyserver." +msgstr "" +"Klik hier om het certificaat op de geconfigureerde X509 keyserver te zoeken." + +#: src/mail.cpp:2723 +msgid "GpgOL: Encryption not possible!" +msgstr "GpgOL: Versleutelen niet mogelijk!" + +#: src/mail.cpp:2725 +msgid "" +"Outlook returned an error when trying to send the encrypted mail.\n" +"\n" +"Please restart Outlook and try again.\n" +"\n" +"If it still fails consider using an encrypted attachment or\n" +"switching to PGP/Inline in GpgOL's options." +msgstr "" +"Outlook heeft een fout gerapporteerd tijdens het verzenden van de " +"versleutelde e-mail.\n" +"\n" +"Start Outlook opnieuw op en probeer het nogmaals.\n" +"\n" +"Als het probleem nog steeds optreedt, overweeg dan een versleutelde bijlage " +"te gebruiken,\n" +"of stap over naar PGP/Inline in de opties van GpgOL." + +#: src/mailitem.cpp:160 src/message-events.cpp:279 +msgid "" +"Sorry, we can only encrypt plain text messages and\n" +"no RTF messages. Please make sure that only the text\n" +"format has been selected." +msgstr "" +"Sorry, we kunnen alleen platte tekstberichten versleutelen en\n" +"geen RTF-berichten. Zorg ervoor dat de optie \"Tekst zonder opmaak\"\n" +"geselecteerd is." + +#: src/mailitem-events.cpp:313 src/mailitem-events.cpp:805 +msgid "Sorry, that's not possible, yet" +msgstr "Sorry, dat is nog niet mogelijk" + +#: src/mailitem-events.cpp:315 +#, c-format +msgid "" +"GpgOL has prevented the change to the \"%s\" property.\n" +"Property changes are not yet handled for crypto messages.\n" +"\n" +"To workaround this limitation please change the property when the message is " +"not open in any window and not selected in the messagelist.\n" +"\n" +"For example by right clicking but not selecting the message.\n" +msgstr "" +"GpgOL heeft de wijziging van de \"%s\" eigenschap voorkomen.\n" +"Wijzigingen in eigenschappen worden nog niet door crypto-berichten " +"afgehandeld.\n" +"\n" +"Een manier om hier omheen te werken, is door de eigenschap te wijzigen " +"zonder dat het bericht geopend is en niet is geselecteerd in de " +"berichtenlijst.\n" +"\n" +"Bijvoorbeeld door met de rechtermuisknop op het bericht te klikken zonder " +"dat deze geselecteerd is.\n" + +#: src/mailitem-events.cpp:802 +msgid "" +"Attachments are part of the crypto message.\n" +"They can't be permanently removed and will be shown again the next time this " +"message is opened." +msgstr "" +"Bijlagen zijn onderdeel van het crypto-bericht.\n" +"Ze kunnen niet permanent verwijderd worden en zullen de volgende keer dat " +"dit bericht wordt geopend, weer getoond worden." + +#: src/main.c:466 +#, c-format +msgid "Note: Using compatibility flags: %s" +msgstr "Let op: De volgende compatibiliteits-opties worden gebruikt: %s" + +#: src/mapihelp.cpp:1923 src/mapihelp.cpp:1931 src/mapihelp.cpp:1939 +msgid "[no subject]" +msgstr "[geen onderwerp]" + +#: src/mapihelp.cpp:2564 +msgid "" +"[The content of this message is not visible because it has been decrypted by " +"another Outlook session. Use the \"decrypt/verify\" command to make it " +"visible]" +msgstr "" +"[De inhoud van dit bericht is niet zichtbaar omdat het in een andere sessie " +"van Outlook is ontcijferd. Gebruik het \"Ontcijferen/Verifi?ren\"-commando " +"om het zichtbaar te maken]" + +#: src/mapihelp.cpp:3458 +msgid "" +"[The content of this message is not visible due to an processing error in " +"GpgOL.]" +msgstr "" +"[De inhoud van dit bericht is niet zichtbaar door een verwerkingsfout in " +"GpgOL.]" + +#: src/message.cpp:181 +msgid "[Crypto operation failed - can't show the body of the message]" +msgstr "" +"[De crypto-handeling is mislukt - de hoofdtekst van het bericht kan niet " +"weergegeven worden]" + +#: src/message.cpp:283 +#, c-format +msgid "" +"Signature status: %s\n" +"Message class ..: %s\n" +"MIME structure .:\n" +"%s" +msgstr "" +"Status handtekening: %s\n" +"Berichtklasse .....: %s\n" +"MIME structuur ....:\n" +"%s" + +#: src/message.cpp:291 +msgid "GpgOL - Message Information" +msgstr "GpgOL - Berichtinformatie" + +#: src/message.cpp:523 +msgid "Signature verification of an encrypted message is not possible." +msgstr "" +"Verificatie van de handtekening van een versleuteld bericht is niet mogelijk." + +#: src/message.cpp:534 +msgid "Signature verification of this message class is not possible." +msgstr "" +"Verificatie van de handtekening van deze berichtklasse is niet mogelijk." + +#: src/message.cpp:537 +msgid "" +"Signature verification of this S/MIME message is not possible. Please check " +"that S/MIME processing has been enabled." +msgstr "" +"Verificatie van de handtekening van dit S/MIME-bericht is niet mogelijk. " +"Controleer dat S/MIME-verwerking is ingeschakeld." + +#: src/message.cpp:541 +msgid "This message has no signature." +msgstr "Dit bericht heeft geen handtekening." + +#: src/message.cpp:710 +msgid "This message is not encrypted." +msgstr "Dit bericht is niet versleuteld." + +#: src/message.cpp:938 +#, c-format +msgid "" +"Decryption failed\n" +"(%s)" +msgstr "" +"Ontcijferen mislukt\n" +"(%s)" + +#: src/message.cpp:1109 +msgid "No recipients to encrypt to are given" +msgstr "Er zijn geen ontvangers voor de versleuteling opgegeven" + +#: src/message.cpp:1124 src/message.cpp:1151 +msgid "Encrypting or signing an empty message is not possible." +msgstr "" +"Het versleutelen of ondertekenen van een leeg bericht is niet mogelijk." + +#: src/message.cpp:1132 +#, c-format +msgid "Encryption failed (%s)" +msgstr "Versleutelen mislukt (%s)" + +#: src/message.cpp:1160 +#, c-format +msgid "Signing failed (%s)" +msgstr "Ondertekenen mislukt (%s)" + +#: src/mimeparser.c:1213 +msgid "Error writing to stream" +msgstr "Fout bji het schrijven naar de stream" + +#: src/mimeparser.c:1214 +msgid "I/O-Error" +msgstr "I/O-fout" + +#: src/olflange.cpp:568 +msgid "Welcome to GpgOL " +msgstr "Welkom bij GpgOL " + +#: src/olflange.cpp:569 +msgid "" +"GpgOL adds integrated OpenPGP and S/MIME encryption and digital signing " +"support to Outlook 2003 and 2007.\n" +"\n" +"Although we tested this software extensively, we can't give you any " +"guarantee that it will work as expected. The programming interface we are " +"using has not been properly documented by Microsoft and thus the " +"functionality of GpgOL may cease to work with an update of your Windows " +"system.\n" +"\n" +"WE STRONGLY ADVISE TO RUN ENCRYPTION TESTS BEFORE YOU START TO USE GPGOL ON " +"ANY SENSITIVE DATA!\n" +"\n" +"There are some known problems, the most severe being that sending encrypted " +"or signed mails using an Exchange based account does not work. Using GpgOL " +"along with other Outlook plugins may in some cases not work.\n" +msgstr "" +"GpgOL voegt ge?ntegreerde ondersteuning toe voor versleuteling en digitale " +"ondertekening op basis van OpenPGP en S/MIME aan Outlook 2003 en 2007.\n" +"\n" +"Hoewel we deze software uitvoerig testen, kunnen we geen enkele garantie " +"geven dat het werkt zoals verwacht. De programmeer-interface die we " +"gebruiker is niet goed gedocumenteerd door Microsoft en dus kan het zijn dat " +"de functionaliteit van GpgOL niet meer werkt met een updat van uw Windows-" +"systeem.\n" +"\n" +"HET WORDT STERK AANGERADEN OM VERSLEUTELINGS-TESTEN UIT TE VOEREN ALVORENS U " +"GPGOL OP VERTROUWELIJKE GEGEVENS GEBRUIKT!\n" +"\n" +"Er zijn enkele bekende problemen, waarvan het niet kunnen verzenden van " +"versleutelde of ondertekende e-mail met een op Exchange gebaseerd account de " +"meest ernstige is. Het gebruik van GpgOL met andere Outlook-" +"invoegtoepassingen kan in bepaalde gevallen niet werken.\n" + +#: src/olflange.cpp:595 +msgid "" +"You have installed a new version of GpgOL.\n" +"\n" +"Please open the option dialog and confirm that the settings are correct for " +"your needs. The option dialog can be found in the main menu at: Extras-" +">Options->GpgOL.\n" +msgstr "" +"U heeft een nieuwe versie van GpgOL ge?nstalleerd.\n" +"\n" +"Open het opties-scherm en controleer of de instellingen nog correct zijn. " +"Het opties-scherm kan gevonden worden via het hoofdmenu via Extras->Opties-" +">GpgOL.\n" + +#: src/olflange.cpp:796 +msgid "" +"This version of Outlook is too old!\n" +"\n" +"At least versions of Outlook 2003 older than SP2 exhibit crashes when " +"sending messages and messages might get stuck in the outgoing queue.\n" +"\n" +"Please update at least to SP2 before trying to send a message" +msgstr "" +"Deze versie van Outlook is te oud!\n" +"\n" +"Versies van Outlook 2003 ouder dan SP2 ondervinden crashes bij het verzenden " +"van berichten en berichten kunnen blijven hangen in de uitgaande wachtrij.\n" +"\n" +"Update naar tenmiste SP2 alvorens een bericht te verzenden" + +#: src/olflange.cpp:811 +msgid "" +"GpgOL for Outlook 2003 / 2007 is longer maintained.\n" +"\n" +"Please note that any support may be removed in a future version." +msgstr "" +"GpgOL voor Outlook 2003 / 2007 word niet langer onderhouden.\n" +"\n" +"Hou er rekening mee dat de ondersteuning in een toekomstige versie kan " +"worden verwijderd." + +#: src/olflange-dlgs.cpp:50 +msgid "Message receiving" +msgstr "Ontvangen van bericht" + +#: src/olflange-dlgs.cpp:52 +msgid "Show HTML view if possible" +msgstr "HTML-weergave tonen indien mogelijk" + +#: src/olflange-dlgs.cpp:53 +msgid "Present encrypted message as attachment" +msgstr "Het versleutelde bericht als bijlage aanbieden" + +#: src/olflange-dlgs.cpp:56 +msgid "Crypto Engine" +msgstr "Versleutelingsengine" + +#. TRANSLATORS: See the source for the full english text. +#: src/olflange-dlgs.cpp:256 +msgid "-#GpgOLFullHelpText#-" +msgstr "" +"GpgOL is een invoegtoepassing voor Outlook die het mogelijk maakt\n" +"om berichten te versleutelen en ondertekenen met de OpenPGP- en\n" +"S/MIME-standaarden.\n" +"GpgOL gebruikt de GnuPG-software (http://www.gnupg.org). De meest\n" +"recente uitgave-informatie kan worden ingezien door op het logo\n" +"te klikken.\n" +"\n" +"GpgOL is vrijwe software; u kunt het verspreiden en/of aanpassen\n" +"onder de voorwaarden van de GNU Lesser General Public License\n" +"zoals gepubliceerd bij de Free Software Foundation; zowel versie\n" +"2.1 van de licentie, of (naar eigen keuze) elke nieuwere versie.\n" +"\n" +"GpgOL wordt verspreid in de hoop dat het bruikbaar zal zijn,\n" +"maar ZONDER ENIGE GARANTIE; zonder ook maar de impliciete garantie\n" +"van VERKOOPBAARHEID of TOEPASSING VOOR EEN BEPAALD DOEL. Zie de\n" +"GNU Lesser General Public LIcense voor meer details.\n" +"\n" +"U zou een kopie van de GNU Lesser General Public License\n" +"ontvangen moeten hebben bij dit programma; zo niet,\n" +"zie ." + +#: src/olflange-dlgs.cpp:262 +#, c-format +msgid "This is GpgOL version %s" +msgstr "Dit is GpgOL versie %s" + +#: src/parsecontroller.cpp:162 +msgid "Unknown Key:" +msgstr "Onbekende sleutel:" + +#: src/parsecontroller.cpp:177 +msgid "Decryption canceled or timed out." +msgstr "Ontcijferen afgebroken of verlopen." + +#: src/parsecontroller.cpp:191 +msgid "" +"No secret key found to decrypt the message. It is encrypted to the following " +"keys:" +msgstr "" +"Er kon geen geheime sleutel gevonden worden om het bericht te ontcijferen. " +"Het is versleuteld met de volgende sleutels:" + +#: src/parsecontroller.cpp:197 +msgid "Could not decrypt the data: " +msgstr "De gegevens kunnen niet ontcijferd worden: " + +#: src/parsecontroller.cpp:201 +msgid "Failed to parse the mail." +msgstr "Fout bij het verwerken van de e-mail" + +#: src/parsecontroller.cpp:212 src/parsecontroller.cpp:269 +msgid "Encrypted message (decryption not possible)" +msgstr "Versleuteld bericht (ontcijferen niet mogelijk)" + +#: src/parsecontroller.cpp:270 +msgid "" +"Failed to find GnuPG please ensure that GnuPG or Gpg4win is properly " +"installed." +msgstr "" +"GnuPG kon niet gevonden worden. Controleer dat GnuPG of Gpg4win correct " +"ge?nstalleerd is." + +#: src/ribbon-callbacks.cpp:262 +msgid "Please select text to encrypt." +msgstr "Selecteer een tekst om te versleutelen." + +#: src/ribbon-callbacks.cpp:274 +msgid "Textbody empty." +msgstr "Hoofdtekst leeg." + +#: src/ribbon-callbacks.cpp:323 src/ribbon-callbacks.cpp:1077 +msgid "Please add at least one recipent." +msgstr "Voeg ten minste ??n ontvanger toe." + +#: src/ribbon-callbacks.cpp:685 +msgid "Please select a Mail." +msgstr "Selecteer een e-mailbericht." + +#: src/ribbon-callbacks.cpp:699 +msgid "Please select the data you wish to decrypt." +msgstr "Selecteer de gegevens om te ontcijferen." + +#: src/ribbon-callbacks.cpp:712 +msgid "Nothing to decrypt." +msgstr "Niets om te ontcijferen." + +#: src/ribbon-callbacks.cpp:891 +msgid "Plain text" +msgstr "Platte tekst" + +#: src/ribbon-callbacks.cpp:892 +msgid "Signed text" +msgstr "Ondertekende tekst" + +#: src/ribbon-callbacks.cpp:1084 +msgid "Select file to encrypt" +msgstr "Selecteer een bestand om te versleutelen" + +#: src/ribbon-callbacks.cpp:1673 +msgid "No message selected" +msgstr "Geen bericht geselecteerd" + +#: src/ribbon-callbacks.cpp:1730 +#, c-format +msgid "" +"The message was not cryptographically signed.\n" +"There is no additional information available if it was actually sent by '%s' " +"or if someone faked the sender address." +msgstr "" +"Het bericht is niet cryptografisch ondertekend.\n" +"Er is geen aanvullende informatie beschikbaar over of het daadwerkelijk door " +"'%s' is verzonden of dat iemand het afzender-adres heeft vervalst." + +#: src/ribbon-callbacks.cpp:1741 +msgid "" +"There was an error verifying the signature.\n" +"Full details:\n" +msgstr "" +"Fout bij het verifi?ren van de handtekening.\n" +"Volledige details:\n" + +#: src/wks-helper.cpp:404 +msgid "" +"A Pubkey directory is available for your domain.\n" +"\n" +"Register your Pubkey in that directory to make\n" +"it easy for others to send you encrypted mail.\n" +"\n" +"It's secure and free!\n" +"\n" +"Register automatically?" +msgstr "" +"Er is een map voor publieke sleutels beschikbaar op uw domein.\n" +"\n" +"Registreer uw publieke sleutel in die map om het makkelijk\n" +"te maken voor anderen om u versleutelde e-mail te sturen.\n" +"\n" +"Het is veilig en gratis!\n" +"\n" +"Automatisch registreren?" + +#: src/wks-helper.cpp:409 +msgid "GpgOL: Pubkey directory available!" +msgstr "GpgOL: Map voor publieke sleutels beschikbaar!" + +#: src/wks-helper.cpp:491 +msgid "GpgOL: Directory request failed" +msgstr "GpgOL: Mapverzoek mislukt" + +#: src/wks-helper.cpp:504 +msgid "" +"You might receive a confirmation challenge from\n" +"your provider to finish the registration." +msgstr "" +"U kun bevestigingsverzoek van uw provider ontvangen\n" +"om de registratie te voltooien." + +#: src/wks-helper.cpp:506 +msgid "GpgOL: Registration request sent!" +msgstr "GpgOL: Verzoek tot registratie verstuurd!" + +#: src/wks-helper.cpp:693 +msgid "Confirm registration?" +msgstr "Registratie bevestigen?" + +#: src/wks-helper.cpp:694 +msgid "GpgOL: Pubkey directory confirmation" +msgstr "GpgOL: Bevestiging van map voor publieke sleutels" + +#: src/wks-helper.cpp:747 +msgid "GpgOL: Confirmation failed" +msgstr "GpgOL: Bevestiging mislukt" + +#: src/wks-helper.cpp:759 +msgid "Your Pubkey can soon be retrieved from your domain." +msgstr "Uw publieke sleutel kan spoedig worden opgehaald van uw domein." + +#: src/wks-helper.cpp:760 +msgid "GpgOL: Request confirmed!" +msgstr "GpgOL: Verzoek bevestigd!" + +#: src/cryptcontroller.cpp:297 +msgid "No recipients for encryption selected." +msgstr "Er zijn geen ontvangers voor de versleuteling geselecteerd." + +#: src/cryptcontroller.cpp:406 +msgid "Resolving recipients..." +msgstr "Ontvangers opzoeken..." + +#: src/cryptcontroller.cpp:410 +msgid "Resolving signers..." +msgstr "Ondertekenaars opzoeken..." + +#: src/cryptcontroller.cpp:1052 +msgid "Encrypting..." +msgstr "Versleutelen..." + +#: src/cryptcontroller.cpp:1056 +msgid "Signing..." +msgstr "Ondertekenen..." + +#~ msgid "&Search for OpenPGP keys automatically when encrypting" +#~ msgstr "Automatisch naar OpenPGP-sleutels zoeken tijdens versleutelen" + +#~ msgid "" +#~ "G Suite Sync breaks outgoing signed mails.\n" +#~ "Ensuring mail integrity (signing) with G Suite Sync is not supported.\n" +#~ "\n" +#~ "See: https://dev.gnupg.org/T3545 for details." +#~ msgstr "" +#~ "G Suite Sync beschadigt uitgaande ondertekende berichten.\n" +#~ "Het garanderen van bericht-integriteit (ondertekenen) met G Suite Sync " +#~ "wordt niet ondersteund.\n" +#~ "\n" +#~ "Zie: https://dev.gnupg.org/T3545 voor details." + +#~ msgid "" +#~ "G Suite Sync breaks outgoing signed mails.\n" +#~ "Ensuring mail integrity (signing) with G Suite Sync is not supported.\n" +#~ "\n" +#~ "See: https://dev.gnupg.org/T3545 for details.\n" +#~ "\n" +#~ "Do you want to only encrypt the message?" +#~ msgstr "" +#~ "G Suite Sync beschadigt uitgaande ondertekende berichten.\n" +#~ "Het garanderen van bericht-integriteit (ondertekenen) met G Suite Sync " +#~ "wordt niet ondersteund.\n" +#~ "\n" +#~ "Zie: https://dev.gnupg.org/T3545 voor details.\n" +#~ "\n" +#~ "Wilt u dit bericht enkel versleutelen?" diff --git a/po/po/fr.po b/po/po/fr.po deleted file mode 100644 index c102cad..0000000 --- a/po/po/fr.po +++ /dev/null @@ -1,833 +0,0 @@ -# Copyright (C) YEAR g10 Code GmbH -# This file is distributed under the same license as the PACKAGE package. -# -# Olivier Serve , 2015. -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: bug-gpgol at g10code.com\n" -"POT-Creation-Date: 2015-09-02 18:53+0200\n" -"PO-Revision-Date: 2015-10-01 17:05+0200\n" -"Language-Team: French \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Lokalize 1.5\n" -"Last-Translator: Olivier Serve \n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" -"Language: fr\n" - -#: src/attached-file-events.cpp:58 -msgid "Error creating file for attachment." -msgstr "Erreur ? la cr?ation du fichier ? joindre." - -#: src/attached-file-events.cpp:71 -msgid "Error reading attachment." -msgstr "Erreur ? la lecture du fichier joint." - -#: src/attached-file-events.cpp:82 src/attached-file-events.cpp:96 -msgid "Error writing attachment." -msgstr "Erreur ? l'?criture du fichier joint." - -#: src/attached-file-events.cpp:217 -msgid "" -"Sorry, we are not able to decrypt this attachment.\n" -"\n" -"Please use the decrypt/verify button to decrypt the\n" -"entire message again. Then open this attachment." -msgstr "" -"D?sol?, il n'est pas possible de d?chiffrer ce fichier joint.\n" -"\n" -"Veuillez utiliser le bouton d?chiffrer/v?rifier pour d?chiffrer\n" -"? nouveau le message entier, puis ouvrir ce fichier joint." - -#: src/common.c:269 -msgid "GpgOL - Save attachment" -msgstr "GpgOL - Enregistrer le fichier joint" - -#: src/config-dialog.c:137 -msgid "Debug output (for analysing problems)" -msgstr "Sortie Debug (pour analyser les probl?mes)" - -#: src/engine.c:392 -msgid "" -"The user interface server is not available or could not be started in time. " -"You may want to try again." -msgstr "" -"Kleopatra n'est pas disponible ou n'a pas pu ?tre d?marr?e ? temps. " -"Veuillez r?-essayer." - -#: src/engine.c:395 src/engine.c:405 src/main.c:699 src/main.c:705 -#: src/message.cpp:303 src/explorers.cpp:204 src/explorers.cpp:209 -#: src/gpgoladdin.cpp:663 src/gpgoladdin.cpp:740 src/gpgoladdin.cpp:745 -#: src/gpgoladdin.cpp:813 src/gpgoladdin.cpp:816 src/ribbon-callbacks.cpp:117 -#: src/ribbon-callbacks.cpp:231 src/ribbon-callbacks.cpp:246 -#: src/ribbon-callbacks.cpp:258 src/ribbon-callbacks.cpp:295 -#: src/ribbon-callbacks.cpp:307 src/ribbon-callbacks.cpp:632 -#: src/ribbon-callbacks.cpp:649 src/ribbon-callbacks.cpp:663 -#: src/ribbon-callbacks.cpp:676 src/ribbon-callbacks.cpp:738 -#: src/ribbon-callbacks.cpp:1014 src/ribbon-callbacks.cpp:1048 -#: src/ribbon-callbacks.cpp:1060 src/ribbon-callbacks.cpp:1085 -msgid "GpgOL" -msgstr "GpgOL" - -#: src/engine.c:401 -msgid "" -"The user interface server is not available or does not work. Using an " -"internal user interface.\n" -"\n" -"This is limited to the PGP/MIME protocol and thus S/MIME protected message " -"are not readable." -msgstr "" -"Kleopatra n'est pas disponible ou ne fonctionne pas. Une interface interne va " -"?tre utilis?e\n" -"\n" -"Ceci est limit? au protocole PGP/MIME, les messages prot?g?s par S/MIME ne " -"sont pas lisibles." - -#: src/engine-gpgme.c:368 -msgid "" -"The configured default encryption certificate is not available or does not " -"unambigiously specify one. Please fix this in the option dialog.\n" -"\n" -"This message won't be be encrypted to this certificate!" -msgstr "" -"Le certificat de chiffrement par d?faut n'est pas disponible ou n'est pas " -"sp?cifi? clairement. Merci de configurer cela dans le dialogue d'option.\n" -"\n" -"Ce message ne sera pas chiffr? avec ce certificat ! " - -#: src/engine-gpgme.c:372 -msgid "Encryption" -msgstr "Chiffrement" - -#: src/engine-gpgme.c:788 -msgid "Fingerprint: " -msgstr "Empreinte : " - -#: src/engine-gpgme.c:845 -msgid "This signature is valid\n" -msgstr "Cette signature est valide\n" - -#: src/engine-gpgme.c:847 -msgid "signature state is \"green\"\n" -msgstr "la signature est en ?tat \"vert\"\n" - -#: src/engine-gpgme.c:849 -msgid "signature state is \"red\"\n" -msgstr "la signature est en ?tat \"rouge\"\n" - -#: src/engine-gpgme.c:853 -msgid "Warning: One of the certificates has been revoked\n" -msgstr "Attention?: un des certificats a ?t? r?voqu?\n" - -#: src/engine-gpgme.c:863 -msgid "Warning: The certificate used to create the signature expired at: " -msgstr "Attention?: Le certificat utilis? pour la signature expire le :" - -#: src/engine-gpgme.c:869 -msgid "Warning: At least one certification certificate has expired\n" -msgstr "Attention?: Au moins un certificat de certification a expir?\n" - -#: src/engine-gpgme.c:875 -msgid "Warning: The signature expired at: " -msgstr "Attention?: La signature expire le : " - -#: src/engine-gpgme.c:881 -msgid "Can't verify due to a missing certificate\n" -msgstr "Impossible d'effectuer la v?rification car il manque un certificat\n" - -#: src/engine-gpgme.c:885 -msgid "The CRL is not available\n" -msgstr "La liste de r?vocation (CRL) n'est pas disponible\n" - -#: src/engine-gpgme.c:891 -msgid "Available CRL is too old\n" -msgstr "La liste de r?vocation (CRL) est trop vieille\n" - -#: src/engine-gpgme.c:896 -msgid "A policy requirement was not met\n" -msgstr "Une exigence de la politique n'est pas atteinte\n" - -#: src/engine-gpgme.c:902 -msgid "A system error occured" -msgstr "Il y a eu une erreur syst?me" - -#: src/engine-gpgme.c:939 -msgid "" -"WARNING: We have NO indication whether this certificate belongs to the " -"person named as shown above\n" -msgstr "" -"Attention : Il n'y a pas de preuve que ce certificat appartient ? la " -"personne dont le nom est indiqu?\n" - -#: src/engine-gpgme.c:946 -msgid "" -"WARNING: The certificate does NOT BELONG to the person named as shown above\n" -msgstr "Attention?: Ce certificat n'APPARTIENT PAS ? la personne indiqu?e\n" - -#: src/engine-gpgme.c:950 -msgid "" -"WARNING: It is NOT certain that the certificate belongs to the person named " -"as shown above\n" -msgstr "" -"Attention?: Il n'est PAS certain que ce certificat appartient ? la personne " -"indiqu?e\n" - -#: src/engine-gpgme.c:983 -msgid "Verification started at: " -msgstr "V?rification commenc?e ??:" - -#: src/engine-gpgme.c:988 -msgid "Verification result for: " -msgstr "R?sultat de v?rification pour?: " - -#: src/engine-gpgme.c:989 -msgid "[unnamed part]" -msgstr "[partie anonyme]" - -#: src/engine-gpgme.c:1007 src/engine-gpgme.c:1037 -msgid "Good signature from: " -msgstr "Signature valide par?: " - -#: src/engine-gpgme.c:1014 -msgid " aka: " -msgstr " alias?: " - -#: src/engine-gpgme.c:1018 src/engine-gpgme.c:1040 -msgid " created: " -msgstr " cr??e?: " - -#: src/engine-gpgme.c:1027 -msgid "*BAD* signature claimed to be from: " -msgstr "*MAUVAISE* pr?tendant ?tre de?: " - -#: src/engine-gpgme.c:1050 -msgid "Error checking signature" -msgstr "Erreur ? la v?rification de signature" - -#: src/engine-gpgme.c:1066 -msgid "*** Begin Notation (signature by: " -msgstr "*** D?but Notation (signature par?: " - -#: src/engine-gpgme.c:1086 -msgid "*** End Notation ***\n" -msgstr "*** Fin Notation ***\n" - -#: src/main.c:698 -#, c-format -msgid "Note: Using compatibility flags: %s" -msgstr "Note?: Utilisation de marqueurs de compatibilit??: %s" - -#: src/main.c:704 -#, c-format -msgid "" -"Note: Writing debug logs to\n" -"\n" -"\"%s\"" -msgstr "" -"Note?: ?criture du journal de debug dans\n" -"\n" -"\"%s\"" - -#: src/mapihelp.cpp:1528 src/mapihelp.cpp:1536 src/mapihelp.cpp:1544 -msgid "[no subject]" -msgstr "[pas de sujet]" - -#: src/mapihelp.cpp:2153 -msgid "" -"[The content of this message is not visible because it has been decrypted by " -"another Outlook session. Use the \"decrypt/verify\" command to make it " -"visible]" -msgstr "" -"[Le contenu de ce message n'est pas visible car il a ?t? d?chiffr? par une " -"autre session Outlook. Utiliser la commande \"d?chiffrer/v?rifier\" afin de " -"le rendre visible]" - -#: src/mapihelp.cpp:3005 -msgid "" -"[The content of this message is not visible due to an processing error in " -"GpgOL.]" -msgstr "" -"[Le contenu de ce message n'est pas visible ? cause d'une erreur d'ex?cution " -"de GpgOL.]" - -#: src/message-events.cpp:284 src/mailitem.cpp:164 -msgid "" -"Sorry, we can only encrypt plain text messages and\n" -"no RTF messages. Please make sure that only the text\n" -"format has been selected." -msgstr "" -"Attention, il n'est possible de chiffrer que des messages texte\n" -"et non des messages RTF. Merci de v?rifier que seul le format texte\n" -"a ?t? s?lectionn?." - -#: src/message.cpp:181 -msgid "[Crypto operation failed - can't show the body of the message]" -msgstr "" -"[?chec de l'op?ration cryptographique - impossible de visualiser le corps du " -"message]" - -#: src/message.cpp:283 -#, c-format -msgid "" -"Signature status: %s\n" -"Message class ..: %s\n" -"MIME structure .:\n" -"%s" -msgstr "" -"?tat de signature?: %s\n" -"Classe de message ..?: %s\n" -"Structure MIME?: \n" -"%s" - -#: src/message.cpp:291 -msgid "GpgOL - Message Information" -msgstr "GgpOL - Message d'information" - -#: src/message.cpp:523 -msgid "Signature verification of an encrypted message is not possible." -msgstr "Il n'est pas possible de v?rifier la signature d'un message chiffr?." - -#: src/message.cpp:534 -msgid "Signature verification of this message class is not possible." -msgstr "Il n'est pas possible de v?rifier la signature de ce type de message." - -#: src/message.cpp:537 -msgid "" -"Signature verification of this S/MIME message is not possible. Please check " -"that S/MIME processing has been enabled." -msgstr "" -"Il n'est pas possible de v?rifier la signature S/MIME de ce message. Veuillez " -"v?rifier que le traitement S/MIME a ?t? activ?." - -#: src/message.cpp:541 -msgid "This message has no signature." -msgstr "Ce message n'a pas de signature." - -#: src/message.cpp:839 -msgid "This message is not encrypted." -msgstr "Ce message n'est pas chiffr?" - -#: src/message.cpp:1066 -#, c-format -msgid "" -"Decryption failed\n" -"(%s)" -msgstr "" -"?chec du d?chiffrement\n" -"(%s)" - -#: src/message.cpp:1213 -msgid "No recipients to encrypt to are given" -msgstr "Il n'y a pas de destinataires vers qui chiffrer" - -#: src/message.cpp:1226 src/message.cpp:1253 -msgid "Encrypting or signing an empty message is not possible." -msgstr "Il n'est pas possible de chiffrer ou signer un message vide." - -#: src/message.cpp:1235 -#, c-format -msgid "Encryption failed (%s)" -msgstr "?chec du chiffrement (%s)" - -#: src/message.cpp:1262 -#, c-format -msgid "Signing failed (%s)" -msgstr "?chec de la signature (%s)" - -#: src/mimeparser.c:1204 -msgid "Error writing to stream" -msgstr "Erreur d'?criture dans le flux" - -#: src/mimeparser.c:1205 -msgid "I/O-Error" -msgstr "Erreur d'entr?e/sortie" - -#: src/olflange-dlgs.cpp:43 src/gpgoladdin.cpp:663 src/gpgoladdin.cpp:740 -#: src/gpgoladdin.cpp:813 -msgid "General" -msgstr "G?n?ral" - -#: src/olflange-dlgs.cpp:44 -msgid "Enable the S/MIME support" -msgstr "Activer le support S/MIME" - -#: src/olflange-dlgs.cpp:46 -msgid "Message sending" -msgstr "Envoi du message" - -#: src/olflange-dlgs.cpp:47 -msgid "&Encrypt new messages by default" -msgstr "&Chiffrer les nouveaux messages par d?faut" - -#: src/olflange-dlgs.cpp:48 -msgid "&Sign new messages by default" -msgstr "&Signer les nouveaux messages par d?faut" - -#: src/olflange-dlgs.cpp:50 -msgid "Message receiving" -msgstr "R?ception de message" - -#: src/olflange-dlgs.cpp:52 -msgid "Show HTML view if possible" -msgstr "Afficher la vue HTML si possible" - -#: src/olflange-dlgs.cpp:53 -msgid "Present encrypted message as attachment" -msgstr "Pr?senter le message chiffr? en tant que fichier joint" - -#: src/olflange-dlgs.cpp:56 -msgid "Crypto Engine" -msgstr "Moteur de Cryptographie" - -#. TRANSLATORS: See the source for the full english text. -#: src/olflange-dlgs.cpp:256 -msgid "-#GpgOLFullHelpText#-" -msgstr "-#GpgOLFullHelpText#-" - -#: src/olflange-dlgs.cpp:262 -#, c-format -msgid "This is GpgOL version %s" -msgstr "La version de GpgOL est %s" - -#: src/olflange.cpp:527 -msgid "Welcome to GpgOL " -msgstr "Bienvenue dans GpgOL" - -#: src/olflange.cpp:528 -msgid "" -"GpgOL adds integrated OpenPGP and S/MIME encryption and digital signing " -"support to Outlook 2003 and 2007.\n" -"\n" -"Although we tested this software extensively, we can't give you any " -"guarantee that it will work as expected. The programming interface we are " -"using has not been properly documented by Microsoft and thus the " -"functionality of GpgOL may cease to work with an update of your Windows " -"system.\n" -"\n" -"WE STRONGLY ADVISE TO RUN ENCRYPTION TESTS BEFORE YOU START TO USE GPGOL ON " -"ANY SENSITIVE DATA!\n" -"\n" -"There are some known problems, the most severe being that sending encrypted " -"or signed mails using an Exchange based account does not work. Using GpgOL " -"along with other Outlook plugins may in some cases not work.\n" -msgstr "" -"GpgOL ajoute le chiffrement et de la signature num?rique " -"OpenPGP et S/MIME ? Outlook.\n" -"Bien que ce logiciel soit test? de mani?re extensive, il est fourni sans " -"aucune garantie de fonctionnement. L'interface de programmation utilis?e n'a " -"pas ?t? correctement document?e par Microsoft et les fonctionnalit?s de " -"GpgOL sont susceptibles de ne plus fonctionner avec une mise ? jour du " -"syst?me Windows.\n" -"\n" -"IL EST FORTEMENT RECOMMAND? DE FAIRE DES TESTS DE CHIFFREMENT AVANT " -"D'UTILISER GPGOL DE MANI?RE INTENSIVE.\n" -"\n" -"Il y a des probl?mes connus, les plus s?v?res portent sur le fait que " -"l'envoi de mails chiffr?s ou sign?s utilisant un compte bas? sur Exchange ne " -"fonctionne pas. L'utilisation de GpgOL avec d'autres plugins Outlook peut " -"?galement mener ? des dysfonctionnements.\n" - -#: src/olflange.cpp:554 -msgid "" -"You have installed a new version of GpgOL.\n" -"\n" -"Please open the option dialog and confirm that the settings are correct for " -"your needs. The option dialog can be found in the main menu at: Extras-" -">Options->GpgOL.\n" -msgstr "" -"Vous avez install? une nouvelle version de GpgOL.\n" -"\n" -"Veuillez ouvrir la boite de dialogue d'options et confirmer que la " -"configuration correspond ? vos besoins. Cette boite de dialogue est " -"accessible depuis le menu principal?: Extras > Options > GpgOL.\n" - -#: src/olflange.cpp:754 -msgid "" -"This version of Outlook is too old!\n" -"\n" -"At least versions of Outlook 2003 older than SP2 exhibit crashes when " -"sending messages and messages might get stuck in the outgoing queue.\n" -"\n" -"Please update at least to SP2 before trying to send a message" -msgstr "" -"Cette version d'Outlook est trop ancienne?!\n" -"\n" -"Une version d'Outlook 2003 ant?rieure au SP2 provoque un crash lors de " -"l'envoi de messages et les messages peuvent ?tre bloqu?s dans la queue " -"d'envoi.\n" -"\n" -"Merci de mettre ? jour au moins ? la version SP2 avant d'envoyer un message." - -#: src/passphrase-dialog.c:85 -msgid "No certificate hint given." -msgstr "Aucun indice de certificat donn?." - -#: src/passphrase-dialog.c:313 src/passphrase-dialog.c:464 -msgid "Enter passphrase to unlock the secret key" -msgstr "Saisir la phrase de passe pour d?verrouiller la cl? secr?te" - -#: src/passphrase-dialog.c:314 src/passphrase-dialog.c:465 -msgid "Hide typing" -msgstr "Cacher la saisie" - -#: src/passphrase-dialog.c:315 src/passphrase-dialog.c:466 -#: src/recipient-dialog.c:385 -msgid "&Cancel" -msgstr "&Annuler" - -#: src/passphrase-dialog.c:350 src/passphrase-dialog.c:499 -msgid "Invalid passphrase; please try again..." -msgstr "Phrase de passe invalide?; veuillez r?essayer ... " - -#: src/passphrase-dialog.c:379 -msgid "Select Signing Key" -msgstr "S?lectionner la cl? de signature" - -#: src/passphrase-dialog.c:463 -msgid "Encrypted to the following certificates:" -msgstr "Chiffr? avec les certificats suivants?:" - -#: src/recipient-dialog.c:88 -msgid "Name" -msgstr "Nom" - -#: src/recipient-dialog.c:93 -msgid "E-Mail" -msgstr "E-Mail" - -#: src/recipient-dialog.c:98 -msgid "Key-Info" -msgstr "Info-Cl?" - -#: src/recipient-dialog.c:103 -msgid "Key ID" -msgstr "ID de cl?" - -#: src/recipient-dialog.c:108 -msgid "Validity" -msgstr "Validit?" - -#: src/recipient-dialog.c:383 -msgid "Selected recipients:" -msgstr "Destinataires s?lectionn?s?:" - -#: src/recipient-dialog.c:384 -msgid "Recipient which were NOT found" -msgstr "Destinataire non trouv?" - -#: src/recipient-dialog.c:444 -msgid "Please select at least one recipient certificate." -msgstr "Veuillez s?lectionner au moins un certificat de destinataire." - -#: src/recipient-dialog.c:445 -msgid "Recipient Dialog" -msgstr "Dialogue de destinataire" - -#: src/verify-dialog.c:124 -msgid "BAD signature!" -msgstr "Mauvaise signature?!" - -#: src/verify-dialog.c:126 -msgid "Good signature" -msgstr "Signature valide" - -#: src/verify-dialog.c:128 -msgid "Good signature from revoked certificate" -msgstr "Signature correcte mais issue d'un certificat r?voqu?" - -#: src/verify-dialog.c:130 -msgid "Good signature from expired certificate" -msgstr "Signature correcte mais issue d'un certificat expir?" - -#: src/verify-dialog.c:132 -msgid "Good expired signature" -msgstr "Signature correcte mais expir?e" - -#: src/verify-dialog.c:135 -msgid "Could not check signature: missing certificate" -msgstr "Impossible de v?rifier la signature?: il manque un certificat" - -#: src/verify-dialog.c:139 -msgid "Verification error" -msgstr "Erreur de v?rification" - -#: src/verify-dialog.c:156 -msgid "User-ID not found" -msgstr "User-ID non trouv?" - -#: src/verify-dialog.c:168 -msgid "This may be due to a wrong option setting" -msgstr "Ceci peut ?tre d? ? une mauvaise configuration" - -#: src/verify-dialog.c:174 -#, c-format -msgid "Signature expired on %s" -msgstr "La signature expire le %s" - -#: src/verify-dialog.c:186 -msgid "Signature issued by a certificate we do NOT trust." -msgstr "Signature par un certificat auquel on ne fait pas confiance." - -#: src/verify-dialog.c:193 -msgid "Signature issued by a non-valid certificate." -msgstr "Signature par un certificat non valide." - -#: src/verify-dialog.c:209 -msgid "Signature made" -msgstr "Signature termin?e" - -#: src/verify-dialog.c:210 -msgid "using" -msgstr "utilisant" - -#: src/verify-dialog.c:211 -msgid "cert-ID" -msgstr "cert-ID" - -#: src/verify-dialog.c:212 -msgid "from" -msgstr "de" - -#: src/verify-dialog.c:213 -msgid "also known as" -msgstr "?galement connu comme" - -#: src/verify-dialog.c:244 -msgid "PGP/MIME Verification Result" -msgstr "R?sultat de la v?rification PGP/MIME" - -#: src/verify-dialog.c:247 -msgid "S/MIME Verification Result" -msgstr "R?sultat de la v?rification S/MIME" - -#: src/inspectors.cpp:687 -msgid "&encrypt message with GnuPG" -msgstr "&chiffrer le message avec GnuPG" - -#: src/inspectors.cpp:701 -msgid "&sign message with GnuPG" -msgstr "&signer le message avec GnuPG" - -#: src/inspectors.cpp:727 -msgid "GpgOL Decrypt/Verify" -msgstr "GpgOL D?chiffrer / V?rifier" - -#: src/inspectors.cpp:788 -msgid "Encrypt message with GnuPG" -msgstr "Chiffrer le message avec GnuPG" - -#: src/inspectors.cpp:804 -msgid "Sign message with GnuPG" -msgstr "Signer le message avec GnuPG" - -#: src/inspectors.cpp:921 -msgid "" -"This is a signed and encrypted message.\n" -"Click for more information. " -msgstr "" -"Ceci est un message sign? et chiffr?.\n" -"Veuillez le s?lectionner pour plus d'informations." - -#: src/inspectors.cpp:927 -msgid "" -"This is a signed message.\n" -"Click for more information. " -msgstr "" -"Ceci est un message sign?.\n" -"Veuillez le s?lectionner pour plus d'informations." - -#: src/inspectors.cpp:933 -msgid "" -"This is an encrypted message.\n" -"Click for more information. " -msgstr "" -"Ceci est un message chiffr?.\n" -"Veuillez le s?lectionner pour plus d'informations." - -#: src/explorers.cpp:126 -msgid "GnuPG Certificate &Manager" -msgstr "&Gestionnaire de certificats GnuPG" - -#: src/explorers.cpp:140 -msgid "Remove GpgOL flags from this folder" -msgstr "Retirer les marqueurs GpgOL de ce r?pertoire" - -#: src/explorers.cpp:167 -msgid "Open the certificate manager" -msgstr "Ouvrir le gestionnaire de certificats" - -#: src/explorers.cpp:194 -msgid "" -"You are about to start the process of reversing messages created by GpgOL to " -"prepare deinstalling of GpgOL. Running this command will put GpgOL into a " -"disabled state so that messages are not anymore processed by GpgOL.\n" -"\n" -"You should convert all folders one after the other with this command, close " -"Outlook and then deinstall GpgOL.\n" -"\n" -"Note that if you start Outlook again with GpgOL still being installed, GpgOL " -"will again process messages." -msgstr "" -"Vous aller d?marrer le processus de r?cup?ration des messages cr??s par GpgOL " -"afin de pr?parer sa d?sinstallation. Cette commande va d?sactiver " -"GpgOL afin qu'il ne traite plus les messages.\n" -"\n" -"Vous devriez convertir tous les dossiers un par un avec cette commande, " -"fermer Outlook puis d?sinstaller GpgOL.\n" -"\n" -"Veuillez noter que si vous d?marrez Outlook alors que GpgOL est encore " -"install?, " -"GpgOL traitera ? nouveau les messages." - -#: src/explorers.cpp:208 -msgid "Do you want to revert this folder?" -msgstr "Voulez-vous r?cup?rer ce dossier ?" - -#: src/gpgoladdin.cpp:541 -msgid "Start the Certificate Management Software" -msgstr "Lancer le gestionnaire de certificats" - -#: src/gpgoladdin.cpp:543 -msgid "" -"Open GPA or Kleopatra to manage your certificates. You can use this you to " -"generate your own certificates. " -msgstr "" -"Ouvre GPA ou Kleopatra pour la gestion de vos certificats. Vous pouvez " -"utiliser ces outils pour g?n?rer vos propres certificats." - -#: src/gpgoladdin.cpp:547 -msgid "Encrypt the text of the message" -msgstr "Chiffrer le texte du message" - -#: src/gpgoladdin.cpp:549 -msgid "" -"Choose the certificates for which the message should be encrypted and " -"replace the text with the encrypted message." -msgstr "" -"Veuillez choisir les certificats avec lesquels le message sera chiffr?. " -"Le texte sera remplac? par le message chiffr?." - -#: src/gpgoladdin.cpp:553 -msgid "Add a file as an encrypted attachment" -msgstr "Chiffrer un fichier joint" - -#: src/gpgoladdin.cpp:555 -msgid "Encrypts a file and adds it as an attachment to the message. " -msgstr "Chiffre un fichier et le joint au message." - -#: src/gpgoladdin.cpp:558 -msgid "Add a file as an encrypted attachment with a signature" -msgstr "Chiffrer et signer un fichier joint" - -#: src/gpgoladdin.cpp:560 -msgid "" -"Encrypts a file, signs it and adds both the encrypted file and the signature " -"as attachments to the message. " -msgstr "" -"Chiffre un fichier, le signe puis joint au message le fichier chiffr? et la " -"signature." - -#: src/gpgoladdin.cpp:563 -msgid "Decrypt the message" -msgstr "D?chiffrer le message" - -#: src/gpgoladdin.cpp:565 -msgid "" -"Look for PGP or S/MIME encrypted data in the message text and decrypt it." -msgstr "D?chiffre les donn?es du message chiffr?es avec PGP ou S/MIME." - -#: src/gpgoladdin.cpp:568 -msgid "Add a signature of the message" -msgstr "Ajouter une signature au message" - -#: src/gpgoladdin.cpp:570 -msgid "" -"Appends a signed copy of the message text in an opaque signature. An opaque " -"signature ensures that the signed text is not modified by embedding it in " -"the signature itself. The combination of the signed message text and your " -"signature is added below the plain text. The message will not be encrypted!" -msgstr "" -"Ajoute une copie sign?e du message dans une signature opaque. Une " -"signature opaque assure que le texte sign? n'est pas modifi? en " -"l'int?grant ? la signature elle-m?me. La combinaison du message " -"sign? et de votre signature est ajout?e ? la fin du message. Le message ne " -"sera pas chiffr??!" - -#: src/gpgoladdin.cpp:664 src/gpgoladdin.cpp:741 src/gpgoladdin.cpp:814 -msgid "Start Certificate Manager" -msgstr "D?marrer le gestionnaire de certificats" - -#: src/gpgoladdin.cpp:665 src/gpgoladdin.cpp:742 -msgid "Textbody" -msgstr "Corps du message" - -#: src/gpgoladdin.cpp:666 src/gpgoladdin.cpp:673 -msgid "Encrypt" -msgstr "Chiffrer" - -#: src/gpgoladdin.cpp:667 src/gpgoladdin.cpp:673 src/gpgoladdin.cpp:743 -#: src/gpgoladdin.cpp:746 src/gpgoladdin.cpp:747 -msgid "Decrypt" -msgstr "D?chiffrer" - -#: src/gpgoladdin.cpp:668 -msgid "Sign" -msgstr "Signer" - -#: src/gpgoladdin.cpp:669 src/gpgoladdin.cpp:744 -msgid "Verify" -msgstr "V?rifier" - -#: src/gpgoladdin.cpp:670 -msgid "Attachments" -msgstr "Fichiers joints" - -#: src/gpgoladdin.cpp:671 -msgid "Encrypted file" -msgstr "Chiffrer un fichier" - -#: src/gpgoladdin.cpp:672 -msgid "Encrypted file and Signature" -msgstr "Chiffrer et signer un fichier" - -#: src/gpgoladdin.cpp:745 src/gpgoladdin.cpp:816 src/gpgoladdin.cpp:817 -msgid "Save and decrypt" -msgstr "Enregistrer et d?chiffrer" - -#: src/ribbon-callbacks.cpp:245 -msgid "Please select text to encrypt." -msgstr "Veuillez s?lectionner le texte ? chiffrer." - -#: src/ribbon-callbacks.cpp:257 -msgid "Textbody empty." -msgstr "Corps du texte vide." - -#: src/ribbon-callbacks.cpp:306 src/ribbon-callbacks.cpp:1013 -msgid "Please add at least one recipent." -msgstr "Veuillez ajouter au moins un destinataire." - -#: src/ribbon-callbacks.cpp:648 -msgid "Please select a Mail." -msgstr "Veuillez s?lectionner un mail." - -#: src/ribbon-callbacks.cpp:662 -msgid "Please select the data you wish to decrypt." -msgstr "Veuillez s?lectionner les donn?es ? d?chiffrer." - -#: src/ribbon-callbacks.cpp:675 -msgid "Nothing to decrypt." -msgstr "Rien ? d?chiffrer." - -#: src/ribbon-callbacks.cpp:833 -msgid "Plain text" -msgstr "\"Plain text\"" - -#: src/ribbon-callbacks.cpp:834 -msgid "Signed text" -msgstr "Texte sign?" - -#: src/ribbon-callbacks.cpp:1020 -msgid "Select file to encrypt" -msgstr "S?lectionner le fichier ? chiffrer" ----------------------------------------------------------------------- Summary of changes: configure.ac | 2 +- po/LINGUAS | 1 + po/nl.po | 1254 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ po/po/fr.po | 833 -------------------------------------- 4 files changed, 1256 insertions(+), 834 deletions(-) create mode 100644 po/nl.po delete mode 100644 po/po/fr.po hooks/post-receive -- GnuPG extension for MS Outlook http://git.gnupg.org From cvs at cvs.gnupg.org Tue May 15 12:28:01 2018 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Tue, 15 May 2018 12:28:01 +0200 Subject: [git] GnuPG - branch, master, updated. gnupg-2.2.7-126-g96350c5 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via 96350c5d5afcbc7f66c535e38b9fcc7355622855 (commit) from 61b1508281cda47b65c2bbd99cdef67fd6855c7c (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 96350c5d5afcbc7f66c535e38b9fcc7355622855 Author: Werner Koch Date: Tue May 15 12:19:40 2018 +0200 gpg: Turn --no-mdc-warn into a NOP. * g10/gpg.c (oNoMDCWarn): Remove. (opts): Make --no-mdc-warn a NOP. (main): Don't set var. * g10/options.h (struct opt): Remove 'no_mdc_var'. * g10/cipher-cfb.c (write_header): Assume opt.no_mdc_warn is false. * g10/mainproc.c (proc_encrypted): Ditto. -- Users should not be allowed to suppress the warning that they are shooting into their foot. Signed-off-by: Werner Koch diff --git a/doc/gpg.texi b/doc/gpg.texi index 00ac033..7b142cc 100644 --- a/doc/gpg.texi +++ b/doc/gpg.texi @@ -2041,10 +2041,6 @@ place an unsafe gpg.conf file in place, and use this file to suppress warnings about itself. The @option{--homedir} permissions warning may only be suppressed on the command line. - at item --no-mdc-warning - at opindex no-mdc-warning -Suppress the warning about missing MDC integrity protection. - @item --require-secmem @itemx --no-require-secmem @opindex require-secmem diff --git a/g10/cipher-cfb.c b/g10/cipher-cfb.c index 79b21bd..48927c5 100644 --- a/g10/cipher-cfb.c +++ b/g10/cipher-cfb.c @@ -64,7 +64,7 @@ write_header (cipher_filter_context_t *cfx, iobuf_t a) if (DBG_HASHING) gcry_md_debug (cfx->mdc_hash, "creatmdc"); } - else if (!opt.no_mdc_warn) + else { log_info ("WARNING: " "encrypting without integrity protection is dangerous\n"); diff --git a/g10/gpg.c b/g10/gpg.c index 75eeceb..e718fe4 100644 --- a/g10/gpg.c +++ b/g10/gpg.c @@ -268,7 +268,6 @@ enum cmd_and_opt_values oRequireSecmem, oNoRequireSecmem, oNoPermissionWarn, - oNoMDCWarn, oNoArmor, oNoDefKeyring, oNoKeyring, @@ -738,7 +737,6 @@ static ARGPARSE_OPTS opts[] = { ARGPARSE_s_n (oRequireSecmem, "require-secmem", "@"), ARGPARSE_s_n (oNoRequireSecmem, "no-require-secmem", "@"), ARGPARSE_s_n (oNoPermissionWarn, "no-permission-warning", "@"), - ARGPARSE_s_n (oNoMDCWarn, "no-mdc-warning", "@"), ARGPARSE_s_n (oNoArmor, "no-armor", "@"), ARGPARSE_s_n (oNoArmor, "no-armour", "@"), ARGPARSE_s_n (oNoDefKeyring, "no-default-keyring", "@"), @@ -925,6 +923,7 @@ static ARGPARSE_OPTS opts[] = { ARGPARSE_s_n (oNoop, "no-force-v3-sigs", "@"), ARGPARSE_s_n (oNoop, "force-v4-certs", "@"), ARGPARSE_s_n (oNoop, "no-force-v4-certs", "@"), + ARGPARSE_s_n (oNoop, "no-mdc-warning", "@"), ARGPARSE_end () }; @@ -3221,7 +3220,6 @@ main (int argc, char **argv) case oRequireSecmem: require_secmem=1; break; case oNoRequireSecmem: require_secmem=0; break; case oNoPermissionWarn: opt.no_perm_warn=1; break; - case oNoMDCWarn: opt.no_mdc_warn=1; break; case oDisplayCharset: if( set_native_charset( pargs.r.ret_str ) ) log_error(_("'%s' is not a valid character set\n"), diff --git a/g10/mainproc.c b/g10/mainproc.c index 69de865..ea3721a 100644 --- a/g10/mainproc.c +++ b/g10/mainproc.c @@ -767,7 +767,7 @@ proc_encrypted (CTX c, PACKET *pkt) write_status (STATUS_GOODMDC); else if (pkt->pkt.encrypted->mdc_method && !result) write_status (STATUS_GOODMDC); - else if (!opt.no_mdc_warn) + else log_info (_("WARNING: message was not integrity protected\n")); } else if (gpg_err_code (result) == GPG_ERR_BAD_SIGNATURE diff --git a/g10/options.h b/g10/options.h index dab6e9f..09d4e44 100644 --- a/g10/options.h +++ b/g10/options.h @@ -187,7 +187,6 @@ struct prefitem_t *personal_compress_prefs; struct weakhash *weak_digests; int no_perm_warn; - int no_mdc_warn; char *temp_dir; int no_encrypt_to; int encrypt_to_default_key; ----------------------------------------------------------------------- Summary of changes: doc/gpg.texi | 4 ---- g10/cipher-cfb.c | 2 +- g10/gpg.c | 4 +--- g10/mainproc.c | 2 +- g10/options.h | 1 - 5 files changed, 3 insertions(+), 10 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Tue May 15 12:47:09 2018 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Tue, 15 May 2018 12:47:09 +0200 Subject: [git] GnuPG - branch, master, updated. gnupg-2.2.7-127-gd143190 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via d1431901f0143cdc7af8d1a23387e0c6b5bb613f (commit) from 96350c5d5afcbc7f66c535e38b9fcc7355622855 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit d1431901f0143cdc7af8d1a23387e0c6b5bb613f Author: Werner Koch Date: Tue May 15 12:33:03 2018 +0200 gpg: Hard fail on a missing MDC even for legacy algorithms. * g10/mainproc.c (proc_encrypted): Require an MDC or AEAD * tests/openpgp/defs.scm (create-gpghome): Use --ignore-mdc-error to allow testing with the current files. Signed-off-by: Werner Koch diff --git a/doc/gpg.texi b/doc/gpg.texi index 7b142cc..544ed18 100644 --- a/doc/gpg.texi +++ b/doc/gpg.texi @@ -3230,10 +3230,11 @@ to ignore CRC errors. @item --ignore-mdc-error @opindex ignore-mdc-error This option changes a MDC integrity protection failure into a warning. -This can be useful if a message is partially corrupt, but it is -necessary to get as much data as possible out of the corrupt message. -However, be aware that a MDC protection failure may also mean that the -message was tampered with intentionally by an attacker. +It is required to decrypt old messages which did not use an MDC. It +may also be useful if a message is partially garbled, but it is +necessary to get as much data as possible out of that garbled message. +Be aware that a missing or failed MDC can be an indication of an +attack. Use with caution. @item --allow-weak-digest-algos @opindex allow-weak-digest-algos diff --git a/g10/mainproc.c b/g10/mainproc.c index ea3721a..a991203 100644 --- a/g10/mainproc.c +++ b/g10/mainproc.c @@ -738,15 +738,12 @@ proc_encrypted (CTX c, PACKET *pkt) else if (!result && !opt.ignore_mdc_error && !pkt->pkt.encrypted->mdc_method - && !pkt->pkt.encrypted->aead_algo - && openpgp_cipher_get_algo_blklen (c->dek->algo) != 8 - && c->dek->algo != CIPHER_ALGO_TWOFISH) - { - /* The message has been decrypted but has no MDC despite that a - modern cipher (blocklength != 64 bit, except for Twofish) is - used and the option to ignore MDC errors is not used: To - avoid attacks changing an MDC message to a non-MDC message, - we fail here. */ + && !pkt->pkt.encrypted->aead_algo) + { + /* The message has been decrypted but does not carry an MDC or + * uses AEAD encryption. --ignore-mdc-error has also not been + * used. To avoid attacks changing an MDC message to a non-MDC + * message, we fail here. */ log_error (_("WARNING: message was not integrity protected\n")); if (opt.verbose > 1) log_info ("decryption forced to fail\n"); diff --git a/tests/openpgp/defs.scm b/tests/openpgp/defs.scm index afd69a0..186efe0 100644 --- a/tests/openpgp/defs.scm +++ b/tests/openpgp/defs.scm @@ -341,6 +341,7 @@ "no-auto-key-retrieve" "no-auto-key-locate" "allow-weak-digest-algos" + "ignore-mdc-error" (if have-opt-always-trust "no-auto-check-trustdb" "#no-auto-check-trustdb") (string-append "agent-program " ----------------------------------------------------------------------- Summary of changes: doc/gpg.texi | 9 +++++---- g10/mainproc.c | 15 ++++++--------- tests/openpgp/defs.scm | 1 + 3 files changed, 12 insertions(+), 13 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Tue May 15 13:27:41 2018 From: cvs at cvs.gnupg.org (by Ben McGinnes) Date: Tue, 15 May 2018 13:27:41 +0200 Subject: [git] GPGME - branch, ben/howto-dita, updated. gpgme-1.11.1-12-g94a0f66 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GnuPG Made Easy". The branch, ben/howto-dita has been updated via 94a0f663760c01ca15c0801ef86b9417da3314e8 (commit) from bb8153269b3f75d286aad51aca7be1f83cb410c8 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 94a0f663760c01ca15c0801ef86b9417da3314e8 Author: Ben McGinnes Date: Tue May 15 21:26:30 2018 +1000 docs: python bindings howto DITA * Fixed a typo, added a couple of links. diff --git a/lang/python/docs/dita/howto/part-4.dita b/lang/python/docs/dita/howto/part-4.dita index 3b805e0..c985995 100644 --- a/lang/python/docs/dita/howto/part-4.dita +++ b/lang/python/docs/dita/howto/part-4.dita @@ -2,7 +2,7 @@ - The Fun Stuff + Cryptographic Functions

    diff --git a/lang/python/docs/dita/howto/part01/docs-source.dita b/lang/python/docs/dita/howto/part01/docs-source.dita index a9924b4..8e97a35 100644 --- a/lang/python/docs/dita/howto/part01/docs-source.dita +++ b/lang/python/docs/dita/howto/part01/docs-source.dita @@ -4,17 +4,19 @@ Documentation Source Files -

    Unlike all other documentation in the GnuPG Project, including the initial version of - this HOWTO, this version was not written in Emacs Org-Mode. Nor was it written in - LaTeX, Texinfo or even directly in HTML. Instead it was written using the Darwin Information - Typing Architecture (DITA) XML.

    +

    Unlike all other documentation in the GnuPG Project, including the initial version of this HOWTO, this + version was not written in Emacs Org-Mode. Nor was it written in LaTeX, Texinfo or + even directly in HTML. Instead it was written using the Darwin Information Typing + Architecture (DITA) XML.

    This was done for two main reasons:

      -
    1. A bug in either Org-Mode or Babel prevented the more complex examples included in the - HOWTO from displaying correctly.
    2. +
    3. A bug + in either Org-Mode or Babel prevented the more complex examples included in the HOWTO + from displaying correctly.
    4. To demonstrate some of the advantages of DITA XML over existing documentation - productionsoftware used in the project (particularly Texinfo and LaTeX).
    5. + production software used in the project (particularly Texinfo and LaTeX).

    The XML format definitely supports displaying all the more complex Python code correctly, ----------------------------------------------------------------------- Summary of changes: lang/python/docs/dita/howto/part-4.dita | 2 +- lang/python/docs/dita/howto/part01/docs-source.dita | 16 +++++++++------- 2 files changed, 10 insertions(+), 8 deletions(-) hooks/post-receive -- GnuPG Made Easy http://git.gnupg.org From cvs at cvs.gnupg.org Thu May 17 09:23:48 2018 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Thu, 17 May 2018 09:23:48 +0200 Subject: [git] GPGME - branch, master, updated. gpgme-1.11.1-8-g8a0c8c5 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GnuPG Made Easy". The branch, master has been updated via 8a0c8c52510d9c2d934f85159f04b666286b1786 (commit) from e54b110aec3165a32ff9551d0c5227b88aa3dd4f (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 8a0c8c52510d9c2d934f85159f04b666286b1786 Author: Werner Koch Date: Thu May 17 09:14:40 2018 +0200 core: Always fail if an OpenPG message is not integrity protected. * src/decrypt.c (struct op_data_t): Add field not_integrity_protected. (parse_decryption_info): Set this. Also rename mode to aead_algo for clarity. (_gpgme_decrypt_status_handler): Force failure in case of a missing MDC. -- This extra check makes sure that a missing or stripped MDC in - gpg < 2.1 - or gpg 2.2 with an old cipher algorithm will lead to a decryption failure. gpg 2.3 will always fail in this case. Implementing this check here and not backporting the 2.3 change to 2.2 has the benefit that all GPGME using applications are protected but scripts relying on rfc2440 (i.e. without MDC) will only break when migrating to 2.3. Note that S/MIME has no integrity protection mechanism but gpgsm neither emits a DECRYPTION_INFO status line, so an error will not be triggered. If in the future gpgsm supports authenticated encryption it may issue a DECRYPTION_INFO line to force a failure here but it will in that case also emit a DECRYPTION_FAILED anyway. GnuPG-bug-id: 3981 Signed-off-by: Werner Koch diff --git a/NEWS b/NEWS index 80c0119..1eacccc 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,9 @@ Noteworthy changes in version 1.11.2 (unreleased) ------------------------------------------------- + * Even for old versions of gpg a missing MDC will now lead to a + decryption failure. + Noteworthy changes in version 1.11.1 (2018-04-20) ------------------------------------------------- diff --git a/doc/gpgme.texi b/doc/gpgme.texi index c4a29d5..c745675 100644 --- a/doc/gpgme.texi +++ b/doc/gpgme.texi @@ -5408,7 +5408,7 @@ or @code{gpgme_get_ctx_flag (ctx, "export-session-key")} returns true @since{1.11.0} A string with the symmetric encryption algorithm and mode using the -format ".". Note that old non-MDC encryption mode of +format ".". Note that the deprecated non-MDC encryption mode of OpenPGP is given as "PGPCFB". @end table diff --git a/src/decrypt.c b/src/decrypt.c index 0fc7019..ecd9c14 100644 --- a/src/decrypt.c +++ b/src/decrypt.c @@ -56,6 +56,11 @@ typedef struct * message that the general DECRYPTION_FAILED. */ int any_no_seckey; + /* If the engine emits a DECRYPTION_INFO status and that does not + * indicate that an integrity proetction mode is active, this flag + * is set. */ + int not_integrity_protected; + /* A pointer to the next pointer of the last recipient in the list. This makes appending new invalid signers painless while preserving the order. */ @@ -280,7 +285,7 @@ parse_decryption_info (char *args, op_data_t opd, gpgme_protocol_t protocol) char *field[3]; int nfields; char *args2; - int mdc, mode; + int mdc, aead_algo; const char *algostr, *modestr; if (!args) @@ -296,19 +301,22 @@ parse_decryption_info (char *args, op_data_t opd, gpgme_protocol_t protocol) mdc = atoi (field[0]); algostr = _gpgme_cipher_algo_name (atoi (field[1]), protocol); - mode = nfields < 3? 0 : atoi (field[2]); - modestr = _gpgme_cipher_mode_name (mode, protocol); + aead_algo = nfields < 3? 0 : atoi (field[2]); + modestr = _gpgme_cipher_mode_name (aead_algo, protocol); free (args2); free (opd->result.symkey_algo); - if (!mode && mdc != 2) + if (!aead_algo && mdc != 2) opd->result.symkey_algo = _gpgme_strconcat (algostr, ".PGPCFB", NULL); else opd->result.symkey_algo = _gpgme_strconcat (algostr, ".", modestr, NULL); if (!opd->result.symkey_algo) return gpg_error_from_syserror (); + if (!mdc && !aead_algo) + opd->not_integrity_protected = 1; + return 0; } @@ -338,13 +346,18 @@ _gpgme_decrypt_status_handler (void *priv, gpgme_status_code_t code, break; case GPGME_STATUS_EOF: - /* FIXME: These error values should probably be attributed to - the underlying crypto engine (as error source). */ + /* We force an encryption failure if we know that integrity + * protection is missing. For modern version of gpg using + * modern cipher algorithms this is not required because gpg + * will issue a failure anyway. However older gpg versions emit + * only a warning. + * Fixme: These error values should probably be attributed to + * the underlying crypto engine (as error source). */ if (opd->failed && opd->pkdecrypt_failed) return opd->pkdecrypt_failed; else if (opd->failed && opd->any_no_seckey) return gpg_error (GPG_ERR_NO_SECKEY); - else if (opd->failed) + else if (opd->failed || opd->not_integrity_protected) return gpg_error (GPG_ERR_DECRYPT_FAILED); else if (!opd->okay) return gpg_error (GPG_ERR_NO_DATA); ----------------------------------------------------------------------- Summary of changes: NEWS | 3 +++ doc/gpgme.texi | 2 +- src/decrypt.c | 27 ++++++++++++++++++++------- 3 files changed, 24 insertions(+), 8 deletions(-) hooks/post-receive -- GnuPG Made Easy http://git.gnupg.org From cvs at cvs.gnupg.org Thu May 17 09:54:16 2018 From: cvs at cvs.gnupg.org (by Andre Heinecke) Date: Thu, 17 May 2018 09:54:16 +0200 Subject: [git] GpgOL - branch, master, updated. outlook-2007-removal-6-g168792c Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GnuPG extension for MS Outlook". The branch, master has been updated via 168792c8a34d9773497ff9edb820eedb12eed6a8 (commit) via ca7dfc3a807b30525c9e3ba468b26f621f1edab8 (commit) via af65c5d0f46db05a948bc4ff6d3478354b7dd9f9 (commit) via 7f07af8575c35583c5dea06696d9cdd6261e2971 (commit) via 7fb4479dca4b066cad2479b49decf70b388eadb6 (commit) from a11688d6c8881a0e540edb1049bc9006daa37514 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 168792c8a34d9773497ff9edb820eedb12eed6a8 Author: Andre Heinecke Date: Thu May 17 09:53:28 2018 +0200 Remove GpgOLStr class -- This was more of a failed experiment and is mostly uneccesary. diff --git a/src/Makefile.am b/src/Makefile.am index 2305df2..a529f8b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -48,7 +48,6 @@ gpgol_SOURCES = \ gpgoladdin.cpp gpgoladdin.h \ gpgol.def \ gpgol-ids.h \ - gpgolstr.h gpgolstr.cpp \ keycache.cpp keycache.h \ mail.h mail.cpp \ mailitem-events.cpp \ diff --git a/src/gpgolstr.cpp b/src/gpgolstr.cpp deleted file mode 100644 index ff00259..0000000 --- a/src/gpgolstr.cpp +++ /dev/null @@ -1,61 +0,0 @@ -/* gpgolstr.cpp - String helper class for Outlook API. - * Copyright (C) 2015 by Bundesamt f?r Sicherheit in der Informationstechnik - * Software engineering by Intevation GmbH - * - * This file is part of GpgOL. - * - * GpgOL is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * GpgOL 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, see . - */ -#include "gpgolstr.h" -#include "common.h" - -GpgOLStr::GpgOLStr(const char *str) : - m_utf8str(NULL), m_widestr(NULL) -{ - if (!str) - return; - m_utf8str = strdup (str); -} - -GpgOLStr::GpgOLStr(const wchar_t *str) : - m_utf8str(NULL), m_widestr(NULL) -{ - if (!str) - return; - m_widestr = wcsdup (str); -} - -GpgOLStr::~GpgOLStr() -{ - xfree (m_utf8str); - xfree (m_widestr); -} - -GpgOLStr::operator char*() -{ - if (!m_utf8str && m_widestr) - { - m_utf8str = wchar_to_utf8_2 (m_widestr, wcslen (m_widestr)); - } - return m_utf8str; -} - -GpgOLStr::operator wchar_t*() -{ - if (!m_widestr && m_utf8str) - { - m_widestr = utf8_to_wchar2 (m_utf8str, strlen (m_utf8str)); - } - return m_widestr; -} diff --git a/src/gpgolstr.h b/src/gpgolstr.h deleted file mode 100644 index 197e435..0000000 --- a/src/gpgolstr.h +++ /dev/null @@ -1,45 +0,0 @@ -/* gpgolstr.h - String helper class for Outlook API. - * Copyright (C) 2015 by Bundesamt f?r Sicherheit in der Informationstechnik - * Software engineering by Intevation GmbH - * - * This file is part of GpgOL. - * - * GpgOL is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * GpgOL 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, see . - */ - -#include - -/* Small string wrapper that handles wchar / utf8 conversion and - can be used as a temporary object for an allocated string. - Modifying the char or wchar_t pointer directly results in - undefined behavior. - They are intended to be used for API calls that expect a - mutable string but are actually a constant. - */ -class GpgOLStr -{ -public: - GpgOLStr() : m_utf8str(NULL), m_widestr(NULL) {} - - GpgOLStr(const char *str); - GpgOLStr(const wchar_t *widestr); - ~GpgOLStr(); - - operator char* (); - operator wchar_t* (); - -private: - char *m_utf8str; - wchar_t *m_widestr; -}; diff --git a/src/mail.cpp b/src/mail.cpp index 76f1793..ca03066 100644 --- a/src/mail.cpp +++ b/src/mail.cpp @@ -33,7 +33,6 @@ #include "mymapitags.h" #include "parsecontroller.h" #include "cryptcontroller.h" -#include "gpgolstr.h" #include "windowmessages.h" #include "mlang-charset.h" #include "wks-helper.h" diff --git a/src/mapihelp.cpp b/src/mapihelp.cpp index 2cb451d..1dcef01 100644 --- a/src/mapihelp.cpp +++ b/src/mapihelp.cpp @@ -30,7 +30,6 @@ #include "rfc822parse.h" #include "mapihelp.h" #include "parsetlv.h" -#include "gpgolstr.h" #include "oomhelp.h" #include @@ -113,7 +112,7 @@ create_gpgol_tag (LPMESSAGE message, const wchar_t *name, const char *func) HRESULT hr; LPSPropTagArray proparr = NULL; MAPINAMEID mnid, *pmnid; - GpgOLStr propname(name); + wchar_t *propname = wcsdup (name); /* {31805ab8-3e92-11dc-879c-00061b031004}: GpgOL custom properties. */ GUID guid = {0x31805ab8, 0x3e92, 0x11dc, {0x87, 0x9c, 0x00, 0x06, 0x1b, 0x03, 0x10, 0x04}}; @@ -125,6 +124,7 @@ create_gpgol_tag (LPMESSAGE message, const wchar_t *name, const char *func) mnid.Kind.lpwstrName = propname; pmnid = &mnid; hr = message->GetIDsFromNames (1, &pmnid, MAPI_CREATE, &proparr); + xfree (propname); if (FAILED (hr)) proparr = NULL; if (FAILED (hr) || !(proparr->aulPropTag[0] & 0xFFFF0000) ) @@ -253,7 +253,7 @@ get_internetcharsetbody_tag (LPMESSAGE message, ULONG *r_tag) /* {4E3A7680-B77A-11D0-9DA5-00C04FD65685} */ GUID guid = {0x4E3A7680, 0xB77A, 0x11D0, {0x9D, 0xA5, 0x00, 0xC0, 0x4F, 0xD6, 0x56, 0x85}}; - GpgOLStr propname (L"Internet Charset Body"); + wchar_t propname[] = L"Internet Charset Body"; int result; memset (&mnid, 0, sizeof mnid); @@ -3572,7 +3572,7 @@ mapi_body_to_attachment (LPMESSAGE message) SPropValue prop; LPSTREAM outstream = NULL; LPUNKNOWN punk; - GpgOLStr body_filename (PGPBODYFILENAME); + char body_filename[] = PGPBODYFILENAME; instream = mapi_get_body_as_stream (message); if (!instream) diff --git a/src/mimemaker.cpp b/src/mimemaker.cpp index 7ac4796..d0da7a9 100644 --- a/src/mimemaker.cpp +++ b/src/mimemaker.cpp @@ -42,7 +42,6 @@ #include "mapihelp.h" #include "mimemaker.h" #include "oomhelp.h" -#include "gpgolstr.h" #include "mail.h" static const unsigned char oid_mimetag[] = @@ -2180,6 +2179,7 @@ mime_sign_encrypt (LPMESSAGE message, HWND hwnd, engine_filter_t filter = NULL; unsigned int session_number; char *my_sender = NULL; + char gpgstr[] = "GPG"; memset (sink, 0, sizeof *sink); memset (encsink, 0, sizeof *encsink); @@ -2219,12 +2219,11 @@ mime_sign_encrypt (LPMESSAGE message, HWND hwnd, } } - /* Create a temporary sink to construct the signed data. */ hr = OpenStreamOnFile (MAPIAllocateBuffer, MAPIFreeBuffer, (SOF_UNIQUEFILENAME | STGM_DELETEONRELEASE | STGM_CREATE | STGM_READWRITE), - NULL, GpgOLStr("GPG"), &tmpstream); + NULL, gpgstr, &tmpstream); if (FAILED (hr)) { log_error ("%s:%s: can't create temp file: hr=%#lx\n", commit ca7dfc3a807b30525c9e3ba468b26f621f1edab8 Author: Andre Heinecke Date: Thu May 17 09:23:16 2018 +0200 Remove no MIME UI -- This should reduce the amount of strings to translate and also reduce the code lying around. diff --git a/configure.ac b/configure.ac index 2d1fab6..c94f968 100644 --- a/configure.ac +++ b/configure.ac @@ -246,18 +246,6 @@ fi AC_SUBST(W32LIBS) # -# This should be a temporary option that will eventually become the -# default. -# -AC_ARG_ENABLE(mime-send, - AC_HELP_STRING([--enable-mime-send], [Enable experimental send support for mime messages]), - mime_send=$enableval, mime_send=no) -if test "$mime_send" != "no"; then - AC_DEFINE(MIME_SEND, 1, - [Sending Mime messages will be supported.]) -fi - -# # Print errors here so that they are visible all # together and the user can acquire them all together. # diff --git a/src/addin-options.cpp b/src/addin-options.cpp index 6677a30..8384efc 100644 --- a/src/addin-options.cpp +++ b/src/addin-options.cpp @@ -41,9 +41,6 @@ set_labels (HWND dlg) static struct { int itemid; const char *label; } labels[] = { { IDC_G_GENERAL, N_("General")}, { IDC_ENABLE_SMIME, N_("Enable the S/MIME support")}, -#ifndef MIME_SEND - { IDC_MIME_UI, N_("Enable simplified interface (experimental)")}, -#endif { IDC_G_SEND, N_("Message sending")}, { IDC_ENCRYPT_DEFAULT, N_("&Encrypt new messages by default")}, @@ -66,22 +63,6 @@ set_labels (HWND dlg) SetDlgItemText (dlg, labels[i].itemid, _(labels[i].label)); } - -/** Enable or disable options that are only relvant for mime ui */ -static void -enable_disable_opts (HWND hDlg) -{ - BOOL enable = opt.mime_ui ? TRUE : FALSE; - EnableWindow (GetDlgItem (hDlg, IDC_ENCRYPT_DEFAULT), enable); - EnableWindow (GetDlgItem (hDlg, IDC_SIGN_DEFAULT), enable); - char *uiserver = get_uiserver_name (); - if (!uiserver && !opt.enable_smime) - { - EnableWindow (GetDlgItem (hDlg, IDC_AUTORRESOLVE), FALSE); - } - xfree (uiserver); -} - static void launch_kleo_config (HWND hDlg) { @@ -153,17 +134,12 @@ options_window_proc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) !!opt.encrypt_default, 0L); SendDlgItemMessage (hDlg, IDC_SIGN_DEFAULT, BM_SETCHECK, !!opt.sign_default, 0L); -#ifndef MIME_SEND - SendDlgItemMessage (hDlg, IDC_MIME_UI, BM_SETCHECK, - !!opt.mime_ui, 0L); -#endif SendDlgItemMessage (hDlg, IDC_INLINE_PGP, BM_SETCHECK, !!opt.inline_pgp, 0L); SendDlgItemMessage (hDlg, IDC_REPLYCRYPT, BM_SETCHECK, !!opt.reply_crypt, 0L); SendDlgItemMessage (hDlg, IDC_AUTORRESOLVE, BM_SETCHECK, !!opt.autoresolve, 0L); - enable_disable_opts (hDlg); set_labels (hDlg); ShowWindow (GetDlgItem (hDlg, IDC_GPG_OPTIONS), opt.enable_debug ? SW_SHOW : SW_HIDE); @@ -185,18 +161,6 @@ options_window_proc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) (hDlg, IDC_ENCRYPT_DEFAULT, BM_GETCHECK, 0, 0L); opt.sign_default = !!SendDlgItemMessage (hDlg, IDC_SIGN_DEFAULT, BM_GETCHECK, 0, 0L); -#ifndef MIME_SEND - int mime_ui_old = opt.mime_ui; - opt.mime_ui = !!SendDlgItemMessage - (hDlg, IDC_MIME_UI, BM_GETCHECK, 0, 0L); - if (opt.mime_ui != mime_ui_old) - { - MessageBox (NULL, - _("Changing the interface requires a restart of Outlook."), - _("GpgOL"), - MB_ICONINFORMATION|MB_OK); - } -#endif opt.inline_pgp = !!SendDlgItemMessage (hDlg, IDC_INLINE_PGP, BM_GETCHECK, 0, 0L); diff --git a/src/common.h b/src/common.h index bd55a13..177bf6a 100644 --- a/src/common.h +++ b/src/common.h @@ -33,12 +33,6 @@ #include -#ifdef MIME_SEND -# define MIME_UI_DEFAULT 1 -#else -# define MIME_UI_DEFAULT 0 -#endif - /* Registry path to store plugin settings */ #define GPGOL_REGPATH "Software\\GNU\\GpgOL" diff --git a/src/common_indep.h b/src/common_indep.h index adfc8bf..7332dbd 100644 --- a/src/common_indep.h +++ b/src/common_indep.h @@ -196,7 +196,6 @@ struct int preview_decrypt; /* Decrypt in preview window. */ int prefer_html; /* Prefer html in html/text alternatives. */ int body_as_attachment; /* Present encrypted message as attachment. */ - int mime_ui; /* Only for Addin. Use the PGP/MIME ui */ int inline_pgp; /* Only for Addin. Use Inline PGP by default. */ int autoresolve; /* Autresolve keys with --locate-keys. */ int reply_crypt; /* Only for Addin. Encrypt / Sign based on cryptostatus. */ diff --git a/src/dialogs.h b/src/dialogs.h index be662ca..217b0d0 100644 --- a/src/dialogs.h +++ b/src/dialogs.h @@ -7,27 +7,6 @@ #define DIALOGS_H -/* Ids used for bitmaps. There is some magic in the identifiers: In - the code we only use the first ID value and add 1 to find the mask. - */ -#define IDB_ENCRYPT_16 0x1000 -#define IDB_ENCRYPT_16M 0x1001 - -#define IDB_SIGN_16 0x1010 -#define IDB_SIGN_16M 0x1011 - -#define IDB_KEY_MANAGER_16 0x1020 -#define IDB_KEY_MANAGER_16M 0x1021 - -#define IDB_DECRYPT_16 0x1030 -#define IDB_DECRYPT_16M 0x1031 - -#define IDB_VERIFY_16 0x1040 -#define IDB_VERIFY_16M 0x1041 - -#define IDB_DECRYPT_VERIFY_16 0x1050 -#define IDB_DECRYPT_VERIFY_16M 0x1051 - #define IDB_LOGO 0x1060 @@ -37,47 +16,6 @@ #define IDC_DEBUG_LOGFILE 0x4130 -/* Ids for the recipient selection dialog. */ -#define IDD_ENC 0x4210 -#define IDC_ENC_RSET1 0x4220 -#define IDC_ENC_RSET2_T 0x4230 -#define IDC_ENC_RSET2 0x4240 -#define IDC_ENC_NOTFOUND_T 0x4250 -#define IDC_ENC_NOTFOUND 0x4260 - - -/* Ids for the two decryption dialogs. */ -#define IDD_DEC 0x4310 -#define IDD_DECEXT 0x4320 -#define IDC_DEC_KEYLIST 0x4330 -#define IDC_DEC_HINT 0x4340 -#define IDC_DEC_PASSINF 0x4350 -#define IDC_DEC_PASS 0x4360 -#define IDC_DEC_HIDE 0x4370 -#define IDC_DECEXT_RSET_T 0x4380 -#define IDC_DECEXT_RSET 0x4390 -#define IDC_DECEXT_KEYLIST 0x43A0 -#define IDC_DECEXT_HINT 0x43B0 -#define IDC_DECEXT_PASSINF 0x43C0 -#define IDC_DECEXT_PASS 0x43D0 -#define IDC_DECEXT_HIDE 0x43E0 - - -/* Ids for the verification dialog. */ -#define IDD_VRY 0x4410 -#define IDC_VRY_TIME_T 0x4420 -#define IDC_VRY_TIME 0x4430 -#define IDC_VRY_PKALGO_T 0x4440 -#define IDC_VRY_PKALGO 0x4450 -#define IDC_VRY_KEYID_T 0x4460 -#define IDC_VRY_KEYID 0x4470 -#define IDC_VRY_STATUS 0x4480 -#define IDC_VRY_ISSUER_T 0x4490 -#define IDC_VRY_ISSUER 0x44A0 -#define IDC_VRY_AKALIST_T 0x44B0 -#define IDC_VRY_AKALIST 0x44C0 -#define IDC_VRY_HINT 0x44D0 - /* Ids used for the main config dialog. */ #define IDD_GPG_OPTIONS 0x5000 #define IDD_ADDIN_OPTIONS 0x5001 diff --git a/src/dialogs.rc b/src/dialogs.rc index 4ee8f3b..5687041 100644 --- a/src/dialogs.rc +++ b/src/dialogs.rc @@ -138,185 +138,17 @@ BEGIN END -/* - The dialog to select recipient keys - */ -IDD_ENC DIALOG DISCARDABLE 0, 0, 332, 215 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "GpgOL - Select Recipients" -FONT 8, "MS Sans Serif" -BEGIN - CONTROL "List1", IDC_ENC_RSET1, - "SysListView32", LVS_REPORT | LVS_NOSORTHEADER | - WS_BORDER | WS_TABSTOP, - 8, 4, 314, 92 - - LTEXT "Ausgew?hlte Empf?nger:", IDC_ENC_RSET2_T, - 8, 98, 130, 8 - - CONTROL "List2", IDC_ENC_RSET2, - "SysListView32", LVS_REPORT | LVS_NOSORTHEADER | - WS_BORDER | WS_TABSTOP, - 8, 110, 313, 49 - - LTEXT "Recipient which were NOT found", IDC_ENC_NOTFOUND_T, - 8, 161, 128, 8 - - LISTBOX IDC_ENC_NOTFOUND, - 8, 170, 313, 22, LBS_SORT | LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_TABSTOP - - DEFPUSHBUTTON "&OK", IDOK, - 221, 196, 50, 14 - - PUSHBUTTON "&Cancel-btn", IDCANCEL, - 273, 196, 50, 14 -END - - -/* - The decryption dialog used to select the secret key. -*/ -IDD_DEC DIALOG DISCARDABLE 0, 0, 225, 101 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Secret Key Selection" -FONT 8, "MS Sans Serif" -BEGIN - COMBOBOX IDC_DEC_KEYLIST, - 9, 7, 209, 58, CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - - LTEXT "", IDC_DEC_HINT, - 9, 25, 201, 10 - - LTEXT "enter-passphrase", IDC_DEC_PASSINF, - 9, 37, 158, 8 - - EDITTEXT IDC_DEC_PASS, - 9, 51, 207, 12, ES_PASSWORD | ES_AUTOHSCROLL - - CONTROL "&Hide Typing", IDC_DEC_HIDE, - "Button", BS_AUTOCHECKBOX | WS_TABSTOP, - 138, 64, 81, 10 - - DEFPUSHBUTTON "&OK", IDOK, - 115, 83, 50, 14 - - PUSHBUTTON "&Cancel-btn", IDCANCEL, - 167, 83, 50, 14 -END - - -/* - The extended decryption dialog used to select the secret key. -*/ -IDD_DECEXT DIALOG DISCARDABLE 0, 0, 207, 134 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "GpgOL - Secret Key Selection" -FONT 8, "MS Sans Serif" -BEGIN - LTEXT "encrypted-to",IDC_DECEXT_RSET_T, - 7, 4, 128, 8 - - LISTBOX IDC_DECEXT_RSET, - 7, 16, 193, 25, LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_TABSTOP - - COMBOBOX IDC_DECEXT_KEYLIST, - 8, 54, 191, 14, CBS_DROPDOWN | CBS_SORT | - WS_DISABLED | WS_VSCROLL | WS_TABSTOP - - LTEXT "", IDC_DECEXT_HINT, - 7, 73, 193, 8 - - LTEXT "enter-passphrase", IDC_DECEXT_PASSINF, - 7, 85, 158, 8 - - EDITTEXT IDC_DECEXT_PASS, - 7, 96, 192, 12, ES_PASSWORD | ES_AUTOHSCROLL - - CONTROL "hide-typing", IDC_DECEXT_HIDE, - "Button", BS_AUTOCHECKBOX | WS_TABSTOP, - 122, 108, 81, 10 - - DEFPUSHBUTTON "OK", IDOK, - 98, 125, 50, 14 - - PUSHBUTTON "&Cancel-btn", IDCANCEL, - 149, 125, 50, 14 -END - - -/* - The dialog to display verification results. -*/ -IDD_VRY DIALOG DISCARDABLE 0, 0, 253, 116 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "GpgOL - Signature Verification Result" -FONT 8, "MS Sans Serif" -BEGIN - LTEXT "made-at", IDC_VRY_TIME_T, - 3, 6, 50, 8 - - EDITTEXT IDC_VRY_TIME, - 55, 4, 76, 12, ES_AUTOHSCROLL | ES_READONLY - - LTEXT "using", IDC_VRY_PKALGO_T, - 132, 6, 18, 8 - - EDITTEXT IDC_VRY_PKALGO, - 152, 4, 20, 12, ES_AUTOHSCROLL | ES_READONLY - - LTEXT "key-id", IDC_VRY_KEYID_T, - 174, 7, 50, 8 - - EDITTEXT IDC_VRY_KEYID, - 196, 4, 51, 12, ES_AUTOHSCROLL | ES_READONLY - - EDITTEXT IDC_VRY_STATUS, - 3, 29, 92, 12, ES_AUTOHSCROLL | ES_READONLY - - LTEXT "from", IDC_VRY_ISSUER_T, - 98, 31, 14, 8 - - EDITTEXT IDC_VRY_ISSUER, - 117, 29, 131, 13, ES_AUTOHSCROLL | ES_READONLY - - LTEXT "aka", IDC_VRY_AKALIST_T, - 3, 47, 56, 8 - - LISTBOX IDC_VRY_AKALIST, - 3, 56, 245, 25, LBS_SORT | LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_TABSTOP - - LTEXT "", IDC_VRY_HINT, - 3, 83, 245, 10 - - DEFPUSHBUTTON "&OK", IDOK, - 198, 96, 50, 14 -END - IDD_ADDIN_OPTIONS DIALOGEX DISCARDABLE 300, 300, 286, 190 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | DS_SHELLFONT | DS_SETFONT CAPTION "GpgOL" FONT 8, "MS Shell Dlg" BEGIN /* General options box. */ -#ifdef MIME_SEND GROUPBOX "general-options", IDC_G_GENERAL, 9, 9, 270, 25 -#else - GROUPBOX "general-options", IDC_G_GENERAL, - 9, 9, 270, 35 -#endif CONTROL "enable-smime", IDC_ENABLE_SMIME, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 24, 19, 235, 10 -#ifndef MIME_SEND - CONTROL "enable-mime-ui", IDC_MIME_UI, - "Button", BS_AUTOCHECKBOX | WS_TABSTOP, - 24, 29, 235, 10 -#endif /* Send options box. */ GROUPBOX "send-options", IDC_G_SEND, diff --git a/src/gpgoladdin.cpp b/src/gpgoladdin.cpp index c163647..0cadbc8 100644 --- a/src/gpgoladdin.cpp +++ b/src/gpgoladdin.cpp @@ -63,10 +63,6 @@ ULONG addinLocks = 0; bool can_unload = false; -/* Invalidating the interface does not take a nice effect so we store - this option in a global variable. */ -bool use_mime_ui = false; - static std::list g_ribbon_uis; static GpgolAddin * addin_instance = NULL; @@ -179,7 +175,6 @@ GpgolAddin::GpgolAddin (void) : m_lRef(0), m_hook(nullptr) { read_options (); - use_mime_ui = opt.mime_ui; /* RibbonExtender is it's own object to avoid the pitfalls of multiple inheritance */ @@ -677,10 +672,6 @@ GpgolRibbonExtender::GetIDsOfNames (REFIID riid, LPOLESTR *rgszNames, and we give it one of our own dispIds's that are later handled in the invoke part */ ID_MAPPER (L"attachmentDecryptCallback", ID_CMD_DECRYPT) - ID_MAPPER (L"encryptSelection", ID_CMD_ENCRYPT_SELECTION) - ID_MAPPER (L"decryptSelection", ID_CMD_DECRYPT_SELECTION) - ID_MAPPER (L"startCertManager", ID_CMD_CERT_MANAGER) - ID_MAPPER (L"btnCertManager", ID_BTN_CERTMANAGER) ID_MAPPER (L"btnDecrypt", ID_BTN_DECRYPT) ID_MAPPER (L"btnDecryptLarge", ID_BTN_DECRYPT_LARGE) ID_MAPPER (L"btnEncrypt", ID_BTN_ENCRYPT) @@ -692,12 +683,6 @@ GpgolRibbonExtender::GetIDsOfNames (REFIID riid, LPOLESTR *rgszNames, ID_MAPPER (L"btnSignLarge", ID_BTN_SIGN_LARGE) ID_MAPPER (L"btnVerifyLarge", ID_BTN_VERIFY_LARGE) ID_MAPPER (L"btnSigstateLarge", ID_BTN_SIGSTATE_LARGE) - ID_MAPPER (L"encryptBody", ID_CMD_ENCRYPT_BODY) - ID_MAPPER (L"decryptBody", ID_CMD_DECRYPT_BODY) - ID_MAPPER (L"addEncSignedAttachment", ID_CMD_ATT_ENCSIGN_FILE) - ID_MAPPER (L"addEncAttachment", ID_CMD_ATT_ENC_FILE) - ID_MAPPER (L"signBody", ID_CMD_SIGN_BODY) - ID_MAPPER (L"verifyBody", ID_CMD_VERIFY_BODY) /* MIME support: */ ID_MAPPER (L"encryptMime", ID_CMD_MIME_ENCRYPT) @@ -753,24 +738,6 @@ GpgolRibbonExtender::Invoke (DISPID dispid, REFIID riid, LCID lcid, /* We can assume that this points to an implementation of IRibbonControl as we know the callback dispid. */ return decryptAttachments (parms->rgvarg[0].pdispVal); - case ID_CMD_ENCRYPT_SELECTION: - return encryptSelection (parms->rgvarg[0].pdispVal); - case ID_CMD_DECRYPT_SELECTION: - return decryptSelection (parms->rgvarg[0].pdispVal); - case ID_CMD_CERT_MANAGER: - return startCertManager (parms->rgvarg[0].pdispVal); - case ID_CMD_ENCRYPT_BODY: - return encryptBody (parms->rgvarg[0].pdispVal); - case ID_CMD_DECRYPT_BODY: - return decryptBody (parms->rgvarg[0].pdispVal); - case ID_CMD_ATT_ENCSIGN_FILE: - return addEncSignedAttachment (parms->rgvarg[0].pdispVal); - case ID_CMD_ATT_ENC_FILE: - return addEncAttachment (parms->rgvarg[0].pdispVal); - case ID_CMD_SIGN_BODY: - return signBody (parms->rgvarg[0].pdispVal); - case ID_CMD_VERIFY_BODY: - return verifyBody (parms->rgvarg[0].pdispVal); case ID_CMD_SIGN_ENCRYPT_MIME: return mark_mime_action (parms->rgvarg[1].pdispVal, OP_SIGN|OP_ENCRYPT, false); @@ -832,7 +799,6 @@ GpgolRibbonExtender::Invoke (DISPID dispid, REFIID riid, LCID lcid, return print_decrypted (parms->rgvarg[0].pdispVal); case ID_GET_IS_CRYPTO_MAIL: return get_is_crypto_mail (parms->rgvarg[0].pdispVal, result); - case ID_BTN_CERTMANAGER: case ID_BTN_ENCRYPT: case ID_BTN_DECRYPT: case ID_BTN_DECRYPT_LARGE: @@ -1122,336 +1088,10 @@ GetCustomUI_MIME (BSTR RibbonID, BSTR * RibbonXml) return S_OK; } -/* This is the old pre-mime adding UI code. It will be removed once we have a - stable version that can also send mime messages. -*/ -static STDMETHODIMP -GetCustomUI_old (BSTR RibbonID, BSTR * RibbonXml) -{ - char *buffer = NULL; - const char *certManagerTTip = - _("Start the Certificate Management Software"); - const char *certManagerSTip = - _("Open GPA or Kleopatra to manage your certificates. " - "You can use this you to generate your " - "own certificates. "); - const char *encryptTextTTip = - _("Encrypt the text of the message"); - const char *encryptTextSTip = - _("Choose the certificates for which the message " - "should be encrypted and replace the text " - "with the encrypted message."); - const char *encryptFileTTip = - _("Add a file as an encrypted attachment"); - const char *encryptFileSTip = - _("Encrypts a file and adds it as an attachment to the " - "message. "); - const char *encryptSignFileTTip = - _("Add a file as an encrypted attachment with a signature"); - const char *encryptSignFileSTip = - _("Encrypts a file, signs it and adds both the encrypted file " - "and the signature as attachments to the message. "); - const char *decryptTextTTip= - _("Decrypt the message"); - const char *decryptTextSTip = - _("Look for PGP or S/MIME encrypted data in the message text " - "and decrypt it."); - const char *signTextTTip = - _("Add a signature of the message"); - const char *signTextSTip = - _("Appends a signed copy of the message text in an opaque signature. " - "An opaque signature ensures that the signed text is not modified by " - "embedding it in the signature itself. " - "The combination of the signed message text and your signature is " - "added below the plain text. " - "The message will not be encrypted!"); - const char *optsSTip = - _("Open the settings dialog for GpgOL."); - - log_debug ("%s:%s: GetCustomUI for id: %ls", SRCNAME, __func__, RibbonID); - - if (!RibbonXml) - return E_POINTER; - - if (!wcscmp (RibbonID, L"Microsoft.Outlook.Mail.Compose")) - { - gpgrt_asprintf (&buffer, - "" - " " - " " - " " - " " - "