diff --git a/src/attached-file-events.cpp b/src/attached-file-events.cpp index 0bd40ad..d7bbdd4 100644 --- a/src/attached-file-events.cpp +++ b/src/attached-file-events.cpp @@ -1,255 +1,256 @@ /* attached-file-events.cpp - GpgolAttachedFileEvents implementation * Copyright (C) 2005, 2007 g10 Code GmbH - * + * * This file is part of GpgOL. - * + * * GpgOL is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. - * + * * GpgOL is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, see . */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include "mymapi.h" #include "mymapitags.h" #include "myexchext.h" #include "common.h" #include "olflange-def.h" #include "olflange.h" #include "serpent.h" #include "attached-file-events.h" #define TRACEPOINT() do { log_debug ("%s:%s:%d: tracepoint\n", \ SRCNAME, __func__, __LINE__); \ } while (0) #define COPYBUFFERSIZE 4096 /* Copy STREAM to a new file FILENAME while decrypting it using the context SYMENC. */ static int decrypt_and_write_file (LPSTREAM stream, const char *filename, symenc_t symenc) { int rc = E_ABORT; HRESULT hr; ULONG nread; char *buf = NULL; FILE *fpout = NULL; fpout = fopen (filename, "wb"); if (!fpout) { log_error ("%s:%s: fwrite failed: %s", SRCNAME, __func__, strerror (errno)); MessageBox (NULL, _("Error creating file for attachment."), "GpgOL", MB_ICONERROR|MB_OK); goto leave; } buf = (char*)xmalloc (COPYBUFFERSIZE); do { hr = stream->Read (buf, COPYBUFFERSIZE, &nread); if (hr) { log_error ("%s:%s: Read failed: hr=%#lx", SRCNAME, __func__, hr); MessageBox (NULL, _("Error reading attachment."), "GpgOL", MB_ICONERROR|MB_OK); goto leave; } if (nread) symenc_cfb_decrypt (symenc, buf, buf, nread); if (nread && fwrite (buf, nread, 1, fpout) != 1) { log_error ("%s:%s: fwrite failed: %s", SRCNAME, __func__, strerror (errno)); MessageBox (NULL, _("Error writing attachment."), "GpgOL", MB_ICONERROR|MB_OK); goto leave; } } while (nread == COPYBUFFERSIZE); - + xfree (buf); + buf = NULL; if (fclose (fpout)) { - log_error ("%s:%s: fclose failed: %s", + log_error ("%s:%s: fclose failed: %s", SRCNAME, __func__, strerror (errno)); MessageBox (NULL, _("Error writing attachment."), "GpgOL", MB_ICONERROR|MB_OK); goto leave; - } + } rc = S_OK; leave: xfree (buf); if (fpout) fclose (fpout); if (rc != S_OK) remove (filename); return rc; } /* Our constructor. */ GpgolAttachedFileEvents::GpgolAttachedFileEvents (GpgolExt *pParentInterface) -{ +{ m_pExchExt = pParentInterface; m_ref = 0; } /* The QueryInterfac. */ -STDMETHODIMP +STDMETHODIMP GpgolAttachedFileEvents::QueryInterface (REFIID riid, LPVOID FAR *ppvObj) { *ppvObj = NULL; if (riid == IID_IExchExtAttachedFileEvents) { *ppvObj = (LPVOID)this; AddRef (); return S_OK; } if (riid == IID_IUnknown) { *ppvObj = (LPVOID)m_pExchExt; m_pExchExt->AddRef (); return S_OK; } return E_NOINTERFACE; } - + /* Fixme: We need to figure out what this exactly does. There is no public information available exepct for the MAPI book which is out - of print. + of print. This seems to be called if one adds a new attachment to a the composer. */ -STDMETHODIMP -GpgolAttachedFileEvents::OnReadPattFromSzFile +STDMETHODIMP +GpgolAttachedFileEvents::OnReadPattFromSzFile (LPATTACH att, LPTSTR file, ULONG flags) { - log_debug ("%s:%s: att=%p file=`%s' flags=%lx\n", + log_debug ("%s:%s: att=%p file=`%s' flags=%lx\n", SRCNAME, __func__, att, file, flags); return S_FALSE; } - - + + /* This seems to be called if one clicks on Save in the context menu. And also sometimes before an Open click. */ -STDMETHODIMP -GpgolAttachedFileEvents::OnWritePattToSzFile +STDMETHODIMP +GpgolAttachedFileEvents::OnWritePattToSzFile (LPATTACH att, LPTSTR file, ULONG flags) { HRESULT hr; ULONG tag; char *iv; size_t ivlen; symenc_t symenc; LPSTREAM stream; char tmpbuf[16]; ULONG nread; int rc; - log_debug ("%s:%s: att=%p file=`%s' flags=%lx\n", + log_debug ("%s:%s: att=%p file=`%s' flags=%lx\n", SRCNAME, __func__, att, file, flags); if (!att) return E_FAIL; if (get_gpgolprotectiv_tag ((LPMESSAGE)att, &tag) ) return E_ABORT; iv = mapi_get_binary_prop ((LPMESSAGE)att, tag, &ivlen); if (!iv) return S_FALSE; /* Not encrypted by us - Let OL continue as usual. */ symenc = symenc_open (get_128bit_session_key (), 16, iv, ivlen); xfree (iv); if (!symenc) { log_error ("%s:%s: can't open encryption context", SRCNAME, __func__); return E_ABORT; } - hr = att->OpenProperty (PR_ATTACH_DATA_BIN, &IID_IStream, + hr = att->OpenProperty (PR_ATTACH_DATA_BIN, &IID_IStream, 0, 0, (LPUNKNOWN*) &stream); if (FAILED (hr)) { log_error ("%s:%s: can't open data stream of attachment: hr=%#lx", SRCNAME, __func__, hr); symenc_close (symenc); return E_ABORT; } hr = stream->Read (tmpbuf, 16, &nread); if (hr) { log_debug ("%s:%s: Read failed: hr=%#lx", SRCNAME, __func__, hr); stream->Release (); symenc_close (symenc); return E_ABORT; } symenc_cfb_decrypt (symenc, tmpbuf, tmpbuf, 16); if (memcmp (tmpbuf, "GpgOL attachment", 16)) { MessageBox (NULL, _("Sorry, we are not able to decrypt this attachment.\n\n" "Please use the decrypt/verify button to decrypt the\n" "entire message again. Then open this attachment."), "GpgOL", MB_ICONERROR|MB_OK); stream->Release (); symenc_close (symenc); return E_ABORT; } rc = decrypt_and_write_file (stream, file, symenc); stream->Release (); symenc_close (symenc); return rc; } STDMETHODIMP GpgolAttachedFileEvents::QueryDisallowOpenPatt (LPATTACH att) { log_debug ("%s:%s: att=%p\n", SRCNAME, __func__, att); return S_FALSE; } -STDMETHODIMP +STDMETHODIMP GpgolAttachedFileEvents::OnOpenPatt (LPATTACH att) { log_debug ("%s:%s: att=%p\n", SRCNAME, __func__, att); return S_FALSE; } /* This seems to be called if one clicks on Open in the context menu. */ -STDMETHODIMP +STDMETHODIMP GpgolAttachedFileEvents::OnOpenSzFile (LPTSTR file, ULONG flags) { log_debug ("%s:%s: file=`%s' flags=%lx\n", SRCNAME, __func__, file, flags); return S_FALSE; }