*/
#include <string.h>
+#include <strings.h>
#include "../chanserv.h"
#include "../../lib/irc_string.h"
rup->nextbyname=regusernicktable[hash];
regusernicktable[hash]=rup;
- anp=findorcreateauthname(rup->ID);
+ anp=findorcreateauthname(rup->ID, rup->username);
anp->exts[chanservaext]=rup;
}
for (i=0;i<REGUSERHASHSIZE;i++) {
for (rup=regusernicktable[i];rup;rup=rup->nextbyname) {
- if (!ircd_strcmp(email,rup->email->content)) {
+ if (rup->email && !strcasecmp(email,rup->email->content)) {
return rup;
}
}
hash=maildomainnamehash(domain);
for (mdp=maildomainnametable[hash]; mdp; mdp=mdp->nextbyname)
- if (!ircd_strcmp(mdp->name->content, domain))
+ if (!strcasecmp(mdp->name->content, domain))
return mdp;
return NULL;
}
+maildomain *findnearestmaildomain(char *domain) {
+ maildomain *m = findmaildomainbydomain(domain);
+ char *p;
+
+ if(!m && (p=strchr(domain, '.')))
+ return findnearestmaildomain(++p);
+
+ return m;
+}
+
maildomain *findmaildomainbyemail(char *email) {
char *domain;
maildomain *findorcreatemaildomain(char *email) {
unsigned int hash;
char *domain,*pdomain;
- maildomain *mdp, *pmdp;
- char parent=0;
+ maildomain *mdp;
if (!(domain=strchr(email, '@')))
domain=email;
hash=maildomainnamehash(domain);
for (mdp=maildomainnametable[hash]; mdp; mdp=mdp->nextbyname)
- if (!ircd_strcmp(mdp->name->content, domain))
+ if (!strcasecmp(mdp->name->content, domain))
return mdp;
mdp=getmaildomain();
mdp->name=getsstring(domain, EMAILLEN);
mdp->count=0;
mdp->limit=0;
+ mdp->actlimit=MD_DEFAULTACTLIMIT;
+ mdp->flags=MDFLAG_DEFAULT;
mdp->users=NULL;
addmaildomaintohash(mdp);
- pdomain=domain;
- while(pdomain=strchr(pdomain, '.')) {
- parent = 1;
+ pdomain=strchr(domain, '.');
+
+ if(pdomain) {
pdomain++;
- pmdp = findorcreatemaildomain(pdomain);
- mdp->parent = pmdp;
- }
- if(!parent) {
+ mdp->parent = findorcreatemaildomain(pdomain);
+ } else {
mdp->parent = NULL;
}
+
return mdp;
}
}
void delreguserfrommaildomain(reguser *rup, maildomain *mdp) {
- maildomain *smdp;
+ maildomain *smdp, *nmdp;
reguser *ruh, *pruh=NULL;
int found=0;
+ if(!mdp)
+ return;
+
for (ruh=mdp->users; ruh; ruh=ruh->nextbydomain) {
if (ruh==rup) {
/* Found the user */
return;
}
- for(smdp=mdp;smdp;smdp=smdp->parent) {
- smdp->count--;
+ /* Free it from all the parent domains, cleaning up as we go.. */
+ for(smdp=mdp;smdp;smdp=nmdp) {
+ nmdp=smdp->parent;
+
+ /* Keep it if there are users left or we're remembering something about it. */
+ if (--smdp->count || (smdp->flags != MDFLAG_DEFAULT) || (smdp->actlimit != MD_DEFAULTACTLIMIT))
+ continue;
+
+ removemaildomainfromhash(smdp);
+ freesstring(smdp->name);
+ freemaildomain(smdp);
}
+
rup->domain=NULL;
freesstring(rup->localpart);
rup->localpart=NULL;
-
- if (!mdp->count && !MDHasLimit(mdp)) {
- removemaildomainfromhash(mdp);
- freemaildomain(mdp);
- }
}