File indexing completed on 2024-12-08 06:40:37
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"