|
|
|
@ -26,14 +26,17 @@ declare(strict_types=1); |
|
|
|
|
|
|
|
namespace OC\Core\Controller; |
|
|
|
|
|
|
|
use OC\KnownUser\KnownUserService; |
|
|
|
use OC\Profile\ProfileManager; |
|
|
|
use OCP\Accounts\IAccountManager; |
|
|
|
use OCP\AppFramework\Controller; |
|
|
|
use OCP\AppFramework\Http\TemplateResponse; |
|
|
|
use OCP\AppFramework\Services\IInitialState; |
|
|
|
use OCP\IGroupManager; |
|
|
|
use OCP\IRequest; |
|
|
|
use OCP\IUserManager; |
|
|
|
use OCP\IUserSession; |
|
|
|
use OC\Profile\ProfileManager; |
|
|
|
use OCP\Share\IManager as IShareManager; |
|
|
|
use OCP\UserStatus\IManager as IUserStatusManager; |
|
|
|
|
|
|
|
class ProfilePageController extends Controller { |
|
|
|
@ -48,6 +51,15 @@ class ProfilePageController extends Controller { |
|
|
|
/** @var ProfileManager */ |
|
|
|
private $profileManager; |
|
|
|
|
|
|
|
/** @var IShareManager */ |
|
|
|
private $shareManager; |
|
|
|
|
|
|
|
/** @var IGroupManager */ |
|
|
|
private $groupManager; |
|
|
|
|
|
|
|
/** @var KnownUserService */ |
|
|
|
private $knownUserService; |
|
|
|
|
|
|
|
/** @var IUserManager */ |
|
|
|
private $userManager; |
|
|
|
|
|
|
|
@ -63,6 +75,9 @@ class ProfilePageController extends Controller { |
|
|
|
IInitialState $initialStateService, |
|
|
|
IAccountManager $accountManager, |
|
|
|
ProfileManager $profileManager, |
|
|
|
IShareManager $shareManager, |
|
|
|
IGroupManager $groupManager, |
|
|
|
KnownUserService $knownUserService, |
|
|
|
IUserManager $userManager, |
|
|
|
IUserSession $userSession, |
|
|
|
IUserStatusManager $userStatusManager |
|
|
|
@ -71,6 +86,9 @@ class ProfilePageController extends Controller { |
|
|
|
$this->initialStateService = $initialStateService; |
|
|
|
$this->accountManager = $accountManager; |
|
|
|
$this->profileManager = $profileManager; |
|
|
|
$this->shareManager = $shareManager; |
|
|
|
$this->groupManager = $groupManager; |
|
|
|
$this->knownUserService = $knownUserService; |
|
|
|
$this->userManager = $userManager; |
|
|
|
$this->userSession = $userSession; |
|
|
|
$this->userStatusManager = $userStatusManager; |
|
|
|
@ -83,13 +101,15 @@ class ProfilePageController extends Controller { |
|
|
|
* @NoSubAdminRequired |
|
|
|
*/ |
|
|
|
public function index(string $targetUserId): TemplateResponse { |
|
|
|
$profileNotFoundTemplate = new TemplateResponse( |
|
|
|
'core', |
|
|
|
'404-profile', |
|
|
|
[], |
|
|
|
TemplateResponse::RENDER_AS_GUEST, |
|
|
|
); |
|
|
|
|
|
|
|
if (!$this->userManager->userExists($targetUserId)) { |
|
|
|
return new TemplateResponse( |
|
|
|
'core', |
|
|
|
'404-profile', |
|
|
|
[], |
|
|
|
TemplateResponse::RENDER_AS_GUEST, |
|
|
|
); |
|
|
|
return $profileNotFoundTemplate; |
|
|
|
} |
|
|
|
|
|
|
|
$visitingUser = $this->userSession->getUser(); |
|
|
|
@ -97,12 +117,37 @@ class ProfilePageController extends Controller { |
|
|
|
$targetAccount = $this->accountManager->getAccount($targetUser); |
|
|
|
|
|
|
|
if (!$this->isProfileEnabled($targetAccount)) { |
|
|
|
return new TemplateResponse( |
|
|
|
'core', |
|
|
|
'404-profile', |
|
|
|
[], |
|
|
|
TemplateResponse::RENDER_AS_GUEST, |
|
|
|
); |
|
|
|
return $profileNotFoundTemplate; |
|
|
|
} |
|
|
|
|
|
|
|
// Run user enumeration checks only if viewing another user's profile
|
|
|
|
if ($targetUser !== $visitingUser) { |
|
|
|
if ($this->shareManager->allowEnumerationFullMatch()) { |
|
|
|
// Full id match is allowed
|
|
|
|
} elseif (!$this->shareManager->allowEnumeration()) { |
|
|
|
return $profileNotFoundTemplate; |
|
|
|
} else { |
|
|
|
if ($this->shareManager->limitEnumerationToGroups() || $this->shareManager->limitEnumerationToPhone()) { |
|
|
|
$targerUserGroupIds = $this->groupManager->getUserGroupIds($targetUser); |
|
|
|
$visitingUserGroupIds = $this->groupManager->getUserGroupIds($visitingUser); |
|
|
|
if ($this->shareManager->limitEnumerationToGroups() && $this->shareManager->limitEnumerationToPhone()) { |
|
|
|
if ( |
|
|
|
empty(array_intersect($targerUserGroupIds, $visitingUserGroupIds)) |
|
|
|
&& !$this->knownUserService->isKnownToUser($targetUser->getUID(), $visitingUser->getUID()) |
|
|
|
) { |
|
|
|
return $profileNotFoundTemplate; |
|
|
|
} |
|
|
|
} elseif ($this->shareManager->limitEnumerationToGroups()) { |
|
|
|
if (empty(array_intersect($targerUserGroupIds, $visitingUserGroupIds))) { |
|
|
|
return $profileNotFoundTemplate; |
|
|
|
} |
|
|
|
} elseif ($this->shareManager->limitEnumerationToPhone()) { |
|
|
|
if (!$this->knownUserService->isKnownToUser($targetUser->getUID(), $visitingUser->getUID())) { |
|
|
|
return $profileNotFoundTemplate; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
$userStatuses = $this->userStatusManager->getUserStatuses([$targetUserId]); |
|
|
|
|