Files
swiftapp/swift/Sources/Core/Services/PairingPayloadParser.swift
T
jkunz a298b5e421
CI / test (push) Has been cancelled
replace mock passport flows with live server integration
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.
2026-04-20 13:21:39 +00:00

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
}
}