Subversion Repositories eFlore/Applications.cel

Rev

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

Rev Author Line No. Line
3204 delphine 1
// configuration
3213 idir 2
// prod :
3217 idir 3
/*var urlRacine = 'https://www.tela-botanica.org',
4
    config = {
5
      prod: {
6
        urlWidgetNavigation : urlRacine + '/widget:cel:saisie2',
7
        urlBaseAuth : 'https://www.tela-botanica.org/service:annuaire:auth'
8
      }
9
    };
3213 idir 10
  */
11
// beta (test) :
3217 idir 12
var urlRacine = 'https://beta.tela-botanica.org',
13
    config = {
14
      test: {
15
        urlWidgetNavigation : urlRacine + '/widget:cel:saisie2',
16
        urlBaseAuth : 'https://beta.tela-botanica.org/service:annuaire:auth'
17
      }
18
    };
3213 idir 19
 
20
// dev (localhost):
3217 idir 21
/*var urlRacine = 'http://localhost',
22
    config = {
23
      local: {
24
        urlWidgetNavigation : urlRacine + '/widget:cel:saisie2',
25
        urlBaseAuth : 'https://api.tela-botanica.test/service:annuaire:auth'
26
      }
3239 idir 27
    };*/
28
 
3204 delphine 29
/**
30
 * Charge la barre de navigation depuis le widget:reseau:navigation dans un <div id="tb-navigation"> , s'il existe
31
 * dans la page appelante.
32
 *
33
 * Nécessite jQuery
34
 *
35
 * Utilisation :
36
 *      - prévoir un <div id="tb-navigation"> dans la page, qui accueillera la barre de navigation.
37
 *      - si ce <div> contient déjà quelque chose, son contenu sera reporté à la place de la zone ayant l'id "contenu-source"
38
 *        de la barre de navigation (si une telle zone existe)
39
 *  - si ce <div> contient un attribut "data-courant" et si la valeur de cet attribut correspond à l'id d'un des éléments
40
 *    de navigation, alors cet élément aura la classe "active" (pour localiser la page courante dans les menus)
41
 *  - si ce <div> contient un attribut "data-squelette", alors le widget de navigation sera appelé avec le paramètre
42
 *    "?squelette=contenu-de-data-squelette"; se reporter à la documentation du widget:reseau:navigation
43
 */
44
 
3208 idir 45
$( document ).ready( function() {
46
  var $div = $( '#tb-navigation' );
47
  if ( $div ) {
48
    var squelette = $div.data( 'squelette' ),
49
        courant   = $div.data( 'courant' ),
50
        mode      = $div.data( 'mode' ) || 'prod',
51
        contenu   = $div.html();
3204 delphine 52
 
3208 idir 53
    // chargement de la barre
3217 idir 54
    var urlBaseAuth = config[mode]['urlBaseAuth'];
3208 idir 55
    var urlBarreNavigation = config[mode]['urlWidgetNavigation'];
3217 idir 56
    urlBarreNavigation += ( squelette ) ? '?squelette=' + squelette : '';
3208 idir 57
 
3217 idir 58
    $.ajax({
3208 idir 59
      url: urlBarreNavigation,
60
      type: 'get',
61
      success: function( data ) {
62
        // remplacement de la zone contenu-source
63
        var $zoneSource = $div.find( '#contenu-source' );
64
        if ( $zoneSource ) {
65
          $zoneSource.replaceWith( contenu );
66
          // Chargement des informations de connexion SSO
3217 idir 67
          chargerStatutSSO( urlBaseAuth );
3204 delphine 68
        }
3208 idir 69
      },
70
      error: function() {
71
        $div.html( 'Erreur: impossible de charger la barre de navigation' );
72
      }
73
    });
3217 idir 74
 
75
    $( '#deconnexion a' ).click( function() {
76
      deconnecterUtilisateur( urlBaseAuth );
77
    });
78
 
3208 idir 79
  }
3204 delphine 80
});
81
 
82
/**
83
 * Interroge le SSO pour connaître le statut de l'utilisateur, et change le menu
84
 * à droite de la barre en fonction
85
 */
3208 idir 86
function chargerStatutSSO( urlBaseAuth ) {
87
  var urlAuth = urlBaseAuth + '/identite';
3217 idir 88
 
89
  if( 'local' !== $( '#tb-navigation' ).data( 'mode' ) ) {
90
 
91
    connexion( urlAuth, true );
92
 
93
  } else {
94
    urlAuth ='http://localhost/widget:cel:modules/saisie2/test-token.json';
95
    $( '#connexion' ).click( function() {
96
      connexion( urlAuth, true );
97
      return false;
98
    });
99
  }
100
}
101
 
102
/**
103
 * Déconnecte l'utilisateur du SSO
104
 */
105
function deconnecterUtilisateur( urlBaseAuth ) {
106
  if( 'local' === $( '#tb-navigation' ).data( 'mode' ) ) {
107
    definirUtilisateur( undefined );
108
    window.location.reload();
109
    return;
110
  }
111
 
112
  var urlAuth = urlBaseAuth + '/deconnexion';
113
 
114
  connexion( urlAuth, false );
115
}
116
 
117
function connexion( urlAuth, connexionOnOff ) {
3208 idir 118
  $.ajax({
119
    url: urlAuth,
120
    type: "GET",
121
    dataType: 'json',
122
    xhrFields: {
123
      withCredentials: true
124
    }
3217 idir 125
  })
126
  .done( function( data ) {
3251 idir 127
    if( connexionOnOff ) {
128
      // connecté
129
      definirUtilisateur( data.token );
130
    } else {
131
      definirUtilisateur();
3217 idir 132
      window.location.reload();
3213 idir 133
    }
3217 idir 134
  })
135
  .fail( function( error ) {
136
    // @TODO gérer l'affichage de l'erreur, mais pas facile à placer
137
    // dans l'interface actuelle sans que ce soit moche
138
    //afficherErreurServeur();
3208 idir 139
  });
3204 delphine 140
}
141
 
3217 idir 142
 
3208 idir 143
function definirUtilisateur( jeton ) {
3217 idir 144
  var idUtilisateur = '',
145
      nomComplet    = '',
146
      courriel      = '',
147
      prenom        = '',
148
      nom           = '';
149
 
3208 idir 150
  // affichage
3217 idir 151
  if ( undefined !== jeton ) {
152
    // décodage jeton
153
    var jetonDecode = decoderJeton( jeton );
154
    // console.log(jetonDecode);
155
 
156
    idUtilisateur = jetonDecode.id;
157
    nomComplet    = jetonDecode.intitule;
158
    courriel      = jetonDecode.sub;
159
    prenom        = jetonDecode.prenom;
160
    nom           = jetonDecode.nom;
161
 
162
    $( '#courriel, #courriel_confirmation' ).attr( 'disabled', 'disabled' );
163
    $( '#prenom' ).attr( 'disabled', 'disabled' );
164
    $( '#nom' ).attr( 'disabled', 'disabled' );
165
    $( '#bouton-connexion, #creation-compte' ).addClass( 'hidden' );
166
    $( '#utilisateur-connecte, #anonyme, #zone-courriel-confirmation, #zone-prenom-nom' ).removeClass( 'hidden' );
167
    $( '#date-releve' ).focus();
168
  }
169
 
3213 idir 170
  $( '.warning' ).remove();
3217 idir 171
  $( '#nom-complet' ).html( nomComplet );
172
  $( '#courriel, #courriel_confirmation' ).val( courriel );
173
  $( '#id_utilisateur' ).val( idUtilisateur );
174
  $( '#prenom' ).val( prenom );
175
  $( '#nom' ).val( nom );
3204 delphine 176
}
177
 
178
/**
179
 * Décodage à l'arrache d'un jeton JWT, ATTENTION CONSIDERE QUE LE
180
 * JETON EST VALIDE, ne pas décoder n'importe quoi - pas trouvé de lib simple
181
 */
3208 idir 182
function decoderJeton( jeton ) {
3217 idir 183
  parts = jeton.split( '.' );
3208 idir 184
  payload = parts[1];
3217 idir 185
  payload = b64d( payload );
3208 idir 186
  payload = JSON.parse( payload, true );
3204 delphine 187
 
3208 idir 188
  return payload;
189
}
3217 idir 190
 
191
/**
192
 * Décodage "url-safe" des chaînes base64 retournées par le SSO (lib jwt)
193
 */
194
function b64d( input ) {
195
  var remainder = input.length % 4;
196
 
197
  if ( 0 !== remainder ) {
198
    var padlen = 4 - remainder;
199
 
200
    for ( var i = 0; i < padlen; i++ ) {
201
      input += '=';
202
    }
203
  }
204
 
205
  input = input.replace( '-', '+' );
206
  input = input.replace( '_', '/' );
207
 
208
  return atob( input );
209
}