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 var request = this._request(app,name,params,f,override_params,_params);
88 return this.get_result(request);
98 '_request' : function (app,name,params,f,override_params,_params) {
101 var sparams = js2JSON(params);
102 obj.error.sdump('D_SES','_request '+app+' '+name+' '+obj.error.pretty_print(sparams.slice(1,sparams.length-1))+
103 '\noverride_params = ' + override_params + '\n_params = ' + _params +
104 '\nResult #' + (++obj.link_id) + ( f ? ' asynced' : ' synced' ) +
105 '\nlocation.href = ' + location.href );
107 if (document.getElementById('network_progress')) {
108 if (g && g.menu && g.menu.network_meter && typeof g.menu.network_meter.inc == 'function') g.menu.network_meter.inc(app,name);
109 } else if (typeof xulG != 'undefined') {
110 if (xulG && xulG.network_meter && typeof xulG.network_meter.inc == 'function') xulG.network_meter.inc(app,name);
113 var request = new RemoteRequest( app, name );
114 if (_params && _params.secure) {
115 request.setSecure(true);
117 request.setSecure(false);
119 for(var index in params) {
120 request.addParam(params[index]);
123 var start_timer = (new Date).getTime();
125 request.setCompleteCallback(
128 var duration = ( (new Date).getTime() - start_timer )/1000;
129 if ( obj.get_result(req) == null && duration > obj.network_timeout ) req.cancelled = true;
131 if (document.getElementById('network_progress')) {
132 if (g && g.menu && g.menu.network_meter && typeof g.menu.network_meter.dec == 'function') g.menu.network_meter.dec(app,name);
133 } else if (typeof xulG != 'undefined') {
134 if (xulG && xulG.network_meter && typeof xulG.network_meter.dec == 'function') xulG.network_meter.dec(app,name);
137 var json_string = js2JSON(obj.get_result(req));
138 obj.error.sdump('D_SES_RESULT','asynced result #'
139 + obj.link_id + '\n\n'
140 + (json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string)
141 + '\n\nOriginal Request:\n\n'
142 + 'request '+app+' '+name+' '+ sparams.slice(1,sparams.length-1));
143 obj.play_sounds( request );
144 req = obj.rerequest_on_session_timeout(app,name,params,req,override_params,_params);
145 req = obj.rerequest_on_perm_failure(app,name,params,req,override_params,_params);
146 if (override_params) {
147 req = obj.rerequest_on_override(app,name,params,req,override_params,_params);
149 req = obj.check_for_offline(app,name,params,req,override_params,_params);
151 obj.NETWORK_FAILURE = null;
155 E.textcode = offlineStrings.getString('network.server_or_method.error');
157 f( { 'getResultObject' : function() { return E; } } );
170 var duration = ( (new Date).getTime() - start_timer )/1000;
171 if ( obj.get_result(request) == null && duration > obj.network_timeout ) request.cancelled = true;
173 if (document.getElementById('network_progress')) {
174 if (g && g.menu && g.menu.network_meter && typeof g.menu.network_meter.dec == 'function') g.menu.network_meter.dec(app,name);
175 } else if (typeof xulG != 'undefined') {
176 if (xulG && xulG.network_meter && typeof xulG.network_meter.dec == 'function') xulG.network_meter.dec(app,name);
182 var result = obj.get_result(request);
183 var json_string = js2JSON(result);
184 this.error.sdump('D_SES_RESULT','synced result #'
185 + obj.link_id + '\n\n' + ( json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string )
186 + '\n\nOriginal Request:\n\n'
187 + 'request '+app+' '+name+' '+ sparams.slice(1,sparams.length-1));
188 obj.play_sounds( request );
189 request = obj.rerequest_on_session_timeout(app,name,params,request,override_params,_params);
190 request = obj.rerequest_on_perm_failure(app,name,params,request,override_params,_params);
191 if (override_params) {
192 request = obj.rerequest_on_override(app,name,params,request,override_params,_params);
194 request = obj.check_for_offline(app,name,params,request,override_params,_params);
195 obj.NETWORK_FAILURE = null;
201 if (instanceOf(E,perm_ex)) {
202 alert('in util.network, _request : permission exception: ' + js2JSON(E));
208 'check_for_offline' : function (app,name,params,req,override_params,_params) {
211 var result = obj.get_result(req);
212 if (result == null) return req;
213 if (typeof result.ilsevent == 'undefined') return req;
214 if (result.ilsevent != -1) return req;
216 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
225 if (data.proceed_offline) {
231 var network_failure_string;
232 var network_failure_status_string;
235 try { network_failure_string = String( obj.NETWORK_FAILURE ); } catch(E) { network_failure_string = E; }
236 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); }
238 try { msg = offlineStrings.getFormattedString('network.server.failure.exception', [data.server_unadorned]) + '\n' +
239 offlineStrings.getFormattedString('network.server.method', [name]) + '\n' +
240 offlineStrings.getFormattedString('network.server.params', [js2JSON(params)]) + '\n' +
241 offlineStrings.getString('network.server.thrown_label') + '\n' + network_failure_string + '\n' +
242 offlineStrings.getString('network.server.status_label') + '\n' + network_failure_status_string;
243 } catch(E) { msg = E; }
245 try { obj.error.sdump('D_SES_ERROR',msg); } catch(E) { alert('3: ' + E); }
247 r = obj.error.yns_alert(
249 offlineStrings.getString('network.network_failure'),
250 offlineStrings.getString('network.retry_network'),
251 offlineStrings.getString('network.ignore_errors'),
253 offlineStrings.getString('common.confirm')
256 data.proceed_offline = true; data.stash('proceed_offline');
257 dump('Remembering proceed_offline for 200000 ms.\n');
260 data.proceed_offline = false; data.stash('proceed_offline');
261 dump('Setting proceed_offline back to false.\n');
267 dump( r == 0 ? 'Retry Network\n' : 'Ignore Errors\n' );
271 req = obj._request(app,name,params,null,override_params,_params);
272 if (obj.get_result(req)) proceed = true; /* daily WTF, why am I even doing this? :) */
287 'reset_titlebars' : function(data) {
289 data.stash_retrieve();
291 JSAN.use('util.window'); var win = new util.window();
292 var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService();
293 var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
294 var enumerator = windowManagerInterface.getEnumerator(null);
296 var w; // set title on all appshell windows
297 while ( w = enumerator.getNext() ) {
298 if (w.document.title.match(/^\d/)) {
300 win.appshell_name_increment()
301 + ': ' + data.list.au[0].usrname()
302 + '@' + data.ws_name;
303 + '.' + data.server_unadorned
307 obj.error.standard_unexpected_error_alert(offlineStrings.getString('network.window_title.error'),E);
311 'set_user_status' : function() {
312 data.stash_retrieve();
314 var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService();
315 var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
316 var permlist = windowManagerInterface.getMostRecentWindow('eg_main').get_menu_perms(null);
318 var enumerator = windowManagerInterface.getEnumerator('eg_menu');
322 while ( w = enumerator.getNext() ) {
323 x = w.document.getElementById('oc_menuitem');
325 if(!offlinestrings) w.document.getElementById('offlineStrings');
326 if(permlist) w.g.menu.set_menu_access(permlist);
327 if(data.list.au.length > 1) {
328 addCSSClass(w.document.getElementById('main_tabbox'),'operator_change');
329 x.setAttribute('label', offlineStrings.getFormattedString('menu.cmd_chg_session.operator.label', [data.list.au[1].usrname()]) );
332 removeCSSClass(w.document.getElementById('main_tabbox'),'operator_change');
333 x.setAttribute('label', x.getAttribute('label_orig'));
337 obj.error.standard_unexpected_error_alert(offlineStrings.getString('network.window_title.error'),E);
341 'get_new_session' : function(name,xulG,text) {
345 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
346 var url = urls.XUL_AUTH_SIMPLE;
347 if (typeof xulG != 'undefined' && typeof xulG.url_prefix == 'function') url = xulG.url_prefix( url );
348 JSAN.use('util.window'); var win = new util.window();
349 var my_xulG = win.open(
351 //+ '?login_type=staff'
352 //+ '&desc_brief=' + window.escape( text ? 'Session Expired' : 'Operator Change' )
353 //+ '&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.'),
354 //'simple_auth' + (new Date()).toString(),
355 offlineStrings.getString('network.new_session.authorize'),
356 'chrome,resizable,modal,width=700,height=500',
358 'login_type' : 'staff',
359 'desc_brief' : text ? offlineStrings.getString('network.new_session.expired') : offlineStrings.getString('network.new_session.operator_change'),
360 'desc_full' : text ? offlineStrings.getString('network.new_session.expired.prompt') : offlineStrings.getString('network.new_session.operator_change.prompt')
361 //'simple_auth' : (new Date()).toString(),
364 JSAN.use('OpenILS.data');
365 var data = new OpenILS.data(); data.init({'via':'stash'});
366 if (typeof data.temporary_session != 'undefined' && data.temporary_session != '') {
367 data.session.key = data.temporary_session.key;
368 data.session.authtime = data.temporary_session.authtime;
369 data.stash('session');
371 var ios = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
372 var cookieUri = ios.newURI("http://" + data.server_unadorned, null, null);
373 var cookieUriSSL = ios.newURI("https://" + data.server_unadorned, null, null);
374 var cookieSvc = Components.classes["@mozilla.org/cookieService;1"].getService(Components.interfaces.nsICookieService);
376 cookieSvc.setCookieString(cookieUri, null, "ses="+data.session.key, null);
377 cookieSvc.setCookieString(cookieUriSSL, null, "ses="+data.session.key, null);
380 alert(offineStrings.getFormattedString('main.session_cookie.error', [E]));
382 if (! data.list.au ) data.list.au = [];
383 data.list.au[0] = JSON2js( data.temporary_session.usr );
385 obj.reset_titlebars(data);
388 obj.error.sdump('D_TRACE','No new session key after simple_auth in util/network\n');
393 obj.error.standard_unexpected_error_alert('util.network.get_new_session',E);
397 'rerequest_on_session_timeout' : function(app,name,params,req,override_params,_params) {
400 var robj = obj.get_result(req);
401 if (robj != null && robj.ilsevent && robj.ilsevent == 1001 /* NO_SESSION */) {
403 if (obj.get_new_session(name,undefined,true)) {
404 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
405 params[0] = data.session.key;
406 req = obj._request(app,name,params,null,override_params,_params);
410 this.error.standard_unexpected_error_alert('rerequest_on_session_timeout',E);
415 'rerequest_on_perm_failure' : function(app,name,params,req,override_params,_params) {
418 var robj = obj.get_result(req);
419 if (robj != null && robj.ilsevent && robj.ilsevent == 5000) {
420 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
421 if (location.href.match(/^chrome/)) {
422 //alert('Permission denied.');
424 JSAN.use('util.window'); var win = new util.window();
425 var my_xulG = win.open(
426 urls.XUL_AUTH_SIMPLE,
427 //+ '?login_type=temp'
428 //+ '&desc_brief=' + window.escape('Permission Denied: ' + robj.ilsperm)
429 //+ '&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),
430 //'simple_auth' + (new Date()).toString(),
431 offlineStrings.getFormattedString('network.permission.authorize'),
432 'chrome,resizable,modal,width=700,height=500',
434 'login_type' : 'temp',
435 'desc_brief' : offlineStrings.getFormattedString('network.permission.description.brief', [robj.ilsperm]),
436 'desc_full' : offlineStrings.getFormattedString('network.permission.description.full', [name])
437 //'simple_auth' : (new Date()).toString(),
440 JSAN.use('OpenILS.data');
441 //var data = new OpenILS.data(); data.init({'via':'stash'});
442 if (typeof my_xulG.temporary_session != 'undefined' && my_xulG.temporary_session != '') {
443 params[0] = my_xulG.temporary_session.key;
444 req = obj._request(app,name,params,null,override_params,_params);
449 this.error.sdump('D_ERROR',E);
454 'rerequest_on_override' : function (app,name,params,req,override_params,_params) {
457 if (!override_params.text) override_params.text = {};
458 if (!override_params.auto_override_these_events) override_params.auto_override_these_events = [];
459 if (!override_params.report_override_on_events) override_params.report_override_on_events = [];
460 function override(r) {
462 // test to see if we can suppress this dialog and auto-override
463 var auto_override = false;
464 if (override_params.auto_override_these_events.length > 0) {
465 auto_override = true;
466 for (var i = 0; i < r.length; i++) {
468 (typeof r[i].ilsevent != 'undefined') &&
470 (override_params.auto_override_these_events.indexOf( r[i].ilsevent == null ? null : Number(r[i].ilsevent) ) != -1) ||
471 (override_params.auto_override_these_events.indexOf( r[i].textcode ) != -1)
477 auto_override = false;
483 req = obj._request(app,name + '.override',params);
487 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
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');