2 Unix SMB/CIFS implementation.
3 Samba utility functions
5 Copyright (C) Andrew Tridgell 2009
6 Copyright (C) Andrew Bartlett <abartlet@samba.org> 2009
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.
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.
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/>.
23 #include "dsdb/samdb/samdb.h"
24 #include <ldb_module.h>
25 #include "librpc/ndr/libndr.h"
26 #include "libcli/security/dom_sid.h"
29 convert a dsdb_dn to a linked attribute data blob
31 WERROR
dsdb_dn_la_to_blob(struct ldb_context
*sam_ctx
,
32 const struct dsdb_attribute
*schema_attrib
,
33 const struct dsdb_schema
*schema
,
35 struct dsdb_dn
*dsdb_dn
, DATA_BLOB
**blob
)
39 struct ldb_message_element val_el
;
40 struct drsuapi_DsReplicaAttribute drs
;
41 struct dsdb_syntax_ctx syntax_ctx
;
43 /* use default syntax conversion context */
44 dsdb_syntax_ctx_init(&syntax_ctx
, sam_ctx
, schema
);
46 /* we need a message_element with just one value in it */
47 v
= data_blob_string_const(dsdb_dn_get_extended_linearized(mem_ctx
, dsdb_dn
, 1));
49 val_el
.name
= schema_attrib
->lDAPDisplayName
;
51 val_el
.num_values
= 1;
53 werr
= schema_attrib
->syntax
->ldb_to_drsuapi(&syntax_ctx
, schema_attrib
, &val_el
, mem_ctx
, &drs
);
54 W_ERROR_NOT_OK_RETURN(werr
);
56 if (drs
.value_ctr
.num_values
!= 1) {
57 DEBUG(1,(__location__
": Failed to build DRS blob for linked attribute %s\n",
58 schema_attrib
->lDAPDisplayName
));
59 return WERR_DS_DRA_INTERNAL_ERROR
;
62 *blob
= drs
.value_ctr
.values
[0].blob
;
67 convert a data blob to a dsdb_dn
69 WERROR
dsdb_dn_la_from_blob(struct ldb_context
*sam_ctx
,
70 const struct dsdb_attribute
*schema_attrib
,
71 const struct dsdb_schema
*schema
,
74 struct dsdb_dn
**dsdb_dn
)
77 struct ldb_message_element new_el
;
78 struct drsuapi_DsReplicaAttribute drs
;
79 struct drsuapi_DsAttributeValue val
;
80 struct dsdb_syntax_ctx syntax_ctx
;
82 /* use default syntax conversion context */
83 dsdb_syntax_ctx_init(&syntax_ctx
, sam_ctx
, schema
);
85 drs
.value_ctr
.num_values
= 1;
86 drs
.value_ctr
.values
= &val
;
89 werr
= schema_attrib
->syntax
->drsuapi_to_ldb(&syntax_ctx
, schema_attrib
, &drs
, mem_ctx
, &new_el
);
90 W_ERROR_NOT_OK_RETURN(werr
);
92 if (new_el
.num_values
!= 1) {
93 return WERR_INTERNAL_ERROR
;
96 *dsdb_dn
= dsdb_dn_parse(mem_ctx
, sam_ctx
, &new_el
.values
[0], schema_attrib
->syntax
->ldap_oid
);
98 return WERR_INTERNAL_ERROR
;