Skip to content

Commit

Permalink
Merge pull request #142 from kaytu-io/fix-approved-plugins
Browse files Browse the repository at this point in the history
Fix approved plugins
  • Loading branch information
artaasadi authored May 20, 2024
2 parents 06174b2 + 1b97d94 commit 6b73e43
Show file tree
Hide file tree
Showing 6 changed files with 111 additions and 4 deletions.
1 change: 1 addition & 0 deletions approved_plugins
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
kaytu-io/plugin-aws
2 changes: 2 additions & 0 deletions cmd/plugin/cmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@ var PluginCmd = &cobra.Command{

func init() {
PluginCmd.AddCommand(installCmd)
PluginCmd.AddCommand(uninstallCmd)
PluginCmd.AddCommand(listCmd)

installCmd.Flags().String("token", "", "Github fine-grained access token")
installCmd.Flags().Bool("unsafe", false, "Allow kaytu to install unapproved plugins")
}
3 changes: 2 additions & 1 deletion cmd/plugin/install.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ var installCmd = &cobra.Command{
}

token := utils.ReadStringFlag(cmd, "token")
err = manager.Install(args[0], token)
unsafe := utils.ReadBooleanFlag(cmd, "unsafe")
err = manager.Install(args[0], token, unsafe)
if err != nil {
fmt.Printf("failed to install plugin due to %v\n", err)
return err
Expand Down
30 changes: 30 additions & 0 deletions cmd/plugin/uninstall.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package plugin

import (
"errors"
"fmt"
"github.com/kaytu-io/kaytu/pkg/plugin"
"github.com/spf13/cobra"
)

var uninstallCmd = &cobra.Command{
Use: "uninstall",
RunE: func(cmd *cobra.Command, args []string) error {
manager := plugin.New()
err := manager.StartServer()
if err != nil {
return err
}

if len(args) == 0 {
return errors.New("please provide plugin name")
}

err = manager.Uninstall(args[0])
if err != nil {
fmt.Printf("failed to uninstall plugin due to %v\n", err)
return err
}
return nil
},
}
4 changes: 2 additions & 2 deletions cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ func Execute() {
panic(err)
}

err = manager.Install("aws", "")
err = manager.Install("aws", "", false)
if err != nil {
panic(err)
}
Expand Down Expand Up @@ -128,7 +128,7 @@ func Execute() {
if plg.Config.Name == "aws" {
repoAddr = "aws"
}
err = manager.Install(repoAddr, "")
err = manager.Install(repoAddr, "", false)
if err != nil {
fmt.Println("failed due to", err)
}
Expand Down
75 changes: 74 additions & 1 deletion pkg/plugin/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ func (m *Manager) Register(stream golang.Plugin_RegisterServer) error {
}
}

func (m *Manager) Install(addr, token string) error {
func (m *Manager) Install(addr, token string, unsafe bool) error {
cfg, err := server.GetConfig()
if err != nil {
return err
Expand All @@ -176,6 +176,15 @@ func (m *Manager) Install(addr, token string) error {
)
tc = oauth2.NewClient(context.Background(), ts)
}

approved, err := m.pluginApproved(tc, addr)
if err != nil {
return err
}
if !approved && !unsafe {
return fmt.Errorf("plugin not approved")
}

api := githubAPI.NewClient(tc)
release, _, err := api.Repositories.GetLatestRelease(context.Background(), owner, repository)
if err != nil {
Expand Down Expand Up @@ -311,3 +320,67 @@ func (m *Manager) SetUI(jobs *controller.Jobs, optimizations *controller.Optimiz
func (m *Manager) SetNonInteractiveView() {
m.NonInteractiveView = view.NewNonInteractiveView()
}

func (m *Manager) pluginApproved(tc *http.Client, pluginName string) (bool, error) {
if pluginName == "kaytu-io/plugin-aws" {
return true, nil
}
api := githubAPI.NewClient(tc)
fileContent, _, resp, err := api.Repositories.GetContents(context.Background(), "kaytu-io", "kaytu", "approved_plugins", nil)
if err != nil {
return false, err
}

if resp.StatusCode != 200 {
return false, err
}

content, err := fileContent.GetContent()
if err != nil {
return false, err
}
plugins := strings.Split(content, "\n")
for _, plugin := range plugins {
if plugin == pluginName {
return true, nil
}
}
return false, nil
}

func (m *Manager) Uninstall(pluginName string) error {
cfg, err := server.GetConfig()
if err != nil {
return err
}

plugins := map[string]*server.Plugin{}
installed := false
for _, plg := range cfg.Plugins {
if pluginName == plg.Config.Name {
installed = true
continue
}
plugins[plg.Config.Name] = plg
}
if !installed {
fmt.Errorf("plugin not found")
}

pluginFile := filepath.Join(server.PluginDir(), strings.ReplaceAll(pluginName, "/", "_"))

err = os.Remove(pluginFile)
if err != nil {
return err
}

cfg.Plugins = nil
for _, v := range plugins {
cfg.Plugins = append(cfg.Plugins, v)
}
err = server.SetConfig(*cfg)
if err != nil {
return err
}
return nil
}

0 comments on commit 6b73e43

Please sign in to comment.