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) 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 var url = urls.XUL_AUTH_SIMPLE;
351 if (typeof xulG != 'undefined' && typeof xulG.url_prefix == 'function') url = xulG.url_prefix( url );
352 JSAN.use('util.window'); var win = new util.window();
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' : 'staff',
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 JSAN.use('OpenILS.data');
369 var data = new OpenILS.data(); data.init({'via':'stash'});
370 if (typeof data.temporary_session != 'undefined' && data.temporary_session != '') {
371 data.session.key = data.temporary_session.key;
372 data.session.authtime = data.temporary_session.authtime;
373 data.stash('session');
375 var ios = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
376 var cookieUriSSL = ios.newURI("https://" + data.server_unadorned, null, null);
377 var cookieSvc = Components.classes["@mozilla.org/cookieService;1"].getService(Components.interfaces.nsICookieService);
379 cookieSvc.setCookieString(cookieUriSSL, null, "ses="+data.session.key + "; secure;", null);
382 alert(offineStrings.getFormattedString('main.session_cookie.error', [E]));
384 if (! data.list.au ) data.list.au = [];
385 data.list.au[0] = JSON2js( data.temporary_session.usr );
387 obj.reset_titlebars(data);
390 obj.error.sdump('D_TRACE','No new session key after simple_auth in util/network\n');
395 obj.error.standard_unexpected_error_alert('util.network.get_new_session',E);
399 'rerequest_on_session_timeout' : function(app,name,params,req,override_params,_params) {
402 var robj = obj.get_result(req);
403 if (robj != null && robj.ilsevent && robj.ilsevent == 1001 /* NO_SESSION */) {
405 if (obj.get_new_session(name,undefined,true)) {
406 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
407 params[0] = data.session.key;
408 req = obj._request(app,name,params,null,override_params,_params);
412 this.error.standard_unexpected_error_alert('rerequest_on_session_timeout',E);
417 'rerequest_on_perm_failure' : function(app,name,params,req,override_params,_params) {
420 var robj = obj.get_result(req);
421 if (robj != null && robj.ilsevent && robj.ilsevent == 5000) {
422 if (location.href.match(/^chrome/)) {
423 //alert('Permission denied.');
425 JSAN.use('util.window'); var win = new util.window();
426 var my_xulG = win.open(
427 urls.XUL_AUTH_SIMPLE,
428 //+ '?login_type=temp'
429 //+ '&desc_brief=' + window.escape('Permission Denied: ' + robj.ilsperm)
430 //+ '&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),
431 //'simple_auth' + (new Date()).toString(),
432 offlineStrings.getFormattedString('network.permission.authorize'),
433 'chrome,resizable,modal,width=700,height=500',
435 'login_type' : 'temp',
436 'desc_brief' : offlineStrings.getFormattedString('network.permission.description.brief', [robj.ilsperm]),
437 'desc_full' : offlineStrings.getFormattedString('network.permission.description.full', [name])
438 //'simple_auth' : (new Date()).toString(),
441 JSAN.use('OpenILS.data');
442 //var data = new OpenILS.data(); data.init({'via':'stash'});
443 if (typeof my_xulG.temporary_session != 'undefined' && my_xulG.temporary_session != '') {
444 params[0] = my_xulG.temporary_session.key;
445 req = obj._request(app,name,params,null,override_params,_params);
450 this.error.sdump('D_ERROR',E);
455 'rerequest_on_override' : function (app,name,params,req,override_params,_params) {
458 if (!override_params.text) override_params.text = {};
459 if (!override_params.auto_override_these_events) override_params.auto_override_these_events = [];
460 if (!override_params.report_override_on_events) override_params.report_override_on_events = [];
461 function override(r) {
463 // test to see if we can suppress this dialog and auto-override
464 var auto_override = false;
465 if (override_params.auto_override_these_events.length > 0) {
466 auto_override = true;
467 for (var i = 0; i < r.length; i++) {
469 (typeof r[i].ilsevent != 'undefined') &&
471 (override_params.auto_override_these_events.indexOf( r[i].ilsevent == null ? null : Number(r[i].ilsevent) ) != -1) ||
472 (override_params.auto_override_these_events.indexOf( r[i].textcode ) != -1)
478 auto_override = false;
484 req = obj._request(app,name + '.override',params);
488 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">' +
489 '<groupbox><caption label="' + offlineStrings.getString('network.override.exceptions') + '"/>' +
490 '<grid><columns><column/><column flex="1"/></columns><rows>';
491 for (var i = 0; i < r.length; i++) {
492 var t1 = String(r[i].ilsevent).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
493 var t2 = String(r[i].textcode).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
494 var t3 = String((override_params.text[r[i].ilsevent] ? override_params.text[r[i].ilsevent](r[i]) : '')).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
495 var t4 = String(r[i].desc).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
497 '<description class="oils_event" tooltiptext="' + t1 + '">' + t2 + '</description>' +
498 '<description>' + t3 + '</description>' +
499 '</row><row>' + '<description>' + t4 + '</description>' + '</row>';
501 xml += '</rows></grid></groupbox><groupbox><caption label="' + offlineStrings.getString('network.override.override') +'"/><hbox>' +
502 '<description>' + offlineStrings.getString('network.override.force.prompt') + '</description>' +
503 '<button accesskey="' + offlineStrings.getString('common.no.accesskey') + '" label="' + offlineStrings.getString('common.no') + '" name="fancy_cancel"/>' +
504 '<button id="override" accesskey="' + offlineStrings.getString('common.yes.accesskey') + '" label="' + offlineStrings.getString('common.yes') + '" name="fancy_submit" value="override"/></hbox></groupbox></vbox>';
505 //JSAN.use('OpenILS.data');
506 //var data = new OpenILS.data(); data.init({'via':'stash'});
507 //data.temp_override_xml = xml; data.stash('temp_override_xml');
508 JSAN.use('util.window'); var win = new util.window();
509 var fancy_prompt_data = win.open(
510 urls.XUL_FANCY_PROMPT,
511 //+ '?xml_in_stash=temp_override_xml'
512 //+ '&title=' + window.escape(override_params.title),
513 'fancy_prompt', 'chrome,resizable,modal,width=700,height=500',
514 { 'xml' : xml, 'title' : override_params.title, 'sound' : 'bad', 'sound_object' : obj.sound }
516 if (fancy_prompt_data.fancy_status == 'complete') {
517 req = obj._request(app,name + '.override',params);
518 if (req && override_params.report_override_on_events.length > 0 && typeof result == 'object') {
519 var reported_events = [];
520 for (var i = 0; i < r.length; i++) {
521 if (typeof r[i].ilsevent != 'undefined') {
522 if (override_params.report_override_on_events.indexOf( r[i].ilsevent == null ? null : Number(r[i].ilsevent) ) != -1) {
523 reported_events.push(Number(r[i].ilsevent));
525 if (override_params.report_override_on_events.indexOf( r[i].textcode ) != -1) {
526 reported_events.push(r[i].textcode);
530 req._reported_events = reported_events;
535 alert('in util.network, rerequest_on_override, override:' + E);
539 var result = obj.get_result(req);
540 if (!result) return req;
543 (typeof result.ilsevent != 'undefined') &&
545 (override_params.overridable_events.indexOf( result.ilsevent == null || result.ilsevent == '' ? null : Number(result.ilsevent) ) != -1) ||
546 (override_params.overridable_events.indexOf( result.textcode ) != -1)
549 req = override([result]);
551 var found_good = false; var found_bad = false;
552 for (var i = 0; i < result.length; i++) {
554 (typeof result[i].ilsevent != 'undefined') &&
556 (override_params.overridable_events.indexOf( result[i].ilsevent == null || result[i].ilsevent == '' ? null : Number(result[i].ilsevent) ) != -1) ||
557 (override_params.overridable_events.indexOf( result[i].textcode ) != -1)
565 if (found_good && (!found_bad)) req = override(result);
574 'ping' : function() {
576 JSAN.use('util.file'); JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
577 var file = new util.file('ping.bat');
578 var path = file._file.path;
579 file.write_content('truncate+exec',
581 'ping -n 15 ' + data.server_unadorned + ' > "' + path + '.txt"\n' + /* windows */
582 'ping -c 15 ' + data.server_unadorned + ' >> "' + path + '.txt"\n' /* unix */
585 file = new util.file('ping.bat');
587 var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
588 process.init(file._file);
592 dump('process.run = ' + process.run(true, args, args.length) + '\n');
596 var file = new util.file('ping.bat.txt');
597 var output = file.get_content();
606 'play_sounds' : function(req) {
609 var result = req.getResultObject();
610 if (result == null) { return; }
611 if (typeof result.textcode != 'undefined') {
612 obj.sound.event( result );
614 if (typeof result.length != 'undefined') {
615 for (var i = 0; i < result.length; i++) {
616 if (typeof result[i].textcode != 'undefined') {
617 obj.sound.event( result[i] );
623 dump('Error in network.js, play_sounds() : ' + E + '\n');
629 function sample_callback(request) {
630 var result = request.getResultObject();
634 dump('exiting util/network.js\n');