2002-02-27  Marcus Brinkmann  <marcus@g10code.de>

	* gpgme.texi (Encrypting a Plaintext): Document
	GPGME_Invalid_Recipients.
	(Error Values): Likewise.

gpgme/
2002-02-27  Marcus Brinkmann  <marcus@g10code.de>

	* gpgme.h: Add new error code GPGME_Invalid_Recipient.
	* encrypt.c (struct encrypt_result_s): New member invalid_recipients,
	rename no_recipients to no_valid_recipients.
	(_gpgme_encrypt_status_handler): Include error for invalid
	recipients.
	* engine-gpgsm.c (gpgsm_set_recipients): Change type of first
	argument to GpgsmObject.  Use that to report back the status about
	the recipients.
This commit is contained in:
Marcus Brinkmann 2002-02-26 23:39:58 +00:00
parent 85c7100872
commit 31b2a458ff
7 changed files with 89 additions and 38 deletions

8
NEWS
View File

@ -6,8 +6,16 @@
* New interfaces gpgme_op_encrypt_sign and gpgme_op_encrypt_sign_start * New interfaces gpgme_op_encrypt_sign and gpgme_op_encrypt_sign_start
to encrypt and sign a message in a combined operation. to encrypt and sign a message in a combined operation.
* gpgme_op_encrypt does now fail with GPGME_Invalid_Recipients if
some recipients have been invalid, whereas earlier versions
succeeded in this case. The plaintext is still encrypted for all valid
recipients, so the application might take this error as a hint that
the ciphertext is not usable for all requested recipients.
Information about invalid recipients is available with gpgme_get_op_info.
* Interface changes relative to the 0.3.3 release: * Interface changes relative to the 0.3.3 release:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
gpgme_op_encrypt CHANGED: Can fail with GPGME_Invalid_Recipients
gpgme_set_include_certs NEW gpgme_set_include_certs NEW
gpgme_get_include_certs NEW gpgme_get_include_certs NEW
gpgme_op_encrypt_sign NEW gpgme_op_encrypt_sign NEW

View File

@ -1,3 +1,9 @@
2002-02-27 Marcus Brinkmann <marcus@g10code.de>
* gpgme.texi (Encrypting a Plaintext): Document
GPGME_Invalid_Recipients.
(Error Values): Likewise.
2002-02-26 Marcus Brinkmann <marcus@g10code.de> 2002-02-26 Marcus Brinkmann <marcus@g10code.de>
* gpgme.texi (Encrypting a Plaintext): Document * gpgme.texi (Encrypting a Plaintext): Document

View File

@ -615,7 +615,11 @@ This value means that there are too many active backend processes.
This value means that the creation of a pipe failed. This value means that the creation of a pipe failed.
@item GPGME_No_Recipients @item GPGME_No_Recipients
This value means that no recipients for a message have been set. This value means that no valid recipients for a message have been set.
@item GPGME_Invalid_Recipients
This value means that some, but not all, recipients for a message have
been invalid.
@item GPGME_No_Data @item GPGME_No_Data
This value means that a @code{GpgmeData} object which was expected to This value means that a @code{GpgmeData} object which was expected to
@ -2207,16 +2211,20 @@ ciphertext in the data object @var{cipher}. The type of the
ciphertext created is determined by the @acronym{ASCII} armor and text ciphertext created is determined by the @acronym{ASCII} armor and text
mode attributes set for the context @var{ctx}. mode attributes set for the context @var{ctx}.
More information about the encrypted text is available with If @code{GPGME_Invalid_Recipients} is returned, some recipients in
@var{rset} are invalid, but not all. In this case the plaintext is
encrypted for all valid recipients and returned in @var{cipher}. More
information about the invalid recipients is available with
@code{gpgme_get_op_info}. @xref{Detailed Results}. @code{gpgme_get_op_info}. @xref{Detailed Results}.
The function returns @code{GPGME_No_Error} if the ciphertext could be The function returns @code{GPGME_No_Error} if the ciphertext could be
created successfully, @code{GPGME_Invalid_Value} if @var{ctx}, created successfully, @code{GPGME_Invalid_Value} if @var{ctx},
@var{rset}, @var{plain} or @var{cipher} is not a valid pointer, @var{rset}, @var{plain} or @var{cipher} is not a valid pointer,
@code{GPGME_No_Recipient} if @var{rset} does not contain any @code{GPGME_No_Recipients} if @var{rset} does not contain any valid
valid recipients, @code{GPGME_No_Passphrase} if the passphrase for the recipients, @code{GPGME_Invalid_Recipients} if @var{rset} contains
secret key could not be retrieved, and passes through any errors that some invalid recipients, @code{GPGME_No_Passphrase} if the passphrase
are reported by the crypto engine support routines. for the secret key could not be retrieved, and passes through any
errors that are reported by the crypto engine support routines.
@end deftypefun @end deftypefun
@deftypefun GpgmeError gpgme_op_encrypt_start (@w{GpgmeCtx @var{ctx}}, @w{GpgmeRecipients @var{rset}}, @w{GpgmeData @var{plain}}, @w{GpgmeData @var{cipher}}) @deftypefun GpgmeError gpgme_op_encrypt_start (@w{GpgmeCtx @var{ctx}}, @w{GpgmeRecipients @var{rset}}, @w{GpgmeData @var{plain}}, @w{GpgmeData @var{cipher}})
@ -2227,7 +2235,7 @@ The function @code{gpgme_op_encrypt_start} initiates a
The function returns @code{GPGME_No_Error} if the operation could be The function returns @code{GPGME_No_Error} if the operation could be
started successfully, @code{GPGME_Invalid_Value} if @var{ctx}, started successfully, @code{GPGME_Invalid_Value} if @var{ctx},
@var{rset}, @var{plain} or @var{cipher} is not a valid pointer, and @var{rset}, @var{plain} or @var{cipher} is not a valid pointer, and
@code{GPGME_No_Recipient} if @var{rset} does not contain any valid @code{GPGME_No_Recipients} if @var{rset} does not contain any valid
recipients. recipients.
@end deftypefun @end deftypefun
@ -2251,7 +2259,7 @@ Completion}.
The function returns @code{GPGME_No_Error} if the operation could be The function returns @code{GPGME_No_Error} if the operation could be
started successfully, @code{GPGME_Invalid_Value} if @var{ctx}, started successfully, @code{GPGME_Invalid_Value} if @var{ctx},
@var{rset}, @var{plain} or @var{cipher} is not a valid pointer, and @var{rset}, @var{plain} or @var{cipher} is not a valid pointer, and
@code{GPGME_No_Recipient} if @var{rset} does not contain any valid @code{GPGME_No_Recipients} if @var{rset} does not contain any valid
recipients. recipients.
@end deftypefun @end deftypefun

View File

@ -1,3 +1,14 @@
2002-02-27 Marcus Brinkmann <marcus@g10code.de>
* gpgme.h: Add new error code GPGME_Invalid_Recipient.
* encrypt.c (struct encrypt_result_s): New member invalid_recipients,
rename no_recipients to no_valid_recipients.
(_gpgme_encrypt_status_handler): Include error for invalid
recipients.
* engine-gpgsm.c (gpgsm_set_recipients): Change type of first
argument to GpgsmObject. Use that to report back the status about
the recipients.
2002-02-26 Marcus Brinkmann <marcus@g10code.de> 2002-02-26 Marcus Brinkmann <marcus@g10code.de>
* verify.c (_gpgme_verify_status_handler): Fix the last change. * verify.c (_gpgme_verify_status_handler): Fix the last change.

View File

@ -38,7 +38,8 @@
struct encrypt_result_s struct encrypt_result_s
{ {
int no_recipients; int no_valid_recipients;
int invalid_recipients;
GpgmeData xmlinfo; GpgmeData xmlinfo;
}; };
@ -113,16 +114,19 @@ _gpgme_encrypt_status_handler (GpgmeCtx ctx, GpgStatusCode code, char *args)
_gpgme_set_op_info (ctx, ctx->result.encrypt->xmlinfo); _gpgme_set_op_info (ctx, ctx->result.encrypt->xmlinfo);
ctx->result.encrypt->xmlinfo = NULL; ctx->result.encrypt->xmlinfo = NULL;
} }
if (ctx->result.encrypt->no_recipients) if (ctx->result.encrypt->no_valid_recipients)
ctx->error = mk_error (No_Recipients); ctx->error = mk_error (No_Recipients);
else if (ctx->result.encrypt->invalid_recipients)
ctx->error = mk_error (Invalid_Recipients);
break; break;
case STATUS_INV_RECP: case STATUS_INV_RECP:
ctx->result.encrypt->invalid_recipients++;
append_xml_encinfo (&ctx->result.encrypt->xmlinfo, args); append_xml_encinfo (&ctx->result.encrypt->xmlinfo, args);
break; break;
case STATUS_NO_RECP: case STATUS_NO_RECP:
ctx->result.encrypt->no_recipients = 1; /* i.e. no usable ones */ ctx->result.encrypt->no_valid_recipients = 1;
break; break;
default: default:

View File

@ -423,12 +423,14 @@ _gpgme_gpgsm_op_delete (GpgsmObject gpgsm, GpgmeKey key, int allow_secret)
static GpgmeError static GpgmeError
gpgsm_set_recipients (ASSUAN_CONTEXT ctx, GpgmeRecipients recp) gpgsm_set_recipients (GpgsmObject gpgsm, GpgmeRecipients recp)
{ {
GpgmeError err; GpgmeError err;
ASSUAN_CONTEXT ctx = gpgsm->assuan_ctx;
char *line; char *line;
int linelen; int linelen;
struct user_id_s *r; struct user_id_s *r;
int valid_recipients = 0;
linelen = 10 + 40 + 1; /* "RECIPIENT " + guess + '\0'. */ linelen = 10 + 40 + 1; /* "RECIPIENT " + guess + '\0'. */
line = xtrymalloc (10 + 40 + 1); line = xtrymalloc (10 + 40 + 1);
@ -452,13 +454,24 @@ gpgsm_set_recipients (ASSUAN_CONTEXT ctx, GpgmeRecipients recp)
strcpy (&line[10], r->name); strcpy (&line[10], r->name);
err = gpgsm_assuan_simple_command (ctx, line); err = gpgsm_assuan_simple_command (ctx, line);
if (err) if (!err)
valid_recipients = 1;
else if (err == GPGME_Invalid_Key && gpgsm->status.fnc)
{
/* FIXME: Include other reasons. */
line[8] = '0'; /* FIXME: Report detailed reason. */
gpgsm->status.fnc (gpgsm->status.fnc_value, STATUS_INV_RECP, &line[8]);
line[8] = 'T';
}
else if (err != GPGME_Invalid_Key)
{ {
xfree (line); xfree (line);
return err; return err;
} }
} }
xfree (line); xfree (line);
if (!valid_recipients && gpgsm->status.fnc)
gpgsm->status.fnc (gpgsm->status.fnc_value, STATUS_NO_RECP, "");
return 0; return 0;
} }
@ -487,7 +500,7 @@ _gpgme_gpgsm_op_encrypt (GpgsmObject gpgsm, GpgmeRecipients recp,
return err; return err;
_gpgme_io_close (gpgsm->message_fd); _gpgme_io_close (gpgsm->message_fd);
err = gpgsm_set_recipients (gpgsm->assuan_ctx, recp); err = gpgsm_set_recipients (gpgsm, recp);
if (err) if (err)
return err; return err;

View File

@ -73,30 +73,31 @@ typedef struct gpgme_trust_item_s *GpgmeTrustItem;
/* The error numbers used by GPGME. */ /* The error numbers used by GPGME. */
typedef enum typedef enum
{ {
GPGME_EOF = -1, GPGME_EOF = -1,
GPGME_No_Error = 0, GPGME_No_Error = 0,
GPGME_General_Error = 1, GPGME_General_Error = 1,
GPGME_Out_Of_Core = 2, GPGME_Out_Of_Core = 2,
GPGME_Invalid_Value = 3, GPGME_Invalid_Value = 3,
GPGME_Busy = 4, GPGME_Busy = 4,
GPGME_No_Request = 5, GPGME_No_Request = 5,
GPGME_Exec_Error = 6, GPGME_Exec_Error = 6,
GPGME_Too_Many_Procs = 7, GPGME_Too_Many_Procs = 7,
GPGME_Pipe_Error = 8, GPGME_Pipe_Error = 8,
GPGME_No_Recipients = 9, GPGME_No_Recipients = 9,
GPGME_No_Data = 10, GPGME_No_Data = 10,
GPGME_Conflict = 11, GPGME_Conflict = 11,
GPGME_Not_Implemented = 12, GPGME_Not_Implemented = 12,
GPGME_Read_Error = 13, GPGME_Read_Error = 13,
GPGME_Write_Error = 14, GPGME_Write_Error = 14,
GPGME_Invalid_Type = 15, GPGME_Invalid_Type = 15,
GPGME_Invalid_Mode = 16, GPGME_Invalid_Mode = 16,
GPGME_File_Error = 17, /* errno is set in this case. */ GPGME_File_Error = 17, /* errno is set in this case. */
GPGME_Decryption_Failed = 18, GPGME_Decryption_Failed = 18,
GPGME_No_Passphrase = 19, GPGME_No_Passphrase = 19,
GPGME_Canceled = 20, GPGME_Canceled = 20,
GPGME_Invalid_Key = 21, GPGME_Invalid_Key = 21,
GPGME_Invalid_Engine = 22 GPGME_Invalid_Engine = 22,
GPGME_Invalid_Recipients = 23
} }
GpgmeError; GpgmeError;