]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/chrome/content/util/network.js
store the session key and the authtime in the global stash
[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
8         return this;
9 };
10
11 util.network.prototype = {
12
13         'link_id' : 0,
14
15         'simple_request' : function(id,params,f) {
16                 return this.request(api[id].app,api[id].method,params,f);
17         },
18
19         'request' : function (app,name,params,f,o_params) {
20                 var request =  this._request(app,name,params,f,o_params);
21                 if (request) {
22                         return request.getResultObject();
23                 } else {
24                         return null;
25                 }
26         },
27
28         '_request' : function (app,name,params,f,o_params) {
29                 var obj = this;
30                 try {
31                         var sparams = js2JSON(params);
32                         obj.error.sdump('D_SES','request '+app+' '+name+' '+obj.error.pretty_print(sparams.slice(1,sparams.length-1))+
33                                 '\nResult #' + (++obj.link_id) + ( f ? ' asynced' : ' synced' ) );
34                         var request = new RemoteRequest( app, name );
35                         for(var index in params) {
36                                 request.addParam(params[index]);
37                         }
38         
39                         if (f)  {
40                                 request.setCompleteCallback(
41                                         function(req) {
42                                                 try {
43                                                         var json_string = js2JSON(req.getResultObject());
44                                                         obj.error.sdump('D_SES_RESULT','asynced result #' 
45                                                                 + obj.link_id + '\n\n' 
46                                                                 + (json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string) );
47                                                         req = obj.rerequest_on_session_timeout(app,name,params,req,o_params);
48                                                         req = obj.rerequest_on_perm_failure(app,name,params,req,o_params);
49                                                         if (o_params) {
50                                                                 req = obj.rerequest_on_override(app,name,params,req,o_params);
51                                                         }
52                                                         req = obj.check_for_offline(app,name,params,req,o_params);
53                                                         f(req);
54                                                 } catch(E) {
55                                                         alert(E);
56                                                 }
57                                         }
58                                 );
59                                 request.send(false);
60                                 return null;
61                         } else {
62                                 request.send(true);
63                                 var result = request.getResultObject();
64                                 var json_string = js2JSON(result);
65                                 this.error.sdump('D_SES_RESULT','synced result #' + obj.link_id + '\n\n' + ( json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string ) );
66                                 request = obj.rerequest_on_session_timeout(app,name,params,request,o_params);
67                                 request = obj.rerequest_on_perm_failure(app,name,params,request,o_params);
68                                 if (o_params) {
69                                         request = obj.rerequest_on_override(app,name,params,request,o_params);
70                                 }
71                                 request = obj.check_for_offline(app,name,params,request,o_params);
72                                 return request;
73                         }
74
75                 } catch(E) {
76                         if (instanceOf(E,perm_ex)) {
77                                 alert('permission exception: ' + js2JSON(E));
78                         }
79                         throw(E);
80                 }
81         },
82
83         'check_for_offline' : function (app,name,params,req,o_params) {
84                 var obj = this;
85                 var result = req.getResultObject();
86                 if (result != null) return req;
87
88                 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
89                 var proceed = true;
90
91                 while(proceed) {
92
93                         proceed = false;
94
95                         var r;
96
97                         if (data.proceed_offline) {
98
99                                 r = 1;
100
101                         } else {
102                                 r = obj.error.yns_alert('Network failure.  Please check your Internet connection to ' + data.server_unadorned + ' and choose Retry Network.  If you need to enter Offline Mode, choose Proceed Offline 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 message "' + name + '".','Network Failure','Retry Network','Proceed Offline',null,'Check here to confirm this message');
103                                 if (r == 1) {
104                                         data.proceed_offline = true; data.stash('proceed_offline');
105                                         dump('Remembering proceed_offline for 200000 ms.\n');
106                                         setTimeout(
107                                                 function() {
108                                                         data.proceed_offline = false; data.stash('proceed_offline');
109                                                         dump('Setting proceed_offline back to false.\n');
110                                                 }, 200000
111                                         );
112                                 }
113                         }
114
115                         dump( r == 0 ? 'Retry Network\n' : 'Proceed Offline\n' );
116
117                         switch(r) {
118                                 case 0: 
119                                         req = obj._request(app,name,params,null,o_params);
120                                         if (req.getResultObject() == null) proceed = true;
121                                         return req;
122                                 break;
123                                 case 1: 
124                                         return { 'getResultObject' : function() { return { 'ilsevent' : -1, 'textcode' : 'Network/Server Problem' }; } };
125                                 break;
126                         }
127                 }
128         },
129
130         'rerequest_on_session_timeout' : function(app,name,params,req,o_params) {
131                 try {
132                         var obj = this;
133                         var robj = req.getResultObject();
134                         if (robj != null && robj.ilsevent && robj.ilsevent == 1001) {
135                                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
136                                 window.open(
137                                         urls.XUL_AUTH_SIMPLE
138                                         + '?login_type=staff'
139                                         + '&desc_brief=' + window.escape('Your session has expired')
140                                         + '&desc_full=' + window.escape('Please re-login.  If after you have re-authenticated, you still see session expired dialogs like this one, please note where they are occuring and inform your friendly Evergreen developers of this debug information: ' + name),
141                                         'simple_auth',
142                                         'chrome,resizable,modal,width=700,height=500'
143                                 );
144                                 JSAN.use('OpenILS.data');
145                                 var data = new OpenILS.data(); data.init({'via':'stash'});
146                                 if (data.temporary_session != '') {
147                                         data.session.key = data.temporary_session.key; 
148                                         data.session.authtime = data.temporary_session.authtime; 
149                                         data.stash('session');
150                                         params[0] = data.session.key;
151                                         req = obj._request(app,name,params,null,o_params);
152                                 }
153                         }
154                 } catch(E) {
155                         this.error.sdump('D_ERROR',E);
156                 }
157                 return req;
158         },
159         
160         'rerequest_on_perm_failure' : function(app,name,params,req,o_params) {
161                 try {
162                         var obj = this;
163                         var robj = req.getResultObject();
164                         if (robj != null && robj.ilsevent && robj.ilsevent == 5000) {
165                                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
166                                 window.open(
167                                         urls.XUL_AUTH_SIMPLE
168                                         + '?login_type=temp'
169                                         + '&desc_brief=' + window.escape('Permission Denied: ' + robj.ilsperm)
170                                         + '&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),
171                                         'simple_auth',
172                                         'chrome,resizable,modal,width=700,height=500'
173                                 );
174                                 JSAN.use('OpenILS.data');
175                                 var data = new OpenILS.data(); data.init({'via':'stash'});
176                                 if (data.temporary_session != '') {
177                                         params[0] = data.temporary_session;
178                                         req = obj._request(app,name,params,null,o_params);
179                                 }
180                         }
181                 } catch(E) {
182                         this.error.sdump('D_ERROR',E);
183                 }
184                 return req;
185         },
186
187         'rerequest_on_override' : function (app,name,params,req,o_params) {
188                 var obj = this;
189                 try {
190                         if (!o_params.text) o_params.text = {};
191                         function override(r) {
192                                 try {
193                                         netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
194                                         var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">' + 
195                                                 '<groupbox><caption label="Exceptions"/>' + 
196                                                 '<grid><columns><column/><column/><column/><column/></columns><rows>';
197                                         for (var i = 0; i < r.length; i++) {
198                                                 xml += '<row style="color: red">' + 
199                                                         '<description>' + r[i].ilsevent + '</description>' + 
200                                                         '<description>' + r[i].textcode + '</description>' + 
201                                                         '<description>' +  (obj.error.get_ilsevent(r[i].ilsevent) ? obj.error.get_ilsevent(r[i].ilsevent) : "") + '</description>' +
202                                                         '<description>' + (o_params.text[r[i].ilsevent] ? o_params.text[r[i].ilsevent](r[i]) : '') + '</description>' + 
203                                                         '</row>';
204                                         }
205                                         xml += '</rows></grid></groupbox><groupbox><caption label="Override"/><hbox>' + 
206                                                 '<description>Force this action?</description>' + 
207                                                 '<button accesskey="C" label="Cancel" name="fancy_cancel"/>' + 
208                                                 '<button id="override" accesskey="O" label="Override" name="fancy_submit" value="override"/></hbox></groupbox></vbox>';
209                                         window.open(
210                                                 '/xul/server/util/fancy_prompt.xul'
211                                                 + '?xml=' + window.escape(xml)
212                                                 + '&title=' + window.escape(o_params.title),
213                                                 'fancy_prompt', 'chrome,resizable,modal,width=700,height=500'
214                                         );
215                                         JSAN.use('OpenILS.data');
216                                         var data = new OpenILS.data(); data.init({'via':'stash'});
217                                         if (data.fancy_prompt_data != '') {
218                                                 req = obj._request(app,name + '.override',params);
219                                         }
220                                         return req;
221                                 } catch(E) {
222                                         alert(E);
223                                 }
224                         }
225
226                         var result = req.getResultObject();
227                         if (!result) return req;
228
229                         if ( o_params.overridable_events.indexOf(result.ilsevent) != -1 ) {
230                                 req = override([result]);
231                         } else {
232                                 var found_good = false; var found_bad = false;
233                                 for (var i = 0; i < result.length; i++) {
234                                         if (o_params.overridable_events.indexOf(result[i].ilsevent) != -1 ) {
235                                                 found_good = true;
236                                         } else {
237                                                 found_bad = true;
238                                         }
239                                 }
240                                 if (found_good && (!found_bad)) req = override(result);
241                         }
242
243                         return req;
244                 } catch(E) {
245                         throw(E);
246                 }
247         },
248
249
250 }
251
252 /*
253 function sample_callback(request) {
254         var result = request.getResultObject();
255 }
256 */
257
258 dump('exiting util/network.js\n');