$('#createToken').on('submit', createToken); $('#testToken').on('submit', testToken); $('#data').on('keyup change', validateJson); $('#uid').on('keyup change', setJsonId); $('#createToken') .on('submit', createToken) .find('input,textarea') .on('keyup change', setCreateButton) .on('keyup change', logCreateFormat); $('#testToken') .on('submit', testToken) .find('input,textarea') .on('keyup change', setTestButton); $('fieldset.collapsible legend a').click(function(e) { e.preventDefault(); toggleMoreInfo($(this).closest('fieldset')); }); $('a[href="#max"]').click(function(e) { e.preventDefault(); $('#expires').val('+9999999 days'); }); toggleMoreInfo($('fieldset.collapsible')); setCreateButton(); setTestButton(); setJsonId(); logCreateFormat(); function setCreateButton() { var b = !$('#secret').val(); $('#createToken').find('button').prop('disabled', b); } function setTestButton() { var b = !$('#instance').val() || !$('#token').val(); $('#testToken').find('button').prop('disabled', b); } function setJsonId() { var uid = $('#uid').val(); var out = $('#data').val(); try { var json = JSON.parse(out || '{}'); json.uid = uid; out = JSON.stringify(json, null, 2); } catch (e) { logErr(e); } $('#data').val(out); } function validateJson() { log(''); var data = parseData(); if( data !== false ) { logCreateFormat(); } } function createToken(e) { e.preventDefault(); var secret = $('#secret').val(); var data = parseData(); if( data !== false ) { var props = getAdminProps(); var tokGen = new FirebaseTokenGenerator(secret); var token = tokGen.createToken(data, props); log(token); $('#token').val(token); selectLog(); } return false; } function getAdminProps() { var exp = parseDate($('#expires').val()); var notBefore = parseDate($('#notBefore').val()); var admin = $('#admin').prop('checked'); var debug = $('#debug').prop('checked'); var out = {}; out.expires = exp||0; if( notBefore ) out.notBefore = notBefore; if( admin ) out.admin = admin; if( debug ) out.debug = debug; return out; } function logCreateFormat() { var secret = $('#secret').val(); var data = parseData(); if( data === false ) return; log("new FirebaseTokenGenerator(" +(secret? "'"+secret+"'" : '') +")\n.createToken(" + JSON.stringify(parseData()||{}, null, 2) + ", " + JSON.stringify(getAdminProps(), null, 2) + ')'); } function parseData() { try { return JSON.parse($('#data').val() || '{}'); } catch(e) { logErr(e); return false; } } function testToken(e) { e.preventDefault(); log(''); var fb = new Firebase('https://' + $('#instance').val() + '.firebaseio.com'); var tok = $('#token').val(); var dat = decodeURIComponent(escape(window.atob(tok.split('.')[1]))); fb.auth(tok, function (err) { if (err) { logErr(err + "\n\n" + dat); } else { log("Authenticated!\n\n" + dat); } }); return false; } function log(txt) { $('pre').removeClass('error').text(txt); } function logErr(e) { $('pre').addClass('error').text(e); } function parseDate(v) { if( !v || v === '0' ) { return 0; } var m, matches = (v || '').match(/^([+-])(\d+) (\w+)$/); if (matches) { m = moment().add((matches[1] === '-'? -1 : 1)*parseInt(matches[2], 10), matches[3]); } else { m = moment(v); } return m.isValid() ? m.unix() : 0; } function selectLog() { function selectElementContents(el) { var range = document.createRange(); range.selectNodeContents(el); var sel = window.getSelection(); sel.removeAllRanges(); sel.addRange(range); } var el = document.getElementById("log"); selectElementContents(el); } function toggleMoreInfo($fs) { if( !$fs.data('origHeight') ) { $fs.data('origHeight', $fs.height()); $fs.data('minHeight', $fs.find('label').outerHeight() + $fs.find('input').outerHeight()+5); } $fs.toggleClass('active'); var h = $fs.data($fs.hasClass('active')? 'origHeight' : 'minHeight'); $fs.animate({height: h}); }