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' ) );
99 if (document.getElementById('network_progress')) {
100 if (g && g.menu && g.menu.network_meter && typeof g.menu.network_meter.inc == 'function') g.menu.network_meter.inc(app,name);
101 } else if (typeof xulG != 'undefined') {
102 if (xulG && xulG.network_meter && typeof xulG.network_meter.inc == 'function') xulG.network_meter.inc(app,name);
105 var request = new RemoteRequest( app, name );
106 if (_params && _params.secure) {
107 request.setSecure(true);
109 request.setSecure(false);
111 for(var index in params) {
112 request.addParam(params[index]);
115 var start_timer = (new Date).getTime();
117 request.setCompleteCallback(
120 var duration = ( (new Date).getTime() - start_timer )/1000;
121 if ( obj.get_result(req) == null && duration > obj.network_timeout ) req.cancelled = true;
123 if (document.getElementById('network_progress')) {
124 if (g && g.menu && g.menu.network_meter && typeof g.menu.network_meter.dec == 'function') g.menu.network_meter.dec(app,name);
125 } else if (typeof xulG != 'undefined') {
126 if (xulG && xulG.network_meter && typeof xulG.network_meter.dec == 'function') xulG.network_meter.dec(app,name);
129 var json_string = js2JSON(obj.get_result(req));
130 obj.error.sdump('D_SES_RESULT','asynced result #'
131 + obj.link_id + '\n\n'
132 + (json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string)
133 + '\n\nOriginal Request:\n\n'
134 + 'request '+app+' '+name+' '+ sparams.slice(1,sparams.length-1));
135 req = obj.rerequest_on_session_timeout(app,name,params,req,override_params,_params);
136 req = obj.rerequest_on_perm_failure(app,name,params,req,override_params,_params);
137 if (override_params) {
138 req = obj.rerequest_on_override(app,name,params,req,override_params,_params);
140 req = obj.check_for_offline(app,name,params,req,override_params,_params);
142 obj.NETWORK_FAILURE = null;
146 E.textcode = offlineStrings.getString('network.server_or_method.error');
148 f( { 'getResultObject' : function() { return E; } } );
161 var duration = ( (new Date).getTime() - start_timer )/1000;
162 if ( obj.get_result(request) == null && duration > obj.network_timeout ) request.cancelled = true;
164 if (document.getElementById('network_progress')) {
165 if (g && g.menu && g.menu.network_meter && typeof g.menu.network_meter.dec == 'function') g.menu.network_meter.dec(app,name);
166 } else if (typeof xulG != 'undefined') {
167 if (xulG && xulG.network_meter && typeof xulG.network_meter.dec == 'function') xulG.network_meter.dec(app,name);
173 var result = obj.get_result(request);
174 var json_string = js2JSON(result);
175 this.error.sdump('D_SES_RESULT','synced result #'
176 + obj.link_id + '\n\n' + ( json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string )
177 + '\n\nOriginal Request:\n\n'
178 + 'request '+app+' '+name+' '+ sparams.slice(1,sparams.length-1));
179 request = obj.rerequest_on_session_timeout(app,name,params,request,override_params,_params);
180 request = obj.rerequest_on_perm_failure(app,name,params,request,override_params,_params);
181 if (override_params) {
182 request = obj.rerequest_on_override(app,name,params,request,override_params,_params);
184 request = obj.check_for_offline(app,name,params,request,override_params,_params);
185 obj.NETWORK_FAILURE = null;
191 if (instanceOf(E,perm_ex)) {
192 alert('in util.network, _request : permission exception: ' + js2JSON(E));
198 'check_for_offline' : function (app,name,params,req,override_params,_params) {
201 var result = obj.get_result(req);
202 if (result == null) return req;
203 if (typeof result.ilsevent == 'undefined') return req;
204 if (result.ilsevent != -1) return req;
206 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
215 if (data.proceed_offline) {
221 var network_failure_string;
222 var network_failure_status_string;
225 try { network_failure_string = String( obj.NETWORK_FAILURE ); } catch(E) { network_failure_string = E; }
226 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); }
228 try { msg = offlineStrings.getFormattedString('network.server.failure.exception', [data.server_unadorned]) + '\n' +
229 offlineStrings.getFormattedString('network.server.method', [name]) + '\n' +
230 offlineStrings.getFormattedString('network.server.params', [js2JSON(params)]) + '\n' +
231 offlineStrings.getString('network.server.thrown_label') + '\n' + network_failure_string + '\n' +
232 offlineStrings.getString('network.server.status_label') + '\n' + network_failure_status_string;
233 } catch(E) { msg = E; }
235 try { obj.error.sdump('D_SES_ERROR',msg); } catch(E) { alert('3: ' + E); }
237 r = obj.error.yns_alert(
239 offlineStrings.getString('network.network_failure'),
240 offlineStrings.getString('network.retry_network'),
241 offlineStrings.getString('network.ignore_errors'),
243 offlineStrings.getString('common.confirm')
246 data.proceed_offline = true; data.stash('proceed_offline');
247 dump('Remembering proceed_offline for 200000 ms.\n');
250 data.proceed_offline = false; data.stash('proceed_offline');
251 dump('Setting proceed_offline back to false.\n');
257 dump( r == 0 ? 'Retry Network\n' : 'Ignore Errors\n' );
261 req = obj._request(app,name,params,null,override_params,_params);
262 if (obj.get_result(req)) proceed = true; /* daily WTF, why am I even doing this? :) */
277 'reset_titlebars' : function(data) {
279 data.stash_retrieve();
281 JSAN.use('util.window'); var win = new util.window();
282 var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService();
283 var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
284 var enumerator = windowManagerInterface.getEnumerator(null);
286 var w; // set title on all appshell windows
287 while ( w = enumerator.getNext() ) {
288 if (w.document.title.match(/^\d/)) {
290 win.appshell_name_increment()
291 + ': ' + data.list.au[0].usrname()
292 + '@' + data.ws_name;
293 + '.' + data.server_unadorned
297 obj.error.standard_unexpected_error_alert(offlineStrings.getString('network.window_title.error'),E);
301 'get_new_session' : function(name,xulG,text) {
305 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
306 var url = urls.XUL_AUTH_SIMPLE;
307 if (typeof xulG != 'undefined' && typeof xulG.url_prefix == 'function') url = xulG.url_prefix( url );
308 JSAN.use('util.window'); var win = new util.window();
309 var my_xulG = win.open(
311 //+ '?login_type=staff'
312 //+ '&desc_brief=' + window.escape( text ? 'Session Expired' : 'Operator Change' )
313 //+ '&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.'),
314 //'simple_auth' + (new Date()).toString(),
315 offlineStrings.getString('network.new_session.authorize'),
316 'chrome,resizable,modal,width=700,height=500',
318 'login_type' : 'staff',
319 'desc_brief' : text ? offlineStrings.getString('network.new_session.expired') : offlineStrings.getString('network.new_session.operator_change'),
320 'desc_full' : text ? offlineStrings.getString('network.new_session.expired.prompt') : offlineStrings.getString('network.new_session.operator_change.prompt')
321 //'simple_auth' : (new Date()).toString(),
324 JSAN.use('OpenILS.data');
325 var data = new OpenILS.data(); data.init({'via':'stash'});
326 if (typeof data.temporary_session != 'undefined' && data.temporary_session != '') {
327 data.session.key = data.temporary_session.key;
328 data.session.authtime = data.temporary_session.authtime;
329 data.stash('session');
331 var ios = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
332 var cookieUri = ios.newURI("http://" + data.server_unadorned, null, null);
333 var cookieUriSSL = ios.newURI("https://" + data.server_unadorned, null, null);
334 var cookieSvc = Components.classes["@mozilla.org/cookieService;1"].getService(Components.interfaces.nsICookieService);
336 cookieSvc.setCookieString(cookieUri, null, "ses="+data.session.key, null);
337 cookieSvc.setCookieString(cookieUriSSL, null, "ses="+data.session.key, null);
340 alert(offineStrings.getFormattedString('main.session_cookie.error', [E]));
342 if (! data.list.au ) data.list.au = [];
343 data.list.au[0] = JSON2js( data.temporary_session.usr );
345 obj.reset_titlebars(data);
348 obj.error.sdump('D_TRACE','No new session key after simple_auth in util/network\n');
353 obj.error.standard_unexpected_error_alert('util.network.get_new_session',E);
357 'rerequest_on_session_timeout' : function(app,name,params,req,override_params,_params) {
360 var robj = obj.get_result(req);
361 if (robj != null && robj.ilsevent && robj.ilsevent == 1001) {
363 if (obj.get_new_session(name,undefined,true)) {
364 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
365 params[0] = data.session.key;
366 req = obj._request(app,name,params,null,override_params,_params);
370 this.error.standard_unexpected_error_alert('rerequest_on_session_timeout',E);
375 'rerequest_on_perm_failure' : function(app,name,params,req,override_params,_params) {
378 var robj = obj.get_result(req);
379 if (robj != null && robj.ilsevent && robj.ilsevent == 5000) {
380 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
381 if (location.href.match(/^chrome/)) {
382 //alert('Permission denied.');
384 JSAN.use('util.window'); var win = new util.window();
385 var my_xulG = win.open(
386 urls.XUL_AUTH_SIMPLE,
387 //+ '?login_type=temp'
388 //+ '&desc_brief=' + window.escape('Permission Denied: ' + robj.ilsperm)
389 //+ '&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),
390 //'simple_auth' + (new Date()).toString(),
391 offlineStrings.getFormattedString('network.permission.authorize'),
392 'chrome,resizable,modal,width=700,height=500',
394 'login_type' : 'temp',
395 'desc_brief' : offlineStrings.getFormattedString('network.permission.description.brief', [robj.ilsperm]),
396 'desc_full' : offlineStrings.getFormattedString('network.permission.description.full', [name])
397 //'simple_auth' : (new Date()).toString(),
400 JSAN.use('OpenILS.data');
401 //var data = new OpenILS.data(); data.init({'via':'stash'});
402 if (typeof my_xulG.temporary_session != 'undefined' && my_xulG.temporary_session != '') {
403 params[0] = my_xulG.temporary_session.key;
404 req = obj._request(app,name,params,null,override_params,_params);
409 this.error.sdump('D_ERROR',E);
414 'rerequest_on_override' : function (app,name,params,req,override_params,_params) {
417 if (!override_params.text) override_params.text = {};
418 function override(r) {
420 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
422 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">' +
423 '<groupbox><caption label="' + offlineStrings.getString('network.override.exceptions') + '"/>' +
424 '<grid><columns><column/><column/></columns><rows>';
425 for (var i = 0; i < r.length; i++) {
426 var t1 = String(r[i].ilsevent).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
427 var t2 = String(r[i].textcode).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
428 var t3 = String((override_params.text[r[i].ilsevent] ? override_params.text[r[i].ilsevent](r[i]) : '')).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
429 var t4 = String(r[i].desc).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
431 '<description style="color: red" tooltiptext="' + t1 + '">' + t2 + '</description>' +
432 '<description>' + t3 + '</description>' +
433 '</row><row>' + '<description>' + t4 + '</description>' + '</row>';
435 xml += '</rows></grid></groupbox><groupbox><caption label="' + offlineStrings.getString('network.override.override') +'"/><hbox>' +
436 '<description>' + offlineStrings.getString('network.override.force.prompt') + '</description>' +
437 '<button accesskey="' + offlineStrings.getString('common.no.accesskey') + '" label="' + offlineStrings.getString('common.no') + '" name="fancy_cancel"/>' +
438 '<button id="override" accesskey="' + offlineStrings.getString('common.yes.accesskey') + '" label="' + offlineStrings.getString('common.yes') + '" name="fancy_submit" value="override"/></hbox></groupbox></vbox>';
439 //JSAN.use('OpenILS.data');
440 //var data = new OpenILS.data(); data.init({'via':'stash'});
441 //data.temp_override_xml = xml; data.stash('temp_override_xml');
442 JSAN.use('util.window'); var win = new util.window();
443 var fancy_prompt_data = win.open(
444 urls.XUL_FANCY_PROMPT,
445 //+ '?xml_in_stash=temp_override_xml'
446 //+ '&title=' + window.escape(override_params.title),
447 'fancy_prompt', 'chrome,resizable,modal,width=700,height=500',
448 { 'xml' : xml, 'title' : override_params.title }
450 if (fancy_prompt_data.fancy_status == 'complete') {
451 req = obj._request(app,name + '.override',params);
455 alert('in util.network, rerequest_on_override, override:' + E);
459 var result = obj.get_result(req);
460 if (!result) return req;
463 (typeof result.ilsevent != 'undefined') &&
465 (override_params.overridable_events.indexOf( result.ilsevent == null ? null : Number(result.ilsevent) ) != -1) ||
466 (override_params.overridable_events.indexOf( result.textcode ) != -1)
469 req = override([result]);
471 var found_good = false; var found_bad = false;
472 for (var i = 0; i < result.length; i++) {
474 (result[i].ilsevent != 'undefined') &&
476 (override_params.overridable_events.indexOf( result[i].ilsevent == null ? null : Number(result[i].ilsevent) ) != -1) ||
477 (override_params.overridable_events.indexOf( result[i].textcode ) != -1)
485 if (found_good && (!found_bad)) req = override(result);
494 'ping' : function() {
496 JSAN.use('util.file'); JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
497 var file = new util.file('ping.bat');
498 var path = file._file.path;
499 file.write_content('truncate+exec',
501 'ping -n 15 ' + data.server_unadorned + ' > "' + path + '.txt"\n' + /* windows */
502 'ping -c 15 ' + data.server_unadorned + ' >> "' + path + '.txt"\n' /* unix */
505 file = new util.file('ping.bat');
507 var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
508 process.init(file._file);
512 dump('process.run = ' + process.run(true, args, args.length) + '\n');
516 var file = new util.file('ping.bat.txt');
517 var output = file.get_content();
528 function sample_callback(request) {
529 var result = request.getResultObject();
533 dump('exiting util/network.js\n');