Skip to content
This repository was archived by the owner on Aug 15, 2019. It is now read-only.

Commit 884e032

Browse files
authored
Merge pull request #1 from jonblatho/swift-4.2
Remove deprecated encode/decode, fix warnings, other fixes
2 parents 9f67977 + 30677df commit 884e032

File tree

8 files changed

+60
-63
lines changed

8 files changed

+60
-63
lines changed

Package.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ let excludes = ["HMAC/HMACCryptoSwift.swift"]
1111
let targetDependencies: [Target.Dependency] = []
1212
#else
1313
let dependencies = [
14-
Package.Dependency.package(url: "https://github.com/krzyzanowskim/CryptoSwift.git", from: "0.8.0"),
14+
Package.Dependency.package(url: "https://github.com/krzyzanowskim/CryptoSwift.git", from: "0.10.0"),
1515
]
1616
let excludes = ["HMAC/HMACCommonCrypto.swift"]
1717
let targetDependencies: [Target.Dependency] = ["CryptoSwift"]

Sources/JWA/HMAC/HMACCommonCrypto.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import CommonCrypto
55
extension HMACAlgorithm: SignAlgorithm, VerifyAlgorithm {
66
public func sign(_ message: Data) -> Data {
77
let context = UnsafeMutablePointer<CCHmacContext>.allocate(capacity: 1)
8-
defer { context.deallocate(capacity: 1) }
8+
defer { context.deallocate() }
99

1010
key.withUnsafeBytes() { (buffer: UnsafePointer<UInt8>) in
1111
CCHmacInit(context, hash.commonCryptoAlgorithm, buffer, size_t(key.count))

Sources/JWT/ClaimSet.swift

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ extension ClaimSet {
104104
try validateAudience(audience)
105105
}
106106

107-
try validateExpiary(leeway: leeway)
107+
try validateExpiry(leeway: leeway)
108108
try validateNotBefore(leeway: leeway)
109109
try validateIssuedAt(leeway: leeway)
110110
}
@@ -132,8 +132,13 @@ extension ClaimSet {
132132
throw InvalidToken.invalidIssuer
133133
}
134134
}
135-
135+
136+
@available(*, deprecated, message: "This method's name is misspelled. Please instead use validateExpiry(leeway:).")
136137
public func validateExpiary(leeway: TimeInterval = 0) throws {
138+
try validateExpiry(leeway: leeway)
139+
}
140+
141+
public func validateExpiry(leeway: TimeInterval = 0) throws {
137142
try validateDate(claims, key: "exp", comparison: .orderedAscending, leeway: (-1 * leeway), failure: .expiredSignature, decodeError: "Expiration time claim (exp) must be an integer")
138143
}
139144

Sources/JWT/Decode.swift

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -63,18 +63,6 @@ public func decode(_ jwt: String, algorithm: Algorithm, verify: Bool = true, aud
6363
return try decode(jwt, algorithms: [algorithm], verify: verify, audience: audience, issuer: issuer, leeway: leeway)
6464
}
6565

66-
/// Decode a JWT
67-
@available(*, deprecated, message: "use decode that returns a ClaimSet instead")
68-
public func decode(_ jwt: String, algorithms: [Algorithm], verify: Bool = true, audience: String? = nil, issuer: String? = nil) throws -> Payload {
69-
return try decode(jwt, algorithms: algorithms, verify: verify, audience: audience, issuer: issuer).claims
70-
}
71-
72-
/// Decode a JWT
73-
@available(*, deprecated, message: "use decode that returns a ClaimSet instead")
74-
public func decode(_ jwt: String, algorithm: Algorithm, verify: Bool = true, audience: String? = nil, issuer: String? = nil) throws -> Payload {
75-
return try decode(jwt, algorithms: [algorithm], verify: verify, audience: audience, issuer: issuer).claims
76-
}
77-
7866
// MARK: Parsing a JWT
7967

8068
func load(_ jwt: String) throws -> (header: JOSEHeader, payload: ClaimSet, signature: Data, signatureInput: String) {

Sources/JWT/Encode.swift

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,3 @@ public func encode(_ algorithm: Algorithm, closure: ((ClaimSetBuilder) -> Void))
3838
closure(builder)
3939
return encode(claims: builder.claims, algorithm: algorithm)
4040
}
41-
42-
43-
/*** Encode a payload
44-
- parameter payload: The payload to sign
45-
- parameter algorithm: The algorithm to sign the payload with
46-
- returns: The JSON web token as a String
47-
*/
48-
@available(*, deprecated, message: "use encode(claims: algorithm:) instead")
49-
public func encode(_ payload: Payload, algorithm: Algorithm) -> String {
50-
return encode(claims: ClaimSet(claims: payload), algorithm: algorithm)
51-
}

Tests/JWTTests/ClaimSetTests.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ class ValidationTests: XCTestCase {
77
claims.expiration = Date().addingTimeInterval(-1)
88

99
do {
10-
try claims.validateExpiary()
10+
try claims.validateExpiry()
1111
XCTFail("InvalidToken.expiredSignature error should have been thrown.")
1212
} catch InvalidToken.expiredSignature {
1313
// Correct error thrown
@@ -21,7 +21,7 @@ class ValidationTests: XCTestCase {
2121
claims.expiration = Date().addingTimeInterval(-1)
2222

2323
do {
24-
try claims.validateExpiary(leeway: 2)
24+
try claims.validateExpiry(leeway: 2)
2525
} catch {
2626
XCTFail("Unexpected error while validating exp claim that should be valid with leeway.")
2727
}

Tests/JWTTests/JWTDecodeTests.swift

Lines changed: 17 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,12 @@
11
import Foundation
22
import XCTest
3-
import JWT
3+
@testable import JWT
44

55
class DecodeTests: XCTestCase {
6-
func testDecodingValidJWTAsClaimSet() throws {
7-
let jwt = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiS3lsZSJ9.zxm7xcp1eZtZhp4t-nlw09ATQnnFKIiSN83uG8u6cAg"
8-
9-
let claims: ClaimSet = try JWT.decode(jwt, algorithm: .hs256("secret".data(using: .utf8)!))
10-
XCTAssertEqual(claims["name"] as? String, "Kyle")
11-
}
12-
136
func testDecodingValidJWT() throws {
147
let jwt = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiS3lsZSJ9.zxm7xcp1eZtZhp4t-nlw09ATQnnFKIiSN83uG8u6cAg"
158

16-
let claims: ClaimSet = try JWT.decode(jwt, algorithm: .hs256("secret".data(using: .utf8)!))
9+
let claims = try JWT.decode(jwt, algorithm: .hs256("secret".data(using: .utf8)!))
1710
XCTAssertEqual(claims["name"] as? String, "Kyle")
1811
}
1912

@@ -25,15 +18,15 @@ class DecodeTests: XCTestCase {
2518

2619
func testDisablingVerify() throws {
2720
let jwt = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.e30.2_8pWJfyPup0YwOXK7g9Dn0cF1E3pdn299t4hSeJy5w"
28-
_ = try decode(jwt, algorithm: .none, verify: false, issuer: "fuller.li") as ClaimSet
21+
_ = try decode(jwt, algorithm: .none, verify: false, issuer: "fuller.li")
2922
}
3023

3124
// MARK: Issuer claim
3225

3326
func testSuccessfulIssuerValidation() throws {
3427
let jwt = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJmdWxsZXIubGkifQ.d7B7PAQcz1E6oNhrlxmHxHXHgg39_k7X7wWeahl8kSQ"
3528

36-
let claims: ClaimSet = try JWT.decode(jwt, algorithm: .hs256("secret".data(using: .utf8)!))
29+
let claims = try JWT.decode(jwt, algorithm: .hs256("secret".data(using: .utf8)!))
3730
XCTAssertEqual(claims.issuer, "fuller.li")
3831
}
3932

@@ -63,15 +56,15 @@ class DecodeTests: XCTestCase {
6356
// If this just started failing, hello 2024!
6457
let jwt = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MjgxODg0OTF9.EW7k-8Mvnv0GpvOKJalFRLoCB3a3xGG3i7hAZZXNAz0"
6558

66-
let claims: ClaimSet = try JWT.decode(jwt, algorithm: .hs256("secret".data(using: .utf8)!))
59+
let claims = try JWT.decode(jwt, algorithm: .hs256("secret".data(using: .utf8)!))
6760
XCTAssertEqual(claims.expiration?.timeIntervalSince1970, 1728188491)
6861
}
6962

7063
func testUnexpiredClaimString() throws {
7164
// If this just started failing, hello 2024!
7265
let jwt = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOiIxNzI4MTg4NDkxIn0.y4w7lNLrfRRPzuNUfM-ZvPkoOtrTU_d8ZVYasLdZGpk"
7366

74-
let claims: ClaimSet = try JWT.decode(jwt, algorithm: .hs256("secret".data(using: .utf8)!))
67+
let claims = try JWT.decode(jwt, algorithm: .hs256("secret".data(using: .utf8)!))
7568
XCTAssertEqual(claims.expiration?.timeIntervalSince1970, 1728188491)
7669
}
7770

@@ -80,14 +73,14 @@ class DecodeTests: XCTestCase {
8073
func testNotBeforeClaim() throws {
8174
let jwt = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE0MjgxODk3MjB9.jFT0nXAJvEwyG6R7CMJlzNJb7FtZGv30QRZpYam5cvs"
8275

83-
let claims: ClaimSet = try JWT.decode(jwt, algorithm: .hs256("secret".data(using: .utf8)!))
76+
let claims = try JWT.decode(jwt, algorithm: .hs256("secret".data(using: .utf8)!))
8477
XCTAssertEqual(claims.notBefore?.timeIntervalSince1970, 1428189720)
8578
}
8679

8780
func testNotBeforeClaimString() throws {
8881
let jwt = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOiIxNDI4MTg5NzIwIn0.qZsj36irdmIAeXv6YazWDSFbpuxHtEh4Deof5YTpnVI"
8982

90-
let claims: ClaimSet = try JWT.decode(jwt, algorithm: .hs256("secret".data(using: .utf8)!))
83+
let claims = try JWT.decode(jwt, algorithm: .hs256("secret".data(using: .utf8)!))
9184
XCTAssertEqual(claims.notBefore?.timeIntervalSince1970, 1428189720)
9285
}
9386

@@ -107,14 +100,14 @@ class DecodeTests: XCTestCase {
107100
func testIssuedAtClaimInThePast() throws {
108101
let jwt = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE0MjgxODk3MjB9.I_5qjRcCUZVQdABLwG82CSuu2relSdIyJOyvXWUAJh4"
109102

110-
let claims: ClaimSet = try JWT.decode(jwt, algorithm: .hs256("secret".data(using: .utf8)!))
103+
let claims = try JWT.decode(jwt, algorithm: .hs256("secret".data(using: .utf8)!))
111104
XCTAssertEqual(claims.issuedAt?.timeIntervalSince1970, 1428189720)
112105
}
113106

114107
func testIssuedAtClaimInThePastString() throws {
115108
let jwt = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOiIxNDI4MTg5NzIwIn0.M8veWtsY52oBwi7LRKzvNnzhjK0QBS8Su1r0atlns2k"
116109

117-
let claims: ClaimSet = try JWT.decode(jwt, algorithm: .hs256("secret".data(using: .utf8)!))
110+
let claims = try JWT.decode(jwt, algorithm: .hs256("secret".data(using: .utf8)!))
118111
XCTAssertEqual(claims.issuedAt?.timeIntervalSince1970, 1428189720)
119112
}
120113

@@ -185,24 +178,24 @@ class DecodeTests: XCTestCase {
185178

186179
func testHS512Algorithm() {
187180
let jwt = "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzb21lIjoicGF5bG9hZCJ9.WTzLzFO079PduJiFIyzrOah54YaM8qoxH9fLMQoQhKtw3_fMGjImIOokijDkXVbyfBqhMo2GCNu4w9v7UXvnpA"
188-
assertSuccess(try decode(jwt, algorithm: .hs512("secret".data(using: .utf8)!))) { payload in
189-
XCTAssertEqual(payload as! [String: String], ["some": "payload"])
181+
assertSuccess(try decode(jwt, algorithm: .hs512("secret".data(using: .utf8)!))) { claims in
182+
XCTAssertEqual(claims as! [String: String], ["some": "payload"])
190183
}
191184
}
192185
}
193186

194187
// MARK: Helpers
195188

196-
func assertSuccess(_ decoder: @autoclosure () throws -> Payload, closure: ((Payload) -> Void)? = nil) {
189+
func assertSuccess(_ decoder: @autoclosure () throws -> ClaimSet, closure: (([String: Any]) -> Void)? = nil) {
197190
do {
198-
let payload = try decoder()
199-
closure?(payload)
191+
let claims = try decoder()
192+
closure?(claims.claims as [String: Any])
200193
} catch {
201194
XCTFail("Failed to decode while expecting success. \(error)")
202195
}
203196
}
204197

205-
func assertFailure(_ decoder: @autoclosure () throws -> Payload, closure: ((InvalidToken) -> Void)? = nil) {
198+
func assertFailure(_ decoder: @autoclosure () throws -> ClaimSet, closure: ((InvalidToken) -> Void)? = nil) {
206199
do {
207200
_ = try decoder()
208201
XCTFail("Decoding succeeded, expected a failure.")
@@ -213,7 +206,7 @@ func assertFailure(_ decoder: @autoclosure () throws -> Payload, closure: ((Inva
213206
}
214207
}
215208

216-
func assertDecodeError(_ decoder: @autoclosure () throws -> Payload, error: String) {
209+
func assertDecodeError(_ decoder: @autoclosure () throws -> ClaimSet, error: String) {
217210
assertFailure(try decoder()) { failure in
218211
switch failure {
219212
case .decodeError(let decodeError):

Tests/JWTTests/JWTEncodeTests.swift

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,31 +6,53 @@ class JWTEncodeTests: XCTestCase {
66
func testEncodingJWT() {
77
let payload = ["name": "Kyle"] as Payload
88
let jwt = JWT.encode(claims: payload, algorithm: .hs256("secret".data(using: .utf8)!))
9-
9+
1010
let expected = [
1111
// { "alg": "HS256", "typ": "JWT" }
1212
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiS3lsZSJ9.zxm7xcp1eZtZhp4t-nlw09ATQnnFKIiSN83uG8u6cAg",
13-
13+
1414
// { "typ": "JWT", "alg": "HS256" }
15-
"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiS3lsZSJ9.4tCpoxfyfjbUyLjm9_zu-r52Vxn6bFq9kp6Rt9xMs4A",
15+
"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiS3lsZSJ9.4tCpoxfyfjbUyLjm9_zu-r52Vxn6bFq9kp6Rt9xMs4A"
1616
]
17-
17+
1818
XCTAssertTrue(expected.contains(jwt))
1919
}
20-
20+
2121
func testEncodingWithBuilder() {
2222
let algorithm = Algorithm.hs256("secret".data(using: .utf8)!)
2323
let jwt = JWT.encode(algorithm) { builder in
2424
builder.issuer = "fuller.li"
2525
}
26-
27-
XCTAssertEqual(jwt, "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJmdWxsZXIubGkifQ.d7B7PAQcz1E6oNhrlxmHxHXHgg39_k7X7wWeahl8kSQ")
26+
27+
let expected = [
28+
// { "alg": "HS256", "typ": "JWT" }
29+
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJmdWxsZXIubGkifQ.d7B7PAQcz1E6oNhrlxmHxHXHgg39_k7X7wWeahl8kSQ",
30+
// { "typ": "JWT", "alg": "HS256" }
31+
"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJmdWxsZXIubGkifQ.x5Fdll-kZBImOPtpT1fZH_8hDW01Ax3pbZx_EiljoLk"
32+
]
33+
34+
XCTAssertTrue(expected.contains(jwt))
2835
}
29-
36+
3037
func testEncodingClaimsWithHeaders() {
3138
let algorithm = Algorithm.hs256("secret".data(using: .utf8)!)
3239
let jwt = JWT.encode(claims: ClaimSet(), algorithm: algorithm, headers: ["kid": "x"])
33-
34-
XCTAssertEqual(jwt, "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IngifQ.e30.ddEotxYYMMdat5HPgYFQnkHRdPXsxPG71ooyhIUoqGA")
40+
41+
let expected = [
42+
// { "alg": "HS256", "typ": "JWT", "kid": "x" }
43+
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IngifQ.e30.ddEotxYYMMdat5HPgYFQnkHRdPXsxPG71ooyhIUoqGA",
44+
// { "alg": "HS256", "kid": "x", "typ": "JWT" }
45+
"eyJhbGciOiJIUzI1NiIsImtpZCI6IngiLCJ0eXAiOiJKV1QifQ.e30.xiT6fWe5dWGeuq8zFb0je_14Maa_9mHbVPSyJhUIJ54",
46+
// { "typ": "JWT", "alg": "HS256", "kid": "x" }
47+
"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImtpZCI6IngifQ.e30.5t6a61tpSXFo5QBHYCnKAz2mTHrW9kaQ9n_b7e-jWw0",
48+
// { "typ": "JWT", "kid": "x", "alg": "HS256" }
49+
"eyJ0eXAiOiJKV1QiLCJraWQiOiJ4IiwiYWxnIjoiSFMyNTYifQ.e30.DG5nmV2CVH6mV_iEm0xXZvL0DUJ22ek2xy6fNi_pGLc",
50+
// { "kid": "x", "typ": "JWT", "alg": "HS256" }
51+
"eyJraWQiOiJ4IiwidHlwIjoiSldUIiwiYWxnIjoiSFMyNTYifQ.e30.h5ZvlqECBIvu9uocR5_5uF3wnhga8vTruvXpzaHpRdA",
52+
// { "kid": "x", "alg": "HS256", "typ": "JWT" }
53+
"eyJraWQiOiJ4IiwiYWxnIjoiSFMyNTYiLCJ0eXAiOiJKV1QifQ.e30.5KqN7N5a7Cfbe2eKN41FJIfgMjcdSZ7Nt16xqlyOeMo"
54+
]
55+
56+
XCTAssertTrue(expected.contains(jwt))
3557
}
3658
}

0 commit comments

Comments
 (0)