UTMTray альтернатива

Технические вопросы по UTM 5.0
Ответить
Davion
Сообщения: 267
Зарегистрирован: Чт дек 01, 2005 13:36

Сообщение Davion »

проверьте права на файлы в директории апача!!! скорее всего ошибка именно в этом

Kayfolom
Сообщения: 746
Зарегистрирован: Вс фев 12, 2006 17:15

Сообщение Kayfolom »

Pei0t писал(а):При запуске утилиты в httpd-error_log

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

Premature end of script headers: /usr/local/apache/cgi-bin/utm5/new/aaa5
в логах утилиты

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

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
Зайти вручную через браузер на aaa5 тоже не выходит, - 500. Когда на стандартную УТМовскую статистику попадает.
Это пофиксено в http://www.ukhta-inform.ru/UTMTray0.1.2.87.zip (смотрите пост viewtopic.php?p=34350#34350)

Kayfolom
Сообщения: 746
Зарегистрирован: Вс фев 12, 2006 17:15

Сообщение Kayfolom »

Davion писал(а):проверьте права на файлы в директории апача!!! скорее всего ошибка именно в этом
Нет, просто в aaa_login.xml пришлось оставить форму ввода логина и пароля. aaa5 не захотел без них работать. Зато удалось убрать кнопку Ок ;)
Теперь 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>

Pei0t
Сообщения: 258
Зарегистрирован: Чт дек 13, 2007 20:48

Сообщение Pei0t »

Kayfolom писал(а):
Pei0t писал(а):При запуске утилиты в httpd-error_log

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

Premature end of script headers&#58; /usr/local/apache/cgi-bin/utm5/new/aaa5
в логах утилиты

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

14.05.2008 15&#58;17&#58;11.890 Try Get https&#58;//192.168.x.x/cgi-bin/utm5/new/aaa5?&cmd=login&login=11111&password=22222
14.05.2008 15&#58;17&#58;11.890 Disconnected
14.05.2008 15&#58;17&#58;12.156 Connected
14.05.2008 15&#58;17&#58;12.218 Disconnected
14.05.2008 15&#58;17&#58;12.218 ERROR HTTP/1.1 500 Internal Server Error
Зайти вручную через браузер на aaa5 тоже не выходит, - 500. Когда на стандартную УТМовскую статистику попадает.
Это пофиксено в http://www.ukhta-inform.ru/UTMTray0.1.2.87.zip (смотрите пост viewtopic.php?p=34350#34350)
Я пробовал с Вашей последней сборкой, что можно попробовать, что б знать в какую сторону копать, может добиться работы через браузер? Повторюсь у меня через него даже ошибка 500.

Kayfolom
Сообщения: 746
Зарегистрирован: Вс фев 12, 2006 17:15

Сообщение Kayfolom »

Pei0t писал(а):
Kayfolom писал(а):
Pei0t писал(а):При запуске утилиты в httpd-error_log

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

Premature end of script headers&#58; /usr/local/apache/cgi-bin/utm5/new/aaa5
в логах утилиты

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

14.05.2008 15&#58;17&#58;11.890 Try Get https&#58;//192.168.x.x/cgi-bin/utm5/new/aaa5?&cmd=login&login=11111&password=22222
14.05.2008 15&#58;17&#58;11.890 Disconnected
14.05.2008 15&#58;17&#58;12.156 Connected
14.05.2008 15&#58;17&#58;12.218 Disconnected
14.05.2008 15&#58;17&#58;12.218 ERROR HTTP/1.1 500 Internal Server Error
Зайти вручную через браузер на aaa5 тоже не выходит, - 500. Когда на стандартную УТМовскую статистику попадает.
Это пофиксено в http://www.ukhta-inform.ru/UTMTray0.1.2.87.zip (смотрите пост viewtopic.php?p=34350#34350)
Я пробовал с Вашей последней сборкой, что можно попробовать, что б знать в какую сторону копать, может добиться работы через браузер? Повторюсь у меня через него даже ошибка 500.
А aaa_login.xml вы поменяли на сервере? Попробуйте подсунуть родной aaa_login.xml . Поставте аьрибуты на aaa5 и user5 - как в родной веб морде.
Да и версия билинга какая? Я все пробую на 005.
Права на /new/ выставлены?

Kayfolom
Сообщения: 746
Зарегистрирован: Вс фев 12, 2006 17:15

Сообщение Kayfolom »

Повторил ошибку HTTP 500 - просто переписал папку на сервер.
Так работать апач не будет.

Исправил ошибку HTTP 500 - сделал апач владельцем каталога (chown) и установил правильные атрибуты для aaa5 и user5 (chmod)
Все заработало.

Pei0t
Сообщения: 258
Зарегистрирован: Чт дек 13, 2007 20:48

Сообщение Pei0t »

При замене файла aaa5 оригинальным УТМовским - страница cgi-bin/utm5/new/aaa5 открывается с формами M_LOGIN и M_PASSWORD,
при этом лог:

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

14.05.2008 21&#58;15&#58;26.718 Try Get https&#58;//192.168.xxx.xxx/cgi-bin/utm5/new/aaa5?&cmd=login&login=11111o&password=22222
14.05.2008 21&#58;15&#58;26.718 Disconnected
14.05.2008 21&#58;15&#58;26.968 Connected
14.05.2008 21&#58;15&#58;27.000 Disconnected
14.05.2008 21&#58;15&#58;27.000 Disconnected
14.05.2008 21&#58;15&#58;27.125 Connected
14.05.2008 21&#58;15&#58;27.625 ERROR Read Timeout
если заливаешь aaa5 от utmtray - 500 в браузере и утилите.

Kayfolom
Сообщения: 746
Зарегистрирован: Вс фев 12, 2006 17:15

Сообщение Kayfolom »

Pei0t писал(а):При замене файла aaa5 оригинальным УТМовским - страница cgi-bin/utm5/new/aaa5 открывается с формами M_LOGIN и M_PASSWORD,
при этом лог:

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

14.05.2008 21&#58;15&#58;26.718 Try Get https&#58;//192.168.xxx.xxx/cgi-bin/utm5/new/aaa5?&cmd=login&login=11111o&password=22222
14.05.2008 21&#58;15&#58;26.718 Disconnected
14.05.2008 21&#58;15&#58;26.968 Connected
14.05.2008 21&#58;15&#58;27.000 Disconnected
14.05.2008 21&#58;15&#58;27.000 Disconnected
14.05.2008 21&#58;15&#58;27.125 Connected
14.05.2008 21&#58;15&#58;27.625 ERROR Read Timeout
если заливаешь aaa5 от utmtray - 500 в браузере и утилите.
Конечно. Потому что на родном файле aaa5 уже стоят атрибуты, а на моем из архива нет. ;) aaa5 не менялось - абсолютно, это родной утмский файл.
А на счет Read Timeout - попробуйте зайти браузером по ссылке https://192.168.xxx.xxx/cgi-bin/utm5/ne ... word=22222

Groom
Сообщения: 8
Зарегистрирован: Вт май 06, 2008 09:20

Сообщение Groom »

А у меня после вчерашних фиксов всё работает =)

Kayfolom
Сообщения: 746
Зарегистрирован: Вс фев 12, 2006 17:15

Сообщение Kayfolom »

Сделана более жесткая проверка ошибок 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
Достаточно только обертки, без обращения к базам и прочее. Постараюсь сделать сам, чтоб никого не напрягать.

Еще нужен совет - стоит ли в утилиту втыкать отчеты? Если стоит, то какие (или все)? А то я сделал механизм, но не знаю стоит ли его активировать...

Kayfolom
Сообщения: 746
Зарегистрирован: Вс фев 12, 2006 17:15

Сообщение Kayfolom »

Накидал тут на php штуки (на редкость простой язык оказался). Но хотелось бы чтоб гуру глянули опытным взглядом, вдруг очевидные ляпы допустил.
Итак, сделал 3 файла config.php, function.php, index.php
Содержимое config.php:

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

<?php
$db_host='localhost&#58;3306';
$db_base='UTM5';
$db_user='utmtray';
$db_password='xxxxxx';
$payment_interval='31'; //максимальная сумма кредита=сумме платежей за $payment_interval дней
$db_connect=mysql_connect&#40;$db_host,$db_user,$db_password&#41; or die &#40;"Connect failed"&#41;;
mysql_select_db&#40;$db_base,$db_connect&#41;;
?>
Содержимое function.php:

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

<?php

// Возвращает Максимально возможную сумму кредита
function getmaxcreditsum&#40;$account,$payment_interval&#41; &#123;
  $payment_interval=-$payment_interval;
  $query = "SELECT SUM&#40;payment_incurrency&#41; as monthpayment FROM
 payment_transactions WHERE payment_enter_date>=UNIX_TIMESTAMP&#40;DATE_ADD&#40;NOW&#40;&#41;,INTERVAL $payment_interval DAY&#41;&#41;
 and account_id=$account";
  return mysql_result&#40;mysql_query&#40;$query&#41;,0,"monthpayment"&#41;;
&#125;

// Возвращает 1 если кредит уже есть
function already_credit&#40;$account&#41; &#123;
  $payment_interval=-$payment_interval;
  $query = "SELECT credit FROM accounts WHERE is_deleted<>'1' AND id=$account";
  $result = @mysql_result&#40;@mysql_query&#40;$query&#41;,0,"credit"&#41;;
  return $result>0;
&#125;

// Возвращает 1 если возможно сделать кредит
function possibility_credit&#40;$account,$creditsum,$payment_interval&#41; &#123;
  $result=0;
  print "possibility_credit&#58;";
  if &#40;already_credit&#40;$account&#41;<>1&#41; &#123;
    print "already_credit ".already_credit&#40;$account&#41;."<BR>";
    if &#40;getmaxcreditsum&#40;$account,$payment_interval&#41;>=$creditsum&#41; &#123;
      print "getmaxcreditsum ".getmaxcreditsum&#40;$account,$payment_interval&#41;."<BR>";
      $result=1;
    &#125;
  &#125;
  return $result;
&#125;

// Возвращает пароль по логину
function get_password&#40;$login&#41; &#123;
  $query = "Select password From users Where is_deleted<>'1' AND login='$login'";
  return @mysql_result&#40;@mysql_query&#40;$query&#41;,0,"password"&#41;;
&#125;
?>
Содержимое index.php

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

<?php
include &#40;'config.php'&#41;;
include &#40;'function.php'&#41;;

$cmd = $_GET&#91;'cmd'&#93;;
$login = $_GET&#91;'login'&#93;;
$password = $_GET&#91;'password'&#93;;
$account = $_GET&#91;'account'&#93;;
$creditsum = $_GET&#91;'creditsum'&#93;;

if &#40;strcmp&#40;get_password&#40;$login&#41;,$password&#41;&#41; &#123;
  print "ACCESS DENIED";  
  &#125; else &#123;
    // Если команда getmaxcreditsum
    if &#40;!strcmp&#40;$cmd,"getmaxcreditsum"&#41;&#41; &#123;    
      print getmaxcreditsum&#40;$account,$payment_interval&#41;;
    &#125;
    // Если команда setcredit
    if &#40;!strcmp&#40;$cmd,"setcredit"&#41;&#41; &#123;    
      if &#40;possibility_credit&#40;$account,$creditsum,$payment_interval&#41;==1&#41; &#123;
        print "Ура, ставим кредит ".$creditsum."р.<BR>"; 
      &#125; else &#123;
        print "Нет, не ставим кредит ".$creditsum."р.<BR>";       
      &#125; 
    &#125;
  &#125;
?>
Работает следующим образом:
http://asd.net/?cmd=getmaxcreditsum&log ... account=66
возвращает максимально возможную сумму кредита (сумма платежей по аккаунту за $payment_interval в днях).

http://asd.net/?cmd=setcredit&login=xxx ... ditsum=350 "устанавливает" кредит, предварительно проверив нет ли в данный момент кредита на аккаунте и не превышает ли сумма желаемого кредита максимально возможную. Реально конечно пока не выставляет - не дочитал php мануал до места про запуска программ ;)

JAO
Сообщения: 1153
Зарегистрирован: Вт дек 11, 2007 08:17

Сообщение JAO »

Функции already_credit () и getmaxcreditsum () дырявые

Проверяйте параметр $account функцией is_string и ctype_digit либо is_integer, а в запрос сажайте только в апострофах, простая вставка без проверок чревата SQL инъекциями. Впрочем если данные из доверенного источника (то есть не с пользовательской формочки), то достаточно в апострофы посадить.

Такой же недосмотр и в getmaxcreditsum ()

Kayfolom
Сообщения: 746
Зарегистрирован: Вс фев 12, 2006 17:15

Сообщение Kayfolom »

JAO писал(а):Функции already_credit () и getmaxcreditsum () дырявые

Проверяйте параметр $account функцией is_string и ctype_digit либо is_integer, а в запрос сажайте только в апострофах, простая вставка без проверок чревата SQL инъекциями. Впрочем если данные из доверенного источника (то есть не с пользовательской формочки), то достаточно в апострофы посадить.

Такой же недосмотр и в getmaxcreditsum ()
А можно пример про апострофы ? Как именно? Я путаюсь что такое апострофы - двойные кавычки?

Kayfolom
Сообщения: 746
Зарегистрирован: Вс фев 12, 2006 17:15

Сообщение Kayfolom »

Готовый вариант. С тремя функциями:
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&#58;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&#40;$db_host,$db_user,$db_password&#41; or die &#40;"Connect failed"&#41;;
mysql_select_db&#40;$db_base,$db_connect&#41;;
?>
function.php

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

<?php
// Возвращает Максимально возможную сумму кредита
function getmaxcreditsum&#40;$account,$payment_interval&#41; &#123;
  $payment_interval=-$payment_interval;
  $query = "SELECT SUM&#40;payment_incurrency&#41; as monthpayment FROM payment_transactions WHERE payment_enter_date>=UNIX_TIMESTAMP&#40;DATE_ADD&#40;NOW&#40;&#41;,INTERVAL $payment_interval DAY&#41;&#41; and account_id=$account";
  return mysql_result&#40;mysql_query&#40;$query&#41;,0,"monthpayment"&#41;;
&#125;

// Возвращает 1 если кредит уже есть
function already_credit&#40;$account&#41; &#123;
  $payment_interval=-$payment_interval;
  $query = "SELECT credit FROM accounts WHERE is_deleted<>'1' AND id=$account";
  $result = @mysql_result&#40;@mysql_query&#40;$query&#41;,0,"credit"&#41;;
  return $result>0;
&#125;

// Возвращает 1 если возможно сделать кредит
function possibility_credit&#40;$account,$creditsum,$payment_interval&#41; &#123;
  $result=0;
  if &#40;already_credit&#40;$account&#41;<>1&#41; &#123;
    if &#40;getmaxcreditsum&#40;$account,$payment_interval&#41;>=$creditsum&#41; &#123;
      $result=1;
    &#125;
  &#125;
  return $result;
&#125;

// Возвращает пароль по логину
function get_password&#40;$login&#41; &#123;
  $query = "Select password From users Where is_deleted<>'1' AND login='$login'";
  return @mysql_result&#40;@mysql_query&#40;$query&#41;,0,"password"&#41;;
&#125;

// Устанавливает кредит для $account на сумму $creditsum продолжительностью $length_credit
function set_credit&#40;$account,$creditsum,$length_credit,$u5sh_run&#41; &#123;
  $query = "INSERT INTO utmtray_credits &#40;account, summa, startdate, stopdate, is_deleted&#41; VALUES &#40;$account, $creditsum, UNIX_TIMESTAMP&#40;NOW&#40;&#41;&#41;, UNIX_TIMESTAMP&#40;DATE_ADD&#40;NOW&#40;&#41;,INTERVAL $length_credit DAY&#41;&#41; ,0&#41;";
  @mysql_query&#40;$query&#41;;
  $command_string=$u5sh_run." --ChangeAccount -aid $account -credit $creditsum";
  exec&#40;$command_string, $sa, $sr&#41;;
  return 0;
&#125;

//Проверяет просроченные кредиты и аннулирует их
function check_expired_credit&#40;$u5sh_run&#41; &#123;
  $query="Select id, account From utmtray_credits Where stopdate<UNIX_TIMESTAMP&#40;Now&#40;&#41;&#41; and is_deleted<>1";
  $result=@mysql_query&#40;$query&#41;;
  while&#40;$row=mysql_fetch_array&#40;$result&#41;&#41; &#123;
    $command_string=$u5sh_run." --ChangeAccount -aid ".$row&#91;"account"&#93;." -credit 0";
    $query="UPDATE  utmtray_credits SET  is_deleted=1  Where  id=".$row&#91;"id"&#93;;
    exec&#40;$command_string, $sa, $sr&#41;;
    @mysql_query&#40;$query&#41;;
  &#125;;
  return 0;
&#125;
?>
index.php

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

<?php
include &#40;'config.php'&#41;;
include &#40;'function.php'&#41;;

$cmd = $_GET&#91;'cmd'&#93;;
$login = $_GET&#91;'login'&#93;;
$password = $_GET&#91;'password'&#93;;
$account = $_GET&#91;'account'&#93;;
$creditsum = $_GET&#91;'creditsum'&#93;;

$u5sh_run="$java_path -jar $u5sh_path --AdminLogin $UTMCore_Login --AdminPass $UTMCore_Password --CoreHost $UTMCoreHost --CorePort $UTMCorePort";

if &#40;strcmp&#40;get_password&#40;$login&#41;,$password&#41;&#41; &#123;
  print "ACCESS DENIED";  
  &#125; else &#123;
    // Если команда getmaxcreditsum
    if &#40;!strcmp&#40;$cmd,"getmaxcreditsum"&#41;&#41; &#123;    
      print getmaxcreditsum&#40;$account,$payment_interval&#41;;
    &#125;
    // Если команда setcredit
    if &#40;!strcmp&#40;$cmd,"setcredit"&#41;&#41; &#123;    
      if &#40;possibility_credit&#40;$account,$creditsum,$payment_interval&#41;==1&#41; &#123;
        set_credit&#40;$account,$creditsum,$length_credit,$u5sh_run&#41;;
      &#125; else &#123;
        print "ABORT";       
      &#125; 
    &#125;
    // Если команда checkexpiredcredit
    if &#40;!strcmp&#40;$cmd,"checkexpiredcredit"&#41;&#41; &#123;    
      check_expired_credit&#40;$u5sh_run&#41;;
    &#125;
  &#125;
?>
Таблица для хранения инфы по текущим и удаленным кредитам utmtray_credits.sql

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

CREATE TABLE `utmtray_credits` &#40;
  `id` int&#40;11&#41; NOT NULL auto_increment,
  `account` int&#40;11&#41; default NULL,
  `summa` double default NULL,
  `startdate` int&#40;11&#41; default NULL,
  `stopdate` int&#40;11&#41; default NULL,
  `is_deleted` tinyint&#40;4&#41; default '0',
  PRIMARY KEY  &#40;`id`&#41;
&#41;;

JAO
Сообщения: 1153
Зарегистрирован: Вт дек 11, 2007 08:17

Сообщение JAO »

id='$account' - это $account в апострофах.. этим частично придавливается SQL инъекция, а если перед вставкой поставлена проверка вида:

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

if &#40;&#40;&#40;is_integer &#40;$account&#41;&#41; || &#40;&#40;is_string &#40;$account&#41; && ctype_digit &#40;$account&#41;&#41;&#41; && &#40;$account > 0&#41;&#41;
то она добивает ее совсем и заодно удаляет от SQL сервера повод покрутиться вхолостую или поругаться на отрицательный идентификатор лицевого счета.

Ответить