diff --git a/.gitignore b/.gitignore index b0346bd65581b6b621f1720e7f860c7d88efd317..3641ea8f464ca6631e49512bb28279697cecc4e7 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ /node_modules /var /rpmbuild +/npm-debug.log diff --git a/browserid/app.js b/bin/browserid old mode 100644 new mode 100755 similarity index 51% rename from browserid/app.js rename to bin/browserid index 6f661ee7c23063c93e6e44bfcfaaafda91e8e68f..710f4ea686b64267d8285826211b7be1ad263db0 --- a/browserid/app.js +++ b/bin/browserid @@ -1,3 +1,5 @@ +#!/usr/bin/env node + /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * @@ -37,25 +39,31 @@ const fs = require('fs'), path = require('path'), url = require('url'), -wsapi = require('./lib/wsapi.js'), -ca = require('./lib/ca.js'), -httputils = require('./lib/httputils.js'), -sessions = require('connect-cookie-session'), +sessions = require('connect-cookie-session'); + +// add lib/ to the require path +require.paths.unshift(path.join(__dirname, '..', 'lib')); + +const +wsapi = require('browserid/wsapi.js'), +ca = require('browserid/ca.js'), +httputils = require('httputils.js'), express = require('express'), -secrets = require('../libs/secrets.js'), -db = require('./lib/db.js'), -configuration = require('../libs/configuration.js'), -heartbeat = require('../libs/heartbeat.js'), -substitution = require('../libs/substitute.js'); -metrics = require("../libs/metrics.js"), -logger = require("../libs/logging.js").logger; +secrets = require('secrets.js'), +db = require('db.js'), +config = require('configuration.js'), +heartbeat = require('heartbeat.js'), +metrics = require("metrics.js"), +logger = require("logging.js").logger, +forward = require('browserid/http_forward'); -logger.info("browserid server starting up"); +var app = undefined; -// open the databse -db.open(configuration.get('database')); +app = express.createServer(); -const COOKIE_SECRET = secrets.hydrateSecret('browserid_cookie', configuration.get('var_path')); +logger.info("browserid server starting up"); + +const COOKIE_SECRET = secrets.hydrateSecret('browserid_cookie', config.get('var_path')); const COOKIE_KEY = 'browserid_state'; function internal_redirector(new_url, suppress_noframes) { @@ -68,10 +76,10 @@ function internal_redirector(new_url, suppress_noframes) { } function router(app) { - app.set("views", __dirname + '/views'); + app.set("views", path.join(__dirname, "..", "resources", "views")); app.set('view options', { - production: configuration.get('use_minified_resources') + production: config.get('use_minified_resources') }); // this should probably be an internal redirect @@ -82,7 +90,7 @@ function router(app) { title: 'A Better Way to Sign In', layout: 'dialog_layout.ejs', useJavascript: true, - production: configuration.get('use_minified_resources') + production: config.get('use_minified_resources') }); }); @@ -99,7 +107,7 @@ function router(app) { res.removeHeader('x-frame-options'); res.render('relay.ejs', { layout: false, - production: configuration.get('use_minified_resources') + production: config.get('use_minified_resources') }); }); @@ -192,139 +200,160 @@ function router(app) { }); }; -exports.setup = function(server) { - // request to logger, dev formatted which omits personal data in the requests - server.use(express.logger({ - format: 'dev', - stream: { - write: function(x) { - logger.info(typeof x === 'string' ? x.trim() : x); - } +// request to logger, dev formatted which omits personal data in the requests +app.use(express.logger({ + format: 'dev', + stream: { + write: function(x) { + logger.info(typeof x === 'string' ? x.trim() : x); } - })); - - // over SSL? - var overSSL = (configuration.get('scheme') == 'https'); - - server.use(express.cookieParser()); - - var cookieSessionMiddleware = sessions({ - secret: COOKIE_SECRET, - key: COOKIE_KEY, - cookie: { - path: '/wsapi', - httpOnly: true, - // IMPORTANT: we allow users to go 1 weeks on the same device - // without entering their password again - maxAge: configuration.get('authentication_duration_ms'), - secure: overSSL - } - }); - - // cookie sessions && cache control - server.use(function(req, resp, next) { - // cookie sessions are only applied to calls to /wsapi - // as all other resources can be aggressively cached - // by layers higher up based on cache control headers. - // the fallout is that all code that interacts with sessions - // should be under /wsapi - if (/^\/wsapi/.test(req.url)) { - // explicitly disallow caching on all /wsapi calls (issue #294) - resp.setHeader('Cache-Control', 'no-cache, max-age=0'); - - // we set this parameter so the connect-cookie-session - // sends the cookie even though the local connection is HTTP - // (the load balancer does SSL) - if (overSSL) - req.connection.proxySecure = true; - - return cookieSessionMiddleware(req, resp, next); - + } +})); + +// if these are verify requests, we'll redirect them off +// to the verifier +if (config.get('verifier_url')) { + app.use(function(req, res, next) { + if (/^\/verify$/.test(req.url)) { + forward( + config.get('verifier_url'), req, res, + function(err) { + if (err) { + logger.error("error forwarding request:", err); + } + }); } else { return next(); } }); +} - // verify all JSON responses are objects - prevents regression on issue #217 - server.use(function(req, resp, next) { - var realRespJSON = resp.json; - resp.json = function(obj) { - if (!obj || typeof obj !== 'object') { - logger.error("INTERNAL ERROR! *all* json responses must be objects"); - throw "internal error"; - } - realRespJSON.call(resp, obj); - }; +// over SSL? +var overSSL = (config.get('scheme') == 'https'); + +app.use(express.cookieParser()); + +var cookieSessionMiddleware = sessions({ + secret: COOKIE_SECRET, + key: COOKIE_KEY, + cookie: { + path: '/wsapi', + httpOnly: true, + // IMPORTANT: we allow users to go 1 weeks on the same device + // without entering their password again + maxAge: config.get('authentication_duration_ms'), + secure: overSSL + } +}); + +// cookie sessions && cache control +app.use(function(req, resp, next) { + // cookie sessions are only applied to calls to /wsapi + // as all other resources can be aggressively cached + // by layers higher up based on cache control headers. + // the fallout is that all code that interacts with sessions + // should be under /wsapi + if (/^\/wsapi/.test(req.url)) { + // explicitly disallow caching on all /wsapi calls (issue #294) + resp.setHeader('Cache-Control', 'no-cache, max-age=0'); + + // we set this parameter so the connect-cookie-session + // sends the cookie even though the local connection is HTTP + // (the load balancer does SSL) + if (overSSL) + req.connection.proxySecure = true; + + return cookieSessionMiddleware(req, resp, next); + + } else { return next(); - }); - - server.use(express.bodyParser()); - - // Check CSRF token early. POST requests are only allowed to - // /wsapi and they always must have a valid csrf token - server.use(function(req, resp, next) { - // only on POSTs - if (req.method == "POST") { - var denied = false; - if (!/^\/wsapi/.test(req.url)) { // post requests only allowed to /wsapi - denied = true; - logger.warn("CSRF validation failure: POST only allowed to /wsapi urls. not '" + req.url + "'"); - } - - if (req.session === undefined) { // there must be a session - denied = true; - logger.warn("CSRF validation failure: POST calls to /wsapi require an active session"); - } + } +}); - // the session must have a csrf token - if (typeof req.session.csrf !== 'string') { - denied = true; - logger.warn("CSRF validation failure: POST calls to /wsapi require an csrf token to be set"); - } +config.performSubstitution(app); - // and the token must match what is sent in the post body - if (req.body.csrf != req.session.csrf) { - denied = true; - // if any of these things are false, then we'll block the request - logger.warn("CSRF validation failure, token mismatch. got:" + req.body.csrf + " want:" + req.session.csrf); - } +// verify all JSON responses are objects - prevents regression on issue #217 +app.use(function(req, resp, next) { + var realRespJSON = resp.json; + resp.json = function(obj) { + if (!obj || typeof obj !== 'object') { + logger.error("INTERNAL ERROR! *all* json responses must be objects"); + throw "internal error"; + } + realRespJSON.call(resp, obj); + }; + return next(); +}); + +app.use(express.bodyParser()); + +// Check CSRF token early. POST requests are only allowed to +// /wsapi and they always must have a valid csrf token +app.use(function(req, resp, next) { + // only on POSTs + if (req.method == "POST") { + var denied = false; + if (!/^\/wsapi/.test(req.url)) { // post requests only allowed to /wsapi + denied = true; + logger.warn("CSRF validation failure: POST only allowed to /wsapi urls. not '" + req.url + "'"); + } - if (denied) return httputils.badRequest(resp, "CSRF violation"); + if (req.session === undefined) { // there must be a session + denied = true; + logger.warn("CSRF validation failure: POST calls to /wsapi require an active session"); + } + // the session must have a csrf token + if (typeof req.session.csrf !== 'string') { + denied = true; + logger.warn("CSRF validation failure: POST calls to /wsapi require an csrf token to be set"); } - return next(); - }); - // a tweak to get the content type of host-meta correct - server.use(function(req, resp, next) { - if (req.url === '/.well-known/host-meta') { - resp.setHeader('content-type', 'text/xml'); + // and the token must match what is sent in the post body + if (req.body.csrf != req.session.csrf) { + denied = true; + // if any of these things are false, then we'll block the request + logger.warn("CSRF validation failure, token mismatch. got:" + req.body.csrf + " want:" + req.session.csrf); } - next(); - }); - // Strict Transport Security - server.use(function(req, resp, next) { - if (overSSL) { - // expires in 30 days, include subdomains like www - resp.setHeader("Strict-Transport-Security", "max-age=2592000; includeSubdomains"); - } - next(); - }); + if (denied) return httputils.badRequest(resp, "CSRF violation"); - // prevent framing - server.use(function(req, resp, next) { - resp.setHeader('x-frame-options', 'DENY'); - next(); - }); + } + return next(); +}); - // add middleware to re-write urls if needed - configuration.performSubstitution(server); +// a tweak to get the content type of host-meta correct +app.use(function(req, resp, next) { + if (req.url === '/.well-known/host-meta') { + resp.setHeader('content-type', 'text/xml'); + } + next(); +}); + +// Strict Transport Security +app.use(function(req, resp, next) { + if (overSSL) { + // expires in 30 days, include subdomains like www + resp.setHeader("Strict-Transport-Security", "max-age=2592000; includeSubdomains"); + } + next(); +}); - // add the actual URL handlers other than static - router(server); -} +// prevent framing +app.use(function(req, resp, next) { + resp.setHeader('x-frame-options', 'DENY'); + next(); +}); -exports.shutdown = function() { - db.close(); -}; +// add the actual URL handlers other than static +router(app); + +// use the express 'static' middleware for serving of static files (cache headers, HTTP range, etc) +app.use(express.static(path.join(__dirname, "..", "resources", "static"))); + +// open the databse +db.open(config.get('database'), function () { + app.listen(config.get('port'), config.get('hostname'), function() { + logger.info("running on http://" + app.address().address + ":" + app.address().port); + }); +}); \ No newline at end of file diff --git a/performance/run.js b/bin/load_gen similarity index 97% rename from performance/run.js rename to bin/load_gen index fea7840d007065bffe5d4f0721b24240b8b4a916..b3cd137a90a817b068aad1648ade916f8544f962 100755 --- a/performance/run.js +++ b/bin/load_gen @@ -20,7 +20,7 @@ * the Initial Developer. All Rights Reserved. * * Contributor(s): - * Lloyd Hilaiel <lloyd@hilaiel.com> + * Lloyd Hilaiel <lloyd@hilaiel.com> * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or @@ -40,8 +40,7 @@ * tool, which is capable of analysing the maximum active users that * a browserid deployment can support */ - -// option processing with optimist +// option processing with optimist var argv = require('optimist') .usage('Apply load to a BrowserID server.\nUsage: $0', [ "foo" ]) .alias('h', 'help') @@ -92,14 +91,14 @@ var completed = { const activitiesPerUserPerSecond = (40.0 / ( 24 * 60 * 60 )); // activities -var activity = { +var activity = { "signup": { // a %20 montly growth rate means there's a 20% probability of // the monthly activity generated by an active user being a // new user signup probability: (1.0 / (40 * 28 * .2)) }, - "reset_pass": { + "reset_pass": { // users forget their password once every 4 weeks probability: (1.0 / (40 * 28.0)) }, @@ -129,7 +128,7 @@ var activity = { // now attach "start functions" to the activity map by including // the implementation of each activity Object.keys(activity).forEach(function(k) { - activity[k].startFunc = require("./lib/" + k).startFunc; + activity[k].startFunc = require("../lib/performance/" + k).startFunc; }); // probs is a 2d array mapping normalized probabilities from 0-1 to @@ -237,12 +236,12 @@ function poll() { // how many active users would we like to simulate var targetActive = args.m; - + // if we're not throttled, then we'll trying 150% as many as // we're simulating right now. If we're not simulating at least // 10000 active users, that shall be our lower bound if (!targetActive) { - if (averages[0] > 10000) targetActive = averages[0] * 1.5; + if (averages[0] > 10000) targetActive = averages[0] * 1.5; else targetActive = 10000; } diff --git a/verifier/app.js b/bin/verifier old mode 100644 new mode 100755 similarity index 65% rename from verifier/app.js rename to bin/verifier index 5e2c840d249a7c604686bd28371c6401ad992b90..6ba09340da954cef1d9884266a8e7b252a23b22b --- a/verifier/app.js +++ b/bin/verifier @@ -1,3 +1,5 @@ +#!/usr/bin/env node + /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * @@ -34,26 +36,51 @@ * * ***** END LICENSE BLOCK ***** */ -const path = require('path'), - url = require('url'), - fs = require('fs'), -certassertion = require('./lib/certassertion.js'), - express = require('express'), - metrics = require('../libs/metrics.js'), - heartbeat = require('../libs/heartbeat.js'), - logger = require('../libs/logging.js').logger; +const +sys = require("sys"), +path = require('path'), +url = require('url'), +fs = require('fs'), +express = require('express'), +certassertion = require('../lib/verifier/certassertion.js'), +metrics = require('../lib/metrics'), +heartbeat = require('../lib/heartbeat'), +logger = require('../lib/logging').logger; logger.info("verifier server starting up"); -// updating this call for certs now (Ben - 2011-09-06) -// assertion is the single assertion of email -// audience is the intended audience -// certificates is the list of chained certificates, CSV-style -function doVerify(req, resp, next) { +const HOST = process.env['HOST'] || "127.0.0.1"; +const PORT = process.env['PORT'] || 62800; + +var app = express.createServer(); + +// request to logger, dev formatted which omits personal data in the requests +app.use(express.logger({ + stream: { + write: function(x) { + logger.info(typeof x === 'string' ? x.trim() : x); + } + } +})); + +app.use(express.bodyParser()); + +// code_update is an internal api that causes the node server to +// shut down. This should never be externally accessible and +// is used during the dead simple deployment procedure. +app.get("/code_update", function (req, resp) { + logger.warn("code updated. shutting down."); + process.exit(); +}); + +// setup health check / heartbeat +heartbeat.setup(app); + +app.post('/verify', function(req, resp, next) { req.body = req.body || {} - var assertion = (req.query && req.query.assertion) ? req.query.assertion : req.body.assertion; - var audience = (req.query && req.query.audience) ? req.query.audience : req.body.audience; + var assertion = req.body.assertion; + var audience = req.body.audience; if (!(assertion && audience)) return resp.json({ status: "failure", reason: "need assertion and audience" }); @@ -91,33 +118,8 @@ function doVerify(req, resp, next) { }); }); -} - -exports.setup = function(app) { - // request to logger, dev formatted which omits personal data in the requests - - app.use(express.logger({ - format: 'dev', - stream: { - write: function(x) { - logger.info(typeof x === 'string' ? x.trim() : x); - } - } - })); - - app.use(express.bodyParser()); - - // code_update is an internal api that causes the node server to - // shut down. This should never be externally accessible and - // is used during the dead simple deployment procedure. - app.get("/code_update", function (req, resp) { - logger.warn("code updated. shutting down."); - process.exit(); - }); - - // setup health check / heartbeat - heartbeat.setup(app); +}); - app.post('/', doVerify); - app.post('/verify', doVerify); -}; +app.listen(PORT, HOST, function(conn) { + logger.info("running on http://" + app.address().address + ":" + app.address().port); +}); diff --git a/browserid/run.js b/browserid/run.js deleted file mode 100755 index 761fc95d6ef8c533bbe7c814bdb90aeb5935b537..0000000000000000000000000000000000000000 --- a/browserid/run.js +++ /dev/null @@ -1,77 +0,0 @@ -#!/usr/bin/env node - -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Mozilla BrowserID. - * - * The Initial Developer of the Original Code is Mozilla. - * Portions created by the Initial Developer are Copyright (C) 2011 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -var path = require("path"), -fs = require("fs"), -express = require("express"), -logger = require("../libs/logging.js").logger; - -const amMain = (process.argv[1] === __filename); - -const PRIMARY_HOST = "127.0.0.1"; -const PRIMARY_PORT = 62700; - -var handler = require("./app.js"); - -var app = undefined; - -exports.runServer = function() { - if (app) return; - - app = express.createServer(); - - // let the specific server interact directly with the connect server to register their middleware - if (handler.setup) handler.setup(app); - - // use the express 'static' middleware for serving of static files (cache headers, HTTP range, etc) - app.use(express.static(path.join(__dirname, "static"))); - - app.listen(PRIMARY_PORT, PRIMARY_HOST); -}; - -exports.stopServer = function(cb) { - if (!app) return; - app.on('close', function() { - cb(); - }); - app.close(); - app = undefined; -} - -// when directly invoked from the command line, we'll start the server -if (amMain) exports.runServer(); - diff --git a/browserid/tests/lib/start-stop.js b/browserid/tests/lib/start-stop.js deleted file mode 100644 index d8a837f7e4629f3a35686552d365531baa63cb69..0000000000000000000000000000000000000000 --- a/browserid/tests/lib/start-stop.js +++ /dev/null @@ -1,134 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Mozilla BrowserID. - * - * The Initial Developer of the Original Code is Mozilla. - * Portions created by the Initial Developer are Copyright (C) 2011 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -const assert = require('assert'), - fs = require('fs'), - path = require('path'), - wsapi = require('./wsapi.js'); - -const varPath = path.join(path.dirname(path.dirname(__dirname)), "var"); - -function removeVarDir() { - try { - fs.readdirSync(varPath).forEach(function(f) { - fs.unlinkSync(path.join(varPath, f)); - }); - fs.rmdirSync(varPath); - } catch(e) {} -} - -exports.addStartupBatches = function(suite) { - suite.addBatch({ - "remove the user database": { - topic: function() { - removeVarDir(); - fs.mkdirSync(varPath, 0755); - return true; - }, - "directory should exist": function(x) { - assert.ok(fs.statSync(varPath).isDirectory()); - } - } - }); - - suite.addBatch({ - "run the server": { - topic: function() { - const server = require("../../run.js"); - server.runServer(); - return true; - }, - "server should be running": { - topic: wsapi.get('/__heartbeat__'), - "server is running": function (r, err) { - assert.equal(r.code, 200); - } - } - } - }); - - suite.addBatch({ - "wait for readiness": { - topic: function() { - var cb = this.callback; - require("../../lib/db.js").onReady(function() { cb(true) }); - }, - "readiness has arrived": function(v) { - assert.ok(v); - } - } - }); -}; - -exports.addShutdownBatches = function(suite) { - // stop the server - suite.addBatch({ - "stop the server": { - topic: function() { - const server = require("../../run.js"); - var cb = this.callback; - server.stopServer(function() { cb(true); }); - }, - "stopped": function(x) { - assert.strictEqual(x, true); - } - } - }); - - // stop the database - suite.addBatch({ - "stop the database": { - topic: function() { - require("../../lib/db.js").close(this.callback); - }, - "stopped": function(x) { - assert.isUndefined(x); - } - } - }); - - // clean up - suite.addBatch({ - "clean up": { - topic: function() { - removeVarDir(); - return true; - }, - "directory should not exist": function(x) { - assert.throws(function(){ fs.statSync(varPath) }); - } - } - }); -} \ No newline at end of file diff --git a/DEPLOYMENT.md b/docs/DEPLOYMENT.md similarity index 100% rename from DEPLOYMENT.md rename to docs/DEPLOYMENT.md diff --git a/performance/README.md b/docs/LOAD_GENERATION.md similarity index 100% rename from performance/README.md rename to docs/LOAD_GENERATION.md diff --git a/ORGANIZATION.md b/docs/ORGANIZATION.md similarity index 100% rename from ORGANIZATION.md rename to docs/ORGANIZATION.md diff --git a/rp/index.html b/example/index.html similarity index 100% rename from rp/index.html rename to example/index.html diff --git a/rp/jquery-min.js b/example/jquery-min.js similarity index 100% rename from rp/jquery-min.js rename to example/jquery-min.js diff --git a/browserid/lib/ca.js b/lib/browserid/ca.js similarity index 92% rename from browserid/lib/ca.js rename to lib/browserid/ca.js index 2c4cee8d34d0a911708026cea5f65d21eeb72fe0..ab07a592b45e1ef6b205dd49cc694d67845ad85f 100644 --- a/browserid/lib/ca.js +++ b/lib/browserid/ca.js @@ -39,8 +39,7 @@ var jwcert = require('jwcrypto/jwcert'), jwk = require('jwcrypto/jwk'), jws = require('jwcrypto/jws'), - configuration = require('../../libs/configuration'), - secrets = require('../../libs/secrets'), + configuration = require('configuration'), path = require("path"), fs = require("fs"); @@ -59,7 +58,7 @@ function parseCert(serializedCert) { function certify(email, publicKey, expiration) { if (expiration == null) throw "expiration cannot be null"; - return new jwcert.JWCert(HOSTNAME, expiration, publicKey, {email: email}).sign(secrets.SECRET_KEY); + return new jwcert.JWCert(HOSTNAME, expiration, publicKey, {email: email}).sign(configuration.get('secret_key')); } function verifyChain(certChain, cb) { @@ -70,8 +69,8 @@ function verifyChain(certChain, cb) { // for now we only do browserid.org issued keys if (issuer != HOSTNAME) return next(null); - - next(secrets.PUBLIC_KEY); + + next(exports.PUBLIC_KEY); }, cb); } @@ -80,4 +79,4 @@ exports.certify = certify; exports.verifyChain = verifyChain; exports.parsePublicKey = parsePublicKey; exports.parseCert = parseCert; -exports.PUBLIC_KEY = secrets.PUBLIC_KEY; \ No newline at end of file +exports.PUBLIC_KEY = configuration.get('public_key'); diff --git a/browserid/lib/email.js b/lib/browserid/email.js similarity index 96% rename from browserid/lib/email.js rename to lib/browserid/email.js index 7d8db0dfdc68d24aec062a39940e4b05313afe19..0a171152984cc10902f429022b1d08e79030c71b 100644 --- a/browserid/lib/email.js +++ b/lib/browserid/email.js @@ -34,13 +34,13 @@ * ***** END LICENSE BLOCK ***** */ const -db = require('./db'), +db = require('db.js'), emailer = require('nodemailer'), fs = require('fs'), path = require('path'), mustache = require('mustache'), -config = require('../../libs/configuration.js'), -logger = require('../../libs/logging.js').logger; +config = require('configuration.js'), +logger = require('logging.js').logger; /* if smtp parameters are configured, use them */ var smtp_params = config.get('smtp'); diff --git a/browserid/lib/fake_verification.js b/lib/browserid/fake_verification.js similarity index 100% rename from browserid/lib/fake_verification.js rename to lib/browserid/fake_verification.js diff --git a/lib/browserid/http_forward.js b/lib/browserid/http_forward.js new file mode 100644 index 0000000000000000000000000000000000000000..cf69852f8d666a23964713c5995f467cecd6880c --- /dev/null +++ b/lib/browserid/http_forward.js @@ -0,0 +1,41 @@ +const +url = require('url'), +http = require('http'), +https = require('https'), +logger = require('logging.js').logger; + +module.exports = function(dest, req, res, cb) { + var u = url.parse(dest); + + var m = u.protocol === 'http:' ? http : https; + + var preq = m.request({ + host: u.hostname, + port: u.port, + path: u.pathname, + method: req.method + }, function(pres) { + res.writeHead( + pres.statusCode, + pres.headers + ); + pres.on('data', function (chunk) { + res.write(chunk); + }).on('end', function() { + res.end(); + cb(); + }); + }).on('error', function(e) { + res.end(); + cb(e); + }); + + if (req.headers['content-type']) { + preq.setHeader('content-type', req.headers['content-type']); + } + + req.on('data', function(chunk) { preq.write(chunk) }) + .on('end', function() { preq.end() }); + + logger.info("forwarding request to " + dest); +}; \ No newline at end of file diff --git a/browserid/lib/prove_template.txt b/lib/browserid/prove_template.txt similarity index 100% rename from browserid/lib/prove_template.txt rename to lib/browserid/prove_template.txt diff --git a/browserid/lib/wsapi.js b/lib/browserid/wsapi.js similarity index 98% rename from browserid/lib/wsapi.js rename to lib/browserid/wsapi.js index 9c75fdbfc731bbbc1769f39ecb25efac83b9938b..7934f85d3936029e4c90cfd17729354a9ad7c457 100644 --- a/browserid/lib/wsapi.js +++ b/lib/browserid/wsapi.js @@ -39,15 +39,15 @@ // with HTTP methods and the like, apply middleware, etc. const -db = require('./db.js'), +db = require('db.js'), url = require('url'), -httputils = require('./httputils.js'), +httputils = require('httputils.js'), email = require('./email.js'), bcrypt = require('bcrypt'), crypto = require('crypto'), -logger = require('../../libs/logging.js').logger, +logger = require('logging.js').logger, ca = require('./ca.js'), -configuration = require('../../libs/configuration.js'); +configuration = require('configuration.js'); function checkParams(params) { return function(req, resp, next) { diff --git a/libs/configuration.js b/lib/configuration.js similarity index 72% rename from libs/configuration.js rename to lib/configuration.js index 54a24237863368ff86def66c6ba16b3af114a756..50aaacaae83b133b56424aae1ec1937441de7704 100644 --- a/libs/configuration.js +++ b/lib/configuration.js @@ -43,8 +43,11 @@ */ const -substitution = require('./substitute.js'), -path = require('path'); +postprocess = require('postprocess'), +path = require('path'), +urlparse = require('urlparse'), +secrets = require('./secrets'), +temp = require('temp'); var g_config = { }; @@ -71,9 +74,7 @@ const g_configs = { }; // production is the configuration that runs on our // public service (browserid.org) g_configs.production = { - hostname: 'browserid.org', - port: '443', - scheme: 'https', + URL: 'https://browserid.org', use_minified_resources: true, var_path: '/home/browserid/var/', database: { @@ -86,21 +87,10 @@ g_configs.production = { certificate_validity_ms: (24 * 60 * 60 * 1000) }; -// beta (diresworb.org) the only difference from production -// is the hostname -g_configs.beta = JSON.parse(JSON.stringify(g_configs.production)); -g_configs.beta.hostname = 'diresworb.org'; - -// development (dev.diresworb.org) the only difference from production -// is, again, the hostname -g_configs.development = JSON.parse(JSON.stringify(g_configs.production)); -g_configs.development.hostname = 'dev.diresworb.org'; // local development configuration g_configs.local = { - hostname: '127.0.0.1', - port: '10002', - scheme: 'http', + URL: 'http://127.0.0.1:10002', email_to_console: true, // don't send email, just dump verification URLs to console. use_minified_resources: false, var_path: path.join(__dirname, "..", "var"), @@ -127,10 +117,19 @@ Object.keys(g_configs).forEach(function(config) { // test environments are variations on local g_configs.test_json = JSON.parse(JSON.stringify(g_configs.local)); -g_configs.test_json.database = { driver: "json", unit_test: true }; +g_configs.test_json.database = { + driver: "json", + // use a temporary path for testing + path: temp.path({suffix: '.db'}) +}; g_configs.test_mysql = JSON.parse(JSON.stringify(g_configs.local)); -g_configs.test_mysql.database = { driver: "mysql", user: "test", unit_test: true }; +g_configs.test_mysql.database = { + driver: "mysql", + user: "test", + database: "browserid_" + secrets.generate(6), + create_schema: true +}; // default deployment is local if (undefined === process.env['NODE_ENV']) { @@ -141,13 +140,36 @@ g_config = g_configs[process.env['NODE_ENV']]; if (g_config === undefined) throw "unknown environment: " + exports.get('env'); -function getPortForURL() { - if (g_config['scheme'] === 'https' && g_config['port'] === '443') return ""; - if (g_config['scheme'] === 'http' && g_config['port'] === '80') return ""; - return ":" + g_config['port']; +// what url are we running under? +{ + var ourURL = process.env['BROWSERID_URL'] || g_config['URL']; + var purl = urlparse(ourURL).validate().normalize().originOnly(); + g_config.URL = purl.toString(); + g_config.hostname = purl.host; + g_config.scheme = purl.scheme; + g_config.port = purl.port || (purl.scheme == 'https' ? 443 : 80); +} + +if (process.env['VERIFIER_URL']) { + var url = urlparse(process.env['VERIFIER_URL']).validate().normalize().toString(); + g_config.verifier_url = url; +} + +// now handle ephemeral database configuration. Used in testing. +if (g_config.database.driver === 'mysql') { + if (process.env['MYSQL_DATABASE_NAME']) { + g_config.database.database = process.env['MYSQL_DATABASE_NAME']; + } +} else if (g_config.database.driver === 'json') { + if (process.env['JSON_DATABASE_PATH']) { + g_config.database.path = process.env['JSON_DATABASE_PATH']; + } } -g_config['URL'] = g_config['scheme'] + '://' + g_config['hostname'] + getPortForURL(); +// allow work factor to be twaddled from the environment +if (process.env['BCRYPT_WORK_FACTOR']) { + g_config.bcrypt_work_factor = parseInt(process.env['BCRYPT_WORK_FACTOR']); +} /* * Install middleware that will perform textual replacement on served output @@ -159,12 +181,9 @@ g_config['URL'] = g_config['scheme'] + '://' + g_config['hostname'] + getPortFor * (all source files always should have the production hostname written into them) */ exports.performSubstitution = function(app) { - if ((g_config.hostname != 'browserid.org' || g_config.port != '443' || g_config.scheme != 'https') && - process.env['NODE_ENV'] !== 'local'){ - app.use(substitution.substitute({ - 'https://browserid.org': g_config['URL'], - 'browserid.org:443': g_config['hostname'] + ':' + g_config['port'], - 'browserid.org': g_config['hostname'] + if (g_config['URL'] != 'https://browserid.org') { + app.use(postprocess.middleware(function(req, buffer) { + return buffer.toString().replace(new RegExp('https://browserid.org', 'g'), g_config['URL']); })); } }; @@ -172,13 +191,10 @@ exports.performSubstitution = function(app) { // At the time this file is required, we'll determine the "process name" for this proc // if we can determine what type of process it is (browserid or verifier) based // on the path, we'll use that, otherwise we'll name it 'ephemeral'. -if (process.argv[1] == path.join(__dirname, "..", "browserid", "run.js")) { - g_config['process_type'] = 'browserid'; -} else if (process.argv[1] == path.join(__dirname, "..", "verifier", "run.js")) { - g_config['process_type'] = 'verifier'; -} else { - g_config['process_type'] = 'ephemeral'; -} +g_config['process_type'] = path.basename(process.argv[1], ".js"); + +g_config['secret_key'] = secrets.loadSecretKey('root', exports.get('var_path')); +g_config['public_key'] = secrets.loadPublicKey('root', exports.get('var_path')); // log the process_type setTimeout(function() { diff --git a/browserid/lib/db.js b/lib/db.js similarity index 96% rename from browserid/lib/db.js rename to lib/db.js index 4545f2f71ea37ce55692d7ffee2892a45fb0a40b..97232454d422467662c6bb28eea7965c1b1184fa 100644 --- a/browserid/lib/db.js +++ b/lib/db.js @@ -33,7 +33,7 @@ * * ***** END LICENSE BLOCK ***** */ -var logger = require('../../libs/logging.js').logger; +var logger = require('./logging.js').logger; var driver; @@ -51,7 +51,7 @@ exports.open = function(cfg, cb) { var driverName = "json"; if (cfg && cfg.driver) driverName = cfg.driver; try { - driver = require('./db_' + driverName + '.js'); + driver = require('./db/' + driverName + '.js'); } catch(e) { var msg = "FATAL: couldn't find database driver: " + driverName; console.log(msg); diff --git a/browserid/lib/db_json.js b/lib/db/json.js similarity index 80% rename from browserid/lib/db_json.js rename to lib/db/json.js index 961761a9a5302344f967c672fc5d6433da560921..2fa8409131bc98673b5c24d1cb34c80e8743196e 100644 --- a/browserid/lib/db_json.js +++ b/lib/db/json.js @@ -41,10 +41,10 @@ const path = require('path'), fs = require('fs'), -secrets = require('../../libs/secrets'), +secrets = require('../secrets.js'), jsel = require('JSONSelect'), -logger = require('../../libs/logging.js').logger, -configuration = require('../../libs/configuration.js'), +logger = require('../logging.js').logger, +configuration = require('../configuration.js'), temp = require('temp'); // a little alias for stringify @@ -52,6 +52,8 @@ const ESC = JSON.stringify; var dbPath = path.join(configuration.get('var_path'), "authdb.json"); +var drop_on_close = undefined; + /* The JSON database. The structure is thus: * [ * { @@ -63,9 +65,11 @@ var dbPath = path.join(configuration.get('var_path'), "authdb.json"); * ] */ -var db = []; -var stagedEmails = { }; -var staged = { }; +var db = { + users: [ ], + stagedEmails: { }, + staged: { } +}; function flush() { try { @@ -75,54 +79,58 @@ function flush() { } } -// when unit_test is set in configuration, database should be -// ephemeral. which simply means we use a temp file and delete -// on close; -var delete_on_close = false; +function sync() { + try { + db = JSON.parse(fs.readFileSync(dbPath)); + } catch(e) { + logger.error("Cannot read database from " + dbPath); + } +} exports.open = function(cfg, cb) { - delete_on_close = false; - - if (cfg) { - if (cfg.unit_test) { - dbPath = temp.path({suffix: '.db'}); - delete_on_close = true; - } else if (cfg.path) { - dbPath = cfg.path; - } + if (cfg && cfg.path) { + dbPath = cfg.path; } + logger.debug("opening JSON database: " + dbPath); - try { - db = JSON.parse(fs.readFileSync(dbPath)); - } catch(e) { + if (cfg && cfg.drop_on_close) { + logger.debug("will remove database upon close"); + drop_on_close = true; } + sync(); + setTimeout(cb, 0); }; exports.close = function(cb) { flush(); - setTimeout(cb, 0); - if (delete_on_close) { - delete_on_close = false; - fs.unlink(dbPath, function(err) { }); - }; + + if (drop_on_close) { + drop_on_close = undefined; + fs.unlink(dbPath, function(err) { cb(err === null ? undefined : err); }); + } else { + setTimeout(cb, 0); + } }; exports.emailKnown = function(email, cb) { - var m = jsel.match(".emails :val(" + ESC(email) + ")", db); + sync(); + var m = jsel.match(".emails :val(" + ESC(email) + ")", db.users); setTimeout(function() { cb(m.length > 0) }, 0); }; exports.isStaged = function(email, cb) { if (cb) { setTimeout(function() { - cb(stagedEmails.hasOwnProperty(email)); + sync(); + cb(db.stagedEmails.hasOwnProperty(email)); }, 0); } }; exports.emailsBelongToSameAccount = function(lhs, rhs, cb) { + sync(); emailToUserID(lhs, function(lhs_uid) { emailToUserID(rhs, function(rhs_uid) { cb(lhs_uid === rhs_uid); @@ -139,7 +147,7 @@ function addEmailToAccount(existing_email, email, cb) { if (userID == undefined) { cb("no such email: " + existing_email, undefined); } else { - db[userID].emails.push(email); + db.users[userID].emails.push(email); flush(); cb(); } @@ -150,45 +158,52 @@ exports.stageUser = function(email, cb) { var secret = secrets.generate(48); // overwrite previously staged users - staged[secret] = { + sync(); + db.staged[secret] = { type: "add_account", email: email }; - - stagedEmails[email] = secret; + db.stagedEmails[email] = secret; + flush(); setTimeout(function() { cb(secret); }, 0); }; exports.stageEmail = function(existing_email, new_email, cb) { var secret = secrets.generate(48); + // overwrite previously staged users - staged[secret] = { + sync(); + db.staged[secret] = { type: "add_email", existing_email: existing_email, email: new_email }; - stagedEmails[new_email] = secret; + db.stagedEmails[new_email] = secret; + flush(); + setTimeout(function() { cb(secret); }, 0); }; exports.emailForVerificationSecret = function(secret, cb) { setTimeout(function() { - cb(staged[secret]? staged[secret].email:undefined); + cb(db.staged[secret] ? db.staged[secret].email : undefined); }, 0); }; exports.gotVerificationSecret = function(secret, hash, cb) { - if (!staged.hasOwnProperty(secret)) return cb("unknown secret"); + sync(); + if (!db.staged.hasOwnProperty(secret)) return cb("unknown secret"); // simply move from staged over to the emails "database" - var o = staged[secret]; - delete staged[secret]; - delete stagedEmails[o.email]; + var o = db.staged[secret]; + delete db.staged[secret]; + delete db.stagedEmails[o.email]; + flush(); if (o.type === 'add_account') { exports.emailKnown(o.email, function(known) { function createAccount() { - db.push({ + db.users.push({ password: hash, emails: [ o.email ] }); @@ -232,25 +247,29 @@ exports.gotVerificationSecret = function(secret, hash, cb) { }; exports.checkAuth = function(email, cb) { - var m = jsel.match(":root > object:has(.emails > :val(" + ESC(email) + ")) > .password", db); + sync(); + var m = jsel.match(":root > object:has(.emails > :val(" + ESC(email) + ")) > .password", db.users); if (m.length === 0) m = undefined; else m = m[0]; setTimeout(function() { cb(m) }, 0); }; exports.updatePassword = function(email, hash, cb) { - var m = jsel.match(":root > object:has(.emails > :val(" + ESC(email) + "))", db); + sync(); + var m = jsel.match(":root > object:has(.emails > :val(" + ESC(email) + "))", db.users); var err = undefined; if (m.length === 0) err = "no such email address"; else m[0].password = hash; + flush(); setTimeout(function() { cb(err) }, 0); }; function emailToUserID(email, cb) { + sync(); var id = undefined; - for (var i = 0; i < db.length; i++) { - if (jsel.match(":val(" + JSON.stringify(email) + ")", db[i]).length) { + for (var i = 0; i < db.users.length; i++) { + if (jsel.match(":val(" + JSON.stringify(email) + ")", db.users[i]).length) { id = i; break; } @@ -261,13 +280,14 @@ function emailToUserID(email, cb) { } exports.listEmails = function(email, cb) { + sync(); // get the user id associated with this account emailToUserID(email, function(userID) { if (userID === undefined) { cb("no such email: " + email); return; } - var email_list = jsel.match(".emails string", db[userID]); + var email_list = jsel.match(".emails string", db.users[userID]); var emails = {}; for (var i=0; i < email_list.length; i++) emails[email_list[i]] = {}; @@ -277,24 +297,25 @@ exports.listEmails = function(email, cb) { }; exports.removeEmail = function(authenticated_email, email, cb) { - var m = jsel.match(".emails:has(:val("+ESC(authenticated_email)+")):has(:val("+ESC(email)+"))", db); + sync(); + var m = jsel.match(".emails:has(:val("+ESC(authenticated_email)+")):has(:val("+ESC(email)+"))", db.users); if (m.length) { var emails = m[0]; for (var i = 0; i < emails.length; i++) { if (emails[i] === email) { emails.splice(i, 1); + flush(); break; } } } - setTimeout(function() { cb(); }, 0); }; exports.cancelAccount = function(authenticated_email, cb) { emailToUserID(authenticated_email, function(user_id) { - db.splice(user_id, 1); + db.users.splice(user_id, 1); flush(); cb(); }); diff --git a/browserid/lib/db_mysql.js b/lib/db/mysql.js similarity index 97% rename from browserid/lib/db_mysql.js rename to lib/db/mysql.js index 9a7dbc8385a3226ec906b436da232fc4dd3e3f53..b1209b091b4572e8b321a98b74a5c7aae04b6ce4 100644 --- a/browserid/lib/db_mysql.js +++ b/lib/db/mysql.js @@ -60,8 +60,8 @@ const mysql = require('mysql'), -secrets = require('../../libs/secrets'), -logger = require('../../libs/logging.js').logger; +secrets = require('../secrets.js'), +logger = require('../logging.js').logger; var client = undefined; @@ -124,13 +124,13 @@ exports.open = function(cfg, cb) { // let's figure out the database name var database = cfg.database; if (!database) database = "browserid"; - if (cfg.unit_test) { - database += "_" + secrets.generate(8); - drop_on_close = database; - } + + // if the client specifies a name other than 'browserid', and specifies + // that we should drop the database on close, do it + if (database !== 'browserid' && cfg.drop_on_close) drop_on_close = database; // now create the databse - if (cfg.create_schema || cfg.unit_test) { + if (cfg.create_schema) { client.query("CREATE DATABASE IF NOT EXISTS " + database, function(err) { if (err) { logUnexpectedError(err); diff --git a/libs/heartbeat.js b/lib/heartbeat.js similarity index 100% rename from libs/heartbeat.js rename to lib/heartbeat.js diff --git a/browserid/lib/httputils.js b/lib/httputils.js similarity index 100% rename from browserid/lib/httputils.js rename to lib/httputils.js diff --git a/performance/lib/add_email.js b/lib/load_gen/add_email.js similarity index 100% rename from performance/lib/add_email.js rename to lib/load_gen/add_email.js diff --git a/performance/lib/include_only.js b/lib/load_gen/include_only.js similarity index 100% rename from performance/lib/include_only.js rename to lib/load_gen/include_only.js diff --git a/performance/lib/reauth.js b/lib/load_gen/reauth.js similarity index 100% rename from performance/lib/reauth.js rename to lib/load_gen/reauth.js diff --git a/performance/lib/reset_pass.js b/lib/load_gen/reset_pass.js similarity index 100% rename from performance/lib/reset_pass.js rename to lib/load_gen/reset_pass.js diff --git a/performance/lib/signin.js b/lib/load_gen/signin.js similarity index 100% rename from performance/lib/signin.js rename to lib/load_gen/signin.js diff --git a/performance/lib/signup.js b/lib/load_gen/signup.js similarity index 100% rename from performance/lib/signup.js rename to lib/load_gen/signup.js diff --git a/performance/lib/test.js b/lib/load_gen/test.js similarity index 100% rename from performance/lib/test.js rename to lib/load_gen/test.js diff --git a/performance/lib/user_db.js b/lib/load_gen/user_db.js similarity index 100% rename from performance/lib/user_db.js rename to lib/load_gen/user_db.js diff --git a/libs/logging.js b/lib/logging.js similarity index 97% rename from libs/logging.js rename to lib/logging.js index b167c6eb0abdabc0c4be66bd0838849f85161720..3e7feb5a1a7d7e972f572b5c4923aaf205c4471f 100644 --- a/libs/logging.js +++ b/lib/logging.js @@ -78,4 +78,6 @@ exports.logger.emitErrs = false; exports.enableConsoleLogging = function() { exports.logger.add(winston.transports.Console, { colorize: true }); -}; \ No newline at end of file +}; + +if (process.env['LOG_TO_CONSOLE']) exports.enableConsoleLogging(); diff --git a/libs/metrics.js b/lib/metrics.js similarity index 100% rename from libs/metrics.js rename to lib/metrics.js diff --git a/libs/secrets.js b/lib/secrets.js similarity index 93% rename from libs/secrets.js rename to lib/secrets.js index 0b404f615cbe8bedcd6fd7469331ea50559501cb..6382d5e4220b2883973d61afd6f68a849c7c8a84 100644 --- a/libs/secrets.js +++ b/lib/secrets.js @@ -64,7 +64,7 @@ exports.hydrateSecret = function(name, dir) { return secret; }; -function loadSecretKey(name, dir) { +exports.loadSecretKey = function(name, dir) { var p = path.join(dir, name + ".secretkey"); var fileExists = false; var secret = undefined; @@ -79,7 +79,7 @@ function loadSecretKey(name, dir) { return jwk.SecretKey.deserialize(secret); } -function loadPublicKey(name, dir) { +exports.loadPublicKey = function(name, dir) { var p = path.join(dir, name + ".publickey"); var fileExists = false; var secret = undefined; @@ -95,6 +95,3 @@ function loadPublicKey(name, dir) { // {alg: <ALG>, value: <SERIALIZED_KEY>} return jwk.PublicKey.deserialize(secret); } - -exports.SECRET_KEY = loadSecretKey('root', configuration.get('var_path')); -exports.PUBLIC_KEY = loadPublicKey('root', configuration.get('var_path')); diff --git a/verifier/lib/certassertion.js b/lib/verifier/certassertion.js similarity index 94% rename from verifier/lib/certassertion.js rename to lib/verifier/certassertion.js index 71590eb62721267cf841a66b72b8f34f953f2418..863573b9fa05c5a7dcbe3de0f27d6194b623ff97 100644 --- a/verifier/lib/certassertion.js +++ b/lib/verifier/certassertion.js @@ -45,21 +45,17 @@ jwk = require("jwcrypto/jwk"), jwt = require("jwcrypto/jwt"), jwcert = require("jwcrypto/jwcert"), vep = require("jwcrypto/vep"), -configuration = require('../../libs/configuration'), -secrets = require('../../libs/secrets'), -logger = require("../../libs/logging.js").logger; - -// configuration information to check the issuer -const config = require("../../libs/configuration.js"); +config = require("../../lib/configuration.js"), +logger = require("../../lib/logging.js").logger; const HOSTMETA_URL = "/.well-known/host-meta"; var publicKeys = {}; // set up some default public keys -publicKeys[configuration.get('hostname')] = secrets.PUBLIC_KEY; +publicKeys[config.get('hostname')] = config.get('public_key'); logger.debug("pre-seeded public key cache with key for " + - configuration.get('hostname')); + config.get('hostname')); function https_complete_get(host, url, successCB, errorCB) { https.get({host: host,path: url}, function(res) { @@ -71,7 +67,7 @@ function https_complete_get(host, url, successCB, errorCB) { res.on('end', function() { successCB(allData); }); - + }).on('error', function(e) { console.log(e.toString()); errorCB(e); @@ -197,7 +193,7 @@ function verify(assertion, audience, successCB, errorCB, pkRetriever) { retrieveHostPublicKey(issuer, next, function(err) {next(null);}); }, function(pk, principal) { // primary? - if (theIssuer != configuration.get('hostname')) { + if (theIssuer != config.get('hostname')) { // then the email better match the issuer console.log(principal); if (!principal.email.match("@" + theIssuer + "$")) diff --git a/libs/wsapi_client.js b/lib/wsapi_client.js similarity index 99% rename from libs/wsapi_client.js rename to lib/wsapi_client.js index 292a9772c08933b6af4a4d341bdeac27b7257ef7..1db1af746b15c8f808bd4090fc341517c137750e 100644 --- a/libs/wsapi_client.js +++ b/lib/wsapi_client.js @@ -87,7 +87,7 @@ exports.get = function(cfg, path, context, getArgs, cb) { cb(false); return; } - + var headers = { }; injectCookies(context, headers); diff --git a/libs/substitute.js b/libs/substitute.js deleted file mode 100644 index 2c4c526aedbbaac25231c855ebddd27fcd26287b..0000000000000000000000000000000000000000 --- a/libs/substitute.js +++ /dev/null @@ -1,106 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Mozilla BrowserID. - * - * The Initial Developer of the Original Code is Mozilla. - * Portions created by the Initial Developer are Copyright (C) 2011 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -// return a function that is substitution middleware, capable -// of being installed to perform textual replacement on -// all server output -exports.substitute = function(subs) { - // given a buffer, find and replace all subs - function subHostNames(data) { - for (var i in subs) { - data = data.toString().replace(new RegExp(i, 'g'), subs[i]); - } - - return data; - } - - return function(req, resp, next) { - // cache the *real* functions - var realWrite = resp.write; - var realEnd = resp.end; - var realWriteHead = resp.writeHead; - var realSend = resp.send; - - var buf = undefined; - var enc = undefined; - var contentType = undefined; - - resp.writeHead = function (sc, reason, hdrs) { - var h = undefined; - if (typeof hdrs === 'object') h = hdrs; - else if (typeof reason === 'object') h = reason; - for (var k in h) { - if (k.toLowerCase() === 'content-type') { - contentType = h[k]; - break; - } - } - if (!contentType) contentType = resp.getHeader('content-type'); - if (!contentType) contentType = "application/unknown"; - realWriteHead.call(resp, sc, reason, hdrs); - }; - - resp.write = function (chunk, encoding) { - if (buf) buf += chunk; - else buf = chunk; - enc = encoding; - }; - - resp.send = function(stuff) { - buf = stuff; - realSend.call(resp,stuff); - }; - - resp.end = function() { - if (!contentType) contentType = resp.getHeader('content-type'); - if (contentType && (contentType === "application/javascript" || - contentType.substr(0,4) === 'text')) - { - if (buf) { - if (Buffer.isBuffer(buf)) buf = buf.toString('utf8'); - var l = Buffer.byteLength(buf); - buf = subHostNames(buf); - if (l != Buffer.byteLength(buf)) resp.setHeader('Content-Length', Buffer.byteLength(buf)); - } - } - if (buf && buf.length) { - realWrite.call(resp, buf, enc); - } - realEnd.call(resp); - } - - next(); - }; -}; diff --git a/package.json b/package.json index 3451a8b9ad32ffb24939cc3228f37bdeaeb354e7..5025dca64fcb9235f1960d77103c30dabe6993a2 100644 --- a/package.json +++ b/package.json @@ -26,10 +26,12 @@ , "sax" : "0.2.3" , "mimelib-noiconv" : "0.1.3" , "jwcrypto": "https://github.com/mozilla/jwcrypto/tarball/83aa543" + , "postprocess": "0.0.2" + , "urlparse": "0.0.1" } , "scripts": { "postinstall": "./scripts/generate_ephemeral_keys.sh", "test": "./scripts/run_all_tests.sh", - "start": "node ./run.js" + "start": "./scripts/run_locally.js" } } diff --git a/browserid/.gitignore b/resources/.gitignore similarity index 50% rename from browserid/.gitignore rename to resources/.gitignore index 87ff02149168e118b7f8f73ee8850cab949e80f6..ad546db10e4922983382c9235cb61b007e8d2475 100644 --- a/browserid/.gitignore +++ b/resources/.gitignore @@ -1,7 +1,9 @@ -/static/dialog/production.js -/static/dialog/production.css /static/css/browserid.css /static/css/browserid.min.css -/static/js/lib.min.js +/static/dialog/css/production.css +/static/dialog/css/production.min.css +/static/dialog/production.js +/static/include.orig.js /static/js/lib.js -/var +/static/js/lib.min.js +/static/relay/production.js diff --git a/browserid/assets/account-buttons.png b/resources/assets/account-buttons.png similarity index 100% rename from browserid/assets/account-buttons.png rename to resources/assets/account-buttons.png diff --git a/browserid/assets/browserID-135x35.png b/resources/assets/browserID-135x35.png similarity index 100% rename from browserid/assets/browserID-135x35.png rename to resources/assets/browserID-135x35.png diff --git a/browserid/assets/browserID-366x72.png b/resources/assets/browserID-366x72.png similarity index 100% rename from browserid/assets/browserID-366x72.png rename to resources/assets/browserID-366x72.png diff --git a/browserid/assets/browserID-80x20.png b/resources/assets/browserID-80x20.png similarity index 100% rename from browserid/assets/browserID-80x20.png rename to resources/assets/browserID-80x20.png diff --git a/browserid/assets/browserID-buttons.psd b/resources/assets/browserID-buttons.psd similarity index 100% rename from browserid/assets/browserID-buttons.psd rename to resources/assets/browserID-buttons.psd diff --git a/browserid/assets/browserID-logo.eps b/resources/assets/browserID-logo.eps similarity index 100% rename from browserid/assets/browserID-logo.eps rename to resources/assets/browserID-logo.eps diff --git a/browserid/static/.well-known/host-meta b/resources/static/.well-known/host-meta similarity index 100% rename from browserid/static/.well-known/host-meta rename to resources/static/.well-known/host-meta diff --git a/browserid/static/css/m.css b/resources/static/css/m.css similarity index 100% rename from browserid/static/css/m.css rename to resources/static/css/m.css diff --git a/browserid/static/css/sil.ttf b/resources/static/css/sil.ttf similarity index 100% rename from browserid/static/css/sil.ttf rename to resources/static/css/sil.ttf diff --git a/browserid/static/css/style.css b/resources/static/css/style.css similarity index 100% rename from browserid/static/css/style.css rename to resources/static/css/style.css diff --git a/browserid/static/css/ts.ttf b/resources/static/css/ts.ttf similarity index 100% rename from browserid/static/css/ts.ttf rename to resources/static/css/ts.ttf diff --git a/browserid/static/dialog/controllers/authenticate_controller.js b/resources/static/dialog/controllers/authenticate_controller.js similarity index 100% rename from browserid/static/dialog/controllers/authenticate_controller.js rename to resources/static/dialog/controllers/authenticate_controller.js diff --git a/browserid/static/dialog/controllers/checkregistration_controller.js b/resources/static/dialog/controllers/checkregistration_controller.js similarity index 100% rename from browserid/static/dialog/controllers/checkregistration_controller.js rename to resources/static/dialog/controllers/checkregistration_controller.js diff --git a/browserid/static/dialog/controllers/dialog_controller.js b/resources/static/dialog/controllers/dialog_controller.js similarity index 100% rename from browserid/static/dialog/controllers/dialog_controller.js rename to resources/static/dialog/controllers/dialog_controller.js diff --git a/browserid/static/dialog/controllers/page_controller.js b/resources/static/dialog/controllers/page_controller.js similarity index 100% rename from browserid/static/dialog/controllers/page_controller.js rename to resources/static/dialog/controllers/page_controller.js diff --git a/browserid/static/dialog/controllers/pickemail_controller.js b/resources/static/dialog/controllers/pickemail_controller.js similarity index 100% rename from browserid/static/dialog/controllers/pickemail_controller.js rename to resources/static/dialog/controllers/pickemail_controller.js diff --git a/browserid/static/dialog/css/m.css b/resources/static/dialog/css/m.css similarity index 100% rename from browserid/static/dialog/css/m.css rename to resources/static/dialog/css/m.css diff --git a/browserid/static/dialog/css/popup.css b/resources/static/dialog/css/popup.css similarity index 100% rename from browserid/static/dialog/css/popup.css rename to resources/static/dialog/css/popup.css diff --git a/browserid/static/dialog/dialog.js b/resources/static/dialog/dialog.js similarity index 100% rename from browserid/static/dialog/dialog.js rename to resources/static/dialog/dialog.js diff --git a/browserid/static/dialog/funcunit.html b/resources/static/dialog/funcunit.html similarity index 100% rename from browserid/static/dialog/funcunit.html rename to resources/static/dialog/funcunit.html diff --git a/browserid/static/dialog/mozilla.png b/resources/static/dialog/mozilla.png similarity index 100% rename from browserid/static/dialog/mozilla.png rename to resources/static/dialog/mozilla.png diff --git a/browserid/static/dialog/qunit.html b/resources/static/dialog/qunit.html similarity index 100% rename from browserid/static/dialog/qunit.html rename to resources/static/dialog/qunit.html diff --git a/browserid/static/dialog/register_iframe.html b/resources/static/dialog/register_iframe.html similarity index 100% rename from browserid/static/dialog/register_iframe.html rename to resources/static/dialog/register_iframe.html diff --git a/browserid/static/dialog/register_iframe.js b/resources/static/dialog/register_iframe.js similarity index 100% rename from browserid/static/dialog/register_iframe.js rename to resources/static/dialog/register_iframe.js diff --git a/browserid/static/dialog/resources/base64.js b/resources/static/dialog/resources/base64.js similarity index 100% rename from browserid/static/dialog/resources/base64.js rename to resources/static/dialog/resources/base64.js diff --git a/browserid/static/dialog/resources/browser-support.js b/resources/static/dialog/resources/browser-support.js similarity index 100% rename from browserid/static/dialog/resources/browser-support.js rename to resources/static/dialog/resources/browser-support.js diff --git a/browserid/static/dialog/resources/browserid-extensions.js b/resources/static/dialog/resources/browserid-extensions.js similarity index 100% rename from browserid/static/dialog/resources/browserid-extensions.js rename to resources/static/dialog/resources/browserid-extensions.js diff --git a/browserid/static/dialog/resources/browserid.js b/resources/static/dialog/resources/browserid.js similarity index 100% rename from browserid/static/dialog/resources/browserid.js rename to resources/static/dialog/resources/browserid.js diff --git a/browserid/static/dialog/resources/channel.js b/resources/static/dialog/resources/channel.js similarity index 100% rename from browserid/static/dialog/resources/channel.js rename to resources/static/dialog/resources/channel.js diff --git a/browserid/static/dialog/resources/error-messages.js b/resources/static/dialog/resources/error-messages.js similarity index 100% rename from browserid/static/dialog/resources/error-messages.js rename to resources/static/dialog/resources/error-messages.js diff --git a/browserid/static/dialog/resources/jschannel.js b/resources/static/dialog/resources/jschannel.js similarity index 100% rename from browserid/static/dialog/resources/jschannel.js rename to resources/static/dialog/resources/jschannel.js diff --git a/browserid/static/dialog/resources/network.js b/resources/static/dialog/resources/network.js similarity index 100% rename from browserid/static/dialog/resources/network.js rename to resources/static/dialog/resources/network.js diff --git a/browserid/static/dialog/resources/storage.js b/resources/static/dialog/resources/storage.js similarity index 100% rename from browserid/static/dialog/resources/storage.js rename to resources/static/dialog/resources/storage.js diff --git a/browserid/static/dialog/resources/tooltip.js b/resources/static/dialog/resources/tooltip.js similarity index 100% rename from browserid/static/dialog/resources/tooltip.js rename to resources/static/dialog/resources/tooltip.js diff --git a/browserid/static/dialog/resources/underscore-min.js b/resources/static/dialog/resources/underscore-min.js similarity index 100% rename from browserid/static/dialog/resources/underscore-min.js rename to resources/static/dialog/resources/underscore-min.js diff --git a/browserid/static/dialog/resources/user.js b/resources/static/dialog/resources/user.js similarity index 100% rename from browserid/static/dialog/resources/user.js rename to resources/static/dialog/resources/user.js diff --git a/browserid/static/dialog/resources/validation.js b/resources/static/dialog/resources/validation.js similarity index 100% rename from browserid/static/dialog/resources/validation.js rename to resources/static/dialog/resources/validation.js diff --git a/browserid/static/dialog/resources/wait-messages.js b/resources/static/dialog/resources/wait-messages.js similarity index 100% rename from browserid/static/dialog/resources/wait-messages.js rename to resources/static/dialog/resources/wait-messages.js diff --git a/browserid/static/dialog/scripts/build.html b/resources/static/dialog/scripts/build.html similarity index 100% rename from browserid/static/dialog/scripts/build.html rename to resources/static/dialog/scripts/build.html diff --git a/browserid/static/dialog/scripts/build.js b/resources/static/dialog/scripts/build.js similarity index 100% rename from browserid/static/dialog/scripts/build.js rename to resources/static/dialog/scripts/build.js diff --git a/browserid/static/dialog/scripts/clean.js b/resources/static/dialog/scripts/clean.js similarity index 100% rename from browserid/static/dialog/scripts/clean.js rename to resources/static/dialog/scripts/clean.js diff --git a/browserid/static/dialog/scripts/docs.js b/resources/static/dialog/scripts/docs.js similarity index 100% rename from browserid/static/dialog/scripts/docs.js rename to resources/static/dialog/scripts/docs.js diff --git a/browserid/static/dialog/test/funcunit/dialog_test.js b/resources/static/dialog/test/funcunit/dialog_test.js similarity index 100% rename from browserid/static/dialog/test/funcunit/dialog_test.js rename to resources/static/dialog/test/funcunit/dialog_test.js diff --git a/browserid/static/dialog/test/funcunit/funcunit.js b/resources/static/dialog/test/funcunit/funcunit.js similarity index 100% rename from browserid/static/dialog/test/funcunit/funcunit.js rename to resources/static/dialog/test/funcunit/funcunit.js diff --git a/browserid/static/dialog/test/qunit/browserid_unit_test.js b/resources/static/dialog/test/qunit/browserid_unit_test.js similarity index 100% rename from browserid/static/dialog/test/qunit/browserid_unit_test.js rename to resources/static/dialog/test/qunit/browserid_unit_test.js diff --git a/browserid/static/dialog/test/qunit/controllers/dialog_controller_unit_test.js b/resources/static/dialog/test/qunit/controllers/dialog_controller_unit_test.js similarity index 100% rename from browserid/static/dialog/test/qunit/controllers/dialog_controller_unit_test.js rename to resources/static/dialog/test/qunit/controllers/dialog_controller_unit_test.js diff --git a/browserid/static/dialog/test/qunit/controllers/page_controller_unit_test.js b/resources/static/dialog/test/qunit/controllers/page_controller_unit_test.js similarity index 100% rename from browserid/static/dialog/test/qunit/controllers/page_controller_unit_test.js rename to resources/static/dialog/test/qunit/controllers/page_controller_unit_test.js diff --git a/browserid/static/dialog/test/qunit/controllers/pickemail_controller_unit_test.js b/resources/static/dialog/test/qunit/controllers/pickemail_controller_unit_test.js similarity index 100% rename from browserid/static/dialog/test/qunit/controllers/pickemail_controller_unit_test.js rename to resources/static/dialog/test/qunit/controllers/pickemail_controller_unit_test.js diff --git a/browserid/static/dialog/test/qunit/dialog_test.js b/resources/static/dialog/test/qunit/dialog_test.js similarity index 100% rename from browserid/static/dialog/test/qunit/dialog_test.js rename to resources/static/dialog/test/qunit/dialog_test.js diff --git a/browserid/static/dialog/test/qunit/include_unit_test.js b/resources/static/dialog/test/qunit/include_unit_test.js similarity index 100% rename from browserid/static/dialog/test/qunit/include_unit_test.js rename to resources/static/dialog/test/qunit/include_unit_test.js diff --git a/browserid/static/dialog/test/qunit/pages/add_email_address_test.js b/resources/static/dialog/test/qunit/pages/add_email_address_test.js similarity index 100% rename from browserid/static/dialog/test/qunit/pages/add_email_address_test.js rename to resources/static/dialog/test/qunit/pages/add_email_address_test.js diff --git a/browserid/static/dialog/test/qunit/qunit.js b/resources/static/dialog/test/qunit/qunit.js similarity index 100% rename from browserid/static/dialog/test/qunit/qunit.js rename to resources/static/dialog/test/qunit/qunit.js diff --git a/browserid/static/dialog/test/qunit/relay/relay_unit_test.js b/resources/static/dialog/test/qunit/relay/relay_unit_test.js similarity index 100% rename from browserid/static/dialog/test/qunit/relay/relay_unit_test.js rename to resources/static/dialog/test/qunit/relay/relay_unit_test.js diff --git a/browserid/static/dialog/test/qunit/resources/browser-support_unit_test.js b/resources/static/dialog/test/qunit/resources/browser-support_unit_test.js similarity index 100% rename from browserid/static/dialog/test/qunit/resources/browser-support_unit_test.js rename to resources/static/dialog/test/qunit/resources/browser-support_unit_test.js diff --git a/browserid/static/dialog/test/qunit/resources/channel_unit_test.js b/resources/static/dialog/test/qunit/resources/channel_unit_test.js similarity index 100% rename from browserid/static/dialog/test/qunit/resources/channel_unit_test.js rename to resources/static/dialog/test/qunit/resources/channel_unit_test.js diff --git a/browserid/static/dialog/test/qunit/resources/network_unit_test.js b/resources/static/dialog/test/qunit/resources/network_unit_test.js similarity index 100% rename from browserid/static/dialog/test/qunit/resources/network_unit_test.js rename to resources/static/dialog/test/qunit/resources/network_unit_test.js diff --git a/browserid/static/dialog/test/qunit/resources/storage_unit_test.js b/resources/static/dialog/test/qunit/resources/storage_unit_test.js similarity index 100% rename from browserid/static/dialog/test/qunit/resources/storage_unit_test.js rename to resources/static/dialog/test/qunit/resources/storage_unit_test.js diff --git a/browserid/static/dialog/test/qunit/resources/user_unit_test.js b/resources/static/dialog/test/qunit/resources/user_unit_test.js similarity index 100% rename from browserid/static/dialog/test/qunit/resources/user_unit_test.js rename to resources/static/dialog/test/qunit/resources/user_unit_test.js diff --git a/browserid/static/dialog/test/qunit/resources/validation_unit_test.js b/resources/static/dialog/test/qunit/resources/validation_unit_test.js similarity index 100% rename from browserid/static/dialog/test/qunit/resources/validation_unit_test.js rename to resources/static/dialog/test/qunit/resources/validation_unit_test.js diff --git a/browserid/static/dialog/views/authenticate.ejs b/resources/static/dialog/views/authenticate.ejs similarity index 100% rename from browserid/static/dialog/views/authenticate.ejs rename to resources/static/dialog/views/authenticate.ejs diff --git a/browserid/static/dialog/views/confirmemail.ejs b/resources/static/dialog/views/confirmemail.ejs similarity index 100% rename from browserid/static/dialog/views/confirmemail.ejs rename to resources/static/dialog/views/confirmemail.ejs diff --git a/browserid/static/dialog/views/error.ejs b/resources/static/dialog/views/error.ejs similarity index 100% rename from browserid/static/dialog/views/error.ejs rename to resources/static/dialog/views/error.ejs diff --git a/browserid/static/dialog/views/offline.ejs b/resources/static/dialog/views/offline.ejs similarity index 100% rename from browserid/static/dialog/views/offline.ejs rename to resources/static/dialog/views/offline.ejs diff --git a/browserid/static/dialog/views/pickemail.ejs b/resources/static/dialog/views/pickemail.ejs similarity index 100% rename from browserid/static/dialog/views/pickemail.ejs rename to resources/static/dialog/views/pickemail.ejs diff --git a/browserid/static/dialog/views/testBodyTemplate.ejs b/resources/static/dialog/views/testBodyTemplate.ejs similarity index 100% rename from browserid/static/dialog/views/testBodyTemplate.ejs rename to resources/static/dialog/views/testBodyTemplate.ejs diff --git a/browserid/static/dialog/views/wait.ejs b/resources/static/dialog/views/wait.ejs similarity index 100% rename from browserid/static/dialog/views/wait.ejs rename to resources/static/dialog/views/wait.ejs diff --git a/browserid/static/favicon.ico b/resources/static/favicon.ico similarity index 100% rename from browserid/static/favicon.ico rename to resources/static/favicon.ico diff --git a/browserid/static/funcunit/.gitignore b/resources/static/funcunit/.gitignore similarity index 100% rename from browserid/static/funcunit/.gitignore rename to resources/static/funcunit/.gitignore diff --git a/browserid/static/funcunit/.gitmodules b/resources/static/funcunit/.gitmodules similarity index 100% rename from browserid/static/funcunit/.gitmodules rename to resources/static/funcunit/.gitmodules diff --git a/browserid/static/funcunit/README b/resources/static/funcunit/README similarity index 100% rename from browserid/static/funcunit/README rename to resources/static/funcunit/README diff --git a/browserid/static/funcunit/autosuggest/auto_suggest.js b/resources/static/funcunit/autosuggest/auto_suggest.js similarity index 100% rename from browserid/static/funcunit/autosuggest/auto_suggest.js rename to resources/static/funcunit/autosuggest/auto_suggest.js diff --git a/browserid/static/funcunit/autosuggest/autosuggest.css b/resources/static/funcunit/autosuggest/autosuggest.css similarity index 100% rename from browserid/static/funcunit/autosuggest/autosuggest.css rename to resources/static/funcunit/autosuggest/autosuggest.css diff --git a/browserid/static/funcunit/autosuggest/autosuggest.html b/resources/static/funcunit/autosuggest/autosuggest.html similarity index 100% rename from browserid/static/funcunit/autosuggest/autosuggest.html rename to resources/static/funcunit/autosuggest/autosuggest.html diff --git a/browserid/static/funcunit/autosuggest/autosuggest.js b/resources/static/funcunit/autosuggest/autosuggest.js similarity index 100% rename from browserid/static/funcunit/autosuggest/autosuggest.js rename to resources/static/funcunit/autosuggest/autosuggest.js diff --git a/browserid/static/funcunit/autosuggest/autosuggest_test.js b/resources/static/funcunit/autosuggest/autosuggest_test.js similarity index 100% rename from browserid/static/funcunit/autosuggest/autosuggest_test.js rename to resources/static/funcunit/autosuggest/autosuggest_test.js diff --git a/browserid/static/funcunit/autosuggest/funcunit.html b/resources/static/funcunit/autosuggest/funcunit.html similarity index 100% rename from browserid/static/funcunit/autosuggest/funcunit.html rename to resources/static/funcunit/autosuggest/funcunit.html diff --git a/browserid/static/funcunit/build.js b/resources/static/funcunit/build.js similarity index 100% rename from browserid/static/funcunit/build.js rename to resources/static/funcunit/build.js diff --git a/browserid/static/funcunit/dependencies.json b/resources/static/funcunit/dependencies.json similarity index 100% rename from browserid/static/funcunit/dependencies.json rename to resources/static/funcunit/dependencies.json diff --git a/browserid/static/funcunit/docs.html b/resources/static/funcunit/docs.html similarity index 100% rename from browserid/static/funcunit/docs.html rename to resources/static/funcunit/docs.html diff --git a/browserid/static/funcunit/drivers/selenium.js b/resources/static/funcunit/drivers/selenium.js similarity index 100% rename from browserid/static/funcunit/drivers/selenium.js rename to resources/static/funcunit/drivers/selenium.js diff --git a/browserid/static/funcunit/drivers/standard.js b/resources/static/funcunit/drivers/standard.js similarity index 100% rename from browserid/static/funcunit/drivers/standard.js rename to resources/static/funcunit/drivers/standard.js diff --git a/browserid/static/funcunit/envjs b/resources/static/funcunit/envjs similarity index 100% rename from browserid/static/funcunit/envjs rename to resources/static/funcunit/envjs diff --git a/browserid/static/funcunit/envjs.bat b/resources/static/funcunit/envjs.bat similarity index 100% rename from browserid/static/funcunit/envjs.bat rename to resources/static/funcunit/envjs.bat diff --git a/browserid/static/funcunit/funcunit.html b/resources/static/funcunit/funcunit.html similarity index 100% rename from browserid/static/funcunit/funcunit.html rename to resources/static/funcunit/funcunit.html diff --git a/browserid/static/funcunit/funcunit.js b/resources/static/funcunit/funcunit.js similarity index 100% rename from browserid/static/funcunit/funcunit.js rename to resources/static/funcunit/funcunit.js diff --git a/browserid/static/funcunit/generate_docs.html b/resources/static/funcunit/generate_docs.html similarity index 100% rename from browserid/static/funcunit/generate_docs.html rename to resources/static/funcunit/generate_docs.html diff --git a/browserid/static/funcunit/index.html b/resources/static/funcunit/index.html similarity index 100% rename from browserid/static/funcunit/index.html rename to resources/static/funcunit/index.html diff --git a/browserid/static/funcunit/java/extensions/fakesteal.js b/resources/static/funcunit/java/extensions/fakesteal.js similarity index 100% rename from browserid/static/funcunit/java/extensions/fakesteal.js rename to resources/static/funcunit/java/extensions/fakesteal.js diff --git a/browserid/static/funcunit/java/extensions/wrapped.js b/resources/static/funcunit/java/extensions/wrapped.js similarity index 100% rename from browserid/static/funcunit/java/extensions/wrapped.js rename to resources/static/funcunit/java/extensions/wrapped.js diff --git a/browserid/static/funcunit/java/selenium-java-client-driver.jar b/resources/static/funcunit/java/selenium-java-client-driver.jar similarity index 100% rename from browserid/static/funcunit/java/selenium-java-client-driver.jar rename to resources/static/funcunit/java/selenium-java-client-driver.jar diff --git a/browserid/static/funcunit/java/selenium-server-standalone-2.0b3.jar b/resources/static/funcunit/java/selenium-server-standalone-2.0b3.jar similarity index 100% rename from browserid/static/funcunit/java/selenium-server-standalone-2.0b3.jar rename to resources/static/funcunit/java/selenium-server-standalone-2.0b3.jar diff --git a/browserid/static/funcunit/java/user-extensions.js b/resources/static/funcunit/java/user-extensions.js similarity index 100% rename from browserid/static/funcunit/java/user-extensions.js rename to resources/static/funcunit/java/user-extensions.js diff --git a/browserid/static/funcunit/loader.js b/resources/static/funcunit/loader.js similarity index 100% rename from browserid/static/funcunit/loader.js rename to resources/static/funcunit/loader.js diff --git a/browserid/static/funcunit/pages/example.js b/resources/static/funcunit/pages/example.js similarity index 100% rename from browserid/static/funcunit/pages/example.js rename to resources/static/funcunit/pages/example.js diff --git a/browserid/static/funcunit/pages/follow.js b/resources/static/funcunit/pages/follow.js similarity index 100% rename from browserid/static/funcunit/pages/follow.js rename to resources/static/funcunit/pages/follow.js diff --git a/browserid/static/funcunit/pages/init.js b/resources/static/funcunit/pages/init.js similarity index 100% rename from browserid/static/funcunit/pages/init.js rename to resources/static/funcunit/pages/init.js diff --git a/browserid/static/funcunit/pages/mastering.js b/resources/static/funcunit/pages/mastering.js similarity index 100% rename from browserid/static/funcunit/pages/mastering.js rename to resources/static/funcunit/pages/mastering.js diff --git a/browserid/static/funcunit/pages/selenium.js b/resources/static/funcunit/pages/selenium.js similarity index 100% rename from browserid/static/funcunit/pages/selenium.js rename to resources/static/funcunit/pages/selenium.js diff --git a/browserid/static/funcunit/pages/setup.js b/resources/static/funcunit/pages/setup.js similarity index 100% rename from browserid/static/funcunit/pages/setup.js rename to resources/static/funcunit/pages/setup.js diff --git a/browserid/static/funcunit/pages/standalone.js b/resources/static/funcunit/pages/standalone.js similarity index 100% rename from browserid/static/funcunit/pages/standalone.js rename to resources/static/funcunit/pages/standalone.js diff --git a/browserid/static/funcunit/pages/writing.js b/resources/static/funcunit/pages/writing.js similarity index 100% rename from browserid/static/funcunit/pages/writing.js rename to resources/static/funcunit/pages/writing.js diff --git a/browserid/static/funcunit/qunit.html b/resources/static/funcunit/qunit.html similarity index 100% rename from browserid/static/funcunit/qunit.html rename to resources/static/funcunit/qunit.html diff --git a/browserid/static/funcunit/qunit/qunit.css b/resources/static/funcunit/qunit/qunit.css similarity index 100% rename from browserid/static/funcunit/qunit/qunit.css rename to resources/static/funcunit/qunit/qunit.css diff --git a/browserid/static/funcunit/qunit/qunit.js b/resources/static/funcunit/qunit/qunit.js similarity index 100% rename from browserid/static/funcunit/qunit/qunit.js rename to resources/static/funcunit/qunit/qunit.js diff --git a/browserid/static/funcunit/qunit/rhino/rhino.js b/resources/static/funcunit/qunit/rhino/rhino.js similarity index 100% rename from browserid/static/funcunit/qunit/rhino/rhino.js rename to resources/static/funcunit/qunit/rhino/rhino.js diff --git a/browserid/static/funcunit/qunit/test/qunit.html b/resources/static/funcunit/qunit/test/qunit.html similarity index 100% rename from browserid/static/funcunit/qunit/test/qunit.html rename to resources/static/funcunit/qunit/test/qunit.html diff --git a/browserid/static/funcunit/qunit/test/test.js b/resources/static/funcunit/qunit/test/test.js similarity index 100% rename from browserid/static/funcunit/qunit/test/test.js rename to resources/static/funcunit/qunit/test/test.js diff --git a/browserid/static/funcunit/resources/jquery.js b/resources/static/funcunit/resources/jquery.js similarity index 100% rename from browserid/static/funcunit/resources/jquery.js rename to resources/static/funcunit/resources/jquery.js diff --git a/browserid/static/funcunit/resources/json.js b/resources/static/funcunit/resources/json.js similarity index 100% rename from browserid/static/funcunit/resources/json.js rename to resources/static/funcunit/resources/json.js diff --git a/browserid/static/funcunit/resources/selector.js b/resources/static/funcunit/resources/selector.js similarity index 100% rename from browserid/static/funcunit/resources/selector.js rename to resources/static/funcunit/resources/selector.js diff --git a/browserid/static/funcunit/resources/selenium_start.js b/resources/static/funcunit/resources/selenium_start.js similarity index 100% rename from browserid/static/funcunit/resources/selenium_start.js rename to resources/static/funcunit/resources/selenium_start.js diff --git a/browserid/static/funcunit/scripts/run.js b/resources/static/funcunit/scripts/run.js similarity index 100% rename from browserid/static/funcunit/scripts/run.js rename to resources/static/funcunit/scripts/run.js diff --git a/browserid/static/funcunit/settings.js b/resources/static/funcunit/settings.js similarity index 100% rename from browserid/static/funcunit/settings.js rename to resources/static/funcunit/settings.js diff --git a/browserid/static/funcunit/summary.ejs b/resources/static/funcunit/summary.ejs similarity index 100% rename from browserid/static/funcunit/summary.ejs rename to resources/static/funcunit/summary.ejs diff --git a/browserid/static/funcunit/syn/.gitignore b/resources/static/funcunit/syn/.gitignore similarity index 100% rename from browserid/static/funcunit/syn/.gitignore rename to resources/static/funcunit/syn/.gitignore diff --git a/browserid/static/funcunit/syn/README b/resources/static/funcunit/syn/README similarity index 100% rename from browserid/static/funcunit/syn/README rename to resources/static/funcunit/syn/README diff --git a/browserid/static/funcunit/syn/browsers.js b/resources/static/funcunit/syn/browsers.js similarity index 100% rename from browserid/static/funcunit/syn/browsers.js rename to resources/static/funcunit/syn/browsers.js diff --git a/browserid/static/funcunit/syn/build.js b/resources/static/funcunit/syn/build.js similarity index 100% rename from browserid/static/funcunit/syn/build.js rename to resources/static/funcunit/syn/build.js diff --git a/browserid/static/funcunit/syn/demo.html b/resources/static/funcunit/syn/demo.html similarity index 100% rename from browserid/static/funcunit/syn/demo.html rename to resources/static/funcunit/syn/demo.html diff --git a/browserid/static/funcunit/syn/demo/record.js b/resources/static/funcunit/syn/demo/record.js similarity index 100% rename from browserid/static/funcunit/syn/demo/record.js rename to resources/static/funcunit/syn/demo/record.js diff --git a/browserid/static/funcunit/syn/drag/drag.html b/resources/static/funcunit/syn/drag/drag.html similarity index 100% rename from browserid/static/funcunit/syn/drag/drag.html rename to resources/static/funcunit/syn/drag/drag.html diff --git a/browserid/static/funcunit/syn/drag/drag.js b/resources/static/funcunit/syn/drag/drag.js similarity index 100% rename from browserid/static/funcunit/syn/drag/drag.js rename to resources/static/funcunit/syn/drag/drag.js diff --git a/browserid/static/funcunit/syn/drag/qunit.html b/resources/static/funcunit/syn/drag/qunit.html similarity index 100% rename from browserid/static/funcunit/syn/drag/qunit.html rename to resources/static/funcunit/syn/drag/qunit.html diff --git a/browserid/static/funcunit/syn/drag/test/qunit/drag_test.js b/resources/static/funcunit/syn/drag/test/qunit/drag_test.js similarity index 100% rename from browserid/static/funcunit/syn/drag/test/qunit/drag_test.js rename to resources/static/funcunit/syn/drag/test/qunit/drag_test.js diff --git a/browserid/static/funcunit/syn/drag/test/qunit/qunit.js b/resources/static/funcunit/syn/drag/test/qunit/qunit.js similarity index 100% rename from browserid/static/funcunit/syn/drag/test/qunit/qunit.js rename to resources/static/funcunit/syn/drag/test/qunit/qunit.js diff --git a/browserid/static/funcunit/syn/key.js b/resources/static/funcunit/syn/key.js similarity index 100% rename from browserid/static/funcunit/syn/key.js rename to resources/static/funcunit/syn/key.js diff --git a/browserid/static/funcunit/syn/mouse.js b/resources/static/funcunit/syn/mouse.js similarity index 100% rename from browserid/static/funcunit/syn/mouse.js rename to resources/static/funcunit/syn/mouse.js diff --git a/browserid/static/funcunit/syn/qunit.html b/resources/static/funcunit/syn/qunit.html similarity index 100% rename from browserid/static/funcunit/syn/qunit.html rename to resources/static/funcunit/syn/qunit.html diff --git a/browserid/static/funcunit/syn/recorder.html b/resources/static/funcunit/syn/recorder.html similarity index 100% rename from browserid/static/funcunit/syn/recorder.html rename to resources/static/funcunit/syn/recorder.html diff --git a/browserid/static/funcunit/syn/resources/jquery.event.drag.js b/resources/static/funcunit/syn/resources/jquery.event.drag.js similarity index 100% rename from browserid/static/funcunit/syn/resources/jquery.event.drag.js rename to resources/static/funcunit/syn/resources/jquery.event.drag.js diff --git a/browserid/static/funcunit/syn/resources/jquery.event.drop.js b/resources/static/funcunit/syn/resources/jquery.event.drop.js similarity index 100% rename from browserid/static/funcunit/syn/resources/jquery.event.drop.js rename to resources/static/funcunit/syn/resources/jquery.event.drop.js diff --git a/browserid/static/funcunit/syn/resources/jquery.js b/resources/static/funcunit/syn/resources/jquery.js similarity index 100% rename from browserid/static/funcunit/syn/resources/jquery.js rename to resources/static/funcunit/syn/resources/jquery.js diff --git a/browserid/static/funcunit/syn/resources/qunit/qunit.css b/resources/static/funcunit/syn/resources/qunit/qunit.css similarity index 100% rename from browserid/static/funcunit/syn/resources/qunit/qunit.css rename to resources/static/funcunit/syn/resources/qunit/qunit.css diff --git a/browserid/static/funcunit/syn/resources/qunit/qunit.js b/resources/static/funcunit/syn/resources/qunit/qunit.js similarity index 100% rename from browserid/static/funcunit/syn/resources/qunit/qunit.js rename to resources/static/funcunit/syn/resources/qunit/qunit.js diff --git a/browserid/static/funcunit/syn/syn.js b/resources/static/funcunit/syn/syn.js similarity index 100% rename from browserid/static/funcunit/syn/syn.js rename to resources/static/funcunit/syn/syn.js diff --git a/browserid/static/funcunit/syn/synthetic.html b/resources/static/funcunit/syn/synthetic.html similarity index 100% rename from browserid/static/funcunit/syn/synthetic.html rename to resources/static/funcunit/syn/synthetic.html diff --git a/browserid/static/funcunit/syn/synthetic.js b/resources/static/funcunit/syn/synthetic.js similarity index 100% rename from browserid/static/funcunit/syn/synthetic.js rename to resources/static/funcunit/syn/synthetic.js diff --git a/browserid/static/funcunit/syn/test/clickbasic.html b/resources/static/funcunit/syn/test/clickbasic.html similarity index 100% rename from browserid/static/funcunit/syn/test/clickbasic.html rename to resources/static/funcunit/syn/test/clickbasic.html diff --git a/browserid/static/funcunit/syn/test/qunit/h3.html b/resources/static/funcunit/syn/test/qunit/h3.html similarity index 100% rename from browserid/static/funcunit/syn/test/qunit/h3.html rename to resources/static/funcunit/syn/test/qunit/h3.html diff --git a/browserid/static/funcunit/syn/test/qunit/key_test.js b/resources/static/funcunit/syn/test/qunit/key_test.js similarity index 100% rename from browserid/static/funcunit/syn/test/qunit/key_test.js rename to resources/static/funcunit/syn/test/qunit/key_test.js diff --git a/browserid/static/funcunit/syn/test/qunit/mouse_test.js b/resources/static/funcunit/syn/test/qunit/mouse_test.js similarity index 100% rename from browserid/static/funcunit/syn/test/qunit/mouse_test.js rename to resources/static/funcunit/syn/test/qunit/mouse_test.js diff --git a/browserid/static/funcunit/syn/test/qunit/page1.html b/resources/static/funcunit/syn/test/qunit/page1.html similarity index 100% rename from browserid/static/funcunit/syn/test/qunit/page1.html rename to resources/static/funcunit/syn/test/qunit/page1.html diff --git a/browserid/static/funcunit/syn/test/qunit/page2.html b/resources/static/funcunit/syn/test/qunit/page2.html similarity index 100% rename from browserid/static/funcunit/syn/test/qunit/page2.html rename to resources/static/funcunit/syn/test/qunit/page2.html diff --git a/browserid/static/funcunit/syn/test/qunit/qunit.js b/resources/static/funcunit/syn/test/qunit/qunit.js similarity index 100% rename from browserid/static/funcunit/syn/test/qunit/qunit.js rename to resources/static/funcunit/syn/test/qunit/qunit.js diff --git a/browserid/static/funcunit/syn/test/qunit/syn_test.js b/resources/static/funcunit/syn/test/qunit/syn_test.js similarity index 100% rename from browserid/static/funcunit/syn/test/qunit/syn_test.js rename to resources/static/funcunit/syn/test/qunit/syn_test.js diff --git a/browserid/static/funcunit/syn/test/submit.html b/resources/static/funcunit/syn/test/submit.html similarity index 100% rename from browserid/static/funcunit/syn/test/submit.html rename to resources/static/funcunit/syn/test/submit.html diff --git a/browserid/static/funcunit/syn/test/submitted.html b/resources/static/funcunit/syn/test/submitted.html similarity index 100% rename from browserid/static/funcunit/syn/test/submitted.html rename to resources/static/funcunit/syn/test/submitted.html diff --git a/browserid/static/funcunit/template.html b/resources/static/funcunit/template.html similarity index 100% rename from browserid/static/funcunit/template.html rename to resources/static/funcunit/template.html diff --git a/browserid/static/funcunit/test/drag.html b/resources/static/funcunit/test/drag.html similarity index 100% rename from browserid/static/funcunit/test/drag.html rename to resources/static/funcunit/test/drag.html diff --git a/browserid/static/funcunit/test/findclosest.html b/resources/static/funcunit/test/findclosest.html similarity index 100% rename from browserid/static/funcunit/test/findclosest.html rename to resources/static/funcunit/test/findclosest.html diff --git a/browserid/static/funcunit/test/funcunit/find_closest_test.js b/resources/static/funcunit/test/funcunit/find_closest_test.js similarity index 100% rename from browserid/static/funcunit/test/funcunit/find_closest_test.js rename to resources/static/funcunit/test/funcunit/find_closest_test.js diff --git a/browserid/static/funcunit/test/funcunit/funcunit.js b/resources/static/funcunit/test/funcunit/funcunit.js similarity index 100% rename from browserid/static/funcunit/test/funcunit/funcunit.js rename to resources/static/funcunit/test/funcunit/funcunit.js diff --git a/browserid/static/funcunit/test/funcunit/funcunit_test.js b/resources/static/funcunit/test/funcunit/funcunit_test.js similarity index 100% rename from browserid/static/funcunit/test/funcunit/funcunit_test.js rename to resources/static/funcunit/test/funcunit/funcunit_test.js diff --git a/browserid/static/funcunit/test/funcunit/open_test.js b/resources/static/funcunit/test/funcunit/open_test.js similarity index 100% rename from browserid/static/funcunit/test/funcunit/open_test.js rename to resources/static/funcunit/test/funcunit/open_test.js diff --git a/browserid/static/funcunit/test/funcunit/protodrag_test.js b/resources/static/funcunit/test/funcunit/protodrag_test.js similarity index 100% rename from browserid/static/funcunit/test/funcunit/protodrag_test.js rename to resources/static/funcunit/test/funcunit/protodrag_test.js diff --git a/browserid/static/funcunit/test/funcunit/syn_test.js b/resources/static/funcunit/test/funcunit/syn_test.js similarity index 100% rename from browserid/static/funcunit/test/funcunit/syn_test.js rename to resources/static/funcunit/test/funcunit/syn_test.js diff --git a/browserid/static/funcunit/test/jquery.event.drag.js b/resources/static/funcunit/test/jquery.event.drag.js similarity index 100% rename from browserid/static/funcunit/test/jquery.event.drag.js rename to resources/static/funcunit/test/jquery.event.drag.js diff --git a/browserid/static/funcunit/test/jquery.event.drop.js b/resources/static/funcunit/test/jquery.event.drop.js similarity index 100% rename from browserid/static/funcunit/test/jquery.event.drop.js rename to resources/static/funcunit/test/jquery.event.drop.js diff --git a/browserid/static/funcunit/test/jquery.js b/resources/static/funcunit/test/jquery.js similarity index 100% rename from browserid/static/funcunit/test/jquery.js rename to resources/static/funcunit/test/jquery.js diff --git a/browserid/static/funcunit/test/myapp.html b/resources/static/funcunit/test/myapp.html similarity index 100% rename from browserid/static/funcunit/test/myapp.html rename to resources/static/funcunit/test/myapp.html diff --git a/browserid/static/funcunit/test/myotherapp.html b/resources/static/funcunit/test/myotherapp.html similarity index 100% rename from browserid/static/funcunit/test/myotherapp.html rename to resources/static/funcunit/test/myotherapp.html diff --git a/browserid/static/funcunit/test/protodrag/dragdrop.js b/resources/static/funcunit/test/protodrag/dragdrop.js similarity index 100% rename from browserid/static/funcunit/test/protodrag/dragdrop.js rename to resources/static/funcunit/test/protodrag/dragdrop.js diff --git a/browserid/static/funcunit/test/protodrag/effects.js b/resources/static/funcunit/test/protodrag/effects.js similarity index 100% rename from browserid/static/funcunit/test/protodrag/effects.js rename to resources/static/funcunit/test/protodrag/effects.js diff --git a/browserid/static/funcunit/test/protodrag/funcunit_test.js b/resources/static/funcunit/test/protodrag/funcunit_test.js similarity index 100% rename from browserid/static/funcunit/test/protodrag/funcunit_test.js rename to resources/static/funcunit/test/protodrag/funcunit_test.js diff --git a/browserid/static/funcunit/test/protodrag/myapp.html b/resources/static/funcunit/test/protodrag/myapp.html similarity index 100% rename from browserid/static/funcunit/test/protodrag/myapp.html rename to resources/static/funcunit/test/protodrag/myapp.html diff --git a/browserid/static/funcunit/test/protodrag/prototype.js b/resources/static/funcunit/test/protodrag/prototype.js similarity index 100% rename from browserid/static/funcunit/test/protodrag/prototype.js rename to resources/static/funcunit/test/protodrag/prototype.js diff --git a/browserid/static/funcunit/test/protodrag/scriptaculous.js b/resources/static/funcunit/test/protodrag/scriptaculous.js similarity index 100% rename from browserid/static/funcunit/test/protodrag/scriptaculous.js rename to resources/static/funcunit/test/protodrag/scriptaculous.js diff --git a/browserid/static/funcunit/test/qunit/qunit.js b/resources/static/funcunit/test/qunit/qunit.js similarity index 100% rename from browserid/static/funcunit/test/qunit/qunit.js rename to resources/static/funcunit/test/qunit/qunit.js diff --git a/browserid/static/funcunit/test/run.js b/resources/static/funcunit/test/run.js similarity index 100% rename from browserid/static/funcunit/test/run.js rename to resources/static/funcunit/test/run.js diff --git a/browserid/static/funcunit/update b/resources/static/funcunit/update similarity index 100% rename from browserid/static/funcunit/update rename to resources/static/funcunit/update diff --git a/browserid/static/i/a_better_way.png b/resources/static/i/a_better_way.png similarity index 100% rename from browserid/static/i/a_better_way.png rename to resources/static/i/a_better_way.png diff --git a/browserid/static/i/arrow.png b/resources/static/i/arrow.png similarity index 100% rename from browserid/static/i/arrow.png rename to resources/static/i/arrow.png diff --git a/browserid/static/i/bg.png b/resources/static/i/bg.png similarity index 100% rename from browserid/static/i/bg.png rename to resources/static/i/bg.png diff --git a/browserid/static/i/blink.gif b/resources/static/i/blink.gif similarity index 100% rename from browserid/static/i/blink.gif rename to resources/static/i/blink.gif diff --git a/browserid/static/i/browserid_logo_lil.png b/resources/static/i/browserid_logo_lil.png similarity index 100% rename from browserid/static/i/browserid_logo_lil.png rename to resources/static/i/browserid_logo_lil.png diff --git a/browserid/static/i/browserid_logo_sm.png b/resources/static/i/browserid_logo_sm.png similarity index 100% rename from browserid/static/i/browserid_logo_sm.png rename to resources/static/i/browserid_logo_sm.png diff --git a/browserid/static/i/card.png b/resources/static/i/card.png similarity index 100% rename from browserid/static/i/card.png rename to resources/static/i/card.png diff --git a/browserid/static/i/check.png b/resources/static/i/check.png similarity index 100% rename from browserid/static/i/check.png rename to resources/static/i/check.png diff --git a/browserid/static/i/count.png b/resources/static/i/count.png similarity index 100% rename from browserid/static/i/count.png rename to resources/static/i/count.png diff --git a/browserid/static/i/firefox_logo.png b/resources/static/i/firefox_logo.png similarity index 100% rename from browserid/static/i/firefox_logo.png rename to resources/static/i/firefox_logo.png diff --git a/browserid/static/i/hint.png b/resources/static/i/hint.png similarity index 100% rename from browserid/static/i/hint.png rename to resources/static/i/hint.png diff --git a/browserid/static/i/icon.png b/resources/static/i/icon.png similarity index 100% rename from browserid/static/i/icon.png rename to resources/static/i/icon.png diff --git a/browserid/static/i/labs-logo-small.png b/resources/static/i/labs-logo-small.png similarity index 100% rename from browserid/static/i/labs-logo-small.png rename to resources/static/i/labs-logo-small.png diff --git a/browserid/static/i/lock.png b/resources/static/i/lock.png similarity index 100% rename from browserid/static/i/lock.png rename to resources/static/i/lock.png diff --git a/browserid/static/i/sign_in_blue.png b/resources/static/i/sign_in_blue.png similarity index 100% rename from browserid/static/i/sign_in_blue.png rename to resources/static/i/sign_in_blue.png diff --git a/browserid/static/i/sign_in_green.png b/resources/static/i/sign_in_green.png similarity index 100% rename from browserid/static/i/sign_in_green.png rename to resources/static/i/sign_in_green.png diff --git a/browserid/static/i/sign_in_grey.png b/resources/static/i/sign_in_grey.png similarity index 100% rename from browserid/static/i/sign_in_grey.png rename to resources/static/i/sign_in_grey.png diff --git a/browserid/static/i/sign_in_orange.png b/resources/static/i/sign_in_orange.png similarity index 100% rename from browserid/static/i/sign_in_orange.png rename to resources/static/i/sign_in_orange.png diff --git a/browserid/static/i/sign_in_red.png b/resources/static/i/sign_in_red.png similarity index 100% rename from browserid/static/i/sign_in_red.png rename to resources/static/i/sign_in_red.png diff --git a/browserid/static/i/slit.png b/resources/static/i/slit.png similarity index 100% rename from browserid/static/i/slit.png rename to resources/static/i/slit.png diff --git a/browserid/static/i/sprite.png b/resources/static/i/sprite.png similarity index 100% rename from browserid/static/i/sprite.png rename to resources/static/i/sprite.png diff --git a/browserid/static/i/sunny.png b/resources/static/i/sunny.png similarity index 100% rename from browserid/static/i/sunny.png rename to resources/static/i/sunny.png diff --git a/browserid/static/i/times.gif b/resources/static/i/times.gif similarity index 100% rename from browserid/static/i/times.gif rename to resources/static/i/times.gif diff --git a/browserid/static/i/tutorial_1.png b/resources/static/i/tutorial_1.png similarity index 100% rename from browserid/static/i/tutorial_1.png rename to resources/static/i/tutorial_1.png diff --git a/browserid/static/i/tutorial_2.png b/resources/static/i/tutorial_2.png similarity index 100% rename from browserid/static/i/tutorial_2.png rename to resources/static/i/tutorial_2.png diff --git a/browserid/static/i/tutorial_3.png b/resources/static/i/tutorial_3.png similarity index 100% rename from browserid/static/i/tutorial_3.png rename to resources/static/i/tutorial_3.png diff --git a/browserid/static/include.js b/resources/static/include.js similarity index 100% rename from browserid/static/include.js rename to resources/static/include.js diff --git a/browserid/static/jquery/.gitignore b/resources/static/jquery/.gitignore similarity index 100% rename from browserid/static/jquery/.gitignore rename to resources/static/jquery/.gitignore diff --git a/browserid/static/jquery/README b/resources/static/jquery/README similarity index 100% rename from browserid/static/jquery/README rename to resources/static/jquery/README diff --git a/browserid/static/jquery/build.js b/resources/static/jquery/build.js similarity index 100% rename from browserid/static/jquery/build.js rename to resources/static/jquery/build.js diff --git a/browserid/static/jquery/buildAll.js b/resources/static/jquery/buildAll.js similarity index 100% rename from browserid/static/jquery/buildAll.js rename to resources/static/jquery/buildAll.js diff --git a/browserid/static/jquery/class/class.html b/resources/static/jquery/class/class.html similarity index 100% rename from browserid/static/jquery/class/class.html rename to resources/static/jquery/class/class.html diff --git a/browserid/static/jquery/class/class.js b/resources/static/jquery/class/class.js similarity index 100% rename from browserid/static/jquery/class/class.js rename to resources/static/jquery/class/class.js diff --git a/browserid/static/jquery/class/class_test.js b/resources/static/jquery/class/class_test.js similarity index 100% rename from browserid/static/jquery/class/class_test.js rename to resources/static/jquery/class/class_test.js diff --git a/browserid/static/jquery/class/qunit.html b/resources/static/jquery/class/qunit.html similarity index 100% rename from browserid/static/jquery/class/qunit.html rename to resources/static/jquery/class/qunit.html diff --git a/browserid/static/jquery/controller/controller.html b/resources/static/jquery/controller/controller.html similarity index 100% rename from browserid/static/jquery/controller/controller.html rename to resources/static/jquery/controller/controller.html diff --git a/browserid/static/jquery/controller/controller.js b/resources/static/jquery/controller/controller.js similarity index 100% rename from browserid/static/jquery/controller/controller.js rename to resources/static/jquery/controller/controller.js diff --git a/browserid/static/jquery/controller/controller_test.js b/resources/static/jquery/controller/controller_test.js similarity index 100% rename from browserid/static/jquery/controller/controller_test.js rename to resources/static/jquery/controller/controller_test.js diff --git a/browserid/static/jquery/controller/history/history.html b/resources/static/jquery/controller/history/history.html similarity index 100% rename from browserid/static/jquery/controller/history/history.html rename to resources/static/jquery/controller/history/history.html diff --git a/browserid/static/jquery/controller/history/history.js b/resources/static/jquery/controller/history/history.js similarity index 100% rename from browserid/static/jquery/controller/history/history.js rename to resources/static/jquery/controller/history/history.js diff --git a/browserid/static/jquery/controller/history/html5/html5.js b/resources/static/jquery/controller/history/html5/html5.js similarity index 100% rename from browserid/static/jquery/controller/history/html5/html5.js rename to resources/static/jquery/controller/history/html5/html5.js diff --git a/browserid/static/jquery/controller/history/html5/qunit.html b/resources/static/jquery/controller/history/html5/qunit.html similarity index 100% rename from browserid/static/jquery/controller/history/html5/qunit.html rename to resources/static/jquery/controller/history/html5/qunit.html diff --git a/browserid/static/jquery/controller/history/html5/qunit/qunit.js b/resources/static/jquery/controller/history/html5/qunit/qunit.js similarity index 100% rename from browserid/static/jquery/controller/history/html5/qunit/qunit.js rename to resources/static/jquery/controller/history/html5/qunit/qunit.js diff --git a/browserid/static/jquery/controller/history/qunit.html b/resources/static/jquery/controller/history/qunit.html similarity index 100% rename from browserid/static/jquery/controller/history/qunit.html rename to resources/static/jquery/controller/history/qunit.html diff --git a/browserid/static/jquery/controller/history/qunit/qunit.js b/resources/static/jquery/controller/history/qunit/qunit.js similarity index 100% rename from browserid/static/jquery/controller/history/qunit/qunit.js rename to resources/static/jquery/controller/history/qunit/qunit.js diff --git a/browserid/static/jquery/controller/pages/document.js b/resources/static/jquery/controller/pages/document.js similarity index 100% rename from browserid/static/jquery/controller/pages/document.js rename to resources/static/jquery/controller/pages/document.js diff --git a/browserid/static/jquery/controller/pages/listening.js b/resources/static/jquery/controller/pages/listening.js similarity index 100% rename from browserid/static/jquery/controller/pages/listening.js rename to resources/static/jquery/controller/pages/listening.js diff --git a/browserid/static/jquery/controller/pages/plugin.js b/resources/static/jquery/controller/pages/plugin.js similarity index 100% rename from browserid/static/jquery/controller/pages/plugin.js rename to resources/static/jquery/controller/pages/plugin.js diff --git a/browserid/static/jquery/controller/qunit.html b/resources/static/jquery/controller/qunit.html similarity index 100% rename from browserid/static/jquery/controller/qunit.html rename to resources/static/jquery/controller/qunit.html diff --git a/browserid/static/jquery/controller/subscribe/funcunit.html b/resources/static/jquery/controller/subscribe/funcunit.html similarity index 100% rename from browserid/static/jquery/controller/subscribe/funcunit.html rename to resources/static/jquery/controller/subscribe/funcunit.html diff --git a/browserid/static/jquery/controller/subscribe/subscribe.html b/resources/static/jquery/controller/subscribe/subscribe.html similarity index 100% rename from browserid/static/jquery/controller/subscribe/subscribe.html rename to resources/static/jquery/controller/subscribe/subscribe.html diff --git a/browserid/static/jquery/controller/subscribe/subscribe.js b/resources/static/jquery/controller/subscribe/subscribe.js similarity index 100% rename from browserid/static/jquery/controller/subscribe/subscribe.js rename to resources/static/jquery/controller/subscribe/subscribe.js diff --git a/browserid/static/jquery/controller/view/qunit.html b/resources/static/jquery/controller/view/qunit.html similarity index 100% rename from browserid/static/jquery/controller/view/qunit.html rename to resources/static/jquery/controller/view/qunit.html diff --git a/browserid/static/jquery/controller/view/test/qunit/controller_view_test.js b/resources/static/jquery/controller/view/test/qunit/controller_view_test.js similarity index 100% rename from browserid/static/jquery/controller/view/test/qunit/controller_view_test.js rename to resources/static/jquery/controller/view/test/qunit/controller_view_test.js diff --git a/browserid/static/jquery/controller/view/test/qunit/qunit.js b/resources/static/jquery/controller/view/test/qunit/qunit.js similarity index 100% rename from browserid/static/jquery/controller/view/test/qunit/qunit.js rename to resources/static/jquery/controller/view/test/qunit/qunit.js diff --git a/browserid/static/jquery/controller/view/test/qunit/views/init.micro b/resources/static/jquery/controller/view/test/qunit/views/init.micro similarity index 100% rename from browserid/static/jquery/controller/view/test/qunit/views/init.micro rename to resources/static/jquery/controller/view/test/qunit/views/init.micro diff --git a/browserid/static/jquery/controller/view/view.js b/resources/static/jquery/controller/view/view.js similarity index 100% rename from browserid/static/jquery/controller/view/view.js rename to resources/static/jquery/controller/view/view.js diff --git a/browserid/static/jquery/dom/closest/closest.js b/resources/static/jquery/dom/closest/closest.js similarity index 100% rename from browserid/static/jquery/dom/closest/closest.js rename to resources/static/jquery/dom/closest/closest.js diff --git a/browserid/static/jquery/dom/compare/compare.html b/resources/static/jquery/dom/compare/compare.html similarity index 100% rename from browserid/static/jquery/dom/compare/compare.html rename to resources/static/jquery/dom/compare/compare.html diff --git a/browserid/static/jquery/dom/compare/compare.js b/resources/static/jquery/dom/compare/compare.js similarity index 100% rename from browserid/static/jquery/dom/compare/compare.js rename to resources/static/jquery/dom/compare/compare.js diff --git a/browserid/static/jquery/dom/compare/compare_test.js b/resources/static/jquery/dom/compare/compare_test.js similarity index 100% rename from browserid/static/jquery/dom/compare/compare_test.js rename to resources/static/jquery/dom/compare/compare_test.js diff --git a/browserid/static/jquery/dom/compare/qunit.html b/resources/static/jquery/dom/compare/qunit.html similarity index 100% rename from browserid/static/jquery/dom/compare/qunit.html rename to resources/static/jquery/dom/compare/qunit.html diff --git a/browserid/static/jquery/dom/cookie/cookie.js b/resources/static/jquery/dom/cookie/cookie.js similarity index 100% rename from browserid/static/jquery/dom/cookie/cookie.js rename to resources/static/jquery/dom/cookie/cookie.js diff --git a/browserid/static/jquery/dom/cur_styles/cur_styles.html b/resources/static/jquery/dom/cur_styles/cur_styles.html similarity index 100% rename from browserid/static/jquery/dom/cur_styles/cur_styles.html rename to resources/static/jquery/dom/cur_styles/cur_styles.html diff --git a/browserid/static/jquery/dom/cur_styles/cur_styles.js b/resources/static/jquery/dom/cur_styles/cur_styles.js similarity index 100% rename from browserid/static/jquery/dom/cur_styles/cur_styles.js rename to resources/static/jquery/dom/cur_styles/cur_styles.js diff --git a/browserid/static/jquery/dom/cur_styles/cur_styles_test.js b/resources/static/jquery/dom/cur_styles/cur_styles_test.js similarity index 100% rename from browserid/static/jquery/dom/cur_styles/cur_styles_test.js rename to resources/static/jquery/dom/cur_styles/cur_styles_test.js diff --git a/browserid/static/jquery/dom/cur_styles/qunit.html b/resources/static/jquery/dom/cur_styles/qunit.html similarity index 100% rename from browserid/static/jquery/dom/cur_styles/qunit.html rename to resources/static/jquery/dom/cur_styles/qunit.html diff --git a/browserid/static/jquery/dom/cur_styles/test/curStyles.micro b/resources/static/jquery/dom/cur_styles/test/curStyles.micro similarity index 100% rename from browserid/static/jquery/dom/cur_styles/test/curStyles.micro rename to resources/static/jquery/dom/cur_styles/test/curStyles.micro diff --git a/browserid/static/jquery/dom/dimensions/dimensions.html b/resources/static/jquery/dom/dimensions/dimensions.html similarity index 100% rename from browserid/static/jquery/dom/dimensions/dimensions.html rename to resources/static/jquery/dom/dimensions/dimensions.html diff --git a/browserid/static/jquery/dom/dimensions/dimensions.js b/resources/static/jquery/dom/dimensions/dimensions.js similarity index 100% rename from browserid/static/jquery/dom/dimensions/dimensions.js rename to resources/static/jquery/dom/dimensions/dimensions.js diff --git a/browserid/static/jquery/dom/dimensions/qunit.html b/resources/static/jquery/dom/dimensions/qunit.html similarity index 100% rename from browserid/static/jquery/dom/dimensions/qunit.html rename to resources/static/jquery/dom/dimensions/qunit.html diff --git a/browserid/static/jquery/dom/dimensions/test/qunit/curStyles.micro b/resources/static/jquery/dom/dimensions/test/qunit/curStyles.micro similarity index 100% rename from browserid/static/jquery/dom/dimensions/test/qunit/curStyles.micro rename to resources/static/jquery/dom/dimensions/test/qunit/curStyles.micro diff --git a/browserid/static/jquery/dom/dimensions/test/qunit/dimensions_test.js b/resources/static/jquery/dom/dimensions/test/qunit/dimensions_test.js similarity index 100% rename from browserid/static/jquery/dom/dimensions/test/qunit/dimensions_test.js rename to resources/static/jquery/dom/dimensions/test/qunit/dimensions_test.js diff --git a/browserid/static/jquery/dom/dimensions/test/qunit/outer.micro b/resources/static/jquery/dom/dimensions/test/qunit/outer.micro similarity index 100% rename from browserid/static/jquery/dom/dimensions/test/qunit/outer.micro rename to resources/static/jquery/dom/dimensions/test/qunit/outer.micro diff --git a/browserid/static/jquery/dom/dimensions/test/qunit/qunit.js b/resources/static/jquery/dom/dimensions/test/qunit/qunit.js similarity index 100% rename from browserid/static/jquery/dom/dimensions/test/qunit/qunit.js rename to resources/static/jquery/dom/dimensions/test/qunit/qunit.js diff --git a/browserid/static/jquery/dom/dom.js b/resources/static/jquery/dom/dom.js similarity index 100% rename from browserid/static/jquery/dom/dom.js rename to resources/static/jquery/dom/dom.js diff --git a/browserid/static/jquery/dom/fixture/fixture.html b/resources/static/jquery/dom/fixture/fixture.html similarity index 100% rename from browserid/static/jquery/dom/fixture/fixture.html rename to resources/static/jquery/dom/fixture/fixture.html diff --git a/browserid/static/jquery/dom/fixture/fixture.js b/resources/static/jquery/dom/fixture/fixture.js similarity index 100% rename from browserid/static/jquery/dom/fixture/fixture.js rename to resources/static/jquery/dom/fixture/fixture.js diff --git a/browserid/static/jquery/dom/fixture/fixture_test.js b/resources/static/jquery/dom/fixture/fixture_test.js similarity index 100% rename from browserid/static/jquery/dom/fixture/fixture_test.js rename to resources/static/jquery/dom/fixture/fixture_test.js diff --git a/browserid/static/jquery/dom/fixture/fixtures/foo.json b/resources/static/jquery/dom/fixture/fixtures/foo.json similarity index 100% rename from browserid/static/jquery/dom/fixture/fixtures/foo.json rename to resources/static/jquery/dom/fixture/fixtures/foo.json diff --git a/browserid/static/jquery/dom/fixture/fixtures/foobar.json b/resources/static/jquery/dom/fixture/fixtures/foobar.json similarity index 100% rename from browserid/static/jquery/dom/fixture/fixtures/foobar.json rename to resources/static/jquery/dom/fixture/fixtures/foobar.json diff --git a/browserid/static/jquery/dom/fixture/fixtures/messages.html b/resources/static/jquery/dom/fixture/fixtures/messages.html similarity index 100% rename from browserid/static/jquery/dom/fixture/fixtures/messages.html rename to resources/static/jquery/dom/fixture/fixtures/messages.html diff --git a/browserid/static/jquery/dom/fixture/fixtures/test.json b/resources/static/jquery/dom/fixture/fixtures/test.json similarity index 100% rename from browserid/static/jquery/dom/fixture/fixtures/test.json rename to resources/static/jquery/dom/fixture/fixtures/test.json diff --git a/browserid/static/jquery/dom/fixture/qunit.html b/resources/static/jquery/dom/fixture/qunit.html similarity index 100% rename from browserid/static/jquery/dom/fixture/qunit.html rename to resources/static/jquery/dom/fixture/qunit.html diff --git a/browserid/static/jquery/dom/form_params/form_params.html b/resources/static/jquery/dom/form_params/form_params.html similarity index 100% rename from browserid/static/jquery/dom/form_params/form_params.html rename to resources/static/jquery/dom/form_params/form_params.html diff --git a/browserid/static/jquery/dom/form_params/form_params.js b/resources/static/jquery/dom/form_params/form_params.js similarity index 100% rename from browserid/static/jquery/dom/form_params/form_params.js rename to resources/static/jquery/dom/form_params/form_params.js diff --git a/browserid/static/jquery/dom/form_params/qunit.html b/resources/static/jquery/dom/form_params/qunit.html similarity index 100% rename from browserid/static/jquery/dom/form_params/qunit.html rename to resources/static/jquery/dom/form_params/qunit.html diff --git a/browserid/static/jquery/dom/form_params/test/qunit/basics.micro b/resources/static/jquery/dom/form_params/test/qunit/basics.micro similarity index 100% rename from browserid/static/jquery/dom/form_params/test/qunit/basics.micro rename to resources/static/jquery/dom/form_params/test/qunit/basics.micro diff --git a/browserid/static/jquery/dom/form_params/test/qunit/checkbox.micro b/resources/static/jquery/dom/form_params/test/qunit/checkbox.micro similarity index 100% rename from browserid/static/jquery/dom/form_params/test/qunit/checkbox.micro rename to resources/static/jquery/dom/form_params/test/qunit/checkbox.micro diff --git a/browserid/static/jquery/dom/form_params/test/qunit/form_params_test.js b/resources/static/jquery/dom/form_params/test/qunit/form_params_test.js similarity index 100% rename from browserid/static/jquery/dom/form_params/test/qunit/form_params_test.js rename to resources/static/jquery/dom/form_params/test/qunit/form_params_test.js diff --git a/browserid/static/jquery/dom/form_params/test/qunit/qunit.js b/resources/static/jquery/dom/form_params/test/qunit/qunit.js similarity index 100% rename from browserid/static/jquery/dom/form_params/test/qunit/qunit.js rename to resources/static/jquery/dom/form_params/test/qunit/qunit.js diff --git a/browserid/static/jquery/dom/form_params/test/qunit/truthy.micro b/resources/static/jquery/dom/form_params/test/qunit/truthy.micro similarity index 100% rename from browserid/static/jquery/dom/form_params/test/qunit/truthy.micro rename to resources/static/jquery/dom/form_params/test/qunit/truthy.micro diff --git a/browserid/static/jquery/dom/range/qunit.html b/resources/static/jquery/dom/range/qunit.html similarity index 100% rename from browserid/static/jquery/dom/range/qunit.html rename to resources/static/jquery/dom/range/qunit.html diff --git a/browserid/static/jquery/dom/range/range.html b/resources/static/jquery/dom/range/range.html similarity index 100% rename from browserid/static/jquery/dom/range/range.html rename to resources/static/jquery/dom/range/range.html diff --git a/browserid/static/jquery/dom/range/range.js b/resources/static/jquery/dom/range/range.js similarity index 100% rename from browserid/static/jquery/dom/range/range.js rename to resources/static/jquery/dom/range/range.js diff --git a/browserid/static/jquery/dom/range/range_test.js b/resources/static/jquery/dom/range/range_test.js similarity index 100% rename from browserid/static/jquery/dom/range/range_test.js rename to resources/static/jquery/dom/range/range_test.js diff --git a/browserid/static/jquery/dom/selection/qunit.html b/resources/static/jquery/dom/selection/qunit.html similarity index 100% rename from browserid/static/jquery/dom/selection/qunit.html rename to resources/static/jquery/dom/selection/qunit.html diff --git a/browserid/static/jquery/dom/selection/selection.html b/resources/static/jquery/dom/selection/selection.html similarity index 100% rename from browserid/static/jquery/dom/selection/selection.html rename to resources/static/jquery/dom/selection/selection.html diff --git a/browserid/static/jquery/dom/selection/selection.js b/resources/static/jquery/dom/selection/selection.js similarity index 100% rename from browserid/static/jquery/dom/selection/selection.js rename to resources/static/jquery/dom/selection/selection.js diff --git a/browserid/static/jquery/dom/selection/selection_test.js b/resources/static/jquery/dom/selection/selection_test.js similarity index 100% rename from browserid/static/jquery/dom/selection/selection_test.js rename to resources/static/jquery/dom/selection/selection_test.js diff --git a/browserid/static/jquery/dom/within/within.js b/resources/static/jquery/dom/within/within.js similarity index 100% rename from browserid/static/jquery/dom/within/within.js rename to resources/static/jquery/dom/within/within.js diff --git a/browserid/static/jquery/download/btn.png b/resources/static/jquery/download/btn.png similarity index 100% rename from browserid/static/jquery/download/btn.png rename to resources/static/jquery/download/btn.png diff --git a/browserid/static/jquery/download/dependencies.json b/resources/static/jquery/download/dependencies.json similarity index 100% rename from browserid/static/jquery/download/dependencies.json rename to resources/static/jquery/download/dependencies.json diff --git a/browserid/static/jquery/download/download.css b/resources/static/jquery/download/download.css similarity index 100% rename from browserid/static/jquery/download/download.css rename to resources/static/jquery/download/download.css diff --git a/browserid/static/jquery/download/download.html b/resources/static/jquery/download/download.html similarity index 100% rename from browserid/static/jquery/download/download.html rename to resources/static/jquery/download/download.html diff --git a/browserid/static/jquery/download/download.js b/resources/static/jquery/download/download.js similarity index 100% rename from browserid/static/jquery/download/download.js rename to resources/static/jquery/download/download.js diff --git a/browserid/static/jquery/download/test/controllerpage.html b/resources/static/jquery/download/test/controllerpage.html similarity index 100% rename from browserid/static/jquery/download/test/controllerpage.html rename to resources/static/jquery/download/test/controllerpage.html diff --git a/browserid/static/jquery/download/test/jquery-1.4.3.js b/resources/static/jquery/download/test/jquery-1.4.3.js similarity index 100% rename from browserid/static/jquery/download/test/jquery-1.4.3.js rename to resources/static/jquery/download/test/jquery-1.4.3.js diff --git a/browserid/static/jquery/download/test/run.js b/resources/static/jquery/download/test/run.js similarity index 100% rename from browserid/static/jquery/download/test/run.js rename to resources/static/jquery/download/test/run.js diff --git a/browserid/static/jquery/event/default/default.html b/resources/static/jquery/event/default/default.html similarity index 100% rename from browserid/static/jquery/event/default/default.html rename to resources/static/jquery/event/default/default.html diff --git a/browserid/static/jquery/event/default/default.js b/resources/static/jquery/event/default/default.js similarity index 100% rename from browserid/static/jquery/event/default/default.js rename to resources/static/jquery/event/default/default.js diff --git a/browserid/static/jquery/event/default/default_pause_test.html b/resources/static/jquery/event/default/default_pause_test.html similarity index 100% rename from browserid/static/jquery/event/default/default_pause_test.html rename to resources/static/jquery/event/default/default_pause_test.html diff --git a/browserid/static/jquery/event/default/default_pause_test.js b/resources/static/jquery/event/default/default_pause_test.js similarity index 100% rename from browserid/static/jquery/event/default/default_pause_test.js rename to resources/static/jquery/event/default/default_pause_test.js diff --git a/browserid/static/jquery/event/default/default_test.js b/resources/static/jquery/event/default/default_test.js similarity index 100% rename from browserid/static/jquery/event/default/default_test.js rename to resources/static/jquery/event/default/default_test.js diff --git a/browserid/static/jquery/event/default/defaultjquery.html b/resources/static/jquery/event/default/defaultjquery.html similarity index 100% rename from browserid/static/jquery/event/default/defaultjquery.html rename to resources/static/jquery/event/default/defaultjquery.html diff --git a/browserid/static/jquery/event/default/qunit.html b/resources/static/jquery/event/default/qunit.html similarity index 100% rename from browserid/static/jquery/event/default/qunit.html rename to resources/static/jquery/event/default/qunit.html diff --git a/browserid/static/jquery/event/destroyed/destroyed.html b/resources/static/jquery/event/destroyed/destroyed.html similarity index 100% rename from browserid/static/jquery/event/destroyed/destroyed.html rename to resources/static/jquery/event/destroyed/destroyed.html diff --git a/browserid/static/jquery/event/destroyed/destroyed.js b/resources/static/jquery/event/destroyed/destroyed.js similarity index 100% rename from browserid/static/jquery/event/destroyed/destroyed.js rename to resources/static/jquery/event/destroyed/destroyed.js diff --git a/browserid/static/jquery/event/destroyed/destroyed_menu.html b/resources/static/jquery/event/destroyed/destroyed_menu.html similarity index 100% rename from browserid/static/jquery/event/destroyed/destroyed_menu.html rename to resources/static/jquery/event/destroyed/destroyed_menu.html diff --git a/browserid/static/jquery/event/destroyed/qunit.html b/resources/static/jquery/event/destroyed/qunit.html similarity index 100% rename from browserid/static/jquery/event/destroyed/qunit.html rename to resources/static/jquery/event/destroyed/qunit.html diff --git a/browserid/static/jquery/event/destroyed/test/qunit/destroyed_test.js b/resources/static/jquery/event/destroyed/test/qunit/destroyed_test.js similarity index 100% rename from browserid/static/jquery/event/destroyed/test/qunit/destroyed_test.js rename to resources/static/jquery/event/destroyed/test/qunit/destroyed_test.js diff --git a/browserid/static/jquery/event/destroyed/test/qunit/qunit.js b/resources/static/jquery/event/destroyed/test/qunit/qunit.js similarity index 100% rename from browserid/static/jquery/event/destroyed/test/qunit/qunit.js rename to resources/static/jquery/event/destroyed/test/qunit/qunit.js diff --git a/browserid/static/jquery/event/drag/drag.html b/resources/static/jquery/event/drag/drag.html similarity index 100% rename from browserid/static/jquery/event/drag/drag.html rename to resources/static/jquery/event/drag/drag.html diff --git a/browserid/static/jquery/event/drag/drag.js b/resources/static/jquery/event/drag/drag.js similarity index 100% rename from browserid/static/jquery/event/drag/drag.js rename to resources/static/jquery/event/drag/drag.js diff --git a/browserid/static/jquery/event/drag/drag_test.js b/resources/static/jquery/event/drag/drag_test.js similarity index 100% rename from browserid/static/jquery/event/drag/drag_test.js rename to resources/static/jquery/event/drag/drag_test.js diff --git a/browserid/static/jquery/event/drag/limit/limit.html b/resources/static/jquery/event/drag/limit/limit.html similarity index 100% rename from browserid/static/jquery/event/drag/limit/limit.html rename to resources/static/jquery/event/drag/limit/limit.html diff --git a/browserid/static/jquery/event/drag/limit/limit.js b/resources/static/jquery/event/drag/limit/limit.js similarity index 100% rename from browserid/static/jquery/event/drag/limit/limit.js rename to resources/static/jquery/event/drag/limit/limit.js diff --git a/browserid/static/jquery/event/drag/qunit.html b/resources/static/jquery/event/drag/qunit.html similarity index 100% rename from browserid/static/jquery/event/drag/qunit.html rename to resources/static/jquery/event/drag/qunit.html diff --git a/browserid/static/jquery/event/drag/scroll/scroll.js b/resources/static/jquery/event/drag/scroll/scroll.js similarity index 100% rename from browserid/static/jquery/event/drag/scroll/scroll.js rename to resources/static/jquery/event/drag/scroll/scroll.js diff --git a/browserid/static/jquery/event/drag/step/step.html b/resources/static/jquery/event/drag/step/step.html similarity index 100% rename from browserid/static/jquery/event/drag/step/step.html rename to resources/static/jquery/event/drag/step/step.html diff --git a/browserid/static/jquery/event/drag/step/step.js b/resources/static/jquery/event/drag/step/step.js similarity index 100% rename from browserid/static/jquery/event/drag/step/step.js rename to resources/static/jquery/event/drag/step/step.js diff --git a/browserid/static/jquery/event/drop/drop.html b/resources/static/jquery/event/drop/drop.html similarity index 100% rename from browserid/static/jquery/event/drop/drop.html rename to resources/static/jquery/event/drop/drop.html diff --git a/browserid/static/jquery/event/drop/drop.js b/resources/static/jquery/event/drop/drop.js similarity index 100% rename from browserid/static/jquery/event/drop/drop.js rename to resources/static/jquery/event/drop/drop.js diff --git a/browserid/static/jquery/event/drop/drop_test.js b/resources/static/jquery/event/drop/drop_test.js similarity index 100% rename from browserid/static/jquery/event/drop/drop_test.js rename to resources/static/jquery/event/drop/drop_test.js diff --git a/browserid/static/jquery/event/event.js b/resources/static/jquery/event/event.js similarity index 100% rename from browserid/static/jquery/event/event.js rename to resources/static/jquery/event/event.js diff --git a/browserid/static/jquery/event/handle/handle.js b/resources/static/jquery/event/handle/handle.js similarity index 100% rename from browserid/static/jquery/event/handle/handle.js rename to resources/static/jquery/event/handle/handle.js diff --git a/browserid/static/jquery/event/hashchange/hashchange.js b/resources/static/jquery/event/hashchange/hashchange.js similarity index 100% rename from browserid/static/jquery/event/hashchange/hashchange.js rename to resources/static/jquery/event/hashchange/hashchange.js diff --git a/browserid/static/jquery/event/hover/hover.html b/resources/static/jquery/event/hover/hover.html similarity index 100% rename from browserid/static/jquery/event/hover/hover.html rename to resources/static/jquery/event/hover/hover.html diff --git a/browserid/static/jquery/event/hover/hover.js b/resources/static/jquery/event/hover/hover.js similarity index 100% rename from browserid/static/jquery/event/hover/hover.js rename to resources/static/jquery/event/hover/hover.js diff --git a/browserid/static/jquery/event/hover/qunit.html b/resources/static/jquery/event/hover/qunit.html similarity index 100% rename from browserid/static/jquery/event/hover/qunit.html rename to resources/static/jquery/event/hover/qunit.html diff --git a/browserid/static/jquery/event/hover/test/qunit/hover_test.js b/resources/static/jquery/event/hover/test/qunit/hover_test.js similarity index 100% rename from browserid/static/jquery/event/hover/test/qunit/hover_test.js rename to resources/static/jquery/event/hover/test/qunit/hover_test.js diff --git a/browserid/static/jquery/event/hover/test/qunit/qunit.js b/resources/static/jquery/event/hover/test/qunit/qunit.js similarity index 100% rename from browserid/static/jquery/event/hover/test/qunit/qunit.js rename to resources/static/jquery/event/hover/test/qunit/qunit.js diff --git a/browserid/static/jquery/event/key/key.html b/resources/static/jquery/event/key/key.html similarity index 100% rename from browserid/static/jquery/event/key/key.html rename to resources/static/jquery/event/key/key.html diff --git a/browserid/static/jquery/event/key/key.js b/resources/static/jquery/event/key/key.js similarity index 100% rename from browserid/static/jquery/event/key/key.js rename to resources/static/jquery/event/key/key.js diff --git a/browserid/static/jquery/event/key/key_test.js b/resources/static/jquery/event/key/key_test.js similarity index 100% rename from browserid/static/jquery/event/key/key_test.js rename to resources/static/jquery/event/key/key_test.js diff --git a/browserid/static/jquery/event/key/qunit.html b/resources/static/jquery/event/key/qunit.html similarity index 100% rename from browserid/static/jquery/event/key/qunit.html rename to resources/static/jquery/event/key/qunit.html diff --git a/browserid/static/jquery/event/livehack/livehack.js b/resources/static/jquery/event/livehack/livehack.js similarity index 100% rename from browserid/static/jquery/event/livehack/livehack.js rename to resources/static/jquery/event/livehack/livehack.js diff --git a/browserid/static/jquery/event/pause/pause.html b/resources/static/jquery/event/pause/pause.html similarity index 100% rename from browserid/static/jquery/event/pause/pause.html rename to resources/static/jquery/event/pause/pause.html diff --git a/browserid/static/jquery/event/pause/pause.js b/resources/static/jquery/event/pause/pause.js similarity index 100% rename from browserid/static/jquery/event/pause/pause.js rename to resources/static/jquery/event/pause/pause.js diff --git a/browserid/static/jquery/event/pause/pause_test.js b/resources/static/jquery/event/pause/pause_test.js similarity index 100% rename from browserid/static/jquery/event/pause/pause_test.js rename to resources/static/jquery/event/pause/pause_test.js diff --git a/browserid/static/jquery/event/pause/qunit.html b/resources/static/jquery/event/pause/qunit.html similarity index 100% rename from browserid/static/jquery/event/pause/qunit.html rename to resources/static/jquery/event/pause/qunit.html diff --git a/browserid/static/jquery/event/resize/demo.html b/resources/static/jquery/event/resize/demo.html similarity index 100% rename from browserid/static/jquery/event/resize/demo.html rename to resources/static/jquery/event/resize/demo.html diff --git a/browserid/static/jquery/event/resize/qunit.html b/resources/static/jquery/event/resize/qunit.html similarity index 100% rename from browserid/static/jquery/event/resize/qunit.html rename to resources/static/jquery/event/resize/qunit.html diff --git a/browserid/static/jquery/event/resize/resize.html b/resources/static/jquery/event/resize/resize.html similarity index 100% rename from browserid/static/jquery/event/resize/resize.html rename to resources/static/jquery/event/resize/resize.html diff --git a/browserid/static/jquery/event/resize/resize.js b/resources/static/jquery/event/resize/resize.js similarity index 100% rename from browserid/static/jquery/event/resize/resize.js rename to resources/static/jquery/event/resize/resize.js diff --git a/browserid/static/jquery/event/resize/resize_test.js b/resources/static/jquery/event/resize/resize_test.js similarity index 100% rename from browserid/static/jquery/event/resize/resize_test.js rename to resources/static/jquery/event/resize/resize_test.js diff --git a/browserid/static/jquery/event/selection/qunit.html b/resources/static/jquery/event/selection/qunit.html similarity index 100% rename from browserid/static/jquery/event/selection/qunit.html rename to resources/static/jquery/event/selection/qunit.html diff --git a/browserid/static/jquery/event/selection/selection.html b/resources/static/jquery/event/selection/selection.html similarity index 100% rename from browserid/static/jquery/event/selection/selection.html rename to resources/static/jquery/event/selection/selection.html diff --git a/browserid/static/jquery/event/selection/selection.js b/resources/static/jquery/event/selection/selection.js similarity index 100% rename from browserid/static/jquery/event/selection/selection.js rename to resources/static/jquery/event/selection/selection.js diff --git a/browserid/static/jquery/event/selection/selection_test.js b/resources/static/jquery/event/selection/selection_test.js similarity index 100% rename from browserid/static/jquery/event/selection/selection_test.js rename to resources/static/jquery/event/selection/selection_test.js diff --git a/browserid/static/jquery/event/swipe/qunit.html b/resources/static/jquery/event/swipe/qunit.html similarity index 100% rename from browserid/static/jquery/event/swipe/qunit.html rename to resources/static/jquery/event/swipe/qunit.html diff --git a/browserid/static/jquery/event/swipe/swipe.html b/resources/static/jquery/event/swipe/swipe.html similarity index 100% rename from browserid/static/jquery/event/swipe/swipe.html rename to resources/static/jquery/event/swipe/swipe.html diff --git a/browserid/static/jquery/event/swipe/swipe.js b/resources/static/jquery/event/swipe/swipe.js similarity index 100% rename from browserid/static/jquery/event/swipe/swipe.js rename to resources/static/jquery/event/swipe/swipe.js diff --git a/browserid/static/jquery/event/swipe/swipe_test.js b/resources/static/jquery/event/swipe/swipe_test.js similarity index 100% rename from browserid/static/jquery/event/swipe/swipe_test.js rename to resources/static/jquery/event/swipe/swipe_test.js diff --git a/browserid/static/jquery/generate/app b/resources/static/jquery/generate/app similarity index 100% rename from browserid/static/jquery/generate/app rename to resources/static/jquery/generate/app diff --git a/browserid/static/jquery/generate/controller b/resources/static/jquery/generate/controller similarity index 100% rename from browserid/static/jquery/generate/controller rename to resources/static/jquery/generate/controller diff --git a/browserid/static/jquery/generate/funcunit b/resources/static/jquery/generate/funcunit similarity index 100% rename from browserid/static/jquery/generate/funcunit rename to resources/static/jquery/generate/funcunit diff --git a/browserid/static/jquery/generate/model b/resources/static/jquery/generate/model similarity index 100% rename from browserid/static/jquery/generate/model rename to resources/static/jquery/generate/model diff --git a/browserid/static/jquery/generate/page b/resources/static/jquery/generate/page similarity index 100% rename from browserid/static/jquery/generate/page rename to resources/static/jquery/generate/page diff --git a/browserid/static/jquery/generate/plugin b/resources/static/jquery/generate/plugin similarity index 100% rename from browserid/static/jquery/generate/plugin rename to resources/static/jquery/generate/plugin diff --git a/browserid/static/jquery/generate/scaffold b/resources/static/jquery/generate/scaffold similarity index 100% rename from browserid/static/jquery/generate/scaffold rename to resources/static/jquery/generate/scaffold diff --git a/browserid/static/jquery/generate/templates/app/(application_name).css.ejs b/resources/static/jquery/generate/templates/app/(application_name).css.ejs similarity index 100% rename from browserid/static/jquery/generate/templates/app/(application_name).css.ejs rename to resources/static/jquery/generate/templates/app/(application_name).css.ejs diff --git a/browserid/static/jquery/generate/templates/app/(application_name).html.ejs b/resources/static/jquery/generate/templates/app/(application_name).html.ejs similarity index 100% rename from browserid/static/jquery/generate/templates/app/(application_name).html.ejs rename to resources/static/jquery/generate/templates/app/(application_name).html.ejs diff --git a/browserid/static/jquery/generate/templates/app/(application_name).js.ejs b/resources/static/jquery/generate/templates/app/(application_name).js.ejs similarity index 100% rename from browserid/static/jquery/generate/templates/app/(application_name).js.ejs rename to resources/static/jquery/generate/templates/app/(application_name).js.ejs diff --git a/browserid/static/jquery/generate/templates/app/controllers/.ignore b/resources/static/jquery/generate/templates/app/controllers/.ignore similarity index 100% rename from browserid/static/jquery/generate/templates/app/controllers/.ignore rename to resources/static/jquery/generate/templates/app/controllers/.ignore diff --git a/browserid/static/jquery/generate/templates/app/docs/.ignore b/resources/static/jquery/generate/templates/app/docs/.ignore similarity index 100% rename from browserid/static/jquery/generate/templates/app/docs/.ignore rename to resources/static/jquery/generate/templates/app/docs/.ignore diff --git a/browserid/static/jquery/generate/templates/app/fixtures/.ignore b/resources/static/jquery/generate/templates/app/fixtures/.ignore similarity index 100% rename from browserid/static/jquery/generate/templates/app/fixtures/.ignore rename to resources/static/jquery/generate/templates/app/fixtures/.ignore diff --git a/browserid/static/jquery/generate/templates/app/funcunit.html.ejs b/resources/static/jquery/generate/templates/app/funcunit.html.ejs similarity index 100% rename from browserid/static/jquery/generate/templates/app/funcunit.html.ejs rename to resources/static/jquery/generate/templates/app/funcunit.html.ejs diff --git a/browserid/static/jquery/generate/templates/app/models/.ignore b/resources/static/jquery/generate/templates/app/models/.ignore similarity index 100% rename from browserid/static/jquery/generate/templates/app/models/.ignore rename to resources/static/jquery/generate/templates/app/models/.ignore diff --git a/browserid/static/jquery/generate/templates/app/qunit.html.ejs b/resources/static/jquery/generate/templates/app/qunit.html.ejs similarity index 100% rename from browserid/static/jquery/generate/templates/app/qunit.html.ejs rename to resources/static/jquery/generate/templates/app/qunit.html.ejs diff --git a/browserid/static/jquery/generate/templates/app/resources/.ignore b/resources/static/jquery/generate/templates/app/resources/.ignore similarity index 100% rename from browserid/static/jquery/generate/templates/app/resources/.ignore rename to resources/static/jquery/generate/templates/app/resources/.ignore diff --git a/browserid/static/jquery/generate/templates/app/scripts/build.html.ejs b/resources/static/jquery/generate/templates/app/scripts/build.html.ejs similarity index 100% rename from browserid/static/jquery/generate/templates/app/scripts/build.html.ejs rename to resources/static/jquery/generate/templates/app/scripts/build.html.ejs diff --git a/browserid/static/jquery/generate/templates/app/scripts/build.js.ejs b/resources/static/jquery/generate/templates/app/scripts/build.js.ejs similarity index 100% rename from browserid/static/jquery/generate/templates/app/scripts/build.js.ejs rename to resources/static/jquery/generate/templates/app/scripts/build.js.ejs diff --git a/browserid/static/jquery/generate/templates/app/scripts/clean.js.ejs b/resources/static/jquery/generate/templates/app/scripts/clean.js.ejs similarity index 100% rename from browserid/static/jquery/generate/templates/app/scripts/clean.js.ejs rename to resources/static/jquery/generate/templates/app/scripts/clean.js.ejs diff --git a/browserid/static/jquery/generate/templates/app/scripts/docs.js.ejs b/resources/static/jquery/generate/templates/app/scripts/docs.js.ejs similarity index 100% rename from browserid/static/jquery/generate/templates/app/scripts/docs.js.ejs rename to resources/static/jquery/generate/templates/app/scripts/docs.js.ejs diff --git a/browserid/static/jquery/generate/templates/app/test/funcunit/(application_name)_test.js.ejs b/resources/static/jquery/generate/templates/app/test/funcunit/(application_name)_test.js.ejs similarity index 100% rename from browserid/static/jquery/generate/templates/app/test/funcunit/(application_name)_test.js.ejs rename to resources/static/jquery/generate/templates/app/test/funcunit/(application_name)_test.js.ejs diff --git a/browserid/static/jquery/generate/templates/app/test/funcunit/funcunit.js.ejs b/resources/static/jquery/generate/templates/app/test/funcunit/funcunit.js.ejs similarity index 100% rename from browserid/static/jquery/generate/templates/app/test/funcunit/funcunit.js.ejs rename to resources/static/jquery/generate/templates/app/test/funcunit/funcunit.js.ejs diff --git a/browserid/static/jquery/generate/templates/app/test/qunit/(application_name)_test.js.ejs b/resources/static/jquery/generate/templates/app/test/qunit/(application_name)_test.js.ejs similarity index 100% rename from browserid/static/jquery/generate/templates/app/test/qunit/(application_name)_test.js.ejs rename to resources/static/jquery/generate/templates/app/test/qunit/(application_name)_test.js.ejs diff --git a/browserid/static/jquery/generate/templates/app/test/qunit/qunit.js.ejs b/resources/static/jquery/generate/templates/app/test/qunit/qunit.js.ejs similarity index 100% rename from browserid/static/jquery/generate/templates/app/test/qunit/qunit.js.ejs rename to resources/static/jquery/generate/templates/app/test/qunit/qunit.js.ejs diff --git a/browserid/static/jquery/generate/templates/app/views/.ignore b/resources/static/jquery/generate/templates/app/views/.ignore similarity index 100% rename from browserid/static/jquery/generate/templates/app/views/.ignore rename to resources/static/jquery/generate/templates/app/views/.ignore diff --git a/browserid/static/jquery/generate/templates/controller/(underscore).html.ejs b/resources/static/jquery/generate/templates/controller/(underscore).html.ejs similarity index 100% rename from browserid/static/jquery/generate/templates/controller/(underscore).html.ejs rename to resources/static/jquery/generate/templates/controller/(underscore).html.ejs diff --git a/browserid/static/jquery/generate/templates/controller/(underscore).js.ejs b/resources/static/jquery/generate/templates/controller/(underscore).js.ejs similarity index 100% rename from browserid/static/jquery/generate/templates/controller/(underscore).js.ejs rename to resources/static/jquery/generate/templates/controller/(underscore).js.ejs diff --git a/browserid/static/jquery/generate/templates/controller/(underscore)_test.js.ejs b/resources/static/jquery/generate/templates/controller/(underscore)_test.js.ejs similarity index 100% rename from browserid/static/jquery/generate/templates/controller/(underscore)_test.js.ejs rename to resources/static/jquery/generate/templates/controller/(underscore)_test.js.ejs diff --git a/browserid/static/jquery/generate/templates/controller/funcunit.html.ejs b/resources/static/jquery/generate/templates/controller/funcunit.html.ejs similarity index 100% rename from browserid/static/jquery/generate/templates/controller/funcunit.html.ejs rename to resources/static/jquery/generate/templates/controller/funcunit.html.ejs diff --git a/browserid/static/jquery/generate/templates/controller/views/.ignore b/resources/static/jquery/generate/templates/controller/views/.ignore similarity index 100% rename from browserid/static/jquery/generate/templates/controller/views/.ignore rename to resources/static/jquery/generate/templates/controller/views/.ignore diff --git a/browserid/static/jquery/generate/templates/model/fixtures.link b/resources/static/jquery/generate/templates/model/fixtures.link similarity index 100% rename from browserid/static/jquery/generate/templates/model/fixtures.link rename to resources/static/jquery/generate/templates/model/fixtures.link diff --git a/browserid/static/jquery/generate/templates/model/models.link b/resources/static/jquery/generate/templates/model/models.link similarity index 100% rename from browserid/static/jquery/generate/templates/model/models.link rename to resources/static/jquery/generate/templates/model/models.link diff --git a/browserid/static/jquery/generate/templates/model/test/qunit.link b/resources/static/jquery/generate/templates/model/test/qunit.link similarity index 100% rename from browserid/static/jquery/generate/templates/model/test/qunit.link rename to resources/static/jquery/generate/templates/model/test/qunit.link diff --git a/browserid/static/jquery/generate/templates/page.ejs b/resources/static/jquery/generate/templates/page.ejs similarity index 100% rename from browserid/static/jquery/generate/templates/page.ejs rename to resources/static/jquery/generate/templates/page.ejs diff --git a/browserid/static/jquery/generate/templates/plugin/(application_name).html.ejs b/resources/static/jquery/generate/templates/plugin/(application_name).html.ejs similarity index 100% rename from browserid/static/jquery/generate/templates/plugin/(application_name).html.ejs rename to resources/static/jquery/generate/templates/plugin/(application_name).html.ejs diff --git a/browserid/static/jquery/generate/templates/plugin/(application_name).js.ejs b/resources/static/jquery/generate/templates/plugin/(application_name).js.ejs similarity index 100% rename from browserid/static/jquery/generate/templates/plugin/(application_name).js.ejs rename to resources/static/jquery/generate/templates/plugin/(application_name).js.ejs diff --git a/browserid/static/jquery/generate/templates/plugin/docs/.gitignore b/resources/static/jquery/generate/templates/plugin/docs/.gitignore similarity index 100% rename from browserid/static/jquery/generate/templates/plugin/docs/.gitignore rename to resources/static/jquery/generate/templates/plugin/docs/.gitignore diff --git a/browserid/static/jquery/generate/templates/plugin/fixtures/.ignore b/resources/static/jquery/generate/templates/plugin/fixtures/.ignore similarity index 100% rename from browserid/static/jquery/generate/templates/plugin/fixtures/.ignore rename to resources/static/jquery/generate/templates/plugin/fixtures/.ignore diff --git a/browserid/static/jquery/generate/templates/plugin/funcunit.html.ejs b/resources/static/jquery/generate/templates/plugin/funcunit.html.ejs similarity index 100% rename from browserid/static/jquery/generate/templates/plugin/funcunit.html.ejs rename to resources/static/jquery/generate/templates/plugin/funcunit.html.ejs diff --git a/browserid/static/jquery/generate/templates/plugin/qunit.html.ejs b/resources/static/jquery/generate/templates/plugin/qunit.html.ejs similarity index 100% rename from browserid/static/jquery/generate/templates/plugin/qunit.html.ejs rename to resources/static/jquery/generate/templates/plugin/qunit.html.ejs diff --git a/browserid/static/jquery/generate/templates/plugin/resources/.ignore b/resources/static/jquery/generate/templates/plugin/resources/.ignore similarity index 100% rename from browserid/static/jquery/generate/templates/plugin/resources/.ignore rename to resources/static/jquery/generate/templates/plugin/resources/.ignore diff --git a/browserid/static/jquery/generate/templates/plugin/scripts.link b/resources/static/jquery/generate/templates/plugin/scripts.link similarity index 100% rename from browserid/static/jquery/generate/templates/plugin/scripts.link rename to resources/static/jquery/generate/templates/plugin/scripts.link diff --git a/browserid/static/jquery/generate/templates/plugin/test.link b/resources/static/jquery/generate/templates/plugin/test.link similarity index 100% rename from browserid/static/jquery/generate/templates/plugin/test.link rename to resources/static/jquery/generate/templates/plugin/test.link diff --git a/browserid/static/jquery/generate/templates/plugin/views/.ignore b/resources/static/jquery/generate/templates/plugin/views/.ignore similarity index 100% rename from browserid/static/jquery/generate/templates/plugin/views/.ignore rename to resources/static/jquery/generate/templates/plugin/views/.ignore diff --git a/browserid/static/jquery/generate/templates/scaffold/controllers/(underscore)_controller.js.ejs b/resources/static/jquery/generate/templates/scaffold/controllers/(underscore)_controller.js.ejs similarity index 100% rename from browserid/static/jquery/generate/templates/scaffold/controllers/(underscore)_controller.js.ejs rename to resources/static/jquery/generate/templates/scaffold/controllers/(underscore)_controller.js.ejs diff --git a/browserid/static/jquery/generate/templates/scaffold/fixtures/(plural).json.get.ejs b/resources/static/jquery/generate/templates/scaffold/fixtures/(plural).json.get.ejs similarity index 100% rename from browserid/static/jquery/generate/templates/scaffold/fixtures/(plural).json.get.ejs rename to resources/static/jquery/generate/templates/scaffold/fixtures/(plural).json.get.ejs diff --git a/browserid/static/jquery/generate/templates/scaffold/models/(underscore).js.ejs b/resources/static/jquery/generate/templates/scaffold/models/(underscore).js.ejs similarity index 100% rename from browserid/static/jquery/generate/templates/scaffold/models/(underscore).js.ejs rename to resources/static/jquery/generate/templates/scaffold/models/(underscore).js.ejs diff --git a/browserid/static/jquery/generate/templates/scaffold/test/funcunit/(underscore)_controller_test.js.ejs b/resources/static/jquery/generate/templates/scaffold/test/funcunit/(underscore)_controller_test.js.ejs similarity index 100% rename from browserid/static/jquery/generate/templates/scaffold/test/funcunit/(underscore)_controller_test.js.ejs rename to resources/static/jquery/generate/templates/scaffold/test/funcunit/(underscore)_controller_test.js.ejs diff --git a/browserid/static/jquery/generate/templates/scaffold/test/qunit/(underscore)_test.js.ejs b/resources/static/jquery/generate/templates/scaffold/test/qunit/(underscore)_test.js.ejs similarity index 100% rename from browserid/static/jquery/generate/templates/scaffold/test/qunit/(underscore)_test.js.ejs rename to resources/static/jquery/generate/templates/scaffold/test/qunit/(underscore)_test.js.ejs diff --git a/browserid/static/jquery/generate/templates/scaffold/views/(underscore)/edit.ejs.ejs b/resources/static/jquery/generate/templates/scaffold/views/(underscore)/edit.ejs.ejs similarity index 100% rename from browserid/static/jquery/generate/templates/scaffold/views/(underscore)/edit.ejs.ejs rename to resources/static/jquery/generate/templates/scaffold/views/(underscore)/edit.ejs.ejs diff --git a/browserid/static/jquery/generate/templates/scaffold/views/(underscore)/init.ejs.ejs b/resources/static/jquery/generate/templates/scaffold/views/(underscore)/init.ejs.ejs similarity index 100% rename from browserid/static/jquery/generate/templates/scaffold/views/(underscore)/init.ejs.ejs rename to resources/static/jquery/generate/templates/scaffold/views/(underscore)/init.ejs.ejs diff --git a/browserid/static/jquery/generate/templates/scaffold/views/(underscore)/list.ejs.ejs b/resources/static/jquery/generate/templates/scaffold/views/(underscore)/list.ejs.ejs similarity index 100% rename from browserid/static/jquery/generate/templates/scaffold/views/(underscore)/list.ejs.ejs rename to resources/static/jquery/generate/templates/scaffold/views/(underscore)/list.ejs.ejs diff --git a/browserid/static/jquery/generate/templates/scaffold/views/(underscore)/show.ejs.ejs b/resources/static/jquery/generate/templates/scaffold/views/(underscore)/show.ejs.ejs similarity index 100% rename from browserid/static/jquery/generate/templates/scaffold/views/(underscore)/show.ejs.ejs rename to resources/static/jquery/generate/templates/scaffold/views/(underscore)/show.ejs.ejs diff --git a/browserid/static/jquery/generate/test/app_plugin_model_controller.js b/resources/static/jquery/generate/test/app_plugin_model_controller.js similarity index 100% rename from browserid/static/jquery/generate/test/app_plugin_model_controller.js rename to resources/static/jquery/generate/test/app_plugin_model_controller.js diff --git a/browserid/static/jquery/generate/test/run.js b/resources/static/jquery/generate/test/run.js similarity index 100% rename from browserid/static/jquery/generate/test/run.js rename to resources/static/jquery/generate/test/run.js diff --git a/browserid/static/jquery/generate/test/scaffold.js b/resources/static/jquery/generate/test/scaffold.js similarity index 100% rename from browserid/static/jquery/generate/test/scaffold.js rename to resources/static/jquery/generate/test/scaffold.js diff --git a/browserid/static/jquery/jquery.js b/resources/static/jquery/jquery.js similarity index 100% rename from browserid/static/jquery/jquery.js rename to resources/static/jquery/jquery.js diff --git a/browserid/static/jquery/lang/deparam/deparam.js b/resources/static/jquery/lang/deparam/deparam.js similarity index 100% rename from browserid/static/jquery/lang/deparam/deparam.js rename to resources/static/jquery/lang/deparam/deparam.js diff --git a/browserid/static/jquery/lang/deparam/deparam_test.js b/resources/static/jquery/lang/deparam/deparam_test.js similarity index 100% rename from browserid/static/jquery/lang/deparam/deparam_test.js rename to resources/static/jquery/lang/deparam/deparam_test.js diff --git a/browserid/static/jquery/lang/deparam/qunit.html b/resources/static/jquery/lang/deparam/qunit.html similarity index 100% rename from browserid/static/jquery/lang/deparam/qunit.html rename to resources/static/jquery/lang/deparam/qunit.html diff --git a/browserid/static/jquery/lang/json/json.js b/resources/static/jquery/lang/json/json.js similarity index 100% rename from browserid/static/jquery/lang/json/json.js rename to resources/static/jquery/lang/json/json.js diff --git a/browserid/static/jquery/lang/lang.html b/resources/static/jquery/lang/lang.html similarity index 100% rename from browserid/static/jquery/lang/lang.html rename to resources/static/jquery/lang/lang.html diff --git a/browserid/static/jquery/lang/lang.js b/resources/static/jquery/lang/lang.js similarity index 100% rename from browserid/static/jquery/lang/lang.js rename to resources/static/jquery/lang/lang.js diff --git a/browserid/static/jquery/lang/lang_test.js b/resources/static/jquery/lang/lang_test.js similarity index 100% rename from browserid/static/jquery/lang/lang_test.js rename to resources/static/jquery/lang/lang_test.js diff --git a/browserid/static/jquery/lang/openajax/openajax.html b/resources/static/jquery/lang/openajax/openajax.html similarity index 100% rename from browserid/static/jquery/lang/openajax/openajax.html rename to resources/static/jquery/lang/openajax/openajax.html diff --git a/browserid/static/jquery/lang/openajax/openajax.js b/resources/static/jquery/lang/openajax/openajax.js similarity index 100% rename from browserid/static/jquery/lang/openajax/openajax.js rename to resources/static/jquery/lang/openajax/openajax.js diff --git a/browserid/static/jquery/lang/qunit.html b/resources/static/jquery/lang/qunit.html similarity index 100% rename from browserid/static/jquery/lang/qunit.html rename to resources/static/jquery/lang/qunit.html diff --git a/browserid/static/jquery/lang/rsplit/rsplit.js b/resources/static/jquery/lang/rsplit/rsplit.js similarity index 100% rename from browserid/static/jquery/lang/rsplit/rsplit.js rename to resources/static/jquery/lang/rsplit/rsplit.js diff --git a/browserid/static/jquery/lang/vector/vector.js b/resources/static/jquery/lang/vector/vector.js similarity index 100% rename from browserid/static/jquery/lang/vector/vector.js rename to resources/static/jquery/lang/vector/vector.js diff --git a/browserid/static/jquery/model/associations/associations.html b/resources/static/jquery/model/associations/associations.html similarity index 100% rename from browserid/static/jquery/model/associations/associations.html rename to resources/static/jquery/model/associations/associations.html diff --git a/browserid/static/jquery/model/associations/associations.js b/resources/static/jquery/model/associations/associations.js similarity index 100% rename from browserid/static/jquery/model/associations/associations.js rename to resources/static/jquery/model/associations/associations.js diff --git a/browserid/static/jquery/model/associations/qunit.html b/resources/static/jquery/model/associations/qunit.html similarity index 100% rename from browserid/static/jquery/model/associations/qunit.html rename to resources/static/jquery/model/associations/qunit.html diff --git a/browserid/static/jquery/model/associations/test/qunit/associations_test.js b/resources/static/jquery/model/associations/test/qunit/associations_test.js similarity index 100% rename from browserid/static/jquery/model/associations/test/qunit/associations_test.js rename to resources/static/jquery/model/associations/test/qunit/associations_test.js diff --git a/browserid/static/jquery/model/associations/test/qunit/qunit.js b/resources/static/jquery/model/associations/test/qunit/qunit.js similarity index 100% rename from browserid/static/jquery/model/associations/test/qunit/qunit.js rename to resources/static/jquery/model/associations/test/qunit/qunit.js diff --git a/browserid/static/jquery/model/backup/backup.html b/resources/static/jquery/model/backup/backup.html similarity index 100% rename from browserid/static/jquery/model/backup/backup.html rename to resources/static/jquery/model/backup/backup.html diff --git a/browserid/static/jquery/model/backup/backup.js b/resources/static/jquery/model/backup/backup.js similarity index 100% rename from browserid/static/jquery/model/backup/backup.js rename to resources/static/jquery/model/backup/backup.js diff --git a/browserid/static/jquery/model/backup/qunit.html b/resources/static/jquery/model/backup/qunit.html similarity index 100% rename from browserid/static/jquery/model/backup/qunit.html rename to resources/static/jquery/model/backup/qunit.html diff --git a/browserid/static/jquery/model/backup/qunit/qunit.js b/resources/static/jquery/model/backup/qunit/qunit.js similarity index 100% rename from browserid/static/jquery/model/backup/qunit/qunit.js rename to resources/static/jquery/model/backup/qunit/qunit.js diff --git a/browserid/static/jquery/model/demo-convert.html b/resources/static/jquery/model/demo-convert.html similarity index 100% rename from browserid/static/jquery/model/demo-convert.html rename to resources/static/jquery/model/demo-convert.html diff --git a/browserid/static/jquery/model/demo-dom.html b/resources/static/jquery/model/demo-dom.html similarity index 100% rename from browserid/static/jquery/model/demo-dom.html rename to resources/static/jquery/model/demo-dom.html diff --git a/browserid/static/jquery/model/demo-encapsulate.html b/resources/static/jquery/model/demo-encapsulate.html similarity index 100% rename from browserid/static/jquery/model/demo-encapsulate.html rename to resources/static/jquery/model/demo-encapsulate.html diff --git a/browserid/static/jquery/model/demo-events.html b/resources/static/jquery/model/demo-events.html similarity index 100% rename from browserid/static/jquery/model/demo-events.html rename to resources/static/jquery/model/demo-events.html diff --git a/browserid/static/jquery/model/demo-setter.html b/resources/static/jquery/model/demo-setter.html similarity index 100% rename from browserid/static/jquery/model/demo-setter.html rename to resources/static/jquery/model/demo-setter.html diff --git a/browserid/static/jquery/model/fixtures/school.json b/resources/static/jquery/model/fixtures/school.json similarity index 100% rename from browserid/static/jquery/model/fixtures/school.json rename to resources/static/jquery/model/fixtures/school.json diff --git a/browserid/static/jquery/model/fixtures/schools.json b/resources/static/jquery/model/fixtures/schools.json similarity index 100% rename from browserid/static/jquery/model/fixtures/schools.json rename to resources/static/jquery/model/fixtures/schools.json diff --git a/browserid/static/jquery/model/guesstype/guesstype.js b/resources/static/jquery/model/guesstype/guesstype.js similarity index 100% rename from browserid/static/jquery/model/guesstype/guesstype.js rename to resources/static/jquery/model/guesstype/guesstype.js diff --git a/browserid/static/jquery/model/guesstype/guesstype_test.js b/resources/static/jquery/model/guesstype/guesstype_test.js similarity index 100% rename from browserid/static/jquery/model/guesstype/guesstype_test.js rename to resources/static/jquery/model/guesstype/guesstype_test.js diff --git a/browserid/static/jquery/model/list/cookie/cookie.html b/resources/static/jquery/model/list/cookie/cookie.html similarity index 100% rename from browserid/static/jquery/model/list/cookie/cookie.html rename to resources/static/jquery/model/list/cookie/cookie.html diff --git a/browserid/static/jquery/model/list/cookie/cookie.js b/resources/static/jquery/model/list/cookie/cookie.js similarity index 100% rename from browserid/static/jquery/model/list/cookie/cookie.js rename to resources/static/jquery/model/list/cookie/cookie.js diff --git a/browserid/static/jquery/model/list/cookie/qunit.html b/resources/static/jquery/model/list/cookie/qunit.html similarity index 100% rename from browserid/static/jquery/model/list/cookie/qunit.html rename to resources/static/jquery/model/list/cookie/qunit.html diff --git a/browserid/static/jquery/model/list/cookie/qunit/qunit.js b/resources/static/jquery/model/list/cookie/qunit/qunit.js similarity index 100% rename from browserid/static/jquery/model/list/cookie/qunit/qunit.js rename to resources/static/jquery/model/list/cookie/qunit/qunit.js diff --git a/browserid/static/jquery/model/list/list-insert.html b/resources/static/jquery/model/list/list-insert.html similarity index 100% rename from browserid/static/jquery/model/list/list-insert.html rename to resources/static/jquery/model/list/list-insert.html diff --git a/browserid/static/jquery/model/list/list.html b/resources/static/jquery/model/list/list.html similarity index 100% rename from browserid/static/jquery/model/list/list.html rename to resources/static/jquery/model/list/list.html diff --git a/browserid/static/jquery/model/list/list.js b/resources/static/jquery/model/list/list.js similarity index 100% rename from browserid/static/jquery/model/list/list.js rename to resources/static/jquery/model/list/list.js diff --git a/browserid/static/jquery/model/list/local/local.js b/resources/static/jquery/model/list/local/local.js similarity index 100% rename from browserid/static/jquery/model/list/local/local.js rename to resources/static/jquery/model/list/local/local.js diff --git a/browserid/static/jquery/model/list/memory.html b/resources/static/jquery/model/list/memory.html similarity index 100% rename from browserid/static/jquery/model/list/memory.html rename to resources/static/jquery/model/list/memory.html diff --git a/browserid/static/jquery/model/list/qunit.html b/resources/static/jquery/model/list/qunit.html similarity index 100% rename from browserid/static/jquery/model/list/qunit.html rename to resources/static/jquery/model/list/qunit.html diff --git a/browserid/static/jquery/model/list/test/qunit/list_test.js b/resources/static/jquery/model/list/test/qunit/list_test.js similarity index 100% rename from browserid/static/jquery/model/list/test/qunit/list_test.js rename to resources/static/jquery/model/list/test/qunit/list_test.js diff --git a/browserid/static/jquery/model/list/test/qunit/qunit.js b/resources/static/jquery/model/list/test/qunit/qunit.js similarity index 100% rename from browserid/static/jquery/model/list/test/qunit/qunit.js rename to resources/static/jquery/model/list/test/qunit/qunit.js diff --git a/browserid/static/jquery/model/model.js b/resources/static/jquery/model/model.js similarity index 100% rename from browserid/static/jquery/model/model.js rename to resources/static/jquery/model/model.js diff --git a/browserid/static/jquery/model/modelBinder.html b/resources/static/jquery/model/modelBinder.html similarity index 100% rename from browserid/static/jquery/model/modelBinder.html rename to resources/static/jquery/model/modelBinder.html diff --git a/browserid/static/jquery/model/pages/deferreds.js b/resources/static/jquery/model/pages/deferreds.js similarity index 100% rename from browserid/static/jquery/model/pages/deferreds.js rename to resources/static/jquery/model/pages/deferreds.js diff --git a/browserid/static/jquery/model/pages/encapsulate.js b/resources/static/jquery/model/pages/encapsulate.js similarity index 100% rename from browserid/static/jquery/model/pages/encapsulate.js rename to resources/static/jquery/model/pages/encapsulate.js diff --git a/browserid/static/jquery/model/pages/events.js b/resources/static/jquery/model/pages/events.js similarity index 100% rename from browserid/static/jquery/model/pages/events.js rename to resources/static/jquery/model/pages/events.js diff --git a/browserid/static/jquery/model/pages/typeconversion.js b/resources/static/jquery/model/pages/typeconversion.js similarity index 100% rename from browserid/static/jquery/model/pages/typeconversion.js rename to resources/static/jquery/model/pages/typeconversion.js diff --git a/browserid/static/jquery/model/qunit.html b/resources/static/jquery/model/qunit.html similarity index 100% rename from browserid/static/jquery/model/qunit.html rename to resources/static/jquery/model/qunit.html diff --git a/browserid/static/jquery/model/service/json_rest/json_rest.js b/resources/static/jquery/model/service/json_rest/json_rest.js similarity index 100% rename from browserid/static/jquery/model/service/json_rest/json_rest.js rename to resources/static/jquery/model/service/json_rest/json_rest.js diff --git a/browserid/static/jquery/model/service/service.js b/resources/static/jquery/model/service/service.js similarity index 100% rename from browserid/static/jquery/model/service/service.js rename to resources/static/jquery/model/service/service.js diff --git a/browserid/static/jquery/model/service/twitter/twitter.html b/resources/static/jquery/model/service/twitter/twitter.html similarity index 100% rename from browserid/static/jquery/model/service/twitter/twitter.html rename to resources/static/jquery/model/service/twitter/twitter.html diff --git a/browserid/static/jquery/model/service/twitter/twitter.js b/resources/static/jquery/model/service/twitter/twitter.js similarity index 100% rename from browserid/static/jquery/model/service/twitter/twitter.js rename to resources/static/jquery/model/service/twitter/twitter.js diff --git a/browserid/static/jquery/model/service/yql/yql.html b/resources/static/jquery/model/service/yql/yql.html similarity index 100% rename from browserid/static/jquery/model/service/yql/yql.html rename to resources/static/jquery/model/service/yql/yql.html diff --git a/browserid/static/jquery/model/service/yql/yql.js b/resources/static/jquery/model/service/yql/yql.js similarity index 100% rename from browserid/static/jquery/model/service/yql/yql.js rename to resources/static/jquery/model/service/yql/yql.js diff --git a/browserid/static/jquery/model/test/4.json b/resources/static/jquery/model/test/4.json similarity index 100% rename from browserid/static/jquery/model/test/4.json rename to resources/static/jquery/model/test/4.json diff --git a/browserid/static/jquery/model/test/create.json b/resources/static/jquery/model/test/create.json similarity index 100% rename from browserid/static/jquery/model/test/create.json rename to resources/static/jquery/model/test/create.json diff --git a/browserid/static/jquery/model/test/people.json b/resources/static/jquery/model/test/people.json similarity index 100% rename from browserid/static/jquery/model/test/people.json rename to resources/static/jquery/model/test/people.json diff --git a/browserid/static/jquery/model/test/person.json b/resources/static/jquery/model/test/person.json similarity index 100% rename from browserid/static/jquery/model/test/person.json rename to resources/static/jquery/model/test/person.json diff --git a/browserid/static/jquery/model/test/qunit/findAll.json b/resources/static/jquery/model/test/qunit/findAll.json similarity index 100% rename from browserid/static/jquery/model/test/qunit/findAll.json rename to resources/static/jquery/model/test/qunit/findAll.json diff --git a/browserid/static/jquery/model/test/qunit/model_test.js b/resources/static/jquery/model/test/qunit/model_test.js similarity index 100% rename from browserid/static/jquery/model/test/qunit/model_test.js rename to resources/static/jquery/model/test/qunit/model_test.js diff --git a/browserid/static/jquery/model/test/qunit/qunit.js b/resources/static/jquery/model/test/qunit/qunit.js similarity index 100% rename from browserid/static/jquery/model/test/qunit/qunit.js rename to resources/static/jquery/model/test/qunit/qunit.js diff --git a/browserid/static/jquery/model/test/schools.json b/resources/static/jquery/model/test/schools.json similarity index 100% rename from browserid/static/jquery/model/test/schools.json rename to resources/static/jquery/model/test/schools.json diff --git a/browserid/static/jquery/model/test/update4.json b/resources/static/jquery/model/test/update4.json similarity index 100% rename from browserid/static/jquery/model/test/update4.json rename to resources/static/jquery/model/test/update4.json diff --git a/browserid/static/jquery/model/validations/qunit.html b/resources/static/jquery/model/validations/qunit.html similarity index 100% rename from browserid/static/jquery/model/validations/qunit.html rename to resources/static/jquery/model/validations/qunit.html diff --git a/browserid/static/jquery/model/validations/qunit/validations_test.js b/resources/static/jquery/model/validations/qunit/validations_test.js similarity index 100% rename from browserid/static/jquery/model/validations/qunit/validations_test.js rename to resources/static/jquery/model/validations/qunit/validations_test.js diff --git a/browserid/static/jquery/model/validations/validations.html b/resources/static/jquery/model/validations/validations.html similarity index 100% rename from browserid/static/jquery/model/validations/validations.html rename to resources/static/jquery/model/validations/validations.html diff --git a/browserid/static/jquery/model/validations/validations.js b/resources/static/jquery/model/validations/validations.js similarity index 100% rename from browserid/static/jquery/model/validations/validations.js rename to resources/static/jquery/model/validations/validations.js diff --git a/browserid/static/jquery/qunit.html b/resources/static/jquery/qunit.html similarity index 100% rename from browserid/static/jquery/qunit.html rename to resources/static/jquery/qunit.html diff --git a/browserid/static/jquery/test/qunit/integration.js b/resources/static/jquery/test/qunit/integration.js similarity index 100% rename from browserid/static/jquery/test/qunit/integration.js rename to resources/static/jquery/test/qunit/integration.js diff --git a/browserid/static/jquery/test/qunit/qunit.js b/resources/static/jquery/test/qunit/qunit.js similarity index 100% rename from browserid/static/jquery/test/qunit/qunit.js rename to resources/static/jquery/test/qunit/qunit.js diff --git a/browserid/static/jquery/test/run.js b/resources/static/jquery/test/run.js similarity index 100% rename from browserid/static/jquery/test/run.js rename to resources/static/jquery/test/run.js diff --git a/browserid/static/jquery/test/template.ejs b/resources/static/jquery/test/template.ejs similarity index 100% rename from browserid/static/jquery/test/template.ejs rename to resources/static/jquery/test/template.ejs diff --git a/browserid/static/jquery/test/thing.json b/resources/static/jquery/test/thing.json similarity index 100% rename from browserid/static/jquery/test/thing.json rename to resources/static/jquery/test/thing.json diff --git a/browserid/static/jquery/tie/qunit.html b/resources/static/jquery/tie/qunit.html similarity index 100% rename from browserid/static/jquery/tie/qunit.html rename to resources/static/jquery/tie/qunit.html diff --git a/browserid/static/jquery/tie/tie.html b/resources/static/jquery/tie/tie.html similarity index 100% rename from browserid/static/jquery/tie/tie.html rename to resources/static/jquery/tie/tie.html diff --git a/browserid/static/jquery/tie/tie.js b/resources/static/jquery/tie/tie.js similarity index 100% rename from browserid/static/jquery/tie/tie.js rename to resources/static/jquery/tie/tie.js diff --git a/browserid/static/jquery/tie/tie_test.js b/resources/static/jquery/tie/tie_test.js similarity index 100% rename from browserid/static/jquery/tie/tie_test.js rename to resources/static/jquery/tie/tie_test.js diff --git a/browserid/static/jquery/update b/resources/static/jquery/update similarity index 100% rename from browserid/static/jquery/update rename to resources/static/jquery/update diff --git a/browserid/static/jquery/view/compress.js b/resources/static/jquery/view/compress.js similarity index 100% rename from browserid/static/jquery/view/compress.js rename to resources/static/jquery/view/compress.js diff --git a/browserid/static/jquery/view/ejs/ejs.html b/resources/static/jquery/view/ejs/ejs.html similarity index 100% rename from browserid/static/jquery/view/ejs/ejs.html rename to resources/static/jquery/view/ejs/ejs.html diff --git a/browserid/static/jquery/view/ejs/ejs.js b/resources/static/jquery/view/ejs/ejs.js similarity index 100% rename from browserid/static/jquery/view/ejs/ejs.js rename to resources/static/jquery/view/ejs/ejs.js diff --git a/browserid/static/jquery/view/ejs/funcunit.html b/resources/static/jquery/view/ejs/funcunit.html similarity index 100% rename from browserid/static/jquery/view/ejs/funcunit.html rename to resources/static/jquery/view/ejs/funcunit.html diff --git a/browserid/static/jquery/view/ejs/other.js b/resources/static/jquery/view/ejs/other.js similarity index 100% rename from browserid/static/jquery/view/ejs/other.js rename to resources/static/jquery/view/ejs/other.js diff --git a/browserid/static/jquery/view/ejs/qunit.html b/resources/static/jquery/view/ejs/qunit.html similarity index 100% rename from browserid/static/jquery/view/ejs/qunit.html rename to resources/static/jquery/view/ejs/qunit.html diff --git a/browserid/static/jquery/view/ejs/test/qunit/ejs_test.js b/resources/static/jquery/view/ejs/test/qunit/ejs_test.js similarity index 100% rename from browserid/static/jquery/view/ejs/test/qunit/ejs_test.js rename to resources/static/jquery/view/ejs/test/qunit/ejs_test.js diff --git a/browserid/static/jquery/view/ejs/test/qunit/qunit.js b/resources/static/jquery/view/ejs/test/qunit/qunit.js similarity index 100% rename from browserid/static/jquery/view/ejs/test/qunit/qunit.js rename to resources/static/jquery/view/ejs/test/qunit/qunit.js diff --git a/browserid/static/jquery/view/fulljslint.js b/resources/static/jquery/view/fulljslint.js similarity index 100% rename from browserid/static/jquery/view/fulljslint.js rename to resources/static/jquery/view/fulljslint.js diff --git a/browserid/static/jquery/view/helpers/helpers.js b/resources/static/jquery/view/helpers/helpers.js similarity index 100% rename from browserid/static/jquery/view/helpers/helpers.js rename to resources/static/jquery/view/helpers/helpers.js diff --git a/browserid/static/jquery/view/jaml/jaml.js b/resources/static/jquery/view/jaml/jaml.js similarity index 100% rename from browserid/static/jquery/view/jaml/jaml.js rename to resources/static/jquery/view/jaml/jaml.js diff --git a/browserid/static/jquery/view/micro/micro.js b/resources/static/jquery/view/micro/micro.js similarity index 100% rename from browserid/static/jquery/view/micro/micro.js rename to resources/static/jquery/view/micro/micro.js diff --git a/browserid/static/jquery/view/qunit.html b/resources/static/jquery/view/qunit.html similarity index 100% rename from browserid/static/jquery/view/qunit.html rename to resources/static/jquery/view/qunit.html diff --git a/browserid/static/jquery/view/test/compression/compression.html b/resources/static/jquery/view/test/compression/compression.html similarity index 100% rename from browserid/static/jquery/view/test/compression/compression.html rename to resources/static/jquery/view/test/compression/compression.html diff --git a/browserid/static/jquery/view/test/compression/compression.js b/resources/static/jquery/view/test/compression/compression.js similarity index 100% rename from browserid/static/jquery/view/test/compression/compression.js rename to resources/static/jquery/view/test/compression/compression.js diff --git a/browserid/static/jquery/view/test/compression/production.js b/resources/static/jquery/view/test/compression/production.js similarity index 100% rename from browserid/static/jquery/view/test/compression/production.js rename to resources/static/jquery/view/test/compression/production.js diff --git a/browserid/static/jquery/view/test/compression/run.js b/resources/static/jquery/view/test/compression/run.js similarity index 100% rename from browserid/static/jquery/view/test/compression/run.js rename to resources/static/jquery/view/test/compression/run.js diff --git a/browserid/static/jquery/view/test/compression/views/keep.me b/resources/static/jquery/view/test/compression/views/keep.me similarity index 100% rename from browserid/static/jquery/view/test/compression/views/keep.me rename to resources/static/jquery/view/test/compression/views/keep.me diff --git a/browserid/static/jquery/view/test/qunit/deferred.ejs b/resources/static/jquery/view/test/qunit/deferred.ejs similarity index 100% rename from browserid/static/jquery/view/test/qunit/deferred.ejs rename to resources/static/jquery/view/test/qunit/deferred.ejs diff --git a/browserid/static/jquery/view/test/qunit/deferreds.ejs b/resources/static/jquery/view/test/qunit/deferreds.ejs similarity index 100% rename from browserid/static/jquery/view/test/qunit/deferreds.ejs rename to resources/static/jquery/view/test/qunit/deferreds.ejs diff --git a/browserid/static/jquery/view/test/qunit/hookup.ejs b/resources/static/jquery/view/test/qunit/hookup.ejs similarity index 100% rename from browserid/static/jquery/view/test/qunit/hookup.ejs rename to resources/static/jquery/view/test/qunit/hookup.ejs diff --git a/browserid/static/jquery/view/test/qunit/large.ejs b/resources/static/jquery/view/test/qunit/large.ejs similarity index 100% rename from browserid/static/jquery/view/test/qunit/large.ejs rename to resources/static/jquery/view/test/qunit/large.ejs diff --git a/browserid/static/jquery/view/test/qunit/nested_plugin.ejs b/resources/static/jquery/view/test/qunit/nested_plugin.ejs similarity index 100% rename from browserid/static/jquery/view/test/qunit/nested_plugin.ejs rename to resources/static/jquery/view/test/qunit/nested_plugin.ejs diff --git a/browserid/static/jquery/view/test/qunit/plugin.ejs b/resources/static/jquery/view/test/qunit/plugin.ejs similarity index 100% rename from browserid/static/jquery/view/test/qunit/plugin.ejs rename to resources/static/jquery/view/test/qunit/plugin.ejs diff --git a/browserid/static/jquery/view/test/qunit/qunit.js b/resources/static/jquery/view/test/qunit/qunit.js similarity index 100% rename from browserid/static/jquery/view/test/qunit/qunit.js rename to resources/static/jquery/view/test/qunit/qunit.js diff --git a/browserid/static/jquery/view/test/qunit/temp.ejs b/resources/static/jquery/view/test/qunit/temp.ejs similarity index 100% rename from browserid/static/jquery/view/test/qunit/temp.ejs rename to resources/static/jquery/view/test/qunit/temp.ejs diff --git a/browserid/static/jquery/view/test/qunit/template.ejs b/resources/static/jquery/view/test/qunit/template.ejs similarity index 100% rename from browserid/static/jquery/view/test/qunit/template.ejs rename to resources/static/jquery/view/test/qunit/template.ejs diff --git a/browserid/static/jquery/view/test/qunit/template.jaml b/resources/static/jquery/view/test/qunit/template.jaml similarity index 100% rename from browserid/static/jquery/view/test/qunit/template.jaml rename to resources/static/jquery/view/test/qunit/template.jaml diff --git a/browserid/static/jquery/view/test/qunit/template.micro b/resources/static/jquery/view/test/qunit/template.micro similarity index 100% rename from browserid/static/jquery/view/test/qunit/template.micro rename to resources/static/jquery/view/test/qunit/template.micro diff --git a/browserid/static/jquery/view/test/qunit/template.tmpl b/resources/static/jquery/view/test/qunit/template.tmpl similarity index 100% rename from browserid/static/jquery/view/test/qunit/template.tmpl rename to resources/static/jquery/view/test/qunit/template.tmpl diff --git a/browserid/static/jquery/view/test/qunit/view_test.js b/resources/static/jquery/view/test/qunit/view_test.js similarity index 100% rename from browserid/static/jquery/view/test/qunit/view_test.js rename to resources/static/jquery/view/test/qunit/view_test.js diff --git a/browserid/static/jquery/view/tmpl/test.tmpl b/resources/static/jquery/view/tmpl/test.tmpl similarity index 100% rename from browserid/static/jquery/view/tmpl/test.tmpl rename to resources/static/jquery/view/tmpl/test.tmpl diff --git a/browserid/static/jquery/view/tmpl/tmpl.js b/resources/static/jquery/view/tmpl/tmpl.js similarity index 100% rename from browserid/static/jquery/view/tmpl/tmpl.js rename to resources/static/jquery/view/tmpl/tmpl.js diff --git a/browserid/static/jquery/view/tmpl/tmpl_test.js b/resources/static/jquery/view/tmpl/tmpl_test.js similarity index 100% rename from browserid/static/jquery/view/tmpl/tmpl_test.js rename to resources/static/jquery/view/tmpl/tmpl_test.js diff --git a/browserid/static/jquery/view/view.html b/resources/static/jquery/view/view.html similarity index 100% rename from browserid/static/jquery/view/view.html rename to resources/static/jquery/view/view.html diff --git a/browserid/static/jquery/view/view.js b/resources/static/jquery/view/view.js similarity index 100% rename from browserid/static/jquery/view/view.js rename to resources/static/jquery/view/view.js diff --git a/browserid/static/js.bat b/resources/static/js.bat similarity index 100% rename from browserid/static/js.bat rename to resources/static/js.bat diff --git a/browserid/static/js/browserid.js b/resources/static/js/browserid.js similarity index 100% rename from browserid/static/js/browserid.js rename to resources/static/js/browserid.js diff --git a/browserid/static/js/highlight.js b/resources/static/js/highlight.js similarity index 100% rename from browserid/static/js/highlight.js rename to resources/static/js/highlight.js diff --git a/browserid/static/js/html5shim.js b/resources/static/js/html5shim.js similarity index 100% rename from browserid/static/js/html5shim.js rename to resources/static/js/html5shim.js diff --git a/browserid/static/js/jquery-1.6.2.min.js b/resources/static/js/jquery-1.6.2.min.js similarity index 100% rename from browserid/static/js/jquery-1.6.2.min.js rename to resources/static/js/jquery-1.6.2.min.js diff --git a/browserid/static/js/json2.js b/resources/static/js/json2.js similarity index 100% rename from browserid/static/js/json2.js rename to resources/static/js/json2.js diff --git a/browserid/static/js/pages/add_email_address.js b/resources/static/js/pages/add_email_address.js similarity index 100% rename from browserid/static/js/pages/add_email_address.js rename to resources/static/js/pages/add_email_address.js diff --git a/browserid/static/js/pages/forgot.js b/resources/static/js/pages/forgot.js similarity index 100% rename from browserid/static/js/pages/forgot.js rename to resources/static/js/pages/forgot.js diff --git a/browserid/static/js/pages/index.js b/resources/static/js/pages/index.js similarity index 100% rename from browserid/static/js/pages/index.js rename to resources/static/js/pages/index.js diff --git a/browserid/static/js/pages/manage_account.js b/resources/static/js/pages/manage_account.js similarity index 100% rename from browserid/static/js/pages/manage_account.js rename to resources/static/js/pages/manage_account.js diff --git a/browserid/static/js/pages/signin.js b/resources/static/js/pages/signin.js similarity index 100% rename from browserid/static/js/pages/signin.js rename to resources/static/js/pages/signin.js diff --git a/browserid/static/js/pages/signup.js b/resources/static/js/pages/signup.js similarity index 100% rename from browserid/static/js/pages/signup.js rename to resources/static/js/pages/signup.js diff --git a/browserid/static/js/pages/verify_email_address.js b/resources/static/js/pages/verify_email_address.js similarity index 100% rename from browserid/static/js/pages/verify_email_address.js rename to resources/static/js/pages/verify_email_address.js diff --git a/browserid/static/relay/relay.js b/resources/static/relay/relay.js similarity index 100% rename from browserid/static/relay/relay.js rename to resources/static/relay/relay.js diff --git a/browserid/static/steal/.gitignore b/resources/static/steal/.gitignore similarity index 100% rename from browserid/static/steal/.gitignore rename to resources/static/steal/.gitignore diff --git a/browserid/static/steal/README b/resources/static/steal/README similarity index 100% rename from browserid/static/steal/README rename to resources/static/steal/README diff --git a/browserid/static/steal/build/apps/apps.js b/resources/static/steal/build/apps/apps.js similarity index 100% rename from browserid/static/steal/build/apps/apps.js rename to resources/static/steal/build/apps/apps.js diff --git a/browserid/static/steal/build/apps/test.js b/resources/static/steal/build/apps/test.js similarity index 100% rename from browserid/static/steal/build/apps/test.js rename to resources/static/steal/build/apps/test.js diff --git a/browserid/static/steal/build/build.js b/resources/static/steal/build/build.js similarity index 100% rename from browserid/static/steal/build/build.js rename to resources/static/steal/build/build.js diff --git a/browserid/static/steal/build/pluginify/parse.js b/resources/static/steal/build/pluginify/parse.js similarity index 100% rename from browserid/static/steal/build/pluginify/parse.js rename to resources/static/steal/build/pluginify/parse.js diff --git a/browserid/static/steal/build/pluginify/pluginify.js b/resources/static/steal/build/pluginify/pluginify.js similarity index 100% rename from browserid/static/steal/build/pluginify/pluginify.js rename to resources/static/steal/build/pluginify/pluginify.js diff --git a/browserid/static/steal/build/pluginify/test/firstFunc.js b/resources/static/steal/build/pluginify/test/firstFunc.js similarity index 100% rename from browserid/static/steal/build/pluginify/test/firstFunc.js rename to resources/static/steal/build/pluginify/test/firstFunc.js diff --git a/browserid/static/steal/build/pluginify/test/pluginify_test.js b/resources/static/steal/build/pluginify/test/pluginify_test.js similarity index 100% rename from browserid/static/steal/build/pluginify/test/pluginify_test.js rename to resources/static/steal/build/pluginify/test/pluginify_test.js diff --git a/browserid/static/steal/build/pluginify/test/secondFunc.js b/resources/static/steal/build/pluginify/test/secondFunc.js similarity index 100% rename from browserid/static/steal/build/pluginify/test/secondFunc.js rename to resources/static/steal/build/pluginify/test/secondFunc.js diff --git a/browserid/static/steal/build/pluginify/test/test_steals.js b/resources/static/steal/build/pluginify/test/test_steals.js similarity index 100% rename from browserid/static/steal/build/pluginify/test/test_steals.js rename to resources/static/steal/build/pluginify/test/test_steals.js diff --git a/browserid/static/steal/build/pluginify/test/weirdRegexps.js b/resources/static/steal/build/pluginify/test/weirdRegexps.js similarity index 100% rename from browserid/static/steal/build/pluginify/test/weirdRegexps.js rename to resources/static/steal/build/pluginify/test/weirdRegexps.js diff --git a/browserid/static/steal/build/pluginify/tokens.js b/resources/static/steal/build/pluginify/tokens.js similarity index 100% rename from browserid/static/steal/build/pluginify/tokens.js rename to resources/static/steal/build/pluginify/tokens.js diff --git a/browserid/static/steal/build/scripts/compiler.jar b/resources/static/steal/build/scripts/compiler.jar similarity index 100% rename from browserid/static/steal/build/scripts/compiler.jar rename to resources/static/steal/build/scripts/compiler.jar diff --git a/browserid/static/steal/build/scripts/scripts.js b/resources/static/steal/build/scripts/scripts.js similarity index 100% rename from browserid/static/steal/build/scripts/scripts.js rename to resources/static/steal/build/scripts/scripts.js diff --git a/browserid/static/steal/build/scripts/yui.jar b/resources/static/steal/build/scripts/yui.jar similarity index 100% rename from browserid/static/steal/build/scripts/yui.jar rename to resources/static/steal/build/scripts/yui.jar diff --git a/browserid/static/steal/build/styles/cssmin.js b/resources/static/steal/build/styles/cssmin.js similarity index 100% rename from browserid/static/steal/build/styles/cssmin.js rename to resources/static/steal/build/styles/cssmin.js diff --git a/browserid/static/steal/build/styles/styles.js b/resources/static/steal/build/styles/styles.js similarity index 100% rename from browserid/static/steal/build/styles/styles.js rename to resources/static/steal/build/styles/styles.js diff --git a/browserid/static/steal/build/styles/test/app/app.css b/resources/static/steal/build/styles/test/app/app.css similarity index 100% rename from browserid/static/steal/build/styles/test/app/app.css rename to resources/static/steal/build/styles/test/app/app.css diff --git a/browserid/static/steal/build/styles/test/app/app.html b/resources/static/steal/build/styles/test/app/app.html similarity index 100% rename from browserid/static/steal/build/styles/test/app/app.html rename to resources/static/steal/build/styles/test/app/app.html diff --git a/browserid/static/steal/build/styles/test/app/app.js b/resources/static/steal/build/styles/test/app/app.js similarity index 100% rename from browserid/static/steal/build/styles/test/app/app.js rename to resources/static/steal/build/styles/test/app/app.js diff --git a/browserid/static/steal/build/styles/test/app/production.css b/resources/static/steal/build/styles/test/app/production.css similarity index 100% rename from browserid/static/steal/build/styles/test/app/production.css rename to resources/static/steal/build/styles/test/app/production.css diff --git a/browserid/static/steal/build/styles/test/css/css1.css b/resources/static/steal/build/styles/test/css/css1.css similarity index 100% rename from browserid/static/steal/build/styles/test/css/css1.css rename to resources/static/steal/build/styles/test/css/css1.css diff --git a/browserid/static/steal/build/styles/test/css/justin.png b/resources/static/steal/build/styles/test/css/justin.png similarity index 100% rename from browserid/static/steal/build/styles/test/css/justin.png rename to resources/static/steal/build/styles/test/css/justin.png diff --git a/browserid/static/steal/build/styles/test/css2.css b/resources/static/steal/build/styles/test/css2.css similarity index 100% rename from browserid/static/steal/build/styles/test/css2.css rename to resources/static/steal/build/styles/test/css2.css diff --git a/browserid/static/steal/build/styles/test/multiline.css b/resources/static/steal/build/styles/test/multiline.css similarity index 100% rename from browserid/static/steal/build/styles/test/multiline.css rename to resources/static/steal/build/styles/test/multiline.css diff --git a/browserid/static/steal/build/styles/test/page.html b/resources/static/steal/build/styles/test/page.html similarity index 100% rename from browserid/static/steal/build/styles/test/page.html rename to resources/static/steal/build/styles/test/page.html diff --git a/browserid/static/steal/build/styles/test/production.css b/resources/static/steal/build/styles/test/production.css similarity index 100% rename from browserid/static/steal/build/styles/test/production.css rename to resources/static/steal/build/styles/test/production.css diff --git a/browserid/static/steal/build/styles/test/productionCompare.css b/resources/static/steal/build/styles/test/productionCompare.css similarity index 100% rename from browserid/static/steal/build/styles/test/productionCompare.css rename to resources/static/steal/build/styles/test/productionCompare.css diff --git a/browserid/static/steal/build/styles/test/styles_test.js b/resources/static/steal/build/styles/test/styles_test.js similarity index 100% rename from browserid/static/steal/build/styles/test/styles_test.js rename to resources/static/steal/build/styles/test/styles_test.js diff --git a/browserid/static/steal/build/styles/test/upload.PNG b/resources/static/steal/build/styles/test/upload.PNG similarity index 100% rename from browserid/static/steal/build/styles/test/upload.PNG rename to resources/static/steal/build/styles/test/upload.PNG diff --git a/browserid/static/steal/build/test/basicpage.html b/resources/static/steal/build/test/basicpage.html similarity index 100% rename from browserid/static/steal/build/test/basicpage.html rename to resources/static/steal/build/test/basicpage.html diff --git a/browserid/static/steal/build/test/basicsource.js b/resources/static/steal/build/test/basicsource.js similarity index 100% rename from browserid/static/steal/build/test/basicsource.js rename to resources/static/steal/build/test/basicsource.js diff --git a/browserid/static/steal/build/test/foreign.html b/resources/static/steal/build/test/foreign.html similarity index 100% rename from browserid/static/steal/build/test/foreign.html rename to resources/static/steal/build/test/foreign.html diff --git a/browserid/static/steal/build/test/foreign.js b/resources/static/steal/build/test/foreign.js similarity index 100% rename from browserid/static/steal/build/test/foreign.js rename to resources/static/steal/build/test/foreign.js diff --git a/browserid/static/steal/build/test/https.html b/resources/static/steal/build/test/https.html similarity index 100% rename from browserid/static/steal/build/test/https.html rename to resources/static/steal/build/test/https.html diff --git a/browserid/static/steal/build/test/https.js b/resources/static/steal/build/test/https.js similarity index 100% rename from browserid/static/steal/build/test/https.js rename to resources/static/steal/build/test/https.js diff --git a/browserid/static/steal/build/test/removecode.js b/resources/static/steal/build/test/removecode.js similarity index 100% rename from browserid/static/steal/build/test/removecode.js rename to resources/static/steal/build/test/removecode.js diff --git a/browserid/static/steal/build/test/run.js b/resources/static/steal/build/test/run.js similarity index 100% rename from browserid/static/steal/build/test/run.js rename to resources/static/steal/build/test/run.js diff --git a/browserid/static/steal/build/test/stealpage.html b/resources/static/steal/build/test/stealpage.html similarity index 100% rename from browserid/static/steal/build/test/stealpage.html rename to resources/static/steal/build/test/stealpage.html diff --git a/browserid/static/steal/build/test/stealprodpage.html b/resources/static/steal/build/test/stealprodpage.html similarity index 100% rename from browserid/static/steal/build/test/stealprodpage.html rename to resources/static/steal/build/test/stealprodpage.html diff --git a/browserid/static/steal/build/test/test.js b/resources/static/steal/build/test/test.js similarity index 100% rename from browserid/static/steal/build/test/test.js rename to resources/static/steal/build/test/test.js diff --git a/browserid/static/steal/buildjs b/resources/static/steal/buildjs similarity index 100% rename from browserid/static/steal/buildjs rename to resources/static/steal/buildjs diff --git a/browserid/static/steal/clean/beautify.js b/resources/static/steal/clean/beautify.js similarity index 100% rename from browserid/static/steal/clean/beautify.js rename to resources/static/steal/clean/beautify.js diff --git a/browserid/static/steal/clean/clean.js b/resources/static/steal/clean/clean.js similarity index 100% rename from browserid/static/steal/clean/clean.js rename to resources/static/steal/clean/clean.js diff --git a/browserid/static/steal/clean/jslint.js b/resources/static/steal/clean/jslint.js similarity index 100% rename from browserid/static/steal/clean/jslint.js rename to resources/static/steal/clean/jslint.js diff --git a/browserid/static/steal/clean/test/clean_test.js b/resources/static/steal/clean/test/clean_test.js similarity index 100% rename from browserid/static/steal/clean/test/clean_test.js rename to resources/static/steal/clean/test/clean_test.js diff --git a/browserid/static/steal/clean/test/test.js b/resources/static/steal/clean/test/test.js similarity index 100% rename from browserid/static/steal/clean/test/test.js rename to resources/static/steal/clean/test/test.js diff --git a/browserid/static/steal/clean/test/testEnd.js b/resources/static/steal/clean/test/testEnd.js similarity index 100% rename from browserid/static/steal/clean/test/testEnd.js rename to resources/static/steal/clean/test/testEnd.js diff --git a/browserid/static/steal/cleanjs b/resources/static/steal/cleanjs similarity index 100% rename from browserid/static/steal/cleanjs rename to resources/static/steal/cleanjs diff --git a/browserid/static/steal/coffee/coffee-script.js b/resources/static/steal/coffee/coffee-script.js similarity index 100% rename from browserid/static/steal/coffee/coffee-script.js rename to resources/static/steal/coffee/coffee-script.js diff --git a/browserid/static/steal/coffee/coffee.js b/resources/static/steal/coffee/coffee.js similarity index 100% rename from browserid/static/steal/coffee/coffee.js rename to resources/static/steal/coffee/coffee.js diff --git a/browserid/static/steal/dev/dev.js b/resources/static/steal/dev/dev.js similarity index 100% rename from browserid/static/steal/dev/dev.js rename to resources/static/steal/dev/dev.js diff --git a/browserid/static/steal/end.js b/resources/static/steal/end.js similarity index 100% rename from browserid/static/steal/end.js rename to resources/static/steal/end.js diff --git a/browserid/static/steal/generate/app b/resources/static/steal/generate/app similarity index 100% rename from browserid/static/steal/generate/app rename to resources/static/steal/generate/app diff --git a/browserid/static/steal/generate/ejs.js b/resources/static/steal/generate/ejs.js similarity index 100% rename from browserid/static/steal/generate/ejs.js rename to resources/static/steal/generate/ejs.js diff --git a/browserid/static/steal/generate/generate.js b/resources/static/steal/generate/generate.js similarity index 100% rename from browserid/static/steal/generate/generate.js rename to resources/static/steal/generate/generate.js diff --git a/browserid/static/steal/generate/inflector.js b/resources/static/steal/generate/inflector.js similarity index 100% rename from browserid/static/steal/generate/inflector.js rename to resources/static/steal/generate/inflector.js diff --git a/browserid/static/steal/generate/system.js b/resources/static/steal/generate/system.js similarity index 100% rename from browserid/static/steal/generate/system.js rename to resources/static/steal/generate/system.js diff --git a/browserid/static/steal/generate/templates/app/(application_name).css.ejs b/resources/static/steal/generate/templates/app/(application_name).css.ejs similarity index 100% rename from browserid/static/steal/generate/templates/app/(application_name).css.ejs rename to resources/static/steal/generate/templates/app/(application_name).css.ejs diff --git a/browserid/static/steal/generate/templates/app/(application_name).html.ejs b/resources/static/steal/generate/templates/app/(application_name).html.ejs similarity index 100% rename from browserid/static/steal/generate/templates/app/(application_name).html.ejs rename to resources/static/steal/generate/templates/app/(application_name).html.ejs diff --git a/browserid/static/steal/generate/templates/app/(application_name).js.ejs b/resources/static/steal/generate/templates/app/(application_name).js.ejs similarity index 100% rename from browserid/static/steal/generate/templates/app/(application_name).js.ejs rename to resources/static/steal/generate/templates/app/(application_name).js.ejs diff --git a/browserid/static/steal/generate/templates/app/docs/.ignore b/resources/static/steal/generate/templates/app/docs/.ignore similarity index 100% rename from browserid/static/steal/generate/templates/app/docs/.ignore rename to resources/static/steal/generate/templates/app/docs/.ignore diff --git a/browserid/static/steal/generate/templates/app/resources/.ignore b/resources/static/steal/generate/templates/app/resources/.ignore similarity index 100% rename from browserid/static/steal/generate/templates/app/resources/.ignore rename to resources/static/steal/generate/templates/app/resources/.ignore diff --git a/browserid/static/steal/generate/templates/app/resources/example.coffee.ejs b/resources/static/steal/generate/templates/app/resources/example.coffee.ejs similarity index 100% rename from browserid/static/steal/generate/templates/app/resources/example.coffee.ejs rename to resources/static/steal/generate/templates/app/resources/example.coffee.ejs diff --git a/browserid/static/steal/generate/templates/app/resources/example.js.ejs b/resources/static/steal/generate/templates/app/resources/example.js.ejs similarity index 100% rename from browserid/static/steal/generate/templates/app/resources/example.js.ejs rename to resources/static/steal/generate/templates/app/resources/example.js.ejs diff --git a/browserid/static/steal/generate/templates/app/resources/example.less.ejs b/resources/static/steal/generate/templates/app/resources/example.less.ejs similarity index 100% rename from browserid/static/steal/generate/templates/app/resources/example.less.ejs rename to resources/static/steal/generate/templates/app/resources/example.less.ejs diff --git a/browserid/static/steal/generate/templates/app/scripts/build.html.ejs b/resources/static/steal/generate/templates/app/scripts/build.html.ejs similarity index 100% rename from browserid/static/steal/generate/templates/app/scripts/build.html.ejs rename to resources/static/steal/generate/templates/app/scripts/build.html.ejs diff --git a/browserid/static/steal/generate/templates/app/scripts/build.js.ejs b/resources/static/steal/generate/templates/app/scripts/build.js.ejs similarity index 100% rename from browserid/static/steal/generate/templates/app/scripts/build.js.ejs rename to resources/static/steal/generate/templates/app/scripts/build.js.ejs diff --git a/browserid/static/steal/generate/templates/app/scripts/clean.js.ejs b/resources/static/steal/generate/templates/app/scripts/clean.js.ejs similarity index 100% rename from browserid/static/steal/generate/templates/app/scripts/clean.js.ejs rename to resources/static/steal/generate/templates/app/scripts/clean.js.ejs diff --git a/browserid/static/steal/generate/templates/app/test/.ignore b/resources/static/steal/generate/templates/app/test/.ignore similarity index 100% rename from browserid/static/steal/generate/templates/app/test/.ignore rename to resources/static/steal/generate/templates/app/test/.ignore diff --git a/browserid/static/steal/generate/templates/page.ejs b/resources/static/steal/generate/templates/page.ejs similarity index 100% rename from browserid/static/steal/generate/templates/page.ejs rename to resources/static/steal/generate/templates/page.ejs diff --git a/browserid/static/steal/generate/test/run.js b/resources/static/steal/generate/test/run.js similarity index 100% rename from browserid/static/steal/generate/test/run.js rename to resources/static/steal/generate/test/run.js diff --git a/browserid/static/steal/get/basic.js b/resources/static/steal/get/basic.js similarity index 100% rename from browserid/static/steal/get/basic.js rename to resources/static/steal/get/basic.js diff --git a/browserid/static/steal/get/dummysteal.js b/resources/static/steal/get/dummysteal.js similarity index 100% rename from browserid/static/steal/get/dummysteal.js rename to resources/static/steal/get/dummysteal.js diff --git a/browserid/static/steal/get/get.js b/resources/static/steal/get/get.js similarity index 100% rename from browserid/static/steal/get/get.js rename to resources/static/steal/get/get.js diff --git a/browserid/static/steal/get/gets.json b/resources/static/steal/get/gets.json similarity index 100% rename from browserid/static/steal/get/gets.json rename to resources/static/steal/get/gets.json diff --git a/browserid/static/steal/get/getter.js b/resources/static/steal/get/getter.js similarity index 100% rename from browserid/static/steal/get/getter.js rename to resources/static/steal/get/getter.js diff --git a/browserid/static/steal/get/git.js b/resources/static/steal/get/git.js similarity index 100% rename from browserid/static/steal/get/git.js rename to resources/static/steal/get/git.js diff --git a/browserid/static/steal/get/github.js b/resources/static/steal/get/github.js similarity index 100% rename from browserid/static/steal/get/github.js rename to resources/static/steal/get/github.js diff --git a/browserid/static/steal/get/json.js b/resources/static/steal/get/json.js similarity index 100% rename from browserid/static/steal/get/json.js rename to resources/static/steal/get/json.js diff --git a/browserid/static/steal/get/test/.gitignore b/resources/static/steal/get/test/.gitignore similarity index 100% rename from browserid/static/steal/get/test/.gitignore rename to resources/static/steal/get/test/.gitignore diff --git a/browserid/static/steal/get/test/.gitmodules b/resources/static/steal/get/test/.gitmodules similarity index 100% rename from browserid/static/steal/get/test/.gitmodules rename to resources/static/steal/get/test/.gitmodules diff --git a/browserid/static/steal/get/test/README b/resources/static/steal/get/test/README similarity index 100% rename from browserid/static/steal/get/test/README rename to resources/static/steal/get/test/README diff --git a/browserid/static/steal/get/test/get_test.js b/resources/static/steal/get/test/get_test.js similarity index 100% rename from browserid/static/steal/get/test/get_test.js rename to resources/static/steal/get/test/get_test.js diff --git a/browserid/static/steal/get/test/stealCode1.js b/resources/static/steal/get/test/stealCode1.js similarity index 100% rename from browserid/static/steal/get/test/stealCode1.js rename to resources/static/steal/get/test/stealCode1.js diff --git a/browserid/static/steal/getjs b/resources/static/steal/getjs similarity index 100% rename from browserid/static/steal/getjs rename to resources/static/steal/getjs diff --git a/browserid/static/steal/js b/resources/static/steal/js similarity index 100% rename from browserid/static/steal/js rename to resources/static/steal/js diff --git a/browserid/static/steal/js.bat b/resources/static/steal/js.bat similarity index 100% rename from browserid/static/steal/js.bat rename to resources/static/steal/js.bat diff --git a/browserid/static/steal/less/less.js b/resources/static/steal/less/less.js similarity index 100% rename from browserid/static/steal/less/less.js rename to resources/static/steal/less/less.js diff --git a/browserid/static/steal/less/less.less b/resources/static/steal/less/less.less similarity index 100% rename from browserid/static/steal/less/less.less rename to resources/static/steal/less/less.less diff --git a/browserid/static/steal/less/less_engine.js b/resources/static/steal/less/less_engine.js similarity index 100% rename from browserid/static/steal/less/less_engine.js rename to resources/static/steal/less/less_engine.js diff --git a/browserid/static/steal/less/less_test.js b/resources/static/steal/less/less_test.js similarity index 100% rename from browserid/static/steal/less/less_test.js rename to resources/static/steal/less/less_test.js diff --git a/browserid/static/steal/less/qunit.html b/resources/static/steal/less/qunit.html similarity index 100% rename from browserid/static/steal/less/qunit.html rename to resources/static/steal/less/qunit.html diff --git a/browserid/static/steal/make.js b/resources/static/steal/make.js similarity index 100% rename from browserid/static/steal/make.js rename to resources/static/steal/make.js diff --git a/browserid/static/steal/parse/parse.js b/resources/static/steal/parse/parse.js similarity index 100% rename from browserid/static/steal/parse/parse.js rename to resources/static/steal/parse/parse.js diff --git a/browserid/static/steal/parse/parse_test.js b/resources/static/steal/parse/parse_test.js similarity index 100% rename from browserid/static/steal/parse/parse_test.js rename to resources/static/steal/parse/parse_test.js diff --git a/browserid/static/steal/parse/test/stealCode1.js b/resources/static/steal/parse/test/stealCode1.js similarity index 100% rename from browserid/static/steal/parse/test/stealCode1.js rename to resources/static/steal/parse/test/stealCode1.js diff --git a/browserid/static/steal/parse/test/testCode.js b/resources/static/steal/parse/test/testCode.js similarity index 100% rename from browserid/static/steal/parse/test/testCode.js rename to resources/static/steal/parse/test/testCode.js diff --git a/browserid/static/steal/parse/tokens.js b/resources/static/steal/parse/tokens.js similarity index 100% rename from browserid/static/steal/parse/tokens.js rename to resources/static/steal/parse/tokens.js diff --git a/browserid/static/steal/patchfile b/resources/static/steal/patchfile similarity index 100% rename from browserid/static/steal/patchfile rename to resources/static/steal/patchfile diff --git a/browserid/static/steal/pluginifyjs b/resources/static/steal/pluginifyjs similarity index 100% rename from browserid/static/steal/pluginifyjs rename to resources/static/steal/pluginifyjs diff --git a/browserid/static/steal/rhino/blank.html b/resources/static/steal/rhino/blank.html similarity index 100% rename from browserid/static/steal/rhino/blank.html rename to resources/static/steal/rhino/blank.html diff --git a/browserid/static/steal/rhino/build.js b/resources/static/steal/rhino/build.js similarity index 100% rename from browserid/static/steal/rhino/build.js rename to resources/static/steal/rhino/build.js diff --git a/browserid/static/steal/rhino/docs.js b/resources/static/steal/rhino/docs.js similarity index 100% rename from browserid/static/steal/rhino/docs.js rename to resources/static/steal/rhino/docs.js diff --git a/browserid/static/steal/rhino/empty.html b/resources/static/steal/rhino/empty.html similarity index 100% rename from browserid/static/steal/rhino/empty.html rename to resources/static/steal/rhino/empty.html diff --git a/browserid/static/steal/rhino/env.js b/resources/static/steal/rhino/env.js similarity index 100% rename from browserid/static/steal/rhino/env.js rename to resources/static/steal/rhino/env.js diff --git a/browserid/static/steal/rhino/file.js b/resources/static/steal/rhino/file.js similarity index 100% rename from browserid/static/steal/rhino/file.js rename to resources/static/steal/rhino/file.js diff --git a/browserid/static/steal/rhino/js.jar b/resources/static/steal/rhino/js.jar similarity index 100% rename from browserid/static/steal/rhino/js.jar rename to resources/static/steal/rhino/js.jar diff --git a/browserid/static/steal/rhino/loader b/resources/static/steal/rhino/loader similarity index 100% rename from browserid/static/steal/rhino/loader rename to resources/static/steal/rhino/loader diff --git a/browserid/static/steal/rhino/loader.bat b/resources/static/steal/rhino/loader.bat similarity index 100% rename from browserid/static/steal/rhino/loader.bat rename to resources/static/steal/rhino/loader.bat diff --git a/browserid/static/steal/rhino/loader.js b/resources/static/steal/rhino/loader.js similarity index 100% rename from browserid/static/steal/rhino/loader.js rename to resources/static/steal/rhino/loader.js diff --git a/browserid/static/steal/rhino/prompt.js b/resources/static/steal/rhino/prompt.js similarity index 100% rename from browserid/static/steal/rhino/prompt.js rename to resources/static/steal/rhino/prompt.js diff --git a/browserid/static/steal/rhino/steal.js b/resources/static/steal/rhino/steal.js similarity index 100% rename from browserid/static/steal/rhino/steal.js rename to resources/static/steal/rhino/steal.js diff --git a/browserid/static/steal/rhino/test.js b/resources/static/steal/rhino/test.js similarity index 100% rename from browserid/static/steal/rhino/test.js rename to resources/static/steal/rhino/test.js diff --git a/browserid/static/steal/rhino/utils.js b/resources/static/steal/rhino/utils.js similarity index 100% rename from browserid/static/steal/rhino/utils.js rename to resources/static/steal/rhino/utils.js diff --git a/browserid/static/steal/steal.js b/resources/static/steal/steal.js similarity index 100% rename from browserid/static/steal/steal.js rename to resources/static/steal/steal.js diff --git a/browserid/static/steal/steal.production.js b/resources/static/steal/steal.production.js similarity index 100% rename from browserid/static/steal/steal.production.js rename to resources/static/steal/steal.production.js diff --git a/browserid/static/steal/test/absoluteurl.html b/resources/static/steal/test/absoluteurl.html similarity index 100% rename from browserid/static/steal/test/absoluteurl.html rename to resources/static/steal/test/absoluteurl.html diff --git a/browserid/static/steal/test/absoluteurl/absoluteurl.js b/resources/static/steal/test/absoluteurl/absoluteurl.js similarity index 100% rename from browserid/static/steal/test/absoluteurl/absoluteurl.js rename to resources/static/steal/test/absoluteurl/absoluteurl.js diff --git a/browserid/static/steal/test/absoluteurl/alert.js b/resources/static/steal/test/absoluteurl/alert.js similarity index 100% rename from browserid/static/steal/test/absoluteurl/alert.js rename to resources/static/steal/test/absoluteurl/alert.js diff --git a/browserid/static/steal/test/another/two.js b/resources/static/steal/test/another/two.js similarity index 100% rename from browserid/static/steal/test/another/two.js rename to resources/static/steal/test/another/two.js diff --git a/browserid/static/steal/test/envjs/qunit.html b/resources/static/steal/test/envjs/qunit.html similarity index 100% rename from browserid/static/steal/test/envjs/qunit.html rename to resources/static/steal/test/envjs/qunit.html diff --git a/browserid/static/steal/test/envjs/qunit.js b/resources/static/steal/test/envjs/qunit.js similarity index 100% rename from browserid/static/steal/test/envjs/qunit.js rename to resources/static/steal/test/envjs/qunit.js diff --git a/browserid/static/steal/test/funcunit.html b/resources/static/steal/test/funcunit.html similarity index 100% rename from browserid/static/steal/test/funcunit.html rename to resources/static/steal/test/funcunit.html diff --git a/browserid/static/steal/test/funcunit/funcunit.js b/resources/static/steal/test/funcunit/funcunit.js similarity index 100% rename from browserid/static/steal/test/funcunit/funcunit.js rename to resources/static/steal/test/funcunit/funcunit.js diff --git a/browserid/static/steal/test/funcunit/steal_test.js b/resources/static/steal/test/funcunit/steal_test.js similarity index 100% rename from browserid/static/steal/test/funcunit/steal_test.js rename to resources/static/steal/test/funcunit/steal_test.js diff --git a/browserid/static/steal/test/one/four.js b/resources/static/steal/test/one/four.js similarity index 100% rename from browserid/static/steal/test/one/four.js rename to resources/static/steal/test/one/four.js diff --git a/browserid/static/steal/test/one/one.js b/resources/static/steal/test/one/one.js similarity index 100% rename from browserid/static/steal/test/one/one.js rename to resources/static/steal/test/one/one.js diff --git a/browserid/static/steal/test/qunit.html b/resources/static/steal/test/qunit.html similarity index 100% rename from browserid/static/steal/test/qunit.html rename to resources/static/steal/test/qunit.html diff --git a/browserid/static/steal/test/qunit/one.css b/resources/static/steal/test/qunit/one.css similarity index 100% rename from browserid/static/steal/test/qunit/one.css rename to resources/static/steal/test/qunit/one.css diff --git a/browserid/static/steal/test/qunit/qunit.js b/resources/static/steal/test/qunit/qunit.js similarity index 100% rename from browserid/static/steal/test/qunit/qunit.js rename to resources/static/steal/test/qunit/qunit.js diff --git a/browserid/static/steal/test/qunit/steal_test.js b/resources/static/steal/test/qunit/steal_test.js similarity index 100% rename from browserid/static/steal/test/qunit/steal_test.js rename to resources/static/steal/test/qunit/steal_test.js diff --git a/browserid/static/steal/test/run.js b/resources/static/steal/test/run.js similarity index 100% rename from browserid/static/steal/test/run.js rename to resources/static/steal/test/run.js diff --git a/browserid/static/steal/test/steal.html b/resources/static/steal/test/steal.html similarity index 100% rename from browserid/static/steal/test/steal.html rename to resources/static/steal/test/steal.html diff --git a/browserid/static/steal/test/test.js b/resources/static/steal/test/test.js similarity index 100% rename from browserid/static/steal/test/test.js rename to resources/static/steal/test/test.js diff --git a/browserid/static/steal/test/three.js b/resources/static/steal/test/three.js similarity index 100% rename from browserid/static/steal/test/three.js rename to resources/static/steal/test/three.js diff --git a/browserid/static/steal/test/two.css b/resources/static/steal/test/two.css similarity index 100% rename from browserid/static/steal/test/two.css rename to resources/static/steal/test/two.css diff --git a/browserid/static/steal/update b/resources/static/steal/update similarity index 100% rename from browserid/static/steal/update rename to resources/static/steal/update diff --git a/browserid/views/about.ejs b/resources/views/about.ejs similarity index 100% rename from browserid/views/about.ejs rename to resources/views/about.ejs diff --git a/browserid/views/dialog.ejs b/resources/views/dialog.ejs similarity index 100% rename from browserid/views/dialog.ejs rename to resources/views/dialog.ejs diff --git a/browserid/views/dialog_layout.ejs b/resources/views/dialog_layout.ejs similarity index 100% rename from browserid/views/dialog_layout.ejs rename to resources/views/dialog_layout.ejs diff --git a/browserid/views/forgot.ejs b/resources/views/forgot.ejs similarity index 100% rename from browserid/views/forgot.ejs rename to resources/views/forgot.ejs diff --git a/browserid/views/index.ejs b/resources/views/index.ejs similarity index 100% rename from browserid/views/index.ejs rename to resources/views/index.ejs diff --git a/browserid/views/layout.ejs b/resources/views/layout.ejs similarity index 100% rename from browserid/views/layout.ejs rename to resources/views/layout.ejs diff --git a/browserid/views/privacy.ejs b/resources/views/privacy.ejs similarity index 100% rename from browserid/views/privacy.ejs rename to resources/views/privacy.ejs diff --git a/browserid/views/relay.ejs b/resources/views/relay.ejs similarity index 100% rename from browserid/views/relay.ejs rename to resources/views/relay.ejs diff --git a/browserid/views/signin.ejs b/resources/views/signin.ejs similarity index 100% rename from browserid/views/signin.ejs rename to resources/views/signin.ejs diff --git a/browserid/views/signup.ejs b/resources/views/signup.ejs similarity index 100% rename from browserid/views/signup.ejs rename to resources/views/signup.ejs diff --git a/browserid/views/tos.ejs b/resources/views/tos.ejs similarity index 100% rename from browserid/views/tos.ejs rename to resources/views/tos.ejs diff --git a/browserid/views/unsupported_dialog.ejs b/resources/views/unsupported_dialog.ejs similarity index 100% rename from browserid/views/unsupported_dialog.ejs rename to resources/views/unsupported_dialog.ejs diff --git a/browserid/views/verifyemail.ejs b/resources/views/verifyemail.ejs similarity index 100% rename from browserid/views/verifyemail.ejs rename to resources/views/verifyemail.ejs diff --git a/browserid/views/verifyuser.ejs b/resources/views/verifyuser.ejs similarity index 100% rename from browserid/views/verifyuser.ejs rename to resources/views/verifyuser.ejs diff --git a/rp/index2.html b/rp/index2.html deleted file mode 100644 index cdc25d3781af1b7fc01affcba7c6b7276833ed2c..0000000000000000000000000000000000000000 --- a/rp/index2.html +++ /dev/null @@ -1,141 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title> -BrowserID Relying Party -</title> -<link href='http://fonts.googleapis.com/css?family=Permanent+Marker' rel='stylesheet' type='text/css'> -<style type="text/css"> - -body { margin: auto; font: 13px/1.5 Helvetica, Arial, 'Liberation Sans', FreeSans, sans-serif; } -a:link, a:visited { font-style: italic; text-decoration: none; color: #008; } -a:hover { border-bottom: 2px solid black ; } -.number { font-family: 'Permanent Marker', arial, serif; font-size: 4em; float: left; padding: 0; margin: 0; vertical-align: top; width: 1.3em} -.title { font-size: 2em; font-weight: bold; text-align: center; margin: 1.5em; } -.intro { font-size: 1.2em; width: 600px; margin: auto; } -.step { width: 600px; margin: auto; margin-top: 1em;} -.desc { padding-top: 1.5em; min-height: 4.5em;} -.output { - font-family: 'lucida console', monaco, 'andale mono', 'bitstream vera sans mono', consolas, monospace; - border: 3px solid #666; - -moz-border-radius: 4px; - -webkit-border-radius: 4px; - border-radius: 4px; - padding: .5em; - margin: .5em; - color: #ccc; - background-color: #333; -/* white-space: pre;*/ - font-size: .9em; - width:600px; - word-wrap: break-word; -} - -</style> -</head> -<body> -<div class="title"> - Example BrowserID Relying Party - Specific Identity -</div> - -<div class="intro"> - This is the simplest possible (stateless, static, client-only) BrowserID Relying Party. It - demonstrates the steps required to use BrowserID to verify the identity of a user.<br /> - <a id="tokenGetter" href="#">Click here to preauth</a>. <span id="token"></span><br /> - <a id="badpartyStarter" href="#">Click here to kick off the bad party</a>.<br /> - <a id="partyStarter" href="#">Click here to kick off the party</a>.<br /> Here's what will happen: -</div> - -<div class="step"> - <div class="number">1.</div> - <div class="desc"><b>Browser Interaction:</b> Upon clicking the link above, the webpage will call <tt>navigator.id.getSpecificVerifiedEmail()</tt> to indicate to the browser that it would like an identity for the user</div> -</div> - -<div class="step"> - <div class="number">2.</div> - <div class="desc"><b>User Interaction:</b> The browser will spawn a dialog that the user can interact with the select what identity they want to provide to the site </div> -</div> - -<div class="step"> - <div class="number">3.</div> - <div class="desc"><b>Assertion Generation:</b> Upon selection of an identity, an <i>assertion</i> will be returned to the webpage via a callback, it looks like this: </div> - <div class="output" id="oAssertion">...waiting for party commencement...</div> -</div> - -<div class="step"> - <div class="number">4.</div> - <div class="desc"><b>Assertion Verification:</b> This site can then send that assertion up to a <i>verification server</i> which cryptographically checks that the identity embedded in the verification actually belongs to the browser in use by the monkey at the keyboard. The request looks like </div> - <div class="output" id="oVerificationRequest">...waiting for party commencement...</div> -</div> - -<div class="step"> - <div class="number">5.</div> - <div class="desc"><b>Verification Response</b>: The verification server responds to the site to tell it whether or not the verification blob is valid:</div> - <div class="output" id="oVerificationResponse">...waiting for party commencement...</div> -</div> - -<div class="step"> - <div class="number">6.</div> - <div class="desc"><b>All Done!</b> The site can now create an account keyed on the users identity (email address), set cookies, etc! Signing in again is just re-running these same steps.</div> -</div> - -</body> -<script src="jquery-min.js"></script> -<script src="https://browserid.org/include.js"></script> -<script> - function dumpObject(obj) { - var htmlRep = ""; - for (var k in obj) { - if (obj.hasOwnProperty(k) && typeof obj[k] === 'string') { - htmlRep += "<b>" + k + ":</b> " + obj[k] + "<br/>"; - } else if (k === 'valid-until') { - htmlRep += "<b>" + k + ":</b> " + (new Date(obj[k])).toString() + "<br/>"; - } - - } - return htmlRep; - } - - function start_the_party(email, token) { - navigator.id.getSpecificVerifiedEmail(email, token, function(assertion) { - // Now we'll send this assertion over to the verification server for validation - $("#oAssertion").empty().html(dumpObject(assertion)); - - var url = "http://browserid.org/verify?assertion=" + window.encodeURIComponent(assertion) + - "&audience=" + window.encodeURIComponent("rp.eyedee.me"); - $("#oVerificationRequest").empty().text(url); - - $.ajax({ - url: url, - success: function(data, textStatus, jqXHR) { - $("#oVerificationResponse").empty().text(JSON.stringify(data, null, 4)); - }, - error: function(jqXHR, textStatus, errorThrown) { - $("#oVerificationResponse").empty().text(jqXHR.responseText); - } - }) - }, function(code, msg) { - alert("something very bad happened! ("+code+"): " + msg); - }); - } - - $(document).ready(function() { - var GUID = null; - $("#tokenGetter").click(function() { - navigator.id.preauthEmail("ben@adida.net", function(guid) { - $('#token').html(guid); - GUID=guid; - }); - }); - - $("#partyStarter").click(function() { - start_the_party('ben@adida.net', GUID); - }); - - $("#badpartyStarter").click(function() { - start_the_party('ben2@adida.net', GUID); - }); - }); -</script> - -</html> diff --git a/run.js b/run.js deleted file mode 100755 index 0d82815313779d4df0fe965102506067b9801eaa..0000000000000000000000000000000000000000 --- a/run.js +++ /dev/null @@ -1,189 +0,0 @@ -#!/usr/bin/env node - -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Mozilla BrowserID. - * - * The Initial Developer of the Original Code is Mozilla. - * Portions created by the Initial Developer are Copyright (C) 2011 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -// a little node webserver designed to run the unit tests herein - -var sys = require("sys"), - http = require("http"), - url = require("url"), - path = require("path"), - fs = require("fs"), - express = require("express"), -substitution = require('./libs/substitute.js'); - -// when running under the harness, let's also output log messages to the terminal -require('./libs/logging.js').enableConsoleLogging(); - -var configuration = require('./libs/configuration.js'); - -var PRIMARY_HOST = process.env.IP_ADDRESS || "127.0.0.1"; - -var boundServers = [ ]; - -var subs = undefined; -function substitutionMiddleware(req, resp, next) { - if (!subs) { - subs = { }; - for (var i = 0; i < boundServers.length; i++) { - var o = boundServers[i] - var a = o.server.address(); - var from = o.name; - var to = "http://" + a.address + ":" + a.port; - subs[from] = to; - - // now do another replacement to catch bare hostnames sans http(s) - // and explicit cases where port is appended - var fromWithPort; - if (from.substr(0,5) === 'https') { - from = from.substr(8); - fromWithPort = from + ":443"; - } else { - from = from.substr(7); - fromWithPort = from + ":80"; - } - to = to.substr(7); - - if (o.subPath) to += o.subPath; - - subs[fromWithPort] = to; - subs[from] = to; - } - } - (substitution.substitute(subs))(req, resp, next); -} - -function createServer(obj) { - var app = express.createServer(); - - // this file is a *test* harness, to make it go, we'll insert a little - // handler that substitutes output, changing production URLs to - // developement URLs. - app.use(substitutionMiddleware); - - // let the specific server interact directly with the express server to - // register their middleware, routes, etc... - if (obj.setup) obj.setup(app); - - // now set up the static resource servin' - var p = obj.path, ps = path.join(p, "static"); - try { if (fs.statSync(ps).isDirectory()) p = ps; } catch(e) { } - app.use(express.static(p)); - - // and listen! - app.listen(obj.port, PRIMARY_HOST); - return app; -}; - -// start up webservers on ephemeral ports for each subdirectory here. -var dirs = [ - // the reference verification server. A version is hosted at - // browserid.org and may be used, or the RP may perform their - // own verification. - { - name: "https://browserid.org/verify", - subPath: "/", - path: path.join(__dirname, "verifier") - }, - // An example relying party. - { - name: "http://rp.eyedee.me", - path: path.join(__dirname, "rp") - }, - - // BrowserID: the secondary + ip + more. - { - name: "https://browserid.org", - path: path.join(__dirname, "browserid") - } -]; - -function formatLink(server, extraPath) { - var addr = server.address(); - var url = 'http://' + addr.address + ':' + addr.port; - if (extraPath) { - url += extraPath; - } - return url; -} - -console.log("Running test servers:"); - -var port_num=10000; -dirs.forEach(function(dirObj) { - if (!fs.statSync(dirObj.path).isDirectory()) return; - // does this server have a js handler for custom request handling? - var handlerPath = path.join(dirObj.path, "app.js"); - var runJS = {}; - try { - var runJSExists = false; - try { runJSExists = fs.statSync(handlerPath).isFile() } catch(e) {}; - if (runJSExists) runJS = require(handlerPath); - } catch(e) { - console.log("Error loading " + handlerPath + ": " + e); - process.exit(1); - } - - var so = { - path: dirObj.path, - server: undefined, - port: port_num++, - name: dirObj.name, - handler: runJS.handler, - setup: runJS.setup, - shutdown: runJS.shutdown, - subPath: dirObj.subPath - }; - so.server = createServer(so) - boundServers.push(so); - console.log(" " + dirObj.name + ": " + formatLink(so.server)); -}); - -process.on('SIGINT', function () { - console.log('\nSIGINT recieved! trying to shut down gracefully...'); - boundServers.forEach(function(bs) { - if (bs.shutdown) bs.shutdown(); - bs.server.on('close', function() { - console.log("server shutdown,", bs.server.connections, "connections still open..."); - }); - bs.server.close(); - }); - // exit more harshly in 700ms - setTimeout(function() { - console.log("exiting..."); - process.exit(0); - }, 700); -}); diff --git a/browserid.spec b/scripts/browserid.spec similarity index 100% rename from browserid.spec rename to scripts/browserid.spec diff --git a/browserid/compress.sh b/scripts/compress.sh similarity index 93% rename from browserid/compress.sh rename to scripts/compress.sh index 761edbf14317e3b72540919e39c44b002c1b54e2..4ef16ff38447d650e359a7c9b99bb533b99047f3 100755 --- a/browserid/compress.sh +++ b/scripts/compress.sh @@ -1,5 +1,7 @@ #!/bin/sh +cd $(dirname "$0")/.. + UGLIFY=`which uglifyjs 2> /dev/null` if [ ! -x "$UGLIFY" ]; then echo "uglifyjs not found in your path. can't create production resources. disaster." @@ -12,13 +14,13 @@ if [ ! -x "$JAVA" ]; then exit 1 fi -YUI_LOCATION=`pwd`'/static/steal/build/scripts/yui.jar' +YUI_LOCATION=`pwd`'/resources/static/steal/build/scripts/yui.jar' echo '' echo '****Compressing include.js****' echo '' -cd static +cd resources/static mv include.js include.orig.js $UGLIFY include.orig.js > include.js diff --git a/scripts/rpmbuild.sh b/scripts/rpmbuild.sh index c7caae8cd57330e18d3f5b337e14a50def13467d..46f30b1eeea913a6d94135524d19fbccd6e7db77 100755 --- a/scripts/rpmbuild.sh +++ b/scripts/rpmbuild.sh @@ -20,7 +20,7 @@ tar -C .. --exclude rpmbuild -czf \ set +e -rpmbuild --define "_topdir $PWD/rpmbuild" -ba browserid.spec +rpmbuild --define "_topdir $PWD/rpmbuild" -ba scripts/browserid.spec rc=$? if [ $rc -eq 0 ]; then ls -l $PWD/rpmbuild/RPMS/*/*.rpm diff --git a/scripts/run_all_tests.sh b/scripts/run_all_tests.sh index ed6ab62f2f1afaa86b8cfe1974258dddb0e0d0bc..3976cd66fab79b019c05aa4c05f6cbfee37cccb8 100755 --- a/scripts/run_all_tests.sh +++ b/scripts/run_all_tests.sh @@ -16,9 +16,9 @@ cd $BASEDIR for env in test_json test_mysql ; do export NODE_ENV=$env $SCRIPT_DIR/test_db_connectivity.js - if [ $? = 0 ] ; then + if [ $? = 0 ] ; then echo "Testing with NODE_ENV=$env" - for file in browserid/tests/*.js ; do + for file in tests/*.js ; do echo $file vows $file if [[ $? != 0 ]] ; then diff --git a/scripts/run_locally.js b/scripts/run_locally.js new file mode 100755 index 0000000000000000000000000000000000000000..75453824b8b78656c86b8315532bbf4eafe7e9c3 --- /dev/null +++ b/scripts/run_locally.js @@ -0,0 +1,70 @@ +#!/usr/bin/env node + +const +spawn = require('child_process').spawn, +path = require('path'); + +exports.daemons = daemons = {}; + +const HOST = process.env['IP_ADDRESS'] || process.env['HOST'] || "127.0.0.1"; + +var daemonsToRun = { + verifier: { + PORT: 10000, + HOST: HOST + }, + browserid: { + PORT: 10002, + HOST: HOST + }, + example: { + path: path.join(__dirname, "..", "scripts", "serve_example.js"), + PORT: 10001 + } +}; + +// all spawned processes should log to console +process.env['LOG_TO_CONSOLE'] = 1; + +// all spawned processes will communicate with the local browserid +process.env['BROWSERID_URL'] = 'http://' + HOST + ":10002"; +process.env['VERIFIER_URL'] = 'http://' + HOST + ":10000/verify"; + +Object.keys(daemonsToRun).forEach(function(k) { + Object.keys(daemonsToRun[k]).forEach(function(ek) { + process.env[ek] = daemonsToRun[k][ek]; + }); + var pathToScript = daemonsToRun[k].path || path.join(__dirname, "..", "bin", k); + var p = spawn('node', [ pathToScript ]); + + function dump(d) { + d.toString().split('\n').forEach(function(d) { + if (d.length === 0) return; + console.log(k, '(' + p.pid + '):', d); + }); + } + + p.stdout.on('data', dump); + p.stderr.on('data', dump); + + console.log("spawned", k, "("+pathToScript+") with pid", p.pid); + Object.keys(daemonsToRun[k]).forEach(function(ek) { + delete process.env[ek]; + }); + + daemons[k] = p; + + p.on('exit', function (code, signal) { + console.log(k, 'exited with code', code, (signal ? 'on signal ' + signal : "")); + delete daemons[k]; + Object.keys(daemons).forEach(function (k) { daemons[k].kill(); }); + if (Object.keys(daemons).length === 0) { + console.log("all daemons torn down, exiting..."); + } + }); +}); + +process.on('SIGINT', function () { + console.log('\nSIGINT recieved! trying to shut down gracefully...'); + Object.keys(daemons).forEach(function (k) { daemons[k].kill('SIGINT'); }); +}); diff --git a/scripts/serve_example.js b/scripts/serve_example.js new file mode 100755 index 0000000000000000000000000000000000000000..904081830eca2f7392ede8c1d7434c488d402b01 --- /dev/null +++ b/scripts/serve_example.js @@ -0,0 +1,31 @@ +#!/usr/bin/env node + +// finally, let's run a tiny webserver for the example code. +const +express = require('express'), +path = require('path'), +urlparse = require('urlparse'), +postprocess = require('postprocess'); + +var exampleServer = express.createServer(); + +exampleServer.use(express.logger()); + +if (process.env['BROWSERID_URL']) { + var burl = urlparse(process.env['BROWSERID_URL']).validate().normalize().originOnly().toString(); + console.log('using browserid server at ' + burl); + + exampleServer.use(postprocess.middleware(function(req, buffer) { + return buffer.toString().replace(new RegExp('https://browserid.org', 'g'), burl); + })); +} + +exampleServer.use(express.static(path.join(__dirname, "..", "example"))); + +exampleServer.listen( + process.env['PORT'] || 10001, + process.env['HOST'] || process.env['IP_ADDRESS'] || "127.0.0.1", + function() { + var addy = exampleServer.address(); + console.log("http://" + addy.address + ":" + addy.port); + }); diff --git a/scripts/test_db_connectivity.js b/scripts/test_db_connectivity.js index 2a446931742ee6b531700c78839d835acaee104c..acdfdad023c69204e2a8838fc5e734d9c9e0427e 100755 --- a/scripts/test_db_connectivity.js +++ b/scripts/test_db_connectivity.js @@ -4,8 +4,8 @@ // the database using the present configuration. const -configuration = require('../libs/configuration.js'), -db = require('../browserid/lib/db.js'); +configuration = require('../lib/configuration.js'), +db = require('../lib/db.js'); var dbCfg = configuration.get('database'); diff --git a/browserid/tests/ca-test.js b/tests/ca-test.js similarity index 97% rename from browserid/tests/ca-test.js rename to tests/ca-test.js index 2dfd984ee4120a048df26965b0b3537c76941316..c990798d0e1439fb3ba835171b27e6bafaac4742 100755 --- a/browserid/tests/ca-test.js +++ b/tests/ca-test.js @@ -41,8 +41,8 @@ const assert = require('assert'), vows = require('vows'), start_stop = require('./lib/start-stop.js'), wsapi = require('./lib/wsapi.js'), -email = require('../lib/email.js'), -ca = require('../lib/ca.js'), +email = require('browserid/email.js'), +ca = require('browserid/ca.js'), jwcert = require('jwcrypto/jwcert'), jwk = require('jwcrypto/jwk'), jws = require('jwcrypto/jws'); diff --git a/browserid/tests/cert-emails-test.js b/tests/cert-emails-test.js similarity index 90% rename from browserid/tests/cert-emails-test.js rename to tests/cert-emails-test.js index 2b3ef1cafe5b7229983a55dca63725dcf146f07c..b8e353fe3057b5829c60bfb901199f23ed9257a3 100755 --- a/browserid/tests/cert-emails-test.js +++ b/tests/cert-emails-test.js @@ -41,8 +41,8 @@ const assert = require('assert'), vows = require('vows'), start_stop = require('./lib/start-stop.js'), wsapi = require('./lib/wsapi.js'), -email = require('../lib/email.js'), -ca = require('../lib/ca.js'), +email = require('browserid/email.js'), +ca = require('browserid/ca.js'), jwcert = require('jwcrypto/jwcert'), jwk = require('jwcrypto/jwk'), jws = require('jwcrypto/jws'), @@ -58,21 +58,36 @@ start_stop.addStartupBatches(suite); // ever time a new token is sent out, let's update the global // var 'token' var token = undefined; -email.setInterceptor(function(email, site, secret) { token = secret; }); +start_stop.browserid.on('token', function(secret) { + token = secret; +}); // INFO: some of these tests are repeat of sync-emails... to set // things up properly for key certification // create a new account via the api with (first address) suite.addBatch({ - "stage an account": { + "staging an account": { topic: wsapi.post('/wsapi/stage_user', { email: 'syncer@somehost.com', pubkey: 'fakekey', site:'fakesite.com' }), - "yields a sane token": function(r, err) { - assert.strictEqual(typeof token, 'string'); + "succeeds": function(r, err) { + assert.strictEqual(r.code, 200); + } + } +}); + +// wait for the token +suite.addBatch({ + "a token": { + topic: function() { + if (token) return token; + else start_stop.browserid.once('token', this.callback); + }, + "is obtained": function (t) { + assert.strictEqual(typeof t, 'string'); } } }); @@ -112,13 +127,13 @@ suite.addBatch({ assert.strictEqual(r.code, 400); } }, - "cert key invoked with just an email": { + "cert key invoked with just an email": { topic: wsapi.post(cert_key_url, { email: 'syncer@somehost.com' }), "returns a 400" : function(r, err) { assert.strictEqual(r.code, 400); } }, - "cert key invoked with proper argument": { + "cert key invoked with proper argument": { topic: wsapi.post(cert_key_url, { email: 'syncer@somehost.com', pubkey: kp.publicKey.serialize() }), "returns a response with a proper content-type" : function(r, err) { assert.strictEqual(r.code, 200); diff --git a/browserid/tests/cookie-session-security-test.js b/tests/cookie-session-security-test.js similarity index 96% rename from browserid/tests/cookie-session-security-test.js rename to tests/cookie-session-security-test.js index 3a1d18817dd5a44f2d73c27099c7ffd088de1624..dad6e25452b47e29e050ecd97b2177153f5582c6 100755 --- a/browserid/tests/cookie-session-security-test.js +++ b/tests/cookie-session-security-test.js @@ -41,9 +41,9 @@ const assert = require('assert'), vows = require('vows'), start_stop = require('./lib/start-stop.js'), wsapi = require('./lib/wsapi.js'), -wcli = require('../../libs/wsapi_client'); -email = require('../lib/email.js'), -ca = require('../lib/ca.js'), +wcli = require('wsapi_client'); +email = require('browserid/email.js'), +ca = require('browserid/ca.js'), jwcert = require('jwcrypto/jwcert'), jwk = require('jwcrypto/jwk'), jws = require('jwcrypto/jws'); diff --git a/browserid/tests/db-test.js b/tests/db-test.js similarity index 98% rename from browserid/tests/db-test.js rename to tests/db-test.js index c4c1136bf02850e2ceab1989d8e198f9947973d1..6f7d92c5eabb7e658747d877ffc01e93dbcfaa3d 100755 --- a/browserid/tests/db-test.js +++ b/tests/db-test.js @@ -37,19 +37,22 @@ require('./lib/test_env.js'); +// add lib/ to the require path + const assert = require('assert'), vows = require('vows'), -db = require('../lib/db.js'), fs = require('fs'), path = require('path'), -configuration = require('../../libs/configuration.js'); +db = require('db.js'), +configuration = require('configuration.js'); var suite = vows.describe('db'); // disable vows (often flakey?) async error behavior suite.options.error = false; var dbCfg = configuration.get('database'); +dbCfg.drop_on_close = true; suite.addBatch({ "onReady": { @@ -192,7 +195,7 @@ suite.addBatch({ db.isStaged('lloyd@somewhe.re', function(r) { cb(secret, r); }); }, "makes it visible via isStaged": function(sekret, r) { assert.isTrue(r); }, - "and lets you verify it": { + "lets you verify it": { topic: function(secret, r) { db.gotVerificationSecret(secret, undefined, this.callback); }, diff --git a/browserid/tests/forgotten-email-test.js b/tests/forgotten-email-test.js similarity index 84% rename from browserid/tests/forgotten-email-test.js rename to tests/forgotten-email-test.js index 8fa595b469eec88174cfe2b9c08150dc8fcac0d5..87774f4a812059525096d799d5b843976cf491de 100755 --- a/browserid/tests/forgotten-email-test.js +++ b/tests/forgotten-email-test.js @@ -41,29 +41,39 @@ const assert = require('assert'), vows = require('vows'), start_stop = require('./lib/start-stop.js'), wsapi = require('./lib/wsapi.js'), -email = require('../lib/email.js'); +email = require('browserid/email.js'); var suite = vows.describe('forgotten-email'); -// disable vows (often flakey?) async error behavior -suite.options.error = false; - start_stop.addStartupBatches(suite); -// ever time a new token is sent out, let's update the global +// every time a new token is sent out, let's update the global // var 'token' var token = undefined; -email.setInterceptor(function(email, site, secret) { token = secret; }); // create a new account via the api with (first address) suite.addBatch({ - "stage first account": { + "staging an account": { topic: wsapi.post('/wsapi/stage_user', { email: 'first@fakeemail.com', site:'fakesite.com' }), - "the token is sane": function(r, err) { - assert.strictEqual('string', typeof token); + "works": function(r, err) { + assert.strictEqual(r.code, 200); + } + } +}); + +// wait for the token +suite.addBatch({ + "a token": { + topic: function() { + if (token) return token; + else start_stop.browserid.once('token', this.callback); + }, + "is obtained": function (t) { + assert.strictEqual(typeof t, 'string'); + token = t; } } }); @@ -76,6 +86,7 @@ suite.addBatch({ "account created": function(r, err) { assert.equal(r.code, 200); assert.strictEqual(true, JSON.parse(r.body).success); + token = undefined; } } }); @@ -97,8 +108,22 @@ suite.addBatch({ email: 'second@fakeemail.com', site:'fakesite.com' }), - "the token is sane": function(r, err) { - assert.strictEqual('string', typeof token); + "works": function(r, err) { + assert.strictEqual(r.code, 200); + } + } +}); + +// wait for the token +suite.addBatch({ + "a token": { + topic: function() { + if (token) return token; + else start_stop.browserid.once('token', this.callback); + }, + "is obtained": function (t) { + assert.strictEqual(typeof t, 'string'); + token = t; } } }); @@ -112,6 +137,7 @@ suite.addBatch({ "account created": function(r, err) { assert.equal(r.code, 200); assert.strictEqual(JSON.parse(r.body).success, true); + token = undefined; } } }); @@ -146,8 +172,22 @@ suite.addBatch({ email: 'first@fakeemail.com', site:'otherfakesite.com' }), - "the token is sane": function(r, err) { - assert.strictEqual('string', typeof token); + "works": function(r, err) { + assert.strictEqual(r.code, 200); + } + } +}); + +// wait for the token +suite.addBatch({ + "a token": { + topic: function() { + if (token) return token; + else start_stop.browserid.once('token', this.callback); + }, + "is obtained": function (t) { + assert.strictEqual(typeof t, 'string'); + token = t; } } }); diff --git a/tests/lib/start-stop.js b/tests/lib/start-stop.js new file mode 100644 index 0000000000000000000000000000000000000000..67b49c9dcb36a32e7d71b05e2bd90a41563afcdc --- /dev/null +++ b/tests/lib/start-stop.js @@ -0,0 +1,198 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla BrowserID. + * + * The Initial Developer of the Original Code is Mozilla. + * Portions created by the Initial Developer are Copyright (C) 2011 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +const +assert = require('assert'), +fs = require('fs'), +path = require('path'), +wsapi = require('./wsapi.js'), +spawn = require('child_process').spawn, +events = require('events'), +config = require('configuration'), +db = require('db'); + +var proc = undefined; + +process.on('exit', function () { + if (proc) { proc.kill(); } +}); + +exports.browserid = new events.EventEmitter; + +function setupProc(proc) { + var m, sentReady = false; + + proc.stdout.on('data', function(x) { +// console.log(x.toString()); + var tokenRegex = new RegExp('token=([A-Za-z0-9]+)$', 'm'); + + if (!sentReady && /^browserid.*127\.0\.0\.1:10002/.test(x)) { + exports.browserid.emit('ready'); + sentReady = true; + } else if (m = tokenRegex.exec(x)) { + exports.browserid.emit('token', m[1]); + } + }); +} + +function removeVarDir() { + try { + fs.readdirSync(varPath).forEach(function(f) { + fs.unlinkSync(path.join(varPath, f)); + }); + fs.rmdirSync(varPath); + } catch(e) {} +} + +exports.addStartupBatches = function(suite) { + + // disable vows (often flakey?) async error behavior + suite.options.error = false; + + // propogate our ephemeral database parameters down to + // child processes so that all process are communicating + // with the same db + suite.addBatch({ + "specifying an ephemeral database": { + topic: function() { + if (config.get('database').driver === 'mysql') { + process.env['MYSQL_DATABASE_NAME'] = config.get('database').database; + } else if (config.get('database').driver === 'json') { + process.env['JSON_DATABASE_PATH'] = config.get('database').path; + } + return true; + }, + "should work": function(x) { + var cfg = process.env['MYSQL_DATABASE_NAME'] || process.env['JSON_DATABASE_PATH']; + assert.equal(typeof cfg, 'string'); + } + } + }); + + suite.addBatch({ + "opening the database": { + topic: function() { + var cfg = config.get('database'); + cfg.drop_on_close = true; + db.open(cfg, this.callback); + }, + "should work fine": function(r) { + assert.isUndefined(r); + } + } + }); + + suite.addBatch({ + "run the server": { + topic: function() { + var pathToHarness = path.join(__dirname, '..', '..', 'scripts', 'run_locally.js'); + proc = spawn('node', [ pathToHarness ]) + setupProc(proc); + exports.browserid.on('ready', this.callback); + }, + "server should be running": { + topic: wsapi.get('/__heartbeat__'), + "server is running": function (r, err) { + assert.equal(r.code, 200); + assert.equal(r.body, 'ok'); + } + } + } + }); +}; + +exports.addRestartBatch = function(suite) { + // stop the server + suite.addBatch({ + "stop the server": { + topic: function() { + var cb = this.callback; + proc.kill('SIGINT'); + proc.on('exit', this.callback); + }, + "stopped": function(x) { + assert.strictEqual(x, 0); + } + } + }); + + suite.addBatch({ + "run the server": { + topic: function() { + var pathToHarness = path.join(__dirname, '..', '..', 'scripts', 'run_locally.js'); + proc = spawn('node', [ pathToHarness ]) + setupProc(proc); + exports.browserid.on('ready', this.callback); + }, + "server should be running": { + topic: wsapi.get('/__heartbeat__'), + "server is running": function (r, err) { + assert.equal(r.code, 200); + assert.equal(r.body, 'ok'); + } + } + } + }); + +}; + +exports.addShutdownBatches = function(suite) { + // stop the server + suite.addBatch({ + "stop the server": { + topic: function() { + var cb = this.callback; + proc.kill('SIGINT'); + proc.on('exit', this.callback); + }, + "stopped": function(x) { + assert.strictEqual(x, 0); + } + } + }); + + // clean up + suite.addBatch({ + "closing the database": { + topic: function() { + db.close(this.callback); + }, + "should work": function(err) { + assert.isUndefined(err); + } + } + }); +} + diff --git a/browserid/tests/lib/test_env.js b/tests/lib/test_env.js similarity index 96% rename from browserid/tests/lib/test_env.js rename to tests/lib/test_env.js index a98816c4ad723f88d2654b44b2e0acc972965bfc..9017cebc5152e551a731735391252584fe9379ce 100644 --- a/browserid/tests/lib/test_env.js +++ b/tests/lib/test_env.js @@ -44,4 +44,6 @@ if (undefined === process.env['NODE_ENV']) { process.env['NODE_ENV'] = 'test_json'; } else if (process.env['NODE_ENV'].substr(0,5) !== 'test_') { console.log("(Woah. Running tests without a test_ configuration. Is this *really* what you want?)"); -} +} + +require.paths.unshift(require('path').join(__dirname, '..', '..', 'lib')); diff --git a/browserid/tests/lib/wsapi.js b/tests/lib/wsapi.js similarity index 96% rename from browserid/tests/lib/wsapi.js rename to tests/lib/wsapi.js index a738c16cee4c71e8f68257444473d02a12affa82..92374727546475461031d317af049eaabf08221f 100644 --- a/browserid/tests/lib/wsapi.js +++ b/tests/lib/wsapi.js @@ -34,14 +34,14 @@ * ***** END LICENSE BLOCK ***** */ const -wcli = require('../../../libs/wsapi_client'); +wcli = require('wsapi_client'); // the client "context" var context = {}; // the configuration var configuration = { - browserid: 'http://127.0.0.1:62700/' + browserid: 'http://127.0.0.1:10001/' } exports.clearCookies = function() { diff --git a/browserid/tests/list-emails-wsapi-test.js b/tests/list-emails-wsapi-test.js similarity index 89% rename from browserid/tests/list-emails-wsapi-test.js rename to tests/list-emails-wsapi-test.js index e31480e25f5d263331a555bb646ea5b1cd415f9d..1cc60423148f69d2cdaf8cc3b1d90fb26f80f5ac 100755 --- a/browserid/tests/list-emails-wsapi-test.js +++ b/tests/list-emails-wsapi-test.js @@ -40,8 +40,7 @@ require('./lib/test_env.js'); const assert = require('assert'), vows = require('vows'), start_stop = require('./lib/start-stop.js'), -wsapi = require('./lib/wsapi.js'), -email = require('../lib/email.js'); +wsapi = require('./lib/wsapi.js'); var suite = vows.describe('forgotten-email'); @@ -53,7 +52,6 @@ start_stop.addStartupBatches(suite); // ever time a new token is sent out, let's update the global // var 'token' var token = undefined; -email.setInterceptor(function(email, site, secret) { token = secret; }); // create a new account via the api with (first address) suite.addBatch({ @@ -62,8 +60,22 @@ suite.addBatch({ email: 'syncer@somehost.com', site:'fakesite.com' }), - "yields a sane token": function(r, err) { - assert.strictEqual(typeof token, 'string'); + "works": function(r, err) { + assert.strictEqual(r.code, 200); + } + } +}); + +// wait for the token +suite.addBatch({ + "a token": { + topic: function() { + if (token) return token; + else start_stop.browserid.once('token', this.callback); + }, + "is obtained": function (t) { + assert.strictEqual(typeof t, 'string'); + token = t; } } }); @@ -76,6 +88,7 @@ suite.addBatch({ "works": function(r, err) { assert.equal(r.code, 200); assert.strictEqual(JSON.parse(r.body).success, true); + token = undefined; } } }); diff --git a/browserid/tests/page-requests-test.js b/tests/page-requests-test.js similarity index 99% rename from browserid/tests/page-requests-test.js rename to tests/page-requests-test.js index 156a0611df558716b6c3d25edbc8e8fd13c3679d..2a5b530e46fadb15eddb06682b1459ecddae8f20 100755 --- a/browserid/tests/page-requests-test.js +++ b/tests/page-requests-test.js @@ -48,12 +48,11 @@ var suite = vows.describe('page requests'); // start up a pristine server start_stop.addStartupBatches(suite); -// This set of tests check to make sure all of the expected pages are served -// up with the correct status codes. We use Lloyd's wsapi client as our REST +// This set of tests check to make sure all of the expected pages are served +// up with the correct status codes. We use Lloyd's wsapi client as our REST // interface. - // Taken from the vows page. function assertStatus(code) { return function (res, err) { diff --git a/browserid/tests/password-bcrypt-update-test.js b/tests/password-bcrypt-update-test.js similarity index 92% rename from browserid/tests/password-bcrypt-update-test.js rename to tests/password-bcrypt-update-test.js index d5693eeae05b6bdd67cca8a11bd3aece966c2471..ad0483652b4db4414215e6a7489fe062f0a7d065 100755 --- a/browserid/tests/password-bcrypt-update-test.js +++ b/tests/password-bcrypt-update-test.js @@ -42,9 +42,8 @@ require('assert'), vows = require('vows'), start_stop = require('./lib/start-stop.js'), wsapi = require('./lib/wsapi.js'), -email = require('../lib/email.js'), -db = require('../lib/db.js'), -config = require('../../libs/configuration.js'), +db = require('db.js'), +config = require('configuration.js'), bcrypt = require('bcrypt'); var suite = vows.describe('password-length'); @@ -59,9 +58,6 @@ const TEST_EMAIL = 'update@passwd.bcrypt', // surpress console output of emails with a noop email interceptor var token = undefined; -email.setInterceptor(function(email, site, secret) { - token = secret; -}); suite.addBatch({ "get csrf token": { @@ -89,6 +85,20 @@ suite.addBatch({ } }); +// wait for the token +suite.addBatch({ + "a token": { + topic: function() { + if (token) return token; + else start_stop.browserid.once('token', this.callback); + }, + "is obtained": function (t) { + assert.strictEqual(typeof t, 'string'); + token = t; + } + } +}); + // create a new account via the api with (first address) suite.addBatch({ "setting password": { @@ -121,13 +131,15 @@ suite.addBatch({ suite.addBatch({ "updating work factor": { topic: function() { - config.set('bcrypt_work_factor', 8); + process.env['BCRYPT_WORK_FACTOR'] = 8; return true; }, "succeeds": function() {} } }); +start_stop.addRestartBatch(suite); + // at authentication time we should see the password get updated suite.addBatch({ "re-authentication": { diff --git a/browserid/tests/password-length-test.js b/tests/password-length-test.js similarity index 97% rename from browserid/tests/password-length-test.js rename to tests/password-length-test.js index 6bd243cc478132e9c68231299a32a74f4b0715b7..055afd202e0f66e00acc59d5f5f5c465a6173dff 100755 --- a/browserid/tests/password-length-test.js +++ b/tests/password-length-test.js @@ -42,7 +42,7 @@ require('assert'), vows = require('vows'), start_stop = require('./lib/start-stop.js'), wsapi = require('./lib/wsapi.js'), -email = require('../lib/email.js'); +email = require('browserid/email.js'); var suite = vows.describe('password-length'); @@ -51,9 +51,11 @@ suite.options.error = false; start_stop.addStartupBatches(suite); -// surpress console output of emails with a noop email interceptor +// surpress console output of emails with a noop email intercepto var token = undefined; -email.setInterceptor(function(email, site, secret) { token = secret; }); +start_stop.browserid.on('token', function(secret) { + token = secret; +}); suite.addBatch({ "get csrf token": { @@ -79,7 +81,7 @@ suite.addBatch({ assert.equal(r.code, 200); } } -}) +}); // create a new account via the api with (first address) suite.addBatch({ @@ -113,7 +115,6 @@ suite.addBatch({ } } }); - start_stop.addShutdownBatches(suite); // run or export the suite. diff --git a/browserid/tests/registration-status-wsapi-test.js b/tests/registration-status-wsapi-test.js similarity index 90% rename from browserid/tests/registration-status-wsapi-test.js rename to tests/registration-status-wsapi-test.js index b4bc4be330d65e913d657740e413bd939152cdb1..e0d40aa7762a1062482d8954cd200bd3fa03e6b4 100755 --- a/browserid/tests/registration-status-wsapi-test.js +++ b/tests/registration-status-wsapi-test.js @@ -41,8 +41,7 @@ const assert = require('assert'), vows = require('vows'), start_stop = require('./lib/start-stop.js'), -wsapi = require('./lib/wsapi.js'), -email = require('../lib/email.js'); +wsapi = require('./lib/wsapi.js'); var suite = vows.describe('registration-status-wsapi'); @@ -52,7 +51,6 @@ var suite = vows.describe('registration-status-wsapi'); // ever time a new token is sent out, let's update the global // var 'token' var token = undefined; -email.setInterceptor(function(email, site, secret) {token = secret; }); // start up a pristine server start_stop.addStartupBatches(suite); @@ -82,10 +80,25 @@ suite.addBatch({ email: 'first@fakeemail.com', site:'fakesite.com' }), - "the token is sane": function(r, err) { - assert.strictEqual('string', typeof token); + "returns 200": function(r, err) { + assert.strictEqual(r.code, 200); + } + } +}); + +// wait for the token +suite.addBatch({ + "a token": { + topic: function() { + if (token) return token; + else start_stop.browserid.once('token', this.callback); + }, + "is obtained": function (t) { + assert.strictEqual(typeof t, 'string'); + token = t; } - }}); + } +}); suite.addBatch({ "comparing token to email": { @@ -129,6 +142,7 @@ suite.addBatch({ }, "works": function(r, err) { assert.equal(r.code, 200); + token = undefined; } } }); @@ -186,8 +200,22 @@ suite.addBatch({ email: 'first@fakeemail.com', site:'secondfakesite.com' }), - "yields a valid token": function(r, err) { - assert.strictEqual('string', typeof token); + "yields a HTTP 200": function (r, err) { + assert.strictEqual(r.code, 200); + } + } +}); + +// wait for the token +suite.addBatch({ + "a token": { + topic: function() { + if (token) return token; + else start_stop.browserid.once('token', this.callback); + }, + "is obtained": function (t) { + assert.strictEqual(typeof t, 'string'); + token = t; } } }); @@ -211,6 +239,7 @@ suite.addBatch({ }, "and returns a 200 code": function(r, err) { assert.equal(r.code, 200); + token = undefined; } } }); diff --git a/verifier/lib/httputils.js b/verifier/lib/httputils.js deleted file mode 100644 index f062b02f9ed12fc519e18f3a41037e47eca2b408..0000000000000000000000000000000000000000 --- a/verifier/lib/httputils.js +++ /dev/null @@ -1,65 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Mozilla BrowserID. - * - * The Initial Developer of the Original Code is Mozilla. - * Portions created by the Initial Developer are Copyright (C) 2011 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -// various little utilities to make crafting boilerplate responses -// simple - -exports.fourOhFour = function(resp, reason) -{ - resp.writeHead(404, {"Content-Type": "text/plain"}); - resp.write("Not Found"); - if (reason) { - resp.write(": " + reason); - } - resp.end(); -}; - -exports.serverError = function(resp, reason) -{ - resp.writeHead(500, {"Content-Type": "text/plain"}); - if (reason) resp.write(reason); - resp.end(); -}; - -exports.badRequest = function(resp, reason) -{ - resp.writeHead(400, {"Content-Type": "text/plain"}); - resp.write("Bad Request"); - if (reason) { - resp.write(": " + reason); - } - resp.end(); -}; - diff --git a/verifier/run.js b/verifier/run.js deleted file mode 100755 index 3c93845cef5995e116f6cf0e3937f0c835f124f3..0000000000000000000000000000000000000000 --- a/verifier/run.js +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/env node - -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Mozilla BrowserID. - * - * The Initial Developer of the Original Code is Mozilla. - * Portions created by the Initial Developer are Copyright (C) 2011 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -var sys = require("sys"), - path = require("path"), - fs = require("fs"), - express = require("express"); - -var PRIMARY_HOST = "127.0.0.1"; -var PRIMARY_PORT = 62800; - -var handler = require("./app.js"); - -var app = express.createServer(); - -// let the specific server interact directly with the express server to register their middleware -if (handler.setup) handler.setup(app); - -app.listen(PRIMARY_PORT, PRIMARY_HOST); diff --git a/verifier/test/certassertion-test.js b/verifier/test/certassertion-test.js deleted file mode 100644 index 24edbead4e003185e41a33d3f8b354f6d85eb992..0000000000000000000000000000000000000000 --- a/verifier/test/certassertion-test.js +++ /dev/null @@ -1,76 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Mozilla BrowserID. - * - * The Initial Developer of the Original Code is Mozilla. - * Portions created by the Initial Developer are Copyright (C) 2011 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * Ben Adida <benadida@mozilla.com> - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -var vows = require("vows"), - assert = require("assert"), - certassertion = require("../lib/certassertion"), - jwk = require("jwcrypto/jwk"), - jwt = require("jwcrypto/jwt"), - jwcert = require("jwcrypto/jwcert"), - vep = require("jwcrypto/vep"), - events = require("events"); - -vows.describe('certassertion').addBatch({ - "generate and certify key + assertion" : { - topic: function() { - // generate a key - var root_kp = jwk.KeyPair.generate("RS", 64); - var user_kp = jwk.KeyPair.generate("RS", 64); - var cert = new jwcert.JWCert("fakeroot.com", new Date(), user_kp.publicKey, {email:"user@fakeroot.com"}).sign(root_kp.secretKey); - var assertion = new jwt.JWT(null, new Date(), "rp.com").sign(user_kp.secretKey); - - var self = this; - var bundle = vep.bundleCertsAndAssertion([cert],assertion); - - // verify it - certassertion.verify( - bundle, "rp.com", - function(email, audience, expires) { - self.callback({email:email, audience: audience, expires:expires}); - }, - function(msg) {}, - function(issuer, next) { - if (issuer == "fakeroot.com") - next(root_kp.publicKey); - else - next(null); - }); - }, - "is successful": function(res, err) { - assert.notEqual(res.email, null); - } - } -}).export(module); \ No newline at end of file