func WrapNetworkErrors(host string, err error) error { var innerErr error switch typedErr := err.(type) { case *url.Error: innerErr = typedErr.Err case *websocket.DialError: innerErr = typedErr.Err } if innerErr != nil { switch innerErr.(type) { case x509.UnknownAuthorityError: return errors.NewInvalidSSLCert(host, T("unknown authority")) case x509.HostnameError: return errors.NewInvalidSSLCert(host, T("not valid for the requested host")) case x509.CertificateInvalidError: return errors.NewInvalidSSLCert(host, "") } } return errors.NewWithError(T("Error performing request"), err) }
} var _ = Describe("api command", func() { var ( config core_config.ReadWriter endpointRepo *testapi.FakeEndpointRepo ) BeforeEach(func() { config = testconfig.NewRepository() endpointRepo = &testapi.FakeEndpointRepo{} }) Context("when the api endpoint's ssl certificate is invalid", func() { It("warns the user and prints out a tip", func() { endpointRepo.UpdateEndpointError = errors.NewInvalidSSLCert("https://buttontomatoes.org", "why? no. go away") ui := callApi([]string{"https://buttontomatoes.org"}, config, endpointRepo) Expect(ui.Outputs).To(ContainSubstrings( []string{"FAILED"}, []string{"SSL Cert", "https://buttontomatoes.org"}, []string{"TIP", "--skip-ssl-validation"}, )) }) }) Context("when the user does not provide an endpoint", func() { Context("when the endpoint is set in the config", func() { var ( ui *testterm.FakeUI requirementsFactory *testreq.FakeReqFactory
ItDoesntShowTheTarget() It("clears the entire config", func() { Expect(Config.ApiEndpoint()).To(BeEmpty()) Expect(Config.IsSSLDisabled()).To(BeFalse()) Expect(Config.AccessToken()).To(BeEmpty()) Expect(Config.RefreshToken()).To(BeEmpty()) Expect(Config.OrganizationFields().Guid).To(BeEmpty()) Expect(Config.SpaceFields().Guid).To(BeEmpty()) }) }) }) Describe("when there is an invalid SSL cert", func() { BeforeEach(func() { endpointRepo.UpdateEndpointError = errors.NewInvalidSSLCert("https://bobs-burgers.com", "SELF SIGNED SADNESS") ui.Inputs = []string{"bobs-burgers.com"} }) It("fails and suggests the user skip SSL validation", func() { Expect(ui.Outputs).To(ContainSubstrings( []string{"FAILED"}, []string{"SSL Cert", "https://bobs-burgers.com"}, []string{"TIP", "login", "--skip-ssl-validation"}, )) }) ItDoesntShowTheTarget() }) })
It("tails the app's logs when no flags are given", func() { runCommand("my-app") Expect(requirementsFactory.ApplicationName).To(Equal("my-app")) appGuid, _, _ := logsRepo.TailLogsForArgsForCall(0) Expect(app.Guid).To(Equal(appGuid)) Expect(ui.Outputs).To(ContainSubstrings( []string{"Connected, tailing logs for app", "my-app", "my-org", "my-space", "my-user"}, []string{"Log Line 1"}, )) }) Context("when the loggregator server has an invalid cert", func() { Context("when the skip-ssl-validation flag is not set", func() { It("fails and informs the user about the skip-ssl-validation flag", func() { logsRepo.TailLogsForReturns(errors.NewInvalidSSLCert("https://example.com", "it don't work good")) runCommand("my-app") Expect(ui.Outputs).To(ContainSubstrings( []string{"Received invalid SSL certificate", "https://example.com"}, []string{"TIP"}, )) }) It("informs the user of the error when they include the --recent flag", func() { logsRepo.RecentLogsForReturns(nil, errors.NewInvalidSSLCert("https://example.com", "how does SSL work???")) runCommand("--recent", "my-app") Expect(ui.Outputs).To(ContainSubstrings( []string{"Received invalid SSL certificate", "https://example.com"}, []string{"TIP"},