summaryrefslogtreecommitdiffabout
path: root/src
authorMichael Krelin <hacker@klever.net>2008-03-01 16:14:55 (UTC)
committer Michael Krelin <hacker@klever.net>2008-03-01 16:14:55 (UTC)
commitfe00dd0be8fd88dc8179eed7a38663f07c1288a7 (patch) (unidiff)
tree7c16d78aef4f216192b197a37420ec9c0a77d2c4 /src
parentd85adfb349b3c7a988bec21fcbad86f5f98c70de (diff)
downloadfoxri-fe00dd0be8fd88dc8179eed7a38663f07c1288a7.zip
foxri-fe00dd0be8fd88dc8179eed7a38663f07c1288a7.tar.gz
foxri-fe00dd0be8fd88dc8179eed7a38663f07c1288a7.tar.bz2
added more OpenID service types and handling of append='qxri' attribute
* added OpenID 1.1 and 2.0 service types to SERVICE_CLASSES * append qxri to URI in presence of append='qxri' attribute (append='authority' is yet to be handled) * added more OpenID service type URIs to friendlyServiceName() Signed-off-by: Michael Krelin <hacker@klever.net>
Diffstat (limited to 'src') (more/less context) (ignore whitespace changes)
-rwxr-xr-xsrc/components/xriProtocolHandler.js28
1 files changed, 22 insertions, 6 deletions
diff --git a/src/components/xriProtocolHandler.js b/src/components/xriProtocolHandler.js
index 1105874..3d27784 100755
--- a/src/components/xriProtocolHandler.js
+++ b/src/components/xriProtocolHandler.js
@@ -28,48 +28,51 @@ const CONTRACT_ID = "@mozilla.org/network/protocol;1?name=xri";
28const CID_URI = "@mozilla.org/network/simple-uri;1"; 28const CID_URI = "@mozilla.org/network/simple-uri;1";
29const kIOSERVICE_CID_STR = "{9ac9e770-18bc-11d3-9337-00104ba0fd40}"; 29const kIOSERVICE_CID_STR = "{9ac9e770-18bc-11d3-9337-00104ba0fd40}";
30const CID_URL = "@mozilla.org/network/standard-url;1"; 30const CID_URL = "@mozilla.org/network/standard-url;1";
31 31
32// description 32// description
33const CLASS_NAME = "XRI Protocol Handler"; 33const CLASS_NAME = "XRI Protocol Handler";
34 34
35const PROXY_URI = "http://xri.net/"; 35const PROXY_URI = "http://xri.net/";
36 36
37const XP_ANY_TYPE = 0; 37const XP_ANY_TYPE = 0;
38const XP_NUMBER_TYPE = 1; 38const XP_NUMBER_TYPE = 1;
39const XP_STRING_TYPE = 2; 39const XP_STRING_TYPE = 2;
40const XP_BOOLEAN_TYPE = 3; 40const XP_BOOLEAN_TYPE = 3;
41const XP_UNORDERED_NODE_ITERATOR_TYPE = 4; 41const XP_UNORDERED_NODE_ITERATOR_TYPE = 4;
42const XP_ORDERED_NODE_ITERATOR_TYPE = 5; 42const XP_ORDERED_NODE_ITERATOR_TYPE = 5;
43const XP_UNORDERED_NODE_SNAPSHOT_TYPE = 6; 43const XP_UNORDERED_NODE_SNAPSHOT_TYPE = 6;
44const XP_ORDERED_NODE_SNAPSHOT_TYPE = 7; 44const XP_ORDERED_NODE_SNAPSHOT_TYPE = 7;
45const XP_ANY_UNORDERED_NODE_TYPE = 8; 45const XP_ANY_UNORDERED_NODE_TYPE = 8;
46const XP_FIRST_ORDERED_NODE_TYPE = 9; 46const XP_FIRST_ORDERED_NODE_TYPE = 9;
47 47
48 48
49var SERVICE_CLASSES = { 49var SERVICE_CLASSES = {
50 'xri://+i-service*(+contact)*($v*1.0)': 'i-contact', 50 'xri://+i-service*(+contact)*($v*1.0)': 'i-contact',
51 'http://openid.net/signon/1.0': 'openid', 51 'http://openid.net/signon/1.0': 'openid',
52 'http://openid.net/signon/1.1': 'openid',
53 'http://specs.openid.net/auth/2.0/signon': 'openid',
54 'http://specs.openid.net/auth/2.0/server': 'openid',
52 'xri://$res*auth*($v*2.0)': 'res-auth', 55 'xri://$res*auth*($v*2.0)': 'res-auth',
53 'xri://+i-service*(+authn)*(+saml)*($v*1.0)': 'authn-saml', 56 'xri://+i-service*(+authn)*(+saml)*($v*1.0)': 'authn-saml',
54 'xri://+i-service*(+metadata)*(+saml)*($v*1.0)' : 'metadata-saml', 57 'xri://+i-service*(+metadata)*(+saml)*($v*1.0)' : 'metadata-saml',
55 'xri://+i-service*(+forwarding)*($v*1.0)': 'i-forwarding' 58 'xri://+i-service*(+forwarding)*($v*1.0)': 'i-forwarding'
56}; 59};
57 60
58 61
59const HTML_HEAD = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n\ 62const HTML_HEAD = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n\
60 <html xmlns=\"http://www.w3.org/1999/xhtml\">\n\ 63 <html xmlns=\"http://www.w3.org/1999/xhtml\">\n\
61 <head>\n\ 64 <head>\n\
62 <title>FoXRI Explorer - #QXRI#</title>\n\ 65 <title>FoXRI Explorer - #QXRI#</title>\n\
63 <link href=\"chrome://foxri/content/foxri_explorer.css\" rel=\"stylesheet\" type=\"text/css\" />\n\ 66 <link href=\"chrome://foxri/content/foxri_explorer.css\" rel=\"stylesheet\" type=\"text/css\" />\n\
64 <body>\n\ 67 <body>\n\
65 <h1>FoXRI Explorer</h1>\n\ 68 <h1>FoXRI Explorer</h1>\n\
66 <div id=\"explorer_body\">\n"; 69 <div id=\"explorer_body\">\n";
67 70
68const HTML_FOOT = "</div>\n\ 71const HTML_FOOT = "</div>\n\
69 </body>\n\ 72 </body>\n\
70 </html>"; 73 </html>";
71 74
72 75
73 76
74/// Generic object method wrapper 77/// Generic object method wrapper
75function methodWrapper(obj, method) 78function methodWrapper(obj, method)
@@ -216,97 +219,105 @@ function renderService(srv, doc, qxri)
216 + " [ <tt><a href=\"" + qxri_prefix + p.nodeValue + "\">" 219 + " [ <tt><a href=\"" + qxri_prefix + p.nodeValue + "\">"
217 + qxri_prefix + p.nodeValue + "</a></tt> ]" 220 + qxri_prefix + p.nodeValue + "</a></tt> ]"
218 + "<br/>\n"; 221 + "<br/>\n";
219 } 222 }
220 } 223 }
221 224
222 225
223 // get the mediatypes 226 // get the mediatypes
224 mediaTypes = new Array(); 227 mediaTypes = new Array();
225 res = runExpr(doc, srv, "xrd:MediaType/text()"); 228 res = runExpr(doc, srv, "xrd:MediaType/text()");
226 var m; 229 var m;
227 while (m = res.iterateNext()) { 230 while (m = res.iterateNext()) {
228 if (!knownServiceType) { 231 if (!knownServiceType) {
229 var srvType = guessServiceTypeByMime(m.nodeValue); 232 var srvType = guessServiceTypeByMime(m.nodeValue);
230 knownServiceType = srvType? srvType : null; 233 knownServiceType = srvType? srvType : null;
231 } 234 }
232 235
233 mediaTypes.push(m.nodeValue); 236 mediaTypes.push(m.nodeValue);
234 if (m.nodeValue) { 237 if (m.nodeValue) {
235 html_mediatypes += "<strong>Media Type:</strong> " + m.nodeValue + "<br/>"; 238 html_mediatypes += "<strong>Media Type:</strong> " + m.nodeValue + "<br/>";
236 } 239 }
237 } 240 }
238 241
239 242
240 res = runExpr(doc, srv, "xrd:URI/text()"); 243 res = runExpr(doc, srv, "xrd:URI");
241 var u; 244 var uu;
242 while (u = res.iterateNext()) { 245 while (uu = res.iterateNext()) {
243 if (!u.nodeValue) 246 var u = uu.firstChild;
247 if (!(u.nodeValue && u.nodeType==3))
244 continue; 248 continue;
245 249
246 var srvType = guessServiceTypeByURI(u.nodeValue); 250 var srvType = guessServiceTypeByURI(u.nodeValue);
247 if (!knownServiceType) { 251 if (!knownServiceType) {
248 knownServiceType = srvType; 252 knownServiceType = srvType;
249 } 253 }
250 254
251 html_uris += "<div class=\"" + getServiceClass(srvType) + "\">"; 255 html_uris += "<div class=\"" + getServiceClass(srvType) + "\">";
252 256
253 var linkContent = u.nodeValue; 257 var linkContent = u.nodeValue;
254 var uriParts = u.nodeValue.match('^(.*):(.*)$'); 258 var uriParts = u.nodeValue.match('^(.*):(.*)$');
255 if (!uriParts) 259 if (!uriParts)
256 continue; 260 continue;
257 261
258 if (uriParts[1] == 'data') { 262 if (uriParts[1] == 'data') {
259 uriParts = uriParts[2].match('^(.*/.*),(.*)'); 263 uriParts = uriParts[2].match('^(.*/.*),(.*)');
260 if (uriParts && uriParts[1].match('^image/', 'i')) { 264 if (uriParts && uriParts[1].match('^image/', 'i')) {
261 linkContent = "<img src=\"" + u.nodeValue + "\"/>"; 265 linkContent = "<img src=\"" + u.nodeValue + "\"/>";
262 } 266 }
263 else if (uriParts) { 267 else if (uriParts) {
264 linkContent = uriParts[1] + " data"; 268 linkContent = uriParts[1] + " data";
265 } 269 }
266 } 270 }
267 else if (uriParts[1] == 'skype') { 271 else if (uriParts[1] == 'skype') {
268 uriParts = uriParts[2].match('^(.*)\\?(.*)'); 272 uriParts = uriParts[2].match('^(.*)\\?(.*)');
269 if (uriParts) { 273 if (uriParts) {
270 if (uriParts[2] == "call") { 274 if (uriParts[2] == "call") {
271 linkContent = "<img src=\"chrome://foxri/content/skype_call_large.png\" alt=\"Call " + uriParts[1] + "\"/>"; 275 linkContent = "<img src=\"chrome://foxri/content/skype_call_large.png\" alt=\"Call " + uriParts[1] + "\"/>";
272 } 276 }
273 else if (uriParts[2] == "chat") { 277 else if (uriParts[2] == "chat") {
274 linkContent = "<img src=\"chrome://foxri/content/skype_chat_large.png\" alt=\"Chat with " + uriParts[1] + "\"/>"; 278 linkContent = "<img src=\"chrome://foxri/content/skype_chat_large.png\" alt=\"Chat with " + uriParts[1] + "\"/>";
275 } 279 }
276 else if (uriParts[2] == "add") { 280 else if (uriParts[2] == "add") {
277 linkContent = "<img src=\"chrome://foxri/content/skype_add_large.png\" alt=\"Add " + uriParts[1] + " to Skype\"/>"; 281 linkContent = "<img src=\"chrome://foxri/content/skype_add_large.png\" alt=\"Add " + uriParts[1] + " to Skype\"/>";
278 } 282 }
279 } 283 }
280 } 284 }
281 else if (uriParts[1] == 'aim') { 285 else if (uriParts[1] == 'aim') {
282 uriParts = uriParts[2].match('^(.*)\\?.*screenname=([^&]*)', 'i'); 286 uriParts = uriParts[2].match('^(.*)\\?.*screenname=([^&]*)', 'i');
283 if (uriParts) { 287 if (uriParts) {
284 linkContent = "<img src=\"chrome://foxri/content/aim_logo.gif\" alt=\"Chat with " + uriParts[2] + "\"/> Chat with " + uriParts[2]; 288 linkContent = "<img src=\"chrome://foxri/content/aim_logo.gif\" alt=\"Chat with " + uriParts[2] + "\"/> Chat with " + uriParts[2];
285 } 289 }
286 } 290 }
287 291
288 html_uris += "<a href=\""+u.nodeValue+"\">" 292 var linkhref = u.nodeValue;
293 var xrap = uu.getAttribute('append');
294 if(xrap=='qxri') {
295 linkhref += qxri.replace(/^xri:\/\//,'');
296 }else if(xrap!=null){
297 dump("Unhandled @append: "+xrap+"\n");
298 }
299 html_uris += "<a href=\""+linkhref+"\">"
289 + linkContent + "</a>"; 300 + linkContent + "</a>";
290 html_uris += "</div>"; 301 html_uris += "</div>";
291 } 302 }
292 303
293 var html = "<div class=\"service srv_" + getServiceClass(knownServiceType) + "\">\n"; 304 var html = "<div class=\"service srv_" + getServiceClass(knownServiceType) + "\">\n";
294 html += html_types; 305 html += html_types;
295 html += html_paths; 306 html += html_paths;
296 html += html_mediatypes; 307 html += html_mediatypes;
297 if (html_uris) { 308 if (html_uris) {
298 html += "<strong>URI(s):</strong><br/>\n"; 309 html += "<strong>URI(s):</strong><br/>\n";
299 html += html_uris; 310 html += html_uris;
300 } 311 }
301 html += "</div>"; 312 html += "</div>";
302 313
303 return html; 314 return html;
304} 315}
305 316
306 317
307 318
308function isKnownServiceType(type) 319function isKnownServiceType(type)
309{ 320{
310 if (type.toLowerCase() in SERVICE_CLASSES) { 321 if (type.toLowerCase() in SERVICE_CLASSES) {
311 return true; 322 return true;
312 } 323 }
@@ -371,49 +382,54 @@ function guessServiceTypeByURI(uri)
371 } 382 }
372 return "unknown"; 383 return "unknown";
373} 384}
374 385
375 386
376function guessServiceTypeByMime(mimeType) 387function guessServiceTypeByMime(mimeType)
377{ 388{
378 if (mimeType.match(/^application\/(rss|atom)\+xml/i)) { 389 if (mimeType.match(/^application\/(rss|atom)\+xml/i)) {
379 dump("feed detected!\n"); 390 dump("feed detected!\n");
380 return "feed"; 391 return "feed";
381 } 392 }
382 else if (mimeType.match(/^image\//i)) { 393 else if (mimeType.match(/^image\//i)) {
383 return "image"; 394 return "image";
384 } 395 }
385 return null; 396 return null;
386} 397}
387 398
388 399
389 400
390function friendlyServiceName(srvType, uri) 401function friendlyServiceName(srvType, uri)
391{ 402{
392 if (srvType && srvType == "xri://+i-service*(+contact)*($v*1.0)") { 403 if (srvType && srvType == "xri://+i-service*(+contact)*($v*1.0)") {
393 return "Contact Service"; 404 return "Contact Service";
394 } 405 }
395 else if (srvType && srvType == "http://openid.net/signon/1.0") { 406 else if (srvType && (
407 srvType == "http://openid.net/signon/1.0"
408 || srvType == "http://openid.net/signon/1.1"
409 || srvType == "http://specs.openid.net/auth/2.0/signon"
410 || srcType == "http://specs.openid.net/auth/2.0/server"
411 ) ) {
396 return "OpenID Authentication Service"; 412 return "OpenID Authentication Service";
397 } 413 }
398 else if (srvType && srvType == "xri://$res*auth*($v*2.0)") { 414 else if (srvType && srvType == "xri://$res*auth*($v*2.0)") {
399 return "Authority Resolution Service"; 415 return "Authority Resolution Service";
400 } 416 }
401 else { 417 else {
402 if (uri == null) { 418 if (uri == null) {
403 return "Generic Service"; 419 return "Generic Service";
404 } 420 }
405 if (uri.match(/^https?:/i)) { 421 if (uri.match(/^https?:/i)) {
406 return "Web Link"; 422 return "Web Link";
407 } 423 }
408 else if (uri.match(/^skype:/i)) { 424 else if (uri.match(/^skype:/i)) {
409 var user = uri.substring("skype:".length, uri.indexOf('?')); 425 var user = uri.substring("skype:".length, uri.indexOf('?'));
410 return "Skype <a href=\"" + uri + "\"><img src=\"chrome://foxri/content/skype_call.png\"></a>"; 426 return "Skype <a href=\"" + uri + "\"><img src=\"chrome://foxri/content/skype_call.png\"></a>";
411 } 427 }
412 else if (uri.match(/^mailto:/i)) { 428 else if (uri.match(/^mailto:/i)) {
413 var qmark = uri.indexOf('?'); 429 var qmark = uri.indexOf('?');
414 var email = (qmark == -1)? 430 var email = (qmark == -1)?
415 uri.substr("mailto:".length) : 431 uri.substr("mailto:".length) :
416 uri.substring("mailto:".length, qmark); 432 uri.substring("mailto:".length, qmark);
417 return "Email (address: " + email + ")"; 433 return "Email (address: " + email + ")";
418 } 434 }
419 else if (srvType != null) { 435 else if (srvType != null) {