pkgfuncs.inc 38.1 KB
Newer Older
1
<?php
2
include_once("pkgfuncs_po.inc");
3
include_once("config.inc");
eric's avatar
eric committed
4

5
6
# define variables used during pkgsearch
#
simo's avatar
simo committed
7
$pkgsearch_vars = array("O", "L", "C", "K", "SB", "SO", "PP", "do_MyPackages", "do_Orphans", "SeB");
8

9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# Make sure this visitor can delete the requested package comment
# They can delete if they were the comment submitter, or if they are a TU/Dev
#
function canDeleteComment($comment_id=0, $atype="", $SID="") {
	if ($atype == "Trusted User" || $atype == "Developer") {
		# A TU/Dev can delete any comment
		#
		return TRUE;
	}
	$uid = uid_from_sid($SID);
	$dbh = db_connect();
	$q = "SELECT COUNT(ID) AS CNT ";
	$q.= "FROM PackageComments ";
	$q.= "WHERE ID = " . intval($comment_id);
	$q.= " AND UsersID = " . $uid;
	$result = db_query($q, $dbh);
	if ($result != NULL) {
		$row = mysql_fetch_assoc($result);
		if ($row['CNT'] > 0) {
			return TRUE;
		}
	}
	return FALSE;
}
eric's avatar
eric committed
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55

# see if this Users.ID can manage the package
#
function canManagePackage($uid=0,$AURMUID=0, $MUID=0, $SUID=0, $managed=0) {
	if (!$uid) {return 0;}

	# The uid of the TU/Dev that manages the package
	#
	if ($uid == $AURMUID) {return 1;}

	# If the package isn't maintained by a TU/Dev, is this the user-maintainer?
	#
	if ($uid == $MUID && !$managed) {return 1;}

	# If the package isn't maintained by a TU/Dev, is this the user-submitter?
	#
	if ($uid == $SUID && !$managed) {return 1;}

	# otherwise, no right to manage this package
	#
	return 0;
}

eric's avatar
eric committed
56
57
58
59
60
# grab the current list of PackageCategories
#
function pkgCategories() {
	$cats = array();
	$dbh = db_connect();
61
	$q = "SELECT * FROM PackageCategories WHERE ID != 1 ";
eric's avatar
eric committed
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
	$q.= "ORDER BY Category ASC";
	$result = db_query($q, $dbh);
	if ($result) {
		while ($row = mysql_fetch_row($result)) {
			$cats[$row[0]] = $row[1];
		}
	}
	return $cats;
}

# grab the current list of PackageLocations
#
function pkgLocations() {
	$locs = array();
	$dbh = db_connect();
77
	$q = "SELECT * FROM PackageLocations WHERE ID != 1 AND ID < 4 ";
eric's avatar
eric committed
78
79
80
81
82
83
84
85
86
87
	$q.= "ORDER BY Location ASC";
	$result = db_query($q, $dbh);
	if ($result) {
		while ($row = mysql_fetch_row($result)) {
			$locs[$row[0]] = $row[1];
		}
	}
	return $locs;
}

88
89
90
91
92
93
# check to see if the package name exists
#
function package_exists($name="") {
	if (!$name) {return NULL;}
	$dbh = db_connect();
	$q = "SELECT ID FROM Packages ";
94
	$q.= "WHERE Name = '".mysql_real_escape_string($name)."' ";
95
96
97
98
99
100
101
	$q.= "AND DummyPkg = 0";
	$result = db_query($q, $dbh);
	if (!$result) {return NULL;}
	$row = mysql_fetch_row($result);
	return $row[0];
}

102
103
104
105
106
107
# grab package dependencies
#
function package_dependencies($pkgid=0) {
	$deps = array();
	if ($pkgid) {
		$dbh = db_connect();
108
		$q = "SELECT DepPkgID, Name, DummyPkg, DepCondition FROM PackageDepends, Packages ";
109
		$q.= "WHERE PackageDepends.DepPkgID = Packages.ID ";
110
		$q.= "AND PackageDepends.PackageID = ".mysql_real_escape_string($pkgid);
111
112
113
114
115
116
117
118
119
120
		$q.= " ORDER BY Name";
		$result = db_query($q, $dbh);
		if (!$result) {return array();}
		while ($row = mysql_fetch_row($result)) {
			$deps[] = $row;
		}
	}
	return $deps;
}

121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# reverse deps by tardo
#
function package_required($pkgid=0) {
	$deps = array();
	if ($pkgid) {
		$dbh = db_connect();
		$q = "SELECT PackageID, Name, DummyPkg from PackageDepends, Packages ";
		$q.= "WHERE PackageDepends.PackageID = Packages.ID ";
		$q.= "AND PackageDepends.DepPkgID = ";
		$q.= mysql_real_escape_string($pkgid);
		$result = db_query($q, $dbh);
		if (!$result) {return array();}
		while ($row = mysql_fetch_row($result)) {
			$deps[] = $row;
		}
	}
	return $deps;
}

140
141
142
143
144
145
# create a dummy package and return it's Packages.ID  if it already exists,
# return the existing ID
#
function create_dummy($pname="", $sid="") {
	if ($pname && $sid) {
		$uid = uid_from_sid($sid);
jchu's avatar
jchu committed
146
		if (!$uid) {return NULL;}
147
148
		$dbh = db_connect();
		$q = "SELECT ID FROM Packages WHERE Name = '";
149
		$q.= mysql_real_escape_string($pname)."'";
150
		$result = db_query($q, $dbh);
jchu's avatar
jchu committed
151
		if (!mysql_num_rows($result)) {
152
153
			# Insert the dummy
			#
154
			$q = "INSERT INTO Packages (Name, Description, URL, SubmittedTS, ";
155
			$q.= "SubmitterUID, DummyPkg) VALUES ('";
156
			$q.= mysql_real_escape_string($pname)."', 'A dummy package', '/#', ";
157
			$q.= "UNIX_TIMESTAMP(), ".$uid.", 1)";
158
159
160
161
			$result = db_query($q, $dbh);
			if (!$result) {
				return NULL;
			}
jchu's avatar
jchu committed
162
			return mysql_insert_id($dbh);
163
164
		} else {
			$data = mysql_fetch_row($result);
jchu's avatar
jchu committed
165
			return $data[0];
166
167
168
169
170
171
		}
	}
	return NULL;

}

eric's avatar
eric committed
172
173
174
175
176
177
# grab package comments
#
function package_comments($pkgid=0) {
	$comments = array();
	if ($pkgid) {
		$dbh = db_connect();
178
		$q = "SELECT PackageComments.ID, UserName, UsersID, Comments, CommentTS ";
eric's avatar
eric committed
179
180
		$q.= "FROM PackageComments, Users ";
		$q.= "WHERE PackageComments.UsersID = Users.ID";
181
		$q.= " AND PackageID = ".mysql_real_escape_string($pkgid);
eric's avatar
eric committed
182
		$q.= " AND DelUsersID = 0"; # only display non-deleted comments
183
		$q.= " ORDER BY CommentTS DESC";
eric's avatar
eric committed
184
185
186
187
188
189
190
191
192
		$result = db_query($q, $dbh);
		if (!$result) {return array();}
		while ($row = mysql_fetch_assoc($result)) {
			$comments[] = $row;
		}
	}
	return $comments;
}

193
194
195
196
197
198
199
# grab package sources
#
function package_sources($pkgid=0) {
	$sources = array();
	if ($pkgid) {
		$dbh = db_connect();
		$q = "SELECT Source FROM PackageSources ";
200
		$q.= "WHERE PackageID = ".mysql_real_escape_string($pkgid);
201
202
203
204
205
206
207
208
209
210
		$q.= " ORDER BY Source";
		$result = db_query($q, $dbh);
		if (!$result) {return array();}
		while ($row = mysql_fetch_row($result)) {
			$sources[] = $row[0];
		}
	}
	return $sources;
}

211
212
213
214
215
216
217
218
219
220
221

# grab array of Package.IDs that I've voted for: $pkgs[1234] = 1, ...
#
function pkgvotes_from_sid($sid="") {
	$pkgs = array();
	if (!$sid) {return $pkgs;}
	$dbh = db_connect();
	$q = "SELECT PackageID ";
	$q.= "FROM PackageVotes, Users, Sessions ";
	$q.= "WHERE Users.ID = Sessions.UsersID ";
	$q.= "AND Users.ID = PackageVotes.UsersID ";
222
	$q.= "AND Sessions.SessionID = '".mysql_real_escape_string($sid)."'";
223
224
225
226
227
228
229
230
231
	$result = db_query($q, $dbh);
	if ($result) {
		while ($row = mysql_fetch_row($result)) {
			$pkgs[$row[0]] = 1;
		}
	}
	return $pkgs;
}

232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
# array of package ids that you're being notified for
# *yoink*
#
function pkgnotify_from_sid($sid="") {
	$pkgs = array();
	if (!$sid) {return $pkgs;}
	$dbh = db_connect();
	$q = "SELECT PkgID ";
	$q.= "FROM CommentNotify, Users, Sessions ";
	$q.= "WHERE Users.ID = Sessions.UsersID ";
	$q.= "AND Users.ID = CommentNotify.UserID ";
	$q.= "AND Sessions.SessionID = '".mysql_real_escape_string($sid)."'";
	$result = db_query($q, $dbh);
	if ($result) {
		while ($row = mysql_fetch_row($result)) {
			$pkgs[$row[0]] = 1;
		}
	}
	return $pkgs;
}
252

253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
# get name of package based on pkgid
#
function pkgname_from_id($id="") {
	if (!empty($id)) {
		$dbh = db_connect();
		$id = intval($id);
		$q = "SELECT Name FROM Packages WHERE ID = " . mysql_real_escape_string($id);
		$result = db_query($q, $dbh);
		if (mysql_num_rows($result) > 0) {
			$id = mysql_result($result, 0);
		} else {
			$id = "";
		}
	}
	return $id;
}

eric's avatar
eric committed
270
271
# display package details
#
272
function package_details($id=0, $SID="") {
273
	global $_REQUEST;
eric's avatar
eric committed
274
	global $pkgsearch_vars;
jchu's avatar
jchu committed
275
	$q = "SELECT Packages.*,Location,Category ";
276
277
278
	$q.= "FROM Packages,PackageLocations,PackageCategories ";
 	$q.= "WHERE Packages.LocationID = PackageLocations.ID ";
	$q.= "AND Packages.CategoryID = PackageCategories.ID ";
279
	$q.= "AND Packages.ID = ".intval($_REQUEST["ID"]);
eric's avatar
eric committed
280
281
282
283
284
285
286
287
288
289
290
291
292
	$dbh = db_connect();
	$results = db_query($q, $dbh);
	if (!$results) {
		print __("Error retrieving package details.")."<br />\n";

	} else {
		$row = mysql_fetch_assoc($results);
		if (empty($row)) {
			print __("Package details could not be found.")."<br />\n";

		} else {

			# print out package details
293
294
295
296
			#
      echo "<div class=\"pgbox\">\n";
      echo "  <div class=\"pgboxtitle\"><span class=\"f3\">".__("Package Details")."</span></div>\n";
      echo "  <div class=\"pgboxbody\">\n";
297
298
299
300
301
302
303
304
305
			echo "    <table>\n";
			echo "      <tr><td class='boxSoft' colspan='2'><span class='f2'>";
			echo $row["Name"] . " " . $row["Version"]."</span></td></tr>\n";
			echo "      <tr><td class='boxSoft' colspan='2'><span class='f3'>";
			echo "<a href='".$row["URL"]."'>".$row["URL"]."</a></span></td></tr>\n";
			echo "      <tr><td class='boxSoft' colspan='2'><span class='f3'>".$row["Description"];
			echo "</a></span></td></tr>\n";
			echo "      <tr><td class='boxSoft' colspan='2'><img src='/images/pad.gif' height='30'></td></tr>\n";
			echo "      <tr><td class='boxSoft' colspan='2'><span class='f3'>";
306
307
308
309
			if ($row["Location"] == "unsupported" and ( 
					uid_from_sid($SID) == $row["MaintainerUID"] or
					(account_from_sid($SID) == "Developer" or
					 account_from_sid($SID) == "Trusted User"))) {
pjmattal's avatar
pjmattal committed
310
311
312
313
314
315
316
			  $edit_cat = "<a href='/pkgedit.php?change_Category=1&ID=";
			  $edit_cat .= intval($_REQUEST["ID"])."'>".$row["Category"]."</a>";
			  $edit_cat .= " &nbsp;<span class='fix'>(";
			  $edit_cat .= __("change category").")</span>";
			} else {
				$edit_cat = $row["Category"];
			}
317
318
			echo $row["Location"]." :: ".$edit_cat."</span></td></tr>\n";
			echo "        <tr><td class='boxSoft' colspan='2'><span class='f3'>".__("Maintainer").": ";
319
			if ($row["MaintainerUID"]) {
320
				$maintainer = username_from_id($row["MaintainerUID"]);
321
				if ($SID) {
322
323
324
					echo "<a href='/account.php?Action=AccountInfo&ID=";
					echo $row["MaintainerUID"] . "'>";
					echo $maintainer . "</a></span></td>";
325
				} else {
326
					echo $maintainer . "</span></td>";
327
				}
328
329
			} else {
				$maintainer = "None";
330
				echo $maintainer . "</span></td>";
331
			}
332
333
334
			echo "      </tr>\n";
			echo "      <tr><td class='boxSoft' colspan='2'><span class='f3'>".__("Votes").": ";
			echo $row["NumVotes"] . "</span></td></tr>\n";
335
336
            
            # In case of wanting to put a custom message
337
            $msg = __("unknown");
338
339
            $license = $row["License"] == "" ? $msg : $row["License"];
            
340
341
342
            echo "      <tr><td class='boxSoft' colspan='2'><br><span class='f3'>".__("License").": ".$license;
            echo "</a></span></td></tr>\n";            
			echo "      <tr><td class='boxSoft' colspan='2'><img src='/images/pad.gif' height='15'></td></tr>\n";
343
344

			# Print the timestamps for last updates
simo's avatar
simo committed
345
346
			$updated_time = ($row["ModifiedTS"] == 0) ? "(unknown)" : gmdate("r", intval($row["ModifiedTS"]));
			$submitted_time = ($row["SubmittedTS"] == 0) ? "(unknown)" : gmdate("r", intval($row["SubmittedTS"]));
347
348
349
350
351
			echo "      <tr><td class='boxSoft' colspan='2'><span class='f3'>";
			echo __("Last Updated").": ".$updated_time."<br>";
			echo __("First Submitted").": ".$submitted_time."</span></td></tr>\n";
			echo "      <tr><td class='boxSoft' colspan='2'><img src='/images/pad.gif' height='15'></td></tr>\n";
			echo "      <tr><td class='boxSoft' colspan='2'><span class='f3'>";
pjmattal's avatar
pjmattal committed
352
			if ($row["LocationID"] == 2) {
353
				$urlpath = URL_DIR.$row["Name"]."/".$row["Name"];
354
				print "<a href='$urlpath.tar.gz'>".__("Tarball")."</a> :: <a href='$urlpath'>".__("Files")."</a> :: <a href='$urlpath/PKGBUILD'>PKGBUILD</a></span></td>";
pjmattal's avatar
pjmattal committed
355
			} elseif ($row["LocationID"] == 3) {
356
			  echo "<a href='http://cvs.archlinux.org/cgi-bin/viewcvs.cgi/" . $row["Category"] . "/" . $row["Name"] . "/?cvsroot=AUR&only_with_tag=CURRENT'>CVS</td>";
pjmattal's avatar
pjmattal committed
357
			}
358
			echo "</tr>\n";
359
			if ($row["OutOfDate"] == 1) {
360
361
				echo "\n<tr><td colspan='2'>";
				echo "<span class='f6'>".__("This package has been flagged out of date.")."</span></td></tr>";
362
			}
363
364
365
366
367
368
369
			echo "      <tr><td class='boxSoft' colspan='2'><img src='/images/pad.gif' height='30'></td></tr>\n";
            echo "      <tr>\n";
            echo "        <td valign='top' style='padding-right: 10'>\n";
			echo "          <table class='boxSoft' style='width: 200px'>\n";
			echo "            <tr><td class='boxSoftTitle'><span class='f3'>";
			echo __("Dependencies")."</span></td></tr>\n";
			echo "            <tr><td class='boxSoft'>";
370
			$deps = package_dependencies($row["ID"]); # $deps[0] = array('id','name', 'dummy');
371
372
373
374
375
376
377
378
379
380
381
			if (count($deps) == 0) {
				print "None\n";
			} else {
				while (list($k, $darr) = each($deps)) {
					$url = "<a href='/packages.php?do_Details=1&ID=".$darr[0];
					while(list($k, $var) = each($pkgsearch_vars)) {
						if (($var == "do_MyPackages" || $var == "do_Orphans") && $_REQUEST[$var]) {
							$url .= "&".$var."=1";
						} else {
							$url .= "&".$var."=".rawurlencode(stripslashes($_REQUEST[$var]));
						}
382
					}
383
384
385
386
387
388
					reset($pkgsearch_vars);
																								 
									// $darr[3] is the DepCondition                                               
																								 
					if ($darr[2] == 0) echo $url."'>".$darr[1].$darr[3]."</a><br />\n";
					else echo "<a href='http://archlinux.org/packages/search/".$darr[1]."'>".$darr[1].$darr[3]."</a><br />\n";
eric's avatar
eric committed
389
				}
390
			}
391
392
			echo "</td></tr>\n";
			echo "</table></td>";
393
394

			# reverse-deps by tardo - could use some beautification
395
396
397
398
399
			echo "  <td valign='top'>";
			echo "<table class='boxSoft' style='width: 200px'>";
			echo "<tr><td class='boxSoftTitle'><span class='f3'>";
			echo __("Required by")."</span></td></tr>\n";
			echo "<tr><td class='boxSoft'>";
400
			$deps = package_required($row["ID"]);
401
402
403
404
405
406
407
408
409
410
411
			if (count($deps) == 0) {
				print "None\n";
			} else {
				while (list($k, $darr) = each($deps)) {
					$url = "<a href='/packages.php?do_Details=1&ID=".$darr[0];
					while(list($k, $var) = each($pkgsearch_vars)) {
						if (($var == "do_MyPackages" || $var == "do_Orphans") && $_REQUEST[$var]) {
							$url .= "&".$var."=1";
						} else {
							$url .= "&".$var."=".rawurlencode(stripslashes($_REQUEST[$var]));
						}
412
					}
413
414
415
416
417
418
					reset($pkgsearch_vars);
																								 
									// $darr[3] is the DepCondition                                               
																								 
					if ($darr[2] == 0) print $url."'>".$darr[1].$darr[3]."</a><br />\n";
					else print "<a href='http://archlinux.org/packages/search/".$darr[1]."'>".$darr[1].$darr[3]."</a><br />\n";
419
				}
420
			}
421
422
423
			echo "</td></tr>\n";
			echo "          </table>\n";
			echo "        </td>\n";
424
425
426
427
428
			echo "        <td valign='top'>\n";
			echo "          <table class='boxSoft' style='width: 200px'>\n";
			echo "            <tr><td class='boxSoftTitle'><span class='f3'>";
			echo __("Sources")."</span></td></tr>\n";
			echo "            <tr><td class='boxSoft'>";
429
			$sources = package_sources($row["ID"]); # $sources[0] = 'src';
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
			if (count($sources) == 0) {
				print "None\n";
			} else {
				while (list($k, $src) = each($sources)) {
					$parsed_url = parse_url($src);
					if ($parsed_url['scheme'])
					{
						//It is an external source
						echo "<a href='".$src."'>".$src."</a><br />\n";
					}
					else 
					{
						//It is presumably an internal source
						if ($row["LocationID"] == 2) {
							echo "<a href='".dirname($row['URLPath'])."/".$row['Name'];
							echo "/".$src."'>".$src."</a><br />\n";
						} elseif ($row["LocationID"] == 3) {
							echo "<a href='http://cvs.archlinux.org/cgi-bin/viewcvs.cgi/*checkout*/".$row["Category"]."/".$row["Name"]."/".$src."/?rev=HEAD&cvsroot=AUR&only_with_tag=CURRENT'>";
							echo $src."</a><br />\n";
						}
simo's avatar
simo committed
450
					}
451
				}
452
			}
453
			echo "</td></tr>\n";
454
455
			echo "          </table>\n";
			echo "        </td>\n";
456
457
			echo "      </tr>\n";
			echo "    </table>\n";
458
459
460
			echo "  </div>\n";
			echo "</div>\n\n";
			echo "<br />\n\n";
461

eric's avatar
eric committed
462

simo's avatar
simo committed
463
464
465
			# Actions Bar
			#
			if ($SID) {
eliott's avatar
eliott committed
466
467
468
                echo "<div class=\"pgbox\">\n";
                echo "  <div class=\"pgboxtitle\"><span class=\"f3\">".__("Actions")."</span></div>\n";
                echo "  <div class=\"pgboxbody\">\n";
469
                echo "    <form action='/packages.php' method='post'>\n";
470
471
				echo "      <input type='hidden' name='IDs[".$row["ID"]."]' value='1'>\n";
				echo "      <input type='hidden' name='ID' value='".$row["ID"]."'>\n";
simo's avatar
simo committed
472
473
474
475
476
				# Voting Button
				#
				$q = "SELECT * FROM PackageVotes WHERE UsersID = ".uid_from_sid($SID);
				$q.= " AND PackageID = ".$row["ID"];
				if (!mysql_num_rows(db_query($q, $dbh))) {
477
478
					echo "      <input type='submit' class='button' name='do_Vote'";
					echo " value='".__("Vote")."'>";
simo's avatar
simo committed
479
				} else {
480
481
					echo "<input type='submit' class='button' name='do_UnVote'";
					echo " value='".__("Un-Vote")."'>";
simo's avatar
simo committed
482
483
484
485
486
487
				}
				# Comment Nofify Button
				#
				$q = "SELECT * FROM CommentNotify WHERE UserID = ".uid_from_sid($SID);
				$q.= " AND PkgID = ".$row["ID"];
				if (!mysql_num_rows(db_query($q, $dbh))) {
488
489
					echo "<input type='submit' class='button' name='do_Notify'";
					echo " value='".__("Notify")."' title='".__("New Comment Notification")."'>";
simo's avatar
simo committed
490
				} else {
491
					echo "<input type='submit' class='button' name='do_Notify'";
492
					echo " value='".__("UnNotify")."' title='".__("No New Comment Notification")."'>";
simo's avatar
simo committed
493
				}
494
495
496
497
498
499
500

                if ($row["OutOfDate"] == 0) {
                    echo "<input type='submit' class='button' name='do_Flag'";
                    echo " value='".__("Flag Out-of-date")."'>\n";
                } else {
                    echo "<input type='submit' class='button' name='do_UnFlag'";
                    echo " value='".__("Unflag Out-of-date")."'>\n";
501
				}
502
					
503
504
505
506
                if ($row["AURMaintainerUID"] == 0 && $row["MaintainerUID"] == 0) {
                    echo "<input type='submit' class='button' name='do_Adopt'";
                    echo " value='".__("Adopt Packages")."'>\n";
                }
507
					
508
509
510
				if ($row["MaintainerUID"] == uid_from_sid($SID) ||
            account_from_sid($SID) == "Trusted User" ||
            account_from_sid($SID) == "Developer") {
511
512
513
					echo "<input type='submit' class='button' name='do_Disown'";
					echo " value='".__("Disown Packages")."'>\n";
				}	
514
					
515
516
517
518
519
520
				if ($row["MaintainerUID"] == uid_from_sid($SID) ||
				    account_from_sid($SID) == "Trusted User" ||
				    account_from_sid($SID) == "Developer") {
					echo "<input type='submit' class='button' name='do_Delete'";
					echo " value='".__("Delete Packages")."'>\n";
				}
521
						
522
523
524
525
                echo "    </form>\n";
                echo "  </div>\n";
                echo "</div>\n";
                echo "\n<br />\n\n";
simo's avatar
simo committed
526
			}
527
			
simo's avatar
simo committed
528
			# Comments
eric's avatar
eric committed
529
			#
530
531
532
			echo "<div class=\"pgbox\">\n";
			echo "  <div class=\"pgboxtitle\"><span class=\"f3\">".__("Comments")."</span></div>\n";
			echo "  <div class=\"pgboxbody-comment\">\n";
533
			echo "    <table width='100%'>\n";
534
535
536
537
538
539
540
541
542
543
			if (isset($_COOKIE['AURSID'])) {
				echo "<tr><td>";
				echo "          <form action='/pkgedit.php' method='post'>\n";
				echo "            <input type='hidden' name='ID' value='".$row["ID"]."'>\n";
				echo "            <input type='submit' class='button' name='add_Comment' value=\"";
				echo __("Add Comment")."\">\n";
				echo "          </form>\n";
				echo "</tr></td>";
				//echo "<br />\n";
			}
eric's avatar
eric committed
544
545
546
			$comments = package_comments($row["ID"]);
			if (!empty($comments)) {
				while (list($indx, $carr) = each($comments)) {
547
548
549
550

					echo "      <tr>\n";
					echo "        <td valign='top' style='padding-right: 10' colspan='2'>\n";
					echo "          <table class='boxSoft' width='100%'>\n";
551
552
					echo "            <tr>\n";
					echo "              <td class='boxSoftTitle'><span class='f3'>";
553
554
555
556
557
					if (canDeleteComment($carr["ID"], account_from_sid($SID), $SID)) {
						$durl = "<a href='/pkgedit.php?del_Comment=1";
						$durl.= "&comment_id=".$carr["ID"]."&ID=".$row["ID"];
						$durl.= "'><img src='/images/x.png' border='0'";
						$durl.= " alt=\"".__("Delete comment")."\"></a>";
558

559
					  echo $durl . "&nbsp;&nbsp;";
560
					}
561
					if ($SID) {
562
						echo __("Comment by: %h%s%h on %h%s%h",
563
							array("<a href='/account.php?Action=AccountInfo&ID=".$carr["UsersID"]."'><b>",$carr["UserName"],"</b></a>",
simo's avatar
simo committed
564
							      "<i>",gmdate("Ymd [H:i:s]",$carr["CommentTS"]),"</i>"));
565
					} else {
566
						echo __("Comment by: %h%s%h on %h%s%h",
eric's avatar
eric committed
567
							array("<b>",$carr["UserName"],"</b>",
simo's avatar
simo committed
568
							      "<i>",gmdate("Ymd [H:i:s]",$carr["CommentTS"]),"</i>"));
569
					}
570
571
572
573
					echo "</span></td>\n";
					echo "            </tr>\n";
					echo "            <tr>\n";
					echo "              <td class='boxSoft'>";
574
					echo "<code>\n";
575
					echo nl2br(htmlspecialchars($carr["Comments"]));
576
577
					echo "</code></td>\n";
					echo "            </tr>\n";
578
579
580
					echo "          </table>\n";
					echo "        </td>\n";
					echo "      </tr>\n";
eric's avatar
eric committed
581
				}
582
583
			} else {
				print "<tr><td>None</td></tr>\n";
eric's avatar
eric committed
584
			}
585
			echo "    </table>\n";
586
587
			echo "  </div>\n";
			echo "</div>\n";
eric's avatar
eric committed
588
589
590
591
592
593
		}
	}
	return;
}


eric's avatar
eric committed
594
595
# display the search form in a boxSoft style
#
596
597
function pkg_search_page($SID="") {
	global $_REQUEST;
eric's avatar
eric committed
598
	global $pkgsearch_vars;
599
	# SID: session id cookie
eric's avatar
eric committed
600

eric's avatar
eric committed
601
602
	$locs = pkgLocations();
	$cats = pkgCategories();
603
604
	$devs = getDevelopers();
	$tus = getTrustedUsers();
pjmattal's avatar
pjmattal committed
605
	$users = getUsers();
606
	$dbh = db_connect();
eric's avatar
eric committed
607

608

609
610
	# determine paging variables
	#
611
612
613
614
615
	if (intval($_GET['O'])) {
		$O = $_GET['O'];
	} else {
		$O = 0;
	}
eric's avatar
eric committed
616
	$_REQUEST["PP"] ? $PP = intval($_REQUEST["PP"]) : $PP = 25;
eric's avatar
eric committed
617
618
	if ($PP < 25) {$PP = 25;}
	if ($PP > 100) {$PP = 100;}
619
	
620
621
	if ($_REQUEST["do_Search"] && $_REQUEST["do_Search"] != 1) {
		# reset the offset to zero if they hit Go
eric's avatar
eric committed
622
		#
eric's avatar
eric committed
623
		$_REQUEST["do_MyPackages"] = 0;
624
625
626
627
628
629
630
631
632
633
		$_REQUEST["do_Orphans"] = 0;
		$O = 0;
	}
	if ($_REQUEST["do_MyPackages"] && $_REQUEST["do_MyPackages"] != 1) {
		# reset the offset to zero if they hit My Packages
		#
		$_REQUEST["do_Search"] = 0;
		$_REQUEST["do_Orphans"] = 0;
		$O = 0;
	}
634
	if (!empty($_REQUEST['do_Orphans']) && $_REQUEST['do_Orphans'] != 1) {
635
636
637
638
		# reset the offset to zero if they hit Orphans
		#
		$_REQUEST["do_Search"] = 0;
		$_REQUEST["do_MyPackages"] = 0;
eric's avatar
eric committed
639
640
		$O = 0;
	}
641
	$_REQUEST["O"] = $O; # so that pkg_search_results() works
eric's avatar
eric committed
642

643

644
645
646
647
648
	# grab info for user if they're logged in
	#
	if ($SID) {
		$myuid = uid_from_sid($SID);
		$acct = account_from_sid($SID);
649
		$my_votes = pkgvotes_from_sid($SID);
650
		$my_notify = pkgnotify_from_sid($SID);
651
652
653
654
	}

	# The search form
	#
655
656
	print "<form action='/packages.php' method='post'>\n";
	#print "<form action='/packages.php' method='get'>\n";
657
	print "<input type='hidden' name='O' value='".$O."'>\n";
658

eric's avatar
eric committed
659
660
661
662
	print "<center>\n";
	print "<table cellspacing='3' class='boxSoft'>\n";
	print "<tr>\n";
	print "  <td class='boxSoftTitle' align='right'>\n";
663
	print "    <span class='f3'>".__("Search Criteria")."</span>\n";
eric's avatar
eric committed
664
665
666
667
668
669
670
671
672
	print "  </td>\n";
	print "</tr>\n";
	print "<tr>\n";
	print "  <td class='boxSoft'>\n";
	print "<table style='width: 100%' align='center'>\n";

	print "<tr>\n";
	print "<td align='right'>\n";
	print "  <span class='f5'><span class='blue'>".__("Location");
673
	print "</span></span><br />\n";
eric's avatar
eric committed
674
675
676
	print "  <select name='L'>\n";
	print "  <option value=0> ".__("Any")."\n";
	while (list($id, $loc) = each($locs)) {
eric's avatar
eric committed
677
		if (intval($_REQUEST["L"]) == $id) {
eric's avatar
eric committed
678
679
680
681
682
683
684
685
686
687
			print "  <option value=".$id." selected> ".$loc."\n";
		} else {
			print "  <option value=".$id."> ".$loc."\n";
		}
	}
	print "  </select>\n";
	print "</td>\n";

	print "<td align='right'>\n";
	print "  <span class='f5'><span class='blue'>".__("Category");
688
	print "</span></span><br />\n";
eric's avatar
eric committed
689
690
691
	print "  <select name='C'>\n";
	print "  <option value=0> ".__("Any")."\n";
	while (list($id, $cat) = each($cats)) {
eric's avatar
eric committed
692
		if (intval($_REQUEST["C"]) == $id) {
eric's avatar
eric committed
693
694
695
696
697
698
699
700
701
702
			print "  <option value=".$id." selected> ".$cat."\n";
		} else {
			print "  <option value=".$id."> ".$cat."\n";
		}
	}
	print "  </select>\n";
	print "</td>\n";

	print "<td align='right'>\n";
	print "  <span class='f5'><span class='blue'>".__("Keywords");
703
	print "</span></span><br />\n";
704
	print "  <input type='text' name='K' size='20'";
dsa's avatar
dsa committed
705
706
707
708
	
	# Added to trim() to avoid the problem described in #6191
	$K = trim(str_replace("\"", "", $_REQUEST["K"])); # TODO better testing for SQL trickery...
	
709
	print " value=\"".stripslashes($K)."\" maxlength='35'>\n";
eric's avatar
eric committed
710
	print "</td>\n";
simo's avatar
simo committed
711
712
	
	print "<td align='right'>\n";
Callan Barrett's avatar
Callan Barrett committed
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
	print "  <span class='f5'><span class='blue'>".__("Search by");
	print "</span></span><br />\n";

	print "  <select name='SeB'>\n";
	# by name/description
	print "  <option value=nd";
	$_REQUEST["SeB"] == "nd" ? print " selected> " : print "> ";
	print __("Name")."</option>\n";
	# by maintainer
	print "  <option value=m";
	$_REQUEST["SeB"] == "m" ? print " selected> " : print "> ";
	print __("Maintainer")."</option>\n";
	print "  <option value=s";
	$_REQUEST["SeB"] == "s" ? print " selected> " : print "> ";
	print __("Submitter")."</option>\n";

	print "  </select>\n";
	print "</td>\n";
731
    
eric's avatar
eric committed
732
733
	print "<td align='right'>\n";
	print "  <span class='f5'><span class='blue'>".__("Per page");
734
	print "</span></span><br />\n";
eric's avatar
eric committed
735
736
	print "  <select name='PP'>\n";
	print "  <option value=25";
737
	$PP == 25 ? print " selected> 25\n" : print "> 25\n";
eric's avatar
eric committed
738
	print "  <option value=50";
739
	$PP == 50 ? print " selected> 50\n" : print "> 50\n";
eric's avatar
eric committed
740
	print "  <option value=75";
741
	$PP == 75 ? print " selected> 75\n" : print "> 75\n";
eric's avatar
eric committed
742
	print "  <option value=100";
743
	$PP == 100 ? print " selected> 100\n" : print "> 100\n";
eric's avatar
eric committed
744
745
	print "  </select>\n";
	print "</td>\n";
746
747
748
	
	# Added to break put the buttons in a new line
	print"</tr></table><center><table><tr>";
eric's avatar
eric committed
749
750

	print "<td align='right' valign='bottom'>&nbsp;\n";
751
	print "  <input type='submit' style='width:80px' class='button' name='do_Search'";
752
	print " value='".__("Go")."'>\n";
eric's avatar
eric committed
753
754
	print "</td>\n";

755
	print "<td align='right' valign='bottom'>&nbsp;\n";
756
	print "  <input type='submit' style='width:80px'  class='button' name='do_Orphans'";
757
758
759
	print " value='".__("Orphans")."'>\n";
	print "</td>\n";

eric's avatar
eric committed
760
761
	print "</tr>\n";
	print "</table>\n";
762
763
764
765
766
767
768
769
770

	print "  </td>\n";
	print "</tr>\n";
	print "</table>\n";
	print "</center>\n";
	print "<br />\n";

	# query to pull out package info
	#
771
772
773
#	$q = "SELECT Packages.*, IF(ISNULL(PackageID), 0, COUNT(*)) AS Votes ";
#	$q.= "FROM Packages LEFT JOIN PackageVotes ";
#	$q.= "ON Packages.ID = PackageVotes.PackageID ";
774
	$q = "SELECT * FROM Users RIGHT JOIN Packages ";
775
776
	$q.= "ON (Users.ID = Packages.MaintainerUID) ";
	$q.= "WHERE DummyPkg != 1 ";
777
778
	$has_where = 1;

eric's avatar
eric committed
779
	if (intval($_REQUEST["L"])) {
pjmattal's avatar
pjmattal committed
780
781
782
783
784
		if (!$has_where) {
		  $q.= "WHERE LocationID = ".intval($_REQUEST["L"])." ";
		} else {
			$q .= "AND LocationID = ".intval($_REQUEST["L"])." ";
		}
785
786
		$has_where = 1;
	}
eric's avatar
eric committed
787
	if (intval($_REQUEST["C"])) {
788
		if (!$has_where) {
eric's avatar
eric committed
789
			$q.= "WHERE CategoryID = ".intval($_REQUEST["C"])." ";
790
791
			$has_where = 1;
		} else {
eric's avatar
eric committed
792
			$q.= "AND CategoryID = ".intval($_REQUEST["C"])." ";
793
794
795
		}
	}
	if ($K) {
simo's avatar
simo committed
796
797
798
		#search by maintainer
		if ($_REQUEST["SeB"] == "m"){
			if (!$has_where) {
799
				$q.= "WHERE Username = '".mysql_real_escape_string($K)."' ";
simo's avatar
simo committed
800
				$has_where = 1;
simo's avatar
simo committed
801
			} else {
802
				$q.= "AND Username = '".mysql_real_escape_string($K)."' ";
simo's avatar
simo committed
803
			}
804
        } elseif ($_REQUEST["SeB"] == "s") {
simo's avatar
simo committed
805
806
807
808
809
			if (!$has_where) {
				$q.= "WHERE SubmitterUID = ".uid_from_username($K)." ";
				$has_where = 1;
			} else {
				$q.= "AND SubmitterUID = ".uid_from_username($K)." ";
simo's avatar
simo committed
810
811
			}
		# the default behaivior, query the name/description
simo's avatar
simo committed
812
		} else {
simo's avatar
simo committed
813
			if (!$has_where) {
814
815
				$q.= "WHERE (Name LIKE '%".mysql_real_escape_string($K)."%' OR ";
				$q.= "Description LIKE '%".mysql_real_escape_string($K)."%') ";
simo's avatar
simo committed
816
817
				$has_where = 1;
			} else {
818
819
				$q.= "AND (Name LIKE '%".mysql_real_escape_string($K)."%' OR ";
				$q.= "Description LIKE '%".mysql_real_escape_string($K)."%') ";
simo's avatar
simo committed
820
			}
821
822
		}
	}
823
824
    
    if ($_REQUEST["do_MyPackages"] && $SID) {
eric's avatar
eric committed
825
826
827
		# list packages that the user is a AUR Maintainer of, or if it the
		# vistior is a registered user, if they are the Maintainer.
		#
828
829
		if ($myuid) {
			if (!$has_where) {
eric's avatar
eric committed
830
				$q.= "WHERE (AURMaintainerUID = ".$myuid." OR ";
831
832
				$has_where = 1;
			} else {
eric's avatar
eric committed
833
				$q.= "AND (AURMaintainerUID = ".$myuid." OR ";
834
			}
835
836
			//$q.= "MaintainerUID = ".$myuid." OR SubmitterUID = ".$myuid.") ";
			$q.= "MaintainerUID = ".$myuid.") ";
837
838
		}
	}
839
840
841
842
843
844
845
846
847
848
849
850
	if ($_REQUEST["do_Orphans"]) {
		# List packages that have neither a Maintainer nor AURMaintainer
		#
			if (!$has_where) {
				$q.= "WHERE (AURMaintainerUID = 0 AND ";
				$q.= "MaintainerUID = 0) ";
				$has_where = 1;
			} else {
				$q.= "AND (AURMaintainerUID = 0 AND ";
				$q.= "MaintainerUID = 0) ";
			}
	}
851
852
853
854
	
    $order = $_REQUEST["SO"] == 'd' ? 'DESC' : 'ASC';
	
    switch ($_REQUEST["SB"]) {
855
		case 'c':
856
			$q.= "ORDER BY CategoryID ".$order.", Name ASC, LocationID ASC ";
Callan Barrett's avatar
Callan Barrett committed
857
			$SB = 'c';
858
859
			break;
		case 'l':
860
			$q.= "ORDER BY LocationID ".$order.", Name ASC, CategoryID DESC ";
Callan Barrett's avatar
Callan Barrett committed
861
			$SB = 'l';
862
			break;
863
		case 'v':
864
			$q.= "ORDER BY NumVotes ".$order.", Name ASC, CategoryID DESC ";
Callan Barrett's avatar
Callan Barrett committed
865
			$SB = 'v';
866
			break;
867
		case 'm':
868
			$q.= "ORDER BY Username ".$order.", Name ASC, LocationID ASC ";
Callan Barrett's avatar
Callan Barrett committed
869
			$SB = 'm';
870
871
			break;
		case 'a':
872
			$q.= "ORDER BY GREATEST(SubmittedTS,ModifiedTS) ".$order.", Name ASC, LocationID ASC ";
Callan Barrett's avatar
Callan Barrett committed
873
			$SB = 'a';
874
			break;
875
		default:
876
			$q.= "ORDER BY Name ".$order.", LocationID ASC, CategoryID DESC ";
877
878
			break;
	}
Callan Barrett's avatar
Callan Barrett committed
879
880
881

	$allresults = mysql_num_rows(db_query($q, $dbh));

882
	$qnext = $q."LIMIT ".($O+$PP).", ".$PP; //next page's worth
883
	$q.= "LIMIT ".$O.", ".$PP;
884

885
	$result = db_query($q, $dbh);
886
887
888
889
890
891
892
893
894
895
896
897
	
	print "<center>\n";
	print "<table cellspacing='3' class='boxSoft'>\n";
	print "<tr>\n";
	print "  <td class='boxSoftTitle' align='right'>\n";
	print "    <span class='f3'>".__("Package Listing")."</span>\n";
	print "  </td>\n";
	print "</tr>\n";
	print "<tr>\n";
	print "  <td class='boxSoft'>\n";
	print "<table width='100%' cellspacing='0' cellpadding='2'>\n";

898
	if (!$result) {
899
		print "<div class='pgboxbody'>";
900
		print __("Error retrieving package list.");
901
		print "</div>";
eric's avatar
eric committed
902
	} elseif (!mysql_num_rows($result)) {
903
		print "<div class='pgboxbody'>";
eric's avatar
eric committed
904
		print __("No packages matched your search criteria.");
905
		print "</div>";
eric's avatar
eric committed
906
	} else {
907
908
		# print out package search results
		#
simo's avatar
simo committed
909
910
911
912

		# SO_next used to change sort order on header click
		if ($_REQUEST["SO"] == "d"){
			$SO_next="a";
Callan Barrett's avatar
Callan Barrett committed
913
			$SO = 'd';
simo's avatar
simo committed
914
915
		} else {
			$SO_next="d";
Callan Barrett's avatar
Callan Barrett committed
916
			$SO = 'a';
simo's avatar
simo committed
917
		}
918
		print "<tr>\n";
919
920
921
922
		if ($SID) {
			print "  <th style='border-bottom: #666 1px solid; vertical-align:";
			print " bottom'>&nbsp;</th>\n";
		}
923
		print "  <th style='border-bottom: #666 1px solid; vertical-align:";
simo's avatar
simo committed
924
		print " bottom'><span class='f2'>";
swiergot's avatar
swiergot committed
925
		print "<a href='?O=$O&L=".intval($_REQUEST["L"])."&C=".intval($_REQUEST["C"])."&K=$K&SB=l&SO=$SO_next&PP=$PP&SeB=".$_REQUEST["SeB"]."&do_MyPackages=".$_REQUEST["do_MyPackages"]."&do_Orphans=".$_REQUEST["do_Orphans"]."'>".__("Location")."</a>";
simo's avatar
simo committed
926
		print "</span></th>\n";
927
		print "  <th style='border-bottom: #666 1px solid; vertical-align:";
simo's avatar
simo committed
928
		print " bottom'><span class='f2'>";
swiergot's avatar
swiergot committed
929
		print "<a href='?O=$O&L=".intval($_REQUEST["L"])."&C=".intval($_REQUEST["C"])."&K=$K&SB=c&SO=$SO_next&PP=$PP&SeB=".$_REQUEST["SeB"]."&do_MyPackages=".$_REQUEST["do_MyPackages"]."&do_Orphans=".$_REQUEST["do_Orphans"]."'>".__("Category")."</a>";
simo's avatar
simo committed
930
		print "</span></th>\n";
931
		print "  <th style='border-bottom: #666 1px solid; vertical-align:";
simo's avatar
simo committed
932
		print " bottom'><span class='f2'>";
swiergot's avatar
swiergot committed
933
		print "<a href='?O=$O&L=".intval($_REQUEST["L"])."&C=".intval($_REQUEST["C"])."&K=$K&SB=n&SO=$SO_next&PP=$PP&SeB=".$_REQUEST["SeB"]."&do_MyPackages=".$_REQUEST["do_MyPackages"]."&do_Orphans=".$_REQUEST["do_Orphans"]."'>".__("Name")."</a>";
simo's avatar
simo committed
934
		print "</span></th>\n";
935
		print "  <th style='border-bottom: #666 1px solid; vertical-align:";
simo's avatar
simo committed
936
		print " bottom'><span class='f2'>";
swiergot's avatar
swiergot committed
937
		print "<a href='?O=$O&L=".intval($_REQUEST["L"])."&C=".intval($_REQUEST["C"])."&K=$K&SB=v&SO=$SO_next&PP=$PP&SeB=".$_REQUEST["SeB"]."&do_MyPackages=".$_REQUEST["do_MyPackages"]."&do_Orphans=".$_REQUEST["do_Orphans"]."'>".__("Votes")."</a>";
simo's avatar
simo committed
938
		print "</span></th>\n";
939
940
		if ($SID) {
			print "  <th style='border-bottom: #666 1px solid; vertical-align:";
941
			print " bottom'><span class='f2'>".__("Voted")."</span></th>\n";
942
		}
943
944
945
946
		if ($SID) {
			print "  <th style='border-bottom: #666 1px solid; vertical-align:";
			print " bottom'><span class='f2'>".__("Notify")."</span></th>\n";
		}
947
		print "  <th style='border-bottom: #666 1px solid; vertical-align:";
simo's avatar
simo committed
948
949
		print " bottom'><span class='f2'>".__("Description")."</a>";
		print "</span></th>\n";
950
		print "  <th style='border-bottom: #666 1px solid; vertical-align:";
simo's avatar
simo committed
951
		print " bottom'><span class='f2'>";
swiergot's avatar
swiergot committed
952
		print "<a href='?O=$O&L=".intval($_REQUEST["L"])."&C=".intval($_REQUEST["C"])."&K=$K&SB=m&SO=$SO_next&PP=$PP&SeB=".$_REQUEST["SeB"]."&do_MyPackages=".$_REQUEST["do_MyPackages"]."&do_Orphans=".$_REQUEST["do_Orphans"]."'>".__("Maintainer")."</a>";
simo's avatar
simo committed
953
		print "</span></th>\n";
954
955
956
957
958
# REMOVED LINK TO 'pkgmgmnt.php'
#		if ($SID) {
#			print "  <th style='border-bottom: #666 1px solid; vertical-align:";
#			print " bottom'><span class='f2'>".__("Manage")."</span></th>\n";
#		}
959
960
		print "</tr>\n";        
        
961
        for ($i=0; $row = mysql_fetch_assoc($result); $i++) {
962
963
			(($i % 2) == 0) ? $c = "data1" : $c = "data2";
			print "<tr>\n";
964
965
			if ($SID) {
				if ($row["OutOfDate"]) {
966
					$c = "outofdate";
967
				}
968
				print "  <td class='".$c."'>";
969
970
971
972
973
974
				print "<input type='checkbox' name='IDs[".$row["ID"]."]' value='1'>";
#				if ($i == 0) {
#					$all_ids = $row["ID"];
#				} else {
#					$all_ids .= ":".$row["ID"];
#				}
975
976
977
978
979
				if ($row["OutOfDate"]) {
					print "</span>";
				}
				print "</td>\n";
			}
980
981
982
983
			print "  <td class='".$c."'><span class='f5'><span class='blue'>";
			print $locs[$row["LocationID"]]."</span></span></td>\n";
			print "  <td class='".$c."'><span class='f5'><span class='blue'>";
			print $cats[$row["CategoryID"]]."</span></span></td>\n";
984
			print "  <td class='".$c."'><span class='f4'>";
eric's avatar
eric committed
985
			$url = "<a href='/packages.php?";
986
			$url .= "ID=";
eric's avatar
eric committed
987
			$url .= $row["ID"];
988
			$url.= "'>";
989
			$url.="<span class='black'>";
990
			$url.=$row["Name"];
991
			$url.= " ".$row["Version"]."</span></a>";
eric's avatar
eric committed
992
			print $url."</span></td>\n";
993
			print "  <td class='".$c."'><span class='f5'><span class='blue'>";
994
			print "&nbsp;&nbsp;&nbsp;".$row["NumVotes"]."</span></span></td>\n";
995
996
997
998
999
1000
			if ($SID) {
				print "  <td class='".$c."'><span class='f5'><span class='blue'>";
				if (isset($my_votes[$row["ID"]])) {
					print "&nbsp;&nbsp;".__("Yes")."</span></td>\n";
				} else {
					print "&nbsp;</span></td>\n";
For faster browsing, not all history is shown. View entire blame