www.pudn.com > coolchat.zip > chatlogin.pl


sub chatlogin 
{ 
	&get_form_data; 
        $formdata{'LockIP'} = 1 if($formdata{'LockIP'} eq "on"); 
        $formdata{'Color'}  = "#0000FF" if($formdata{'Color'} !~ /^#[\dabcdef]{6}$/i); 
         
                 
        &somerror("ID 长度错了耶!(2-15)","$ChatURLpath",1)         if((length($formdata{'id'}) > 15)||(length($formdata{'id'}) < 2)); 
        &somerror("聊天室名字错误!(<12)","$ChatURLpath",1)   if(length($RoomName) > 12); 
         
        $RoomName = $formdata{'room'}; 
        $RoomName = "main" if($RoomName eq ""); 
         
        $User_ID  =  $formdata{'id'}; 
 
        #Get user data path 
        my $lowid    =  lc($User_ID); 
        $first_id='!'; 
        my $idpath   = $LOGOpath.$first_id."/"; 
        my $Datapath = $idpath.$lowid; 
 
 
        #First, check main permission! 
        MyDo $do_CheckIDIP; 
        &somerror("对不起, 你好像无权使用这个聊天室名字耶!","$ChatURLpath",1) if(&checkforbidroom($RoomName) ne 0); 
        &somerror("对不起, 你的ID 或者 IP 不允许进入聊天室:$Chat_Roomname !","$ChatURLpath",1) if(&checkforbididip($lowid,"main") ne 0); 
        if($RoomName ne "main") 
        { 
              &somerror("对不起, 你的ID 或者 IP 不允许进入聊天室:$RoomName!","$ChatURLpath",1)    if(&checkforbididip($lowid,$RoomName) ne 0); 
        } 
         
        #New user or old user 
        if(-e "$Datapath") 
        {#Registed user, check password 
            #Check Password and update user data 
            &somerror("出错了, 你输入的密码好像不对耶!","$ChatURLpath",1) if(&checkupdate($lowid,$formdata{'passwd'}) ne 0); 
        } 
        else 
        {#newuser enter!! 
            &somerror("出错了耶, 好像碰到了未知的错误, 请再试.","$ChatURLpath",1) if(&addnewuser($User_ID) ne 0); 
        } 
 
        srand(time); 
        $KeyNum =""; 
        my $randum_num=""; 
        my @passset = ('a'..'z', 'A'..'Z', '1'..'9','0'); 
        for (my($i) = 0; $i < 10; $i++) { 
	    $randum_num = int(rand($#passset + 1)); 
	    $KeyNum .= @passset[$randum_num]; 
        }  
 
        &addonlineuser($User_ID,$KeyNum,$RoomName,$NickName); 
         
        if(open(KEY,">$Userdatapath/$lowid.KEY")) 
        { 
        	print KEY "$formdata{'LockIP'}\n$KeyNum\n$ENV{'REMOTE_ADDR'}\n".time; 
        	close KEY; 
        } 
         
        #Update the chat content, $Roomname is set in addonlineuser 
        MyDo $do_getlastmsgnum; 
        $UserData{'LastMsg'} = &GetLastMsgNum($RoomName); 
 
        $message = "$NickName 进入聊天室."."[".&convert_time(time)."]"; 
 
        &UpdateChatData(10, $User_ID,$RoomName,$NickName,$message); 
         
        #Return the result to user 
       
       &chatloginframe; 
} 
 
sub chatloginframe 
{ 
         
        print "Content-type: text/html\nPragma: no-cache\n"; 
 
        &SetCookies(0,'User',$User_ID,'Key',$KeyNum,'Room',$RoomName,'Nick',$NickName,'Color',$formdata{'Color'},'Group',$UsrGroup); 
        #&SetCookies(999999,'Fresh',$Fresh)         if($Fresh ne ""); 
        &SetCookies(999999,'Bgcolor',$Bgcolor)     if($Bgcolor ne ""); 
        &SetCookies(999999,'Fontcolor',$Fontcolor) if($Fontcolor ne ""); 
        &SetCookies(999999,'Fontsize',$Fontsize)   if($Fontsize ne ""); 
        &SetCookies(999999,'Fontface',$Fontface)   if($Fontface ne ""); 
        print "\n"; 
        print qq~ 
             
             
             
        ~; 
print "\n"; 
               
} 
 
#1.new/old room => create room? 
#2.Add user to userlist.dat 
#3.Modify roomlist.dat 
sub addonlineuser 
{ 
    my($userid,$keynum,$room,$nickname) = @_; 
    local($lowid,$entertime,$usernum,$insertsite,$newroomnum,$leaveuser,@leftfilelist); 
 
    $lowid=lc($userid); 
 
    $nickname =~ s/\n|\r//g; 
    $nickname = $userid if(length($nickname) < 3); 
    $entertime = time; 
 
    &lock("$chatdatadir/$room$DATA"); 
    if(-e "$chatdatadir/$room$DATA") 
    {#Enter a exist room 
       if(open(USERLIST,"<$chatdatadir/$room$DATA")) 
       { 
           @userlines=; 
	   close(USERLIST); 
           $usernum=@userlines; 
           $newroomnum = $usernum; 
       } 
       else 
       { 
    	  &unlock("$chatdatadir/$room$DATA"); 
    	  &somerror("系统正忙, 请稍候再试!","$ChatURLpath",1); 
       } 
    
       MyDo $do_finduser; 
       $insertsite = &finduser($lowid,$usernum); 
 
       #Add user to user list 
       if(($insertsite eq $usernum)&&($insertsite >= 0)) 
       {#Add at the tail 
           if(open(USERLIST,">>$chatdatadir/$room$DATA")) 
           { 
              print USERLIST "$lowid:$entertime:$keynum:$ENV{'REMOTE_ADDR'}:$nickname:$entertime:0:E\n"; 
	      close USERLIST; 
	      &unlock("$chatdatadir/$room$DATA"); 
           } 
       } 
       elsif(open(USERLIST,">$chatdatadir/$room$DATA")) 
       {#Insert 
            $entertime = time; 
            $newroommaster = "sysop"; 
 
            for($i = 0;$i<$MID;$i++) 
            { 
                 ($userid,$oldtime) = split(/:/,$userlines[$i],3); 
                 if($oldtime + $MaxIdelTime < $entertime) 
                 { 
                 	$leaveuser .= "$userid "; 
                 	push(@leftfilelist,"$Userdatapath/$userid.KEY"); 
                 	$newroomleftuser{$userid} = 1; 
                 	$newroomnum--; 
                 	next; 
                 } 
                 if($entertime > $oldtime) 
                 {#Find the oldest user in the room. 
                        $newroommaster = $userid; 
                        $entertime = $oldtime; 
                 } 
                 print USERLIST "$userlines[$i]"; 
            } 
            if($insertsite < 0) 
            { 
            	   $MID ++; 
            	   $newroomnum--; 
            } 
            print USERLIST "$lowid:$entertime:$keynum:$ENV{'REMOTE_ADDR'}:$nickname:$entertime:0:E\n"; 
            for( $i = $MID; $i < $usernum; $i++) 
            { 
                 ($userid,$oldtime) = split(/:/,$userlines[$i],3); 
                 if($oldtime + $MaxIdelTime < $entertime) 
                 { 
                 	$leaveuser .= "$userid "; 
                 	push(@leftfilelist,"$Userdatapath/$userid.KEY"); 
                 	$newroomleftuser{$userid} = 1; 
                 	$newroomnum--; 
                 	next; 
                 } 
                 if($entertime > $oldtime) 
                 {#Find the oldest user in the room. 
                        $newroommaster = $userid; 
                        $entertime = $oldtime; 
                 } 
                 print USERLIST "$userlines[$i]"; 
            } 
            close USERLIST; 
            &unlock("$chatdatadir/$room$DATA"); 
      } 
      else 
      { 
    	    &unlock("$chatdatadir/$room$DATA"); 
    	    &somerror("系统正忙, 请稍候再试!","$ChatURLpath",1); 
      } 
      &unlock("$chatdatadir/$room$DATA");       
      $newroomnum++; 
       
       if($insertsite ne -1) 
       {#A new chater enter the room, so we need to modify roomlist file 
          &lock("$ChatRoomListFile"); 
          if(open(ROOMLIST, "<$ChatRoomListFile")) 
          { 
	      @roomlines=; 
              close ROOMLIST; 
              if(open(ROOMLIST, ">$ChatRoomListFile")) 
              { 
                foreach $roomline(@roomlines) 
                { 
               	   ($roomname,$theusernum,$master,$visible,$attrib,$tails)=split(/:/,$roomline,6); 
               	   if($roomname eq "$room") 
               	   { 
                        if($attrib ne 9) 
                        { 
                        	if($newroomnum eq 1) 
                        	{ 
                        		$master = $lowid; 
                        	} 
                        	elsif($newroomleftuser{$master} eq 1) 
                        	{ 
                        		$master = lc($newroommaster); 
                        		$newroommastermessage = " 本聊天室的新室主是$master!"; 
                        	} 
                        } 
               		print ROOMLIST "$room:$newroomnum:$master:$visible:$attrib:$tails"; 
                   } 
                   else 
                   { 
                	print ROOMLIST $roomline; 
                   } 
                } 
                close ROOMLIST;                 
              } 
           } 
           &unlock("$ChatRoomListFile"); 
       } 
    } 
    else 
    {#Create a new room 
         $insertsite = -1; 
         if(open(USERLIST,">>$chatdatadir/$room$DATA")) 
         { 
         	print USERLIST "$lowid:$entertime:$keynum:$ENV{'REMOTE_ADDR'}:$nickname:$entertime:0:E\n"; 
         	close USERLIST; 
         } 
         if(open(MSG,">$chatdatadir/$room$MSG")) 
         { 
             	print MSG "0\n"; 
             	close MSG; 
         } 
         &lock("$ChatRoomListFile"); 
         if(open(ROOMLIST, ">>$ChatRoomListFile")) 
         { 
         	if($room eq "main") 
         	{ 
         		print ROOMLIST "main:1:sysop:1:9:0:0:0:0:E\n"; 
         	} 
         	else 
         	{ 
         	        print ROOMLIST "$room:1:$lowid:1:0:0:0:0:0:E\n"; 
         	} 
         	close ROOMLIST; 
         } 
         &unlock("$ChatRoomListFile"); 
         if(open(Header,">$chatdatadir/$room$HEAD")) 
         { 
        	print Header "$room"; 
        	close Header; 
         } 
    } 
    &unlock("$chatdatadir/$room$DATA"); 
    if($leaveuser ne "") 
    { 
        $leftmessage = "$leaveuser 离开我们的聊天室. $newroommastermessage"."[".&convert_time(time)."]"; 
        &UpdateChatData(10, '-花无缺-',$room,'-花无缺-',$leftmessage); 
    } 
    unlink(@leftfilelist); 
    &UpdateChatData(40, "-花无缺-",$room,$lowid,'进入'); 
} 
 
sub checkupdate 
{ 
       my($lowid,$passwd) = @_; 
 
       my($first_id,$idpath,$id,$crykey,$right,$keep,$tails1,$tails6,$logtime,$msgnum,$onlinetime,$experience,$lastip,$lasttime,$nowip,$nowtime) = (); 
        
      $first_id='!'; 
       $idpath=$LOGOpath.$first_id."/"; 
       $datapath =  $idpath.$lowid; 
 
       if(open(DATA,"<$datapath")) 
       { 
          @userlines=; 
          close DATA; 
 
          ($id,$crykey,$rightgroup,$tails)=split(/:/,$userlines[0],4); 
#          $crypass=crypt($formdata{'passwd'},$CryKey); 
      $crypass=$formdata{'passwd'}; 
  
          return 2 if($crykey ne $crypass); 
 
          ($UsrRight,$UsrGroup)=split(/\|/,$rightgroup); 
 
          #Now update user data file! 
          &lock("$datapath$DATA"); 
          if(open(DATA,"<$datapath$DATA")) 
          { 
                  @userlines = ; 
                  close DATA; 
                  ($logtime,$msgnum,$onlinetime,$experience,$life,$lastip,$lasttime,$nowip,$nowtime,$tails1)=split(/:/,$userlines[0],10); 
                  ($Fresh,$Bgcolor,$Fontcolor,$Fontsize,$Fontface,$tails6)=split(/:/,$userlines[6],6); 
 
                  $logtime++; 
                  $experience += 2; 
                  $lasttime = $nowtime; 
                  $nowtime  = time; 
                  $lastip   = $nowip; 
                  $nowip    = $ENV{'REMOTE_ADDR'}; 
                  $userlines[0] = "$logtime:$msgnum:$onlinetime:$experience:$life:$lastip:$lasttime:$nowip:$nowtime:$tails1"; 
 
                  $NickName = $userlines[3]; 
                  $NickName =~ s/\n|\r//g; 
 
                  if(open(DATA,">$datapath$DATA")) 
                  { 
                       foreach $line(@userlines) 
                       { 
                 	    print DATA $line; 
                       } 
                       close DATA; 
                  } 
          } 
          &unlock("$datapath$DATA"); 
                        
         
          return 0; 
        
       } 
       return 3; 
} 
 
sub addnewuser 
{ 
      my($newid) = shift; 
      $newid = lc($newid); 
       
      my($first_id,$idpath,$datapath,$right,$lowid,$entertime) = (); 
 
      &somerror("你的ID长度错误!(2~15)","$ChatURLpath",1) if((length($newid) < 2)||(length($newid) > 15)); 
      &somerror("你的密码长度错误!(4~8)","$ChatURLpath",1) if((length($formdata{'passwd'}) < 4)||(length($formdata{'passwd'}) > 8)); 
      $NickName = $formdata{'id'}; 
       
      $entertime = time; 
      $first_id='!'; 
      $idpath   = $LOGOpath.$first_id."/"; 
      $datapath = $idpath.$newid; 
       
      &lock("$datapath"); 
      if(open(DATA,">$datapath")) 
      { 
          # $crypass=crypt($formdata{'passwd'},$CryKey); 
      $crypass=$formdata{'passwd'}; 
  if($newid eq "sysop") 
           { 
           	$right = "5|99"; 
           	$UsrRight = 5; 
           	$UsrGroup = 99; 
           } 
           else 
           { 
           	$right = "0|0"; 
           } 
      	   print DATA "$newid:$crypass:$right:$NickName:E\n"; 
      	   print DATA "$entertime:$ENV{'REMOTE_ADDR'}:$FORMDATA{'email'}:$FORMDATA{'site'}:E"; 
      	   close DATA; 
      	   &unlock("$datapath"); 
 
           my $infodatapath = $datapath.$DATA; 
           &lock("$infodatapath"); 
           if(open(DATA,">$infodatapath")) 
           { 
                 #Logtime:MsgNum:OnlineTime:Exp:Life:LastVitIP:LastVitTime:NowLogTime:Config1:E 
                 #Config2:Config3:Config4:Config5:Config6:Config7:Config8:Config9:Config10:Config11:E 
                 #Config12:Config13:Config14:Config15:Config16:Config17:Confit18:E 
                 #Nickname 
                 #ShowEmail:Email 
                 #Site\n 
                 print DATA "1:0:0:2:10000:$ENV{'REMOTE_ADDR'}:$entertime:$ENV{'REMOTE_ADDR'}:$entertime:0:E\n"; 
                 print DATA ":::::::::::::::E\n"; 
                 print DATA ":::::::::::::::E\n"; 
                 print DATA "$NickName\n"; 
                 print DATA "0:$FORMDATA{'email'}:0:E\n"; 
                 print DATA "\n\n\n\n\n\n"; 
                 close DATA; 
           } 
           &unlock("$infodatapath"); 
           &lock("$ChatUserListFile"); 
           if(open(DATA,">>$ChatUserListFile")) 
           { 
      	       print DATA "$newid:$NickName:$entertime:$ENV{'REMOTE_ADDR'}:0:0:E\n"; 
      	       close DATA; 
           } 
           &unlock("$ChatUserListFile"); 
           if($newid eq "sysop") 
           { 
                &lock($ChatRootUserFile); 
                if(open(ROOT,">>$ChatRootUserFile")) 
                { 
             	     print ROOT "sysop:99:$entertime:花无缺:$ENV{'REMOTE_ADDR'}:0:0:0:E\n"; 
             	     close ROOT; 
                } 
                &unlock($ChatRootUserFile); 
           } 
           return 0; 
      } 
      &unlock("$datapath"); 
      return 1; 
} 
1; #return true