Added support for phonetic key naming

Closes #7
This commit is contained in:
John Crepezzi 2012-01-07 11:35:11 -05:00
parent a958c66249
commit cc65e98940
6 changed files with 87 additions and 13 deletions

View File

@ -38,6 +38,32 @@ which will output a URL to share containing the contents of `cat something`'s ST
* `documents` - static documents to serve (ex: http://hastebin.com/about.com) in addition to static assets. These will never expire.
* `storage` - storage options (see below)
* `logging` - logging preferences
* `keyGenerator` - key generator options (see below)
## Key Generation
### Phonetic
Attempts to generate phonetic keys, similar to `pwgen`
``` json
{
"type": "phonetic"
}
```
### Random
Generates a random key
``` json
{
"type": "random",
"keyspace": "abcdef"
}
```
The _optional_ keySpace argument is a string of acceptable characters for the key.
## Storage

View File

@ -19,6 +19,10 @@
}
],
"keyGenerator": {
"type": "phonetic"
},
"storage": {
"type": "redis",
"host": "localhost",

View File

@ -9,6 +9,7 @@ var DocumentHandler = function(options) {
this.keyLength = options.keyLength || DocumentHandler.defaultKeyLength;
this.maxLength = options.maxLength; // none by default
this.store = options.store;
this.keyGenerator = options.keyGenerator;
};
DocumentHandler.defaultKeyLength = 10;
@ -87,7 +88,7 @@ DocumentHandler.prototype.handlePost = function(request, response) {
// Get a random key that hasn't been already used
DocumentHandler.prototype.chooseKey = function(callback) {
var key = this.randomKey();
var key = this.keyGenerator.createKey(this.keyLength);
var _this = this;
this.store.get(key, function(ret) {
if (ret) {
@ -98,14 +99,4 @@ DocumentHandler.prototype.chooseKey = function(callback) {
});
};
// Generate a random key
DocumentHandler.prototype.randomKey = function() {
var text = '';
var keyspace = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
for (var i = 0; i < this.keyLength; i++) {
text += keyspace.charAt(Math.floor(Math.random() * keyspace.length));
}
return text;
};
module.exports = DocumentHandler;

View File

@ -0,0 +1,32 @@
// Draws inspiration from pwgen and http://tools.arantius.com/password
var PhoneticKeyGenerator = function(options) {
// No options
};
// Generate a phonetic key
PhoneticKeyGenerator.prototype.createKey = function(keyLength) {
var text = '';
for (var i = 0; i < keyLength; i++) {
text += (i % 2 == 0) ? this.randConsonant() : this.randVowel();
}
return text;
};
PhoneticKeyGenerator.consonants = 'bcdfghjklmnpqrstvwxy';
PhoneticKeyGenerator.vowels = 'aeiou';
// Get an random vowel
PhoneticKeyGenerator.prototype.randVowel = function() {
return PhoneticKeyGenerator.vowels[
Math.floor(Math.random() * PhoneticKeyGenerator.vowels.length)
];
};
// Get an random consonant
PhoneticKeyGenerator.prototype.randConsonant = function() {
return PhoneticKeyGenerator.consonants[
Math.floor(Math.random() * PhoneticKeyGenerator.consonants.length)
];
};
module.exports = PhoneticKeyGenerator;

View File

@ -0,0 +1,14 @@
var RandomKeyGenerator = function(options) {
this.keyspace = options.keyspace || 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
};
// Generate a random key
RandomKeyGenerator.prototype.createKey = function(keyLength) {
var text = '';
for (var i = 0; i < keyLength; i++) {
text += this.keyspace.charAt(Math.floor(Math.random() * this.keyspace.length));
}
return text;
};
module.exports = RandomKeyGenerator;

View File

@ -72,11 +72,18 @@ for (var name in config.documents) {
});
}
// Pick up a key generator
var pwOptions = config.keyGenerator || {};
pwOptions.type = pwOptions.type || 'random';
var gen = require('./lib/key_generators/' + pwOptions.type);
var keyGenerator = new gen(pwOptions);
// Configure the document handler
var documentHandler = new DocumentHandler({
store: preferredStore,
maxLength: config.maxLength,
keyLength: config.keyLength
keyLength: config.keyLength,
keyGenerator: keyGenerator
});
// Set the server up with a static cache