return false;
}
- werr = dsdb_schema_pfm_make_attid(ctx->schema->prefixmap, oid, id_local);
+ werr = dsdb_schema_pfm_attid_from_oid(ctx->schema->prefixmap, oid, id_local);
if (!W_ERROR_IS_OK(werr)) {
DEBUG(0,("OID->ATTID failed (%s) for: %s\n", win_errstr(werr), oid));
return false;
}
if (attr->rangeUpper) {
- if ((int32_t)t > (int32_t)*attr->rangeLower) {
+ if ((int32_t)t > (int32_t)*attr->rangeUpper) {
return WERR_DS_INVALID_ATTRIBUTE_SYNTAX;
}
}
W_ERROR_HAVE_NO_MEMORY(out->values);
for (i=0; i < out->num_values; i++) {
- uint32_t v;
+ uint32_t v, vo;
const struct dsdb_class *c;
const char *str;
}
v = IVAL(in->value_ctr.values[i].blob->data, 0);
+ vo = v;
/* convert remote ATTID to local ATTID */
if (!dsdb_syntax_attid_from_remote_attid(ctx, mem_ctx, v, &v)) {
c = dsdb_class_by_governsID_id(ctx->schema, v);
if (!c) {
- DEBUG(1,(__location__ ": Unknown governsID 0x%08X\n", v));
- return WERR_FOOBAR;
+ int dbg_level = ctx->schema->resolving_in_progress ? 10 : 0;
+ DEBUG(dbg_level,(__location__ ": %s unknown local governsID 0x%08X remote 0x%08X%s\n",
+ attr->lDAPDisplayName, v, vo,
+ ctx->schema->resolving_in_progress ? "resolving in progress" : ""));
+ return WERR_DS_OBJ_CLASS_NOT_DEFINED;
}
str = talloc_strdup(out->values, c->lDAPDisplayName);
W_ERROR_HAVE_NO_MEMORY(out->values);
for (i=0; i < out->num_values; i++) {
- uint32_t v;
+ uint32_t v, vo;
const struct dsdb_attribute *a;
const char *str;
}
v = IVAL(in->value_ctr.values[i].blob->data, 0);
+ vo = v;
/* convert remote ATTID to local ATTID */
if (!dsdb_syntax_attid_from_remote_attid(ctx, mem_ctx, v, &v)) {
a = dsdb_attribute_by_attributeID_id(ctx->schema, v);
if (!a) {
- DEBUG(1,(__location__ ": Unknown attributeID_id 0x%08X\n", v));
- return WERR_FOOBAR;
+ int dbg_level = ctx->schema->resolving_in_progress ? 10 : 0;
+ DEBUG(dbg_level,(__location__ ": %s unknown local attributeID_id 0x%08X remote 0x%08X%s\n",
+ attr->lDAPDisplayName, v, vo,
+ ctx->schema->resolving_in_progress ? "resolving in progress" : ""));
+ return WERR_DS_ATT_NOT_DEF_IN_SCHEMA;
}
str = talloc_strdup(out->values, a->lDAPDisplayName);
dn2 = ldb_dn_copy(tmp_ctx, dn);
if (dn == NULL) {
talloc_free(tmp_ctx);
- return WERR_NOMEM;
+ return WERR_NOT_ENOUGH_MEMORY;
}
num_components = ldb_dn_get_comp_num(dn);
for (i=0; i < ARRAY_SIZE(dsdb_syntaxes); i++) {
/*
- * We must pretend that userParamters was declared
+ * We must pretend that userParameters was declared
* binary string, so we can store the 'UTF16' (not
* really string) structure as given over SAMR to samba
*/
return NULL;
}
-WERROR dsdb_attribute_drsuapi_to_ldb(struct ldb_context *ldb,
- const struct dsdb_schema *schema,
- const struct dsdb_schema_prefixmap *pfm_remote,
- const struct drsuapi_DsReplicaAttribute *in,
- TALLOC_CTX *mem_ctx,
- struct ldb_message_element *out,
- enum drsuapi_DsAttributeId *local_attid_as_enum)
+WERROR dsdb_attribute_drsuapi_remote_to_local(const struct dsdb_syntax_ctx *ctx,
+ enum drsuapi_DsAttributeId remote_attid_as_enum,
+ enum drsuapi_DsAttributeId *local_attid_as_enum,
+ const struct dsdb_attribute **_sa)
{
+ TALLOC_CTX *frame = talloc_stackframe();
const struct dsdb_attribute *sa;
- struct dsdb_syntax_ctx syntax_ctx;
uint32_t attid_local;
+ bool ok;
- /* use default syntax conversion context */
- dsdb_syntax_ctx_init(&syntax_ctx, ldb, schema);
- syntax_ctx.pfm_remote = pfm_remote;
+ if (ctx->pfm_remote == NULL) {
+ smb_panic(__location__);
+ }
- switch (dsdb_pfm_get_attid_type(in->attid)) {
+ switch (dsdb_pfm_get_attid_type(remote_attid_as_enum)) {
case DSDB_ATTID_TYPE_PFM:
/* map remote ATTID to local ATTID */
- if (!dsdb_syntax_attid_from_remote_attid(&syntax_ctx, mem_ctx, in->attid, &attid_local)) {
+ ok = dsdb_syntax_attid_from_remote_attid(ctx, frame,
+ remote_attid_as_enum,
+ &attid_local);
+ if (!ok) {
DEBUG(0,(__location__ ": Can't find local ATTID for 0x%08X\n",
- in->attid));
+ remote_attid_as_enum));
+ TALLOC_FREE(frame);
return WERR_DS_ATT_NOT_DEF_IN_SCHEMA;
}
break;
case DSDB_ATTID_TYPE_INTID:
/* use IntId value directly */
- attid_local = in->attid;
+ attid_local = remote_attid_as_enum;
break;
default:
/* we should never get here */
DEBUG(0,(__location__ ": Invalid ATTID type passed for conversion - 0x%08X\n",
- in->attid));
+ remote_attid_as_enum));
+ TALLOC_FREE(frame);
return WERR_INVALID_PARAMETER;
}
- sa = dsdb_attribute_by_attributeID_id(schema, attid_local);
+ sa = dsdb_attribute_by_attributeID_id(ctx->schema, attid_local);
if (!sa) {
- DEBUG(1,(__location__ ": Unknown attributeID_id 0x%08X\n", in->attid));
+ int dbg_level = ctx->schema->resolving_in_progress ? 10 : 0;
+ DEBUG(dbg_level,(__location__ ": Unknown local attributeID_id 0x%08X remote 0x%08X%s\n",
+ attid_local, remote_attid_as_enum,
+ ctx->schema->resolving_in_progress ? "resolving in progress" : ""));
+ TALLOC_FREE(frame);
return WERR_DS_ATT_NOT_DEF_IN_SCHEMA;
}
*local_attid_as_enum = (enum drsuapi_DsAttributeId)attid_local;
}
+ if (_sa != NULL) {
+ *_sa = sa;
+ }
+
+ TALLOC_FREE(frame);
+ return WERR_OK;
+}
+
+WERROR dsdb_attribute_drsuapi_to_ldb(struct ldb_context *ldb,
+ const struct dsdb_schema *schema,
+ const struct dsdb_schema_prefixmap *pfm_remote,
+ const struct drsuapi_DsReplicaAttribute *in,
+ TALLOC_CTX *mem_ctx,
+ struct ldb_message_element *out,
+ enum drsuapi_DsAttributeId *local_attid_as_enum)
+{
+ struct dsdb_syntax_ctx syntax_ctx;
+ const struct dsdb_attribute *sa = NULL;
+ WERROR werr;
+
+ /* use default syntax conversion context */
+ dsdb_syntax_ctx_init(&syntax_ctx, ldb, schema);
+ syntax_ctx.pfm_remote = pfm_remote;
+
+ werr = dsdb_attribute_drsuapi_remote_to_local(&syntax_ctx,
+ in->attid,
+ local_attid_as_enum,
+ &sa);
+ if (!W_ERROR_IS_OK(werr)) {
+ return werr;
+ }
+
return sa->syntax->drsuapi_to_ldb(&syntax_ctx, sa, in, mem_ctx, out);
}