<?php
/*******************************************************************************
 * Copyright (c) 2014, 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:
 *    Matt Ward (Eclipse Foundation) - initial API and implementation
 *    Christopher Guindon (Eclipse Foundation)
 *******************************************************************************/

require_once(realpath(dirname(__FILE__) . "/../../system/app.class.php"));
require_once(realpath(dirname(__FILE__) . "/../friends/friend.class.php"));
require_once('/home/data/httpd/eclipse-php-classes/system/dbconnection_infra_ro.class.php');


class InfraBlock {

  private $App = NULL;

  private $IsCommittter = NULL;

  private $Friend = NULL;

  private $Expiry = "";

  private $Subnet = "";

  /**
   * Constructor
   */
  function __construct() {

    global $App;
    $this->App = $App;
    $this->Session = $this->App->useSession();
    $this->Friend = $this->Session->getFriend();

    $this->IsCommitter = $this->Friend->getIsCommitter();

  }

  /**
   * isBlocked
   *
   * @ returns a bool indicating block status of the given IP.
   */
  public function isBlocked(){
    $rvalue = FALSE;
    $subnet = $this->App->getRemoteIPAddress();
    //test if we have something that looks like an ip
    if ( preg_match('/[1-9]{1,3}\.(([0-9]{1,3}\.?){3})/', $subnet )) {
      if ($this->IsCommitter) {
        //strip last address chunk, and replace with 0
        $this->Subnet = substr_replace($subnet,'.0',strrpos($subnet,'.') );
        $sql = "SELECT /* USE MASTER */ COUNT(1) AS BlockCount,ExpiryDateTime FROM Attacks WHERE Subnet= " . $this->App->returnQuotedString($this->Subnet);
        $rs = $this->App->infra_sql($sql);
        $myrow = mysql_fetch_assoc($rs);
        if ($myrow['BlockCount'] > 0) {
          //stash the expiry time
          $this->Expiry = $myrow['ExpiryDateTime'];
          $rvalue = TRUE;
        }
      }
    }
    return $rvalue;
  }

  /**
   * getExpiry
   *
   * @ returns the value stashed in isBlocked.
   */
  public function getExpiry(){
    return $this->Expiry;
  }

  /**
   * whyBlocked
   *
   * @ returns a string which attempts to explain why you are blocked.
   */
  public function whyBlocked() {
    //by default someone else was doing something they shouldn't have
    $rvalue = " due to apparent abuse from your network. Contact webmaster@eclipse.org for asstisance, or wait for the block to expire.";
    //did you try to login?
    $sql = "SELECT /* USE MASTER */ COUNT(1) AS RecordCount, UserID FROM UserSSHTrustedSubnets WHERE Subnet= " . $this->App->returnQuotedString($this->Subnet) ." AND AuthReplyEmail IS NULL" ;
    $rs = $this->App->infra_sql($sql);
    $myrow = mysql_fetch_assoc($rs);
    if ($myrow['RecordCount'] > 0) {
      //caused by the same user?
      if (strcasecmp($myrow['UserID'], $this->Friend->getUID()) == 0) {
        $rvalue = " due to a login from a new network.  Please check your email for the unblock message.";
      } else {
        $rvalue = " due to another committers login from a new network.  Either wait for them to respond to the unlock mail or contact webmaster@eclipse.org .";
      }
    }
    return $rvalue;
  }

}
