# Extra rules for Windows builds
-set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zc:wchar_t-")
+if(MINGW)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
+
+ # gcc options for release and debug builds
+ IF(CMAKE_BUILD_TYPE STREQUAL Release)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2")
+ ELSE(CMAKE_BUILD_TYPE STREQUAL Release)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
+ ENDIF(CMAKE_BUILD_TYPE STREQUAL Release)
+
+ set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--no-undefined")
+
+else(MINGW)
+ # Assume a Microsoft Visual C++ compiler
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zc:wchar_t-")
+endif(MINGW)
)
# Version info resource file for Windows builds
-if(WIN32)
+if(WIN32 AND NOT MINGW)
set(SRCS ${SRCS} version.rc)
-endif(WIN32)
+endif(WIN32 AND NOT MINGW)
qt4_wrap_cpp(MOC_SRCS ${MOC_HDRS})
#)
# Version info resource file for Windows builds
-if(WIN32)
+if(WIN32 AND NOT MINGW)
set(SRCS ${SRCS} version.rc)
-endif(WIN32)
+endif(WIN32 AND NOT MINGW)
qt4_add_resources(RCC_SRCS ${RCCS})
)
# Version info resource file for Windows builds
-if(WIN32)
+if(WIN32 AND NOT MINGW)
set(SRCS ${SRCS} version.rc)
-endif(WIN32)
+endif(WIN32 AND NOT MINGW)
qt4_wrap_cpp(MOC_SRCS ${MOC_HDRS})
* @brief Command line interface for the PswGen application
* @author Enar Vaikene
*
- * Copyright (c) 2011 Enar Vaikene
+ * Copyright (c) 2011-2012 Enar Vaikene
*
* This file is part of the eVaf C++ cross-platform application development framework.
*
#include <Common/iEventQueue>
#include <Common/iApp>
#include <Common/Event>
+#include <Common/Util>
#include <QtCore>
{
QString masterPassword;
QString appName;
+ QString suffix;
int passwordLength = 0;
+ uint flags = 0;
+ int alnum = -1;
// Process command-line arguments
QStringList args = QCoreApplication::arguments();
masterPassword = arg.at(1);
else if (QRegExp("-[-]?n(ame)?").exactMatch(arg.at(0)) && arg.size() > 1)
appName = arg.at(1);
+ else if (QRegExp("-[-]?s(uffix)?").exactMatch(arg.at(0)) && arg.size() > 1)
+ suffix = arg.at(1);
+ else if (QRegExp("-[-]?a(lphanumeric)?").exactMatch(arg.at(0))) {
+ if (arg.size() > 1) {
+ if (Common::isTrue(arg.at(1)))
+ alnum = 1;
+ else if (Common::isFalse(arg.at(1)))
+ alnum = 0;
+ }
+ else
+ alnum = 1;
+ }
else if (QRegExp("-[-]?l(ength)?").exactMatch(arg.at(0)) && arg.size() > 1) {
bool ok;
int t = arg.at(1).toInt(&ok);
}
}
+ // Set flags
+ if (alnum != -1) {
+ if (alnum == 1)
+ flags |= uint(iGenerator::ALPHANUMERIC);
+ else
+ flags &= ~uint(iGenerator::ALPHANUMERIC);
+ }
+
QTextStream cin(stdin);
QTextStream cout(stdout);
QExplicitlySharedDataPointer<PswGen::Storage::Data> data;
if (mStorage) {
data = mStorage->query(appName);
- if (data && passwordLength == 0)
- passwordLength = data->length();
+ if (data) {
+ if (passwordLength == 0)
+ passwordLength = data->length();
+ if (suffix.isEmpty())
+ suffix = data->suffix();
+ if (alnum == -1)
+ flags = data->flags();
+ }
}
// If the length argument is still not initialized, use the default length value
passwordLength = DefaultPasswordLength;
// Generate password
- QString password = mGenerator->generatePassword(appName, masterPassword, passwordLength);
+ QString password = mGenerator->generatePassword(appName + suffix, masterPassword, passwordLength);
cout << "Generated password : " << password << endl;
// Store arguments for this password
if (mStorage) {
if (!data)
- data = new Storage::Data(appName, passwordLength);
- else
+ data = new Storage::Data(appName, suffix, passwordLength);
+ else {
+ data->setSuffix(suffix);
data->setLength(passwordLength);
+ }
mStorage->save(appName, data);
}
}
* @brief Version information for eVaf modules
* @author Enar Vaikene
*
- * Copyright (c) 2011 Enar Vaikene
+ * Copyright (c) 2011-2012 Enar Vaikene
*
* This file is part of the eVaf C++ cross-platform application development framework.
*
/**
* Module/library version number in the form major,minor,release,build
*/
-#define VER_FILE_VERSION 0,1,1,2
+#define VER_FILE_VERSION 0,2,1,3
/**
* Module/library version number in the string format (shall end with \0)
*/
-#define VER_FILE_VERSION_STR "0.1.1.2\0"
+#define VER_FILE_VERSION_STR "0.2.1.3\0"
/**
* Module/library name (shall end with \0)
)
# Version info resource file for Windows builds
-if(WIN32)
+if(WIN32 AND NOT MINGW)
set(SRCS ${SRCS} version.rc)
-endif(WIN32)
+endif(WIN32 AND NOT MINGW)
qt4_wrap_cpp(MOC_SRCS ${MOC_HDRS})
* @brief GUI for the PswGen application
* @author Enar Vaikene
*
- * Copyright (c) 2011 Enar Vaikene
+ * Copyright (c) 2011-2012 Enar Vaikene
*
* This file is part of the eVaf C++ cross-platform application development framework.
*
g->addWidget(wName, 1, 1, 1, 2);
panel->setFocusProxy(wName);
- l = new QLabel(tr("&Length of the password:", VER_MODULE_NAME_STR));
+ l = new QLabel(tr("&Suffix:", VER_MODULE_NAME_STR));
l->setAlignment(Qt::AlignRight);
g->addWidget(l, 2, 0);
+ wSuffix = new QLineEdit;
+ l->setBuddy(wSuffix);
+ g->addWidget(wSuffix, 2, 1, 1, 2);
+
+ l = new QLabel(tr("&Length of the password:", VER_MODULE_NAME_STR));
+ l->setAlignment(Qt::AlignRight);
+ g->addWidget(l, 3, 0);
+
wLength = new QSpinBox;
l->setBuddy(wLength);
wLength->setRange(0, mGenerator->maxLength());
wLength->setValue(DefaultPasswordLength);
wLength->setSpecialValueText(tr("Maximum", VER_MODULE_NAME_STR));
- g->addWidget(wLength, 2, 1);
+ g->addWidget(wLength, 3, 1);
+
+ wAlNum = new QCheckBox(tr("&Alpha-Numeric only", VER_MODULE_NAME_STR));
+ g->addWidget(wAlNum, 3, 2);
l = new QLabel(tr("Password:"));
l->setAlignment(Qt::AlignRight);
- g->addWidget(l, 3, 0);
+ g->addWidget(l, 4, 0);
wPassword = new QLineEdit;
wPassword->setReadOnly(true);
- g->addWidget(wPassword, 3, 1, 1, 2);
+ g->addWidget(wPassword, 4, 1, 1, 2);
v->addStretch();
wGenerate->setDisabled(wMasterPassword->text().isEmpty() || wName->text().isEmpty());
if (!wName->text().isEmpty() && mStorage) {
QExplicitlySharedDataPointer<PswGen::Storage::Data> data = mStorage->query(wName->text());
- if (data)
+ if (data) {
wLength->setValue(data->length());
+ wSuffix->setText(data->suffix());
+ wAlNum->setChecked(data->flags() & uint(iGenerator::ALPHANUMERIC));
+ }
}
}
{
if (wMasterPassword->text().isEmpty() || wName->text().isEmpty())
return;
- wPassword->setText(mGenerator->generatePassword(wName->text(), wMasterPassword->text(), wLength->value()));
+ uint flags = 0;
+ if (wAlNum->isChecked())
+ flags |= iGenerator::ALPHANUMERIC;
+ wPassword->setText(mGenerator->generatePassword(wName->text() + wSuffix->text(),
+ wMasterPassword->text(),
+ wLength->value(),
+ flags));
wCopy->setEnabled(true);
if (mStorage) {
QExplicitlySharedDataPointer<PswGen::Storage::Data> data = mStorage->query(wName->text());
- if (!data)
- data = new Storage::Data(wName->text(), wLength->value());
- else
+ if (!data) {
+ data = new Storage::Data(wName->text(), wSuffix->text(), wLength->value());
+ }
+ else {
+ data->setSuffix(wSuffix->text());
data->setLength(wLength->value());
+ if (wAlNum->isChecked())
+ data->setFlags(data->flags() | iGenerator::ALPHANUMERIC);
+ else
+ data->setFlags(data->flags() & ~uint(iGenerator::ALPHANUMERIC));
+ }
mStorage->save(wName->text(), data);
}
}
* @brief GUI for the PswGen application
* @author Enar Vaikene
*
- * Copyright (c) 2011 Enar Vaikene
+ * Copyright (c) 2011-2012 Enar Vaikene
*
* This file is part of the eVaf C++ cross-platform application development framework.
*
class QLineEdit;
class QSpinBox;
class QPushButton;
+class QCheckBox;
namespace eVaf {
namespace PswGen {
eVaf::PswGen::iStorage * mStorage;
/// Widgets on the screen
- QLineEdit * wName;
QLineEdit * wMasterPassword;
+ QLineEdit * wName;
+ QLineEdit * wSuffix;
QSpinBox * wLength;
+ QCheckBox * wAlNum;
QLineEdit * wPassword;
QPushButton * wGenerate;
QPushButton * wCopy;
* @brief Version information for eVaf modules
* @author Enar Vaikene
*
- * Copyright (c) 2011 Enar Vaikene
+ * Copyright (c) 2011-2012 Enar Vaikene
*
* This file is part of the eVaf C++ cross-platform application development framework.
*
/**
* Module/library version number in the form major,minor,release,build
*/
-#define VER_FILE_VERSION 0,1,5,6
+#define VER_FILE_VERSION 0,2,1,7
/**
* Module/library version number in the string format (shall end with \0)
*/
-#define VER_FILE_VERSION_STR "0.1.5.6\0"
+#define VER_FILE_VERSION_STR "0.2.1.7\0"
/**
* Module/library name (shall end with \0)
)
# Version info resource file for Windows builds
-if(WIN32)
+if(WIN32 AND NOT MINGW)
set(SRCS ${SRCS} version.rc)
-endif(WIN32)
+endif(WIN32 AND NOT MINGW)
qt4_wrap_cpp(MOC_SRCS ${MOC_HDRS})
* @brief Implementation of the iGenerator interface
* @author Enar Vaikene
*
- * Copyright (c) 2011 Enar Vaikene
+ * Copyright (c) 2011-2012 Enar Vaikene
*
* This file is part of the eVaf C++ cross-platform application development framework.
*
hash.addData(inputString);
QByteArray result = hash.result().toBase64();
if (length > 0)
- return result.left(length);
- else
- return result;
+ result.resize(length);
+
+ if (flags & uint(ALPHANUMERIC)) {
+ // Convert all characters to alpha-numeric
+ for (int i = 0; i < result.size(); ++i) {
+ unsigned char c = result.at(i);
+ while (isalnum(c) == 0)
+ c++;
+ result[i] = c;
+ }
+ }
+
+ return result;
}
* @brief Version information for eVaf modules
* @author Enar Vaikene
*
- * Copyright (c) 2011 Enar Vaikene
+ * Copyright (c) 2011-2012 Enar Vaikene
*
* This file is part of the eVaf C++ cross-platform application development framework.
*
/**
* Module/library version number in the form major,minor,release,build
*/
-#define VER_FILE_VERSION 0,1,1,1
+#define VER_FILE_VERSION 0,1,2,2
/**
* Module/library version number in the string format (shall end with \0)
*/
-#define VER_FILE_VERSION_STR "0.1.1.1\0"
+#define VER_FILE_VERSION_STR "0.1.2.2\0"
/**
* Module/library name (shall end with \0)
)
# Version info resource file for Windows builds
-if(WIN32)
+if(WIN32 AND NOT MINGW)
set(SRCS ${SRCS} version.rc)
-endif(WIN32)
+endif(WIN32 AND NOT MINGW)
qt4_wrap_cpp(MOC_SRCS ${MOC_HDRS})
* @brief Interface for password storage modules
* @author Enar Vaikene
*
- * Copyright (c) 2011 Enar Vaikene
+ * Copyright (c) 2011-2012 Enar Vaikene
*
* This file is part of the eVaf C++ cross-platform application development framework.
*
: QSharedData()
, mModified(false)
, mName(name)
+ , mSuffix()
, mLength(0)
, mFlags(0)
{}
- Data(QString const & name, int l, uint f = 0)
+ Data(QString const & name, QString const & suffix, int l, uint f = 0)
: QSharedData()
, mModified(false)
, mName(name)
+ , mSuffix(suffix)
, mLength(l)
, mFlags(f)
{}
/// Name of the password
inline QString const & name() const { return mName; }
+ /// Optional suffix added to the name
+ inline QString const & suffix() const { return mSuffix; }
+ void setSuffix(QString const & suffix)
+ {
+ if (suffix != mSuffix) {
+ mSuffix = suffix;
+ mModified = true;
+ }
+ }
+
/// Length of the generated password
inline int length() const { return mLength; }
inline void setLength(int value)
bool mModified;
QString mName;
+ QString mSuffix;
int mLength;
uint mFlags;
* @brief Implementation of the iStorage interface
* @author Enar Vaikene
*
- * Copyright (c) 2011 Enar Vaikene
+ * Copyright (c) 2011-2012 Enar Vaikene
*
* This file is part of the eVaf C++ cross-platform application development framework.
*
// This is an update
if (data->modified()) {
QSqlQuery q(mDb);
- if (!q.exec(QString("UPDATE data SET length = \'%1\', flags = \'%2\' WHERE name = \'%3\';")
- .arg(data->length()).arg(data->flags()).arg(name))) {
+ if (!q.exec(QString("UPDATE data SET suffix = \'%1\', length = \'%2\', flags = \'%3\' WHERE name = \'%4\';")
+ .arg(data->suffix()).arg(data->length()).arg(data->flags()).arg(name))) {
QSqlError err = mDb.lastError();
EVAF_ERROR("Failed to update \'%s\' : %s", qPrintable(name), qPrintable(err.text()));
return false;
else {
// Store to the database
QSqlQuery q(mDb);
- if (!q.exec(QString("INSERT INTO data (name, length, flags) VALUES (\'%1\', %2, %3);")
- .arg(name).arg(data->length())
+ if (!q.exec(QString("INSERT INTO data (name, suffix, length, flags) VALUES (\'%1\', \'%2\', %3, %4);")
+ .arg(name).arg(data->suffix()).arg(data->length())
.arg(int(data->flags())))) {
QSqlError err = mDb.lastError();
EVAF_ERROR("Failed to insert \'%s\' : %s", qPrintable(name), qPrintable(err.text()));
return false;
}
- if (q.isActive() && q.isSelect() && q.first())
- return true; // We already have a table called 'data'
+ if (q.isActive() && q.isSelect() && q.first()) {
+ // Check if the table needs to be upgraded
+ return upgradeTables();
+ }
// Create the 'data' table
- if (!q.exec("CREATE TABLE data (name text primary key not null, length integer, flags integer);")) {
+ if (!q.exec("CREATE TABLE data (name text primary key not null, suffix text, length integer, flags integer);")) {
QSqlError err = mDb.lastError();
EVAF_ERROR("Failed to create table \'data\' : %s", qPrintable(err.text()));
return false;
return true;
}
+bool StorageImpl::upgradeTables()
+{
+ QSqlQuery q(mDb);
+
+ // Check if the 'suffix' column exists
+ if (q.exec("SELECT suffix from data;")) {
+ return true;
+ }
+
+ // Add the 'suffix' columnt
+ if (!q.exec("ALTER TABLE data ADD COLUMN suffix TEXT;")) {
+ QSqlError err = mDb.lastError();
+ EVAF_ERROR("Failed to upgrade table \'data\' : %s", qPrintable(err.text()));
+ return false;
+ }
+
+ return true;
+}
+
bool StorageImpl::loadData()
{
QSqlQuery q(mDb);
- if (!q.exec("SELECT name, length, flags FROM data;")) {
+ if (!q.exec("SELECT name, suffix, length, flags FROM data;")) {
QSqlError err = mDb.lastError();
EVAF_ERROR("Failed to query database : %s", qPrintable(err.text()));
return false;
while (q.next()) {
QString name = q.value(0).toString();
- QExplicitlySharedDataPointer<Storage::Data> data(new Storage::Data(name, q.value(1).toInt(), uint(q.value(2).toInt())));
+ QExplicitlySharedDataPointer<Storage::Data> data(
+ new Storage::Data(name, q.value(1).toString(), q.value(2).toInt(), uint(q.value(3).toInt())));
mData.insert(name, data);
}
* @brief Implementation of the iStorage interface
* @author Enar Vaikene
*
- * Copyright (c) 2011 Enar Vaikene
+ * Copyright (c) 2011-2012 Enar Vaikene
*
* This file is part of the eVaf C++ cross-platform application development framework.
*
*/
bool createTables();
+ /**
+ * Upgrades database tables if necessary
+ * @return True if ok; false if failed
+ *
+ * This function checks if database tables need to upgraded and
+ * performs the upgrade without a loss of data if possible.
+ * Returns false if upgrade is not possible or fails.
+ */
+ bool upgradeTables();
+
/**
* Loads data from the database
* @return True if ok; false if failed
* @brief Version information for eVaf modules
* @author Enar Vaikene
*
- * Copyright (c) 2011 Enar Vaikene
+ * Copyright (c) 2011-2012 Enar Vaikene
*
* This file is part of the eVaf C++ cross-platform application development framework.
*
/**
* Module/library version number in the form major,minor,release,build
*/
-#define VER_FILE_VERSION 0,1,2,2
+#define VER_FILE_VERSION 0,2,1,3
/**
* Module/library version number in the string format (shall end with \0)
*/
-#define VER_FILE_VERSION_STR "0.1.2.2\0"
+#define VER_FILE_VERSION_STR "0.2.1.3\0"
/**
* Module/library name (shall end with \0)
)
# Version info resource file for Windows builds
-if(WIN32)
+if(WIN32 AND NOT MINGW)
set(SRCS ${SRCS} version.rc)
-endif(WIN32)
+endif(WIN32 AND NOT MINGW)
qt4_wrap_cpp(MOC_SRCS ${MOC_HDRS})
va_list ap;
#ifdef Q_OS_WIN32
va_start(ap, fmt);
+# ifdef Q_CC_GNU
+ vsnprintf(str, sizeof(str), fmt, ap);
+# else
_vsnprintf_s(str, sizeof(str), _TRUNCATE, fmt, ap);
+# endif
va_end(ap);
#else
::va_start(ap, fmt);
)
# Version info resource file for Windows builds
-if(WIN32)
+if(WIN32 AND NOT MINGW)
set(SRCS ${SRCS} version.rc)
-endif(WIN32)
+endif(WIN32 AND NOT MINGW)
qt4_wrap_cpp(MOC_SRCS ${MOC_HDRS})
)
# Version info resource file for Windows builds
-if(WIN32)
+if(WIN32 AND NOT MINGW)
set(SRCS ${SRCS} version.rc)
-endif(WIN32)
+endif(WIN32 AND NOT MINGW)
qt4_wrap_cpp(MOC_SRCS ${MOC_HDRS})
inline QString expandPluginName(QString const & name)
{
#ifdef Q_OS_WIN32
+# ifdef Q_CC_MINGW
+ return "lib" + name + ".dll";
+# else
return name + ".dll";
+# endif
#elif defined Q_OS_LINUX
return "lib" + name + ".so";
#else
)
# Version info resource file for Windows builds
-if(WIN32)
+if(WIN32 AND NOT MINGW)
set(SRCS ${SRCS} version.rc cli.rc)
-endif(WIN32)
+endif(WIN32 AND NOT MINGW)
qt4_wrap_cpp(MOC_SRCS ${MOC_HDRS})
#)
# Version info resource file for Windows builds
-if(WIN32)
+if(WIN32 AND NOT MINGW)
set(SRCS ${SRCS} version.rc gui.rc)
-endif(WIN32)
+endif(WIN32 AND NOT MINGW)
qt4_add_resources(RCC_SRCS ${RCCS})
)
# Version info resource file for Windows builds
-if(WIN32)
+if(WIN32 AND NOT MINGW)
set(SRCS ${SRCS} version.rc)
-endif(WIN32)
+endif(WIN32 AND NOT MINGW)
qt4_wrap_cpp(MOC_SRCS ${MOC_HDRS})
)
# Version info resource file for Windows builds
-if(WIN32)
+if(WIN32 AND NOT MINGW)
set(SRCS ${SRCS} version.rc)
-endif(WIN32)
+endif(WIN32 AND NOT MINGW)
qt4_wrap_cpp(MOC_SRCS ${MOC_HDRS})
)
# Version info resource file for Windows builds
-if(WIN32)
+if(WIN32 AND NOT MINGW)
set(SRCS ${SRCS} version.rc)
-endif(WIN32)
+endif(WIN32 AND NOT MINGW)
qt4_wrap_cpp(MOC_SRCS ${MOC_HDRS})