понедельник, 14 августа 2017 г.

Очистка сессий в битриксе

В процессе создания кастомного функционала, пришлось хранить некоторые данные, зависящие от конкретного пользователя, в сессии.
Во время тестирования функционала на одной машине из-под разных пользователей, выяснилось, что эти установленные сессионные данные не уничтожаются при разлогинивании пользователя, а остаются в сессии. Из-за этого следующий залогиненный пользователь видит то, что ему видеть не разрешается.

В целом, данная ситуация не сильно повлияет на большинство пользователей ресурса, так как у них обычно один аккаунт и вероятность использования второго крайне мала. Тем не менее, надо сделать все правильно и убрать даже малейшую возможность того, что что-то пойдет не так. Для этого нам потребуется очищать сессионные данные в момент когда пользователь разлогинивается.

Для начала изучим код метода, разлогинивающего пользователя.
Как видно, в методе Битрикс уничтожает только собой же установленный массив данных SESS_AUTH и еще несколько ключей.
Остальные данные остаются в сессии и умирают спустя некоторое время после закрытия браузера.
Значит, требуется удалить эти данные самостоятельно.
В коде того же метода видим, что в ходе его работы возникают несколько событий, на которые можно повесить обработчик.
Выбираем, к примеру, событие OnAfterUserLogout и вешаем на него собственный обработчик, в котором удаляем сессионные данные. Например, так:

// Регистрация обработчика
AddEventHandler(
    'main',
    'OnAfterUserLogout',
    ['Some\Namespace\Here\EventHandlers', 'deleteSessionData']
);

// Собственно обработчик
public function deleteSessionData()
{
    unset($_SESSION['CUSTOM_SESSION_KEY']);

    // Явно вернем true чтобы не испытывать проблем с трактовкой результата
    return true;
}

После этого можно спать спокойно.

P.S. Как вариант, можно добавлять свои данные в ключ SESS_AUTH и тогда событие не понадобится совсем. Однако, в этом случае следует быть внимательным в выборе названия ключей, чтобы ваши данные не затерли битриксовые или наоборот.

пятница, 11 августа 2017 г.

Модификация сообщения к коммиту

Не знаю, как насчет остальных трекеров, но при интеграции гита и Redmine появляется возможность связывать коммиты с задачами в трекере. Обычно это работает следующим образом - вы указываете в тексте коммита некую последовательность символов, например, task-212, которая в дальнейшем переводится в ссылку на задачу.

Если Редмайна у вас нет или интеграция с ним не настроена, можно своими силами сделать нечто похожее. Для это нам понадобится гит-хук commit-msg.

Находим его в папке .git/hooks проекта, ставим права на исполнение и заносим в него следующий код:

#!/bin/bash

# Получаем текст коммита из файла `.git/COMMIT_EDITMSG`
INPUT_FILE=$(cat $1)

# Создаем шаблон урла для редмайна или прочего трекера
# Не забываем экранировать слеши, так как данный шаблон
# будет как есть подставлен в регулярное выражение
rePattern='https:\/\/redmine.somedomain.com\/issues\/'

# C помощью sed заменяем последовательность
# вида #ЦИФРЫ (например #212) на ссылку в трекер
# вида https://redmine.somedomain.com/issues/212
INPUT_FILE=$(sed -re "s/#([0-9]+)/${rePattern}\1/g" <<< "$INPUT_FILE")
# Перезаписываем файл `.git/COMMIT_EDITMSG` новым текстом
echo "$INPUT_FILE" > $1

exit 0


Ссылка на gist.