2013-10-20

Как я патчил Jetty

Постановка задачи

Freeswitch умеет при помощи mod_curl забирать с определенного урла диалпланы и пользователей. Это очень чуствительная информация, поэтому очень захотелось ограничить доступ к служебным урлам только с localhost.

Реализация

One does not simply restrict access
to single URL from localhost
В Jetty имеется IPAccessHandler джавадок который представляет собой сплошной вотзефак. Методом проб и ошибок выяснилось что фраза: An empty white list is treated as match all. If there is at least one entry in the white list, then a request must match a white list entry - означает ровно то что написано. Т.е. переводя на человеческий: нельзя просто так взять и ограничить доступ к одному урлу с localhost.

В итоге такая конфигурация решала задачу:
<set name="black">
    <array type="String">
        <item>-126.-.-.-|/fs/*</item>
        <item>127.0.0.2-|/fs/*</item>
        <item>128-.-.-.-|/fs/*</item>
    </array>
</set>

Хватит это терпеть

Пошел искать мейллист, нашел jetty-dev, прошел квест по регистрации и заслал enchansement proposal. Пришел Greg Wilkins, и предложил альтернативное решение: не расширять синтаксис правил фильтрации, а сделать альтернативный режим в котором правило будет применяться только если заматчился URL, для чего нужно вывернуть процесс фильтрации наизнанку.

В общем, спустя пару недель, собрался с силами и таки засел за патч. Причем код писать пришлось под убунтой: на винде я так и не смог сконпелировать исходники. Разбил патч на два: выворачивание наизнанку (потратил кучу времени на борьбу с тестовыми случаями - оказалось баг) и добавление режима.

Высокий порог вхождения

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

Читаю: подпишите CLA. Для начала нужно зарегаться, ищу, регистрируюсь, подписываю что весь код написан лично мной. Дальше: прежде чем пушить, убедитесь что создан тикет в багзилле. Оооок, создаю тикет со ссылкой на обсуждение.

Пушу в специальный репозиторий, привязанный к герриту - отлуп, ключ говорит давай. Регаю публичный ключ. Повторяю - отлуп. Не подписал, говорит CLA. Проверил - подписано, повторяю - отлуп. Пошел дальше курить, оказалось в коммите нужно указать специальным тегом, Signed-off-by себя, а ревьюер потом еще себя укажет другими тегами.

В процессе редактирования коммитов проникся интерактивным ребейзом (в hg есть аналог). Наконец заслал два патча. Которые спустя две недели Greg проверил и запушил. Успех.