decrypt addrbook only if needed, show only memos in requests

This commit is contained in:
DenioD
2020-06-12 23:50:50 +02:00
parent 1d4993ecf3
commit 05809afeb1
3 changed files with 118 additions and 34 deletions

View File

@@ -386,13 +386,53 @@ AddressBook::AddressBook()
void AddressBook::readFromStorage() void AddressBook::readFromStorage()
{ {
QFile file(AddressBook::writeableFile()); auto dir = QDir(QStandardPaths::writableLocation(QStandardPaths::AppDataLocation));
QString target_decaddr_file = dir.filePath("addresslabels.dat");
QString target_encaddr_file = dir.filePath("addresslabels.dat.enc");
QFile file(target_encaddr_file);
QFile file1(target_decaddr_file);
if (file.exists()) if (file.exists())
{ {
qDebug() << "Existiert";
QString password = DataStore::getChatDataStore()->getPassword();
int length = password.length();
char *sequence = NULL;
sequence = new char[length+1];
strncpy(sequence, password.toLocal8Bit(), length +1);
#define MESSAGE ((const unsigned char *) sequence)
#define MESSAGE_LEN length
unsigned char hash[crypto_secretstream_xchacha20poly1305_KEYBYTES];
crypto_hash_sha256(hash,MESSAGE, MESSAGE_LEN);
#define PASSWORD sequence
#define KEY_LEN crypto_box_SEEDBYTES
/////////we use the Hash of the Password as Salt, not perfect but still a good solution.
unsigned char key[KEY_LEN];
if (crypto_pwhash
(key, sizeof key, PASSWORD, strlen(PASSWORD), hash,
crypto_pwhash_OPSLIMIT_SENSITIVE, crypto_pwhash_MEMLIMIT_SENSITIVE,
crypto_pwhash_ALG_DEFAULT) != 0) {
/* out of memory */
}
FileEncryption::decrypt(target_decaddr_file, target_encaddr_file, key);
qDebug() << "entschlüsselt";
allLabels.clear(); allLabels.clear();
file.open(QIODevice::ReadOnly); file1.open(QIODevice::ReadOnly);
QDataStream in(&file); // read the data serialized from the file QDataStream in(&file1); // read the data serialized from the file
QString version; QString version;
in >> version; in >> version;
QList<QList<QString>> stuff; QList<QList<QString>> stuff;
@@ -405,6 +445,8 @@ void AddressBook::readFromStorage()
auto dir = QDir(QStandardPaths::writableLocation(QStandardPaths::AppDataLocation)); auto dir = QDir(QStandardPaths::writableLocation(QStandardPaths::AppDataLocation));
QFile address(dir.filePath(filename)); QFile address(dir.filePath(filename));
qDebug() << "is v1";
address.rename(dir.filePath("addresslabels.bak")); address.rename(dir.filePath("addresslabels.bak"));
}else{ }else{
@@ -419,21 +461,16 @@ void AddressBook::readFromStorage()
// qDebug() << "Read " << version << " Hush contacts from disk..."; // qDebug() << "Read " << version << " Hush contacts from disk...";
file.close(); file1.close();
FileEncryption::encrypt(target_encaddr_file, target_decaddr_file, key);
file1.remove();
} }
else else
{ {
qDebug() << "No Hush contacts found on disk!"; qDebug() << "No Hush contacts found on disk!";
} }
// Special.
// Add the default silentdragon donation address if it isn't already present
// QList<QString> allAddresses;
// std::transform(allLabels.begin(), allLabels.end(),
// std::back_inserter(allAddresses), [=] (auto i) { return i.getPartnerAddress(); });
// if (!allAddresses.contains(Settings::getDonationAddr(true))) {
// allLabels.append(QPair<QString, QString>("silentdragon donation", Settings::getDonationAddr(true)));
// }
} }
@@ -443,11 +480,48 @@ void AddressBook::writeToStorage()
// FileSystem::getInstance()->writeContactsOldFormat(AddressBook::writeableFile(), allLabels); // FileSystem::getInstance()->writeContactsOldFormat(AddressBook::writeableFile(), allLabels);
QString password = DataStore::getChatDataStore()->getPassword();
int length = password.length();
char *sequence = NULL;
sequence = new char[length+1];
strncpy(sequence, password.toLocal8Bit(), length +1);
QFile file(AddressBook::writeableFile()); #define MESSAGE ((const unsigned char *) sequence)
#define MESSAGE_LEN length
unsigned char hash[crypto_secretstream_xchacha20poly1305_KEYBYTES];
crypto_hash_sha256(hash,MESSAGE, MESSAGE_LEN);
#define PASSWORD sequence
#define KEY_LEN crypto_box_SEEDBYTES
/////////we use the Hash of the Password as Salt, not perfect but still a good solution.
unsigned char key[KEY_LEN];
if (crypto_pwhash
(key, sizeof key, PASSWORD, strlen(PASSWORD), hash,
crypto_pwhash_OPSLIMIT_SENSITIVE, crypto_pwhash_MEMLIMIT_SENSITIVE,
crypto_pwhash_ALG_DEFAULT) != 0) {
/* out of memory */
}
auto dir = QDir(QStandardPaths::writableLocation(QStandardPaths::AppDataLocation));
QString target_encaddr_file = dir.filePath("addresslabels.dat.enc");
QString target_decaddr_file = dir.filePath("addresslabels.dat");
FileEncryption::decrypt(target_decaddr_file, target_encaddr_file, key);
QFile file(target_decaddr_file);
file.open(QIODevice::ReadWrite | QIODevice::Truncate); file.open(QIODevice::ReadWrite | QIODevice::Truncate);
QDataStream out(&file); // we will serialize the data into the file QDataStream out(&file); // we will serialize the data into the file
QList<QList<QString>> contacts; QList<QList<QString>> contacts;
for(auto &item: allLabels) for(auto &item: allLabels)
{ {
QList<QString> c; QList<QString> c;
@@ -457,9 +531,19 @@ void AddressBook::writeToStorage()
c.push_back(item.getCid()); c.push_back(item.getCid());
c.push_back(item.getAvatar()); c.push_back(item.getAvatar());
contacts.push_back(c); contacts.push_back(c);
} }
out << QString("v2") << contacts; out << QString("v2") << contacts;
qDebug()<<"schreibe in Datei: ";
file.close(); file.close();
FileEncryption::encrypt(target_encaddr_file, target_decaddr_file , key);
QFile file1(target_decaddr_file);
file1.remove();
qDebug()<<"encrypt Addrbook writeToStorage";
} }
QString AddressBook::writeableFile() QString AddressBook::writeableFile()

View File

@@ -163,7 +163,7 @@ void MainWindow::renderContactRequest(){
if ((c.second.isOutgoing() == false) && (label_contact == c.second.getRequestZaddr())) if ((c.second.isOutgoing() == false) && (label_contact == c.second.getRequestZaddr() && (c.second.getMemo().startsWith("{") == false)))
{ {
@@ -194,12 +194,12 @@ void MainWindow::renderContactRequest(){
QString label_contactold = index.data(Qt::DisplayRole).toString(); QString label_contactold = index.data(Qt::DisplayRole).toString();
QStandardItemModel* contactMemo = new QStandardItemModel(); QStandardItemModel* contactMemo = new QStandardItemModel();
if ((c.second.isOutgoing() == false) && (label_contactold == c.second.getContact())) if ((c.second.isOutgoing() == false) && (label_contactold == c.second.getContact()) && (c.second.getMemo().startsWith("{") == false))
{ {
QStandardItem* Items = new QStandardItem(c.second.getMemo()); QStandardItem* Items = new QStandardItem(c.second.getMemo());
contactMemo->appendRow(Items); contactMemo->appendRow(Items);
requestContact.requestMemo->setModel(contactMemo); requestContact.requestMemo->setModel(contactMemo);
requestContact.requestMemo->show(); requestContact.requestMemo->show();

View File

@@ -338,20 +338,20 @@ void MainWindow::closeEvent(QCloseEvent* event) {
auto dir = QDir(QStandardPaths::writableLocation(QStandardPaths::AppDataLocation)); auto dir = QDir(QStandardPaths::writableLocation(QStandardPaths::AppDataLocation));
// auto dirHome = QDir(QStandardPaths::writableLocation(QStandardPaths::HomeLocation)); // auto dirHome = QDir(QStandardPaths::writableLocation(QStandardPaths::HomeLocation));
QString source_file = dir.filePath("addresslabels.dat"); // QString source_file = dir.filePath("addresslabels.dat");
QString target_enc_file = dir.filePath("addresslabels.dat.enc"); // QString target_enc_file = dir.filePath("addresslabels.dat.enc");
QString sourceWallet_file = dirwallet; QString sourceWallet_file = dirwallet;
QString target_encWallet_file = dirwalletenc; QString target_encWallet_file = dirwalletenc;
FileEncryption::encrypt(target_enc_file, source_file, key); // FileEncryption::encrypt(target_enc_file, source_file, key);
FileEncryption::encrypt(target_encWallet_file, sourceWallet_file, key); FileEncryption::encrypt(target_encWallet_file, sourceWallet_file, key);
///////////////// we rename the plaintext wallet.dat to Backup, for testing. ///////////////// we rename the plaintext wallet.dat to Backup, for testing.
QFile wallet(dirwallet); QFile wallet(dirwallet);
QFile address(dir.filePath("addresslabels.dat")); // QFile address(dir.filePath("addresslabels.dat"));
wallet.remove(); wallet.remove();
address.remove(); //address.remove();
} }
@@ -432,18 +432,18 @@ void MainWindow::encryptWallet() {
auto dir = QDir(QStandardPaths::writableLocation(QStandardPaths::AppDataLocation)); auto dir = QDir(QStandardPaths::writableLocation(QStandardPaths::AppDataLocation));
auto dirHome = QDir(QStandardPaths::writableLocation(QStandardPaths::HomeLocation)); auto dirHome = QDir(QStandardPaths::writableLocation(QStandardPaths::HomeLocation));
QString source_file = dir.filePath("addresslabels.dat"); // QString source_file = dir.filePath("addresslabels.dat");
QString target_enc_file = dir.filePath("addresslabels.dat.enc"); // QString target_enc_file = dir.filePath("addresslabels.dat.enc");
QString sourceWallet_file = dirwallet; QString sourceWallet_file = dirwallet;
QString target_encWallet_file = dirwalletenc; QString target_encWallet_file = dirwalletenc;
FileEncryption::encrypt(target_enc_file, source_file, key); // FileEncryption::encrypt(target_enc_file, source_file, key);
FileEncryption::encrypt(target_encWallet_file, sourceWallet_file, key); FileEncryption::encrypt(target_encWallet_file, sourceWallet_file, key);
QFile wallet(dirwallet); QFile wallet(dirwallet);
QFile address(dir.filePath("addresslabels.dat")); // QFile address(dir.filePath("addresslabels.dat"));
wallet.rename(dirwalletbackup); wallet.rename(dirwalletbackup);
address.rename(dir.filePath("addresslabels.datBackup")); // address.rename(dir.filePath("addresslabels.datBackup"));
QMessageBox::information(this, tr("Wallet Encryption Success"), QMessageBox::information(this, tr("Wallet Encryption Success"),
QString("Successfully encrypted your wallet"), QString("Successfully encrypted your wallet"),
@@ -520,11 +520,11 @@ void MainWindow::removeWalletEncryption() {
auto dirHome = QDir(QStandardPaths::writableLocation(QStandardPaths::HomeLocation)); auto dirHome = QDir(QStandardPaths::writableLocation(QStandardPaths::HomeLocation));
QString target_encwallet_file = dirwalletenc; QString target_encwallet_file = dirwalletenc;
QString target_decwallet_file = dirwallet; QString target_decwallet_file = dirwallet;
QString target_encaddr_file = dir.filePath("addresslabels.dat.enc"); // QString target_encaddr_file = dir.filePath("addresslabels.dat.enc");
QString target_decaddr_file = dir.filePath("addresslabels.dat"); // QString target_decaddr_file = dir.filePath("addresslabels.dat");
FileEncryption::decrypt(target_decwallet_file, target_encwallet_file, key); FileEncryption::decrypt(target_decwallet_file, target_encwallet_file, key);
FileEncryption::decrypt(target_decaddr_file, target_encaddr_file, key); // FileEncryption::decrypt(target_decaddr_file, target_encaddr_file, key);
QFile filencrypted(dirwalletenc); QFile filencrypted(dirwalletenc);
QFile wallet(dirwallet); QFile wallet(dirwallet);
@@ -595,11 +595,11 @@ void MainWindow::removeWalletEncryptionStartUp() {
auto dirHome = QDir(QStandardPaths::writableLocation(QStandardPaths::HomeLocation)); auto dirHome = QDir(QStandardPaths::writableLocation(QStandardPaths::HomeLocation));
QString target_encwallet_file = dirwalletenc; QString target_encwallet_file = dirwalletenc;
QString target_decwallet_file = dirwallet; QString target_decwallet_file = dirwallet;
QString target_encaddr_file = dir.filePath("addresslabels.dat.enc"); // QString target_encaddr_file = dir.filePath("addresslabels.dat.enc");
QString target_decaddr_file = dir.filePath("addresslabels.dat"); // QString target_decaddr_file = dir.filePath("addresslabels.dat");
FileEncryption::decrypt(target_decwallet_file, target_encwallet_file, key); FileEncryption::decrypt(target_decwallet_file, target_encwallet_file, key);
FileEncryption::decrypt(target_decaddr_file, target_encaddr_file, key); // FileEncryption::decrypt(target_decaddr_file, target_encaddr_file, key);
} }