]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/chrome/content/auth/controller.js
test SSL cert before login (this will catch the folks who Cancel such dialogs), and...
[Evergreen.git] / Open-ILS / xul / staff_client / chrome / content / auth / controller.js
1 dump('entering auth/controller.js\n');
2 // vim:sw=4:ts=4:noet:
3
4 if (typeof auth == 'undefined') auth = {};
5 auth.controller = function (params) {
6         JSAN.use('util.error'); this.error = new util.error();
7         this.w = params.window;
8
9         return this;
10 };
11
12 auth.controller.prototype = {
13
14         'init' : function () {
15
16                 var obj = this;  // so the 'this' in event handlers don't confuse us
17                 var w = obj.w;
18
19                 JSAN.use('OpenILS.data');
20                 obj.data = new OpenILS.data(); obj.data.init({'via':'stash'});
21
22                 // MVC
23                 JSAN.use('util.controller'); obj.controller = new util.controller();
24                 obj.controller.init(
25                         {
26                                 'control_map' : {
27                                         'cmd_login' : [
28                                                 ['command'],
29                                                 function() {
30                                                         obj.login();
31                                                 }
32                                         ],
33                                         'cmd_standalone' : [
34                                                 ['command'],
35                                                 function() {
36                                                         obj.standalone();
37                                                 }
38                                         ],
39                                         'cmd_standalone_import' : [
40                                                 ['command'],
41                                                 function() {
42                                                         obj.standalone_import();
43                                                 }
44                                         ],
45                                         'cmd_standalone_export' : [
46                                                 ['command'],
47                                                 function() {
48                                                         obj.standalone_export();
49                                                 }
50                                         ],
51                                         'cmd_clear_cache' : [
52                                                 ['command'],
53                                                 function() {
54                                                         obj.debug('clear_cache');
55                                                 }
56                                         ],
57                                         'cmd_js_console' : [
58                                                 ['command'],
59                                                 function() {
60                                                         obj.debug('js_console');
61                                                 }
62                                         ],
63                                         'cmd_override' : [
64                                                 ['command'],
65                                                 function() {
66                                                         obj.override();
67                                                 }
68                                         ],
69                                         'cmd_logoff' : [
70                                                 ['command'],
71                                                 function() {
72                                                         obj.logoff()
73                                                 }
74                                         ],
75                                         'cmd_close_window' : [
76                                                 ['command'],
77                                                 function() {
78                                                         obj.close()
79                                                 }
80                                         ],
81                                         'cmd_test_server' : [
82                                                 ['command'],
83                                                 function() {
84                                                         obj.test_server( obj.controller.view.server_prompt.value );
85                                                 }
86                                         ],
87                     'ssl_exception' : [
88                         ['render'],
89                         function(e) {
90                             return function() {
91                                 try {
92                                     obj.controller.view.cmd_ssl_exception.setAttribute('hidden','true');
93                                     var x = new XMLHttpRequest();
94                                     x.open("GET",'chrome://pippki/content/exceptionDialog.xul',false);
95                                     x.send(null);
96                                     obj.controller.view.cmd_ssl_exception.setAttribute('hidden','false');
97                                 } catch(E) {
98                                     obj.controller.view.cmd_ssl_exception.setAttribute('hidden','true');
99                                 }
100                             };
101                         }
102                     ],
103                     'cmd_ssl_exception' : [
104                         ['command'],
105                         function() {
106                             window.openDialog(
107                                 'chrome://pippki/content/exceptionDialog.xul',
108                                 '', 
109                                 'chrome,centerscreen,modal', 
110                                 { 
111                                     'location' : 'https://' + obj.controller.view.server_prompt.value, 
112                                     'prefetchCert' : true 
113                                 } 
114                             );
115                                     obj.test_server( obj.controller.view.server_prompt.value );
116                         }
117                     ],
118                                         'server_prompt' : [
119                                                 ['keypress'],
120                                                 handle_keypress
121                                         ],
122                                         'name_prompt' : [
123                                                 ['keypress'],
124                                                 handle_keypress
125                                         ],
126                                         'password_prompt' : [
127                                                 ['keypress'],
128                                                 handle_keypress
129                                         ],
130                                         'submit_button' : [
131                                                 ['render'],
132                                                 function(e) { return function() {} }
133                                         ],
134                                         'progress_bar' : [
135                                                 ['render'],
136                                                 function(e) { return function() {} }
137                                         ],
138                                         'status' : [
139                                                 ['render'],
140                                                 function(e) { return function() {
141                                                 } }
142                                         ],
143                                         'ws_deck' : [
144                                                 ['render'],
145                                                 function(e) { return function() {
146                                                         try {
147                                                                 JSAN.use('util.widgets'); util.widgets.remove_children(e);
148                                                                 var x = document.createElement('description');
149                                                                 e.appendChild(x);
150                                                                 if (obj.data.ws_info 
151                                                                         && obj.data.ws_info[ obj.controller.view.server_prompt.value ]) {
152                                                                         var ws = obj.data.ws_info[ obj.controller.view.server_prompt.value ];
153                                                                         x.appendChild(
154                                                                                 document.createTextNode(
155                                                                                         ws.name /*+ ' @  ' + ws.lib_shortname*/
156                                                                                 )
157                                                                         );
158                                                                         netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
159                                                                         JSAN.use('util.file'); var file = new util.file('last_ws_server');
160                                                                         file.set_object(obj.controller.view.server_prompt.value);
161                                                                         file.close();
162                                                                 } else {
163                                                                         x.appendChild(
164                                                                                 document.createTextNode(
165                                                                                         document.getElementById('authStrings').getString('staff.auth.controller.not_configured')
166                                                                                 )
167                                                                         );
168                                                                 }
169                                                         } catch(E) {
170                                                                 alert(E);
171                                                         }
172                                                 } }
173                                         ],
174                                         'menu_spot' : [
175                                                 ['render'],
176                                                 function(e) { return function() {
177                                                 } }
178                                         ],
179
180                                 }
181                         }
182                 );
183                 obj.controller.view.name_prompt.focus();
184
185                 function handle_keypress(ev) {
186                         try {
187                                 if (ev.keyCode && ev.keyCode == 13) {
188                                         switch(this) {
189                                                 case obj.controller.view.server_prompt:
190                                                         ev.preventDefault();
191                                                         obj.controller.view.name_prompt.focus(); obj.controller.view.name_prompt.select();
192                                                 break;
193                                                 case obj.controller.view.name_prompt:
194                                                         ev.preventDefault();
195                                                         obj.controller.view.password_prompt.focus(); obj.controller.view.password_prompt.select();
196                                                 break;
197                                                 case obj.controller.view.password_prompt:
198                                                         ev.preventDefault();
199                                                         obj.controller.view.submit_button.focus(); 
200                                                         obj.login();
201                                                 break;
202                                                 default: break;
203                                         }
204                                 }
205                         } catch(E) {
206                                 alert(E);
207                         }
208                 }
209
210                 obj.controller.view.server_prompt.addEventListener(
211                         'change',
212                         function (ev) { 
213                                 obj.test_server(ev.target.value);
214                                 obj.controller.render('ws_deck'); 
215                         },
216                         false
217                 );
218
219                 // This talks to our ILS
220                 JSAN.use('auth.session');
221                 obj.session = new auth.session(obj.controller.view);
222
223                 obj.controller.render();
224                 obj.test_server( obj.controller.view.server_prompt.value );
225                 obj.controller.render('ws_deck'); 
226
227                 if (typeof this.on_init == 'function') {
228                         this.error.sdump('D_AUTH','auth.controller.on_init()\n');
229                         this.on_init();
230                 }
231         },
232
233         'test_server' : function(url) {
234                 var obj = this;
235                 if (!url) {
236                         netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
237                         JSAN.use('util.file'); var file = new util.file('last_ws_server');
238                         if (file._file.exists()) {
239                                 url = file.get_object(); file.close();
240                                 obj.controller.view.server_prompt.value = url;
241                         }
242                 }
243                 obj.controller.view.submit_button.disabled = true;
244                 obj.controller.view.server_prompt.disabled = true;
245                 var s = document.getElementById('status');
246                 s.setAttribute('value', document.getElementById('authStrings').getString('staff.auth.controller.testing_hostname'));
247                 s.setAttribute('style','color: orange;');
248                 document.getElementById('version').value = '';
249                 if (!url) {
250                         s.setAttribute('value', document.getElementById('authStrings').getString('staff.auth.controller.prompt_hostname'));
251                         s.setAttribute('style','color: red;');
252                         obj.controller.view.server_prompt.disabled = false;
253                         obj.controller.view.server_prompt.focus();
254                         return;
255                 }
256                 try {
257                         if ( ! url.match(/^http:\/\//) ) url = 'http://' + url;
258                         var x = new XMLHttpRequest();
259                         dump('server url = ' + url + '\n');
260                         x.open("GET",url,true);
261                         x.onreadystatechange = function() {
262                                 try {
263                                         if (x.readyState != 4) return;
264                                         s.setAttribute('value', document.getElementById('authStrings').getFormattedString('staff.auth.controller.status', [x.status, x.statusText]));
265                                         if (x.status == 200) {
266                                                 s.setAttribute('style','color: green;');
267                                         } else {
268                                                 s.setAttribute('style','color: red;');
269                                         }
270                                         obj.test_version(url);
271                                 } catch(E) {
272                                         obj.controller.view.server_prompt.disabled = false;
273                                         obj.controller.view.server_prompt.focus();
274                                         s.setAttribute('value', document.getElementById('authStrings').getString('staff.auth.controller.error_hostname'));
275                                         s.setAttribute('style','color: red;');
276                                         obj.error.sdump('D_ERROR',E);
277                                 }
278                         }
279                         x.send(null);
280                 } catch(E) {
281                         s.setAttribute('value', document.getElementById('authStrings').getString('staff.auth.controller.error_hostname'));
282                         s.setAttribute('style','color: brown;');
283                         obj.error.sdump('D_ERROR',E);
284                         obj.controller.view.server_prompt.disabled = false;
285                         obj.controller.view.server_prompt.focus();
286                 }
287         },
288
289         'test_version' : function(url) {
290                 var obj = this;
291                 var s = document.getElementById('version');
292                 s.setAttribute('value', document.getElementById('authStrings').getString('staff.auth.controller.testing_version'));
293                 s.setAttribute('style','color: orange;');
294                 try {
295                         var x = new XMLHttpRequest();
296                         var url2 = url + '/xul/server/';
297                         dump('version url = ' + url2 + '\n');
298                         x.open("GET",url2,true);
299                         x.onreadystatechange = function() {
300                                 try {
301                                         if (x.readyState != 4) return;
302                                         s.setAttribute('value', document.getElementById('authStrings').getFormattedString('staff.auth.controller.status', [x.status, x.statusText]));
303                                         if (x.status == 200) {
304                                                 s.setAttribute('style','color: green;');
305                                                 obj.controller.view.submit_button.disabled = false;
306                                         } else {
307                                                 s.setAttribute('style','color: red;');
308                                                 obj.test_upgrade_instructions(url);
309                                         }
310                                         obj.controller.view.server_prompt.disabled = false;
311                                 } catch(E) {
312                                         s.setAttribute('value', document.getElementById('authStrings').getString('staff.auth.controller.error_version'));
313                                         s.setAttribute('style','color: red;');
314                                         obj.error.sdump('D_ERROR',E);
315                                         obj.controller.view.server_prompt.disabled = false;
316                                 }
317                         }
318                         x.send(null);
319                 } catch(E) {
320                         s.setAttribute('value', document.getElementById('authStrings').getString('staff.auth.controller.error_version'));
321                         s.setAttribute('style','color: brown;');
322                         obj.error.sdump('D_ERROR',E);
323                         obj.controller.view.server_prompt.disabled = false;
324                 }
325         },
326
327         'test_upgrade_instructions' : function(url) {
328                 var obj = this;
329                 try {
330                         var x = new XMLHttpRequest();
331                         var url2 = url + '/xul/versions.html';
332                         dump('upgrade url = ' + url2 + '\n');
333                         x.open("GET",url2,true);
334                         x.onreadystatechange = function() {
335                                 try {
336                                         if (x.readyState != 4) return;
337                                         if (x.status == 200) {
338                                                 window.open('data:text/html,'+window.escape(x.responseText),'upgrade','chrome,resizable,modal,centered');
339                                         } else {
340                                                 alert(document.getElementById('authStrings').getString('staff.auth.controller.version_mismatch'));
341                                         }
342                                         obj.controller.view.server_prompt.disabled = false;
343                                 } catch(E) {
344                                         obj.error.sdump('D_ERROR',E);
345                                         obj.controller.view.server_prompt.disabled = false;
346                                 }
347                         }
348                         x.send(null);
349                 } catch(E) {
350                         obj.error.sdump('D_ERROR',E);
351                         obj.controller.view.server_prompt.disabled = false;
352                 }
353         },
354
355         'login' : function() { 
356
357                 var obj = this;
358
359                 this.error.sdump('D_AUTH',
360                         document.getElementById('authStrings').getFormattedString(
361                                 'staff.auth.controller.error_login', [
362                                         this.controller.view.name_prompt.value,
363                                         this.controller.view.password_prompt.value,
364                                         this.controller.view.server_prompt.value
365                                 ]
366                         )
367                 ); 
368                 this.controller.view.server_prompt.disabled = true;
369                 this.controller.view.name_prompt.disabled = true;
370                 this.controller.view.password_prompt.disabled = true;
371                 this.controller.view.submit_button.disabled = true;
372                 XML_HTTP_SERVER = this.controller.view.server_prompt.value;
373
374                 try {
375
376                         if (typeof this.on_login == 'function') {
377                                 this.error.sdump('D_AUTH','auth.controller.session.on_init = ' +
378                                         'auth.controller.on_login\n');
379                                 this.session.on_init = this.on_login;
380                                 this.session.on_error = function() { obj.logoff(); };
381                         }
382                         
383                         this.session.init();
384
385                 } catch(E) {
386                         var error = '!! ' + E + '\n';
387                         this.error.sdump('D_ERROR',error); 
388                         alert(error);
389                         this.logoff();
390                         if (E == 'open-ils.auth.authenticate.init returned false\n') {
391                                 this.controller.view.server_prompt.focus();
392                                 this.controller.view.server_prompt.select();
393                         }
394
395                         if (typeof this.on_login_error == 'function') {
396                                 this.error.sdump('D_AUTH','auth.controller.on_login_error()\n');
397                                 this.on_login_error(E);
398                         }
399                 }
400
401         },
402
403         'standalone' : function() {
404                 var obj = this;
405                 try {
406                         if (typeof this.on_standalone == 'function') {
407                                 obj.on_standalone();
408                         }
409                 } catch(E) {
410                         var error = '!! ' + E + '\n';
411                         obj.error.sdump('D_ERROR',error); 
412                         alert(error);
413                 }
414         },
415
416         'standalone_import' : function() {
417                 var obj = this;
418                 try {
419                         if (typeof this.on_standalone_import == 'function') {
420                                 obj.on_standalone_import();
421                         }
422                 } catch(E) {
423                         var error = '!! ' + E + '\n';
424                         obj.error.sdump('D_ERROR',error); 
425                         alert(error);
426                 }
427         },
428
429         'standalone_export' : function() {
430                 var obj = this;
431                 try {
432                         if (typeof this.on_standalone_export == 'function') {
433                                 obj.on_standalone_export();
434                         }
435                 } catch(E) {
436                         var error = '!! ' + E + '\n';
437                         obj.error.sdump('D_ERROR',error); 
438                         alert(error);
439                 }
440         },
441
442         'debug' : function(action) {
443                 var obj = this;
444                 try {
445                         if (typeof this.on_debug == 'function') {
446                                 obj.on_debug(action);
447                         }
448                 } catch(E) {
449                         var error = '!! ' + E + '\n';
450                         obj.error.sdump('D_ERROR',error);
451                         alert(error);
452                 }
453         },
454
455         'logoff' : function() { 
456         
457                 this.error.sdump('D_AUTH','logoff' + this.w + '\n'); 
458                 this.controller.view.progress_bar.value = 0; 
459                 this.controller.view.progress_bar.setAttribute('real','0.0');
460                 this.controller.view.submit_button.disabled = false;
461                 this.controller.view.password_prompt.disabled = false;
462                 this.controller.view.password_prompt.value = '';
463                 this.controller.view.name_prompt.disabled = false;
464                 this.controller.view.name_prompt.focus(); 
465                 this.controller.view.name_prompt.select();
466                 this.controller.view.server_prompt.disabled = false;
467
468                 var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService();
469                 var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
470                 var enumerator = windowManagerInterface.getEnumerator(null);
471
472                 var w; // close all other windows
473                 while ( w = enumerator.getNext() ) {
474                         if (w != window) w.close();
475                 }
476
477                 this.controller.render('ws_deck');
478
479                 this.session.close();
480
481                 /* FIXME - need some locking or object destruction for the async tests */
482                 /* this.test_server( this.controller.view.server_prompt.value ); */
483
484                 if (typeof this.on_logoff == 'function') {
485                         this.error.sdump('D_AUTH','auth.controller.on_logoff()\n');
486                         this.on_logoff();
487                 }
488                 
489         },
490         'close' : function() { 
491         
492                 this.error.sdump('D_AUTH','close' + this.w + '\n');
493
494                 if (window.confirm(document.getElementById('authStrings').getString('staff.auth.controller.confirm_close'))) {
495                         this.logoff();
496                         this.w.close(); /* Probably won't go any further */
497
498                         if (typeof this.on_close == 'function') {
499                                 this.error.sdump('D_AUTH','auth.controller.on_close()\n');
500                                 this.on_close();
501                         }
502                 }
503                 
504         }
505 }
506
507 dump('exiting auth/controller.js\n');