diff --git a/src/DataStore/ChatDataStore.cpp b/src/DataStore/ChatDataStore.cpp index 82f9db3..bcb1751 100644 --- a/src/DataStore/ChatDataStore.cpp +++ b/src/DataStore/ChatDataStore.cpp @@ -39,6 +39,18 @@ QString ChatDataStore::getPassword() return _password; } +QString ChatDataStore::getSendZaddr() +{ + + return _zaddr; +} + +void ChatDataStore::setSendZaddr(QString zaddr) +{ + + _zaddr = zaddr; +} + void ChatDataStore::setPassword(QString password) { diff --git a/src/DataStore/ChatDataStore.h b/src/DataStore/ChatDataStore.h index c1233b6..aa05662 100644 --- a/src/DataStore/ChatDataStore.h +++ b/src/DataStore/ChatDataStore.h @@ -26,9 +26,13 @@ class ChatDataStore std::map getAllOldContactRequests(); std::map getAllMemos(); QString getPassword(); + QString getSendZaddr(); - void setPassword(QString Password); + void setSendZaddr(QString Password); QString _password; + + void setPassword(QString zaddr); + QString _zaddr; QString dump(); diff --git a/src/addressbook.cpp b/src/addressbook.cpp index e2f481d..3897678 100644 --- a/src/addressbook.cpp +++ b/src/addressbook.cpp @@ -386,25 +386,67 @@ AddressBook::AddressBook() 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()) { + + 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(); - file.open(QIODevice::ReadOnly); - QDataStream in(&file); // read the data serialized from the file + file1.open(QIODevice::ReadOnly); + QDataStream in(&file1); // read the data serialized from the file QString version; in >> version; QList> stuff; in >> stuff; //////////////found old addrbook, and rename it to .bak - if (version != "v2") + if (version == "v1") { auto filename = QStringLiteral("addresslabels.dat"); auto dir = QDir(QStandardPaths::writableLocation(QStandardPaths::AppDataLocation)); QFile address(dir.filePath(filename)); + qDebug() << "is v1"; + address.rename(dir.filePath("addresslabels.bak")); }else{ @@ -419,21 +461,16 @@ void AddressBook::readFromStorage() // qDebug() << "Read " << version << " Hush contacts from disk..."; - file.close(); + file1.close(); + + FileEncryption::encrypt(target_encaddr_file, target_decaddr_file, key); + file1.remove(); } else { qDebug() << "No Hush contacts found on disk!"; } - // Special. - // Add the default silentdragon donation address if it isn't already present - // QList 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("silentdragon donation", Settings::getDonationAddr(true))); - // } } @@ -442,12 +479,49 @@ void AddressBook::writeToStorage() //FileSystem::getInstance()->writeContacts(AddressBook::writeableFile(), DataStore::getContactDataStore()->dump()); // 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); + + #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 */ + } + + - - QFile file(AddressBook::writeableFile()); + 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); QDataStream out(&file); // we will serialize the data into the file QList> contacts; + for(auto &item: allLabels) { QList c; @@ -456,10 +530,20 @@ void AddressBook::writeToStorage() c.push_back(item.getMyAddress()); c.push_back(item.getCid()); c.push_back(item.getAvatar()); - contacts.push_back(c); + contacts.push_back(c); + } out << QString("v2") << contacts; + qDebug()<<"schreibe in Datei: "; 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() diff --git a/src/chatmodel.cpp b/src/chatmodel.cpp index 876c296..0b26b3a 100644 --- a/src/chatmodel.cpp +++ b/src/chatmodel.cpp @@ -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(); 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()); - contactMemo->appendRow(Items); + contactMemo->appendRow(Items); requestContact.requestMemo->setModel(contactMemo); requestContact.requestMemo->show(); @@ -696,8 +696,8 @@ void::MainWindow::addContact() request.setupUi(&dialog); Settings::saveRestore(&dialog); -QObject::connect(request.newZaddr, &QPushButton::clicked, [&] () { - try + + try { bool sapling = true; rpc->createNewZaddr(sapling, [=] (json reply) { @@ -706,6 +706,9 @@ QObject::connect(request.newZaddr, &QPushButton::clicked, [&] () { request.myzaddr->setText(myAddr); ui->listReceiveAddresses->insertItem(0, myAddr); ui->listReceiveAddresses->setCurrentIndex(0); + DataStore::getChatDataStore()->setSendZaddr(myAddr); + + qDebug()<<"Zaddr: "<text(); - QString myAddr = request.myzaddr->text().trimmed(); - QString memo = request.memorequest->toPlainText().trimmed(); - QString avatar = QString(":/icons/res/") + request.comboBoxAvatar->currentText() + QString(".png"); - QString label = request.labelRequest->text().trimmed(); + QString cid = QUuid::createUuid().toString(QUuid::WithoutBraces); + + QObject::connect(request.sendRequestButton, &QPushButton::clicked, this, &MainWindow::saveandsendContact); - contactRequest.setSenderAddress(myAddr); - contactRequest.setReceiverAddress(addr); - contactRequest.setMemo(memo); - contactRequest.setCid(cid); - contactRequest.setAvatar(avatar); - contactRequest.setLabel(label); - }); - - QObject::connect(request.sendRequestButton, &QPushButton::clicked, this, &MainWindow::saveandsendContact); // QObject::connect(request.onlyAdd, &QPushButton::clicked, this, &MainWindow::saveContact); dialog.exec(); @@ -764,7 +752,7 @@ Tx MainWindow::createTxForSafeContactRequest() totalAmt = totalAmt + amt; QString cid = contactRequest.getCid(); - QString myAddr = contactRequest.getSenderAddress(); + QString myAddr = DataStore::getChatDataStore()->getSendZaddr(); QString type = "Cont"; QString addr = contactRequest.getReceiverAddress(); @@ -814,16 +802,6 @@ void MainWindow::ContactRequest() { return; } - if (contactRequest.getSenderAddress().size() > 80) { - - QMessageBox msg(QMessageBox::Critical, tr("Missing HushChat Address"), - tr("You have to create your HushChat address to send a contact request,\n"), - QMessageBox::Ok, this); - - msg.exec(); - return; - } - int max = 235; QString chattext = contactRequest.getMemo();; int size = chattext.size(); diff --git a/src/contactrequest.ui b/src/contactrequest.ui index d187eb1..6f6a529 100644 --- a/src/contactrequest.ui +++ b/src/contactrequest.ui @@ -122,22 +122,6 @@ - - - - - 0 - 0 - - - - Create New Address - - - false - - - diff --git a/src/mainwindow.ui b/src/mainwindow.ui index 8471227..cf6fa57 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -59,7 +59,7 @@ - 2 + 5