<?php
/**
 * Copyright (c) 2006-2017, 2018 Eclipse Foundation.
 *
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 *
 * Contributors:
 *   Denis Roy (Eclipse Foundation) - initial API and implementation
 *   Christopher Guindon (Eclipse Foundation)
 *   Eric Poirier (Eclipse Foundation)
 *
 * SPDX-License-Identifier: EPL-2.0
 */

  require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php");
  require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/nav.class.php");
  require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/menu.class.php");
  require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/classes/friends/payment.class.php");

  $App = new App();
  $Nav = new Nav();
  $Menu = new Menu();
  $Paypal = new Paypal();
  $App->preventCaching();
  include("_projectCommon.php");

  $App->Promotion = FALSE;

  #*****************************************************************************
  #
  # download.php
  #
  # Author:       Denis Roy
  # Date:         2004-11-23
  #
  # Description:  Logic for finding mirror sites that have a specific file
  #
  # HISTORY:    2005-03-19: moved to new infra
  # HISTORY:    2005-04-07: stopped probing external sites
  # HISTORY:    2005-08-13: rewrote selects to use UNIONs instead of temp tables
  # HISTORY:    2005-08-23: added format=plain functionality
  # HISTORY:    2006-01-16: added countryCode functionality
  # HISTORY:    2006-01-25: added GeoIP functionality
  # HISTORY:    2006-01-25: added file_id functionality (1.13)
  # HISTORY:    2006-03-17: added no_mirror and $exclude_string functionality to match RSYNC stanza (1.21)
  # HISTORY:    2006-10-03: added functionality for looking at archive.eclipse.org
  # HISTORY:    2006-12-19: removed file index lookups on slave, as slave lags are bad
  # HISTORY:    2007-02-12: added code to self-clean the download logs
  # HISTORY:    2007-02-12: added holding tables for download logs
  # HISTORY:    2008-03-25: added functionality to return a 404
  # HISTORY:    2009-04-25: added bittorrent functionality
  # HISTORY:    2009-05-26: better sorting of mirrors after my country, my continent
  # HISTORY:    2010-01-13: implement last_known_sync/ztime (bug 291039)
  # HISTORY:    2010-01-13: implement caching of file timestamps (bug 299504)
  # HISTORY:    2010-06-14: Checksums (316820)
  # HISTORY:    2010-09-10: No mirrors for local subnets (324983)
  # HISTORY:    2012-04-05: Throttle IP addresses which frequently abuse site (no referer + multiple accesses per minute = cooldown)
  # HISTORY:    2012-04-17: Provide privileged download access for comitters with their username and password (376732)
  # HISTORY:    2015-06-14: Remove partial mirrors, add support for trends
  #
  #*****************************************************************************

  # Begin: page-specific settings.  Change these.
  $pageTitle = "Eclipse downloads - Select a mirror";
  $pageKeywords = "";
  $pageAuthor = "Denis Roy";
  header("Cache-control: no-cache");

  require_once "/home/data/httpd/eclipse-php-classes/system/dbconnection_rw.class.php";
  require_once "/home/data/httpd/eclipse-php-classes/system/dbconnection.class.php";
  require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/classes/mirrors/mirror.class.php");
  require_once($_SERVER['DOCUMENT_ROOT'] . "/membership/promo/promos.php");

  # Initiate session
  $Session = $App->useSession("optional");
  $Friend = $Session->getFriend();
  $Mirror = new Mirror();

  $archiveBasePath   = "/home/data2/httpd/archive.eclipse.org";
  $archiveBaseURL   = "http://archive.eclipse.org";

  $_format   = $App->getHTTPParameter("format");
  $_debug   = $App->getHTTPParameter("debug");
  $_file     = $App->getHTTPParameter("file");
  $_file_id   = $App->getHTTPParameter("file_id");  # Committers-only fast download

  //Bug 475734 - download.php should not offer to serve *.php content
  $info = new SplFileInfo($_file);
  if (strtolower($info->getExtension()) == 'php') {
    $_file = '';
  }

  $p2_where = "";

  # don't display mirrors, just redirect
  $_redirect   = $App->getHTTPParameter("r");

  # if the file is invalid, return a 404 instead of a lovely page
  $_send_404   = $App->getHTTPParameter("nf");

  # Identify that the file cannot (or must not) use mirrors.
  # This is for files that are in the exclude list
  $no_mirror = false;

  # to downloads
  $_mirror_id  = $App->getHTTPParameter("mirror_id");
  if($_mirror_id != "" && !preg_match('/^[0-9]+/', $_mirror_id)) {
    $_mirror_id = 1;
    $no_mirror = true;
  }
  $_url  = "";

  if($_debug == 1) {
    echo "Mirror id: " . $_mirror_id . "<br />";
  }


  # extended functionality
  $_country_code  = $App->getHTTPParameter("countryCode");
  $_time_zone    = $App->getHTTPParameter("timeZone");

  # set country_code to bogus if none specified
  if ($_country_code == "") {
    $_country_code = "xx";
  }

  $remote_addr = $_SERVER['REMOTE_ADDR'];
  //$remote_addr = '69.157.112.107'; #DEBUG
  $ip_ccode = $Mirror->selectCountryCodeByIP($remote_addr);
  if($_debug == 1) {
    echo "Country given: " . $_country_code . " IP Geolocation: " . $ip_ccode . "<br />";
  }


  if($ip_ccode != "") {
    # We got a country code from the IP. Use it instead.
    $_country_code = $ip_ccode;
  }
  $_country_code = substr($_country_code, 0, 2);

  # project and file index information for logging and statistics
  $file_id   = 0;
  $project_id = "";
  $torrentname= "";


  # Throttle the percentage of downloads we accept for update manager redirects
  $our_download_percentage = 5;

  define('MAX_DOWNLOADS_PER_MINUTE', 5);

  # Log download stats, and to which table.  log_download_table will be suffixed with a number later
  $log_download     = !$App->getDBReadOnly();
  $log_download_table = "downloads";

  # Clean up download records older than this number of days
  $download_log_max_age = 365;

  # Do a reverse lookup on the client IP - for internal mirror matching and logging
  $client_hostname = @gethostbyaddr($remote_addr);

  # Get preferred mirror (if any)
  $MIR_PREF = ""; # $_COOKIE['MIR_PREF'];

  $error = "";
  $mtime = 0;

  # make sure some incoming params are sane
  if($_format != "html" && $_format != "xml" && $_format != "plain") {
    $_format   = "html";
  }
  $_protocol = "http";

  # strip potentially bad characters from file
  $_file = str_replace("\%", "", $_file);
  $_file = str_replace("../", "", $_file);
  $_file = str_replace("'", "", $_file);


  # Bypass the entire SQL statement if the file is in the excluded list
  if($Mirror->isExcluded($_file)) {
    # File is in the exclude list. Can't use mirrors, so why not redirect to the actual file?
    # 2008-09-25: What about Friends?
    $no_mirror = true;

    if($_debug == 1) echo "File is excluded from mirrors.<br />";
    # Don't log this download, since listing the file in the download_index will
    # cause the mirror trends to be off
    $log_download = false;
  }

  # Bypass the entire SQL statement if we're getting a HEAD request
  # Bug 479280
  if($_SERVER['REQUEST_METHOD'] == "HEAD") {
    $no_mirror = true;
    if($_debug == 1) echo "HEAD request -- not querying mirrors.<br />";
    $log_download = false;
  }

  # Don't send a mirror list if the request comes from within our network
  if(substr($remote_addr, 0, 10) == "198.41.30."
    || !$Mirror->isValidPublicIP($remote_addr))  {
      $no_mirror = true;
      if($_debug == 1) {
        echo "Coming from " . $remote_addr . "; client should use home site.<br />";
      }
  }

  # Connect to databases
  # dbc is a read-only database (good for slave servers)
  $dbc    = new DBConnection();
  $dbh     = $dbc->connect();

  # this is for logging the request
  $dbc_RW   = new DBConnectionRW();
  $dbh_RW    = $dbc_RW->connect();

  $app = new App();

  # Process an incoming request for a committers-only download
  if(isset($_file_id)) {
    if($_file_id > 0) {
      if($Friend->getIsCommitter()) {
        $sql = "SELECT file_name FROM download_file_index WHERE file_id = " . $app->sqlSanitize($_file_id);
        $rs = mysql_query($sql, $dbh);
        if($myrow = mysql_fetch_assoc($rs)) {
          $file_name   = $app->getDownloadBasePath() . $myrow['file_name'];

          if(file_exists($file_name)) {
            logDownload($_file_id, 4, $remote_addr);
            header('Content-Description: File Transfer');
            header('Content-Type: application/octet-stream');
            header('Content-Disposition: attachment; filename=' . basename($file_name));
            header('Content-Transfer-Encoding: binary');
            header('Expires: 0');
            header('Cache-Control: must-revalidate');
            header('Pragma: public');
            header('Content-Length: ' . filesize($file_name));
            ob_clean();
            flush();
            readfile($file_name);
            exit;
          }
        }
      }
      else {
        header("HTTP/1.0 403 Forbidden");
        echo "<html><head><title>403 Forbidden</title></head><body><h1>403 Forbidden</h1><p>Sorry, this type of request is for Eclipse committers only. Please <a href='" . $Session->getLoginPageURL() . "'>log in</a> if you are a committer and wish to download this file.</p>";
        echo "<p>If you are trying to download Eclipse, please go to <a href='/downloads/'>Eclipse Downloads</a>. Otherwise, please copy this entire message and notify webmaster@eclipse.org.<br /><br />";
        echo $_SERVER['HTTP_REFERER'] . "</p></body></html>";
        exit;
      }
    }
  }

  # find lowest drop location for this file
  # file could be in Release, which is in Full, which is in EclipseFull,
  # so we want to find all the possible mirrors
  $filetime = 0;
  $filesize = 0;
  $filetime_update = false;
  $filename_fileonly = "";  # filename portion only
  if($_file != "") {
    # locate file on download.eclipse.org to ensure it's valid

    $filename     = $app->getDownloadBasePath() . $_file;
    $filename_fileonly   = substr($_file, strrpos($_file, "/") + 1);  # filename portion only


    # find lowest drop and get basic project/file info
    # I originally tried to lump the GeoIP ccode lookup here to save a connection,
    # but the query ended up taking 11 seconds

    # 2008-07-31: broke down the SQL in two different queries
    # using left joins for the download_file_index took .55 sec, two queries uses < .15 sec

    # q1: get file info from slave
    $sql = "SELECT IDX.file_id, IDX.timestamp_disk, IF(IDX.md5sum = '0', '', IDX.md5sum) AS md5sum, IF(IDX.sha1sum = '0', '', IDX.sha1sum) AS sha1sum, IF(IDX.sha512sum = '0', '', IDX.sha512sum) AS sha512sum FROM download_file_index AS IDX WHERE IDX.file_name = '$_file'";
    if($_debug == 1) {
        echo $sql . "<br />";
    }
    # Get the file_id from the slave, but if the file_id is 0, then re-check the master just in case
    $rs = mysql_query($sql, $dbh);

    if($myrow = mysql_fetch_assoc($rs)) {
      $file_id   = $myrow['file_id'];
      $filetime   = $myrow['timestamp_disk'];
      $md5sum    = $myrow['md5sum'];
      $sha1sum  = $myrow['sha1sum'];
      $sha512sum  = $myrow['sha512sum'];
    }
    # If this is a new file, check the master DB in case the slave is simply lagged
    if($file_id == 0 || $file_id == "") {
      if($_debug == 1) {
        echo "This is a new file.  Checking the Master DB.<br />";
      }
      # Lock tables for write
      $rs = mysql_query("LOCK TABLES download_file_index WRITE, downloads READ, $log_download_table READ, mirrors READ, mirror_protocols READ, mirror_drops READ, drops READ, SYS_countries READ, SYS_continents READ, SYS_countries READ, mirror_trends READ, SYS_variables READ", $dbh_RW);
      $rs = mysql_query($sql, $dbh_RW);
      if($myrow = mysql_fetch_assoc($rs)) {
        $file_id   = $myrow['file_id'];
        $filetime   = $myrow['timestamp_disk'];
        $md5sum    = $myrow['md5sum'];
        $sha1sum  = $myrow['sha1sum'];
        $sha512sum  = $myrow['sha512sum'];
        mysql_query("UNLOCK TABLES", $dbh_RW);
      }
    }

    # No file time in the index.  Check the filesystem
    if($filetime == 0 || $file_id == 0 || $file_id == "") {
      if($_debug == 1) {
        echo "Checking filesystem for $filename time.<br />";
      }
      if(@fopen($filename, "r")) {
        $filetime = @filemtime($filename);
        $filesize = @filesize($filename);
      }

      if(!$filetime || $filetime == 0) {
        # unable to open file
        $dbc_RW->disconnect();

        # check on archive.eclipse.org
        $filename = $archiveBasePath . $_file;
        if(@fopen($filename, "r")) {
          $filetime = @filemtime($filename);
          $filesize = @filesize($filename);
        }

        if(!$filetime || $filetime == 0) {
          # File isn't on download nor on archive.
          $error = 1;
          if($_format == "xml") {
            $app->sendXMLHeader();
            include("content/en_mir_list_xml.php");
          }
          else {
            if($_send_404) {
              header("HTTP/1.0 404 Not Found");
              echo "<html><head><title>404 Not Found</title></head><body><h1>404 Not Found</h1></body></html>";
            }
            else {
              include("content/en_mir_download_invalid_file.php");
            }
          }
          return false;
        }
        else {
          # we finally have a filetime after examining disk.  Add it to the index if we're logging downloads.
          if($log_download) {
            $file_id = &addFileToIndex($_file);
          }
          if($Friend->getIsCommitter() || $Friend->getIsBenefit()) {
            $file_name = preg_replace("/download\.eclipse\.org/", "archive.eclipse.org", $app->getDownloadBasePath() . $_file);
            if(file_exists($file_name)) {
              logDownload($file_id, 4, $remote_addr);
              header('Content-Description: File Transfer');
              header('Content-Type: application/octet-stream');
              header('Content-Disposition: attachment; filename=' . basename($file_name));
              header('Content-Transfer-Encoding: binary');
              header('Expires: 0');
              header('Cache-Control: must-revalidate');
              header('Pragma: public');
              header('Content-Length: ' . filesize($file_name));
              ob_clean();
              flush();
              readfile($file_name);
              exit;
            }
            exit;
          }
          else {
            # File exists on archive.eclipse.org.  No mirrors, or redirect to the actual file.
            if($_format == "xml") {
              $app->sendXMLHeader();
              include("content/en_mir_list_xml.php");
              return false;
            }
            else {
              header("Location: " . $archiveBaseURL . $_file);
              exit;
            }
          }
        }
      }
      else {
        $filetime_update = true;
      }
    }

    $sql = "SELECT key_value FROM SYS_variables WHERE key_name = 'download_table' LIMIT 1";
    $rs = mysql_query($sql, $dbh);
    if($myrow = mysql_fetch_assoc($rs)) {
      $key_value   = $myrow['key_value'];
    }
    if($_debug == 1) {
      echo "Project SQL: ". $sql . "<br /><br />";
    }
    $log_download_table .= $key_value;

  }
  if($_debug == 1) {
    echo "File ID: " . $file_id . "<br />";
    echo "Log download table: " . $log_download_table . "<br />";
  }

  # First select: get mirrors at the lowest drop
  $having = "((MIR.is_internal <> 1 AND last_known_sync > " . $filetime . ")
            OR LOCATE(MIR.internal_host_pattern, '" . $client_hostname . "') > 1) AND success_rate > 80 ";

  $where = " MRD.drop_id = 'EclipseFull'";
  if($_protocol != "") {
    $where .= " AND MRP.protocol = '$_protocol'";
  }
  if($_mirror_id > 0) {
    $where .= " AND MIR.mirror_id = '$_mirror_id'";
  }
  $eclipseFullDropSQL = "SELECT /* download.php:$remote_addr */
          IF(LOCATE(MIR.internal_host_pattern, '" . $client_hostname . "') > 1, 1, 0) AS SuggestInternal,
          IF(COU.ccode = '$_country_code', 1, 0) AS SameCountry,
          IF(COU.continent_code = MYCOU.continent_code, 1, 0) AS SameContinent,
          ROUND(AVG(TRD.download_speed_kbps),0) * RAND() AS avg_speed_indexed, SUM(IF(TRD.http_status_code BETWEEN 200 AND 299, 1, 0)) / COUNT(TRD.trend_id) * 100 AS success_rate,
          MIR.mirror_id,
          MIR.organization,
          MIR.ccode,
          MIR.is_internal,
          MIR.internal_host_pattern,
          MRD.drop_id,
          DRP.our_path,
          DRP.file_pattern,
          MRP.protocol,
          MRP.base_path,
          MRD.rel_path_override,
          MRD.timestamp,
          IF(MRD.timestamp > MRD.timestamp_end, IF(MRD.timestamp_last_complete > 0, MRD.timestamp_last_complete, IF(MRD.timestamp_end > 0,  MRD.timestamp_end, 0)), MRD.timestamp) AS last_known_sync,
          COU.en_description AS country_desc,
          CON.en_description AS continent_desc,
          CON.sort_order
        FROM mirrors AS MIR
          INNER JOIN mirror_protocols AS MRP on MRP.mirror_id = MIR.mirror_id
          INNER JOIN mirror_drops AS MRD ON MRD.mirror_id = MIR.mirror_id
            AND MRD.protocol = MRP.protocol
          INNER JOIN drops as DRP ON DRP.drop_id = 'EclipseFull'
          INNER JOIN SYS_countries AS COU ON COU.ccode = MIR.ccode
          INNER JOIN SYS_continents AS CON ON CON.continent_code = COU.continent_code
          LEFT JOIN SYS_countries AS MYCOU ON MYCOU.ccode = '$_country_code'
          LEFT JOIN mirror_trends AS TRD ON TRD.mirror_id = MIR.mirror_id
        WHERE
          MIR.is_advertise = 1
          AND MIR.create_status = 'active'
          AND $where
        GROUP BY MIR.mirror_id
        HAVING " . $having;


  $orderby = " is_internal DESC, SuggestInternal DESC, SameContinent DESC, CON.sort_order DESC, success_rate DESC, avg_speed_indexed DESC";

  if($_redirect == 1) {
    $orderby .= " LIMIT 1";
  }

  $mirrorListSQL = $eclipseFullDropSQL . " ORDER BY " . $orderby;

  # Bypass the whole mirror SQL if we can't pick a mirror for this file
  $rs;
  if(!$no_mirror && $_mirror_id != 1 && $_mirror_id != 2) {   #mirror_id 1 is download, 2 is friends
    $rs   = mysql_query($mirrorListSQL, $dbh);
    $myrow = mysql_fetch_assoc($rs);
    mysql_data_seek ($rs, 0);
    $_url = $myrow['base_path']. $_file;
    if($_redirect == 1) {
      $_mirror_id = $myrow['mirror_id'];
    }
  }
  else {
    $_url = $app->getPubDownloadServerUrl() . $_file;
    if($_mirror_id == 2) {
      # Friends
      $_url = preg_replace('/http:\/\/download.eclipse.org/', 'https://friends.eclipse.org/downloads', $_url);
    }

    # Bug 470444 - download of ZIP archives doesn't work anymore
    $_redirect = 1;
  }

  if($_debug == 1) {
    echo $mirrorListSQL . "<br /><br />";
  }


  if($_redirect == 1) {
    # fetch row & build URL
    # Higher weight = more to our server.  Set weight above ($our_download_percentage)
    $random =  rand(1, 100);

    # download from eclipse.org
    if($random <= $our_download_percentage || $no_mirror || mysql_num_rows($rs) == 0) {
      $_mirror_id = 1;
      $_url = $app->getPubDownloadServerUrl() . $_file;
    }

    if($_debug == 1) {
      echo "Redirect: $_url <br /><br />";
    }

  }
  if($_debug == 1) {
    echo "Pre phase-II<br /> URL: $_url <br />File: $_file:<br />Mirror: $_mirror_id";
  }


  # Phase 2 - a user picked a mirror for his file, or redirect, or there are no mirrors
  if(($_file != "" && $_mirror_id > 0 && $_url != "" && $_format != "xml") || $_debug) {
    $ip     = $remote_addr;
    $cnt    = 0;   # recent downloads

    # Throttle the amount of downloads we count (and redirect to) to prevent ballot stuffers
    $sql = "SELECT file_id, COUNT(1) AS cnt FROM $log_download_table WHERE remote_addr = '$ip' AND download_date > DATE_SUB(NOW(), INTERVAL 1 MINUTE) GROUP BY file_id, remote_addr HAVING cnt > " . MAX_DOWNLOADS_PER_MINUTE;
    $rs = mysql_query($sql, $dbh);
    if($myrow = mysql_fetch_assoc($rs)) {
      include("content/en_too_many_downloads.php");
    }
    else {
      if($_redirect == 1) {
        # Blindly send user off to a mirror site
        header("Location: " . $_url);
        $is_success = 2;
      }
      else {
        $is_success = 2;

        # Redirect user to the file instead of an HTML/meta redirect
        # Bug 134634
        # include("content/en_mir_download_success.php");
        if (!isset($_COOKIE['thankyou_page']['eclipse_donation']) || !isset($_COOKIE['thankyou_page']['eclipse_newsletter'])) {
          include("content/en_mir_download_success.php");
        }
        else {
          header("Location: " . $_url);
        }
      }


      if ($log_download) {
        # We couldn't find a file_id up there, so insert the actual file here
        if($file_id == "") {
          $file_id = &addFileToIndex($_file);
        }

        $sql = "INSERT DELAYED INTO $log_download_table (file_id, download_date, remote_host, remote_addr, mirror_id, ccode)
          VALUES ( $file_id, NOW(), '$client_hostname', '$ip', $_mirror_id, '$_country_code')  ";
        mysql_query($sql, $dbh_RW);

        $string = "";
        if($filetime_update) {
          $string = ", timestamp_disk = $filetime";
        }
        $sql = "UPDATE LOW_PRIORITY download_file_index SET download_count = download_count + 1 " . $string . " WHERE file_id = " . $file_id;
        mysql_query($sql, $dbh_RW);
      }
    }

    if($_debug == 1) {
      echo $sql . mysql_error() . "<br />";
    }
  }
  else {
    if($_file != "") {
      if($_format == "html") {

        // Bug 484100 - Removed the Download button from mirror pages
        $variables = array();
        $variables['btn_cfa'] = array(
          'hide' => TRUE, // Optional - Hide the CFA button.
        );
        $App->setThemeVariables($variables);

        // Place your html content in a file called content/en_pagename.php
        ob_start();
        include("content/en_" . $App->getScriptName());
        $html = ob_get_clean();
        # Generate the web page
        $App->AddExtraJSFooter('<script type="text/javascript" src="/downloads/assets/public/javascript/mirror.min.js"></script>');
        $App->AddExtraHtmlHeader('<link href="/downloads/assets/public/stylesheets/mirror.min.css" media="screen" rel="stylesheet" type="text/css"/>');
       // Place your html content in a file called content/en_pagename.php
        $App->generatePage($theme, $Menu, NULL, $pageAuthor, $pageKeywords, $pageTitle, $html);
      }
      if($_format == "plain") {
        include("content/en_mir_list_plain.php");
      }
      if($_format == "xml") {
        $app->sendXMLHeader();
        include("content/en_mir_list_xml.php");
      }
    }
    else {
      if($_format == "html") {
        if($_send_404) {
          header("HTTP/1.0 404 Not Found");
          echo "<html><head><title>404 Not Found</title></head><body><h1>404 Not Found</h1></body></html>";
        }
        else {
          include("content/en_mir_download_invalid_file.php");
        }
      }
      if($_format == "xml") {
        $app->sendXMLHeader();
        include("content/en_mir_list_xml.php");
      }
    }
  }



  $dbc_RW->disconnect();  # disconnects all pending DB connections
  $rs   = null;
  $dbh_RW  = null;
  $dbc_RW = null;
  $dbh  = null;
  $dbc   = null;


  /**
   *
   * @param $filename - file name portion (relative to http://download.eclipse.org) to inspect
   * @param $trainname - optional name of train to limit search to
   * @return string - name of package (jee|java|cpp|modeling|reporting|rcp|php|pulsar|sdk) or the empty string
   * @author Denis Roy
   * @example getPackageFromFilename("/technology/epp/downloads/release/galileo/R/eclipse-rcp-galileo-R-win32.zip", "galileo")
   * @since June 2009
   * @
   */
  function getPackageFromFilename($filename, $trainname=".*") {
    $rValue = "";

    $packageList = "automotive|jee|java|cpp|modeling|reporting|rcp|scout|testing|soa|javascript|parallel|php|committers";

    # /technology/epp/downloads/release/galileo/R/eclipse-rcp-galileo-RC4-win32.zip
    # /eclipse/downloads/drops/R-3.4-200806172000/eclipse-SDK-3.4-solaris-gtk.zip
    # technology/epp/downloads/release/kepler/R/eclipse-reporting-kepler-

    if(preg_match(",^/technology/epp/downloads/release/($trainname)/3/eclipse-($packageList)-($trainname),", $filename, $matches)) {
      $rValue = $matches[2];
    }
    elseif(preg_match(",^/oomph/epp/oxygen/R2/eclipse-inst-,", $filename)) {
      $rValue = "installer";
    }
    return $rValue;
  }

  function getOSFromFilename($filename) {
    $rValue = "";

    $osList = "win32-x86_64|win32|macosx-cocoa|linux-gtk-x86_64|linux-gtk.tar|linux64|linux32|win64|win32|mac64";

    # /technology/epp/downloads/release/galileo/R/eclipse-rcp-galileo-RC4-win32.zip
    # /eclipse/downloads/drops/R-3.4-200806172000/eclipse-SDK-3.4-solaris-gtk.zip

    if(preg_match(",($osList),", $filename, $matches)) {
      $rValue = $matches[1];
    }

    switch($rValue) {
      case "linux-gtk-x86_64": $rValue = "LINUX64"; break;
      case "linux64": $rValue = "LINUX64"; break;
      case "linux-gtk.tar": $rValue = "LINUX32"; break;
      case "linux32": $rValue = "LINUX32"; break;
      case "macosx-cocoa-x86_64": $rValue = "MACCOCOA"; break;
      case "mac64": $rValue = "MACCOCOA"; break;
      case "macosx-cocoa": $rValue = "MACCOCOA"; break;
      case "win32-x86_64": $rValue = "WIN64"; break;
      case "win64": $rValue = "WIN64"; break;
      case "win32": $rValue = "WIN32"; break;
    }

    return $rValue;
  }

  function logDownload($in_file_id, $in_mirror_id, $ip = NULL) {
    if (is_null($ip)) {
      $ip = $_SERVER['REMOTE_ADDR'];
    }

    global $dbh_RW, $log_download_table, $client_hostname, $_country_code, $_debug;


    if ($in_file_id != "") {
      $sql = "INSERT DELAYED INTO $log_download_table (file_id, download_date, remote_host, remote_addr, mirror_id, ccode)
        VALUES ( $in_file_id, NOW(), '$client_hostname', '$ip', $in_mirror_id, '$_country_code')  ";
      if($_debug == 1) {
        echo $sql . "<br />";
      }
      mysql_query($sql, $dbh_RW);

      $sql = "UPDATE LOW_PRIORITY download_file_index SET download_count = download_count + 1 WHERE file_id = " . $in_file_id;
      mysql_query($sql, $dbh_RW);
    }
  }

  function addFileToIndex($in_file) {
    global $app, $dbc_RW, $dbh_RW, $filetime, $filesize, $_debug;

    # Add this file to the file index
    if($in_file != "") {
      $sql = "INSERT INTO download_file_index (file_id, file_name, download_count, timestamp_disk, size_disk_bytes)
        VALUES (NULL, '" . $app->sqlSanitize($in_file, $dbh_RW) . "', 0, $filetime, $filesize)";
      $rs = mysql_query($sql, $dbh_RW);
      $inserted_id = mysql_insert_id($dbh_RW);
      mysql_query("UNLOCK TABLES", $dbh_RW);
      return $inserted_id;
    }
    else {
      return 0;
    }
  }
