PDA

Просмотр полной версии : Сессия из глобальной переменной


Sergey M Nikitin
08.01.2008, 15:32
[ЗАДАЧА РЕШЕНА]

Столкнулся с такой проблемой
Решил внедрить в свой TYPO проект SWF upload модуль.
Модуль работает по принципу AJAX, но проблема заключается в том что SWF файл не передает скрипту данные о сессии, что очень важно, есть ли какой-нибудь способ передать TYPO'е ключ сессии, чтобы он ее воспринимал на том же уровне как и ключ из COOKIE.

Что пробовал
1. Порылся в классах авторизации и наткнулся на FE_SESSION_KEY, по идеи он используется для переноса сессии с одного домена на другой но в моем случае должен был работать - не работает

2. Там же встретил проверку _GP("ftu") при передачи - не работает

3. Там же встретил проверку _GP("fe_typo_user") при передачи - не работает

4. Множество хаков - типа подмена $_COOKIE['fe_typo_user'] тоже не дало результатов, кто найдет решение, ОГРОМНОЕ СПАСИБО и модуль пользовательской загрузки в подарок с TS настройщиком и прочими вкусностями.

[РЕШЕНИЕ#2 FE_SESSION_KEY (works !!!) ]
Чтобы получить FE_SESSION_KEY дальше через USER_INT на страницу
FE_SESSION_KEY = $GLOBALS["TSFE"]->fe_user->id.
"-".md5($GLOBALS["TSFE"]->fe_user->id.
"/".$GLOBALS["TYPO3_CONF_VARS"]["SYS"]["encryptionKey"];

[РЕШЕНИЕ#1 ХАК]

Делаем не большой хак (кстати я думаю его можно сделать и другим способом "плугином"), но так просто нагляднее.

в index.php в корне добавляем перед инклюдом index_ts.php, можно добавить проверку и длину и символов, но это не принципиально.
if (isset($_POST['fe_typo_user'])) {
$_COOKIE['fe_typo_user'] = $_POST['fe_typo_user'];
}elseif (isset($_GET['fe_typo_user'])){
$_COOKIE['fe_typo_user'] = $_GET['fe_typo_user'];
}

require (PATH_tslib.'index_ts.php');

что получается: если вдруг нам передадут методом GET или POST переменную fe_typo_user то мы ее подменяем в COOKIE тем самым эмулируем то что swf клиент работает с куками.

дальше самое главное в чем в в общем и была проблема это ses_hashlock

структура таблицы fe_sessions

ses_id varchar(32) Нет
ses_name varchar(32) Нет
ses_iplock varchar(39) Нет
ses_hashlock int(11) Нет 0
ses_userid int(11) Нет 0
ses_tstamp int(11) Нет 0
ses_data blob Нет
ses_permanent tinyint(1) Нет 0

ses_hashlock служит для блокировки сессии в зависимости от браузер, так как данные передаются через swf плугин, то он отправляет пустой USER_AGENT, в результате обработчик сессии просто не может найти эту запись в базе так как ищет совершенно другой ses_hashlock

что сделать:

$TYPO3_CONF_VARS['FE']['lockHashKeyWords'] = 'useragent';

Присваиваем пустую строку в localconf.php.
$TYPO3_CONF_VARS['FE']['lockHashKeyWords'] = '';

либо меняем значение в инсталяторе как вам удобнее

УРА !!! ВСЕ РАБОТАЕТ !!!