beautify interface
parent
aa47d28b27
commit
754aa4ee7f
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue