Posts Tagged ‘ Web

PHP 5.2 в Debian Squeezy

Иногда попадаются недосайты (так я называю самописное Г разных «крутых» дядек-пых-програмистов) которые могут работать только с php определенной версии. Вот недавно попался такой горе-сайт который может работать только с php версии 5.2 На сервере стоит Debian squeeze, в официальных репозитариях которого давно уже php5.4
Но apt позволяет очень гибко настраивать версионность пакетов, это нас и спасет. В репозиториях предыдущего релиза Debian под названием lenny пылятся нужные нам пакетики, добавим репозитарий для lenny себе в систему. У меня так:

root@srv1:~# cat /etc/apt/sources.list.d/php52.list
deb http://archive.debian.org/debian/ lenny main contrib non-free
# Volatile:
deb http://archive.debian.org/debian-volatile/ lenny/volatile main contrib non-free
root@srv1:~#

Читать полностью

Установка браузера Google Chrome в Debian

Для установки данного новомодного браузера в Debian нужно просто добавить хромовский репозитарий в sources.list, а дальше стандартными средствами установить пакет google-chrome
Все дальнейшие действия конечно же нужно выполнять из под рута.
Итак, сначала добавим репозитарий google-chrome в /etc/apt/sources.list. Можно такой командой:

root@black:~# echo -e '### Google Chrome ###'"\n"'deb http://dl.google.com/linux/chrome/deb/ stable main' > /etc/apt/sources.list.d/google-chrome.list

Для того чтобы apt не орал на то что ему нехватает gpg ключа для данного репозитария, делаем следующее:

root@black:~# wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -

После этого перечитаем пакеты в репозитариях:

root@black:~# apt-get update

Смотрим что у нас появилось теперь для установки по имени google-chrome:

root@black:~# apt-cache search google-chrome
google-chrome-beta - The web browser from Google
google-chrome-stable - The web browser from Google
google-chrome-unstable - The web browser from Google
root@black:~#

Ставим! Читать полностью

Адресная книга LDAP с дополнительными полями в Roundcube

Поставил на работе себе Roundcube в качестве Mail клента. Удобно — из любой машинки внутрисети по WEB имею доступ к своей почте 🙂 Установка самого Roundcube совсем тривиальная. Опишу очень коротко. Действуем по схеме:

  • Скачать последнюю версию из офсайта: http://www.roundcube.net/download Рекомендую качать версию stable — она гарантированно рабочая! За остальное никто не ручается 🙂
  • Розпаковать туда куда вам нужно.
  • Настроить apache
  • Установить Roundcube. Действовать согласно описанию из файлика INSTALL который есть в архиве с roundcube.

В результате проделанного выше программка у нас уже стоит — осталось только чуть настроить! Я установил себе roundcube в /opt/rouncube/ далее это будет видно 🙂

Прога у меня заработала после всего выше проделанного без каких бы то ни было проблем. Все отлично. Читаем почту … отправляем. Рулим сообщениями, папками, подписями и тд. Все очень удобно и шустро. Есть адресная книга … но локальная! А захотелось всетаки LDAP-ную книгу 🙂 Вот тут и начались танцы с бубном. Менял много чего в файлике main.inc.php для того чтобы настроить саму связь с сервером LDAP и поля которые одтуда надо брать. Итак, что имеем:

Работающий roundcube версии 3.1 а хотим ничего не сломав получить еще и LDAP Address Book 🙂 желательно  с автодополнением.

Пользователь ldapuser@my.domain с паролем 123. Доменный пользователь, которому достаточно дать права только на чтение LDAP и все! Это может быть просто технический пользователь … специально созданный для таких задач 🙂

LDAP Server — controller.my.domain

Приведу изначальный вид конфига main.inc.php чтобы понять откуда надо двигаться в настройке. Вот часть которая нас интуресует:

// In order to enable public ldap search, configure an array like the Verisign
// example further below. if you would like to test, simply uncomment the example.
$rcmail_config['ldap_public'] = array();

//
// If you are going to use LDAP for individual address books, you will need to
// set 'user_specific' to true and use the variables to generate the appropriate DNs to access it.
//
// The recommended directory structure for LDAP is to store all the address book entries
// under the users main entry, e.g.:
//
//  o=root
//   ou=people
//    uid=user@domain
//  mail=contact@contactdomain
//
// So the base_dn would be uid=%fu,ou=people,o=root
// The bind_dn would be the same as based_dn or some super user login.
/*
* example config for Verisign directory
*
$rcmail_config['ldap_public']['Verisign'] = array(
  'name'          => 'Verisign.com',
  'hosts'         => array('directory.verisign.com'),
  'port'          => 389,
  'use_tls'        => false,
  'user_specific' => false,   // If true the base_dn, bind_dn and bind_pass default to the user's IMAP login.
  // %fu - The full username provided, assumes the username is an email
  //       address, uses the username_domain value if not an email address.
  // %u  - The username prior to the '@'.
  // %d  - The domain name after the '@'.
  'base_dn'       => '',
  'bind_dn'       => '',
  'bind_pass'     => '',
  'writable'      => false,   // Indicates if we can write to the LDAP directory or not.
  // If writable is true then these fields need to be populated:
  // LDAP_Object_Classes, required_fields, LDAP_rdn
  'LDAP_Object_Classes' => array("top", "inetOrgPerson"), // To create a new contact these are the object classes to specify (or any other classes you wish to use).
  'required_fields'     => array("cn", "sn", "mail"),     // The required fields needed to build a new contact as required by the object classes (can include additional fields not required by the object classes).
  'LDAP_rdn'      => 'mail', // The RDN field that is used for new entries, this field needs to be one of the search_fields, the base of base_dn is appended to the RDN to insert into the LDAP directory.
  'ldap_version'  => 3,       // using LDAPv3
  'search_fields' => array('mail', 'cn'),  // fields to search in
  'name_field'    => 'cn',    // this field represents the contact's name
  'email_field'   => 'mail',  // this field represents the contact's e-mail
  'surname_field' => 'sn',    // this field represents the contact's last name
  'firstname_field' => 'gn',  // this field represents the contact's first name
  'sort'          => 'cn',    // The field to sort the listing by.
  'scope'         => 'sub',   // search mode: sub|base|list
  'filter'        => '',      // used for basic listing (if not empty) and will be used with search queries. example: status=act
  'fuzzy_search'  => true);   // server allows wildcard search
*/


// An ordered array of the ids of the addressbooks that should be searched
// when populating address autocomplete fields server-side. ex: array('sql','Verisign');
$rcmail_config['autocomplete_addressbooks'] = array('sql');

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

$rcmail_config['ldap_public']['WORK'] = array(
  'name'          => 'WORK',
  'hosts'         => array('controller.my.domain'),
  'port'          => 389,
  'use_tls'        => false,
  'user_specific' => false,   // If true the base_dn, bind_dn and bind_pass default to the user's IMAP login.
  // %fu - The full username provided, assumes the username is an email
  //       address, uses the username_domain value if not an email address.
  // %u  - The username prior to the '@'.
  // %d  - The domain name after the '@'.
  'base_dn'       => 'ou="Domain Users", dc=my, dc=domain',
  'bind_dn'       => 'ldapuser@my.domain',
  'bind_pass'     => '123',
  'writable'      => false,   // Indicates if we can write to the LDAP directory or not.
  // If writable is true then these fields need to be populated:
  'ldap_version'  => 3,       // using LDAPv3
  'search_fields' => array('mail', 'cn'),  // fields to search in
  'name_field'    => 'cn',    // this field represents the contact's name
  'email_field'   => 'mail',  // this field represents the contact's e-mail
  'surname_field' => 'sn',    // this field represents the contact's last name
  'firstname_field' => 'gn',  // this field represents the contact's first name
  'phone_field'   => 'telephoneNumber', // telephone
  'mobile_field'  => 'mobile', //added by black_13 (mobile number)
  'company_field' => 'company', //added by black_13 (company)
  'title_field'   => 'title',
  'sort'          => 'cn',    // The field to sort the listing by.
  'scope'         => 'sub',   // search mode: sub|base|list
  'filter'        => '(&(mail=*))', // used for basic listing (if not empty) and will be used with search queries. example: status=act
  'fuzzy_search'  => true);   // server allows wildcard search

// An ordered array of the ids of the addressbooks that should be searched
// when populating address autocomplete fields server-side. ex: array('sql','Verisign');
$rcmail_config['autocomplete_addressbooks'] = array('sql','WORK');

После того как поправили вот таким образом и сохранили, пробуем перезайти в roundcube Теперь если зайти в Контакты (справа вверху) у нас должно появиться еще одна группа с названием WORK. Выбираем ее и видим список контактов взятых с LDAP. Но дополнительные поля пока что отображаться не будут … только cn, mail, sn и gn. Чтобы отобразились допольнительные поля нужно сделать следующее. Правим конфиг /opt/rouncube/program/localization/ru_RU/labels.inc Точнее добавляем туда несколько строк, я добавил в конец, перед ?> вот такое:

$labels['mobile'] = 'Мобильный телефон';
$labels['phone'] = 'Городской телефон';
$labels['company'] = 'Компания';
$labels['title'] = 'Должность';

Дальше, переходим в папку /opt/rouncube/program/steps/addressbook/ и открываем для редактирования файл show.inc В нем находим строчку:

$a_show_cols = array('name', 'firstname', 'surname', 'email');

Меняем на

$a_show_cols = array('company', 'title', 'name', 'firstname', 'surname', 'email', 'phone', 'mobile');

В нужной вам последовательности.

Тоже самое повторяем с конфигами save.inc. Находим строчку:

$a_save_cols = array('name', 'firstname', 'surname', 'email');

И меняем на

$a_save_cols = array('company', 'title', 'name', 'firstname', 'surname', 'email', 'phone', 'mobile');

Повторяем этот же финт с файликом edit.inc Правим строчку:

$a_show_cols = array('name', 'firstname', 'surname', 'email');

до вида:

$a_show_cols = array('company', 'title', 'name', 'firstname', 'surname', 'email', 'phone', 'mobile');

На этом настройка закончена 🙂 Вот скриншот того что получилось:

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

Главное что мы усвоили как это настраивается 🙂 За сим все … удачи!

Скрываем информацию про Apache2 и версию PHP

Если ктото из вас читал хоть какую-нибудь книгу или статью о взломе, тот знает, что первым делом злоумышленник пытается собрать максимально возможное количество информации о жертве, и только потом, учитывая эти данные, принимает решение про алгоритмы и инструменты для своего «черного дела».

Главным образом помогает взломщику информация о названии и версии того или иного сервиса в системе жертвы. В данном случае, я решил посмотреть какое же инфо мне готов предоставить о себе мой собственный web server.

Итак, смотрим (на приглашение сервера после успешного конекта надо ввести команду «HEAD / HTTP/1.0» и 2 раза Enter):

black@laptop ~ $ telnet my.web.server.com 80
Trying 123.123.123.123...
Connected to my.web.server.com.
Escape character is '^]'.
HEAD / HTTP/1.0

HTTP/1.1 200 OK
Date: Sun, 28 Feb 2010 09:56:18 GMT
Server: Apache/2.2.9 (Debian) PHP/5.2.6-1+lenny6 with Suhosin-Patch
X-Powered-By: PHP/5.2.6-1+lenny6
Set-Cookie: SESSd41d8cd98f00b204e9800998ecf8427e=ffffebc04d32c2e035055dd5259b2d19; expires=Tue, 23 Mar 2010 13:29:38 GMT; path=/
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Last-Modified: Sun, 28 Feb 2010 09:56:18 GMT
Cache-Control: store, no-cache, must-revalidate
Cache-Control: post-check=0, pre-check=0
Vary: Accept-Encoding
Connection: close
Content-Type: text/html; charset=utf-8

Connection closed by foreign host.
black@laptop ~ $

Как видите, информации даже через чур много, и это настрораживает. Наш собственный web server радостно готов рассказать кому угодно не только о себе но и о названии/версии системы в которой он работает. Короче, предатель еще тот 😀 Ну чтож ….  вразумить его не делать это довольно легко!

Делаем следующее:

  • переходим под root:
black:~$ su -

Enter password:
  • открываем любимым редактором главный конфигурационный файл apache2:
black:~# vim /etc/apache2/apache2.conf

конфиг довольно большой …. листаем в самый конец

  • добавляем пару вот таких опций:
### Hide Version of Apache ###
ServerTokens ProductOnly
ServerSignature Off

названия опций довольно красноречиво рассказывают о себе 🙂

  • перезагружаем apache2 одной из команд (кому что больше нравится):
black:~# apache2ctl restart

или так:

black:~# /etc/init.d/apache2 restart

И снова пробуем спросить заголовки у apache2 с помощью telnet

black@laptop ~ $ telnet my.web.server.com 80
Trying 123.123.123.123...
Connected to my.web.server.com.
Escape character is '^]'.
HEAD / HTTP/1.0

HTTP/1.1 200 OK
Date: Sun, 28 Feb 2010 09:57:57 GMT
Server: Apache
X-Powered-By: PHP/5.2.6-1+lenny6
Set-Cookie: SESSd41d8cd98f00b204e9800998ecf8427e=81a8530d7e6a33847a5542ac544dfa74; expires=Tue, 23 Mar 2010 13:31:17 GMT; path=/
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Last-Modified: Sun, 28 Feb 2010 09:57:57 GMT
Cache-Control: store, no-cache, must-revalidate
Cache-Control: post-check=0, pre-check=0
Vary: Accept-Encoding
Connection: close
Content-Type: text/html; charset=utf-8

Connection closed by foreign host.
black@laptop ~ $

Ну вот …. так то гораздо лучше, web server теперь просто и лаконично говорит что он apache … и все! Лишнее,  правда, еще болтает php. Ну тогда давайте и его уговорим не болтать все подряд про наш супер секюрный сервак 🙂

  • опять же из под root на web сервере открываем конфиг /etc/php5/apache2/php.ini любимым редактором:
black:~# vim /etc/php5/apache2/php.ini
  • ищем опцию:
expose_php = On
  • и присваиваем ей значение Off … тоесть редактируем до такого состояния:
expose_php = Off
  • сохраняем, выходим с редактора
  • перезапускаем apache2
black:~# apache2ctl restart

снова пробуем прочитать заголовки telnet-ом

black@laptop ~ $ telnet my.web.server.com 80
Trying 123.123.123.123...
Connected to my.web.server.com.
Escape character is '^]'.
HEAD / HTTP/1.0

HTTP/1.1 200 OK
Date: Sun, 28 Feb 2010 10:36:40 GMT
Server: Apache
Set-Cookie: SESSd41d8cd98f00b204e9800998ecf8427e=b37412aa627d01ed985f36207276cef2; expires=Tue, 23 Mar 2010 14:10:00 GMT; path=/
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Last-Modified: Sun, 28 Feb 2010 10:36:40 GMT
Cache-Control: store, no-cache, must-revalidate
Cache-Control: post-check=0, pre-check=0
Vary: Accept-Encoding
Connection: close
Content-Type: text/html; charset=utf-8

Connection closed by foreign host.
black@laptop ~ $

Красота! Про php теперь вообще молчок 🙂  Вот то чего я и добивался … ээээх кайф!

На последок скажу, что многие считают подобные меры предосторожности излишними, мол что такого если и подсмотрят … всеравно же софтина очень надежная и секюрность ее проверена годами! Но я всегда руководствуюсь иным принципом — «Безопасности много не бывает!» Поэтому, надеюсь помог тому кто действует по схожим принципам, а тем кто не заморачивается — может задумаются, делов то на минуту 🙂 А какерам досадно 🙂

Засим спешу откланяться! Всем удачи и супер-пупер секюрности!

Русский перевод темы Arjuna-X для WordPress

Знакомая попросила сваять для нее небольшой простенький сайтик. Конечно же сделал на WordPress. Хорошо хоть сразу предупредил что я не дизайнер, такчто с оформлением какбы не заморачивался особо. Но решил хоть тему покрасивше дефолтной поставить. Понравилась Arjuna-x … только вот она без русского перевода оказалась. Сначала даже както неповерилось — решил проверить:

black:/_some_path_/wp-content# ll themes/arjuna-x/languages/
итого 332
-rw-r--r-- 1 www-data www-data 11894 Фев  7 13:37 de_DE.mo
-rw-r--r-- 1 www-data www-data 20870 Фев  7 13:37 de_DE.po
-rw-r--r-- 1 www-data www-data   544 Фев  7 13:37 default.mo
-rw-r--r-- 1 www-data www-data 16300 Фев  7 13:37 default.pot
-rw-r--r-- 1 www-data www-data 10479 Фев  7 13:37 es_ES.mo
-rw-r--r-- 1 www-data www-data 18047 Фев  7 13:37 es_ES.po
-rw-r--r-- 1 www-data www-data 12524 Фев  7 13:37 fr_FR.mo
-rw-r--r-- 1 www-data www-data 18843 Фев  7 13:37 fr_FR.po
-rw-r--r-- 1 www-data www-data 11772 Фев  7 13:37 it_IT.mo
-rw-r--r-- 1 www-data www-data 19483 Фев  7 13:37 it_IT.po
-rw-r--r-- 1 www-data www-data 10266 Фев  7 13:37 lt_LT.mo
-rw-r--r-- 1 www-data www-data 17415 Фев  7 13:37 lt_LT.po
-rw-r--r-- 1 www-data www-data 13364 Фев  7 13:37 pt_BR.mo
-rw-r--r-- 1 www-data www-data 21131 Фев  7 13:37 pt_BR.po
-rw-r--r-- 1 www-data www-data   377 Фев  7 13:37 something.mo
-rw-r--r-- 1 www-data www-data 13675 Фев  7 13:37 something.po
-rw-r--r-- 1 www-data www-data 10604 Фев  7 13:37 zh_CN.mo
-rw-r--r-- 1 www-data www-data 32167 Фев  7 13:37 zh_CN.po
black:/_some_path_/wp-content#

Мдя уж, подумалось мне … ну чтож — надо переводить. Перед тем как взяться таки за перевод, немнжко помучил google всякими запросами на эту тему — безрезультатно. Тогда за дело!

Итак, что имеем:

  • На сервере Debian Lenny
  • На машине где я работаю стоит Gentoo 10.0 (точнее это ноут)
  • Версия WordPress — 2.9.1
  • Версия темы Arjuna-X — 1.1.4

Что нужно:

  • Сделать перевод темы с English на русский язык

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

I want to help and make this theme available in my language. How do I translate the theme properly?

Translation is rather easy. Please follow the steps below to translate the project into your own language.

  1. Download and install Poedit (availabe for Windows, Mac OS X, and Linux).
  2. Open Poedit. Click on File > New catalog from POT file… and select the default.POT file in the /languages directory of Arjuna (from the WordPress root: wp-content\themes\Arjuna\languages).
  3. Poedit will ask for some information regarding the new catalog you are about to create. Most important: Select the language that you will create. In addition, you can specify the Arjuna version that your translation applies to. The other fields are optional. There is no need to go to the other two tabs Paths or Keywords.
  4. Click OK. Poedit will then ask you to save the translated file. Save it as a valid language file. This is usually <language abbreviation>_<country code>, whereas the language abbreviation is defined in ISO 639-1 and the country code is defined in ISO 3166 alpha 2. Example: en_GB (English, Great Britain), en_US (English, United States) or de_DE (German, Germany).
  5. Once saved, all you need to do is translate each and every string by clicking on it, and translating it in the box on the very bottom of Poedit.
  6. Save the catalog by pressing CTRL + S or going to File > Save. Poedit will automatically create a .po and a .mo file.
  7. That’s it. We would appreciate if you shared your newly translated catalog with us (the .po file will be sufficient). We will make it publicly available in the next Arjuna release. Thank you.

Ну, вроде, не все так сложно, как кажется на первый взгляд 🙂 Главным инструментом для нас, как написано выше, должен быть некий poedit, который предлагают одкудато качать и ставить руками … фееее. Идем в рутовую консоль и ищем что в гентушных портах есть подобного:

laptop ~ # eix poedit
[I] app-i18n/poedit
Available versions:  1.4.2 ~1.4.3 ~1.4.4 {spell}
Installed versions:  1.4.2(13:44:19 07.02.2010)(spell)
Homepage:            http://poedit.sourceforge.net/
Description:         Cross-platform gettext catalogs (.po files) editor.
laptop ~ #

Ну вот — все оказывается под носом 🙂 Устанавливаем:

laptop ~ # emerge -av app-i18n/poedit

После сборки перегенерил меню своего e16 и прога появилась в разделе Development 🙂 Запускаем — все работает … имеет приятный внешний вид и понятный русский интерфейс. Вот скриншот:

После этого необходимо заполучить заготовки из темы Arjuna-x для перевода. Я не заморачивался особо, и стянул себе на ноут весь каталог с темой 🙂 Сделал это с помощью rsync. Вот так:

black@laptop ~ $ rsync -Par remote_user@server.net:/_some_path_/wp-content/themes/arjuna-x /home/black/mysor/www/

Ну чтож, дальше согласно интсрукции нам предлагают открыть некий файл-заготовку для перевода default.pot Открываем его с помощью свежеустановленной poedit. Как пользоваться прогой — понятно и младенцу. Просто переводим а потом делаем «Сохранить как» и в том же каталоге из которого открыли default.pot сохраняем переведенный файл под именем локали. Я сохранил как ru_RU.po при этом автоматически создастся файлик ru_RU.mo Ну вот и все. Теперь закидываем файлики назад на сервер в директорию languages. И наслаждаемся русскими надписями 🙂

О своем переводе скажу пару слов — перевел 87% если верить poedit-у Плохо знаю English — поэтому перевод чуть неполный получился. Значение некоторых фраз мне осталось непонятным … но судя по всему они неособо важны.

Выкладываю свои файлики ru_RU.po и ru_RU.mo в архивчике. Если кому надо — юзайте на здоровье!

arjune_ru.tar