143 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			143 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| namespace SmsGateway\Auth;
 | |
| 
 | |
| use SmsGateway\AuthInterface;
 | |
| use SmsGateway\LoggerInterface;
 | |
| 
 | |
| /**
 | |
|  * Description of FileAuth
 | |
|  *
 | |
|  * @author Gergely Polonkai
 | |
|  */
 | |
| class FileAuth implements AuthInterface
 | |
| {
 | |
|     private $logger;
 | |
| 
 | |
|     private $sendersFile;
 | |
| 
 | |
|     private $tokenFile;
 | |
| 
 | |
|     public function __construct($sendersFile, $tokenFile) {
 | |
|         if ($sendersFile == null) {
 | |
|             throw new \InvalidArgumentException('A senders file path must be passed to the authenticator!');
 | |
|         }
 | |
| 
 | |
|         if (!is_readable($sendersFile)) {
 | |
|             throw new \RuntimeException('senders file not readable!');
 | |
|         }
 | |
| 
 | |
|         if ($tokenFile == null) {
 | |
|             throw new \InvalidArgumentException('A token file path must be passed to the authenticator!');
 | |
|         }
 | |
| 
 | |
|         if (
 | |
|             (
 | |
|                 file_exists($tokenFile)
 | |
|                 && !is_writable($tokenFile)
 | |
|             )
 | |
|             || (
 | |
|                 !file_exists($tokenFile)
 | |
|                 && !is_writable(dirname($tokenFile))
 | |
|             )
 | |
|         ) {
 | |
|             throw new \RuntimeException('Token file is not writable!');
 | |
|         }
 | |
| 
 | |
|         $this->sendersFile = $sendersFile;
 | |
|         $this->tokenFile = $tokenFile;
 | |
|     }
 | |
| 
 | |
|     public function authenticate($username, $password, $ip, $sessionId)
 | |
|     {
 | |
|         $this->logger->auditLog(LoggerInterface::LOG_AUDIT_LOGIN, $username, "trying to authenticate");
 | |
|         $lines = file($this->sendersFile);
 | |
|         foreach ($lines as $line) {
 | |
|             list($user, $cPassword) = explode(':', trim($line), 2);
 | |
|             if ($user == $username) {
 | |
|                 if (crypt($password, $cPassword) == $cPassword) {
 | |
|                     $this->logger->auditLog(LoggerInterface::LOG_AUDIT_LOGIN, $username, "authenticated successfully");
 | |
| 
 | |
|                     return $this->getToken($username, $ip, $sessionId);
 | |
|                 } else {
 | |
|                     $this->logger->auditLog(LoggerInterface::LOG_AUDIT_LOGIN, $username, "authentication failed: bad password");
 | |
|                     return false;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|         return false;
 | |
|     }
 | |
| 
 | |
|     public function getTokenUsername($token, $ip, $sessionId)
 | |
|     {
 | |
|         $lines = file($this->tokenFile);
 | |
|         foreach ($lines as $line) {
 | |
|             list($tokenUser, $tokenIp, $tokenSession, $tokenToken) = explode(':', trim($line), 4);
 | |
|             if (($tokenToken == $token) && ($tokenIp == $ip) && ($tokenSession == $sessionId)) {
 | |
|                 return $tokenUser;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         return null;
 | |
|     }
 | |
| 
 | |
|     public function isTokenValid($token, $ip, $sessionId)
 | |
|     {
 | |
|         $this->logger->auditLog(LoggerInterface::LOG_AUDIT_LOGIN, null, 'Checking token validity');
 | |
| 
 | |
|         $lines = file($this->tokenFile);
 | |
|         foreach ($lines as $line) {
 | |
|             list($tokenUser, $tokenIp, $tokenSession, $tokenToken) = explode(':', trim($line), 4);
 | |
|             if (($tokenToken == $token) && ($tokenIp == $ip) && ($tokenSession == $sessionId)) {
 | |
|                 return true;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         return false;
 | |
|     }
 | |
| 
 | |
|     public function getToken($username, $ip, $sessionId) {
 | |
|         $this->logger->auditLog(LoggerInterface::LOG_AUDIT_LOGIN, $username, "Getting token");
 | |
| 
 | |
|         $lines = file($this->tokenFile);
 | |
|         foreach ($lines as $line) {
 | |
|             list($tokenUser, $tokenIp, $tokenSession, $tokenToken) = explode(':', trim($line), 4);
 | |
|             if (($tokenUser == $username) && ($tokenIp == $ip) && ($tokenSession == $sessionId)) {
 | |
|                 return $tokenToken;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         $token = str_replace(':', '', uniqid('', true));
 | |
|         $fd = fopen($this->tokenFile, 'a');
 | |
|         fwrite($fd, sprintf("%s:%s:%s:%s\n", $username, $ip, $sessionId, $token));
 | |
|         fclose($fd);
 | |
| 
 | |
|         return $token;
 | |
|     }
 | |
| 
 | |
|     public function removeToken($token, $ip, $sessionId) {
 | |
|         $username = $this->getTokenUsername($token, $ip, $sessionId);
 | |
|         $this->logger->auditLog(LoggerInterface::LOG_AUDIT_LOGIN, $username, "Removing token");
 | |
| 
 | |
|         $lines = file($this->tokenFile);
 | |
|         $fd = fopen($this->tokenFile, 'w');
 | |
|         foreach ($lines as $line) {
 | |
|             list($tokenUser, $tokenIp, $tokenSession, $tokenToken) = explode(':', trim($line), 4);
 | |
|             if (($tokenToken != $token) || ($tokenIp != $ip) || ($tokenSession != $sessionId)) {
 | |
|                 fwrite($fd, sprintf("%s:%s:%s:%s\n", $tokenUser, $tokenIp, $tokenSession, $tokenToken));
 | |
|             }
 | |
|         }
 | |
|         fclose($fd);
 | |
| 
 | |
|         return false;
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
|     public function getLogger() {
 | |
|         return $this->logger;
 | |
|     }
 | |
| 
 | |
|     public function setLogger(LoggerInterface $logger) {
 | |
|         $this->logger = $logger;
 | |
|     }
 | |
| }
 |