MIT compatible changes: add and use sizes to keytab entries, and

change default keytab to `/etc/krb5.keytab'.


git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@4660 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Johan Danielsson
1998-03-23 23:40:30 +00:00
parent e4bd17202d
commit 9966122253

View File

@@ -99,7 +99,7 @@ krb5_kt_resolve(krb5_context context,
return 0; return 0;
} }
#define KEYTAB_DEFAULT "FILE:/etc/v5srvtab" #define KEYTAB_DEFAULT "FILE:/etc/krb5.keytab"
krb5_error_code krb5_error_code
krb5_kt_default_name(krb5_context context, char *name, int namesize) krb5_kt_default_name(krb5_context context, char *name, int namesize)
@@ -513,15 +513,16 @@ fkt_get_name(krb5_context context,
} }
static krb5_error_code static krb5_error_code
fkt_start_seq_get(krb5_context context, fkt_start_seq_get_int(krb5_context context,
krb5_keytab id, krb5_keytab id,
int flags,
krb5_kt_cursor *c) krb5_kt_cursor *c)
{ {
int16_t tag; int16_t tag;
krb5_error_code ret; krb5_error_code ret;
struct fkt_data *d = id->data; struct fkt_data *d = id->data;
c->fd = open (d->filename, O_RDONLY); c->fd = open (d->filename, flags);
if (c->fd < 0) if (c->fd < 0)
return errno; return errno;
c->sp = krb5_storage_from_fd(c->fd); c->sp = krb5_storage_from_fd(c->fd);
@@ -535,9 +536,18 @@ fkt_start_seq_get(krb5_context context,
krb5_storage_free(c->sp); krb5_storage_free(c->sp);
close(c->fd); close(c->fd);
} }
c->offset = c->sp->seek(c->sp, 0, SEEK_CUR);
return 0; return 0;
} }
static krb5_error_code
fkt_start_seq_get(krb5_context context,
krb5_keytab id,
krb5_kt_cursor *c)
{
return fkt_start_seq_get_int(context, id, O_RDONLY, c);
}
static krb5_error_code static krb5_error_code
fkt_next_entry(krb5_context context, fkt_next_entry(krb5_context context,
krb5_keytab id, krb5_keytab id,
@@ -550,10 +560,17 @@ fkt_next_entry(krb5_context context,
int8_t tmp8; int8_t tmp8;
int32_t tmp32; int32_t tmp32;
loop:
cursor->sp->seek(cursor->sp, cursor->offset, SEEK_SET);
ret = krb5_ret_int32(cursor->sp, &tmp32); ret = krb5_ret_int32(cursor->sp, &tmp32);
if (ret) if (ret)
return ret; return ret;
if(tmp32 < 0) {
cursor->offset += 4 + -tmp32;
goto loop;
}
len = tmp32; len = tmp32;
cursor->offset += 4 + len;
ret = krb5_kt_ret_principal (cursor->sp, &entry->principal); ret = krb5_kt_ret_principal (cursor->sp, &entry->principal);
if (ret) if (ret)
return ret; return ret;
@@ -572,6 +589,10 @@ fkt_next_entry(krb5_context context,
ret = krb5_kt_ret_keyblock (cursor->sp, &entry->keyblock); ret = krb5_kt_ret_keyblock (cursor->sp, &entry->keyblock);
if (ret) if (ret)
return ret; return ret;
/* backwards compatibility with Heimdal <= 0.0n */
if(len == 4711)
cursor->offset = cursor->sp->seek(cursor->sp, 0, SEEK_CUR);
return 0; return 0;
} }
@@ -594,6 +615,7 @@ fkt_add_entry(krb5_context context,
int fd; int fd;
krb5_storage *sp; krb5_storage *sp;
struct fkt_data *d = id->data; struct fkt_data *d = id->data;
off_t pos_start, pos_end;
fd = open (d->filename, O_WRONLY | O_APPEND); fd = open (d->filename, O_WRONLY | O_APPEND);
if (fd < 0) { if (fd < 0) {
@@ -610,7 +632,8 @@ fkt_add_entry(krb5_context context,
sp = krb5_storage_from_fd(fd); sp = krb5_storage_from_fd(fd);
} }
ret = krb5_store_int32 (sp, 4711); /* XXX */ pos_start = sp->seek(sp, 0, SEEK_CUR);
ret = krb5_store_int32 (sp, 0); /* store real size at end */
if (ret) goto out; if (ret) goto out;
ret = krb5_kt_store_principal (sp, entry->principal); ret = krb5_kt_store_principal (sp, entry->principal);
if (ret) goto out; if (ret) goto out;
@@ -622,6 +645,10 @@ fkt_add_entry(krb5_context context,
if (ret) goto out; if (ret) goto out;
ret = krb5_kt_store_keyblock (sp, &entry->keyblock); ret = krb5_kt_store_keyblock (sp, &entry->keyblock);
if (ret) goto out; if (ret) goto out;
pos_end = sp->seek(sp, 0, SEEK_CUR);
sp->seek(sp, pos_start, SEEK_SET);
ret = krb5_store_int32 (sp, pos_end - pos_start - 4);
if (ret) goto out;
krb5_storage_free (sp); krb5_storage_free (sp);
out: out:
close (fd); close (fd);
@@ -633,34 +660,34 @@ fkt_remove_entry(krb5_context context,
krb5_keytab id, krb5_keytab id,
krb5_keytab_entry *entry) krb5_keytab_entry *entry)
{ {
krb5_keytab kt;
krb5_keytab_entry e; krb5_keytab_entry e;
int fd;
char n1[1024], *n2;
krb5_kt_cursor cursor; krb5_kt_cursor cursor;
krb5_error_code ret; off_t pos_start, pos_end;
krb5_kt_get_name(context, id, n1, sizeof(n1)); fkt_start_seq_get_int(context, id, O_RDWR, &cursor);
asprintf(&n2, "FILE:%s.XXXXXX", n1); pos_start = cursor.offset;
fd = mkstemp(n2 + 5);
if(fd < 0)
return errno;
write(fd, "\5\2", 2); /* XXX add header*/
close(fd);
ret = krb5_kt_resolve(context, n2, &kt);
krb5_kt_start_seq_get(context, id, &cursor);
while(krb5_kt_next_entry(context, id, &e, &cursor) == 0) { while(krb5_kt_next_entry(context, id, &e, &cursor) == 0) {
if(!kt_compare(context, &e, entry->principal, if(kt_compare(context, &e, entry->principal,
entry->vno, entry->keyblock.keytype)) { entry->vno, entry->keyblock.keytype)) {
krb5_kt_add_entry(context, kt, &e); int32_t len;
unsigned char buf[128];
pos_end = cursor.offset;
cursor.sp->seek(cursor.sp, pos_start, SEEK_SET);
krb5_ret_int32(cursor.sp, &len);
cursor.sp->seek(cursor.sp, pos_start, SEEK_SET);
if(len == 4711)
len = pos_end - pos_start;
krb5_store_int32(cursor.sp, -len);
memset(buf, 0, sizeof(buf));
while(len > 0) {
cursor.sp->store(cursor.sp, buf, min(len, sizeof(buf)));
len -= min(len, sizeof(buf));
} }
break;
}
pos_start = cursor.offset;
} }
krb5_kt_end_seq_get(context, id, &cursor); krb5_kt_end_seq_get(context, id, &cursor);
rename(n2 + 5, n1);
free(n2);
krb5_kt_close(context, kt);
return 0; return 0;
} }