Skip to content

Commit 34ff318

Browse files
committed
better authentication error handling
1 parent be837d9 commit 34ff318

File tree

2 files changed

+56
-8
lines changed

2 files changed

+56
-8
lines changed

app/src/Outlander/Server/AuthenticationServer.swift

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,8 @@ class AuthenticationServer {
110110
return
111111
}
112112

113-
_socket?.writeAndRead("G\t\(_authInfo!.game)", tag: AuthSocketState.game.rawValue)
113+
let upperGame = _authInfo!.game.uppercased()
114+
_socket?.writeAndRead("G\t\(upperGame)", tag: AuthSocketState.game.rawValue)
114115

115116
case .game:
116117
_socket?.writeAndRead("C", tag: AuthSocketState.characterlist.rawValue)
@@ -147,7 +148,16 @@ class AuthenticationServer {
147148
return
148149
}
149150

150-
let info = getConnection(str)
151+
if str.contains("PROBLEM") || !str.contains("GAMECODE") {
152+
disconnectWithError("unable to connect, check connection options")
153+
return
154+
}
155+
156+
guard let info = getConnection(str) else {
157+
disconnectWithError("unable to connect, check connection options")
158+
return
159+
}
160+
151161
_socket?.disconnect()
152162
_callback?(.success(info))
153163
}
@@ -181,17 +191,30 @@ class AuthenticationServer {
181191
return Data(hexString: hexHash)
182192
}
183193

184-
func getConnection(_ input: String) -> GameConnectionInfo {
194+
func getConnection(_ input: String) -> GameConnectionInfo? {
185195
let game = getData(input, pattern: "GAMECODE=(\\S+)")
186196
let key = getData(input, pattern: "KEY=(\\w+)")
187197
let host = getData(input, pattern: "GAMEHOST=(\\S+)")
188198
let port = getData(input, pattern: "GAMEPORT=(\\d+)")
189-
let portNumber = UInt16(port)!
190-
return GameConnectionInfo(game: game, key: key, host: host, port: portNumber)
199+
let portNumber = UInt16(port ?? "")
200+
201+
if game == nil || key == nil || host == nil || port == nil || portNumber == nil {
202+
return nil
203+
}
204+
205+
return GameConnectionInfo(game: game ?? "", key: key ?? "", host: host ?? "", port: portNumber ?? 0)
191206
}
192207

193-
func getData(_ input: String, pattern: String) -> String {
194-
let range = try! Regex(pattern).matches(input)[1]
195-
return String(input[range])
208+
func getData(_ input: String, pattern: String) -> String? {
209+
do {
210+
let matches = try Regex(pattern).matches(input)
211+
guard matches.count > 1 else {
212+
return nil
213+
}
214+
let range = matches[1]
215+
return String(input[range])
216+
} catch {
217+
return nil
218+
}
196219
}
197220
}

app/src/OutlanderTests/GameStreamTests.swift

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,25 @@
88

99
import XCTest
1010

11+
class TestStreamHandler: StreamHandler {
12+
var dataList: [String] = []
13+
14+
func stream(_ data: String, with context: GameContext) {
15+
guard !data.isEmpty else {
16+
return
17+
}
18+
19+
dataList.append(data)
20+
}
21+
22+
func reset() {
23+
dataList.removeAll()
24+
}
25+
}
26+
1127
class GameStreamTests: XCTestCase {
28+
var testStreamHandler: TestStreamHandler = TestStreamHandler()
29+
1230
func streamCommands(_ lines: [String], context: GameContext = GameContext(), monsterIgnoreList: String = "") -> [StreamCommand] {
1331
var commands: [StreamCommand] = []
1432
let context = context
@@ -19,6 +37,9 @@ class GameStreamTests: XCTestCase {
1937
stream.monsterCountIgnoreList = monsterIgnoreList
2038

2139
stream.reset(true)
40+
testStreamHandler.reset()
41+
42+
stream.addHandler(testStreamHandler)
2243

2344
for line in lines {
2445
stream.stream(line)
@@ -278,6 +299,10 @@ class GameStreamTests: XCTestCase {
278299
])
279300
XCTAssertEqual(commands.count, 4)
280301

302+
XCTAssertEqual(testStreamHandler.dataList.count, 2)
303+
XCTAssertEqual(testStreamHandler.dataList[0], "[General][Someone] \"something to say\"")
304+
XCTAssertEqual(testStreamHandler.dataList[1], "R>")
305+
281306
switch commands[3] {
282307
case let .text(tags):
283308
XCTAssertEqual(tags.count, 2)

0 commit comments

Comments
 (0)