/* Copyright © 2024 Brian Buller */ package cmd import ( "errors" "fmt" "strings" "git.bullercodeworks.com/brian/keepass-cli/models" "git.bullercodeworks.com/brian/keepass-cli/util" "github.com/spf13/cobra" "github.com/spf13/viper" ) // rofiCmd represents the rofi command var rofiCmd = &cobra.Command{ Use: "rofi", Short: "Rofi Menufication of keepass-cli", RunE: runRofi, } func init() { rootCmd.AddCommand(rofiCmd) } func runRofi(cmd *cobra.Command, args []string) error { var path []string for i := range args { path = append(path, strings.Split(args[i], "/")...) } var db *models.KeePassDB var havePassword bool pwFile := fmt.Sprintf("%s%s", ConfigDir, "pw") pass, err := util.ReadPWFile(pwFile) if err != nil { havePassword = false // See if we have a password... if len(args) == 1 { pass = args[0] } else { fmt.Println("Enter Master Password") return nil } } else { havePassword = true } db, err = models.NewKeePassDB(viper.GetString("database"), pass) if err != nil { return err } else if !havePassword { if err = util.WritePWFile(pwFile, pass); err != nil { return err } path = []string{} } if len(path) == 0 { list := db.GetAllEntriesFromRoot() for i := range list { fmt.Println(strings.Join(list[i], "/")) } } else { // Only one... Could be a single group nested, or it's an entry if entry, entryErr := db.FindEntryFromRoot(path); entryErr != nil { return entryErr } else { return util.WriteToClipboard(entry.GetPassword()) } } return nil } func runRofiSteps(cmd *cobra.Command, args []string) error { var path []string for i := range args { path = append(path, strings.Split(args[i], "/")...) } var db *models.KeePassDB var havePassword bool pwFile := fmt.Sprintf("%s%s", ConfigDir, "pw") pass, err := util.ReadFile(pwFile) if err != nil { havePassword = false // See if we have a password... if len(args) == 1 { pass = args[0] } else { fmt.Println("Enter Master Password") return nil } } else { havePassword = true } db, err = models.NewKeePassDB(viper.GetString("database"), pass) if err != nil { return err } else if !havePassword { if err = util.WritePWFile(pwFile, pass); err != nil { return err } path = []string{} } list := db.GetGroupsAndEntriesFromRoot(path) if len(list) == 0 { return errors.New("Invalid Path") } else if len(list) > 1 { for i := range list { fmt.Println(strings.Join(list[i], "/")) } } else { // Only one... Could be a single group nested, or it's an entry entry, entryErr := db.FindEntryFromRoot(path) if entryErr == nil { return util.WriteToClipboard(entry.GetPassword()) } // It's a group fmt.Println(strings.Join(list[0], "/")) } return nil }