mirror of
https://github.com/netbirdio/netbird.git
synced 2026-09-13 18:29:07 +02:00
[client] Judge the SSO account against the flow that produced the token
WaitSSOLogin snapshotted the flow on entry but re-read the info, hint and accountPrompted from the live s.oauthAuthFlow afterwards, in separate critical sections. WaitToken blocks for the whole browser leg, so a concurrent Login or RequestJWTAuth could replace the flow meanwhile and the mismatch check would compare this wait's token against another flow's account: either arming the prompt spuriously or letting a wrong-account token through against an unrelated profile's hint. Take all of it in the entry snapshot.
This commit is contained in:
+10
-8
@@ -868,7 +868,13 @@ func (s *Server) WaitSSOLogin(callerCtx context.Context, msg *proto.WaitSSOLogin
|
||||
}
|
||||
|
||||
s.actCancel = cancel
|
||||
flow := s.oauthAuthFlow.flow
|
||||
// One snapshot of the flow this wait belongs to. hint and accountPrompted
|
||||
// are judged against the token that comes back below, and WaitToken blocks
|
||||
// for the whole browser leg: a concurrent Login or RequestJWTAuth replaces
|
||||
// s.oauthAuthFlow meanwhile, so re-reading them after the wait would judge
|
||||
// this flow's token against another flow's account.
|
||||
pending := s.oauthAuthFlow
|
||||
flow := pending.flow
|
||||
s.mutex.Unlock()
|
||||
|
||||
if flow == nil {
|
||||
@@ -889,9 +895,7 @@ func (s *Server) WaitSSOLogin(callerCtx context.Context, msg *proto.WaitSSOLogin
|
||||
// the affordance instead of a Connecting that never resolves.
|
||||
state.Set(internal.StatusNeedsLogin)
|
||||
|
||||
s.mutex.Lock()
|
||||
flowInfo := s.oauthAuthFlow.info
|
||||
s.mutex.Unlock()
|
||||
flowInfo := pending.info
|
||||
|
||||
if flowInfo.UserCode != msg.UserCode {
|
||||
state.Set(internal.StatusLoginFailed)
|
||||
@@ -949,12 +953,10 @@ func (s *Server) WaitSSOLogin(callerCtx context.Context, msg *proto.WaitSSOLogin
|
||||
|
||||
s.mutex.Lock()
|
||||
s.oauthAuthFlow.expiresAt = time.Now()
|
||||
hint := s.oauthAuthFlow.hint
|
||||
accountPrompted := s.oauthAuthFlow.accountPrompted
|
||||
s.mutex.Unlock()
|
||||
|
||||
if !tokenInfo.MatchesAccount(hint) {
|
||||
if !accountPrompted {
|
||||
if !tokenInfo.MatchesAccount(pending.hint) {
|
||||
if !pending.accountPrompted {
|
||||
// The IdP answered from a session belonging to another account. The
|
||||
// browser for this flow is gone, so a new URL cannot be handed out
|
||||
// here — arm the prompt for the user's next connect and fail this
|
||||
|
||||
Reference in New Issue
Block a user