Задание
📝 **Вопрос:** **Напишите функцию** \`safe_search(query, filter)\`, которая защищает мультиарендную RAG от класса утечки №1 — отсутствующего фильтра \`tenant_id\`.
Правила:
- Если \`фильтр\` не является словарем → поднимите \`ValueError("фильтр должен быть словарем")\`.
- Если \`tenant_id\` отсутствует ИЛИ пусто/ложно → поднимите \`ValueError("БЕЗОПАСНОСТЬ: фильтр tenant_id является обязательным и непустым")\`.
- В противном случае верните \`f"OK | {query!r} с областью действия арендатора {filter['tenant_id']!r}"\`.
Затем запустите его для четырех форм запроса (двух реальных и двух небезопасных):
\`\`\`
ОК | «Политика возврата» распространяется на «высшую точку» арендатора
ЗАБЛОКИРОВАНО | «таблица зарплат» | БЕЗОПАСНОСТЬ: фильтр tenant_id является обязательным и непустым.
ОК | «история заказов» ограничена арендатором «globex»
ЗАБЛОКИРОВАНО | «Ключи API» | БЕЗОПАСНОСТЬ: фильтр tenant_id является обязательным и непустым.
\`\`\`
Случай с пустой строкой является коварным: \`"tenant_id" в фильтре\` пройдет, но \`filter.get("tenant_id")\` возвращает ложь. **Всегда проверяйте достоверность, а не просто наличие ключа.** Неверно настроенный интерфейс, в котором по умолчанию для \`tenant_id\` установлено значение \`""\`, привел к реальным утечкам данных между арендаторами.
📋Выберите правильный ответ.
💡 **Подсказка:** Если вы не уверены, перечитайте приведенную выше теорию.