Example #1
0
 /**
  * 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);
 }
Example #2
0
 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;
         }
     }
 }
Example #3
0
 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;
     }
 }
Example #4
0
     $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'])) {
Example #5
0
}
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');
Example #6
0
 /**
  * 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;
 }
Example #8
0
    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');
        }
    }
Example #9
0
// 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;
Example #10
0
 /**
  * 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;
 }
Example #11
0
 */
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;
Example #12
0
 /**
  * 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;
 }
Example #13
0
 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));
 }
Example #14
0
   | 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) {
Example #15
0
        }
        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>&raquo; Statistics for Package &quot;<a href="/package/' . $info['name'] . '">' . $info['name'] . "</a>&quot;</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>
Example #16
0
     $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") . ".";
     }
Example #17
0
                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();
Example #18
0
$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)) {
Example #19
0
 } 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);
Example #20
0
 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));
 }
Example #21
0
   +----------------------------------------------------------------------+
   $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'];
Example #22
0
 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));
 }
Example #23
0
            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']))));
Example #24
0
   | 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'])) {
Example #25
0
     </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)';
Example #26
0
 /**
  * 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);
 }
Example #27
0
    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');
        }
    }
Example #28
0
             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) {