rethought the auth system and realized that it was bullshit

This commit is contained in:
Siesta
2025-07-17 22:14:11 +02:00
parent 77120bce29
commit fe9841b4e1
8 changed files with 53 additions and 86 deletions
+5 -24
View File
@@ -24,17 +24,17 @@ func ConnectDB() {
flag.Parse() flag.Parse()
if *resetAdmin { if *resetAdmin {
ResetAdmin() DeleteController(0)
} }
} }
func InitDB() { func InitDB() {
// Legacy purposes, DELETE
_, err := DB.Exec(` _, err := DB.Exec(`
CREATE TABLE IF NOT EXISTS lamp_state ( CREATE TABLE IF NOT EXISTS controllers (
id TEXT PRIMARY KEY, id TEXT PRIMARY KEY,
color TEXT NOT NULL, token_hash TEXT,
updated_at DATETIME NOT NULL color TEXT,
updated_at DATETIME
); );
`) `)
@@ -42,23 +42,4 @@ func InitDB() {
logger.DBLogger.Fatalf("An error occured while initializing the database: %v", err) logger.DBLogger.Fatalf("An error occured while initializing the database: %v", err)
} }
_, err = DB.Exec(`
CREATE TABLE IF NOT EXISTS controllers (
id INTEGER PRIMARY KEY,
token_hash TEXT NOT NULL,
color TEXT,
updated_at DATETIME
);`)
if err != nil {
logger.DBLogger.Fatalf("An error occured while initializing the database: %v", err)
}
_, err = DB.Exec(`
CREATE TABLE IF NOT EXISTS permissions (
controller_id INTEGER,
target_id INTEGER
);`)
if err != nil {
logger.DBLogger.Fatalf("An error occured while initializing the database: %v", err)
}
} }
+10 -31
View File
@@ -9,46 +9,25 @@ import (
"golang.org/x/crypto/bcrypt" "golang.org/x/crypto/bcrypt"
) )
func CreateController(target int) (string, int, error) { func CreateController(id int) string {
token, _ := utils.GenerateToken() token, _ := utils.GenerateToken()
hash, _ := utils.HashToken(token) hash, _ := utils.HashToken(token)
var maxID int _, err := DB.Exec("INSERT INTO controllers (id, token_hash) VALUES (?, ?)", id, hash)
stmt := DB.QueryRow("SELECT COALESCE(MAX(id), 0) FROM controllers")
stmt.Scan(&maxID)
id := maxID + 1
_, err := DB.Exec("INSERT INTO controllers VALUES (?, ?, '#FFFFFF', CURRENT_TIMESTAMP)", id, hash)
if err != nil { if err != nil {
logger.DBLogger.Printf("Failed to create a new controller: %v", err) logger.DBLogger.Fatalf("Error creating controller with ID %v: %s",id, err)
return "", id, err
}
_, err = DB.Exec("INSERT INTO permissions VALUES (?, ?) ", id, target)
if err != nil {
logger.DBLogger.Printf("Failed to set permissions for %d: %v", id, err)
return token, id, err
}
return token, id, nil
}
func CreateAdmin() string {
token, _ := utils.GenerateToken()
hash, _ := utils.HashToken(token)
_, err := DB.Exec("INSERT INTO controllers (id, token_hash) VALUES (0, ?)", hash)
if err != nil {
logger.DBLogger.Fatalf("Error creating admin user: %s", err)
} }
return token return token
} }
func ResetAdmin() { func DeleteController(id int) error {
_, err := DB.Exec("DELETE FROM controllers WHERE id = 0") _, err := DB.Exec("DELETE FROM controllers WHERE id = ?", id)
if err != nil { if err != nil {
logger.DBLogger.Printf("An error occured while resetting the admin account: %s", err) logger.DBLogger.Printf("An error occured while deleting the controller %v: %s", id, err)
return err
} }
return nil
} }
func IsAdmin(token string) bool { func IsAdmin(token string) bool {
@@ -76,7 +55,7 @@ func ControllerExists(id int) bool {
} }
func ViewColor(id int) (*models.LampState, error) { func ViewColor(id int) (*models.LampState, error) {
row := DB.QueryRow("SELECT * FROM lamp_state WHERE id = ?", id) row := DB.QueryRow("SELECT id, color, updated_at FROM controllers WHERE id = ?", id)
var state models.LampState var state models.LampState
err := row.Scan(&state.ID, &state.Color, &state.UpdatedAt) err := row.Scan(&state.ID, &state.Color, &state.UpdatedAt)
@@ -101,7 +80,7 @@ func SetColor(id int, color string) error {
return nil return nil
} }
_, err = DB.Exec("UPDATE lamp_state SET color = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?", color, id) _, err = DB.Exec("UPDATE controllers SET color = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?", color, id)
if err != nil { if err != nil {
logger.DBLogger.Printf("Failed to update lamp %d: %v", id, err) logger.DBLogger.Printf("Failed to update lamp %d: %v", id, err)
return err return err
+2 -3
View File
@@ -12,11 +12,10 @@ import (
func StartHTTPServer() { func StartHTTPServer() {
router := http.NewServeMux() router := http.NewServeMux()
routes.RegisterUserRoutes(router) routes.RegisterRoutes(router)
routes.RegisterAdminRoutes(router)
if !db.ControllerExists(0) { if !db.ControllerExists(0) {
adminToken := db.CreateAdmin() adminToken := db.CreateController(0)
fmt.Println("IMPORTANT") fmt.Println("IMPORTANT")
fmt.Println("- - - - - - - - - - - - - - - - - - ") fmt.Println("- - - - - - - - - - - - - - - - - - ")
fmt.Println("ADMIN TOKEN:") fmt.Println("ADMIN TOKEN:")
+1
View File
@@ -8,6 +8,7 @@ type HTTPConfig struct {
Cooldown float64 `json:"cooldown"` Cooldown float64 `json:"cooldown"`
} }
type Config struct { type Config struct {
HTTP HTTPConfig `json:"http"` HTTP HTTPConfig `json:"http"`
FileLogging bool `json:"fileLogging"` FileLogging bool `json:"fileLogging"`
-21
View File
@@ -1,21 +0,0 @@
package routes
import (
"net/http"
"github.com/siestaw/laterna/server/cmd/internal/db"
"github.com/siestaw/laterna/server/cmd/utils"
)
func RegisterAdminRoutes(mux *http.ServeMux) {
mux.HandleFunc("POST /api/v1/admin/controllers", createController)
}
func createController(w http.ResponseWriter, r *http.Request) {
auth := r.Header.Get("Authorization")
if !db.IsAdmin(auth) {
utils.HTTPErrorHandling(w, r, http.StatusUnauthorized, "Invalid token")
return
}
}
@@ -12,12 +12,22 @@ import (
"github.com/siestaw/laterna/server/cmd/utils" "github.com/siestaw/laterna/server/cmd/utils"
) )
func RegisterUserRoutes(mux *http.ServeMux) { func RegisterRoutes(mux *http.ServeMux) {
mux.HandleFunc("GET /api/v1/id/{ID}", getCurrent) mux.HandleFunc("GET /api/v1/id/{ID}", getCurrent)
mux.HandleFunc("PUT /api/v1/id/{ID}", setCurrent) mux.HandleFunc("PUT /api/v1/id/{ID}", setCurrent)
mux.HandleFunc("GET /api/v1/controllers", getControllers)
mux.HandleFunc("PUT /api/v1/controllers", setControllers)
mux.HandleFunc("DELETE /api/v1/controllers/{id}", deleteController)
} }
func getCurrent(w http.ResponseWriter, r *http.Request) { func getCurrent(w http.ResponseWriter, r *http.Request) {
token := r.Header.Get("Authorization")
if !db.IsAdmin(token) {
utils.HTTPErrorHandling(w, r, http.StatusUnauthorized, "Invalid token")
return
}
idStr := r.PathValue("ID") idStr := r.PathValue("ID")
id, err := utils.IDtoInt(idStr) id, err := utils.IDtoInt(idStr)
if err != nil { if err != nil {
@@ -37,6 +47,12 @@ func getCurrent(w http.ResponseWriter, r *http.Request) {
} }
func setCurrent(w http.ResponseWriter, r *http.Request) { func setCurrent(w http.ResponseWriter, r *http.Request) {
token := r.Header.Get("Authorization")
if !db.IsAdmin(token) {
utils.HTTPErrorHandling(w, r, http.StatusUnauthorized, "Invalid token")
return
}
idStr := r.PathValue("ID") idStr := r.PathValue("ID")
id, err := utils.IDtoInt(idStr) id, err := utils.IDtoInt(idStr)
if err != nil { if err != nil {
@@ -76,3 +92,15 @@ func setCurrent(w http.ResponseWriter, r *http.Request) {
json.NewEncoder(w).Encode(updatedState) json.NewEncoder(w).Encode(updatedState)
defer r.Body.Close() defer r.Body.Close()
} }
func getControllers(w http.ResponseWriter, r *http.Request) {
return
}
func setControllers(w http.ResponseWriter, r *http.Request) {
return
}
func deleteController(w http.ResponseWriter, r *http.Request) {
return
}
+3 -2
View File
@@ -19,8 +19,8 @@ func IDtoInt(id string) (int, error) {
if err != nil { if err != nil {
return 0, errors.New("invalid ID format") return 0, errors.New("invalid ID format")
} }
if idInt < 0 { if idInt <= 0 {
return 0, errors.New("ID must not be negative") return 0, errors.New("invalid ID")
} }
return idInt, nil return idInt, nil
} }
@@ -31,6 +31,7 @@ func IsValidHexColor(color string) bool {
return match return match
} }
func GenerateToken() (string, error) { func GenerateToken() (string, error) {
bytes := make([]byte, 32) bytes := make([]byte, 32)
if _, err := rand.Read(bytes); err != nil { if _, err := rand.Read(bytes); err != nil {
+2 -3
View File
@@ -1,9 +1,8 @@
{ {
"fileLogging": false, "fileLogging": false,
"verboseLogging": true, "verboseLogging": true, // // not fully implemented yet
"http": { "http": {
"adminToken": "",
"port": 8080, "port": 8080,
"cooldown": 5, "cooldown": 5
} }
} }