From e9192b3d42660a5781101df4357d276318151e8a Mon Sep 17 00:00:00 2001 From: Jules Laplace Date: Fri, 2 Aug 2013 17:14:41 -0500 Subject: cgi-bin & lib --- lib/invite.pm | 485 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 485 insertions(+) create mode 100644 lib/invite.pm (limited to 'lib/invite.pm') diff --git a/lib/invite.pm b/lib/invite.pm new file mode 100644 index 0000000..96c6de0 --- /dev/null +++ b/lib/invite.pm @@ -0,0 +1,485 @@ + +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; + -- cgit v1.2.3-70-g09d2