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();
56 if (instanceOf(E, NetworkFailure)) {
57 obj.NETWORK_FAILURE = E;
59 try { obj.NETWORK_FAILURE = js2JSON(E); } catch(F) { dump(F + '\n'); obj.NETWORK_FAILURE = E; };
62 obj.NETWORK_FAILURE = offlineStrings.getString('network.unknown_status');
64 result = fake_ilsevent_for_network_errors;
69 'request' : function (app,name,params,f,override_params,_params) {
73 //var sparams = js2JSON(params);
74 //obj.error.sdump('D_SES','request '+ app + ' ' + name +' '+obj.error.pretty_print(sparams.slice(1,sparams.length-1))+
75 // '\noverride_params = ' + override_params + '\n_params = ' + _params + '\n');
79 var request = this._request(app,name,params,f,override_params,_params);
81 return this.get_result(request);
91 '_request' : function (app,name,params,f,override_params,_params) {
94 var sparams = js2JSON(params);
95 obj.error.sdump('D_SES','_request '+app+' '+name+' '+obj.error.pretty_print(sparams.slice(1,sparams.length-1))+
96 '\noverride_params = ' + override_params + '\n_params = ' + _params +
97 '\nResult #' + (++obj.link_id) + ( f ? ' asynced' : ' synced' ) +
98 '\nlocation.href = ' + location.href );
100 if (document.getElementById('network_progress')) {
101 if (g && g.menu && g.menu.network_meter && typeof g.menu.network_meter.inc == 'function') g.menu.network_meter.inc(app,name);
102 } else if (typeof xulG != 'undefined') {
103 if (xulG && xulG.network_meter && typeof xulG.network_meter.inc == 'function') xulG.network_meter.inc(app,name);
106 var request = new RemoteRequest( app, name );
107 if (_params && _params.secure) {
108 request.setSecure(true);
110 request.setSecure(false);
112 for(var index in params) {
113 request.addParam(params[index]);
116 var start_timer = (new Date).getTime();
118 request.setCompleteCallback(
121 var duration = ( (new Date).getTime() - start_timer )/1000;
122 if ( obj.get_result(req) == null && duration > obj.network_timeout ) req.cancelled = true;
124 if (document.getElementById('network_progress')) {
125 if (g && g.menu && g.menu.network_meter && typeof g.menu.network_meter.dec == 'function') g.menu.network_meter.dec(app,name);
126 } else if (typeof xulG != 'undefined') {
127 if (xulG && xulG.network_meter && typeof xulG.network_meter.dec == 'function') xulG.network_meter.dec(app,name);
130 var json_string = js2JSON(obj.get_result(req));
131 obj.error.sdump('D_SES_RESULT','asynced result #'
132 + obj.link_id + '\n\n'
133 + (json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string)
134 + '\n\nOriginal Request:\n\n'
135 + 'request '+app+' '+name+' '+ sparams.slice(1,sparams.length-1));
136 obj.play_sounds( request );
137 req = obj.rerequest_on_session_timeout(app,name,params,req,override_params,_params);
138 req = obj.rerequest_on_perm_failure(app,name,params,req,override_params,_params);
139 if (override_params) {
140 req = obj.rerequest_on_override(app,name,params,req,override_params,_params);
142 req = obj.check_for_offline(app,name,params,req,override_params,_params);
144 obj.NETWORK_FAILURE = null;
148 E.textcode = offlineStrings.getString('network.server_or_method.error');
150 f( { 'getResultObject' : function() { return E; } } );
163 var duration = ( (new Date).getTime() - start_timer )/1000;
164 if ( obj.get_result(request) == null && duration > obj.network_timeout ) request.cancelled = true;
166 if (document.getElementById('network_progress')) {
167 if (g && g.menu && g.menu.network_meter && typeof g.menu.network_meter.dec == 'function') g.menu.network_meter.dec(app,name);
168 } else if (typeof xulG != 'undefined') {
169 if (xulG && xulG.network_meter && typeof xulG.network_meter.dec == 'function') xulG.network_meter.dec(app,name);
175 var result = obj.get_result(request);
176 var json_string = js2JSON(result);
177 this.error.sdump('D_SES_RESULT','synced result #'
178 + obj.link_id + '\n\n' + ( json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string )
179 + '\n\nOriginal Request:\n\n'
180 + 'request '+app+' '+name+' '+ sparams.slice(1,sparams.length-1));
181 obj.play_sounds( request );
182 request = obj.rerequest_on_session_timeout(app,name,params,request,override_params,_params);
183 request = obj.rerequest_on_perm_failure(app,name,params,request,override_params,_params);
184 if (override_params) {
185 request = obj.rerequest_on_override(app,name,params,request,override_params,_params);
187 request = obj.check_for_offline(app,name,params,request,override_params,_params);
188 obj.NETWORK_FAILURE = null;
194 if (instanceOf(E,perm_ex)) {
195 alert('in util.network, _request : permission exception: ' + js2JSON(E));
201 'check_for_offline' : function (app,name,params,req,override_params,_params) {
204 var result = obj.get_result(req);
205 if (result == null) return req;
206 if (typeof result.ilsevent == 'undefined') return req;
207 if (result.ilsevent != -1) return req;
209 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
218 if (data.proceed_offline) {
224 var network_failure_string;
225 var network_failure_status_string;
228 try { network_failure_string = String( obj.NETWORK_FAILURE ); } catch(E) { network_failure_string = E; }
229 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); }
231 try { msg = offlineStrings.getFormattedString('network.server.failure.exception', [data.server_unadorned]) + '\n' +
232 offlineStrings.getFormattedString('network.server.method', [name]) + '\n' +
233 offlineStrings.getFormattedString('network.server.params', [js2JSON(params)]) + '\n' +
234 offlineStrings.getString('network.server.thrown_label') + '\n' + network_failure_string + '\n' +
235 offlineStrings.getString('network.server.status_label') + '\n' + network_failure_status_string;
236 } catch(E) { msg = E; }
238 try { obj.error.sdump('D_SES_ERROR',msg); } catch(E) { alert('3: ' + E); }
240 r = obj.error.yns_alert(
242 offlineStrings.getString('network.network_failure'),
243 offlineStrings.getString('network.retry_network'),
244 offlineStrings.getString('network.ignore_errors'),
246 offlineStrings.getString('common.confirm')
249 data.proceed_offline = true; data.stash('proceed_offline');
250 dump('Remembering proceed_offline for 200000 ms.\n');
253 data.proceed_offline = false; data.stash('proceed_offline');
254 dump('Setting proceed_offline back to false.\n');
260 dump( r == 0 ? 'Retry Network\n' : 'Ignore Errors\n' );
264 req = obj._request(app,name,params,null,override_params,_params);
265 if (obj.get_result(req)) proceed = true; /* daily WTF, why am I even doing this? :) */
280 'reset_titlebars' : function(data) {
282 data.stash_retrieve();
284 JSAN.use('util.window'); var win = new util.window();
285 var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService();
286 var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
287 var enumerator = windowManagerInterface.getEnumerator(null);
289 var w; // set title on all appshell windows
290 while ( w = enumerator.getNext() ) {
291 if (w.document.title.match(/^\d/)) {
293 win.appshell_name_increment()
294 + ': ' + data.list.au[0].usrname()
295 + '@' + data.ws_name;
296 + '.' + data.server_unadorned
300 obj.error.standard_unexpected_error_alert(offlineStrings.getString('network.window_title.error'),E);
304 'set_user_status' : function() {
305 data.stash_retrieve();
307 var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService();
308 var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
309 var permlist = windowManagerInterface.getMostRecentWindow('eg_main').get_menu_perms(null);
311 var enumerator = windowManagerInterface.getEnumerator('eg_menu');
315 while ( w = enumerator.getNext() ) {
316 x = w.document.getElementById('oc_menuitem');
318 if(!offlinestrings) w.document.getElementById('offlineStrings');
319 if(permlist) w.g.menu.set_menu_access(permlist);
320 if(data.list.au.length > 1) {
321 addCSSClass(w.document.getElementById('main_tabbox'),'operator_change');
322 x.setAttribute('label', offlineStrings.getFormattedString('menu.cmd_chg_session.operator.label', [data.list.au[1].usrname()]) );
325 removeCSSClass(w.document.getElementById('main_tabbox'),'operator_change');
326 x.setAttribute('label', x.getAttribute('label_orig'));
330 obj.error.standard_unexpected_error_alert(offlineStrings.getString('network.window_title.error'),E);
334 'get_new_session' : function(name,xulG,text) {
338 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
339 var url = urls.XUL_AUTH_SIMPLE;
340 if (typeof xulG != 'undefined' && typeof xulG.url_prefix == 'function') url = xulG.url_prefix( url );
341 JSAN.use('util.window'); var win = new util.window();
342 var my_xulG = win.open(
344 //+ '?login_type=staff'
345 //+ '&desc_brief=' + window.escape( text ? 'Session Expired' : 'Operator Change' )
346 //+ '&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.'),
347 //'simple_auth' + (new Date()).toString(),
348 offlineStrings.getString('network.new_session.authorize'),
349 'chrome,resizable,modal,width=700,height=500',
351 'login_type' : 'staff',
352 'desc_brief' : text ? offlineStrings.getString('network.new_session.expired') : offlineStrings.getString('network.new_session.operator_change'),
353 'desc_full' : text ? offlineStrings.getString('network.new_session.expired.prompt') : offlineStrings.getString('network.new_session.operator_change.prompt')
354 //'simple_auth' : (new Date()).toString(),
357 JSAN.use('OpenILS.data');
358 var data = new OpenILS.data(); data.init({'via':'stash'});
359 if (typeof data.temporary_session != 'undefined' && data.temporary_session != '') {
360 data.session.key = data.temporary_session.key;
361 data.session.authtime = data.temporary_session.authtime;
362 data.stash('session');
364 var ios = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
365 var cookieUri = ios.newURI("http://" + data.server_unadorned, null, null);
366 var cookieUriSSL = ios.newURI("https://" + data.server_unadorned, null, null);
367 var cookieSvc = Components.classes["@mozilla.org/cookieService;1"].getService(Components.interfaces.nsICookieService);
369 cookieSvc.setCookieString(cookieUri, null, "ses="+data.session.key, null);
370 cookieSvc.setCookieString(cookieUriSSL, null, "ses="+data.session.key, null);
373 alert(offineStrings.getFormattedString('main.session_cookie.error', [E]));
375 if (! data.list.au ) data.list.au = [];
376 data.list.au[0] = JSON2js( data.temporary_session.usr );
378 obj.reset_titlebars(data);
381 obj.error.sdump('D_TRACE','No new session key after simple_auth in util/network\n');
386 obj.error.standard_unexpected_error_alert('util.network.get_new_session',E);
390 'rerequest_on_session_timeout' : function(app,name,params,req,override_params,_params) {
393 var robj = obj.get_result(req);
394 if (robj != null && robj.ilsevent && robj.ilsevent == 1001 /* NO_SESSION */) {
396 if (obj.get_new_session(name,undefined,true)) {
397 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
398 params[0] = data.session.key;
399 req = obj._request(app,name,params,null,override_params,_params);
403 this.error.standard_unexpected_error_alert('rerequest_on_session_timeout',E);
408 'rerequest_on_perm_failure' : function(app,name,params,req,override_params,_params) {
411 var robj = obj.get_result(req);
412 if (robj != null && robj.ilsevent && robj.ilsevent == 5000) {
413 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
414 if (location.href.match(/^chrome/)) {
415 //alert('Permission denied.');
417 JSAN.use('util.window'); var win = new util.window();
418 var my_xulG = win.open(
419 urls.XUL_AUTH_SIMPLE,
420 //+ '?login_type=temp'
421 //+ '&desc_brief=' + window.escape('Permission Denied: ' + robj.ilsperm)
422 //+ '&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),
423 //'simple_auth' + (new Date()).toString(),
424 offlineStrings.getFormattedString('network.permission.authorize'),
425 'chrome,resizable,modal,width=700,height=500',
427 'login_type' : 'temp',
428 'desc_brief' : offlineStrings.getFormattedString('network.permission.description.brief', [robj.ilsperm]),
429 'desc_full' : offlineStrings.getFormattedString('network.permission.description.full', [name])
430 //'simple_auth' : (new Date()).toString(),
433 JSAN.use('OpenILS.data');
434 //var data = new OpenILS.data(); data.init({'via':'stash'});
435 if (typeof my_xulG.temporary_session != 'undefined' && my_xulG.temporary_session != '') {
436 params[0] = my_xulG.temporary_session.key;
437 req = obj._request(app,name,params,null,override_params,_params);
442 this.error.sdump('D_ERROR',E);
447 'rerequest_on_override' : function (app,name,params,req,override_params,_params) {
450 if (!override_params.text) override_params.text = {};
451 if (!override_params.auto_override_these_events) override_params.auto_override_these_events = [];
452 function override(r) {
454 // test to see if we can suppress this dialog and auto-override
455 var auto_override = false;
456 if (override_params.auto_override_these_events.length > 0) {
457 auto_override = true;
458 for (var i = 0; i < r.length; i++) {
460 (typeof r[i].ilsevent != 'undefined') &&
462 (override_params.auto_override_these_events.indexOf( r[i].ilsevent == null ? null : Number(r[i].ilsevent) ) != -1) ||
463 (override_params.auto_override_these_events.indexOf( r[i].textcode ) != -1)
469 auto_override = false;
475 req = obj._request(app,name + '.override',params);
479 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
480 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">' +
481 '<groupbox><caption label="' + offlineStrings.getString('network.override.exceptions') + '"/>' +
482 '<grid><columns><column/><column/></columns><rows>';
483 for (var i = 0; i < r.length; i++) {
484 var t1 = String(r[i].ilsevent).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
485 var t2 = String(r[i].textcode).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
486 var t3 = String((override_params.text[r[i].ilsevent] ? override_params.text[r[i].ilsevent](r[i]) : '')).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
487 var t4 = String(r[i].desc).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
489 '<description class="oils_event" tooltiptext="' + t1 + '">' + t2 + '</description>' +
490 '<description>' + t3 + '</description>' +
491 '</row><row>' + '<description>' + t4 + '</description>' + '</row>';
493 xml += '</rows></grid></groupbox><groupbox><caption label="' + offlineStrings.getString('network.override.override') +'"/><hbox>' +
494 '<description>' + offlineStrings.getString('network.override.force.prompt') + '</description>' +
495 '<button accesskey="' + offlineStrings.getString('common.no.accesskey') + '" label="' + offlineStrings.getString('common.no') + '" name="fancy_cancel"/>' +
496 '<button id="override" accesskey="' + offlineStrings.getString('common.yes.accesskey') + '" label="' + offlineStrings.getString('common.yes') + '" name="fancy_submit" value="override"/></hbox></groupbox></vbox>';
497 //JSAN.use('OpenILS.data');
498 //var data = new OpenILS.data(); data.init({'via':'stash'});
499 //data.temp_override_xml = xml; data.stash('temp_override_xml');
500 JSAN.use('util.window'); var win = new util.window();
501 var fancy_prompt_data = win.open(
502 urls.XUL_FANCY_PROMPT,
503 //+ '?xml_in_stash=temp_override_xml'
504 //+ '&title=' + window.escape(override_params.title),
505 'fancy_prompt', 'chrome,resizable,modal,width=700,height=500',
506 { 'xml' : xml, 'title' : override_params.title, 'sound' : 'bad', 'sound_object' : obj.sound }
508 if (fancy_prompt_data.fancy_status == 'complete') {
509 req = obj._request(app,name + '.override',params);
513 alert('in util.network, rerequest_on_override, override:' + E);
517 var result = obj.get_result(req);
518 if (!result) return req;
521 (typeof result.ilsevent != 'undefined') &&
523 (override_params.overridable_events.indexOf( result.ilsevent == null || result.ilsevent == '' ? null : Number(result.ilsevent) ) != -1) ||
524 (override_params.overridable_events.indexOf( result.textcode ) != -1)
527 req = override([result]);
529 var found_good = false; var found_bad = false;
530 for (var i = 0; i < result.length; i++) {
532 (typeof result[i].ilsevent != 'undefined') &&
534 (override_params.overridable_events.indexOf( result[i].ilsevent == null || result[i].ilsevent == '' ? null : Number(result[i].ilsevent) ) != -1) ||
535 (override_params.overridable_events.indexOf( result[i].textcode ) != -1)
543 if (found_good && (!found_bad)) req = override(result);
552 'ping' : function() {
554 JSAN.use('util.file'); JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
555 var file = new util.file('ping.bat');
556 var path = file._file.path;
557 file.write_content('truncate+exec',
559 'ping -n 15 ' + data.server_unadorned + ' > "' + path + '.txt"\n' + /* windows */
560 'ping -c 15 ' + data.server_unadorned + ' >> "' + path + '.txt"\n' /* unix */
563 file = new util.file('ping.bat');
565 var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
566 process.init(file._file);
570 dump('process.run = ' + process.run(true, args, args.length) + '\n');
574 var file = new util.file('ping.bat.txt');
575 var output = file.get_content();
584 'play_sounds' : function(req) {
587 var result = req.getResultObject();
588 if (result == null) { return; }
589 if (typeof result.textcode != 'undefined') {
590 obj.sound.event( result );
592 if (typeof result.length != 'undefined') {
593 for (var i = 0; i < result.length; i++) {
594 if (typeof result[i].textcode != 'undefined') {
595 obj.sound.event( result[i] );
601 dump('Error in network.js, play_sounds() : ' + E + '\n');
607 function sample_callback(request) {
608 var result = request.getResultObject();
612 dump('exiting util/network.js\n');