doc/
2005-09-30 Marcus Brinkmann <marcus@g10code.de> * gpgme.texi (Data Buffer I/O Operations, Data Buffer Meta-Data): New subsections. gpgme/ 2005-09-30 Marcus Brinkmann <marcus@g10code.de> * data.h (struct gpgme_data): New member file_name. * data.c (gpgme_data_set_filename): New function. (_gpgme_data_release): Free DH->filename if necessary. (gpgme_data_get_filename): New function. * rungpg.c (gpg_encrypt): Set filename option. (gpg_encrypt_sign): Likewise. (gpg_sign): Likewise. * libgpgme.vers (GPGME_1.1): Add gpgme_data_set_file_name and gpgme_data_get_file_name. tests/ 2005-09-30 Marcus Brinkmann <marcus@g10code.de> * gpg/Makefile.am (TESTS): Add t-filename. * gpg/t-filename.c: New file.
This commit is contained in:
parent
74db831fc8
commit
c6ee58ef55
10
NEWS
10
NEWS
@ -32,6 +32,11 @@ Noteworthy changes in version 1.1.0 (unreleased)
|
|||||||
indicates if a key can be used for qualified signatures according
|
indicates if a key can be used for qualified signatures according
|
||||||
to local government regulations.
|
to local government regulations.
|
||||||
|
|
||||||
|
* You can associate a filename with a data object using the new
|
||||||
|
gpgme_data_set_filename() function. This filename will be stored
|
||||||
|
in the output when encrypting or signing the data and will be
|
||||||
|
returned when decrypting or verifying the output data.
|
||||||
|
|
||||||
* Interface changes relative to the 1.0.3 release:
|
* Interface changes relative to the 1.0.3 release:
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
gpgme_set_engine_info NEW
|
gpgme_set_engine_info NEW
|
||||||
@ -40,11 +45,12 @@ gpgme_ctx_set_engine_info NEW
|
|||||||
gpgme_recipient_t NEW
|
gpgme_recipient_t NEW
|
||||||
gpgme_decrypt_result_t EXTENDED: New field recipients.
|
gpgme_decrypt_result_t EXTENDED: New field recipients.
|
||||||
gpgme_verify_result_t EXTENDED: New fields pubkey_algo, hash_algo.
|
gpgme_verify_result_t EXTENDED: New fields pubkey_algo, hash_algo.
|
||||||
gpgme_decrypt_result_t EXTENDED: New field file_name.
|
gpgme_decrypt_result_t EXTENDED: New field plaintext_filename.
|
||||||
gpgme_verify_result_t EXTENDED: New field file_name.
|
gpgme_verify_result_t EXTENDED: New field plaintext_filename.
|
||||||
GPGME_STATUS_PLAINTEXT NEW
|
GPGME_STATUS_PLAINTEXT NEW
|
||||||
gpgme_key_t EXTENDED: New field is_qualified.
|
gpgme_key_t EXTENDED: New field is_qualified.
|
||||||
gpgme_subkey_t EXTENDED: New field is_qualified.
|
gpgme_subkey_t EXTENDED: New field is_qualified.
|
||||||
|
gpgme_data_set_filename NEW
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
2005-09-30 Marcus Brinkmann <marcus@g10code.de>
|
2005-09-30 Marcus Brinkmann <marcus@g10code.de>
|
||||||
|
|
||||||
|
* gpgme.texi (Data Buffer I/O Operations, Data Buffer Meta-Data):
|
||||||
|
New subsections.
|
||||||
|
|
||||||
* gpgme.texi: Replace plaintext_filename with file_name.
|
* gpgme.texi: Replace plaintext_filename with file_name.
|
||||||
|
|
||||||
* gpgme.texi (Key Management): Document is_qualified.
|
* gpgme.texi (Key Management): Document is_qualified.
|
||||||
|
@ -153,6 +153,11 @@ Creating Data Buffers
|
|||||||
* File Based Data Buffers:: Creating file based data buffers.
|
* File Based Data Buffers:: Creating file based data buffers.
|
||||||
* Callback Based Data Buffers:: Creating callback based data buffers.
|
* Callback Based Data Buffers:: Creating callback based data buffers.
|
||||||
|
|
||||||
|
Manipulating Data Buffers
|
||||||
|
|
||||||
|
* Data Buffer I/O Operations:: I/O operations on data buffers.
|
||||||
|
* Data Buffer Meta-Data:: Meta-data manipulation of data buffers.
|
||||||
|
|
||||||
Contexts
|
Contexts
|
||||||
|
|
||||||
* Creating Contexts:: Creating new @acronym{GPGME} contexts.
|
* Creating Contexts:: Creating new @acronym{GPGME} contexts.
|
||||||
@ -1716,7 +1721,24 @@ be returned to the user, the function will return @code{NULL}.
|
|||||||
|
|
||||||
@node Manipulating Data Buffers
|
@node Manipulating Data Buffers
|
||||||
@section Manipulating Data Buffers
|
@section Manipulating Data Buffers
|
||||||
@cindex data buffere, manipulation
|
@cindex data buffer, manipulation
|
||||||
|
|
||||||
|
Data buffers contain data and meta-data. The following operations can
|
||||||
|
be used to manipulate both.
|
||||||
|
|
||||||
|
|
||||||
|
@menu
|
||||||
|
* Data Buffer I/O Operations:: I/O operations on data buffers.
|
||||||
|
* Data Buffer Meta-Data:: Meta-data manipulation of data buffers.
|
||||||
|
@end menu
|
||||||
|
|
||||||
|
|
||||||
|
@node Data Buffer I/O Operations
|
||||||
|
@subsection Data Buffer I/O Operations
|
||||||
|
@cindex data buffer, I/O operations
|
||||||
|
@cindex data buffer, read
|
||||||
|
@cindex data buffer, write
|
||||||
|
@cindex data buffer, seek
|
||||||
|
|
||||||
@deftypefun ssize_t gpgme_data_read (@w{gpgme_data_t @var{dh}}, @w{void *@var{buffer}}, @w{size_t @var{length}})
|
@deftypefun ssize_t gpgme_data_read (@w{gpgme_data_t @var{dh}}, @w{void *@var{buffer}}, @w{size_t @var{length}})
|
||||||
The function @code{gpgme_data_read} reads up to @var{length} bytes
|
The function @code{gpgme_data_read} reads up to @var{length} bytes
|
||||||
@ -1783,9 +1805,39 @@ The function @code{gpgme_data_rewind} is equivalent to:
|
|||||||
@end example
|
@end example
|
||||||
@end deftypefun
|
@end deftypefun
|
||||||
|
|
||||||
@c
|
|
||||||
@c gpgme_data_encoding_t
|
|
||||||
@c
|
|
||||||
|
@node Data Buffer Meta-Data
|
||||||
|
@subsection Data Buffer Meta-Data
|
||||||
|
@cindex data buffer, meta-data
|
||||||
|
@cindex data buffer, file name
|
||||||
|
@cindex data buffer, encoding
|
||||||
|
|
||||||
|
@deftypefun char *gpgme_data_get_file_name (@w{gpgme_data_t @var{dh}})
|
||||||
|
The function @code{gpgme_data_get_file_name} returns a pointer to a
|
||||||
|
string containing the file name associated with the data object. The
|
||||||
|
file name will be stored in the output when encrypting or signing the
|
||||||
|
data and will be returned to the user when decrypting or verifying the
|
||||||
|
output data.
|
||||||
|
|
||||||
|
If no error occurs, the string containing the file name is returned.
|
||||||
|
Otherwise, @code{NULL} will be returned.
|
||||||
|
@end deftypefun
|
||||||
|
|
||||||
|
|
||||||
|
@deftypefun gpgme_error_t gpgme_data_set_file_name (@w{gpgme_data_t @var{dh}}, @w{const char *@var{file_name}})
|
||||||
|
The function @code{gpgme_data_set_file_name} sets the file name
|
||||||
|
associated with the data object. The file name will be stored in the
|
||||||
|
output when encrypting or signing the data and will be returned to the
|
||||||
|
user when decrypting or verifying the output data.
|
||||||
|
|
||||||
|
The function returns the error code @code{GPG_ERR_INV_VALUE} if
|
||||||
|
@var{dh} is not a valid pointer and @code{GPG_ERR_ENOMEM} if not
|
||||||
|
enough memory is available.
|
||||||
|
@end deftypefun
|
||||||
|
|
||||||
|
|
||||||
@deftp {Data type} {enum gpgme_data_encoding_t}
|
@deftp {Data type} {enum gpgme_data_encoding_t}
|
||||||
@tindex gpgme_data_encoding_t
|
@tindex gpgme_data_encoding_t
|
||||||
The @code{gpgme_data_encoding_t} type specifies the encoding of a
|
The @code{gpgme_data_encoding_t} type specifies the encoding of a
|
||||||
|
@ -1,5 +1,15 @@
|
|||||||
2005-09-30 Marcus Brinkmann <marcus@g10code.de>
|
2005-09-30 Marcus Brinkmann <marcus@g10code.de>
|
||||||
|
|
||||||
|
* data.h (struct gpgme_data): New member file_name.
|
||||||
|
* data.c (gpgme_data_set_filename): New function.
|
||||||
|
(_gpgme_data_release): Free DH->filename if necessary.
|
||||||
|
(gpgme_data_get_filename): New function.
|
||||||
|
* rungpg.c (gpg_encrypt): Set filename option.
|
||||||
|
(gpg_encrypt_sign): Likewise.
|
||||||
|
(gpg_sign): Likewise.
|
||||||
|
* libgpgme.vers (GPGME_1.1): Add gpgme_data_set_file_name and
|
||||||
|
gpgme_data_get_file_name.
|
||||||
|
|
||||||
* decrpyt.c, verify.c, gpgme.h: Replace plaintext_filename with
|
* decrpyt.c, verify.c, gpgme.h: Replace plaintext_filename with
|
||||||
file_name.
|
file_name.
|
||||||
|
|
||||||
|
36
gpgme/data.c
36
gpgme/data.c
@ -57,7 +57,11 @@ _gpgme_data_new (gpgme_data_t *r_dh, struct _gpgme_data_cbs *cbs)
|
|||||||
void
|
void
|
||||||
_gpgme_data_release (gpgme_data_t dh)
|
_gpgme_data_release (gpgme_data_t dh)
|
||||||
{
|
{
|
||||||
if (dh)
|
if (!dh)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (dh->file_name)
|
||||||
|
free (dh->file_name);
|
||||||
free (dh);
|
free (dh);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -167,6 +171,36 @@ gpgme_data_set_encoding (gpgme_data_t dh, gpgme_data_encoding_t enc)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Set the file name associated with the data object with handle DH to
|
||||||
|
FILE_NAME. */
|
||||||
|
gpgme_error_t
|
||||||
|
gpgme_data_set_file_name (gpgme_data_t dh, const char *file_name)
|
||||||
|
{
|
||||||
|
if (!dh)
|
||||||
|
return gpg_error (GPG_ERR_INV_VALUE);
|
||||||
|
|
||||||
|
if (dh->file_name)
|
||||||
|
free (dh->file_name);
|
||||||
|
|
||||||
|
dh->file_name = strdup (file_name);
|
||||||
|
if (!dh->file_name)
|
||||||
|
return gpg_error_from_errno (errno);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get the file name associated with the data object with handle DH,
|
||||||
|
or NULL if there is none. */
|
||||||
|
char *
|
||||||
|
gpgme_data_get_file_name (gpgme_data_t dh)
|
||||||
|
{
|
||||||
|
if (!dh)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return dh->file_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Functions to support the wait interface. */
|
/* Functions to support the wait interface. */
|
||||||
|
|
||||||
|
@ -77,6 +77,9 @@ struct gpgme_data
|
|||||||
char pending[BUFFER_SIZE];
|
char pending[BUFFER_SIZE];
|
||||||
int pending_len;
|
int pending_len;
|
||||||
|
|
||||||
|
/* File name of the data object. */
|
||||||
|
char *file_name;
|
||||||
|
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
/* For gpgme_data_new_from_fd. */
|
/* For gpgme_data_new_from_fd. */
|
||||||
|
@ -952,6 +952,14 @@ gpgme_data_encoding_t gpgme_data_get_encoding (gpgme_data_t dh);
|
|||||||
gpgme_error_t gpgme_data_set_encoding (gpgme_data_t dh,
|
gpgme_error_t gpgme_data_set_encoding (gpgme_data_t dh,
|
||||||
gpgme_data_encoding_t enc);
|
gpgme_data_encoding_t enc);
|
||||||
|
|
||||||
|
/* Get the filename associated with the data object with handle DH, or
|
||||||
|
NULL if there is none. */
|
||||||
|
char *gpgme_data_get_file_name (gpgme_data_t dh);
|
||||||
|
|
||||||
|
/* Set the filename associated with the data object with handle DH to
|
||||||
|
FILE_NAME. */
|
||||||
|
gpgme_error_t gpgme_data_set_file_name (gpgme_data_t dh,
|
||||||
|
const char *file_name);
|
||||||
|
|
||||||
|
|
||||||
/* Create a new data buffer which retrieves the data from the callback
|
/* Create a new data buffer which retrieves the data from the callback
|
||||||
|
@ -27,6 +27,9 @@ GPGME_1.1 {
|
|||||||
|
|
||||||
gpgme_ctx_get_engine_info;
|
gpgme_ctx_get_engine_info;
|
||||||
gpgme_ctx_set_engine_info;
|
gpgme_ctx_set_engine_info;
|
||||||
|
|
||||||
|
gpgme_data_set_file_name;
|
||||||
|
gpgme_data_get_file_name;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -1339,6 +1339,13 @@ gpg_encrypt (void *engine, gpgme_key_t recp[], gpgme_encrypt_flags_t flags,
|
|||||||
err = add_arg (gpg, "-");
|
err = add_arg (gpg, "-");
|
||||||
if (!err)
|
if (!err)
|
||||||
err = add_data (gpg, ciph, 1, 1);
|
err = add_data (gpg, ciph, 1, 1);
|
||||||
|
if (gpgme_data_get_file_name (plain))
|
||||||
|
{
|
||||||
|
if (!err)
|
||||||
|
err = add_arg (gpg, "--set-filename");
|
||||||
|
if (!err)
|
||||||
|
err = add_arg (gpg, gpgme_data_get_file_name (plain));
|
||||||
|
}
|
||||||
if (!err)
|
if (!err)
|
||||||
err = add_arg (gpg, "--");
|
err = add_arg (gpg, "--");
|
||||||
if (!err)
|
if (!err)
|
||||||
@ -1384,6 +1391,13 @@ gpg_encrypt_sign (void *engine, gpgme_key_t recp[],
|
|||||||
err = add_arg (gpg, "-");
|
err = add_arg (gpg, "-");
|
||||||
if (!err)
|
if (!err)
|
||||||
err = add_data (gpg, ciph, 1, 1);
|
err = add_data (gpg, ciph, 1, 1);
|
||||||
|
if (gpgme_data_get_file_name (plain))
|
||||||
|
{
|
||||||
|
if (!err)
|
||||||
|
err = add_arg (gpg, "--set-filename");
|
||||||
|
if (!err)
|
||||||
|
err = add_arg (gpg, gpgme_data_get_file_name (plain));
|
||||||
|
}
|
||||||
if (!err)
|
if (!err)
|
||||||
err = add_arg (gpg, "--");
|
err = add_arg (gpg, "--");
|
||||||
if (!err)
|
if (!err)
|
||||||
@ -1595,6 +1609,14 @@ gpg_sign (void *engine, gpgme_data_t in, gpgme_data_t out,
|
|||||||
if (!err)
|
if (!err)
|
||||||
err = append_args_from_signers (gpg, ctx);
|
err = append_args_from_signers (gpg, ctx);
|
||||||
|
|
||||||
|
if (gpgme_data_get_file_name (in))
|
||||||
|
{
|
||||||
|
if (!err)
|
||||||
|
err = add_arg (gpg, "--set-filename");
|
||||||
|
if (!err)
|
||||||
|
err = add_arg (gpg, gpgme_data_get_file_name (in));
|
||||||
|
}
|
||||||
|
|
||||||
/* Tell the gpg object about the data. */
|
/* Tell the gpg object about the data. */
|
||||||
if (!err)
|
if (!err)
|
||||||
err = add_data (gpg, in, 0, 0);
|
err = add_data (gpg, in, 0, 0);
|
||||||
|
@ -1,3 +1,8 @@
|
|||||||
|
2005-09-30 Marcus Brinkmann <marcus@g10code.de>
|
||||||
|
|
||||||
|
* gpg/Makefile.am (TESTS): Add t-filename.
|
||||||
|
* gpg/t-filename.c: New file.
|
||||||
|
|
||||||
2005-09-23 Werner Koch <wk@g10code.com>
|
2005-09-23 Werner Koch <wk@g10code.com>
|
||||||
|
|
||||||
* gpg/t-support.h (init_gpgme) [W32]: Don't use LC_MESSAGES.
|
* gpg/t-support.h (init_gpgme) [W32]: Don't use LC_MESSAGES.
|
||||||
|
@ -28,7 +28,8 @@ noinst_HEADERS = t-support.h
|
|||||||
TESTS = t-encrypt t-encrypt-sym t-encrypt-sign t-sign t-signers \
|
TESTS = t-encrypt t-encrypt-sym t-encrypt-sign t-sign t-signers \
|
||||||
t-decrypt t-verify t-decrypt-verify \
|
t-decrypt t-verify t-decrypt-verify \
|
||||||
t-export t-import t-trustlist t-eventloop t-edit \
|
t-export t-import t-trustlist t-eventloop t-edit \
|
||||||
t-keylist t-keylist-sig t-thread1 t-wait t-encrypt-large
|
t-keylist t-keylist-sig t-thread1 t-wait t-encrypt-large \
|
||||||
|
t-file-name
|
||||||
|
|
||||||
CLEANFILES = secring.gpg pubring.gpg trustdb.gpg
|
CLEANFILES = secring.gpg pubring.gpg trustdb.gpg
|
||||||
DISTCLEANFILES = pubring.gpg~ random_seed
|
DISTCLEANFILES = pubring.gpg~ random_seed
|
||||||
|
99
tests/gpg/t-file-name.c
Normal file
99
tests/gpg/t-file-name.c
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
/* t-file-name.c - Regression test.
|
||||||
|
Copyright (C) 2000 Werner Koch (dd9jn)
|
||||||
|
Copyright (C) 2001, 2002, 2003, 2004 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 Lesser General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2.1 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
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser 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. */
|
||||||
|
|
||||||
|
/* We need to include config.h so that we know whether we are building
|
||||||
|
with large file system (LFS) support. */
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <gpgme.h>
|
||||||
|
|
||||||
|
#include "t-support.h"
|
||||||
|
|
||||||
|
#define TESTNAME "abcde12345"
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
main (int argc, char *argv[])
|
||||||
|
{
|
||||||
|
gpgme_ctx_t ctx;
|
||||||
|
gpgme_error_t err;
|
||||||
|
gpgme_data_t in, out;
|
||||||
|
gpgme_key_t key[2] = { NULL, NULL };
|
||||||
|
gpgme_decrypt_result_t result;
|
||||||
|
char *agent_info;
|
||||||
|
|
||||||
|
init_gpgme (GPGME_PROTOCOL_OpenPGP);
|
||||||
|
|
||||||
|
err = gpgme_new (&ctx);
|
||||||
|
fail_if_err (err);
|
||||||
|
gpgme_set_armor (ctx, 1);
|
||||||
|
|
||||||
|
agent_info = getenv("GPG_AGENT_INFO");
|
||||||
|
if (!(agent_info && strchr (agent_info, ':')))
|
||||||
|
gpgme_set_passphrase_cb (ctx, passphrase_cb, NULL);
|
||||||
|
|
||||||
|
err = gpgme_data_new_from_mem (&in, "Hallo Leute\n", 12, 0);
|
||||||
|
fail_if_err (err);
|
||||||
|
|
||||||
|
err = gpgme_data_set_file_name (in, TESTNAME);
|
||||||
|
fail_if_err (err);
|
||||||
|
|
||||||
|
err = gpgme_data_new (&out);
|
||||||
|
fail_if_err (err);
|
||||||
|
|
||||||
|
err = gpgme_get_key (ctx, "A0FF4590BB6122EDEF6E3C542D727CC768697734",
|
||||||
|
&key[0], 0);
|
||||||
|
fail_if_err (err);
|
||||||
|
|
||||||
|
err = gpgme_op_encrypt (ctx, key, GPGME_ENCRYPT_ALWAYS_TRUST, in, out);
|
||||||
|
fail_if_err (err);
|
||||||
|
|
||||||
|
gpgme_data_release (in);
|
||||||
|
err = gpgme_data_new (&in);
|
||||||
|
fail_if_err (err);
|
||||||
|
|
||||||
|
err = gpgme_data_seek (out, 0, SEEK_SET);
|
||||||
|
fail_if_err (err);
|
||||||
|
|
||||||
|
err = gpgme_op_decrypt (ctx, out, in);
|
||||||
|
fail_if_err (err);
|
||||||
|
result = gpgme_op_decrypt_result (ctx);
|
||||||
|
|
||||||
|
if (strcmp (TESTNAME, result->file_name))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "%s:%i: Unexpected result file name: %s\n",
|
||||||
|
__FILE__, __LINE__,
|
||||||
|
result->file_name ? "(null)" : result->file_name);
|
||||||
|
exit (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
gpgme_key_unref (key[0]);
|
||||||
|
gpgme_data_release (in);
|
||||||
|
gpgme_data_release (out);
|
||||||
|
gpgme_release (ctx);
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user