func deleteDomains(database *mgo.Database) { mux := handy.NewHandy() h := new(handler.DomainHandler) mux.Handle("/domain/{fqdn}", func() handy.Handler { return h }) for i := 0; i < 100; i++ { r, err := http.NewRequest("DELETE", fmt.Sprintf("/domain/example%d.com.br.", i), nil) if err != nil { utils.Fatalln("Error creating the HTTP request", err) } utils.BuildHTTPHeader(r, nil) w := httptest.NewRecorder() mux.ServeHTTP(w, r) responseContent, err := ioutil.ReadAll(w.Body) if err != nil { utils.Fatalln("Error reading response body", err) } if w.Code != http.StatusNoContent { utils.Fatalln("Error removing domain", errors.New(string(responseContent))) } } }
func retrieveUnknownScan(database *mgo.Database, startedAt time.Time) { mux := handy.NewHandy() h := new(handler.ScanHandler) mux.Handle("/scan/{started-at}", func() handy.Handler { return h }) r, err := http.NewRequest("GET", fmt.Sprintf("/scan/%s", startedAt.Add(-1*time.Millisecond).Format(time.RFC3339Nano)), nil) if err != nil { utils.Fatalln("Error creating the HTTP request", err) } utils.BuildHTTPHeader(r, nil) w := httptest.NewRecorder() mux.ServeHTTP(w, r) responseContent, err := ioutil.ReadAll(w.Body) if err != nil { utils.Fatalln("Error reading response body", err) } if w.Code != http.StatusNotFound { utils.Fatalln("Error retrieving unknown scan", errors.New(string(responseContent))) } }
func retrieveScansIfNoneMatch(database *mgo.Database) { mux := handy.NewHandy() h := new(handler.ScansHandler) mux.Handle("/scans", func() handy.Handler { return h }) r, err := http.NewRequest("GET", "/scans", nil) if err != nil { utils.Fatalln("Error creating the HTTP request", err) } utils.BuildHTTPHeader(r, nil) w := httptest.NewRecorder() mux.ServeHTTP(w, r) scansCacheTest(database, r, "If-None-Match", []ScansCacheTestData{ { HeaderValue: w.Header().Get("ETag"), ExpectedHTTPStatus: http.StatusNotModified, }, { HeaderValue: w.Header().Get("ETag") + "x", ExpectedHTTPStatus: http.StatusOK, }, }) }
func retrieveUnknownDomain(database *mgo.Database) { mux := handy.NewHandy() h := new(handler.DomainHandler) mux.Handle("/domain/{fqdn}", func() handy.Handler { return h }) r, err := http.NewRequest("GET", "/domain/example.com.br.", nil) if err != nil { utils.Fatalln("Error creating the HTTP request", err) } utils.BuildHTTPHeader(r, nil) w := httptest.NewRecorder() mux.ServeHTTP(w, r) responseContent, err := ioutil.ReadAll(w.Body) if err != nil { utils.Fatalln("Error reading response body", err) } if w.Code != http.StatusNotFound { utils.Fatalln("Error retrieving unknown domain", errors.New(string(responseContent))) } }
func domainCacheTest(database *mgo.Database, r *http.Request, requestContent, header string, domainCacheTestData []DomainCacheTestData) { mux := handy.NewHandy() h := new(handler.DomainHandler) mux.Handle("/domain/{fqdn}", func() handy.Handler { return h }) for _, item := range domainCacheTestData { r.Header.Set(header, item.HeaderValue) if len(requestContent) > 0 { utils.BuildHTTPHeader(r, []byte(requestContent)) } else { utils.BuildHTTPHeader(r, nil) } w := httptest.NewRecorder() mux.ServeHTTP(w, r) responseContent, err := ioutil.ReadAll(w.Body) if err != nil { utils.Fatalln("Error reading response body", err) } if w.Code != item.ExpectedHTTPStatus { utils.Fatalln(fmt.Sprintf("Error in %s test using %s [%s] "+ "HTTP header. Expected HTTP status code %d and got %d", r.Method, header, item.HeaderValue, item.ExpectedHTTPStatus, w.Code), errors.New(string(responseContent))) } } }
func retrieveScan(database *mgo.Database, startedAt time.Time) { mux := handy.NewHandy() h := new(handler.ScanHandler) mux.Handle("/scan/{started-at}", func() handy.Handler { return h }) r, err := http.NewRequest("GET", fmt.Sprintf("/scan/%s", startedAt.Format(time.RFC3339Nano)), nil) if err != nil { utils.Fatalln("Error creating the HTTP request", err) } utils.BuildHTTPHeader(r, nil) w := httptest.NewRecorder() mux.ServeHTTP(w, r) responseContent, err := ioutil.ReadAll(w.Body) if err != nil { utils.Fatalln("Error reading response body", err) } if w.Code != http.StatusOK { utils.Fatalln("Error retrieving scan", errors.New(string(responseContent))) } if w.Header().Get("ETag") != "1" { utils.Fatalln("Not setting ETag in scan retrieve response", nil) } if len(w.Header().Get("Last-Modified")) == 0 { utils.Fatalln("Not setting Last-Modified in scan retrieve response", nil) } if h.Response.Status != "EXECUTED" { utils.Fatalln("Scan's status was not persisted correctly", nil) } if h.Response.DomainsScanned != 5000000 { utils.Fatalln("Scan's domains scanned information is wrong", nil) } if h.Response.DomainsWithDNSSECScanned != 250000 { utils.Fatalln("Scan's domains with DNSSEC scanned information is wrong", nil) } if h.Response.NameserverStatistics["OK"] != 4800000 || h.Response.NameserverStatistics["TIMEOUT"] != 200000 { utils.Fatalln("Scan's nameserver statistics are wrong", nil) } if h.Response.DSStatistics["OK"] != 220000 || h.Response.DSStatistics["EXPSIG"] != 30000 { utils.Fatalln("Scan's nameserver statistics are wrong", nil) } }
func retrieveDomain(database *mgo.Database) { mux := handy.NewHandy() h := new(handler.DomainHandler) mux.Handle("/domain/{fqdn}", func() handy.Handler { return h }) r, err := http.NewRequest("GET", "/domain/example.com.br.", nil) if err != nil { utils.Fatalln("Error creating the HTTP request", err) } utils.BuildHTTPHeader(r, nil) w := httptest.NewRecorder() mux.ServeHTTP(w, r) responseContent, err := ioutil.ReadAll(w.Body) if err != nil { utils.Fatalln("Error reading response body", err) } if w.Code != http.StatusOK { utils.Fatalln("Error retrieving domain", errors.New(string(responseContent))) } if w.Header().Get("ETag") != "2" { utils.Fatalln("Not setting ETag in domain retrieve response", nil) } if len(w.Header().Get("Last-Modified")) == 0 { utils.Fatalln("Not setting Last-Modified in domain retrieve response", nil) } if h.Response.FQDN != "example.com.br." { utils.Fatalln("Domain's FQDN was not persisted correctly", nil) } if len(h.Response.Nameservers) != 2 || h.Response.Nameservers[0].Host != "ns1.example.com.br." || h.Response.Nameservers[0].IPv4 != "127.0.0.1" || h.Response.Nameservers[1].Host != "ns3.example.com.br." || h.Response.Nameservers[1].IPv6 != "::1" { utils.Fatalln("Domain's nameservers were not persisted correctly", nil) } if len(h.Response.Owners) != 1 || h.Response.Owners[0].Email != "*****@*****.**" { utils.Fatalln("Domain's owners were not persisted correctly", nil) } }
func updateDomain(database *mgo.Database) { mux := handy.NewHandy() h := new(handler.DomainHandler) mux.Handle("/domain/{fqdn}", func() handy.Handler { return h }) requestContent := `{ "Nameservers": [ { "host": "ns1.example.com.br.", "ipv4": "127.0.0.1" }, { "host": "ns3.example.com.br.", "ipv6": "::1" } ], "Owners": [ { "email": "*****@*****.**", "language": "pt-br" } ] }` r, err := http.NewRequest("PUT", "/domain/example.com.br.", strings.NewReader(requestContent)) if err != nil { utils.Fatalln("Error creating the HTTP request", err) } utils.BuildHTTPHeader(r, []byte(requestContent)) w := httptest.NewRecorder() mux.ServeHTTP(w, r) responseContent, err := ioutil.ReadAll(w.Body) if err != nil { utils.Fatalln("Error reading response body", err) } if w.Code != http.StatusNoContent { utils.Fatalln(fmt.Sprintf("Error updating domain. "+ "Expecting %d and got %d", http.StatusNoContent, w.Code), errors.New(string(responseContent))) } if w.Header().Get("ETag") != "2" { utils.Fatalln("Not setting ETag in domain update response", nil) } if len(w.Header().Get("Last-Modified")) == 0 { utils.Fatalln("Not setting Last-Modified in domain update response", nil) } if len(w.Header().Get("Location")) > 0 { utils.Fatalln("Setting Location in domain update response", nil) } }
func retrieveScanMetadata(database *mgo.Database, startedAt time.Time) { mux := handy.NewHandy() h := new(handler.ScanHandler) mux.Handle("/scan/{started-at}", func() handy.Handler { return h }) r, err := http.NewRequest("GET", fmt.Sprintf("/scan/%s", startedAt.Format(time.RFC3339Nano)), nil) if err != nil { utils.Fatalln("Error creating the HTTP request", err) } utils.BuildHTTPHeader(r, nil) w := httptest.NewRecorder() mux.ServeHTTP(w, r) response1 := *h.Response responseContent, err := ioutil.ReadAll(w.Body) if err != nil { utils.Fatalln("Error reading response body", err) } if w.Code != http.StatusOK { utils.Fatalln("Error retrieving scan", errors.New(string(responseContent))) } r, err = http.NewRequest("HEAD", fmt.Sprintf("/scan/%s", startedAt.Format(time.RFC3339Nano)), nil) if err != nil { utils.Fatalln("Error creating the HTTP request", err) } utils.BuildHTTPHeader(r, nil) mux.ServeHTTP(w, r) response2 := *h.Response responseContent, err = ioutil.ReadAll(w.Body) if err != nil { utils.Fatalln("Error reading response body", err) } if w.Code != http.StatusOK { utils.Fatalln("Error retrieving scan", errors.New(string(responseContent))) } if !utils.CompareProtocolScan(response1, response2) { utils.Fatalln("At this point the GET and HEAD method should "+ "return the same body content", nil) } }
func retrieveScansMetadata(database *mgo.Database) { mux := handy.NewHandy() h := new(handler.ScansHandler) mux.Handle("/scans", func() handy.Handler { return h }) r, err := http.NewRequest("GET", "/scans/?orderby=startedat:desc&pagesize=10&page=1", nil) if err != nil { utils.Fatalln("Error creating the HTTP request", err) } utils.BuildHTTPHeader(r, nil) w := httptest.NewRecorder() mux.ServeHTTP(w, r) response1 := *h.Response responseContent, err := ioutil.ReadAll(w.Body) if err != nil { utils.Fatalln("Error reading response body", err) } if w.Code != http.StatusOK { utils.Fatalln("Error retrieving scans", errors.New(string(responseContent))) } r, err = http.NewRequest("HEAD", "/scans/?orderby=startedat:desc&pagesize=10&page=1", nil) if err != nil { utils.Fatalln("Error creating the HTTP request", err) } utils.BuildHTTPHeader(r, nil) mux.ServeHTTP(w, r) response2 := *h.Response responseContent, err = ioutil.ReadAll(w.Body) if err != nil { utils.Fatalln("Error reading response body", err) } if w.Code != http.StatusOK { utils.Fatalln("Error retrieving scans", errors.New(string(responseContent))) } if !utils.CompareProtocolScans(response1, response2) { utils.Fatalln("At this point the GET and HEAD method should "+ "return the same body content", nil) } }
func retrieveDomainMetadata(database *mgo.Database) { mux := handy.NewHandy() h := new(handler.DomainHandler) mux.Handle("/domain/{fqdn}", func() handy.Handler { return h }) r, err := http.NewRequest("GET", "/domain/example.com.br.", nil) if err != nil { utils.Fatalln("Error creating the HTTP request", err) } utils.BuildHTTPHeader(r, nil) w := httptest.NewRecorder() mux.ServeHTTP(w, r) response1 := *h.Response responseContent, err := ioutil.ReadAll(w.Body) if err != nil { utils.Fatalln("Error reading response body from GET", err) } if w.Code != http.StatusOK { utils.Fatalln("Error retrieving domain", errors.New(string(responseContent))) } r, err = http.NewRequest("HEAD", "/domain/example.com.br.", nil) if err != nil { utils.Fatalln("Error creating the HTTP request", err) } utils.BuildHTTPHeader(r, nil) mux.ServeHTTP(w, r) response2 := *h.Response responseContent, err = ioutil.ReadAll(w.Body) if err != nil { utils.Fatalln("Error reading response body from HEAD", err) } if w.Code != http.StatusOK { utils.Fatalln("Error retrieving domain", errors.New(string(responseContent))) } if !utils.CompareProtocolDomain(response1, response2) { utils.Fatalln("At this point the GET and HEAD method should "+ "return the same body content", nil) } }
func retrieveCurrentScan(database *mgo.Database) { mux := handy.NewHandy() h := new(handler.ScansHandler) mux.Handle("/scans", func() handy.Handler { return h }) r, err := http.NewRequest("GET", "/scans?current", nil) if err != nil { utils.Fatalln("Error creating the HTTP request", err) } utils.BuildHTTPHeader(r, nil) w := httptest.NewRecorder() mux.ServeHTTP(w, r) responseContent, err := ioutil.ReadAll(w.Body) if err != nil { utils.Fatalln("Error reading response body", err) } if w.Code != http.StatusOK { utils.Fatalln("Error retrieving scan", errors.New(string(responseContent))) } if len(w.Header().Get("Last-Modified")) == 0 { utils.Fatalln("Current scan should return the Last-Modified header", nil) } if len(h.Response.Scans) != 1 { utils.Fatalln("Current scan not returned when it should", nil) } if h.Response.Scans[0].Status != "RUNNING" || h.Response.Scans[0].DomainsToBeScanned != 5 || h.Response.Scans[0].DomainsScanned != 4 || h.Response.Scans[0].DomainsWithDNSSECScanned != 1 { utils.Fatalln("Not retrieving current scan information correctly", nil) } }
func Start(listeners []net.Listener) error { // Initialize language configuration file if err := loadMessages(); err != nil { return err } // Initialize CIDR whitelist if err := loadACL(); err != nil { return err } // Handy logger should use the same logger of the Shelter system handy.Logger = log.Logger mux := handy.NewHandy() mux.Recover = func(r interface{}) { const size = 64 << 10 buf := make([]byte, size) buf = buf[:runtime.Stack(buf, false)] log.Printf("REST panic detected. Details: %v\n%s", r, buf) } for pattern, handler := range handler.Routes { mux.Handle(pattern, handler) } server := http.Server{ Handler: mux, ReadTimeout: time.Duration(config.ShelterConfig.RESTServer.Timeouts.ReadSeconds) * time.Second, WriteTimeout: time.Duration(config.ShelterConfig.RESTServer.Timeouts.WriteSeconds) * time.Second, } for _, v := range listeners { // We are not checking the error returned by Serve, because if we check for some // reason the HTTP server stop answering the requests go server.Serve(v) } return nil }
func createDomains(database *mgo.Database) { mux := handy.NewHandy() h := new(handler.DomainHandler) mux.Handle("/domain/{fqdn}", func() handy.Handler { return h }) for i := 0; i < 100; i++ { requestContent := `{ "Nameservers": [ { "host": "ns1.example.com.br." }, { "host": "ns2.example.com.br." } ], "Owners": [ { "email": "*****@*****.**", "language": "pt-br" } ] }` r, err := http.NewRequest("PUT", fmt.Sprintf("/domain/example%d.com.br.", i), strings.NewReader(requestContent)) if err != nil { utils.Fatalln("Error creating the HTTP request", err) } utils.BuildHTTPHeader(r, []byte(requestContent)) w := httptest.NewRecorder() mux.ServeHTTP(w, r) responseContent, err := ioutil.ReadAll(w.Body) if err != nil { utils.Fatalln("Error reading response body", err) } if w.Code != http.StatusCreated { utils.Fatalln("Error creating domain", errors.New(string(responseContent))) } } }
func invalidFQDN(database *mgo.Database) { mux := handy.NewHandy() h := new(handler.DomainHandler) mux.Handle("/domain/{fqdn}", func() handy.Handler { return h }) r, err := http.NewRequest("GET", "/domain/!!!", nil) if err != nil { utils.Fatalln("Error creating the HTTP request", err) } utils.BuildHTTPHeader(r, nil) w := httptest.NewRecorder() mux.ServeHTTP(w, r) if w.Code != http.StatusBadRequest { utils.Fatalln(fmt.Sprintf("Not verifying if FQDN exists in the URI. "+ "Expected status %d and got %d", http.StatusBadRequest, w.Code), nil) } }
func Start(listeners []net.Listener) error { // Initialize CIDR whitelist if err := loadACL(); err != nil { return err } // Static handler must be called directly because it uses configuration file values to // configure the root path. For that reason we can't build it in the init function handler.StartStaticHandler() // Handy logger should use the same logger of the Shelter system handy.Logger = log.Logger mux := handy.NewHandy() mux.Recover = func(r interface{}) { const size = 64 << 10 buf := make([]byte, size) buf = buf[:runtime.Stack(buf, false)] log.Printf("Web client panic detected. Details: %v\n%s", r, buf) } for pattern, handler := range handler.Routes { mux.Handle(pattern, handler) } server := http.Server{ Handler: mux, } for _, v := range listeners { // We are not checking the error returned by Serve, because if we check for some // reason the HTTP server stop answering the requests go server.Serve(v) } return nil }
func scanPersistedDomain(domainDAO dao.DomainDAO) { dns.HandleFunc("example.com.br.", func(w dns.ResponseWriter, dnsRequestMessage *dns.Msg) { defer w.Close() dnsResponseMessage := &dns.Msg{ MsgHdr: dns.MsgHdr{ Authoritative: true, }, Question: dnsRequestMessage.Question, Answer: []dns.RR{ &dns.SOA{ Hdr: dns.RR_Header{ Name: "example.com.br.", Rrtype: dns.TypeSOA, Class: dns.ClassINET, Ttl: 86400, }, Ns: "ns1.example.com.br.", Mbox: "rafael.justo.net.br.", Serial: 2013112600, Refresh: 86400, Retry: 86400, Expire: 86400, Minttl: 900, }, }, } dnsResponseMessage.SetReply(dnsRequestMessage) w.WriteMsg(dnsResponseMessage) }) mux := handy.NewHandy() h := new(handler.DomainVerificationHandler) mux.Handle("/domain/{fqdn}/verification", func() handy.Handler { return h }) requestContent := `{ "Nameservers": [ { "Host": "ns1.example.com.br.", "ipv4": "127.0.0.1" }, { "Host": "ns2.example.com.br.", "ipv4": "127.0.0.1" } ] }` domain := model.Domain{ FQDN: "example.com.br.", Nameservers: []model.Nameserver{ { Host: "ns1.example.com.br.", IPv4: net.ParseIP("127.0.0.1"), }, { Host: "ns2.example.com.br.", IPv4: net.ParseIP("127.0.0.1"), }, }, } if err := domainDAO.Save(&domain); err != nil { utils.Fatalln("Error saving domain", err) } r, err := http.NewRequest("PUT", "/domain/example.com.br./verification", strings.NewReader(requestContent)) if err != nil { utils.Fatalln("Error creating the HTTP request", err) } utils.BuildHTTPHeader(r, []byte(requestContent)) w := httptest.NewRecorder() mux.ServeHTTP(w, r) responseContent, err := ioutil.ReadAll(w.Body) if err != nil { utils.Fatalln("Error reading response body", err) } if w.Code != http.StatusOK { utils.Fatalln(fmt.Sprintf("Error scanning domain. "+ "Expected %d and got %d", http.StatusOK, w.Code), errors.New(string(responseContent))) } domain, err = domainDAO.FindByFQDN(domain.FQDN) if err != nil { utils.Fatalln("Error retrieving the domain", err) } if len(domain.Nameservers) != 2 || domain.Nameservers[0].LastStatus != model.NameserverStatusOK || domain.Nameservers[1].LastStatus != model.NameserverStatusOK { utils.Fatalln("Not updating domain on a scan", nil) } // Now we are going to test when the database domain is different from the scanned domain if err := domainDAO.RemoveByFQDN(domain.FQDN); err != nil { utils.Fatalln("Error removing domain", err) } domain = model.Domain{ FQDN: "example.com.br.", Nameservers: []model.Nameserver{ { Host: "ns1.example.com.br.", IPv4: net.ParseIP("127.0.0.1"), }, { Host: "ns3.example.com.br.", IPv4: net.ParseIP("127.0.0.1"), }, }, } if err := domainDAO.Save(&domain); err != nil { utils.Fatalln("Error saving domain", err) } mux.ServeHTTP(w, r) responseContent, err = ioutil.ReadAll(w.Body) if err != nil { utils.Fatalln("Error reading response body", err) } if w.Code != http.StatusOK { utils.Fatalln(fmt.Sprintf("Error scanning domain. "+ "Expected %d and got %d", http.StatusOK, w.Code), errors.New(string(responseContent))) } domain, err = domainDAO.FindByFQDN(domain.FQDN) if err != nil { utils.Fatalln("Error retrieving the domain", err) } if len(domain.Nameservers) != 2 || domain.Nameservers[0].LastStatus != model.NameserverStatusNotChecked || domain.Nameservers[1].LastStatus != model.NameserverStatusNotChecked { utils.Fatalln("Updating domain on a scan when it shouldn't", nil) } }
func scanDomain() { dns.HandleFunc("example.com.br.", func(w dns.ResponseWriter, dnsRequestMessage *dns.Msg) { defer w.Close() dnsResponseMessage := &dns.Msg{ MsgHdr: dns.MsgHdr{ Authoritative: true, }, Question: dnsRequestMessage.Question, Answer: []dns.RR{ &dns.SOA{ Hdr: dns.RR_Header{ Name: "example.com.br.", Rrtype: dns.TypeSOA, Class: dns.ClassINET, Ttl: 86400, }, Ns: "ns1.example.com.br.", Mbox: "rafael.justo.net.br.", Serial: 2013112600, Refresh: 86400, Retry: 86400, Expire: 86400, Minttl: 900, }, }, } dnsResponseMessage.SetReply(dnsRequestMessage) w.WriteMsg(dnsResponseMessage) }) mux := handy.NewHandy() h := new(handler.DomainVerificationHandler) mux.Handle("/domain/{fqdn}/verification", func() handy.Handler { return h }) requestContent := `{ "Nameservers": [ { "Host": "ns1.example.com.br.", "ipv4": "127.0.0.1" }, { "Host": "ns2.example.com.br.", "ipv4": "127.0.0.1" } ] }` r, err := http.NewRequest("PUT", "/domain/example.com.br./verification", strings.NewReader(requestContent)) if err != nil { utils.Fatalln("Error creating the HTTP request", err) } utils.BuildHTTPHeader(r, []byte(requestContent)) w := httptest.NewRecorder() mux.ServeHTTP(w, r) responseContent, err := ioutil.ReadAll(w.Body) if err != nil { utils.Fatalln("Error reading response body", err) } if w.Code != http.StatusOK { utils.Fatalln(fmt.Sprintf("Error scanning domain. "+ "Expected %d and got %d", http.StatusOK, w.Code), errors.New(string(responseContent))) } if len(h.Response.Nameservers) != 2 { utils.Fatalln("Wrong number of nameservers", nil) } if h.Response.Nameservers[0].LastStatus != model.NameserverStatusToString(model.NameserverStatusOK) { utils.Fatalln("Scan did not work for ns1", nil) } if h.Response.Nameservers[1].LastStatus != model.NameserverStatusToString(model.NameserverStatusOK) { utils.Fatalln("Scan did not work for ns2", nil) } }
func retrieveDomains(database *mgo.Database) { data := []struct { URI string ExpectedHTTPStatus int ContentCheck func(*protocol.DomainsResponse) }{ { URI: "/domains/?orderby=xxx:desc&pagesize=10&page=1", ExpectedHTTPStatus: http.StatusBadRequest, }, { URI: "/domains/?orderby=fqdn:xxx&pagesize=10&page=1", ExpectedHTTPStatus: http.StatusBadRequest, }, { URI: "/domains/?orderby=fqdn:desc&pagesize=xxx&page=1", ExpectedHTTPStatus: http.StatusBadRequest, }, { URI: "/domains/?orderby=fqdn:desc&pagesize=10&page=xxx", ExpectedHTTPStatus: http.StatusBadRequest, }, { URI: "/domains/?orderby=fqdn:desc&pagesize=10&page=1", ExpectedHTTPStatus: http.StatusOK, ContentCheck: func(domainsResponse *protocol.DomainsResponse) { if len(domainsResponse.Domains) != 10 { utils.Fatalln("Error retrieving the wrong number of domains", nil) } }, }, { URI: "/domains", ExpectedHTTPStatus: http.StatusOK, ContentCheck: func(domainsResponse *protocol.DomainsResponse) { if len(domainsResponse.Domains) == 0 { utils.Fatalln("Error retrieving domains", nil) } if len(domainsResponse.Domains[0].Nameservers) == 0 { utils.Fatalln("Error retrieving domains, no nameservers", nil) } if len(domainsResponse.Domains[0].Nameservers[0].Host) > 0 { utils.Fatalln("Not compressing domains result", nil) } }, }, { URI: "/domains?expand", ExpectedHTTPStatus: http.StatusOK, ContentCheck: func(domainsResponse *protocol.DomainsResponse) { if len(domainsResponse.Domains) == 0 { utils.Fatalln("Error retrieving domains", nil) } if len(domainsResponse.Domains[0].Nameservers) == 0 { utils.Fatalln("Error retrieving domains, no nameservers", nil) } if len(domainsResponse.Domains[0].Nameservers[0].Host) == 0 { utils.Fatalln("Compressing domains result when it's not necessary", nil) } }, }, } mux := handy.NewHandy() h := new(handler.DomainsHandler) mux.Handle("/domains", func() handy.Handler { return h }) for _, item := range data { r, err := http.NewRequest("GET", item.URI, nil) if err != nil { utils.Fatalln("Error creating the HTTP request", err) } utils.BuildHTTPHeader(r, nil) w := httptest.NewRecorder() mux.ServeHTTP(w, r) responseContent, err := ioutil.ReadAll(w.Body) if err != nil { utils.Fatalln("Error reading response body", err) } if w.Code != item.ExpectedHTTPStatus { utils.Fatalln(fmt.Sprintf("Error when requesting domains using the URI [%s]. "+ "Expected HTTP status code %d but got %d", item.URI, item.ExpectedHTTPStatus, w.Code), errors.New(string(responseContent))) } if item.ContentCheck != nil { item.ContentCheck(h.Response) } } }
func retrieveScans(database *mgo.Database) { data := []struct { URI string ExpectedHTTPStatus int ContentCheck func(*protocol.ScansResponse) }{ { URI: "/scans/?orderby=xxx:desc&pagesize=10&page=1", ExpectedHTTPStatus: http.StatusBadRequest, }, { URI: "/scans/?orderby=startedat:xxx&pagesize=10&page=1", ExpectedHTTPStatus: http.StatusBadRequest, }, { URI: "/scans/?orderby=startedat:desc&pagesize=xxx&page=1", ExpectedHTTPStatus: http.StatusBadRequest, }, { URI: "/scans/?orderby=startedat:desc&pagesize=10&page=xxx", ExpectedHTTPStatus: http.StatusBadRequest, }, { URI: "/scans/?orderby=startedat:desc&pagesize=10&page=1", ExpectedHTTPStatus: http.StatusOK, ContentCheck: func(scansResponse *protocol.ScansResponse) { if len(scansResponse.Scans) != 10 { utils.Fatalln("Error retrieving the wrong number of scans", nil) } }, }, { URI: "/scans", ExpectedHTTPStatus: http.StatusOK, ContentCheck: func(scansResponse *protocol.ScansResponse) { if len(scansResponse.Scans) == 0 { utils.Fatalln("Error retrieving scans", nil) } if scansResponse.Scans[0].DomainsScanned > 0 { utils.Fatalln("Not compressing scans result", nil) } }, }, { URI: "/scans?expand", ExpectedHTTPStatus: http.StatusOK, ContentCheck: func(scansResponse *protocol.ScansResponse) { if len(scansResponse.Scans) == 0 { utils.Fatalln("Error retrieving scans", nil) } if scansResponse.Scans[0].DomainsScanned == 0 { utils.Fatalln("Compressing scans result when it shouldn't", nil) } }, }, { URI: "/scans?current", ExpectedHTTPStatus: http.StatusOK, ContentCheck: func(scansResponse *protocol.ScansResponse) { if len(scansResponse.Scans) == 0 { utils.Fatalln("Error retrieving current scan", nil) } if scansResponse.Scans[0].Status != "WAITINGEXECUTION" { utils.Fatalln("Current scan with wrong status", nil) } }, }, } mux := handy.NewHandy() h := new(handler.ScansHandler) mux.Handle("/scans", func() handy.Handler { return h }) for _, item := range data { r, err := http.NewRequest("GET", item.URI, nil) if err != nil { utils.Fatalln("Error creating the HTTP request", err) } utils.BuildHTTPHeader(r, nil) w := httptest.NewRecorder() mux.ServeHTTP(w, r) responseContent, err := ioutil.ReadAll(w.Body) if err != nil { utils.Fatalln("Error reading response body", err) } if w.Code != item.ExpectedHTTPStatus { utils.Fatalln(fmt.Sprintf("Error when requesting scans using the URI [%s]. "+ "Expected HTTP status code %d but got %d", item.URI, item.ExpectedHTTPStatus, w.Code), errors.New(string(responseContent))) } if item.ContentCheck != nil { item.ContentCheck(h.Response) } } }
func queryDomain() { dns.HandleFunc("example.com.br.", func(w dns.ResponseWriter, dnsRequestMessage *dns.Msg) { defer w.Close() dnsResponseMessage := &dns.Msg{ MsgHdr: dns.MsgHdr{}, Question: dnsRequestMessage.Question, Answer: []dns.RR{ &dns.NS{ Hdr: dns.RR_Header{ Name: "example.com.br.", Rrtype: dns.TypeNS, Class: dns.ClassINET, Ttl: 86400, }, Ns: "a.dns.br.", }, &dns.NS{ Hdr: dns.RR_Header{ Name: "example.com.br.", Rrtype: dns.TypeNS, Class: dns.ClassINET, Ttl: 86400, }, Ns: "b.dns.br.", }, }, } dnsResponseMessage.SetReply(dnsRequestMessage) w.WriteMsg(dnsResponseMessage) }) mux := handy.NewHandy() h := new(handler.DomainVerificationHandler) mux.Handle("/domain/{fqdn}/verification", func() handy.Handler { return h }) r, err := http.NewRequest("GET", "/domain/example.com.br./verification", nil) if err != nil { utils.Fatalln("Error creating the HTTP request", err) } utils.BuildHTTPHeader(r, nil) w := httptest.NewRecorder() mux.ServeHTTP(w, r) responseContent, err := ioutil.ReadAll(w.Body) if err != nil { utils.Fatalln("Error reading response body", err) } if w.Code != http.StatusOK { utils.Fatalln(fmt.Sprintf("Error scanning domain. "+ "Expected %d and got %d", http.StatusOK, w.Code), errors.New(string(responseContent))) } if len(h.Response.Nameservers) != 2 { utils.Fatalln("Wrong number of nameservers", nil) } }