/* Copyright © 2024 Brian Buller */ package cmd import ( "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(_ *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%w", err) } else if err = util.WritePWFile(pwFile, pass); err != nil { return fmt.Errorf("db opened, but failed to persist password: %w", 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 }