feat: upgrade golangci-lint to 1.45.2
This commit is contained in:
parent
09c0d14444
commit
5cf263a86f
20 changed files with 77 additions and 59 deletions
|
@ -138,7 +138,7 @@ steps:
|
||||||
GOPROXY: 'https://goproxy.kolaente.de'
|
GOPROXY: 'https://goproxy.kolaente.de'
|
||||||
depends_on: [ build ]
|
depends_on: [ build ]
|
||||||
commands:
|
commands:
|
||||||
- wget -O - -q https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.31.0
|
- wget -O - -q https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.45.2
|
||||||
- ./mage-static check:all
|
- ./mage-static check:all
|
||||||
when:
|
when:
|
||||||
event: [ push, tag, pull_request ]
|
event: [ push, tag, pull_request ]
|
||||||
|
@ -874,6 +874,6 @@ steps:
|
||||||
- failure
|
- failure
|
||||||
---
|
---
|
||||||
kind: signature
|
kind: signature
|
||||||
hmac: de40fb1378ab65f47d8c518f503eefede9284dd5634e033dd50abf0a6ec33645
|
hmac: 1c4c211e66e4b6eddd2a1c1bad31e5c960d4f67d6033f4d5c4de7896dfae6c30
|
||||||
|
|
||||||
...
|
...
|
||||||
|
|
|
@ -13,10 +13,11 @@ linters:
|
||||||
- goheader
|
- goheader
|
||||||
- gofmt
|
- gofmt
|
||||||
- goimports
|
- goimports
|
||||||
- golint
|
- revive
|
||||||
- misspell
|
- misspell
|
||||||
disable:
|
disable:
|
||||||
- scopelint # Obsolete, using exportloopref instead
|
- scopelint # Obsolete, using exportloopref instead
|
||||||
|
- durationcheck
|
||||||
presets:
|
presets:
|
||||||
- bugs
|
- bugs
|
||||||
- unused
|
- unused
|
||||||
|
@ -35,6 +36,7 @@ issues:
|
||||||
linters:
|
linters:
|
||||||
- gocyclo
|
- gocyclo
|
||||||
- deadcode
|
- deadcode
|
||||||
|
- errorlint
|
||||||
- path: pkg/integrations/*
|
- path: pkg/integrations/*
|
||||||
linters:
|
linters:
|
||||||
- gocyclo
|
- gocyclo
|
||||||
|
@ -80,3 +82,9 @@ issues:
|
||||||
- text: "Missed string"
|
- text: "Missed string"
|
||||||
linters:
|
linters:
|
||||||
- goheader
|
- goheader
|
||||||
|
- path: pkg/.*/error.go
|
||||||
|
linters:
|
||||||
|
- errorlint
|
||||||
|
- path: pkg/models/favorites\.go
|
||||||
|
linters:
|
||||||
|
- nilerr
|
||||||
|
|
|
@ -46,7 +46,7 @@ const (
|
||||||
ServiceEnableCaldav Key = `service.enablecaldav`
|
ServiceEnableCaldav Key = `service.enablecaldav`
|
||||||
ServiceRootpath Key = `service.rootpath`
|
ServiceRootpath Key = `service.rootpath`
|
||||||
ServiceMaxItemsPerPage Key = `service.maxitemsperpage`
|
ServiceMaxItemsPerPage Key = `service.maxitemsperpage`
|
||||||
// Deprecated. Use metrics.enabled
|
// Deprecated: Use metrics.enabled
|
||||||
ServiceEnableMetrics Key = `service.enablemetrics`
|
ServiceEnableMetrics Key = `service.enablemetrics`
|
||||||
ServiceMotd Key = `service.motd`
|
ServiceMotd Key = `service.motd`
|
||||||
ServiceEnableLinkSharing Key = `service.enablelinksharing`
|
ServiceEnableLinkSharing Key = `service.enablelinksharing`
|
||||||
|
|
|
@ -186,7 +186,7 @@ func initSqliteEngine() (engine *xorm.Engine, err error) {
|
||||||
}
|
}
|
||||||
file, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE, 0)
|
file, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("could not open database file [uid=%d, gid=%d]: %s", os.Getuid(), os.Getgid(), err)
|
return nil, fmt.Errorf("could not open database file [uid=%d, gid=%d]: %w", os.Getuid(), os.Getgid(), err)
|
||||||
}
|
}
|
||||||
_ = file.Close() // We directly close the file because we only want to check if it is writable. It will be reopened lazily later by xorm.
|
_ = file.Close() // We directly close the file because we only want to check if it is writable. It will be reopened lazily later by xorm.
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
package files
|
package files
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
@ -136,9 +137,9 @@ func (f *File) Delete() (err error) {
|
||||||
|
|
||||||
err = afs.Remove(f.getFileName())
|
err = afs.Remove(f.getFileName())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if e, is := err.(*os.PathError); is {
|
if errors.Is(err, &os.PathError{}) {
|
||||||
// Don't fail when removing the file failed
|
// Don't fail when removing the file failed
|
||||||
log.Errorf("Error deleting file %d: %s", e.Error())
|
log.Errorf("Error deleting file %d: %w", err)
|
||||||
return s.Commit()
|
return s.Commit()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
package integrations
|
package integrations
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/http/httptest"
|
"net/http/httptest"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
@ -174,8 +175,8 @@ func assertHandlerErrorCode(t *testing.T, err error, expectedErrorCode int) {
|
||||||
t.Error("Error is nil")
|
t.Error("Error is nil")
|
||||||
t.FailNow()
|
t.FailNow()
|
||||||
}
|
}
|
||||||
httperr, ok := err.(*echo.HTTPError)
|
var httperr *echo.HTTPError
|
||||||
if !ok {
|
if !errors.As(err, &httperr) {
|
||||||
t.Error("Error is not *echo.HTTPError")
|
t.Error("Error is not *echo.HTTPError")
|
||||||
t.FailNow()
|
t.FailNow()
|
||||||
}
|
}
|
||||||
|
|
|
@ -683,17 +683,17 @@ create unique index UQE_users_namespace_id
|
||||||
|
|
||||||
sess := tx.NewSession()
|
sess := tx.NewSession()
|
||||||
if err := sess.Begin(); err != nil {
|
if err := sess.Begin(); err != nil {
|
||||||
return fmt.Errorf("unable to open session: %s", err)
|
return fmt.Errorf("unable to open session: %w", err)
|
||||||
}
|
}
|
||||||
for _, s := range sql {
|
for _, s := range sql {
|
||||||
_, err := sess.Exec(s)
|
_, err := sess.Exec(s)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
_ = sess.Rollback()
|
_ = sess.Rollback()
|
||||||
return fmt.Errorf("error executing update data for table %s, column %s: %s", table, column, err)
|
return fmt.Errorf("error executing update data for table %s, column %s: %w", table, column, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if err := sess.Commit(); err != nil {
|
if err := sess.Commit(); err != nil {
|
||||||
return fmt.Errorf("error committing data change: %s", err)
|
return fmt.Errorf("error committing data change: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,7 +49,7 @@ func ExportUserData(s *xorm.Session, u *user.User) (err error) {
|
||||||
// Open zip
|
// Open zip
|
||||||
dumpFile, err := os.Create(tmpFilename)
|
dumpFile, err := os.Create(tmpFilename)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error opening dump file: %s", err)
|
return fmt.Errorf("error opening dump file: %w", err)
|
||||||
}
|
}
|
||||||
defer dumpFile.Close()
|
defer dumpFile.Close()
|
||||||
|
|
||||||
|
|
|
@ -216,7 +216,7 @@ func duplicateTasks(s *xorm.Session, doer web.Auth, ld *ListDuplicate, bucketMap
|
||||||
// It is used to map old task items to new ones.
|
// It is used to map old task items to new ones.
|
||||||
taskMap := make(map[int64]int64)
|
taskMap := make(map[int64]int64)
|
||||||
// Create + update all tasks (includes reminders)
|
// Create + update all tasks (includes reminders)
|
||||||
oldTaskIDs := make([]int64, len(tasks))
|
oldTaskIDs := make([]int64, 0, len(tasks))
|
||||||
for _, t := range tasks {
|
for _, t := range tasks {
|
||||||
oldID := t.ID
|
oldID := t.ID
|
||||||
t.ID = 0
|
t.ID = 0
|
||||||
|
|
|
@ -402,7 +402,7 @@ func getRawTasksForLists(s *xorm.Session, lists []*List, a web.Auth, opts *taskO
|
||||||
return nil, 0, 0, err
|
return nil, 0, 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
userListIDs := make([]int64, len(userLists))
|
userListIDs := make([]int64, 0, len(userLists))
|
||||||
for _, l := range userLists {
|
for _, l := range userLists {
|
||||||
userListIDs = append(userListIDs, l.ID)
|
userListIDs = append(userListIDs, l.ID)
|
||||||
}
|
}
|
||||||
|
|
|
@ -91,7 +91,7 @@ func ListUsersFromList(s *xorm.Session, l *List, search string) (users []*user.U
|
||||||
uidmap[u.TeamNamespaceUserID] = true
|
uidmap[u.TeamNamespaceUserID] = true
|
||||||
}
|
}
|
||||||
|
|
||||||
uids := make([]int64, len(uidmap))
|
uids := make([]int64, 0, len(uidmap))
|
||||||
for id := range uidmap {
|
for id := range uidmap {
|
||||||
uids = append(uids, id)
|
uids = append(uids, id)
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,7 @@ package openid
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"net/http"
|
"net/http"
|
||||||
"time"
|
"time"
|
||||||
|
@ -104,12 +105,13 @@ func HandleCallback(c echo.Context) error {
|
||||||
// Parse the access & ID token
|
// Parse the access & ID token
|
||||||
oauth2Token, err := provider.Oauth2Config.Exchange(context.Background(), cb.Code)
|
oauth2Token, err := provider.Oauth2Config.Exchange(context.Background(), cb.Code)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if rerr, is := err.(*oauth2.RetrieveError); is {
|
var rerr *oauth2.RetrieveError
|
||||||
|
if errors.As(err, &rerr) {
|
||||||
log.Error(err)
|
log.Error(err)
|
||||||
|
|
||||||
details := make(map[string]interface{})
|
details := make(map[string]interface{})
|
||||||
if err := json.Unmarshal(rerr.Body, &details); err != nil {
|
if err := json.Unmarshal(rerr.Body, &details); err != nil {
|
||||||
log.Errorf("Error unmarshaling token for provider %s: %v", provider.Name, err)
|
log.Errorf("Error unmarshalling token for provider %s: %v", provider.Name, err)
|
||||||
return handler.HandleHTTPError(err, c)
|
return handler.HandleHTTPError(err, c)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -35,7 +35,7 @@ import (
|
||||||
func Dump(filename string) error {
|
func Dump(filename string) error {
|
||||||
dumpFile, err := os.Create(filename)
|
dumpFile, err := os.Create(filename)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error opening dump file: %s", err)
|
return fmt.Errorf("error opening dump file: %w", err)
|
||||||
}
|
}
|
||||||
defer dumpFile.Close()
|
defer dumpFile.Close()
|
||||||
|
|
||||||
|
@ -47,7 +47,7 @@ func Dump(filename string) error {
|
||||||
if viper.ConfigFileUsed() != "" {
|
if viper.ConfigFileUsed() != "" {
|
||||||
err = writeFileToZip(viper.ConfigFileUsed(), dumpWriter)
|
err = writeFileToZip(viper.ConfigFileUsed(), dumpWriter)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error saving config file: %s", err)
|
return fmt.Errorf("error saving config file: %w", err)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
log.Warning("No config file found, not including one in the dump. This usually happens when environment variables are used for configuration.")
|
log.Warning("No config file found, not including one in the dump. This usually happens when environment variables are used for configuration.")
|
||||||
|
@ -64,7 +64,7 @@ func Dump(filename string) error {
|
||||||
if dotEnv != "" {
|
if dotEnv != "" {
|
||||||
err = utils.WriteBytesToZip(".env", []byte(dotEnv), dumpWriter)
|
err = utils.WriteBytesToZip(".env", []byte(dotEnv), dumpWriter)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error saving env file: %s", err)
|
return fmt.Errorf("error saving env file: %w", err)
|
||||||
}
|
}
|
||||||
log.Info("Dumped .env file")
|
log.Info("Dumped .env file")
|
||||||
}
|
}
|
||||||
|
@ -73,7 +73,7 @@ func Dump(filename string) error {
|
||||||
log.Info("Start dumping version file...")
|
log.Info("Start dumping version file...")
|
||||||
err = utils.WriteBytesToZip("VERSION", []byte(version.Version), dumpWriter)
|
err = utils.WriteBytesToZip("VERSION", []byte(version.Version), dumpWriter)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error saving version: %s", err)
|
return fmt.Errorf("error saving version: %w", err)
|
||||||
}
|
}
|
||||||
log.Info("Dumped version")
|
log.Info("Dumped version")
|
||||||
|
|
||||||
|
@ -81,12 +81,12 @@ func Dump(filename string) error {
|
||||||
log.Info("Start dumping database...")
|
log.Info("Start dumping database...")
|
||||||
data, err := db.Dump()
|
data, err := db.Dump()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error saving database data: %s", err)
|
return fmt.Errorf("error saving database data: %w", err)
|
||||||
}
|
}
|
||||||
for t, d := range data {
|
for t, d := range data {
|
||||||
err = utils.WriteBytesToZip("database/"+t+".json", d, dumpWriter)
|
err = utils.WriteBytesToZip("database/"+t+".json", d, dumpWriter)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error writing database table %s: %s", t, err)
|
return fmt.Errorf("error writing database table %s: %w", t, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
log.Info("Dumped database")
|
log.Info("Dumped database")
|
||||||
|
@ -95,7 +95,7 @@ func Dump(filename string) error {
|
||||||
log.Info("Start dumping files...")
|
log.Info("Start dumping files...")
|
||||||
allFiles, err := files.Dump()
|
allFiles, err := files.Dump()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error saving file: %s", err)
|
return fmt.Errorf("error saving file: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = utils.WriteFilesToZip(allFiles, dumpWriter)
|
err = utils.WriteFilesToZip(allFiles, dumpWriter)
|
||||||
|
|
|
@ -44,7 +44,7 @@ func Restore(filename string) error {
|
||||||
|
|
||||||
r, err := zip.OpenReader(filename)
|
r, err := zip.OpenReader(filename)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("could not open zip file: %s", err)
|
return fmt.Errorf("could not open zip file: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Warning("Restoring a dump will wipe your current installation!")
|
log.Warning("Restoring a dump will wipe your current installation!")
|
||||||
|
@ -52,7 +52,7 @@ func Restore(filename string) error {
|
||||||
cr := bufio.NewReader(os.Stdin)
|
cr := bufio.NewReader(os.Stdin)
|
||||||
text, err := cr.ReadString('\n')
|
text, err := cr.ReadString('\n')
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("could not read confirmation message: %s", err)
|
return fmt.Errorf("could not read confirmation message: %w", err)
|
||||||
}
|
}
|
||||||
if text != "Yes, I understand\n" {
|
if text != "Yes, I understand\n" {
|
||||||
return fmt.Errorf("invalid confirmation message")
|
return fmt.Errorf("invalid confirmation message")
|
||||||
|
@ -99,7 +99,7 @@ func Restore(filename string) error {
|
||||||
// Restore the db
|
// Restore the db
|
||||||
// Start by wiping everything
|
// Start by wiping everything
|
||||||
if err := db.WipeEverything(); err != nil {
|
if err := db.WipeEverything(); err != nil {
|
||||||
return fmt.Errorf("could not wipe database: %s", err)
|
return fmt.Errorf("could not wipe database: %w", err)
|
||||||
}
|
}
|
||||||
log.Info("Wiped database.")
|
log.Info("Wiped database.")
|
||||||
|
|
||||||
|
@ -108,18 +108,18 @@ func Restore(filename string) error {
|
||||||
migrations := dbfiles["migration"]
|
migrations := dbfiles["migration"]
|
||||||
rc, err := migrations.Open()
|
rc, err := migrations.Open()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("could not open migrations: %s", err)
|
return fmt.Errorf("could not open migrations: %w", err)
|
||||||
}
|
}
|
||||||
defer rc.Close()
|
defer rc.Close()
|
||||||
|
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
if _, err := buf.ReadFrom(rc); err != nil {
|
if _, err := buf.ReadFrom(rc); err != nil {
|
||||||
return fmt.Errorf("could not read migrations: %s", err)
|
return fmt.Errorf("could not read migrations: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
ms := []*xormigrate.Migration{}
|
ms := []*xormigrate.Migration{}
|
||||||
if err := json.Unmarshal(buf.Bytes(), &ms); err != nil {
|
if err := json.Unmarshal(buf.Bytes(), &ms); err != nil {
|
||||||
return fmt.Errorf("could not read migrations: %s", err)
|
return fmt.Errorf("could not read migrations: %w", err)
|
||||||
}
|
}
|
||||||
sort.Slice(ms, func(i, j int) bool {
|
sort.Slice(ms, func(i, j int) bool {
|
||||||
return ms[i].ID > ms[j].ID
|
return ms[i].ID > ms[j].ID
|
||||||
|
@ -127,17 +127,17 @@ func Restore(filename string) error {
|
||||||
|
|
||||||
lastMigration := ms[len(ms)-1]
|
lastMigration := ms[len(ms)-1]
|
||||||
if err := migration.MigrateTo(lastMigration.ID, nil); err != nil {
|
if err := migration.MigrateTo(lastMigration.ID, nil); err != nil {
|
||||||
return fmt.Errorf("could not create db structure: %s", err)
|
return fmt.Errorf("could not create db structure: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Restore all db data
|
// Restore all db data
|
||||||
for table, d := range dbfiles {
|
for table, d := range dbfiles {
|
||||||
content, err := unmarshalFileToJSON(d)
|
content, err := unmarshalFileToJSON(d)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("could not read table %s: %s", table, err)
|
return fmt.Errorf("could not read table %s: %w", table, err)
|
||||||
}
|
}
|
||||||
if err := db.Restore(table, content); err != nil {
|
if err := db.Restore(table, content); err != nil {
|
||||||
return fmt.Errorf("could not restore table data for table %s: %s", table, err)
|
return fmt.Errorf("could not restore table data for table %s: %w", table, err)
|
||||||
}
|
}
|
||||||
log.Infof("Restored table %s", table)
|
log.Infof("Restored table %s", table)
|
||||||
}
|
}
|
||||||
|
@ -151,18 +151,18 @@ func Restore(filename string) error {
|
||||||
for i, file := range filesFiles {
|
for i, file := range filesFiles {
|
||||||
id, err := strconv.ParseInt(i, 10, 64)
|
id, err := strconv.ParseInt(i, 10, 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("could not parse file id %s: %s", i, err)
|
return fmt.Errorf("could not parse file id %s: %w", i, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
f := &files.File{ID: id}
|
f := &files.File{ID: id}
|
||||||
|
|
||||||
fc, err := file.Open()
|
fc, err := file.Open()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("could not open file %s: %s", i, err)
|
return fmt.Errorf("could not open file %s: %w", i, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := f.Save(fc); err != nil {
|
if err := f.Save(fc); err != nil {
|
||||||
return fmt.Errorf("could not save file: %s", err)
|
return fmt.Errorf("could not save file: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
_ = fc.Close()
|
_ = fc.Close()
|
||||||
|
@ -205,7 +205,7 @@ func restoreConfig(configFile, dotEnvFile *zip.File) error {
|
||||||
|
|
||||||
outFile, err := os.OpenFile(configFile.Name, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, configFile.Mode())
|
outFile, err := os.OpenFile(configFile.Name, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, configFile.Mode())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("could not open config file for writing: %s", err)
|
return fmt.Errorf("could not open config file for writing: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
cfgr, err := configFile.Open()
|
cfgr, err := configFile.Open()
|
||||||
|
@ -216,7 +216,7 @@ func restoreConfig(configFile, dotEnvFile *zip.File) error {
|
||||||
// #nosec - We eliminated the potential decompression bomb by erroring out above if the file is larger than a threshold.
|
// #nosec - We eliminated the potential decompression bomb by erroring out above if the file is larger than a threshold.
|
||||||
_, err = io.Copy(outFile, cfgr)
|
_, err = io.Copy(outFile, cfgr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("could not create config file: %s", err)
|
return fmt.Errorf("could not create config file: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
_ = cfgr.Close()
|
_ = cfgr.Close()
|
||||||
|
@ -225,7 +225,7 @@ func restoreConfig(configFile, dotEnvFile *zip.File) error {
|
||||||
log.Infof("The config file has been restored to '%s'.", configFile.Name)
|
log.Infof("The config file has been restored to '%s'.", configFile.Name)
|
||||||
log.Infof("You can now make changes to it, hit enter when you're done.")
|
log.Infof("You can now make changes to it, hit enter when you're done.")
|
||||||
if _, err := bufio.NewReader(os.Stdin).ReadString('\n'); err != nil {
|
if _, err := bufio.NewReader(os.Stdin).ReadString('\n'); err != nil {
|
||||||
return fmt.Errorf("could not read from stdin: %s", err)
|
return fmt.Errorf("could not read from stdin: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -249,7 +249,7 @@ func restoreConfig(configFile, dotEnvFile *zip.File) error {
|
||||||
log.Warning("Make sure your current config matches the following env variables, confirm by pressing enter when done.")
|
log.Warning("Make sure your current config matches the following env variables, confirm by pressing enter when done.")
|
||||||
log.Warning("If your config does not match, you'll have to make the changes and restart the restoring process afterwards.")
|
log.Warning("If your config does not match, you'll have to make the changes and restart the restoring process afterwards.")
|
||||||
if _, err := bufio.NewReader(os.Stdin).ReadString('\n'); err != nil {
|
if _, err := bufio.NewReader(os.Stdin).ReadString('\n'); err != nil {
|
||||||
return fmt.Errorf("could not read from stdin: %s", err)
|
return fmt.Errorf("could not read from stdin: %w", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -64,7 +64,7 @@ func (v *FileMigrator) Name() string {
|
||||||
func (v *FileMigrator) Migrate(user *user.User, file io.ReaderAt, size int64) error {
|
func (v *FileMigrator) Migrate(user *user.User, file io.ReaderAt, size int64) error {
|
||||||
r, err := zip.NewReader(file, size)
|
r, err := zip.NewReader(file, size)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("could not open import file: %s", err)
|
return fmt.Errorf("could not open import file: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Debugf(logPrefix+"Importing a zip file containing %d files", len(r.File))
|
log.Debugf(logPrefix+"Importing a zip file containing %d files", len(r.File))
|
||||||
|
@ -77,7 +77,7 @@ func (v *FileMigrator) Migrate(user *user.User, file io.ReaderAt, size int64) er
|
||||||
fname := strings.ReplaceAll(f.Name, "files/", "")
|
fname := strings.ReplaceAll(f.Name, "files/", "")
|
||||||
id, err := strconv.ParseInt(fname, 10, 64)
|
id, err := strconv.ParseInt(fname, 10, 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("could not convert file id: %s", err)
|
return fmt.Errorf("could not convert file id: %w", err)
|
||||||
}
|
}
|
||||||
storedFiles[id] = f
|
storedFiles[id] = f
|
||||||
log.Debugf(logPrefix + "Found a blob file")
|
log.Debugf(logPrefix + "Found a blob file")
|
||||||
|
@ -104,18 +104,18 @@ func (v *FileMigrator) Migrate(user *user.User, file io.ReaderAt, size int64) er
|
||||||
// Import the bulk of Vikunja data
|
// Import the bulk of Vikunja data
|
||||||
df, err := dataFile.Open()
|
df, err := dataFile.Open()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("could not open data file: %s", err)
|
return fmt.Errorf("could not open data file: %w", err)
|
||||||
}
|
}
|
||||||
defer df.Close()
|
defer df.Close()
|
||||||
|
|
||||||
var bufData bytes.Buffer
|
var bufData bytes.Buffer
|
||||||
if _, err := bufData.ReadFrom(df); err != nil {
|
if _, err := bufData.ReadFrom(df); err != nil {
|
||||||
return fmt.Errorf("could not read data file: %s", err)
|
return fmt.Errorf("could not read data file: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
namespaces := []*models.NamespaceWithListsAndTasks{}
|
namespaces := []*models.NamespaceWithListsAndTasks{}
|
||||||
if err := json.Unmarshal(bufData.Bytes(), &namespaces); err != nil {
|
if err := json.Unmarshal(bufData.Bytes(), &namespaces); err != nil {
|
||||||
return fmt.Errorf("could not read data: %s", err)
|
return fmt.Errorf("could not read data: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, n := range namespaces {
|
for _, n := range namespaces {
|
||||||
|
@ -123,11 +123,11 @@ func (v *FileMigrator) Migrate(user *user.User, file io.ReaderAt, size int64) er
|
||||||
if b, exists := storedFiles[l.BackgroundFileID]; exists {
|
if b, exists := storedFiles[l.BackgroundFileID]; exists {
|
||||||
bf, err := b.Open()
|
bf, err := b.Open()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("could not open list background file %d for reading: %s", l.BackgroundFileID, err)
|
return fmt.Errorf("could not open list background file %d for reading: %w", l.BackgroundFileID, err)
|
||||||
}
|
}
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
if _, err := buf.ReadFrom(bf); err != nil {
|
if _, err := buf.ReadFrom(bf); err != nil {
|
||||||
return fmt.Errorf("could not read list background file %d: %s", l.BackgroundFileID, err)
|
return fmt.Errorf("could not read list background file %d: %w", l.BackgroundFileID, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
l.BackgroundInformation = &buf
|
l.BackgroundInformation = &buf
|
||||||
|
@ -143,11 +143,11 @@ func (v *FileMigrator) Migrate(user *user.User, file io.ReaderAt, size int64) er
|
||||||
for _, attachment := range t.Attachments {
|
for _, attachment := range t.Attachments {
|
||||||
af, err := storedFiles[attachment.File.ID].Open()
|
af, err := storedFiles[attachment.File.ID].Open()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("could not open attachment %d for reading: %s", attachment.ID, err)
|
return fmt.Errorf("could not open attachment %d for reading: %w", attachment.ID, err)
|
||||||
}
|
}
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
if _, err := buf.ReadFrom(af); err != nil {
|
if _, err := buf.ReadFrom(af); err != nil {
|
||||||
return fmt.Errorf("could not read attachment %d: %s", attachment.ID, err)
|
return fmt.Errorf("could not read attachment %d: %w", attachment.ID, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
attachment.ID = 0
|
attachment.ID = 0
|
||||||
|
@ -160,7 +160,7 @@ func (v *FileMigrator) Migrate(user *user.User, file io.ReaderAt, size int64) er
|
||||||
|
|
||||||
err = migration.InsertFromStructure(namespaces, user)
|
err = migration.InsertFromStructure(namespaces, user)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("could not insert data: %s", err)
|
return fmt.Errorf("could not insert data: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if filterFile == nil {
|
if filterFile == nil {
|
||||||
|
@ -172,18 +172,18 @@ func (v *FileMigrator) Migrate(user *user.User, file io.ReaderAt, size int64) er
|
||||||
// Import filters
|
// Import filters
|
||||||
ff, err := filterFile.Open()
|
ff, err := filterFile.Open()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("could not open filters file: %s", err)
|
return fmt.Errorf("could not open filters file: %w", err)
|
||||||
}
|
}
|
||||||
defer ff.Close()
|
defer ff.Close()
|
||||||
|
|
||||||
var bufFilter bytes.Buffer
|
var bufFilter bytes.Buffer
|
||||||
if _, err := bufFilter.ReadFrom(ff); err != nil {
|
if _, err := bufFilter.ReadFrom(ff); err != nil {
|
||||||
return fmt.Errorf("could not read filters file: %s", err)
|
return fmt.Errorf("could not read filters file: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
filters := []*models.SavedFilter{}
|
filters := []*models.SavedFilter{}
|
||||||
if err := json.Unmarshal(bufFilter.Bytes(), &filters); err != nil {
|
if err := json.Unmarshal(bufFilter.Bytes(), &filters); err != nil {
|
||||||
return fmt.Errorf("could not read filter data: %s", err)
|
return fmt.Errorf("could not read filter data: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Debugf(logPrefix+"Importing %d saved filters", len(filters))
|
log.Debugf(logPrefix+"Importing %d saved filters", len(filters))
|
||||||
|
|
|
@ -18,6 +18,7 @@ package v1
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"image/jpeg"
|
"image/jpeg"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
@ -91,7 +92,8 @@ func UserTOTPEnable(c echo.Context) error {
|
||||||
}
|
}
|
||||||
if err := c.Bind(passcode); err != nil {
|
if err := c.Bind(passcode); err != nil {
|
||||||
log.Debugf("Invalid model error. Internal error was: %s", err.Error())
|
log.Debugf("Invalid model error. Internal error was: %s", err.Error())
|
||||||
if he, is := err.(*echo.HTTPError); is {
|
var he *echo.HTTPError
|
||||||
|
if errors.As(err, &he) {
|
||||||
return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid model provided. Error was: %s", he.Message))
|
return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid model provided. Error was: %s", he.Message))
|
||||||
}
|
}
|
||||||
return echo.NewHTTPError(http.StatusBadRequest, "Invalid model provided.")
|
return echo.NewHTTPError(http.StatusBadRequest, "Invalid model provided.")
|
||||||
|
@ -131,7 +133,8 @@ func UserTOTPDisable(c echo.Context) error {
|
||||||
login := &user.Login{}
|
login := &user.Login{}
|
||||||
if err := c.Bind(login); err != nil {
|
if err := c.Bind(login); err != nil {
|
||||||
log.Debugf("Invalid model error. Internal error was: %s", err.Error())
|
log.Debugf("Invalid model error. Internal error was: %s", err.Error())
|
||||||
if he, is := err.(*echo.HTTPError); is {
|
var he *echo.HTTPError
|
||||||
|
if errors.As(err, &he) {
|
||||||
return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid model provided. Error was: %s", he.Message))
|
return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid model provided. Error was: %s", he.Message))
|
||||||
}
|
}
|
||||||
return echo.NewHTTPError(http.StatusBadRequest, "Invalid model provided.")
|
return echo.NewHTTPError(http.StatusBadRequest, "Invalid model provided.")
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
package v1
|
package v1
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
|
@ -47,7 +48,8 @@ func UpdateUserEmail(c echo.Context) (err error) {
|
||||||
var emailUpdate = &user.EmailUpdate{}
|
var emailUpdate = &user.EmailUpdate{}
|
||||||
if err := c.Bind(emailUpdate); err != nil {
|
if err := c.Bind(emailUpdate); err != nil {
|
||||||
log.Debugf("Invalid model error. Internal error was: %s", err.Error())
|
log.Debugf("Invalid model error. Internal error was: %s", err.Error())
|
||||||
if he, is := err.(*echo.HTTPError); is {
|
var he *echo.HTTPError
|
||||||
|
if errors.As(err, &he) {
|
||||||
return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid model provided. Error was: %s", he.Message))
|
return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid model provided. Error was: %s", he.Message))
|
||||||
}
|
}
|
||||||
return echo.NewHTTPError(http.StatusBadRequest, "Invalid model provided.")
|
return echo.NewHTTPError(http.StatusBadRequest, "Invalid model provided.")
|
||||||
|
|
|
@ -156,7 +156,7 @@ func NewEcho() *echo.Echo {
|
||||||
|
|
||||||
e.HTTPErrorHandler = func(err error, c echo.Context) {
|
e.HTTPErrorHandler = func(err error, c echo.Context) {
|
||||||
// Only capture errors not already handled by echo
|
// Only capture errors not already handled by echo
|
||||||
if _, ok := err.(*echo.HTTPError); !ok {
|
if errors.Is(err, &echo.HTTPError{}) {
|
||||||
hub := sentryecho.GetHubFromContext(c)
|
hub := sentryecho.GetHubFromContext(c)
|
||||||
if hub != nil {
|
if hub != nil {
|
||||||
hub.WithScope(func(scope *sentry.Scope) {
|
hub.WithScope(func(scope *sentry.Scope) {
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
// You should have received a copy of the GNU Affero General Public Licensee
|
// You should have received a copy of the GNU Affero General Public Licensee
|
||||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
//go:build !windows
|
||||||
// +build !windows
|
// +build !windows
|
||||||
|
|
||||||
package utils
|
package utils
|
||||||
|
|
|
@ -54,7 +54,7 @@ func WriteFilesToZip(files map[int64]io.ReadCloser, wr *zip.Writer) (err error)
|
||||||
}
|
}
|
||||||
_, err = io.Copy(w, file)
|
_, err = io.Copy(w, file)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error writing file %d: %s", fid, err)
|
return fmt.Errorf("error writing file %d: %w", fid, err)
|
||||||
}
|
}
|
||||||
_ = file.Close()
|
_ = file.Close()
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue