Subversion Repositories Applications.reseau

Rev

Rev 65 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
24 mathias 1
// configuration
95 mathias 2
var urlRacine = 'https://www.tela-botanica.org',
24 mathias 3
	config = {
4
		prod: {
61 mathias 5
			urlWidgetNavigation : urlRacine + '/widget:reseau:navigation',
63 mathias 6
			urlBaseAuth : 'https://www.tela-botanica.org/service:annuaire:auth'
24 mathias 7
		},
8
		test: {
9
			urlWidgetNavigation : urlRacine + '/widget-test:reseau:navigation',
63 mathias 10
			urlBaseAuth : 'https://www.tela-botanica.org/service:annuaire-test:auth'
24 mathias 11
		},
12
		local: {
61 mathias 13
			urlWidgetNavigation : 'http://localhost/widget:reseau:navigation',
63 mathias 14
			urlBaseAuth : 'https://localhost/service:annuaire:auth'
24 mathias 15
		}
61 mathias 16
	}
24 mathias 17
 
21 mathias 18
/**
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.
21
 *
22
 * Nécessite jQuery
23
 *
24
 * Utilisation :
25
 *	- prévoir un <div id="tb-navigation"> dans la page, qui accueillera la barre de navigation.
23 mathias 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)
21 mathias 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)
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
32
 */
33
 
34
$(document).ready(function() {
35
	var div = $('#tb-navigation');
36
	if (div) {
37
		var squelette = div.data('squelette'),
38
			courant = div.data('courant'),
24 mathias 39
			mode = div.data('mode') || 'prod',
21 mathias 40
			contenu = div.html();
41
 
42
		// chargement de la barre
24 mathias 43
		var urlBarreNavigation = config[mode]['urlWidgetNavigation'];
22 mathias 44
		if (squelette) {
23 mathias 45
			urlBarreNavigation += '?squelette=' + squelette;
21 mathias 46
		}
22 mathias 47
		htmlBarre = $.ajax({
23 mathias 48
			url: urlBarreNavigation,
22 mathias 49
			type: 'get',
50
			success: function(data) {
51
				div.html(data);
52
				// activation de l'entrée de menu
53
				if (courant) {
54
					var menuCourant = div.find('#' + courant);
55
					if (menuCourant) {
56
						menuCourant.addClass('active');
57
					}
58
				}
63 mathias 59
				// ajout de l'URL de la page d'origine dans les liens
60
				definirPageOrigineDansLiens();
22 mathias 61
				// remplacement de la zone contenu-source
23 mathias 62
				var zoneSource = div.find('#contenu-source');
22 mathias 63
				if (zoneSource) {
23 mathias 64
					zoneSource.replaceWith(contenu);
61 mathias 65
					// Chargement de sinformations de connexion SSO
66
					var urlBaseAuth = config[mode]['urlBaseAuth'];
67
					chargerStatutSSO(urlBaseAuth);
22 mathias 68
				}
69
			},
70
			error: function() {
71
				div.html('Erreur: impossible de charger la barre de navigation');
72
			}
73
		});
21 mathias 74
	}
61 mathias 75
});
76
 
77
/**
63 mathias 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
80
 * widget de barre de navigation et pas de la page appelante)
61 mathias 81
 */
63 mathias 82
function definirPageOrigineDansLiens() {
83
	var page = window.location.href;
65 mathias 84
	$('#bouton-connexion a').attr('href', $('#bouton-connexion a').attr('href') + page);
85
    $('#deconnexion a').attr('href', $('#deconnexion a').attr('href') + page);
63 mathias 86
}
87
 
88
/**
89
 * Interroge le SSO pour connaître le statut de l'utilisateur, et change le menu
90
 * à droite de la barre en fonction
91
 */
61 mathias 92
function chargerStatutSSO(urlBaseAuth) {
93
	var urlAuth = urlBaseAuth + '/identite';
94
	$.ajax({
95
	    url: urlAuth,
96
	    type: "GET",
97
	    dataType: 'json',
98
	    xhrFields: {
99
	         withCredentials: true
100
	    }
101
	}).done(function(data) {
102
		// connecté
103
		definirUtilisateur(data.token);
104
	});
105
}
106
 
107
function definirUtilisateur(jeton) {
108
	var nomComplet = '';
109
	if (jeton != undefined) {
110
		// décodage jeton
111
		var jetonDecode = decoderJeton(jeton);
112
		nomComplet = jetonDecode.intitule;
113
	}
114
	// affichage
115
	$('#bouton-connexion').hide();
116
	$('#utilisateur-connecte').show();
117
	$('#nom-complet').html(nomComplet);
118
}
119
 
120
/**
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
123
 * Si pb de cross-browser, tenter ceci : https://code.google.com/p/javascriptbase64/
124
 * ou ceci : https://code.google.com/p/crypto-js
125
 */
126
function decoderJeton(jeton) {
127
    parts = jeton.split('.');
128
    payload = parts[1];
129
    payload = atob(payload);
130
    payload = JSON.parse(payload, true);
131
 
132
    return payload;
133
}