#! /usr/bin/perl
#=======================================================================
# Copyright (c) 1998 Daniele Giacomini daniele@pluto.linux.it
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#=======================================================================
# /etc/ppp/ip-up
#
# Questo script viene avviato dopo che il collegamento IP  stato
# instaurato. Purtroppo, pppd non attende la sua conclusione.
#=======================================================================

#----------------------------------------------------------------------- 
# Variabili utilizzate.
#----------------------------------------------------------------------- 
$DATA="";
$PPPD_PID="";
$riga = "";

#----------------------------------------------------------------------- 
# Verr scandito il file delle password per verificare la shell.
#----------------------------------------------------------------------- 
$FILEIN = "/etc/passwd";

#----------------------------------------------------------------------- 
# I messaggi vengono emessi nella dodicesima console virtuale.
#----------------------------------------------------------------------- 
$FILEOUT = "/dev/tty12";

#======================================================================= 
# Inizio del programma.
#----------------------------------------------------------------------- 

#----------------------------------------------------------------------- 
# La variabile di ambiente PEERNAME contiene il nome utilizzato
# per l'autenticazione. Se questa  vuota, significa che  stato
# avviato pppd con l'opzione noauth, come nel caso dell'autenticazione
# tradizionale. In questa situazione, questo script non serve, e tutto
# finisce qui.
#----------------------------------------------------------------------- 
if ( "$ENV{PEERNAME}" eq "" ) {
    exit;
}

#----------------------------------------------------------------------- 
# Prepara un file di messaggi.
#----------------------------------------------------------------------- 
open ( MESSAGGI, ">> $FILEOUT" );

#----------------------------------------------------------------------- 
# Preleva la data e l'orario attuale.
#----------------------------------------------------------------------- 
$DATA=`/bin/date`;
chomp( $DATA );

#----------------------------------------------------------------------- 
# Preleva il numero del PID di pppd; si tratta del contenuto
# del file /var/run/ppp?.pid.
# La variabile IFNAME contiene il nome dell'interfaccia di rete
# corrispondente (ppp*).
#----------------------------------------------------------------------- 
$PPPD_PID=`cat /var/run/$ENV{IFNAME}.pid`;
chomp( $PPPD_PID );

#----------------------------------------------------------------------- 
# Annota la connessione.
#----------------------------------------------------------------------- 
print MESSAGGI "$DATA $ENV{PEERNAME} $PPPD_PID\n";

#----------------------------------------------------------------------- 
# Apre il file delle password.
#----------------------------------------------------------------------- 
open ( PASSWD, "< $FILEIN" );

#-----------------------------------------------------------------------
# Scandisce tutto il file delle password
#-----------------------------------------------------------------------
while ( $riga = <PASSWD> ) {

    #-------------------------------------------------------------------
    # Estrae i vari elementi del record di /etc/passwd
    #-------------------------------------------------------------------
    if ( $riga =~ m|^ *(.*):(.*):(.*):(.*):(.*):(.*):(.*) *$| ) {

        $utente		= $1;
	$password	= $2;
        $uid		= $3;
        $gid		= $4;
        $finger		= $5;
        $home		= $6;
        $shell		= $7;

	#---------------------------------------------------------------
	# Controlla se si tratta dell'utente.
	#---------------------------------------------------------------
	if ( "$utente" eq "$ENV{PEERNAME}" ) {
	
	    #-----------------------------------------------------------
	    # Si tratta dell'utente giusto, adesso si controlla
	    # se la shell  quella consentita.
	    #-----------------------------------------------------------
	    if ( "$shell" eq "/usr/bin/utente_ppp" ) {

		#-------------------------------------------------------
		# Il prossimo problema  Acua.
		# Verifica che l'utente possa accedere (zero
		# corrisponde a falso in Perl, quindi il risultato va
		# invertito.
		# La variabile DEVICE contiene il percorso completo
		# del dispositivo utilizzato per la connessione.
		# Questo  il modo indicato dalla documentazione di
		# Acua per individuare l'attivit dell'utente, quando
		# si deve usare pppd per l'autenticazione.
		#-------------------------------------------------------
		if ( ! system( "/usr/sbin/acua_login < $ENV{DEVICE}" ) ) {

		    #---------------------------------------------------
		    # Se pppd non annota correttamente l'utente,
		    # cio il client, nel file /var/log/wtmp,
		    # Acua non consente l'accesso!
		    #---------------------------------------------------

		    #---------------------------------------------------
		    # L'utente viene accolto.
		    #---------------------------------------------------	
		    print MESSAGGI "$ENV{PEERNAME} accettato da ACUA\n";
		    close ( PASSWD );
		    close ( MESSAGGI );
		    exit;
		    
		} else {

		    #---------------------------------------------------	
		    # L'utente viene estromesso.
		    #---------------------------------------------------
		    kill 15, "$PPPD_PID";
		    print MESSAGGI "$ENV{PEERNAME} ESTROMESSO: ACUA\n";
		    close ( PASSWD );
		    close ( MESSAGGI );
		    exit;
		}

	    } else {
	    
		#-------------------------------------------------------
		# La shell non  valida. L'utente viene estromesso.
		#-------------------------------------------------------
		kill 15, "$PPPD_PID";
		print MESSAGGI "$ENV{PEERNAME} ESTROMESSO: SHELL\n";
		close ( PASSWD );
		close ( MESSAGGI );
		exit;
	    }
	}
    }
}

#-----------------------------------------------------------------------
# Se siamo qui, vuol dire che l'utente non c' nel file passwd!
#-----------------------------------------------------------------------
kill 15, "$PPPD_PID";
print MESSAGGI "$ENV{PEERNAME} L'UTENTE NON C'E` NEL FILE /etc/passwd\n";
close ( PASSWD );
close ( MESSAGGI );

#=======================================================================
# Fine
#=======================================================================
