31 |
|
|
32 |
struct gpg_struct { |
struct gpg_struct { |
33 |
int inited; |
int inited; |
34 |
char *keys; |
char *sign_keys; |
35 |
|
char *encryption_keys; |
36 |
char *passphrase; |
char *passphrase; |
37 |
}; |
}; |
38 |
|
|
109 |
memset(buf, 0, sizeof(buf)); |
memset(buf, 0, sizeof(buf)); |
110 |
fail_if_err(gpgme_new(&ctx)); |
fail_if_err(gpgme_new(&ctx)); |
111 |
|
|
112 |
if (gpg.keys) { |
if (gpg.sign_keys) { |
113 |
err = gpgme_op_keylist_start(ctx, gpg.keys, 0); |
err = gpgme_op_keylist_start(ctx, gpg.sign_keys, 0); |
114 |
if (!err) { |
if (!err) { |
115 |
while ((err = gpgme_op_keylist_next(ctx, &key)) == 0) |
while ((err = gpgme_op_keylist_next(ctx, &key)) == 0) |
116 |
err = gpgme_signers_add(ctx, key); |
err = gpgme_signers_add(ctx, key); |
117 |
} |
} |
118 |
if (err && err != GPGME_EOF) { |
if (err && err != GPGME_EOF) { |
119 |
anubis_error(HARD, _("GPGME: cannot list keys: %s"), |
anubis_error(HARD, _("GPGME: Cannot list keys: %s"), |
120 |
gpgme_strerror(err)); |
gpgme_strerror(err)); |
121 |
topt |= T_ERROR; |
topt |= T_ERROR; |
122 |
} |
} |
193 |
fail_if_err(gpgme_data_new(&out)); |
fail_if_err(gpgme_data_new(&out)); |
194 |
fail_if_err(gpgme_recipients_new(&rset)); |
fail_if_err(gpgme_recipients_new(&rset)); |
195 |
|
|
196 |
len = strlen(gpg.keys); |
len = strlen(gpg.encryption_keys); |
197 |
for (i = 0; i <= len; i++) |
for (i = 0; i <= len; i++) |
198 |
{ |
{ |
199 |
if (gpg.keys[i] == ',') { /* comma found, so add KEY-ID */ |
if (gpg.encryption_keys[i] == ',' |
200 |
|
|| gpg.encryption_keys[i] == '\0') { |
201 |
fail_if_err(gpgme_recipients_add_name_with_validity(rset, |
fail_if_err(gpgme_recipients_add_name_with_validity(rset, |
202 |
current_key, GPGME_VALIDITY_FULL)); |
current_key, GPGME_VALIDITY_FULL)); |
203 |
memset(current_key, 0, sizeof(current_key)); |
memset(current_key, 0, sizeof(current_key)); |
204 |
j = 0; |
j = 0; |
205 |
} |
} |
206 |
else /* it is not a comma, so add char to KEY_ID string */ |
else |
207 |
current_key[j++] = gpg.keys[i]; |
current_key[j++] = gpg.encryption_keys[i]; |
208 |
} |
} |
209 |
fail_if_err(gpgme_op_encrypt(ctx, rset, in, out)); |
fail_if_err(gpgme_op_encrypt(ctx, rset, in, out)); |
210 |
fail_if_err(gpgme_data_rewind(out)); |
fail_if_err(gpgme_data_rewind(out)); |
266 |
|
|
267 |
fail_if_err(gpgme_new(&ctx)); |
fail_if_err(gpgme_new(&ctx)); |
268 |
|
|
269 |
if (gpg.keys) { |
if (gpg.sign_keys) { |
270 |
err = gpgme_op_keylist_start(ctx, gpg.keys, 0); |
err = gpgme_op_keylist_start(ctx, gpg.sign_keys, 0); |
271 |
if (!err) { |
if (!err) { |
272 |
while ((err = gpgme_op_keylist_next(ctx, &key)) == 0) |
while ((err = gpgme_op_keylist_next(ctx, &key)) == 0) |
273 |
err = gpgme_signers_add(ctx, key); |
err = gpgme_signers_add(ctx, key); |
274 |
} |
} |
275 |
if (err && err != GPGME_EOF) { |
if (err && err != GPGME_EOF) { |
276 |
anubis_error(HARD, _("GPGME: cannot list keys: %s"), |
anubis_error(HARD, _("GPGME: Cannot list keys: %s"), |
277 |
gpgme_strerror(err)); |
gpgme_strerror(err)); |
278 |
topt |= T_ERROR; |
topt |= T_ERROR; |
279 |
} |
} |
289 |
fail_if_err(gpgme_data_new(&out)); |
fail_if_err(gpgme_data_new(&out)); |
290 |
fail_if_err(gpgme_recipients_new(&rset)); |
fail_if_err(gpgme_recipients_new(&rset)); |
291 |
|
|
292 |
len = strlen(gpg.keys); |
len = strlen(gpg.encryption_keys); |
293 |
for (i = 0; i <= len; i++) |
for (i = 0; i <= len; i++) |
294 |
{ |
{ |
295 |
if (gpg.keys[i] == ',') { /* comma found, so add KEY-ID */ |
if (gpg.encryption_keys[i] == ',' |
296 |
|
|| gpg.encryption_keys[i] == '\0') { |
297 |
fail_if_err(gpgme_recipients_add_name_with_validity(rset, |
fail_if_err(gpgme_recipients_add_name_with_validity(rset, |
298 |
current_key, GPGME_VALIDITY_FULL)); |
current_key, GPGME_VALIDITY_FULL)); |
299 |
memset(current_key, 0, sizeof(current_key)); |
memset(current_key, 0, sizeof(current_key)); |
300 |
j = 0; |
j = 0; |
301 |
} |
} |
302 |
else /* it is not a comma, so add char to KEY_ID string */ |
else |
303 |
current_key[j++] = gpg.keys[i]; |
current_key[j++] = gpg.encryption_keys[i]; |
304 |
} |
} |
305 |
fail_if_err(gpgme_op_encrypt_sign(ctx, rset, in, out)); |
fail_if_err(gpgme_op_encrypt_sign(ctx, rset, in, out)); |
306 |
fail_if_err(gpgme_data_rewind(out)); |
fail_if_err(gpgme_data_rewind(out)); |
373 |
memset(gpg.passphrase, 0, strlen(gpg.passphrase)); |
memset(gpg.passphrase, 0, strlen(gpg.passphrase)); |
374 |
xfree(gpg.passphrase); |
xfree(gpg.passphrase); |
375 |
} |
} |
376 |
xfree(gpg.keys); |
xfree(gpg.sign_keys); |
377 |
|
xfree(gpg.encryption_keys); |
378 |
} |
} |
379 |
|
|
380 |
#define KW_GPG_PASSPHRASE 1 |
#define KW_GPG_PASSPHRASE 1 |
395 |
xfree(gpg.passphrase); |
xfree(gpg.passphrase); |
396 |
} |
} |
397 |
gpg.passphrase = strdup(arg); |
gpg.passphrase = strdup(arg); |
398 |
|
arg = NULL; |
399 |
break; |
break; |
400 |
|
|
401 |
case KW_GPG_ENCRYPT: |
case KW_GPG_ENCRYPT: |
402 |
xfree(gpg.keys); |
xfree(gpg.encryption_keys); |
403 |
gpg.keys = allocbuf(arg, 0); |
gpg.encryption_keys = allocbuf(arg, 0); |
|
gpg.keys = xrealloc(gpg.keys, strlen(gpg.keys) + 2); |
|
|
strcat(gpg.keys, ","); |
|
404 |
if (gpg.inited == 0 && gpgme_init()) |
if (gpg.inited == 0 && gpgme_init()) |
405 |
break; |
break; |
406 |
gpg_proc(msg, gpg_encrypt); |
gpg_proc(msg, gpg_encrypt); |
408 |
|
|
409 |
case KW_GPG_SIGN: |
case KW_GPG_SIGN: |
410 |
if (strcasecmp(arg, "no")) { |
if (strcasecmp(arg, "no")) { |
411 |
xfree(gpg.keys); |
xfree(gpg.sign_keys); |
412 |
if (strcasecmp(arg, "yes")) |
if (strcasecmp(arg, "default") && strcasecmp(arg, "yes")) |
413 |
gpg.keys = strdup(arg); |
gpg.sign_keys = strdup(arg); |
414 |
if (gpg.inited == 0 && gpgme_init()) |
if (gpg.inited == 0 && gpgme_init()) |
415 |
break; |
break; |
416 |
gpg_proc(msg, gpg_sign); |
gpg_proc(msg, gpg_sign); |
417 |
} |
} |
418 |
break; |
break; |
419 |
|
|
420 |
case KW_GPG_SIGN_ENCRYPT: |
case KW_GPG_SIGN_ENCRYPT: { |
421 |
xfree(gpg.keys); |
char *p = strchr(arg, ':'); |
422 |
gpg.keys = allocbuf(arg, 0); |
xfree(gpg.encryption_keys); |
423 |
gpg.keys = xrealloc(gpg.keys, strlen(gpg.keys) + 2); |
if (p) { |
424 |
strcat(gpg.keys, ","); |
p++; |
425 |
|
if (strcasecmp(p, "default") && strcasecmp(p, "yes")) { |
426 |
|
xfree(gpg.sign_keys); |
427 |
|
gpg.sign_keys = allocbuf(p, 0); |
428 |
|
} |
429 |
|
*--p = '\0'; |
430 |
|
gpg.encryption_keys = allocbuf(arg, 0); |
431 |
|
} |
432 |
|
else |
433 |
|
gpg.encryption_keys = allocbuf(arg, 0); |
434 |
|
|
435 |
if (gpg.inited == 0 && gpgme_init()) |
if (gpg.inited == 0 && gpgme_init()) |
436 |
break; |
break; |
437 |
gpg_proc(msg, gpg_sign_encrypt); |
gpg_proc(msg, gpg_sign_encrypt); |
438 |
|
} |
439 |
break; |
break; |
440 |
|
|
441 |
case KW_GPG_HOME: |
case KW_GPG_HOME: |
454 |
{ "gpg-encrypt", KW_GPG_ENCRYPT }, |
{ "gpg-encrypt", KW_GPG_ENCRYPT }, |
455 |
{ "gpg-sign", KW_GPG_SIGN }, |
{ "gpg-sign", KW_GPG_SIGN }, |
456 |
{ "gpg-sign-encrypt", KW_GPG_SIGN_ENCRYPT }, |
{ "gpg-sign-encrypt", KW_GPG_SIGN_ENCRYPT }, |
457 |
|
{ "gpg-se", KW_GPG_SIGN_ENCRYPT }, |
458 |
{ "gpg-home", KW_GPG_HOME }, |
{ "gpg-home", KW_GPG_HOME }, |
459 |
{ NULL }, |
{ NULL }, |
460 |
}; |
}; |