1 dump('entering util/network.js\n');
3 if (typeof util == 'undefined') util = {};
4 util.network = function () {
6 JSAN.use('util.error'); this.error = new util.error();
7 JSAN.use('util.sound'); this.sound = new util.sound();
12 util.network.prototype = {
16 'NETWORK_FAILURE' : null,
18 'simple_request' : function(method_id,params,f,override_params) {
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 });
28 'get_result' : function (req) {
32 result = req.getResultObject();
35 if (instanceOf(E, NetworkFailure)) {
36 obj.NETWORK_FAILURE = E;
38 try { obj.NETWORK_FAILURE = js2JSON(E); } catch(F) { dump(F + '\n'); obj.NETWORK_FAILURE = E; };
41 obj.NETWORK_FAILURE = 'Unknown status';
48 'request' : function (app,name,params,f,override_params,_params) {
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');
58 var request = this._request(app,name,params,f,override_params,_params);
60 return this.get_result(request);
70 '_request' : function (app,name,params,f,override_params,_params) {
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' ) );
78 var request = new RemoteRequest( app, name );
79 if (_params && _params.secure) {
80 request.setSecure(true);
82 request.setSecure(false);
84 for(var index in params) {
85 request.addParam(params[index]);
89 request.setCompleteCallback(
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);
103 req = obj.check_for_offline(app,name,params,req,override_params,_params);
105 obj.NETWORK_FAILURE = null;
109 E.textcode = 'Server/Method Error';
111 f( { 'getResultObject' : function() { return E; } } );
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);
138 request = obj.check_for_offline(app,name,params,request,override_params,_params);
139 obj.NETWORK_FAILURE = null;
145 if (instanceOf(E,perm_ex)) {
146 alert('in util.network, _request : permission exception: ' + js2JSON(E));
152 'check_for_offline' : function (app,name,params,req,override_params,_params) {
154 var result = obj.get_result(req);
155 if (result != null) return req;
157 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
166 if (data.proceed_offline) {
172 var network_failure_string;
173 var network_failure_status_string;
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); }
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; }
181 try { obj.error.sdump('D_SES_ERROR',msg); } catch(E) { alert(E); }
183 r = obj.error.yns_alert(msg,'Network Failure','Retry Network','Ignore Errors',null,'Check here to confirm this message');
185 data.proceed_offline = true; data.stash('proceed_offline');
186 dump('Remembering proceed_offline for 200000 ms.\n');
189 data.proceed_offline = false; data.stash('proceed_offline');
190 dump('Setting proceed_offline back to false.\n');
196 dump( r == 0 ? 'Retry Network\n' : 'Ignore Errors\n' );
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? :) */
205 return { 'getResultObject' : function() { return { 'ilsevent' : -1, 'textcode' : 'Network/Server Problem' }; } };
211 'reset_titlebars' : function(data) {
213 data.stash_retrieve();
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);
220 var w; // set title on all appshell windows
221 while ( w = enumerator.getNext() ) {
222 if (w.document.title.match(/^\d/)) {
224 win.appshell_name_increment()
225 + ': ' + data.list.au[0].usrname()
226 + '@' + data.ws_name;
227 + '.' + data.server_unadorned
231 obj.error.standard_unexpected_error_alert('Error setting window titles to match new login',E);
235 'get_new_session' : function(name,xulG,text) {
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(
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(),
250 'chrome,resizable,modal,width=700,height=500',
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(),
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');
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);
270 cookieSvc.setCookieString(cookieUri, null, "ses="+data.session.key, null);
271 cookieSvc.setCookieString(cookieUriSSL, null, "ses="+data.session.key, null);
274 alert('Error setting session cookie: ' + E);
276 if (! data.list.au ) data.list.au = [];
277 data.list.au[0] = JSON2js( data.temporary_session.usr );
279 obj.reset_titlebars(data);
282 obj.error.sdump('D_TRACE','No new session key after simple_auth in util/network\n');
287 obj.error.standard_unexpected_error_alert('util.network.get_new_session',E);
291 'rerequest_on_session_timeout' : function(app,name,params,req,override_params,_params) {
294 var robj = obj.get_result(req);
295 if (robj != null && robj.ilsevent && robj.ilsevent == 1001) {
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);
304 this.error.standard_unexpected_error_alert('rerequest_on_session_timeout',E);
309 'rerequest_on_perm_failure' : function(app,name,params,req,override_params,_params) {
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.');
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(),
326 'chrome,resizable,modal,width=700,height=500',
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(),
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);
343 this.error.sdump('D_ERROR',E);
348 'rerequest_on_override' : function (app,name,params,req,override_params,_params) {
351 if (!override_params.text) override_params.text = {};
352 function override(r) {
354 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
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,'&').replace(/</g,'<').replace(/>/g,'>');
361 var t2 = String(r[i].textcode).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
362 var t3 = String((override_params.text[r[i].ilsevent] ? override_params.text[r[i].ilsevent](r[i]) : '')).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
363 var t4 = String(r[i].desc).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
365 '<description style="color: red" tooltiptext="' + t1 + '">' + t2 + '</description>' +
366 '<description>' + t3 + '</description>' +
367 '</row><row>' + '<description>' + t4 + '</description>' + '</row>';
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 }
384 if (fancy_prompt_data.fancy_status == 'complete') {
385 req = obj._request(app,name + '.override',params);
389 alert('in util.network, rerequest_on_override, override:' + E);
393 var result = obj.get_result(req);
394 if (!result) return req;
396 if ( (typeof result.ilsevent != 'undefined') && (override_params.overridable_events.indexOf( Number(result.ilsevent) ) != -1) ) {
397 req = override([result]);
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) ) {
407 if (found_good && (!found_bad)) req = override(result);
418 function sample_callback(request) {
419 var result = request.getResultObject();
423 dump('exiting util/network.js\n');