* Copyright 2010 (c) FusionForge Team
* http://fusionforge.org/
*
- * This file is part of FusionForge.
- *
- * FusionForge is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
+ * This file is part of FusionForge. FusionForge is free software;
+ * you can redistribute it and/or modify it under the terms of the
+ * GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the Licence, or (at your option)
+ * any later version.
*
* FusionForge is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
- * You should have received a copy of the GNU General Public License
- * along with FusionForge; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * You should have received a copy of the GNU General Public License along
+ * with FusionForge; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
$no_gz_buffer=true;
-require_once('../env.inc.php');
+require_once '../env.inc.php';
require_once $gfcommon.'include/pre.php';
+require_once $gfcommon.'frs/include/frs_utils.php';
require_once $gfcommon.'frs/FRSPackage.class.php';
require_once $gfcommon.'frs/FRSRelease.class.php';
require_once $gfcommon.'frs/FRSFile.class.php';
-$arr=explode('/',getStringFromServer('REQUEST_URI'));
-$file_id=$arr[3];
-
-$res=db_query_params ('SELECT frs_file.filename,frs_package.is_public,frs_package.package_id,
- frs_file.file_id,groups.unix_group_name,groups.group_id,frs_release.release_id
- FROM frs_package,frs_release,frs_file,groups
- WHERE frs_release.release_id=frs_file.release_id
- AND groups.group_id=frs_package.group_id
- AND frs_release.package_id=frs_package.package_id
- AND frs_file.file_id=$1',
- array($file_id));
-
-if (db_numrows($res) < 1) {
- header("HTTP/1.0 404 Not Found");
- require_once $gfwww.'404.php';
- exit;
-}
+/* This script can work in one of the following modes:
+ * - file: one specific file (given its file_id)
+ * - latestzip: gets a Zip archive containing all files in the latest
+ * release of a given package (given a package_id)
+ * - latestfile: the version of a file that's in the
+ * latest release of a given package (given the file name and the
+ * package_id)
+ */
-$group_id = db_result($res,0,'group_id');
-$package_id = db_result($res,0,'package_id');
-$release_id = db_result($res,0,'release_id');
+function send_file ($filename,$filepath,$file_id=NULL) {
+ if (!file_exists($filepath)) {
+ session_redirect404();
+ }
-$Group =& group_get_object($group_id);
-if (!$Group || !is_object($Group) || $Group->isError()) {
- exit_no_group();
-}
+ header('Content-disposition: attachment; filename="'.str_replace('"', '', $filename).'"');
+ sysdebug_off("Content-type: application/binary");
+ $length = filesize($filepath);
+ header("Content-length: $length");
-$Package = new FRSPackage($Group,$package_id);
-if (!$Package || !is_object($Package)) {
- exit_error(_('Error Getting Package'),'frs');
-} else if ($Package->isError()) {
- exit_error($Package->getErrorMessage(),'frs');
-}
-$is_public = $Package->isPublic();
+ readfile_chunked($filepath);
-$Release = new FRSRelease($Package,$release_id);
-if (!$Release || !is_object($Release) || $Release->isError()) {
- exit_error(_('Error Getting Release'),'frs');
-}
+ if (!$file_id) {
+ return true;
+ }
-$File = new FRSFile($Release,$file_id);
-if (!$File || !is_object($File) || $File->isError()) {
- exit_error(_('Error Getting File'),'frs');
+ if (session_loggedin()) {
+ $s =& session_get_user();
+ $us=$s->getID();
+ } else {
+ $us=100;
+ }
+
+ $ip = getStringFromServer('REMOTE_ADDR');
+ $res = db_query_params("INSERT INTO frs_dlstats_file (ip_address,file_id,month,day,user_id) VALUES ($1, $2, $3, $4, $5)", array($ip,$file_id,date('Ym'),date('d'),$us));
}
-$filename = $File->getName();
+$normalized_urlprefix = normalized_urlprefix();
+$pathinfo = substr_replace(getStringFromServer('REQUEST_URI'), '', 0, strlen($normalized_urlprefix)-1);
+$expl_pathinfo = explode('/', $pathinfo);
+
+$mode = $expl_pathinfo[3];
+
+switch ($mode) {
+case 'file':
+ // .../download.php/file/123/foo.tar.gz
+ // 123 -> file_id
+ // foo.tar.gz ignored
+ $file_id = $expl_pathinfo[4];
+ $File = frsfile_get_object($file_id);
+ if (!$File) {
+ session_redirect404();
+ }
-// Members of projects can see all packages
-// Non-members can only see public packages
-if(!$is_public) {
- if (!session_loggedin() || !user_ismember($group_id)) {
- exit_permission_denied();
+ $Release = $File->FRSRelease;
+ $Package = $Release->FRSPackage;
+ $Group = $Package->Group;
+ if ($Package->isPublic()) {
+ session_require_perm('frs', $Package->Group->getID(), 'read_public');
+ } else {
+ session_require_perm('frs', $Package->Group->getID(), 'read_private');
}
-}
-if ($GLOBALS['sys_block_anonymous_downloads']) {
- if (!session_loggedin()) {
- exit_permission_denied();
+
+ $filename = $File->getName();
+ $filepath = forge_get_config('upload_dir').'/'.$Group->getUnixName().'/'.$Package->getFileName().'/'.$Release->getFileName().'/'.$filename;
+
+ send_file ($filename, $filepath, $file_id);
+
+ break;
+
+case 'latestzip':
+ // .../download.php/latestzip/123/package-latest.zip
+ // 123 -> package_id
+ // package-latest.zip ignored
+ $package_id = $expl_pathinfo[4];
+
+ $Package = frspackage_get_object($package_id);
+ if (!$Package || !$Package->getNewestRelease()) {
+ session_redirect404();
}
-}
-$filepath=forge_get_config('upload_dir').'/'.$Group->getUnixName().'/'.$Package->getFileName().'/'.$Release->getFileName().'/'.$File->getName();
-if (file_exists($filepath)) {
- Header('Content-disposition: attachment; filename="'.str_replace('"', '', $filename).'"');
- Header("Content-type: application/binary");
- $length = filesize($filepath);
- Header("Content-length: $length");
+ if ($Package->isPublic()) {
+ session_require_perm('frs', $Package->Group->getID(), 'read_public');
+ } else {
+ session_require_perm('frs', $Package->Group->getID(), 'read_private');
+ }
- readfile_chunked($filepath);
+ $filename = $Package->getNewestReleaseZipName();
+ $filepath = $Package->getNewestReleaseZipPath();
+ send_file ($filename, $filepath);
- if (session_loggedin()) {
- $s =& session_get_user();
- $us=$s->getID();
+ break;
+
+case 'latestfile':
+ // .../download.php/latestfile/123/foo.tar.gz
+ // 123 -> package_id
+ // foo.tar.gz -> file name
+ $package_id = $expl_pathinfo[4];
+ $file_name = $expl_pathinfo[5];
+
+ $res = db_query_params ('SELECT f.file_id FROM frs_file f, frs_release r, frs_package p WHERE f.release_id = r.release_id AND r.package_id = p.package_id AND p.package_id = $1 AND f.filename = $2 ORDER BY f.release_id DESC',
+ array($package_id, $file_name));
+
+ if (!$res || db_numrows($res) < 1) {
+ session_redirect404();
+ }
+
+ $row = db_fetch_array($res);
+ $file_id = $row['file_id'];
+ $File = frsfile_get_object($file_id);
+
+ $Release = $File->FRSRelease;
+ $Package = $Release->FRSPackage;
+ $Group = $Package->Group;
+ if ($Package->isPublic()) {
+ session_require_perm('frs', $Package->Group->getID(), 'read_public');
} else {
- $us=100;
+ session_require_perm('frs', $Package->Group->getID(), 'read_private');
}
- $ip=getStringFromServer('REMOTE_ADDR');
- $res=db_query_params("INSERT INTO frs_dlstats_file (ip_address,file_id,month,day,user_id)
- VALUES ($1, $2, $3, $4, $5)", array($ip,$file_id,date('Ym'),date('d'),$us));
-} else {
- header("HTTP/1.0 404 Not Found");
- require_once $gfwww.'404.php';
+ $filename = $File->getName();
+ $filepath = forge_get_config('upload_dir').'/'.$Group->getUnixName().'/'.$Package->getFileName().'/'.$Release->getFileName().'/'.$filename;
+
+ send_file ($filename, $filepath, $file_id);
+
+ break;
}
-?>
+// Local Variables:
+// mode: php
+// c-file-style: "bsd"
+// End: