23 #include <QHostAddress> 24 #include <QVariantMap> 30 #define RELAY_SIGNAL(src, sig) \ 31 QObject::connect((src), (sig), this, (sig)) 39 QString, QStringList)));
82 this, SLOT(
onStopped(
int, QProcess::ExitStatus)));
86 #if defined(Q_OS_WIN32) 91 this, SLOT(
onStopped(
int, QProcess::ExitStatus)));
115 #if defined(Q_OS_WIN32) 119 _torService->start();
136 *errmsg = tr(
"Vidalia has not started Tor. " 137 "You need to stop Tor through the interface you started it.");
157 emit
stopped(exitCode, exitStatus);
165 return (
_torProcess->state() != QProcess::NotRunning);
172 return (
_torProcess->state() != QProcess::NotRunning
223 if (!
send(cmd, reply, &str)) {
228 QHash<QString, QString> args;
238 args.value(
"PROGRESS").toInt(),
239 args.value(
"SUMMARY"));
290 return send(cmd, reply, errmsg);
304 if (!
send(cmd, reply, &str)) {
306 return err(errmsg, str);
323 if (!
send(cmd, reply, &str)) {
325 return err(errmsg, str);
356 QHash<QString,QString> keyvals;
360 if (!
send(cmd, reply, errmsg))
368 idx = msg.indexOf(
" ");
369 topic = msg.mid(0, idx).toUpper();
376 keyvals = QHash<QString,QString>();
379 if (topic ==
"AUTH") {
380 if (keyvals.contains(
"METHODS"))
382 if (keyvals.contains(
"COOKIEFILE"))
384 }
else if (topic ==
"VERSION") {
385 if (keyvals.contains(
"Tor"))
399 return send(cmd, errmsg);
405 QString str =
getInfo(
"status/bootstrap-phase").toString();
406 if (!str.isEmpty()) {
411 args.value(
"PROGRESS").toInt(),
412 args.value(
"SUMMARY"),
413 args.value(
"WARNING"),
416 args.value(
"RECOMMENDATION")));
430 if (
getInfo(
"status/circuit-established", tmp))
437 foreach (
Circuit circ, circs) {
456 foreach (QString key, map.keys()) {
461 if (
send(cmd, reply, errmsg)) {
465 QStringList keyval = line.
getMessage().split(
"=");
466 if (keyval.size() == 2) {
467 QString key = keyval.at(0);
468 QString val = keyval.at(1);
469 if (val.startsWith(QLatin1Char(
'\"')) &&
470 val.endsWith(QLatin1Char(
'\"'))) {
476 map.insert(key, val);
495 if (!
send(cmd, reply, errmsg))
496 return QVariantMap();
500 int index = msg.indexOf(
"=");
501 QString key = msg.mid(0, index);
504 if (index > 0 && index < msg.length()-1) {
505 QString str = msg.mid(index+1);
506 if (str.startsWith(QLatin1Char(
'\"')) &&
507 str.endsWith(QLatin1Char(
'\"'))) {
518 if (infoMap.contains(key)) {
519 QStringList values = infoMap.value(key).toStringList();
521 infoMap.insert(key, values);
523 infoMap.insert(key, val);
535 QVariantMap map =
getInfo(QStringList() << key, errmsg);
536 return map.value(key);
543 QHash<QString,QString> map;
547 val = map.value(key);
565 return send(cmd, errmsg);
573 QHostAddress socksAddr;
577 return QHostAddress::Null;
583 foreach (QString addr, addrList) {
584 addr = addr.mid(0, addr.indexOf(
":"));
585 if (socksAddr.setAddress(addr)) {
590 return QHostAddress::LocalHost;
598 QStringList addrList;
599 if (
getConf(
"SocksListenAddress", addrList, errmsg)) {
602 return QStringList();
611 if (portList.size() > 0) {
612 return portList.at(0);
623 quint16 port, socksPort;
625 QList<quint16> portList;
628 if (
getConf(
"SocksPort", portString, errmsg)) {
629 socksPort = (quint16)portString.toUInt(&valid);
631 if (socksPort == 0) {
634 return QList<quint16>();
640 foreach (QString addr, addrList) {
641 if (addr.contains(
":")) {
642 portString = addr.mid(addr.indexOf(
":")+1);
643 port = (quint16)portString.toUInt(&valid);
651 if (!portList.size() || (portList.size() != addrList.size())) {
652 portList << socksPort;
669 static QString versionString;
671 quint8 major, minor, micro, patch;
679 QStringList parts = versionString.split(QRegExp(
"\\.|-|\\ "));
680 if (parts.size() >= 4) {
681 major = (quint8)parts.at(0).toUInt();
682 minor = (quint8)parts.at(1).toUInt();
683 micro = (quint8)parts.at(2).toUInt();
684 patch = (quint8)parts.at(3).toUInt();
685 version = ((major << 24) | (minor << 16) | (micro << 8) | patch);
716 return send(cmd, errmsg);
727 foreach (QString key, map.uniqueKeys()) {
733 QList<QString> values = map.values(key);
734 for (
int i = values.size()-1;
i >= 0;
i--) {
735 QString value = values.at(
i);
736 if (value.length() > 0)
742 return send(cmd, errmsg);
749 QHash<QString,QString> map;
750 map.insert(key, value);
758 QHash<QString,QString> map;
759 map.insert(keyAndValue,
"");
768 QHash<QString,QStringList> multiMap;
769 foreach (QString key, map.keys()) {
770 multiMap.insert(key, QStringList());
772 if (
getConf(multiMap, errmsg)) {
773 foreach (QString key, multiMap.keys()) {
774 if (map.contains(key)) {
775 map.insert(key, multiMap.value(key).join(
"\n"));
788 QStringList confValue;
792 foreach (QString key, map.keys()) {
797 if (
send(cmd, reply, errmsg)) {
801 QStringList keyval = line.
getMessage().split(
"=");
802 if (keyval.size() == 2) {
803 confKey = keyval.at(0);
805 if (map.contains(confKey)) {
808 confValue = map.value(confKey);
810 confValue << keyval.at(1);
811 map.insert(keyval.at(0), confValue);
823 QStringList confValues;
824 if (
getConf(key, confValues, errmsg)) {
825 value = confValues.join(
"\n");
835 QHash<QString,QStringList> map;
836 map.insert(key, QStringList());
839 value = map.value(key);
856 if (!
send(cmd, reply, errmsg))
857 return QVariantMap();
861 int index = msg.indexOf(
"=");
862 QString key = msg.mid(0, index);
865 if (index > 0 && index < msg.length()-1)
866 val = msg.mid(index+1);
867 if (val.startsWith(QLatin1Char(
'\"')) &&
868 val.endsWith(QLatin1Char(
'\"'))) {
875 if (confMap.contains(key)) {
876 QStringList values = confMap.value(key).toStringList();
878 confMap.insert(key, values);
880 confMap.insert(key, val);
892 QVariantMap map =
getConf(QStringList() << key, errmsg);
893 return map.value(key);
906 if (!
send(cmd, reply, errmsg))
917 bool ret =
send(cmd, errmsg);
921 setConf(
"__ReloadTorrcOnSIGHUP",
"0", &err);
934 foreach (QString key, keys) {
937 return send(cmd, errmsg);
945 return resetConf(QStringList() << key, errmsg);
955 return getInfo(
"desc/id/" +
id, errmsg).toStringList();
973 QStringList status =
getInfo(
"ns/id/" +
id, errmsg).toStringList();
983 QStringList networkStatusLines =
getInfo(
"ns/all", errmsg).toStringList();
984 QList<RouterStatus> networkStatus;
985 int len = networkStatusLines.size();
990 QStringList routerStatusLines;
992 routerStatusLines << networkStatusLines.at(i);
993 }
while (++i < len && ! networkStatusLines.at(i).startsWith(
"r "));
999 networkStatus << routerStatus;
1001 return networkStatus;
1011 QStringList lines =
getInfo(
"desc-annotations/id/"+
id, errmsg).toStringList();
1015 foreach (QString line, lines) {
1016 int idx = line.indexOf(
" ");
1019 key = line.mid(0, idx);
1020 if (key.startsWith(
"@"))
1021 key = key.remove(0, 1);
1024 if (idx > 0 && idx < line.length()-1)
1025 annotations.insert(key, line.mid(idx + 1).trimmed());
1027 annotations.insert(key, QString());
1040 if (!
send(cmd, reply, errmsg))
1044 foreach(QString line, reply.
getData()) {
1061 return send(cmd, errmsg);
1070 QList<Stream> streams;
1073 if (
send(cmd, reply, errmsg)) {
1081 foreach (QString line, reply.
getData()) {
1096 return send(cmd, errmsg);
1105 QStringList entries;
1109 entries =
getInfo(
"address-mappings/config").toStringList();
1112 entries =
getInfo(
"address-mappings/cache").toStringList();
1115 entries =
getInfo(
"address-mappings/control").toStringList();
1118 entries =
getInfo(
"address-mappings/all").toStringList();
1121 foreach (QString entry, entries) {
1122 addressMap.
add(entry);
1134 QString request = QString(
"ip-to-country/%1").arg(ip.toString());
1136 if (! response.isNull())
1137 return response.toString();
1146 return send(cmd, errmsg);
void authenticationFailed(QString errmsg)
void checkingDirPortReachability(const QHostAddress &ip, quint16 port)
TorControl(ControlMethod::Method method=ControlMethod::Port)
void onLogStdout(const QString &severity, const QString &message)
ConnectionStatusReason connectionStatusReasonFromString(const QString &str)
bool signal(TorSignal::Signal sig, QString *errmsg=0)
bool stop(QString *errmsg=0)
bool getConf(QHash< QString, QString > &map, QString *errmsg=0)
ControlMethod::Method _method
QList< quint16 > getSocksPortList(QString *errmsg=0)
bool closeStream(const StreamId &streamId, QString *errmsg=0)
void connect(const QHostAddress &addr, quint16 port)
void orPortReachabilityFinished(const QHostAddress &ip, quint16 port, bool reachable)
QString expand_filename(const QString &filename)
bool err(QString *str, const QString &errmsg)
void externalAddressChanged(const QHostAddress &ip, const QString &hostname)
QString getStatus() const
#define RELAY_SIGNAL(src, sig)
QString getStatus() const
QHash< QString, QString > string_parse_keyvals(const QString &str, bool *ok)
StreamList getStreams(QString *errmsg=0)
NetworkStatus getNetworkStatus(QString *errmsg=0)
void dirPortReachabilityFinished(const QHostAddress &ip, quint16 port, bool reachable)
static Status statusFromString(const QString &tag)
void add(const QString &from, const QString &to, const QDateTime &expires)
bool authenticate(const QByteArray cookie, QString *errmsg=0)
static Recommendation actionFromString(const QString &str)
void serverDescriptorAccepted()
void setTorVersion(const QString torVersion)
void start(const QString &app, const QStringList &args)
QString ipToCountry(const QHostAddress &ip, QString *errmsg=0)
QStringList getData() const
bool setConf(QHash< QString, QString > map, QString *errmsg=0)
QString string_unescape(const QString &str, bool *ok)
quint16 getSocksPort(QString *errmsg=0)
bool setEvent(TorEvents::Event e, bool add=true, bool set=true, QString *errmsg=0)
QString string_escape(const QString &str)
static const Event EVENT_MAX
QHostAddress getSocksAddress(QString *errmsg=0)
bool setEvents(QString *errmsg=0)
bool getInfo(QHash< QString, QString > &map, QString *errmsg=0)
QStringList getRouterDescriptorText(const QString &id, QString *errmsg=0)
void bandwidthUpdate(quint64 bytesReceived, quint64 bytesSent)
void startFailed(QString errmsg)
AddressMap getAddressMap(AddressMap::AddressMapType type=AddressMap::AddressMapAll, QString *errmsg=0)
void setAuthMethods(const QString methods)
bool send(ControlCommand cmd, ControlReply &reply, QString *errmsg=0)
QString getMessage() const
bool closeCircuit(const CircuitId &circId, bool ifUnused=false, QString *errmsg=0)
static Stream fromString(const QString &stream)
void logMessage(tc::Severity level, const QString &msg)
DescriptorAnnotations getDescriptorAnnotations(const QString &id, QString *errmsg=0)
TorEvents * _eventHandler
void connectFailed(QString errmsg)
RouterDescriptor getRouterDescriptor(const QString &id, QString *errmsg=0)
static bool isSupported()
RouterStatus getRouterStatus(const QString &id, QString *errmsg=0)
void setCookieAuthFile(const QString cookieAuthFile)
void circuitEstablished()
bool stop(QString *errmsg=0)
void serverDescriptorRejected(const QHostAddress &ip, quint16 port, const QString &reason)
bool send(const ControlCommand &cmd, ControlReply &reply, QString *errmsg=0)
void dangerousTorVersion(tc::TorVersionStatus reason, const QString &version, const QStringList &recommended)
stop errmsg connect(const QHostAddress &address, quint16 port)
QStringList getSocksAddressList(QString *errmsg=0)
QStringList getData() const
void bug(const QString &reason)
QList< ReplyLine > getLines() const
QString base16_encode(const QByteArray &buf)
bool useFeature(const QString &feature, QString *errmsg=0)
void onStopped(int exitCode, QProcess::ExitStatus exitStatus)
void addArguments(const QStringList &args)
TorEvents::Events _events
QString getTorVersionString()
static const Event EVENT_MIN
bool isCircuitEstablished()
bool saveConf(QString *errmsg=0)
ControlConnection * _controlConn
QString getHiddenServiceConf(const QString &key, QString *errmsg=0)
ProtocolInfo protocolInfo(QString *errmsg=0)
void bootstrapStatusChanged(const BootstrapStatus &status)
static QString toString(TorEvents::Event e)
QList< Circuit > CircuitList
void checkingOrPortReachability(const QHostAddress &ip, quint16 port)
void circuitStatusChanged(const Circuit &circuit)
bool takeOwnership(QString *errmsg)
bool isVidaliaRunningTor()
CircuitList getCircuits(QString *errmsg=0)
bool resetConf(QStringList keys, QString *errmsg=0)
QHash< QString, QString > DescriptorAnnotations
void connect(const QHostAddress &address, quint16 port)
Severity severityFromString(const QString &str)
BootstrapStatus bootstrapStatus(QString *errmsg=0)
static QString toString(Signal signal)
void socksError(tc::SocksError type, const QString &destination)
void streamStatusChanged(const Stream &stream)
void addressMapped(const QString &from, const QString &to, const QDateTime &expires)
QList< RouterStatus > NetworkStatus
void dangerousPort(quint16 port, bool rejected)
void newDescriptors(const QStringList &ids)
void clockSkewed(int skew, const QString &source)
QString getMessage() const
void addArgument(const QString &arg)
void start(const QString &tor, const QStringList &args)