Create events for authenticate, register_account and remove_user hooks

This commit is contained in:
Art4 2025-03-20 14:59:47 +00:00
parent 9822dd25d8
commit 90db7d2e65
6 changed files with 122 additions and 12 deletions

View file

@ -81,6 +81,9 @@ final class HookEventBridge
ArrayFilterEvent::BLOCK_CONTACT => 'block',
ArrayFilterEvent::UNBLOCK_CONTACT => 'unblock',
ArrayFilterEvent::AVATAR_LOOKUP => 'avatar_lookup',
ArrayFilterEvent::ACCOUNT_AUTHENTICATE => 'authenticate',
ArrayFilterEvent::ACCOUNT_REGISTER => 'register_account',
ArrayFilterEvent::ACCOUNT_REMOVE => 'remove_user',
ArrayFilterEvent::EVENT_CREATED => 'event_created',
ArrayFilterEvent::EVENT_UPDATED => 'event_updated',
ArrayFilterEvent::ADD_WORKER_TASK => 'proc_run',
@ -149,6 +152,9 @@ final class HookEventBridge
ArrayFilterEvent::BLOCK_CONTACT => 'onArrayFilterEvent',
ArrayFilterEvent::UNBLOCK_CONTACT => 'onArrayFilterEvent',
ArrayFilterEvent::AVATAR_LOOKUP => 'onArrayFilterEvent',
ArrayFilterEvent::ACCOUNT_AUTHENTICATE => 'onArrayFilterEvent',
ArrayFilterEvent::ACCOUNT_REGISTER => 'onAccountRegisterEvent',
ArrayFilterEvent::ACCOUNT_REMOVE => 'onAccountRemoveEvent',
ArrayFilterEvent::EVENT_CREATED => 'onEventCreatedEvent',
ArrayFilterEvent::EVENT_UPDATED => 'onEventUpdatedEvent',
ArrayFilterEvent::ADD_WORKER_TASK => 'onArrayFilterEvent',
@ -295,6 +301,34 @@ final class HookEventBridge
$event->setArray($data);
}
/**
* Map the ACCOUNT_REGISTER event to `register_account` hook
*/
public static function onAccountRegisterEvent(ArrayFilterEvent $event): void
{
$data = $event->getArray();
$uid = (int) $data['uid'] ?? 0;
$data['uid'] = static::callHook($event->getName(), $uid);
$event->setArray($data);
}
/**
* Map the ACCOUNT_REMOVE event to `remove_account` hook
*/
public static function onAccountRemoveEvent(ArrayFilterEvent $event): void
{
$data = $event->getArray();
$user = (array) $data['user'] ?? [];
$data['user'] = static::callHook($event->getName(), $user);
$event->setArray($data);
}
/**
* Map the EVENT_CREATED event to `event_created` hook
*/

View file

@ -112,6 +112,12 @@ final class ArrayFilterEvent extends Event
public const AVATAR_LOOKUP = 'friendica.data.avatar_lookup';
public const ACCOUNT_AUTHENTICATE = 'friendica.data.account_authenticate';
public const ACCOUNT_REGISTER = 'friendica.data.account_register';
public const ACCOUNT_REMOVE = 'friendica.data.account_remove';
public const EVENT_CREATED = 'friendica.data.event_created';
public const EVENT_UPDATED = 'friendica.data.event_updated';

View file

@ -13,7 +13,6 @@ use ErrorException;
use Exception;
use Friendica\App;
use Friendica\Content\Pager;
use Friendica\Core\Hook;
use Friendica\Core\L10n;
use Friendica\Core\Protocol;
use Friendica\Core\Search;
@ -21,6 +20,7 @@ use Friendica\Core\System;
use Friendica\Core\Worker;
use Friendica\Database\DBA;
use Friendica\DI;
use Friendica\Event\ArrayFilterEvent;
use Friendica\Module;
use Friendica\Network\HTTPClient\Client\HttpClientAccept;
use Friendica\Network\HTTPClient\Client\HttpClientOptions;
@ -758,12 +758,16 @@ class User
'user_record' => null
];
/*
$eventDispatcher = DI::eventDispatcher();
/**
* An addon indicates successful login by setting 'authenticated' to non-zero value and returning a user record
* Addons should never set 'authenticated' except to indicate success - as hooks may be chained
* and later addons should not interfere with an earlier one that succeeded.
*/
Hook::callAll('authenticate', $addon_auth);
$addon_auth = $eventDispatcher->dispatch(
new ArrayFilterEvent(ArrayFilterEvent::ACCOUNT_AUTHENTICATE, $addon_auth),
)->getArray();
if ($addon_auth['authenticated'] && $addon_auth['user_record']) {
return $addon_auth['user_record']['uid'];
@ -1460,11 +1464,20 @@ class User
Contact::updateSelfFromUserID($uid, true);
}
Hook::callAll('register_account', $uid);
$eventDispatcher = DI::eventDispatcher();
$hook_data = [
'uid' => $uid,
];
$eventDispatcher->dispatch(
new ArrayFilterEvent(ArrayFilterEvent::ACCOUNT_REGISTER, $hook_data),
);
self::setRegisterMethodByUserCount();
$return['user'] = $user;
return $return;
}
@ -1787,7 +1800,17 @@ class User
throw new \RuntimeException(DI::l10n()->t("User with delegates can't be removed, please remove delegate users first"));
}
Hook::callAll('remove_user', $user);
$eventDispatcher = DI::eventDispatcher();
$hook_data = [
'user' => $user,
];
$hook_data = $eventDispatcher->dispatch(
new ArrayFilterEvent(ArrayFilterEvent::ACCOUNT_REMOVE, $hook_data),
)->getArray();
$user = $hook_data['user'] ?? $user;
// save username (actually the nickname as it is guaranteed
// unique), so it cannot be re-registered in the future.

View file

@ -11,6 +11,7 @@ use Exception;
use Friendica\Core\Hook;
use Friendica\Database\DBA;
use Friendica\DI;
use Friendica\Event\ArrayFilterEvent;
use Friendica\Model\User;
use Friendica\Network\HTTPException\UnauthorizedException;
@ -136,12 +137,16 @@ class BasicAuth
'user_record' => null,
];
/*
* An addon indicates successful login by setting 'authenticated' to non-zero value and returning a user record
* Addons should never set 'authenticated' except to indicate success - as hooks may be chained
* and later addons should not interfere with an earlier one that succeeded.
*/
Hook::callAll('authenticate', $addon_auth);
$eventDispatcher = DI::eventDispatcher();
/**
* An addon indicates successful login by setting 'authenticated' to non-zero value and returning a user record
* Addons should never set 'authenticated' except to indicate success - as hooks may be chained
* and later addons should not interfere with an earlier one that succeeded.
*/
$addon_auth = $eventDispatcher->dispatch(
new ArrayFilterEvent(ArrayFilterEvent::ACCOUNT_AUTHENTICATE, $addon_auth),
)->getArray();
if ($addon_auth['authenticated'] && !empty($addon_auth['user_record'])) {
$record = $addon_auth['user_record'];