albumsQuery->getAlbumByLink($token); if (!$album) { return new TemplateResponse('core', '404', [], 'guest'); } // Check if the current user has access to the album // Just redirect to the user's page if the user is the owner or a collaborator if ($user = $this->userSession->getUser()) { $uid = $user->getUID(); $albumId = (int) $album['album_id']; if ($uid === $album['user'] || $this->albumsQuery->userIsCollaborator($uid, $albumId)) { $idStr = $album['user'].'/'.$album['name']; $url = $this->urlGenerator->linkToRoute('memories.Page.albums', [ 'id' => $idStr, // id of album 'noinit' => 1, // prevent showing first-start page ]); return new RedirectResponse($url); } } // Browse anonymously if the album is accessed as a link \OC_User::setIncognitoMode(true); // Add OG metadata $this->addOgMetadata($album, $token); // Scripts Util::addScript(Application::APPNAME, 'memories-main'); // Get page title $shareTitle = $album['name']; if (str_starts_with($shareTitle, '.link-')) { $shareTitle = $this->l10n->t('Shared Link'); } // Share info $this->initialState->provideInitialState('share_title', $shareTitle); $this->initialState->provideInitialState('share_type', 'album'); // Render main template $response = new PublicTemplateResponse(Application::APPNAME, 'main', PageController::getMainParams()); $response->setHeaderTitle($shareTitle); $response->setFooterVisible(false); // wth is that anyway? $response->setContentSecurityPolicy(PageController::getCSP()); // Add download link $dlUrl = $this->urlGenerator->linkToRoute('memories.PublicAlbum.download', [ 'token' => $token, // share identification 'albums' => 1, // identify backend for share ]); $dlAction = new LinkMenuAction($this->l10n->t('Download'), 'icon-download', $dlUrl); $response->setHeaderActions([$dlAction]); return $response; } /** * @PublicPage * * @NoCSRFRequired */ public function download(string $token): Response { $album = $this->albumsQuery->getAlbumByLink($token); if (!$album) { return new TemplateResponse('core', '404', [], 'guest'); } // Get list of files $albumId = (int) $album['album_id']; $files = $this->albumsQuery->getAlbumPhotos($albumId, null); $fileIds = array_map(static fn ($file) => (int) $file['file_id'], $files); // Get download handle $downloadController = \OC::$server->get(\OCA\Memories\Controller\DownloadController::class); $handle = $downloadController::createHandle($album['name'], $fileIds); // Start download return $downloadController->file($handle); } private function addOgMetadata(array $album, string $token): void { $fileId = (int) $album['last_added_photo']; $albumId = (int) $album['album_id']; $owner = $this->albumsQuery->hasFile($albumId, $fileId); if (!$owner) { return; } $nodes = $this->rootFolder->getUserFolder($owner)->getById($fileId); if (0 === \count($nodes)) { return; } $node = $nodes[0]; $params = ['token' => $token]; $url = $this->urlGenerator->linkToRouteAbsolute('memories.PublicAlbum.showShare', $params); \OCA\Memories\Util::addOGMetadata($node, $album['name'], $url, array_merge($params, ['albums' => true])); } }