Replace CPU-intensive headless Chrome + WebRTC pipeline with a lightweight Go reverse proxy that strips anti-framing headers (X-Frame-Options, CSP) and embeds streaming sites in iframes. - New internal/proxy package with URL rewriting for HTML/CSS - JS shim injection to intercept fetch/XHR/WebSocket/createElement - Referer reconstruction for correct cross-origin auth (HLS streams) - Inline iframe viewer preserving site navigation (not fullscreen overlay)
91 lines
2 KiB
Go
91 lines
2 KiB
Go
package store
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"f1-stream/internal/models"
|
|
|
|
"github.com/go-webauthn/webauthn/webauthn"
|
|
)
|
|
|
|
func (s *Store) LoadUsers() ([]models.User, error) {
|
|
s.usersMu.RLock()
|
|
defer s.usersMu.RUnlock()
|
|
var users []models.User
|
|
if err := readJSON(s.filePath("users.json"), &users); err != nil {
|
|
return nil, err
|
|
}
|
|
return users, nil
|
|
}
|
|
|
|
func (s *Store) GetUserByName(username string) (*models.User, error) {
|
|
s.usersMu.RLock()
|
|
defer s.usersMu.RUnlock()
|
|
var users []models.User
|
|
if err := readJSON(s.filePath("users.json"), &users); err != nil {
|
|
return nil, err
|
|
}
|
|
for _, u := range users {
|
|
if u.Username == username {
|
|
return &u, nil
|
|
}
|
|
}
|
|
return nil, nil
|
|
}
|
|
|
|
func (s *Store) GetUserByID(id string) (*models.User, error) {
|
|
s.usersMu.RLock()
|
|
defer s.usersMu.RUnlock()
|
|
var users []models.User
|
|
if err := readJSON(s.filePath("users.json"), &users); err != nil {
|
|
return nil, err
|
|
}
|
|
for _, u := range users {
|
|
if u.ID == id {
|
|
return &u, nil
|
|
}
|
|
}
|
|
return nil, nil
|
|
}
|
|
|
|
func (s *Store) CreateUser(user models.User) error {
|
|
s.usersMu.Lock()
|
|
defer s.usersMu.Unlock()
|
|
var users []models.User
|
|
if err := readJSON(s.filePath("users.json"), &users); err != nil {
|
|
return err
|
|
}
|
|
for _, u := range users {
|
|
if u.Username == user.Username {
|
|
return fmt.Errorf("username already exists")
|
|
}
|
|
}
|
|
users = append(users, user)
|
|
return writeJSON(s.filePath("users.json"), users)
|
|
}
|
|
|
|
func (s *Store) UpdateUserCredentials(userID string, creds []webauthn.Credential) error {
|
|
s.usersMu.Lock()
|
|
defer s.usersMu.Unlock()
|
|
var users []models.User
|
|
if err := readJSON(s.filePath("users.json"), &users); err != nil {
|
|
return err
|
|
}
|
|
for i, u := range users {
|
|
if u.ID == userID {
|
|
users[i].Credentials = creds
|
|
return writeJSON(s.filePath("users.json"), users)
|
|
}
|
|
}
|
|
return fmt.Errorf("user not found")
|
|
}
|
|
|
|
func (s *Store) UserCount() (int, error) {
|
|
s.usersMu.RLock()
|
|
defer s.usersMu.RUnlock()
|
|
var users []models.User
|
|
if err := readJSON(s.filePath("users.json"), &users); err != nil {
|
|
return 0, err
|
|
}
|
|
return len(users), nil
|
|
}
|