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

Annotation of /trunk/Src/wptGPGParser.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 69 - (hide annotations)
Sat Nov 5 12:28:12 2005 UTC (19 years, 3 months ago) by twoaday
File size: 12228 byte(s)
More minor fixes...

1 werner 36 /* wptGPGParser.cpp - GPG config file parser
2     * Copyright (C) 2002, 2003, 2004 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     #ifdef HAVE_CONFIG_H
22     #include <config.h>
23     #endif
24    
25 twoaday 2 #include <stdio.h>
26 werner 36 #include <stdio.h>
27     #include <string.h>
28     #include <windows.h>
29    
30     #include "wptTypes.h"
31 twoaday 2 #include "wptW32API.h"
32 werner 36 #include "wptGPG.h"
33     #include "wptErrors.h"
34 twoaday 2
35 werner 36 static void
36     add_opaque_option (gpg_optfile_t opt, const char * line, int used)
37     {
38     gpg_option_t e, t;
39    
40     e = new gpg_option_s;
41     if (!e)
42     BUG (0);
43     memset (e, 0, sizeof *e);
44     e->used = used > 0? 1 : 0;
45     e->name = m_strdup (line);
46     e->type = ENTRY_OPAQUE;
47     if (!opt->list)
48     opt->list = e;
49     else {
50     for (t = opt->list; t->next; t = t->next)
51     ;
52     t->next = e;
53     }
54     } /* add_opaque_option */
55    
56    
57     static void
58     add_single_option (gpg_optfile_t opt, const char * name, int used)
59     {
60     gpg_option_t e, t;
61    
62     e = new gpg_option_s;
63     if (!e)
64     BUG (0);
65     memset (e, 0, sizeof *e);
66     e->used = used > 0? 1 : 0;
67     e->name = m_strdup (name);
68     e->type = ENTRY_SINGLE;
69     if (!opt->list)
70     opt->list = e;
71     else {
72     for (t = opt->list; t->next; t = t->next)
73     ;
74     t->next = e;
75     }
76     } /* add_single_option */
77    
78    
79     static int
80     add_group_option( gpg_optfile_t opt, const char *name, int used )
81     {
82     gpg_option_t e, t;
83    
84     e = new gpg_option_s;
85     if( !e )
86     BUG( NULL );
87     memset( e, 0, sizeof *e );
88     e->used = used > 0? 1 : 0;
89     e->name = m_strdup( name );
90     e->type = ENTRY_GROUP;
91     if( !opt->list )
92     opt->list = e;
93     else {
94     for( t = opt->list; t->next; t = t->next )
95     ;
96     t->next = e;
97     }
98     return 0;
99     } /* add_group_option */
100    
101    
102     static size_t
103     count_whitespaces( char *line )
104     {
105     size_t i = 0, ncount = 0;
106    
107     if( !strchr( line, ' ' ) )
108     return 0;
109     for( i = 0; i < strlen( line ); i++ ) {
110     if( line[i] == ' ' )
111     ncount++;
112     }
113    
114     return ncount;
115     } /* count_whitespaces */
116    
117    
118     static int
119     add_multi_option( gpg_optfile_t opt, char *line, int used )
120     {
121     gpg_option_t e ,t;
122     char *p;
123     int state = 0;
124    
125     e = new gpg_option_s;
126     if( !e )
127     BUG( NULL );
128     memset( e, 0, sizeof *e );
129     if( count_whitespaces( line ) == 1 ) {
130     while( (p = strsep( &line, " " )) && state != 2 ) {
131     switch( state ) {
132     case 0: e->name = m_strdup( p ); break;
133     case 1: e->val = m_strdup( p ); break;
134     }
135     state++;
136     }
137     }
138     else {
139     p = strchr( line, ' ' );
140     state = p - line;
141     e->name = new char[state + 1];
142     if( !e->name )
143     BUG( NULL );
144     memcpy( e->name, line, state );
145     e->name[state] = '\0';
146     strncpy( e->name, line, state );
147     e->val = m_strdup( line + state + 1 );
148     }
149     e->used = used;
150     e->type = ENTRY_MULTI;
151     if( !opt->list )
152     opt->list = e;
153     else {
154     for( t=opt->list; t->next; t = t->next )
155     ;
156     t->next = e;
157     }
158     return 0;
159     } /* add_multi_option */
160    
161    
162     static gpg_group_t
163     new_group (gpg_group_t * grp, const char * name)
164     {
165     gpg_group_t g, t;
166    
167     g = new gpg_group_s;
168     if( !g )
169     BUG( NULL );
170     memset( g, 0, sizeof *g );
171     g->used = 1;
172     g->name = m_strdup( name );
173     if( !*grp )
174     *grp = g;
175     else {
176     for( t = *grp; t->next; t = t->next )
177     ;
178     t->next = g;
179     }
180     return g;
181     } /* new_group */
182    
183    
184     static const char*
185     _add_group( gpg_optfile_t opt, const char *line )
186     {
187     char *p, *buf, *buf2, *name = NULL;
188     gpg_group_t g;
189     gpg_member_t m = NULL, t;
190    
191     p = strchr( line, '=' );
192     if( p == NULL || strncmp( line, "group ", 6 ) )
193     return NULL;
194     buf = m_strdup( line + (p - line + 1) );
195     if( !buf )
196     BUG( NULL );
197     line += 6;
198     p = strchr( line, '=' );
199     if( p ) {
200     size_t pos = p - line;
201     name = new char[pos + 1];
202     if( !name )
203     BUG( NULL );
204     memset( name, 0, pos+1 );
205     strncpy( name, line, pos );
206     }
207     g = new_group( &opt->grp, name );
208     buf2 = buf;
209     while( (p = strsep( &buf2, " " )) && *p ) {
210     m = new gpg_member_s;
211     if( !m )
212     BUG( NULL );
213     memset( m, 0, sizeof *m );
214     m->used = 1;
215     m->name = m_strdup( p );
216     if( !g->list )
217     g->list = m;
218     else {
219     for( t=g->list; t->next; t = t->next )
220     ;
221     t->next = m;
222     }
223     }
224     free_if_alloc( buf );
225     if( !m )
226     return NULL;
227     return g->name;
228     } /* _add_group */
229    
230     void
231     release_group( gpg_group_t grp )
232     {
233     gpg_member_t m, m2;
234    
235     m = grp->list;
236     while( m ) {
237     m2 = m->next;
238     free_if_alloc( m->name );
239     free_if_alloc( m );
240     m = m2;
241     }
242     } /* release_group */
243    
244    
245     void
246     release_option (gpg_option_t opt)
247     {
248     if (!opt)
249     return;
250     free_if_alloc( opt->name );
251     free_if_alloc( opt->val );
252     free_if_alloc( opt );
253     }
254    
255    
256     void
257     release_gpg_options( gpg_optfile_t opt )
258     {
259     gpg_option_t e, e2;
260     gpg_group_t g, g2;
261    
262     e = opt->list;
263     while( e ) {
264     e2 = e->next;
265     release_option (e);
266     e = e2;
267     }
268     g = opt->grp;
269     while( g ) {
270     g2 = g->next;
271     release_group( g );
272     g = g2;
273     }
274     free_if_alloc( opt );
275     } /* release_gpg_options */
276    
277    
278     int
279     commit_gpg_options (const char * file, gpg_optfile_t opt)
280     {
281     FILE *inp;
282     gpg_option_t e;
283     gpg_group_t g;
284     gpg_member_t m;
285    
286     inp = fopen (file, "w+b");
287     if( !inp )
288     return -1;
289     for( e = opt->list; e; e = e->next ) {
290     if( !e->used )
291     continue;
292     switch( e->type ) {
293     case ENTRY_OPAQUE:
294     fprintf( inp, "%s", e->name );
295     break;
296    
297     case ENTRY_MULTI:
298     fprintf( inp, "%s %s\r\n", e->name, e->val );
299     break;
300    
301     case ENTRY_SINGLE:
302     fprintf( inp, "%s\r\n", e->name );
303     break;
304    
305     case ENTRY_GROUP:
306     g = find_group( opt, e->name );
307     if( g && g->used ) {
308     fprintf( inp, "group %s=", g->name );
309     for( m = g->list; m; m = m->next ) {
310     if( m->used )
311     fprintf( inp, "%s ", m->name );
312     }
313     fprintf( inp, "\r\n" );
314     }
315     break;
316     }
317     }
318     fclose (inp);
319     return 0;
320     } /* commit_gpg_options */
321    
322    
323     int
324     parse_gpg_options( const char *file, gpg_optfile_t *r_opt )
325     {
326     FILE *inp;
327     char buf[1024], *p;
328     gpg_optfile_t opt = NULL;
329    
330     inp = fopen( file, "rb" );
331     if( inp == NULL ) {
332     inp = fopen( file, "wb" );
333     if( inp == NULL )
334     return -1;
335     }
336     opt = new gpg_optfile_s;
337     if( !opt )
338     BUG( NULL );
339     memset( opt, 0, sizeof *opt );
340     while( !feof( inp ) ) {
341     p = fgets( buf, sizeof buf -1, inp );
342     if( !p )
343     break;
344     if( *p == '#' || *p == '\r' || *p == '\n' || *p == '\t' ) {
345     add_opaque_option( opt, p, 1 );
346     continue;
347     }
348     if( strstr( p, "\r\n" ) )
349     p[strlen( p ) - 2] = '\0';
350     else if( strstr( p, "\n" ) )
351     p[strlen( p ) - 1] = '\0';
352     if( !strchr( p, ' ' ) )
353     add_single_option( opt, p, 1 );
354     else if( !strncmp( p, "group", 5 ) ) {
355     const char *s = _add_group( opt, p );
356     if( s )
357     add_group_option( opt, s, 1 );
358     }
359     else
360     add_multi_option( opt, p, 1 );
361     }
362     fclose( inp );
363     if( r_opt )
364     *r_opt = opt;
365     return 0;
366     } /* parse_gpg_options */
367    
368    
369     gpg_option_t
370     find_option (gpg_optfile_t opt, const char * str)
371     {
372     gpg_option_t e;
373    
374     for (e = opt->list; e; e = e->next) {
375     if (e->type == ENTRY_OPAQUE)
376     continue;
377     if (!stricmp (e->name, str))
378     break;
379     }
380    
381     return e;
382     } /* find_option */
383    
384    
385     gpg_group_t
386     find_group( gpg_optfile_t opt, const char *str )
387     {
388     gpg_group_t g;
389    
390     for( g = opt->grp; g; g = g->next ) {
391     if( !stricmp( g->name, str ) )
392     break;
393     }
394    
395     return g;
396     } /* find_group */
397    
398    
399     gpg_member_t
400     find_member( gpg_optfile_t opt, const char *grp, const char *str )
401     {
402     gpg_group_t g = find_group( opt, grp );
403     gpg_member_t m = NULL;
404     if( g ) {
405     for( m = g->list; m; m = m->next ) {
406     if( !stricmp( m->name, str ) )
407     break;
408     }
409     }
410    
411     return m;
412     } /* find_member */
413    
414    
415     int
416     delete_group( gpg_optfile_t opt, const char *str )
417     {
418     gpg_group_t g = find_group( opt, str );
419     if( g ) {
420     g->used = 0;
421     return 0;
422     }
423    
424     return -1;
425     } /* delete_group */
426    
427    
428     int
429     delete_member( gpg_optfile_t opt, const char *grp, const char *str )
430     {
431     gpg_member_t m = find_member( opt, grp, str );
432     if( m ) {
433     m->used = 0;
434     return 0;
435     }
436    
437     return -1;
438     } /* delete_member */
439    
440    
441     int
442     delete_option (gpg_optfile_t opt, const char * str)
443     {
444     gpg_option_t e = find_option (opt, str);
445     if (e) {
446     e->used = 0;
447     return 0;
448     }
449    
450     return -1;
451     } /* delete_option */
452    
453    
454     int
455     add_entry( gpg_optfile_t opt, int type, const char *name, const char *val )
456     {
457     gpg_option_t e, t;
458    
459     e = new gpg_option_s;
460     if( !e )
461     BUG( NULL );
462     memset( e, 0, sizeof *e );
463     e->used = 1;
464     e->type = type;
465     e->name = m_strdup( name );
466     e->val = val? m_strdup( val ) : NULL;
467     if( !opt->list )
468     opt->list = e;
469     else {
470     for( t = opt->list; t->next; t = t->next )
471     ;
472     t->next = e;
473     }
474     return 0;
475     } /* add_entry */
476    
477    
478     int
479     modify_entry( gpg_optfile_t opt, int type, const char *name, const char *val )
480     {
481     gpg_option_t e;
482     int rc = 0;
483    
484     e = find_option( opt, name );
485     if( !e )
486     rc = add_entry( opt, type, name, val );
487     else if( type != ENTRY_SINGLE ) {
488     free_if_alloc( e->val );
489     e->val = m_strdup( val );
490     }
491    
492     return rc;
493     } /* modify_entry */
494    
495    
496     int
497     add_member( gpg_optfile_t opt, const char *grp, const char *str )
498     {
499     gpg_group_t g = find_group( opt, grp );
500     gpg_member_t m, t;
501     if( g ) {
502     m = new gpg_member_s;
503     if( !m )
504     BUG( NULL );
505     memset( m, 0, sizeof *m );
506     m->used = 1;
507     m->name = m_strdup( str );
508     if( !m->name )
509     BUG( NULL );
510     if( !g->list )
511     g->list = m;
512     else {
513     for( t = g->list; t->next; t = t->next )
514     ;
515     t->next = m;
516     }
517     return 0;
518     }
519     return -1;
520     } /* add_member */
521    
522    
523     int
524     add_group( gpg_optfile_t opt, const char *str )
525     {
526     gpg_group_t g, t;
527    
528     g = new gpg_group_s;
529     if( !g )
530     BUG( NULL );
531     memset( g, 0, sizeof *g );
532     g->used = 1;
533     g->name = m_strdup( str );
534    
535     if( !opt->grp )
536     opt->grp = g;
537     else {
538     for( t = opt->grp; t->next; t = t->next )
539     ;
540     t->next = g;
541     }
542     add_entry( opt, ENTRY_GROUP, str, NULL );
543    
544     return 0;
545     } /* add_group */
546    
547    
548     #if 0
549     void
550     walk_group( const char *name, gpg_member_t mbr )
551     {
552     gpg_member_t m;
553    
554     printf( "name=%s\n", name );
555     for( m = mbr; m; m = m->next )
556     printf( "%s\n", m->name );
557     }
558    
559    
560     int
561     main( int argc, char **argv )
562     {
563     int rc;
564     gpg_optfile_t opt;
565     gpg_group_t g;
566     gpg_option_t e;
567    
568     rc = parse_gpg_options( "c:\\gnupg\\gpg.conf", &opt );
569     if( rc )
570     printf( "parse_option: error\n" );
571     else {
572     #if 0
573     /*delete_option( opt, "encrypt-to" );*/
574     delete_member( opt, "bar", "richard" );
575     add_member( opt, "bar", "leo" );
576     add_group( opt, "foobar" );
577     delete_group( opt, "foobar" );
578     add_entry( opt, ENTRY_SINGLE, "use-agent", NULL );
579     #endif
580     for( e = opt->list; e; e = e->next ) {
581     if( e->type != 1 )
582     printf( "%d: %s %s\n", e->used, e->name, e->val );
583     }
584     /*commit_gpg_options( "c:\\gnupg\\gpg2.conf", opt );*/
585     for( g = opt->grp; g; g = g->next )
586     walk_group( g->name, g->list );
587     release_option( opt );
588     }
589    
590     return 0;
591     }
592     #endif

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26