Skip to content

Commit 49f3957

Browse files
committed
- Changed Session.nextLogon() to validate DefaultApplVerID from Logon.
- Added unit test.
1 parent cb3d31e commit 49f3957

File tree

2 files changed

+54
-0
lines changed

2 files changed

+54
-0
lines changed

quickfixj-core/src/main/java/quickfix/Session.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
import java.util.ArrayList;
6565
import java.util.Date;
6666
import java.util.List;
67+
import java.util.Optional;
6768
import java.util.Set;
6869
import java.util.concurrent.ConcurrentHashMap;
6970
import java.util.concurrent.ConcurrentMap;
@@ -2162,6 +2163,19 @@ private void nextLogon(Message logon) throws FieldNotFound, RejectLogon, Incorre
21622163
throw new RejectLogon("Logon attempt not within session time");
21632164
}
21642165

2166+
if (sessionID.isFIXT()) {
2167+
final DataDictionary dictionary = dataDictionaryProvider
2168+
.getSessionDataDictionary(sessionID.getBeginString());
2169+
if (dictionary != null) {
2170+
Optional<String> defaultApplVerID = logon.getOptionalString(DefaultApplVerID.FIELD);
2171+
if (defaultApplVerID.isPresent()) {
2172+
if (!dictionary.isFieldValue(ApplVerID.FIELD, defaultApplVerID.get())) {
2173+
throw new RejectLogon("Invalid DefaultApplVerID=" + defaultApplVerID.get());
2174+
}
2175+
}
2176+
}
2177+
}
2178+
21652179
// QFJ-926 - reset session before accepting Logon
21662180
resetIfSessionNotCurrent(sessionID, SystemTime.currentTimeMillis());
21672181

quickfixj-core/src/test/java/quickfix/mina/acceptor/AcceptorIoHandlerTest.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.junit.Test;
2424
import quickfix.FixVersions;
2525
import quickfix.Message;
26+
import quickfix.MessageUtils;
2627
import quickfix.Responder;
2728
import quickfix.Session;
2829
import quickfix.SessionFactoryTestSupport;
@@ -33,6 +34,7 @@
3334
import quickfix.field.ApplVerID;
3435
import quickfix.field.DefaultApplVerID;
3536
import quickfix.field.EncryptMethod;
37+
import quickfix.field.Headline;
3638
import quickfix.field.HeartBtInt;
3739
import quickfix.field.MsgSeqNum;
3840
import quickfix.field.MsgType;
@@ -42,6 +44,7 @@
4244
import quickfix.field.Text;
4345
import quickfix.fix44.Logout;
4446
import quickfix.fixt11.Logon;
47+
import quickfix.fix50.News;
4548
import quickfix.mina.EventHandlingStrategy;
4649
import quickfix.mina.NetworkingOptions;
4750
import quickfix.mina.SessionConnector;
@@ -56,6 +59,7 @@
5659

5760
import static org.junit.Assert.assertEquals;
5861
import static org.junit.Assert.assertNull;
62+
import static org.junit.Assert.assertTrue;
5963
import static org.mockito.Mockito.mock;
6064
import static org.mockito.Mockito.verify;
6165
import static org.mockito.Mockito.verifyNoMoreInteractions;
@@ -101,6 +105,42 @@ public void testFIXTLogonAndApplVerID() throws Exception {
101105
}
102106
}
103107

108+
@Test
109+
public void testFIXTLogonAndUnknownApplVerID() throws Exception {
110+
EventHandlingStrategy mockEventHandlingStrategy = mock(EventHandlingStrategy.class);
111+
IoSession mockIoSession = mock(IoSession.class);
112+
SessionSettings settings = mock(SessionSettings.class);
113+
114+
final SessionID sessionID = new SessionID(FixVersions.BEGINSTRING_FIXT11, "SENDER",
115+
"TARGET");
116+
final UnitTestApplication unitTestApplication = new UnitTestApplication();
117+
try (Session session = SessionFactoryTestSupport.createSession(sessionID, unitTestApplication, false, false, true, true, new DefaultApplVerID(DefaultApplVerID.FIX50SP2))) {
118+
when(mockIoSession.getAttribute("QF_SESSION")).thenReturn(null); // to create a new Session
119+
120+
final HashMap<SessionID, Session> acceptorSessions = new HashMap<>();
121+
acceptorSessions.put(sessionID, session);
122+
final StaticAcceptorSessionProvider sessionProvider = createSessionProvider(acceptorSessions);
123+
124+
final AcceptorIoHandler handler = new AcceptorIoHandler(sessionProvider,
125+
settings, new NetworkingOptions(new Properties()), mockEventHandlingStrategy);
126+
127+
final DefaultApplVerID defaultApplVerID = new DefaultApplVerID("33");
128+
final Logon message = new Logon(new EncryptMethod(EncryptMethod.NONE_OTHER),
129+
new HeartBtInt(30), defaultApplVerID);
130+
message.getHeader().setString(TargetCompID.FIELD, sessionID.getSenderCompID());
131+
message.getHeader().setString(SenderCompID.FIELD, sessionID.getTargetCompID());
132+
message.getHeader().setField(new SendingTime(LocalDateTime.now()));
133+
message.getHeader().setInt(MsgSeqNum.FIELD, 1);
134+
135+
handler.messageReceived(mockIoSession, message.toString());
136+
session.next(message);
137+
138+
Message lastToAdminMessage = unitTestApplication.lastToAdminMessage();
139+
assertEquals(MsgType.LOGOUT, MessageUtils.getMessageType(lastToAdminMessage.toString()));
140+
assertTrue(lastToAdminMessage.getString(Text.FIELD).contains("Invalid DefaultApplVerID=33"));
141+
}
142+
}
143+
104144
@Test
105145
public void testMessageBeforeLogon() throws Exception {
106146
IoSession mockIoSession = mock(IoSession.class);

0 commit comments

Comments
 (0)