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

📄 check.c

📁 非常好的dns解析软件
💻 C
📖 第 1 页 / 共 4 页
字号:
			obj = cfg_listelt_value(element);			tresult = disabled_algorithms(obj, logctx);			if (tresult != ISC_R_SUCCESS)				result = tresult;		}	}	dns_fixedname_init(&fixed);	name = dns_fixedname_name(&fixed);	/*	 * Check the DLV zone name.	 */	obj = NULL;	(void)cfg_map_get(options, "dnssec-lookaside", &obj);	if (obj != NULL) {		tresult = isc_symtab_create(mctx, 100, freekey, mctx,					    ISC_TRUE, &symtab);		if (tresult != ISC_R_SUCCESS)			result = tresult;		for (element = cfg_list_first(obj);		     element != NULL;		     element = cfg_list_next(element))		{			const char *dlv;			obj = cfg_listelt_value(element);			dlv = cfg_obj_asstring(cfg_tuple_get(obj, "domain"));			isc_buffer_init(&b, dlv, strlen(dlv));			isc_buffer_add(&b, strlen(dlv));			tresult = dns_name_fromtext(name, &b, dns_rootname,						    ISC_TRUE, NULL);			if (tresult != ISC_R_SUCCESS) {				cfg_obj_log(obj, logctx, ISC_LOG_ERROR,					    "bad domain name '%s'", dlv);				result = tresult;			}			if (symtab != NULL) {				tresult = nameexist(obj, dlv, 1, symtab,						    "dnssec-lookaside '%s': "						    "already exists previous "						    "definition: %s:%u",						    logctx, mctx);				if (tresult != ISC_R_SUCCESS &&				    result == ISC_R_SUCCESS)					result = tresult;			}			/*			 * XXXMPA to be removed when multiple lookaside			 * namespaces are supported.			 */			if (!dns_name_equal(dns_rootname, name)) {				cfg_obj_log(obj, logctx, ISC_LOG_ERROR,					    "dnssec-lookaside '%s': "					    "non-root not yet supported", dlv);				if (result == ISC_R_SUCCESS)					result = ISC_R_FAILURE;			}			dlv = cfg_obj_asstring(cfg_tuple_get(obj,					       "trust-anchor"));			isc_buffer_init(&b, dlv, strlen(dlv));			isc_buffer_add(&b, strlen(dlv));			tresult = dns_name_fromtext(name, &b, dns_rootname,						    ISC_TRUE, NULL);			if (tresult != ISC_R_SUCCESS) {				cfg_obj_log(obj, logctx, ISC_LOG_ERROR,					    "bad domain name '%s'", dlv);				if (result == ISC_R_SUCCESS)					result = tresult;			}		}		if (symtab != NULL)			isc_symtab_destroy(&symtab);	}	/*	 * Check dnssec-must-be-secure.	 */	obj = NULL;	(void)cfg_map_get(options, "dnssec-must-be-secure", &obj);	if (obj != NULL) {		isc_symtab_t *symtab = NULL;		tresult = isc_symtab_create(mctx, 100, freekey, mctx,					    ISC_FALSE, &symtab);		if (tresult != ISC_R_SUCCESS)			result = tresult;		for (element = cfg_list_first(obj);		     element != NULL;		     element = cfg_list_next(element))		{			obj = cfg_listelt_value(element);			tresult = mustbesecure(obj, symtab, logctx, mctx);			if (tresult != ISC_R_SUCCESS)				result = tresult;		}		if (symtab != NULL)			isc_symtab_destroy(&symtab);	}	/*	 * Check empty zone configuration.	 */	obj = NULL;	(void)cfg_map_get(options, "empty-server", &obj);	if (obj != NULL) {		str = cfg_obj_asstring(obj);		isc_buffer_init(&b, str, strlen(str));		isc_buffer_add(&b, strlen(str));		tresult = dns_name_fromtext(dns_fixedname_name(&fixed), &b,					    dns_rootname, ISC_FALSE, NULL);		if (tresult != ISC_R_SUCCESS) {			cfg_obj_log(obj, logctx, ISC_LOG_ERROR,				    "empty-server: invalid name '%s'", str);			result = ISC_R_FAILURE;		}	}	obj = NULL;	(void)cfg_map_get(options, "empty-contact", &obj);	if (obj != NULL) {		str = cfg_obj_asstring(obj);		isc_buffer_init(&b, str, strlen(str));		isc_buffer_add(&b, strlen(str));		tresult = dns_name_fromtext(dns_fixedname_name(&fixed), &b,					    dns_rootname, ISC_FALSE, NULL);		if (tresult != ISC_R_SUCCESS) {			cfg_obj_log(obj, logctx, ISC_LOG_ERROR,				    "empty-contact: invalid name '%s'", str);			result = ISC_R_FAILURE;		}	}	obj = NULL;	(void)cfg_map_get(options, "disable-empty-zone", &obj);	for (element = cfg_list_first(obj);	     element != NULL;	     element = cfg_list_next(element))	{		obj = cfg_listelt_value(element);		str = cfg_obj_asstring(obj);		isc_buffer_init(&b, str, strlen(str));		isc_buffer_add(&b, strlen(str));		tresult = dns_name_fromtext(dns_fixedname_name(&fixed), &b,					    dns_rootname, ISC_FALSE, NULL);		if (tresult != ISC_R_SUCCESS) {			cfg_obj_log(obj, logctx, ISC_LOG_ERROR,				    "disable-empty-zone: invalid name '%s'",				    str);			result = ISC_R_FAILURE;		}	}	return (result);}static isc_result_tget_masters_def(const cfg_obj_t *cctx, const char *name, const cfg_obj_t **ret) {	isc_result_t result;	const cfg_obj_t *masters = NULL;	const cfg_listelt_t *elt;	result = cfg_map_get(cctx, "masters", &masters);	if (result != ISC_R_SUCCESS)		return (result);	for (elt = cfg_list_first(masters);	     elt != NULL;	     elt = cfg_list_next(elt)) {		const cfg_obj_t *list;		const char *listname;		list = cfg_listelt_value(elt);		listname = cfg_obj_asstring(cfg_tuple_get(list, "name"));		if (strcasecmp(listname, name) == 0) {			*ret = list;			return (ISC_R_SUCCESS);		}	}	return (ISC_R_NOTFOUND);}static isc_result_tvalidate_masters(const cfg_obj_t *obj, const cfg_obj_t *config,	         isc_uint32_t *countp, isc_log_t *logctx, isc_mem_t *mctx){	isc_result_t result = ISC_R_SUCCESS;	isc_result_t tresult;	isc_uint32_t count = 0;	isc_symtab_t *symtab = NULL;	isc_symvalue_t symvalue;	const cfg_listelt_t *element;	const cfg_listelt_t **stack = NULL;	isc_uint32_t stackcount = 0, pushed = 0;	const cfg_obj_t *list;	REQUIRE(countp != NULL);	result = isc_symtab_create(mctx, 100, NULL, NULL, ISC_FALSE, &symtab);	if (result != ISC_R_SUCCESS) {		*countp = count;		return (result);	} newlist:	list = cfg_tuple_get(obj, "addresses");	element = cfg_list_first(list); resume:		for ( ;	     element != NULL;	     element = cfg_list_next(element))	{		const char *listname;		const cfg_obj_t *addr;		const cfg_obj_t *key;		addr = cfg_tuple_get(cfg_listelt_value(element),				     "masterselement");		key = cfg_tuple_get(cfg_listelt_value(element), "key");		if (cfg_obj_issockaddr(addr)) {			count++;			continue;		}		if (!cfg_obj_isvoid(key)) {			cfg_obj_log(key, logctx, ISC_LOG_ERROR,				    "unexpected token '%s'",				    cfg_obj_asstring(key));			if (result == ISC_R_SUCCESS)				result = ISC_R_FAILURE;		}		listname = cfg_obj_asstring(addr);		symvalue.as_cpointer = addr;		tresult = isc_symtab_define(symtab, listname, 1, symvalue,					    isc_symexists_reject);		if (tresult == ISC_R_EXISTS)			continue;		tresult = get_masters_def(config, listname, &obj);		if (tresult != ISC_R_SUCCESS) {			if (result == ISC_R_SUCCESS)				result = tresult;			cfg_obj_log(addr, logctx, ISC_LOG_ERROR,				    "unable to find masters list '%s'",				    listname);			continue;		}		/* Grow stack? */		if (stackcount == pushed) {			void * new;			isc_uint32_t newlen = stackcount + 16;			size_t newsize, oldsize;			newsize = newlen * sizeof(*stack);			oldsize = stackcount * sizeof(*stack);			new = isc_mem_get(mctx, newsize);			if (new == NULL)				goto cleanup;			if (stackcount != 0) {				memcpy(new, stack, oldsize);				isc_mem_put(mctx, stack, oldsize);			}			stack = new;			stackcount = newlen;		}		stack[pushed++] = cfg_list_next(element);		goto newlist;	}	if (pushed != 0) {		element = stack[--pushed];		goto resume;	} cleanup:	if (stack != NULL)		isc_mem_put(mctx, stack, stackcount * sizeof(*stack));	isc_symtab_destroy(&symtab);	*countp = count;	return (result);}static isc_result_tcheck_update_policy(const cfg_obj_t *policy, isc_log_t *logctx) {	isc_result_t result = ISC_R_SUCCESS;	isc_result_t tresult;	const cfg_listelt_t *element;	const cfg_listelt_t *element2;	dns_fixedname_t fixed;	const char *str;	isc_buffer_t b;	for (element = cfg_list_first(policy);	     element != NULL;	     element = cfg_list_next(element))	{		const cfg_obj_t *stmt = cfg_listelt_value(element);		const cfg_obj_t *identity = cfg_tuple_get(stmt, "identity");		const cfg_obj_t *matchtype = cfg_tuple_get(stmt, "matchtype");		const cfg_obj_t *dname = cfg_tuple_get(stmt, "name");		const cfg_obj_t *typelist = cfg_tuple_get(stmt, "types");		dns_fixedname_init(&fixed);		str = cfg_obj_asstring(identity);		isc_buffer_init(&b, str, strlen(str));		isc_buffer_add(&b, strlen(str));		tresult = dns_name_fromtext(dns_fixedname_name(&fixed), &b,                                            dns_rootname, ISC_FALSE, NULL);		if (tresult != ISC_R_SUCCESS) {			cfg_obj_log(identity, logctx, ISC_LOG_ERROR,				    "'%s' is not a valid name", str);			result = tresult;		}		dns_fixedname_init(&fixed);		str = cfg_obj_asstring(dname);		isc_buffer_init(&b, str, strlen(str));		isc_buffer_add(&b, strlen(str));		tresult = dns_name_fromtext(dns_fixedname_name(&fixed), &b,					    dns_rootname, ISC_FALSE, NULL);		if (tresult != ISC_R_SUCCESS) {			cfg_obj_log(dname, logctx, ISC_LOG_ERROR,				    "'%s' is not a valid name", str);			result = tresult;		}		if (tresult == ISC_R_SUCCESS &&		    strcasecmp(cfg_obj_asstring(matchtype), "wildcard") == 0 &&		    !dns_name_iswildcard(dns_fixedname_name(&fixed))) {			cfg_obj_log(identity, logctx, ISC_LOG_ERROR,				    "'%s' is not a wildcard", str);			result = ISC_R_FAILURE;		}		for (element2 = cfg_list_first(typelist);		     element2 != NULL;		     element2 = cfg_list_next(element2))		{			const cfg_obj_t *typeobj;			isc_textregion_t r;			dns_rdatatype_t type;						typeobj = cfg_listelt_value(element2);			DE_CONST(cfg_obj_asstring(typeobj), r.base);			r.length = strlen(r.base);			tresult = dns_rdatatype_fromtext(&type, &r);			if (tresult != ISC_R_SUCCESS) {				cfg_obj_log(typeobj, logctx, ISC_LOG_ERROR,                                            "'%s' is not a valid type", r.base);				result = tresult;			}		}	}	return (result);}#define MASTERZONE	1#define SLAVEZONE	2#define STUBZONE	4#define HINTZONE	8#define FORWARDZONE	16#define DELEGATIONZONE	32#define CHECKACL	64typedef struct {	const char *name;	int allowed;} optionstable;static isc_result_tcheck_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,	       const cfg_obj_t *config, isc_symtab_t *symtab,	       dns_rdataclass_t defclass, cfg_aclconfctx_t *actx,	       isc_log_t *logctx, isc_mem_t *mctx){	const char *zname;	const char *typestr;	unsigned int ztype;	const cfg_obj_t *zoptions;	const cfg_obj_t *obj = NULL;	isc_result_t result = ISC_R_SUCCESS;	isc_result_t tresult;	unsigned int i;	dns_rdataclass_t zclass;	dns_fixedname_t fixedname;	isc_buffer_t b;	static optionstable options[] = {	{ "allow-query", MASTERZONE | SLAVEZONE | STUBZONE | CHECKACL },	{ "allow-notify", SLAVEZONE | CHECKACL },	{ "allow-transfer", MASTERZONE | SLAVEZONE | CHECKACL },	{ "notify", MASTERZONE | SLAVEZONE },	{ "also-notify", MASTERZONE | SLAVEZONE },	{ "dialup", MASTERZONE | SLAVEZONE | STUBZONE },	{ "delegation-only", HINTZONE | STUBZONE },	{ "forward", MASTERZONE | SLAVEZONE | STUBZONE | FORWARDZONE},	{ "forwarders", MASTERZONE | SLAVEZONE | STUBZONE | FORWARDZONE},	{ "maintain-ixfr-base", MASTERZONE | SLAVEZONE },	{ "max-ixfr-log-size", MASTERZONE | SLAVEZONE },	{ "notify-source", MASTERZONE | SLAVEZONE },	{ "notify-source-v6", MASTERZONE | SLAVEZONE },	{ "transfer-source", SLAVEZONE | STUBZONE },	{ "transfer-source-v6", SLAVEZONE | STUBZONE },	{ "max-transfer-time-in", SLAVEZONE | STUBZONE },	{ "max-transfer-time-out", MASTERZONE | SLAVEZONE },	{ "max-transfer-idle-in", SLAVEZONE | STUBZONE },	{ "max-transfer-idle-out", MASTERZONE | SLAVEZONE },	{ "max-retry-time", SLAVEZONE | STUBZONE },	{ "min-retry-time", SLAVEZONE | STUBZONE },	{ "max-refresh-time", SLAVEZONE | STUBZONE },	{ "min-refresh-time", SLAVEZONE | STUBZONE },	{ "sig-validity-interval", MASTERZONE },	{ "zone-statistics", MASTERZONE | SLAVEZONE | STUBZONE },	{ "allow-update", MASTERZONE | CHECKACL },	{ "allow-update-forwarding", SLAVEZONE | CHECKACL },	{ "file", MASTERZONE | SLAVEZONE | STUBZONE | HINTZONE },	{ "journal", MASTERZONE | SLAVEZONE },	{ "ixfr-base", MASTERZONE | SLAVEZONE },	{ "ixfr-tmp-file", MASTERZONE | SLAVEZONE },	{ "masters", SLAVEZONE | STUBZONE },	{ "pubkey", MASTERZONE | SLAVEZONE | STUBZONE },	{ "update-policy", MASTERZONE },	{ "database", MASTERZONE | SLAVEZONE | STUBZONE },	{ "key-directory", MASTERZONE },	{ "check-wildcard", MASTERZONE },	{ "check-mx", MASTERZONE },	{ "integrity-check", MASTERZONE },	{ "check-mx-cname", MASTERZONE },	{ "check-srv-cname", MASTERZONE },	{ "masterfile-format", MASTERZONE | SLAVEZONE | STUBZONE | HINTZONE },	{ "update-check-ksk", MASTERZONE },	};	static optionstable dialups[] = {	{ "notify", MASTERZONE | SLAVEZONE },	{ "notify-passive", SLAVEZONE },	{ "refresh", SLAVEZONE | STUBZONE },	{ "passive", SLAVEZONE | STUBZONE },	};	zname = cfg_obj_asstring(cfg_tuple_get(zconfig, "name"));	zoptions = cfg_tuple_get(zconfig, "options");	obj = NULL;	(void)cfg_map_get(zoptions, "type", &obj);	if (obj == NULL) {		cfg_obj_log(zconfig, logctx, ISC_LOG_ERROR,			    "zone '%s': type not present", zname);		return (ISC_R_FAILURE);	}	typestr = cfg_obj_asstring(obj);	if (strcasecmp(typestr, "master") == 0)		ztype = MASTERZONE;	else if (strcasecmp(typestr, "slave") == 0)		ztype = SLAVEZONE;	else if (strcasecmp(typestr, "stub") == 0)		ztype = STUBZONE;	else if (strcasecmp(typestr, "forward") == 0)		ztype = FORWARDZONE;	else if (strcasecmp(typestr, "hint") == 0)		ztype = HINTZONE;	else if (strcasecmp(typestr, "delegation-only") == 0)		ztype = DELEGATIONZONE;	else {		cfg_obj_log(obj, logctx, ISC_LOG_ERROR,			    "zone '%s': invalid type %s",			    zname, typestr);		return (ISC_R_FAILURE);	}	obj = cfg_tuple_get(zconfig, "class");	if (cfg_obj_isstring(obj)) {		isc_textregion_t r;		DE_CONST(cfg_obj_asstring(obj), r.base);		r.length = strlen(r.base);		result = dns_rdataclass_fromtext(&zclass, &r);		if (result != ISC_R_SUCCESS) {			cfg_obj_log(obj, logctx, ISC_LOG_ERROR,				    "zone '%s': invalid class %s",				    zname, r.base);			return (ISC_R_FAILURE);		}		if (zclass != defclass) {			cfg_obj_log(obj, logctx, ISC_LOG_ERROR,				    "zone '%s': class '%s' does not "				    "match view/default class",				    zname, r.base);			return (ISC_R_FAILURE);		}	}	/*	 * Look for an already existing zone.	 * We need to make this cannonical as isc_symtab_define()	 * deals with strings.	 */	dns_fixedname_init(&fixedname);	isc_buffer_init(&b, zname, strlen(zname));	isc_buffer_add(&b, strlen(zname));	tresult = dns_name_fromtext(dns_fixedname_name(&fixedname), &b,				   dns_rootname, ISC_TRUE, NULL);	if (result != ISC_R_SUCCESS) {		cfg_obj_log(zconfig, logctx, ISC_LOG_ERROR,			    "zone '%s': is not a valid name", zname);		tresult = ISC_R_FAILURE;	} else {		char namebuf[DNS_NAME_FORMATSIZE];		dns_name_format(dns_fixedname_name(&fixedname),				namebuf, sizeof(namebuf));

⌨️ 快捷键说明

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