diff --git a/README.md b/README.md index 0e49d37..6f604e6 100644 --- a/README.md +++ b/README.md @@ -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 @@ -94,4 +120,4 @@ THE SOFTWARE IS PROVIDED ‘AS IS’, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR I ### Other components: * jQuery: MIT/GPL license -* highlight.js: Copyright © 2006, Ivan Sagalaev \ No newline at end of file +* highlight.js: Copyright © 2006, Ivan Sagalaev diff --git a/config.js b/config.js index 8458d42..8f11900 100644 --- a/config.js +++ b/config.js @@ -19,6 +19,10 @@ } ], + "keyGenerator": { + "type": "phonetic" + }, + "storage": { "type": "redis", "host": "localhost", diff --git a/lib/document_handler.js b/lib/document_handler.js index 8d15a6c..c8aec71 100644 --- a/lib/document_handler.js +++ b/lib/document_handler.js @@ -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; diff --git a/lib/key_generators/phonetic.js b/lib/key_generators/phonetic.js new file mode 100644 index 0000000..c95be82 --- /dev/null +++ b/lib/key_generators/phonetic.js @@ -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; diff --git a/lib/key_generators/random.js b/lib/key_generators/random.js new file mode 100644 index 0000000..4b48071 --- /dev/null +++ b/lib/key_generators/random.js @@ -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; diff --git a/server.js b/server.js index 54f85d5..a46b89b 100644 --- a/server.js +++ b/server.js @@ -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