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
welcome to $BUCKY_NAME!
adduserform print qq(\n) if ($DEBUG); if ($invited) { print qq(\n); print qq(\n); } else { print qq(\n); } print <(lowercase):
password:
again!
real name:
email address:
adduserfoot print <hello there duder, please say hello
snark print <

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"; 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(

\n); print qq(\n) if ($DEBUG); print qq(\n); # keyword_pulldown(); print qq(\n); 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(); print qq(); print qq(); print qq(); print qq(); print qq(); print qq(); print qq(
); print qq(https://$BUCKY_HOST$BUCKY/invite/$i->{hash}); print qq(
); print qq(invited by ).profile_link($i->{attest}).qq(); print qq(); print qq(expires in); print qq(); print get_age($i->{expired}); print qq(); print invite_snuff_link("renew", $i->{id}) . qq( · ); print invite_snuff_link("cancel", $i->{id}); print qq(
); print qq(); } elsif ($i->{state} == $BUCKY_INVITE_REDEEMED) { print qq(); print qq(); print qq(); print qq(); print qq(); print qq(
); print qq(invited by ).profile_link($i->{attest}).qq(); print qq(); print qq(new user: ); print profile_link($i->{username}); 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(); print qq(); print qq(); print qq(); print qq(); print qq(); print qq(); if ($i->{state} > 0) { print qq(); print qq(); print qq(); print qq(); print qq(); } print qq(
username: $i->{username}
realname: $i->{realname}
email: $i->{email}
 $i->{grass}
); print qq(expires in); print qq(); print get_age($i->{expired}); print qq(); print invite_snuff_link("approve", $i->{id}) . qq( · ); print invite_snuff_link("reject", $i->{id}); 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;