xca/lib/settings.cpp
Christian Hohnstaedt 00bd36f19b Support for XCA as portable App
On Windows XCA goes in portable mode if no XCA registry entry is found.
On Mac and Unix it checks the XCA_PORTABLE environment to be non-empty.
In portable mode:
 - The current working directory is not written to the database
 - The configured language and history of opened databases is
   forgotten after a restart of XCA
 - No registry entry is required nor written.
 - No unexpected files are written to disk, except exported items.
 - Portable mode is displayed in the "About" dialog

If setup.exe or "make install" are not used,
 - XCA is not assigned as app for any file types
2018-10-25 16:43:19 +02:00

134 lines
2.7 KiB
C++

#include "settings.h"
#include "func.h"
#include "sql.h"
#include "widgets/hashBox.h"
#include "widgets/NewKey.h"
#include <QDir>
#include <QFile>
#include <openssl/asn1.h>
settings Settings;
svalue::svalue(settings *s, const QString &k)
{
setting = s;
key = k;
}
QString svalue::get() const
{
return setting ? setting->get(key) : QString();
}
void svalue::set(const QString &val)
{
if (setting)
setting->set(key, val);
}
settings::settings()
{
defaul["mandatory_dn"] = "";
defaul["explicit_dn"] = "C,ST,L,O,OU,CN,emailAddress";
defaul["string_opt"] = "MASK:0x2002";
defaul["workingdir"] = QDir::currentPath();
defaul["default_hash"] = hashBox::getDefault();
defaul["ical_expiry"] = "1W";
defaul["cert_expiry"] = "80%";
defaul["serial_len"] = "64";
clear();
}
void settings::clear()
{
loaded = false;
values.clear();
db_keys.clear();
foreach(QString key, defaul.keys())
setAction(key, defaul[key]);
}
void settings::setAction(const QString &key, const QString &value)
{
if (key == "string_opt")
ASN1_STRING_set_default_mask_asc((char*)CCHAR(value));
else if (key == "default_hash")
hashBox::setDefault(value);
else if (key == "defaultkey")
NewKey::setDefault(value);
else if (key == "optionflags") {
XSqlQuery q;
Transaction;
if (!TransBegin())
return;
SQL_PREPARE(q, "DELETE FROM settings where key_='optionflags'");
q.exec();
foreach(QString flag, value.split(",")) {
if (flag == "dont_colorize_expiries")
flag = "no_expire_colors";
setAction(flag, "yes");
}
TransCommit();
return;
} else if (key == "workingdir") {
if (!QFile::exists(value))
return;
}
values[key] = value;
}
QString settings::defaults(const QString &key)
{
return defaul[key];
}
void settings::load_settings()
{
if (loaded || !QSqlDatabase::database().isOpen())
return;
XSqlQuery q("SELECT key_, value FROM settings");
while (q.next()) {
QString key = q.value(0).toString().simplified();
QString value = q.value(1).toString().simplified();
setAction(key, value);
db_keys << key;
}
loaded = true;
}
QString settings::get(QString key)
{
load_settings();
return values.contains(key) ? values[key] : QString();
}
void settings::set(QString key, QString value)
{
XSqlQuery q;
load_settings();
if (key == "workingdir") {
if (portable_app())
return;
value = QDir::toNativeSeparators(value);
}
if (db_keys.contains(key) && values[key] == value)
return;
Transaction;
if (!TransBegin())
return;
if (db_keys.contains(key)) {
SQL_PREPARE(q, "UPDATE settings SET value=? WHERE key_=?");
} else {
SQL_PREPARE(q, "INSERT INTO settings (value, key_) VALUES (?,?)");
db_keys << key;
}
q.bindValue(0, value);
q.bindValue(1, key);
q.exec();
setAction(key, value);
TransCommit();
}