#!/usr/bin/perl
###########################
#© 2003 CheRt[aka_GoDleSS]	#
###########################

use CGI qw(:all);
use strict;
use Fcntl qw(:flock);

my($i, $command, $name, $pass, $pass2, $ip, $mail, $err, @data, $stop_flag0, $sem);

$sem="chat.sem";

$command=$ENV{'QUERY_STRING'};

$name=param('name');
$pass=param('pass');
$pass2=param('pass2');
$mail=param('mail');

print header;

if ($command eq "" or $command eq "new") {
 &start();
} elsif ($command eq "create") {
 &check();
}

sub start {
print <<EOF;
<html>
<head>
<title>Чат || Создание нового аккаунта</title>
<style>
body {background-color: #e0e0e0;
margin: 40 40 40 40;
}
.new {font-family: verdana;
font-size: 11px;
}
a {font-family: verdana;
font-size: 11px;
color: #003377;
text-decoration: none;
}
a:hover {color: #3366ff;
text-decoration: none;
}
</style>
</head>
<body>
<form method="post" action="$ENV{'SCRIPT_NAME'}?create">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td colspan="2">
<font class="new">
Правила ввода:<br>
- почты: от 6 до 30 символов; арабские цифры, латинские буквы, '-', '_', '+', '=', '\@', '.';<br>
- имени: от 3 до 20 символов; арабские цифры, латинские буквы, '-', '_', '+', '=';<br>
- пароля: от 6 до 20 символов; арабские цифры, латинские буквы, '-', '_', '+', '=';<br>
<br><br>
</font>
</td>
</tr>

<tr>
<td>
<font class="new">
Электронная почта:
</font>
</td>
<td>
<input type="text" style="border: 1px solid #666666; font: 11px verdana; background-color: #fffff0" size="20" name="mail">
</td>
</tr>

<tr>
<td>
<font class="new">
*Имя пользователя:
</font>
</td>
<td>
<input type="text" style="border: 1px solid #666666; font: 11px verdana; background-color: #fffff0" size="20" name="name">
</td>
</tr>

<tr>
<td>
<font class="new">
*Пароль:
</font>
</td>
<td>
<input type="password" style="border: 1px solid #666666; font: 11px verdana; background-color: #fffff0" size="20" name="pass">
</td>
</tr>

<tr>
<td>
<font class="new">
*И еще раз пароль:
</font>
</td>
<td>
<input type="password" style="border: 1px solid #666666; font: 11px verdana; background-color: #fffff0" size="20" name="pass2">
</td>
</tr>

<tr>
<td colspan="2">
<br>
<input type="reset" value="Очистить" style="border: 1px solid #002255; font: 11px verdana; background: #e0e0e0;">
&nbsp;
<input type="submit" value="Создать" style="border: 1px solid #002255; font: 11px verdana; background: #e0e0e0;">
</td>
</tr>

</form>

<tr>
<td colspan="2">
<font class="new">
<br>Поля, помеченные '*' для заполнения обязательны!<br>
</font>
<font class="new" color="#b00000">
$err
</font>
</td>
</tr>
</table>
</body>
</html>
EOF
}

sub check {
$name=substr($name, 0, 20);
$pass=substr($pass, 0, 20);
$pass2=substr($pass2, 0, 20);
$mail=substr($mail, 0, 30);

for ($i=0; $i<20; $i++) {
 $name=~s/[^A-Za-z0-9\_\-\+\=]//;
 $pass=~s/[^A-Za-z0-9\_\-\+\=]//;
 $pass2=~s/[^A-Za-z0-9\_\-\+\=]//;
}

for ($i=0; $i<30; $i++) {
 $mail=~s/[^A-Za-z0-9\_\-\+\=\@\.]//;
}

if (length($name)>=3 and length($pass)>=6) {
 if ($pass eq $pass2) {
  open(BASE, "pep_base.cfg");
   @data=<BASE>;
  close(BASE);
 
  for ($i=0; $i<@data; $i++) {
   $_=$data[$i];
   if (m/^$name\:\-\:/) {
    $stop_flag0=1;
   }
  }

  if ($stop_flag0!=1) {
   $ip=remote_addr;
   &get_lock;
   open(BASE, ">>pep_base.cfg");
    if ($mail eq "") {
     $mail="none";
    }
    print BASE "$name:-:-:$pass:-:-:$mail:-:-:$ip:-:-:1:-:-:0\n";
   close(BASE);
   &release_lock;
   &ok;
  } else {
   $err="<br>Такой пользователь уже существует!";
   &start;
  }

 } else {
  $err="<br>Несоответствие между паролем и его повторением!";
  &start;
 }
} else {
 $err="<br>Ошибка правил ввода!";
 &start;
}

}

sub ok {
print <<EOF;
<html>
<head>
<title>Чат || Создание нового аккаунта</title>
<style>
body {background-color: #e0e0e0;
margin: 40 40 40 40;
}
.new {font-family: verdana;
font-size: 11px;
}
a {font-family: verdana;
font-size: 11px;
color: #003377;
text-decoration: none;
}
a:hover {color: #3366ff;
text-decoration: none;
}
</style>
</head>
<body>
<font class="new">Аккаунт зарегистрирован, ваше имя - $name, пароль - $pass, почта - $mail, адрес - $ip.</font><br>
<a href="chat.pl">Войти в чат</a>
</body>
</html>
EOF
}

sub get_lock {
open(SEM, ">$sem") || "Невозможно открыть семафор: $!";
 flock(SEM, LOCK_EX) || "Невозможно заблокировать семафор: $!"
}

sub release_lock {
close(SEM);
}