/[winpt]/trunk/Src/wptRegistry.cpp
ViewVC logotype

Contents of /trunk/Src/wptRegistry.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 13 - (show annotations)
Mon Apr 25 07:15:30 2005 UTC (19 years, 10 months ago) by twoaday
File size: 17102 byte(s)
Commit bug fixes. Release 0.9.92.

1 /* wptRegistry.cpp - W32 Registry access
2 * Copyright (C) 2000-2005 Timo Schulz
3 *
4 * This file is part of WinPT.
5 *
6 * WinPT is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 *
11 * WinPT is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with WinPT; if not, write to the Free Software Foundation,
18 * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 */
20
21 #include <windows.h>
22 #include <stdio.h>
23
24 #include "wptErrors.h"
25 #include "wptW32API.h"
26 #include "wptGPG.h"
27 #include "wptRegistry.h"
28 #include "wptKeyserver.h"
29 #include "wptTypes.h"
30 #include "wptNLS.h"
31 #include "wptVersion.h"
32
33 #define rc_ok(rc) ((rc) == ERROR_SUCCESS)
34
35 struct reg_hotkey_s reg_hotkeys[] = {
36 {"ClipEncrypt", NULL, 0},
37 {"ClipDecrypt", NULL, 0},
38 {"ClipSign", NULL, 0},
39 {"ClipSignEnc", NULL, 0},
40 {"CwsEncrypt", NULL, 0},
41 {"CwsDecrypt", NULL, 0},
42 {"CwsSign", NULL, 0},
43 {"CwsSignEnc", NULL, 0},
44 {0}
45 };
46
47 winpt_reg_prefs_s reg_prefs;
48
49 #define WINPT_REG "Software\\WinPT"
50
51
52 void
53 free_reg_prefs (void)
54 {
55 free_if_alloc (reg_prefs.backup.path);
56 free_if_alloc (reg_prefs.kserv_conf);
57 free_if_alloc (reg_prefs.homedir);
58 memset (&reg_prefs, 0, sizeof reg_prefs);
59 } /* free_reg_prefs */
60
61
62 /*
63 * Register the given WinPT filetype.
64 */
65 static int
66 regist_single_filetype (gpg_filetype *gfile)
67 {
68 char icon[256], prog[256];
69
70 memset (&icon, 0, sizeof (icon));
71 GetModuleFileName (glob_hinst, prog, sizeof (prog)-1);
72 _snprintf (icon, sizeof (icon) -1, "%s,%d", prog, gfile->nicon);
73 return create_file_type (prog, gfile->ext, gfile->descr, icon);
74 } /* regist_single_filetype */
75
76
77 /*
78 * Install the GPG related into the W32 resgistry, if the entry already
79 * exists< the function returns immediately.
80 */
81 int
82 regist_inst_gnupg (int create_mokey)
83 {
84 int rc;
85 HKEY reg;
86
87 rc = RegOpenKeyEx( HKEY_CURRENT_USER, "Software\\GNU\\GnuPG", 0, KEY_READ, &reg );
88 if( rc_ok( rc ) ) {
89 RegCloseKey( reg );
90 return 0;
91 }
92 rc = RegCreateKey( HKEY_CURRENT_USER, "Software\\GNU\\GnuPG", &reg );
93 if( !rc_ok( rc ) )
94 return WPTERR_REGISTRY;
95 RegCloseKey( reg );
96 if( create_mokey ) {
97 rc = RegOpenKeyEx( HKEY_CURRENT_USER, "Control Panel\\MingW32\\NLS", 0, KEY_READ, &reg );
98 if( rc_ok( rc ) ) {
99 RegCloseKey( reg );
100 return 0;
101 }
102 rc = RegCreateKey( HKEY_CURRENT_USER, "Control Panel\\MingW32\\NLS", &reg );
103 if( !rc_ok( rc ) )
104 return WPTERR_REGISTRY;
105 RegCloseKey( reg );
106 }
107
108 return 0;
109 } /* regist_inst_gpg */
110
111
112 /*
113 * Install WinPT into the W32 registry, if the entry already
114 * exists the function returns immediately.
115 */
116 int
117 regist_inst_winpt (int with_ext, int * created)
118 {
119 HKEY reg;
120 char * p = NULL;
121 int rc, i, id, n = 0;
122
123 if( created )
124 *created = 0;
125
126 p = get_reg_entry (HKEY_CURRENT_USER, WINPT_REG, "Extensions");
127 if (p && *p == '1')
128 with_ext = 0;
129 free_if_alloc( p );
130
131 if( with_ext ) {
132 id = msg_box( NULL, _("WinPT can register some GPG file types for you so they can "
133 "be processed with a double click in the explorer.\n"
134 "Do you want to continue?"), _("WinPT"), MB_YESNO|MB_INFO );
135 if( id == IDNO ) {
136 set_reg_entry( HKEY_CURRENT_USER, WINPT_REG, "Extensions", "1" );
137 goto start;
138 }
139 for( i = 0; gpg_filetypes[i].ext; i++ ) {
140 rc = RegOpenKeyEx( HKEY_CLASSES_ROOT, gpg_filetypes[i].ext, 0, KEY_READ, &reg );
141 if( rc_ok( rc ) ) {
142 RegCloseKey( reg );
143 id = log_box( _("WinPT WARNING"), MB_YESNO|MB_INFO,
144 _("It seems there was already a '%s' file type registered by another application.\n"
145 "Do you want to overwrite it?"), gpg_filetypes[i].ext );
146 if( id == IDNO )
147 continue;
148 }
149 regist_single_filetype( &gpg_filetypes[i] );
150 n++;
151 }
152 }
153
154 start:
155 rc = RegOpenKeyEx( HKEY_CURRENT_USER, WINPT_REG, 0, KEY_READ, &reg );
156 if( rc_ok( rc ) ) {
157 RegCloseKey( reg );
158 rc = RegOpenKeyEx( HKEY_CURRENT_USER, WINPT_REG"\\Keyserver", 0, KEY_READ, &reg );
159 if( !rc_ok( rc ) ) {
160 RegCreateKey( HKEY_CURRENT_USER, WINPT_REG"\\Keyserver", &reg );
161 RegCloseKey( reg );
162 }
163 p = get_reg_entry_keyserver ("Default");
164 if (!p) {
165 char buf[16];
166 sprintf (buf, "%d", HKP_PORT);
167 set_reg_entry_keyserver ("Default_Port", buf);
168 set_reg_entry_keyserver ("Default", DEF_HKP_KEYSERVER);
169 }
170 free_if_alloc( p );
171 if( n )
172 set_reg_entry( HKEY_CURRENT_USER, WINPT_REG, "Extensions", "1" );
173 return 0;
174 }
175 rc = RegCreateKey( HKEY_CURRENT_USER, WINPT_REG, &reg );
176 if( !rc_ok( rc ) )
177 return WPTERR_REGISTRY;
178 if( created )
179 *created = 1;
180 RegCloseKey( reg );
181 if( n )
182 set_reg_entry( HKEY_CURRENT_USER, WINPT_REG, "Extensions", "1" );
183 return 0;
184 } /* regist_inst_winpt */
185
186
187 /*
188 * Create a new filetype in the W32 registry.
189 * We should really care of errors! Otherwise we can damage the registry!
190 */
191 int
192 create_file_type( const char *exefile, const char *ext, const char *extname, char *iconfile )
193 {
194 int rc;
195 HKEY reg = NULL;
196 char deficon[256], defexec[256], p_exefile[256];
197
198
199 rc = RegCreateKey( HKEY_CLASSES_ROOT, ext, &reg );
200 if( rc_ok( rc ) )
201 rc = RegSetValueEx( reg, NULL, 0, REG_SZ, (byte *)extname, strlen( extname ) );
202 if( rc_ok( rc ) )
203 rc = RegCloseKey( reg );
204 if( rc_ok( rc ) )
205 rc = RegCreateKey( HKEY_CLASSES_ROOT, extname, &reg );
206 if( rc_ok( rc ) )
207 rc = RegSetValueEx( reg, NULL, 0, REG_SZ, (byte *) extname, strlen( extname ) );
208 if( rc_ok( rc ) )
209 rc = RegCloseKey( reg );
210 if( !rc_ok( rc ) ) {
211 rc = WPTERR_REGISTRY;
212 goto leave;
213 }
214
215 memset( &deficon, 0, sizeof deficon );
216 _snprintf( deficon, sizeof deficon - 1, "%s\\DefaultIcon", extname );
217 memset( &defexec, 0, sizeof defexec );
218 _snprintf( defexec, sizeof defexec - 1, "%s\\shell\\open\\command", extname );
219 memset( &p_exefile, 0, sizeof p_exefile );
220 _snprintf( p_exefile, sizeof p_exefile - 1, "%s %%1", exefile );
221
222 rc = RegCreateKey( HKEY_CLASSES_ROOT, deficon, &reg );
223 if( rc_ok( rc ) )
224 rc = RegSetValueEx(reg, NULL, 0, REG_SZ, (byte *)iconfile, strlen( iconfile ) );
225 if( rc_ok( rc ) )
226 rc = RegCloseKey( reg );
227 if( rc_ok( rc ) )
228 rc = RegCreateKey( HKEY_CLASSES_ROOT, defexec, &reg );
229 if( rc_ok( rc ) )
230 rc = RegSetValueEx( reg, NULL, 0, REG_SZ, (byte *)p_exefile, strlen( exefile ) );
231 if( rc_ok( rc ) )
232 rc = RegCloseKey( reg );
233 if( !rc_ok( rc ) ) {
234 rc = WPTERR_REGISTRY;
235 goto leave;
236 }
237
238 leave:
239 if( reg )
240 RegCloseKey( reg );
241 return rc;
242 } /* create_file_type */
243
244
245 static char *
246 expand_path( const char *path )
247 {
248 DWORD len;
249 char *p;
250
251 len = ExpandEnvironmentStrings( path, NULL, 0 );
252 if( !len )
253 return NULL;
254 len += 1;
255 p = new char[len];
256 if( !p )
257 return NULL;
258 len = ExpandEnvironmentStrings( path, p, len );
259 if( !len ) {
260 free_if_alloc( p );
261 return NULL;
262 }
263 return p;
264 } /* expand_path */
265
266
267 char *
268 get_reg_entry (HKEY root_key, const char * dir, const char * key)
269 {
270 int rc;
271 char text[384] = {0};
272 DWORD nbytes, type, n1 = 0;
273 HKEY reg_key = NULL;
274 char * p = NULL, * tmp = NULL;
275
276 rc = RegOpenKeyEx (root_key, dir, 0, KEY_QUERY_VALUE, &reg_key);
277 if( !rc_ok( rc ) )
278 goto leave;
279 nbytes = sizeof text - 1;
280 type = REG_SZ;
281
282 rc = RegQueryValueEx (reg_key, key, 0, &type, (BYTE *)&text, &nbytes);
283 if (!rc_ok (rc) || !nbytes)
284 goto leave;
285
286 if (type == REG_EXPAND_SZ && strchr (text, '%'))
287 p = expand_path (text);
288 else {
289 p = new char[nbytes + 1];
290 if (!p)
291 BUG (0);
292 memcpy (p, text, nbytes);
293 p[nbytes] = '\0';
294 }
295
296 leave:
297 if (reg_key)
298 RegCloseKey (reg_key);
299 return p;
300 } /* get_reg_entry */
301
302
303 int
304 set_reg_entry( HKEY root_key, const char * dir, const char * key,
305 const char * value )
306 {
307 int rc = 0;
308 HKEY reg_key;
309
310 rc = RegOpenKeyEx( root_key, dir, 0, KEY_WRITE, &reg_key );
311 if( !rc_ok( rc ) )
312 return WPTERR_REGISTRY;
313 rc = RegSetValueEx( reg_key, key, 0, REG_SZ, (BYTE *)value, strlen( value ) );
314 if( !rc_ok( rc ) )
315 rc = WPTERR_REGISTRY;
316 RegCloseKey( reg_key );
317 return rc;
318 } /* set_reg_entry */
319
320
321 int
322 set_reg_key( HKEY root_key, const char * dir, const char * key,
323 const char * value )
324 {
325 int rc = 0;
326 HKEY reg_key;
327
328 rc = RegOpenKeyEx( root_key, dir, 0, KEY_WRITE, &reg_key );
329 if( !rc_ok( rc ) )
330 return WPTERR_REGISTRY;
331
332 rc = RegSetValueEx( reg_key, key, 0, REG_SZ, (BYTE *)value, strlen( value ) );
333 if( !rc_ok( rc ) ) {
334 if ( RegCreateKey( root_key, key, &reg_key ) != ERROR_SUCCESS ) {
335 rc = WPTERR_REGISTRY;
336 goto leave;
337 }
338 rc = RegSetValueEx( reg_key, key, 0, REG_SZ, (BYTE *)value, strlen( value ) );
339 if ( !rc_ok( rc ) )
340 rc = WPTERR_REGISTRY;
341 }
342
343 leave:
344 RegCloseKey( reg_key );
345 return rc;
346 } /* set_reg_key */
347
348
349 int
350 set_reg_entry_gpg( const char * key, const char * value )
351 {
352 return set_reg_entry( HKEY_CURRENT_USER, "Software\\GNU\\GnuPG", key, value );
353 } /* set_reg_entry_gpg */
354
355
356 int
357 set_reg_entry_mo( const char * value )
358 {
359 return set_reg_entry( HKEY_CURRENT_USER, "Control Panel\\Mingw32\\NLS", "MODir", value );
360 } /* set_reg_entry_mo */
361
362
363 char *
364 get_reg_entry_gpg( const char *key )
365 {
366 return get_reg_entry( HKEY_CURRENT_USER, "Software\\GNU\\GnuPG", key );
367 } /* get_reg_entry_gpg */
368
369
370 char *
371 get_reg_entry_mo( void )
372 {
373 return get_reg_entry( HKEY_CURRENT_USER, "Control Panel\\Mingw32\\NLS", "MODir" );
374 } /* get_reg_entry_mo */
375
376
377 static const char * cfg [] = {
378 NULL,
379 "CacheTime",
380 "WordWrap",
381 "FastMode",
382 "Viewer",
383 "KeylistMode",
384 "WipeMode",
385 "AlwaysTrust",
386 "AutoBackup",
387 "BackupMode",
388 "DisableHotkeys",
389 "NoCompressMultiMedia",
390 "Expert",
391 "FMProgressBar",
392 };
393
394
395 int
396 set_reg_winpt_single (int id, int val)
397 {
398 char buf[64];
399 int rc;
400
401 sprintf (buf, "%d", val);
402 rc = set_reg_entry (HKEY_CURRENT_USER, WINPT_REG, cfg[id], buf);
403 return rc;
404 }
405
406
407 int
408 get_reg_winpt_single (int id)
409 {
410 char * buf = NULL;
411 int val = 0;
412
413 buf = get_reg_entry (HKEY_CURRENT_USER, WINPT_REG, cfg[id]);
414 if (buf && *buf != ' ')
415 val = 1;
416 else if (!buf)
417 val = -1;
418 free_if_alloc (buf);
419 return val;
420 }
421
422
423 int
424 set_reg_winpt_prefs (winpt_reg_prefs_s * opt)
425 {
426 char buf[128];
427 int rc = 0, i;
428
429 for (i=1; i < DIM (cfg); i++) {
430 switch (i) {
431 case CFG_CACHETIME:
432 sprintf (buf, "%d", opt->cache_time);
433 break;
434 case CFG_WORDWRAP:
435 sprintf (buf, "%d", opt->word_wrap);
436 break;
437 case CFG_WIPEMODE:
438 sprintf (buf, "%d", opt->wipe_mode);
439 break;
440 case CFG_FASTMODE:
441 sprintf (buf, "%d", opt->use_tmpfiles);
442 break;
443 case CFG_NOZIP_MMEDIA:
444 sprintf (buf, "%d", opt->no_zip_mmedia);
445 break;
446 case CFG_VIEWER:
447 sprintf (buf, "%d", opt->use_viewer);
448 break;
449 case CFG_KEYLISTMODE:
450 sprintf (buf, "%d", opt->keylist_mode);
451 break;
452 case CFG_ALWAYSTRUST:
453 sprintf (buf, "%d", opt->always_trust);
454 break;
455 case CFG_AUTOBACKUP:
456 sprintf (buf, "%d", opt->auto_backup);
457 break;
458 case CFG_AUTOBAKMODE:
459 sprintf (buf, "%d", opt->backup.mode);
460 break;
461 case CFG_DISHOTKEYS:
462 sprintf (buf, "%d", opt->no_hotkeys);
463 break;
464 case CFG_EXPERT:
465 sprintf (buf, "%d", opt->expert);
466 break;
467
468 case CFG_FM_PROGRESS:
469 sprintf (buf, "%d", opt->fm.progress);
470 break;
471 }
472 rc = set_reg_entry (HKEY_CURRENT_USER, WINPT_REG, cfg[i], buf);
473 if (rc)
474 goto leave;
475 }
476
477 if (opt->backup.path) {
478 rc = set_reg_entry (HKEY_CURRENT_USER, WINPT_REG, "BackupPath",
479 opt->backup.path);
480 if (rc)
481 goto leave;
482 }
483 if (opt->kserv_conf) {
484 rc = set_reg_entry (HKEY_CURRENT_USER, WINPT_REG, "KeyserverConfig",
485 opt->kserv_conf);
486 if (rc)
487 goto leave;
488 }
489
490 for (i=0; reg_hotkeys[i].reg_entry; i++) {
491 strcpy (buf, " ");
492 if (reg_hotkeys[i].enabled)
493 strcpy (buf, reg_hotkeys[i].key);
494 rc = set_reg_key (HKEY_CURRENT_USER, WINPT_REG,
495 reg_hotkeys[i].reg_entry, buf);
496 if (rc)
497 break;
498 }
499
500 leave:
501 if (rc) {
502 msg_box (NULL, _("Could not write to Registry."), _("Preferences"), MB_ERR);
503 return rc;
504 }
505 return 0;
506 } /* set_reg_winpt_prefs */
507
508
509 int
510 set_reg_winpt_flag (const char * name, int val)
511 {
512 return set_reg_entry (HKEY_CURRENT_USER, WINPT_REG, name, val? "1" : "0");
513 } /* set_reg_winpt_flag */
514
515
516 int
517 get_reg_winpt_flag (const char * name)
518 {
519 char * buf;
520 int flag = 0;
521
522 buf = get_reg_entry (HKEY_CURRENT_USER, WINPT_REG, name);
523 if (buf && buf[0] == '1')
524 flag = 1;
525 else if (!buf || buf && buf[0] != '0')
526 flag = -1;
527 free_if_alloc (buf);
528 return flag;
529 } /* get_reg_winpt_flag */
530
531
532 int
533 get_reg_winpt_prefs (winpt_reg_prefs_s * opt)
534 {
535 char * val = NULL;
536 int i;
537
538 for (i=1; i < DIM (cfg); i++) {
539 val = get_reg_entry (HKEY_CURRENT_USER, WINPT_REG, cfg[i]);
540 if (!val || *val == ' ') {
541 free_if_alloc (val);
542 continue;
543 }
544 switch (i) {
545 case CFG_CACHETIME:
546 opt->cache_time = atol (val);
547 /* We do NOT support passphrase caching for more than an hour.
548 * Perhaps we should allow it, but for now we silently drop this.
549 */
550 if (opt->cache_time > 3600)
551 opt->cache_time = 3600;
552 break;
553 case CFG_WORDWRAP:
554 opt->word_wrap = atol (val);
555 break;
556 case CFG_FASTMODE:
557 opt->use_tmpfiles = atol (val);
558 break;
559 case CFG_NOZIP_MMEDIA:
560 opt->no_zip_mmedia = atol (val);
561 break;
562 case CFG_VIEWER:
563 opt->use_viewer = atol (val);
564 break;
565 case CFG_KEYLISTMODE:
566 opt->keylist_mode = atol (val);
567 break;
568 case CFG_WIPEMODE:
569 opt->wipe_mode = atol (val);
570 break;
571 case CFG_DISHOTKEYS:
572 opt->no_hotkeys = atol (val);
573 break;
574 case CFG_ALWAYSTRUST:
575 opt->always_trust = atol (val);
576 break;
577 case CFG_AUTOBACKUP:
578 opt->auto_backup = atol (val);
579 break;
580 case CFG_AUTOBAKMODE:
581 opt->backup.mode = atol (val);
582 break;
583 case CFG_EXPERT:
584 opt->expert = atol (val);
585 break;
586
587 case CFG_FM_PROGRESS:
588 opt->fm.progress = atol (val);
589 break;
590 }
591 free_if_alloc (val);
592 }
593
594 val = get_reg_entry (HKEY_CURRENT_USER, WINPT_REG, "BackupPath");
595 if (val && val[0] != ' ')
596 opt->backup.path = m_strdup (val);
597 free_if_alloc (val);
598
599 val = get_reg_entry (HKEY_CURRENT_USER, WINPT_REG, "KeyserverConfig");
600 if (val && val[0] != ' ')
601 opt->kserv_conf = m_strdup (val);
602 free_if_alloc (val);
603
604 for (i=0; reg_hotkeys[i].reg_entry; i++) {
605 val = get_reg_entry (HKEY_CURRENT_USER, WINPT_REG, reg_hotkeys[i].reg_entry);
606 if (val && val[0] != ' ') {
607 reg_hotkeys[i].key[0] = *val;
608 reg_hotkeys[i].enabled = 1;
609 }
610 else
611 reg_hotkeys[i].enabled = 0;
612 free_if_alloc (val);
613 }
614 return 0;
615 } /* get_reg_winpt_prefs */
616
617
618 char *
619 get_reg_entry_keyserver (const char *name)
620 {
621 char * p = get_reg_entry (HKEY_CURRENT_USER, WINPT_REG"\\Keyserver", name);
622 if (p && !strcmp (p, "")) {
623 free_if_alloc (p);
624 return NULL;
625 }
626 return p;
627 } /* get_reg_entry_keyserver */
628
629
630 void
631 get_reg_proxy_prefs (char ** host, int * port, char ** user, char ** pass)
632 {
633 if (host)
634 *host = get_reg_entry_keyserver ("Host");
635 if (user)
636 *user = get_reg_entry_keyserver ("User");
637 if (pass)
638 *pass = get_reg_entry_keyserver ("Pass");
639 if (port) {
640 char * p = get_reg_entry_keyserver ("Port");
641 if (p) {
642 *port = atol (p);
643 free_if_alloc (p);
644 }
645 }
646 } /* get_reg_proxy_prefs */
647
648
649 int
650 set_reg_entry_keyserver( const char * name, const char * val )
651 {
652 return set_reg_entry( HKEY_CURRENT_USER, WINPT_REG"\\Keyserver", name, val );
653 } /* set_reg_entry_keyserver */
654
655
656 int
657 set_reg_proxy_prefs( const char * host, int port, const char * user, const char * pass )
658 {
659 int rc;
660
661 rc = set_reg_entry_keyserver( "Host", host? host : "" );
662 if( !rc ) {
663 char buf[32];
664 sprintf( buf, "%d", port );
665 rc = set_reg_entry_keyserver( "Port", buf );
666 }
667 if( !rc )
668 rc = set_reg_entry_keyserver( "User", user? user : "" );
669 if( !rc )
670 rc = set_reg_entry_keyserver( "Pass", pass? pass : "" );
671 return rc;
672 } /* set_reg_proxy_prefs */

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26