173 lines
4.9 KiB
Plaintext
173 lines
4.9 KiB
Plaintext
<?_code
|
|
|
|
use strict;
|
|
use vars qw(%FORM);
|
|
|
|
my $dbr = LJ::get_db_reader();
|
|
|
|
my ($ev, $sth, $ret);
|
|
my $mode = "intro";
|
|
|
|
sub p { $ret .= join('', @_); }
|
|
|
|
my $remote = LJ::get_remote();
|
|
|
|
return "<b>Error:</b> You don't have finduser(codetrace) priv."
|
|
unless LJ::check_priv($remote, "finduser", "codetrace");
|
|
|
|
if ($FORM{'user'} ne "") { $mode = "user"; $FORM{'code'} = ""; }
|
|
elsif ($FORM{'code'}) { $mode = "code"; }
|
|
|
|
p("<h1>code tracer</h1>\n");
|
|
p("<form method='get'>");
|
|
$ev = LJ::ehtml($FORM{'user'});
|
|
p("User: <input name='user' size='15' value='$ev'> or ");
|
|
$ev = LJ::ehtml($FORM{'code'});
|
|
p("Code: <input name='code' size='15' value='$ev'> <input type='submit' value=\"Trace\">");
|
|
p("</form>");
|
|
return $ret if $mode eq "intro";
|
|
|
|
my $do_how = sub {
|
|
my $self = shift;
|
|
my $u = shift;
|
|
|
|
my $whyhere = $dbr->selectrow_hashref(qq{
|
|
SELECT acid, userid FROM acctcode WHERE rcptid=$u->{'userid'} LIMIT 1
|
|
});
|
|
$whyhere->{'user'} = LJ::get_username($whyhere->{'userid'})
|
|
if $whyhere && $whyhere->{'userid'};
|
|
|
|
p("How $u->{'user'} joined: ");
|
|
unless ($whyhere) {
|
|
p("<i>No invite code</i>");
|
|
} else {
|
|
my $acid = LJ::acid_encode($whyhere->{'acid'});
|
|
p("<a href='codetrace.bml?code=$acid'>$acid</a>");
|
|
|
|
my $reason = $dbr->selectrow_array(qq{
|
|
SELECT reason FROM acctinvite WHERE acid=$whyhere->{'acid'}
|
|
});
|
|
p(" ($reason)") if defined $reason;
|
|
|
|
if (exists $whyhere->{'user'}) {
|
|
p(" from <a href='codetrace.bml?user=$whyhere->{'user'}'><b>$whyhere->{'user'}</b></a>.");
|
|
p("<br />");
|
|
$self->($self, $whyhere);
|
|
return;
|
|
}
|
|
}
|
|
p("<br />");
|
|
};
|
|
|
|
if ($mode eq "user")
|
|
{
|
|
my $user = LJ::canonical_username($FORM{'user'});
|
|
my $u = LJ::load_user($user) if $user;
|
|
return "Unknown user" unless $u;
|
|
$do_how->($do_how, $u);
|
|
|
|
my %invite;
|
|
$sth = $dbr->prepare(qq{
|
|
SELECT acid, reason, dateadd FROM acctinvite WHERE userid=$u->{'userid'}
|
|
LIMIT 5000
|
|
});
|
|
$sth->execute;
|
|
$invite{$_->{'acid'}} = $_ while $_ = $sth->fetchrow_hashref;
|
|
|
|
my $total_children = 0;
|
|
|
|
# limit recursion
|
|
my %did_userid;
|
|
my $total_calls = 0;
|
|
|
|
my $rec_user = sub {
|
|
my $self = shift;
|
|
my $userid = shift;
|
|
my $unused = shift;
|
|
|
|
# limit recursion (we were seeing runaways)
|
|
return if ++$total_calls > 50;
|
|
return if $did_userid{$userid}++;
|
|
|
|
my $sth = $dbr->prepare(qq{
|
|
SELECT a.acid, a.rcptid, u.user FROM acctcode a LEFT JOIN useridmap u ON a.rcptid=u.userid
|
|
WHERE a.userid=$userid
|
|
LIMIT 5000
|
|
});
|
|
$sth->execute;
|
|
my $open;
|
|
while (my ($acid, $rcptid, $user) = $sth->fetchrow_array)
|
|
{
|
|
next unless $unused || $user;
|
|
$total_children++ if defined $user;
|
|
unless ($open++) { p("<ul>"); }
|
|
my $acide = LJ::acid_encode($acid);
|
|
p("<li>");
|
|
p("<a href='codetrace.bml?user=$user'><b>$user</b></a> ") if $user;
|
|
p("(<a href='codetrace.bml?code=$acide'>$acide</a>)");
|
|
if ($invite{$acid}) {
|
|
p(" ($invite{$acid}->{'reason'}; $invite{$acid}->{'dateadd'})");
|
|
}
|
|
$self->($self, $rcptid, 0) if $rcptid;
|
|
p("</li>");
|
|
}
|
|
p("</ul>") if $open;
|
|
};
|
|
|
|
p("<p>Codes made/used by $user:");
|
|
$rec_user->($rec_user, $u->{'userid'}, 1);
|
|
p("<p><b>Total children:</b> $total_children");
|
|
|
|
return $ret;
|
|
}
|
|
|
|
if ($mode eq "code")
|
|
{
|
|
my $code = $FORM{'code'};
|
|
my $acid;
|
|
if ($code =~ /^\#(\d+)$/) {
|
|
$acid = $1;
|
|
$code = LJ::acid_encode($acid);
|
|
} else {
|
|
return "Bogus code." if length($code) != 7 && length($code) != 12;
|
|
$code =~ s/^.....(.......)$/$1/;
|
|
$acid = LJ::acid_decode($code);
|
|
}
|
|
p("Code: $code = $acid<br />");
|
|
|
|
my $ac = $dbr->selectrow_hashref("SELECT userid, rcptid FROM acctcode WHERE acid=$acid");
|
|
unless ($ac) {
|
|
p("Code doesn't exist");
|
|
return $ret;
|
|
}
|
|
my $ai = $dbr->selectrow_hashref("SELECT reason, dateadd FROM acctinvite WHERE acid=$acid");
|
|
$ac->{'user'} = LJ::get_username($ac->{'userid'})
|
|
if $ac->{'userid'};
|
|
$ac->{'ruser'} = LJ::get_username($ac->{'rcptid'})
|
|
if $ac->{'rcptid'};
|
|
|
|
p("Creator of code: <a href='codetrace.bml?user=$ac->{'user'}'>$ac->{'user'}</a> ($ai->{'reason'}, $ai->{'dateadd'})<br />")
|
|
if $ac->{'user'};
|
|
unless ($ac->{'userid'}) {
|
|
my $ap = $dbr->selectrow_hashref(qq{
|
|
SELECT p.userid, p.payid FROM payments p, acctpay ap
|
|
WHERE ap.payid=p.payid AND ap.acid=$acid
|
|
});
|
|
$ap ||= $dbr->selectrow_hashref(qq{
|
|
SELECT p.userid, p.payid FROM payments p, payitems pi, acctpayitem api
|
|
WHERE api.piid=pi.piid AND api.acid=$acid AND pi.payid=p.payid
|
|
});
|
|
if ($ap) {
|
|
p("Payment which generated code: <a href='/admin/accounts/paiddetails.bml?payid=$ap->{'payid'}&userid=$ap->{'userid'}'>$ap->{'payid'}</a><br />");
|
|
}
|
|
}
|
|
|
|
p("Code recipient: <a href='codetrace.bml?user=$ac->{'ruser'}'>$ac->{'ruser'}</a><br />");
|
|
|
|
return $ret;
|
|
}
|
|
|
|
$ret;
|
|
|
|
_code?>
|