ref: 20cff04fd22649c4588bd9088e697a9e54a5c21a
parent: c2661f86fc9fc228581547067aa571ff57bc9332
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sun Oct 24 18:15:26 EDT 2021
ndb/dns: implement caa record type in ndb this allows the caa records to be specified in ndb as: caa=<value> tag=<tag> flags=<flags> where tag defaults to "issue" and flags to 0 when omited.
--- a/sys/man/2/ndb
+++ b/sys/man/2/ndb
@@ -411,6 +411,13 @@
.RI ( dom )
and name server
.RI ( ns ).
+.TP
+.B caa
+get the certificate authority records.
+Returns the
+.RI ( tag )
+and
+.RI ( flags ).
.PP
.I Ndbfindattr
searches
--- a/sys/src/cmd/ndb/dblookup.c
+++ b/sys/src/cmd/ndb/dblookup.c
@@ -41,6 +41,7 @@
static RR* soarr(Ndbtuple*, Ndbtuple*);
static RR* srvrr(Ndbtuple*, Ndbtuple*);
static RR* txtrr(Ndbtuple*, Ndbtuple*);
+static RR* caarr(Ndbtuple*, Ndbtuple*);
static int implemented[] =
{
@@ -54,6 +55,7 @@
[Tsoa] 1,
[Tsrv] 1,
[Ttxt] 1,
+ [Tcaa] 1,
};
/* straddle server configuration */
@@ -258,6 +260,10 @@
case Taxfr:
case Tixfr:
return doaxfr(db, name);
+ case Tcaa:
+ attr = "caa";
+ f = caarr;
+ break;
default:
// dnslog("dblookup1(%s) bad type", name);
return nil;
@@ -590,6 +596,23 @@
return rp;
}
+static RR*
+caarr(Ndbtuple *entry, Ndbtuple *pair)
+{
+ Ndbtuple *tag;
+ RR *rp;
+
+ rp = rralloc(Tcaa);
+ rp->caa->flags = intval(entry, pair, "flags", 0);
+ rp->caa->data = (uchar*)estrdup(pair->val);
+ rp->caa->dlen = strlen((char*)rp->caa->data);
+ if((tag = look(entry, pair, "tag")) != nil)
+ rp->caa->tag = dnlookup(tag->val, Cin, 1);
+ else
+ rp->caa->tag = dnlookup("issue", Cin, 1);
+ return rp;
+}
+
/*
* Look for a pair with the given attribute. look first on the same line,
* then in the whole entry.
@@ -655,6 +678,8 @@
rp = txtrr(entry, pair);
else if(strcmp(pair->attr, "txt") == 0)
rp = txtrr(entry, pair);
+ else if(strcmp(pair->attr, "caa") == 0)
+ rp = caarr(entry, pair);
if(rp == nil)
return;