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 }