diff options
author | Aaron Haslett <aaronhaslett@catalyst.net.nz> | 2018-07-03 15:33:06 +1200 |
---|---|---|
committer | Andrew Bartlett <abartlet@samba.org> | 2018-07-12 04:31:53 +0200 |
commit | b22ce976862500fcfe56d60698ce9572b50feef9 (patch) | |
tree | dd6ca4fd05997f658ce76b0784f4e7b1363d3e64 | |
parent | b841da04e217646c8bf1eaa3985857ce4207965c (diff) | |
download | samba-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.c | 33 | ||||
-rw-r--r-- | source4/rpc_server/dnsserver/dnsserver.h | 2 | ||||
-rw-r--r-- | source4/rpc_server/dnsserver/dnsutils.c | 54 |
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; } |