]>
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
)
64 /* Make sure it's not too long */
65 if (strlen(mask
) > NICKLEN
+ USERLEN
+ HOSTLEN
+ 2)
71 Error("gline", ERR_ERROR
, "Failed to allocate new gline");
75 if (mask
[0] == '#' || mask
[0] == '&') {
76 gl
->flags
|= GLINE_BADCHAN
;
77 gl
->user
= getsstring(mask
, CHANNELLEN
);
87 gl
->flags
|= GLINE_REALNAME
;
88 gl
->user
= getsstring(mask
+ 2, REALLEN
);
92 strncpy(dupmask
, mask
, sizeof(dupmask
));
93 canon_userhost(dupmask
, &nick
, &user
, &host
, "*");
95 if (ipmask_parse(host
, &gl
->ip
, &gl
->bits
))
96 gl
->flags
|= GLINE_IPMASK
;
98 gl
->flags
|= GLINE_HOSTMASK
;
100 /* Don't allow invalid IPv6 bans as those might match * on snircd 1.3.4 */
103 for (pos
= host
; *pos
; pos
++)
108 controlwall(NO_OPER
, NL_GLINES
, "Warning: Parsed invalid IPv6 G-Line: %s", mask
);
113 if (strcmp(nick
, "*") != 0)
114 gl
->nick
= getsstring(nick
, 512);
116 if (strcmp(user
, "*") != 0)
117 gl
->user
= getsstring(user
, 512);
119 if (strcmp(host
, "*") != 0)
120 gl
->host
= getsstring(host
, 512);
125 char *glinetostring(gline
*gl
) {
126 static char mask
[512]; /* check */
128 if (gl
->flags
& GLINE_REALNAME
) {
130 snprintf(mask
, sizeof(mask
), "$R%s", gl
->user
->content
);
132 strncpy(mask
, "$R*", sizeof(mask
));
137 if (gl
->flags
& GLINE_BADCHAN
) {
140 strncpy(mask
, gl
->user
->content
, sizeof(mask
));
144 snprintf(mask
, sizeof(mask
), "%s!%s@%s",
145 gl
->nick
? gl
->nick
->content
: "*",
146 gl
->user
? gl
->user
->content
: "*",
147 gl
->host
? gl
->host
->content
: "*");