sub request_invite
{
my $clean_invite = parse_registration_input();
my $result = 0;
if ($clean_invite != -1)
{
new_invite($clean_invite);
request_success();
}
}
sub generate_invite
{
my $invite_count = count_active_user_invites($USER->{username});
my $newhash;
# don't invite your whole social network
if ($invite_count >= 5)
{ return -1 unless ($USER->{ulevel} == 3); }
for (my $i = 0; $i < 3; $i++)
{
$newhash = make_new_hash($USER->{username} . time);
my $invite = get_invite_from_hash($hash);
last unless (invite_is_active($invite));
}
my $clean_invite = parse_invite_input($newhash);
if ($clean_invite != -1)
{ $result = new_invite($clean_invite); }
$result ? return $newhash : return -1;
}
sub validate_invite
{
my ($hash) = @_;
my $invite = get_invite_from_hash($hash);
unless (invite_is_active($invite))
{ error("Bad invite key!"); }
my $clean_register = parse_registration_input();
if ($clean_register != -1)
{
my $uid = new_user($clean_register);
set_invite_state($invite, $BUCKY_INVITE_REDEEMED);
set_invite_username($invite, $clean_register->{username});
# auto-op on keywords
add_mailbox("$clean_register->{username}.inbox", $clean_register->{username}, 0);
add_mailbox("$clean_register->{username}.outbox", $clean_register->{username}, 0);
add_mailbox("$clean_register->{username}.drafts", $clean_register->{username}, 1);
send_welcome_message($uid);
send_invite_receipt($invite->{attest}, $clean_register, $invite);
send_invite_receipt($BUCKY_ADMINISTRATOR, $clean_register, $invite);
validate_success();
}
}
sub validate_approve
{
my ($invite) = @_;
my $o =
{
username => $invite->{username},
password => $invite->{password},
realname => $invite->{realname},
email => $invite->{email},
grass => $invite->{grass}
};
my $uid = new_user($o);
$result = set_invite_state($invite, $BUCKY_INVITE_APPROVED);
# auto-op on keywords
add_mailbox("$o->{username}.inbox", $o->{username}, 0);
add_mailbox("$o->{username}.outbox", $o->{username}, 0);
add_mailbox("$o->{username}.drafts", $o->{username}, 1);
send_welcome_message($uid);
return 1;
}
sub send_invite_receipt
{
my ($recipient, $newuser, $invite) = @_;
my $mbox = ($recipient eq $BUCKY_ADMINISTRATOR) ? "$recipient.system" : "$recipient.inbox";
$transcript =
qq($newuser->{username} has created an account via invite.\n\n) .
qq(real name: $newuser->{realname}\n\n) .
qq(email: $newuser->{email}\n\n) .
qq(invited by: $invite->{attest}\n\n);
new_message($mbox,
{
sender => "system",
recipient => $recipient,
unread => 1,
subject => "New user $newuser->{username} via invite",
body => $transcript
} );
}
#############################
sub validate_success
{
header("account created!");
print qq(
);
print "Your $BUCKY_NAME account has created!
";
print "Please log in for the first time.\n";
print qq(
\n\n);
login_form();
print qq(
\n\n);
footer();
}
sub request_success
{
header("account requested!");
print qq(
\n\n);
print "Your request for a $BUCKY_NAME account has been submitted and will be acted upon shortly.";
print qq(back to $BUCKY_NAME);
footer();
}
#############################
sub registration_form
{
my ($invite) = @_;
my $invited = defined($invite) && $invite != -1;
if ($invited)
{ header("create an account"); }
else
{ header("request an account"); }
print <

may i note here . . . that i test this with firefox
|
addusereof
footer();
}
#############################
sub parse_invite_input
{
my ($newhash) = @_;
my $safe = 1;
my $clean =
{
state => $BUCKY_INVITE_ACTIVE,
hash => $newhash,
attest => $USER->{username},
keywords => scrub($input->{keyword})
};
if ($safe)
{ return $clean; }
else
{ return -1; }
}
sub parse_registration_input
{
my @error;
my $clean;
if ($input->{username} =~ /(root|system|bucky|$BUCKY_SHORT_NAME)/)
{ push @error, "Illegal username"; }
if ($input->{username} =~ /\s/)
{ push @error, "Username cannot contain spaces"; }
if ($input->{pw1} ne $input->{pw2})
{ push @error, "Passwords don't match"; }
if (get_user($input->{username}) != -1)
{ push @error, "User already exists"; }
$clean =
{
state => $BUCKY_INVITE_REQUEST,
username => lc(scrub($input->{username})),
password => crypt($input->{pw1}, lc(scrub($input->{username}))),
realname => scrub($input->{realname}),
email => scrub($input->{email}),
grass => scrub($input->{grass})
};
if (@error)
{
registration_form_error(@error);
return -1;
}
else
{
return $clean;
}
}
sub registration_form_error
{
my (@error) = @_;
header("registration form error");
print "Sorry, there was an error in your registration:";
print "
\n";
foreach my $e (@error)
{
print "- $e\n";
}
print "
\n";
print qq(Please go back and fix it . . .);
footer();
exit(1);
}
#############################
sub invite_result_box
{
my ($command, $hash, $result) = @_;
print qq(
);
if ($command eq "new")
{
if ($result)
{
print qq(
invite created!);
print qq(give the url to your friend!);
}
else
{
print qq(you were unable to make a new invite!
);
print qq(maybe you have been inviting too many people?!);
}
}
else
{
print qq($command );
print $result ? "succeeded!" : "failed!";
}
print qq(
\n);
}
sub invite_create_box
{
print qq();
print qq(
invite whomever..\n
\n);
print qq(only invite goodfellows,
my fellow ).$BUCKY_DUDER_NOUN.qq(s.
);
print qq(
);
print qq(
\n);
}
#############################
sub display_personal_invites
{
my $user_invites = get_invites_by_user($USER->{username});
return if ($user_invites == -1);
print "Your invites:";
display_invites_table($user_invites);
}
sub display_approve_list
{
my $invites = get_active_invites();
print "Active invites and requests:
";
display_invites_table($invites);
}
{
my %invites_seen;
sub display_invites_table
{
my ($invites) = @_;
my $r = 0;
print qq(
\n);
foreach my $i (sort { $b->{id} <=> $a->{id} } @$invites)
{
next if (exists($invites_seen{$i->{id}})); # minimize redundancy in admin list
$invites_seen{$i->{id}} = 1;
display_single_invite($i, $r);
$r = $r ? 0 : 1;
}
print qq(
);
}
}
sub display_single_invite
{
my ($i, $r) = @_;
print qq();
print qq(| );
print qq() if ($i->{state} == 2);
print $BUCKY_INVITE_STATES[$i->{state}];
print qq() if ($i->{state} == 2);
print qq( | );
if ($i->{hash})
{ display_invite_row($i); }
else
{ display_approve_row($i); }
print qq(
\n);
}
sub display_invite_row
{
my ($i) = @_;
if ($i->{state} > 0)
{
print qq();
print qq();
print qq(| );
print qq(http://$BUCKY_HOST$BUCKY/invite/$i->{hash});
print qq( | );
print qq();
print qq();
print qq(| );
print qq(invited by ).profile_link($i->{attest}).qq();
print qq( | );
print qq();
print qq(expires in);
print qq( | );
print qq();
print get_age($i->{expired});
print qq( | );
print qq();
print invite_snuff_link("renew", $i->{id}) . qq( · );
print invite_snuff_link("cancel", $i->{id});
print qq( | );
print qq( );
print qq( );
print qq( | );
}
elsif ($i->{state} == $BUCKY_INVITE_REDEEMED)
{
print qq();
print qq();
print qq(| );
print qq(invited by ).profile_link($i->{attest}).qq();
print qq( | );
print qq();
print qq(new user: );
print profile_link($i->{username});
print qq( | );
print qq();
print qq( );
print qq( | );
}
else
{
print qq( | );
}
}
# username => lc(scrub($input->{username})),
# realname => scrub($input->{realname}),
# email => scrub($input->{email}),
# grass => scrub($input->{grass})
sub display_approve_row
{
my ($i) = @_;
print qq();
print qq(| username: | $i->{username} | );
print qq(| realname: | $i->{realname} | );
print qq(| email: | $i->{email} | );
print qq();
print qq(| | );
print qq($i->{grass} | );
print qq( );
if ($i->{state} > 0)
{
print qq();
print qq(| );
print qq(expires in);
print qq( | );
print qq();
print get_age($i->{expired});
print qq( | );
print qq();
print invite_snuff_link("approve", $i->{id}) . qq( · );
print invite_snuff_link("reject", $i->{id});
print qq( | );
print qq( );
}
print qq( );
print qq( | );
}
sub invite_snuff_link
{
my ($c, $id) = @_;
return qq($c);
}
#############################
sub make_new_hash
{
my ($string) = @_;
$string = length($string) ? $string : time;
$hex = md5_hex ($string);
return substr $hex, 0, 16; # these will TOTALLY never collide
}
sub invite_is_active
{
my ($invite) = @_;
return 0 if ($invite == -1);
return 0 if ($invite->{state} < 1);
#if ($invite->{expired} < time)
# {
# set_invite_state($invite, $BUCKY_INVITE_EXPIRED);
# return 0;
# }
return 1;
}
1;