4 years agoTry harder to match outlooks internal filename enc
Andre Heinecke [Thu, 3 Dec 2015 14:38:10 +0000 (15:38 +0100)]
Try harder to match outlooks internal filename enc

* src/common.c (qp_encode): New. Simple quoted printable encoder.
  (b64_encode): Fix termination of return value.
* src/common.h: Add prototype
* src/mimemaker.c (utf8_to_rfc2047b): Use infer content encoding
  to switch between base64 and quoted printable.

As outlook rewrites the attachment filenames in unencrypted mails
we have to guess how they will look so that we sign them correctly.
If it turns out that this is to buggy we should probably replace
non ascii characters in that case.

4 years agoAdd revert support for PGP MulitpartEncrypted
Andre Heinecke [Wed, 2 Dec 2015 19:32:56 +0000 (20:32 +0100)]
Add revert support for PGP MulitpartEncrypted

* src/mimemaker.c (restore_msg_from_moss): Create a mosstmpl
  attachment. Currently only works for PGP MultipartEncrypted.
* src/mimemaker.h: Add prototype.
* src/oomhelp.h: Add DASL for attachment MIME tag.
* src/revert.cpp (finalize_mapi): Dont restore message class.
  (gpgol_mailitem_revert): Collect info first. Then work. Handle
  MOSS attachments. Do Magic.

For S/MIME we will want to add an option to also restore the
message class. The important thing here is how the message
class is mangled to trigger the SMIME.MultipartSigned behavior
without visibly changing the icon in the message list.

4 years agoMove some debug output into debug_oom
Andre Heinecke [Wed, 2 Dec 2015 19:31:10 +0000 (20:31 +0100)]
Move some debug output into debug_oom

* src/oomhelp.cpp (get_oom_object): Be quieter by default.

4 years agoFix view of sent mails with S/MIME disabled
Andre Heinecke [Wed, 2 Dec 2015 18:59:53 +0000 (19:59 +0100)]
Fix view of sent mails with S/MIME disabled

* src/mapihelp.cpp (mapi_change_message_class): Respect overrides
  even with S/MIME disabled.

I don't see why this would be a problem with S/MIME disabled and
I hope that it was originally a typo. We need the override to
force Outlook to reconsider the data of sent mails.

4 years agoDisable MIME style support for clearsigned mails
Andre Heinecke [Tue, 1 Dec 2015 15:09:50 +0000 (16:09 +0100)]
Disable MIME style support for clearsigned mails

* src/mapihelp.cpp (get_msgcls_from_pgp_lines): Disable clearsigned
  detection for Outlook 2010 and later

As we don't and probably won't handle this in revert we better
not touch it at all to avoid removing the signature information.

4 years agoActivate MIME style handling for PGPMessages >OL14
Andre Heinecke [Tue, 1 Dec 2015 14:57:06 +0000 (15:57 +0100)]
Activate MIME style handling for PGPMessages >OL14

* src/mapihelp.cpp (get_msgcls_from_pgp_lines): Remove check
  for outlook version.

Now that we can revert PGPMessages the reason for this check
is no longer valid.

4 years agoAdd revert to mail class and use it instead wipe
Andre Heinecke [Tue, 1 Dec 2015 14:54:06 +0000 (15:54 +0100)]
Add revert to mail class and use it instead wipe

* src/mail.cpp (Mail::revert_all_mails, Mail::revert): New.
* src/mail.h: Update accordingly.
* src/mailitem-events.cpp (MailitemEvents::Invoke): Revert instead
  of wipe.

The wipe code remains intact for now. If we find out that reverting
is the wrong approach we can fall back to wipining again by changing
the call in mailitem-events.

For now most messages will be wiped anyway as revert is only
supported for PGPMESSAGE messages.

4 years agoAdd mail revert implementation that works on OOM
Andre Heinecke [Tue, 1 Dec 2015 14:21:03 +0000 (15:21 +0100)]
Add mail revert implementation that works on OOM

* src/revert.cpp (gpgol_mailitem_revert): Revert mail in OOM.
* src/revert.h: Add prototype.

Using OOM appeared to be necessary. At least I have not found
a way to modify the Body through MAPI in a way that it survived
the write event. It appeared that during the Write event the
OOM Body is synced back to mapi. Same for the attachment model
in OOM. Some weirdeness there. Now we use OOM as much as possible.

There is some duplication with the old code but I didn't want
to touch the old code to aviod regressions. Although I doubt
very much that the old code works correctly.

For now the code returns an error for all messages apart
from PGP Message.

4 years agoAdd OOM PropertyAccessor helper methods
Andre Heinecke [Tue, 1 Dec 2015 14:15:46 +0000 (15:15 +0100)]
Add OOM PropertyAccessor helper methods

* src/oomhelp.cpp (set_pa_variant): New. Set a property.
  (get_pa_int): New. Get an int property.
  (get_pa_variant): New. Get a generic property as variant.
  (get_pa_string): Refactored to use get_pa_variant.
* src/oomhelp.h: Add prototpyes and DASL defs.

This code might not be necessary as you mainly can access
MAPI directly. But it can be useful in case MAPI is out of
sync and gives weird values. This is added mostly as an
experiment for now as MAPI is usually easier to use.

4 years agoFix reg key lookup for x64 and prep for new key
Andre Heinecke [Fri, 27 Nov 2015 16:22:41 +0000 (17:22 +0100)]
Fix reg key lookup for x64 and prep for new key

* src/common.h (GNUPG_REGKEY): Use 32 bit key on 64 bit. Prepare
  for gpg4win 3. Key layout

4 years agoStart UIServer on demand
Andre Heinecke [Fri, 27 Nov 2015 15:23:57 +0000 (16:23 +0100)]
Start UIServer on demand

* src/engine-assuan.c (op_assuan_init): Don't test connection.
The old spawning code with the retry counter made this unfeasible.
Starting on demand has the charm that it is properly handled
if the user stops the UIServer or the UIServer crashes (which of course
only Kleo does).

This should also give us a big boost in the startup timing benchmark
Outlook runs to suggest "Addins that are making Outlook slow".

GnuPG-Bug-Id: 2137

4 years agoRework connect_uiserver call based on gpgex
Andre Heinecke [Fri, 27 Nov 2015 15:22:13 +0000 (16:22 +0100)]
Rework connect_uiserver call based on gpgex

* src/engine-assuan.c (connect_uiserver): Use proper locking. Improve
 retry handling.

4 years agoAdd process spawning code from gpgex
Andre Heinecke [Fri, 27 Nov 2015 15:15:47 +0000 (16:15 +0100)]
Add process spawning code from gpgex

* src/common.c, src/common.h (gpgol_spawn_detached): New.
* src/exechelp.h, src/exechelp.c: New.
* src/ Add exechelp files.

While the spawning in gpgol_spawn_detached was quite similar
it makes sense to move that out in it's own source file and
use the same mutex that gpgex uses.

4 years agoGenerate libmapi32 for 64 bit systems corecctly
Andre Heinecke [Fri, 27 Nov 2015 14:34:10 +0000 (15:34 +0100)]
Generate libmapi32 for 64 bit systems corecctly

* Add conditional for 64 bit build
* src/ Add 64 bit flags for dlltool if necessary.
* src/mapi32.def: Add C calling convention names where necessary.

4 years agoFix size_t / unsigned int conversion for x64
Andre Heinecke [Fri, 27 Nov 2015 14:26:42 +0000 (15:26 +0100)]
Fix size_t / unsigned int conversion for x64

* src/mlang-charset.cpp (ansi_charset_to_utf8): Fix call to
 ConvertStringToUnicode to use unsigned int for size.

4 years agoPost release updates
Werner Koch [Tue, 24 Nov 2015 08:42:23 +0000 (09:42 +0100)]
Post release updates


4 years agoRelease 1.3.0 gpgol-1.3.0
Werner Koch [Tue, 24 Nov 2015 08:36:01 +0000 (09:36 +0100)]
Release 1.3.0

4 years agopo: Auto-update
Werner Koch [Tue, 24 Nov 2015 08:35:31 +0000 (09:35 +0100)]
po: Auto-update


4 years agoFix make distcheck.
Werner Koch [Tue, 24 Nov 2015 08:34:47 +0000 (09:34 +0100)]
Fix make distcheck.


4 years agoNews for 1.3.0 release
Andre Heinecke [Mon, 23 Nov 2015 16:07:31 +0000 (17:07 +0100)]
News for 1.3.0 release

* NEWS: Add some news.

4 years agoBe more tolerant when parsing RFC2047
Andre Heinecke [Mon, 23 Nov 2015 15:25:34 +0000 (16:25 +0100)]
Be more tolerant when parsing RFC2047

* src/rfc2047parse.c (G_MIME_RFC2047_WORKAROUNDS): Enable.

With enabling the workarounds we try to treat everything between
the =? ?= markers of a word as an encoded word and don't bail
if there are not correctly encoded chaacters in there.
Enigmail does not encode dots in filenames. GMimes understanding
of the RFC differes about that point.

4 years agoAdd gmime-table-private header
Andre Heinecke [Sun, 22 Nov 2015 16:24:10 +0000 (17:24 +0100)]
Add gmime-table-private header

* src/gmime-table-private.h: New, from GMime
* src/ Update accordingly.

Neccessary file for rfc2047parser. Forgot to add this with
the according commit.

4 years agoUse mlang charset conversion in RFC2047 parser
Andre Heinecke [Sun, 22 Nov 2015 16:13:46 +0000 (17:13 +0100)]
Use mlang charset conversion in RFC2047 parser

* src/rfc2047parse.c (rfc2047_decode_tokens): Use malang-charset
  (_rfc2047_token, rfc2047_token_new_encoded_word): Unconstify charset.
  (rfc2047_token_free): New. Also free charset.
  (rfc2047_tokens_free): Use token_free.
  (g_mime_utils_header_decode_phrase): Cleanup redundant code.
  (rfc2047_parse): Ditto.

At least with a latin1 encoded mail from Kmail this worked and
it's probably the same conversion Outlook uses internally so
his should support everything that outlook supports.

4 years agoFallback to content-type name if no cd/filename
Andre Heinecke [Sun, 22 Nov 2015 16:11:07 +0000 (17:11 +0100)]
Fallback to content-type name if no cd/filename

* src/mimeparser.c (t2body): Fallback to ct/name if cd/filename
  not found or not parsed.

This is neccessary for enigmail attachments which uses an
rfc 2038 (i think) content-dispositon filename but an
RFC 2047 content-type / name so that Outlook can understand
the filename from the content-type / name. We understand this
now, too.

4 years agoParse RFC2047 attachment names
Andre Heinecke [Sun, 22 Nov 2015 16:09:36 +0000 (17:09 +0100)]
Parse RFC2047 attachment names

* src/mimeparser.c (start_attachment): Expect filename as utf8 and
  set it as Unicode property in MAPI.
  (t2body): Parse the attachment filename.

4 years agoUse RFC2047 for attachment names
Andre Heinecke [Sun, 22 Nov 2015 16:06:45 +0000 (17:06 +0100)]
Use RFC2047 for attachment names

* src/mimemaker.c (utf8_to_rfc2047b): New. Convert utf8 to rfc2047
  base64 encoding.

We always use UTF8 and Base64 for simplicity. (I wish this was
everything thats allowed,..)

4 years agoAdd base64 encoder
Andre Heinecke [Sun, 22 Nov 2015 16:05:32 +0000 (17:05 +0100)]
Add base64 encoder

* src/common.c, src/common.h (b64_encode): New.

Will be used to encode RFC2047 strings.

4 years agoAdd MIME language to UTF8 conversion code
Andre Heinecke [Sun, 22 Nov 2015 16:02:05 +0000 (17:02 +0100)]
Add MIME language to UTF8 conversion code

* src/mlang-charset.cpp, src/mlang-charset.h: New.
* src/ Update accordingly.

This is COM based code but as we are a COM addin anyway
we can utilize it to convert MIME strings to unicode and
then from unicode to UTF8.
Our internal "we do everything in UTF-8" has a bit overhead
here but I prefer it.

4 years agoAdd rfc2047 parser based on GMime
Andre Heinecke [Sun, 22 Nov 2015 14:41:35 +0000 (15:41 +0100)]
Add rfc2047 parser based on GMime

* src/rfc2047parse.c, src/rfc2047parse.h: New.
* src/ Update accordingly.
To properly handle attachment names the same way as outlook
does we need to be able to parse rfc2047 words at least.
From the rfc's I'm not sure if we need to parse multiple words
but let's assume we do for added compatibility. And this was
an easy part of GMime to extract.

For now it only handles UTF8 binary and quoted printable.

4 years agoFix DllCanUnloadNow behavior
Andre Heinecke [Thu, 19 Nov 2015 16:42:50 +0000 (17:42 +0100)]
Fix DllCanUnloadNow behavior

* src/gpgoladdin.cpp (DllCanUnloadNow): Only return OK if the addin
is not connected.

The addinlocks variable made no sense to use for this. Now we just
check if we are connected or not. When we are not connected no
callbacks are used and it is safe to unload gpgol. Otherwise
we can't be safely unloaded.

GnuPG-Bug-Id: 1837

4 years agoRemove unused include
Andre Heinecke [Fri, 13 Nov 2015 16:27:01 +0000 (17:27 +0100)]
Remove unused include

* src/attachment.cpp: Remove unused include.

objidlbase.h is not part of mingw-2.0 but luckily we don't
need it anway and it's just a leftover from an experiment.

4 years agoUse gpgrt_asprintf
Andre Heinecke [Fri, 13 Nov 2015 16:18:28 +0000 (17:18 +0100)]
Use gpgrt_asprintf

* src/attachment.cpp (do_crypt), src/gpgoladdin.cpp (GetCustomUI):
  Use gpgrt_asprintf.

We link libgpg-error anyway so let's make use of it. Fixes
the build on debian wheezy

4 years agoRemove unsed vasprintf implementation
Andre Heinecke [Fri, 13 Nov 2015 16:17:38 +0000 (17:17 +0100)]
Remove unsed vasprintf implementation

* src/missing/vasprintf.c: Removed.

This didn't compile anymore with gcc-4.9

4 years agoRevert "Use libmapi32 from mingw"
Andre Heinecke [Fri, 13 Nov 2015 14:14:36 +0000 (15:14 +0100)]
Revert "Use libmapi32 from mingw"

This reverts commit 6533170a34d9e6f7191e41b31045ad0b4b4af1df.

With libmapi32.a from mingw we get unresolved symbol errors
on runtime.

4 years agoDisable msgclass changing code for in Body Crypto
Andre Heinecke [Fri, 13 Nov 2015 09:40:17 +0000 (10:40 +0100)]
Disable msgclass changing code for in Body Crypto

* src/mapihelp.cpp (get_msgcls_from_pgp_lines): Disable for
  Outlook >= 2010.

For now we want to ignore clearsigned and PGP/Inline
signed code as we still have the old body based interface
for those. And before we handle them we should tackle
some interoperability issues arising from our current
handling (e.g. fix the wipe to restore the PGP body)

4 years agoCheck PGP Body tags for additional msgtypes
Andre Heinecke [Fri, 13 Nov 2015 09:34:11 +0000 (10:34 +0100)]
Check PGP Body tags for additional msgtypes

* src/mapihelp.cpp (change_message_class_ipm_note),
  (change_message_class_ipm_note_secure_cex): Also check
  multipart/alternative and multipart/mixed.

Especially PGP/Inline mails sent by Outlook with the old code
is often times multipart/alternative as Outlook sends this by

4 years agoAdd workaround for opaque signed encrypted data
Andre Heinecke [Thu, 12 Nov 2015 16:36:21 +0000 (17:36 +0100)]
Add workaround for opaque signed encrypted data

* src/ribbon-callbacks.cpp (do_reader_action): Only use the
mime handling when there is no "BEGIN PGP MESSAGE" in body.

The sign verify split of the old addon allowed you to first
opaque sign a message, then encrypt it. The mime code now
only detects the encryption as this is a standard thing. The
signature is not verified as it is treated as just another plaintext.

4 years agoActually add French translation from afb7e445c
Andre Heinecke [Thu, 12 Nov 2015 15:37:01 +0000 (16:37 +0100)]
Actually add French translation from afb7e445c

Woops forgot to git add

4 years agoRegenerate po files
Andre Heinecke [Thu, 12 Nov 2015 14:54:02 +0000 (15:54 +0100)]
Regenerate po files

* de.po, pt.po, sv.po, zh_CN.po, zh_TW.po: Automatic update.

4 years agoAdd traditional / simplified chinese localization
Andre Heinecke [Thu, 12 Nov 2015 13:37:24 +0000 (14:37 +0100)]
Add traditional / simplified chinese localization

* zh_CN.po, zh_TW.po: New.
* po/LINGUAS: Update accordingly.
Localization provided by Mingye Wang (Arthur2e5) <>
on 2015.09.20

4 years agoAdd French translation
Andre Heinecke [Thu, 12 Nov 2015 11:54:58 +0000 (12:54 +0100)]
Add French translation

* LINGUAS: Add fr
* po/fr.po: New.

Translation provided by Olivier Serve on 2015.10.01

4 years agoRemove deleted files from
Andre Heinecke [Thu, 12 Nov 2015 11:50:26 +0000 (12:50 +0100)]
Remove deleted files from

* po/ Remove deleted files

4 years agoDo not release eventsink when disabled
Andre Heinecke [Thu, 12 Nov 2015 09:55:19 +0000 (10:55 +0100)]
Do not release eventsink when disabled

* src/gpgoladdin.cpp (GpgolAddin::~GpgolAddin): Do not release
m_appliactionEventSink when disabled. Use NULL guarded release.

When we are disabled OnStartupComplete never creates the event
sink but the addin's dtor is called on unload.

4 years agoFix double free when addin is disabled
Andre Heinecke [Thu, 12 Nov 2015 09:50:08 +0000 (10:50 +0100)]
Fix double free when addin is disabled

* src/gpgoladdin.cpp (GpgolAddin::~GpgolAddin): Do not release

The RibbonExtender is already released by outlook. So we released
an invalid object here. This worked often enough but could of course

4 years agoAdd mkinstalldirs script
Andre Heinecke [Wed, 4 Nov 2015 16:09:48 +0000 (17:09 +0100)]
Add mkinstalldirs script

* build-aux/mkinstalldirs: New. Copied from gpgme.

This fixes make install which was broken after the latest build
system upgrade.

4 years agoUse libmapi32 from mingw
Andre Heinecke [Wed, 4 Nov 2015 15:50:22 +0000 (16:50 +0100)]
Use libmapi32 from mingw

* Remove our own libmapi32 creation
* mapi32.def: Removed.

The libmapi32 that comes with debian stable (jessie) has all the symbols
we need. And this solves a linker problem when building for x64.

4 years agoFix int to pointer cast when creating worker
Andre Heinecke [Wed, 4 Nov 2015 15:45:33 +0000 (16:45 +0100)]
Fix int to pointer cast when creating worker

* src/engine-assuan.c (async_worker_thread): Expect parameter to be
 a pointer instead of a value.
 (op_assuan_init): Pass a reference instead.

While the old code was not broken building for x64 created a
warning. And I also don't think you should do it even if it works

4 years agoHandle handle to int casts
Andre Heinecke [Wed, 4 Nov 2015 15:42:40 +0000 (16:42 +0100)]
Handle handle to int casts

 * src/engine-assuan.c (handle_to_int): New.
  (send_options, op_assuan_init, op_assuan_encrypt),
  (op_assuan_sign, op_assuan_decrypt, op_assuan_verify): Use it.

Doing this in a function explictly ensures that we only downcast
Handle pointers. For them this is allowed and we can locally
deactive the warning.

4 years agoAdd format string macro for size_t
Andre Heinecke [Wed, 4 Nov 2015 15:38:13 +0000 (16:38 +0100)]
Add format string macro for size_t

* src/util.h (SIZE_T_FORMAT): Use a macro for a portable way of
  printing size_t.
* src/engine.c (engine_filter, engine_wait): Use it in debug output.

%z is not available for us.

4 years agoDefine out code that does not compile for x64
Andre Heinecke [Wed, 4 Nov 2015 15:33:33 +0000 (16:33 +0100)]
Define out code that does not compile for x64

* src/config-dialog.c (config_dialog_box): Define out for x64
* src/olflange-dlgs.c (GPGOptionsDlgProc): Define out call to

This code is only used in older outlook versions which are not
avaibale for 64 bit. And I rather not compile it then change it
and cause regressions in those versions.

4 years agoFix pointer to int cast in debug output
Andre Heinecke [Wed, 4 Nov 2015 15:25:22 +0000 (16:25 +0100)]
Fix pointer to int cast in debug output

* src/oomhelp.cpp (dump_excepinfo): Fix deferredFill output format.

4 years agoRemove dead code
Andre Heinecke [Wed, 4 Nov 2015 15:18:30 +0000 (16:18 +0100)]
Remove dead code

* Update gpgol_Sources accordingly.
* main.c (init_options, read_options): Remove password_ttl setting.
  (DllMain): No longer initialize passcache.
* passcache.c, passcache.h, passphrase-dialog.c, recipient-dialog.c,
  verify-dialog.c: Removed. This is handled by the uiserver now.

This is code from a time before assuan architecture and unlikely
to be useful again.

4 years agoFix recipient lookup
Andre Heinecke [Wed, 4 Nov 2015 10:24:54 +0000 (11:24 +0100)]
Fix recipient lookup

* src/message.cpp (get_recipients): Actually fallback to the
  email property in case the smtp address property is not set.

4 years agoWipe all decrypted mails on disconnect.
Andre Heinecke [Mon, 2 Nov 2015 16:46:55 +0000 (17:46 +0100)]
Wipe all decrypted mails on disconnect.

* src/mail.cpp (wipe_all_mails): New.
* src/gpgoladdin.cpp (~GpgOLAddin): Add more debug output.
  (OnDisconnection): Call wipe all mails.

This should cover the case that we decrypted a message and
are deactivated before the write / save event that removes
the plaintext in that message again.

nuPG-Bug-Id: 2138

4 years agoSave mailitem on close
Andre Heinecke [Mon, 2 Nov 2015 16:24:15 +0000 (17:24 +0100)]
Save mailitem on close

* src/mail.h (Mail::is_crypto_mail): New.
* src/mailitem-events.cpp (EVENT_SINK_INVOKE): Call Save on
This prevents the "The properties of the message have changed"
Dialog but has the side effect that the plain text has to be removed
from the mail as the Save will trigger a Write event.

4 years agoAdd more debug output for msg wipes.
Andre Heinecke [Mon, 2 Nov 2015 16:22:14 +0000 (17:22 +0100)]
Add more debug output for msg wipes.

* src/mail.cpp (Mail::insert_plaintext): Check if msg already
  needs wipe and log it. Log plaintext with msg ptr.
  (Mail::wipe): Log wipe error.

4 years agoFix handling sent and exchange to exchange mails.
Andre Heinecke [Mon, 2 Nov 2015 14:16:46 +0000 (15:16 +0100)]
Fix handling sent and exchange to exchange mails.

* src/mail.cpp (Mail::process_message): Always change message class.

Changing the message class in the before read event causes
Outlook to reconsider what it knows about a message and to read
information again from the unwrapped basemessage. While this
may have a negative impact on performance this fixes the case
where Outlook already knows too much about a message because
it was either recieved by exchange (and so already had the
MAPI properties from GPGOL set) or because it sent the
message itself and so also had the GpgOL MAPI properties.

4 years agoFix from address lookup for exchange
Andre Heinecke [Fri, 30 Oct 2015 17:24:10 +0000 (18:24 +0100)]
Fix from address lookup for exchange

* src/mapihelp.cpp (mapi_get_from_address): Try additional SMTP
  tags before falling back to EMAIL tag.
* src/mymapitags.h (PidTagSenderSmtpAddress_W),

4 years agoFix regression introduced by 383cb091
Andre Heinecke [Fri, 30 Oct 2015 15:55:54 +0000 (16:55 +0100)]
Fix regression introduced by 383cb091

* src/message.cpp (message_decrypt): Fix parenthesis.

The fix for -Wparentheses used the wrong paranthesis and
this broke detection of our "own" pgp/mime mails.

Should have been more attentive in my first semester
"basics of programming" course :-)

4 years agoRelease detached event sink.
Andre Heinecke [Fri, 30 Oct 2015 15:48:30 +0000 (16:48 +0100)]
Release detached event sink.

* src/mail.cpp (Mail::~Mail): Release detached mail event sink.

4 years agoEnable sender handling for Exchange Accounts
Andre Heinecke [Fri, 30 Oct 2015 15:41:07 +0000 (16:41 +0100)]
Enable sender handling for Exchange Accounts

* src/mail.cpp (Mail::update_sender): New. Updates sender address
  from OOM.
  (Mail::get_sender): New. Access the sender.
  (Mail::do_crypt): Pass sender to crypto functions.
* src/mail.h: Update accordingly.
* src/mailitem-events.cpp (EVENT_SINK_INVOKE): Update sender on send
* src/message.cpp, src/message.h, src/mimemaker.c, src/mimemaker.h:
  Add optional sender parameter to crypto functions and use it.

In the after write event we can't use OOM methods so we can't look
up the sender over the session. This makes it neccessary to save
the sender address beforehand as I could not find any way to get this
information through MAPI (probably over the MAPISession).

4 years agoFactor logic out of event handler
Andre Heinecke [Fri, 30 Oct 2015 13:49:38 +0000 (14:49 +0100)]
Factor logic out of event handler

* src/ Add mail.h and mail.cpp
* src/mail.cpp, src/mail.h: New. Class containing information and
  functionality to work with mails.
* src/application-events.cpp (EVENT_SINK_INVOKE): Create mail objects
  on ItemLoad event for Mailitems.
* src/mailitem-events.cpp (HTML_TEMPLATE): Move to mail.cpp
  (BEGIN_EVENT_SINK): Reduce member variables.
  (MailItemEvents::MailItemEvents): Less initializations.
  (MailItemEvents::handle_read): Moved to Mail::insert_plaintext.
  (MailItemEvents::handle_before_read): Moved to Mail::process_message
  (do_crypto_on_item): Moved to Mail::do_crypto
  (needs_crypto): Moved to Mail::needs_crypto
  (EVENT_SINK_INVOKE): Get reference to according mail object.
  (EVENT_SINK_INVOKE): Call Mail methods according to events.
  (EVENT_SINK_INVOKE): Wipe code moved to Mail::wipe

mailitem-events should only "respond to events" from now on.
Encapsulating all information about a Mail in a single class makes
sense as we can keep track of data independently of events. The
mix of state variables (e.g. needs_wipe) in the event handler
made it difficult to access that information from anywhere.
Additionally we now keep track of all Mail items loaded with
our Event sinks set and expose them through Mail::get_mail_for_item.
This should help solving problems like "wiping all plaintext on

4 years agoFix recipient lookup for SMTP addresses
Andre Heinecke [Fri, 30 Oct 2015 13:46:54 +0000 (14:46 +0100)]
Fix recipient lookup for SMTP addresses

* src/message.cpp (get_recipients): Look for SMTP address property
and also the EMAIL address property.

For SMTP Addresses in the EMAIL address property the STMP address
is not set. So we check first for SMTP (which handles exchange)
and if we don't find that property we use the EMAIL value as before.

4 years agoFix recipient address lookup for Exchange addrs
Andre Heinecke [Wed, 28 Oct 2015 11:40:44 +0000 (12:40 +0100)]
Fix recipient address lookup for Exchange addrs

* src/gpgoladdin.cpp (GpgolAddin::OnConnection): Store major version.
* src/main.c: Define major version variable.
* src/message.cpp (get_recipients): Use SMTP addr property for new
* src/mymapitags.h: Define SMTP_ADDRESS property ids.
* src/olflange.cpp (GpgolExt:Install): Store major version.
* src/oomhelp.h: Rename PR_SMTP_ADDRESS URI to PR_STMP_ADDRESS_DASL.
* src/oomhelp.cpp (get_oom_recipients): Update accordingly.
* src/ribbon-callbacks.cpp (do_composer_action, do_reader_action),
  (attachEncryptedFile): Update accordingly.
* src/util.h: Declare major version variable.

We can't use the OOM Recipient objects here as this is not
accessible in the after write event. This still leaves the
sender lookup to be done. There appears to be no MAPI property
that contains the SMTP Address of the sender when sending mails
through exchange.

4 years agoMove config files to build-aux and upodate
Werner Koch [Fri, 23 Oct 2015 17:06:11 +0000 (19:06 +0200)]
Move config files to build-aux and upodate

* autogen.rc: New.
* (EXTRA_DIST): Add autogen.rc.
* Update for new and moved config files.
* build-aux/compile: New.
* build-aux/depcomp: New.
* build-aux/mdate-sh: New.
* build-aux/texinfo.tex: New.

Signed-off-by: Werner Koch <>
4 years agoUse utf8 gettext in inspectors
Andre Heinecke [Thu, 22 Oct 2015 08:04:35 +0000 (10:04 +0200)]
Use utf8 gettext in inspectors

* src/inspectors.cpp: Use utf8 gettext.

Any string thats passed to put_oom_string should be
utf8 encoded.

GnuPG-bug-id: 1247

4 years agoMake old decrypt / verify buttons work with mime
Andre Heinecke [Wed, 21 Oct 2015 13:08:53 +0000 (15:08 +0200)]
Make old decrypt / verify buttons work with mime

* src/ribbon-callbacks.cpp (verify_mime): New. Force message handling
 (do_reader_action): Call verify_mime on action and print info
 on decrypt.

I've tried to set the body to the plain text again and decrypt
the attachments in that case too. But It's no good. There are
several issues with it. We can't reliably detect if we need
to wipe the message as outlook sometimes does not give us the
MAPI Object in the write event. And Attachments are not properly
updated after decryption.
The Read event still appears the only place for us to correctly
insert the plain text.

4 years agoFix crash on attachment decryption
Andre Heinecke [Wed, 21 Oct 2015 12:22:16 +0000 (14:22 +0200)]
Fix crash on attachment decryption

* src/attachment.cpp (do_crypt): Check return value of mapiobject.

It appears that sometimes a "Ghost" attachment is listed
by outlook. That attachment does not have a Mapiobject or
GpgOL properties attached to it. So we ignore it.

4 years agoMore logging and error checking in App Events
Andre Heinecke [Tue, 20 Oct 2015 14:53:18 +0000 (16:53 +0200)]
More logging and error checking in App Events

* src/application-events.cpp (ApplicationEvents::Invoke): Check
 that parms is not NULL. Add more debug output.

According to the Windows Event log attached to gnupg-bug: 1837
gpgol caused a crash while handling 0xFBA7 (ItemLoad).
This should help to home in on such a crash. I doub't that
parms is NULL in the Invoke call but as you can never
know let's be more defensive with error checks.

4 years agoLog UTC time instead of tick count.
Andre Heinecke [Tue, 20 Oct 2015 14:52:15 +0000 (16:52 +0200)]
Log UTC time instead of tick count.

* src/main.c (do_log): Log the current UTC time to allow
 corellating debug output to Windows event logs.

4 years agoAdd Tracepoints for issue 1837
Andre Heinecke [Fri, 16 Oct 2015 09:57:06 +0000 (11:57 +0200)]
Add Tracepoints for issue 1837

* src/gpgoladdin.cpp (GpgolRibbonExtender::GetCustomUI),
 src/ribbon-callbacks.cpp (getIcon): Add Tracepoints.

User kjathome reports seemingly random crashed in issue1837
where at least outlook thinks that they happen in the getIcon
and GetCustomUI callbacks. As this is both pretty static code
I am clueless why they would crash randomly.

This Trace output might give us a better idea. It should be
reverted before a release.

4 years agoAdd information to body of encrypted messages
Andre Heinecke [Thu, 15 Oct 2015 15:15:36 +0000 (17:15 +0200)]
Add information to body of encrypted messages

* src/mailitem-events.cpp (HTML_TEMPLATE): A message to be shown in
  the body of encrypted messages. Will become a template for l10n
* src/mailitem-events.cpp (Invoke): Use the message to wipe the body.
  (handle_read): Use the message in case of failed decryption.

This message is whats shown for processed messages that are stored.
E.g. If you access them with another client or if gpgol is uninstalled
or deactivated.

4 years agoImprove TRACEPOINT macro.
Andre Heinecke [Thu, 15 Oct 2015 13:14:13 +0000 (15:14 +0200)]
Improve TRACEPOINT macro.

* src/util.h (TRACEPOINT): Remove the while loop.

Now you can write TRACEPOINT or TRACEPOINT;
I find this better.

4 years agoUse UTF8 in addin localization.
Andre Heinecke [Thu, 15 Oct 2015 13:08:04 +0000 (15:08 +0200)]
Use UTF8 in addin localization.

* src/w32-gettext.c, src/w32-gettext.h (utf8_gettext): New.
  gettext that returns UTF8.
* src/w32-gettext.c (internal_gettext): Helper that can return
  either UTF8 or native encoding.
* src/gpgoladdin.cpp: Use UTF8 gettext variants.

Using native encoding is always problematic on Windows and should
be avoided. Native encoding can't represent Unicode and conversions
to wchar are bound to lose data. This usually breaks in a lot of ways
with Unicode filenames etc.

I like to use UTF8 internally for all strings and convert them to
UTF 16 (wchar) for Windows API use.

For compatibility reasons (not to break the old Exchange Extension)
the default gettext still returns native encoding and you have to
redefine _ to get the utf8 gettext.

4 years agoOnly define TRACEPOINT macro once.
Andre Heinecke [Thu, 15 Oct 2015 12:32:33 +0000 (14:32 +0200)]
Only define TRACEPOINT macro once.

* src/util.h (TRACEPOINT): Define here.
* src/attached-file-events.cpp,
  src/user-events.cpp: Remove unused macro.
* src/gpgoladdin.cpp: Switch to new macro without useless braces.

4 years agoCheck for result pointer in getIcon
Andre Heinecke [Thu, 15 Oct 2015 12:23:46 +0000 (14:23 +0200)]
Check for result pointer in getIcon

* src/ribbon-callbacks.cpp (getIcon): Check if result is NULL.

There are crashes reported to occur randomly in this function.
Maybe someone passes us a NULL pointer as result ptr?
Shouldn't happen but Let's guard against it.

4 years agoFix crash on unload.
Andre Heinecke [Thu, 15 Oct 2015 12:12:46 +0000 (14:12 +0200)]
Fix crash on unload.

* src/gpgoladdin.cpp (GpgolAddin::~GpgolAddin): Release ribbonextender
  instead of deleting it.

Previously the ribbonextender was deleted twice on unload causing
outlook to crash.

4 years agoInstall forms for addin
Andre Heinecke [Thu, 15 Oct 2015 12:05:13 +0000 (14:05 +0200)]
Install forms for addin

* src/gpgoladdin.cpp (GpgolAddin::OnStartupComplete): Call


Installing the forms for Outlook 2010 and later does not appear
to have any effect apart from providing the correct
icons for the message list. So we can just use the old form
configs for this.

4 years agoIncrease version to 1.3.0
Andre Heinecke [Wed, 14 Oct 2015 15:23:56 +0000 (17:23 +0200)]
Increase version to 1.3.0

* (mym4_version): Change to 1.3.0

The MIME Support changes for Outlook >= 2010 are big enough
for a minor version bump.

4 years agoMake mime-send UI support optional.
Andre Heinecke [Wed, 14 Oct 2015 14:52:13 +0000 (16:52 +0200)]
Make mime-send UI support optional.

* (enable-mime-send): New option to enable mime sending.
* src/gpgoladdin.cpp (GpgolRibbonExtender::GetCustomUI): Add
 old UI again.

The idea is that Gpg4win can distribute an Addin without mime
send support (which currently also has more issues then reading)
before a version that only sends MIME messages.

4 years agoUse toggle Buttons for MIME sign and encrypt
Andre Heinecke [Wed, 14 Oct 2015 14:12:34 +0000 (16:12 +0200)]
Use toggle Buttons for MIME sign and encrypt

* src/gpgoladdin.cpp (GpgolRibbonExtender::GetCustomUI): Use
 toggle buttons.
 (GpgolRibbonExtender::Invoke): Toggle button param 0 is the state.
 1 the dispatch interface.
* src/ribbon-callbacks.cpp (message_flag_status): Removed.
  (mark_mime_action): Don't use flag status.

4 years agoRemove engine-gpgme.c from potfiles
Andre Heinecke [Wed, 14 Oct 2015 13:46:26 +0000 (15:46 +0200)]
Remove engine-gpgme.c from potfiles

* Remove engine-gpgme.c

4 years agoReally fix msg merge failures.
Andre Heinecke [Wed, 14 Oct 2015 13:30:57 +0000 (15:30 +0200)]
Really fix msg merge failures.

* src/ Do not link dialog.o into gpgol.dll. It's
 already included in resource.o.
* src/dialogs.h: Remove comment about not using the lower 4 bit.
* src/oomhelp.cpp (put_oom_icon): Update accordingly. (To use +1 again)

This fixes the problem 5d62fdbf was supposed to fix.
The "28 bit" ID part was just a red herring. The whole merge
code was triggered because we linked the resources twice into
the dll. Once through dialog.o and once through resource.o

The fix from 5d62fdbf only worked because changes to the id did
not cause the dialog object to be rebuild and so the problem
disappeared for me because dialog.o and resource.o used different
ID's. A clean build triggered the problem again.

4 years agoRemove unused g10 code logo.
Andre Heinecke [Wed, 14 Oct 2015 13:25:13 +0000 (15:25 +0200)]
Remove unused g10 code logo.

* logo.bmp: Removed.
* (EXTRA_DIST), dialogs.h, dialogs.rc: Update accordingly.

4 years agoFix unused bitmap removal
Andre Heinecke [Wed, 14 Oct 2015 13:00:42 +0000 (15:00 +0200)]
Fix unused bitmap removal

* src/dialogs.rc: Do not reference the removed files.
* src/ (EXTRA_DIST): Do not include the removed files.

This was accidentally left out of the previous commit.

4 years agoFix resource id's and remove unused resources.
Andre Heinecke [Wed, 14 Oct 2015 12:33:17 +0000 (14:33 +0200)]
Fix resource id's and remove unused resources.

* dialogs.h: Only use the upper 28 bit for id's. Remove 32/64px ids.
* oomhelp.cpp (put_oom_icon): Clarify comment and use new ids for mask.
* explorers.cpp (add_explorer_controls),
 inspectors.cpp (add_inspector_controls, update_crypto_info):
  Use _16 id directly.
* decrypt-32.bmp,
 verify-32m.bmp: Removed


The binutils 2.25 complained about resource merge failures because
the upper 28 bits from some of our resoruce were identical and the
last four bits are appearently used by microsoft for some kind of
string table lookup.

While fixing this I've noticed that the 32 / 64 px size bitmap
resources were not used anywhere. So they are removed now.

4 years agoEnable -Werror in maintainer-mode
Andre Heinecke [Tue, 13 Oct 2015 14:38:28 +0000 (16:38 +0200)]
Enable -Werror in maintainer-mode

* Enable Werror in maintainer-mode.

4 years agoCast gpgme callback functions to fix warning.
Andre Heinecke [Tue, 13 Oct 2015 14:32:44 +0000 (16:32 +0200)]
Cast gpgme callback functions to fix warning.

* src/engine.c (engine_create_filter): Cast callback functions.

4 years agoRemove engine-gpgme
Andre Heinecke [Tue, 13 Oct 2015 14:28:10 +0000 (16:28 +0200)]
Remove engine-gpgme

* src/engine-gpgme.c, src/engine-gpgme.h: Remove historic code.
* src/engine.c: Assume use_assuan and remove engine-gpgme calls.
* src/ Update accordingly.

The fallback to the gpgme-engine without assuan was unmaintained
and did not provide all the features anyway. It was mostly there
for historic reasons as this predates assuan.

4 years agoFix various warnings
Andre Heinecke [Tue, 13 Oct 2015 13:49:08 +0000 (15:49 +0200)]
Fix various warnings

* src/mapihelp.cpp (get_msgcls_from_pgp_lines): Add braces.
* src/message.cpp (message_decrypt): Add braces.
* src/oomhelp.cpp (dump_excepinfo): Remove additional format params.

4 years agoRelease application event sink instead of deleting
Andre Heinecke [Tue, 13 Oct 2015 13:46:51 +0000 (15:46 +0200)]
Release application event sink instead of deleting

* src/gpgoladdin.cpp (GpgolAddin::~GpgolAddin): Release instead
  of delete.

delete for IDispatch results in undefined behavior.

4 years agoFix unused variable warnings
Andre Heinecke [Tue, 13 Oct 2015 13:42:57 +0000 (15:42 +0200)]
Fix unused variable warnings

* src/eventsink.h (USE_INVOKE_ARGS): Also add dispid.
* src/gpgoladdin.cpp (GpgolAddinFactory::CreateInstance): Unused punk.
 (GpgolAddin::Invoke, GpgolRibbonExtender::Invoke): Use invoke args.
* src/mailitem.cpp (GpgolItemEvents::Write): Remove want_html var.
* src/ribbon-callbacks.cpp (message_flag_status): Remove window param.
  (mark_mime_action): Update call accordingly.

4 years agoDon't check for stpcpy.
Andre Heinecke [Tue, 13 Oct 2015 13:38:52 +0000 (15:38 +0200)]
Don't check for stpcpy.

* Don't check for stpcpy.
* src/rfc822parse.c (my_stpcpy): Define our own stpcpy

Windows does not have stpcpy and It's not part of mingw. The
function check failed accordingly but GCC still warned about
shadowing a builtin function.

Just avoid this trouble and always define our own function.

4 years agoFix write-string warnings.
Andre Heinecke [Tue, 13 Oct 2015 13:27:42 +0000 (15:27 +0200)]
Fix write-string warnings.

* src/gpgolstr.cpp, src/gpgolstr.h: New. Small string wrapper.
* src/ Add to sources.
* src/display.cpp (open_inspector),
 src/mapihelp.cpp (create_gpgol_tag, get_internetcharsetbody_tag),
 src/ribbon-callbacks.cpp (do_composer_action, do_reader_action),
 src/message.cpp (pgp_body_to_attachment): Use it.

If MS wants mutable strings, MS get's mutable strings.

4 years agoFix compiler warnings in engine-assuan
Andre Heinecke [Tue, 13 Oct 2015 09:20:56 +0000 (11:20 +0200)]
Fix compiler warnings in engine-assuan

* src/engine-assuan.c: Don't redefine WINVER. Include windows.h
  after assuan.h (because of winsock)
  (async_worker_thread): Return 0 on success.
  (start_command): Cast status callback to correct type.

4 years agoLog error in mimemaker write_attachments.
Andre Heinecke [Tue, 13 Oct 2015 08:33:58 +0000 (10:33 +0200)]
Log error in mimemaker write_attachments.

* src/mimemaker.c (write_attachments): Log error.

Fixes an unused variable warning and makes sense.

4 years agoFix body handling of sent mails.
Andre Heinecke [Tue, 13 Oct 2015 08:27:18 +0000 (10:27 +0200)]
Fix body handling of sent mails.

* src/mailitem-events.cpp (handle_read): Work on the base message.

Outlook somehow is confused about the attachment
table of our sent mails. The securemessage interface
gives us access to the real attach table but the attachment
table of the message itself is broken.

So unprotect attachments does not work for sent mails
as the attachment table of the mapiitem is invalid.
We need to somehow get outlook to use the attachment table
of the base message and and then decrypt those.
This will probably mean removing all attachments for the
message and adding the attachments from the base message then
we can call unprotect_attachments as usual.

For now this works only for the body.

4 years agoRemove mailitem event handler on unload
Andre Heinecke [Fri, 2 Oct 2015 12:32:28 +0000 (14:32 +0200)]
Remove mailitem event handler on unload

* src/mailitem-events.cpp (invoke): Handle unload.

Thought this might fix a crash but it did not. Anyway
removing the event handler on unload and deleting it
is the right thing to do to avoid leaking it and a
ref to an unloaded mailitem.

4 years agoHopefully fix Ol 2016 crash on send
Andre Heinecke [Fri, 2 Oct 2015 12:29:02 +0000 (14:29 +0200)]
Hopefully fix Ol 2016 crash on send

* src/mailitem-events.cpp (request_send): Remove delay.

Earlier tests with 2013 made me think that the delay was necessary
here. But Ol 2016 and Ol 2013 work reliably without it.
This makes the code more deterministic (Placing a Window message
in the Queue right after the encryption is done.) and appears
to fix a random crash in Ol 2016 where Outlook Itself would crash
after sending the message.

4 years agoFix return value of invoke_oom_method
Andre Heinecke [Fri, 2 Oct 2015 12:26:07 +0000 (14:26 +0200)]
Fix return value of invoke_oom_method

* src/oomhelp.cpp (invoke_oom_method): Return false on success.

This is the opposite of Qt style I'm used to that returns false on
error so I'm confusing myself sometimes. But usually gpgol
int return values return zero on success.