1 /* 2 SPDX-FileCopyrightText: 2007 KovoKs <info@kovoks.nl> 3 SPDX-FileCopyrightText: 2008 Thomas McGuire <thomas.mcguire@gmx.net> 4 5 SPDX-License-Identifier: LGPL-2.0-or-later 6 */ 7 8 #pragma once 9 10 #include <mailtransport_export.h> 11 #include <transport.h> 12 13 #include <QList> 14 #include <QObject> 15 16 #include <memory> 17 18 class QProgressBar; 19 20 namespace MailTransport 21 { 22 class ServerTestPrivate; 23 24 /** 25 * @class ServerTest 26 * This class can be used to test certain server to see if they support stuff. 27 * @author Tom Albers <tomalbers@kde.nl> 28 */ 29 class MAILTRANSPORT_EXPORT ServerTest : public QObject 30 { 31 Q_OBJECT 32 Q_PROPERTY(QString server READ server WRITE setServer) 33 Q_PROPERTY(QString protocol READ protocol WRITE setProtocol) 34 Q_PROPERTY(QProgressBar *progressBar READ progressBar WRITE setProgressBar) 35 36 public: 37 /** 38 * This enumeration has the special capabilities a server might 39 * support. This covers only capabilities not related to authentication. 40 * @since 4.1 41 */ 42 enum Capability { 43 Pipelining, ///< POP3 only. The server supports pipeplining of commands 44 Top, ///< POP3 only. The server supports fetching only the headers 45 UIDL ///< POP3 only. The server has support for unique identifiers 46 }; 47 48 /** 49 * Creates a new server test. 50 * 51 * @param parent The parent widget. 52 */ 53 explicit ServerTest(QObject *parent = nullptr); 54 55 /** 56 * Destroys the server test. 57 */ 58 ~ServerTest() override; 59 60 /** 61 * Sets the server to test. 62 */ 63 void setServer(const QString &server); 64 65 /** 66 * Returns the server to test. 67 */ 68 Q_REQUIRED_RESULT QString server() const; 69 70 /** 71 * Set a custom port to use. 72 * 73 * Each encryption mode (no encryption or SSL) has a different port. 74 * TLS uses the same port as no encryption, because TLS is invoked during 75 * a normal session. 76 * 77 * If this function is never called, the default port is used, which is: 78 * (normal first, then SSL) 79 * SMTP: 587 (falls back to 25), 465 80 * POP: 110, 995 81 * IMAP: 143, 993 82 * NNTP: 119, 563 83 * 84 * @param encryptionMode the port will only be used in this encryption mode. 85 * Valid values for this are only 'None' and 'SSL'. 86 * @param port the port to use 87 * 88 * @since 4.1 89 */ 90 void setPort(Transport::EnumEncryption::type encryptionMode, uint port); 91 92 /** 93 * @param encryptionMode the port of this encryption mode is returned. 94 * Can only be 'None' and 'SSL' 95 * 96 * @return the port set by @ref setPort or -1 if @ref setPort() was never 97 * called for this encryption mode. 98 * 99 * @since 4.1 100 */ 101 Q_REQUIRED_RESULT int port(Transport::EnumEncryption::type encryptionMode) const; 102 103 /** 104 * Sets a fake hostname for the test. This is currently only used when 105 * testing a SMTP server; there, the command for testing the capabilities 106 * (called EHLO) needs to have the hostname of the client included. 107 * The user can however choose to send a fake hostname instead of the 108 * local hostname to work around various problems. This fake hostname needs 109 * to be set here. 110 * 111 * @param fakeHostname the fake hostname to send 112 */ 113 void setFakeHostname(const QString &fakeHostname); 114 115 /** 116 * @return the fake hostname, as set before with @ref setFakeHostname 117 */ 118 Q_REQUIRED_RESULT QString fakeHostname() const; 119 120 /** 121 * Makes @p pb the progressbar to use. This class will call show() 122 * and hide() and will count down. It does not take ownership of 123 * the progressbar. 124 */ 125 void setProgressBar(QProgressBar *pb); 126 127 /** 128 * Returns the used progress bar. 129 */ 130 QProgressBar *progressBar() const; 131 132 /** 133 * Sets @p protocol the protocol to test, currently supported are 134 * "smtp", "pop", "imap", and "nntp". 135 */ 136 void setProtocol(const QString &protocol); 137 138 /** 139 * Returns the protocol. 140 */ 141 Q_REQUIRED_RESULT QString protocol() const; 142 143 /** 144 * Starts the test. Will emit finished() when done. 145 */ 146 void start(); 147 148 /** 149 * Get the protocols for the normal connections.. Call this only 150 * after the finished() signals has been sent. 151 * @return an enum of the type Transport::EnumAuthenticationType 152 */ 153 Q_REQUIRED_RESULT QVector<int> normalProtocols() const; 154 155 /** 156 * tells you if the normal server is available 157 * @since 4.5 158 */ 159 Q_REQUIRED_RESULT bool isNormalPossible() const; 160 161 /** 162 * Get the protocols for the TLS connections. Call this only 163 * after the finished() signals has been sent. 164 * @return an enum of the type Transport::EnumAuthenticationType 165 * @since 4.1 166 */ 167 Q_REQUIRED_RESULT QVector<int> tlsProtocols() const; 168 169 /** 170 * Get the protocols for the SSL connections. Call this only 171 * after the finished() signals has been sent. 172 * @return an enum of the type Transport::EnumAuthenticationType 173 */ 174 Q_REQUIRED_RESULT QVector<int> secureProtocols() const; 175 176 /** 177 * tells you if the ssl server is available 178 * @since 4.5 179 */ 180 Q_REQUIRED_RESULT bool isSecurePossible() const; 181 182 /** 183 * Get the special capabilities of the server. 184 * Call this only after the finished() signals has been sent. 185 * 186 * @return the list of special capabilities of the server. 187 * @since 4.1 188 */ 189 Q_REQUIRED_RESULT QList<Capability> capabilities() const; 190 191 Q_SIGNALS: 192 /** 193 * This will be emitted when the test is done. It will contain 194 * the values from the enum EnumEncryption which are possible. 195 */ 196 void finished(const QVector<int> &); 197 198 private: 199 Q_DECLARE_PRIVATE(ServerTest) 200 std::unique_ptr<ServerTestPrivate> const d; 201 202 Q_PRIVATE_SLOT(d, void slotNormalPossible()) 203 Q_PRIVATE_SLOT(d, void slotTlsDone()) 204 Q_PRIVATE_SLOT(d, void slotSslPossible()) 205 Q_PRIVATE_SLOT(d, void slotReadNormal(const QString &text)) 206 Q_PRIVATE_SLOT(d, void slotReadSecure(const QString &text)) 207 Q_PRIVATE_SLOT(d, void slotNormalNotPossible()) 208 Q_PRIVATE_SLOT(d, void slotSslNotPossible()) 209 Q_PRIVATE_SLOT(d, void slotUpdateProgress()) 210 }; 211 } // namespace MailTransport 212 213