1 /*
2     sieve.h
3 
4     SPDX-FileCopyrightText: 2001 Hamish Rodda <meddie@yoyo.cc.monash.edu.au>
5 
6     SPDX-License-Identifier: GPL-2.0-only
7 */
8 
9 #pragma once
10 
11 #include <KIO/AuthInfo>
12 #include <KIO/TCPSlaveBase>
13 
14 #include <QByteArray>
15 #include <QString>
16 #include <QStringList>
17 
18 class kio_sieveResponse
19 {
20 public:
21     enum responses { NONE, KEY_VAL_PAIR, ACTION, QUANTITY };
22 
23     kio_sieveResponse();
24 
25     const uint &getType() const;
26 
27     const QByteArray &getAction() const;
28     uint getQuantity() const;
29     const QByteArray &getKey() const;
30     const QByteArray &getVal() const;
31     const QByteArray &getExtra() const;
32 
33     void setQuantity(uint quantity);
34     void setAction(const QByteArray &newAction);
35     void setKey(const QByteArray &newKey);
36     void setVal(const QByteArray &newVal);
37     void setExtra(const QByteArray &newExtra);
38 
39     void clear();
40 
41 protected:
42     uint rType;
43     uint quantity;
44     QByteArray key;
45     QByteArray val;
46     QByteArray extra;
47 };
48 
49 class kio_sieveProtocol : public KIO::TCPSlaveBase
50 {
51 public:
52     enum connectionModes { NORMAL, CONNECTION_ORIENTED };
53     enum Results { OK, NO, BYE, OTHER };
54 
55     kio_sieveProtocol(const QByteArray &pool_socket, const QByteArray &app_socket);
56     ~kio_sieveProtocol() override;
57 
58     void mimetype(const QUrl &url) override;
59     void get(const QUrl &url) override;
60     void put(const QUrl &url, int permissions, KIO::JobFlags flags) override;
61     void del(const QUrl &url, bool isfile) override;
62 
63     void listDir(const QUrl &url) override;
64     void chmod(const QUrl &url, int permissions) override;
65     virtual void urlStat(const QUrl &url);
66 
67     void setHost(const QString &host, quint16 port, const QString &user, const QString &pass) override;
68     void openConnection() override;
69     void closeConnection() override;
70     // virtual void slave_status();
71 
72     /**
73      * Special commands supported by this slave:
74      * 1 - activate script
75      * 2 - deactivate (all - only one active at any one time) scripts
76      * 3 - request capabilities, returned as metadata
77      */
78     void special(const QByteArray &data) override;
79     bool activate(const QUrl &url);
80     bool deactivate();
81 
82 protected:
83     bool connect(bool useTLSIfAvailable = true);
84     bool authenticate();
85     void disconnect(bool forcibly = false);
86     void changeCheck(const QUrl &url);
87 
88     bool sendData(const QByteArray &data);
89     bool receiveData(bool waitForData = true, const QByteArray &reparse = QByteArray());
90     bool operationSuccessful();
91     int operationResult();
92 
93     bool parseCapabilities(bool requestCapabilities = false);
94     bool saslInteract(void *in, KIO::AuthInfo &ai);
95 
96     // IOSlave global data
97     uint m_connMode;
98 
99     // Host-specific data
100     QStringList m_sasl_caps;
101     bool m_supportsTLS;
102 
103     // Global server response class
104     kio_sieveResponse r;
105 
106     // connection details
107     QString m_sServer;
108     QString m_sUser;
109     QString m_sPass;
110     QString m_sAuth;
111     bool m_shouldBeConnected;
112     bool m_allowUnencrypted;
113     quint16 m_port;
114 
115 private:
116     bool requestCapabilitiesAfterStartTLS() const;
117 
118     QString m_implementation;
119 };
120 
121