aboutsummaryrefslogtreecommitdiffstats
path: root/g10/ringedit.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--g10/ringedit.c83
1 files changed, 68 insertions, 15 deletions
diff --git a/g10/ringedit.c b/g10/ringedit.c
index 677420e25..6b6f6c855 100644
--- a/g10/ringedit.c
+++ b/g10/ringedit.c
@@ -48,6 +48,7 @@
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
+#include <unistd.h> /* for truncate */
#include <assert.h>
#include "util.h"
#include "packet.h"
@@ -55,8 +56,8 @@
#include "mpi.h"
#include "iobuf.h"
#include "keydb.h"
+#include "options.h"
#include "i18n.h"
-#include <unistd.h> /* for truncate */
struct resource_table_struct {
@@ -97,29 +98,75 @@ check_pos( KBPOS *kbpos )
****************************************************************/
/****************
+ * Get the name of the keyrings, start with a sequence number pointing to a 0.
+ */
+const char *
+enum_keyblock_resources( int *sequence, int secret )
+{
+ int i = *sequence;
+ const char *name = NULL;
+
+ for(; i < MAX_RESOURCES; i++ )
+ if( resource_table[i].used && !resource_table[i].secret == !secret ) {
+ if( resource_table[i].fname ) {
+ name = resource_table[i].fname;
+ break;
+ }
+ }
+ *sequence = ++i;
+ return NULL; /* not found */
+}
+
+
+
+/****************
* Register a resource (which currently may only be a keyring file).
+ * The first keyring which is added by this function is
+ * created if it does not exist.
+ * Note: this function may be called before secure memory is
+ * available.
*/
int
-add_keyblock_resource( const char *filename, int force, int secret )
+add_keyblock_resource( const char *resname, int force, int secret )
{
+ static int any_secret, any_public;
IOBUF iobuf;
- int i;
+ int i, force;
+ char *filename;
+ int rc = 0;
+
+ if( *resname != '/' ) { /* do tilde expansion etc */
+ if( strchr(resname, '/') )
+ filename = make_filename(resname, NULL);
+ else
+ filename = make_filename(opt.homedir, resname, NULL);
+ }
+ else
+ filename = m_strdup( resname );
+
+ if( !force )
+ force = secret? !any_secret : !any_public;
for(i=0; i < MAX_RESOURCES; i++ )
if( !resource_table[i].used )
break;
- if( i == MAX_RESOURCES )
- return G10ERR_RESOURCE_LIMIT;
+ if( i == MAX_RESOURCES ) {
+ rc = G10ERR_RESOURCE_LIMIT;
+ goto leave;
+ }
- iobuf = iobuf_open( filename );
- if( !iobuf && !force )
- return G10ERR_OPEN_FILE;
+ iobuf = iobuf_fopen( filename, "rb" );
+ if( !iobuf && !force ) {
+ rc = G10ERR_OPEN_FILE;
+ goto leave;
+ }
if( !iobuf ) {
iobuf = iobuf_create( filename );
if( !iobuf ) {
log_error("%s: can't create: %s\n", filename, strerror(errno));
- return G10ERR_OPEN_FILE;
+ rc = G10ERR_OPEN_FILE;
+ goto leave;
}
else
log_info("%s: keyring created\n", filename );
@@ -135,7 +182,15 @@ add_keyblock_resource( const char *filename, int force, int secret )
resource_table[i].secret = !!secret;
resource_table[i].fname = m_strdup(filename);
resource_table[i].iobuf = iobuf;
- return 0;
+ leave:
+ if( rc )
+ log_error("keyblock resource '%s': %s\n", filename, g10_errstr(rc) );
+ else if( secret )
+ any_secret = 1;
+ else
+ any_public = 1;
+ m_free( filename );
+ return rc;
}
/****************
@@ -362,7 +417,7 @@ enum_keyblocks( int mode, KBPOS *kbpos, KBNODE *ret_root )
return -1; /* no resources */
kbpos->resno = i;
rentry = check_pos( kbpos );
- kbpos->fp = iobuf_open( rentry->fname );
+ kbpos->fp = iobuf_fopen( rentry->fname, "rb" );
if( !kbpos->fp ) {
log_error("can't open '%s'\n", rentry->fname );
return G10ERR_OPEN_FILE;
@@ -528,7 +583,6 @@ keyring_search( PACKET *req, KBPOS *kbpos, IOBUF iobuf, const char *fname )
PKT_secret_key *sk = pkt.pkt.secret_key;
if( req_sk->timestamp == sk->timestamp
- && req_sk->valid_days == sk->valid_days
&& req_sk->pubkey_algo == sk->pubkey_algo
&& !cmp_seckey( req_sk, sk) )
break; /* found */
@@ -537,7 +591,6 @@ keyring_search( PACKET *req, KBPOS *kbpos, IOBUF iobuf, const char *fname )
PKT_public_key *pk = pkt.pkt.public_key;
if( req_pk->timestamp == pk->timestamp
- && req_pk->valid_days == pk->valid_days
&& req_pk->pubkey_algo == pk->pubkey_algo
&& !cmp_pubkey( req_pk, pk ) )
break; /* found */
@@ -572,7 +625,7 @@ keyring_read( KBPOS *kbpos, KBNODE *ret_root )
if( !(rentry=check_pos(kbpos)) )
return G10ERR_GENERAL;
- a = iobuf_open( rentry->fname );
+ a = iobuf_fopen( rentry->fname, "rb" );
if( !a ) {
log_error("can't open '%s'\n", rentry->fname );
return G10ERR_OPEN_FILE;
@@ -732,7 +785,7 @@ keyring_copy( KBPOS *kbpos, int mode, KBNODE root )
BUG(); /* not allowed with such a handle */
/* open the source file */
- fp = iobuf_open( rentry->fname );
+ fp = iobuf_fopen( rentry->fname, "rb" );
if( mode == 1 && !fp && errno == ENOENT ) { /* no file yet */
KBNODE kbctx, node;