#!/usr/bin/perl --

#
# $Id: makebait,v 1.31 1997/12/10 07:31:03 johnbob Exp johnbob $
#
#
#  Generate HTML containing bogus addresses, and some not-so-bogus
#  addresses like 'postmaster'.
#  The idea is to keep SPAMers and junkmailers who search web pages
#  for addresses too busy with bogus addresses to flood valid ones.
#  No good web site should be without a few thousand bogus addresses
#  that are changed often.
#

$verbose=0;
$body_only=0;
$title='SPAM bait';
$random_title=0;
$n_low=900;
$n_high=1100;
$cgi_mode=0;
$produced_output=0;
$from_mode=0;

@candidate_list = (
'abcdefghijklmnopqrstuvwxyz',
'abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz0123456789',
'abcdefghijklmnopqrstuvwxyz0123456789',
'ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789',
'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789',
);

@candidate_list_p = (
844,
125,
25,
5,
1,
);

@name_length_p = (
1,
49,
100,
150,
150,
125,
100,
75,
);

@word_length_p = (
1,
100,
500,
400,
350,
300,
250,
200,
150,
100,
50,
25,
1,
1,
1,
1,
);

@parts_p = (
7,
2,
1,
);

# these should be modified from
# time to time to throw the 'bots off
%ending_assoc = (
'com', 40,
'edu', 30,
'org', 10,
'gov', 1,
'us', 1,
'fi', 1,
'nl', 5,
'uk', 4,
'net', 2,
'kr', 1,
'de', 5,
'se', 1,
'no', 4,
'si', 1,
);

@ending_list = keys %ending_assoc;
@ending_list_p = values %ending_assoc;

@z_who = ('postmaster','abuse','admin','root');
@z_where_at = ('','@localhost','@loopback');
@z_autoresponders = ('jnyynpr@plorecebzb.pbz','znaerzbir@plorecebzb.pbz',
'nohfr@plorecebzb.pbz','nohfrobg@plorecebzb.pbz','fraqre@nafjrezr.pbz',
'frira@tybonysa.pbz','yra@hck.arg','grez@zbarljbeyq.pbz',
'gevdhnag@rneguyvax.arg','qvfarltebhc@nafjrezr.pbz','yvfgf@nafjrezr.pbz',
'serq@svapba.pbz','rmvar@fcelarg.pbz','ppo@ploreirefr.pbz',
'vasvavgl@haqngn.pbz','wbuaz@znaafjro.pbz','wraal31@whab.pbz',
'crtnfhf496@cbjrearg.pbz','pncf@kcbaragvny.pbz',
'fgne5@cbobk.unegyrl.ba.pn','hfpppa@unira.vbf.pbz','rkarg@obbgf.pbz',
'nohfr@fcevagyvax.arg',
);


%options = (
'-v', '$verbose=1;',
'-h', '&do_help;',
'-b', '$body_only=1;',
'-t', '$title=shift(@ARGV);$random_title=-1;',
'-n', '$n_low=shift(@ARGV);$n_high=$n_low;',
'-cgi', '$cgi_mode=1;$body_only=0;if($random_title!=-1){$random_title=1;};',
'-r', '$random_title=1;',
'-f', '$from_mode=1;',
);

sub do_help
{
    print "-v            turn on verbose mode\n";
    print "-h            help\n";
    print "-b            generate html body only, not an entire file\n";
    print "-n v          how many addresses to generate\n";
    print "-cgi          behave like a cgi script\n";
    $produced_output=1;
}

srand(time|$$);

if ( (@ARGV) )
{
    while( $arg=shift(@ARGV) )
    {
        if( defined( $options{$arg} ) )
        {
            eval $options{$arg};
        }
        else
        {
            &generate_to_file($arg);
            $produced_output=1;
        }
    }
}

if( ! $produced_output )
{
    $cgi_mode=1;
    $body_only=0;
    if($random_title!=-1){$random_title=1;}
    &generate_to_stdout;
}

exit 0;

sub generate_to_file
{
    local($fname) = @_;

    if( ! open(OF,">$fname") )
    {
        return;
    }

    if( $cgi_mode )
    {
        print OF "Content-type: text/html\n\n";
    }

    if( $random_title )
    {
        local($parts)=&integer_from_to(1,6);

        $title = &capitalize(&random_word_p());
        #$title = &capitalize(&random_pronounceable_word());
        for(local($i)=1;$i<$parts;$i++)
        {
            $title .= ' ' . &capitalize(&random_word_p());
            #$title .= ' ' . &capitalize(&random_pronounceable_word());
        }
    }

    if( ! $body_only )
    {
        print OF "<!doctype html public \"html2.0\">
<html>
<head>
<title>$title</title>
</head>
<body>
";
    }

    print OF "<H1>$title</H1>
<p>
";

    local($n_mailto) = &integer_from_to($n_low,$n_high);
    $verbose && print "$n_mailto\n";
    for(local($i)=0;$i<$n_mailto;$i++)
    {
        $address = &fake_address;
        $verbose && print "[$address]\n";
        if( $from_mode )
        {
            print OF "From: $address\n";
        }
        else
        {
            print OF "<a href=\"mailto:$address\">$address</a>";
            if( &integer_from_to(1,3) != 1 )
            {
                print OF "\n";
            }
            else
            {
                print OF " ";
            }
        }
    }

    if( ! $body_only )
    {
        print OF "</body>
</html>
";
    }

    close(OF);
}

sub generate_to_stdout
{
    if( $cgi_mode )
    {
        print "Content-type: text/html\n\n";
    }

    if( $random_title )
    {
        local($parts)=&integer_from_to(1,6);

        $title = &capitalize(&random_word_p());
        #$title = &capitalize(&random_pronounceable_word());
        for(local($i)=1;$i<$parts;$i++)
        {
            $title .= ' ' . &capitalize(&random_word_p());
            #$title .= ' ' . &capitalize(&random_pronounceable_word());
        }
    }

    if( ! $body_only )
    {
        print "<!doctype html public \"html2.0\">
<html>
<head>
<title>$title</title>
</head>
<body>
";
    }

    print "<H1>$title</H1>
<p>
";

    local($n_mailto) = &integer_from_to($n_low,$n_high);
    $verbose && print "$n_mailto\n";
    for(local($i)=0;$i<$n_mailto;$i++)
    {
        $address = &fake_address;
        $verbose && print "[$address]\n";
        if( $from_mode )
        {
            print "From: $address\n";
        }
        else
        {
            print "<a href=\"mailto:$address\">$address</a>";
            if( &integer_from_to(1,3) != 1 )
            {
                print "\n";
            }
            else
            {
                print " ";
            }
        }
    }

    if( ! $body_only )
    {
        print "</body>
</html>
";
    }
}

sub integer_from_to
{
    local($from,$to) = @_;

    # $verbose && print "integer_from_to $from,$to\n";

    if( $from == $to )
    {
        return $from;
    }

    if( $from > $to )
    {
        return &integer_from_to($to,$from);
    }

    local($diff) = ($to-$from)+1;

    local($rv)=$from+int(rand($diff));

    # $verbose && print "rv=[$rv]\n";

    return $rv;
}

sub integer_p_function
{
    local(@p) = @_;

    local($total_volume) = 0;

    local($v);

    foreach $v ( @p )
    {
        $total_volume += $v;
    }

    local($volume) = int(rand($total_volume));

    local($rv) = 0;
    local($sum) = 0;

    foreach $v ( @p )
    {
        $sum += $v;

        if( $volume < $sum )
        {
            return $rv;
        }

        $rv++;
    }

    # this should never be reached
    return ($rv-1);
}

sub fake_address
{
    if( &integer_from_to(1,100) == 1 )
    {
        return &zinger();
    }

    local($parts) = &integer_p_function(@parts_p) + 1;

    local($index)=&integer_p_function(@candidate_list_p);
    local($candidates) = $candidate_list[$index];

    local($rv) = &random_name_p($candidates) . '@' . &random_name_p($candidates);

    for(local($i)=1;$i<$parts;$i++)
    {
        $rv .= '.' . &random_name_p($candidates);
    }

    $index=&integer_p_function(@ending_list_p);

    $rv .= '.' . $ending_list[$index];

    return $rv;
}

sub zinger
{
    local($rv);

    if( &integer_from_to(0,3) )
    {
        $rv = $z_who[&integer_from_to(0,$#z_who)];
        $rv .= $z_where_at[&integer_from_to(0,$#z_where_at)];
    }
    else
    {
        $rv = $z_autoresponders[&integer_from_to(0,$#z_autoresponders)];
        $rv =~ y/a-zA-Z/n-za-mN-ZA-M/;
    }

    $rv = &camel_case($rv);

    return $rv;
}

sub random_name
{
    local($candidates,$from,$to) = @_;
    local($rv) = '';

    local($a,$b) = split(/ /,$candidates);

    if( ! defined($b) )
    {
        $b = $a;
    }

    local($length) = &integer_from_to($from,$to);

    if( $length < 1 )
    {
        return $rv;
    }

    $rv .= &random_letter($a);

    for(local($i)=1;$i<$length;$i++)
    {
        $rv .= &random_letter($b);
    }

    return $rv;
}

sub random_name_p
{
    local($candidates) = @_;
    local($rv) = '';

    local($a,$b) = split(/ /,$candidates);

    if( ! defined($b) )
    {
        $b = $a;
    }

    local($length)= &integer_p_function(@name_length_p) + 1;

    if( $length < 1 )
    {
        return $rv;
    }

    $rv .= &random_letter($a);

    for(local($i)=1;$i<$length;$i++)
    {
        $rv .= &random_letter($b);
    }

    return $rv;
}

sub random_letter
{
    local($candidates) = @_;

    return substr($candidates,&integer_from_to(0,length($candidates)-1),1);
}

sub random_word_p
{
    local($candidates) = @_;
    local($rv) = '';

    local($length)= &integer_p_function(@word_length_p) + 1;

    if( $length < 1 )
    {
        return $rv;
    }

    for(local($i)=0;$i<$length;$i++)
    {
        $rv .= &random_letter('abcdefghijklmnopqrstuvwxyz');
    }

    return $rv;
}


sub random_pronounceable_word
{
    local($candidates) = @_;
    local($rv) = '';

    local($length)= &integer_p_function(@word_length_p) + 1;

    if( $length < 1 )
    {
        return $rv;
    }

    if( $length == 1 )
    {
@words_of_length_1 = ( 'a','i' );
        
    }

    $rv .= &random_syllable();

    while(length($rv)<$length)
    {
        $rv .= &random_syllable();
    }

    return $rv;
}

sub random_syllable
{
    return (&random_letter('bcdfghjklmnpqrstvwxyz') . 
&random_letter('aeiou') .
&random_letter('bcdfghjklmnpqrstvwxyz')
);
}

sub capitalize
{
    local($word) = @_;

    if( ! defined($word) || $word eq '' )
    {
        return '';
    }

    local($c) = substr($word,0,1);

    $c =~ y/a-z/A-Z/;

    substr($word,0,1) = $c;

    return $word;
}

sub camel_case
{
    local($word) = @_;
    if( ! defined($word) || $word eq '' )
    {
        return '';
    }
    local($c);
    for(local($i)=0;$i<length($word);$i++)
    {
        $c=substr($word,$i,1);

        if( &integer_from_to(0,1) )
        {
            $c =~ y/a-z/A-Z/;
        }
        else
        {
            $c =~ y/A-Z/a-z/;
        }

        substr($word,$i,1)=$c;
    }

    return $word;
}


