implement fetch_kvno
This commit is contained in:
@@ -198,7 +198,7 @@ fix_salt(krb5_context context, hdb_entry *ent, int key_num)
|
|||||||
|
|
||||||
|
|
||||||
static krb5_error_code
|
static krb5_error_code
|
||||||
mdb_value2entry(krb5_context context, krb5_data *data, hdb_entry *entry)
|
mdb_value2entry(krb5_context context, krb5_data *data, krb5_kvno kvno, hdb_entry *entry)
|
||||||
{
|
{
|
||||||
krb5_error_code ret;
|
krb5_error_code ret;
|
||||||
krb5_storage *sp;
|
krb5_storage *sp;
|
||||||
@@ -304,7 +304,7 @@ mdb_value2entry(krb5_context context, krb5_data *data, hdb_entry *entry)
|
|||||||
version = u16;
|
version = u16;
|
||||||
CHECK(ret = krb5_ret_uint16(sp, &u16));
|
CHECK(ret = krb5_ret_uint16(sp, &u16));
|
||||||
|
|
||||||
if (entry->kvno < u16) {
|
if (((entry->kvno < u16) && kvno == 0) || kvno == u16) {
|
||||||
keep = 1;
|
keep = 1;
|
||||||
entry->kvno = u16;
|
entry->kvno = u16;
|
||||||
for (j = 0; j < entry->keys.len; j++) {
|
for (j = 0; j < entry->keys.len; j++) {
|
||||||
@@ -384,6 +384,11 @@ mdb_value2entry(krb5_context context, krb5_data *data, hdb_entry *entry)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (entry->kvno == 0 && kvno != 0) {
|
||||||
|
ret = HDB_ERR_NOT_FOUND_HERE;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
out:
|
out:
|
||||||
if (p)
|
if (p)
|
||||||
@@ -480,7 +485,7 @@ mdb_seq(krb5_context context, HDB *db,
|
|||||||
data.length = value.size;
|
data.length = value.size;
|
||||||
memset(entry, 0, sizeof(*entry));
|
memset(entry, 0, sizeof(*entry));
|
||||||
|
|
||||||
if (mdb_value2entry(context, &data, &entry->entry))
|
if (mdb_value2entry(context, &data, 0, &entry->entry))
|
||||||
return mdb_seq(context, db, flags, entry, R_NEXT);
|
return mdb_seq(context, db, flags, entry, R_NEXT);
|
||||||
|
|
||||||
if (db->hdb_master_key_set && (flags & HDB_F_DECRYPT)) {
|
if (db->hdb_master_key_set && (flags & HDB_F_DECRYPT)) {
|
||||||
@@ -609,8 +614,8 @@ mdb__del(krb5_context context, HDB *db, krb5_data key)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static krb5_error_code
|
static krb5_error_code
|
||||||
mdb_fetch(krb5_context context, HDB *db, krb5_const_principal principal,
|
mdb_fetch_kvno(krb5_context context, HDB *db, krb5_const_principal principal,
|
||||||
unsigned flags, hdb_entry_ex *entry)
|
unsigned flags, krb5_kvno kvno, hdb_entry_ex *entry)
|
||||||
{
|
{
|
||||||
krb5_data key, value;
|
krb5_data key, value;
|
||||||
krb5_error_code code;
|
krb5_error_code code;
|
||||||
@@ -622,7 +627,7 @@ mdb_fetch(krb5_context context, HDB *db, krb5_const_principal principal,
|
|||||||
krb5_data_free(&key);
|
krb5_data_free(&key);
|
||||||
if(code)
|
if(code)
|
||||||
return code;
|
return code;
|
||||||
code = mdb_value2entry(context, &value, &entry->entry);
|
code = mdb_value2entry(context, &value, kvno, &entry->entry);
|
||||||
krb5_data_free(&value);
|
krb5_data_free(&value);
|
||||||
if (code)
|
if (code)
|
||||||
return code;
|
return code;
|
||||||
@@ -636,6 +641,15 @@ mdb_fetch(krb5_context context, HDB *db, krb5_const_principal principal,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static krb5_error_code
|
||||||
|
mdb_fetch(krb5_context context, HDB *db, krb5_const_principal principal,
|
||||||
|
unsigned flags, hdb_entry_ex *entry)
|
||||||
|
{
|
||||||
|
return mdb_fetch_kvno(context, db, principal,
|
||||||
|
flags & (~HDB_F_KVNO_SPECIFIED), 0, entry);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static krb5_error_code
|
static krb5_error_code
|
||||||
mdb_store(krb5_context context, HDB *db, unsigned flags, hdb_entry_ex *entry)
|
mdb_store(krb5_context context, HDB *db, unsigned flags, hdb_entry_ex *entry)
|
||||||
{
|
{
|
||||||
@@ -730,6 +744,7 @@ hdb_mdb_create(krb5_context context, HDB **db,
|
|||||||
(*db)->hdb_open = mdb_open;
|
(*db)->hdb_open = mdb_open;
|
||||||
(*db)->hdb_close = mdb_close;
|
(*db)->hdb_close = mdb_close;
|
||||||
(*db)->hdb_fetch = mdb_fetch;
|
(*db)->hdb_fetch = mdb_fetch;
|
||||||
|
(*db)->hdb_fetch_kvno = mdb_fetch_kvno;
|
||||||
(*db)->hdb_store = mdb_store;
|
(*db)->hdb_store = mdb_store;
|
||||||
(*db)->hdb_remove = mdb_remove;
|
(*db)->hdb_remove = mdb_remove;
|
||||||
(*db)->hdb_firstkey = mdb_firstkey;
|
(*db)->hdb_firstkey = mdb_firstkey;
|
||||||
|
Reference in New Issue
Block a user