26#include <QHostAddress>
30#define DATE_FMT "\"yyyy-MM-dd HH:mm:ss\""
37 qRegisterMetaType<tc::Severity>();
38 qRegisterMetaType<tc::SocksError>();
39 qRegisterMetaType<tc::TorVersionStatus>();
41 qRegisterMetaType<BootstrapStatus>(
"BootstrapStatus");
42 qRegisterMetaType<Circuit>(
"Circuit");
43 qRegisterMetaType<Stream>(
"Stream");
45 qRegisterMetaType<QHostAddress>(
"QHostAddress");
46 qRegisterMetaType<QDateTime>(
"QDateTime");
56 case LogDebug:
event =
"DEBUG";
break;
57 case LogInfo:
event =
"INFO";
break;
59 case LogWarn:
event =
"WARN";
break;
68 default:
event =
"UNKNOWN";
break;
80 }
else if (event ==
"CIRC") {
82 }
else if (event ==
"STREAM") {
84 }
else if (event ==
"DEBUG") {
86 }
else if (event ==
"INFO") {
88 }
else if (event ==
"NOTICE") {
90 }
else if (event ==
"WARN") {
92 }
else if (event ==
"ERR") {
94 }
else if (event ==
"NEWDESC") {
96 }
else if (event ==
"ADDRMAP") {
98 }
else if (event ==
"STATUS_GENERAL") {
100 }
else if (event ==
"STATUS_CLIENT") {
102 }
else if (event ==
"STATUS_SERVER") {
116 int i = msg.indexOf(
" ");
162 QStringList msg = line.
getMessage().split(
" ");
163 if (msg.size() >= 3) {
164 quint64 bytesIn = (quint64)msg.at(1).toULongLong();
165 quint64 bytesOut = (quint64)msg.at(2).toULongLong();
187 int i = msg.indexOf(
" ") + 1;
216 int i = msg.indexOf(
" ") + 1;
236 int i = msg.indexOf(
" ");
238 QString logLine = (line.
getData().size() > 0 ? line.
getData().join(
"\n") :
253 QStringList descList = descs.mid(descs.indexOf(
" ")+1).split(
" ");
268 QStringList msg = line.
getMessage().split(
" ");
269 if (msg.size() >= 4) {
271 if (msg.size() >= 5 && msg.at(3) !=
"NEVER")
272 expires = QDateTime::fromString(msg.at(3) +
" " + msg.at(4),
DATE_FMT);
295 QHash<QString,QString> args;
299 status = msg.section(
' ', 2, 2);
322 const QString &action,
323 const QHash<QString,QString> &args)
325 if (! action.compare(
"DANGEROUS_TOR_VERSION", Qt::CaseInsensitive)) {
326 QString reason = args.value(
"REASON");
327 QString current = args.value(
"CURRENT");
328 QStringList recommended = args.value(
"RECOMMENDED")
329 .split(
",", QString::SkipEmptyParts);
330 if (! reason.compare(
"NEW", Qt::CaseInsensitive))
332 else if (! reason.compare(
"UNRECOMMENDED", Qt::CaseInsensitive))
334 else if (! reason.compare(
"OBSOLETE", Qt::CaseInsensitive)
335 || ! reason.compare(
"OLD", Qt::CaseInsensitive))
337 }
else if (! action.compare(
"CLOCK_SKEW", Qt::CaseInsensitive)) {
340 if (args.contains(
"SKEW"))
341 skew = args.value(
"SKEW").toInt(&ok);
342 else if (args.contains(
"MIN_SKEW"))
343 skew = args.value(
"MIN_SKEW").toInt(&ok);
346 }
else if (! action.compare(
"BUG", Qt::CaseInsensitive)) {
347 emit
bug(args.value(
"REASON"));
354 const QString &action,
355 const QHash<QString,QString> &args)
357 if (! action.compare(
"CIRCUIT_ESTABLISHED", Qt::CaseInsensitive)) {
359 }
else if (! action.compare(
"DANGEROUS_PORT", Qt::CaseInsensitive)) {
360 bool reject = ! args.value(
"RESULT").compare(
"REJECT", Qt::CaseInsensitive);
362 }
else if (! action.compare(
"DANGEROUS_SOCKS", Qt::CaseInsensitive)) {
364 }
else if (! action.compare(
"SOCKS_UNKNOWN_PROTOCOL", Qt::CaseInsensitive)) {
366 }
else if (! action.compare(
"SOCKS_BAD_HOSTNAME", Qt::CaseInsensitive)) {
368 }
else if (! action.compare(
"BOOTSTRAP", Qt::CaseInsensitive)) {
372 args.value(
"PROGRESS").toInt(),
373 args.value(
"SUMMARY"),
374 args.value(
"WARNING"),
377 args.value(
"RECOMMENDATION")));
385 const QString &action,
386 const QHash<QString,QString> &args)
388 if (! action.compare(
"EXTERNAL_ADDRESS", Qt::CaseInsensitive)) {
390 args.value(
"HOSTNAME"));
391 }
else if (! action.compare(
"CHECKING_REACHABILITY", Qt::CaseInsensitive)) {
392 if (args.contains(
"ORADDRESS")) {
393 QPair<QHostAddress,quint16> pair =
splitAddress(args.value(
"ORADDRESS"));
394 if (! pair.first.isNull())
396 }
else if (args.contains(
"DIRADDRESS")) {
397 QPair<QHostAddress,quint16> pair =
splitAddress(args.value(
"DIRADDRESS"));
398 if (! pair.first.isNull())
401 }
else if (! action.compare(
"REACHABILITY_SUCCEEDED", Qt::CaseInsensitive)) {
402 if (args.contains(
"ORADDRESS")) {
403 QPair<QHostAddress,quint16> pair =
splitAddress(args.value(
"ORADDRESS"));
404 if (! pair.first.isNull())
406 }
else if (args.contains(
"DIRADDRESS")) {
407 QPair<QHostAddress,quint16> pair =
splitAddress(args.value(
"DIRADDRESS"));
408 if (! pair.first.isNull())
411 }
else if (! action.compare(
"REACHABILITY_FAILED", Qt::CaseInsensitive)) {
412 if (args.contains(
"ORADDRESS")) {
413 QPair<QHostAddress,quint16> pair =
splitAddress(args.value(
"ORADDRESS"));
414 if (! pair.first.isNull())
416 }
else if (args.contains(
"DIRADDRESS")) {
417 QPair<QHostAddress,quint16> pair =
splitAddress(args.value(
"DIRADDRESS"));
418 if (! pair.first.isNull())
421 }
else if (! action.compare(
"GOOD_SERVER_DESCRIPTOR", Qt::CaseInsensitive)) {
423 }
else if (! action.compare(
"ACCEPTED_SERVER_DESCRIPTOR", Qt::CaseInsensitive)) {
424 QPair<QHostAddress,quint16> pair =
splitAddress(args.value(
"DIRAUTH"));
425 if (! pair.first.isNull())
427 }
else if (! action.compare(
"BAD_SERVER_DESCRIPTOR", Qt::CaseInsensitive)) {
428 QPair<QHostAddress,quint16> pair =
splitAddress(args.value(
"DIRAUTH"));
429 if (! pair.first.isNull())
431 args.value(
"REASON"));
432 }
else if (! action.compare(
"DNS_HIJACKED", Qt::CaseInsensitive)) {
434 }
else if (! action.compare(
"DNS_USELESS", Qt::CaseInsensitive)) {
442QPair<QHostAddress,quint16>
446 int idx = address.indexOf(
":");
447 if (idx <= 0 || idx >= address.length()-1)
448 return QPair<QHostAddress,quint16>();
450 QHostAddress ip = QHostAddress(address.mid(0, idx));
451 quint16 port =
static_cast<quint16
>(address.mid(idx+1).toUInt(&ok));
452 if (ip.isNull() || ! ok)
453 return QPair<QHostAddress,quint16>();
454 return QPair<QHostAddress,quint16>(ip, port);
static Status statusFromString(const QString &tag)
static Recommendation actionFromString(const QString &str)
QList< ReplyLine > getLines() const
QString getMessage() const
QStringList getData() const
static Stream fromString(const QString &stream)
void serverDescriptorRejected(const QHostAddress &ip, quint16 port, const QString &reason)
void handleEvent(const ControlReply &reply)
void streamStatusChanged(const Stream &stream)
void handleAddressMap(const ReplyLine &line)
void handleGeneralStatusEvent(tc::Severity severity, const QString &action, const QHash< QString, QString > &args)
void dangerousPort(quint16 port, bool rejected)
void orPortReachabilityFinished(const QHostAddress &ip, quint16 port, bool reachable)
void logMessage(tc::Severity level, const QString &msg)
void handleClientStatusEvent(tc::Severity severity, const QString &action, const QHash< QString, QString > &args)
void circuitEstablished()
void externalAddressChanged(const QHostAddress &ip, const QString &hostname)
void addressMapped(const QString &from, const QString &to, const QDateTime &expires)
static QPair< QHostAddress, quint16 > splitAddress(const QString &address)
void clockSkewed(int skew, const QString &source)
static Event parseEventType(const ReplyLine &line)
void serverDescriptorAccepted()
TorEvents(QObject *parent=0)
void bootstrapStatusChanged(const BootstrapStatus &status)
void handleBandwidthUpdate(const ReplyLine &line)
void dangerousTorVersion(tc::TorVersionStatus reason, const QString &version, const QStringList &recommended)
void socksError(tc::SocksError error, const QString &destination)
void handleNewDescriptor(const ReplyLine &line)
void checkingOrPortReachability(const QHostAddress &ip, quint16 port)
static QString toString(TorEvents::Event e)
void bug(const QString &reason)
void handleStreamStatus(const ReplyLine &line)
static Event toTorEvent(const QString &event)
void newDescriptors(const QStringList &ids)
void circuitStatusChanged(const Circuit &circuit)
void checkingDirPortReachability(const QHostAddress &ip, quint16 port)
void dirPortReachabilityFinished(const QHostAddress &ip, quint16 port, bool reachable)
void handleCircuitStatus(const ReplyLine &line)
void handleLogMessage(const ReplyLine &line)
void handleStatusEvent(Event type, const ReplyLine &line)
void bandwidthUpdate(quint64 bytesReceived, quint64 bytesSent)
void handleServerStatusEvent(tc::Severity severity, const QString &action, const QHash< QString, QString > &args)
@ UnrecommendedTorVersion
@ UnknownSocksProtocolError
@ DangerousSocksTypeError
Severity severityFromString(const QString &str)
ConnectionStatusReason connectionStatusReasonFromString(const QString &str)
QHash< QString, QString > string_parse_keyvals(const QString &str, bool *ok)