]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/xul/staff_client/chrome/content/util/network.js
inline style here no longer works in xulrunner 1.9 for some reason
[working/Evergreen.git] / Open-ILS / xul / staff_client / chrome / content / util / network.js
1 dump('entering util/network.js\n');
2 // vim:noet:sw=4:ts=4:
3
4 var offlineStrings;
5
6 if (typeof util == 'undefined') util = {};
7 util.network = function () {
8
9     try {
10
11         JSAN.use('util.error'); this.error = new util.error();
12         JSAN.use('util.sound'); this.sound = new util.sound();
13
14         offlineStrings = document.getElementById('offlineStrings');
15
16     } catch(E) {
17         alert('error in util.network constructor: ' + E);
18         throw(E);
19     }
20
21         return this;
22 };
23
24 util.network.prototype = {
25
26         'link_id' : 0,
27
28     'network_timeout' : 55, /* seconds */
29
30         'NETWORK_FAILURE' : null,
31
32         'simple_request' : function(method_id,params,f,override_params) {
33                 //var obj = this;
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]) );
39                 }
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 });
42         },
43
44         'get_result' : function (req) {
45                 var obj = this;
46                 var result;
47         var fake_ilsevent_for_network_errors = { 'ilsevent' : -1, 'textcode' : offlineStrings.getString('network.server_or_method.error') }; 
48                 try {
49             if (req.cancelled) {
50                 result = fake_ilsevent_for_network_errors;
51             } else {
52                         result = req.getResultObject(); 
53             }
54                 } catch(E) {
55                         try {
56                                 if (instanceOf(E, NetworkFailure)) {
57                                         obj.NETWORK_FAILURE = E;
58                                 } else {
59                                         try { obj.NETWORK_FAILURE = js2JSON(E); } catch(F) { dump(F + '\n'); obj.NETWORK_FAILURE = E; };
60                                 }
61                         } catch(I) { 
62                                 obj.NETWORK_FAILURE = offlineStrings.getString('network.unknown_status');
63                         }
64             result = fake_ilsevent_for_network_errors;
65         }
66                 return result;
67         },
68
69         'request' : function (app,name,params,f,override_params,_params) {
70
71                 var obj = this;
72                 
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');
76
77                 try { 
78
79                         var request =  this._request(app,name,params,f,override_params,_params);
80                         if (request) {
81                                 return this.get_result(request);
82                         } else {
83                                 return null;
84                         }
85         
86                 } catch(E) {
87                         alert('1: ' + E); 
88                 }
89         },
90
91         '_request' : function (app,name,params,f,override_params,_params) {
92                 var obj = this;
93                 try {
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
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);
103             }
104
105                         var request = new RemoteRequest( app, name );
106                         if (_params && _params.secure) {
107                                 request.setSecure(true);
108                         } else {
109                                 request.setSecure(false);
110                         }
111                         for(var index in params) {
112                                 request.addParam(params[index]);
113                         }
114
115             var start_timer = (new Date).getTime();     
116                         if (f)  {
117                                 request.setCompleteCallback(
118                                         function(req) {
119                                                 try {
120                             var duration = ( (new Date).getTime() - start_timer )/1000;
121                             if ( obj.get_result(req) == null && duration > obj.network_timeout ) req.cancelled = true;
122
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);
127                             }
128
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);
139                                                         }
140                                                         req = obj.check_for_offline(app,name,params,req,override_params,_params);
141                                                         f(req);
142                                                         obj.NETWORK_FAILURE = null;
143                                                 } catch(E) {
144                                                         try {
145                                                                 E.ilsevent = -2;
146                                                                 E.textcode = offlineStrings.getString('network.server_or_method.error');
147                                                         } catch(F) {}
148                                                         f( { 'getResultObject' : function() { return E; } } );
149                                                 }
150                                         }
151                                 );
152                                 try {
153                                         request.send(false);
154                                 } catch(E) {
155                                         throw(E);
156                                 }
157                                 return null;
158                         } else {
159                                 try {
160                                         request.send(true);
161                     var duration = ( (new Date).getTime() - start_timer )/1000;
162                     if ( obj.get_result(request) == null && duration > obj.network_timeout ) request.cancelled = true;
163
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);
168                     }
169
170                                 } catch(E) {
171                                         throw(E);
172                                 }
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);
183                                 }
184                                 request = obj.check_for_offline(app,name,params,request,override_params,_params);
185                                 obj.NETWORK_FAILURE = null;
186                                 return request;
187                         }
188
189                 } catch(E) {
190                         alert('2: ' + E);
191                         if (instanceOf(E,perm_ex)) {
192                                 alert('in util.network, _request : permission exception: ' + js2JSON(E));
193                         }
194                         throw(E);
195                 }
196         },
197
198         'check_for_offline' : function (app,name,params,req,override_params,_params) {
199         try {
200             var obj = this;
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;
205
206             JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
207             var proceed = true;
208
209             while(proceed) {
210
211                 proceed = false;
212
213                 var r;
214
215                 if (data.proceed_offline) {
216
217                     r = 1;
218
219                 } else {
220
221                     var network_failure_string;
222                     var network_failure_status_string;
223                     var msg;
224
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); }
227                     
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; }
234
235                     try { obj.error.sdump('D_SES_ERROR',msg); } catch(E) { alert('3: ' + E); }
236
237                     r = obj.error.yns_alert(
238                         msg,
239                         offlineStrings.getString('network.network_failure'),
240                         offlineStrings.getString('network.retry_network'),
241                         offlineStrings.getString('network.ignore_errors'),
242                         null,
243                         offlineStrings.getString('common.confirm')
244                     );
245                     if (r == 1) {
246                         data.proceed_offline = true; data.stash('proceed_offline');
247                         dump('Remembering proceed_offline for 200000 ms.\n');
248                         setTimeout(
249                             function() {
250                                 data.proceed_offline = false; data.stash('proceed_offline');
251                                 dump('Setting proceed_offline back to false.\n');
252                             }, 200000
253                         );
254                     }
255                 }
256
257                 dump( r == 0 ? 'Retry Network\n' : 'Ignore Errors\n' );
258
259                 switch(r) {
260                     case 0: 
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? :) */
263                         return req;
264                     break;
265
266                     case 1: 
267                         return req;
268                     break;
269                 }
270             }
271         } catch(E) {
272                         alert('4: ' + E);
273             throw(E);
274         }
275         },
276
277         'reset_titlebars' : function(data) {
278                 var obj = this;
279                 data.stash_retrieve();
280                 try {
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);
285
286                         var w; // set title on all appshell windows
287                         while ( w = enumerator.getNext() ) {
288                                 if (w.document.title.match(/^\d/)) {
289                                         w.document.title = 
290                                                 win.appshell_name_increment() 
291                                                 + ': ' + data.list.au[0].usrname() 
292                                                 + '@' + data.ws_name;
293                                                 + '.' + data.server_unadorned 
294                                 }
295                         }
296                 } catch(E) {
297                         obj.error.standard_unexpected_error_alert(offlineStrings.getString('network.window_title.error'),E);
298                 }
299         },
300
301         'get_new_session' : function(name,xulG,text) {
302                 var obj = this;
303                 try {
304
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(
310                         url,
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',
317                         {
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(),
322                         }
323                 );
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');
330             try {
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);
335
336                 cookieSvc.setCookieString(cookieUri, null, "ses="+data.session.key, null);
337                 cookieSvc.setCookieString(cookieUriSSL, null, "ses="+data.session.key, null);
338
339             } catch(E) {
340                 alert(offineStrings.getFormattedString('main.session_cookie.error', [E]));
341             }
342                         if (! data.list.au ) data.list.au = [];
343                         data.list.au[0] = JSON2js( data.temporary_session.usr );
344                         data.stash('list');
345                         obj.reset_titlebars(data);
346                         return true;
347         } else {
348             obj.error.sdump('D_TRACE','No new session key after simple_auth in util/network\n');
349         }
350                 return false;
351
352                 } catch(E) {
353                         obj.error.standard_unexpected_error_alert('util.network.get_new_session',E);
354                 }
355         },
356
357         'rerequest_on_session_timeout' : function(app,name,params,req,override_params,_params) {
358                 try {
359                         var obj = this;
360                         var robj = obj.get_result(req);
361                         if (robj != null && robj.ilsevent && robj.ilsevent == 1001) {
362
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);
367                                 }
368                         }
369                 } catch(E) {
370                         this.error.standard_unexpected_error_alert('rerequest_on_session_timeout',E);
371                 }
372                 return req;
373         },
374         
375         'rerequest_on_perm_failure' : function(app,name,params,req,override_params,_params) {
376                 try {
377                         var obj = this;
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.');
383                                 } else {
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',
393                                                 {
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(),
398                                                 }
399                                         );
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);
405                                         }
406                                 }
407                         }
408                 } catch(E) {
409                         this.error.sdump('D_ERROR',E);
410                 }
411                 return req;
412         },
413
414         'rerequest_on_override' : function (app,name,params,req,override_params,_params) {
415                 var obj = this;
416                 try {
417                         if (!override_params.text) override_params.text = {};
418                         function override(r) {
419                                 try {
420                                         netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
421                                         obj.sound.bad();
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,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
427                                                 var t2 = String(r[i].textcode).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
428                                                 var t3 = String((override_params.text[r[i].ilsevent] ? override_params.text[r[i].ilsevent](r[i]) : '')).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
429                                                 var t4 = String(r[i].desc).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
430                                                 xml += '<row>' + 
431                                                         '<description class="oils_event" tooltiptext="' + t1 + '">' + t2 + '</description>' + 
432                                                         '<description>' + t3 + '</description>' + 
433                                                         '</row><row>' + '<description>' + t4 + '</description>' + '</row>';
434                                         }
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 }
449                                         );
450                                         if (fancy_prompt_data.fancy_status == 'complete') {
451                                                 req = obj._request(app,name + '.override',params);
452                                         }
453                                         return req;
454                                 } catch(E) {
455                                         alert('in util.network, rerequest_on_override, override:' + E);
456                                 }
457                         }
458
459                         var result = obj.get_result(req);
460                         if (!result) return req;
461
462                         if ( 
463                 (typeof result.ilsevent != 'undefined') && 
464                 (
465                     (override_params.overridable_events.indexOf( result.ilsevent == null ? null : Number(result.ilsevent) ) != -1) ||
466                     (override_params.overridable_events.indexOf( result.textcode ) != -1)
467                 )
468             ) {
469                                 req = override([result]);
470                         } else {
471                                 var found_good = false; var found_bad = false;
472                                 for (var i = 0; i < result.length; i++) {
473                                         if ( 
474                         (result[i].ilsevent != 'undefined') && 
475                         (
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) 
478                         )
479                     ) {
480                                                 found_good = true;
481                                         } else {
482                                                 found_bad = true;
483                                         }
484                                 }
485                                 if (found_good && (!found_bad)) req = override(result);
486                         }
487
488                         return req;
489                 } catch(E) {
490                         throw(E);
491                 }
492         },
493
494     'ping' : function() {
495         try {
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',
500                 '#!/bin/sh\n' +
501                 'ping -n 15 ' + data.server_unadorned + ' > "' + path + '.txt"\n' + /* windows */
502                 'ping -c 15 ' + data.server_unadorned + ' >> "' + path + '.txt"\n'  /* unix */
503             );
504             file.close();
505                         file = new util.file('ping.bat');
506
507                         var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
508                         process.init(file._file);
509
510                         var args = [];
511
512                         dump('process.run = ' + process.run(true, args, args.length) + '\n');
513
514             file.close();
515
516             var file = new util.file('ping.bat.txt');
517             var output = file.get_content();
518             file.close();
519
520             return output;
521         } catch(E) {
522             alert(E);
523         }
524     }
525 }
526
527 /*
528 function sample_callback(request) {
529         var result = request.getResultObject();
530 }
531 */
532
533 dump('exiting util/network.js\n');