mirror of
https://github.com/chris2511/xca.git
synced 2026-09-13 18:46:25 +05:00
New classes: - database_model: Manage the database tables (keys, req, cert, crl, templ) extracted from widgets/MW_database.cpp - arguments: parse commandline, dynamically create help text
187 lines
4.5 KiB
C++
187 lines
4.5 KiB
C++
/* vi: set sw=4 ts=4:
|
|
*
|
|
* Copyright (C) 2001 - 2015 Christian Hohnstaedt.
|
|
*
|
|
* All rights reserved.
|
|
*/
|
|
|
|
#include <getopt.h>
|
|
#include "arguments.h"
|
|
|
|
#include <QList>
|
|
#include <QDebug>
|
|
|
|
#include "func.h"
|
|
#include "exception.h"
|
|
|
|
const QList<arg_option> arguments::opts = {
|
|
//arg_option("ca", required_argument, 'c'),
|
|
arg_option("database", "<database>", file_argument, false,
|
|
"File name (*.xdb) of the SQLite database or a remote database descriptor: [user@host/TYPE:dbname#prefix]"),
|
|
arg_option("exit", NULL, no_argument, false,
|
|
"Exit after importing items"),
|
|
arg_option("gencrl", "<ca identifier>", required_argument, true,
|
|
"Generate CRL for <ca>"),
|
|
arg_option("help", NULL, no_argument, true,
|
|
"Print this help and exit"),
|
|
arg_option("hierarchy", "<dir>", file_argument, true,
|
|
"Save OpenSSL index hierarchy in <dir>"),
|
|
arg_option("index", "<file>", file_argument, true,
|
|
"Save OpenSSL index in <file>"),
|
|
arg_option("no-gui", NULL, no_argument, true,
|
|
"Do not start the GUI. Alternatively set environment variable XCA_NO_GUI=1 or call xca as 'xca-console' symlink"),
|
|
arg_option("password", "<password>", required_argument, false,
|
|
"Database password for unlocking the database"),
|
|
arg_option("print", NULL, no_argument, true,
|
|
"Print the content of provided filesin an OpenSSL style"),
|
|
arg_option("sqlpass", "<password>", required_argument, false,
|
|
"Password to access the remote SQL server"),
|
|
arg_option("verbose", NULL, no_argument, false,
|
|
"Print debug log on stderr. Alternatively set the environment variable XCA_DEBUG=1"),
|
|
arg_option("version", NULL, no_argument, true,
|
|
"Print version information and exit"),
|
|
};
|
|
|
|
arg_option::arg_option(const char *l, const char *a, int has,
|
|
bool n, const char *h)
|
|
: long_opt(l), arg(a), arg_type(has), no_gui(n), help(h)
|
|
{
|
|
}
|
|
|
|
void arg_option::fillOption(struct option *opt) const
|
|
{
|
|
opt->name = long_opt;
|
|
opt->has_arg = arg_type;
|
|
if (arg_type == file_argument)
|
|
opt->has_arg = required_argument;
|
|
opt->flag = NULL;
|
|
opt->val = 0;
|
|
}
|
|
|
|
QString arguments::help()
|
|
{
|
|
QString s;
|
|
size_t len = 0;
|
|
foreach(const arg_option &a, opts) {
|
|
size_t l = strlen(a.long_opt) + 1;
|
|
if (a.arg)
|
|
l += strlen(a.arg) + 1;
|
|
if (l > len)
|
|
len = l;
|
|
}
|
|
for (auto i = opts.begin(); i != opts.end(); ++i) {
|
|
QString longopt = i->long_opt;
|
|
if (i->arg)
|
|
longopt += QString("=%1").arg(i->arg);
|
|
s += QString(" --%1 %2\n").arg(longopt, len*-1).arg(i->help);
|
|
}
|
|
return s;
|
|
}
|
|
|
|
int arguments::parse(int argc, char *argv[])
|
|
{
|
|
int i, cnt = opts.count();
|
|
|
|
/* Setup "struct option" */
|
|
if (!long_opts)
|
|
long_opts = (struct option*)calloc(cnt +1,
|
|
sizeof(*long_opts));
|
|
check_oom(long_opts);
|
|
for (i = 0; i < cnt; ++i)
|
|
opts[i].fillOption(long_opts +i);
|
|
|
|
/* Parse cmdline options argv */
|
|
while (true) {
|
|
int optind = 0;
|
|
result = getopt_long_only(argc, argv, "", long_opts, &optind);
|
|
if (result)
|
|
break;
|
|
const arg_option i = opts[optind];
|
|
found_options[i.long_opt] = i.arg_type == file_argument ?
|
|
filename2QString(optarg) : QString(optarg);
|
|
}
|
|
for (i = optind; i < argc; ++i) {
|
|
QString file = filename2QString(argv[i]);
|
|
if (!has("database") && file.endsWith(".xdb")) {
|
|
/* No database given, but here is an xdb file
|
|
* Try to be clever.
|
|
*/
|
|
found_options["database"] = file;
|
|
} else {
|
|
files << file;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
arguments::arguments(int argc, char *argv[])
|
|
{
|
|
long_opts = NULL;
|
|
parse(argc, argv);
|
|
}
|
|
|
|
arguments::arguments(const arguments &a)
|
|
{
|
|
*this = a;
|
|
}
|
|
|
|
arguments &arguments::operator = (const arguments &a)
|
|
{
|
|
long_opts = NULL;
|
|
files = a.files;
|
|
found_options = a.found_options;
|
|
return *this;
|
|
}
|
|
|
|
arguments::~arguments()
|
|
{
|
|
if (long_opts)
|
|
free(long_opts);
|
|
}
|
|
|
|
QString arguments::operator [] (const QString &key) const
|
|
{
|
|
return found_options[key];
|
|
}
|
|
|
|
bool arguments::has(const QString &opt) const
|
|
{
|
|
return found_options.contains(opt);
|
|
}
|
|
|
|
QStringList arguments::getFiles() const
|
|
{
|
|
return files;
|
|
}
|
|
|
|
int arguments::getResult() const
|
|
{
|
|
return result;
|
|
}
|
|
|
|
bool arguments::is_console(int argc, char *argv[])
|
|
{
|
|
const char *nogui = getenv("XCA_NO_GUI");
|
|
if (nogui && *nogui)
|
|
return true;
|
|
if (argc > 0 && QString(argv[0]).endsWith("xca-console"))
|
|
return true;
|
|
|
|
/* Setup "no-gui" options */
|
|
QStringList console_opts;
|
|
for (auto i = opts.begin(); i != opts.end(); ++i) {
|
|
if (i->no_gui)
|
|
console_opts << QString("-%1").arg(i->long_opt);
|
|
}
|
|
|
|
qDebug() << "NOGUI_OPTS" << console_opts;
|
|
for (int i = 1; i < argc; i++) {
|
|
QString arg = QString(argv[i]);
|
|
if (arg.startsWith("--"))
|
|
arg = arg.mid(1);
|
|
if (console_opts.contains(arg))
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|