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