Merge branch 'main' of https://github.com/solanum-ircd/solanum into patch-1
This commit is contained in:
commit
172c43e60c
3 changed files with 62 additions and 92 deletions
|
@ -768,7 +768,7 @@ conf_end_class(struct TopConf *tc)
|
||||||
|
|
||||||
if(EmptyString(yy_class->class_name))
|
if(EmptyString(yy_class->class_name))
|
||||||
{
|
{
|
||||||
conf_report_error("Ignoring connect block -- missing name.");
|
conf_report_error("Ignoring class block -- missing name.");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1231,40 +1231,51 @@ conf_begin_connect(struct TopConf *tc)
|
||||||
static int
|
static int
|
||||||
conf_end_connect(struct TopConf *tc)
|
conf_end_connect(struct TopConf *tc)
|
||||||
{
|
{
|
||||||
if(EmptyString(yy_server->name))
|
if (EmptyString(yy_server->name))
|
||||||
{
|
{
|
||||||
conf_report_error("Ignoring connect block -- missing name.");
|
conf_report_error("Ignoring connect block -- missing name.");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(ServerInfo.name != NULL && !irccmp(ServerInfo.name, yy_server->name))
|
if (ServerInfo.name != NULL && !irccmp(ServerInfo.name, yy_server->name))
|
||||||
{
|
{
|
||||||
conf_report_error("Ignoring connect block for %s -- name is equal to my own name.",
|
conf_report_error("Ignoring connect block for %s -- name is "
|
||||||
yy_server->name);
|
"equal to my own name.", yy_server->name);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if((EmptyString(yy_server->passwd) || EmptyString(yy_server->spasswd)) && EmptyString(yy_server->certfp))
|
if ((EmptyString(yy_server->passwd) || EmptyString(yy_server->spasswd))
|
||||||
|
&& EmptyString(yy_server->certfp))
|
||||||
{
|
{
|
||||||
conf_report_error("Ignoring connect block for %s -- no fingerprint or password credentials provided.",
|
conf_report_error("Ignoring connect block for %s -- no "
|
||||||
yy_server->name);
|
"fingerprint or password credentials "
|
||||||
|
"provided.", yy_server->name);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if((yy_server->flags & SERVER_SSL) && EmptyString(yy_server->certfp))
|
if ((yy_server->flags & SERVER_SSL) && EmptyString(yy_server->certfp))
|
||||||
{
|
{
|
||||||
conf_report_error("Ignoring connect block for %s -- no fingerprint provided for SSL connection.",
|
conf_report_error("Ignoring connect block for %s -- no "
|
||||||
yy_server->name);
|
"fingerprint provided for SSL "
|
||||||
|
"connection.", yy_server->name);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(EmptyString(yy_server->connect_host)
|
if (! (yy_server->flags & SERVER_SSL) && ! EmptyString(yy_server->certfp))
|
||||||
|
{
|
||||||
|
conf_report_error("Ignoring connect block for %s -- "
|
||||||
|
"fingerprint authentication has "
|
||||||
|
"been requested; but the ssl flag "
|
||||||
|
"is not set.", yy_server->name);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (EmptyString(yy_server->connect_host)
|
||||||
&& GET_SS_FAMILY(&yy_server->connect4) != AF_INET
|
&& GET_SS_FAMILY(&yy_server->connect4) != AF_INET
|
||||||
&& GET_SS_FAMILY(&yy_server->connect6) != AF_INET6
|
&& GET_SS_FAMILY(&yy_server->connect6) != AF_INET6)
|
||||||
)
|
|
||||||
{
|
{
|
||||||
conf_report_error("Ignoring connect block for %s -- missing host.",
|
conf_report_error("Ignoring connect block for %s -- missing "
|
||||||
yy_server->name);
|
"host.", yy_server->name);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1336,6 +1347,19 @@ conf_set_connect_send_password(void *data)
|
||||||
rb_free(yy_server->spasswd);
|
rb_free(yy_server->spasswd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (EmptyString((const char *) data))
|
||||||
|
{
|
||||||
|
yy_server->spasswd = NULL;
|
||||||
|
conf_report_warning("Invalid send_password for connect "
|
||||||
|
"block; must not be empty if provided");
|
||||||
|
}
|
||||||
|
else if (strpbrk(data, " :"))
|
||||||
|
{
|
||||||
|
yy_server->spasswd = NULL;
|
||||||
|
conf_report_error("Invalid send_password for connect "
|
||||||
|
"block; cannot contain spaces or colons");
|
||||||
|
}
|
||||||
|
else
|
||||||
yy_server->spasswd = rb_strdup(data);
|
yy_server->spasswd = rb_strdup(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1347,6 +1371,20 @@ conf_set_connect_accept_password(void *data)
|
||||||
memset(yy_server->passwd, 0, strlen(yy_server->passwd));
|
memset(yy_server->passwd, 0, strlen(yy_server->passwd));
|
||||||
rb_free(yy_server->passwd);
|
rb_free(yy_server->passwd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (EmptyString((const char *) data))
|
||||||
|
{
|
||||||
|
yy_server->passwd = NULL;
|
||||||
|
conf_report_warning("Invalid accept_password for connect "
|
||||||
|
"block; must not be empty if provided");
|
||||||
|
}
|
||||||
|
else if (strpbrk(data, " :"))
|
||||||
|
{
|
||||||
|
yy_server->passwd = NULL;
|
||||||
|
conf_report_error("Invalid accept_password for connect "
|
||||||
|
"block; cannot contain spaces or colons");
|
||||||
|
}
|
||||||
|
else
|
||||||
yy_server->passwd = rb_strdup(data);
|
yy_server->passwd = rb_strdup(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1041,6 +1041,10 @@ send_join_error(struct Client *source_p, int numeric, const char *name)
|
||||||
NORMAL_NUMERIC(ERR_NEEDREGGEDNICK);
|
NORMAL_NUMERIC(ERR_NEEDREGGEDNICK);
|
||||||
NORMAL_NUMERIC(ERR_THROTTLE);
|
NORMAL_NUMERIC(ERR_THROTTLE);
|
||||||
|
|
||||||
|
case ERR_USERONCHANNEL:
|
||||||
|
sendto_one_numeric(source_p, ERR_USERONCHANNEL,
|
||||||
|
form_str(ERR_USERONCHANNEL), source_p->name, name);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
sendto_one_numeric(source_p, numeric,
|
sendto_one_numeric(source_p, numeric,
|
||||||
"%s :Cannot join channel", name);
|
"%s :Cannot join channel", name);
|
||||||
|
|
|
@ -52,14 +52,8 @@ static void me_mechlist(struct MsgBuf *, struct Client *, struct Client *, int,
|
||||||
static void abort_sasl(struct Client *);
|
static void abort_sasl(struct Client *);
|
||||||
static void abort_sasl_exit(hook_data_client_exit *);
|
static void abort_sasl_exit(hook_data_client_exit *);
|
||||||
|
|
||||||
static void advertise_sasl_cap(bool);
|
|
||||||
static void advertise_sasl_new(struct Client *);
|
|
||||||
static void advertise_sasl_exit(void *);
|
|
||||||
static void advertise_sasl_config(void *);
|
|
||||||
|
|
||||||
static unsigned int CLICAP_SASL = 0;
|
static unsigned int CLICAP_SASL = 0;
|
||||||
static char mechlist_buf[BUFSIZE];
|
static char mechlist_buf[BUFSIZE];
|
||||||
static bool sasl_agent_present = false;
|
|
||||||
|
|
||||||
struct Message authenticate_msgtab = {
|
struct Message authenticate_msgtab = {
|
||||||
"AUTHENTICATE", 0, 0, 0, 0,
|
"AUTHENTICATE", 0, 0, 0, 0,
|
||||||
|
@ -80,23 +74,9 @@ mapi_clist_av1 sasl_clist[] = {
|
||||||
mapi_hfn_list_av1 sasl_hfnlist[] = {
|
mapi_hfn_list_av1 sasl_hfnlist[] = {
|
||||||
{ "new_local_user", (hookfn) abort_sasl },
|
{ "new_local_user", (hookfn) abort_sasl },
|
||||||
{ "client_exit", (hookfn) abort_sasl_exit },
|
{ "client_exit", (hookfn) abort_sasl_exit },
|
||||||
{ "new_remote_user", (hookfn) advertise_sasl_new },
|
|
||||||
{ "after_client_exit", (hookfn) advertise_sasl_exit },
|
|
||||||
{ "conf_read_end", (hookfn) advertise_sasl_config },
|
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
static bool
|
|
||||||
sasl_visible(struct Client *ignored)
|
|
||||||
{
|
|
||||||
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 const char *
|
static const char *
|
||||||
sasl_data(struct Client *client_p)
|
sasl_data(struct Client *client_p)
|
||||||
{
|
{
|
||||||
|
@ -104,7 +84,6 @@ sasl_data(struct Client *client_p)
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ClientCapability capdata_sasl = {
|
static struct ClientCapability capdata_sasl = {
|
||||||
.visible = sasl_visible,
|
|
||||||
.data = sasl_data,
|
.data = sasl_data,
|
||||||
.flags = CLICAP_FLAGS_STICKY | CLICAP_FLAGS_PRIORITY,
|
.flags = CLICAP_FLAGS_STICKY | CLICAP_FLAGS_PRIORITY,
|
||||||
};
|
};
|
||||||
|
@ -118,19 +97,10 @@ static int
|
||||||
_modinit(void)
|
_modinit(void)
|
||||||
{
|
{
|
||||||
memset(mechlist_buf, 0, sizeof mechlist_buf);
|
memset(mechlist_buf, 0, sizeof mechlist_buf);
|
||||||
sasl_agent_present = false;
|
|
||||||
|
|
||||||
advertise_sasl_config(NULL);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
DECLARE_MODULE_AV2(sasl, _modinit, NULL, sasl_clist, NULL, sasl_hfnlist, sasl_cap_list, NULL, sasl_desc);
|
||||||
_moddeinit(void)
|
|
||||||
{
|
|
||||||
advertise_sasl_cap(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
DECLARE_MODULE_AV2(sasl, _modinit, _moddeinit, sasl_clist, NULL, sasl_hfnlist, sasl_cap_list, NULL, sasl_desc);
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
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,
|
||||||
|
@ -366,45 +336,3 @@ abort_sasl_exit(hook_data_client_exit *data)
|
||||||
if (data->target->localClient)
|
if (data->target->localClient)
|
||||||
abort_sasl(data->target);
|
abort_sasl(data->target);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
advertise_sasl_cap(bool available)
|
|
||||||
{
|
|
||||||
if (sasl_agent_present != available) {
|
|
||||||
if (available) {
|
|
||||||
sendto_local_clients_with_capability(CLICAP_CAP_NOTIFY, ":%s CAP * NEW :sasl", me.name);
|
|
||||||
} else {
|
|
||||||
sendto_local_clients_with_capability(CLICAP_CAP_NOTIFY, ":%s CAP * DEL :sasl", me.name);
|
|
||||||
}
|
|
||||||
sasl_agent_present = available;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
advertise_sasl_new(struct Client *client_p)
|
|
||||||
{
|
|
||||||
if (!ConfigFileEntry.sasl_service)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (irccmp(client_p->name, ConfigFileEntry.sasl_service))
|
|
||||||
return;
|
|
||||||
|
|
||||||
advertise_sasl_cap(IsService(client_p));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
advertise_sasl_exit(void *ignored)
|
|
||||||
{
|
|
||||||
if (!ConfigFileEntry.sasl_service)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (sasl_agent_present) {
|
|
||||||
advertise_sasl_cap(sasl_visible(NULL));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
advertise_sasl_config(void *ignored)
|
|
||||||
{
|
|
||||||
advertise_sasl_cap(sasl_visible(NULL));
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in a new issue