s4-rpc: dnsserver: dns_name_equal() returns boolean
[samba.git] / source4 / rpc_server / dnsserver / dcerpc_dnsserver.c
index c9de4406210a238ec1f23a0d89ab25fa1a38d463..5733a51177ae3a824272198880ce6abaa1285ba2 100644 (file)
@@ -1433,7 +1433,7 @@ static WERROR dnsserver_complex_operate_server(struct dnsserver_state *dsstate,
                *typeid_out = DNSSRV_TYPEID_DP_INFO;
 
                for (p = dsstate->partitions; p; p = p->next) {
-                       if (strcmp(p->pszDpFqdn, rin->String) == 0) {
+                       if (strcasecmp(p->pszDpFqdn, rin->String) == 0) {
                                dpinfo = talloc_zero(mem_ctx, struct DNS_RPC_DP_INFO);
                                W_ERROR_HAVE_NO_MEMORY(dpinfo);
 
@@ -1720,7 +1720,7 @@ static WERROR dnsserver_enumerate_records(struct dnsserver_state *dsstate,
        W_ERROR_HAVE_NO_MEMORY_AND_FREE(name, tmp_ctx);
 
        /* search all records under parent tree */
-       if (strcmp(name, z->name) == 0) {
+       if (strcasecmp(name, z->name) == 0) {
                ret = ldb_search(dsstate->samdb, tmp_ctx, &res, z->zone_dn,
                                LDB_SCOPE_ONELEVEL, attrs, "(objectClass=dnsNode)");
        } else {
@@ -1746,7 +1746,7 @@ static WERROR dnsserver_enumerate_records(struct dnsserver_state *dsstate,
                        (ldb_qsort_cmp_fn_t)dns_name_compare);
 
        /* Build a tree of name components from dns name */
-       if (strcmp(name, z->name) == 0) {
+       if (strcasecmp(name, z->name) == 0) {
                tree = dns_build_tree(tmp_ctx, "@", res);
        } else {
                tree = dns_build_tree(tmp_ctx, name, res);
@@ -1852,7 +1852,12 @@ static WERROR dnsserver_update_record(struct dnsserver_state *dsstate,
        tmp_ctx = talloc_new(mem_ctx);
        W_ERROR_HAVE_NO_MEMORY(tmp_ctx);
 
-       name = dns_split_node_name(tmp_ctx, node_name, z->name);
+       /* If node_name is @ or zone name, dns record is @ */
+       if (strcmp(node_name, "@") == 0 || strcasecmp(node_name, z->name) == 0) {
+               name = talloc_strdup(tmp_ctx, "@");
+       } else {
+               name = dns_split_node_name(tmp_ctx, node_name, z->name);
+       }
        W_ERROR_HAVE_NO_MEMORY_AND_FREE(name, tmp_ctx);
 
        if (add_buf != NULL) {
@@ -1914,6 +1919,11 @@ static WERROR dcesrv_DnssrvOperation(struct dcesrv_call_state *dce_call, TALLOC_
                                                r->in.dwTypeId,
                                                &r->in.pData);
        } else {
+               z = dnsserver_find_zone(dsstate->zones, r->in.pszZone);
+               if (z == NULL && request_filter == 0) {
+                       return WERR_DNS_ERROR_ZONE_DOES_NOT_EXIST;
+               }
+
                ret = dnsserver_operate_zone(dsstate, mem_ctx, z,
                                                request_filter,
                                                r->in.pszOperation,
@@ -2116,6 +2126,11 @@ static WERROR dcesrv_DnssrvOperation2(struct dcesrv_call_state *dce_call, TALLOC
                                                r->in.dwTypeId,
                                                &r->in.pData);
        } else {
+               z = dnsserver_find_zone(dsstate->zones, r->in.pszZone);
+               if (z == NULL && request_filter == 0) {
+                       return WERR_DNS_ERROR_ZONE_DOES_NOT_EXIST;
+               }
+
                ret = dnsserver_operate_zone(dsstate, mem_ctx, z,
                                                request_filter,
                                                r->in.pszOperation,