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