|
1 | 1 | import Foundation |
2 | | -import UIKit |
3 | 2 |
|
4 | | -/// Manages the registration lifecycle |
| 3 | +/// Registration is no longer required for Ionic Portals. |
| 4 | +@available(*, deprecated, message: "Registration is no longer required.") |
5 | 5 | @objc(IONPortalsRegistrationManager) |
6 | 6 | public class PortalsRegistrationManager: NSObject { |
7 | | - enum RegistrationState: Equatable { |
8 | | - case unregistered(messageShown: Bool) |
9 | | - case registered |
10 | | - case error |
11 | | - } |
12 | | - |
13 | 7 | private override init() {} |
14 | 8 |
|
15 | 9 | /// The default singleton |
16 | 10 | @objc public static let shared = PortalsRegistrationManager() |
17 | 11 |
|
18 | | - internal private(set) var registrationState: RegistrationState = .unregistered(messageShown: false) |
19 | | - |
20 | | - /// Whether Portals has been registered. |
21 | | - /// Will be true when ``register(key:)`` has been called with a valid key. |
| 12 | + /// Always `true`. Registration is no longer required. |
22 | 13 | @objc public var isRegistered: Bool { |
23 | | - switch registrationState { |
24 | | - case .unregistered, .error: |
25 | | - return false |
26 | | - case .registered: |
27 | | - return true |
28 | | - } |
| 14 | + true |
29 | 15 | } |
30 | 16 |
|
31 | | - /// Validates that a valid registration key has been procured from [http://ionic.io/register-portals](http://ionic.io/register-portals) |
32 | | - /// - Parameter key: The registration key |
| 17 | + /// No-op. Registration is no longer required. |
| 18 | + /// - Parameter key: Ignored. |
33 | 19 | @objc public func register(key: String) { |
34 | | - registrationState = validate(key) |
35 | | - } |
36 | | - |
37 | | - private func base64(from base64Url: String) -> String { |
38 | | - var base64 = base64Url |
39 | | - .replacingOccurrences(of: "-", with: "+") |
40 | | - .replacingOccurrences(of: "_", with: "/") |
41 | | - |
42 | | - let remainder = base64.count % 4 |
43 | | - guard remainder > 0 else { return base64 } |
44 | | - |
45 | | - let padding = 4 - remainder |
46 | | - base64 += String(repeating: "=", count: padding) |
47 | | - return base64 |
48 | | - } |
49 | | - |
50 | | - private func validate(_ token: String) -> RegistrationState { |
51 | | - let publicKeyBase64 = |
52 | | - "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1+gMC3aJVGX4ha5asmEF" + |
53 | | - "TfP0FTFQlCD8d/J+dhp5dpx3ErqSReru0QSUaCRCEGV/ZK3Vp5lnv1cREQDG5H/t" + |
54 | | - "Xm9Ao06b0QJYtsYhcPgRUU9awDI7jRKueXyAq4zAx0RHZlmOsTf/cNwRnmRnkyJP" + |
55 | | - "a21mLNClmdPlhWjS6AHjaYe79ieAsftFA+QodtzoCo+w9A9YCvc6ngGOFoLIIbzs" + |
56 | | - "jv6h9ES27mi5BUqhoHsetS4u3/pCbsV2U3z255gtjANtdIX/c5inepLuAjyc1aPz" + |
57 | | - "2eu4TbzabvJnmNStje82NW36Qij1mupc4e7dYaq0aMNQyHSWk1/CuIcqEYlnK1mb" + |
58 | | - "kQIDAQAB" |
59 | | - |
60 | | - let pubKeyData = Data(base64Encoded: publicKeyBase64) |
61 | | - let attributes: [String: Any] = [ |
62 | | - kSecAttrKeyType as String: kSecAttrKeyTypeRSA, |
63 | | - kSecAttrKeyClass as String: kSecAttrKeyClassPublic |
64 | | - ] |
65 | | - let publicKey = SecKeyCreateWithData(pubKeyData! as NSData, attributes as NSDictionary, nil)! |
66 | | - |
67 | | - let parts = token.split(separator: ".") |
68 | | - if parts.count != 3 { |
69 | | - printRegistrationErrorMessage() |
70 | | - return .error |
71 | | - } |
72 | | - let headerAndPayload = "\(parts[0]).\(parts[1])" |
73 | | - let signature = String(parts[2]) |
74 | | - |
75 | | - let headersAndPayloadData = headerAndPayload.data(using: .ascii)! as CFData |
76 | | - let signatureData = Data(base64Encoded: base64(from: signature))! as CFData |
77 | | - |
78 | | - var error: Unmanaged<CFError>? |
79 | | - |
80 | | - let result = SecKeyVerifySignature( |
81 | | - publicKey, |
82 | | - .rsaSignatureMessagePKCS1v15SHA256, |
83 | | - headersAndPayloadData, |
84 | | - signatureData, |
85 | | - &error |
86 | | - ) |
87 | | - |
88 | | - let state: RegistrationState = result ? .registered : .error |
89 | | - |
90 | | - if case .error = state { |
91 | | - printRegistrationErrorMessage() |
92 | | - } |
93 | | - |
94 | | - return state |
95 | | - } |
96 | | - |
97 | | - private func printRegistrationErrorMessage() { |
98 | | - print("Error validating your key for Ionic Portals. Check your key and try again.") |
99 | | - } |
100 | | - |
101 | | - private func unregisteredMessage() { |
102 | | - if case .unregistered(messageShown: false) = registrationState { |
103 | | - print("Don't forget to register your copy of portals! Register at: ionic.io/register-portals") |
104 | | - registrationState = .unregistered(messageShown: true) |
105 | | - } |
106 | 20 | } |
107 | 21 | } |
108 | | - |
0 commit comments