File indexing completed on 2024-04-14 03:53:40

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 #include <QUrl>
0016 
0017 // Pseudo plugin class to embed meta data
0018 class KIOPluginForMetaData : public QObject
0019 {
0020     Q_OBJECT
0021     Q_PLUGIN_METADATA(IID "org.kde.kio.worker.messagebox" FILE "messageboxworker.json")
0022 };
0023 
0024 extern "C" {
0025 int Q_DECL_EXPORT kdemain(int argc, char **argv);
0026 }
0027 
0028 int kdemain(int argc, char **argv)
0029 {
0030     QCoreApplication app(argc, argv);
0031     app.setApplicationName(QStringLiteral("kiomessagebox"));
0032 
0033     MessageBoxWorker worker(argv[2], argv[3]);
0034     worker.dispatchLoop();
0035 
0036     return 0;
0037 }
0038 
0039 namespace
0040 {
0041 
0042 const QString kdeOrgCertChain = QStringLiteral(
0043     "-----BEGIN CERTIFICATE-----\n"
0044     "MIIHJDCCBgygAwIBAgIQYxPG9R/EMYOGtmoK3J5ByDANBgkqhkiG9w0BAQsFADCB\n"
0045     "jzELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G\n"
0046     "A1UEBxMHU2FsZm9yZDEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTcwNQYDVQQD\n"
0047     "Ey5TZWN0aWdvIFJTQSBEb21haW4gVmFsaWRhdGlvbiBTZWN1cmUgU2VydmVyIENB\n"
0048     "MB4XDTIxMTAwNTAwMDAwMFoXDTIyMTAxNzIzNTk1OVowFDESMBAGA1UEAwwJKi5r\n"
0049     "ZGUub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA00TBF2PRJ+YJ\n"
0050     "LzO/Gab+mZ21NIHwDXCDctq1v5YfMeHVR/rsOYu9w8DKzD6YShjdYyKaFfaBPgrI\n"
0051     "L7MnEDt60wWMsSBEhJMLvgBg7kODd7fzYeeXLoSe7SdrhoZADD0dvML7Y9ow0OSf\n"
0052     "fWC4ihwG08pU1NepKOvcNMPPTpDeYr9bDYOJEuYdPdgLx9uw0FCT8bWx/LLHUFOC\n"
0053     "eap+/iczZcYAM++953yQ7iQOYDys1LyZT/j2zEjg/BcmTg3gTTOC1BazHYB9q1KU\n"
0054     "7qaHaLDBnfx2a5tsKGKYxhx56gcrmLQkCcH6wyUuLLlBGjr7VnlUpmNIV8AKUaiE\n"
0055     "K7GLJZjvbP/7mbAx1EPECxREjJ54YIpi6hPjLjrFfBxAP+epmrQZz8faQ9wFVeO8\n"
0056     "Tt1fpG1kStWZJpGLsCX3/YPBsh6U6xC2V8UK5YnnWA9hDayTevCMul/uh7YOJGSy\n"
0057     "UsxKA72aiuJ87WrEfpndThM9Q7xvytkYF7ekIkMNKScsst0/qdWeFnKVHGX6xgxM\n"
0058     "mXJP1gcOO2ulYIxfpxLZIGrCyMUYmmbkj10kb2ZS8FJhWTbSSZyRQ+01LXmYyC2V\n"
0059     "4MBB8pY1XorRzFuPgyqI8iMkO2yYDSGBw0QAFuFFHB7h6+OK5gNjC4mD8bO7bEig\n"
0060     "3fcRwDzUyXPHYy919djxhyvHKC2Kj98CAwEAAaOCAvQwggLwMB8GA1UdIwQYMBaA\n"
0061     "FI2MXsRUrYrhd+mb+ZsF4bgBjWHhMB0GA1UdDgQWBBShM3QAgRLzTMAcX7L3ViqM\n"
0062     "1cW1kzAOBgNVHQ8BAf8EBAMCBaAwDAYDVR0TAQH/BAIwADAdBgNVHSUEFjAUBggr\n"
0063     "BgEFBQcDAQYIKwYBBQUHAwIwSQYDVR0gBEIwQDA0BgsrBgEEAbIxAQICBzAlMCMG\n"
0064     "CCsGAQUFBwIBFhdodHRwczovL3NlY3RpZ28uY29tL0NQUzAIBgZngQwBAgEwgYQG\n"
0065     "CCsGAQUFBwEBBHgwdjBPBggrBgEFBQcwAoZDaHR0cDovL2NydC5zZWN0aWdvLmNv\n"
0066     "bS9TZWN0aWdvUlNBRG9tYWluVmFsaWRhdGlvblNlY3VyZVNlcnZlckNBLmNydDAj\n"
0067     "BggrBgEFBQcwAYYXaHR0cDovL29jc3Auc2VjdGlnby5jb20wHQYDVR0RBBYwFIIJ\n"
0068     "Ki5rZGUub3JnggdrZGUub3JnMIIBfgYKKwYBBAHWeQIEAgSCAW4EggFqAWgAdgBG\n"
0069     "pVXrdfqRIDC1oolp9PN9ESxBdL79SbiFq/L8cP5tRwAAAXxPukAhAAAEAwBHMEUC\n"
0070     "IQCE+7woQy/KdPuDdG231NKPubsYZaM7v5P1gl2Ari2/IAIgegQ2sDSiqdxEVV51\n"
0071     "Dj3OzGGiRdGDRhaxQ3cabA742mkAdgBByMqx3yJGShDGoToJQodeTjGLGwPr60vH\n"
0072     "aPCQYpYG9gAAAXxPuj/eAAAEAwBHMEUCIQCUa9AoUVxL8t1F3R8vkP6BnkGuSCsa\n"
0073     "q4ZKc8381KxUCAIgIguRzJLrH6NQcHFdSQD1e1gOGSxsoRaMYceE+GTl9ZMAdgAp\n"
0074     "eb7wnjk5IfBWc59jpXflvld9nGAK+PlNXSZcJV3HhAAAAXxPuj+2AAAEAwBHMEUC\n"
0075     "IAdw8Q7jQRzi9sMoCfaFcNg0xIh9B8Ii4iV6hG+Ec5B+AiEAqqco3T3l3Se9WDWC\n"
0076     "kSpOMdeiGdvYbq5cyG48jXWPNhYwDQYJKoZIhvcNAQELBQADggEBAMQiM6KnNEMH\n"
0077     "5eUx/0kTJ2gwlx2KKt81KF5SM6hTiArrcfymG0FitmYjI6euWnPtNKWI//EGgGFU\n"
0078     "3Kp3T4oI09LGBFB0Tvr9QQbP05FBkqu0rnvalc2iiq+bSFkgzJ6YeWGIovjv7+1F\n"
0079     "Kthfil10s6mN4j6UxY6wAKTZq+p5LNUUv55j/t+i8J145j0qJ5IaZZPtVQrCa85u\n"
0080     "t+v40WPxKepNqLv165T3wRfPnVtXlyxgUsBm81ZVw+mckJH3f8JpAnIvmkfZ528N\n"
0081     "0lv8AyjIepK0y8KQE4LGy00mW8qGqWrUt09uE9imOAVbAMD2sH24x3tz1gJT+FY6\n"
0082     "vXNzj3j5/eo=\n"
0083     "-----END CERTIFICATE-----\n"
0084     "\u0001"
0085     "-----BEGIN CERTIFICATE-----\n"
0086     "MIIGEzCCA/ugAwIBAgIQfVtRJrR2uhHbdBYLvFMNpzANBgkqhkiG9w0BAQwFADCB\n"
0087     "iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl\n"
0088     "cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV\n"
0089     "BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTgx\n"
0090     "MTAyMDAwMDAwWhcNMzAxMjMxMjM1OTU5WjCBjzELMAkGA1UEBhMCR0IxGzAZBgNV\n"
0091     "BAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEYMBYGA1UE\n"
0092     "ChMPU2VjdGlnbyBMaW1pdGVkMTcwNQYDVQQDEy5TZWN0aWdvIFJTQSBEb21haW4g\n"
0093     "VmFsaWRhdGlvbiBTZWN1cmUgU2VydmVyIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC\n"
0094     "AQ8AMIIBCgKCAQEA1nMz1tc8INAA0hdFuNY+B6I/x0HuMjDJsGz99J/LEpgPLT+N\n"
0095     "TQEMgg8Xf2Iu6bhIefsWg06t1zIlk7cHv7lQP6lMw0Aq6Tn/2YHKHxYyQdqAJrkj\n"
0096     "eocgHuP/IJo8lURvh3UGkEC0MpMWCRAIIz7S3YcPb11RFGoKacVPAXJpz9OTTG0E\n"
0097     "oKMbgn6xmrntxZ7FN3ifmgg0+1YuWMQJDgZkW7w33PGfKGioVrCSo1yfu4iYCBsk\n"
0098     "Haswha6vsC6eep3BwEIc4gLw6uBK0u+QDrTBQBbwb4VCSmT3pDCg/r8uoydajotY\n"
0099     "uK3DGReEY+1vVv2Dy2A0xHS+5p3b4eTlygxfFQIDAQABo4IBbjCCAWowHwYDVR0j\n"
0100     "BBgwFoAUU3m/WqorSs9UgOHYm8Cd8rIDZsswHQYDVR0OBBYEFI2MXsRUrYrhd+mb\n"
0101     "+ZsF4bgBjWHhMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8ECDAGAQH/AgEAMB0G\n"
0102     "A1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAbBgNVHSAEFDASMAYGBFUdIAAw\n"
0103     "CAYGZ4EMAQIBMFAGA1UdHwRJMEcwRaBDoEGGP2h0dHA6Ly9jcmwudXNlcnRydXN0\n"
0104     "LmNvbS9VU0VSVHJ1c3RSU0FDZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDB2Bggr\n"
0105     "BgEFBQcBAQRqMGgwPwYIKwYBBQUHMAKGM2h0dHA6Ly9jcnQudXNlcnRydXN0LmNv\n"
0106     "bS9VU0VSVHJ1c3RSU0FBZGRUcnVzdENBLmNydDAlBggrBgEFBQcwAYYZaHR0cDov\n"
0107     "L29jc3AudXNlcnRydXN0LmNvbTANBgkqhkiG9w0BAQwFAAOCAgEAMr9hvQ5Iw0/H\n"
0108     "ukdN+Jx4GQHcEx2Ab/zDcLRSmjEzmldS+zGea6TvVKqJjUAXaPgREHzSyrHxVYbH\n"
0109     "7rM2kYb2OVG/Rr8PoLq0935JxCo2F57kaDl6r5ROVm+yezu/Coa9zcV3HAO4OLGi\n"
0110     "H19+24rcRki2aArPsrW04jTkZ6k4Zgle0rj8nSg6F0AnwnJOKf0hPHzPE/uWLMUx\n"
0111     "RP0T7dWbqWlod3zu4f+k+TY4CFM5ooQ0nBnzvg6s1SQ36yOoeNDT5++SR2RiOSLv\n"
0112     "xvcRviKFxmZEJCaOEDKNyJOuB56DPi/Z+fVGjmO+wea03KbNIaiGCpXZLoUmGv38\n"
0113     "sbZXQm2V0TP2ORQGgkE49Y9Y3IBbpNV9lXj9p5v//cWoaasm56ekBYdbqbe4oyAL\n"
0114     "l6lFhd2zi+WJN44pDfwGF/Y4QA5C5BIG+3vzxhFoYt/jmPQT2BVPi7Fp2RBgvGQq\n"
0115     "6jG35LWjOhSbJuMLe/0CjraZwTiXWTb2qHSihrZe68Zk6s+go/lunrotEbaGmAhY\n"
0116     "LcmsJWTyXnW0OMGuf1pGg+pRyrbxmRE1a6Vqe8YAsOf4vmSyrcjC8azjUeqkk+B5\n"
0117     "yOGBQMkKW+ESPMFgKuOXwIlCypTPRpgSabuY0MLTDXJLR27lk8QyKGOHQ+SwMj4K\n"
0118     "00u/I5sUKUErmgQfky3xxzlIPK1aEn8=\n"
0119     "-----END CERTIFICATE-----\n"
0120     "\u0001"
0121     "-----BEGIN CERTIFICATE-----\n"
0122     "MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB\n"
0123     "iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl\n"
0124     "cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV\n"
0125     "BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw\n"
0126     "MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV\n"
0127     "BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU\n"
0128     "aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy\n"
0129     "dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK\n"
0130     "AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B\n"
0131     "3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY\n"
0132     "tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/\n"
0133     "Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2\n"
0134     "VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT\n"
0135     "79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6\n"
0136     "c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT\n"
0137     "Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l\n"
0138     "c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee\n"
0139     "UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE\n"
0140     "Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd\n"
0141     "BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G\n"
0142     "A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF\n"
0143     "Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO\n"
0144     "VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3\n"
0145     "ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs\n"
0146     "8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR\n"
0147     "iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze\n"
0148     "Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ\n"
0149     "XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/\n"
0150     "qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB\n"
0151     "VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB\n"
0152     "L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG\n"
0153     "jjxDah2nGN59PRbxYvnKkKj9\n"
0154     "-----END CERTIFICATE-----\n");
0155 
0156 static const QMap<int, QString> typeNames = {
0157     {KIO::WorkerBase::QuestionTwoActions, QStringLiteral("QuestionTwoActions")},
0158     {KIO::WorkerBase::WarningTwoActions, QStringLiteral("WarningTwoActions")},
0159     {KIO::WorkerBase::WarningContinueCancel, QStringLiteral("WarningContinueCancel")},
0160     {KIO::WorkerBase::WarningTwoActionsCancel, QStringLiteral("WarningTwoActionsCancel")},
0161     {KIO::WorkerBase::Information, QStringLiteral("Information")},
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 == WarningContinueCancelDetailed) {
0285         setMetaData(QStringLiteral("privilege_conf_details"), QStringLiteral("Some details"));
0286         sendMetaData();
0287     }
0288     const int reply = messageBox(QStringLiteral("Message in a box."),
0289                                  static_cast<MessageBoxType>(type),
0290                                  typeNames.value(type),
0291                                  QStringLiteral("Primary"),
0292                                  QStringLiteral("Secondary"));
0293     qDebug() << "MESSAGEBOX REPLY" << buttonCodeToDisplayString(reply);
0294 
0295     redirection(QUrl(QStringLiteral("messagebox:")));
0296     return KIO::WorkerResult::pass();
0297 }
0298 
0299 #include "messageboxworker.moc"