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 req = obj.rerequest_on_session_timeout(app,name,params,req,override_params,_params);
137 req = obj.rerequest_on_perm_failure(app,name,params,req,override_params,_params);
138 if (override_params) {
139 req = obj.rerequest_on_override(app,name,params,req,override_params,_params);
141 req = obj.check_for_offline(app,name,params,req,override_params,_params);
143 obj.NETWORK_FAILURE = null;
147 E.textcode = offlineStrings.getString('network.server_or_method.error');
149 f( { 'getResultObject' : function() { return E; } } );
162 var duration = ( (new Date).getTime() - start_timer )/1000;
163 if ( obj.get_result(request) == null && duration > obj.network_timeout ) request.cancelled = true;
165 if (document.getElementById('network_progress')) {
166 if (g && g.menu && g.menu.network_meter && typeof g.menu.network_meter.dec == 'function') g.menu.network_meter.dec(app,name);
167 } else if (typeof xulG != 'undefined') {
168 if (xulG && xulG.network_meter && typeof xulG.network_meter.dec == 'function') xulG.network_meter.dec(app,name);
174 var result = obj.get_result(request);
175 var json_string = js2JSON(result);
176 this.error.sdump('D_SES_RESULT','synced result #'
177 + obj.link_id + '\n\n' + ( json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string )
178 + '\n\nOriginal Request:\n\n'
179 + 'request '+app+' '+name+' '+ sparams.slice(1,sparams.length-1));
180 request = obj.rerequest_on_session_timeout(app,name,params,request,override_params,_params);
181 request = obj.rerequest_on_perm_failure(app,name,params,request,override_params,_params);
182 if (override_params) {
183 request = obj.rerequest_on_override(app,name,params,request,override_params,_params);
185 request = obj.check_for_offline(app,name,params,request,override_params,_params);
186 obj.NETWORK_FAILURE = null;
192 if (instanceOf(E,perm_ex)) {
193 alert('in util.network, _request : permission exception: ' + js2JSON(E));
199 'check_for_offline' : function (app,name,params,req,override_params,_params) {
202 var result = obj.get_result(req);
203 if (result == null) return req;
204 if (typeof result.ilsevent == 'undefined') return req;
205 if (result.ilsevent != -1) return req;
207 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
216 if (data.proceed_offline) {
222 var network_failure_string;
223 var network_failure_status_string;
226 try { network_failure_string = String( obj.NETWORK_FAILURE ); } catch(E) { network_failure_string = E; }
227 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); }
229 try { msg = offlineStrings.getFormattedString('network.server.failure.exception', [data.server_unadorned]) + '\n' +
230 offlineStrings.getFormattedString('network.server.method', [name]) + '\n' +
231 offlineStrings.getFormattedString('network.server.params', [js2JSON(params)]) + '\n' +
232 offlineStrings.getString('network.server.thrown_label') + '\n' + network_failure_string + '\n' +
233 offlineStrings.getString('network.server.status_label') + '\n' + network_failure_status_string;
234 } catch(E) { msg = E; }
236 try { obj.error.sdump('D_SES_ERROR',msg); } catch(E) { alert('3: ' + E); }
238 r = obj.error.yns_alert(
240 offlineStrings.getString('network.network_failure'),
241 offlineStrings.getString('network.retry_network'),
242 offlineStrings.getString('network.ignore_errors'),
244 offlineStrings.getString('common.confirm')
247 data.proceed_offline = true; data.stash('proceed_offline');
248 dump('Remembering proceed_offline for 200000 ms.\n');
251 data.proceed_offline = false; data.stash('proceed_offline');
252 dump('Setting proceed_offline back to false.\n');
258 dump( r == 0 ? 'Retry Network\n' : 'Ignore Errors\n' );
262 req = obj._request(app,name,params,null,override_params,_params);
263 if (obj.get_result(req)) proceed = true; /* daily WTF, why am I even doing this? :) */
278 'reset_titlebars' : function(data) {
280 data.stash_retrieve();
282 JSAN.use('util.window'); var win = new util.window();
283 var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService();
284 var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
285 var enumerator = windowManagerInterface.getEnumerator(null);
287 var w; // set title on all appshell windows
288 while ( w = enumerator.getNext() ) {
289 if (w.document.title.match(/^\d/)) {
291 win.appshell_name_increment()
292 + ': ' + data.list.au[0].usrname()
293 + '@' + data.ws_name;
294 + '.' + data.server_unadorned
298 obj.error.standard_unexpected_error_alert(offlineStrings.getString('network.window_title.error'),E);
302 'get_new_session' : function(name,xulG,text) {
306 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
307 var url = urls.XUL_AUTH_SIMPLE;
308 if (typeof xulG != 'undefined' && typeof xulG.url_prefix == 'function') url = xulG.url_prefix( url );
309 JSAN.use('util.window'); var win = new util.window();
310 var my_xulG = win.open(
312 //+ '?login_type=staff'
313 //+ '&desc_brief=' + window.escape( text ? 'Session Expired' : 'Operator Change' )
314 //+ '&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.'),
315 //'simple_auth' + (new Date()).toString(),
316 offlineStrings.getString('network.new_session.authorize'),
317 'chrome,resizable,modal,width=700,height=500',
319 'login_type' : 'staff',
320 'desc_brief' : text ? offlineStrings.getString('network.new_session.expired') : offlineStrings.getString('network.new_session.operator_change'),
321 'desc_full' : text ? offlineStrings.getString('network.new_session.expired.prompt') : offlineStrings.getString('network.new_session.operator_change.prompt')
322 //'simple_auth' : (new Date()).toString(),
325 JSAN.use('OpenILS.data');
326 var data = new OpenILS.data(); data.init({'via':'stash'});
327 if (typeof data.temporary_session != 'undefined' && data.temporary_session != '') {
328 data.session.key = data.temporary_session.key;
329 data.session.authtime = data.temporary_session.authtime;
330 data.stash('session');
332 var ios = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
333 var cookieUri = ios.newURI("http://" + data.server_unadorned, null, null);
334 var cookieUriSSL = ios.newURI("https://" + data.server_unadorned, null, null);
335 var cookieSvc = Components.classes["@mozilla.org/cookieService;1"].getService(Components.interfaces.nsICookieService);
337 cookieSvc.setCookieString(cookieUri, null, "ses="+data.session.key, null);
338 cookieSvc.setCookieString(cookieUriSSL, null, "ses="+data.session.key, null);
341 alert(offineStrings.getFormattedString('main.session_cookie.error', [E]));
343 if (! data.list.au ) data.list.au = [];
344 data.list.au[0] = JSON2js( data.temporary_session.usr );
346 obj.reset_titlebars(data);
349 obj.error.sdump('D_TRACE','No new session key after simple_auth in util/network\n');
354 obj.error.standard_unexpected_error_alert('util.network.get_new_session',E);
358 'rerequest_on_session_timeout' : function(app,name,params,req,override_params,_params) {
361 var robj = obj.get_result(req);
362 if (robj != null && robj.ilsevent && robj.ilsevent == 1001) {
364 if (obj.get_new_session(name,undefined,true)) {
365 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
366 params[0] = data.session.key;
367 req = obj._request(app,name,params,null,override_params,_params);
371 this.error.standard_unexpected_error_alert('rerequest_on_session_timeout',E);
376 'rerequest_on_perm_failure' : function(app,name,params,req,override_params,_params) {
379 var robj = obj.get_result(req);
380 if (robj != null && robj.ilsevent && robj.ilsevent == 5000) {
381 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
382 if (location.href.match(/^chrome/)) {
383 //alert('Permission denied.');
385 JSAN.use('util.window'); var win = new util.window();
386 var my_xulG = win.open(
387 urls.XUL_AUTH_SIMPLE,
388 //+ '?login_type=temp'
389 //+ '&desc_brief=' + window.escape('Permission Denied: ' + robj.ilsperm)
390 //+ '&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),
391 //'simple_auth' + (new Date()).toString(),
392 offlineStrings.getFormattedString('network.permission.authorize'),
393 'chrome,resizable,modal,width=700,height=500',
395 'login_type' : 'temp',
396 'desc_brief' : offlineStrings.getFormattedString('network.permission.description.brief', [robj.ilsperm]),
397 'desc_full' : offlineStrings.getFormattedString('network.permission.description.full', [name])
398 //'simple_auth' : (new Date()).toString(),
401 JSAN.use('OpenILS.data');
402 //var data = new OpenILS.data(); data.init({'via':'stash'});
403 if (typeof my_xulG.temporary_session != 'undefined' && my_xulG.temporary_session != '') {
404 params[0] = my_xulG.temporary_session.key;
405 req = obj._request(app,name,params,null,override_params,_params);
410 this.error.sdump('D_ERROR',E);
415 'rerequest_on_override' : function (app,name,params,req,override_params,_params) {
418 if (!override_params.text) override_params.text = {};
419 if (!override_params.auto_override_these_events) override_params.auto_override_these_events = [];
420 function override(r) {
422 // test to see if we can suppress this dialog and auto-override
423 var auto_override = false;
424 if (override_params.auto_override_these_events.length > 0) {
425 auto_override = true;
426 for (var i = 0; i < r.length; i++) {
428 (r[i].ilsevent != 'undefined') &&
430 (override_params.auto_override_these_events.indexOf( r[i].ilsevent == null ? null : Number(r[i].ilsevent) ) != -1) ||
431 (override_params.auto_override_these_events.indexOf( r[i].textcode ) != -1)
437 auto_override = false;
443 req = obj._request(app,name + '.override',params);
447 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
449 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">' +
450 '<groupbox><caption label="' + offlineStrings.getString('network.override.exceptions') + '"/>' +
451 '<grid><columns><column/><column/></columns><rows>';
452 for (var i = 0; i < r.length; i++) {
453 var t1 = String(r[i].ilsevent).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
454 var t2 = String(r[i].textcode).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
455 var t3 = String((override_params.text[r[i].ilsevent] ? override_params.text[r[i].ilsevent](r[i]) : '')).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
456 var t4 = String(r[i].desc).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
458 '<description class="oils_event" tooltiptext="' + t1 + '">' + t2 + '</description>' +
459 '<description>' + t3 + '</description>' +
460 '</row><row>' + '<description>' + t4 + '</description>' + '</row>';
462 xml += '</rows></grid></groupbox><groupbox><caption label="' + offlineStrings.getString('network.override.override') +'"/><hbox>' +
463 '<description>' + offlineStrings.getString('network.override.force.prompt') + '</description>' +
464 '<button accesskey="' + offlineStrings.getString('common.no.accesskey') + '" label="' + offlineStrings.getString('common.no') + '" name="fancy_cancel"/>' +
465 '<button id="override" accesskey="' + offlineStrings.getString('common.yes.accesskey') + '" label="' + offlineStrings.getString('common.yes') + '" name="fancy_submit" value="override"/></hbox></groupbox></vbox>';
466 //JSAN.use('OpenILS.data');
467 //var data = new OpenILS.data(); data.init({'via':'stash'});
468 //data.temp_override_xml = xml; data.stash('temp_override_xml');
469 JSAN.use('util.window'); var win = new util.window();
470 var fancy_prompt_data = win.open(
471 urls.XUL_FANCY_PROMPT,
472 //+ '?xml_in_stash=temp_override_xml'
473 //+ '&title=' + window.escape(override_params.title),
474 'fancy_prompt', 'chrome,resizable,modal,width=700,height=500',
475 { 'xml' : xml, 'title' : override_params.title }
477 if (fancy_prompt_data.fancy_status == 'complete') {
478 req = obj._request(app,name + '.override',params);
482 alert('in util.network, rerequest_on_override, override:' + E);
486 var result = obj.get_result(req);
487 if (!result) return req;
490 (typeof result.ilsevent != 'undefined') &&
492 (override_params.overridable_events.indexOf( result.ilsevent == null ? null : Number(result.ilsevent) ) != -1) ||
493 (override_params.overridable_events.indexOf( result.textcode ) != -1)
496 req = override([result]);
498 var found_good = false; var found_bad = false;
499 for (var i = 0; i < result.length; i++) {
501 (result[i].ilsevent != 'undefined') &&
503 (override_params.overridable_events.indexOf( result[i].ilsevent == null ? null : Number(result[i].ilsevent) ) != -1) ||
504 (override_params.overridable_events.indexOf( result[i].textcode ) != -1)
512 if (found_good && (!found_bad)) req = override(result);
521 'ping' : function() {
523 JSAN.use('util.file'); JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
524 var file = new util.file('ping.bat');
525 var path = file._file.path;
526 file.write_content('truncate+exec',
528 'ping -n 15 ' + data.server_unadorned + ' > "' + path + '.txt"\n' + /* windows */
529 'ping -c 15 ' + data.server_unadorned + ' >> "' + path + '.txt"\n' /* unix */
532 file = new util.file('ping.bat');
534 var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
535 process.init(file._file);
539 dump('process.run = ' + process.run(true, args, args.length) + '\n');
543 var file = new util.file('ping.bat.txt');
544 var output = file.get_content();
555 function sample_callback(request) {
556 var result = request.getResultObject();
560 dump('exiting util/network.js\n');