Basic functionality
This commit is contained in:
52
routes/auth.go
Normal file
52
routes/auth.go
Normal file
@ -0,0 +1,52 @@
|
||||
package routes
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"gitea.henriburau.de/haw-lan/cod4watcher/services"
|
||||
"gitea.henriburau.de/haw-lan/cod4watcher/views/auth"
|
||||
)
|
||||
|
||||
func (s *Server) HandleLogin(w http.ResponseWriter, r *http.Request) error {
|
||||
return Render(w, r, auth.LoginForm(auth.LoginFormValues{}, map[string]string{}))
|
||||
}
|
||||
|
||||
func (s *Server) HandleSignin(w http.ResponseWriter, r *http.Request) error {
|
||||
r.ParseForm()
|
||||
|
||||
creds := services.Credentials{
|
||||
Username: r.FormValue("username"),
|
||||
Password: r.FormValue("password"),
|
||||
}
|
||||
|
||||
token, expiresIn, err := services.Signin(creds)
|
||||
if err != nil {
|
||||
errors := map[string]string{
|
||||
"username": "username or password incorrect" + err.Error(),
|
||||
"password": "username or password incorrect" + err.Error(),
|
||||
}
|
||||
return Render(w, r, auth.LoginForm(auth.LoginFormValues{
|
||||
Username: creds.Username,
|
||||
Password: creds.Password,
|
||||
}, errors))
|
||||
}
|
||||
|
||||
http.SetCookie(w, &http.Cookie{
|
||||
Name: "session_token",
|
||||
Value: token,
|
||||
Expires: expiresIn,
|
||||
})
|
||||
|
||||
return hxRedirect(w, r, "/")
|
||||
}
|
||||
|
||||
func (s *Server) HandleLogout(w http.ResponseWriter, r *http.Request) error {
|
||||
http.SetCookie(w, &http.Cookie{
|
||||
Name: "session_token",
|
||||
Value: "",
|
||||
Expires: time.Time{},
|
||||
})
|
||||
|
||||
return hxRedirect(w, r, "/")
|
||||
}
|
||||
62
routes/auth_middleware.go
Normal file
62
routes/auth_middleware.go
Normal file
@ -0,0 +1,62 @@
|
||||
package routes
|
||||
|
||||
import (
|
||||
"context"
|
||||
"log/slog"
|
||||
"net/http"
|
||||
|
||||
"gitea.henriburau.de/haw-lan/cod4watcher/services"
|
||||
"gitea.henriburau.de/haw-lan/cod4watcher/views"
|
||||
)
|
||||
|
||||
func OnlyAuthenticatedMiddleware(next http.Handler) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
session, err := getSession(r)
|
||||
if err != nil {
|
||||
slog.Error("failed to optain session", "err", err)
|
||||
}
|
||||
|
||||
if session != nil {
|
||||
next.ServeHTTP(w, r)
|
||||
}
|
||||
|
||||
w.WriteHeader(http.StatusUnauthorized)
|
||||
})
|
||||
}
|
||||
|
||||
func AuthMiddleware(next http.Handler) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
session, err := getSession(r)
|
||||
if err != nil {
|
||||
slog.Error("error getting token", "err", err)
|
||||
}
|
||||
username := ""
|
||||
if session != nil {
|
||||
username = session.Username
|
||||
}
|
||||
|
||||
ctx := context.WithValue(r.Context(), views.AuthContext, username)
|
||||
next.ServeHTTP(w, r.WithContext(ctx))
|
||||
})
|
||||
}
|
||||
|
||||
func getSession(r *http.Request) (*services.Session, error) {
|
||||
c, err := r.Cookie("session_token")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
sessionToken := c.Value
|
||||
|
||||
session, err := services.GetSession(sessionToken)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if session.IsExpired() {
|
||||
services.RemoveSession(sessionToken)
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
return session, nil
|
||||
}
|
||||
@ -7,6 +7,7 @@ import (
|
||||
|
||||
"gitea.henriburau.de/haw-lan/cod4watcher/models"
|
||||
"gitea.henriburau.de/haw-lan/cod4watcher/views/capture"
|
||||
"gitea.henriburau.de/haw-lan/cod4watcher/views/components"
|
||||
"github.com/go-chi/chi"
|
||||
)
|
||||
|
||||
@ -22,7 +23,52 @@ func (s *Server) HandleCapture(w http.ResponseWriter, r *http.Request) error {
|
||||
return err
|
||||
}
|
||||
|
||||
return Render(w, r, capture.Capture(foundCapture))
|
||||
return Render(w, r, capture.Capture(foundCapture, *foundCapture.MapScores.BuildTable()))
|
||||
}
|
||||
|
||||
func (s *Server) HandleCaptureTable(w http.ResponseWriter, r *http.Request) error {
|
||||
captureString := chi.URLParam(r, "captureID")
|
||||
captureID, err := strconv.ParseInt(captureString, 10, 64)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
foundCapture, err := s.cs.GetCaptureById(r.Context(), captureID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return Render(w, r, components.CaptureTable(*foundCapture.MapScores.BuildTable()))
|
||||
}
|
||||
|
||||
func (s *Server) HandleCaptureStart(w http.ResponseWriter, r *http.Request) error {
|
||||
captureString := chi.URLParam(r, "captureID")
|
||||
captureID, err := strconv.ParseInt(captureString, 10, 64)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = s.cs.StartCapture(r.Context(), captureID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return hxRedirect(w, r, "/")
|
||||
}
|
||||
|
||||
func (s *Server) HandleCaptureStop(w http.ResponseWriter, r *http.Request) error {
|
||||
captureString := chi.URLParam(r, "captureID")
|
||||
captureID, err := strconv.ParseInt(captureString, 10, 64)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = s.cs.StopCapture(r.Context(), captureID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return hxRedirect(w, r, "/")
|
||||
}
|
||||
|
||||
func (s *Server) HandleCaptureDelete(w http.ResponseWriter, r *http.Request) error {
|
||||
@ -58,7 +104,7 @@ func (s *Server) HandleCaptureCreate(w http.ResponseWriter, r *http.Request) err
|
||||
Start: time.Now(),
|
||||
}
|
||||
|
||||
_, err := s.cs.GetServerStatus(r.Context(), newCapture)
|
||||
_, err := s.c4s.GetServerStatus(newCapture.Host, newCapture.Port)
|
||||
if err != nil {
|
||||
errors["host"] = err.Error()
|
||||
errors["port"] = err.Error()
|
||||
|
||||
17
routes/cod4server.go
Normal file
17
routes/cod4server.go
Normal file
@ -0,0 +1,17 @@
|
||||
package routes
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"gitea.henriburau.de/haw-lan/cod4watcher/views/cod4server"
|
||||
)
|
||||
|
||||
func (s *Server) HandleServerStatus(w http.ResponseWriter, r *http.Request) error {
|
||||
status, err := s.c4s.GetServerStatus(r.URL.Query().Get("host"), r.URL.Query().Get("port"))
|
||||
if err != nil {
|
||||
w.WriteHeader(http.StatusBadRequest)
|
||||
return err
|
||||
}
|
||||
|
||||
return Render(w, r, cod4server.ServerStatus(status))
|
||||
}
|
||||
@ -3,17 +3,24 @@ package routes
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"gitea.henriburau.de/haw-lan/cod4watcher/models"
|
||||
"gitea.henriburau.de/haw-lan/cod4watcher/views"
|
||||
"gitea.henriburau.de/haw-lan/cod4watcher/views/home"
|
||||
"github.com/davecgh/go-spew/spew"
|
||||
)
|
||||
|
||||
func (s *Server) HandleHome(w http.ResponseWriter, r *http.Request) error {
|
||||
captureList, err := s.cs.GetActiveCapures(r.Context())
|
||||
|
||||
var captureList []models.Capture
|
||||
var err error
|
||||
if views.Username(r.Context()) != "" {
|
||||
captureList, err = s.cs.GetCaptures(r.Context())
|
||||
} else {
|
||||
captureList, err = s.cs.GetActiveCapures(r.Context())
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
spew.Dump(r.Context())
|
||||
|
||||
return Render(w, r, home.Index(captureList))
|
||||
}
|
||||
|
||||
@ -19,12 +19,13 @@ func Make(h HTTPHandler) http.HandlerFunc {
|
||||
}
|
||||
|
||||
type Server struct {
|
||||
cs *services.CaptureService
|
||||
cs *services.CaptureService
|
||||
c4s *services.CoD4Service
|
||||
}
|
||||
|
||||
func NewServer(cs *services.CaptureService) *Server {
|
||||
func NewServer(cs *services.CaptureService, c4s *services.CoD4Service) *Server {
|
||||
return &Server{
|
||||
cs,
|
||||
cs, c4s,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user