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 typedErr := 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, "") case *net.OpError: return typedErr.Err } } return errors.NewWithError(T("Error performing request"), err) }
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 typedInnerErr := 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, "") case *net.OpError: if typedInnerErr.Op == "dial" { return fmt.Errorf("%s: %s\n%s", T("Error performing request"), err.Error(), T("TIP: If you are behind a firewall and require an HTTP proxy, verify the https_proxy environment variable is correctly set. Else, check your network connection.")) } } } return fmt.Errorf("%s: %s", T("Error performing request"), err.Error()) }
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"},
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.GetCCInfoReturns(nil, "", 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() }) })
} var _ = Describe("api command", func() { var ( config configuration.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
repoLocator = api.RepositoryLocator{}.SetEndpointRepository(endpointRepo) deps = commandregistry.Dependency{ UI: ui, Config: config, RepoLocator: repoLocator, } cmd = commands.API{}.SetDependency(deps, false).(commands.API) flagContext = flags.NewFlagContext(cmd.MetaData().Flags) }) Context("when the api endpoint's ssl certificate is invalid", func() { It("warns the user and prints out a tip", func() { endpointRepo.GetCCInfoReturns(nil, "", errors.NewInvalidSSLCert("https://buttontomatoes.org", "why? no. go away")) callApi([]string{"https://buttontomatoes.org"}) Expect(runCLIErr).To(HaveOccurred()) Expect(runCLIErr.Error()).To(ContainSubstring("Invalid SSL Cert for https://buttontomatoes.org")) Expect(runCLIErr.Error()).To(ContainSubstring("TIP")) Expect(runCLIErr.Error()).To(ContainSubstring("--skip-ssl-validation")) }) }) Context("when the user does not provide an endpoint", func() { Context("when the endpoint is set in the config", func() { BeforeEach(func() { config.SetAPIEndpoint("https://api.run.pivotal.io") config.SetAPIVersion("2.0") config.SetSSLDisabled(true)
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")) Expect(app.Guid).To(Equal(logsRepo.AppLoggedGuid)) 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.TailLogErr = 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.RecentLogErr = 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"},