From 3b54c6693f59a807d819b325055ae5a37a052141 Mon Sep 17 00:00:00 2001 From: German Saprykin Date: Fri, 10 Feb 2017 08:39:15 +0700 Subject: [PATCH] Added feature to specify custom token and default token constructed method. #8 --- .../Builder/CentrifugeClientMessageBuilderImpl.swift | 12 +++--------- CentrifugeiOS/Classes/Centrifuge.swift | 10 +++++++++- CentrifugeiOS/Classes/Models.swift | 6 +++--- Example/CentrifugeiOS/ViewController.swift | 3 ++- Example/Tests/CentrifugoClientImplTests.swift | 3 +-- .../CentrifugoClientMessageBuilderImplTests.swift | 8 ++++---- README.md | 8 +++++--- 7 files changed, 27 insertions(+), 23 deletions(-) diff --git a/CentrifugeiOS/Classes/Builder/CentrifugeClientMessageBuilderImpl.swift b/CentrifugeiOS/Classes/Builder/CentrifugeClientMessageBuilderImpl.swift index 489490d..56e0e92 100644 --- a/CentrifugeiOS/Classes/Builder/CentrifugeClientMessageBuilderImpl.swift +++ b/CentrifugeiOS/Classes/Builder/CentrifugeClientMessageBuilderImpl.swift @@ -6,7 +6,6 @@ // // -import IDZSwiftCommonCrypto protocol CentrifugeClientMessageBuilder { func buildConnectMessage(credentials: CentrifugeCredentials) -> CentrifugeClientMessage @@ -24,11 +23,11 @@ class CentrifugeClientMessageBuilderImpl: CentrifugeClientMessageBuilder { func buildConnectMessage(credentials: CentrifugeCredentials) -> CentrifugeClientMessage { - let user = credentials.user, timestamp = credentials.timestamp, secret = credentials.secret + let user = credentials.user, timestamp = credentials.timestamp, token = credentials.token var params = ["user" : user, "timestamp" : timestamp, - "token" : createToken(string: "\(user)\(timestamp)", key: secret)] + "token" : token] if let info = credentials.info { params["info"] = info @@ -87,10 +86,5 @@ class CentrifugeClientMessageBuilderImpl: CentrifugeClientMessageBuilder { private func generateUUID() -> String { return NSUUID().uuidString } - - private func createToken(string: String, key: String) -> String { - let hmacs5 = HMAC(algorithm:.sha256, key:key).update(string: string)?.final() - let token = hexString(fromArray: hmacs5!) - return token - } + } diff --git a/CentrifugeiOS/Classes/Centrifuge.swift b/CentrifugeiOS/Classes/Centrifuge.swift index a217374..ed70e1a 100644 --- a/CentrifugeiOS/Classes/Centrifuge.swift +++ b/CentrifugeiOS/Classes/Centrifuge.swift @@ -6,6 +6,8 @@ // // +import IDZSwiftCommonCrypto + public let CentrifugeErrorDomain = "com.Centrifuge.error.domain" public let CentrifugeWebSocketErrorDomain = "com.Centrifuge.error.domain.websocket" public let CentrifugeErrorMessageKey = "com.Centrifuge.error.messagekey" @@ -28,4 +30,10 @@ public class Centrifuge { return client } -} \ No newline at end of file + + public class func createToken(string: String, key: String) -> String { + let hmacs5 = HMAC(algorithm:.sha256, key:key).update(string: string)?.final() + let token = hexString(fromArray: hmacs5!) + return token + } +} diff --git a/CentrifugeiOS/Classes/Models.swift b/CentrifugeiOS/Classes/Models.swift index 1b3f169..88239cc 100644 --- a/CentrifugeiOS/Classes/Models.swift +++ b/CentrifugeiOS/Classes/Models.swift @@ -37,13 +37,13 @@ public func ==(lhs: CentrifugeServerMessage, rhs: CentrifugeServerMessage) -> Bo } public struct CentrifugeCredentials { - let secret : String + let token : String let user : String let timestamp : String let info: String? - public init(secret: String, user: String, timestamp:String, info: String? = nil) { - self.secret = secret + public init(token: String, user: String, timestamp:String, info: String? = nil) { + self.token = token self.user = user self.timestamp = timestamp self.info = info diff --git a/Example/CentrifugeiOS/ViewController.swift b/Example/CentrifugeiOS/ViewController.swift index 97f52ae..2b8345f 100644 --- a/Example/CentrifugeiOS/ViewController.swift +++ b/Example/CentrifugeiOS/ViewController.swift @@ -35,8 +35,9 @@ class ViewController: UIViewController, CentrifugeChannelDelegate, CentrifugeCli tableView.dataSource = datasource let timestamp = "\(Int(Date().timeIntervalSince1970))" + let token = Centrifuge.createToken(string: "\(user)\(timestamp)", key: secret) - let creds = CentrifugeCredentials(secret: secret, user: user, timestamp: timestamp) + let creds = CentrifugeCredentials(token: token, user: user, timestamp: timestamp) let url = "wss://centrifugo.herokuapp.com/connection/websocket" client = Centrifuge.client(url: url, creds: creds, delegate: self) } diff --git a/Example/Tests/CentrifugoClientImplTests.swift b/Example/Tests/CentrifugoClientImplTests.swift index c1996ae..14512bd 100644 --- a/Example/Tests/CentrifugoClientImplTests.swift +++ b/Example/Tests/CentrifugoClientImplTests.swift @@ -806,7 +806,6 @@ class CentrifugeClientImplTests: XCTestCase { } } - extension CentrifugeClientMessage { static func testMessage() -> CentrifugeClientMessage { return CentrifugeClientMessage(uid: NSUUID().uuidString, method: .Connect, params: [:]) @@ -824,6 +823,6 @@ extension CentrifugeServerMessage { extension CentrifugeCredentials { static func testCreds() -> CentrifugeCredentials { - return CentrifugeCredentials(secret: "testSecret", user: "testUser", timestamp: "1234567898") + return CentrifugeCredentials(token: "testToken", user: "testUser", timestamp: "1234567898") } } diff --git a/Example/Tests/CentrifugoClientMessageBuilderImplTests.swift b/Example/Tests/CentrifugoClientMessageBuilderImplTests.swift index 4662b73..cf8d506 100644 --- a/Example/Tests/CentrifugoClientMessageBuilderImplTests.swift +++ b/Example/Tests/CentrifugoClientMessageBuilderImplTests.swift @@ -19,14 +19,14 @@ class CentrifugeClientMessageBuilderImplTests: XCTestCase { func testBuildingConnectMessageWithoutInfo() { // given - let cred = CentrifugeCredentials(secret: "secret", user: "user", timestamp: "timestamp") + let cred = CentrifugeCredentials(token: "token", user: "user", timestamp: "timestamp") // when let message = builder.buildConnectMessage(credentials: cred) // then XCTAssertEqual(message.method, CentrifugeMethod.Connect) - XCTAssertNotNil(message.params["token"]) + XCTAssertEqual(message.params["token"] as? String, "token") XCTAssertNotNil(message.params["user"]) XCTAssertNotNil(message.params["timestamp"]) XCTAssertNil(message.params["info"]) @@ -34,14 +34,14 @@ class CentrifugeClientMessageBuilderImplTests: XCTestCase { func testBuildingConnectMessageWithInfo() { // given - let cred = CentrifugeCredentials(secret: "secret", user: "user", timestamp: "timestamp", info: "info") + let cred = CentrifugeCredentials(token: "token", user: "user", timestamp: "timestamp", info: "info") // when let message = builder.buildConnectMessage(credentials: cred) // then XCTAssertEqual(message.method, CentrifugeMethod.Connect) - XCTAssertNotNil(message.params["token"]) + XCTAssertEqual(message.params["token"] as? String, "token") XCTAssertNotNil(message.params["user"]) XCTAssertNotNil(message.params["timestamp"]) XCTAssertNotNil(message.params["info"]) diff --git a/README.md b/README.md index 7a53cd6..c72366f 100644 --- a/README.md +++ b/README.md @@ -14,11 +14,13 @@ To run the example project, clone the repo, and run `pod install` from the Examp Create client: ```swift -let timestamp = "\(Int(NSDate().timeIntervalSince1970))" - -let creds = CentrifugeCredentials(secret: secret, user: user, timestamp: timestamp) +let timestamp = "\(Int(Date().timeIntervalSince1970))" +let token = Centrifuge.createToken(string: "\(user)\(timestamp)", key: secret) + +let creds = CentrifugeCredentials(token: token, user: user, timestamp: timestamp) let url = "wss://centrifugo.herokuapp.com/connection/websocket" client = Centrifuge.client(url: url, creds: creds, delegate: self) + ``` Connect to server: ```swift