diff --git a/.gitignore b/.gitignore index df4168b..e5b4db2 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,5 @@ config.toml public *.idx *.sqlite3 +static/videos +media diff --git a/.ssgod.json b/.ssgod.json new file mode 100644 index 0000000..0bc609d --- /dev/null +++ b/.ssgod.json @@ -0,0 +1,13 @@ +{ + "views": "pages", + "layout": "views/layouts/main.html", + "target": "public", + "watch_delay": "500ms", + "sync_dir": "static", + "exclude": [ + "pages/layouts/.*" + ], + "meta_files": [ + "pages/sitemap.html" + ] +} diff --git a/admin/db.go b/admin/db.go index 135b047..89b7735 100644 --- a/admin/db.go +++ b/admin/db.go @@ -9,6 +9,7 @@ import ( ) func SearchTable(search string, table string, the_type reflect.Type, limit uint64, page uint64) ([]any, error) { + var results []any like := fmt.Sprint("%", search, "%") @@ -132,6 +133,7 @@ func Update(table string, value reflect.Value) error { builder = builder.Where(sq.Eq{"id": value.FieldByName("Id").Interface()}) sql_query, args, err := builder.ToSql() + fmt.Println("UPDATE QUERY", sql_query, args) if err != nil { return err} _, err = data.DB.Exec(sql_query, args...) diff --git a/admin/handlers.go b/admin/handlers.go index 5a77249..d747382 100644 --- a/admin/handlers.go +++ b/admin/handlers.go @@ -6,12 +6,12 @@ import ( "fmt" "github.com/gofiber/fiber/v2" "MY/webapp/data" - "MY/webapp/api" . "MY/webapp/common" + "MY/webapp/auth" ) func GetApiTableIndex(c *fiber.Ctx) error { - _, err := api.CheckAuthed(c, true) + _, err := auth.Check(c, true) if err != nil { return c.Redirect("/") } var tables []string @@ -24,7 +24,7 @@ func GetApiTableIndex(c *fiber.Ctx) error { } func GetApiSelectAll(c *fiber.Ctx) error { - _, err := api.CheckAuthed(c, true) + _, err := auth.Check(c, true) if err != nil { return c.Redirect("/") } table := c.Params("table") @@ -50,14 +50,14 @@ func GetApiSelectAll(c *fiber.Ctx) error { } func GetPageSelectAll(c *fiber.Ctx) error { - _, err := api.CheckAuthed(c, true) + _, err := auth.Check(c, true) if err != nil { return c.Redirect("/") } return c.Render("admin/table/contents", fiber.Map{"Table": c.Params("table")}) } func GetApiSelectOne(c *fiber.Ctx) error { - _, err := api.CheckAuthed(c, true) + _, err := auth.Check(c, true) if err != nil { return c.Redirect("/") } table := c.Params("table") @@ -73,7 +73,7 @@ func GetApiSelectOne(c *fiber.Ctx) error { } func GetPageSelectOne(c *fiber.Ctx) error { - _, err := api.CheckAuthed(c, true) + _, err := auth.Check(c, true) if err != nil { return c.Redirect("/") } table := c.Params("table") @@ -87,7 +87,7 @@ func GetPageSelectOne(c *fiber.Ctx) error { } func PostApiUpdate(c *fiber.Ctx) error { - _, err := api.CheckAuthed(c, true) + _, err := auth.Check(c, true) if err != nil { return c.Redirect("/") } table := c.Params("table") @@ -102,7 +102,7 @@ func PostApiUpdate(c *fiber.Ctx) error { } func GetPageInsert(c *fiber.Ctx) error { - _, err := api.CheckAuthed(c, true) + _, err := auth.Check(c, true) if err != nil { return c.Redirect("/") } table := c.Params("table") @@ -110,7 +110,7 @@ func GetPageInsert(c *fiber.Ctx) error { } func GetApiInsert(c *fiber.Ctx) error { - _, err := api.CheckAuthed(c, true) + _, err := auth.Check(c, true) if err != nil { return c.Redirect("/") } table := c.Params("table") @@ -120,7 +120,7 @@ func GetApiInsert(c *fiber.Ctx) error { } func PostApiInsert(c *fiber.Ctx) error { - _, err := api.CheckAuthed(c, true) + _, err := auth.Check(c, true) if err != nil { return c.Redirect("/") } table := c.Params("table") @@ -136,7 +136,7 @@ func PostApiInsert(c *fiber.Ctx) error { } func DeleteApi(c *fiber.Ctx) error { - _, err := api.CheckAuthed(c, true) + _, err := auth.Check(c, true) if err != nil { return c.Redirect("/") } table := c.Params("table") @@ -151,7 +151,7 @@ func DeleteApi(c *fiber.Ctx) error { } func GetPageAdminIndex(c *fiber.Ctx) error { - _, err := api.CheckAuthed(c, true) + _, err := auth.Check(c, true) if err != nil { return c.Redirect("/") } return c.Render("admin/table/index", fiber.Map{}) diff --git a/api/handlers.go b/api/handlers.go index 200840f..21e69bd 100644 --- a/api/handlers.go +++ b/api/handlers.go @@ -11,11 +11,9 @@ import ( "MY/webapp/data" . "MY/webapp/common" + "MY/webapp/auth" ) -var STORE *session.Store - - func GetApiStream(c *fiber.Ctx) error { sql, args, err := sq.Select("*").From("stream").ToSql() err = data.SelectJson[data.Stream](c, err, sql, args...) @@ -45,7 +43,7 @@ func PostApiLink(c *fiber.Ctx) error { var sql string var args []interface{} - _, err := CheckAuthed(c, false) + _, err := auth.Check(c, false) if err != nil { return c.Redirect("/login/") } link, err := ReceivePost[data.Link](c) @@ -95,12 +93,6 @@ func Setup(app *fiber.App) { app.Get("/api/stream/:id", GetApiStreamId) app.Get("/api/stream/:id/links", GetApiStreamIdLinks) app.Post("/api/link", PostApiLink) - - // api/auth.go - app.Get("/api/authcheck", GetApiAuthCheck) - app.Get("/api/logout", GetApiLogout) - app.Post("/api/register", PostApiRegister) - app.Post("/api/login", PostApiLogin) } func Shutdown() { diff --git a/auth/handlers.go b/auth/handlers.go new file mode 100644 index 0000000..11e88d0 --- /dev/null +++ b/auth/handlers.go @@ -0,0 +1,73 @@ +package auth + +import ( + "github.com/gofiber/fiber/v2" + _ "github.com/mattn/go-sqlite3" + sq "github.com/Masterminds/squirrel" + + "MY/webapp/data" + . "MY/webapp/common" +) + +func GetApiAuthCheck(c *fiber.Ctx) error { + _, err := Check(c, false) + // auth failure or not authed is determined by err, with nil meaning YES AUTHED + return c.JSON(fiber.Map{"is_authed": err == nil}) +} + +func GetApiLogout(c *fiber.Ctx) error { + err := LogoutUser(c) + if err != nil { return IfErrNil(err, c) } + + return c.Redirect("/") +} + +func PostApiRegister(c *fiber.Ctx) error { + user, err := ReceivePost[data.User](c) + if err != nil { return IfErrNil(err, c) } + + err = SetUserPassword(user) + if err != nil { return IfErrNil(err, c) } + + sql, args, err := sq.Insert("user"). + Columns("username", "email", "password"). + Values(user.Username, user.Email, user.Password).ToSql() + + _, err = data.Exec(err, sql, args...) + if err != nil { return IfErrNil(err, c) } + + return c.Redirect("/login/") +} + +func PostApiLogin(c *fiber.Ctx) error { + var user data.User + + login, err := ReceivePost[data.Login](c) + if(err != nil) { return IfErrNil(err, c) } + + pass_good, err := LoginUser(&user, login) + if err != nil { return IfErrNil(err, c) } + + if pass_good { + sess, err := STORE.Get(c) + if err != nil { return IfErrNil(err, c) } + + sess.Set("user_id", user.Id) + sess.Set("authenticated", true) + sess.Set("admin", IsAdmin(&user)) + err = sess.Save() + if err != nil { return IfErrNil(err, c) } + + return c.Redirect("/") + } else { + return c.Redirect("/login/") + } +} + + +func Setup(app *fiber.App) { + app.Get("/api/authcheck", GetApiAuthCheck) + app.Get("/api/logout", GetApiLogout) + app.Post("/api/register", PostApiRegister) + app.Post("/api/login", PostApiLogin) +} diff --git a/api/auth.go b/auth/helpers.go similarity index 50% rename from api/auth.go rename to auth/helpers.go index 6d57933..a463f06 100644 --- a/api/auth.go +++ b/auth/helpers.go @@ -1,4 +1,4 @@ -package api +package auth import ( "errors" @@ -12,79 +12,21 @@ import ( "MY/webapp/data" "MY/webapp/config" - . "MY/webapp/common" + "MY/webapp/common" ) -func GetApiAuthCheck(c *fiber.Ctx) error { - _, err := CheckAuthed(c, false) - // auth failure or not authed is determined by err, with nil meaning YES AUTHED - return c.JSON(fiber.Map{"is_authed": err == nil}) -} - -func GetApiLogout(c *fiber.Ctx) error { - err := LogoutUser(c) - if err != nil { return IfErrNil(err, c) } - - return c.Redirect("/") -} - -func PostApiRegister(c *fiber.Ctx) error { - user, err := ReceivePost[data.User](c) - if err != nil { return IfErrNil(err, c) } - - err = SetUserPassword(user) - if err != nil { return IfErrNil(err, c) } - - sql, args, err := sq.Insert("user"). - Columns("username", "email", "password"). - Values(user.Username, user.Email, user.Password).ToSql() - - _, err = data.Exec(err, sql, args...) - if err != nil { return IfErrNil(err, c) } - - return c.Redirect("/login/") -} - -func PostApiLogin(c *fiber.Ctx) error { - var user data.User - - login, err := ReceivePost[data.Login](c) - if(err != nil) { return IfErrNil(err, c) } - - pass_good, err := LoginUser(&user, login) - if err != nil { return IfErrNil(err, c) } - - if pass_good { - sess, err := STORE.Get(c) - if err != nil { return IfErrNil(err, c) } - - sess.Set("user_id", user.Id) - sess.Set("authenticated", true) - sess.Set("admin", IsAdmin(&user)) - err = sess.Save() - if err != nil { return IfErrNil(err, c) } - - return c.Redirect("/") - } else { - return c.Redirect("/login/") - } -} - func IsAdmin(user *data.User) bool { return user.Username == config.Settings.Admin } -func CheckAuthed(c *fiber.Ctx, needs_admin bool) (*session.Session, error) { - sess, err := STORE.Get(c) +func Check(c *fiber.Ctx, needs_admin bool) (*session.Session, error) { + sess, err := common.STORE.Get(c) if err != nil { return sess, err } // BUG: this has to come from the databse, just temporary admin := sess.Get("admin") == true authed := sess.Get("authenticated") == true - log.Printf("session admin=%v, session authed=%v, needs_admin = %v", - sess.Get("admin"), sess.Get("authenticated"), needs_admin) - if needs_admin { authed = admin && authed log.Printf("after needs_admin block: authed=%v", authed) @@ -100,7 +42,7 @@ func CheckAuthed(c *fiber.Ctx, needs_admin bool) (*session.Session, error) { } func LogoutUser(c *fiber.Ctx) error { - sess, err := STORE.Get(c) + sess, err := common.STORE.Get(c) if err != nil { return err } err = sess.Destroy() diff --git a/common/web.go b/common/web.go index fe2686c..ffcdcd1 100644 --- a/common/web.go +++ b/common/web.go @@ -3,8 +3,11 @@ package common import ( "strings" "github.com/gofiber/fiber/v2" + "github.com/gofiber/fiber/v2/middleware/session" ) +var STORE *session.Store + func Page(path string) (func(c *fiber.Ctx) error) { page_id := strings.ReplaceAll(path, "/", "-") + "-page" diff --git a/go.mod b/go.mod index b1ca567..285b6d4 100644 --- a/go.mod +++ b/go.mod @@ -55,7 +55,7 @@ require ( gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/yaml.v3 v3.0.1 // indirect lcthw.dev/go/ozai v0.1.0 // indirect - lcthw.dev/go/ssgod v0.1.0 // indirect + lcthw.dev/go/ssgod v0.2.2 // indirect ) tool ( diff --git a/go.sum b/go.sum index ecba37e..0027c80 100644 --- a/go.sum +++ b/go.sum @@ -123,11 +123,7 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EV gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -lcthw.dev/go/ozai v0.0.0-20250914152405-53a1959fe44e h1:EAbBnwzBlusAOOs/Cq6QXbhhmMxaO7bsilKk6mU8oIc= -lcthw.dev/go/ozai v0.0.0-20250914152405-53a1959fe44e/go.mod h1:AwxRrUAb/KtUzSWgKmhv/eBg6ZjJ4tVZ9YA/DlKqtWs= lcthw.dev/go/ozai v0.1.0 h1:LNuLMZV4m+ciHRjf1atcunR/63Jguvz3puEzD5vmFec= lcthw.dev/go/ozai v0.1.0/go.mod h1:AwxRrUAb/KtUzSWgKmhv/eBg6ZjJ4tVZ9YA/DlKqtWs= -lcthw.dev/go/ssgod v0.0.0-20250910143122-4457e9bad2af h1:PN/XR1qhfxTn32AGOdQgyBPJs0qqnWVLcPxE5IUENgM= -lcthw.dev/go/ssgod v0.0.0-20250910143122-4457e9bad2af/go.mod h1:c0cAznS0qaDUOIGU8nKODfuFLwemEi/KGDCf8guTleA= -lcthw.dev/go/ssgod v0.1.0 h1:b1YkIc7hEgUen8zF85ZRG5YCyCeFAvx1KtmNFp1OuMg= -lcthw.dev/go/ssgod v0.1.0/go.mod h1:c0cAznS0qaDUOIGU8nKODfuFLwemEi/KGDCf8guTleA= +lcthw.dev/go/ssgod v0.2.2 h1:lvzhxOXDka9iejIQj7Db7ePjruBqYvqe7A5zzxsdank= +lcthw.dev/go/ssgod v0.2.2/go.mod h1:fCe4J/00a3T4pURfpUp6LZlkUeh5eHDpjApvy6HHiPk= diff --git a/pages/sitemap.html b/pages/sitemap.html new file mode 100644 index 0000000..b1517d9 --- /dev/null +++ b/pages/sitemap.html @@ -0,0 +1,9 @@ +