<?php
/**
* Access file (.htaccess and hosts.deny) update class.
*
* @author Rolands Kusiņš
* @license GPL
*
*/
class AccessUpdate{
// Log object to write some info in log files
public $log = null;
/**
* Update Apache access file with "Deny from" entries
*
* @param string $path
* @param array $blacklistedIps
*/
public function updateApacheAccessFile(&$path, &$blacklistedIps){
$newContents = "";
$alreadyInFile = array();
// Open access file
$f = @fopen($path,"r");
if($f){
// Check which lines we need to keep and which ones we need to remove
while(!feof($f)){
// Read line
$line = fgets($f,4096);
// We are interested only in lines that contain "deny from"
if(preg_match("/deny from/i", $line)){
// Trim whitespaces
$line = trim($line);
// Split by space or whitespace
$parts = preg_split("/\s+/", $line);
foreach($parts as &$part){
if(ip2long($part) !== false){
// Check if ip that is written in access file is in blacklist
if(in_array($part, $blacklistedIps)){
$newContents .= $line."\n";
$alreadyInFile[] = $part;
}
}
}
} else{
$newContents .= $line;
}
// Slepp for 1 microsecond (so that we don't take all CPU resources and leave small part for other processes
usleep(1);
}
// Append with new "Deny from" entries
foreach($blacklistedIps as &$blacklistedIp){
if(!in_array($blacklistedIp,$alreadyInFile)){
$newContents .= "Deny from ".$blacklistedIp."\n";
}
}
// Close file
@fclose($f);
// Writing new contents to file
file_put_contents($path, $newContents);
}
}
/**
* Update hosts.deny file with "sshd: " entries
*
* @param string $path
* @param array $blacklistedIps
*/
public function updateHostsDenyFile(&$path, &$blacklistedIps){
$newContents = "";
$alreadyInFile = array();
// Open hosts.deny file
$f = @fopen($path,"r");
if($f){
// Check which lines we need to keep and which ones we need to remove
while(!feof($f)){
// Read line
$line = fgets($f,4096);
// We are interested only in lines that contain "sshd"
if(preg_match("/sshd/i", $line)){
// Trim whitespaces
$line = trim($line);
// Split by space or whitespace
$parts = preg_split("/\s+/", $line);
foreach($parts as &$part){
if(ip2long($part) !== false){
// If ip that is written in access file is in blacklist
if(in_array($part, $blacklistedIps)){
$newContents .= $line."\n";
$alreadyInFile[] = $part;
}
}
}
} else{
$newContents .= $line;
}
// Slepp for 1 microsecond (so that we don't take all CPU resources and leave small part for other processes
usleep(1);
}
// Append with new "Deny from" entries
foreach($blacklistedIps as &$blacklistedIp){
if(!in_array($blacklistedIp,$alreadyInFile)){
$newContents .= "sshd: ".$blacklistedIp."\n";
}
}
// Close file
@fclose($f);
// Writing new contents to file
file_put_contents($path, $newContents);
}
}
}
?>
|