#!/usr/bin/perl -wT use strict; use lib qw(. lib); use Data::Dumper; use Bugzilla; use Bugzilla::Constants; use Bugzilla::Util; use Bugzilla::User; my $cgi = Bugzilla->cgi; my $vars = {}; my $myuser = Bugzilla->login(LOGIN_REQUIRED); my $dbh = Bugzilla->switch_to_shadow_db(); my ($query, $matchstr, $userid, $limit, $login_name); print $cgi->header(); $matchstr = $cgi->param('matchstr'); $userid = $cgi->param('userid'); $userid = undef unless defined($userid) and $userid =~ /^\d+$/; if (!defined($matchstr) and !defined($userid)) { print "No search parameters specified!
\n"; print "Put matchstr or userid in the URL parameters.
\n"; exit(0); } exit 0 if !defined($matchstr) and !defined($userid); $limit = $cgi->param('limit'); $limit = 50 unless defined($limit) and $limit =~ /^\d+$/; trick_taint($matchstr) if defined($matchstr); trick_taint($userid) if defined($userid); trick_taint($limit); $userid = $matchstr ? login_to_id($matchstr) : $userid; $login_name = $matchstr ? $matchstr : Bugzilla::User->new($userid)->login; if (!$userid || !$login_name) { print "Bad user!
"; exit(0); } $query = qq{ (SELECT bug_id, bug_when, fielddefs.name AS field FROM bugs_activity JOIN fielddefs ON bugs_activity.fieldid=fielddefs.id WHERE who=? ORDER BY bug_when DESC LIMIT $limit) UNION (SELECT bug_id, bug_when, 'ZZcomment #' AS field FROM longdescs WHERE who=? ORDER BY bug_when DESC LIMIT $limit) UNION (SELECT bug_id, creation_ts AS bug_when, CONCAT('ZZattachment #', attach_id) AS field FROM attachments WHERE submitter_id=? ORDER BY creation_ts DESC LIMIT $limit) ORDER BY bug_when DESC LIMIT $limit}; my $actions = $dbh->selectall_arrayref($query, {Slice => {}}, ($userid, $userid, $userid),); #print Dumper($vars); printf "

Custom User History: %s

\n", $login_name; print "\n"; printf "\n", $login_name; printf "\n", $userid; print "
login_name%s
userid%s
\n"; sub show_bug_url { return "/show_bug.cgi?id=" . shift; } print q{

Bug History

}; my $counter = 0; foreach my $row (@$actions) { $counter++; my $url = show_bug_url($row->{'bug_id'}); ( my $message = qq{ } ) =~ s/^\t{1}//mg; print $message; } print qq{
Timestamp BugID Field
$row->{'bug_when'} $row->{'bug_id'} $row->{'field'}
History Done
Limit=${limit}
Count=${counter}
}; $query = q{ SELECT p2.userid AS grantor_id, p1.userid AS grantee_id, p2.login_name AS grantor, p1.login_name AS grantee, profiles_when, oldvalue, newvalue FROM profiles p1 JOIN profiles_activity ON p1.userid=profiles_activity.userid JOIN profiles p2 ON p2.userid=who WHERE FALSE OR p1.userid = ? OR p2.userid = ? ORDER BY profiles_when}; $actions = $dbh->selectall_arrayref($query, {Slice => {}}, ($userid, $userid),); print qq{

Profile Activity

Applied to ${login_name}:

}; foreach my $row (@$actions) { next unless $row->{'grantee_id'} == $userid; ( my $message = qq{ } ) =~ s/^\t{1}//mg; print $message; } print qq{
Timestamp Grantor Grantee Oldvalue Newvalue
$row->{'profiles_when'} $row->{'grantor'} $row->{'grantee'} $row->{'oldvalue'} $row->{'newvalue'}

Applied by ${login_name}:

}; foreach my $row (@$actions) { next unless $row->{'grantor_id'} == $userid; ( my $message = qq{ } ) =~ s/^\t{1}//mg; print $message; } print "
Timestamp Grantor Grantee Oldvalue Newvalue
$row->{'profiles_when'} $row->{'grantor'} $row->{'grantee'} $row->{'oldvalue'} $row->{'newvalue'}
\n"; $query = q{ SELECT p1.userid AS watcher_id, p2.userid AS watched_id, p1.login_name AS watcher, p2.login_name AS watched FROM profiles p1 JOIN watch ON p1.userid=watch.watcher JOIN profiles p2 ON p2.userid=watch.watched WHERE FALSE OR p1.userid = ? OR p2.userid = ? ORDER BY watcher,watched }; $actions = $dbh->selectall_arrayref($query, {Slice => {}}, ($userid, $userid),); print "

Watch status

\n"; printf "

Watchers of %s:

\n", $login_name; foreach my $row (@$actions) { printf "%s
\n", $row->{'watcher'} if $row->{'watched_id'} == $userid; } printf "
\n"; printf "

Watched by %s:

", $login_name; foreach my $row (@$actions) { printf "%s
\n", $row->{'watched'} if $row->{'watcher_id'} == $userid; } printf "
\n"; $query = q{ SELECT at_time, user_id, profiles.login_name AS login_name, class, object_id, field FROM audit_log LEFT JOIN profiles ON profiles.userid=audit_log.user_id WHERE FALSE OR audit_log.user_id=? OR (audit_log.class = 'Bugzilla::User' AND audit_log.object_id=?) ORDER BY at_time }; my $audits = $dbh->selectall_arrayref($query, {Slice => {}}, ($userid, $userid),); print qq{

Audit log

Changes by ${login_name}:

}; foreach my $row (@$audits) { next unless $row->{'user_id'} == $userid; ( my $message = qq{ } ) =~ s/^\t{1}//mg; print $message; } print qq{
Timestamp User Class/ID Field
$row->{'at_time'} $row->{'login_name'} ($row->{'user_id'}) $row->{'class'}/$row->{'object_id'} $row->{'field'}

Changes to ${login_name}:

}; foreach my $row (@$audits) { next unless $row->{'object_id'} == $userid && $row->{'class'} eq 'Bugzilla::User'; ( my $message = qq{ } ) =~ s/^\t{1}//mg; print $message; } print qq{
Timestamp User Class/ID Field
$row->{'at_time'} $row->{'login_name'} ($row->{'user_id'}) $row->{'class'}/$row->{'object_id'} $row->{'field'}

Done.
};