]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/xul/staff_client/chrome/content/util/network.js
support for secure/non-secure flag for methods in constants.js
[working/Evergreen.git] / Open-ILS / xul / staff_client / chrome / content / util / network.js
1 dump('entering util/network.js\n');
2
3 if (typeof util == 'undefined') util = {};
4 util.network = function () {
5
6         JSAN.use('util.error'); this.error = new util.error();
7         JSAN.use('util.sound'); this.sound = new util.sound();
8
9         return this;
10 };
11
12 util.network.prototype = {
13
14         'link_id' : 0,
15
16         'NETWORK_FAILURE' : null,
17
18         'simple_request' : function(id,params,f,o_params) {
19                 var secure = true; if (typeof api[id].secure != 'undefined') secure = api[id].secure;
20                 return this.request(api[id].app,api[id].method,params,f,o_params,secure);
21         },
22
23         'get_result' : function (req) {
24                 var obj = this;
25                 var result;
26                 try {
27                         result = req.getResultObject(); 
28                 } catch(E) {
29                         try {
30                                 if (instanceOf(E, NetworkFailure)) {
31                                         obj.NETWORK_FAILURE = E;
32                                 } else {
33                                         try { obj.NETWORK_FAILURE = js2JSON(E); } catch(F) { dump(F + '\n'); obj.NETWORK_FAILURE = E; };
34                                 }
35                         } catch(I) { 
36                                 obj.NETWORK_FAILURE = 'Unknown status';
37                         }
38                         result = null;
39                 }
40                 return result;
41         },
42
43         'request' : function (app,name,params,f,o_params,secure) {
44                 var request =  this._request(app,name,params,f,o_params,secure);
45                 if (request) {
46                         return this.get_result(request);
47                 } else {
48                         return null;
49                 }
50         },
51
52         '_request' : function (app,name,params,f,o_params,secure) {
53                 var obj = this;
54                 try {
55                         var sparams = js2JSON(params);
56                         obj.error.sdump('D_SES','request '+app+' '+name+' '+obj.error.pretty_print(sparams.slice(1,sparams.length-1))+
57                                 '\no_params = ' + o_params + '\nsecure = ' + secure +
58                                 '\nResult #' + (++obj.link_id) + ( f ? ' asynced' : ' synced' ) );
59                         var request = new RemoteRequest( app, name );
60                         if (secure) {
61                                 request.setSecure(true);
62                         } else {
63                                 request.setSecure(false);
64                         }
65                         for(var index in params) {
66                                 request.addParam(params[index]);
67                         }
68         
69                         if (f)  {
70                                 request.setCompleteCallback(
71                                         function(req) {
72                                                 try {
73                                                         var json_string = js2JSON(obj.get_result(req));
74                                                         obj.error.sdump('D_SES_RESULT','asynced result #' 
75                                                                 + obj.link_id + '\n\n' 
76                                                                 + (json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string) 
77                                                                 + '\n\nOriginal Request:\n\n' 
78                                                                 + 'request '+app+' '+name+' '+ sparams.slice(1,sparams.length-1));
79                                                         req = obj.rerequest_on_session_timeout(app,name,params,req,o_params,secure);
80                                                         req = obj.rerequest_on_perm_failure(app,name,params,req,o_params,secure);
81                                                         if (o_params) {
82                                                                 req = obj.rerequest_on_override(app,name,params,req,o_params,secure);
83                                                         }
84                                                         req = obj.check_for_offline(app,name,params,req,o_params,secure);
85                                                         f(req);
86                                                         obj.NETWORK_FAILURE = null;
87                                                 } catch(E) {
88                                                         try {
89                                                                 E.ilsevent = -2;
90                                                                 E.textcode = 'Server/Method Error';
91                                                         } catch(F) {}
92                                                         f( { 'getResultObject' : function() { return E; } } );
93                                                 }
94                                         }
95                                 );
96                                 try {
97                                         request.send(false);
98                                 } catch(E) {
99                                         throw(E);
100                                 }
101                                 return null;
102                         } else {
103                                 try {
104                                         request.send(true);
105                                 } catch(E) {
106                                         throw(E);
107                                 }
108                                 var result = obj.get_result(request);
109                                 var json_string = js2JSON(result);
110                                 this.error.sdump('D_SES_RESULT','synced result #' 
111                                         + obj.link_id + '\n\n' + ( json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string ) 
112                                         + '\n\nOriginal Request:\n\n' 
113                                         + 'request '+app+' '+name+' '+ sparams.slice(1,sparams.length-1));
114                                 request = obj.rerequest_on_session_timeout(app,name,params,request,o_params,secure);
115                                 request = obj.rerequest_on_perm_failure(app,name,params,request,o_params,secure);
116                                 if (o_params) {
117                                         request = obj.rerequest_on_override(app,name,params,request,o_params,secure);
118                                 }
119                                 request = obj.check_for_offline(app,name,params,request,o_params,secure);
120                                 obj.NETWORK_FAILURE = null;
121                                 return request;
122                         }
123
124                 } catch(E) {
125                         alert(E);
126                         if (instanceOf(E,perm_ex)) {
127                                 alert('in util.network, _request : permission exception: ' + js2JSON(E));
128                         }
129                         throw(E);
130                 }
131         },
132
133         'check_for_offline' : function (app,name,params,req,o_params,secure) {
134                 var obj = this;
135                 var result = obj.get_result(req);
136                 if (result != null) return req;
137
138                 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
139                 var proceed = true;
140
141                 while(proceed) {
142
143                         proceed = false;
144
145                         var r;
146
147                         if (data.proceed_offline) {
148
149                                 r = 1;
150
151                         } else {
152
153                                 var network_failure_string;
154                                 var network_failure_status_string;
155                                 var msg;
156
157                                 try { network_failure_string = String( obj.NETWORK_FAILURE ); } catch(E) { network_failure_string = E; }
158                                 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); }
159                                 
160                                 try { msg = 'Network/server failure.  Please check your Internet connection to ' + data.server_unadorned + ' and choose Retry Network.  If you need to enter Offline Mode, choose Ignore Errors in this and subsequent dialogs.  If you believe this error is due to a bug in Evergreen and not network problems, please contact your helpdesk or friendly Evergreen admins, and give them this information:\nmethod=' + name + '\nparams=' + js2JSON(params) + '\nTHROWN:\n' + network_failure_string + '\nSTATUS:\n' + network_failure_status_string; } catch(E) { msg = E; }
161
162                                 try { obj.error.sdump('D_SES_ERROR',msg); } catch(E) { alert(E); }
163
164                                 r = obj.error.yns_alert(msg,'Network Failure','Retry Network','Ignore Errors',null,'Check here to confirm this message');
165                                 if (r == 1) {
166                                         data.proceed_offline = true; data.stash('proceed_offline');
167                                         dump('Remembering proceed_offline for 200000 ms.\n');
168                                         setTimeout(
169                                                 function() {
170                                                         data.proceed_offline = false; data.stash('proceed_offline');
171                                                         dump('Setting proceed_offline back to false.\n');
172                                                 }, 200000
173                                         );
174                                 }
175                         }
176
177                         dump( r == 0 ? 'Retry Network\n' : 'Ignore Errors\n' );
178
179                         switch(r) {
180                                 case 0: 
181                                         req = obj._request(app,name,params,null,o_params,secure);
182                                         if (obj.get_result(req)) proceed = true; /* daily WTF, why am I even doing this? :) */
183                                         return req;
184                                 break;
185                                 case 1: 
186                                         return { 'getResultObject' : function() { return { 'ilsevent' : -1, 'textcode' : 'Network/Server Problem' }; } };
187                                 break;
188                         }
189                 }
190         },
191
192         'reset_titlebars' : function(data) {
193                 var obj = this;
194                 data.stash_retrieve();
195                 try {
196                         JSAN.use('util.window'); var win =  new util.window();
197                         var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService();
198                         var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
199                         var enumerator = windowManagerInterface.getEnumerator(null);
200
201                         var w; // set title on all appshell windows
202                         while ( w = enumerator.getNext() ) {
203                                 if (w.document.title.match(/^\d/)) {
204                                         w.document.title = 
205                                                 win.appshell_name_increment() 
206                                                 + ': ' + data.list.au[0].usrname() 
207                                                 + '@' + data.ws_name;
208                                                 + '.' + data.server_unadorned 
209                                 }
210                         }
211                 } catch(E) {
212                         obj.error.standard_unexpected_error_alert('Error setting window titles to match new login',E);
213                 }
214         },
215
216         'get_new_session' : function(name,xulG,text) {
217                 var obj = this;
218                 try {
219
220                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
221                 var url = urls.XUL_AUTH_SIMPLE;
222                 if (typeof xulG != 'undefined' && typeof xulG.url_prefix == 'function') url = xulG.url_prefix( url );
223                 window.open(
224                         url
225                         + '?login_type=staff'
226                         + '&desc_brief=' + window.escape( text ? 'Session Expired' : 'Operator Change' )
227                         + '&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.'),
228                         'simple_auth' + (new Date()).toString(),
229                         'chrome,resizable,modal,width=700,height=500'
230                 );
231                 JSAN.use('OpenILS.data');
232                 var data = new OpenILS.data(); data.init({'via':'stash'});
233                 if (typeof data.temporary_session != 'undefined' && data.temporary_session != '') {
234                         data.session.key = data.temporary_session.key; 
235                         data.session.authtime = data.temporary_session.authtime; 
236                         data.stash('session');
237                         if (! data.list.au ) data.list.au = [];
238                         data.list.au[0] = JSON2js(data.temporary_session.usr);
239                         data.stash('list');
240                         obj.reset_titlebars(data);
241                         return true;
242                 }
243                 return false;
244
245                 } catch(E) {
246                         obj.error.standard_unexpected_error_alert('util.network.get_new_session',E);
247                 }
248         },
249
250         'rerequest_on_session_timeout' : function(app,name,params,req,o_params,secure) {
251                 try {
252                         var obj = this;
253                         var robj = obj.get_result(req);
254                         if (robj != null && robj.ilsevent && robj.ilsevent == 1001) {
255
256                                 if (obj.get_new_session(name,undefined,true)) {
257                                         JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
258                                         params[0] = data.session.key;
259                                         req = obj._request(app,name,params,null,o_params,secure);
260                                 }
261                         }
262                 } catch(E) {
263                         this.error.standard_unexpected_error_alert('rerequest_on_session_timeout',E);
264                 }
265                 return req;
266         },
267         
268         'rerequest_on_perm_failure' : function(app,name,params,req,o_params,secure) {
269                 try {
270                         var obj = this;
271                         var robj = obj.get_result(req);
272                         if (robj != null && robj.ilsevent && robj.ilsevent == 5000) {
273                                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
274                                 if (location.href.match(/^chrome/)) {
275                                         //alert('Permission denied.');
276                                 } else {
277                                         window.open(
278                                                 urls.XUL_AUTH_SIMPLE
279                                                 + '?login_type=temp'
280                                                 + '&desc_brief=' + window.escape('Permission Denied: ' + robj.ilsperm)
281                                                 + '&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),
282                                                 'simple_auth' + (new Date()).toString(),
283                                                 'chrome,resizable,modal,width=700,height=500'
284                                         );
285                                         JSAN.use('OpenILS.data');
286                                         var data = new OpenILS.data(); data.init({'via':'stash'});
287                                         if (typeof data.temporary_session != 'undefined' && data.temporary_session != '') {
288                                                 params[0] = data.temporary_session.key;
289                                                 req = obj._request(app,name,params,null,o_params,secure);
290                                         }
291                                 }
292                         }
293                 } catch(E) {
294                         this.error.sdump('D_ERROR',E);
295                 }
296                 return req;
297         },
298
299         'rerequest_on_override' : function (app,name,params,req,o_params,secure) {
300                 var obj = this;
301                 try {
302                         if (!o_params.text) o_params.text = {};
303                         function override(r) {
304                                 try {
305                                         netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
306                                         obj.sound.bad();
307                                         var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">' + 
308                                                 '<groupbox><caption label="Exceptions"/>' + 
309                                                 '<grid><columns><column/><column/></columns><rows>';
310                                         for (var i = 0; i < r.length; i++) {
311                                                 var t1 = String(r[i].ilsevent).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
312                                                 var t2 = String(r[i].textcode).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
313                                                 var t3 = String((o_params.text[r[i].ilsevent] ? o_params.text[r[i].ilsevent](r[i]) : '')).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
314                                                 var t4 = String(r[i].desc).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
315                                                 xml += '<row>' + 
316                                                         '<description style="color: red" tooltiptext="' + t1 + '">' + t2 + '</description>' + 
317                                                         '<description>' + t3 + '</description>' + 
318                                                         '</row><row>' + '<description>' + t4 + '</description>' + '</row>';
319                                         }
320                                         xml += '</rows></grid></groupbox><groupbox><caption label="Override"/><hbox>' + 
321                                                 '<description>Force this action?</description>' + 
322                                                 '<button accesskey="N" label="No" name="fancy_cancel"/>' + 
323                                                 '<button id="override" accesskey="Y" label="Yes" name="fancy_submit" value="override"/></hbox></groupbox></vbox>';
324                                         JSAN.use('OpenILS.data');
325                                         var data = new OpenILS.data(); data.init({'via':'stash'});
326                                         data.temp_override_xml = xml; data.stash('temp_override_xml');
327                                         window.open(
328                                                 urls.XUL_FANCY_PROMPT
329                                                 + '?xml_in_stash=temp_override_xml'
330                                                 + '&title=' + window.escape(o_params.title),
331                                                 'fancy_prompt', 'chrome,resizable,modal,width=700,height=500'
332                                         );
333                                         data.init({'via':'stash'});
334                                         if (data.fancy_prompt_data != '') {
335                                                 req = obj._request(app,name + '.override',params);
336                                         }
337                                         return req;
338                                 } catch(E) {
339                                         alert('in util.network, rerequest_on_override, override:' + E);
340                                 }
341                         }
342
343                         var result = obj.get_result(req);
344                         if (!result) return req;
345
346                         if ( (typeof result.ilsevent != 'undefined') && (o_params.overridable_events.indexOf(result.ilsevent) != -1) ) {
347                                 req = override([result]);
348                         } else {
349                                 var found_good = false; var found_bad = false;
350                                 for (var i = 0; i < result.length; i++) {
351                                         if ( (result[i].ilsevent != 'undefined') && (o_params.overridable_events.indexOf(result[i].ilsevent) != -1) ) {
352                                                 found_good = true;
353                                         } else {
354                                                 found_bad = true;
355                                         }
356                                 }
357                                 if (found_good && (!found_bad)) req = override(result);
358                         }
359
360                         return req;
361                 } catch(E) {
362                         throw(E);
363                 }
364         },
365
366
367 }
368
369 /*
370 function sample_callback(request) {
371         var result = request.getResultObject();
372 }
373 */
374
375 dump('exiting util/network.js\n');