Seite 1 von 1

Problem: Gefakter Benutzerwechsel im Skript

Verfasst: 04.06.2012 15:12
von Kimama
Hallo zusammen,

ich habe folgendes Setting: Meine Website bastle ich als in phpBB3 integrierte Seite (wirklich komfortabel bei den Funktionalitäten :)). Auch das Backend für den redaktionellen Teil ist so integriert, dass vorher eine Abfrage kommt, ob der User Admin ist und wenn ja, dann darf er drauf zugreifen. (Es werden mehrere Leute sein, die darauf zugreifen, daher ist es an die Admin-Gruppe gekoppelt.)

Nun möchte ich folgendes erreichen: Wenn jemand einen Artikel veröffentlicht, soll automatisch ein Topic im Forum dazu eröffnet werden. Mit Hilfe des Forums hier und einer Brise Google, habe ich das Skript soweit hinbekommen mit dem Erstellen des Topics... fast.

Problem: Ich muss den Benutzer faken, der das Topic im Forum erstellt. Über den Standardcode, der automatisch im Adminmenü geladen wird, werden MEINE Benutzerdaten geladen. Ich möchte jedoch nicht als ICH im Forum posten, sondern als Bot. Allerdings brauche ich ja MEINE Benutzerdaten in anderen Bereichen und als Login fürs Adminmenü. Ohje, ich hoffe, ihr versteht, was ich meine. Hier mal mein Code:

Standardmäßig wird folgendes geladen:

Code: Alles auswählen

define('IN_PHPBB', true);
$phpbb_root_path = "../forum/";
$phpEx = substr(strrchr(__FILE__, '.'), 1);
require($phpbb_root_path . 'common.' . $phpEx);

// Start session management
$user->session_begin();
$auth->acl($user->data);
$user->setup();
Und somit meine persönlichen Daten mit user_id 2. Das wird auch weiterhin benötigt.

Hier mal meine Funktion, um den Beitrag im Forum zu erstellen:

Code: Alles auswählen

function erstelleForenthema($id){
	
	global $auth, $db, $user;
	
	//Hier bewirkt das session_create nichts, ich poste dennoch mit user_id 2 (meine Profil-ID), nicht mit 57 (id des Bot)
	$user->session_create(57,false,false,false);
	$auth->acl($user->data);
	
	$request = mysql_query("SELECT Titel, Teasertext, Kategorie_ID FROM redaktion_artikel WHERE Artikel_ID='$id'");
	$artikel = mysql_fetch_array($request);
	
	$board = 0;
	switch($artikel['Kategorie_ID']){
		case 1:
			$board = 5;
			break;
		case 2:
			$board = 6;
			break;
		case 3:
			$board = 8;
			break;
		case 6:
			$board = 9;
			break;
		case 7:
			$board = 7;
			break;
	}
	
	if($board > 0){
		
		include ("../forum/includes/functions_posting.php");
	
		//Betreff erstellen
		  $topic=$artikel['Titel'];
		//Post erstellen
		  $thread=$artikel['Teasertext'];
		
		$my_subject = utf8_encode($topic);
		$my_text = utf8_encode($thread);
		
		// variables to hold the parameters for submit_post
		$poll = $uid = $bitfield = $options = '';
		
		generate_text_for_storage($my_subject, $uid, $bitfield, $options, false, false, false);
		generate_text_for_storage($my_text, $uid, $bitfield, $options, true, true, true);
		
		$data = array(
		   'forum_id'      => $board,
		   'icon_id'      => false,
		
		   'enable_bbcode'      => true,
		   'enable_smilies'   => true,
		   'enable_urls'      => true,
		   'enable_sig'      => true,
		
		   'message'      => $my_text,
		   'message_md5'   => md5($my_text),
		           
		   'bbcode_bitfield'   => $bitfield,
		   'bbcode_uid'      => $uid,
		
		   'post_edit_locked'   => 0,
		   'topic_title'      => $my_subject,
		   'notify_set'      => false,
		   'notify'         => false,
		   'post_time'       => 0,
		   'forum_name'      => '',
		   'enable_indexing'   => true,
		);
		
		submit_post('post', $my_subject, '', POST_NORMAL, $poll, $data);
		
	}
	
}
Funktioniert fast einwandfrei, außer dass der Beitrag im Forum mit MEINEM User angelegt wird anstatt mit dem Bot (id=57). Wenn ich es ausgliedere in eine komplett neue Datei, dann kann ich das zwar mit Bot anlegen, allerdings werde ich mit MEINEM Account dann auch ausgeloggt, sodass ich aus dem Adminmenü fliege und auch beim eigentlichen Forum ausgeloggt bin.

Gibt es eine andere Möglichkeit, einen Bot zu nutzen UND mit meinem Account angemeldet zu bleiben?

Beste Grüße
Kimama

P.S.: Ich habe versucht, das Problem so gut wie möglich auf das Wesentliche zu reduzieren und hoffe, es ist verständlich. Wenn nicht, fragt bitte nach.

Re: Problem: Gefakter Benutzerwechsel im Skript

Verfasst: 04.06.2012 16:13
von Pyramide
Die Funktion submit_post() hat in phpBB 3.0.x leider nur eine unvollständige Entkopplung von UI und Datenstruktur - der Autor des Beitrages wird in der submit_post() hartkodiert aus der globalen Variable $user entnommen. Um als ein anderer Benutzer zu posten, musst du also soetwas machen:

Code: Alles auswählen

global $user, $db;

//eingelogte Benutzerdaten merken
$orig_userdata = $user->data;

//gewünschten Autor laden
$sql = 'SELECT * FROM ' . USERS_TABLE . ' WHERE user_id = 12345';
$result = $db->sql_query($sql);
$user->data = $db->sql_fetchrow($result);

//Beitrag erstellen
submit_post(...);

//original-Benutzerdaten wiederherstellen
$user->data = $orig_userdata;
 
Falls die beim derzeit eingelogten Benutzer vorhanden Rechte bzgl. Beitragszähler erhöhen und Beiträge ohne Freigabe erstellen im Zielforum nicht ausreichend sind, musst du das gleiche Spiel noch mit der Variable $auth machen (Ändern mit $auth->acl($user->data)).

Re: Problem: Gefakter Benutzerwechsel im Skript

Verfasst: 04.06.2012 16:17
von Kimama
Vielen Dank für die schnelle Hilfe. Funktioniert einwandfrei. :)

Re: Problem: Gefakter Benutzerwechsel im Skript

Verfasst: 04.06.2012 16:58
von Miriam
Du mußt die Variablen ein bißchen "verbiegen"; bswp. so:

In der posting.php:
  • Code: Alles auswählen

                // The last parameter tells submit_post if search indexer has to be run
                $post_data['username'] = 'Fakeuser';
                $redirect_url = submit_post($mode, $post_data['post_subject'], $post_data['username'], $post_data['topic_type'], $poll, $data, $update_message, ($update_message || $update_subject) ? true : false); 
in der includes/functions_posting.php
  • Code: Alles auswählen

    function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $update_message = true, $update_search_index = true)
    {
        global $db, $auth, $user, $config, $phpEx, $template, $phpbb_root_path;
        
        if ($username === 'Fakeuser') 
        {
            $user->data['user_id'] = 57;
        } 
Es darf natürlich keinen User namens "Fakeuser" geben, den Namen mußt Du dann halt im ACP sperren.
Der Beitrag wird dann als User mit der (hier) ID 57 abgesetzt und der Name wird nach den Eintragungen in der Usertabelle eingesetzt.

//Edit: Ich hätte nicht so viel probieren sollen *lol*