#!/usr/pkg/bin/perl ###################################################################### # Follow Up Mailing List Processor # # Version 4.20 # # Copyright 2005 Silihost Kft, SellWide Corporation # # Last modified 07/20/2005 # # Authors: Konstantin Ursaloff and Vadim Rachkowan # # Available at http://www.sellwide.com # ###################################################################### # COPYRIGHT NOTICE # # # # Copyright 2005 Silihost Kft. Minden jog fenntartva. # # # # This script can be used as long as you don't change this header # # or any of the parts that give me credit for writing this. # # # # By using this script you agree to indemnify me from any liability # # that might arise from its use. # # # # Redistributing\selling the code for this program without prior # # written consent is expressly forbidden. # # # # Use for any unauthorized purpose is expressly prohibited by law, # # and may result in severe civil and criminal penalties. # # Violators will be prosecuted to the maximum extent possible. # # # # YOU MAY NOT RESELL OR RELEASE THIS PROGRAM TO OTHERS # # # ###################################################################### use lib('lib'); require 'conf.cgi'; ### %CONF=(); %PAR=();%ACCOUNT=(); ### &par_prepare; &db_prepare; unless(keys %LNG){ &printheader; print $q->start_html("Error"); print $q->h1("Language keys was not loaded"); print $q->p("Can not find file shabl/$CONF{langnow}.txt"); print $q->end_html; exit; } $dparser::lang=\%LNG; #map{$LNG{$_}="|$LNG{$_}|"}keys %LNG; local %ACT= ( "" =>\&print_frameset, account =>\&print_account, lngset =>\&print_set_leng, mainbody =>\&print_main, 'stat'=> =>\&print_stat, settings =>\&print_settings, getfile =>\&print_getfile, delfile =>\&print_delfile, doimess =>\&print_doimess, subscrmess=>\&print_subsmess, unsubscrmess=>\&print_unsubsmess, showmess=>\&print_show_mess, showrfcmess=>\&print_show_rfc_mess ); local @ACCOUNTMENU=( {name=>$LNG{ACCOUNTMENU_MAIN}, params=>{act2=>""}}, {name=>$LNG{ACCOUNTMENU_OPTIONS},params=>{act2=>"config"}, description=>$LNG{ACCOUNTMENU_OPTIONS_DESCR}}, {name=>$LNG{ACCOUNTMENU_HTML_FORM}, params=>{act2=>"columns"}, description=>$LNG{ACCOUNTMENU_HTML_FORM_DESCR}}, {name=>$LNG{ACCOUNTMENU_SUBSCR_MAN}, params=>{act2=>"users"}, description=>$LNG{ACCOUNTMENU_SUBSCR_MAN_DESCR}}, {name=>$LNG{ACCOUNTMENU_EDIT_MESS}, params=>{act2=>"mess"}, description=>$LNG{ACCOUNTMENU_EDIT_MESS_DESCR}}, {name=>$LNG{ACCOUNTMENU_LINKS}, params=>{act2=>"links"}, description=>$LNG{ACCOUNTMENU_LINKS_DESCR}, nextlevel=>[ { name=>$LNG{ACCOUNTMENU_LINKS}, params=>{modelog=>""}, description=>'', add_params=>[qw(datefilter)] }, { name=>$LNG{ACCOUNTMENU_LINKS_MESS_STAT}, params=>{modelog=>"mess"}, description=>'', add_params=>[qw(datefilter)] }, { name=>$LNG{ACCOUNTMENU_LINKS_ACT_PROSP}, params=>{modelog=>"prospects"}, description=>'', add_params=>[qw(datefilter)], }, { name=>$LNG{ACCOUNTMENU_LINKS_CLICKS}, params=>{modelog=>"clicks"}, description=>'', add_params=>[qw(datefilter)], }, ] } ); local @SETTINGSMENU=( {name=>$LNG{SETTINGSMENU_MAIN}, params=>{act2=>""}}, {name=>$LNG{SETTINGSMENU_PERSONAL},params=>{act2=>"personal"}, description=>$LNG{SETTINGSMENU_PERSONAL_DESCR}}, {name=>$LNG{SETTINGSMENU_SENDING_OPTIONS}, params=>{act2=>"smtp"}, description=>$LNG{SETTINGSMENU_SENDING_OPTIONS_DESCR}}, {name=>$LNG{SETTINGSMENU_ACCESS}, params=>{act2=>"pass"}, description=>$LNG{SETTINGSMENU_ACCESS_DESCR}}, {name=>$LNG{SETTINGSMENU_TIME_SYNC}, params=>{act2=>"timecorr"}, description=>$LNG{SETTINGSMENU_TIME_SYNC_DESCR}}, {name=>$LNG{SETTINGSMENU_PERFOM}, params=>{act2=>"test"}, description=>$LNG{SETTINGSMENU_PERFOM_DESCR}}, {name=>$LNG{SETTINGSMENU_BACUP_RESTORE}, params=>{act2=>"backup"}, description=>$LNG{SETTINGSMENU_BACUP_RESTORE_DESCR}} ); local @STATMENU=( {name=>$LNG{STATMENU_MAIN}, params=>{act2=>""}}, {name=>$LNG{STATMENU_ACT_LOGS}, params=>{act2=>"log"}, description=>$LNG{STATMENU_ACT_LOGS_DESCR}}, {name=>$LNG{STATMENU_CURRENT_BROADCAST}, params=>{act2=>"curlog"}, description=>$LNG{STATMENU_CURRENT_BROADCAST_DESCR}}, {name=>$LNG{STATMENU_TOTALS}, params=>{act2=>"total"}, description=>$LNG{STATMENU_TOTALS_DESCR}, nextlevel=>[ { name=>$LNG{STATMENU_TOTALS_SENT_MESS}, params=>{modelog=>""}, description=>'', add_params=>[qw(day1 day2 month1 month2 year1 year2)] }, { name=>$LNG{STATMENU_TOTALS_SUBSCRIBERS}, params=>{modelog=>"subscribers"}, description=>'', add_params=>[qw(day1 day2 month1 month2 year1 year2)] }, { name=>$LNG{STATMENU_TOTALS_PROSPECTS}, params=>{modelog=>"account"}, description=>'', add_params=>[qw(day1 day2 month1 month2 year1 year2)], }, ] }, ); my $address=$ENV{HTTP_HOST}; my $scriptdir=$ENV{SCRIPT_NAME}; (my $src=$scriptdir)=~s#[^/]*$##; save_config(0,"serverurl","http://$address${src}"); &sessiya; &process_all; ################## sub add_menu_prospects{ my $page_ref=shift; my $menu; $menu=< $LNG{PROSPMENU_ADD_PROSP} $LNG{PROSPMENU_IMPORT} $LNG{PROSPMENU_EXPORT} $LNG{PROSPMENU_COPY} $LNG{PROSPMENU_BULK_REMOVE} ALL__ $page_ref->add_regesp('{prospects_menu}',$menu); } ################## sub process_all{ if ($ACT{$PAR{act}}){ my $sub_ref=$ACT{$PAR{act}}; &$sub_ref if $sub_ref; }else{ printheader(); print $q->start_html($LNG{ERROR}); print $q->h1($LNG{ERROR_NOT_CHANGE_URL}); print $q->end_html; exit; } } ################### sub get_account_menu{ my $ref_menu=shift; my @MENU=@{$ref_menu}; my $out; $out=$q->start_table({-border=>0,-align=>"center",width=>"100%"}).""; my $count=@MENU; my $width=100/$count."%" if $count; my $menu; my $acct=""; $acct='&account='.$PAR{account} if $PAR{account}; my @menu=map{$q->td({-align=>center, -width=>$width}, $q->a({-href=>"$SCRIPT_NAME?act=$PAR{act}&act2=".$_->{params}{act2}."&ses=$PAR{ses}".$acct, -target=>'_self', -class=>($PAR{act2} eq $_->{params}{act2}) ? 'menuACT' : 'menu'},"$_->{name}") ) }@MENU; $out.=join "\n", @menu; $out.="".$q->end_table() ; return $out; } ######################################## sub get_full_menu{ my $ref_menu=shift; my @MENU=@{$ref_menu}; my $out; $out=< ALL__ my $acct=""; $acct='&account='.$PAR{account} if $PAR{account}; foreach(@MENU){ next unless ($_->{description}); my $href=$q->a({-href=>"$SCRIPT_NAME?act=$PAR{act}&act2=".$_->{params}{act2}."&ses=$PAR{ses}".$acct,-target=>'_self'},"$LNG{MENU_GO}"); $out.=< $href $_->{name}: $_->{description} ALL__ } $out.=$q->end_table() ; return $out; } ################## sub get_full_url{ my $pars=shift; my %pars=%$pars; my $qq = new CGI; foreach (keys %pars){ $qq->param($_,$pars{$_}) } #-path_info=>1 #-query=>1 return $qq->url(-absolute=>1,-query=>1); } #################### #begin mapping functions #################### #SETTINGS sub print_settings_main{ my $page = new hfparser( DATA=>$settings_shabl ); $page->SplitData("#begin#main","#end#main"); $page->deleteBEFORE_AFTER(); $page->add_regesp('{main_menu_body}',get_full_menu(\@SETTINGSMENU)); $page->ParseData; return $page->as_string; } ################### sub print_settings_personal{ my $page = new hfparser( DATA=>$settings_shabl ); if ($PAR{issubmit}){ $page->set_error("adminname",$LNG{ERROR_YOUR_NAME_REQUIRED}) unless $PAR{adminname}; if ($PAR{adminemail}){ $page->set_error("adminemail",$LNG{ERROR_EMAIL_INCORRECT}) unless checkemail($PAR{adminemail}); }else{ $page->set_error("adminemail",$LNG{ERROR_EMAIL_REQUIRED}); } } if ($PAR{issubmit} && !$page->is_error){ save_config(0,"adminname",$PAR{adminname}); save_config(0,"adminemail",$PAR{adminemail}); save_config(0,"statbyemail",$PAR{statbyemail}); $page->add_regesp('{error}',"

$LNG{MESS_SETTINGS_UPDATED}

"); } $page->set_def("statbyemail",$CONF{statbyemail}); $page->set_def("adminname",$CONF{adminname}); $page->set_def("adminemail",$CONF{adminemail}); $page->SplitData("#begin#personal","#end#personal"); $page->deleteBEFORE_AFTER(); $page->ParseData; return $page->as_string; } ########################### sub print_settings_smtp{ my $page = new hfparser( DATA=>$settings_shabl ); my @settings=qw(sendmail modsend smtp COUNT_PROC OLD_ALGORITHM_PROC smtpauth smtpusername smtppassword errorsto smtpuseadminemail smtpfromemail returnpath issendmailf sendmailaddress ); if ($PAR{issubmit}){ if ($PAR{modsend} eq ""){ $page->set_error("modsend",$LNG{ERROR_NOT_SELECTED}) }else{ if ($PAR{modsend} eq 'sendmail'){ unless ($PAR{sendmail}){ $page->set_error("sendmail",$LNG{ERROR_REQUIRED_SENDMAIL}) }else{ if($PAR{sendmail}=~/[ ><;&]/){ $page->set_error("sendmail",$LNG{ERROR_INCORRECT_SENDMAIL_PATH}) }elsif(! -f $PAR{sendmail}){ $page->set_error("sendmail",$LNG{ERROR_INCORRECT_SENDMAIL_NOT_EXISTS}) } unless($page->is_error){ if(length($PAR{errorsto})){ $page->set_error("errorsto",$LNG{ERROR_EMAIL_INCORRECT}) unless (checkemail($PAR{errorsto})); } if(length($PAR{returnpath})){ $page->set_error("returnpath",$LNG{ERROR_EMAIL_INCORRECT}) unless (checkemail($PAR{returnpath})); } if(length($PAR{issendmailf})){ $page->set_error("sendmailaddress",$LNG{ERROR_EMAIL_INCORRECT}) unless (checkemail($PAR{sendmailaddress})); } } } }elsif($PAR{modsend} eq 'SMTP'){ $page->set_error("smtp",$LNG{ERROR_REQUIRED_SMTP}) unless $PAR{smtp}; if($PAR{smtpauth}){ $page->set_error("smtpusername",$LNG{ERROR_REQUIRED}) unless length($PAR{smtpusername}); $page->set_error("smtppassword",$LNG{ERROR_REQUIRED}) unless length($PAR{smtppassword}); } if($PAR{smtpuseadminemail}){ $page->set_error("smtpfromemail",$LNG{ERROR_EMAIL_INCORRECT}) unless (checkemail($PAR{smtpfromemail})); } } } } if ($PAR{issubmit} && !$page->is_error){ map{save_config(0,$_,$PAR{$_})}@settings; $page->add_regesp('{error}',"

$LNG{MESS_SETTINGS_UPDATED}

"); } if($CONF{modsend} eq 'SMTP'){ $page->Hide(''); }else{ $page->Hide(''); } map{$page->add_element("COUNT_PROC",$_)}(1..10); $page->add_element("modsend","","--select--"); $page->add_element("modsend","sendmail"); $page->add_element("modsend","SMTP"); map{$page->set_def("$_",$CONF{$_})}@settings; $page->set_def("sendmailaddress",$CONF{adminemail}) unless length($CONF{sendmailaddress}); $page->set_def("smtpfromemail",$CONF{adminemail}) unless length($CONF{smtpfromemail}); $page->SplitData("#begin#smtp","#end#smtp"); $page->deleteBEFORE_AFTER(); $page->ParseData; return $page->as_string; } ################# sub print_settings_timecorr{ my $page = new hfparser( DATA=>$settings_shabl ); if ($PAR{issubmit}){ if ($PAR{timecorr} ne ""){ unless ($PAR{timecorr}=~m#^(\+|-)\d\d:\d\d$#){ $page->set_error("timecorr",$LNG{ERROR_INCORRECT_FORMAT}); } } } if ($PAR{issubmit} && !$page->is_error){ save_config(0,"timecorr",$PAR{timecorr}); $page->add_regesp('{error}',"

$LNG{MESS_SETTINGS_UPDATED}

"); $CONF{timecorr}=$PAR{timecorr}; $MY_TIME=time+TimeToSec($CONF{timecorr}); $NOW=GetNow($PAR{timecorr}); $db->do("UPDATE ${PREF}ses SET date=$NOW WHERE ran=?", undef, $PAR{ses}); } $page->add_regesp('{time}',scalar(localtime())); $page->add_regesp('{mytime}',scalar(localtime($MY_TIME))); $page->set_def("timecorr",$CONF{timecorr}); $page->SplitData("#begin#time","#end#time"); $page->deleteBEFORE_AFTER(); $page->ParseData; return $page->as_string; } ######################## sub print_settings_pass{ my $page = new hfparser( DATA=>$settings_shabl ); if ($PAR{issubmit}){ $page->set_error("oldpass",$LNG{ERROR_INCORRECT}) if ($PAR{oldpass} ne $CONF{adminpwd}); if ($PAR{newpass1} && $PAR{newpass2}){ $page->set_error("newpass1",$LNG{ERROR_NOT_EQUAL}) if ($PAR{newpass1} ne $PAR{newpass2}); $page->set_error("newpass2",$LNG{ERROR_NOT_EQUAL}) if ($PAR{newpass1} ne $PAR{newpass2}); }else{ $page->set_error("newpass1",$LNG{ERROR_REQUIRED}) unless $PAR{newpass1}; $page->set_error("newpass2",$LNG{ERROR_REQUIRED}) unless $PAR{newpass2}; } } if ($PAR{issubmit} && !$page->is_error){ #save_config(0,"adminpwd",$PAR{newpass1}); $page->add_regesp('{error}',"

$LNG{MESS_SETTINGS_UPDATED}

"."$LNG{MESS_LOGOUT_TO_CHECK}"); } $page->SplitData("#begin#pass","#end#pass"); $page->deleteBEFORE_AFTER(); $page->ParseData; return $page->as_string; } #############Backup sub get_dir_size{ my $dir=shift; my $dirsize=0; if (-d "$dir"){ my @files; opendir(DIR,$dir) || die $LNG{ERROR_CANT_OPEN_DIR}; while (my $file=readdir(DIR)){ next if ($file=~/^\.+$/); push (@files,$file); } closedir(DIR); foreach my $file(@files){ if(-d "$dir/$file"){ $dirsize += get_dir_size("$dir/$file"); }else{ $dirsize += (stat("$dir/$file"))[7]; } } }elsif(-f $dir){ return (stat("$dir"))[7]; } return $dirsize; } ################### sub remove_dir{ my $dir=shift; if (-d "$dir"){ opendir(DIR,$dir) || die $LNG{ERROR_CANT_OPEN_DIR}; my @files; while (my $file=readdir(DIR)){ next if ($file=~/^\.+$/); push (@files,$file); } closedir(DIR); foreach my $file(@files){ if(-d "$dir/$file"){ remove_dir("$dir/$file"); }else{ unlink("$dir/$file") || die "$LNG{ERROR_CANT_UNLINK_FILE} $dir/$file"; } } } rmdir($dir); } sub create_backup{ my $name=shift; unless (-d $glbackupdir){ mkdir($glbackupdir,0777) || die "${ERROR_CANT_CREATE_DIR} $glbackupdir : $!"; } my @tables=map{"${PREF}$_"}@backup_tables; return if ($name=~/[^a-zA-Z0-9_-]/); my $dirstore="$glbackupdir/$name"; remove_dir($dirstore) if (-d $dirstore); mkdir($dirstore,0777) || die "${ERROR_CANT_CREATE_DIR} $dirstore : $!"; my $path; if($ENV{PATH_TRANSLATED}){ $path="$ENV{PATH_TRANSLATED}"; }elsif($ENV{SCRIPT_FILENAME}){ $path="$ENV{SCRIPT_FILENAME}"; } my $delm; $delm='/' if $path=~/\//; $delm='\\' if $path=~/\\/; my @path=split(/\/|\\/,$path); $path=join($delm, @path[0..@path-2]); foreach $table(@tables){ my $filename="$path${delm}$glbackupdir${delm}$name${delm}$table.dmp"; open (FILE,">$filename") || die "$LNG{ERROR_CANT_OPEN_FILE} $filename $LNG{ERROR_CANT_WRITE}"; my $sql="SHOW fields FROM $table"; my $out=$db->prepare($sql); $out->execute(); my @cols; while (my @output=@{$out->fetchrow_arrayref}){ push (@cols,$output[0]); } print FILE join("\t",@cols)."\n"; my $sql="SELECT * from $table"; my $out=$db->prepare($sql); $out->execute(); while (my %output=%{$out->fetchrow_hashref}){ @output=map{$db->quote($output{$_})}@cols; #map{s/\t/\\t/g}@output; print FILE join(", ",@output)."\n"; } close(FILE); } unless ($^O=~/win/i){ #Linux chdir($glbackupdir); `tar -cf $name.tar $name`; `gzip $name.tar`; chdir(".."); remove_dir("$glbackupdir/$name"); }else{ } } sub LoadTableFromFile{ my($table,$file)=@_; unless(open (FILE,$file)){ die ("$LNG{ERROR_CANT_OPEN_FILE} : $! "); return; } $db->do("DELETE FROM $table"); unless($file=~/attach/){ # local $/="\n"; my $cols=; chomp($cols); my @cols=split(/\t/,$cols); $cols=join(", ",@cols); while (){ chomp; $sql="INSERT INTO $table ($cols) VALUES ($_)"; $db->do($sql); } }else{ binmode(FILE); my $buff,$data; while (read(FILE,$buff,8*2**10)){ $data.=$buff; } my @lines=split(/\n/,$data); $data=""; $buff=""; my @cols=split(/\t/,shift(@lines)); foreach(@lines){ $sql="INSERT INTO $table ($cols) VALUES ($_)"; $db->do($sql); } } close(FILE); } sub print_settings_backup{ my $page = new hfparser( DATA=>$settings_shabl, ERROR_AFTER_INPUT=>0 ); my @tables=map{"${PREF}$_"}@backup_tables; if ($PAR{issubmit}=1){ if ($PAR{backup}){ if($PAR{filename}=~/[^a-zA-Z0-9_-]/){ $page->set_error('filename', $LNG{ERROR_FILENAME_INCORRECT}); } if(length($PAR{filename})<4){ $page->set_error('filename', $LNG{ERROR_SHORTER_THEN_3}); } unless ($page->is_error()){ create_backup($PAR{filename}); } } if ($PAR{'unlink'}){ my @files=$q->param("unlinkcheck"); foreach my $file(@files){ next if($file=~/[^a-zA-Z0-9_-]/); my $filename="$glbackupdir/$file"; remove_dir($filename) if (-d $filename); unless ($^O=~/win/i){ $filename=$filename.'.tar.gz'; unlink($filename) || die ("$LNG{ERROR_CANT_UNLINK_FILE} $filename $!"); } } } if ($PAR{'restore'}){ if($PAR{rest}){ chdir($glbackupdir); my $backup=$PAR{rest}; unless($^O=~/win/i){ `gunzip < $backup.tar.gz | tar xvf -` if (-f "$backup.tar.gz"); unless (-d $backup){ $page->set_error('none',"Files was not unpacked from $backup.tar.gz"); } } foreach my $table(@tables){ $page->set_error($table, "The file $table.dmp is not exist on backup directory $backup probably table prefix was changed.") unless (-f "$backup/$table.dmp"); } unless ($page->is_error()){ $page->add_regesp("{error}",qq{

Database was restored from backup - $backup

}); my $path; if($ENV{PATH_TRANSLATED}){ $path="$ENV{PATH_TRANSLATED}"; }elsif($ENV{SCRIPT_FILENAME}){ $path="$ENV{SCRIPT_FILENAME}"; } my $delm; $delm='/' if $path=~/\//; $delm='\\' if $path=~/\\/; my @path=split(/\/|\\/,$path); $path=join($delm, @path[0..@path-2]); #my $path=$ENV{SCRIPT_FILENAME}; #my @path=split(/\//,$path); #$path=join("\/", @path[0..@path-2]); foreach $table(@tables){ my $filename="$path${delm}$glbackupdir${delm}$backup${delm}$table.dmp"; LoadTableFromFile($table,$filename); } #save_config(0,"adminpwd",$CONF{adminpwd}); unless ($^O=~/win/i){ remove_dir("$backup"); } } chdir('..'); } } } opendir(DIR,$glbackupdir); my @backups; while(my $file=readdir(DIR)){ next if ($file=~/^\.+$/); unless ($^O=~/win/i){ if ($file=~/(.*)\.tar\.gz/){ push(@backups,$1); } }else{ if (-d "$glbackupdir/$file"){ push(@backups,$file); } } } my $BACKUP=""; foreach my $name(@backups){ my $filename="$glbackupdir/$name"; $filename=$filename.'.tar.gz' unless ($^O=~/win/i); my($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, $atime,$mtime,$ctime,$blksize,$blocks)= stat $filename; my $time=localtime($ctime); if ($^O=~/win/i){ $size=get_dir_size("$glbackupdir/$name"); } $BACKUP.=< $name $time $size ALL__ } $page->add_regesp('{BACKUP}',$BACKUP); $page->SplitData("#begin#backup","#end#backup"); $page->deleteBEFORE_AFTER(); unless($BACKUP){ $page->SplitData("",""); $page->replaceINSIDE(""); } #$page->add_regesp("{mess_hour}",sprintf("%4d",$PAR{messcount}/$sec*60*60)); $page->ParseData; return $page->as_string; } #############Backup ################ sub print_settings_test{ my $page = new hfparser( DATA=>$settings_shabl ); $page->add_regesp("{conf_mail}",$CONF{modsend}); if ($PAR{issubmit}){ unless($PAR{emailtest}){ $page->set_error("emailtest",$LNG{ERROR_REQUIRED}); }else{ unless(checkemail($PAR{emailtest})){ $page->set_error("emailtest",$LNG{ERROR_EMAIL_INCORRECT}); } } unless($PAR{messcount}){ $page->set_error("messcount",$LNG{ERROR_REQUIRED}); }else{ if ($PAR{messcount}=~/[^0-9]/){ $page->set_error("messcount","digits only"); }elsif($PAR{messcount}>300){ $page->set_error("messcount","300 is maximum"); }elsif($PAR{messcount}<30){ $page->set_error("messcount","30 is minimum"); } } } if ($PAR{issubmit} && !$page->is_error()){ my $starttime=time(); my $DATA=<"$CONF{adminname} <$CONF{adminemail}>", To =>" <$PAR{emailtest}>", Subject =>"Performance test message", Data =>$DATA; foreach(1..$PAR{messcount}){ MIMEsendto($PAR{emailtest},$msg); } my $endtime=time(); my $sec=$endtime-$starttime; $sec=1 unless $sec; $page->SplitData("#begin#testresult","#end#testresult"); $page->deleteBEFORE_AFTER(); $page->add_regesp("{messcount}",$PAR{messcount}); $page->add_regesp("{emailtest}",$PAR{emailtest}); $page->add_regesp("{seconds}",$sec); $page->add_regesp("{mess_sec}",sprintf("%4d",$PAR{messcount}/$sec)); $page->add_regesp("{mess_min}",sprintf("%4d",$PAR{messcount}/$sec*60)); $page->add_regesp("{mess_hour}",sprintf("%4d",$PAR{messcount}/$sec*60*60)); $page->ParseData; return $page->as_string; }else{ $page->SplitData("#begin#test","#end#test"); $page->deleteBEFORE_AFTER(); $page->set_def("emailtest",$CONF{adminemail}); $page->set_input("messcount",{size=>3,maxlength=>3}); $page->set_def("messcount",50); $page->ParseData; return $page->as_string; } } ################ sub print_settings_log{ my $page = new hfparser( DATA=>$settings_shabl ); $page->SplitData("#begin#log","#end#log"); $page->deleteBEFORE_AFTER(); if ($PAR{issubmit}){ save_config(0,"enablelog",$PAR{enablelog}); if($PAR{cleanall}){ $db->do("DELETE FROM ${PREF}log"); &Error; } if($PAR{cleandate}){ my $WHERE="WHERE date BETWEEN ".$db->quote("$PAR{year1}-$PAR{month1}-$PAR{day1}")." AND DATE_ADD(".$db->quote("$PAR{year2}-$PAR{month2}-$PAR{day2}").", INTERVAL 1 DAY)"; $db->do("DELETE FROM ${PREF}log $WHERE"); &Error; } } #DATE my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =localtime($MY_TIME); $year+=1900;$mon++; foreach (1..31){ my $dd=sprintf("%02d",$_); $page->add_element("day1",$_,$dd); $page->add_element("day2",$_,$dd) } $page->set_def("day1",$mday); $page->set_def("day2",$mday); my @month=($LNG{MONTH_1},$LNG{MONTH_2},$LNG{MONTH_3},$LNG{MONTH_4},$LNG{MONTH_5},$LNG{MONTH_6},$LNG{MONTH_7},$LNG{MONTH_8},$LNG{MONTH_9},$LNG{MONTH_10},$LNG{MONTH_11},$LNG{MONTH_12}); foreach (1..12){ $page->add_element("month1",$_,$month[$_-1]);$page->add_element("month2",$_,$month[$_-1]); } $page->set_def("month1",$mon); $page->set_def("month2",$mon); foreach (2002..$year){ $page->add_element("year1",$_); $page->add_element("year2",$_); } $page->set_def("year1",$year); $page->set_def("year2",$year); #END DATE $page->set_def("enablelog",$CONF{enablelog}); my @WHERE=(); if ($PAR{issubmit}){ if ($PAR{usedate}){ push(@WHERE,"date BETWEEN ".$db->quote("$PAR{year1}-$PAR{month1}-$PAR{day1}")." AND DATE_ADD(".$db->quote("$PAR{year2}-$PAR{month2}-$PAR{day2}").", INTERVAL 1 DAY)"); } }else{ push(@WHERE,"date BETWEEN '$year-$mon-$mday' AND DATE_ADD('$year-$mon-$mday', INTERVAL 1 DAY)"); } my $WHERE=join(" AND ",@WHERE); $WHERE="WHERE ".$WHERE if $WHERE; my $logdata; my $sql="SELECT * FROM ${PREF}log $WHERE ORDER by pk_log ASC"; my $out=$db->prepare($sql); $out->execute(); &Error($sql); unless ($out->rows()){ $logdata.=< No logs found ALL__ } while (my %output=%{$out->fetchrow_hashref}){ $logdata.=< $output{date} ${\&sequre($output{log})} ALL__ } $page->add_regesp('{allcountlog}',GetSQLCount("SELECT * FROM ${PREF}log")); $page->add_regesp('{logdata}',$logdata); $page->ParseData; return $page->as_string; } ################ sub print_settings{ my %map; %map=( "" =>\&print_settings_main, personal =>\&print_settings_personal, smtp =>\&print_settings_smtp, pass =>\&print_settings_pass, timecorr =>\&print_settings_timecorr, test =>\&print_settings_test, backup =>\&print_settings_backup ); $main_page=new dparser( DATA=>"$SHABL_DIR/main-settings.html" ); $main_page->add_regesp('{main_menu}',get_account_menu(\@SETTINGSMENU)); my $func_ref; if ($map{$PAR{act2}}) { $func_ref=$map{$PAR{act2}}; }else{ $func_ref=sub{return $q->h1("Please do not experiment with URL")} } $main_page->add_regesp('###TITLE###',$LNG{GLOBAL_SETTS}); $main_page->add_regesp('{body}',&$func_ref); $main_page->ParseData; &printheader; $main_page->print; } ################ ##STAT ############## sub print_stat_main{ my $page = new hfparser( DATA=>$settings_shabl ); $page->SplitData("#begin#main","#end#main"); $page->deleteBEFORE_AFTER(); $page->add_regesp('{main_menu_body}',get_full_menu(\@STATMENU)); $page->ParseData; return $page->as_string; } sub print_stat_curlog{ my $page = new hfparser( DATA=>$settings_shabl ); $page->SplitData("#begin#broadcastlog","#end#broadcastlog"); $page->deleteBEFORE_AFTER(); $page->add_regesp('{mess}',""); $page->add_regesp('{broadcast_file}',$BroadcastLogFile); $page->add_regesp('{count_rows}',GetSQLCount("SELECT * FROM ${PREF}brodcastlog")); if($PAR{issubmit}){ if($PAR{save_broadcast_log}){ if(open(FILE,">>$BroadcastLogFile")){ unless ($^O=~/win/i){ unless(flock(FILE, LOCK_EX())){ $page->set_error("save_broadcast_log", "$LNG{ERROR_CANT_LOCK_FILE} ".LOCK_EX()." $!\n"); close(FILE); }else{ print FILE "Broadcast logging starts at ".GetDate()."\n"; print FILE "TIME\tPROCESS NUMBER\tPID\tSTATUS MESSAGE\n"; close(FILE); } }else{ print FILE "Broadcast logging starts at ".GetDate()."\n"; print FILE "TIME\tPROCESS NUMBER\tPID\tSTATUS MESSAGE\n"; close(FILE); } }else{ $page->set_error("save_broadcast_log", "$LNG{ERROR_CANT_OPEN_FILE} $BroadcastLogFile $LNG{ERROR_CANT_WRITE} ($!)
$LNG{ERROR_NEED_TO_CREATE} $BroadcastLogFile $LNG{ERROR_NEED_TO_CREATE2}"); } } unless($page->is_error){ $page->add_regesp('{mess}',"

$LNG{MESS_SETTINGS_UPDATED}

"); save_config(0,"save_broadcast_log",$PAR{save_broadcast_log}); } } $page->set_def("save_broadcast_log",$CONF{save_broadcast_log}); my $mess = ""; my $sql="SELECT DATE_FORMAT(date, '%Y-%b-%d    %H:%i:%S' ) as datelog, pid,log,procnomber FROM `${PREF}brodcastlog` ORDER by `date` ASC"; my $out=$db->prepare($sql); $out->execute; &Error; unless($out->rows()){ $mess.=qq|

$LNG{MESS_NO_BROADCAST_LOG}

|; }else{ my $count=$out->rows(); $mess.=< $LNG{BROADCAST_LOG_PROC} PID $LNG{BROADCAST_LOG_TIME} $LNG{BROADCAST_LOG_STATUS} ALL__ while (my $output=$out->fetchrow_hashref){ $output->{procnomber}="$LNG{BROADCAST_LOG_MAIN}" unless $output->{procnomber}; $mess.=< $output->{procnomber} $output->{pid} $output->{datelog} $output->{log} ALL__ } $mess.=""; } $page->add_regesp('{broadcast_mess}',$mess); $page->ParseData; return $page->as_string; } sub set_leng{ my $out=<
{error}{fm_hidden_ses}{fm_hidden_act}
[LNG_LANG_SELECT_LANG_TABHEADER]
[LNG_LANG_LANG]:
{fm_select_langnow}
ALL__ if($PAR{issubmit} and $PAR{langnow}){ save_config(0,'langnow',$PAR{langnow}); print $q->redirect("$SCRIPT_NAME?ses=$PAR{ses}"); exit; } my $page=new hfparser( IS_CRIPT=>0, SOURCE=>'string', DATA=>$out ); # my @files=<"shabl/lang/*.txt">; my $lang_dir='shabl/lang'; opendir(DIR,$lang_dir); my @backups; while(my $file=readdir(DIR)){ next unless $file=~/\.txt$/; $file=~s/\.txt$//; open(FILE,"$lang_dir/$file.txt"); my $fline=; close(FILE); chomp($fline); my ($lang_name,$lengencod)=split(/\t/,$fline); $page->add_element('langnow',$file,"$lang_name ($lengencod)"); } closedir(DIR); $page->set_def('langnow',$CONF{langnow}); $page->ParseData; return $page->as_string; } ################# sub print_set_leng{ $main_page=new dparser( DATA=>"$SHABL_DIR/main-settings.html" ); $main_page->add_regesp('###TITLE###',$LNG{LANG_SELECT_LANG}); $main_page->add_regesp('{body}',set_leng()); $main_page->add_regesp('{main_menu}',""); $main_page->ParseData; &printheader; $main_page->print; } ################# sub print_stat{ my %map; %map=( "" =>\&print_stat_main, curlog =>\&print_stat_curlog, 'log' =>\&print_settings_log, total =>\&print_stat_total, ); $main_page=new dparser( DATA=>"$SHABL_DIR/main-settings.html" ); my $func_ref; if ($map{$PAR{act2}}) { $func_ref=$map{$PAR{act2}}; }else{ $func_ref=sub{return $q->h1($LNG{ERROR_NOT_CHANGE_URL})} } $main_page->add_regesp('###TITLE###',$LNG{STAT_STATISTICS}); $main_page->add_regesp('{body}',&$func_ref); $main_page->add_regesp('{main_menu}', get_hor_menu(\@STATMENU,{ses=>$PAR{ses},act=>$PAR{act}},[['menu','menuACT'],['menu2','menu2ACT']]) ); $main_page->ParseData; &printheader; $main_page->print; } sub print_stat_account{ my $page=shift; $page->add_regesp('{log_header}',$LNG{STAT_TOTAL_PROSP}); $page->Hide(""); my $sql="select * from ${PREF}account"; my $out=$db->prepare($sql); $out->execute(); my %accountname; while (my %output=%{$out->fetchrow_hashref}){ $accountname{$output{pk_account}}=$output{name}; } my $Total_act,$Total_inact; my $logdata.=< $LNG{STAT_ACCOUNT} $LNG{STAT_ACT_PROSP} $LNG{STAT_INACT_PROSP} $LNG{STAT_TOTAL} ALL__ foreach my $account_id(sort {$accountname{$a} cmp $accountname{$b}}keys %accountname){ my $total_activ = GetSQLCount("Select * from ${PREF}user WHERE fk_account=? AND isact=1",$account_id); my $total_inactiv = GetSQLCount("Select * from ${PREF}user WHERE fk_account=? AND isact<>1",$account_id); my $total=$total_activ+$total_inactiv; $Total_act+=$total_activ; $Total_inact+=$total_inactiv; $logdata.=< $accountname{$account_id} $total_activ $total_inactiv $total ALL__ } my $tot=$Total_inact+$Total_act; $logdata.=< $LNG{STAT_TOTAL}: $Total_act $Total_inact $tot ALL__ $logdata.=get_gif_link(); $page->add_regesp('{logdata}',$logdata); $page->ParseData; return $page->as_string; } sub get_gif_link{ my $script=$SCRIPT_NAME; my @chars=('a'..'z','A'..'Z',0..9,'_'); my $ran=join("", @chars[map{rand @chars}(1..8)]); $script=~s/responder\.cgi/logpng.cgi/; $script.="?rn=$ran&".join("&",map{"$_=$PAR{$_}"}keys %PAR); return qq|
Diagram
|; } sub print_stat_total{ my $page = new hfparser( DATA=>$settings_shabl ); $page->SplitData("#begin#total","#end#total"); $page->deleteBEFORE_AFTER(); if ($PAR{modelog} eq 'account'){ return print_stat_account($page); } #DATE my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =localtime($MY_TIME); $year+=1900;$mon++; $PAR{year1}=$year unless $PAR{year1}; $PAR{year2}=$year unless $PAR{year2}; $PAR{month1}=$mon unless $PAR{month1}; $PAR{month2}=$mon unless $PAR{month2}; $PAR{day1}=$mday unless $PAR{day1}; $PAR{day2}=$mday unless $PAR{day2}; foreach (1..31){ my $dd=sprintf("%02d",$_); $page->add_element("day1",$_,$dd); $page->add_element("day2",$_,$dd) } $page->set_def("day1",$PAR{day1}); $page->set_def("day2",$PAR{day2}); my @month=($LNG{MONTH_1},$LNG{MONTH_2},$LNG{MONTH_3},$LNG{MONTH_4},$LNG{MONTH_5},$LNG{MONTH_6},$LNG{MONTH_7},$LNG{MONTH_8},$LNG{MONTH_9},$LNG{MONTH_10},$LNG{MONTH_11},$LNG{MONTH_12}); foreach (1..12){ $page->add_element("month1",$_,$month[$_-1]);$page->add_element("month2",$_,$month[$_-1]); } $page->set_def("month1",$PAR{month1}); $page->set_def("month2",$PAR{month2}); foreach (2002..$year){ $page->add_element("year1",$_); $page->add_element("year2",$_); } $page->set_def("year1",$PAR{year1}); $page->set_def("year2",$PAR{year2}); #END DATE $page->set_def("enablelog",$CONF{enablelog}); my @WHERE=(); push @WHERE, "`date` >=".$db->quote("$PAR{year1}-$PAR{month1}-$PAR{day1}"); push @WHERE, "`date` <=".$db->quote("$PAR{year2}-$PAR{month2}-$PAR{day2}"); my $WHERE=join(" AND ",@WHERE); $WHERE="WHERE ".$WHERE if $WHERE; my $logdata; my $sql=<prepare($sql); $out->execute(); &Error($sql); unless ($out->rows()){ $logdata.=<$LNG{STAT_NO_LOGS_FOUND} ALL__ }else{ unless($PAR{modelog}){ $logdata.=< $LNG{STAT_ACCOUNT} $LNG{STAT_SEQUNTIAL} $LNG{STAT_SHEDULED} $LNG{STAT_MANUAL} $LNG{STAT_DOI} $LNG{STAT_SUBSCRIBE} $LNG{STAT_UNSUBSCRIBE} $LNG{STAT_TOTAL} ALL__ }else{ $logdata.=< $LNG{STAT_ACCOUNT} $LNG{STAT_SUBSCRIBERS} $LNG{STAT_UNSUBSCRIBERS} $LNG{STAT_TOTAL} ALL__ } my %itog; while (my $output=$out->fetchrow_hashref){ map{$itog{$_}=$itog{$_}+$output->{$_} unless(/account|name/)}keys %{$output}; unless($PAR{modelog}){ $logdata.=< $output->{name} $output->{sent_sequential} $output->{sent_sheduled} $output->{sent_manual} $output->{sent_doubleoptin} $output->{sent_subscribe} $output->{sent_unsubscribe} $output->{total_sent} ALL__ }else{ $logdata.=< $output->{name} $output->{subscribers} $output->{unsubscribers} $output->{total_subscribers} ALL__ } } unless($PAR{modelog}){ $logdata.=< $LNG{STAT_TOTAL} $itog{sent_sequential} $itog{sent_sheduled} $itog{sent_manual} $itog{sent_doubleoptin} $itog{sent_subscribe} $itog{sent_unsubscribe} $itog{total_sent} ALL__ }else{ $logdata.=< $LNG{STAT_TOTAL} $itog{subscribers} $itog{unsubscribers} $itog{total_subscribers} ALL__ } $logdata.=get_gif_link(); } my $header; my $m1=$month[$PAR{month1}-1]; my $m2=$month[$PAR{month2}-1]; my $period; if ($m1 eq $m2 && $PAR{day1} == $PAR{day2} && $PAR{year1}==$PAR{year2}){ $period = "$LNG{STAT_PERIOD_FOR} $PAR{day1} $m1 $PAR{year1}"; }else{ $period = "$LNG{STAT_PERIOD_FROM} $PAR{day1} $m1 $PAR{year1} $LNG{STAT_PERIOD_TILL} $PAR{day2} $m2 $PAR{year2}"; } unless($PAR{modelog}){ $header="$LNG{STAT_SENT_MESS_STAT} $period"; }else{ $header="$LNG{STAT_SUBSCRIBERS_STAT} $period"; } $page->add_regesp('{log_header}',"$header"); $page->add_regesp('{logdata}',$logdata); $page->ParseData; return $page->as_string; } ################# ################# ##ACCOUNT ################# ################# #USERS ################# sub print_user_form{ local @FIELDS; @FIELDS=load_account_fields($PAR{account}); my $page = new hfparser( DATA=>$main_shabl, ERROR_AFTER_INPUT=>1 ); if ($PAR{issubmit}){ #SET ERROR $page->set_error("email",$LNG{ERROR_EMAIL_INCORRECT}) unless checkemail($PAR{email}); $page->set_error("email","$LNG{TXT_EMAIL_ADDRESS} $PAR{email} $LNG{ERROR_IS_ALREADY_EXISTS}") if GetSQLCount("SELECT * from ${PREF}user where fk_account=? AND email=? AND pk_user<>?",$PAR{account},$PAR{email},$PAR{reckey}); unless($page->is_error){ if($CONF{useblacklist}){ $page->set_error("email",$CONF{blacklist_error}) if GetSQLCount("SELECT * FROM ${PREF}bounce_banemails WHERE email=?",$PAR{email}); } } if ($PAR{days}=~/[^0-9]/){ $page->set_error("days",$LNG{ERROR_NUMBER_REQUIRED}); } $PAR{days}=0 unless $PAR{days}; unless($page->is_error){ my $last; my $days; $days=$PAR{days}; unless($PAR{reckey}){ #$last=GetLastInsert("${PREF}user"); if ($PAR{add_to} eq 'no_seq'){ $days=-1; } #$db->do("INSERT INTO ${PREF}user (fk_account,name,email,days,datereg) VALUES (?,?,?,?,$NOW)",undef,$PAR{account},$PAR{name},$PAR{email},$days); $last=insert_db("${PREF}user",{fk_account=>$PAR{account},name=>$PAR{name},email=>$PAR{email},days=>$days},{datereg=>"$NOW"}); &Error; }else{ #update user if ($PAR{add_to} eq 'no_seq'){ $days=-1; } update_db("${PREF}user",{fk_account=>$PAR{account},name =>$PAR{name},email=>$PAR{email},days=>$days},{pk_user=>$PAR{reckey}}); $last=$PAR{reckey}; } foreach(@FIELDS){ my $param="dp".$_->{key}; save_user_parametr($_->{key},$last,$PAR{$param}); } print $q->redirect("$SCRIPT_NAME?ses=$PAR{ses}&act=mainbody&act2=users&account=$PAR{account}"); exit(1); } } #set defaults if ($PAR{reckey}){ $page->add_regesp('{mode}', $LNG{TXT_MODE_EDIT}); $val=select_one_db("SELECT * from ${PREF}user WHERE pk_user=? and fk_account=?",$PAR{reckey},$PAR{account}) || die $LNG{ERROR_USER_NOT_FOUND}; $page->set_def('email',$val->{email}); $page->set_def('name',$val->{name}); if($val->{days}==-1){ $page->set_def('days',0); $page->add_regesp("{CHECKED_no_seq}",' CHECKED '); }else{ $page->set_def('days',$val->{days}); $page->add_regesp("{CHECKED_yes_seq}",' CHECKED '); } foreach (@FIELDS){ $page->set_def('dp'.$_->{key},get_user_parametr($_->{key},$PAR{reckey})); } }else{ $page->add_regesp("{CHECKED_yes_seq}",' CHECKED '); $page->set_def('days',0); $page->add_regesp('{mode}', $LNG{TXT_MODE_NEW}); } my $add; foreach (@FIELDS){ $add.=< $_->{name}: {fm_$_->{type}_dp$_->{key}} ALL__ } add_menu_prospects($page); $page->add_regesp("{LOGMESS}",&GetUserMessLog($PAR{reckey})); $page->ChangeData('{additional_fields}',$add); $page->SplitData("#begin#user_form","#end#user_form"); $page->deleteBEFORE_AFTER(); $page->set_default_input("text","size",35); $page->set_default_input("textarea","rows",4); $page->set_default_input("textarea","columns",35); $page->set_input("days",{size=>3,maxlength=>3}); $page->ParseData; return $page->as_string; } ############# sub GetUserMessLog{ my $user=shift; return unless ($user); my $data=""; return unless $CONF{messlogging}; my $sql="SELECT * FROM ${PREF}sentlog WHERE fk_user=? ORDER BY date ASC"; my $out=$db->prepare($sql); $out->execute($user); &Error($sql); return unless ($out->rows()); my $rows=$out->rows; $data.=<$LNG{USR_SENT_MESS}: $rows $LNG{USR_SENT_RECORDS_IN_LOGS} ALL__ my $i; while (my %output=%{$out->fetchrow_hashref}){ $i++; my $mess=select_one_db("SELECT * FROM ${PREF}mess WHERE pk_mess=?",$output{fk_mess}); my $subj=sequre($mess->{subject}); $data.=< ALL__ } $data.=< ALL__ return $data; } ############# sub print_user_browser{ my $OUT; my $TEXT_FILE; my @showfields=$q->param("showfields"); my @showadditional=$q->param("additional"); my %FIELDS; map{$FIELDS{$_->{key}}=$_->{name}}@FIELDS; my @addtextfield=map{"$FIELDS{$_}"}@showfields; my @addtextextra=map{"$summary{$_}"}@showadditional; my @addtdfield=map{""}@showfields; my @addtdextra=map{""}@showadditional; my @WHERE=(); my $ORDER, $LEFTJ; push(@WHERE,"fk_account=".$db->quote($PAR{account})); if ($PAR{usedate}){ push(@WHERE,"datereg BETWEEN ".$db->quote("$PAR{year1}-$PAR{month1}-$PAR{day1}")." AND ".$db->quote("$PAR{year2}-$PAR{month2}-$PAR{day2}")); } $PAR{doprar}="email" unless($PAR{doprar}); $PAR{ordertype}="ASC" unless($PAR{ordertype}); if (($PAR{doprar} eq "email") or ($PAR{doprar} eq "name")){ $ORDER = "ORDER by $PAR{doprar} $PAR{ordertype}"; push(@WHERE,"$PAR{doprar} LIKE ".$db->quote("%".$PAR{search}."%")) if ($PAR{search} ne ""); }else{ $LEFTJ="LEFT JOIN ${PREF}doppar ON fk_user=pk_user AND fk_fields=$PAR{doprar}"; $ORDER = "ORDER by value $PAR{ordertype}"; push(@WHERE,"value LIKE ".$db->quote("%".$PAR{search}."%")) if ($PAR{search} ne ""); } if ($PAR{filter} eq "act"){ push(@WHERE, "isact=1"); }elsif($PAR{filter} eq "dis"){ push(@WHERE, "isact=0"); }elsif($PAR{filter} eq "ec"){ if(@messdays){ my $lastid=$messdays[scalar(@messdays)-1]; push(@WHERE, "messlastsend=$lastid"); } }elsif($PAR{filter} eq "pend"){ my @pend = @{$db->selectcol_arrayref("select fk_user from ${PREF}doiaccounts")}; if (@pend){ push(@WHERE, "pk_user IN (".join(",",@pend) .")"); } } my $WHERE; if (@WHERE){ $WHERE="WHERE ".join(" AND ", @WHERE); } $sql="SELECT * FROM ${PREF}user $LEFTJ $WHERE $ORDER"; my $i=0; my %addt=(); map{$addt{$_}=1}@showadditional; my @addt=(); foreach(@summary){ push(@addt,$_) if exists($addt{$_}); } my $allcount=GetSQLCount($sql); my $allpages=20; $PAR{p2}=1 unless $PAR{p2}; my $maxpages=20; my $pages=ceil($allcount/$PAR{onpage}); $PAR{page}=1 unless $PAR{page}; my $alluserscount=GetSQLCount("SELECT * from ${PREF}user WHERE fk_account=?",$PAR{account}); if ($pages>1){ my $start=$PAR{onpage}*($PAR{page}-1); my $rows=$PAR{onpage}; $sql=$sql." LIMIT $start, $rows" unless $PAR{export_to_txt}; $OUT.="
$LNG{USR_BROWSER_PAGE} $PAR{page}/$pages ($LNG{USR_BROWSER_PROSPECTS} $PAR{onpage}/$allcount):"; my $startpage=($PAR{p2}-1)*$maxpages+1; my $endpage=$PAR{p2}*$maxpages; $endpage=$pages if ($endpage>$pages); my $count_pages_pages=ceil($pages/$maxpages); $OUT.=" ".$q->a({-href=>get_full_url({page=>($PAR{p2}-2)*$maxpages+1,p2=>$PAR{p2}-1})},"<<[$maxpages]$LNG{USR_BROWSER_PREVIOUSE}")." " if ($PAR{p2} >1); foreach($startpage..$endpage){ $OUT.=" ".$q->a({-href=>get_full_url({page=>$_,p2=>$PAR{p2}})},$_)." " unless ($PAR{page} eq $_); $OUT.=" $_ " if ($PAR{page} eq $_); } $OUT.=" ".$q->a({-href=>get_full_url({page=>($PAR{p2})*$maxpages+1,p2=>$PAR{p2}+1})},"$LNG{USR_BROWSER_NEXT}[$maxpages]>>")." " if ($PAR{p2} < $count_pages_pages); $OUT.="
"; }else{ if ($allcount == $alluserscount){ $OUT.= "

$LNG{USR_BROWSER_SHOWING} $alluserscount $LNG{USR_BROWSER_PROSPECTS}

"; }else{ $OUT.= "

$LNG{USR_BROWSER_SHOWING} $allcount $LNG{USR_BROWSER_FROM} $alluserscount {USR_BROWSER_PROSPECTS}

"; } } #my $my_save_url=repparser::GetURLToExport(); #$OUT.=qq|Save as text...|; #$page->add_regesp('{sql}',"
$sql
PAGES: $pages"); $page->add_regesp('{sql}',""); my $out=$db->prepare($sql); &Error; $out->execute(); &Error; unless($out->rows){ $page->SplitData("",""); $page->replaceINSIDE($q->h1($LNG{USR_BROWSER_NO_RECORDS_FOUND})); return; } if($PAR{export_to_txt}){ $TEXT_FILE="$LNG{STAT_ACCOUNT}:\t$ACCOUNT{$PAR{account}}\r\n$LNG{STAT_TOTAL}: \t".$out->rows()." $LNG{USR_BROWSER_PROSPECTS}\r\n$LNG{DATE}: \t".GetDate()."\r\n################################\r\n".join("\t",("#","$LNG{TXT_EMAIL_ADDRESS}","$LNG{TXT_NAME}",@addtextfield,@addtextextra))."\r\n"; } $OUT.= < @addtdextra @addtdfield ALL__ $i=$PAR{onpage}*($PAR{page}-1); while (my %output=%{$out->fetchrow_hashref}){ $i++; map{$output{$_}=sequre($output{$_})}keys %output; my %addshow; $addshow{status}=$LNG{USR_BROWSER_ACTIVE} if $output{isact}; $addshow{status}=$LNG{USR_BROWSER_INACTIVE} unless $output{isact}; if (($addshow{status} eq $LNG{USR_BROWSER_INACTIVE}) and GetSQLCount("SELECT * FROM ${PREF}doiaccounts WHERE fk_user=$output{pk_user}")){ $addshow{status}=$LNG{USR_BROWSER_PENDING} } $addshow{pk_user}=$output{pk_user}; $addshow{regdate}=$output{datereg}; $addshow{ip}=$output{ip}; $addshow{sendcount}=$output{countsend}; $addshow{undelivered}=$output{undelivered}; $addshow{undelivered}='0' unless $addshow{undelivered}; $addshow{cycle}=$messdays{$output{messlastsend}}.'/'.scalar(@messdays) unless($output{days}==-1); $addshow{cycle}=$LNG{USR_BROWSER_CYCLE_DISABLED} if($output{days}==-1); my @addtdextra=map{""}@addt; my @addtdfield=map{""}@showfields; $USERNAME=$output{name}; $USERNAME=$CONF{defname} if ($USERNAME eq ''); if($PAR{export_to_txt}){ my @addtextfield=map{get_user_parametr($_,$output{pk_user})}@showfields; my @addtextextra=map{"$addshow{$_}"}@addt; $TEXT_FILE.=join("\t",($i,$output{email},$USERNAME,@addtextfield,@addtextextra))."\r\n"; } $OUT.= < @addtdextra @addtdfield ALL__ } $OUT.= < ALL__ if($PAR{export_to_txt}){ #print $q->header('text/plain'); my $account_name=lc($ACCOUNT{$PAR{account}}); $account_name=~s/[^a-z0-9_-]//g; my $filename; $filename="$account_name.txt" if length($account_name); $filename="prospects$PAR{account}.txt" unless length($account_name); print "Content-type: application/octet-stream\nContent-Disposition: attachment; filename=$filename\n\n"; print $TEXT_FILE; exit; } return $OUT; } ############### sub print_users{ local $alluserscount=GetSQLCount("SELECT * from ${PREF}user WHERE fk_account=?",$PAR{account}); local @FIELDS=load_account_fields($PAR{account}); local %summary=(sendcount=>$LNG{USR_BROWSER_HEAD_SENT},status=>$LNG{USR_BROWSER_HEAD_STATUS},regdate=>$LNG{USR_BROWSER_HEAD_DATE},cycle=>$LNG{USR_BROWSER_HEAD_CYCLE}, ip=>$LNG{USR_BROWSER_HEAD_HOST}, pk_user=>$LNG{USR_BROWSER_HEAD_USERID}); # to add : undelivered=>"Bounce" local @summary=qw(status cycle sendcount regdate ip pk_user); #undelivered local @messdays,%messdays; $sql="SELECT * FROM ${PREF}mess WHERE fk_account = ? AND typesend = 'auto' ORDER BY days ASC"; my $out=$db->prepare($sql); $out->execute($PAR{account});&Error($SQL); my $i=0; while (my %output=%{$out->fetchrow_hashref}){ $i++; push @messdays,$output{pk_mess}; $messdays{$output{pk_mess}}=$i; } $messdays{""}=0; local $page = new hfparser( DATA=>$main_shabl, ERROR_AFTER_INPUT=>0); $page->add_regesp("{mess}",""); add_menu_prospects($page); if ($PAR{bnRemove}){ my @selected=$q->param("sel"); if (@selected){ @selected=map{$db->quote($_)}@selected; my $in=join(" , ",@selected); my $count=$db->do("DELETE FROM ${PREF}user WHERE pk_user IN ($in)"); $page->add_regesp("{mess}","

$count $LNG{USR_BROWSER_USERS_REMOVED}

"); $db->do("DELETE FROM ${PREF}doppar WHERE fk_user IN ($in)"); $db->do("DELETE FROM ${PREF}tosend WHERE fk_user IN ($in)"); $db->do("DELETE FROM ${PREF}doiaccounts WHERE fk_user IN ($in)"); $db->do("DELETE FROM ${PREF}sentlog WHERE fk_user IN ($in)"); $db->do("DELETE FROM ${PREF}link_clicks WHERE fk_user IN ($in)"); &Error; } } if ($PAR{bnInvStat}){ my @selected=$q->param("sel"); if (@selected){ @selected=map{$db->quote($_)}@selected; my $in=join(" , ",@selected); my $count=$db->do("UPDATE ${PREF}user SET isact=IF(isact=0,1,0) WHERE pk_user IN ($in)"); &Error; $page->add_regesp("{mess}","

$count $LNG{USR_BROWSER_USERS_CHANGED}

"); } } unless($PAR{issubmit}){ $q->param(-name=>'onpage',-value=>'50'); $page->set_def("onpage",50);$PAR{onpage}=50; $q->param(-name=>'additional',-value=>[qw(status cycle sendcount)]); } $page->add_regesp('{all_users_count}',$alluserscount); $page->add_regesp('{result_table}',&print_user_browser); $page->add_regesp('{account}',$PAR{account}); $page->add_element("doprar",'email',"$LNG{TXT_EMAIL_ADDRESS}"); $page->add_element("doprar",'name',"$LNG{TXT_NAME}"); foreach (@FIELDS){ $page->add_element("doprar",$_->{key},$_->{name}); } foreach (qw(20 30 50 75 100 150 200 300 400)){ $page->add_element("onpage",$_); } my $toshow; if (@FIELDS){ $toshow.="
$LNG{USR_BROWSER_USERS_SHOW_FIELDS}:"; my @val=map{$_->{key}}@FIELDS; my %lab; map{$lab{$_->{key}}="$_->{name}"}@FIELDS; $toshow.=$q->checkbox_group(-name=>'showfields', -values=>\@val, -default=>"", -labels=>\%lab); } my $additional; if (%summary){ $additional.="$LNG{USR_BROWSER_USERS_SHOW_EXTRA}:"; my @val=@summary; map{$_->{key}}@FIELDS; $additional.=$q->checkbox_group(-name=>'additional', -values=>\@val, -default=>"", -labels=>\%summary); } $page->add_regesp('{additional}',$additional); $page->add_regesp('{toshow_line}',$toshow); $page->add_element("ordertype","ASC",$LNG{USR_BROWSER_USERS_SORT_ASC}); $page->add_element("ordertype","DESC",$LNG{USR_BROWSER_USERS_SORT_DESC}); #DATE my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =localtime($MY_TIME); $year+=1900;$mon++; foreach (1..31){ my $dd=sprintf("%02d",$_); $page->add_element("day1",$_,$dd); $page->add_element("day2",$_,$dd) } $page->set_def("day1",$mday); $page->set_def("day2",$mday); my @month=($LNG{MONTH_1},$LNG{MONTH_2},$LNG{MONTH_3},$LNG{MONTH_4},$LNG{MONTH_5},$LNG{MONTH_6},$LNG{MONTH_7},$LNG{MONTH_8},$LNG{MONTH_9},$LNG{MONTH_10},$LNG{MONTH_11},$LNG{MONTH_12}); foreach (1..12){ $page->add_element("month1",$_,$month[$_-1]);$page->add_element("month2",$_,$month[$_-1]); } $page->set_def("month1",$mon); $page->set_def("month2",$mon); foreach (2002..$year){ $page->add_element("year1",$_); $page->add_element("year2",$_); } $page->set_def("year1",$year); $page->set_def("year2",$year); $page->add_element("filter","",$LNG{USR_BROWSER_ALL}); $page->add_element("filter","act",$LNG{USR_BROWSER_ACTIVE}); $page->add_element("filter","dis",$LNG{USR_BROWSER_INACTIVE}); $page->add_element("filter","pend",$LNG{USR_BROWSER_PENDING}); $page->add_element("filter","ec",$LNG{USR_BROWSER_FINISHED}); #END DATE #SET DEF $page->SplitData("#begin#users","#end#users"); $page->deleteBEFORE_AFTER(); unless($alluserscount){ $page->SplitData('',''); $page->deleteINSIDE; } $page->ParseData; return $page->as_string; } ################# #FIELDS ################# sub sort_fields{ my $account=shift; $sql="SELECT * from ${PREF}fields WHERE fk_account=? ORDER by rang ASC"; my $out=$db->prepare($sql); &Error; $out->execute($PAR{account}); &Error; my $i; while (my %output=%{$out->fetchrow_hashref}){ $i++; update_db("${PREF}fields",{rang=>$i},{pk_fields=>$output{pk_fields}}); &Error; } } ################ sub delete_field{ $db->do("DELETE FROM ${PREF}fields WHERE fk_account=? AND pk_fields=?",undef,$PAR{account},$PAR{reckey}); $db->do("DELETE FROM ${PREF}doppar WHERE fk_fields=",undef,$PAR{reckey}); sort_fields($PAR{account}); print $q->redirect("$SCRIPT_NAME?ses=$PAR{ses}&act=mainbody&act2=columns&account=$PAR{account}"); exit(1); } #################### sub print_field_form{ my $ischecked_isreq; my %error; my %INPUT; my $page = new hfparser( DATA=>$main_shabl, ERROR_AFTER_INPUT=>1 ); if ($PAR{issubmit}){ $page->set_error("fieldname",$LNG{ERROR_FIELD_NAME_INCORRECT}) if $PAR{fieldname}=~/[^a-zA-Z 0-9_\-.:]/; $page->set_error("fieldname","$LNG{HTML_FORM_FIELD_NAME} $PAR{fieldname} $LNG{HTML_FORM_ERR_USED}") if GetSQLCount("SELECT * from ${PREF}fields where fk_account=? AND fieldname=? AND pk_fields<>?",$PAR{account},$PAR{fieldname},$PAR{reckey}); $page->set_error("fieldname","$LNG{HTML_FORM_FIELD_NAME} $PAR{fieldname} $LNG{HTML_FORM_ERR_RESERVED}") if ($PAR{fieldname}=~/^name *$/i) or ($PAR{fieldname}=~/^email *$/i); $page->set_error("fieldname","$LNG{HTML_FORM_FIELD_NAME} $LNG{HTML_FORM_ERR_EMPTY}") unless $PAR{fieldname}; } if ($PAR{issubmit} && !$page->is_error){ unless($PAR{reckey}){ ##Add new my $isreq; $rang1=GetSQLCount("SELECT * from ${PREF}fields where fk_account=?",$PAR{account}); sort_fields($PAR{account}); insert_db("${PREF}fields",{type=>$PAR{type},fieldname=>$PAR{fieldname},fk_account=>$PAR{account},is_req=>$PAR{isreq}, rang=>$rang1+1}); print $q->redirect("$SCRIPT_NAME?ses=$PAR{ses}&act=mainbody&act2=columns&account=$PAR{account}"); exit(1); }else{ sort_fields($PAR{account}); update_db("${PREF}fields",{fieldname=>$PAR{fieldname},fk_account=>$PAR{account},is_req=>$PAR{isreq},type=>$PAR{type}},{pk_fields=>$PAR{reckey}}); print $q->redirect("$SCRIPT_NAME?ses=$PAR{ses}&act=mainbody&act2=columns&account=$PAR{account}"); exit(1); } } #### #set defaults #### if ($PAR{reckey}){ $val=select_one_db("SELECT * from ${PREF}fields WHERE pk_fields=?",$PAR{reckey}) || die "Atantion: bed request field $PAR{reckey} not found"; $page->set_def('fieldname',$val->{fieldname}); $page->set_def('type',$val->{type}); $page->set_def('isreq',$val->{is_req}); } $page->add_element("type","text","TEXT"); $page->add_element("type","textarea","TEXTAREA"); $page->set_input('isreq',{-value=>'1' -checked=>$ischecked_isreq}); $page->SplitData("#begin#column_form","#end#column_form"); $page->deleteBEFORE_AFTER(); $page->add_regesp('{body}',&print_columns_browser); $page->ParseData; return $page->as_string; } ################### sub print_add_accounts{ my $OUT, $OUT_UNSUBSCRIBE; my %account=%ACCOUNT; my %ADD_ACCOUNTS; my %ADD_ACCOUNTS_UNSUBSCRIBE; map{ $ADD_ACCOUNTS{$_}="checked" }split(/\|/,$CONF{ADD_ACCOUNTS}) if $CONF{ADD_ACCOUNTS}; map{ $ADD_ACCOUNTS_UNSUBSCRIBE{$_}="checked" }split(/\|/,$CONF{ADD_ACCOUNTS_UNSUBSCRIBE}) if $CONF{ADD_ACCOUNTS_UNSUBSCRIBE}; my $d; map {$d.="($_) = $ADD_ACCOUNTS_UNSUBSCRIBE{$_}\n"}keys %ADD_ACCOUNTS_UNSUBSCRIBE; #die($d."\n\naccounts: $CONF{ADD_ACCOUNTS}\n unsubscribe:$CONF{ADD_ACCOUNTS_UNSUBSCRIBE}\n\n\n".split("|",$CONF{ADD_ACCOUNTS_UNSUBSCRIBE})."\n\n"); delete $account{$PAR{account}}; return unless %account; my @add; foreach (keys %account){ #$OUT.="
  • ".sequre("")." - for account $account{$_}"; $OUT.="
  • $account{$_}\n"; if($CONF{unsub_account_all}){ $OUT_UNSUBSCRIBE.="
  • $account{$_}\n"; }else{ $OUT_UNSUBSCRIBE.="
  • $account{$_}\n"; } } #die($OUT_UNSUBSCRIBE."\n\n$d"); if ($OUT){ $OUT=<

    $LNG{HTML_FORM_SUBSCRIBE_ACCOUNTS}

      $OUT
    ALL__ } if($OUT_UNSUBSCRIBE){ my $is_checked_all; if($CONF{unsub_account_all}){ $is_checked_all="checked"; } $OUT.=<

    $LNG{HTML_FORM_UNSUBSCRIBE_ACCOUNTS}

    • $LNG{HTML_FORM_UNSUBSCRIBE_ALL}
    • $OUT_UNSUBSCRIBE
    ALL__ } return "$OUT"; } #################### sub print_columns_browser{ my $ret; my $defsize=25; my $rowssize=5; my $max=80; my $def_class="INPUTmy"; my $def_over_class="INPUTmyACT"; my @deftextfield=(-size=>$defsize,-maxlength=>$max,-class=>$def_class, -onFocus=>"this.className ='$def_over_class' ; return true;", -onBlur=>" this.className ='$def_class'"); my @deftextarea=(-rows=>$rowssize,-columns=>$defsize,-class=>$def_class, -onFocus=>"this.className ='$def_over_class' ; return true;", -onBlur=>" this.className ='$def_class'"); my $add_new_link=$q->a({-href=>get_full_url({act2=>fieldform,reckey=>""})},$LNG{HTML_FORM_ADD_NEW}); my $sql="select * from ${PREF}fields where fk_account=? order by rang"; my $out=$db->prepare($sql); $out->execute($PAR{account}); &Error; my $namefield=$q->textfield( -name=>'name', -default=>'Jon Doe',@deftextfield ); my $emailfield=$q->textfield( -name=>'email', -default=>'email@host.com', @deftextfield ); $ret.=<
  • ALL__ unless ($out->rows){ $ret.="
       $LNG{USR_SENT_MESSAGE} $LNG{USR_SENT_DATE}
    $i $subj $output{date}
    $FIELDS{$_}$summary{$_}
    #   $LNG{TXT_EMAIL_ADDRESS} $LNG{TXT_NAME}
    $addshow{$_}".get_user_parametr($_,$output{pk_user})."$i $output{email} $USERNAME
    $LNG{HTML_FORM_NAME}: $namefield * $LNG{HTML_FORM_RESERVED}
    $LNG{HTML_FORM_EMAIL}: $emailfield * $LNG{HTML_FORM_RESERVED}
    $add_new_link"; return $ret; } my $rows=$out->rows; $ret.=< $LNG{HTML_FORM_YOU_HAVE} $rows $LNG{HTML_FORM_COSTUM_FIELDS} ALL__ while (my %output=%{$out->fetchrow_hashref}){ my $field; $field=$q->textfield(-name=>"df$output{pk_fields}", @deftextfield) if ($output{type} eq 'text'); $field=$q->textarea(-name=>"df$output{pk_fields}", @deftextarea) if ($output{type} eq 'textarea'); my $editlink=$q->a({-href=>get_full_url({act2=>'fieldform',reckey=>$output{pk_fields}})},'Edit'); my $onCL=<a({-onClick=>$onCL, -href=>get_full_url({act2=>'delfield',reckey=>$output{pk_fields}})},$LNG{HTML_FORM_DROP}); my $uplink= $q->a({-href=>get_full_url({act2=>'up',reckey=>$output{pk_fields}})},$LNG{HTML_FORM_UP}) if $output{rang}>1; $uplink=$LNG{HTML_FORM_UP} unless $output{rang}>1; my $downlink=$q->a({-href=>get_full_url({act2=>'down',reckey=>$output{pk_fields}})},$LNG{HTML_FORM_DOWN}) if $output{rang} < $out->rows; $downlink=$LNG{HTML_FORM_DOWN} unless $output{rang} < $out->rows; my $isreq="*" if $output{is_req}; $ret.=< $output{fieldname}: $field $isreq $editlink $droplink $LNG{HTML_FORM_MOVE} $uplink | $downlink ALL__ } $ret.=< $add_new_link ALL__ return $ret; } ################### sub get_html_code{ my $account=shift; my $html; $account=$PAR{account} unless $account; my $address=$ENV{HTTP_HOST}; my $scriptdir=$ENV{SCRIPT_NAME}; (my $src=$scriptdir)=~s#[^/]*$##; $html=<
    ALL__ $sql="SELECT * from ${PREF}fields WHERE fk_account=? ORDER by rang"; my $out=$db->prepare($sql); &Error; $out->execute($account); &Error; while (my %output=%{$out->fetchrow_hashref}){ my $isrec; my $innput; if ($output{type} eq 'text'){ $innput=< ALL__ }else{ $innput=< ALL__ } $isrec="*" if ($output{is_req} ==1); $html.=< ALL__ } $html.=<
    $LNG{HTML_FORM_NAME}: *
    $LNG{HTML_FORM_EMAIL}: *
    $output{fieldname}: $innput $isrec
    ALL__ return $html; } ################### sub print_columns{ my $page = new hfparser( DATA=>$main_shabl ); if($PAR{save}){ my @act=$q->param('addaccount'); save_config($PAR{account},"ADD_ACCOUNTS",join("|",@act)); save_config($PAR{account},"unsub_account_all",$PAR{unsub_account_all}); my @act_unsubscribe=$q->param('unsub_account'); #die (join("|",@act_unsubscribe)); save_config($PAR{account},"ADD_ACCOUNTS_UNSUBSCRIBE",join("|",@act_unsubscribe)); } sort_fields($PAR{account}); $page->SplitData("#begin#column_browser","#end#column_browser"); $page->set_input('htmlcode',{columns=>80,default=>get_html_code($PAR{account})}); $page->add_regesp('{formPrewiew}',get_html_code($PAR{account})); $page->deleteBEFORE_AFTER(); $page->add_regesp('{body}',&print_columns_browser); $page->add_regesp('{ADDACCOUNTS}',&print_add_accounts); $page->ParseData; return $page->as_string; } ############# sub get_user_parametr{ my $field=shift; my $user=shift; my $out; my $out=select_one_db("SELECT * from ${PREF}doppar WHERE fk_fields=? AND fk_user=?",$field,$user); return $out->{value}; } ##################### #sub print_undeliv{ # my @params=(qw(isbounce bnaccount replyto bnpop3server bnpop3user bnpop3pass bnpop3port bncount bnaction)); # my @req=(); # my $page = new hfparser( # DATA=>$main_shabl # ); # if ($PAR{issubmit}){ # if($PAR{isbounce}){ # push(@req,qw(replyto bnpop3server bnpop3user bnpop3pass bnpop3port bncount bnaction)) # } # foreach (@req){ # $page->set_error($_,$LNG{ERROR_REQUIRED}) if ($PAR{$_} eq ''); # } # if (length($PAR{bnpop3port})>0){ # if ($PAR{bnpop3port}=~/[^0-9]/){ # $page->set_error('bnpop3port',"Must be the number"); # } # } # if (length($PAR{bncount})>0){ # if ($PAR{bncount}=~/[^0-9]/){ # $page->set_error('bncount',"Must be the number"); # } # if ($PAR{bncount}<1){ # $page->set_error('bncount',"Must be more then 0"); # } # } # unless ($page->is_error){ # foreach(@params){ # save_config($PAR{account},$_,$PAR{$_}); # } # $page->add_regesp('{error}', qq|

    $LNG{MESS_SETTINGS_UPDATED}

    |); # } # } # #### # foreach(@params){ # $page->set_def($_,$CONF{$_}); # } # $page->set_def('bnpop3port',110) unless $CONF{bnpop3port}; # $page->set_def('bncount',5) unless $CONF{bncount}; # $page->set_default_input("text","size",35); # #$page->set_default_input("textarea","rows",4); # $page->add_element('bnaction','remove','Remove from database'); # $page->add_element('bnaction','inact',"Set $LNG{USR_BROWSER_INACTIVE}"); # $page->add_element('bnaccount','this','in current account'); # $page->add_element('bnaccount','all','in all accounts'); # $page->set_input("bnpop3port",{size=>4, MAXLENGTH=>5}); # $page->set_input("bncount",{size=>4, MAXLENGTH=>5}); # $page->SplitData("#begin#undeliv","#end#undeliv"); # $page->deleteBEFORE_AFTER(); # $page->ParseData; # return $page->as_string; #} ##################### sub print_config{ my %httppars=(redirsub=>1, redirrem=>0,doiconfurl=>0); my @params=(qw(adminname adminemail replyto messlogging defname subscribeemail pop3server pop3user pop3pass pop3port fromname fromemail ispurge isnotifsubscr isnotifunsubscr isdoi doiconfurl ispop3 banmails banmailserror defcharset no_uppercase),keys %httppars); my @req=(qw(defname fromemail fromname redirsub redirrem)); my $page = new hfparser( DATA=>$main_shabl ); if ($PAR{issubmit}){ if($PAR{ispop3}){ push(@req,qw(pop3server pop3user pop3pass pop3port subscribeemail)) } if($PAR{banmails}){ push(@req,'banmailserror') } if($PAR{isnotifsubscr} or $PAR{isnotifunsubscr}){ push(@req,qw(adminname adminemail)); $page->set_error("adminemail",$LNG{ERROR_EMAIL_INCORRECT}) unless (checkemail($PAR{adminemail},0)); } # if($PAR{returnpath}){ # $page->set_error("returnpath",$LNG{ERROR_EMAIL_INCORRECT}) unless (checkemail($PAR{returnpath},0)); # } # if($PAR{errorsto}){ # $page->set_error("errorsto",$LNG{ERROR_EMAIL_INCORRECT}) unless (checkemail($PAR{errorsto},0)); # } $httppars{doiconfurl}=1 if $PAR{isdoi}; $httppars{redirrem}=1; #if $PAR{isaddunsubscrlink}; foreach (keys %httppars){ $page->set_error($_,$LNG{ERROR_URL_INCORRECT}) unless check_url($PAR{$_},$httppars{$_}); } foreach (@req){ $page->set_error($_,$LNG{ERROR_REQUIRED}) if ($PAR{$_} eq ''); } $page->set_error("fromemail",$LNG{ERROR_EMAIL_INCORRECT}) unless (checkemail($PAR{fromemail},0)); if ($PAR{pop3port}){ if ($PAR{pop3port}=~/[^0-9]/){ $page->set_error('pop3port',$LNG{ERROR_NUMBER_REQUIRED}); } } unless ($page->is_error){ foreach(@params){ #$PAR{$_}=~s/^(http:\/\/+)+// if exists($httppars{$_}); save_config($PAR{account},$_,$PAR{$_}); } $page->add_regesp('{error}', qq|

    $LNG{MESS_SETTINGS_UPDATED}

    |); } } foreach (@params){ if (exists($httppars{$_})){ $CONF{$_}="http://" unless $CONF{$_}; } $page->set_def($_,$CONF{$_}); } #### $page->add_element('defcharset','',$LNG{TXT_DEFAULT}); map{$page->add_element('defcharset',$_,$ENCODINGS{$_});}sort {$ENCODINGS{$a} cmp $ENCODINGS{$b}} keys %ENCODINGS; $page->set_default_input("text","size",35); $page->set_default_input("textarea","rows",4); $page->set_default_input("textarea","columns",35); $page->set_input("pop3port",{size=>4, MAXLENGTH=>5}); $page->SplitData("#begin#config","#end#config"); $page->deleteBEFORE_AFTER(); $page->ParseData; return $page->as_string; } #################### sub print_main_account_data{ my $page = new hfparser( DATA=>$main_shabl ); $page->SplitData("#begin#main","#end#main"); $page->deleteBEFORE_AFTER(); $page->add_regesp('{main_menu_body}',get_full_menu(\@ACCOUNTMENU)); $page->add_regesp('{account}',$PAR{account}); $page->add_regesp('{total_prospects}',GetSQLCount("Select * from ${PREF}user WHERE fk_account=?",$PAR{account})); $page->add_regesp('{total_active}',GetSQLCount("Select * from ${PREF}user WHERE fk_account=? AND isact=1",$PAR{account})); $page->add_regesp('{total_inactive}',GetSQLCount("Select * from ${PREF}user WHERE fk_account=? AND isact<>1",$PAR{account})); $page->ParseData; return $page->as_string; } #first for account ########################## sub move_down_field{ sort_fields($PAR{account}); my $el=select_one_db("SELECT * from ${PREF}fields WHERE pk_fields=?",$PAR{reckey}); my $rang=$el->{rang}; my $count= GetSQLCount("SELECT * from ${PREF}fields WHERE fk_account=?",$PAR{account}); if ($rang<$count){ $db->do("UPDATE ${PREF}fields Set rang=$rang WHERE fk_account=? and rang=$rang+1",undef, $PAR{account}); &Error; $db->do("UPDATE ${PREF}fields Set rang=rang+1 WHERE pk_fields=?",undef, $PAR{reckey}); &Error; } sort_fields($PAR{account}); print $q->redirect("$SCRIPT_NAME?ses=$PAR{ses}&act=mainbody&act2=columns&account=$PAR{account}"); exit(); } ####################### sub move_up_field{ sort_fields($PAR{account}); my $el=select_one_db("SELECT * from ${PREF}fields WHERE pk_fields=?",$PAR{reckey}); my $rang=$el->{rang}; my $count= GetSQLCount("SELECT * from ${PREF}fields WHERE fk_account=?",$PAR{account}); if ($rang>1){ $db->do("UPDATE ${PREF}fields Set rang=$rang WHERE fk_account=? and rang=$rang-1",undef, $PAR{account}); &Error; $db->do("UPDATE ${PREF}fields Set rang=rang-1 WHERE pk_fields=?",undef, $PAR{reckey}); &Error; } sort_fields($PAR{account}); print $q->redirect("$SCRIPT_NAME?ses=$PAR{ses}&act=mainbody&act2=columns&account=$PAR{account}"); exit(); } ###################### sub print_users_loadfrom{ my $page = new hfparser( DATA=>$main_shabl ); $page->SplitData("#start#user_loadfrom","#end#user_loadfrom"); add_menu_prospects($page); $page->deleteBEFORE_AFTER; if($PAR{issubmit}){ my $add; $add="AND isact='1'" if ($PAR{activ} eq 'act'); $add="AND isact='0'" if ($PAR{activ} eq 'dis'); my $sql="SELECT * FROM ${PREF}user WHERE fk_account=? $add"; my $out=$db->prepare($sql); $out->execute($PAR{'import'}); my @OUT=(); while (my %output=%{$out->fetchrow_hashref}){ delete($output{pk_user}); $output{fk_account}=$PAR{account}; insert_db("${PREF}user",\%output) unless GetSQLCount("SELECT * FROM ${PREF}user WHERE fk_account=? AND email=?",$PAR{account},$output{email}); } print $q->redirect("$SCRIPT_NAME?ses=$PAR{ses}&act=mainbody&act2=users&account=$PAR{account}"); exit; } $page->add_element("activ","",$LNG{USR_BROWSER_ALL}); $page->add_element("activ", "act", $LNG{USR_BROWSER_ACTIVE}); $page->add_element("activ", "dis", $LNG{USR_BROWSER_INACTIVE}); my $sql="SELECT ${PREF}account.name as name,${PREF}account.pk_account as reckey, count(pk_user) as mycount FROM ${PREF}account LEFT JOIN ${PREF}user ON fk_account=pk_account WHERE pk_account <> ? GROUP BY fk_account HAVING mycount>0"; my $out=$db->prepare($sql); $out->execute($PAR{account}); &Error($sql); unless($out->rows){ $page->SplitData("",""); $page->replaceINSIDE("

    $LNG{USR_BROWSER_CANT_IMPORT}

    "); } while (my %output=%{$out->fetchrow_hashref}){ $page->add_element("import",$output{reckey},"$output{name} [$output{mycount}]"); } $page->ParseData; return $page->as_string; } ###################### sub print_users_export{ my $allcount=GetSQLCount("SELECT * FROM ${PREF}user WHERE fk_account=? AND isact=1",$PAR{account}); my $page = new hfparser( DATA=>$main_shabl ); $page->SplitData("#start#user_export","#end#user_export"); add_menu_prospects($page); $page->deleteBEFORE_AFTER; if($PAR{issubmit}){ my $add; $add="AND isact='1'" if ($PAR{activ} eq 'act'); $add="AND isact='0'" if ($PAR{activ} eq 'dis'); my $sql="SELECT * FROM ${PREF}user WHERE fk_account=? $add"; my $out=$db->prepare($sql); &Error; $out->execute($PAR{account}); &Error; my @OUT=(); while (my %output=%{$out->fetchrow_hashref}){ my $shabl=$PAR{format}; $shabl=~s/TAB/\t/; $shabl=~s/--email--/$output{email}/; $shabl=~s/--name--/$output{name}/; push(@OUT,$shabl); } if ($PAR{to} eq 'file'){ print "Content-type: application/octet-stream\nContent-Disposition: attachment; filename=prospects.txt\n\n"; print join("\n",@OUT); exit; }else{ @OUT=map{sequre($_)}@OUT; $page->SplitData("",""); $page->replaceINSIDE($q->h1("$LNG{USR_BROWSER_EXPORTED} ".$out->rows." $LNG{USR_BROWSER_PROSPECTS}").join("
    \n",@OUT)); } } unless($allcount){ $page->SplitData("",""); $page->replaceINSIDE($q->h1($LNG{USR_BROWSER_CANT_EXPORT})); } $page->add_regesp('{all_count}',$allcount); $page->add_regesp('{account}',$PAR{account}); $page->add_element("activ","",$LNG{USR_BROWSER_ALL}); $page->add_element('activ', 'act', $LNG{USR_BROWSER_ACTIVE}); $page->add_element('activ', 'dis', $LNG{USR_BROWSER_INACTIVE}); $page->add_element("format","--email--",$LNG{USR_BROWSER_EXPORT_EMAIL_ONLY}); $page->add_element("format","--name-- --email--","$LNG{USR_BROWSER_EXPORT_NAME} $LNG{USR_BROWSER_EXPORT_EMAIL}"); $page->add_element("format","<--name--> --email--","<$LNG{USR_BROWSER_EXPORT_NAME}> $LNG{USR_BROWSER_EXPORT_EMAIL}"); $page->add_element("format","\"--name--\" --email--","\"$LNG{USR_BROWSER_EXPORT_NAME}\" $LNG{USR_BROWSER_EXPORT_EMAIL}"); $page->add_element("format","--name--|--email--","$LNG{USR_BROWSER_EXPORT_NAME}|$LNG{USR_BROWSER_EXPORT_EMAIL}"); $page->add_element("format","--name--:--email--","$LNG{USR_BROWSER_EXPORT_NAME}:$LNG{USR_BROWSER_EXPORT_EMAIL}"); $page->add_element("format","--name--,--email--","$LNG{USR_BROWSER_EXPORT_NAME},$LNG{USR_BROWSER_EXPORT_EMAIL}"); $page->add_element("format","--name--TAB--email--","$LNG{USR_BROWSER_EXPORT_NAME}$LNG{USR_BROWSER_EXPORT_EMAIL}"); $page->add_element("to","file",$LNG{USR_BROWSER_EXPORT_FILE}); $page->add_element("to","here",$LNG{USR_BROWSER_EXPORT_PAGE}); $page->set_def("to","here"); $page->ParseData; return $page->as_string; } ####################### sub print_users_bulk{ my $page = new hfparser( DATA=>$main_shabl ); add_menu_prospects($page); my @quer; if ($PAR{issubmit}){ @quer=split(/\n/,$PAR{bulk}); map{s/\s+//g}@quer; map{s/\*/%/g}@quer; my @QUER; foreach(@quer){ push @QUER, $_ if /[a-zA-Z0-9%.\-_@]/ } unless (@QUER){ $page->set_error("bulk",$LNG{USR_BROWSER_BULK_QUERY_INCORRECT}); } @quer=map{"(${PREF}user.email LIKE '\%$_\%')"}@QUER; my $WHERE; if ($PAR{accounts} eq 'all'){ $WHERE=join(" OR ",@quer); }else{ $WHERE="(".join(" OR ",@quer).") AND fk_account='$PAR{account}'"; } unless ($page->is_error){ $page->SplitData("#start#user_confirmbulk","#end#user_confirmbulk"); $page->deleteBEFORE_AFTER; $page->add_regesp('{account}',$PAR{account}); my $sql="SELECT * FROM ${PREF}user WHERE $WHERE"; my $count=GetSQLCount($sql); $page->add_regesp('{countusers}',$count); unless($PAR{issubmit2}){ $page->add_regesp('{status}','will be'); unless($count){ $page->SplitData("",""); $page->deleteINSIDE; } }else{ $page->add_regesp('{status}',''); my @users = @{$db->selectcol_arrayref("select pk_user from ${PREF}user WHERE $WHERE")}; if (@users){ my $in=join ",",@users; $db->do("DELETE FROM ${PREF}user WHERE pk_user IN ($in)"); &Error; $db->do("DELETE FROM ${PREF}doppar WHERE fk_user IN ($in)"); &Error; $db->do("DELETE FROM ${PREF}tosend WHERE fk_user IN ($in)"); &Error; $db->do("DELETE FROM ${PREF}doiaccounts WHERE fk_user IN ($in)"); &Error; $db->do("DELETE FROM ${PREF}sentlog WHERE fk_user IN ($in)"); &Error; $db->do("DELETE FROM ${PREF}link_clicks WHERE fk_user IN ($in)"); &Error; } OPTIMIZEtables(); $page->SplitData("",""); $page->deleteINSIDE; } $page->ParseData; return $page->as_string; } } $page->SplitData("#start#user_bulk","#end#user_bulk"); $page->set_default_input("textarea","rows",12); $page->set_default_input("text","size",3); $page->set_default_input("textarea","columns",55); unless($PAR{issubmit2}){ $page->add_element("accounts","this",$LNG{USR_BROWSER_BULK_CURRENT_ACCOUNT}); $page->add_element("accounts","all",$LNG{USR_BROWSER_BULK_ALL_ACCOUNTS}); } $page->add_regesp('{account}',$PAR{account}); $page->deleteBEFORE_AFTER; $page->ParseData; return $page->as_string; } ####################### sub print_users_import{ my $page = new hfparser( DATA=>$main_shabl ); if ($PAR{issubmit}){ if($PAR{add_to} eq "prospects_active"){ $page->set_error("interval",$LNG{ERROR_NUMBER_REQUIRED}) if ($PAR{interval}=~/[^0-9]/); $page->set_error("interval",$LNG{ERROR_REQUIRED}) if ($PAR{interval} eq ""); } my $days; if($PAR{add_to} eq "prospects_active"){ $days=$PAR{interval}; }else{ $days=-1; } unless ($page->is_error){ my @str; if ($q->param("uploaded_file")){ $fh=$q->upload("uploaded_file") || die "$LNG{ERROR_CANT_UPLOAD_FILE} $!"; @str=<$fh>; chomp(@str); }else{ @str=split(/\n/,$PAR{import}); chomp(@str); } my $i=0; my @errors; my $count=0; my $SubscrMess; if ($CONF{sendsubscr}){ my $messages=select_one_db("SELECT * FROM ${PREF}mess WHERE fk_account=? AND typesend=?",$PAR{account},'subscribe'); $SubscrMess=$messages->{pk_mess}; } foreach (@str){ $i++; s/([a-zA-Z0-9_.\-]+@[a-zA-Z0-9_.\-]+)//; my $mail = lc($1); unless ($mail){ push (@errors, "$LNG{TXT_LINE} $i: $LNG{ERROR_CANT_FIND_EMAIL}"); next; } unless (checkemail($mail)){ push (@errors, "$LNG{TXT_LINE} $i: $LNG{TXT_EMAIL} $mail $LNG{TXT_ISINCORRECT}"); next; } if($CONF{useblacklist}){ if(GetSQLCount("SELECT * FROM ${PREF}bounce_banemails WHERE email=?",$mail)){ push (@errors, "$LNG{TXT_LINE} $i: $LNG{TXT_EMAIL} $mail $LNG{TXT_IS_BOUNSED}") ; next; } } if (GetSQLCount("SELECT * FROM ${PREF}user WHERE email=? AND fk_account=?",$mail,$PAR{account})){ push (@errors, "$LNG{TXT_LINE} $i: $LNG{TXT_EMAIL} $mail $LNG{TXT_IS_EXISTS}"); next; } s/[^A-Za-z.]/ /g; s/^ +//;s/ +$//; while (s/ / /g){} my @words=split(/ /); unless($CONF{no_uppercase}){ @words=map{ucfirst(lc($_))}@words; } $name=join(' ',@words); $count++; $db->do("INSERT INTO ${PREF}user (fk_account,name,email,days,datereg) VALUES (?,?,?,?,$NOW)",undef,$PAR{account},preparename($name,$CONF{no_uppercase}),prepareemail($mail),$days); if ($PAR{sendsubscribe}){ if ($SubscrMess){ my @users = @{$db->selectcol_arrayref("select MAX(pk_user) as max from ${PREF}user WHERE fk_account=$PAR{account}")}; my $maxuser=$users[0]; if ($maxuser){ AddToSend($maxuser,$SubscrMess); } } } &Error; } my $out.=$q->h1("$count $LNG{USR_BROWSER_IMPORT_PROSPADD}."); if (@errors){ $out.=$q->h2(scalar(@errors)." $LNG{USR_BROWSER_IMPORT_ERRORS_DETECTED}"); $out.=join "
    ",@errors; } return $out; } } $page->SplitData("#start#user_import","#end#user_import"); add_menu_prospects($page); $page->set_default_input("textarea","rows",12); $page->set_default_input("text","size",3); $page->set_default_input("textarea","columns",55); $page->set_def("interval",0); $page->add_regesp('{account}',$PAR{account}); $page->deleteBEFORE_AFTER; $page->ParseData; return $page->as_string; next } ###################### sub print_personalize{ my @FIELDS=map{"
  • [ADD$_->{key}] - $_->{name}"}load_account_fields($PAR{account}); my $page = new hfparser( DATA=>$main_shabl, FROM=>'#start#personalize',TO=>'#end#personalize' ); my $additional=""; $additional.="
  • $LNG{MESS_PERS_EXTRA}
      ".join("\n",@FIELDS)."
    " if @FIELDS; opendir(DIR,'templates'); my @templates=grep{ /\.txt$/ } readdir(DIR); my @files=(); map{my $f_name=$_; s/\.txt$//;push(@files,"
  • [LOAD_FROM_FILE_$_] - $LNG{MESS_PERS_LOAD_FROM_FILE} $f_name
  • ")}@templates; $additional.="
  • $LNG{MESS_PERS_NEW}!$LNG{MESS_PERS_LOAD_FROM_TEMPL}\n
      \n\t".join("\n\t",@files)."\n
    " if @templates ; my $sql="SELECT ${PREF}links.pk_link,${PREF}links.name,${PREF}links.redirect_link FROM ${PREF}links LEFT JOIN ${PREF}account ON pk_account=fk_account WHERE pk_account=?"; my $out=$db->prepare($sql); $out->execute($PAR{account}); my @LINKS; while (my $output=$out->fetchrow_hashref){ push(@LINKS,"
  • [LINK$output->{pk_link}] - $LNG{MESS_PERS_REDIR_LINK} $output->{name} $LNG{MESS_PERS_REDIR_LINK_TO} {redirect_link}\" target=\"_blank\">$output->{redirect_link}
  • "); } $additional.="
  • $LNG{MESS_PERS_TRACK}\n
      \n\t".join("\n\t",@LINKS)."\n
    " if @LINKS; $page->add_regesp('{additional}',$additional); $page->ParseData; return $page->as_string; } ###################### sub print_account_newmess{ my @req=qw(subject mess); my $page = new hfparser( DATA =>$main_shabl, ERROR_AFTER_TEMPL=>"    ###ERR###" ); $page->SplitData("#start#user_newmess","#end#user_newmess"); $page->deleteBEFORE_AFTER(); $page->add_regesp('{error_date}',""); if ($PAR{issubmit}){ foreach (@req){ $page->set_error($_,$LNG{ERROR_REQUIRED}) if ($PAR{$_} eq ''); } if ($PAR{typesend} eq 'auto'){ if ($PAR{days}=~/[^0-9]/){ $page->set_error("days",$LNG{ERROR_NUMBER_REQUIRED}); }elsif($PAR{days}>2000){ $page->set_error("days",$LNG{ERROR_TO_BIG}); }else{ $page->set_error("days","$LNG{ERROR_ALREADY_USED}") if GetSQLCount("SELECT * FROM ${PREF}mess WHERE fk_account=? and typesend='auto' AND days=? AND pk_mess<>'$PAR{reckey}'",$PAR{account},$PAR{days}); } } if ($PAR{typesend} eq 'doi'){ $page->set_error('mess',"$LNG{MESS_ERR_CONFIRM}: [CONFIRM_URL]") unless ($PAR{mess}=~/\[CONFIRM_URL\]/) } if ($PAR{typesend} eq 'senddat'){ my ($y,$m,$d)=($PAR{year}-1900,$PAR{month}-1,$PAR{day}); my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime($MY_TIME+60*60*24); my $timelocalsend=timelocal(0,0,0,$d,$m,$y); my $timelocalnow=timelocal(0,0,0,$mday,$mon,$year); $dif = $timelocalsend - $timelocalnow; if ($dif<0){ $page->set_error("day"," "); $page->set_error("month"," "); $page->set_error("year"," "); $page->add_regesp('{error_date}',"$LNG{ERROR_DATE_INCORRECT}"); } } unless ($page->is_error){ my $id; my $days,$datesend; $days=0 unless ($PAR{typesend} eq 'auto'); $days=$PAR{days} if ($PAR{typesend} eq 'auto'); $datesend='' unless ($PAR{typesend} eq 'senddat'); $datesend="$PAR{year}-$PAR{month}-$PAR{day}" if ($PAR{typesend} eq 'senddat'); unless($PAR{reckey}){ $id=insert_db("${PREF}mess",{subject =>$PAR{subject},mess=>$PAR{mess}, type=>$PAR{type},typesend=>$PAR{typesend}, fk_account=>$PAR{account},days=>$days, senddat=>$datesend, priority=>$PAR{priority}, encoding=>$PAR{encoding} }); }else{ update_db("${PREF}mess", {subject =>$PAR{subject},mess=>$PAR{mess}, type=>$PAR{type},typesend=>$PAR{typesend}, fk_account=>$PAR{account},days=>$days, senddat=>$datesend, encoding=>$PAR{encoding}, priority=>$PAR{priority}}, {pk_mess=>$PAR{reckey}} ); $id=$PAR{reckey}; } if ($filename=$q->param('uploaded_file')){ $file=$filename; $file=~s(^.*\\)();$file=~s(^.*/)(); my $data; $fh=$q->upload("uploaded_file"); die ("Can not upload file ".$q->param('uploaded_file')." - not defined filehandle in CGI.pm upload() function $! $@ \n Temp directory is $TempFile::TMPDIRECTORY\n\n") unless $fh; binmode($fh); my $tmpdata; while(sysread $fh,$tmpdata,1024*10){$data.=$tmpdata}; insert_db("${PREF}attach",{filename=>$file,data=>$data,fk_mess=>$id,len=>length($data)}); } print $q->redirect("$SCRIPT_NAME?ses=$PAR{ses}&act=mainbody&act2=mess&account=$PAR{account}"); exit(); } } my $REPL; $page->set_def("days", 0); #DATE my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =localtime($MY_TIME); $year+=1900;$mon++; foreach (1..31){ my $dd=sprintf("%02d",$_); $page->add_element("day",$_,$dd); } $page->set_def("day",$mday); my @month=($LNG{MONTH_1},$LNG{MONTH_2},$LNG{MONTH_3},$LNG{MONTH_4},$LNG{MONTH_5},$LNG{MONTH_6},$LNG{MONTH_7},$LNG{MONTH_8},$LNG{MONTH_9},$LNG{MONTH_10},$LNG{MONTH_11},$LNG{MONTH_12}); foreach (1..12){ $page->add_element("month",$_,$month[$_-1]); } $page->set_def("month",$mon); foreach ($year..$year+3){ $page->add_element("year",$_); } $page->set_def("year",$year); $page->add_element("type","text","TEXT"); $page->add_element("type","html","HTML"); map{$page->add_element('priority',$_,$PRIORITY{$_})}sort keys %PRIORITY; $page->add_element('encoding','',$LNG{TXT_DEFAULT}); map{$page->add_element('encoding',$_,$ENCODINGS{$_});} sort {$ENCODINGS{$a} cmp $ENCODINGS{$b}} keys %ENCODINGS; unless($PAR{reckey}){ $page->add_regesp("{header}",$LNG{MESS_CREATE_NEWMESS}); $page->SplitData("###FORNEW###","###END_FORNEW###"); $REPL= join "",$page->getINSIDE(); $page->add_regesp("{attach}",""); $page->set_def("encoding",$CONF{'defcharset'}); }else{ $page->add_regesp("{header}",$LNG{MESS_EDIT_MESS}); my $mess=load_mess($PAR{reckey}); $page->set_def("subject",$mess->{subject}); $page->set_def("mess",$mess->{mess}); $page->set_def("type",$mess->{type}); $page->set_def("typesend",$mess->{typesend}); $page->set_def("encoding",$mess->{encoding}); $page->set_def("priority",$mess->{priority}); if ($mess->{typesend} eq 'auto'){ $page->SplitData("###FORAUTO###","###END_FORAUTO###"); $REPL= join "",$page->getINSIDE(); $page->set_def("days",$mess->{days}); }elsif($mess->{typesend} eq 'manual' or $mess->{typesend} eq 'senddat' or $mess->{typesend} eq 'sent'){ $PAR{typesend}=$mess->{typesend}; $page->SplitData("###FORDATE###","###END_FORDATE###"); $REPL= join "",$page->getINSIDE(); }else{ $PAR{typesend}=$mess->{typesend}; $page->SplitData("###FORSUBSCR###","###END_FORSUBSCR###"); $REPL= join "",$page->getINSIDE(); } if ($mess->{typesend} eq 'senddat'){ $page->set_def("day",$mess->{n_day}); $page->set_def("month",$mess->{n_month}); $page->set_def("year",$mess->{n_year}); } if ($mess->{typesend} eq 'sent'){ $PAR{typesend}="manual"; } my @attach=map{ "$mess->{ATTACH}{$_}{filename} (". int($mess->{ATTACH}{$_}{len}/100)/10 ."K)". "   $LNG{DELETE}" } keys %{$mess->{ATTACH}}; my $files=join("
    ",@attach); my $att; if ($files){ $att=< $LNG{MESS_ATTACHMENTS}: $files ALL__ } $page->add_regesp("{attach}",$att); # $page->add_regesp("{attach}",$mess->{ATTACH}); } $page->SplitData("###HIDE_ALL###","###END_HIDE_ALL###"); $page->replaceINSIDE($REPL); $page->add_regesp('{account}',$PAR{account}); $page->add_regesp('{personalize}',&print_personalize); $page->set_input("subject", {size=>35}); $page->set_input("days", {size=>4}); $page->set_input("mess", {columns=>70,rows=>30}); $page->add_regesp('{radio_autorespond}',$q->radio_group(-default=>$PAR{typesend},-name=>'typesend',-values=>['auto'],-labels=>{auto=>$LNG{MESS_TYPE_AUTO}})); $page->add_regesp('{radio_manual}',$q->radio_group (-default=>$PAR{typesend},-name=>'typesend',-values=>['manual'],-labels=>{manual=>$LNG{MESS_TYPE_MANUAL}})); $page->add_regesp('{radio_sendatdate}',$q->radio_group (-default=>$PAR{typesend},-name=>'typesend',-values=>['senddat'],-labels=>{senddat=>$LNG{MESS_TYPE_SCHEDULED}})); $page->ParseData; return $page->as_string; } sub print_show_mess{ &printheader; my $mess=load_mess($PAR{mess}); %CONF=loadCONF($PAR{account}); $messtext=$mess->{mess}; $messtext=FillTextFromFile($messtext); $unslink="$CONF{serverurl}register.cgi?em=$user->{email}&act=un&at=$PAR{account}"; if($mess->{type}=~/html/i){ print $messtext; return; } my $page = new hfparser( DATA =>"$SHABL_DIR/preview.html", ); $page->add_regesp('{subject}',sequre($mess->{subject})); $page->add_regesp('{mess}',sequre($messtext)); $page->add_regesp('{link}', $q->a({-href=>get_full_url({act=>'showrfcmess'})},'Switch to RFC mode') ); $page->ParseData; $page->print; } ###################### sub print_getfile{ my $sql="SELECT * from ${PREF}attach WHERE pk_attach=?"; my $out=$db->prepare($sql); $out->execute($PAR{id}); &Error; $output=$out->fetchrow_hashref; print "Content-type: application/octet-stream\nContent-Disposition: attachment; filename=$output->{filename}\n\n"; binmode(STDOUT); print $output->{data}; exit(); } ###################### sub print_delfile{ $db->do("DELETE FROM ${PREF}attach WHERE pk_attach=?",undef,$PAR{id}); print $q->redirect("$SCRIPT_NAME?act=mainbody&account=$PAR{account}&act2=newmess&reckey=$PAR{reckey}&ses=$PAR{ses}"); exit(1); } ###################### ###################### sub print_doimess{ my $mess=select_one_db("SELECT * FROM ${PREF}mess WHERE fk_account=? AND typesend='doi'",$PAR{account}); unless ($mess->{pk_mess}){ my $MESS=<"$MESS",subject=>"Please confirm your subscription",fk_account=>$PAR{account},typesend=>'doi'}); $mess=select_one_db("SELECT * FROM ${PREF}mess WHERE fk_account=? AND typesend='doi'",$PAR{account}); } if ($PAR{act2} eq "preview"){ print $q->redirect("$SCRIPT_NAME?act=showmess&account=$PAR{account}&mess=$mess->{pk_mess}&ses=$PAR{ses}"); }else{ print $q->redirect("$SCRIPT_NAME?act=mainbody&account=$PAR{account}&act2=newmess&reckey=$mess->{pk_mess}&ses=$PAR{ses}"); } exit(1); } ###################### sub print_subsmess{ my $mess=select_one_db("SELECT * FROM ${PREF}mess WHERE fk_account=? AND typesend='subscribe'",$PAR{account}); unless ($mess->{pk_mess}){ insert_db("${PREF}mess",{mess=>"Your message",subject=>"Subscribe message",fk_account=>$PAR{account},typesend=>'subscribe'}); $mess=select_one_db("SELECT * FROM ${PREF}mess WHERE fk_account=? AND typesend='subscribe'",$PAR{account}); } if ($PAR{act2} eq "preview"){ print $q->redirect("$SCRIPT_NAME?act=showmess&account=$PAR{account}&mess=$mess->{pk_mess}&ses=$PAR{ses}"); }else{ print $q->redirect("$SCRIPT_NAME?act=mainbody&account=$PAR{account}&act2=newmess&reckey=$mess->{pk_mess}&ses=$PAR{ses}"); } exit(1); } ####################### sub print_unsubsmess{ my $mess=select_one_db("SELECT * FROM ${PREF}mess WHERE fk_account=? AND typesend='unsubscribe'",$PAR{account}); unless ($mess->{pk_mess}){ insert_db("${PREF}mess",{mess=>"Your message",subject=>"Unsubscribe message",fk_account=>$PAR{account},typesend=>'unsubscribe'}); $mess=select_one_db("SELECT * FROM ${PREF}mess WHERE fk_account=? AND typesend='unsubscribe'",$PAR{account}); } if ($PAR{act2} eq "preview"){ print $q->redirect("$SCRIPT_NAME?act=showmess&account=$PAR{account}&mess=$mess->{pk_mess}&ses=$PAR{ses}"); }else{ print $q->redirect("$SCRIPT_NAME?act=mainbody&account=$PAR{account}&act2=newmess&reckey=$mess->{pk_mess}&ses=$PAR{ses}"); } exit(1); } ######################## sub sendtoadmin{ my $to = shift; my $messid=shift; my $mess=load_mess($messid); $msg = new MIME::Lite From =>"$CONF{fromname} <$CONF{fromemail}> ", To =>"$to", Subject =>$mess->{subject}, Type =>$TYPESEND{$mess->{type}}, Data =>$mess->{mess}; foreach (keys %{$mess->{ATTACH}}){ my($mime)=&mimeformat($mess->{ATTACH}{$_}{filename}); $msg->attach (Type =>$mime->[0], Encoding =>$mime->[1], Filename =>$mess->{ATTACH}{$_}{filename}, Data => $mess->{ATTACH}{$_}{data}, ); } MIMEsendto($to,$msg); } sub preparetodeleteauto{ my $messid=shift; my @messages = @{$db->selectcol_arrayref("select pk_mess from ${PREF}mess WHERE fk_account=$PAR{account} AND typesend = 'auto' ORDER by days ASC")}; &Error; $i=0; my %mess; foreach (@messages){ $mess{$_}=$i; $i++; } my $newmess; if ($mess{$messid}==0){ $newmess='NULL'; }else{ $newmess=$messages[$mess{$messid}-1]; } $db->do("UPDATE ${PREF}user SET messlastsend=$newmess WHERE messlastsend='$messid'"); &Error; } ####################### sub print_account_mess{ my $page = new hfparser( DATA=>$main_shabl ); $page->add_regesp('{start_broadcast}',""); if ($PAR{bnsettings}){ save_config($PAR{account},"sendsubscr",$PAR{sendsubscr}); save_config($PAR{account},"sendunsubscr",$PAR{sendunsubscr}); save_config($PAR{account},"isdoi",$PAR{isdoi}); }elsif($PAR{bnRemoveAuto}){ my @elements=$q->param('selauto'); foreach (@elements){ preparetodeleteauto($_); $db->do("DELETE FROM ${PREF}mess WHERE pk_mess='$_'"); } $db->do("DELETE FROM ${PREF}attach WHERE fk_mess IN (".join(" , ",@elements).")") if @elements; $db->do("DELETE FROM ${PREF}tosend WHERE fk_mess IN (".join(" , ",@elements).")") if @elements; $db->do("DELETE FROM ${PREF}sentlog WHERE fk_mess IN (".join(" , ",@elements).")") if @elements; $db->do("DELETE FROM ${PREF}link_clicks WHERE fk_mess IN (".join(" , ",@elements).")") if @elements; }elsif($PAR{bnRemoveDate}){ my @elements=$q->param('seldate'); $db->do("DELETE FROM ${PREF}mess WHERE pk_mess IN (".join(" , ",@elements).")") if @elements; $db->do("DELETE FROM ${PREF}attach WHERE fk_mess IN (".join(" , ",@elements).")") if @elements; $db->do("DELETE FROM ${PREF}tosend WHERE fk_mess IN (".join(" , ",@elements).")") if @elements; $db->do("DELETE FROM ${PREF}sentlog WHERE fk_mess IN (".join(" , ",@elements).")") if @elements; $db->do("DELETE FROM ${PREF}link_clicks WHERE fk_mess IN (".join(" , ",@elements).")") if @elements; }elsif($PAR{bnBroadkast}){ $page->add_regesp('{start_broadcast}',"

    $LNG{MESS_BROADCAST_STARTED}

    "); my @elements=$q->param('seldate'); if (@elements){ $db->do("UPDATE ${PREF}mess set issendnow=1 WHERE pk_mess IN(".join(" , ",@elements).")"); &Error; } }elsif($PAR{bnClearTosent}){ my @elements=$q->param('selsent'); if (@elements){ $db->do("DELETE FROM ${PREF}tosend WHERE fk_mess IN (".join(" , ",@elements).")") if @elements; } }elsif($PAR{bnMoveNotSent}){ my @elements=$q->param('selsent'); my $mess; $db->do("DELETE FROM ${PREF}tosend WHERE fk_mess IN (".join(" , ",@elements).")") if @elements; foreach $mess(@elements){ update_db("${PREF}mess",{typesend=>'manual',senddat=>''},{pk_mess=>$mess}); } }elsif($PAR{SEND}){ $page->set_error("sendto",$LNG{ERROR_EMAIL_INCORRECT}) unless (checkemail($PAR{sendto},0)); unless ($page->is_error()){ my @elements=$q->param('selsent'); @elements=(@elements,$q->param('seldate')); @elements=(@elements,$q->param('selauto')); foreach (@elements){ sendtoadmin($PAR{sendto},$_); } } } my $messtosend = GetSQLCount("SELECT * FROM ${PREF}mess WHERE fk_account=? and typesend<>'subscribe' AND typesend<>'subscribe'",$PAR{account}); unless($messtosend){ $page->SplitData("",""); $page->replaceINSIDE(""); } $page->SplitData("#start#user_mess","#end#user_mess"); $page->deleteBEFORE_AFTER(); $page->set_def("sendsubscr",$CONF{sendsubscr}); $page->set_def("sendunsubscr",$CONF{sendunsubscr}); $page->set_def("isdoi",$CONF{isdoi}); ############# $automessages=GetSQLCount("SELECT * FROM ${PREF}mess WHERE fk_account=? and typesend='auto'",$PAR{account}); $page->add_regesp('{autocount}',$automessages); if ($automessages){ my $sql="SELECT pk_mess,subject,sent,days,sent FROM ${PREF}mess WHERE fk_account=? and typesend='auto' ORDER by days ASC"; my $out=$db->prepare($sql); $out->execute($PAR{account}); my $Auto; while (my %output=%{$out->fetchrow_hashref}){ map{$output{$_}=sequre($output{$_})}keys %output; my $attach=load_mess_attachment($output{pk_mess}); my @att=map{"$attach->{$_}{filename}(". int(length($attach->{$_}{data})/100)/10 ."K)"} keys %$attach; my $att=join " ",@att; $Auto.=< $output{subject} $att $output{sent} $output{days} $LNG{MESS_PREVIEW} ALL__ } $page->add_regesp("",$Auto); }else{ $page->SplitData("",""); $page->replaceINSIDE(""); } ################ $datemessages=GetSQLCount("SELECT * FROM ${PREF}mess WHERE fk_account=? and (typesend='senddat' OR typesend='manual' OR typesend='sent')",$PAR{account}); $page->add_regesp('{datecount}',$datemessages); if ($datemessages){ my $sql="SELECT pk_mess,subject,sent,days,sent,DATE_FORMAT(senddat, '%Y-%b-%d' ) as senddat FROM ${PREF}mess WHERE fk_account=? and (typesend='senddat' OR typesend='manual' OR typesend='sent') ORDER by senddat ASC"; my $out=$db->prepare($sql); $out->execute($PAR{account}); my $Auto; while (my %output=%{$out->fetchrow_hashref}){ map{$output{$_}=sequre($output{$_})}keys %output; my $attach=load_mess_attachment($output{pk_mess}); my @att=map{"$attach->{$_}{filename}(". int(length($attach->{$_}{data})/100)/10 ."K)"} keys %$attach; my $att=join " ",@att; my $tosent=GetSQLCount("SELECT * FROM ${PREF}tosend WHERE fk_mess=?",$output{pk_mess}); $Auto.=< $output{subject} $att $output{senddat} $tosent $output{sent} $LNG{MESS_PREVIEW} ALL__ } $page->add_regesp("",$Auto); }else{ $page->SplitData("",""); $page->replaceINSIDE(""); } $page->set_def("sendto",$CONF{adminemail}); $page->add_regesp('{account}',$PAR{account}); $page->ParseData; return $page->as_string; } sub print_changelink{ my $page=new hfparser ( DATA=>$links_shabl, FROM=>'#start#formlinks',TO=>'#end#formlinks' ); my $link; my $is_new; if($PAR{id}){ $link=select_one_db("SELECT * FROM ${PREF}links WHERE pk_link=?",$PAR{id}); unless($link->{pk_link}){ $PAR{id}=""; $page->Hide(''); $is_new=1; }else{ $is_new=0; $page->add_regesp('{name_link}',$link->{name}); $page->set_def('name',$link->{name}); $page->set_def('url',$link->{redirect_link}); $page->Hide(''); } }else{ $page->Hide(''); $page->set_def('url','http://'); $is_new=1; } if($PAR{issubmit}){ map{$page->set_error($_,$LNG{ERROR_REQUIRED}) unless(length $PAR{$_})}qw(name url); $page->set_error('url',$LNG{ERROR_URL_INCORRECT}) unless check_url($PAR{url}); unless($page->is_error){ if($is_new){ insert_db("${PREF}links",{name=>$PAR{name},redirect_link=>$PAR{url},fk_account=>$PAR{account}}); &Error; }else{ update_db("${PREF}links",{name=>$PAR{name},redirect_link=>$PAR{url}},{pk_link=>$PAR{id}}); } print $q->redirect("$SCRIPT_NAME?act=$PAR{act}&account=$PAR{account}&act2=links&ses=$PAR{ses}"); exit; } } $page->ParseData; return $page->as_string; } sub prepare_long_name{ my $txt=shift; if (length($txt)>25){ return substr($txt,0,25)."..."; }else{ return $txt; } } sub print_links_mesrospects{ my $is_prospects=shift; my $page= new repparser( DATA=>$links_shabl, FROM=>'#start#prospects',TO=>'#end#prospects' ); $page->set_input("emailsearch", {size=>25}); if ($is_prospects){ $page->Hide(''); }else{ $page->Hide(''); } my $out1=$db->prepare("SELECT DISTINCT DATE_FORMAT( timestamp, '%M, %Y' ) as m FROM `${PREF}link_clicks` LEFT JOIN ${PREF}mess ON pk_mess = fk_mess WHERE ${PREF}mess.fk_account=?") ; $out1->execute($PAR{account}); $page->add_element('dateselect','',$LNG{LINKS_ALL_MONTH}); while (my $row=$out1->fetchrow_hashref){ $page->add_element('dateselect',$row->{m},$row->{m}); } my $out1=$db->prepare("SELECT pk_mess, subject FROM `${PREF}link_clicks` LEFT JOIN ${PREF}mess ON pk_mess = fk_mess WHERE ${PREF}mess.fk_account=? GROUP by pk_mess") ; $out1->execute($PAR{account}); $page->add_element('message','',$LNG{LINKS_ALL_MESS}); &Error; while (my $row=$out1->fetchrow_hashref){ $page->add_element('message',$row->{pk_mess},prepare_long_name($row->{subject})); } my $out1=$db->prepare("SELECT ${PREF}links.pk_link as pk_link, ${PREF}links.name AS name, redirect_link as url FROM `${PREF}link_clicks` LEFT JOIN ${PREF}mess ON pk_mess = fk_mess LEFT JOIN ${PREF}links ON fk_link=pk_link WHERE ${PREF}mess.fk_account=? GROUP by pk_link") ; $out1->execute($PAR{account}); $page->add_element('link','',$LNG{LINKS_ALL_LINKS}); &Error; while (my $row=$out1->fetchrow_hashref){ $page->add_element('link',$row->{pk_link},prepare_long_name("$row->{name} ($row->{url})")); } my @WHERE; push @WHERE,"${PREF}mess.fk_account=?"; push(@WHERE,'DATE_FORMAT( '.$PREF.'link_clicks.timestamp, \'%M, %Y\' ) = '.$db->quote($PAR{dateselect})) if($PAR{dateselect}); push(@WHERE,"pk_mess=".$db->quote($PAR{message})) if $PAR{message}; push(@WHERE,"pk_link=".$db->quote($PAR{'link'})) if $PAR{'link'}; push(@WHERE,"email LIKE(".$db->quote('%'."$PAR{'emailsearch'}".'%').")") if $PAR{'emailsearch'}; my $where="WHERE ".join("\n AND ",@WHERE) if @WHERE; my $sql; if($is_prospects){ $sql=<prepare($sql) ; $out1->execute($PAR{account}); &Error($sql); my $total_clicks=0; while (my $row=$out1->fetchrow_hashref){ $row->{url_search}=get_links_stat_link('clicks',$PAR{message},$PAR{'link'},$row->{email}); if($row->{pk_user}){ $row->{url}=qq|$LNG{TXT_VIEW}>>>|; }else{ $row->{url}=" "; } $page->AddRow($row); $total_clicks+=$row->{clicks}; } $page->add_regesp('{total_clicks}',$total_clicks); $page->ParseData; return $page->as_string; } sub print_links_mess{ my $where; if ($PAR{dateselect}){ $where=' AND DATE_FORMAT( timestamp, \'%M, %Y\' ) LIKE '.$db->quote($PAR{dateselect}); } my $sql=<prepare($sql); $out->execute($PAR{account}); return qq|

    No logs found

    | unless $out->rows(); my $sql=<prepare($sql); $out2->execute($PAR{account}); while(my $row=$out2->fetchrow_hashref){ $mess{$row->{messID}}[1]=$row->{prospects}; } my $page=new hfparser( DATA=>$links_shabl, FROM=>'#start#statmess',TO=>'#end#statmess' ); my $out1=$db->prepare("SELECT DISTINCT DATE_FORMAT( timestamp, '%M, %Y' ) as m FROM `${PREF}link_clicks` LEFT JOIN ${PREF}mess ON pk_mess = fk_mess WHERE ${PREF}mess.fk_account=?") ; $out1->execute($PAR{account}); $page->add_element('dateselect','',$LNG{LINKS_ALL_MONTH}); while (my $row=$out1->fetchrow_hashref){ $page->add_element('dateselect',$row->{m},$row->{m}); } my $add; $add=" ($PAR{dateselect})" if ($PAR{dateselect}); my $ouput=<$LNG{LINKS_MESSAGES_LINKS_ACT}$add
    ALL__ my $messnow=undef; my $totalClicks=0; while (my $row=$out->fetchrow_hashref){ if($row->{messID} != $messnow){ my $l_p=get_links_stat_link('prospects',$row->{messID},undef); my $l_c=get_links_stat_link('clicks',$row->{messID},undef); $ouput.=< ALL__ $messnow=$row->{messID}; } my $l_p=get_links_stat_link('prospects',$row->{messID},$row->{linkID}); my $l_c=get_links_stat_link('clicks',$row->{messID},$row->{linkID}); $ouput.=< ALL__ $totalClicks+=$row->{clicks}; $mess{$row->{messID}}[0]+=$row->{clicks}; } map{$ouput=~s/###CL$_#/$mess{$_}[0]/}keys %mess; my $sql=<
    $LNG{USR_SENT_MESSAGE} $LNG{ACCOUNTMENU_LINK} $LNG{STATMENU_TOTALS_PROSPECTS} $LNG{CLICKS}
    $row->{subject} $mess{$row->{messID}}[1]... ###CL$row->{messID}#...
      $row->{linkname} $row->{url} $row->{prospects}... $row->{clicks}...
    $LNG{STAT_TOTAL}: $total->{prospects}... $totalClicks...
    ALL__ $page->add_regesp('{report}',$ouput); $page->ParseData; return $page->as_string; } sub get_links_stat_link{ my %p=%PAR; $p{modelog}=shift; $p{'message'}=shift; $p{'link'}=shift; my $email=shift; $p{emailsearch} = $email if $email; return "$SCRIPT_NAME?".join("&",map{"$_=$p{$_}"}keys%p); } sub print_links{ if ($PAR{modelog} eq 'mess'){ return &print_links_mess; }elsif($PAR{modelog} eq 'prospects'){ return &print_links_mesrospects(1); }elsif($PAR{modelog} eq 'clicks'){ return &print_links_mesrospects(0); } my $page=new repparser ( DATA=>$links_shabl, FROM=>'#start#links',TO=>'#end#links' ); if($PAR{'act3'} eq 'clean' && $PAR{id}){ $db->do("DELETE FROM ${PREF}link_clicks WHERE fk_link=?",undef,$PAR{id}); &Error("Deleting links clicks"); OPTIMIZEtables(); print $q->redirect("$SCRIPT_NAME?act=$PAR{act}&account=$PAR{account}&act2=$PAR{act2}&ses=$PAR{ses}"); exit; } if($PAR{'delete'}){ my @ID=$q->param('id'); if(@ID){ @ID=map{$db->quote($_)}@ID; my $in=join(" , ",@ID); $db->do("DELETE FROM ${PREF}links WHERE pk_link IN ($in)"); &Error("Deleting links"); $db->do("DELETE FROM ${PREF}link_clicks WHERE fk_link IN ($in)"); &Error("Deleting links clicks"); OPTIMIZEtables(); } print $q->redirect("$SCRIPT_NAME?act=$PAR{act}&account=$PAR{account}&act2=$PAR{act2}&ses=$PAR{ses}"); exit; } my $sql="SELECT * FROM ${PREF}links WHERE fk_account=? ORDER BY pk_link"; my $out=$db->prepare($sql); $out->execute($PAR{account}); &Error($sql); my $all_count=0; while (my $output=$out->fetchrow_hashref){ my $c=select_one_db("SELECT count(pk_link_click) AS count FROM ${PREF}link_clicks WHERE fk_link=?",$output->{pk_link}); my $count=$c->{count} || 0; $all_count+=$count; my $u=select_one_db("SELECT count(DISTINCT fk_user) AS count FROM ${PREF}link_clicks WHERE fk_link=?",$output->{pk_link}); my $u_count=$u->{count} || 0; my $l="{pk_link}\" title=\"$LNG{LINKS_CHANGE_LINK} $output->{name}\">$LNG{LINKS_CHANGE}"; my $l_cl=' '; $l_cl=qq|clean| if $count; $page->AddRow({ id=>$output->{pk_link}, name=>$output->{name}, url=>$output->{redirect_link}, clicks=>$count, users=>$u_count, 'link'=>$l, clean=>$l_cl }); } my $u=select_one_db("SELECT count(DISTINCT fk_user) AS count FROM ${PREF}link_clicks LEFT JOIN ${PREF}links ON pk_link=fk_link WHERE fk_account=? GROUP BY fk_user",$PAR{account}); my $u_count=$u->{count} || 0; $page->add_regesp('{users}',$u_count); $page->add_regesp('{clicks}',$all_count); $page->ParseData; return $page->as_string; } ####################### sub print_account_page{ my %map; %map=( "" =>\&print_main_account_data, columns =>\&print_columns, mess =>\&print_account_mess, newmess =>\&print_account_newmess, users =>\&print_users, 'bulk' =>\&print_users_bulk, 'import' =>\&print_users_import, 'export' =>\&print_users_export, 'loadfrom'=>\&print_users_loadfrom, userform =>\&print_user_form, fieldform=>\&print_field_form, delfield =>\&delete_field, up =>\&move_up_field, down =>\&move_down_field, config =>\&print_config, links =>\&print_links, changelink =>\&print_changelink ); $main_page=new dparser( DATA=>"$SHABL_DIR/main-shabl.html" ); #$main_page->add_regesp('{account_name}',$q->a({href=>get_full_url({act2=>""})},$ACCOUNT{$PAR{account}})); $main_page->add_regesp('{account_name}', "$ACCOUNT{$PAR{account}}" ); $main_page->add_regesp('{account_nm}',"$ACCOUNT{$PAR{account}}"); my $meta = < ALL__ $meta="" unless $CONF{defcharset}; $main_page->add_regesp('{__META__}',$meta); $main_page->add_regesp('{account}',$PAR{account}); #$main_page->add_regesp('{main_menu}',get_account_menu(\@ACCOUNTMENU)); $main_page->add_regesp('{main_menu}', get_hor_menu(\@ACCOUNTMENU,{ses=>$PAR{ses},act=>$PAR{act},act2=>$PAR{act2},account=>$PAR{account}},[['menu','menuACT'],['menu2','menu2ACT']])); #$main_page->add_regesp('{main_menu_body}',get_full_menu(\@ACCOUNTMENU)); my $func_ref; if ($map{$PAR{act2}}) { $func_ref=$map{$PAR{act2}}; }else{ $func_ref=sub{return $q->h1("Please do not experiment whith URL")} } $main_page->add_regesp('{body}',&$func_ref); $main_page->ParseData; &printheader; $main_page->print; } #################### sub print_main{ unless(exists($ACCOUNT{$PAR{account}})){ # &printheader; print $q->redirect("http://www.silihost.hu/autoresponder.html"); exit; # &printheader; # my $page=new dparser( # DATA=>"$SHABL_DIR/first.html" # ); # $page->add_regesp('###VERSION##',''); # $page->ParseData; # $page->print; }else{ &print_account_page; } } ######################### ###accounts sub DublicateAccountTable{ my $table=shift; my $old_account=shift; my $new_account=shift; my $p_key=shift; my $f_key=shift; my $h_where=shift; my @where=@{$h_where}; push @where,"$f_key=?"; my $WHERE; $WHERE="WHERE ".join(" AND ",@where) if @where; my $sql="SELECT * FROM $table $WHERE "; my $out=$db->prepare($sql); $out->execute($old_account); &Error($sql); while (my %output=%{$out->fetchrow_hashref}){ delete($output{$p_key}); $output{$f_key}=$new_account; insert_db("$table",\%output); } } #################### sub InsertNewAccount{ my $name=shift; my $target=shift; my $count=insert_db("${PREF}account",{name=>sequre($name),isact=>1}); if ($PAR{target}){ DublicateAccountTable("${PREF}conf",$PAR{target},$count,undef,"fk_account"); DublicateAccountTable("${PREF}fields",$PAR{target},$count,"pk_fields","fk_account"); DublicateAccountTable("${PREF}mess",$PAR{target},$count,"pk_mess","fk_account"); } print $q->redirect("$SCRIPT_NAME?ses=$PAR{ses}&act=account"); exit(1); } ###################### sub DeleteAccounts{ return unless $q->param('reckey'); my @keys=$q->param('reckey'); @keys=map{$db->quote($_)}@keys; my $accounts="(".join(",",@keys).")"; $db->do("DELETE FROM ${PREF}account WHERE pk_account in $accounts"); &Error("DELETE FROM ${PREF}account WHERE pk_account in $accounts"); $db->do("DELETE FROM ${PREF}user WHERE fk_account in $accounts"); &Error("DELETE FROM ${PREF}user WHERE fk_account in $accounts"); my $ary_ref = $db->selectcol_arrayref("select pk_mess from ${PREF}mess WHERE fk_account in $accounts"); &Error("select pk_mess from ${PREF}mess WHERE fk_account in $accounts"); $db->do("DELETE FROM ${PREF}attach WHERE fk_mess in (".join(",",@{$ary_ref}).")") if @{$ary_ref}; $db->do("DELETE FROM ${PREF}tosend WHERE fk_mess in $accounts"); &Error("DELETE FROM ${PREF}tosend WHERE fk_mess in $accounts"); $db->do("DELETE FROM ${PREF}mess WHERE fk_account in $accounts"); &Error("DELETE FROM ${PREF}mess WHERE fk_account in $accounts"); $db->do("DELETE FROM ${PREF}conf WHERE fk_account in $accounts"); &Error("DELETE FROM ${PREF}conf WHERE fk_account in $accounts"); my $ary_ref = $db->selectcol_arrayref("select pk_fields from ${PREF}fields WHERE fk_account in $accounts"); &Error; $db->do("DELETE FROM ${PREF}doppar WHERE fk_fields in (".join(",",@{$ary_ref}).")") if @{$ary_ref}; &Error("DELETE FROM ${PREF}doppar WHERE fk_fields in (".join(",",@{$ary_ref}).")"); my $ary_ref = $db->selectcol_arrayref("select pk_link from ${PREF}links WHERE fk_account in $accounts"); &Error; $db->do("DELETE FROM ${PREF}link_clicks WHERE fk_link in (".join(",",@{$ary_ref}).")") if @{$ary_ref}; &Error("DELETE FROM ${PREF}link_clicks WHERE fk_link in (".join(",",@{$ary_ref}).")"); $db->do("DELETE FROM ${PREF}links WHERE fk_account in $accounts"); &Error("DELETE FROM ${PREF}links WHERE fk_account in $accounts"); OPTIMIZEtables(); print $q->redirect("$SCRIPT_NAME?ses=$PAR{ses}&act=account"); exit(1); } ################### sub OPTIMIZEtables{ foreach(@backup_tables){ $db->do("OPTIMIZE TABLE ${PREF}$_"); &Error; } } ###################### sub InverseStatusAccounts{ return unless $q->param('reckey'); my @keys=$q->param('reckey'); foreach my $key(@keys){ $db->do("UPDATE ${PREF}account SET isact=IF(isact=0,1,0) WHERE pk_account=$key"); &Error; } print $q->redirect("$SCRIPT_NAME?ses=$PAR{ses}&act=account"); exit(1); } #################### sub print_account{ my %error; if ($PAR{bn_new}){ my $count = GetSQLCount("SELECT * from ${PREF}account WHERE name=?",sequre($PAR{name})); if ($count){ $error{name}="$LNG{ACCOUNT_EXISTS}"; }elsif(length($PAR{name})<3 or length($PAR{name})>30){ $error{name}="$LNG{ACCOUNT_INVALID_NAME}"; }else{ &InsertNewAccount($PAR{name},$PAR{target}); } } if ($PAR{bn_delete}){ DeleteAccounts(); } if ($PAR{bn_inverse}){ InverseStatusAccounts(); } &printheader; my %input,@val,%discr; push (@val,0); $discr{0}="--blank--"; foreach (sort {$a<=>$b} keys %ACCOUNT){ push (@val,$_); $discr{$_}=$ACCOUNT{$_}; } $input{target}={default=>"0",values=>\@val,labels=>\%discr}; $input{name}={size=>8,maxlength=>30}; my $page=new hfparser DATA=>"$SHABL_DIR/accounts.html", INPUT=>\%input, ERROR=>\%error ; local $OUT; $page->add_regesp('{account_broser}',&show_account_browser); &check_for_holes($page,'{ATTANTION}'); $page->set_def(name=>"new_act"); $page->ParseData; $page->print; } #################### sub show_account_browser{ my $sql="SELECT * from ${PREF}account ORDER by name asc"; my $out1=$db->prepare($sql); $out1->execute(); if($out1->rows<1){ return "

    $LNG{ACCOUNT_NO_ACCOUNTS}

    " ; } #return "Shet i'm here"; my $OUT=< $LNG{ACCOUNT_YOUR_ACCOUNTS}: ALL__ while (my %output=%{$out1->fetchrow_hashref}){ my $status; $status=" ($LNG{ACCOUNT_DISABLED})" if ($output{isact}==0); $OUT.=< $output{name}$status ALL__ } $OUT.=<

    ALL__ return $OUT; } sub check_for_holes{ my ($page,$regesp)=@_; my @files=(); my @files=; push(@files, 'install.cgi' ) if -f 'install.cgi'; if (@files){ my @badfileslist=map{"
  • $_\n"}@files; $page->add_regesp($regesp,$LNG{ATTANTIONFILES1}.join(" ",@badfileslist).$LNG{ATTANTIONFILES2}); }else{ $page->add_regesp($regesp,""); } } #################### #end accounts #################### sub print_frameset{ &printheader; my $page=new dparser DATA=>"$SHABL_DIR/mainframe.html" ; $page->ParseData; $page->print; } ##################### #end mapping functions #####################