Commit 48cc8207 authored by Lukas Fleischer's avatar Lukas Fleischer
Browse files

Add support for filing package requests



Add a new entry to the package actions box that allows for filing
deletion and orphan requests. When choosing that action, the user is
redirected to a new page that allows for selecting a request type and
entering a comment. When submitting the request, a new entry in the
request database is created and an email is sent to a configurable
mailing list (defaults to aur-general).
Signed-off-by: default avatarLukas Fleischer <archlinux@cryptocrack.de>
parent e37a49d7
Upgrading
=========
From 3.1.0 to 3.2.0
-------------------
1. Add support for package requests to the database:
----
CREATE TABLE RequestTypes (
ID TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
Name VARCHAR(32) NOT NULL DEFAULT '',
PRIMARY KEY (ID)
) ENGINE = InnoDB;
INSERT INTO RequestTypes VALUES (1, 'deletion');
INSERT INTO RequestTypes VALUES (2, 'orphan');
CREATE TABLE PackageRequests (
ID BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
ReqTypeID TINYINT UNSIGNED NOT NULL,
PackageBaseID INTEGER UNSIGNED NULL,
PackageBaseName VARCHAR(255) NOT NULL,
UsersID INTEGER UNSIGNED NULL DEFAULT NULL,
Comments TEXT NOT NULL DEFAULT '',
RequestTS BIGINT UNSIGNED NOT NULL DEFAULT 0,
PRIMARY KEY (ID),
INDEX (UsersID),
INDEX (PackageBaseID),
FOREIGN KEY (ReqTypeID) REFERENCES RequestTypes(ID) ON DELETE NO ACTION,
FOREIGN KEY (UsersID) REFERENCES Users(ID) ON DELETE SET NULL,
FOREIGN KEY (PackageBaseID) REFERENCES PackageBases(ID) ON DELETE SET NULL
) ENGINE = InnoDB;
----
From 3.0.0 to 3.1.0
-------------------
......
......@@ -288,6 +288,34 @@ CREATE TABLE PackageBlacklist (
UNIQUE (Name)
) ENGINE = InnoDB;
-- Define package request types
--
CREATE TABLE RequestTypes (
ID TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
Name VARCHAR(32) NOT NULL DEFAULT '',
PRIMARY KEY (ID)
) ENGINE = InnoDB;
INSERT INTO RequestTypes VALUES (1, 'deletion');
INSERT INTO RequestTypes VALUES (2, 'orphan');
-- Package requests
--
CREATE TABLE PackageRequests (
ID BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
ReqTypeID TINYINT UNSIGNED NOT NULL,
PackageBaseID INTEGER UNSIGNED NULL,
PackageBaseName VARCHAR(255) NOT NULL,
UsersID INTEGER UNSIGNED NULL DEFAULT NULL,
Comments TEXT NOT NULL DEFAULT '',
RequestTS BIGINT UNSIGNED NOT NULL DEFAULT 0,
PRIMARY KEY (ID),
INDEX (UsersID),
INDEX (PackageBaseID),
FOREIGN KEY (ReqTypeID) REFERENCES RequestTypes(ID) ON DELETE NO ACTION,
FOREIGN KEY (UsersID) REFERENCES Users(ID) ON DELETE SET NULL,
FOREIGN KEY (PackageBaseID) REFERENCES PackageBases(ID) ON DELETE SET NULL
) ENGINE = InnoDB;
-- Vote information
--
CREATE TABLE IF NOT EXISTS TU_VoteInfo (
......
......@@ -75,6 +75,9 @@ if (!empty($tokens[1]) && '/' . $tokens[1] == get_pkg_route()) {
$_GET['N'] = $tokens[2];
include('voters.php');
return;
case "request":
include('pkgreq.php');
return;
default:
header("HTTP/1.0 404 Not Found");
include "./404.php";
......
......@@ -94,6 +94,8 @@ if (check_token()) {
list($ret, $output) = pkgbase_delete_comment($atype);
} elseif (current_action("do_ChangeCategory")) {
list($ret, $output) = pkgbase_change_category($base_id, $atype);
} elseif (current_action("do_FileRequest")) {
list($ret, $output) = pkgbase_file_request($ids, $_POST['type'], $_POST['comments']);
}
if (isset($_REQUEST['comment'])) {
......
<?php
set_include_path(get_include_path() . PATH_SEPARATOR . '../lib');
include_once("aur.inc.php");
include_once("pkgfuncs.inc.php");
set_lang();
check_sid();
html_header(__("File Request"));
if (!check_user_privileges()) {
header('Location: /');
exit();
}
?>
<div class="box">
<h2><?= __('File Request: %s', htmlspecialchars($pkgbase_name)) ?></h2>
<p>
<?= __('Use this form to file a request against package base %s%s%s which includes the following packages:',
'<strong>', htmlspecialchars($pkgbase_name), '</strong>'); ?>
</p>
<ul>
<?php foreach(pkgbase_get_pkgnames($base_id) as $pkgname): ?>
<li><?= htmlspecialchars($pkgname) ?></li>
<?php endforeach; ?>
</ul>
<form action="<?= get_uri('/pkgbase/'); ?>" method="post">
<fieldset>
<input type="hidden" name="IDs[<?= $base_id ?>]" value="1" />
<input type="hidden" name="ID" value="<?= $base_id ?>" />
<input type="hidden" name="token" value="<?= htmlspecialchars($_COOKIE['AURSID']) ?>" />
<p>
<label for="id_type"><?= __("Request type") ?>:</label>
<select name="type" id="id_type">
<option value="deletion"><?= __('Deletion') ?></option>
<option value="orphan"><?= __('Orphan') ?></option>
</select>
</p>
<p>
<label for="id_comments"><?= __("Comments") ?>:</label>
<textarea name="comments" id="id_comments" rows="5" cols="50"></textarea>
</p>
<p>
<input type="submit" class="button" name="do_FileRequest" value="<?= __("File Request") ?>" />
</p>
</fieldset>
</form>
</div>
<?php
html_footer(AUR_VERSION);
......@@ -59,3 +59,6 @@ $USE_VIRTUAL_URLS = true;
# Maximum number of package results to return through an RPC connection.
# Avoid setting this too high and having a PHP too much memory error.
$MAX_RPC_RESULTS = 5000;
# Mailing list to send package request notifications to.
$AUR_REQUEST_ML = "aur-general@archlinux.org";
......@@ -962,3 +962,91 @@ function pkgbase_update_category($base_id, $category_id) {
$category_id, $base_id);
$dbh->exec($q);
}
/**
* File a deletion/orphan request against a package base
*
* @global string $AUR_LOCATION The AUR's URL used for notification e-mails
* @global string $AUR_REQUEST_ML The request notification mailing list
* @param string $ids The package base IDs to file the request against
* @param string $type The type of the request
* @param string $comments The comments to be added to the request
*
* @return void
*/
function pkgbase_file_request($ids, $type, $comments) {
global $AUR_LOCATION;
global $AUR_REQUEST_ML;
if (empty($comments)) {
return array(false, __("The comment field must not be empty."));
}
$dbh = DB::connect();
$uid = uid_from_sid($_COOKIE["AURSID"]);
/* TODO: Allow for filing multiple requests at once. */
$base_id = $ids[0];
$pkgbase_name = pkgbase_name_from_id($base_id);
$q = "SELECT ID FROM RequestTypes WHERE Name = " . $dbh->quote($type);
$result = $dbh->query($q);
if ($row = $result->fetch(PDO::FETCH_ASSOC)) {
$type_id = $row['ID'];
} else {
return array(false, __("Invalid request type."));
}
$q = "INSERT INTO PackageRequests ";
$q.= "(ReqTypeID, PackageBaseID, PackageBaseName, UsersID, ";
$q.= "Comments, RequestTS) VALUES (" . $type_id . ", ";
$q.= intval($base_id) . ", " . $dbh->quote($pkgbase_name) . ", ";
$q.= $uid . ", " . $dbh->quote($comments) . ", UNIX_TIMESTAMP())";
$dbh->exec($q);
/*
* Send e-mail notifications.
* TODO: Move notification logic to separate function where it belongs.
*/
$q = "SELECT Users.Email ";
$q.= "FROM Users INNER JOIN PackageBases ";
$q.= "ON PackageBases.MaintainerUID = Users.ID ";
$q.= "WHERE PackageBases.ID = " . intval($base_id);
$result = $dbh->query($q);
if ($row = $result->fetch(PDO::FETCH_ASSOC)) {
$bcc = $row['Email'];
} else {
unset($bcc);
}
$q = "SELECT Name FROM PackageBases WHERE ID = ";
$q.= intval($base_id);
$result = $dbh->query($q);
$row = $result->fetch(PDO::FETCH_ASSOC);
/*
* TODO: Add native language emails for users, based on their
* preferences. Simply making these strings translatable won't
* work, users would be getting emails in the language that the
* user who posted the comment was in.
*/
$username = username_from_sid($_COOKIE['AURSID']);
$body =
$username . " [1] filed a " . $type . " request for " .
$row['Name'] . " [2]:\n\n" . $comments . "\n\n" .
"[1] " . $AUR_LOCATION . get_user_uri($username) . "\n" .
"[2] " . $AUR_LOCATION . get_pkgbase_uri($row['Name']) . "\n";
$body = wordwrap($body, 70);
$headers = "MIME-Version: 1.0\r\n" .
"Content-type: text/plain; charset=UTF-8\r\n";
if (!empty($bcc)) {
$headers .= "Bcc: $bcc\r\n";
}
$headers .= "Reply-to: noreply@aur.archlinux.org\r\n" .
"From: notify@aur.archlinux.org\r\n" .
"X-Mailer: AUR";
@mail($AUR_REQUEST_ML, "AUR " . ucfirst($type) . " Request for " .
$row['Name'], $body, $headers);
return array(true, __("Added request successfully."));
}
......@@ -106,6 +106,7 @@ $sources = pkg_sources($row["ID"]);
</form>
</li>
<?php endif; ?>
<li><a href="<?= get_pkgbase_uri($row['BaseName']) . 'request/'; ?>"><?= __('File Request'); ?></a></li>
<?php if ($atype == "Trusted User" || $atype == "Developer"): ?>
<li><a href="<?= get_pkgbase_uri($row['BaseName']) . 'delete/'; ?>"><?= __('Delete Package'); ?></a></li>
<li><a href="<?= get_pkgbase_uri($row['BaseName']) . 'merge/'; ?>"><?= __('Merge Package'); ?></a></li>
......
......@@ -81,6 +81,7 @@ $pkgs = pkgbase_get_pkgnames($base_id);
</form>
</li>
<?php endif; ?>
<li><a href="<?= get_pkgbase_uri($row['BaseName']) . 'request/'; ?>"><?= __('File Request'); ?></a></li>
<?php if ($atype == "Trusted User" || $atype == "Developer"): ?>
<li><a href="<?= get_pkgbase_uri($row['Name']) . 'delete/'; ?>"><?= __('Delete Package'); ?></a></li>
<li><a href="<?= get_pkgbase_uri($row['Name']) . 'merge/'; ?>"><?= __('Merge Package'); ?></a></li>
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment