directoryList->getPath(DirectoryList::VAR_DIR) . '/' . self::VAR_SUBDIR; } public function getPidFilePath(string $tunnelId): string { return $this->getVarTunnelDir() . '/' . $this->sanitizeId($tunnelId) . '.pid'; } public function getKeyFilePath(string $tunnelId): string { return $this->getVarTunnelDir() . '/' . $this->sanitizeId($tunnelId) . '.key'; } public function getLogFilePath(string $tunnelId): string { return $this->directoryList->getPath(DirectoryList::LOG) . '/magesail_tunnel_' . $this->sanitizeId($tunnelId) . '.log'; } /** * Legacy single-tunnel paths (pre multi-tunnel). */ public function getLegacyPidFilePath(): string { return $this->directoryList->getPath(DirectoryList::VAR_DIR) . '/magesail.pid'; } public function getLegacyKeyFilePath(): string { return $this->directoryList->getPath(DirectoryList::VAR_DIR) . '/magesail.key'; } public function getLegacyLogFilePath(): string { return $this->directoryList->getPath(DirectoryList::LOG) . '/magesail_tunnel.log'; } private function sanitizeId(string $tunnelId): string { return preg_replace('/[^a-zA-Z0-9_-]/', '', $tunnelId) ?: 'invalid'; } }