#include <k5-int.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
#include <kdb.h>
#define safe_realloc(p,n) ((p)?(realloc(p,n)):(malloc(n)))
krb5_error_code
krb5_dbe_update_tl_data(krb5_context context, krb5_db_entry *entry,
krb5_tl_data *new_tl_data)
{
krb5_tl_data * tl_data;
krb5_octet * tmp;
if ((tmp = (krb5_octet *) malloc(new_tl_data->tl_data_length)) == NULL)
return(ENOMEM);
for (tl_data = entry->tl_data; tl_data; tl_data = tl_data->tl_data_next)
if (tl_data->tl_data_type == new_tl_data->tl_data_type)
break;
if (!tl_data) {
if ((tl_data = (krb5_tl_data *) calloc(1, sizeof(krb5_tl_data)))
== NULL) {
free(tmp);
return(ENOMEM);
}
tl_data->tl_data_next = entry->tl_data;
entry->tl_data = tl_data;
entry->n_tl_data++;
}
if (tl_data->tl_data_contents)
free(tl_data->tl_data_contents);
tl_data->tl_data_type = new_tl_data->tl_data_type;
tl_data->tl_data_length = new_tl_data->tl_data_length;
tl_data->tl_data_contents = tmp;
memcpy(tmp, new_tl_data->tl_data_contents, tl_data->tl_data_length);
return(0);
}
krb5_error_code
krb5_dbe_lookup_tl_data(krb5_context context, krb5_db_entry *entry,
krb5_tl_data *ret_tl_data)
{
krb5_tl_data *tl_data;
for (tl_data = entry->tl_data; tl_data; tl_data = tl_data->tl_data_next) {
if (tl_data->tl_data_type == ret_tl_data->tl_data_type) {
*ret_tl_data = *tl_data;
return(0);
}
}
ret_tl_data->tl_data_length = 0;
ret_tl_data->tl_data_contents = NULL;
return(0);
}
krb5_error_code
krb5_dbe_update_last_pwd_change(krb5_context context, krb5_db_entry *entry,
krb5_timestamp stamp)
{
krb5_tl_data tl_data;
krb5_octet buf[4];
tl_data.tl_data_type = KRB5_TL_LAST_PWD_CHANGE;
tl_data.tl_data_length = sizeof(buf);
krb5_kdb_encode_int32((krb5_int32) stamp, buf);
tl_data.tl_data_contents = buf;
return(krb5_dbe_update_tl_data(context, entry, &tl_data));
}
krb5_error_code
krb5_dbe_lookup_last_pwd_change(krb5_context context, krb5_db_entry *entry,
krb5_timestamp *stamp)
{
krb5_tl_data tl_data;
krb5_error_code code;
krb5_int32 tmp;
tl_data.tl_data_type = KRB5_TL_LAST_PWD_CHANGE;
if ((code = krb5_dbe_lookup_tl_data(context, entry, &tl_data)))
return(code);
if (tl_data.tl_data_length != 4) {
*stamp = 0;
return(0);
}
krb5_kdb_decode_int32(tl_data.tl_data_contents, tmp);
*stamp = (krb5_timestamp) tmp;
return(0);
}