summaryrefslogtreecommitdiffstats
path: root/src/admin/edit/dump.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/admin/edit/dump.c')
-rw-r--r--src/admin/edit/dump.c324
1 files changed, 66 insertions, 258 deletions
diff --git a/src/admin/edit/dump.c b/src/admin/edit/dump.c
index 2f888c4500..cbeb5985d5 100644
--- a/src/admin/edit/dump.c
+++ b/src/admin/edit/dump.c
@@ -34,7 +34,7 @@ struct dump_record {
FILE *f;
};
-static char ld_vers[] = "kdb5_edit load_dump version 2.0\n";
+static char ld_vers[] = "kdb5_edit load_dump version 3.0\n";
krb5_encrypt_block master_encblock;
extern char *current_dbname;
@@ -46,56 +46,21 @@ void update_ok_file();
krb5_error_code
dump_iterator(ptr, entry)
- krb5_pointer ptr;
- krb5_db_entry *entry;
+ krb5_pointer ptr;
+ krb5_db_entry * entry;
{
- krb5_error_code retval;
- struct dump_record *arg = (struct dump_record *) ptr;
- char *name=NULL, *mod_name=NULL;
- int i;
+ struct dump_record * arg = (struct dump_record *) ptr;
+ krb5_error_code retval;
+ datum content;
- if (retval = krb5_unparse_name(edit_context, entry->principal, &name)) {
- com_err(arg->comerr_name, retval, "while unparsing principal");
+ if (retval = krb5_encode_princ_contents(edit_context, &content, entry)) {
+ com_err(arg->comerr_name, retval, "while encoding an entry");
exit_status++;
return retval;
}
- if (retval = krb5_unparse_name(edit_context, entry->mod_name, &mod_name)) {
- free(name);
- com_err(arg->comerr_name, retval, "while unparsing principal");
- exit_status++;
- return retval;
- }
- fprintf(arg->f, "%d\t%d\t%d\t%d\t%d\t%d\t%s\t%d\t", strlen(name),
- strlen(mod_name), entry->key.length, entry->alt_key.length,
- entry->salt_length, entry->alt_salt_length, name,
- entry->key.keytype);
- for (i=0; i<entry->key.length; i++) {
- fprintf(arg->f, "%02x", *(entry->key.contents+i));
- }
- fprintf(arg->f,
- "\t%u\t%u\t%u\t%u\t%u\t%u\t%u\t%u\t%u\t%u\t%s\t%u\t%u\t%u\t",
- entry->kvno, entry->max_life, entry->max_renewable_life,
- entry->mkvno, entry->expiration, entry->pw_expiration,
- entry->last_pwd_change, entry->last_success, entry->last_failed,
- entry->fail_auth_count, mod_name, entry->mod_date,
- entry->attributes, entry->salt_type);
- for (i=0; i<entry->salt_length; i++) {
- fprintf(arg->f, "%02x", *(entry->salt+i));
- }
- fprintf(arg->f, "\t%u\t", entry->alt_key.keytype);
- for (i=0; i<entry->alt_key.length; i++) {
- fprintf(arg->f, "%02x", *(entry->alt_key.contents+i));
- }
- fprintf(arg->f, "\t%u\t", entry->alt_salt_type);
- for (i=0; i<entry->alt_salt_length; i++) {
- fprintf(arg->f, "%02x", *(entry->alt_salt+i));
- }
- for (i=0; i < 8; i++) {
- fprintf(arg->f, "\t%u", entry->expansion[i]);
- }
+ fprintf(arg->f, "%d\t", content.dsize);
+ fwrite(content.dptr, content.dsize, 1, arg->f);
fprintf(arg->f, ";\n");
- free(name);
- free(mod_name);
return 0;
}
/*ARGSUSED*/
@@ -141,7 +106,7 @@ void dump_db(argc, argv)
fputs(ld_vers, f);
arg.comerr_name = argv[0];
arg.f = f;
- (void) krb5_db_iterate(edit_context, dump_iterator, (krb5_pointer) &arg);
+ (void)krb5_db_iterate(edit_context, dump_iterator, (krb5_pointer) &arg);
if (argc == 2)
fclose(f);
if (argv[1])
@@ -235,21 +200,21 @@ void load_db(argc, argv)
int argc;
char **argv;
{
- FILE *f;
- krb5_db_entry entry;
- krb5_error_code retval;
- int name_len, mod_name_len, key_len, alt_key_len;
- int salt_len, alt_salt_len;
- int i, one;
- char *name, *mod_name;
+ krb5_error_code retval;
+ krb5_db_entry entry;
+ datum contents;
+ FILE * f;
+ char * new_dbname;
+ char buf[64]; /* Must be longer than ld_vers */
+ int lineno;
+ int one;
+
+ int i;
int name_ret;
- char *new_dbname;
int ch;
int load_error = 0;
- int lineno = 0;
int stype;
int tmp1, tmp2, tmp3;
- char buf[64]; /* Must be longer than ld_vers */
if (argc != 3) {
com_err(argv[0], 0, "Usage: %s filename dbname", argv[0]);
@@ -301,212 +266,55 @@ void load_db(argc, argv)
if (strcmp(buf, ld_vers)) {
com_err(argv[0], 0, "Bad dump file version");
load_error++;
- goto error_out;
}
- lineno++;
- for (;;) {
- int nitems;
+ for (lineno = 1; load_error == 0; lineno++) {
+ datum contents;
+ int nitems;
- lineno++;
- memset((char *)&entry, 0, sizeof(entry));
- nitems = fscanf(f, "%d\t%d\t%d\t%d\t%d\t%d\t",
- &name_len, &mod_name_len, &key_len,
- &alt_key_len, &salt_len, &alt_salt_len);
- if (nitems == EOF)
- break;
- if (nitems != 6) {
- fprintf(stderr, "Couldn't parse line #%d\n", lineno);
- load_error++;
- break;
- }
- if (!(name = malloc(name_len+1))) {
- com_err(argv[0], errno,
- "While allocating space for name");
- load_error++;
- goto cleanup;
- }
- if (!(mod_name = malloc(mod_name_len+1))) {
- com_err(argv[0], errno,
- "While allocating space for mod_name");
- load_error++;
- goto cleanup;
- }
- entry.key.length = key_len;
- if (key_len) {
- if (!(entry.key.contents = (krb5_octet *)
- malloc(key_len+1))) {
- com_err(argv[0], errno,
- "While allocating space for the key");
- load_error++;
- goto cleanup;
- }
- }
- entry.alt_key.length = alt_key_len;
- if (alt_key_len) {
- if (!(entry.alt_key.contents = (krb5_octet *)
- malloc(alt_key_len+1))) {
- com_err(argv[0], errno,
- "While allocating space for alt_key");
- load_error++;
- goto cleanup;
- }
- }
- entry.salt_length = salt_len;
- if (salt_len) {
- if (!(entry.salt = (krb5_octet *) malloc(salt_len+1))) {
- com_err(argv[0], errno,
- "While allocating space for the salt");
- load_error++;
- goto cleanup;
- }
- }
- entry.alt_salt_length = alt_salt_len;
- if (alt_salt_len) {
- if (!(entry.alt_salt = (krb5_octet *)
- malloc(alt_salt_len+1))) {
- com_err(argv[0], errno,
- "While allocating space for the alt_salt");
- load_error++;
- goto cleanup;
- }
- }
- if ((name_ret = read_name(f, name, name_len)) < 0) {
- fprintf(stderr, "Couldn't parse line #%d\n", lineno);
- load_error++;
- break;
- }
- lineno += name_ret;
- if (fscanf(f, "%d\t", &tmp1) != 1) {
- fprintf(stderr, "Couldn't parse line #%d\n", lineno);
- load_error++;
- break;
- }
- /* keytype is probably a short, but might not be.
- To avoid problems with scanf, read into a variable of
- known type then copy the value. */
- entry.key.keytype = tmp1;
- for (i=0; i<entry.key.length; i++) {
- if (fscanf(f,"%02x", &tmp1) != 1) {
- fprintf(stderr, "Couldn't parse line #%d\n",
- lineno);
- load_error++;
- break;
- }
- entry.key.contents[i] = tmp1;
- }
- if (fscanf(f, "\t%u\t%u\t%u\t%u\t%u\t%u\t%u\t%u\t%u\t%u\t",
- &tmp1, &entry.max_life, &entry.max_renewable_life,
- &tmp2, &entry.expiration, &entry.pw_expiration,
- &entry.last_pwd_change, &entry.last_success,
- &entry.last_failed, &tmp3) != 10) {
- fprintf(stderr, "Couldn't parse line #%d\n",
- lineno);
- load_error++;
- break;
- }
- if ((name_ret = read_name(f, mod_name, mod_name_len)) < 0) {
- fprintf(stderr, "Couldn't parse line #%d\n", lineno);
- load_error++;
- break;
- }
- lineno += name_ret;
- if (fscanf(f, "%u\t%u\t%u\t",
- &entry.mod_date, &entry.attributes, &stype) != 3) {
- fprintf(stderr, "Couldn't parse line #%d\n", lineno);
- load_error++;
- break;
- }
- entry.kvno = tmp1;
- entry.mkvno = tmp2;
- entry.fail_auth_count = tmp3;
- entry.salt_type = stype;
- for (i=0; i < salt_len; i++) {
- if (fscanf(f, "%02x", &tmp1) != 1) {
- fprintf(stderr, "Couldn't parse line #%d\n",
- lineno);
- load_error++;
- break;
- }
- entry.salt[i] = tmp1;
- }
- if (fscanf(f, "\t%u\t", &tmp1) != 1) {
- fprintf(stderr, "Couldn't parse line #%d\n",
- lineno);
- load_error++;
- break;
- }
- entry.alt_key.keytype = tmp1;
- for (i=0; i<alt_key_len; i++) {
- if (fscanf(f,"%02x", &tmp1) != 1) {
- fprintf(stderr, "Couldn't parse line #%d\n",
- lineno);
- load_error++;
- break;
- }
- entry.alt_key.contents[i] = tmp1;
- }
- if (fscanf(f, "\t%u\t", &stype) != 1) {
- fprintf(stderr, "Couldn't parse line #%d\n",
- lineno);
- load_error++;
- break;
- }
- entry.alt_salt_type = stype;
- for (i=0; i < alt_salt_len; i++) {
- if (fscanf(f, "%02x", &tmp1) != 1) {
- fprintf(stderr, "Couldn't parse line #%d\n",
- lineno);
- load_error++;
- break;
- }
- entry.alt_salt[i] = tmp1;
- }
- for (i=0; i < 8; i++) {
- fscanf(f, "\t%u", &entry.expansion[i]);
- }
- if (((ch = fgetc(f)) != ';') || ((ch = fgetc(f)) != '\n')) {
- fprintf(stderr, "Ignoring trash at end of entry: ");
- while (ch != '\n') {
- putc(ch, stderr);
- ch = fgetc(f);
- }
- putc(ch, stderr);
- }
- if (retval=krb5_parse_name(edit_context, name, &entry.principal)) {
- com_err(argv[0], retval,
- "while trying to parse %s in line %d",
- name, lineno);
- load_error++;
- goto cleanup;
- }
- if (retval=krb5_parse_name(edit_context, mod_name, &entry.mod_name)) {
- com_err(argv[0], retval,
- "while trying to parse %s in line %d",
- mod_name, lineno);
- load_error++;
- goto cleanup;
- }
- one=1;
- if (retval = krb5_db_put_principal(edit_context, &entry, &one)) {
- com_err(argv[0], retval,
- "while trying to store principal %s",
- name);
- load_error++;
- goto cleanup;
+ memset((char *)&entry, 0, sizeof(entry));
+ if ((nitems = fscanf(f, "%d\t", &contents.dsize)) != 1) {
+ if (nitems != EOF) {
+ fprintf(stderr, "Couldn't parse line #%d\n", lineno);
+ load_error++;
+ continue;
}
- cleanup:
- free(name);
- free(mod_name);
- if (entry.key.contents)
- krb5_xfree(entry.key.contents);
- if (entry.alt_key.contents)
- krb5_xfree(entry.alt_key.contents);
- if (entry.salt)
- krb5_xfree(entry.salt);
- if (entry.alt_salt)
- krb5_xfree(entry.alt_salt);
+ break;
+ }
+ if (!(contents.dptr = malloc(contents.dsize))) {
+ com_err(argv[0], errno, "While allocating space");
+ load_error++;
+ continue;
+ }
+ if (fread(contents.dptr, contents.dsize, 1, f) == EOF) {
+ fprintf(stderr, "Couldn't read line #%d\n", lineno);
+ free(contents.dptr);
+ load_error++;
+ continue;
+ }
+ if (((ch = fgetc(f)) != ';') || ((ch = fgetc(f)) != '\n')) {
+ fprintf(stderr, "Ignoring trash at end of entry: ");
+ while ((ch != '\n') && (ch != EOF)) {
+ putc(ch, stderr);
+ ch = fgetc(f);
+ }
+ putc(ch, stderr);
+ load_error++;
+ continue;
+ }
+ if (retval = krb5_decode_princ_contents(edit_context, &contents, &entry)) {
+ com_err(argv[0], retval,"while trying to parse line %d",lineno);
+ free (contents.dptr);
+ load_error++;
+ continue;
+ }
+ one=1;
+ if (retval = krb5_db_put_principal(edit_context, &entry, &one)) {
+ com_err(argv[0], retval, "while trying to write db entry");
+ krb5_dbe_free_contents(edit_context, &entry);
+ free (contents.dptr);
+ continue;
+ }
}
-error_out:
if (retval = krb5_db_fini(edit_context)) {
com_err(argv[0], retval,
"while closing database '%s'", new_dbname);