From cvs at cvs.gnupg.org Thu Oct 1 01:58:31 2015 From: cvs at cvs.gnupg.org (by NIIBE Yutaka) Date: Thu, 01 Oct 2015 01:58:31 +0200 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.8-54-ga9895a5 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via a9895a5a72a851c5fcc70f16d5f8f588cc885751 (commit) from c8584a1e559bc720412e1a2fc546a54ff4517205 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit a9895a5a72a851c5fcc70f16d5f8f588cc885751 Author: NIIBE Yutaka Date: Thu Oct 1 08:57:06 2015 +0900 common: Fix strsplit. * common/stringhelp.c (strsplit): Fix arguments order. diff --git a/common/stringhelp.c b/common/stringhelp.c index 576c2ea..38c3832 100644 --- a/common/stringhelp.c +++ b/common/stringhelp.c @@ -1230,7 +1230,7 @@ strsplit (char *string, char delim, char replacement, int *count) for (t = strchr (string, delim); t; t = strchr (t + 1, delim)) fields ++; - result = xtrycalloc (sizeof (*result), (fields + 1)); + result = xtrycalloc ((fields + 1), sizeof (*result)); if (! result) return NULL; ----------------------------------------------------------------------- Summary of changes: common/stringhelp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Thu Oct 1 07:33:54 2015 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Thu, 01 Oct 2015 07:33:54 +0200 Subject: [git] GnuPG - branch, STABLE-BRANCH-2-0, updated. gnupg-2.0.29-11-gb1653a4 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, STABLE-BRANCH-2-0 has been updated via b1653a4083b91cfa85d90f59612fa1c3f4d51778 (commit) from fea9d4354c93b662c75febe020fb799ce4f2ec89 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit b1653a4083b91cfa85d90f59612fa1c3f4d51778 Author: Werner Koch Date: Thu Sep 18 15:08:51 2014 +0200 gpg: Silence a compiler warning. * g10/parse-packet.c (enum_sig_subpkt): Replace hack. -- GCC 5 failure reported by Kevin Locke (backport from master commit 6a0c3fa19cfcdd590b96691e8a8ffb48fb5e0ec4) diff --git a/g10/parse-packet.c b/g10/parse-packet.c index a8f9d99..c925e94 100644 --- a/g10/parse-packet.c +++ b/g10/parse-packet.c @@ -1258,10 +1258,10 @@ enum_sig_subpkt( const subpktarea_t *pktbuf, sigsubpkttype_t reqtype, critical=&critical_dummy; if( !pktbuf || reqseq == -1 ) { - /* return some value different from NULL to indicate that - * there is no critical bit we do not understand. The caller - * will never use the value. Yes I know, it is an ugly hack */ - return reqtype == SIGSUBPKT_TEST_CRITICAL? (const byte*)&pktbuf : NULL; + static char dummy[] = "x"; + /* Return a value different from NULL to indicate that + * there is no critical bit we do not understand. */ + return reqtype == SIGSUBPKT_TEST_CRITICAL ? dummy : NULL; } buffer = pktbuf->data; buflen = pktbuf->len; ----------------------------------------------------------------------- Summary of changes: g10/parse-packet.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Thu Oct 1 07:35:02 2015 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Thu, 01 Oct 2015 07:35:02 +0200 Subject: [git] GnuPG - branch, STABLE-BRANCH-1-4, updated. gnupg-1.4.19-12-g6db18e2 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, STABLE-BRANCH-1-4 has been updated via 6db18e29eb81b37ed6feb592add77d492c60fc35 (commit) from 9232df23ac545e358d10c5539bdc9de2d05f15e8 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 6db18e29eb81b37ed6feb592add77d492c60fc35 Author: Werner Koch Date: Thu Sep 18 15:08:51 2014 +0200 gpg: Silence a compiler warning. * g10/parse-packet.c (enum_sig_subpkt): Replace hack. -- GCC 5 failure reported by Kevin Locke (backport from master commit 6a0c3fa19cfcdd590b96691e8a8ffb48fb5e0ec4) diff --git a/g10/parse-packet.c b/g10/parse-packet.c index 8d4450c..beee77e 100644 --- a/g10/parse-packet.c +++ b/g10/parse-packet.c @@ -1183,10 +1183,10 @@ enum_sig_subpkt( const subpktarea_t *pktbuf, sigsubpkttype_t reqtype, critical=&critical_dummy; if( !pktbuf || reqseq == -1 ) { - /* return some value different from NULL to indicate that - * there is no critical bit we do not understand. The caller - * will never use the value. Yes I know, it is an ugly hack */ - return reqtype == SIGSUBPKT_TEST_CRITICAL? (const byte*)&pktbuf : NULL; + static char dummy[] = "x"; + /* Return a value different from NULL to indicate that + * there is no critical bit we do not understand. */ + return reqtype == SIGSUBPKT_TEST_CRITICAL ? dummy : NULL; } buffer = pktbuf->data; buflen = pktbuf->len; ----------------------------------------------------------------------- Summary of changes: g10/parse-packet.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Thu Oct 1 16:28:48 2015 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Thu, 01 Oct 2015 16:28:48 +0200 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.8-55-g13a3f65 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via 13a3f65968f4a8205ca664cc46b1a53de4dc489b (commit) from a9895a5a72a851c5fcc70f16d5f8f588cc885751 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 13a3f65968f4a8205ca664cc46b1a53de4dc489b Author: Werner Koch Date: Thu Oct 1 16:22:29 2015 +0200 gpg: Add debug helper to --edit-keys's check sub-command. * g10/keyedit.c (print_and_check_one_sig): Add arg "extended" and print an asterisk for the chosen selfsig. (check_all_keysigs): Add arg "only_selfsig" (keyedit_menu) : Add optional arg "selfsig". -- Using "check selfsig" prints only the self-signatures and indicates the chosen selfsig with an asterisk. Signed-off-by: Werner Koch diff --git a/doc/gpg.texi b/doc/gpg.texi index 9d62afb..28e4f83 100644 --- a/doc/gpg.texi +++ b/doc/gpg.texi @@ -660,7 +660,8 @@ create a signature of any type desired. @item check @opindex keyedit:check - Check the signatures on all selected user IDs. + Check the signatures on all selected user IDs. With the extra + option @code{selfsig} only self-signatures are shown. @item adduid @opindex keyedit:adduid diff --git a/g10/keyedit.c b/g10/keyedit.c index 61aceb2..8d87a01 100644 --- a/g10/keyedit.c +++ b/g10/keyedit.c @@ -185,13 +185,15 @@ print_and_check_one_sig_colon (KBNODE keyblock, KBNODE node, /* - * Print information about a signature, check it and return true - * if the signature is okay. NODE must be a signature packet. + * Print information about a signature, check it and return true if + * the signature is okay. NODE must be a signature packet. With + * EXTENDED set all possible signature list options will always be + * printed. */ static int print_and_check_one_sig (KBNODE keyblock, KBNODE node, int *inv_sigs, int *no_key, int *oth_err, - int *is_selfsig, int print_without_key) + int *is_selfsig, int print_without_key, int extended) { PKT_signature *sig = node->pkt->pkt.signature; int rc, sigrc; @@ -241,9 +243,10 @@ print_and_check_one_sig (KBNODE keyblock, KBNODE node, sig->flags.expired ? 'X' : ' ', (sig->trust_depth > 9) ? 'T' : (sig->trust_depth > 0) ? '0' + - sig->trust_depth : ' ', keystr (sig->keyid), + sig->trust_depth : ' ', + keystr (sig->keyid), datestr_from_sig (sig)); - if (opt.list_options & LIST_SHOW_SIG_EXPIRE) + if ((opt.list_options & LIST_SHOW_SIG_EXPIRE) || extended ) tty_printf (" %s", expirestr_from_sig (sig)); tty_printf (" "); if (sigrc == '%') @@ -253,6 +256,8 @@ print_and_check_one_sig (KBNODE keyblock, KBNODE node, else if (*is_selfsig) { tty_printf (is_rev ? _("[revocation]") : _("[self-signature]")); + if (extended && sig->flags.chosen_selfsig) + tty_printf ("*"); } else { @@ -267,17 +272,20 @@ print_and_check_one_sig (KBNODE keyblock, KBNODE node, } tty_printf ("\n"); - if (sig->flags.policy_url && (opt.list_options & LIST_SHOW_POLICY_URLS)) + if (sig->flags.policy_url + && ((opt.list_options & LIST_SHOW_POLICY_URLS) || extended)) show_policy_url (sig, 3, 0); - if (sig->flags.notation && (opt.list_options & LIST_SHOW_NOTATIONS)) + if (sig->flags.notation + && ((opt.list_options & LIST_SHOW_NOTATIONS) || extended)) show_notation (sig, 3, 0, ((opt. list_options & LIST_SHOW_STD_NOTATIONS) ? 1 : 0) + ((opt. list_options & LIST_SHOW_USER_NOTATIONS) ? 2 : 0)); - if (sig->flags.pref_ks && (opt.list_options & LIST_SHOW_KEYSERVER_URLS)) + if (sig->flags.pref_ks + && ((opt.list_options & LIST_SHOW_KEYSERVER_URLS) || extended)) show_keyserver_url (sig, 3, 0); } @@ -291,7 +299,7 @@ print_and_check_one_sig (KBNODE keyblock, KBNODE node, * Returns true if error found. */ static int -check_all_keysigs (KBNODE keyblock, int only_selected) +check_all_keysigs (KBNODE keyblock, int only_selected, int only_selfsigs) { KBNODE kbctx; KBNODE node; @@ -302,10 +310,16 @@ check_all_keysigs (KBNODE keyblock, int only_selected) int mis_selfsig = 0; int selected = !only_selected; int anyuid = 0; + u32 keyid[2]; for (kbctx = NULL; (node = walk_kbnode (keyblock, &kbctx, 0));) { - if (node->pkt->pkttype == PKT_USER_ID) + if (node->pkt->pkttype == PKT_PUBLIC_KEY) + { + if (only_selfsigs) + keyid_from_pk (node->pkt->pkt.public_key, keyid); + } + else if (node->pkt->pkttype == PKT_USER_ID) { PKT_user_id *uid = node->pkt->pkt.user_id; @@ -327,9 +341,14 @@ check_all_keysigs (KBNODE keyblock, int only_selected) || node->pkt->pkt.signature->sig_class == 0x30)) { int selfsig; - - if (print_and_check_one_sig (keyblock, node, &inv_sigs, - &no_key, &oth_err, &selfsig, 0)) + PKT_signature *sig = node->pkt->pkt.signature; + + if (only_selfsigs + && !(keyid[0] == sig->keyid[0] && keyid[1] == sig->keyid[1])) + ; /* Not a selfsig but we want only selfsigs - skip. */ + else if (print_and_check_one_sig (keyblock, node, &inv_sigs, + &no_key, &oth_err, &selfsig, + 0, only_selfsigs)) { if (selfsig) has_selfsig = 1; @@ -1679,7 +1698,8 @@ keyedit_menu (ctrl_t ctrl, const char *username, strlist_t locusr, break; case cmdCHECK: - check_all_keysigs (keyblock, count_selected_uids (keyblock)); + check_all_keysigs (keyblock, count_selected_uids (keyblock), + !strcmp (arg_string, "selfsig")); break; case cmdSIGN: @@ -3601,7 +3621,7 @@ menu_delsig (KBNODE pub_keyblock) else valid = print_and_check_one_sig (pub_keyblock, node, &inv_sig, &no_key, &other_err, - &selfsig, 1); + &selfsig, 1, 0); if (valid) { ----------------------------------------------------------------------- Summary of changes: doc/gpg.texi | 3 ++- g10/keyedit.c | 50 +++++++++++++++++++++++++++++++++++--------------- 2 files changed, 37 insertions(+), 16 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Thu Oct 1 18:02:47 2015 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Thu, 01 Oct 2015 18:02:47 +0200 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.8-57-g2acceba Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via 2acceba5cc299796c7b5b1851a9baeb75d9f32a1 (commit) via 2c60663a72f090573c4869e305b098b4b1fb23bd (commit) from 13a3f65968f4a8205ca664cc46b1a53de4dc489b (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 2acceba5cc299796c7b5b1851a9baeb75d9f32a1 Author: Werner Koch Date: Thu Oct 1 17:59:03 2015 +0200 gpg: Fix a practical hang after use of --faked-system-time. * g10/sign.c (update_keysig_packet): Bail out if we would need to long for a new timestamp. Signed-off-by: Werner Koch diff --git a/g10/packet.h b/g10/packet.h index 1906ec5..eb7da75 100644 --- a/g10/packet.h +++ b/g10/packet.h @@ -663,7 +663,7 @@ int make_keysig_packet( PKT_signature **ret_sig, PKT_public_key *pk, int (*mksubpkt)(PKT_signature *, void *), void *opaque, const char *cache_nonce); -int update_keysig_packet( PKT_signature **ret_sig, +gpg_error_t update_keysig_packet (PKT_signature **ret_sig, PKT_signature *orig_sig, PKT_public_key *pk, PKT_user_id *uid, diff --git a/g10/sign.c b/g10/sign.c index 4a30f1e..782b9fc 100644 --- a/g10/sign.c +++ b/g10/sign.c @@ -1477,7 +1477,7 @@ make_keysig_packet (PKT_signature **ret_sig, PKT_public_key *pk, * * TODO: Merge this with make_keysig_packet. */ -int +gpg_error_t update_keysig_packet( PKT_signature **ret_sig, PKT_signature *orig_sig, PKT_public_key *pk, @@ -1488,7 +1488,7 @@ update_keysig_packet( PKT_signature **ret_sig, void *opaque) { PKT_signature *sig; - int rc = 0; + gpg_error_t rc = 0; int digest_algo; gcry_md_hd_t md; @@ -1524,11 +1524,19 @@ update_keysig_packet( PKT_signature **ret_sig, /* ... but we won't make a timestamp earlier than the existing one. */ - while(sig->timestamp<=orig_sig->timestamp) - { - gnupg_sleep (1); - sig->timestamp=make_timestamp(); - } + { + int tmout = 0; + while(sig->timestamp<=orig_sig->timestamp) + { + if (++tmout > 5 && !opt.ignore_time_conflict) + { + rc = gpg_error (GPG_ERR_TIME_CONFLICT); + goto leave; + } + gnupg_sleep (1); + sig->timestamp=make_timestamp(); + } + } /* Note that already expired sigs will remain expired (with a duration of 1) since build-packet.c:build_sig_subpkt_from_sig @@ -1550,6 +1558,7 @@ update_keysig_packet( PKT_signature **ret_sig, rc = complete_sig (sig, pksk, md, NULL); } + leave: gcry_md_close (md); if( rc ) free_seckey_enc (sig); commit 2c60663a72f090573c4869e305b098b4b1fb23bd Author: Werner Koch Date: Thu Oct 1 17:57:39 2015 +0200 gpg: Print more info with "check selfsig". * g10/keyedit.c (print_and_check_one_sig): Print more Some sigsub packets. diff --git a/g10/keyedit.c b/g10/keyedit.c index 8d87a01..143c748 100644 --- a/g10/keyedit.c +++ b/g10/keyedit.c @@ -46,6 +46,7 @@ #include "i18n.h" #include "keyserver-internal.h" #include "call-agent.h" +#include "host2net.h" static void show_prefs (PKT_user_id * uid, PKT_signature * selfsig, int verbose); @@ -287,6 +288,22 @@ print_and_check_one_sig (KBNODE keyblock, KBNODE node, if (sig->flags.pref_ks && ((opt.list_options & LIST_SHOW_KEYSERVER_URLS) || extended)) show_keyserver_url (sig, 3, 0); + + if (extended) + { + PKT_public_key *pk = keyblock->pkt->pkt.public_key; + const unsigned char *s; + u32 expire; + + s = parse_sig_subpkt (sig->hashed, SIGSUBPKT_PRIMARY_UID, NULL); + if (s && *s) + tty_printf (" [primary]\n"); + + s = parse_sig_subpkt (sig->hashed, SIGSUBPKT_KEY_EXPIRE, NULL); + if (s && buf32_to_u32 (s)) + tty_printf (" [expires: %s]\n", + isotimestamp (pk->timestamp + buf32_to_u32 (s))); + } } return (sigrc == '!'); ----------------------------------------------------------------------- Summary of changes: g10/keyedit.c | 17 +++++++++++++++++ g10/packet.h | 2 +- g10/sign.c | 23 ++++++++++++++++------- 3 files changed, 34 insertions(+), 8 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Thu Oct 1 18:24:03 2015 From: cvs at cvs.gnupg.org (by Andre Heinecke) Date: Thu, 01 Oct 2015 18:24:03 +0200 Subject: [git] GpgOL - branch, mime-addin, updated. gpgol-1.2.0-36-g9036bb3 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GnuPG extension for MS Outlook". The branch, mime-addin has been updated via 9036bb3fe96742b6e4f46581d86ca8bf59c6a9a5 (commit) from fdbeb6fbb026b750bc36bfb97c52697e645bd0e1 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 9036bb3fe96742b6e4f46581d86ca8bf59c6a9a5 Author: Andre Heinecke Date: Thu Oct 1 17:56:56 2015 +0200 Change ribbon UI for mime functionality. * gpgoladdin.cpp (GetIDsOfNames): Add ID's for mime actions. (Invoke): Handle new actions. (GetCustomUI): Remove most of the Ribbon UI only leave encrypt / sign / start certificate manager buttons. * src/mailitem-events.cpp (sign_encrypt_item): Renamed to do_crypto_on_item. (do_crypto_on_item): Do crypto according to draft flags. (needs_crypto): New. Check if the mailitem needs crypto at all. (Invoke): Pass send when no crypto action is selected. * src/mapihelp.cpp (get_gpgol_draft_info_flags), (set_gpgol_draft_info_flags): New helpers to work with draft info. * src/mapihelp.h: Declare above functions. * src/ribbon-callbacks.cpp (message_flag_status): Show a messagebox to inform about crypto actions. (mark_mime_action): New. Set the draft_info_flags. (mime_sign, mime_encrypt): New. Callback functions for outlook. diff --git a/src/gpgoladdin.cpp b/src/gpgoladdin.cpp index 6f189c7..c7da01d 100644 --- a/src/gpgoladdin.cpp +++ b/src/gpgoladdin.cpp @@ -464,6 +464,10 @@ GpgolRibbonExtender::GetIDsOfNames (REFIID riid, LPOLESTR *rgszNames, ID_MAPPER (L"addEncAttachment", ID_CMD_ATT_ENC_FILE) ID_MAPPER (L"signBody", ID_CMD_SIGN_BODY) ID_MAPPER (L"verifyBody", ID_CMD_VERIFY_BODY) + + /* MIME support: */ + ID_MAPPER (L"encryptMime", ID_CMD_MIME_ENCRYPT) + ID_MAPPER (L"signMime", ID_CMD_MIME_SIGN) } if (cNames > 1) @@ -513,6 +517,10 @@ GpgolRibbonExtender::Invoke (DISPID dispid, REFIID riid, LCID lcid, return signBody (parms->rgvarg[0].pdispVal); case ID_CMD_VERIFY_BODY: return verifyBody (parms->rgvarg[0].pdispVal); + case ID_CMD_MIME_SIGN: + return mime_sign (parms->rgvarg[0].pdispVal); + case ID_CMD_MIME_ENCRYPT: + return mime_encrypt (parms->rgvarg[0].pdispVal); case ID_BTN_CERTMANAGER: case ID_BTN_ENCRYPT: case ID_BTN_DECRYPT: @@ -529,7 +537,6 @@ GpgolRibbonExtender::Invoke (DISPID dispid, REFIID riid, LCID lcid, return DISP_E_MEMBERNOTFOUND; } - /* Returns the XML markup for the various RibbonID's The custom ui syntax is documented at: @@ -541,289 +548,81 @@ GpgolRibbonExtender::Invoke (DISPID dispid, REFIID riid, LCID lcid, STDMETHODIMP GpgolRibbonExtender::GetCustomUI (BSTR RibbonID, BSTR * RibbonXml) { - wchar_t buffer[8192]; + char * buffer = NULL; + const char *certManagerTTip = _("Start the Certificate Management Software"); const char *certManagerSTip = _("Open GPA or Kleopatra to manage your certificates. " "You can use this you to generate your " "own certificates. "); - const char *encryptTextTTip = - _("Encrypt the text of the message"); - const char *encryptTextSTip = - _("Choose the certificates for which the message " - "should be encrypted and replace the text " - "with the encrypted message."); - const char *encryptFileTTip = - _("Add a file as an encrypted attachment"); - const char *encryptFileSTip = - _("Encrypts a file and adds it as an attachment to the " - "message. "); - const char *encryptSignFileTTip = - _("Add a file as an encrypted attachment with a signature"); - const char *encryptSignFileSTip = - _("Encrypts a file, signs it and adds both the encrypted file " - "and the signature as attachments to the message. "); - const char *decryptTextTTip= - _("Decrypt the message"); - const char *decryptTextSTip = - _("Look for PGP or S/MIME encrypted data in the message text " - "and decrypt it."); - const char *signTextTTip = - _("Add a signature of the message"); - const char *signTextSTip = - _("Appends a signed copy of the message text in an opaque signature. " - "An opaque signature ensures that the signed text is not modified by " - "embedding it in the signature itself. " - "The combination of the signed message text and your signature is " - "added below the plain text. " - "The message will not be encrypted!"); - - memset(buffer, 0, sizeof buffer); + const char *encryptTTip = + _("Encrypt the message."); + const char *encryptSTip = + _("Encrypts the message and all attachments before sending."); + const char *signTTip = + _("Sign the message."); + const char *signSTip = + _("Sign the message and all attchments before sending."); log_debug ("%s:%s: GetCustomUI for id: %ls", SRCNAME, __func__, RibbonID); - if (!RibbonXml) + if (!RibbonXml || !RibbonID) return E_POINTER; if (!wcscmp (RibbonID, L"Microsoft.Outlook.Mail.Compose")) { - swprintf (buffer, - L"" - L" " - L" " - L" " - L" " - L"