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

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

Перейти к: навигация, поиск

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

Тип события: 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.*;

// 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=?" );

ps.setInt( 1, login.getId() );
rs = ps.executeQuery();

login_ip = 0;
while( rs.next() )
  login_ip = rs.getInt( 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
  raIp = new RadiusAttribute( 8 );
  raIp.setIntValue( 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'
); 
Личные инструменты