service = $service; $this->urlGenerator = $urlGenerator; $this->userSession = $userSession; $this->api = $api; $this->permission = $permission; } public function setToken(string $token) { $this->token = $token; $this->room = null; } public function isValidToken(): bool { $room = $this->getRoom(); return $room !== null; } /** * @PublicPage * @NoCSRFRequired */ public function index($displayname, $u = '', $filename = '', $password = '') { $room = $this->getRoom(); if ($room === null) { throw new NotFoundException(); } $displayname = trim($displayname); $userId = null; $presentation = null; if ($this->userSession->isLoggedIn()) { $user = $this->userSession->getUser(); $displayname = $user->getDisplayName(); $userId = $user->getUID(); if ($room->access == Room::ACCESS_INTERNAL_RESTRICTED && !$this->permission->isUser($room, $userId)) { throw new NoPermissionException(); } if ($this->permission->isAdmin($room, $userId)) { $presentation = new Presentation($u, $filename); } } elseif ($room->access === Room::ACCESS_INTERNAL || $room->access == Room::ACCESS_INTERNAL_RESTRICTED) { return new RedirectResponse( $this->urlGenerator->linkToRoute('core.login.showLoginForm', [ 'redirect_url' => $this->urlGenerator->linkToRoute( 'bbb.join.index', ['token' => $this->token] ), ]) ); } elseif (empty($displayname) || strlen($displayname) < 3 || ($room->access === Room::ACCESS_PASSWORD && $password !== $room->password)) { $response = new TemplateResponse($this->appName, 'join', [ 'room' => $room->name, 'wrongdisplayname' => !empty($displayname) && strlen($displayname) < 3, 'passwordRequired' => $room->access === Room::ACCESS_PASSWORD, 'wrongPassword' => $password !== $room->password && $password !== '', ], 'guest'); return $response; } if ($room->requireModerator && ($userId === null || !$this->permission->isModerator($room, $userId)) && !$this->api->isRunning($room)) { return new TemplateResponse($this->appName, 'waiting', [ 'room' => $room->name, 'name' => $displayname, ], 'guest'); } $creationDate = $this->api->createMeeting($room, $presentation); $joinUrl = $this->api->createJoinUrl($room, $creationDate, $displayname, $userId); \OCP\Util::addHeader('meta', ['http-equiv' => 'refresh', 'content' => '3;url='.$joinUrl]); return new TemplateResponse($this->appName, 'forward', [ 'room' => $room->name, 'url' => $joinUrl, ], 'guest'); } private function getRoom(): ?Room { if ($this->room === null) { $this->room = $this->service->findByUid($this->token); } return $this->room; } }