Перейти к содержанию

Форма запроса и гости

Форма запроса — то, через что люди отправляют вам новое обращение с сайта. Она находится по адресу {mount}/new (обычно /help/new), за кнопкой Contact us в справочном центре, и её можно встроить в любую страницу с помощью helpdesk_ticket_form() (см. Справочный центр и портал). Эта страница описывает форму, гостевые обращения и проверки, которые не пускают спам.

Что спрашивает форма

  • What is this about?: проект, показывается, только когда человек может отправлять больше чем в один.
  • Summary: несколько слов, до 255 символов.
  • Your message: обычный текст, любой нужной длины.
  • Attach files, когда вложения включены.
  • Публичные пользовательские поля выбранного проекта под сообщением. Когда человек выбирает проект, форма показывает поля этого проекта и скрывает остальные. Их отрисовывает partial helpdesk/partials/form-extra.html.twig.

У вошедшего человека не спрашивают имя и почту: вместо этого форма пишет «Sending as Maria Lopez · Not you? Sign out». Статьи, совпадающие с введённым текстом, показываются в панели «You may be looking for» под сообщением (см. Базу знаний).

Форма предлагает только проекты, в которых человек может открывать обращения: проекты с открытым приёмом, видимость которых позволяет ему отправлять (см. Проекты и права). Если таких нет, форма сообщает об этом. Заблокированный человек видит короткое сообщение «you can't send requests right now».

Параметр Что делает
?q= Заполняет summary, например из поиска, не давшего результатов (/help/new?q=Can't sign in).
?project= Выбирает проект по id или слагу (/help/new?project=billing).
?from= Страница, которая привела сюда; передаётся для записи «уже прочитано» в базе знаний.

Что происходит при отправке

Обращение создаётся в выбранном проекте для вошедшего человека как веб-запрос, и он попадает на него с сообщением «Thanks! We've got your request». Ждёт ли оно сначала в сортировке, зависит от настройки проекта; в любом случае человек видит его сразу.

Если чего-то не хватает, форма возвращается с введённым текстом и сообщением под каждым полем, требующим внимания («Please add a short summary.»), а браузер переходит к первому из них. Обязательное пользовательское поле, оставленное пустым, или ответ, который поле не принимает, объясняются так же. Форма, открытая слишком долго (её nonce истёк), возвращается с просьбой отправить снова; ничего не создаётся дважды.

Гостевые обращения

Когда portal.guest_submissions включён и хотя бы у одного проекта видимость public и открыт приём, форму получают и посетители без входа, с двумя дополнительными полями сверху: Your name (необязательно) и Your email (обязательно). Им предлагаются только публичные проекты. Если гостевые обращения выключены или публичных проектов нет, форма просит войти.

Гостевое обращение проходит проверки по порядку:

  1. Поля. Отсутствие summary, сообщения или почты либо неверный адрес возвращаются с сообщением под полем.
  2. Капча (portal.captcha). Отсутствующий или неверный ответ возвращается как «We couldn't confirm this came from a person. Please try sending it again.»
  3. Ограничения частоты (portal.limits): 5 обращений с одного IP-адреса в час, 5 с одного адреса электронной почты в час и 60 от всех гостей вместе в час. После лимита форма возвращается с «We've had a lot of requests from here in the last hour» (HTTP 429). Счётчики хранят хеши, а не адреса или IP.
  4. Чёрный список. Заблокированный адрес, домен или IP-адрес получает ту же страницу «Thanks, check your email», что и настоящее обращение, и ничего не создаётся, поэтому отправитель ничего не узнаёт. С человеком, которого заблокировали сотрудники, поступают так же.
  5. Оценка спама (ниже).

Затем обращение создаётся для человека с этим адресом электронной почты. Гость здесь никогда не связывается с учётной записью Grav: неизвестный адрес становится человеком только с почтой, а адрес уже известного человека получает обращение в свою запись, и на экране об этом ничего не говорится. Файлы, приложенные гостем, присоединяются к первому сообщению обращения.

Гость попадает на {mount}/new/thanks: «Thanks, we've got your request. Check your email.» Письмо client-received несёт ссылку для входа, которая открывает обращение; при первом использовании создаётся его учётная запись Grav и выполняется вход. Страница благодарности одинакова для каждого гостя, что бы ни случилось с обращением.

Спам

Каждое гостевое обращение получает оценку спама:

Признак Баллы
Заполнено скрытое поле-приманка (website) 100
Отправлено раньше чем через portal.min_submit_seconds после отрисовки формы 60
Нет действительной отметки времени (скрипт, который не загружал форму) 60
Каждая ссылка после второй 15
Каждое заблокированное слово из чёрного списка 25
Номер телефона 20, плюс 15, если сообщение почти целиком из него состоит
Каждое обращение с того же адреса за последний час с тем же текстом (не более 3) 30

Сумма решает, что произойдёт:

  • 60 и больше — спам. Обращение всё равно создаётся, чтобы не потерять присланное настоящим человеком, но ждёт в сортировке с меткой spam, и письмо-подтверждение не отправляется.
  • 30 и больше — ждёт в сортировке, как любое обращение на сортировке, и подтверждается.
  • Меньше 30 — следует настройке сортировки проекта.

Временная ловушка использует подписанную отметку в скрытом поле формы form_ts, поэтому скрипт не может отправить старое время, чтобы выглядеть терпеливым. Приманка скрыта от людей и от скринридеров.

Чёрный список

Заблокированные слова добавляют баллы к оценке спама, а не отбрасывают обращение, поэтому настоящее обращение, случайно использующее такое слово, попадает в сортировку, а не исчезает. Заблокированные адреса, домены и IP-адреса отбрасывают его.

Управляйте чёрным списком из командной строки:

bin/plugin helpdesk-pro blocklist                                  # список всех записей
bin/plugin helpdesk-pro blocklist list domain                      # список одного типа
bin/plugin helpdesk-pro blocklist add domain spam.example --note="bulk spam"
bin/plugin helpdesk-pro blocklist add ip 203.0.113.0/24
bin/plugin helpdesk-pro blocklist remove word casino

Типы — email, domain (также блокирует поддомены), ip (адрес или диапазон CIDR) и word. Значения хранятся в нижнем регистре.

Капча

portal.captcha выбирает одного из провайдеров капчи плагина Form:

Значение Что делает
cap (по умолчанию) Cap — невидимая проверка proof-of-work, которую сам плагин Form обслуживает по /forms-cap/. Без внешнего сервиса и без головоломки.
turnstile Cloudflare Turnstile с site key и секретом из настроек плагина Form.
recaptcha Google reCAPTCHA (флажок v2) с настройками плагина Form.
none Без капчи.

Без плагина Form (или выбранного провайдера) форма остаётся без капчи, а не отталкивает каждого гостя. Вошедших клиентов не спрашивают, если не включён portal.captcha_signed_in. Turnstile и reCAPTCHA отправляют ответ посетителя и его IP-адрес этим компаниям; упомяните это в уведомлении о конфиденциальности, если используете их.

Настройки

На вкладке Portal & Access настроек плагина:

Ключ По умолчанию Что делает
portal.guest_submissions true Могут ли гости вообще отправлять форму. Гостевые обращения принимают только проекты public.
portal.client_groups [] Группы Grav, в которых состоит каждая учётная запись клиента. Клиент добавляется при входе или открытии справочного центра, и группы только добавляются, никогда не удаляются. Несуществующая группа или группа, дающая доступ к админке или рабочей области, пропускается. См. Справочный центр и портал.
portal.client_store_groups [] Группы клиентов KahunaCart, в которых состоит покупатель магазина, пока он клиент службы поддержки (Client Store Groups, выбираются из групп клиентов KahunaCart; настройка появляется, только когда KahunaCart установлен и включён). Выдаются на лету и никогда не сохраняются: исчезают, когда человека отвязывают, блокируют или удаляют, а также когда вы убираете группу из списка. Сотрудники их никогда не получают. Группа клиентов также даёт групповые цены, скидки и доступ к страницам. См. Справочный центр и портал.
portal.captcha cap none, cap, turnstile или recaptcha.
portal.captcha_signed_in false Спрашивать капчу и у вошедших клиентов.
portal.min_submit_seconds 3 Гостевое обращение, отправленное раньше этого времени после открытия формы, получает баллы спама.
portal.limits.ip_per_hour 5 Гостевых обращений с одного IP-адреса в час. 0 отключает ограничение.
portal.limits.email_per_hour 5 Гостевых обращений с одного адреса электронной почты в час.
portal.limits.guest_per_hour 60 Гостевых обращений от всех вместе в час.