Глюк (странности) с доступом >1 юзера

Все вопросы/проблемы по установке и использовании.
tax
Сообщения: 255
Зарегистрирован: 14 ноя 2016, 15:12
Имя: Николай
Откуда: --

Глюк (странности) с доступом >1 юзера

Сообщение tax »

Сразу сразу, что БД начиналась с версии 2.5 и дошла до 2.7 , но трабл наблюдается и в 2.6

Структура. Проекты->Задачи
Сущности задачи имеет обычный набор текстовых полей, связь с сущностью справочник и поле тип пользователи для назначения задачи.
Юзеры имеют группы доступа Начальник, Исполнитель.
Доступ к сущности Задачи - Начальник - просмотр все (создание, обновление)
Исполнитель - просмотр назначенных (обновление)
А теперь самое загадочное... Нач. создаёт задачу и назначает на одного юзера - всё нормально работает.
Когда на задачу назначается более одного юзера (исполнитель), то доступ имеет только тот, кто находится 2м ( по списку). Но это не всё... юзеры не просто не могут открыть задачу. При просмотре задачи пользователь видит задачу (1-2 сек) , а после этого станица редиректит и выдаёт сообщение "Страница не найдена! Страница, которую вы открываете, не существует. " URL /index.php?module=dashboard/page_not_found
При этом задача на редактирование открывается.
В БД MySQL вижу, что для данной задачи (ИД) в поле пользователи, прописано несколько ИД нужных исполнителей.
Но хуже ещё то, что при создании новой подобной структуры доступы работают как положено.

Я подозреваю, что где-то таки не хватает прав доступа у исполнителя т.к. если назначить ему группу Начальник, то он задачу видит. Но текст ошибки такой малоинформативный, что я ХЗ к чему не хватает доступа.

Коллеги, кто сталкивался с таким глюком? уже 2й день "танцую с бубном" вокруг этой проблемы. Очень не хочется пересоздавать новую сущность и переносить контент, т.к. не уверен, что тоже гладко перенесётся.
Аватара пользователя
support
Техническая поддержка
Сообщения: 7661
Зарегистрирован: 19 окт 2014, 18:22
Имя: Харчишин Сергей
Откуда: Крым, Евпатория

Re: Глюк (странности) с доступом >1 юзера

Сообщение support »

Откройте файл modules\items\module_top.php
Найдите там строчку redirect_to('dashboard/page_not_found');
Там их несколько. Закомментируйте их. Это должно решить проблему.
tax
Сообщения: 255
Зарегистрирован: 14 ноя 2016, 15:12
Имя: Николай
Откуда: --

Re: Глюк (странности) с доступом >1 юзера

Сообщение tax »

Спасибо за подсказку.
Это решило проблему. Но хотелось бы понять источник проблемы, дабы потом самому и другим не попасть на эти грабли.
Я заметил, что ссылка страницы задачи имеет вид
/index.php?module=items/info&path=29-32/35-268&redirect_to=subentity&gotopage[953]=1
и при этом для разных юзеров окончание разное
gotopage[953]=1
ID страницы разный.

это может как-то влиять?
Аватара пользователя
support
Техническая поддержка
Сообщения: 7661
Зарегистрирован: 19 окт 2014, 18:22
Имя: Харчишин Сергей
Откуда: Крым, Евпатория

Re: Глюк (странности) с доступом >1 юзера

Сообщение support »

Проблем в том, что когда переходишь на страницу записи, не срабатывает вложенный запрос, который проверяет права доступа. Почему так происходит, не могу сказать.
tax
Сообщения: 255
Зарегистрирован: 14 ноя 2016, 15:12
Имя: Николай
Откуда: --

Re: Глюк (странности) с доступом >1 юзера

Сообщение tax »

Я могу предоставить Вам копию базы или доступ к копии сайта.
Если дадите наводки на запросы или модули, то готов поковыряться и поискать причину.
Думаю, что продолжать тему стоит через ЛС
Аватара пользователя
support
Техническая поддержка
Сообщения: 7661
Зарегистрирован: 19 окт 2014, 18:22
Имя: Харчишин Сергей
Откуда: Крым, Евпатория

Re: Глюк (странности) с доступом >1 юзера

Сообщение support »

Ну что ж, давайте попробуем разобраться. Базу вы мне уже как то давали и у меня она корректно работает.

Этап 1: найдем запрос, который не выполняется.
Зайдите в систему пользователем, у которого проблема с доступом, затем
откройте файл modules\items\module_top.php и найдите следующий код:

Код: Выделить всё

//check if item exist including access to parent item
  $item_query = db_query("select e.id from app_entity_" . $current_entity_id . " e where e.id='" . db_input($current_item_id) . "' " . records_visibility::add_access_query($current_entity_id) . " " . items::add_access_query_for_parent_entities($current_entity_id),false);
      
  if(!db_fetch_array($item_query))
  {
    redirect_to('dashboard/page_not_found');
  }
Замените его на

Код: Выделить всё

//check if item exist including access to parent item
  $item_query = db_query("select e.id from app_entity_" . $current_entity_id . " e where e.id='" . db_input($current_item_id) . "' " . records_visibility::add_access_query($current_entity_id) . " " . items::add_access_query_for_parent_entities($current_entity_id),true);
      
  if(!db_fetch_array($item_query))
  {
    exit();
    redirect_to('dashboard/page_not_found');
  }
Затем попытайтесь открыть задачу, которая дает сбой и не открывается.
В результате вместо redirect программа остановит работу и на странице будет отображен запрос, который возвращает пустой результат.

Покажите мне тут этот запрос.
tax
Сообщения: 255
Зарегистрирован: 14 ноя 2016, 15:12
Имя: Николай
Откуда: --

Re: Глюк (странности) с доступом >1 юзера

Сообщение tax »

Код заменил.
Но программа не остановилась и выполнила редирект и и вывела сообщение
Страница не найдена!
Страница, которую вы открываете, не существует.
методом исключения редиректов заметил, что ошибка устраняется когда закрываю в этом коде

Код: Выделить всё

 //if path is corret then check access to parent item including check access to other parent items
    $item_query = db_query("select e.id from app_entity_" . $parent_entity_id . " e where e.id='" . db_input($parent_entity_item_id) . "' "  . items::add_access_query($parent_entity_id,'') . ' '. items::add_access_query_for_parent_entities($parent_entity_id));

    if(!db_fetch_array($item_query))
    {
      	  redirect_to('dashboard/page_not_found');
    }
tax
Сообщения: 255
Зарегистрирован: 14 ноя 2016, 15:12
Имя: Николай
Откуда: --

Re: Глюк (странности) с доступом >1 юзера

Сообщение tax »

добавил в код остановку.
вот результат запроса

Код: Выделить всё

select e.id from app_entity_35 e where e.id='268' and ((select count(*) as total from app_entity_35_values cv where cv.items_id=e.id and cv.fields_id='402' and cv.value='17')>0 or e.created_by='17') and e.parent_item_id in (select e.id from app_entity_29 e where e.id>0 )
Аватара пользователя
support
Техническая поддержка
Сообщения: 7661
Зарегистрирован: 19 окт 2014, 18:22
Имя: Харчишин Сергей
Откуда: Крым, Евпатория

Re: Глюк (странности) с доступом >1 юзера

Сообщение support »

Хорошо, теперь открывайте phpmyadmin и выполните по очереди три запроса

1) Оригинальный запрос: результат должные быть пустой

Код: Выделить всё

select e.id from app_entity_35 e where e.id='268' and ((select count(*) as total from app_entity_35_values cv where cv.items_id=e.id and cv.fields_id='402' and cv.value='17')>0 or e.created_by='17')
2) тут мы выбираем нашу запись, соответственно одна должна быть в базе

Код: Выделить всё

select e.id from app_entity_35 e where e.id='268'
3) Тут мы выбираем значения для поля 402 (я так понимаю это поле пользователи?) и результат должен быть 1

Код: Выделить всё

select count(*) as total from app_entity_35_values cv where cv.items_id='268' and cv.fields_id='402' and cv.value='17'
Все верно?
tax
Сообщения: 255
Зарегистрирован: 14 ноя 2016, 15:12
Имя: Николай
Откуда: --

Re: Глюк (странности) с доступом >1 юзера

Сообщение tax »

Да, поле ИД (402)- тип пользователи
результат п.2
2020-06-12_01.jpg
результат п.3
2020-06-12_02.jpg
Ответить