rpc dns: reading zone properties from LDB
authorAaron Haslett <aaronhaslett@catalyst.net.nz>
Tue, 3 Jul 2018 03:33:06 +0000 (15:33 +1200)
committerAndrew Bartlett <abartlet@samba.org>
Thu, 12 Jul 2018 02:31:53 +0000 (04:31 +0200)
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>
source4/rpc_server/dnsserver/dnsdb.c
source4/rpc_server/dnsserver/dnsserver.h
source4/rpc_server/dnsserver/dnsutils.c

index caf30798846efeba7c1e86a8dad7202f8c6b2e94..cdd6c0258b659e7ee5ab5e802e84fb7ea156721d 100644 (file)
@@ -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:
index a30d4ee1acc5d224debc6d49eb6e0ad0eb934d49..83dccf5e6c55089fd2bc400b8ec69fb355d0412b 100644 (file)
@@ -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;
 };
 
 
index f0d7e283110c500bace4e3064bbf23437b5d2984..5eb95f8f339c1e7ecc0499358409c6b48ab574a8 100644 (file)
@@ -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;
 }