package main import ( "flag" "fmt" "os" "syscall" "golang.org/x/crypto/ssh/terminal" "fenc/Encryption" ) func getPassword() (string, error) { var ( bytePassword []byte e error ) fmt.Print("Enter Password: ") bytePassword, e = terminal.ReadPassword(int(syscall.Stdin)) if e != nil { return "", e } return string(bytePassword), nil } func main() { var ( files []string decrypt *bool read *bool edit *bool plaintext string password string e error ) flag.Usage = func() { fmt.Fprintf(flag.CommandLine.Output(), "Usage: %s [OPTIONS]... [FILES]...\n", os.Args[0]) fmt.Println("\t-d: Decrypt files") fmt.Println("\t-r: Decrypt and read files to stdout") fmt.Println("\t-e: Edit encrypted file") } decrypt = flag.Bool("d", false, "Decrypt the file(s)") read = flag.Bool("r", false, "Read file to stdout") edit = flag.Bool("e", false, "Edit encrypted file") flag.Parse() files = flag.Args() if len(files) == 0 { flag.Usage() fmt.Println("Files cannot be null") os.Exit(1) } password, e = getPassword() if e != nil { fmt.Println(e.Error()) os.Exit(1) } if *decrypt { for _, file := range files { e = Encryption.DecryptFile(password, file) if e != nil { fmt.Println(e.Error()) os.Exit(1) } } os.Exit(0) } if *read { for _, file := range files { plaintext, e = Encryption.DecryptAndReadFile(password, file) if e != nil { fmt.Println(e.Error()) os.Exit(1) } fmt.Println(file) fmt.Println(plaintext) } os.Exit(0) } if *edit { for _, file := range files { e = Encryption.EditEncryptedFile(password, file) if e != nil { fmt.Println(e.Error()) os.Exit(1) } } os.Exit(0) } for _, file := range files { e = Encryption.EncryptFile(password, file) if e != nil { fmt.Println(e.Error()) os.Exit(1) } } }