int cmd_nick(t_env *e, char **entry) { char *tmp; if (!entry[1]) { puts("Veuillez spécifier un pseudonyme (/nick [NICKNAME])"); return (EXIT_SUCCESS); } if (check_forbidden_char(entry[1]) == EXIT_FAILURE) { puts("Ce pseudonyme contient des caractères interdis"); puts("Veuillez en choisir un autre"); return (EXIT_FAILURE); } if (e->sfd == NOT_LOGGED) return (change_nick(e, entry, EXIT_SUCCESS)); if (!(tmp = malloc(sizeof(char) * strlen(entry[0]) + strlen(entry[1]) + 2))) return (EXIT_FAILURE); sprintf(tmp, "%s %s", entry[0], entry[1]); write(e->sfd, tmp, strlen(tmp) + 1); free(tmp); usleep(500000); if (e->state == 2) return (EXIT_SUCCESS); return (change_nick(e, entry, EXIT_SUCCESS)); }
/* ** m_svsguest() ** parv[0] = sender ** parv[1] = target nick ** parv[2] = guest prefix ** parv[3] = max guest number (9999) ** */ int m_svsguest(struct Client* cptr, struct Client* sptr, int parc, char* parv[]) { int randnum; int maxnum; int scount; /* search count */ char guestnick[NICKLEN]; struct Client* acptr; /* Check if received from services */ if(!IsServer(cptr) || !IsService(sptr)) { if (IsServer(cptr)) { ts_warn("Got SVSGUEST from non-service: %s", sptr->name); sendto_one(cptr, ":%s WALLOPS :ignoring SVSGUEST from non-service %s", me.name, sptr->name); } return 0; } if( parc < 4 ) /* Check for arguments count */ { ts_warn("Invalid SVSGUEST (%s) from %s", (parc==2 ) ? parv[1]: "-", parv[0]); return 0; } if ((acptr = find_person(parv[1], NULL)) && MyClient(acptr)) /* person found connected here */ { maxnum = atoi(parv[3]); randnum = 1+ (random() % (maxnum+1)); snprintf(guestnick, NICKLEN, "%s%d", parv[2], randnum); scount = 0; while((scount++<maxnum+1) && find_client(guestnick, (aClient *)NULL)) { randnum = 1+ (random() % (maxnum+1)); snprintf(guestnick, NICKLEN, "%s%d", parv[2], randnum); } if(scount<maxnum+1) /* check if we reached max guests count */ { change_nick(acptr, guestnick); } else exit_client(acptr, acptr, &me, "Maximum guests count reached!!!"); } else if (acptr) /* nick was found but is not our client */ { if ( (acptr->from != cptr)) /* this should never happen */ sendto_one(acptr, ":%s SVSGUEST %s %s %s", parv[0], parv[1], parv[2], parv[3]); } return 0; }
/* * me_forcenick * parv[1] = forcenick victim * parv[2] = new nickname */ static int me_forcenick(struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) { struct Client *target_p, *exist_p; const char *user; const char *newnick; user = parv[1]; /* We're supposed to drop servers over protocol violations, but shit happens... */ if(EmptyString(parv[2])) return 0; else { char *s; s = LOCAL_COPY(parv[2]); if(strlen(s) > (size_t) NICKLEN) s[NICKLEN] = '\0'; newnick = s; } if(!clean_nick(newnick)) return 0; if((target_p = find_person(user)) == NULL) return 0; if(IsServer(target_p) || IsMe(target_p)) return 0; if(!MyClient(target_p) && !IsOperGlobalForce(source_p)) return 0; if((exist_p = find_person(newnick)) != NULL) { /* Could just be a case shift */ if(irccmp(target_p->name, newnick)) return 0; /* If it's the same nick, f**k it */ else if(!strcmp(target_p->name, newnick)) return 0; } ilog(L_MAIN, "FORCENICK called for [%s] by %s!%s@%s", target_p->name, source_p->name, source_p->username, source_p->host); if(!MyClient(target_p)) { struct Client *cptr = target_p->servptr; sendto_one(cptr, ":%s ENCAP %s FORCENICK %s :%s", get_id(source_p, cptr), cptr->name, get_id(target_p, cptr), newnick); return 0; } change_nick(target_p, newnick); return 0; }
void inbound_newnick (server *serv, char *nick, char *newnick, int quiet) { int me = FALSE; session *sess; GSList *list = sess_list; if (!serv->p_cmp (nick, serv->nick)) { me = TRUE; safe_strcpy (serv->nick, newnick, NICKLEN); } while (list) { sess = list->data; if (sess->server == serv) { if (change_nick (sess, nick, newnick) || (me && sess->type == SESS_SERVER)) { if (!quiet) { if (me) EMIT_SIGNAL (XP_TE_UCHANGENICK, sess, nick, newnick, NULL, NULL, 0); else EMIT_SIGNAL (XP_TE_CHANGENICK, sess, nick, newnick, NULL, NULL, 0); } } if (sess->type == SESS_DIALOG && !serv->p_cmp (sess->channel, nick)) { safe_strcpy (sess->channel, newnick, CHANLEN); fe_set_channel (sess); } fe_set_title (sess); } list = list->next; } dcc_change_nick (serv, nick, newnick); if (me) fe_set_nick (serv, newnick); }
void change_channel(char *cmd, char *channel, char *nick) { char *tmp; char arg[10]; change_nick(strdup(cmd), nick); if (!memset(arg, 0, sizeof(arg)) || !(tmp = strtok(cmd, " ")) || tmp[0] != ':' || strcmp(&tmp[1], nick) || !(tmp = strtok(NULL, " ")) || (strcmp(tmp, "JOIN") && strcmp(tmp, "PART")) || !strncat(arg, tmp, 9) || !(tmp = strtok(NULL, " ")) || tmp[0] != ':' || !memset(channel, 0, 4097)) return ; if (!strcmp(arg, "JOIN")) strncat(channel, &tmp[1], 4096); else memset(channel, 0, 4097); }
void pl1_nick() { strcpy(pl_options[1].name,con->arg); change_nick(1); };
void pl0_nick() { strcpy(pl_options[0].name,con->arg); change_nick(0); };
/* ** mo_forcenick ** parv[1] = forcenick victim ** parv[2] = new nickname */ static int mo_forcenick(struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) { struct Client *target_p, *exist_p; const char *user; const char *newnick; user = parv[1]; /* You must be this tall to ride the ride */ if(!IsOperLocalForce(source_p)) { sendto_one(source_p, form_str(ERR_NOPRIVS), me.name, source_p->name, "local_force"); return 0; } /* Truncate it so clean_nick doesn't spaz out */ if(!EmptyString(parv[2])) { char *s; s = LOCAL_COPY(parv[2]); if(strlen(s) > (size_t) NICKLEN) s[NICKLEN] = '\0'; newnick = s; } else { sendto_one_numeric(source_p, ERR_NONICKNAMEGIVEN, form_str(ERR_NONICKNAMEGIVEN), me.name, source_p->name); return 0; } /* Nick has to be clean or we'll have a protocol violation... */ if(!clean_nick(newnick)) { sendto_one(source_p, form_str(ERR_ERRONEUSNICKNAME), me.name, user, newnick); return 0; } /* Find the target... */ if((target_p = find_named_person(user)) == NULL) { sendto_one(source_p, form_str(ERR_NEEDMOREPARAMS), me.name, source_p->name, "FORCENICK"); return 0; } /* If it's a server, sod it, changing its name is stupid... */ if(IsServer(target_p) || IsMe(target_p)) { sendto_one_numeric(source_p, ERR_NOSUCHNICK, form_str(ERR_NOSUCHNICK), user); return 0; } /* Do we have permission to send it globally? */ if(!MyClient(target_p) && (!IsOperGlobalForce(source_p))) { sendto_one_notice(source_p, ":Nick %s is not on your server and you do not have the global_force flag", target_p->name); return 0; } /* Check to see if the new nick exists */ if((exist_p = find_named_person(newnick)) != NULL) { /* Could just be a case shift */ if(irccmp(target_p->name, newnick)) { sendto_one(source_p, form_str(ERR_NICKNAMEINUSE), me.name, user, newnick); return 0; } /* If it's the same nick, f**k it */ else if(!strcmp(target_p->name, newnick)) return 0; } sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, "Received FORCENICK message for %s!%s@%s. From %s (Newnick: %s)", target_p->name, target_p->username, target_p->orighost, source_p->name, newnick); ilog(L_MAIN, "FORCENICK called for [%s] by %s!%s@%s", target_p->name, source_p->name, source_p->username, source_p->host); sendto_one_notice(target_p, ":You have been forcenicked from %s to %s by %s", target_p->name, newnick, source_p->name); if(!MyClient(target_p)) { struct Client *cptr = target_p->servptr; sendto_one(cptr, ":%s ENCAP %s FORCENICK %s :%s", get_id(source_p, cptr), cptr->name, get_id(target_p, cptr), newnick); return 0; } change_nick(target_p, newnick); return 0; }