#!/usr/bin/perl

#Управление подпиской (администраторская часть)
# Created by PVDLab 
# URL:    http://pvdlab.net 
# E-Mail: serg@pvdlab.net 
# -------------------------------------------------------------------

use Fcntl ':flock'; # import LOCK_* constants

require "lib_const.pl";

print "Content-type: text/html\n\n";

# получение параметров
if ($ENV{'REQUEST_METHOD'} ne 'POST')
   { #если метод GET - спрашиваем имя и пароль, даже не читая параметры
     &enterform; exit;
   } 
else   
 {    getheader();
# read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'} );
#       @pairs = split(/&/, $buffer);
#       foreach $pair (@pairs)
#      { ($name, $value) = split(/=/, $pair);
#         $value =~tr/+/ /;
#         $value =~ tr/ / /;
#         
#         $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
#         $value =~ s/\x0D\x0A/\x0A/g;
#
#         $in{$name} = $value;
#        }
 }   

if ((!$buffer) or (!$in{'login'}) or (!$in{'pass'})) {&enterform; exit;}
if ($in{'login'} ne $login or $in{'pass'} ne $pass) {print "Неверный логин или пароль!";exit;}

&shtml; &mainmenu;
if ($in{'step'}==$viewsettings) {require "lib_200.pl"; &put_settings;}
  elsif ($in{'step'}==$savesettings) {require "lib_200.pl"; &save_settings;}
elsif ($in{'step'}==$viewconfirm_subs) {require "lib_300.pl"; &put_settings(1);}
  elsif ($in{'step'}==$saveconfirm_subs) {require "lib_300.pl"; &save_settings(1);}
elsif ($in{'step'}==$viewconfirm_unsubs) {require "lib_300.pl"; &put_settings(2);}
  elsif ($in{'step'}==$saveconfirm_unsubs) {require "lib_300.pl"; &save_settings(2);}
elsif ($in{'step'}==$viewform) {require "lib_500.pl"; &put_settings(1);}
  elsif ($in{'step'}==$saveform) {require "lib_500.pl"; &save_settings(1);}
elsif ($in{'step'}==$viewdiag) {require "lib_500.pl"; &put_settings(2);}
  elsif ($in{'step'}==$savediag) {require "lib_500.pl"; &save_settings(2);}
elsif ($in{'step'}==$viewbook) {require "lib_abook.pl"; &put_edit_form(""); &view_abook(0,"");}
  elsif ($in{'step'}==$refresh) {require "lib_abook.pl"; &put_edit_form(""); &view_abook(0,$in{'filter'});}
  elsif ($in{'step'}==$nextpage) {require "lib_abook.pl"; &put_edit_form(""); &view_abook($in{'skip'},$in{'filter'});}
  elsif ($in{'step'}==$addnew) {require "lib_abook.pl"; &add_to_book; &view_abook($in{'skip'},$in{'filter'});}
  elsif ($in{'step'}==$editrecord) {require "lib_abook.pl"; &save_changes; &view_abook($in{'skip'},$in{'filter'});}
  elsif ($in{'step'}==$deleterecord) {require "lib_abook.pl"; &delete_from_book; &view_abook($in{'skip'},$in{'filter'});}
  
elsif ($in{'step'}==$viewhelp) { &put_help;}
elsif ($in{'step'}==$inputletter) { require "lib_mail.pl"; &input_letters;}
   elsif ($in{'step'}==$sendletter) { require "lib_mail.pl"; &send_letters;}

&ehtml;


sub mainmenu {
print qq(
$scripts
<table width="600" border="0" cellspacing="0" cellpadding="0" bgcolor=black ><tr><td>
<table width="600" border="0" cellspacing="1" cellpadding="1">
<tr><th bgcolor=#F7E09A align=center><font size="-1" face="Verdana, Arial"><b>Главное меню</b><br></th></tr>
<tr><td bgcolor=#F9F1D7 align=justify><font size="-1" face="Verdana, Arial">
<table celspacing=0 cellpadding=0><tr>
<td><INPUT TYPE="button" VALUE="Настройки" onClick="presubmit($viewsettings)" $buttonstyle></td>
<td><INPUT TYPE="button" VALUE="Подтв. подписки" onClick="presubmit($viewconfirm_subs)" $buttonstyle></td>
<td><INPUT TYPE="button" VALUE="HTML-код формы" onClick="presubmit($viewform)" $buttonstyle></td>
<td><INPUT TYPE="button" VALUE="Подписчики" onClick="presubmit($viewbook)" $buttonstyle></td>
</tr>
<tr>
<td><INPUT TYPE="button" VALUE="HELP!!!" onClick="presubmit($viewhelp)" $buttonstyle></td>
<td><INPUT TYPE="button" VALUE="Подтв. отказа" onClick="presubmit($viewconfirm_unsubs)" $buttonstyle></td>
<td><INPUT TYPE="button" VALUE="Диагностика" onClick="presubmit($viewdiag)" $buttonstyle></td>
<td><INPUT TYPE="button" VALUE="Рассылка" onClick="presubmit($inputletter)" $buttonstyle></td>
</tr></table></font>
</td></tr></table></td></tr></table><br>

);
&put_help if ($in{'step'}==1);
}

sub put_message {
my $msg=shift;
print qq(
<table width="600" border="0" cellspacing="0" cellpadding="0" bgcolor=black><tr><td>
<table width="600" border="0" cellspacing="1" cellpadding="1">
<tr><th bgcolor=#F7E09A align=center><font size="-1" face="Verdana, Arial"><b>$msg</b></font></th></tr></table></td></tr></table>
);
}

sub put_help {
print qq(
<table width="600" border="0" cellspacing="0" cellpadding="0" bgcolor=black><tr><td>
<table width="600" border="0" cellspacing="1" cellpadding="1">
<tr><th bgcolor=#F7E09A align=center><font size="-1" face="Verdana, Arial"><b>Добро пожаловать в систему рассылки!</b><br></th></tr>
<tr><td bgcolor=#F9F1D7 align=justify><font size="-1" face="Verdana, Arial">
Перед Вами главное меню системы.<br><br>
&nbsp;&nbsp;&nbsp;Раздел <b>"Настройки"</b> предназначена для ввода общих настроек системы - имени и E-Mail администратора системы (эти данные будут подставляться в поле "From" при рассылке писем подписчикам).
Также там задаются путь к программе sendmail и параметры для работы со списком подписчиков.<br>
&nbsp;&nbsp;&nbsp;В разделах <b>"Подтверждение подписки"</b> и <b>"Подтверждение отказа"</b> задается текст писем (в форматах txt и html), которые
будут отправляться клиенту в качестве подтверждения подписки или отказа от нее.<br>
&nbsp;&nbsp;&nbsp;В разделе <b>"HTML-код формы"</b> Вы можете взять готовый код формы и вставить его через clipboard
к себе на страницу. <br>
&nbsp;&nbsp;&nbsp;Раздел <b>"Диагностика"</b> предназначен для задания внешнего вида страницы, которая будет показана клиенту
после совершения подписки или отказа от нее.<br>
&nbsp;&nbsp;&nbsp;Раздел <b>"Подписчики"</b> позволяет просмотреть и при надобности отредактировать список подписчиков.
<br>
&nbsp;&nbsp;&nbsp;И наконец, раздел <b>"Рассылка"</b> предназначен для отправки писем подписчикам.<br><br>
&nbsp;&nbsp;&nbsp;Вопросы по настройкам и функционированию системы можно задавать на форуме <a href="http://pvdlab.net/cgi-bin/zamor/index.pl" target=_new>Заморочки ONLINE</a>, либо по 
адресу <a href="mailto:serg\@pvdlab.net">serg\@pvdlab.net</a>  
</td></tr>
</table></td></tr></table>
);
}

sub enterform {
&shtml;
print "
<br><br><br><br><br>
<p align=center><font color=#800000>Введите логин и пароль для входа.</font></p>
<table width=400 border=0 cellspacing=4 cellpading=4 align=center>
<tr><td width=100 align=right>Логин</td><td width=300><input type=text name=login size=30></td></tr>
<tr><td width=100 align=right>Пароль</td><td width=300><input type=password name=pass size=30></td></tr>
<tr><td colspan=2 width=400 align=right>$submit</td></tr>
</table>

";
&ehtml;
}


sub shtml {
print qq(
<html>
<head>
<title>PVD Mail \&copy;PVDLab, 2000</title>
</head>
<style type=\"text/css\">
<!--
.ta {
font-family: MS Sans Serif;
width: 595px;
}
.sml {font-family:Verdana, Arial; font-size:8pt;}
<!--VirtualAvenueBanner-->
-->
</style>

<body leftmargin=10 topmargin=10 bgcolor=\"#FFFFEE\">
<a name=toform></a>
);
print "<layer name=nsdiv top=118 width=600 left=10>\&nbsp;</layer>" unless ($ENV{'HTTP_USER_AGENT'} =~ /MSIE/i);
print qq(
<form name=mainform method=post enctype="multipart/form-data">
);
print "<input type=hidden name=step";
if (!$in{'step'}) {$in{'step'}=1;}
print " value=\"$in{'step'}\"";
print "><input type=hidden name=login";
print " value=\"$in{'login'}\"" unless (!$in{'login'});
print "><input type=hidden name=pass";
print " value=\"$in{'pass'}\"" unless (!$in{'pass'});
print ">\n";
}

sub ehtml {
print "
</form>
</body>
</html>
";
}






#Обработка заголовка, посылаемого броузером
# Если есть файлы для uploada, то
# $in{name}=имя файла (без пути)
#  $in{srcname}=содержимое файла
#  $in{ctname}=MIME-тип файла (Content-type)

sub getheader {
if ($ENV{'CONTENT_TYPE'} =~ m#^multipart/form-data#) {
    if ($ENV{'REQUEST_METHOD'} ne 'POST') {
        print "Invalid request method for multipart/form-data\n"; exit;
    }
    $maxstep=int($ENV{'CONTENT_LENGTH'});
    binmode(STDIN); seek(STDIN,0,0); $lenbuf=0;
    while(1) {
        $buffer1=""; read(STDIN,$buffer1,8192);
        $lenbuf=$lenbuf+length($buffer1); $buffer="$buffer$buffer1";
        if ($lenbuf>=$maxstep) {goto("nextbuf");}
    }
    nextbuf:
    ($boundary) = $ENV{'CONTENT_TYPE'} =~ /boundary="([^"]+)"/; #";   # find boundary
    ($boundary) = $ENV{'CONTENT_TYPE'} =~ /boundary=(\S+)/ unless $boundary;
    $temp="--$boundary--\x0D\x0A";$boundary =  "--" . $boundary . "\x0D\x0A";
    $buffer=substr($buffer,0,index($buffer,$temp));
    @pairs=split(/$boundary/, $buffer); $lenpairs=@pairs;
    for ($i=1;$i<$lenpairs;$i++) {
        $pairs[$i]= substr($pairs[$i], 0, length($pairs[$i])-2);
        $pozition=index($pairs[$i],"\r\n\r\n");
        $header= substr($pairs[$i], 0, $pozition);
          ($cd) = grep (/^\s*Content-Disposition:/i, $header);
          ($name) = $cd =~ /\bname="([^"]+)"/i;
          ($name) = $cd =~ /\bname=([^\s:;]+)/i unless defined $name;
          ($fname) = $cd =~ /\bfilename="([^"]*)"/i;
          ($fname) = $cd =~ /\bfilename=([^\s:;]+)/i unless defined $fname;
          $fname=substr($fname,rindex($fname,"\\")+1);
          $value= substr($pairs[$i], $pozition+4);
        if ($fname or $header =~ /Content-Type:/i) {
          if ($header =~ /Content-Type:\s+([\w, \-, \\, \/]+)/i and $fname) {
                  $fname=~ s/([\w-]+ \.)//i; #только имя,путь выкидывается
		  $in{$name}=$fname;
                  $in{"src$name"}=$value;
                  $in{"ct$name"}=$1;          
          } else {$in{$name}=""}
        } else {$value =~ s/\x0D\x0A/\x0A/g;$in{$name}=$value}
    }
}
else {
    read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
    if (!$buffer) {$buffer=$ENV{'QUERY_STRING'};}
    @pairs = split(/&/, $buffer);
    foreach $pair (@pairs) {
       ($name, $value) = split(/=/, $pair);$value =~ tr/+/ /;
       $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
       $value =~ s/\x0D\x0A/\x0A/g;
       $in{$name} = $value;}
}
$autor="\x43\x6F\x70\x79\x72\x69\x67\x68\x74\x20\x26\x63\x6F\x70\x79\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x6D\x61\x69\x6C\x74\x6F\x3A\x70\x76\x64\x65\x6E\x69\x73\x40\x75\x73\x61\x2E\x6E\x65\x74\x22\x3E\x44\x65\x6E\x69\x73\x20\x50\x6F\x7A\x6E\x79\x61\x6B\x6F\x76\x3C\x2F\x61\x3E";
}
