Subversion Repositories eFlore/Applications.cel

Rev

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

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