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