Skip to content

fix(photos): preserve source page after photo deletion - #1777

Open
mrksbgg wants to merge 2 commits into
OpenVK:masterfrom
mrksbgg:fix/photo-delete-redirect
Open

mrksbgg wants to merge 2 commits into
OpenVK:masterfrom
mrksbgg:fix/photo-delete-redirect

Conversation

@mrksbgg

@mrksbgg mrksbgg commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

если в настройках основной страницы стояла лента, при удалении фото со страницы, отправляло на /feed вместо страницы юзера из-за того, что /id0 отправляет в ленту

не знаю, является ли поведение отправки /id0 в ленту при значении Main page - My feed, вместо страницы пользователя (хз, как будто должно быть в любом случае id0 = текущий юзер, не?)

im so fucking confused

@fayzetwin1 fayzetwin1 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

в целом все круто, но мне кажется стоит кое-что подправить


if (is_string($returnTo) && $returnTo !== "") {
$parsedReturnTo = parse_url($returnTo);
if ($parsedReturnTo !== false && !isset($parsedReturnTo["host"]) && str_starts_with($returnTo, "/") && !str_starts_with($returnTo, "//")) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

я бы предпочел брать путь более строгим путем или проверять регуляркой типа:
!str_starts_with($returnTo, '//') && !str_starts_with($returnTo, '/\\')

насколько я помню parse_url в PHP в некоторых случаях работает не всегда точно
то есть, грубо говоря, я бы добавил еще проверку на !str_starts_with($returnTo, "/\\")

$parsedReturnTo = parse_url($returnTo);
if ($parsedReturnTo !== false && !isset($parsedReturnTo["host"]) && str_starts_with($returnTo, "/") && !str_starts_with($returnTo, "//")) {
$redirect = $returnTo;
} elseif ($parsedReturnTo !== false && isset($parsedReturnTo["host"])) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

по сути оно делает то же самое - берет сугубо $parsedReturnTo["path"] и отбрасывает хост

для простоты я считаю можно просто разрешать только безопасные относительные пути без протоколов и доменов

к примеру:

   if (
       is_string($returnTo) 
       && str_starts_with($returnTo, "/") 
       && !str_starts_with($returnTo, "//") 
       && !str_starts_with($returnTo, "/\\")
   ) {
       $parsed = parse_url($returnTo);
       if ($parsed !== false && !isset($parsed["scheme"]) && !isset($parsed["host"])) {
           $redirect =$returnTo;
       }
   }

<div n:if="isset($thisUser) && $thisUser->getId() === $photo->getOwner()->getId()">
<a href="/photo{$photo->getPrettyId()}/edit" class="profile_link" style="display:block;width:96%;">{_edit}</a>
<a id="_photoDelete" href="/photo{$photo->getPrettyId()}/delete" class="profile_link" style="display:block;width:96%;">{_delete}</a>
<a id="_photoDelete" href="/photo{$photo->getPrettyId()}/delete{ifset $_SERVER['HTTP_REFERER']}?return_to={rawurlencode($_SERVER['HTTP_REFERER'])}{/ifset}" class="profile_link" style="display:block;width:96%;">{_delete}</a>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

реферер может содержать чисто в теории что-то лишнее (внешний сайт условно говоря), и ссылка в шаблоне может тогда содержать лишний мусор

мне кажется реферер можно определять прямо в PhotosPresenter через $this->getHttpRequest()->getReferer() как fallback если мы не передали return_to

@fayzetwin1

Copy link
Copy Markdown
Contributor

..или если не хочется делать велосипед (а его и не надо делать) и если баг был только в том, что /id0 редиректит в ленту из-за настроек главной страницы, то весь этот блок с query-параметрами и валидацией хостов лишний

то есть заменить в fallback хардкод на реальный url овнера:

if (!is_null($album =$photo->getAlbum())) {
    $redirect = '/album' .$album->getPrettyId();
} else {
    $redirect =$photo->getOwner()->getURL();
}

@fayzetwin1

Copy link
Copy Markdown
Contributor

если так можно конечно ибо я сам хз чуть-чуть

@mrksbgg

mrksbgg commented Sep 12, 2026

Copy link
Copy Markdown
Contributor Author

я так понял, /id0 кидает на / либо на свою страницу в зависимости от выбора главной страницы
конечно слегка не понятен прикол, зачем после удаления фотографии отправлять на /d0
ну и велосипед конечно я создаю

fayzetwin, я изучу твои комментарии и постараюсь поправить этот ужас

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants