Posted by & filed under PostgreSQL.

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

LOCK TABLE "MyTable" IN EXCLUSIVE MODE;

Не идеальное решение с точки зрения скорости, но решение, которое гарантирует, что транзакции будут выполняться только последовательно, и не перекроют друг друга.

Posted by & filed under PostgreSQL, python.

Довольно простая, но хорошая защита против sql инъекций:

sql_part=re.escape(sql_part)

В мане сказано:

re.escape(string)
Return string with all non-alphanumerics backslashed;

что подходит для нас.
P.S. Если данные передаются в UTF-8, то нужно использовать нечто другое, иначе эта функция экранирует utf-8 символы которые выходят за диапазон ascii.

Posted by & filed under python.

Или можно было озаглавить так: Merchant of BBVA, Spain
BBVA испанский банк поэтому не было манов даже на английском, только на испанском. эта инструкция должна сэкономить кучу времени.
Итак…
С начала как работает интеграция (самое основное):
Данные о товаре пересылается через POST на bbva, там пользователь вводит информацию о кредитной карте, если всё удачно то данные об операции пересылается на yourLink1.

Теперь поэтапно:

Данные должны пересылаться в xml формате.

<tpv>
  <oppago>
    <idterminal>$cheet.BBVA_ID_TERMINAL</idterminal>
    <idcomercio>$cheet.BBVA_ID_COMERCIO</idcomercio>
    <idtransaccion>$cheet.id_transaction</idtransaccion>
    <moneda>$cheet.BBVA_CURRENCY</moneda>
    <importe>$cheet.amount</importe>
    <urlcomercio>$cheet.bbva_notification</urlcomercio>
    <idioma>en</idioma>
    <pais>GB</pais>
    <urlredir>$cheet.bbva_gratitude</urlredir>
    <firma>$cheet.signature</firma>
  </oppago>
</tpv>

Где:
idterminal — id терминала (выдается в админке банка)
idcomercio — id продавца (выдается в админке банка)
idtransaccion — id операции (уникальное число, я использовал id товара)
moneda — код валюты, согласно какому-то ISO стандарту (для евро это 978)
importe — сумма, в таком формате: 25.00
urlcomercio — url, куда банк отправит потверждение платежа (в XML формате)
idioma, pais  — теги отвечающие на каком языке банк будет отображать форму
urlredir — путь, по которому будет отсылаться пользователь в случае успешной операции
firma — сигнатура, которая подтверждает, что вы это вы, а не какой либо мошенник.

Сейчас разберем поле firma:
сигнатура получается так:
signature=sha1(idterminal+idcomercio+idtransaccion+importe2+moneda+obfuscate(secret_word,secret_key))
где  

importe2=importe.replace('.','') 

  (чтобы из 25.00 получилось 2500, требование банка);
secret_word и secret_key генерируется в админке банка:
secret_word

Вот пример как они должны выглядеть:

secret_word = '69;45;4A;5F;46;45;43;5A;76;00;7B;8B;06;05;77;69;0B;1E;1F;69'
secret_key='12345678'

а obfuscate — функция для запутывания. Вот её реализация на Python:

    def obfuscate(self,pal_sec_ofuscada,clave_xor):
        trozos = pal_sec_ofuscada.split(';')
        res=""
        for (key,value) in enumerate(trozos):
            x1=ord(clave_xor[key])
            x2=int(value,16)
            r=x1^x2
            res+=chr(r)
        return res

После того как xml создан, можно его отсылать, я это делаю через форму:

<form action=»$cheet.BBVA_PAGE» method=»post» id=»payForm»>
<input type=»hidden» name=»peticion» value=»&lt;tpv&gt;&lt;oppago&gt;
&lt;idterminal&gt;$cheet.BBVA_ID_TERMINAL&lt;/idterminal&gt;
&lt;idcomercio&gt;$cheet.BBVA_ID_COMERCIO&lt;/idcomercio&gt;
&lt;idtransaccion&gt;$cheet.id_transaction&lt;/idtransaccion&gt;
&lt;moneda&gt;$cheet.BBVA_CURRENCY&lt;/moneda&gt;
&lt;importe&gt;$cheet.amount&lt;/importe&gt;
&lt;urlcomercio&gt;$cheet.bbva_notification&lt;/urlcomercio&gt;
&lt;idioma&gt;en&lt;/idioma&gt;
&lt;pais&gt;GB&lt;/pais&gt;
&lt;urlredir&gt;$cheet.bbva_gratitude&lt;/urlredir&gt;
&lt;firma&gt;$cheet.signature&lt;/firma&gt;
&lt;/oppago&gt;
&lt;/tpv&gt;»/>
</form>

xml передается в поле  «peticion», action=’https://w3.grupobbva.com/TLPV/tlpv/TLPV_pub_RecepOpModeloServidor’
После того как пользователь начал на кнопку он переходит на эту страницу: https://w3.grupobbva.com/TLPV/tlpv/TLPV_pub_RecepOpModeloServidor, где ему показывается следующая форма:

bbva1_1

Где он может ввести номер свой карточки и срок её действия (номер карточки на скрине является тестовым, в мане указано 3 номера на которых можно тестировать, это один из них)

Если наша покупка прошла удачно то получаем такое:

bbva2_2

Хотя можно получить и ошибку, в мане описано около сотни ошибок и их номера.

Замечание: Ошибку можно получить если не включен режим интеграции. Режим интеграции включается после звонка в банк, на срок от 8 часов до 5 дней.

Если покупку прошла удачно, то на адресс из тега urlcomercio  приходят данные о платеже в формате xml.

Ссылки по теме:

BBVA — http://www.bbva.com/TLBB/tlbb/jsp/esp/home/index.jsp
Админка банка —  https://tpvvirtual.bbva.es
Подробный мануал на испанском — здесь
Сайт который мне помог (на испанском) — http://blog.maeguaras.com.ar/2010/04/pasarela-de-pago-bbva-espana/

Posted by & filed under python.

Поздравляем, Вы установили русифицированную сборку WordPress. Это первая запись в Вашем блоге, Вы можете ее отредактировать или удалить.

Прямо сейчас Вы можете ознакомиться с рекомендациями после установки WordPress. Созданием этой сборки занимается команда MyWordPress. Если у Вас возникнут вопросы, будем рады ответить на них на нашем форуме.

Posted by & filed under css.

*:first-child+html

После этой части пожно ставить свои теги. Пример:

*:first-child+html p.test1 {
  background: #95FF95;
}

Проверено, работает.
Оригинальная статья — http://dimox.name/ie7_css_hack/

Posted by & filed under Apache.

Получил следующую ошибку:

"ExtractionError: Can't extract file(s) to egg cache

The following error occurred while trying to extract file(s) to the Python egg
cache:

  [Errno 13] Permission denied: '//.python-eggs'

The Python egg cache directory is currently set to:

  //.python-eggs

Perhaps your account does not have write access to this directory?  You can
change the cache directory by setting the PYTHON_EGG_CACHE environment
variable to point to an accessible directory."

Проблема проявилась при рестарте сервера, так как я раньше перезапускал сервер apache так:

service httpd restart

и в данном случае яйца питона ссылались сюда:

/var/www/.python-eggs

Проблему решил быстро и просто (хотя может и нечисто) в корне написал:

ln -s /var/www/.python-eggs /.python-eggs

Posted by & filed under Apache.

Проверка как apache разобрал конфигурационный файл для CentOS:

httpd -S

проверка правильности синтакиса файла

apachectl configtest

Posted by & filed under Linux.

Этот вариант хорош, если копировать нужно только на один ящик, если нужно копировать на несколько, то поступаем так:

В конфигурации postfix (main.cf) были внесены соответствующие изменения:

alias_database = hash:/etc/postfix/aliases
    recipient_bcc_maps = hash:/etc/postfix/recipient_bcc
    sender_bcc_maps = hash:/etc/postfix/sender_bcc

Листинг внесенных изменений:
/etc/postfix/aliases

    senderalias: test1@myhost.com, test2@myhost.com
    recipientalias: test1@myhost.com, test2@myhost.com

(после внесения изменений нужно ввести команду postalias /etc/postfix/aliases)

/etc/postfix/sender_bcc

    info@myhost.com senderalias
    reservation@myhost.com senderalias

(после внесения изменений нужно ввести команду postmap /etc/postfix/sender_bcc)

/etc/postfix/recipient_bcc
    info@myhost.com recipientalias
    reservation@myhost.com recipientalias

(после внесения изменений нужно ввести команду postmap /etc/postfix/recipient_bcc)

И в самом конце postfix reload, для того чтобы postfix подхватил настройки.

Для того чтобы добавить ещё один или несколько email адресов, для которых нужно копирование, нужно всего лишь внести изменения в /etc/postfix/aliases, и соответственно postalias /etc/postfix/aliases и postfix reload.