Subversion Repositories Applications.reseau

Rev

Rev 95 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 95 Rev 96
1
// configuration
1
// configuration
2
var urlRacine = 'https://www.tela-botanica.org',
2
var urlRacine = 'https://www.tela-botanica.org',
3
	config = {
3
	config = {
4
		prod: {
4
		prod: {
5
			urlWidgetNavigation : urlRacine + '/widget:reseau:navigation',
5
			urlWidgetNavigation : urlRacine + '/widget:reseau:navigation',
6
			urlBaseAuth : 'https://www.tela-botanica.org/service:annuaire:auth'
6
			urlBaseAuth : 'https://www.tela-botanica.org/service:annuaire:auth'
7
		},
7
		},
8
		test: {
8
		test: {
9
			urlWidgetNavigation : urlRacine + '/widget-test:reseau:navigation',
9
			urlWidgetNavigation : urlRacine + '/widget-test:reseau:navigation',
10
			urlBaseAuth : 'https://www.tela-botanica.org/service:annuaire-test:auth'
10
			urlBaseAuth : 'https://www.tela-botanica.org/service:annuaire-test:auth'
11
		},
11
		},
12
		local: {
12
		local: {
13
			urlWidgetNavigation : 'http://localhost/widget:reseau:navigation',
13
			urlWidgetNavigation : 'https://localhost/widget:reseau:navigation',
14
			urlBaseAuth : 'https://localhost/service:annuaire:auth'
14
			urlBaseAuth : 'https://localhost/service:annuaire:auth'
15
		}
15
		}
16
	}
16
	}
17
 
17
 
18
/**
18
/**
19
 * Charge la barre de navigation depuis le widget:reseau:navigation dans un <div id="tb-navigation"> , s'il existe
19
 * Charge la barre de navigation depuis le widget:reseau:navigation dans un <div id="tb-navigation"> , s'il existe
20
 * dans la page appelante.
20
 * dans la page appelante.
21
 * 
21
 * 
22
 * Nécessite jQuery
22
 * Nécessite jQuery
23
 * 
23
 * 
24
 * Utilisation :
24
 * Utilisation :
25
 *	- prévoir un <div id="tb-navigation"> dans la page, qui accueillera la barre de navigation.
25
 *	- prévoir un <div id="tb-navigation"> dans la page, qui accueillera la barre de navigation.
26
 *	- si ce <div> contient déjà quelque chose, son contenu sera reporté à la place de la zone ayant l'id "contenu-source"
26
 *	- si ce <div> contient déjà quelque chose, son contenu sera reporté à la place de la zone ayant l'id "contenu-source"
27
 *	  de la barre de navigation (si une telle zone existe)
27
 *	  de la barre de navigation (si une telle zone existe)
28
 *  - si ce <div> contient un attribut "data-courant" et si la valeur de cet attribut correspond à l'id d'un des éléments
28
 *  - si ce <div> contient un attribut "data-courant" et si la valeur de cet attribut correspond à l'id d'un des éléments
29
 *    de navigation, alors cet élément aura la classe "active" (pour localiser la page courante dans les menus)
29
 *    de navigation, alors cet élément aura la classe "active" (pour localiser la page courante dans les menus)
30
 *  - si ce <div> contient un attribut "data-squelette", alors le widget de navigation sera appelé avec le paramètre
30
 *  - si ce <div> contient un attribut "data-squelette", alors le widget de navigation sera appelé avec le paramètre
31
 *    "?squelette=contenu-de-data-squelette"; se reporter à la documentation du widget:reseau:navigation
31
 *    "?squelette=contenu-de-data-squelette"; se reporter à la documentation du widget:reseau:navigation
32
 */
32
 */
33
 
33
 
34
$(document).ready(function() {
34
$(document).ready(function() {
35
	var div = $('#tb-navigation');
35
	var div = $('#tb-navigation');
36
	if (div) {
36
	if (div) {
37
		var squelette = div.data('squelette'),
37
		var squelette = div.data('squelette'),
38
			courant = div.data('courant'),
38
			courant = div.data('courant'),
39
			mode = div.data('mode') || 'prod',
39
			mode = div.data('mode') || 'prod',
40
			contenu = div.html();
40
			contenu = div.html();
41
 
41
 
42
		// chargement de la barre
42
		// chargement de la barre
43
		var urlBarreNavigation = config[mode]['urlWidgetNavigation'];
43
		var urlBarreNavigation = config[mode]['urlWidgetNavigation'];
44
		if (squelette) {
44
		if (squelette) {
45
			urlBarreNavigation += '?squelette=' + squelette;
45
			urlBarreNavigation += '?squelette=' + squelette;
46
		}
46
		}
47
		htmlBarre = $.ajax({
47
		htmlBarre = $.ajax({
48
			url: urlBarreNavigation,
48
			url: urlBarreNavigation,
49
			type: 'get',
49
			type: 'get',
50
			success: function(data) {
50
			success: function(data) {
51
				div.html(data);
51
				div.html(data);
52
				// activation de l'entrée de menu
52
				// activation de l'entrée de menu
53
				if (courant) {
53
				if (courant) {
54
					var menuCourant = div.find('#' + courant);
54
					var menuCourant = div.find('#' + courant);
55
					if (menuCourant) {
55
					if (menuCourant) {
56
						menuCourant.addClass('active');
56
						menuCourant.addClass('active');
57
					}
57
					}
58
				}
58
				}
59
				// ajout de l'URL de la page d'origine dans les liens
59
				// ajout de l'URL de la page d'origine dans les liens
60
				definirPageOrigineDansLiens();
60
				definirPageOrigineDansLiens();
61
				// remplacement de la zone contenu-source
61
				// remplacement de la zone contenu-source
62
				var zoneSource = div.find('#contenu-source');
62
				var zoneSource = div.find('#contenu-source');
63
				if (zoneSource) {
63
				if (zoneSource) {
64
					zoneSource.replaceWith(contenu);
64
					zoneSource.replaceWith(contenu);
65
					// Chargement de sinformations de connexion SSO
65
					// Chargement de sinformations de connexion SSO
66
					var urlBaseAuth = config[mode]['urlBaseAuth'];
66
					var urlBaseAuth = config[mode]['urlBaseAuth'];
67
					chargerStatutSSO(urlBaseAuth);
67
					chargerStatutSSO(urlBaseAuth);
68
				}
68
				}
69
			},
69
			},
70
			error: function() {
70
			error: function() {
71
				div.html('Erreur: impossible de charger la barre de navigation');
71
				div.html('Erreur: impossible de charger la barre de navigation');
72
			}
72
			}
73
		});
73
		});
74
	}
74
	}
75
});
75
});
76
 
76
 
77
/**
77
/**
78
 * Modifie les liens des boutons de connexion / déconnexion SSO pour prendre ne compte
78
 * Modifie les liens des boutons de connexion / déconnexion SSO pour prendre ne compte
79
 * l'adresse exacte de la page d'origine (si on fait ça en PHP, on obtient l'URL du
79
 * l'adresse exacte de la page d'origine (si on fait ça en PHP, on obtient l'URL du
80
 * widget de barre de navigation et pas de la page appelante)
80
 * widget de barre de navigation et pas de la page appelante)
81
 */
81
 */
82
function definirPageOrigineDansLiens() {
82
function definirPageOrigineDansLiens() {
83
	var page = window.location.href;
83
	var page = window.location.href;
84
	$('#bouton-connexion a').attr('href', $('#bouton-connexion a').attr('href') + page);
84
	$('#bouton-connexion a').attr('href', $('#bouton-connexion a').attr('href') + page);
85
    $('#deconnexion a').attr('href', $('#deconnexion a').attr('href') + page);
85
    $('#deconnexion a').attr('href', $('#deconnexion a').attr('href') + page);
86
}
86
}
87
 
87
 
88
/**
88
/**
89
 * Interroge le SSO pour connaître le statut de l'utilisateur, et change le menu
89
 * Interroge le SSO pour connaître le statut de l'utilisateur, et change le menu
90
 * à droite de la barre en fonction
90
 * à droite de la barre en fonction
91
 */
91
 */
92
function chargerStatutSSO(urlBaseAuth) {
92
function chargerStatutSSO(urlBaseAuth) {
93
	var urlAuth = urlBaseAuth + '/identite';
93
	var urlAuth = urlBaseAuth + '/identite';
94
	$.ajax({
94
	$.ajax({
95
	    url: urlAuth,
95
	    url: urlAuth,
96
	    type: "GET",
96
	    type: "GET",
97
	    dataType: 'json',
97
	    dataType: 'json',
98
	    xhrFields: {
98
	    xhrFields: {
99
	         withCredentials: true
99
	         withCredentials: true
100
	    }
100
	    }
101
	}).done(function(data) {
101
	}).done(function(data) {
102
		// connecté
102
		// connecté
103
		definirUtilisateur(data.token);
103
		definirUtilisateur(data.token);
104
	});
104
	});
105
}
105
}
106
 
106
 
107
function definirUtilisateur(jeton) {
107
function definirUtilisateur(jeton) {
108
	var nomComplet = '';
108
	var nomComplet = '';
109
	if (jeton != undefined) {
109
	if (jeton != undefined) {
110
		// décodage jeton
110
		// décodage jeton
111
		var jetonDecode = decoderJeton(jeton);
111
		var jetonDecode = decoderJeton(jeton);
112
		nomComplet = jetonDecode.intitule;
112
		nomComplet = jetonDecode.intitule;
113
	}
113
	}
114
	// affichage
114
	// affichage
115
	$('#bouton-connexion').hide();
115
	$('#bouton-connexion').hide();
116
	$('#utilisateur-connecte').show();
116
	$('#utilisateur-connecte').show();
117
	$('#nom-complet').html(nomComplet);
117
	$('#nom-complet').html(nomComplet);
118
}
118
}
119
 
119
 
120
/**
120
/**
121
 * Décodage à l'arrache d'un jeton JWT, ATTENTION CONSIDERE QUE LE
121
 * Décodage à l'arrache d'un jeton JWT, ATTENTION CONSIDERE QUE LE
122
 * JETON EST VALIDE, ne pas décoder n'importe quoi - pas trouvé de lib simple
122
 * JETON EST VALIDE, ne pas décoder n'importe quoi - pas trouvé de lib simple
123
 * Si pb de cross-browser, tenter ceci : https://code.google.com/p/javascriptbase64/
123
 * Si pb de cross-browser, tenter ceci : https://code.google.com/p/javascriptbase64/
124
 * ou ceci : https://code.google.com/p/crypto-js
124
 * ou ceci : https://code.google.com/p/crypto-js
125
 */
125
 */
126
function decoderJeton(jeton) {
126
function decoderJeton(jeton) {
127
    parts = jeton.split('.');
127
    parts = jeton.split('.');
128
    payload = parts[1];
128
    payload = parts[1];
129
    payload = atob(payload);
129
    payload = atob(payload);
130
    payload = JSON.parse(payload, true);
130
    payload = JSON.parse(payload, true);
131
 
131
 
132
    return payload;
132
    return payload;
133
}
133
}