summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--web/html/index.php16
-rw-r--r--web/html/pkgbase.php55
-rw-r--r--web/lib/pkgfuncs.inc.php84
-rw-r--r--web/lib/routing.inc.php16
-rw-r--r--web/template/pkgbase_details.php210
5 files changed, 380 insertions, 1 deletions
diff --git a/web/html/index.php b/web/html/index.php
index 542d594c..e79955ec 100644
--- a/web/html/index.php
+++ b/web/html/index.php
@@ -70,6 +70,22 @@ if (!empty($tokens[1]) && '/' . $tokens[1] == get_pkg_route()) {
}
include get_route('/' . $tokens[1]);
+} elseif (!empty($tokens[1]) && '/' . $tokens[1] == get_pkgbase_route()) {
+ if (!empty($tokens[2])) {
+ /* TODO: Create a proper data structure to pass variables from
+ * the routing framework to the individual pages instead of
+ * initializing arbitrary variables here. */
+ $pkgbase_name = $tokens[2];
+ $base_id = pkgbase_from_name($pkgbase_name);
+
+ if (!$base_id) {
+ header("HTTP/1.0 404 Not Found");
+ include "./404.php";
+ return;
+ }
+ }
+
+ include get_route('/' . $tokens[1]);
} elseif (!empty($tokens[1]) && '/' . $tokens[1] == get_user_route()) {
if (!empty($tokens[2])) {
$_REQUEST['ID'] = uid_from_username($tokens[2]);
diff --git a/web/html/pkgbase.php b/web/html/pkgbase.php
new file mode 100644
index 00000000..e0c9af69
--- /dev/null
+++ b/web/html/pkgbase.php
@@ -0,0 +1,55 @@
+<?php
+
+set_include_path(get_include_path() . PATH_SEPARATOR . '../lib');
+
+include_once("aur.inc.php");
+set_lang();
+include_once('pkgfuncs.inc.php');
+check_sid();
+
+/*
+ * Retrieve package base ID and name, unless initialized by the routing
+ * framework.
+ */
+if (!isset($base_id) || !isset($pkgbase_name)) {
+ if (isset($_GET['ID'])) {
+ $base_id = intval($_GET['ID']);
+ $pkgbase_name = pkgbase_name_from_id($_GET['ID']);
+ } else if (isset($_GET['N'])) {
+ $base_id = pkgbase_from_name($_GET['N']);
+ $pkgbase_name = $_GET['N'];
+ } else {
+ unset($base_id, $pkgbase_name);
+ }
+
+ if ($base_id == 0 || $base_id == NULL || $pkgbase_name == NULL) {
+ header("HTTP/1.0 404 Not Found");
+ include "./404.php";
+ return;
+ }
+}
+
+/* Set the title to package base name. */
+$title = $pkgbase_name;
+
+/* Retrieve account type. */
+if (isset($_COOKIE["AURSID"])) {
+ $atype = account_from_sid($_COOKIE["AURSID"]);
+} else {
+ $atype = "";
+}
+
+$details = get_pkgbase_details($base_id);
+html_header($title, $details);
+?>
+
+<?php
+include('pkg_search_form.php');
+if (isset($_COOKIE["AURSID"])) {
+ display_pkgbase_details($base_id, $details, $_COOKIE["AURSID"]);
+} else {
+ display_pkgbase_details($base_id, $details, null);
+}
+
+html_footer(AUR_VERSION);
+
diff --git a/web/lib/pkgfuncs.inc.php b/web/lib/pkgfuncs.inc.php
index 3ef069c9..b92eb9c2 100644
--- a/web/lib/pkgfuncs.inc.php
+++ b/web/lib/pkgfuncs.inc.php
@@ -445,6 +445,41 @@ function get_package_details($id=0) {
}
/**
+ * Get the package base details
+ *
+ * @param string $id The package base ID to get description for
+ *
+ * @return array The package base's details OR error message
+ **/
+function get_pkgbase_details($base_id) {
+ $dbh = DB::connect();
+
+ $q = "SELECT PackageBases.ID, PackageBases.Name, ";
+ $q.= "PackageBases.CategoryID, PackageBases.NumVotes, ";
+ $q.= "PackageBases.OutOfDateTS, PackageBases.SubmittedTS, ";
+ $q.= "PackageBases.ModifiedTS, PackageBases.SubmitterUID, ";
+ $q.= "PackageBases.MaintainerUID, PackageCategories.Category ";
+ $q.= "FROM PackageBases, PackageCategories ";
+ $q.= "WHERE PackageBases.CategoryID = PackageCategories.ID ";
+ $q.= "AND PackageBases.ID = " . intval($base_id);
+ $result = $dbh->query($q);
+
+ $row = array();
+
+ if (!$result) {
+ $row['error'] = __("Error retrieving package details.");
+ }
+ else {
+ $row = $result->fetch(PDO::FETCH_ASSOC);
+ if (empty($row)) {
+ $row['error'] = __("Package details could not be found.");
+ }
+ }
+
+ return $row;
+}
+
+/**
* Display the package details page
*
* @global string $AUR_LOCATION The AUR's URL used for notification e-mails
@@ -480,6 +515,41 @@ function display_package_details($id=0, $row, $SID="") {
}
}
+/**
+ * Display the package base details page
+ *
+ * @global string $AUR_LOCATION The AUR's URL used for notification e-mails
+ * @global bool $USE_VIRTUAL_URLS True if using URL rewriting, otherwise false
+ * @param string $id The package base ID to get details page for
+ * @param array $row Package base details retrieved by get_pkgbase_details
+ * @param string $SID The session ID of the visitor
+ *
+ * @return void
+ */
+function display_pkgbase_details($base_id, $row, $SID="") {
+ global $AUR_LOCATION;
+ global $USE_VIRTUAL_URLS;
+
+ $dbh = DB::connect();
+
+ if (isset($row['error'])) {
+ print "<p>" . $row['error'] . "</p>\n";
+ }
+ else {
+ include('pkgbase_details.php');
+
+ if ($SID) {
+ include('actions_form.php');
+ include('pkg_comment_form.php');
+ }
+
+ $comments = package_comments($base_id);
+ if (!empty($comments)) {
+ include('pkg_comments.php');
+ }
+ }
+}
+
/* pkg_search_page(SID)
* outputs the body of search/search results page
@@ -816,6 +886,20 @@ function pkgbase_name_from_id($base_id) {
}
/**
+ * Get the names of all packages belonging to a package base
+ *
+ * @param int $base_id The ID of the package base
+ *
+ * @return array The names of all packages belonging to the package base
+ */
+function pkgbase_get_pkgnames($base_id) {
+ $dbh = DB::connect();
+ $q = "SELECT Name FROM Packages WHERE PackageBaseID = " . intval($base_id);
+ $result = $dbh->query($q);
+ return $result->fetchAll(PDO::FETCH_COLUMN, 0);
+}
+
+/**
* Delete all packages belonging to a package base
*
* @param int $base_id The ID of the package base
diff --git a/web/lib/routing.inc.php b/web/lib/routing.inc.php
index b1e5be2b..1b2aa52b 100644
--- a/web/lib/routing.inc.php
+++ b/web/lib/routing.inc.php
@@ -4,6 +4,7 @@ $ROUTES = array(
'' => 'home.php',
'/index.php' => 'home.php',
'/packages' => 'packages.php',
+ '/pkgbase' => 'pkgbase.php',
'/register' => 'account.php',
'/account' => 'account.php',
'/accounts' => 'account.php',
@@ -18,6 +19,7 @@ $ROUTES = array(
);
$PKG_PATH = '/packages';
+$PKGBASE_PATH = '/pkgbase';
$USER_PATH = '/account';
function get_route($path) {
@@ -47,6 +49,11 @@ function get_pkg_route() {
return $PKG_PATH;
}
+function get_pkgbase_route() {
+ global $PKGBASE_PATH;
+ return $PKGBASE_PATH;
+}
+
function get_pkg_uri($pkgname) {
global $USE_VIRTUAL_URLS;
global $PKG_PATH;
@@ -59,7 +66,14 @@ function get_pkg_uri($pkgname) {
}
function get_pkgbase_uri($pkgbase_name) {
- return get_pkg_uri($pkgbase_name);
+ global $USE_VIRTUAL_URLS;
+ global $PKGBASE_PATH;
+
+ if ($USE_VIRTUAL_URLS) {
+ return $PKGBASE_PATH . '/' . urlencode($pkgbase_name) . '/';
+ } else {
+ return '/' . get_route($PKGBASE_PATH) . '?N=' . urlencode($pkgbase_name);
+ }
}
function get_user_route() {
diff --git a/web/template/pkgbase_details.php b/web/template/pkgbase_details.php
new file mode 100644
index 00000000..a77ecd39
--- /dev/null
+++ b/web/template/pkgbase_details.php
@@ -0,0 +1,210 @@
+<?php
+$atype = account_from_sid($SID);
+$uid = uid_from_sid($SID);
+
+$base_id = intval($row['ID']);
+
+$catarr = pkgCategories();
+
+$submitter = username_from_id($row["SubmitterUID"]);
+$maintainer = username_from_id($row["MaintainerUID"]);
+
+$votes = $row['NumVotes'];
+
+# In case of wanting to put a custom message
+$msg = __('unknown');
+
+# Print the timestamps for last updates
+$updated_time = ($row["ModifiedTS"] == 0) ? $msg : gmdate("Y-m-d H:i", intval($row["ModifiedTS"]));
+$submitted_time = ($row["SubmittedTS"] == 0) ? $msg : gmdate("Y-m-d H:i", intval($row["SubmittedTS"]));
+$out_of_date_time = ($row["OutOfDateTS"] == 0) ? $msg : gmdate("Y-m-d", intval($row["OutOfDateTS"]));
+
+$urlpath = URL_DIR . substr($row['Name'], 0, 2) . "/" . $row['Name'];
+
+$pkgs = pkgbase_get_pkgnames($base_id);
+?>
+<div id="pkgdetails" class="box">
+ <h2><?= __('Package Base Details') . ': ' . htmlspecialchars($row['Name']) ?></h2>
+ <div id="detailslinks" class="listing">
+ <div id="actionlist">
+ <h4><?= __('Package Actions') ?></h4>
+ <ul class="small">
+ <li><a href="<?= $urlpath ?>/PKGBUILD"><?= __('View PKGBUILD') ?></a></li>
+ <li><a href="<?= $urlpath . '/' . $pkgs[0] ?>.tar.gz"><?= __('Download tarball') ?></a></li>
+ <li><span class="flagged"><?php if ($row["OutOfDateTS"] !== NULL) { echo __('Flagged out-of-date')." (${out_of_date_time})"; } ?></span></li>
+ <?php if ($USE_VIRTUAL_URLS && $uid): ?>
+ <?php if ($row["OutOfDateTS"] === NULL): ?>
+ <li>
+ <form action="<?= get_pkg_uri($pkgs[0]) . 'flag/'; ?>" method="post">
+ <input type="hidden" name="token" value="<?= htmlspecialchars($_COOKIE['AURSID']) ?>" />
+ <input type="submit" class="button text-button" name="do_Flag" value="<?= __('Flag package out-of-date') ?>" />
+ </form>
+ </li>
+ <?php elseif (($row["OutOfDateTS"] !== NULL) &&
+ ($uid == $row["MaintainerUID"] || $atype == "Trusted User" || $atype == "Developer")): ?>
+ <li>
+ <form action="<?= get_pkg_uri($pkgs[0]) . 'unflag/'; ?>" method="post">
+ <input type="hidden" name="token" value="<?= htmlspecialchars($_COOKIE['AURSID']) ?>" />
+ <input type="submit" class="button text-button" name="do_UnFlag" value="<?= __('Unflag package') ?>" />
+ </form>
+ </li>
+ <?php endif; ?>
+ <?php if (user_voted($uid, $row['ID'])): ?>
+ <li>
+ <form action="<?= get_pkg_uri($pkgs[0]) . 'unvote/'; ?>" method="post">
+ <input type="hidden" name="token" value="<?= htmlspecialchars($_COOKIE['AURSID']) ?>" />
+ <input type="submit" class="button text-button" name="do_UnVote" value="<?= __('Remove vote') ?>" />
+ </form>
+ </li>
+ <?php else: ?>
+ <li>
+ <form action="<?= get_pkg_uri($pkgs[0]) . 'vote/'; ?>" method="post">
+ <input type="hidden" name="token" value="<?= htmlspecialchars($_COOKIE['AURSID']) ?>" />
+ <input type="submit" class="button text-button" name="do_Vote" value="<?= __('Vote for this package') ?>" />
+ </form>
+ </li>
+ <?php endif; ?>
+ <?php if (user_notify($uid, $row['ID'])): ?>
+ <li>
+ <form action="<?= get_pkg_uri($pkgs[0]) . 'unnotify/'; ?>" method="post">
+ <input type="hidden" name="token" value="<?= htmlspecialchars($_COOKIE['AURSID']) ?>" />
+ <input type="submit" class="button text-button" name="do_UnNotify" value="<?= __('Disable notifications') ?>" />
+ </form>
+ </li>
+ <?php else: ?>
+ <li>
+ <form action="<?= get_pkg_uri($pkgs[0]) . 'notify/'; ?>" method="post">
+ <input type="hidden" name="token" value="<?= htmlspecialchars($_COOKIE['AURSID']) ?>" />
+ <input type="submit" class="button text-button" name="do_Notify" value="<?= __('Notify of new comments') ?>" />
+ </form>
+ </li>
+ <?php endif; ?>
+ <?php if ($atype == "Trusted User" || $atype == "Developer"): ?>
+ <li><a href="<?= get_pkg_uri($pkgs[0]) . 'delete/'; ?>"><?= __('Delete Package'); ?></a></li>
+ <li><a href="<?= get_pkg_uri($pkgs[0]) . 'merge/'; ?>"><?= __('Merge Package'); ?></a></li>
+ <?php endif; ?>
+ <?php endif; ?>
+
+ <?php if ($uid && $row["MaintainerUID"] === NULL): ?>
+ <li>
+ <form action="<?= get_pkg_uri($pkgs[0]) . 'adopt/'; ?>" method="post">
+ <input type="hidden" name="token" value="<?= htmlspecialchars($_COOKIE['AURSID']) ?>" />
+ <input type="submit" class="button text-button" name="do_Adopt" value="<?= __('Adopt Package') ?>" />
+ </form>
+ </li>
+ <?php elseif ($uid && $uid == $row["MaintainerUID"] ||
+ $atype == "Trusted User" || $atype == "Developer"): ?>
+ <li>
+ <form action="<?= get_pkg_uri($pkgs[0]) . 'disown/'; ?>" method="post">
+ <input type="hidden" name="token" value="<?= htmlspecialchars($_COOKIE['AURSID']) ?>" />
+ <input type="submit" class="button text-button" name="do_Disown" value="<?= __('Disown Package') ?>" />
+ </form>
+ </li>
+ <?php endif; ?>
+ </ul>
+ </div>
+ </div>
+
+ <table id="pkginfo">
+ <tr>
+ <th><?= __('Category') . ': ' ?></th>
+<?php
+if ($SID && ($uid == $row["MaintainerUID"] ||
+ ($atype == "Developer" || $atype == "Trusted User"))):
+?>
+ <td>
+ <form method="post" action="<?= htmlspecialchars(get_pkg_uri($row['Name']), ENT_QUOTES); ?>">
+ <div>
+ <input type="hidden" name="action" value="do_ChangeCategory" />
+ <?php if ($SID): ?>
+ <input type="hidden" name="token" value="<?= htmlspecialchars($_COOKIE['AURSID']) ?>" />
+ <?php endif; ?>
+ <select name="category_id">
+<?php
+ foreach ($catarr as $cid => $catname):
+?>
+ <option value="<?= $cid ?>"<?php if ($cid == $row["CategoryID"]) { ?> selected="selected" <?php } ?>><?= $catname ?></option>
+ <?php endforeach; ?>
+ </select>
+ <input type="submit" value="<?= __('Change category') ?>"/>
+ </div>
+ </form>
+<?php else: ?>
+ <td>
+ <a href="<?= get_uri('/packages/'); ?>?C=<?= $row['CategoryID'] ?>"><?= $row['Category'] ?></a>
+<?php endif; ?>
+ </td>
+ </tr>
+ <tr>
+ <th><?= __('Submitter') .': ' ?></th>
+<?php
+if ($row["SubmitterUID"]):
+ if ($SID):
+ if (!$USE_VIRTUAL_URLS):
+?>
+ <td><a href="<?= get_uri('/account/'); ?>?Action=AccountInfo&amp;ID=<?= htmlspecialchars($row['SubmitterUID'], ENT_QUOTES) ?>" title="<?= __('View account information for')?> <?= htmlspecialchars($submitter) ?>"><?= htmlspecialchars($submitter) ?></a></td>
+ <?php else: ?>
+ <td><a href="<?= get_uri('/account/') . htmlspecialchars($submitter, ENT_QUOTES) ?>" title="<?= __('View account information for %s', htmlspecialchars($submitter)) ?>"><?= htmlspecialchars($submitter) ?></a></td>
+ <?php endif; ?>
+<?php else: ?>
+ <td><?= htmlspecialchars($submitter) ?></td>
+ <?php endif; ?>
+<?php else: ?>
+ <td><?= __('None') ?></td>
+<?php endif; ?>
+ </tr>
+ <tr>
+ <th><?= __('Maintainer') .': ' ?></th>
+<?php
+if ($row["MaintainerUID"]):
+ if ($SID):
+ if (!$USE_VIRTUAL_URLS):
+?>
+ <td><a href="<?= get_uri('/account/'); ?>?Action=AccountInfo&amp;ID=<?= htmlspecialchars($row['MaintainerUID'], ENT_QUOTES) ?>" title="<?= __('View account information for')?> <?= htmlspecialchars($maintainer) ?>"><?= htmlspecialchars($maintainer) ?></a></td>
+ <?php else: ?>
+ <td><a href="<?= get_uri('/account/') . htmlspecialchars($maintainer, ENT_QUOTES) ?>" title="<?= __('View account information for %s', htmlspecialchars($maintainer)) ?>"><?= htmlspecialchars($maintainer) ?></a></td>
+ <?php endif; ?>
+ <?php else: ?>
+ <td><?= htmlspecialchars($maintainer) ?></td>
+ <?php endif; ?>
+<?php else: ?>
+ <td><?= __('None') ?></td>
+<?php endif; ?>
+ </tr>
+ <tr>
+ <th><?= __('Votes') . ': ' ?></th>
+<?php if ($atype == "Developer" || $atype == "Trusted User"): ?>
+<?php if ($USE_VIRTUAL_URLS): ?>
+ <td><a href="<?= get_pkg_uri($row['Name']); ?>voters/"><?= $votes ?></a></td>
+<?php else: ?>
+ <td><a href="<?= get_uri('/voters/'); ?>?N=<?= htmlspecialchars($row['Name'], ENT_QUOTES) ?>"><?= $votes ?></a></td>
+<?php endif; ?>
+<?php else: ?>
+ <td><?= $votes ?></td>
+<?php endif; ?>
+ </tr>
+ <tr>
+ <th><?= __('First Submitted') . ': ' ?></th>
+ <td><?= $submitted_time ?></td>
+ </tr>
+ <tr>
+ <th><?= __('Last Updated') . ': ' ?></th>
+ <td><?= $updated_time ?></td>
+ </tr>
+ </table>
+
+ <div id="metadata">
+ <div id="pkgs" class="listing">
+ <h3><?= __('Packages') . " (" . count($pkgs) . ")"?></h3>
+<?php if (count($pkgs) > 0): ?>
+ <ul>
+<?php
+ while (list($k, $pkg) = each($pkgs)):
+?>
+ <li><a href="<?= htmlspecialchars(get_pkg_uri($pkg), ENT_QUOTES); ?>" title="<?= __('View packages details for').' '. htmlspecialchars($pkg) ?>"><?= htmlspecialchars($pkg) ?></a></li>
+ <?php endwhile; ?>
+ </ul>
+<?php endif; ?>
+ </div>
+ </div>
+</div>