Die Aufgabe klang zunächst einmal gar nicht so schwierig: Eine bestehende Phorum-Installation sollte auf vBulletin umgestellt werden und anschließend mit einer bereits bestehenden Drupal-Site verknüpft werden. Die Migration von Phorum zu vBulletin werde ich in einem eigenen Artikel beschreiben. Sie verlief relativ glatt, auch wenn das Skript, dass vBulletin für die Konvertierung bereitstellt nicht ganz fehlerfrei arbeitet und etwas Nacharbeit erforderte. Nach einigen kleineren Korrekturen lief dann alles einwandfrei und wir hatten ein funktionierendes vBulletin-Forum. Dieses galt es nun in Drupal zu integrieren, und zwar so, dass die gesamte User-Verwaltung über Drupal läuft. Dafür gibt es das Modul Drupal vB. Es bietet folgende Funktionen:
- existierende und neue vBulletin-User können sich in Drupal einloggen
- existierende Drupal.User können sich in vBulletin einloggen (nach einmaligem Export)
- neue Drupal-User können sich in vBulletin einloggen
- Update von User-Daten in vBulletin erfolgt automatisch bei einem Update in Drupal
- User in vBulletin werden automatisch gelöscht, sobald sie in Drupal gelöscht werden.
- Single-Login und Logout über Drupal
Die Installation des Moduls ist einfach. Es müssen keine Datein geändert werden, weder in Drupal noch in vBulletin. Eine kleine Installationsanleitung beschreibt, was zu tun ist, und nach kurzer Zeit waren die beiden Systeme miteinander verbunden. Sobald man sich jetzt in Drupal anmeldete, war man auch im vBulletin-Forum eingeloggt.
So weit so gut, aber ein Problem konnten wir damit nicht lösen: Die Usernamen in Drupal und vBulletin unterschieden sich. D.h. der gleiche User hatte in der Regel zwei verschiedene Usernamen für die Anmeldung. Wobei nicht jeder User unbedingt ein Login für beide Systeme hatte. Es traten also drei verschiedene Fälle auf:
- User hat Usernamen in Drupal und in vBulletin, z.B. DrupalUsernameX, vBulletinUsernameY
- User hat nur einen Usernamen in Drupal.
- User hat nur einen Usernamen in vBulletin
Fall 2 ist dabei überhaupt kein Problem. Loggt sich der User in Drupal ein, so sorgt Drupal vB dafür, dass automatisch ein gleichlautender User im Forum angelegt wird. Auch Fall 3 ist kein Problem. Alle User, die nur im Forum angemeldet waren, erhielten bei der erstmaligen Anmeldung via Drupal einen Drupal-Account, der mit dem vBulletin-Account verbunden war. Aber wie war Fall 1 zu lösen? Da die Vorgabe war, dass die Drupal-Usernamen (sie setzen sich aus einer Mitgliedsnummer zusammen) nicht geändert werden durften, war die naheliegendste Option, die Usernamen in vBulletin anzupassen. Das wäre natürlich für die Forumuser mit Drupal-Account suboptimal gewesen. Sie hätten nicht nur einen neuen Usernamen im Forum bekommen, sondern noch dazu einen etwas unschönen - nämlich ihre Mitgliedsnummer. Gelöst wurde das Ganze mit Hilfe der Module Realname und Profile Privacy. Realname ermöglicht es, dass Drupal vB die Usernamen zwischen Drupal und vBulletin nicht anhand der originären Drupal-Usernamen abgleicht, sondern dafür einen Wert aus einem zusätzlichen Profilfeld verwendet. Dafür wurde das Profilfeld "Forumname" angelegt. Diese Feld wurde dann mit iHlfe des Moduls Profile Privacy gegen Änderungen durch den User geschützt. Damit wird verhindert, dass ein User einen anderen Forumnamen einträgt. In diesem Fall kann Drupal vB nämlich die Änderung nicht mit vBulletin synchronisieren. Stattdessen wird beim Speichern des geänderten Forumnamens im Drupal-Profil ein neuer Account in vBulletin mit dem neuen Forumnamen angelegt. Oder, falls der Forumname bereits existiert, der Drupal-Account mit diesem verbunden. Was auch eine Sicherheitslücke für vBulletin bedeutet. Dabei trat noch ein Bug im Zusammenspiel von Realname, Profile Privacy und Drupal vB auf:
Realname fragt die Privacy-Einstellungen von Profile Privacy ab. Dies führte im konkreten Fall dazu, das bei einigen Usern von Realname nicht der Forumsname sonder der Drupal-Username ausgegeben wurde. Und das führte zu Fehlern bei der Zuordnung der Accounts. Als Workaround muss diese Prüfung in realname.module abgeschaltet werden. Dazu ändert man in der Datei realname.module in der Funktion realname_make_name
Zeile 264 (alt) if (isset($account->$name) && !$private_field) {
in
Zeile 264 (neu) if (isset($account->$name)) {
Damit unterbleibt die Abfrage, ob ein Profilfeld auf Privat gesetzt ist. Diese Einstellung soll verhindern, dass ein Realname aus privaten Feldern gebildet wird. Das ist aber in diesem Anwendungsfall ausdrücklich erwünscht gewesen.
Das Feld "Forumname" enthält nun den jeweiligen Usernamen der im Forum verwendet wird. Mit diesem Wert "überschreibt" Realname den Drupal-Usernamen bei der Ausgabe (intern bleibt der Username natürlich erhalten). Damit erfolgt die Anmeldung in vBulletin jeweils mit diesem Forumnamen. Wird in dieses Feld kein Wert eingetragen, so wird stattdessen der Drupal-Username verwendet. Dies muss man bedenken, falls es den Drupal-Usern gestattet ist ihren Usernamen zu ändern.
In der Regel wird man den Forum-Usernamen nicht ändern wollen. Falls doch geht das auf diese Art: zuerst muss der Forum-Admin in vBulletins Admin-Bereich den Usernamen ändern und anschließend in Drupal diesen Usernamen in das gesperrte Profilfeld eintragen.Wichtig: in der Zwischenzeit darf sich der User nicht in Drupal einloggen, weil sonst in vBulletin ein neuer Account mit dem alten Forum-Usernamen erstellt würde! Um dies sicherzustellen sollte man den User vorübergehen in Drupal sperren. Ist der Eintrag im Drupal-Benutzerprofil geändert, kann man den User wieder freigeben. Bei seinem nächsten Login erscheinen sowohl auf der Drupal- als auch auf der Forumsseite der neue Username.