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

View File

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