Skip to content

Instantly share code, notes, and snippets.

@ozten
Created August 2, 2012 00:09
Show Gist options
  • Save ozten/3231766 to your computer and use it in GitHub Desktop.
Save ozten/3231766 to your computer and use it in GitHub Desktop.
production hostedpersona.me error
{
"log": {
"version": "1.1",
"creator": {
"name": "Firebug",
"version": "1.10"
},
"browser": {
"name": "Firefox",
"version": "16.0a2"
},
"pages": [
{
"startedDateTime": "2012-08-01T17:02:31.765-07:00",
"id": "page_34772",
"title": "Mozilla Persona",
"pageTimings": {
"onContentLoad": 566,
"onLoad": 1143
}
}
],
"entries": [
{
"pageref": "page_34772",
"startedDateTime": "2012-08-01T17:02:31.765-07:00",
"time": 78,
"request": {
"method": "GET",
"url": "https://login.persona.org/sign_in#[email protected]",
"httpVersion": "HTTP/1.1",
"cookies": [],
"headers": [
{
"name": "Host",
"value": "login.persona.org"
},
{
"name": "User-Agent",
"value": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:16.0) Gecko/16.0 Firefox/16.0"
},
{
"name": "Accept",
"value": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
},
{
"name": "Accept-Language",
"value": "en-us,en;q=0.800,zh-tw;q=0.600,es;q=0.400,it-ch;q=0.200"
},
{
"name": "Accept-Encoding",
"value": "gzip, deflate"
},
{
"name": "Connection",
"value": "keep-alive"
},
{
"name": "Referer",
"value": "https://hostedpersona.me/authentication?email=shout%40ozten.com&return_to=https%3A%2F%2Flogin.persona.org%2Fsign_in%23CREATE_EMAIL%3Dshout%40ozten.com"
},
{
"name": "x-msisdn",
"value": "542131232131"
},
{
"name": "X-Forwarded-For",
"value": "200.49.193.196"
}
],
"queryString": [],
"headersSize": 562,
"bodySize": -1
},
"response": {
"status": 200,
"statusText": "OK",
"httpVersion": "HTTP/1.1",
"cookies": [],
"headers": [
{
"name": "Vary",
"value": "Accept-Encoding,Accept-Language"
},
{
"name": "Cache-Control",
"value": "public, max-age=0"
},
{
"name": "Content-Type",
"value": "text/html; charset=utf8"
},
{
"name": "Content-Encoding",
"value": "gzip"
},
{
"name": "Strict-Transport-Security",
"value": "max-age=2592000; includeSubdomains"
},
{
"name": "Date",
"value": "Thu, 02 Aug 2012 00:02:31 GMT"
},
{
"name": "Transfer-Encoding",
"value": "chunked"
},
{
"name": "Etag",
"value": "\"3e6dfa6ca45dd9e5243ec651384ee6ca\""
},
{
"name": "Connection",
"value": "keep-alive"
},
{
"name": "X-Frame-Options",
"value": "DENY"
}
],
"content": {
"mimeType": "text/html",
"size": 2919,
"text": "<!DOCTYPE html>\n<!-- This Source Code Form is subject to the terms of the Mozilla Public\n - License, v. 2.0. If a copy of the MPL was not distributed with this\n - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->\n\n<html LANG=\"en-us\" dir=\"ltr\">\n<head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,width=device-width\" />\n <meta name=\"format-detection\" content=\"email=no\" />\n\n <!--[if lt IE 9]>\n <script src=\"/lib/html5shim.js\"></script>\n <![endif]-->\n <link href=\"https://static.login.persona.org/v/e45f9f9309/production/dialog.css\" rel=\"stylesheet\" type=\"text/css\">\n <!--[if lt IE 9]>\n <link href=\"https://static.login.persona.org/v/43c5f8c218/production/ie8_dialog.css\" rel=\"stylesheet\" type=\"text/css\">\n <![endif]-->\n <title>Mozilla Persona</title>\n</head>\n <body class=\"waiting\">\n <header id=\"header\">\n \n <h1><a class=\"home\" target=\"_blank\" href=\"/\">Mozilla Persona Home</a></h1>\n </header>\n\n <div id=\"content\">\n <!-- This Source Code Form is subject to the terms of the Mozilla Public\n - License, v. 2.0. If a copy of the MPL was not distributed with this\n - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->\n <section id=\"formWrap\">\n <form novalidate>\n <div id=\"favicon\">\n <div class=\"table\">\n <div class=\"vertical\" id=\"rp_info\">\n </div>\n </div>\n </div>\n\n <div id=\"signIn\">\n <div class=\"table\">\n <div class=\"vertical\">\n <div class=\"contents\">\n </div>\n </div>\n </div>\n <div class=\"arrowContainer\">\n <div class=\"arrow\"></div>\n </div>\n </div>\n </form>\n </section>\n\n\n <section id=\"wait\">\n <!-- because each section is an absolutely positioned element, we have to use the inner table container element to be able to vertically/horizontally center correctly. Without the table element, the layout gets all messed up. -->\n <div class=\"table\">\n <div class=\"vertical contents\">\n <h2>Communicating with server</h2>\n <p>Just a moment while we talk with the server.</p>\n </div>\n </div>\n </section>\n\n <section id=\"error\">\n <div class=\"table\">\n <div class=\"vertical contents\">\n </div>\n </div>\n </section>\n\n <section id=\"delay\">\n <div class=\"table\">\n <div class=\"vertical contents\">\n </div>\n </div>\n </section>\n\n </div>\n\n <footer>\nMozilla Persona is the fast and secure way to sign in. <a href='/about' target='_blank'>Learn more &rarr;</a>\n\n </footer>\n\n\n \n <script src=\"https://static.login.persona.org/v/cb8d77cc83/production/en_US/dialog.js\"></script>\n \n\t</body>\n</html>\n"
},
"redirectURL": "",
"headersSize": 372,
"bodySize": 1124
},
"cache": {},
"timings": {
"blocked": 0,
"dns": 0,
"connect": 0,
"send": 0,
"wait": 78,
"receive": 0
},
"serverIPAddress": "63.245.217.134",
"connection": "443"
},
{
"pageref": "page_34772",
"startedDateTime": "2012-08-01T17:02:32.324-07:00",
"time": 506,
"request": {
"method": "GET",
"url": "https://login.persona.org/wsapi/session_context",
"httpVersion": "HTTP/1.1",
"cookies": [
{
"name": "browserid_state",
"value": "UsOSYwbDhMK0w5HDhcOWbjvCg8KGDGoY.w7kRPlDCtwHDp8KTwqLDpEoUwrMLRjo4NMO_wpxxMg89wqcLwr_CnsOWwp_DtEgIw7Y3w4Zvw7Zfwo7DvxIPWj9RwoE1.1343855362261.2419200000.w6djJ8KfdcKTCBrCqVcfwp3ClwnDsWfDnsOfwrxgw4cCTMKaJ1PCvlUawpouVw"
}
],
"headers": [
{
"name": "Host",
"value": "login.persona.org"
},
{
"name": "User-Agent",
"value": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:16.0) Gecko/16.0 Firefox/16.0"
},
{
"name": "Accept",
"value": "application/json;text/plain"
},
{
"name": "Accept-Language",
"value": "en-us,en;q=0.800,zh-tw;q=0.600,es;q=0.400,it-ch;q=0.200"
},
{
"name": "Accept-Encoding",
"value": "gzip, deflate"
},
{
"name": "Connection",
"value": "keep-alive"
},
{
"name": "X-Requested-With",
"value": "XMLHttpRequest"
},
{
"name": "Content-Type",
"value": "application/x-www-form-urlencoded"
},
{
"name": "Referer",
"value": "https://login.persona.org/sign_in"
},
{
"name": "Cookie",
"value": "browserid_state=UsOSYwbDhMK0w5HDhcOWbjvCg8KGDGoY.w7kRPlDCtwHDp8KTwqLDpEoUwrMLRjo4NMO_wpxxMg89wqcLwr_CnsOWwp_DtEgIw7Y3w4Zvw7Zfwo7DvxIPWj9RwoE1.1343855362261.2419200000.w6djJ8KfdcKTCBrCqVcfwp3ClwnDsWfDnsOfwrxgw4cCTMKaJ1PCvlUawpouVw"
},
{
"name": "x-msisdn",
"value": "542131232131"
},
{
"name": "X-Forwarded-For",
"value": "200.49.193.196"
}
],
"queryString": [],
"headersSize": 745,
"bodySize": -1
},
"response": {
"status": 200,
"statusText": "OK",
"httpVersion": "HTTP/1.1",
"cookies": [],
"headers": [
{
"name": "Cache-Control",
"value": "no-cache, max-age=0"
},
{
"name": "Content-Type",
"value": "application/json; charset=utf-8"
},
{
"name": "Strict-Transport-Security",
"value": "max-age=2592000; includeSubdomains"
},
{
"name": "Date",
"value": "Thu, 02 Aug 2012 00:02:32 GMT"
},
{
"name": "Connection",
"value": "keep-alive"
},
{
"name": "X-Frame-Options",
"value": "DENY"
},
{
"name": "Content-Length",
"value": "214"
}
],
"content": {
"mimeType": "application/json",
"size": 214,
"text": "{\"csrf_token\":\"MorXyZPweHprOlC52U/vJQ==\",\"server_time\":1343865752778,\"authenticated\":false,\"domain_key_creation_time\":1323898170781,\"random_seed\":\"Mgnss2lnom70oJQvBAhD1mp/NhOERYT4Psw1W25GNFA=\",\"data_sample_rate\":0}"
},
"redirectURL": "",
"headersSize": 270,
"bodySize": 214
},
"cache": {},
"timings": {
"blocked": 431,
"dns": 0,
"connect": 0,
"send": 0,
"wait": 75,
"receive": 0
},
"serverIPAddress": "63.245.217.134",
"connection": "443"
},
{
"pageref": "page_34772",
"startedDateTime": "2012-08-01T17:02:33.030-07:00",
"time": 152,
"request": {
"method": "GET",
"url": "https://login.persona.org/wsapi/address_info?email=shout%40ozten.com",
"httpVersion": "HTTP/1.1",
"cookies": [
{
"name": "browserid_state",
"value": "UsOSYwbDhMK0w5HDhcOWbjvCg8KGDGoY.w7kRPlDCtwHDp8KTwqLDpEoUwrMLRjo4NMO_wpxxMg89wqcLwr_CnsOWwp_DtEgIw7Y3w4Zvw7Zfwo7DvxIPWj9RwoE1.1343855362261.2419200000.w6djJ8KfdcKTCBrCqVcfwp3ClwnDsWfDnsOfwrxgw4cCTMKaJ1PCvlUawpouVw"
},
{
"name": "test",
"value": "true"
}
],
"headers": [
{
"name": "Host",
"value": "login.persona.org"
},
{
"name": "User-Agent",
"value": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:16.0) Gecko/16.0 Firefox/16.0"
},
{
"name": "Accept",
"value": "application/json;text/plain"
},
{
"name": "Accept-Language",
"value": "en-us,en;q=0.800,zh-tw;q=0.600,es;q=0.400,it-ch;q=0.200"
},
{
"name": "Accept-Encoding",
"value": "gzip, deflate"
},
{
"name": "Connection",
"value": "keep-alive"
},
{
"name": "X-Requested-With",
"value": "XMLHttpRequest"
},
{
"name": "Content-Type",
"value": "application/x-www-form-urlencoded"
},
{
"name": "Referer",
"value": "https://login.persona.org/sign_in"
},
{
"name": "Cookie",
"value": "browserid_state=UsOSYwbDhMK0w5HDhcOWbjvCg8KGDGoY.w7kRPlDCtwHDp8KTwqLDpEoUwrMLRjo4NMO_wpxxMg89wqcLwr_CnsOWwp_DtEgIw7Y3w4Zvw7Zfwo7DvxIPWj9RwoE1.1343855362261.2419200000.w6djJ8KfdcKTCBrCqVcfwp3ClwnDsWfDnsOfwrxgw4cCTMKaJ1PCvlUawpouVw; test=true"
},
{
"name": "x-msisdn",
"value": "542131232131"
},
{
"name": "X-Forwarded-For",
"value": "200.49.193.196"
}
],
"queryString": [
{
"name": "email",
"value": "[email protected]"
}
],
"headersSize": 777,
"bodySize": -1
},
"response": {
"status": 200,
"statusText": "OK",
"httpVersion": "HTTP/1.1",
"cookies": [],
"headers": [
{
"name": "Cache-Control",
"value": "no-cache, max-age=0"
},
{
"name": "Content-Type",
"value": "application/json; charset=utf-8"
},
{
"name": "Strict-Transport-Security",
"value": "max-age=2592000; includeSubdomains"
},
{
"name": "Date",
"value": "Thu, 02 Aug 2012 00:02:33 GMT"
},
{
"name": "Connection",
"value": "keep-alive"
},
{
"name": "X-Frame-Options",
"value": "DENY"
},
{
"name": "Content-Length",
"value": "114"
}
],
"content": {
"mimeType": "application/json",
"size": 114,
"text": "{\"auth\":\"https://hostedpersona.me/authentication\",\"prov\":\"https://hostedpersona.me/provisioning\",\"type\":\"primary\"}"
},
"redirectURL": "",
"headersSize": 270,
"bodySize": 114
},
"cache": {},
"timings": {
"blocked": 0,
"dns": 0,
"connect": 0,
"send": 0,
"wait": 152,
"receive": 0
},
"serverIPAddress": "63.245.217.134",
"connection": "443"
},
{
"pageref": "page_34772",
"startedDateTime": "2012-08-01T17:02:33.213-07:00",
"time": 94,
"request": {
"method": "GET",
"url": "https://hostedpersona.me/provisioning",
"httpVersion": "HTTP/1.1",
"cookies": [
{
"name": "session_state",
"value": "w7XChi7CmwfDvmDCmFHDo1UdwrfClsKeSQ.w7XDucOuwqXDqsKWJwZwwowIwq4AGSteOMOkwrtmAMOoOMK_woTDr8Ohw5DDhXzCpsKaw7ZswpvCt8KVZ1_CmsKLTC80fsOQGMOBwpDCmcOPw4TDgMKOw5A8USp7N8OYwrHCqHjCq8Omw4ZowqTDnhoRw7DDnGdSw6hhZHE.1343865641867.86400000.w4TChsKMw7Jtw4XCjwfCqB7CtcKrHQljPMKDw4pSw51nwrvCssKEOcOKMsOgw4xjw6XDqQ"
}
],
"headers": [
{
"name": "Host",
"value": "hostedpersona.me"
},
{
"name": "User-Agent",
"value": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:16.0) Gecko/16.0 Firefox/16.0"
},
{
"name": "Accept",
"value": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
},
{
"name": "Accept-Language",
"value": "en-us,en;q=0.800,zh-tw;q=0.600,es;q=0.400,it-ch;q=0.200"
},
{
"name": "Accept-Encoding",
"value": "gzip, deflate"
},
{
"name": "Connection",
"value": "keep-alive"
},
{
"name": "Referer",
"value": "https://login.persona.org/sign_in"
},
{
"name": "Cookie",
"value": "session_state=w7XChi7CmwfDvmDCmFHDo1UdwrfClsKeSQ.w7XDucOuwqXDqsKWJwZwwowIwq4AGSteOMOkwrtmAMOoOMK_woTDr8Ohw5DDhXzCpsKaw7ZswpvCt8KVZ1_CmsKLTC80fsOQGMOBwpDCmcOPw4TDgMKOw5A8USp7N8OYwrHCqHjCq8Omw4ZowqTDnhoRw7DDnGdSw6hhZHE.1343865641867.86400000.w4TChsKMw7Jtw4XCjwfCqB7CtcKrHQljPMKDw4pSw51nwrvCssKEOcOKMsOgw4xjw6XDqQ"
},
{
"name": "x-msisdn",
"value": "542131232131"
},
{
"name": "X-Forwarded-For",
"value": "200.49.193.196"
},
{
"name": "If-None-Match",
"value": "1300381999"
}
],
"queryString": [],
"headersSize": 796,
"bodySize": -1
},
"response": {
"status": 200,
"statusText": "OK",
"httpVersion": "HTTP/1.1",
"cookies": [],
"headers": [
{
"name": "Server",
"value": "nginx/1.1.19"
},
{
"name": "Date",
"value": "Thu, 02 Aug 2012 00:02:32 GMT"
},
{
"name": "Content-Type",
"value": "text/html; charset=utf-8"
},
{
"name": "Transfer-Encoding",
"value": "chunked"
},
{
"name": "Connection",
"value": "keep-alive"
},
{
"name": "X-Powered-By",
"value": "Express"
},
{
"name": "Etag",
"value": "-1179568785"
},
{
"name": "Content-Encoding",
"value": "gzip"
}
],
"content": {
"mimeType": "text/html",
"size": 2218,
"text": "<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"utf-8\">\n <title>provisioning</title>\n</head>\n<body>\n<input type=\"hidden\" name=\"_csrf\" value=\"fYue/eHu6swUGHUqdV2Aceeg\" />\n<script type=\"text/javascript\" src=\"https://login.persona.org/provisioning_api.js\"></script>\n<script type=\"text/javascript\" src=\"https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js\"></script>\n<script type=\"text/javascript\">\n(function () {\n\"use strict\";\nvar provision = function (active_users, num_users) {\n var msg = \"user is not authenticated as target user\";\n console.log('hooking up begin provisioning with users=' + active_users);\n\n // [email protected]\n navigator.id.beginProvisioning(function(email, cert_duration) {\n console.log('callback');\n console.log('begining provisioning ' + email + ' ' + cert_duration);\n\n if (! active_users || num_users === 0) {\n console.log('no session, failing');\n navigator.id.raiseProvisioningFailure(msg);\n } else {\n if (-1 !== active_users.indexOf(email)) {\n console.log('emails matched ' + active_users + ' == ' + email + ' next genKeyPair');\n navigator.id.genKeyPair(function(pubkey) {\n\n $.ajax({\n url: '/gen-cert',\n data: JSON.stringify({\n pubkey: pubkey,\n duration: cert_duration,\n \"_csrf\": \"fYue/eHu6swUGHUqdV2Aceeg\",\n authed_email: email\n }),\n type: 'POST',\n headers: { \"Content-Type\": 'application/json' },\n dataType: 'json',\n success: function(r) {\n console.log(\"We successfully authed, registering cert\");\n // all done! woo!\n navigator.id.registerCertificate(r.cert);\n },\n error: function(r) {\n console.log(\"Error certifying key, raising provision failure\");\n navigator.id.raiseProvisioningFailure(msg);\n }\n });\n\n });\n } else {\n console.log('Users [', active_users, '] and email [', email, '] dont match');\n navigator.id.raiseProvisioningFailure(msg);\n }\n }\n }); //beginProvisioning\n};\n\nprovision([\"[email protected]\"], 1);\n\n})();\n</script>\n</body>\n</html>\n"
},
"redirectURL": "",
"headersSize": 236,
"bodySize": 954
},
"cache": {},
"timings": {
"blocked": 0,
"dns": 0,
"connect": 0,
"send": 0,
"wait": 94,
"receive": 0
},
"serverIPAddress": "23.23.100.125",
"connection": "443"
},
{
"pageref": "page_34772",
"startedDateTime": "2012-08-01T17:02:33.821-07:00",
"time": 79,
"request": {
"method": "GET",
"url": "https://login.persona.org/provisioning_api.js",
"httpVersion": "HTTP/1.1",
"cookies": [],
"headers": [
{
"name": "Host",
"value": "login.persona.org"
},
{
"name": "User-Agent",
"value": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:16.0) Gecko/16.0 Firefox/16.0"
},
{
"name": "Accept",
"value": "*/*"
},
{
"name": "Accept-Language",
"value": "en-us,en;q=0.800,zh-tw;q=0.600,es;q=0.400,it-ch;q=0.200"
},
{
"name": "Accept-Encoding",
"value": "gzip, deflate"
},
{
"name": "Connection",
"value": "keep-alive"
},
{
"name": "Referer",
"value": "https://hostedpersona.me/provisioning"
},
{
"name": "x-msisdn",
"value": "542131232131"
},
{
"name": "X-Forwarded-For",
"value": "200.49.193.196"
},
{
"name": "If-None-Match",
"value": "\"27121-1340742347000\""
}
],
"queryString": [],
"headersSize": 439,
"bodySize": -1
},
"response": {
"status": 304,
"statusText": "Not Modified",
"httpVersion": "HTTP/1.1",
"cookies": [],
"headers": [
{
"name": "Vary",
"value": "Accept-Encoding,Accept-Language"
},
{
"name": "Cache-Control",
"value": "public, max-age=0"
},
{
"name": "Strict-Transport-Security",
"value": "max-age=2592000; includeSubdomains"
},
{
"name": "Date",
"value": "Thu, 02 Aug 2012 00:02:33 GMT"
},
{
"name": "Access-Control-Allow-Origin",
"value": "https://login.persona.org"
},
{
"name": "Etag",
"value": "\"27121-1340742347000\""
},
{
"name": "Connection",
"value": "keep-alive"
},
{
"name": "X-Frame-Options",
"value": "DENY"
}
],
"content": {
"mimeType": "application/javascript",
"size": 27121,
"text": "/**\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/. */\n\n(function() {\n \"use strict\";\n\n // local embedded copy of jschannel: http://github.com/mozilla/jschannel\n /**\n * js_channel is a very lightweight abstraction on top of\n * postMessage which defines message formats and semantics\n * to support interactions more rich than just message passing\n * js_channel supports:\n * + query/response - traditional rpc\n * + query/update/response - incremental async return of results\n * to a query\n * + notifications - fire and forget\n * + error handling\n *\n * js_channel is based heavily on json-rpc, but is focused at the\n * problem of inter-iframe RPC.\n *\n * Message types:\n * There are 5 types of messages that can flow over this channel,\n * and you may determine what type of message an object is by\n * examining its parameters:\n * 1. Requests\n * + integer id\n * + string method\n * + (optional) any params\n * 2. Callback Invocations (or just \"Callbacks\")\n * + integer id\n * + string callback\n * + (optional) params\n * 3. Error Responses (or just \"Errors)\n * + integer id\n * + string error\n * + (optional) string message\n * 4. Responses\n * + integer id\n * + (optional) any result\n * 5. Notifications\n * + string method\n * + (optional) any params\n */\n var Channel = (function() {\n \"use strict\";\n\n // current transaction id, start out at a random *odd* number between 1 and a million\n // There is one current transaction counter id per page, and it's shared between\n // channel instances. That means of all messages posted from a single javascript\n // evaluation context, we'll never have two with the same id.\n var s_curTranId = Math.floor(Math.random()*1000001);\n\n // no two bound channels in the same javascript evaluation context may have the same origin, scope, and window.\n // futher if two bound channels have the same window and scope, they may not have *overlapping* origins\n // (either one or both support '*'). This restriction allows a single onMessage handler to efficiently\n // route messages based on origin and scope. The s_boundChans maps origins to scopes, to message\n // handlers. Request and Notification messages are routed using this table.\n // Finally, channels are inserted into this table when built, and removed when destroyed.\n var s_boundChans = { };\n\n // add a channel to s_boundChans, throwing if a dup exists\n function s_addBoundChan(win, origin, scope, handler) {\n function hasWin(arr) {\n for (var i = 0; i < arr.length; i++) if (arr[i].win === win) return true;\n return false;\n }\n\n // does she exist?\n var exists = false;\n\n\n if (origin === '*') {\n // we must check all other origins, sadly.\n for (var k in s_boundChans) {\n if (!s_boundChans.hasOwnProperty(k)) continue;\n if (k === '*') continue;\n if (typeof s_boundChans[k][scope] === 'object') {\n exists = hasWin(s_boundChans[k][scope]);\n if (exists) break;\n }\n }\n } else {\n // we must check only '*'\n if ((s_boundChans['*'] && s_boundChans['*'][scope])) {\n exists = hasWin(s_boundChans['*'][scope]);\n }\n if (!exists && s_boundChans[origin] && s_boundChans[origin][scope])\n {\n exists = hasWin(s_boundChans[origin][scope]);\n }\n }\n if (exists) throw \"A channel is already bound to the same window which overlaps with origin '\"+ origin +\"' and has scope '\"+scope+\"'\";\n\n if (typeof s_boundChans[origin] != 'object') s_boundChans[origin] = { };\n if (typeof s_boundChans[origin][scope] != 'object') s_boundChans[origin][scope] = [ ];\n s_boundChans[origin][scope].push({win: win, handler: handler});\n }\n\n function s_removeBoundChan(win, origin, scope) {\n var arr = s_boundChans[origin][scope];\n for (var i = 0; i < arr.length; i++) {\n if (arr[i].win === win) {\n arr.splice(i,1);\n }\n }\n if (s_boundChans[origin][scope].length === 0) {\n delete s_boundChans[origin][scope]\n }\n }\n\n function s_isArray(obj) {\n if (Array.isArray) return Array.isArray(obj);\n else {\n return (obj.constructor.toString().indexOf(\"Array\") != -1);\n }\n }\n\n // No two outstanding outbound messages may have the same id, period. Given that, a single table\n // mapping \"transaction ids\" to message handlers, allows efficient routing of Callback, Error, and\n // Response messages. Entries are added to this table when requests are sent, and removed when\n // responses are received.\n var s_transIds = { };\n\n // class singleton onMessage handler\n // this function is registered once and all incoming messages route through here. This\n // arrangement allows certain efficiencies, message data is only parsed once and dispatch\n // is more efficient, especially for large numbers of simultaneous channels.\n var s_onMessage = function(e) {\n try {\n var m = JSON.parse(e.data);\n if (typeof m !== 'object' || m === null) throw \"malformed\";\n } catch(e) {\n // just ignore any posted messages that do not consist of valid JSON\n return;\n }\n\n var w = e.source;\n var o = e.origin;\n var s, i, meth;\n\n if (typeof m.method === 'string') {\n var ar = m.method.split('::');\n if (ar.length == 2) {\n s = ar[0];\n meth = ar[1];\n } else {\n meth = m.method;\n }\n }\n\n if (typeof m.id !== 'undefined') i = m.id;\n\n // w is message source window\n // o is message origin\n // m is parsed message\n // s is message scope\n // i is message id (or undefined)\n // meth is unscoped method name\n // ^^ based on these factors we can route the message\n\n // if it has a method it's either a notification or a request,\n // route using s_boundChans\n if (typeof meth === 'string') {\n var delivered = false;\n if (s_boundChans[o] && s_boundChans[o][s]) {\n for (var i = 0; i < s_boundChans[o][s].length; i++) {\n if (s_boundChans[o][s][i].win === w) {\n s_boundChans[o][s][i].handler(o, meth, m);\n delivered = true;\n break;\n }\n }\n }\n\n if (!delivered && s_boundChans['*'] && s_boundChans['*'][s]) {\n for (var i = 0; i < s_boundChans['*'][s].length; i++) {\n if (s_boundChans['*'][s][i].win === w) {\n s_boundChans['*'][s][i].handler(o, meth, m);\n break;\n }\n }\n }\n }\n // otherwise it must have an id (or be poorly formed\n else if (typeof i != 'undefined') {\n if (s_transIds[i]) s_transIds[i](o, meth, m);\n }\n };\n\n // Setup postMessage event listeners\n if (window.addEventListener) window.addEventListener('message', s_onMessage, false);\n else if(window.attachEvent) window.attachEvent('onmessage', s_onMessage);\n\n /* a messaging channel is constructed from a window and an origin.\n * the channel will assert that all messages received over the\n * channel match the origin\n *\n * Arguments to Channel.build(cfg):\n *\n * cfg.window - the remote window with which we'll communicate\n * cfg.origin - the expected origin of the remote window, may be '*'\n * which matches any origin\n * cfg.scope - the 'scope' of messages. a scope string that is\n * prepended to message names. local and remote endpoints\n * of a single channel must agree upon scope. Scope may\n * not contain double colons ('::').\n * cfg.debugOutput - A boolean value. If true and window.console.log is\n * a function, then debug strings will be emitted to that\n * function.\n * cfg.debugOutput - A boolean value. If true and window.console.log is\n * a function, then debug strings will be emitted to that\n * function.\n * cfg.postMessageObserver - A function that will be passed two arguments,\n * an origin and a message. It will be passed these immediately\n * before messages are posted.\n * cfg.gotMessageObserver - A function that will be passed two arguments,\n * an origin and a message. It will be passed these arguments\n * immediately after they pass scope and origin checks, but before\n * they are processed.\n * cfg.onReady - A function that will be invoked when a channel becomes \"ready\",\n * this occurs once both sides of the channel have been\n * instantiated and an application level handshake is exchanged.\n * the onReady function will be passed a single argument which is\n * the channel object that was returned from build().\n */\n return {\n build: function(cfg) {\n var debug = function(m) {\n if (cfg.debugOutput && window.console && window.console.log) {\n // try to stringify, if it doesn't work we'll let javascript's built in toString do its magic\n try { if (typeof m !== 'string') m = JSON.stringify(m); } catch(e) { }\n console.log(\"[\"+chanId+\"] \" + m);\n }\n }\n\n /* browser capabilities check */\n if (!window.postMessage) throw(\"jschannel cannot run this browser, no postMessage\");\n if (!window.JSON || !window.JSON.stringify || ! window.JSON.parse) {\n throw(\"jschannel cannot run this browser, no JSON parsing/serialization\");\n }\n\n /* basic argument validation */\n if (typeof cfg != 'object') throw(\"Channel build invoked without a proper object argument\");\n\n if (!cfg.window || !cfg.window.postMessage) throw(\"Channel.build() called without a valid window argument\");\n\n /* we'd have to do a little more work to be able to run multiple channels that intercommunicate the same\n * window... Not sure if we care to support that */\n if (window === cfg.window) throw(\"target window is same as present window -- not allowed\");\n\n // let's require that the client specify an origin. if we just assume '*' we'll be\n // propagating unsafe practices. that would be lame.\n var validOrigin = false;\n if (typeof cfg.origin === 'string') {\n var oMatch;\n if (cfg.origin === \"*\") validOrigin = true;\n // allow valid domains under http and https. Also, trim paths off otherwise valid origins.\n else if (null !== (oMatch = cfg.origin.match(/^https?:\\/\\/(?:[-a-zA-Z0-9_\\.])+(?::\\d+)?/))) {\n cfg.origin = oMatch[0].toLowerCase();\n validOrigin = true;\n }\n }\n\n if (!validOrigin) throw (\"Channel.build() called with an invalid origin\");\n\n if (typeof cfg.scope !== 'undefined') {\n if (typeof cfg.scope !== 'string') throw 'scope, when specified, must be a string';\n if (cfg.scope.split('::').length > 1) throw \"scope may not contain double colons: '::'\"\n }\n\n /* private variables */\n // generate a random and psuedo unique id for this channel\n var chanId = (function () {\n var text = \"\";\n var alpha = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\";\n for(var i=0; i < 5; i++) text += alpha.charAt(Math.floor(Math.random() * alpha.length));\n return text;\n })();\n\n // registrations: mapping method names to call objects\n var regTbl = { };\n // current oustanding sent requests\n var outTbl = { };\n // current oustanding received requests\n var inTbl = { };\n // are we ready yet? when false we will block outbound messages.\n var ready = false;\n var pendingQueue = [ ];\n\n var createTransaction = function(id,origin,callbacks) {\n var shouldDelayReturn = false;\n var completed = false;\n\n return {\n origin: origin,\n invoke: function(cbName, v) {\n // verify in table\n if (!inTbl[id]) throw \"attempting to invoke a callback of a nonexistent transaction: \" + id;\n // verify that the callback name is valid\n var valid = false;\n for (var i = 0; i < callbacks.length; i++) if (cbName === callbacks[i]) { valid = true; break; }\n if (!valid) throw \"request supports no such callback '\" + cbName + \"'\";\n\n // send callback invocation\n postMessage({ id: id, callback: cbName, params: v});\n },\n error: function(error, message) {\n completed = true;\n // verify in table\n if (!inTbl[id]) throw \"error called for nonexistent message: \" + id;\n\n // remove transaction from table\n delete inTbl[id];\n\n // send error\n postMessage({ id: id, error: error, message: message });\n },\n complete: function(v) {\n completed = true;\n // verify in table\n if (!inTbl[id]) throw \"complete called for nonexistent message: \" + id;\n // remove transaction from table\n delete inTbl[id];\n // send complete\n postMessage({ id: id, result: v });\n },\n delayReturn: function(delay) {\n if (typeof delay === 'boolean') {\n shouldDelayReturn = (delay === true);\n }\n return shouldDelayReturn;\n },\n completed: function() {\n return completed;\n }\n };\n }\n\n var setTransactionTimeout = function(transId, timeout, method) {\n return window.setTimeout(function() {\n if (outTbl[transId]) {\n // XXX: what if client code raises an exception here?\n var msg = \"timeout (\" + timeout + \"ms) exceeded on method '\" + method + \"'\";\n (1,outTbl[transId].error)(\"timeout_error\", msg);\n delete outTbl[transId];\n delete s_transIds[transId];\n }\n }, timeout);\n }\n \n var onMessage = function(origin, method, m) {\n // if an observer was specified at allocation time, invoke it\n if (typeof cfg.gotMessageObserver === 'function') {\n // pass observer a clone of the object so that our\n // manipulations are not visible (i.e. method unscoping).\n // This is not particularly efficient, but then we expect\n // that message observers are primarily for debugging anyway.\n try {\n cfg.gotMessageObserver(origin, m);\n } catch (e) {\n debug(\"gotMessageObserver() raised an exception: \" + e.toString());\n }\n }\n\n // now, what type of message is this?\n if (m.id && method) {\n // a request! do we have a registered handler for this request?\n if (regTbl[method]) {\n var trans = createTransaction(m.id, origin, m.callbacks ? m.callbacks : [ ]);\n inTbl[m.id] = { };\n try {\n // callback handling. we'll magically create functions inside the parameter list for each\n // callback\n if (m.callbacks && s_isArray(m.callbacks) && m.callbacks.length > 0) {\n for (var i = 0; i < m.callbacks.length; i++) {\n var path = m.callbacks[i];\n var obj = m.params;\n var pathItems = path.split('/');\n for (var j = 0; j < pathItems.length - 1; j++) {\n var cp = pathItems[j];\n if (typeof obj[cp] !== 'object') obj[cp] = { };\n obj = obj[cp];\n }\n obj[pathItems[pathItems.length - 1]] = (function() {\n var cbName = path;\n return function(params) {\n return trans.invoke(cbName, params);\n }\n })();\n }\n }\n var resp = regTbl[method](trans, m.params);\n if (!trans.delayReturn() && !trans.completed()) trans.complete(resp);\n } catch(e) {\n // automagic handling of exceptions:\n var error = \"runtime_error\";\n var message = null;\n // * if it's a string then it gets an error code of 'runtime_error' and string is the message\n if (typeof e === 'string') {\n message = e;\n } else if (typeof e === 'object') {\n // either an array or an object\n // * if it's an array of length two, then array[0] is the code, array[1] is the error message\n if (e && s_isArray(e) && e.length == 2) {\n error = e[0];\n message = e[1];\n }\n // * if it's an object then we'll look form error and message parameters\n else if (typeof e.error === 'string') {\n error = e.error;\n if (!e.message) message = \"\";\n else if (typeof e.message === 'string') message = e.message;\n else e = e.message; // let the stringify/toString message give us a reasonable verbose error string\n }\n }\n\n // message is *still* null, let's try harder\n if (message === null) {\n try {\n message = JSON.stringify(e);\n /* On MSIE8, this can result in 'out of memory', which\n * leaves message undefined. */\n if (typeof(message) == 'undefined')\n message = e.toString();\n } catch (e2) {\n message = e.toString();\n }\n }\n\n trans.error(error,message);\n }\n }\n } else if (m.id && m.callback) {\n if (!outTbl[m.id] ||!outTbl[m.id].callbacks || !outTbl[m.id].callbacks[m.callback])\n {\n debug(\"ignoring invalid callback, id:\"+m.id+ \" (\" + m.callback +\")\");\n } else {\n // XXX: what if client code raises an exception here?\n outTbl[m.id].callbacks[m.callback](m.params);\n }\n } else if (m.id) {\n if (!outTbl[m.id]) {\n debug(\"ignoring invalid response: \" + m.id);\n } else {\n // XXX: what if client code raises an exception here?\n if (m.error) {\n (1,outTbl[m.id].error)(m.error, m.message);\n } else {\n if (m.result !== undefined) (1,outTbl[m.id].success)(m.result);\n else (1,outTbl[m.id].success)();\n }\n delete outTbl[m.id];\n delete s_transIds[m.id];\n }\n } else if (method) {\n // tis a notification.\n if (regTbl[method]) {\n // yep, there's a handler for that.\n // transaction is null for notifications.\n regTbl[method](null, m.params);\n // if the client throws, we'll just let it bubble out\n // what can we do? Also, here we'll ignore return values\n }\n }\n }\n\n // now register our bound channel for msg routing\n s_addBoundChan(cfg.window, cfg.origin, ((typeof cfg.scope === 'string') ? cfg.scope : ''), onMessage);\n\n // scope method names based on cfg.scope specified when the Channel was instantiated\n var scopeMethod = function(m) {\n if (typeof cfg.scope === 'string' && cfg.scope.length) m = [cfg.scope, m].join(\"::\");\n return m;\n }\n\n // a small wrapper around postmessage whose primary function is to handle the\n // case that clients start sending messages before the other end is \"ready\"\n var postMessage = function(msg, force) {\n if (!msg) throw \"postMessage called with null message\";\n\n // delay posting if we're not ready yet.\n var verb = (ready ? \"post \" : \"queue \");\n debug(verb + \" message: \" + JSON.stringify(msg));\n if (!force && !ready) {\n pendingQueue.push(msg);\n } else {\n if (typeof cfg.postMessageObserver === 'function') {\n try {\n cfg.postMessageObserver(cfg.origin, msg);\n } catch (e) {\n debug(\"postMessageObserver() raised an exception: \" + e.toString());\n }\n }\n\n cfg.window.postMessage(JSON.stringify(msg), cfg.origin);\n }\n }\n\n var onReady = function(trans, type) {\n debug('ready msg received');\n if (ready) throw \"received ready message while in ready state. help!\";\n\n if (type === 'ping') {\n chanId += '-R';\n } else {\n chanId += '-L';\n }\n\n obj.unbind('__ready'); // now this handler isn't needed any more.\n ready = true;\n debug('ready msg accepted.');\n\n if (type === 'ping') {\n obj.notify({ method: '__ready', params: 'pong' });\n }\n\n // flush queue\n while (pendingQueue.length) {\n postMessage(pendingQueue.pop());\n }\n\n // invoke onReady observer if provided\n if (typeof cfg.onReady === 'function') cfg.onReady(obj);\n };\n\n var obj = {\n // tries to unbind a bound message handler. returns false if not possible\n unbind: function (method) {\n if (regTbl[method]) {\n if (!(delete regTbl[method])) throw (\"can't delete method: \" + method);\n return true;\n }\n return false;\n },\n bind: function (method, cb) {\n if (!method || typeof method !== 'string') throw \"'method' argument to bind must be string\";\n if (!cb || typeof cb !== 'function') throw \"callback missing from bind params\";\n\n if (regTbl[method]) throw \"method '\"+method+\"' is already bound!\";\n regTbl[method] = cb;\n return this;\n },\n call: function(m) {\n if (!m) throw 'missing arguments to call function';\n if (!m.method || typeof m.method !== 'string') throw \"'method' argument to call must be string\";\n if (!m.success || typeof m.success !== 'function') throw \"'success' callback missing from call\";\n\n // now it's time to support the 'callback' feature of jschannel. We'll traverse the argument\n // object and pick out all of the functions that were passed as arguments.\n var callbacks = { };\n var callbackNames = [ ];\n\n var pruneFunctions = function (path, obj) {\n if (typeof obj === 'object') {\n for (var k in obj) {\n if (!obj.hasOwnProperty(k)) continue;\n var np = path + (path.length ? '/' : '') + k;\n if (typeof obj[k] === 'function') {\n callbacks[np] = obj[k];\n callbackNames.push(np);\n delete obj[k];\n } else if (typeof obj[k] === 'object') {\n pruneFunctions(np, obj[k]);\n }\n }\n }\n };\n pruneFunctions(\"\", m.params);\n\n // build a 'request' message and send it\n var msg = { id: s_curTranId, method: scopeMethod(m.method), params: m.params };\n if (callbackNames.length) msg.callbacks = callbackNames;\n\n if (m.timeout)\n // XXX: This function returns a timeout ID, but we don't do anything with it.\n // We might want to keep track of it so we can cancel it using clearTimeout()\n // when the transaction completes.\n setTransactionTimeout(s_curTranId, m.timeout, scopeMethod(m.method));\n\n // insert into the transaction table\n outTbl[s_curTranId] = { callbacks: callbacks, error: m.error, success: m.success };\n s_transIds[s_curTranId] = onMessage;\n\n // increment current id\n s_curTranId++;\n\n postMessage(msg);\n },\n notify: function(m) {\n if (!m) throw 'missing arguments to notify function';\n if (!m.method || typeof m.method !== 'string') throw \"'method' argument to notify must be string\";\n\n // no need to go into any transaction table\n postMessage({ method: scopeMethod(m.method), params: m.params });\n },\n destroy: function () {\n s_removeBoundChan(cfg.window, cfg.origin, ((typeof cfg.scope === 'string') ? cfg.scope : ''));\n if (window.removeEventListener) window.removeEventListener('message', onMessage, false);\n else if(window.detachEvent) window.detachEvent('onmessage', onMessage);\n ready = false;\n regTbl = { };\n inTbl = { };\n outTbl = { };\n cfg.origin = null;\n pendingQueue = [ ];\n debug(\"channel destroyed\");\n chanId = \"\";\n }\n };\n\n obj.bind('__ready', onReady);\n setTimeout(function() {\n postMessage({ method: scopeMethod('__ready'), params: \"ping\" }, true);\n }, 0);\n\n return obj;\n }\n };\n })();\n\n if (!navigator.id) {\n navigator.id = {};\n }\n\n if (!navigator.id.beginProvisioning || navigator.id._primaryAPIIsShimmed) {\n var ipServer = \"https://login.persona.org\";\n\n var chan = Channel.build({window: window.parent, origin: ipServer, scope: \"vep_prov\"});\n\n navigator.id.beginProvisioning = function(cb) {\n if (typeof cb !== 'function') {\n throw \".beginProvisioning() requires a callback argument\";\n }\n chan.call({\n method: 'beginProvisioning',\n success: function(r) {\n cb(r.email, r.cert_duration_s);\n }\n });\n };\n\n navigator.id.genKeyPair = function(cb) {\n if (typeof cb !== 'function') {\n throw \".genKeyPair() requires a callback argument\";\n }\n chan.call({ method: 'genKeyPair', success: cb});\n };\n\n navigator.id.registerCertificate = function(certificate) {\n chan.notify({ method: 'registerCertificate', params: certificate });\n };\n\n navigator.id.raiseProvisioningFailure = function(reason) {\n chan.notify({ method: 'raiseProvisioningFailure', params: reason });\n };\n\n navigator.id._primaryAPIIsShimmed = true;\n }\n}());\n"
},
"redirectURL": "",
"headersSize": 334,
"bodySize": 8996
},
"cache": {
"afterRequest": {
"expires": "1970-01-01T00:00:00.000Z",
"lastAccess": "2012-08-02T00:02:33.000Z",
"eTag": "",
"hitCount": 28
}
},
"timings": {
"blocked": 0,
"dns": 0,
"connect": 0,
"send": 0,
"wait": 79,
"receive": 0
},
"serverIPAddress": "63.245.217.134",
"connection": "443"
},
{
"pageref": "page_34772",
"startedDateTime": "2012-08-01T17:02:34.060-07:00",
"time": 168,
"request": {
"method": "POST",
"url": "https://hostedpersona.me/gen-cert",
"httpVersion": "HTTP/1.1",
"cookies": [
{
"name": "session_state",
"value": "w7XChi7CmwfDvmDCmFHDo1UdwrfClsKeSQ.w7XDucOuwqXDqsKWJwZwwowIwq4AGSteOMOkwrtmAMOoOMK_woTDr8Ohw5DDhXzCpsKaw7ZswpvCt8KVZ1_CmsKLTC80fsOQGMOBwpDCmcOPw4TDgMKOw5A8USp7N8OYwrHCqHjCq8Omw4ZowqTDnhoRw7DDnGdSw6hhZHE.1343865641867.86400000.w4TChsKMw7Jtw4XCjwfCqB7CtcKrHQljPMKDw4pSw51nwrvCssKEOcOKMsOgw4xjw6XDqQ"
}
],
"headers": [
{
"name": "Host",
"value": "hostedpersona.me"
},
{
"name": "User-Agent",
"value": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:16.0) Gecko/16.0 Firefox/16.0"
},
{
"name": "Accept",
"value": "application/json, text/javascript, */*; q=0.01"
},
{
"name": "Accept-Language",
"value": "en-us,en;q=0.800,zh-tw;q=0.600,es;q=0.400,it-ch;q=0.200"
},
{
"name": "Accept-Encoding",
"value": "gzip, deflate"
},
{
"name": "Connection",
"value": "keep-alive"
},
{
"name": "Content-Type",
"value": "application/json; charset=UTF-8"
},
{
"name": "X-Requested-With",
"value": "XMLHttpRequest"
},
{
"name": "Referer",
"value": "https://hostedpersona.me/provisioning"
},
{
"name": "Content-Length",
"value": "971"
},
{
"name": "Cookie",
"value": "session_state=w7XChi7CmwfDvmDCmFHDo1UdwrfClsKeSQ.w7XDucOuwqXDqsKWJwZwwowIwq4AGSteOMOkwrtmAMOoOMK_woTDr8Ohw5DDhXzCpsKaw7ZswpvCt8KVZ1_CmsKLTC80fsOQGMOBwpDCmcOPw4TDgMKOw5A8USp7N8OYwrHCqHjCq8Omw4ZowqTDnhoRw7DDnGdSw6hhZHE.1343865641867.86400000.w4TChsKMw7Jtw4XCjwfCqB7CtcKrHQljPMKDw4pSw51nwrvCssKEOcOKMsOgw4xjw6XDqQ"
},
{
"name": "x-msisdn",
"value": "542131232131"
},
{
"name": "X-Forwarded-For",
"value": "200.49.193.196"
},
{
"name": "Pragma",
"value": "no-cache"
},
{
"name": "Cache-Control",
"value": "no-cache"
}
],
"queryString": [],
"postData": {
"mimeType": "",
"params": [],
"text": "{\"pubkey\":\"{\\\"algorithm\\\":\\\"DS\\\",\\\"y\\\":\\\"bec28f5dca2d429250d1fc0ae267efb8cf94e348c1a3ece16209d118c914a83adae9720e931335d9802ae0b356950b105871791a4bb99e7ce3e0c77cb609a35a5fb75ae6709f7650a85cb22301e935e8ce230cd6e894904e46480cf58f42b2e76e27664a57c508bb9fe40b09d488dd570e481aaa30fcbe48cd298dc699461d0d\\\",\\\"p\\\":\\\"ff600483db6abfc5b45eab78594b3533d550d9f1bf2a992a7a8daa6dc34f8045ad4e6e0c429d334eeeaaefd7e23d4810be00e4cc1492cba325ba81ff2d5a5b305a8d17eb3bf4a06a349d392e00d329744a5179380344e82a18c47933438f891e22aeef812d69c8f75e326cb70ea000c3f776dfdbd604638c2ef717fc26d02e17\\\",\\\"q\\\":\\\"e21e04f911d1ed7991008ecaab3bf775984309c3\\\",\\\"g\\\":\\\"c52a4a0ff3b7e61fdf1867ce84138369a6154f4afa92966e3c827e25cfa6cf508b90e5de419e1337e07a2e9e2a3cd5dea704d175f8ebf6af397d69e110b96afb17c7a03259329e4829b0d03bbc7896b15b4ade53e130858cc34d96269aa89041f409136c7242a38895c9d5bccad4f389af1d7a4bd1398bd072dffa896233397a\\\"}\",\"duration\":3600,\"_csrf\":\"fYue/eHu6swUGHUqdV2Aceeg\",\"authed_email\":\"[email protected]\"}"
},
"headersSize": 898,
"bodySize": 971
},
"response": {
"status": 200,
"statusText": "OK",
"httpVersion": "HTTP/1.1",
"cookies": [
{
"name": "session_state",
"value": "eMKEwpdoIDDCm8K2HsKiCQLCoDjDvMO6.wrfDvBbCocKSKwvDi8OhY8Krw7nCusOKFsOJ.1343865753485.86400000.w4fCiVZUTEzDvww1OEnDksOEw49Rwqtjw7sQUMKpZMKVcUd4EkjCm24Oag",
"path": "/",
"httpOnly": true
}
],
"headers": [
{
"name": "Server",
"value": "nginx/1.1.19"
},
{
"name": "Date",
"value": "Thu, 02 Aug 2012 00:02:33 GMT"
},
{
"name": "Content-Type",
"value": "application/json; charset=utf-8"
},
{
"name": "Content-Length",
"value": "1423"
},
{
"name": "Connection",
"value": "keep-alive"
},
{
"name": "X-Powered-By",
"value": "Express"
},
{
"name": "Etag",
"value": "-449812020"
},
{
"name": "Set-Cookie",
"value": "session_state=eMKEwpdoIDDCm8K2HsKiCQLCoDjDvMO6.wrfDvBbCocKSKwvDi8OhY8Krw7nCusOKFsOJ.1343865753485.86400000.w4fCiVZUTEzDvww1OEnDksOEw49Rwqtjw7sQUMKpZMKVcUd4EkjCm24Oag; path=/; httponly"
}
],
"content": {
"mimeType": "application/json",
"size": 1423,
"text": "{\n \"cert\": \"eyJhbGciOiJEUzI1NiJ9.eyJwdWJsaWMta2V5Ijp7ImFsZ29yaXRobSI6IkRTIiwieSI6ImJlYzI4ZjVkY2EyZDQyOTI1MGQxZmMwYWUyNjdlZmI4Y2Y5NGUzNDhjMWEzZWNlMTYyMDlkMTE4YzkxNGE4M2FkYWU5NzIwZTkzMTMzNWQ5ODAyYWUwYjM1Njk1MGIxMDU4NzE3OTFhNGJiOTllN2NlM2UwYzc3Y2I2MDlhMzVhNWZiNzVhZTY3MDlmNzY1MGE4NWNiMjIzMDFlOTM1ZThjZTIzMGNkNmU4OTQ5MDRlNDY0ODBjZjU4ZjQyYjJlNzZlMjc2NjRhNTdjNTA4YmI5ZmU0MGIwOWQ0ODhkZDU3MGU0ODFhYWEzMGZjYmU0OGNkMjk4ZGM2OTk0NjFkMGQiLCJwIjoiZmY2MDA0ODNkYjZhYmZjNWI0NWVhYjc4NTk0YjM1MzNkNTUwZDlmMWJmMmE5OTJhN2E4ZGFhNmRjMzRmODA0NWFkNGU2ZTBjNDI5ZDMzNGVlZWFhZWZkN2UyM2Q0ODEwYmUwMGU0Y2MxNDkyY2JhMzI1YmE4MWZmMmQ1YTViMzA1YThkMTdlYjNiZjRhMDZhMzQ5ZDM5MmUwMGQzMjk3NDRhNTE3OTM4MDM0NGU4MmExOGM0NzkzMzQzOGY4OTFlMjJhZWVmODEyZDY5YzhmNzVlMzI2Y2I3MGVhMDAwYzNmNzc2ZGZkYmQ2MDQ2MzhjMmVmNzE3ZmMyNmQwMmUxNyIsInEiOiJlMjFlMDRmOTExZDFlZDc5OTEwMDhlY2FhYjNiZjc3NTk4NDMwOWMzIiwiZyI6ImM1MmE0YTBmZjNiN2U2MWZkZjE4NjdjZTg0MTM4MzY5YTYxNTRmNGFmYTkyOTY2ZTNjODI3ZTI1Y2ZhNmNmNTA4YjkwZTVkZTQxOWUxMzM3ZTA3YTJlOWUyYTNjZDVkZWE3MDRkMTc1ZjhlYmY2YWYzOTdkNjllMTEwYjk2YWZiMTdjN2EwMzI1OTMyOWU0ODI5YjBkMDNiYmM3ODk2YjE1YjRhZGU1M2UxMzA4NThjYzM0ZDk2MjY5YWE4OTA0MWY0MDkxMzZjNzI0MmEzODg5NWM5ZDViY2NhZDRmMzg5YWYxZDdhNGJkMTM5OGJkMDcyZGZmYTg5NjIzMzM5N2EifSwicHJpbmNpcGFsIjp7ImVtYWlsIjoic2hvdXRAb3p0ZW4uY29tIn0sImlhdCI6MTM0Mzg2NTc1MzQ1MCwiZXhwIjoxMzQzODY5MzUzNDUwLCJpc3MiOiJob3N0ZWRwZXJzb25hLm1lIn0.abHFkdWZjlLRxy1lOD7GV4H7hOLwQwlAzC-_pNqe7CiMjdjc3FA61q8u1pEf59OMt-yFOfS3BErCMSPNEBaSDA\"\n}"
},
"redirectURL": "",
"headersSize": 409,
"bodySize": 1423
},
"cache": {},
"timings": {
"blocked": 0,
"dns": 0,
"connect": 0,
"send": 0,
"wait": 168,
"receive": 0
},
"serverIPAddress": "23.23.100.125",
"connection": "443"
},
{
"pageref": "page_34772",
"startedDateTime": "2012-08-01T17:02:34.388-07:00",
"time": 870,
"request": {
"method": "POST",
"url": "https://login.persona.org/wsapi/auth_with_assertion",
"httpVersion": "HTTP/1.1",
"cookies": [
{
"name": "browserid_state",
"value": "UsOSYwbDhMK0w5HDhcOWbjvCg8KGDGoY.w7kRPlDCtwHDp8KTwqLDpEoUwrMLRjo4NMO_wpxxMg89wqcLwr_CnsOWwp_DtEgIw7Y3w4Zvw7Zfwo7DvxIPWj9RwoE1.1343855362261.2419200000.w6djJ8KfdcKTCBrCqVcfwp3ClwnDsWfDnsOfwrxgw4cCTMKaJ1PCvlUawpouVw"
}
],
"headers": [
{
"name": "Host",
"value": "login.persona.org"
},
{
"name": "User-Agent",
"value": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:16.0) Gecko/16.0 Firefox/16.0"
},
{
"name": "Accept",
"value": "application/json;text/plain"
},
{
"name": "Accept-Language",
"value": "en-us,en;q=0.800,zh-tw;q=0.600,es;q=0.400,it-ch;q=0.200"
},
{
"name": "Accept-Encoding",
"value": "gzip, deflate"
},
{
"name": "Connection",
"value": "keep-alive"
},
{
"name": "X-Requested-With",
"value": "XMLHttpRequest"
},
{
"name": "Content-Type",
"value": "application/json; charset=UTF-8"
},
{
"name": "Referer",
"value": "https://login.persona.org/sign_in"
},
{
"name": "Content-Length",
"value": "1651"
},
{
"name": "Cookie",
"value": "browserid_state=UsOSYwbDhMK0w5HDhcOWbjvCg8KGDGoY.w7kRPlDCtwHDp8KTwqLDpEoUwrMLRjo4NMO_wpxxMg89wqcLwr_CnsOWwp_DtEgIw7Y3w4Zvw7Zfwo7DvxIPWj9RwoE1.1343855362261.2419200000.w6djJ8KfdcKTCBrCqVcfwp3ClwnDsWfDnsOfwrxgw4cCTMKaJ1PCvlUawpouVw"
},
{
"name": "x-msisdn",
"value": "542131232131"
},
{
"name": "X-Forwarded-For",
"value": "200.49.193.196"
},
{
"name": "Pragma",
"value": "no-cache"
},
{
"name": "Cache-Control",
"value": "no-cache"
}
],
"queryString": [],
"postData": {
"mimeType": "",
"params": [],
"text": "{\"email\":\"[email protected]\",\"assertion\":\"eyJhbGciOiJEUzI1NiJ9.eyJwdWJsaWMta2V5Ijp7ImFsZ29yaXRobSI6IkRTIiwieSI6ImJlYzI4ZjVkY2EyZDQyOTI1MGQxZmMwYWUyNjdlZmI4Y2Y5NGUzNDhjMWEzZWNlMTYyMDlkMTE4YzkxNGE4M2FkYWU5NzIwZTkzMTMzNWQ5ODAyYWUwYjM1Njk1MGIxMDU4NzE3OTFhNGJiOTllN2NlM2UwYzc3Y2I2MDlhMzVhNWZiNzVhZTY3MDlmNzY1MGE4NWNiMjIzMDFlOTM1ZThjZTIzMGNkNmU4OTQ5MDRlNDY0ODBjZjU4ZjQyYjJlNzZlMjc2NjRhNTdjNTA4YmI5ZmU0MGIwOWQ0ODhkZDU3MGU0ODFhYWEzMGZjYmU0OGNkMjk4ZGM2OTk0NjFkMGQiLCJwIjoiZmY2MDA0ODNkYjZhYmZjNWI0NWVhYjc4NTk0YjM1MzNkNTUwZDlmMWJmMmE5OTJhN2E4ZGFhNmRjMzRmODA0NWFkNGU2ZTBjNDI5ZDMzNGVlZWFhZWZkN2UyM2Q0ODEwYmUwMGU0Y2MxNDkyY2JhMzI1YmE4MWZmMmQ1YTViMzA1YThkMTdlYjNiZjRhMDZhMzQ5ZDM5MmUwMGQzMjk3NDRhNTE3OTM4MDM0NGU4MmExOGM0NzkzMzQzOGY4OTFlMjJhZWVmODEyZDY5YzhmNzVlMzI2Y2I3MGVhMDAwYzNmNzc2ZGZkYmQ2MDQ2MzhjMmVmNzE3ZmMyNmQwMmUxNyIsInEiOiJlMjFlMDRmOTExZDFlZDc5OTEwMDhlY2FhYjNiZjc3NTk4NDMwOWMzIiwiZyI6ImM1MmE0YTBmZjNiN2U2MWZkZjE4NjdjZTg0MTM4MzY5YTYxNTRmNGFmYTkyOTY2ZTNjODI3ZTI1Y2ZhNmNmNTA4YjkwZTVkZTQxOWUxMzM3ZTA3YTJlOWUyYTNjZDVkZWE3MDRkMTc1ZjhlYmY2YWYzOTdkNjllMTEwYjk2YWZiMTdjN2EwMzI1OTMyOWU0ODI5YjBkMDNiYmM3ODk2YjE1YjRhZGU1M2UxMzA4NThjYzM0ZDk2MjY5YWE4OTA0MWY0MDkxMzZjNzI0MmEzODg5NWM5ZDViY2NhZDRmMzg5YWYxZDdhNGJkMTM5OGJkMDcyZGZmYTg5NjIzMzM5N2EifSwicHJpbmNpcGFsIjp7ImVtYWlsIjoic2hvdXRAb3p0ZW4uY29tIn0sImlhdCI6MTM0Mzg2NTc1MzQ1MCwiZXhwIjoxMzQzODY5MzUzNDUwLCJpc3MiOiJob3N0ZWRwZXJzb25hLm1lIn0.abHFkdWZjlLRxy1lOD7GV4H7hOLwQwlAzC-_pNqe7CiMjdjc3FA61q8u1pEf59OMt-yFOfS3BErCMSPNEBaSDA~eyJhbGciOiJEUzEyOCJ9.eyJleHAiOjEzNDM4NjU4NzQxNzQsImF1ZCI6Imh0dHBzOi8vbG9naW4ucGVyc29uYS5vcmcifQ.Vsw6dtnyZ6Fg-X1ZJugIqAQ5UFiyaHVmlu_MPWJHu8bGCVl1hxwn4w\",\"ephemeral\":true,\"csrf\":\"MorXyZPweHprOlC52U/vJQ==\"}"
},
"headersSize": 813,
"bodySize": 1651
},
"response": {
"status": 200,
"statusText": "OK",
"httpVersion": "HTTP/1.1",
"cookies": [],
"headers": [
{
"name": "Cache-Control",
"value": "no-cache, max-age=0"
},
{
"name": "Content-Type",
"value": "application/json; charset=utf-8"
},
{
"name": "Strict-Transport-Security",
"value": "max-age=2592000; includeSubdomains"
},
{
"name": "Date",
"value": "Thu, 02 Aug 2012 00:02:35 GMT"
},
{
"name": "Connection",
"value": "keep-alive"
},
{
"name": "X-Frame-Options",
"value": "DENY"
},
{
"name": "Content-Length",
"value": "17"
}
],
"content": {
"mimeType": "application/json",
"size": 17,
"text": "{\"success\":false}"
},
"redirectURL": "",
"headersSize": 269,
"bodySize": 17
},
"cache": {},
"timings": {
"blocked": 0,
"dns": 0,
"connect": 0,
"send": 0,
"wait": 870,
"receive": 0
},
"serverIPAddress": "63.245.217.134",
"connection": "443"
}
]
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment