Skip to content

Commit 45e5d4a

Browse files
authored
Remove deprecated encode/decode methods, fix warnings and other… (#112)
Remove deprecated encode/decode methods, fix warnings and other stuff
2 parents 9f67977 + 50b7757 commit 45e5d4a

File tree

10 files changed

+155
-84
lines changed

10 files changed

+155
-84
lines changed

.travis.yml

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
os:
22
- osx
33
- linux
4-
osx_image: xcode9
4+
osx_image: xcode9.4
55
language: generic
66
sudo: required
77
dist: trusty
8+
89
env:
910
global:
1011
- SWIFT_VERSION=4.0
12+
- SWIFT_VERSION=4.1.2
1113
matrix:
12-
- SWIFTPM_BUILD=true
1314
- SWIFTPM_TEST=true
1415
- XCODE_TEST_SDK=macosx
1516
- XCODE_BUILD_SDK=iphonesimulator
@@ -18,12 +19,6 @@ env:
1819

1920
matrix:
2021
exclude:
21-
# No need to build and test on macOS
22-
- os: osx
23-
env: SWIFTPM_BUILD=true
24-
# LinuxMain.swift is out of sync
25-
- os: linux
26-
env: SWIFTPM_TEST=true
2722
- os: linux
2823
env: XCODE_TEST_SDK=macosx
2924
- os: linux
@@ -37,7 +32,6 @@ install:
3732
- eval "$(curl -sL https://swiftenv.fuller.li/install.sh)"
3833

3934
script:
40-
- if [ -n "$SWIFTPM_BUILD" ]; then swift build; fi
4135
- if [ -n "$SWIFTPM_TEST" ]; then swift test; fi
4236
- if [ -n "$XCODE_BUILD_SDK" ] || [ -n "$XCODE_TEST_SDK" ]; then swift package generate-xcodeproj; fi
4337
- if [ -n "$XCODE_BUILD_SDK" ]; then xcodebuild -project JWT.xcodeproj -scheme JWT-Package build -sdk $XCODE_BUILD_SDK; fi

Package.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,18 @@ import PackageDescription
44

55

66
#if os(macOS) || os(iOS) || os(watchOS) || os(tvOS)
7+
#if canImport(CommonCrypto)
8+
let dependencies: [Package.Dependency] = []
9+
#else
710
let dependencies = [
811
Package.Dependency.package(url: "https://github.com/kylef-archive/CommonCrypto.git", from: "1.0.0"),
912
]
13+
#endif
1014
let excludes = ["HMAC/HMACCryptoSwift.swift"]
1115
let targetDependencies: [Target.Dependency] = []
1216
#else
1317
let dependencies = [
14-
Package.Dependency.package(url: "https://github.com/krzyzanowskim/CryptoSwift.git", from: "0.8.0"),
18+
Package.Dependency.package(url: "https://github.com/krzyzanowskim/CryptoSwift.git", from: "0.10.0"),
1519
]
1620
let excludes = ["HMAC/HMACCommonCrypto.swift"]
1721
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: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ func parseTimeInterval(_ value: Any?) -> Date? {
66
if let string = value as? String, let interval = TimeInterval(string) {
77
return Date(timeIntervalSince1970: interval)
88
}
9+
10+
if let interval = value as? Int {
11+
let double = Double(interval)
12+
return Date(timeIntervalSince1970: double)
13+
}
914

1015
if let interval = value as? TimeInterval {
1116
return Date(timeIntervalSince1970: interval)
@@ -104,7 +109,7 @@ extension ClaimSet {
104109
try validateAudience(audience)
105110
}
106111

107-
try validateExpiary(leeway: leeway)
112+
try validateExpiry(leeway: leeway)
108113
try validateNotBefore(leeway: leeway)
109114
try validateIssuedAt(leeway: leeway)
110115
}
@@ -132,8 +137,13 @@ extension ClaimSet {
132137
throw InvalidToken.invalidIssuer
133138
}
134139
}
135-
140+
141+
@available(*, deprecated, message: "This method's name is misspelled. Please instead use validateExpiry(leeway:).")
136142
public func validateExpiary(leeway: TimeInterval = 0) throws {
143+
try validateExpiry(leeway: leeway)
144+
}
145+
146+
public func validateExpiry(leeway: TimeInterval = 0) throws {
137147
try validateDate(claims, key: "exp", comparison: .orderedAscending, leeway: (-1 * leeway), failure: .expiredSignature, decodeError: "Expiration time claim (exp) must be an integer")
138148
}
139149

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: 19 additions & 26 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

@@ -54,7 +47,7 @@ class DecodeTests: XCTestCase {
5447
XCTAssertThrowsError(try decode(jwt, algorithm: .hs256("secret".data(using: .utf8)!)))
5548
}
5649

57-
func testInvalidExpiaryClaim() {
50+
func testInvalidExpiryClaim() {
5851
let jwt = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOlsiMTQyODE4ODQ5MSJdfQ.OwF-wd3THjxrEGUhh6IdnNhxQZ7ydwJ3Z6J_dfl9MBs"
5952
XCTAssertThrowsError(try decode(jwt, algorithm: .hs256("secret".data(using: .utf8)!)))
6053
}
@@ -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)!))
67-
XCTAssertEqual(claims.expiration?.timeIntervalSince1970, 1728188491)
59+
let claims = try JWT.decode(jwt, algorithm: .hs256("secret".data(using: .utf8)!))
60+
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)