#!/usr/bonsaitools/bin/perl -w # -*- Mode: perl; indent-tabs-mode: nil -*- # # The contents of this file are subject to the Mozilla Public # License Version 1.1 (the "License"); you may not use this file # except in compliance with the License. You may obtain a copy of # the License at http://www.mozilla.org/MPL/ # # Software distributed under the License is distributed on an "AS # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or # implied. See the License for the specific language governing # rights and limitations under the License. # # The Original Code is the Bugzilla Bug Tracking System. # # The Initial Developer of the Original Code is Netscape Communications # Corporation. Portions created by Netscape are # Copyright (C) 1998 Netscape Communications Corporation. All # Rights Reserved. # # Contributor(s): Dawn Endico # Terry Weissman use diagnostics; use strict; use RelationSet; use XML::Dumper; use Data::Dumper; #use vars %::COOKIE; require "CGI.pl"; print "Content-type: text/plain\n\n"; #$::lockcount = 0; my $dump = new XML::Dumper; my $exporter = $::COOKIE{"Bugzilla_login"}; sub QuoteXMLChars { $_[0] =~ s//>/g; $_[0] =~ s/'/'/g; $_[0] =~ s/"/"/g; $_[0] =~ s/&/&/g; # $_[0] =~ s/([\x80-\xFF])/&XmlUtf8Encode(ord($1))/ge; return($_[0]); } #if ($::FORM{'GoAheadAndLogIn'}) { # confirm_login(); #} confirm_login(); ConnectToDatabase(); GetVersionTable(); if (!defined $::FORM{'id'} || $::FORM{'id'} !~ /^\s*\d+\s*$/) { print "Content-type: text/html\n\n"; PutHeader("Export by bug number"); print "
\n"; print "You may export a single bug by entering its bug id here: \n"; print "\n"; print "\n"; print "
\n"; PutFooter(); exit; } $! = 0; my $loginok = quietly_check_login(); my $id = $::FORM{'id'}; my $query = " select bugs.bug_id, product, version, rep_platform, op_sys, bug_status, resolution, priority, bug_severity, component, assigned_to, reporter, bug_file_loc, short_desc, target_milestone, qa_contact, status_whiteboard, date_format(creation_ts,'%Y-%m-%d %H:%i'), groupset, delta_ts, sum(votes.count) from bugs left join votes using(bug_id) where bugs.bug_id = $id and bugs.groupset & $::usergroupset = bugs.groupset group by bugs.bug_id"; SendSQL($query); my %bug; my @row; if (@row = FetchSQLData()) { my $count = 0; my %fields; foreach my $field ("bug_id", "product", "version", "rep_platform", "op_sys", "bug_status", "resolution", "priority", "bug_severity", "component", "assigned_to", "reporter", "bug_file_loc", "short_desc", "target_milestone", "qa_contact", "status_whiteboard", "creation_ts", "groupset", "delta_ts", "votes") { $fields{$field} = shift @row; if ($fields{$field}) { $bug{$field} = $fields{$field}; } $count++; } } else { SendSQL("select groupset from bugs where bug_id = $id"); if (@row = FetchSQLData()) { print "Content-type: text/html\n\n"; PutHeader("Export by bug number"); print "

Permission denied.

\n"; if ($loginok) { print "Sorry; you do not have the permissions necessary to see\n"; print "bug $id.\n"; } else { print "Sorry; bug $id can only be viewed when logged\n"; print "into an account with the appropriate permissions. To\n"; print "see this bug, you must first\n"; print ""; print "log in."; } } else { print "Content-type: text/html\n\n"; PutHeader("Export by bug number"); print "

Bug not found

\n"; print "There does not seem to be a bug numbered $id.\n"; } PutFooter(); exit; } if ($bug{'short_desc'}) { $bug{'short_desc'} = QuoteXMLChars( $bug{'short_desc'} ); } if (defined $bug{'status_whiteboard'}) { $bug{'status_whiteboard'} = QuoteXMLChars($bug{'status_whiteboard'}); } $bug{'assigned_to'} = DBID_to_real_or_loginname($bug{'assigned_to'}); $bug{'reporter'} = DBID_to_real_or_loginname($bug{'reporter'}); my $ccSet = new RelationSet; $ccSet->mergeFromDB("select who from cc where bug_id=$id"); my @cc = $ccSet->toArrayOfStrings(); if (@cc) { $bug{'cc'} = \@cc; } if (Param("useqacontact") && (defined $bug{'qa_contact'}) ) { my $name = $bug{'qa_contact'} > 0 ? DBID_to_name($bug{'qa_contact'}) : ""; if ($name) { $bug{'qa_contact'} = $name; } } if (@::legal_keywords) { SendSQL("SELECT keyworddefs.name FROM keyworddefs, keywords WHERE keywords.bug_id = $id AND keyworddefs.id = keywords.keywordid ORDER BY keyworddefs.name"); my @list; while (MoreSQLData()) { push(@list, FetchOneColumn()); } if (@list) { $bug{'keywords'} = html_quote(join(', ', @list)); } } SendSQL("select attach_id, creation_ts, description from attachments where bug_id = $id"); my @attachments; while (MoreSQLData()) { my ($attachid, $date, $desc) = (FetchSQLData()); if ($date =~ /^(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)$/) { $date = "$3/$4/$2 $5:$6"; my %attach; $attach{'attachid'} = $attachid; $attach{'date'} = $date; $attach{'desc'} = html_quote($desc); push @attachments, \%attach; } } if (@attachments) { $bug{'attachments'} = \@attachments; } SendSQL("select bug_id, who, bug_when, thetext from longdescs where bug_id = $id"); my @longdescs; while (MoreSQLData()) { my ($bug_id, $who, $bug_when, $thetext) = (FetchSQLData()); my %longdesc; $longdesc{'who'} = $who; $longdesc{'bug_when'} = $bug_when; $longdesc{'thetext'} = html_quote($thetext); push @longdescs, \%longdesc; } if (@longdescs) { $bug{'longdescs'} = \@longdescs; } sub EmitDependList { my ($myfield, $targetfield) = (@_); my @list; SendSQL("select dependencies.$targetfield, bugs.bug_status from dependencies, bugs where dependencies.$myfield = $id and bugs.bug_id = dependencies.$targetfield order by dependencies.$targetfield"); while (MoreSQLData()) { my ($i, $stat) = (FetchSQLData()); push @list, $i; } return @list; } if (Param("usedependencies")) { my @depends = EmitDependList("blocked", "dependson"); if ( @depends ) { $bug{'dependson'} = \@depends; } my @blocks = EmitDependList("dependson", "blocked"); if ( @blocks ) { $bug{'blocks'} = \@blocks; } } sub Log { my ($str) = (@_); Lock(); open(FID, ">>data/maillog") || die "Can't write to data/maillog"; print FID time2str("%D %H:%M", time()) . ": $str\n"; close FID; Unlock(); } sub Lock { if ($::lockcount <= 0) { $::lockcount = 0; if (!open(LOCKFID, ">>data/maillock")) { mkdir "data", 0777; chmod 0777, "data"; open(LOCKFID, ">>data/maillock") || die "Can't open lockfile."; } my $val = flock(LOCKFID,2); if (!$val) { # '2' is magic 'exclusive lock' const. print "Content-type: text/html\n\n"; print "Lock failed: $val\n"; } chmod 0666, "data/maillock"; } $::lockcount++; } sub Unlock { $::lockcount--; if ($::lockcount <= 0) { flock(LOCKFID,8); # '8' is magic 'unlock' const. close LOCKFID; } } my $xml; $xml = "\n"; $xml .= "\n"; $xml .= "\n"; $xml .= "\n"; foreach my $field ("bug_id", "urlbase", "bug_status", "product", "priority", "version", "rep_platform", "assigned_to", "delta_ts", "component", "reporter", "target_milestone", "bug_severity", "creation_ts", "qa_contact", "op_sys", "resolution", "bug_file_loc", "short_desc", "keywords", "status_whiteboard") { if ($bug{$field}) { $xml .= " <$field>" . $bug{$field} . "\n"; } } foreach my $field ("dependson", "blocks", "cc") { if (defined $bug{$field}) { for (my $i=0 ; $i < @{$bug{$field}} ; $i++) { $xml .= " <$field>" . $bug{$field}[$i] . "\n"; } } } if (defined $bug{'longdescs'}) { for (my $i=0 ; $i < @{$bug{'longdescs'}} ; $i++) { $xml .= " \n"; $xml .= " " . DBID_to_name($bug{'longdescs'}[$i]->{'who'}) . "\n"; $xml .= " " . $bug{'longdescs'}[$i]->{'bug_when'} . "\n"; $xml .= " " . QuoteXMLChars($bug{'longdescs'}[$i]->{'thetext'}) . "\n"; $xml .= " \n"; } } if (defined $bug{'attachments'}) { for (my $i=0 ; $i < @{$bug{'attachments'}} ; $i++) { $xml .= " \n"; $xml .= " ".$bug{'attachments'}[$i]->{'attachid'}."\n"; $xml .= " ".$bug{'attachments'}[$i]->{'date'} . "\n"; $xml .= " ".$bug{'attachments'}[$i]->{'desc'} . "\n"; # $xml .= " ".$bug{'attachments'}[$i]->{'type'} . "\n"; # $xml .= " ".$bug{'attachments'}[$i]->{'data'} . "\n"; $xml .= " \n"; } } $xml .= "\n"; $xml .= "\n"; print $xml; #my $msg = "To: $exporter\n"; #$msg = $msg . "From: Bugalicious \n"; #$msg = $msg . "Subject: XML\n\n"; #$msg = $msg . $xml . "\n"; #open(SENDMAIL, # "|/usr/lib/sendmail -ODeliveryMode=deferred -t") || # die "Can't open sendmail"; #print SENDMAIL $msg; #close SENDMAIL; #my $logstr = "XML: bug $id sent to $to"; #Log($logstr); 1;