Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Start porting Admin audit to new events #32019

Closed
wants to merge 1 commit into from
Closed
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
34 changes: 29 additions & 5 deletions apps/admin_audit/lib/Actions/Auth.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,35 @@
*/
namespace OCA\AdminAudit\Actions;

use OCP\EventDispatcher\Event;
use OCP\EventDispatcher\IEventListener;
use OCP\User\Events\BeforeUserLoggedInEvent;
use OCP\User\Events\UserLoggedInEvent;
use OCP\User\Events\UserLoggedOutEvent;

/**
* Class Auth logs all auth related actions
*
* @package OCA\AdminAudit\Actions
*/
class Auth extends Action {
class Auth extends Action implements IEventListener {
public function handle(Event $event): void {
if ($event instanceof BeforeUserLoggedInEvent) {
$this->loginAttempt(['uid' => $event->getUsername()]);
}

if ($event instanceof UserLoggedInEvent) {
$this->loginAttempt(['uid' => $event->getLoginName()]);
}

if ($event instanceof UserLoggedOutEvent) {
$user = $event->getUser();
if ($user) {
$this->logout($user->getUID());
}
}
}

public function loginAttempt(array $params): void {
$this->log(
'Login attempt: "%s"',
Expand All @@ -55,11 +78,12 @@ public function loginSuccessful(array $params): void {
);
}

public function logout(array $params): void {
public function logout(string $userId): void {
$this->log(
'Logout occurred',
[],
[]
'Logout occurred for "%s"',
['uid' => $userId],
['uid'],
true
);
}
}
37 changes: 22 additions & 15 deletions apps/admin_audit/lib/Actions/GroupManagement.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,12 @@
*/
namespace OCA\AdminAudit\Actions;

use OCP\EventDispatcher\Event;
use OCP\EventDispatcher\IEventListener;
use OCP\Group\Events\GroupCreatedEvent;
use OCP\Group\Events\GroupDeletedEvent;
use OCP\Group\Events\UserAddedEvent;
use OCP\Group\Events\UserRemovedEvent;
use OCP\IGroup;
use OCP\IUser;

Expand All @@ -37,13 +43,21 @@
*
* @package OCA\AdminAudit\Actions
*/
class GroupManagement extends Action {
class GroupManagement extends Action implements IEventListener {
public function handle(Event $event): void {
if ($event instanceof UserAddedEvent) {
$this->addUser($event->getGroup(), $event->getUser());
} elseif ($event instanceof UserRemovedEvent) {
$this->removeUser($event->getGroup(), $event->getUser());
} elseif ($event instanceof GroupCreatedEvent) {
$this->createGroup($event->getGroup());
} elseif ($event instanceof GroupDeletedEvent) {
$this->deleteGroup($event->getGroup());
}
}

/**
* log add user to group event
*
* @param IGroup $group
* @param IUser $user
* Log add user to group event
*/
public function addUser(IGroup $group, IUser $user): void {
$this->log('User "%s" added to group "%s"',
Expand All @@ -58,10 +72,7 @@ public function addUser(IGroup $group, IUser $user): void {
}

/**
* log remove user from group event
*
* @param IGroup $group
* @param IUser $user
* Log remove user from group event
*/
public function removeUser(IGroup $group, IUser $user): void {
$this->log('User "%s" removed from group "%s"',
Expand All @@ -76,9 +87,7 @@ public function removeUser(IGroup $group, IUser $user): void {
}

/**
* log create group to group event
*
* @param IGroup $group
* Log create group to group event
*/
public function createGroup(IGroup $group): void {
$this->log('Group created: "%s"',
Expand All @@ -92,9 +101,7 @@ public function createGroup(IGroup $group): void {
}

/**
* log delete group to group event
*
* @param IGroup $group
* Log delete group to group event
*/
public function deleteGroup(IGroup $group): void {
$this->log('Group deleted: "%s"',
Expand Down
53 changes: 37 additions & 16 deletions apps/admin_audit/lib/Actions/UserManagement.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
* @author John Molakvoæ <[email protected]>
* @author Lukas Reschke <[email protected]>
* @author Roeland Jago Douma <[email protected]>
* @author Carl Schwan <[email protected]>
*
* @license GNU AGPL version 3 or any later version
*
Expand All @@ -31,23 +32,47 @@
*/
namespace OCA\AdminAudit\Actions;

use OCP\EventDispatcher\Event;
use OCP\EventDispatcher\IEventListener;
use OCP\IUser;
use OCP\User\Events\PasswordUpdatedEvent;
use OCP\User\Events\UserChangedEvent;
use OCP\User\Events\UserCreatedEvent;
use OCP\User\Events\UserDeletedEvent;
use OCP\User\Events\UserIdAssignedEvent;
use OCP\User\Events\UserIdUnassignedEvent;

/**
* Class UserManagement logs all user management related actions.
*
* @package OCA\AdminAudit\Actions
*/
class UserManagement extends Action {
class UserManagement extends Action implements IEventListener {
public function handle(Event $event): void {
if ($event instanceof UserCreatedEvent) {
$this->create($event->getUser()->getUID());
} elseif ($event instanceof UserDeletedEvent) {
$this->delete($event->getUser()->getUID());
} elseif ($event instanceof UserChangedEvent) {
$this->change($event);
} elseif ($event instanceof UserIdAssignedEvent) {
$this->assign($event->getUserId());
} elseif ($event instanceof UserIdUnassignedEvent) {
$this->unassign($event->getUserId());
} elseif ($event instanceof PasswordUpdatedEvent) {
$this->setPassword($event->getUser());
}
}

/**
* Log creation of users
*
* @param array $params
*/
public function create(array $params): void {
public function create(string $userId): void {
$this->log(
'User created: "%s"',
$params,
['uid' => $userId],
[
'uid',
]
Expand All @@ -56,26 +81,22 @@ public function create(array $params): void {

/**
* Log assignments of users (typically user backends)
*
* @param string $uid
*/
public function assign(string $uid): void {
public function assign(string $userId): void {
$this->log(
'UserID assigned: "%s"',
[ 'uid' => $uid ],
[ 'uid' => $userId ],
[ 'uid' ]
);
}

/**
* Log deletion of users
*
* @param array $params
*/
public function delete(array $params): void {
public function delete(string $userId): void {
$this->log(
'User deleted: "%s"',
$params,
['uid' => $userId],
[
'uid',
]
Expand All @@ -100,14 +121,14 @@ public function unassign(string $uid): void {
*
* @param array $params
*/
public function change(array $params): void {
switch ($params['feature']) {
public function change(UserChangedEvent $changedEvent): void {
switch ($changedEvent->getFeature()) {
case 'enabled':
$this->log(
$params['value'] === true
$changedEvent->getValue() === true
? 'User enabled: "%s"'
: 'User disabled: "%s"',
['user' => $params['user']->getUID()],
['user' => $changedEvent->getUser()->getUID()],
[
'user',
]
Expand All @@ -116,7 +137,7 @@ public function change(array $params): void {
case 'eMailAddress':
$this->log(
'Email address changed for user %s',
['user' => $params['user']->getUID()],
['user' => $changedEvent->getUser()->getUID()],
[
'user',
]
Expand Down
70 changes: 33 additions & 37 deletions apps/admin_audit/lib/AppInfo/Application.php
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,10 @@
use OCP\AppFramework\Bootstrap\IRegistrationContext;
use OCP\Authentication\TwoFactorAuth\IProvider;
use OCP\Console\ConsoleEvent;
use OCP\Group\Events\GroupCreatedEvent;
use OCP\Group\Events\GroupDeletedEvent;
use OCP\Group\Events\UserAddedEvent;
use OCP\Group\Events\UserRemovedEvent;
use OCP\IConfig;
use OCP\IGroupManager;
use OCP\IPreview;
Expand All @@ -66,6 +70,15 @@
use OCP\Log\Audit\CriticalActionPerformedEvent;
use OCP\Log\ILogFactory;
use OCP\Share;
use OCP\User\Events\BeforeUserLoggedInEvent;
use OCP\User\Events\UserIdAssignedEvent;
use OCP\User\Events\PasswordUpdatedEvent;
use OCP\User\Events\UserChangedEvent;
use OCP\User\Events\UserCreatedEvent;
use OCP\User\Events\UserDeletedEvent;
use OCP\User\Events\UserIdUnassignedEvent;
use OCP\User\Events\UserLoggedInEvent;
use OCP\User\Events\UserLoggedOutEvent;
use OCP\Util;
use Psr\Container\ContainerInterface;
use Psr\Log\LoggerInterface;
Expand All @@ -87,6 +100,26 @@ public function register(IRegistrationContext $context): void {
});

$context->registerEventListener(CriticalActionPerformedEvent::class, CriticalActionPerformedEventListener::class);

// User management
$context->registerEventListener(UserCreatedEvent::class, UserManagement::class);
$context->registerEventListener(UserDeletedEvent::class, UserManagement::class);
$context->registerEventListener(UserChangedEvent::class, UserManagement::class);
$context->registerEventListener(PasswordUpdatedEvent::class, UserManagement::class);
$context->registerEventListener(UserIdAssignedEvent::class, UserManagement::class);
$context->registerEventListener(UserIdUnassignedEvent::class, UserManagement::class);

// Group management
$context->registerEventListener(GroupCreatedEvent::class, GroupManagement::class);
$context->registerEventListener(GroupDeletedEvent::class, GroupManagement::class);
$context->registerEventListener(UserAddedEvent::class, GroupManagement::class);
$context->registerEventListener(UserRemovedEvent::class, GroupManagement::class);

// Authentication management
$context->registerEventListener(UserLoggedInEvent::class, Auth::class);
$context->registerEventListener(BeforeUserLoggedInEvent::class, Auth::class);
$context->registerEventListener(UserLoggedOutEvent::class, Auth::class);

}

public function boot(IBootContext $context): void {
Expand All @@ -105,10 +138,6 @@ public function boot(IBootContext $context): void {
*/
private function registerHooks(IAuditLogger $logger,
IServerContainer $serverContainer): void {
$this->userManagementHooks($logger, $serverContainer->get(IUserSession::class));
$this->groupHooks($logger, $serverContainer->get(IGroupManager::class));
$this->authHooks($logger);

/** @var EventDispatcherInterface $eventDispatcher */
$eventDispatcher = $serverContainer->get(EventDispatcherInterface::class);
$this->consoleHooks($logger, $eventDispatcher);
Expand All @@ -123,31 +152,6 @@ private function registerHooks(IAuditLogger $logger,
$this->securityHooks($logger, $eventDispatcher);
}

private function userManagementHooks(IAuditLogger $logger,
IUserSession $userSession): void {
$userActions = new UserManagement($logger);

Util::connectHook('OC_User', 'post_createUser', $userActions, 'create');
Util::connectHook('OC_User', 'post_deleteUser', $userActions, 'delete');
Util::connectHook('OC_User', 'changeUser', $userActions, 'change');

assert($userSession instanceof UserSession);
$userSession->listen('\OC\User', 'postSetPassword', [$userActions, 'setPassword']);
$userSession->listen('\OC\User', 'assignedUserId', [$userActions, 'assign']);
$userSession->listen('\OC\User', 'postUnassignedUserId', [$userActions, 'unassign']);
}

private function groupHooks(IAuditLogger $logger,
IGroupManager $groupManager): void {
$groupActions = new GroupManagement($logger);

assert($groupManager instanceof GroupManager);
$groupManager->listen('\OC\Group', 'postRemoveUser', [$groupActions, 'removeUser']);
$groupManager->listen('\OC\Group', 'postAddUser', [$groupActions, 'addUser']);
$groupManager->listen('\OC\Group', 'postDelete', [$groupActions, 'deleteGroup']);
$groupManager->listen('\OC\Group', 'postCreate', [$groupActions, 'createGroup']);
}

private function sharingHooks(IAuditLogger $logger): void {
$shareActions = new Sharing($logger);

Expand All @@ -160,14 +164,6 @@ private function sharingHooks(IAuditLogger $logger): void {
Util::connectHook(Share::class, 'share_link_access', $shareActions, 'shareAccessed');
}

private function authHooks(IAuditLogger $logger): void {
$authActions = new Auth($logger);

Util::connectHook('OC_User', 'pre_login', $authActions, 'loginAttempt');
Util::connectHook('OC_User', 'post_login', $authActions, 'loginSuccessful');
Util::connectHook('OC_User', 'logout', $authActions, 'logout');
}

private function appHooks(IAuditLogger $logger,
EventDispatcherInterface $eventDispatcher): void {
$eventDispatcher->addListener(ManagerEvent::EVENT_APP_ENABLE, function (ManagerEvent $event) use ($logger) {
Expand Down
11 changes: 9 additions & 2 deletions apps/user_ldap/ajax/clearMappings.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@
*/
use OCA\User_LDAP\Mapping\UserMapping;
use OCA\User_LDAP\Mapping\GroupMapping;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\User\Events\BeforeUserIdUnassignedEvent;
use OCP\User\Events\UserIdUnassignedEvent;

// Check user and app status
\OC_JSON::checkAdminUser();
Expand All @@ -36,11 +39,15 @@
try {
if ($subject === 'user') {
$mapping = new UserMapping(\OC::$server->getDatabaseConnection());
/** @var IEventDispatcher $dispatcher */
$dispatcher = \OC::$server->get(IEventDispatcher::class);
$result = $mapping->clearCb(
function ($uid) {
function (string $uid) use ($dispatcher): void {
$dispatcher->dispatchTyped(new BeforeUserIdUnassignedEvent($uid));
\OC::$server->getUserManager()->emit('\OC\User', 'preUnassignedUserId', [$uid]);
},
function ($uid) {
function (string $uid) use ($dispatcher): void {
$dispatcher->dispatchTyped(new UserIdUnassignedEvent($uid));
\OC::$server->getUserManager()->emit('\OC\User', 'postUnassignedUserId', [$uid]);
}
);
Expand Down
Loading