Два вапроса свързани с Login в phpbb от сайт

pszone

Registered
Здравейте, от доста време мислех да пробвам да направя логин, с който да влизам във форума ми от страница, която не се намира в неговата директория. След като се поразтърсих малко из интернет видях как може да направя подобно нещо и го направих. Обаче се появи един проблем - идеята е когато някои се логне, например от главната страница на сайта (не на форума) да не го отвежда на главната страница на форума, а да го върне обратно на страницата, в която се е логвал. Не съм сигурен дали се изразих ясно ето защо давам един пример:

В момента е:

yoursite.com/news - от тук се логвам.
yoursite.com/forum - тук ме отвежда винаги.

Ако може искам да се получи:

yoursite.com/news - от тук се логвам.
yoursite.com/news - след като съм се логнал отново да ме върне в същата страница.

Това е кода, който използвам за логването:

Код:
<?php
<?php
define('IN_PHPBB', true); 
$phpbb_root_path = './forum/'; 
include($phpbb_root_path . 'extension.inc'); 
include($phpbb_root_path . 'common.'.$phpEx); 

// 
// Start session management 
// 
$userdata = session_pagestart($user_ip, PAGE_INDEX); 
init_userprefs($userdata); 
// 
// End session management 
//


if( $userdata['session_logged_in'] ) 
   { 
      // they're logged in, welcome them, check to see if they're admin, grab their info
	{
	$u_login_logout = 'login.'.$phpEx.'?logout=true&sid=' . $userdata['session_id'];
	$l_login_logout = $lang['Logout'] . ' [ ' . $userdata['username'] . ' ]';
}

if ( ($userdata['session_logged_in']) && (empty($gen_simple_header)) )
{
	if ( $userdata['user_new_privmsg'] )
	{
		$l_message_new = ( $userdata['user_new_privmsg'] == 1 ) ? $lang['New_pm'] : $lang['New_pms'];
		$l_privmsgs_text = sprintf($l_message_new, $userdata['user_new_privmsg']);

		if ( $userdata['user_last_privmsg'] > $userdata['user_lastvisit'] )
		{
			$sql = "UPDATE " . USERS_TABLE . "
				SET user_last_privmsg = " . $userdata['user_lastvisit'] . "
				WHERE user_id = " . $userdata['user_id'];
			if ( !$db->sql_query($sql) )
			{
				message_die(GENERAL_ERROR, 'Could not update private message new/read time for user', '', __LINE__, __FILE__, $sql);
			}

			$s_privmsg_new = 1;
			$icon_pm = $images['pm_new_msg'];
		}
		else
		{
			$s_privmsg_new = 0;
			$icon_pm = $images['pm_new_msg'];
		}
	}
	else
	{
		$l_privmsgs_text = $lang['No_new_pm'];

		$s_privmsg_new = 0;
		$icon_pm = $images['pm_no_new_msg'];
	}

	if ( $userdata['user_unread_privmsg'] )
	{
		$l_message_unread = ( $userdata['user_unread_privmsg'] == 1 ) ? $lang['Unread_pm'] : $lang['Unread_pms'];
		$l_privmsgs_text_unread = sprintf($l_message_unread, $userdata['user_unread_privmsg']);
	}
	else
	{
		$l_privmsgs_text_unread = $lang['No_unread_pm'];
	}
}
else
{
	$icon_pm = $images['pm_no_new_msg'];
	$l_privmsgs_text = $lang['Login_check_pm'];
	$l_privmsgs_text_unread = '';
	$s_privmsg_new = 0;
}

$template->assign_vars(array(
	'L_LOGIN_LOGOUT' => $l_login_logout,
	'L_PRIVATEMSGS' => $lang['Private_Messages'],
	'L_PROFILE' => $lang['Profile'],
	'PRIVATE_MESSAGE_INFO' => $l_privmsgs_text,
	'PRIVATE_MESSAGE_INFO_UNREAD' => $l_privmsgs_text_unread,
	'U_PRIVATEMSGS' => append_sid('privmsg.'.$phpEx.'?folder=inbox'),
	'U_LOGIN_LOGOUT' => append_sid($u_login_logout),
	'U_PROFILE' => append_sid('profile.'.$phpEx.'?mode=editprofile'),
			"USER_ID" => $userdata['user_id'],
		"SESSION_ID" => $userdata['session_id'],
)
	);
	
	
	$template->set_filenames(array(
		"body" => "gn_logged_in.tpl")
	);
	
	$template->pparse("body"); 
   } 
else 
       { 
	   
	   if (!isset($board_config['allow_autologin']) || $board_config['allow_autologin'] )
	{
		$template->assign_block_vars('switch_allow_autologin', array());
		$template->assign_block_vars('switch_user_logged_out.switch_allow_autologin', array());
	}
	   
	   $template->assign_vars(array(
	'S_LOGIN_ACTION' => append_sid('login.'.$phpEx),
	"PHPBB_URL" => $phpBB_url,
	"SESSION_ID" => $userdata['session_id'],
)
	);
	
               // they're logged in, welcome them, check to see if they're admin, grab their info
	$template->set_filenames(array(
		"body" => "gn_login.tpl")
	);
	
	$template->pparse("body"); 
   } 
 

?>

Дали е възможно да се направи redirect към друга страница, но така, че висчко да работи нормално.

Вторият ми въпрос е свързан с вмъкването на този мод във страниците. В момента използвам кода (долу), за да вкарам файла за логване. Опитах да го вкарам със <?php include yoursite.com/forums/login2.php"; ?> , но така мода, не може да функционира и не разпознава дали съм се логнал или не съм. Има ли някакъв вариант да се използва php include за да вмъкна файла и той да работи пълноценно. Със фрейм всичко върви безпроблемно, но ми се иска да не използвам фреймове, все пак ако няма решение, ще се налои да използвам фреймове.

Код:
<iframe src="yoursite.com/forums/login2.php" align="center" frameborder="0" width="100%" height="28" marginheight="0" marginwidth="0" name="iframe name" scrolling="no" ></iframe>

Благодаря, предварително на всички!
 

Admin

Registered
Това съм се мъчил да го правя но много почна да се бъгва форума и се отказах (по средата).

И без това съм го омазал здраво.

Не се променя само на едно място а на няколко.
Така или иначе акочовека си обърка паролата пак ще го прати в
форума нали?

А за втория въпрос...
Как ще вмъкнеш мод в кода ти?

Този мод работи само, защото е част от phpBB.
То затова е мод.. Модификация на phpBB форум.
Зависи от всички файлове и от базата данни.
Сам по себеси един мод е нищо.

Смени това със това и готово но само ако е във файловете на форума.

За да може да се ползва мода в сайта ти ще ти трябва доста писане, тестване и скубане на коси.
 

pszone

Registered
Относно първия въпрос, може лесно да го направя в случай, че е сбъркана паролата или юзъра да ми се зареди трети .tpl файл, но идеята е да се върне в същата страница от където се е логнал или поне да се опитам да го препратя на главната страница на сайта, а не на форума. Иначе в момента всикчо друго си работи отлично.

За втория въпрос, мисля, че не съм обяснил както трябва. Направих един файл login2.php, в който се намира сорсът от горния код. Сложих login2.php в директорията на форума ми. Идеята е да вмъкна файла (login2) в отделна php или html страница, която не се намира в директорията с форума. Всичко се получава, ако използвам фрейм, но просто от интерес опитах с <?php include(blabla); ?>. Тогава всичко се зареди и си пасна, но просто така не може да разпознае кога съм логнат и кога не, и винаги ми показва полетата за логване и т.н. Това е.
 

Admin

Registered
Знам, че за тебе въпроса ти е от ясен по-ясен но аз го прочетох внимателно
много пъти и не разбрах много.
Наистина.
Значи имаме някакъв файл login2.php .
Дай накакъв код...
Какво прави този login2.php?
КАк работи.
Дай някакъв линк да видя.
Значи ако е в директорията на форума разпознава потребителя а като е на друго място не го разпознава нали? това искаш да кажеш?

В първия случай по какво разпознава потребителя?
По сесиина променлива ли?
 

pszone

Registered
Да, виждам, че наистина не съм описал въпроса си както трябва. Ето за какво става дума накратко. Реших да направя login2.php, който сложих в директорията с форума. Ето и какво съдържа login2.php

Код:
<?php 
<?php 
define('IN_PHPBB', true); 
$phpbb_root_path = './forum/'; 
include($phpbb_root_path . 'extension.inc'); 
include($phpbb_root_path . 'common.'.$phpEx); 

// 
// Start session management 
// 
$userdata = session_pagestart($user_ip, PAGE_INDEX); 
init_userprefs($userdata); 
// 
// End session management 
// 


if( $userdata['session_logged_in'] ) 
   { 
      // they're logged in, welcome them, check to see if they're admin, grab their info 
   { 
   $u_login_logout = 'login.'.$phpEx.'?logout=true&sid=' . $userdata['session_id']; 
   $l_login_logout = $lang['Logout'] . ' [ ' . $userdata['username'] . ' ]'; 
} 

if ( ($userdata['session_logged_in']) && (empty($gen_simple_header)) ) 
{ 
   if ( $userdata['user_new_privmsg'] ) 
   { 
      $l_message_new = ( $userdata['user_new_privmsg'] == 1 ) ? $lang['New_pm'] : $lang['New_pms']; 
      $l_privmsgs_text = sprintf($l_message_new, $userdata['user_new_privmsg']); 

      if ( $userdata['user_last_privmsg'] > $userdata['user_lastvisit'] ) 
      { 
         $sql = "UPDATE " . USERS_TABLE . " 
            SET user_last_privmsg = " . $userdata['user_lastvisit'] . " 
            WHERE user_id = " . $userdata['user_id']; 
         if ( !$db->sql_query($sql) ) 
         { 
            message_die(GENERAL_ERROR, 'Could not update private message new/read time for user', '', __LINE__, __FILE__, $sql); 
         } 

         $s_privmsg_new = 1; 
         $icon_pm = $images['pm_new_msg']; 
      } 
      else 
      { 
         $s_privmsg_new = 0; 
         $icon_pm = $images['pm_new_msg']; 
      } 
   } 
   else 
   { 
      $l_privmsgs_text = $lang['No_new_pm']; 

      $s_privmsg_new = 0; 
      $icon_pm = $images['pm_no_new_msg']; 
   } 

   if ( $userdata['user_unread_privmsg'] ) 
   { 
      $l_message_unread = ( $userdata['user_unread_privmsg'] == 1 ) ? $lang['Unread_pm'] : $lang['Unread_pms']; 
      $l_privmsgs_text_unread = sprintf($l_message_unread, $userdata['user_unread_privmsg']); 
   } 
   else 
   { 
      $l_privmsgs_text_unread = $lang['No_unread_pm']; 
   } 
} 
else 
{ 
   $icon_pm = $images['pm_no_new_msg']; 
   $l_privmsgs_text = $lang['Login_check_pm']; 
   $l_privmsgs_text_unread = ''; 
   $s_privmsg_new = 0; 
} 

$template->assign_vars(array( 
   'L_LOGIN_LOGOUT' => $l_login_logout, 
   'L_PRIVATEMSGS' => $lang['Private_Messages'], 
   'L_PROFILE' => $lang['Profile'], 
   'PRIVATE_MESSAGE_INFO' => $l_privmsgs_text, 
   'PRIVATE_MESSAGE_INFO_UNREAD' => $l_privmsgs_text_unread, 
   'U_PRIVATEMSGS' => append_sid('privmsg.'.$phpEx.'?folder=inbox'), 
   'U_LOGIN_LOGOUT' => append_sid($u_login_logout), 
   'U_PROFILE' => append_sid('profile.'.$phpEx.'?mode=editprofile'), 
         "USER_ID" => $userdata['user_id'], 
      "SESSION_ID" => $userdata['session_id'], 
) 
   ); 
    
    
   $template->set_filenames(array( 
      "body" => "gn_logged_in.tpl") 
   ); 
    
   $template->pparse("body"); 
   } 
else 
       { 
       
      if (!isset($board_config['allow_autologin']) || $board_config['allow_autologin'] ) 
   { 
      $template->assign_block_vars('switch_allow_autologin', array()); 
      $template->assign_block_vars('switch_user_logged_out.switch_allow_autologin', array()); 
   } 
       
      $template->assign_vars(array( 
   'S_LOGIN_ACTION' => append_sid('login.'.$phpEx), 
   "PHPBB_URL" => $phpBB_url, 
   "SESSION_ID" => $userdata['session_id'], 
) 
   ); 
    
               // they're logged in, welcome them, check to see if they're admin, grab their info 
   $template->set_filenames(array( 
      "body" => "gn_login.tpl") 
   ); 
    
   $template->pparse("body"); 
   } 
  

?>

По този начин login2.php се свързва с базата данни на форума и проверя дали потребителя е влязъл или не. Ако се е логнал, той ще вижда линкове към излизане, профил и лични съобщения, а ако не е влязал, ще има полета за попълване (юзър и парола) и бутона за логване. За да вкарам този логин в страниците отделни от форума просто импортвам файла login2.php на желаното място в страницата с ето този примерен код:

Код:
<iframe src="yoursite.com/forum/login2.php" align="center" frameborder="0" width="100%" height="28" marginheight="0" marginwidth="0" name="iframe name" scrolling="no" ></iframe>

Както казах, на практика всичко работи отлично. Опитах да вкарам файла не съм iframe, а със:

Код:
<?php include yoursite.com/forums/login2.php"; ?>

но тогава след като отида на страницата, където съм вмъкнал логин2 винаги ми показва, че не съм логнат, независимо от това дали съм се логнал или не съм. Точно за това се отнасяше втория ми въпрос, защо с iframe се получава, а с <?php include.... не?

Първият въпрос беше свързан с бутона за login и линкът към logout. Идеята е когато ги натисна да не ме връща постоянно във форума, а да ме препраща към същата страница отлъдето съм влязал/илзялал или поне към друга страница, която аз задам.

EDIT: Всъщност съм допуснал смешна грешка, не трябва да се променя нищо по сорса, който дадох по-горе, защото ако направя редирект, няма да може да се логвам и излизам, така че всичко трябва да мине първо през оригиналния Login.php файл на форума. От тук следва, че трябва той да бъде променен така, че вместо да редиректва към индекса на форума да връща към страницата от която си се логвал/излизал или поне да измисля, как да го пренасоча към индекса на сайта поне.
 

Admin

Registered
С iframe винаги се получава.

То с iframe отваря прозорец в web страницата и в нея показва друга web страница.

Нещата са доста различни.


ТИ с iframe може и web tourist да вкараш и пак всичко ще работи.

:)

Незнам защо те показва винаги логнат.

Трябва да видя демо.
Няма причина да работи така и да ти показва, че ивнаги си логнат.
Логнат с какътв user?

Дай да погледна как работи.
Ще си направя един акаунт.

За редиректа ще помогна като оправиме този проблем.
 

pszone

Registered
admin, засега всичко правим и тестваме в един приятел и за това все още не мога да ти покажа демо. Все пак днес успях да се оправя почти изцяло с проблемите. Измислих вариант как да вмъкна кода в страниците така, че да го чете и сега се логва и излиза без никакви проблеми, от която и да е страница. Относно въпросът за пренасочването и той е почти решен - промених на две места оригиналния login.php фаил и сега излиза перфектно като ме пренасочва на страницата от която съм излязал, но не мога да намеря къде точно да променя за влизане. Ето част от кода на login.php файла в форума, който промених - с червено е текстът който е променен. Остава само да намеря каде пренасочва потребителя при влизане и да го променя.

login.php
// session id check
if ($sid == '' || $sid != $userdata['session_id'])
{
message_die(GENERAL_ERROR, 'Invalid_session');
}

if( $userdata['session_logged_in'] )
{
session_end($userdata['session_id'], $userdata['user_id']);
}

if (!empty($HTTP_POST_VARS['redirect']) || !empty($HTTP_GET_VARS['redirect']))
{
$url = (!empty($HTTP_POST_VARS['redirect'])) ? htmlspecialchars($HTTP_POST_VARS['redirect']) : htmlspecialchars($HTTP_GET_VARS['redirect']);
$refe=getenv("HTTP_REFERER");
header("Location: $refe");

}
else
{
$refe=getenv("HTTP_REFERER");
header("Location: $refe");

}
}
else
{
$url = ( !empty($HTTP_POST_VARS['redirect']) ) ? str_replace('&', '&', htmlspecialchars($HTTP_POST_VARS['redirect'])) : "index.$phpEx";
redirect(append_sid($url, true));
}
}
 

Admin

Registered
КАто гледам моя код на форума има едно:

index.$phpEx

това всъщност е мястото към което те редиректва:

ако ги направиш на:

../login2.$phpEx ще те редиректва точно към файла login2.php
който ти е в по горната директория.

Пробвай и ще видиш.

Може да се бъгне нещо заатова си запази един екземляр от оригиналния
login.php за да го върнеш ако се наложи.
 

pszone

Registered
Намерих къде трябва да бъде променен файлът login.php, но след като го редактирах се появи друг проблем, от който се опасявах. Ето какво промених:

login.php

$url = ( !empty($HTTP_POST_VARS['redirect']) ) ? str_replace('&', '&', htmlspecialchars($HTTP_POST_VARS['redirect'])) : "index.$phpEx";
redirect(append_sid($url, true));
}
else
{
message_die(CRITICAL_ERROR, "Couldn't start session : login", "", __LINE__, __FILE__);
}

Замених го с:

$url = ( !empty($HTTP_POST_VARS['redirect']) ) ? str_replace('&', '&', htmlspecialchars($HTTP_POST_VARS['redirect'])) : "index.$phpEx";
$refe=getenv("HTTP_REFERER");
header("Location: $refe");

}
else
{
message_die(CRITICAL_ERROR, "Couldn't start session : login", "", __LINE__, __FILE__);
}

Така когато се логвам винаги ме връща на страницата от която съм се логнал. новият проблем обаче се състои в това, че сега не мога да влеза в админ панела - като се опитам да се логна в АП ме връща отново на логин скрийна.
 

pszone

Registered
Успях да се оправя и сега всичко работи перфектно, admin все пак ти благодаря, че се опита да помогнеш. :?:
 

Горе