implement fetch_kvno

This commit is contained in:
Love Hornquist Astrand
2010-11-28 11:31:15 -08:00
parent ee8c2e45b4
commit daa3d4753d

View File

@@ -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;