1 dump('entering util/network.js\n');
6 if (typeof util == 'undefined') util = {};
7 util.network = function () {
11 JSAN.use('util.error'); this.error = new util.error();
12 JSAN.use('util.sound'); this.sound = new util.sound();
14 offlineStrings = document.getElementById('offlineStrings');
17 alert('error in util.network constructor: ' + E);
24 util.network.prototype = {
28 'network_timeout' : 55, /* seconds */
30 'NETWORK_FAILURE' : null,
32 'simple_request' : function(method_id,params,f,override_params) {
34 //var sparams = js2JSON(params);
35 //obj.error.sdump('D_SES','simple_request '+ method_id +' '+obj.error.pretty_print(sparams.slice(1,sparams.length-1))+
36 // '\noverride_params = ' + override_params + '\n');
37 if (typeof api[method_id] == 'undefined') {
38 throw( offlineStrings.getFormattedString('network.method_not_found.error', [method_id]) );
40 var secure = true; if (typeof api[method_id].secure != 'undefined') secure = api[method_id].secure;
41 return this.request(api[method_id].app,api[method_id].method,params,f,override_params,{ 'secure' : secure, 'method_id' : method_id });
44 'get_result' : function (req) {
47 var fake_ilsevent_for_network_errors = { 'ilsevent' : -1, 'textcode' : offlineStrings.getString('network.server_or_method.error') };
50 result = fake_ilsevent_for_network_errors;
52 result = req.getResultObject();
53 if(result && req._reported_events) {
54 if(typeof result.ilsevent != 'undefined') {
55 result._reported_events = req._reported_events;
57 result[0]._reported_events = req._reported_events;
63 if (instanceOf(E, NetworkFailure)) {
64 obj.NETWORK_FAILURE = E;
66 try { obj.NETWORK_FAILURE = js2JSON(E); } catch(F) { dump(F + '\n'); obj.NETWORK_FAILURE = E; };
69 obj.NETWORK_FAILURE = offlineStrings.getString('network.unknown_status');
71 result = fake_ilsevent_for_network_errors;
76 'request' : function (app,name,params,f,override_params,_params) {
80 //var sparams = js2JSON(params);
81 //obj.error.sdump('D_SES','request '+ app + ' ' + name +' '+obj.error.pretty_print(sparams.slice(1,sparams.length-1))+
82 // '\noverride_params = ' + override_params + '\n_params = ' + _params + '\n');
86 if (typeof _params == 'undefined') {
87 // If we're not using simple_request to get here, let's assume secure by default
88 _params = { 'secure' : true };
91 var request = this._request(app,name,params,f,override_params,_params);
93 return this.get_result(request);
103 '_request' : function (app,name,params,f,override_params,_params) {
106 var sparams = js2JSON(params);
107 obj.error.sdump('D_SES','_request '+app+' '+name+' '+obj.error.pretty_print(sparams.slice(1,sparams.length-1))+
108 '\noverride_params = ' + override_params + '\n_params = ' + _params +
109 '\nResult #' + (++obj.link_id) + ( f ? ' asynced' : ' synced' ) +
110 '\nlocation.href = ' + location.href );
112 if (document.getElementById('network_progress')) {
113 if (g && g.menu && g.menu.network_meter && typeof g.menu.network_meter.inc == 'function') g.menu.network_meter.inc(app,name);
114 } else if (typeof xulG != 'undefined') {
115 if (xulG && xulG.network_meter && typeof xulG.network_meter.inc == 'function') xulG.network_meter.inc(app,name);
118 var request = new RemoteRequest( app, name );
119 if (_params && _params.secure) {
120 request.setSecure(true);
122 request.setSecure(false);
124 for(var index in params) {
125 request.addParam(params[index]);
128 var start_timer = (new Date).getTime();
130 request.setCompleteCallback(
133 var duration = ( (new Date).getTime() - start_timer )/1000;
134 if ( obj.get_result(req) == null && duration > obj.network_timeout ) req.cancelled = true;
136 if (document.getElementById('network_progress')) {
137 if (g && g.menu && g.menu.network_meter && typeof g.menu.network_meter.dec == 'function') g.menu.network_meter.dec(app,name);
138 } else if (typeof xulG != 'undefined') {
139 if (xulG && xulG.network_meter && typeof xulG.network_meter.dec == 'function') xulG.network_meter.dec(app,name);
142 var json_string = js2JSON(obj.get_result(req));
143 obj.error.sdump('D_SES_RESULT','asynced result #'
144 + obj.link_id + '\n\n'
145 + (json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string)
146 + '\n\nOriginal Request:\n\n'
147 + 'request '+app+' '+name+' '+ sparams.slice(1,sparams.length-1));
148 obj.play_sounds( request );
149 req = obj.rerequest_on_session_timeout(app,name,params,req,override_params,_params);
150 req = obj.rerequest_on_perm_failure(app,name,params,req,override_params,_params);
151 if (override_params) {
152 req = obj.rerequest_on_override(app,name,params,req,override_params,_params);
154 req = obj.check_for_offline(app,name,params,req,override_params,_params);
156 obj.NETWORK_FAILURE = null;
160 E.textcode = offlineStrings.getString('network.server_or_method.error');
162 f( { 'getResultObject' : function() { return E; } } );
175 var duration = ( (new Date).getTime() - start_timer )/1000;
176 if ( obj.get_result(request) == null && duration > obj.network_timeout ) request.cancelled = true;
178 if (document.getElementById('network_progress')) {
179 if (g && g.menu && g.menu.network_meter && typeof g.menu.network_meter.dec == 'function') g.menu.network_meter.dec(app,name);
180 } else if (typeof xulG != 'undefined') {
181 if (xulG && xulG.network_meter && typeof xulG.network_meter.dec == 'function') xulG.network_meter.dec(app,name);
187 var result = obj.get_result(request);
188 var json_string = js2JSON(result);
189 this.error.sdump('D_SES_RESULT','synced result #'
190 + obj.link_id + '\n\n' + ( json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string )
191 + '\n\nOriginal Request:\n\n'
192 + 'request '+app+' '+name+' '+ sparams.slice(1,sparams.length-1));
193 obj.play_sounds( request );
194 request = obj.rerequest_on_session_timeout(app,name,params,request,override_params,_params);
195 request = obj.rerequest_on_perm_failure(app,name,params,request,override_params,_params);
196 if (override_params) {
197 request = obj.rerequest_on_override(app,name,params,request,override_params,_params);
199 request = obj.check_for_offline(app,name,params,request,override_params,_params);
200 obj.NETWORK_FAILURE = null;
206 if (instanceOf(E,perm_ex)) {
207 alert('in util.network, _request : permission exception: ' + js2JSON(E));
213 'check_for_offline' : function (app,name,params,req,override_params,_params) {
216 var result = obj.get_result(req);
217 if (result == null) return req;
218 if (typeof result.ilsevent == 'undefined') return req;
219 if (result.ilsevent != -1) return req;
221 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
230 if (data.proceed_offline) {
236 var network_failure_string;
237 var network_failure_status_string;
240 try { network_failure_string = String( obj.NETWORK_FAILURE ); } catch(E) { network_failure_string = E; }
241 try { network_failure_status_string = typeof obj.NETWORK_FAILURE == 'object' && typeof obj.NETWORK_FAILURE != 'null' && typeof obj.NETWORK_FAILURE.status == 'function' ? obj.NETWORK_FAILURE.status() : ''; } catch(E) { network_failure_status_string = ''; obj.error.sdump('D_ERROR', 'setting network_failure_status_string: ' + E); }
243 try { msg = offlineStrings.getFormattedString('network.server.failure.exception', [data.server_unadorned]) + '\n' +
244 offlineStrings.getFormattedString('network.server.method', [name]) + '\n' +
245 offlineStrings.getFormattedString('network.server.params', [js2JSON(params)]) + '\n' +
246 offlineStrings.getString('network.server.thrown_label') + '\n' + network_failure_string + '\n' +
247 offlineStrings.getString('network.server.status_label') + '\n' + network_failure_status_string;
248 } catch(E) { msg = E; }
250 try { obj.error.sdump('D_SES_ERROR',msg); } catch(E) { alert('3: ' + E); }
252 r = obj.error.yns_alert(
254 offlineStrings.getString('network.network_failure'),
255 offlineStrings.getString('network.retry_network'),
256 offlineStrings.getString('network.ignore_errors'),
258 offlineStrings.getString('common.confirm')
261 data.proceed_offline = true; data.stash('proceed_offline');
262 dump('Remembering proceed_offline for 200000 ms.\n');
265 data.proceed_offline = false; data.stash('proceed_offline');
266 dump('Setting proceed_offline back to false.\n');
272 dump( r == 0 ? 'Retry Network\n' : 'Ignore Errors\n' );
276 req = obj._request(app,name,params,null,override_params,_params);
277 if (obj.get_result(req)) proceed = true; /* daily WTF, why am I even doing this? :) */
292 'reset_titlebars' : function(data) {
294 data.stash_retrieve();
296 JSAN.use('util.window'); var win = new util.window();
297 var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService();
298 var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
299 var enumerator = windowManagerInterface.getEnumerator(null);
301 var w; // set title on all appshell windows
302 while ( w = enumerator.getNext() ) {
303 if (w.document.title.match(/^\d/)) {
305 win.appshell_name_increment()
306 + ': ' + data.list.au[0].usrname()
307 + '@' + data.ws_name;
308 + '.' + data.server_unadorned
312 obj.error.standard_unexpected_error_alert(offlineStrings.getString('network.window_title.error'),E);
316 'set_user_status' : function() {
317 data.stash_retrieve();
319 var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService();
320 var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
321 var permlist = windowManagerInterface.getMostRecentWindow('eg_main').get_menu_perms(null);
323 var enumerator = windowManagerInterface.getEnumerator('eg_menu');
327 while ( w = enumerator.getNext() ) {
328 x = w.document.getElementById('oc_menuitem');
330 if(!offlinestrings) w.document.getElementById('offlineStrings');
331 if(permlist) w.g.menu.set_menu_access(permlist);
332 if(data.list.au.length > 1) {
333 addCSSClass(w.document.getElementById('main_tabbox'),'operator_change');
334 x.setAttribute('label', offlineStrings.getFormattedString('menu.cmd_chg_session.operator.label', [data.list.au[1].usrname()]) );
337 removeCSSClass(w.document.getElementById('main_tabbox'),'operator_change');
338 x.setAttribute('label', x.getAttribute('label_orig'));
342 obj.error.standard_unexpected_error_alert(offlineStrings.getString('network.window_title.error'),E);
346 'get_new_session' : function(name,xulG,text) {
350 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
351 var url = urls.XUL_AUTH_SIMPLE;
352 if (typeof xulG != 'undefined' && typeof xulG.url_prefix == 'function') url = xulG.url_prefix( url );
353 JSAN.use('util.window'); var win = new util.window();
354 var my_xulG = win.open(
356 //+ '?login_type=staff'
357 //+ '&desc_brief=' + window.escape( text ? 'Session Expired' : 'Operator Change' )
358 //+ '&desc_full=' + window.escape( text ? 'Please enter the credentials for a new login session.' : 'Please enter the credentials for the new login session. Note that the previous session is still active.'),
359 //'simple_auth' + (new Date()).toString(),
360 offlineStrings.getString('network.new_session.authorize'),
361 'chrome,resizable,modal,width=700,height=500',
363 'login_type' : 'staff',
364 'desc_brief' : text ? offlineStrings.getString('network.new_session.expired') : offlineStrings.getString('network.new_session.operator_change'),
365 'desc_full' : text ? offlineStrings.getString('network.new_session.expired.prompt') : offlineStrings.getString('network.new_session.operator_change.prompt')
366 //'simple_auth' : (new Date()).toString(),
369 JSAN.use('OpenILS.data');
370 var data = new OpenILS.data(); data.init({'via':'stash'});
371 if (typeof data.temporary_session != 'undefined' && data.temporary_session != '') {
372 data.session.key = data.temporary_session.key;
373 data.session.authtime = data.temporary_session.authtime;
374 data.stash('session');
376 var ios = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
377 var cookieUri = ios.newURI("http://" + data.server_unadorned, null, null);
378 var cookieUriSSL = ios.newURI("https://" + data.server_unadorned, null, null);
379 var cookieSvc = Components.classes["@mozilla.org/cookieService;1"].getService(Components.interfaces.nsICookieService);
381 cookieSvc.setCookieString(cookieUri, null, "ses="+data.session.key, null);
382 cookieSvc.setCookieString(cookieUriSSL, null, "ses="+data.session.key, null);
385 alert(offineStrings.getFormattedString('main.session_cookie.error', [E]));
387 if (! data.list.au ) data.list.au = [];
388 data.list.au[0] = JSON2js( data.temporary_session.usr );
390 obj.reset_titlebars(data);
393 obj.error.sdump('D_TRACE','No new session key after simple_auth in util/network\n');
398 obj.error.standard_unexpected_error_alert('util.network.get_new_session',E);
402 'rerequest_on_session_timeout' : function(app,name,params,req,override_params,_params) {
405 var robj = obj.get_result(req);
406 if (robj != null && robj.ilsevent && robj.ilsevent == 1001 /* NO_SESSION */) {
408 if (obj.get_new_session(name,undefined,true)) {
409 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
410 params[0] = data.session.key;
411 req = obj._request(app,name,params,null,override_params,_params);
415 this.error.standard_unexpected_error_alert('rerequest_on_session_timeout',E);
420 'rerequest_on_perm_failure' : function(app,name,params,req,override_params,_params) {
423 var robj = obj.get_result(req);
424 if (robj != null && robj.ilsevent && robj.ilsevent == 5000) {
425 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
426 if (location.href.match(/^chrome/)) {
427 //alert('Permission denied.');
429 JSAN.use('util.window'); var win = new util.window();
430 var my_xulG = win.open(
431 urls.XUL_AUTH_SIMPLE,
432 //+ '?login_type=temp'
433 //+ '&desc_brief=' + window.escape('Permission Denied: ' + robj.ilsperm)
434 //+ '&desc_full=' + window.escape('Another staff member with the above permission may authorize this specific action. Please notify your library administrator if you need this permission. If you feel you have received this exception in error, inform your friendly Evergreen developers of the above permission and this debug information: ' + name),
435 //'simple_auth' + (new Date()).toString(),
436 offlineStrings.getFormattedString('network.permission.authorize'),
437 'chrome,resizable,modal,width=700,height=500',
439 'login_type' : 'temp',
440 'desc_brief' : offlineStrings.getFormattedString('network.permission.description.brief', [robj.ilsperm]),
441 'desc_full' : offlineStrings.getFormattedString('network.permission.description.full', [name])
442 //'simple_auth' : (new Date()).toString(),
445 JSAN.use('OpenILS.data');
446 //var data = new OpenILS.data(); data.init({'via':'stash'});
447 if (typeof my_xulG.temporary_session != 'undefined' && my_xulG.temporary_session != '') {
448 params[0] = my_xulG.temporary_session.key;
449 req = obj._request(app,name,params,null,override_params,_params);
454 this.error.sdump('D_ERROR',E);
459 'rerequest_on_override' : function (app,name,params,req,override_params,_params) {
462 if (!override_params.text) override_params.text = {};
463 if (!override_params.auto_override_these_events) override_params.auto_override_these_events = [];
464 if (!override_params.report_override_on_events) override_params.report_override_on_events = [];
465 function override(r) {
467 // test to see if we can suppress this dialog and auto-override
468 var auto_override = false;
469 if (override_params.auto_override_these_events.length > 0) {
470 auto_override = true;
471 for (var i = 0; i < r.length; i++) {
473 (typeof r[i].ilsevent != 'undefined') &&
475 (override_params.auto_override_these_events.indexOf( r[i].ilsevent == null ? null : Number(r[i].ilsevent) ) != -1) ||
476 (override_params.auto_override_these_events.indexOf( r[i].textcode ) != -1)
482 auto_override = false;
488 req = obj._request(app,name + '.override',params);
492 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
493 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">' +
494 '<groupbox><caption label="' + offlineStrings.getString('network.override.exceptions') + '"/>' +
495 '<grid><columns><column/><column flex="1"/></columns><rows>';
496 for (var i = 0; i < r.length; i++) {
497 var t1 = String(r[i].ilsevent).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
498 var t2 = String(r[i].textcode).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
499 var t3 = String((override_params.text[r[i].ilsevent] ? override_params.text[r[i].ilsevent](r[i]) : '')).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
500 var t4 = String(r[i].desc).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
502 '<description class="oils_event" tooltiptext="' + t1 + '">' + t2 + '</description>' +
503 '<description>' + t3 + '</description>' +
504 '</row><row>' + '<description>' + t4 + '</description>' + '</row>';
506 xml += '</rows></grid></groupbox><groupbox><caption label="' + offlineStrings.getString('network.override.override') +'"/><hbox>' +
507 '<description>' + offlineStrings.getString('network.override.force.prompt') + '</description>' +
508 '<button accesskey="' + offlineStrings.getString('common.no.accesskey') + '" label="' + offlineStrings.getString('common.no') + '" name="fancy_cancel"/>' +
509 '<button id="override" accesskey="' + offlineStrings.getString('common.yes.accesskey') + '" label="' + offlineStrings.getString('common.yes') + '" name="fancy_submit" value="override"/></hbox></groupbox></vbox>';
510 //JSAN.use('OpenILS.data');
511 //var data = new OpenILS.data(); data.init({'via':'stash'});
512 //data.temp_override_xml = xml; data.stash('temp_override_xml');
513 JSAN.use('util.window'); var win = new util.window();
514 var fancy_prompt_data = win.open(
515 urls.XUL_FANCY_PROMPT,
516 //+ '?xml_in_stash=temp_override_xml'
517 //+ '&title=' + window.escape(override_params.title),
518 'fancy_prompt', 'chrome,resizable,modal,width=700,height=500',
519 { 'xml' : xml, 'title' : override_params.title, 'sound' : 'bad', 'sound_object' : obj.sound }
521 if (fancy_prompt_data.fancy_status == 'complete') {
522 req = obj._request(app,name + '.override',params);
523 if (req && override_params.report_override_on_events.length > 0 && typeof result == 'object') {
524 var reported_events = [];
525 for (var i = 0; i < r.length; i++) {
526 if (typeof r[i].ilsevent != 'undefined') {
527 if (override_params.report_override_on_events.indexOf( r[i].ilsevent == null ? null : Number(r[i].ilsevent) ) != -1) {
528 reported_events.push(Number(r[i].ilsevent));
530 if (override_params.report_override_on_events.indexOf( r[i].textcode ) != -1) {
531 reported_events.push(r[i].textcode);
535 req._reported_events = reported_events;
540 alert('in util.network, rerequest_on_override, override:' + E);
544 var result = obj.get_result(req);
545 if (!result) return req;
548 (typeof result.ilsevent != 'undefined') &&
550 (override_params.overridable_events.indexOf( result.ilsevent == null || result.ilsevent == '' ? null : Number(result.ilsevent) ) != -1) ||
551 (override_params.overridable_events.indexOf( result.textcode ) != -1)
554 req = override([result]);
556 var found_good = false; var found_bad = false;
557 for (var i = 0; i < result.length; i++) {
559 (typeof result[i].ilsevent != 'undefined') &&
561 (override_params.overridable_events.indexOf( result[i].ilsevent == null || result[i].ilsevent == '' ? null : Number(result[i].ilsevent) ) != -1) ||
562 (override_params.overridable_events.indexOf( result[i].textcode ) != -1)
570 if (found_good && (!found_bad)) req = override(result);
579 'ping' : function() {
581 JSAN.use('util.file'); JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
582 var file = new util.file('ping.bat');
583 var path = file._file.path;
584 file.write_content('truncate+exec',
586 'ping -n 15 ' + data.server_unadorned + ' > "' + path + '.txt"\n' + /* windows */
587 'ping -c 15 ' + data.server_unadorned + ' >> "' + path + '.txt"\n' /* unix */
590 file = new util.file('ping.bat');
592 var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
593 process.init(file._file);
597 dump('process.run = ' + process.run(true, args, args.length) + '\n');
601 var file = new util.file('ping.bat.txt');
602 var output = file.get_content();
611 'play_sounds' : function(req) {
614 var result = req.getResultObject();
615 if (result == null) { return; }
616 if (typeof result.textcode != 'undefined') {
617 obj.sound.event( result );
619 if (typeof result.length != 'undefined') {
620 for (var i = 0; i < result.length; i++) {
621 if (typeof result[i].textcode != 'undefined') {
622 obj.sound.event( result[i] );
628 dump('Error in network.js, play_sounds() : ' + E + '\n');
634 function sample_callback(request) {
635 var result = request.getResultObject();
639 dump('exiting util/network.js\n');