1
0
mirror of git://git.gnupg.org/gnupg.git synced 2024-12-22 10:19:57 +01:00

gpgsm: Add a way to save a found state.

* kbx/keybox-defs.h (keybox_found_s): New.
(keybox_handle): Factor FOUND out to above.  Add saved_found.
* kbx/keybox-init.c (keybox_release): Release saved_found.
(keybox_push_found_state, keybox_pop_found_state): New.

* sm/keydb.c (keydb_handle): Add field saved_found.
(keydb_new): Init it.
(keydb_push_found_state, keydb_pop_found_state): New.
This commit is contained in:
Werner Koch 2014-06-02 15:55:00 +02:00
parent 99972bd6e9
commit 42c043a8ad
5 changed files with 98 additions and 7 deletions

View File

@ -85,6 +85,14 @@ struct keybox_name
}; };
struct keybox_found_s
{
KEYBOXBLOB blob;
off_t offset;
size_t pk_no;
size_t uid_no;
unsigned int n_packets; /*used for delete and update*/
};
struct keybox_handle { struct keybox_handle {
CONST_KB_NAME kb; CONST_KB_NAME kb;
@ -93,13 +101,8 @@ struct keybox_handle {
int eof; int eof;
int error; int error;
int ephemeral; int ephemeral;
struct { struct keybox_found_s found;
KEYBOXBLOB blob; struct keybox_found_s saved_found;
off_t offset;
size_t pk_no;
size_t uid_no;
unsigned int n_packets; /*used for delete and update*/
} found;
struct { struct {
char *name; char *name;
char *pattern; char *pattern;

View File

@ -148,6 +148,7 @@ keybox_release (KEYBOX_HANDLE hd)
hd->kb->handle_table[idx] = NULL; hd->kb->handle_table[idx] = NULL;
} }
_keybox_release_blob (hd->found.blob); _keybox_release_blob (hd->found.blob);
_keybox_release_blob (hd->saved_found.blob);
if (hd->fp) if (hd->fp)
{ {
fclose (hd->fp); fclose (hd->fp);
@ -159,6 +160,35 @@ keybox_release (KEYBOX_HANDLE hd)
} }
/* Save the current found state in HD for later retrieval by
keybox_restore_found_state. Only one state may be saved. */
void
keybox_push_found_state (KEYBOX_HANDLE hd)
{
if (hd->saved_found.blob)
{
_keybox_release_blob (hd->saved_found.blob);
hd->saved_found.blob = NULL;
}
hd->saved_found = hd->found;
hd->found.blob = NULL;
}
/* Restore the saved found state in HD. */
void
keybox_pop_found_state (KEYBOX_HANDLE hd)
{
if (hd->found.blob)
{
_keybox_release_blob (hd->found.blob);
hd->found.blob = NULL;
}
hd->found = hd->saved_found;
hd->saved_found.blob = NULL;
}
const char * const char *
keybox_get_resource_name (KEYBOX_HANDLE hd) keybox_get_resource_name (KEYBOX_HANDLE hd)
{ {

View File

@ -64,6 +64,8 @@ int keybox_is_writable (void *token);
KEYBOX_HANDLE keybox_new (void *token, int secret); KEYBOX_HANDLE keybox_new (void *token, int secret);
void keybox_release (KEYBOX_HANDLE hd); void keybox_release (KEYBOX_HANDLE hd);
void keybox_push_found_state (KEYBOX_HANDLE hd);
void keybox_pop_found_state (KEYBOX_HANDLE hd);
const char *keybox_get_resource_name (KEYBOX_HANDLE hd); const char *keybox_get_resource_name (KEYBOX_HANDLE hd);
int keybox_set_ephemeral (KEYBOX_HANDLE hd, int yes); int keybox_set_ephemeral (KEYBOX_HANDLE hd, int yes);

View File

@ -56,6 +56,7 @@ static int used_resources;
struct keydb_handle { struct keydb_handle {
int locked; int locked;
int found; int found;
int saved_found;
int current; int current;
int is_ephemeral; int is_ephemeral;
int used; /* items in active */ int used; /* items in active */
@ -265,6 +266,7 @@ keydb_new (int secret)
hd = xcalloc (1, sizeof *hd); hd = xcalloc (1, sizeof *hd);
hd->found = -1; hd->found = -1;
hd->saved_found = -1;
assert (used_resources <= MAX_KEYDB_RESOURCES); assert (used_resources <= MAX_KEYDB_RESOURCES);
for (i=j=0; i < used_resources; i++) for (i=j=0; i < used_resources; i++)
@ -476,6 +478,58 @@ unlock_all (KEYDB_HANDLE hd)
hd->locked = 0; hd->locked = 0;
} }
/* Push the last found state if any. */
void
keydb_push_found_state (KEYDB_HANDLE hd)
{
if (!hd)
return;
if (hd->found < 0 || hd->found >= hd->used)
{
hd->saved_found = -1;
return;
}
switch (hd->active[hd->found].type)
{
case KEYDB_RESOURCE_TYPE_NONE:
break;
case KEYDB_RESOURCE_TYPE_KEYBOX:
keybox_push_found_state (hd->active[hd->found].u.kr);
break;
}
hd->saved_found = hd->found;
hd->found = -1;
}
/* Pop the last found state. */
void
keydb_pop_found_state (KEYDB_HANDLE hd)
{
if (!hd)
return;
hd->found = hd->saved_found;
hd->saved_found = -1;
if (hd->found < 0 || hd->found >= hd->used)
return;
switch (hd->active[hd->found].type)
{
case KEYDB_RESOURCE_TYPE_NONE:
break;
case KEYDB_RESOURCE_TYPE_KEYBOX:
keybox_pop_found_state (hd->active[hd->found].u.kr);
break;
}
}
/* /*
Return the last found object. Caller must free it. The returned Return the last found object. Caller must free it. The returned

View File

@ -43,6 +43,8 @@ gpg_error_t keydb_get_flags (KEYDB_HANDLE hd, int which, int idx,
unsigned int *value); unsigned int *value);
gpg_error_t keydb_set_flags (KEYDB_HANDLE hd, int which, int idx, gpg_error_t keydb_set_flags (KEYDB_HANDLE hd, int which, int idx,
unsigned int value); unsigned int value);
void keydb_push_found_state (KEYDB_HANDLE hd);
void keydb_pop_found_state (KEYDB_HANDLE hd);
int keydb_get_cert (KEYDB_HANDLE hd, ksba_cert_t *r_cert); int keydb_get_cert (KEYDB_HANDLE hd, ksba_cert_t *r_cert);
int keydb_insert_cert (KEYDB_HANDLE hd, ksba_cert_t cert); int keydb_insert_cert (KEYDB_HANDLE hd, ksba_cert_t cert);
int keydb_update_cert (KEYDB_HANDLE hd, ksba_cert_t cert); int keydb_update_cert (KEYDB_HANDLE hd, ksba_cert_t cert);