api_endpoint = rtrim(trim($api_endpoint), '/'); } if (self::validateVaultToken($token)) { $this->token = $token; } } /** * Function returns Vault secret. Assumes given $path is correct. * * @param string $path Path to secret. * * @throws Exception in case of configuration is not set. * * @return array */ public function loadSecret(string $path): array { if ($this->token === '') { throw new Exception(_('Incorrect Vault token.')); } $options = [ 'http' => [ 'method' => 'GET', 'header' => "X-Vault-Token: $this->token\r\n", 'ignore_errors' => true ] ]; try { $url = $this->getURL($path); } catch (Exception $e) { error($e->getMessage()); return []; } $secret = @file_get_contents($url, false, stream_context_create($options)); if ($secret === false) { return []; } $secret = json_decode($secret, true); if (is_array($secret) && array_key_exists('data', $secret) && is_array($secret['data']) && array_key_exists('data', $secret['data']) && is_array($secret['data']['data'])) { return $secret['data']['data']; } else { return []; } } /** * Function validates if given string is valid API endpoint. * * @param string $api_endpoint * * @return bool */ public static function validateVaultApiEndpoint(string $api_endpoint): bool { $url_parts = parse_url($api_endpoint); if (!$url_parts || !array_key_exists('host', $url_parts)) { error(_s('Provided URL "%1$s" is invalid.', $api_endpoint)); return false; } return true; } /** * Function validates if token is not empty string. * * @param string $token * * @return bool */ public static function validateVaultToken(string $token): bool { return (trim($token) !== ''); } /** * Function returns Vault API request URL including path to secret. * * @param string $secret_path * * @throws Exception in case of configuration is not set. * * @return string */ public function getURL(string $path): string { if ($this->api_endpoint === '') { throw new Exception(_('Incorrect Vault API endpoint.')); } $path = explode('/', $path); array_splice($path, 1, 0, 'data'); return $this->api_endpoint.'/v1/'.implode('/', $path); } }