]>
jfr.im git - irc/quakenet/newserv.git/blob - glines/glines_formats.c
4 #include "../lib/irc_string.h"
5 #include "../lib/version.h"
6 #include "../core/schedule.h"
7 #include "../irc/irc.h"
8 #include "../trusts/trusts.h"
9 #include "../control/control.h"
12 /** Find canonical user and host for a string.
13 * If \a userhost starts with '$', assign \a userhost to *user_p and NULL to *host_p.
14 * Otherwise, if \a userhost contains '@', assign the earlier part of it to *user_p and the rest to *host_p.
15 * Otherwise, assign \a def_user to *user_p and \a userhost to *host_p.
17 * @param[in] userhost Input string from user.
18 * @param[out] nick_p Gets pointer to nick part of hostmask.
19 * @param[out] user_p Gets pointer to user (or channel/realname) part of hostmask.
20 * @param[out] host_p Gets point to host part of hostmask (may be assigned NULL).
21 * @param[in] def_user Default value for user part.
24 canon_userhost(char *userhost
, char **nick_p
, char **user_p
, char **host_p
, char *def_user
) {
27 if (*userhost
== '$') {
34 if ((tmp
= strchr(userhost
, '!'))) {
42 if (!(s
= strchr(tmp
, '@'))) {
52 gline
*makegline(const char *mask
) {
53 /* populate gl-> user,host,node,nick and set appropriate flags */
56 char *nick
, *user
, *host
;
60 /* Make sure there are no spaces in the mask */
61 if (strchr(mask
, ' ') != NULL
)
67 Error("gline", ERR_ERROR
, "Failed to allocate new gline");
71 if (mask
[0] == '#' || mask
[0] == '&') {
72 gl
->flags
|= GLINE_BADCHAN
;
73 gl
->user
= getsstring(mask
, CHANNELLEN
);
83 gl
->flags
|= GLINE_REALNAME
;
85 if (strcmp(mask
+ 2, "*") != 0)
86 gl
->user
= getsstring(mask
+ 2, REALLEN
);
91 strncpy(dupmask
, mask
, sizeof(dupmask
));
92 canon_userhost(dupmask
, &nick
, &user
, &host
, "*");
94 if (ipmask_parse(host
, &gl
->ip
, &gl
->bits
))
95 gl
->flags
|= GLINE_IPMASK
;
97 gl
->flags
|= GLINE_HOSTMASK
;
99 /* Don't allow invalid IPv6 bans as those might match * on snircd 1.3.4 */
102 for (pos
= host
; *pos
; pos
++)
107 controlwall(NO_OPER
, NL_GLINES_AUTO
, "Warning: Parsed invalid IPv6 G-Line: %s", mask
);
112 if (strcmp(nick
, "*") != 0)
113 gl
->nick
= getsstring(nick
, 512);
115 if (strcmp(user
, "*") != 0)
116 gl
->user
= getsstring(user
, 512);
118 if (strcmp(host
, "*") != 0)
119 gl
->host
= getsstring(host
, 512);
124 char *glinetostring(gline
*gl
) {
125 static char mask
[512]; /* check */
127 if (gl
->flags
& GLINE_REALNAME
) {
128 snprintf(mask
, sizeof(mask
), "$R%s", (gl
->user
) ? gl
->user
->content
: "*");
132 if (gl
->flags
& GLINE_BADCHAN
) {
135 strncpy(mask
, gl
->user
->content
, sizeof(mask
));
139 snprintf(mask
, sizeof(mask
), "%s!%s@%s",
140 gl
->nick
? gl
->nick
->content
: "*",
141 gl
->user
? gl
->user
->content
: "*",
142 gl
->host
? gl
->host
->content
: "*");