Subversion Repositories eFlore/Applications.cel

Rev

Rev 3271 | Blame | Last modification | View Log | RSS feed

// configuration
var urlRacine = window.location.origin;

$( document ).ready( function() {
  $( '#form-observateur' )[0].reset();
  var mode = $( '#tb-observateur' ).data( 'mode' ) || 'prod',
      urlBaseAuth = urlRacine + '/service:annuaire:auth';

  chargerStatutSSO( urlBaseAuth, mode );
  $( '#deconnexion a' ).click( function() {
    deconnecterUtilisateur( urlBaseAuth, mode );
  });
});

/**
 * Interroge le SSO pour connaître le statut de l'utilisateur, et change le menu
 * à droite de la barre en fonction
 */
function chargerStatutSSO( urlBaseAuth, mode ) {
  var urlAuth = urlBaseAuth + '/identite';

  if( 'local' !== mode ) {
    connexion( urlAuth, true );
  } else {
    urlAuth = urlRacine + '/widget:cel:modules/saisie2/test-token.json';
    $( '#connexion' ).click( function() {
      connexion( urlAuth, true );
      return false;
    });
  }
}

/**
 * Déconnecte l'utilisateur du SSO
 */
function deconnecterUtilisateur( urlBaseAuth, mode ) {
  if( 'local' === mode ) {
    definirUtilisateur( undefined );
    window.location.reload();
    return;
  }

  var urlAuth = urlBaseAuth + '/deconnexion';

  connexion( urlAuth, false );
}

function connexion( urlAuth, connexionOnOff ) {
  $.ajax({
    url: urlAuth,
    type: "GET",
    dataType: 'json',
    xhrFields: {
      withCredentials: true
    }
  })
  .done( function( data ) {
    if( connexionOnOff ) {
      // connecté
      definirUtilisateur( data.token );
    } else {
      definirUtilisateur();
      window.location.reload();
    }
  })
  .fail( function( error ) {
    // @TODO gérer l'affichage de l'erreur, mais pas facile à placer
    // dans l'interface actuelle sans que ce soit moche
    //afficherErreurServeur();
  });
}

function definirUtilisateur( jeton ) {
  var idUtilisateur = '',
      nomComplet    = '',
      courriel      = '',
      pseudo        = '',
      prenom        = '',
      nom           = '';

  // affichage
  if ( undefined !== jeton ) {
    // décodage jeton
    var jetonDecode = decoderJeton( jeton );
    // console.log(jetonDecode);

    idUtilisateur = jetonDecode.id;
    nomComplet    = jetonDecode.intitule;
    courriel      = jetonDecode.sub;
    pseudo        = jetonDecode.pseudo;
    prenom        = jetonDecode.prenom;
    nom           = jetonDecode.nom;
    $( '#courriel, #courriel_confirmation' ).attr( 'disabled', 'disabled' );
    $( '#prenom' ).attr( 'disabled', 'disabled' );
    $( '#nom' ).attr( 'disabled', 'disabled' );
    $( '#bouton-connexion, #creation-compte' ).addClass( 'hidden' );
    $( '#utilisateur-connecte, #anonyme, #zone-courriel-confirmation, #zone-prenom-nom' ).removeClass( 'hidden' );
    $( '#date-releve' ).focus();
  }
  $( '.warning' ).remove();
  $( '#nom-complet' ).html( nomComplet );
  $( '#courriel, #courriel_confirmation' ).val( courriel );
  $( '#profil-utilisateur a' ).attr( 'href', urlProfilUtilisateur( pseudo ) );
  $( '#id_utilisateur' ).val( idUtilisateur );
  $( '#prenom' ).val( prenom );
  $( '#nom' ).val( nom );
}

/**
 * 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
 */
function decoderJeton( jeton ) {
  parts = jeton.split( '.' );
  payload = parts[1];
  payload = b64d( payload );
  payload = JSON.parse( payload, true );
  return payload;
}

/**
 * Décodage "url-safe" des chaînes base64 retournées par le SSO (lib jwt)
 */
function b64d( input ) {
  var remainder = input.length % 4;

  if ( 0 !== remainder ) {
    var padlen = 4 - remainder;

    for ( var i = 0; i < padlen; i++ ) {
      input += '=';
    }
  }
  input = input.replace( '-', '+' );
  input = input.replace( '_', '/' );
  return atob( input );
}

function urlProfilUtilisateur( pseudo ) {
  var mode = $( '#tb-observateur' ).data( 'mode' ) || 'prod';
  var urlPart = ( 'prod' === mode ) ? 'www.tela-botanica.org/' : 'beta.tela-botanica.org/test/';

  return 'https://' + urlPart + 'membres/' + pseudo.toLowerCase().replace( ' ', '-' );
}