Line data Source code
1 : /* 2 : Unix SMB/CIFS implementation. 3 : 4 : wrap/unwrap NDR encoded elements for ldap calls 5 : 6 : Copyright (C) Andrew Tridgell 2005 7 : 8 : This program is free software; you can redistribute it and/or modify 9 : it under the terms of the GNU General Public License as published by 10 : the Free Software Foundation; either version 3 of the License, or 11 : (at your option) any later version. 12 : 13 : This program is distributed in the hope that it will be useful, 14 : but WITHOUT ANY WARRANTY; without even the implied warranty of 15 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 : GNU General Public License for more details. 17 : 18 : You should have received a copy of the GNU General Public License 19 : along with this program. If not, see <http://www.gnu.org/licenses/>. 20 : 21 : */ 22 : 23 : #include "includes.h" 24 : #include <ldb.h> 25 : #include "librpc/gen_ndr/ndr_security.h" 26 : #include "librpc/gen_ndr/ndr_misc.h" 27 : #include "libcli/ldap/ldap_ndr.h" 28 : 29 : /* 30 : encode a NDR uint32 as a ldap filter element 31 : */ 32 3584 : char *ldap_encode_ndr_uint32(TALLOC_CTX *mem_ctx, uint32_t value) 33 : { 34 36 : uint8_t buf[4]; 35 36 : struct ldb_val val; 36 3584 : SIVAL(buf, 0, value); 37 3584 : val.data = buf; 38 3584 : val.length = 4; 39 3584 : return ldb_binary_encode(mem_ctx, val); 40 : } 41 : 42 : /* 43 : encode a NDR dom_sid as a ldap filter element 44 : */ 45 672173 : char *ldap_encode_ndr_dom_sid(TALLOC_CTX *mem_ctx, const struct dom_sid *sid) 46 : { 47 22409 : DATA_BLOB blob; 48 22409 : enum ndr_err_code ndr_err; 49 22409 : char *ret; 50 672173 : ndr_err = ndr_push_struct_blob(&blob, mem_ctx, sid, 51 : (ndr_push_flags_fn_t)ndr_push_dom_sid); 52 672173 : if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { 53 0 : return NULL; 54 : } 55 672173 : ret = ldb_binary_encode(mem_ctx, blob); 56 672173 : data_blob_free(&blob); 57 672173 : return ret; 58 : } 59 : 60 : 61 : /* 62 : encode a NDR GUID as a ldap filter element 63 : */ 64 74 : char *ldap_encode_ndr_GUID(TALLOC_CTX *mem_ctx, const struct GUID *guid) 65 : { 66 74 : struct GUID_ndr_buf buf = { .buf = {0}, }; 67 74 : DATA_BLOB blob = { .data = buf.buf, .length = sizeof(buf.buf), }; 68 0 : char *ret; 69 74 : GUID_to_ndr_buf(guid, &buf); 70 74 : ret = ldb_binary_encode(mem_ctx, blob); 71 74 : return ret; 72 : } 73 : 74 : /* 75 : decode a NDR GUID from a ldap filter element 76 : */ 77 20 : NTSTATUS ldap_decode_ndr_GUID(TALLOC_CTX *mem_ctx, struct ldb_val val, struct GUID *guid) 78 : { 79 0 : DATA_BLOB blob; 80 0 : enum ndr_err_code ndr_err; 81 : 82 20 : blob.data = val.data; 83 20 : blob.length = val.length; 84 20 : ndr_err = ndr_pull_struct_blob(&blob, mem_ctx, guid, 85 : (ndr_pull_flags_fn_t)ndr_pull_GUID); 86 20 : talloc_free(val.data); 87 20 : if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { 88 0 : return ndr_map_error2ntstatus(ndr_err); 89 : } 90 20 : return NT_STATUS_OK; 91 : }