<?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
*******************************************************************************/

require_once("/home/data/httpd/eclipse-php-classes/system/dbconnection.class.php");  # Read-only slave
require_once(realpath(dirname(__FILE__) . "/../../system/app.class.php"));

class Mirror {

  # this class will eventually contain mirror information
  var $mirror_id = 0;  #PK
  var $organization = "";
  var $ccode = "";
  var $r30 = 0;
  var $update_ip_allow = "";
  var $email = "";
  var $is_internal = 0;
  var $is_advertise = 0;
  var $date_enabled = "";
  var $create_status = "";
  var $contact = "";
  var $internal_host_pattern = "";
  var $last_verified = "";

  public $exclude_string = "*.nfs* apitools/ apidocs/ archive/ archives/ /athena builds/N* */doc/* */documentation/* drops*/I* drops*/N* drops/M* *.jpg *.gif callisto/* compilelogs/ eclipse.org-common/ eclipse/testUpdates* eclipse/updates/3.2milestones /eclipse/updates/3.6-I-builds/ dev/TPTP* /tools/cdt/builds modeling/gmf/downloads/drops/B* *drops*/*/N* *drops*/*/I* *javadoc/ *javadocs/ linuxtools/N* *nightly* *Nightly* *staging* /webtools/downloads/drops/*/M* performance/ /releases/staging /releases/europa testresults/ /rt/eclipselink/nightly* /technology/cosmos /technology/ohf /technology/tigerstripe testcompilelogs/ testResults/ /tools/downloads /tools/orbit/committers */N201* */I201* */I.I201* */I-* */N-* *integration*/ xref/ */M20* /rt/eclipselink/maven.repo* */scripts* */logs* *drops4/X* *drops4/Y* *eclipse/updates/*-X* *eclipse/updates/*-Y* *.php*.* staging/* releases/staging/*";


  function getMirrorID() {
    return $this->mirror_id;
  }
  function getOrganization() {
    return $this->organization;
  }
  function getCCode() {
    return $this->ccode;
  }
  function getR30() {
    return $this->r30;
  }
  function getUpdateIPAllow() {
    return $this->update_ip_allow;
  }
  function getEMail() {
    return $this->email;
  }
  function getIsInternal() {
    return $this->is_internal;
  }
  function getIsAdvertise() {
    return $this->is_advertise;
  }
  function getDateEnabled() {
    return $this->date_enabled;
  }
  function getCreateStatus() {
    return $this->CreateStatus;
  }
  function getContact() {
    return $this->Contact;
  }
  function getInternalHostPattern() {
    return $this->internal_host_pattern;
  }
  function getLastVerified() {
    return $this->last_verified;
  }

  function setMirrorID($_mirror_id) {
    $this->mirror_id = $_mirror_id;
  }
  function setOrganization($_organization) {
    $this->organization = $_organization;
  }
  function setCCode($_ccode) {
    $this->ccode = $_ccode;
  }
  function setR30($_r30) {
    $this->r30 = $_r30;
  }
  function setUpdateIPAllow($_update_ip_allow) {
    $this->update_ip_allow = $_update_ip_allow;
  }
  function setEMail($_email) {
    $this->email = $_email;
  }
  function setIsInternal($_is_internal) {
    $this->is_internal = $_is_internal;
  }
  function setIsAdvertise($_is_advertise) {
    $this->is_advertise = $_is_advertise;
  }
  function setDateEnabled($_date_enabled) {
    $this->date_enabled = $_date_enabled;
  }
  function setCreateStatus($_create_status) {
    $this->CreateStatus = $_create_status;
  }
  function setContact($_contact) {
    $this->Contact = $_contact;
  }
  function setInternalHostPattern($_internal_host_pattern) {
    $this->internal_host_pattern = $_internal_host_pattern;
  }
  function setLastVerified($_last_verified) {
    $this->last_verified = $_last_verified;
  }

  function selectCountryCodeByIP($_IP) {

    $App = new App();

    $rValue = "xx";  # no ccode info for this IP
      if($_IP != "") {
        $ipnum = sprintf("%u", ip2long($_IP));

        $dbc = new DBConnection();  # Read-only, to slave!
        $dbh = $dbc->connect();

        $sql = "SELECT ccode FROM geoip WHERE $ipnum BETWEEN start AND end";

        $result = mysql_query($sql, $dbh);

      if($myrow = mysql_fetch_array($result)) {
        $rValue = $myrow['ccode'];
      }

      $dbc->disconnect();
      $dbh   = null;
      $dbc   = null;
      $result = null;
      $myrow  = null;

    }
    return $rValue;
  }

  /** @author droy
   * @since version - Apr 16,2007
   * @param String _IP IP address to examine
   * @return Boolean IP is a valid public IP
   *
   */
   function isValidPublicIP($_IP) {

     if(!preg_match('/^\d+\.\d+\.\d+\.\d+/', $_IP)) {
       return false;
     }

    if (substr_count($_IP, '.') > 3) {
      return false;
    }

    if (strpos($_IP, '.') == 0 || strrpos($_IP, '.') == (strlen($_IP)-1)) {
      return false;
    }

      $parts = explode('.', $_IP);

    foreach ($parts as $part) {
      if ($part > 255) {
        return false;
      }
    }

    switch($parts[0]) {
      case 0: return false; break;
      case 10: return false; break;
      case 127: return false;  break;
      case 172:
        if($parts[1] >= 16 && $parts[1] <= 32) {
          return false;
        }
        break;
      case 192:
        if($parts[1] == 168) {
          return false;
        }
        break;
    }

    if($parts[0] > 223) {
      return false;
    }

     return true;
   }


   /**
    * Returns true if user-agent appears to be a machine
    * @author Denis Roy
    * @see download.eclipse.org/errors/404.php
    * @since 2014-11-18
    * @return boolean
    *
    */
  function isMachineBrowser() {

    $browser = $_SERVER['HTTP_USER_AGENT'];
    $rValue = false;

    if(strpos($browser, "Jakarta") !== FALSE
      || strpos($browser, "Java/") !== FALSE
      || strpos($browser, "Slurp") !== FALSE
      || stripos($browser, "bot") !== FALSE
      || strpos($browser, "bing") !== FALSE
      || stripos($browser, "Googlebot/") !== FALSE
      || stripos($browser, "apacheHttpClient") !== FALSE
      || stripos($browser, "Apache-HttpClient/") !== FALSE
      || stripos($browser, "spider") !== FALSE
      || strpos($browser, "Apache-Maven/") !== FALSE
      || strpos($browser, "Apache Ivy/") !== FALSE
      || strpos($browser, "Apache Archiva/") !== FALSE
      || strpos($browser, "Artifactory/") !== FALSE
      || strpos($browser, "Aether") !== FALSE
      || strpos($browser, "m2e/") !== FALSE
      || strpos($browser, "Debian APT/") !== FALSE
      || strpos($browser, "developer fusion") !== FALSE
      || strpos($browser, "netBeans") !== FALSE     ) {
                $rValue = true;
        }
        return $rValue;
   }

  function isExcluded($filename) {
    $exclude_array   = explode(" ", $this->exclude_string);
    for($i = 0; $i < count($exclude_array); $i++) {
      # replace dot with \. since rsync considers it a dot
      $exclude_array[$i] = str_replace(".", "\.", $exclude_array[$i]);

      # replace leading and ending *
      $exclude_array[$i] = preg_replace('(^\*|\*$)', "", $exclude_array[$i]);
      $exclude_array[$i] = str_replace("*", ".*", $exclude_array[$i]);
      if(preg_match("#" . $exclude_array[$i] . "#", $filename)) {
        return true;
        break;
      }
    }
    return false;
  }

  /**
   * Run Stats query, return results as JSON
   * @param string $filename
   * @param string $view_date
   * @param string $view
   * @param string $group
   * @param string $datefrom
   * @param string $dateto
   * @return string JSON string
   * @since 2015-06-19
   * @author droy
   */
  function getStatsJSON($filename=null, $view_date=null, $view=null, $group=null, $datefrom=null, $dateto=null) {
    $App = new App();

    $dateQuery = false;
    if($view == "") {
    	$view = "sum";
    }

    $WHERE 		= "";
    $GROUPBY 	= "";
    $FILESPEC  	= "IDX.file_name";

    if($view_date == "today") {
      $WHERE = $App->addAndIfNotNull($WHERE);
      $WHERE .= " LEFT(DOW.download_date,10) = CURDATE()";
      $dateQuery = true;
    }

    if($view_date == "yesterday") {
      $WHERE = $App->addAndIfNotNull($WHERE);
      $WHERE .= " LEFT(DOW.download_date,10) = DATE_SUB(CURDATE(), INTERVAL 1 DAY)";
      $dateQuery = true;
    }

    if($view_date == "L7") {
      $WHERE = $App->addAndIfNotNull($WHERE);
      $WHERE .= " DOW.download_date > DATE_SUB(CURDATE(), INTERVAL 8 day)";
      $dateQuery = true;
    }

    if($view_date == "L30") {
      $WHERE = $App->addAndIfNotNull($WHERE);
      $WHERE .= " DOW.download_date > DATE_SUB(CURDATE(), INTERVAL 31 day)";
      $dateQuery = true;
    }

    if($datefrom != "" && $dateto != "") {
      $WHERE = $App->addAndIfNotNull($WHERE);
      $WHERE .= " DOW.download_date >= '$datefrom' AND DOW.download_date < '$dateto 23:59:59'";
      $dateQuery = true;
    }

    if($datefrom != "" && $dateto == "") {
      $WHERE = $App->addAndIfNotNull($WHERE);
      $WHERE .= " DOW.download_date >= '$datefrom'";
      $dateQuery = true;
    }

    if($datefrom == "" && $dateto != "") {
      $WHERE = $App->addAndIfNotNull($WHERE);
      $WHERE .= "DOW.download_date <= '$dateto 23:59:59'";
      $dateQuery = true;
    }

    if($group != 1) {
      $GROUPBY = " IDX.file_name";
    }
    else {
      $FILESPEC =" \"File Group\" AS file_name";
    }

    if($view == "daily") {
      if($GROUPBY != "") {
        $GROUPBY .= ",";
      }
      $GROUPBY .= " LEFT(DOW.download_date,10)";
    }
    if($view == "ccode") {
      if($GROUPBY != "") {
        $GROUPBY .= ",";
      }
      $GROUPBY .= " DOW.ccode";
    }



    # Connect to database
    $dbc = new DBConnection();
    $now = $this->microtime_float();
    $dbh = $dbc->connect();

    # fetch oldest stat and total records
    $sql_info = "SELECT LEFT(MIN(download_date),10) as OldestDate, MAX(download_date) AS NewestDate, COUNT(*) AS RecordCount FROM downloads";
    $rs_info = mysql_query($sql_info, $dbh);
   	$myrow_info = mysql_fetch_assoc($rs_info);
   	$intTotalStats = number_format($myrow_info['RecordCount']);
    $sinceDate = $myrow_info['OldestDate'];
    $toDate = $myrow_info['NewestDate'];


    # Fetch the ID's if it's a date-based query
    $aFileID = array();
    $file_id_csv = "";

    if($filename != "") {
      $fileCount = 0;

      $sql = "SELECT IDX.file_id FROM download_file_index AS IDX WHERE IDX.file_name LIKE " . $App->returnQuotedString("%" . $filename . "%");
      $rs = mysql_query($sql, $dbh);
      while($myrow = mysql_fetch_assoc($rs)) {
        array_push($aFileID, $myrow['file_id']);
        $fileCount++;
      }
      $file_id_csv = implode(",", $aFileID);

      if(($fileCount > 5000 && $dateQuery) || ($fileCount > 10000 && !$dateQuery)) {
        die ("Your search includes too many files ($fileCount).  Please refine your search.");
      }
    }

    if($filename != "" && !$dateQuery) {
      $WHERE = $App->addAndIfNotNull($WHERE);
      $WHERE .= " IDX.file_name LIKE " . $App->returnQuotedString("%" . $filename . "%");
    }
    if($dateQuery) {
      $WHERE = $App->addAndIfNotNull($WHERE);
      $WHERE .= " IDX.file_id IN ($file_id_csv)";
    }

    if($WHERE != "") {
     $WHERE = " WHERE " . $WHERE;
    }
    if($GROUPBY != "") {
      $GROUPBY = " GROUP BY " . $GROUPBY;
    }

	/*
   	* End: Build query filter criteria
   	*/

  	/*
   	* Choose the appropriate query, based on the view
   	*
   	*/

    if($view == "sum") {
      if(!$dateQuery) {
        # simplified query based on the download_file_index only
        if($group == 1) {
          $sql = "SELECT $FILESPEC, SUM(download_count) AS file_count FROM download_file_index AS IDX " . $WHERE;
        }
        else {
          $sql = "SELECT $FILESPEC, download_count AS file_count FROM download_file_index AS IDX " . $WHERE . $GROUPBY . " ORDER BY file_count DESC";
        }
      }
      else {
        $sql = "SELECT $FILESPEC, COUNT(DOW.file_id) AS file_count FROM	download_file_index AS IDX LEFT JOIN downloads AS DOW ON DOW.file_id = IDX.file_id"
          . $WHERE . $GROUPBY . " ORDER BY file_count DESC";
      }
    }
    if($view == "daily" ) {
      $sql = "SELECT $FILESPEC, LEFT(DOW.download_date,10) AS download_date, COUNT(DOW.file_id) AS file_count	FROM download_file_index AS IDX
        LEFT JOIN downloads AS DOW ON DOW.file_id = IDX.file_id	" . $WHERE . $GROUPBY . "ORDER BY IDX.file_name, DOW.download_date DESC";
      # $inc_file = "inc/en_stats_daily.php";
	}


	if($view == "ccode") {
      $ORDERBY = " ORDER BY IDX.file_name, file_count DESC";
      if($group == 1) {
        $ORDERBY = " ORDER BY file_count DESC";
      }

      $sql = "SELECT $FILESPEC, DOW.ccode, COU.en_description AS CountryDescription, COUNT(DOW.file_id) AS file_count	FROM download_file_index AS IDX LEFT JOIN downloads AS DOW ON DOW.file_id = IDX.file_id
    	LEFT JOIN SYS_countries AS COU ON COU.ccode = DOW.ccode	" . $WHERE . $GROUPBY . $ORDERBY;

      # $inc_file = "inc/en_stats_ccode.php";
    }

    # Bypass query if no filename specified
    if($filename == "") {
      $sql = "SELECT 'Please specify a file' AS file_name, '' AS file_count";
   	}

    $rs = mysql_query($sql, $dbh);
    $querytime = $this->microtime_float() - $now;

    # build JSON payload
    $rValue = new stdClass();
    $rValue->totalStats = $intTotalStats;
    $rValue->sinceDate = $sinceDate;
    $rValue->toDate = $toDate;
    $rValue->queryTime = $querytime;

    $rows = array();
    while($r = mysql_fetch_assoc($rs)) {
      $rows[] = $r;
    }
    $rValue->rows = $rows;

    # Free up some memory from the hoggers
    unset($rows, $rs, $rs_info, $aFileID);
    $dbc->disconnect();

    return json_encode($rValue);
  }

  function microtime_float() {
    list($usec, $sec) = explode(" ", microtime());
    return ((float)$usec + (float)$sec);
  }

}
?>
