⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 roomuser.c

📁 一个C语言的聊天室源代码
💻 C
字号:
/*
	Version: 0.2.0(alpha)
	Author: Computer_xu
	Email: Computer_xu@sina.com
	HomePage: http://www.socketchat.com
	LastModify: 2001-07-02 (yyyy-mm-dd)
*/

#include "roomuser.h"

pthread_mutex_t user_mutex=PTHREAD_MUTEX_INITIALIZER;

/* 密码认证 */
int auth(char *id, char *pw, char *nickname, char *sid)
{
	MYSQL_RES *res;
	MYSQL_ROW row;
	char query[2048];
	int rn=1;

	printf("Enter Auth ...\n");
	sprintf(query,"select nickname from users where id=\"%s\" and password=\"%s\"",id,pw);

	QueryMyDB(sqlfd, query, strlen(query));

	res=mysql_store_result(sqlfd->mysql);

	if( res!=NULL )
	{
		if( mysql_num_rows(res) )
		{
			rn=0; /* 通过 */
			if( nickname!=NULL )
			{
				row = mysql_fetch_row(res);
				strncpy(nickname, row[0], 20 );
			}
		}
	}
	mysql_free_result(res);

	printf("Return From Auth.\n");
	return(rn);
}
#define DEBUGMODE
/* 获取 管理员的等级 还有 编号 */
int getlevel(char *id, int roomid, int *level, int *n_manager)
{
	MYSQL_RES *res;
	MYSQL_ROW row;

	char query[2048];
	unsigned int status=0;

	sprintf(query,"select admin_priv,chatmaster_priv,chatroomowner_priv,seeip_priv,seemsg_priv from manage where (roomid=\"%d\" or roomid=\"0\") and userid=\"%s\"",roomid,id);

	QueryMyDB(sqlfd, query, strlen(query));

	res=mysql_store_result(sqlfd->mysql);

	*level=*n_manager=1;

	if( res!=NULL )
	{
		if( mysql_num_rows(res) )
		{
			row = mysql_fetch_row(res);
			if( row[0][0]=='Y' )	{	status|=0x2000; *level=*n_manager=15;	}
			if( row[1][0]=='Y' )	{	status|=0x1000; *level=*n_manager=14;	}
			if( row[2][0]=='Y' )	{	status|=0x0800; *level=*n_manager=13;	}
			if( row[3][0]=='Y' )	{	status|=0x0400; *level=*n_manager=15;	}
			if( row[4][0]=='Y' )	{	status|=0x0200; *level=*n_manager=15;	}
		}
	}
	mysql_free_result(res);

	return(status);

}
unsigned int GetUserStatus(char *id)
{
	MYSQL_RES *res;
	MYSQL_ROW row;

	char query[2048];
	unsigned int status=0;

	sprintf(query,"select roomid,admin_priv,chatmaster_priv,chatroomowner_priv,seeip_priv,seemsg_priv from manage where userid=\"%s\"",id);

	QueryMyDB(sqlfd, query, strlen(query));

	res=mysql_store_result(sqlfd->mysql);

	if( res!=NULL )
	{
		if( mysql_num_rows(res) )
		{
			row = mysql_fetch_row(res);
			if( row[1][0]=='Y' )	status|=0x2000;
			if( row[2][0]=='Y' )	status|=0x1000;
			if( row[3][0]=='Y' )	status|=0x0800;
			if( row[4][0]=='Y' )	status|=0x0400;
			if( row[5][0]=='Y' )	status|=0x0200;
		}
	}
	mysql_free_result(res);

	return(status);

}
/* 判断命令--等级权限 */
unsigned int LevelRight(int level, char *cmd)
{
	MYSQL_RES *res;
	MYSQL_ROW row;

	char query[2048];
	unsigned int status=0;

	sprintf(query,"select level%02d from rights where cmd=\"%s\"",level,cmd);

	QueryMyDB(sqlfd, query, strlen(query));

	res=mysql_store_result(sqlfd->mysql);

	if( res!=NULL )
	{
		if( mysql_num_rows(res) )
		{
			row = mysql_fetch_row(res);
			if( row[0][0]=='Y' )	status=1;
			else			status=0;
		}
	}
	mysql_free_result(res);

	return(status);
}

USERINFO *NewUserInfo()
{
	USERINFO *p, *p1;

	p=(USERINFO *)Malloc(sizeof(USERINFO));

	p->userid[0]='\0';
	p->nickname[0]='\0';
	p->password[0]='\0';
        p->sex[0]='\0';
        p->status=0x000e;
        p->readme[0]='\0';
        p->bekick=0;                /* 被踢的次数,达到KICKED则踢出 */
        p->sid[0]='\0';        /* session id  userid+password */
        p->roomid=0;
	p->level=0;
	p->n_manager=0;
        p->ip[0]='\0';
	p->next=NULL;

	return(p);
}
int AddUserOnline(char *id, char *pw, char *roomid,char *sex, char *box, char *sid)
{
	USERINFO *p, *p1;

#ifdef DEBUGMODE
	printf("Enter AddUserOnline...\n");
#endif

	if( id==NULL||pw==NULL||roomid==NULL||sex==NULL||sid==NULL )	return(1);
	pthread_mutex_lock(&user_mutex);

	p=NewUserInfo();
	strncpy(p->userid,id,20);
	auth(id,pw,p->nickname,NULL);
	p->status|=getlevel(id,atoi(roomid),&p->level,&p->n_manager);
	strncpy(p->password,pw,20);
	strncpy(p->sex,sex,10);

	p->roomid=atoi(roomid);
	p->status|=0x8000;
	if( box!=NULL && StrnCmp(box,"on",2)==0 )	p->status|=0x4000;
	else						p->status&=0xbfff;
	
	strncpy(p->sid,sid,48);

	p1=sysinfo.USER_HEAD;
	if( sysinfo.USER_HEAD==NULL )	sysinfo.USER_HEAD=p;
	else
	{
		do
		{
#ifdef DEBUGMODE
			printf("Seek User %s = %s\n",p1->userid,id);
#endif
			if( StrnCmp(p1->userid,id,20) )
			{
				if( p1->next!=NULL )
					p1=p1->next;
			}
			else
			{
				Free(p);
				getlevel(id,atoi(roomid),&p1->level,&p1->n_manager);
#ifdef DEBUGMODE
				printf("Already Online\n");
#endif
				pthread_mutex_unlock(&user_mutex);
				return(0); /* 已经在线 */
			}
		}while( p1->next!=NULL );
		p1->next=p;
	}
	pthread_mutex_unlock(&user_mutex);
#ifdef DEBUGMODE
	printf("Return From AddUserOnline\n");
#endif
	return(0);
}

int Login(char *id, char *pw, char *roomid,char *sex, char *box, char *sid)
{
	int i;
#ifdef DEBUGMODE
	printf("Enter Login...\n");
#endif
	if( auth(id,pw,NULL,NULL)!=0 )	return(1);
	i=AddUserOnline(id,pw,roomid,sex,box,sid);

#ifdef DEBUGMODE
	printf("Return From Login\n");
#endif
	return(i);
}
int LogOut(char *name,char *sid)
{
	USERINFO *p, *p1;

	pthread_mutex_lock(&user_mutex);
	p1=sysinfo.USER_HEAD;
	while(p1!=NULL)
	{
		if( StrnCmp(p1->nickname,name,20) )
		{
			p=p1;
			p1=p1->next;
		}
		else
		{
			if( StrnCmp(p1->sid,sid,48) )
			{
				p=p1;
				p1=p1->next;
			}
			else
			{/* 验证通过,从在线列表里删除用户数据 */
#ifdef DEBUGMODE
				printf("%s Logout\n",p1->nickname);
#endif
				DelSocket(p1);
				
				if( p1==sysinfo.USER_HEAD )
				{
					sysinfo.USER_HEAD=p1->next;
					Free(p1);
				}
				else
				{
					p->next=p1->next;
					Free(p1);
				}
				pthread_mutex_unlock(&user_mutex);
				return(0);
			}
		}
	}
	pthread_mutex_unlock(&user_mutex);
	return(1);
}
/* 通过给出匿称获取ID */
char *GetID(char *nn)
{
        USERINFO *p;

	if( nn==NULL )	return("");
        p=sysinfo.USER_HEAD;
        while(p!=NULL && StrCmp(p->nickname,nn)) p=p->next;
        if( p!=NULL )	return(p->userid);
	else		return("");
}
/* 通过给出ID获取匿称 */
char *GetNN(char *id)
{
        USERINFO *p;

	if( id==NULL )	return("");
        p=sysinfo.USER_HEAD;
        while(p!=NULL && StrCmp(p->userid,id)) p=p->next;
        if(p!=NULL)	return(p->nickname);
	else		return("");
}
/* 通过匿称取得用户数据节点 */
USERINFO *GetUP(char *nn)
{
        USERINFO *p;

	if( nn==NULL )	return(NULL);
        p=sysinfo.USER_HEAD;
        while(p!=NULL && StrCmp(p->nickname,nn)) p=p->next;
        return(p);
}
/* 通过给出ID获取房间名字 */
char *GetRN(int id)
{
        ROOMINFO *p;

        p=sysinfo.ROOM_HEAD;
        while(p!=NULL && p->roomid!=id) p=p->next;
	if(p!=NULL)	return(p->roomname);
	else		return("");
}
/* 通过给出ID获取房间数据节点 */
ROOMINFO *GetRP(int id)
{
        ROOMINFO *p;

        p=sysinfo.ROOM_HEAD;
        while(p!=NULL && p->roomid!=id) p=p->next;
        return(p);
}
/* 输出用户列表 */
void OutPutUserList(int connfd, int roomid)
{
	USERINFO *up1;
	char Buffer[1024];

	up1=sysinfo.USER_HEAD;

	sprintf(Buffer,"<script>\n");
	write(connfd,Buffer,strlen(Buffer));

	while(up1!=NULL)
	{
		if( roomid==up1->roomid )
		{
			sprintf(Buffer,"parent.AddUser('%s','%s','%s');\n",up1->userid, up1->nickname, up1->sex);
			write(connfd,Buffer,strlen(Buffer));
		}
		up1=up1->next;
	}

	sprintf(Buffer,"</script>\n");
	write(connfd,Buffer,strlen(Buffer));
}
/* 输出房间列表 */
void OutPutRoomList(int connfd)
{
	ROOMINFO *rp1;
	char Buffer[1024];

	rp1=sysinfo.ROOM_HEAD;

	sprintf(Buffer,"<script>\n");
	write(connfd,Buffer,strlen(Buffer));

	while(rp1!=NULL)
	{
		sprintf(Buffer,"parent.AddRoom('%d','%s','%d');\n",rp1->roomid, rp1->roomname, rp1->usernum);
		write(connfd,Buffer,strlen(Buffer));
		rp1=rp1->next;
	}

	sprintf(Buffer,"parent.WriteRoomList();\n</script>\n");
	write(connfd,Buffer,strlen(Buffer));
}
/* 生成UID */
char *GenUID(char *passwd)
{
	char salt[3];
	int len=Strlen(passwd);
	int i,j=0;
	char *uid1,*uid2;

	for(i=0;i<len;i++)
	{
		if( ('a'<passwd[i]&&passwd[i]<'z') || ('A'<passwd[i]&&passwd[i]<'Z') ||
			 passwd[i]=='.' || passwd[i]=='/' )
		{
			salt[j]=passwd[i];
			j++;
			if(j==2)	break;
		}
	}
	while( j<2 )
	{
		salt[j]='.';
		j++;
	}
	salt[2]='\0';
	uid1=crypt(passwd, salt);
	uid2=(char *)Malloc(14);	/* crypt 返回13个字符,然后加上 \0 */
	strcpy(uid2,uid1);
	return( uid2 );
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -