⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keytab_file.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * Copyright (c) 1997 - 2005 Kungliga Tekniska H鰃skolan * (Royal Institute of Technology, Stockholm, Sweden).  * All rights reserved.  * * Redistribution and use in source and binary forms, with or without  * modification, are permitted provided that the following conditions  * are met:  * * 1. Redistributions of source code must retain the above copyright  *    notice, this list of conditions and the following disclaimer.  * * 2. Redistributions in binary form must reproduce the above copyright  *    notice, this list of conditions and the following disclaimer in the  *    documentation and/or other materials provided with the distribution.  * * 3. Neither the name of the Institute nor the names of its contributors  *    may be used to endorse or promote products derived from this software  *    without specific prior written permission.  * * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF  * SUCH DAMAGE.  */#include "krb5_locl.h"RCSID("$Id: keytab_file.c 22532 2008-01-27 11:59:18Z lha $");#define KRB5_KT_VNO_1 1#define KRB5_KT_VNO_2 2#define KRB5_KT_VNO   KRB5_KT_VNO_2#define KRB5_KT_FL_JAVA 1/* file operations -------------------------------------------- */struct fkt_data {    char *filename;    int flags;};static krb5_error_codekrb5_kt_ret_data(krb5_context context,		 krb5_storage *sp,		 krb5_data *data){    int ret;    int16_t size;    ret = krb5_ret_int16(sp, &size);    if(ret)	return ret;    data->length = size;    data->data = malloc(size);    if (data->data == NULL) {	krb5_set_error_string (context, "malloc: out of memory");	return ENOMEM;    }    ret = krb5_storage_read(sp, data->data, size);    if(ret != size)	return (ret < 0)? errno : KRB5_KT_END;    return 0;}static krb5_error_codekrb5_kt_ret_string(krb5_context context,		   krb5_storage *sp,		   heim_general_string *data){    int ret;    int16_t size;    ret = krb5_ret_int16(sp, &size);    if(ret)	return ret;    *data = malloc(size + 1);    if (*data == NULL) {	krb5_set_error_string (context, "malloc: out of memory");	return ENOMEM;    }    ret = krb5_storage_read(sp, *data, size);    (*data)[size] = '\0';    if(ret != size)	return (ret < 0)? errno : KRB5_KT_END;    return 0;}static krb5_error_codekrb5_kt_store_data(krb5_context context,		   krb5_storage *sp,		   krb5_data data){    int ret;    ret = krb5_store_int16(sp, data.length);    if(ret < 0)	return ret;    ret = krb5_storage_write(sp, data.data, data.length);    if(ret != data.length){	if(ret < 0)	    return errno;	return KRB5_KT_END;    }    return 0;}static krb5_error_codekrb5_kt_store_string(krb5_storage *sp,		     heim_general_string data){    int ret;    size_t len = strlen(data);    ret = krb5_store_int16(sp, len);    if(ret < 0)	return ret;    ret = krb5_storage_write(sp, data, len);    if(ret != len){	if(ret < 0)	    return errno;	return KRB5_KT_END;    }    return 0;}static krb5_error_codekrb5_kt_ret_keyblock(krb5_context context, krb5_storage *sp, krb5_keyblock *p){    int ret;    int16_t tmp;    ret = krb5_ret_int16(sp, &tmp); /* keytype + etype */    if(ret) return ret;    p->keytype = tmp;    ret = krb5_kt_ret_data(context, sp, &p->keyvalue);    return ret;}static krb5_error_codekrb5_kt_store_keyblock(krb5_context context,		       krb5_storage *sp, 		       krb5_keyblock *p){    int ret;    ret = krb5_store_int16(sp, p->keytype); /* keytype + etype */    if(ret) return ret;    ret = krb5_kt_store_data(context, sp, p->keyvalue);    return ret;}static krb5_error_codekrb5_kt_ret_principal(krb5_context context,		      krb5_storage *sp,		      krb5_principal *princ){    int i;    int ret;    krb5_principal p;    int16_t len;        ALLOC(p, 1);    if(p == NULL) {	krb5_set_error_string (context, "malloc: out of memory");	return ENOMEM;    }    ret = krb5_ret_int16(sp, &len);    if(ret) {	krb5_set_error_string(context,			      "Failed decoding length of keytab principal");	goto out;    }    if(krb5_storage_is_flags(sp, KRB5_STORAGE_PRINCIPAL_WRONG_NUM_COMPONENTS))	len--;    if (len < 0) {	krb5_set_error_string(context, 			      "Keytab principal contains invalid length");	ret = KRB5_KT_END;	goto out;    }    ret = krb5_kt_ret_string(context, sp, &p->realm);    if(ret)	goto out;    p->name.name_string.val = calloc(len, sizeof(*p->name.name_string.val));    if(p->name.name_string.val == NULL) {	krb5_set_error_string (context, "malloc: out of memory");	ret = ENOMEM;	goto out;    }    p->name.name_string.len = len;    for(i = 0; i < p->name.name_string.len; i++){	ret = krb5_kt_ret_string(context, sp, p->name.name_string.val + i);	if(ret)	    goto out;    }    if (krb5_storage_is_flags(sp, KRB5_STORAGE_PRINCIPAL_NO_NAME_TYPE))	p->name.name_type = KRB5_NT_UNKNOWN;    else {	int32_t tmp32;	ret = krb5_ret_int32(sp, &tmp32);	p->name.name_type = tmp32;	if (ret)	    goto out;    }    *princ = p;    return 0;out:    krb5_free_principal(context, p);    return ret;}static krb5_error_codekrb5_kt_store_principal(krb5_context context,			krb5_storage *sp,			krb5_principal p){    int i;    int ret;        if(krb5_storage_is_flags(sp, KRB5_STORAGE_PRINCIPAL_WRONG_NUM_COMPONENTS))	ret = krb5_store_int16(sp, p->name.name_string.len + 1);    else	ret = krb5_store_int16(sp, p->name.name_string.len);    if(ret) return ret;    ret = krb5_kt_store_string(sp, p->realm);    if(ret) return ret;    for(i = 0; i < p->name.name_string.len; i++){	ret = krb5_kt_store_string(sp, p->name.name_string.val[i]);	if(ret)	    return ret;    }    if(!krb5_storage_is_flags(sp, KRB5_STORAGE_PRINCIPAL_NO_NAME_TYPE)) {	ret = krb5_store_int32(sp, p->name.name_type);	if(ret)	    return ret;    }    return 0;}static krb5_error_codefkt_resolve(krb5_context context, const char *name, krb5_keytab id){    struct fkt_data *d;    d = malloc(sizeof(*d));    if(d == NULL) {	krb5_set_error_string (context, "malloc: out of memory");	return ENOMEM;    }    d->filename = strdup(name);    if(d->filename == NULL) {	free(d);	krb5_set_error_string (context, "malloc: out of memory");	return ENOMEM;    }    d->flags = 0;    id->data = d;    return 0;}static krb5_error_codefkt_resolve_java14(krb5_context context, const char *name, krb5_keytab id){    krb5_error_code ret;    ret = fkt_resolve(context, name, id);    if (ret == 0) {	struct fkt_data *d = id->data;	d->flags |= KRB5_KT_FL_JAVA;    }    return ret;}static krb5_error_codefkt_close(krb5_context context, krb5_keytab id){    struct fkt_data *d = id->data;    free(d->filename);    free(d);    return 0;}static krb5_error_code fkt_get_name(krb5_context context, 	     krb5_keytab id, 	     char *name, 	     size_t namesize){    /* This function is XXX */    struct fkt_data *d = id->data;    strlcpy(name, d->filename, namesize);    return 0;}static voidstorage_set_flags(krb5_context context, krb5_storage *sp, int vno){    int flags = 0;    switch(vno) {    case KRB5_KT_VNO_1:	flags |= KRB5_STORAGE_PRINCIPAL_WRONG_NUM_COMPONENTS;	flags |= KRB5_STORAGE_PRINCIPAL_NO_NAME_TYPE;	flags |= KRB5_STORAGE_HOST_BYTEORDER;	break;    case KRB5_KT_VNO_2:	break;    default:	krb5_warnx(context, 		   "storage_set_flags called with bad vno (%d)", vno);    }    krb5_storage_set_flags(sp, flags);}static krb5_error_codefkt_start_seq_get_int(krb5_context context, 		      krb5_keytab id, 		      int flags,		      int exclusive,		      krb5_kt_cursor *c){    int8_t pvno, tag;    krb5_error_code ret;    struct fkt_data *d = id->data;        c->fd = open (d->filename, flags);    if (c->fd < 0) {	ret = errno;	krb5_set_error_string(context, "keytab %s open failed: %s", 			      d->filename, strerror(ret));	return ret;    }    ret = _krb5_xlock(context, c->fd, exclusive, d->filename);    if (ret) {	close(c->fd);	return ret;    }    c->sp = krb5_storage_from_fd(c->fd);    if (c->sp == NULL) {	_krb5_xunlock(context, c->fd);	close(c->fd);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -