#!/usr/bin/perl # # poppassd - poppassd for vpopmail (using vchkpw and vpasswd) # # (c) joakim mared # # 20051006 initial version # 20051013 pop3 version use warnings; use strict; use locale; use Net::POP3; $| = 1; ## settings my $SET_PASSWD = '/home/vpopmail/bin/vpasswd'; my $POP3_HOST = 'localhost'; ## vars my $user; my $current_pass; my $challenge_pass; my $new_pass; my $line; my $pop; my $logged_in = 0; print "200 popassd\r\n"; while($line = <>) { $line =~ s/\r?\n$//; if ($line =~ /^user\s(.+)/i) { $user = shell_escape($1); print "200 password please\r\n"; } elsif ($line =~ /^pass\s(.+)/i) { $challenge_pass = shell_escape($1); if (!$challenge_pass) { sleep 2; print "500 not ok\r\n"; exit 0; } $pop = Net::POP3->new($POP3_HOST, Timeout => 10); if (!$pop->login($user, $challenge_pass)) { sleep 2; print "500 not ok\r\n"; exit 0; } $logged_in = 1; print "200 ok\r\n"; } elsif ($logged_in && $line =~ /^newpass\s(.+)/) { $new_pass = shell_escape($1); `$SET_PASSWD '$user' '$new_pass'`; $logged_in = 0; $user = ''; $current_pass = ''; $challenge_pass = ''; print "200 ok\r\n"; } elsif ($line =~ /^quit/i) { exit 0; } else { print "400 invalid command\r\n"; } } sub shell_escape { my $string = shift; $string =~ s/['\\]//g; return $string; }