/* Increment serial number and update timestamp */
static unsigned int dnsserver_update_soa(TALLOC_CTX *mem_ctx,
struct ldb_context *samdb,
- struct dnsserver_zone *z)
+ struct dnsserver_zone *z,
+ WERROR *werr)
{
const char * const attrs[] = { "dnsRecord", NULL };
struct ldb_result *res;
enum ndr_err_code ndr_err;
int ret, i, serial = -1;
+ *werr = WERR_INTERNAL_DB_ERROR;
+
ret = ldb_search(samdb, mem_ctx, &res, z->zone_dn, LDB_SCOPE_ONELEVEL, attrs,
"(&(objectClass=dnsNode)(name=@))");
if (ret != LDB_SUCCESS || res->count == 0) {
ndr_err = ndr_push_struct_blob(&el->values[i], mem_ctx, &rec,
(ndr_push_flags_fn_t)ndr_push_dnsp_DnssrvRpcRecord);
if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+ *werr = WERR_NOT_ENOUGH_MEMORY;
return -1;
}
break;
el->flags = LDB_FLAG_MOD_REPLACE;
ret = ldb_modify(samdb, res->msgs[0]);
if (ret != LDB_SUCCESS) {
+ if (ret == LDB_ERR_INSUFFICIENT_ACCESS_RIGHTS) {
+ *werr = WERR_ACCESS_DENIED;
+ }
return -1;
}
}
+ *werr = WERR_OK;
+
return serial;
}
rec->rank |= DNS_RANK_ROOT_HINT;
}
- serial = dnsserver_update_soa(mem_ctx, samdb, z);
+ serial = dnsserver_update_soa(mem_ctx, samdb, z, &werr);
if (serial < 0) {
- return WERR_INTERNAL_DB_ERROR;
+ return werr;
}
rec->dwSerial = serial;
/* If updating SOA record, use specified serial, otherwise increment */
if (arec->wType != DNS_TYPE_SOA) {
- serial = dnsserver_update_soa(mem_ctx, samdb, z);
+ serial = dnsserver_update_soa(mem_ctx, samdb, z, &werr);
if (serial < 0) {
- return WERR_INTERNAL_DB_ERROR;
+ return werr;
}
arec->dwSerial = serial;
}
int serial;
WERROR werr;
- serial = dnsserver_update_soa(mem_ctx, samdb, z);
+ serial = dnsserver_update_soa(mem_ctx, samdb, z, &werr);
if (serial < 0) {
- return WERR_INTERNAL_DB_ERROR;
+ return werr;
}
werr = dns_to_dnsp_convert(mem_ctx, del_record, &rec, false);
if (ret != LDB_SUCCESS) {
DEBUG(0, ("dnsserver: Failed to create zone (%s): %s\n",
z->name, ldb_errstring(samdb)));
+
+ if (ret == LDB_ERR_INSUFFICIENT_ACCESS_RIGHTS) {
+ return WERR_ACCESS_DENIED;
+ }
+
return WERR_INTERNAL_DB_ERROR;
}
ret = dsdb_delete(samdb, zone->zone_dn, DSDB_TREE_DELETE);
if (ret != LDB_SUCCESS) {
ldb_transaction_cancel(samdb);
+
+ if (ret == LDB_ERR_INSUFFICIENT_ACCESS_RIGHTS) {
+ return WERR_ACCESS_DENIED;
+ }
return WERR_INTERNAL_DB_ERROR;
}