ea003b9d9e09699af487e1a99519078bebd39475
[gpgol.git] / src / common.h
1 /* common.h - Common declarations for GpgOL
2  *      Copyright (C) 2004 Timo Schulz
3  *      Copyright (C) 2005, 2006, 2007, 2008 g10 Code 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 License
9  * as published by the Free Software Foundation; either version 2.1
10  * 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 GNU
15  * 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 #ifndef GPGOL_COMMON_H
22 #define GPGOL_COMMON_H
23
24 #include <gpgme.h>
25
26 #include "util.h"
27
28
29 #ifdef __cplusplus
30 extern "C" {
31 #if 0
32 }
33 #endif
34 #endif
35
36 /* The Registry key used by GnuPg and closley related software.  */
37 #ifndef NEW_STYLE_REG_KEYS /* Gpg4win 3 changed the key */
38 # ifdef WIN64
39 #  define GNUPG_REGKEY  "Software\\Wow6432Node\\GNU\\GnuPG"
40 # else
41 #  define GNUPG_REGKEY  "Software\\GNU\\GnuPG"
42 # endif
43 # else
44 # ifdef WIN64
45 #  define GNUPG_REGKEY  "Software\\Wow6432Node\\Gpg4win"
46 # else
47 #  define GNUPG_REGKEY  "Software\\Gpg4win"
48 # endif
49 #endif
50 /* Identifiers for the protocol.  We use different one than those use
51    by gpgme.  FIXME: We might want to define an unknown protocol to
52    non-null and define such a value also in gpgme. */
53 typedef enum
54   {
55     PROTOCOL_UNKNOWN = 0,
56     PROTOCOL_OPENPGP = 1000,
57     PROTOCOL_SMIME   = 1001
58   }
59 protocol_t;
60
61
62 /* Possible options for the recipient dialog. */
63 enum
64   {
65     OPT_FLAG_TEXT     =  2,
66     OPT_FLAG_FORCE    =  4,
67     OPT_FLAG_CANCEL   =  8
68   };
69
70
71 typedef enum
72   {
73     GPG_FMT_NONE = 0,       /* do not encrypt attachments */
74     GPG_FMT_CLASSIC = 1,    /* encrypt attachments without any encoding */
75     GPG_FMT_PGP_PEF = 2     /* use the PGP partioned encoding format (PEF) */
76   }
77 gpgol_format_t;
78
79 /* Type of a message. */
80 typedef enum
81   {
82     OPENPGP_NONE = 0,
83     OPENPGP_MSG,
84     OPENPGP_SIG,
85     OPENPGP_CLEARSIG,
86     OPENPGP_PUBKEY,   /* Note, that this type is only partly supported */
87     OPENPGP_SECKEY    /* Note, that this type is only partly supported */
88   }
89 openpgp_t;
90
91
92 extern HINSTANCE glob_hinst;
93 extern UINT      this_dll;
94
95
96 /* Passphrase callback structure. */
97 struct passphrase_cb_s
98 {
99   gpgme_key_t signer;
100   gpgme_ctx_t ctx;
101   char keyid[16+1];
102   char *user_id;
103   char *pass;
104   int opts;
105   int ttl;  /* TTL of the passphrase. */
106   unsigned int decrypt_cmd:1; /* 1 = show decrypt dialog, otherwise secret key
107                                  selection. */
108   unsigned int hide_pwd:1;
109   unsigned int last_was_bad:1;
110 };
111
112 /* Global options - initialized to default by main.c. */
113 #ifdef __cplusplus
114 extern
115 #endif
116 struct
117 {
118   int enable_debug;          /* Enable extra debug options.  Values
119                                 larger than 1 increases the debug log
120                                 verbosity.  */
121   int enable_smime;          /* Enable S/MIME support. */
122   int passwd_ttl;            /* Time in seconds the passphrase is stored. */
123   protocol_t default_protocol;/* The default protocol. */
124   int encrypt_default;       /* Encrypt by default. */
125   int sign_default;          /* Sign by default. */
126   int enc_format;            /* Encryption format for attachments. */
127   char *default_key;         /* The key we want to always encrypt to. */
128   int enable_default_key;    /* Enable the use of DEFAULT_KEY. */
129   int preview_decrypt;       /* Decrypt in preview window. */
130   int prefer_html;           /* Prefer html in html/text alternatives. */
131   int body_as_attachment;    /* Present encrypted message as attachment.  */
132
133   /* The compatibility flags. */
134   struct
135   {
136     unsigned int no_msgcache:1;
137     unsigned int no_pgpmime:1;
138     unsigned int no_oom_write:1; /* Don't write using Outlooks object model. */
139     unsigned int no_preview_info:1; /* No preview info about PGP/MIME. */
140     unsigned int old_reply_hack: 1; /* See gpgmsg.cpp:decrypt. */
141     unsigned int auto_decrypt: 1;   /* Try to decrypt when clicked. */
142     unsigned int no_attestation: 1; /* Don't create an attestation. */
143     unsigned int use_mwfmo: 1;      /* Use MsgWaitForMultipleObjects.  */
144   } compat;
145
146   /* The current git commit id.  */
147   unsigned int git_commit;
148
149   /* The forms revision number of the binary.  */
150   int forms_revision;
151
152   /* The stored number of the binary which showed the last announcement.  */
153   int announce_number;
154
155   /* Disable message processing until restart.  This is required to
156      implement message reverting as a perparation to remove GpgOL.  */
157   int disable_gpgol;
158
159 } opt;
160
161
162 /* The state object used by b64_decode.  */
163 struct b64_state_s
164 {
165   int idx;
166   unsigned char val;
167   int stop_seen;
168   int invalid_encoding;
169 };
170 typedef struct b64_state_s b64_state_t;
171
172 /* Bit values used for extra log file verbosity.  Value 1 is reserved
173    to enable debug menu options.  */
174 #define DBG_IOWORKER       (1<<1)
175 #define DBG_IOWORKER_EXTRA (1<<2)
176 #define DBG_FILTER         (1<<3)
177 #define DBG_FILTER_EXTRA   (1<<4)
178 #define DBG_MEMORY         (1<<5)
179 #define DBG_COMMANDS       (1<<6)
180 #define DBG_MIME_PARSER    (1<<7)
181 #define DBG_MIME_DATA      (1<<8)
182 #define DBG_OOM            (1<<9)
183 #define DBG_OOM_EXTRA      (1<<10)
184
185 /* Macros to used in conditionals to enable debug output.  */
186 #define debug_commands    (opt.enable_debug & DBG_COMMANDS)
187
188 /*-- common.c --*/
189 void set_global_hinstance (HINSTANCE hinst);
190 void center_window (HWND childwnd, HWND style);
191 HBITMAP get_system_check_bitmap (int checked);
192 char *get_save_filename (HWND root, const char *srcname);
193 char *get_open_filename (HWND root, const char *title);
194 char *utf8_to_wincp (const char *string);
195
196 const char *default_homedir (void);
197 char *get_data_dir (void);
198
199 size_t qp_decode (char *buffer, size_t length, int *r_slbrk);
200 void b64_init (b64_state_t *state);
201 size_t b64_decode (b64_state_t *state, char *buffer, size_t length);
202 char * b64_encode (const char *input, size_t length);
203
204 /* Get a temporary filename with and its name */
205 wchar_t *get_tmp_outfile (wchar_t *name, HANDLE *outHandle);
206
207 wchar_t *get_pretty_attachment_name (wchar_t *path, protocol_t protocol,
208                                      int signature);
209
210 /* The length of the boundary - the buffer needs to be allocated one
211    byte larger. */
212 #define BOUNDARYSIZE 20
213 char *generate_boundary (char *buffer);
214
215 /*-- recipient-dialog.c --*/
216 unsigned int recipient_dialog_box (gpgme_key_t **ret_rset);
217 unsigned int recipient_dialog_box2 (gpgme_key_t *fnd, char **unknown,
218                                     gpgme_key_t **ret_rset);
219
220 /*-- passphrase-dialog.c --*/
221 int signer_dialog_box (gpgme_key_t *r_key, char **r_passwd, int encrypting);
222 gpgme_error_t passphrase_callback_box (void *opaque, const char *uid_hint,
223                              const char *pass_info,
224                              int prev_was_bad, int fd);
225 void free_decrypt_key (struct passphrase_cb_s *ctx);
226 const char *get_pubkey_algo_str (gpgme_pubkey_algo_t id);
227
228 /*-- config-dialog.c --*/
229 void config_dialog_box (HWND parent);
230 int store_extension_value (const char *key, const char *val);
231 int load_extension_value (const char *key, char **val);
232
233 /*-- verify-dialog.c --*/
234 int verify_dialog_box (gpgme_protocol_t protocol,
235                        gpgme_verify_result_t res,
236                        const char *filename);
237
238
239 /*-- inspectors.cpp --*/
240 int initialize_inspectors (void);
241
242
243 #ifdef __cplusplus
244 }
245 #endif
246 #endif /*GPGOL_COMMON_H*/