diff --git a/PatientScannerDemo/Models/HCert.swift b/PatientScannerDemo/Models/HCert.swift index e99d900..b5978f9 100644 --- a/PatientScannerDemo/Models/HCert.swift +++ b/PatientScannerDemo/Models/HCert.swift @@ -14,15 +14,33 @@ enum ClaimKey: String { case EU_DGC_V1 = "1" } +enum AttributeKey: String { + case firstName + case lastName +} + +let attributeKeys: [AttributeKey: [String]] = [ + .firstName: ["sub", "gn"], + .lastName: ["sub", "fn"], +] + struct InfoSection { var header: String var content: String } struct HCert { + static let supportedPrefixes = [ + "HC1:" + ] + mutating func parseBodyV1() -> Bool { - let schema = JSON(parseJSON: EU_DGC_SCHEMA_V1).dictionaryObject! - let bodyDict = body.dictionaryObject! + guard + let schema = JSON(parseJSON: EU_DGC_SCHEMA_V1).dictionaryObject, + let bodyDict = body.dictionaryObject + else { + return false + } guard let validation = try? validate(bodyDict, schema: schema) @@ -63,67 +81,25 @@ struct HCert { print("Wrong EU_DGC Version!") return nil } -// body = JSON(parseJSON: """ -// { -// "vac" : [ -// { -// "seq" : 1, -// "lot" : "C22-862FF-001", -// "dis" : "840539006", -// "adm" : "Vaccination centre Vienna 23", -// "vap" : "1119305005", -// "mep" : "EU\\/1\\/20\\/1528", -// "tot" : 2, -// "aut" : "ORG-100030215", -// "dat" : "2021-02-18", -// "cou" : "AT" -// }, -// { -// "seq" : 2, -// "lot" : "C22-H62FF-010", -// "dis" : "840539006", -// "adm" : "Vaccination centre Vienna 23", -// "vap" : "1119305005", -// "mep" : "EU\\/1\\/20\\/1528", -// "tot" : 2, -// "aut" : "ORG-100030215", -// "dat" : "2021-03-12", -// "cou" : "AT" -// } -// ], -// "cert" : { -// "id" : "01AT42196560275230427402470256520250042", -// "is" : "Ministry of Health, Austria", -// "vr" : "v1.0", -// "vf" : "2021-04-04", -// "vu" : "2021-10-04", -// "co" : "AT" -// }, -// "sub" : { -// "gen" : "female", -// "dob" : "1998-02-26", -// "id" : [ -// { -// "i" : "12345ABC-321", -// "t" : "PPN" -// } -// ], -// "gn" : "Gabriele", -// "fn" : "Musterfrau" -// } -// } -//""") } var header: JSON var body: JSON var fullName: String { - let first = body["sub"]["gn"].string ?? "" - let last = body["sub"]["fn"].string ?? "" + let first = get(.firstName).string ?? "" + let last = get(.lastName).string ?? "" return "\(first) \(last)" } + func get(_ attribute: AttributeKey) -> JSON { + var object = body + for key in attributeKeys[attribute] ?? [] { + object = object[key] + } + return object + } + var info: [InfoSection] { [ InfoSection(header: "Test", content: "Test Test") diff --git a/PatientScannerDemo/ViewControllers/Scan.swift b/PatientScannerDemo/ViewControllers/Scan.swift index 99f9bb6..4b1699f 100644 --- a/PatientScannerDemo/ViewControllers/Scan.swift +++ b/PatientScannerDemo/ViewControllers/Scan.swift @@ -158,9 +158,22 @@ extension ScanVC { func observationHandler(payloadS: String?) { let payloadS: String? = payloadS ?? "HC1:NCFD:MFY7AP2.532EE3*45+G W84$2J85AUFA3QHN7SXNF$S-4THFSJFIMSKD3799U/LN71G32S0L43XHEIB*983A8RMF1/MMMIS6AQC0QNGU+I.AKYQKBPL%YA-ZVT28J3D+WNNL6SEV%GH$$3NRHO%L8BVLJBL:3F0AKIH3.1U2VS0WZLD75Q52EAENQ-HAYIXTGFH9%ZKA6Q$8A4J67E585MUDPCGCSY3SA7YPCPXCVDL-S0Z.CM6M7%H5POR-ACBI7MT3ZARJ7%S29G596OFMRF-65T6O*M.BJ3DI0W3%:ITBAF 9B1D3SQ$A5LOCTQQZ 40IPR:R3 PUXUN01XD8SJ62MRN$BV502.0HLGS/NXXJ AS.X5QZ2SGTEKLKHB4T8F%S664E02MH2F A.BH9+R7N6N5N.USZXL7DO2AIV2P0XU2.OPI6 C395EPMMGDAD4G-S1DC8ZVJT:3CR3-P8ZVGV8A$DD+*0/MH5+MPDO:L9IJ6MU278C924V:09%1MUQTR2FBL5 6CLODPT304L3GK6OT-7 97U*IO7J:1MB1EU0E.G3C/4P7FXRF-04F9O-9VREIPOSWTFU2W%2F4-B$CSSVNWKAHWJA4NCEU$KLU$GQ6OJ-97UN" guard - let payloadString = payloadS, + var payloadString = payloadS + else { + return + } + + for prefix in HCert.supportedPrefixes { + if payloadString.starts(with: prefix) { + payloadString = String(payloadString.dropFirst(prefix.count)) + } + } + + guard let compressed = try? String(payloadString.dropFirst(4)).fromBase45() - else { return } + else { + return + } let data = decompress(compressed) // let payload = CBOR.payload(from: data)