1 /* Ricochet - https://ricochet.im/
2  * Copyright (C) 2014, John Brooks <john.brooks@dereferenced.net>
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are
6  * met:
7  *
8  *    * Redistributions of source code must retain the above copyright
9  *      notice, this list of conditions and the following disclaimer.
10  *
11  *    * Redistributions in binary form must reproduce the above
12  *      copyright notice, this list of conditions and the following disclaimer
13  *      in the documentation and/or other materials provided with the
14  *      distribution.
15  *
16  *    * Neither the names of the copyright owners nor the names of its
17  *      contributors may be used to endorse or promote products derived from
18  *      this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 #ifndef HIDDENSERVICE_H
34 #define HIDDENSERVICE_H
35 
36 #include <QObject>
37 #include <QHostAddress>
38 #include <QList>
39 #include "utils/CryptoKey.h"
40 
41 namespace Tor
42 {
43 
44 class TorSocket;
45 
46 class HiddenService : public QObject
47 {
48     Q_OBJECT
Q_DISABLE_COPY(HiddenService)49     Q_DISABLE_COPY(HiddenService)
50 
51     friend class TorControlPrivate;
52 
53 public:
54     struct Target
55     {
56         QHostAddress targetAddress;
57         quint16 servicePort, targetPort;
58     };
59 
60     enum Status
61     {
62         NotCreated = -1, /* Service has not been created yet */
63         Offline = 0, /* Data exists, but service is not published */
64         Online /* Published */
65     };
66 
67     HiddenService(QObject *parent = 0);
68     HiddenService(const QString &dataPath, QObject *parent = 0);
69     HiddenService(const CryptoKey &privateKey, const QString &dataPath = QString(), QObject *parent = 0);
70 
status()71     Status status() const { return m_status; }
72 
hostname()73     const QString &hostname() const { return m_hostname; }
dataPath()74     const QString &dataPath() const { return m_dataPath; }
75 
privateKey()76     CryptoKey privateKey() { return m_privateKey; }
77     void setPrivateKey(const CryptoKey &privateKey);
78 
targets()79     const QList<Target> &targets() const { return m_targets; }
80     void addTarget(const Target &target);
81     void addTarget(quint16 servicePort, QHostAddress targetAddress, quint16 targetPort);
82 
83 signals:
84     void statusChanged(int newStatus, int oldStatus);
85     void serviceOnline();
86     void privateKeyChanged();
87 
88 private slots:
89     void servicePublished();
90 
91 private:
92     QString m_dataPath;
93     QList<Target> m_targets;
94     QString m_hostname;
95     Status m_status;
96     CryptoKey m_privateKey;
97 
98     void loadPrivateKey();
99     void setStatus(Status newStatus);
100 };
101 
102 }
103 
104 #endif // HIDDENSERVICE_H
105