Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions lib/composer/composer/autoload_classmap.php
Original file line number Diff line number Diff line change
Expand Up @@ -1023,6 +1023,8 @@
'OC\\Session\\Internal' => $baseDir . '/lib/private/Session/Internal.php',
'OC\\Session\\Memory' => $baseDir . '/lib/private/Session/Memory.php',
'OC\\Session\\Session' => $baseDir . '/lib/private/Session/Session.php',
'OC\\Settings\\Activity\\GroupProvider' => $baseDir . '/settings/Activity/GroupProvider.php',
'OC\\Settings\\Activity\\GroupSetting' => $baseDir . '/settings/Activity/GroupSetting.php',
'OC\\Settings\\Activity\\Provider' => $baseDir . '/settings/Activity/Provider.php',
'OC\\Settings\\Activity\\SecurityFilter' => $baseDir . '/settings/Activity/SecurityFilter.php',
'OC\\Settings\\Activity\\SecurityProvider' => $baseDir . '/settings/Activity/SecurityProvider.php',
Expand Down
2 changes: 2 additions & 0 deletions lib/composer/composer/autoload_static.php
Original file line number Diff line number Diff line change
Expand Up @@ -1053,6 +1053,8 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
'OC\\Session\\Internal' => __DIR__ . '/../../..' . '/lib/private/Session/Internal.php',
'OC\\Session\\Memory' => __DIR__ . '/../../..' . '/lib/private/Session/Memory.php',
'OC\\Session\\Session' => __DIR__ . '/../../..' . '/lib/private/Session/Session.php',
'OC\\Settings\\Activity\\GroupProvider' => __DIR__ . '/../../..' . '/settings/Activity/GroupProvider.php',
'OC\\Settings\\Activity\\GroupSetting' => __DIR__ . '/../../..' . '/settings/Activity/GroupSetting.php',
'OC\\Settings\\Activity\\Provider' => __DIR__ . '/../../..' . '/settings/Activity/Provider.php',
'OC\\Settings\\Activity\\SecurityFilter' => __DIR__ . '/../../..' . '/settings/Activity/SecurityFilter.php',
'OC\\Settings\\Activity\\SecurityProvider' => __DIR__ . '/../../..' . '/settings/Activity/SecurityProvider.php',
Expand Down
202 changes: 202 additions & 0 deletions settings/Activity/GroupProvider.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,202 @@
<?php
/**
* @copyright Copyright (c) 2016 Christoph Wurst <[email protected]>
*
* @author Christoph Wurst <[email protected]>
* @author Joas Schilling <[email protected]>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/

namespace OC\Settings\Activity;

use InvalidArgumentException;
use OCP\Activity\IEvent;
use OCP\Activity\IManager;
use OCP\Activity\IProvider;
use OCP\IGroup;
use OCP\IGroupManager;
use OCP\IURLGenerator;
use OCP\IUser;
use OCP\IUserManager;
use OCP\L10N\IFactory as L10nFactory;

class GroupProvider implements IProvider {

const ADDED_TO_GROUP = 'group_added';
const REMOVED_FROM_GROUP = 'group_removed';

/** @var L10nFactory */
private $l10n;
/** @var IURLGenerator */
private $urlGenerator;
/** @var IManager */
private $activityManager;
/** @var IUserManager */
protected $userManager;
/** @var IGroupManager */
protected $groupManager;

/** @var string[] */
protected $groupDisplayNames = [];
/** @var string[] */
protected $userDisplayNames = [];


public function __construct(L10nFactory $l10n,
IURLGenerator $urlGenerator,
IManager $activityManager,
IUserManager $userManager,
IGroupManager $groupManager) {
$this->urlGenerator = $urlGenerator;
$this->l10n = $l10n;
$this->activityManager = $activityManager;
$this->userManager = $userManager;
$this->groupManager = $groupManager;
}

public function parse($language, IEvent $event, IEvent $previousEvent = null) {
if ($event->getType() !== 'group_settings') {
throw new InvalidArgumentException();
}

$l = $this->l10n->get('settings', $language);

$params = $event->getSubjectParameters();
$parsedParameters = [
'user' => $this->generateUserParameter($params['user']),
'group' => $this->generateGroupParameter($params['group']),
];

if (isset($params['actor'])) {
$parsedParameters['actor'] = $this->generateUserParameter($params['actor']);
}

switch ($event->getSubject()) {
case self::ADDED_TO_GROUP:
if (isset($parsedParameters['actor'])) {
if ($this->activityManager->getCurrentUserId() === $params['user']) {
$subject = $l->t('{actor} added you to group {group}');
} elseif (isset($params['actor']) && $this->activityManager->getCurrentUserId() === $params['actor']) {
$subject = $l->t('You added {user} to group {group}');
} else {
$subject = $l->t('{actor} added {user} to group {group}');
}
} else if ($this->activityManager->getCurrentUserId() === $params['user']) {
$subject = $l->t('An administrator added you to group {group}');
} else {
$subject = $l->t('An administrator added {user} to group {group}');
}
break;
case self::REMOVED_FROM_GROUP:
if (isset($parsedParameters['actor'])) {
if ($this->activityManager->getCurrentUserId() === $params['user']) {
$subject = $l->t('{actor} removed you from group {group}');
} elseif (isset($params['actor']) && $this->activityManager->getCurrentUserId() === $params['actor']) {
$subject = $l->t('You removed {user} from group {group}');
} else {
$subject = $l->t('{actor} removed {user} from group {group}');
}
} else if ($this->activityManager->getCurrentUserId() === $params['user']) {
$subject = $l->t('An administrator removed you from group {group}');
} else {
$subject = $l->t('An administrator removed {user} from group {group}');
}
break;
default:
throw new InvalidArgumentException();
}

$this->setSubjects($event, $subject, $parsedParameters);

return $event;
}

/**
* @param IEvent $event
* @param string $subject
* @param array $parameters
* @throws \InvalidArgumentException
*/
protected function setSubjects(IEvent $event, string $subject, array $parameters) {
$placeholders = $replacements = [];
foreach ($parameters as $placeholder => $parameter) {
$placeholders[] = '{' . $placeholder . '}';
$replacements[] = $parameter['name'];
}

$event->setParsedSubject(str_replace($placeholders, $replacements, $subject))
->setRichSubject($subject, $parameters);
}

/**
* @param string $gid
* @return array
*/
protected function generateGroupParameter(string $gid): array {
if (!isset($this->groupDisplayNames[$gid])) {
$this->groupDisplayNames[$gid] = $this->getGroupDisplayName($gid);
}

return [
'type' => 'user-group',
'id' => $gid,
'name' => $this->groupDisplayNames[$gid],
];
}

/**
* @param string $gid
* @return string
*/
protected function getGroupDisplayName(string $gid): string {
$group = $this->groupManager->get($gid);
if ($group instanceof IGroup) {
return $group->getDisplayName();
}
return $gid;
}

/**
* @param string $uid
* @return array
*/
protected function generateUserParameter(string $uid): array {
if (!isset($this->displayNames[$uid])) {
$this->userDisplayNames[$uid] = $this->getDisplayName($uid);
}

return [
'type' => 'user',
'id' => $uid,
'name' => $this->userDisplayNames[$uid],
];
}

/**
* @param string $uid
* @return string
*/
protected function getDisplayName(string $uid): string {
$user = $this->userManager->get($uid);
if ($user instanceof IUser) {
return $user->getDisplayName();
} else {
return $uid;
}
}
}
98 changes: 98 additions & 0 deletions settings/Activity/GroupSetting.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
<?php
/**
* @copyright Copyright (c) 2017 Joas Schilling <[email protected]>
*
* @author Joas Schilling <[email protected]>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/

namespace OC\Settings\Activity;

use OCP\Activity\ISetting;
use OCP\IL10N;

class GroupSetting implements ISetting {

/** @var IL10N */
protected $l;

/**
* @param IL10N $l10n
*/
public function __construct(IL10N $l10n) {
$this->l = $l10n;
}

/**
* @return string Lowercase a-z and underscore only identifier
* @since 11.0.0
*/
public function getIdentifier(): string {
return 'group_settings';
}

/**
* @return string A translated string
* @since 11.0.0
*/
public function getName(): string {
return $this->l->t('Your <strong>group memberships</strong> were modified');
}

/**
* @return int whether the filter should be rather on the top or bottom of
* the admin section. The filters are arranged in ascending order of the
* priority values. It is required to return a value between 0 and 100.
* @since 11.0.0
*/
public function getPriority(): int {
return 0;
}

/**
* @return bool True when the option can be changed for the stream
* @since 11.0.0
*/
public function canChangeStream(): bool {
return false;
}

/**
* @return bool True when the option can be changed for the stream
* @since 11.0.0
*/
public function isDefaultEnabledStream(): bool {
return true;
}

/**
* @return bool True when the option can be changed for the mail
* @since 11.0.0
*/
public function canChangeMail(): bool {
return false;
}

/**
* @return bool True when the option can be changed for the stream
* @since 11.0.0
*/
public function isDefaultEnabledMail(): bool {
return true;
}
}
23 changes: 23 additions & 0 deletions settings/Application.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@
use OC\AppFramework\Utility\TimeFactory;
use OC\Authentication\Token\IProvider;
use OC\Server;
use OC\Settings\Activity\GroupProvider;
use OC\Settings\Activity\GroupSetting;
use OC\Settings\Activity\Provider;
use OC\Settings\Activity\SecurityFilter;
use OC\Settings\Activity\SecurityProvider;
Expand All @@ -41,6 +43,8 @@
use OCP\AppFramework\App;
use OCP\Defaults;
use OCP\IContainer;
use OCP\IGroup;
use OCP\IUser;
use OCP\Settings\IManager;
use OCP\Util;

Expand Down Expand Up @@ -118,13 +122,32 @@ public function register() {
$activityManager->registerFilter(SecurityFilter::class); // FIXME move to info.xml
$activityManager->registerSetting(SecuritySetting::class); // FIXME move to info.xml
$activityManager->registerProvider(SecurityProvider::class); // FIXME move to info.xml
$activityManager->registerSetting(GroupSetting::class); // FIXME move to info.xml
$activityManager->registerProvider(GroupProvider::class); // FIXME move to info.xml

Util::connectHook('OC_User', 'post_setPassword', $this, 'onChangePassword');
Util::connectHook('OC_User', 'changeUser', $this, 'onChangeInfo');

$groupManager = $this->getContainer()->getServer()->getGroupManager();
$groupManager->listen('\OC\Group', 'postRemoveUser', [$this, 'removeUserFromGroup']);
$groupManager->listen('\OC\Group', 'postAddUser', [$this, 'addUserToGroup']);

Util::connectHook('\OCP\Config', 'js', $this, 'extendJsConfig');
}

public function addUserToGroup(IGroup $group, IUser $user) {
/** @var Hooks $hooks */
$hooks = $this->getContainer()->query(Hooks::class);
$hooks->addUserToGroup($group, $user);

}

public function removeUserFromGroup(IGroup $group, IUser $user) {
/** @var Hooks $hooks */
$hooks = $this->getContainer()->query(Hooks::class);
$hooks->removeUserFromGroup($group, $user);
}

/**
* @param array $parameters
* @throws \InvalidArgumentException
Expand Down
Loading