From 98a725caa4e1fd807eb59cb21f060e76c1b8ea99 Mon Sep 17 00:00:00 2001 From: Tueem Date: Sat, 17 Jan 2026 21:40:17 +0100 Subject: [PATCH] feat(auth): add database and auth token generation + storage --- .gitignore | 3 +- cmd/svg-templater/main.go | 42 +++++++++++++++++++++++++ go.mod | 15 ++++++++- go.sum | 21 +++++++++++++ internal/database/database.go | 34 ++++++++++++++++++++ internal/database/tokendb.go | 38 ++++++++++++++++++++++ internal/svg-templater/tokencommands.go | 34 ++++++++++++++++++++ main.go | 5 --- pkg/auth/auth.go | 28 +++++++++++++++++ 9 files changed, 213 insertions(+), 7 deletions(-) create mode 100644 cmd/svg-templater/main.go create mode 100644 internal/database/database.go create mode 100644 internal/database/tokendb.go create mode 100644 internal/svg-templater/tokencommands.go delete mode 100644 main.go create mode 100644 pkg/auth/auth.go diff --git a/.gitignore b/.gitignore index 51782d7..c0f5120 100644 --- a/.gitignore +++ b/.gitignore @@ -23,4 +23,5 @@ go.work go.work.sum # env file -.env \ No newline at end of file +.env +storage.db diff --git a/cmd/svg-templater/main.go b/cmd/svg-templater/main.go new file mode 100644 index 0000000..878cd7c --- /dev/null +++ b/cmd/svg-templater/main.go @@ -0,0 +1,42 @@ +package main + +import ( + "flag" + "log" + + "tomatentum.net/svg-templater/internal/database" + svgtemplater "tomatentum.net/svg-templater/internal/svg-templater" +) + +var ( + generateTokenFlag bool + deleteTokenFlag bool +) + +func main() { + if err := database.OpenSQLite(); err != nil { + log.Fatal("Failed opening DB:\n", err) + return + } + database.InitDB() + prepareCommandLine() + handleCommandline() + defer database.Close() +} + +func prepareCommandLine() { + flag.BoolVar(&generateTokenFlag, "tokengen", false, "svg-templater --tokengen : Generate token with name") + flag.BoolVar(&deleteTokenFlag, "tokendel", false, "svg-templater --tokendel : Delete token with name") +} + +func handleCommandline() { + flag.Parse() + if generateTokenFlag { + svgtemplater.GenerateTokenCommand() + } else if deleteTokenFlag { + svgtemplater.DeleteTokenCommand() + } else { + log.Println("No commend provided!") + flag.PrintDefaults() + } +} diff --git a/go.mod b/go.mod index b6daaef..231ae21 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,16 @@ -module svg-templater +module tomatentum.net/svg-templater go 1.24.9 + +require ( + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/glebarez/go-sqlite v1.22.0 // indirect + github.com/google/uuid v1.5.0 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect + golang.org/x/sys v0.15.0 // indirect + modernc.org/libc v1.37.6 // indirect + modernc.org/mathutil v1.6.0 // indirect + modernc.org/memory v1.7.2 // indirect + modernc.org/sqlite v1.28.0 // indirect +) diff --git a/go.sum b/go.sum index e69de29..6c1a0f6 100644 --- a/go.sum +++ b/go.sum @@ -0,0 +1,21 @@ +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/glebarez/go-sqlite v1.22.0 h1:uAcMJhaA6r3LHMTFgP0SifzgXg46yJkgxqyuyec+ruQ= +github.com/glebarez/go-sqlite v1.22.0/go.mod h1:PlBIdHe0+aUEFn+r2/uthrWq4FxbzugL0L8Li6yQJbc= +github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= +github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +modernc.org/libc v1.37.6 h1:orZH3c5wmhIQFTXF+Nt+eeauyd+ZIt2BX6ARe+kD+aw= +modernc.org/libc v1.37.6/go.mod h1:YAXkAZ8ktnkCKaN9sw/UDeUVkGYJ/YquGO4FTi5nmHE= +modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= +modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= +modernc.org/memory v1.7.2 h1:Klh90S215mmH8c9gO98QxQFsY+W451E8AnzjoE2ee1E= +modernc.org/memory v1.7.2/go.mod h1:NO4NVCQy0N7ln+T9ngWqOQfi7ley4vpwvARR+Hjw95E= +modernc.org/sqlite v1.28.0 h1:Zx+LyDDmXczNnEQdvPuEfcFVA2ZPyaD7UCZDjef3BHQ= +modernc.org/sqlite v1.28.0/go.mod h1:Qxpazz0zH8Z1xCFyi5GSL3FzbtZ3fvbjmywNogldEW0= diff --git a/internal/database/database.go b/internal/database/database.go new file mode 100644 index 0000000..bb84d0b --- /dev/null +++ b/internal/database/database.go @@ -0,0 +1,34 @@ +package database + +import ( + "database/sql" + "log" + + _ "github.com/glebarez/go-sqlite" +) + +const FILENAME string = "storage.db" + +var database *sql.DB + +func OpenSQLite() error { + db, err := sql.Open("sqlite", FILENAME) + if err != nil { + return err + } + log.Println("Successfully connected to SQLite Database") + database = db + return nil +} + +func InitDB() { + _, err := database.Exec(TOKENTABLECREATE) + if err != nil { + log.Fatal("Failed to init database:\n", err) + } + log.Println("Successfully initiated the Database!") +} + +func Close() error { + return database.Close() +} diff --git a/internal/database/tokendb.go b/internal/database/tokendb.go new file mode 100644 index 0000000..cccdc16 --- /dev/null +++ b/internal/database/tokendb.go @@ -0,0 +1,38 @@ +package database + +const TOKENTABLECREATE string = ` + CREATE TABLE IF NOT EXISTS tokens ( + name varchar(32) PRIMARY KEY NOT NULL, + token varchar(32) NOT NULL + );` + +const INSERTTOKENSQL string = "INSERT INTO tokens VALUES (?, ?);" +const DELETETOKENSQL string = "DELETE FROM tokens WHERE name = ?;" +const QUERYTOKENSQL string = "SELECT token FROM tokens;" + +func InsertToken(name string, token string) error { + _, err := database.Exec(INSERTTOKENSQL, name, token) + return err +} + +func DeleteToken(name string) error { + _, err := database.Exec(DELETETOKENSQL, name) + return err +} + +func ValidateToken(token string) (bool, error) { + result, err := database.Query(QUERYTOKENSQL) + if err != nil { + return false, err + } + defer result.Close() + + var foundToken string + for result.Next() { + result.Scan(&token) + if token == foundToken { + return true, nil + } + } + return false, nil +} diff --git a/internal/svg-templater/tokencommands.go b/internal/svg-templater/tokencommands.go new file mode 100644 index 0000000..73b096d --- /dev/null +++ b/internal/svg-templater/tokencommands.go @@ -0,0 +1,34 @@ +package svgtemplater + +import ( + "flag" + "log" + + "tomatentum.net/svg-templater/pkg/auth" +) + +func GenerateTokenCommand() { + name := flag.Arg(0) + if name == "" { + log.Fatal("No Token Name was provided!") + } + + token, err := auth.CreateToken(name) + if err != nil { + log.Fatal("Failed to generate token:\n", err) + } + log.Println(token) +} + +func DeleteTokenCommand() { + name := flag.Arg(0) + if name == "" { + log.Fatal("No Token Name was provided!") + } + + err := auth.DeleteToken(name) + if err != nil { + log.Fatal("Failed to delete token:\n", err) + } + log.Println("Deleted token " + name) +} diff --git a/main.go b/main.go deleted file mode 100644 index 9fb85d7..0000000 --- a/main.go +++ /dev/null @@ -1,5 +0,0 @@ -package main - -func main() { - println("Hello World") -} diff --git a/pkg/auth/auth.go b/pkg/auth/auth.go new file mode 100644 index 0000000..86aafa7 --- /dev/null +++ b/pkg/auth/auth.go @@ -0,0 +1,28 @@ +package auth + +import ( + "crypto/rand" + "encoding/hex" + "log" + + "tomatentum.net/svg-templater/internal/database" +) + +func generateToken() string { + token := make([]byte, 32) + if _, err := rand.Read(token); err != nil { + log.Fatal("Failed to generate Token:\n", err) + return "" + } + return hex.EncodeToString(token) +} + +func CreateToken(name string) (string, error) { + token := generateToken() + err := database.InsertToken(name, token) + return token, err +} + +func DeleteToken(name string) error { + return database.DeleteToken(name) +} -- 2.49.1