/** * Produces an array of email addresses the report should go to * * @param string $package_name the package's name * * @return array an array of email addresses */ public function getPackageMail($package_name, $bug_id = false) { global $dbh; switch ($package_name) { case 'Bug System': case 'PEPr': case 'Web Site': $arr = $this->getPackageMail('pearweb'); $arr[0] .= ', <' . PEAR_WEBMASTER_EMAIL . '>'; return array($arr[0], PEAR_WEBMASTER_EMAIL); case 'Documentation': return array('<' . PEAR_DOC_EMAIL . '>', PEAR_DOC_EMAIL); } include_once 'pear-database-package.php'; $maintainers = package::info($package_name, 'authors'); $to = array(); foreach ($maintainers as $data) { if (!$data['active']) { continue; } $to[] = '<' . $data['email'] . '>'; } /* subscription */ if ($bug_id) { $bug_id = (int) $bug_id; $assigned = $dbh->getOne('SELECT assign FROM bugdb WHERE id = ' . $bug_id); if ($assigned) { $assigned = $dbh->getOne('SELECT email FROM users WHERE handle = ?', array($assigned)); if ($assigned && !in_array($assigned, $to)) { // assigned is not a maintainer $to[] = '<' . $assigned . '>'; } } // Add the bug mailing list if any if (PEARWEB_BUGS_ML_EMAIL != '') { $to[] = '<' . PEARWEB_BUGS_ML_EMAIL . '>'; } $bcc = $dbh->getCol('SELECT email FROM bugdb_subscribe WHERE bug_id = ' . $bug_id); $bcc = array_diff($bcc, $to); $bcc = array_unique($bcc); $bcc = array_map(function ($val) { return '<' . $val . '>'; }, $bcc); return array(implode(', ', $to), PEAR_QA_EMAIL, implode(', ', $bcc)); } return array(implode(', ', $to), PEAR_QA_EMAIL); }
function __construct($package) { $this->_dbh =& $GLOBALS['dbh']; include_once 'pear-database-package.php'; $this->_info = package::info($package, 'releases'); $this->_pkgid = package::info($package, 'id'); if (is_array($this->_info) && $this->_info) { foreach ($this->_info as $ver => $release) { if (!isset($this->_lastversion)) { $this->_lastversion = $ver; $this->_laststate = $release['state']; $this->_lastid = $release['id']; } $this->_states[$release['state']] = 1; } } }
function nextRelease($package) { $sql = ' SELECT roadmap_version,releasedate FROM bugdb_roadmap WHERE package = ? AND releasedate <> "1976-09-02 17:15:30" ORDER BY releasedate ASC'; $ret = $GLOBALS['dbh']->getAll($sql, array($package)); if (!$ret) { return false; } include_once 'pear-database-package.php'; $releases = array_keys(package::info($package, 'releases')); foreach ($ret as $roadmap) { if (in_array($roadmap[0], $releases)) { continue; } return $roadmap; } }
$stupid = false; if ($version == '1.0.0' && $info->getState() != 'stable') { $errors[] = 'Version 1.0.0 must be stable'; } if (strpos($version, 'RC') && $info->getState() != 'beta') { $errors[] = 'Release Candidate versions must have stability beta'; } if (substr($verinfo[2], 1, 2) == 'rc') { $errors[] = 'Release Candidate versions MUST use upper-case RC versioning, not rc'; } if (substr($version, 0, 4) == '0.0.') { $errors[] = 'Version 0.0.X is invalid, use 0.X.0'; } } if ($info->getState() == 'stable') { $releases = package::info($info->getPackage(), 'releases'); if (!count($releases)) { $errors[] = "The first release of a package must be 'alpha' or 'beta', not 'stable'." . " Try releasing version 1.0.0RC1, state 'beta'"; } if ($version[0] < 1) { $errors[] = "Versions < 1.0.0 may not be 'stable'"; } if (!$stupid && !strpos($version, 'RC') && !preg_match('/^\\d+\\z/', $verinfo[2])) { $errors[] = "Stable versions must not have a postfix (use 'beta' for RC postfix)"; } } $filelist = $info->getFilelist(); if (isset($filelist['package.xml'])) { $warnings[] = 'package.xml should not be present in package.xml, installation may fail'; } if (isset($filelist['package2.xml'])) {
} if (isset($_GET['new'])) { $savant->errors = false; if (isset($_POST['go'])) { if ($_POST['releasedate'] == 'future') { // my birthday will represent the future ;) $_POST['releasedate'] = '1976-09-02 17:15:30'; } $bugdb = Bug_DataObject::bugDB('bugdb_roadmap'); $bugdb->description = $_POST['description']; $bugdb->releasedate = date('Y-m-d H:i:s', strtotime($_POST['releasedate'])); $bugdb->package = $_GET['package']; $bugdb->roadmap_version = $_POST['roadmap_version']; if (empty($_POST['roadmap_version'])) { $savant->errors = array('Roadmap version cannot be empty'); } else { $bugdb->insert(); } } if (isset($_POST['releasedate']) && $_POST['releasedate'] != 'future') { $_POST['releasedate'] = date('Y-m-d', strtotime($_POST['releasedate'])); } $savant->info = array('package' => clean($_GET['package']), 'releasedate' => isset($_POST['releasedate']) ? $_POST['releasedate'] : '', 'roadmap_version' => isset($_POST['roadmap_version']) ? clean($_POST['roadmap_version']) : '', 'description' => isset($_POST['description']) ? clean($_POST['description']) : ''); $savant->isnew = true; $savant->import = isset($_POST['importbugs']) ? true : false; $releases = package::info(clean($_GET['package']), 'releases'); $savant->lastRelease = count($releases) ? key($releases) : ''; $savant->display('roadmapform.php'); exit; } $savant->display('roadmap.php');
/** * Updates fields of an existant package * * @param int $pkgid The package ID to update * @param array $data Assoc in the form 'field' => 'value'. * @return mixed True or PEAR_Error */ static function updateInfo($pkgid, $data) { global $dbh, $auth_user; $package_id = package::info($pkgid, 'id'); if (PEAR::isError($package_id) || empty($package_id)) { return PEAR::raiseError('Package not registered or not approved. Please register it first with "New Package" or wait until it gets approved.'); } if ($auth_user->isAdmin() === false && $auth_user->isQA() === false) { include_once 'pear-database-user.php'; $role = user::maintains($auth_user->handle, $package_id); if ($role != 'lead' && $role != 'developer') { return PEAR::raiseError('package::updateInfo: insufficient privileges'); } } // XXX (cox) what about 'name'? $allowed = array('license', 'summary', 'description', 'category'); $fields = $prep = array(); foreach ($allowed as $a) { if (isset($data[$a])) { $fields[] = "{$a} = ?"; $prep[] = $data[$a]; } } if (!count($fields)) { return; } $sql = 'UPDATE packages SET ' . implode(', ', $fields) . " WHERE id = {$package_id}"; $row = package::info($pkgid, 'name'); include_once 'pear-rest.php'; $pear_rest = new pearweb_Channel_REST_Generator(PEAR_REST_PATH, $dbh); $pear_rest->saveAllPackagesREST(); $pear_rest->savePackageREST($row); $pear_rest->savePackagesCategoryREST(package::info($pkgid, 'category')); return $dbh->query($sql, $prep); }
/** * Update user and roles of a package * * @static * @param int $pkgid The package id to update * @param array $users Assoc array containing the list of users * in the form: '<user>' => array('role' => '<role>', 'active' => '<active>') * @param bool Whether to print the logging information to the screen * @return mixed PEAR_Error or true */ static function updateAll($pkgid, $users, $print = false, $releasing = false) { require_once 'Damblan/Log.php'; global $dbh, $auth_user; // Only admins and leads can do this. if (maintainer::mayUpdate($pkgid) == false) { return PEAR::raiseError('maintainer::updateAll: insufficient privileges'); } $logger = new Damblan_Log(); if ($print) { require_once 'Damblan/Log/Print.php'; $observer = new Damblan_Log_Print(); $logger->attach($observer); } include_once 'pear-database-package.php'; $pkg_name = package::info((int) $pkgid, "name"); // Needed for logging if (empty($pkg_name)) { PEAR::raiseError('maintainer::updateAll: no such package'); } $old = maintainer::get($pkgid); if (DB::isError($old)) { return $old; } $old_users = array_keys($old); $new_users = array_keys($users); $admin = $auth_user->isAdmin(); $qa = $auth_user->isQA(); if (!$admin && !$qa && !in_array($auth_user->handle, $new_users)) { return PEAR::raiseError("You can not delete your own maintainer role or you will not " . "be able to complete the update process. Set your name " . "in package.xml or let the new lead developer upload " . "the new release"); } if ($releasing && user::maintains($auth_user->handle, (int) $pkgid, 'lead') && $users[$auth_user->handle]['role'] != 'lead') { return PEAR::raiseError('You cannot demote your role from lead to ' . $users[$auth_user->handle]['role']); } foreach ($users as $user => $u) { $role = $u['role']; $active = $u['active']; if (!maintainer::isValidRole($role)) { return PEAR::raiseError("invalid role '{$role}' for user '{$user}'"); } // The user is not present -> add him if (!in_array($user, $old_users)) { $e = maintainer::add($pkgid, $user, $role, $active); if (PEAR::isError($e)) { return $e; } $logger->log("[Maintainer] NEW: " . $user . " (" . $role . ") to package " . $pkg_name . " by " . $auth_user->handle); continue; } // Users exists but the role or the "active" flag have changed -> update it if ($role != $old[$user]['role'] || $active != $old[$user]['active']) { $res = maintainer::update($pkgid, $user, $role, $active); if (DB::isError($res)) { return $res; } $logger->log("[Maintainer] UPDATE: " . $user . " (" . $role . ") to package " . $pkg_name . " by " . $auth_user->handle); } } // Drop users who are no longer maintainers foreach ($old_users as $old_user) { if (!in_array($old_user, $new_users)) { $res = maintainer::remove($pkgid, $old_user); if (DB::isError($res)) { return $res; } $logger->log("[Maintainer] REMOVED: " . $old_user . " (" . $role . ") to package " . $pkg_name . " by " . $auth_user->handle); } } return true; }
function savePackageMaintainerREST($package) { require_once 'System.php'; global $dbh; $pid = package::info($package, 'id'); $maintainers = $dbh->getAll('SELECT * FROM maintains WHERE package = ?', array($pid), DB_FETCHMODE_ASSOC); $extra = '/rest/'; if (count($maintainers)) { $pdir = $this->_restdir . DIRECTORY_SEPARATOR . 'p'; if (!is_dir($pdir)) { System::mkdir(array('-p', $pdir)); @chmod($pdir, 0777); } if (!is_dir($pdir . DIRECTORY_SEPARATOR . strtolower($package))) { System::mkdir(array('-p', $pdir . DIRECTORY_SEPARATOR . strtolower($package))); @chmod($pdir . DIRECTORY_SEPARATOR . strtolower($package), 0777); } $info = '<?xml version="1.0" encoding="UTF-8" ?> <m xmlns="http://pear.php.net/dtd/rest.packagemaintainers" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="http://pear.php.net/dtd/rest.packagemaintainers http://pear.php.net/dtd/rest.packagemaintainers.xsd"> <p>' . $package . '</p> <c>' . PEAR_CHANNELNAME . '</c> '; foreach ($maintainers as $maintainer) { $info .= ' <m><h>' . $maintainer['handle'] . '</h><a>' . $maintainer['active'] . '</a></m>'; } $info .= '</m>'; file_put_contents($pdir . DIRECTORY_SEPARATOR . strtolower($package) . DIRECTORY_SEPARATOR . 'maintainers.xml', $info); @chmod($pdir . DIRECTORY_SEPARATOR . strtolower($package) . DIRECTORY_SEPARATOR . 'maintainers.xml', 0666); } else { @unlink($pdir . DIRECTORY_SEPARATOR . strtolower($package) . DIRECTORY_SEPARATOR . 'maintainers.xml'); } }
// Switch error handling, to avoid further PEARWeb style error output PEAR::setErrorHandling(PEAR_ERROR_RETURN); // Data sanity check if (!isset($params['id'])) { echo Services_Trackback::getResponseError('No package with ID transmited. Trackback not possible.', 1); exit; } // Sanity check, see if package exists include_once 'pear-database-package.php'; $testid = package::info($id, 'id'); if (!$testid || PEAR::isError($testid)) { echo Services_Trackback::getResponseError('No package with ID ' . $id . ' found. Trackback not possible.', 1); exit; } // Now grab package information $pkgInfo = package::info($testid); if (!isset($pkgInfo) || PEAR::isError($pkgInfo)) { echo Services_Trackback::getResponseError('No package with ID ' . $id . ' found. Trackback not possible.', 1); exit; } if ($pkgInfo['blocktrackbacks']) { echo Services_Trackback::getResponseError('Package ' . $id . ' does not allow trackbacks.', 1); exit; } // Creating new trackback $trackback = new Damblan_Trackback(array('id' => $id, 'timestamp' => time())); $res = $trackback->receive(); if (PEAR::isError($res)) { echo $res->getMessage(); echo Services_Trackback::getResponseError('The data you submited was invalid, please recheck.', 1); exit;
/** * Remove release * * @param integer ID of the package * @param integer ID of the release * @return boolean */ static function remove($package, $release) { global $dbh, $auth_user; include_once 'pear-database-user.php'; if (!$auth_user->isAdmin() && !$auth_user->isQA() && !user::maintains($auth_user->handle, $package, 'lead')) { return PEAR::raiseError('release::remove: insufficient privileges'); } // get files that have to be removed $sql = 'SELECT fullpath FROM files WHERE package = ? AND `release` = ?'; $sth = $dbh->query($sql, array($package, $release)); // Should we error out if the removal fails ? $success = true; while ($row = $sth->fetchRow(DB_FETCHMODE_ASSOC)) { if (!@unlink($row['fullpath'])) { $success = false; } } $sql = 'DELETE FROM files WHERE package = ? AND `release` = ?'; $sth = $dbh->query($sql, array($package, $release)); $sql = 'SELECT version from releases WHERE package = ? and id = ?'; $version = $dbh->getOne($sql, array($package, $release)); $query = 'DELETE FROM releases WHERE package = ? AND id = ?'; $sth = $dbh->query($query, array($package, $release)); // remove statistics on this release $dbh->query('DELETE FROM package_stats WHERE pid = ? AND rid = ?', array($package, $release)); $dbh->query('DELETE FROM aggregated_package_stats WHERE package_id = ? AND release_id = ?', array($package, $release)); include_once 'pear-database-package.php'; $pname = package::info($package, 'name'); include_once 'pear-rest.php'; $pear_rest = new pearweb_Channel_REST_Generator(PEAR_REST_PATH, $dbh); $pear_rest->saveAllReleasesREST($pname); $pear_rest->deleteReleaseREST($pname, $version); $pear_rest->savePackagesCategoryREST(package::info($pname, 'category')); if (PEAR::isError($sth)) { return false; } return true; }
*/ if (strlen($_SERVER['REDIRECT_URL']) > 0 && $_SERVER['REDIRECT_URL'][1] == '~') { $user = substr($_SERVER['REDIRECT_URL'], 2); if (preg_match(PEAR_COMMON_USER_NAME_REGEX, $user) && user::exists($user)) { localRedirect("/user/" . urlencode($user)); } } $pkg = strtr($_SERVER['REDIRECT_URL'], '-', '_'); $pinfo_url = '/package/'; // Check strictly $name = package::info(basename($pkg), 'name'); if (!DB::isError($name) && !empty($name)) { if (!empty($name)) { localRedirect($pinfo_url . $name); } else { $name = package::info(basename($pkg), 'name', true); if (!empty($name)) { header('HTTP/1.0 301 Moved Permanently'); header('Location: http://pear.php.net/package/' . $name); header('Connection: close'); exit; } } } // Check less strictly if nothing has been found previously $sql = "SELECT p.id, p.name, p.summary\n FROM packages p\n WHERE package_type = 'pecl' AND approved = 1 AND name LIKE ?\n ORDER BY p.name"; $term = "%" . basename($pkg) . "%"; $packages = $dbh->getAll($sql, array($term), DB_FETCHMODE_ASSOC); if (count($packages) > 3) { $packages = array($packages[0], $packages[1], $packages[2]); $show_search_link = true;
/** * Retrieve a package file based on a previous release * * @param string $pfcontents contents of the previous release's package.xml * @return PEAR_PackageFile_v2 */ function getPackageXmlV2($pfcontents) { require_once 'PEAR/PackageFile.php'; require_once 'PEAR/Config.php'; $config = PEAR_Config::singleton(); $pkg = new PEAR_PackageFile($config, false, PEAR_TMPDIR); PEAR::pushErrorHandling(PEAR_ERROR_RETURN); $pf = $pkg->fromXmlString($pfcontents, PEAR_VALIDATE_DOWNLOADING, 'package.xml'); PEAR::popErrorHandling(); if (PEAR::isError($pf)) { return $pf; } if ($pf->getPackagexmlVersion() != '1.0') { $pf2 = new PEAR_PackageFile_v2_rw(); $pf2->fromArray($pf->getArray()); } else { require_once 'PEAR/PackageFile/Generator/v1.php'; $gen = new PEAR_PackageFile_Generator_v1($pf); $pf2 = $gen->toV2('PEAR_PackageFile_v2_rw'); } require_once 'pear-database-package.php'; $info = package::info($pf2->getPackage()); $pf2->setPackage($this->_package); $pf2->setChannel('pear.php.net'); $pf2->setSummary($info['summary']); $pf2->setDescription($info['description']); $m = $pf2->getMaintainers(); foreach ($m as $maintainer) { $pf2->deleteMaintainer($maintainer['handle']); } $maintainers = package::info($this->_package, 'authors'); foreach ($maintainers as $maintainer) { $pf2->addMaintainer($maintainer['role'], $maintainer['handle'], $maintainer['name'], $maintainer['email'], $maintainer['active'] ? 'yes' : 'no'); } return $pf2; }
static function maintains($user, $pkgid, $role = 'any') { global $dbh; include_once 'pear-database-package.php'; $package_id = package::info($pkgid, 'id'); if ($role == 'any') { return $dbh->getOne('SELECT role FROM maintains WHERE handle = ? ' . 'AND package = ?', array($user, $package_id)); } if (is_array($role)) { $res = $dbh->getOne('SELECT role FROM maintains WHERE handle = ? AND package = ? ' . 'AND role IN ("' . implode('", "', $role) . '")', array($user, $package_id)); return $res; } return $dbh->getOne('SELECT role FROM maintains WHERE handle = ? AND package = ? ' . 'AND role = ?', array($user, $package_id, $role)); }
| http://www.php.net/license/2_02.txt. | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: | +----------------------------------------------------------------------+ $Id$ */ // expected url vars: pacid package if (isset($_GET['package']) && empty($_GET['pacid'])) { $pacid = $_GET['package']; } else { $pacid = isset($_GET['pacid']) ? (int) $_GET['pacid'] : null; } $pkg = package::info($pacid); if (empty($pkg['name'])) { response_header("Error"); PEAR::raiseError('Invalid package'); response_footer(); exit; } $name = $pkg['name']; response_header("{$name} Changelog"); print '<p>' . make_link("/" . $name, 'Return') . '</p>'; $bb = new Borderbox("Changelog for " . $name, "90%", "", 2, true); if (count($pkg['releases']) == 0) { $bb->fullRow('There are no releases for ' . $name . ' yet.'); } else { $bb->headRow("Release", "What has changed?"); foreach ($pkg['releases'] as $version => $release) {
} echo ' <option value="' . $row['id'] . '"' . $selected . '>' . $row['version'] . "</option>\n"; } echo " </select>\n"; } else { echo '<input type="hidden" name="rid" value="" />' . "\n"; } echo " </td>\n"; echo ' <td><input type="submit" name="submit" value="Go" /></td>' . "\n"; echo "</tr>\n"; echo "</table>\n"; echo "</form>\n"; if (isset($_GET['pid']) && (int) $_GET['pid']) { include_once 'pear-database-statistics.php'; include_once 'pear-database-package.php'; $info = package::info($_GET['pid'], null, false); if (isset($info['releases']) && sizeof($info['releases']) > 0) { echo '<h2>» Statistics for Package "<a href="/package/' . $info['name'] . '">' . $info['name'] . "</a>"</h2>\n"; $td = "Number of releases: <strong>" . count($info['releases']) . "</strong><br />\n"; $td .= 'Total downloads: <strong>' . number_format(statistics::package($_GET['pid']), 0, '.', ',') . "</strong><br />\n"; } else { $td = 'No package or release found.'; } ?> <table cellspacing="0" cellpadding="3" style="border: 0px; width: 90%;"> <caption style="background-color: #CCCCCC;">General Statistics</caption> <tr> <td style="text-align: left;"><?php echo $td; ?> </td>
$file_rm = 0; $query = "SELECT p.name, r.version FROM packages p, releases r\n WHERE p.id = r.package AND r.package = '" . $_GET['id'] . "'"; $row = $dbh->getAll($query); foreach ($row as $value) { $file = sprintf("%s/%s-%s.tgz", PEAR_TARBALL_DIR, $value[0], $value[1]); if (@unlink($file)) { echo "Deleting release archive \"" . $file . "\"\n"; $file_rm++; } else { echo "<font color=\"#ff0000\">Unable to delete file " . $file . "</font>\n"; } } echo "\n" . $file_rm . " file(s) deleted\n\n"; $catid = package::info($_GET['id'], 'categoryid'); $catname = package::info($_GET['id'], 'category'); $packagename = package::info($_GET['id'], 'name'); $dbh->query("UPDATE categories SET npackages = npackages-1 WHERE id={$catid}"); foreach ($tables as $table => $field) { $query = sprintf("DELETE FROM %s WHERE %s = '%s'", $table, $field, $_GET['id']); echo "Removing package information from table \"" . $table . "\": "; $dbh->query($query); echo "<b>" . $dbh->affectedRows() . "</b> rows affected.\n"; } $pear_rest->deletePackageREST($packagename); $pear_rest->savePackagesCategoryREST($catname); echo "</pre>\nPackage " . $_GET['id'] . " has been deleted.\n"; } else { if ($_POST['confirm'] == "no") { echo "The package has not been deleted.\n<br /><br />\n"; echo "Go back to the " . make_link("/package-info.php?pacid=" . $_GET['id'], "package details") . "."; }
WHERE p.id = r.package AND r.package = ?'; $row = $dbh->getAll($query, array($id)); foreach ($row as $value) { $file = sprintf("%s/%s-%s.tgz", PEAR_TARBALL_DIR, $value[0], $value[1]); if (@unlink($file)) { echo "Deleting release archive \"" . $file . "\"\n"; $file_rm++; } else { echo "<font color=\"#ff0000\">Unable to delete file " . $file . "</font>\n"; } } echo "\n" . $file_rm . " file(s) deleted\n\n"; $catid = package::info($id, 'categoryid'); $packagename = package::info($id, 'name'); $dbh->query("UPDATE categories SET npackages = npackages - 1 WHERE id = {$catid}"); foreach ($tables as $table => $field) { $query = sprintf("DELETE FROM %s WHERE %s = '%s'", $table, $field, $id); echo "Removing package information from table \"" . $table . "\": "; $dbh->query($query); echo "<b>" . $dbh->affectedRows() . "</b> rows affected.\n"; } include_once 'pear-rest.php'; $pear_rest = new pearweb_Channel_REST_Generator(PEAR_REST_PATH, $dbh); $pear_rest->deletePackageREST($packagename); echo "</pre>\nPackage " . $id . " has been deleted.\n"; } else { $pkg = package::info($id); print_package_navigation($id, $pkg['name'], '/package-delete.php?id=' . $id); echo "The package has not been deleted.\n<br /><br />\n"; } response_footer();
$pear_rest->saveAllMaintainersREST(); echo "done\n"; echo "Generating Package REST...\n"; $pear_rest->saveAllPackagesREST(); require_once 'Archive/Tar.php'; require_once 'PEAR/PackageFile.php'; $config =& PEAR_Config::singleton(); $pkg = new PEAR_PackageFile($config); include_once 'pear-database-package.php'; foreach (package::listAllNames() as $package) { echo " {$package}\n"; $pear_rest->savePackageREST($package); echo " Maintainers..."; $pear_rest->savePackageMaintainerREST($package); echo "...done\n"; $releases = package::info($package, 'releases'); if ($releases) { echo " Processing All Releases..."; $pear_rest->saveAllReleasesREST($package); echo "done\n"; foreach ($releases as $version => $blah) { $sql = 'SELECT fullpath FROM files WHERE `release` = ?'; $fileinfo = $dbh->getOne($sql, array($blah['id'])); $tar =& new Archive_Tar($fileinfo); if ($pxml = $tar->extractInString('package2.xml')) { } elseif ($pxml = $tar->extractInString('package.xml')) { } PEAR::pushErrorHandling(PEAR_ERROR_RETURN); $pf = $pkg->fromAnyFile($fileinfo, PEAR_VALIDATE_NORMAL); PEAR::popErrorHandling(); if (!PEAR::isError($pf)) {
} elseif (!empty($_GET['reject'])) { $query = "DELETE FROM packages WHERE approved = 0 AND id = " . (int) $_GET['reject']; $id = $_GET['reject']; $action = "rejected"; } $res = $dbh->query($query); if (!PEAR::isError($res) && $dbh->affectedRows() > 0) { $sql = 'SELECT * FROM packages WHERE id = ?'; $row = $dbh->getRow($sql, array($id), DB_FETCHMODE_ASSOC); if ($action == 'approved') { include_once 'pear-rest.php'; $pear_rest = new pearweb_Channel_REST_Generator(PEAR_REST_PATH, $dbh); $pear_rest->savePackageREST($row['name']); $pear_rest->saveAllPackagesREST(); include_once 'pear-database-package.php'; $pear_rest->savePackagesCategoryREST(package::info($row['name'], 'category')); } // {{{ Logging mechanism require_once "Damblan/Log.php"; require_once "Damblan/Log/Mail.php"; $logger = new Damblan_Log(); $observer = new Damblan_Log_Mail(); $observer->setRecipients(PEAR_GROUP_EMAIL); $observer->setHeader("In-Reply-To", "<approve-request-" . $row['id'] . "@" . PEAR_CHANNELNAME . ">"); $observer->setHeader("Subject", "[" . SITE_BIG . " Group] Package " . $row['name'] . " has been " . $action); $logger->attach($observer); $logger->log($auth_user->handle . " " . $action . " " . $row['name']); // }}} if (!DEVBOX) { $mailtext = 'Your package "' . $row['name'] . '" has been ' . $action . ' by the PEAR Group.'; $mailtext = wordwrap($mailtext, 72);
function maintains($user, $pkgid, $role = 'any') { global $dbh; $package_id = package::info($pkgid, 'id'); if ($role == 'any') { return $dbh->getOne('SELECT role FROM maintains WHERE handle = ? ' . 'AND package = ?', array($user, $package_id)); } if (is_array($role)) { return $dbh->getOne('SELECT role FROM maintains WHERE handle = ? AND package = ? ' . 'AND role IN ("?")', array($user, $package_id, implode('","', $role))); } return $dbh->getOne('SELECT role FROM maintains WHERE handle = ? AND package = ? ' . 'AND role = ?', array($user, $package_id, $role)); }
+----------------------------------------------------------------------+ $Id$ */ $package = filter_input(INPUT_GET, 'package', FILTER_SANITIZE_STRING); $version = filter_input(INPUT_GET, 'version', FILTER_SANITIZE_STRING); $relid = filter_input(INPUT_GET, FILTER_VALIDATE_INT); if (!$package) { $_SERVER['REDIRECT_URL'] = $_SERVER['REQUEST_URI']; include 'error/404.php'; exit; } if (is_numeric($package)) { $package = (int) $package; } // Package data $pkg = package::info($package); if (!empty($version)) { foreach ($pkg['releases'] as $ver => $release) { if ($ver == $version) { $relid = $release['id']; break; } } } if (empty($package) || !isset($pkg['name'])) { $_SERVER['REDIRECT_URL'] = $_SERVER['REQUEST_URI']; include 'error/404.php'; exit; } $dbh->setFetchmode(DB_FETCHMODE_ASSOC); $name = $pkg['name'];
function removePackageTag($tag, $package) { if (!is_int($package)) { $package = package::info($package, 'id'); } if (!is_numeric($tag)) { $tagid = $this->tagExists($tag); } else { $tagid = $tag; } if (!$package || !$tagid) { return; } if ($this->dbh->getOne('SELECT adminkey FROM tagnames WHERE tagid=?', array($tagid))) { if (!auth_check('pear.group') && !auth_check('pear.admin')) { throw new Exception('Only PEAR administrators can set or remove this tag'); } } $this->dbh->query('DELETE FROM tag_package_link WHERE package_id=? AND tagid=?', array($package, $tagid)); }
case 'release_remove': if (!isset($_GET['release'])) { report_error('Missing package ID!'); break; } include_once 'pear-database-release.php'; if (release::remove($_GET['id'], $_GET['release'])) { echo "<b>Release successfully deleted.</b><br /><br />\n"; } else { report_error('An error occured while deleting the release!'); } break; } } } $row = package::info((int) $_GET['id']); if (empty($row['name'])) { report_error('Illegal package id'); response_footer(); exit; } print_package_navigation($row['packageid'], $row['name'], '/package-edit.php?id=' . $row['packageid']); $sth = $dbh->query('SELECT id, name FROM categories ORDER BY name'); while ($cat_row = $sth->fetchRow(DB_FETCHMODE_ASSOC)) { $rows[$cat_row['id']] = $cat_row['name']; } $form = new HTML_QuickForm2('package-edit', 'post', array('action' => '/package-edit.php?id=' . $row['packageid'])); $form->removeAttribute('name'); $renderer = HTML_QuickForm2_Renderer::factory('default'); // Set defaults for the form elements $form->addDataSource(new HTML_QuickForm2_DataSource_Array(array('name' => htmlspecialchars($row['name']), 'license' => htmlspecialchars($row['license']), 'summary' => htmlspecialchars($row['summary']), 'description' => htmlspecialchars($row['description']), 'category' => (int) $row['categoryid'], 'homepage' => htmlspecialchars($row['homepage']), 'doc_link' => htmlspecialchars($row['doc_link']), 'bug_link' => htmlspecialchars($row['bug_link']), 'cvs_link' => htmlspecialchars($row['cvs_link']), 'unmaintained' => $row['unmaintained'] ? true : false, 'newpk_id' => (int) $row['newpk_id'], 'new_channel' => htmlspecialchars($row['new_channel']), 'new_package' => htmlspecialchars($row['new_package']))));
| license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: Pierre-Alain Joye <*****@*****.**> | +----------------------------------------------------------------------+ $Id$ */ redirect_to_https(); @session_start(); $csrf_token_name = 'pear_csrf_token_' . basename(__FILE__, '.php'); auth_require(); $pid = isset($_GET['pid']) ? (int) $_GET['pid'] : false; if ($pid && $pid < 1) { report_error('Invalid package'); } include_once 'pear-database-package.php'; $package_name = package::info($pid, 'name'); response_header('Administration - ' . htmlspecialchars($package_name) . ' - Package Maintainers'); include_once 'pear-database-maintainer.php'; $maintainers = maintainer::get($pid); // Maintainer being lead can go further, if not QA and up if (!(isset($maintainers[$auth_user->handle]) && $maintainers[$auth_user->handle]['role'] == 'lead')) { auth_require('pear.qa'); } if (isset($_POST) && isset($_POST['role'])) { if (!validate_csrf_token($csrf_token_name)) { report_error('Invalid token.'); response_footer(); exit; } // Got a new maintainer? if (isset($_POST['handle']['new']) && !empty($_POST['handle']['new'])) {
</div> <br style="clear: both;" /> <?php echo '<strong>Release date:</strong> ' . format_date(strtotime($info['releasedate'])) . '<br />'; echo '<strong>Release state:</strong> '; echo '<span class="' . htmlspecialchars($info['state']) . '">' . htmlspecialchars($info['state']) . '</span><br /><br />'; echo '<strong>Changelog:</strong><br /><br />' . nl2br(make_ticket_links(htmlspecialchars($info['releasenotes']), '/bugs/')) . '<br /><br />'; if (!empty($info['deps']) && count($info['deps']) > 0) { echo '<strong>Dependencies:</strong>'; $rel_trans = array('lt' => 'older than %s', 'le' => 'version %s or older', 'eq' => 'version %s', 'ne' => 'any version but %s', 'gt' => 'newer than %s', 'ge' => '%s or newer'); $dep_type_desc = array('pkg' => 'PEAR Package', 'ext' => 'PHP Extension', 'php' => 'PHP Version', 'prog' => 'Program', 'ldlib' => 'Development Library', 'rtlib' => 'Runtime Library', 'os' => 'Operating System', 'websrv' => 'Web Server', 'sapi' => 'SAPI Backend'); $dep_text = ''; foreach ($info['deps'] as $dependency) { // Print link if it's a PEAR package and it's in the db if ($dependency['type'] == 'pkg') { $dep_pkg = package::info($dependency['name']); if (!empty($dep_pkg['name']) && ($dep_pkg['package_type'] = 'pear')) { $dependency['name'] = package::makeLink($dependency['name']); } } if (isset($rel_trans[$dependency['relation']])) { $rel = sprintf($rel_trans[$dependency['relation']], $dependency['version']); $dep_text .= sprintf("<li>%s: %s %s", $dep_type_desc[$dependency['type']], $dependency['name'], $rel); } else { $dep_text .= sprintf("<li>%s: %s", $dep_type_desc[$dependency['type']], $dependency['name']); } if ($dependency['optional'] == 1) { $dep_text .= ' (optional)'; } if ($dependency['relation'] == 'not') { $dep_text .= ' (conflicts with some versions)';
/** * Announce a new patch * * @param int ID of the patch * @param string Filename of the patch file * @param int ID of the package * @param string Release version * @param string email address * @param string Title of the patch * @param string Description of the patch * @return boolean */ function announce($id, $filename, $package, $release, $email, $handle, $title, $description) { $name = package::info($package, "name"); $receivers = array("martin@localhost"); // Find maintainers of the package $maintainers = package::info($package, "authors"); foreach ($maintainers as $user) { // $receivers[] = $user['email']; } $text = "New patch: http://pear.php.local/patches/details/" . $id . "\n"; return mail(implode(",", $receivers), "New patch for " . $name, $text); }
public function savePackageMaintainerREST($package) { include_once 'pear-database-package.php'; $pid = package::info($package, 'id'); $maintainers = $this->db->getAll('SELECT handle, active, role FROM maintains WHERE package = ?', array($pid), DB_FETCHMODE_ASSOC); $dir = $this->getPackageDirectory() . strtolower($package) . DIRECTORY_SEPARATOR; if (count($maintainers)) { $info2 = '<?xml version="1.0" encoding="UTF-8" ?> <m xmlns="http://pear.php.net/dtd/rest.packagemaintainers2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="http://pear.php.net/dtd/rest.packagemaintainers2 http://pear.php.net/dtd/rest.packagemaintainers2.xsd"> '; $info = '<?xml version="1.0" encoding="UTF-8" ?> <m xmlns="http://pear.php.net/dtd/rest.packagemaintainers" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="http://pear.php.net/dtd/rest.packagemaintainers http://pear.php.net/dtd/rest.packagemaintainers.xsd"> '; $info .= ' <p>' . $package . '</p> <c>' . $this->channel . '</c> '; $info2 .= ' <p>' . $package . '</p> <c>' . $this->channel . '</c> '; foreach ($maintainers as $maintainer) { $info .= ' <m><h>' . $maintainer['handle'] . '</h><a>' . $maintainer['active'] . '</a></m>' . "\n"; $info2 .= ' <m><h>' . $maintainer['handle'] . '</h><a>' . $maintainer['active'] . '</a><r>' . $maintainer['role'] . '</r></m>' . "\n"; } $info .= '</m>'; $info2 .= '</m>'; if (!is_dir($dir)) { if (!mkdir($dir, 0777, true)) { return PEAR::raiseError('Creating directory ' . $dir . ' failed - Check the permissions'); } @chmod($dir, 0777); } if (!file_put_contents($dir . 'maintainers.xml', $info)) { return PEAR::raiseError('Writing file ' . $dir . 'maintainers.xml failed - Check the permissions'); } @chmod($dir . 'maintainers.xml', 0666); if (!file_put_contents($dir . 'maintainers2.xml', $info2)) { return PEAR::raiseError('Writing file ' . $dir . 'maintainers2.xml failed - Check the permissions'); } @chmod($dir . 'maintainers2.xml', 0666); } else { @unlink($dir . 'maintainers.xml'); @unlink($dir . 'maintainers2.xml'); } }
break; } $users = array(); foreach ($info->getMaintainers() as $user) { $users[strtolower($user['handle'])] = array('role' => $user['role'], 'active' => !isset($user['active']) || $user['active'] == 'yes'); } $e = maintainer::updateAll($pacid, $users); if (PEAR::isError($e)) { $errors[] = $e->getMessage(); break; } $pear_rest->savePackageMaintainerREST($info->getPackage()); $file = release::upload($info->getPackage(), $info->getVersion(), $info->getState(), $info->getNotes(), $distfile, md5_file($distfile)); } } else { $pacid = package::info($info['package'], 'id'); if (PEAR::isError($pacid)) { $errors[] = $pacid->getMessage(); break; } if (!user::isAdmin($auth_user->handle) && !user::maintains($auth_user->handle, $pacid, 'lead')) { $errors[] = 'You don\'t have permissions to upload this release.'; break; } $e = package::updateInfo($pacid, array('summary' => $info['summary'], 'description' => $info['description'], 'license' => $info['release_license'])); if (PEAR::isError($e)) { $errors[] = $e->getMessage(); break; } $users = array(); foreach ($info['maintainers'] as $user) {