Subversion Repositories eFlore/Applications.cel

Rev

Rev 3239 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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