next up previous contents
Siguiente: Calidad de servicio Subir: Control de acceso Anterior: Comprobación a cada hora   Índice General

Comprobación de datos de activación

La comprobación de datos se realiza en el script cgi-bin/login. Se llama a la función check_datos la primera vez que se autentica. El lugar exacto lo mostramos a continuación:

#!/usr/bin/perl -w

###
##
# login
#
# The CGI that does the deed.
#
#  * Present a form
#  * Check it when filled in
#  * Notify the connecting IP of the outcome
#  * Inform and optionally redirect the user
#
# RJF & SDE, 7.4.01
#
# License: GPL.
##
###

#use lib '/usr/local/nocat'; # or wherever.
use lib '../lib/';
use NoCat qw( ANONYMOUS );
use strict;

# El paquete que contiene check_datos y consulta_qos
use ControlNocat;

my $authserv = NoCat->auth_service( ConfigFile => $ENV{NOCAT} );
my $cgi  = $authserv->cgi;
my $params = $cgi->Vars;

# Debug configuration setup.
$authserv->check_config(qw(
    LoginForm FatalForm RenewForm LoginOKForm ExpiredForm
    LoginGreeting LoginMissing LoginBadUser LoginBadPass
));

$authserv->log( 7, sprintf( "User %s from %s requests %s",
    $params->{user} || "UNKNOWN", $cgi->remote_host,
    lc( $params->{mode} ) || "form" )
);

# Figure out which image button was clicked
# (since they don't have value="" attributes).
if (my ($button) = grep { defined $params->{"mode_$_.x"} }
    qw( login skip logout ))
{
    delete $params->{$_} for ( "mode_$button.x", "mode_$button.y" );
    $params->{mode} = $button;
}

# Have we filled in the form yet?  No?  If not, present one.
$authserv->display( LoginForm => "LoginGreeting" ) unless $params->{mode};

# Verify prerequisites.
$authserv->display( FatalForm =>
   "Your MAC address is undefined.  Problem with the gateway?" )  
      unless $params->{mac};
$authserv->display( FatalForm =>
   "Your gateway token is undefined.  Problem with the gateway?" )
      unless $params->{token};

# If the user skipped authentication...
if ( $params->{user} eq ANONYMOUS or $params->{mode} =~ /^skip/io )
{
    $params->{user} = ANONYMOUS;
    delete $params->{member};

# Otherwise, attempt to authenticate the user.
}
else
{
    # Are we just missing required fields?
    $authserv->display( LoginForm => "LoginMissing"   )
       unless $params->{user} and $params->{pass};

    # Does the login info match what we have on file?
    my $user = $authserv->user->fetch( $params->{user} );

    $authserv->display( LoginForm => "LoginBadUser" ) unless $user->id;
    $authserv->display( LoginForm => "LoginBadPass" )
         unless $user->authenticate( $params->{pass} );

    # Set the service class based on the user's authorization (if any).
    my $member = join( " ", $user->groups );
    $params->{member} = $member if $member;

# Guardamos el classid,ceil y prio en los parametros
#
    unless ($params->{id_cola})
    {
      my @qos=&consulta_qos($params->{user});
      $params->{id_cola}=$qos[0];
      $params->{rate}=$qos[1];
      $params->{ceil}=$qos[2];
      $params->{prio}=$qos[3];
    }

}

# Finally, notify the gateway (and the user) as to the outcome.
my ( $form, $gw );

# Either we're requesting the renewal popup box...
if ( $params->{mode} =~ /^popup/io )
{
    $form = ( $params->{gateway} ? "PassiveRenewForm" : "RenewForm" );
    $params->{redirect} = $authserv->renew_url;

# Or we're either logging in, or renewing, in which case, notify the gateway.
}
elsif ($gw = $authserv->notify( Permit => $params ))
{
  if ( $gw->{Error} )
  {
    # Oddly enough, this isn't really success.
    $form = "ExpiredForm";

  }
  elsif ( $params->{mode} =~ /^renew/io )
  {
    if ( $params->{gateway} )
    {
      $form = "PassiveRenewForm";
      # $params->{redirect} = $gw->{redirect};
    }
    else
    {
      $form = "RenewForm";
      $params->{redirect} = $authserv->renew_url( $gw );
    }
  }
  else
  {

# Muestra mensaje de error si la funcion check_datos no devuelve un 1
#
    $authserv->display(LoginForm=>"Error de autenticacion")
      unless (check_datos($params->{user},$params->{ubicacion}));

    $form = "LoginOKForm";
    # $params->{redirect} = $gw->{redirect} if $gw->{redirect};
    $params->{popup} = $authserv->popup_url( $gw );
    # set the javascript *link* to the popup box.
    # warn "+ redirect:[$params->{redirect}] popup:[$params->{popup}]\n";
  }

# Or something's really wrong.
}
else
{
    my $err = $!;
    if ($err =~ /Connection refused/io) {
      $authserv->display( LoginForm => "Can't connect to your gateway.
      If it's behind a NAT'ed firewall, it needs to run in Passive Mode." );
    } else {
      $authserv->display( LoginForm => "Authentication error for
                            connection $params->{token}: $!" );
    }
}

$params->{logout} = $authserv->logout_url; # Make a logout link.

# Execute on the plan and tell a compelling story to the user.
$authserv->success( $form => $params );

# Fin

El código introducido para la comprobación de datos es el trozo que aparece en segundo lugar. El fragmento que hay introducido antes lo veremos en el apartado de calidad de servicio. La función check_datos está en el módulo ControlNocat.pm. Los parámetros que recibe esta función son user y ubicación, ambos son variables del cgi. En el caso de user es rellenado por el usuario al enviar el formulario. La ubicación desde donde se estaba conectando el usuario no estaba disponible en el servidor en el sistema NoCatAuth. Para pasar desde la pasarela al servidor este parámetro se han seguido dos pasos:
  1. Definir una nueva directiva en el archivo de configuración de la pasarela:
    Ubicacion [MAC de la interfaz externa]
    
    El valor puede ser el que nosotros queramos que se registre en el servidor, en nuestro caso hemos optado por la MAC de la interfaz externa de la pasarela. Hemos optado por este valor para tener la seguridad de que sea único.
  2. Modificar el método capture_params de la clase Passive.pm:

    sub capture_params {
        my ( $self, $peer, $request ) = @_;
        return {
          mac      => $peer->id,
          token    => $peer->token,
          redirect => $request,
          timeout  => $self->{LoginTimeout},
          gateway  => $peer->socket->sockhost . ":$self->{GatewayPort}",

    #  Nuevo parámetro que pasamos al servidor de autenticacion en la URL
    #
          ubicacion => $self->{Ubicacion}


        };
    }

Con estos dos pasos el script login tiene disponible el parámetro ubicación y puede usarlo para llamar a la función check_datos.
next up previous contents
Siguiente: Calidad de servicio Subir: Control de acceso Anterior: Comprobación a cada hora   Índice General
Jesús Martín 2003-09-16
e-REdING. Biblioteca de la Escuela Superior de Ingenieros de Sevilla.


SISTEMA DE CONTROL, TARIFICACIÓN Y ADMINISTRACIÓN DEL ACCESO A INTERNET DESDE REDES HETEROGÉNEAS

: Martín Ruiz, Jesús
: Ingeniería Telecomunicación
Contenido del proyecto: