summaryrefslogtreecommitdiffstats
path: root/src/torclient.h
blob: caaed20a71a17758537fb4cf0b725d8ea74b6f34 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
/****************************************************************************
 ** $Id: torclient.h,v 1.76 2009/01/17 15:49:08 hoganrobert Exp $
 *   Copyright (C) 2006 - 2008 Robert Hogan                                *
 *   [email protected]                                                *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.              *
 ***************************************************************************
**
** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
**
** This file is part of an example program for Qt.  This example
** program may be used, distributed and modified without limitation.
**
*****************************************************************************/

#ifndef _TORCLIENT_H_
#define _TORCLIENT_H_

#include <qsocket.h>
#include <qtextstream.h>
#include <kdebug.h>
#include <kconfigskeleton.h>
#include <qlistview.h>
#include "torkconfig.h"


class KConfigSkeleton;
class KConfigSkeletonItem;

class PrevConfig
    {
    public:
        PrevConfig(): pr(0) {}
        PrevConfig( const QString& name, const QVariant& property )
            : nm(name), pr(property)
        {}
        typedef QValueList<PrevConfig> PrevConfigList;
        QString name() const { return nm; }
        QVariant property() const { return pr; }
        void setName( QString n ) { nm = n; }
        void setProperty( QVariant p ) { pr = p; }
    private:
        QString nm;
        QVariant pr;
    };



class TorClient : public QObject
{
    Q_OBJECT
public:
    TorClient( const QString &host, Q_UINT16 port );

    virtual ~TorClient();


    void sendToServer(const QString &string)
    {
        if (!socket)
            return;
        QTextStream os(socket);
        os << string << "\r\n";
    }

    QStringList currentServerReport()
    {
        return serverReport;
    }

    QStringList currentClientReport()
    {
        return clientReport;
    }

    void bandwidth();
    bool isControllerWorking( );
    void updatePrevConfig(PrevConfig::PrevConfigList previtems);
    void newIdentity();
    void createService(const QString &dir, const QString &port);
    void setBandwidth(const QString &rate, const QString &burst, const QString &max);
    void setGeoIPAvailable(bool set){geoip_db = set;};
    unsigned long int getCurBandwidthRate(){return m_CurBandwidthRate;};
    unsigned long int getCurBandwidthBurst(){return m_CurBandwidthBurst;};
    unsigned long int getCurMaxAdvertisedBandwidth()
                       {return m_CurMaxAdvertisedBandwidth;};
    void getBandwidth();
    void enableDNS( bool set );
    void enableTransPort( bool set );
    void cleanUp();

signals:

    void streamStatusUpdate(const QString &, const QString &,
        const QString &, const QString &, const QString &);
    void ORStatusUpdate(const QString &, const QString &);
    void guardStatusUpdate(const QString &, const QString &);
    void circuitStatusUpdate(const QString &, const QString &,
                             const QString &, const QString &);
    void infoUpdate(const QString &,const QString &, const QString &);
    void bwUpdate(const QString &,const QString &);
    void updateActiveServers(const QStringList &);
    void updateServerStatus(const QString &, const QString &,
                            const QString &,const QString &);
    void fatalError();
    void serverError();
    void displayError(const QString &,const QString &);
    void displayServer(const QString &,const QString &);
    void whatImDoing(const QString &);
    void copyOldConfig();
    void shouldIApplySettings();
    void torConnectionClosed();
    void makeTorkStoppable();
    void warnNoServerInfo();
    void needAlphaVersion( );
    void connectedToTor( );
    void authenticated();
    void streamBwUpdate(const QString &,const QString &,const QString & );
    void setTorCaption(const QString &);
    void processWarning(const QString &,const QString &);
    void processQuestion(const QString &,const QString &);
    void showServerBW(const QString&);
    void updateTrayIcon(const QString&);
    void resolvedAddress(const QString&);
	void authenticationFailed();

public slots:
    void socketReadyRead();
    void applySettingsToRunningTor();
    void attemptAttach(const QString &, const QString &);
    void attemptExtendCircuit(const QString &, const QString &, bool);
    void attemptCreateCircuit(const QString &, bool);
    void attemptCloseStream(const QString &);
    void attemptAttachStreams( bool );
    void attemptCloseCircuit(const QString &);
    void fetchServerInfo(const QString &);
    void fetchServerInfoByNick(const QString &);
    void slotCheckTorNet();
    void authenticate();
    void slotCheckGuards();
    void updateExcludeNodes();
    void updateEntryNodes();
    void updateExitNodes();
    void safeLogging( bool safe);
    void clearNodes();
    void strictExitNodes( bool strict );
    void configureServer( int orPort, int dirPort);
    void closeAllCircuits( QListView* &circuitList);
    void allowPlainTextPorts( );
    void assignPortToRemove();
    void resolveAddress(const QString &);
    void terminateTor();

private slots:
    void closeConnection()
    {
        socket->close();
        if ( socket->state() == QSocket::Closing ) {
            // We have a delayed close.
            connect( socket, SIGNAL(delayedCloseFinished()),
                    SLOT(socketClosed()) );
        } else {
            // The socket is closed.
            socketClosed();
        }
    }


    void socketConnected()
    {
       emit connectedToTor();
    }

    void socketConnectionClosed()
    {
        emit torConnectionClosed();
    }

    void socketClosed()
    {
    }

    void socketError( int e )
    {
         if ( e == QSocket::ErrHostNotFound ||
              e == QSocket::ErrConnectionRefused )
            emit fatalError();
    }

    void parseEvent(const QString &type, const QString &info);
    void parseStream(const QString &info);
    void parseGuards(const QString &info);
    void parseORConn(const QString &info);
    void parseServer(const QString &info);
    void parseCircuit(const QString &info);
    void parseInfo(const QString &type, const QString &info);
    void parseBW(const QString &info);
    void parseAddrmap(const QString &info);
    void parseStreamBW(const QString &info);
    void parseDirStatus(const QString &info);
    void parseStatusGeneral(const QString &info);
    void resetClientReport();
    void updateCandidateServers(const QString &path);
    void handle250(const QString &line);
    void updateServerReport(const QString &message,
                            const QString &info);
    void updateClientReport(const QString &message);
    void populateMessageFromStatusDetail(const QString &line,
                                         QString &message);
    void handleTorVersion( const QString &caption);
    void readRouters();

private:
    QSocket *socket;
    bool m_expectingCircuitInfo;
    bool m_expectingStreamInfo;
    bool m_expectingOrconnInfo;
    bool m_expectingGuardsInfo;
    bool m_expectingDirStatus;
    bool m_expectingServerInfo;
    bool m_resolvingServerAddress;
    bool geoip_db;
    QString m_currentTorVersion;
    bool elementShouldBeUsed(const KConfigSkeletonItem* it);
    bool noSpecialProcessing(const KConfigSkeletonItem* it);
    bool readCookie();
    QString ds_identity;
    QString ds_fp_identity;
    QString ds_ip;
    QString ds_server;
    QString ds_date;
    QString ds_statuses;
    QString m_statustip;
    QString m_statustiptmp;
    bool m_controllerWorking;
    bool authorityread;
    bool m_firstloadcomplete;
    bool m_firstdircomplete;
    PrevConfig::PrevConfigList m_previtems;
    int m_CurBandwidthRate;
    int m_CurBandwidthBurst;
    int m_CurMaxAdvertisedBandwidth;
    QString m_statustipIP;
    typedef QMap<QString, QString> statusmap;
    statusmap statusMessage;
    statusmap serverStatus;
    statusmap serverStatusIcon;
    statusmap clientStatus;
    statusmap portMessage;
    statusmap clientStatusIcon;
    QStringList serverReport;
    QStringList clientReport;
    QStringList m_WarnedPorts;
    QStringList m_portsToReject;
    QString m_portToRemove;
    QStringList logResolveList;
};

#endif //