Subversion Repositories Applications.reseau

Rev

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

// configuration
var urlRacine = 'https://www.tela-botanica.org',
        config = {
                prod: {
                        urlWidgetNavigation : urlRacine + '/widget:reseau:navigation',
                        urlBaseAuth : 'https://www.tela-botanica.org/service:annuaire:auth'
                },
                test: {
                        urlWidgetNavigation : urlRacine + '/widget-test:reseau:navigation',
                        urlBaseAuth : 'https://www.tela-botanica.org/service:annuaire-test:auth'
                },
                local: {
                        urlWidgetNavigation : 'http://localhost/widget:reseau:navigation',
                        urlBaseAuth : 'https://localhost/service:annuaire:auth'
                }
        }

/**
 * Charge la barre de navigation depuis le widget:reseau:navigation dans un <div id="tb-navigation"> , s'il existe
 * dans la page appelante.
 * 
 * Nécessite jQuery
 * 
 * Utilisation :
 *      - prévoir un <div id="tb-navigation"> dans la page, qui accueillera la barre de navigation.
 *      - si ce <div> contient déjà quelque chose, son contenu sera reporté à la place de la zone ayant l'id "contenu-source"
 *        de la barre de navigation (si une telle zone existe)
 *  - si ce <div> contient un attribut "data-courant" et si la valeur de cet attribut correspond à l'id d'un des éléments
 *    de navigation, alors cet élément aura la classe "active" (pour localiser la page courante dans les menus)
 *  - si ce <div> contient un attribut "data-squelette", alors le widget de navigation sera appelé avec le paramètre
 *    "?squelette=contenu-de-data-squelette"; se reporter à la documentation du widget:reseau:navigation
 */

$(document).ready(function() {
        var div = $('#tb-navigation');
        if (div) {
                var squelette = div.data('squelette'),
                        courant = div.data('courant'),
                        mode = div.data('mode') || 'prod',
                        contenu = div.html();

                // chargement de la barre
                var urlBarreNavigation = config[mode]['urlWidgetNavigation'];
                if (squelette) {
                        urlBarreNavigation += '?squelette=' + squelette;
                }
                htmlBarre = $.ajax({
                        url: urlBarreNavigation,
                        type: 'get',
                        success: function(data) {
                                div.html(data);
                                // activation de l'entrée de menu
                                if (courant) {
                                        var menuCourant = div.find('#' + courant);
                                        if (menuCourant) {
                                                menuCourant.addClass('active');
                                        }
                                }
                                // ajout de l'URL de la page d'origine dans les liens
                                definirPageOrigineDansLiens();
                                // remplacement de la zone contenu-source
                                var zoneSource = div.find('#contenu-source');
                                if (zoneSource) {
                                        zoneSource.replaceWith(contenu);
                                        // Chargement de sinformations de connexion SSO
                                        var urlBaseAuth = config[mode]['urlBaseAuth'];
                                        chargerStatutSSO(urlBaseAuth);
                                }
                        },
                        error: function() {
                                div.html('Erreur: impossible de charger la barre de navigation');
                        }
                });
        }
});

/**
 * Modifie les liens des boutons de connexion / déconnexion SSO pour prendre ne compte
 * l'adresse exacte de la page d'origine (si on fait ça en PHP, on obtient l'URL du
 * widget de barre de navigation et pas de la page appelante)
 */
function definirPageOrigineDansLiens() {
        var page = window.location.href;
        $('#bouton-connexion a').attr('href', $('#bouton-connexion a').attr('href') + page);
    $('#deconnexion a').attr('href', $('#deconnexion a').attr('href') + page);
}

/**
 * Interroge le SSO pour connaître le statut de l'utilisateur, et change le menu
 * à droite de la barre en fonction
 */
function chargerStatutSSO(urlBaseAuth) {
        var urlAuth = urlBaseAuth + '/identite';
        $.ajax({
            url: urlAuth,
            type: "GET",
            dataType: 'json',
            xhrFields: {
                 withCredentials: true
            }
        }).done(function(data) {
                // connecté
                definirUtilisateur(data.token);
        });
}

function definirUtilisateur(jeton) {
        var nomComplet = '';
        if (jeton != undefined) {
                // décodage jeton
                var jetonDecode = decoderJeton(jeton);
                nomComplet = jetonDecode.intitule;
        }
        // affichage
        $('#bouton-connexion').hide();
        $('#utilisateur-connecte').show();
        $('#nom-complet').html(nomComplet);
}

/**
 * Décodage à l'arrache d'un jeton JWT, ATTENTION CONSIDERE QUE LE
 * JETON EST VALIDE, ne pas décoder n'importe quoi - pas trouvé de lib simple
 * Si pb de cross-browser, tenter ceci : https://code.google.com/p/javascriptbase64/
 * ou ceci : https://code.google.com/p/crypto-js
 */
function decoderJeton(jeton) {
    parts = jeton.split('.');
    payload = parts[1];
    payload = atob(payload);
    payload = JSON.parse(payload, true);

    return payload;
}