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 function override(r) {
421 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
423 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">' +
424 '<groupbox><caption label="' + offlineStrings.getString('network.override.exceptions') + '"/>' +
425 '<grid><columns><column/><column/></columns><rows>';
426 for (var i = 0; i < r.length; i++) {
427 var t1 = String(r[i].ilsevent).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
428 var t2 = String(r[i].textcode).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
429 var t3 = String((override_params.text[r[i].ilsevent] ? override_params.text[r[i].ilsevent](r[i]) : '')).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
430 var t4 = String(r[i].desc).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
432 '<description class="oils_event" tooltiptext="' + t1 + '">' + t2 + '</description>' +
433 '<description>' + t3 + '</description>' +
434 '</row><row>' + '<description>' + t4 + '</description>' + '</row>';
436 xml += '</rows></grid></groupbox><groupbox><caption label="' + offlineStrings.getString('network.override.override') +'"/><hbox>' +
437 '<description>' + offlineStrings.getString('network.override.force.prompt') + '</description>' +
438 '<button accesskey="' + offlineStrings.getString('common.no.accesskey') + '" label="' + offlineStrings.getString('common.no') + '" name="fancy_cancel"/>' +
439 '<button id="override" accesskey="' + offlineStrings.getString('common.yes.accesskey') + '" label="' + offlineStrings.getString('common.yes') + '" name="fancy_submit" value="override"/></hbox></groupbox></vbox>';
440 //JSAN.use('OpenILS.data');
441 //var data = new OpenILS.data(); data.init({'via':'stash'});
442 //data.temp_override_xml = xml; data.stash('temp_override_xml');
443 JSAN.use('util.window'); var win = new util.window();
444 var fancy_prompt_data = win.open(
445 urls.XUL_FANCY_PROMPT,
446 //+ '?xml_in_stash=temp_override_xml'
447 //+ '&title=' + window.escape(override_params.title),
448 'fancy_prompt', 'chrome,resizable,modal,width=700,height=500',
449 { 'xml' : xml, 'title' : override_params.title }
451 if (fancy_prompt_data.fancy_status == 'complete') {
452 req = obj._request(app,name + '.override',params);
456 alert('in util.network, rerequest_on_override, override:' + E);
460 var result = obj.get_result(req);
461 if (!result) return req;
464 (typeof result.ilsevent != 'undefined') &&
466 (override_params.overridable_events.indexOf( result.ilsevent == null ? null : Number(result.ilsevent) ) != -1) ||
467 (override_params.overridable_events.indexOf( result.textcode ) != -1)
470 req = override([result]);
472 var found_good = false; var found_bad = false;
473 for (var i = 0; i < result.length; i++) {
475 (result[i].ilsevent != 'undefined') &&
477 (override_params.overridable_events.indexOf( result[i].ilsevent == null ? null : Number(result[i].ilsevent) ) != -1) ||
478 (override_params.overridable_events.indexOf( result[i].textcode ) != -1)
486 if (found_good && (!found_bad)) req = override(result);
495 'ping' : function() {
497 JSAN.use('util.file'); JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
498 var file = new util.file('ping.bat');
499 var path = file._file.path;
500 file.write_content('truncate+exec',
502 'ping -n 15 ' + data.server_unadorned + ' > "' + path + '.txt"\n' + /* windows */
503 'ping -c 15 ' + data.server_unadorned + ' >> "' + path + '.txt"\n' /* unix */
506 file = new util.file('ping.bat');
508 var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
509 process.init(file._file);
513 dump('process.run = ' + process.run(true, args, args.length) + '\n');
517 var file = new util.file('ping.bat.txt');
518 var output = file.get_content();
529 function sample_callback(request) {
530 var result = request.getResultObject();
534 dump('exiting util/network.js\n');