/* Copyright © 2024 Brian Buller */ package cmd import ( "errors" "fmt" "sort" "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 db *models.KeePassDB var argIsPw bool pwFile := fmt.Sprintf("%s%s", ConfigDir, "pw") pass, err := util.ReadPWFile(pwFile) if err != nil { // See if we have a password... if len(args) == 1 { pass = args[0] argIsPw = true } else { fmt.Println("Enter Master Password") return nil } } db, err = models.NewKeePassDB(viper.GetString("database"), pass) if err != nil { util.RemovePWFile(pwFile) return fmt.Errorf("Error opening DB. Re-enter Master Password:\n%v", err) } else if err = util.WritePWFile(pwFile, pass); err != nil { return fmt.Errorf("DB Opened, but failed to persist password: %v", err) } var path []string for i := range args { path = append(path, strings.Split(args[i], "/")...) } var freqs *models.Frequencies if len(path) == 0 || argIsPw { list := db.GetAllEntriesFromRoot() var printList []string for i := range list { printList = append(printList, strings.Join(list[i], "/")) } freqs, err = models.LoadFrequencies() if err == nil { sort.Slice(printList, func(i, j int) bool { return freqs.GetTimes(printList[i]) > freqs.GetTimes(printList[j]) }) } for i := range printList { fmt.Println(printList[i]) } } else { if entry, entryErr := db.FindEntryFromRoot(path); entryErr != nil { return entryErr } else { freqPath := strings.Join(path, "/") freqs, err = models.LoadFrequencies() if err == nil { freqs.IncrementEntry(freqPath) freqs.Save() } 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 }