1 /*
2     SPDX-FileCopyrightText: 2015-2017 Krzysztof Nowicki <krissn@op.pl>
3 
4     SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6 
7 #pragma once
8 
9 #include <QHash>
10 #include <QString>
11 #include <QUrl>
12 
13 #include "ewsjob.h"
14 #include "ewsserverversion.h"
15 #include "ewstypes.h"
16 
17 namespace KIO
18 {
19 class Job;
20 }
21 
22 class EwsPoxAutodiscoverRequest : public EwsJob
23 {
24     Q_OBJECT
25 public:
26     enum Action {
27         RedirectUrl = 0,
28         RedirectAddr,
29         Settings,
30     };
31 
32     enum ProtocolType {
33         ExchangeProto,
34         ExchangeProxyProto,
35         ExchangeWebProto,
36         UnknownProto,
37     };
38 
39     class Protocol
40     {
41     public:
Protocol()42         Protocol()
43             : mType(UnknownProto)
44         {
45         }
46 
isValid()47         bool isValid() const
48         {
49             return mType != UnknownProto;
50         }
51 
type()52         ProtocolType type() const
53         {
54             return mType;
55         }
56 
ewsUrl()57         const QString &ewsUrl() const
58         {
59             return mEwsUrl;
60         }
61 
oabUrl()62         const QString &oabUrl() const
63         {
64             return mOabUrl;
65         }
66 
67     private:
68         ProtocolType mType;
69         QString mEwsUrl;
70         QString mOabUrl;
71         friend class EwsPoxAutodiscoverRequest;
72     };
73 
74     EwsPoxAutodiscoverRequest(const QUrl &url, const QString &email, const QString &userAgent, bool useNTLMv2, QObject *parent);
75     ~EwsPoxAutodiscoverRequest() override;
76 
serverVersion()77     const EwsServerVersion &serverVersion() const
78     {
79         return mServerVersion;
80     }
81 
82     void dump() const;
83 
84     void start() override;
85 
action()86     Action action() const
87     {
88         return mAction;
89     }
90 
protocol(ProtocolType type)91     const Protocol protocol(ProtocolType type) const
92     {
93         return mProtocols.value(type);
94     }
95 
redirectAddr()96     const QString &redirectAddr() const
97     {
98         return mRedirectAddr;
99     }
100 
redirectUrl()101     const QString &redirectUrl() const
102     {
103         return mRedirectUrl;
104     }
105 
lastHttpUrl()106     const QUrl &lastHttpUrl() const
107     {
108         return mLastUrl;
109     }
110 
111 protected:
112     void doSend();
113     void prepare(const QString &body);
114     bool readResponse(QXmlStreamReader &reader);
115 
116 protected Q_SLOTS:
117     void requestResult(KJob *job);
118     void requestData(KIO::Job *job, const QByteArray &data);
119     void requestRedirect(KIO::Job *job, const QUrl &url);
120 
121 private:
122     bool readAccount(QXmlStreamReader &reader);
123     bool readProtocol(QXmlStreamReader &reader);
124 
125     QString mResponseData;
126     QString mBody;
127     QUrl mUrl;
128     QString mEmail;
129     QString mUserAgent;
130     bool mUseNTLMv2;
131     EwsServerVersion mServerVersion;
132     Action mAction;
133     QString mRedirectUrl;
134     QString mRedirectAddr;
135     QHash<ProtocolType, Protocol> mProtocols;
136     QUrl mLastUrl;
137 };
138 
139