1 dump('entering util/network.js\n');
6 if (typeof util == 'undefined') util = {};
7 util.network = function () {
9 JSAN.use('util.error'); this.error = new util.error();
10 JSAN.use('util.sound'); this.sound = new util.sound();
12 offlineStrings = document.getElementById('offlineStrings');
17 util.network.prototype = {
21 'network_timeout' : 55, /* seconds */
23 'NETWORK_FAILURE' : null,
25 'simple_request' : function(method_id,params,f,override_params) {
27 //var sparams = js2JSON(params);
28 //obj.error.sdump('D_SES','simple_request '+ method_id +' '+obj.error.pretty_print(sparams.slice(1,sparams.length-1))+
29 // '\noverride_params = ' + override_params + '\n');
30 if (typeof api[method_id] == 'undefined') {
31 throw( offlineStrings.getFormattedString('network.method_not_found.error', [method_id]) );
33 var secure = true; if (typeof api[method_id].secure != 'undefined') secure = api[method_id].secure;
34 return this.request(api[method_id].app,api[method_id].method,params,f,override_params,{ 'secure' : secure, 'method_id' : method_id });
37 'get_result' : function (req) {
40 var fake_ilsevent_for_network_errors = { 'ilsevent' : -1, 'textcode' : offlineStrings.getString('network.server_or_method.error') };
43 result = fake_ilsevent_for_network_errors;
45 result = req.getResultObject();
49 if (instanceOf(E, NetworkFailure)) {
50 obj.NETWORK_FAILURE = E;
52 try { obj.NETWORK_FAILURE = js2JSON(E); } catch(F) { dump(F + '\n'); obj.NETWORK_FAILURE = E; };
55 obj.NETWORK_FAILURE = offlineStrings.getString('network.unknown_status');
57 result = fake_ilsevent_for_network_errors;
62 'request' : function (app,name,params,f,override_params,_params) {
66 //var sparams = js2JSON(params);
67 //obj.error.sdump('D_SES','request '+ app + ' ' + name +' '+obj.error.pretty_print(sparams.slice(1,sparams.length-1))+
68 // '\noverride_params = ' + override_params + '\n_params = ' + _params + '\n');
72 var request = this._request(app,name,params,f,override_params,_params);
74 return this.get_result(request);
84 '_request' : function (app,name,params,f,override_params,_params) {
87 var sparams = js2JSON(params);
88 obj.error.sdump('D_SES','_request '+app+' '+name+' '+obj.error.pretty_print(sparams.slice(1,sparams.length-1))+
89 '\noverride_params = ' + override_params + '\n_params = ' + _params +
90 '\nResult #' + (++obj.link_id) + ( f ? ' asynced' : ' synced' ) );
92 if (document.getElementById('network_progress')) {
93 if (g && g.menu && g.menu.network_meter && typeof g.menu.network_meter.inc == 'function') g.menu.network_meter.inc(app,name);
94 } else if (typeof xulG != 'undefined') {
95 if (xulG && xulG.network_meter && typeof xulG.network_meter.inc == 'function') xulG.network_meter.inc(app,name);
98 var request = new RemoteRequest( app, name );
99 if (_params && _params.secure) {
100 request.setSecure(true);
102 request.setSecure(false);
104 for(var index in params) {
105 request.addParam(params[index]);
108 var start_timer = (new Date).getTime();
110 request.setCompleteCallback(
113 var duration = ( (new Date).getTime() - start_timer )/1000;
114 if ( obj.get_result(req) == null && duration > obj.network_timeout ) req.cancelled = true;
116 if (document.getElementById('network_progress')) {
117 if (g && g.menu && g.menu.network_meter && typeof g.menu.network_meter.dec == 'function') g.menu.network_meter.dec(app,name);
118 } else if (typeof xulG != 'undefined') {
119 if (xulG && xulG.network_meter && typeof xulG.network_meter.dec == 'function') xulG.network_meter.dec(app,name);
122 var json_string = js2JSON(obj.get_result(req));
123 obj.error.sdump('D_SES_RESULT','asynced result #'
124 + obj.link_id + '\n\n'
125 + (json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string)
126 + '\n\nOriginal Request:\n\n'
127 + 'request '+app+' '+name+' '+ sparams.slice(1,sparams.length-1));
128 req = obj.rerequest_on_session_timeout(app,name,params,req,override_params,_params);
129 req = obj.rerequest_on_perm_failure(app,name,params,req,override_params,_params);
130 if (override_params) {
131 req = obj.rerequest_on_override(app,name,params,req,override_params,_params);
133 req = obj.check_for_offline(app,name,params,req,override_params,_params);
135 obj.NETWORK_FAILURE = null;
139 E.textcode = offlineStrings.getString('network.server_or_method.error');
141 f( { 'getResultObject' : function() { return E; } } );
154 var duration = ( (new Date).getTime() - start_timer )/1000;
155 if ( obj.get_result(request) == null && duration > obj.network_timeout ) request.cancelled = true;
157 if (document.getElementById('network_progress')) {
158 if (g && g.menu && g.menu.network_meter && typeof g.menu.network_meter.dec == 'function') g.menu.network_meter.dec(app,name);
159 } else if (typeof xulG != 'undefined') {
160 if (xulG && xulG.network_meter && typeof xulG.network_meter.dec == 'function') xulG.network_meter.dec(app,name);
166 var result = obj.get_result(request);
167 var json_string = js2JSON(result);
168 this.error.sdump('D_SES_RESULT','synced result #'
169 + obj.link_id + '\n\n' + ( json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string )
170 + '\n\nOriginal Request:\n\n'
171 + 'request '+app+' '+name+' '+ sparams.slice(1,sparams.length-1));
172 request = obj.rerequest_on_session_timeout(app,name,params,request,override_params,_params);
173 request = obj.rerequest_on_perm_failure(app,name,params,request,override_params,_params);
174 if (override_params) {
175 request = obj.rerequest_on_override(app,name,params,request,override_params,_params);
177 request = obj.check_for_offline(app,name,params,request,override_params,_params);
178 obj.NETWORK_FAILURE = null;
184 if (instanceOf(E,perm_ex)) {
185 alert('in util.network, _request : permission exception: ' + js2JSON(E));
191 'check_for_offline' : function (app,name,params,req,override_params,_params) {
194 var result = obj.get_result(req);
195 if (result == null) return req;
196 if (typeof result.ilsevent == 'undefined') return req;
197 if (result.ilsevent != -1) return req;
199 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
208 if (data.proceed_offline) {
214 var network_failure_string;
215 var network_failure_status_string;
218 try { network_failure_string = String( obj.NETWORK_FAILURE ); } catch(E) { network_failure_string = E; }
219 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); }
221 try { msg = offlineStrings.getFormattedString('network.server.failure.exception', [data.server_unadorned]) + '\n' +
222 offlineStrings.getFormattedString('network.server.method', [name]) + '\n' +
223 offlineStrings.getFormattedString('network.server.params', [js2JSON(params)]) + '\n' +
224 offlineStrings.getString('network.server.thrown_label') + '\n' + network_failure_string + '\n' +
225 offlineStrings.getString('network.server.status_label') + '\n' + network_failure_status_string;
226 } catch(E) { msg = E; }
228 try { obj.error.sdump('D_SES_ERROR',msg); } catch(E) { alert('3: ' + E); }
230 r = obj.error.yns_alert(
232 offlineStrings.getString('network.network_failure'),
233 offlineStrings.getString('network.retry_network'),
234 offlineStrings.getString('network.ignore_errors'),
236 offlineStrings.getString('common.confirm')
239 data.proceed_offline = true; data.stash('proceed_offline');
240 dump('Remembering proceed_offline for 200000 ms.\n');
243 data.proceed_offline = false; data.stash('proceed_offline');
244 dump('Setting proceed_offline back to false.\n');
250 dump( r == 0 ? 'Retry Network\n' : 'Ignore Errors\n' );
254 req = obj._request(app,name,params,null,override_params,_params);
255 if (obj.get_result(req)) proceed = true; /* daily WTF, why am I even doing this? :) */
270 'reset_titlebars' : function(data) {
272 data.stash_retrieve();
274 JSAN.use('util.window'); var win = new util.window();
275 var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService();
276 var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
277 var enumerator = windowManagerInterface.getEnumerator(null);
279 var w; // set title on all appshell windows
280 while ( w = enumerator.getNext() ) {
281 if (w.document.title.match(/^\d/)) {
283 win.appshell_name_increment()
284 + ': ' + data.list.au[0].usrname()
285 + '@' + data.ws_name;
286 + '.' + data.server_unadorned
290 obj.error.standard_unexpected_error_alert(offlineStrings.getString('network.window_title.error'),E);
294 'get_new_session' : function(name,xulG,text) {
298 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
299 var url = urls.XUL_AUTH_SIMPLE;
300 if (typeof xulG != 'undefined' && typeof xulG.url_prefix == 'function') url = xulG.url_prefix( url );
301 JSAN.use('util.window'); var win = new util.window();
302 var my_xulG = win.open(
304 //+ '?login_type=staff'
305 //+ '&desc_brief=' + window.escape( text ? 'Session Expired' : 'Operator Change' )
306 //+ '&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.'),
307 //'simple_auth' + (new Date()).toString(),
308 offlineStrings.getString('network.new_session.authorize'),
309 'chrome,resizable,modal,width=700,height=500',
311 'login_type' : 'staff',
312 'desc_brief' : text ? offlineStrings.getString('network.new_session.expired') : offlineStrings.getString('network.new_session.operator_change'),
313 'desc_full' : text ? offlineStrings.getString('network.new_session.expired.prompt') : offlineStrings.getString('network.new_session.operator_change.prompt')
314 //'simple_auth' : (new Date()).toString(),
317 JSAN.use('OpenILS.data');
318 var data = new OpenILS.data(); data.init({'via':'stash'});
319 if (typeof data.temporary_session != 'undefined' && data.temporary_session != '') {
320 data.session.key = data.temporary_session.key;
321 data.session.authtime = data.temporary_session.authtime;
322 data.stash('session');
324 var ios = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
325 var cookieUri = ios.newURI("http://" + data.server_unadorned, null, null);
326 var cookieUriSSL = ios.newURI("https://" + data.server_unadorned, null, null);
327 var cookieSvc = Components.classes["@mozilla.org/cookieService;1"].getService(Components.interfaces.nsICookieService);
329 cookieSvc.setCookieString(cookieUri, null, "ses="+data.session.key, null);
330 cookieSvc.setCookieString(cookieUriSSL, null, "ses="+data.session.key, null);
333 alert(offineStrings.getFormattedString('main.session_cookie.error', [E]));
335 if (! data.list.au ) data.list.au = [];
336 data.list.au[0] = JSON2js( data.temporary_session.usr );
338 obj.reset_titlebars(data);
341 obj.error.sdump('D_TRACE','No new session key after simple_auth in util/network\n');
346 obj.error.standard_unexpected_error_alert('util.network.get_new_session',E);
350 'rerequest_on_session_timeout' : function(app,name,params,req,override_params,_params) {
353 var robj = obj.get_result(req);
354 if (robj != null && robj.ilsevent && robj.ilsevent == 1001) {
356 if (obj.get_new_session(name,undefined,true)) {
357 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
358 params[0] = data.session.key;
359 req = obj._request(app,name,params,null,override_params,_params);
363 this.error.standard_unexpected_error_alert('rerequest_on_session_timeout',E);
368 'rerequest_on_perm_failure' : function(app,name,params,req,override_params,_params) {
371 var robj = obj.get_result(req);
372 if (robj != null && robj.ilsevent && robj.ilsevent == 5000) {
373 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
374 if (location.href.match(/^chrome/)) {
375 //alert('Permission denied.');
377 JSAN.use('util.window'); var win = new util.window();
378 var my_xulG = win.open(
379 urls.XUL_AUTH_SIMPLE,
380 //+ '?login_type=temp'
381 //+ '&desc_brief=' + window.escape('Permission Denied: ' + robj.ilsperm)
382 //+ '&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),
383 //'simple_auth' + (new Date()).toString(),
384 offlineStrings.getFormattedString('network.permission.authorize'),
385 'chrome,resizable,modal,width=700,height=500',
387 'login_type' : 'temp',
388 'desc_brief' : offlineStrings.getFormattedString('network.permission.description.brief', [robj.ilsperm]),
389 'desc_full' : offlineStrings.getFormattedString('network.permission.description.full', [name])
390 //'simple_auth' : (new Date()).toString(),
393 JSAN.use('OpenILS.data');
394 //var data = new OpenILS.data(); data.init({'via':'stash'});
395 if (typeof my_xulG.temporary_session != 'undefined' && my_xulG.temporary_session != '') {
396 params[0] = my_xulG.temporary_session.key;
397 req = obj._request(app,name,params,null,override_params,_params);
402 this.error.sdump('D_ERROR',E);
407 'rerequest_on_override' : function (app,name,params,req,override_params,_params) {
410 if (!override_params.text) override_params.text = {};
411 function override(r) {
413 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
415 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">' +
416 '<groupbox><caption label="' + offlineStrings.getString('network.override.exceptions') + '"/>' +
417 '<grid><columns><column/><column/></columns><rows>';
418 for (var i = 0; i < r.length; i++) {
419 var t1 = String(r[i].ilsevent).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
420 var t2 = String(r[i].textcode).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
421 var t3 = String((override_params.text[r[i].ilsevent] ? override_params.text[r[i].ilsevent](r[i]) : '')).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
422 var t4 = String(r[i].desc).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
424 '<description style="color: red" tooltiptext="' + t1 + '">' + t2 + '</description>' +
425 '<description>' + t3 + '</description>' +
426 '</row><row>' + '<description>' + t4 + '</description>' + '</row>';
428 xml += '</rows></grid></groupbox><groupbox><caption label="' + offlineStrings.getString('network.override.override') +'"/><hbox>' +
429 '<description>' + offlineStrings.getString('network.override.force.prompt') + '</description>' +
430 '<button accesskey="' + offlineStrings.getString('common.no.accesskey') + '" label="' + offlineStrings.getString('common.no') + '" name="fancy_cancel"/>' +
431 '<button id="override" accesskey="' + offlineStrings.getString('common.yes.accesskey') + '" label="' + offlineStrings.getString('common.yes') + '" name="fancy_submit" value="override"/></hbox></groupbox></vbox>';
432 //JSAN.use('OpenILS.data');
433 //var data = new OpenILS.data(); data.init({'via':'stash'});
434 //data.temp_override_xml = xml; data.stash('temp_override_xml');
435 JSAN.use('util.window'); var win = new util.window();
436 var fancy_prompt_data = win.open(
437 urls.XUL_FANCY_PROMPT,
438 //+ '?xml_in_stash=temp_override_xml'
439 //+ '&title=' + window.escape(override_params.title),
440 'fancy_prompt', 'chrome,resizable,modal,width=700,height=500',
441 { 'xml' : xml, 'title' : override_params.title }
443 if (fancy_prompt_data.fancy_status == 'complete') {
444 req = obj._request(app,name + '.override',params);
448 alert('in util.network, rerequest_on_override, override:' + E);
452 var result = obj.get_result(req);
453 if (!result) return req;
455 if ( (typeof result.ilsevent != 'undefined') && (override_params.overridable_events.indexOf( result.ilsevent == null ? null : Number(result.ilsevent) ) != -1) ) {
456 req = override([result]);
458 var found_good = false; var found_bad = false;
459 for (var i = 0; i < result.length; i++) {
460 if ( (result[i].ilsevent != 'undefined') && (override_params.overridable_events.indexOf( result.ilsevent == null ? null : Number(result[i].ilsevent) ) != -1) ) {
466 if (found_good && (!found_bad)) req = override(result);
475 'ping' : function() {
477 JSAN.use('util.file'); JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
478 var file = new util.file('ping.bat');
479 var path = file._file.path;
480 file.write_content('truncate+exec',
482 'ping -n 15 ' + data.server_unadorned + ' > "' + path + '.txt"\n' + /* windows */
483 'ping -c 15 ' + data.server_unadorned + ' >> "' + path + '.txt"\n' /* unix */
486 file = new util.file('ping.bat');
488 var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
489 process.init(file._file);
493 dump('process.run = ' + process.run(true, args, args.length) + '\n');
497 var file = new util.file('ping.bat.txt');
498 var output = file.get_content();
509 function sample_callback(request) {
510 var result = request.getResultObject();
514 dump('exiting util/network.js\n');