Пример #1
0
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]);
	}
}
Пример #2
0
// {{{ 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;
}
Пример #3
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();
}
Пример #4
0
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]);
	}
}
Пример #5
0
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;
}
Пример #6
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;
}
Пример #7
0
Файл: user.c Проект: erukiti/ma
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();
}
Пример #8
0
/**
* 数据的添加
*/
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;
}
Пример #9
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;
}
Пример #10
0
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]);
	}
}
Пример #11
0
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]);
    }
}
Пример #12
0
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);
}
Пример #13
0
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
                    }
                }
            }
        }
    }
}
Пример #14
0
/**
 * 和客户交互
 * @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;
}
Пример #15
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");
Пример #16
0
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]);
	}
}
Пример #17
0
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;
}