From bf20e73bd624b1d5bd192afce6e1b61138e636da Mon Sep 17 00:00:00 2001 From: Pierre-Olivier Mercier Date: Tue, 6 Oct 2020 16:45:41 +0200 Subject: [PATCH] Refactor zone analyzer method visibility --- api/service_specs.go | 30 +++++++++++++------------ api/{source_settings.go => settings.go} | 27 ++++++++++++++-------- services/acme.go | 4 ++-- services/alias.go | 8 +++---- services/analyzer.go | 4 ++-- services/delegation.go | 8 +++---- services/email.go | 24 ++++++++++---------- services/matrix.go | 4 ++-- services/openpgp.go | 8 +++---- services/origin.go | 8 +++---- services/server.go | 4 ++-- services/srv.go | 4 ++-- services/tlsa.go | 4 ++-- services/xmpp.go | 4 ++-- 14 files changed, 76 insertions(+), 65 deletions(-) rename api/{source_settings.go => settings.go} (90%) diff --git a/api/service_specs.go b/api/service_specs.go index 451799b..115ae6d 100644 --- a/api/service_specs.go +++ b/api/service_specs.go @@ -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()), } } diff --git a/api/source_settings.go b/api/settings.go similarity index 90% rename from api/source_settings.go rename to api/settings.go index 185a551..0aa0e3b 100644 --- a/api/source_settings.go +++ b/api/settings.go @@ -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}, }, } } diff --git a/services/acme.go b/services/acme.go index 66da2be..dbe6443 100644 --- a/services/acme.go +++ b/services/acme.go @@ -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, ""), }) } diff --git a/services/alias.go b/services/alias.go index 3e30bfc..5dd707a 100644 --- a/services/alias.go +++ b/services/alias.go @@ -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 diff --git a/services/analyzer.go b/services/analyzer.go index 84e4bef..688d506 100644 --- a/services/analyzer.go +++ b/services/analyzer.go @@ -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 { diff --git a/services/delegation.go b/services/delegation.go index 9657497..e75e111 100644 --- a/services/delegation.go +++ b/services/delegation.go @@ -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], diff --git a/services/email.go b/services/email.go index e3a9481..e1efc55 100644 --- a/services/email.go +++ b/services/email.go @@ -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 } diff --git a/services/matrix.go b/services/matrix.go index c89f8f1..4bb596e 100644 --- a/services/matrix.go +++ b/services/matrix.go @@ -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], diff --git a/services/openpgp.go b/services/openpgp.go index abb3ef3..1c0c746 100644 --- a/services/openpgp.go +++ b/services/openpgp.go @@ -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{ diff --git a/services/origin.go b/services/origin.go index 1b71461..135f0b6 100644 --- a/services/origin.go +++ b/services/origin.go @@ -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, diff --git a/services/server.go b/services/server.go index f878c16..20607a5 100644 --- a/services/server.go +++ b/services/server.go @@ -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) } } diff --git a/services/srv.go b/services/srv.go index 6063c3e..05e4f03 100644 --- a/services/srv.go +++ b/services/srv.go @@ -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], diff --git a/services/tlsa.go b/services/tlsa.go index 1d53b20..78f3b03 100644 --- a/services/tlsa.go +++ b/services/tlsa.go @@ -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]], diff --git a/services/xmpp.go b/services/xmpp.go index 8cb6727..8a903a5 100644 --- a/services/xmpp.go +++ b/services/xmpp.go @@ -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],