Basic functionality

This commit is contained in:
Henri Burau
2024-06-05 18:01:08 +02:00
parent 17f878f088
commit 72dce76e2b
41 changed files with 1568 additions and 176 deletions

90
services/authorization.go Normal file
View File

@ -0,0 +1,90 @@
package services
import (
"errors"
"time"
"github.com/golang-jwt/jwt"
)
var (
users = map[string]string{
"henri": "henri123",
}
secret = []byte("mein-secret")
)
type Session struct {
Username string
Expiry time.Time
}
type Credentials struct {
Password string
Username string
}
func (s Session) IsExpired() bool {
return s.Expiry.Before(time.Now())
}
func Signin(cred Credentials) (string, time.Time, error) {
expectedPassword, ok := users[cred.Username]
if !ok || expectedPassword != cred.Password {
return "", time.Time{}, errors.New("wrong password")
}
expiresAt := time.Now().Add(2 * time.Hour)
sessionToken, err := tokenFromSession(Session{
Username: cred.Username,
Expiry: expiresAt,
})
if err != nil {
return "", time.Time{}, err
}
return sessionToken, expiresAt, nil
}
func GetSession(sessionToken string) (*Session, error) {
return sessionFromToken(sessionToken)
}
func RemoveSession(sessionID string) {
}
func tokenFromSession(session Session) (string, error) {
token := jwt.NewWithClaims(jwt.SigningMethodHS256,
jwt.MapClaims{
"username": session.Username,
"exp": session.Expiry.Unix(),
})
return token.SignedString(secret)
}
func sessionFromToken(tokenString string) (*Session, error) {
sessionToken, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
return secret, nil
})
if err != nil {
return nil, err
}
if !sessionToken.Valid {
return nil, errors.New("invalid token")
}
if claims, ok := sessionToken.Claims.(jwt.MapClaims); ok {
expiresAt := time.Unix(int64(claims["exp"].(float64)), 0)
return &Session{
Username: claims["username"].(string),
Expiry: expiresAt,
}, nil
} else {
return nil, errors.New("cannot read claims")
}
}

View File

@ -2,7 +2,6 @@ package services
import (
"context"
"time"
"gitea.henriburau.de/haw-lan/cod4watcher/models"
)
@ -40,14 +39,30 @@ func (cs *CaptureService) GetActiveCapures(ctx context.Context) ([]models.Captur
return result, nil
}
func (cs *CaptureService) GetCaptures(ctx context.Context) ([]models.Capture, error) {
return cs.p.GetCaptures(ctx)
}
func (cs *CaptureService) GetServerStatus(ctx context.Context, capture *models.Capture) (*models.CoD4ServerStatus, error) {
server, err := models.NewCOD4ServerStatus(capture.Host, capture.Port, time.Second)
func (cs *CaptureService) StartCapture(ctx context.Context, id int64) error {
capture, err := cs.p.GetCapturesByID(ctx, id)
if err != nil {
return nil, err
return err
}
return server.GetServerStatus()
capture.Active = true
return cs.p.UpdateCapture(ctx, capture)
}
func (cs *CaptureService) StopCapture(ctx context.Context, id int64) error {
capture, err := cs.p.GetCapturesByID(ctx, id)
if err != nil {
return err
}
capture.Active = false
return cs.p.UpdateCapture(ctx, capture)
}
func (cs *CaptureService) GetCaptureById(ctx context.Context, id int64) (*models.Capture, error) {

21
services/cod4server.go Normal file
View File

@ -0,0 +1,21 @@
package services
import (
"time"
"gitea.henriburau.de/haw-lan/cod4watcher/models"
)
type CoD4Service struct {
p models.StatusProvider
}
func NewCoD4Server(p models.StatusProvider) (*CoD4Service, error) {
return &CoD4Service{
p,
}, nil
}
func (s *CoD4Service) GetServerStatus(host, port string) (*models.CoD4ServerStatus, error) {
return s.p.GetServerStatus(host, port, time.Second)
}

View File

@ -10,13 +10,14 @@ import (
type Scanner struct {
p models.Persistence
c4s models.StatusProvider
done chan bool
interval time.Duration
}
func NewScanner(p models.Persistence, interval time.Duration, done chan bool) (*Scanner, error) {
func NewScanner(p models.Persistence, c4s models.StatusProvider, interval time.Duration, done chan bool) (*Scanner, error) {
return &Scanner{
p, done, interval,
p, c4s, done, interval,
}, nil
}
@ -52,12 +53,7 @@ func (s *Scanner) Scan() {
}
func (s *Scanner) fetchInformation(ctx context.Context, capture models.Capture) error {
server, err := models.NewCOD4ServerStatus(capture.Host, capture.Port, time.Second)
if err != nil {
return err
}
status, err := server.GetServerStatus()
status, err := s.c4s.GetServerStatus(capture.Host, capture.Port, time.Second)
if err != nil {
return err
}