コード例 #1
0
ファイル: ent_setup.c プロジェクト: appleorange1/bitrig
static kadm5_ret_t
perform_tl_data(krb5_context context,
		HDB *db,
		hdb_entry_ex *ent,
		const krb5_tl_data *tl_data)
{
    kadm5_ret_t ret = 0;

    if (tl_data->tl_data_type == KRB5_TL_PASSWORD) {
	heim_utf8_string pw = tl_data->tl_data_contents;

	if (pw[tl_data->tl_data_length] != '\0')
	    return KADM5_BAD_TL_TYPE;

	ret = hdb_entry_set_password(context, db, &ent->entry, pw);

    } else if (tl_data->tl_data_type == KRB5_TL_LAST_PWD_CHANGE) {
	unsigned char *s;
	time_t t;

	if (tl_data->tl_data_length != 4)
	    return KADM5_BAD_TL_TYPE;

	s = tl_data->tl_data_contents;

	t = s[0] | (s[1] << 8) | (s[2] << 16) | (s[3] << 24);

	ret = hdb_entry_set_pw_change_time(context, &ent->entry, t);

    } else if (tl_data->tl_data_type == KRB5_TL_EXTENSION) {
	HDB_extension ext;

	ret = decode_HDB_extension(tl_data->tl_data_contents,
				   tl_data->tl_data_length,
				   &ext,
				   NULL);
	if (ret)
	    return KADM5_BAD_TL_TYPE;

	ret = hdb_replace_extension(context, &ent->entry, &ext);
	free_HDB_extension(&ext);
    } else {
	return KADM5_BAD_TL_TYPE;
    }
    return ret;
}
コード例 #2
0
ファイル: load.c プロジェクト: InvLim/heimdal
static int
parse_extensions(char *str, HDB_extensions **e)
{
    char *p;
    int ret;

    if(strcmp(str, "-") == 0 || *str == '\0') {
	*e = NULL;
	return 0;
    }
    *e = calloc(1, sizeof(**e));

    p = strsep(&str, ":");

    while (p) {
	HDB_extension ext;
	ssize_t len;
	void *d;

	len = strlen(p);
	d = malloc(len);

	len = hex_decode(p, d, len);
	if (len < 0) {
	    free(d);
	    return -1;
	}

	ret = decode_HDB_extension(d, len, &ext, NULL);
	free(d);
	if (ret)
	    return -1;
	d = realloc((*e)->val, ((*e)->len + 1) * sizeof((*e)->val[0]));
	if (d == NULL)
	    abort();
	(*e)->val = d;
	(*e)->val[(*e)->len] = ext;
	(*e)->len++;

	p = strsep(&str, ":");
    }

    return 0;
}