The branch, master has been updated
       via  26a0e7a s4 dns: Test deleting records and fix a small bu
       via  1e6ef24 s4 dns: Be less chatty during tests
       via  a4bc7dc s4 dns: Clean up tests a bit
       via  98ae359 s4 dns: Support TXT updates, add tests
       via  e6c6f49 s4 dns: Support TXT queries
       via  f9f1d98 s3 selftest: Allow DNS updates during testing
      from  ce4531e tdb_wrap: Move to specific directory.

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 26a0e7a3f5ba7f8d6af2d2b8d7a6acf1323e8c57
Author: Kai Blin <k...@samba.org>
Date:   Sun Mar 11 00:25:57 2012 +0100

    s4 dns: Test deleting records and fix a small bu
    
    Autobuild-User: Kai Blin <k...@samba.org>
    Autobuild-Date: Sun Mar 11 02:27:45 CET 2012 on sn-devel-104

commit 1e6ef242ec65e4f8e9c8ffa44a09581b28c2599a
Author: Kai Blin <k...@samba.org>
Date:   Sun Mar 11 00:25:05 2012 +0100

    s4 dns: Be less chatty during tests

commit a4bc7dc281237c88682de796691cb458e4802e02
Author: Kai Blin <k...@samba.org>
Date:   Sat Mar 10 23:49:18 2012 +0100

    s4 dns: Clean up tests a bit

commit 98ae3592ad058619b4953c08a0cb91e6fb44e573
Author: Kai Blin <k...@samba.org>
Date:   Sat Mar 10 23:48:44 2012 +0100

    s4 dns: Support TXT updates, add tests

commit e6c6f4959558d89f811c3da281b10e3525660179
Author: Kai Blin <k...@samba.org>
Date:   Sat Mar 10 23:47:29 2012 +0100

    s4 dns: Support TXT queries

commit f9f1d98e747e9126b9d301052f639bbc25db7a88
Author: Kai Blin <k...@samba.org>
Date:   Sat Mar 10 23:43:44 2012 +0100

    s3 selftest: Allow DNS updates during testing

-----------------------------------------------------------------------

Summary of changes:
 selftest/target/Samba4.pm                   |    4 +-
 source4/dns_server/dns_query.c              |   11 +++
 source4/dns_server/dns_update.c             |   51 +++++++++---
 source4/scripting/python/samba/tests/dns.py |  123 ++++++++++++++++++++++++++-
 4 files changed, 174 insertions(+), 15 deletions(-)


Changeset truncated at 500 lines:

diff --git a/selftest/target/Samba4.pm b/selftest/target/Samba4.pm
index 698cd12..d9385c8 100644
--- a/selftest/target/Samba4.pm
+++ b/selftest/target/Samba4.pm
@@ -1090,6 +1090,8 @@ sub provision_dc($$)
        my ($self, $prefix) = @_;
 
        print "PROVISIONING DC...";
+        my $extra_conf_options = "netbios aliases = localDC1-a
+allow dns updates = True";
        my $ret = $self->provision($prefix,
                                   "domain controller",
                                   "localdc",
@@ -1097,7 +1099,7 @@ sub provision_dc($$)
                                   "samba.example.com",
                                   "2008",
                                   "locDCpass1",
-                                  undef, "netbios aliases = localDC1-a");
+                                  undef, $extra_conf_options);
 
        return undef unless(defined $ret);
        unless($self->add_wins_config("$prefix/private")) {
diff --git a/source4/dns_server/dns_query.c b/source4/dns_server/dns_query.c
index 42aa11f..4277659 100644
--- a/source4/dns_server/dns_query.c
+++ b/source4/dns_server/dns_query.c
@@ -35,6 +35,8 @@ static WERROR create_response_rr(const struct 
dns_name_question *question,
 {
        struct dns_res_rec *ans = *answers;
        uint16_t ai = *ancount;
+       char *tmp;
+       uint32_t i;
 
        ZERO_STRUCT(ans[ai]);
 
@@ -69,7 +71,16 @@ static WERROR create_response_rr(const struct 
dns_name_question *question,
        case DNS_QTYPE_PTR:
                ans[ai].rdata.ptr_record = talloc_strdup(ans, rec->data.ptr);
                break;
+       case DNS_QTYPE_TXT:
+               tmp = talloc_asprintf(ans, "\"%s\"", rec->data.txt.str[0]);
+               for (i=1; i<rec->data.txt.count; i++) {
+                       tmp = talloc_asprintf_append(tmp, " \"%s\"",
+                                                    rec->data.txt.str[i]);
+               }
+               ans[ai].rdata.txt_record.txt = tmp;
+               break;
        default:
+               DEBUG(0, ("Got unhandled type %u query.\n", rec->wType));
                return DNS_ERR(NOT_IMPLEMENTED);
        }
 
diff --git a/source4/dns_server/dns_update.c b/source4/dns_server/dns_update.c
index 62cf9e5..3d7ecce 100644
--- a/source4/dns_server/dns_update.c
+++ b/source4/dns_server/dns_update.c
@@ -285,6 +285,10 @@ static WERROR dns_rr_to_dnsp(TALLOC_CTX *mem_ctx,
                             const struct dns_res_rec *rrec,
                             struct dnsp_DnssrvRpcRecord *r)
 {
+       char *tmp;
+       char *txt_record_txt;
+       char *saveptr = NULL;
+
        if (rrec->rr_type == DNS_QTYPE_ALL) {
                return DNS_ERR(FORMAT_ERROR);
        }
@@ -334,15 +338,30 @@ static WERROR dns_rr_to_dnsp(TALLOC_CTX *mem_ctx,
                W_ERROR_HAVE_NO_MEMORY(r->data.mx.nameTarget);
                break;
        case DNS_QTYPE_TXT:
-               /* FIXME: This converts the TXT rr data into a single string.
-                *        Since dns server does not reply to qtype TXT,
-                *        this is not yet relevant.
-                */
-               r->data.txt.count = 1;
-               r->data.txt.str = talloc_array(mem_ctx, const char *, 1);
+               r->data.txt.count = 0;
+               r->data.txt.str = talloc_array(mem_ctx, const char *,
+                                              r->data.txt.count);
                W_ERROR_HAVE_NO_MEMORY(r->data.txt.str);
-               r->data.txt.str[0] = talloc_strdup(mem_ctx, 
rrec->rdata.txt_record.txt);
-               W_ERROR_HAVE_NO_MEMORY(r->data.txt.str[0]);
+
+               txt_record_txt = talloc_strdup(r->data.txt.str,
+                                              rrec->rdata.txt_record.txt);
+               W_ERROR_HAVE_NO_MEMORY(txt_record_txt);
+
+               tmp = strtok_r(txt_record_txt, "\"", &saveptr);
+               while (tmp) {
+                       if (strcmp(tmp, " ") == 0) {
+                               tmp = strtok_r(NULL, "\"", &saveptr);
+                               continue;
+                       }
+                       r->data.txt.str = talloc_realloc(mem_ctx, 
r->data.txt.str, const char *,
+                                                       r->data.txt.count+1);
+                       r->data.txt.str[r->data.txt.count] = 
talloc_strdup(r->data.txt.str, tmp);
+                       
W_ERROR_HAVE_NO_MEMORY(r->data.txt.str[r->data.txt.count]);
+
+                       r->data.txt.count++;
+                       tmp = strtok_r(NULL, "\"", &saveptr);
+               }
+
                break;
        default:
                DEBUG(0, ("Got a qytpe of %d\n", rrec->rr_type));
@@ -367,8 +386,10 @@ static WERROR handle_one_update(struct dns_server *dns,
        WERROR werror;
        bool needs_add = false;
 
-       DEBUG(1, ("Looking at record: \n"));
-       NDR_PRINT_DEBUG(dns_res_rec, discard_const(update));
+       DEBUG(2, ("Looking at record: \n"));
+       if (DEBUGLVL(2)) {
+               NDR_PRINT_DEBUG(dns_res_rec, discard_const(update));
+       }
 
        switch (update->rr_type) {
        case DNS_QTYPE_A:
@@ -390,6 +411,8 @@ static WERROR handle_one_update(struct dns_server *dns,
        case DNS_QTYPE_TXT:
                break;
        default:
+               DEBUG(0, ("Can't handle updates of type %u yet\n",
+                         update->rr_type));
                return DNS_ERR(NOT_IMPLEMENTED);
        }
 
@@ -605,6 +628,10 @@ static WERROR handle_one_update(struct dns_server *dns,
                                ZERO_STRUCT(recs[i]);
                        }
                }
+
+               werror = dns_replace_records(dns, mem_ctx, dn,
+                                            needs_add, recs, rcount);
+               W_ERROR_NOT_OK_RETURN(werror);
        }
 
        return WERR_OK;
@@ -679,7 +706,7 @@ WERROR dns_server_process_update(struct dns_server *dns,
                return DNS_ERR(FORMAT_ERROR);
        }
 
-       DEBUG(0, ("Got a dns update request.\n"));
+       DEBUG(2, ("Got a dns update request.\n"));
 
        for (z = dns->zones; z != NULL; z = z->next) {
                bool match;
@@ -711,7 +738,7 @@ WERROR dns_server_process_update(struct dns_server *dns,
         * key-based GSSAPI, key-based bind-style TSIG and "never" as
         * smb.conf options. */
        if (lpcfg_allow_dns_updates(dns->task->lp_ctx) != DNS_UPDATE_ON) {
-               DEBUG(0, ("Update not allowed."));
+               DEBUG(0, ("Update not allowed.\n"));
                return DNS_ERR(REFUSED);
        }
 
diff --git a/source4/scripting/python/samba/tests/dns.py 
b/source4/scripting/python/samba/tests/dns.py
index 26f8089..ff973bd 100644
--- a/source4/scripting/python/samba/tests/dns.py
+++ b/source4/scripting/python/samba/tests/dns.py
@@ -18,7 +18,6 @@
 #
 
 import os
-import sys
 import struct
 import random
 from samba import socket
@@ -324,7 +323,7 @@ class DNSTest(TestCase):
 #        self.assert_dns_rcode_equals(response, dns.DNS_RCODE_FORMERR)
 
     def test_update_prereq_nonexisting_name(self):
-        "test update with a non-null TTL"
+        "test update with a nonexisting name"
         p = self.make_name_packet(dns.DNS_OPCODE_UPDATE)
         updates = []
 
@@ -349,6 +348,126 @@ class DNSTest(TestCase):
         response = self.dns_transaction_udp(p)
         self.assert_dns_rcode_equals(response, dns.DNS_RCODE_NXRRSET)
 
+    def test_update_add_txt_record(self):
+        "test adding records works"
+        p = self.make_name_packet(dns.DNS_OPCODE_UPDATE)
+        updates = []
+
+        name = self.get_dns_domain()
+
+        u = self.make_name_question(name, dns.DNS_QTYPE_SOA, dns.DNS_QCLASS_IN)
+        updates.append(u)
+        self.finish_name_packet(p, updates)
+
+        updates = []
+        r = dns.res_rec()
+        r.name = "textrec.%s" % self.get_dns_domain()
+        r.rr_type = dns.DNS_QTYPE_TXT
+        r.rr_class = dns.DNS_QCLASS_IN
+        r.ttl = 900
+        r.length = 0xffff
+        r.rdata = dns.txt_record()
+        r.rdata.txt = '"This is a test"'
+        updates.append(r)
+        p.nscount = len(updates)
+        p.nsrecs = updates
+
+        response = self.dns_transaction_udp(p)
+        self.assert_dns_rcode_equals(response, dns.DNS_RCODE_OK)
+
+        p = self.make_name_packet(dns.DNS_OPCODE_QUERY)
+        questions = []
+
+        name = "textrec.%s" % self.get_dns_domain()
+        q = self.make_name_question(name, dns.DNS_QTYPE_TXT, dns.DNS_QCLASS_IN)
+        questions.append(q)
+
+        self.finish_name_packet(p, questions)
+        response = self.dns_transaction_udp(p)
+        self.assert_dns_rcode_equals(response, dns.DNS_RCODE_OK)
+        self.assertEquals(response.ancount, 1)
+        self.assertEquals(response.answers[0].rdata.txt, '"This is a test"')
+
+    def test_update_add_two_txt_records(self):
+        "test adding two txt records works"
+        p = self.make_name_packet(dns.DNS_OPCODE_UPDATE)
+        updates = []
+
+        name = self.get_dns_domain()
+
+        u = self.make_name_question(name, dns.DNS_QTYPE_SOA, dns.DNS_QCLASS_IN)
+        updates.append(u)
+        self.finish_name_packet(p, updates)
+
+        updates = []
+        r = dns.res_rec()
+        r.name = "textrec2.%s" % self.get_dns_domain()
+        r.rr_type = dns.DNS_QTYPE_TXT
+        r.rr_class = dns.DNS_QCLASS_IN
+        r.ttl = 900
+        r.length = 0xffff
+        r.rdata = dns.txt_record()
+        r.rdata.txt = '"This is a test" "and this is a test, too"'
+        updates.append(r)
+        p.nscount = len(updates)
+        p.nsrecs = updates
+
+        response = self.dns_transaction_udp(p)
+        self.assert_dns_rcode_equals(response, dns.DNS_RCODE_OK)
+
+        p = self.make_name_packet(dns.DNS_OPCODE_QUERY)
+        questions = []
+
+        name = "textrec2.%s" % self.get_dns_domain()
+        q = self.make_name_question(name, dns.DNS_QTYPE_TXT, dns.DNS_QCLASS_IN)
+        questions.append(q)
+
+        self.finish_name_packet(p, questions)
+        response = self.dns_transaction_udp(p)
+        self.assert_dns_rcode_equals(response, dns.DNS_RCODE_OK)
+        self.assertEquals(response.ancount, 1)
+        self.assertEquals(response.answers[0].rdata.txt, '"This is a test" 
"and this is a test, too"')
+
+
+    def test_delete_record(self):
+        "Test if deleting records works"
+        p = self.make_name_packet(dns.DNS_OPCODE_UPDATE)
+        updates = []
+
+        name = self.get_dns_domain()
+
+        u = self.make_name_question(name, dns.DNS_QTYPE_SOA, dns.DNS_QCLASS_IN)
+        updates.append(u)
+        self.finish_name_packet(p, updates)
+
+        updates = []
+        r = dns.res_rec()
+        r.name = "textrec.%s" % self.get_dns_domain()
+        r.rr_type = dns.DNS_QTYPE_TXT
+        r.rr_class = dns.DNS_QCLASS_NONE
+        r.ttl = 0
+        r.length = 0xffff
+        r.rdata = dns.txt_record()
+        r.rdata.txt = '"This is a test"'
+        updates.append(r)
+        p.nscount = len(updates)
+        p.nsrecs = updates
+
+        response = self.dns_transaction_udp(p)
+        self.assert_dns_rcode_equals(response, dns.DNS_RCODE_OK)
+
+        p = self.make_name_packet(dns.DNS_OPCODE_QUERY)
+        questions = []
+
+        name = "textrec.%s" % self.get_dns_domain()
+        q = self.make_name_question(name, dns.DNS_QTYPE_TXT, dns.DNS_QCLASS_IN)
+        questions.append(q)
+
+        self.finish_name_packet(p, questions)
+        response = self.dns_transaction_udp(p)
+        self.assert_dns_rcode_equals(response, dns.DNS_RCODE_NXDOMAIN)
+
+
 if __name__ == "__main__":
     import unittest
     unittest.main()


-- 
Samba Shared Repository

Reply via email to