<?php
/*******************************************************************************
 * Copyright (c) 2006-2015 Eclipse Foundation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Denis Roy (Eclipse Foundation) - initial API and implementation
 *    Christopher Guindon (Eclipse Foundation)
 *******************************************************************************/
  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");

  #*****************************************************************************
  #
  # 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;
  }

  # 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 />";
      }
      $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'];
      }

      # Still no file_id?  Then this is the first time this file is seen (bug 379376)
      if($file_id == 0 || $file_id == "" && $log_download) {
        $file_id = &addFileToIndex($_file);
      }
    }
    # No file time in the index.  Check the filesystem
    if($filetime == 0) {
      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 {
          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") {
        // 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)/1/eclipse-($packageList)-($trainname),", $filename, $matches)) {
      $rValue = $matches[2];
    }
    elseif(preg_match(",^/oomph/epp/mars/R1a/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";

    # /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 "linux-gtk.tar": $rValue = "LINUX32"; break;
      case "macosx-cocoa-x86_64": $rValue = "MACCOCOA64"; break;
      case "macosx-cocoa": $rValue = "MACCOCOA"; break;
      case "win32-x86_64": $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);
      return mysql_insert_id($dbh_RW);
    }
    else {
      return 0;
    }
  }
