Передача ACCEPT вместо REJECT вместе с доп. аттрибутами

Материал из BiTel WiKi

Версия от 05:19, 5 октября 2009; Феанор (Обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Устанавливается в Автоматизация -> Функции скриптов поведения

Тип события: RADIUS-аутентификация.

Про привязки скриптов поведения к договору читайте в документации к BGBilling.

import bitel.billing.server.call.bean.Login;
import bitel.billing.server.radius.*;
import bitel.billing.server.contract.bean.*;
import bitel.billing.server.script.event.*;
import java.util.*;
import bitel.billing.common.*;
 
cid = event.getContractID();
contract = new ContractManager(con).getContractByID(cid);
BalanceMode = contract.getBalanceMode();
 
if (BalanceMode == 0)
{
	//Пропускаем тех кто работает по факту
	return;
};
DateNow = new GregorianCalendar();
date_str=TimeUtils.format(DateNow, "yyyy-MM-dd"); 
print (date_str);
// event.getRequest|getResponse|getLogin|getContract|getErrorCode
login = event.getLogin();
 
// Ищем пользователя и IP, привязанный к нему в таблице
// "radius_pair_ip_x", где "x" код модуля Dialup.
ps = con.prepareStatement( "SELECT ip FROM radius_pair_ip_1 WHERE id=? and date2 is NULL and date1<='"+date_str+"'" );
 
ps.setInt( 1, login.getId() );
rs = ps.executeQuery();
 
login_ip = 0;
while( rs.next() )
  login_ip = rs.getLong( 1 );
 
errCode = event.getErrorCode();
 
// Если логину не присвоен IP-адрес, то даем AUTH_REJECT.
if( login_ip == 0 )
{
  errCode = 2;
  response = event.getResponse();
  response.setPacketType( RadiusPacket.AUTHENTICATION_REJECT );
}
 
// 0 - нет ошибки, 2 - ошибка ввода пароля.
if( errCode != 0 && errCode != 2 )
{
 
  response = event.getResponse();
 
  response.setPacketType( RadiusPacket.AUTHENTICATION_ACCEPT );
 
  // Готовим аттрибуты на отдачу
 
  // Service-Type = 2 
  raSt = new RadiusAttribute( 6 ); 
  raSt.setIntValue( 2 );
 
  // Framed-Protocol = 1
  raFp = new RadiusAttribute( 7 ); 
  raFp.setIntValue( 1 );
 
  // Framed-IP-Address
  //(int)login_ip чтобы установить Long значение в SetIntValue
  //иначе для адресов выше 2147483647 будет выдаваться неверный адрес
  raIp = new RadiusAttribute( 8 );
  raIp.setIntValue((int) login_ip );
 
  // Session-Timeout = 900 (15 min)
  raStm = new RadiusAttribute( 27 ); 
  raStm.setIntValue( 900 );
 
  // Ascend-Client-Primary-DNS (192.168.0.3 или 3232235523 в DEC)
  rvaDNS = new RadiusVendorAttribute( 529, 135 );
  rvaDNS.setIntValue( 3232235523 );
 
  // Cisco-AV-Pair, устанавливаем WCCP-редирект на интерфейс
  rva = new RadiusVendorAttribute( 9, 1 );
  rva.setStringValue( "lcp:interface-config=ip wccp web-cache redirect in" );
 
  // Cisco-AV-Pair, Устанавливаем access-list 155 на интерфейс
  rvaAcc = new RadiusVendorAttribute( 9, 1 );
  rvaAcc.setStringValue( "ip:inacl=155" );
 
  response.addAttribute( raStm );
  response.addAttribute( raSt );
  response.addAttribute( raFp );
  response.addAttribute( raIp );
  response.addVendorAttribute( rvaDNS );
  response.addVendorAttribute( rva );
  response.addVendorAttribute( rvaAcc );
}
 
// Пишем в специальную табличку текущий код ошибки, кроме Password Error,
// для дальнейшего вывода на специальной информационной страничке.
if( errCode != 2 )
{
    ps = con.prepareStatement( "SELECT ip FROM dialup_conn_error WHERE ip=?" );
 
    ps.setInt( 1, login_ip );
    rs = ps.executeQuery();
 
    found = false;
    while( rs.next() )
      found = true;
 
    if( found )
      ps = con.prepareStatement( "UPDATE dialup_conn_error SET error_code=? WHERE ip=?" );
    else
      ps = con.prepareStatement( "INSERT INTO dialup_conn_error(error_code,ip) VALUES(?,?)" );
 
    ps.setInt( 1, errCode );
    ps.setInt( 2, login_ip );
 
    ps.executeUpdate();
}


Структура таблицы dialup_conn_error:

CREATE TABLE `dialup_conn_error` (
  `ip` int(11) NOT NULL DEFAULT '0',
  `error_code` int(11) NOT NULL DEFAULT '0'
);
Личные инструменты