http://matthias-hielscher.de/blog/343/Die_MediaWiki-Erweiterung_MWBB.html
Feb
12

Die MediaWiki-Erweiterung MWBB

Um bei einem MediaWiki eine benutzerfreundliche Diskussionsseite zu erstellen, schaute ich mir die MWBB-Erweiterung an. Dabei handelt es sich um ein kleines Forum, das sich schön ins Wiki integrieren lässt.

Die Erweiterung enthält teils vermeidbare Unsauberkeiten. Wenn man zum Beispiel ein Thema in diesem Forum gesperrt hat, verschwindet lediglich der Link zum Antworten-Formular, gibt man jedoch die URL manuell in den Browser ein, kann man fröhlich weiterschreiben.

Falls jemand von euch diese Erweiterung nutzen sollte, zeige ich kurz die Änderungen, um diesen Fehler zu beheben:

Zuerst einmal entfernen wir den Link, um einen Beitrag zu zitieren:

Suchen (topic.php):
PHP-Code:
$html.=$skin->makeKnownLink('Special:[i][/i]Post/reply','<img
src="'.$wgScriptPath.'/extensions/mwbb/comment.png"
/>','tid='.$topic_data['topic_id'].'&quote='.$data[$i]['post_id']);

Ersetzen mit:
PHP-Code:
if ($topic_data['topic_status'] != STAT_CLOSED)
{
	$html .= $skin->makeKnownLink('Special:[i][/i]Post/reply',
		'<img src="' . $wgScriptPath.'/extensions/mwbb/comment.png" />',
		'tid=' . $topic_data['topic_id'] . '&quote=' . $data[$i]['post_id']);
}

Und nun wollen wir die Möglichkeit, eine Antwort zu verfassen unterbinden:

Suchen (post.php):
PHP-Code:
$topic_data=$topic_data[0];

Danach einfügen:
PHP-Code:
if($topic_data['topic_status'] == STAT_CLOSED)
{
 	$wgOut->errorpage('m_notification', 'topic_closed');
}

Diese Änderungen habe ich dem Entwickler bereits über den Bugtracker mitgeteilt.


Prinzipiell bin ich sonst mit der Erweiterung ganz zufrieden und im Code konnte ich bisher auch keine Sicherheitslücken, die beispielsweise SQL-Injections ermöglichen, finden. Das ist schon mal sehr wichtig, dennoch ist es mir unbegreiflich, wie man mit so einer Code-Formatierung arbeiten kann. Ein kleiner Ausschnitt:

PHP-Code:
if($mode=='edit_cat')
  {//if 1
$cat_id=(!is_null($wgRequest->getIntOrNull('cid')))?$wgRequest->getIntOrNull('cid'):false;
  if(!$cat_id)
   $wgOut->errorpage('Error','no_cat');
$sql="SELECT c.* FROM ".$cat_table." c WHERE c.cat_id=".$cat_id." LIMIT 1";
$result=$dbw->query($sql);
$cdata=fetchdata($result,$dbw);
   if(!$cdata)
   	  {//if //2
   $wgOut->errorpage('Error','no_cat');
      }//2
$cdata=$cdata[0];

// ...

Und das ist auf SourceForge zu finden. Ich habe den Code für mich grob formatiert, damit man vernünftig damit arbeiten kann, doch das vollständig zu formatieren benötigt Zeit. Auf jedenfall sehe ich nun wenigstens, was wohin gehört:

PHP-Code:
if ($mode == 'edit_cat')
{
	$cat_id = (!is_null($wgRequest->getIntOrNull('cid'))) ?
		$wgRequest->getIntOrNull('cid') : false;
	if (!$cat_id)
	{
		$wgOut->errorpage('Error', 'no_cat');
	}
	$sql = "SELECT c.*
		FROM " . $cat_table . " c
		WHERE c.cat_id=" . $cat_id . "
		LIMIT 1";
	$result = $dbw->query($sql);
	$cdata = fetchdata($result, $dbw);
	if (!$cdata)
	{
		$wgOut->errorpage('Error', 'no_cat');
	}
	$cdata = $cdata[0];

// ...

Da das Layout der Erweiterung auch absolut nicht zu dem eines MediaWikis passt, habe ich bei mir nun die halbe Erweiterung überarbeitet. Aber nun schaut's gut aus. \:\)

Bleibe auf dem Laufenden!

Wenn du den RSS-Feed abonnierst, wirst du über neue Blogeinträge benachrichtigt.

Kommentare

Einen Kommentar schreiben

 
 
  • : *
  • :
  • : *
* Pflichtfelder