Skip to content

Commit

Permalink
feat(ios): registration error logic
Browse files Browse the repository at this point in the history
  • Loading branch information
elylucas committed Sep 8, 2021
1 parent a01fd20 commit 5a00853
Show file tree
Hide file tree
Showing 3 changed files with 84 additions and 12 deletions.
88 changes: 80 additions & 8 deletions ios/IonicPortals/IonicPortals/PortalManager.swift
Expand Up @@ -14,7 +14,9 @@ public class PortalManager {
// MARK: - Instance Properties

private static var portals = Dictionary<String, Portal>()
private static var registered = true
private static var registered = false
private static var registeredError = false
private static var unregisteredMesssageShown = false

// Initialization

Expand All @@ -34,8 +36,8 @@ public class PortalManager {
*/
public static func addPortal(_ portal: Portal) -> Void {
portals[portal.name] = portal
if !registered {
print("Don't forget to register your copy of portals! Register at: ionic.io/portals")
if !registered && !unregisteredMesssageShown {
self.unregisteredMessage()
}
}

Expand All @@ -49,6 +51,9 @@ public class PortalManager {
guard let output = portals[name] else {
throw PortalError.notFound("Portal with portalId \(name) not found in PortalManager")
}
if self.registeredError {
self.registrationError()
}
return output
}

Expand All @@ -67,13 +72,80 @@ public class PortalManager {
return self.registered
}

/**
Todo: Replace stub register method with actual registration logic
*/
static func register() {
self.registered = true
public static func register(_ key: String) {
self.registered = self.validateToken(key)
}

private static func base64FromBase64Url(_ base64Url: String) -> String {
var base64 = base64Url
.replacingOccurrences(of: "-", with: "+")
.replacingOccurrences(of: "_", with: "/")
base64 += String(repeating: "=", count: base64.count % 4)
return base64
}

private static func validateToken(_ token: String) -> Bool {
let publicKeyBase64 =
"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1+gMC3aJVGX4ha5asmEF" +
"TfP0FTFQlCD8d/J+dhp5dpx3ErqSReru0QSUaCRCEGV/ZK3Vp5lnv1cREQDG5H/t" +
"Xm9Ao06b0QJYtsYhcPgRUU9awDI7jRKueXyAq4zAx0RHZlmOsTf/cNwRnmRnkyJP" +
"a21mLNClmdPlhWjS6AHjaYe79ieAsftFA+QodtzoCo+w9A9YCvc6ngGOFoLIIbzs" +
"jv6h9ES27mi5BUqhoHsetS4u3/pCbsV2U3z255gtjANtdIX/c5inepLuAjyc1aPz" +
"2eu4TbzabvJnmNStje82NW36Qij1mupc4e7dYaq0aMNQyHSWk1/CuIcqEYlnK1mb" +
"kQIDAQAB"

let pubKeyData = Data(base64Encoded: publicKeyBase64)
let attributes: [String: Any] = [
kSecAttrKeyType as String: kSecAttrKeyTypeRSA,
kSecAttrKeyClass as String: kSecAttrKeyClassPublic
]
let publicKey = SecKeyCreateWithData(pubKeyData! as NSData, attributes as NSDictionary, nil)!

let parts = token.split(separator: ".")
if parts.count != 3 {
self.registrationError()
return false
}
let headerAndPayload = "\(parts[0]).\(parts[1])"
let signature = String(parts[2])

let headersAndPayloadData = headerAndPayload.data(using: .ascii)! as CFData
let signatureData = Data(base64Encoded: self.base64FromBase64Url(signature))! as CFData


var error: Unmanaged<CFError>?

let result = SecKeyVerifySignature(
publicKey,
.rsaSignatureMessagePKCS1v15SHA256,
headersAndPayloadData,
signatureData,
&error
)

if !result {
self.registrationError()
}

return result
}

private static func registrationError() {
self.registeredError = true
print("Error validating key")
let alert = UIAlertController(title: nil, message: "Error validating your key for Ionic Portals. Check your key and try again.", preferredStyle: .alert)
let okButton = UIAlertAction(title: "OK", style: .default, handler: { action -> Void in alert.dismiss(animated: true) })
alert.addAction(okButton)
let rc = UIApplication.shared.keyWindow?.rootViewController
rc?.present(alert, animated: true)
}

private static func unregisteredMessage() {
if !self.unregisteredMesssageShown {
print("Don't forget to register your copy of portals! Register at: ionic.io/register-portals")
self.unregisteredMesssageShown = true
}
}

}

4 changes: 2 additions & 2 deletions ios/IonicPortals/IonicPortals/UnregisteredView.xib
Expand Up @@ -33,8 +33,8 @@
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="ionic.io/portals" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Qrk-fk-fbn">
<rect key="frame" x="148" y="498" width="118" height="22"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="ionic.io/register-portals" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Qrk-fk-fbn">
<rect key="frame" x="113.5" y="498" width="187" height="22"/>
<fontDescription key="fontDescription" type="system" pointSize="18"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
Expand Down
4 changes: 2 additions & 2 deletions plugin/package.json
@@ -1,6 +1,6 @@
{
"name": "@native-portal/portals",
"version": "0.0.4",
"name": "@ionic/portals",
"version": "0.0.5",
"description": "SDK Plugin for Ionic Portals",
"homepage": "https://ionic.io/portals",
"main": "dist/plugin.cjs.js",
Expand Down

0 comments on commit 5a00853

Please sign in to comment.