MAMP, IMAP SSL, MS Exchange 2007 и Kerberos

О, сколько умных слов в заголовке! С этим я вчера провозился долго, но решил задачку.

А столкнулся я вот с чем — в MAMP (MacOS Apache MySQL PHP) некорректно работал плагин imap.so — на любую попытку достучаться по POP3 SSL или IMAP SSL он выдавал ошибку неверной конфигурации пути к ящику. После недолгих исследований выяснилось, что модуль imap.so собран без поддержки SSL. Пришлось разбираться, как же его пересобрать под MAMP правильно. Скачал в итоге последний XCode, Command Line Tool, сорцы всего и все… Но сделал.

На этом мои приключения не закончились. Когда модуль перестал ругаться на неправильную конфигурацию, он начал ругаться на kerberos.

Kerberos error: Credentials cache file not found (try running kinit)

Информативно, мда… Опять же — пошел я в гугл и нашел, что у MS Exchange 2007/2010 имеется сей досадный баг совместимости с PHP IMAP. Надо отключить kerberos при сборке imap.so. И тут я встал в ступор — да как же это сделать?! Ну сам PHP я отконфигурировал легко, а модуль отказывался собираться без поддержки kerberos ни в какую. В два часа ночи проблема была решена. Может и не красиво я ее решил, меня опытные *никсоиды поправят, но это работает на отлично!

Поехали? Тогда нам понадобятся:

Что и куда разворачиваем?

Создаем папку /Applications/MAMP/bin/php/sources/
В принципе ее можно создать где угодно, но я вот решил собирать все в одной куче, чтобы потом при деинсталляции это удалилось вместе с ним.
В эту папку разворачиваем исходники imap и php (может еще понадобится autoconf, но об этом чуть позже)
В итоге дерево папок будет выглядеть так (на примере для php 5.4.4):

/Applications/MAMP/bin/php/sources/php.5.4.4/
/Applications/MAMP/bin/php/sources/imap-2007f/

Если не будет удаваться команда ./configure, то нам может понадобится autoconf — он находится в составе MAMP Server Components Library. Разворачиваем его, заходим в папку, куда мы его развернули исполняем:

./configure
make
make install

Теперь подготовим папки для клиента IMAP SSL.

sudo mkdir -p /usr/local/include
sudo mkdir /usr/local/lib

Сборка с поддержкой kerberos:

cd /Applications/MAMP/bin/php/sources/imap-2007f/
make osx EXTRACFLAGS="-arch i386 -arch x86_64 -g -Os -pipe -no-cpp-precomp"

sudo cp c-client/*.h /usr/local/include/
sudo cp c-client/*.c /usr/local/lib/
sudo cp c-client/c-client.a /usr/local/lib/libc-client.a

cd /Applications/MAMP/bin/php/sources/php.5.4.4/
./configure
cd ext/imap
phpize
./configure --with-imap=/Applications/MAMP/bin/php/sources/imap-2007f/ --with-kerberos --with-imap-ssl=/usr/
make

(внимание!!! обратите внимание на версию PHP API! Я столкнулся, что в MAMP Pro 2.1.1 для PHP 5.2.17 версия API отличалась от той, какую я собираю)

Сборка с отключенной поддержкой kerberos

А вот тут нам понадобится открыть на редактирование файл /Applications/MAMP/bin/php/sources/imap-2007f/Makefile и сразу после конфигурации osx дополнить еще одну конфигурации сборки

osxnk:     osxok an
              $(TOUCH) ip6
              $(BUILD) BUILDTYPE=$@ IP=$(IP6) EXTRAAUTHENTICATORS="$(EXTRAAUTHENTICATORS)" \
              SPECIALS="SSLINCLUDE=/usr/include/openssl SSLLIB=/usr/lib SSLCERTS=/System/Library/OpenSSL/certs SSLKEYS=/System/Library/OpenSSL/private"

Собираем…

cd /Applications/MAMP/bin/php/sources/imap-2007f/
make osxnk EXTRACFLAGS="-fPIC -arch i386 -arch x86_64 -g -Os -pipe -no-cpp-precomp"

sudo cp c-client/*.h /usr/local/include/
sudo cp c-client/*.c /usr/local/lib/
sudo cp c-client/c-client.a /usr/local/lib/libc-client.a

cd /Applications/MAMP/bin/php/sources/php.5.4.4/
./configure --without-kerberos
cd ext/imap
phpize
./configure --with-imap=/Applications/MAMP/bin/php/sources/imap-2007f/ --with-kerberos --with-imap-ssl=/usr/

Оппа, заметите вы — а зачем флаг —with-kerberos? Мы же без него собираем?!! А потому что есть некая ошибочка в скриптах конфигурации, поэтому нам придется перед сборкой поправить файл, который сотворит этот скрипт.

Правим файл: /Applications/MAMP/bin/php/sources/php.5.4.4/ext/imap/config.h
Ищем в нем строку #define HAVE_IMAP_KRB 1 — заменяем ее на #undef  HAVE_IMAP_KRB

Выполняем команду make

Завершаем увлекательный процесс

Если все прошло удачно, то в папке /Applications/MAMP/bin/php/sources/php.5.4.4/ext/imap/modules появится необходимый нам файлик — imap.so, его надо разместить туда, куда нужно.

cp modules/imap.so /Applications/MAMP/bin/php/php5.4.4/lib/php/extensions/no-debug-non-zts-20090626/

Помните, я сказал, что следует проконтролировать версию PHP API? Вот выделенное — она и есть.

Теперь перезапускаем MAMP (естественно его сервис Apache) и вуаля!

Добавить комментарий

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>