Commit 36a1fe49 authored by Aaron J. Seigo's avatar Aaron J. Seigo
Browse files

use KRandom, avoid modulo bias

parent e47a384e
......@@ -27,6 +27,7 @@
#include <KDebug>
#include <KLocale>
#include <KMessageBox>
#include <KRandom>
class PasteMacroExpanderSingleton
{
......@@ -142,35 +143,49 @@ QString PasteMacroExpander::password(const QString& args)
<< "01234567890"
<< "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~";
int charCount;
int charCount = 8;
QString chars;
QString result;
if (a.count() > 0) {
charCount = qMax(a[0].trimmed().toInt(), 1);
} else {
charCount = 8;
charCount = qMax(a[0].trimmed().toInt(), 8);
}
if (a.count() < 2) {
chars = characterSets.join("");
}
if (a.count() > 1) {
chars += (a[1].trimmed() == "true") ? characterSets[0] : "";
}
if (a.count() > 2) {
chars += (a[2].trimmed() == "true") ? characterSets[1] : "";
}
if (a.count() > 3) {
chars += (a[3].trimmed() == "true") ? characterSets[2] : "";
}
if (a.count() > 4) {
chars += (a[4].trimmed() == "true") ? characterSets[3] : "";
}
QDateTime now = QDateTime::currentDateTime();
qsrand(now.toTime_t() / now.time().msec());
const int setSize = chars.count();
const int top = (RAND_MAX / setSize) * setSize;
kDebug() << "topping out at " << setSize << RAND_MAX << top;
for (int i = 0; i < charCount; ++i) {
result += chars[qrand() % chars.count()];
// to prevent modulo bias, discard random numbers at the
// 'top end' of INT_MAX
int rand = -1;
do {
if (rand > 0) {
kDebug() << "Ha!" << rand;
}
rand = KRandom::random();
} while (rand >= top);
result += chars[rand % setSize];
}
//kDebug() << result;
return result;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment