tor-commits
Threads by month
- ----- 2026 -----
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- 1 participants
- 214711 discussions
[vidalia/alpha] First rusty working version of TorControlPrototype
by chiiph@torproject.org 02 Jul '11
by chiiph@torproject.org 02 Jul '11
02 Jul '11
commit ccbc7388fb15d808e5c90aa9d30cd9af48b1f1cf
Author: Tomas Touceda <chiiph(a)torproject.org>
Date: Wed Jun 15 00:24:14 2011 -0300
First rusty working version of TorControlPrototype
It needs work mainly in all the types that aren't automatically cohersed to
QVariant or something that javascript understands
---
src/vidalia/CMakeLists.txt | 2 +
src/vidalia/plugin/PluginEngine.cpp | 22 +-
src/vidalia/plugin/PluginEngine.h | 3 +-
.../plugin/prototypes/TorControlPrototype.cpp | 475 +++++++++-----------
.../plugin/prototypes/TorControlPrototype.h | 49 +-
5 files changed, 256 insertions(+), 295 deletions(-)
diff --git a/src/vidalia/CMakeLists.txt b/src/vidalia/CMakeLists.txt
index 380b9e8..f340b65 100644
--- a/src/vidalia/CMakeLists.txt
+++ b/src/vidalia/CMakeLists.txt
@@ -89,6 +89,7 @@ set(vidalia_SRCS ${vidalia_SRCS}
plugin/DebugDialog.cpp
plugin/prototypes/VidaliaTabPrototype.cpp
plugin/prototypes/HelperProcessPrototype.cpp
+ plugin/prototypes/TorControlPrototype.cpp
)
qt4_wrap_cpp(vidalia_SRCS
plugin/PluginEngine.h
@@ -96,6 +97,7 @@ qt4_wrap_cpp(vidalia_SRCS
plugin/DebugDialog.h
plugin/prototypes/VidaliaTabPrototype.h
plugin/prototypes/HelperProcessPrototype.h
+ plugin/prototypes/TorControlPrototype.h
)
## Configuration dialog sources
diff --git a/src/vidalia/plugin/PluginEngine.cpp b/src/vidalia/plugin/PluginEngine.cpp
index 3f99025..4d6d745 100644
--- a/src/vidalia/plugin/PluginEngine.cpp
+++ b/src/vidalia/plugin/PluginEngine.cpp
@@ -3,6 +3,8 @@
#include "PluginWrapper.h"
#include "DebugDialog.h"
+#include "Vidalia.h"
+
PluginEngine::PluginEngine(QObject *parent)
: QScriptEngine(parent)
{
@@ -10,10 +12,13 @@ PluginEngine::PluginEngine(QObject *parent)
MAKE_CREATABLE(VidaliaTabPrototype)
ADD_PROTOTYPE(HelperProcessPrototype)
MAKE_CREATABLE(HelperProcessPrototype)
-// ADD_PROTOTYPE(TorControlPrototype)
+ ADD_PROTOTYPE(TorControlPrototype)
+
+ globalObject().setProperty("torControl", newQObject(Vidalia::torControl()));
globalObject().setProperty("include", newFunction(includeScript));
globalObject().setProperty("importExtension", newFunction(importExtension));
+ globalObject().setProperty("vdebug", newFunction(vdebug));
VidaliaSettings settings;
globalObject().setProperty("pluginPath", QScriptValue(settings.pluginPath()));
@@ -163,3 +168,18 @@ PluginEngine::loadFile(QString fileName, QScriptEngine *engine)
}
return true;
}
+
+QScriptValue
+PluginEngine::vdebug(QScriptContext *context, QScriptEngine *engine)
+{
+ QString result;
+ for(int i = 0; i<context->argumentCount(); i++) {
+ if(i>0)
+ result.append(" ");
+ result.append(context->argument(i).toString());
+ }
+
+ qWarning() << result;
+
+ return engine->undefinedValue();
+}
diff --git a/src/vidalia/plugin/PluginEngine.h b/src/vidalia/plugin/PluginEngine.h
index 5b4cc25..13890f6 100644
--- a/src/vidalia/plugin/PluginEngine.h
+++ b/src/vidalia/plugin/PluginEngine.h
@@ -6,7 +6,7 @@
#include "VidaliaTabPrototype.h"
#include "HelperProcessPrototype.h"
-//#include "TorControlPrototype.h"
+#include "TorControlPrototype.h"
class PluginWrapper;
@@ -33,6 +33,7 @@ class PluginEngine : public QScriptEngine {
static QScriptValue importExtension(QScriptContext *context, QScriptEngine *engine);
static bool loadFile(QString fileName, QScriptEngine *engine);
static QScriptValue includeScript(QScriptContext *context, QScriptEngine *engine);
+ static QScriptValue vdebug(QScriptContext *context, QScriptEngine *engine);
void loadAllPlugins();
void tryLoadPlugin(QDir path);
diff --git a/src/vidalia/plugin/prototypes/TorControlPrototype.cpp b/src/vidalia/plugin/prototypes/TorControlPrototype.cpp
index 972d100..56bccc0 100644
--- a/src/vidalia/plugin/prototypes/TorControlPrototype.cpp
+++ b/src/vidalia/plugin/prototypes/TorControlPrototype.cpp
@@ -1,5 +1,55 @@
#include "TorControlPrototype.h"
+#define GET_AND_CALL(type, func, res) \
+ type obj = qscriptvalue_cast<type>(thisObject()); \
+ if(obj) \
+ res = obj->func;
+
+#define MERGE2(result, errmsg) \
+ QVariant(QList<QVariant>() << result << errmsg);
+
+#define DEF_TYPE0(type, retType, func, call) \
+retType \
+type##Prototype::func \
+{ \
+ type *obj = qscriptvalue_cast<type *>(thisObject()); \
+ if(obj) \
+ return obj->call; \
+}
+
+#define DEF_TYPE1(type, resType, func, call) \
+QVariant \
+type##Prototype::func \
+{ \
+ resType res; \
+ QString errmsg; \
+\
+ type *obj = qscriptvalue_cast<type *>(thisObject()); \
+ if(obj) \
+ res = obj->call; \
+ QList<QVariant> vals; \
+ vals << res << QVariant(errmsg); \
+\
+ return vals; \
+}
+
+#define DEF_TYPE2(type, resType, ansType, func, call) \
+QVariant \
+type##Prototype::func \
+{ \
+ resType res; \
+ ansType ans; \
+ QString errmsg; \
+\
+ type *obj = qscriptvalue_cast<type *>(thisObject()); \
+ if(obj) \
+ res = obj->call; \
+ QList<QVariant> vals; \
+ vals << QVariant(ans) << res << QVariant(errmsg); \
+\
+ return vals; \
+}
+
TorControlPrototype::TorControlPrototype()
: QObject(), QScriptable() {}
@@ -13,187 +63,120 @@ TorControlPrototype::name() {
return QString("TorControl");
}
+DEF_TYPE0(TorControl, void,
+ start(const QString &tor, const QStringList &args),
+ start(tor, args))
-void
-TorControlPrototype::start(const QString &tor, const QStringList &args)
-{
- TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
-
- if(obj)
- obj->start(tor, args);
-}
-
-bool
-TorControlPrototype::stop(QString *errmsg)
-{
- TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
-
- if(obj)
- return obj->stop(errmsg);
-}
+DEF_TYPE1(TorControl, bool,
+ stop(),
+ stop(&errmsg))
-bool
-TorControlPrototype::isRunning()
-{
- TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+DEF_TYPE0(TorControl, bool,
+ isRunning(),
+ isRunning())
- if(obj)
- return obj->isRunning();
-}
+DEF_TYPE0(TorControl, bool,
+ isVidaliaRunningTor(),
+ isVidaliaRunningTor())
-bool
-TorControlPrototype::isVidaliaRunningTor()
-{
- TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+DEF_TYPE0(TorControl, void,
+ closeTorStdout(),
+ closeTorStdout())
- if(obj)
- return obj->isVidaliaRunningTor();
-}
-
-void
-TorControlPrototype::closeTorStdout()
-{
- TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
-
- if(obj)
- obj->closeTorStdout();
-}
-
-void
-TorControlPrototype::connect(const QHostAddress &address, quint16 port)
-{
- TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
-
- if(obj)
- obj->connect(address, port);
-}
-
-void
-TorControlPrototype::connect(const QString &path)
-{
- TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
-
- if(obj)
- obj->connect(path);
-}
-
-void
-TorControlPrototype::disconnect()
-{
- TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
-
- if(obj)
- obj->disconnect();
-}
+DEF_TYPE0(TorControl, void,
+ connect(const QHostAddress &address, quint16 port),
+ connect(address, port))
-bool
-TorControlPrototype::isConnected()
-{
- TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+DEF_TYPE0(TorControl, void,
+ connect(const QString &path),
+ connect(path))
- if(obj)
- return obj->isConnected();
-}
+DEF_TYPE0(TorControl, void,
+ disconnect(),
+ disconnect())
-bool
-TorControlPrototype::authenticate(const QByteArray cookie, QString *errmsg)
-{
- TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+DEF_TYPE0(TorControl, bool,
+ isConnected(),
+ isConnected())
- if(obj)
- return obj->authenticate(cookie, errmsg);
-}
+DEF_TYPE1(TorControl, bool,
+ authenticate(const QByteArray cookie),
+ authenticate(cookie, &errmsg))
-bool
-TorControlPrototype::authenticate(const QString &password, QString *errmsg)
-{
- TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+DEF_TYPE1(TorControl, bool,
+ authenticate(const QString &password),
+ authenticate(password, &errmsg))
- if(obj)
- return obj->authenticate(password, errmsg);
-}
+// TODO: make a QVariant for this two
+//QVariant
+//TorControlPrototype::protocolInfo()
+//{
+// ProtocolInfo info;
+// QString errmsg;
-ProtocolInfo
-TorControlPrototype::protocolInfo(QString *errmsg)
-{
- TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+// GET_AND_CALL(TorControl *, protocolInfo(&errmsg), info)
- if(obj)
- return obj->protocolInfo(errmsg);
-}
+// return MERGE2(info, errmsg);
+//}
-BootstrapStatus
-TorControlPrototype::bootstrapStatus(QString *errmsg)
-{
- TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+//BootstrapStatus
+//TorControlPrototype::bootstrapStatus(QString *errmsg)
+//{
+// BootstrapStatus status;
+// QString errmsg;
- if(obj)
- return obj->bootstrapStatus(errmsg);
-}
+// GET_AND_CALL(TorControl *, protocolInfo(&errmsg), status)
-bool
-TorControlPrototype::isCircuitEstablished()
-{
- TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+// return MERGE2(status, errmsg);
+//}
- if(obj)
- return obj->isCircuitEstablished();
-}
+DEF_TYPE0(TorControl, bool,
+ isCircuitEstablished(),
+ isCircuitEstablished())
-bool
-TorControlPrototype::getInfo(QHash<QString,QString> &map, QString *errmsg)
-{
- TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+DEF_TYPE1(TorControl, bool,
+ getInfo(QHash<QString,QString> &map),
+ getInfo(map, &errmsg))
- if(obj)
- return obj->getInfo(map, errmsg);
-}
+// TODO: this one may be useless
+//QVariant
+//TorControlPrototype::getInfo(QString key)
+//{
+// TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+// QString val, *errmsg = new QString();
+// bool res = false;
+// QList<QVariant> vals;
-bool
-TorControlPrototype::getInfo(QString key, QString &val, QString *errmsg)
-{
- TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+// if(obj)
+// res = obj->getInfo(key, val, errmsg);
- if(obj)
- return obj->getInfo(key, val, errmsg);
-}
+// vals.append(QVariant(res));
+// vals.append(QVariant(val));
+// vals.append(QVariant(*errmsg));
-QVariantMap
-TorControlPrototype::getInfo(const QStringList &keys, QString *errmsg)
-{
- TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+// return QVariant(vals);
+//}
- if(obj)
- return obj->getInfo(keys, errmsg);
-}
+// TODO: There is no StringList, this may be useless
+//DEF_TYPE1(TorControl, QVariantMap,
+// getInfo(const QStringList &keys),
+// getInfo(keys, &errmsg))
-QVariant
-TorControlPrototype::getInfo(const QString &key, QString *errmsg)
-{
- TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
-
- if(obj)
- return obj->getInfo(key, errmsg);
-}
-
-bool
-TorControlPrototype::signal(TorSignal::Signal sig, QString *errmsg)
-{
- TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
-
- if(obj)
- return obj->signal(sig, errmsg);
-}
-
-QHostAddress
-TorControlPrototype::getSocksAddress(QString *errmsg)
-{
- TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
-
- if(obj)
- return obj->getSocksAddress(errmsg);
-}
+DEF_TYPE1(TorControl, QVariant,
+ getInfo(const QString &key),
+ getInfo(key, &errmsg))
+
+DEF_TYPE1(TorControl, bool,
+ signal(TorSignal::Signal sig),
+ signal(sig, &errmsg))
+
+// TODO: QVariant don't like QHostAddress
+//DEF_TYPE1(TorControl, QHostAddress,
+// getSocksAddress(),
+// getSocksAddress(&errmsg))
+// TODO: make it a QVariant(QList<QVariant>() << QVariant(QString) <<
+// QVariant(QString) ...
QStringList
TorControlPrototype::getSocksAddressList(QString *errmsg)
{
@@ -203,87 +186,53 @@ TorControlPrototype::getSocksAddressList(QString *errmsg)
return obj->getSocksAddressList(errmsg);
}
-quint16
-TorControlPrototype::getSocksPort(QString *errmsg)
-{
- TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
-
- if(obj)
- return obj->getSocksPort(errmsg);
-}
+DEF_TYPE1(TorControl, quint16,
+ getSocksPort(),
+ getSocksPort(&errmsg))
+// TODO: same as getSocksAddressList but with quint16
QList<quint16>
TorControlPrototype::getSocksPortList(QString *errmsg)
{
TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
if(obj)
- return obj->quint16> getSocksPortList(errmsg);
+ return obj->getSocksPortList(errmsg);
}
-QString
-TorControlPrototype::getTorVersionString()
-{
- TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+DEF_TYPE0(TorControl, QString,
+ getTorVersionString(),
+ getTorVersionString())
- if(obj)
- return obj->getTorVersionString();
-}
+DEF_TYPE0(TorControl, quint32,
+ getTorVersion(),
+ getTorVersion())
-quint32
-TorControlPrototype::getTorVersion()
-{
- TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+DEF_TYPE1(TorControl, bool,
+ setEvent(TorEvents::Event e, bool add, bool set),
+ setEvent(e, add, set, &errmsg))
- if(obj)
- return obj->getTorVersion();
-}
+DEF_TYPE1(TorControl, bool,
+ setEvents(),
+ setEvents(&errmsg))
-bool
-TorControlPrototype::setEvent(TorEvents::Event e, bool add, bool set, QString *errmsg)
-{
- TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+DEF_TYPE1(TorControl, bool,
+ setConf(QHash<QString,QString> map),
+ setConf(map, &errmsg))
- if(obj)
- return obj->setEvent(e, add, set, errmsg);
-}
+DEF_TYPE1(TorControl, bool,
+ setConf(QString key, QString value),
+ setConf(key, value, &errmsg))
-bool
-TorControlPrototype::setEvents(QString *errmsg)
-{
- TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
-
- if(obj)
- return obj->setEvents(errmsg);
-}
-
-bool
-TorControlPrototype::setConf(QHash<QString,QString> map, QString *errmsg)
-{
- TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
-
- if(obj)
- return obj->setConf(map, errmsg);
-}
-
-bool
-TorControlPrototype::setConf(QString key, QString value, QString *errmsg)
-{
- TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
-
- if(obj)
- returb obj->setConf(key, value, errmsg);
-}
-
-bool
-TorControlPrototype::setConf(QString keyAndValue, QString *errmsg)
-{
- TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
-
- if(obj)
- return obj->setConf(keyAndValue, errmsg);
-}
+DEF_TYPE1(TorControl, bool,
+ setConf(QString keyAndValue),
+ setConf(keyAndValue, &errmsg))
+// TODO: macros don't like template variables
+// do this one by hand
+//DEF_TYPE2(TorControl, bool, QHash<QString,QString>,
+// getConf(QHash<QString,QString> &map),
+// getConf(map, &errmsg))
bool
TorControlPrototype::getConf(QHash<QString,QString> &map, QString *errmsg)
{
@@ -293,6 +242,7 @@ TorControlPrototype::getConf(QHash<QString,QString> &map, QString *errmsg)
return obj->getConf(map, errmsg);
}
+// TODO: this one too
bool
TorControlPrototype::getConf(QHash<QString,QStringList> &map, QString *errmsg)
{
@@ -302,15 +252,11 @@ TorControlPrototype::getConf(QHash<QString,QStringList> &map, QString *errmsg)
return obj->getConf(map, errmsg);
}
-bool
-TorControlPrototype::getConf(QString key, QString &value, QString *errmsg)
-{
- TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
-
- if(obj)
- return obj->getConf(key, value, errmsg);
-}
+DEF_TYPE2(TorControl, bool, QString,
+ getConf(QString key),
+ getConf(key, ans, &errmsg))
+// TODO: same as the last one with StringList
bool
TorControlPrototype::getConf(QString key, QStringList &value, QString *errmsg)
{
@@ -320,6 +266,7 @@ TorControlPrototype::getConf(QString key, QStringList &value, QString *errmsg)
return obj->getConf(key, value, errmsg);
}
+// TODO: idem
QVariantMap
TorControlPrototype::getConf(const QStringList &keys, QString *errmsg)
{
@@ -329,33 +276,25 @@ TorControlPrototype::getConf(const QStringList &keys, QString *errmsg)
return obj->getConf(keys, errmsg);
}
-QVariant
-TorControlPrototype::getConf(const QString &key, QString *errmsg)
-{
- TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
-
- if(obj)
- return obj->getConf(key, errmsg);
-}
-
-QString
-TorControlPrototype::getHiddenServiceConf(const QString &key, QString *errmsg)
-{
- TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+// TODO: possibly useless
+//QVariant
+//TorControlPrototype::getConf(const QString &key, QString *errmsg)
+//{
+// TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
- if(obj)
- return obj->getHiddenServiceConf(key, errmsg);
-}
+// if(obj)
+// return obj->getConf(key, errmsg);
+//}
-bool
-TorControlPrototype::saveConf(QString *errmsg)
-{
- TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+DEF_TYPE1(TorControl, QString,
+ getHiddenServiceConf(const QString &key),
+ getHiddenServiceConf(key, &errmsg))
- if(obj)
- return obj->saveConf(errmsg);
-}
+DEF_TYPE1(TorControl, bool,
+ saveConf(),
+ saveConf(&errmsg))
+// TODO: another stringlist one
bool
TorControlPrototype::resetConf(QStringList keys, QString *errmsg)
{
@@ -365,15 +304,11 @@ TorControlPrototype::resetConf(QStringList keys, QString *errmsg)
return obj->resetConf(keys, errmsg);
}
-bool
-TorControlPrototype::resetConf(QString key, QString *errmsg)
-{
- TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
-
- if(obj)
- return obj->resetConf(key, errmsg);
-}
+DEF_TYPE1(TorControl, bool,
+ resetConf(QString key),
+ resetConf(key, &errmsg))
+// TODO: you know
QStringList
TorControlPrototype::getRouterDescriptorText(const QString &id, QString *errmsg)
{
@@ -383,6 +318,7 @@ TorControlPrototype::getRouterDescriptorText(const QString &id, QString *errmsg)
return obj->getRouterDescriptorText(id, errmsg);
}
+// TODO: QVariantize RouterDescriptor
RouterDescriptor
TorControlPrototype::getRouterDescriptor(const QString &id, QString *errmsg)
{
@@ -392,6 +328,7 @@ TorControlPrototype::getRouterDescriptor(const QString &id, QString *errmsg)
return obj->getRouterDescriptor(id, errmsg);
}
+// TODO: QVariantize RouterStatus
RouterStatus
TorControlPrototype::getRouterStatus(const QString &id, QString *errmsg)
{
@@ -401,6 +338,7 @@ TorControlPrototype::getRouterStatus(const QString &id, QString *errmsg)
return obj->getRouterStatus(id, errmsg);
}
+// TODO: QVariantize NetworkStatus
NetworkStatus
TorControlPrototype::getNetworkStatus(QString *errmsg)
{
@@ -410,6 +348,7 @@ TorControlPrototype::getNetworkStatus(QString *errmsg)
return obj->getNetworkStatus(errmsg);
}
+// TODO: QVariantize DescriptorAnnotations
DescriptorAnnotations
TorControlPrototype::getDescriptorAnnotations(const QString &id, QString *errmsg)
{
@@ -419,6 +358,7 @@ TorControlPrototype::getDescriptorAnnotations(const QString &id, QString *errmsg
return obj->getDescriptorAnnotations(id, errmsg);
}
+// TODO: QVariantize CircuitList
CircuitList
TorControlPrototype::getCircuits(QString *errmsg)
{
@@ -428,6 +368,7 @@ TorControlPrototype::getCircuits(QString *errmsg)
return obj->getCircuits(errmsg);
}
+// TODO: QVariantize StreamList
StreamList
TorControlPrototype::getStreams(QString *errmsg)
{
@@ -437,6 +378,7 @@ TorControlPrototype::getStreams(QString *errmsg)
return obj->getStreams(errmsg);
}
+// TODO: QVariantize AddressMap
AddressMap
TorControlPrototype::getAddressMap(AddressMap::AddressMapType type, QString *errmsg)
{
@@ -446,15 +388,11 @@ TorControlPrototype::getAddressMap(AddressMap::AddressMapType type, QString *err
return obj->getAddressMap(type, errmsg);
}
-QString
-TorControlPrototype::ipToCountry(const QHostAddress &ip, QString *errmsg)
-{
- TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
-
- if(obj)
- return obj->ipToCountry(ip, errmsg);
-}
+DEF_TYPE1(TorControl, QString,
+ ipToCountry(const QHostAddress &ip),
+ ipToCountry(ip, &errmsg))
+// TODO: migrate CircuitId
bool
TorControlPrototype::closeCircuit(const CircuitId &circId, bool ifUnused, QString *errmsg)
{
@@ -464,6 +402,7 @@ TorControlPrototype::closeCircuit(const CircuitId &circId, bool ifUnused, QStrin
return obj->closeCircuit(circId, ifUnused, errmsg);
}
+// TODO: migrate StreamId
bool
TorControlPrototype::closeStream(const StreamId &streamId, QString *errmsg)
{
diff --git a/src/vidalia/plugin/prototypes/TorControlPrototype.h b/src/vidalia/plugin/prototypes/TorControlPrototype.h
index 196a378..8127c76 100644
--- a/src/vidalia/plugin/prototypes/TorControlPrototype.h
+++ b/src/vidalia/plugin/prototypes/TorControlPrototype.h
@@ -35,7 +35,7 @@ public:
/** Start the Tor process */
Q_INVOKABLE void start(const QString &tor, const QStringList &args);
/** Stop the Tor process */
- Q_INVOKABLE bool stop(QString *errmsg = 0);
+ Q_INVOKABLE QVariant stop();
/** Detect if the Tor process is running */
Q_INVOKABLE bool isRunning();
/** Detects if the Tor process is running under Vidalia. */
@@ -52,46 +52,46 @@ public:
/** Check if we're connected to Tor's control socket */
Q_INVOKABLE bool isConnected();
/** Sends an authentication cookie to Tor. */
- Q_INVOKABLE bool authenticate(const QByteArray cookie, QString *errmsg = 0);
+ Q_INVOKABLE QVariant authenticate(const QByteArray cookie);
/** Sends an authentication password to Tor. */
- Q_INVOKABLE bool authenticate(const QString &password = QString(), QString *errmsg = 0);
+ Q_INVOKABLE QVariant authenticate(const QString &password = QString());
/** Sends a PROTOCOLINFO command to Tor and parses the response. */
- Q_INVOKABLE ProtocolInfo protocolInfo(QString *errmsg = 0);
+// Q_INVOKABLE QVariant protocolInfo();
/** Returns the Tor software's current bootstrap phase and status. */
- Q_INVOKABLE BootstrapStatus bootstrapStatus(QString *errmsg = 0);
+// Q_INVOKABLE BootstrapStatus bootstrapStatus(QString *errmsg = 0);
/** Returns true if Tor either has an open circuit or (on Tor >=
* 0.2.0.1-alpha) has previously decided it's able to establish a circuit. */
Q_INVOKABLE bool isCircuitEstablished();
/** Sends a GETINFO message to Tor based on the given keys */
- Q_INVOKABLE bool getInfo(QHash<QString,QString> &map, QString *errmsg = 0);
+ Q_INVOKABLE QVariant getInfo(QHash<QString,QString> &map);
/** Sends a GETINFO message for a single info value to Tor */
- Q_INVOKABLE bool getInfo(QString key, QString &val, QString *errmsg = 0);
+// Q_INVOKABLE QVariant getInfo(QString key);
/** Sends a GETINFO message to Tor using the given list of <b>keys</b> and
* returns a QVariantMap containing the specified keys and their values as
* returned by Tor. Returns a default constructed QVariantMap on failure. */
- Q_INVOKABLE QVariantMap getInfo(const QStringList &keys, QString *errmsg = 0);
+// Q_INVOKABLE QVariantMap getInfo(const QStringList &keys, QString *errmsg = 0);
/** Sends a GETINFO message to Tor with a single <b>key</b> and returns a
* QVariant containing the value returned by Tor. Returns a default
* constructed QVariant on failure. */
- Q_INVOKABLE QVariant getInfo(const QString &key, QString *errmsg = 0);
+ Q_INVOKABLE QVariant getInfo(const QString &key);
/** Sends a signal to Tor */
- Q_INVOKABLE bool signal(TorSignal::Signal sig, QString *errmsg = 0);
+ Q_INVOKABLE QVariant signal(TorSignal::Signal sig);
/** Returns an address on which Tor is listening for application
* requests. If none are available, a null QHostAddress is returned. */
- Q_INVOKABLE QHostAddress getSocksAddress(QString *errmsg = 0);
+// Q_INVOKABLE QVariant getSocksAddress();
/** Returns a (possibly empty) list of all currently configured
* SocksListenAddress entries. */
Q_INVOKABLE QStringList getSocksAddressList(QString *errmsg = 0);
/** Returns a valid SOCKS port for Tor, or 0 if Tor is not accepting
* application requests. */
- Q_INVOKABLE quint16 getSocksPort(QString *errmsg = 0);
+ Q_INVOKABLE QVariant getSocksPort();
/** Returns a list of all currently configured SOCKS ports. If Tor is not
* accepting any application connections, an empty list will be returned. */
Q_INVOKABLE QList<quint16> getSocksPortList(QString *errmsg = 0);
@@ -104,24 +104,23 @@ public:
/** Sets an event and its handler. If add is true, then the event is added,
* otherwise it is removed. If set is true, then the given event will be
* registered with Tor. */
- Q_INVOKABLE bool setEvent(TorEvents::Event e, bool add = true, bool set = true,
- QString *errmsg = 0);
+ Q_INVOKABLE QVariant setEvent(TorEvents::Event e, bool add = true, bool set = true);
/** Register events of interest with Tor */
- Q_INVOKABLE bool setEvents(QString *errmsg = 0);
+ Q_INVOKABLE QVariant setEvents();
/** Sets each configuration key in <b>map</b> to the value associated with its key. */
- Q_INVOKABLE bool setConf(QHash<QString,QString> map, QString *errmsg = 0);
+ Q_INVOKABLE QVariant setConf(QHash<QString,QString> map);
/** Sets a single configuration key to the given value. */
- Q_INVOKABLE bool setConf(QString key, QString value, QString *errmsg = 0);
+ Q_INVOKABLE QVariant setConf(QString key, QString value);
/** Sets a single configuration string that is formatted <key=escaped value>. */
- Q_INVOKABLE bool setConf(QString keyAndValue, QString *errmsg = 0);
+ Q_INVOKABLE QVariant setConf(QString keyAndValue);
/** Gets values for a set of configuration keys, each of which has a single
* value. */
- Q_INVOKABLE bool getConf(QHash<QString,QString> &map, QString *errmsg = 0);
+ Q_INVOKABLE bool getConf(QHash<QString,QString> &map, QString *errmsg);
/** Gets a set of configuration keyvalues and stores them in <b>map</b>. */
Q_INVOKABLE bool getConf(QHash<QString,QStringList> &map, QString *errmsg = 0);
/** Gets a single configuration value for <b>key</b>. */
- Q_INVOKABLE bool getConf(QString key, QString &value, QString *errmsg = 0);
+ Q_INVOKABLE QVariant getConf(QString key);
/** Gets a list of configuration values for <b>key</b>. */
Q_INVOKABLE bool getConf(QString key, QStringList &value, QString *errmsg = 0);
@@ -132,17 +131,17 @@ public:
/** Sends a GETCONF message to Tor with a single <b>key</b> and returns a
* QVariant containing the value returned by Tor. Returns a default
* constructed QVariant on failure. */
- Q_INVOKABLE QVariant getConf(const QString &key, QString *errmsg = 0);
+// Q_INVOKABLE QVariant getConf(const QString &key, QString *errmsg = 0);
/** Sends a GETCONF message to Tor with the single key and returns a QString
* containing the value returned by Tor */
- Q_INVOKABLE QString getHiddenServiceConf(const QString &key, QString *errmsg = 0);
+ Q_INVOKABLE QVariant getHiddenServiceConf(const QString &key);
/** Asks Tor to save the current configuration to its torrc */
- Q_INVOKABLE bool saveConf(QString *errmsg = 0);
+ Q_INVOKABLE QVariant saveConf();
/** Tells Tor to reset the given configuration keys back to defaults. */
Q_INVOKABLE bool resetConf(QStringList keys, QString *errmsg = 0);
/** Tells Tor to reset a configuration key back to its default value. */
- Q_INVOKABLE bool resetConf(QString key, QString *errmsg = 0);
+ Q_INVOKABLE QVariant resetConf(QString key);
/** Returns an unparsed router descriptor for the router whose fingerprint
* matches <b>id</b>. The returned text can later be parsed by the
@@ -183,7 +182,7 @@ public:
* Returns a default-constructed QString on failure or if a country code
* is not known for <b>ip</b>. On failure, <b>errmsg</b> will be set if
* it's not NULL. */
- Q_INVOKABLE QString ipToCountry(const QHostAddress &ip, QString *errmsg = 0);
+ Q_INVOKABLE QVariant ipToCountry(const QHostAddress &ip);
public slots:
/** Closes the circuit specified by <b>circId</b>. If <b>ifUnused</b> is
1
0
commit d6416b36e8378de1e59ad7532f9d44e8a9539364
Author: Tomas Touceda <chiiph(a)torproject.org>
Date: Sun Jun 26 19:17:08 2011 -0300
Improve engine and clean some code
Removes all TBB related code, since it's now in a plugin.
Adds minor improvements to the engine, and the possibility of having a real
debugger.
---
src/vidalia/MainWindow.cpp | 241 --------------------
src/vidalia/MainWindow.h | 29 ---
src/vidalia/plugin/PluginEngine.cpp | 26 ++
src/vidalia/plugin/PluginEngine.h | 4 +
.../plugin/prototypes/HelperProcessPrototype.cpp | 14 ++
.../plugin/prototypes/HelperProcessPrototype.h | 2 +
6 files changed, 46 insertions(+), 270 deletions(-)
diff --git a/src/vidalia/MainWindow.cpp b/src/vidalia/MainWindow.cpp
index bcc3538..56b24c7 100644
--- a/src/vidalia/MainWindow.cpp
+++ b/src/vidalia/MainWindow.cpp
@@ -401,24 +401,6 @@ MainWindow::createConnections()
connect(UPNPControl::instance(), SIGNAL(error(UPNPControl::UPNPError)),
this, SLOT(upnpError(UPNPControl::UPNPError)));
#endif
- /* Create a new HelperProcess object, used to start the web browser */
- _browserProcess = new HelperProcess(this);
- connect(_browserProcess, SIGNAL(finished(int, QProcess::ExitStatus)),
- this, SLOT(onSubprocessFinished(int, QProcess::ExitStatus)));
- connect(_browserProcess, SIGNAL(startFailed(QString)),
- this, SLOT(onBrowserFailed(QString)));
-
- /* Create a new HelperProcess object, used to start the IM client */
- _imProcess = new HelperProcess(this);
- connect(_imProcess, SIGNAL(finished(int, QProcess::ExitStatus)),
- this, SLOT(onSubprocessFinished(int, QProcess::ExitStatus)));
- connect(_imProcess, SIGNAL(startFailed(QString)),
- this, SLOT(onIMFailed(QString)));
-
- /* Create a new HelperProcess object, used to start the proxy server */
- _proxyProcess = new HelperProcess(this);
- connect(_proxyProcess, SIGNAL(startFailed(QString)),
- this, SLOT(onProxyFailed(QString)));
connect(_engine, SIGNAL(pluginTab(VidaliaTab *)),
this, SLOT(addTab(VidaliaTab *)));
@@ -470,10 +452,6 @@ MainWindow::running()
start();
}
- /* Start the proxy server, if configured */
- if (settings.runProxyAtStart())
- startProxy();
-
#if defined(USE_AUTOUPDATE)
if (settings.isAutoUpdateEnabled()) {
QDateTime lastCheckedAt = settings.lastCheckedForUpdates();
@@ -519,33 +497,6 @@ MainWindow::aboutToQuit()
ServerSettings settings(_torControl);
settings.cleanupPortForwarding();
- if (_proxyProcess->state() != QProcess::NotRunning) {
- /* Close the proxy server (Polipo ignores the WM_CLOSE event sent by
- * terminate() so we have to kill() it) */
- _proxyProcess->kill();
- }
-
- /* Kill the browser and IM client if using the new launcher */
- VidaliaSettings vidalia_settings;
-
- if (! vidalia_settings.getBrowserDirectory().isEmpty()) {
- /* Disconnect the finished signals so that we won't try to exit Vidalia again */
- QObject::disconnect(_browserProcess, SIGNAL(finished(int, QProcess::ExitStatus)), 0, 0);
- QObject::disconnect(_imProcess, SIGNAL(finished(int, QProcess::ExitStatus)), 0, 0);
-
- /* Use QProcess terminate function */
- if (_browserProcess->state() == QProcess::Running)
- _browserProcess->terminate();
-
-#if defined(Q_OS_WIN)
- /* Kill any processes which might have been forked off */
- win32_end_process_by_filename(vidalia_settings.getBrowserExecutable());
-#endif
-
- if (_imProcess->state() == QProcess::Running)
- _imProcess->terminate();
- }
-
/* Disconnect all of the TorControl object's signals */
QObject::disconnect(_torControl, 0, 0, 0);
}
@@ -1061,7 +1012,6 @@ MainWindow::circuitEstablished()
// TODO: fix hardcoded total length
setStartupProgress(130,
tr("Connected to the Tor network!"));
- startSubprocesses();
#if defined(USE_AUTOUPDATE)
VidaliaSettings settings;
@@ -1346,7 +1296,6 @@ MainWindow::updateTorStatus(TorStatus status)
trayIconFile = IMG_TOR_STOPPING;
statusIconFile = IMG_TOR_STOPPING_48;
-// ui.btnStartStopTor->setStatusTip(tr("Stop Tor Now"));
} else if (status == Started) {
actionText = tr("Stop Tor");
_actionRestartTor->setEnabled(true);
@@ -1512,7 +1461,6 @@ MainWindow::newIdentity()
/* Disable the New Identity button for MIN_NEWIDENTITY_INTERVAL */
_actionNewIdentity->setEnabled(false);
-// ui.lblNewIdentity->setEnabled(false);
QTimer::singleShot(MIN_NEWIDENTITY_INTERVAL,
this, SLOT(enableNewIdentity()));
@@ -1817,192 +1765,3 @@ MainWindow::installUpdatesFailed(const QString &errmsg)
#endif
-/** Called when browser or IM client have exited */
-void
-MainWindow::onSubprocessFinished(int exitCode, QProcess::ExitStatus exitStatus)
-{
- Q_UNUSED(exitCode)
- Q_UNUSED(exitStatus)
-
- /* Get path to browser and IM client */
- VidaliaSettings settings;
- QString browserExecutable = settings.getBrowserExecutable();
- QString browserDirectory = settings.getBrowserDirectory();
- QString imExecutable = settings.getIMExecutable();
-
- /* A subprocess is finished if it successfully exited or was never asked to start */
- bool browserDone = (browserExecutable.isEmpty()
- && browserDirectory.isEmpty())
- || _browserProcess->isDone();
- bool imDone = imExecutable.isEmpty() || _imProcess->isDone();
-
- /* Exit if both subprocesses are finished */
- if (browserDone && imDone) {
- if (browserDirectory.isEmpty()) {
- /* We are using the standard launcher, exit immediately */
- vApp->quit();
- } else {
- /* We are using the alternate launcher, wait until the browser has really died */
- QTimer *browserWatcher = new QTimer(this);
- connect(browserWatcher, SIGNAL(timeout()), this, SLOT(onCheckForBrowser()));
- browserWatcher->start(2000);
- }
- }
-}
-
-/** Called periodically to check if the browser is running. If it is not,
- * exit Vidalia cleanly */
-void
-MainWindow::onCheckForBrowser()
-{
-/* This only works on Windows for now */
-#if defined(Q_OS_WIN)
-
- VidaliaSettings settings;
- QString browserDirectoryFilename = settings.getBrowserExecutable();
-
- /* Get list of running processes */
- QHash<qint64, QString> procList = win32_process_list();
-
- /* On old versions of Windows win32_process_list() will return
- an empty list. In this case, just keep Vidalia open */
- if (procList.isEmpty()) {
- return;
- }
-
- /* Loop over all processes or until we find <browserDirectoryFilename> */
- QHashIterator<qint64, QString> i(procList);
- while (i.hasNext()) {
- i.next();
- if (i.value().toLower() == browserDirectoryFilename) {
- /* The browser is still running, so Vidalia should keep running too */
- return;
- }
- }
-
- /* The browser isn't running, exit Vidalia */
- vApp->quit();
-#endif
-}
-
-/** Called when the web browser failed to start, for example, because the path
- * specified to the web browser executable didn't lead to an executable. */
-void
-MainWindow::onBrowserFailed(QString errmsg)
-{
- Q_UNUSED(errmsg);
-
- /* Display an error message and see if the user wants some help */
- VMessageBox::warning(this, tr("Error starting web browser"),
- tr("Vidalia was unable to start the configured web browser"),
- VMessageBox::Ok|VMessageBox::Default|VMessageBox::Escape);
-}
-
-/** Called when the IM client failed to start, for example, because the path
- * specified to the IM client executable didn't lead to an executable. */
-void
-MainWindow::onIMFailed(QString errmsg)
-{
- Q_UNUSED(errmsg);
-
- /* Display an error message and see if the user wants some help */
- VMessageBox::warning(this, tr("Error starting IM client"),
- tr("Vidalia was unable to start the configured IM client"),
- VMessageBox::Ok|VMessageBox::Default|VMessageBox::Escape);
-}
-
-/** Starts the proxy server, if appropriately configured */
-void
-MainWindow::startProxy()
-{
- VidaliaSettings settings;
- QString executable = settings.getProxyExecutable();
- _proxyProcess->start(executable, settings.getProxyExecutableArguments());
-}
-
-/** Called when the proxy server fails to start, for example, because
- * the path specified didn't lead to an executable. */
-void
-MainWindow::onProxyFailed(QString errmsg)
-{
- Q_UNUSED(errmsg);
-
- /* Display an error message and see if the user wants some help */
- VMessageBox::warning(this, tr("Error starting proxy server"),
- tr("Vidalia was unable to start the configured proxy server"),
- VMessageBox::Ok|VMessageBox::Default|VMessageBox::Escape);
-}
-
-/** Start a web browser when given the directory containing the executable and profile */
-void
-MainWindow::launchBrowserFromDirectory()
-{
- VidaliaSettings settings;
-
- QString browserDirectory = settings.getBrowserDirectory();
- QString browserDirectoryFilename = settings.getBrowserExecutable();
-
- /* Set TZ=UTC (to stop leaking timezone information) and
- * MOZ_NO_REMOTE=1 (to allow multiple instances of Firefox */
- QStringList env = QProcess::systemEnvironment();
- env << "TZ=UTC";
- env << "MOZ_NO_REMOTE=1";
- _browserProcess->setEnvironment(env);
-
- /* The browser is in <browserDirectory>/App/Firefox/<browserDirectoryFilename> */
- QString browserExecutable =
- QDir::toNativeSeparators(browserDirectory + "/App/Firefox/" + browserDirectoryFilename);
- /* The profile is in <browserDirectory>/Data/profile */
- QString profileDir =
- QDir::toNativeSeparators(browserDirectory + "/Data/profile");
-
- /* Copy the profile directory if it's not already there */
- QDir browserDirObj = QDir(browserDirectory);
-
- /* Copy the profile directory if it's not already there */
- if (!browserDirObj.exists("Data/profile")) {
- browserDirObj.mkdir("Data/profile");
- copy_dir(browserDirectory + "/App/DefaultData/profile", browserDirectory + "/Data/profile");
- }
-
- /* Copy the plugins directory if it's not already there */
- if (!browserDirObj.exists("Data/plugins")) {
- browserDirObj.mkdir("Data/plugins");
- copy_dir(browserDirectory + "/App/DefaultData/plugins", browserDirectory + "/Data/plugins");
- }
-
- /* Build the command line arguments */
- QStringList commandLine;
- // Is this better or worse than MOZ_NO_REMOTE?
- commandLine << "-no-remote";
- commandLine << "-profile";
- commandLine << profileDir;
-
- /* Launch the browser */
- _browserProcess->start(browserExecutable, commandLine);
-}
-
-/** Starts the web browser and IM client, if appropriately configured */
-void
-MainWindow::startSubprocesses()
-{
- VidaliaSettings settings;
- QString subprocess;
-
- /* Launch the web browser */
- if (!(subprocess = settings.getBrowserDirectory()).isEmpty()) {
- /* The user has set BrowserDirectory; use this */
- launchBrowserFromDirectory();
- } else if (!(subprocess = settings.getBrowserExecutable()).isEmpty()) {
- /* BrowserDirectory is not set, but BrowserExecutable is; use this */
- _browserProcess->setEnvironment(QProcess::systemEnvironment() << "TZ=UTC");
- _browserProcess->start(subprocess, QStringList());
- }
-
- /* Launch the IM client */
- subprocess = settings.getIMExecutable();
-
- if (!subprocess.isEmpty())
- _imProcess->start(subprocess, QStringList());
-}
-
diff --git a/src/vidalia/MainWindow.h b/src/vidalia/MainWindow.h
index 21ab1a2..3b7d544 100644
--- a/src/vidalia/MainWindow.h
+++ b/src/vidalia/MainWindow.h
@@ -147,21 +147,6 @@ private slots:
/** Deletes the tab at index if it exists and it isn't the Status tab */
void delTab(int index = -1);
-// /** Handles adding a new tab corresponding to a plugin */
-// void showPluginTab();
-
- /** Called when the web browser or IM client have stopped */
- void onSubprocessFinished(int exitCode, QProcess::ExitStatus exitStatus);
- /** Called periodically to check if the browser is running. If it is not,
- * exit Vidalia cleanly */
- void onCheckForBrowser();
- /** Called web the web browser failed to start */
- void onBrowserFailed(QString errmsg);
- /** Called web the IM client failed to start */
- void onIMFailed(QString errmsg);
- /** Called when the proxy server fails to start */
- void onProxyFailed(QString errmsg);
-
#if defined(USE_AUTOUPDATE)
/** Called when the user clicks the 'Check Now' button in the General
* settings page. */
@@ -264,20 +249,6 @@ private:
/** The Vidalia icon that sits in the tray. */
QSystemTrayIcon _trayIcon;
- /** Start a web browser when given the directory containing the executable and profile */
- void launchBrowserFromDirectory();
- /** Starts the web browser, if appropriately configured */
- void startSubprocesses();
- /** Starts the proxy server, if appropriately configured */
- void startProxy();
-
- /** A HelperProcess object that manages the web browser */
- HelperProcess* _browserProcess;
- /** A HelperProcess object that manages the IM client */
- HelperProcess* _imProcess;
- /** A HelperProcess object that manages the proxy server */
- HelperProcess* _proxyProcess;
-
#if defined(USE_AUTOUPDATE)
/** Timer used to remind us to check for software updates. */
QTimer _updateTimer;
diff --git a/src/vidalia/plugin/PluginEngine.cpp b/src/vidalia/plugin/PluginEngine.cpp
index 4d6d745..f51607e 100644
--- a/src/vidalia/plugin/PluginEngine.cpp
+++ b/src/vidalia/plugin/PluginEngine.cpp
@@ -15,10 +15,12 @@ PluginEngine::PluginEngine(QObject *parent)
ADD_PROTOTYPE(TorControlPrototype)
globalObject().setProperty("torControl", newQObject(Vidalia::torControl()));
+ globalObject().setProperty("vidaliaApp", newQObject(vApp));
globalObject().setProperty("include", newFunction(includeScript));
globalObject().setProperty("importExtension", newFunction(importExtension));
globalObject().setProperty("vdebug", newFunction(vdebug));
+ globalObject().setProperty("findWidget", newFunction(findWidget));
VidaliaSettings settings;
globalObject().setProperty("pluginPath", QScriptValue(settings.pluginPath()));
@@ -28,6 +30,9 @@ PluginEngine::PluginEngine(QObject *parent)
DebugDialog::outputDebug(QString(" %1").arg(ext));
loadAllPlugins();
+
+// debugger.attachTo(this);
+// debugger.standardWindow()->show();
}
PluginEngine::~PluginEngine()
@@ -183,3 +188,24 @@ PluginEngine::vdebug(QScriptContext *context, QScriptEngine *engine)
return engine->undefinedValue();
}
+
+QScriptValue
+PluginEngine::findWidget(QScriptContext *context, QScriptEngine *engine) {
+ if(context->argumentCount() != 2)
+ return context->throwError(QString("findWidget called with the wrong argument count. Expected 2."));
+
+ QWidget *widget = qscriptvalue_cast<QWidget *>(context->argument(0));
+ QString name = context->argument(1).toString();
+
+ QObjectList list = widget->children();
+ QScriptValue ret = engine->nullValue();
+
+ for(int i = 0; i < list.length(); i++) {
+ if(list[i]->objectName() == name) {
+ ret = QScriptValue(i);
+ break;
+ }
+ }
+
+ return ret;
+}
diff --git a/src/vidalia/plugin/PluginEngine.h b/src/vidalia/plugin/PluginEngine.h
index 13890f6..854ed15 100644
--- a/src/vidalia/plugin/PluginEngine.h
+++ b/src/vidalia/plugin/PluginEngine.h
@@ -3,6 +3,7 @@
#include <QtGui>
#include <QtScript>
+#include <QScriptEngineDebugger>
#include "VidaliaTabPrototype.h"
#include "HelperProcessPrototype.h"
@@ -34,11 +35,14 @@ class PluginEngine : public QScriptEngine {
static bool loadFile(QString fileName, QScriptEngine *engine);
static QScriptValue includeScript(QScriptContext *context, QScriptEngine *engine);
static QScriptValue vdebug(QScriptContext *context, QScriptEngine *engine);
+ static QScriptValue findWidget(QScriptContext *context, QScriptEngine *engine);
void loadAllPlugins();
void tryLoadPlugin(QDir path);
QList<PluginWrapper *> wrappers;
+
+ QScriptEngineDebugger debugger;
};
#endif
diff --git a/src/vidalia/plugin/prototypes/HelperProcessPrototype.cpp b/src/vidalia/plugin/prototypes/HelperProcessPrototype.cpp
index 81d4d94..c2232e1 100644
--- a/src/vidalia/plugin/prototypes/HelperProcessPrototype.cpp
+++ b/src/vidalia/plugin/prototypes/HelperProcessPrototype.cpp
@@ -47,3 +47,17 @@ HelperProcessPrototype::isDone() const
return obj->isDone();
}
+QStringList
+HelperProcessPrototype::systemEnvironment()
+{
+ return HelperProcess::systemEnvironment();
+}
+
+void
+HelperProcessPrototype::setEnvironment(const QStringList &env)
+{
+ HelperProcess *obj = qscriptvalue_cast<HelperProcess *>(thisObject());
+
+ if(obj)
+ obj->setEnvironment(env);
+}
diff --git a/src/vidalia/plugin/prototypes/HelperProcessPrototype.h b/src/vidalia/plugin/prototypes/HelperProcessPrototype.h
index b64a27c..1751347 100644
--- a/src/vidalia/plugin/prototypes/HelperProcessPrototype.h
+++ b/src/vidalia/plugin/prototypes/HelperProcessPrototype.h
@@ -19,6 +19,8 @@ class HelperProcessPrototype : public QObject, public QScriptable
Q_INVOKABLE void start(const QString &app, const QString &args);
Q_INVOKABLE void start(const QString &app, const QStringList &args);
Q_INVOKABLE bool isDone() const;
+ Q_INVOKABLE QStringList systemEnvironment();
+ Q_INVOKABLE void setEnvironment(const QStringList &env);
};
Q_DECLARE_METATYPE(HelperProcess *);
1
0
commit 1ac1c1746a3fe63bb9ba32f2ed1c1e13b12cda02
Author: Tomas Touceda <chiiph(a)torproject.org>
Date: Sat Jul 2 18:46:57 2011 -0300
Remove debugger for now
---
src/vidalia/plugin/PluginEngine.h | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/src/vidalia/plugin/PluginEngine.h b/src/vidalia/plugin/PluginEngine.h
index d8dc273..2251e6c 100644
--- a/src/vidalia/plugin/PluginEngine.h
+++ b/src/vidalia/plugin/PluginEngine.h
@@ -57,7 +57,7 @@ class PluginEngine : public QScriptEngine {
QList<PluginWrapper *> wrappers;
- QScriptEngineDebugger debugger;
+// QScriptEngineDebugger debugger;
};
#endif
1
0
[vidalia/alpha] Add headers and temporary disable the include function
by chiiph@torproject.org 02 Jul '11
by chiiph@torproject.org 02 Jul '11
02 Jul '11
commit bad8cdb7ad327116311daca0c102c747aa0de568
Author: Tomas Touceda <chiiph(a)torproject.org>
Date: Sat Jul 2 18:12:16 2011 -0300
Add headers and temporary disable the include function
The include function won't be on the 0.3.1 release, it doesn't work as of
today, so I'm disabling it.
---
src/vidalia/plugin/DebugDialog.cpp | 16 +++
src/vidalia/plugin/DebugDialog.h | 16 +++
src/vidalia/plugin/PluginEngine.cpp | 142 +++++++++----------
src/vidalia/plugin/PluginEngine.h | 19 +++-
src/vidalia/plugin/PluginWrapper.cpp | 15 ++
src/vidalia/plugin/PluginWrapper.h | 15 ++
.../plugin/prototypes/HelperProcessPrototype.cpp | 21 +++-
.../plugin/prototypes/TorControlPrototype.cpp | 15 ++
.../plugin/prototypes/TorControlPrototype.h | 10 +-
.../plugin/prototypes/VidaliaTabPrototype.cpp | 21 +++-
.../plugin/prototypes/VidaliaTabPrototype.h | 15 ++
11 files changed, 219 insertions(+), 86 deletions(-)
diff --git a/src/vidalia/plugin/DebugDialog.cpp b/src/vidalia/plugin/DebugDialog.cpp
index df2aa1e..683ed6a 100644
--- a/src/vidalia/plugin/DebugDialog.cpp
+++ b/src/vidalia/plugin/DebugDialog.cpp
@@ -1,3 +1,19 @@
+/*
+** This file is part of Vidalia, and is subject to the license terms in the
+** LICENSE file, found in the top level directory of this distribution. If you
+** did not receive the LICENSE file with this file, you may obtain it from the
+** Vidalia source package distributed by the Vidalia Project at
+** http://www.torproject.org/projects/vidalia.html. No part of Vidalia,
+** including this file, may be copied, modified, propagated, or distributed
+** except according to the terms described in the LICENSE file.
+*/
+
+/*
+** \file DebugDialog.cpp
+** \brief Simple dialog to see exceptions, syntaxis problems, and general
+** output for pluging
+*/
+
#include "DebugDialog.h"
QStringList DebugDialog::outputBuffer;
diff --git a/src/vidalia/plugin/DebugDialog.h b/src/vidalia/plugin/DebugDialog.h
index 76b3bb6..7f6ff0a 100644
--- a/src/vidalia/plugin/DebugDialog.h
+++ b/src/vidalia/plugin/DebugDialog.h
@@ -1,3 +1,19 @@
+/*
+** This file is part of Vidalia, and is subject to the license terms in the
+** LICENSE file, found in the top level directory of this distribution. If you
+** did not receive the LICENSE file with this file, you may obtain it from the
+** Vidalia source package distributed by the Vidalia Project at
+** http://www.torproject.org/projects/vidalia.html. No part of Vidalia,
+** including this file, may be copied, modified, propagated, or distributed
+** except according to the terms described in the LICENSE file.
+*/
+
+/*
+** \file DebugDialog.h
+** \brief Simple dialog to see exceptions, syntaxis problems, and general
+** output for pluging
+*/
+
#ifndef DEBUGDIALOG_H
#define DEBUGDIALOG_H
diff --git a/src/vidalia/plugin/PluginEngine.cpp b/src/vidalia/plugin/PluginEngine.cpp
index f51607e..41f9712 100644
--- a/src/vidalia/plugin/PluginEngine.cpp
+++ b/src/vidalia/plugin/PluginEngine.cpp
@@ -1,3 +1,18 @@
+/*
+** This file is part of Vidalia, and is subject to the license terms in the
+** LICENSE file, found in the top level directory of this distribution. If you
+** did not receive the LICENSE file with this file, you may obtain it from the
+** Vidalia source package distributed by the Vidalia Project at
+** http://www.torproject.org/projects/vidalia.html. No part of Vidalia,
+** including this file, may be copied, modified, propagated, or distributed
+** except according to the terms described in the LICENSE file.
+*/
+
+/*
+** \file PluginEngine.cpp
+** \brief Engine that handles all plugin related features
+*/
+
#include "PluginEngine.h"
#include "VidaliaSettings.h"
#include "PluginWrapper.h"
@@ -17,7 +32,7 @@ PluginEngine::PluginEngine(QObject *parent)
globalObject().setProperty("torControl", newQObject(Vidalia::torControl()));
globalObject().setProperty("vidaliaApp", newQObject(vApp));
- globalObject().setProperty("include", newFunction(includeScript));
+// globalObject().setProperty("include", newFunction(includeScript));
globalObject().setProperty("importExtension", newFunction(importExtension));
globalObject().setProperty("vdebug", newFunction(vdebug));
globalObject().setProperty("findWidget", newFunction(findWidget));
@@ -30,9 +45,6 @@ PluginEngine::PluginEngine(QObject *parent)
DebugDialog::outputDebug(QString(" %1").arg(ext));
loadAllPlugins();
-
-// debugger.attachTo(this);
-// debugger.standardWindow()->show();
}
PluginEngine::~PluginEngine()
@@ -104,75 +116,54 @@ PluginEngine::importExtension(QScriptContext *context, QScriptEngine *engine)
return engine->importExtension(context->argument(0).toString());
}
-QScriptValue
-PluginEngine::includeScript(QScriptContext *context, QScriptEngine *engine)
-{
- QString currentFileName = engine->globalObject().property("qs").property("script").property("absoluteFilePath").toString();
- QFileInfo currentFileInfo(currentFileName);
- QString path = currentFileInfo.path();
- QString importFile = context->argument(0).toString();
- QFileInfo importInfo(importFile);
- if (importInfo.isRelative()) {
- importFile = path + "/" + importInfo.filePath();
- }
- if (!loadFile(importFile, engine)) {
- return context->throwError(QString("Failed to resolve include: %1").arg(importFile));
- }
- return engine->toScriptValue(true);
-}
-
-bool
-PluginEngine::loadFile(QString fileName, QScriptEngine *engine)
-{
- // avoid loading files more than once
- static QSet<QString> loadedFiles;
- QFileInfo fileInfo(fileName);
- QString absoluteFileName = fileInfo.absoluteFilePath();
- QString absolutePath = fileInfo.absolutePath();
- QString canonicalFileName = fileInfo.canonicalFilePath();
- if (loadedFiles.contains(canonicalFileName)) {
- return true;
- }
- loadedFiles.insert(canonicalFileName);
- QString path = fileInfo.path();
-
- // load the file
- QFile file(fileName);
- if (file.open(QFile::ReadOnly)) {
- QTextStream stream(&file);
- QString contents = stream.readAll();
- file.close();
-
- int endlineIndex = contents.indexOf('\n');
- QString line = contents.left(endlineIndex);
- int lineNumber = 1;
-
- // strip off #!/usr/bin/env qscript line
- if (line.startsWith("#!")) {
- contents.remove(0, endlineIndex+1);
- ++lineNumber;
- }
-
- // set qt.script.absoluteFilePath
- QScriptValue script = engine->globalObject().property("qs").property("script");
- QScriptValue oldFilePathValue = script.property("absoluteFilePath");
- QScriptValue oldPathValue = script.property("absolutePath");
- script.setProperty("absoluteFilePath", engine->toScriptValue(absoluteFileName));
- script.setProperty("absolutePath", engine->toScriptValue(absolutePath));
-
- QScriptValue r = engine->evaluate(contents, fileName, lineNumber);
- if (engine->hasUncaughtException()) {
- QStringList backtrace = engine->uncaughtExceptionBacktrace();
- qDebug() << QString(" %1\n%2\n\n").arg(r.toString()).arg(backtrace.join("\n"));
- return true;
- }
- script.setProperty("absoluteFilePath", oldFilePathValue); // if we come from includeScript(), or whereever
- script.setProperty("absolutePath", oldPathValue); // if we come from includeScript(), or whereever
- } else {
- return false;
- }
- return true;
-}
+//QScriptValue
+//PluginEngine::includeScript(QScriptContext *context, QScriptEngine *engine)
+//{
+// VidaliaSettings settings;
+// QString path = settings.pluginPath();
+// QString importFile = context->argument(0).toString();
+// QFileInfo importInfo(importFile);
+// if (importInfo.isRelative()) {
+// importFile = path + "/" + importInfo.filePath();
+// }
+
+// if (!loadFile(importFile, engine)) {
+// return context->throwError(QString("Failed to resolve include: %1").arg(importFile));
+// }
+// return engine->toScriptValue(true);
+//}
+
+//bool
+//PluginEngine::loadFile(QString fileName, QScriptEngine *engine)
+//{
+// static QSet<QString> loadedFiles;
+// QFileInfo fileInfo(fileName);
+// QString absoluteFileName = fileInfo.absoluteFilePath();
+// QString absolutePath = fileInfo.absolutePath();
+// QString canonicalFileName = fileInfo.canonicalFilePath();
+// if (loadedFiles.contains(canonicalFileName)) {
+// return true;
+// }
+// loadedFiles.insert(canonicalFileName);
+// QString path = fileInfo.path();
+
+// QFile file(fileName);
+// if (file.open(QFile::ReadOnly)) {
+// QTextStream stream(&file);
+// QString contents = stream.readAll();
+// file.close();
+
+// QScriptValue r = engine->evaluate(contents);
+// if (engine->hasUncaughtException()) {
+// QStringList backtrace = engine->uncaughtExceptionBacktrace();
+// qDebug() << QString(" %1\n%2\n\n").arg(r.toString()).arg(backtrace.join("\n"));
+// return true;
+// }
+// } else {
+// return false;
+// }
+// return true;
+//}
QScriptValue
PluginEngine::vdebug(QScriptContext *context, QScriptEngine *engine)
@@ -184,13 +175,14 @@ PluginEngine::vdebug(QScriptContext *context, QScriptEngine *engine)
result.append(context->argument(i).toString());
}
- qWarning() << result;
+ vInfo(result);
return engine->undefinedValue();
}
QScriptValue
-PluginEngine::findWidget(QScriptContext *context, QScriptEngine *engine) {
+PluginEngine::findWidget(QScriptContext *context, QScriptEngine *engine)
+{
if(context->argumentCount() != 2)
return context->throwError(QString("findWidget called with the wrong argument count. Expected 2."));
diff --git a/src/vidalia/plugin/PluginEngine.h b/src/vidalia/plugin/PluginEngine.h
index 854ed15..d8dc273 100644
--- a/src/vidalia/plugin/PluginEngine.h
+++ b/src/vidalia/plugin/PluginEngine.h
@@ -1,3 +1,18 @@
+/*
+** This file is part of Vidalia, and is subject to the license terms in the
+** LICENSE file, found in the top level directory of this distribution. If you
+** did not receive the LICENSE file with this file, you may obtain it from the
+** Vidalia source package distributed by the Vidalia Project at
+** http://www.torproject.org/projects/vidalia.html. No part of Vidalia,
+** including this file, may be copied, modified, propagated, or distributed
+** except according to the terms described in the LICENSE file.
+*/
+
+/*
+** \file PluginEngine.h
+** \brief Engine that handles all plugin related features
+*/
+
#ifndef PLUGINENGINE_H
#define PLUGINENGINE_H
@@ -32,8 +47,8 @@ class PluginEngine : public QScriptEngine {
protected:
static QScriptValue importExtension(QScriptContext *context, QScriptEngine *engine);
- static bool loadFile(QString fileName, QScriptEngine *engine);
- static QScriptValue includeScript(QScriptContext *context, QScriptEngine *engine);
+// static bool loadFile(QString fileName, QScriptEngine *engine);
+// static QScriptValue includeScript(QScriptContext *context, QScriptEngine *engine);
static QScriptValue vdebug(QScriptContext *context, QScriptEngine *engine);
static QScriptValue findWidget(QScriptContext *context, QScriptEngine *engine);
diff --git a/src/vidalia/plugin/PluginWrapper.cpp b/src/vidalia/plugin/PluginWrapper.cpp
index 2736dbc..87a6ff1 100644
--- a/src/vidalia/plugin/PluginWrapper.cpp
+++ b/src/vidalia/plugin/PluginWrapper.cpp
@@ -1,3 +1,18 @@
+/*
+** This file is part of Vidalia, and is subject to the license terms in the
+** LICENSE file, found in the top level directory of this distribution. If
+** you did not receive the LICENSE file with this file, you may obtain it
+** from the Vidalia source package distributed by the Vidalia Project at
+** http://www.torproject.org/projects/vidalia.html. No part of Vidalia,
+** including this file, may be copied, modified, propagated, or distributed
+** except according to the terms described in the LICENSE file.
+*/
+
+/*
+** \file PluginWrapper.cpp
+** \brief Wrapper for the plugin scripts
+*/
+
#include "PluginWrapper.h"
#include "PluginEngine.h"
#include "DebugDialog.h"
diff --git a/src/vidalia/plugin/PluginWrapper.h b/src/vidalia/plugin/PluginWrapper.h
index 15f7853..1253bee 100644
--- a/src/vidalia/plugin/PluginWrapper.h
+++ b/src/vidalia/plugin/PluginWrapper.h
@@ -1,3 +1,18 @@
+/*
+** This file is part of Vidalia, and is subject to the license terms in the
+** LICENSE file, found in the top level directory of this distribution. If
+** you did not receive the LICENSE file with this file, you may obtain it
+** from the Vidalia source package distributed by the Vidalia Project at
+** http://www.torproject.org/projects/vidalia.html. No part of Vidalia,
+** including this file, may be copied, modified, propagated, or distributed
+** except according to the terms described in the LICENSE file.
+*/
+
+/*
+** \file PluginWrapper.h
+** \brief Wrapper for the plugin scripts
+*/
+
#ifndef PLUGINWRAPPER_H
#define PLUGINWRAPPER_H
diff --git a/src/vidalia/plugin/prototypes/HelperProcessPrototype.cpp b/src/vidalia/plugin/prototypes/HelperProcessPrototype.cpp
index c2232e1..2fcd126 100644
--- a/src/vidalia/plugin/prototypes/HelperProcessPrototype.cpp
+++ b/src/vidalia/plugin/prototypes/HelperProcessPrototype.cpp
@@ -1,3 +1,18 @@
+/*
+** This file is part of Vidalia, and is subject to the license terms in the
+** LICENSE file, found in the top level directory of this distribution. If
+** you did not receive the LICENSE file with this file, you may obtain it
+** from the Vidalia source package distributed by the Vidalia Project at
+** http://www.torproject.org/projects/vidalia.html. No part of Vidalia,
+** including this file, may be copied, modified, propagated, or distributed
+** except according to the terms described in the LICENSE file.
+*/
+
+/*
+** \file HelperProcessPrototype.cpp
+** \brief Prototype for the HelperProcess class
+*/
+
#include "HelperProcessPrototype.h"
HelperProcessPrototype::HelperProcessPrototype(QObject *parent)
@@ -11,12 +26,14 @@ HelperProcessPrototype::constructor(QScriptContext *context, QScriptEngine *engi
}
int
-HelperProcessPrototype::metaTypeId() {
+HelperProcessPrototype::metaTypeId()
+{
return qMetaTypeId<HelperProcess *>();
}
QString
-HelperProcessPrototype::name() {
+HelperProcessPrototype::name()
+{
return QString("HelperProcess");
}
diff --git a/src/vidalia/plugin/prototypes/TorControlPrototype.cpp b/src/vidalia/plugin/prototypes/TorControlPrototype.cpp
index 56bccc0..742a428 100644
--- a/src/vidalia/plugin/prototypes/TorControlPrototype.cpp
+++ b/src/vidalia/plugin/prototypes/TorControlPrototype.cpp
@@ -1,3 +1,18 @@
+/*
+** This file is part of Vidalia, and is subject to the license terms in the
+** LICENSE file, found in the top level directory of this distribution. If you
+** did not receive the LICENSE file with this file, you may obtain it from the
+** Vidalia source package distributed by the Vidalia Project at
+** http://www.torproject.org/projects/vidalia.html. No part of Vidalia,
+** including this file, may be copied, modified, propagated, or distributed
+** except according to the terms described in the LICENSE file.
+*/
+
+/*
+** \file TorControlPrototype.cpp
+** \brief Prototype for TorControl class
+*/
+
#include "TorControlPrototype.h"
#define GET_AND_CALL(type, func, res) \
diff --git a/src/vidalia/plugin/prototypes/TorControlPrototype.h b/src/vidalia/plugin/prototypes/TorControlPrototype.h
index 8127c76..eb0cc6b 100644
--- a/src/vidalia/plugin/prototypes/TorControlPrototype.h
+++ b/src/vidalia/plugin/prototypes/TorControlPrototype.h
@@ -1,16 +1,16 @@
/*
** This file is part of Vidalia, and is subject to the license terms in the
-** LICENSE file, found in the top level directory of this distribution. If
-** you did not receive the LICENSE file with this file, you may obtain it
-** from the Vidalia source package distributed by the Vidalia Project at
+** LICENSE file, found in the top level directory of this distribution. If you
+** did not receive the LICENSE file with this file, you may obtain it from the
+** Vidalia source package distributed by the Vidalia Project at
** http://www.torproject.org/projects/vidalia.html. No part of Vidalia,
** including this file, may be copied, modified, propagated, or distributed
** except according to the terms described in the LICENSE file.
*/
-/*
+/*
** \file TorControlPrototype.h
-** \brief Object for interacting with the Tor process and control interface
+** \brief Prototype for TorControl class
*/
#ifndef _TORCONTROLPROTO_H
diff --git a/src/vidalia/plugin/prototypes/VidaliaTabPrototype.cpp b/src/vidalia/plugin/prototypes/VidaliaTabPrototype.cpp
index 52b8fef..8f71a37 100644
--- a/src/vidalia/plugin/prototypes/VidaliaTabPrototype.cpp
+++ b/src/vidalia/plugin/prototypes/VidaliaTabPrototype.cpp
@@ -1,3 +1,18 @@
+/*
+** This file is part of Vidalia, and is subject to the license terms in the
+** LICENSE file, found in the top level directory of this distribution. If you
+** did not receive the LICENSE file with this file, you may obtain it from the
+** Vidalia source package distributed by the Vidalia Project at
+** http://www.torproject.org/projects/vidalia.html. No part of Vidalia,
+** including this file, may be copied, modified, propagated, or distributed
+** except according to the terms described in the LICENSE file.
+*/
+
+/*
+** \file VidaliaTabPrototype.cpp
+** \brief Prototype for VidaliaTab class
+*/
+
#include "VidaliaTabPrototype.h"
VidaliaTabPrototype::VidaliaTabPrototype(QObject *parent)
@@ -21,12 +36,14 @@ VidaliaTabPrototype::constructor(QScriptContext *context, QScriptEngine *engine)
}
int
-VidaliaTabPrototype::metaTypeId() {
+VidaliaTabPrototype::metaTypeId()
+{
return qMetaTypeId<VidaliaTab *>();
}
QString
-VidaliaTabPrototype::name() {
+VidaliaTabPrototype::name()
+{
return QString("VidaliaTab");
}
diff --git a/src/vidalia/plugin/prototypes/VidaliaTabPrototype.h b/src/vidalia/plugin/prototypes/VidaliaTabPrototype.h
index 59d640d..dcc355b 100644
--- a/src/vidalia/plugin/prototypes/VidaliaTabPrototype.h
+++ b/src/vidalia/plugin/prototypes/VidaliaTabPrototype.h
@@ -1,3 +1,18 @@
+/*
+** This file is part of Vidalia, and is subject to the license terms in the
+** LICENSE file, found in the top level directory of this distribution. If you
+** did not receive the LICENSE file with this file, you may obtain it from the
+** Vidalia source package distributed by the Vidalia Project at
+** http://www.torproject.org/projects/vidalia.html. No part of Vidalia,
+** including this file, may be copied, modified, propagated, or distributed
+** except according to the terms described in the LICENSE file.
+*/
+
+/*
+** \file VidaliaTabPrototype.h
+** \brief Prototype for VidaliaTab class
+*/
+
#ifndef VIDALIATABPROT_H
#define VIDALIATABPROT_H
1
0
commit 92f39c6d275d07b9a49fc1a412c6482551190831
Author: Tomas Touceda <chiiph(a)torproject.org>
Date: Wed Jun 1 17:02:07 2011 -0300
Plugin framework: initial commit
It introduces the basic structure of the plugin management, not the actual
API. There's some refactoring to do, but the basic layout is working.
---
CMakeLists.txt | 2 +-
src/vidalia/CMakeLists.txt | 13 ++
src/vidalia/MainWindow.cpp | 24 +++-
src/vidalia/MainWindow.h | 7 +
src/vidalia/config/VidaliaSettings.cpp | 13 ++
src/vidalia/config/VidaliaSettings.h | 5 +
src/vidalia/plugin/PluginEngine.cpp | 64 ++++++++
src/vidalia/plugin/PluginEngine.h | 28 ++++
src/vidalia/plugin/PluginWrapper.cpp | 157 ++++++++++++++++++++
src/vidalia/plugin/PluginWrapper.h | 46 ++++++
.../plugin/prototypes/VidaliaTabPrototype.cpp | 10 ++
.../plugin/prototypes/VidaliaTabPrototype.h | 21 +++
12 files changed, 388 insertions(+), 2 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index dfd8f3b..0c07d0d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -37,10 +37,10 @@ include(FindQt4)
find_package(Qt4 REQUIRED)
set(QT_USE_QTNETWORK true)
set(QT_USE_QTXML true)
+set(QT_USE_QTSCRIPT true)
if (USE_MARBLE)
set(QT_USE_QTSVG true)
set(QT_USE_QTWEBKIT true)
- set(QT_USE_QTSCRIPT true)
set(QT_USE_QTDBUS true)
endif(USE_MARBLE)
include(${QT_USE_FILE})
diff --git a/src/vidalia/CMakeLists.txt b/src/vidalia/CMakeLists.txt
index 5811320..4cbe458 100644
--- a/src/vidalia/CMakeLists.txt
+++ b/src/vidalia/CMakeLists.txt
@@ -20,6 +20,8 @@ include_directories(
${CMAKE_CURRENT_SOURCE_DIR}/help/browser
${CMAKE_CURRENT_SOURCE_DIR}/log
${CMAKE_CURRENT_SOURCE_DIR}/network
+ ${CMAKE_CURRENT_SOURCE_DIR}/plugin
+ ${CMAKE_CURRENT_SOURCE_DIR}/plugin/prototypes
${MARBLE_INCLUDE_DIR}
)
@@ -80,6 +82,17 @@ qt4_wrap_cpp(vidalia_SRCS
bwgraph/BandwidthGraph.h
bwgraph/GraphFrame.h
)
+## Plugin framework sources
+set(vidalia_SRCS ${vidalia_SRCS}
+ plugin/PluginEngine.cpp
+ plugin/PluginWrapper.cpp
+ plugin/prototypes/VidaliaTabPrototype.cpp
+)
+qt4_wrap_cpp(vidalia_SRCS
+ plugin/PluginEngine.h
+ plugin/PluginWrapper.h
+ plugin/prototypes/VidaliaTabPrototype.h
+)
## Configuration dialog sources
set(vidalia_SRCS ${vidalia_SRCS}
diff --git a/src/vidalia/MainWindow.cpp b/src/vidalia/MainWindow.cpp
index 70e8044..931df1c 100644
--- a/src/vidalia/MainWindow.cpp
+++ b/src/vidalia/MainWindow.cpp
@@ -37,6 +37,8 @@
#include "stringutil.h"
#include "procutil.h"
+#include "PluginWrapper.h"
+
#include <QtGui>
#define IMG_BWGRAPH ":/images/16x16/utilities-system-monitor.png"
@@ -100,6 +102,8 @@ MainWindow::MainWindow()
/* Create a new TorControl object, used to communicate with Tor */
_torControl = Vidalia::torControl();
+ _engine = new PluginEngine();
+
createGUI();
createConnections();
@@ -176,7 +180,11 @@ MainWindow::createMenuBar()
viewMenu->addSeparator();
viewMenu->addAction(_actionConfigure);
-// QMenu *pluginsMenu = menu->addMenu(tr("Plugins"));
+ QMenu *pluginsMenu = menu->addMenu(tr("Plugins"));
+ foreach(QAction *action, _engine->getAllActions()) {
+ pluginsMenu->addAction(action);
+ connect(action, SIGNAL(triggered()), this, SLOT(showPluginTab()));
+ }
QMenu *helpMenu = menu->addMenu(tr("Help"));
helpMenu->addAction(_actionVidaliaHelp);
@@ -1539,6 +1547,12 @@ MainWindow::addTab(VidaliaTab *tab)
* instanse passed */
if(_tabMap.contains(tab->getTitle())) {
ui.tabWidget->setCurrentIndex(_tabMap.indexOf(tab->getTitle()));
+
+ /** If we are trying to open the exact same tab twice
+ * don't do anything */
+ if(tab == ui.tabWidget->widget(_tabMap.indexOf(tab->getTitle())))
+ return;
+
/** Exception for tabs that need to be always created */
if (tab != _messageLog &&
tab != &_statusTab &&
@@ -1579,6 +1593,14 @@ MainWindow::delTab(int index)
}
void
+MainWindow::showPluginTab()
+{
+ QAction *act = qobject_cast<QAction *>(sender());
+ PluginWrapper *wrapper = qobject_cast<PluginWrapper *>(act->parent());
+ addTab(wrapper->buildGUI());
+}
+
+void
MainWindow::showStatusTab()
{
addTab(&_statusTab);
diff --git a/src/vidalia/MainWindow.h b/src/vidalia/MainWindow.h
index 7d386d5..e5366b8 100644
--- a/src/vidalia/MainWindow.h
+++ b/src/vidalia/MainWindow.h
@@ -36,6 +36,8 @@
#include "TorControl.h"
+#include "PluginEngine.h"
+
#include <QMainWindow>
#include <QTimer>
#include <QSystemTrayIcon>
@@ -142,6 +144,9 @@ private slots:
/** Deletes the tab at index if it exists and it isn't the Status tab */
void delTab(int index = -1);
+ /** Handles adding a new tab corresponding to a plugin */
+ void showPluginTab();
+
/** Called when the web browser or IM client have stopped */
void onSubprocessFinished(int exitCode, QProcess::ExitStatus exitStatus);
/** Called periodically to check if the browser is running. If it is not,
@@ -304,6 +309,8 @@ private:
NetViewer _netViewer; /**< Network map that draws circuits */
QStringList _tabMap; /**< Map to handle opened tabs */
BandwidthGraph *_graph; /**< Graph that draws bandwidth usage */
+
+ PluginEngine *_engine;
};
#endif
diff --git a/src/vidalia/config/VidaliaSettings.cpp b/src/vidalia/config/VidaliaSettings.cpp
index 0812b03..aa4d18b 100644
--- a/src/vidalia/config/VidaliaSettings.cpp
+++ b/src/vidalia/config/VidaliaSettings.cpp
@@ -39,6 +39,7 @@
#define SETTING_LAST_UPDATE_CHECK "LastUpdateCheck"
#define SETTING_USE_LOCAL_GEOIP_DATABASE "UseLocalGeoIpDatabase"
#define SETTING_LOCAL_GEOIP_DATABASE "LocalGeoIpDatabase"
+#define SETTING_PLUGIN_PATH "PluginPath"
#if defined(Q_OS_WIN32)
#define STARTUP_REG_KEY "Software\\Microsoft\\Windows\\CurrentVersion\\Run"
@@ -82,6 +83,7 @@ VidaliaSettings::VidaliaSettings()
setDefault(SETTING_LAST_UPDATE_CHECK, QDateTime());
setDefault(SETTING_USE_LOCAL_GEOIP_DATABASE, false);
setDefault(SETTING_LOCAL_GEOIP_DATABASE, "");
+ setDefault(SETTING_PLUGIN_PATH, vApp->dataDirectory());
}
/** Gets the currently preferred language code for Vidalia. */
@@ -321,3 +323,14 @@ VidaliaSettings::setLocalGeoIpDatabase(const QString &databaseFile)
setValue(SETTING_LOCAL_GEOIP_DATABASE, databaseFile);
}
+QString
+VidaliaSettings::pluginPath() const
+{
+ return QDir::convertSeparators(value(SETTING_PLUGIN_PATH).toString());
+}
+
+void
+VidaliaSettings::setPluginPath(const QString &path)
+{
+ setValue(SETTING_PLUGIN_PATH, path);
+}
diff --git a/src/vidalia/config/VidaliaSettings.h b/src/vidalia/config/VidaliaSettings.h
index 2667b12..029657f 100644
--- a/src/vidalia/config/VidaliaSettings.h
+++ b/src/vidalia/config/VidaliaSettings.h
@@ -125,6 +125,11 @@ public:
QString localGeoIpDatabase() const;
/** Sets the file to use as a local GeoIP database. */
void setLocalGeoIpDatabase(const QString &databaseFile);
+
+ /** Returns the path where the plugins live */
+ QString pluginPath() const;
+ /** Sets the path where the plugins live */
+ void setPluginPath(const QString &path);
};
#endif
diff --git a/src/vidalia/plugin/PluginEngine.cpp b/src/vidalia/plugin/PluginEngine.cpp
new file mode 100644
index 0000000..fe85883
--- /dev/null
+++ b/src/vidalia/plugin/PluginEngine.cpp
@@ -0,0 +1,64 @@
+#include "PluginEngine.h"
+#include "VidaliaSettings.h"
+#include "PluginWrapper.h"
+
+PluginEngine::PluginEngine(QObject *parent)
+ : QScriptEngine(parent)
+{
+ // load prototypes
+ VidaliaTabPrototype vtabproto;
+ QScriptValue vtabscript = newQObject(&vtabproto, QScriptEngine::ScriptOwnership);
+ setDefaultPrototype(qMetaTypeId<VidaliaTab *>(), vtabscript);
+
+ // load constructors
+ QScriptValue vtabctor = newFunction(VidaliaTabPrototype::constructor, vtabscript);
+ globalObject().setProperty("VidaliaTab", vtabctor);
+
+ loadAllPlugins();
+}
+
+PluginEngine::~PluginEngine() {}
+
+void
+PluginEngine::loadAllPlugins()
+{
+ qWarning() << "loadAllPlugins()";
+
+ VidaliaSettings settings;
+ QDir path = QDir(settings.pluginPath());
+
+ qWarning() << "PluginPath" << path.absolutePath();
+
+ foreach(QString pdir, path.entryList(QDir::NoDotAndDotDot|QDir::AllDirs)) {
+ qWarning() << "pdir" << pdir;
+ QFileInfo finfo(QString("%1%2%3").arg(path.absolutePath()).arg(QDir::separator()).arg(pdir));
+
+ if(finfo.isDir()) {
+ tryLoadPlugin(finfo.filePath());
+ }
+ }
+}
+
+void
+PluginEngine::tryLoadPlugin(QDir path)
+{
+ qWarning() << "tryLoadPlugin()" << path.absolutePath();
+
+ QStringList files = path.entryList();
+
+ if(!files.contains("info.xml"))
+ return;
+
+ PluginWrapper *wrapper = new PluginWrapper(QString("%1%2info.xml").arg(path.absolutePath()).arg(QDir::separator()), this);
+ wrappers << wrapper;
+}
+
+QList<QAction *>
+PluginEngine::getAllActions()
+{
+ QList<QAction *> actions;
+ foreach(PluginWrapper *wrapper, wrappers)
+ actions << wrapper->menuAction();
+
+ return actions;
+}
diff --git a/src/vidalia/plugin/PluginEngine.h b/src/vidalia/plugin/PluginEngine.h
new file mode 100644
index 0000000..09bff23
--- /dev/null
+++ b/src/vidalia/plugin/PluginEngine.h
@@ -0,0 +1,28 @@
+#ifndef PLUGINENGINE_H
+#define PLUGINENGINE_H
+
+#include <QtGui>
+#include <QtScript>
+
+#include "VidaliaTabPrototype.h"
+
+class PluginWrapper;
+
+class PluginEngine : public QScriptEngine {
+ Q_OBJECT
+
+ public:
+ PluginEngine(QObject *parent = 0);
+ ~PluginEngine();
+
+ QList<QAction *> getAllActions();
+
+ protected:
+ void loadAllPlugins();
+ void tryLoadPlugin(QDir path);
+
+ QList<PluginWrapper *> wrappers;
+};
+
+#endif
+
diff --git a/src/vidalia/plugin/PluginWrapper.cpp b/src/vidalia/plugin/PluginWrapper.cpp
new file mode 100644
index 0000000..b06b863
--- /dev/null
+++ b/src/vidalia/plugin/PluginWrapper.cpp
@@ -0,0 +1,157 @@
+#include "PluginWrapper.h"
+#include "PluginEngine.h"
+
+#include <QtXml>
+
+PluginWrapper::PluginWrapper(const QString &info_path, PluginEngine *engine, QObject *parent)
+ : QObject(parent), _engine(engine)
+{
+ _action = 0;
+ _gui = false;
+ _persistent = false;
+ processInfo(info_path);
+
+ foreach(QString path, _files) {
+ qWarning() << path;
+ QFile file(path);
+ if(file.open(QIODevice::ReadOnly)) {
+ _engine->evaluate(file.readAll());
+ qWarning() << "evaluated";
+ } else
+ qWarning() << "Error opening file";
+ }
+}
+
+PluginWrapper::~PluginWrapper() {}
+
+void
+PluginWrapper::processInfo(const QString &path)
+{
+ qWarning() << "processInfo()";
+
+ QDomDocument info("Plugin Info");
+ QFile file(path);
+ if(!file.open(QIODevice::ReadOnly)) {
+ qWarning() << "Problem opening xml file";
+ return;
+ }
+
+ if(!info.setContent(&file)) {
+ qWarning() << "Problem setting contents";
+ file.close();
+ return;
+ }
+
+ QDomElement root = info.documentElement();
+
+ if(root.tagName() != "VidaliaPlugin") {
+ return;
+ }
+
+ QDomNode n = root.firstChild();
+ while(!n.isNull()) {
+ QDomElement e = n.toElement();
+ if(!e.isNull()) {
+ if(e.tagName() == "name")
+ _name = e.text();
+ else if(e.tagName() == "author")
+ _author = e.text();
+ else if(e.tagName() == "date")
+ _date = e.text();
+ else if(e.tagName() == "type") {
+ _persistent = (e.attribute("persistent", "false") == "true");
+ _gui = (e.attribute("gui", "false") == "true");
+ } else if(e.tagName() == "files") {
+ QDomNode froot = e.firstChild();
+ while(!froot.isNull()) {
+ QDomElement fe = froot.toElement();
+ if(fe.tagName() == "file")
+ _files << QString("%1%2%3").arg(QFileInfo(path).path()).arg(QDir::separator()).arg(fe.text());
+ froot = froot.nextSibling();
+ }
+ } else if(e.tagName() == "namespace") {
+ _nspace = e.text();
+ }
+ }
+ n = n.nextSibling();
+ }
+
+ file.close();
+}
+
+void
+PluginWrapper::start()
+{
+ _engine->evaluate(QString("%1.start()").arg(nspace()));
+}
+
+void
+PluginWrapper::stop()
+{
+ _engine->evaluate(QString("%1.stop()").arg(nspace()));
+}
+
+VidaliaTab *
+PluginWrapper::buildGUI()
+{
+ if(!hasGUI())
+ return NULL;
+ VidaliaTab *tab = qscriptvalue_cast<VidaliaTab *>(_engine->evaluate(QString("%1.buildGUI()").arg(nspace())));
+ if(_engine->hasUncaughtException()) {
+ qWarning() << "Exception:";
+ qWarning() << _engine->uncaughtExceptionLineNumber();
+ }
+ qWarning() << "Casted tab:" << tab << nspace();
+ return tab;
+}
+
+bool
+PluginWrapper::hasGUI()
+{
+ return _gui;
+}
+
+bool
+PluginWrapper::isPersistent()
+{
+ return _persistent;
+}
+
+QString
+PluginWrapper::name() const
+{
+ return _name;
+}
+
+QString
+PluginWrapper::date() const
+{
+ return _date;
+}
+
+QString
+PluginWrapper::author() const
+{
+ return _author;
+}
+
+QString
+PluginWrapper::nspace() const
+{
+ return _nspace;
+}
+
+QStringList
+PluginWrapper::files() const
+{
+ return _files;
+}
+
+QAction *
+PluginWrapper::menuAction()
+{
+ if(hasGUI()) {
+ _action = new QAction(_name, this);
+ }
+ return _action;
+}
diff --git a/src/vidalia/plugin/PluginWrapper.h b/src/vidalia/plugin/PluginWrapper.h
new file mode 100644
index 0000000..1c7ad8f
--- /dev/null
+++ b/src/vidalia/plugin/PluginWrapper.h
@@ -0,0 +1,46 @@
+#ifndef PLUGINWRAPPER_H
+#define PLUGINWRAPPER_H
+
+#include <QtCore>
+
+#include "VidaliaTab.h"
+
+class PluginEngine;
+
+class PluginWrapper : public QObject {
+ Q_OBJECT
+
+ public:
+ PluginWrapper(const QString &info_path, PluginEngine *engine, QObject *parent = 0);
+ ~PluginWrapper();
+
+ bool hasGUI();
+ bool isPersistent();
+
+ QString name() const;
+ QString date() const;
+ QString author() const;
+ QString nspace() const;
+ QStringList files() const;
+
+ QAction *menuAction();
+
+ public slots:
+ void start();
+ void stop();
+ VidaliaTab *buildGUI();
+
+ protected:
+ void processInfo(const QString &path);
+
+ PluginEngine *_engine;
+ QString _name, _date, _author;
+ bool _persistent, _gui;
+ QStringList _files;
+ QString _nspace;
+
+ QAction *_action;
+};
+
+#endif
+
diff --git a/src/vidalia/plugin/prototypes/VidaliaTabPrototype.cpp b/src/vidalia/plugin/prototypes/VidaliaTabPrototype.cpp
new file mode 100644
index 0000000..58170ef
--- /dev/null
+++ b/src/vidalia/plugin/prototypes/VidaliaTabPrototype.cpp
@@ -0,0 +1,10 @@
+#include "VidaliaTabPrototype.h"
+
+VidaliaTabPrototype::VidaliaTabPrototype(QObject *parent)
+ : QObject(parent)
+{}
+
+QScriptValue VidaliaTabPrototype::constructor(QScriptContext *context, QScriptEngine *engine)
+{
+ return engine->newQObject(new VidaliaTab(QString("titulooo"), QString("nombreee")), QScriptEngine::ScriptOwnership);
+}
diff --git a/src/vidalia/plugin/prototypes/VidaliaTabPrototype.h b/src/vidalia/plugin/prototypes/VidaliaTabPrototype.h
new file mode 100644
index 0000000..dbd89cd
--- /dev/null
+++ b/src/vidalia/plugin/prototypes/VidaliaTabPrototype.h
@@ -0,0 +1,21 @@
+#ifndef VIDALIATABPROT_H
+#define VIDALIATABPROT_H
+
+#include <QtGui>
+#include <QtScript>
+
+#include "VidaliaTab.h"
+
+class VidaliaTabPrototype : public QObject, public QScriptable
+{
+ Q_OBJECT
+
+ public:
+ VidaliaTabPrototype(QObject *parent = 0);
+ static QScriptValue constructor(QScriptContext *context, QScriptEngine *engine);
+};
+
+Q_DECLARE_METATYPE(VidaliaTab *);
+
+#endif
+
1
0
[vidalia/alpha] Add first draft of the plugin framework documentation
by chiiph@torproject.org 02 Jul '11
by chiiph@torproject.org 02 Jul '11
02 Jul '11
commit 5bed9056139a2d33042995f1f0e7838fb43c9a3d
Author: Tomas Touceda <chiiph(a)gentoo.org>
Date: Tue May 17 13:50:31 2011 -0300
Add first draft of the plugin framework documentation
---
doc/plugin-framework.txt | 153 ++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 153 insertions(+), 0 deletions(-)
diff --git a/doc/plugin-framework.txt b/doc/plugin-framework.txt
new file mode 100644
index 0000000..e00ab8c
--- /dev/null
+++ b/doc/plugin-framework.txt
@@ -0,0 +1,153 @@
+Plugin Framework specification
+
+1. Directory structure:
+
+ Each plugin will live inside its own directory, separated from all the
+ other plugins.
+ The directory will contain the following:
+ info.xml *
+ <file>.js **
+ <subdir>/ ***
+
+ * The plugin description will live inside an XML file named info.xml,
+ its specification will be specified later.
+
+ ** Each source code file that the plugin uses will have a "js"
+ extension. The plugin may contain any other kind of files, along with
+ other source code files.
+
+ *** The plugin may contain any sort of directory dispositions. The
+ developer can reference files within subdirectories freely. The main
+ file can live anywhere within the plugin directory, as long as its
+ relative path is specified correctly in the info.xml file.
+
+2. Definition file:
+
+ The definition file for a plugin will be a XML file with the following DTD:
+
+ <!DOCTYPE VidaliaPlugin [
+ <!ENTITY name (#CDATA)>
+ <!ENTITY date (#CDATA)>
+ <!ENTITY author (#CDATA)>
+ <!ENTITY type (EMPTY)>
+ <!ATTLIST type persistent CDATA "false">
+ <!ATTLIST type gui CDATA "false">
+ <!ENTITY files (file+)>
+ <!ENTITY file (#CDATA)>
+ <!ENTITY namespace (#CDATA)>
+ ]>
+
+ Short description:
+ - Name, date and author are self explanatory.
+ - Type:
+ - Persistent: A plugin is persistent if it starts when Vidalia starts,
+ and it doesn't matter if the GUI (if it has one) is visible or not, the
+ plugin code is in execution.
+ - GUI: True if the plugin has a GUI.
+ - Files: Plugins may contain several source code files. The different
+ functions that must be implemented for it to work may be divided into
+ several files, or just one. Whatever the case may be, the files that the
+ plugin engine has to load must be specified in here. The plugin may use
+ other files, which don't need to be listed.
+ - Namespace: Each plugin will have its own namespace to avoid function
+ name collisions (the main functions will be named the same)
+
+3. Plugin functions:
+
+ Each plugin must implement the following functions:
+ start() : void
+ stop() : void
+ buildGUI() : VidaliaTab *
+
+ If the plugin isn't a GUI one, a default implementation will be added
+ that returns QScriptValue::NullValue.
+ Plugins may use several different files to implement its functionality.
+ To include files within other files use:
+
+ include("path/to/file.js")
+
+ This will be implemented by Vidalia's engine, it's not a native include
+ call. Another possibility would be to just list the file in the info.xml
+ file, and the engine will load it automatically and in order.
+
+4. Building an interface for a class to be used in a plugin:
+
+ To provide any class to be used in a plugin, there are two main parts to
+ implement: the constructor, and the prototype:
+ - Constructor: each constructable object in a plugin need to have
+ a static constructor function implemented with the following
+ signature:
+
+ QScriptValue f(QScriptContext *, QScriptEngine *)
+
+ - Prototype: A prototype is a wrapper for a metatype's methods. This
+ methods are what will be visible inside the plugin for a given
+ object.
+
+ The prototype class must inherit from QObject and QScriptable.
+ All types used in the plugin must be handled this way, and must be
+ declared as a Qt Metatype. Each interface must handle the metatype
+ declaration.
+
+5. Settings:
+
+ For specifying where the plugins live, there will be a new item in
+ Vidalia's configuration file: PluginPath. Which will contain the absolute
+ path of the plugins.
+
+6. Plugin engine:
+
+ All plugins will leave in the same environment (QScriptEngine). When
+ Vidalia starts, it starts the plugin engine.
+ Here's a bit of pseudo-code to get an idea of the loading process.
+
+ 6.1. Startup:
+
+ foreach provided_class: (1)
+ load_prototype (2)
+ load_constructor (3)
+
+ scan_plugin_directory (4)
+ foreach directory:
+ info = load_info_file (5)
+ wrapper = plugin_wrapper(info) (6)
+ if info.persistent:
+ wrapper.start() (7)
+ if info.gui:
+ plugin_menu.addAction(wrapper.menu_action()) (8)
+
+ (1) This loop will be probably hardcoded, since there isn't any way to
+ iterate through every class that we want to provide for the plugins.
+ (2) First we need to load the prototype for the given metatype.
+ (3) Then we can add a constructor for the metatype as a function of the
+ global script engine interpreter.
+ (4) Scan the PluginPath for directories that contain the info.xml
+ file.
+ (5) Interpret the info file to see what kind of plugin we are dealing
+ with.
+ (6) A plugin wrapper is an object that abstracts the actual calls to
+ the methods we know the plugin must implement with its corresponding
+ namespace.
+ (7) If it's a persistent plugin, then start it.
+ (8) If it's a gui plugin, add the entry to the plugin menu. If the
+ plugin is also persistent, then the menu action will be linked to
+ a show() function instead of the start(), since the plugin will be
+ already loaded.
+
+ 6.2. Quit:
+
+ foreach plugin:
+ wrapper.stop()
+
+7. Things to consider:
+
+ - Will the fact that all the plugins live in the same environment affect
+ in terms of security? or at least the workflow of each individual
+ plugin?
+ Possible solution: One instance of QScriptEngine for each plugin (kind
+ of a sandbox). But what will be the performance drawbacks to this?
+ - Is there the need to connect signals emitted from the plugin to
+ Vidalia? If so, this seems to be a nice implementation:
+ http://gitorious.org/qtscriptsignalhandler
+ - Do we want to have all files listed in the info.xml file too? May be we
+ can use that to have some kind of sanity check.
1
0
r24855: {website} Update website with new torbutton version. (in website/trunk: include torbutton)
by Mike Perry 02 Jul '11
by Mike Perry 02 Jul '11
02 Jul '11
Author: mikeperry
Date: 2011-07-02 01:09:57 +0000 (Sat, 02 Jul 2011)
New Revision: 24855
Modified:
website/trunk/include/versions.wmi
website/trunk/torbutton/update.rdf
Log:
Update website with new torbutton version.
Modified: website/trunk/include/versions.wmi
===================================================================
--- website/trunk/include/versions.wmi 2011-07-01 22:45:37 UTC (rev 24854)
+++ website/trunk/include/versions.wmi 2011-07-02 01:09:57 UTC (rev 24855)
@@ -84,8 +84,8 @@
<define-tag file-source-alpha whitespace=delete>tor-<version-alpha>.tar.gz</define-tag>
<define-tag package-source-alpha whitespace=delete>/dist/<file-source-alpha></define-tag>
-<define-tag version-torbutton whitespace=delete>1.2.5 (08 April 2010)</define-tag>
-<define-tag version-hash-torbutton whitespace=delete>sha1:e84592877593ad6119e829ac7199fd19333e101e</define-tag>
+<define-tag version-torbutton whitespace=delete>1.4.0 (30 June 2011)</define-tag>
+<define-tag version-hash-torbutton whitespace=delete>sha1:4df99e70b2991bb51ea70d0c217961174b24a98e</define-tag>
-<define-tag version-torbutton-alpha whitespace=delete>1.3.3-alpha (01 May 2011)</define-tag>
+<define-tag version-torbutton-alpha whitespace=delete>None</define-tag>
<define-tag version-hash-torbutton-alpha whitespace=delete>sha1:c7323cd408ebee28ee23b6a91fe056d59de668f5</define-tag>
Modified: website/trunk/torbutton/update.rdf
===================================================================
(Binary files differ)
1
0
02 Jul '11
commit 1696ed4d94cf4f4f6b62f5cb0024b58bd1247a09
Author: Mike Perry <mikeperry-git(a)fscked.org>
Date: Fri Jul 1 14:01:07 2011 -0700
Changelog entry for Tails name change.
---
src/CHANGELOG | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/src/CHANGELOG b/src/CHANGELOG
index 6961cef..2e09080 100644
--- a/src/CHANGELOG
+++ b/src/CHANGELOG
@@ -17,6 +17,7 @@
* misc: Squelch exception from app launcher in error console.
* misc: Make DuckDuckGo the default Google Captcha redirect destination.
* misc: Make it harder to accidentally toggle torbutton.
+ * misc: T(A)ILS was renamed to Tails.
1.3.3-alpha
01 May 2011
1
0
02 Jul '11
commit 67d177b7eaf60b6b66ed40813edc461da7fe46ef
Author: intrigeri <intrigeri(a)boum.org>
Date: Sun Jun 19 23:05:01 2011 +0200
T(A)ILS was renamed to Tails a while ago.
---
src/chrome/locale/af/torbutton.properties | 2 +-
src/chrome/locale/ak/torbutton.properties | 2 +-
src/chrome/locale/am/torbutton.properties | 2 +-
src/chrome/locale/ar/torbutton.properties | 2 +-
src/chrome/locale/arn/torbutton.properties | 2 +-
src/chrome/locale/ast/torbutton.properties | 2 +-
src/chrome/locale/az/torbutton.properties | 2 +-
src/chrome/locale/be/torbutton.properties | 2 +-
src/chrome/locale/bg/torbutton.properties | 2 +-
src/chrome/locale/bn-IN/torbutton.properties | 2 +-
src/chrome/locale/bn/torbutton.properties | 2 +-
src/chrome/locale/bo/torbutton.properties | 2 +-
src/chrome/locale/br/torbutton.properties | 2 +-
src/chrome/locale/bs/torbutton.properties | 2 +-
src/chrome/locale/ca/torbutton.properties | 2 +-
src/chrome/locale/cs/torbutton.properties | 2 +-
src/chrome/locale/csb/torbutton.properties | 2 +-
src/chrome/locale/cy/torbutton.properties | 2 +-
src/chrome/locale/da/torbutton.properties | 2 +-
src/chrome/locale/de/torbutton.properties | 2 +-
src/chrome/locale/dz/torbutton.properties | 2 +-
src/chrome/locale/el/torbutton.properties | 2 +-
src/chrome/locale/en/torbutton.properties | 2 +-
src/chrome/locale/eo/torbutton.properties | 2 +-
src/chrome/locale/es/torbutton.properties | 2 +-
src/chrome/locale/et/torbutton.properties | 2 +-
src/chrome/locale/eu/torbutton.properties | 2 +-
src/chrome/locale/fa/torbutton.properties | 2 +-
src/chrome/locale/fi/torbutton.properties | 2 +-
src/chrome/locale/fil/torbutton.properties | 2 +-
src/chrome/locale/fo/torbutton.properties | 2 +-
src/chrome/locale/fr/torbutton.properties | 2 +-
src/chrome/locale/fur/torbutton.properties | 2 +-
src/chrome/locale/fy/torbutton.properties | 2 +-
src/chrome/locale/ga/torbutton.properties | 2 +-
src/chrome/locale/gl/torbutton.properties | 2 +-
src/chrome/locale/gu/torbutton.properties | 2 +-
src/chrome/locale/gun/torbutton.properties | 2 +-
src/chrome/locale/ha/torbutton.properties | 2 +-
src/chrome/locale/he/torbutton.properties | 2 +-
src/chrome/locale/hi/torbutton.properties | 2 +-
src/chrome/locale/hr/torbutton.properties | 2 +-
src/chrome/locale/ht/torbutton.properties | 2 +-
src/chrome/locale/hu/torbutton.properties | 2 +-
src/chrome/locale/hy/torbutton.properties | 2 +-
src/chrome/locale/id/torbutton.properties | 2 +-
src/chrome/locale/is/torbutton.properties | 2 +-
src/chrome/locale/it/torbutton.properties | 2 +-
src/chrome/locale/ja/torbutton.properties | 2 +-
src/chrome/locale/jv/torbutton.properties | 2 +-
src/chrome/locale/ka/torbutton.properties | 2 +-
src/chrome/locale/km/torbutton.properties | 2 +-
src/chrome/locale/kn/torbutton.properties | 2 +-
src/chrome/locale/ko/torbutton.properties | 2 +-
src/chrome/locale/ku/torbutton.properties | 2 +-
src/chrome/locale/kw/torbutton.properties | 2 +-
src/chrome/locale/ky/torbutton.properties | 2 +-
src/chrome/locale/lb/torbutton.properties | 2 +-
src/chrome/locale/lg/torbutton.properties | 2 +-
src/chrome/locale/ln/torbutton.properties | 2 +-
src/chrome/locale/lo/torbutton.properties | 2 +-
src/chrome/locale/lt/torbutton.properties | 2 +-
src/chrome/locale/lv/torbutton.properties | 2 +-
src/chrome/locale/mg/torbutton.properties | 2 +-
src/chrome/locale/mi/torbutton.properties | 2 +-
src/chrome/locale/mk/torbutton.properties | 2 +-
src/chrome/locale/ml/torbutton.properties | 2 +-
src/chrome/locale/mn/torbutton.properties | 2 +-
src/chrome/locale/mr/torbutton.properties | 2 +-
src/chrome/locale/ms/torbutton.properties | 2 +-
src/chrome/locale/mt/torbutton.properties | 2 +-
src/chrome/locale/my/torbutton.properties | 2 +-
src/chrome/locale/nah/torbutton.properties | 2 +-
src/chrome/locale/nap/torbutton.properties | 2 +-
src/chrome/locale/nb/torbutton.properties | 2 +-
src/chrome/locale/ne/torbutton.properties | 2 +-
src/chrome/locale/nl/torbutton.properties | 2 +-
src/chrome/locale/nn/torbutton.properties | 2 +-
src/chrome/locale/nso/torbutton.properties | 2 +-
src/chrome/locale/oc/torbutton.properties | 2 +-
src/chrome/locale/or/torbutton.properties | 2 +-
src/chrome/locale/pa/torbutton.properties | 2 +-
src/chrome/locale/pap/torbutton.properties | 2 +-
src/chrome/locale/pl/torbutton.properties | 2 +-
src/chrome/locale/pms/torbutton.properties | 2 +-
src/chrome/locale/ps/torbutton.properties | 2 +-
src/chrome/locale/pt-BR/torbutton.properties | 2 +-
src/chrome/locale/pt/torbutton.properties | 2 +-
src/chrome/locale/ro/torbutton.properties | 2 +-
src/chrome/locale/ru/torbutton.properties | 2 +-
src/chrome/locale/sco/torbutton.properties | 2 +-
src/chrome/locale/sk/torbutton.properties | 2 +-
src/chrome/locale/sl/torbutton.properties | 2 +-
src/chrome/locale/so/torbutton.properties | 2 +-
src/chrome/locale/son/torbutton.properties | 2 +-
src/chrome/locale/sq/torbutton.properties | 2 +-
src/chrome/locale/sr/torbutton.properties | 2 +-
src/chrome/locale/st/torbutton.properties | 2 +-
src/chrome/locale/su/torbutton.properties | 2 +-
src/chrome/locale/sv/torbutton.properties | 2 +-
src/chrome/locale/sw/torbutton.properties | 2 +-
src/chrome/locale/ta/torbutton.properties | 2 +-
src/chrome/locale/te/torbutton.properties | 2 +-
src/chrome/locale/tg/torbutton.properties | 2 +-
src/chrome/locale/th/torbutton.properties | 2 +-
src/chrome/locale/ti/torbutton.properties | 2 +-
src/chrome/locale/tk/torbutton.properties | 2 +-
src/chrome/locale/tr/torbutton.properties | 2 +-
src/chrome/locale/uk/torbutton.properties | 2 +-
src/chrome/locale/ur/torbutton.properties | 2 +-
src/chrome/locale/ve/torbutton.properties | 2 +-
src/chrome/locale/vi/torbutton.properties | 2 +-
src/chrome/locale/wa/torbutton.properties | 2 +-
src/chrome/locale/wo/torbutton.properties | 2 +-
src/chrome/locale/zh-CN/torbutton.properties | 2 +-
src/chrome/locale/zh-HK/torbutton.properties | 2 +-
src/chrome/locale/zh-TW/torbutton.properties | 2 +-
src/chrome/locale/zu/torbutton.properties | 2 +-
118 files changed, 118 insertions(+), 118 deletions(-)
diff --git a/src/chrome/locale/af/torbutton.properties b/src/chrome/locale/af/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/af/torbutton.properties
+++ b/src/chrome/locale/af/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/ak/torbutton.properties b/src/chrome/locale/ak/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/ak/torbutton.properties
+++ b/src/chrome/locale/ak/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/am/torbutton.properties b/src/chrome/locale/am/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/am/torbutton.properties
+++ b/src/chrome/locale/am/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/ar/torbutton.properties b/src/chrome/locale/ar/torbutton.properties
index 503819b..4d1ac15 100644
--- a/src/chrome/locale/ar/torbutton.properties
+++ b/src/chrome/locale/ar/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (أساسي)
torbutton.popup.external.title = تحميل محتوى خارجي؟
torbutton.popup.external.app = هناك حاجة لاستخدام تطبيق خارجي للتعامل مع:\n\n
torbutton.popup.external.note = \n\nملاحظة: التطبيقات الخارجية ليست آمنة مع تور بشكل افتراضي ويمكن أن تكشف هويتك!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = إطلاق التطبيق
torbutton.popup.cancel = إلغاء
torbutton.popup.dontask = دائماً أطلق التطبيقات ابتداءً من الآن
diff --git a/src/chrome/locale/arn/torbutton.properties b/src/chrome/locale/arn/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/arn/torbutton.properties
+++ b/src/chrome/locale/arn/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/ast/torbutton.properties b/src/chrome/locale/ast/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/ast/torbutton.properties
+++ b/src/chrome/locale/ast/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/az/torbutton.properties b/src/chrome/locale/az/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/az/torbutton.properties
+++ b/src/chrome/locale/az/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/be/torbutton.properties b/src/chrome/locale/be/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/be/torbutton.properties
+++ b/src/chrome/locale/be/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/bg/torbutton.properties b/src/chrome/locale/bg/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/bg/torbutton.properties
+++ b/src/chrome/locale/bg/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/bn-IN/torbutton.properties b/src/chrome/locale/bn-IN/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/bn-IN/torbutton.properties
+++ b/src/chrome/locale/bn-IN/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/bn/torbutton.properties b/src/chrome/locale/bn/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/bn/torbutton.properties
+++ b/src/chrome/locale/bn/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/bo/torbutton.properties b/src/chrome/locale/bo/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/bo/torbutton.properties
+++ b/src/chrome/locale/bo/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/br/torbutton.properties b/src/chrome/locale/br/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/br/torbutton.properties
+++ b/src/chrome/locale/br/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/bs/torbutton.properties b/src/chrome/locale/bs/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/bs/torbutton.properties
+++ b/src/chrome/locale/bs/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/ca/torbutton.properties b/src/chrome/locale/ca/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/ca/torbutton.properties
+++ b/src/chrome/locale/ca/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/cs/torbutton.properties b/src/chrome/locale/cs/torbutton.properties
index 1652ad1..082bc04 100644
--- a/src/chrome/locale/cs/torbutton.properties
+++ b/src/chrome/locale/cs/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/csb/torbutton.properties b/src/chrome/locale/csb/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/csb/torbutton.properties
+++ b/src/chrome/locale/csb/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/cy/torbutton.properties b/src/chrome/locale/cy/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/cy/torbutton.properties
+++ b/src/chrome/locale/cy/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/da/torbutton.properties b/src/chrome/locale/da/torbutton.properties
index 5f837a9..7b218d3 100644
--- a/src/chrome/locale/da/torbutton.properties
+++ b/src/chrome/locale/da/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (afgørende)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/de/torbutton.properties b/src/chrome/locale/de/torbutton.properties
index 010b7dc..856a572 100644
--- a/src/chrome/locale/de/torbutton.properties
+++ b/src/chrome/locale/de/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (kritisch)
torbutton.popup.external.title = Externen Inhalt laden?
torbutton.popup.external.app = Eine externe Applikation wird benötigt, um mit dem folgenden Objekt umzugehen:\n\n
torbutton.popup.external.note = \n\nAnmerkung: Externe Applikationen sind im Allgemeinen NICHT Tor gesichert und können Sie verraten!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Applikation starten
torbutton.popup.cancel = Abbrechen
torbutton.popup.dontask = Von nun an immer Applikationen laden
diff --git a/src/chrome/locale/dz/torbutton.properties b/src/chrome/locale/dz/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/dz/torbutton.properties
+++ b/src/chrome/locale/dz/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/el/torbutton.properties b/src/chrome/locale/el/torbutton.properties
index 44f50a7..ef6916c 100644
--- a/src/chrome/locale/el/torbutton.properties
+++ b/src/chrome/locale/el/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (κρισιμο)
torbutton.popup.external.title = Να φορτωθεί εξωτερικό περιεχόμενο;
torbutton.popup.external.app = Μια εξωτερική εφαρμογή είναι απαραίτητη για τον σωστό χειρισμό:\n\n
torbutton.popup.external.note = \n\nΣΗΜΕΙΩΣΗ: Οι εξωτερικές εφαρμογές ΔΕΝ είναι εξορισμού ασφαλής για το Tor και μπορούν να σας αποκαλύψουν!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Εκτέλεση εφαρμογής
torbutton.popup.cancel = Άκυρον
torbutton.popup.dontask = Από τώρα και στο εξής να εκτελούνται πάντοτε εφαρμογές
diff --git a/src/chrome/locale/en/torbutton.properties b/src/chrome/locale/en/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/en/torbutton.properties
+++ b/src/chrome/locale/en/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/eo/torbutton.properties b/src/chrome/locale/eo/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/eo/torbutton.properties
+++ b/src/chrome/locale/eo/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/es/torbutton.properties b/src/chrome/locale/es/torbutton.properties
index bbcfbc5..4f10dfc 100644
--- a/src/chrome/locale/es/torbutton.properties
+++ b/src/chrome/locale/es/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Cargar contenido externo?
torbutton.popup.external.app = Una aplicación externa es necesaria para manejar:\n\n
torbutton.popup.external.note = \n\nNOTA: Las aplicaciones externasa NO son de uso seguro para Tor por defecto y podrían desenmascararlo!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Iniciar la aplicación
torbutton.popup.cancel = Cancelar
torbutton.popup.dontask = A partir de ahora, siempre iniciar la aplicación
diff --git a/src/chrome/locale/et/torbutton.properties b/src/chrome/locale/et/torbutton.properties
index 738c69d..dd55b46 100644
--- a/src/chrome/locale/et/torbutton.properties
+++ b/src/chrome/locale/et/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (ülioluline)
torbutton.popup.external.title = Lae välist sisu?
torbutton.popup.external.app = Välist rakendust on vaja, et käsitseda:\n\n
torbutton.popup.external.note = \n\nTeadaanne: välised rakendused ei ole vaikimisi Toriga koos kasutades turvalised ning võivad sind paljastada.\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Käivita rakendus
torbutton.popup.cancel = Katkesta
torbutton.popup.dontask = Alati käivita rakendusi edaspidi
diff --git a/src/chrome/locale/eu/torbutton.properties b/src/chrome/locale/eu/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/eu/torbutton.properties
+++ b/src/chrome/locale/eu/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/fa/torbutton.properties b/src/chrome/locale/fa/torbutton.properties
index 28253c3..7f3c630 100644
--- a/src/chrome/locale/fa/torbutton.properties
+++ b/src/chrome/locale/fa/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (بسيار مهم)
torbutton.popup.external.title = محتویات خارجی بارگزاری شوند؟
torbutton.popup.external.app = یک برنامه خارجی باید وارد عمل شود:\n\n
torbutton.popup.external.note = \n\nنکته: برنامه های خارجی توسط تُر به طور پیشفرض امن نشده اند و ممکن است هویت اصلی شما را آشکار کنند!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = اجرای برنامه
torbutton.popup.cancel = لغو
torbutton.popup.dontask = از حالا به بعد هر برنامه ای را اجرا کن
diff --git a/src/chrome/locale/fi/torbutton.properties b/src/chrome/locale/fi/torbutton.properties
index c098d75..4678368 100644
--- a/src/chrome/locale/fi/torbutton.properties
+++ b/src/chrome/locale/fi/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (kriittinen)
torbutton.popup.external.title = Ladataanko ulkopuolinen sisältö?
torbutton.popup.external.app = Tarvitaan ulkoinen sovellus:\n\n
torbutton.popup.external.note = \n\nHUOM: Ulkoiset sovellukset eivät ole oletusarvoisesti Tor turvallisia ja saattavat poistaa Tor suojauksesi!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Käynnistä sovellus
torbutton.popup.cancel = Peruuta
torbutton.popup.dontask = Käynistä sovellus joka kerta tästä eteenpäin
diff --git a/src/chrome/locale/fil/torbutton.properties b/src/chrome/locale/fil/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/fil/torbutton.properties
+++ b/src/chrome/locale/fil/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/fo/torbutton.properties b/src/chrome/locale/fo/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/fo/torbutton.properties
+++ b/src/chrome/locale/fo/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/fr/torbutton.properties b/src/chrome/locale/fr/torbutton.properties
index 0189322..c2a8108 100644
--- a/src/chrome/locale/fr/torbutton.properties
+++ b/src/chrome/locale/fr/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (indispensable)
torbutton.popup.external.title = Charger un contenu externe ?
torbutton.popup.external.app = Une application externe est requise pour gérer:\n\n
torbutton.popup.external.note = \n\nNOTE: Les applicatiosn externes ne sont pas saines par défaut pour Tor et peuvent vous démasquer !\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Lancer l'application
torbutton.popup.cancel = Annuler
torbutton.popup.dontask = Toujours lancer les applications à partir de maintenant
diff --git a/src/chrome/locale/fur/torbutton.properties b/src/chrome/locale/fur/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/fur/torbutton.properties
+++ b/src/chrome/locale/fur/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/fy/torbutton.properties b/src/chrome/locale/fy/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/fy/torbutton.properties
+++ b/src/chrome/locale/fy/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/ga/torbutton.properties b/src/chrome/locale/ga/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/ga/torbutton.properties
+++ b/src/chrome/locale/ga/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/gl/torbutton.properties b/src/chrome/locale/gl/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/gl/torbutton.properties
+++ b/src/chrome/locale/gl/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/gu/torbutton.properties b/src/chrome/locale/gu/torbutton.properties
index 9397f4d..467b240 100644
--- a/src/chrome/locale/gu/torbutton.properties
+++ b/src/chrome/locale/gu/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = કાર્યક્રમ શરુ કરો
torbutton.popup.cancel = રદ્ કરો
torbutton.popup.dontask = હવે પછી હંમેશા કાર્યક્રમ શરુ કરો
diff --git a/src/chrome/locale/gun/torbutton.properties b/src/chrome/locale/gun/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/gun/torbutton.properties
+++ b/src/chrome/locale/gun/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/ha/torbutton.properties b/src/chrome/locale/ha/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/ha/torbutton.properties
+++ b/src/chrome/locale/ha/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/he/torbutton.properties b/src/chrome/locale/he/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/he/torbutton.properties
+++ b/src/chrome/locale/he/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/hi/torbutton.properties b/src/chrome/locale/hi/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/hi/torbutton.properties
+++ b/src/chrome/locale/hi/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/hr/torbutton.properties b/src/chrome/locale/hr/torbutton.properties
index 5f91488..54d853f 100644
--- a/src/chrome/locale/hr/torbutton.properties
+++ b/src/chrome/locale/hr/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/ht/torbutton.properties b/src/chrome/locale/ht/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/ht/torbutton.properties
+++ b/src/chrome/locale/ht/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/hu/torbutton.properties b/src/chrome/locale/hu/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/hu/torbutton.properties
+++ b/src/chrome/locale/hu/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/hy/torbutton.properties b/src/chrome/locale/hy/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/hy/torbutton.properties
+++ b/src/chrome/locale/hy/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/id/torbutton.properties b/src/chrome/locale/id/torbutton.properties
index a15f1c3..206c8a9 100644
--- a/src/chrome/locale/id/torbutton.properties
+++ b/src/chrome/locale/id/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (krusial)
torbutton.popup.external.title = Muat konten eksternal?
torbutton.popup.external.app = Sebuah aplikasi eksternal butuh untuk ditangani:\n\n
torbutton.popup.external.note = \n\nCATATAN: secara default, aplikasi eksternal tidaklah aman untuk Tor dan dapat membuka penyamaran Anda!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Luncurkan aplikasi.
torbutton.popup.cancel = Batal
torbutton.popup.dontask = Selalu luncurkan aplikasi mulai dari sekarang
diff --git a/src/chrome/locale/is/torbutton.properties b/src/chrome/locale/is/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/is/torbutton.properties
+++ b/src/chrome/locale/is/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/it/torbutton.properties b/src/chrome/locale/it/torbutton.properties
index cb5c1b6..d852b5c 100644
--- a/src/chrome/locale/it/torbutton.properties
+++ b/src/chrome/locale/it/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (essenziale)
torbutton.popup.external.title = Caricare il contenuto esterno?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Lanciare l'applicazione
torbutton.popup.cancel = Annulla
torbutton.popup.dontask = Da adesso lanciare sempre le applicazioni
diff --git a/src/chrome/locale/ja/torbutton.properties b/src/chrome/locale/ja/torbutton.properties
index b3686bc..4741521 100644
--- a/src/chrome/locale/ja/torbutton.properties
+++ b/src/chrome/locale/ja/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (重要)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = アプリケーション起動
torbutton.popup.cancel = キャンセル
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/jv/torbutton.properties b/src/chrome/locale/jv/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/jv/torbutton.properties
+++ b/src/chrome/locale/jv/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/ka/torbutton.properties b/src/chrome/locale/ka/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/ka/torbutton.properties
+++ b/src/chrome/locale/ka/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/km/torbutton.properties b/src/chrome/locale/km/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/km/torbutton.properties
+++ b/src/chrome/locale/km/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/kn/torbutton.properties b/src/chrome/locale/kn/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/kn/torbutton.properties
+++ b/src/chrome/locale/kn/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/ko/torbutton.properties b/src/chrome/locale/ko/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/ko/torbutton.properties
+++ b/src/chrome/locale/ko/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/ku/torbutton.properties b/src/chrome/locale/ku/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/ku/torbutton.properties
+++ b/src/chrome/locale/ku/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/kw/torbutton.properties b/src/chrome/locale/kw/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/kw/torbutton.properties
+++ b/src/chrome/locale/kw/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/ky/torbutton.properties b/src/chrome/locale/ky/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/ky/torbutton.properties
+++ b/src/chrome/locale/ky/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/lb/torbutton.properties b/src/chrome/locale/lb/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/lb/torbutton.properties
+++ b/src/chrome/locale/lb/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/lg/torbutton.properties b/src/chrome/locale/lg/torbutton.properties
index f991f5a..6ccd278 100644
--- a/src/chrome/locale/lg/torbutton.properties
+++ b/src/chrome/locale/lg/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/ln/torbutton.properties b/src/chrome/locale/ln/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/ln/torbutton.properties
+++ b/src/chrome/locale/ln/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/lo/torbutton.properties b/src/chrome/locale/lo/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/lo/torbutton.properties
+++ b/src/chrome/locale/lo/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/lt/torbutton.properties b/src/chrome/locale/lt/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/lt/torbutton.properties
+++ b/src/chrome/locale/lt/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/lv/torbutton.properties b/src/chrome/locale/lv/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/lv/torbutton.properties
+++ b/src/chrome/locale/lv/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/mg/torbutton.properties b/src/chrome/locale/mg/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/mg/torbutton.properties
+++ b/src/chrome/locale/mg/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/mi/torbutton.properties b/src/chrome/locale/mi/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/mi/torbutton.properties
+++ b/src/chrome/locale/mi/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/mk/torbutton.properties b/src/chrome/locale/mk/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/mk/torbutton.properties
+++ b/src/chrome/locale/mk/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/ml/torbutton.properties b/src/chrome/locale/ml/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/ml/torbutton.properties
+++ b/src/chrome/locale/ml/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/mn/torbutton.properties b/src/chrome/locale/mn/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/mn/torbutton.properties
+++ b/src/chrome/locale/mn/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/mr/torbutton.properties b/src/chrome/locale/mr/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/mr/torbutton.properties
+++ b/src/chrome/locale/mr/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/ms/torbutton.properties b/src/chrome/locale/ms/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/ms/torbutton.properties
+++ b/src/chrome/locale/ms/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/mt/torbutton.properties b/src/chrome/locale/mt/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/mt/torbutton.properties
+++ b/src/chrome/locale/mt/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/my/torbutton.properties b/src/chrome/locale/my/torbutton.properties
index 3f80a83..046400d 100644
--- a/src/chrome/locale/my/torbutton.properties
+++ b/src/chrome/locale/my/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (အေရးၾကီးပါသည္)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/nah/torbutton.properties b/src/chrome/locale/nah/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/nah/torbutton.properties
+++ b/src/chrome/locale/nah/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/nap/torbutton.properties b/src/chrome/locale/nap/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/nap/torbutton.properties
+++ b/src/chrome/locale/nap/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/nb/torbutton.properties b/src/chrome/locale/nb/torbutton.properties
index 89ca137..2789d5d 100644
--- a/src/chrome/locale/nb/torbutton.properties
+++ b/src/chrome/locale/nb/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (avgjørende)
torbutton.popup.external.title = Laste eksternt innhold?
torbutton.popup.external.app = Et eksternt program er nødvendig for å håndtere:\n\n
torbutton.popup.external.note = \n\nMERK: Eksterne program er IKKE Tor-sikker som standard og kan røpe deg!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Start program
torbutton.popup.cancel = Avbryt
torbutton.popup.dontask = Start alltid programmer fra nå av
diff --git a/src/chrome/locale/ne/torbutton.properties b/src/chrome/locale/ne/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/ne/torbutton.properties
+++ b/src/chrome/locale/ne/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/nl/torbutton.properties b/src/chrome/locale/nl/torbutton.properties
index 99839be..9409233 100644
--- a/src/chrome/locale/nl/torbutton.properties
+++ b/src/chrome/locale/nl/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (cruciaal)
torbutton.popup.external.title = Externe inhoud laden ?
torbutton.popup.external.app = Een externe toepassing is nodig voor : \n\n
torbutton.popup.external.note = \n\n Opmerking : Externe toepassingen zijn NIET veilig en kunnen U ontmaskeren.\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Toepassing starten
torbutton.popup.cancel = Annuleren
torbutton.popup.dontask = Vanaf nu steeds de toepassing starten
diff --git a/src/chrome/locale/nn/torbutton.properties b/src/chrome/locale/nn/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/nn/torbutton.properties
+++ b/src/chrome/locale/nn/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/nso/torbutton.properties b/src/chrome/locale/nso/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/nso/torbutton.properties
+++ b/src/chrome/locale/nso/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/oc/torbutton.properties b/src/chrome/locale/oc/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/oc/torbutton.properties
+++ b/src/chrome/locale/oc/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/or/torbutton.properties b/src/chrome/locale/or/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/or/torbutton.properties
+++ b/src/chrome/locale/or/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/pa/torbutton.properties b/src/chrome/locale/pa/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/pa/torbutton.properties
+++ b/src/chrome/locale/pa/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/pap/torbutton.properties b/src/chrome/locale/pap/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/pap/torbutton.properties
+++ b/src/chrome/locale/pap/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/pl/torbutton.properties b/src/chrome/locale/pl/torbutton.properties
index 4fecbca..a950dfd 100644
--- a/src/chrome/locale/pl/torbutton.properties
+++ b/src/chrome/locale/pl/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (wymagane)
torbutton.popup.external.title = Załadować zewnętrzną zawartość?
torbutton.popup.external.app = Zawnętrzna aplikacja jest wymagana, aby obsłużyć:\n\n
torbutton.popup.external.note = \n\nUWAGA: Zewnętrzne aplikacje NIE są domyślnie bezpieczne przy używaniu Tora i mogą Cię odkryć!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Uruchom aplikację
torbutton.popup.cancel = Anuluj
torbutton.popup.dontask = Od teraz zawsze uruchamiaj aplikacje
diff --git a/src/chrome/locale/pms/torbutton.properties b/src/chrome/locale/pms/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/pms/torbutton.properties
+++ b/src/chrome/locale/pms/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/ps/torbutton.properties b/src/chrome/locale/ps/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/ps/torbutton.properties
+++ b/src/chrome/locale/ps/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/pt-BR/torbutton.properties b/src/chrome/locale/pt-BR/torbutton.properties
index 099b93e..55b8769 100644
--- a/src/chrome/locale/pt-BR/torbutton.properties
+++ b/src/chrome/locale/pt-BR/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Carregar conteúdo externo?
torbutton.popup.external.app = Uma aplicação externa é necessária para manipular:\n\n
torbutton.popup.external.note = \n\nNOTA: Aplicações externas NÃO são seguras por padrão e podem desmascarar você!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Rode a aplicação
torbutton.popup.cancel = Cancelado
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/pt/torbutton.properties b/src/chrome/locale/pt/torbutton.properties
index 2aea198..5e64dbc 100644
--- a/src/chrome/locale/pt/torbutton.properties
+++ b/src/chrome/locale/pt/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Carregar conteúdo externo?
torbutton.popup.external.app = Uma aplicação externa é necessário para abrir:\n\n
torbutton.popup.external.note = \n\nNota: Aplicações externas ao Tor NÃO são seguras, e podem dar a conhecer a sua origem!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Correr aplicação
torbutton.popup.cancel = Cancelar
torbutton.popup.dontask = Sempre correr aplicações daqui para a frente
diff --git a/src/chrome/locale/ro/torbutton.properties b/src/chrome/locale/ro/torbutton.properties
index 255855c..fed7b97 100644
--- a/src/chrome/locale/ro/torbutton.properties
+++ b/src/chrome/locale/ro/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (critic)
torbutton.popup.external.title = Să încarc conținutul extern?
torbutton.popup.external.app = O aplicaţie externă este necesară să se ocupe de:\n\n
torbutton.popup.external.note = \n\nObservatie: Aplicatiile externe NU sunt sigure cu setările implicite Tor, şi vă pot demasca!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Pornește aplicația
torbutton.popup.cancel = Anulare
torbutton.popup.dontask = Întotdeauna lansează aplicaţii de acum încolo
diff --git a/src/chrome/locale/ru/torbutton.properties b/src/chrome/locale/ru/torbutton.properties
index 2f070b6..35a6c0d 100644
--- a/src/chrome/locale/ru/torbutton.properties
+++ b/src/chrome/locale/ru/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (критично)
torbutton.popup.external.title = Загрузить внешние данные?
torbutton.popup.external.app = Внешняя прикладная программа необходима для обработки:\n\n
torbutton.popup.external.note = \n\nПРИМЕЧАНИЕ: Внешние приложения НЕ ЯВЛЯЮТСЯ безопасными для Tor по умолчанию, и могут разоблачить вас!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Запустить приложение
torbutton.popup.cancel = Отменить
torbutton.popup.dontask = В будущем всегда запускать приложения
diff --git a/src/chrome/locale/sco/torbutton.properties b/src/chrome/locale/sco/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/sco/torbutton.properties
+++ b/src/chrome/locale/sco/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/sk/torbutton.properties b/src/chrome/locale/sk/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/sk/torbutton.properties
+++ b/src/chrome/locale/sk/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/sl/torbutton.properties b/src/chrome/locale/sl/torbutton.properties
index d239c1b..72a63f0 100644
--- a/src/chrome/locale/sl/torbutton.properties
+++ b/src/chrome/locale/sl/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (obvezno)
torbutton.popup.external.title = Naloži zunanje vsebine?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Zaženi program
torbutton.popup.cancel = Prekliči
torbutton.popup.dontask = Vedno zaženi program.
diff --git a/src/chrome/locale/so/torbutton.properties b/src/chrome/locale/so/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/so/torbutton.properties
+++ b/src/chrome/locale/so/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/son/torbutton.properties b/src/chrome/locale/son/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/son/torbutton.properties
+++ b/src/chrome/locale/son/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/sq/torbutton.properties b/src/chrome/locale/sq/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/sq/torbutton.properties
+++ b/src/chrome/locale/sq/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/sr/torbutton.properties b/src/chrome/locale/sr/torbutton.properties
index 5a98e20..af42627 100644
--- a/src/chrome/locale/sr/torbutton.properties
+++ b/src/chrome/locale/sr/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (пресудно)
torbutton.popup.external.title = Да ли желите да учитате спољни садржај?
torbutton.popup.external.app = Потребан је спољни програм за руковање:\n\n
torbutton.popup.external.note = \n\nНапомена: спољни програми не гарантују безбедност и могу Вас открити!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Покрени програм
torbutton.popup.cancel = Откажи
torbutton.popup.dontask = Увек покрећи програме од сада па надаље
diff --git a/src/chrome/locale/st/torbutton.properties b/src/chrome/locale/st/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/st/torbutton.properties
+++ b/src/chrome/locale/st/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/su/torbutton.properties b/src/chrome/locale/su/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/su/torbutton.properties
+++ b/src/chrome/locale/su/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/sv/torbutton.properties b/src/chrome/locale/sv/torbutton.properties
index 2758ae3..de09829 100644
--- a/src/chrome/locale/sv/torbutton.properties
+++ b/src/chrome/locale/sv/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (kritiskt)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Starta program
torbutton.popup.cancel = Avbryt
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/sw/torbutton.properties b/src/chrome/locale/sw/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/sw/torbutton.properties
+++ b/src/chrome/locale/sw/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/ta/torbutton.properties b/src/chrome/locale/ta/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/ta/torbutton.properties
+++ b/src/chrome/locale/ta/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/te/torbutton.properties b/src/chrome/locale/te/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/te/torbutton.properties
+++ b/src/chrome/locale/te/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/tg/torbutton.properties b/src/chrome/locale/tg/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/tg/torbutton.properties
+++ b/src/chrome/locale/tg/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/th/torbutton.properties b/src/chrome/locale/th/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/th/torbutton.properties
+++ b/src/chrome/locale/th/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/ti/torbutton.properties b/src/chrome/locale/ti/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/ti/torbutton.properties
+++ b/src/chrome/locale/ti/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/tk/torbutton.properties b/src/chrome/locale/tk/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/tk/torbutton.properties
+++ b/src/chrome/locale/tk/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/tr/torbutton.properties b/src/chrome/locale/tr/torbutton.properties
index f4025f8..a74fd3f 100644
--- a/src/chrome/locale/tr/torbutton.properties
+++ b/src/chrome/locale/tr/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial =
torbutton.popup.external.title =
torbutton.popup.external.app = Kullanmak için harici bir uygulama seç:\n\n
torbutton.popup.external.note = \n\nNOT: Başka bir uyguluma sizin için güvenli olmayabilir!\n\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Uygulamayı çalıştır\n
torbutton.popup.cancel = İptal\n
torbutton.popup.dontask = Şu andan itibaren uygulamayı sürekli çalıştır\r\n
diff --git a/src/chrome/locale/uk/torbutton.properties b/src/chrome/locale/uk/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/uk/torbutton.properties
+++ b/src/chrome/locale/uk/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/ur/torbutton.properties b/src/chrome/locale/ur/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/ur/torbutton.properties
+++ b/src/chrome/locale/ur/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/ve/torbutton.properties b/src/chrome/locale/ve/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/ve/torbutton.properties
+++ b/src/chrome/locale/ve/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/vi/torbutton.properties b/src/chrome/locale/vi/torbutton.properties
index 3d3b3d1..e3c6718 100644
--- a/src/chrome/locale/vi/torbutton.properties
+++ b/src/chrome/locale/vi/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (cấp thiết)
torbutton.popup.external.title = Nạp nội dung bên ngoài?
torbutton.popup.external.app = Một ứng dụng bên ngoài cần có để xử lý:\n\n
torbutton.popup.external.note = \n\nLƯU Ý: Các ứng dụng bên ngoài không an toàn cho Tor theo mặc định và có thể làm lộ chân tướng bạn!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Khởi chạy ứng dụng
torbutton.popup.cancel = Hủy bỏ
torbutton.popup.dontask = Luôn luôn khởi chạy các ứng dụng kể từ bây giờ
diff --git a/src/chrome/locale/wa/torbutton.properties b/src/chrome/locale/wa/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/wa/torbutton.properties
+++ b/src/chrome/locale/wa/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/wo/torbutton.properties b/src/chrome/locale/wo/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/wo/torbutton.properties
+++ b/src/chrome/locale/wo/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/zh-CN/torbutton.properties b/src/chrome/locale/zh-CN/torbutton.properties
index 22226db..23b1c29 100644
--- a/src/chrome/locale/zh-CN/torbutton.properties
+++ b/src/chrome/locale/zh-CN/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (重要)
torbutton.popup.external.title = 载入外部内容?
torbutton.popup.external.app = 需要外部程序来处理:\n\n
torbutton.popup.external.note = \n\n注意:Tor 不能使外部程序的访问安全,可能泄露您的身份!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = 启动程序
torbutton.popup.cancel = 取消
torbutton.popup.dontask = 此后总是启动程序
diff --git a/src/chrome/locale/zh-HK/torbutton.properties b/src/chrome/locale/zh-HK/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/zh-HK/torbutton.properties
+++ b/src/chrome/locale/zh-HK/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/zh-TW/torbutton.properties b/src/chrome/locale/zh-TW/torbutton.properties
index 6405783..0009dca 100644
--- a/src/chrome/locale/zh-TW/torbutton.properties
+++ b/src/chrome/locale/zh-TW/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/zu/torbutton.properties b/src/chrome/locale/zu/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/zu/torbutton.properties
+++ b/src/chrome/locale/zu/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
1
0
commit e34e4818a9665987cc95ab39ff92ec11de4940dc
Author: Mike Perry <mikeperry-git(a)fscked.org>
Date: Fri Jul 1 17:29:37 2011 -0700
Bump version.
---
src/install.rdf | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/src/install.rdf b/src/install.rdf
index 0d4c9f7..f3451b6 100644
--- a/src/install.rdf
+++ b/src/install.rdf
@@ -6,7 +6,7 @@
<em:name>Torbutton</em:name>
<em:creator>Mike Perry & Kory Kirk</em:creator>
<em:id>{e0204bd5-9d31-402b-a99d-a6aa8ffebdca}</em:id>
- <em:version>1.4.0rc1-pre1</em:version>
+ <em:version>1.4.0</em:version>
<em:homepageURL>https://www.torproject.org/torbutton/</em:homepageURL>
<em:optionsURL>chrome://torbutton/content/preferences.xul</em:optionsURL>
<em:iconURL>chrome://torbutton/skin/tor.png</em:iconURL>
1
0