Blame src/kadmin/dbutil/ovload.c

Packit fd8b60
/* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */
Packit fd8b60
#include    <k5-int.h>
Packit fd8b60
#include    <unistd.h>
Packit fd8b60
Packit fd8b60
#include <kadm5/admin.h>
Packit fd8b60
#include <kadm5/server_internal.h>
Packit fd8b60
#include    <kdb.h>
Packit fd8b60
#include    "import_err.h"
Packit fd8b60
#include    "kdb5_util.h"
Packit fd8b60
#include    "nstrtok.h"
Packit fd8b60
Packit fd8b60
#define LINESIZE        32768 /* XXX */
Packit fd8b60
Packit fd8b60
static int parse_pw_hist_ent(current, hist)
Packit fd8b60
    char *current;
Packit fd8b60
    osa_pw_hist_ent *hist;
Packit fd8b60
{
Packit fd8b60
    int tmp, i, j, ret;
Packit fd8b60
    char *cp;
Packit fd8b60
Packit fd8b60
    ret = 0;
Packit fd8b60
    hist->n_key_data = 1;
Packit fd8b60
Packit fd8b60
    hist->key_data = (krb5_key_data *) malloc(hist->n_key_data *
Packit fd8b60
                                              sizeof(krb5_key_data));
Packit fd8b60
    if (hist->key_data == NULL)
Packit fd8b60
        return ENOMEM;
Packit fd8b60
    memset(hist->key_data, 0, sizeof(krb5_key_data)*hist->n_key_data);
Packit fd8b60
Packit fd8b60
    for (i = 0; i < hist->n_key_data; i++) {
Packit fd8b60
        krb5_key_data *key_data = &hist->key_data[i];
Packit fd8b60
Packit fd8b60
        key_data->key_data_ver = 1;
Packit fd8b60
Packit fd8b60
        if((cp = nstrtok((char *) NULL, "\t")) == NULL) {
Packit fd8b60
            com_err(NULL, IMPORT_BAD_RECORD, "%s", current);
Packit fd8b60
            ret = IMPORT_FAILED;
Packit fd8b60
            goto done;
Packit fd8b60
        }
Packit fd8b60
        key_data->key_data_type[0] = atoi(cp);
Packit fd8b60
Packit fd8b60
        if((cp = nstrtok((char *) NULL, "\t")) == NULL) {
Packit fd8b60
            com_err(NULL, IMPORT_BAD_RECORD, "%s", current);
Packit fd8b60
            ret =  IMPORT_FAILED;
Packit fd8b60
            goto done;
Packit fd8b60
        }
Packit fd8b60
        key_data->key_data_length[0] = atoi(cp);
Packit fd8b60
Packit fd8b60
        if((cp = nstrtok((char *) NULL, "\t")) == NULL) {
Packit fd8b60
            com_err(NULL, IMPORT_BAD_RECORD, "%s", current);
Packit fd8b60
            ret = IMPORT_FAILED;
Packit fd8b60
            goto done;
Packit fd8b60
        }
Packit fd8b60
        if(!(key_data->key_data_contents[0] =
Packit fd8b60
             (krb5_octet *) malloc(key_data->key_data_length[0]+1))) {
Packit fd8b60
            ret = ENOMEM;
Packit fd8b60
            goto done;
Packit fd8b60
        }
Packit fd8b60
        for(j = 0; j < key_data->key_data_length[0]; j++) {
Packit fd8b60
            if(sscanf(cp, "%02x", &tmp) != 1) {
Packit fd8b60
                com_err(NULL, IMPORT_BAD_RECORD, "%s", current);
Packit fd8b60
                ret = IMPORT_FAILED;
Packit fd8b60
                goto done;
Packit fd8b60
            }
Packit fd8b60
            key_data->key_data_contents[0][j] = tmp;
Packit fd8b60
            cp = strchr(cp, ' ') + 1;
Packit fd8b60
        }
Packit fd8b60
    }
Packit fd8b60
Packit fd8b60
done:
Packit fd8b60
    return ret;
Packit fd8b60
}
Packit fd8b60
Packit fd8b60
/*
Packit fd8b60
 * Function: parse_principal
Packit fd8b60
 *
Packit fd8b60
 * Purpose: parse principal line in db dump file
Packit fd8b60
 *
Packit fd8b60
 * Arguments:
Packit fd8b60
 *      <return value>  0 on success, error code on failure
Packit fd8b60
 *
Packit fd8b60
 * Requires:
Packit fd8b60
 *      principal database to be opened.
Packit fd8b60
 *      nstrtok(3) to have a valid buffer in memory.
Packit fd8b60
 *
Packit fd8b60
 * Effects:
Packit fd8b60
 *      [effects]
Packit fd8b60
 *
Packit fd8b60
 * Modifies:
Packit fd8b60
 *      [modifies]
Packit fd8b60
 *
Packit fd8b60
 */
Packit fd8b60
int process_ov_principal(kcontext, fname, filep, verbose, linenop)
Packit fd8b60
    krb5_context        kcontext;
Packit fd8b60
    const char          *fname;
Packit fd8b60
    FILE                *filep;
Packit fd8b60
    krb5_boolean        verbose;
Packit fd8b60
    int                 *linenop;
Packit fd8b60
{
Packit fd8b60
    XDR                     xdrs;
Packit fd8b60
    osa_princ_ent_t         rec;
Packit fd8b60
    krb5_error_code         ret;
Packit fd8b60
    krb5_tl_data            tl_data;
Packit fd8b60
    krb5_principal          princ;
Packit fd8b60
    krb5_db_entry           *kdb = NULL;
Packit fd8b60
    char                    *current = 0;
Packit fd8b60
    char                    *cp;
Packit fd8b60
    unsigned int            x;
Packit fd8b60
    char                    line[LINESIZE];
Packit fd8b60
Packit fd8b60
    if (fgets(line, LINESIZE, filep) == (char *) NULL) {
Packit fd8b60
        return IMPORT_BAD_FILE;
Packit fd8b60
    }
Packit fd8b60
    if((cp = nstrtok(line, "\t")) == NULL)
Packit fd8b60
        return IMPORT_BAD_FILE;
Packit fd8b60
    if((rec = (osa_princ_ent_t) malloc(sizeof(osa_princ_ent_rec))) == NULL)
Packit fd8b60
        return ENOMEM;
Packit fd8b60
    memset(rec, 0, sizeof(osa_princ_ent_rec));
Packit fd8b60
    if((ret = krb5_parse_name(kcontext, cp, &princ)))
Packit fd8b60
        goto done;
Packit fd8b60
    krb5_unparse_name(kcontext, princ, ¤t;;
Packit fd8b60
    if((cp = nstrtok((char *) NULL, "\t")) == NULL) {
Packit fd8b60
        com_err(NULL, IMPORT_BAD_RECORD, "%s", current);
Packit fd8b60
        ret =  IMPORT_FAILED;
Packit fd8b60
        goto done;
Packit fd8b60
    } else {
Packit fd8b60
        if(strcmp(cp, "")) {
Packit fd8b60
            if((rec->policy = strdup(cp)) == NULL)  {
Packit fd8b60
                ret = ENOMEM;
Packit fd8b60
                goto done;
Packit fd8b60
            }
Packit fd8b60
        } else rec->policy = NULL;
Packit fd8b60
    }
Packit fd8b60
    if((cp = nstrtok((char *) NULL, "\t")) == NULL) {
Packit fd8b60
        com_err(NULL, IMPORT_BAD_RECORD, "%s", current);
Packit fd8b60
        ret = IMPORT_FAILED;
Packit fd8b60
        goto done;
Packit fd8b60
    }
Packit fd8b60
    rec->aux_attributes = strtol(cp, (char  **)NULL, 16);
Packit fd8b60
    if((cp = nstrtok((char *) NULL, "\t")) == NULL) {
Packit fd8b60
        com_err(NULL, IMPORT_BAD_RECORD, "%s", current);
Packit fd8b60
        ret = IMPORT_FAILED;
Packit fd8b60
        goto done;
Packit fd8b60
    }
Packit fd8b60
    rec->old_key_len = atoi(cp);
Packit fd8b60
    if((cp = nstrtok((char *) NULL, "\t")) == NULL) {
Packit fd8b60
        com_err(NULL, IMPORT_BAD_RECORD, "%s", current);
Packit fd8b60
        ret = IMPORT_FAILED;
Packit fd8b60
        goto done;
Packit fd8b60
    }
Packit fd8b60
    rec->old_key_next = atoi(cp);
Packit fd8b60
    if((cp = nstrtok((char *) NULL, "\t")) == NULL) {
Packit fd8b60
        com_err(NULL, IMPORT_BAD_RECORD, "%s", current);
Packit fd8b60
        ret = IMPORT_FAILED;
Packit fd8b60
        goto done;
Packit fd8b60
    }
Packit fd8b60
    rec->admin_history_kvno = atoi(cp);
Packit fd8b60
    if (! rec->old_key_len) {
Packit fd8b60
        rec->old_keys = NULL;
Packit fd8b60
    } else {
Packit fd8b60
        if(!(rec->old_keys = (osa_pw_hist_ent *)
Packit fd8b60
             malloc(sizeof(osa_pw_hist_ent) * rec->old_key_len))) {
Packit fd8b60
            ret = ENOMEM;
Packit fd8b60
            goto done;
Packit fd8b60
        }
Packit fd8b60
        memset(rec->old_keys,0,
Packit fd8b60
               sizeof(osa_pw_hist_ent) * rec->old_key_len);
Packit fd8b60
        for(x = 0; x < rec->old_key_len; x++)
Packit fd8b60
            parse_pw_hist_ent(current, &rec->old_keys[x]);
Packit fd8b60
    }
Packit fd8b60
Packit fd8b60
    xdralloc_create(&xdrs, XDR_ENCODE);
Packit fd8b60
    if (! xdr_osa_princ_ent_rec(&xdrs, rec)) {
Packit fd8b60
        xdr_destroy(&xdrs);
Packit fd8b60
        ret = KADM5_XDR_FAILURE;
Packit fd8b60
        goto done;
Packit fd8b60
    }
Packit fd8b60
Packit fd8b60
    tl_data.tl_data_type = KRB5_TL_KADM_DATA;
Packit fd8b60
    tl_data.tl_data_length = xdr_getpos(&xdrs);
Packit fd8b60
    tl_data.tl_data_contents = (krb5_octet *) xdralloc_getdata(&xdrs);
Packit fd8b60
Packit fd8b60
    ret = krb5_db_get_principal(kcontext, princ, 0, &kdb);
Packit fd8b60
    if (ret)
Packit fd8b60
        goto done;
Packit fd8b60
Packit fd8b60
    ret = krb5_dbe_update_tl_data(kcontext, kdb, &tl_data);
Packit fd8b60
    if (ret)
Packit fd8b60
        goto done;
Packit fd8b60
Packit fd8b60
    ret = krb5_db_put_principal(kcontext, kdb);
Packit fd8b60
    if (ret)
Packit fd8b60
        goto done;
Packit fd8b60
Packit fd8b60
    xdr_destroy(&xdrs);
Packit fd8b60
Packit fd8b60
    (*linenop)++;
Packit fd8b60
Packit fd8b60
done:
Packit fd8b60
    free(current);
Packit fd8b60
    krb5_free_principal(kcontext, princ);
Packit fd8b60
    osa_free_princ_ent(rec);
Packit fd8b60
    krb5_db_free_principal(kcontext, kdb);
Packit fd8b60
    return ret;
Packit fd8b60
}