39 lines
1.4 KiB
Swift
39 lines
1.4 KiB
Swift
import Foundation
|
|
|
|
struct PairingPayloadContext: Equatable {
|
|
let deviceName: String
|
|
let originHost: 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,
|
|
tokenPreview: String(token.suffix(6))
|
|
)
|
|
}
|
|
|
|
if trimmedPayload.contains("token") || trimmedPayload.contains("pair") {
|
|
return PairingPayloadContext(
|
|
deviceName: "Manual Session",
|
|
originHost: "code.foss.global",
|
|
tokenPreview: String(trimmedPayload.suffix(6))
|
|
)
|
|
}
|
|
|
|
throw AppError.invalidPairingPayload
|
|
}
|
|
}
|