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('eg_menu');
301 var w; // set title on all appshell windows
302 while ( w = enumerator.getNext() ) {
305 + ': ' + data.list.au[0].usrname()
307 + '.' + data.server_unadorned;
310 obj.error.standard_unexpected_error_alert(offlineStrings.getString('network.window_title.error'),E);
314 'set_user_status' : function() {
315 data.stash_retrieve();
317 var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService();
318 var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
319 var permlist = windowManagerInterface.getMostRecentWindow('eg_main').get_menu_perms(null);
321 var enumerator = windowManagerInterface.getEnumerator('eg_menu');
325 while ( w = enumerator.getNext() ) {
326 x = w.document.getElementById('oc_menuitem');
328 if(!offlinestrings) offlinestrings = w.document.getElementById('offlineStrings');
329 if(permlist) w.g.menu.set_menu_access(permlist);
330 if(data.list.au.length > 1) {
331 addCSSClass(w.document.getElementById('main_tabbox'),'operator_change');
332 x.setAttribute('label', offlineStrings.getFormattedString('menu.cmd_chg_session.operator.label', [data.list.au[1].usrname()]) );
335 removeCSSClass(w.document.getElementById('main_tabbox'),'operator_change');
336 x.setAttribute('label', x.getAttribute('label_orig'));
340 obj.error.standard_unexpected_error_alert(offlineStrings.getString('network.window_title.error'),E);
344 'get_new_session' : function(name,xulG,text) {
348 var url = urls.XUL_AUTH_SIMPLE;
349 if (typeof xulG != 'undefined' && typeof xulG.url_prefix == 'function') url = xulG.url_prefix( url );
350 JSAN.use('util.window'); var win = new util.window();
351 JSAN.use('OpenILS.data');
352 var data = new OpenILS.data(); data.init({'via':'stash'});
353 var my_xulG = win.open(
355 //+ '?login_type=staff'
356 //+ '&desc_brief=' + window.escape( text ? 'Session Expired' : 'Operator Change' )
357 //+ '&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.'),
358 //'simple_auth' + (new Date()).toString(),
359 offlineStrings.getString('network.new_session.authorize'),
360 'chrome,resizable,modal,width=700,height=500',
362 'login_type' : text ? (data.session.login_type ? data.session.login_type : 'staff') : 'ochange',
363 'desc_brief' : text ? offlineStrings.getString('network.new_session.expired') : offlineStrings.getString('network.new_session.operator_change'),
364 'desc_full' : text ? offlineStrings.getString('network.new_session.expired.prompt') : offlineStrings.getString('network.new_session.operator_change.prompt')
365 //'simple_auth' : (new Date()).toString(),
368 data.stash_retrieve();
369 if (typeof data.temporary_session != 'undefined' && data.temporary_session != '') {
370 data.session.key = data.temporary_session.key;
371 data.session.authtime = data.temporary_session.authtime;
372 data.session.is_perm = data.temporary_session.is_perm; // For operator change, otherwise ignorable.
373 data.session.login_type = data.temporary_session.login_type; // For timeouts *after* operator change.
374 data.stash('session');
376 var ios = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
377 var cookieUriSSL = ios.newURI("https://" + data.server_unadorned, null, null);
378 var cookieSvc = Components.classes["@mozilla.org/cookieService;1"].getService(Components.interfaces.nsICookieService);
380 cookieSvc.setCookieString(cookieUriSSL, null, "ses="+data.session.key + "; secure;", null);
383 alert(offineStrings.getFormattedString('main.session_cookie.error', [E]));
385 if (! data.list.au ) data.list.au = [];
386 data.list.au[0] = JSON2js( data.temporary_session.usr );
388 obj.reset_titlebars(data);
391 obj.error.sdump('D_TRACE','No new session key after simple_auth in util/network\n');
396 obj.error.standard_unexpected_error_alert('util.network.get_new_session',E);
400 'rerequest_on_session_timeout' : function(app,name,params,req,override_params,_params) {
403 var robj = obj.get_result(req);
404 if (robj != null && robj.ilsevent && robj.ilsevent == 1001 /* NO_SESSION */) {
406 if (obj.get_new_session(name,undefined,true)) {
407 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
408 params[0] = data.session.key;
409 req = obj._request(app,name,params,null,override_params,_params);
413 this.error.standard_unexpected_error_alert('rerequest_on_session_timeout',E);
418 'rerequest_on_perm_failure' : function(app,name,params,req,override_params,_params) {
421 var robj = obj.get_result(req);
422 if (robj != null && robj.ilsevent && robj.ilsevent == 5000) {
423 if (location.href.match(/^chrome/)) {
424 //alert('Permission denied.');
426 JSAN.use('util.window'); var win = new util.window();
427 var my_xulG = win.open(
428 urls.XUL_AUTH_SIMPLE,
429 //+ '?login_type=temp'
430 //+ '&desc_brief=' + window.escape('Permission Denied: ' + robj.ilsperm)
431 //+ '&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),
432 //'simple_auth' + (new Date()).toString(),
433 offlineStrings.getFormattedString('network.permission.authorize'),
434 'chrome,resizable,modal,width=700,height=500',
436 'login_type' : 'temp',
437 'desc_brief' : offlineStrings.getFormattedString('network.permission.description.brief', [robj.ilsperm]),
438 'desc_full' : offlineStrings.getFormattedString('network.permission.description.full', [name])
439 //'simple_auth' : (new Date()).toString(),
442 JSAN.use('OpenILS.data');
443 //var data = new OpenILS.data(); data.init({'via':'stash'});
444 if (typeof my_xulG.temporary_session != 'undefined' && my_xulG.temporary_session != '') {
445 params[0] = my_xulG.temporary_session.key;
446 req = obj._request(app,name,params,null,override_params,_params);
451 this.error.sdump('D_ERROR',E);
456 'rerequest_on_override' : function (app,name,params,req,override_params,_params) {
459 if (!override_params.text) override_params.text = {};
460 if (!override_params.auto_override_these_events) override_params.auto_override_these_events = [];
461 if (!override_params.report_override_on_events) override_params.report_override_on_events = [];
462 function override(r) {
464 // test to see if we can suppress this dialog and auto-override
465 var auto_override = false;
466 if (override_params.auto_override_these_events.length > 0) {
467 auto_override = true;
468 for (var i = 0; i < r.length; i++) {
470 (typeof r[i].ilsevent != 'undefined') &&
472 (override_params.auto_override_these_events.indexOf( r[i].ilsevent == null ? null : Number(r[i].ilsevent) ) != -1) ||
473 (override_params.auto_override_these_events.indexOf( r[i].textcode ) != -1)
479 auto_override = false;
485 req = obj._request(app,name + '.override',params);
489 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">' +
490 '<groupbox><caption label="' + offlineStrings.getString('network.override.exceptions') + '"/>' +
491 '<grid><columns><column/><column flex="1"/></columns><rows>';
492 for (var i = 0; i < r.length; i++) {
493 var t1 = String(r[i].ilsevent).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
494 var t2 = String(r[i].textcode).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
495 var t3 = String((override_params.text[r[i].ilsevent] ? override_params.text[r[i].ilsevent](r[i]) : '')).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
496 var t4 = String(r[i].desc).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
498 '<description class="oils_event" tooltiptext="' + t1 + '">' + t2 + '</description>' +
499 '<description>' + t3 + '</description>' +
500 '</row><row>' + '<description>' + t4 + '</description>' + '</row>';
502 xml += '</rows></grid></groupbox><groupbox><caption label="' + offlineStrings.getString('network.override.override') +'"/><hbox>' +
503 '<description>' + offlineStrings.getString('network.override.force.prompt') + '</description>' +
504 '<button accesskey="' + offlineStrings.getString('common.no.accesskey') + '" label="' + offlineStrings.getString('common.no') + '" name="fancy_cancel"/>' +
505 '<button id="override" accesskey="' + offlineStrings.getString('common.yes.accesskey') + '" label="' + offlineStrings.getString('common.yes') + '" name="fancy_submit" value="override"/></hbox></groupbox></vbox>';
506 //JSAN.use('OpenILS.data');
507 //var data = new OpenILS.data(); data.init({'via':'stash'});
508 //data.temp_override_xml = xml; data.stash('temp_override_xml');
509 JSAN.use('util.window'); var win = new util.window();
510 var fancy_prompt_data = win.open(
511 urls.XUL_FANCY_PROMPT,
512 //+ '?xml_in_stash=temp_override_xml'
513 //+ '&title=' + window.escape(override_params.title),
514 'fancy_prompt', 'chrome,resizable,modal,width=700,height=500',
515 { 'xml' : xml, 'title' : override_params.title, 'sound' : 'bad', 'sound_object' : obj.sound }
517 if (fancy_prompt_data.fancy_status == 'complete') {
518 req = obj._request(app,name + '.override',params);
519 if (req && override_params.report_override_on_events.length > 0 && typeof result == 'object') {
520 var reported_events = [];
521 for (var i = 0; i < r.length; i++) {
522 if (typeof r[i].ilsevent != 'undefined') {
523 if (override_params.report_override_on_events.indexOf( r[i].ilsevent == null ? null : Number(r[i].ilsevent) ) != -1) {
524 reported_events.push(Number(r[i].ilsevent));
526 if (override_params.report_override_on_events.indexOf( r[i].textcode ) != -1) {
527 reported_events.push(r[i].textcode);
531 req._reported_events = reported_events;
536 alert('in util.network, rerequest_on_override, override:' + E);
540 var result = obj.get_result(req);
541 if (!result) return req;
544 (typeof result.ilsevent != 'undefined') &&
546 (override_params.overridable_events.indexOf( result.ilsevent == null || result.ilsevent == '' ? null : Number(result.ilsevent) ) != -1) ||
547 (override_params.overridable_events.indexOf( result.textcode ) != -1)
550 req = override([result]);
552 var found_good = false; var found_bad = false;
553 for (var i = 0; i < result.length; i++) {
555 (typeof result[i].ilsevent != 'undefined') &&
557 (override_params.overridable_events.indexOf( result[i].ilsevent == null || result[i].ilsevent == '' ? null : Number(result[i].ilsevent) ) != -1) ||
558 (override_params.overridable_events.indexOf( result[i].textcode ) != -1)
566 if (found_good && (!found_bad)) req = override(result);
575 'ping' : function() {
577 JSAN.use('util.file'); JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
578 var file = new util.file('ping.bat');
579 var path = file._file.path;
580 file.write_content('truncate+exec',
582 'ping -n 15 ' + data.server_unadorned + ' > "' + path + '.txt"\n' + /* windows */
583 'ping -c 15 ' + data.server_unadorned + ' >> "' + path + '.txt"\n' /* unix */
586 file = new util.file('ping.bat');
588 var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
589 process.init(file._file);
593 dump('process.run = ' + process.run(true, args, args.length) + '\n');
597 var file = new util.file('ping.bat.txt');
598 var output = file.get_content();
607 'play_sounds' : function(req) {
610 var result = req.getResultObject();
611 if (result == null) { return; }
612 if (typeof result.textcode != 'undefined') {
613 obj.sound.event( result );
615 if (typeof result.length != 'undefined') {
616 for (var i = 0; i < result.length; i++) {
617 if (typeof result[i].textcode != 'undefined') {
618 obj.sound.event( result[i] );
624 dump('Error in network.js, play_sounds() : ' + E + '\n');
630 function sample_callback(request) {
631 var result = request.getResultObject();
635 dump('exiting util/network.js\n');