Merge pull request #19 from keeshux/parse-compression-framing-from-push-reply
Parse compression framing from PUSH_REPLY
This commit is contained in:
commit
aeccabbb6d
@ -147,6 +147,9 @@ public protocol SessionReply {
|
||||
/// The DNS servers set up for this session.
|
||||
var dnsServers: [String] { get }
|
||||
|
||||
/// The optional compression framing.
|
||||
var compressionFraming: SessionProxy.CompressionFraming? { get }
|
||||
|
||||
/// The optional authentication token.
|
||||
var authToken: String? { get }
|
||||
|
||||
@ -186,6 +189,8 @@ extension SessionProxy {
|
||||
|
||||
private static let dnsRegexp = try! NSRegularExpression(pattern: "dhcp-option DNS6? [\\d\\.a-fA-F:]+", options: [])
|
||||
|
||||
private static let compRegexp = try! NSRegularExpression(pattern: "comp(ress|-lzo)", options: [])
|
||||
|
||||
private static let authTokenRegexp = try! NSRegularExpression(pattern: "auth-token [a-zA-Z0-9/=+]+", options: [])
|
||||
|
||||
private static let peerIdRegexp = try! NSRegularExpression(pattern: "peer-id [0-9]+", options: [])
|
||||
@ -200,6 +205,8 @@ extension SessionProxy {
|
||||
|
||||
let dnsServers: [String]
|
||||
|
||||
let compressionFraming: SessionProxy.CompressionFraming?
|
||||
|
||||
let authToken: String?
|
||||
|
||||
let peerId: UInt32?
|
||||
@ -224,6 +231,7 @@ extension SessionProxy {
|
||||
var optIfconfig6Arguments: [String]?
|
||||
|
||||
var dnsServers: [String] = []
|
||||
var compressionFraming: SessionProxy.CompressionFraming?
|
||||
var authToken: String?
|
||||
var peerId: UInt32?
|
||||
var cipher: SessionProxy.Cipher?
|
||||
@ -365,6 +373,21 @@ extension SessionProxy {
|
||||
dnsServers.append($0[1])
|
||||
}
|
||||
|
||||
// MARK: Compression
|
||||
|
||||
PushReply.compRegexp.enumerateComponents(in: message) {
|
||||
switch $0[0] {
|
||||
case "comp-lzo":
|
||||
compressionFraming = .compLZO
|
||||
|
||||
case "compress":
|
||||
compressionFraming = .compress
|
||||
|
||||
default:
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: Authentication
|
||||
|
||||
PushReply.authTokenRegexp.enumerateArguments(in: message) {
|
||||
@ -382,6 +405,7 @@ extension SessionProxy {
|
||||
}
|
||||
|
||||
self.dnsServers = dnsServers
|
||||
self.compressionFraming = compressionFraming
|
||||
self.authToken = authToken
|
||||
self.peerId = peerId
|
||||
self.cipher = cipher
|
||||
@ -404,13 +428,20 @@ extension SessionProxy {
|
||||
|
||||
private extension NSRegularExpression {
|
||||
func enumerateArguments(in string: String, using block: ([String]) -> Void) {
|
||||
enumerateComponents(in: string) { (tokens) in
|
||||
var args = tokens
|
||||
args.removeFirst()
|
||||
block(args)
|
||||
}
|
||||
}
|
||||
|
||||
func enumerateComponents(in string: String, using block: ([String]) -> Void) {
|
||||
enumerateMatches(in: string, options: [], range: NSMakeRange(0, string.count)) { (result, flags, stop) in
|
||||
guard let range = result?.range else {
|
||||
return
|
||||
}
|
||||
let match = (string as NSString).substring(with: range)
|
||||
var tokens = match.components(separatedBy: " ")
|
||||
tokens.removeFirst()
|
||||
let tokens = match.components(separatedBy: " ")
|
||||
block(tokens)
|
||||
}
|
||||
}
|
||||
|
@ -1031,6 +1031,10 @@ public class SessionProxy {
|
||||
log.debug("Set up encryption")
|
||||
}
|
||||
|
||||
let pushedFraming = pushReply.compressionFraming
|
||||
if let negFraming = pushedFraming {
|
||||
log.debug("Negotiated compression framing: \(negFraming.rawValue)")
|
||||
}
|
||||
let pushedCipher = pushReply.cipher
|
||||
if let negCipher = pushedCipher {
|
||||
log.debug("Negotiated cipher: \(negCipher.rawValue)")
|
||||
@ -1054,7 +1058,7 @@ public class SessionProxy {
|
||||
encrypter: bridge.encrypter(),
|
||||
decrypter: bridge.decrypter(),
|
||||
peerId: pushReply.peerId ?? PacketPeerIdDisabled,
|
||||
compressionFraming: configuration.compressionFraming.native,
|
||||
compressionFraming: (pushedFraming ?? configuration.compressionFraming).native,
|
||||
maxPackets: link?.packetBufferSize ?? 200,
|
||||
usesReplayProtection: CoreConfiguration.usesReplayProtection
|
||||
)
|
||||
|
@ -92,11 +92,19 @@ class PushTests: XCTestCase {
|
||||
XCTAssertEqual(reply.dnsServers, ["2001:4860:4860::8888", "2001:4860:4860::8844"])
|
||||
}
|
||||
|
||||
func testNCP() {
|
||||
func testCompressionFraming() {
|
||||
let msg = "PUSH_REPLY,dhcp-option DNS 8.8.8.8,dhcp-option DNS 4.4.4.4,comp-lzo no,route 10.8.0.1,topology net30,ping 10,ping-restart 120,ifconfig 10.8.0.6 10.8.0.5,peer-id 0,cipher AES-256-CBC"
|
||||
let reply = try! SessionProxy.PushReply(message: msg)!
|
||||
reply.debug()
|
||||
|
||||
XCTAssertEqual(reply.compressionFraming, .compLZO)
|
||||
}
|
||||
|
||||
func testNCP() {
|
||||
let msg = "PUSH_REPLY,dhcp-option DNS 8.8.8.8,dhcp-option DNS 4.4.4.4,comp-lzo no,route 10.8.0.1,topology net30,ping 10,ping-restart 120,ifconfig 10.8.0.6 10.8.0.5,peer-id 0,cipher AES-256-GCM"
|
||||
let reply = try! SessionProxy.PushReply(message: msg)!
|
||||
reply.debug()
|
||||
|
||||
XCTAssertEqual(reply.cipher, .aes256gcm)
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user