Add minimalistic protected-headers support
[gpgol.git] / src / addin-options.cpp
1 /* addin-options.cpp - Options for the Ol >= 2010 Addin
2  * Copyright (C) 2015 by Bundesamt für Sicherheit in der Informationstechnik
3  * Software engineering by Intevation GmbH
4  *
5  * This file is part of GpgOL.
6  *
7  * GpgOL is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * GpgOL is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public License
18  * along with this program; if not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #ifdef HAVE_CONFIG_H
22 #include "config.h"
23 #endif
24
25 #include <windows.h>
26 #include "dialogs.h"
27 #include "common.h"
28 #include "cpphelp.h"
29 #include "oomhelp.h"
30
31 #include <string>
32
33 #include <gpgme++/context.h>
34 #include <gpgme++/data.h>
35
36
37 __attribute__((__unused__)) static char const *
38 i18n_noops[] = {
39     N_("GnuPG System"),
40     N_("Enable the S/MIME support"),
41     N_("Configure GpgOL"),
42     N_("Automation"),
43     N_("General"),
44     N_("(Technical)"),
45
46     N_("Automatically secure &messages"),
47     N_("Configure GnuPG"),
48     N_("Debug..."),
49     N_("Version "),
50     N_("&Resolve recipient keys automatically"),
51     N_("&Encrypt new messages by default"),
52     N_("&Sign new messages by default"),
53     N_("&Send OpenPGP mails without "
54        "attachments as PGP/Inline"),
55     N_("S&elect crypto settings automatically "
56        "for reply and forward"),
57     N_("&Prefer S/MIME"),
58
59     /* Tooltips */
60     N_("Enable or disable any automated key handling."),
61     N_("Automate trust based on communication history."),
62     N_("This changes the trust model to \"tofu+pgp\" which tracks the history of key usage. Automated trust can <b>never</b> exceed level 2."),
63     N_("experimental"),
64     N_("Automatically toggles secure if keys with at least level 1 trust were found for all recipients."),
65     N_("Toggles the encrypt option for all new mails."),
66     N_("Toggles the sign option for all new mails."),
67     N_("Toggles sign, encrypt options if the original mail was signed or encrypted."),
68     N_("Instead of using the PGP/MIME format, "
69        "which properly handles attachments and encoding, "
70        "the deprecated PGP/Inline is used.\n"
71        "This can be required for compatibility but should generally not "
72        "be used."),
73     N_("Prefer S/MIME over OpenPGP if both are possible."),
74
75     /* TRANSLATORS: Part of the config dialog. */
76     N_("Search and import &X509 certificates in the configured directory services"),
77     /* TRANSLATORS: Part of the config dialog. Tooltip */
78     N_("Searches for X509 certificates automatically and imports them. This option searches in all configured services."),
79     /* TRANSLATORS: Part of the config dialog. Warning about privacy leak. */
80     N_("<b>Warning:</b> The configured services will receive information about whom you send Emails!"),
81     /* TRANSLATORS: Part of the config dialog. */
82     N_("Also automatically toggles secure if keys with level 0 trust were found."),
83     /* TRANSLATORS: Part of the config dialog. */
84     N_("Also &with untrusted keys"),
85     /* TRANSLATORS: Included means here both attached keys and keys from the
86      * headers */
87     N_("&Import any keys included in mails"),
88     /* TRANSLATORS: Included means here both attached keys and keys from the
89      * headers */
90     N_("Import OpenPGP keys from mail attachments or from mail headers."),
91
92     /* Not options but strings for the key adder */
93     /* TRANSLATORS: Part of address book key configuration dialog.
94        The contacts name follows. */
95     N_("Configure key for:"),
96     /* TRANSLATORS: Part of address book key configuration dialog.
97        An example for a public key follows. */
98     N_("Paste a public key export here. It should look like:"),
99     /* TRANSLATORS: Part of address book key configuration dialog. */
100     N_("Failed to parse any public key."),
101     /* TRANSLATORS: Part of address book key configuration dialog. */
102     N_("Error"),
103     /* TRANSLATORS: Part of address book key configuration dialog. */
104     N_("Secret key detected."),
105     /* TRANSLATORS: Part of address book key configuration dialog. */
106     N_("You can only configure public keys in Outlook."
107        " Import secret keys with Kleopatra."),
108     /* TRANSLATORS: Part of address book key configuration dialog. */
109     N_("The key is unusable for Outlook."
110        " Please check Kleopatra for more information."),
111     /* TRANSLATORS: Part of address book key configuration dialog. */
112     N_("Invalid key detected."),
113     /* TRANSLATORS: Part of address book key configuration dialog. */
114     N_("Created:"),
115     /* TRANSLATORS: Part of address book key configuration dialog. */
116     N_("User Ids:"),
117     /* TRANSLATORS: Part of address book key configuration dialog. %1 is
118         a placeholder for the plual for key / keys. */
119     N_("You are about to configure the following %1 for:"),
120     /* TRANSLATORS: Part of address book key configuration dialog.
121        used in a sentence as plural form. */
122     N_("keys"),
123     /* TRANSLATORS: Part of address book key configuration dialog.
124        used in a sentence as singular form. */
125     N_("key"),
126     /* TRANSLATORS: Part of address book key configuration dialog. */
127     N_("Continue?"),
128     /* TRANSLATORS: Part of address book key configuration dialog. */
129     N_("Confirm keys"),
130     /* TRANSLATORS: Part of debugging configuration. */
131     N_("Enable Logging"),
132     N_("Default"),
133     /* TRANSLATORS: Part of debugging configuration.  The plus should
134     mean in the combo box that it is added to the above. */
135     N_("+Outlook API calls"),
136     /* TRANSLATORS: Part of debugging configuration.  The plus should
137     mean in the combo box that it is added to the above. */
138     N_("+Memory analysis"),
139     /* TRANSLATORS: Part of debugging configuration.  The plus should
140     mean in the combo box that it is added to the above. */
141     N_("+Call tracing"),
142     /* TRANSLATORS: Part of debugging configuration. */
143     N_("Log File (required):"),
144     /* TRANSLATORS: Part of debugging configuration.  This is a checkbox
145     to select if even potentially private data should be included in the
146     debug log. */
147     N_("Include Mail contents (decrypted!) and meta information."),
148     /* TRANSLATORS: Dialog title for the log file selection */
149     N_("Select log file"),
150     /* TRANSLATORS: Part of debugging configuration. */
151     N_("Log level:"),
152     /* TRANSLATORS: Part of debugging configuration. Warning shown
153        in case the highest log level is selected. Please try to
154        keep the string ~ the size of the english version as the
155        warning is shown in line with the combo box to select the
156        level. */
157     N_("<b>Warning:</b> Decreased performance. Huge logs!"),
158     /* TRANSLATORS: Config dialog category for debug options. */
159     N_("Debug"),
160     /* TRANSLATORS: Config dialog category for debug options. */
161     N_("Configuaration of debug options"),
162     /* TRANSLATORS: Config dialog debug page, can be technical. */
163     N_("Potential workarounds"),
164     /* TRANSLATORS: Config dialog debug page, can be technical. */
165     N_("Block Outlook during encrypt / sign"),
166     /* TRANSLATORS: Config dialog debug page, can be technical. */
167     N_("Block Outlook during decrypt / verify"),
168     /* TRANSLATORS: Config dialog debug page, link to report bug page. */
169     N_("How to report a problem?"),
170 };
171
172
173 static bool dlg_open;
174
175 static DWORD WINAPI
176 open_gpgolconfig (LPVOID arg)
177 {
178   HWND wnd = (HWND) arg;
179
180   std::vector<std::string> args;
181
182   // Collect the arguments
183   char *gpg4win_dir = get_gpg4win_dir ();
184   if (!gpg4win_dir)
185     {
186       TRACEPOINT;
187       return -1;
188     }
189   const auto gpgolconfig = std::string (gpg4win_dir) + "\\bin\\gpgolconfig.exe";
190   args.push_back (gpgolconfig);
191
192   args.push_back (std::string ("--hwnd"));
193   args.push_back (std::to_string ((int) (intptr_t) wnd));
194
195   args.push_back (std::string("--gpgol-version"));
196   args.push_back (std::string(VERSION));
197
198   args.push_back (std::string ("--lang"));
199   args.push_back (std::string (gettext_localename ()));
200
201   auto ctx = GpgME::Context::createForEngine (GpgME::SpawnEngine);
202   if (!ctx)
203     {
204       // can't happen
205       TRACEPOINT;
206       return -1;
207     }
208
209   GpgME::Data mystdin (GpgME::Data::null), mystdout, mystderr;
210   dlg_open = true;
211
212   char **cargs = vector_to_cArray (args);
213   log_debug ("%s:%s: args:", SRCNAME, __func__);
214   for (size_t i = 0; cargs && cargs[i]; i++)
215     {
216       log_debug (SIZE_T_FORMAT ": '%s'", i, cargs[i]);
217     }
218
219   GpgME::Error err = ctx->spawn (cargs[0], const_cast <const char**> (cargs),
220                                  mystdin, mystdout, mystderr,
221                                  (GpgME::Context::SpawnFlags) (
222                                   GpgME::Context::SpawnAllowSetFg |
223                                   GpgME::Context::SpawnShowWindow));
224   release_cArray (cargs);
225   if (err)
226     {
227       log_error ("%s:%s: Err code: %i asString: %s",
228                  SRCNAME, __func__, err.code(), err.asString());
229     }
230   dlg_open = false;
231
232   log_debug ("%s:%s:finished stdout:\n'%s'",
233              SRCNAME, __func__, mystdout.toString ().c_str ());
234   log_debug ("%s:%s:stderr:\n'%s'",
235              SRCNAME, __func__, mystderr.toString ().c_str ());
236   read_options ();
237   return 0;
238 }
239
240 void
241 options_dialog_box (HWND parent)
242 {
243   if (!parent)
244     parent = get_active_hwnd ();
245
246   if (dlg_open)
247     {
248       log_debug ("%s:%s: Gpgolconfig open. Not launching new dialog.",
249                  SRCNAME, __func__);
250       HWND optWindow = FindWindow (nullptr, _("Configure GpgOL"));
251       if (!optWindow) {
252         log_debug ("%s:%s: Gpgolconfig open but could not find window.",
253                  SRCNAME, __func__);
254         return;
255       }
256       SetForegroundWindow(optWindow);
257
258       return;
259     }
260
261   log_debug ("%s:%s: Launching gpgolconfig.",
262              SRCNAME, __func__);
263
264   CloseHandle (CreateThread (NULL, 0, open_gpgolconfig, (LPVOID) parent, 0,
265                              NULL));
266 }