File indexing completed on 2025-02-16 04:50:53
0001 /* 0002 * SPDX-FileCopyrightText: 2021 Volker Krause <vkrause@kde.org> 0003 * SPDX-License-Identifier: LGPL-2.0-or-later 0004 */ 0005 0006 #include "divocparser_p.h" 0007 #include "jwsverifier_p.h" 0008 #include "kvaccinationcertificate.h" 0009 0010 #include <QByteArray> 0011 #include <QJsonDocument> 0012 #include <QJsonArray> 0013 #include <QVariant> 0014 0015 void DivocParser::init() 0016 { 0017 Q_INIT_RESOURCE(divoc_data); 0018 } 0019 0020 QVariant DivocParser::parse(const QByteArray &data) 0021 { 0022 QJsonParseError error; 0023 const auto doc = QJsonDocument::fromJson(data, &error); 0024 if (error.error != QJsonParseError::NoError) { 0025 return {}; 0026 } 0027 0028 // TODO check this is actually a VerifiableCredential structure 0029 // TODO check the types on the subobjects we use 0030 0031 KVaccinationCertificate cert; 0032 const auto subject = doc.object().value(QLatin1String("credentialSubject")).toObject(); 0033 cert.setName(subject.value(QLatin1String("name")).toString()); 0034 const auto evidences = doc.object().value(QLatin1String("evidence")).toArray(); 0035 if (evidences.isEmpty()) { 0036 return {}; 0037 } 0038 0039 const auto evidence = evidences.at(0).toObject(); 0040 cert.setDate(QDateTime::fromString(evidence.value(QLatin1String("date")).toString(), Qt::ISODate).date()); 0041 cert.setVaccine(evidence.value(QLatin1String("vaccine")).toString()); 0042 cert.setManufacturer(evidence.value(QLatin1String("manufacturer")).toString()); 0043 cert.setDose(evidence.value(QLatin1String("dose")).toInt()); 0044 cert.setTotalDoses(evidence.value(QLatin1String("totalDoses")).toInt()); 0045 0046 const auto facility = evidence.value(QLatin1String("facility")).toObject(); 0047 const auto address = facility.value(QLatin1String("address")).toObject(); 0048 cert.setCountry(address.value(QLatin1String("addressCountry")).toString()); 0049 0050 cert.setCertificateId(evidence.value(QLatin1String("certificateId")).toString()); 0051 cert.setCertificateIssuer(doc.object().value(QLatin1String("issuer")).toString()); 0052 cert.setCertificateIssueDate(QDateTime::fromString(doc.object().value(QLatin1String("issuanceDate")).toString(), Qt::ISODate)); 0053 0054 JwsVerifier verifier(doc.object()); 0055 cert.setSignatureState(verifier.verify() ? KHealthCertificate::ValidSignature : KHealthCertificate::InvalidSignature); 0056 0057 return cert; 0058 }