From ec169d58a15cf35e26b31c0a7e59c10848964123 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20W=C3=A4ckerlin?= Date: Wed, 1 Jun 2011 08:57:38 +0000 Subject: [PATCH] closes #56; closes #54 --- swisssurfer/src/browser.hxx | 30 +++--- swisssurfer/src/main.cxx | 42 ++++++++ swisssurfer/src/qmake.pro.in | 3 + swisssurfer/src/settings.hxx | 10 ++ swisssurfer/src/smartcardauth.hxx | 160 +++++++++++++++--------------- swisssurfer/src/swisssurfer_de.ts | 60 +++++------ swisssurfer/src/swisssurfer_en.ts | 60 +++++------ swisssurfer/src/swisssurfer_fr.ts | 60 +++++------ swisssurfer/src/swisssurfer_it.ts | 60 +++++------ 9 files changed, 270 insertions(+), 215 deletions(-) diff --git a/swisssurfer/src/browser.hxx b/swisssurfer/src/browser.hxx index 90422cd..d7f7c9d 100644 --- a/swisssurfer/src/browser.hxx +++ b/swisssurfer/src/browser.hxx @@ -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< + (new SmartCardAuth(actlib, this, login)); + } catch (const std::exception& x) { + LOG<<"No SmartCard Support:"<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:"<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:"< DownloadProcesses; DownloadProcesses _downloadProcesses; Settings _settings; - SmartCardAuth _scAuth; ErrorLog _errorLog; + std::auto_ptr _scAuth; }; #endif diff --git a/swisssurfer/src/main.cxx b/swisssurfer/src/main.cxx index beef76d..31a5125 100644 --- a/swisssurfer/src/main.cxx +++ b/swisssurfer/src/main.cxx @@ -26,6 +26,46 @@ #include +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 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)); diff --git a/swisssurfer/src/qmake.pro.in b/swisssurfer/src/qmake.pro.in index 426ff60..ffbd932 100644 --- a/swisssurfer/src/qmake.pro.in +++ b/swisssurfer/src/qmake.pro.in @@ -3,6 +3,9 @@ CONFIG += no_keywords QMAKE_LIBS += -lproxyface -lcryptoki++ -lssl -lcrypto unix { + !macx { + CONFIG += debug + } } macx { QMAKE_INCDIR += /opt/local/include diff --git a/swisssurfer/src/settings.hxx b/swisssurfer/src/settings.hxx index 2d754d2..e64e99e 100644 --- a/swisssurfer/src/settings.hxx +++ b/swisssurfer/src/settings.hxx @@ -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("[ :]"))); diff --git a/swisssurfer/src/smartcardauth.hxx b/swisssurfer/src/smartcardauth.hxx index 982aa98..da0d6a6 100644 --- a/swisssurfer/src/smartcardauth.hxx +++ b/swisssurfer/src/smartcardauth.hxx @@ -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 c) { + void cert(cryptoki::Object& privateKey, const std::string& certVal) { OPENSSL_LOG("log"); - _cert = c; _privateKey = std::auto_ptr (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: "<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:"<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 _privateKey; - std::auto_ptr _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()))); - } - - 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: "< _reg; - //std::map sockets; + public Q_SLOTS: - 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 authcerts; QList 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 (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 - (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: "<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 _reg; cryptoki::SlotList _slots; std::auto_ptr _session; QMutex _mutex; + //std::map sockets; // std::list _cacerts; }; diff --git a/swisssurfer/src/swisssurfer_de.ts b/swisssurfer/src/swisssurfer_de.ts index b1700b7..fef278a 100644 --- a/swisssurfer/src/swisssurfer_de.ts +++ b/swisssurfer/src/swisssurfer_de.ts @@ -236,98 +236,98 @@ - + Checking: %1 Opening: %1 - + Reading: %1 Reading: %1% - + Zoom: %1% - + Illegal URL: %1 - + Print Document - + %1 - %2 Back to %1 - %2 statusbar actionBack_hovered %1=url %2=title - + Info: %1 - + done. - + page load error. - + %1 statusbar for hovered link %1=url - + Forbidden: %1 - + SSL Not Supported - + SSL is not supported on your system - + Access Denied - + <p>Access denied due to security considerations.</p><p>You are not allowed to connect to %1. - + %1 - %2 statusbar actionForward_hovered %1=url %2=title - + About - + SwissSurfer %1 (%2) %3 @@ -341,22 +341,22 @@ Compiled: qt-%5 - + %1 - + Save File As ... - + authentication required - + ssl error @@ -582,12 +582,12 @@ p, li { white-space: pre-wrap; } QMessageBox - + Wrong PIN - + Authentication failed, please try again. @@ -595,7 +595,7 @@ p, li { white-space: pre-wrap; } QObject - + Usage: %1 [OPTIONS...] [<url> ...] Options: -h, --help show this help text @@ -643,27 +643,27 @@ Environment: - + Cannot read PEM certificate from file: %1 - + Read PEM certificates from file: %1 - + Cannot read PEM RSA key from file: %1 - + Read private key from file: %1 - + Too few arguments. Try: %1 --help diff --git a/swisssurfer/src/swisssurfer_en.ts b/swisssurfer/src/swisssurfer_en.ts index b1700b7..fef278a 100644 --- a/swisssurfer/src/swisssurfer_en.ts +++ b/swisssurfer/src/swisssurfer_en.ts @@ -236,98 +236,98 @@ - + Checking: %1 Opening: %1 - + Reading: %1 Reading: %1% - + Zoom: %1% - + Illegal URL: %1 - + Print Document - + %1 - %2 Back to %1 - %2 statusbar actionBack_hovered %1=url %2=title - + Info: %1 - + done. - + page load error. - + %1 statusbar for hovered link %1=url - + Forbidden: %1 - + SSL Not Supported - + SSL is not supported on your system - + Access Denied - + <p>Access denied due to security considerations.</p><p>You are not allowed to connect to %1. - + %1 - %2 statusbar actionForward_hovered %1=url %2=title - + About - + SwissSurfer %1 (%2) %3 @@ -341,22 +341,22 @@ Compiled: qt-%5 - + %1 - + Save File As ... - + authentication required - + ssl error @@ -582,12 +582,12 @@ p, li { white-space: pre-wrap; } QMessageBox - + Wrong PIN - + Authentication failed, please try again. @@ -595,7 +595,7 @@ p, li { white-space: pre-wrap; } QObject - + Usage: %1 [OPTIONS...] [<url> ...] Options: -h, --help show this help text @@ -643,27 +643,27 @@ Environment: - + Cannot read PEM certificate from file: %1 - + Read PEM certificates from file: %1 - + Cannot read PEM RSA key from file: %1 - + Read private key from file: %1 - + Too few arguments. Try: %1 --help diff --git a/swisssurfer/src/swisssurfer_fr.ts b/swisssurfer/src/swisssurfer_fr.ts index b1700b7..fef278a 100644 --- a/swisssurfer/src/swisssurfer_fr.ts +++ b/swisssurfer/src/swisssurfer_fr.ts @@ -236,98 +236,98 @@ - + Checking: %1 Opening: %1 - + Reading: %1 Reading: %1% - + Zoom: %1% - + Illegal URL: %1 - + Print Document - + %1 - %2 Back to %1 - %2 statusbar actionBack_hovered %1=url %2=title - + Info: %1 - + done. - + page load error. - + %1 statusbar for hovered link %1=url - + Forbidden: %1 - + SSL Not Supported - + SSL is not supported on your system - + Access Denied - + <p>Access denied due to security considerations.</p><p>You are not allowed to connect to %1. - + %1 - %2 statusbar actionForward_hovered %1=url %2=title - + About - + SwissSurfer %1 (%2) %3 @@ -341,22 +341,22 @@ Compiled: qt-%5 - + %1 - + Save File As ... - + authentication required - + ssl error @@ -582,12 +582,12 @@ p, li { white-space: pre-wrap; } QMessageBox - + Wrong PIN - + Authentication failed, please try again. @@ -595,7 +595,7 @@ p, li { white-space: pre-wrap; } QObject - + Usage: %1 [OPTIONS...] [<url> ...] Options: -h, --help show this help text @@ -643,27 +643,27 @@ Environment: - + Cannot read PEM certificate from file: %1 - + Read PEM certificates from file: %1 - + Cannot read PEM RSA key from file: %1 - + Read private key from file: %1 - + Too few arguments. Try: %1 --help diff --git a/swisssurfer/src/swisssurfer_it.ts b/swisssurfer/src/swisssurfer_it.ts index b1700b7..fef278a 100644 --- a/swisssurfer/src/swisssurfer_it.ts +++ b/swisssurfer/src/swisssurfer_it.ts @@ -236,98 +236,98 @@ - + Checking: %1 Opening: %1 - + Reading: %1 Reading: %1% - + Zoom: %1% - + Illegal URL: %1 - + Print Document - + %1 - %2 Back to %1 - %2 statusbar actionBack_hovered %1=url %2=title - + Info: %1 - + done. - + page load error. - + %1 statusbar for hovered link %1=url - + Forbidden: %1 - + SSL Not Supported - + SSL is not supported on your system - + Access Denied - + <p>Access denied due to security considerations.</p><p>You are not allowed to connect to %1. - + %1 - %2 statusbar actionForward_hovered %1=url %2=title - + About - + SwissSurfer %1 (%2) %3 @@ -341,22 +341,22 @@ Compiled: qt-%5 - + %1 - + Save File As ... - + authentication required - + ssl error @@ -582,12 +582,12 @@ p, li { white-space: pre-wrap; } QMessageBox - + Wrong PIN - + Authentication failed, please try again. @@ -595,7 +595,7 @@ p, li { white-space: pre-wrap; } QObject - + Usage: %1 [OPTIONS...] [<url> ...] Options: -h, --help show this help text @@ -643,27 +643,27 @@ Environment: - + Cannot read PEM certificate from file: %1 - + Read PEM certificates from file: %1 - + Cannot read PEM RSA key from file: %1 - + Read private key from file: %1 - + Too few arguments. Try: %1 --help