ldap_controls.c

来自「samba最新软件」· C语言 代码 · 共 1,230 行 · 第 1/2 页

C
1,230
字号
	if (asn1_peek_tag(data, ASN1_OCTET_STRING)) {		if (!asn1_read_OctetString(data, mem_ctx, &context_id)) {			return false;		}		lvrc->contextId = talloc_strndup(lvrc, (const char *)context_id.data, context_id.length);		if (!lvrc->contextId) {			return false;		}		lvrc->ctxid_len = context_id.length;	} else {		lvrc->contextId = NULL;		lvrc->ctxid_len = 0;	}	if (!asn1_end_tag(data)) {		return false;	}	*out = lvrc;	return true;}static bool encode_server_sort_response(void *mem_ctx, void *in, DATA_BLOB *out){	struct ldb_sort_resp_control *lsrc = talloc_get_type(in, struct ldb_sort_resp_control);	struct asn1_data *data = asn1_init(mem_ctx);	if (!data) return false;	if (!asn1_push_tag(data, ASN1_SEQUENCE(0))) {		return false;	}	if (!asn1_write_enumerated(data, lsrc->result)) {		return false;	}	if (lsrc->attr_desc) {		if (!asn1_write_OctetString(data, lsrc->attr_desc, strlen(lsrc->attr_desc))) {			return false;		}	}	if (!asn1_pop_tag(data)) {		return false;	}	*out = data_blob_talloc(mem_ctx, data->data, data->length);	if (out->data == NULL) {		return false;	}	talloc_free(data);	return true;}static bool encode_server_sort_request(void *mem_ctx, void *in, DATA_BLOB *out){	struct ldb_server_sort_control **lssc = talloc_get_type(in, struct ldb_server_sort_control *);	struct asn1_data *data = asn1_init(mem_ctx);	int num;	if (!data) return false;	if (!asn1_push_tag(data, ASN1_SEQUENCE(0))) {		return false;	}	for (num = 0; lssc[num]; num++) {		if (!asn1_push_tag(data, ASN1_SEQUENCE(0))) {			return false;		}				if (!asn1_write_OctetString(data, lssc[num]->attributeName, strlen(lssc[num]->attributeName))) {			return false;		}		if (lssc[num]->orderingRule) {			if (!asn1_write_OctetString(data, lssc[num]->orderingRule, strlen(lssc[num]->orderingRule))) {				return false;			}		}		if (lssc[num]->reverse) {			if (!asn1_write_BOOLEAN(data, lssc[num]->reverse)) {				return false;			}		}		if (!asn1_pop_tag(data)) {			return false;		}	}	if (!asn1_pop_tag(data)) {		return false;	}	*out = data_blob_talloc(mem_ctx, data->data, data->length);	if (out->data == NULL) {		return false;	}	talloc_free(data);	return true;}static bool encode_extended_dn_request(void *mem_ctx, void *in, DATA_BLOB *out){	struct ldb_extended_dn_control *ledc = talloc_get_type(in, struct ldb_extended_dn_control);	struct asn1_data *data;	if (!in) {		*out = data_blob(NULL, 0);		return true;	}	data = asn1_init(mem_ctx);	if (!data) return false;	if (!asn1_push_tag(data, ASN1_SEQUENCE(0))) {		return false;	}	if (!asn1_write_Integer(data, ledc->type)) {		return false;	}	if (!asn1_pop_tag(data)) {		return false;	}	*out = data_blob_talloc(mem_ctx, data->data, data->length);	if (out->data == NULL) {		return false;	}	talloc_free(data);	return true;}static bool encode_sd_flags_request(void *mem_ctx, void *in, DATA_BLOB *out){	struct ldb_sd_flags_control *lsdfc = talloc_get_type(in, struct ldb_sd_flags_control);	struct asn1_data *data = asn1_init(mem_ctx);	if (!data) return false;	if (!asn1_push_tag(data, ASN1_SEQUENCE(0))) {		return false;	}	if (!asn1_write_Integer(data, lsdfc->secinfo_flags)) {		return false;	}	if (!asn1_pop_tag(data)) {		return false;	}	*out = data_blob_talloc(mem_ctx, data->data, data->length);	if (out->data == NULL) {		return false;	}	talloc_free(data);	return true;}static bool encode_search_options_request(void *mem_ctx, void *in, DATA_BLOB *out){	struct ldb_search_options_control *lsoc = talloc_get_type(in, struct ldb_search_options_control);	struct asn1_data *data = asn1_init(mem_ctx);	if (!data) return false;	if (!asn1_push_tag(data, ASN1_SEQUENCE(0))) {		return false;	}	if (!asn1_write_Integer(data, lsoc->search_options)) {		return false;	}	if (!asn1_pop_tag(data)) {		return false;	}	*out = data_blob_talloc(mem_ctx, data->data, data->length);	if (out->data == NULL) {		return false;	}	talloc_free(data);	return true;}static bool encode_paged_results_request(void *mem_ctx, void *in, DATA_BLOB *out){	struct ldb_paged_control *lprc = talloc_get_type(in, struct ldb_paged_control);	struct asn1_data *data = asn1_init(mem_ctx);	if (!data) return false;	if (!asn1_push_tag(data, ASN1_SEQUENCE(0))) {		return false;	}	if (!asn1_write_Integer(data, lprc->size)) {		return false;	}	if (!asn1_write_OctetString(data, lprc->cookie, lprc->cookie_len)) {		return false;	}		if (!asn1_pop_tag(data)) {		return false;	}	*out = data_blob_talloc(mem_ctx, data->data, data->length);	if (out->data == NULL) {		return false;	}	talloc_free(data);	return true;}/* seem that this controls has 2 forms one in case it is used with * a Search Request and another when used ina Search Response */static bool encode_asq_control(void *mem_ctx, void *in, DATA_BLOB *out){	struct ldb_asq_control *lac = talloc_get_type(in, struct ldb_asq_control);	struct asn1_data *data = asn1_init(mem_ctx);	if (!data) return false;	if (!asn1_push_tag(data, ASN1_SEQUENCE(0))) {		return false;	}	if (lac->request) {		if (!asn1_write_OctetString(data, lac->source_attribute, lac->src_attr_len)) {			return false;		}	} else {		if (!asn1_write_enumerated(data, lac->result)) {			return false;		}	}	if (!asn1_pop_tag(data)) {		return false;	}	*out = data_blob_talloc(mem_ctx, data->data, data->length);	if (out->data == NULL) {		return false;	}	talloc_free(data);	return true;}static bool encode_dirsync_request(void *mem_ctx, void *in, DATA_BLOB *out){	struct ldb_dirsync_control *ldc = talloc_get_type(in, struct ldb_dirsync_control);	struct asn1_data *data = asn1_init(mem_ctx);	if (!data) return false;	if (!asn1_push_tag(data, ASN1_SEQUENCE(0))) {		return false;	}	if (!asn1_write_Integer(data, ldc->flags)) {		return false;	}	if (!asn1_write_Integer(data, ldc->max_attributes)) {		return false;	}	if (!asn1_write_OctetString(data, ldc->cookie, ldc->cookie_len)) {		return false;	}		if (!asn1_pop_tag(data)) {		return false;	}	*out = data_blob_talloc(mem_ctx, data->data, data->length);	if (out->data == NULL) {		return false;	}	talloc_free(data);	return true;}static bool encode_domain_scope_request(void *mem_ctx, void *in, DATA_BLOB *out){	if (in) {		return false;	}	*out = data_blob(NULL, 0);	return true;}static bool encode_notification_request(void *mem_ctx, void *in, DATA_BLOB *out){	if (in) {		return false;	}	*out = data_blob(NULL, 0);	return true;}static bool encode_show_deleted_request(void *mem_ctx, void *in, DATA_BLOB *out){	if (in) {		return false;	}	*out = data_blob(NULL, 0);	return true;}static bool encode_permissive_modify_request(void *mem_ctx, void *in, DATA_BLOB *out){	if (in) {		return false;	}	*out = data_blob(NULL, 0);	return true;}static bool encode_manageDSAIT_request(void *mem_ctx, void *in, DATA_BLOB *out){	if (in) {		return false;	}	*out = data_blob(NULL, 0);	return true;}static bool encode_vlv_request(void *mem_ctx, void *in, DATA_BLOB *out){	struct ldb_vlv_req_control *lvrc = talloc_get_type(in, struct ldb_vlv_req_control);	struct asn1_data *data = asn1_init(mem_ctx);	if (!data) return false;	if (!asn1_push_tag(data, ASN1_SEQUENCE(0))) {		return false;	}	if (!asn1_write_Integer(data, lvrc->beforeCount)) {		return false;	}	if (!asn1_write_Integer(data, lvrc->afterCount)) {		return false;	}	if (lvrc->type == 0) {		if (!asn1_push_tag(data, ASN1_CONTEXT(0))) {			return false;		}				if (!asn1_push_tag(data, ASN1_SEQUENCE(0))) {			return false;		}				if (!asn1_write_Integer(data, lvrc->match.byOffset.offset)) {			return false;		}		if (!asn1_write_Integer(data, lvrc->match.byOffset.contentCount)) {			return false;		}		if (!asn1_pop_tag(data)) { /*SEQUENCE*/			return false;		}		if (!asn1_pop_tag(data)) { /*CONTEXT*/			return false;		}	} else {		if (!asn1_push_tag(data, ASN1_CONTEXT(1))) {			return false;		}				if (!asn1_write_OctetString(data, lvrc->match.gtOrEq.value, lvrc->match.gtOrEq.value_len)) {			return false;		}		if (!asn1_pop_tag(data)) { /*CONTEXT*/			return false;		}	}	if (lvrc->ctxid_len) {		if (!asn1_write_OctetString(data, lvrc->contextId, lvrc->ctxid_len)) {			return false;		}	}	if (!asn1_pop_tag(data)) {		return false;	}	*out = data_blob_talloc(mem_ctx, data->data, data->length);	if (out->data == NULL) {		return false;	}	talloc_free(data);	return true;}static bool encode_vlv_response(void *mem_ctx, void *in, DATA_BLOB *out){	struct ldb_vlv_resp_control *lvrc = talloc_get_type(in, struct ldb_vlv_resp_control);	struct asn1_data *data = asn1_init(mem_ctx);	if (!data) return false;	if (!asn1_push_tag(data, ASN1_SEQUENCE(0))) {		return false;	}	if (!asn1_write_Integer(data, lvrc->targetPosition)) {		return false;	}	if (!asn1_write_Integer(data, lvrc->contentCount)) {		return false;	}	if (!asn1_write_enumerated(data, lvrc->vlv_result)) {		return false;	}	if (lvrc->ctxid_len) {		if (!asn1_write_OctetString(data, lvrc->contextId, lvrc->ctxid_len)) {			return false;		}	}	if (!asn1_pop_tag(data)) {		return false;	}	*out = data_blob_talloc(mem_ctx, data->data, data->length);	if (out->data == NULL) {		return false;	}	talloc_free(data);	return true;}struct control_handler ldap_known_controls[] = {	{ "1.2.840.113556.1.4.319", decode_paged_results_request, encode_paged_results_request },	{ "1.2.840.113556.1.4.529", decode_extended_dn_request, encode_extended_dn_request },	{ "1.2.840.113556.1.4.473", decode_server_sort_request, encode_server_sort_request },	{ "1.2.840.113556.1.4.474", decode_server_sort_response, encode_server_sort_response },	{ "1.2.840.113556.1.4.1504", decode_asq_control, encode_asq_control },	{ "1.2.840.113556.1.4.841", decode_dirsync_request, encode_dirsync_request },	{ "1.2.840.113556.1.4.528", decode_notification_request, encode_notification_request },	{ "1.2.840.113556.1.4.417", decode_show_deleted_request, encode_show_deleted_request },	{ "1.2.840.113556.1.4.1413", decode_permissive_modify_request, encode_permissive_modify_request },	{ "1.2.840.113556.1.4.801", decode_sd_flags_request, encode_sd_flags_request },	{ "1.2.840.113556.1.4.1339", decode_domain_scope_request, encode_domain_scope_request },	{ "1.2.840.113556.1.4.1340", decode_search_options_request, encode_search_options_request },	{ "2.16.840.1.113730.3.4.2", decode_manageDSAIT_request, encode_manageDSAIT_request },	{ "2.16.840.1.113730.3.4.9", decode_vlv_request, encode_vlv_request },	{ "2.16.840.1.113730.3.4.10", decode_vlv_response, encode_vlv_response },/* DSDB_CONTROL_CURRENT_PARTITION_OID is internal only, and has no network representation */	{ "1.3.6.1.4.1.7165.4.3.2", NULL, NULL },/* DSDB_EXTENDED_REPLICATED_OBJECTS_OID is internal only, and has no network representation */	{ "1.3.6.1.4.1.7165.4.4.1", NULL, NULL },	{ NULL, NULL, NULL }};bool ldap_decode_control_value(void *mem_ctx, DATA_BLOB value, struct ldb_control *ctrl){	int i;	for (i = 0; ldap_known_controls[i].oid != NULL; i++) {		if (strcmp(ldap_known_controls[i].oid, ctrl->oid) == 0) {			if (!ldap_known_controls[i].decode || !ldap_known_controls[i].decode(mem_ctx, value, &ctrl->data)) {				return false;			}			break;		}	}	if (ldap_known_controls[i].oid == NULL) {		return false;	}	return true;}bool ldap_decode_control_wrapper(void *mem_ctx, struct asn1_data *data, struct ldb_control *ctrl, DATA_BLOB *value){	DATA_BLOB oid;	if (!asn1_start_tag(data, ASN1_SEQUENCE(0))) {		return false;	}	if (!asn1_read_OctetString(data, mem_ctx, &oid)) {		return false;	}	ctrl->oid = talloc_strndup(mem_ctx, (char *)oid.data, oid.length);	if (!ctrl->oid) {		return false;	}	if (asn1_peek_tag(data, ASN1_BOOLEAN)) {		bool critical;		if (!asn1_read_BOOLEAN(data, &critical)) {			return false;		}		ctrl->critical = critical;	} else {		ctrl->critical = false;	}	ctrl->data = NULL;	if (!asn1_peek_tag(data, ASN1_OCTET_STRING)) {		*value = data_blob(NULL, 0);		goto end_tag;	}	if (!asn1_read_OctetString(data, mem_ctx, value)) {		return false;	}end_tag:	if (!asn1_end_tag(data)) {		return false;	}	return true;}bool ldap_encode_control(void *mem_ctx, struct asn1_data *data, struct ldb_control *ctrl){	DATA_BLOB value;	int i;	for (i = 0; ldap_known_controls[i].oid != NULL; i++) {		if (strcmp(ldap_known_controls[i].oid, ctrl->oid) == 0) {			if (!ldap_known_controls[i].encode) {				if (ctrl->critical) {					return false;				} else {					/* not encoding this control */					return true;				}			}			if (!ldap_known_controls[i].encode(mem_ctx, ctrl->data, &value)) {				return false;			}			break;		}	}	if (ldap_known_controls[i].oid == NULL) {		return false;	}	if (!asn1_push_tag(data, ASN1_SEQUENCE(0))) {		return false;	}	if (!asn1_write_OctetString(data, ctrl->oid, strlen(ctrl->oid))) {		return false;	}	if (ctrl->critical) {		if (!asn1_write_BOOLEAN(data, ctrl->critical)) {			return false;		}	}	if (!ctrl->data) {		goto pop_tag;	}	if (!asn1_write_OctetString(data, value.data, value.length)) {		return false;	}pop_tag:	if (!asn1_pop_tag(data)) {		return false;	}	return true;}

⌨️ 快捷键说明

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