]>
jfr.im git - irc/quakenet/newserv.git/blob - chanserv/usercmds/domainmode.c
1 /* Automatically generated by refactor.pl.
7 * CMDDESC: Set/Unset Mail Domain Modes
8 * CMDFUNC: csu_dodomainmode
9 * CMDPROTO: int csu_dodomainmode(void *source, int cargc, char **cargv);
10 * CMDHELP: Usage: domainmode <domain> [<flags>]
11 * CMDHELP: Views or modifies the domainmode flags for specified domain.
12 * CMDHELP: Flags consist of:
13 * CMDHELP: +b don't allow email addresses from this domain.
14 * CMDHELP: +u <limit> don't allow more than <limit> accounts to share
15 * CMDHELP: email addresses on this domain.
16 * CMDHELP: +l <limit> don't allow more than <limit> accounts with
17 * CMDHELP: email addresses on this domain.
18 * CMDHELP: Note that domains are hierarchical, so setting +b on org will
19 * CMDHELP: prevent operations from quakenet.org, fish.quakenet.org, etc.
22 #include "../chanserv.h"
23 #include "../../lib/irc_string.h"
27 char *getdomainmode(maildomain
*mdp
) {
32 strcpy(buf1
,printflags(mdp
->flags
, mdflags
));
37 if (mdp
->flags
& MDFLAG_LIMIT
) {
38 sprintf(buf2
, " %d",mdp
->limit
);
42 if (mdp
->flags
& MDFLAG_ACTLIMIT
) {
43 sprintf(buf2
, " %d",mdp
->actlimit
);
48 strcpy(buf1
,"(none)");
54 int checkdomain(char *dom
) {
55 const char *validchars
="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890";
60 for (ch
=dom
;*ch
;ch
++) {
63 /* This is two dots in a row - bad */
67 } else if (*ch
=='-') {
69 /* either .- or - at the start - bad */
73 if (!strchr(validchars
, *ch
)) {
74 /* Unrecognized char */
78 /* We encountered some random valid characters, so hyphens (and dots) are now OK until the next dot */
85 /* Can't end on a dot */
92 int csu_dodomainmode(void *source
, int cargc
, char **cargv
) {
95 flag_t forceflags
, currentflags
;
97 int carg
=2,limdone
=0,actlimdone
=0;
98 unsigned int newlim
=0;
99 unsigned int newactlim
=0;
102 chanservstdmessage(sender
,QM_NOTENOUGHPARAMS
,"domainmode");
106 if (checkdomain(cargv
[0])) {
107 chanservstdmessage(sender
,QM_INVALIDDOMAIN
,cargv
[0]);
111 if(!(mdp
=findorcreatemaildomain(cargv
[0]))) {
116 /* Save the current modes.. */
117 strcpy(buf1
,getdomainmode(mdp
));
119 /* Pick out the + flags: start from 0 */
121 setflags(&forceflags
, MDFLAG_ALL
, cargv
[1], mdflags
, REJECT_NONE
);
122 currentflags
=mdp
->flags
;
123 setflags(¤tflags
, MDFLAG_ALL
, cargv
[1], mdflags
, REJECT_NONE
);
125 if ((forceflags
& MDFLAG_LIMIT
) &&
126 (!(forceflags
& MDFLAG_ACTLIMIT
) || strrchr(cargv
[1],'l') < strrchr(cargv
[1],'u'))) {
128 chanservstdmessage(sender
,QM_NOTENOUGHPARAMS
,"domainmode");
131 newlim
=strtol(cargv
[carg
++],NULL
,10);
135 if ((forceflags
& MDFLAG_LIMIT
) && !limdone
) {
137 chanservstdmessage(sender
,QM_NOTENOUGHPARAMS
,"domainmode");
140 newlim
=strtol(cargv
[carg
++],NULL
,10);
144 if ((forceflags
& MDFLAG_ACTLIMIT
) && !actlimdone
) {
146 chanservstdmessage(sender
,QM_NOTENOUGHPARAMS
,"chanmode");
149 newactlim
=strtol(cargv
[carg
++],NULL
,10);
153 /* It parsed OK, so update the structure.. */
154 mdp
->flags
=currentflags
;
156 mdp
->actlimit
=newactlim
;
157 if(!(currentflags
& MDFLAG_ACTLIMIT
))
161 if(!(currentflags
& MDFLAG_LIMIT
))
165 csdb_updatemaildomain(mdp
);
167 csdb_deletemaildomain(mdp
);
170 mdp
->ID
=++lastdomainID
;
171 csdb_createmaildomain(mdp
);
174 chanservstdmessage(sender
, QM_DONE
);
175 cs_log(sender
,"DOMAINMODE %s %s (%s -> %s)",mdp
->name
->content
,cargv
[1],buf1
,getdomainmode(mdp
));
177 chanservstdmessage(sender
,QM_CURDOMAINMODES
,mdp
->name
->content
,getdomainmode(mdp
));