In base alle mie esigenze e a ciò che ho capito (soprattutto grazie alla risposta di Mich_) ho fatto le seguenti modifiche (righe con commento "***mAx***"):
codice:
use Authen::PAM;
$| = 1; #force STDOUT autoflush after each write
my ($seq,$vrfy,$mode,$user,$passw);
sub pam_conv_func {
my @res;
while ( @_ ) {
my $msg_type = shift;
my $msg = shift;
#print $msg;
push @res, 0;
push @res, $passw;
}
push @res, PAM_SUCCESS;
return @res;
}
while(<STDIN>) {
($seq,$vrfy,$mode,$user,$passw) = split(/ /);
unless($mode =~ /^\(.*\)$/) {
$passw=$user; $user=$mode;
}
unless($seq && $vrfy && $user && $passw) {
print "$seq ERROR Wrong arguments\n";
} elsif($vrfy ne 'VRFY') {
print "$seq ERROR Only clear text passwords supported\n";
} else {
my ($res,$pamh,$domi); # ***mAx*** aggiunta dichiarazione variabile 'domi'
chomp($passw);
if($user =~/(.+)\@.+/) {$user=$1; $domi=$2} # strip the domain name if necessary + ***mAx*** assegnazione della seconda parte della stringa a $domi
if($domi eq "\@dominio3.com") {$domi = "DOM3\\\\"} # ***mAx*** verifica se il dominio è il 3 e se si lo chiama DOM3
elsif($domi eq "\@dominio2.it") {$domi = "DOM2\\\\"} # ***mAx*** verifica se il dominio è il 2 e se si lo chiama DOM2
else {$domi = "DOM1\\\\"} # ***mAx*** Il dominio è il n. 1 e lo chiama DOM1
$user = $domi.$user \n; # ***mAx*** l'utente si chiama DOMINIOn\\utente
if(($res=pam_start("login", $user, \&pam_conv_func, $pamh))!=PAM_SUCCESS ||
($res=pam_authenticate($pamh, 0))!=PAM_SUCCESS ||
($res=pam_end($pamh, 0))!=PAM_SUCCESS) {
print "$seq ERROR ".pam_strerror($pamh,$res)."\n";
} else {
print "$seq OK \n";
}
}
}
Ho dei seri dubbi sulla correttezza della sintassi delle mie modifiche, in particolare della parte riguardante i caratteri speciali all'interno delle stringhe (il risultato finale in $user vorrei che fosse es. DOM1\\giovanni).
Ha un minimo di senso quello che ho scritto? (prima di darlo in pasto al mailserver...).
Ancora grazie a tutti.
mAx