user_exist($user)) { syslog("$user subscribed"); my $body = q(Hey guy, you have already subscribed!); sendmail($user, "Subscribe failure", $body); }else { my $sid = gen_sid(); open(FD, "> $cfg{'listdir'}/$list/queue/$user") or syslog("$!") and die "Can't write to $user, $!\n"; printf FD "%s\:%s\n", time, $sid; close FD; syslog("confirm $user"); my $body = "Hey guy, reply to me with the code $sid \n" ."in the subject section\n"; $list =~ m/([^:]+)\@(.*)/; my $from = "$1-confirm\@$2"; sendmail($user, "Confirm subscribe", $body, $from); }}elsif($cmd eq "confirm") { if(not user_exist($user)) { syslog("$user not exist"); if(valid_sid($user, $subj)) { syslog("added $user"); add_user($user); my $body = "Welcome to $list :-)\n"; sendmail($user, "Added to the list", $body); }else { syslog("fail to confirm $user"); my $body = "Hey guy, your confirm fail, please try again\n"; sendmail($user, "Confirm failure", $body); } }else { my $body = "Hey guy, you step into a wrong situation!\n"; sendmail($user, "Wrong action", $body); }}elsif($cmd eq "unsubscribe") { if(user_exist($user)) { syslog("$user removed"); del_user($user); my $body = "Hey guy, you have been removed from the $list\n"; sendmail($user, "Goodbye - from $list", $body); }else { my $body = "Hey guy, you step into a wrong situation!\n"; sendmail($user, "Wrong action", $body); }}else { print STDERR "m3 error cmd!\n"; exit(13);}exit(0);## funcs to handle mail listsub sendmail { my($to, $subj, $body, $from) = @_; if(not defined $from) { $from = "m3\@$cfg{'hostname'}"; } open(CMD, "| /usr/sbin/sendmail -oi -t -f \"$from\" $to") or die "Can't exec /usr/sbin/sendmail, $!\n"; print CMD <
) { chomp; if(/^$user$/i) { return 1; } } close FD; 0;}# gen_sid - to generate unique Session idsub gen_sid { my ($sid, $len) = ("", $_[0] ? $_[0]-1 : 23); srand(time()); foreach(0...$len) { $sid .= $KEY_MAP[int rand(61)]; # total of $#KEY_MAP -1 } $sid;}sub valid_sid { my ($user, $sid) = @_; open(FD, "< $cfg{'listdir'}/$list/queue/$user") or syslog("can't open $user, $!") and die "Can't open $user, $!\n"; $_ = ; chomp; ($_) = m/[^:]+:(.*)/; if($sid eq $_) { syslog("auth ok for $user"); return 1; } close FD; return 0;}sub add_user { my ($user) = @_; unlink "$cfg{'listdir'}/$list/queue/$user"; # clean up user cookie/queue open(FD, ">> $cfg{'listdir'}/$list/users.txt") or die "Can't append to users.txt for $list, $!\n";9
7
3
1
2
3
4
8
: