Skip to content

Commit 2903198

Browse files
authored
Merge pull request #670 from ackleymi/prevent-store-reset-unauth
Check logon auth before resetting store
2 parents fa2e438 + bb3e854 commit 2903198

File tree

3 files changed

+45
-8
lines changed

3 files changed

+45
-8
lines changed

in_session.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ func (state inSession) Timeout(session *session, event internal.Event) (nextStat
8787
}
8888

8989
func (state inSession) handleLogout(session *session, msg *Message) (nextState sessionState) {
90-
if err := session.verifySelect(msg, false, false); err != nil {
90+
if err := session.verifySelect(msg, false, false, true); err != nil {
9191
return state.processReject(session, msg, err)
9292
}
9393

@@ -154,7 +154,7 @@ func (state inSession) handleSequenceReset(session *session, msg *Message) (next
154154
}
155155
}
156156

157-
if err := session.verifySelect(msg, bool(gapFillFlag), bool(gapFillFlag)); err != nil {
157+
if err := session.verifySelect(msg, bool(gapFillFlag), bool(gapFillFlag), true); err != nil {
158158
return state.processReject(session, msg, err)
159159
}
160160

logon_state_test.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,27 @@ func (s *LogonStateTestSuite) TestFixMsgInLogonInitiateLogonExpectResetSeqNum()
226226
s.NextSenderMsgSeqNum(2)
227227
}
228228

229+
func (s *LogonStateTestSuite) TestFixMsgInLogonInitiateLogonRejectedSeqNumNotReset() {
230+
s.session.InitiateLogon = true
231+
s.session.sentReset = true
232+
s.Require().Nil(s.store.IncrNextSenderMsgSeqNum())
233+
234+
logon := s.Logon()
235+
logon.Body.SetField(tagHeartBtInt, FIXInt(32))
236+
logon.Body.SetField(tagResetSeqNumFlag, FIXBoolean(true))
237+
238+
s.MockApp.On("FromAdmin").Return(RejectLogon{"reject message"})
239+
s.MockApp.On("OnLogout")
240+
s.MockApp.On("ToAdmin")
241+
s.fixMsgIn(s.session, logon)
242+
243+
s.MockApp.AssertExpectations(s.T())
244+
s.State(latentState{})
245+
246+
s.NextTargetMsgSeqNum(2)
247+
s.NextSenderMsgSeqNum(3)
248+
}
249+
229250
func (s *LogonStateTestSuite) TestFixMsgInLogonInitiateLogonUnExpectedResetSeqNum() {
230251
s.session.InitiateLogon = true
231252
s.session.sentReset = false
@@ -358,6 +379,7 @@ func (s *LogonStateTestSuite) TestFixMsgInLogonSeqNumTooLow() {
358379
logon.Body.SetField(tagHeartBtInt, FIXInt(32))
359380
logon.Header.SetInt(tagMsgSeqNum, 1)
360381

382+
s.MockApp.On("FromAdmin").Return(nil)
361383
s.MockApp.On("ToAdmin")
362384
s.NextTargetMsgSeqNum(2)
363385
s.fixMsgIn(s.session, logon)

session.go

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -507,6 +507,13 @@ func (s *session) handleLogon(msg *Message) error {
507507
}
508508
}
509509

510+
nextSenderMsgNumAtLogonReceived := s.store.NextSenderMsgSeqNum()
511+
512+
// Make sure this is a valid session before resetting the store.
513+
if err := s.verifyMsgAgainstAppImpl(msg); err != nil {
514+
return err
515+
}
516+
510517
var resetSeqNumFlag FIXBoolean
511518
if err := msg.Body.GetField(tagResetSeqNumFlag, &resetSeqNumFlag); err == nil {
512519
if resetSeqNumFlag {
@@ -517,14 +524,14 @@ func (s *session) handleLogon(msg *Message) error {
517524
}
518525
}
519526

520-
nextSenderMsgNumAtLogonReceived := s.store.NextSenderMsgSeqNum()
521-
522527
if resetStore {
523528
if err := s.store.Reset(); err != nil {
524529
return err
525530
}
526531
}
527532

533+
// Verify seq num too high but dont check against app implementation since we just did that.
534+
// Don't need to double check.
528535
if err := s.verifyIgnoreSeqNumTooHigh(msg); err != nil {
529536
return err
530537
}
@@ -586,18 +593,18 @@ func (s *session) initiateLogoutInReplyTo(reason string, inReplyTo *Message) (er
586593
}
587594

588595
func (s *session) verify(msg *Message) MessageRejectError {
589-
return s.verifySelect(msg, true, true)
596+
return s.verifySelect(msg, true, true, true)
590597
}
591598

592599
func (s *session) verifyIgnoreSeqNumTooHigh(msg *Message) MessageRejectError {
593-
return s.verifySelect(msg, false, true)
600+
return s.verifySelect(msg, false, true, false)
594601
}
595602

596603
func (s *session) verifyIgnoreSeqNumTooHighOrLow(msg *Message) MessageRejectError {
597-
return s.verifySelect(msg, false, false)
604+
return s.verifySelect(msg, false, false, true)
598605
}
599606

600-
func (s *session) verifySelect(msg *Message, checkTooHigh bool, checkTooLow bool) MessageRejectError {
607+
func (s *session) verifySelect(msg *Message, checkTooHigh bool, checkTooLow bool, checkAppImpl bool) MessageRejectError {
601608
if reject := s.checkBeginString(msg); reject != nil {
602609
return reject
603610
}
@@ -626,6 +633,14 @@ func (s *session) verifySelect(msg *Message, checkTooHigh bool, checkTooLow bool
626633
}
627634
}
628635

636+
if checkAppImpl {
637+
return s.verifyMsgAgainstAppImpl(msg)
638+
}
639+
640+
return nil
641+
}
642+
643+
func (s *session) verifyMsgAgainstAppImpl(msg *Message) MessageRejectError {
629644
if s.Validator != nil {
630645
if reject := s.Validator.Validate(msg); reject != nil {
631646
return reject

0 commit comments

Comments
 (0)