Upgrade bugs.webkit.org to Bugzilla 4.2
[WebKit-https.git] / Websites / bugs.webkit.org / quips.cgi
1 #!/usr/bin/env perl -wT
2 # -*- Mode: perl; indent-tabs-mode: nil -*-
3 #
4 # The contents of this file are subject to the Mozilla Public
5 # License Version 1.1 (the "License"); you may not use this file
6 # except in compliance with the License. You may obtain a copy of
7 # the License at http://www.mozilla.org/MPL/
8 #
9 # Software distributed under the License is distributed on an "AS
10 # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
11 # implied. See the License for the specific language governing
12 # rights and limitations under the License.
13 #
14 # The Original Code is the Bugzilla Bug Tracking System.
15 #
16 # The Initial Developer of the Original Code is Netscape Communications
17 # Corporation. Portions created by Netscape are
18 # Copyright (C) 1998 Netscape Communications Corporation. All
19 # Rights Reserved.
20 #
21 # Contributor(s): Owen Taylor <otaylor@redhat.com>
22 #                 Gervase Markham <gerv@gerv.net>
23 #                 David Fallon <davef@tetsubo.com>
24 #                 Tobias Burnus <burnus@net-b.de>
25
26 use strict;
27
28 use lib qw(. lib);
29
30 use Bugzilla;
31 use Bugzilla::Constants;
32 use Bugzilla::Util;
33 use Bugzilla::Error;
34 use Bugzilla::User;
35 use Bugzilla::Token;
36
37 my $user = Bugzilla->login(LOGIN_REQUIRED);
38
39 my $cgi = Bugzilla->cgi;
40 my $dbh = Bugzilla->dbh;
41 my $template = Bugzilla->template;
42 my $vars = {};
43
44 my $action = $cgi->param('action') || "";
45 my $token = $cgi->param('token');
46
47 if ($action eq "show") {
48     # Read in the entire quip list
49     my $quipsref = $dbh->selectall_arrayref(
50                        "SELECT quipid, userid, quip, approved FROM quips");
51
52     my $quips;
53     my @quipids;
54     foreach my $quipref (@$quipsref) {
55         my ($quipid, $userid, $quip, $approved) = @$quipref;
56         $quips->{$quipid} = {'userid' => $userid, 'quip' => $quip, 
57                              'approved' => $approved};
58         push(@quipids, $quipid);
59     }
60
61     my $users;
62     my $sth = $dbh->prepare("SELECT login_name FROM profiles WHERE userid = ?");
63     foreach my $quipid (@quipids) {
64         my $userid = $quips->{$quipid}{'userid'};
65         if ($userid && not defined $users->{$userid}) {
66             ($users->{$userid}) = $dbh->selectrow_array($sth, undef, $userid);
67         }
68     }
69     $vars->{'quipids'} = \@quipids;
70     $vars->{'quips'} = $quips;
71     $vars->{'users'} = $users;
72     $vars->{'show_quips'} = 1;
73 }
74
75 if ($action eq "add") {
76     (Bugzilla->params->{'quip_list_entry_control'} eq "closed") &&
77       ThrowUserError("no_new_quips");
78
79     check_hash_token($token, ['create-quips']);
80     # Add the quip 
81     my $approved = (Bugzilla->params->{'quip_list_entry_control'} eq "open")
82                    || $user->in_group('bz_quip_moderators') || 0;
83     my $comment = $cgi->param("quip");
84     $comment || ThrowUserError("need_quip");
85     trick_taint($comment); # Used in a placeholder below
86
87     $dbh->do("INSERT INTO quips (userid, quip, approved) VALUES (?, ?, ?)",
88              undef, ($user->id, $comment, $approved));
89
90     $vars->{'added_quip'} = $comment;
91 }
92
93 if ($action eq 'approve') {
94     $user->in_group('bz_quip_moderators')
95       || ThrowUserError("auth_failure", {group  => "bz_quip_moderators",
96                                          action => "approve",
97                                          object => "quips"});
98
99     check_hash_token($token, ['approve-quips']);
100     # Read in the entire quip list
101     my $quipsref = $dbh->selectall_arrayref("SELECT quipid, approved FROM quips");
102     
103     my %quips;
104     foreach my $quipref (@$quipsref) {
105         my ($quipid, $approved) = @$quipref;
106         $quips{$quipid} = $approved;
107     }
108
109     my @approved;
110     my @unapproved;
111     foreach my $quipid (keys %quips) {
112         # Must check for each quipid being defined for concurrency and
113         # automated usage where only one quipid might be defined.
114         my $quip = $cgi->param("quipid_$quipid") ? 1 : 0;
115         if(defined($cgi->param("defined_quipid_$quipid"))) {
116             if($quips{$quipid} != $quip) {
117                 if($quip) { 
118                     push(@approved, $quipid); 
119                 } else { 
120                     push(@unapproved, $quipid); 
121                 }
122             }
123         }
124     }
125     $dbh->do("UPDATE quips SET approved = 1 WHERE quipid IN (" .
126             join(",", @approved) . ")") if($#approved > -1);
127     $dbh->do("UPDATE quips SET approved = 0 WHERE quipid IN (" .
128             join(",", @unapproved) . ")") if($#unapproved > -1);
129     $vars->{ 'approved' }   = \@approved;
130     $vars->{ 'unapproved' } = \@unapproved;
131 }
132
133 if ($action eq "delete") {
134     $user->in_group('bz_quip_moderators')
135       || ThrowUserError("auth_failure", {group  => "bz_quip_moderators",
136                                          action => "delete",
137                                          object => "quips"});
138     my $quipid = $cgi->param("quipid");
139     ThrowCodeError("need_quipid") unless $quipid =~ /(\d+)/; 
140     $quipid = $1;
141     check_hash_token($token, ['quips', $quipid]);
142
143     ($vars->{'deleted_quip'}) = $dbh->selectrow_array(
144                                     "SELECT quip FROM quips WHERE quipid = ?",
145                                     undef, $quipid);
146     $dbh->do("DELETE FROM quips WHERE quipid = ?", undef, $quipid);
147 }
148
149 print $cgi->header();
150 $template->process("list/quips.html.tmpl", $vars)
151   || ThrowTemplateError($template->error());