/* Return 1 if successful, 0 if not */ int queen8_solve (int matrix[][N_QUEENS], int n_queens_fixed) { int i; if (n_queens_fixed >= N_QUEENS) { return 1; } fprintf (stderr, "%d\n", n_queens_fixed); for (i = 0; i < N_QUEENS; i++) { if (n_queens_fixed == 0 || isallowed (matrix, i, n_queens_fixed)) { matrix[i][n_queens_fixed] = 1; if (!queen8_solve (matrix, n_queens_fixed + 1)) { matrix[i][n_queens_fixed] = 0; } else { return 1; } } } return 0; }
/* Sanitize user input, make sure to NUL terminate. */ static char *sanitize(char *arg, size_t len) { size_t i = 0; while (isallowed(arg[i]) && i < len) i++; if (i + 1 < len) { arg[i + 1] = 0; return arg; } return NULL; }
/*===========================================================================* * sendmask_dmp * *===========================================================================*/ PUBLIC void sendmask_dmp() { register struct proc *rp; static struct proc *oldrp = BEG_PROC_ADDR; int r, i,j, n = 0; /* First obtain a fresh copy of the current process table. */ if ((r = sys_getproctab(proc)) != OK) { report("IS","warning: couldn't get copy of process table", r); return; } printf("\n\n"); printf("Sendmask dump for process table. User processes (*) don't have []."); printf("\n"); printf("The rows of bits indicate to which processes each process may send."); printf("\n\n"); #if DEAD_CODE printf(" "); for (j=proc_nr(BEG_PROC_ADDR); j< INIT_PROC_NR+1; j++) { printf("%3d", j); } printf(" *\n"); for (rp = oldrp; rp < END_PROC_ADDR; rp++) { if (isemptyp(rp)) continue; if (++n > 20) break; printf("%8s ", rp->p_name); if (proc_nr(rp) == IDLE) printf("(%2d) ", proc_nr(rp)); else if (proc_nr(rp) < 0) printf("[%2d] ", proc_nr(rp)); else printf(" %2d ", proc_nr(rp)); for (j=proc_nr(BEG_PROC_ADDR); j<INIT_PROC_NR+2; j++) { if (isallowed(rp->p_sendmask, j)) printf(" 1 "); else printf(" 0 "); } printf("\n"); } if (rp == END_PROC_ADDR) { printf("\n"); rp = BEG_PROC_ADDR; } else printf("--more--\r"); oldrp = rp; #endif }
void file2url(unsigned char *sb, unsigned char *buf, unsigned bufsize, int * inbuf, int skip255){ for(; *sb; sb++){ if((bufsize - *inbuf)<16)break; if(*sb=='\r'||*sb=='\n')continue; if(isallowed(*sb))buf[(*inbuf)++]=*sb; else if(*sb == '\"'){ memcpy(buf+*inbuf, "%5C%22", 6); (*inbuf)+=6; } else if(skip255 && *sb == 255 && *(sb+1) == 255) { memcpy(buf+*inbuf, "%ff", 3); (*inbuf)+=3; sb++; } else { sprintf((char *)buf+*inbuf, "%%%.2x", (unsigned)*sb); (*inbuf)+=3; } } }
int _register_user(aClient *cptr, aClient *sptr, char *nick, char *username, char *umode, char *virthost, char *ip) { ConfigItem_ban *bconf; char *parv[3], *tmpstr; #ifdef HOSTILENAME char stripuser[USERLEN + 1], *u1 = stripuser, *u2, olduser[USERLEN + 1], userbad[USERLEN * 2 + 1], *ubad = userbad, noident = 0; #endif int xx; anUser *user = sptr->user; aClient *nsptr; int i; char mo[256]; char *tkllayer[9] = { me.name, /*0 server.name */ "+", /*1 +|- */ "z", /*2 G */ "*", /*3 user */ NULL, /*4 host */ NULL, NULL, /*6 expire_at */ NULL, /*7 set_at */ NULL /*8 reason */ }; aTKline *savetkl = NULL; ConfigItem_tld *tlds; cptr->last = TStime(); parv[0] = sptr->name; parv[1] = parv[2] = NULL; nick = sptr->name; /* <- The data is always the same, but the pointer is sometimes not, * I need this for one of my modules, so do not remove! ;) -- Syzop */ if (MyConnect(sptr)) { if ((i = check_client(sptr, username))) { /* This had return i; before -McSkaf */ if (i == -5) return FLUSH_BUFFER; sendto_snomask(SNO_CLIENT, "*** Notice -- %s from %s.", i == -3 ? "Too many connections" : "Unauthorized connection", get_client_host(sptr)); ircstp->is_ref++; ircsprintf(mo, "This server is full."); return exit_client(cptr, sptr, &me, i == -3 ? mo : "You are not authorized to connect to this server"); } if (sptr->hostp) { /* reject ascci < 32 and ascii >= 127 (note: upper resolver might be even more strict) */ for (tmpstr = sptr->sockhost; *tmpstr > ' ' && *tmpstr < 127; tmpstr++); /* if host contained invalid ASCII _OR_ the DNS reply is an IP-like reply * (like: 1.2.3.4), then reject it and use IP instead. */ if (*tmpstr || !*user->realhost || (isdigit(*sptr->sockhost) && isdigit(*tmpstr - 1))) strncpyzt(sptr->sockhost, (char *)Inet_ia2p((struct IN_ADDR*)&sptr->ip), sizeof(sptr->sockhost)); } strncpyzt(user->realhost, sptr->sockhost, sizeof(sptr->sockhost)); /* SET HOSTNAME */ /* * I do not consider *, ~ or ! 'hostile' in usernames, * as it is easy to differentiate them (Use \*, \? and \\) * with the possible? * exception of !. With mIRC etc. ident is easy to fake * to contain @ though, so if that is found use non-ident * username. -Donwulff * * I do, We only allow a-z A-Z 0-9 _ - and . now so the * !strchr(sptr->username, '@') check is out of date. -Cabal95 * * Moved the noident stuff here. -OnyxDragon */ if (!(sptr->flags & FLAGS_DOID)) strncpyzt(user->username, username, USERLEN + 1); else if (sptr->flags & FLAGS_GOTID) strncpyzt(user->username, sptr->username, USERLEN + 1); else { /* because username may point to user->username */ char temp[USERLEN + 1]; strncpyzt(temp, username, USERLEN + 1); if (IDENT_CHECK == 0) { strncpyzt(user->username, temp, USERLEN + 1); } else { *user->username = '******'; strncpyzt((user->username + 1), temp, USERLEN); #ifdef HOSTILENAME noident = 1; #endif } } #ifdef HOSTILENAME /* * Limit usernames to just 0-9 a-z A-Z _ - and . * It strips the "bad" chars out, and if nothing is left * changes the username to the first 8 characters of their * nickname. After the MOTD is displayed it sends numeric * 455 to the user telling them what(if anything) happened. * -Cabal95 * * Moved the noident thing to the right place - see above * -OnyxDragon * * No longer use nickname if the entire ident is invalid, * if thats the case, it is likely the user is trying to cause * problems so just ban them. (Using the nick could introduce * hostile chars) -- codemastr */ for (u2 = user->username + noident; *u2; u2++) { if (isallowed(*u2)) *u1++ = *u2; else if (*u2 < 32) { /* * Make sure they can read what control * characters were in their username. */ *ubad++ = '^'; *ubad++ = *u2 + '@'; } else *ubad++ = *u2; } *u1 = '\0'; *ubad = '\0'; if (strlen(stripuser) != strlen(user->username + noident)) { if (stripuser[0] == '\0') { return exit_client(cptr, cptr, cptr, "Hostile username. Please use only 0-9 a-z A-Z _ - and . in your username."); } strcpy(olduser, user->username + noident); strncpy(user->username + 1, stripuser, USERLEN - 1); user->username[0] = '~'; user->username[USERLEN] = '\0'; } else u1 = NULL; #endif /* * following block for the benefit of time-dependent K:-lines */ if ((bconf = Find_ban(sptr, make_user_host(user->username, user->realhost), CONF_BAN_USER))) { ircstp->is_ref++; sendto_one(cptr, ":%s %d %s :*** You are not welcome on this server (%s)" " Email %s for more information.", me.name, ERR_YOUREBANNEDCREEP, cptr->name, bconf->reason ? bconf->reason : "", KLINE_ADDRESS); return exit_client(cptr, cptr, cptr, "You are banned"); } if ((bconf = Find_ban(NULL, sptr->info, CONF_BAN_REALNAME))) { ircstp->is_ref++; sendto_one(cptr, ":%s %d %s :*** Your GECOS (real name) is not allowed on this server (%s)" " Please change it and reconnect", me.name, ERR_YOUREBANNEDCREEP, cptr->name, bconf->reason ? bconf->reason : ""); return exit_client(cptr, sptr, &me, "Your GECOS (real name) is banned from this server"); } tkl_check_expire(NULL); /* Check G/Z lines before shuns -- kill before quite -- codemastr */ if ((xx = find_tkline_match(sptr, 0)) < 0) { ircstp->is_ref++; return xx; } find_shun(sptr); /* Technical note regarding next few lines of code: * If the spamfilter matches, depending on the action: * If it's block/dccblock/whatever the retval is -1 ===> we return, client stays "locked forever". * If it's kill/tklline the retval is -2 ==> we return with -2 (aka: FLUSH_BUFFER) * If it's action is viruschan the retval is -5 ==> we continue, and at the end of this return * take special actions. We cannot do that directly here since the user is not fully registered * yet (at all). * -- Syzop */ spamfilter_build_user_string(spamfilter_user, sptr->name, sptr); xx = dospamfilter(sptr, spamfilter_user, SPAMF_USER, NULL, 0, &savetkl); if ((xx < 0) && (xx != -5)) return xx; RunHookReturnInt(HOOKTYPE_PRE_LOCAL_CONNECT, sptr, !=0); } else {
int getexp (double *data,char *oprt) { int c,i=0,mrkpot=POINT_UNEXIST; char temp[MAX_DATA_BIT]; while (is_space(c = liyx[_index++])); if (c=='\n') {*oprt=c;return 8;} if (!isallowed(c)) return -1; if (EXP_INIT==YES) { if(!isFIRSTallow(c)) return -4; if(c=='('){++BRACKET_COUNT;*oprt=c;return 6;} else{ temp[i]=c; if (c=='.') mrkpot=i; ++i; } } else { if (!isallowed(c)) return -1; if (c=='(') { ++BRACKET_COUNT; *oprt=c; EXP_INIT=YES; return 6; } if (c==')') { --BRACKET_COUNT; *oprt=c; return 7; } if (isoprt(c)) { *oprt=c; return 5; } else { temp[i]=c; if (c=='.') mrkpot=i; ++i; } } while ((isdigit(c=liyx[_index++])||c=='.') && i<MAX_DATA_BIT){ if (c=='.'&&mrkpot!=POINT_UNEXIST) return -2; else{ temp[i]=c; if (c=='.') mrkpot=i; ++i; } } if (i==1&&!isdigit(temp[0])||i==2&&!isdigit(temp[0])&&!isdigit(temp[1])) {*oprt=c;return -2;} if(i==MAX_DATA_BIT&&(isdigit(c)||c=='.')) {*oprt=c;return -3;} if (mrkpot==POINT_UNEXIST) mrkpot=i; *data=char_to_double (temp,mrkpot,i); EXP_INIT=NO; if (is_space(c)) while (is_space(c=liyx[_index++])); if (c=='\n') {*oprt=c;return 4;} if (!isoprt(c)&&c!='('&&c!=')') {*oprt=c;return -1;} *oprt=c; if (isoprt(c)) return 1; if (c=='(') { ++BRACKET_COUNT; EXP_INIT=YES; return 2; } else { --BRACKET_COUNT; return 3; } }
int m_chgident(aClient *cptr, aClient *sptr, int parc, char *parv[]) { aClient *acptr; char *s; int legalident = 1; if (MyClient(sptr) && !IsAnOper(sptr)) { sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]); return 0; } #ifdef DISABLE_USERMOD if (MyClient(sptr)) { sendto_one(sptr, err_str(ERR_DISABLED), me.name, sptr->name, "CHGIDENT", "This command is disabled on this server"); return 0; } #endif if ((parc < 3) || !*parv[2]) { sendto_one(sptr, err_str(ERR_NEEDMOREPARAMS), me.name, sptr->name, "CHGIDENT"); return 0; } if (strlen(parv[2]) > (USERLEN)) { sendnotice(sptr, "*** ChgIdent Error: Requested ident too long -- rejected."); return 0; } /* illegal?! */ for (s = parv[2]; *s; s++) { if ((*s == '~') && (s == parv[2])) continue; if (!isallowed(*s)) { legalident = 0; } } if (legalident == 0) { sendnotice(sptr, "*** /ChgIdent Error: A ident may contain a-z, A-Z, 0-9, '-' & '.' - Please only use them"); return 0; } if ((acptr = find_person(parv[1], NULL))) { DYN_LOCAL(char, did_parts, acptr->user->joined); switch (UHOST_ALLOWED) { case UHALLOW_NEVER: if (MyClient(sptr)) { sendto_one(sptr, err_str(ERR_DISABLED), me.name, sptr->name, "CHGIDENT", "This command is disabled on this server"); DYN_FREE(did_parts); return 0; } break; case UHALLOW_ALWAYS: break; case UHALLOW_NOCHANS: if (IsPerson(acptr) && MyClient(sptr) && acptr->user->joined) { sendnotice(sptr, "*** /ChgIdent can not be used while %s is on a channel", acptr->name); DYN_FREE(did_parts); return 0; } break; case UHALLOW_REJOIN: rejoin_doparts(acptr, did_parts); /* join sent later when the ident has been changed */ break; } if (!IsULine(sptr)) { sendto_snomask(SNO_EYES, "%s changed the virtual ident of %s (%s@%s) to be %s", sptr->name, acptr->name, acptr->user->username, GetHost(acptr), parv[2]); /* Logging ability added by XeRXeS */ ircd_log(LOG_CHGCMDS, "CHGIDENT: %s changed the virtual ident of %s (%s@%s) to be %s", sptr->name, acptr->name, acptr->user->username, GetHost(acptr), parv[2]); } sendto_serv_butone_token(cptr, sptr->name, MSG_CHGIDENT, TOK_CHGIDENT, "%s %s", acptr->name, parv[2]); ircsprintf(acptr->user->username, "%s", parv[2]); if (UHOST_ALLOWED == UHALLOW_REJOIN) rejoin_dojoinandmode(acptr, did_parts); DYN_FREE(did_parts); return 0; }
DLLFUNC int m_setident(aClient *cptr, aClient *sptr, int parc, char *parv[]) { char *vident, *s; #ifndef DISABLE_USERMOD int permit = 0; /* 0 = opers(glob/locop) 1 = global oper */ #else int permit = 2; #endif int legalident = 1; /* is legal characters? */ if (!MyConnect(sptr)) goto permit_2; switch (permit) { case 0: if (!IsAnOper(sptr)) { sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]); return 0; } break; case 1: if (!IsOper(sptr)) { sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]); return 0; } break; case 2: if (MyConnect(sptr)) { sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]); return 0; } break; default: sendto_ops_butone(IsServer(cptr) ? cptr : NULL, sptr, ":%s WALLOPS :[SETIDENT] Somebody fixing this corrupted server? !(0|1) !!!", me.name); break; } permit_2: if (parc < 2) vident = NULL; else vident = parv[1]; /* bad bad bad boys .. ;p */ if (vident == NULL) { if (MyConnect(sptr)) { sendto_one(sptr, ":%s NOTICE %s :*** Syntax: /SetIdent <new ident>", me.name, parv[0]); } return 1; } if (strlen(parv[1]) < 1) { if (MyConnect(sptr)) sendto_one(sptr, ":%s NOTICE %s :*** /SetIdent Error: Atleast write SOMETHING that makes sense (':' string)", me.name, sptr->name); return 0; } /* too large huh? */ if (strlen(vident) > (USERLEN)) { /* ignore us as well if we're not a child of 3k */ if (MyConnect(sptr)) sendto_one(sptr, ":%s NOTICE %s :*** /SetIdent Error: Usernames are limited to %i characters.", me.name, sptr->name, USERLEN); return 0; } /* illegal?! */ for (s = vident; *s; s++) { if ((*s == '~') && (s == vident)) continue; if (!isallowed(*s)) { legalident = 0; break; } } if (legalident == 0) { sendto_one(sptr, ":%s NOTICE %s :*** /SetIdent Error: A username may contain a-z, A-Z, 0-9, '-', '~' & '.' - Please only use them", me.name, parv[0]); return 0; } { switch (UHOST_ALLOWED) { case UHALLOW_ALWAYS: break; case UHALLOW_NEVER: if (MyClient(sptr)) { sendto_one(sptr, ":%s NOTICE %s :*** /SetIdent is disabled", me.name, sptr->name); return 0; } break; case UHALLOW_NOCHANS: if (MyClient(sptr) && sptr->user->joined) { sendto_one(sptr, ":%s NOTICE %s :*** /SetIdent can not be used while you are on a channel", me.name, sptr->name); return 0; } break; case UHALLOW_REJOIN: rejoin_doquits(sptr); break; } /* get it in */ ircsnprintf(sptr->user->username, sizeof(sptr->user->username), "%s", vident); /* spread it out */ sendto_server(cptr, 0, 0, ":%s SETIDENT %s", sptr->name, parv[1]); if (UHOST_ALLOWED == UHALLOW_REJOIN) rejoin_dojoinandmode(sptr); } if (MyConnect(sptr)) { sendto_one(sptr, ":%s NOTICE %s :Your nick!user@host-mask is now (%s!%s@%s) - To disable ident set change it manually by /setident'ing again", me.name, parv[0], parv[0], sptr->user->username, GetHost(sptr)); } return 0; }