Merge pull request 'Add HTTP Server' (#6) from feat/http into dev
All checks were successful
build / Go-Build (push) Successful in 27s

Reviewed-on: #6
This commit was merged in pull request #6.
This commit is contained in:
2026-01-23 21:27:45 +00:00
3 changed files with 74 additions and 7 deletions

View File

@@ -2,10 +2,13 @@ package main
import (
"flag"
"fmt"
"log"
"net/http"
"tomatentum.net/svg-templater/internal/database"
svgtemplater "tomatentum.net/svg-templater/internal/svg-templater"
"tomatentum.net/svg-templater/pkg/auth"
)
var (
@@ -18,10 +21,11 @@ func main() {
log.Fatal("Failed opening DB:\n", err)
return
}
defer database.Close()
database.InitDB()
prepareCommandLine()
prepareHTTP()
handleCommandline()
defer database.Close()
}
func prepareCommandLine() {
@@ -29,6 +33,12 @@ func prepareCommandLine() {
flag.BoolVar(&deleteTokenFlag, "tokendel", false, "svg-templater --tokendel <name> : Delete token with name")
}
func prepareHTTP() {
http.HandleFunc("/", auth.AuthMiddleware(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "You are authorized!")
})))
}
func handleCommandline() {
flag.Parse()
if generateTokenFlag {
@@ -36,7 +46,7 @@ func handleCommandline() {
} else if deleteTokenFlag {
svgtemplater.DeleteTokenCommand()
} else {
log.Println("No commend provided!")
flag.PrintDefaults()
log.Println("Starting http server on :3000")
http.ListenAndServe(":3000", nil)
}
}

View File

@@ -1,5 +1,9 @@
package database
import (
"maps"
)
const TOKENTABLECREATE string = `
CREATE TABLE IF NOT EXISTS tokens (
name varchar(32) PRIMARY KEY NOT NULL,
@@ -8,7 +12,9 @@ const TOKENTABLECREATE string = `
const INSERTTOKENSQL string = "INSERT INTO tokens VALUES (?, ?);"
const DELETETOKENSQL string = "DELETE FROM tokens WHERE name = ?;"
const QUERYTOKENSQL string = "SELECT token FROM tokens;"
const QUERYTOKENSQL string = "SELECT * FROM tokens;"
var tokenCache map[string]string = make(map[string]string)
func InsertToken(name string, token string) error {
_, err := database.Exec(INSERTTOKENSQL, name, token)
@@ -20,6 +26,15 @@ func DeleteToken(name string) error {
return err
}
func ValidateTokenCache(token string) (bool, error) {
for v := range maps.Values(tokenCache) {
if token == v {
return true, nil
}
}
return ValidateToken(token)
}
func ValidateToken(token string) (bool, error) {
result, err := database.Query(QUERYTOKENSQL)
if err != nil {
@@ -27,12 +42,14 @@ func ValidateToken(token string) (bool, error) {
}
defer result.Close()
var foundToken string
var name, foundToken string
for result.Next() {
result.Scan(&token)
result.Scan(&name, &foundToken)
tokenCache[name] = foundToken
if token == foundToken {
return true, nil
}
}
return false, nil
err = result.Err()
return false, err
}

View File

@@ -0,0 +1,40 @@
package auth
import (
"log"
"net/http"
"strings"
"tomatentum.net/svg-templater/internal/database"
)
func AuthMiddleware(next http.Handler) http.HandlerFunc {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
valid, err := validateAuthHeader(r)
if err != nil {
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
log.Println("Database Query for token validation failed.\n", r)
return
}
if valid {
next.ServeHTTP(w, r)
} else {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
}
})
}
// Accepts ("Authorization": "BEARER <TOKEN>"), returns database error if query failed
func validateAuthHeader(r *http.Request) (bool, error) {
header := strings.Split(r.Header.Get("Authorization"), " ")
if len(header) < 2 {
return false, nil
}
token := header[1]
if len(strings.TrimSpace(token)) < 1 {
return false, nil
}
return database.ValidateTokenCache(token)
}