| <?php | |
| /******************************************************************************* | |
| * Copyright (c) 2015, 2016 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: | |
| * Eric Poirier (Eclipse Foundation) - initial API and implementation | |
| * Chrisotpher Guindon (Eclipse Foundation) | |
| *******************************************************************************/ | |
| require_once("webmaster.class.php"); | |
| class Firewall extends Webmaster { | |
| private $search_results = NULL; | |
| private $all_blocks = NULL; | |
| private $recent_blocks = NULL; | |
| private $period = "12"; | |
| public function __construct(App $App){ | |
| parent::__construct($App); | |
| if ($this->getFormName() === 'webmaster-firewall') { | |
| // Checking the page state | |
| switch ($this->getState()) { | |
| case 'change_recent_blocks_period': | |
| $this->period = filter_var($this->App->getHTTPParameter('period', 'POST'), FILTER_SANITIZE_STRING); | |
| break; | |
| case 'insert_block': | |
| $this->_insertBlock(); | |
| break; | |
| case 'delete_block': | |
| $this->_deleteBlock(); | |
| break; | |
| case 'search_block': | |
| $this->getSearchResults(); | |
| break; | |
| } | |
| } | |
| } | |
| /** | |
| * This function gets the recent blocks | |
| * | |
| * @return array | |
| * */ | |
| public function getRecentBlocks() { | |
| if (is_null($this->recent_blocks)) { | |
| $this->recent_blocks = $this->_fetchBlocks($this->period); | |
| } | |
| return $this->recent_blocks; | |
| } | |
| /** | |
| * This function gets all the blocks from the Attacks table | |
| * | |
| * @return array | |
| * */ | |
| public function getAllBlocks() { | |
| if (is_null($this->all_blocks)) { | |
| $this->all_blocks = $this->_fetchBlocks(); | |
| } | |
| return $this->all_blocks; | |
| } | |
| /** | |
| * This function gets all the search results from the Attacks table | |
| * | |
| * @return array | |
| * */ | |
| public function getSearchResults() { | |
| if (is_null($this->search_results) && $this->getState() === 'search_block') { | |
| $this->_searchBlocks(); | |
| } | |
| return $this->search_results; | |
| } | |
| /** | |
| * This function deletes a blocked row from the Attacks table | |
| * */ | |
| private function _deleteBlock() { | |
| $subnet = filter_var($this->App->getHTTPParameter('subnet_to_delete', 'POST'), FILTER_SANITIZE_STRING); | |
| if ($this->_isValidIp($subnet)) { | |
| $sql = "DELETE FROM Attacks | |
| WHERE Subnet = " . $this->App->returnQuotedString($this->App->sqlSanitize($subnet)); | |
| $delete = $this->App->infra_sql($sql); | |
| $this->_updateStats($subnet,'0'); | |
| $this->App->setSystemMessage('delete_block','You have successfully deleted the blocked subnet: ' . $subnet . '.', 'success'); | |
| return TRUE; | |
| } | |
| $this->App->setSystemMessage('delete_block','There was a problem blocking the subnet: ' . $subnet . '.', 'danger'); | |
| return FALSE; | |
| } | |
| /** | |
| * This function updates the Stats table | |
| * | |
| * @param $subnet contains a string | |
| * @param $blocking contains a string of either 1 or 0 | |
| * */ | |
| private function _updateStats($subnet, $blocking_option) { | |
| if ($this->_isValidIp($subnet)) { | |
| // By default we assume we're inserting a block | |
| $blocking_where = "0"; | |
| $count = ""; | |
| // But if we're deleting a block | |
| if ($blocking_option === "0") { | |
| $blocking_where = "1"; | |
| $count = ", Count = (Count-1)"; | |
| } | |
| $sql = "UPDATE Stats | |
| SET Blocking = ". $this->App->sqlSanitize($blocking_option) . $this->App->sqlSanitize($count) . " | |
| WHERE Blocking = ". $this->App->sqlSanitize($blocking_where) ." | |
| AND Subnet = " . $this->App->returnQuotedString($this->App->sqlSanitize($subnet)); | |
| $update = $this->App->infra_sql($sql); | |
| } | |
| } | |
| /** | |
| * This function fetches recent blocks based on a number of hours | |
| * | |
| * @param $period | |
| * | |
| * @return array | |
| * */ | |
| private function _fetchBlocks($period = "") { | |
| if (empty($period)) { | |
| $this->App->setSystemMessage('fetch_blocks','Please select a period of time.', 'danger'); | |
| return; | |
| } | |
| $sql = "SELECT * FROM Attacks"; | |
| if ($period != "") { | |
| $sql .= " WHERE AttackDateTime > DATE_SUB(NOW(), INTERVAL " . $this->App->sqlSanitize($period) . " HOUR)"; | |
| } | |
| $sql .= " ORDER BY AttackDateTime DESC"; | |
| $result = $this->App->infra_sql($sql); | |
| $recent_blocks = array(); | |
| while ($row = mysql_fetch_array($result)) { | |
| $recent_blocks[] = $row; | |
| } | |
| if (empty($recent_blocks)) { | |
| return "There weren't any blocks whitin the past <strong>". $period ." hours</strong>."; | |
| } | |
| return $recent_blocks; | |
| } | |
| /** | |
| * This function validates an IP addresses or Subnets | |
| * | |
| * @return bool | |
| * */ | |
| private function _isValidIp($ip) { | |
| if (!empty($ip) && $ip != '0.0.0.0'){ | |
| if (preg_match("/^[1-9][0-9]{0,2}(\.[0-9]{1,3}){3}$/",$ip) == 1) { | |
| return TRUE; | |
| } | |
| } | |
| $msg = "The IP " . $ip." is not valid."; | |
| if (empty($ip)) { | |
| $msg = "You need to enter an IP address."; | |
| } | |
| $this->App->setSystemMessage('validate_ip',$msg,"danger"); | |
| return FALSE; | |
| } | |
| /** | |
| * This function inserts or update attacking ip in the attacks table | |
| * | |
| */ | |
| private function _insertBlock() { | |
| $ip = filter_var($this->App->getHTTPParameter('insert_block_ip', 'POST'), FILTER_SANITIZE_STRING); | |
| $time = strtoupper(str_replace('_', ' ', filter_var($this->App->getHTTPParameter('insert_block_time', 'POST'), FILTER_SANITIZE_STRING))); | |
| $port = filter_var($this->App->getHTTPParameter('insert_block_port', 'POST'), FILTER_SANITIZE_STRING); | |
| if ($port != "22") { | |
| $port = "0"; | |
| } | |
| if (empty($time) && !filter_var($time, FILTER_SANITIZE_STRING)) { | |
| $msg_type = "danger"; | |
| $msg = "Please select a valid amount of time for the ip to be blocked."; | |
| } | |
| // Making sure the ip is valid | |
| if ($this->_isValidIp($ip) && !(isset($msg_type) && $msg_type == 'danger')) { | |
| // getting the subnet | |
| $exploded_ip = explode('.',$ip); | |
| $subnet = $exploded_ip[0].".".$exploded_ip[1].".".$exploded_ip[2].".0"; | |
| $sql = "INSERT INTO Attacks | |
| (AttackingIp,Subnet,Port,AttackDateTime,ExpiryDateTime,UserID,VictimNode) | |
| VALUES ( | |
| ".$this->App->returnQuotedString($this->App->sqlSanitize($ip)).", | |
| ".$this->App->returnQuotedString($this->App->sqlSanitize($subnet)).", | |
| " . $this->App->returnQuotedString($this->App->sqlSanitize($port)) .", | |
| NOW(), | |
| DATE_ADD(NOW(), INTERVAL ". $this->App->sqlSanitize($time) ."), | |
| 'Webmaster', | |
| 'Portal' | |
| ) | |
| ON DUPLICATE KEY | |
| UPDATE | |
| AttackDateTime = NOW(), | |
| ExpiryDateTime = DATE_ADD(NOW(), INTERVAL ". $this->App->sqlSanitize($time) .")"; | |
| $insert = $this->App->infra_sql($sql); | |
| $this->_updateStats($subnet, '1'); | |
| $msg_type = "success"; | |
| $msg = "You have successfully blocked <strong>" . $ip . "</strong> for <strong>" . $time . "</strong>."; | |
| } | |
| $this->App->setSystemMessage('insert_block', $msg, $msg_type); | |
| } | |
| /** | |
| * This function returns an array of blocked IP addresses or Subnets | |
| * | |
| * @return array | |
| * */ | |
| private function _searchBlocks() { | |
| $ip = filter_var($this->App->getHTTPParameter('search_block_ip', 'POST'), FILTER_SANITIZE_STRING); | |
| $search_results = array(); | |
| if ($this->_isValidIp($ip)) { | |
| $sql = "SELECT DISTINCT | |
| Subnet,Port,UserID,VictimNode,AttackDateTime,ExpiryDateTime | |
| FROM Attacks | |
| WHERE (Subnet = " . $this->App->returnQuotedString($this->App->sqlSanitize($ip)) . " | |
| OR AttackingIp = " . $this->App->returnQuotedString($this->App->sqlSanitize($ip)) . ") | |
| ORDER BY AttackDateTime DESC"; | |
| $result = $this->App->infra_sql($sql); | |
| while ($row = mysql_fetch_array($result)) { | |
| $search_results[] = $row; | |
| } | |
| } | |
| $this->search_results = $search_results; | |
| return $search_results; | |
| } | |
| } |