1 dump('entering util/network.js\n');
5 offlineStrings = document.getElementById('offlineStrings');
7 if (typeof util == 'undefined') util = {};
8 util.network = function () {
10 JSAN.use('util.error'); this.error = new util.error();
11 JSAN.use('util.sound'); this.sound = new util.sound();
16 util.network.prototype = {
20 'NETWORK_FAILURE' : null,
22 'simple_request' : function(method_id,params,f,override_params) {
24 //var sparams = js2JSON(params);
25 //obj.error.sdump('D_SES','simple_request '+ method_id +' '+obj.error.pretty_print(sparams.slice(1,sparams.length-1))+
26 // '\noverride_params = ' + override_params + '\n');
27 if (typeof api[method_id] == 'undefined') {
28 throw( offlineStrings.getFormattedString('network.method_not_found.error', [method_id]) );
30 var secure = true; if (typeof api[method_id].secure != 'undefined') secure = api[method_id].secure;
31 return this.request(api[method_id].app,api[method_id].method,params,f,override_params,{ 'secure' : secure, 'method_id' : method_id });
34 'get_result' : function (req) {
38 result = req.getResultObject();
41 if (instanceOf(E, NetworkFailure)) {
42 obj.NETWORK_FAILURE = E;
44 try { obj.NETWORK_FAILURE = js2JSON(E); } catch(F) { dump(F + '\n'); obj.NETWORK_FAILURE = E; };
47 obj.NETWORK_FAILURE = offlineStrings.getString('network.unknown_status');
54 'request' : function (app,name,params,f,override_params,_params) {
58 //var sparams = js2JSON(params);
59 //obj.error.sdump('D_SES','request '+ app + ' ' + name +' '+obj.error.pretty_print(sparams.slice(1,sparams.length-1))+
60 // '\noverride_params = ' + override_params + '\n_params = ' + _params + '\n');
64 var request = this._request(app,name,params,f,override_params,_params);
66 return this.get_result(request);
76 '_request' : function (app,name,params,f,override_params,_params) {
79 var sparams = js2JSON(params);
80 obj.error.sdump('D_SES','_request '+app+' '+name+' '+obj.error.pretty_print(sparams.slice(1,sparams.length-1))+
81 '\noverride_params = ' + override_params + '\n_params = ' + _params +
82 '\nResult #' + (++obj.link_id) + ( f ? ' asynced' : ' synced' ) );
84 var request = new RemoteRequest( app, name );
85 if (_params && _params.secure) {
86 request.setSecure(true);
88 request.setSecure(false);
90 for(var index in params) {
91 request.addParam(params[index]);
95 request.setCompleteCallback(
98 var json_string = js2JSON(obj.get_result(req));
99 obj.error.sdump('D_SES_RESULT','asynced result #'
100 + obj.link_id + '\n\n'
101 + (json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string)
102 + '\n\nOriginal Request:\n\n'
103 + 'request '+app+' '+name+' '+ sparams.slice(1,sparams.length-1));
104 req = obj.rerequest_on_session_timeout(app,name,params,req,override_params,_params);
105 req = obj.rerequest_on_perm_failure(app,name,params,req,override_params,_params);
106 if (override_params) {
107 req = obj.rerequest_on_override(app,name,params,req,override_params,_params);
109 req = obj.check_for_offline(app,name,params,req,override_params,_params);
111 obj.NETWORK_FAILURE = null;
115 E.textcode = offlineStrings.getString('network.server_or_method.error');
117 f( { 'getResultObject' : function() { return E; } } );
133 var result = obj.get_result(request);
134 var json_string = js2JSON(result);
135 this.error.sdump('D_SES_RESULT','synced result #'
136 + obj.link_id + '\n\n' + ( json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string )
137 + '\n\nOriginal Request:\n\n'
138 + 'request '+app+' '+name+' '+ sparams.slice(1,sparams.length-1));
139 request = obj.rerequest_on_session_timeout(app,name,params,request,override_params,_params);
140 request = obj.rerequest_on_perm_failure(app,name,params,request,override_params,_params);
141 if (override_params) {
142 request = obj.rerequest_on_override(app,name,params,request,override_params,_params);
144 request = obj.check_for_offline(app,name,params,request,override_params,_params);
145 obj.NETWORK_FAILURE = null;
151 if (instanceOf(E,perm_ex)) {
152 alert('in util.network, _request : permission exception: ' + js2JSON(E));
158 'check_for_offline' : function (app,name,params,req,override_params,_params) {
160 var result = obj.get_result(req);
161 if (result != null) return req;
163 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
172 if (data.proceed_offline) {
178 var network_failure_string;
179 var network_failure_status_string;
182 try { network_failure_string = String( obj.NETWORK_FAILURE ); } catch(E) { network_failure_string = E; }
183 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); }
185 try { msg = offlineStrings.getFormattedString('network.server.failure.exception', [data.server_unadorned]) + '\n' +
186 offlineStrings.getFormattedString('network.server.method', [name]) + '\n' +
187 offlineStrings.getFormattedString('network.server.params', [js2JSON(params)]) + '\n' +
188 offlineStrings.getString('network.server.thrown_label') + '\n' + network_failure_string + '\n' +
189 offlineStrings.getString('network.server.status_label') + '\n' + network_failure_status_string;
190 } catch(E) { msg = E; }
192 try { obj.error.sdump('D_SES_ERROR',msg); } catch(E) { alert(E); }
194 r = obj.error.yns_alert(
196 offlineStrings.getString('network.network_failure'),
197 offlineStrings.getString('network.retry_network'),
198 offlineStrings.getString('network.ignore_errors'),
200 offlineStrings.getString('common.confirm')
203 data.proceed_offline = true; data.stash('proceed_offline');
204 dump('Remembering proceed_offline for 200000 ms.\n');
207 data.proceed_offline = false; data.stash('proceed_offline');
208 dump('Setting proceed_offline back to false.\n');
214 dump( r == 0 ? 'Retry Network\n' : 'Ignore Errors\n' );
218 req = obj._request(app,name,params,null,override_params,_params);
219 if (obj.get_result(req)) proceed = true; /* daily WTF, why am I even doing this? :) */
224 return { 'getResultObject' : function() { return { 'ilsevent' : -1, 'textcode' : offlineStrings.getString('network.server_or_method.error') }; } };
230 'reset_titlebars' : function(data) {
232 data.stash_retrieve();
234 JSAN.use('util.window'); var win = new util.window();
235 var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService();
236 var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
237 var enumerator = windowManagerInterface.getEnumerator(null);
239 var w; // set title on all appshell windows
240 while ( w = enumerator.getNext() ) {
241 if (w.document.title.match(/^\d/)) {
243 win.appshell_name_increment()
244 + ': ' + data.list.au[0].usrname()
245 + '@' + data.ws_name;
246 + '.' + data.server_unadorned
250 obj.error.standard_unexpected_error_alert(offlineStrings.getString('network.window_title.error'),E);
254 'get_new_session' : function(name,xulG,text) {
258 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
259 var url = urls.XUL_AUTH_SIMPLE;
260 if (typeof xulG != 'undefined' && typeof xulG.url_prefix == 'function') url = xulG.url_prefix( url );
261 JSAN.use('util.window'); var win = new util.window();
262 var my_xulG = win.open(
264 //+ '?login_type=staff'
265 //+ '&desc_brief=' + window.escape( text ? 'Session Expired' : 'Operator Change' )
266 //+ '&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.'),
267 //'simple_auth' + (new Date()).toString(),
268 offlineStrings.getString('network.new_session.authorize'),
269 'chrome,resizable,modal,width=700,height=500',
271 'login_type' : 'staff',
272 'desc_brief' : text ? offlineStrings.getString('network.new_session.expired') : offlineStrings.getString('network.new_session.operator_change'),
273 'desc_full' : text ? offlineStrings.getString('network.new_session.expired.prompt') : offlineStrings.getString('network.new_session.operator_change.prompt')
274 //'simple_auth' : (new Date()).toString(),
277 JSAN.use('OpenILS.data');
278 var data = new OpenILS.data(); data.init({'via':'stash'});
279 if (typeof data.temporary_session != 'undefined' && data.temporary_session != '') {
280 data.session.key = data.temporary_session.key;
281 data.session.authtime = data.temporary_session.authtime;
282 data.stash('session');
284 var ios = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
285 var cookieUri = ios.newURI("http://" + data.server_unadorned, null, null);
286 var cookieUriSSL = ios.newURI("https://" + data.server_unadorned, null, null);
287 var cookieSvc = Components.classes["@mozilla.org/cookieService;1"].getService(Components.interfaces.nsICookieService);
289 cookieSvc.setCookieString(cookieUri, null, "ses="+data.session.key, null);
290 cookieSvc.setCookieString(cookieUriSSL, null, "ses="+data.session.key, null);
293 alert(offineStrings.getFormattedString('main.session_cookie.error', [E]));
295 if (! data.list.au ) data.list.au = [];
296 data.list.au[0] = JSON2js( data.temporary_session.usr );
298 obj.reset_titlebars(data);
301 obj.error.sdump('D_TRACE','No new session key after simple_auth in util/network\n');
306 obj.error.standard_unexpected_error_alert('util.network.get_new_session',E);
310 'rerequest_on_session_timeout' : function(app,name,params,req,override_params,_params) {
313 var robj = obj.get_result(req);
314 if (robj != null && robj.ilsevent && robj.ilsevent == 1001) {
316 if (obj.get_new_session(name,undefined,true)) {
317 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
318 params[0] = data.session.key;
319 req = obj._request(app,name,params,null,override_params,_params);
323 this.error.standard_unexpected_error_alert('rerequest_on_session_timeout',E);
328 'rerequest_on_perm_failure' : function(app,name,params,req,override_params,_params) {
331 var robj = obj.get_result(req);
332 if (robj != null && robj.ilsevent && robj.ilsevent == 5000) {
333 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
334 if (location.href.match(/^chrome/)) {
335 //alert('Permission denied.');
337 JSAN.use('util.window'); var win = new util.window();
338 var my_xulG = win.open(
339 urls.XUL_AUTH_SIMPLE,
340 //+ '?login_type=temp'
341 //+ '&desc_brief=' + window.escape('Permission Denied: ' + robj.ilsperm)
342 //+ '&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),
343 //'simple_auth' + (new Date()).toString(),
344 offlineStrings.getFormattedString('network.permission.authorize'),
345 'chrome,resizable,modal,width=700,height=500',
347 'login_type' : 'temp',
348 'desc_brief' : offlineStrings.getFormattedString('network.permission.description.brief', [robj.ilsperm]),
349 'desc_full' : offlineStrings.getFormattedString('network.permission.description.full', [name])
350 //'simple_auth' : (new Date()).toString(),
353 JSAN.use('OpenILS.data');
354 //var data = new OpenILS.data(); data.init({'via':'stash'});
355 if (typeof my_xulG.temporary_session != 'undefined' && my_xulG.temporary_session != '') {
356 params[0] = my_xulG.temporary_session.key;
357 req = obj._request(app,name,params,null,override_params,_params);
362 this.error.sdump('D_ERROR',E);
367 'rerequest_on_override' : function (app,name,params,req,override_params,_params) {
370 if (!override_params.text) override_params.text = {};
371 function override(r) {
373 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
375 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">' +
376 '<groupbox><caption label="' + offlineStrings.getString('network.override.exceptions') + '"/>' +
377 '<grid><columns><column/><column/></columns><rows>';
378 for (var i = 0; i < r.length; i++) {
379 var t1 = String(r[i].ilsevent).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
380 var t2 = String(r[i].textcode).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
381 var t3 = String((override_params.text[r[i].ilsevent] ? override_params.text[r[i].ilsevent](r[i]) : '')).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
382 var t4 = String(r[i].desc).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
384 '<description style="color: red" tooltiptext="' + t1 + '">' + t2 + '</description>' +
385 '<description>' + t3 + '</description>' +
386 '</row><row>' + '<description>' + t4 + '</description>' + '</row>';
388 xml += '</rows></grid></groupbox><groupbox><caption label="' + offlineStrings.getString('network.override.override') +'"/><hbox>' +
389 '<description>' + offlineStrings.getString('network.override.force.prompt') + '</description>' +
390 '<button accesskey="' + offlineStrings.getString('common.no.accesskey') + '" label="' + offlineStrings.getString('common.no') + '" name="fancy_cancel"/>' +
391 '<button id="override" accesskey="' + offlineStrings.getString('common.yes.accesskey') + '" label="' + offlineStrings.getString('common.yes') + '" name="fancy_submit" value="override"/></hbox></groupbox></vbox>';
392 //JSAN.use('OpenILS.data');
393 //var data = new OpenILS.data(); data.init({'via':'stash'});
394 //data.temp_override_xml = xml; data.stash('temp_override_xml');
395 JSAN.use('util.window'); var win = new util.window();
396 var fancy_prompt_data = win.open(
397 urls.XUL_FANCY_PROMPT,
398 //+ '?xml_in_stash=temp_override_xml'
399 //+ '&title=' + window.escape(override_params.title),
400 'fancy_prompt', 'chrome,resizable,modal,width=700,height=500',
401 { 'xml' : xml, 'title' : override_params.title }
403 if (fancy_prompt_data.fancy_status == 'complete') {
404 req = obj._request(app,name + '.override',params);
408 alert('in util.network, rerequest_on_override, override:' + E);
412 var result = obj.get_result(req);
413 if (!result) return req;
415 if ( (typeof result.ilsevent != 'undefined') && (override_params.overridable_events.indexOf( result.ilsevent == null ? null : Number(result.ilsevent) ) != -1) ) {
416 req = override([result]);
418 var found_good = false; var found_bad = false;
419 for (var i = 0; i < result.length; i++) {
420 if ( (result[i].ilsevent != 'undefined') && (override_params.overridable_events.indexOf( result.ilsevent == null ? null : Number(result[i].ilsevent) ) != -1) ) {
426 if (found_good && (!found_bad)) req = override(result);
437 function sample_callback(request) {
438 var result = request.getResultObject();
442 dump('exiting util/network.js\n');