- added describe command
- fixed v4+v6 handling
This commit is contained in:
2023-03-09 20:24:20 +01:00
parent 01a0dc054d
commit d6792dd6c8
15 changed files with 215 additions and 21 deletions

View File

@@ -157,3 +157,31 @@ func (db *Db) List(apicontext string) (*Uploads, error) {
return uploads, err
}
// we only return one obj here, but could return more later
func (db *Db) Get(id string) (*Uploads, error) {
uploads := &Uploads{}
err := db.bolt.View(func(tx *bolt.Tx) error {
bucket := tx.Bucket([]byte(Bucket))
if bucket == nil {
return nil
}
j := bucket.Get([]byte(id))
if j == nil {
return fmt.Errorf("No upload object found with id %s", id)
}
upload := &Upload{}
if err := json.Unmarshal(j, &upload); err != nil {
return fmt.Errorf("unable to unmarshal json: %s", err)
}
uploads.Entries = append(uploads.Entries, upload)
return nil
})
return uploads, err
}

View File

@@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package api
import (
"github.com/alecthomas/repr"
//"github.com/alecthomas/repr"
"github.com/gofiber/fiber/v2"
"github.com/google/uuid"
"github.com/tlinden/up/upd/cfg"
@@ -161,11 +161,13 @@ func DeleteUpload(c *fiber.Ctx, cfg *cfg.Config, db *Db) error {
id, err := Untaint(c.Params("id"), cfg.RegKey)
if err != nil {
return fiber.NewError(403, "Invalid id provided!")
return JsonStatus(c, fiber.StatusForbidden,
"Invalid id provided!")
}
if len(id) == 0 {
return fiber.NewError(403, "No id given!")
return JsonStatus(c, fiber.StatusForbidden,
"No id specified!")
}
cleanup(filepath.Join(cfg.StorageDir, id))
@@ -173,7 +175,8 @@ func DeleteUpload(c *fiber.Ctx, cfg *cfg.Config, db *Db) error {
err = db.Delete(id)
if err != nil {
// non existent db entry with that id, or other db error, see logs
return fiber.NewError(404, "No upload with that id could be found!")
return JsonStatus(c, fiber.StatusForbidden,
"No upload with that id could be found!")
}
return nil
@@ -188,7 +191,6 @@ func List(c *fiber.Ctx, cfg *cfg.Config, db *Db) error {
}
uploads, err := db.List(apicontext)
repr.Print(uploads)
if err != nil {
return JsonStatus(c, fiber.StatusForbidden,
"Unable to list uploads: "+err.Error())
@@ -200,3 +202,24 @@ func List(c *fiber.Ctx, cfg *cfg.Config, db *Db) error {
return c.Status(fiber.StatusOK).JSON(uploads)
}
// returns just one upload obj + error code, no post processing by server
func Describe(c *fiber.Ctx, cfg *cfg.Config, db *Db) error {
id, err := Untaint(c.Params("id"), cfg.RegKey)
if err != nil {
return JsonStatus(c, fiber.StatusForbidden,
"Invalid id provided!")
}
uploads, err := db.Get(id)
if err != nil {
return JsonStatus(c, fiber.StatusForbidden,
"No upload with that id could be found!")
}
// if we reached this point we can signal success
uploads.Success = true
uploads.Code = fiber.StatusOK
return c.Status(fiber.StatusOK).JSON(uploads)
}

View File

@@ -76,6 +76,10 @@ func Runserver(conf *cfg.Config, args []string) error {
api.Get("/list/", auth, func(c *fiber.Ctx) error {
return List(c, conf, db)
})
api.Get("/upload/:id/", auth, func(c *fiber.Ctx) error {
return Describe(c, conf, db)
})
}
// public routes

View File

@@ -34,18 +34,18 @@ type Apicontext struct {
// holds the whole configs, filled by commandline flags, env and config file
type Config struct {
ApiPrefix string `koanf:"apiprefix"`
ApiPrefix string `koanf:"apiprefix"` // path prefix
Debug bool `koanf:"debug"`
Listen string `koanf:"listen"`
StorageDir string `koanf:"storagedir"`
Url string `koanf:"url"`
Listen string `koanf:"listen"` // [host]:port
StorageDir string `koanf:"storagedir"` // db and uploads go there
Url string `koanf:"url"` // public visible url, might be different from Listen
DbFile string `koanf:"dbfile"`
// fiber settings, see:
// https://docs.gofiber.io/api/fiber/#config
Prefork bool `koanf:"prefork"`
AppName string `koanf:"appname"`
BodyLimit int `koanf:"bodylimit"`
Prefork bool `koanf:"prefork"` // default: nope
AppName string `koanf:"appname"` // "upd"
BodyLimit int `koanf:"bodylimit"` // much
V4only bool `koanf:"ipv4"`
V6only bool `koanf:"ipv6"`
Network string
@@ -86,6 +86,8 @@ func (c *Config) ApplyDefaults() {
}
switch {
case c.V4only && c.V6only:
c.Network = "tcp" // dual stack
case c.V4only:
c.Network = "tcp4"
case c.V6only:

View File

@@ -1,6 +1,3 @@
# -*-ruby-*-
listen = ":8080"
bodylimit = 10000
bodylimit = 10001

View File

@@ -13,4 +13,4 @@ apicontext = [
}
]
url = "https://sokrates.daemon.de"