Strider
4 years ago
22 changed files with 615 additions and 8 deletions
@ -0,0 +1,102 @@ |
|||||
|
#include "FileEncryption.h" |
||||
|
|
||||
|
void FileEncryption::showConfig() |
||||
|
{ |
||||
|
qInfo() << FILEENCRYPTION_CHUNK_SIZE; |
||||
|
} |
||||
|
|
||||
|
int FileEncryption::encrypt(QString target_file, QString source_file, const unsigned char key[crypto_secretstream_xchacha20poly1305_KEYBYTES]) |
||||
|
{ |
||||
|
unsigned char buf_in[FILEENCRYPTION_CHUNK_SIZE]; |
||||
|
unsigned char buf_out[FILEENCRYPTION_CHUNK_SIZE + crypto_secretstream_xchacha20poly1305_ABYTES]; |
||||
|
unsigned char header[crypto_secretstream_xchacha20poly1305_HEADERBYTES]; |
||||
|
crypto_secretstream_xchacha20poly1305_state st; |
||||
|
FILE *fp_t, *fp_s; |
||||
|
unsigned long long out_len; |
||||
|
size_t rlen; |
||||
|
int eof; |
||||
|
unsigned char tag; |
||||
|
|
||||
|
fp_s = fopen(source_file.toStdString().c_str(), "rb"); |
||||
|
fp_t = fopen(target_file.toStdString().c_str(), "wb"); |
||||
|
crypto_secretstream_xchacha20poly1305_init_push(&st, header, key); |
||||
|
fwrite(header, 1, sizeof header, fp_t); |
||||
|
do |
||||
|
{ |
||||
|
rlen = fread(buf_in, 1, sizeof buf_in, fp_s); |
||||
|
eof = feof(fp_s); |
||||
|
tag = eof ? crypto_secretstream_xchacha20poly1305_TAG_FINAL : 0; |
||||
|
crypto_secretstream_xchacha20poly1305_push( |
||||
|
&st, |
||||
|
buf_out, |
||||
|
&out_len, |
||||
|
buf_in, |
||||
|
rlen, |
||||
|
NULL, |
||||
|
0, |
||||
|
tag |
||||
|
); |
||||
|
|
||||
|
fwrite(buf_out, 1, (size_t) out_len, fp_t); |
||||
|
} |
||||
|
while (! eof); |
||||
|
|
||||
|
fclose(fp_t); |
||||
|
fclose(fp_s); |
||||
|
return 0; |
||||
|
} |
||||
|
|
||||
|
int FileEncryption::decrypt(QString target_file, QString source_file, const unsigned char key[crypto_secretstream_xchacha20poly1305_KEYBYTES]) |
||||
|
{ |
||||
|
unsigned char buf_in[FILEENCRYPTION_CHUNK_SIZE + crypto_secretstream_xchacha20poly1305_ABYTES]; |
||||
|
unsigned char buf_out[FILEENCRYPTION_CHUNK_SIZE]; |
||||
|
unsigned char header[crypto_secretstream_xchacha20poly1305_HEADERBYTES]; |
||||
|
crypto_secretstream_xchacha20poly1305_state st; |
||||
|
FILE *fp_t, *fp_s; |
||||
|
unsigned long long out_len; |
||||
|
size_t rlen; |
||||
|
int eof; |
||||
|
int ret = -1; |
||||
|
unsigned char tag; |
||||
|
|
||||
|
fp_s = fopen(source_file.toStdString().c_str(), "rb"); |
||||
|
fp_t = fopen(target_file.toStdString().c_str(), "wb"); |
||||
|
fread(header, 1, sizeof header, fp_s); |
||||
|
if (crypto_secretstream_xchacha20poly1305_init_pull(&st, header, key) != 0) |
||||
|
{ |
||||
|
goto ret; /* incomplete header */ |
||||
|
} |
||||
|
|
||||
|
do |
||||
|
{ |
||||
|
rlen = fread(buf_in, 1, sizeof buf_in, fp_s); |
||||
|
eof = feof(fp_s); |
||||
|
if (crypto_secretstream_xchacha20poly1305_pull( |
||||
|
&st, |
||||
|
buf_out, |
||||
|
&out_len, |
||||
|
&tag, |
||||
|
buf_in, |
||||
|
rlen, |
||||
|
NULL, |
||||
|
0 |
||||
|
) != 0) |
||||
|
{ |
||||
|
goto ret; /* corrupted chunk */ |
||||
|
} |
||||
|
|
||||
|
if (tag == crypto_secretstream_xchacha20poly1305_TAG_FINAL && ! eof) |
||||
|
{ |
||||
|
goto ret; /* premature end (end of file reached before the end of the stream) */ |
||||
|
} |
||||
|
|
||||
|
fwrite(buf_out, 1, (size_t) out_len, fp_t); |
||||
|
} |
||||
|
while (! eof); |
||||
|
ret = 0; |
||||
|
|
||||
|
ret: |
||||
|
fclose(fp_t); |
||||
|
fclose(fp_s); |
||||
|
return ret; |
||||
|
} |
@ -0,0 +1,18 @@ |
|||||
|
#ifndef FILEENCRYPTION_H |
||||
|
#define FILEENCRYPTION_H |
||||
|
#include <stdio.h> |
||||
|
#include <sodium.h> |
||||
|
#include <QString> |
||||
|
|
||||
|
#define FILEENCRYPTION_CHUNK_SIZE 4096 |
||||
|
|
||||
|
class FileEncryption |
||||
|
{ |
||||
|
public: |
||||
|
static void showConfig(); |
||||
|
static int encrypt(QString target_file, QString source_file, const unsigned char key[crypto_secretstream_xchacha20poly1305_KEYBYTES]); |
||||
|
static int decrypt(QString target_file, QString source_file, const unsigned char key[crypto_secretstream_xchacha20poly1305_KEYBYTES]); |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
#endif |
@ -0,0 +1,82 @@ |
|||||
|
#include "FileSystem.h" |
||||
|
|
||||
|
#include <QString> |
||||
|
#include <QList> |
||||
|
|
||||
|
FileSystem::FileSystem() |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
FileSystem* FileSystem::getInstance() |
||||
|
{ |
||||
|
if(!FileSystem::instanced) |
||||
|
{ |
||||
|
FileSystem::instanced = true; |
||||
|
FileSystem::instance = new FileSystem(); |
||||
|
FileEncryption::showConfig(); |
||||
|
} |
||||
|
|
||||
|
return FileSystem::instance; |
||||
|
} |
||||
|
|
||||
|
QList<ContactItem> FileSystem::readContacts(QString file) |
||||
|
{ |
||||
|
QList<ContactItem> contacts; |
||||
|
QFile _file(file); |
||||
|
if (_file.exists()) |
||||
|
{ |
||||
|
contacts.clear(); |
||||
|
_file.open(QIODevice::ReadOnly); |
||||
|
QDataStream in(&_file); // read the data serialized from the file
|
||||
|
QString version; |
||||
|
in >> version; |
||||
|
qDebug() << "Read " << version << " Hush contacts from disk..."; |
||||
|
qDebug() << "Detected old addressbook format"; |
||||
|
QList<QList<QString>> stuff; |
||||
|
in >> stuff; |
||||
|
//qDebug() << "Stuff: " << stuff;
|
||||
|
for (int i=0; i < stuff.size(); i++) |
||||
|
{ |
||||
|
ContactItem contact = ContactItem(stuff[i][0],stuff[i][1], stuff[i][2], stuff[i][3],stuff[i][4]); |
||||
|
contacts.push_back(contact); |
||||
|
} |
||||
|
|
||||
|
_file.close(); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
qDebug() << "No Hush contacts found on disk!"; |
||||
|
} |
||||
|
|
||||
|
return contacts; |
||||
|
} |
||||
|
|
||||
|
void FileSystem::writeContacts(QString file, QList<ContactItem> contacts) |
||||
|
{ |
||||
|
QFile _file(file); |
||||
|
_file.open(QIODevice::ReadWrite | QIODevice::Truncate); |
||||
|
QDataStream out(&_file); // we will serialize the data into the file
|
||||
|
QList<QList<QString>> _contacts; |
||||
|
for(auto &item: contacts) |
||||
|
{ |
||||
|
QList<QString> c; |
||||
|
c.push_back(item.getName()); |
||||
|
c.push_back(item.getPartnerAddress()); |
||||
|
c.push_back(item.getMyAddress()); |
||||
|
c.push_back(item.getCid()); |
||||
|
c.push_back(item.getAvatar()); |
||||
|
_contacts.push_back(c); |
||||
|
} |
||||
|
out << QString("v1") << _contacts; |
||||
|
_file.close(); |
||||
|
} |
||||
|
|
||||
|
FileSystem::~FileSystem() |
||||
|
{ |
||||
|
this->instance = nullptr; |
||||
|
this->instanced = false; |
||||
|
delete this->instance; |
||||
|
} |
||||
|
|
||||
|
FileSystem *FileSystem::instance = nullptr; |
||||
|
bool FileSystem::instanced = false; |
@ -0,0 +1,24 @@ |
|||||
|
#ifndef FILESYSTEM_H |
||||
|
#define FILESYSTEM_H |
||||
|
|
||||
|
#include <QString> |
||||
|
#include <QList> |
||||
|
#include "../Model/ContactItem.h" |
||||
|
#include "../Crypto/FileEncryption.h" |
||||
|
|
||||
|
class FileSystem |
||||
|
{ |
||||
|
private: |
||||
|
static bool instanced; |
||||
|
static FileSystem* instance; |
||||
|
FileSystem(); |
||||
|
|
||||
|
public: |
||||
|
static FileSystem* getInstance(); |
||||
|
QList<ContactItem> readContacts(QString file); |
||||
|
void writeContacts(QString file, QList<ContactItem> contacts); |
||||
|
~FileSystem(); |
||||
|
|
||||
|
}; |
||||
|
|
||||
|
#endif |
@ -0,0 +1,11 @@ |
|||||
|
#ifndef LOGCONTEXT_H |
||||
|
#define LOGCONTEXT_H |
||||
|
|
||||
|
#include <string> |
||||
|
class LogContext |
||||
|
{ |
||||
|
public: |
||||
|
virtual void log(std::string message) {}; |
||||
|
}; |
||||
|
|
||||
|
#endif |
@ -0,0 +1,18 @@ |
|||||
|
#ifndef LOGCRITICAL_H |
||||
|
#define LOGCRITICAL_H |
||||
|
|
||||
|
#include "LogType.h" |
||||
|
#include "LogStrategy.h" |
||||
|
#include "LogWriter.h" |
||||
|
|
||||
|
class LogCritical : public LogStrategy |
||||
|
{ |
||||
|
public: |
||||
|
void log(std::string message) |
||||
|
{ |
||||
|
LogWriter* lw = LogWriter::getInstance(); |
||||
|
lw->write(LogType::CRITICAL, message); |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
#endif |
@ -0,0 +1,18 @@ |
|||||
|
#ifndef LOGDEBUG_H |
||||
|
#define LOGDEBUG_H |
||||
|
|
||||
|
#include "LogType.h" |
||||
|
#include "LogStrategy.h" |
||||
|
#include "LogWriter.h" |
||||
|
|
||||
|
class LogDebug : public LogStrategy |
||||
|
{ |
||||
|
public: |
||||
|
void log(std::string message) |
||||
|
{ |
||||
|
LogWriter* lw = LogWriter::getInstance(); |
||||
|
lw->write(LogType::DEBUG, message); |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
#endif |
@ -0,0 +1,18 @@ |
|||||
|
#ifndef LOGERROR_H |
||||
|
#define LOGERROR_H |
||||
|
|
||||
|
#include "LogType.h" |
||||
|
#include "LogStrategy.h" |
||||
|
#include "LogWriter.h" |
||||
|
|
||||
|
class LogError : public LogStrategy |
||||
|
{ |
||||
|
public: |
||||
|
void log(std::string message) |
||||
|
{ |
||||
|
LogWriter* lw = LogWriter::getInstance(); |
||||
|
lw->write(LogType::ERROR, message); |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
#endif |
@ -0,0 +1,18 @@ |
|||||
|
#ifndef LOGFATAL_H |
||||
|
#define LOGFATAL_H |
||||
|
|
||||
|
#include "LogType.h" |
||||
|
#include "LogStrategy.h" |
||||
|
#include "LogWriter.h" |
||||
|
|
||||
|
class LogFatal : public LogStrategy |
||||
|
{ |
||||
|
public: |
||||
|
void log(std::string message) |
||||
|
{ |
||||
|
LogWriter* lw = LogWriter::getInstance(); |
||||
|
lw->write(LogType::FATAL, message); |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
#endif |
@ -0,0 +1,18 @@ |
|||||
|
#ifndef LOGINFO_H |
||||
|
#define LOGINFO_H |
||||
|
|
||||
|
#include "LogType.h" |
||||
|
#include "LogStrategy.h" |
||||
|
#include "LogWriter.h" |
||||
|
|
||||
|
class LogInfo : public LogStrategy |
||||
|
{ |
||||
|
public: |
||||
|
void log(std::string message) |
||||
|
{ |
||||
|
LogWriter* lw = LogWriter::getInstance(); |
||||
|
lw->write(LogType::INFO, message); |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
#endif |
@ -0,0 +1,11 @@ |
|||||
|
#ifndef LOGSTRATEGY_H |
||||
|
#define LOGSTRATEGY_H |
||||
|
|
||||
|
#include <string> |
||||
|
class LogStrategy |
||||
|
{ |
||||
|
public: |
||||
|
virtual void log(std::string message) {}; |
||||
|
}; |
||||
|
|
||||
|
#endif |
@ -0,0 +1,18 @@ |
|||||
|
#ifndef LOGSUCCESS_H |
||||
|
#define LOGSUCCESS_H |
||||
|
|
||||
|
#include "LogType.h" |
||||
|
#include "LogStrategy.h" |
||||
|
#include "LogWriter.h" |
||||
|
|
||||
|
class LogSuccess : public LogStrategy |
||||
|
{ |
||||
|
public: |
||||
|
void log(std::string message) |
||||
|
{ |
||||
|
LogWriter* lw = LogWriter::getInstance(); |
||||
|
lw->write(LogType::SUCCESS, message); |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
#endif |
@ -0,0 +1,47 @@ |
|||||
|
#ifndef LOGTYPE_H |
||||
|
#define LOGTYPE_H |
||||
|
|
||||
|
#include <string> |
||||
|
|
||||
|
class LogType |
||||
|
{ |
||||
|
public: |
||||
|
enum TYPE { |
||||
|
INFO = 0, |
||||
|
DEBUG = 1, |
||||
|
SUCCESS = 2, |
||||
|
WARNING = 3, |
||||
|
ERROR = 4, |
||||
|
FATAL = 5, |
||||
|
CRITICAL = 6 |
||||
|
}; |
||||
|
|
||||
|
static std::string enum2String(int type) |
||||
|
{ |
||||
|
switch (type) |
||||
|
{ |
||||
|
default: |
||||
|
case 0: |
||||
|
return "INFO"; |
||||
|
|
||||
|
case 1: |
||||
|
return "DEBUG"; |
||||
|
|
||||
|
case 2: |
||||
|
return "SUCCESS"; |
||||
|
|
||||
|
case 3: |
||||
|
return "WARNING"; |
||||
|
|
||||
|
case 4: |
||||
|
return "ERROR"; |
||||
|
|
||||
|
case 5: |
||||
|
return "FATAL"; |
||||
|
|
||||
|
case 6: |
||||
|
return "CRITICAL"; |
||||
|
} |
||||
|
} |
||||
|
}; |
||||
|
#endif |
@ -0,0 +1,18 @@ |
|||||
|
#ifndef LOGWARNING_H |
||||
|
#define LOGWARNING_H |
||||
|
|
||||
|
#include "LogType.h" |
||||
|
#include "LogStrategy.h" |
||||
|
#include "LogWriter.h" |
||||
|
|
||||
|
class LogWarning : public LogStrategy |
||||
|
{ |
||||
|
public: |
||||
|
void log(std::string message) |
||||
|
{ |
||||
|
LogWriter* lw = LogWriter::getInstance(); |
||||
|
lw->write(LogType::WARNING, message); |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
#endif |
@ -0,0 +1,35 @@ |
|||||
|
#include "LogWriter.h" |
||||
|
|
||||
|
LogWriter* LogWriter::getInstance() |
||||
|
{ |
||||
|
if(instance == nullptr) |
||||
|
instance = new LogWriter(); |
||||
|
|
||||
|
return instance; |
||||
|
} |
||||
|
|
||||
|
void LogWriter::setLogFile(std::string file) |
||||
|
{ |
||||
|
this->logfile = file; |
||||
|
} |
||||
|
|
||||
|
void LogWriter::write(LogType::TYPE type, std::string message) |
||||
|
{ |
||||
|
std::ofstream writer(this->logfile, std::ios::out | std::ios::app); |
||||
|
if(writer.good()) |
||||
|
{ |
||||
|
time_t now = time(0); |
||||
|
tm *ltm = localtime(&now); |
||||
|
std::stringstream ss; |
||||
|
ss << "[" << LogType::enum2String(type) << "] " << |
||||
|
ltm->tm_mon << "-" << |
||||
|
ltm->tm_mday << "-" << |
||||
|
(1900 + ltm->tm_year) << " " << |
||||
|
ltm->tm_hour << ":" << |
||||
|
ltm->tm_min << ":" << |
||||
|
ltm->tm_sec << " > " << message; |
||||
|
writer << ss.str() << "\n"; |
||||
|
} |
||||
|
|
||||
|
writer.close(); |
||||
|
} |
@ -0,0 +1,22 @@ |
|||||
|
#ifndef LOGWRITER_H |
||||
|
#define LOGWRITER_H |
||||
|
|
||||
|
#include <string> |
||||
|
#include <fstream> |
||||
|
#include <sstream> |
||||
|
#include <ctime> |
||||
|
#include "LogType.h" |
||||
|
|
||||
|
class LogWriter |
||||
|
{ |
||||
|
public: |
||||
|
static LogWriter* getInstance(); |
||||
|
std::string logfile = ""; |
||||
|
void setLogFile(std::string file); |
||||
|
void write(LogType::TYPE t, std::string message); |
||||
|
|
||||
|
private: |
||||
|
static LogWriter* instance; |
||||
|
}; |
||||
|
|
||||
|
#endif |
@ -0,0 +1,25 @@ |
|||||
|
#ifndef LOGGER_H |
||||
|
#define LOGGER_H |
||||
|
|
||||
|
#include "LogContext.h" |
||||
|
#include "LogStrategy.h" |
||||
|
#include "LogWriter.h" |
||||
|
|
||||
|
class Logger : LogContext |
||||
|
{ |
||||
|
private: |
||||
|
LogStrategy * strategy = nullptr; |
||||
|
|
||||
|
public: |
||||
|
Logger(LogStrategy * strategy) |
||||
|
{ |
||||
|
this->strategy = strategy; |
||||
|
} |
||||
|
|
||||
|
void log(std::string message) |
||||
|
{ |
||||
|
this->strategy->log(message); |
||||
|
} |
||||
|
}; |
||||
|
LogWriter* LogWriter::instance = nullptr; |
||||
|
#endif |
@ -0,0 +1,84 @@ |
|||||
|
#ifndef SIMPLELOGGER_H |
||||
|
#define SIMPLELOGGER_H |
||||
|
|
||||
|
#include "Logger.h" |
||||
|
#include "LogInfo.h" |
||||
|
#include "LogDebug.h" |
||||
|
#include "LogSuccess.h" |
||||
|
#include "LogWarning.h" |
||||
|
#include "LogError.h" |
||||
|
#include "LogFatal.h" |
||||
|
#include "LogCrtitical.h" |
||||
|
#include "LogWriter.h" |
||||
|
|
||||
|
class SimpleLogger |
||||
|
{ |
||||
|
public: |
||||
|
SimpleLogger() |
||||
|
{ |
||||
|
LogWriter::getInstance()->setLogFile("log.txt"); |
||||
|
} |
||||
|
|
||||
|
SimpleLogger(std::string logFile) |
||||
|
{ |
||||
|
LogWriter::getInstance()->setLogFile(logFile); |
||||
|
} |
||||
|
|
||||
|
void logInfo(std::string message) |
||||
|
{ |
||||
|
Logger* logger = nullptr; |
||||
|
LogStrategy* li = new LogInfo(); |
||||
|
logger = new Logger(li); |
||||
|
logger->log(message); |
||||
|
} |
||||
|
|
||||
|
void logDebug(std::string message) |
||||
|
{ |
||||
|
Logger* logger = nullptr; |
||||
|
LogStrategy* li = new LogDebug(); |
||||
|
logger = new Logger(li); |
||||
|
logger->log(message); |
||||
|
} |
||||
|
|
||||
|
void logSuccess(std::string message) |
||||
|
{ |
||||
|
Logger* logger = nullptr; |
||||
|
LogStrategy* li = new LogSuccess(); |
||||
|
logger = new Logger(li); |
||||
|
logger->log(message); |
||||
|
} |
||||
|
|
||||
|
void logWarning(std::string message) |
||||
|
{ |
||||
|
Logger* logger = nullptr; |
||||
|
LogStrategy* li = new LogWarning(); |
||||
|
logger = new Logger(li); |
||||
|
logger->log(message); |
||||
|
} |
||||
|
|
||||
|
void logError(std::string message) |
||||
|
{ |
||||
|
Logger* logger = nullptr; |
||||
|
LogStrategy* li = new LogError(); |
||||
|
logger = new Logger(li); |
||||
|
logger->log(message); |
||||
|
} |
||||
|
|
||||
|
void logFatal(std::string message) |
||||
|
{ |
||||
|
Logger* logger = nullptr; |
||||
|
LogStrategy* li = new LogFatal(); |
||||
|
logger = new Logger(li); |
||||
|
logger->log(message); |
||||
|
} |
||||
|
|
||||
|
void logCritical(std::string message) |
||||
|
{ |
||||
|
Logger* logger = nullptr; |
||||
|
LogStrategy* li = new LogCritical(); |
||||
|
logger = new Logger(li); |
||||
|
logger->log(message); |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
#endif |
@ -0,0 +1,14 @@ |
|||||
|
#include "SimpleLogger.h" |
||||
|
|
||||
|
int main(int argc, char** argv) |
||||
|
{ |
||||
|
SimpleLogger sl = SimpleLogger("/tmp/simplelog.log"); |
||||
|
sl.logInfo("test info"); |
||||
|
sl.logDebug("test debug"); |
||||
|
sl.logSuccess("test success"); |
||||
|
sl.logWarning("test warning"); |
||||
|
sl.logError("test error"); |
||||
|
sl.logFatal("test fatal"); |
||||
|
sl.logCritical("test critical"); |
||||
|
return 0; |
||||
|
} |
Loading…
Reference in new issue