From 754aa4ee7fd3dd74d50d4587063a90d31ea5426f Mon Sep 17 00:00:00 2001 From: acetone Date: Sat, 13 Aug 2022 01:35:46 +0300 Subject: [PATCH] beautify interface --- examples/example1.cpp | 28 +++++++++++++++------------- examples/example2.cpp | 19 ++++++++++--------- zerostoragecaptcha.cpp | 40 +++++++++++++++++++++++++++++++++------- zerostoragecaptcha.h | 19 +++++++++++++------ 4 files changed, 71 insertions(+), 35 deletions(-) diff --git a/examples/example1.cpp b/examples/example1.cpp index f7e335d..1d40740 100644 --- a/examples/example1.cpp +++ b/examples/example1.cpp @@ -1,4 +1,4 @@ -// 2022 (c) GPLv3, acetone at i2pmail.org +// GPLv3 (c) acetone, 2022 // Zero Storage Captcha example #include "zerostoragecaptcha.h" @@ -15,18 +15,20 @@ int main(int argc, char *argv[]) // "Environment=QT_QPA_PLATFORM=offscreen" in systemd service ([Service] section) QApplication a(argc, argv); - ZeroStorageCaptchaService::TokenManager::setCaseSensitive(true); - ZeroStorageCaptcha captcha; - captcha.setDifficulty(0); - captcha.generateText(); - captcha.updateCaptcha(); - qInfo() << captcha.token() << captcha.answer(); - QFile f("captcha.png"); - if (not f.open(QIODevice::WriteOnly)) return 1; - f.write(captcha.picture()); - f.close(); - qInfo() << "Validation 1: " << ZeroStorageCaptcha::validate(captcha.answer(), captcha.token()); - qInfo() << "Validation 2: " << ZeroStorageCaptcha::validate(captcha.answer(), captcha.token()); + ZeroStorageCaptcha::setCaseSensitive(true); + ZeroStorageCaptcha::setNumbersOnlyMode(false); // false by default, just example + + ZeroStorageCaptcha c; + c.generateAnswer(); // create captcha text + c.render(); // create picture + QFile pic("c.png"); + if (not pic.open(QIODevice::WriteOnly)) return 1; + pic.write(c.picturePng()); + pic.close(); + + 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(); } diff --git a/examples/example2.cpp b/examples/example2.cpp index 307988a..539ee1a 100644 --- a/examples/example2.cpp +++ b/examples/example2.cpp @@ -1,4 +1,4 @@ -// 2022 (c) GPLv3, acetone at i2pmail.org +// GPLv3 (c) acetone, 2022 // Zero Storage Captcha example #include "zerostoragecaptcha.h" @@ -15,14 +15,15 @@ int main(int argc, char *argv[]) // "Environment=QT_QPA_PLATFORM=offscreen" in systemd service ([Service] section) QApplication a(argc, argv); - ZeroStorageCaptcha captcha; - captcha.generateText(); - captcha.updateCaptcha(); - qInfo() << captcha.token(); - qInfo() << captcha.answer(); - qInfo() << captcha.picture().toBase64(); - qInfo() << "Validation 1:" << ZeroStorageCaptcha::validate(captcha.answer(), captcha.token()); - qInfo() << "Validation 2:" << ZeroStorageCaptcha::validate(captcha.answer(), captcha.token()); + ZeroStorageCaptcha c("myText"); + QFile pic("c.png"); + if (not pic.open(QIODevice::WriteOnly)) return 1; + pic.write(c.picturePng()); + pic.close(); + + qInfo() << c.token() << c.answer(); + qInfo() << "Validate" << ZeroStorageCaptcha::validate (c.answer(), c.token()); + qInfo() << "Validate" << ZeroStorageCaptcha::validate (c.answer(), c.token()); return a.exec(); } diff --git a/zerostoragecaptcha.cpp b/zerostoragecaptcha.cpp index a7ad086..4ca9560 100644 --- a/zerostoragecaptcha.cpp +++ b/zerostoragecaptcha.cpp @@ -1,4 +1,4 @@ -// GPLv3 (c) 2022, acetone +// GPLv3 (c) acetone, 2022 // Zero Storage Captcha // PNG generation based on: @@ -35,7 +35,7 @@ bool ZeroStorageCaptcha::m_onlyNumbers = false; -ZeroStorageCaptcha::ZeroStorageCaptcha() +void ZeroStorageCaptcha::init() { ZeroStorageCaptchaService::TimeToken::init(); @@ -64,9 +64,20 @@ ZeroStorageCaptcha::ZeroStorageCaptcha() } m_padding = 5; +} - setDifficulty(2); - m_captchaText = "NOTSET"; +ZeroStorageCaptcha::ZeroStorageCaptcha() +{ + 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) @@ -74,6 +85,16 @@ bool ZeroStorageCaptcha::validate(const QString &answer, const QString &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 { if (m_token.isEmpty()) @@ -83,7 +104,7 @@ QString ZeroStorageCaptcha::token() const return m_token; } -QByteArray ZeroStorageCaptcha::picture() const +QByteArray ZeroStorageCaptcha::picturePng() const { QByteArray data; QBuffer buff(&data); @@ -91,7 +112,7 @@ QByteArray ZeroStorageCaptcha::picture() const return data; } -void ZeroStorageCaptcha::updateCaptcha() +void ZeroStorageCaptcha::render() { QPainterPath path; 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) { diff --git a/zerostoragecaptcha.h b/zerostoragecaptcha.h index 1e8deb1..c5c0003 100644 --- a/zerostoragecaptcha.h +++ b/zerostoragecaptcha.h @@ -1,4 +1,4 @@ -// GPLv3 (c) 2022, acetone +// GPLv3 (c) acetone, 2022 // Zero Storage Captcha // PNG generation based on: @@ -38,12 +38,16 @@ class ZeroStorageCaptcha { public: ZeroStorageCaptcha(); + ZeroStorageCaptcha(const QString& answer, int difficulty = 1); 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 token() const; - QByteArray picture() const; + QByteArray picturePng() const; QImage qimage() const { return m_captchaImage; } QFont font() const { return m_font; } @@ -76,10 +80,12 @@ public: void setNoisePointSize(int arg) { m_noisePointSize = arg; } void setSinDeform(qreal hAmplitude, qreal hFrequency, qreal vAmplitude, qreal vFrequency); void setDifficulty(int val); - void generateText(int length = 5); - void updateCaptcha(); + void setAnswer(const QString& answer); + void generateAnswer(int length = 5); + void render(); private: + void init(); static bool m_onlyNumbers; qreal m_hmod1; @@ -90,7 +96,7 @@ private: QFont m_font; QImage m_captchaImage; - QString m_captchaText; + QString m_captchaText = "empty"; QColor m_fontColor; QColor m_backColor; qreal m_padding; @@ -148,6 +154,7 @@ public: static QString get(const QString& captchaAnswer, size_t id = 0, bool prevTimeToken = false); static bool validateAnswer(const QString& answer, const QString& token); static void setCaseSensitive(bool enabled = false) { m_caseSensitive = enabled; } + static bool caseSensitive() { return m_caseSensitive; } static void setMaxSizeOfUsedTokensCache(uint64_t size) { m_maximalSizeOfUsedMap = size; } friend TimeToken;