diff --git a/swisssurfer/README b/swisssurfer/README index b03c32e..e2cd478 100644 --- a/swisssurfer/README +++ b/swisssurfer/README @@ -6,6 +6,6 @@ Zum Konfigurieren muss der Pfad zur Installation des gepatchten Qts angegeben we Start e.g. with: -SWISSSIGNER='java -Xmx256M -Dorg.jpedal.jai=true -Dswing.aatext=true -Dch.abacus.swisssigner.incamail.certlogin=false -splash:swisssigner-splash.png -Dch.abacus.pkcs11.configuration=swisssigner-pkcs11.cfg -Duser.language=de -cp /home/marc/downloads/swisssigner/swisssigner.jar:/home/marc/downloads/swisssigner/bc.jar:bcmail.jar:/home/marc/downloads/swisssigner/bcpg.jar:/home/marc/downloads/swisssigner/bctsp.jar:/home/marc/downloads/swisssigner/exml.jar:/home/marc/downloads/swisssigner/itext.jar:/home/marc/downloads/swisssigner/jai_codec.jar:/home/marc/downloads/swisssigner/jai_core.jar:/home/marc/downloads/swisssigner/jai_imageio.jar:/home/marc/downloads/swisssigner/jdic.jar:/home/marc/downloads/swisssigner/jdic_native.jar:/home/marc/downloads/swisssigner/jdic_stub_unix.jar:/home/marc/downloads/swisssigner/jpedal.jar: ch.abacus.hotdog.SwissSigner locale=de document= browser_bin=firefox keystores=pkcs11' +SWISSSIGNER='java -Xmx256M -Dorg.jpedal.jai=true -Dswing.aatext=true -Dch.abacus.swisssigner.incamail.certlogin=false -splash:swisssigner-splash.png -Dch.abacus.pkcs11.configuration=swisssigner-pkcs11.cfg -Duser.language=de -cp /home/marc/downloads/swisssigner/swisssigner.jar:/home/marc/downloads/swisssigner/bc.jar:bcmail.jar:/home/marc/downloads/swisssigner/bcpg.jar:/home/marc/downloads/swisssigner/bctsp.jar:/home/marc/downloads/swisssigner/exml.jar:/home/marc/downloads/swisssigner/itext.jar:/home/marc/downloads/swisssigner/jai_codec.jar:/home/marc/downloads/swisssigner/jai_core.jar:/home/marc/downloads/swisssigner/jai_imageio.jar:/home/marc/downloads/swisssigner/jdic.jar:/home/marc/downloads/swisssigner/jdic_native.jar:/home/marc/downloads/swisssigner/jdic_stub_unix.jar:/home/marc/downloads/swisssigner/jpedal.jar: ch.abacus.hotdog.SwissSigner locale=de document=%1 browser_bin=firefox keystores=pkcs11' -src/swisssurfer --mime application/pdf pdf "$SWISSSIGNER" --mime application/x-java-jnlp-file jnlp "javaws " http://swisssign.com/de/swisssign-support/ss-faq/7-server-certificates/34-how-to-apache-konfiguration-mit-ssl-zertifikaten +src/swisssurfer --mime application/pdf pdf "$SWISSSIGNER" --mime application/x-java-jnlp-file jnlp "javaws %1" http://swisssign.com/de/swisssign-support/ss-faq/7-server-certificates/34-how-to-apache-konfiguration-mit-ssl-zertifikaten diff --git a/swisssurfer/src/browser.hxx b/swisssurfer/src/browser.hxx index cf152dc..a7ed9bb 100644 --- a/swisssurfer/src/browser.hxx +++ b/swisssurfer/src/browser.hxx @@ -729,7 +729,7 @@ class Browser: public QMainWindow, protected Ui::Browser { void loadFinished(bool ok) { LOG<<(ok?"success":"error"); - if (ok) statusBar()->showMessage(tr("done.")); + statusBar()->showMessage(ok?tr("done."):tr("page load error.")); activateTab(); } @@ -1048,11 +1048,19 @@ class Browser: public QMainWindow, protected Ui::Browser { void unsupportedContent(QNetworkReply* reply) { LOG<header(QNetworkRequest::ContentTypeHeader).toString(); LOG<<"Status:"<error()); - assert(connect(reply, SIGNAL(finished()), SLOT(downloadFinished()))); + if (reply->isFinished()) + handleContent(reply); + else + assert(connect(reply, SIGNAL(finished()), SLOT(downloadFinished()))); } void downloadFinished() { + LOG; QNetworkReply *reply(qobject_cast(sender())); + handleContent(reply); + } + + void handleContent(QNetworkReply* reply) { LOG<<"Location:"<header(QNetworkRequest::LocationHeader) .toString(); LOG<<"Content-Type:"<header(QNetworkRequest::ContentTypeHeader) @@ -1063,7 +1071,8 @@ class Browser: public QMainWindow, protected Ui::Browser { LOG<<"Path:"<url().path(); Settings::MimeTypes::const_iterator it (_settings.mimetypes().find - (reply->header(QNetworkRequest::ContentTypeHeader).toString())); + (reply->header(QNetworkRequest::ContentTypeHeader).toString() + .split(';')[0])); if (it!=_settings.mimetypes().end()) { QTemporaryFile *file = new QTemporaryFile(QDir::tempPath()+QDir::separator() @@ -1097,6 +1106,7 @@ class Browser: public QMainWindow, protected Ui::Browser { } void processFinished() { + LOG; delete _downloadProcesses[qobject_cast(sender())]; _downloadProcesses.erase(qobject_cast(sender())); } diff --git a/swisssurfer/src/pindialog.cxx b/swisssurfer/src/pindialog.cxx deleted file mode 100644 index bc87307..0000000 --- a/swisssurfer/src/pindialog.cxx +++ /dev/null @@ -1,37 +0,0 @@ -#include -#include "pindialog.hxx" - - -PinDialog::PinDialog(QWidget *parent) - : QDialog(parent) -{ - label=new QLabel(tr("Enter &PIN:")); - lineEdit=new QLineEdit; - lineEdit->setEchoMode(QLineEdit::Password); - label->setBuddy(lineEdit); - - okButton=new QPushButton(tr("&OK")); - okButton->setDefault(true); - - cancelButton=new QPushButton(tr("&Cancel")); - - connect(okButton, SIGNAL(clicked()), this, SLOT(accept())); - connect(cancelButton, SIGNAL(clicked()), this, SLOT(reject())); - - QHBoxLayout* tl= new QHBoxLayout; - tl->addWidget(label); - tl->addWidget(lineEdit); - QHBoxLayout* bl= new QHBoxLayout; - bl->addStretch(); - bl->addWidget(okButton); - bl->addWidget(cancelButton); - QVBoxLayout* ml= new QVBoxLayout; - ml->addLayout(tl); - ml->addLayout(bl); - setLayout(ml); -} - -QString PinDialog::pin() const { - // TODO: Cleanup of internal strings as soon as the PIN is retrieved - return lineEdit ? lineEdit->text() : ""; -} diff --git a/swisssurfer/src/pindialog.hxx b/swisssurfer/src/pindialog.hxx deleted file mode 100644 index 712c203..0000000 --- a/swisssurfer/src/pindialog.hxx +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef PINDIALOG_H -#define PINDIALOG_H - -#include -class QLabel; -class QLineEdit; -class QPushButton; - -class PinDialog : public QDialog -{ - Q_OBJECT -public: - PinDialog(QWidget *parent = 0); - QString pin() const; -private: - QLabel* label; - QLineEdit* lineEdit; - QPushButton* okButton; - QPushButton* cancelButton; -}; - -#endif // PINDIALOG_H diff --git a/swisssurfer/src/pinentry.hxx b/swisssurfer/src/pinentry.hxx new file mode 100644 index 0000000..b9c3f1b --- /dev/null +++ b/swisssurfer/src/pinentry.hxx @@ -0,0 +1,48 @@ +/*! @file + + @id $Id$ +*/ +// 1 2 3 4 5 6 7 8 +// 45678901234567890123456789012345678901234567890123456789012345678901234567890 + +#ifndef __PINDIALOG_HXX__ +#define __PINDIALOG_HXX__ + +#include +#include +#include +#include + +#include + +class PinEntry: public QDialog, public Ui::PinEntry { + Q_OBJECT; + public: + PinEntry(const QSslCertificate& cert, QWidget *parent=0): QDialog(parent) { + setupUi(this); + _commonName->setText(cert.subjectInfo(QSslCertificate::CommonName)); + _organization->setText(cert.subjectInfo(QSslCertificate::Organization)); + _email->setText(cert.alternateSubjectNames() + .find(QSsl::EmailEntry).value()); + _serial->setText(cert.serialNumber()); + _expiry->setText(cert.expiryDate().toString()); + _issuerCa->setText(cert.issuerInfo(QSslCertificate::CommonName)); + _commonName->setVisible(_commonName->text().size()); + _commonNameLabel->setVisible(_commonName->text().size()); + _organization->setVisible(_organization->text().size()); + _organizationLabel->setVisible(_organization->text().size()); + _email->setVisible(_email->text().size()); + _emailLabel->setVisible(_email->text().size()); + _serial->setVisible(_serial->text().size()); + _serialLabel->setVisible(_serial->text().size()); + _expiry->setVisible(_expiry->text().size()); + _expiryLabel->setVisible(_expiry->text().size()); + _issuerCa->setVisible(_issuerCa->text().size()); + _issuerCaLabel->setVisible(_issuerCa->text().size()); + } + QString pin() const { + return _pin->text(); + } +}; + +#endif diff --git a/swisssurfer/src/pinentry.ui b/swisssurfer/src/pinentry.ui index 8e31208..8fddc66 100644 --- a/swisssurfer/src/pinentry.ui +++ b/swisssurfer/src/pinentry.ui @@ -6,12 +6,12 @@ 0 0 - 389 - 218 + 351 + 369 - SwissSign Pin Entry + Certificate PIN Entry @@ -23,7 +23,7 @@ - Please enter your SwissSign Certificate PIN to authenticate yourself: + Please enter your Certificate PIN to authenticate: true @@ -43,10 +43,107 @@ - + + + QLineEdit::Password + + + + + + Certificate Information + + + + + + Common Name: + + + + + + + TextLabel + + + + + + + Organization: + + + + + + + TextLabel + + + + + + + E-Mail: + + + + + + + TextLabel + + + + + + + Serial + + + + + + + TextLabel + + + + + + + Expiry: + + + + + + + TextLabel + + + + + + + Issuer CA: + + + + + + + TextLabel + + + + + + diff --git a/swisssurfer/src/qmake.pro.in b/swisssurfer/src/qmake.pro.in index 0b3c397..0c4cb3a 100644 --- a/swisssurfer/src/qmake.pro.in +++ b/swisssurfer/src/qmake.pro.in @@ -1,5 +1,5 @@ QT += webkit network gui -CONFIG += debug +CONFIG += debug no_keywords QMAKE_LIBS += -lproxyface -lcryptoki++ -lssl -lcrypto QMAKE_INCDIR += ../../qt/qt-everywhere-opensource-src-4.6.3/include/Qt \ ../../openssl-act-engine/src/ @@ -20,9 +20,9 @@ TRANSLATIONS = @PACKAGENAME@_en.ts \ @PACKAGENAME@_fr.ts \ @PACKAGENAME@_it.ts -SOURCES = main.cxx smartcardauth.cxx pindialog.cxx webpage.cxx +SOURCES = main.cxx smartcardauth.cxx webpage.cxx -HEADERS = browser.hxx smartcardauth.hxx pindialog.hxx \ +HEADERS = browser.hxx smartcardauth.hxx pinentry.hxx \ downloadmanager.hxx settings.hxx sslclientnetworkmanager.hxx \ authentication.hxx webpage.hxx diff --git a/swisssurfer/src/smartcardauth.cxx b/swisssurfer/src/smartcardauth.cxx index 27d83b1..3feb9f6 100644 --- a/swisssurfer/src/smartcardauth.cxx +++ b/swisssurfer/src/smartcardauth.cxx @@ -10,72 +10,10 @@ #include #include #include - -ENGINE* e=0; -enum_certs_s* certs_found=0; -QWidget* parent=0; -bool pin_configured=false; -bool pin_rejected=false; -QMutex _mutex; - -SmartCardAuth::SmartCardAuth(const QString& actlib) { - //QSslSocketPrivate::ensureInitialized(); - - if (e || actlib.isEmpty()) return; - - ENGINE_load_dynamic(); - e = ENGINE_by_id("dynamic"); - Q_ASSERT(e); - - int r=ENGINE_ctrl_cmd_string(e, "SO_PATH", actlib.toStdString().c_str(), 0); - Q_ASSERT(r); - r=ENGINE_ctrl_cmd_string(e, "ID", "act", 0); - Q_ASSERT(r); - r=ENGINE_ctrl_cmd_string(e, "LIST_ADD", "1", 0); - Q_ASSERT(r); - r=ENGINE_ctrl_cmd_string(e, "LOAD", NULL, 0); - Q_ASSERT(r); - - if (!r) { - unsigned int err = 0; - while((err = ERR_get_error())) { - char *str = ERR_error_string(err, NULL); - fprintf(stderr,"%s\n", str); - } - } - - r=ENGINE_init(e); - -} - -SmartCardAuth::~SmartCardAuth() { - if (!e) return; - ENGINE_finish(e); - ENGINE_cleanup(); - e=0; -} - +/* std::map sockets; int client_cert_cb(SSL* ssl, X509 **x509, EVP_PKEY **pkey) { - if (!e) return 0; - while (!_mutex.tryLock()) QCoreApplication::processEvents(); - static std::set allowedUrls; - std::map::iterator it(sockets.find(ssl->ctx)); - if (it!=sockets.end()) { - if (allowedUrls.find(it->second->peerName())==allowedUrls.end()) { - if (QMessageBox::question(0, QObject::tr("Send Authentication?"), - QObject::tr("Do you want to authenticate yourself to" - " %1?") - .arg(it->second->peerName()), - QMessageBox::Yes|QMessageBox::No) - == QMessageBox::Yes) - allowedUrls.insert(it->second->peerName()); - else - return 0; - } - sockets.erase(it); - } // NB: Keep in mind that this function is called for EVERY SSL connection to be opened. @@ -150,35 +88,37 @@ int client_cert_cb(SSL* ssl, X509 **x509, EVP_PKEY **pkey) { _mutex.unlock(); return 1; } - +/* +/* void SmartCardAuth::extendedContextInitialization(ssl_ctx_st *ctx, QSslSocket *socket) { if (!e) return; - bool result = false; + bool result = false; - if(!certs_found) - result = (ENGINE_ctrl_cmd(e, "ENUM_CERTS", 0, &certs_found, NULL, 0) != 0); - else - result = true; + if(!certs_found) + result = (ENGINE_ctrl_cmd(e, "ENUM_CERTS", 0, &certs_found, NULL, 0) != 0); + else + result = true; #ifdef USE_CERTIFICATE_FILE - // Load a specific intermediate certificate from a file - //! @todo PEM-File - BIO* cert_file= BIO_new_file("swsign_interm.pem", "r"); - X509* interm=PEM_read_bio_X509(cert_file,NULL,NULL, NULL); - BIO_free(cert_file); - - SSL_CTX_add_extra_chain_cert(ctx,interm); + // Load a specific intermediate certificate from a file + //! @todo PEM-File + BIO* cert_file= BIO_new_file("swsign_interm.pem", "r"); + X509* interm=PEM_read_bio_X509(cert_file,NULL,NULL, NULL); + BIO_free(cert_file); + + SSL_CTX_add_extra_chain_cert(ctx,interm); #else - // Add all of the card's certificates without a private key as intermediate certs - for(size_t i=certs_found->num_certs;i--;) + // Add all of the card's certificates without a private key as intermediate certs + for(size_t i=certs_found->num_certs;i--;) { - if(certs_found->certificate[i].id == NULL) - SSL_CTX_add_extra_chain_cert(ctx, X509_dup(certs_found->certificate[i].cert)); + if(certs_found->certificate[i].id == NULL) + SSL_CTX_add_extra_chain_cert(ctx, X509_dup(certs_found->certificate[i].cert)); } #endif - - sockets[ctx] = socket; - SSL_CTX_set_client_cert_cb(ctx, client_cert_cb); + + sockets[ctx] = socket; + SSL_CTX_set_client_cert_cb(ctx, client_cert_cb); } + */ diff --git a/swisssurfer/src/smartcardauth.hxx b/swisssurfer/src/smartcardauth.hxx index 1d0357c..141fd03 100644 --- a/swisssurfer/src/smartcardauth.hxx +++ b/swisssurfer/src/smartcardauth.hxx @@ -3,20 +3,239 @@ #include #include +#include +#include +#include -#include +#include + +#include +#include +#include + +#include + +class CryptokiEngine: public openssl::Engine { + public: + CryptokiEngine(std::string lib): + _cryptoki(lib) { + OPENSSL_LOG("log"); + QSslConfiguration sslConfig(QSslConfiguration::defaultConfiguration()); + QList cacerts(sslConfig.caCertificates()); + QList authcerts; + QList allcerts; + QSslCertificate cert; + _slots = _cryptoki.slotList(); + for (cryptoki::SlotList::iterator slot(_slots.begin()); + slot!=_slots.end() && _pin.isEmpty(); ++slot) { + _session = + std::auto_ptr(new cryptoki::Session(*slot)); + cryptoki::ObjectList certs(_session->find + (cryptoki::Attribute(CKA_CLASS) + .from(CKO_CERTIFICATE))); + for (cryptoki::ObjectList::iterator cert(certs.begin()); + cert!=certs.end() && _pin.isEmpty(); ++cert) { + cryptoki::Attribute label(cert->attribute(CKA_LABEL)); + cryptoki::Attribute id(cert->attribute(CKA_ID)); + OPENSSL_LOG("**** FOUND CERTIFICATE: "<find(cryptoki::Attribute(CKA_CLASS) + .from(CKO_PUBLIC_KEY), + id)); + OPENSSL_LOG("**** with keys: "<attribute(CKA_VALUE).value); + cacerts.push_back(QSslCertificate + (QByteArray(data.data(), data.size()), + QSsl::Der)); + } else { + if (label.value.find("auth")==0) { + std::string data(cert->attribute(CKA_VALUE).value); + QSslCertificate c(QByteArray(data.data(), data.size()), + QSsl::Der); + PinEntry pinEntry(c); /*! @todo set widget */ + while (pinEntry.exec()==PinEntry::Accepted) + try { + cryptoki::Attribute value(cert->attribute(CKA_VALUE)); + _cert = std::auto_ptr + (new openssl::X509(value.value)); + _session->login(pinEntry.pin().toStdString()); + cryptoki::ObjectList keys + (_session->find(cryptoki::Attribute(CKA_CLASS) + .from(CKO_PRIVATE_KEY), + id)); + if (keys.size()==1) { + OPENSSL_LOG("**** found one private key"); + _privateKeys = keys; + _modulus = keys[0].attribute(CKA_MODULUS).value; + _exponent = keys[0].attribute(CKA_PUBLIC_EXPONENT).value; + } + _pin = pinEntry.pin(); + break; + } catch (std::exception& x) { + _pin.clear(); + OPENSSL_LOG("**** ERROR"<attribute(CKA_VALUE).value); + // allcerts.push_back(QSslCertificate + // (QByteArray(data.data(), data.size()), + // QSsl::Der)); + // if (label.value.find("auth")==0) { + // authcerts.push_back(*allcerts.rbegin()); + // } + } + } + } + sslConfig.setCaCertificates(cacerts); + } + //! Was initialization successful? + operator bool() { + return !_pin.isEmpty() && _cert.get() && _session.get(); + } + const openssl::X509& cert() { + return *_cert; + } + virtual EVP_PKEY* privkey(const char* id, UI_METHOD*, void*) { + EVP_PKEY* k(EVP_PKEY_new()); + RSA* 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; + EVP_PKEY_set1_RSA(k, r); + RSA_free(r); + return k; + } + + protected: + virtual const char* id() { + OPENSSL_LOG("log"); + return "CryptokiEngine_ID"; + } + virtual const char* name() { + OPENSSL_LOG("log"); + return "CryptokiEngine_NAME"; + } + virtual std::string rsaSign(const std::string& in, unsigned int type) { + std::string inModded(in); + + OPENSSL_LOG("log"); + OPENSSL_LOG("type="< sigsize)) { + throw std::runtime_error("the size is wrong"); + } + } else { + OPENSSL_LOG("It's not SSL"); + ASN1_TYPE parameter; + parameter.type = V_ASN1_NULL; + parameter.value.ptr = 0; + X509_ALGOR algor; + algor.algorithm = OBJ_nid2obj(type); + algor.parameter = ¶meter; + ASN1_STRING digest; + digest.data = (unsigned char *)inModded.data(); + digest.length = inModded.size(); + X509_SIG sig; + sig.algor = &algor; + sig.digest = &digest; + int size (i2d_X509_SIG(&sig, 0)); + if (!algor.algorithm) throw std::runtime_error("algor wrong nid"); + if (!algor.algorithm->length) + throw std::runtime_error("algor length"); + if (size) throw std::runtime_error("digest size"); + if (size + RSA_PKCS1_PADDING_SIZE < sigsize) + throw std::runtime_error("incompatible size"); + unsigned char* buf(new unsigned char[size]); + i2d_X509_SIG(&sig, &buf); + inModded.assign((char*)buf, size); + delete[] buf; + } + } + + //------------------------------------------------- PKCS11_private_encrypt + { + char padding(RSA_PKCS1_PADDING); + + if ((inModded.size() + RSA_PKCS1_PADDING_SIZE) > sigsize) + throw std::runtime_error("the size is wrong"); + } + + //----------------------------------------------------------------------- + if (in!=inModded) + OPENSSL_LOG("changed input"< _session; + QString _pin; + std::auto_ptr _cert; + std::string _modulus; + std::string _exponent; + cryptoki::ObjectList _privateKeys; +}; class SmartCardAuth: public QObject { Q_OBJECT; public: - - SmartCardAuth(const QString& actlib); - ~SmartCardAuth(); + + SmartCardAuth(const QString& lib): + _reg(e(lib)) { + qDebug()<<__PRETTY_FUNCTION__; + } private Q_SLOTS: - void extendedContextInitialization(ssl_ctx_st*, QSslSocket*); + void extendedContextInitialization(ssl_ctx_st* ctx, QSslSocket* socket) { + qDebug()<<__PRETTY_FUNCTION__; + if (!*e()) return; // no certificate found + SSL_CTX_set_client_cert_cb(ctx, clientCert); + } + + static int clientCert(SSL* ssl, X509 **x509, EVP_PKEY **pkey) { + qDebug()<<__PRETTY_FUNCTION__; + *x509 = e()->cert().lowLevelCopy(); + *pkey = e()->privkey(0, 0, 0); + return 1; + } + + static CryptokiEngine* e(const QString& lib = QString()) { + static CryptokiEngine* _e(new CryptokiEngine(lib.toStdString())); + return _e; + } + + private: + + openssl::RegisterEngine _reg; + //std::map sockets; }; diff --git a/swisssurfer/src/swisssurfer_de.ts b/swisssurfer/src/swisssurfer_de.ts index 860797e..3be1949 100644 --- a/swisssurfer/src/swisssurfer_de.ts +++ b/swisssurfer/src/swisssurfer_de.ts @@ -381,6 +381,11 @@ done. + + + page load error. + + %1 @@ -414,63 +419,92 @@ - + Save File As ... - + authentication required - + ssl error - PinDialog + PinEntry - - Enter &PIN: + + Certificate PIN Entry + SwissSign Pin Entry - - &OK + + Please enter your Certificate PIN to authenticate: + Please enter your SwissSign Certificate PIN to authenticate yourself: - - &Cancel + + PIN: - - - PinEntry - - SwissSign Pin Entry + + Certificate Information - - Please enter your SwissSign Certificate PIN to authenticate yourself: + + Common Name: - - PIN: + + + + + + + TextLabel + + + + + Organization: + + + + + E-Mail: - + + Serial + + + + + Expiry: + + + + + Issuer CA: + + + + You have %1 tries left - + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } @@ -479,6 +513,19 @@ p, li { white-space: pre-wrap; } + + QMessageBox + + + Wrong PIN + + + + + Authentication failed, please try again. + + + QObject @@ -532,16 +579,6 @@ Environment: Try: %1 --help - - - Send Authentication? - - - - - Do you want to authenticate yourself to %1? - - Settings diff --git a/swisssurfer/src/swisssurfer_en.ts b/swisssurfer/src/swisssurfer_en.ts index 860797e..3be1949 100644 --- a/swisssurfer/src/swisssurfer_en.ts +++ b/swisssurfer/src/swisssurfer_en.ts @@ -381,6 +381,11 @@ done. + + + page load error. + + %1 @@ -414,63 +419,92 @@ - + Save File As ... - + authentication required - + ssl error - PinDialog + PinEntry - - Enter &PIN: + + Certificate PIN Entry + SwissSign Pin Entry - - &OK + + Please enter your Certificate PIN to authenticate: + Please enter your SwissSign Certificate PIN to authenticate yourself: - - &Cancel + + PIN: - - - PinEntry - - SwissSign Pin Entry + + Certificate Information - - Please enter your SwissSign Certificate PIN to authenticate yourself: + + Common Name: - - PIN: + + + + + + + TextLabel + + + + + Organization: + + + + + E-Mail: - + + Serial + + + + + Expiry: + + + + + Issuer CA: + + + + You have %1 tries left - + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } @@ -479,6 +513,19 @@ p, li { white-space: pre-wrap; } + + QMessageBox + + + Wrong PIN + + + + + Authentication failed, please try again. + + + QObject @@ -532,16 +579,6 @@ Environment: Try: %1 --help - - - Send Authentication? - - - - - Do you want to authenticate yourself to %1? - - Settings diff --git a/swisssurfer/src/swisssurfer_fr.ts b/swisssurfer/src/swisssurfer_fr.ts index 860797e..3be1949 100644 --- a/swisssurfer/src/swisssurfer_fr.ts +++ b/swisssurfer/src/swisssurfer_fr.ts @@ -381,6 +381,11 @@ done. + + + page load error. + + %1 @@ -414,63 +419,92 @@ - + Save File As ... - + authentication required - + ssl error - PinDialog + PinEntry - - Enter &PIN: + + Certificate PIN Entry + SwissSign Pin Entry - - &OK + + Please enter your Certificate PIN to authenticate: + Please enter your SwissSign Certificate PIN to authenticate yourself: - - &Cancel + + PIN: - - - PinEntry - - SwissSign Pin Entry + + Certificate Information - - Please enter your SwissSign Certificate PIN to authenticate yourself: + + Common Name: - - PIN: + + + + + + + TextLabel + + + + + Organization: + + + + + E-Mail: - + + Serial + + + + + Expiry: + + + + + Issuer CA: + + + + You have %1 tries left - + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } @@ -479,6 +513,19 @@ p, li { white-space: pre-wrap; } + + QMessageBox + + + Wrong PIN + + + + + Authentication failed, please try again. + + + QObject @@ -532,16 +579,6 @@ Environment: Try: %1 --help - - - Send Authentication? - - - - - Do you want to authenticate yourself to %1? - - Settings diff --git a/swisssurfer/src/swisssurfer_it.ts b/swisssurfer/src/swisssurfer_it.ts index 860797e..3be1949 100644 --- a/swisssurfer/src/swisssurfer_it.ts +++ b/swisssurfer/src/swisssurfer_it.ts @@ -381,6 +381,11 @@ done. + + + page load error. + + %1 @@ -414,63 +419,92 @@ - + Save File As ... - + authentication required - + ssl error - PinDialog + PinEntry - - Enter &PIN: + + Certificate PIN Entry + SwissSign Pin Entry - - &OK + + Please enter your Certificate PIN to authenticate: + Please enter your SwissSign Certificate PIN to authenticate yourself: - - &Cancel + + PIN: - - - PinEntry - - SwissSign Pin Entry + + Certificate Information - - Please enter your SwissSign Certificate PIN to authenticate yourself: + + Common Name: - - PIN: + + + + + + + TextLabel + + + + + Organization: + + + + + E-Mail: - + + Serial + + + + + Expiry: + + + + + Issuer CA: + + + + You have %1 tries left - + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } @@ -479,6 +513,19 @@ p, li { white-space: pre-wrap; } + + QMessageBox + + + Wrong PIN + + + + + Authentication failed, please try again. + + + QObject @@ -532,16 +579,6 @@ Environment: Try: %1 --help - - - Send Authentication? - - - - - Do you want to authenticate yourself to %1? - - Settings