MailJD nbsp;·nbsp; Test Dashboard nbsp;·nbsp; Coverage
LCOV - code coverage report
Current view: top level - /builds/jens/qmailjd/tools - runtime_security_probe.cpp (source / functions) Coverage Total Hit
Test: MailJD Coverage (Unit + E2E) Lines: 84.5 % 58 49
Test Date: 2026-07-27 17:53:44 Functions: 100.0 % 2 2
Legend: Lines:     hit not hit
Branches: + taken - not taken # not executed
Branches: 35.8 % 190 68

             Branch data     Line data    Source code
       1                 :             : #include <QCoreApplication>
       2                 :             : #include <QJsonDocument>
       3                 :             : #include <QJsonObject>
       4                 :             : #include <QTextStream>
       5                 :             : #include <QVersionNumber>
       6                 :             : #include <QtWebEngineCore/qtwebenginecoreglobal.h>
       7                 :             : 
       8                 :             : namespace {
       9                 :             : 
      10                 :           3 : bool versionAtLeast(const QString &actual, const QString &minimum) {
      11         [ +  - ]:           3 :   const QVersionNumber actualVersion = QVersionNumber::fromString(actual);
      12         [ +  - ]:           3 :   const QVersionNumber minimumVersion = QVersionNumber::fromString(minimum);
      13   [ +  -  +  -  :           6 :   return !actualVersion.isNull() && !minimumVersion.isNull() &&
                   +  - ]
      14                 :           6 :          QVersionNumber::compare(actualVersion, minimumVersion) >= 0;
      15                 :           3 : }
      16                 :             : 
      17                 :             : } // namespace
      18                 :             : 
      19                 :           1 : int main(int argc, char **argv) {
      20         [ +  - ]:           1 :   QCoreApplication app(argc, argv);
      21   [ +  -  +  - ]:           1 :   const QStringList arguments = app.arguments().mid(1);
      22         [ +  + ]:           2 :   for (const QString &argument : arguments) {
      23   [ -  +  +  -  :           3 :     if (argument != QStringLiteral("--check") &&
                   -  + ]
      24   [ -  -  -  +  :           1 :         argument != QStringLiteral("--json")) {
             -  +  +  - ]
      25   [ #  #  #  #  :           0 :       QTextStream(stderr) << "Usage: " << app.applicationName()
             #  #  #  # ]
      26         [ #  # ]:           0 :                           << " [--json] [--check]\n";
      27                 :           0 :       return 2;
      28                 :             :     }
      29                 :             :   }
      30                 :             : 
      31                 :             :   const QString qtWebEngine =
      32         [ +  - ]:           1 :       QString::fromUtf8(MAILJD_QT_WEBENGINE_PACKAGE_VERSION);
      33         [ +  - ]:           1 :   const QString qtPdf = QString::fromUtf8(MAILJD_QT_PDF_PACKAGE_VERSION);
      34         [ +  - ]:           1 :   const QString chromium = QString::fromUtf8(qWebEngineChromiumVersion());
      35                 :             :   const QString chromiumPatch =
      36         [ +  - ]:           1 :       QString::fromUtf8(qWebEngineChromiumSecurityPatchVersion());
      37                 :             :   const QString minimumQtWebEngine =
      38         [ +  - ]:           1 :       QString::fromUtf8(MAILJD_MIN_QT_WEBENGINE_VERSION);
      39         [ +  - ]:           1 :   const QString minimumQtPdf = QString::fromUtf8(MAILJD_MIN_QT_PDF_VERSION);
      40                 :             :   const QString minimumChromiumPatch =
      41         [ +  - ]:           1 :       QString::fromUtf8(MAILJD_MIN_CHROMIUM_SECURITY_PATCH);
      42                 :             : 
      43                 :             :   const bool webEngineCompliant =
      44         [ +  - ]:           1 :       versionAtLeast(qtWebEngine, minimumQtWebEngine);
      45         [ +  - ]:           1 :   const bool pdfCompliant = versionAtLeast(qtPdf, minimumQtPdf);
      46                 :             :   const bool chromiumCompliant =
      47         [ +  - ]:           1 :       versionAtLeast(chromiumPatch, minimumChromiumPatch);
      48                 :           1 :   const bool compliant =
      49   [ +  -  +  -  :           1 :       webEngineCompliant && pdfCompliant && chromiumCompliant;
                   +  - ]
      50                 :             : 
      51                 :             :   const QJsonObject runtime{
      52         [ +  - ]:           2 :       {QStringLiteral("qtCore"), QString::fromUtf8(qVersion())},
      53                 :           2 :       {QStringLiteral("qtWebEnginePackage"), qtWebEngine},
      54                 :           2 :       {QStringLiteral("qtPdfPackage"), qtPdf},
      55                 :           2 :       {QStringLiteral("chromium"), chromium},
      56                 :           2 :       {QStringLiteral("chromiumSecurityPatch"), chromiumPatch},
      57                 :           3 :       {QStringLiteral("pdfBackend"), QStringLiteral("PDFium via Qt PDF")},
      58   [ +  +  -  - ]:           7 :   };
      59                 :             :   const QJsonObject minimum{
      60                 :           2 :       {QStringLiteral("qtWebEnginePackage"), minimumQtWebEngine},
      61                 :           2 :       {QStringLiteral("qtPdfPackage"), minimumQtPdf},
      62                 :           2 :       {QStringLiteral("chromiumSecurityPatch"), minimumChromiumPatch},
      63   [ +  +  -  - ]:           4 :   };
      64                 :             :   const QJsonObject checks{
      65                 :           2 :       {QStringLiteral("qtWebEnginePackage"), webEngineCompliant},
      66                 :           2 :       {QStringLiteral("qtPdfPackage"), pdfCompliant},
      67                 :           2 :       {QStringLiteral("chromiumSecurityPatch"), chromiumCompliant},
      68   [ +  +  -  - ]:           4 :   };
      69                 :             :   const QJsonObject report{
      70                 :           2 :       {QStringLiteral("schemaVersion"), 1},
      71                 :           2 :       {QStringLiteral("runtime"), runtime},
      72                 :           2 :       {QStringLiteral("minimum"), minimum},
      73                 :           2 :       {QStringLiteral("checks"), checks},
      74                 :           2 :       {QStringLiteral("compliant"), compliant},
      75   [ +  +  -  - ]:           7 :   };
      76                 :             : 
      77   [ +  -  +  -  :           1 :   QTextStream(stdout) << QJsonDocument(report).toJson(QJsonDocument::Indented);
             +  -  +  - ]
      78   [ +  -  -  +  :           2 :   if (arguments.contains(QStringLiteral("--check")) && !compliant) {
          +  -  +  -  -  
                      + ]
      79   [ #  #  #  # ]:           0 :     QTextStream(stderr) << "Runtime security policy failed: WebEngine "
      80   [ #  #  #  #  :           0 :                         << qtWebEngine << " (minimum " << minimumQtWebEngine
                   #  # ]
      81   [ #  #  #  #  :           0 :                         << "), Qt PDF " << qtPdf << " (minimum " << minimumQtPdf
             #  #  #  # ]
      82   [ #  #  #  # ]:           0 :                         << "), Chromium security patch " << chromiumPatch
      83   [ #  #  #  #  :           0 :                         << " (minimum " << minimumChromiumPatch << ").\n";
                   #  # ]
      84                 :           0 :     return 1;
      85                 :             :   }
      86                 :           1 :   return 0;
      87   [ +  -  +  -  :          22 : }
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
             -  -  -  - ]
        

Generated by: LCOV version 2.0-1