mirror of
https://codeberg.org/scip/anydb.git
synced 2025-12-17 20:41:00 +01:00
better error handling
This commit is contained in:
@@ -52,7 +52,7 @@ func (attr *DbAttr) GetFileValue() error {
|
|||||||
} else {
|
} else {
|
||||||
filehandle, err := os.OpenFile(attr.File, os.O_RDONLY, 0600)
|
filehandle, err := os.OpenFile(attr.File, os.O_RDONLY, 0600)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return fmt.Errorf("failed to open file %s: %w", attr.File, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
fd = filehandle
|
fd = filehandle
|
||||||
@@ -62,7 +62,7 @@ func (attr *DbAttr) GetFileValue() error {
|
|||||||
// read from file or stdin pipe
|
// read from file or stdin pipe
|
||||||
data, err := io.ReadAll(fd)
|
data, err := io.ReadAll(fd)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return fmt.Errorf("failed to read from pipe: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// poor man's text file test
|
// poor man's text file test
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ func AskForPassword() ([]byte, error) {
|
|||||||
fmt.Fprint(os.Stderr, "Password: ")
|
fmt.Fprint(os.Stderr, "Password: ")
|
||||||
pass, err := term.ReadPassword(int(syscall.Stdin))
|
pass, err := term.ReadPassword(int(syscall.Stdin))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, fmt.Errorf("failed to read password: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Fprintln(os.Stderr)
|
fmt.Fprintln(os.Stderr)
|
||||||
@@ -77,7 +77,7 @@ func GetRandom(size int, capacity int) ([]byte, error) {
|
|||||||
buf := make([]byte, size, capacity)
|
buf := make([]byte, size, capacity)
|
||||||
_, err := rand.Read(buf)
|
_, err := rand.Read(buf)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, fmt.Errorf("failed to retrieve random bytes: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return buf, nil
|
return buf, nil
|
||||||
@@ -97,7 +97,7 @@ func Encrypt(pass []byte, attr *DbAttr) error {
|
|||||||
|
|
||||||
aead, err := chacha20poly1305.New(key.Key)
|
aead, err := chacha20poly1305.New(key.Key)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return fmt.Errorf("failed to create AEAD cipher: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
var plain []byte
|
var plain []byte
|
||||||
@@ -129,7 +129,7 @@ func Encrypt(pass []byte, attr *DbAttr) error {
|
|||||||
func Decrypt(pass []byte, cipherb64 string) ([]byte, error) {
|
func Decrypt(pass []byte, cipherb64 string) ([]byte, error) {
|
||||||
salt, err := base64.RawStdEncoding.Strict().DecodeString(cipherb64[0:B64SaltLen])
|
salt, err := base64.RawStdEncoding.Strict().DecodeString(cipherb64[0:B64SaltLen])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, fmt.Errorf("failed to encode to base64: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
key, err := DeriveKey(pass, salt)
|
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:])
|
cipher, err := base64.RawStdEncoding.Strict().DecodeString(cipherb64[B64SaltLen:])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, fmt.Errorf("failed to encode to base64: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
aead, err := chacha20poly1305.New(key.Key)
|
aead, err := chacha20poly1305.New(key.Key)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, fmt.Errorf("failed to create AEAD cipher: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(cipher) < aead.NonceSize() {
|
if len(cipher) < aead.NonceSize() {
|
||||||
|
|||||||
28
app/db.go
28
app/db.go
@@ -50,7 +50,7 @@ func New(file string, debug bool) (*DB, error) {
|
|||||||
func (db *DB) Open() error {
|
func (db *DB) Open() error {
|
||||||
b, err := bolt.Open(db.Dbfile, 0600, nil)
|
b, err := bolt.Open(db.Dbfile, 0600, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return fmt.Errorf("failed to open DB %s: %w", db.Dbfile, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
db.DB = b
|
db.DB = b
|
||||||
@@ -84,7 +84,7 @@ func (db *DB) List(attr *DbAttr) (DbEntries, error) {
|
|||||||
err := bucket.ForEach(func(key, jsonentry []byte) error {
|
err := bucket.ForEach(func(key, jsonentry []byte) error {
|
||||||
var entry DbEntry
|
var entry DbEntry
|
||||||
if err := json.Unmarshal(jsonentry, &entry); err != nil {
|
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
|
var include bool
|
||||||
@@ -120,7 +120,7 @@ func (db *DB) List(attr *DbAttr) (DbEntries, error) {
|
|||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
|
||||||
return err
|
return fmt.Errorf("failed to read from DB: %w", err)
|
||||||
})
|
})
|
||||||
return entries, err
|
return entries, err
|
||||||
}
|
}
|
||||||
@@ -156,7 +156,7 @@ func (db *DB) Set(attr *DbAttr) error {
|
|||||||
|
|
||||||
var oldentry DbEntry
|
var oldentry DbEntry
|
||||||
if err := json.Unmarshal(jsonentry, &oldentry); err != nil {
|
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 {
|
if len(oldentry.Tags) > 0 && len(entry.Tags) == 0 {
|
||||||
@@ -175,17 +175,17 @@ func (db *DB) Set(attr *DbAttr) error {
|
|||||||
// insert data
|
// insert data
|
||||||
bucket, err := tx.CreateBucketIfNotExists([]byte(BucketData))
|
bucket, err := tx.CreateBucketIfNotExists([]byte(BucketData))
|
||||||
if err != nil {
|
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)
|
jsonentry, err := json.Marshal(entry)
|
||||||
if err != nil {
|
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))
|
err = bucket.Put([]byte(entry.Key), []byte(jsonentry))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("insert data: %s", err)
|
return fmt.Errorf("failed to insert data: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@@ -218,14 +218,14 @@ func (db *DB) Get(attr *DbAttr) (*DbEntry, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err := json.Unmarshal(jsonentry, &entry); err != nil {
|
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
|
return nil
|
||||||
})
|
})
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, fmt.Errorf("failed to read from DB: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return &entry, nil
|
return &entry, nil
|
||||||
@@ -265,14 +265,14 @@ func (db *DB) Import(attr *DbAttr) error {
|
|||||||
newfile := db.Dbfile + now.Format("-02.01.2006T03:04.05")
|
newfile := db.Dbfile + now.Format("-02.01.2006T03:04.05")
|
||||||
|
|
||||||
if err := json.Unmarshal([]byte(attr.Val), &entries); err != nil {
|
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) {
|
if fileExists(db.Dbfile) {
|
||||||
// backup the old file
|
// backup the old file
|
||||||
err := os.Rename(db.Dbfile, newfile)
|
err := os.Rename(db.Dbfile, newfile)
|
||||||
if err != nil {
|
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
|
// insert data
|
||||||
bucket, err := tx.CreateBucketIfNotExists([]byte(BucketData))
|
bucket, err := tx.CreateBucketIfNotExists([]byte(BucketData))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("create bucket: %s", err)
|
return fmt.Errorf("failed to create bucket: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, entry := range entries {
|
for _, entry := range entries {
|
||||||
jsonentry, err := json.Marshal(entry)
|
jsonentry, err := json.Marshal(entry)
|
||||||
if err != nil {
|
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))
|
err = bucket.Put([]byte(entry.Key), []byte(jsonentry))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("insert data: %s", err)
|
return fmt.Errorf("failed to insert data into DB: %w", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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 {
|
func ListJson(writer io.Writer, conf *cfg.Config, entries app.DbEntries) error {
|
||||||
jsonentries, err := json.Marshal(entries)
|
jsonentries, err := json.Marshal(entries)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("json marshalling failure: %s", err)
|
return fmt.Errorf("failed marshall json: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Println(string(jsonentries))
|
fmt.Println(string(jsonentries))
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ func Print(writer io.Writer, conf *cfg.Config, attr *app.DbAttr, entry *app.DbEn
|
|||||||
if attr.File != "" {
|
if attr.File != "" {
|
||||||
fd, err := os.OpenFile(attr.File, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0755)
|
fd, err := os.OpenFile(attr.File, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0755)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return fmt.Errorf("failed to open file %s for writing: %w", attr.File, err)
|
||||||
}
|
}
|
||||||
defer fd.Close()
|
defer fd.Close()
|
||||||
|
|
||||||
@@ -34,7 +34,7 @@ func Print(writer io.Writer, conf *cfg.Config, attr *app.DbAttr, entry *app.DbEn
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return fmt.Errorf("failed to write to file %s: %w", attr.File, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@@ -63,7 +63,7 @@ func Print(writer io.Writer, conf *cfg.Config, attr *app.DbAttr, entry *app.DbEn
|
|||||||
case "json":
|
case "json":
|
||||||
jsonentry, err := json.Marshal(entry)
|
jsonentry, err := json.Marshal(entry)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("json marshalling failure: %s", err)
|
return fmt.Errorf("failed to marshall json: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Println(string(jsonentry))
|
fmt.Println(string(jsonentry))
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import (
|
|||||||
func WriteFile(attr *app.DbAttr, conf *cfg.Config, entries app.DbEntries) error {
|
func WriteFile(attr *app.DbAttr, conf *cfg.Config, entries app.DbEntries) error {
|
||||||
jsonentries, err := json.Marshal(entries)
|
jsonentries, err := json.Marshal(entries)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("json marshalling failure: %s", err)
|
return fmt.Errorf("failed to marshall json: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if attr.File == "-" {
|
if attr.File == "-" {
|
||||||
@@ -20,11 +20,11 @@ func WriteFile(attr *app.DbAttr, conf *cfg.Config, entries app.DbEntries) error
|
|||||||
} else {
|
} else {
|
||||||
fd, err := os.OpenFile(attr.File, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600)
|
fd, err := os.OpenFile(attr.File, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600)
|
||||||
if err != nil {
|
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 {
|
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)
|
fmt.Printf("database contents exported to %s\n", attr.File)
|
||||||
|
|||||||
Reference in New Issue
Block a user