Reintegrate RRtype filtering by provider, using dnscontrol features

This commit is contained in:
nemunaire 2021-07-05 22:24:36 +02:00
parent da540c9778
commit 26933d5917
2 changed files with 57 additions and 10 deletions

View File

@ -37,6 +37,7 @@ import (
"reflect"
"github.com/StackExchange/dnscontrol/v3/providers"
"github.com/miekg/dns"
"git.happydns.org/happydns/model"
)
@ -96,9 +97,30 @@ func FindProvider(name string) (happydns.Provider, error) {
// GetProviderCapabilities lists available capabilities for the given Provider.
func GetProviderCapabilities(prvd happydns.Provider) (caps []string) {
// Features
if providers.ProviderHasCapability(prvd.DNSControlName(), providers.CanGetZones) {
caps = append(caps, "ListDomains")
}
// Compatible RR
for _, v := range []uint16{dns.TypeA, dns.TypeAAAA, dns.TypeCNAME, dns.TypeNS, dns.TypeTXT} {
caps = append(caps, fmt.Sprintf("rr-%d-%s", v, dns.TypeToString[v]))
}
if providers.ProviderHasCapability(prvd.DNSControlName(), providers.CanUseOPENPGPKEY) {
caps = append(caps, fmt.Sprintf("rr-%d-%s", dns.TypeOPENPGPKEY, dns.TypeToString[dns.TypeOPENPGPKEY]))
}
if providers.ProviderHasCapability(prvd.DNSControlName(), providers.CanUseSOA) {
caps = append(caps, fmt.Sprintf("rr-%d-%s", dns.TypeSOA, dns.TypeToString[dns.TypeSOA]))
}
if providers.ProviderHasCapability(prvd.DNSControlName(), providers.CanUseSRV) {
caps = append(caps, fmt.Sprintf("rr-%d-%s", dns.TypeSRV, dns.TypeToString[dns.TypeSRV]))
}
if providers.ProviderHasCapability(prvd.DNSControlName(), providers.CanUseSSHFP) {
caps = append(caps, fmt.Sprintf("rr-%d-%s", dns.TypeSSHFP, dns.TypeToString[dns.TypeSSHFP]))
}
if providers.ProviderHasCapability(prvd.DNSControlName(), providers.CanUseTLSA) {
caps = append(caps, fmt.Sprintf("rr-%d-%s", dns.TypeTLSA, dns.TypeToString[dns.TypeTLSA]))
}
return
}

View File

@ -91,7 +91,7 @@
</template>
<script>
import ProvidersApi from '@/api/providers'
import { mapGetters } from 'vuex'
export default {
name: 'HFamilyTabs',
@ -149,21 +149,46 @@ export default {
},
filteredNewServices () {
return this.analyzeRestrictions(this.services)
return this.analyzeRestrictions(this.services, this.availableResourceTypes)
},
...mapGetters('providers', ['providers_getAll']),
...mapGetters('providerSpecs', ['providerSpecs_getAll'])
},
watch: {
providers_getAll: function (t) {
this.loadProviderSpecs(t)
},
providerSpecs_getAll: function (t) {
this.loadProviderSpecs(t)
}
},
created () {
ProvidersApi.getAvailableResourceTypes(this.domain.id_provider)
.then(
(response) => {
this.availableResourceTypes = response.data
}
)
if (this.providerSpecs_getAll !== null && this.providers_getAll !== null) {
this.loadProviderSpecs(this.providerSpecs_getAll)
}
},
methods: {
analyzeRestrictions (allServices) {
loadProviderSpecs (specs) {
if (this.providerSpecs_getAll === null || this.providers_getAll === null) {
return
}
const availableResourceTypes = []
specs[this.providers_getAll[this.domain.id_provider]._srctype].capabilities.forEach(function (i) {
if (i.startsWith('rr-')) {
availableResourceTypes.push(parseInt(i.substr(3, i.indexOf('-', 4) - 3)))
}
})
this.availableResourceTypes = availableResourceTypes
},
analyzeRestrictions (allServices, availableResourceTypes) {
const ret = {}
for (const type in allServices) {
@ -173,7 +198,7 @@ export default {
// Handle NeedTypes restriction: hosting provider need to support given types.
if (svc.restrictions.needTypes) {
for (const k in svc.restrictions.needTypes) {
if (this.availableResourceTypes.indexOf(svc.restrictions.needTypes[k]) < 0) {
if (availableResourceTypes.indexOf(svc.restrictions.needTypes[k]) < 0) {
ret[type] = 'is not available on this domain name hosting provider.'
continue
}