Tweak for some opaque S/MIME messages.
authorWerner Koch <wk@gnupg.org>
Tue, 26 Feb 2008 12:17:34 +0000 (12:17 +0000)
committerWerner Koch <wk@gnupg.org>
Tue, 26 Feb 2008 12:17:34 +0000 (12:17 +0000)
Pop up messages on errors.

NEWS
configure.ac
doc/gpgol.texi
po/de.po
po/sv.po
src/ChangeLog
src/common.c
src/common.h
src/mapihelp.cpp
src/message.cpp
src/mimeparser.c

diff --git a/NEWS b/NEWS
index 2a4f05a..b3e48c4 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,9 +1,22 @@
-Noteworthy changes for version 0.10.5 (2008-02-18)
+Noteworthy changes for version 0.10.6
 ==================================================
 
  UNDER HEAVY DEVELOPMENT - DO NOT USE FOR PRODUCTION!
     - Under OL2007 some menu entries are missing.
 
+ * More tweaks to allow processing of opaque encrypted or signed
+   S/MIME.
+
+ * Shows an error message when trying to decrypt/verify messages not
+   signed or encrypted.
+
+ * Soft line breaks in QP encoded messages are now correctly
+   processed.
+
+
+Noteworthy changes for version 0.10.5 (2008-02-18)
+==================================================
+
  * PGP inline encrypted mails are not anymore deleted after the first
    decryption.
 
index d23299b..9eabd01 100644 (file)
@@ -16,8 +16,8 @@ min_automake_version="1.9.4"
 # Remember to change the version number immediately *after* a release.
 # Set my_issvn to "yes" for non-released code.  Remember to run an
 # "svn up" and "autogen.sh" right before creating a distribution.
-m4_define([my_version], [0.10.5])
-m4_define([my_issvn], [no])
+m4_define([my_version], [0.10.6])
+m4_define([my_issvn], [yes])
 
 m4_define([svn_revision], m4_esyscmd([echo -n $( (svn info 2>/dev/null \
             || echo 'Revision: 0')|sed -n '/^Revision:/ {s/[^0-9]//gp;q;}')]))
index d41706f..28ae75c 100644 (file)
@@ -518,7 +518,7 @@ it uses the Assuan command:
 
 @deffn Command START_KEYMANAGER
 The server shall pop up the main window of the key manager (aka
-certificate manager).  The client expects that the key manger is brought
+certificate manager).  The client expects that the key manager is brought
 into the foregound and that this command immediatley returns (does not
 wait until the key manager has been fully brought up).
 @end deffn
index 7d63c78..571ccc7 100644 (file)
--- a/po/de.po
+++ b/po/de.po
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: GpgOL 0.10.0\n"
 "Report-Msgid-Bugs-To: bug-gpgol@g10code.com\n"
-"POT-Creation-Date: 2008-02-11 14:15+0100\n"
-"PO-Revision-Date: 2008-02-15 17:47+0100\n"
+"POT-Creation-Date: 2008-02-26 12:47+0100\n"
+"PO-Revision-Date: 2008-02-26 12:54+0100\n"
 "Last-Translator: Werner Koch <wk@gnupg.org>\n"
 "Language-Team: de\n"
 "MIME-Version: 1.0\n"
@@ -64,9 +64,11 @@ msgid ""
 "This is limited to the PGP/MIME protocol and thus S/MIME protected message "
 "are not readable."
 msgstr ""
-"Achtung: Die GnuPG Benutzeroberfläche \"Kleopatra\" konnte nicht gefunden werden.\n"
+"Achtung: Die GnuPG Benutzeroberfläche \"Kleopatra\" konnte nicht gefunden "
+"werden.\n"
 "\n"
-"Um GpgOL zu nutzen probieren Sie bitte eine der folgenden Möglichkeiten aus:\n"
+"Um GpgOL zu nutzen probieren Sie bitte eine der folgenden Möglichkeiten "
+"aus:\n"
 "\n"
 "1. Entweder: Outlook beenden und erneut starten.\n"
 "\n"
@@ -75,6 +77,7 @@ msgstr ""
 "   Sobald \"Kleopatra\" läuft, erneut Outlook starten."
 
 #: src/engine.c:369 src/ext-commands.cpp:683 src/main.c:603 src/main.c:609
+#: src/message.cpp:326
 msgid "GpgOL"
 msgstr "GpgOL"
 
@@ -338,7 +341,7 @@ msgstr ""
 "\n"
 "geschrieben."
 
-#: src/mapihelp.cpp:1486
+#: src/mapihelp.cpp:1516
 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 "
@@ -348,7 +351,7 @@ msgstr ""
 "Outlook Sitzung entschlüsselt wurde.  Verwenden Sie den Menüpunkt "
 "\"entschlüsseln/verifizieren\" um den Inhalt wieder sichtbar zu machen.]"
 
-#: src/mapihelp.cpp:2150
+#: src/mapihelp.cpp:2257
 msgid ""
 "[The content of this message is not visible due to an processing error in "
 "GpgOL.]"
@@ -367,48 +370,79 @@ msgstr ""
 "Sie sicher, daß lediglich das Text Format ausgewählt wurde.\n"
 "(In der Menüleiste: \"Format\" => \"Nur Text\")"
 
-#: src/message.cpp:163
+#: src/message.cpp:171
 msgid "[Crypto operation failed - can't show the body of the message]"
 msgstr ""
 "[Krypto-Operation ist fehlgeschlagen - Der Text der Nachricht kann nicht "
 "angezeigt werden.]"
 
-#: src/message.cpp:271
+#: src/message.cpp:306
 #, c-format
 msgid ""
-"Message class: %s\n"
-"Sig Status   : %s\n"
-"Structure of the message:\n"
+"Signature status: %s\n"
+"Message class ..: %s\n"
+"MIME structure .:\n"
 "%s"
 msgstr ""
-"Nachrichtenklasse: %s\n"
-"Signatur-Status: %s\n"
-"Struktur der Nachricht:\n"
+"Status der Unterschrift: %s\n"
+"Nachrichtenklasse .....: %s\n"
+"Struktur der Nachricht :\n"
 "%s"
 
-#: src/message.cpp:279
+#: src/message.cpp:314
 msgid "GpgOL - Message Information"
 msgstr "GpgOL - Informationen zu der Nachricht"
 
-#: src/message.cpp:967
+#: src/message.cpp:538
+msgid "Signature verification of an encrypted message is not possible."
+msgstr "Die Prüfung der Unterschrift ist bei einer verschlüsselten Nachrichten nicht möglich."
+
+#: src/message.cpp:549
+msgid "Signature verification of this message class is not possible."
+msgstr "Die Prüfung der Unterschrift ist bei dieser Nachrichtenklasse nicht möglich."
+
+#: src/message.cpp:552
+msgid ""
+"Signature verification of this S/MIME message is not possible.  Please check "
+"that S/MIME processing has been enabled."
+msgstr "Die Prüfung der Unterschrift ist bei dieser S/MIME Nachricht nicht möglich.  Bitte überprüfen Sie in den Einstellungen, daß die Verarbeitung von S/MIME eingeschaltet ist."
+
+#: src/message.cpp:556
+msgid "This message has no signature."
+msgstr "Diese Nachricht hat keine Unterschrift."
+
+#: src/message.cpp:856
+msgid "This message is not encrypted."
+msgstr "Diese Nachricht ist nicht verschlüsselt."
+
+#: src/message.cpp:1080
+#, c-format
+msgid ""
+"Decryption failed\n"
+"(%s)"
+msgstr ""
+"Entschlüsselungsfehler\n"
+"(%s)"
+
+#: src/message.cpp:1208
 msgid "No recipients to encrypt to are given"
 msgstr "Empfänger zum Verschlüsseln wurde nicht angegeben"
 
-#: src/message.cpp:983
+#: src/message.cpp:1224
 #, c-format
 msgid "Encryption failed (%s)"
 msgstr "Verschlüsselungsfehler (%s)"
 
-#: src/message.cpp:1004
+#: src/message.cpp:1245
 #, c-format
 msgid "Signing failed (%s)"
 msgstr "Unterschrifterstellungsfehler (%s)"
 
-#: src/mimeparser.c:1063
+#: src/mimeparser.c:1072
 msgid "Error writing to stream"
 msgstr "Dateischreibfehler"
 
-#: src/mimeparser.c:1064
+#: src/mimeparser.c:1073
 msgid "I/O-Error"
 msgstr "Ein-/Ausgabefehler"
 
@@ -432,10 +466,6 @@ msgstr "S/MIME per Voreinstellung verwenden"
 msgid "Enable the S/MIME support"
 msgstr "S/MIME Unterstützung einschalten"
 
-#: src/olflange-dlgs.cpp:51
-msgid "Also encrypt message with the default certificate"
-msgstr "Nachricht ebenfalls an das voreingestellte Zertifikat verschlüsseln"
-
 #: src/olflange-dlgs.cpp:52
 msgid "Also decrypt in preview window"
 msgstr "Auch im Vorschaufenster entschlüsseln"
@@ -460,11 +490,6 @@ msgstr "Minuten"
 msgid "Ad&vanced.."
 msgstr "&Erweitert..."
 
-#: src/olflange-dlgs.cpp:258
-msgid "The default certificate may not contain any spaces."
-msgstr ""
-"Der Bezeichner für das Standardzertifikat darf keine Leerzeichen enthalten."
-
 #: src/olflange-dlgs.cpp:280
 msgid ""
 "You have enabled GpgOL's support for the S/MIME protocol.\n"
@@ -476,7 +501,12 @@ msgid ""
 msgstr ""
 "Sie haben die S/MIME Unterstützung von GpgOL eingeschaltet.\n"
 "\n"
-"Neue S/MIME Nachrichten werden jetzt nur noch mittels GpgOL sichtbar sein und nicht mehr über Outlooks interne S/MIME Unterstützung.  Diese Nachrichten werden auch dann nicht mehr mit Outlook lesbar sein, wenn GpgOL deinstalliert wurde.  Mit dem Erscheinen der endgültigen Version von GpgOL wird aber ein Werkzeug bereitgestellt werden, welches dieses Problem lösen kann."
+"Neue S/MIME Nachrichten werden jetzt nur noch mittels GpgOL sichtbar sein "
+"und nicht mehr über Outlooks interne S/MIME Unterstützung.  Diese "
+"Nachrichten werden auch dann nicht mehr mit Outlook lesbar sein, wenn GpgOL "
+"deinstalliert wurde.  Mit dem Erscheinen der endgültigen Version von GpgOL "
+"wird aber ein Werkzeug bereitgestellt werden, welches dieses Problem lösen "
+"kann."
 
 #. TRANSLATORS: See the source for the full english text.
 #: src/olflange-dlgs.cpp:329
@@ -668,8 +698,24 @@ msgstr "PGP/MIME Prüfungsresultat"
 msgid "S/MIME Verification Result"
 msgstr "S/MIME Prüfungsresultat"
 
-#~ msgid "Decrypt message and verify signature"
-#~ msgstr "Nachricht entschlüsseln und Unterschrift prüfen"
+#~ msgid ""
+#~ "Message class: %s\n"
+#~ "Sig Status   : %s\n"
+#~ "Structure of the message:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Nachrichtenklasse: %s\n"
+#~ "Signatur-Status: %s\n"
+#~ "Struktur der Nachricht:\n"
+#~ "%s"
+
+#~ msgid "Also encrypt message with the default certificate"
+#~ msgstr "Nachricht ebenfalls an das voreingestellte Zertifikat verschlüsseln"
+
+#~ msgid "The default certificate may not contain any spaces."
+#~ msgstr ""
+#~ "Der Bezeichner für das Standardzertifikat darf keine Leerzeichen "
+#~ "enthalten."
 
 #~ msgid "Select GPG Key Manager"
 #~ msgstr "Das Schlüsselverwaltungsprogramm festlegen"
index b172a70..b1a26a8 100644 (file)
--- a/po/sv.po
+++ b/po/sv.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: GPGol\n"
 "Report-Msgid-Bugs-To: bug-gpgol@g10code.com\n"
-"POT-Creation-Date: 2008-02-11 14:15+0100\n"
+"POT-Creation-Date: 2008-02-26 12:47+0100\n"
 "PO-Revision-Date: 2006-12-12 23:52+0100\n"
 "Last-Translator: Daniel Nylander <po@danielnylander.se>\n"
 "Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
@@ -67,6 +67,7 @@ msgid ""
 msgstr ""
 
 #: src/engine.c:369 src/ext-commands.cpp:683 src/main.c:603 src/main.c:609
+#: src/message.cpp:326
 msgid "GpgOL"
 msgstr ""
 
@@ -338,14 +339,14 @@ msgid ""
 "\"%s\""
 msgstr ""
 
-#: src/mapihelp.cpp:1486
+#: src/mapihelp.cpp:1516
 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 ""
 
-#: src/mapihelp.cpp:2150
+#: src/mapihelp.cpp:2257
 msgid ""
 "[The content of this message is not visible due to an processing error in "
 "GpgOL.]"
@@ -362,43 +363,73 @@ msgstr ""
 "och inte RTF-meddelanden. Se till att endast textformatet\n"
 "har valts i inställningarna."
 
-#: src/message.cpp:163
+#: src/message.cpp:171
 msgid "[Crypto operation failed - can't show the body of the message]"
 msgstr ""
 
-#: src/message.cpp:271
+#: src/message.cpp:306
 #, c-format
 msgid ""
-"Message class: %s\n"
-"Sig Status   : %s\n"
-"Structure of the message:\n"
+"Signature status: %s\n"
+"Message class ..: %s\n"
+"MIME structure .:\n"
 "%s"
 msgstr ""
 
-#: src/message.cpp:279
+#: src/message.cpp:314
 msgid "GpgOL - Message Information"
 msgstr ""
 
-#: src/message.cpp:967
+#: src/message.cpp:538
+msgid "Signature verification of an encrypted message is not possible."
+msgstr ""
+
+#: src/message.cpp:549
+msgid "Signature verification of this message class is not possible."
+msgstr ""
+
+#: src/message.cpp:552
+msgid ""
+"Signature verification of this S/MIME message is not possible.  Please check "
+"that S/MIME processing has been enabled."
+msgstr ""
+
+#: src/message.cpp:556
+#, fuzzy
+msgid "This message has no signature."
+msgstr "Dekryptera meddelandet och validera signaturen"
+
+#: src/message.cpp:856
+msgid "This message is not encrypted."
+msgstr ""
+
+#: src/message.cpp:1080
+#, fuzzy, c-format
+msgid ""
+"Decryption failed\n"
+"(%s)"
+msgstr "Kryptering misslyckades"
+
+#: src/message.cpp:1208
 msgid "No recipients to encrypt to are given"
 msgstr ""
 
-#: src/message.cpp:983
+#: src/message.cpp:1224
 #, fuzzy, c-format
 msgid "Encryption failed (%s)"
 msgstr "Kryptering misslyckades"
 
-#: src/message.cpp:1004
+#: src/message.cpp:1245
 #, fuzzy, c-format
 msgid "Signing failed (%s)"
 msgstr "Signering misslyckades"
 
-#: src/mimeparser.c:1063
+#: src/mimeparser.c:1072
 #, fuzzy
 msgid "Error writing to stream"
 msgstr "Fel vid skrivning av fil"
 
-#: src/mimeparser.c:1064
+#: src/mimeparser.c:1073
 msgid "I/O-Error"
 msgstr "In-/Ut-fel"
 
@@ -423,11 +454,6 @@ msgstr ""
 msgid "Enable the S/MIME support"
 msgstr ""
 
-#: src/olflange-dlgs.cpp:51
-#, fuzzy
-msgid "Also encrypt message with the default certificate"
-msgstr "Kryptera meddelandet med GPG"
-
 #: src/olflange-dlgs.cpp:52
 msgid "Also decrypt in preview window"
 msgstr ""
@@ -452,11 +478,6 @@ msgstr ""
 msgid "Ad&vanced.."
 msgstr ""
 
-#: src/olflange-dlgs.cpp:258
-#, fuzzy
-msgid "The default certificate may not contain any spaces."
-msgstr "Standardnyckeln får inte innehålla några blanksteg."
-
 #: src/olflange-dlgs.cpp:280
 msgid ""
 "You have enabled GpgOL's support for the S/MIME protocol.\n"
@@ -644,8 +665,13 @@ msgstr "Resultat från validering"
 msgid "S/MIME Verification Result"
 msgstr "Resultat från validering"
 
-#~ msgid "Decrypt message and verify signature"
-#~ msgstr "Dekryptera meddelandet och validera signaturen"
+#, fuzzy
+#~ msgid "Also encrypt message with the default certificate"
+#~ msgstr "Kryptera meddelandet med GPG"
+
+#, fuzzy
+#~ msgid "The default certificate may not contain any spaces."
+#~ msgstr "Standardnyckeln får inte innehålla några blanksteg."
 
 #~ msgid "Select GPG Key Manager"
 #~ msgstr "Välj GPG-nyckelhanterare"
index 99550f9..1069e38 100644 (file)
@@ -1,3 +1,18 @@
+2008-02-26  Werner Koch  <wk@g10code.com>
+
+       * common.c (qp_decode): Add arg S_LBRK.
+       * mimeparser.c (plaintext_handler, ciphertext_handler): Handle
+       soft line breaks.
+
+       * mapihelp.cpp (mapi_change_message_class): Handle opaque S/MIME
+       messages without an smime-type parameter.
+
+2008-02-25  Werner Koch  <wk@g10code.com>
+
+       * message.cpp (message_verify): Show message boxes for non-signed
+       messages.
+       (message_decrypt): Likewise.
+
 2008-02-19  Marcus Brinkmann  <marcus@g10code.de>
 
        * engine-assuan.c (get_uiserver_name): Change default uiserver
index c94dd8c..b2f81cf 100644 (file)
@@ -599,12 +599,19 @@ default_homedir (void)
 
 
 /* Do in-place decoding of quoted-printable data of LENGTH in BUFFER.
-   Returns the new length of the buffer. */
+   Returns the new length of the buffer and stores true at R_SLBRK if
+   the line ended with a soft line break; false is stored if not.
+   This fucntion asssumes that a complete line is passed in
+   buffer.  */
 size_t
-qp_decode (char *buffer, size_t length)
+qp_decode (char *buffer, size_t length, int *r_slbrk)
 {
   char *d, *s;
 
+  if (r_slbrk)
+    *r_slbrk = 0;
+
+  /* Fixme:  We should remove trailing white space first.  */
   for (s=d=buffer; length; length--)
     if (*s == '=')
       {
@@ -620,12 +627,23 @@ qp_decode (char *buffer, size_t length)
             /* Soft line break.  */
             s += 3;
             length -= 2;
+            if (r_slbrk && length == 1)
+              *r_slbrk = 1;
           }
         else if (length > 1 && s[1] == '\n')
           {
             /* Soft line break with only a Unix line terminator. */
             s += 2;
             length -= 1;
+            if (r_slbrk && length == 1)
+              *r_slbrk = 1;
+          }
+        else if (length == 1)
+          {
+            /* Soft line break at the end of the line. */
+            s += 1;
+            if (r_slbrk)
+              *r_slbrk = 1;
           }
         else
           *d++ = *s++;
index 3f2375d..a3170bb 100644 (file)
@@ -181,7 +181,7 @@ char *utf8_to_wincp (const char *string);
 
 const char *default_homedir (void);
 
-size_t qp_decode (char *buffer, size_t length);
+size_t qp_decode (char *buffer, size_t length, int *r_slbrk);
 void b64_init (b64_state_t *state);
 size_t b64_decode (b64_state_t *state, char *buffer, size_t length);
 
index 63d31d2..7ac1fc0 100644 (file)
@@ -500,14 +500,21 @@ get_msgcls_from_pgp_lines (LPMESSAGE message)
 }
 
 
-/* Check whether the message is really a CMS encrypted message.  This
-   function is required due to a bug in CryptoEx which sometimes
-   assignes the *.CexEnc message class to signed messages and only
-   updates the message class after accessing them.  Thus in old stores
-   there may be a lot of *.CexEnc message which are actually just
-   signed.  We check here whether such a message is really encrypted
-   by looking at the object identifier inside the CMS data.  Returns
-   true if the message is really encrypted.  */
+/* Check whether the message is really a CMS encrypted message.  
+   We check here whether the message is really encrypted by looking at
+   the object identifier inside the CMS data.  Returns true if the
+   message is really encrypted.
+
+   This function is required for two reasons: 
+
+   1. Due to a bug in CryptoEx which sometimes assignes the *.CexEnc
+      message class to signed messages and only updates the message
+      class after accessing them.  Thus in old stores there may be a
+      lot of *.CexEnc message which are actually just signed.
+   2. Is the smime-typeparameter is missing we need another way to
+      decide whether to decrypt or to verify.
+ */
 static int
 is_really_cms_encrypted (LPMESSAGE message)
 {    
@@ -746,6 +753,18 @@ mapi_change_message_class (LPMESSAGE message, int sync_override)
                     }
                   xfree (smtype);
                 }
+              else
+                {
+                  /* No smime type.  The filename parameter is often
+                     not reliable, thus we better look into the
+                     message to see whetehr it is encrypted and assume
+                     an opaque signed one if not.  */
+                  if (is_really_cms_encrypted (message))
+                    newvalue = xstrdup ("IPM.Note.GpgOL.OpaqueEncrypted");
+                  else
+                    newvalue = xstrdup ("IPM.Note.GpgOL.OpaqueSigned");
+                }
+              
               xfree (ct);
             }
           if (!newvalue)
index 7993f31..00d6727 100644 (file)
@@ -30,6 +30,7 @@
 #include "mimeparser.h"
 #include "mimemaker.h"
 #include "display.h"
+#include "ol-ext-callback.h"
 #include "message.h"
 
 #define TRACEPOINT() do { log_debug ("%s:%s:%d: tracepoint\n", \
@@ -157,14 +158,21 @@ message_display_handler (LPEXCHEXTCALLBACK eecb, HWND hwnd)
       err = mapi_get_gpgol_body_attachment (message, &body, NULL, 
                                             &ishtml, &wasprotected);
       if (!err && body)
-        update_display (hwnd, /*wasprotected? NULL:*/ eecb, ishtml, body);
+        {
+          put_outlook_property (eecb, "GpgOLStatus", 
+                                mapi_get_sig_status (message));
+
+          update_display (hwnd, /*wasprotected? NULL:*/ eecb, ishtml, body);
+        }
       else
-        update_display (hwnd, NULL, 0, 
-                        _("[Crypto operation failed - "
-                          "can't show the body of the message]"));
+        {
+          put_outlook_property (eecb, "GpgOLStatus", "?");
+          update_display (hwnd, NULL, 0, 
+                          _("[Crypto operation failed - "
+                            "can't show the body of the message]"));
+        }
       xfree (body);
   
-      /*  put_outlook_property (eecb, "EncryptedStatus", "MyStatus"); */
     }
   else
     log_debug_w32 (hr, "%s:%s: error getting message", SRCNAME, __func__);
@@ -312,6 +320,12 @@ message_show_info (LPMESSAGE message, HWND hwnd)
 }
 
 
+static void
+show_message (HWND hwnd, const char *text)
+{
+  MessageBox (hwnd, text, _("GpgOL"), MB_ICONINFORMATION|MB_OK);
+}
+
 
 \f
 /* Convert the clear signed message from INPUT into a PGP/MIME signed
@@ -520,12 +534,26 @@ message_verify (LPMESSAGE message, msgtype_t msgtype, int force, HWND hwnd)
     case MSGTYPE_GPGOL_PGP_MESSAGE:
       log_debug ("%s:%s: message of type %d not expected",
                  SRCNAME, __func__, msgtype);
+      if (force)
+        show_message (hwnd, _("Signature verification of an encrypted message "
+                              "is not possible."));
       return -1; /* Should not be called for such a message.  */
-    case MSGTYPE_UNKNOWN:
-    case MSGTYPE_SMIME:
     case MSGTYPE_GPGOL:
-      log_debug ("%s:%s: message of type %d ignored",
+    case MSGTYPE_SMIME:
+    case MSGTYPE_UNKNOWN:
+      log_debug ("%s:%s: message of type %d ignored", 
                  SRCNAME, __func__, msgtype);
+      if (!force)
+        ;
+      else if (msgtype == MSGTYPE_GPGOL)
+        show_message (hwnd, _("Signature verification of this "
+                              "message class is not possible."));
+      else if (msgtype == MSGTYPE_SMIME)
+        show_message (hwnd, _("Signature verification of this "
+                              "S/MIME message is not possible.  Please check "
+                              "that S/MIME processing has been enabled."));
+      else
+        show_message (hwnd, _("This message has no signature."));
       return 0; /* Nothing to do.  */
     }
   
@@ -824,6 +852,8 @@ message_decrypt (LPMESSAGE message, msgtype_t msgtype, int force, HWND hwnd)
     case MSGTYPE_GPGOL_OPAQUE_SIGNED:
     case MSGTYPE_GPGOL_MULTIPART_SIGNED:
     case MSGTYPE_GPGOL_CLEAR_SIGNED:
+      if (force)
+        show_message (hwnd, _("This message is not encrypted.")); 
       return -1; /* Should not have been called for this.  */
     case MSGTYPE_GPGOL_MULTIPART_ENCRYPTED:
       break;
@@ -1040,8 +1070,17 @@ message_decrypt (LPMESSAGE message, msgtype_t msgtype, int force, HWND hwnd)
     {
       char buf[200];
       
-      snprintf (buf, sizeof buf, "Decryption failed (%s)", gpg_strerror (err));
-      MessageBox (NULL, buf, "GpgOL", MB_ICONINFORMATION|MB_OK);
+      switch (gpg_err_code (err))
+        {
+        case GPG_ERR_NO_DATA:
+          /* The UI server already displayed a message.  */
+          break;
+        default:
+          snprintf (buf, sizeof buf,
+                    _("Decryption failed\n(%s)"), gpg_strerror (err));
+          MessageBox (NULL, buf, "GpgOL", MB_ICONINFORMATION|MB_OK);
+          break;
+        }
     }
   else
     {
index 91f291a..b0e7e62 100644 (file)
@@ -1040,9 +1040,10 @@ plaintext_handler (void *handle, const void *buffer, size_t size)
               else if (ctx->outstream)
                 {
                   HRESULT hr = 0;
+                  int slbrk = 0;
 
                   if (ctx->is_qp_encoded)
-                    len = qp_decode (ctx->linebuf, pos);
+                    len = qp_decode (ctx->linebuf, pos, &slbrk);
                   else if (ctx->is_base64_encoded)
                     len = b64_decode (&ctx->base64, ctx->linebuf, pos);
                   else
@@ -1055,10 +1056,10 @@ plaintext_handler (void *handle, const void *buffer, size_t size)
                       hr = IStream_Write (ctx->outstream, ctx->linebuf,
                                           len, NULL);
                     }
-                  if (!hr && !ctx->is_base64_encoded)
+                  if (!hr && !ctx->is_base64_encoded && !slbrk)
                     {
                       char tmp[3] = "\r\n";
-
+                      
                       if (ctx->symenc)
                         symenc_cfb_encrypt (ctx->symenc, tmp, tmp, 2);
                       hr = IStream_Write (ctx->outstream, tmp, 2, NULL);
@@ -1082,15 +1083,17 @@ plaintext_handler (void *handle, const void *buffer, size_t size)
                 ctx->collect_signature = 2;
               else if (ctx->sig_data)
                 {
+                  int slbrk = 0;
+
                   if (ctx->is_qp_encoded)
-                    len = qp_decode (ctx->linebuf, pos);
+                    len = qp_decode (ctx->linebuf, pos, &slbrk);
                   else if (ctx->is_base64_encoded)
                     len = b64_decode (&ctx->base64, ctx->linebuf, pos);
                   else
                     len = pos;
                   if (len)
                     gpgme_data_write (ctx->sig_data, ctx->linebuf, len);
-                  if (!ctx->is_base64_encoded)
+                  if (!ctx->is_base64_encoded && !slbrk)
                     gpgme_data_write (ctx->sig_data, "\r\n", 2);
                 }
             }
@@ -1503,8 +1506,10 @@ ciphertext_handler (void *handle, const void *buffer, size_t size)
               /* We are inside the data.  That should be the actual
                  ciphertext in the given encoding.  Pass it on to the
                  crypto engine. */
+              int slbrk = 0;
+
               if (ctx->is_qp_encoded)
-                len = qp_decode (ctx->linebuf, pos);
+                len = qp_decode (ctx->linebuf, pos, &slbrk);
               else if (ctx->is_base64_encoded)
                 len = b64_decode (&ctx->base64, ctx->linebuf, pos);
               else
@@ -1513,7 +1518,7 @@ ciphertext_handler (void *handle, const void *buffer, size_t size)
                 err = engine_filter (ctx->outfilter, ctx->linebuf, len);
               else
                 err = 0;
-              if (!err && !ctx->is_base64_encoded)
+              if (!err && !ctx->is_base64_encoded && !slbrk)
                 {
                   char tmp[3] = "\r\n";
                   err = engine_filter (ctx->outfilter, tmp, 2);