Basic functionality
This commit is contained in:
90
services/authorization.go
Normal file
90
services/authorization.go
Normal 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")
|
||||
}
|
||||
}
|
||||
@ -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
21
services/cod4server.go
Normal 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)
|
||||
}
|
||||
@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user