maatma: Can specify a dedicated IPv6 for NS association

This commit is contained in:
nemunaire 2021-02-04 09:37:24 +01:00
commit dea2436c88
3 changed files with 120 additions and 16 deletions

View file

@ -26,7 +26,22 @@ func init() {
return student.GetAssociatedDomains(), nil
}))
router.POST("/api/adomains/", apiAuthHandler(func(student adlin.Student, ps httprouter.Params, body []byte) (interface{}, error) {
return true, AddAssociatedDomains(student)
ue := &struct {
Domain string `json:"domain"`
A string `json:"a"`
AAAA string `json:"aaaa"`
}{}
if err := json.Unmarshal(body, &ue); err != nil {
return nil, err
}
var aaaa net.IP
if ue != nil && len(ue.AAAA) > 0 {
aaaa = net.ParseIP(ue.AAAA)
}
return true, AddAssociatedDomains(student, aaaa)
}))
router.GET("/api/adomains/:dn", apiAuthHandler(func(student adlin.Student, ps httprouter.Params, body []byte) (interface{}, error) {
return GetAssociatedDomain(student, ps.ByName("dn"))
@ -186,20 +201,30 @@ func GetAssociatedDomain(student adlin.Student, dn string) (rrs []Entry, err err
return
}
func AddAssociatedDomains(student adlin.Student) (err error) {
func delAssociatedDomains(student adlin.Student, dn string) (err error) {
var adomains []Entry
adomains, err = GetAssociatedDomain(student, dn)
if err != nil {
return
}
m1 := new(dns.Msg)
m1.Id = dns.Id()
m1.Opcode = dns.OpcodeUpdate
m1.Question = make([]dns.Question, 1)
m1.Question[0] = dns.Question{adlin.AssociatedDomainSuffix, dns.TypeSOA, dns.ClassINET}
rrAd := new(dns.A)
rrAd.Hdr = dns.RR_Header{Name: student.MyAssociatedDomain(), Rrtype: dns.TypeA, Class: dns.ClassINET, Ttl: 0}
m1.Remove([]dns.RR{rrAd})
var rrs []dns.RR
for _, domain := range adomains {
rr, errr := dns.NewRR(fmt.Sprintf("%s %s %s", domain.Domain, domain.RR, strings.Join(domain.Values, " ")))
if errr != nil {
return errr
}
rrAAAAd := new(dns.AAAA)
rrAAAAd.Hdr = dns.RR_Header{Name: student.MyAssociatedDomain(), Rrtype: dns.TypeAAAA, Class: dns.ClassINET, Ttl: 0}
m1.Remove([]dns.RR{rrAAAAd})
rrs = append(rrs, rr)
}
m1.Remove(rrs)
c := new(dns.Client)
c.TsigSecret = tsigSecret
@ -210,6 +235,21 @@ func AddAssociatedDomains(student adlin.Student) (err error) {
return
}
return
}
func AddAssociatedDomains(student adlin.Student, aaaa net.IP) (err error) {
err = delAssociatedDomains(student, student.MyAssociatedDomain())
if err != nil {
return
}
if aaaa == nil {
aaaa = net.ParseIP(adlin.StudentIP(student.Id).String() + "1")
} else if !strings.HasPrefix(aaaa.String(), adlin.StudentIP(student.Id).String()) {
return errors.New("The associated IP has to be in your IP range.")
}
m2 := new(dns.Msg)
m2.Id = dns.Id()
m2.Opcode = dns.OpcodeUpdate
@ -223,11 +263,10 @@ func AddAssociatedDomains(student adlin.Student) (err error) {
rrAAAA := new(dns.AAAA)
rrAAAA.Hdr = dns.RR_Header{Name: student.MyAssociatedDomain(), Rrtype: dns.TypeAAAA, Class: dns.ClassINET, Ttl: 3600}
rrAAAA.AAAA = adlin.StudentIP(student.Id)
rrAAAA.AAAA[15] = 1
rrAAAA.AAAA = aaaa
m2.Insert([]dns.RR{rrAAAA})
c = new(dns.Client)
c := new(dns.Client)
c.TsigSecret = tsigSecret
m2.SetTsig("rndc-key.", dns.HmacSHA256, 300, time.Now().Unix())