summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKyren223 <Kyren223@proton.me>2025-07-14 11:06:13 +0300
committerKyren223 <Kyren223@proton.me>2025-07-19 18:32:12 +0300
commitd78eb1fbc4d8479afd05f0e910d6e3ec9343a015 (patch)
treebb81050a304b951a7901f70c905396e080423313
parent34c944c35030caf507d3a4f1c938bd655a88a2cf (diff)
Added proper locking to session to avoid race conditions/data races
-rw-r--r--internal/server/session/session.go27
1 files changed, 20 insertions, 7 deletions
diff --git a/internal/server/session/session.go b/internal/server/session/session.go
index 5c395b7..ef697fa 100644
--- a/internal/server/session/session.go
+++ b/internal/server/session/session.go
@@ -38,14 +38,14 @@ type Session struct {
writerWg *sync.WaitGroup
writeMu sync.RWMutex
- issuedTime time.Time
- challenge []byte
+ issuedTime time.Time
+ challenge []byte
+ challengeMu sync.Mutex
isTosAccepted bool
pubKey ed25519.PublicKey
id snowflake.ID
-
- mu sync.Mutex
+ mu sync.RWMutex
}
func NewSession(
@@ -66,8 +66,9 @@ func NewSession(
challenge: make([]byte, NonceSize),
pubKey: ed25519.PublicKey{},
id: snowflake.InvalidID,
- mu: sync.Mutex{},
+ challengeMu: sync.Mutex{},
isTosAccepted: false,
+ mu: sync.RWMutex{},
}
return session
}
@@ -78,28 +79,40 @@ func (s *Session) Addr() *net.TCPAddr {
}
func (s *Session) IsTosAccepted() bool {
+ s.mu.RLock()
+ defer s.mu.RUnlock()
return s.isTosAccepted
}
func (s *Session) ReceivedTosAcceptance() {
+ s.mu.Lock()
+ defer s.mu.Unlock()
s.isTosAccepted = true
}
func (s *Session) IsAuthenticated() bool {
+ s.mu.RLock()
+ defer s.mu.RUnlock()
return s.id != snowflake.InvalidID
}
func (s *Session) ID() snowflake.ID {
+ s.mu.RLock()
+ defer s.mu.RUnlock()
assert.Assert(s.IsAuthenticated(), "use of ID in an unauthenticated session", "addr", s.addr)
return s.id
}
func (s *Session) PubKey() ed25519.PublicKey {
+ s.mu.RLock()
+ defer s.mu.RUnlock()
assert.Assert(s.IsAuthenticated(), "use of PubKey in an unauthenticated session", "addr", s.addr)
return s.pubKey
}
func (s *Session) Promote(userId snowflake.ID, pubKey ed25519.PublicKey) {
+ s.mu.Lock()
+ defer s.mu.Unlock()
s.id = userId
s.pubKey = pubKey
}
@@ -109,8 +122,8 @@ func (s *Session) Manager() SessionManager {
}
func (s *Session) Challenge() []byte {
- s.mu.Lock()
- defer s.mu.Unlock()
+ s.challengeMu.Lock()
+ defer s.challengeMu.Unlock()
if time.Since(s.issuedTime) > time.Minute {
s.issuedTime = time.Now()
_, err := rand.Read(s.challenge)