added amb1165 - exposed some plugin admin functionality to extensions
--HG-- extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%401694
This commit is contained in:
parent
ecbd1f5e36
commit
dfa007081b
@ -1295,12 +1295,32 @@ void CPlayer::Authorize_Post()
|
|||||||
|
|
||||||
void CPlayer::DoPostConnectAuthorization()
|
void CPlayer::DoPostConnectAuthorization()
|
||||||
{
|
{
|
||||||
|
bool delay = false;
|
||||||
|
|
||||||
|
List<IClientListener *>::iterator iter;
|
||||||
|
for (iter = g_Players.m_hooks.begin();
|
||||||
|
iter != g_Players.m_hooks.end();
|
||||||
|
iter++)
|
||||||
|
{
|
||||||
|
IClientListener *pListener = (*iter);
|
||||||
|
#if defined MIN_API_FOR_ADMINCALLS
|
||||||
|
if (pListener->GetClientListenerVersion() < MIN_API_FOR_ADMINCALLS)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (!pListener->OnClientPreAdminCheck(m_iIndex))
|
||||||
|
{
|
||||||
|
delay = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
cell_t result = 0;
|
cell_t result = 0;
|
||||||
PreAdminCheck->PushCell(m_iIndex);
|
PreAdminCheck->PushCell(m_iIndex);
|
||||||
PreAdminCheck->Execute(&result);
|
PreAdminCheck->Execute(&result);
|
||||||
|
|
||||||
/* Defer, for better or worse */
|
/* Defer, for better or worse */
|
||||||
if ((ResultType)result >= Pl_Handled)
|
if (delay || (ResultType)result >= Pl_Handled)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1318,6 +1338,15 @@ void CPlayer::DoPostConnectAuthorization()
|
|||||||
NotifyPostAdminChecks();
|
NotifyPostAdminChecks();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CPlayer::RunAdminCacheChecks()
|
||||||
|
{
|
||||||
|
AdminId old_id = GetAdminId();
|
||||||
|
|
||||||
|
DoBasicAdminChecks();
|
||||||
|
|
||||||
|
return (GetAdminId() != old_id);
|
||||||
|
}
|
||||||
|
|
||||||
void CPlayer::NotifyPostAdminChecks()
|
void CPlayer::NotifyPostAdminChecks()
|
||||||
{
|
{
|
||||||
if (m_bAdminCheckSignalled)
|
if (m_bAdminCheckSignalled)
|
||||||
@ -1328,6 +1357,21 @@ void CPlayer::NotifyPostAdminChecks()
|
|||||||
/* Block beforehand so they can't double-call */
|
/* Block beforehand so they can't double-call */
|
||||||
m_bAdminCheckSignalled = true;
|
m_bAdminCheckSignalled = true;
|
||||||
|
|
||||||
|
List<IClientListener *>::iterator iter;
|
||||||
|
for (iter = g_Players.m_hooks.begin();
|
||||||
|
iter != g_Players.m_hooks.end();
|
||||||
|
iter++)
|
||||||
|
{
|
||||||
|
IClientListener *pListener = (*iter);
|
||||||
|
#if defined MIN_API_FOR_ADMINCALLS
|
||||||
|
if (pListener->GetClientListenerVersion() < MIN_API_FOR_ADMINCALLS)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
pListener->OnClientPostAdminCheck(m_iIndex);
|
||||||
|
}
|
||||||
|
|
||||||
PostAdminCheck->PushCell(m_iIndex);
|
PostAdminCheck->PushCell(m_iIndex);
|
||||||
PostAdminCheck->Execute(NULL);
|
PostAdminCheck->Execute(NULL);
|
||||||
}
|
}
|
||||||
|
@ -48,6 +48,8 @@ using namespace SourceHook;
|
|||||||
#define PLAYER_LIFE_ALIVE 1
|
#define PLAYER_LIFE_ALIVE 1
|
||||||
#define PLAYER_LIFE_DEAD 2
|
#define PLAYER_LIFE_DEAD 2
|
||||||
|
|
||||||
|
#define MIN_API_FOR_ADMINCALLS 7
|
||||||
|
|
||||||
class CPlayer : public IGamePlayer
|
class CPlayer : public IGamePlayer
|
||||||
{
|
{
|
||||||
friend class PlayerManager;
|
friend class PlayerManager;
|
||||||
@ -69,8 +71,9 @@ public:
|
|||||||
IPlayerInfo *GetPlayerInfo();
|
IPlayerInfo *GetPlayerInfo();
|
||||||
unsigned int GetLanguageId();
|
unsigned int GetLanguageId();
|
||||||
int GetUserId();
|
int GetUserId();
|
||||||
public:
|
bool RunAdminCacheChecks();
|
||||||
void NotifyPostAdminChecks();
|
void NotifyPostAdminChecks();
|
||||||
|
public:
|
||||||
void DoBasicAdminChecks();
|
void DoBasicAdminChecks();
|
||||||
bool IsInKickQueue();
|
bool IsInKickQueue();
|
||||||
void MarkAsBeingKicked();
|
void MarkAsBeingKicked();
|
||||||
@ -108,6 +111,7 @@ class PlayerManager :
|
|||||||
public SMGlobalClass,
|
public SMGlobalClass,
|
||||||
public IPlayerManager
|
public IPlayerManager
|
||||||
{
|
{
|
||||||
|
friend class CPlayer;
|
||||||
public:
|
public:
|
||||||
PlayerManager();
|
PlayerManager();
|
||||||
~PlayerManager();
|
~PlayerManager();
|
||||||
|
@ -41,7 +41,7 @@
|
|||||||
#include <IAdminSystem.h>
|
#include <IAdminSystem.h>
|
||||||
|
|
||||||
#define SMINTERFACE_PLAYERMANAGER_NAME "IPlayerManager"
|
#define SMINTERFACE_PLAYERMANAGER_NAME "IPlayerManager"
|
||||||
#define SMINTERFACE_PLAYERMANAGER_VERSION 6
|
#define SMINTERFACE_PLAYERMANAGER_VERSION 7
|
||||||
|
|
||||||
struct edict_t;
|
struct edict_t;
|
||||||
class IPlayerInfo;
|
class IPlayerInfo;
|
||||||
@ -147,6 +147,42 @@ namespace SourceMod
|
|||||||
* @return IPlayerInfo pointer, or NULL if none.
|
* @return IPlayerInfo pointer, or NULL if none.
|
||||||
*/
|
*/
|
||||||
virtual IPlayerInfo *GetPlayerInfo() =0;
|
virtual IPlayerInfo *GetPlayerInfo() =0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Runs through Core's admin authorization checks. If the
|
||||||
|
* client is already an admin, no checks are performed.
|
||||||
|
*
|
||||||
|
* Note that this function operates solely against the in-memory admin
|
||||||
|
* cache. It will check steamids, IPs, names, and verify a password
|
||||||
|
* if one exists. To implement other authentication schemes, simply
|
||||||
|
* don't call this function and use IGamePlayer::SetAdminId() instead.
|
||||||
|
*
|
||||||
|
* @return True if access changed, false otherwise.
|
||||||
|
*/
|
||||||
|
virtual bool RunAdminCacheChecks() =0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Notifies all listeners that the client has completed
|
||||||
|
* all of your post-connection (in-game, auth, admin) checks.
|
||||||
|
*
|
||||||
|
* If you returned "false" from OnClientPreAdminCheck(), you must
|
||||||
|
* ALWAYS manually invoke this function, even if RunAdminCacheChecks()
|
||||||
|
* failed or you did not assign an AdminId. Failure to call this
|
||||||
|
* function could result in plugins (such as reservedslots) not
|
||||||
|
* working properly.
|
||||||
|
*
|
||||||
|
* If you are implementing asynchronous fetches, and the client
|
||||||
|
* disconnects during your fetching process, you should make sure to
|
||||||
|
* recognize that case and not call this function. That is, do not
|
||||||
|
* call this function on mismatched PreCheck calls, or on disconnected
|
||||||
|
* clients. A good way to check this is to pass userids around, which
|
||||||
|
* are unique per client connection.
|
||||||
|
*
|
||||||
|
* Calling this has no effect if it has already been called on the
|
||||||
|
* given client (thus it is safe for multiple asynchronous plugins to
|
||||||
|
* call it at various times).
|
||||||
|
*/
|
||||||
|
virtual void NotifyPostAdminChecks() =0;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -230,6 +266,41 @@ namespace SourceMod
|
|||||||
virtual void OnServerActivated(int max_clients)
|
virtual void OnServerActivated(int max_clients)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Called once a client is authorized and fully in-game, but
|
||||||
|
* before admin checks are done. This can be used to override the
|
||||||
|
* default admin checks for a client.
|
||||||
|
*
|
||||||
|
* By default, this function allows the authentication process to
|
||||||
|
* continue as normal. If you need to delay the cache searching
|
||||||
|
* process in order to get asynchronous data, then return false here.
|
||||||
|
*
|
||||||
|
* If you return false, you must call IPlayerManager::NotifyPostAdminCheck
|
||||||
|
* for the same client, or else the OnClientPostAdminCheck callback will
|
||||||
|
* never be called.
|
||||||
|
*
|
||||||
|
* @param client Client index.
|
||||||
|
* @return True to continue normally, false to override
|
||||||
|
* the authentication process.
|
||||||
|
*/
|
||||||
|
virtual bool OnClientPreAdminCheck(int client)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Called once a client is authorized and fully in-game, and
|
||||||
|
* after all post-connection authorizations have been passed. If the
|
||||||
|
* client does not have an AdminId by this stage, it means that no
|
||||||
|
* admin entry was in the cache that matched, and the user could not
|
||||||
|
* be authenticated as an admin.
|
||||||
|
*
|
||||||
|
* @param client Client index.
|
||||||
|
*/
|
||||||
|
virtual void OnClientPostAdminCheck(int client)
|
||||||
|
{
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
#define COMMAND_FILTER_ALIVE (1<<0) /**< Only allow alive players */
|
#define COMMAND_FILTER_ALIVE (1<<0) /**< Only allow alive players */
|
||||||
|
Loading…
Reference in New Issue
Block a user