Добрый день!
В наследство от предыдущего админа/программиста, мне достался один веб-ресурс для внутреннего использования в Компании.
Вроде бы все работает, но недавно обнаружилась ошибка. При попытке загрузить некий файл для анализа, получаем: {host.domain.ru}/batch?op=start&id=... и заголовок: Доступ запрещен. (У вас нет доступа для просмотра этой страницы).
Сразу скажу, что я просмотрел много советов по подобной ошибке, но они не помогли. Среди советов были: редактирование конфига mysql.
Вот мой конфиг:
[mysqld]
port = 3306
socket = /Applications/MAMP/tmp/mysql/mysql.sock
skip-locking
key_buffer = 16M
max_allowed_packet = 32M
table_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
bind-address = 127.0.0.1
wait_timeout=20
были советы изменить права на папку includes и /site/default/file но они тоже не помогли.
Подскажите, плз., куда можно еще посмотреть и что "поковырять"?
Комментарии
Может нулевой юзер и юзер с uid=1 слетели в базе данных?
Ну, юзер с uid=1 - это я сам. А как проверить нулевого юзера? И что значит слетели? В самой базе данных эти юзеры есть. Может у них есть что-то, что должно быть, а нету?
В таблице user в колонке uid у админа должно быть 1 а у юзера без ничего (нулевого юзера) должно стоять 0
У меня юзеры всего один раз слетали из-за кривого дампа БД, давно было и я уже не помню точно как эти ошибки в БД выглядят.
Ну да щас залез в мускул и поставил админу 10 вместо 1 и доступ ему запрещен. Вернул обратно и доступ вернулся.
Да, и перед любыми экспериментами с БД и модулями надо делать бэкап базы, какая кривая бы она на тот момент ни бла
это все я знаю. Дело в том, что эта страница появляется не всегда, а именно при выполнении опеределённой операции. Причем как у простых пользователей, так и у админа.... Вот это и расстраивает. Чувствую, что проблема решается как-то легко, а вот куда глянуть не знаю. Только начинаю друпал изучать.
Какой операции? Операции модуля? Может модуль этот кривой
Вот что обнаружил.
Ошибка "Доступ запрещен" вызывается из модуля system. Вот кусок процедуры:
function system_batch_page() {
require_once './includes/batch.inc';
$output = _batch_page();
if ($output === FALSE) {
drupal_access_denied();
}
elseif (isset($output)) {
// Force a page without blocks or messages to
// display a list of collected messages later.
print theme('page', $output, FALSE, FALSE);
}
}
Теперь определяем, когда же $output=== FALSE
Вот кусок из batch.inc:
$batch =& batch_get();
// Retrieve the current state of batch from db.
if (isset($_REQUEST['id']) && $data = db_result(db_query("SELECT batch FROM {batch} WHERE bid = %d AND token = '%s'", $_REQUEST['id'], drupal_get_token($_REQUEST['id'])))) {
$batch = unserialize($data);
}
else {
return FALSE;
}
Т.е. модуль смотрит в таблицу batch и ищет запись, соответствующую данной сессии. НО!
Но в таблицу batch почему-то не заносится ничего, кроме поля timestamp.
Вот кусок из модуля, который вызывает "глючную" обработку:
$file = $form_state['values']['filedata'];
if ($file) {
global $user;
$account = $user;
$xlsx = new SimpleXLSX($file->filepath);
$rows = $xlsx->rows();
$max = count($rows);
$data = array_chunk($rows, variable_get('statchunk', 1000));
$operations = array();
foreach ($data AS $list) {
// $list['isLocalData'] = $isLocalData;
$operations[] = array('batch_parse_xls_process', array($list, $max));
}
$operations[] = array('batch_parse_customs_process', array($file->filename));
$batch = array(
'operations' => $operations,
'finished' => 'batch_parse_xls_finished',
'title' => t('Пакетная обработка файла'),
'init_message' => t('Пакетная обработка файла запущена.'),
'progress_message' => t('Обработано @current из @total пакетов.'),
'error_message' => t('Example Batch has encountered an error.'),
'file' => drupal_get_path('module', 'stat') . '/batch_parse_xls.inc',
);
batch_set($batch);
Вопрос теперь несколько меняется: почему в таблицу batch не заносятся данные? Ведь скорее всего из-за этого и получаю "Доступ запрещен"...
По поиску на орге и обсуждению данной ошибки (где предлагали исправить настройки MysQL) читал, что в батч не заносятся данные тогда, когда на предыдущем этапе не выполнился запрос.
Думаю, что надо поиграться с настройками MySQL - скорее всего не хватает ресурсов. К сожалению как именно - посоветовать не могу, в этом плохо разбираюсь.
phpinfo() в студию
____
А я подозреваю что модуль кривой, который обрабатывает эту операцию и передает ее батчу.
Т.е. на самом деле именно в том модуле не верно происходит разрешение доступа.
Что за модуль то? Который позволяет загружать файл для анализа!?
http://www.drupal.ru/node/79258
Ага, какой-то парсинг Excel файлов. Можт для Ubercarta импорт товаров?
Вернее каталога
значит все-таки проблема с ролями, может быть в настройках модуля стояла четко заданная роль на это действие минуя админа, а вы эту роль грохнули. Так можно сделать )
Найдите модуль который содержит эту функцию "batch_parse_xls_process" и посмотрите его функцию "modulename_access".
Осталось почитать API и узнать, что для юзера с uid == 1 все access-проверки возвращают TRUE