int main(int argc, char **argv) { QxtCommandOptions options; options.add(CL_HELP, "display this help message", QxtCommandOptions::NoValue); options.add(CL_NKEYS, "number of keys to generate", QxtCommandOptions::ValueRequired); options.add(CL_PUBDIR, "directory in which to put public keys (default=./keys/pub)", QxtCommandOptions::ValueRequired); options.add(CL_PRIVDIR, "directory in which to put private keys (default=./keys/priv)", QxtCommandOptions::ValueRequired); options.add(CL_KEYTYPE, "specify the key type (default=dsa, options=dsa|rsa)", QxtCommandOptions::ValueRequired); options.add(CL_LIB, "specify the library (default=cryptopp, options=cryptopp)", QxtCommandOptions::ValueRequired); options.add(CL_RAND, "specify the base properties for the key (default=NULL)", QxtCommandOptions::ValueRequired); options.add(CL_DEBUG, "enable debugging", QxtCommandOptions::NoValue); options.parse(argc, argv); if(options.count(CL_HELP) || options.showUnrecognizedWarning()) { options.showUsage(); return -1; } QMultiHash<QString, QVariant> params = options.parameters(); int key_count = params.value(CL_NKEYS, 1).toInt(); if(key_count < 1) { ExitWithWarning(options, "Invalid nkeys"); } QString pubdir_path = params.value(CL_PUBDIR, DEFAULT_PUBDIR).toString(); QDir pubdir(pubdir_path); if(!pubdir.exists()) { pubdir.mkpath("."); } if(!pubdir.exists()) { ExitWithWarning(options, "Unable to create pubdir"); } QString privdir_path = params.value(CL_PRIVDIR, DEFAULT_PRIVDIR).toString(); QDir privdir(privdir_path); if(!privdir.exists()) { privdir.mkpath("."); } if(!privdir.exists()) { ExitWithWarning(options, "Unable to create privdir"); } if(params.contains(CL_DEBUG)) { Logging::UseStderr(); } QString lib_name = params.value(CL_LIB, "cryptopp").toString(); QString key = params.value(CL_KEYTYPE, "dsa").toString(); CryptoFactory &cf = CryptoFactory::GetInstance(); QSharedPointer<CreateKey> ck(new CreateKey()); if(lib_name == "cryptopp") { if(key == "dsa") { cf.SetLibrary(CryptoFactory::CryptoPPDsa); if(params.contains(CL_RAND)) { ck = QSharedPointer<CreateKey>( new CreateSeededDsaKey(params.value(CL_RAND).toString())); } } else if (key == "rsa") { cf.SetLibrary(CryptoFactory::CryptoPP); } else { ExitWithWarning(options, "Invalid key type"); } } else { ExitWithWarning(options, "Invalid library"); } Library *lib = cf.GetLibrary(); QSharedPointer<Hash> hash(lib->GetHashAlgorithm()); int count = 0; while(count < key_count) { QSharedPointer<AsymmetricKey> key((*ck)()); QSharedPointer<AsymmetricKey> pubkey(key->GetPublicKey()); QByteArray hvalue = hash->ComputeHash(pubkey->GetByteArray()); QString id = Integer(hvalue).ToString(); if(!key->Save(privdir_path + QDir::separator() + id)) { qFatal("Could not save private key"); } if(!pubkey->Save(pubdir_path + QDir::separator() + id + ".pub")) { qFatal("Could not save private key"); } count++; } return 0; }
int main(int argc, char *argv[]) { QApplication a(argc, argv); a.setApplicationName("Jupiter Reporter"); a.setOrganizationName("XE-QT Solutions"); a.setOrganizationDomain("xe-qt-solutions.com"); QxtCommandOptions options; options.add("version", "show version number and build date"); options.alias("version", "ver"); options.add("help", "show this help text"); options.addSection("printing and PDF"); options.add("print", "print a report to a specific printer (blank for default)", QxtCommandOptions::ValueOptional); options.add("pdf", "save a report as a PDF file", QxtCommandOptions::ValueRequired); options.addSection("email"); options.add("to", "list of email recipients", QxtCommandOptions::ValueRequired); options.add("cc", "list of email cc recipients", QxtCommandOptions::ValueRequired); options.add("subject", "the email subject", QxtCommandOptions::ValueRequired); options.add("body", "the body of the email message", QxtCommandOptions::ValueRequired); options.add("server", "the email smtp server", QxtCommandOptions::ValueRequired); options.add("port", "the smtp server port", QxtCommandOptions::ValueRequired); options.add("ssl", "use a secure socket when sending email"); options.add("account", "the name of the smtp account", QxtCommandOptions::ValueRequired); options.add("password", "the smtp account password", QxtCommandOptions::ValueRequired); options.add("from", "the email address of the email sender", QxtCommandOptions::ValueRequired); options.addSection("licensing"); options.add("lic", "display license details"); options.add("name", "the licensee name", QxtCommandOptions::ValueRequired); options.add("email", "the licensee email address", QxtCommandOptions::ValueRequired); options.add("expires", "the license expiry date (YYYY-MM-DD format)", QxtCommandOptions::ValueRequired); options.add("key", "the activation key to unlock advanced features", QxtCommandOptions::ValueRequired); options.parse(a.arguments()); if (options.count("version")) { std::cout << "Jupiter Reporter v" << VER_MAJOR << "." << VER_MINOR << ", built on " << __DATE__ << " at " << __TIME__ << std::endl; std::cout << "Copyright (c) 2010 XE-QT Solutions Ltd., All rights reserved." << std::endl; return 0; } QSettings settings(QString("%1/license.ini").arg(QDesktopServices::storageLocation(QDesktopServices::DataLocation)), QSettings::IniFormat); // Generate license? if (options.count("name") || options.count("email") || options.count("expires")) { const QString name = options.value("name").toString(); const QString email = options.value("email").toString(); const QString expires = options.value("expires").toString(); if (name.isEmpty() || email.isEmpty() || expires.isEmpty()) { options.showUsage(); return 0; } settings.setValue("License/name", name); settings.setValue("License/email", email); settings.setValue("License/expires", expires); settings.setValue("License/license", NodeLockedLicense::licenseFile(name, email, QDate::fromString(expires, Qt::ISODate))); std::cout << "Generated " << qPrintable(settings.fileName()) << std::endl; return 0; } if (options.count("key")) { settings.setValue("License/key", options.value("key").toString()); settings.remove("License/license"); std::cout << "Updated " << qPrintable(settings.fileName()) << std::endl; return 0; } // Read license const QString name = settings.value("License/name").toString(); const QString email = settings.value("License/email").toString(); const QDate expires = QDate::fromString(settings.value("License/expires").toString(), Qt::ISODate); const QString key = settings.value("License/key").toString(); bool isLicensed = NodeLockedLicense::isValid(name, email, expires, key); if (options.count("lic")) { std::cout << "License: " << qPrintable(settings.fileName()) << std::endl; if (!isLicensed) { std::cout << "No valid license exists. Advanced functionality will be disabled." << std::endl; } else { std::cout << "Licensed to " << qPrintable(name) << " (" << qPrintable(email) << "), expires on " << qPrintable(expires.toString()) << std::endl; } return 0; } if (options.positional().isEmpty() || options.count("help") || options.showUnrecognizedWarning() || (options.count("print") == 0 && options.count("pdf") == 0 && options.count("to") == 0)) { options.showUsage(); return 0; } const QString fileName = options.positional().first(); Q_ASSERT(fileName != ""); if (options.count("print")) { Print print; QObject::connect(&print, SIGNAL(finished()), &a, SLOT(quit())); print.print(fileName, options.value("print").toString()); return a.exec(); } if (options.count("pdf")) { if (isLicensed) { Pdf pdf; QObject::connect(&pdf, SIGNAL(finished()), &a, SLOT(quit())); pdf.create(fileName, options.value("pdf").toString()); return a.exec(); } else { std::cout << "PDF support requires a license!" << std::endl; return 0; } } if (options.count("to") || options.count("cc")) { if (isLicensed) { Email email; email.send(fileName, parseSendSettings(options), parseEmailSettings(options)); QObject::connect(&email, SIGNAL(finished()), &a, SLOT(quit())); return a.exec(); } else { std::cout << "Email support requires a license!" << std::endl; return 0; } } return 0; }
void ExitWithWarning(const QxtCommandOptions &options, const char* warning) { std::cerr << "Error: " << warning << std::endl; options.showUsage(); exit(-1); }