You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
287 lines
14 KiB
287 lines
14 KiB
/*! @file |
|
|
|
@id $Id: main.cxx 15 2010-06-03 14:17:27Z marc $ |
|
|
|
Build für Windoof: |
|
<code>QMAKESPEC=$(pwd)/mkspecs/mingw-g++ qmake-qt4 && make release</code> |
|
*/ |
|
// 1 2 3 4 5 6 7 8 |
|
// 45678901234567890123456789012345678901234567890123456789012345678901234567890 |
|
|
|
#include <QtGui/QApplication> |
|
#include <QtCore/QTranslator> |
|
#include <QtCore/QTextCodec> |
|
#include <QtCore/QLocale> |
|
#include <QtCore/QProcess> |
|
#include <QtCore/QFileInfo> |
|
#include <QtNetwork/QNetworkProxy> |
|
|
|
#include <QtNetwork/QSslConfiguration> |
|
#include <QtNetwork/QSslCertificate> |
|
#include <QtNetwork/QSslKey> |
|
|
|
#include <browser.hxx> |
|
#include <iostream> |
|
#include <sstream> |
|
|
|
#include <memory> |
|
|
|
SmartCardAuth _scAuth; |
|
|
|
const QByteArray SWISSSIGN_GOLD_CA_G2 |
|
("-----BEGIN CERTIFICATE-----\n" |
|
"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\n" |
|
"-----END CERTIFICATE-----\n"); |
|
const QByteArray SWISSSIGN_PLATINUM_CA_G2 |
|
("-----BEGIN CERTIFICATE-----\n" |
|
"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\n" |
|
"-----END CERTIFICATE-----\n"); |
|
const QByteArray SWISSSIGN_SILVER_CA_G2 |
|
("-----BEGIN CERTIFICATE-----\n" |
|
"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\n" |
|
"-----END CERTIFICATE-----\n"); |
|
|
|
void notrace(QtMsgType, const char*) { |
|
return; |
|
} |
|
|
|
int main(int argv, char** argc) try { |
|
// qInstallMsgHandler(notrace); |
|
// std::cout.rdbuf((new std::stringstream)->rdbuf()); |
|
// std::cerr.rdbuf((new std::stringstream)->rdbuf()); |
|
// std::clog.rdbuf((new std::stringstream)->rdbuf()); |
|
//............................................................................ |
|
QSslConfiguration sslConfig(QSslConfiguration::defaultConfiguration()); |
|
QList<QSslCertificate> certs(sslConfig.caCertificates()); |
|
certs.push_back(QSslCertificate(SWISSSIGN_GOLD_CA_G2)); |
|
certs.push_back(QSslCertificate(SWISSSIGN_SILVER_CA_G2)); |
|
certs.push_back(QSslCertificate(SWISSSIGN_PLATINUM_CA_G2)); |
|
sslConfig.setCaCertificates(certs); |
|
//............................................................................ |
|
QStringList l(QProcess::systemEnvironment()); |
|
QMap<QString, QString> env; |
|
for (QStringList::iterator it(l.begin()); it!=l.end(); ++it) { |
|
QStringList v(it->split('=')); |
|
QString key(*v.begin()); |
|
QString value((v.pop_front(), v.join("="))); |
|
env.insert(key, value); |
|
qDebug()<<"env:"<<key<<"="<<value; |
|
} |
|
//............................................................................ |
|
QTextCodec* utf8(QTextCodec::codecForName("UTF-8")); |
|
QTextCodec::setCodecForCStrings(utf8); |
|
QTextCodec::setCodecForLocale(utf8); |
|
QTextCodec::setCodecForTr(utf8); |
|
QApplication app(argv, argc); |
|
QTranslator qtTranslator; |
|
if (env.contains("LANGUAGE")) QLocale::setDefault(env["LANGUAGE"]); |
|
qtTranslator.load(":/language/qt_" + QLocale::system().name()); |
|
app.installTranslator(&qtTranslator); |
|
QTranslator appTranslator; |
|
appTranslator.load(":/language/swisssurfer_"+ QLocale::system().name()); |
|
app.installTranslator(&appTranslator); |
|
//............................................................................ |
|
QNetworkProxy::setApplicationProxy |
|
(QNetworkProxy |
|
((env["PROXY_TYPE"]=="http" |
|
? QNetworkProxy::HttpProxy |
|
: (env["PROXY_TYPE"]=="socks" |
|
? QNetworkProxy::Socks5Proxy |
|
: QNetworkProxy::NoProxy)), |
|
env["PROXY_HOST"], env["PROXY_PORT"].toInt())); |
|
qDebug()<<"***************************************************************"; |
|
qDebug()<<"Start - Proxy:" |
|
<<(QNetworkProxy::applicationProxy().type()==QNetworkProxy::NoProxy |
|
? "No Proxy" |
|
: (QNetworkProxy::applicationProxy().type() |
|
==QNetworkProxy::Socks5Proxy ? "socks" : "http")) |
|
<<"Hostname"<<QNetworkProxy::applicationProxy().hostName() |
|
<<"Port"<<QNetworkProxy::applicationProxy().port(); |
|
qDebug()<<"***************************************************************"; |
|
//---------------------------------------------------------------------------- |
|
QStringList urls; |
|
bool silent(false); |
|
Browser::MimeTypes mimetypes; |
|
QStringList args(app.arguments()); |
|
for (QStringList::iterator it(args.begin()); ++it!=args.end();) |
|
if (*it=="-h" || *it=="--help" || *it=="-help" || *it=="/?") { |
|
std::cout<<QObject::trUtf8 |
|
("Usage: %1 [OPTIONS...] [<url> ...]\n" |
|
"Options:\n" |
|
" -h, --help show this help text\n" |
|
" -k, --kiosk no url bar\n" |
|
" -c, --cert <file> load local client certificate from <file>\n" |
|
" -y, --key <file> load local certificate key from <file>\n" |
|
" -m, --mime <mime> <ext> <tool>\n" |
|
" start <tool> for mimetype <mime>\n" |
|
" <url> optional full URL\n" |
|
"Environment:\n" |
|
" LANGUAGE \"de\", \"en\", ... (actual: %5)\n" |
|
" PROXY_TYPE \"http\" or \"socks\" or \"\" (actual: %2)\n" |
|
" PROXY_PORT proxy port number (actual: %3)\n" |
|
" PROXY_HOST proxy host name (actual: %4)\n") |
|
.arg(QFileInfo(argc[0]).fileName()) |
|
.arg(env["PROXY_TYPE"]).arg(env["PROXY_PORT"]).arg(env["PROXY_HOST"]) |
|
.arg(env["LANGUAGE"]) |
|
.toStdString() |
|
<<std::endl; |
|
return 0; |
|
} else if ((*it=="-k" || *it=="--kiosk")) { |
|
silent=true; |
|
} else if ((*it=="-c" || *it=="--cert") && ++it!=args.end()) { |
|
QFile file(*it); |
|
file.open(QIODevice::ReadOnly); |
|
QSslCertificate::QSslCertificate c(&file); |
|
if (c.isNull()) { |
|
std::cerr<<QObject::trUtf8("Cannot read PEM certificate from file: %1") |
|
.arg(*it).toStdString()<<std::endl; |
|
return 1; |
|
} |
|
sslConfig.setLocalCertificate(c); |
|
file.close(); |
|
std::cout<<QObject::trUtf8("Read PEM certificates from file: %1") |
|
.arg(*it).toStdString()<<std::endl; |
|
} else if ((*it=="-y" || *it=="--key") && ++it!=args.end()) { |
|
QFile file(*it); |
|
file.open(QIODevice::ReadOnly); |
|
QSslKey k(&file, QSsl::Rsa); |
|
if (k.isNull()) { |
|
std::cerr<<QObject::trUtf8("Cannot read PEM RSA key from file: %1") |
|
.arg(*it).toStdString()<<std::endl; |
|
return 1; |
|
} |
|
sslConfig.setPrivateKey(k); |
|
std::cout<<QObject::trUtf8("Read private key from file: %1") |
|
.arg(*it).toStdString()<<std::endl; |
|
} else if ((*it=="-m" || *it=="--mime") |
|
&& ++it!=args.end() && ++it!=args.end() && ++it!=args.end()) { |
|
QString mt(*----it); |
|
QString ext(*++it); |
|
QString app(*++it); |
|
mimetypes[mt] = Browser::MimeTypes::mapped_type(ext, app); |
|
} else if (it!=args.end()) { |
|
urls<<*it; |
|
} else { |
|
std::cout<<QObject::trUtf8("Too few arguments.\nTry: %1 --help") |
|
.arg(QFileInfo(argc[0]).fileName()).toStdString()<<std::endl; |
|
return 1; |
|
} |
|
sslConfig.setPeerVerifyMode(QSslSocket::VerifyPeer); |
|
QSslConfiguration::setDefaultConfiguration(sslConfig); |
|
//............................................................................ |
|
if (urls.size()==0) urls<<QObject::trUtf8("http://swisssign.com"); |
|
std::list<Browser*> browsers; |
|
for (QStringList::iterator it(urls.begin()); it!=urls.end(); ++it) { |
|
Browser *ptr(new Browser(*it, mimetypes, silent)); |
|
ptr->show(); |
|
browsers.push_back(ptr); |
|
} |
|
int res(app.exec()); |
|
for (std::list<Browser*>::iterator it(browsers.begin()); |
|
it!=browsers.end(); ++it) |
|
delete *it; |
|
return res; |
|
} catch (std::exception& x) { |
|
std::cerr<<"**** Error: "<<x.what()<<std::endl; |
|
return 1; |
|
} catch (...) { |
|
// unexpected exception - just terminate |
|
std::cerr<<"**** Error"<<std::endl; |
|
return 1; |
|
}
|
|
|