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 w.g.menu.set_menu_hotkeys();
321 if(data.list.au.length > 1) {
322 addCSSClass(w.document.getElementById('main_tabbox'),'operator_change');
323 x.setAttribute('label', offlineStrings.getFormattedString('menu.cmd_chg_session.operator.label', [data.list.au[1].usrname()]) );
326 removeCSSClass(w.document.getElementById('main_tabbox'),'operator_change');
327 x.setAttribute('label', x.getAttribute('label_orig'));
331 obj.error.standard_unexpected_error_alert(offlineStrings.getString('network.window_title.error'),E);
335 'get_new_session' : function(name,xulG,text) {
339 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
340 var url = urls.XUL_AUTH_SIMPLE;
341 if (typeof xulG != 'undefined' && typeof xulG.url_prefix == 'function') url = xulG.url_prefix( url );
342 JSAN.use('util.window'); var win = new util.window();
343 var my_xulG = win.open(
345 //+ '?login_type=staff'
346 //+ '&desc_brief=' + window.escape( text ? 'Session Expired' : 'Operator Change' )
347 //+ '&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.'),
348 //'simple_auth' + (new Date()).toString(),
349 offlineStrings.getString('network.new_session.authorize'),
350 'chrome,resizable,modal,width=700,height=500',
352 'login_type' : 'staff',
353 'desc_brief' : text ? offlineStrings.getString('network.new_session.expired') : offlineStrings.getString('network.new_session.operator_change'),
354 'desc_full' : text ? offlineStrings.getString('network.new_session.expired.prompt') : offlineStrings.getString('network.new_session.operator_change.prompt')
355 //'simple_auth' : (new Date()).toString(),
358 JSAN.use('OpenILS.data');
359 var data = new OpenILS.data(); data.init({'via':'stash'});
360 if (typeof data.temporary_session != 'undefined' && data.temporary_session != '') {
361 data.session.key = data.temporary_session.key;
362 data.session.authtime = data.temporary_session.authtime;
363 data.stash('session');
365 var ios = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
366 var cookieUri = ios.newURI("http://" + data.server_unadorned, null, null);
367 var cookieUriSSL = ios.newURI("https://" + data.server_unadorned, null, null);
368 var cookieSvc = Components.classes["@mozilla.org/cookieService;1"].getService(Components.interfaces.nsICookieService);
370 cookieSvc.setCookieString(cookieUri, null, "ses="+data.session.key, null);
371 cookieSvc.setCookieString(cookieUriSSL, null, "ses="+data.session.key, null);
374 alert(offineStrings.getFormattedString('main.session_cookie.error', [E]));
376 if (! data.list.au ) data.list.au = [];
377 data.list.au[0] = JSON2js( data.temporary_session.usr );
379 obj.reset_titlebars(data);
382 obj.error.sdump('D_TRACE','No new session key after simple_auth in util/network\n');
387 obj.error.standard_unexpected_error_alert('util.network.get_new_session',E);
391 'rerequest_on_session_timeout' : function(app,name,params,req,override_params,_params) {
394 var robj = obj.get_result(req);
395 if (robj != null && robj.ilsevent && robj.ilsevent == 1001 /* NO_SESSION */) {
397 if (obj.get_new_session(name,undefined,true)) {
398 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
399 params[0] = data.session.key;
400 req = obj._request(app,name,params,null,override_params,_params);
404 this.error.standard_unexpected_error_alert('rerequest_on_session_timeout',E);
409 'rerequest_on_perm_failure' : function(app,name,params,req,override_params,_params) {
412 var robj = obj.get_result(req);
413 if (robj != null && robj.ilsevent && robj.ilsevent == 5000) {
414 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
415 if (location.href.match(/^chrome/)) {
416 //alert('Permission denied.');
418 JSAN.use('util.window'); var win = new util.window();
419 var my_xulG = win.open(
420 urls.XUL_AUTH_SIMPLE,
421 //+ '?login_type=temp'
422 //+ '&desc_brief=' + window.escape('Permission Denied: ' + robj.ilsperm)
423 //+ '&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),
424 //'simple_auth' + (new Date()).toString(),
425 offlineStrings.getFormattedString('network.permission.authorize'),
426 'chrome,resizable,modal,width=700,height=500',
428 'login_type' : 'temp',
429 'desc_brief' : offlineStrings.getFormattedString('network.permission.description.brief', [robj.ilsperm]),
430 'desc_full' : offlineStrings.getFormattedString('network.permission.description.full', [name])
431 //'simple_auth' : (new Date()).toString(),
434 JSAN.use('OpenILS.data');
435 //var data = new OpenILS.data(); data.init({'via':'stash'});
436 if (typeof my_xulG.temporary_session != 'undefined' && my_xulG.temporary_session != '') {
437 params[0] = my_xulG.temporary_session.key;
438 req = obj._request(app,name,params,null,override_params,_params);
443 this.error.sdump('D_ERROR',E);
448 'rerequest_on_override' : function (app,name,params,req,override_params,_params) {
451 if (!override_params.text) override_params.text = {};
452 if (!override_params.auto_override_these_events) override_params.auto_override_these_events = [];
453 function override(r) {
455 // test to see if we can suppress this dialog and auto-override
456 var auto_override = false;
457 if (override_params.auto_override_these_events.length > 0) {
458 auto_override = true;
459 for (var i = 0; i < r.length; i++) {
461 (r[i].ilsevent != 'undefined') &&
463 (override_params.auto_override_these_events.indexOf( r[i].ilsevent == null ? null : Number(r[i].ilsevent) ) != -1) ||
464 (override_params.auto_override_these_events.indexOf( r[i].textcode ) != -1)
470 auto_override = false;
476 req = obj._request(app,name + '.override',params);
480 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
481 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">' +
482 '<groupbox><caption label="' + offlineStrings.getString('network.override.exceptions') + '"/>' +
483 '<grid><columns><column/><column/></columns><rows>';
484 for (var i = 0; i < r.length; i++) {
485 var t1 = String(r[i].ilsevent).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
486 var t2 = String(r[i].textcode).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
487 var t3 = String((override_params.text[r[i].ilsevent] ? override_params.text[r[i].ilsevent](r[i]) : '')).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
488 var t4 = String(r[i].desc).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
490 '<description class="oils_event" tooltiptext="' + t1 + '">' + t2 + '</description>' +
491 '<description>' + t3 + '</description>' +
492 '</row><row>' + '<description>' + t4 + '</description>' + '</row>';
494 xml += '</rows></grid></groupbox><groupbox><caption label="' + offlineStrings.getString('network.override.override') +'"/><hbox>' +
495 '<description>' + offlineStrings.getString('network.override.force.prompt') + '</description>' +
496 '<button accesskey="' + offlineStrings.getString('common.no.accesskey') + '" label="' + offlineStrings.getString('common.no') + '" name="fancy_cancel"/>' +
497 '<button id="override" accesskey="' + offlineStrings.getString('common.yes.accesskey') + '" label="' + offlineStrings.getString('common.yes') + '" name="fancy_submit" value="override"/></hbox></groupbox></vbox>';
498 //JSAN.use('OpenILS.data');
499 //var data = new OpenILS.data(); data.init({'via':'stash'});
500 //data.temp_override_xml = xml; data.stash('temp_override_xml');
501 JSAN.use('util.window'); var win = new util.window();
502 var fancy_prompt_data = win.open(
503 urls.XUL_FANCY_PROMPT,
504 //+ '?xml_in_stash=temp_override_xml'
505 //+ '&title=' + window.escape(override_params.title),
506 'fancy_prompt', 'chrome,resizable,modal,width=700,height=500',
507 { 'xml' : xml, 'title' : override_params.title, 'sound' : 'bad', 'sound_object' : obj.sound }
509 if (fancy_prompt_data.fancy_status == 'complete') {
510 req = obj._request(app,name + '.override',params);
514 alert('in util.network, rerequest_on_override, override:' + E);
518 var result = obj.get_result(req);
519 if (!result) return req;
522 (typeof result.ilsevent != 'undefined') &&
524 (override_params.overridable_events.indexOf( result.ilsevent == null || result.ilsevent == '' ? null : Number(result.ilsevent) ) != -1) ||
525 (override_params.overridable_events.indexOf( result.textcode ) != -1)
528 req = override([result]);
530 var found_good = false; var found_bad = false;
531 for (var i = 0; i < result.length; i++) {
533 (result[i].ilsevent != 'undefined') &&
535 (override_params.overridable_events.indexOf( result[i].ilsevent == null || result.ilsevent == '' ? null : Number(result[i].ilsevent) ) != -1) ||
536 (override_params.overridable_events.indexOf( result[i].textcode ) != -1)
544 if (found_good && (!found_bad)) req = override(result);
553 'ping' : function() {
555 JSAN.use('util.file'); JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
556 var file = new util.file('ping.bat');
557 var path = file._file.path;
558 file.write_content('truncate+exec',
560 'ping -n 15 ' + data.server_unadorned + ' > "' + path + '.txt"\n' + /* windows */
561 'ping -c 15 ' + data.server_unadorned + ' >> "' + path + '.txt"\n' /* unix */
564 file = new util.file('ping.bat');
566 var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
567 process.init(file._file);
571 dump('process.run = ' + process.run(true, args, args.length) + '\n');
575 var file = new util.file('ping.bat.txt');
576 var output = file.get_content();
585 'play_sounds' : function(req) {
588 var result = req.getResultObject();
589 if (result == null) { return; }
590 if (typeof result.textcode != 'undefined') {
591 obj.sound.event( result );
593 if (typeof result.length != 'undefined') {
594 for (var i = 0; i < result.length; i++) {
595 if (typeof result[i].textcode != 'undefined') {
596 obj.sound.event( result[i] );
602 dump('Error in network.js, play_sounds() : ' + E + '\n');
608 function sample_callback(request) {
609 var result = request.getResultObject();
613 dump('exiting util/network.js\n');