Refactor zone analyzer method visibility

This commit is contained in:
nemunaire 2020-10-06 16:45:41 +02:00
parent 37ed10f3bf
commit bf20e73bd6
14 changed files with 76 additions and 65 deletions

View File

@ -93,19 +93,7 @@ type viewServiceSpec struct {
Fields []service_field `json:"fields,omitempty"`
}
func getServiceSpec(_ *config.Options, p httprouter.Params, body io.Reader) Response {
ssid := string(p.ByName("ssid"))
svc, err := svcs.FindSubService(ssid)
if err != nil {
return APIErrorResponse{
err: err,
status: http.StatusNotFound,
}
}
svcType := reflect.Indirect(reflect.ValueOf(svc)).Type()
func getSpecs(svcType reflect.Type) viewServiceSpec {
fields := []service_field{}
for i := 0; i < svcType.NumField(); i += 1 {
jsonTag := svcType.Field(i).Tag.Get("json")
@ -153,7 +141,21 @@ func getServiceSpec(_ *config.Options, p httprouter.Params, body io.Reader) Resp
fields = append(fields, f)
}
return viewServiceSpec{fields}
}
func getServiceSpec(_ *config.Options, p httprouter.Params, body io.Reader) Response {
ssid := string(p.ByName("ssid"))
svc, err := svcs.FindSubService(ssid)
if err != nil {
return APIErrorResponse{
err: err,
status: http.StatusNotFound,
}
}
return APIResponse{
response: viewServiceSpec{fields},
response: getSpecs(reflect.Indirect(reflect.ValueOf(svc)).Type()),
}
}

View File

@ -45,10 +45,10 @@ import (
func init() {
router.POST("/api/source_settings/*ssid", apiAuthHandler(getSourceSettingsState))
//router.POST("/api/domains/:domain/zone/:zoneid/:subdomain/provider_settings/:psid", apiAuthHandler(getSourceSettingsState))
}
type SourceSettingsState struct {
happydns.Source
type FormState struct {
Id int64 `json:"_id,omitempty"`
Name string `json:"_comment"`
State int32 `json:"state"`
@ -56,10 +56,19 @@ type SourceSettingsState struct {
Redirect *string `json:"redirect,omitempty"`
}
type SourceSettingsState struct {
FormState
happydns.Source
}
type FormResponse struct {
From *forms.CustomForm `json:"form,omitempty"`
Redirect *string `json:"redirect,omitempty"`
}
type SourceSettingsResponse struct {
FormResponse
happydns.Source `json:"Source,omitempty"`
From *forms.CustomForm `json:"form,omitempty"`
Redirect *string `json:"redirect,omitempty"`
}
func getSourceSettingsState(cfg *config.Options, req *RequestResources, body io.Reader) Response {
@ -132,8 +141,8 @@ func getSourceSettingsState(cfg *config.Options, req *RequestResources, body io.
} else {
return APIResponse{
response: SourceSettingsResponse{
Source: s,
Redirect: uss.Redirect,
Source: s,
FormResponse: FormResponse{Redirect: uss.Redirect},
},
}
}
@ -154,8 +163,8 @@ func getSourceSettingsState(cfg *config.Options, req *RequestResources, body io.
} else {
return APIResponse{
response: SourceSettingsResponse{
Source: s,
Redirect: uss.Redirect,
Source: s,
FormResponse: FormResponse{Redirect: uss.Redirect},
},
}
}
@ -165,7 +174,7 @@ func getSourceSettingsState(cfg *config.Options, req *RequestResources, body io.
return APIResponse{
response: SourceSettingsResponse{
From: form,
FormResponse: FormResponse{From: form},
},
}
}

View File

@ -66,10 +66,10 @@ func (s *ACMEChallenge) GenRRs(domain string, ttl uint32, origin string) (rrs []
}
func acmechallenge_analyze(a *Analyzer) error {
for _, record := range a.searchRR(AnalyzerRecordFilter{Type: dns.TypeTXT, Prefix: "_acme-challenge"}) {
for _, record := range a.SearchRR(AnalyzerRecordFilter{Type: dns.TypeTXT, Prefix: "_acme-challenge"}) {
domain := strings.TrimPrefix(record.Header().Name, "_acme-challenge.")
if txt, ok := record.(*dns.TXT); ok {
a.useRR(record, domain, &ACMEChallenge{
a.UseRR(record, domain, &ACMEChallenge{
Challenge: strings.Join(txt.Txt, ""),
})
}

View File

@ -94,10 +94,10 @@ func (s *SpecialCNAME) GenRRs(domain string, ttl uint32, origin string) (rrs []d
func specialalias_analyze(a *Analyzer) error {
// Try handle specials domains using CNAME
for _, record := range a.searchRR(AnalyzerRecordFilter{Type: dns.TypeCNAME, Prefix: "_"}) {
for _, record := range a.SearchRR(AnalyzerRecordFilter{Type: dns.TypeCNAME, Prefix: "_"}) {
subdomains := SRV_DOMAIN.FindStringSubmatch(record.Header().Name)
if cname, ok := record.(*dns.CNAME); len(subdomains) == 4 && ok {
a.useRR(record, subdomains[3], &SpecialCNAME{
a.UseRR(record, subdomains[3], &SpecialCNAME{
SubDomain: fmt.Sprintf("_%s._%s", subdomains[1], subdomains[2]),
Target: cname.Target,
})
@ -107,13 +107,13 @@ func specialalias_analyze(a *Analyzer) error {
}
func alias_analyze(a *Analyzer) error {
for _, record := range a.searchRR(AnalyzerRecordFilter{Type: dns.TypeCNAME}) {
for _, record := range a.SearchRR(AnalyzerRecordFilter{Type: dns.TypeCNAME}) {
if cname, ok := record.(*dns.CNAME); ok {
newrr := &CNAME{
Target: strings.TrimSuffix(cname.Target, "."+a.origin),
}
a.useRR(record, cname.Header().Name, newrr)
a.UseRR(record, cname.Header().Name, newrr)
}
}
return nil

View File

@ -61,7 +61,7 @@ type AnalyzerRecordFilter struct {
Ttl uint32
}
func (a *Analyzer) searchRR(arrs ...AnalyzerRecordFilter) (rrs []dns.RR) {
func (a *Analyzer) SearchRR(arrs ...AnalyzerRecordFilter) (rrs []dns.RR) {
for _, record := range a.zone {
for _, arr := range arrs {
if strings.HasPrefix(record.Header().Name, arr.Prefix) &&
@ -79,7 +79,7 @@ func (a *Analyzer) searchRR(arrs ...AnalyzerRecordFilter) (rrs []dns.RR) {
return
}
func (a *Analyzer) useRR(rr dns.RR, domain string, svc happydns.Service) error {
func (a *Analyzer) UseRR(rr dns.RR, domain string, svc happydns.Service) error {
found := false
for k, record := range a.zone {
if record == rr {

View File

@ -97,7 +97,7 @@ func (s *Delegation) GenRRs(domain string, ttl uint32, origin string) (rrs []dns
func delegation_analyze(a *Analyzer) error {
delegations := map[string]*Delegation{}
for _, record := range a.searchRR(AnalyzerRecordFilter{Type: dns.TypeNS}) {
for _, record := range a.SearchRR(AnalyzerRecordFilter{Type: dns.TypeNS}) {
if ns, ok := record.(*dns.NS); ok {
if _, ok := delegations[ns.Header().Name]; !ok {
delegations[ns.Header().Name] = &Delegation{}
@ -105,7 +105,7 @@ func delegation_analyze(a *Analyzer) error {
delegations[ns.Header().Name].NameServers = append(delegations[ns.Header().Name].NameServers, ns.Ns)
a.useRR(
a.UseRR(
record,
ns.Header().Name,
delegations[ns.Header().Name],
@ -114,7 +114,7 @@ func delegation_analyze(a *Analyzer) error {
}
for subdomain := range delegations {
for _, record := range a.searchRR(AnalyzerRecordFilter{Type: dns.TypeDS, Domain: subdomain}) {
for _, record := range a.SearchRR(AnalyzerRecordFilter{Type: dns.TypeDS, Domain: subdomain}) {
if ds, ok := record.(*dns.DS); ok {
delegations[subdomain].DS = append(delegations[subdomain].DS, DS{
KeyTag: ds.KeyTag,
@ -123,7 +123,7 @@ func delegation_analyze(a *Analyzer) error {
Digest: ds.Digest,
})
a.useRR(
a.UseRR(
record,
subdomain,
delegations[subdomain],

View File

@ -255,7 +255,7 @@ func email_analyze(a *Analyzer) (err error) {
services := map[string]*EMail{}
// Handle only MX records
for _, record := range a.searchRR(AnalyzerRecordFilter{Type: dns.TypeMX}) {
for _, record := range a.SearchRR(AnalyzerRecordFilter{Type: dns.TypeMX}) {
if mx, ok := record.(*dns.MX); ok {
dn := mx.Header().Name
@ -271,7 +271,7 @@ func email_analyze(a *Analyzer) (err error) {
},
)
err = a.useRR(
err = a.UseRR(
record,
dn,
services[dn],
@ -284,7 +284,7 @@ func email_analyze(a *Analyzer) (err error) {
for domain, service := range services {
// Is there SPF record?
for _, record := range a.searchRR(AnalyzerRecordFilter{Type: dns.TypeTXT, Domain: domain, Contains: "v=spf1"}) {
for _, record := range a.SearchRR(AnalyzerRecordFilter{Type: dns.TypeTXT, Domain: domain, Contains: "v=spf1"}) {
if service.SPF == nil {
service.SPF = &SPF{}
}
@ -304,7 +304,7 @@ func email_analyze(a *Analyzer) (err error) {
service.SPF.Content = strings.Join(fields, " ")
}
err = a.useRR(record, domain, service)
err = a.UseRR(record, domain, service)
if err != nil {
return
}
@ -312,7 +312,7 @@ func email_analyze(a *Analyzer) (err error) {
service.DKIM = map[string]*DKIM{}
// Is there DKIM record?
for _, record := range a.searchRR(AnalyzerRecordFilter{Type: dns.TypeTXT, SubdomainsOf: "_domainkey." + domain}) {
for _, record := range a.SearchRR(AnalyzerRecordFilter{Type: dns.TypeTXT, SubdomainsOf: "_domainkey." + domain}) {
selector := strings.TrimSuffix(record.Header().Name, "._domainkey."+domain)
if _, ok := service.DKIM[selector]; !ok {
@ -323,14 +323,14 @@ func email_analyze(a *Analyzer) (err error) {
service.DKIM[selector].Fields = append(service.DKIM[selector].Fields, strings.Split(strings.Join(txt.Txt, ""), ";")...)
}
err = a.useRR(record, domain, service)
err = a.UseRR(record, domain, service)
if err != nil {
return
}
}
// Is there DMARC record?
for _, record := range a.searchRR(AnalyzerRecordFilter{Type: dns.TypeTXT, Domain: "_dmarc." + domain}) {
for _, record := range a.SearchRR(AnalyzerRecordFilter{Type: dns.TypeTXT, Domain: "_dmarc." + domain}) {
if service.DMARC == nil {
service.DMARC = &DMARC{}
}
@ -339,14 +339,14 @@ func email_analyze(a *Analyzer) (err error) {
service.DMARC.Fields = append(service.DMARC.Fields, strings.Split(strings.Join(txt.Txt, ""), ";")...)
}
err = a.useRR(record, domain, service)
err = a.UseRR(record, domain, service)
if err != nil {
return
}
}
// Is there MTA-STS record?
for _, record := range a.searchRR(AnalyzerRecordFilter{Type: dns.TypeTXT, Domain: "_mta-sts." + domain}) {
for _, record := range a.SearchRR(AnalyzerRecordFilter{Type: dns.TypeTXT, Domain: "_mta-sts." + domain}) {
if service.MTA_STS == nil {
service.MTA_STS = &MTA_STS{}
}
@ -355,14 +355,14 @@ func email_analyze(a *Analyzer) (err error) {
service.MTA_STS.Fields = append(service.MTA_STS.Fields, strings.Split(strings.Join(txt.Txt, ""), ";")...)
}
err = a.useRR(record, domain, service)
err = a.UseRR(record, domain, service)
if err != nil {
return
}
}
// Is there MTA-STS record?
for _, record := range a.searchRR(AnalyzerRecordFilter{Type: dns.TypeTXT, Domain: "_smtp._tls." + domain}) {
for _, record := range a.SearchRR(AnalyzerRecordFilter{Type: dns.TypeTXT, Domain: "_smtp._tls." + domain}) {
if service.TLS_RPT == nil {
service.TLS_RPT = &TLS_RPT{}
}
@ -371,7 +371,7 @@ func email_analyze(a *Analyzer) (err error) {
service.TLS_RPT.Fields = append(service.TLS_RPT.Fields, strings.Split(strings.Join(txt.Txt, ""), ";")...)
}
err = a.useRR(record, domain, service)
err = a.UseRR(record, domain, service)
if err != nil {
return
}

View File

@ -99,7 +99,7 @@ func (s *MatrixIM) GenRRs(domain string, ttl uint32, origin string) (rrs []dns.R
func matrix_analyze(a *Analyzer) error {
matrixDomains := map[string]*MatrixIM{}
for _, record := range a.searchRR(AnalyzerRecordFilter{Prefix: "_matrix._tcp.", Type: dns.TypeSRV}) {
for _, record := range a.SearchRR(AnalyzerRecordFilter{Prefix: "_matrix._tcp.", Type: dns.TypeSRV}) {
if srv := parseSRV(record); srv != nil {
domain := strings.TrimPrefix(record.Header().Name, "_matrix._tcp.")
@ -109,7 +109,7 @@ func matrix_analyze(a *Analyzer) error {
matrixDomains[domain].Matrix = append(matrixDomains[domain].Matrix, srv)
a.useRR(
a.UseRR(
record,
domain,
matrixDomains[domain],

View File

@ -117,7 +117,7 @@ func (s *SMimeCert) GenRRs(domain string, ttl uint32, origin string) (rrs []dns.
}
func openpgpkey_analyze(a *Analyzer) (err error) {
for _, record := range a.searchRR(AnalyzerRecordFilter{Type: dns.TypeOPENPGPKEY, Contains: "._openpgpkey."}) {
for _, record := range a.SearchRR(AnalyzerRecordFilter{Type: dns.TypeOPENPGPKEY, Contains: "._openpgpkey."}) {
if openpgpkey, ok := record.(*dns.OPENPGPKEY); ok {
domain := record.Header().Name
domain = domain[strings.Index(domain, "._openpgpkey")+13:]
@ -130,7 +130,7 @@ func openpgpkey_analyze(a *Analyzer) (err error) {
return
}
err = a.useRR(
err = a.UseRR(
record,
domain,
&OpenPGP{
@ -147,7 +147,7 @@ func openpgpkey_analyze(a *Analyzer) (err error) {
}
func smimea_analyze(a *Analyzer) (err error) {
for _, record := range a.searchRR(AnalyzerRecordFilter{Type: dns.TypeSMIMEA, Contains: "._smimecert."}) {
for _, record := range a.SearchRR(AnalyzerRecordFilter{Type: dns.TypeSMIMEA, Contains: "._smimecert."}) {
if smimecert, ok := record.(*dns.SMIMEA); ok {
domain := record.Header().Name
domain = domain[strings.Index(domain, "._smimecert")+12:]
@ -160,7 +160,7 @@ func smimea_analyze(a *Analyzer) (err error) {
return
}
err = a.useRR(
err = a.UseRR(
record,
domain,
&SMimeCert{

View File

@ -97,7 +97,7 @@ func (s *Origin) GenRRs(domain string, ttl uint32, origin string) (rrs []dns.RR)
}
func origin_analyze(a *Analyzer) error {
for _, record := range a.searchRR(AnalyzerRecordFilter{Type: dns.TypeSOA}) {
for _, record := range a.SearchRR(AnalyzerRecordFilter{Type: dns.TypeSOA}) {
if soa, ok := record.(*dns.SOA); ok {
origin := &Origin{
Ns: soa.Ns,
@ -109,16 +109,16 @@ func origin_analyze(a *Analyzer) error {
Negttl: time.Duration(soa.Minttl) * time.Second,
}
a.useRR(
a.UseRR(
record,
soa.Header().Name,
origin,
)
for _, record := range a.searchRR(AnalyzerRecordFilter{Type: dns.TypeNS, Domain: soa.Header().Name}) {
for _, record := range a.SearchRR(AnalyzerRecordFilter{Type: dns.TypeNS, Domain: soa.Header().Name}) {
if ns, ok := record.(*dns.NS); ok {
origin.NameServers = append(origin.NameServers, ns.Ns)
a.useRR(
a.UseRR(
record,
ns.Header().Name,
origin,

View File

@ -122,7 +122,7 @@ func (s *Server) GenRRs(domain string, ttl uint32, origin string) (rrs []dns.RR)
func server_analyze(a *Analyzer) error {
pool := map[string][]dns.RR{}
for _, record := range a.searchRR(AnalyzerRecordFilter{Type: dns.TypeA}, AnalyzerRecordFilter{Type: dns.TypeAAAA}, AnalyzerRecordFilter{Type: dns.TypeSSHFP}) {
for _, record := range a.SearchRR(AnalyzerRecordFilter{Type: dns.TypeA}, AnalyzerRecordFilter{Type: dns.TypeAAAA}, AnalyzerRecordFilter{Type: dns.TypeSSHFP}) {
domain := record.Header().Name
pool[domain] = append(pool[domain], record)
@ -156,7 +156,7 @@ next_pool:
}
for _, rr := range rrs {
a.useRR(rr, dn, s)
a.UseRR(rr, dn, s)
}
}

View File

@ -114,7 +114,7 @@ func (s *UnknownSRV) GenRRs(domain string, ttl uint32, origin string) (rrs []dns
func srv_analyze(a *Analyzer) error {
srvDomains := map[string]map[string]*UnknownSRV{}
for _, record := range a.searchRR(AnalyzerRecordFilter{Type: dns.TypeSRV}) {
for _, record := range a.SearchRR(AnalyzerRecordFilter{Type: dns.TypeSRV}) {
subdomains := SRV_DOMAIN.FindStringSubmatch(record.Header().Name)
if srv := parseSRV(record); len(subdomains) == 4 && srv != nil {
svc := subdomains[1] + "." + subdomains[2]
@ -133,7 +133,7 @@ func srv_analyze(a *Analyzer) error {
srvDomains[domain][svc].SRV = append(srvDomains[domain][svc].SRV, srv)
a.useRR(
a.UseRR(
record,
subdomains[3],
srvDomains[domain][svc],

View File

@ -124,7 +124,7 @@ var (
func tlsa_analyze(a *Analyzer) (err error) {
pool := map[string]*TLSAs{}
for _, record := range a.searchRR(AnalyzerRecordFilter{Type: dns.TypeTLSA}) {
for _, record := range a.SearchRR(AnalyzerRecordFilter{Type: dns.TypeTLSA}) {
subdomains := TLSA_DOMAIN.FindStringSubmatch(record.Header().Name)
if tlsa, ok := record.(*dns.TLSA); len(subdomains) == 4 && ok {
var port uint64
@ -152,7 +152,7 @@ func tlsa_analyze(a *Analyzer) (err error) {
},
)
err = a.useRR(
err = a.UseRR(
record,
subdomains[3],
pool[subdomains[3]],

View File

@ -113,7 +113,7 @@ func (s *XMPP) GenRRs(domain string, ttl uint32, origin string) (rrs []dns.RR) {
}
func xmpp_subanalyze(a *Analyzer, prefix string, xmppDomains map[string]*XMPP, field string) error {
for _, record := range a.searchRR(AnalyzerRecordFilter{Prefix: prefix, Type: dns.TypeSRV}) {
for _, record := range a.SearchRR(AnalyzerRecordFilter{Prefix: prefix, Type: dns.TypeSRV}) {
if srv := parseSRV(record); srv != nil {
domain := strings.TrimPrefix(record.Header().Name, prefix)
@ -124,7 +124,7 @@ func xmpp_subanalyze(a *Analyzer, prefix string, xmppDomains map[string]*XMPP, f
v := reflect.Indirect(reflect.ValueOf(xmppDomains[domain]))
v.FieldByName(field).Set(reflect.Append(v.FieldByName(field), reflect.ValueOf(srv)))
a.useRR(
a.UseRR(
record,
domain,
xmppDomains[domain],