/* * SVSLOGIN message * * parv[0]: source * parv[1]: propagation mask * parv[2]: target PUID * parv[3]: ESVID */ static int m_svslogin(aClient *cptr, aClient *sptr, int parc, char *parv[]) { if (!SASL_SERVER || MyClient(sptr) || (parc < 3) || !parv[3]) return 0; if (!stricmp(parv[1], me.name)) { aClient *target_p; /* is the PUID valid? */ if ((target_p = decode_puid(parv[2])) == NULL) return 0; if (target_p->user == NULL) make_user(target_p); strlcpy(target_p->user->svid, parv[3], sizeof(target_p->user->svid)); sendto_one(target_p, err_str(RPL_LOGGEDIN), me.name, BadPtr(target_p->name) ? "*" : target_p->name, BadPtr(target_p->name) ? "*" : target_p->name, BadPtr(target_p->user->username) ? "*" : target_p->user->username, BadPtr(target_p->user->realhost) ? "*" : target_p->user->realhost, target_p->user->svid, target_p->user->svid); return 0; } /* not for us; propagate. */ sendto_serv_butone_token(cptr, parv[0], MSG_SVSLOGIN, TOK_SVSLOGIN, "%s %s %s", parv[1], parv[2], parv[3]); return 0; }
static int do_local_user(struct Client *client_p, struct Client *source_p, const char *username, const char *realname) { s_assert(NULL != source_p); s_assert(source_p->username != username); make_user(source_p); lookup_blacklists(source_p); source_p->flags |= FLAGS_SENTUSER; rb_strlcpy(source_p->info, realname, sizeof(source_p->info)); if(!IsGotId(source_p)) rb_strlcpy(source_p->username, username, sizeof(source_p->username)); if(source_p->name[0]) { /* NICK already received, now I have USER... */ return register_local_user(client_p, source_p); } return 0; }
static int do_local_user(struct Client *client_p, struct Client *source_p, const char *username, const char *realname) { s_assert(NULL != source_p); s_assert(source_p->username != username); make_user(source_p); if (!(source_p->flags & FLAGS_SENTUSER)) { lookup_blacklists(source_p); source_p->flags |= FLAGS_SENTUSER; } rb_strlcpy(source_p->info, realname, sizeof(source_p->info)); if(!IsGotId(source_p)) { /* This is in this location for a reason..If there is no identd * and ping cookies are enabled..we need to have a copy of this */ rb_strlcpy(source_p->username, username, sizeof(source_p->username)); } if(source_p->name[0]) { /* NICK already received, now I have USER... */ return register_local_user(client_p, source_p, username); } return 0; }
u_entity *u_entity_from_id(u_entity *e, char *s) { if (!s) return NULL; if (s[3]) { if (!(e->v.u = u_user_by_uid(s))) return NULL; make_user(e); } else { if (!(e->v.sv = u_server_by_sid(s))) return NULL; make_server(e); } return e; }
u_entity *u_entity_from_name(u_entity *e, char *s) { if (!s) return NULL; if (strchr(s, '.')) { if (!(e->v.sv = u_server_by_name(s))) return NULL; make_server(e); } else { if (!(e->v.u = u_user_by_nick(s))) return NULL; make_user(e); } return e; }
/* * SASL message * * parv[0]: prefix * parv[1]: distribution mask * parv[2]: target PUID * parv[3]: mode/state * parv[4]: data * parv[5]: out-of-bound data */ static int m_sasl(aClient *cptr, aClient *sptr, int parc, char *parv[]) { if (!SASL_SERVER || MyClient(sptr) || (parc < 4) || !parv[4]) return 0; if (!stricmp(parv[1], me.name)) { aClient *target_p; /* is the PUID valid? */ if ((target_p = decode_puid(parv[2])) == NULL) return 0; if (target_p->user == NULL) make_user(target_p); /* reject if another SASL agent is answering */ if (*target_p->sasl_agent && stricmp(parv[0], target_p->sasl_agent)) return 0; else strlcpy(target_p->sasl_agent, parv[0], sizeof(target_p->sasl_agent)); if (*parv[3] == 'C') sendto_one(target_p, "AUTHENTICATE %s", parv[4]); else if (*parv[3] == 'D') { if (*parv[4] == 'F') sendto_one(target_p, err_str(ERR_SASLFAIL), me.name, BadPtr(target_p->name) ? "*" : target_p->name); else if (*parv[4] == 'S') { target_p->sasl_complete++; sendto_one(target_p, err_str(RPL_SASLSUCCESS), me.name, BadPtr(target_p->name) ? "*" : target_p->name); } *target_p->sasl_agent = '\0'; } return 0; } /* not for us; propagate. */ sendto_serv_butone_token(cptr, parv[0], MSG_SASL, TOK_SASL, "%s %s %c %s %s", parv[1], parv[2], *parv[3], parv[4], parc > 5 ? parv[5] : ""); return 0; }
static void setup_me(aClient *mp) { struct passwd *p; p = getpwuid(getuid()); strncpyzt(mp->username, (p) ? p->pw_name : "unknown", sizeof(mp->username)); (void)get_my_name(mp, mp->sockhost, sizeof(mp->sockhost)-1); /* I think we need no hostp, especially fake one --B. */ mp->hostp = NULL; if (mp->serv->namebuf[0] == '\0') strncpyzt(mp->serv->namebuf, mp->sockhost, sizeof(mp->serv->namebuf)); if (me.info == DefInfo) me.info = mystrdup("IRCers United"); mp->lasttime = mp->since = mp->firsttime = time(NULL); mp->hopcount = 0; mp->authfd = -1; mp->auth = mp->username; mp->confs = NULL; mp->flags = 0; mp->acpt = mp->from = mp; mp->next = NULL; mp->user = NULL; mp->fd = -1; SetMe(mp); mp->serv->snum = find_server_num (ME); /* we don't fill our own IP -> 0 as ip lenght */ (void) make_user(mp,0); istat.is_users++; /* here, cptr->next is NULL, see make_user() */ mp->user->flags |= FLAGS_OPER; mp->serv->up = mp; mp->serv->maskedby = mp; mp->serv->version |= SV_UID; mp->user->server = find_server_string(mp->serv->snum); strncpyzt(mp->user->username, (p) ? p->pw_name : "unknown", sizeof(mp->user->username)); (void) strcpy(mp->user->host, mp->name); SetEOB(mp); istat.is_eobservers = 1; (void)add_to_client_hash_table(mp->name, mp); (void)add_to_sid_hash_table(mp->serv->sid, mp); strncpyzt(mp->serv->verstr, PATCHLEVEL, sizeof(mp->serv->verstr)); setup_server_channels(mp); }
struct Client *make_local_person_full(const char *nick, const char *username, const char *hostname, const char *ip, const char *realname) { struct Client *client; client = make_client(NULL); rb_dlinkMoveNode(&client->localClient->tnode, &unknown_list, &lclient_list); client->servptr = &me; rb_dlinkAdd(client, &client->lnode, &client->servptr->serv->users); make_user(client); SetClient(client); rb_inet_pton_sock(ip, (struct sockaddr *)&client->localClient->ip); rb_strlcpy(client->name, nick, sizeof(client->name)); rb_strlcpy(client->username, username, sizeof(client->username)); rb_strlcpy(client->host, hostname, sizeof(client->host)); rb_inet_ntop_sock((struct sockaddr *)&client->localClient->ip, client->sockhost, sizeof(client->sockhost)); rb_strlcpy(client->info, realname, sizeof(client->info)); add_to_client_hash(client->name, client); return client; }
struct Client *make_remote_person_full(struct Client *server, const char *nick, const char *username, const char *hostname, const char *ip, const char *realname) { struct Client *client; struct sockaddr addr; client = make_client(server); make_user(client); SetRemoteClient(client); client->servptr = server; rb_dlinkAdd(server, &server->lnode, &server->servptr->serv->users); rb_inet_pton_sock(ip, &addr); rb_strlcpy(client->name, nick, sizeof(client->name)); rb_strlcpy(client->username, username, sizeof(client->username)); rb_strlcpy(client->host, hostname, sizeof(client->host)); rb_inet_ntop_sock(&addr, client->sockhost, sizeof(client->sockhost)); rb_strlcpy(client->info, realname, sizeof(client->info)); add_to_client_hash(nick, client); add_to_hostname_hash(client->host, client); return client; }
static int me_svslogin(struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) { struct Client *target_p, *exist_p; char nick[NICKLEN+1], login[NICKLEN+1]; char user[USERLEN+1], host[HOSTLEN+1]; int valid = 0; if(!(source_p->flags & FLAGS_SERVICE)) return 0; if((target_p = find_client(parv[1])) == NULL) return 0; if(!MyClient(target_p) && !IsUnknown(target_p)) return 0; if(clean_nick(parv[2])) { rb_strlcpy(nick, parv[2], NICKLEN + 1); valid |= NICK_VALID; } else if(*target_p->name) rb_strlcpy(nick, target_p->name, NICKLEN + 1); else strcpy(nick, "*"); if(clean_username(parv[3])) { rb_strlcpy(user, parv[3], USERLEN + 1); valid |= USER_VALID; } else rb_strlcpy(user, target_p->username, USERLEN + 1); if(clean_host(parv[4])) { rb_strlcpy(host, parv[4], HOSTLEN + 1); valid |= HOST_VALID; } else rb_strlcpy(host, target_p->host, HOSTLEN + 1); if(*parv[5] == '*') { if(target_p->user) rb_strlcpy(login, target_p->user->suser, NICKLEN + 1); else login[0] = '\0'; } else if(!strcmp(parv[5], "0")) login[0] = '\0'; else rb_strlcpy(login, parv[5], NICKLEN + 1); /* Login (mostly) follows nick rules. */ if(*login && !clean_nick(login)) return 0; if((exist_p = find_person(nick)) && target_p != exist_p) { char buf[BUFSIZE]; if(MyClient(exist_p)) sendto_one(exist_p, ":%s KILL %s :(Nickname regained by services)", me.name, exist_p->name); exist_p->flags |= FLAGS_KILLED; kill_client_serv_butone(NULL, exist_p, "%s (Nickname regained by services)", me.name); rb_snprintf(buf, sizeof(buf), "Killed (%s (Nickname regained by services))", me.name); exit_client(NULL, exist_p, &me, buf); } else if((exist_p = find_client(nick)) && IsUnknown(exist_p) && exist_p != target_p) { exit_client(NULL, exist_p, &me, "Overridden"); } if(*login) { /* Strip leading digits, unless it's purely numeric. */ const char *p = login; while(IsDigit(*p)) p++; if(!*p) p = login; sendto_one(target_p, form_str(RPL_LOGGEDIN), me.name, EmptyString(target_p->name) ? "*" : target_p->name, nick, user, host, p, p); } else sendto_one(target_p, form_str(RPL_LOGGEDOUT), me.name, EmptyString(target_p->name) ? "*" : target_p->name, nick, user, host); if(IsUnknown(target_p)) { struct User *user_p = make_user(target_p); if(valid & NICK_VALID) strcpy(target_p->preClient->spoofnick, nick); if(valid & USER_VALID) strcpy(target_p->preClient->spoofuser, user); if(valid & HOST_VALID) strcpy(target_p->preClient->spoofhost, host); rb_strlcpy(user_p->suser, login, NICKLEN + 1); } else { char note[NICKLEN + 10]; send_signon(NULL, target_p, nick, user, host, rb_current_time(), login); rb_snprintf(note, NICKLEN + 10, "Nick: %s", target_p->name); rb_note(target_p->localClient->F, note); } return 0; }
/* ** m_user ** parv[0] = sender prefix ** parv[1] = username (login name, account) ** parv[2] = client host name (used only from other servers) ** parv[3] = server host name (used only from other servers) ** parv[4] = users real name info ** ** NOTE: Be advised that multiple USER messages are possible, ** hence, always check if a certain struct is already allocated... -- Syzop */ DLLFUNC CMD_FUNC(m_user) { #define UFLAGS (UMODE_INVISIBLE|UMODE_WALLOP|UMODE_SERVNOTICE) char *username, *host, *server, *realname, *umodex = NULL, *virthost = NULL, *ip = NULL; u_int32_t sstamp = 0; anUser *user; aClient *acptr; if (IsServer(cptr) && !IsUnknown(sptr)) return 0; if (MyConnect(sptr) && (sptr->listener->umodes & LISTENER_SERVERSONLY)) { return exit_client(cptr, sptr, sptr, "This port is for servers only"); } if (parc > 2 && (username = (char *)index(parv[1], '@'))) *username = '******'; if (parc < 5 || *parv[1] == '\0' || *parv[2] == '\0' || *parv[3] == '\0' || *parv[4] == '\0') { sendto_one(sptr, err_str(ERR_NEEDMOREPARAMS), me.name, parv[0], "USER"); if (IsServer(cptr)) sendto_ops("bad USER param count for %s from %s", parv[0], get_client_name(cptr, FALSE)); else return 0; } /* Copy parameters into better documenting variables */ username = (parc < 2 || BadPtr(parv[1])) ? "<bad-boy>" : parv[1]; host = (parc < 3 || BadPtr(parv[2])) ? "<nohost>" : parv[2]; server = (parc < 4 || BadPtr(parv[3])) ? "<noserver>" : parv[3]; /* This we can remove as soon as all servers have upgraded. */ if (parc == 6 && IsServer(cptr)) { if (isdigit(*parv[4])) sstamp = strtoul(parv[4], NULL, 10); realname = (BadPtr(parv[5])) ? "<bad-realname>" : parv[5]; umodex = NULL; } else if (parc == 8 && IsServer(cptr)) { if (isdigit(*parv[4])) sstamp = strtoul(parv[4], NULL, 10); realname = (BadPtr(parv[7])) ? "<bad-realname>" : parv[7]; umodex = parv[5]; virthost = parv[6]; } else if (parc == 9 && IsServer(cptr)) { if (isdigit(*parv[4])) sstamp = strtoul(parv[4], NULL, 10); realname = (BadPtr(parv[8])) ? "<bad-realname>" : parv[8]; umodex = parv[5]; virthost = parv[6]; ip = parv[7]; } else { realname = (BadPtr(parv[4])) ? "<bad-realname>" : parv[4]; } user = make_user(sptr); if (!MyConnect(sptr)) { if (sptr->srvptr == NULL) sendto_ops("WARNING, User %s introduced as being " "on non-existant server %s.", sptr->name, server); if (SupportNS(cptr)) { acptr = (aClient *)find_server_b64_or_real(server); if (acptr) user->server = find_or_add(acptr->name); else user->server = find_or_add(server); } else user->server = find_or_add(server); strlcpy(user->realhost, host, sizeof(user->realhost)); goto user_finish; } if (!IsUnknown(sptr)) { sendto_one(sptr, err_str(ERR_ALREADYREGISTRED), me.name, parv[0]); return 0; } if (!IsServer(cptr)) { sptr->umodes |= CONN_MODES; if (CONNECT_SNOMASK) { sptr->umodes |= UMODE_SERVNOTICE; create_snomask(sptr, user, CONNECT_SNOMASK); } } /* Set it temporarely to at least something trusted, * this was copying user supplied data directly into user->realhost * which seemed bad. Not to say this is much better ;p. -- Syzop */ strncpyzt(user->realhost, Inet_ia2p(&sptr->ip), sizeof(user->realhost)); if (!user->ip_str) user->ip_str = strdup(Inet_ia2p(&sptr->ip)); user->server = me_hash; user_finish: user->servicestamp = sstamp; strlcpy(sptr->info, realname, sizeof(sptr->info)); if (sptr->name[0] && (IsServer(cptr) ? 1 : IsNotSpoof(sptr))) /* NICK and no-spoof already received, now we have USER... */ { if (USE_BAN_VERSION && MyConnect(sptr)) sendto_one(sptr, ":IRC!IRC@%s PRIVMSG %s :\1VERSION\1", me.name, sptr->name); if (strlen(username) > USERLEN) username[USERLEN] = '\0'; /* cut-off */ return( register_user(cptr, sptr, sptr->name, username, umodex, virthost,ip)); } else strncpyzt(sptr->user->username, username, USERLEN + 1); return 0; }
u_entity *u_entity_from_user(u_entity *e, u_user *u) { e->v.u = u; make_user(e); return e; }
/* * m_webirc * parv[0] = sender prefix * parv[1] = password that authenticates the WEBIRC command from this client * parv[2] = username or client requesting spoof (cgiirc defaults to cgiirc) * parv[3] = hostname of user * parv[4] = IP address of user */ int m_webirc(aClient *cptr, aClient *sptr, int parc, char *parv[]) { char oldusername[USERLEN + 1]; struct userBan *ban; int i; if (parc < 5 || *parv[1] == '\0' || *parv[2] == '\0' || *parv[3] == '\0' || *parv[4] == '\0') { sendto_one(sptr, err_str(ERR_NEEDMOREPARAMS), me.name, parv[0], "WEBIRC"); return 0; } if (!MyConnect(sptr) || !IsUnknown(cptr) || cptr->receiveM != 1) { sendto_one(sptr, err_str(ERR_ALREADYREGISTRED), me.name, parv[0]); return 0; } strncpyzt(oldusername, cptr->username, USERLEN + 1); make_user(cptr); if (!(cptr->flags & FLAGS_GOTID)) strcpy(cptr->username, "webirc"); i = attach_Iline(cptr, cptr->hostp, cptr->sockhost); if (i == 0) { aAllow *pwaconf = sptr->user->allow; if (BadPtr(pwaconf->passwd) || strncmp(pwaconf->passwd, "webirc.", strlen("webirc.")) != 0) { sendto_one(sptr, "NOTICE * :Not a CGI:IRC auth block"); i = -1; } else if (!StrEq(parv[1], pwaconf->passwd + strlen("webirc."))) { sendto_one(sptr, "NOTICE * :CGI:IRC password incorrect"); i = -1; } else if (pwaconf->flags & CONF_FLAGS_NOTHROTTLE) throttle_remove(cptr->sockhost); } clear_conflinks(cptr); free_user(cptr->user, cptr); cptr->user = NULL; cptr->flags &= ~FLAGS_DOID; strncpyzt(cptr->username, oldusername, USERLEN + 1); if (i != 0) return 0; if (inet_pton(AF_INET, parv[4], &cptr->ip.ip4)) cptr->ip_family = AF_INET; else if (inet_pton(AF_INET6, parv[4], &cptr->ip.ip6)) cptr->ip_family = AF_INET6; else { sendto_one(sptr, "NOTICE * :Invalid IP"); return 0; } if (cptr->flags & FLAGS_GOTID) { cptr->webirc_username = MyMalloc(strlen(cptr->username) + 1); strcpy(cptr->webirc_username, cptr->username); } else { cptr->webirc_username = MyMalloc(strlen(parv[2]) + 1); strcpy(cptr->webirc_username, parv[2]); } cptr->webirc_ip = MyMalloc(strlen(cptr->sockhost) + 1); strcpy(cptr->webirc_ip, cptr->sockhost); get_sockhost(cptr, parv[3]); cptr->hostp = NULL; /* * Acknowledge that WEBIRC was accepted, and flush the client's send queue * to make debugging easier. */ sendto_one(sptr, ":%s NOTICE AUTH :*** CGI:IRC host/IP set to %s %s", me.name, cptr->sockhost, parv[4]); dump_connections(cptr->fd); /* if they are throttled, drop them silently. */ if (throttle_check(parv[4], cptr->fd, NOW) == 0) { cptr->flags |= FLAGS_DEADSOCKET; ircstp->is_ref++; ircstp->is_throt++; return exit_client(cptr, sptr, &me, "Client throttled"); } ban = check_userbanned(cptr, UBAN_IP|UBAN_CIDR4|UBAN_WILDUSER, 0); if(ban) { int loc = (ban->flags & UBAN_LOCAL) ? 1 : 0; ircstp->is_ref++; ircstp->is_ref_2++; return exit_banned_client(cptr, loc, loc ? 'K' : 'A', ban->reason, 0); } return 0; }
void main(){ ul *list = (ul *) malloc (sizeof(ul)); make_user_list(list); printf("\n\n"); printf("------------------------Seja bem-vindo---------------------------------- \n\n\n"); int run = 1; int op; char name[50] ; char name1[50] ; user *u = NULL; while (run == 1){ printf("Escolha sua opção: \n"); printf("1 - Cadastrar novo usuário.\n"); printf("2 - Remover um contato.\n"); printf("3 - Criar amizade.\n"); printf("4 - Desfazer amizade.\n"); printf("5 - Imprimir dados de um usuário.\n"); printf("6 - Imprimir dados de todos os usuários.\n"); printf("7 - Sair.\n\n"); printf("Opção: "); scanf ("%d", &op); switch (op){ case 1: printf("\n\n"); u = make_user(); add_user(list,u); free(u); u = NULL; break; case 2: printf("Informe o nome do usuário que quer remover: "); scanf("%s",&name); remove_user(list, name); break; case 3: printf("Informe o nome de uma das pessoas: "); scanf("%s",&name); printf("Informe o nome de uma outra pessoa: "); scanf("%s",&name1); add_contact(list, name, name1); break; case 4: printf("Informe o nome de uma das pessoas: "); scanf("%s",&name); printf("Informe o nome de uma outra pessoa: "); scanf("%s",&name1); remove_contact(list, name, name1); break; case 5: printf("Informe o nome do usuário que quer imprimir os dados: "); scanf("%s",&name); print_info(list, name); break; case 6: print_list_user(list); case 7: run = 2; printf("\n\n\n"); printf("Até logo.\n"); // exit(0); break; } } exit(0); }