Upgrade to Bugzilla 5.0.3.
[WebKit-https.git] / Websites / bugs.webkit.org / quips.cgi
1 #!/usr/bin/perl -T
2 # This Source Code Form is subject to the terms of the Mozilla Public
3 # License, v. 2.0. If a copy of the MPL was not distributed with this
4 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
5 #
6 # This Source Code Form is "Incompatible With Secondary Licenses", as
7 # defined by the Mozilla Public License, v. 2.0.
8
9 use 5.10.1;
10 use strict;
11 use warnings;
12
13 use lib qw(. lib);
14
15 use Bugzilla;
16 use Bugzilla::Constants;
17 use Bugzilla::Util;
18 use Bugzilla::Error;
19 use Bugzilla::User;
20 use Bugzilla::Token;
21
22 my $user = Bugzilla->login(LOGIN_REQUIRED);
23
24 my $cgi = Bugzilla->cgi;
25 my $dbh = Bugzilla->dbh;
26 my $template = Bugzilla->template;
27 my $vars = {};
28
29 my $action = $cgi->param('action') || "";
30 my $token = $cgi->param('token');
31
32 if ($action eq "show") {
33     # Read in the entire quip list
34     my $quipsref = $dbh->selectall_arrayref(
35                        "SELECT quipid, userid, quip, approved FROM quips ORDER BY quipid");
36
37     my $quips;
38     my @quipids;
39     foreach my $quipref (@$quipsref) {
40         my ($quipid, $userid, $quip, $approved) = @$quipref;
41         $quips->{$quipid} = {'userid' => $userid, 'quip' => $quip, 
42                              'approved' => $approved};
43         push(@quipids, $quipid);
44     }
45
46     my $users;
47     my $sth = $dbh->prepare("SELECT login_name FROM profiles WHERE userid = ?");
48     foreach my $quipid (@quipids) {
49         my $userid = $quips->{$quipid}{'userid'};
50         if ($userid && not defined $users->{$userid}) {
51             ($users->{$userid}) = $dbh->selectrow_array($sth, undef, $userid);
52         }
53     }
54     $vars->{'quipids'} = \@quipids;
55     $vars->{'quips'} = $quips;
56     $vars->{'users'} = $users;
57     $vars->{'show_quips'} = 1;
58 }
59
60 if ($action eq "add") {
61     (Bugzilla->params->{'quip_list_entry_control'} eq "closed") &&
62       ThrowUserError("no_new_quips");
63
64     check_hash_token($token, ['create-quips']);
65     # Add the quip 
66     my $approved = (Bugzilla->params->{'quip_list_entry_control'} eq "open")
67                    || $user->in_group('bz_quip_moderators') || 0;
68     my $comment = $cgi->param("quip");
69     $comment || ThrowUserError("need_quip");
70     
71     ThrowUserError("quip_too_long", { length => length($comment) }) 
72         if length($comment) > MAX_QUIP_LENGTH;
73
74     trick_taint($comment); # Used in a placeholder below
75
76     $dbh->do("INSERT INTO quips (userid, quip, approved) VALUES (?, ?, ?)",
77              undef, ($user->id, $comment, $approved));
78
79     $vars->{'added_quip'} = $comment;
80     $vars->{'message'} = 'quips_added';
81 }
82
83 if ($action eq 'approve') {
84     $user->in_group('bz_quip_moderators')
85       || ThrowUserError("auth_failure", {group  => "bz_quip_moderators",
86                                          action => "approve",
87                                          object => "quips"});
88
89     check_hash_token($token, ['approve-quips']);
90     # Read in the entire quip list
91     my $quipsref = $dbh->selectall_arrayref("SELECT quipid, approved FROM quips");
92     
93     my %quips;
94     foreach my $quipref (@$quipsref) {
95         my ($quipid, $approved) = @$quipref;
96         $quips{$quipid} = $approved;
97     }
98
99     my @approved;
100     my @unapproved;
101     foreach my $quipid (keys %quips) {
102         # Must check for each quipid being defined for concurrency and
103         # automated usage where only one quipid might be defined.
104         my $quip = $cgi->param("quipid_$quipid") ? 1 : 0;
105         if(defined($cgi->param("defined_quipid_$quipid"))) {
106             if($quips{$quipid} != $quip) {
107                 if($quip) { 
108                     push(@approved, $quipid); 
109                 } else { 
110                     push(@unapproved, $quipid); 
111                 }
112             }
113         }
114     }
115     $dbh->do("UPDATE quips SET approved = 1 WHERE quipid IN (" .
116             join(",", @approved) . ")") if($#approved > -1);
117     $dbh->do("UPDATE quips SET approved = 0 WHERE quipid IN (" .
118             join(",", @unapproved) . ")") if($#unapproved > -1);
119     $vars->{ 'approved' }   = \@approved;
120     $vars->{ 'unapproved' } = \@unapproved;
121     $vars->{'message'} = 'quips_approved_unapproved';
122 }
123
124 if ($action eq "delete") {
125     $user->in_group('bz_quip_moderators')
126       || ThrowUserError("auth_failure", {group  => "bz_quip_moderators",
127                                          action => "delete",
128                                          object => "quips"});
129     my $quipid = $cgi->param("quipid");
130     detaint_natural($quipid) || ThrowUserError("need_quipid");
131     check_hash_token($token, ['quips', $quipid]);
132
133     ($vars->{'deleted_quip'}) = $dbh->selectrow_array(
134                                     "SELECT quip FROM quips WHERE quipid = ?",
135                                     undef, $quipid);
136     $dbh->do("DELETE FROM quips WHERE quipid = ?", undef, $quipid);
137     $vars->{'message'} = 'quips_deleted';
138 }
139
140 print $cgi->header();
141 $template->process("list/quips.html.tmpl", $vars)
142   || ThrowTemplateError($template->error());