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

📄 keytab_file.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 2 页
字号:
	krb5_set_error_string (context, "malloc: out of memory");	return ENOMEM;    }    krb5_storage_set_eof_code(c->sp, KRB5_KT_END);    ret = krb5_ret_int8(c->sp, &pvno);    if(ret) {	krb5_storage_free(c->sp);	_krb5_xunlock(context, c->fd);	close(c->fd);	krb5_clear_error_string(context);	return ret;    }    if(pvno != 5) {	krb5_storage_free(c->sp);	_krb5_xunlock(context, c->fd);	close(c->fd);	krb5_clear_error_string (context);	return KRB5_KEYTAB_BADVNO;    }    ret = krb5_ret_int8(c->sp, &tag);    if (ret) {	krb5_storage_free(c->sp);	_krb5_xunlock(context, c->fd);	close(c->fd);	krb5_clear_error_string(context);	return ret;    }    id->version = tag;    storage_set_flags(context, c->sp, id->version);    return 0;}static krb5_error_codefkt_start_seq_get(krb5_context context, 		  krb5_keytab id, 		  krb5_kt_cursor *c){    return fkt_start_seq_get_int(context, id, O_RDONLY | O_BINARY, 0, c);}static krb5_error_codefkt_next_entry_int(krb5_context context, 		   krb5_keytab id, 		   krb5_keytab_entry *entry, 		   krb5_kt_cursor *cursor,		   off_t *start,		   off_t *end){    int32_t len;    int ret;    int8_t tmp8;    int32_t tmp32;    off_t pos, curpos;    pos = krb5_storage_seek(cursor->sp, 0, SEEK_CUR);loop:    ret = krb5_ret_int32(cursor->sp, &len);    if (ret)	return ret;    if(len < 0) {	pos = krb5_storage_seek(cursor->sp, -len, SEEK_CUR);	goto loop;    }    ret = krb5_kt_ret_principal (context, cursor->sp, &entry->principal);    if (ret)	goto out;    ret = krb5_ret_int32(cursor->sp, &tmp32);    entry->timestamp = tmp32;    if (ret)	goto out;    ret = krb5_ret_int8(cursor->sp, &tmp8);    if (ret)	goto out;    entry->vno = tmp8;    ret = krb5_kt_ret_keyblock (context, cursor->sp, &entry->keyblock);    if (ret)	goto out;    /* there might be a 32 bit kvno here     * if it's zero, assume that the 8bit one was right,     * otherwise trust the new value */    curpos = krb5_storage_seek(cursor->sp, 0, SEEK_CUR);    if(len + 4 + pos - curpos >= 4) {	ret = krb5_ret_int32(cursor->sp, &tmp32);	if (ret == 0 && tmp32 != 0) {	    entry->vno = tmp32;	}    }    if(start) *start = pos;    if(end) *end = pos + 4 + len; out:    krb5_storage_seek(cursor->sp, pos + 4 + len, SEEK_SET);    return ret;}static krb5_error_codefkt_next_entry(krb5_context context, 	       krb5_keytab id, 	       krb5_keytab_entry *entry, 	       krb5_kt_cursor *cursor){    return fkt_next_entry_int(context, id, entry, cursor, NULL, NULL);}static krb5_error_codefkt_end_seq_get(krb5_context context, 		krb5_keytab id,		krb5_kt_cursor *cursor){    krb5_storage_free(cursor->sp);    _krb5_xunlock(context, cursor->fd);    close(cursor->fd);    return 0;}static krb5_error_codefkt_setup_keytab(krb5_context context,		 krb5_keytab id,		 krb5_storage *sp){    krb5_error_code ret;    ret = krb5_store_int8(sp, 5);    if(ret)	return ret;    if(id->version == 0)	id->version = KRB5_KT_VNO;    return krb5_store_int8 (sp, id->version);}		 static krb5_error_codefkt_add_entry(krb5_context context,	      krb5_keytab id,	      krb5_keytab_entry *entry){    int ret;    int fd;    krb5_storage *sp;    struct fkt_data *d = id->data;    krb5_data keytab;    int32_t len;        fd = open (d->filename, O_RDWR | O_BINARY);    if (fd < 0) {	fd = open (d->filename, O_RDWR | O_CREAT | O_EXCL | O_BINARY, 0600);	if (fd < 0) {	    ret = errno;	    krb5_set_error_string(context, "open(%s): %s", d->filename,				  strerror(ret));	    return ret;	}	ret = _krb5_xlock(context, fd, 1, d->filename);	if (ret) {	    close(fd);	    return ret;	}	sp = krb5_storage_from_fd(fd);	krb5_storage_set_eof_code(sp, KRB5_KT_END);	ret = fkt_setup_keytab(context, id, sp);	if(ret) {	    goto out;	}	storage_set_flags(context, sp, id->version);    } else {	int8_t pvno, tag;	ret = _krb5_xlock(context, fd, 1, d->filename);	if (ret) {	    close(fd);	    return ret;	}	sp = krb5_storage_from_fd(fd);	krb5_storage_set_eof_code(sp, KRB5_KT_END);	ret = krb5_ret_int8(sp, &pvno);	if(ret) {	    /* we probably have a zero byte file, so try to set it up               properly */	    ret = fkt_setup_keytab(context, id, sp);	    if(ret) {		krb5_set_error_string(context, "%s: keytab is corrupted: %s", 				      d->filename, strerror(ret));		goto out;	    }	    storage_set_flags(context, sp, id->version);	} else {	    if(pvno != 5) {		ret = KRB5_KEYTAB_BADVNO;		krb5_set_error_string(context, "%s: %s", 				      d->filename, strerror(ret));		goto out;	    }	    ret = krb5_ret_int8 (sp, &tag);	    if (ret) {		krb5_set_error_string(context, "%s: reading tag: %s", 				      d->filename, strerror(ret));		goto out;	    }	    id->version = tag;	    storage_set_flags(context, sp, id->version);	}    }    {	krb5_storage *emem;	emem = krb5_storage_emem();	if(emem == NULL) {	    ret = ENOMEM;	    krb5_set_error_string (context, "malloc: out of memory");	    goto out;	}	ret = krb5_kt_store_principal(context, emem, entry->principal);	if(ret) {	    krb5_storage_free(emem);	    goto out;	}	ret = krb5_store_int32 (emem, entry->timestamp);	if(ret) {	    krb5_storage_free(emem);	    goto out;	}	ret = krb5_store_int8 (emem, entry->vno % 256);	if(ret) {	    krb5_storage_free(emem);	    goto out;	}	ret = krb5_kt_store_keyblock (context, emem, &entry->keyblock);	if(ret) {	    krb5_storage_free(emem);	    goto out;	}	if ((d->flags & KRB5_KT_FL_JAVA) == 0) {	    ret = krb5_store_int32 (emem, entry->vno);	    if (ret) {		krb5_storage_free(emem);		goto out;	    }	}	ret = krb5_storage_to_data(emem, &keytab);	krb5_storage_free(emem);	if(ret)	    goto out;    }        while(1) {	ret = krb5_ret_int32(sp, &len);	if(ret == KRB5_KT_END) {	    len = keytab.length;	    break;	}	if(len < 0) {	    len = -len;	    if(len >= keytab.length) {		krb5_storage_seek(sp, -4, SEEK_CUR);		break;	    }	}	krb5_storage_seek(sp, len, SEEK_CUR);    }    ret = krb5_store_int32(sp, len);    if(krb5_storage_write(sp, keytab.data, keytab.length) < 0)	ret = errno;    memset(keytab.data, 0, keytab.length);    krb5_data_free(&keytab);  out:    krb5_storage_free(sp);    _krb5_xunlock(context, fd);    close(fd);    return ret;}static krb5_error_codefkt_remove_entry(krb5_context context,		 krb5_keytab id,		 krb5_keytab_entry *entry){    krb5_keytab_entry e;    krb5_kt_cursor cursor;    off_t pos_start, pos_end;    int found = 0;    krb5_error_code ret;        ret = fkt_start_seq_get_int(context, id, O_RDWR | O_BINARY, 1, &cursor);    if(ret != 0) 	goto out; /* return other error here? */    while(fkt_next_entry_int(context, id, &e, &cursor, 			     &pos_start, &pos_end) == 0) {	if(krb5_kt_compare(context, &e, entry->principal, 			   entry->vno, entry->keyblock.keytype)) {	    int32_t len;	    unsigned char buf[128];	    found = 1;	    krb5_storage_seek(cursor.sp, pos_start, SEEK_SET);	    len = pos_end - pos_start - 4;	    krb5_store_int32(cursor.sp, -len);	    memset(buf, 0, sizeof(buf));	    while(len > 0) {		krb5_storage_write(cursor.sp, buf, min(len, sizeof(buf)));		len -= min(len, sizeof(buf));	    }	}	krb5_kt_free_entry(context, &e);    }    krb5_kt_end_seq_get(context, id, &cursor);  out:    if (!found) {	krb5_clear_error_string (context);	return KRB5_KT_NOTFOUND;    }    return 0;}const krb5_kt_ops krb5_fkt_ops = {    "FILE",    fkt_resolve,    fkt_get_name,    fkt_close,    NULL, /* get */    fkt_start_seq_get,    fkt_next_entry,    fkt_end_seq_get,    fkt_add_entry,    fkt_remove_entry};const krb5_kt_ops krb5_wrfkt_ops = {    "WRFILE",    fkt_resolve,    fkt_get_name,    fkt_close,    NULL, /* get */    fkt_start_seq_get,    fkt_next_entry,    fkt_end_seq_get,    fkt_add_entry,    fkt_remove_entry};const krb5_kt_ops krb5_javakt_ops = {    "JAVA14",    fkt_resolve_java14,    fkt_get_name,    fkt_close,    NULL, /* get */    fkt_start_seq_get,    fkt_next_entry,    fkt_end_seq_get,    fkt_add_entry,    fkt_remove_entry};

⌨️ 快捷键说明

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