| 
<?php
 /**
 * This file is part of the PHP Generics package.
 *
 * @package Generics
 */
 namespace Generics\Util;
 
 use Generics\GenericsException;
 use Generics\Client\HttpStatus;
 
 /**
 * This class provides http basic auth provider
 *
 * @author Maik Greubel <[email protected]>
 *
 */
 class BasicAuth
 {
 
 /**
 * The basic auth user
 *
 * @var string
 */
 private $user;
 
 /**
 * The basic auth password
 *
 * @var string
 */
 private $password;
 
 /**
 * The list of files to skip authentication
 *
 * @var array
 */
 private $whitelist;
 
 /**
 * Realm name
 *
 * @var string
 */
 private $realm;
 
 /**
 * Create a new basic auth instance
 *
 * @param string $user
 *            The username
 * @param string $password
 *            The password
 * @param array $whitelist
 *            The list of files to skip authentication
 * @param string $realm
 *            The name of the realm
 */
 public function __construct($user, $password, $whitelist = array(), $realm = "Authentication realm")
 {
 $this->user = $user;
 $this->password = $password;
 $this->whitelist = $whitelist;
 $this->realm = $realm;
 }
 
 /**
 * Perform authentication
 *
 * @param string $file
 * @throws GenericsException
 * @return bool
 */
 public function auth($file = ''): bool
 {
 if (php_sapi_name() == 'cli') {
 throw new GenericsException("CLI does not support basic auth!");
 }
 
 if ($file && in_array($file, $this->whitelist)) {
 return true;
 }
 
 $user = null;
 $password = null;
 
 if (isset($_SERVER['PHP_AUTH_USER'])) {
 $user = $_SERVER['PHP_AUTH_USER'];
 }
 if (isset($_SERVER['PHP_AUTH_PW'])) {
 $password = $_SERVER['PHP_AUTH_PW'];
 }
 
 if ($user && $password && $user == $this->user && $password == $this->password) {
 return true;
 }
 
 $httpStatus = new HttpStatus(401, '1.0');
 header('WWW-Authenticate: Basic realm=' . $this->realm);
 header(sprintf('HTTP/%s', $httpStatus));
 echo "Forbidden!";
 return false;
 }
 }
 
 |