beautify interface

pull/2/head
acetone 2022-08-13 01:35:46 +03:00
parent aa47d28b27
commit 754aa4ee7f
4 changed files with 71 additions and 35 deletions

View File

@ -1,4 +1,4 @@
// 2022 (c) GPLv3, acetone at i2pmail.org // GPLv3 (c) acetone, 2022
// Zero Storage Captcha example // Zero Storage Captcha example
#include "zerostoragecaptcha.h" #include "zerostoragecaptcha.h"
@ -15,18 +15,20 @@ int main(int argc, char *argv[])
// "Environment=QT_QPA_PLATFORM=offscreen" in systemd service ([Service] section) // "Environment=QT_QPA_PLATFORM=offscreen" in systemd service ([Service] section)
QApplication a(argc, argv); QApplication a(argc, argv);
ZeroStorageCaptchaService::TokenManager::setCaseSensitive(true); ZeroStorageCaptcha::setCaseSensitive(true);
ZeroStorageCaptcha captcha; ZeroStorageCaptcha::setNumbersOnlyMode(false); // false by default, just example
captcha.setDifficulty(0);
captcha.generateText(); ZeroStorageCaptcha c;
captcha.updateCaptcha(); c.generateAnswer(); // create captcha text
qInfo() << captcha.token() << captcha.answer(); c.render(); // create picture
QFile f("captcha.png"); QFile pic("c.png");
if (not f.open(QIODevice::WriteOnly)) return 1; if (not pic.open(QIODevice::WriteOnly)) return 1;
f.write(captcha.picture()); pic.write(c.picturePng());
f.close(); pic.close();
qInfo() << "Validation 1: " << ZeroStorageCaptcha::validate(captcha.answer(), captcha.token());
qInfo() << "Validation 2: " << ZeroStorageCaptcha::validate(captcha.answer(), captcha.token()); qInfo() << c.token() << c.answer();
qInfo() << "Validate" << ZeroStorageCaptcha::validate (c.answer(), c.token()); // first - success
qInfo() << "Validate" << ZeroStorageCaptcha::validate (c.answer(), c.token()); // second - failed
return a.exec(); return a.exec();
} }

View File

@ -1,4 +1,4 @@
// 2022 (c) GPLv3, acetone at i2pmail.org // GPLv3 (c) acetone, 2022
// Zero Storage Captcha example // Zero Storage Captcha example
#include "zerostoragecaptcha.h" #include "zerostoragecaptcha.h"
@ -15,14 +15,15 @@ int main(int argc, char *argv[])
// "Environment=QT_QPA_PLATFORM=offscreen" in systemd service ([Service] section) // "Environment=QT_QPA_PLATFORM=offscreen" in systemd service ([Service] section)
QApplication a(argc, argv); QApplication a(argc, argv);
ZeroStorageCaptcha captcha; ZeroStorageCaptcha c("myText");
captcha.generateText(); QFile pic("c.png");
captcha.updateCaptcha(); if (not pic.open(QIODevice::WriteOnly)) return 1;
qInfo() << captcha.token(); pic.write(c.picturePng());
qInfo() << captcha.answer(); pic.close();
qInfo() << captcha.picture().toBase64();
qInfo() << "Validation 1:" << ZeroStorageCaptcha::validate(captcha.answer(), captcha.token()); qInfo() << c.token() << c.answer();
qInfo() << "Validation 2:" << ZeroStorageCaptcha::validate(captcha.answer(), captcha.token()); qInfo() << "Validate" << ZeroStorageCaptcha::validate (c.answer(), c.token());
qInfo() << "Validate" << ZeroStorageCaptcha::validate (c.answer(), c.token());
return a.exec(); return a.exec();
} }

View File

@ -1,4 +1,4 @@
// GPLv3 (c) 2022, acetone // GPLv3 (c) acetone, 2022
// Zero Storage Captcha // Zero Storage Captcha
// PNG generation based on: // PNG generation based on:
@ -35,7 +35,7 @@
bool ZeroStorageCaptcha::m_onlyNumbers = false; bool ZeroStorageCaptcha::m_onlyNumbers = false;
ZeroStorageCaptcha::ZeroStorageCaptcha() void ZeroStorageCaptcha::init()
{ {
ZeroStorageCaptchaService::TimeToken::init(); ZeroStorageCaptchaService::TimeToken::init();
@ -64,9 +64,20 @@ ZeroStorageCaptcha::ZeroStorageCaptcha()
} }
m_padding = 5; m_padding = 5;
}
setDifficulty(2); ZeroStorageCaptcha::ZeroStorageCaptcha()
m_captchaText = "NOTSET"; {
init();
setDifficulty(1);
}
ZeroStorageCaptcha::ZeroStorageCaptcha(const QString &answer, int difficulty)
{
init();
setAnswer(answer);
setDifficulty(difficulty);
render();
} }
bool ZeroStorageCaptcha::validate(const QString &answer, const QString &token) bool ZeroStorageCaptcha::validate(const QString &answer, const QString &token)
@ -74,6 +85,16 @@ bool ZeroStorageCaptcha::validate(const QString &answer, const QString &token)
return ZeroStorageCaptchaService::TokenManager::validateAnswer(answer, token); return ZeroStorageCaptchaService::TokenManager::validateAnswer(answer, token);
} }
void ZeroStorageCaptcha::setCaseSensitive(bool enabled)
{
ZeroStorageCaptchaService::TokenManager::setCaseSensitive(enabled);
}
void ZeroStorageCaptcha::caseSensitive()
{
ZeroStorageCaptchaService::TokenManager::caseSensitive();
}
QString ZeroStorageCaptcha::token() const QString ZeroStorageCaptcha::token() const
{ {
if (m_token.isEmpty()) if (m_token.isEmpty())
@ -83,7 +104,7 @@ QString ZeroStorageCaptcha::token() const
return m_token; return m_token;
} }
QByteArray ZeroStorageCaptcha::picture() const QByteArray ZeroStorageCaptcha::picturePng() const
{ {
QByteArray data; QByteArray data;
QBuffer buff(&data); QBuffer buff(&data);
@ -91,7 +112,7 @@ QByteArray ZeroStorageCaptcha::picture() const
return data; return data;
} }
void ZeroStorageCaptcha::updateCaptcha() void ZeroStorageCaptcha::render()
{ {
QPainterPath path; QPainterPath path;
QFontMetrics fm(m_font); QFontMetrics fm(m_font);
@ -249,7 +270,12 @@ void ZeroStorageCaptcha::setDifficulty(int val)
} }
} }
void ZeroStorageCaptcha::generateText(int length) void ZeroStorageCaptcha::setAnswer(const QString &answer)
{
m_captchaText = answer;
}
void ZeroStorageCaptcha::generateAnswer(int length)
{ {
if (length <= 0) if (length <= 0)
{ {

View File

@ -1,4 +1,4 @@
// GPLv3 (c) 2022, acetone // GPLv3 (c) acetone, 2022
// Zero Storage Captcha // Zero Storage Captcha
// PNG generation based on: // PNG generation based on:
@ -38,12 +38,16 @@ class ZeroStorageCaptcha
{ {
public: public:
ZeroStorageCaptcha(); ZeroStorageCaptcha();
ZeroStorageCaptcha(const QString& answer, int difficulty = 1);
static bool validate(const QString& answer, const QString& token); static bool validate(const QString& answer, const QString& token);
static void setOnlyNumbersMode(bool enabled = false) { m_onlyNumbers = enabled; } static void setNumbersOnlyMode(bool enabled = false) { m_onlyNumbers = enabled; }
static bool numbersOnlyMode() { return m_onlyNumbers; }
static void setCaseSensitive(bool enabled = false);
static void caseSensitive();
QString answer() const { return m_captchaText; } QString answer() const { return m_captchaText; }
QString token() const; QString token() const;
QByteArray picture() const; QByteArray picturePng() const;
QImage qimage() const { return m_captchaImage; } QImage qimage() const { return m_captchaImage; }
QFont font() const { return m_font; } QFont font() const { return m_font; }
@ -76,10 +80,12 @@ public:
void setNoisePointSize(int arg) { m_noisePointSize = arg; } void setNoisePointSize(int arg) { m_noisePointSize = arg; }
void setSinDeform(qreal hAmplitude, qreal hFrequency, qreal vAmplitude, qreal vFrequency); void setSinDeform(qreal hAmplitude, qreal hFrequency, qreal vAmplitude, qreal vFrequency);
void setDifficulty(int val); void setDifficulty(int val);
void generateText(int length = 5); void setAnswer(const QString& answer);
void updateCaptcha(); void generateAnswer(int length = 5);
void render();
private: private:
void init();
static bool m_onlyNumbers; static bool m_onlyNumbers;
qreal m_hmod1; qreal m_hmod1;
@ -90,7 +96,7 @@ private:
QFont m_font; QFont m_font;
QImage m_captchaImage; QImage m_captchaImage;
QString m_captchaText; QString m_captchaText = "empty";
QColor m_fontColor; QColor m_fontColor;
QColor m_backColor; QColor m_backColor;
qreal m_padding; qreal m_padding;
@ -148,6 +154,7 @@ public:
static QString get(const QString& captchaAnswer, size_t id = 0, bool prevTimeToken = false); static QString get(const QString& captchaAnswer, size_t id = 0, bool prevTimeToken = false);
static bool validateAnswer(const QString& answer, const QString& token); static bool validateAnswer(const QString& answer, const QString& token);
static void setCaseSensitive(bool enabled = false) { m_caseSensitive = enabled; } static void setCaseSensitive(bool enabled = false) { m_caseSensitive = enabled; }
static bool caseSensitive() { return m_caseSensitive; }
static void setMaxSizeOfUsedTokensCache(uint64_t size) { m_maximalSizeOfUsedMap = size; } static void setMaxSizeOfUsedTokensCache(uint64_t size) { m_maximalSizeOfUsedMap = size; }
friend TimeToken; friend TimeToken;