1
0
mirror of https://github.com/qTox/qTox.git synced 2024-03-22 14:00:36 +08:00

Incremental work, starting to take shape

This commit is contained in:
dubslow 2014-11-27 10:38:23 -05:00 committed by Dubslow
parent dde410bb9c
commit bafca96554
14 changed files with 176 additions and 62 deletions

View File

@ -83,7 +83,7 @@ win32 {
target.path = /usr/bin
INSTALLS += target
LIBS += -L$$PWD/libs/lib/ -lopus -lvpx -lopenal -Wl,-Bstatic -ltoxcore -ltoxav -ltoxencryptsave -ltoxdns -lsodium -lopencv_highgui -lopencv_imgproc -lopencv_core -lz -Wl,-Bdynamic
LIBS += -Wl,-Bstatic -ljpeg -ltiff -lpng -ljasper -lIlmImf -lIlmThread -lIex -ldc1394 -lraw1394 -lHalf -lz -llzma -ljbig
LIBS += -Wl,-Bstatic -ljpeg -ltiff -lpng -ljasper -lIlmImf -lIlmThread -lIex -ldc1394 -lraw1394 -lHalf -lz -llzma -ljbig
LIBS += -Wl,-Bdynamic -lv4l1 -lv4l2 -lavformat -lavcodec -lavutil -lswscale -lusb-1.0
} else {
LIBS += -L$$PWD/libs/lib/ -ltoxcore -ltoxav -ltoxencryptsave -ltoxdns -lvpx -lsodium -lopenal -lopencv_core -lopencv_highgui -lopencv_imgproc
@ -163,7 +163,8 @@ HEADERS += src/widget/form/addfriendform.h \
src/autoupdate.h \
src/misc/serialize.h \
src/widget/form/settings/advancedform.h \
src/audio.h
src/audio.h \
src/widget/form/checkcontinue.h
SOURCES += \
src/widget/form/addfriendform.cpp \
@ -230,7 +231,8 @@ SOURCES += \
src/autoupdate.cpp \
src/misc/serialize.cpp \
src/widget/form/settings/advancedform.cpp \
src/audio.cpp
src/audio.cpp \
src/widget/form/checkcontinue.cpp
contains(DEFINES, QTOX_PLATFORM_EXT) {
HEADERS += src/platform/timer.h

View File

@ -135,6 +135,7 @@ public slots:
static bool isGroupCallVolEnabled(int groupId);
void setPassword(QString& password, PasswordType passtype, uint8_t* salt = nullptr);
void useOtherPassword(PasswordType type);
void clearPassword(PasswordType passtype);
QByteArray encryptData(const QByteArray& data, PasswordType passtype);
QByteArray decryptData(const QByteArray& data, PasswordType passtype);

View File

@ -50,6 +50,15 @@ void Core::setPassword(QString& password, PasswordType passtype, uint8_t* salt)
password.clear();
}
void Core::useOtherPassword(PasswordType type)
{
clearPassword(type);
if (type == ptHistory)
pwsaltedkeys[ptHistory] = pwsaltedkeys[ptMain];
else if (type == ptMain)
pwsaltedkeys[ptMain] = pwsaltedkeys[ptHistory];
}
void Core::clearPassword(PasswordType passtype)
{
if (pwsaltedkeys[passtype])

View File

@ -71,17 +71,9 @@ HistoryKeeper *HistoryKeeper::getInstance()
bool HistoryKeeper::checkPassword()
{
if (Settings::getInstance().getEnableLogging())
{
if (Settings::getInstance().getEncryptLogs())
{
QString dbpath = getHistoryPath();
return EncryptedDb::check(dbpath);
} else {
return true;
}
} else {
return true;
}
return EncryptedDb::check(getHistoryPath());
return true;
}
HistoryKeeper::HistoryKeeper(GenericDdInterface *db_) :
@ -143,6 +135,12 @@ HistoryKeeper::~HistoryKeeper()
delete db;
}
void HistoryKeeper::reencrypt(QString newpw)
{
// this needs to appropriately set the core password as well
// if newpw.isEmpty(), then use the other core password
}
int HistoryKeeper::addChatEntry(const QString& chat, const QString& message, const QString& sender, const QDateTime &dt, bool isSent)
{
int chat_id = getChatID(chat, ctSingle).first;

View File

@ -52,6 +52,7 @@ public:
int addGroupChatEntry(const QString& chat, const QString& message, const QString& sender, const QDateTime &dt);
QList<HistMessage> getChatHistory(ChatType ct, const QString &chat, const QDateTime &time_from, const QDateTime &time_to);
void markAsSent(int m_id);
void reencrypt(QString newpw);
void setSyncType(Db::syncType sType);

View File

@ -0,0 +1,23 @@
/*
Copyright (C) 2014 by Project Tox <https://tox.im>
This file is part of qTox, a Qt-based graphical interface for Tox.
This program is libre software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the COPYING file for more details.
*/
#include <QMessageBox>
bool checkContinue(const QString& title, const QString& msg, QWidget* parent = nullptr)
{
QMessageBox::StandardButton resp = QMessageBox::question(parent, title, msg, QMessageBox::Yes | QMessageBox::No, QMessageBox::No);
return resp == QMessageBox::Yes;
}

View File

@ -0,0 +1,22 @@
/*
Copyright (C) 2014 by Project Tox <https://tox.im>
This file is part of qTox, a Qt-based graphical interface for Tox.
This program is libre software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the COPYING file for more details.
*/
#ifndef CHECKCONTINUE_H
#define CHECKCONTINUE_H
bool checkContinue(const QString& title, const QString& msg, QWidget* parent = nullptr);
#endif

View File

@ -18,14 +18,23 @@
#include "ui_setpassworddialog.h"
#include <QPushButton>
SetPasswordDialog::SetPasswordDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::SetPasswordDialog)
SetPasswordDialog::SetPasswordDialog(QString body, QString extraButton, QWidget* parent)
: QDialog(parent)
, ui(new Ui::SetPasswordDialog)
{
ui->setupUi(this);
connect(ui->passwordlineEdit, SIGNAL(textChanged(QString)), this, SLOT(onPasswordEdit()));
connect(ui->repasswordlineEdit, SIGNAL(textChanged(QString)), this, SLOT(onPasswordEdit()));
ui->body->setText(body);
if (!extraButton.isEmpty())
{
QPushButton* third = new QPushButton(extraButton);
ui->buttonBox->addButton(third, QDialogButtonBox::YesRole);
connect(third, &QPushButton::clicked, this, [=](){this->done(2);});
}
}
SetPasswordDialog::~SetPasswordDialog()

View File

@ -28,7 +28,7 @@ class SetPasswordDialog : public QDialog
Q_OBJECT
public:
explicit SetPasswordDialog(QWidget *parent = 0);
explicit SetPasswordDialog(QString body, QString extraButton, QWidget* parent = 0);
~SetPasswordDialog();
QString getPassword();

View File

@ -11,39 +11,50 @@
</rect>
</property>
<property name="windowTitle">
<string notr="true">Dialog</string>
<string>Set your password</string>
</property>
<property name="modal">
<bool>true</bool>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Type Password</string>
</property>
</widget>
<widget class="QLabel" name="body" />
</item>
<item>
<widget class="QLineEdit" name="passwordlineEdit">
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
<layout class="QHBoxLayout" name="hLayout1">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Type password:</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="passwordlineEdit">
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>Repeat Password</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="repasswordlineEdit">
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
<layout class="QHBoxLayout" name="hLayout2">
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>Repeat Password</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="repasswordlineEdit">
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer">

View File

@ -20,6 +20,7 @@
#include "src/widget/form/settingswidget.h"
#include "src/misc/settings.h"
#include "src/widget/croppinglabel.h"
#include "src/widget/form/checkcontinue.h"
#include "src/widget/widget.h"
#include "src/historykeeper.h"
#include "src/misc/style.h"
@ -29,7 +30,6 @@
#include <QClipboard>
#include <QInputDialog>
#include <QFileDialog>
#include <QMessageBox>
IdentityForm::IdentityForm() :
GenericForm(tr("Identity"), QPixmap(":/img/settings/identity.png"))
@ -149,7 +149,7 @@ void IdentityForm::onRenameClicked()
QDir dir(Settings::getSettingsDirPath());
QString file = dir.filePath(name+Core::TOX_EXT);
if (!QFile::exists(file) || checkContinue(tr("Profile already exists", "rename confirm title"),
tr("A profile named \"%1\" already exists. Do you want to erase it?", "rename confirm text").arg(cur)))
tr("A profile named \"%1\" already exists. Do you want to erase it?", "rename confirm text").arg(cur)), this)
{
QFile::rename(dir.filePath(cur+Core::TOX_EXT), file);
bodyUI->profiles->setItemText(bodyUI->profiles->currentIndex(), name);
@ -172,7 +172,7 @@ void IdentityForm::onExportClicked()
if (QFile::exists(path))
{
// should we popup a warning?
// if (!checkContinue(tr("Overwriting a file"), tr("Are you sure you want to overwrite %1?").arg(path)))
// if (!checkContinue(tr("Overwriting a file"), tr("Are you sure you want to overwrite %1?").arg(path)), this)
// return;
success = QFile::remove(path);
if (!success)
@ -196,7 +196,7 @@ void IdentityForm::onDeleteClicked()
else
{
if (checkContinue(tr("Deletion imminent!","deletion confirmation title"),
tr("Are you sure you want to delete this profile?\nAssociated friend information and chat logs will be deleted as well.","deletion confirmation text")))
tr("Are you sure you want to delete this profile?","deletion confirmation text"), this))
{
QString profile = bodyUI->profiles->currentText();
QDir dir(Settings::getSettingsDirPath());
@ -235,7 +235,7 @@ void IdentityForm::onImportClicked()
QString profilePath = QDir(Settings::getSettingsDirPath()).filePath(profile + Core::TOX_EXT);
if (QFileInfo(profilePath).exists() && !checkContinue(tr("Profile already exists", "import confirm title"),
tr("A profile named \"%1\" already exists. Do you want to erase it?", "import confirm text").arg(profile)))
tr("A profile named \"%1\" already exists. Do you want to erase it?", "import confirm text").arg(profile), this))
return;
QFile::copy(path, profilePath);
@ -247,12 +247,6 @@ void IdentityForm::onNewClicked()
emit Widget::getInstance()->changeProfile(QString());
}
bool IdentityForm::checkContinue(const QString& title, const QString& msg)
{
QMessageBox::StandardButton resp = QMessageBox::question(this, title, msg, QMessageBox::Yes | QMessageBox::No, QMessageBox::No);
return resp == QMessageBox::Yes;
}
void IdentityForm::disableSwitching()
{
bodyUI->loadButton->setEnabled(false);

View File

@ -66,7 +66,6 @@ private slots:
void onDeleteClicked();
void onImportClicked();
void onNewClicked();
bool checkContinue(const QString& title, const QString& msg);
void disableSwitching();
void enableSwitching();

View File

@ -22,6 +22,7 @@
#include "src/core.h"
#include "src/widget/widget.h"
#include "src/widget/form/setpassworddialog.h"
#include "src/widget/form/checkcontinue.h"
#include <QMessageBox>
#include <QFile>
@ -60,16 +61,65 @@ void PrivacyForm::onTypingNotificationEnabledUpdated()
void PrivacyForm::onEncryptLogsUpdated()
{
bool encryption = bodyUI->cbEncryptHistory->isChecked();
Core* core = Core::getInstance();
if (encryption)
if (bodyUI->cbEncryptHistory->isChecked())
{
if (!core->isPasswordSet(Core::ptHistory))
{
SetPasswordDialog* dialog;
QString body = tr("Please set your new chat log password:");
if (core->isPasswordSet(Core::ptMain))
dialog = new SetPasswordDialog(body, tr("Use datafile password", "pushbutton text"));
else
dialog = new SetPasswordDialog(body, QString());
if (int r = dialog->exec())
{
QString newpw;
if (r != 2)
newpw = dialog->getPassword();
delete dialog;
if (r != 2 && newpw.isEmpty())
goto fail;
Settings::getInstance().setEncryptLogs(true);
bodyUI->cbEncryptHistory->setChecked(true);
// not logically necessary, but more consistent (esp. if the logic changes)
if (!HistoryKeeper::checkPassword())
if (checkContinue(tr("Old encrypted chat logs", "title"),
tr("Would you like to re-encrypt your old chat logs?\nOtherwise they will be deleted.", "body")))
{
HistoryKeeper::getInstance()->reencrypt(newpw);
// will set core and reset itself
return;
}
// @apprb you resetInstance() in the old code but wouldn't that wipe out the current unencrypted history?
// that should of course just become encrypted
if (newpw.isEmpty())
core->useOtherPassword(Core::ptHistory);
else
core->setPassword(newpw, Core::ptHistory);
return;
}
else
delete dialog;
}
}
else
{
if (checkContinue(tr("Old encrypted chat logs", "title"), tr("Would you like to un-encrypt your chat logs?\nOtherwise they will be deleted.")))
{
// TODO: how to unencrypt current encrypted logs
}
else
HistoryKeeper::resetInstance();
}
fail:
core->clearPassword(Core::ptHistory);
Settings::getInstance().setEncryptLogs(false);
bodyUI->cbEncryptHistory->setChecked(false);
}
void PrivacyForm::onEncryptToxUpdated()

View File

@ -18,6 +18,7 @@
#include "widget.h"
#include "src/core.h"
#include "src/misc/settings.h"
#include "src/widget/form/checkcontinue.h"
#include <QCoreApplication>
#include <QDir>
#include <QFileInfo>
@ -30,12 +31,6 @@ void toxSaveEventHandler(const QByteArray& eventData)
handleToxSave(eventData);
}
static bool checkContinue(const QString& title, const QString& msg)
{
QMessageBox::StandardButton resp = QMessageBox::question(Widget::getInstance(), title, msg, QMessageBox::Yes | QMessageBox::No, QMessageBox::No);
return resp == QMessageBox::Yes;
}
void handleToxSave(const QString& path)
{
Core* core = Core::getInstance();