func (cmd *PluginInstall) Execute(c flags.FlagContext) error { if !cmd.confirmWithUser( c, T("**Attention: Plugins are binaries written by potentially untrusted authors. Install and use plugins at your own risk.**\n\nDo you want to install the plugin {{.Plugin}}? (y or n)", map[string]interface{}{ "Plugin": c.Args()[0], }), ) { return errors.New(T("Plugin installation cancelled")) } fileDownloader := downloader.NewDownloader(os.TempDir()) removeTmpFile := func() { err := fileDownloader.RemoveFile() if err != nil { cmd.ui.Say(T("Problem removing downloaded binary in temp directory: ") + err.Error()) } } defer removeTmpFile() deps := &plugininstaller.Context{ Checksummer: cmd.checksum, GetPluginRepos: cmd.config.PluginRepos, FileDownloader: fileDownloader, PluginRepo: cmd.pluginRepo, RepoName: c.String("r"), UI: cmd.ui, } installer := plugininstaller.NewPluginInstaller(deps) pluginSourceFilepath := installer.Install(c.Args()[0]) _, pluginExecutableName := filepath.Split(pluginSourceFilepath) cmd.ui.Say(T( "Installing plugin {{.PluginPath}}...", map[string]interface{}{ "PluginPath": pluginExecutableName, }), ) pluginDestinationFilepath := filepath.Join(cmd.pluginConfig.GetPluginPath(), pluginExecutableName) err := cmd.ensurePluginBinaryWithSameFileNameDoesNotAlreadyExist(pluginDestinationFilepath, pluginExecutableName) if err != nil { return err } pluginMetadata, err := cmd.runBinaryAndObtainPluginMetadata(pluginSourceFilepath) if err != nil { return err } err = cmd.ensurePluginIsSafeForInstallation(pluginMetadata, pluginDestinationFilepath, pluginSourceFilepath) if err != nil { return err } err = cmd.installPlugin(pluginMetadata, pluginDestinationFilepath, pluginSourceFilepath) if err != nil { return err } cmd.ui.Ok() cmd.ui.Say(T( "Plugin {{.PluginName}} v{{.Version}} successfully installed.", map[string]interface{}{ "PluginName": pluginMetadata.Name, "Version": fmt.Sprintf("%d.%d.%d", pluginMetadata.Version.Major, pluginMetadata.Version.Minor, pluginMetadata.Version.Build), }), ) return nil }
. "github.com/onsi/ginkgo" . "github.com/onsi/gomega" ) var _ = Describe("Downloader", func() { var ( d downloader.Downloader tempDir string ) BeforeEach(func() { var err error tempDir, err = ioutil.TempDir("", "file-download-test") Expect(err).NotTo(HaveOccurred()) d = downloader.NewDownloader(tempDir) }) AfterEach(func() { os.RemoveAll(tempDir) }) Describe("DownloadFile", func() { var server *ghttp.Server BeforeEach(func() { server = ghttp.NewServer() }) AfterEach(func() { server.Close()