Example #1
0
function show_newest_releases()
{
    global $Language;
    $return = "";
    $hp = Codendi_HTMLPurifier::instance();
    // Fetch releases that are no more than 3 months old
    $start_time = strval(time() - 3 * 30 * 24 * 3600);
    $query = new_utils_get_new_releases_short($start_time);
    $res_newrel = db_query($query);
    // print each one but only show one release per project
    $count = 0;
    $DONE = array();
    $frspf = new FRSPackageFactory();
    $frsrf = new FRSReleaseFactory();
    while (($row_newrel = db_fetch_array($res_newrel)) && $count < 10) {
        if (!isset($DONE[$row_newrel['group_id']])) {
            //if ((!permission_exist("PACKAGE_READ",$row_newrel['package_id'] ))&&
            //    (!permission_exist("RELEASE_READ",$row_newrel['release_id'] ))) {
            if ($frspf->userCanRead($row_newrel['group_id'], $row_newrel['package_id'], 100) && $frsrf->userCanRead($row_newrel['group_id'], $row_newrel['package_id'], $row_newrel['release_id'], 100)) {
                $return .= '(' . $hp->purify($row_newrel['release_version'], CODENDI_PURIFIER_CONVERT_HTML) . ')&nbsp;' . '<A href="/projects/' . $row_newrel['unix_group_name'] . '/">' . $hp->purify(util_unconvert_htmlspecialchars($row_newrel['group_name']), CODENDI_PURIFIER_CONVERT_HTML) . "</A><BR>\n";
                $count++;
                $DONE[$row_newrel['group_id']] = true;
            }
        }
    }
    $return .= '<center><A href="/new/?func=releases">[ ' . $Language->getText('include_features_boxes', 'more') . ' ]</A></center>';
    return $return;
}
Example #2
0
 private function importPackage(Project $project, SimpleXMLElement $xml_pkg, $extraction_path)
 {
     $attrs = $xml_pkg->attributes();
     $rank = isset($attrs['rank']) ? $attrs['rank'] : 'end';
     $hidden = isset($attrs['hidden']) ? $attrs['hidden'] : 'false';
     $hidden = $hidden == 'true' || $hidden == '1';
     $package = new FRSPackage();
     $package->setGroupId($project->getId());
     $package->setName((string) $attrs['name']);
     $package->setStatusID($hidden ? FRSPackage::STATUS_HIDDEN : FRSPackage::STATUS_ACTIVE);
     $package->setRank($rank);
     $package->setApproveLicense(true);
     $package->setPackageID($this->package_factory->create($package->toArray()));
     $read_perms = array();
     foreach ($xml_pkg->{'read-access'} as $perm) {
         $ugroup_name = (string) $perm->ugroup;
         $ugroup = $this->getUGroupManager()->getUGroupByName($project, $ugroup_name);
         $read_perms[] = $ugroup->getId();
     }
     $this->getPermissionsManager()->savePermissions($project, $package->getPackageID(), FRSPackage::PERM_READ, $read_perms);
     foreach ($xml_pkg->children() as $xml_rel) {
         if ($xml_rel->getName() != "release") {
             continue;
         }
         $this->importRelease($project, $package, $xml_rel, $extraction_path);
     }
 }
 function testGetFRSPackageFromDb()
 {
     $packageArray1 = array('package_id' => 1, 'group_id' => 1, 'name' => 'pkg1', 'status_id' => 2, 'rank' => null, 'approve_license' => null, 'data_array' => null, 'package_releases' => null, 'error_state' => null, 'error_message' => null);
     $package1 = FRSPackageFactory::getFRSPackageFromArray($packageArray1);
     $dar1 = new MockDataAccessResult($this);
     $dar1->setReturnValue('isError', false);
     $dar1->setReturnValue('current', $packageArray1);
     $dar1->setReturnValueAt(0, 'valid', true);
     $dar1->setReturnValueAt(1, 'valid', false);
     $dar1->setReturnValue('rowCount', 1);
     $packageArray2 = array('package_id' => 2, 'group_id' => 2, 'name' => 'pkg2', 'status_id' => 1, 'rank' => null, 'approve_license' => null, 'data_array' => null, 'package_releases' => null, 'error_state' => null, 'error_message' => null);
     $package2 = FRSPackageFactory::getFRSPackageFromArray($packageArray2);
     $dar2 = new MockDataAccessResult($this);
     $dar2->setReturnValue('isError', false);
     $dar2->setReturnValue('current', $packageArray2);
     $dar2->setReturnValueAt(0, 'valid', true);
     $dar2->setReturnValueAt(1, 'valid', false);
     $dar2->setReturnValue('rowCount', 1);
     $dar3 = new MockDataAccessResult($this);
     $dar3->setReturnValue('isError', false);
     $dar3->setReturnValue('current', array());
     $dar3->setReturnValueAt(0, 'valid', true);
     $dar3->setReturnValueAt(1, 'valid', false);
     $dar3->setReturnValue('rowCount', 0);
     $dao = new FRSPackageDaoTestVersion();
     $dao->da = TestHelper::getPartialMock('DataAccess', array('DataAccess'));
     $dao->setReturnValue('retrieve', $dar1, array('SELECT p.*  FROM frs_package AS p  WHERE  p.package_id = 1  ORDER BY rank DESC LIMIT 1'));
     $dao->setReturnValue('retrieve', $dar2, array('SELECT p.*  FROM frs_package AS p  WHERE  p.package_id = 2  AND p.status_id != 0  ORDER BY rank DESC LIMIT 1'));
     $dao->setReturnValue('retrieve', $dar3);
     $PackageFactory = new FRSPackageFactoryTestVersion();
     $PackageFactory->setReturnValue('_getFRSPackageDao', $dao);
     $this->assertEqual($PackageFactory->getFRSPackageFromDb(1, null, 0x1), $package1);
     $this->assertEqual($PackageFactory->getFRSPackageFromDb(2), $package2);
 }
 function isValidForUpdate($release, $group_id)
 {
     $frspf = new FRSPackageFactory();
     $frsrf = new FRSReleaseFactory();
     $frsff = new FRSFileFactory();
     if (isset($release['package_id']) && $release['package_id'] != 'null') {
         if (!isset($release['name']) || !$release['name'] || $release['name'] == '') {
             $this->addError($GLOBALS['Language']->getText('file_admin_editreleases', 'rel_name_empty'));
         } else {
             //see if this package belongs to this project
             $res1 =& $frsrf->getFRSReleaseFromDb($release['release_id'], $group_id);
             if (!$res1 || count($res1) < 1) {
                 $this->addError($GLOBALS['Language']->getText('file_admin_editreleases', 'p_rel_not_yours'));
             } else {
                 if ($release['package_id'] != $res1->getPackageID()) {
                     //changing to a different package for this release
                     $res2 = $frspf->getFRSPackageFromDb($release['package_id'], $group_id);
                     if (!$res2 || count($res2) < 1) {
                         //new package_id isn't theirs
                         $this->addError($GLOBALS['Language']->getText('file_admin_editreleases', 'p_not_yours'));
                     }
                 }
                 //check if release name exists already
                 if ($res1->getPackageID() != $release['package_id'] || $res1->getPackageID() == $release['package_id'] && $res1->getName() != $release['name']) {
                     $release_exists = $frsrf->getReleaseIdByName($release['name'], $release['package_id']);
                 }
                 if (!isset($release_exists) || count($release_exists) < 1) {
                     //now check the date
                     if (!ereg("[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}", $release['date'])) {
                         $this->addError($GLOBALS['Language']->getText('file_admin_editreleases', 'data_not_parsed'));
                     }
                 } else {
                     $this->addError($GLOBALS['Language']->getText('file_admin_editreleases', 'rel_name_exists'));
                 }
             }
         }
     } else {
         $this->addError($GLOBALS['Language']->getText('file_admin_editreleases', 'create_p_before_rel_status'));
     }
     return count($this->_errors) ? false : true;
 }
Example #5
0
 public function setUp()
 {
     $package_factory = new FRSPackageFactoryMock();
     $release_factory = new FRSReleaseFactory();
     $file_factory = new FRSXMLImporterTest_FRSFileFactory();
     $this->package_dao = mock('FRSPackageDao');
     $package_factory->dao = $this->package_dao;
     FRSPackageFactory::setInstance($package_factory);
     $this->permissions_manager = mock('PermissionsManager');
     PermissionsManager::setInstance($this->permissions_manager);
     $this->release_dao = mock('FRSReleaseDao');
     $release_factory->dao = $this->release_dao;
     $release_factory->package_factory = $package_factory;
     $release_factory->file_factory = $file_factory;
     FRSReleaseFactory::setInstance($release_factory);
     $this->file_dao = mock('FRSFileDao');
     $file_factory->dao = $this->file_dao;
     $file_factory->release_factory = $release_factory;
     $this->processor_dao = mock('FRSProcessorDao');
     $this->filetype_dao = mock('FRSFileTypeDao');
     $this->user_finder = mock('User\\XML\\Import\\IFindUserFromXMLReference');
     $this->user_manager = mock('UserManager');
     UserManager::setInstance($this->user_manager);
     $this->ugroup_dao = mock("UGroupDao");
     stub($this->ugroup_dao)->searchByGroupIdAndName()->returns(new DataAccessResultEmpty());
     $this->frs_importer = new FRSXMLImporter(mock('Logger'), new XML_RNGValidator(), $package_factory, $release_factory, $file_factory, $this->user_finder, new UGroupManager($this->ugroup_dao), $this->processor_dao, $this->filetype_dao);
     EventManager::setInstance(mock('EventManager'));
     $GLOBALS['Language'] = mock('BaseLanguage');
     if (isset($GLOBALS['ftp_incoming_dir'])) {
         $this->old_ftp_incoming_dir = $GLOBALS['ftp_incoming_dir'];
     }
     if (isset($GLOBALS['old_ftp_frs_dir_prefix'])) {
         $this->old_ftp_frs_dir_prefix = $GLOBALS['ftp_frs_dir_prefix'];
     }
     $GLOBALS['ftp_incoming_dir'] = parent::getTmpDir();
     $GLOBALS['ftp_frs_dir_prefix'] = parent::getTmpDir();
 }
Example #6
0
//
require_once 'pre.php';
require_once 'common/frs/FRSFileFactory.class.php';
require_once 'common/frs/FRSPackageFactory.class.php';
$vGroupId = new Valid_GroupId();
$vGroupId->required();
$vFileId = new Valid_UInt('file_id');
$vFileId->required();
if ($request->valid($vGroupId) && $request->valid($vFileId)) {
    $group_id = $request->get('group_id');
    $file_id = $request->get('file_id');
} else {
    exit_missing_param();
}
$frsff = new FRSFileFactory();
$frspf = new FRSPackageFactory();
// Must have a group_id and file_id otherwise
// we cannot do much
if (!$file_id || !$group_id) {
    exit_missing_param();
}
if (!$GLOBALS['sys_frs_license_mandatory']) {
    // Display license popup?
    // This is useful when using a 'file #123' reference, that points to this script
    $res =& $frspf->getFRSPackageByFileIdFromDb($file_id);
    //$sql="SELECT approve_license FROM frs_package,frs_release,frs_file WHERE frs_file.file_id=$file_id and frs_file.release_id=frs_release.release_id and  frs_release.package_id=frs_package.package_id";
    //res = db_query( $sql);
    if (count($res) > 0) {
        if ($res->getApproveLicense() == 0) {
            // Directly display file
            $location = "Location: /file/download.php/{$group_id}/{$file_id}";
Example #7
0
 /**
  * Returns the HTML content for tooltip when hover a reference with the nature release
  * @returns string HTML content for release tooltip
  */
 function getReferenceTooltip()
 {
     $tooltip = '';
     $package_id = $this->getPackageID();
     $pf = new FRSPackageFactory();
     $package = $pf->getFRSPackageFromDb($package_id);
     $tooltip .= '<table>';
     $tooltip .= ' <tr>';
     $tooltip .= '  <td><strong>' . $GLOBALS['Language']->getText('file_admin_editreleases', 'release_name') . ':</strong></td>';
     $tooltip .= '  <td>' . $this->getName() . '</td>';
     $tooltip .= ' </tr>';
     $tooltip .= ' <tr>';
     $tooltip .= '  <td><strong>' . $GLOBALS['Language']->getText('file_admin_editpackages', 'p_name') . ':</strong></td>';
     $tooltip .= '  <td>' . $package->getName() . '</td>';
     $tooltip .= ' </tr>';
     $tooltip .= ' <tr>';
     $tooltip .= '  <td><strong>' . $GLOBALS['Language']->getText('file_showfiles', 'date') . ':</strong></td>';
     $tooltip .= '  <td>' . format_date($GLOBALS['Language']->getText('system', 'datefmt_short'), $this->getReleaseDate()) . '</td>';
     $tooltip .= ' </tr>';
     $tooltip .= '</table>';
     return $tooltip;
 }
Example #8
0
define("FRS_EXPANDED_ICON", util_get_image_theme("ic/toggle_minus.png"));
define("FRS_COLLAPSED_ICON", util_get_image_theme("ic/toggle_plus.png"));
$authorized_user = false;
$hp = Codendi_HTMLPurifier::instance();
$request =& HTTPRequest::instance();
$vGroupId = new Valid_GroupId();
$vGroupId->required();
if ($request->valid($vGroupId)) {
    $group_id = $request->get('group_id');
} else {
    exit_no_group();
}
if (user_ismember($group_id, 'R2') || user_ismember($group_id, 'A')) {
    $authorized_user = true;
}
$frspf = new FRSPackageFactory();
$frsrf = new FRSReleaseFactory();
$frsff = new FRSFileFactory();
$packages = array();
$num_packages = 0;
// Retain only packages the user is authorized to access, or packages containing releases the user is authorized to access...
$res = $frspf->getFRSPackagesFromDb($group_id);
$user = UserManager::instance()->getCurrentUser();
foreach ($res as $package) {
    if ($frspf->userCanRead($group_id, $package->getPackageID(), $user->getId())) {
        if ($request->existAndNonEmpty('release_id')) {
            if ($request->valid(new Valid_UInt('release_id'))) {
                $release_id = $request->get('release_id');
                $row3 =& $frsrf->getFRSReleaseFromDb($release_id);
            }
        }
 /**
  * Test is user can administrate FRS service of given project
  *
  * @param PFUser    $user    User to test
  * @param Integer $groupId Project
  *
  * @return Boolean
  */
 protected function userCanAdmin($user, $groupId)
 {
     return FRSPackageFactory::userCanAdmin($user, $groupId);
 }
Example #10
0
 /**
  * Get a Package Factory
  *
  * @return FRSPackageFactory
  */
 function _getFRSPackageFactory()
 {
     return FRSPackageFactory::instance();
 }
 /**
  * Process the monitoring request
  *
  * @param HTTPRequest $request      HTTP request
  * @param PFUser        $currentUser  Current user
  * @param Integer     $groupId      Id of the project
  * @param Integer     $fileModuleId Id of the package
  * @param UserManager $um           UserManager instance
  * @param UserHelper  $userHelper   UserHelper instance
  *
  * @return String
  */
 public function processEditMonitoringAction($request, $currentUser, $groupId, $fileModuleId, $um, $userHelper)
 {
     $frspf = new FRSPackageFactory();
     $package = $frspf->getFRSPackageFromDb($fileModuleId);
     if ($frspf->userCanAdmin($currentUser, $groupId)) {
         if ($request->valid(new Valid_WhiteList('action', array('add_monitoring', 'delete_monitoring')))) {
             $action = $request->get('action');
             switch ($action) {
                 case 'add_monitoring':
                     $users = array_map('trim', preg_split('/[,;]/', $request->get('listeners_to_add')));
                     foreach ($users as $userName) {
                         if (!empty($userName)) {
                             $user = $um->findUser($userName);
                             $this->addUserMonitoring($user, $groupId, $fileModuleId, $package, $frspf, $userHelper);
                         }
                     }
                     break;
                 case 'delete_monitoring':
                     $users = $request->get('delete_user');
                     $this->stopMonitoringForUsers($users, $groupId, $fileModuleId, $package, $um, $userHelper);
                     break;
                 default:
                     break;
             }
         }
     }
 }
Example #12
0
// http://sourceforge.net
//
//
require_once 'pre.php';
require_once 'common/frs/FRSPackageFactory.class.php';
require_once 'common/frs/FileModuleMonitorFactory.class.php';
if (user_isloggedin()) {
    $vFilemodule_id = new Valid_UInt('filemodule_id');
    $vFilemodule_id->required();
    if ($request->valid($vFilemodule_id)) {
        $filemodule_id = $request->get('filemodule_id');
        $pm = ProjectManager::instance();
        $um = UserManager::instance();
        $userHelper = new UserHelper();
        $currentUser = $um->getCurrentUser();
        $frspf = new FRSPackageFactory();
        $fmmf = new FileModuleMonitorFactory();
        if ($frspf->userCanRead($group_id, $filemodule_id, $currentUser->getId())) {
            $fmmf->processMonitoringActions($request, $currentUser, $group_id, $filemodule_id, $um, $userHelper);
            file_utils_header(array('title' => $Language->getText('file_showfiles', 'file_p_for', $pm->getProject($group_id)->getPublicName())));
            echo $fmmf->getMonitoringHTML($currentUser, $group_id, $filemodule_id, $um, $userHelper);
            file_utils_footer(array());
        } else {
            $GLOBALS['Response']->addFeedback('error', $Language->getText('file_filemodule_monitor', 'no_permission'));
            $GLOBALS['Response']->redirect('showfiles.php?group_id=' . $group_id);
        }
    } else {
        $GLOBALS['Response']->addFeedback('error', $Language->getText('file_filemodule_monitor', 'choose_p'));
        $GLOBALS['Response']->redirect('showfiles.php?group_id=' . $group_id);
    }
} else {
Example #13
0
	If you pass just the group_id, you will be given a list of releases
	with the option to edit those releases or create a new release


	If you pass the group_id plus the package_id, you will get the list of 
		releases with just the releases of that package shown
*/
$vGroupId = new Valid_GroupId();
$vGroupId->required();
if ($request->valid($vGroupId)) {
    $group_id = $request->get('group_id');
} else {
    exit_no_group();
}
$frspf = new FRSPackageFactory();
$user = UserManager::instance()->getCurrentUser();
if (!$frspf->userCanAdmin($user, $group_id)) {
    exit_permission_denied();
}
$frsrf = new FRSReleaseFactory();
$frsff = new FRSFileFactory();
$existing_packages = array();
$res = $frspf->getFRSPackagesFromDb($group_id);
foreach ($res as $p => $nop) {
    $existing_packages[] = array('id' => $res[$p]->getPackageId(), 'name' => $res[$p]->getName(), 'rank' => $res[$p]->getRank());
}
$vFunc = new Valid_WhiteList('func', array('delete', 'add', 'create', 'edit', 'update'));
$vFunc->required();
if ($request->valid($vFunc)) {
    switch ($request->get('func')) {
Example #14
0
function file_get_package_name_from_id($package_id)
{
    $frspf = new FRSPackageFactory();
    $res =& $frspf->getFRSPackageFromDb($package_id);
    return $res->getName();
}
 public static function clearInstance()
 {
     self::$instance = null;
 }
Example #16
0
require_once 'www/project/admin/permissions.php';
require_once 'common/include/HTTPRequest.class.php';
$request =& HTTPRequest::instance();
/*
Quick file release system , Darrell Brogdon, SourceForge, Aug, 2000

With much code horked from editreleases.php
*/
$vGroupId = new Valid_GroupId();
$vGroupId->required();
if ($request->valid($vGroupId)) {
    $group_id = $request->get('group_id');
} else {
    exit_no_group();
}
$frspf = new FRSPackageFactory();
$user = UserManager::instance()->getCurrentUser();
if (!$frspf->userCanAdmin($user, $group_id)) {
    exit_permission_denied();
}
$GLOBALS['HTML']->includeJavascriptFile("/scripts/scriptaculous/scriptaculous.js");
$GLOBALS['HTML']->includeCalendarScripts();
$GLOBALS['HTML']->includeJavascriptFile("../scripts/frs.js");
$frsrf = new FRSReleaseFactory();
$frsff = new FRSFileFactory();
$vFunc = new Valid_WhiteList('func', array('delete', 'add', 'create', 'edit', 'update'));
if (!$request->valid($vFunc)) {
    $GLOBALS['Response']->redirect('../showfiles.php?group_id=' . $group_id);
}
if ($request->valid(new Valid_UInt('package_id'))) {
    $package_id = $request->get('package_id');
Example #17
0
 /**
  * Function userCanRead : determine if the user can view this package or not
  *
  * @param int $user_id if not given or 0 take the current user
  * @return boolean true if user has Read access to this package, false otherwise
  */
 function userCanRead($user_id = 0)
 {
     $frspf = new FRSPackageFactory();
     return $frspf->userCanRead($this->getGroupID(), $this->getPackageID(), $user_id);
 }
Example #18
0
 /**
  * deleteEmptyRelease - Delete an empty release or all empty releases in package package_id in project group_id.
  *
  * @param String  $sessionKey  The session hash associated with the session opened by the person who calls the service
  * @param Integer $group_id    Id of the project in which we want to delete empty releases
  * @param Integer $package_id  Id of the package in which we want to delete empty releases
  * @param Integer $release_id  Id of the release to delete
  * @param Boolean $cleanup_all Set to true to delete all empty releases
  *
  * @return Array list of deleted releases, or a soap fault if:
  *                 - group_id does not match with a valid project
  *                 - the package_id does not match
  *                 - the user does not have permissions to delete releases
  *                 - the system was not able to delete the releases.
  */
 function deleteEmptyRelease($sessionKey, $group_id, $package_id, $release_id, $cleanup_all)
 {
     if (session_continue($sessionKey)) {
         try {
             $pm = ProjectManager::instance();
             $pm->getGroupByIdForSoap($group_id, 'deleteRelease');
         } catch (SoapFault $e) {
             return $e;
         }
         $packageFactory = new FRSPackageFactory();
         $package = $packageFactory->getFRSPackageFromDb($package_id);
         if (!$package || $package->getGroupID() != $group_id) {
             return new SoapFault(invalid_package_fault, 'Invalid Package', 'deleteRelease');
         }
         $releaseFactory = new FRSReleaseFactory();
         $releases = array();
         if ($release_id && !$cleanup_all) {
             $release = $releaseFactory->getFRSReleaseFromDb($release_id);
             if (!$release || $release->getPackageID() != $package_id) {
                 return new SoapFault(invalid_release_fault, 'Invalid Release', 'deleteRelease');
             }
             $releases[] = $release;
         } elseif ($cleanup_all) {
             // retrieve all the releases
             $releases = $releaseFactory->getFRSReleasesFromDb($package_id);
         }
         $deleted = array();
         foreach ($releases as $release) {
             $fileFactory = new FRSFileFactory();
             $files = $fileFactory->getFRSFilesFromDb($release->getReleaseID());
             if (empty($files)) {
                 if ($releaseFactory->userCanUpdate($group_id, $release->getReleaseID())) {
                     if ($releaseFactory->delete_release($group_id, $release->getReleaseID())) {
                         $deleted[] = release_to_soap($release);
                     } else {
                         return new SoapFault(invalid_package_fault, 'Release ' . $release->getReleaseID() . ' could not be deleted', 'deleteRelease');
                     }
                 } else {
                     return new SoapFault(invalid_package_fault, 'You don\'t have permission to delete package ' . $release->getReleaseID(), 'deleteRelease');
                 }
             }
         }
         return $deleted;
     } else {
         return new SoapFault(invalid_session_fault, 'Invalid Session', 'deleteRelease');
     }
 }
Example #19
0
**/
$query = new_utils_get_new_releases_long(0, 0, $limit * 3);
$res = db_query($query);
// ## one time output
print " <channel>\n";
print "  <copyright>" . $Language->getText('export_rss_sfnewreleases', 'copyright', array($GLOBALS['sys_long_org_name'], $GLOBALS['sys_name'], date('Y', time()))) . "</copyright>\n";
print "  <pubDate>" . gmdate('D, d M Y g:i:s', time()) . " GMT</pubDate>\n";
print "  <description>" . $Language->getText('export_rss_sfnewreleases', 'new_releases', $GLOBALS['sys_name']) . "</description>\n";
print "  <link>" . get_server_url() . "</link>\n";
print "  <title>" . $Language->getText('export_rss_sfnewreleases', 'new_releases', $GLOBALS['sys_name']) . "</title>\n";
list($host, $port) = explode(':', $GLOBALS['sys_default_domain']);
print "  <webMaster>webmaster@" . $host . "</webMaster>\n";
print "  <language>en-us</language>\n";
// ## item outputs
$outputtotal = 0;
$frspf = new FRSPackageFactory();
$frsrf = new FRSReleaseFactory();
while ($row = db_fetch_array($res)) {
    if (!$G_RELEASE["{$row['group_id']}"]) {
        if ($frspf->userCanRead($row['group_id'], $row['package_id'], 100) && $frsrf->userCanRead($row['group_id'], $row['package_id'], $row_newrel['release_id'], 100)) {
            print "  <item>\n";
            print "   <title>" . htmlspecialchars($row['group_name'] . " " . $row['release_version']) . "</title>\n";
            print "   <link>" . get_server_url() . "/file/showfiles.php?group_id={$row['group_id']}</link>\n";
            print "   <description>" . rss_description($row['short_description']) . "</description>\n";
            print "  </item>\n";
            $outputtotal++;
            // ## eliminate dupes, only do $limit of these
            $G_RELEASE[$row['group_id']] = 1;
            if ($outputtotal >= $limit) {
                break;
            }