📄 roomuser.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 + -