Установка и использование дополнительных пакетов

Сервер приложений Zope позволяет устанавливать расширения, дающие пользователям дополнительные возможности, такие как использование внешних баз данных, фильтрация и преобразование запросов, вспомогательные объектные модели для создания сайтов. Ниже описана процедура установки таких расширений и перечислен список расширений, рекомендуемых нами. Все эти расширения проверяются на совместную работу и тестируются на совместимость с текущей версией сервера. Если вы хотите расширить список поддерживаемых нами расширений, то свяжитесь с нами - cray@neural.ru.

Общее описание установки пакета расширения

Любой пакет расширения может быть установлен либо использование всем сервером, либо для использования одним из серверов. В первом случае, корневой каталог пакета (т.е. каталог содержащий файл __init__.py) должен быть скопирован в каталог :

/usr/lib/zope/lib/python/Products, 

во втором - в каталог :



/var/lib/zope/<ИМЯ ЭКЗЕМПЛЯРА СЕРВЕРА>/Products. 

В любом случае, сервер должен быть перезапущен.

Пакет расширения может быть получен в виде архива tar (в частности, в таком виде пакеты распространяет www.zope.org) или в виде rpm (в таком виде, пакеты лежат в нашем дистрибутиве). Если вы имеете дело с пакетом tar, его установка проводится следующим образом:

  1. Читаем доку на пакет, не сказано ли там что-либо иное, если не сказано, выполняем остальные пункты;

  2. cd /usr/lib/zope

  3. tar xvzf <ИМЯ ПАКЕТА>.

  4. Все ;)

Архив пакетов формируется так, что бы распаковываться от корня сервера приложений. Если вы хотите установить пакет только для экземпляра сервера, вы должны проделать иную операцию:

  1. cd /var/lib/zope/<ИМЯ ЭКЗЕМПЛЯРА СЕРВЕРА>

  2. tar xvzf <ИМЯ ФАЙЛА ПАКЕТА>

Пакеты RPM - из-за ряда ограничений, присущих как RPM так и Python, пакеты RPM устанавливаются только для всего сервера, для чего нужно отдать команду rpm -ivh <ИМЯ ПАКЕТА>. Разумеется, никто не мешает вам скопировать файлы продукта из каталога :


/usr/lib/zope/lib/python/Products

в каталог :


/var/lib/zope/<ИМЯ ЭКЗЕМПЛЯРА СЕРВЕРА>/Products,

только обязательно сотрите после этого файлы с расширением pyc :


rm -i *.pyc

по данным ряда источников, использование файлов pyc построенных в другом каталоге может приводить к сбоем в работе Python.

Есть еще один вариант пакета расширения - пакеты в форматах zexp (xml), их установка подробно описана в ImportSite.txt.

Каким бы путем вы не устанавливали пакет, как правило, в результате его установки должен появится продукт в списке продуктов стартованного сервера, получить доступ к этому списку можно введя URL :


http://zope.localdomain:8080/Control_Panel/Products/manage_main

и логин и пароль пользователя, имеющего роль "manager".

CrayFIX : Фиксация ошибок интерфейса

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

  1. Вы говорите и пишите по русски;

  2. Вы используете продукт IIGFS;

  3. Вы являетесь счастливым обладателем MSIE for Linux, ну или хотя бы for Windows;

На первом случае остановимся подробно : пакет изменяет часть файлов DTML менеджерского интерфейса таким образом, что бы для них устанавливалась кодировка, выбранная администратором сервера. Если этого не сделать, то ряд версий MS Internet Explorer не сможет сохранять результаты редактирования материалов сайта в менеджерском интерфейсе Zope в правильной кодировке.

Кроме того, пакет добавляет удобную возможность горячего отключения или включения объекта RequestDecoder, а при установленном пакете IIGFS - доступ к "закладкам".

После установки пакета вы должны задать кодировку, которая будет установлена на менеджерских страницах, для этого нужно выполнить следующее действие:

  1. Войти в папку, в которой вы хотите использовать данную кодировку, рекомендуется - в корневую папку сервера, для чего нужно ввести URL http://zope.localdomain:8080/manage_main

  2. Войти в свойства папки (вкладка Properties) http://zope.localdomain:8080/manage_propertiesForm

  3. Добавить новое свойство default_charset типа string и значением желаемой кодировки, например - koi8-r.

  4. Помните, под действием заимствования данная настройка распространяется на все вложенные папки и для ее отключения вы должны задать этот атрибут в той папке, где хотите отключить (или изменить) настройку еще раз.

Еще раз повторю - без этого пакета вы не сможете работать с сайтом на русском языке из ряда версий ряда продуктов ряда компаний, в основном - MSIE 5.0 - 5.5.

AqGuard : Защита от неограниченного заимствования

Особенностью, порождаемой концепцией заимствования в сервере приложений Zope является то, что любой сайт имеет в принципе неограниченное множество допустимых url'ов. Такие URL могут строится, например, повторением элемента пути любое количество раз. Например, для url'а :

"http://zope.locadomain/Search/Forum"

существует бесконечное множество допустимых URL'ов вида :

"http://zope.locadomain/Search/" + "Search/" * n + "Forum",

где n = [0:+inf]. Это не представляло бы проблемы, если бы не упорство роботов, выполняющих зеркалирование и индексирование сайтов и не ошибки в HTML и самих поисковых роботах: на сайте может появится ссылка на "неподвижную точку", т.е. ссылка вида

"http://zope.locadomain/Search/" + "Search/" * n + "Forum",

вызывающая получение той же самой страницы, но содержащей ссылку вида:

"http://zope.locadomain/Search/" + "Search/" * (n + 1) + "Forum",

Очевидно, робот, перешедший по такой ссылке, попадает в бесконечный цикл, что вызывает проблемы не только у самого робота, но и у сайта: при достижении n величин порядка десятков и сотен такая деятельность робота больше напоминает DoS - атаку. Характерные примеры неподвижных точек - конструкции вида:

<a href="<dtml-var URLPATH0>/<dtml-var "getId()">"> _. </a>;

<a href="<dtml-var "getId()">"> _. </a>

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

Продукт AqGuard позволяет решить проблему иначе: запретить использование url-ов в которых идентификатор одного и того же объекта повторяется больше некоторого порогового значения. Если такая ситуация обнаруживается, то AqGuard генерирует исключение AqGuardBlocked или вызывает специальный метод.

Установка и настройка AqGuard включает следующие шаги:

  1. Установить пакет как описано в начале документа;

  2. Перезапустить защищаемый экземпляр Zope командой :

    service zope restart <ИМЯ_ЭКЗЕМПЛЯРА>
    

  3. Войти в менеджерский интерфейс Zope введя URL вида http://zope.localdomain/manage;

  4. Войти в контейнер, в который вложены объекты, при отображении которых наблюдается это неприятное явление;

  5. Создать в этом контейнере объект типа AqGuard (желательно назвать его AqGuard - иначе возможны проблемы в старых версиях Zope)

  6. Войти в объект AqGuard и выбрать вкладку "Настройка";

  7. Подробно, настройка AqGuard описана в файле помощи, здесь заметим только возможность указать пороговое количество повторений объектов установкой атрибута max_repeats : с атрибутами по умолчанию AqGuard будет блокировать появление любых имен в пути при обращении к объектам ниже содержащего его контейнера более 4рех раз;

  8. Включить AqGuard установкой флага use_aqguard;

  9. Ввести запрещенный (теперь) Url что бы проверить работоспособность - вы должны увидеть страницу с ошибкой: текст ошибки может быть изменен редактированием или перекрытием DTML-метода :

    standard_error_message 
    

    или явным указанием обработчика ошибок;

Не рекомендуется оставлять в AqGuard настройки по умолчанию - это всегда работает, но далеко от оптимального;

FloodGuard : Защита от флуда

Флуд - малоприятное явление, состоящее в том, что какой-то типчик заходит к вам на сайт, пишет двадцать сообщений в гостевой книге, начинает писать сам себе сообщения в форуме или даже пытается подобрать пароль к чьей-то учетной записи. По нашему опыту, такой типчик скорее всего на ваш сайт не зайдет, но уж если зайдет, то вам придется пережить не мало неприятных минут объясняя высшему руководству вашей компании особенности протокола http, html, tcp/ip и выслушивая основные положения КЗОТ.

Продукт FloodGuard дает, возможно, не лучшее, но обобщенное решение проблемы: предоставляется возможность задать маску повторяющегося события и разрешенную частоту его повторений за указанный период времени с данного IP-адреса. Маска события включает в себя путь к объекту, возможно заданный как регулярное выражение и ноль или более имен переменных.

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

Установка и настройка

После установки пакета так, как описано в начале документа, вы должны его настроить и активировать, предприняв следующие шаги:

  1. Войти в менеджерский интерфейс Zope введя URL вида http://zope.localdomain/manage;

  2. Войти в контейнер, содержащий объекты, в отношении отображений которых может быть предпринят флуд;

  3. Создать объект типа FloodGuard (желательно с именем FloodGuard, иначе в ряде версий Zope возможны ошибки);

  4. Войти в объект FloodGuard и выбрать вкладку "Настройка";

  5. Подробно настройка описана в файле помощи, здесь отметим лишь возможность указать флаг use_referer - если он установлен, то при обращении с опознанной сигнатурой проверяется атрибут HTTP_REFERER запроса, и если он не указывает на тот же самый сайт, что и текущий, то запрос отбрасывается (это останавливает только особенно тупых злонамеренных флудеров, но их доля в общей массе может достигать заметных величин по оценке ряда экспертов (см. публикации студии Артемия Лебедева);

  6. Вы должны указать сигнатуру запроса : по умолчанию, указана сигнатура запрещающая интенсивную работу с интерфейсом менеджера;

  7. Установить флаг use_floodguard;

  8. Отдать несколько раз запрос, удовлетворяющий сигнатуре атаки;

  9. После перехода порогового значения должна отобразится страница с ошибкой, текст ошибки может быть изменен редактированием или перекрытием DTML-метода :

    standard_error_message
    

или явными указанием обработчика ошибок;

Продукт FloodGuard позволяет посмотреть лог обращений с IP-адресами. Если Zope закрыт Proxy-сервером, то прокси должен передавать IP-адрес в переменной ip, как это сделано, например, в нашем конфигурационном файле /etc/httpd/conf/zope_proxy.conf : прокси устанавливает переменную ip, если путь в URL заканчивается строчкой :ipset. Для нормальной работы FloodGuard все опознаваемые маски событий должны запрашиваться с такой строчкой и переменная ip должна быть указана в маске события : будьте внимательны в своих настройках!

Другой вариант передачи IP-адреса возможен при использовании HTTP/1.1 proxy (например apache > 1.3.27). Если такой прокси имеет место вы должны установить флаг use_http11. Подразумевается, что прокси-сервер будет передавать IP-адрес в специальном заголовке.

Какой бы способ передачи IP вы не использовали, продукт будет устанавливать в запросе переменную REMOTE_ADDR в значение равное этому адресу.

RequestDecoder : Перекодирование запросов и защита от мата ;)

Особенностью пользователей Российского интернет является не только использование шести кодировок, но и то, что из всех доступных браузеров всегда выбирается тот, который обрабатывает их наиболее кривым образом. При отсутствии ошибок, проблема кодировок полностью решается установкой заголовка charset, к сожалению, жизнь оказывается более суровой и ошибки имеют место. Устав объяснять счастливым обладателям решения от микрософт причины непристойного поведения их браузера мы написали этот продукт.

Цель продукта

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

Метод

Частотный анализ признаков.

Достижения

Работает на сайте www.f-abrika.ru, 2000 хостов в день, с тех пор как метод был применен там, я стал спать дольше на полтора часа в сутки, повысился вес, улучшилось настроение и т.п. - мне больше не нужно объяснять счастливым пользователем известной компании где и кого ошибка.

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

Установка и настройка

После обычной процедуры установки выполните следующие шаги:

  1. Войти в менеджерский интерфейс Zope введя URL вида http://zope.localdomain/manage;

  2. Войти в контейнер, содержащий объекты, при обработке запросов к которым запрос должен перекодироваться (например, корневой контейнер);

  3. Создать объект типа RequestDecoder (желательно с именем RequestDecoder, иначе в ряде версий Zope возможны ошибки);

  4. Войти в объект RequestDecoder и выбрать вкладку "Настройка";

  5. Подробно настройка описана в файлах помощи, здесь отметим лишь возможность указать флаг use_censor - если он установлен, то запрос будет проверяться на наличие матерных выражений, рекомендуем вам сбросить этот флаг, если вы хотите использовать продукт на реальном сайте : флаг введен как опция, включающая прототип продукта SemanticGuard - любые предложения по ней приветствуются;

  6. Вы должны перечислить регулярные выражения, описывающие пути к объектам, запросы к которым перекодируются. Настройки по умолчанию перекодируют запросы к менеджерскому интерфейсу;

  7. Если вы хотите что бы RequestDecoder был по умолчанию активен, вы должны установить флаг "use_decoder";

  8. Если установлен продукт CrayFIX, то в левом фрейме появится кнопка, позволяющая включить или выключить RequestDecoder для текущей сессии;

  9. Вы можете перейти на вкладку "тест" и ввести текст в неверной кодировке, протестировав таким образом перекодировщик. В текущей версии, RequestDecoder обслуживает только кодировки koi8-r и windows1251.

SemanticGuard : Семантический фильтр

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

psycopg

API для работы с базами PostgreSQL из утилит на языке Python. Должен быть установлен для использования любых продуктов Z, ориентированных на использование postgresql. Устанавливается установкой пакета rpm ;)

psycopg-ZPsycopgDA : Коннектор к базе данных postgresql

Коннектор используется для описания подключения экземпляра сервера приложений Zope к серверу баз данных postgresql. Установка требует выполнения пунктов, перечисленных в начале документа.

Несмотря на все достоинства этого продукта, он не содержит явного способа установить кодировку клиента при работе с базой данных postgresql с кодировкой, отличной от кодировки сервера. Лучший способ решения данной проблемы - добавление строчки вида :

export PGCLIENTENCODING=<КОДИРОВКА КЛИЕНТА>

в файл :

/etc/sysconfig/zope/<ИМЯ ЭКЗЕМПЛЯРА СЕРВЕРА>

подробности такого решения можно узнать в документации на postgresql.

Пожалуйста, не пытайтесь добавлять команду set clientencoding при отдаче каждого запроса : мало того что это методологически неверно, так это еще приведет к нерациональному расходу сил и трудно диагностируемым ошибкам.

MySQL-python

API для работы с базами MySQL из утилит на языке Python. Должен быть установлен для использования любых продуктов Z, ориентированных на использование mysql. Устанавливается установкой пакета rpm ;)

ZMySQLDA : Коннектор к базе данных mysql

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

Если вы считаете такой патч пакета неверным - свяжитесь с нами.

mysqlUserFolder : "Папка пользователей", хранимая в mysql

В сервере приложений Zope существует единое API для хранения учетных записей пользователей. Один из вариантов использование этого API - mysqlUserFolder, позволяющий хранить учетные записи в базе данных MySQL. Предлагаемый пакет mysqlUserFolder полностью совместим с оригинальным пакетом, но существенно доработан нами для работы в России. Подробности доработок пакета см. в документации на пакет.

Установка и настройка

После установки пакета, необходимо выполнить следующие шаги по его настройке:

  1. Создать базу MySQL под список учетных записей пользователей;

  2. Залить начальную версию базы из файла /usr/lib/zope/lib/python/Products/mysqlUserFolder/sql/create_tables.sql

  3. Войти в менеджерский интерфейс Zope введя URL вида http://zope.localdomain/manage;

  4. Войти в контейнер, в котором будут действовать учетные записи, хранимые в этой базе;

  5. Создать в этом контейнере объект типа mysqlUserFolder, объекту будет присвоен идентификатор acl_users. При создании объекта нужно указать параметры подключения к базе mysqlUserFolder;

  6. Войти в acl_users и перейти на вкладку "Manage Users";

  7. Нажать кнопку "Create User" и заполнить поля формы, в поле Role укажите Manager;

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

  9. По умолчанию, в базу пользователей добавляются две роли - Manager и Anonymous. Для более тонкой настройки прав вы должны либо добавить дополнительные роли в таблицу Roles через интерфейс командной строки MySQL, либо использовать локальные роли Zope;

Заключение

Мы рекомендуем поставить все перечисленные здесь продукты и использовать их. Мы, как водится, не гарантируем какой-либо пригодности для частных целей и не отвечаем за, ну, ни за что. Но, в процессе написания данной методички мы поставили все перечисленные продукты в перечисленном порядке - вроде работает. Успехов!