2016-06-09 19:03:31 +03:00
|
|
|
<?php
|
|
|
|
/**
|
|
|
|
* @copyright Copyright (c) 2016 Bjoern Schiessle <bjoern@schiessle.org>
|
2017-03-20 20:36:36 +03:00
|
|
|
* @copyright Copyright (c) 2017 Lukas Reschke <lukas@statuscode.ch>
|
2016-06-09 19:03:31 +03:00
|
|
|
*
|
2016-07-21 17:49:16 +03:00
|
|
|
* @author Bjoern Schiessle <bjoern@schiessle.org>
|
2017-03-20 20:36:36 +03:00
|
|
|
* @author Lukas Reschke <lukas@statuscode.ch>
|
2016-07-21 17:49:16 +03:00
|
|
|
*
|
2016-06-09 19:03:31 +03:00
|
|
|
* @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 OCA\Admin_Audit;
|
|
|
|
|
|
|
|
use OC\Files\Filesystem;
|
2017-03-20 20:36:36 +03:00
|
|
|
use OC\Files\Node\File;
|
2016-06-09 19:03:31 +03:00
|
|
|
use OCA\Admin_Audit\Actions\Auth;
|
|
|
|
use OCA\Admin_Audit\Actions\Files;
|
|
|
|
use OCA\Admin_Audit\Actions\GroupManagement;
|
|
|
|
use OCA\Admin_Audit\Actions\Sharing;
|
|
|
|
use OCA\Admin_Audit\Actions\Trashbin;
|
|
|
|
use OCA\Admin_Audit\Actions\UserManagement;
|
2016-06-09 21:10:26 +03:00
|
|
|
use OCA\Admin_Audit\Actions\Versions;
|
2016-06-09 19:03:31 +03:00
|
|
|
use OCP\IGroupManager;
|
|
|
|
use OCP\ILogger;
|
2017-03-20 20:36:36 +03:00
|
|
|
use OCP\IPreview;
|
2016-06-09 19:03:31 +03:00
|
|
|
use OCP\IUserSession;
|
|
|
|
use OCP\Util;
|
2017-03-20 20:36:36 +03:00
|
|
|
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
|
|
|
|
use Symfony\Component\EventDispatcher\GenericEvent;
|
2016-06-09 19:03:31 +03:00
|
|
|
|
|
|
|
class AuditLogger {
|
|
|
|
/** @var ILogger */
|
|
|
|
private $logger;
|
|
|
|
/** @var IUserSession */
|
|
|
|
private $userSession;
|
|
|
|
/** @var IGroupManager */
|
|
|
|
private $groupManager;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* AuditLogger constructor.
|
|
|
|
*
|
|
|
|
* @param ILogger $logger
|
|
|
|
* @param IUserSession $userSession
|
|
|
|
* @param IGroupManager $groupManager
|
2017-03-20 20:36:36 +03:00
|
|
|
* @param EventDispatcherInterface $eventDispatcher
|
2016-06-09 19:03:31 +03:00
|
|
|
*/
|
|
|
|
public function __construct(ILogger $logger,
|
|
|
|
IUserSession $userSession,
|
2017-03-20 20:36:36 +03:00
|
|
|
IGroupManager $groupManager,
|
|
|
|
EventDispatcherInterface $eventDispatcher) {
|
2016-06-09 19:03:31 +03:00
|
|
|
$this->logger = $logger;
|
|
|
|
$this->userSession = $userSession;
|
|
|
|
$this->groupManager = $groupManager;
|
2017-03-20 20:36:36 +03:00
|
|
|
$this->eventDispatcher = $eventDispatcher;
|
2016-06-09 19:03:31 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2017-03-20 20:36:36 +03:00
|
|
|
* Register hooks in order to log them
|
2016-06-09 19:03:31 +03:00
|
|
|
*/
|
|
|
|
public function registerHooks() {
|
|
|
|
$this->userManagementHooks();
|
|
|
|
$this->groupHooks();
|
|
|
|
$this->sharingHooks();
|
|
|
|
$this->authHooks();
|
|
|
|
$this->fileHooks();
|
|
|
|
$this->trashbinHooks();
|
2016-06-09 21:10:26 +03:00
|
|
|
$this->versionsHooks();
|
2016-06-09 19:03:31 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2017-03-20 20:36:36 +03:00
|
|
|
* Connect to user management hooks
|
2016-06-09 19:03:31 +03:00
|
|
|
*/
|
|
|
|
private function userManagementHooks() {
|
|
|
|
$userActions = new UserManagement($this->logger);
|
|
|
|
|
|
|
|
Util::connectHook('OC_User', 'post_createUser', $userActions, 'create');
|
|
|
|
Util::connectHook('OC_User', 'post_deleteUser', $userActions, 'delete');
|
|
|
|
$this->userSession->listen('\OC\User', 'postSetPassword', [$userActions, 'setPassword']);
|
|
|
|
}
|
|
|
|
|
|
|
|
private function groupHooks() {
|
|
|
|
$groupActions = new GroupManagement($this->logger);
|
|
|
|
$this->groupManager->listen('\OC\Group', 'postRemoveUser', [$groupActions, 'removeUser']);
|
|
|
|
$this->groupManager->listen('\OC\Group', 'postAddUser', [$groupActions, 'addUser']);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* connect to sharing events
|
|
|
|
*/
|
|
|
|
private function sharingHooks() {
|
|
|
|
$shareActions = new Sharing($this->logger);
|
|
|
|
|
|
|
|
Util::connectHook('OCP\Share', 'post_shared', $shareActions, 'shared');
|
|
|
|
Util::connectHook('OCP\Share', 'post_unshare', $shareActions, 'unshare');
|
|
|
|
Util::connectHook('OCP\Share', 'post_update_permissions', $shareActions, 'updatePermissions');
|
|
|
|
Util::connectHook('OCP\Share', 'post_update_password', $shareActions, 'updatePassword');
|
|
|
|
Util::connectHook('OCP\Share', 'post_set_expiration_date', $shareActions, 'updateExpirationDate');
|
|
|
|
Util::connectHook('OCP\Share', 'share_link_access', $shareActions, 'shareAccessed');
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* connect to authentication event and related actions
|
|
|
|
*/
|
|
|
|
private function authHooks() {
|
|
|
|
$authActions = new Auth($this->logger);
|
|
|
|
|
|
|
|
Util::connectHook('OC_User', 'pre_login', $authActions, 'loginAttempt');
|
|
|
|
Util::connectHook('OC_User', 'post_login', $authActions, 'loginSuccessful');
|
|
|
|
Util::connectHook('OC_User', 'logout', $authActions, 'logout');
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2017-03-20 20:36:36 +03:00
|
|
|
* Connect to file hooks
|
2016-06-09 19:03:31 +03:00
|
|
|
*/
|
|
|
|
private function fileHooks() {
|
|
|
|
$fileActions = new Files($this->logger);
|
2017-03-20 20:36:36 +03:00
|
|
|
$this->eventDispatcher->addListener(
|
|
|
|
IPreview::EVENT,
|
|
|
|
function(GenericEvent $event) use ($fileActions) {
|
|
|
|
/** @var File $file */
|
|
|
|
$file = $event->getSubject();
|
|
|
|
$fileActions->preview([
|
|
|
|
'path' => substr($file->getInternalPath(), 5),
|
|
|
|
'width' => $event->getArguments()['width'],
|
|
|
|
'height' => $event->getArguments()['height'],
|
|
|
|
'crop' => $event->getArguments()['crop'],
|
|
|
|
'mode' => $event->getArguments()['mode']
|
|
|
|
]);
|
|
|
|
}
|
|
|
|
);
|
2016-06-09 19:03:31 +03:00
|
|
|
|
|
|
|
Util::connectHook(
|
|
|
|
Filesystem::CLASSNAME,
|
|
|
|
Filesystem::signal_post_rename,
|
|
|
|
$fileActions,
|
|
|
|
'rename'
|
|
|
|
);
|
|
|
|
Util::connectHook(
|
|
|
|
Filesystem::CLASSNAME,
|
|
|
|
Filesystem::signal_post_create,
|
|
|
|
$fileActions,
|
|
|
|
'create'
|
|
|
|
);
|
|
|
|
Util::connectHook(
|
|
|
|
Filesystem::CLASSNAME,
|
|
|
|
Filesystem::signal_post_copy,
|
|
|
|
$fileActions,
|
|
|
|
'copy'
|
|
|
|
);
|
|
|
|
Util::connectHook(
|
|
|
|
Filesystem::CLASSNAME,
|
|
|
|
Filesystem::signal_post_write,
|
|
|
|
$fileActions,
|
|
|
|
'write'
|
|
|
|
);
|
|
|
|
Util::connectHook(
|
|
|
|
Filesystem::CLASSNAME,
|
|
|
|
Filesystem::signal_post_update,
|
|
|
|
$fileActions,
|
|
|
|
'update'
|
|
|
|
);
|
|
|
|
Util::connectHook(
|
|
|
|
Filesystem::CLASSNAME,
|
|
|
|
Filesystem::signal_read,
|
|
|
|
$fileActions,
|
|
|
|
'read'
|
|
|
|
);
|
|
|
|
Util::connectHook(
|
|
|
|
Filesystem::CLASSNAME,
|
|
|
|
Filesystem::signal_delete,
|
|
|
|
$fileActions,
|
|
|
|
'delete'
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2016-06-09 21:10:26 +03:00
|
|
|
public function versionsHooks() {
|
|
|
|
$versionsActions = new Versions($this->logger);
|
|
|
|
Util::connectHook('\OCP\Versions', 'rollback', $versionsActions, 'rollback');
|
|
|
|
Util::connectHook('\OCP\Versions', 'delete',$versionsActions, 'delete');
|
|
|
|
}
|
|
|
|
|
2016-06-09 19:03:31 +03:00
|
|
|
/**
|
2017-03-20 20:36:36 +03:00
|
|
|
* Connect to trash bin hooks
|
2016-06-09 19:03:31 +03:00
|
|
|
*/
|
|
|
|
private function trashbinHooks() {
|
2016-06-20 12:21:27 +03:00
|
|
|
$trashActions = new Trashbin($this->logger);
|
2016-06-09 19:03:31 +03:00
|
|
|
Util::connectHook('\OCP\Trashbin', 'preDelete', $trashActions, 'delete');
|
|
|
|
Util::connectHook('\OCA\Files_Trashbin\Trashbin', 'post_restore', $trashActions, 'restore');
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|