/* Web Polygraph http://www.web-polygraph.org/
* (C) 2003-2006 The Measurement Factory
* Licensed under the Apache License, Version 2.0 */
#include "pgl/pgl.h"
#include "xstd/h/sstream.h"
#include "xstd/Assert.h"
#include "xstd/Rnd.h"
#include "xstd/gadgets.h"
#include "base/RndPermut.h"
#include "pgl/CredentialsGen.h"
StringArrayBlock::TypeAnchor CredentialsGen::TheTypeAnchor;
String CredentialsGen::ThePfx = "user";
char CredentialsGen::TheSfx = 'x';
int CredentialsGen::TheNextId = 1;
CredentialsGen::CredentialsGen(): StringArrayBlock(&TheTypeAnchor),
theId(TheNextId++), theCount(0) {
}
StringArrayBlock *CredentialsGen::clone() const {
CredentialsGen *g = new CredentialsGen;
g->theId = theId;
g->configure(theCount, theNamespace);
return g;
}
void CredentialsGen::configure(int aCount, const String &aNamespace) {
theCount = aCount;
theNamespace = aNamespace;
}
int CredentialsGen::count() const {
return theCount;
}
String CredentialsGen::item(int idx) const {
if (!Should(0 <= idx && idx < theCount))
return String();
RndGen rng(GlbPermut(idx, theId));
ostringstream buf;
// use 'idx' to ensure uniqueness within the namespace
buf << ThePfx << idx << '_' << hex << (rng.ltrial() % 0xFFFF)
<< '@' << theNamespace
<< ":pw" << hex << rng.ltrial() << TheSfx << ends;
const String res = buf.str().c_str();
streamFreeze(buf, false);
return res;
}
bool CredentialsGen::find(const Area &member, int &idx) const {
if (member.size() <= ThePfx.len() || ThePfx.cmp(member.data(), ThePfx.len()) != 0)
return false;
if (member.data()[member.size()-1] != TheSfx)
return false;
int i = -1;
if (!isInt(member.data() + ThePfx.len(), i))
return false;
if (!(0 <= i && i < theCount))
return false;
const String m = item(i);
if (m.len() != member.size() || m.cmp(member.data(), member.size()) != 0)
return false;
idx = i;
return true;
}
bool CredentialsGen::canMergeSameType(const StringArrayBlock &b) const {
return false;
}
void CredentialsGen::mergeSameType(const StringArrayBlock &) {
Assert(false); // should not be called, see canMergeSameType()
}
syntax highlighted by Code2HTML, v. 0.9.1