diff options
-rw-r--r-- | source4/dsdb/common/dsdb_dn.c | 78 | ||||
-rw-r--r-- | source4/dsdb/schema/dsdb_dn.c | 102 | ||||
-rw-r--r-- | source4/dsdb/schema/schema.h | 1 | ||||
-rw-r--r-- | source4/dsdb/wscript_build | 5 |
4 files changed, 106 insertions, 80 deletions
diff --git a/source4/dsdb/common/dsdb_dn.c b/source4/dsdb/common/dsdb_dn.c index 85ba9b7605..3e0f4653fd 100644 --- a/source4/dsdb/common/dsdb_dn.c +++ b/source4/dsdb/common/dsdb_dn.c @@ -328,84 +328,6 @@ int dsdb_dn_string_comparison(struct ldb_context *ldb, void *mem_ctx, return ldb_any_comparison(ldb, mem_ctx, dsdb_dn_string_canonicalise, v1, v2); } - -/* - convert a dsdb_dn to a linked attribute data blob -*/ -WERROR dsdb_dn_la_to_blob(struct ldb_context *sam_ctx, - const struct dsdb_attribute *schema_attrib, - const struct dsdb_schema *schema, - TALLOC_CTX *mem_ctx, - struct dsdb_dn *dsdb_dn, DATA_BLOB **blob) -{ - struct ldb_val v; - WERROR werr; - struct ldb_message_element val_el; - struct drsuapi_DsReplicaAttribute drs; - struct dsdb_syntax_ctx syntax_ctx; - - /* use default syntax conversion context */ - dsdb_syntax_ctx_init(&syntax_ctx, sam_ctx, schema); - - /* we need a message_element with just one value in it */ - v = data_blob_string_const(dsdb_dn_get_extended_linearized(mem_ctx, dsdb_dn, 1)); - - val_el.name = schema_attrib->lDAPDisplayName; - val_el.values = &v; - val_el.num_values = 1; - - werr = schema_attrib->syntax->ldb_to_drsuapi(&syntax_ctx, schema_attrib, &val_el, mem_ctx, &drs); - W_ERROR_NOT_OK_RETURN(werr); - - if (drs.value_ctr.num_values != 1) { - DEBUG(1,(__location__ ": Failed to build DRS blob for linked attribute %s\n", - schema_attrib->lDAPDisplayName)); - return WERR_DS_DRA_INTERNAL_ERROR; - } - - *blob = drs.value_ctr.values[0].blob; - return WERR_OK; -} - -/* - convert a data blob to a dsdb_dn - */ -WERROR dsdb_dn_la_from_blob(struct ldb_context *sam_ctx, - const struct dsdb_attribute *schema_attrib, - const struct dsdb_schema *schema, - TALLOC_CTX *mem_ctx, - DATA_BLOB *blob, - struct dsdb_dn **dsdb_dn) -{ - WERROR werr; - struct ldb_message_element new_el; - struct drsuapi_DsReplicaAttribute drs; - struct drsuapi_DsAttributeValue val; - struct dsdb_syntax_ctx syntax_ctx; - - /* use default syntax conversion context */ - dsdb_syntax_ctx_init(&syntax_ctx, sam_ctx, schema); - - drs.value_ctr.num_values = 1; - drs.value_ctr.values = &val; - val.blob = blob; - - werr = schema_attrib->syntax->drsuapi_to_ldb(&syntax_ctx, schema_attrib, &drs, mem_ctx, &new_el); - W_ERROR_NOT_OK_RETURN(werr); - - if (new_el.num_values != 1) { - return WERR_INTERNAL_ERROR; - } - - *dsdb_dn = dsdb_dn_parse(mem_ctx, sam_ctx, &new_el.values[0], schema_attrib->syntax->ldap_oid); - if (!*dsdb_dn) { - return WERR_INTERNAL_ERROR; - } - - return WERR_OK; -} - - /* format a drsuapi_DsReplicaObjectIdentifier naming context as a string */ diff --git a/source4/dsdb/schema/dsdb_dn.c b/source4/dsdb/schema/dsdb_dn.c new file mode 100644 index 0000000000..bd945bca06 --- /dev/null +++ b/source4/dsdb/schema/dsdb_dn.c @@ -0,0 +1,102 @@ +/* + Unix SMB/CIFS implementation. + Samba utility functions + + Copyright (C) Andrew Tridgell 2009 + Copyright (C) Andrew Bartlett <abartlet@samba.org> 2009 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "includes.h" +#include "dsdb/samdb/samdb.h" +#include "lib/ldb/include/ldb_module.h" +#include "librpc/ndr/libndr.h" +#include "libcli/security/dom_sid.h" + +/* + convert a dsdb_dn to a linked attribute data blob +*/ +WERROR dsdb_dn_la_to_blob(struct ldb_context *sam_ctx, + const struct dsdb_attribute *schema_attrib, + const struct dsdb_schema *schema, + TALLOC_CTX *mem_ctx, + struct dsdb_dn *dsdb_dn, DATA_BLOB **blob) +{ + struct ldb_val v; + WERROR werr; + struct ldb_message_element val_el; + struct drsuapi_DsReplicaAttribute drs; + struct dsdb_syntax_ctx syntax_ctx; + + /* use default syntax conversion context */ + dsdb_syntax_ctx_init(&syntax_ctx, sam_ctx, schema); + + /* we need a message_element with just one value in it */ + v = data_blob_string_const(dsdb_dn_get_extended_linearized(mem_ctx, dsdb_dn, 1)); + + val_el.name = schema_attrib->lDAPDisplayName; + val_el.values = &v; + val_el.num_values = 1; + + werr = schema_attrib->syntax->ldb_to_drsuapi(&syntax_ctx, schema_attrib, &val_el, mem_ctx, &drs); + W_ERROR_NOT_OK_RETURN(werr); + + if (drs.value_ctr.num_values != 1) { + DEBUG(1,(__location__ ": Failed to build DRS blob for linked attribute %s\n", + schema_attrib->lDAPDisplayName)); + return WERR_DS_DRA_INTERNAL_ERROR; + } + + *blob = drs.value_ctr.values[0].blob; + return WERR_OK; +} + +/* + convert a data blob to a dsdb_dn + */ +WERROR dsdb_dn_la_from_blob(struct ldb_context *sam_ctx, + const struct dsdb_attribute *schema_attrib, + const struct dsdb_schema *schema, + TALLOC_CTX *mem_ctx, + DATA_BLOB *blob, + struct dsdb_dn **dsdb_dn) +{ + WERROR werr; + struct ldb_message_element new_el; + struct drsuapi_DsReplicaAttribute drs; + struct drsuapi_DsAttributeValue val; + struct dsdb_syntax_ctx syntax_ctx; + + /* use default syntax conversion context */ + dsdb_syntax_ctx_init(&syntax_ctx, sam_ctx, schema); + + drs.value_ctr.num_values = 1; + drs.value_ctr.values = &val; + val.blob = blob; + + werr = schema_attrib->syntax->drsuapi_to_ldb(&syntax_ctx, schema_attrib, &drs, mem_ctx, &new_el); + W_ERROR_NOT_OK_RETURN(werr); + + if (new_el.num_values != 1) { + return WERR_INTERNAL_ERROR; + } + + *dsdb_dn = dsdb_dn_parse(mem_ctx, sam_ctx, &new_el.values[0], schema_attrib->syntax->ldap_oid); + if (!*dsdb_dn) { + return WERR_INTERNAL_ERROR; + } + + return WERR_OK; +} diff --git a/source4/dsdb/schema/schema.h b/source4/dsdb/schema/schema.h index 8c73fd56d4..fd1e090b85 100644 --- a/source4/dsdb/schema/schema.h +++ b/source4/dsdb/schema/schema.h @@ -27,6 +27,7 @@ struct dsdb_attribute; struct dsdb_class; struct dsdb_schema; +struct dsdb_dn; struct dsdb_syntax_ctx { struct ldb_context *ldb; diff --git a/source4/dsdb/wscript_build b/source4/dsdb/wscript_build index 90d265f09e..4ad3e13473 100644 --- a/source4/dsdb/wscript_build +++ b/source4/dsdb/wscript_build @@ -18,9 +18,10 @@ bld.SAMBA_SUBSYSTEM('SAMDB_COMMON', bld.SAMBA_SUBSYSTEM('SAMDB_SCHEMA', - source='schema/schema_init.c schema/schema_set.c schema/schema_query.c schema/schema_syntax.c schema/schema_description.c schema/schema_convert_to_ol.c schema/schema_inferiors.c schema/schema_prefixmap.c schema/schema_info_attr.c schema/schema_filtered.c', + source='schema/schema_init.c schema/schema_set.c schema/schema_query.c schema/schema_syntax.c schema/schema_description.c schema/schema_convert_to_ol.c schema/schema_inferiors.c schema/schema_prefixmap.c schema/schema_info_attr.c schema/schema_filtered.c schema/dsdb_dn.c', autoproto='schema/proto.h', - deps='SAMDB_COMMON NDR_DRSUAPI NDR_DRSBLOBS LDBSAMBA tevent' + # FIXME: Why does this use DSDB_MODULE_HELPERS? + deps='SAMDB_COMMON NDR_DRSUAPI NDR_DRSBLOBS LDBSAMBA tevent DSDB_MODULE_HELPERS' ) |