urfaclient на C
-
- Сообщения: 120
- Зарегистрирован: Вс ноя 22, 2009 02:41
- Откуда: Чебоксары
Новая версия 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
Исправлена работа с сертификатами при подключении к версиям 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
Однако похоже неработает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
Мой "грязный хак"
по мотивам 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,
-
- Сообщения: 120
- Зарегистрирован: Вс ноя 22, 2009 02:41
- Откуда: Чебоксары
Это, похоже, ssl_ctx.c до 521008002.2?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,
https://github.com/littlesavage/ourfa/c ... 1bdd8286c4 вот это там точно есть?
да, я только сейчас увидел ваши изменения в git у меня было от 2010-12-26littlesavage писал(а): Это, похоже, ssl_ctx.c до 521008002.2?
https://github.com/littlesavage/ourfa/c ... 1bdd8286c4 вот это там точно есть?
по идее менял 3 вещи
- SSLv3_client_method(), на SSLv23_client_method() ругалось.
- SSL_CTX_use_RSAPrivateKey_file, SSL_CTX_use_PrivateKey_file не корректно почему то грузил сертификат.
- инициализацию cipher , у вас получалось ADH-RC4-MD5 для всех.
тестировал на rpcf_core_version - это похоже "админская" функция.
-
- Сообщения: 120
- Зарегистрирован: Вс ноя 22, 2009 02:41
- Откуда: Чебоксары
Можно использовать скрипт edit_account из стандартной поставки: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
Не работает
Что я не так делаю? Подскажите пожалуйста!
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
Ура!!! Все заработало! Супер! Спасибо!littlesavage писал(а):Можно использовать скрипт edit_account из стандартной поставки: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
Не работает
Что я не так делаю? Подскажите пожалуйста!
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

Вот такой perl script
при установленном флаге отладки (debug) дает
При этом ourfa_client отрабатывает нормально.
да и тут функция отрабатывает, а крашится при выходе.
Видимо где то дважды вызывается деструктор, но где .... как бы догадаться
Как отлаживать XS, я честно говоря представляю слабо....
В приципе можно жить и без debug, но иногда бывает нужен.
Код: Выделить всё
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"
Код: Выделить всё
--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---
да и тут функция отрабатывает, а крашится при выходе.
Видимо где то дважды вызывается деструктор, но где .... как бы догадаться

Как отлаживать XS, я честно говоря представляю слабо....
В приципе можно жить и без debug, но иногда бывает нужен.
-
- Сообщения: 5
- Зарегистрирован: Чт июн 10, 2010 12:08
День добрый.
Столкнулся с проблемой.
При попытке смены тарифа вываливается.
Все остальные функции работают без проблем.
Весрия UTM 5.2.1-008 update 4
Версия ourfa 521008002.2
Может кто-то сталкивался? Буду признателен за помощь в решении проблемы!
Столкнулся с проблемой.
При попытке смены тарифа вываливается.
Код: Выделить всё
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
Может кто-то сталкивался? Буду признателен за помощь в решении проблемы!
-
- Сообщения: 120
- Зарегистрирован: Вс ноя 22, 2009 02:41
- Откуда: Чебоксары
В change_user_tariff.xml есть <error comment="tariffs not linked"/> - не указан обязательный для error аттриюут code.xxxSadistxxx писал(а):День добрый.
Столкнулся с проблемой.
При попытке смены тарифа вываливается.
Все остальные функции работают без проблем.
Весрия UTM 5.2.1-008 update 4
Версия ourfa 521008002.2
Может кто-то сталкивался? Буду признателен за помощь в решении проблемы!
Попробуй заменить на <error code="12" comment="tariffs not linked"/>
-
- Сообщения: 5
- Зарегистрирован: Чт июн 10, 2010 12:08
rpcf_edit_user_new
Подскажите пожалуйста что не так:
при выполнении rpcf_edit_user_new получаю
Как правильно описывать массивы парметров ?
Код: Выделить всё
my $nh=();
$nh->{'user_id'}=10001;
$nh->{'login'}="test5";
$nh->{'password'}="test5";
$nh->{'switch_id'}=1;
$nh->{'port_number'}=33;
$nh->{'parameters_count'}=1;
$nh->{'parameters'}->[0]->{'parameter_id'}=4;
$nh->{'parameters'}->[0]->{'parameter_value'}="tst";
my $err=$utm->rpcf_edit_user_new(%{$nh});
Код: Выделить всё
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::ScriptCall::call: Function `rpcf_edit_user_new` node `ROOT`. Can not receive termination attribute
-
- Сообщения: 120
- Зарегистрирован: Вс ноя 22, 2009 02:41
- Откуда: Чебоксары
Re: rpcf_edit_user_new
Вроде, все правильно.Как правильно описывать массивы парметров ?
Я тоже сейчас попробовал на 5.2.1-008u3 вот так вот:
Код: Выделить всё
my %nh = (
user_id=>10001,
login=>'test8',
password=>'test5',
switch_id=>1,
port_number=>1,
parameters=> [
{parameter_id=>4, parameter_value=>'tst'}
]
);
my $err = $ourfa->rpcf_edit_user_new(%nh);
print Dumper($err);
Код: Выделить всё
--- api.xml.orig 2011-05-05 17:14:39.000000000 +0400
+++ api.xml 2011-05-05 17:14: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 = {
'unknown_code' => 10001,
'error_description' => 'Unknown error',
'user_id' => 0,
'error_code' => 74
};