diff --git a/LICENSE b/LICENSE
old mode 100644
new mode 100755
diff --git a/PKGBUILD_amd64 b/PKGBUILD_amd64
old mode 100644
new mode 100755
index b5af069..19cda1b
--- a/PKGBUILD_amd64
+++ b/PKGBUILD_amd64
@@ -1,5 +1,5 @@
pkgname=passman
-pkgver=1.0.2
+pkgver=1.0.4
pkgrel=1
pkgdesc="A Simple Password Manager with AES-256 Encryption"
arch=('x86_64')
diff --git a/PKGBUILD_arm64 b/PKGBUILD_arm64
old mode 100644
new mode 100755
index e1c2532..2441611
--- a/PKGBUILD_arm64
+++ b/PKGBUILD_arm64
@@ -1,5 +1,5 @@
pkgname=passman
-pkgver=1.0.2
+pkgver=1.0.4
pkgrel=1
pkgdesc="A Simple Password Manager with AES-256 Encryption"
arch=('aarch64')
diff --git a/README.md b/README.md
old mode 100644
new mode 100755
index 3ba7769..df902f0
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
A Simple Password Manager with AES-256 Encryption
Files **qaesencryption.cpp** and **qaesencryption.h** are from [This Repo](https://github.com/bricke/Qt-AES)
-Version 1.0.2
+Version 1.0.4

diff --git a/control_amd64 b/control_amd64
old mode 100644
new mode 100755
index 60fec78..aa69764
--- a/control_amd64
+++ b/control_amd64
@@ -1,5 +1,5 @@
Package: passman
-Version: 1.0.2
+Version: 1.0.4
Section: utils
Priority: optional
Architecture: amd64
diff --git a/control_arm64 b/control_arm64
old mode 100644
new mode 100755
index 985ab9e..bd6f521
--- a/control_arm64
+++ b/control_arm64
@@ -1,5 +1,5 @@
Package: passman
-Version: 1.0.2
+Version: 1.0.4
Section: utils
Priority: optional
Architecture: arm64
diff --git a/main.cpp b/main.cpp
old mode 100644
new mode 100755
index 9b7702b..a1d011d
--- a/main.cpp
+++ b/main.cpp
@@ -6,8 +6,9 @@
int main(int argc, char *argv[])
{
- QString version = "1.0.2";
+ QString version = "1.0.4";
+ //Run GUI if no arguments are passed
if (argc == 1)
{
QApplication a(argc, argv);
@@ -25,6 +26,7 @@ int main(int argc, char *argv[])
parameterparser parameter_parser(argc, argv);
passman password_manager;
+ //Print help ccreen
if (parameter_parser.has_parameter("help", 'h'))
{
std::cout << "Passman v" << version.toStdString() << " - A Simple Password Manager with AES-256 Encryption by Aslan2142\n\n";
@@ -46,13 +48,17 @@ int main(int argc, char *argv[])
return 0;
}
+ //Load password from an argument (if present)
std::string password = parameter_parser.get_value("pass", 'p');
+ //Wait for password input in case it wasn't present in the argument
if (password.compare("-") == 0)
{
+ std::cout << "Input Pasword: ";
std::cin >> password;
}
password_manager.key = QString::fromStdString(password);
+ //Create database
if (parameter_parser.has_parameter("create-database", 'd'))
{
if (password_manager.database_exists())
@@ -71,6 +77,7 @@ int main(int argc, char *argv[])
}
}
+ //Print main errors (if occured)
if (!password_manager.load())
{
std::cerr << "Error Loading Database" << std::endl;
@@ -82,6 +89,7 @@ int main(int argc, char *argv[])
return 2;
}
+ //Create new entry
std::string new_entry = parameter_parser.get_value("new", 'n');
if (new_entry.compare("-") != 0)
{
@@ -98,6 +106,7 @@ int main(int argc, char *argv[])
password_manager.save();
}
+ //Remove an entry
std::string remove_entry = parameter_parser.get_value("remove", 'r');
if (remove_entry.compare("-") != 0)
{
@@ -131,11 +140,13 @@ int main(int argc, char *argv[])
password_manager.save();
}
+ //Backup database
if (parameter_parser.has_parameter("backup", 'b'))
{
password_manager.backup();
}
+ //Show all entries
if (parameter_parser.has_parameter("show-all", 'a'))
{
const std::vector> database = password_manager.get_database_copy();
@@ -145,6 +156,7 @@ int main(int argc, char *argv[])
}
}
+ //Search and show entries by website
std::string show_website = parameter_parser.get_value("show", 's');
if (show_website.compare("-") != 0)
{
diff --git a/mainwindow.cpp b/mainwindow.cpp
old mode 100644
new mode 100755
index 9b154d7..618ad64
--- a/mainwindow.cpp
+++ b/mainwindow.cpp
@@ -26,7 +26,7 @@ MainWindow::~MainWindow()
void MainWindow::decrypt_database()
{
- //Load and Decrypt Database
+ //Load and decrypt database
password_manager.key = ui->lineEditEncryptionKey->text();
if (!password_manager.load())
@@ -45,7 +45,7 @@ void MainWindow::decrypt_database()
ui->labelDatabaseInfo->setText("Database Loaded");
ui->labelEncryptionInfo->setText("Database Decrypted");
- //Fill up the Table
+ //Fill up the table
std::vector> database = password_manager.get_database_copy();
ui->tableWidgetCredentials->clear();
@@ -62,7 +62,7 @@ void MainWindow::decrypt_database()
saved = true;
- //Enable/Disable UI Elements
+ //Enable/Disable UI elements
ui->pushButtonUnlock->setEnabled(false);
ui->lineEditEncryptionKey->setEnabled(false);
@@ -75,12 +75,16 @@ void MainWindow::decrypt_database()
ui->lineEditSearch->setEnabled(true);
ui->tableWidgetCredentials->setEnabled(true);
+ //Set UI collumn names
ui->tableWidgetCredentials->setHorizontalHeaderLabels({"Website", "Username", "Password", "Note"});
ui->tableWidgetCredentials->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
+
+ ui->lineEditSearch->setFocus();
}
void MainWindow::backup_database()
{
+ //Backup the database if it exists
if (password_manager.backup())
{
ui->labelDatabaseInfo->setText("Database Backup Complete");
@@ -91,18 +95,22 @@ void MainWindow::backup_database()
void MainWindow::save_database()
{
+ //Clear old database data
password_manager.clear_database();
std::array tmp_row;
for (int i = 0; i < ui->tableWidgetCredentials->rowCount(); i++)
{
+ //Get the data from the row
for (int j = 0; j < 4; j++)
{
tmp_row[static_cast(j)] = ui->tableWidgetCredentials->item(i, j)->text();
}
+ //Add the row data to the database
password_manager.add_entry(tmp_row[0], tmp_row[1], tmp_row[2], tmp_row[3]);
}
+ //Encrypt and save the database onto a drive
password_manager.encrypt();
password_manager.save();
@@ -113,12 +121,13 @@ void MainWindow::add_entry()
{
int row_count = ui->tableWidgetCredentials->rowCount();
+ //Add the entry to the end of the database and scroll to the row
ui->tableWidgetCredentials->insertRow(row_count);
ui->tableWidgetCredentials->scrollToItem(ui->tableWidgetCredentials->takeItem(row_count, 0));
ui->tableWidgetCredentials->setItem(row_count, 0, new QTableWidgetItem(""));
ui->tableWidgetCredentials->setItem(row_count, 1, new QTableWidgetItem(""));
- ui->tableWidgetCredentials->setItem(row_count, 2, new QTableWidgetItem(password_manager.generate_password(password_length)));
+ ui->tableWidgetCredentials->setItem(row_count, 2, new QTableWidgetItem(password_manager.generate_password(password_length))); //Add generated password
ui->tableWidgetCredentials->setItem(row_count, 3, new QTableWidgetItem(""));
saved = false;
@@ -126,10 +135,27 @@ void MainWindow::add_entry()
void MainWindow::remove_entry()
{
+ //Get a list of selected database entries
QList selected = ui->tableWidgetCredentials->selectedItems();
- saved = selected.size() <= 0;
+ if (selected.size() > 0)
+ {
+ saved = false;
+ }
+ //Get rid of item duplicates caused by multiple collumns
+ int last_row = -1;
+ for (int i = 0; i < selected.size(); i++)
+ {
+ if (last_row == selected[i]->row())
+ {
+ selected.removeAt(i--);
+ continue;
+ }
+ last_row = selected[i]->row();
+ }
+
+ //Remove all selected rows
for (QTableWidgetItem* item : selected)
{
ui->tableWidgetCredentials->removeRow(item->row());
@@ -138,10 +164,27 @@ void MainWindow::remove_entry()
void MainWindow::generate_password()
{
+ //Get a list of selected database entries
QList selected = ui->tableWidgetCredentials->selectedItems();
- saved = selected.size() <= 0;
+ if (selected.size() > 0)
+ {
+ saved = false;
+ }
+ //Get rid of item duplicates caused by multiple collumns
+ int last_row = -1;
+ for (int i = 0; i < selected.size(); i++)
+ {
+ if (last_row == selected[i]->row())
+ {
+ selected.removeAt(i--);
+ continue;
+ }
+ last_row = selected[i]->row();
+ }
+
+ //Generate new password for all selected rows
for (QTableWidgetItem* item : selected)
{
ui->tableWidgetCredentials->setItem(item->row(), 2, new QTableWidgetItem(password_manager.generate_password(password_length)));
@@ -174,6 +217,7 @@ void MainWindow::search(const QString &input)
void MainWindow::closeEvent(QCloseEvent *event)
{
+ //Close the program if the newest database is saved, if not show a dialog
if (saved)
{
event->accept();
@@ -206,17 +250,18 @@ void MainWindow::closeEvent(QCloseEvent *event)
void MainWindow::check_database()
{
-
if (password_manager.database_exists())
{
return;
}
+ //Show new database dialog
QInputDialog input_dialog;
input_dialog.resize(400, 200);
input_dialog.setWindowTitle("Database not Found");
input_dialog.setLabelText("Enter Password for your new Database:");
+ //Close the dialog
if (input_dialog.exec() == 0)
{
close();
@@ -232,6 +277,7 @@ void MainWindow::check_database()
password_manager.save();
}
+ //Recheck to see if a new database has been created
check_database();
}
@@ -242,12 +288,25 @@ void MainWindow::on_spinBoxPasswordLength_valueChanged(int arg1)
void MainWindow::on_tableWidgetCredentials_itemChanged()
{
- saved = false;
+ saved = false; //Set save indicator to false if database entry has been changed
}
void MainWindow::on_tableWidgetCredentials_itemSelectionChanged()
{
- if (ui->tableWidgetCredentials->selectedItems().size() > 1)
+ //Get a list of selected database entries
+ QList selected = ui->tableWidgetCredentials->selectedItems();
+
+ int count = 0;
+ int last_row = -1;
+ //Count the number of entries
+ for (QTableWidgetItem* item : selected)
+ {
+ if (last_row != item->row()) count++; //Count only rows(entries) and not the collumns
+ last_row = item->row();
+ }
+
+ //Set the remove entry button text according to number of selected entries
+ if (count > 1)
{
ui->pushButtonRemoveEntry->setText("Remove Selected Entries");
} else {
diff --git a/mainwindow.h b/mainwindow.h
old mode 100644
new mode 100755
index 70fe17d..dfac43f
--- a/mainwindow.h
+++ b/mainwindow.h
@@ -19,27 +19,27 @@ class MainWindow : public QMainWindow
public:
explicit MainWindow(QString version, QWidget *parent = nullptr);
~MainWindow() override;
- void check_database();
+ void check_database(); //Shows dialog to make a new database if it doesn't exist
protected:
- passman password_manager;
- bool saved = true;
- int password_length = 20;
- void closeEvent(QCloseEvent *event) override;
+ passman password_manager; //Password manager object
+ bool saved = true; //Indicates if all the database changes has been saved
+ int password_length = 20; //Used by the password generator
+ void closeEvent(QCloseEvent *event) override; //Executes when user tries to close the app
protected slots:
- void decrypt_database();
- void backup_database();
- void save_database();
- void add_entry();
- void remove_entry();
- void generate_password();
- void search(const QString &input);
+ void decrypt_database(); //Executes when user clicks on decrypt database button
+ void backup_database(); //Executes when user clicks on backup database button
+ void save_database(); //Executes when user clicks on save database button
+ void add_entry(); //Executes when user clicks on add entry button
+ void remove_entry(); //Executes when user clicks on remove entry button
+ void generate_password(); //Executes when user clicks on generate password button
+ void search(const QString &input); //Executes when user changes
private slots:
- void on_spinBoxPasswordLength_valueChanged(int arg1);
- void on_tableWidgetCredentials_itemChanged();
- void on_tableWidgetCredentials_itemSelectionChanged();
+ void on_spinBoxPasswordLength_valueChanged(int arg1); //Executes when password length spinbox has been changed
+ void on_tableWidgetCredentials_itemChanged(); //Executes when database entry has been changed
+ void on_tableWidgetCredentials_itemSelectionChanged(); //Executes when database entry selection has been changed
private:
Ui::MainWindow *ui;
diff --git a/mainwindow.ui b/mainwindow.ui
old mode 100644
new mode 100755
diff --git a/makearchpkg.sh b/makearchpkg.sh
old mode 100644
new mode 100755
diff --git a/makedebpkg.sh b/makedebpkg.sh
old mode 100644
new mode 100755
diff --git a/parameterparser.cpp b/parameterparser.cpp
old mode 100644
new mode 100755
diff --git a/parameterparser.h b/parameterparser.h
old mode 100644
new mode 100755
index e7008f1..7375454
--- a/parameterparser.h
+++ b/parameterparser.h
@@ -4,6 +4,7 @@
#include
#include
+//Help to manage the program input parameters
class parameterparser
{
public:
@@ -13,7 +14,7 @@ public:
protected:
std::vector arg_names;
std::vector arg_values;
- void parse(int argc, char *argv[]);
+ void parse(int argc, char *argv[]); //Parse the parameters and insert values into vectors of string
};
#endif // PARAMETERPARSER_H
diff --git a/passman.cpp b/passman.cpp
old mode 100644
new mode 100755
index 05067df..12c8ecd
--- a/passman.cpp
+++ b/passman.cpp
@@ -2,7 +2,6 @@
passman::passman() : encryption(new QAESEncryption(QAESEncryption::AES_256, QAESEncryption::CBC)) { }
-//Save Database to Disk
void passman::save() const
{
QFile output_file(database_path);
@@ -11,7 +10,6 @@ void passman::save() const
output_file.close();
}
-//Load Database from Disk
bool passman::load()
{
if (!database_exists())
@@ -27,7 +25,6 @@ bool passman::load()
return true;
}
-//Encrypt Database
void passman::encrypt()
{
QByteArray data = QString("passwords\n").toLocal8Bit();
@@ -37,6 +34,8 @@ void passman::encrypt()
{
for (QString& entry_column : entry_row)
{
+ entry_column = entry_column.replace("\n", "");
+ entry_column = entry_column.replace("\t", "");
data.append((entry_column + '\t').toLocal8Bit());
}
data.append(QString('\n').toLocal8Bit());
@@ -50,7 +49,6 @@ void passman::encrypt()
encrypted_data = data;
}
-//Decrypt Database
bool passman::decrypt()
{
QByteArray data = encrypted_data;
@@ -96,7 +94,6 @@ bool passman::decrypt()
return stringData.startsWith("password");
}
-//Make Database Backup
bool passman::backup() const
{
if (!database_exists())
diff --git a/passman.h b/passman.h
old mode 100644
new mode 100755
index 14a6765..3d9b80c
--- a/passman.h
+++ b/passman.h
@@ -3,6 +3,7 @@
#include
#include
+#include
#include
#include
#include
@@ -16,26 +17,26 @@ class passman
public:
passman();
QString database_path = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation) + "/credentials.database";
- QString key = "";
- void save() const;
- bool load();
- void encrypt();
- bool decrypt();
- bool backup() const;
- void add_entry(QString website_name, QString username, QString password, QString note);
- void remove_entry(int index);
- void alter_entry(int index, QString new_website_name, QString new_username, QString new_password, QString new_note);
- void clear_database();
- std::array get_entry_copy(int index) const;
- std::vector> get_database_copy() const;
- QString generate_password(int length) const;
- bool database_exists() const;
+ QString key = ""; //Database encryption key
+ void save() const; //Save the database to the database path on drive
+ bool load(); //Loads the database from the database path on a drive
+ void encrypt(); //Encrypts database entries into encrypted data
+ bool decrypt(); //Decrypts encrypted database data into database entries
+ bool backup() const; //Backups the database in a backup location on a drive and returns false if there is not a database to backup
+ void add_entry(QString website_name, QString username, QString password, QString note); //Add new entry to database
+ void remove_entry(int index); //Return entry from a database
+ void alter_entry(int index, QString new_website_name, QString new_username, QString new_password, QString new_note); //Alter database entry
+ void clear_database(); //Removes everything from the database
+ std::array get_entry_copy(int index) const; //Returns entry copy from the database
+ std::vector> get_database_copy() const; //Returns full database copy
+ QString generate_password(int length) const; //Returns newly generated password string
+ bool database_exists() const; //Returns true if database exists on a drive in certain location
protected:
- QAESEncryption *encryption;
+ QAESEncryption *encryption; //Pointer to an object used for encryption
QByteArray encrypted_data; //Encrypted Database
std::vector> decrypted_entries; //Database Entries
- QString characters = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ:;.,/=-+*<>{}()[]_%#$@!?^&";
+ QString characters = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ:;.,/=-+*<>{}()[]_%#$@!?^&"; //List of characters for password generator
QStringList ivs = {
"jW2jT]%0k2#-2R1.d(7'6V0Z|4=-HX2G9@F;561.07@21,NHq42)*896M(18R+9w080*Hs^,45G?;]5R7}'*0Z67?Y7|%SFI**0g",
")OR2*711+M)*a,5D/qB}/#]|fN*30oA<#;>]B80>,4J9@<<;J5;#wL*]p$G9D0i1860;Y8!$l9!4?6_,7L%4}z3Lu8;sb^q}9%lVy6I57L]8<,-ho?310Dd_h|y1#iz%3]rN'zr5T1Bc2uQ5cb!K39386)50c0+%.w.X'",
"2-n$rL3v4T/*/22F%2tN}.yDX78#50z3Z9-B10X5*4]97+R-OK'2^F%7$>95c8jLu531C==1|V7Cd=o;5L6/B17jF2C9<1]R4'DY",
- };
+ }; //List of initialization vectors for aes encryption/decryption
};
#endif // PASSMAN_H
diff --git a/passman.pro b/passman.pro
old mode 100644
new mode 100755
diff --git a/passman_icon.svg b/passman_icon.svg
old mode 100644
new mode 100755
diff --git a/qaesencryption.cpp b/qaesencryption.cpp
old mode 100644
new mode 100755
diff --git a/qaesencryption.h b/qaesencryption.h
old mode 100644
new mode 100755
diff --git a/resources.qrc b/resources.qrc
old mode 100644
new mode 100755
diff --git a/screenshot.png b/screenshot.png
old mode 100644
new mode 100755