urfaclient на C

Технические вопросы по UTM 5.0
Ответить
littlesavage
Сообщения: 120
Зарегистрирован: Вс ноя 22, 2009 02:41
Откуда: Чебоксары

Сообщение littlesavage »

Новая версия 521008002.2.

Исправлена работа с сертификатами при подключении к версиям UTM 5.2.1-008-u3, 5.2.8-009-rc1.

Исходный код: ourfa-521008002.2.tar.gz
Windows-клиент: ourfa-521008002.2-win32.tar.gz

Strel, протестируй, плиз, новую версию. Пересобрать лучше из исходников и ourfa_client нужно запускать с ключем -S rsa_cert.
Под debian можно собрать .deb пакет командой fakeroot make -f debian/rules binary

lexab
Сообщения: 21
Зарегистрирован: Пт сен 17, 2010 11:52

Сообщение lexab »

littlesavage писал(а):Новая версия 521008002.2.

Исправлена работа с сертификатами при подключении к версиям UTM 5.2.1-008-u3, 5.2.8-009-rc1.
debian/rules binary
Однако похоже неработает

Код: Выделить всё

ourfa_client  -H localhost -l user -P pass -a rpcf_core_version -o batch -S rsa_cert -debug

Код: Выделить всё

Peer requested SSL 0x4
BIO_do_handshake() error: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure

lexab
Сообщения: 21
Зарегистрирован: Пт сен 17, 2010 11:52

Сообщение lexab »

Мой "грязный хак" :) по мотивам urfa_php

Код: Выделить всё

diff --git a/ssl_ctx.c b/ssl_ctx.c
index 800dc5d..9773916 100644
--- a/ssl_ctx.c
+++ b/ssl_ctx.c
@@ -83,7 +83,7 @@ ourfa_ssl_ctx_t *ourfa_ssl_ctx_new()
    if (res == NULL)
       return NULL;
 
-   res->ssl_ctx = SSL_CTX_new(SSLv23_client_method());
+   res->ssl_ctx = SSL_CTX_new(SSLv3_client_method()); // 008 use only ssl 3
 
    if (res->ssl_ctx == NULL) {
       free(res);
@@ -179,15 +179,18 @@ int ourfa_ssl_ctx_set_ssl_type(ourfa_ssl_ctx_t *ssl_ctx, unsigned ssl_type)
    const char *cipher_list = "ADH-RC4-MD5";
 
    assert(ssl_ctx);
+
    if (ssl_ctx->ssl_type == ssl_type)
       return OURFA_OK;
-
+// default cipher work
+/*
    if ((ssl_type != OURFA_SSL_TYPE_NONE)
 	 && SSL_CTX_set_cipher_list(ssl_ctx->ssl_ctx, cipher_list) == 0) {
       return ssl_ctx->printf_err(OURFA_ERROR_WRONG_CLIENT_CERTIFICATE, ssl_ctx->err_ctx,
 	    "SSL_CTX_set_cipher_list(""%s"") Failed",
 	    cipher_list);
    }
+*/
 
    switch (ssl_type) {
       case OURFA_SSL_TYPE_NONE:
@@ -207,11 +210,11 @@ int ourfa_ssl_ctx_set_ssl_type(ourfa_ssl_ctx_t *ssl_ctx, unsigned ssl_type)
 #endif
 	 break;
       case OURFA_SSL_TYPE_RSA_CRT:
-	 SSL_CTX_set_options(ssl_ctx->ssl_ctx, SSL_OP_NO_TLSv1 | SSL_OP_NO_SSLv2);
+         SSL_CTX_set_options(ssl_ctx->ssl_ctx, SSL_OP_NO_TLSv1 | SSL_OP_NO_SSLv2);
 #ifdef SSL_CTRL_CLEAR_OPTIONS
-	 SSL_CTX_clear_options(ssl_ctx->ssl_ctx, SSL_OP_NO_SSLv3);
+//	 SSL_CTX_clear_options(ssl_ctx->ssl_ctx, SSL_OP_NO_SSLv3); // what & sslv3 neded!
 #endif
-	 cipher_list = "RC4-MD5";
+	   cipher_list = "RC4-MD5";
 	 break;
       case OURFA_SSL_TYPE_CRT:
 	 /* XXX: Cert, key required  */
@@ -253,6 +256,10 @@ int ourfa_ssl_ctx_load_cert(ourfa_ssl_ctx_t *ssl_ctx, const char *cert)
 	    ERR_error_string(ERR_get_error(), NULL)
 	    );
    }
+   // remove server verefy
+  SSL_CTX_set_verify(ssl_ctx->ssl_ctx,SSL_VERIFY_NONE, NULL);
+/* Set the verification depth to 1 */
+   SSL_CTX_set_verify_depth(ssl_ctx->ssl_ctx,1);
 
    return OURFA_OK;
 }
@@ -286,7 +293,8 @@ int ourfa_ssl_ctx_load_private_key(ourfa_ssl_ctx_t *ssl_ctx, const char *key, co
    }
 
    /* Load private key  */
-   if (SSL_CTX_use_PrivateKey_file(ssl_ctx->ssl_ctx,
+
+   if (SSL_CTX_use_RSAPrivateKey_file(ssl_ctx->ssl_ctx, // 008 use rsa!
 	    ourfa_ssl_ctx_key(ssl_ctx),
 	    SSL_FILETYPE_PEM) == 0)
       return ssl_ctx->printf_err(OURFA_ERROR_WRONG_CLIENT_CERTIFICATE,

littlesavage
Сообщения: 120
Зарегистрирован: Вс ноя 22, 2009 02:41
Откуда: Чебоксары

Сообщение littlesavage »

lexab писал(а):Мой "грязный хак" :) по мотивам urfa_php

Код: Выделить всё

diff --git a/ssl_ctx.c b/ssl_ctx.c
index 800dc5d..9773916 100644
--- a/ssl_ctx.c
+++ b/ssl_ctx.c
    /* Load private key  */
-   if (SSL_CTX_use_PrivateKey_file(ssl_ctx->ssl_ctx,
+
+   if (SSL_CTX_use_RSAPrivateKey_file(ssl_ctx->ssl_ctx, // 008 use rsa!
 	    ourfa_ssl_ctx_key(ssl_ctx),
 	    SSL_FILETYPE_PEM) == 0)
       return ssl_ctx->printf_err(OURFA_ERROR_WRONG_CLIENT_CERTIFICATE,
Это, похоже, ssl_ctx.c до 521008002.2?
https://github.com/littlesavage/ourfa/c ... 1bdd8286c4 вот это там точно есть?

masis
Сообщения: 39
Зарегистрирован: Ср фев 18, 2009 13:30
Откуда: Н.Новгород

Сообщение masis »

littlesavage писал(а):Новая версия 521008002.2.

Исправлена работа с сертификатами при подключении к версиям UTM 5.2.1-008-u3, 5.2.8-009-rc1.
Работает! Спасибо!

strel
Сообщения: 9
Зарегистрирован: Ср мар 30, 2011 15:16
Откуда: Владимир

Сообщение strel »

я что-то не очень понимаю :-(

ourfa_client -S rsa_cert -a rpcf_block_account -account_id 2 -is_blocked 1792
Работает!

ourfa_client -S rsa_cert -a rpcf_block_account -account_id 2 -is_blocked 0
Не работает

Что я не так делаю? Подскажите пожалуйста!

lexab
Сообщения: 21
Зарегистрирован: Пт сен 17, 2010 11:52

Сообщение lexab »

littlesavage писал(а): Это, похоже, ssl_ctx.c до 521008002.2?
https://github.com/littlesavage/ourfa/c ... 1bdd8286c4 вот это там точно есть?
да, я только сейчас увидел ваши изменения в git у меня было от 2010-12-26
по идее менял 3 вещи
- SSLv3_client_method(), на SSLv23_client_method() ругалось.
- SSL_CTX_use_RSAPrivateKey_file, SSL_CTX_use_PrivateKey_file не корректно почему то грузил сертификат.
- инициализацию cipher , у вас получалось ADH-RC4-MD5 для всех.

тестировал на rpcf_core_version - это похоже "админская" функция.

littlesavage
Сообщения: 120
Зарегистрирован: Вс ноя 22, 2009 02:41
Откуда: Чебоксары

Сообщение littlesavage »

strel писал(а): ourfa_client -S rsa_cert -a rpcf_block_account -account_id 2 -is_blocked 1792
Работает!
ourfa_client -S rsa_cert -a rpcf_block_account -account_id 2 -is_blocked 0
Не работает
Что я не так делаю? Подскажите пожалуйста!
Можно использовать скрипт edit_account из стандартной поставки:
ourfa_client -S rsa_cert -a edit_account -account_id 2 -is_blocked 1792 -int_status 0
ourfa_client -S rsa_cert -a edit_account -account_id 2 -is_blocked 0 -int_status 1

strel
Сообщения: 9
Зарегистрирован: Ср мар 30, 2011 15:16
Откуда: Владимир

Сообщение strel »

littlesavage писал(а):
strel писал(а): ourfa_client -S rsa_cert -a rpcf_block_account -account_id 2 -is_blocked 1792
Работает!
ourfa_client -S rsa_cert -a rpcf_block_account -account_id 2 -is_blocked 0
Не работает
Что я не так делаю? Подскажите пожалуйста!
Можно использовать скрипт edit_account из стандартной поставки:
ourfa_client -S rsa_cert -a edit_account -account_id 2 -is_blocked 1792 -int_status 0
ourfa_client -S rsa_cert -a edit_account -account_id 2 -is_blocked 0 -int_status 1
Ура!!! Все заработало! Супер! Спасибо! :-)

lexab
Сообщения: 21
Зарегистрирован: Пт сен 17, 2010 11:52

Сообщение lexab »

Вот такой perl script

Код: Выделить всё

 
use strict;
use Ourfa;
my $utm = Ourfa->new(
    api_xml_file=>$api_xml_file,
      server=>$server,
      login=>$user,
      login_type   => 'admin',
      password=>$passwd,
     debug => $debug,
      timeout=>10,
      ssl_cert => '/netup/utm5/admin.crt',
      ssl_key  => '/netup/utm5/admin.crt',
      ssl => 'rsa_cert'
    );
my $res=$utm->rpcf_core_version();
print $res->{'core_version'},"\n"
при установленном флаге отладки (debug) дает

Код: Выделить всё

--cut----
RECEIVED FUNC OUTPUT PKT ...
pkt:  PKT_SESSION_DATA   v: 0x23 size: 0x000c attrs_cnt: 1
attr: ATTR_TERMINATION   size: 0x0004 data: 0x00000004

[b]5.2.1[/b]
SENDING TERM PKT ...
pkt:  PKT_SESSION_TERMINATE v: 0x23 size: 0x0004 attrs_cnt: 0

Argument "*Ourfa::Connection::_GEN_0" isn't numeric in null operation during global destruction.
*** glibc detected *** /usr/bin/perl: double free or corruption (!prev): 0x0a5625f0 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6(+0x6b591)[0xb76b2591]
/lib/tls/i686/cmov/libc.so.6(+0x6cde8)[0xb76b3de8]
/lib/tls/i686/cmov/libc.so.6(cfree+0x6d)[0xb76b6ecd]
/lib/tls/i686/cmov/libc.so.6(fclose+0x14a)[0xb76a2aaa]
/usr/bin/perl(Perl_PerlIO_close+0x1b)[0x8145d0b]
/usr/bin/perl(PerlIO_cleantable+0x4a)[0x8145dca]
/usr/bin/perl(PerlIO_cleanup+0x50)[0x8148300]
/usr/bin/perl(perl_destruct+0xbd3)[0x807dab3]
/usr/bin/perl(main+0x95)[0x8064325]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0xb765dbd6]
/usr/bin/perl[0x80641f1]
======= Memory map: ========
08048000-08174000 r-xp 00000000 08:03 2753419    /usr/bin/perl5.10.1
08174000-08175000 r--p 0012b000 08:03 2753419    /usr/bin/perl5.10.1
08175000-08177000 rw-p 0012c000 08:03 2753419    /usr/bin/perl5.10.1
0a16b000-0a5ee000 rw-p 00000000 00:00 0          [heap]
--cut--- 
При этом ourfa_client отрабатывает нормально.
да и тут функция отрабатывает, а крашится при выходе.
Видимо где то дважды вызывается деструктор, но где .... как бы догадаться :-)
Как отлаживать XS, я честно говоря представляю слабо....

В приципе можно жить и без debug, но иногда бывает нужен.

xxxSadistxxx
Сообщения: 5
Зарегистрирован: Чт июн 10, 2010 12:08

Сообщение xxxSadistxxx »

День добрый.
Столкнулся с проблемой.
При попытке смены тарифа вываливается.

Код: Выделить всё

ourfa_client -H "localhost" -l "init" -P "init" -S rsa_cert -a change_user_tariff --user_id=5004 --tariff_next=13 -debug
Loading config file /netup/utm5/utm5_urfaclient.cfg
Loading API XML: /netup/utm5/xml/api.xml
Loading Script XML: /netup/utm5/xml/change_user_tariff.xml
No `code` attribute of node `error`Segmentation fault (core dumped)
Все остальные функции работают без проблем.

Весрия UTM 5.2.1-008 update 4
Версия ourfa 521008002.2

Может кто-то сталкивался? Буду признателен за помощь в решении проблемы!

littlesavage
Сообщения: 120
Зарегистрирован: Вс ноя 22, 2009 02:41
Откуда: Чебоксары

Сообщение littlesavage »

xxxSadistxxx писал(а):День добрый.
Столкнулся с проблемой.
При попытке смены тарифа вываливается.
Все остальные функции работают без проблем.
Весрия UTM 5.2.1-008 update 4
Версия ourfa 521008002.2
Может кто-то сталкивался? Буду признателен за помощь в решении проблемы!
В change_user_tariff.xml есть <error comment="tariffs not linked"/> - не указан обязательный для error аттриюут code.
Попробуй заменить на <error code="12" comment="tariffs not linked"/>

xxxSadistxxx
Сообщения: 5
Зарегистрирован: Чт июн 10, 2010 12:08

Сообщение xxxSadistxxx »

littlesavage огромное спасибо! проблема решена!

lexab
Сообщения: 21
Зарегистрирован: Пт сен 17, 2010 11:52

rpcf_edit_user_new

Сообщение lexab »

Подскажите пожалуйста что не так:

Код: Выделить всё

my $nh=&#40;&#41;;
$nh->&#123;'user_id'&#125;=10001;
$nh->&#123;'login'&#125;="test5";
$nh->&#123;'password'&#125;="test5";
$nh->&#123;'switch_id'&#125;=1;
$nh->&#123;'port_number'&#125;=33;
$nh->&#123;'parameters_count'&#125;=1;
$nh->&#123;'parameters'&#125;->&#91;0&#93;->&#123;'parameter_id'&#125;=4;
$nh->&#123;'parameters'&#125;->&#91;0&#93;->&#123;'parameter_value'&#125;="tst";
my $err=$utm->rpcf_edit_user_new&#40;%&#123;$nh&#125;&#41;;
при выполнении rpcf_edit_user_new получаю

Код: Выделить всё

Received ATTR_DATA instead of ATTR_TERMINATION attribute at /usr/local/lib/perl/5.10.1/Ourfa.pm line 383.
Function `rpcf_edit_user_new` node `ROOT`. Can not receive termination attribute
Ourfa&#58;&#58;ScriptCall&#58;&#58;call&#58; Function `rpcf_edit_user_new` node `ROOT`. Can not receive termination attribute
Как правильно описывать массивы парметров ?

littlesavage
Сообщения: 120
Зарегистрирован: Вс ноя 22, 2009 02:41
Откуда: Чебоксары

Re: rpcf_edit_user_new

Сообщение littlesavage »

Как правильно описывать массивы парметров ?
Вроде, все правильно.
Я тоже сейчас попробовал на 5.2.1-008u3 вот так вот:

Код: Выделить всё

my %nh = &#40;
   user_id=>10001,
   login=>'test8',
   password=>'test5',
   switch_id=>1,
   port_number=>1,
   parameters=> &#91;
      &#123;parameter_id=>4, parameter_value=>'tst'&#125;
   &#93;
&#41;;

my $err = $ourfa->rpcf_edit_user_new&#40;%nh&#41;;

print Dumper&#40;$err&#41;;
Получил такую же ошибку. Заметил, что в случае ошибки, rpcf_edit_user_new возвращает больше данных, чем описано в схеме. В api.xml в функции после error_description нужно добавить integer:

Код: Выделить всё

--- api.xml.orig	2011-05-05 17&#58;14&#58;39.000000000 +0400
+++ api.xml	2011-05-05 17&#58;14&#58;56.000000000 +0400
@@ -5571,6 +5571,7 @@
       <if variable="user_id" value="0" condition="eq">
           <integer name="error_code"/>
 	  <string name="error_description"/>
+          <integer name="unknown_code"/>
       </if>
     </output>
   </function>
После этого результат стал такой:

Код: Выделить всё

$VAR1 = &#123;
          'unknown_code' => 10001,
          'error_description' => 'Unknown error',
          'user_id' => 0,
          'error_code' => 74
        &#125;;
Теперь сервер UTM вернул ошибку "Unknown error". Данные в биллинге у меня при этом обновились. Unknown error возвращается когда редактируются юзеры, которых уже установлены какие-то параметры. Почему биллинг правильно изменяет парамемтры и при этом возврващает ошибку, я что-то пока не пойму.

Ответить