summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Haslett <aaronhaslett@catalyst.net.nz>2018-07-03 15:33:06 +1200
committerAndrew Bartlett <abartlet@samba.org>2018-07-12 04:31:53 +0200
commitb22ce976862500fcfe56d60698ce9572b50feef9 (patch)
treedd6ca4fd05997f658ce76b0784f4e7b1363d3e64
parentb841da04e217646c8bf1eaa3985857ce4207965c (diff)
downloadsamba-b22ce976862500fcfe56d60698ce9572b50feef9.tar.gz
rpc dns: reading zone properties from LDB
Reading zone properties from LDB on server connection initialisation, instead of them being volatile fields. BUG: https://bugzilla.samba.org/show_bug.cgi?id=10812 Signed-off-by: Aaron Haslett <aaronhaslett@catalyst.net.nz> Reviewed-by: Gary Lockyer <gary@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abartlet@samba.org>
-rw-r--r--source4/rpc_server/dnsserver/dnsdb.c33
-rw-r--r--source4/rpc_server/dnsserver/dnsserver.h2
-rw-r--r--source4/rpc_server/dnsserver/dnsutils.c54
3 files changed, 84 insertions, 5 deletions
diff --git a/source4/rpc_server/dnsserver/dnsdb.c b/source4/rpc_server/dnsserver/dnsdb.c
index caf30798846..cdd6c0258b6 100644
--- a/source4/rpc_server/dnsserver/dnsdb.c
+++ b/source4/rpc_server/dnsserver/dnsdb.c
@@ -86,11 +86,11 @@ struct dnsserver_zone *dnsserver_db_enumerate_zones(TALLOC_CTX *mem_ctx,
struct dnsserver_partition *p)
{
TALLOC_CTX *tmp_ctx;
- const char *const attrs[] = {"name", NULL};
+ const char * const attrs[] = {"name", "dNSProperty", NULL};
struct ldb_dn *dn;
struct ldb_result *res;
struct dnsserver_zone *zones, *z;
- int i, ret;
+ int i, j, ret;
tmp_ctx = talloc_new(mem_ctx);
if (tmp_ctx == NULL) {
@@ -116,14 +116,18 @@ struct dnsserver_zone *dnsserver_db_enumerate_zones(TALLOC_CTX *mem_ctx,
zones = NULL;
for(i=0; i<res->count; i++) {
char *name;
+ struct ldb_message_element *element = NULL;
+ struct dnsp_DnsProperty *props = NULL;
+ enum ndr_err_code err;
z = talloc_zero(mem_ctx, struct dnsserver_zone);
if (z == NULL) {
goto failed;
}
z->partition = p;
- name = talloc_strdup(
- z, ldb_msg_find_attr_as_string(res->msgs[i], "name", NULL));
+ name = talloc_strdup(z,
+ ldb_msg_find_attr_as_string(res->msgs[i],
+ "name", NULL));
if (strcmp(name, "..TrustAnchors") == 0) {
talloc_free(z);
continue;
@@ -138,8 +142,27 @@ struct dnsserver_zone *dnsserver_db_enumerate_zones(TALLOC_CTX *mem_ctx,
DLIST_ADD_END(zones, z);
DEBUG(2, ("dnsserver: Found DNS zone %s\n", z->name));
- }
+ element = ldb_msg_find_element(res->msgs[i], "dNSProperty");
+ if(element != NULL){
+ props = talloc_zero_array(mem_ctx,
+ struct dnsp_DnsProperty,
+ element->num_values);
+ for (j = 0; j < element->num_values; j++ ) {
+ err = ndr_pull_struct_blob(
+ &(element->values[j]),
+ mem_ctx,
+ &props[j],
+ (ndr_pull_flags_fn_t)
+ ndr_pull_dnsp_DnsProperty);
+ if (!NDR_ERR_CODE_IS_SUCCESS(err)){
+ goto failed;
+ }
+ }
+ z->tmp_props = props;
+ z->num_props = element->num_values;
+ }
+ }
return zones;
failed:
diff --git a/source4/rpc_server/dnsserver/dnsserver.h b/source4/rpc_server/dnsserver/dnsserver.h
index a30d4ee1acc..83dccf5e6c5 100644
--- a/source4/rpc_server/dnsserver/dnsserver.h
+++ b/source4/rpc_server/dnsserver/dnsserver.h
@@ -164,6 +164,8 @@ struct dnsserver_zone {
const char *name;
struct ldb_dn *zone_dn;
struct dnsserver_zoneinfo *zoneinfo;
+ struct dnsp_DnsProperty *tmp_props;
+ int32_t num_props;
};
diff --git a/source4/rpc_server/dnsserver/dnsutils.c b/source4/rpc_server/dnsserver/dnsutils.c
index f0d7e283110..5eb95f8f339 100644
--- a/source4/rpc_server/dnsserver/dnsutils.c
+++ b/source4/rpc_server/dnsserver/dnsutils.c
@@ -214,6 +214,8 @@ struct dnsserver_zoneinfo *dnsserver_init_zoneinfo(struct dnsserver_zone *zone,
const char *revzone = "in-addr.arpa";
const char *revzone6 = "ip6.arpa";
int len1, len2;
+ union dnsPropertyData *prop = NULL;
+ int i=0;
zoneinfo = talloc_zero(zone, struct dnsserver_zoneinfo);
if (zoneinfo == NULL) {
@@ -280,6 +282,58 @@ struct dnsserver_zoneinfo *dnsserver_init_zoneinfo(struct dnsserver_zone *zone,
zoneinfo->dwLastXfrAttempt = 0;
zoneinfo->dwLastXfrResult = 0;
+ for(i=0; i<zone->num_props; i++){
+ prop=&(zone->tmp_props[i].data);
+ switch (zone->tmp_props[i].id) {
+ case DSPROPERTY_ZONE_TYPE:
+ zoneinfo->dwZoneType =
+ prop->zone_type;
+ break;
+ case DSPROPERTY_ZONE_ALLOW_UPDATE:
+ zoneinfo->fAllowUpdate =
+ prop->allow_update_flag;
+ break;
+ case DSPROPERTY_ZONE_NOREFRESH_INTERVAL:
+ zoneinfo->dwNoRefreshInterval =
+ prop->norefresh_hours;
+ break;
+ case DSPROPERTY_ZONE_REFRESH_INTERVAL:
+ zoneinfo->dwRefreshInterval =
+ prop->refresh_hours;
+ break;
+ case DSPROPERTY_ZONE_AGING_STATE:
+ zoneinfo->fAging =
+ prop->aging_enabled;
+ break;
+ case DSPROPERTY_ZONE_SCAVENGING_SERVERS:
+ zoneinfo->aipScavengeServers->AddrCount =
+ prop->servers.addrCount;
+ zoneinfo->aipScavengeServers->AddrArray =
+ prop->servers.addr;
+ break;
+ case DSPROPERTY_ZONE_AGING_ENABLED_TIME:
+ zoneinfo->dwAvailForScavengeTime =
+ prop->next_scavenging_cycle_hours;
+ break;
+ case DSPROPERTY_ZONE_MASTER_SERVERS:
+ zoneinfo->aipLocalMasters->AddrCount =
+ prop->master_servers.addrCount;
+ zoneinfo->aipLocalMasters->AddrArray =
+ prop->master_servers.addr;
+ break;
+ case DSPROPERTY_ZONE_EMPTY:
+ case DSPROPERTY_ZONE_SECURE_TIME:
+ case DSPROPERTY_ZONE_DELETED_FROM_HOSTNAME:
+ case DSPROPERTY_ZONE_AUTO_NS_SERVERS:
+ case DSPROPERTY_ZONE_DCPROMO_CONVERT:
+ case DSPROPERTY_ZONE_SCAVENGING_SERVERS_DA:
+ case DSPROPERTY_ZONE_MASTER_SERVERS_DA:
+ case DSPROPERTY_ZONE_NS_SERVERS_DA:
+ case DSPROPERTY_ZONE_NODE_DBFLAGS:
+ break;
+ }
+ }
+
return zoneinfo;
}