static void m_uid(sourceinfo_t *si, int parc, char *parv[]) { server_t *s; user_t *u; /* got the right number of args for an introduction? */ if (parc == 11) { s = si->s; slog(LG_DEBUG, "m_uid(): new user on `%s': %s", s->name, parv[0]); u = user_add(parv[0], parv[4], parv[5], parv[9], parv[6], parv[7], parv[10], s, atoi(parv[2])); if (u == NULL) return; user_mode(u, parv[3]); /* If server is not yet EOB we will do this later. * This avoids useless "please identify" -- jilles */ if (s->flags & SF_EOB) handle_nickchange(user_find(parv[0])); } else { int i; slog(LG_DEBUG, "m_uid(): got UID with wrong number of params"); for (i = 0; i < parc; i++) slog(LG_DEBUG, "m_uid(): parv[%d] = %s", i, parv[i]); } }
// {{{ odcgi_add_user() /// Wrapper function for user_add int odcgi_add_user (char *http_newuser, char *http_newpass1, char *http_newpass2) { if (strlen (http_newuser) > 0) { if (strlen (http_newpass1) < 6) { odcgi_msg_error (ODCGI_ERROR__USER_MGMT, "Password too short"); return -1; } if (strcmp (http_newpass1, http_newpass2) != 0) { odcgi_msg_error (ODCGI_ERROR__USER_MGMT, "Incorrect password"); return -1; } user_t user; user_add (&user, http_newuser, http_newpass1); if (user_has_error (&user)) { odcgi_msg_error (ODCGI_ERROR__USER_MGMT, user_get_error (&user)); return -1; } logevent ("notice", "User [%s] added", http_newuser); } return 0; }
void pars_imhere(void) { if (strncmp(config->nick, packet, NICK_MAXLEN)) return; strncpy(status->nick, pars_word(), NICK_MAXLEN); pars_word(); status->mode = pars_number(); status->active = pars_number(); user_add(); }
static void m_euid(sourceinfo_t *si, int parc, char *parv[]) { server_t *s; user_t *u; /* got the right number of args for an introduction? */ if (parc >= 11) { s = si->s; slog(LG_DEBUG, "m_euid(): new user on `%s': %s", s->name, parv[0]); u = user_add(parv[0], /* nick */ parv[4], /* user */ *parv[8] != '*' ? parv[8] : parv[5], /* hostname */ parv[5], /* hostname (visible) */ parv[6], /* ip */ parv[7], /* uid */ parv[parc - 1], /* gecos */ s, /* object parent (server) */ atoi(parv[2])); /* hopcount */ if (u == NULL) return; user_mode(u, parv[3]); if (*parv[9] != '*') { handle_burstlogin(u, parv[9], 0); /* If an account is given in burst, then either they logged in with sasl, * or they logged in before a split and are now returning. Either way we need * to check for identified-to-nick status and update the ircd state accordingly. * For sasl they should be marked identified, and when returning from a split * their nick may have been ungrouped, they may have changed nicks, or their account * may have been dropped. */ if (authservice_loaded) sts(":%s ENCAP * IDENTIFIED %s %s %s", ME, CLIENT_NAME(u), u->nick, should_reg_umode(u) ? "" : "OFF"); } /* server_eob() cannot know if a user was introduced * with NICK/UID or EUID and handle_nickchange() must * be called exactly once for each new user -- jilles */ if (s->flags & SF_EOB) handle_nickchange(u); } else { int i; slog(LG_DEBUG, "m_euid(): got EUID with wrong number of params"); for (i = 0; i < parc; i++) slog(LG_DEBUG, "m_euid(): parv[%d] = %s", i, parv[i]); } }
int main(){ blog_t * newBlog = blog_new(0, 1); user_t * newUser = blog_userLogin(newBlog, 200, 0); user_add(newUser, "Fedia", "UK", 18, 1/*, int id*/); user_print(newUser); printf("-------------------------------------------------\n"); blog_delete(newBlog); return 0; }
SP_LIBEXPORT(sp_error) sp_session_login (sp_session *session, const char *username, const char *password) { strncpy(session->username, username, sizeof(session->username) - 1); session->username[sizeof(session->username) - 1] = 0; strncpy(session->password, password, sizeof(session->password) - 1); session->password[sizeof(session->password) - 1] = 0; session->user = user_add(session, username); user_add_ref(session->user); DSFYDEBUG("Posting REQ_TYPE_LOGIN\n"); request_post(session, REQ_TYPE_LOGIN, NULL); return SP_ERROR_OK; }
SHELL void sign_up() { clrvar(user.mptr); clrvar(user.var); user.number=user.member+1; ult(user.number)->mpost =0; ult(user.number)->post =0; ult(user.number)->mlogin=0; ult(user.number)->login =0; setvar("mpost","0",user.var); setvar("post","0",user.var); setvar("mlogin","0",user.var); setvar("login","0",user.var); for(;;) { setvar("pass","",user.var); msgout(IC_act "今からサインアップを行います。"); user_chk(1); user_rep(user.member+1); user_disp(); msgout(IC_act "以上でよろしいでしょうか?"); if (ynq()) break; msgout(IC_act "中止しますか?"); if (ynq()) { user_guest(""); return; } } user_add(); user_write(); sys_log("| User登録"); where_seta(); }
/** * 数据的添加 */ int insert_data() { int flag = 1; char name[21], password[33], *pwdhash, *salt, ip[16], *datetime; int rid; while (flag == 1) { getchar(); printf("name:"); scanf("%s", name); printf("password:"******"%s", password); printf("ip:"); scanf("%s", ip); salt = RTS_rand(); pwdhash = RTS_hash(password, salt); datetime = RTS_current_datetime(); rid = user_add(name, pwdhash, salt, ip, datetime, 0); free(salt); salt = NULL; free(pwdhash); pwdhash = NULL; free(datetime); datetime = NULL; if (rid == 0) { printf("have\n"); } else if (rid > 0) { printf("ok-%d\n", rid); } else { printf("error\n"); } printf("Do you want to do insert continue ?[0 ~ 1]:"); scanf("%d", &flag); } return 0; }
void* server_conn(void* t_data) { int connfd = ((thread_t*)t_data)->fd; char* salt = ((thread_t*)t_data)->salt; char* ip = ((thread_t*)t_data)->ip; uint16_t port = ((thread_t*)t_data)->port; user_t *u; fd_set input; char buffer[100]; int pos = 0, auth = 0; free(t_data); snprintf(buffer, sizeof(buffer), "%s\n", salt); send(connfd, buffer, strlen(buffer), MSG_NOSIGNAL); if(recv(connfd, buffer, 41, MSG_NOSIGNAL) == 41) { buffer[40] = 0; auth = auth_hash(salt, server.password, buffer); } free(salt); if(!auth && !server.guest) { snprintf(buffer, sizeof(buffer), "a0\n"); send(connfd, buffer, strlen(buffer), MSG_NOSIGNAL); #ifdef __WIN32__ Sleep(2000); #endif socket_close(connfd); free(ip); return NULL; } if(!auth && server.guest) { snprintf(buffer, sizeof(buffer), "a1\n"); send(connfd, buffer, strlen(buffer), MSG_NOSIGNAL); } #ifdef __WIN32__ unsigned long on = 1; if (ioctlsocket(connfd, FIONBIO, &on) != NO_ERROR) { server_log(LOG_ERR, "server_conn: ioctlsocket"); free(ip); exit(EXIT_FAILURE); } #else fcntl(connfd, F_SETFL, O_NONBLOCK); #endif server_log(LOG_INFO, "user connected: %s:%u%s", ip, port, (auth ? "" : " (guest)")); if(server.online_auth) { snprintf(buffer, sizeof(buffer), "M%d\nY%d\nT%d\nD%d\nA%d\nF%d\nZ%d\nG%02d\nV%d\nQ%d\nC%d\nI%d,%d\n", server.mode, server.volume, server.freq, server.deemphasis, server.agc, server.filter, server.ant, server.gain, server.daa, server.squelch, server.rotator, server.sampling, server.detector); send(connfd, buffer, strlen(buffer), MSG_NOSIGNAL); } u = user_add(&server, connfd, auth); snprintf(buffer, sizeof(buffer), "o%d,%d\n", server.online_auth, server.online - server.online_auth); msg_send(buffer, strlen(buffer)); FD_ZERO(&input); FD_SET(u->fd, &input); while(select(u->fd+1, &input, NULL, NULL, NULL) > 0) { if(recv(u->fd, &buffer[pos], 1, MSG_NOSIGNAL) <= 0) break; /* If this command is too long to * fit into a buffer, clip it */ if(buffer[pos] != '\n') { if(pos != sizeof(buffer)-1) pos++; continue; } if(buffer[0] == XDR_P_SHUTDOWN) break; if(u->auth) serial_write(buffer, pos+1); pos = 0; } user_remove(&server, u); server_log(LOG_INFO, "user disconnected: %s:%u", ip, port); free(ip); if(server.online) { snprintf(buffer, sizeof(buffer), "o%d,%d\n", server.online_auth, server.online - server.online_auth); msg_send(buffer, strlen(buffer)); } if(!server.online_auth && server.poweroff) { if(server.online) { /* tell unauthenticated users that XDR has been powered off */ sprintf(buffer, "X\n"); msg_send(buffer, strlen(buffer)); } server_log(LOG_INFO, "tuner shutdown"); tuner_reset(); } return NULL; }
static void m_nick(sourceinfo_t *si, int parc, char *parv[]) { user_t *u; char ipstring[HOSTIPLEN]; char *p; /* got the right number of args for an introduction? */ if (parc >= 8) { /* -> AB N jilles 1 1137687480 jilles jaguar.test +oiwgrx jilles B]AAAB ABAAE :Jilles Tjoelker */ /* -> AB N test4 1 1137690148 jilles jaguar.test +iw B]AAAB ABAAG :Jilles Tjoelker */ slog(LG_DEBUG, "m_nick(): new user on `%s': %s", si->s->name, parv[0]); decode_p10_ip(parv[parc - 3], ipstring); u = user_add(parv[0], parv[3], parv[4], NULL, ipstring, parv[parc - 2], parv[parc - 1], si->s, atoi(parv[2])); if (u == NULL) return; if (parv[5][0] == '+') { user_mode(u, parv[5]); if (strchr(parv[5], 'r')) { p = strchr(parv[6], ':'); if (p != NULL) *p++ = '\0'; handle_burstlogin(u, parv[6], p ? atol(p) : 0); /* killed to force logout? */ if (user_find(parv[parc - 2]) == NULL) return; } if (strchr(parv[5], 'x')) { u->flags |= UF_HIDEHOSTREQ; /* this must be after setting the account name */ check_hidehost(u); } } handle_nickchange(u); } /* if it's only 2 then it's a nickname change */ else if (parc == 2) { if (!si->su) { slog(LG_DEBUG, "m_nick(): server trying to change nick: %s", si->s != NULL ? si->s->name : "<none>"); return; } slog(LG_DEBUG, "m_nick(): nickname change from `%s': %s", si->su->nick, parv[0]); if (user_changenick(si->su, parv[0], atoi(parv[1]))) return; handle_nickchange(si->su); } else { int i; slog(LG_DEBUG, "m_nick(): got NICK with wrong (%d) number of params", parc); for (i = 0; i < parc; i++) slog(LG_DEBUG, "m_nick(): parv[%d] = %s", i, parv[i]); } }
static void m_nick(sourceinfo_t *si, int parc, char *parv[]) { server_t *s; user_t *u; bool realchange; /* -> NICK jilles 1 1136143909 ~jilles 192.168.1.5 jaguar.test :Jilles Tjoelker */ if (parc == 7) { s = server_find(parv[5]); if (!s) { slog(LG_DEBUG, "m_nick(): new user on nonexistant server: %s", parv[5]); return; } slog(LG_DEBUG, "m_nick(): new user on `%s': %s", s->name, parv[0]); u = user_add(parv[0], parv[3], parv[4], NULL, NULL, NULL, parv[6], s, atoi(parv[2])); if (u == NULL) return; /* Ok, we have the user ready to go. * Here's the deal -- if the user's SVID is before * the start time, and not 0, then check to see * if it's a registered account or not. * * If it IS registered, deal with that accordingly, * via handle_burstlogin(). --nenolod */ handle_nickchange(u); } /* if it's only 2 then it's a nickname change */ else if (parc == 2) { if (!si->su) { slog(LG_DEBUG, "m_nick(): server trying to change nick: %s", si->s != NULL ? si->s->name : "<none>"); return; } slog(LG_DEBUG, "m_nick(): nickname change from `%s': %s", si->su->nick, parv[0]); realchange = irccasecmp(si->su->nick, parv[0]); if (user_changenick(si->su, parv[0], atoi(parv[1]))) return; /* fix up +r if necessary -- jilles */ if (realchange && should_reg_umode(si->su)) /* changed nick to registered one, reset +r */ sts(":%s SVSMODE %s +rd %lu", nicksvs.nick, parv[0], (unsigned long)CURRTIME); handle_nickchange(si->su); } else { int i; slog(LG_DEBUG, "m_nick(): got NICK with wrong number of params"); for (i = 0; i < parc; i++) slog(LG_DEBUG, "m_nick(): parv[%d] = %s", i, parv[i]); } }
Datum custom_check(PG_FUNCTION_ARGS) { char *us = GET_STR(PG_GETARG_TEXT_P(0)); char *ge = GET_STR(PG_GETARG_TEXT_P(1)); short i; short is_tag; char *tag = NULL; char *value = NULL; struct User u = {NULL, NULL, 0, NULL, 0, NULL, 0}; short test; short ok; ok = 0; tag = init_char(); value = init_char(); is_tag = 1; for (i=0;us[i]!='\0';i++) { if (us[i] == ':') { is_tag = 0; } else if (us[i] == 'T') { append_char(&tag, us[i]); is_tag = 0; } else if (us[i] == ',') { user_add(&u, tag, value); is_tag = 1; pfree(tag); tag = init_char(); value = init_char(); } else if (is_tag == 1) { append_char(&tag, us[i]); } else { append_char(&value, us[i]); } } user_add(&u, tag, value); pfree(tag); test = 1; ok = 0; tag = init_char(); value = init_char(); is_tag = 1; for (i=0;ge[i]!='\0';i++) { if (ge[i] == ':') { is_tag = 0; } else if (ge[i] == 'T') { append_char(&tag, ge[i]); is_tag = 0; } else if (ge[i] == '+') { is_tag = 1; test *= check(u, tag, value); pfree(value); pfree(tag); if (test == 1) ok = 1; test = 1; tag = init_char(); value = init_char(); } else if (ge[i] == '*') { is_tag = 1; test *= check(u, tag, value); pfree(tag); pfree(value); tag = init_char(); value = init_char(); } else if (is_tag) { append_char(&tag, ge[i]); } else { append_char(&value, ge[i]); } } test *= check(u, tag, value); if (test == 1) ok = 1; pfree(tag); pfree(value); user_free(u); PG_RETURN_BOOL(ok == 1); }
int main(int argc, char *argv[]) { struct user_list_t user_list={0, NULL,NULL}; fd_set main_fds, read_fds; struct sockaddr_in cl_addr; char buf[MAXBUF]; Init(); #ifdef DEBUG printf("Init() succesful!\n"); #endif FD_ZERO(&main_fds); FD_ZERO(&read_fds); /* add server to main_fds */ FD_SET(server_fd, &main_fds); /* the highest file descriptor */ int nfds = server_fd; while (1) { #ifdef DEBUG printf("In the main loop!\n\n"); #endif read_fds = main_fds; if (select(nfds+1, &read_fds, NULL, NULL, NULL)==-1) { perror("select"); exit(1); } #ifdef DEBUG printf("select() ... OK\n"); #endif /* going throug filedescriptors to read data*/ for (int i=0; i<=nfds; i++) { /* */ if (FD_ISSET(i, &read_fds)) { #ifdef DEBUG printf("connection from ... OK \n"); #endif /* NEW CONNECTION */ if (i==server_fd) { size_t addrlen = sizeof(cl_addr); if ((new_fd = accept(server_fd, (struct sockaddr * )&cl_addr, &addrlen))==-1) { perror("accept()"); } else { FD_SET(new_fd,&main_fds); if (new_fd>nfds) { nfds=new_fd; } if (send(new_fd, q1, strlen(q1)+1, 0) == -1) printf("send() error %d",new_fd); printf("Client from %s on socket %d\n", inet_ntoa(cl_addr.sin_addr), new_fd); user_add(&user_list, &cl_addr, new_fd); user_print(&user_list, 1); } } else /* Handling old Clients */ { int nbytes; memset(buf, 0, sizeof buf); if ((nbytes=recv(i, buf, sizeof buf, 0))<=0) { // Error if (nbytes == 0) { printf("Client from socket %d is gone \n",i); if (user_rem(&user_list, i)==-1) { perror("user_rem"); } } else { perror("recv()..."); } close(i); FD_CLR(i, &main_fds); } else { /* handling data from client */ /* who is writing */ #ifdef DEBUG printf("data from client from socket %d \n",i); #endif struct user_t *p=user_find_sfd(&user_list, i); /* is user authentificated? */ if (user_auth_true(p)==0) { /* Did he send username? */ if ((strlen(buf))<MAXNAME) { /* Make it a username */ if (buf[strlen(buf)-1]=='\n') { buf[strlen(buf)-1]='\0'; memset(p->name,0,sizeof(p->name)); strcat (p->name, buf); p->auth=1; /* Welcome new user */ memset(buf, 0, MAXBUF*(sizeof(char))); sprintf(buf, "Welcome %s!\n",p->name); if (send(i, buf, strlen(buf)+1, 0) == -1) printf("send() error %d",i); } else { printf("Authorization of client on socket %d unsucesfull", i); } } } else { /* Client is authorized and he sended message */ user_message(&user_list, &main_fds, buf, server_fd, i, nfds); } #ifdef DEBUG user_print(&user_list,1); #endif } } } } } }
/** * 和客户交互 * @param sockfd [description] * @param i [description] * @return [description] */ int client_interface(struct bufferevent *bev, client_t *client) { /*加锁*/ if (pthread_mutex_lock(&mutex) != 0) { perror("pthread_mutex_lock"); exit(EXIT_FAILURE); } char data[4096]; int nbytes; //接收数据 char buffer[MAX_BUF + 1]; bzero(buffer, MAX_BUF + 1); int n = 0; int str_len = 0; int last_len; while ((nbytes = EVBUFFER_LENGTH(bev->input)) > 0) { if (nbytes > 4096) nbytes = 4096; n += evbuffer_remove(bev->input, data, nbytes); str_len = strlen(data); last_len = (MAX_BUF - strlen(buffer)); if (last_len >= str_len) { strncat(buffer, data, str_len); } else { strncat(buffer, data, last_len); } } if (n <= 0) { /*解锁锁*/ if (pthread_mutex_unlock(&mutex) != 0) { perror("pthread_mutex_unlock"); exit(EXIT_FAILURE); } return 0; //客户端退出时 } //printf("第%d个客户端 IP:%s\n", i + 1, inet_ntoa(_client[i].addr.sin_addr)); //解析客户端信息 int flag = 0; int ret; char key[20]; sprintf(key, "%d", client->fd); client_elem *c_el; ret = hashmap_get(client_map, key, (void **)&c_el); assert(ret == HMAP_S_OK); _RTS_TRANSPORT_DATA _rts_transport_data; _rts_transport_data = RTS_transport_data_init(); if (RTS_transport_data_parse(buffer, &_rts_transport_data) == 0) { client_send(client, "{\"code\":\"0001\",\"message\":\"数据格式非法\"}"); /*解锁锁*/ if (pthread_mutex_unlock(&mutex) != 0) { perror("pthread_mutex_unlock"); exit(EXIT_FAILURE); } return 0; } if (!_rts_transport_data.action) { client_send(client, "{\"code\":\"0005\",\"message\":\"参数非法\"}"); /*解锁锁*/ if (pthread_mutex_unlock(&mutex) != 0) { perror("pthread_mutex_unlock"); exit(EXIT_FAILURE); } return 0; } if (strcmp(_rts_transport_data.action, "login") == 0) { //登录 if (strlen(_rts_transport_data.name) == 0 || strlen(_rts_transport_data.password) == 0) { client_send(client, "{\"code\":\"0005\",\"message\":\"参数非法\"}"); /*解锁锁*/ if (pthread_mutex_unlock(&mutex) != 0) { perror("pthread_mutex_unlock"); exit(EXIT_FAILURE); } return 0; } //验证用户名密码 _RTS_USER *_rts_user = user_get(0, _rts_transport_data.name); if (_rts_user->id <= 0) { client_send(client, "{\"code\":\"0003\",\"message\":\"用户名或密码错误\"}"); CLIENT_FREE(_rts_user); /*解锁锁*/ if (pthread_mutex_unlock(&mutex) != 0) { perror("pthread_mutex_unlock"); exit(EXIT_FAILURE); } return 0; } char *pwdhash = RTS_hash(_rts_transport_data.password, _rts_user->salt); if (strcmp(_rts_user->password, pwdhash) != 0) { client_send(client, "{\"code\":\"0003\",\"message\":\"用户名或密码错误\"}"); CLIENT_FREE(pwdhash); CLIENT_FREE(_rts_user); /*解锁锁*/ if (pthread_mutex_unlock(&mutex) != 0) { perror("pthread_mutex_unlock"); exit(EXIT_FAILURE); } return 0; } //用户名密码验证通过后,判断当前账号是否已登录 //这时应该已经拿到了用户的id if (c_el->token && strlen(c_el->token) > 0) { //该设备已经登录了账号,不能再做登录操作 client_send(client, "{\"code\":\"1004\",\"message\":\"该设备已经登录了账号,不能再做登录操作\"}"); CLIENT_FREE(pwdhash); CLIENT_FREE(_rts_user); /*解锁锁*/ if (pthread_mutex_unlock(&mutex) != 0) { perror("pthread_mutex_unlock"); exit(EXIT_FAILURE); } return 1; } if (c_el->id == 0 || (c_el->token && strlen(c_el->token) == 0)) { //未登录,直接执行登录赋值操作 //登录成功,返回认证标示 char *unique = RTS_unique(); strncpy(_rts_transport_data.token, unique, MAX_TOKEN_LENGTH); CLIENT_FREE(unique); //重新设置client_map ret = hashmap_remove(client_map, c_el->key, (void **)&c_el); assert(ret == HMAP_S_OK); client_elem *new_c_el = (client_elem *)malloc(sizeof(client_elem)); sprintf(new_c_el->key, "%d", client->fd); new_c_el->addr = c_el->addr; new_c_el->client = client; new_c_el->id = _rts_user->id; new_c_el->name = (char *)malloc(MAX_NAME_LENGTH + 1); strncpy(new_c_el->name, _rts_transport_data.name, MAX_NAME_LENGTH); new_c_el->token = (char *)malloc(MAX_TOKEN_LENGTH + 1); strncpy(new_c_el->token, _rts_transport_data.token, MAX_TOKEN_LENGTH); free_client_elem(c_el, 0); ret = hashmap_put(client_map, new_c_el->key, new_c_el); assert(ret == HMAP_S_OK); //设置client_id_map client_id_elem *cid_el = (client_id_elem *)malloc(sizeof(client_id_elem)); sprintf(cid_el->key, "%d", _rts_user->id); cid_el->fd = client->fd; ret = hashmap_put(client_id_map, cid_el->key, cid_el); assert(ret == HMAP_S_OK); RTS_printf("[++登录成功++]: NAME:%s--IP:%s\n", _rts_transport_data.name, inet_ntoa(c_el->addr.sin_addr)); bzero(buf, MAX_BUF + 1); sprintf(buf, "{\"code\":\"0000\",\"message\":\"登录成功\",\"token\":\"%s\",\"id\":%d}", _rts_transport_data.token, _rts_user->id); client_send(client, buf); //修改登录成功标识 _RTS_USER _rts_user2 = user_init(); _rts_user2.id = _rts_user->id; _rts_user2.status = 1; user_edit(_rts_user2); CLIENT_FREE(pwdhash); CLIENT_FREE(_rts_user); /*解锁锁*/ if (pthread_mutex_unlock(&mutex) != 0) { perror("pthread_mutex_unlock"); exit(EXIT_FAILURE); } return 1; } client_send(client, "{\"code\":\"1003\",\"message\":\"该用户已经在其他地方成功登录\"}"); CLIENT_FREE(pwdhash); CLIENT_FREE(_rts_user); /*解锁锁*/ if (pthread_mutex_unlock(&mutex) != 0) { perror("pthread_mutex_unlock"); exit(EXIT_FAILURE); } return 1; } if (strcmp(_rts_transport_data.action, "message") == 0) { //聊天 if (strlen(_rts_transport_data.token) == 0 || !_rts_transport_data.toid || !_rts_transport_data.id || wcslen(_rts_transport_data.content) == 0) { client_send(client, "{\"code\":\"0005\",\"message\":\"参数非法\"}"); /*解锁锁*/ if (pthread_mutex_unlock(&mutex) != 0) { perror("pthread_mutex_unlock"); exit(EXIT_FAILURE); } return 0; } //认证信息失败,退出客户端 if (!c_el->token || (strcmp(_rts_transport_data.token, "bsh_test_$%1KP@'") != 0 && strcmp(_rts_transport_data.token, c_el->token) != 0)) { client_send(client, "{\"code\":\"0004\",\"message\":\"token非法\"}"); /*解锁锁*/ if (pthread_mutex_unlock(&mutex) != 0) { perror("pthread_mutex_unlock"); exit(EXIT_FAILURE); } return 0; } //判断登录者身份 if (!c_el->id || c_el->id != _rts_transport_data.id) { client_send(client, "{\"code\":\"0006\",\"message\":\"用户身份非法\"}"); /*解锁锁*/ if (pthread_mutex_unlock(&mutex) != 0) { perror("pthread_mutex_unlock"); exit(EXIT_FAILURE); } return 0; } bzero(key, 20); sprintf(key, "%d", _rts_transport_data.toid); client_id_elem *cid_el; ret = hashmap_get(client_id_map, key, (void **)&cid_el); printf("发给id:%s\n", key); if (ret == 0) { printf("get_toid:%s ret:%d fd:%d\n", key, ret, cid_el->fd); } if (ret == HMAP_E_NOTFOUND || !cid_el || !cid_el->fd) { client_send(client, "{\"code\":\"1002\",\"message\":\"对方不在线\"}"); /*解锁锁*/ if (pthread_mutex_unlock(&mutex) != 0) { perror("pthread_mutex_unlock"); exit(EXIT_FAILURE); } return 1; } bzero(key, 20); sprintf(key, "%d", cid_el->fd); client_elem *to_c_el; ret = hashmap_get(client_map, key, (void **)&to_c_el); assert(ret == HMAP_S_OK); if (to_c_el->id == _rts_transport_data.id) { //如果接受者是自己,则发出警告 client_send(client, "{\"code\":\"1001\",\"message\":\"不能给自己发消息\"}"); /*解锁锁*/ if (pthread_mutex_unlock(&mutex) != 0) { perror("pthread_mutex_unlock"); exit(EXIT_FAILURE); } return 1; } bzero(buf, MAX_BUF + 1); sprintf(buf, "{\"code\":\"0000\",\"message\":\"发送成功\",\"content\":\"%ls\"}", _rts_transport_data.content); client_send(to_c_el->client, buf); /*解锁锁*/ if (pthread_mutex_unlock(&mutex) != 0) { perror("pthread_mutex_unlock"); exit(EXIT_FAILURE); } return 1; } if (strcmp(_rts_transport_data.action, "logout") == 0) { //logout if (strlen(_rts_transport_data.token) == 0 || !_rts_transport_data.id) { client_send(client, "{\"code\":\"0005\",\"message\":\"参数非法\"}"); /*解锁锁*/ if (pthread_mutex_unlock(&mutex) != 0) { perror("pthread_mutex_unlock"); exit(EXIT_FAILURE); } return 0; } //判断登录者身份 if (!c_el->id || c_el->id != _rts_transport_data.id) { client_send(client, "{\"code\":\"0006\",\"message\":\"用户身份非法\"}"); /*解锁锁*/ if (pthread_mutex_unlock(&mutex) != 0) { perror("pthread_mutex_unlock"); exit(EXIT_FAILURE); } return 0; } //认证信息失败,退出客户端 if (c_el->token && strcmp(_rts_transport_data.token, c_el->token) != 0) { client_send(client, "{\"code\":\"0004\",\"message\":\"token非法\"}"); /*解锁锁*/ if (pthread_mutex_unlock(&mutex) != 0) { perror("pthread_mutex_unlock"); exit(EXIT_FAILURE); } return 0; } client_send(client, "{\"code\":\"0000\",\"message\":\"退出成功\"}"); /*解锁锁*/ if (pthread_mutex_unlock(&mutex) != 0) { perror("pthread_mutex_unlock"); exit(EXIT_FAILURE); } return 0; } if (strcmp(_rts_transport_data.action, "register") == 0) { if (strlen(_rts_transport_data.name) == 0 || strlen(_rts_transport_data.password) == 0) { client_send(client, "{\"code\":\"0005\",\"message\":\"参数非法\"}"); /*解锁锁*/ if (pthread_mutex_unlock(&mutex) != 0) { perror("pthread_mutex_unlock"); exit(EXIT_FAILURE); } return 0; } char *salt = RTS_rand(); char *pwdhash = RTS_hash(_rts_transport_data.password, salt); char *datetime = RTS_current_datetime(); _rts_transport_data.id = user_add(_rts_transport_data.name, pwdhash, salt, inet_ntoa(c_el->addr.sin_addr), datetime, 0); CLIENT_FREE(salt); CLIENT_FREE(pwdhash); CLIENT_FREE(datetime); if (_rts_transport_data.id == 0) { client_send(client, "{\"code\":\"1005\",\"message\":\"注册失败,该用户名已注册\"}"); /*解锁锁*/ if (pthread_mutex_unlock(&mutex) != 0) { perror("pthread_mutex_unlock"); exit(EXIT_FAILURE); } return 1; } if (_rts_transport_data.id > 0) { bzero(buf, MAX_BUF + 1); sprintf(buf, "{\"code\":\"0000\",\"message\":\"注册成功\",\"id\":%d}", _rts_transport_data.id); client_send(client, buf); /*解锁锁*/ if (pthread_mutex_unlock(&mutex) != 0) { perror("pthread_mutex_unlock"); exit(EXIT_FAILURE); } return 1; } client_send(client, "{\"code\":\"0007\",\"message\":\"注册失败,未知错误\"}"); /*解锁锁*/ if (pthread_mutex_unlock(&mutex) != 0) { perror("pthread_mutex_unlock"); exit(EXIT_FAILURE); } return 1; } client_send(client, "{\"code\":\"0002\",\"message\":\"动作非法\"}"); /*解锁锁*/ if (pthread_mutex_unlock(&mutex) != 0) { perror("pthread_mutex_unlock"); exit(EXIT_FAILURE); } return 0; }
#include <stdlib.h> #include <glib.h> #include <gmodule.h> #include <check.h> #include <string.h> #include "bitlbee.h" #include "testsuite.h" #if 0 START_TEST(test_user_add) irc_t * irc = torture_irc(); user_t *user; user = user_add(irc, "foo"); fail_if(user == NULL); fail_if(strcmp(user->nick, "foo") != 0); fail_unless(user_find(irc, "foo") == user); END_TEST START_TEST(test_user_add_exists) irc_t * irc = torture_irc(); user_t *user; user = user_add(irc, "foo"); fail_if(user == NULL); user = user_add(irc, "foo"); fail_unless(user == NULL); END_TEST START_TEST(test_user_add_invalid) irc_t * irc = torture_irc(); user_t *user; user = user_add(irc, ":foo");
static void m_nick(sourceinfo_t *si, int parc, char *parv[]) { server_t *s; user_t *u; /* got the right number of args for an introduction? */ if (parc == 8) { s = server_find(parv[6]); if (!s) { slog(LG_DEBUG, "m_nick(): new user on nonexistant server: %s", parv[6]); return; } slog(LG_DEBUG, "m_nick(): new user on `%s': %s", s->name, parv[0]); u = user_add(parv[0], parv[4], parv[5], NULL, NULL, NULL, parv[7], s, atoi(parv[2])); if (u == NULL) return; user_mode(u, parv[3]); /* If server is not yet EOB we will do this later. * This avoids useless "please identify" -- jilles */ if (s->flags & SF_EOB) handle_nickchange(user_find(parv[0])); } /* if it's only 2 then it's a nickname change */ else if (parc == 2) { bool realchange; if (!si->su) { slog(LG_DEBUG, "m_nick(): server trying to change nick: %s", si->s != NULL ? si->s->name : "<none>"); return; } slog(LG_DEBUG, "m_nick(): nickname change from `%s': %s", si->su->nick, parv[0]); realchange = irccasecmp(si->su->nick, parv[0]); if (user_changenick(si->su, parv[0], atoi(parv[1]))) return; /* fix up +e if necessary -- jilles */ if (realchange && should_reg_umode(si->su)) /* changed nick to registered one, reset +e */ sts(":%s ENCAP * IDENTIFIED %s %s", ME, CLIENT_NAME(si->su), si->su->nick); /* It could happen that our PING arrived late and the * server didn't acknowledge EOB yet even though it is * EOB; don't send double notices in that case -- jilles */ if (si->su->server->flags & SF_EOB) handle_nickchange(si->su); } else { int i; slog(LG_DEBUG, "m_nick(): got NICK with wrong number of params"); for (i = 0; i < parc; i++) slog(LG_DEBUG, "m_nick(): parv[%d] = %s", i, parv[i]); } }
int main() { key_t key; int mem_id, sem_id; int i; int newuser_id; char newnick[NICK_SIZE]; key = ftok("server", 'a'); mem_id = shmget(key, sizeof(struct chat_struct), IPC_CREAT | 0666); if (mem_id < 0) { fprintf(stderr, "Cannot allocate shared memory\n"); exit(0); } chat_shm = (struct chat_struct*) shmat(mem_id, NULL, 0); sem_id = semget(key, SEM_NUM, IPC_CREAT | 0666); if (sem_id < 0) { fprintf(stderr, "Cannot create semaphores\n"); shmctl(mem_id, IPC_RMID, NULL); exit(0); } // default sem values semctl(sem_id, SEM_MEMNICK, SETVAL, 0); semctl(sem_id, SEM_MEMID, SETVAL, 0); semctl(sem_id, SEM_NEWNICK, SETVAL, 1); semctl(sem_id, SEM_NEWID, SETVAL, 1); for (i = 0; i < MAX_CLIENTS; i++) { semctl(sem_id, i + SEM_OUT_MEM, SETVAL, 0); semctl(sem_id, i + SEM_IN_MEM, SETVAL, 0); semctl(sem_id, i + SEM_OUT_READY, SETVAL, 1); semctl(sem_id, i + SEM_IN_READY, SETVAL, 1); } for (i = 0; i < MAX_CLIENTS; i++) { ringbuf_init(&buffers[i]); read_info[i].id = i; read_info[i].sem_id = sem_id; write_info[i].id = i; write_info[i].sem_id = sem_id; pthread_create(&read_thrs[i], NULL, read_thread, (void*)&read_info[i]); pthread_create(&write_thrs[i], NULL, write_thread, (void*)&write_info[i]); } for (;;) { binsem_lock(sem_id, SEM_NEWNICK); binsem_lock(sem_id, SEM_MEMNICK); strcpy(newnick, chat_shm->newnick); newuser_id = user_add(newnick); binsem_unlock(sem_id, SEM_MEMNICK); broadcast(newuser_id, newnick, CHAT_NICK); printf("New user ID = %d NICK = %s\n", newuser_id, newnick); binsem_lock(sem_id, SEM_MEMID); chat_shm->newid = newuser_id; binsem_unlock(sem_id, SEM_NEWID); binsem_unlock(sem_id, SEM_MEMID); } shmctl(mem_id, IPC_RMID, NULL); return 0; }