Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5

Fusionner un forum Fluxbb 1.5.x et CmsMadeSimple 1.11.x
#10

[h]Comment pluger FEU/cmsmadesimple et Fluxbb[/h]

Le processus que nous allons utiliser n'est pas encore testé de manière massif sur cmsmadesimple.fr, c'est testé en interne sans soucis notable. Mais bon, ... veillez à bien compléter les tests de votre côté Smile

Nous allons, dans CmsMadeSimple, capter le cookies de fluxbb du visiteur. Si il existe, si il est valide, alors nous allons créer un compte équivalent dans FEU (si innexistant) et lui créer une session FEU afin qu'il soit considéré comme connecté sur CmsMadeSimple.

Ce processus de captation de session possède une faille fonctionnelle : Que ce passe t il si je me déconnecte de FEU ? le code va automatiquement regénérer une session FEU ... et si je me connecte sur FEU avant d'être sur fluxBB ? Donc impossibilité de laisser un bouton "connexion" ou "déconnecter" sur cmsmadesimple.

Ma solution est de faire un lien qui pointe vers le forum et/ou de laisser un message à l'attention de l'utilisateur lui expliquant que sa connexion/déconnexion se fait UNIQUEMENT via fluxBB.

Autre point important : comment lire les données de bdd de fluxBB depuis CmsMadeSimple ?

2 cas de figure :

Dans 95% des cas vous utiliserez une base de donnée commune, un schéma commun et donc des identifiants identiques : youpi.
Dans 5% des cas vous utilisez des identifiants différents : arf... mais pas de panique, j'ai une solution aussi.

Préparez votre terrain

Avant de démarrer le code il va falloir aller à la pêche aux informations.

Il vous faut :

* Le nom du cookie
* la seed du cookie
* le préfixe de la base de donnée Fluxbb, traditionnellement "fluxbb_"

et pour ceux qui sont dans les 5% : les identifiants de connexion à la bdd de votre installation.


Le nom du cookie et sa seed sont trouvable facilement dans le fichier config.php de votre installation de forum.

Code :
$cookie_name = 'punbb_cookie';
$cookie_seed = '2a852bb9';

ASTUCE : pour ceux qui sont dans le cas suivant (rare, moi je l'étais) : le forum et cmsmadesimple ne sont pas sur le même sous domaine, exemple : http://www.monsite.fr/forum et http://cms.monsite.fr, un sous domaine différent, il faut faire comprendre à fluxBB que son cookie peut se balader AU DELÀ du sous domaine initial : le www. Pour ce faire il faut modifier dans config.php la ligne suivante :


Code :
$cookie_domain = '.monsite.fr';

Cela laissera valable le cookies partout sur monsite.fr, y compris sur ses sous domaines. Fin de l'astuce.

Le code

J'ai choisit pour des raisons pratiques (créer et appeler des fonctions dans mon code), de placer mon code dans un plugin et non dans une balise utilisateur. Vous pouvez adapter le code pour le mettre dans une UDT si vous le souhaitez mais il faudra repenser mon code.

Créez donc dans le répertoire /plugins de cmsmadesimple un fichier nommé "function.fluxbb2feu.php"

Citation :function smarty_cms_function_fluxbb2feu($params = array(), &$smarty = null)
{
$db = cmsms()->GetDb();
//$db = getFluxBBDb();
$cookie_name = 'punbb_cookie';
$cookie_seed = '2a852bb9';
$dbprefix = 'fluxbb_';
$pun_user = null;

$now = time();

// If the cookie is set and it matches the correct pattern, then read the values from it
if (isset($_COOKIE[$cookie_name]) && preg_match('%^(\d+)\|([0-9a-fA-F]+)\|(\d+)\|([0-9a-fA-F]+)$%', $_COOKIE[$cookie_name], $matches))
{
$cookie = array(
'user_id' => intval($matches[1]),
'password_hash' => $matches[2],
'expiration_time' => intval($matches[3]),
'cookie_hash' => $matches[4],
);
} else{
trace('pattern');
$db->Close();
unset($db);
return;
}


$modops = cmsms()->GetModuleOperations();
$feu = $modops->get_module_instance('FrontEndUsers');


// If it has a non-guest user, and hasn't expired
if (isset($cookie) && $cookie['user_id'] > 1 && $cookie['expiration_time'] > $now)
{
// If the cookie has been tampered with
if (forum_hmac($cookie['user_id'].'|'.$cookie['expiration_time'], $cookie_seed.'_cookie_hash') != $cookie['cookie_hash'])
{
trace('hash');

$db->Close();
unset($db);
return;
}


// Check if there's a user with the user ID and password hash from the cookie
$query = 'SELECT u.*, g.*, o.logged, o.idle FROM '.$dbprefix.'users AS u INNER JOIN '.$dbprefix.'groups AS g ON u.group_id=g.g_id LEFT JOIN '.$dbprefix.'online AS o ON o.user_id=u.id WHERE u.id= ?';
$pun_user = $db->GetRow($query, array(intval($cookie['user_id'])));

// If user authorisation failed
if (!isset($pun_user['id']) || forum_hmac($pun_user['password'], $cookie_seed.'_password_hash') !== $cookie['password_hash'])
{
trace('autho/failes');
$db->Close();
unset($db);
return;
}

$email = $pun_user['email'];
//$password = $pun_user['password'];
$password = 'toto22!#';

//other informations
$id_fluxbb = $pun_user['id'];
$id_group_fluxbb = $pun_user['group_id'];
$username = $pun_user['username'];

unset($pun_user);




//Group by default
$gid = $feu->GetGroupID('utilisateurs');

$feu_user = $feu->GetUserInfoByName($email);
if($feu_user == null || $feu_user[0] == null)
{
$tmp = $feu->GetPreference('expireage_months',6);
$expires = strtotime(sprintf("+%d months",$tmp));

$feu_user = $feu->AddUser( $email, $password, $expires);
$feu_user = $feu->GetUserInfo($feu_user[1]);
$feu->AssignUserToGroup( $feu_user[1]["id"], $gid );
$feu->SetUserPropertyFull('id_fluxbb',$id_fluxbb,$feu_user[1]["id"]);
$feu->SetUserPropertyFull('id_group_fluxbb',$id_group_fluxbb,$feu_user[1]["id"]);
$feu->SetUserPropertyFull('user_fluxbb',$username,$feu_user[1]["id"]);
}

$name = $feu->LoggedInName();
if($name == null || $name =! $email)
{
$result = $feu->Login( $email, $password, "",false,true);
$uid = $result[0];
} else
{
$uid = $feu->LoggedInId();
}

trace("User $uid connecté");

} else
{
trace('not set or expire : '.print_r($cookie, true).' '.$now);

//Remove FEU cookies / Session
$feu->Logout();
_AttemptInvalidateLoginCookie($feu);

$db->Close();
unset($db);
return;
}


//Finnaly
trace("finnaly");
$db->Close();
unset($db);
}

function smarty_cms_help_function_fluxbb2feu()
{
echo "Gere la liaison Forum cmsms => autre cmsms";
}

function smarty_cms_about_function_fluxbb2feu()
{
?>
<p>Author: Kevin Danezis</p>
<p>Version: 0.1</p>
<p>
Change History:
</p>
<?php
}

function forum_hmac($data, $key, $raw_output = false)
{
return hash_hmac('sha1', $data, $key, $raw_output);
}






function trace($message) {
//echo '<code>'.$message.'</code><br/>';
}

/**
* See FrontEndUsers.module.php Line 1232
**/
function _AttemptInvalidateLoginCookie($feu)
{
$gCms = cmsms();
//$config = $gCms->GetConfig();
if( $feu->GetPreference('usecookiestoremember') &&
($feu->GetPreference('cookiename') != '') )
{
$cookiename = $feu->GetPreference('cookiename');
$value = FALSE;
if( isset($_COOKIE[$cookiename]) )
{
$value = $_COOKIE[$cookiename];
}

$expires = time()-(3600*24); // one day ago
$res = setcookie( $cookiename, $value, $expires, "/" );
if( !$res ) die('delete cookie failed');
}
}

Ce code est en très très grande partie inspiré du code d'authentification du forum Fluxbb lui même, j'ai copié le code, j'ai viré tout ce qui ne m'intéressait pas, j'ai ajouté un peu de code par ci par là et j'ai finit en câblant les données dans FEU.

Notez ce que j'ai colorié dans cette drôle de couleur bizarre : les différentes valeurs que vous devrez personnaliser (généralement : uniquement la seed).

Vous trouvez également la valeur utilisateurs dans le code, c'est le nom d'un groupe existant dans FEU qui sera le groupe par défaut des nouveaux arrivant. A votre charge de créer ce groupe dans FEU et de déplacer au besoin les utilisateurs dans d'autres groupes FEU.

J'ai surligné en vert des éléments qui peuvent être personnalisé. Ainsi dans mon code je récupère l'id de l'utilisateur, l'id de son groupe et le pseudo de l'utilisateur (Bess pour moi). J'ai également choisit de récupérer l'email (...@gmail.com pour moi) qui me servira un peu plus loin d'identifiant unique dans FEU. Vous pouvez ajouter ou changer ces informations assez facilement en tapant sur ces lignes de code.


J'ai surligné en rouge un dernier point : le mot de passe affecté aux utilisateur FEU. Il est le même pour tous, mais comme je ne laisse personne demander son mot de passe, se connecter ou se déconnecter depuis l'interface de FEU, les risques de piratage de session me semblent nuls. Néanmoins on pourrait améliorer le code en choisissant de réencoder le mot de passe de Fluxbb avec un Salt


exemple
Citation :$email = $pun_user['email'];
$salt = 'toto22!#';
$password = md5($salt.$pun_user['password']);


Et si vous faites partie des 5% ayant deux identifiants différents pour cmsmadesimple / Fluxbb : ajoutez ce code :

Citation :function getFluxBBDb()
{
try {
$db= &ADONewConnection('mysql','pear:date:extend');
$db->Connect('localhost','login','password','databaseName');

return $db;
} catch (exception $e) {
var_dump($e);
adodb_backtrace($e->gettrace());
}
}

function smarty_cms_function_fluxbb2feu($params = array(), &$smarty = null)
{
//$db = cmsms()->GetDb(); <-- Notez l'inversion de la ligne en commentaire
$db = getFluxBBDb();
$cookie_name = 'punbb_cookie';
$cookie_seed = '2a852bb9';
$dbprefix = 'fluxbb_';
$pun_user = null;

$now = time();


[......]

Le reste du code sera identique, pensez juste à bien mettre vos identifiants de base de donnée FluxBB Smile

Voilà pour le code ! Vous pouvez maintenant placer {fluxbb2feu} dans le gabarit de vos pages CmsMadeSimple, tout visiteur ayant une session ouverte sur Fluxbb qui passe sur ces pages aura une session ouverte dans FEU.

Notez que si pour une raison (expiration ou par action) la session FluxBB disparait : le code supprimera automatiquement la session FEU en même temps. Donc un utilisateur se déconnectant de Fluxbb sera déconnecté immédiatement de CmsMadeSimple

Préparer FEU

Maintenant que votre code est prêt à fonctionner, il faut préparer FEU pour accueillir les données des visiteurs.

Créez 3 propriétés pour les users

Nom : id_fluxbb Lib : identifiant utilisateur fluxbb Type : Texte Taille : 10 Non Unique
Nom : user_fluxbb Lib : nom d'utilisateur sur le forum Type : Texte Taille : 80 Non Unique
Nom : id_group_fluxbb Lib : identifiant du group utilisateur dans fluxbb Type : Texte Taille : 5 Non Unique


Créez un groupe de users dans FEU nommé humblement "utilisateurs". Remarquez que c'est bien le nom issu du code de mon plugin Smile

Enfin vous liez nos 3 propriétés à ce nouveau groupe en déclarant id_fluxbb et id_group_fluxb comme cachés et user_fluxbb en lecture seule.


Normalement les premiers visiteurs devraient automatiquement avoir un compte équivalent sur FEU. Reste à exploiter les données FEU dans CmsMadeSimple.

Créer une page de test

Pour m'aider dans ma tâche j'ai installé évidement FEU, mais également CustomContent. Un exemple de code très simple :

Citation :{fluxbb2feu}
{if $ccuser->loggedin()}
<p> Bienvenue </p>
<b>Votre email forum : </b> {$ccuser->username()}<br/>
<b>Votre login forum : </b> {$ccuser->property('user_fluxbb') }<br/>
<b>Votre groupe id forum : </b> {$ccuser->property('id_group_fluxbb') }<br/>
<b>Votre user id forum : </b> {$ccuser->property('id_fluxbb') }<br/>
{else}
<h1>Pas connecté sur le forum Fluxbb</h1>
{/if}
Répondre


Messages dans ce sujet

Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)