a298b5e421
CI / test (push) Has been cancelled
Switch the app to the real passport enrollment, dashboard, device, alert, and challenge APIs so it can pair with idp.global and act on server-backed state instead of demo data.
48 lines
1.8 KiB
Swift
48 lines
1.8 KiB
Swift
import Foundation
|
|
|
|
struct PairingPayloadContext: Equatable {
|
|
let deviceName: String
|
|
let originHost: String
|
|
let pairingToken: String
|
|
let challenge: String?
|
|
let challengeID: String?
|
|
let tokenPreview: String
|
|
}
|
|
|
|
enum PairingPayloadParser {
|
|
static func parse(_ payload: String) throws -> PairingPayloadContext {
|
|
let trimmedPayload = payload.trimmingCharacters(in: .whitespacesAndNewlines)
|
|
|
|
if let components = URLComponents(string: trimmedPayload),
|
|
components.scheme == "idp.global",
|
|
components.host == "pair" {
|
|
let queryItems = components.queryItems ?? []
|
|
let token = queryItems.first(where: { $0.name == "token" })?.value ?? "demo-token"
|
|
let origin = queryItems.first(where: { $0.name == "origin" })?.value ?? "code.foss.global"
|
|
let device = queryItems.first(where: { $0.name == "device" })?.value ?? "Web Session"
|
|
|
|
return PairingPayloadContext(
|
|
deviceName: device,
|
|
originHost: origin,
|
|
pairingToken: token,
|
|
challenge: queryItems.first(where: { $0.name == "challenge" })?.value,
|
|
challengeID: queryItems.first(where: { $0.name == "challenge_id" })?.value,
|
|
tokenPreview: String(token.suffix(6))
|
|
)
|
|
}
|
|
|
|
if trimmedPayload.contains("token") || trimmedPayload.contains("pair") {
|
|
return PairingPayloadContext(
|
|
deviceName: "Manual Session",
|
|
originHost: "code.foss.global",
|
|
pairingToken: trimmedPayload,
|
|
challenge: nil,
|
|
challengeID: nil,
|
|
tokenPreview: String(trimmedPayload.suffix(6))
|
|
)
|
|
}
|
|
|
|
throw AppError.invalidPairingPayload
|
|
}
|
|
}
|