Skip to content
This repository has been archived by the owner on Apr 4, 2020. It is now read-only.

Commit

Permalink
Added feature to specify custom token and default token constructed m…
Browse files Browse the repository at this point in the history
…ethod. #8
  • Loading branch information
mogol committed Feb 10, 2017
1 parent 7406c91 commit 3b54c66
Show file tree
Hide file tree
Showing 7 changed files with 27 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
//
//

import IDZSwiftCommonCrypto

protocol CentrifugeClientMessageBuilder {
func buildConnectMessage(credentials: CentrifugeCredentials) -> CentrifugeClientMessage
Expand All @@ -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
Expand Down Expand Up @@ -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
}

}
10 changes: 9 additions & 1 deletion CentrifugeiOS/Classes/Centrifuge.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -28,4 +30,10 @@ public class Centrifuge {

return client
}
}

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
}
}
6 changes: 3 additions & 3 deletions CentrifugeiOS/Classes/Models.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
3 changes: 2 additions & 1 deletion Example/CentrifugeiOS/ViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
Expand Down
3 changes: 1 addition & 2 deletions Example/Tests/CentrifugoClientImplTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -806,7 +806,6 @@ class CentrifugeClientImplTests: XCTestCase {
}
}


extension CentrifugeClientMessage {
static func testMessage() -> CentrifugeClientMessage {
return CentrifugeClientMessage(uid: NSUUID().uuidString, method: .Connect, params: [:])
Expand All @@ -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")
}
}
8 changes: 4 additions & 4 deletions Example/Tests/CentrifugoClientMessageBuilderImplTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,29 +19,29 @@ 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"])
}

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"])
Expand Down
8 changes: 5 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

2 comments on commit 3b54c66

@FZambia
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@mogol looks good as far as I can see 👍 Are you planning to add sth else or we can release this?

@mogol
Copy link
Member Author

@mogol mogol commented on 3b54c66 Feb 11, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I will release. I checked #7 , right now seems my transport handles closing without passing back message.

Please sign in to comment.