Merge pull request 'Add HTTP Server' (#6) from feat/http into dev
All checks were successful
build / Go-Build (push) Successful in 27s
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:
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
40
pkg/auth/authmiddleware.go
Normal file
40
pkg/auth/authmiddleware.go
Normal 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)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user