bool KUser::CheckUser(unsigned long ip,unsigned gid) { KUser_int_map::iterator it; m_lock.Lock(); it=m_user.find(ip); if(it!=m_user.end()){ if(gid==ALLUSER||gid==(*it).second.user_id){ // printf("gid==0 or gid == loginid\n"); goto done; } for(int i=0;i<(*it).second.gids->size();i++){ if(gid==(*it).second.gids->operator[](i)){ // printf("loginid in group gid.\n"); goto done; } } } m_lock.Unlock(); return false; done: (*it).second.last_active_time=time(NULL); m_lock.Unlock(); return true; }
int KUser::Logout(unsigned long ip) { unsigned stay_time=0; KUser_int_map::iterator it; m_lock.Lock(); it=m_user.find(ip); if(it==m_user.end()){ m_lock.Unlock(); return stay_time; } stay_time=time(NULL)-(*it).second.login_time; //m_user.total_time+=stay_time; (*it).second.user->total_time+=stay_time; (*it).second.user->state=0;//set the user logout klog(RUN_LOG,"user %s logout success\n",(*it).second.user->user.c_str()); m_user.erase(it); m_lock.Unlock(); return stay_time; }
bool KUser::Login(unsigned long ip,const char *user) { UserInfo m_userinfo; if(!LoadUserInfo(user,m_userinfo)) return false; LoginUserInfo tmpuser; stringmap::iterator it2; KUser_int_map::iterator it; tmpuser.login_time=time(NULL); tmpuser.last_active_time=tmpuser.login_time; //tmpuser.user=user; m_root_lock.Lock(); it2=m_all_user.find(user); if(it2==m_all_user.end()){ m_root_lock.Unlock(); return false; } (*it2).second->last_ip=ip; (*it2).second->state=1;//set the user login (*it2).second->last_time=tmpuser.login_time; tmpuser.user=(*it2).second; tmpuser.user_id=(*it2).second->uid; tmpuser.gids=&(*it2).second->gids; m_root_lock.Unlock(); if(tmpuser.user_id==0){ klog(ERR_LOG,"user %s user_id is 0,It may be a bug in %s:%d\n",user,__FILE__,__LINE__); return false; } m_lock.Lock(); it=m_user.find(ip); if(it!=m_user.end()) goto err; ForceLogout(user,false); m_user[ip]=tmpuser; m_lock.Unlock(); char ips[18]; make_ip(ip,ips); klog(RUN_LOG,"user %s(%d) login from %s success\n",user,tmpuser.user_id,ips); return true; err: m_lock.Unlock(); return false; }
unsigned KUser::CheckLogin(unsigned long ip,LoginUserInfo *user_info) { unsigned uid=0; KUser_int_map::iterator it; m_lock.Lock(); it=m_user.find(ip); if(it!=m_user.end()){ uid=(*it).second.user_id; if(user_info!=NULL){ //memcpy(user_info,&(*it).second,sizeof(LoginUserInfo)); user_info->user_id=uid; user_info->user=(*it).second.user; user_info->login_time=(*it).second.login_time; //user_info->last_ip=(*it).second.last_ip; } } m_lock.Unlock(); return uid; }
void KUser::UpdateSendRecvSize(unsigned long ip,int send_size,int recv_size,unsigned uid) { assert(send_size>=0 && recv_size>=0); KUser_int_map::iterator it; if(uid>STARTUID){ map<unsigned,UserInfo *>::iterator it2; m_root_lock.Lock(); it2=m_all_user2.find(uid); if(it2!=m_all_user2.end()){ (*it2).second->send_size+=send_size; (*it2).second->recv_size+=recv_size; } m_root_lock.Unlock(); return; } m_lock.Lock(); it=m_user.find(ip); if(it!=m_user.end()){ (*it).second.user->send_size+=send_size; (*it).second.user->recv_size+=recv_size; } m_lock.Unlock(); }