static void signkey(const char *signthis, const char *signwith, const char *trustlevel) { int rc; FILE *fp=NULL; int n=atoi(trustlevel); if (n < 0 || n > 9) n=0; if (gpgbadarg(signthis) || gpgbadarg(signwith)) return; gpginiterr(); fp=passphrasefp(); rc=libmail_gpg_signkey(GPGDIR, signthis, signwith, fp ? fileno(fp):-1, gpg_error, n, NULL); if (fp) fclose(fp); if (rc) { printf("<div class=\"indent\">%s\n", getarg("SIGNFAIL")); dump_error(); printf("</div>\n"); } }
int gpgdecode(int in_fd, int out_fd) { char passfd_buf[NUMBUFSIZE]; FILE *fp=passphrasefp(); int in_dup, out_dup; FILE *in_fp, *out_fp; struct libmail_gpg_info gi; char *argvec[2]; int i; gpginiterr(); if ((in_dup=dup(in_fd)) < 0 || (in_fp=fdopen(in_dup, "r")) == NULL) { if (in_dup >= 0) close(in_dup); fclose(fp); enomem(); return 1; } if ((out_dup=dup(out_fd)) < 0 || (out_fp=fdopen(out_dup, "w")) == NULL) { if (out_dup >= 0) close(out_dup); fclose(in_fp); close(in_dup); fclose(fp); enomem(); return 1; } memset(&gi, 0, sizeof(gi)); gi.gnupghome=GPGDIR; if (fp) { gi.passphrase_fd=libmail_str_size_t(fileno(fp), passfd_buf); } gi.input_func= read_fd; gi.input_func_arg= in_fp; gi.output_func= write_fd; gi.output_func_arg= out_fp; gi.errhandler_func= gpg_error_save; gi.errhandler_arg= NULL; argvec[0] = "--no-tty"; argvec[1]=NULL; gi.argc=1; gi.argv=argvec; i=libmail_gpg_decode(LIBMAIL_GPG_UNENCRYPT|LIBMAIL_GPG_CHECKSIGN, &gi); fclose(out_fp); close(out_dup); fclose(in_fp); close(in_dup); if (fp) fclose(fp); if (i) { printf("<div class=\"indent\"><pre style=\"color: red;\">"); sent_gpgerrtxt(); printf("</pre></div>\n"); } return (i); }
int gpgdomsg(int in_fd, int out_fd, const char *signkey, const char *encryptkeys) { char *k=strdup(encryptkeys ? encryptkeys:""); int n; int i; char *p; char **argvec; FILE *passfd=NULL; char passfd_buf[NUMBUFSIZE]; struct libmail_gpg_info gi; int in_dup, out_dup; FILE *in_fp, *out_fp; gpginiterr(); if (!k) { enomem(); return 1; } if ((in_dup=dup(in_fd)) < 0 || (in_fp=fdopen(in_dup, "r")) == NULL) { if (in_dup >= 0) close(in_dup); free(k); enomem(); return 1; } if ((out_dup=dup(out_fd)) < 0 || (out_fp=fdopen(out_dup, "w")) == NULL) { if (out_dup >= 0) close(out_dup); fclose(in_fp); close(in_dup); free(k); enomem(); return 1; } passfd=passphrasefp(); n=0; for (p=k; (p=strtok(p, " ")) != NULL; p=NULL) ++n; argvec=malloc((n * 2 + 22)*sizeof(char *)); if (!argvec) { fclose(out_fp); close(out_dup); fclose(in_fp); close(in_dup); free(k); enomem(); return 1; } memset(&gi, 0, sizeof(gi)); gi.gnupghome=GPGDIR; if (passfd) { gi.passphrase_fd=libmail_str_size_t(fileno(passfd), passfd_buf); } gi.input_func= read_fd; gi.input_func_arg= in_fp; gi.output_func= write_fd; gi.output_func_arg= out_fp; gi.errhandler_func= gpg_error_save; gi.errhandler_arg= NULL; i=0; argvec[i++] = "--no-tty"; if (signkey) { argvec[i++]="--default-key"; argvec[i++]=(char *)signkey; } argvec[i++]="--always-trust"; for (p=strcpy(k, encryptkeys ? encryptkeys:""); (p=strtok(p, " ")) != NULL; p=NULL) { argvec[i++]="-r"; argvec[i++]=p; } argvec[i]=0; gi.argc=i; gi.argv=argvec; i=libmail_gpg_signencode(signkey ? 1:0, n > 0 ? LIBMAIL_GPG_ENCAPSULATE:0, &gi); free(argvec); fclose(out_fp); close(out_dup); fclose(in_fp); close(in_dup); free(k); if (passfd) fclose(passfd); return i; }
int gpgdecode(int in_fd, int out_fd) { pid_t pid; int stderrfd[2]; int rc; if (pipe(stderrfd)) { enomem(); } pid=fork(); if (pid < 0) { close(stderrfd[0]); close(stderrfd[1]); enomem(); } if (pid == 0) { FILE *fp=passphrasefp(); char *argvec[20]; int i; char passfd_buf[NUMBUFSIZE]; close(0); dup(in_fd); close(1); dup(out_fd); close(in_fd); close(out_fd); close(2); dup(stderrfd[1]); close(stderrfd[1]); close(stderrfd[0]); argvec[0]=MIMEGPG; argvec[1]="-c"; argvec[2]="-d"; i=3; if (fp) { argvec[i++]="-p"; argvec[i++]=libmail_str_size_t(fileno(fp), passfd_buf); } argvec[i++]="--"; argvec[i++]="--no-tty"; argvec[i]=0; putenv("GNUPGHOME=" GPGDIR); execv(MIMEGPG, argvec); perror(MIMEGPG); exit(1); } close (stderrfd[1]); rc=wait_mimegpg(pid, stderrfd[0]); if (rc) { printf("<blockquote><pre style=\"color: red;\">"); sent_gpgerrtxt(); printf("</pre></blockquote>\n"); } return (rc); }