diff options
| author | Marcus Brinkmann <[email protected]> | 2003-05-28 01:15:38 +0000 | 
|---|---|---|
| committer | Marcus Brinkmann <[email protected]> | 2003-05-28 01:15:38 +0000 | 
| commit | bade4a32b525c3e84cd6a74f1e8d2364322b8526 (patch) | |
| tree | f2f64339e88f04a6ae587038d1326a9e8be4b1d7 | |
| parent | 2003-05-27 Marcus Brinkmann <[email protected]> (diff) | |
| download | gpgme-bade4a32b525c3e84cd6a74f1e8d2364322b8526.tar.gz gpgme-bade4a32b525c3e84cd6a74f1e8d2364322b8526.zip | |
doc/
2003-05-28  Marcus Brinkmann  <[email protected]>
	* gpgme.texi (Exporting Keys): Change argument type from
	gpgme_recipient_t to gpgme_user_id_t.
	(Encrypting a Plaintext): Likewise.
	(Selecting Recipients): Rewritten.
gpgme/
2003-05-28  Marcus Brinkmann  <[email protected]>
	* Makefile.am (libgpgme_la_SOURCES): Remove recipient.c, add
	user-id.c.
	* gpgme.h (gpgme_recipients_t): Removed.
	(gpgme_recipients_new, gpgme_recipients_release,
	gpgme_recipients_add_name,
	gpgme_recipients_add_name_with_validity, gpgme_recipients_count,
	gpgme_recipients_enum_open, gpgme_recipients_enum_read,
	gpgme_recipients_enum_close): Removed.
	(gpgme_op_encrypt, gpgme_op_encrypt_start, gpgme_op_encrypt_sign,
	gpgme_op_encrypt_sign_start, gpgme_op_export_start,
	gpgme_op_export): Change second argument to gpgme_user_id_t.
	(gpgme_user_ids_release): New prototype.
	(gpgme_user_ids_append): Likewise.
	* ops.h (_gpgme_recipients_all_valid): Remove.
	(_gpgme_user_ids_all_valid): Add.
	* context.h (struct gpgme_recipients): Removed.
	* user-id.c: New file.
	* recipient.c: Removed file.
	* rungpg.c (append_args_from_recipients): Change last arg to
	gpgme_user_id_t.  Reimplement.
	(gpg_encrypt): Change second arg to gpgme_user_id_t.
	(gpg_encrypt_sign): Likewise.
	(gpg_export): Likewise.  Rewrite user ID list code.
	* engine.c (_gpgme_engine_op_encrypt): Change second arg to
	gpgme_user_id_t.
	(_gpgme_engine_op_encrypt_sign): Likewise.
	(_gpgme_engine_op_export): Likewise.
	* engine.h (_gpgme_engine_op_encrypt, _gpgme_engine_op_encrypt_sign,
	_gpgme_engine_op_export): Likewise.
	* engine-gpgsm.c (set_recipients): Likewise.  Rewrite loop code.
	(gpgsm_encrypt): Likewise.
	(gpgsm_export): Likewise.
	* engine-backend.h (struct engine_ops): Likewise for members
	ENCRYPT, ENCRYPT_SIGN and EXPORT.
	* export.c (export_start, gpgme_op_export_start, gpgme_op_export):
	Likewise.
	* encrypt.c (encrypt_start): Likewise.  Don't check for count of
	recipients.
	(gpgme_op_encrypt_start): Likewise.
	(gpgme_op_encrypt): Likewise.
	* encrypt-sign.c (encrypt_sign_start): Likewise.
	(gpgme_op_encrypt_sign): Likewise.
	(gpgme_op_encrypt_sign_start): Likewise.
tests/
2003-05-28  Marcus Brinkmann  <[email protected]>
	* gpg/t-eventloop.c (main): Rewrite recipient management.
	* gpg/t-encrypt-sign.c (main): Likewise.
	* gpg/t-encrypt.c (main): Likewise.
	* gpg/t-export.c (main): Likewise.
Diffstat (limited to '')
| -rw-r--r-- | NEWS | 52 | ||||
| -rw-r--r-- | TODO | 13 | ||||
| -rw-r--r-- | doc/ChangeLog | 7 | ||||
| -rw-r--r-- | doc/gpgme.texi | 123 | ||||
| -rw-r--r-- | gpgme/ChangeLog | 46 | ||||
| -rw-r--r-- | gpgme/Makefile.am | 2 | ||||
| -rw-r--r-- | gpgme/context.h | 9 | ||||
| -rw-r--r-- | gpgme/encrypt-sign.c | 6 | ||||
| -rw-r--r-- | gpgme/encrypt.c | 8 | ||||
| -rw-r--r-- | gpgme/engine-backend.h | 6 | ||||
| -rw-r--r-- | gpgme/engine-gpgsm.c | 49 | ||||
| -rw-r--r-- | gpgme/engine.c | 9 | ||||
| -rw-r--r-- | gpgme/engine.h | 6 | ||||
| -rw-r--r-- | gpgme/export.c | 14 | ||||
| -rw-r--r-- | gpgme/gpgme.h | 61 | ||||
| -rw-r--r-- | gpgme/ops.h | 6 | ||||
| -rw-r--r-- | gpgme/recipient.c | 163 | ||||
| -rw-r--r-- | gpgme/rungpg.c | 29 | ||||
| -rw-r--r-- | gpgme/signers.c | 5 | ||||
| -rw-r--r-- | gpgme/user-id.c | 91 | ||||
| -rw-r--r-- | tests/ChangeLog | 7 | ||||
| -rw-r--r-- | tests/gpg/t-encrypt-sign.c | 21 | ||||
| -rw-r--r-- | tests/gpg/t-encrypt.c | 17 | ||||
| -rw-r--r-- | tests/gpg/t-eventloop.c | 101 | ||||
| -rw-r--r-- | tests/gpg/t-export.c | 121 | 
25 files changed, 459 insertions, 513 deletions
| @@ -22,7 +22,7 @@ Noteworthy changes in version 0.4.1 (unreleased)   structs rather than by XML structs or in other ways.   Objects which used to be opaque (for example a key) are now pointers - accessible structs, so no accessor functions are necessary. + to accessible structs, so no accessor functions are necessary.   Backward compatibility is provided where it was possible without too   much effort and did not collide with the overall sanitization effort. @@ -46,7 +46,6 @@ Noteworthy changes in version 0.4.1 (unreleased)     Old name:		New name:     GpgmeCtx		gpgme_ctx_t     GpgmeData		gpgme_data_t -   GpgmeRecipients	gpgme_recipients_t     GpgmeError		gpgme_error_t     GpgmeDataEncoding	gpgme_data_encoding_t     GpgmeSigStat		gpgme_sig_stat_t @@ -96,6 +95,37 @@ Noteworthy changes in version 0.4.1 (unreleased)     The user is expected to write the response to the file descriptor,     followed by a newline. + * The recipients interface has been removed and replaced by a more +   generic and light gpgme_user_ids_* interface, which only provides +   two functions: gpgme_user_ids_append adds a new user ID at the end +   of the linked list, and gpgme_user_ids_release releases all user +   IDs in the linked list.  The resulting user ID object is free for +   the user to change (note however that gpgme_user_ids_release only +   releases resources allocated by GPGME). + +   This change propagates to the prototypes of gpgme_op_encrypt, +   gpgme_op_encrypt_start, gpgme_op_encrypt_sign and +   gpgme_op_encrypt_sign_start.  Also the prototypes of +   gpgme_op_export_start and gpgme_op_export finally make sense. + +   Here is an example how to use the new interface: + +   gpgme_user_id_t rset = NULL; +   gpgme_user_id_t *rset_lastp = &rset; + +   err = gpgme_user_ids_append (rset_lastp, "Alpha"); +   fail_if_err (err); +   (*rset_lastp)->validity = GPGME_VALIDITY_FULL; + +   rset_lastp = &(*rset_lastp)->next; +   err = gpgme_user_ids_append (rset_lastp, "Bob"); +   fail_if_err (err); +   (*rset_lastp)->validity = GPGME_VALIDITY_FULL; + +   [...] + +   gpgme_user_ids_release (rset); +   * gpgme_op_verify and gpgme_op_decrypt_verify don't return a status     summary anymore.  Use gpgme_get_sig_status to retrieve the individual     stati. @@ -219,7 +249,6 @@ Noteworthy changes in version 0.4.1 (unreleased)  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  GpgmeCtx			DEPRECATED: Use gpgme_ctx_t.  GpgmeData			DEPRECATED: Use gpgme_data_t. -GpgmeRecipients			DEPRECATED: Use gpgme_recipients_t.  GpgmeError			DEPRECATED: Use gpgme_error_t.  GpgmeDataEncoding		DEPRECATED: Use gpgme_data_encoding_t.  GpgmeSigStat			DEPRECATED: Use gpgme_sig_stat_t. @@ -279,6 +308,23 @@ gpgme_op_decrypt_verify		CHANGED: Drop R_STAT argument.  gpgme_wait			CHANGED: Can return NULL even if hang is true.  GpgmeIdleFunc                   REMOVED  gpgme_register_idle             REMOVED +GpgmeRecipients			REMOVED: Use gpgme_user_id_t. +gpgme_recipients_new		REMOVED: Initialize gpgme_user_id_t with NULL. +gpgme_recipients_release	REMOVED: Use gpgme_user_ids_release. +gpgme_recipients_add_name	REMOVED: Use gpgme_user_ids_append +gpgme_recipients_add_name_with_validity	REMOVED: Set validity directly. +gpgme_recipients_count		REMOVED: You can count them yourself. +gpgme_recipients_enum_open	REMOVED: gpgme_user_id_t is a linked list. +gpgme_recipients_enum_read	REMOVED: See gpgme_recipients_enum_open. +gpgme_recipients_enum_close	REMOVED: See gpgme_recipients_enum_read. +gpgme_user_ids_append		NEW +gpgme_user_ids_release		NEW +gpgme_op_encrypt		CHANGED: Recipients passed as gpgme_user_id_t. +gpgme_op_encrypt_start		CHANGED: Recipients passed as gpgme_user_id_t. +gpgme_op_encrypt_sign		CHANGED: Recipients passed as gpgme_user_id_t. +gpgme_op_encrypt_sign_start	CHANGED: Recipients passed as gpgme_user_id_t. +gpgme_op_export_start		CHANGED: User IDs passed as gpgme_user_id_t. +gpgme_op_export			CHANGED: User IDs passed as gpgme_user_id_t.  gpgme_engine_info_t		NEW  gpgme_get_engine_info		CHANGED: Return info structure instead XML.  gpgme_get_protocol_name		NEW @@ -1,7 +1,7 @@  Hey Emacs, this is -*- outline -*- mode!  * ABI's to break: -** Change gpgme_recipient_t stuff to gpgme_user_id_t (encrypt, export, ...). +** Use libgpg-error.  ** Compatibility interfaces that can be removed in future versions:  *** gpgme_data_new_from_filepart  *** gpgme_data_new_from_file @@ -108,14 +108,3 @@ Hey Emacs, this is -*- outline -*- mode!  * Build suite  ** Make sure everything is cleaned correctly (esp. test area). - -Bugs reported by Stephane Corthesy: -> In GpgmeRecipients, would it be possible to provide a function which   -> would return the validity assigned to a name contained in the   -> GpgmeRecipients instance? - -> passphrase callback. If I use the same GpgmeContext as the one which   -> is currently asking for a passphrase, my app crashes: the r_hd in -> the   -> callback has become invalid; if I use a brand new one, the callback   -> is called recursively, when I ask to enumerate keys. diff --git a/doc/ChangeLog b/doc/ChangeLog index 0f4545cd..a3981108 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -1,3 +1,10 @@ +2003-05-28  Marcus Brinkmann  <[email protected]> + +	* gpgme.texi (Exporting Keys): Change argument type from +	gpgme_recipient_t to gpgme_user_id_t. +	(Encrypting a Plaintext): Likewise. +	(Selecting Recipients): Rewritten. +  2003-05-27  Marcus Brinkmann  <[email protected]>  	* gpgme.texi (Protocol Selection): Do not use @acronym in @node diff --git a/doc/gpgme.texi b/doc/gpgme.texi index 2866832e..2513f361 100644 --- a/doc/gpgme.texi +++ b/doc/gpgme.texi @@ -2649,27 +2649,27 @@ operation is started on the context.  @cindex key, export  @cindex key ring, export from -@deftypefun gpgme_error_t gpgme_op_export (@w{gpgme_ctx_t @var{ctx}}, @w{gpgme_recipients_t @var{recipients}}, @w{gpgme_data_t @var{keydata}}) +@deftypefun gpgme_error_t gpgme_op_export (@w{gpgme_ctx_t @var{ctx}}, @w{gpgme_user_id_t @var{uids}}, @w{gpgme_data_t @var{keydata}})  The function @code{gpgme_op_export} extracts the public keys of the -user IDs in @var{recipients} and returns them in the data buffer +user IDs in @var{uids} and returns them in the data buffer  @var{keydata}.  The type of the public keys returned is determined by  the @acronym{ASCII} armor attribute set for the context @var{ctx}.  The function returns @code{GPGME_No_Error} if the operation completed -successfully, @code{GPGME_Invalid_Value} if @var{recipients} is +successfully, @code{GPGME_Invalid_Value} if @var{uids} is  @code{NULL} or @var{keydata} is not a valid empty data buffer, and  passes through any errors that are reported by the crypto engine  support routines.  @end deftypefun -@deftypefun gpgme_error_t gpgme_op_export_start (@w{gpgme_ctx_t @var{ctx}}, @w{gpgme_recipients_t @var{recipients}}, @w{gpgme_data_t @var{keydata}}) +@deftypefun gpgme_error_t gpgme_op_export_start (@w{gpgme_ctx_t @var{ctx}}, @w{gpgme_user_id_t @var{uids}}, @w{gpgme_data_t @var{keydata}})  The function @code{gpgme_op_export_start} initiates a  @code{gpgme_op_export} operation.  It can be completed by calling  @code{gpgme_wait} on the context.  @xref{Waiting For Completion}.  The function returns @code{GPGME_No_Error} if the operation could be  started successfully, and @code{GPGME_Invalid_Value} if -@var{recipients} is @code{NULL} or @var{keydata} is not a valid empty +@var{uids} is @code{NULL} or @var{keydata} is not a valid empty  data buffer.  @end deftypefun @@ -3756,86 +3756,59 @@ and then passed to the encryption operation.  @cindex encryption, selecting recipients  @cindex recipients -@deftp {Data type} gpgme_recipients_t -The @code{gpgme_recipients_t} type is a handle for a set of recipients -that can be used in an encryption process. -@end deftp +@deftypefun gpgme_error_t gpgme_user_ids_append (@w{gpgme_user_id_t *@var{rset_p}}, @w{const char *@var{name}}) +The function @code{gpgme_user_ids_append} creates a new +@code{gpgme_user_id_t} object, initializes its @code{uid} member with +a copy of the string pointed to by @var{name}, initializes its +@code{name}, @code{email}, @code{comment} members to the empty string, +its @code{validity} member to @code{GPGME_VALIDITY_UNKNOWN} and leaves +all other fields to 0. + +It then appends the user ID at the end of the linked list of user IDs +that starts at *@var{rset_p}, or it returns it in *@var{rset_p} if +that is @code{NULL}.  You can then update for example the validity +information in the user ID directly. + +We recommend that you keep a pointer to the last element in your +linked list.  This is faster and allows you to easily update the +fields of the last user ID.  Here is an example how to create a linked +list of user IDs in @var{rset} with full validity from a +@code{NULL}-terminated array of names: -@deftypefun gpgme_error_t gpgme_recipients_new (@w{gpgme_recipients_t *@var{r_rset}}) -The function @code{gpgme_recipients_new} creates a new, empty set of -recipients and returns a handle for it in @var{r_rset}. +@example +  const char *names[] = @{ "Alpha", "Bob", NULL @}; +  gpgme_error_t err; +  gpgme_user_id_t rset = NULL; +  gpgme_user_id_t *rset_lastp = &rset; + +  do +    @{ +      err = gpgme_user_ids_append (rset_lastp, *(names++)); +      if (!err) +        @{ +          (*rset_lastp)->validity = GPGME_VALIDITY_FULL; +          rset_lastp = &(*rset_lastp)->next; +        @} +    @} +  while (!err && *names); +@end example  The function returns @code{GPGME_No_Error} if the recipient set could  be created successfully, and @code{GPGME_Out_Of_Core} if not enough  memory was available.  @end deftypefun -@deftypefun void gpgme_recipients_release (@w{gpgme_recipients_t @var{rset}}) -The function @code{gpgme_recipients_release} destroys the set of -recipients @var{rset} and releases all associated resources. -@end deftypefun - -@deftypefun gpgme_error_t gpgme_recipients_add_name (@w{gpgme_recipients_t @var{rset}}, @w{const char *@var{name}}) -The function @code{gpgme_recipients_add_name} adds the recipient -@var{name} to the set of recipients @var{rset}.  This is equivalent to -@code{gpgme_recipients_add_name_with_validity} with a validity of -@code{GPGME_VALIDITY_UNKNOWN}. - -The function returns @code{GPGME_No_Error} if the recipient was added -successfully, @code{GPGME_Invalid_Value} if @var{rset} or @var{name} -is not a valid pointer, and @code{GPGME_Out_Of_Core} if not enough -memory is available. -@end deftypefun - -@deftypefun gpgme_error_t gpgme_recipients_add_name_with_validity (@w{gpgme_recipients_t @var{rset}}, @w{const char *@var{name}}, @w{gpgme_validity_t @var{val}}) -The function @code{gpgme_recipients_add_name_with_validity} adds the -recipient @var{name} with the validity @var{val} to the set of -recipients @var{rset}.  If the validity is not known, the function -@code{gpgme_recipients_add_name} can be used. -@xref{Information About Keys}, for the possible values for @var{val}. - -The function returns @code{GPGME_No_Error} if the recipient was added -successfully, @code{GPGME_Invalid_Value} if @var{rset} or @var{name} -is not a valid pointer, and @code{GPGME_Out_Of_Core} if not enough -memory is available. -@end deftypefun - -@deftypefun {unsigned int} gpgme_recipients_count (@w{const @var{gpgme_recipients_t rset}}) -The function @code{gpgme_recipients_count} returns the number of -recipients in the set @var{rset}. -@end deftypefun - -@deftypefun gpgme_error_t gpgme_recipients_enum_open (@w{const gpgme_recipients_t @var{rset}}, @w{void **@var{iter}}) -The function @code{gpgme_recipients_enum_open} creates a new iterator -@var{iter} that can be used to walk through the set of recipients in -@var{rset}, using @code{gpgme_recipients_enum_read}. - -If the iterator is not needed anymore, it can be closed with -@code{gpgme_recipients_enum_close}. - -The function returns @code{GPGME_No_Error} if the enumerator was -successfully created and @code{GPGME_Invalid_Value} if @var{rset} or -@var{iter} is not a valid pointer. -@end deftypefun - -@deftypefun {const char *} gpgme_recipients_enum_read (@w{const gpgme_recipients_t @var{rset}}, @w{void **@var{iter}}) -The function @code{gpgme_recipients_enum_read} returns a string -containing the name of the next recipient in the set @var{rset} for -the iterator @var{iter}.  The string is valid as long as @var{rset} is -valid or the function is called the next time with the same recipient -set and iterator, whatever is earlier. -@end deftypefun - -@deftypefun gpgme_error_t gpgme_recipients_enum_close (@w{const gpgme_recipients_t @var{rset}}, @w{void **@var{iter}}) -The function @code{gpgme_recipients_enum_close} releases the iterator -@var{iter} for the recipient set @var{rset}. +@deftypefun void gpgme_user_ids_release (@w{gpgme_user_id_t @var{uids}}) +The function @code{gpgme_user_ids_release} destroys the linked list of +user IDs @var{uids} and releases all associated resources allocated by +@acronym{GPGME}..  @end deftypefun  @node Encrypting a Plaintext  @subsubsection Encrypting a Plaintext -@deftypefun gpgme_error_t gpgme_op_encrypt (@w{gpgme_ctx_t @var{ctx}}, @w{gpgme_recipients_t @var{rset}}, @w{gpgme_data_t @var{plain}}, @w{gpgme_data_t @var{cipher}}) +@deftypefun gpgme_error_t gpgme_op_encrypt (@w{gpgme_ctx_t @var{ctx}}, @w{gpgme_user_id_t @var{rset}}, @w{gpgme_data_t @var{plain}}, @w{gpgme_data_t @var{cipher}})  The function @code{gpgme_op_encrypt} encrypts the plaintext in the data  object @var{plain} for the recipients @var{rset} and stores the  ciphertext in the data object @var{cipher}.  The type of the @@ -3865,7 +3838,7 @@ the secret key could not be retrieved, and passes through any errors  that are reported by the crypto engine support routines.  @end deftypefun -@deftypefun gpgme_error_t gpgme_op_encrypt_start (@w{gpgme_ctx_t @var{ctx}}, @w{gpgme_recipients_t @var{rset}}, @w{gpgme_data_t @var{plain}}, @w{gpgme_data_t @var{cipher}}) +@deftypefun gpgme_error_t gpgme_op_encrypt_start (@w{gpgme_ctx_t @var{ctx}}, @w{gpgme_user_id_t @var{rset}}, @w{gpgme_data_t @var{plain}}, @w{gpgme_data_t @var{cipher}})  The function @code{gpgme_op_encrypt_start} initiates a  @code{gpgme_op_encrypt} operation.  It can be completed by calling  @code{gpgme_wait} on the context.  @xref{Waiting For Completion}. @@ -3902,7 +3875,7 @@ next operation is started on the context.  @end deftypefun -@deftypefun gpgme_error_t gpgme_op_encrypt_sign (@w{gpgme_ctx_t @var{ctx}}, @w{gpgme_recipients_t @var{rset}}, @w{gpgme_data_t @var{plain}}, @w{gpgme_data_t @var{cipher}}) +@deftypefun gpgme_error_t gpgme_op_encrypt_sign (@w{gpgme_ctx_t @var{ctx}}, @w{gpgme_user_id_t @var{rset}}, @w{gpgme_data_t @var{plain}}, @w{gpgme_data_t @var{cipher}})  The function @code{gpgme_op_encrypt_sign} does a combined encrypt and  sign operation.  It is used like @code{gpgme_op_encrypt}, but the  ciphertext also contains signatures for the signers listed in @@ -3912,7 +3885,7 @@ The combined encrypt and sign operation is currently only available  for the OpenPGP crypto engine.  @end deftypefun -@deftypefun gpgme_error_t gpgme_op_encrypt_sign_start (@w{gpgme_ctx_t @var{ctx}}, @w{gpgme_recipients_t @var{rset}}, @w{gpgme_data_t @var{plain}}, @w{gpgme_data_t @var{cipher}}) +@deftypefun gpgme_error_t gpgme_op_encrypt_sign_start (@w{gpgme_ctx_t @var{ctx}}, @w{gpgme_user_id_t @var{rset}}, @w{gpgme_data_t @var{plain}}, @w{gpgme_data_t @var{cipher}})  The function @code{gpgme_op_encrypt_sign_start} initiates a  @code{gpgme_op_encrypt_sign} operation.  It can be completed by  calling @code{gpgme_wait} on the context.  @xref{Waiting For diff --git a/gpgme/ChangeLog b/gpgme/ChangeLog index fb14e561..9b1a17f0 100644 --- a/gpgme/ChangeLog +++ b/gpgme/ChangeLog @@ -1,3 +1,49 @@ +2003-05-28  Marcus Brinkmann  <[email protected]> + +	* Makefile.am (libgpgme_la_SOURCES): Remove recipient.c, add +	user-id.c. +	* gpgme.h (gpgme_recipients_t): Removed. +	(gpgme_recipients_new, gpgme_recipients_release, +	gpgme_recipients_add_name, +	gpgme_recipients_add_name_with_validity, gpgme_recipients_count, +	gpgme_recipients_enum_open, gpgme_recipients_enum_read, +	gpgme_recipients_enum_close): Removed. +	(gpgme_op_encrypt, gpgme_op_encrypt_start, gpgme_op_encrypt_sign, +	gpgme_op_encrypt_sign_start, gpgme_op_export_start, +	gpgme_op_export): Change second argument to gpgme_user_id_t. +	(gpgme_user_ids_release): New prototype. +	(gpgme_user_ids_append): Likewise. +	* ops.h (_gpgme_recipients_all_valid): Remove. +	(_gpgme_user_ids_all_valid): Add. +	* context.h (struct gpgme_recipients): Removed. +	* user-id.c: New file. +	* recipient.c: Removed file. +	* rungpg.c (append_args_from_recipients): Change last arg to +	gpgme_user_id_t.  Reimplement. +	(gpg_encrypt): Change second arg to gpgme_user_id_t. +	(gpg_encrypt_sign): Likewise. +	(gpg_export): Likewise.  Rewrite user ID list code. +	* engine.c (_gpgme_engine_op_encrypt): Change second arg to +	gpgme_user_id_t. +	(_gpgme_engine_op_encrypt_sign): Likewise. +	(_gpgme_engine_op_export): Likewise. +	* engine.h (_gpgme_engine_op_encrypt, _gpgme_engine_op_encrypt_sign, +	_gpgme_engine_op_export): Likewise. +	* engine-gpgsm.c (set_recipients): Likewise.  Rewrite loop code. +	(gpgsm_encrypt): Likewise. +	(gpgsm_export): Likewise. +	* engine-backend.h (struct engine_ops): Likewise for members +	ENCRYPT, ENCRYPT_SIGN and EXPORT. +	* export.c (export_start, gpgme_op_export_start, gpgme_op_export): +	Likewise. +	* encrypt.c (encrypt_start): Likewise.  Don't check for count of +	recipients. +	(gpgme_op_encrypt_start): Likewise. +	(gpgme_op_encrypt): Likewise. +	* encrypt-sign.c (encrypt_sign_start): Likewise. +	(gpgme_op_encrypt_sign): Likewise. +	(gpgme_op_encrypt_sign_start): Likewise. +  2003-05-27  Marcus Brinkmann  <[email protected]>  	* gpgme.h (struct _gpgme_op_import_result): Add skipped_new_keys. diff --git a/gpgme/Makefile.am b/gpgme/Makefile.am index 7eecd746..d2df91ae 100644 --- a/gpgme/Makefile.am +++ b/gpgme/Makefile.am @@ -72,7 +72,7 @@ libgpgme_la_SOURCES =							\  	gpgme.h util.h conversion.c context.h ops.h			\  	data.h data.c data-fd.c data-stream.c data-mem.c data-user.c	\  	data-compat.c							\ -	recipient.c signers.c						\ +	user-id.c signers.c						\  	wait.c wait-global.c wait-private.c wait-user.c wait.h		\  	op-support.c							\  	encrypt.c encrypt-sign.c decrypt.c decrypt-verify.c verify.c	\ diff --git a/gpgme/context.h b/gpgme/context.h index efc0d3b8..c56e5ac9 100644 --- a/gpgme/context.h +++ b/gpgme/context.h @@ -37,6 +37,7 @@ typedef enum      OPDATA_VERIFY, OPDATA_TRUSTLIST    } ctx_op_data_type; +  struct ctx_op_data  {    /* The next element in the linked list, or NULL if this is the last @@ -102,12 +103,4 @@ struct gpgme_context    struct gpgme_io_cbs io_cbs;  }; - -/* A recipient is defined by a user ID, but we define it as an opaque -   type for the user.  */ -struct gpgme_recipients -{ -  gpgme_user_id_t list; -}; -  #endif	/* CONTEXT_H */ diff --git a/gpgme/encrypt-sign.c b/gpgme/encrypt-sign.c index 5d41fe96..67c01c05 100644 --- a/gpgme/encrypt-sign.c +++ b/gpgme/encrypt-sign.c @@ -37,7 +37,7 @@ encrypt_sign_status_handler (void *priv, gpgme_status_code_t code, char *args)  static gpgme_error_t -encrypt_sign_start (gpgme_ctx_t ctx, int synchronous, gpgme_recipients_t recp, +encrypt_sign_start (gpgme_ctx_t ctx, int synchronous, gpgme_user_id_t recp,  		    gpgme_data_t plain, gpgme_data_t cipher)  {    gpgme_error_t err; @@ -80,7 +80,7 @@ encrypt_sign_start (gpgme_ctx_t ctx, int synchronous, gpgme_recipients_t recp,     store the resulting ciphertext in CIPHER.  Also sign the ciphertext     with the signers in CTX.  */  gpgme_error_t -gpgme_op_encrypt_sign_start (gpgme_ctx_t ctx, gpgme_recipients_t recp, +gpgme_op_encrypt_sign_start (gpgme_ctx_t ctx, gpgme_user_id_t recp,  			      gpgme_data_t plain, gpgme_data_t cipher)  {    return encrypt_sign_start (ctx, 0, recp, plain, cipher); @@ -91,7 +91,7 @@ gpgme_op_encrypt_sign_start (gpgme_ctx_t ctx, gpgme_recipients_t recp,     store the resulting ciphertext in CIPHER.  Also sign the ciphertext     with the signers in CTX.  */  gpgme_error_t -gpgme_op_encrypt_sign (gpgme_ctx_t ctx, gpgme_recipients_t recp, +gpgme_op_encrypt_sign (gpgme_ctx_t ctx, gpgme_user_id_t recp,  		       gpgme_data_t plain, gpgme_data_t cipher)  {    gpgme_error_t err = encrypt_sign_start (ctx, 1, recp, plain, cipher); diff --git a/gpgme/encrypt.c b/gpgme/encrypt.c index 4873aaa5..841d66ec 100644 --- a/gpgme/encrypt.c +++ b/gpgme/encrypt.c @@ -148,7 +148,7 @@ _gpgme_op_encrypt_init_result (gpgme_ctx_t ctx)  static gpgme_error_t -encrypt_start (gpgme_ctx_t ctx, int synchronous, gpgme_recipients_t recp, +encrypt_start (gpgme_ctx_t ctx, int synchronous, gpgme_user_id_t recp,  	       gpgme_data_t plain, gpgme_data_t cipher)  {    gpgme_error_t err; @@ -164,8 +164,6 @@ encrypt_start (gpgme_ctx_t ctx, int synchronous, gpgme_recipients_t recp,    if (!recp)      symmetric = 1; -  else if (gpgme_recipients_count (recp) == 0) -    return GPGME_No_UserID;    if (!plain)      return GPGME_No_Data; @@ -193,7 +191,7 @@ encrypt_start (gpgme_ctx_t ctx, int synchronous, gpgme_recipients_t recp,  gpgme_error_t -gpgme_op_encrypt_start (gpgme_ctx_t ctx, gpgme_recipients_t recp, +gpgme_op_encrypt_start (gpgme_ctx_t ctx, gpgme_user_id_t recp,  			gpgme_data_t plain, gpgme_data_t cipher)  {    return encrypt_start (ctx, 0, recp, plain, cipher); @@ -203,7 +201,7 @@ gpgme_op_encrypt_start (gpgme_ctx_t ctx, gpgme_recipients_t recp,  /* Encrypt plaintext PLAIN within CTX for the recipients RECP and     store the resulting ciphertext in CIPHER.  */  gpgme_error_t -gpgme_op_encrypt (gpgme_ctx_t ctx, gpgme_recipients_t recp, +gpgme_op_encrypt (gpgme_ctx_t ctx, gpgme_user_id_t recp,  		  gpgme_data_t plain, gpgme_data_t cipher)  {    gpgme_error_t err = encrypt_start (ctx, 1, recp, plain, cipher); diff --git a/gpgme/engine-backend.h b/gpgme/engine-backend.h index c6dbdcfb..490a18e5 100644 --- a/gpgme/engine-backend.h +++ b/gpgme/engine-backend.h @@ -49,13 +49,13 @@ struct engine_ops    gpgme_error_t (*delete) (void *engine, gpgme_key_t key, int allow_secret);    gpgme_error_t (*edit) (void *engine, gpgme_key_t key, gpgme_data_t out,  			 gpgme_ctx_t ctx /* FIXME */); -  gpgme_error_t (*encrypt) (void *engine, gpgme_recipients_t recp, +  gpgme_error_t (*encrypt) (void *engine, gpgme_user_id_t recp,  			    gpgme_data_t plain, gpgme_data_t ciph,  			    int use_armor); -  gpgme_error_t (*encrypt_sign) (void *engine, gpgme_recipients_t recp, +  gpgme_error_t (*encrypt_sign) (void *engine, gpgme_user_id_t recp,  				 gpgme_data_t plain, gpgme_data_t ciph,  				 int use_armor, gpgme_ctx_t ctx /* FIXME */); -  gpgme_error_t (*export) (void *engine, gpgme_recipients_t recp, +  gpgme_error_t (*export) (void *engine, gpgme_user_id_t uids,  			   gpgme_data_t keydata, int use_armor);    gpgme_error_t (*genkey) (void *engine, gpgme_data_t help_data, int use_armor,  			   gpgme_data_t pubkey, gpgme_data_t seckey); diff --git a/gpgme/engine-gpgsm.c b/gpgme/engine-gpgsm.c index da9cdb4b..eb5fd826 100644 --- a/gpgme/engine-gpgsm.c +++ b/gpgme/engine-gpgsm.c @@ -936,13 +936,12 @@ gpgsm_delete (void *engine, gpgme_key_t key, int allow_secret)  static gpgme_error_t -set_recipients (GpgsmObject gpgsm, gpgme_recipients_t recp) +set_recipients (GpgsmObject gpgsm, gpgme_user_id_t uid)  {    gpgme_error_t err;    ASSUAN_CONTEXT ctx = gpgsm->assuan_ctx;    char *line;    int linelen; -  gpgme_user_id_t uid;    int invalid_recipients = 0;    linelen = 10 + 40 + 1;	/* "RECIPIENT " + guess + '\0'.  */ @@ -950,7 +949,7 @@ set_recipients (GpgsmObject gpgsm, gpgme_recipients_t recp)    if (!line)      return GPGME_Out_Of_Core;    strcpy (line, "RECIPIENT "); -  for (uid = recp->list; uid; uid = uid->next) +  while (uid)      {        int newlen = 11 + strlen (uid->uid);        if (linelen < newlen) @@ -975,6 +974,7 @@ set_recipients (GpgsmObject gpgsm, gpgme_recipients_t recp)  	  free (line);  	  return err;  	} +      uid = uid->next;      }    free (line);    return invalid_recipients ? GPGME_Invalid_UserID : 0; @@ -982,7 +982,7 @@ set_recipients (GpgsmObject gpgsm, gpgme_recipients_t recp)  static gpgme_error_t -gpgsm_encrypt (void *engine, gpgme_recipients_t recp, gpgme_data_t plain, +gpgsm_encrypt (void *engine, gpgme_user_id_t recp, gpgme_data_t plain,  	       gpgme_data_t ciph, int use_armor)  {    GpgsmObject gpgsm = engine; @@ -1015,7 +1015,7 @@ gpgsm_encrypt (void *engine, gpgme_recipients_t recp, gpgme_data_t plain,  static gpgme_error_t -gpgsm_export (void *engine, gpgme_recipients_t recp, gpgme_data_t keydata, +gpgsm_export (void *engine, gpgme_user_id_t uid, gpgme_data_t keydata,  	      int use_armor)  {    GpgsmObject gpgsm = engine; @@ -1033,36 +1033,27 @@ gpgsm_export (void *engine, gpgme_recipients_t recp, gpgme_data_t keydata,    strcpy (cmd, "EXPORT");    cmdi = 6; -  if (recp) +  while (!err && uid)      { -      void *ec; -      const char *s; - -      err = gpgme_recipients_enum_open (recp, &ec); -      while (!err && (s = gpgme_recipients_enum_read (recp, &ec))) +      int uidlen = strlen (uid->uid); +      /* New string is old string + ' ' + s + '\0'.  */ +      if (cmdlen < cmdi + 1 + uidlen + 1)  	{ -	  int slen = strlen (s); -	  /* New string is old string + ' ' + s + '\0'.  */ -	  if (cmdlen < cmdi + 1 + slen + 1) +	  char *newcmd = realloc (cmd, cmdlen * 2); +	  if (!newcmd)  	    { -	      char *newcmd = realloc (cmd, cmdlen * 2); -	      if (!newcmd) -		{ -		  free (cmd); -		  return GPGME_Out_Of_Core; -		} -	      cmd = newcmd; -	      cmdlen *= 2; +	      free (cmd); +	      return GPGME_Out_Of_Core;  	    } -	  cmd[cmdi++] = ' '; -	  strcpy (cmd + cmdi, s); -	  cmdi += slen; +	  cmd = newcmd; +	  cmdlen *= 2;  	} -      if (!err) -	err = gpgme_recipients_enum_close (recp, &ec); -      if (err) -	return err; +      cmd[cmdi++] = ' '; +      strcpy (cmd + cmdi, uid->uid); +      cmdi += uidlen;      } +  if (err) +    return err;    gpgsm->output_cb.data = keydata;    err = gpgsm_set_fd (gpgsm->assuan_ctx, "OUTPUT", gpgsm->output_fd_server, diff --git a/gpgme/engine.c b/gpgme/engine.c index ed2891ee..deee3360 100644 --- a/gpgme/engine.c +++ b/gpgme/engine.c @@ -289,7 +289,7 @@ _gpgme_engine_op_edit (EngineObject engine, gpgme_key_t key, gpgme_data_t out,  gpgme_error_t -_gpgme_engine_op_encrypt (EngineObject engine, gpgme_recipients_t recp, +_gpgme_engine_op_encrypt (EngineObject engine, gpgme_user_id_t recp,  			  gpgme_data_t plain, gpgme_data_t ciph, int use_armor)  {    if (!engine) @@ -304,7 +304,7 @@ _gpgme_engine_op_encrypt (EngineObject engine, gpgme_recipients_t recp,  gpgme_error_t -_gpgme_engine_op_encrypt_sign (EngineObject engine, gpgme_recipients_t recp, +_gpgme_engine_op_encrypt_sign (EngineObject engine, gpgme_user_id_t recp,  			       gpgme_data_t plain, gpgme_data_t ciph,  			       int use_armor, gpgme_ctx_t ctx /* FIXME */)  { @@ -320,7 +320,7 @@ _gpgme_engine_op_encrypt_sign (EngineObject engine, gpgme_recipients_t recp,  gpgme_error_t -_gpgme_engine_op_export (EngineObject engine, gpgme_recipients_t recp, +_gpgme_engine_op_export (EngineObject engine, gpgme_user_id_t uids,  			 gpgme_data_t keydata, int use_armor)  {    if (!engine) @@ -329,8 +329,7 @@ _gpgme_engine_op_export (EngineObject engine, gpgme_recipients_t recp,    if (!engine->ops->export)      return GPGME_Not_Implemented; -  return (*engine->ops->export) (engine->engine, recp, keydata, -				 use_armor); +  return (*engine->ops->export) (engine->engine, uids, keydata, use_armor);  } diff --git a/gpgme/engine.h b/gpgme/engine.h index 1f8e2ed7..065c9067 100644 --- a/gpgme/engine.h +++ b/gpgme/engine.h @@ -57,17 +57,17 @@ gpgme_error_t _gpgme_engine_op_edit (EngineObject engine, gpgme_key_t key,  				     gpgme_data_t out,  				     gpgme_ctx_t ctx /* FIXME */);  gpgme_error_t _gpgme_engine_op_encrypt (EngineObject engine, -					gpgme_recipients_t recp, +					gpgme_user_id_t recp,  					gpgme_data_t plain, gpgme_data_t ciph,  					int use_armor);  gpgme_error_t _gpgme_engine_op_encrypt_sign (EngineObject engine, -					     gpgme_recipients_t recp, +					     gpgme_user_id_t recp,  					     gpgme_data_t plain,  					     gpgme_data_t ciph,  					     int use_armor,  					     gpgme_ctx_t ctx /* FIXME */);  gpgme_error_t _gpgme_engine_op_export (EngineObject engine, -				       gpgme_recipients_t recp, +				       gpgme_user_id_t uids,  				       gpgme_data_t keydata, int use_armor);  gpgme_error_t _gpgme_engine_op_genkey (EngineObject engine,  				       gpgme_data_t help_data, diff --git a/gpgme/export.c b/gpgme/export.c index bdefc29c..4958a75c 100644 --- a/gpgme/export.c +++ b/gpgme/export.c @@ -36,11 +36,11 @@ export_status_handler (void *priv, gpgme_status_code_t code, char *args)  static gpgme_error_t  export_start (gpgme_ctx_t ctx, int synchronous, -	      gpgme_recipients_t recp, gpgme_data_t keydata) +	      gpgme_user_id_t uids, gpgme_data_t keydata)  {    gpgme_error_t err; -  if (!keydata || !recp) +  if (!keydata || !uids)      return GPGME_Invalid_Value;    err = _gpgme_op_reset (ctx, synchronous); @@ -49,24 +49,24 @@ export_start (gpgme_ctx_t ctx, int synchronous,    _gpgme_engine_set_status_handler (ctx->engine, export_status_handler, ctx); -  return _gpgme_engine_op_export (ctx->engine, recp, keydata, ctx->use_armor); +  return _gpgme_engine_op_export (ctx->engine, uids, keydata, ctx->use_armor);  }  /* Export the keys listed in RECP into KEYDATA.  */  gpgme_error_t -gpgme_op_export_start (gpgme_ctx_t ctx, gpgme_recipients_t recp, +gpgme_op_export_start (gpgme_ctx_t ctx, gpgme_user_id_t uids,  		       gpgme_data_t keydata)  { -  return export_start (ctx, 0, recp, keydata); +  return export_start (ctx, 0, uids, keydata);  }  /* Export the keys listed in RECP into KEYDATA.  */  gpgme_error_t -gpgme_op_export (gpgme_ctx_t ctx, gpgme_recipients_t recipients, gpgme_data_t keydata) +gpgme_op_export (gpgme_ctx_t ctx, gpgme_user_id_t uids, gpgme_data_t keydata)  { -  gpgme_error_t err = export_start (ctx, 1, recipients, keydata); +  gpgme_error_t err = export_start (ctx, 1, uids, keydata);    if (!err)      err = _gpgme_wait_one (ctx);    return err; diff --git a/gpgme/gpgme.h b/gpgme/gpgme.h index de417453..01e9c787 100644 --- a/gpgme/gpgme.h +++ b/gpgme/gpgme.h @@ -75,10 +75,6 @@ typedef struct gpgme_context *gpgme_ctx_t;  struct gpgme_data;  typedef struct gpgme_data *gpgme_data_t; -/* A list of recipients to be used in an encryption operation.  */ -struct gpgme_recipients; -typedef struct gpgme_recipients *gpgme_recipients_t; -  /* Public data types provided by GPGME.  */ @@ -542,6 +538,14 @@ struct _gpgme_user_id  };  typedef struct _gpgme_user_id *gpgme_user_id_t; +/* Release the user IDs in the list UID.  */ +void gpgme_user_ids_release (gpgme_user_id_t uid); + +/* Add the name NAME to the user ID list *UIDS_P (with unknown +   validity).  */ +gpgme_error_t gpgme_user_ids_append (gpgme_user_id_t *uids_p, +				     const char *name); +  /* A key from the keyring.  */  struct _gpgme_key @@ -794,40 +798,6 @@ void gpgme_get_io_cbs (gpgme_ctx_t ctx, gpgme_io_cbs_t io_cbs);  gpgme_ctx_t gpgme_wait (gpgme_ctx_t ctx, gpgme_error_t *status, int hang); -/* Functions to handle recipients.  */ - -/* Create a new recipients set and return it in R_RSET.  */ -gpgme_error_t gpgme_recipients_new (gpgme_recipients_t *r_rset); - -/* Release the recipients set RSET.  */ -void gpgme_recipients_release (gpgme_recipients_t rset); - -/* Add NAME to the recipients set RSET.  */ -gpgme_error_t gpgme_recipients_add_name (gpgme_recipients_t rset, const char *name); - -/* Add NAME with validity AL to the recipients set RSET.  */ -gpgme_error_t gpgme_recipients_add_name_with_validity (gpgme_recipients_t rset, -						       const char *name, -						       gpgme_validity_t val); - -/* Return the number of recipients in RSET.  */ -unsigned int gpgme_recipients_count (const gpgme_recipients_t rset); - -/* Create a new enumeration handle for the recipients set RSET and -   return it in ITER.  */ -gpgme_error_t gpgme_recipients_enum_open (const gpgme_recipients_t rset, -					  void **iter); - -/* Return the next recipient from the recipient set RSET in the -   enumerator ITER.  */ -const char *gpgme_recipients_enum_read (const gpgme_recipients_t rset, -					void **iter); - -/* Destroy the enumerator ITER for the recipient set RSET.  */ -gpgme_error_t gpgme_recipients_enum_close (const gpgme_recipients_t rset, -					   void **iter); - -  /* Functions to handle data objects.  */  /* Read up to SIZE bytes into buffer BUFFER from the data object with @@ -1011,19 +981,19 @@ gpgme_encrypt_result_t gpgme_op_encrypt_result (gpgme_ctx_t ctx);  /* Encrypt plaintext PLAIN within CTX for the recipients RECP and     store the resulting ciphertext in CIPHER.  */ -gpgme_error_t gpgme_op_encrypt_start (gpgme_ctx_t ctx, gpgme_recipients_t recp, +gpgme_error_t gpgme_op_encrypt_start (gpgme_ctx_t ctx, gpgme_user_id_t recp,  				      gpgme_data_t plain, gpgme_data_t cipher); -gpgme_error_t gpgme_op_encrypt (gpgme_ctx_t ctx, gpgme_recipients_t recp, +gpgme_error_t gpgme_op_encrypt (gpgme_ctx_t ctx, gpgme_user_id_t recp,  				gpgme_data_t plain, gpgme_data_t cipher);  /* Encrypt plaintext PLAIN within CTX for the recipients RECP and     store the resulting ciphertext in CIPHER.  Also sign the ciphertext     with the signers in CTX.  */  gpgme_error_t gpgme_op_encrypt_sign_start (gpgme_ctx_t ctx, -					   gpgme_recipients_t recp, +					   gpgme_user_id_t recp,  					   gpgme_data_t plain,  					   gpgme_data_t cipher); -gpgme_error_t gpgme_op_encrypt_sign (gpgme_ctx_t ctx, gpgme_recipients_t recp, +gpgme_error_t gpgme_op_encrypt_sign (gpgme_ctx_t ctx, gpgme_user_id_t recp,  				     gpgme_data_t plain, gpgme_data_t cipher); @@ -1261,10 +1231,10 @@ gpgme_error_t gpgme_op_import_ext (gpgme_ctx_t ctx, gpgme_data_t keydata,  				   int *nr) _GPGME_DEPRECATED; -/* Export the keys listed in RECP into KEYDATA.  */ -gpgme_error_t gpgme_op_export_start (gpgme_ctx_t ctx, gpgme_recipients_t recp, +/* Export the keys listed in UIDS into KEYDATA.  */ +gpgme_error_t gpgme_op_export_start (gpgme_ctx_t ctx, gpgme_user_id_t uids,  				     gpgme_data_t keydata); -gpgme_error_t gpgme_op_export (gpgme_ctx_t ctx, gpgme_recipients_t recp, +gpgme_error_t gpgme_op_export (gpgme_ctx_t ctx, gpgme_user_id_t uids,  			       gpgme_data_t keydata); @@ -1442,7 +1412,6 @@ gpgme_error_t gpgme_engine_check_version (gpgme_protocol_t proto);  /* Deprecated types.  */  typedef gpgme_ctx_t GpgmeCtx _GPGME_DEPRECATED;  typedef gpgme_data_t GpgmeData _GPGME_DEPRECATED; -typedef gpgme_recipients_t GpgmeRecipients _GPGME_DEPRECATED;  typedef gpgme_error_t GpgmeError _GPGME_DEPRECATED;  typedef gpgme_data_encoding_t GpgmeDataEncoding _GPGME_DEPRECATED;  typedef gpgme_pubkey_algo_t GpgmePubKeyAlgo _GPGME_DEPRECATED; diff --git a/gpgme/ops.h b/gpgme/ops.h index 121de1e7..07e602fb 100644 --- a/gpgme/ops.h +++ b/gpgme/ops.h @@ -33,8 +33,9 @@ void _gpgme_release_result (gpgme_ctx_t ctx);  gpgme_error_t _gpgme_wait_one (gpgme_ctx_t ctx);  gpgme_error_t _gpgme_wait_on_condition (gpgme_ctx_t ctx, volatile int *cond); -/* From recipient.c.  */ -int _gpgme_recipients_all_valid ( const gpgme_recipients_t rset ); + +/* From user-id.c.  */ +int _gpgme_user_ids_all_valid (gpgme_user_id_t uid);  /* From data.c.  */ @@ -144,5 +145,4 @@ const char *_gpgme_compare_versions (const char *my_version,  				     const char *req_version);  char *_gpgme_get_program_version (const char *const path); -  #endif /* OPS_H */ diff --git a/gpgme/recipient.c b/gpgme/recipient.c deleted file mode 100644 index e592b4b9..00000000 --- a/gpgme/recipient.c +++ /dev/null @@ -1,163 +0,0 @@ -/* recipient.c - mainatin recipient sets -   Copyright (C) 2000 Werner Koch (dd9jn) -   Copyright (C) 2001, 2002, 2003 g10 Code GmbH -  -   This file is part of GPGME. -  -   GPGME is free software; you can redistribute it and/or modify it -   under the terms of the GNU General Public License as published by -   the Free Software Foundation; either version 2 of the License, or -   (at your option) any later version. -  -   GPGME is distributed in the hope that it will be useful, but -   WITHOUT ANY WARRANTY; without even the implied warranty of -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU -   General Public License for more details. -  -   You should have received a copy of the GNU General Public License -   along with GPGME; if not, write to the Free Software Foundation, -   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */ - -#if HAVE_CONFIG_H -#include <config.h> -#endif -#include <stdlib.h> -#include <string.h> - -#include "context.h" - - -/* Create a new uninitialized recipient object and return it in R_RSET.  */ -gpgme_error_t -gpgme_recipients_new (gpgme_recipients_t *r_rset) -{ -  gpgme_recipients_t rset; -     -  rset = calloc (1, sizeof *rset); -  if (!rset) -    return GPGME_Out_Of_Core; -  *r_rset = rset; -  return 0; -} - - -/* Release the recipient object RSET.  */ -void -gpgme_recipients_release (gpgme_recipients_t rset) -{ -  gpgme_user_id_t uid = rset->list; - -  while (uid) -    { -      gpgme_user_id_t next_uid = uid->next; - -      free (uid); -      uid = next_uid; -    } -  free (rset); -} - - -/* Add the name NAME to the recipient set RSET with the given key -   validity VALIDITY.  */ -gpgme_error_t -gpgme_recipients_add_name_with_validity (gpgme_recipients_t rset, -					 const char *name, -                                         gpgme_validity_t validity) -{ -  gpgme_user_id_t uid; - -  if (!name || !rset) -    return GPGME_Invalid_Value; -  uid = malloc (sizeof (*uid) + strlen (name) + 1); -  if (!uid) -    return GPGME_Out_Of_Core; -  uid->validity = validity; -  uid->name = ""; -  uid->email = ""; -  uid->comment = ""; -  uid->uid = ((char *) uid) + sizeof (*uid); -  strcpy (uid->uid, name); -  uid->next = rset->list; -  rset->list = uid; -  return 0; -} - - -/* Add the name NAME to the recipient set RSET.  Same as -   gpgme_recipients_add_name_with_validity with validitiy -   GPGME_VALIDITY_UNKNOWN.  */ -gpgme_error_t -gpgme_recipients_add_name (gpgme_recipients_t rset, const char *name) -{ -  return gpgme_recipients_add_name_with_validity (rset, name, -						  GPGME_VALIDITY_UNKNOWN); -} - - -/* Return the number of recipients in the set.  */ -unsigned int  -gpgme_recipients_count (const gpgme_recipients_t rset) -{ -  gpgme_user_id_t uid = rset->list; -  unsigned int count = 0; -     -  while (uid) -    { -      count++; -      uid = uid->next; -    } - -  return count; -} - - -/* Start an enumeration on the recipient set RSET.  The caller must -   pass the address of a void pointer which is used as the iterator -   object.  */ -gpgme_error_t -gpgme_recipients_enum_open (const gpgme_recipients_t rset, void **iter) -{ -  *iter = rset->list; -  return 0; -} - -/* Return the name of the next recipient in the set RSET.  */ -const char * -gpgme_recipients_enum_read (const gpgme_recipients_t rset, void **iter) -{ -  gpgme_user_id_t uid; - -  uid = *iter; -  if (!uid) -    return NULL; - -  *iter = uid->next; -  return uid->name; -} - -/* Release the iterator for this object.  */ -gpgme_error_t -gpgme_recipients_enum_close (const gpgme_recipients_t rset, void **iter) -{ -  /* Not really needed, but might catch the occasional mistake.  */ -  *iter = NULL; - -  return 0; -} - - -int -_gpgme_recipients_all_valid (const gpgme_recipients_t rset) -{ -  gpgme_user_id_t uid = rset->list; - -  while (uid) -    { -      if (uid->validity != GPGME_VALIDITY_FULL -	  && uid->validity != GPGME_VALIDITY_ULTIMATE ) -	return 0; -      uid = uid->next; -    } -  return 1; -} diff --git a/gpgme/rungpg.c b/gpgme/rungpg.c index 8e766592..f9fa4c57 100644 --- a/gpgme/rungpg.c +++ b/gpgme/rungpg.c @@ -1235,26 +1235,25 @@ gpg_edit (void *engine, gpgme_key_t key, gpgme_data_t out,  static gpgme_error_t -append_args_from_recipients (GpgObject gpg, const gpgme_recipients_t rset) +append_args_from_recipients (GpgObject gpg, gpgme_user_id_t uid)  {    gpgme_error_t err = 0; -  gpgme_user_id_t uid; -  assert (rset); -  for (uid = rset->list; uid; uid = uid->next) +  while (uid)      {        err = add_arg (gpg, "-r");        if (!err)  	err = add_arg (gpg, uid->uid);        if (err)  	break; +      uid = uid->next;      }        return err;  }  static gpgme_error_t -gpg_encrypt (void *engine, gpgme_recipients_t recp, gpgme_data_t plain, +gpg_encrypt (void *engine, gpgme_user_id_t recp, gpgme_data_t plain,  	     gpgme_data_t ciph, int use_armor)  {    GpgObject gpg = engine; @@ -1270,7 +1269,7 @@ gpg_encrypt (void *engine, gpgme_recipients_t recp, gpgme_data_t plain,      {        /* If we know that all recipients are valid (full or ultimate trust)  	 we can suppress further checks.  */ -      if (!err && !symmetric && _gpgme_recipients_all_valid (recp)) +      if (!err && !symmetric && _gpgme_user_ids_all_valid (recp))  	err = add_arg (gpg, "--always-trust");        if (!err) @@ -1297,7 +1296,7 @@ gpg_encrypt (void *engine, gpgme_recipients_t recp, gpgme_data_t plain,  static gpgme_error_t -gpg_encrypt_sign (void *engine, gpgme_recipients_t recp, gpgme_data_t plain, +gpg_encrypt_sign (void *engine, gpgme_user_id_t recp, gpgme_data_t plain,  		  gpgme_data_t ciph, int use_armor,  		  gpgme_ctx_t ctx /* FIXME */)  { @@ -1312,7 +1311,7 @@ gpg_encrypt_sign (void *engine, gpgme_recipients_t recp, gpgme_data_t plain,    /* If we know that all recipients are valid (full or ultimate trust)     * we can suppress further checks */ -  if (!err && _gpgme_recipients_all_valid (recp)) +  if (!err && _gpgme_user_ids_all_valid (recp))      err = add_arg (gpg, "--always-trust");    if (!err) @@ -1341,7 +1340,7 @@ gpg_encrypt_sign (void *engine, gpgme_recipients_t recp, gpgme_data_t plain,  static gpgme_error_t -gpg_export (void *engine, gpgme_recipients_t recp, gpgme_data_t keydata, +gpg_export (void *engine, gpgme_user_id_t uids, gpgme_data_t keydata,  	    int use_armor)  {    GpgObject gpg = engine; @@ -1355,16 +1354,10 @@ gpg_export (void *engine, gpgme_recipients_t recp, gpgme_data_t keydata,    if (!err)      err = add_arg (gpg, "--"); -  if (!err) +  while (!err && uids)      { -      void *ec; -      const char *s; - -      err = gpgme_recipients_enum_open (recp, &ec); -      while (!err && (s = gpgme_recipients_enum_read (recp, &ec))) -	err = add_arg (gpg, s); -      if (!err) -	err = gpgme_recipients_enum_close (recp, &ec); +      err = add_arg (gpg, uids->uid); +      uids = uids->next;      }    if (!err) diff --git a/gpgme/signers.c b/gpgme/signers.c index 4ed384bd..5dcfc481 100644 --- a/gpgme/signers.c +++ b/gpgme/signers.c @@ -29,10 +29,7 @@  #include "util.h"  #include "context.h" -/* The signers are directly stored in the context.  So this is quite -   different to a recipient set.  */ - - +  /* Delete all signers from CTX.  */  void  gpgme_signers_clear (gpgme_ctx_t ctx) diff --git a/gpgme/user-id.c b/gpgme/user-id.c new file mode 100644 index 00000000..460f3af4 --- /dev/null +++ b/gpgme/user-id.c @@ -0,0 +1,91 @@ +/* user-id.c - Managing user IDs. +   Copyright (C) 2000 Werner Koch (dd9jn) +   Copyright (C) 2001, 2002, 2003 g10 Code GmbH +  +   This file is part of GPGME. +  +   GPGME is free software; you can redistribute it and/or modify it +   under the terms of the GNU General Public License as published by +   the Free Software Foundation; either version 2 of the License, or +   (at your option) any later version. +  +   GPGME is distributed in the hope that it will be useful, but +   WITHOUT ANY WARRANTY; without even the implied warranty of +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +   General Public License for more details. +  +   You should have received a copy of the GNU General Public License +   along with GPGME; if not, write to the Free Software Foundation, +   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */ + +#if HAVE_CONFIG_H +#include <config.h> +#endif +#include <stdlib.h> +#include <string.h> + +#include <gpgme.h> + + +/* Release the user IDs in the list UID.  */ +void +gpgme_user_ids_release (gpgme_user_id_t uid) +{ +  while (uid) +    { +      gpgme_user_id_t next_uid = uid->next; + +      free (uid); +      uid = next_uid; +    } +} + + +/* Add the name NAME to the user ID list *UIDS_P (with unknown +   validity).  */ +gpgme_error_t +gpgme_user_ids_append (gpgme_user_id_t *uids_p, const char *name) +{ +  gpgme_user_id_t uids; +  gpgme_user_id_t uid; + +  if (!name || !uids_p) +    return GPGME_Invalid_Value; + +  uid = calloc (1, sizeof (*uid) + strlen (name) + 1); +  if (!uid) +    return GPGME_Out_Of_Core; + +  uid->uid = ((char *) uid) + sizeof (*uid); +  strcpy (uid->uid, name); +  uid->name = uid->uid + strlen (name); +  uid->email = uid->name; +  uid->comment = uid->name; +  uid->validity = GPGME_VALIDITY_UNKNOWN; +   +  uids = *uids_p; +  if (uids) +    { +      while (uids->next) +	uids = uids->next; +      uids->next = uid; +    } +  else +    *uids_p = uid; + +  return 0; +} + + +int +_gpgme_user_ids_all_valid (gpgme_user_id_t uid) +{ +  while (uid) +    { +      if (uid->validity != GPGME_VALIDITY_FULL +	  && uid->validity != GPGME_VALIDITY_ULTIMATE) +	return 0; +      uid = uid->next; +    } +  return 1; +} diff --git a/tests/ChangeLog b/tests/ChangeLog index 883ec7fa..35d02861 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,3 +1,10 @@ +2003-05-28  Marcus Brinkmann  <[email protected]> + +	* gpg/t-eventloop.c (main): Rewrite recipient management. +	* gpg/t-encrypt-sign.c (main): Likewise. +	* gpg/t-encrypt.c (main): Likewise. +	* gpg/t-export.c (main): Likewise. +	  2003-05-27  Marcus Brinkmann  <[email protected]>  	* gpg/Makefile.am (TESTS): Order t-keylist and t-keylist-sig after diff --git a/tests/gpg/t-encrypt-sign.c b/tests/gpg/t-encrypt-sign.c index 7e8fc3f9..8dd8235d 100644 --- a/tests/gpg/t-encrypt-sign.c +++ b/tests/gpg/t-encrypt-sign.c @@ -117,7 +117,8 @@ main (int argc, char **argv)    gpgme_ctx_t ctx;    gpgme_error_t err;    gpgme_data_t in, out; -  gpgme_recipients_t rset; +  gpgme_user_id_t rset = NULL; +  gpgme_user_id_t *rset_lastp = &rset;    gpgme_encrypt_result_t result;    gpgme_sign_result_t sign_result;    char *agent_info; @@ -139,15 +140,15 @@ main (int argc, char **argv)    err = gpgme_data_new (&out);    fail_if_err (err); -     -  err = gpgme_recipients_new (&rset); -  fail_if_err (err); -  err = gpgme_recipients_add_name_with_validity (rset, "Bob", -						 GPGME_VALIDITY_FULL); + +  err = gpgme_user_ids_append (rset_lastp, "Alpha");    fail_if_err (err); -  err = gpgme_recipients_add_name_with_validity (rset, "Alpha", -						 GPGME_VALIDITY_FULL); +  (*rset_lastp)->validity = GPGME_VALIDITY_FULL; + +  rset_lastp = &(*rset_lastp)->next; +  err = gpgme_user_ids_append (rset_lastp, "Bob");    fail_if_err (err); +  (*rset_lastp)->validity = GPGME_VALIDITY_FULL;    err = gpgme_op_encrypt_sign (ctx, rset, in, out);    fail_if_err (err); @@ -162,11 +163,9 @@ main (int argc, char **argv)    check_result (sign_result, GPGME_SIG_MODE_NORMAL);    print_data (out); -  gpgme_recipients_release (rset); +  gpgme_user_ids_release (rset);    gpgme_data_release (in);    gpgme_data_release (out);    gpgme_release (ctx);    return 0;  } - - diff --git a/tests/gpg/t-encrypt.c b/tests/gpg/t-encrypt.c index 1bd7bbf6..0e41eb37 100644 --- a/tests/gpg/t-encrypt.c +++ b/tests/gpg/t-encrypt.c @@ -60,7 +60,8 @@ main (int argc, char **argv)    gpgme_ctx_t ctx;    gpgme_error_t err;    gpgme_data_t in, out; -  gpgme_recipients_t rset; +  gpgme_user_id_t rset = NULL; +  gpgme_user_id_t *rset_lastp = &rset;    gpgme_encrypt_result_t result;    err = gpgme_engine_check_version (GPGME_PROTOCOL_OpenPGP); @@ -76,14 +77,14 @@ main (int argc, char **argv)    err = gpgme_data_new (&out);    fail_if_err (err); -  err = gpgme_recipients_new (&rset); +  err = gpgme_user_ids_append (rset_lastp, "Alpha");    fail_if_err (err); -  err = gpgme_recipients_add_name_with_validity (rset, "Bob", -						 GPGME_VALIDITY_FULL); -  fail_if_err (err); -  err = gpgme_recipients_add_name_with_validity (rset, "Alpha", -						 GPGME_VALIDITY_FULL); +  (*rset_lastp)->validity = GPGME_VALIDITY_FULL; + +  rset_lastp = &(*rset_lastp)->next; +  err = gpgme_user_ids_append (rset_lastp, "Bob");    fail_if_err (err); +  (*rset_lastp)->validity = GPGME_VALIDITY_FULL;    err = gpgme_op_encrypt (ctx, rset, in, out);    fail_if_err (err); @@ -96,7 +97,7 @@ main (int argc, char **argv)      }    print_data (out); -  gpgme_recipients_release (rset); +  gpgme_user_ids_release (rset);    gpgme_data_release (in);    gpgme_data_release (out);    gpgme_release (ctx); diff --git a/tests/gpg/t-eventloop.c b/tests/gpg/t-eventloop.c index 66dce7fc..597da1c1 100644 --- a/tests/gpg/t-eventloop.c +++ b/tests/gpg/t-eventloop.c @@ -27,11 +27,18 @@  #include <gpgme.h> -#define fail_if_err(a) do { if(a) {                                       \ -                               fprintf (stderr, "%s:%d: gpgme_error_t %s\n", \ -                                __FILE__, __LINE__, gpgme_strerror(a));   \ -                                exit (1); }                               \ -                             } while(0) +#define fail_if_err(err)					\ +  do								\ +    {								\ +      if (err)							\ +        {							\ +          fprintf (stderr, "%s:%d: gpgme_error_t %s\n",		\ +                   __FILE__, __LINE__, gpgme_strerror (err));   \ +          exit (1);						\ +        }							\ +    }								\ +  while (0) +  static void  print_data (gpgme_data_t dh) @@ -114,6 +121,7 @@ io_event (void *data, gpgme_event_io_t type, void *type_data)      }  } +  int  do_select (void)  { @@ -166,6 +174,7 @@ my_wait (void)    return 0;  } +  struct gpgme_io_cbs io_cbs =    {      add_io_cb, @@ -175,13 +184,15 @@ struct gpgme_io_cbs io_cbs =      &op_result    }; +  int   main (int argc, char *argv[])  {    gpgme_ctx_t ctx;    gpgme_error_t err;    gpgme_data_t in, out; -  gpgme_recipients_t rset; +  gpgme_user_id_t rset = NULL; +  gpgme_user_id_t *rset_lastp = &rset;    int i;    for (i = 0; i < FDLIST_MAX; i++) @@ -190,49 +201,43 @@ main (int argc, char *argv[])    err = gpgme_engine_check_version (GPGME_PROTOCOL_OpenPGP);    fail_if_err (err); -  do -    { -      err = gpgme_new (&ctx); -      fail_if_err (err); -      gpgme_set_armor (ctx, 1); -      gpgme_set_io_cbs (ctx, &io_cbs); -      op_result.done = 0; - -      err = gpgme_data_new_from_mem (&in, "Hallo Leute\n", 12, 0); -      fail_if_err (err); - -      err = gpgme_data_new (&out); -      fail_if_err (err); - -      err = gpgme_recipients_new (&rset); -      fail_if_err (err); -      err = gpgme_recipients_add_name_with_validity (rset, "Bob", -						     GPGME_VALIDITY_FULL); -      fail_if_err (err); -      err = gpgme_recipients_add_name_with_validity (rset, "Alpha", -						     GPGME_VALIDITY_FULL); -      fail_if_err (err); - -      err = gpgme_op_encrypt_start (ctx, rset, in, out); -      fail_if_err (err); - -      my_wait (); -      fail_if_err (op_result.err); -      fail_if_err (err); - -      fflush (NULL); -      fputs ("Begin Result:\n", stdout); -      print_data (out); -      fputs ("End Result.\n", stdout); +  err = gpgme_new (&ctx); +  fail_if_err (err); +  gpgme_set_armor (ctx, 1); +  gpgme_set_io_cbs (ctx, &io_cbs); +  op_result.done = 0; + +  err = gpgme_data_new_from_mem (&in, "Hallo Leute\n", 12, 0); +  fail_if_err (err); + +  err = gpgme_data_new (&out); +  fail_if_err (err); + +  err = gpgme_user_ids_append (rset_lastp, "Alpha"); +  fail_if_err (err); +  (*rset_lastp)->validity = GPGME_VALIDITY_FULL; + +  rset_lastp = &(*rset_lastp)->next; +  err = gpgme_user_ids_append (rset_lastp, "Bob"); +  fail_if_err (err); +  (*rset_lastp)->validity = GPGME_VALIDITY_FULL; + +  err = gpgme_op_encrypt_start (ctx, rset, in, out); +  fail_if_err (err); + +  my_wait (); +  fail_if_err (op_result.err); +  fail_if_err (err); + +  fflush (NULL); +  fputs ("Begin Result:\n", stdout); +  print_data (out); +  fputs ("End Result.\n", stdout); -      gpgme_recipients_release (rset); -      gpgme_data_release (in); -      gpgme_data_release (out); -      gpgme_release (ctx); -    } -  while (argc > 1 && !strcmp (argv[1], "--loop")); +  gpgme_user_ids_release (rset); +  gpgme_data_release (in); +  gpgme_data_release (out); +  gpgme_release (ctx);    return 0;  } - - diff --git a/tests/gpg/t-export.c b/tests/gpg/t-export.c index 520a3d33..d36dbb2b 100644 --- a/tests/gpg/t-export.c +++ b/tests/gpg/t-export.c @@ -1,23 +1,22 @@ -/* t-export.c  - regression test - *	Copyright (C) 2000 Werner Koch (dd9jn) - *      Copyright (C) 2001 g10 Code GmbH - * - * This file is part of GPGME. - * - * GPGME is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * GPGME is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ +/* t-export.c - Regression test. +   Copyright (C) 2000 Werner Koch (dd9jn) +   Copyright (C) 2001, 2003 g10 Code GmbH + +   This file is part of GPGME. +  +   GPGME is free software; you can redistribute it and/or modify it +   under the terms of the GNU General Public License as published by +   the Free Software Foundation; either version 2 of the License, or +   (at your option) any later version. +  +   GPGME is distributed in the hope that it will be useful, but +   WITHOUT ANY WARRANTY; without even the implied warranty of +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +   General Public License for more details. +  +   You should have received a copy of the GNU General Public License +   along with GPGME; if not, write to the Free Software Foundation, +   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */  #include <stdio.h>  #include <stdlib.h> @@ -26,11 +25,17 @@  #include <gpgme.h> -#define fail_if_err(a) do { if(a) {                                       \ -                               fprintf (stderr, "%s:%d: gpgme_error_t %s\n", \ -                                __FILE__, __LINE__, gpgme_strerror(a));   \ -                                exit (1); }                               \ -                             } while(0) +#define fail_if_err(err)					\ +  do								\ +    {								\ +      if (err)							\ +        {							\ +          fprintf (stderr, "%s:%d: gpgme_error_t %s\n",		\ +                   __FILE__, __LINE__, gpgme_strerror (err));   \ +          exit (1);						\ +        }							\ +    }								\ +  while (0)  static void @@ -48,43 +53,43 @@ print_data (gpgme_data_t dh)      fail_if_err (GPGME_File_Error);  } +  int  -main (int argc, char **argv ) +main (int argc, char **argv)  { -    gpgme_ctx_t ctx; -    gpgme_error_t err; -    gpgme_data_t  out; -    gpgme_recipients_t rset; - -  do { -    err = gpgme_new (&ctx); -    fail_if_err (err); - -    err = gpgme_data_new ( &out ); -    fail_if_err (err); - -    err = gpgme_recipients_new (&rset); -    fail_if_err (err); -    err = gpgme_recipients_add_name (rset, "Bob"); -    fail_if_err (err); -    err = gpgme_recipients_add_name (rset, "Alpha"); -    fail_if_err (err); - -    gpgme_set_armor (ctx, 1 ); -    err = gpgme_op_export (ctx, rset, out ); -    fail_if_err (err); - -    fflush (NULL); -    fputs ("Begin Result:\n", stdout ); -    print_data (out); -    fputs ("End Result.\n", stdout ); +  gpgme_ctx_t ctx; +  gpgme_error_t err; +  gpgme_data_t  out; +  gpgme_user_id_t uids = NULL; +  gpgme_user_id_t *uids_lastp = &uids; + +  err = gpgme_new (&ctx); +  fail_if_err (err); + +  err = gpgme_data_new (&out); +  fail_if_err (err); + +  err = gpgme_user_ids_append (uids_lastp, "Alpha"); +  fail_if_err (err); +  uids_lastp = &(*uids_lastp)->next; + +  err = gpgme_user_ids_append (uids_lastp, "Bob"); +  fail_if_err (err); + +  gpgme_set_armor (ctx, 1); +  err = gpgme_op_export (ctx, uids, out); +  fail_if_err (err); + +  fflush (NULL); +  fputs ("Begin Result:\n", stdout); +  print_data (out); +  fputs ("End Result.\n", stdout); -    gpgme_recipients_release (rset); -    gpgme_data_release (out); -    gpgme_release (ctx); -  } while ( argc > 1 && !strcmp( argv[1], "--loop" ) ); +  gpgme_user_ids_release (uids); +  gpgme_data_release (out); +  gpgme_release (ctx); -    return 0; +  return 0;  } | 
