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
#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();
}

View File

@ -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();
}

View File

@ -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)
{

View File

@ -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;