1<?php 2 3namespace Sabre\DAV\Auth\Backend; 4 5use Sabre\DAV; 6 7/** 8 * This is an authentication backend that uses a file to manage passwords. 9 * 10 * The backend file must conform to Apache's htdigest format 11 * 12 * @copyright Copyright (C) fruux GmbH (https://fruux.com/) 13 * @author Evert Pot (http://evertpot.com/) 14 * @license http://sabre.io/license/ Modified BSD License 15 */ 16class File extends AbstractDigest { 17 18 /** 19 * List of users 20 * 21 * @var array 22 */ 23 protected $users = []; 24 25 /** 26 * Creates the backend object. 27 * 28 * If the filename argument is passed in, it will parse out the specified file first. 29 * 30 * @param string|null $filename 31 */ 32 function __construct($filename = null) { 33 34 if (!is_null($filename)) 35 $this->loadFile($filename); 36 37 } 38 39 /** 40 * Loads an htdigest-formatted file. This method can be called multiple times if 41 * more than 1 file is used. 42 * 43 * @param string $filename 44 * @return void 45 */ 46 function loadFile($filename) { 47 48 foreach (file($filename, FILE_IGNORE_NEW_LINES) as $line) { 49 50 if (substr_count($line, ":") !== 2) 51 throw new DAV\Exception('Malformed htdigest file. Every line should contain 2 colons'); 52 53 list($username, $realm, $A1) = explode(':', $line); 54 55 if (!preg_match('/^[a-zA-Z0-9]{32}$/', $A1)) 56 throw new DAV\Exception('Malformed htdigest file. Invalid md5 hash'); 57 58 $this->users[$realm . ':' . $username] = $A1; 59 60 } 61 62 } 63 64 /** 65 * Returns a users' information 66 * 67 * @param string $realm 68 * @param string $username 69 * @return string 70 */ 71 function getDigestHash($realm, $username) { 72 73 return isset($this->users[$realm . ':' . $username]) ? $this->users[$realm . ':' . $username] : false; 74 75 } 76 77} 78