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 + -
显示快捷键?