1
1
/* server.c - Server mode and main entry point
2
* Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
2
* Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006,
3
* 2007, 2008 Free Software Foundation, Inc.
4
5
* This file is part of GnuPG.
6
7
* GnuPG is free software; you can redistribute it and/or modify
7
8
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 2 of the License, or
9
* the Free Software Foundation; either version 3 of the License, or
9
10
* (at your option) any later version.
11
12
* GnuPG is distributed in the hope that it will be useful,
47
int list_to_output; /* Write keylistings to the output fd. */
48
int enable_audit_log; /* Use an audit log. */
46
49
certlist_t recplist;
47
50
certlist_t signerlist;
48
51
certlist_t default_recplist; /* As set by main() - don't release. */
52
int allow_pinentry_notify; /* Set if pinentry notifications should
53
be passed back to the client. */
57
/* Cookie definition for assuan data line output. */
58
static ssize_t data_line_cookie_write (void *cookie,
59
const void *buffer, size_t size);
60
static int data_line_cookie_close (void *cookie);
61
static es_cookie_io_functions_t data_line_cookie_functions =
64
data_line_cookie_write,
66
data_line_cookie_close
53
72
/* Note that it is sufficient to allocate the target string D as
54
73
long as the source string S, i.e.: strlen(s)+1; */
82
117
int n = strlen (name);
84
119
s = strstr (line, name);
120
if (s && s >= skip_options (line))
85
122
return (s && (s == line || spacep (s-1)) && (!s[n] || spacep (s+n)));
126
/* A write handler used by es_fopencookie to write assuan data
129
data_line_cookie_write (void *cookie, const void *buffer, size_t size)
131
assuan_context_t ctx = cookie;
133
if (assuan_send_data (ctx, buffer, size))
143
data_line_cookie_close (void *cookie)
145
assuan_context_t ctx = cookie;
147
if (assuan_send_data (ctx, NULL, 0))
90
close_message_fd (CTRL ctrl)
158
close_message_fd (ctrl_t ctrl)
92
160
if (ctrl->server_local->message_fd != -1)
168
/* Start a new audit session if this has been enabled. */
170
start_audit_session (ctrl_t ctrl)
172
audit_release (ctrl->audit);
174
if (ctrl->server_local->enable_audit_log && !(ctrl->audit = audit_new ()) )
175
return gpg_error_from_syserror ();
101
option_handler (ASSUAN_CONTEXT ctx, const char *key, const char *value)
182
option_handler (assuan_context_t ctx, const char *key, const char *value)
103
CTRL ctrl = assuan_get_pointer (ctx);
184
ctrl_t ctrl = assuan_get_pointer (ctx);
105
186
if (!strcmp (key, "include-certs"))
107
188
int i = *value? atoi (value) : -1;
108
189
if (ctrl->include_certs < -2)
109
return ASSUAN_Parameter_Error;
190
return gpg_error (GPG_ERR_ASS_PARAMETER);
110
191
ctrl->include_certs = i;
112
else if (!strcmp (key, "display"))
193
else if (!strcmp (key, "display"))
115
196
free (opt.display);
116
197
opt.display = strdup (value);
117
198
if (!opt.display)
118
return ASSUAN_Out_Of_Core;
199
return out_of_core ();
120
201
else if (!strcmp (key, "ttyname"))
168
265
ctrl->server_local->list_external = 1;
171
return ASSUAN_Parameter_Error;
268
return gpg_error (GPG_ERR_ASS_PARAMETER);
270
else if (!strcmp (key, "list-to-output"))
272
int i = *value? atoi (value) : 0;
273
ctrl->server_local->list_to_output = i;
173
275
else if (!strcmp (key, "with-validation"))
175
277
int i = *value? atoi (value) : 0;
176
278
ctrl->with_validation = i;
280
else if (!strcmp (key, "validation-model"))
282
int i = gpgsm_parse_validation_model (value);
283
if ( i >= 0 && i <= 1 )
284
ctrl->validation_model = i;
286
return gpg_error (GPG_ERR_ASS_PARAMETER);
288
else if (!strcmp (key, "with-key-data"))
290
opt.with_key_data = 1;
292
else if (!strcmp (key, "enable-audit-log"))
294
int i = *value? atoi (value) : 0;
295
ctrl->server_local->enable_audit_log = i;
297
else if (!strcmp (key, "allow-pinentry-notify"))
298
ctrl->server_local->allow_pinentry_notify = 1;
179
return ASSUAN_Invalid_Option;
300
return gpg_error (GPG_ERR_UNKNOWN_OPTION);
188
reset_notify (ASSUAN_CONTEXT ctx)
307
reset_notify (assuan_context_t ctx)
190
CTRL ctrl = assuan_get_pointer (ctx);
309
ctrl_t ctrl = assuan_get_pointer (ctx);
192
311
gpgsm_release_certlist (ctrl->server_local->recplist);
193
312
gpgsm_release_certlist (ctrl->server_local->signerlist);
244
363
client has to take care of this. All RECIPIENT commands are
245
364
cumulative until a RESET or an successful ENCRYPT command. */
247
cmd_recipient (ASSUAN_CONTEXT ctx, char *line)
366
cmd_recipient (assuan_context_t ctx, char *line)
249
CTRL ctrl = assuan_get_pointer (ctx);
368
ctrl_t ctrl = assuan_get_pointer (ctx);
252
rc = gpgsm_add_to_certlist (ctrl, line, 0, &ctrl->server_local->recplist, 0);
372
rc = start_audit_session (ctrl);
377
rc = gpgsm_add_to_certlist (ctrl, line, 0,
378
&ctrl->server_local->recplist, 0);
255
381
gpg_err_code_t r = gpg_err_code (rc);
329
457
have been done while setting the recipients. The input and output
330
458
pipes are closed. */
332
cmd_encrypt (ASSUAN_CONTEXT ctx, char *line)
460
cmd_encrypt (assuan_context_t ctx, char *line)
334
CTRL ctrl = assuan_get_pointer (ctx);
462
ctrl_t ctrl = assuan_get_pointer (ctx);
336
464
int inp_fd, out_fd;
340
inp_fd = assuan_get_input_fd (ctx);
468
inp_fd = translate_sys2libc_fd (assuan_get_input_fd (ctx), 0);
341
469
if (inp_fd == -1)
342
return set_error (No_Input, NULL);
343
out_fd = assuan_get_output_fd (ctx);
470
return set_error (GPG_ERR_ASS_NO_INPUT, NULL);
471
out_fd = translate_sys2libc_fd (assuan_get_output_fd (ctx), 1);
344
472
if (out_fd == -1)
345
return set_error (No_Output, NULL);
473
return set_error (GPG_ERR_ASS_NO_OUTPUT, NULL);
347
out_fp = fdopen ( dup(out_fd), "w");
475
out_fp = fdopen (dup (out_fd), "w");
349
return set_error (General_Error, "fdopen() failed");
477
return set_error (GPG_ERR_ASS_GENERAL, "fdopen() failed");
351
479
/* Now add all encrypt-to marked recipients from the default
381
512
no need to ask the client for a protecting passphrase - GpgAgent
382
513
does take care of this by requesting this from the user. */
384
cmd_decrypt (ASSUAN_CONTEXT ctx, char *line)
515
cmd_decrypt (assuan_context_t ctx, char *line)
386
CTRL ctrl = assuan_get_pointer (ctx);
517
ctrl_t ctrl = assuan_get_pointer (ctx);
387
518
int inp_fd, out_fd;
391
inp_fd = assuan_get_input_fd (ctx);
522
inp_fd = translate_sys2libc_fd (assuan_get_input_fd (ctx), 0);
392
523
if (inp_fd == -1)
393
return set_error (No_Input, NULL);
394
out_fd = assuan_get_output_fd (ctx);
524
return set_error (GPG_ERR_ASS_NO_INPUT, NULL);
525
out_fd = translate_sys2libc_fd (assuan_get_output_fd (ctx), 1);
395
526
if (out_fd == -1)
396
return set_error (No_Output, NULL);
527
return set_error (GPG_ERR_ASS_NO_OUTPUT, NULL);
398
out_fp = fdopen ( dup(out_fd), "w");
529
out_fp = fdopen (dup(out_fd), "w");
400
return set_error (General_Error, "fdopen() failed");
401
rc = gpgsm_decrypt (ctrl, inp_fd, out_fp);
531
return set_error (GPG_ERR_ASS_GENERAL, "fdopen() failed");
533
rc = start_audit_session (ctrl);
535
rc = gpgsm_decrypt (ctrl, inp_fd, out_fp);
404
538
/* close and reset the fd */
420
554
the signed material and the client must provide it.
423
cmd_verify (ASSUAN_CONTEXT ctx, char *line)
557
cmd_verify (assuan_context_t ctx, char *line)
426
CTRL ctrl = assuan_get_pointer (ctx);
427
int fd = assuan_get_input_fd (ctx);
428
int out_fd = assuan_get_output_fd (ctx);
560
ctrl_t ctrl = assuan_get_pointer (ctx);
561
int fd = translate_sys2libc_fd (assuan_get_input_fd (ctx), 0);
562
int out_fd = translate_sys2libc_fd (assuan_get_output_fd (ctx), 1);
429
563
FILE *out_fp = NULL;
432
return set_error (No_Input, NULL);
566
return set_error (GPG_ERR_ASS_NO_INPUT, NULL);
434
568
if (out_fd != -1)
436
570
out_fp = fdopen ( dup(out_fd), "w");
438
return set_error (General_Error, "fdopen() failed");
572
return set_error (GPG_ERR_ASS_GENERAL, "fdopen() failed");
441
rc = gpgsm_verify (assuan_get_pointer (ctx), fd,
442
ctrl->server_local->message_fd, out_fp);
575
rc = start_audit_session (ctrl);
577
rc = gpgsm_verify (assuan_get_pointer (ctx), fd,
578
ctrl->server_local->message_fd, out_fp);
458
594
set by OUTPUT. With "--detached" specified, a detached signature is
459
595
created (surprise). */
461
cmd_sign (ASSUAN_CONTEXT ctx, char *line)
597
cmd_sign (assuan_context_t ctx, char *line)
463
CTRL ctrl = assuan_get_pointer (ctx);
599
ctrl_t ctrl = assuan_get_pointer (ctx);
464
600
int inp_fd, out_fd;
469
inp_fd = assuan_get_input_fd (ctx);
605
inp_fd = translate_sys2libc_fd (assuan_get_input_fd (ctx), 0);
470
606
if (inp_fd == -1)
471
return set_error (No_Input, NULL);
472
out_fd = assuan_get_output_fd (ctx);
607
return set_error (GPG_ERR_ASS_NO_INPUT, NULL);
608
out_fd = translate_sys2libc_fd (assuan_get_output_fd (ctx), 1);
473
609
if (out_fd == -1)
474
return set_error (No_Output, NULL);
610
return set_error (GPG_ERR_ASS_NO_OUTPUT, NULL);
476
612
detached = has_option (line, "--detached");
478
614
out_fp = fdopen ( dup(out_fd), "w");
480
return set_error (General_Error, "fdopen() failed");
616
return set_error (GPG_ERR_ASS_GENERAL, "fdopen() failed");
482
rc = gpgsm_sign (assuan_get_pointer (ctx), ctrl->server_local->signerlist,
483
inp_fd, detached, out_fp);
618
rc = start_audit_session (ctrl);
620
rc = gpgsm_sign (assuan_get_pointer (ctx), ctrl->server_local->signerlist,
621
inp_fd, detached, out_fp);
486
624
/* close and reset the fd */
499
637
the certificate but not of the entire chain. It is possible to
500
638
import expired certificates. */
502
cmd_import (ASSUAN_CONTEXT ctx, char *line)
640
cmd_import (assuan_context_t ctx, char *line)
504
CTRL ctrl = assuan_get_pointer (ctx);
642
ctrl_t ctrl = assuan_get_pointer (ctx);
506
int fd = assuan_get_input_fd (ctx);
644
int fd = translate_sys2libc_fd (assuan_get_input_fd (ctx), 0);
509
return set_error (No_Input, NULL);
647
return set_error (GPG_ERR_ASS_NO_INPUT, NULL);
511
649
rc = gpgsm_import (assuan_get_pointer (ctx), fd);
515
653
assuan_close_input_fd (ctx);
516
654
assuan_close_output_fd (ctx);
518
return map_to_assuan_status (rc);
660
/* EXPORT [--data [--armor|--base64]] [--] pattern
523
cmd_export (ASSUAN_CONTEXT ctx, char *line)
665
cmd_export (assuan_context_t ctx, char *line)
525
CTRL ctrl = assuan_get_pointer (ctx);
526
int fd = assuan_get_output_fd (ctx);
667
ctrl_t ctrl = assuan_get_pointer (ctx);
532
return set_error (No_Output, NULL);
534
/* break the line down into an STRLIST */
672
use_data = has_option (line, "--data");
676
/* We need to override any possible setting done by an OUTPUT command. */
677
ctrl->create_pem = has_option (line, "--armor");
678
ctrl->create_base64 = has_option (line, "--base64");
681
line = skip_options (line);
683
/* Break the line down into an strlist_t. */
536
685
for (p=line; *p; line = p)
557
out_fp = fdopen ( dup(fd), "w");
561
return set_error (General_Error, "fdopen() failed");
564
gpgsm_export (ctrl, list, out_fp);
710
stream = es_fopencookie (ctx, "w", data_line_cookie_functions);
714
return set_error (GPG_ERR_ASS_GENERAL,
715
"error setting up a data stream");
717
gpgsm_export (ctrl, list, NULL, stream);
722
int fd = translate_sys2libc_fd (assuan_get_output_fd (ctx), 1);
728
return set_error (GPG_ERR_ASS_NO_OUTPUT, NULL);
730
out_fp = fdopen ( dup(fd), "w");
734
return set_error (GPG_ERR_ASS_GENERAL, "fdopen() failed");
737
gpgsm_export (ctrl, list, out_fp, NULL);
566
741
free_strlist (list);
567
/* close and reset the fd */
742
/* Close and reset the fds. */
568
743
close_message_fd (ctrl);
569
744
assuan_close_input_fd (ctx);
570
745
assuan_close_output_fd (ctx);
621
796
Set the file descriptor to read a message which is used with
622
797
detached signatures */
624
cmd_message (ASSUAN_CONTEXT ctx, char *line)
799
cmd_message (assuan_context_t ctx, char *line)
628
CTRL ctrl = assuan_get_pointer (ctx);
804
ctrl_t ctrl = assuan_get_pointer (ctx);
630
if (strncmp (line, "FD=", 3))
631
return set_error (Syntax_Error, "FD=<n> expected");
634
return set_error (Syntax_Error, "number required");
635
fd = strtoul (line, &endp, 10);
637
return set_error (Syntax_Error, "garbage found");
806
rc = assuan_command_parse_fd (ctx, line, &sysfd);
809
fd = translate_sys2libc_fd (sysfd, 0);
639
return set_error (No_Input, NULL);
811
return set_error (GPG_ERR_ASS_NO_INPUT, NULL);
641
812
ctrl->server_local->message_fd = fd;
816
/* LISTKEYS [<patterns>]
817
DUMPKEYS [<patterns>]
818
LISTSECRETKEYS [<patterns>]
819
DUMPSECRETKEYS [<patterns>]
647
do_listkeys (ASSUAN_CONTEXT ctx, char *line, int mode)
822
do_listkeys (assuan_context_t ctx, char *line, int mode)
649
CTRL ctrl = assuan_get_pointer (ctx);
650
FILE *fp = assuan_get_data_fp (ctx);
824
ctrl_t ctrl = assuan_get_pointer (ctx);
653
828
unsigned int listmode;
657
return set_error (General_Error, "no data stream");
659
/* break the line down into an STRLIST */
831
/* Break the line down into an strlist. */
661
833
for (p=line; *p; line = p)
687
877
listmode |= (1<<7);
688
878
err = gpgsm_list_keys (assuan_get_pointer (ctx), list, fp, listmode);
689
879
free_strlist (list);
690
return map_to_assuan_status (err);
881
if (ctrl->server_local->list_to_output)
882
assuan_close_output_fd (ctx);
694
cmd_listkeys (ASSUAN_CONTEXT ctx, char *line)
887
cmd_listkeys (assuan_context_t ctx, char *line)
696
889
return do_listkeys (ctx, line, 3);
700
cmd_listsecretkeys (ASSUAN_CONTEXT ctx, char *line)
893
cmd_dumpkeys (assuan_context_t ctx, char *line)
895
return do_listkeys (ctx, line, 259);
899
cmd_listsecretkeys (assuan_context_t ctx, char *line)
702
901
return do_listkeys (ctx, line, 2);
905
cmd_dumpsecretkeys (assuan_context_t ctx, char *line)
907
return do_listkeys (ctx, line, 258);
709
914
certificate request to the output.
712
cmd_genkey (ASSUAN_CONTEXT ctx, char *line)
917
cmd_genkey (assuan_context_t ctx, char *line)
714
CTRL ctrl = assuan_get_pointer (ctx);
919
ctrl_t ctrl = assuan_get_pointer (ctx);
715
920
int inp_fd, out_fd;
719
inp_fd = assuan_get_input_fd (ctx);
925
inp_fd = translate_sys2libc_fd (assuan_get_input_fd (ctx), 0);
720
926
if (inp_fd == -1)
721
return set_error (No_Input, NULL);
722
out_fd = assuan_get_output_fd (ctx);
927
return set_error (GPG_ERR_ASS_NO_INPUT, NULL);
928
out_fd = translate_sys2libc_fd (assuan_get_output_fd (ctx), 1);
723
929
if (out_fd == -1)
724
return set_error (No_Output, NULL);
930
return set_error (GPG_ERR_ASS_NO_OUTPUT, NULL);
932
in_stream = es_fdopen_nc (inp_fd, "r");
934
return set_error (GPG_ERR_ASS_GENERAL, "es_fdopen failed");
726
936
out_fp = fdopen ( dup(out_fd), "w");
728
return set_error (General_Error, "fdopen() failed");
729
rc = gpgsm_genkey (ctrl, inp_fd, out_fp);
939
es_fclose (in_stream);
940
return set_error (GPG_ERR_ASS_GENERAL, "fdopen() failed");
942
rc = gpgsm_genkey (ctrl, in_stream, out_fp);
732
945
/* close and reset the fds */
733
946
assuan_close_input_fd (ctx);
734
947
assuan_close_output_fd (ctx);
736
return map_to_assuan_status (rc);
954
/* GETAUDITLOG [--data] [--html]
956
!!!WORK in PROGRESS!!!
958
If --data is used, the output is send using D-lines and not to the
959
source given by an OUTPUT command.
961
If --html is used the output is formated as an XHTML block. This is
962
designed to be incorporated into a HTML document.
965
cmd_getauditlog (assuan_context_t ctx, char *line)
967
ctrl_t ctrl = assuan_get_pointer (ctx);
969
estream_t out_stream;
970
int opt_data, opt_html;
973
opt_data = has_option (line, "--data");
974
opt_html = has_option (line, "--html");
975
line = skip_options (line);
978
return gpg_error (GPG_ERR_NO_DATA);
982
out_stream = es_fopencookie (ctx, "w", data_line_cookie_functions);
984
return set_error (GPG_ERR_ASS_GENERAL,
985
"error setting up a data stream");
989
out_fd = translate_sys2libc_fd (assuan_get_output_fd (ctx), 1);
991
return set_error (GPG_ERR_ASS_NO_OUTPUT, NULL);
993
out_stream = es_fdopen_nc ( dup (out_fd), "w");
996
return set_error (GPG_ERR_ASS_GENERAL, "es_fdopen() failed");
1000
audit_print_result (ctrl->audit, out_stream, opt_html);
1003
es_fclose (out_stream);
1005
/* Close and reset the fd. */
1007
assuan_close_output_fd (ctx);
1014
Multipurpose function to return a variety of information.
1015
Supported values for WHAT are:
1017
version - Return the version of the program.
1018
pid - Return the process id of the server.
1022
cmd_getinfo (assuan_context_t ctx, char *line)
1026
if (!strcmp (line, "version"))
1028
const char *s = VERSION;
1029
rc = assuan_send_data (ctx, s, strlen (s));
1031
else if (!strcmp (line, "pid"))
1035
snprintf (numbuf, sizeof numbuf, "%lu", (unsigned long)getpid ());
1036
rc = assuan_send_data (ctx, numbuf, strlen (numbuf));
1039
rc = set_error (GPG_ERR_ASS_PARAMETER, "unknown value for WHAT");
743
1045
/* Tell the assuan library about our commands */
745
register_commands (ASSUAN_CONTEXT ctx)
1047
register_commands (assuan_context_t ctx)
748
1050
const char *name;
749
int (*handler)(ASSUAN_CONTEXT, char *line);
1051
int (*handler)(assuan_context_t, char *line);
751
1053
{ "RECIPIENT", cmd_recipient },
752
1054
{ "SIGNER", cmd_signer },
760
1062
{ "OUTPUT", NULL },
761
1063
{ "MESSAGE", cmd_message },
762
1064
{ "LISTKEYS", cmd_listkeys },
1065
{ "DUMPKEYS", cmd_dumpkeys },
763
1066
{ "LISTSECRETKEYS",cmd_listsecretkeys },
1067
{ "DUMPSECRETKEYS",cmd_dumpsecretkeys },
764
1068
{ "GENKEY", cmd_genkey },
765
1069
{ "DELKEYS", cmd_delkeys },
1070
{ "GETAUDITLOG", cmd_getauditlog },
1071
{ "GETINFO", cmd_getinfo },
792
1098
memset (&ctrl, 0, sizeof ctrl);
793
1099
gpgsm_init_default_ctrl (&ctrl);
795
/* For now we use a simple pipe based server so that we can work
796
from scripts. We will later add options to run as a daemon and
797
wait for requests on a Unix domain socket */
1101
/* We use a pipe based server so that we can work from scripts.
1102
assuan_init_pipe_server will automagically detect when we are
1103
called with a socketpair and ignore FIELDES in this case. */
800
1106
rc = assuan_init_pipe_server (&ctx, filedes);
803
1109
log_error ("failed to initialize the server: %s\n",
804
assuan_strerror(rc));
807
1113
rc = register_commands (ctx);
810
1116
log_error ("failed to the register commands with Assuan: %s\n",
811
assuan_strerror(rc));
814
1120
if (opt.verbose || opt.debug)
877
1183
ctrl.server_local->recplist = NULL;
878
1184
gpgsm_release_certlist (ctrl.server_local->signerlist);
879
1185
ctrl.server_local->signerlist = NULL;
1186
xfree (ctrl.server_local);
1188
audit_release (ctrl.audit);
881
1191
assuan_deinit_server (ctx);
886
get_status_string ( int no )
892
case STATUS_ENTER : s = "ENTER"; break;
893
case STATUS_LEAVE : s = "LEAVE"; break;
894
case STATUS_ABORT : s = "ABORT"; break;
895
case STATUS_NEWSIG : s = "NEWSIG"; break;
896
case STATUS_GOODSIG: s = "GOODSIG"; break;
897
case STATUS_SIGEXPIRED: s = "SIGEXPIRED"; break;
898
case STATUS_KEYREVOKED: s = "KEYREVOKED"; break;
899
case STATUS_BADSIG : s = "BADSIG"; break;
900
case STATUS_ERRSIG : s = "ERRSIG"; break;
901
case STATUS_BADARMOR : s = "BADARMOR"; break;
902
case STATUS_RSA_OR_IDEA : s= "RSA_OR_IDEA"; break;
903
case STATUS_TRUST_UNDEFINED: s = "TRUST_UNDEFINED"; break;
904
case STATUS_TRUST_NEVER : s = "TRUST_NEVER"; break;
905
case STATUS_TRUST_MARGINAL : s = "TRUST_MARGINAL"; break;
906
case STATUS_TRUST_FULLY : s = "TRUST_FULLY"; break;
907
case STATUS_TRUST_ULTIMATE : s = "TRUST_ULTIMATE"; break;
908
case STATUS_GET_BOOL : s = "GET_BOOL"; break;
909
case STATUS_GET_LINE : s = "GET_LINE"; break;
910
case STATUS_GET_HIDDEN : s = "GET_HIDDEN"; break;
911
case STATUS_GOT_IT : s = "GOT_IT"; break;
912
case STATUS_SHM_INFO : s = "SHM_INFO"; break;
913
case STATUS_SHM_GET : s = "SHM_GET"; break;
914
case STATUS_SHM_GET_BOOL : s = "SHM_GET_BOOL"; break;
915
case STATUS_SHM_GET_HIDDEN : s = "SHM_GET_HIDDEN"; break;
916
case STATUS_NEED_PASSPHRASE: s = "NEED_PASSPHRASE"; break;
917
case STATUS_VALIDSIG : s = "VALIDSIG"; break;
918
case STATUS_SIG_ID : s = "SIG_ID"; break;
919
case STATUS_ENC_TO : s = "ENC_TO"; break;
920
case STATUS_NODATA : s = "NODATA"; break;
921
case STATUS_BAD_PASSPHRASE : s = "BAD_PASSPHRASE"; break;
922
case STATUS_NO_PUBKEY : s = "NO_PUBKEY"; break;
923
case STATUS_NO_SECKEY : s = "NO_SECKEY"; break;
924
case STATUS_NEED_PASSPHRASE_SYM: s = "NEED_PASSPHRASE_SYM"; break;
925
case STATUS_DECRYPTION_FAILED: s = "DECRYPTION_FAILED"; break;
926
case STATUS_DECRYPTION_OKAY: s = "DECRYPTION_OKAY"; break;
927
case STATUS_MISSING_PASSPHRASE: s = "MISSING_PASSPHRASE"; break;
928
case STATUS_GOOD_PASSPHRASE : s = "GOOD_PASSPHRASE"; break;
929
case STATUS_GOODMDC : s = "GOODMDC"; break;
930
case STATUS_BADMDC : s = "BADMDC"; break;
931
case STATUS_ERRMDC : s = "ERRMDC"; break;
932
case STATUS_IMPORTED : s = "IMPORTED"; break;
933
case STATUS_IMPORT_OK : s = "IMPORT_OK"; break;
934
case STATUS_IMPORT_RES : s = "IMPORT_RES"; break;
935
case STATUS_FILE_START : s = "FILE_START"; break;
936
case STATUS_FILE_DONE : s = "FILE_DONE"; break;
937
case STATUS_FILE_ERROR : s = "FILE_ERROR"; break;
938
case STATUS_BEGIN_DECRYPTION:s = "BEGIN_DECRYPTION"; break;
939
case STATUS_END_DECRYPTION : s = "END_DECRYPTION"; break;
940
case STATUS_BEGIN_ENCRYPTION:s = "BEGIN_ENCRYPTION"; break;
941
case STATUS_END_ENCRYPTION : s = "END_ENCRYPTION"; break;
942
case STATUS_DELETE_PROBLEM : s = "DELETE_PROBLEM"; break;
943
case STATUS_PROGRESS : s = "PROGRESS"; break;
944
case STATUS_SIG_CREATED : s = "SIG_CREATED"; break;
945
case STATUS_SESSION_KEY : s = "SESSION_KEY"; break;
946
case STATUS_NOTATION_NAME : s = "NOTATION_NAME" ; break;
947
case STATUS_NOTATION_DATA : s = "NOTATION_DATA" ; break;
948
case STATUS_POLICY_URL : s = "POLICY_URL" ; break;
949
case STATUS_BEGIN_STREAM : s = "BEGIN_STREAM"; break;
950
case STATUS_END_STREAM : s = "END_STREAM"; break;
951
case STATUS_KEY_CREATED : s = "KEY_CREATED"; break;
952
case STATUS_UNEXPECTED : s = "UNEXPECTED"; break;
953
case STATUS_INV_RECP : s = "INV_RECP"; break;
954
case STATUS_NO_RECP : s = "NO_RECP"; break;
955
case STATUS_ALREADY_SIGNED : s = "ALREADY_SIGNED"; break;
956
case STATUS_EXPSIG : s = "EXPSIG"; break;
957
case STATUS_EXPKEYSIG : s = "EXPKEYSIG"; break;
958
case STATUS_TRUNCATED : s = "TRUNCATED"; break;
959
case STATUS_ERROR : s = "ERROR"; break;
960
case STATUS_IMPORT_PROBLEM : s = "IMPORT_PROBLEM"; break;
961
default: s = "?"; break;
968
gpgsm_status2 (CTRL ctrl, int no, ...)
1197
gpgsm_status2 (ctrl_t ctrl, int no, ...)
970
1199
gpg_error_t err = 0;
971
1200
va_list arg_ptr;
1058
1286
return gpgsm_status2 (ctrl, no, buf, NULL);
1063
* Write a status line with a buffer using %XX escapes. If WRAP is >
1064
* 0 wrap the line after this length. If STRING is not NULL it will
1065
* be prepended to the buffer, no escaping is done for string.
1066
* A wrap of -1 forces spaces not to be encoded as %20.
1069
write_status_text_and_buffer ( int no, const char *string,
1070
const char *buffer, size_t len, int wrap )
1290
/* Helper to notify the client about Pinentry events. Because that
1291
might disturb some older clients, this is only done when enabled
1292
via an option. Returns an gpg error code. */
1294
gpgsm_proxy_pinentry_notify (ctrl_t ctrl, const unsigned char *line)
1072
const char *s, *text;
1074
int lower_limit = ' ';
1075
size_t n, count, dowrap;
1078
return; /* not enabled */
1085
text = get_status_string (no);
1086
count = dowrap = first = 1;
1089
fprintf (statusfp, "[GNUPG:] %s ", text );
1091
if (first && string) {
1092
fputs (string, statusfp);
1093
count += strlen (string);
1097
for (esc=0, s=buffer, n=len; n && !esc; s++, n-- ) {
1098
if ( *s == '%' || *(const byte*)s <= lower_limit
1099
|| *(const byte*)s == 127 )
1101
if ( wrap && ++count > wrap ) {
1110
fwrite (buffer, s-buffer, 1, statusfp );
1112
fprintf (statusfp, "%%%02X", *(const unsigned char*)s );
1117
if ( dowrap && len )
1118
putc ( '\n', statusfp );
1121
putc ('\n',statusfp);
1296
if (!ctrl || !ctrl->server_local
1297
|| !ctrl->server_local->allow_pinentry_notify)
1299
return assuan_inquire (ctrl->server_local->assuan_ctx, line, NULL, NULL, 0);