You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					123 lines
				
				2.9 KiB
			
		
		
			
		
	
	
					123 lines
				
				2.9 KiB
			| 
											2 years ago
										 | <?php | ||
|  | 
 | ||
|  | /* | ||
|  |  * This file is part of the FileGator package. | ||
|  |  * | ||
|  |  * (c) Milos Stojanovic <alcalbg@gmail.com> | ||
|  |  * | ||
|  |  * For the full copyright and license information, please view the LICENSE file | ||
|  |  */ | ||
|  | 
 | ||
|  | namespace Filegator\Services\Auth\Adapters; | ||
|  | 
 | ||
|  | use Filegator\Services\Auth\AuthInterface; | ||
|  | use Filegator\Services\Auth\User; | ||
|  | use Filegator\Services\Auth\UsersCollection; | ||
|  | use Filegator\Services\Service; | ||
|  | use function Hestiacp\quoteshellarg\quoteshellarg; | ||
|  | 
 | ||
|  | /** | ||
|  |  * @codeCoverageIgnore | ||
|  |  */ | ||
|  | class HestiaAuth implements Service, AuthInterface { | ||
|  | 	protected $permissions = []; | ||
|  | 
 | ||
|  | 	protected $private_repos = false; | ||
|  | 
 | ||
|  | 	protected $hestia_user = ""; | ||
|  | 
 | ||
|  | 	public function init(array $config = []) { | ||
|  | 		if (isset($_SESSION["user"])) { | ||
|  | 			$v_user = $_SESSION["user"]; | ||
|  | 		} | ||
|  | 		if (!empty($_SESSION["look"])) { | ||
|  | 			if (isset($_SESSION["look"]) && $_SESSION["userContext"] === "admin") { | ||
|  | 				$v_user = $_SESSION["look"]; | ||
|  | 			} | ||
|  | 			if ( | ||
|  | 				$_SESSION["look"] == "admin" && | ||
|  | 				$_SESSION["POLICY_SYSTEM_PROTECTED_ADMIN"] == "yes" | ||
|  | 			) { | ||
|  | 				// Go away do not login | ||
|  | 				header("Location: /"); | ||
|  | 				exit(); | ||
|  | 			} | ||
|  | 		} | ||
|  | 		$this->hestia_user = $v_user; | ||
|  | 		$this->permissions = isset($config["permissions"]) ? (array) $config["permissions"] : []; | ||
|  | 		$this->private_repos = isset($config["private_repos"]) | ||
|  | 			? (bool) $config["private_repos"] | ||
|  | 			: false; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function user(): ?User { | ||
|  | 		$cmd = "/usr/bin/sudo /usr/local/hestia/bin/v-list-user"; | ||
|  | 		exec($cmd . " " . quoteshellarg($this->hestia_user) . " json", $output, $return_var); | ||
|  | 
 | ||
|  | 		if ($return_var == 0) { | ||
|  | 			$data = json_decode(implode("", $output), true); | ||
|  | 			$hestia_user_info = $data[$this->hestia_user]; | ||
|  | 			return $this->transformUser($hestia_user_info); | ||
|  | 		} | ||
|  | 
 | ||
|  | 		return $this->getGuest(); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function transformUser($hstuser): User { | ||
|  | 		$user = new User(); | ||
|  | 		$user->setUsername($this->hestia_user); | ||
|  | 		$user->setName($this->hestia_user . " (" . $hstuser["NAME"] . ")"); | ||
|  | 		$user->setRole("user"); | ||
|  | 		$user->setPermissions($this->permissions); | ||
|  | 		$user->setHomedir("/"); | ||
|  | 		return $user; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function authenticate($username, $password): bool { | ||
|  | 		# Auth is handled by Hestia | ||
|  | 		return false; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function forget() { | ||
|  | 		// Logout return to Hestia | ||
|  | 		return $this->getGuest(); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function store(User $user) { | ||
|  | 		return null; // not used | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function update($username, User $user, $password = ""): User { | ||
|  | 		// Password change is handled by Hestia | ||
|  | 		return $this->user(); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function add(User $user, $password): User { | ||
|  | 		return new User(); // not used | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function delete(User $user) { | ||
|  | 		return true; // not used | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function find($username): ?User { | ||
|  | 		return null; // not used | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function allUsers(): UsersCollection { | ||
|  | 		return new UsersCollection(); // not used | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function getGuest(): User { | ||
|  | 		$guest = new User(); | ||
|  | 
 | ||
|  | 		$guest->setUsername("guest"); | ||
|  | 		$guest->setName("Guest"); | ||
|  | 		$guest->setRole("guest"); | ||
|  | 		$guest->setHomedir("/"); | ||
|  | 		$guest->setPermissions([]); | ||
|  | 
 | ||
|  | 		return $guest; | ||
|  | 	} | ||
|  | } |