fix: remove dynamic participant join to fix concurrent party_index assignment
- Remove dynamic participant addition in JoinSession - Participants must be pre-created in CreateSession - Add ErrPartyNotInvited error for unauthorized join attempts - Fix Redis adapter to include version parameter in ReconstructSession - This fixes VSS verification failures caused by inconsistent party indices
This commit is contained in:
parent
b72268c1ce
commit
5f12404be4
|
|
@ -24,7 +24,9 @@
|
||||||
"Bash(cat:*)",
|
"Bash(cat:*)",
|
||||||
"Bash(dir:*)",
|
"Bash(dir:*)",
|
||||||
"Bash(copy /Y \"api\\proto\\session_coordinator.pb.go\" \"api\\grpc\\coordinator\\v1\"\" && copy /Y \"apiprotosession_coordinator_grpc.pb.go\" \"apigrpccoordinatorv1\"\")",
|
"Bash(copy /Y \"api\\proto\\session_coordinator.pb.go\" \"api\\grpc\\coordinator\\v1\"\" && copy /Y \"apiprotosession_coordinator_grpc.pb.go\" \"apigrpccoordinatorv1\"\")",
|
||||||
"Bash(timeout /t 10 /nobreak)"
|
"Bash(timeout /t 10 /nobreak)",
|
||||||
|
"Bash(bash scripts/deploy.sh:*)",
|
||||||
|
"Bash(go run:*)"
|
||||||
],
|
],
|
||||||
"deny": [],
|
"deny": [],
|
||||||
"ask": []
|
"ask": []
|
||||||
|
|
|
||||||
|
|
@ -272,6 +272,7 @@ func cacheEntryToSession(entry sessionCacheEntry) (*entities.MPCSession, error)
|
||||||
time.UnixMilli(entry.ExpiresAt),
|
time.UnixMilli(entry.ExpiresAt),
|
||||||
completedAt,
|
completedAt,
|
||||||
participants,
|
participants,
|
||||||
|
1, // version - default to 1 for cached sessions (not used in cache)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -80,38 +80,22 @@ func (uc *JoinSessionUseCase) Execute(
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// 5. Check if participant exists, if not, add them (dynamic joining)
|
// 5. Get participant (must already exist from CreateSession)
|
||||||
participant, err := session.GetParticipant(partyID)
|
participant, err := session.GetParticipant(partyID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Participant doesn't exist, add them dynamically
|
// Participant doesn't exist - this party was not invited to this session
|
||||||
if len(session.Participants) >= session.Threshold.N() {
|
logger.Warn("party not found in session participants",
|
||||||
return nil, entities.ErrSessionFull
|
zap.String("session_id", session.ID.String()),
|
||||||
}
|
|
||||||
|
|
||||||
// Create new participant with index based on current participant count
|
|
||||||
partyIndex := len(session.Participants)
|
|
||||||
logger.Info("creating new participant for dynamic join",
|
|
||||||
zap.String("party_id", inputData.PartyID),
|
zap.String("party_id", inputData.PartyID),
|
||||||
zap.Int("assigned_party_index", partyIndex),
|
zap.Int("existing_participant_count", len(session.Participants)))
|
||||||
zap.Int("current_participant_count", len(session.Participants)))
|
return nil, entities.ErrPartyNotInvited
|
||||||
|
|
||||||
participant, err = entities.NewParticipant(partyID, partyIndex, inputData.DeviceInfo)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.Info("new participant created",
|
|
||||||
zap.String("party_id", participant.PartyID.String()),
|
|
||||||
zap.Int("party_index", participant.PartyIndex))
|
|
||||||
|
|
||||||
if err := session.AddParticipant(participant); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.Info("participant added to session",
|
|
||||||
zap.Int("total_participants_after_add", len(session.Participants)))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
logger.Debug("participant found in session",
|
||||||
|
zap.String("party_id", participant.PartyID.String()),
|
||||||
|
zap.Int("party_index", participant.PartyIndex),
|
||||||
|
zap.String("current_status", participant.Status.String()))
|
||||||
|
|
||||||
// 6. Update participant status to joined
|
// 6. Update participant status to joined
|
||||||
if err := session.UpdateParticipantStatus(partyID, value_objects.ParticipantStatusJoined); err != nil {
|
if err := session.UpdateParticipantStatus(partyID, value_objects.ParticipantStatusJoined); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@ var (
|
||||||
ErrSessionExpired = errors.New("session expired")
|
ErrSessionExpired = errors.New("session expired")
|
||||||
ErrSessionNotInProgress = errors.New("session not in progress")
|
ErrSessionNotInProgress = errors.New("session not in progress")
|
||||||
ErrParticipantNotFound = errors.New("participant not found")
|
ErrParticipantNotFound = errors.New("participant not found")
|
||||||
|
ErrPartyNotInvited = errors.New("party not invited to this session")
|
||||||
ErrInvalidSessionType = errors.New("invalid session type")
|
ErrInvalidSessionType = errors.New("invalid session type")
|
||||||
ErrInvalidStatusTransition = errors.New("invalid status transition")
|
ErrInvalidStatusTransition = errors.New("invalid status transition")
|
||||||
ErrParticipantTimedOut = errors.New("participant timed out")
|
ErrParticipantTimedOut = errors.New("participant timed out")
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue