Neues Modul: PHPBB3 in Contenido integrieren

Gesperrt
homtata
Beiträge: 1142
Registriert: Mi 14. Jan 2004, 14:41
Kontaktdaten:

Neues Modul: PHPBB3 in Contenido integrieren

Beitrag von homtata » Fr 22. Aug 2008, 15:22

hier noch ein Modul, um wenigstens irgendwie das PHPBB3 in Contenido zu "integrieren".

- Das Modul ist verknüpft mit der Frontenduser-Erweiterung, wo es einige Infos herbezieht, die es wiederum in die PHPBB-Datenbank einschleust.
- Das Modul erstellt einen Benutzernamen und trägt u.a. E-Mail-Adresse und weitere Werte in die Datenbank, die unerlässlich sind.
- Es erstellt aus dem Nutzernamen und weiteren Codeschnipseln MD5-Passwörter, schreibt diese in die DB fürs PHPBB, so dass mit dem Fremd-Einlog-Modul "login.php" verlässlich ins PHPBB aus Contenido heraus eingeloggt werden kann, ohne das Contenido-Passwort des Nutzers kennen zu müssen. Hierfür bitte noch die "xxx" in zwei Dateien unten durch eigenen Codefolgen ersetzen.
- Das Modul sucht, ob unter der genannten Mailadresse schon mal ein Nutzer in der DB für PHPBB angelegt wurde. Falls nein, werden wichtige Werte neu erstellt, ansonsten werden einfach alle Werte in der mit der E-Mail korrespondierenden Zeile überschrieben.
- Ich bin gescheitert bei dem Versuch, die login.php außerhalb des root-Ordners des PHPBB zu platzieren und einzubinden.
- Die hier aufgeführten Skripte funktionieren nur dann, wenn PHPBB im Ordner /cms/extern/forum platziert wird.
- Das integrierte Javascript sorgt dafür, dass der IFrame, in dem PHPBB läuft, immer ausreichend hoch ist.

Ihr müsst Euch dieses Modul ggf. noch anpassen.

Ihr benötigt:

Modul-Output:

Code: Alles auswählen

<?php
// Frontend-Username ermitteln, der an phpBB weitergegeben wird:

    $oFeUserCollection = new FrontendUserCollection();
    $oFeUser = $oFeUserCollection->loadItem($auth->auth["uid"]);
    $username = $oFeUser->get('username');
    $loginname  = $oFeUser->getProperty("address", "name", $Vorname)." ";
    $loginname .= $oFeUser->getProperty("address", "surname", $Nachname);


// Zusätzliche Variablen für PHPBB anlegen

    $user_email = $oFeUser->get('username');
    $username = $loginname;
    $username_clean = htmlentities(strtolower($username)); //wird angelegt, um User mit Sonderzeichen im Namen trotzdem einloggen zu können

    $user_password = md5(substr("xxx".$user_email."xxx",0,9));
    $user_actkey = md5(rand(0, 100) . time());
    $user_actkey = substr($user_actkey, 0, rand(6, 10));
    $group_id = (int) 2;
    $user_timezone = (float) '0';
    $user_dst = date('I');
    $user_lang = 'de_x_sie';
    $user_type = USER_NORMAL;
    $user_regdate = time();

// Prüfen, ob User schon existiert in PHPBB. Falls ja, neu anlegen, sonst Passwort austauschen

    $query = "SELECT * FROM phpbb_users WHERE user_email='$user_email'";
    $result = mysql_query($query);

    if (!$row= mysql_fetch_array($result)) {
        $query2 = "REPLACE INTO phpbb_users (username,username_clean,user_password,user_email,group_id,user_timezone,user_dst,user_lang,user_type,user_actkey,user_regdate) VALUES ('".$username."','".$username_clean."', '".$user_password."', '".$user_email."', ".$group_id.", '".$user_timezone."', '".$user_dst."', '".$user_lang."', '".$user_type."', '".$user_actkey."', '".$user_regdate."')";
        mysql_query($query2);
        $lastInsertedID = mysql_insert_id();
        $query3 = "INSERT INTO phpbb_user_group  (group_id,user_id,group_leader,user_pending) VALUES (2,$lastInsertedID,0,0)";
        mysql_query($query3);
    }

    else {
       $query2 = "UPDATE phpbb_users SET username = '$username',username_clean = '$username_clean',user_password = '$user_password' WHERE user_email = '$user_email'";
        mysql_query($query2);
    }

?>

<script type="text/javascript">

//Input the IDs of the IFRAMES you wish to dynamically resize to match its content height:
//Separate each ID with a comma. Examples: ["myframe1", "myframe2"] or ["myframe"] or [] for none:
var iframeids=["forum"]

//Should script hide iframe from browsers that don't support this script (non IE5+/NS6+ browsers. Recommended):
var iframehide="no"

var getFFVersion=navigator.userAgent.substring(navigator.userAgent.indexOf("Firefox")).split("/")[1]
var FFextraHeight=parseFloat(getFFVersion)>=0.1? 20 : 0 //extra height in px to add to iframe in FireFox 1.0+ browsers

function resizeCaller() {
var dyniframe=new Array()
for (i=0; i<iframeids.length; i++){
if (document.getElementById)
resizeIframe(iframeids)
//reveal iframe for lower end browsers? (see var above):
if ((document.all || document.getElementById) && iframehide=="no"){
var tempobj=document.all? document.all[iframeids] : document.getElementById(iframeids)
tempobj.style.display="block"
}
}
}

function resizeIframe(frameid){
var currentfr=document.getElementById(frameid)
if (currentfr && !window.opera){
currentfr.style.display="block"
if (currentfr.contentDocument && currentfr.contentDocument.body.offsetHeight) //ns6 syntax
currentfr.height = currentfr.contentDocument.body.offsetHeight+FFextraHeight; 
else if (currentfr.Document && currentfr.Document.body.scrollHeight) //ie5+ syntax
currentfr.height = currentfr.Document.body.scrollHeight;
if (currentfr.addEventListener)
currentfr.addEventListener("load", readjustIframe, false)
else if (currentfr.attachEvent){
currentfr.detachEvent("onload", readjustIframe) // Bug fix line
currentfr.attachEvent("onload", readjustIframe)
}
}
}


function readjustIframe(loadevt) {
var crossevt=(window.event)? event : loadevt
var iframeroot=(crossevt.currentTarget)? crossevt.currentTarget : crossevt.srcElement

if (iframeroot)
resizeIframe(iframeroot.id);
}

function loadintoIframe(iframeid, url){
if (document.getElementById)
document.getElementById(iframeid).src=url
}

if (window.addEventListener)
window.addEventListener("load", resizeCaller, false)
else if (window.attachEvent)
window.attachEvent("onload", resizeCaller)
else
window.onload=resizeCaller


</script>

<iframe width="620" id="forum" style="border:none;margin:0px;padding:0px;margin-top: -30px;" name="content" src="/cms/extern/forum/login.php?ref=<?php print $user_email; ?>" scrolling="auto" frameborder="0">

</iframe>

dazu noch die login.php im Verzeichnis /cms/extern/forum (bzw. root des PHPBB):

Code: Alles auswählen

<?php

    /*
    * externes Login script fuer phpBB3
    */

    define('IN_PHPBB', true);
    $phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
    $phpEx = substr(strrchr(__FILE__, '.'), 1);
    require($phpbb_root_path . 'common.' . $phpEx);
    require($phpbb_root_path . 'config.' . $phpEx);

    // Start session management
    $user->session_begin();
    $auth->acl($user->data);
    $user->setup();

    //Abfragen von ggf. uebermittelten Parametern
    //Prüfe, ob der ermittelte Name in Contenido existiert (Exploit minimieren)
    mysql_connect ($dbhost, $dbuser, $dbpasswd) or die ('Ich konnte keine Verbindung zur Datenbank aufbauen. Fehlermeldung: ' .      mysql_error());
    mysql_select_db ($dbname);
    $user_email = $_GET['ref']; 
    $user_email_enc = str_replace("@", "%40", $user_email); 
    $query = "SELECT * FROM con_frontendusers WHERE username='$user_email_enc'";
    $result = mysql_query($query);

    if (!$row= mysql_fetch_array($result)) {
      die('<p style="font-family: Arial, Helvetica, sans-serif;font-size: 12px;">Sie haben keine Berechtigung für dieses Skript.</p>');
    } else {
    $ident = $row["idfrontenduser"];
    }

//jetzt wird der Username zur zugehörigen Mailadresse ausgelesen, die in phpBB hinterlegt ist
    
    $query = "SELECT username,username_clean FROM phpbb_users WHERE user_email='$user_email'";
    $result = mysql_query($query);
    if ($row= mysql_fetch_array($result)) { $username = $row["username_clean"];    }

    $password     = substr("xxx".$user_email."xxx",0,9);
    $autologin    = false;
    $viewonline = (!empty($_POST['viewonline'])) ? 0 : 1;

    $logout     = request_var('mode', '');


    $auth->login($username, $password, $autologin, $viewonline);


    //Wenn ueber einen Link der mode=logout lautet und eine SID uebergeben wurde, starte das ausloggen des Users
    if ($logout == 'logout')
    {
        $user->session_kill();
    }

    // Prüfe ob User eingeloggt ist oder nicht

    if ($user->data['is_registered'])
    {
        // ein erfolgreich eingeloggter User wird auf die Startseite geleitet
        header ("Location: index.php"); 
    }
    else
    {
        //Wenn er nicht erfolgreich eingeloggt ist, wird er auf trotzdem auf die Seite geschickt, ist aber nicht angemeldet.
        header ("Location: index.php");
    }

    ?>

und dann noch die login.html (ebenfalls ins PHPBB-root), damit man ggf. auch unabhängig von Contenido einloggen kann (ich brauchte das, da ich die PHPBB so kastriert habe, das die Einlog-Maske gar nicht mehr da ist in der Standard-Version):

Code: Alles auswählen

<html>
    <body>
        Bitte anmelden:<br />
        <form method="POST" action="login_admin.php">
        <p>Benutzername: <input type="text" name="username" size="40"><br />
        Passwort: <input type="password" name="password" size="40"><br />
        <br />
        Mich bei jedem Besuch automatisch anmelden? : <input type="checkbox" name="autologin"><br />
        <br />
        Online Status verstecken? : <input type="checkbox" name="viewonline"><br />
        <br />
        <input type="submit" value="Absenden" name="login"></p>
        </form>
    </body>
</html> 

kummer
Beiträge: 2423
Registriert: Do 6. Mai 2004, 09:17
Wohnort: Bern, Schweiz
Kontaktdaten:

Beitrag von kummer » Fr 22. Aug 2008, 16:09

normal wäre eigentlich der umgekehrte weg. du kannst die login-routine von phpbb so anpassen, dass sie die benutzer von contendio verwendet. soll keine kritik sein, nur ein hinweis.
aitsu.org :: schnell - flexibel - komfortabel :: Version 2.2.0 (since June 22, 2011) (jetzt mit dual license GPL/kommerziell)

Gesperrt