closes #56; closes #54

master
Marc Wäckerlin 14 years ago
parent fb9211b523
commit ec169d58a1
  1. 30
      swisssurfer/src/browser.hxx
  2. 42
      swisssurfer/src/main.cxx
  3. 3
      swisssurfer/src/qmake.pro.in
  4. 10
      swisssurfer/src/settings.hxx
  5. 160
      swisssurfer/src/smartcardauth.hxx
  6. 60
      swisssurfer/src/swisssurfer_de.ts
  7. 60
      swisssurfer/src/swisssurfer_en.ts
  8. 60
      swisssurfer/src/swisssurfer_fr.ts
  9. 60
      swisssurfer/src/swisssurfer_it.ts

@ -58,9 +58,14 @@ class Browser: public QMainWindow, protected Ui::Browser {
bool kiosk = false, bool login = true):
_url(0), _clearUrl(0), _addBookmark(0), _find(0),
_kiosk(kiosk),
_settings(mimeTypes, this, settings, !kiosk),
_scAuth(actlib, this, login), _errorLog(this) {
_settings(mimeTypes, this, settings, !kiosk), _errorLog(this) {
LOG<<urls;
try {
_scAuth = std::auto_ptr<SmartCardAuth>
(new SmartCardAuth(actlib, this, login));
} catch (const std::exception& x) {
LOG<<"No SmartCard Support:"<<x.what();
}
if (urls.size()) _home = urls.at(0);
QNetworkProxyFactory::setUseSystemConfiguration(true);
setupUi(this);
@ -431,7 +436,7 @@ class Browser: public QMainWindow, protected Ui::Browser {
if (!QSslSocket::supportsSsl())
QMessageBox::critical(this, tr("SSL Not Supported"),
tr("SSL is not supported on your system"));
_scAuth.login();
if (_scAuth.get()) _scAuth->login(false);
}
if (!check(page)) {
LOG<<"########## BLACK LISTED IGNORED ##########";
@ -1040,18 +1045,17 @@ class Browser: public QMainWindow, protected Ui::Browser {
:reply->url().path()).fileName();
}
LOG<<"Filename:"<<filename;
Settings::MimeTypes::const_iterator it
(_settings.mimetypes().find
(reply->header(QNetworkRequest::ContentTypeHeader).toString()
.split(';')[0]));
if (it!=_settings.mimetypes().end()) {
filename.replace(QRegExp("^(.*)\\."+it.value().toStringList()
.at(0)+"$"),
QStringList type
(_settings.mimetype
(reply->header(QNetworkRequest::ContentTypeHeader).toString(),
filename));
if (!type.isEmpty()) {
filename.replace(QRegExp("^(.*)\\."+type.at(0)+"$"),
"\\1"); // remove extension
QTemporaryFile *file =
new QTemporaryFile(QDir::tempPath()+QDir::separator()
+filename+"_XXXXXX."
+it.value().toStringList().at(0), this);
+type.at(0), this);
file->open();
file->write(reply->readAll());
file->close();
@ -1060,7 +1064,7 @@ class Browser: public QMainWindow, protected Ui::Browser {
_downloadProcesses[process] = file;
assert(connect(process, SIGNAL(finished(int, QProcess::ExitStatus)),
SLOT(processFinished())));
QStringList args(it.value().toStringList().at(1).split(" ")
QStringList args(type.at(1).split(" ")
.replaceInStrings("%1", file->fileName()));
QString prg(args.takeFirst());
LOG<<"Running:"<<prg<<args.join(" ");
@ -1211,8 +1215,8 @@ class Browser: public QMainWindow, protected Ui::Browser {
typedef std::map<QProcess*, QTemporaryFile*> DownloadProcesses;
DownloadProcesses _downloadProcesses;
Settings _settings;
SmartCardAuth _scAuth;
ErrorLog _errorLog;
std::auto_ptr<SmartCardAuth> _scAuth;
};
#endif

@ -26,6 +26,46 @@
#include <memory>
const QByteArray SWISSSIGN_EV_GOLD_CA_2009_G2
("-----BEGIN CERTIFICATE-----\n"
"MIIGvzCCBaegAwIBAgIQAPI39KUS4aGJo+mkR4+YuTANBgkqhkiG9w0BAQUFADBN\n"
"MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMScwJQYDVQQDEx5T\n"
"d2lzc1NpZ24gRVYgR29sZCBDQSAyMDA5IC0gRzIwHhcNMTAwNDI5MDgyMzA2WhcN\n"
"MTIwNDI5MDgyMzA2WjCCASQxCzAJBgNVBAYTAkNIMQ0wCwYDVQQIEwRCZXJuMQ0w\n"
"CwYDVQQHEwRCZXJuMSAwHgYDVQQKExdEaWUgU2Nod2VpemVyaXNjaGUgUG9zdDEa\n"
"MBgGA1UEAxMRaWRwLnN3aXNzc2lnbi5uZXQxJzAlBgkqhkiG9w0BCQEWGG9wZXJh\n"
"dGlvbnNAc3dpc3NzaWduLmNvbTEbMBkGA1UECRMSVmlrdG9yaWFzdHJhc3NlIDIx\n"
"MQ0wCwYDVQQREwQzMDMwMRUwEwYLKwYBBAGCNzwCAQITBEJlcm4xEzARBgsrBgEE\n"
"AYI3PAIBAxMCQ0gxGzAZBgNVBA8TElYxLjAsIENsYXVzZSA1LihiKTEbMBkGA1UE\n"
"BRMSQ0gtMDM1LjguMDE3LjIxNy03MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB\n"
"CgKCAQEA6vtopNyjugIQb+OwsjcAN60Uo1ClcnFa+0Eme5MOCQg8khGwux42aRTL\n"
"kUfcTrOye4J8ThE5/9Qm32hagA+mPQRWAkQqZKDJCPU7LMEQKzClZs4LYA04Vv32\n"
"WFbeSVh3tK6j92tQ8mbtUep1S/dye9j72P1WQxdd2uJrwzQgA3ftEoVJ6lOMEcBS\n"
"cR4lfCdFbQMSwfRI3g2BKPfuYZ+Vp90rF/0Si2kNd1CrBYdLhoZFvPFBapdcK9g/\n"
"QzBXfoLQb7MZkR3o8HtUOzcmEl7fhvO/8PEh5hJgn/hnLlFW0TIrqd/ag+n4U17V\n"
"isDHS13eaSPE7qq1xhfeTda2QBk9/wIDAQABo4ICwDCCArwwHAYDVR0RBBUwE4IR\n"
"aWRwLnN3aXNzc2lnbi5uZXQwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsG\n"
"AQUFBwMBBggrBgEFBQcDAjAdBgNVHQ4EFgQUs/yd7N1TLOjtmtcB+S16SzcX5W8w\n"
"HwYDVR0jBBgwFoAUiHRGbcd8tfpycRnevydeDWjg9ycwgf8GA1UdHwSB9zCB9DBH\n"
"oEWgQ4ZBaHR0cDovL2NybC5zd2lzc3NpZ24ubmV0Lzg4NzQ0NjZEQzc3Q0I1RkE3\n"
"MjcxMTlERUJGMjc1RTBENjhFMEY3MjcwgaiggaWggaKGgZ9sZGFwOi8vZGlyZWN0\n"
"b3J5LnN3aXNzc2lnbi5uZXQvQ049ODg3NDQ2NkRDNzdDQjVGQTcyNzExOURFQkYy\n"
"NzVFMEQ2OEUwRjcyNyUyQ089U3dpc3NTaWduJTJDQz1DSD9jZXJ0aWZpY2F0ZVJl\n"
"dm9jYXRpb25MaXN0P2Jhc2U/b2JqZWN0Q2xhc3M9Y1JMRGlzdHJpYnV0aW9uUG9p\n"
"bnQwYgYDVR0gBFswWTBXBglghXQBWQECAQEwSjBIBggrBgEFBQcCARY8aHR0cDov\n"
"L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS9Td2lzc1NpZ24tR29sZC1DUC1DUFMt\n"
"UjQucGRmMIHGBggrBgEFBQcBAQSBuTCBtjBkBggrBgEFBQcwAoZYaHR0cDovL3N3\n"
"aXNzc2lnbi5uZXQvY2dpLWJpbi9hdXRob3JpdHkvZG93bmxvYWQvODg3NDQ2NkRD\n"
"NzdDQjVGQTcyNzExOURFQkYyNzVFMEQ2OEUwRjcyNzBOBggrBgEFBQcwAYZCaHR0\n"
"cDovL29jc3Auc3dpc3NzaWduLm5ldC84ODc0NDY2REM3N0NCNUZBNzI3MTE5REVC\n"
"RjI3NUUwRDY4RTBGNzI3MA0GCSqGSIb3DQEBBQUAA4IBAQCNpT2u/s/IKqXrWmHX\n"
"TTVbW2Kh8xul9jLole+hWXtx8Ln4E8oW+bV25HGUjt8QrC1wXGABRCijgIjQ8PtR\n"
"CQrcwJCmC9ShcckP7KXiaETaT67TUB8qIQ/pf3akNeWKcdFGcD6CDYM7umuu1Q1X\n"
"326mufNviiqlU0uoK1LJQHhme3HMHarYdzkuIeShvIYHUYP3JnorXaizcCqjBhdF\n"
"rj4QcCZx8hKE6gmNL+dJkBM/5CSqByy15tMs2qa0iMdwkPUiNxlL0VuZkwzooVQx\n"
"1eKQwsSx3807MkQMKs+4v1LexkY+5/xU9dvtyRysjuSEWS8yCx3+E3fOOVAIX5jD\n"
"0uSX\n"
"-----END CERTIFICATE-----");
const QByteArray SWISSSIGN_SERVER_GOLD_CA_2008_G2
("-----BEGIN CERTIFICATE-----\n"
"MIIGXjCCBEagAwIBAgIIXsz6acAzJ+8wDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UE\n"
@ -185,6 +225,7 @@ int main(int argv, char** argc) try {
//............................................................................
QSslConfiguration sslConfig(QSslConfiguration::defaultConfiguration());
QList<QSslCertificate> certs(sslConfig.caCertificates());
certs.push_back(QSslCertificate(SWISSSIGN_EV_GOLD_CA_2009_G2));
certs.push_back(QSslCertificate(SWISSSIGN_GOLD_CA_G2));
//certs.push_back(QSslCertificate(SWISSSIGN_SERVER_GOLD_CA_2008_G2));
certs.push_back(QSslCertificate(SWISSSIGN_SILVER_CA_G2));
@ -326,6 +367,7 @@ int main(int argv, char** argc) try {
}
sslConfig.setPeerVerifyMode(QSslSocket::VerifyPeer);
QSslConfiguration::setDefaultConfiguration(sslConfig);
assert(QSslConfiguration::defaultConfiguration().caCertificates().contains(SWISSSIGN_EV_GOLD_CA_2009_G2));
assert(QSslConfiguration::defaultConfiguration().caCertificates().contains(SWISSSIGN_GOLD_CA_G2));
//assert(QSslConfiguration::defaultConfiguration().caCertificates().contains(SWISSSIGN_SERVER_GOLD_CA_2008_G2))));
assert(QSslConfiguration::defaultConfiguration().caCertificates().contains(SWISSSIGN_SILVER_CA_G2));

@ -3,6 +3,9 @@ CONFIG += no_keywords
QMAKE_LIBS += -lproxyface -lcryptoki++ -lssl -lcrypto
unix {
!macx {
CONFIG += debug
}
}
macx {
QMAKE_INCDIR += /opt/local/include

@ -117,6 +117,16 @@ class Settings: public QDialog, protected Ui::Settings {
return _mimetypes;
}
QStringList mimetype(QString mimetype, QString filename) const {
Settings::MimeTypes::const_iterator
it(_mimetypes.find(mimetype.split(';')[0]));
if (it!=_mimetypes.end()) return it.value().toStringList();
for (it=_mimetypes.begin(); it!=_mimetypes.end(); ++it)
if (filename.endsWith("."+it.value().toStringList().at(0)))
return it.value().toStringList();
return QStringList();
}
QString& replaceSearchEngine(QString& url) {
LOG;
int len(url.indexOf(QRegExp("[ :]")));

@ -34,42 +34,79 @@ class CryptokiEngine: public QObject, public openssl::Engine {
operator bool() {
OPENSSL_LOG("Status of CryptokiEngine: "
<<(_privateKey.get()
?"privateKey defined, ":"privateKey undefined")
<<(_cert.get()?"cert defined":"cert undefined"));
return _privateKey.get() && _cert.get();
?"privateKey defined, ":"privateKey undefined"));
return _privateKey.get();
}
cryptoki::Init& cryptoki() {
return _cryptoki;
}
void cert(cryptoki::Object privateKey, std::auto_ptr<openssl::X509> c) {
void cert(cryptoki::Object& privateKey, const std::string& certVal) {
OPENSSL_LOG("log");
_cert = c;
_privateKey = std::auto_ptr<cryptoki::Object>
(new cryptoki::Object(privateKey));
_modulus = privateKey.attribute(CKA_MODULUS).value;
_exponent = privateKey.attribute(CKA_PUBLIC_EXPONENT).value;
try { // new
QSslConfiguration sslConfig(QSslConfiguration::defaultConfiguration());
QSslCertificate localcert(QByteArray(certVal.data(),
certVal.size()),
QSsl::Der);
sslConfig.setLocalCertificate(localcert);
assert(localcert.isValid());
QByteArray pem // empty dummy key for qt object instantiation
("-----BEGIN RSA PRIVATE KEY-----\n"
"MIIBOwIBAAJBAMH2yqAGeVNPdgeZ2GoHo"
"31m9aUxZ7QfK2Go2qLTahLpQ3UL1C8G\n"
"LkuMS8SNK0ZGfRMalIpIhv6bW5l3kjogO"
"ncCAwEAAQJABVGECtFCoGMsZFb2lSmy\n"
"dOzOzYHGSy0TnnDn1dEgNnZ8sIljElPtU"
"zm9dyXs2P3ICL1sOd7qjpzfJeyxknDL\n"
"AQIhAO5iKdLmhyuW+EDEH19vDs1Pmqs3/"
"ZnT5UgUiJnTJqz3AiEA0ExIfUOCnxq2\n"
"a3Z46KEivcr8JB2P9VqouBbVryiq/oECI"
"QDj8bPCejMoiEzMSX0iWWTTB9qC/KAg\n"
"FtF4skHIrXKfEwIgPCs86Uo+Ch2aQjKHv"
"JMHSRHAgeI0OmiEwiB+e0lhE4ECIQDd\n"
"IbUmHIXt6oHLJmoGFX46bCcfil5eE5FXf"
"iaw7Q9iPw==\n"
"-----END RSA PRIVATE KEY-----\n");
QSslKey privkey(pem, QSsl::Rsa, QSsl::Pem, QSsl::PrivateKey);
RSA* rsa(0);
do {
rsa = ((RSA*)privkey.handle());
RSA_free(rsa); //→ occasional crashes?
rsa = RSA_new_method(_e);
set(rsa->n, privateKey, CKA_MODULUS, "CKA_MODULUS");
set(rsa->e, privateKey, CKA_PUBLIC_EXPONENT, "CKA_PUBLIC_EXPONENT");
set(rsa->d, privateKey, CKA_PRIVATE_EXPONENT, "CKA_PRIVATE_EXPONENT");
set(rsa->p, privateKey, CKA_PRIME_1, "CKA_PRIME_1");
set(rsa->q, privateKey, CKA_PRIME_2, "CKA_PRIME_2");
set(rsa->dmp1, privateKey, CKA_EXPONENT_1, "CKA_EXPONENT_1");
set(rsa->dmq1, privateKey, CKA_EXPONENT_2, "CKA_EXPONENT_2");
set(rsa->iqmp, privateKey, CKA_COEFFICIENT, "CKA_COEFFICIENT");
rsa->flags |= RSA_FLAG_SIGN_VER; // don't emulate with encrypt/decrypt
assert(!privkey.isNull());
} while (rsa!=(RSA*)privkey.handle());
sslConfig.setPrivateKey(privkey);
QSslConfiguration::setDefaultConfiguration(sslConfig);
} catch (const std::exception& e) {
OPENSSL_LOG("SETUP ERROR: "<<e.what());
}
}
const openssl::X509& cert() {
return *_cert;
}
protected:
virtual RSA* setupRsa(RSA* r) {
RSA_free(r); //→ occasional crashes?
r = RSA_new_method(_e);
r->n = BN_bin2bn((const unsigned char*)_modulus.data(),
_modulus.size(), r->n);
r->e = BN_bin2bn((const unsigned char*)_exponent.data(),
_exponent.size(), r->e);
// otherwise OpenSSL emulates sign/verify with encrypt/decrypt
r->flags |= RSA_FLAG_SIGN_VER;
return r;
void set(BIGNUM*& num, cryptoki::Object& key, int type, std::string name) {
try {
std::string value(key.attribute(type).value);
num = BN_bin2bn((const unsigned char*)value.data(),
value.size(), num);
} catch (const std::exception& x) {
qDebug()<<"**** ERROR: key attribute missing:"<<name.c_str()<<x.what();
}
}
protected:
virtual const char* id() {
OPENSSL_LOG("log");
return "CryptokiEngine_ID";
@ -85,16 +122,18 @@ class CryptokiEngine: public QObject, public openssl::Engine {
if (type != NID_md5_sha1) throw std::runtime_error("wrong sign type");
if (in.size() != 36) throw std::runtime_error("wrong msg size to sign");
OPENSSL_LOG("ready to sign");
return _privateKey->sign(in, CKM_RSA_PKCS);
try {
return _privateKey->sign(in, CKM_RSA_PKCS);
} catch (const std::exception& x) {
certRequired(); // get new certificate
return _privateKey->sign(in, CKM_RSA_PKCS); // try again
}
}
private:
cryptoki::Init _cryptoki;
std::string _modulus;
std::string _exponent;
std::auto_ptr<cryptoki::Object> _privateKey;
std::auto_ptr<openssl::X509> _cert;
};
@ -104,36 +143,24 @@ class SmartCardAuth: public QObject {
public:
SmartCardAuth(const QString& lib, QWidget* p=0, bool loginAtStart=true):
_reg(e(lib)), _parent(p) {
_parent(p), _e(new CryptokiEngine(lib.toStdString())), _reg(_e) {
qDebug()<<__PRETTY_FUNCTION__;
if (loginAtStart) login();
//assert(connect(e(), SIGNAL(certRequired()), SLOT(login())));
assert(connect(_e, SIGNAL(certRequired()), SLOT(login())));
}
static CryptokiEngine* e(const QString& lib = QString()) try {
static CryptokiEngine* _e(new CryptokiEngine(lib.toStdString()));
return _e;
} catch (const std::exception& e) {
qDebug()<<"Smartcard Error: "<<e.what();
return 0;
}
public Q_SLOTS:
private:
openssl::RegisterEngine<CryptokiEngine> _reg;
//std::map<ssl_ctx_st*, QSslSocket*> sockets;
public:
void login(bool force=false) {
void login(bool force=true) {
qDebug()<<__PRETTY_FUNCTION__;
QMutexLocker lock(&_mutex);
if (!e() || (!force && *e())) return; // no smartcard or already logged in
if (!_e || (!force && *_e)) return; // no smartcard or already logged in
try {
QList<CertInfo> authcerts;
QList<CertInfo> allcerts;
QSslConfiguration sslConfig(QSslConfiguration::defaultConfiguration());
_slots = e()->cryptoki().slotList();
_slots = _e->cryptoki().slotList();
// look for login certificates ----------------------------------------
for (cryptoki::SlotList::iterator slot(_slots.begin());
slot!=_slots.end(); ++slot) {
_session =
@ -167,6 +194,7 @@ class SmartCardAuth: public QObject {
}
}
}
// get pin and install client certificate ------------------------------
if (!authcerts.isEmpty() || !allcerts.isEmpty()) {
CertInfo c(authcerts.size()?authcerts[0]:allcerts[0]);
PinEntry pinEntry(QSslCertificate(QByteArray(c.data.data(),
@ -174,7 +202,7 @@ class SmartCardAuth: public QObject {
QSsl::Der), _parent);
while (pinEntry.exec()==PinEntry::Accepted)
try {
_session =
_session = // session login with pin
std::auto_ptr<cryptoki::Session>
(new cryptoki::Session(*c.slot));
_session->login(pinEntry.pin().toStdString());
@ -184,42 +212,7 @@ class SmartCardAuth: public QObject {
c.id));
if (keys.size()==1) {
OPENSSL_LOG("**** found one private key");
e()->cert(keys[0],
std::auto_ptr<openssl::X509>
(new openssl::X509(c.data)));
try { // new
QSslConfiguration sslConfig(QSslConfiguration::defaultConfiguration());
QSslCertificate localcert(QByteArray(c.data.data(),
c.data.size()),
QSsl::Der);
sslConfig.setLocalCertificate(localcert);
assert(localcert.isValid());
QByteArray pem
("-----BEGIN RSA PRIVATE KEY-----\n"
"MIIBOwIBAAJBAMH2yqAGeVNPdgeZ2GoHo31m9aUxZ7QfK2"
"Go2qLTahLpQ3UL1C8G\n"
"LkuMS8SNK0ZGfRMalIpIhv6bW5l3kjogOncCAwEAAQJABV"
"GECtFCoGMsZFb2lSmy\n"
"dOzOzYHGSy0TnnDn1dEgNnZ8sIljElPtUzm9dyXs2P3ICL"
"1sOd7qjpzfJeyxknDL\n"
"AQIhAO5iKdLmhyuW+EDEH19vDs1Pmqs3/ZnT5UgUiJnTJq"
"z3AiEA0ExIfUOCnxq2\n"
"a3Z46KEivcr8JB2P9VqouBbVryiq/oECIQDj8bPCejMoiE"
"zMSX0iWWTTB9qC/KAg\n"
"FtF4skHIrXKfEwIgPCs86Uo+Ch2aQjKHvJMHSRHAgeI0Om"
"iEwiB+e0lhE4ECIQDd\n"
"IbUmHIXt6oHLJmoGFX46bCcfil5eE5FXfiaw7Q9iPw==\n"
"-----END RSA PRIVATE KEY-----\n");
QSslKey privkey(pem, QSsl::Rsa, QSsl::Pem, QSsl::PrivateKey);
e()->setupRsa((RSA*)privkey.handle());
assert(!privkey.isNull());
sslConfig.setPrivateKey(privkey);
QSslConfiguration::setDefaultConfiguration(sslConfig);
} catch (const std::exception& e) {
OPENSSL_LOG("SETUP ERROR: "<<e.what());
}
_e->cert(keys[0], c.data); // install client cert
break;
}
} catch (std::exception& x) {
@ -250,9 +243,12 @@ class SmartCardAuth: public QObject {
private:
QWidget* _parent;
CryptokiEngine* _e;
openssl::RegisterEngine<CryptokiEngine> _reg;
cryptoki::SlotList _slots;
std::auto_ptr<cryptoki::Session> _session;
QMutex _mutex;
//std::map<ssl_ctx_st*, QSslSocket*> sockets;
// std::list<std::string> _cacerts;
};

@ -236,98 +236,98 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="428"/>
<location filename="browser.hxx" line="433"/>
<source>Checking: %1</source>
<oldsource>Opening: %1</oldsource>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="446"/>
<location filename="browser.hxx" line="451"/>
<source>Reading: %1</source>
<oldsource>Reading: %1%</oldsource>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="461"/>
<location filename="browser.hxx" line="466"/>
<source>Zoom: %1%</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="448"/>
<location filename="browser.hxx" line="453"/>
<source>Illegal URL: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="510"/>
<location filename="browser.hxx" line="515"/>
<source>Print Document</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="531"/>
<location filename="browser.hxx" line="536"/>
<source>%1 - %2</source>
<oldsource>Back to %1 - %2</oldsource>
<comment>statusbar actionBack_hovered %1=url %2=title</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="673"/>
<location filename="browser.hxx" line="678"/>
<source>Info: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="686"/>
<location filename="browser.hxx" line="691"/>
<source>done.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="686"/>
<location filename="browser.hxx" line="691"/>
<source>page load error.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="939"/>
<location filename="browser.hxx" line="944"/>
<source>%1</source>
<comment>statusbar for hovered link %1=url</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="438"/>
<location filename="browser.hxx" line="443"/>
<source>Forbidden: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="432"/>
<location filename="browser.hxx" line="437"/>
<source>SSL Not Supported</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="433"/>
<location filename="browser.hxx" line="438"/>
<source>SSL is not supported on your system</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="439"/>
<location filename="browser.hxx" line="444"/>
<source>Access Denied</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="440"/>
<location filename="browser.hxx" line="445"/>
<source>&lt;p&gt;Access denied due to security considerations.&lt;/p&gt;&lt;p&gt;You are not allowed to connect to %1.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="550"/>
<location filename="browser.hxx" line="555"/>
<source>%1 - %2</source>
<comment>statusbar actionForward_hovered %1=url %2=title</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="618"/>
<location filename="browser.hxx" line="623"/>
<source>About</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="619"/>
<location filename="browser.hxx" line="624"/>
<source>SwissSurfer %1 (%2)
%3
@ -341,22 +341,22 @@ Compiled: qt-%5</oldsource>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="668"/>
<location filename="browser.hxx" line="673"/>
<source>%1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="1070"/>
<location filename="browser.hxx" line="1074"/>
<source>Save File As ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="1133"/>
<location filename="browser.hxx" line="1137"/>
<source>authentication required</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="1145"/>
<location filename="browser.hxx" line="1149"/>
<source>ssl error</source>
<translation type="unfinished"></translation>
</message>
@ -582,12 +582,12 @@ p, li { white-space: pre-wrap; }
<context>
<name>QMessageBox</name>
<message>
<location filename="smartcardauth.hxx" line="228"/>
<location filename="smartcardauth.hxx" line="219"/>
<source>Wrong PIN</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="smartcardauth.hxx" line="229"/>
<location filename="smartcardauth.hxx" line="220"/>
<source>Authentication failed, please try again.</source>
<translation type="unfinished"></translation>
</message>
@ -595,7 +595,7 @@ p, li { white-space: pre-wrap; }
<context>
<name>QObject</name>
<message>
<location filename="main.cxx" line="249"/>
<location filename="main.cxx" line="290"/>
<source>Usage: %1 [OPTIONS...] [&lt;url&gt; ...]
Options:
-h, --help show this help text
@ -643,27 +643,27 @@ Environment:
<translation type="unfinished"></translation>
</message>
<message>
<location filename="main.cxx" line="294"/>
<location filename="main.cxx" line="335"/>
<source>Cannot read PEM certificate from file: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="main.cxx" line="300"/>
<location filename="main.cxx" line="341"/>
<source>Read PEM certificates from file: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="main.cxx" line="307"/>
<location filename="main.cxx" line="348"/>
<source>Cannot read PEM RSA key from file: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="main.cxx" line="312"/>
<location filename="main.cxx" line="353"/>
<source>Read private key from file: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="main.cxx" line="323"/>
<location filename="main.cxx" line="364"/>
<source>Too few arguments.
Try: %1 --help</source>
<translation type="unfinished"></translation>

@ -236,98 +236,98 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="428"/>
<location filename="browser.hxx" line="433"/>
<source>Checking: %1</source>
<oldsource>Opening: %1</oldsource>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="446"/>
<location filename="browser.hxx" line="451"/>
<source>Reading: %1</source>
<oldsource>Reading: %1%</oldsource>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="461"/>
<location filename="browser.hxx" line="466"/>
<source>Zoom: %1%</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="448"/>
<location filename="browser.hxx" line="453"/>
<source>Illegal URL: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="510"/>
<location filename="browser.hxx" line="515"/>
<source>Print Document</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="531"/>
<location filename="browser.hxx" line="536"/>
<source>%1 - %2</source>
<oldsource>Back to %1 - %2</oldsource>
<comment>statusbar actionBack_hovered %1=url %2=title</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="673"/>
<location filename="browser.hxx" line="678"/>
<source>Info: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="686"/>
<location filename="browser.hxx" line="691"/>
<source>done.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="686"/>
<location filename="browser.hxx" line="691"/>
<source>page load error.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="939"/>
<location filename="browser.hxx" line="944"/>
<source>%1</source>
<comment>statusbar for hovered link %1=url</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="438"/>
<location filename="browser.hxx" line="443"/>
<source>Forbidden: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="432"/>
<location filename="browser.hxx" line="437"/>
<source>SSL Not Supported</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="433"/>
<location filename="browser.hxx" line="438"/>
<source>SSL is not supported on your system</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="439"/>
<location filename="browser.hxx" line="444"/>
<source>Access Denied</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="440"/>
<location filename="browser.hxx" line="445"/>
<source>&lt;p&gt;Access denied due to security considerations.&lt;/p&gt;&lt;p&gt;You are not allowed to connect to %1.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="550"/>
<location filename="browser.hxx" line="555"/>
<source>%1 - %2</source>
<comment>statusbar actionForward_hovered %1=url %2=title</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="618"/>
<location filename="browser.hxx" line="623"/>
<source>About</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="619"/>
<location filename="browser.hxx" line="624"/>
<source>SwissSurfer %1 (%2)
%3
@ -341,22 +341,22 @@ Compiled: qt-%5</oldsource>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="668"/>
<location filename="browser.hxx" line="673"/>
<source>%1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="1070"/>
<location filename="browser.hxx" line="1074"/>
<source>Save File As ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="1133"/>
<location filename="browser.hxx" line="1137"/>
<source>authentication required</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="1145"/>
<location filename="browser.hxx" line="1149"/>
<source>ssl error</source>
<translation type="unfinished"></translation>
</message>
@ -582,12 +582,12 @@ p, li { white-space: pre-wrap; }
<context>
<name>QMessageBox</name>
<message>
<location filename="smartcardauth.hxx" line="228"/>
<location filename="smartcardauth.hxx" line="219"/>
<source>Wrong PIN</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="smartcardauth.hxx" line="229"/>
<location filename="smartcardauth.hxx" line="220"/>
<source>Authentication failed, please try again.</source>
<translation type="unfinished"></translation>
</message>
@ -595,7 +595,7 @@ p, li { white-space: pre-wrap; }
<context>
<name>QObject</name>
<message>
<location filename="main.cxx" line="249"/>
<location filename="main.cxx" line="290"/>
<source>Usage: %1 [OPTIONS...] [&lt;url&gt; ...]
Options:
-h, --help show this help text
@ -643,27 +643,27 @@ Environment:
<translation type="unfinished"></translation>
</message>
<message>
<location filename="main.cxx" line="294"/>
<location filename="main.cxx" line="335"/>
<source>Cannot read PEM certificate from file: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="main.cxx" line="300"/>
<location filename="main.cxx" line="341"/>
<source>Read PEM certificates from file: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="main.cxx" line="307"/>
<location filename="main.cxx" line="348"/>
<source>Cannot read PEM RSA key from file: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="main.cxx" line="312"/>
<location filename="main.cxx" line="353"/>
<source>Read private key from file: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="main.cxx" line="323"/>
<location filename="main.cxx" line="364"/>
<source>Too few arguments.
Try: %1 --help</source>
<translation type="unfinished"></translation>

@ -236,98 +236,98 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="428"/>
<location filename="browser.hxx" line="433"/>
<source>Checking: %1</source>
<oldsource>Opening: %1</oldsource>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="446"/>
<location filename="browser.hxx" line="451"/>
<source>Reading: %1</source>
<oldsource>Reading: %1%</oldsource>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="461"/>
<location filename="browser.hxx" line="466"/>
<source>Zoom: %1%</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="448"/>
<location filename="browser.hxx" line="453"/>
<source>Illegal URL: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="510"/>
<location filename="browser.hxx" line="515"/>
<source>Print Document</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="531"/>
<location filename="browser.hxx" line="536"/>
<source>%1 - %2</source>
<oldsource>Back to %1 - %2</oldsource>
<comment>statusbar actionBack_hovered %1=url %2=title</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="673"/>
<location filename="browser.hxx" line="678"/>
<source>Info: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="686"/>
<location filename="browser.hxx" line="691"/>
<source>done.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="686"/>
<location filename="browser.hxx" line="691"/>
<source>page load error.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="939"/>
<location filename="browser.hxx" line="944"/>
<source>%1</source>
<comment>statusbar for hovered link %1=url</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="438"/>
<location filename="browser.hxx" line="443"/>
<source>Forbidden: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="432"/>
<location filename="browser.hxx" line="437"/>
<source>SSL Not Supported</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="433"/>
<location filename="browser.hxx" line="438"/>
<source>SSL is not supported on your system</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="439"/>
<location filename="browser.hxx" line="444"/>
<source>Access Denied</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="440"/>
<location filename="browser.hxx" line="445"/>
<source>&lt;p&gt;Access denied due to security considerations.&lt;/p&gt;&lt;p&gt;You are not allowed to connect to %1.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="550"/>
<location filename="browser.hxx" line="555"/>
<source>%1 - %2</source>
<comment>statusbar actionForward_hovered %1=url %2=title</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="618"/>
<location filename="browser.hxx" line="623"/>
<source>About</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="619"/>
<location filename="browser.hxx" line="624"/>
<source>SwissSurfer %1 (%2)
%3
@ -341,22 +341,22 @@ Compiled: qt-%5</oldsource>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="668"/>
<location filename="browser.hxx" line="673"/>
<source>%1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="1070"/>
<location filename="browser.hxx" line="1074"/>
<source>Save File As ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="1133"/>
<location filename="browser.hxx" line="1137"/>
<source>authentication required</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="1145"/>
<location filename="browser.hxx" line="1149"/>
<source>ssl error</source>
<translation type="unfinished"></translation>
</message>
@ -582,12 +582,12 @@ p, li { white-space: pre-wrap; }
<context>
<name>QMessageBox</name>
<message>
<location filename="smartcardauth.hxx" line="228"/>
<location filename="smartcardauth.hxx" line="219"/>
<source>Wrong PIN</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="smartcardauth.hxx" line="229"/>
<location filename="smartcardauth.hxx" line="220"/>
<source>Authentication failed, please try again.</source>
<translation type="unfinished"></translation>
</message>
@ -595,7 +595,7 @@ p, li { white-space: pre-wrap; }
<context>
<name>QObject</name>
<message>
<location filename="main.cxx" line="249"/>
<location filename="main.cxx" line="290"/>
<source>Usage: %1 [OPTIONS...] [&lt;url&gt; ...]
Options:
-h, --help show this help text
@ -643,27 +643,27 @@ Environment:
<translation type="unfinished"></translation>
</message>
<message>
<location filename="main.cxx" line="294"/>
<location filename="main.cxx" line="335"/>
<source>Cannot read PEM certificate from file: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="main.cxx" line="300"/>
<location filename="main.cxx" line="341"/>
<source>Read PEM certificates from file: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="main.cxx" line="307"/>
<location filename="main.cxx" line="348"/>
<source>Cannot read PEM RSA key from file: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="main.cxx" line="312"/>
<location filename="main.cxx" line="353"/>
<source>Read private key from file: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="main.cxx" line="323"/>
<location filename="main.cxx" line="364"/>
<source>Too few arguments.
Try: %1 --help</source>
<translation type="unfinished"></translation>

@ -236,98 +236,98 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="428"/>
<location filename="browser.hxx" line="433"/>
<source>Checking: %1</source>
<oldsource>Opening: %1</oldsource>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="446"/>
<location filename="browser.hxx" line="451"/>
<source>Reading: %1</source>
<oldsource>Reading: %1%</oldsource>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="461"/>
<location filename="browser.hxx" line="466"/>
<source>Zoom: %1%</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="448"/>
<location filename="browser.hxx" line="453"/>
<source>Illegal URL: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="510"/>
<location filename="browser.hxx" line="515"/>
<source>Print Document</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="531"/>
<location filename="browser.hxx" line="536"/>
<source>%1 - %2</source>
<oldsource>Back to %1 - %2</oldsource>
<comment>statusbar actionBack_hovered %1=url %2=title</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="673"/>
<location filename="browser.hxx" line="678"/>
<source>Info: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="686"/>
<location filename="browser.hxx" line="691"/>
<source>done.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="686"/>
<location filename="browser.hxx" line="691"/>
<source>page load error.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="939"/>
<location filename="browser.hxx" line="944"/>
<source>%1</source>
<comment>statusbar for hovered link %1=url</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="438"/>
<location filename="browser.hxx" line="443"/>
<source>Forbidden: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="432"/>
<location filename="browser.hxx" line="437"/>
<source>SSL Not Supported</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="433"/>
<location filename="browser.hxx" line="438"/>
<source>SSL is not supported on your system</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="439"/>
<location filename="browser.hxx" line="444"/>
<source>Access Denied</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="440"/>
<location filename="browser.hxx" line="445"/>
<source>&lt;p&gt;Access denied due to security considerations.&lt;/p&gt;&lt;p&gt;You are not allowed to connect to %1.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="550"/>
<location filename="browser.hxx" line="555"/>
<source>%1 - %2</source>
<comment>statusbar actionForward_hovered %1=url %2=title</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="618"/>
<location filename="browser.hxx" line="623"/>
<source>About</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="619"/>
<location filename="browser.hxx" line="624"/>
<source>SwissSurfer %1 (%2)
%3
@ -341,22 +341,22 @@ Compiled: qt-%5</oldsource>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="668"/>
<location filename="browser.hxx" line="673"/>
<source>%1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="1070"/>
<location filename="browser.hxx" line="1074"/>
<source>Save File As ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="1133"/>
<location filename="browser.hxx" line="1137"/>
<source>authentication required</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="browser.hxx" line="1145"/>
<location filename="browser.hxx" line="1149"/>
<source>ssl error</source>
<translation type="unfinished"></translation>
</message>
@ -582,12 +582,12 @@ p, li { white-space: pre-wrap; }
<context>
<name>QMessageBox</name>
<message>
<location filename="smartcardauth.hxx" line="228"/>
<location filename="smartcardauth.hxx" line="219"/>
<source>Wrong PIN</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="smartcardauth.hxx" line="229"/>
<location filename="smartcardauth.hxx" line="220"/>
<source>Authentication failed, please try again.</source>
<translation type="unfinished"></translation>
</message>
@ -595,7 +595,7 @@ p, li { white-space: pre-wrap; }
<context>
<name>QObject</name>
<message>
<location filename="main.cxx" line="249"/>
<location filename="main.cxx" line="290"/>
<source>Usage: %1 [OPTIONS...] [&lt;url&gt; ...]
Options:
-h, --help show this help text
@ -643,27 +643,27 @@ Environment:
<translation type="unfinished"></translation>
</message>
<message>
<location filename="main.cxx" line="294"/>
<location filename="main.cxx" line="335"/>
<source>Cannot read PEM certificate from file: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="main.cxx" line="300"/>
<location filename="main.cxx" line="341"/>
<source>Read PEM certificates from file: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="main.cxx" line="307"/>
<location filename="main.cxx" line="348"/>
<source>Cannot read PEM RSA key from file: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="main.cxx" line="312"/>
<location filename="main.cxx" line="353"/>
<source>Read private key from file: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="main.cxx" line="323"/>
<location filename="main.cxx" line="364"/>
<source>Too few arguments.
Try: %1 --help</source>
<translation type="unfinished"></translation>

Loading…
Cancel
Save