static VALUE ServiceModule_service_name(VALUE self, VALUE name) { struct Service *ruby_service; struct Client *ruby_client; Check_Type(name, T_STRING); rb_iv_set(self, "@ServiceName", name); ruby_service = make_service(StringValueCStr(name)); set_service(self, ruby_service); if(ircncmp(ruby_service->name, StringValueCStr(name), NICKLEN) != 0) rb_iv_set(self, "@ServiceName", rb_str_new2(ruby_service->name)); clear_serv_tree_parse(&ruby_service->msg_tree); dlinkAdd(ruby_service, &ruby_service->node, &services_list); hash_add_service(ruby_service); ruby_client = introduce_client(ruby_service->name, ruby_service->name, TRUE); rb_iv_set(self, "@client", client_to_value(ruby_client)); rb_iv_set(self, "@langpath", rb_str_new2(LANGPATH)); return name; }
/* * ms_svshost - SVSHOST command handler * parv[0] = sender prefix * parv[1] = remote server * parv[2] = client nick * parv[3] = vhost to spoof */ static void ms_svshost(struct Client* client_p, struct Client* source_p, int parc, char* parv[]) { char *flag; struct Client *victim; struct Channel *chptr, *top_chptr, *banchans[100]; static char comment[] = "Spoofing with vhost..."; static char urbanned[] = "You are banned"; char modebuf[MODEBUFLEN], parabuf[MODEBUFLEN]; int hide_or_not; dlink_node *ptr; int i, num = 0; if (ServerInfo.gateway && get_bridge_token(client_p)) return; if (hunt_server(client_p, source_p, ":%s SVSHOST %s %s :%s", 1, parc, parv) != HUNTED_ISME) return; if (!find_z_conf(parv[0])) return; victim = find_client(parv[2]); if (victim && !IsServer(victim) && MyConnect(victim)) { extern int introduce_client(struct Client *, struct Client *, struct User *, char *); sendto_server(NULL, victim, NULL, NOCAPS, NOCAPS, NOFLAGS, ":%s QUIT :%s", victim->name, comment); /* sendto_common_channels_local(victim, ":%s!%s@%s QUIT :%s", victim->name, victim->username, victim->host, comment);*/ /* ++current_serial; not needed i suppose */ if (victim->user->channel.head) for (ptr = victim->user->channel.head; ptr; ptr = ptr->next) { chptr = (struct Channel *)ptr->data; sendto_channel_local_butone(victim, ALL_MEMBERS, chptr, ":%s!%s@%s QUIT :%s", victim->name, victim->username, victim->host, comment); } strncpy(victim->host, parv[3], HOSTLEN)[HOSTLEN] = 0; sendto_one(victim, ":%s NOTICE %s :*** Notice -- Spoofing your host as %s", me.name, victim->name, victim->host); if (victim->user->channel.head) for (ptr = victim->user->channel.head; ptr; ptr = ptr->next) { chptr = (struct Channel *)ptr->data; #ifdef VCHANS top_chptr = RootChan(chptr); #else top_chptr = chptr; #endif if (is_banned(chptr, victim) & (CHFL_BAN|CHFL_DENY)) { sendto_one(victim, ":%s KICK %s %s :%s", me.name, top_chptr->chname, victim->name, urbanned); /*remove_user_from_channel(chptr, victim);*/ banchans[num++] = chptr; continue; } if (is_chan_op(chptr, victim)) flag = "+o"; #ifdef HALFOPS else if (is_half_op(chptr, victim)) flag = "+h"; #endif else if (is_voiced(chptr, victim)) flag = "+v"; else flag = ""; #ifdef REQUIRE_OANDV if (find_user_link(&chptr->chanops_voiced, victim)) flag = "+ov"; #endif sendto_channel_local_butone(victim, ALL_MEMBERS, chptr, ":%s!%s@%s JOIN :%s", victim->name, victim->username, victim->host, top_chptr->chname); #ifdef ANONOPS if (chptr->mode.mode & MODE_HIDEOPS) hide_or_not = ONLY_CHANOPS_HALFOPS; else #endif hide_or_not = ALL_MEMBERS; if (flag[0]) sendto_channel_local_butone(victim, hide_or_not, chptr, ":%s MODE %s %s %s %s", me.name, top_chptr->chname, flag, victim->name, flag[2]? victim->name : ""); } for (i=0; i < num; i++) remove_user_from_channel(banchans[i], victim); introduce_client(NULL, victim, victim->user, victim->name); victim->lazyLinkClientExists = 0; /* force introducing to LL servers below... */ if (victim->user->channel.head) for (ptr = victim->user->channel.head; ptr; ptr = ptr->next) { chptr = (struct Channel *)ptr->data; if (is_chan_op(chptr, victim)) flag = "@"; #ifdef HALFOPS else if (is_half_op(chptr, victim)) flag = "%"; #endif else if (is_voiced(chptr, victim)) flag = "+"; else flag = ""; #ifdef REQUIRE_OANDV if (find_user_link(&chptr->chanops_voiced, victim)) flag = "@+"; #endif channel_modes(chptr, victim, modebuf, parabuf); sendto_server(NULL, victim, chptr, NOCAPS, NOCAPS, LL_ICLIENT|LL_ICHAN, ":%s SJOIN %lu %s %s %s :%s%s", me.name, (unsigned long)chptr->channelts, chptr->chname, modebuf, parabuf, flag, victim->name); } } }