mirror of
https://github.com/matrix-construct/construct
synced 2024-11-16 23:10:54 +01:00
sasl: transfer ownership of 'sasl' capability to m_sasl module
This commit is contained in:
parent
62a0966666
commit
193d4db30c
4 changed files with 52 additions and 30 deletions
|
@ -63,7 +63,6 @@ struct ClientCapability {
|
||||||
|
|
||||||
/* builtin client capabilities */
|
/* builtin client capabilities */
|
||||||
extern unsigned int CLICAP_MULTI_PREFIX;
|
extern unsigned int CLICAP_MULTI_PREFIX;
|
||||||
extern unsigned int CLICAP_SASL;
|
|
||||||
extern unsigned int CLICAP_ACCOUNT_NOTIFY;
|
extern unsigned int CLICAP_ACCOUNT_NOTIFY;
|
||||||
extern unsigned int CLICAP_EXTENDED_JOIN;
|
extern unsigned int CLICAP_EXTENDED_JOIN;
|
||||||
extern unsigned int CLICAP_AWAY_NOTIFY;
|
extern unsigned int CLICAP_AWAY_NOTIFY;
|
||||||
|
|
|
@ -96,7 +96,6 @@ unsigned int CAP_BAN;
|
||||||
unsigned int CAP_MLOCK;
|
unsigned int CAP_MLOCK;
|
||||||
|
|
||||||
unsigned int CLICAP_MULTI_PREFIX;
|
unsigned int CLICAP_MULTI_PREFIX;
|
||||||
unsigned int CLICAP_SASL;
|
|
||||||
unsigned int CLICAP_ACCOUNT_NOTIFY;
|
unsigned int CLICAP_ACCOUNT_NOTIFY;
|
||||||
unsigned int CLICAP_EXTENDED_JOIN;
|
unsigned int CLICAP_EXTENDED_JOIN;
|
||||||
unsigned int CLICAP_AWAY_NOTIFY;
|
unsigned int CLICAP_AWAY_NOTIFY;
|
||||||
|
@ -144,7 +143,6 @@ init_builtin_capabs(void)
|
||||||
cli_capindex = capability_index_create("client capabilities");
|
cli_capindex = capability_index_create("client capabilities");
|
||||||
|
|
||||||
CLICAP_MULTI_PREFIX = capability_put(cli_capindex, "multi-prefix", NULL);
|
CLICAP_MULTI_PREFIX = capability_put(cli_capindex, "multi-prefix", NULL);
|
||||||
CLICAP_SASL = capability_put(cli_capindex, "sasl", NULL);
|
|
||||||
CLICAP_ACCOUNT_NOTIFY = capability_put(cli_capindex, "account-notify", NULL);
|
CLICAP_ACCOUNT_NOTIFY = capability_put(cli_capindex, "account-notify", NULL);
|
||||||
CLICAP_EXTENDED_JOIN = capability_put(cli_capindex, "extended-join", NULL);
|
CLICAP_EXTENDED_JOIN = capability_put(cli_capindex, "extended-join", NULL);
|
||||||
CLICAP_AWAY_NOTIFY = capability_put(cli_capindex, "away-notify", NULL);
|
CLICAP_AWAY_NOTIFY = capability_put(cli_capindex, "away-notify", NULL);
|
||||||
|
|
|
@ -59,6 +59,21 @@ DECLARE_MODULE_AV1(cap, NULL, NULL, cap_clist, NULL, NULL, "$Revision: 676 $");
|
||||||
#define IsCapableEntry(c, e) IsCapable(c, 1 << (e)->value)
|
#define IsCapableEntry(c, e) IsCapable(c, 1 << (e)->value)
|
||||||
#define HasCapabilityFlag(c, f) (c->ownerdata != NULL && (((struct ClientCapability *)c->ownerdata)->flags & (f)) == f)
|
#define HasCapabilityFlag(c, f) (c->ownerdata != NULL && (((struct ClientCapability *)c->ownerdata)->flags & (f)) == f)
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
clicap_visible(const struct CapabilityEntry *cap)
|
||||||
|
{
|
||||||
|
struct ClientCapability *clicap;
|
||||||
|
|
||||||
|
if (cap->ownerdata == NULL)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
clicap = cap->ownerdata;
|
||||||
|
if (clicap->visible == NULL)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return clicap->visible();
|
||||||
|
}
|
||||||
|
|
||||||
/* clicap_find()
|
/* clicap_find()
|
||||||
* Used iteratively over a buffer, extracts individual cap tokens.
|
* Used iteratively over a buffer, extracts individual cap tokens.
|
||||||
*
|
*
|
||||||
|
@ -165,18 +180,9 @@ clicap_generate(struct Client *source_p, const char *subcmd, int flags, int clea
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((1 << entry->value) == CLICAP_SASL)
|
if (!clicap_visible(entry))
|
||||||
{
|
|
||||||
struct Client *agent_p = NULL;
|
|
||||||
|
|
||||||
if (!ConfigFileEntry.sasl_service)
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
agent_p = find_named_client(ConfigFileEntry.sasl_service);
|
|
||||||
if (agent_p == NULL || !IsService(agent_p))
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* \r\n\0, possible "-~=", space, " *" */
|
/* \r\n\0, possible "-~=", space, " *" */
|
||||||
if(buflen + strlen(entry->cap) >= BUFSIZE - 10)
|
if(buflen + strlen(entry->cap) >= BUFSIZE - 10)
|
||||||
{
|
{
|
||||||
|
@ -341,24 +347,12 @@ cap_req(struct Client *source_p, const char *arg)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if ((1 << cap->value) == CLICAP_SASL)
|
if (!clicap_visible(cap))
|
||||||
{
|
|
||||||
struct Client *agent_p = NULL;
|
|
||||||
|
|
||||||
if (!ConfigFileEntry.sasl_service)
|
|
||||||
{
|
{
|
||||||
finished = 0;
|
finished = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
agent_p = find_named_client(ConfigFileEntry.sasl_service);
|
|
||||||
if (agent_p == NULL || !IsService(agent_p))
|
|
||||||
{
|
|
||||||
finished = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
capadd |= (1 << cap->value);
|
capadd |= (1 << cap->value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -52,6 +52,8 @@ static void abort_sasl_exit(hook_data_client_exit *);
|
||||||
static void advertise_sasl(struct Client *);
|
static void advertise_sasl(struct Client *);
|
||||||
static void advertise_sasl_exit(hook_data_client_exit *);
|
static void advertise_sasl_exit(hook_data_client_exit *);
|
||||||
|
|
||||||
|
unsigned int CLICAP_SASL = 0;
|
||||||
|
|
||||||
struct Message authenticate_msgtab = {
|
struct Message authenticate_msgtab = {
|
||||||
"AUTHENTICATE", 0, 0, 0, 0,
|
"AUTHENTICATE", 0, 0, 0, 0,
|
||||||
{{m_authenticate, 2}, {m_authenticate, 2}, mg_ignore, mg_ignore, mg_ignore, {m_authenticate, 2}}
|
{{m_authenticate, 2}, {m_authenticate, 2}, mg_ignore, mg_ignore, mg_ignore, {m_authenticate, 2}}
|
||||||
|
@ -72,7 +74,36 @@ mapi_hfn_list_av1 sasl_hfnlist[] = {
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
DECLARE_MODULE_AV1(sasl, NULL, NULL, sasl_clist, NULL, sasl_hfnlist, "$Revision: 1409 $");
|
static int
|
||||||
|
sasl_visible(void)
|
||||||
|
{
|
||||||
|
struct Client *agent_p = NULL;
|
||||||
|
|
||||||
|
if (ConfigFileEntry.sasl_service)
|
||||||
|
agent_p = find_named_client(ConfigFileEntry.sasl_service);
|
||||||
|
|
||||||
|
return agent_p != NULL && IsService(agent_p);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct ClientCapability capdata_sasl = {
|
||||||
|
.visible = sasl_visible,
|
||||||
|
.flags = CLICAP_FLAGS_STICKY,
|
||||||
|
};
|
||||||
|
|
||||||
|
static int
|
||||||
|
_modinit(void)
|
||||||
|
{
|
||||||
|
CLICAP_SASL = capability_put(cli_capindex, "sasl", &capdata_sasl);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_moddeinit(void)
|
||||||
|
{
|
||||||
|
capability_orphan(cli_capindex, "sasl");
|
||||||
|
}
|
||||||
|
|
||||||
|
DECLARE_MODULE_AV1(sasl, _modinit, _moddeinit, sasl_clist, NULL, sasl_hfnlist, "$Revision: 1409 $");
|
||||||
|
|
||||||
static int
|
static int
|
||||||
m_authenticate(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p,
|
m_authenticate(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p,
|
||||||
|
|
Loading…
Reference in a new issue