request = $request; $this->session = $session; $this->config = $config; $this->validator = $validator; $this->l10n = $l10n; } /** @var \Closure[] */ private $consumersClosures = []; /** @var IConsumer[] */ private $consumers = []; /** * @return \OCP\Activity\IConsumer[] */ protected function getConsumers(): array { if (!empty($this->consumers)) { return $this->consumers; } $this->consumers = []; foreach ($this->consumersClosures as $consumer) { $c = $consumer(); if ($c instanceof IConsumer) { $this->consumers[] = $c; } else { throw new \InvalidArgumentException('The given consumer does not implement the \OCP\Activity\IConsumer interface'); } } return $this->consumers; } public function generateEvent(): IEvent { return new Event($this->validator); } public function publish(IEvent $event): void { if ($event->getAuthor() === '') { if ($this->session->getUser() instanceof IUser) { $event->setAuthor($this->session->getUser()->getUID()); } } if (!$event->getTimestamp()) { $event->setTimestamp(time()); } if (!$event->isValid()) { throw new IncompleteActivityException('The given event is invalid'); } foreach ($this->getConsumers() as $c) { $c->receive($event); } } public function registerConsumer(\Closure $callable): void { $this->consumersClosures[] = $callable; $this->consumers = []; } /** @var string[] */ protected $filterClasses = []; /** @var IFilter[] */ protected $filters = []; public function registerFilter(string $filter): void { $this->filterClasses[$filter] = false; } public function getFilters(): array { foreach ($this->filterClasses as $class => $false) { /** @var IFilter $filter */ $filter = \OCP\Server::get($class); if (!$filter instanceof IFilter) { throw new \InvalidArgumentException('Invalid activity filter registered'); } $this->filters[$filter->getIdentifier()] = $filter; unset($this->filterClasses[$class]); } return $this->filters; } public function getFilterById(string $id): IFilter { $filters = $this->getFilters(); if (isset($filters[$id])) { return $filters[$id]; } throw new FilterNotFoundException($id); } /** @var string[] */ protected $providerClasses = []; /** @var IProvider[] */ protected $providers = []; public function registerProvider(string $provider): void { $this->providerClasses[$provider] = false; } public function getProviders(): array { foreach ($this->providerClasses as $class => $false) { /** @var IProvider $provider */ $provider = \OCP\Server::get($class); if (!$provider instanceof IProvider) { throw new \InvalidArgumentException('Invalid activity provider registered'); } $this->providers[] = $provider; unset($this->providerClasses[$class]); } return $this->providers; } /** @var string[] */ protected $settingsClasses = []; /** @var ISetting[] */ protected $settings = []; public function registerSetting(string $setting): void { $this->settingsClasses[$setting] = false; } public function getSettings(): array { foreach ($this->settingsClasses as $class => $false) { /** @var ISetting $setting */ $setting = \OCP\Server::get($class); if ($setting instanceof ISetting) { if (!$setting instanceof ActivitySettings) { $setting = new ActivitySettingsAdapter($setting, $this->l10n); } } else { throw new \InvalidArgumentException('Invalid activity filter registered'); } $this->settings[$setting->getIdentifier()] = $setting; unset($this->settingsClasses[$class]); } return $this->settings; } public function getSettingById(string $id): ActivitySettings { $settings = $this->getSettings(); if (isset($settings[$id])) { return $settings[$id]; } throw new SettingNotFoundException($id); } public function setFormattingObject(string $type, int $id): void { $this->formattingObjectType = $type; $this->formattingObjectId = $id; } public function isFormattingFilteredObject(): bool { return $this->formattingObjectType !== null && $this->formattingObjectId !== null && $this->formattingObjectType === $this->request->getParam('object_type') && $this->formattingObjectId === (int)$this->request->getParam('object_id'); } public function setRequirePNG(bool $status): void { $this->requirePNG = $status; } public function getRequirePNG(): bool { return $this->requirePNG; } public function setCurrentUserId(?string $currentUserId = null): void { $this->currentUserId = $currentUserId; } public function getCurrentUserId(): string { if ($this->currentUserId !== null) { return $this->currentUserId; } if (!$this->session->isLoggedIn()) { return $this->getUserFromToken(); } return $this->session->getUser()->getUID(); } /** * Get the user for the token * * @return string * @throws \UnexpectedValueException If the token is invalid, does not exist or is not unique */ protected function getUserFromToken(): string { $token = (string)$this->request->getParam('token', ''); if (strlen($token) !== 30) { throw new \UnexpectedValueException('The token is invalid'); } $users = $this->config->getUsersForUserValue('activity', 'rsstoken', $token); if (count($users) !== 1) { // No unique user found throw new \UnexpectedValueException('The token is invalid'); } // Token found login as that user return array_shift($users); } }