16 months agomalloc -> xmalloc
Andre Heinecke [Tue, 24 Jul 2018 12:09:10 +0000 (14:09 +0200)]
malloc -> xmalloc

* src/w32-gettext.cpp (bindtextdomain): Change a spurious malloc
to xmalloc.

Fixes a memdbg error.

16 months agoMinor cleanups
Andre Heinecke [Tue, 24 Jul 2018 09:07:45 +0000 (11:07 +0200)]
Minor cleanups

* src/cryptcontroller.cpp, src/cryptcontroller.h: m_recipents is
now a vector.

16 months agoFix memory leak when opening options
Andre Heinecke [Tue, 24 Jul 2018 09:06:56 +0000 (11:06 +0200)]
Fix memory leak when opening options

* src/addin-options.cpp (open_gpgolgui): Release cArray.

16 months agoAuto update german po file formatting
Andre Heinecke [Tue, 24 Jul 2018 08:25:17 +0000 (10:25 +0200)]
Auto update german po file formatting

* po/de.po: Update.

16 months agoFix return value of is_crypt_pressed
Andre Heinecke [Tue, 24 Jul 2018 08:24:34 +0000 (10:24 +0200)]
Fix return value of is_crypt_pressed

* src/ribbon-callbacks.cpp (get_crypt_pressed): Fix return

16 months agoFix w64 build
Andre Heinecke [Tue, 24 Jul 2018 08:06:56 +0000 (10:06 +0200)]
Fix w64 build

* src/windowmessages.cpp (delayed_invalidate_ui): Cast delay
to intptr_t before casting to int.

16 months agoUpdate german translation
Andre Heinecke [Tue, 24 Jul 2018 07:32:28 +0000 (09:32 +0200)]
Update german translation

* po/de.po: Update

16 months agoAuto update po files
Andre Heinecke [Tue, 24 Jul 2018 07:23:13 +0000 (09:23 +0200)]
Auto update po files

* po: Update

16 months agoReturn 0 for handled WindowMessages
Andre Heinecke [Tue, 24 Jul 2018 06:10:29 +0000 (08:10 +0200)]
Return 0 for handled WindowMessages

* src/windowmessages.cpp (gpgol_window_proc): Return 0 for
messages handled by us.

Does not make sense to call the defaultwindowproc for our
own messages.

16 months agoTrace timing of sig key request
Andre Heinecke [Tue, 24 Jul 2018 06:09:42 +0000 (08:09 +0200)]
Trace timing of sig key request

* src/parsecontroller.cpp (ParseController::parse): Add tracepoints.

16 months agoLog invalid skipped secret keys
Andre Heinecke [Tue, 24 Jul 2018 06:08:02 +0000 (08:08 +0200)]
Log invalid skipped secret keys

* src/keycache.cpp (locate_secret): Log invalid skipped keys.

This might help in debug output if autoencrypt does not
work for some.

16 months agoPrint parsed mail count in dbg output
Andre Heinecke [Tue, 24 Jul 2018 06:06:58 +0000 (08:06 +0200)]
Print parsed mail count in dbg output

* src/mail.cpp (Mail::updateBody_o): Print parsed mail

16 months agoFix orig body memleak in decryptVerify
Andre Heinecke [Mon, 23 Jul 2018 14:32:32 +0000 (16:32 +0200)]
Fix orig body memleak in decryptVerify

* src/mail.cpp (Mail::decryptVerify_o): Don't assign
heap alloced data to std::string without free.

16 months agoFix memleak of plain body in collect_data
Andre Heinecke [Mon, 23 Jul 2018 14:31:45 +0000 (16:31 +0200)]
Fix memleak of plain body in collect_data

* src/cryptcontroller.cpp (CryptController::collect_data): Fix

16 months agoFix important memleak in get_mail_from_control
Andre Heinecke [Mon, 23 Jul 2018 14:09:51 +0000 (16:09 +0200)]
Fix important memleak in get_mail_from_control

* src/ribbon-callbacks.cpp (get_mail_from_control): Fix memleak.

This function is called 4 times for each invalidate UI so this
leak is important even if it just leaks a few bytes.

16 months agoImprove wchar and utf8 conversion memdbg
Andre Heinecke [Mon, 23 Jul 2018 14:08:52 +0000 (16:08 +0200)]
Improve wchar and utf8 conversion memdbg

* src/w32-gettext.h (wchar_to_utf8, utf8_to_wchar): replace
by logging macros.

16 months agoRemove dead code
Andre Heinecke [Mon, 23 Jul 2018 14:07:57 +0000 (16:07 +0200)]
Remove dead code

* src/mail.cpp, src/mail.h (getHTMLBody_o): Removed.

16 months agoMinor initialzation
Andre Heinecke [Mon, 23 Jul 2018 14:07:09 +0000 (16:07 +0200)]
Minor initialzation

* src/mail.cpp (Mail::decryptVerify_o): Initialize placeholder.

16 months agoFix super minor memleak
Andre Heinecke [Mon, 23 Jul 2018 14:06:35 +0000 (16:06 +0200)]
Fix super minor memleak

* src/gpgoladdin.cpp (GpgolAddin::OnConnection): Release

16 months agoFix memleak in put_pa_string
Andre Heinecke [Mon, 23 Jul 2018 13:34:35 +0000 (15:34 +0200)]
Fix memleak in put_pa_string

* src/oomhelp.cpp (put_pa_string): Fix memleak.

Its a definitve but not a major or critical memleak. In a usual
setup this would leak ~32 Bytes per mail.

16 months agoAdd caller debugging for wchar / utf8 convs
Andre Heinecke [Mon, 23 Jul 2018 13:24:22 +0000 (15:24 +0200)]
Add caller debugging for wchar / utf8 convs

* src/w32-gettext.cpp, src/w32-gettext.h (utf8_to_wchar),
(wchar_to_utf8): Improve tracing for memory debug.

We have some leaks here.

16 months agoUse static references for VARAINT_BOOL | BYREF
Andre Heinecke [Mon, 23 Jul 2018 13:22:25 +0000 (15:22 +0200)]
Use static references for VARAINT_BOOL | BYREF

* src/ribbon-callbacks.cpp (get_crypt_pressed),
(get_is_details_enabled, get_is_crypto_mail): Reference a static.

I really don't understand it but malloc'ing also seems wrong
as we leak heap mem here.
These references to static variables appear to work.

16 months agoFix unlikely error memleak
Andre Heinecke [Mon, 23 Jul 2018 13:21:14 +0000 (15:21 +0200)]
Fix unlikely error memleak

* src/mapihel.cpp (mapi_get_message_content_type): Fix error
handling meleak.

16 months agoPoor redmond man's valgrind
Andre Heinecke [Mon, 23 Jul 2018 12:01:16 +0000 (14:01 +0200)]
Poor redmond man's valgrind

* src: Use x functions
* src/xmalloc.h: Provide macros for memdbg.

16 months agoFix tmp path naming if name exists
Andre Heinecke [Mon, 23 Jul 2018 11:54:27 +0000 (13:54 +0200)]
Fix tmp path naming if name exists

* src/common.cpp (get_tmp_outfile): Fix name.

16 months agostrdup -> xstrdup
Andre Heinecke [Mon, 23 Jul 2018 11:04:34 +0000 (13:04 +0200)]
strdup -> xstrdup


16 months agoRemove unused code
Andre Heinecke [Mon, 23 Jul 2018 07:42:59 +0000 (09:42 +0200)]
Remove unused code

* src/main.c (create_initialization_vector)
(get_crypt_random): Removed.

16 months agoMake async encryption optional
Andre Heinecke [Mon, 23 Jul 2018 07:31:51 +0000 (09:31 +0200)]
Make async encryption optional

* src/common_indep.h (opt): Add sync_enc.
* src/mail.cpp (Mail::isAsynCryptDisabled_o): Respect it.
* src/main.c (read_options): Read it.

If we have users where GpgOL crashes on send we or the
user might want to disable async encryption.

GnuPG-Bug-Id: T3838

16 months agoImprove invalidation blocking
Andre Heinecke [Mon, 23 Jul 2018 06:15:30 +0000 (08:15 +0200)]
Improve invalidation blocking

* src/mail.cpp (do_parsing): Don't use invalidation_lock. We now have
block invalidation.
* src/mailitem-events.cpp (Read): Delay invalidate.
* src/windowmessages.cpp (delayed_invalidate_ui): Take sleep param.
(INVALIDATE_UI): Respect invalidation blocked.
* src/windowmessages.h: Update accordingly.

This works much better then the try to archive minimizing
invalidations by using a lock.

16 months agoTrace return of UI callbacks
Andre Heinecke [Mon, 23 Jul 2018 06:12:16 +0000 (08:12 +0200)]
Trace return of UI callbacks

* src/ribbon-callbacks.cpp: Trace returns.

These functions are often times the last functions in the
log of a crash as they are called whenever the UI changed.
There is no crash in them but to better see it anway we
log when they are done.

16 months agoFix invalidate UI only on unselect
Andre Heinecke [Mon, 23 Jul 2018 06:09:26 +0000 (08:09 +0200)]
Fix invalidate UI only on unselect

* src/explorer-events.cpp (start_watchdog): Only invalidate
UI on unselect.

16 months agounique_ptr++
Andre Heinecke [Mon, 23 Jul 2018 06:08:06 +0000 (08:08 +0200)]

* src/parsecontroller.cpp (ParseController::get_ultimate_keys): Use
unique ptr for context.

16 months agoFix make dist
Andre Heinecke [Fri, 20 Jul 2018 13:52:52 +0000 (15:52 +0200)]
Fix make dist

* po/ Update file list.

16 months agoNext version will be 2.3.0
Andre Heinecke [Fri, 20 Jul 2018 13:52:09 +0000 (15:52 +0200)]
Next version will be 2.3.0

* Bump minor version.

Lots of traumatic changes.

16 months agoDon't print error in memdbg if caller changes
Andre Heinecke [Fri, 20 Jul 2018 13:24:11 +0000 (15:24 +0200)]
Don't print error in memdbg if caller changes

* src/memdbg.cpp (register_name): Don't print error
if the name changed and the calling function was used as the name.

16 months agoMake UI invalidation more deterministic
Andre Heinecke [Fri, 20 Jul 2018 13:21:34 +0000 (15:21 +0200)]
Make UI invalidation more deterministic

* src/explorer-events.cpp (hasSelection, startWatchdog, changeSeen):
* src/mail.cpp (do_parsing): Block invalidation while parsing.
* src/windowmessages.cpp (blockInv, unblockInv): New.
(delayed_invalidate_ui): Handle block inv state.
* src/windowmessages.h: Update accordingly.

UI Invalidation is extremly expensive and often a cause for
crashes. So we should avoid it as much as possible. This
code aims just to do that while still not skipping any
required invalidation.

16 months agoAdd tracing for update body
Andre Heinecke [Fri, 20 Jul 2018 13:00:05 +0000 (15:00 +0200)]
Add tracing for update body

* src/mail.cpp (Mail::updateBody_o): Trace calls.

This seems to hang sometimes so lets make sure that it
is actually the oom call that hangs.

16 months agoPrint error if addin is accessed after shutdown
Andre Heinecke [Fri, 20 Jul 2018 12:58:15 +0000 (14:58 +0200)]
Print error if addin is accessed after shutdown

* src/gpgoladdin.cpp (GpgolAddin::get_instace): Print error
when accessed.

I thought this might be happening.

16 months agoImplement cpp ctor / dtor counting
Andre Heinecke [Fri, 20 Jul 2018 12:57:34 +0000 (14:57 +0200)]
Implement cpp ctor / dtor counting

* src/memdbg.cpp (memdbg_ctor, memdbg_dtor): Implement.

16 months agoUse reffing function as name for IUnknown
Andre Heinecke [Fri, 20 Jul 2018 12:55:27 +0000 (14:55 +0200)]
Use reffing function as name for IUnknown

* src/memdbg.cpp (_memdbg_addRef, register_name): Use
calling function as the name for IUnknwon refs.

This is very useful to see at a glance which refs are
open. E.g. to see the event sink references.

16 months agoAdd simple dtor / ctor counting of Cpp objs
Andre Heinecke [Fri, 20 Jul 2018 12:53:53 +0000 (14:53 +0200)]
Add simple dtor / ctor counting of Cpp objs

This adds memdbg trace function to the important objects
to double check that we don't loose / leak any.

16 months agoAccept multipart/mixed application/pgp-encrypted
Andre Heinecke [Fri, 20 Jul 2018 12:51:30 +0000 (14:51 +0200)]
Accept multipart/mixed application/pgp-encrypted

* src/mapihelp.cpp (change_message_class_ipm_note): Accept
multipart/mixed with protocol application/pgp-encrypted.

This happens when an encrypted mail is moved by Outlooks
local filter move rules.

GnuPG-Bug-Id: T4070

16 months agoRemove dead code and add some addRefs
Andre Heinecke [Fri, 20 Jul 2018 12:01:43 +0000 (14:01 +0200)]
Remove dead code and add some addRefs

* src/mapihel.cpp, src/mapihelp.h (has_gpgol_body_name)
(mapi_get_gpgol_body_attachment, mapi_delete_gpgol_body_attachment),
(mapi_attachment_to_body): Removed.

16 months agoFix ref leak on no object error
Andre Heinecke [Fri, 20 Jul 2018 11:15:49 +0000 (13:15 +0200)]
Fix ref leak on no object error

* src/oomhelp.cpp (get_oom_object): Release pDisp always.

This fixes a common reference leak from the check_inline_response
codepath. Where it would leak for everything that is not an
inline response.

16 months agoFix minor ref leaks
Andre Heinecke [Fri, 20 Jul 2018 10:04:50 +0000 (12:04 +0200)]
Fix minor ref leaks

* src/oomhelp.cpp (get_account_for_mail): Release account.
(ensure_category_exists): Release categories on error.

16 months agoFix ref leak in get_oom_recipients
Andre Heinecke [Fri, 20 Jul 2018 10:04:10 +0000 (12:04 +0200)]
Fix ref leak in get_oom_recipients

* src/oomhelp.cpp (get_oom_recipients): Release addrEntry.

16 months agoAdd missing memdbg_addRefs
Andre Heinecke [Fri, 20 Jul 2018 10:03:03 +0000 (12:03 +0200)]
Add missing memdbg_addRefs

* src/mapihelp.cpp (mapi_get_attach): Add missing addRef.
* src/mimemaker.cpp (create_mapi_attachment): Ditto.

16 months agoAdd ptr and line to addRef dbg output
Andre Heinecke [Fri, 20 Jul 2018 10:02:10 +0000 (12:02 +0200)]
Add ptr and line to addRef dbg output

* src/memdbg.h (memdbg_addRef): Debug out the line.

This makes it easy to find where leaked objects were

16 months agoFix attach table leak
Andre Heinecke [Fri, 20 Jul 2018 10:01:23 +0000 (12:01 +0200)]
Fix attach table leak

* src/cryptcontroller.cpp (CryptController::collect_data): Fix
table leak.

16 months agoFix ref leak in setDoAutosecure_m
Andre Heinecke [Fri, 20 Jul 2018 09:18:34 +0000 (11:18 +0200)]
Fix ref leak in setDoAutosecure_m

* src/mail.cpp (Mail::setDoAutosecure_m): Release msg.

16 months agoFix big reference leak of cipherstream / message
Andre Heinecke [Fri, 20 Jul 2018 08:48:02 +0000 (10:48 +0200)]
Fix big reference leak of cipherstream / message

* src/mail.cpp (get_attachment_stream_o): Release
message and mapi_attachment after obtaining the stream.

This is a big leak. It probably means that Outlook kept
the original Message fully in the memory.

For this the memdbg interface might already be worth it.

16 months agoImprove memdbg name output
Andre Heinecke [Fri, 20 Jul 2018 08:46:13 +0000 (10:46 +0200)]
Improve memdbg name output

* src/memdbg.cpp (register_name): Handle name changes.
(memdbg_addRef): Handle name change.

16 months agoChange an error to debug
Andre Heinecke [Fri, 20 Jul 2018 08:45:00 +0000 (10:45 +0200)]
Change an error to debug

* src/mail.cpp (Mail::installFolderEventHandler_o): Don't
print the success message as error.

16 months agoUnref application unload / shutdown
Andre Heinecke [Fri, 20 Jul 2018 08:43:02 +0000 (10:43 +0200)]
Unref application unload / shutdown

* src/gpgoladdin.cpp (GpgolAddin::shutdown): Release

Minor and should not have been a problem.

16 months agoFix reference error on Explorer / Explorers object
Andre Heinecke [Fri, 20 Jul 2018 08:40:40 +0000 (10:40 +0200)]
Fix reference error on Explorer / Explorers object

* src/gpgoladdin.cpp (install_explorer_sinks): Release
explorer and explorers after installing the sinks.

The sinks handle the ref counting by themself. The
reference leak should be not a real problem because
the sinks keep them anyway until the end of the

16 months agoAdd memdbg handling for MAPI
Andre Heinecke [Fri, 20 Jul 2018 08:34:00 +0000 (10:34 +0200)]
Add memdbg handling for MAPI

* src/gpgoladdin.cpp (GpgolAddin::OnConnection): Ref application.
* src/mapihelp.cpp: Replace OpenProperty by gpgol_openProperty.
memdbg_addRef for some MAPI functions that return an object.
* src/mimemaker.cpp: Replace OpenProperty by gpgol_openProperty.
* src/mlang-charset.cpp (ansi_charset_to_utf8): Mark multilang
as reffed.
* src/olflange.cpp (install_forms): Mark formcontainer as reffed.
* src/oomhelp.cpp, src/oomhelp.h (gpgol_queryInterface): New.
(get_oom_iunknown): Add ref.
(get_oom_base_message_from_mapi): Add ref.
* src/ribbon-callbacks.cpp (getIcon): Add ref on stream and
change it to be automatically freed as we don't free it.

16 months agoImprove GpgolAddin debug output
Andre Heinecke [Fri, 20 Jul 2018 08:30:23 +0000 (10:30 +0200)]
Improve GpgolAddin debug output

* src/gpgoladdin.cpp (DllCanUnloadNow): Trace call.
(GpgolRibbonExtender::~GpgolRibbonExtender): Dump memory map.
(GpgolAddinFactory::~GpgolAddinFactory): Debug dtor.

16 months agoDon't export DllCanUnloadNow at all
Andre Heinecke [Fri, 20 Jul 2018 08:28:42 +0000 (10:28 +0200)]
Don't export DllCanUnloadNow at all

* src/gpgol.def (DllCanUnloadNow): Don't export.

We don't want to be unloaded by com cleanup. And
while we should have returned false always I
saw one crash immediately after a Dll can unload

16 months agoAlso debug oom if debug oom_extra is set
Andre Heinecke [Fri, 20 Jul 2018 08:27:26 +0000 (10:27 +0200)]
Also debug oom if debug oom_extra is set

* src/common_indep.h (gpgol_release): Add line.
(debug_oom): Also debug for oom_extra

Debug oom is one of the debug settings that need to go
in the future.

16 months agoDecorate eventsink with memdbg helpers
Andre Heinecke [Fri, 20 Jul 2018 08:26:48 +0000 (10:26 +0200)]
Decorate eventsink with memdbg helpers

* src/eventsink.h: Add memdbg helpers

16 months agoFix minor ref leak
Andre Heinecke [Fri, 20 Jul 2018 06:28:58 +0000 (08:28 +0200)]
Fix minor ref leak

* src/oomhelp.cpp (get_ol_ui_language): Release langsettings.

16 months agoStart memdbg interface for COM ref counting
Andre Heinecke [Fri, 20 Jul 2018 06:20:18 +0000 (08:20 +0200)]
Start memdbg interface for COM ref counting

* src/ Add memdbg files.
* src/common_indep.h (gpgol_release): Call memdbg_released.
* src/eventsink.h (install..sink): Use gpgol_queryInterface
* src/mailitem-events.cpp (Unload): Dump memdbg maps after unload.
* src/oomhelp.h (gpgol_queryInterface): New.
* src/mimedataprovider.cpp (MimeDataProvider::MimeDataProvider):
Register ref add.
* src/oomhelp.cpp (gpgol_queryInterface): New.
(get_object_name): Use non memdbg aware functions.
(get_oom_object): Use gpgol_queryInterface.
(get_oom_object): Print out refs when obtaining if.
(get_oom_control_bytag, get_object_by_id),
(get_oom_mapi_session): Use mdbg functions.

The idea is that in the end we will trace all
com reference obtains and releases to find mismatchs
and additionally all malloc / frees and C++ dtor / ctor
to find memory leaks and hopefully random instability or
crashes caused by invalid ref counting.

As we can't use valgrind or decent debugging in
Outlook on Windows tracking it ourself seems
to be useful.

16 months agoOnly shutdown for the last explorer close
Andre Heinecke [Wed, 18 Jul 2018 12:32:40 +0000 (14:32 +0200)]
Only shutdown for the last explorer close

* src/windowmessages.cpp (gpgol_hook): Only shutdown if
the last explorer is closed.

This acidentally mostly worked before as we only registered
the first explorer for this function in the past.

Also added a comment remembering what this function actually
intends and why it is needed.

16 months agoMinor performance improvement
Andre Heinecke [Wed, 18 Jul 2018 12:04:03 +0000 (14:04 +0200)]
Minor performance improvement

* src/parsecontroller.cpp (ParseController::parse): Check that
get_ultimate_keys is only called once even for multisigs.

16 months agoPrint binary mime data as hex
Andre Heinecke [Wed, 18 Jul 2018 12:03:23 +0000 (14:03 +0200)]
Print binary mime data as hex

* src/mimedataprovider.cpp (MimeDataProvider::read): Dump
binary as hex.

16 months agoMinor perfomance improvement
Andre Heinecke [Wed, 18 Jul 2018 12:02:26 +0000 (14:02 +0200)]
Minor perfomance improvement

* src/mail.cpp (level_4_check): Reduce copies
of get_ultimate_keys vector.

16 months agoOnly treat unknown sigs as lvl2 if they are valid
Andre Heinecke [Wed, 18 Jul 2018 12:00:53 +0000 (14:00 +0200)]
Only treat unknown sigs as lvl2 if they are valid

* src/mail.cpp (Mail::updateSigstate): Check for sigsum valid
before using WKD as shortcut to lvl 2.

Using GPGME's sigstate is clunky.

16 months agoAdd helper functions for hexdump
Andre Heinecke [Wed, 18 Jul 2018 11:59:45 +0000 (13:59 +0200)]
Add helper functions for hexdump

* src/cpphelp.cpp, src/cpphelp.h (is_binary, string_to_hex): New.

16 months agoRewrite get_tmp_outfile to fix a crash
Andre Heinecke [Tue, 17 Jul 2018 14:54:43 +0000 (16:54 +0200)]
Rewrite get_tmp_outfile to fix a crash

* src/common.cpp (get_tmp_outfile): Rewrite using c++.
(getTmpPathUtf8, CreateFileUtf8): New helpers.

This fixes a crash because somehow snwprintf didn't
always work as I expeted it to. In that case it would
only concatenate the first chars of the attachment filenames
this caused the wcsrchr of the backslash to return NULL and
the following wcschr to find the extension to crash.

This happend on a name conflict in the tmp folder. E.g.
if two mails were open with the same attachment filenames.

16 months agoAdd wchar_to_utf8_string function
Andre Heinecke [Tue, 17 Jul 2018 14:53:43 +0000 (16:53 +0200)]
Add wchar_to_utf8_string function

* src/w32-gettext.cpp, src/w32-gettext.h (wchar_to_utf8_string):
Wrap the c to c++ conversion in a function.

16 months agoLoad gpgconf in a background thread
Andre Heinecke [Tue, 17 Jul 2018 13:04:19 +0000 (15:04 +0200)]
Load gpgconf in a background thread

* src/cpphelp.cpp (is_de_vs): Set checked earlier for
better reentrancy.
* src/gpgoladdin.cpp (OnStartupComplete): init_gpgme_config.

GpgME++ already handles caching for us. All we have to
do is trigger loading early and in a non-blocking manner.

16 months agoFix possible invalid CloseHandle and DeleteFile
Andre Heinecke [Tue, 17 Jul 2018 12:53:24 +0000 (14:53 +0200)]
Fix possible invalid CloseHandle and DeleteFile

* src/mail.cpp (add_attachments_o): Guard CloseHandle and

CloseHandle may only be called on valid handles.

16 months agoCleanup shutdown and fix potential crashes
Andre Heinecke [Tue, 17 Jul 2018 12:43:12 +0000 (14:43 +0200)]
Cleanup shutdown and fix potential crashes

* src/explorer-events.cpp (Close): Unregister sink with addin.
* src/explorers-events.cpp (NewInstance): Register sink.
* src/gpgoladdin.cpp (GpgolAddin::~GpgolAddin): Remove shutdown
(GpgolAddin::OnConnection): Mark shutdown state as false.
(GpgolAddin::OnDisconnection): Call shutdown.
(install_explorer_sinks): Register created sinks.
(GpgolAddin::shutdown): New. Handle shutdown.
(GpgolAddin::unregisterExplorerSink): Track explorer sinks.
* src/gpgoladdin.h: Update accordingly.
* src/mail.cpp (Mail::closeAllMails_o): Fix folder events
detach and do it earlier.
(Mail::installFolderEventHandler_o): Use sink instead of folder
to track event handler.
* src/windowmessages.cpp (add_explorer, remove_explorer): removed.
(gpgol_hook): Interate over actual explorers instead of variables.
* src/windowmessages.h: Update accordingly.

This fixes Explorer events release / deletion on unload / shutdown.
Previously this was only done on close, which came after GpgOL
was unloaded. Maybe this resulted in a jump to an unmapped location?

It also fixes that the gpgol_hook was only enabled for all explorers
at start time. Maybe we will see a regression now that it works
as intended on all explorers.

Explorers Events and Application Events were never deleted / released
because they were not detached before release. (But the release
then didn't delete them).

Definitely fixed is a race condition on shutdown which would be:
-> Shutdown detected
-> Close all mails
-> The currently visible mail is closed
-> Outlook loads it again because it is currently visible
-> But we are in shutdown mode.

Now we would start to parse while actually shutting down. This
could lead to hangs / crashes. The reason for this was that
we closed the mails before we detached the Application event
handler and thus captured the item load again.

16 months agoTune down error to debug
Andre Heinecke [Wed, 11 Jul 2018 14:48:21 +0000 (16:48 +0200)]
Tune down error to debug

* src/mail.cpp (get_uid_for_sender): It's common for S/MIME
to have two uids where one does not have an email. So don't
error but just debug it.

16 months agoCheck for wchar_t conversion success for attach
Andre Heinecke [Wed, 11 Jul 2018 14:47:32 +0000 (16:47 +0200)]
Check for wchar_t conversion success for attach

* src/mail.cpp (add_attachments_o): Check wchar_name.

16 months agoLog sent windowmessages
Andre Heinecke [Wed, 11 Jul 2018 14:46:37 +0000 (16:46 +0200)]
Log sent windowmessages

* src/windowmessages.cpp (do_in_ui_thread): Log message sending.

16 months agoMinor improvement to debug output
Andre Heinecke [Wed, 11 Jul 2018 14:46:14 +0000 (16:46 +0200)]
Minor improvement to debug output


16 months agoCheck if someone tries to set null as att name
Andre Heinecke [Wed, 11 Jul 2018 14:45:22 +0000 (16:45 +0200)]
Check if someone tries to set null as att name

* src/attachment.cpp (Attachment::set_display_name): Check for NULL.

Should not happen but better save then sorry

16 months agoAbort attachment process chain in case of error
Andre Heinecke [Wed, 11 Jul 2018 06:32:57 +0000 (08:32 +0200)]
Abort attachment process chain in case of error

* src/mail.cpp (add_attachments_o): Don't continue with attachment
processing if something failed.

This should make the errors clearer and avoid undefined behavior
in case e.g. obtaining an attachment tmp name fails.

GnuPG-Bug-Id: T4063

16 months agoLog w32 error and tried filename for tmp attach
Andre Heinecke [Wed, 11 Jul 2018 06:31:54 +0000 (08:31 +0200)]
Log w32 error and tried filename for tmp attach

* src/common.cpp (get_tmp_outfile): Log error and tried filename.

This will help analyse issues like:
GnuPG-Bug-Id: T4063

16 months agoConvert common to cpp and clean it up
Andre Heinecke [Tue, 10 Jul 2018 12:26:12 +0000 (14:26 +0200)]
Convert common to cpp and clean it up

* src/ Remove config-dialog.c
* src/common.c, src/common.cpp: Cppify, cleanup.
* src/config-dialog.c: Remove it.
* src/gpgoladdin.cpp (GetCustomUI_MIME): Use normal utf8_to_wchar.

16 months agoRemove accidentally commited dev debug
Andre Heinecke [Tue, 10 Jul 2018 11:47:52 +0000 (13:47 +0200)]
Remove accidentally commited dev debug


16 months agoAdd support for distribution lists (groups)
Andre Heinecke [Tue, 10 Jul 2018 10:25:45 +0000 (12:25 +0200)]
Add support for distribution lists (groups)

* src/oomhelp.cpp (get_recipient_addr_fallbacks):
Handle distributionb lists and plit into
(get_recipient_addr_entry_fallbacks_ex): New. Handle
the exchange stuff.
(try_resolve_group): Resolve distribution lists.
(get_oom_recipients): Check for distribution lists.
* src/oomhelp.h: Add some new defines.

This adds support for contact groups / distribution lists.
Not tested with exchange yet but it should work as the code
for the exchange fallbacks is still used.

GnuPG-Bug-Id: T4065

16 months agoLog keys used in internal resolution
Andre Heinecke [Tue, 10 Jul 2018 10:24:45 +0000 (12:24 +0200)]
Log keys used in internal resolution

* src/cryptcontroller.cpp (CryptController::resolve_keys_cached):
Log used keys.

Can be helpful to detect problems.

16 months agoImprove recipient handling
Andre Heinecke [Tue, 10 Jul 2018 08:50:33 +0000 (10:50 +0200)]
Improve recipient handling

* src/cryptcontroller.cpp (CryptController::CryptController),
src/keycache.cpp (KeyCache::isMailResolvable),
src/wks-helper.cpp (WKSHelper::handle_confirmation_read):
Update call to mail->getRecipients.
* src/mail.h (Mail::getRecipients): Renamed to
* src/mail.cpp (Mail::getRecipients_o): Adapt to vector.
Add error handling.
(Mail::updateOOMData_o): Use vector directly.
* src/oomhelp.cpp, src/oomhelp.h (get_oom_recipients):
Use vector and provide an error.

Downstream we already used the recipients mostly as a
vector anyway to avoid the memory mangement hassle.
This gives us more flexibility.

Additionally we now report an error for the case
GnuPG-Bug-Id: T4065

16 months agoUse unique ptr for parser context
Andre Heinecke [Tue, 10 Jul 2018 08:30:51 +0000 (10:30 +0200)]
Use unique ptr for parser context

* src/parsecontroller.cpp (ParseController::parse): Use unique
ptr for GpgME Context.

Wherever I see it I tend to change it. Makes the code

16 months agoUse c++ linkage for oomhelp and conv w32getttext
Andre Heinecke [Tue, 10 Jul 2018 08:27:50 +0000 (10:27 +0200)]
Use c++ linkage for oomhelp and conv w32getttext

* src/mapihelp.h: Don't include oomhelp with c linkage.
* src/oomhelp.h: Use C++ linkage.
* src/ Update accordingly.
* src/w32-gettext.c, src/w32-gettext.cpp: Renamed. Added
casts for c++ and removed trailing whitespace.
* src/w32-gettext.h: Use C linkage for gettext.

We have some few C only files like common and main but
mostly we are fully c++. Using C++ linkage will allow
us to change oomhelp functions to work with C++ data
types for better memory management.

16 months agoClarify logging for empty UID emails
Andre Heinecke [Mon, 9 Jul 2018 14:24:32 +0000 (16:24 +0200)]
Clarify logging for empty UID emails

* src/mail.cpp (get_uid_for_sender): Check that email is
not empty.

16 months agoImplement "prefer-smime" option
Andre Heinecke [Mon, 9 Jul 2018 14:22:34 +0000 (16:22 +0200)]
Implement "prefer-smime" option

* src/cryptcontroller.cpp (CryptController::resolve_keys_cached):
Respect prefer smime setting.

Some prefer SM.

GnuPG-Bug-Id: T3961

16 months agoMore options / config cleanup
Andre Heinecke [Mon, 9 Jul 2018 14:19:35 +0000 (16:19 +0200)]
More options / config cleanup

* src/main.cpp (write_options): Remove most options now
controlled by the external dialog.
(get_conf_bool): New helper.
(read_options): Use it.
* src/common_indep.c (set_default_key): Removed.
* src/common_indep.h (opt): Remove obsolete values and
add some new ones.

Most of the removed options were already obsolete for

GnuPG-Bug-Id: T3944

16 months agoFix crash for attachment names > 76 chars
Andre Heinecke [Mon, 9 Jul 2018 13:37:28 +0000 (15:37 +0200)]
Fix crash for attachment names > 76 chars

* src/rfc2047parse.c (rfc2047_decode_tokens): Use return
value of realloc.

This was introduced by me when porting rfc2047parse away from
glib. *blushes*

GnuPG-Bug-Id: T4062

16 months agotests: Don't override GNUPGHOME in run-parser
Andre Heinecke [Mon, 9 Jul 2018 13:16:07 +0000 (15:16 +0200)]
tests: Don't override GNUPGHOME in run-parser

* tests/run-parser.c (main): Don't override the GNUPGHOME

This was useful back when I ran the parser test mostly on
KMail's testcorpus but now when I use it to debug other
errors it is better to let the user set the homedir.

16 months agoFix linux build
Andre Heinecke [Mon, 9 Jul 2018 13:09:13 +0000 (15:09 +0200)]
Fix linux build

* src/parsecontroller.cpp (ParseController::parse): Ifdef
native encoding workaround.

17 months agoSwitch back to old check for reading pane for ol16
Andre Heinecke [Fri, 6 Jul 2018 09:54:11 +0000 (11:54 +0200)]
Switch back to old check for reading pane for ol16

* src/ribbon-callbacks.cpp (get_mail_from_control): Use the
same codepath as OL2010 and 13 for 2016 again, too.

The crash in Outlook 2016 started to appear at some point.
Now after various updates to Outlook I can no longer reproduce it.
As the previewpane.wordeditor is not reliable. see:
GnuPG-Bug-Id: T4056

We disable that codepath again. The crash report was
GnuPG-Bug-Id: T3484

17 months agoAdd log_addins oomhelp function
Andre Heinecke [Fri, 6 Jul 2018 09:16:19 +0000 (11:16 +0200)]
Add log_addins oomhelp function

* src/oomhelp.cpp, src/oomhelp.h (log_addins): New.
(get_oom_object): Debug dispid.

I could not find a place where the call to Item(x) does
not result in the general 80020009 exception. Strange.
There is something fishy here because "Item" has dispid 0. But
this is also what OutlookSpy shows.

17 months agoAdd missing i18n for conf dialog
Andre Heinecke [Fri, 6 Jul 2018 09:15:12 +0000 (11:15 +0200)]
Add missing i18n for conf dialog

* src/addin-options.cpp (i18n_noops): Add another option string.

17 months agoRemove now unused WinAPI dialog resource
Andre Heinecke [Tue, 3 Jul 2018 14:21:38 +0000 (16:21 +0200)]
Remove now unused WinAPI dialog resource

* src/dialogs.rc: Remove last winapi dialog.

17 months agoChange addion-options to use external dialog
Andre Heinecke [Tue, 3 Jul 2018 14:14:43 +0000 (16:14 +0200)]
Change addion-options to use external dialog

* src/addin-options.cpp (open_gpgolgui): New.
(options_dialog_box): Open gpgolgui or bring it to foreground.
(i18n_noops): Add strings.
(launch_kleo_config): Removed.
(options_window_proc): Removed.

This adds a new config dialog which is a dynamic qt application.
It uses the translations from GpgOL.

GnuPG-Bug-Id: T3944

17 months agoMake it possible to move decrypted mails
Andre Heinecke [Tue, 26 Jun 2018 14:18:38 +0000 (16:18 +0200)]
Make it possible to move decrypted mails

* src/ Add folder-events.cpp
* src/eventsinks.h (install_FolderEvents_sink),
(detach_FolderEvents_sink): New.
* src/folder-events.cpp: New event handler.
* src/mail.cpp (s_folder_events_map): New map to track
registered handlers.
(Mail::isAboutToBeMoved, Mail::setIsAboutToBeMoved): New.
(Mail::installFolderEventHandler_o): New.
(Mail::closeAllMails_o): detach folder handler.
* src/mail.h: Update accordingly.
* src/mailitem-events.cpp (Write): Pass if mail is about to
be moved.
* src/oomhelp.h (IID_FolderEvents): New.

While the application has the item copy events the folder
has a before item move event. To catch this we register an
event handler for each folder in which a mail was decrypted.
If a crypto mail is then about to be moved we close it with
discard changes to discard the plaintext, then we pass
the write event to allow the move.

Works flawlessly in the first tests.

GnuPG-Bug-Id: T3459
GnuPG-Bug-Id: T3956
GnuPG-Bug-Id: T3418

17 months agoEnable auto-key-retrieve if autoresolve is set
Andre Heinecke [Tue, 26 Jun 2018 12:46:49 +0000 (14:46 +0200)]
Enable auto-key-retrieve if autoresolve is set

* src/parsecontroller.cpp (ParseController::parse): Enable
auto-key-retrieve if autoresolve is set to true.

With autoresolve we do network lookups already so it makes
sense to reuse the option here.