File indexing completed on 2024-04-28 15:27:34

0001 /*
0002     SPDX-FileCopyrightText: 2022 Friedrich W. H. Kossebau <kossebau@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-or-later
0005 */
0006 
0007 #include "messageboxworker.h"
0008 
0009 // KF
0010 #include <KIO/UDSEntry>
0011 // Qt
0012 #include <QCoreApplication>
0013 #include <QDebug>
0014 #include <QMap>
0015 
0016 // Pseudo plugin class to embed meta data
0017 class KIOPluginForMetaData : public QObject
0018 {
0019     Q_OBJECT
0020     Q_PLUGIN_METADATA(IID "org.kde.kio.worker.messagebox" FILE "messageboxworker.json")
0021 };
0022 
0023 extern "C" {
0024 int Q_DECL_EXPORT kdemain(int argc, char **argv);
0025 }
0026 
0027 int kdemain(int argc, char **argv)
0028 {
0029     QCoreApplication app(argc, argv);
0030     app.setApplicationName(QStringLiteral("kiomessagebox"));
0031 
0032     MessageBoxWorker worker(argv[2], argv[3]);
0033     worker.dispatchLoop();
0034 
0035     return 0;
0036 }
0037 
0038 namespace
0039 {
0040 
0041 const QString kdeOrgCertChain = QStringLiteral(
0042     "-----BEGIN CERTIFICATE-----\n"
0043     "MIIHJDCCBgygAwIBAgIQYxPG9R/EMYOGtmoK3J5ByDANBgkqhkiG9w0BAQsFADCB\n"
0044     "jzELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G\n"
0045     "A1UEBxMHU2FsZm9yZDEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTcwNQYDVQQD\n"
0046     "Ey5TZWN0aWdvIFJTQSBEb21haW4gVmFsaWRhdGlvbiBTZWN1cmUgU2VydmVyIENB\n"
0047     "MB4XDTIxMTAwNTAwMDAwMFoXDTIyMTAxNzIzNTk1OVowFDESMBAGA1UEAwwJKi5r\n"
0048     "ZGUub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA00TBF2PRJ+YJ\n"
0049     "LzO/Gab+mZ21NIHwDXCDctq1v5YfMeHVR/rsOYu9w8DKzD6YShjdYyKaFfaBPgrI\n"
0050     "L7MnEDt60wWMsSBEhJMLvgBg7kODd7fzYeeXLoSe7SdrhoZADD0dvML7Y9ow0OSf\n"
0051     "fWC4ihwG08pU1NepKOvcNMPPTpDeYr9bDYOJEuYdPdgLx9uw0FCT8bWx/LLHUFOC\n"
0052     "eap+/iczZcYAM++953yQ7iQOYDys1LyZT/j2zEjg/BcmTg3gTTOC1BazHYB9q1KU\n"
0053     "7qaHaLDBnfx2a5tsKGKYxhx56gcrmLQkCcH6wyUuLLlBGjr7VnlUpmNIV8AKUaiE\n"
0054     "K7GLJZjvbP/7mbAx1EPECxREjJ54YIpi6hPjLjrFfBxAP+epmrQZz8faQ9wFVeO8\n"
0055     "Tt1fpG1kStWZJpGLsCX3/YPBsh6U6xC2V8UK5YnnWA9hDayTevCMul/uh7YOJGSy\n"
0056     "UsxKA72aiuJ87WrEfpndThM9Q7xvytkYF7ekIkMNKScsst0/qdWeFnKVHGX6xgxM\n"
0057     "mXJP1gcOO2ulYIxfpxLZIGrCyMUYmmbkj10kb2ZS8FJhWTbSSZyRQ+01LXmYyC2V\n"
0058     "4MBB8pY1XorRzFuPgyqI8iMkO2yYDSGBw0QAFuFFHB7h6+OK5gNjC4mD8bO7bEig\n"
0059     "3fcRwDzUyXPHYy919djxhyvHKC2Kj98CAwEAAaOCAvQwggLwMB8GA1UdIwQYMBaA\n"
0060     "FI2MXsRUrYrhd+mb+ZsF4bgBjWHhMB0GA1UdDgQWBBShM3QAgRLzTMAcX7L3ViqM\n"
0061     "1cW1kzAOBgNVHQ8BAf8EBAMCBaAwDAYDVR0TAQH/BAIwADAdBgNVHSUEFjAUBggr\n"
0062     "BgEFBQcDAQYIKwYBBQUHAwIwSQYDVR0gBEIwQDA0BgsrBgEEAbIxAQICBzAlMCMG\n"
0063     "CCsGAQUFBwIBFhdodHRwczovL3NlY3RpZ28uY29tL0NQUzAIBgZngQwBAgEwgYQG\n"
0064     "CCsGAQUFBwEBBHgwdjBPBggrBgEFBQcwAoZDaHR0cDovL2NydC5zZWN0aWdvLmNv\n"
0065     "bS9TZWN0aWdvUlNBRG9tYWluVmFsaWRhdGlvblNlY3VyZVNlcnZlckNBLmNydDAj\n"
0066     "BggrBgEFBQcwAYYXaHR0cDovL29jc3Auc2VjdGlnby5jb20wHQYDVR0RBBYwFIIJ\n"
0067     "Ki5rZGUub3JnggdrZGUub3JnMIIBfgYKKwYBBAHWeQIEAgSCAW4EggFqAWgAdgBG\n"
0068     "pVXrdfqRIDC1oolp9PN9ESxBdL79SbiFq/L8cP5tRwAAAXxPukAhAAAEAwBHMEUC\n"
0069     "IQCE+7woQy/KdPuDdG231NKPubsYZaM7v5P1gl2Ari2/IAIgegQ2sDSiqdxEVV51\n"
0070     "Dj3OzGGiRdGDRhaxQ3cabA742mkAdgBByMqx3yJGShDGoToJQodeTjGLGwPr60vH\n"
0071     "aPCQYpYG9gAAAXxPuj/eAAAEAwBHMEUCIQCUa9AoUVxL8t1F3R8vkP6BnkGuSCsa\n"
0072     "q4ZKc8381KxUCAIgIguRzJLrH6NQcHFdSQD1e1gOGSxsoRaMYceE+GTl9ZMAdgAp\n"
0073     "eb7wnjk5IfBWc59jpXflvld9nGAK+PlNXSZcJV3HhAAAAXxPuj+2AAAEAwBHMEUC\n"
0074     "IAdw8Q7jQRzi9sMoCfaFcNg0xIh9B8Ii4iV6hG+Ec5B+AiEAqqco3T3l3Se9WDWC\n"
0075     "kSpOMdeiGdvYbq5cyG48jXWPNhYwDQYJKoZIhvcNAQELBQADggEBAMQiM6KnNEMH\n"
0076     "5eUx/0kTJ2gwlx2KKt81KF5SM6hTiArrcfymG0FitmYjI6euWnPtNKWI//EGgGFU\n"
0077     "3Kp3T4oI09LGBFB0Tvr9QQbP05FBkqu0rnvalc2iiq+bSFkgzJ6YeWGIovjv7+1F\n"
0078     "Kthfil10s6mN4j6UxY6wAKTZq+p5LNUUv55j/t+i8J145j0qJ5IaZZPtVQrCa85u\n"
0079     "t+v40WPxKepNqLv165T3wRfPnVtXlyxgUsBm81ZVw+mckJH3f8JpAnIvmkfZ528N\n"
0080     "0lv8AyjIepK0y8KQE4LGy00mW8qGqWrUt09uE9imOAVbAMD2sH24x3tz1gJT+FY6\n"
0081     "vXNzj3j5/eo=\n"
0082     "-----END CERTIFICATE-----\n"
0083     "\u0001"
0084     "-----BEGIN CERTIFICATE-----\n"
0085     "MIIGEzCCA/ugAwIBAgIQfVtRJrR2uhHbdBYLvFMNpzANBgkqhkiG9w0BAQwFADCB\n"
0086     "iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl\n"
0087     "cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV\n"
0088     "BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTgx\n"
0089     "MTAyMDAwMDAwWhcNMzAxMjMxMjM1OTU5WjCBjzELMAkGA1UEBhMCR0IxGzAZBgNV\n"
0090     "BAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEYMBYGA1UE\n"
0091     "ChMPU2VjdGlnbyBMaW1pdGVkMTcwNQYDVQQDEy5TZWN0aWdvIFJTQSBEb21haW4g\n"
0092     "VmFsaWRhdGlvbiBTZWN1cmUgU2VydmVyIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC\n"
0093     "AQ8AMIIBCgKCAQEA1nMz1tc8INAA0hdFuNY+B6I/x0HuMjDJsGz99J/LEpgPLT+N\n"
0094     "TQEMgg8Xf2Iu6bhIefsWg06t1zIlk7cHv7lQP6lMw0Aq6Tn/2YHKHxYyQdqAJrkj\n"
0095     "eocgHuP/IJo8lURvh3UGkEC0MpMWCRAIIz7S3YcPb11RFGoKacVPAXJpz9OTTG0E\n"
0096     "oKMbgn6xmrntxZ7FN3ifmgg0+1YuWMQJDgZkW7w33PGfKGioVrCSo1yfu4iYCBsk\n"
0097     "Haswha6vsC6eep3BwEIc4gLw6uBK0u+QDrTBQBbwb4VCSmT3pDCg/r8uoydajotY\n"
0098     "uK3DGReEY+1vVv2Dy2A0xHS+5p3b4eTlygxfFQIDAQABo4IBbjCCAWowHwYDVR0j\n"
0099     "BBgwFoAUU3m/WqorSs9UgOHYm8Cd8rIDZsswHQYDVR0OBBYEFI2MXsRUrYrhd+mb\n"
0100     "+ZsF4bgBjWHhMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8ECDAGAQH/AgEAMB0G\n"
0101     "A1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAbBgNVHSAEFDASMAYGBFUdIAAw\n"
0102     "CAYGZ4EMAQIBMFAGA1UdHwRJMEcwRaBDoEGGP2h0dHA6Ly9jcmwudXNlcnRydXN0\n"
0103     "LmNvbS9VU0VSVHJ1c3RSU0FDZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDB2Bggr\n"
0104     "BgEFBQcBAQRqMGgwPwYIKwYBBQUHMAKGM2h0dHA6Ly9jcnQudXNlcnRydXN0LmNv\n"
0105     "bS9VU0VSVHJ1c3RSU0FBZGRUcnVzdENBLmNydDAlBggrBgEFBQcwAYYZaHR0cDov\n"
0106     "L29jc3AudXNlcnRydXN0LmNvbTANBgkqhkiG9w0BAQwFAAOCAgEAMr9hvQ5Iw0/H\n"
0107     "ukdN+Jx4GQHcEx2Ab/zDcLRSmjEzmldS+zGea6TvVKqJjUAXaPgREHzSyrHxVYbH\n"
0108     "7rM2kYb2OVG/Rr8PoLq0935JxCo2F57kaDl6r5ROVm+yezu/Coa9zcV3HAO4OLGi\n"
0109     "H19+24rcRki2aArPsrW04jTkZ6k4Zgle0rj8nSg6F0AnwnJOKf0hPHzPE/uWLMUx\n"
0110     "RP0T7dWbqWlod3zu4f+k+TY4CFM5ooQ0nBnzvg6s1SQ36yOoeNDT5++SR2RiOSLv\n"
0111     "xvcRviKFxmZEJCaOEDKNyJOuB56DPi/Z+fVGjmO+wea03KbNIaiGCpXZLoUmGv38\n"
0112     "sbZXQm2V0TP2ORQGgkE49Y9Y3IBbpNV9lXj9p5v//cWoaasm56ekBYdbqbe4oyAL\n"
0113     "l6lFhd2zi+WJN44pDfwGF/Y4QA5C5BIG+3vzxhFoYt/jmPQT2BVPi7Fp2RBgvGQq\n"
0114     "6jG35LWjOhSbJuMLe/0CjraZwTiXWTb2qHSihrZe68Zk6s+go/lunrotEbaGmAhY\n"
0115     "LcmsJWTyXnW0OMGuf1pGg+pRyrbxmRE1a6Vqe8YAsOf4vmSyrcjC8azjUeqkk+B5\n"
0116     "yOGBQMkKW+ESPMFgKuOXwIlCypTPRpgSabuY0MLTDXJLR27lk8QyKGOHQ+SwMj4K\n"
0117     "00u/I5sUKUErmgQfky3xxzlIPK1aEn8=\n"
0118     "-----END CERTIFICATE-----\n"
0119     "\u0001"
0120     "-----BEGIN CERTIFICATE-----\n"
0121     "MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB\n"
0122     "iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl\n"
0123     "cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV\n"
0124     "BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw\n"
0125     "MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV\n"
0126     "BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU\n"
0127     "aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy\n"
0128     "dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK\n"
0129     "AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B\n"
0130     "3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY\n"
0131     "tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/\n"
0132     "Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2\n"
0133     "VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT\n"
0134     "79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6\n"
0135     "c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT\n"
0136     "Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l\n"
0137     "c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee\n"
0138     "UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE\n"
0139     "Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd\n"
0140     "BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G\n"
0141     "A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF\n"
0142     "Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO\n"
0143     "VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3\n"
0144     "ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs\n"
0145     "8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR\n"
0146     "iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze\n"
0147     "Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ\n"
0148     "XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/\n"
0149     "qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB\n"
0150     "VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB\n"
0151     "L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG\n"
0152     "jjxDah2nGN59PRbxYvnKkKj9\n"
0153     "-----END CERTIFICATE-----\n");
0154 
0155 static const QMap<int, QString> typeNames = {
0156     {KIO::WorkerBase::QuestionTwoActions, QStringLiteral("QuestionTwoActions")},
0157     {KIO::WorkerBase::WarningTwoActions, QStringLiteral("WarningTwoActions")},
0158     {KIO::WorkerBase::WarningContinueCancel, QStringLiteral("WarningContinueCancel")},
0159     {KIO::WorkerBase::WarningTwoActionsCancel, QStringLiteral("WarningTwoActionsCancel")},
0160     {KIO::WorkerBase::Information, QStringLiteral("Information")},
0161     {KIO::WorkerBase::SSLMessageBox, QStringLiteral("SSLMessageBox")},
0162     {KIO::WorkerBase::WarningContinueCancelDetailed, QStringLiteral("WarningContinueCancelDetailed")},
0163 };
0164 
0165 static constexpr int messageBoxList = -1;
0166 static constexpr int noMessageBoxType = -2;
0167 
0168 static QString buttonCodeToDisplayString(int buttonCode)
0169 {
0170     switch (buttonCode) {
0171     case KIO::WorkerBase::Ok:
0172         return QStringLiteral("Ok");
0173     case KIO::WorkerBase::Cancel:
0174         return QStringLiteral("Cancel");
0175     case KIO::WorkerBase::PrimaryAction:
0176         return QStringLiteral("PrimaryAction");
0177     case KIO::WorkerBase::SecondaryAction:
0178         return QStringLiteral("SecondaryAction");
0179     case KIO::WorkerBase::Continue:
0180         return QStringLiteral("Continue");
0181     default:
0182         Q_UNREACHABLE();
0183         return QString();
0184     };
0185 }
0186 
0187 int messageBoxType(const QUrl &url)
0188 {
0189     QString path = url.adjusted(QUrl::StripTrailingSlash).path();
0190     if (path.startsWith(QLatin1Char('/'))) {
0191         path.remove(0, 1);
0192     }
0193     if (path.isEmpty()) {
0194         return messageBoxList;
0195     }
0196 
0197     bool ok;
0198     const int type = path.toInt(&ok);
0199     if (ok && typeNames.contains(type)) {
0200         return type;
0201     }
0202     return noMessageBoxType;
0203 }
0204 
0205 KIO::UDSEntry typeDirEntry(int messageBoxType)
0206 {
0207     KIO::UDSEntry entry;
0208     entry.reserve(4);
0209     entry.fastInsert(KIO::UDSEntry::UDS_NAME, QString::number(messageBoxType));
0210     entry.fastInsert(KIO::UDSEntry::UDS_DISPLAY_NAME, typeNames.value(messageBoxType));
0211     entry.fastInsert(KIO::UDSEntry::UDS_MIME_TYPE, QStringLiteral("inode/directory"));
0212     entry.fastInsert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR);
0213     return entry;
0214 }
0215 
0216 KIO::UDSEntry rootDirEntry()
0217 {
0218     KIO::UDSEntry entry;
0219 
0220     entry.reserve(3);
0221     entry.fastInsert(KIO::UDSEntry::UDS_NAME, QStringLiteral("."));
0222     entry.fastInsert(KIO::UDSEntry::UDS_MIME_TYPE, QStringLiteral("inode/directory"));
0223     entry.fastInsert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR);
0224 
0225     return entry;
0226 }
0227 
0228 }
0229 
0230 MessageBoxWorker::MessageBoxWorker(const QByteArray &pool_socket, const QByteArray &app_socket)
0231     : KIO::WorkerBase("messagebox", pool_socket, app_socket)
0232 {
0233 }
0234 
0235 MessageBoxWorker::~MessageBoxWorker() = default;
0236 
0237 KIO::WorkerResult MessageBoxWorker::get(const QUrl &url)
0238 {
0239     return KIO::WorkerResult::fail(KIO::ERR_DOES_NOT_EXIST, url.path());
0240 }
0241 
0242 KIO::WorkerResult MessageBoxWorker::stat(const QUrl &url)
0243 {
0244     const int type = ::messageBoxType(url);
0245 
0246     if (type == ::noMessageBoxType) {
0247         return KIO::WorkerResult::fail(KIO::ERR_DOES_NOT_EXIST, QStringLiteral("No such path."));
0248     }
0249 
0250     // is root directory?
0251     if (type == ::messageBoxList) {
0252         statEntry(rootDirEntry());
0253         return KIO::WorkerResult::pass();
0254     }
0255 
0256     // type dir
0257     statEntry(typeDirEntry(type));
0258     return KIO::WorkerResult::pass();
0259 }
0260 
0261 KIO::WorkerResult MessageBoxWorker::listDir(const QUrl &url)
0262 {
0263     const int type = ::messageBoxType(url);
0264 
0265     if (type == ::noMessageBoxType) {
0266         return KIO::WorkerResult::fail(KIO::ERR_DOES_NOT_EXIST, QStringLiteral("No such directory."));
0267     }
0268     if (type == messageBoxList) {
0269         const QList<int> items = typeNames.keys();
0270 
0271         // report number of expected entries
0272         totalSize(1 + items.size());
0273         // own dir
0274         listEntry(rootDirEntry());
0275         // type dirs
0276         for (const auto &item : items) {
0277             listEntry(typeDirEntry(item));
0278         }
0279 
0280         return KIO::WorkerResult::pass();
0281     }
0282 
0283     // trigger the respective messagebox, then redirect to root dir
0284     if (type == SSLMessageBox) {
0285         // kde.org data in October 2022 as example
0286         setMetaData(QStringLiteral("ssl_in_use"), QStringLiteral("TRUE"));
0287         setMetaData(QStringLiteral("ssl_peer_chain"), kdeOrgCertChain);
0288         setMetaData(QStringLiteral("ssl_peer_ip"), QStringLiteral("136.243.103.182"));
0289         setMetaData(QStringLiteral("ssl_protocol_version"), QStringLiteral("TLSv1.3"));
0290         setMetaData(QStringLiteral("ssl_cipher"), QStringLiteral("TLS_AES_256_GCM_SHA384"));
0291         setMetaData(QStringLiteral("ssl_cipher_used_bits"), QStringLiteral("256"));
0292         setMetaData(QStringLiteral("ssl_cipher_bits"), QStringLiteral("256"));
0293         sendMetaData();
0294 
0295         messageBox(static_cast<MessageBoxType>(type), QStringLiteral("kde.org"));
0296     } else {
0297         if (type == WarningContinueCancelDetailed) {
0298             setMetaData(QStringLiteral("privilege_conf_details"), QStringLiteral("Some details"));
0299             sendMetaData();
0300         }
0301         const int reply = messageBox(QStringLiteral("Message in a box."),
0302                                      static_cast<MessageBoxType>(type),
0303                                      typeNames.value(type),
0304                                      QStringLiteral("Primary"),
0305                                      QStringLiteral("Secondary"));
0306         qDebug() << "MESSAGEBOX REPLY" << buttonCodeToDisplayString(reply);
0307     }
0308 
0309     redirection(QUrl(QStringLiteral("messagebox:")));
0310     return KIO::WorkerResult::pass();
0311 }
0312 
0313 #include "messageboxworker.moc"