UTMTray альтернатива
Это пофиксено в http://www.ukhta-inform.ru/UTMTray0.1.2.87.zip (смотрите пост viewtopic.php?p=34350#34350)Pei0t писал(а):При запуске утилиты в httpd-error_logв логах утилитыКод: Выделить всё
Premature end of script headers: /usr/local/apache/cgi-bin/utm5/new/aaa5
Зайти вручную через браузер на aaa5 тоже не выходит, - 500. Когда на стандартную УТМовскую статистику попадает.Код: Выделить всё
14.05.2008 15:17:11.890 Try Get https://192.168.x.x/cgi-bin/utm5/new/aaa5?&cmd=login&login=11111&password=22222 14.05.2008 15:17:11.890 Disconnected 14.05.2008 15:17:12.156 Connected 14.05.2008 15:17:12.218 Disconnected 14.05.2008 15:17:12.218 ERROR HTTP/1.1 500 Internal Server Error
Нет, просто в aaa_login.xml пришлось оставить форму ввода логина и пароля. aaa5 не захотел без них работать. Зато удалось убрать кнопку ОкDavion писал(а):проверьте права на файлы в директории апача!!! скорее всего ошибка именно в этом

Теперь aaa_login.xml выглядит так:
Код: Выделить всё
<UTM exe="aaa" section="login" menu="aaa_menu.xml" pagetitle="M_LOGIN_TO_UTM">
<data var="login_message"/>
<dicts lstr="M_LOGIN_TO_UTM"/>
<form name="login" action="/cgi-bin/auto/aaa5" method="post">
<field type="string" name="login" prompt="M_LOGIN"/>
<field type="password" name="password" prompt="M_PASSWORD"/>
<field type="hidden" name="cmd" value="login"/>
</form>
</UTM>
Код: Выделить всё
<UTM>
<data var="login_message"/>
<form name="login" action="/cgi-bin/auto/aaa5" method="post">
<field type="string" name="login" prompt="M_LOGIN"/>
</form>
</UTM>
Я пробовал с Вашей последней сборкой, что можно попробовать, что б знать в какую сторону копать, может добиться работы через браузер? Повторюсь у меня через него даже ошибка 500.Kayfolom писал(а):Это пофиксено в http://www.ukhta-inform.ru/UTMTray0.1.2.87.zip (смотрите пост viewtopic.php?p=34350#34350)Pei0t писал(а):При запуске утилиты в httpd-error_logв логах утилитыКод: Выделить всё
Premature end of script headers: /usr/local/apache/cgi-bin/utm5/new/aaa5
Зайти вручную через браузер на aaa5 тоже не выходит, - 500. Когда на стандартную УТМовскую статистику попадает.Код: Выделить всё
14.05.2008 15:17:11.890 Try Get https://192.168.x.x/cgi-bin/utm5/new/aaa5?&cmd=login&login=11111&password=22222 14.05.2008 15:17:11.890 Disconnected 14.05.2008 15:17:12.156 Connected 14.05.2008 15:17:12.218 Disconnected 14.05.2008 15:17:12.218 ERROR HTTP/1.1 500 Internal Server Error
А aaa_login.xml вы поменяли на сервере? Попробуйте подсунуть родной aaa_login.xml . Поставте аьрибуты на aaa5 и user5 - как в родной веб морде.Pei0t писал(а):Я пробовал с Вашей последней сборкой, что можно попробовать, что б знать в какую сторону копать, может добиться работы через браузер? Повторюсь у меня через него даже ошибка 500.Kayfolom писал(а):Это пофиксено в http://www.ukhta-inform.ru/UTMTray0.1.2.87.zip (смотрите пост viewtopic.php?p=34350#34350)Pei0t писал(а):При запуске утилиты в httpd-error_logв логах утилитыКод: Выделить всё
Premature end of script headers: /usr/local/apache/cgi-bin/utm5/new/aaa5
Зайти вручную через браузер на aaa5 тоже не выходит, - 500. Когда на стандартную УТМовскую статистику попадает.Код: Выделить всё
14.05.2008 15:17:11.890 Try Get https://192.168.x.x/cgi-bin/utm5/new/aaa5?&cmd=login&login=11111&password=22222 14.05.2008 15:17:11.890 Disconnected 14.05.2008 15:17:12.156 Connected 14.05.2008 15:17:12.218 Disconnected 14.05.2008 15:17:12.218 ERROR HTTP/1.1 500 Internal Server Error
Да и версия билинга какая? Я все пробую на 005.
Права на /new/ выставлены?
При замене файла aaa5 оригинальным УТМовским - страница cgi-bin/utm5/new/aaa5 открывается с формами M_LOGIN и M_PASSWORD,
при этом лог:
если заливаешь aaa5 от utmtray - 500 в браузере и утилите.
при этом лог:
Код: Выделить всё
14.05.2008 21:15:26.718 Try Get https://192.168.xxx.xxx/cgi-bin/utm5/new/aaa5?&cmd=login&login=11111o&password=22222
14.05.2008 21:15:26.718 Disconnected
14.05.2008 21:15:26.968 Connected
14.05.2008 21:15:27.000 Disconnected
14.05.2008 21:15:27.000 Disconnected
14.05.2008 21:15:27.125 Connected
14.05.2008 21:15:27.625 ERROR Read Timeout
Конечно. Потому что на родном файле aaa5 уже стоят атрибуты, а на моем из архива нет.Pei0t писал(а):При замене файла aaa5 оригинальным УТМовским - страница cgi-bin/utm5/new/aaa5 открывается с формами M_LOGIN и M_PASSWORD,
при этом лог:если заливаешь aaa5 от utmtray - 500 в браузере и утилите.Код: Выделить всё
14.05.2008 21:15:26.718 Try Get https://192.168.xxx.xxx/cgi-bin/utm5/new/aaa5?&cmd=login&login=11111o&password=22222 14.05.2008 21:15:26.718 Disconnected 14.05.2008 21:15:26.968 Connected 14.05.2008 21:15:27.000 Disconnected 14.05.2008 21:15:27.000 Disconnected 14.05.2008 21:15:27.125 Connected 14.05.2008 21:15:27.625 ERROR Read Timeout

А на счет Read Timeout - попробуйте зайти браузером по ссылке https://192.168.xxx.xxx/cgi-bin/utm5/ne ... word=22222
Сделана более жесткая проверка ошибок GET HTTP
Сделана возможность активации карт оплаты (вроде это уже в предыдущем билде активировал).
Проверка новых сообщений теперь происходит не за последнии 7 дней, а от даты последнего сообщения в базе до текущего момента (хорошо экономиться трафик).
[MessageCheck] #Проверка новых сообщений
CheckInterval=3600000 #Милисекунды. Если 0, то не проверять сообщения - ставьте побольше, врядли пользователям каждые 10 минут шлете мессаги - нефиг базу как в родной утилите напрягать
PopUpWindow=False #Открытие окна с сообщениями при получении нового - на ваш страх и риск, многих это бесит, особенно в играх. Но для злобного неплательщика можно сделать (индивидуальным ini)
Курю мануалы php для кредитов и "мобильных переводов". Как лучше назвать услугу, аналог сотового "мобильного перевода" (чтоб юзеры деньги друг другу могли пересылать)?
Кстати может кто поможет сделать болванку php с двумя внешними функциями:
1. По https://xxx.xxx.xxx.xxx/utmtray.php?cmd ... word=yyyyy
возвращало от 0 до N (я просто пока не представляю синтаксис передачи параметров в php)
2. по https://xxx.xxx.xxx.xxx/utmtray.php?cmd ... word=yyyyy
Достаточно только обертки, без обращения к базам и прочее. Постараюсь сделать сам, чтоб никого не напрягать.
Еще нужен совет - стоит ли в утилиту втыкать отчеты? Если стоит, то какие (или все)? А то я сделал механизм, но не знаю стоит ли его активировать...
Сделана возможность активации карт оплаты (вроде это уже в предыдущем билде активировал).
Проверка новых сообщений теперь происходит не за последнии 7 дней, а от даты последнего сообщения в базе до текущего момента (хорошо экономиться трафик).
[MessageCheck] #Проверка новых сообщений
CheckInterval=3600000 #Милисекунды. Если 0, то не проверять сообщения - ставьте побольше, врядли пользователям каждые 10 минут шлете мессаги - нефиг базу как в родной утилите напрягать
PopUpWindow=False #Открытие окна с сообщениями при получении нового - на ваш страх и риск, многих это бесит, особенно в играх. Но для злобного неплательщика можно сделать (индивидуальным ini)
Курю мануалы php для кредитов и "мобильных переводов". Как лучше назвать услугу, аналог сотового "мобильного перевода" (чтоб юзеры деньги друг другу могли пересылать)?
Кстати может кто поможет сделать болванку php с двумя внешними функциями:
1. По https://xxx.xxx.xxx.xxx/utmtray.php?cmd ... word=yyyyy
возвращало от 0 до N (я просто пока не представляю синтаксис передачи параметров в php)
2. по https://xxx.xxx.xxx.xxx/utmtray.php?cmd ... word=yyyyy
Достаточно только обертки, без обращения к базам и прочее. Постараюсь сделать сам, чтоб никого не напрягать.
Еще нужен совет - стоит ли в утилиту втыкать отчеты? Если стоит, то какие (или все)? А то я сделал механизм, но не знаю стоит ли его активировать...
Накидал тут на php штуки (на редкость простой язык оказался). Но хотелось бы чтоб гуру глянули опытным взглядом, вдруг очевидные ляпы допустил.
Итак, сделал 3 файла config.php, function.php, index.php
Содержимое config.php:
Содержимое function.php:
Содержимое index.php
Работает следующим образом:
http://asd.net/?cmd=getmaxcreditsum&log ... account=66
возвращает максимально возможную сумму кредита (сумма платежей по аккаунту за $payment_interval в днях).
http://asd.net/?cmd=setcredit&login=xxx ... ditsum=350 "устанавливает" кредит, предварительно проверив нет ли в данный момент кредита на аккаунте и не превышает ли сумма желаемого кредита максимально возможную. Реально конечно пока не выставляет - не дочитал php мануал до места про запуска программ
Итак, сделал 3 файла config.php, function.php, index.php
Содержимое config.php:
Код: Выделить всё
<?php
$db_host='localhost:3306';
$db_base='UTM5';
$db_user='utmtray';
$db_password='xxxxxx';
$payment_interval='31'; //максимальная сумма кредита=сумме платежей за $payment_interval дней
$db_connect=mysql_connect($db_host,$db_user,$db_password) or die ("Connect failed");
mysql_select_db($db_base,$db_connect);
?>
Код: Выделить всё
<?php
// Возвращает Максимально возможную сумму кредита
function getmaxcreditsum($account,$payment_interval) {
$payment_interval=-$payment_interval;
$query = "SELECT SUM(payment_incurrency) as monthpayment FROM
payment_transactions WHERE payment_enter_date>=UNIX_TIMESTAMP(DATE_ADD(NOW(),INTERVAL $payment_interval DAY))
and account_id=$account";
return mysql_result(mysql_query($query),0,"monthpayment");
}
// Возвращает 1 если кредит уже есть
function already_credit($account) {
$payment_interval=-$payment_interval;
$query = "SELECT credit FROM accounts WHERE is_deleted<>'1' AND id=$account";
$result = @mysql_result(@mysql_query($query),0,"credit");
return $result>0;
}
// Возвращает 1 если возможно сделать кредит
function possibility_credit($account,$creditsum,$payment_interval) {
$result=0;
print "possibility_credit:";
if (already_credit($account)<>1) {
print "already_credit ".already_credit($account)."<BR>";
if (getmaxcreditsum($account,$payment_interval)>=$creditsum) {
print "getmaxcreditsum ".getmaxcreditsum($account,$payment_interval)."<BR>";
$result=1;
}
}
return $result;
}
// Возвращает пароль по логину
function get_password($login) {
$query = "Select password From users Where is_deleted<>'1' AND login='$login'";
return @mysql_result(@mysql_query($query),0,"password");
}
?>
Код: Выделить всё
<?php
include ('config.php');
include ('function.php');
$cmd = $_GET['cmd'];
$login = $_GET['login'];
$password = $_GET['password'];
$account = $_GET['account'];
$creditsum = $_GET['creditsum'];
if (strcmp(get_password($login),$password)) {
print "ACCESS DENIED";
} else {
// Если команда getmaxcreditsum
if (!strcmp($cmd,"getmaxcreditsum")) {
print getmaxcreditsum($account,$payment_interval);
}
// Если команда setcredit
if (!strcmp($cmd,"setcredit")) {
if (possibility_credit($account,$creditsum,$payment_interval)==1) {
print "Ура, ставим кредит ".$creditsum."р.<BR>";
} else {
print "Нет, не ставим кредит ".$creditsum."р.<BR>";
}
}
}
?>
http://asd.net/?cmd=getmaxcreditsum&log ... account=66
возвращает максимально возможную сумму кредита (сумма платежей по аккаунту за $payment_interval в днях).
http://asd.net/?cmd=setcredit&login=xxx ... ditsum=350 "устанавливает" кредит, предварительно проверив нет ли в данный момент кредита на аккаунте и не превышает ли сумма желаемого кредита максимально возможную. Реально конечно пока не выставляет - не дочитал php мануал до места про запуска программ

Функции already_credit () и getmaxcreditsum () дырявые
Проверяйте параметр $account функцией is_string и ctype_digit либо is_integer, а в запрос сажайте только в апострофах, простая вставка без проверок чревата SQL инъекциями. Впрочем если данные из доверенного источника (то есть не с пользовательской формочки), то достаточно в апострофы посадить.
Такой же недосмотр и в getmaxcreditsum ()
Проверяйте параметр $account функцией is_string и ctype_digit либо is_integer, а в запрос сажайте только в апострофах, простая вставка без проверок чревата SQL инъекциями. Впрочем если данные из доверенного источника (то есть не с пользовательской формочки), то достаточно в апострофы посадить.
Такой же недосмотр и в getmaxcreditsum ()
А можно пример про апострофы ? Как именно? Я путаюсь что такое апострофы - двойные кавычки?JAO писал(а):Функции already_credit () и getmaxcreditsum () дырявые
Проверяйте параметр $account функцией is_string и ctype_digit либо is_integer, а в запрос сажайте только в апострофах, простая вставка без проверок чревата SQL инъекциями. Впрочем если данные из доверенного источника (то есть не с пользовательской формочки), то достаточно в апострофы посадить.
Такой же недосмотр и в getmaxcreditsum ()
Готовый вариант. С тремя функциями:
cmd=getmaxcreditsum&login=xxxx&password=yyyyy&account=66
возвращает максимально возможную сумму кредита (сумма платежей по аккаунту за $payment_interval в днях).
cmd=setcredit&login=xxxx&password=yyyyy&account=661&creditsum=350 "устанавливает" кредит, предварительно проверив нет ли в данный момент кредита на аккаунте и не превышает ли сумма желаемого кредита максимально возможную.
cmd=checkexpiredcredit проверяет кредиты в таблице utmtray_credits и удаляет просроченные (в самой таблице помечает is_deleted=1).
Проверил, работает нормально. Багофичи буду вычислять в процессе отладки утилиты.
config.php
function.php
index.php
Таблица для хранения инфы по текущим и удаленным кредитам utmtray_credits.sql
cmd=getmaxcreditsum&login=xxxx&password=yyyyy&account=66
возвращает максимально возможную сумму кредита (сумма платежей по аккаунту за $payment_interval в днях).
cmd=setcredit&login=xxxx&password=yyyyy&account=661&creditsum=350 "устанавливает" кредит, предварительно проверив нет ли в данный момент кредита на аккаунте и не превышает ли сумма желаемого кредита максимально возможную.
cmd=checkexpiredcredit проверяет кредиты в таблице utmtray_credits и удаляет просроченные (в самой таблице помечает is_deleted=1).
Проверил, работает нормально. Багофичи буду вычислять в процессе отладки утилиты.
config.php
Код: Выделить всё
<?php
$db_host='localhost:3306';
$db_base='UTM5';
$db_user='utmtray';
$db_password='utmtray';
$java_path='java';
$u5sh_path='/netup/u5sh/u5sh.jar'; // Исправить пути на свои
$UTMCore_Login='utmtray';
$UTMCore_Password='utmtray';
$UTMCoreHost='127.0.0.1';
$UTMCorePort='11758';
$payment_interval='31'; //максимальная сумма кредита=сумме платежей за $payment_interval дней
$length_credit=14; //Срок кредита в днях
$db_connect=mysql_connect($db_host,$db_user,$db_password) or die ("Connect failed");
mysql_select_db($db_base,$db_connect);
?>
Код: Выделить всё
<?php
// Возвращает Максимально возможную сумму кредита
function getmaxcreditsum($account,$payment_interval) {
$payment_interval=-$payment_interval;
$query = "SELECT SUM(payment_incurrency) as monthpayment FROM payment_transactions WHERE payment_enter_date>=UNIX_TIMESTAMP(DATE_ADD(NOW(),INTERVAL $payment_interval DAY)) and account_id=$account";
return mysql_result(mysql_query($query),0,"monthpayment");
}
// Возвращает 1 если кредит уже есть
function already_credit($account) {
$payment_interval=-$payment_interval;
$query = "SELECT credit FROM accounts WHERE is_deleted<>'1' AND id=$account";
$result = @mysql_result(@mysql_query($query),0,"credit");
return $result>0;
}
// Возвращает 1 если возможно сделать кредит
function possibility_credit($account,$creditsum,$payment_interval) {
$result=0;
if (already_credit($account)<>1) {
if (getmaxcreditsum($account,$payment_interval)>=$creditsum) {
$result=1;
}
}
return $result;
}
// Возвращает пароль по логину
function get_password($login) {
$query = "Select password From users Where is_deleted<>'1' AND login='$login'";
return @mysql_result(@mysql_query($query),0,"password");
}
// Устанавливает кредит для $account на сумму $creditsum продолжительностью $length_credit
function set_credit($account,$creditsum,$length_credit,$u5sh_run) {
$query = "INSERT INTO utmtray_credits (account, summa, startdate, stopdate, is_deleted) VALUES ($account, $creditsum, UNIX_TIMESTAMP(NOW()), UNIX_TIMESTAMP(DATE_ADD(NOW(),INTERVAL $length_credit DAY)) ,0)";
@mysql_query($query);
$command_string=$u5sh_run." --ChangeAccount -aid $account -credit $creditsum";
exec($command_string, $sa, $sr);
return 0;
}
//Проверяет просроченные кредиты и аннулирует их
function check_expired_credit($u5sh_run) {
$query="Select id, account From utmtray_credits Where stopdate<UNIX_TIMESTAMP(Now()) and is_deleted<>1";
$result=@mysql_query($query);
while($row=mysql_fetch_array($result)) {
$command_string=$u5sh_run." --ChangeAccount -aid ".$row["account"]." -credit 0";
$query="UPDATE utmtray_credits SET is_deleted=1 Where id=".$row["id"];
exec($command_string, $sa, $sr);
@mysql_query($query);
};
return 0;
}
?>
Код: Выделить всё
<?php
include ('config.php');
include ('function.php');
$cmd = $_GET['cmd'];
$login = $_GET['login'];
$password = $_GET['password'];
$account = $_GET['account'];
$creditsum = $_GET['creditsum'];
$u5sh_run="$java_path -jar $u5sh_path --AdminLogin $UTMCore_Login --AdminPass $UTMCore_Password --CoreHost $UTMCoreHost --CorePort $UTMCorePort";
if (strcmp(get_password($login),$password)) {
print "ACCESS DENIED";
} else {
// Если команда getmaxcreditsum
if (!strcmp($cmd,"getmaxcreditsum")) {
print getmaxcreditsum($account,$payment_interval);
}
// Если команда setcredit
if (!strcmp($cmd,"setcredit")) {
if (possibility_credit($account,$creditsum,$payment_interval)==1) {
set_credit($account,$creditsum,$length_credit,$u5sh_run);
} else {
print "ABORT";
}
}
// Если команда checkexpiredcredit
if (!strcmp($cmd,"checkexpiredcredit")) {
check_expired_credit($u5sh_run);
}
}
?>
Код: Выделить всё
CREATE TABLE `utmtray_credits` (
`id` int(11) NOT NULL auto_increment,
`account` int(11) default NULL,
`summa` double default NULL,
`startdate` int(11) default NULL,
`stopdate` int(11) default NULL,
`is_deleted` tinyint(4) default '0',
PRIMARY KEY (`id`)
);
id='$account' - это $account в апострофах.. этим частично придавливается SQL инъекция, а если перед вставкой поставлена проверка вида:
то она добивает ее совсем и заодно удаляет от SQL сервера повод покрутиться вхолостую или поругаться на отрицательный идентификатор лицевого счета.
Код: Выделить всё
if (((is_integer ($account)) || ((is_string ($account) && ctype_digit ($account))) && ($account > 0))