From 97837076a3db3b5cf8465d23cf25263c71f2a9e8 Mon Sep 17 00:00:00 2001 From: Thomas von Dein Date: Thu, 19 Dec 2024 10:55:39 +0100 Subject: [PATCH] better error handling --- app/attr.go | 4 ++-- app/crypto.go | 12 ++++++------ app/db.go | 28 ++++++++++++++-------------- output/list.go | 2 +- output/single.go | 6 +++--- output/write.go | 6 +++--- 6 files changed, 29 insertions(+), 29 deletions(-) diff --git a/app/attr.go b/app/attr.go index 2db6c5f..9bb97ef 100644 --- a/app/attr.go +++ b/app/attr.go @@ -52,7 +52,7 @@ func (attr *DbAttr) GetFileValue() error { } else { filehandle, err := os.OpenFile(attr.File, os.O_RDONLY, 0600) if err != nil { - return err + return fmt.Errorf("failed to open file %s: %w", attr.File, err) } fd = filehandle @@ -62,7 +62,7 @@ func (attr *DbAttr) GetFileValue() error { // read from file or stdin pipe data, err := io.ReadAll(fd) if err != nil { - return err + return fmt.Errorf("failed to read from pipe: %w", err) } // poor man's text file test diff --git a/app/crypto.go b/app/crypto.go index 5c36d3e..9c9c9ae 100644 --- a/app/crypto.go +++ b/app/crypto.go @@ -33,7 +33,7 @@ func AskForPassword() ([]byte, error) { fmt.Fprint(os.Stderr, "Password: ") pass, err := term.ReadPassword(int(syscall.Stdin)) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to read password: %w", err) } fmt.Fprintln(os.Stderr) @@ -77,7 +77,7 @@ func GetRandom(size int, capacity int) ([]byte, error) { buf := make([]byte, size, capacity) _, err := rand.Read(buf) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to retrieve random bytes: %w", err) } return buf, nil @@ -97,7 +97,7 @@ func Encrypt(pass []byte, attr *DbAttr) error { aead, err := chacha20poly1305.New(key.Key) if err != nil { - return err + return fmt.Errorf("failed to create AEAD cipher: %w", err) } var plain []byte @@ -129,7 +129,7 @@ func Encrypt(pass []byte, attr *DbAttr) error { func Decrypt(pass []byte, cipherb64 string) ([]byte, error) { salt, err := base64.RawStdEncoding.Strict().DecodeString(cipherb64[0:B64SaltLen]) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to encode to base64: %w", err) } key, err := DeriveKey(pass, salt) @@ -139,12 +139,12 @@ func Decrypt(pass []byte, cipherb64 string) ([]byte, error) { cipher, err := base64.RawStdEncoding.Strict().DecodeString(cipherb64[B64SaltLen:]) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to encode to base64: %w", err) } aead, err := chacha20poly1305.New(key.Key) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to create AEAD cipher: %w", err) } if len(cipher) < aead.NonceSize() { diff --git a/app/db.go b/app/db.go index e48703b..6741f35 100644 --- a/app/db.go +++ b/app/db.go @@ -50,7 +50,7 @@ func New(file string, debug bool) (*DB, error) { func (db *DB) Open() error { b, err := bolt.Open(db.Dbfile, 0600, nil) if err != nil { - return err + return fmt.Errorf("failed to open DB %s: %w", db.Dbfile, err) } db.DB = b @@ -84,7 +84,7 @@ func (db *DB) List(attr *DbAttr) (DbEntries, error) { err := bucket.ForEach(func(key, jsonentry []byte) error { var entry DbEntry if err := json.Unmarshal(jsonentry, &entry); err != nil { - return fmt.Errorf("unable to unmarshal json: %s", err) + return fmt.Errorf("failed to unmarshal from json: %w", err) } var include bool @@ -120,7 +120,7 @@ func (db *DB) List(attr *DbAttr) (DbEntries, error) { return nil }) - return err + return fmt.Errorf("failed to read from DB: %w", err) }) return entries, err } @@ -156,7 +156,7 @@ func (db *DB) Set(attr *DbAttr) error { var oldentry DbEntry if err := json.Unmarshal(jsonentry, &oldentry); err != nil { - return fmt.Errorf("unable to unmarshal json: %s", err) + return fmt.Errorf("failed to unmarshal from json: %w", err) } if len(oldentry.Tags) > 0 && len(entry.Tags) == 0 { @@ -175,17 +175,17 @@ func (db *DB) Set(attr *DbAttr) error { // insert data bucket, err := tx.CreateBucketIfNotExists([]byte(BucketData)) if err != nil { - return fmt.Errorf("create bucket: %s", err) + return fmt.Errorf("failed to create DB bucket: %w", err) } jsonentry, err := json.Marshal(entry) if err != nil { - return fmt.Errorf("json marshalling failure: %s", err) + return fmt.Errorf("failed to marshall json: %w", err) } err = bucket.Put([]byte(entry.Key), []byte(jsonentry)) if err != nil { - return fmt.Errorf("insert data: %s", err) + return fmt.Errorf("failed to insert data: %w", err) } return nil @@ -218,14 +218,14 @@ func (db *DB) Get(attr *DbAttr) (*DbEntry, error) { } if err := json.Unmarshal(jsonentry, &entry); err != nil { - return fmt.Errorf("unable to unmarshal json: %s", err) + return fmt.Errorf("failed to unmarshal from json: %w", err) } return nil }) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to read from DB: %w", err) } return &entry, nil @@ -265,14 +265,14 @@ func (db *DB) Import(attr *DbAttr) error { newfile := db.Dbfile + now.Format("-02.01.2006T03:04.05") if err := json.Unmarshal([]byte(attr.Val), &entries); err != nil { - return cleanError(newfile, fmt.Errorf("unable to unmarshal json: %s", err)) + return cleanError(newfile, fmt.Errorf("failed to unmarshal json: %w", err)) } if fileExists(db.Dbfile) { // backup the old file err := os.Rename(db.Dbfile, newfile) if err != nil { - return err + return fmt.Errorf("failed to rename file %s to %s: %w", db.Dbfile, newfile, err) } } @@ -287,18 +287,18 @@ func (db *DB) Import(attr *DbAttr) error { // insert data bucket, err := tx.CreateBucketIfNotExists([]byte(BucketData)) if err != nil { - return fmt.Errorf("create bucket: %s", err) + return fmt.Errorf("failed to create bucket: %w", err) } for _, entry := range entries { jsonentry, err := json.Marshal(entry) if err != nil { - return fmt.Errorf("json marshalling failure: %s", err) + return fmt.Errorf("failed to marshall json: %w", err) } err = bucket.Put([]byte(entry.Key), []byte(jsonentry)) if err != nil { - return fmt.Errorf("insert data: %s", err) + return fmt.Errorf("failed to insert data into DB: %w", err) } } diff --git a/output/list.go b/output/list.go index d2180c6..d251475 100644 --- a/output/list.go +++ b/output/list.go @@ -32,7 +32,7 @@ func List(writer io.Writer, conf *cfg.Config, entries app.DbEntries) error { func ListJson(writer io.Writer, conf *cfg.Config, entries app.DbEntries) error { jsonentries, err := json.Marshal(entries) if err != nil { - return fmt.Errorf("json marshalling failure: %s", err) + return fmt.Errorf("failed marshall json: %s", err) } fmt.Println(string(jsonentries)) diff --git a/output/single.go b/output/single.go index 5431bb8..b182c6d 100644 --- a/output/single.go +++ b/output/single.go @@ -16,7 +16,7 @@ func Print(writer io.Writer, conf *cfg.Config, attr *app.DbAttr, entry *app.DbEn if attr.File != "" { fd, err := os.OpenFile(attr.File, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0755) if err != nil { - return err + return fmt.Errorf("failed to open file %s for writing: %w", attr.File, err) } defer fd.Close() @@ -34,7 +34,7 @@ func Print(writer io.Writer, conf *cfg.Config, attr *app.DbAttr, entry *app.DbEn } if err != nil { - return err + return fmt.Errorf("failed to write to file %s: %w", attr.File, err) } return nil @@ -63,7 +63,7 @@ func Print(writer io.Writer, conf *cfg.Config, attr *app.DbAttr, entry *app.DbEn case "json": jsonentry, err := json.Marshal(entry) if err != nil { - return fmt.Errorf("json marshalling failure: %s", err) + return fmt.Errorf("failed to marshall json: %s", err) } fmt.Println(string(jsonentry)) diff --git a/output/write.go b/output/write.go index e61892d..c707ce3 100644 --- a/output/write.go +++ b/output/write.go @@ -12,7 +12,7 @@ import ( func WriteFile(attr *app.DbAttr, conf *cfg.Config, entries app.DbEntries) error { jsonentries, err := json.Marshal(entries) if err != nil { - return fmt.Errorf("json marshalling failure: %s", err) + return fmt.Errorf("failed to marshall json: %w", err) } if attr.File == "-" { @@ -20,11 +20,11 @@ func WriteFile(attr *app.DbAttr, conf *cfg.Config, entries app.DbEntries) error } else { fd, err := os.OpenFile(attr.File, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600) if err != nil { - return err + return fmt.Errorf("failed to open file %s for writing: %w", attr.File, err) } if _, err := fd.Write(jsonentries); err != nil { - return err + return fmt.Errorf("failed writing to file %s: %w", attr.File, err) } fmt.Printf("database contents exported to %s\n", attr.File)