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