From: safir <safir> Date: Sun, 7 Dec 2008 12:14:28 +0000 (+0000) Subject: Исправил проблему с автоматическим созданием при его открытии, если файл до X-Git-Url: http://wagner.pp.ru/gitweb/?a=commitdiff_plain;h=84f3d2ff0f9e887c82ce68e44a469bb4ea12a987;p=oss%2Fstilllife.git Исправил проблему с автоматическим созданием при его открытии, если файл до этого не существовал. Реализовано заменой "open" на "sysopen" с флагом O_CREATE. --- diff --git a/forum/forum b/forum/forum index a1d6137..8e43e56 100755 --- a/forum/forum +++ b/forum/forum @@ -1,16 +1,16 @@ #!/usr/bin/perl -T # -# Stil Life forum. Copyright (c) by Victor B. Wagner, 2008 +# Stil Life forum. Copyright (c) by Victor B. Wagner, 2008 # This program distributed under GNU Affero General Public License v3 or # above # http://www.gnu.org/licenses/agpl.html # # ÐкÑаÑÑе: ÐÑли Ð²Ñ Ð¸ÑполÑзÑеÑе ÑÑÐ¾Ñ ÑкÑÐ¸Ð¿Ñ Ð½Ð° Ñвоем ÑайÑе, ÐÑ Ð¾Ð±ÑÐ·Ð°Ð½Ñ # ÑделаÑÑ Ð´Ð¾ÑÑÑпнÑм его иÑÑ Ð¾Ð´Ð½Ñй ÑекÑÑ. Ð ÑаÑÑноÑÑи, еÑли ÐÑ Ð²Ð½ÐµÑли -# какие-либо изменениÑ, Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑÑи Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¾Ð¿ÑбликоваÑÑ. -# +# какие-либо изменениÑ, Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑÑи Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¾Ð¿ÑбликоваÑÑ. +# # Home site of this program http://vitus.wagner.pp.ru/stilllife -# +# use strict; use warnings; use Carp; @@ -26,7 +26,7 @@ use POSIX; use LWP::UserAgent; use Net::OpenID::Consumer; # -# ÐÐ°Ð±Ð¾Ñ Ð¿Ð¾Ð´Ð´ÐµÑживаемÑÑ Ð´ÐµÐ¹ÑÑвий. Ð¥ÑÑ Ð²Ð¸Ð´Ð° +# ÐÐ°Ð±Ð¾Ñ Ð¿Ð¾Ð´Ð´ÐµÑживаемÑÑ Ð´ÐµÐ¹ÑÑвий. Ð¥ÑÑ Ð²Ð¸Ð´Ð° # "Ð¸Ð¼Ñ Ð¿Ð¾Ð»Ñ Ð² запÑоÑе" => "ÑÑнкÑÐ¸Ñ Ð¾Ð±ÑабоÑÑик" # my @actions = ( @@ -43,7 +43,7 @@ my @actions = ( {name=>"profile",POST=>\&profile,GET=>\&show_profile,rights=>"normal"}, {name=>"setrights",POST=>\&set_rights,GET=>\&show_rights,rights=>"admin"}, {name=>"reapply",POST=>\&apply_templates,GET=>\&apply_templates,rights=>"admin"} -); +); # our $path_translated; # Untainted value of PATH_TRANSLATED env var my $cgi = new CGI; @@ -57,28 +57,28 @@ for my $action (@actions) { if ($cgi->param($action->{name})) { if (allow_operation($action,$cgi,$forum)) { $action->{$method}->($action->{name},$cgi,$forum); - } elsif (!$forum->{"authenticated"}) { + } elsif (!$forum->{"authenticated"}) { $cgi->param("returnto",$cgi->url(-full=>1)); show_template("login",$cgi,$forum); } else { show_error($forum,"У ÐÐ°Ñ Ð½ÐµÑ Ð¿Ñав на вÑполнение ÑÑой опеÑаÑии") } } -} +} if (index($path_translated,$forum->{userdir})==0) { show_user_page($cgi,$forum); -} +} show_error($forum,"ÐекоÑÑекÑнÑй вÑзов ÑкÑипÑа. ÐÑÑÑÑÑÑвÑÐµÑ Ð¿Ð°ÑамеÑÑ Ð´ÐµÐ¹ÑÑвиÑ"); - -#-------------------------------------------------------------- + +#-------------------------------------------------------------- #-------- ЧÑение конÑигÑÑаÑионного Ñайла и ÑвÑзаннÑе Ñ ÑÑим дейÑÑÐ²Ð¸Ñ -#------------------------------------------------------------------ +#------------------------------------------------------------------ # # ÐÑеобÑазование пÑÑи в Ñайловой ÑиÑÑеме ÑеÑвеÑа в пÑÑÑ Ð² URL -# +# sub dir2url { my ($cgi,$dir) = @_; my $prefix=""; @@ -93,7 +93,7 @@ sub dir2url { алгоÑиÑм пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð¸ÑекÑоÑи в URL\n". "PATH_INFO=$ENV{PATH_INFO}\n". "PATH_TRANSLATER=$ENV{'PATH_TRANSLATED'}"); - } + } my $root = substr($ENV{'PATH_TRANSLATED'},0,$pos); if (substr($dir,0,length($root)) ne $root) { show_error({},"ÐÑибка конÑигÑÑаÑии ÑоÑÑма. Ðе ÑдаеÑÑÑ Ð¿ÑеобÑазоваÑÑ @@ -104,7 +104,7 @@ sub dir2url { return $prefix.substr($dir,length($root)); } # -# ÐоиÑк Ñайла .forum ввеÑÑ Ð¿Ð¾ деÑÐµÐ²Ñ Ð¾Ñ $path_translated +# ÐоиÑк Ñайла .forum ввеÑÑ Ð¿Ð¾ деÑÐµÐ²Ñ Ð¾Ñ $path_translated # ÐнаÑение PATH_TRANSLATED ÑÑиÑаем безопаÑнÑм - Ð½Ð°Ñ web-ÑеÑÐ²ÐµÑ Ð½Ð°Ð¼ не # вÑаг. # ÐозвÑаÑÐ°ÐµÑ ÑпиÑок имÑ,знаÑение, имÑ, знаÑение коÑоÑÑй пÑививаеÑÑÑ Ð² @@ -121,51 +121,51 @@ sub get_forum_config { while (<F>) { s/#.*$//; #Drop comments; $config{$1}=$2 if /(\w+)\s*=\s*(\S.*)$/; - } + } close F; # # ÐеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ forumtop - ÑÑо URL Ñого меÑÑа, где Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ # Ñайл .forum - + $config{"forumtop"} = dir2url($cgi,join("/",@path)); $config{"forumroot"} = join("/",@path); # ÐÑли в конÑиге оÑÑÑÑÑÑвÑÐµÑ Ð¿ÐµÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ templates, но # ÑÑдом Ñ ÐºÐ¾Ð½Ñигом пÑиÑÑÑÑÑвÑÐµÑ Ð´Ð¸ÑекÑоÑÐ¸Ñ templates, # Ñо ÑÐ°Ð±Ð»Ð¾Ð½Ñ Ñам. # - if (! exists $config{"templates"} + if (! exists $config{"templates"} && -d (my $filename = join("/",@path,"templates"))) { $config{"templates"} = $filename; - } + } $config{"templatesurl"} = dir2url($cgi,$config{"templates"}) unless exists $config{"templatesurl"}; - # + # # То же Ñамое - паÑамеÑÑ userdir и диÑекÑоÑÐ¸Ñ users # - if (! exists $config{"userdir"} + if (! exists $config{"userdir"} && -d (my $filename = join("/",@path,"users"))) { $config{"userdir"} = $filename; - } + } $config{"userurl"} = dir2url($cgi,$config{"userdir"}); # - # ÐÑли Ð½ÐµÑ ÑÑÑлки в конÑиге на Ñайл паÑолей или он не + # ÐÑли Ð½ÐµÑ ÑÑÑлки в конÑиге на Ñайл паÑолей или он не # ÑÑÑеÑÑвÑеÑ, вÑдаем оÑибкÑ. С оÑоÑомлением, Ñак как ÑÐ°Ð±Ð»Ð¾Ð½Ñ # Ñ Ð½Ð°Ñ Ñже еÑÑÑ if (!exists $config{"datadir"}) { show_error(\%config,"РконÑигÑÑаÑии ÑоÑÑма не Ñказана - диÑекÑоÑÐ¸Ñ Ð´Ð°Ð½Ð½ÑÑ "); + диÑекÑоÑÐ¸Ñ Ð´Ð°Ð½Ð½ÑÑ "); exit; } if (!-d $config{"datadir"}) { - show_error(\%config,"РконÑигÑÑаÑии ÑоÑÑма Ñказана неÑÑÑеÑÑвÑÑÑÐ°Ñ Ð´Ð¸ÑекÑоÑÐ¸Ñ Ð´Ð°Ð½Ð½ÑÑ "); + show_error(\%config,"РконÑигÑÑаÑии ÑоÑÑма Ñказана неÑÑÑеÑÑвÑÑÑÐ°Ñ Ð´Ð¸ÑекÑоÑÐ¸Ñ Ð´Ð°Ð½Ð½ÑÑ "); exit; } # # ÐекоÑоÑÑе ÑмолÑÐ°Ð½Ð¸Ñ # - $config{"authperiod"}="+1M" if (! exists $config{"authperiod"}); + $config{"authperiod"}="+1M" if (! exists $config{"authperiod"}); $config{"renewtime"} = "86000" if (!exists $config{"renewtime"}); $config{"replies_per_page"} = 50 if (!exists $config{"replies_per_page"}); $config{"indexfile"} = "index.html" if (!exists $config{"indexfile"}); @@ -182,7 +182,7 @@ sub get_forum_config { "<p>ХвоÑÑ URL, ÑказаннÑй пÑи вÑзове ÑкÑипÑа показÑÐ²Ð°ÐµÑ Ð½Ðµ на ÑоÑÑм</p>", # To make IE think this page is user friendly - "<!--",("X" x 512),"--></body></html>\n"; + "<!--",("X" x 512),"--></body></html>\n"; exit; } # @@ -209,19 +209,19 @@ sub show_error { print "<html><head><title>ÐÑибка конÑигÑÑаÑии ÑоÑÑма</title></head>", "<body><h1>ÐÑибка конÑигÑÑаÑии ÑоÑÑма</h1><p>", escapeHTML($msg),"</p>", - "<p>ÐÑи обÑабоÑке ÑÑой оÑибки не обнаÑÑжен Ñаблон ÑообÑÐµÐ½Ð¸Ñ Ð¾Ð± оÑибке</p></body></html>"; + "<p>ÐÑи обÑабоÑке ÑÑой оÑибки не обнаÑÑжен Ñаблон ÑообÑÐµÐ½Ð¸Ñ Ð¾Ð± оÑибке</p></body></html>"; } exit; -} +} # -# ÐÑвод Ñаблона ÑоÑмÑ. Ð Ñаблоне должна пÑиÑÑÑÑÑоваÑÑ ÑоÑма Ñ +# ÐÑвод Ñаблона ÑоÑмÑ. Ð Ñаблоне должна пÑиÑÑÑÑÑоваÑÑ ÑоÑма Ñ # именем, ÑовпадаÑÑим Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ form. ÐÑли в $cgi еÑÑÑ Ð¿Ð°ÑамеÑÑÑ, имена # коÑоÑÑÑ ÑовпадаÑÑ Ñ Ð¸Ð¼ÐµÐ½Ð°Ð¼Ð¸ полей ÑÑой ÑоÑмÑ, Ð¸Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ # подÑÑавлÑÑÑÑÑ # sub show_template { - my $tree = prepare_template(@_); + my $tree = prepare_template(@_); send_to_user($tree,@_); exit; } @@ -231,8 +231,8 @@ sub send_to_user { $cgi->header(-type=>"text/html",-charset=>"utf-8",($forum->{cookies}?(-cookie=>$forum->{cookies}):())), output_html($tree); exit; -} -sub prepare_template { +} +sub prepare_template { my ($form,$cgi,$forum) = @_; my $tree = gettemplate($forum,$form,$ENV{'PATH_INFO'}); @@ -249,11 +249,11 @@ sub prepare_template { if (!$cgi->param("returnto")) { $cgi->param("returnto", $cgi->referer||$cgi->url(-absolute=>1,-path_info=>1)); - } + } if (!$cgi->param($form)) { $cgi->param($form,1); - } - # + } + # # ÐÑли Ñанее бÑла вÑÑÑавлена оÑибка Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ set_error, подÑÑавлÑем # ÑообÑение в ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ñ ÐºÐ»Ð°ÑÑом error # @@ -263,11 +263,11 @@ sub prepare_template { $errormsg->delete_content(); $errormsg->push_content($forum->{error_message}); } - } + } if ($forum->{"authenticated"}) { - + # ÐодÑÑавлÑем инÑоÑмаÑÐ¸Ñ Ð¾ ÑекÑÑем полÑзоваÑеле еÑли в Ñаблоне - # ÑÑо пÑедÑÑмоÑÑено + # ÑÑо пÑедÑÑмоÑÑено substitute_user_info($tree,$forum); $cgi->param("user",$forum->{"authenticated"}{"user"}) if (!defined $cgi->param("user")) } @@ -280,14 +280,14 @@ sub prepare_template { if ($element->tag eq "input") { my $type=$element->attr('type') || "text"; next ELEMENT if grep($type eq $_, - "button","submit","reset"); + "button","submit","reset"); if ($type eq "check") { if (grep($element->attr("value") eq $_,$cgi->param($name))) { $element->attr("checked",""); } else { $element->attr("checked",undef); } - + } elsif ($type eq "radio") { if ($element->attr("value") eq $cgi->param($name)) { @@ -295,7 +295,7 @@ sub prepare_template { } else { $element->attr("checked",undef); } - } else { + } else { $element->attr("value",$cgi->param($name)); } } elsif ($element->tag eq "textarea") { @@ -305,10 +305,10 @@ sub prepare_template { $cgi->param($name."_format","bbcode"); my $parser = HTML::BBReverse->new(); $data = $parser->reverse($1); - # FIXME elsif ($data=~/<p class="text">) + # FIXME elsif ($data=~/<p class="text">) } else { $cgi->param($name."_format","html"); - } + } } $element->delete_content; @@ -319,9 +319,9 @@ sub prepare_template { $option->as_text(); if (grep($value eq $_, $cgi->param($name))) { $option->attr("selected","selected"); - } else { + } else { $option->attr("selected",undef); - } + } } } @@ -336,9 +336,9 @@ sub prepare_template { 'value'=> $cgi->param($required)); $f->push_content($element); } - } + } return $tree; -} +} # # ÐопÑавлÑÐµÑ ÑÑÑлки на ÑлÑжебнÑе ÑÐ°Ð¹Ð»Ñ Ð¸ ÑкÑипÑÑ ÑоÑÑма # @@ -347,7 +347,7 @@ sub fix_forum_links { if (!defined $path_info) { $path_info = $ENV{PATH_INFO}; $path_info =~ s/\/+/\//g; - } + } my $script_with_path = $ENV{SCRIPT_NAME}.$path_info; ELEMENT: for my $element ($tree->find_by_tag_name("form","img","link","script","a")) { @@ -359,30 +359,30 @@ sub fix_forum_links { } else { $attr ="src"; } - + # ÐбÑабаÑÑваем наÑи ÑпеÑиалÑнÑе link rel="" my $userlist = $cgi->url(-absolute=>1, -path_info=>0,-query_string=>0).$forum->{userurl}; if ($element->tag eq "link") { if ($element->attr("rel") eq "forum-user-list") { $element->attr("href" => $userlist); - next ELEMENT; + next ELEMENT; } elsif ($element->attr("rel") eq "forum-script") { $element->attr("href" => $script_with_path); next ELEMENT; - } + } } my $link = $element->attr($attr); - # ÐбÑолÑÑÐ½Ð°Ñ ÑÑÑлка - оÑÑавлÑем как еÑÑÑ. + # ÐбÑолÑÑÐ½Ð°Ñ ÑÑÑлка - оÑÑавлÑем как еÑÑÑ. next ELEMENT if (! defined $link || $link=~/^\w+:/ || $link - eq"."||$link eq ".."); - # СÑÑлка Ð¾Ñ ÐºÐ¾ÑÐ½Ñ ÑайÑа. + eq"."||$link eq ".."); + # СÑÑлка Ð¾Ñ ÐºÐ¾ÑÐ½Ñ ÑайÑа. if (substr($link,0,1) eq "/") { # ÐÑли Ñам два ÑлÑÑа, заменÑем Ð¸Ñ Ð½Ð° forumtop if (substr($link,0,2) eq '//') { $element->attr($attr, $forum->{forumtop}.substr($link,1)); next ELEMENT; - } + } # ÐÑли она не Ð²ÐµÐ´ÐµÑ Ð½Ð° Ð½Ð°Ñ ÑкÑипÑ, не обÑабаÑÑваем next ELEMENT if substr($link,0,length($ENV{SCRIPT_NAME}) ne $ENV{SCRIPT_NAME}) ; @@ -393,11 +393,11 @@ sub fix_forum_links { if (!($link =~ s!^templates/!$forum->{templatesurl}/!) && !($link =~ s!^users/!$userlist/!) && !($link =~ s!^forum\b!$script_with_path!)) { - $link = $forum->{"forumtop"}."/".$link - } + $link = $forum->{"forumtop"}."/".$link + } $element->attr($attr,$link); } -} +} sub makeuserlink { my ($forum,$tree,$linkclass,$userinfo) = @_; @@ -407,10 +407,10 @@ sub makeuserlink { } else { $userpage = $cgi->url(-absolute=>1).$forum->{"userurl"}."/".$cgi->escape($userinfo->{"user"}); - } + } substinfo($tree,["_tag"=>"a","class"=>$linkclass], href=>$userpage,_content=>$userinfo->{"user"}); -} +} # # ÐодÑÑавлÑÐµÑ Ð² заданное поддеÑево инÑоÑмаÑÐ¸Ñ Ð¾ полÑзоваÑеле # @@ -423,34 +423,34 @@ if (defined $user) { %userinfo=%$user; } else { # ÐÑли не Ñказано, какой ÑзеÑ, Ñо ÑекÑÑий. - %userinfo = %{$forum->{"authenticated"}} + %userinfo = %{$forum->{"authenticated"}} } # -# СпеÑиалÑно обÑабаÑÑваем Ð¿Ð¾Ð»Ñ user (должна бÑÑÑ ÑÑÑлка) и avatar +# СпеÑиалÑно обÑабаÑÑваем Ð¿Ð¾Ð»Ñ user (должна бÑÑÑ ÑÑÑлка) и avatar # (должен бÑÑÑ img). makeuserlink($forum,$tree,"author",\%userinfo); delete $userinfo{"user"}; if (ref $userinfo{"avatar"} eq "HASH") { substinfo($tree,["_tag"=>"img","class"=>"avatar"], %{$userinfo{'avatar'}}); - } elsif ($userinfo{'avatar'}) { + } elsif ($userinfo{'avatar'}) { substinfo($tree,["_tag"=>"img","class"=>"avatar"], src=>$userinfo{"avatar"}); } else { substinfo($tree,["_tag"=>"img","class"=>"avatar"], src=>$forum->{templatesurl}."/1x1.gif", width=>1,height=>1); - } + } for my $element ( $tree->look_down("class",qr/^ap-/)) { - my $field=$1 if $element->attr("class")=~/^ap-(.*)$/; + my $field=$1 if $element->attr("class")=~/^ap-(.*)$/; $element->delete_content(); $field =~ tr/-/_/; $userinfo{$field} = 0 if (!exists $userinfo{$field} && grep ($field eq $_,"forums","messages","topics")); if (exists $userinfo{$field}) { - + my $data; if ($field eq "registered" || substr($field,0,5) eq "last_") { $data = strftime("%d.%m.%Y %H:%M",localtime($userinfo{$field})) @@ -460,10 +460,10 @@ if (defined $user) { $data = $userinfo{$field} } $element->push_content($data); - $element->attr(href=>"mailto:$userinfo{$field}") + $element->attr(href=>"mailto:$userinfo{$field}") if ($element->tag eq "a" && $field eq "email"); - } - } + } + } } @@ -476,7 +476,7 @@ sub authorize_user { my ($cgi,$forum) = @_; if (my $session=$cgi->cookie("slsession")) { # ÐолÑзоваÑÐµÐ»Ñ Ð¸Ð¼ÐµÐµÑ ÐºÑÐºÑ - my %sessbase; + my %sessbase; dbmopen %sessbase,datafile($forum,"session"),0644; if ($sessbase{$session}) { my ($user,$expires,$ip)=split(";", $sessbase{$session}); @@ -486,7 +486,7 @@ sub authorize_user { clear_user_cookies($cgi,$forum); show_error($forum,"ÐекоÑÑекÑÐ½Ð°Ñ Ð¿Ð¾Ð»ÑзоваÑелÑÑÐºÐ°Ñ ÑеÑÑиÑ"); exit; - } + } if (!defined $ip|| $ip eq $ENV{'REMOTE_ADDR'}) { my %userbase; dbmopen %userbase,datafile($forum,"passwd"),0644; @@ -502,9 +502,9 @@ sub authorize_user { $forum->{"authenticated"}=$userinfo; print STDERR "authorize_user: ",$forum->{authenticated}{user}, $forum->{authenticated},"\n"; - } - dbmclose %userbase; - } + } + dbmclose %userbase; + } } else { clear_user_cookies($cgi,$forum); show_error($forum,"ÐекоÑÑекÑÐ½Ð°Ñ Ð¿Ð¾Ð»ÑзоваÑелÑÑÐºÐ°Ñ ÑеÑÑиÑ"); @@ -514,23 +514,23 @@ sub authorize_user { } } # -# ÐозвÑаÑÐ°ÐµÑ Ð¿ÑÑÑ Ðº ÑÐ°Ð¹Ð»Ñ Ð² диÑекÑоÑии +# ÐозвÑаÑÐ°ÐµÑ Ð¿ÑÑÑ Ðº ÑÐ°Ð¹Ð»Ñ Ð² диÑекÑоÑии # sub datafile { my ($forum,$filename) = @_; return $forum->{"datadir"}."/".$filename; -} +} # # Ð¡Ð¾Ð·Ð´Ð°ÐµÑ Ð½Ð¾Ð²ÑÑ ÑеÑÑÐ¸Ñ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð¸ подгоÑÐ°Ð²Ð»Ð¸Ð²Ð°ÐµÑ ÐºÑÐºÑ ÐºÐ¾ÑоÑÑÑ # ÑÐ¾Ñ ÑанÑÐµÑ Ð² Ñ ÑÑе конÑигÑÑаÑии ÑоÑÑма -# +# sub newsession { my ($base,$forum,$user,$bindip) = @_; if (!defined $base) { $base = {}; dbmopen %$base,datafile($forum,"session"),0644; - } + } my $sessname; my $t = time(); my ($u,$expires,$ip); @@ -544,24 +544,24 @@ sub newsession { my $cookie = $cgi->cookie(-name=>"slsession", -expires => $forum->{"authperiod"},-value=> $sessname); my $username = $user; - $username =~ s/^http:\/\///; #Remoove http:// from OpenID user names + $username =~ s/^http:\/\///; #Remoove http:// from OpenID user names $base->{$sessname}=$username.";".str2time($cookie->expires()). ($ip?";$ENV{'REMOTE_ADDR'}":""); - + $forum->{'cookies'}=[ $cookie, $cgi->cookie(-name=>"sluser",-value=>$user,-expires => - $forum->{authperiod})]; + $forum->{authperiod})]; } # -# ÐÑполнÑÐµÑ Ð°ÑÑенÑикаÑÐ¸Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð¿Ð¾ Ð»Ð¾Ð³Ð¸Ð½Ñ Ð¸ паÑÐ¾Ð»Ñ Ð¸ +# ÐÑполнÑÐµÑ Ð°ÑÑенÑикаÑÐ¸Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð¿Ð¾ Ð»Ð¾Ð³Ð¸Ð½Ñ Ð¸ паÑÐ¾Ð»Ñ Ð¸ # ÑÐ¾Ð·Ð´Ð°ÐµÑ Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ ÑеÑÑиÑ. # sub authenticate { - my ($cgi,$forum) = @_; + my ($cgi,$forum) = @_; if ($cgi->param("openidsite")) { my $openid_url = sprintf($cgi->param("openidsite"),$cgi->param("user")); openidstart($cgi,$forum,$openid_url); - } + } my %userbase; dbmopen %userbase,datafile($forum,"passwd"),0644; my $user = $cgi->param("user"); @@ -570,27 +570,27 @@ sub authenticate { if (! $userbase{$user}) { set_error($forum,"ÐевеÑное Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð¸Ð»Ð¸ паÑолÑ"); return undef; - } + } my $userinfo = thaw($userbase{$user}) ; dbmclose %userbase; #while (my ($key,$val)=each %$userinfo) { print STDERR "$key => '$val'\n";} - if (defined $forum->{denied_status} && $userinfo->{status} eq + if (defined $forum->{denied_status} && $userinfo->{status} eq $forum->{denied_status}) { set_error($forum,"ÐÑ Ð¾Ð´ полÑзоваÑÐµÐ»Ñ $user в ÑиÑÑÐµÐ¼Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñован"); return undef; - } + } if (crypt($password,$userinfo->{passwd}) eq $userinfo->{passwd}) { delete $userinfo->{"passwd"}; $cgi->delete("password"); $userinfo->{"user"} = $user; newsession(undef,$forum,$user); - $forum->{"authenticated"} = $userinfo; + $forum->{"authenticated"} = $userinfo; print STDERR "User $user authenticated successfully\n"; return 1; } else { set_error($forum,"ÐевеÑное Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð¸Ð»Ð¸ паÑолÑ"); return undef; - } + } } # # ÐÐ°Ð¿Ð¾Ð¼Ð¸Ð½Ð°ÐµÑ ÑообÑение об оÑибке Ð´Ð»Ñ Ð¿Ð¾ÑледÑÑÑего вÑвода show_template @@ -599,7 +599,7 @@ sub set_error { my ($forum,$message) = @_; print STDERR "set_error: $message\n"; $forum->{error_message} = $message; -} +} # # ÐÑÐ²Ð¾Ð´Ð¸Ñ ÑекÑÑий Ñаблон Ñ ÑообÑением об оÑибке # @@ -608,7 +608,7 @@ sub form_error { set_error($forum,$msg); show_template($form_name,$cgi,$forum); exit; -} +} # # ÐÑполнÑÐµÑ ÑедиÑÐµÐºÑ (возможно, Ñ ÑÑÑановкой кÑков) на ÑÑÑаниÑÑ, # ÑказаннÑÑ # ÑÑеÑÑем паÑамеÑÑе ÑÑнкÑии или в паÑамеÑÑе CGI-запÑоÑа @@ -627,13 +627,13 @@ sub forum_redirect { $url = $cgi->url(-base=>1).$url if substr($url,0,1) eq "/"; print $cgi->redirect(-url=>$url, ($forum->{cookies}?(-cookie=>$forum->{cookies}):())); - exit; + exit; } # # Ðаполнение ÑоÑÐ¼Ñ ÑедакÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿ÑоÑÐ¸Ð»Ñ Ð´Ð°Ð½Ð½Ñми полÑзоваÑÐµÐ»Ñ sub show_profile { - my ($formname,$cgi,$forum) = @_; + my ($formname,$cgi,$forum) = @_; my $rights = getrights($cgi,$forum); my $user = $cgi->param("user"); if (!$user && substr($path_translated,length($forum->{userdir}) eq @@ -641,26 +641,26 @@ sub show_profile { $user = substr($path_translated,length($forum->{userdir})+1); } $user = $forum->{authenticated}{user} unless $user; - show_error($forum,"Чей пÑоÑÐ¸Ð»Ñ Ð²Ñ Ñ Ð¾ÑиÑе ÑедакÑиÑоваÑÑ?") - unless $user; + show_error($forum,"Чей пÑоÑÐ¸Ð»Ñ Ð²Ñ Ñ Ð¾ÑиÑе ÑедакÑиÑоваÑÑ?") + unless $user; my %base; dbmopen %base,datafile($forum,"passwd"),0664; - show_error($forum,"ÐÐµÑ Ñакого полÑзоваÑÐµÐ»Ñ $user") + show_error($forum,"ÐÐµÑ Ñакого полÑзоваÑÐµÐ»Ñ $user") unless $base{$user}; my $userinfo = thaw($base{$user}); - dbmclose(%base); + dbmclose(%base); delete $userinfo->{passwd}; $userinfo->{user}=$user; - while(my ($field,$value) = each %$userinfo) { + while(my ($field,$value) = each %$userinfo) { $value = $value->{src} if ($field eq 'avatar' && ref($value)); if ($value =~/^<(div|p)\b/) { my $tree = str2tree($value); tree2input($cgi,$field,$tree); $tree->delete; - } else { + } else { $cgi->param($field,$value); } - } + } my $tree = prepare_template(@_); # ÐапÑеÑаем ÑедакÑиÑование полей, Ð²Ñ Ð¾Ð´ÑÑÐ¸Ñ Ð² restricted_user_info my $form = $tree->look_down(_tag=>"form",name=>"profile"); @@ -672,7 +672,7 @@ sub show_profile { if ($tag eq 'input') { my $newel=new HTML::Element("span", "class"=>"restricted-field"); - + $newel->push_content($element->attr("value")); $element->replace_with($newel)->delete(); } elsif ($tag eq 'textarea') { @@ -683,7 +683,7 @@ sub show_profile { class=>"restricted-field"); OPTION: for my $option ($element->content_list) { - if (ref $option eq "HTML::Element" && + if (ref $option eq "HTML::Element" && $option->attr("selected")) { $newel->push_content($option->detach_content()); last OPTION; @@ -691,11 +691,11 @@ sub show_profile { } if (!$newel->content_list) { $newel->push_content(($element->content_list)[0]); - } + } $element->replace_with($newel)->delete; - } + } } - } + } } # ÐодÑÑавлÑем аваÑаÑÐºÑ substinfo($tree,[_tag=>'img',class=>'avatar'],(ref($userinfo->{avatar})?(%{$userinfo->{avatar}}):(src=>$userinfo->{avatar}))); @@ -708,13 +708,13 @@ sub show_profile { $userlink->attr('href'=>undef); $userlink->tag('span'); } - } + } send_to_user($tree,@_); } # ÐбÑабоÑка ÑезÑлÑÑаÑов ÑедакÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿ÑоÑÐ¸Ð»Ñ Ð¿Ð¾Ð»ÑзваÑÐµÐ»Ñ # sub profile { - my ($formname,$cgi,$forum) = @_; + my ($formname,$cgi,$forum) = @_; if (!$cgi->param("user")) { show_error($forum,"Ð ÑоÑме Ð½ÐµÑ Ð¸Ð¼ÐµÐ½Ð¸ полÑзоваÑелÑ"); } @@ -740,8 +740,8 @@ sub profile { $userinfo->{passwd}=crypt_password($cgi->param('pass1')); } else { form_error($formname,$cgi,$forum,"ÐÑибка пÑи вводе паÑолÑ"); - } - } + } + } make_profile($formname,$cgi,$forum,$userinfo,$rights eq "admin"); delete $userinfo->{user}; $base{$user} = freeze $userinfo; @@ -753,35 +753,35 @@ sub profile { # # sub register { - my ($formname,$cgi,$forum) = @_; + my ($formname,$cgi,$forum) = @_; # - # ÐозможнÑе оÑибки: + # ÐозможнÑе оÑибки: # 1 Такой ÑÐ·ÐµÑ Ñже еÑÑÑ # - # не заполнено поле user + # не заполнено поле user if (!$cgi->param("user")) { form_error($formname,$cgi,$forum, "Ðе заполнено Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ"); - } - # или поле password + } + # или поле password if (!$cgi->param("pass1")) { form_error($formname,$cgi,$forum,"Ðе Ñказан паÑолÑ"); - } + } # Ðопии паÑÐ¾Ð»Ñ Ð½Ðµ Ñовпали if ($cgi->param("pass2") ne $cgi->param("pass1")) { form_error($formname,$cgi,$forum,"ÐÑибка пÑи вводе паÑолÑ"); - } + } my $user = $cgi->param("user"); - # Ðе ÑÐºÐ°Ð·Ð°Ð½Ñ Ð¿Ð¾Ð»Ñ, пеÑеÑиÑленнÑе в ÑкÑÑÑом поле required - if ($cgi->param("required")) { + # Ðе ÑÐºÐ°Ð·Ð°Ð½Ñ Ð¿Ð¾Ð»Ñ, пеÑеÑиÑленнÑе в ÑкÑÑÑом поле required + if ($cgi->param("required")) { foreach my $field (split(/\s*,\s*/,$cgi->param('required'))) { if (!$cgi->param($field)) { form_error($formname,$cgi,$forum,"Ðе заполнено обÑзаÑелÑное поле $field"); } - } + } } $cgi->delete("required"); my %userbase; - dbmopen %userbase,datafile($forum,"passwd"),0644 + dbmopen %userbase,datafile($forum,"passwd"),0644 or form_error($formname,$cgi,$forum,"ÐÑибка оÑкÑÑÑÐ¸Ñ Ñайла паÑолей $!"); if ($userbase{$cgi->param("user")}) { dbmclose %userbase; @@ -795,15 +795,15 @@ sub register { $userbase{$user} = freeze($userinfo); dbmclose %userbase; if (!defined $forum->{denied_status} || $userinfo->{status} ne - $forum->{denied_status}) { + $forum->{denied_status}) { newsession(undef,$forum,$user); - forum_redirect($cgi,$forum,$cgi->param("returnto")); + forum_redirect($cgi,$forum,$cgi->param("returnto")); } else { # FIXME Email validation # Email to admin show_template("newuser",$cgi,$forum); } -} +} sub make_profile { my ($formname,$cgi,$forum,$userinfo,$isadmin) =@_; # УдалÑем лиÑние Ð¿Ð¾Ð»Ñ @@ -811,7 +811,7 @@ sub make_profile { if (!$cgi->param($field)) { $cgi->delete($field); } - } + } if ($cgi->param("email") && ! Email::Valid->address($cgi->param("email"))) { form_error($formname,$cgi,$forum,"ÐекоÑÑекÑнÑй E-Mail адÑеÑ"); } @@ -825,7 +825,7 @@ sub make_profile { $cgi->delete("pass1"); $cgi->delete("pass2"); if ($cgi->param("avatarfile" )) { - my $filename = + my $filename = (save_attached_images($cgi,$forum,$forum->{userdir},"${userprefix}_%f", "avatarfile"))[1]; my $path = $forum->{"userdir"}."/".$filename; @@ -833,10 +833,10 @@ sub make_profile { $userinfo->{'avatar'}= {src=>$forum->{"userurl"}."/".$userprefix."_".$filename, width=>$w,height=>$h}; } elsif ($cgi->param('avatar')) { - if (!ref($userinfo->{'avatar'}) || + if (!ref($userinfo->{'avatar'}) || $userinfo->{avatar}{'src'} ne $cgi->param('avatar')) { $userinfo->{avatar}=get_avatar_info($cgi->param('avatar')); - } + } } my @restrict=(); @restrict = split /\s*,\s*/, $forum->{restricted_user_info} @@ -855,7 +855,7 @@ sub make_profile { $tree->delete(); } else { delete $userinfo->{$param}; - } + } } else { $userinfo->{$param} = $cgi->param($param); } @@ -866,22 +866,22 @@ sub crypt_password { my $saltstring = 'ABCDEFGHIJKLMNOPQRSTUVWXUZabcdefghijklmnopqrstuvwxuz0123456789./'; my $salt = substr($saltstring,int(rand(64)),1). substr($saltstring,int(rand(64)),1); - my $password=crypt($open_password,$salt); + my $password=crypt($open_password,$salt); return $password; -} +} sub set_default_user_attrs { my ($forum,$userinfo) = @_; while (my($key,$val) = each %$forum) { next unless $key =~ /^default_(.*)$/; $userinfo->{$1} = $val; - } + } } sub show_user_page { my ($cgi,$forum) = @_; my $rights; - $rights=getrights($cgi,$forum) if ($forum->{authenticated}); + $rights=getrights($cgi,$forum) if ($forum->{authenticated}); my %base; my $tree; dbmopen %base,datafile($forum,"passwd"),0664; @@ -898,8 +898,8 @@ sub show_user_page { $userinfo->{"user"} = $user; substitute_user_info($block,$forum,$userinfo); profile_links($block,$user,$rights,$cgi,$forum); - } - $usertpl->delete; + } + $usertpl->delete; } else { my $user = substr($path_translated,length($forum->{userdir})+1); if (!$base{$user}) { @@ -916,9 +916,9 @@ sub show_user_page { for my $userlink ($tree->look_down(_tag => "a",class=>"author")) { $userlink->attr("href",undef); $userlink->tag("span"); - } + } } - } + } my $page = output_html($tree); my $length = do {use bytes; length($page);}; print $cgi->header(-type=>"text/html",-content_length=>$length, @@ -929,27 +929,27 @@ sub profile_links { my ($tree,$user,$rights,$cgi,$forum)=@_; foreach my $profile_link ($tree->look_down(_tag=>"a", href=>qr/profile=/)) { - if ((defined $rights && $rights eq "admin")|| + if ((defined $rights && $rights eq "admin")|| (defined $forum->{authenticated}{user} && $forum->{authenticated}{user} eq $user)) { $profile_link->attr("href", $ENV{'SCRIPT_NAME'}.$forum->{userurl}. "/".$user."?profile=1"); - } else { + } else { $profile_link->delete(); - } - } + } + } } sub clear_user_cookies { my ($cgi,$forum) = @_; $forum->{cookies}=[ $cgi->cookie(-name=>"sluser", -value=>"0", -expires=>"-1m"),$cgi->cookie(-name=>"slsession", -value=>"0", -expires => "-1m")]; -} +} # # ÐбÑабоÑÑик ÑоÑÐ¼Ñ Ð»Ð¾Ð³Ð¸Ð½Ð°. СводиÑÑÑ Ðº вÑÐ·Ð¾Ð²Ñ ÑÑнкÑии authenticate, -# поÑколÑÐºÑ Ð¼Ñ Ð¿Ð¾Ð´Ð´ÐµÑживаем логин одновÑеменнÑй Ñ Ð¾ÑпÑавкой Ñеплики. +# поÑколÑÐºÑ Ð¼Ñ Ð¿Ð¾Ð´Ð´ÐµÑживаем логин одновÑеменнÑй Ñ Ð¾ÑпÑавкой Ñеплики. # sub login { my ($form,$cgi,$forum)=@_; @@ -957,8 +957,8 @@ sub login { forum_redirect($cgi,$forum); } else { show_template(@_); - } -} + } +} # # ÐбÑабоÑÑик ÑоÑÐ¼Ñ logout. РоÑлиÑие Ð¾Ñ Ð±Ð¾Ð»ÑÑинÑÑва обÑабоÑÑиков ÑоÑм, # поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¾Ð±ÑабоÑÐºÑ Ð¼ÐµÑодом GET @@ -973,40 +973,40 @@ sub logout { dbmclose %sessiondb; } forum_redirect($cgi,$forum); -} +} sub allow_operation { my ($operation,$cgi,$forum) = @_; - return 1 if (!exists($operation->{rights})); + return 1 if (!exists($operation->{rights})); if (!$forum->{authenticated}) { return 1 if ($operation->{rights} eq "login"); return 0; - } + } my $user = $forum->{authenticated}{user} ; my $accesslevel=getrights($cgi,$forum); - + return 1 if ($accesslevel eq "admin"); - return 0 if ($operation->{rights} eq "admin"); + return 0 if ($operation->{rights} eq "admin"); return 1 if ($accesslevel eq "moderator"); - return 0 if $accesslevel eq "banned"; + return 0 if $accesslevel eq "banned"; return 1; } sub reply { my ($form,$cgi,$forum) = @_; if (! exists $forum->{authenticated} ) { - form_error($form,$cgi,$forum,"ÐÑ Ð½Ðµ заÑегиÑÑÑиÑовалиÑÑ") if (!authenticate($cgi,$forum)); + form_error($form,$cgi,$forum,"ÐÑ Ð½Ðµ заÑегиÑÑÑиÑовалиÑÑ") if (!authenticate($cgi,$forum)); } # # ÐÐ°Ñ Ð¾Ð´Ð¸Ð¼ Ñайл диÑкÑÑÑии, в коÑоÑÑй надо помеÑÑиÑÑ ÑÐµÐ¿Ð»Ð¸ÐºÑ # - my ($tree,$lockfd)=gettree($path_translated); + my ($tree,$lockfd)=gettree($path_translated); my $newmsg = newlistelement($tree,"message","messagelist"); if (!$newmsg) { show_error($forum,"Шаблон ÑÐµÐ¼Ñ Ð½Ðµ ÑодеÑÐ¶Ð¸Ñ ÑлеменÑа Ñ ÐºÐ»Ð°ÑÑом message"); - } - - # + } + + # # ÐенеÑиÑÑем иденÑиÑикаÑÐ¾Ñ Ð·Ð°Ð¿Ð¸Ñи. # my $id = "m".get_uid($forum); @@ -1030,14 +1030,14 @@ sub reply { # fix_image_links($cgi,$txtree,\%attached,$dir); # - # ÐодÑÑавлÑем даннÑе ÑообÑÐµÐ½Ð¸Ñ + # ÐодÑÑавлÑем даннÑе ÑообÑÐµÐ½Ð¸Ñ # $newmsg->attr("id"=>$id); substinfo($newmsg,[class=>"subject"],_content=>$cgi->param("subject")); my $textnode=$newmsg->look_down("class"=>"mtext"); if (!$textnode) { - show_error($forum,"Ð Ñаблоне Ñеплики Ð½ÐµÑ Ð¼ÐµÑÑа Ð´Ð»Ñ ÑекÑÑа"); - } + show_error($forum,"Ð Ñаблоне Ñеплики Ð½ÐµÑ Ð¼ÐµÑÑа Ð´Ð»Ñ ÑекÑÑа"); + } $textnode->delete_content(); $textnode->push_content($txtree); if ($forum->{authenticated}{signature}) { @@ -1073,19 +1073,19 @@ sub reply { # подÑÑавлÑем mparent my $parent_id=$cgi->param("id"); if ($parent_id) { - substinfo($newmsg,[_tag => "a",class=>"mparent"], + substinfo($newmsg,[_tag => "a",class=>"mparent"], "href"=>$cgi->path_info."#$parent_id",style=>undef); } else { - substinfo($newmsg,[_tag => "a",class=>"mparent"], + substinfo($newmsg,[_tag => "a",class=>"mparent"], style=>"display: none;"); - } + } my $msgcount=0; for my $msg ($newmsg->parent->look_down("class"=>"message")) { $msgcount ++; - } - + } + # - # Ðелаем УÑÑ Ð¸ ÑÐ¾Ñ ÑанÑем Ñо, ÑÑо полÑÑилоÑÑ + # Ðелаем УÑÑ Ð¸ ÑÐ¾Ñ ÑанÑем Ñо, ÑÑо полÑÑилоÑÑ # $newmsg = $newmsg->clone; savetree($path_translated,$tree,$lockfd); @@ -1093,19 +1093,19 @@ sub reply { record_statistics($forum,"message"), update_topic_list($forum,$path_translated,$msgcount,$posted); forum_redirect($cgi,$forum,$cgi->path_info."#$id"); -} +} sub fix_image_links { my ($cgi,$txtree,$attached,$dir) =@_; for my $image ($txtree->find_by_tag_name("img")) { my $file=lc($image->attr("src")); if ( exists $attached->{$file}) { $image->attr("src" => dir2url($cgi,$dir)."/".$attached->{$file}); - my ($width,$height) = imgsize($dir ."/".$attached->{$file}); + my ($width,$height) = imgsize($dir ."/".$attached->{$file}); $image->attr("width" =>$width); $image->attr("height" => $height); - } - } -} + } + } +} sub save_attached_images { my ($cgi,$forum,$dir,$nametemplate,@params) = @_; my %attached; @@ -1121,7 +1121,7 @@ sub save_attached_images { if (!$in) { show_error($forum,"ÐÑибка пÑи загÑÑзке каÑÑинки $filename"); exit; - } + } my $out; open $out,">$dir/$attached{$filename}"; binmode $out,":bytes"; @@ -1171,18 +1171,18 @@ sub record_as_recent { for (my $i=$#msgs;$i>=$forum->{replies_per_page}-1;$i--) { $msgs[$i]->delete; } - } - $msgs[0]->preinsert($msg); + } + $msgs[0]->preinsert($msg); } } else { my $old_copy = $msglist->look_down(id=>$msg->attr("id")); if ($old_copy) { $old_copy->replace_with($msg)->delete; - } + } } } savetree($forum->{forumroot}."/recent.html",$tree,$lockfd); -} +} sub getperms { my $dir = shift; local $_; @@ -1197,7 +1197,7 @@ sub getperms { } else { $users{$key} .= $_ if ($key); } - } + } close F; } return %users; @@ -1208,7 +1208,7 @@ sub getperms { sub gettitle { our $gettitle_flag=0; our $gettitle_text=""; - + open F,"<",shift or return undef; my $parser = HTML::Parser->new(api_version=>3, text_h=>[sub { $gettitle_text .= @@ -1219,13 +1219,13 @@ our $gettitle_text=""; my $data; read F,$data,4096; $parser->parse($data) or last; - } + } return $gettitle_text; } # # Ðоказ ÑоÑÐ¼Ñ ÑеакÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñав -# +# sub show_rights { my ($form,$cgi,$forum) = @_; @@ -1239,15 +1239,15 @@ sub show_rights { # ÐÑобегаемÑÑ Ð²Ð²ÐµÑÑ Ð¿Ð¾ деÑÐµÐ²Ñ hide_list($tree,"dirlist"); - if ($path_translated ne $forum->{forumroot}) { + if ($path_translated ne $forum->{forumroot}) { my $d = $path_translated; my @dirs; while ($d) { - # и полÑÑаем ÑпиÑок Ñайлов perms.txt + # и полÑÑаем ÑпиÑок Ñайлов perms.txt $d=~s/\/[^\/]+$//; unshift @dirs,$d if -f "$d/perms.txt"; last if $d eq $forum->{forumroot}; - + } # ÐодÑÑавлÑем Ð¸Ñ ÐºÑда надо for $d (@dirs) { @@ -1256,21 +1256,21 @@ sub show_rights { my $item = newlistelement($tree,"dir","dirlist"); substinfo($item,[_tag => 'a',class=>'dirlink'], href=>$d,_content=>$title); - + substinfo($item,[_tag=>'a',class=>'rights'], href=>$cgi->url(-absolute=>1,-path_info=>0).dir2url($cgi,$d)."?setrights=1"); while (my ($key,$val) = each %users) { my @data = map {$_=>new HTML::Element("br")} split /\r?\n/, $val; substinfo($item,[class=>$key],_content=>\@data); - } - } + } + } } my $f = $tree->look_down(_tag=>'form',name=>'setrights'); substinfo($f,[_tag=>'a',class=>'dirlink'], href=>$cgi->path_info, _content=>gettitle($path_translated."/".$forum->{indexfile})); # ÐÑдаем ÑзеÑÑ. - send_to_user($tree,@_); + send_to_user($tree,@_); } sub set_rights { @@ -1285,11 +1285,11 @@ sub set_rights { if (replacefile($path_translated."/perms.txt",$newperm)) { set_error($forum,"СпиÑки модеÑаÑоÑов Ñаздела обновленÑ"); } - show_rights(@_); + show_rights(@_); } # -# ÐбÑабоÑка опеÑаÑии ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð¹ ÑемÑ. +# ÐбÑабоÑка опеÑаÑии ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð¹ ÑемÑ. # sub new_topic { @@ -1300,32 +1300,32 @@ sub new_topic { my $urlname; if (!$cgi->param("urlname")) { $urlname = get_uid($forum); - } else { + } else { $urlname=$1 if $cgi->param("urlname") =~ /^([-\w]+)$/; form_error($form,$cgi,$forum,"ÐекоÑÑекÑнÑе ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð² urlname. - ÐопÑÑÑÐ¸Ð¼Ñ ÑолÑко лаÑинÑкие бÑквÑ, ÑиÑÑÑ Ð¸ минÑÑ") unless $urlname; + ÐопÑÑÑÐ¸Ð¼Ñ ÑолÑко лаÑинÑкие бÑквÑ, ÑиÑÑÑ Ð¸ минÑÑ") unless $urlname; } if (!-d $path_translated && $path_translated=~s/^(.+)\/+[^\/]+$/$1/ && !-d $path_translated) { show_error($forum,"ÐпеÑаÑÐ¸Ñ $form Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²Ñзвана ÑолÑко Ñо ÑÑÑаниÑÑ ÑоÑÑма"); - } + } my $filename = "$path_translated/$urlname.html"; if (-f $filename) { form_error($form,$cgi,$forum,"Тема Ñ urlname $urlname Ñже ÑÑÑеÑÑвÑеÑ"); - } + } my $url = $cgi->path_info."/$urlname.html"; $url =~ s/\/+/\//g; if (!$cgi->param("title")) { form_error($form,$cgi,$forum,"Тема должна имеÑÑ Ð½ÐµÐ¿ÑÑÑое название"); - } + } # # Создаем ÑобÑÑвенно ÑÐµÐ¼Ñ # my $tree = gettemplate($forum,"topic",$url); - # ÐаполниÑÑ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ðµ и анноÑаÑÐ¸Ñ + # ÐаполниÑÑ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ðµ и анноÑаÑÐ¸Ñ my $abstract = input2tree($cgi,$forum,"abstract"); substinfo($tree,[_tag=>"meta","name"=>"description"],content=>$abstract->as_trimmed_text) if $abstract; substinfo($tree,[_tag=>"title"],_content=>$cgi->param("title")); @@ -1339,11 +1339,11 @@ sub new_topic { # ÐÑÑавлÑем в ÑÑÑаниÑÑ ÐÐÐÐЮ анноÑаÑии, поÑколÑÐºÑ Ð°Ð½Ð½Ð¾ÑаÑÐ¸Ñ # нам еÑе понадобиÑÑÑ Ð² ÑпиÑке Ñем. substinfo($subtree,["class"=>"abstract"],_content=>$abstract->clone) if $abstract; - substitute_user_info($subtree,$forum); + substitute_user_info($subtree,$forum); } else { substinfo($tree,["class"=>"title"], _content=>$cgi->param("title")); - } + } # СкÑÑÑÑ ÑпиÑок ÑообÑений. hide_list($tree,"messagelist"); savetree($filename,$tree,undef); @@ -1358,8 +1358,8 @@ sub new_topic { substinfo($newtopic,[_tag=>"a","class"=>"title"], _content=>$cgi->param("title"), href=>"$urlname.html"); substinfo($newtopic,["class"=>"date"], _content=>$creation_time); - substinfo($newtopic,["class"=>"abstract"],_content=>$abstract); - substitute_user_info($newtopic,$forum); + substinfo($newtopic,["class"=>"abstract"],_content=>$abstract); + substitute_user_info($newtopic,$forum); $newtopic->attr("id",$urlname); my $controlform = $newtopic->look_down(_tag=>"form",class=>"topicinfo"); if ($controlform) { @@ -1367,7 +1367,7 @@ sub new_topic { -query_string=>0).$url); substinfo($controlform,[_tag=>"input",name=>"author"],value=> $forum->{authenticated}{user}); - } + } update_topic_list($forum,$newtopic,0,$creation_time); savetree($path_translated."/".$forum->{"indexfile"},$tree,$lockfd); record_statistics($forum,"topic"); @@ -1382,26 +1382,26 @@ sub new_forum { my $urlname; if (!$cgi->param("urlname")) { form_error($form,$cgi,$forum,"ФоÑÑÐ¼Ñ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ задаÑÑ Ð½ÐµÐ¿ÑÑÑое urlname"); - } + } if ($cgi->param("urlname") eq ".") { $urlname = "." - } else { + } else { $urlname=$1 if $cgi->param("urlname") =~ /^([-\w]+)$/ ; form_error($form,$cgi,$forum,"ÐекоÑÑекÑнÑе ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð² urlname. - ÐопÑÑÑÐ¸Ð¼Ñ ÑолÑко лаÑинÑкие бÑквÑ, ÑиÑÑÑ Ð¸ минÑÑ") unless $urlname; + ÐопÑÑÑÐ¸Ð¼Ñ ÑолÑко лаÑинÑкие бÑквÑ, ÑиÑÑÑ Ð¸ минÑÑ") unless $urlname; } if (!-d $path_translated && $path_translated=~s/^(.+)\/+[^\/]+$/$1/ && !-d $path_translated) { show_error($forum,"ÐпеÑаÑÐ¸Ñ $form Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²Ñзвана ÑолÑко Ñо ÑÑÑаниÑÑ ÑоÑÑма"); - } + } my $newname = "$path_translated/$urlname"; - $newname=$path_translated if ($urlname eq "."); + $newname=$path_translated if ($urlname eq "."); my $filename = "$newname/$forum->{indexfile}"; if (-f $filename) { form_error($form,$cgi,$forum,"ФоÑÑм $urlname Ñже ÑÑÑеÑÑвÑеÑ"); - } + } if (!$cgi->param("title")) { form_error($form,$cgi,$forum,"ФоÑÑм должен имеÑÑ Ð½ÐµÐ¿ÑÑÑое название"); } @@ -1417,13 +1417,13 @@ sub new_forum { $logo_name = $forum->{"templatesurl"}."/1x1.gif"; $logo_width = 1; $logo_height=1; - } + } # # Создаем ÑобÑÑвенно оглавление ÑоÑÑма # - + my $url = $cgi->path_info."/$urlname"; $url= $cgi->path_info if $urlname eq "."; $url =~ s/\/+/\//g; @@ -1432,9 +1432,9 @@ sub new_forum { if ($urlname ne ".") { for my $element ($tree->look_down("class"=>"top-page")) { $element->delete; - } + } } - # ÐаполниÑÑ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ðµ и анноÑаÑÐ¸Ñ + # ÐаполниÑÑ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ðµ и анноÑаÑÐ¸Ñ my $abstract = input2tree($cgi,$forum,"abstract"); substinfo($tree,[_tag=>"meta","name"=>"description"],content=>$abstract->as_trimmed_text) if $abstract; substinfo($tree,[_tag=>"title"],_content=>$cgi->param("title")); @@ -1448,7 +1448,7 @@ sub new_forum { # ÐÑÑавлÑем в ÑÑÑаниÑÑ ÐÐÐÐЮ анноÑаÑии, поÑколÑÐºÑ Ð°Ð½Ð½Ð¾ÑаÑÐ¸Ñ # нам еÑе понадобиÑÑÑ Ð² ÑпиÑке Ñем. substinfo($subtree,["class"=>"abstract"],_content=>$abstract->clone) if $abstract; - substitute_user_info($subtree,$forum); + substitute_user_info($subtree,$forum); substinfo($subtree,[_tag=>"img","class"=>"logo"], src=> $logo_name, width=>$logo_width, height=>$logo_height); # СкÑÑÑÑ ÑпиÑки подÑоÑÑмов и Ñем . @@ -1458,7 +1458,7 @@ sub new_forum { for my $link_up ($tree->look_down(_tag=>"a",href=>"..")) { $link_up->delete; } - } + } savetree($filename,$tree,undef); $tree->destroy; # @@ -1471,10 +1471,10 @@ sub new_forum { substinfo($newforum,[_tag=>"a","class"=>"title"], _content=>$cgi->param("title"), href=>"$urlname/"); substinfo($newforum,["class"=>"date"], _content=>$creation_time); - substinfo($newforum,["class"=>"abstract"],_content=>$abstract); + substinfo($newforum,["class"=>"abstract"],_content=>$abstract); substinfo($newforum,[_tag=>"img","class"=>"logo"],src=>"$urlname/$logo_name", width=>$logo_width,height=>$logo_height); - substitute_user_info($newforum,$forum); + substitute_user_info($newforum,$forum); $newforum->attr("id",$urlname); my $controlform = $newforum->look_down(_tag=>"form",class=>"foruminfo"); if ($controlform) { @@ -1482,16 +1482,16 @@ sub new_forum { $url); substinfo($controlform,[_tag=>"input",name=>"author"],value=> $forum->{authenticated}{user}); - } + } savetree($path_translated."/".$forum->{"indexfile"},$tree,$lockfd); record_statistics($forum,"forum"); } else { # Создаем ÑÐµÐ¼Ñ Ð´Ð»Ñ "ÑÐ²ÐµÐ¶Ð¸Ñ Ñеплик" - my $recent = gettemplate($forum,"topic",$url."/recent.html"); + my $recent = gettemplate($forum,"topic",$url."/recent.html"); # remove reply link from page itself for my $link ($recent->look_down(_tag =>"a", href=>qr/reply=/)) { $link->delete; - } + } substinfo($recent,["_tag"=>"title"],$cgi->param("title").": Свежие ÑообÑениÑ"); substinfo($recent,["class"=>"title"], _content=>$cgi->param("title"). ": Свежие ÑообÑениÑ"); @@ -1508,8 +1508,8 @@ sub new_forum { # # ÐаÑамеÑÑÑ $cgi,$forum, Ñип => ÑÑÑлка на ÑÑнкÑÐ¸Ñ ... # где Ñип - message, topic или forum. ÐпÑеделÑÐµÑ Ð¾Ð±ÑабаÑÑваемÑй обÑÐµÐºÑ -# и вÑзÑÐ²Ð°ÐµÑ ÑооÑвеÑÑÑвÑÑÑÑÑ ÑÑнÑкиÑ. ÐÐ¶Ð¸Ð´Ð°ÐµÑ ÑÑо ÑÑнкÑÐ¸Ñ Ð·Ð°Ð²ÐµÑÑиÑÑÑ -#вÑзовом exit. +# и вÑзÑÐ²Ð°ÐµÑ ÑооÑвеÑÑÑвÑÑÑÑÑ ÑÑнÑкиÑ. ÐÐ¶Ð¸Ð´Ð°ÐµÑ ÑÑо ÑÑнкÑÐ¸Ñ Ð·Ð°Ð²ÐµÑÑиÑÑÑ +#вÑзовом exit. sub dispatch_objtype { my $cgi=shift; my $forum = shift; @@ -1519,11 +1519,11 @@ sub dispatch_objtype { $actions{"message"}->($cgi,$forum,$path_translated,$cgi->param("id")) if exists($actions{'message'}); } else { - $actions{topic}->($cgi,$forum,$path_translated) + $actions{topic}->($cgi,$forum,$path_translated) if exists($actions{'topic'}); - } + } } elsif (-d $path_translated && -f $path_translated ."/". $forum->{indexfile}) { - $actions{'forum'}->($cgi,$forum,$path_translated) + $actions{'forum'}->($cgi,$forum,$path_translated) if exists($actions{'forum'}); } @@ -1533,16 +1533,16 @@ sub dispatch_objtype { sub delete_item { my ($formname,$cgi,$forum) = @_; # - # СнаÑала ÑазбеÑемÑÑ, ÑÑо Ð¼Ñ ÑобÑÑвенно ÑдалÑем + # СнаÑала ÑазбеÑемÑÑ, ÑÑо Ð¼Ñ ÑобÑÑвенно ÑдалÑем # if ($cgi->param("user")) { delete_user($cgi,$forum,$cgi->param("user")); - } + } dispatch_objtype($cgi,$forum,topic=>\&delete_topic, message=>\&delete_comment, forum=>\&delete_forum); show_error($forum,"Ðевозможно ÑдалиÑÑ Ð½ÐµÐ¾Ð¿Ð¾Ð·Ð½Ð°Ð½Ð½Ñй обÑекÑ"); -} +} # Ðоказ ÑоÑÐ¼Ñ ÑедакÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ sub show_editable { my ($formname,$cgi,$forum) = @_; @@ -1550,7 +1550,7 @@ sub show_editable { topic=>\&show_topicedit, forum=>\&show_forumedit); show_error($forum,"Ðевозможно ÑедакÑиÑоваÑÑ Ð½ÐµÐ¾Ð¿Ð¾Ð·Ð½Ð°Ð½Ð½Ñй обÑекÑ"); -} +} # ÐÑименение ÑезÑлÑÑаÑов ÑедакÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ sub edit_item { my ($formname,$cgi,$forum) = @_; @@ -1558,7 +1558,7 @@ sub edit_item { topic=>\&topicedit, forum=>\&forumedit); show_error($forum,"Ðевозможно ÑедакÑиÑоваÑÑ Ð½ÐµÐ¾Ð¿Ð¾Ð·Ð½Ð°Ð½Ð½Ñй обÑекÑ"); -} +} sub move_item { my ($formname,$cgi,$forum) = @_; dispatch_objtype($cgi,$forum,"message"=>\&move_message, @@ -1573,7 +1573,7 @@ sub show_move_dest { forum=>\&show_move_forum); show_error($forum,"Ðевозможно пеÑемеÑÑиÑÑ Ð½ÐµÐ¾Ð¿Ð¾Ð·Ð½Ð°Ð½Ð½Ñй обÑекÑ"); } -# +# # Удаление полÑзоваÑÐµÐ»Ñ # sub delete_user { @@ -1581,18 +1581,18 @@ sub delete_user { if ($forum->{authenticated}{user} ne $user && getrights($cgi,$forum) ne "admin") { show_error($forum,"У Ð²Ð°Ñ Ð½ÐµÐ´Ð¾ÑÑаÑоÑно пÑав Ð´Ð»Ñ ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ - полÑзоваÑÐµÐ»Ñ $user"); - } + полÑзоваÑÐµÐ»Ñ $user"); + } my %base; dbmopen %base,datafile($forum,"passwd"),0644; delete $base{$user}; dbmclose %base; forum_redirect($cgi,$forum,$forum->{forumtop}); -} +} # ÐÑовеÑка пÑав на изменение Ñеплики sub moderator_or_author { my ($cgi,$forum,$msg)=@_; - return 1 if getrights($cgi,$forum) eq "moderator" + return 1 if getrights($cgi,$forum) eq "moderator" || getrights($cgi,$forum) eq "admin"; my $author= $msg->look_down(_tag=>"input",name=>"author"); if ($author) { @@ -1602,7 +1602,7 @@ sub moderator_or_author { } else { return undef; } -} +} # # Удаление Ñеплики # @@ -1612,14 +1612,14 @@ sub delete_comment { my ($msg) = $tree->look_down(id => $id); show_error($forum,"Рданной Ñеме Ð½ÐµÑ Ñеплики Ñ id=$id") if (!$msg); show_error($forum,"У Ð²Ð°Ñ Ð½ÐµÑ Ð¿Ñав на Ñдаление ÑÑого ÑообÑениÑ") - unless moderator_or_author($cgi,$forum,$msg); + unless moderator_or_author($cgi,$forum,$msg); delete_from_list($tree,"messagelist","message",$msg); savetree($topic,$tree,$lockfd); $tree->delete; ($tree,$lockfd) = gettree($forum->{forumroot}."/recent.html"); ($msg) = $tree->look_down(id => $id); if ($msg) { - delete_from_list($tree,"messagelist","message",$msg); + delete_from_list($tree,"messagelist","message",$msg); savetree($forum->{forumroot}."/recent.html",$tree,$lockfd); } else { discardtree($tree,$lockfd); @@ -1627,16 +1627,16 @@ sub delete_comment { # ÐÑли Ñ Ñеплики бÑли каÑÑинки, Ñо Ð¸Ñ Ñоже надо гÑÐ¾Ñ Ð½ÑÑÑ for my $pic (<$id."_*.*">) { unlink $pic; - } + } forum_redirect($cgi,$forum,$cgi->path_info); -} +} # # Удаление ÑÐµÐ¼Ñ # sub delete_topic { my ($cgi,$forum,$topic) = @_; # ÐÑли модеÑаÑоÑ, Ñо в ÑÐµÐ¼Ñ Ð¸ не заглÑдÑваем - my ($dir,$id) = ($1,$2) if $topic=~/^(.*)\/([^\/]+).html$/; + my ($dir,$id) = ($1,$2) if $topic=~/^(.*)\/([^\/]+).html$/; show_error($forum,"ÐевеÑное Ð¸Ð¼Ñ ÑÐµÐ¼Ñ $topic") unless ($dir && $id); if (getrights($cgi,$forum) ne "moderator" && getrights($cgi,$forum) ne "admin") { @@ -1650,9 +1650,9 @@ sub delete_topic { $info = $tree->look_down(class=>"messagelist"); if ($info->attr("style") !~ /display: none;/) { show_error($forum,"Ðевозможно ÑдалиÑÑ ÑемÑ, ÑодеÑжаÑÑÑ ÑообÑениÑ"); - } + } discardtree($tree,$lockfd); - } # FIXME пÑи Ñдалении непÑÑÑой ÑÐµÐ¼Ñ Ð¼Ð¾Ð´ÐµÑаÑоÑом поÑиÑÑиÑÑ recent.html + } # FIXME пÑи Ñдалении непÑÑÑой ÑÐµÐ¼Ñ Ð¼Ð¾Ð´ÐµÑаÑоÑом поÑиÑÑиÑÑ recent.html my ($tree,$lockfd) = gettree($dir . "/".$forum->{indexfile}); delete_from_list($tree,"topiclist","topic",$id); savetree($dir ."/".$forum->{indexfile},$tree); @@ -1669,7 +1669,7 @@ sub delete_forum { if (getrights($cgi,$forum) ne "moderator" && getrights($cgi,$forum) ne "admin") { show_error($forum,"У Ð²Ð°Ñ Ð½ÐµÑ Ð¿Ñава ÑдалÑÑÑ ÑоÑÑмÑ"); - } + } opendir DIR,$dir; my $count = 0; while ( my $entry=readdir DIR) { @@ -1678,8 +1678,8 @@ sub delete_forum { next if $entry =~ /^logo.[^.]+/; show_error($forum,"ÐелÑÐ·Ñ ÑдалÑÑÑ ÐºÐ¾ÑÐµÐ½Ñ ÑоÑÑма" ) if $entry eq ".forum"; - $count ++; - } + $count ++; + } closedir DIR; show_error($forum,"ÐелÑÐ·Ñ ÑдалÑÑÑ Ð½ÐµÐ¿ÑÑÑой ÑоÑÑм") if $count; # ÐÐ°Ñ Ð¾Ð´Ð¸Ð¼ ÑодиÑелÑÑкий ÑоÑÑм @@ -1694,13 +1694,13 @@ sub delete_forum { opendir DIR,$dir; for my $entry ( readdir DIR) { unlink "$dir/$entry"; - } + } rmdir $dir; my $redirect_url = $cgi->path_info; $redirect_url =~s/\/$//; $redirect_url =~ s/\/[^\/]*$//; - forum_redirect($cgi,$forum,$redirect_url); -} + forum_redirect($cgi,$forum,$redirect_url); +} # Ðоказ ÑообÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÑедакÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ sub show_messageedit { my ($cgi,$forum,$path,$id)=@_; @@ -1709,8 +1709,8 @@ sub show_messageedit { $dirname =~ s/\/[^\/]+$//; my ($msg) = $tree->look_down(id => $id); show_error($forum,"Рданной Ñеме Ð½ÐµÑ Ñеплики Ñ id=$id") if (!$msg); - show_error($forum,"У Ð²Ð°Ñ Ð½ÐµÑ Ð¿Ñав на ÑедакÑиÑованиее ÑÑого ÑообÑениÑ") - unless moderator_or_author($cgi,$forum,$msg); + show_error($forum,"У Ð²Ð°Ñ Ð½ÐµÑ Ð¿Ñав на ÑедакÑиÑованиее ÑÑого ÑообÑениÑ") + unless moderator_or_author($cgi,$forum,$msg); # ÐÑбиÑаем даннÑе ÑообÑÐµÐ½Ð¸Ñ my ($text) = $msg->look_down(class=>"mtext")->content_list; my ($subject) = $msg->look_down(class=>"subject"); @@ -1722,7 +1722,7 @@ sub show_messageedit { # ÐодÑÑавлÑем инÑоÑмаÑÐ¸Ñ Ð¾ каÑÑÐ¸Ð½ÐºÐ°Ñ . opendir D,$dirname; while ( my $filename=readdir D) { - next unless $filename =~/^${id}_/; + next unless $filename =~/^${id}_/; my $pic = "$dirname/$filename"; my $picitem = newlistelement($form,"picture","picturelist"); my ($w,$h) = imgsize($pic); @@ -1733,7 +1733,7 @@ sub show_messageedit { substinfo($picitem,[class=>"filename"],_content =>$filename); } closedir D; - send_to_user($form,"edit_message",$cgi,$forum); + send_to_user($form,"edit_message",$cgi,$forum); } # Ðоказ ÑÐµÐ¼Ñ Ð´Ð»Ñ ÑедакÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ sub show_topicedit { @@ -1743,8 +1743,8 @@ sub show_topicedit { $dirname =~ s/\/([^\/]+).html$//; my $urlname=$1; my $topic = $tree->look_down("class"=>"topic"); - show_error($forum,"У Ð²Ð°Ñ Ð½ÐµÑ Ð¿Ñав на ÑедакÑиÑованиее ÑÑой ÑемÑ") - unless moderator_or_author($cgi,$forum,$topic); + show_error($forum,"У Ð²Ð°Ñ Ð½ÐµÑ Ð¿Ñав на ÑедакÑиÑованиее ÑÑой ÑемÑ") + unless moderator_or_author($cgi,$forum,$topic); # ÐÑбиÑаем даннÑе ÑообÑÐµÐ½Ð¸Ñ my ($text) = $topic->look_down(class=>"abstract")->content_list; my ($subject) = $topic->look_down(class=>"title"); @@ -1760,9 +1760,9 @@ sub show_topicedit { # Ðоказ ÑоÑÑма Ð´Ð»Ñ ÑедакÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ sub show_forumedit { my ($cgi,$forum,$path) = @_; - show_error($forum,"У Ð²Ð°Ñ Ð½ÐµÑ Ð¿Ñав на ÑедакÑиÑованиее ÑÑого ÑоÑÑма") + show_error($forum,"У Ð²Ð°Ñ Ð½ÐµÑ Ð¿Ñав на ÑедакÑиÑованиее ÑÑого ÑоÑÑма") unless (getrights($cgi,$forum) eq 'moderator' || getrights($cgi,$forum) eq - 'admin'); + 'admin'); my ($tree,$lockfd) = gettree($path."/".$forum->{indexfile}); my $dirname = $path; @@ -1798,26 +1798,26 @@ sub show_forumedit { unless ($logo) { substinfo($form,[class=>"picture"], style=>"display: none;"); - } + } send_to_user($form,"edit_forum",$cgi,$form); -} +} sub messageedit { my ($cgi,$forum,$topic,$id) = @_; my ($tree,$lockfd) = gettree($path_translated); my ($msg) = $tree->look_down(id=>$id); show_error($forum,"Рданной Ñеме Ð½ÐµÑ Ñеплики Ñ id=$id") if (!$msg); - show_error($forum,"У Ð²Ð°Ñ Ð½ÐµÑ Ð¿Ñав на ÑедакÑиÑованиее ÑÑого ÑообÑениÑ") - unless moderator_or_author($cgi,$forum,$msg); + show_error($forum,"У Ð²Ð°Ñ Ð½ÐµÑ Ð¿Ñав на ÑедакÑиÑованиее ÑÑого ÑообÑениÑ") + unless moderator_or_author($cgi,$forum,$msg); # ÐбÑабоÑка каÑÑинок my ($dirname,$topic_id)=($1,$2) if $path_translated=~/(.+)\/([^\/]+).html/; # 1. УдалÑем помеÑеннÑе как ÑаковÑе for my $file ($cgi->param("delpictire")) { unlink $dirname."/".$file; - } + } # 2. Ð¡Ð¾Ñ ÑанÑем ÑвежепÑиаÑÑаÑеннÑе my %attached=save_attached_images($cgi,$forum,$dirname,"${id}_%f",grep(/^image\d+/,$cgi->param)); - + # ÐÑеобÑазÑем ÑекÑÑ Ð² html my $txtree = input2tree($cgi,$forum,"text"); fix_image_links($cgi,$txtree,\%attached,$dirname); @@ -1825,7 +1825,7 @@ sub messageedit { substinfo($msg,[class=>"subject"],_content=>$cgi->param("subject")); substinfo($msg,[class=>"editdate"],_content=>$edited); makeuserlink($forum,$msg,"editor",$forum->{authenticated}); - unhide_list($msg,"edited"); + unhide_list($msg,"edited"); my $textnode = $msg->look_down(class=>"mtext"); my ($old_text)=$textnode->splice_content(0,1,$txtree); $old_text->delete; @@ -1843,10 +1843,10 @@ sub topicedit { my ($cgi,$forum,$topic) = @_; show_error($forum,"ÐÐµÑ Ñакой ÑÐµÐ¼Ñ ".$cgi->path_info) if (!-f $path_translated); - show_error($forum,"У Ð²Ð°Ñ Ð½ÐµÑ Ð¿Ñав на ÑедакÑиÑованиее ÑÑой ÑемÑ") - unless moderator_or_author($cgi,$forum,$topic); + show_error($forum,"У Ð²Ð°Ñ Ð½ÐµÑ Ð¿Ñав на ÑедакÑиÑованиее ÑÑой ÑемÑ") + unless moderator_or_author($cgi,$forum,$topic); form_error("edit_topic",$cgi,$forum,"Тема должна имеÑÑ Ð½ÐµÐ¿ÑÑÑое название") - if (!$cgi->param("title")); + if (!$cgi->param("title")); my $abstract = input2tree($cgi,$forum,"abstract"); my ($tree,$lockfd) = gettree($path_translated); my $subtree = $tree->look_down("class"=>"topic"); @@ -1859,7 +1859,7 @@ sub topicedit { } else { substinfo($tree,["class"=>"title"], _content=>$cgi->param("title")); - } + } savetree($path_translated,$tree,$lockfd); $tree->destroy; my ($dir,$id) = ($1,$2) if $path_translated=~/^(.*)\/([^\/]+).html$/; @@ -1867,21 +1867,21 @@ sub topicedit { my $item = $tree->look_down(id=>$id); substinfo($item,[_tag=>"a","class"=>"title"], _content=>$cgi->param("title")); - substinfo($item,["class"=>"abstract"],_content=>$abstract); + substinfo($item,["class"=>"abstract"],_content=>$abstract); savetree($dir."/".$forum->{"indexfile"},$tree,$lockfd); forum_redirect($cgi,$forum); } sub forumedit { my ($cgi,$forum,$dir) = @_; - show_error($forum,"У Ð²Ð°Ñ Ð½ÐµÑ Ð¿Ñав на ÑедакÑиÑованиее ÑÑого ÑоÑÑма") + show_error($forum,"У Ð²Ð°Ñ Ð½ÐµÑ Ð¿Ñав на ÑедакÑиÑованиее ÑÑого ÑоÑÑма") unless (getrights($cgi,$forum) eq 'moderator' || getrights($cgi,$forum) eq - 'admin'); + 'admin'); if (!-d $path_translated) { show_error($forum,"ÐпеÑаÑÐ¸Ñ ÑедакÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑоÑÑÐ¼Ð°Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²Ñзвана ÑолÑко Ñо ÑÑÑаниÑÑ ÑоÑÑма"); - } + } if (!$cgi->param("title")) { form_error("edit_forum",$cgi,$forum,"ФоÑÑм должен имеÑÑ Ð½ÐµÐ¿ÑÑÑое название"); } @@ -1892,7 +1892,7 @@ sub forumedit { $logo_name = $forum->{"templatesurl"}."/1x1.gif"; $logo_width = 1; $logo_height=1; - } + } if ($cgi->param("logo")) { # УдалÑем вÑе, ÑÑо Ð¿Ð¾Ñ Ð¾Ð¶Ðµ на логоÑип opendir D, $path_translated; @@ -1904,7 +1904,7 @@ sub forumedit { $logo_name=(save_attached_images($cgi,$forum,$path_translated,"logo.%e","logo"))[1]; ($logo_width,$logo_height) = imgsize("$path_translated/$logo_name"); } - my ($tree,$lockfd) = gettree($path_translated . "/".$forum->{indexfile}); + my ($tree,$lockfd) = gettree($path_translated . "/".$forum->{indexfile}); my $abstract = input2tree($cgi,$forum,"abstract"); substinfo($tree,[_tag=>"meta","name"=>"description"],content=>$abstract->as_trimmed_text) if $abstract; substinfo($tree,[_tag=>"title"],_content=>$cgi->param("title")); @@ -1915,17 +1915,17 @@ sub forumedit { # нам еÑе понадобиÑÑÑ Ð² ÑпиÑке Ñем. substinfo($subtree,["class"=>"abstract"],_content=>$abstract->clone) if $abstract; substinfo($subtree,[_tag=>"img","class"=>"logo"], - src=> $logo_name, width=>$logo_width, height=>$logo_height) + src=> $logo_name, width=>$logo_width, height=>$logo_height) if defined($logo_name); savetree($path_translated ."/".$forum->{indexfile},$tree,$lockfd); $tree->destroy; if ($path_translated ne $forum->{forumroot}) { my ($updir,$id) = ($1,$2) if $path_translated=~/^(.*)\/([^\/]+)$/; - ($tree,$lockfd) = gettree($updir . "/".$forum->{indexfile}); + ($tree,$lockfd) = gettree($updir . "/".$forum->{indexfile}); my $item = $tree->look_down(id=>$id); - substinfo($item,[_tag=>"a","class"=>"title"], + substinfo($item,[_tag=>"a","class"=>"title"], _content=>$cgi->param("title")); - substinfo($item,["class"=>"abstract"],_content=>$abstract); + substinfo($item,["class"=>"abstract"],_content=>$abstract); substinfo($item,[_tag=>"img","class"=>"logo"],src=>"$id/$logo_name", width=>$logo_width,height=>$logo_height) if $logo_name; savetree($updir."/".$forum->{"indexfile"},$tree,$lockfd); @@ -1933,11 +1933,11 @@ sub forumedit { forum_redirect($cgi,$forum); } -#---------------------------------------------------------- +#---------------------------------------------------------- # Ðаза полÑзоваÑелей и пÑава доÑÑÑпа #---------------------------------------------------------- # -# ÐапиÑÑÐ²Ð°ÐµÑ Ð² Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¿Ð¾Ð»ÑзоваÑелей, ÑколÑко ÐºÐ°ÐºÐ¸Ñ Ð¾Ð±ÑекÑов +# ÐапиÑÑÐ²Ð°ÐµÑ Ð² Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¿Ð¾Ð»ÑзоваÑелей, ÑколÑко ÐºÐ°ÐºÐ¸Ñ Ð¾Ð±ÑекÑов # Ñоздал ÑекÑÑий полÑзоваÑÐµÐ»Ñ # sub record_statistics { @@ -1960,8 +1960,8 @@ sub getrights { my ($cgi,$forum) = @_; if (!$forum->{authenticated}) { return undef; - } - return $forum->{authenticated}{rights} if + } + return $forum->{authenticated}{rights} if exists $forum->{authenticated}{rights}; my $user = $forum->{authenticated}{user}; my $dir = $path_translated; @@ -1970,7 +1970,7 @@ sub getrights { my $f; my $user_status = "normal"; LEVEL: - while (length($dir)) { + while (length($dir)) { if (-f "$dir/perms.txt") { open $f,"<","$dir/perms.txt"; my $status = undef; @@ -1982,23 +1982,23 @@ sub getrights { if ($user eq $_ && defined $status) { if ($status eq "banned") { return $forum->{authenticated}{rights}=$status; - } + } if ($status eq "admins" ) { return $forum->{authenticated}{rights}="admin"; } $user_status = "moderator"; } - } + } } close $f; last LEVEL if -f "$dir/.forum"; - } + } # Strip last path component. - $dir =~s/\/[^\/]+$// - } + $dir =~s/\/[^\/]+$// + } return $forum->{authenticated}{rights}=$user_status; -} +} @@ -2017,7 +2017,7 @@ sub gettree { flock $f, LOCK_EX; my $tree = treefromfile($f); return ($tree,$f); -} +} # # Ð¡Ð¾Ñ ÑаниÑÑ Ð´ÐµÑево и закÑÑÑÑ lockfd. # @@ -2025,26 +2025,26 @@ sub gettree { sub replacefile { my $filename = shift; my $content = shift; - my $f; + my $f; open $f,">",$filename . ".new" or return undef; print $f $content; close $f; # FIXME - ÑолÑко Ð´Ð»Ñ POSIX. unlink $filename; rename $filename.".new",$filename; -} +} sub savetree { my ($filename,$tree,$lockfd) = @_; replacefile($filename,output_html($tree)); close $lockfd if defined($lockfd); -} +} sub discardtree { my ($tree,$lockfd) = @_; flock $lockfd,LOCK_UN; close $lockfd; $tree->delete; -} +} # # CеÑиализоваÑÑ HTML-докÑÐ¼ÐµÐ½Ñ Ñ DOCTYPE (workaround вокÑÑг баги в # HTML::TreeBuilder) @@ -2055,7 +2055,7 @@ sub output_html { confess "Tree is not HTML::TreeBuilder" unless ref($tree) eq "HTML::TreeBuilder"; return '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">'. $tree->as_HTML("<>&"); -} +} # # ЧиÑÐ°ÐµÑ Ñаблон и подгоÑÐ°Ð²Ð»Ð¸Ð²Ð°ÐµÑ ÐµÐ³Ð¾ к ÑазмеÑÐµÐ½Ð¸Ñ Ð¿Ð¾ Ñказанной URL. # ÐÑли url не Ñказана, ÑÑиÑаеÑÑÑ ÑÑо Ñаблон бÑÐ´ÐµÑ Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½ как ÑезÑлÑÑÐ°Ñ @@ -2072,7 +2072,7 @@ sub gettemplate { my $tree = treefromfile($filename); fix_forum_links($forum,$tree,$url); return $tree; -} +} # # Ð¡Ð¾Ð·Ð´Ð°ÐµÑ Ð¾Ð±ÑÐµÐºÑ HTML::TreeBuilder и вÑÑÑавлÑÐµÑ ÑÑд опÑий. @@ -2081,29 +2081,29 @@ sub gettemplate { sub make_tree { my $tree = HTML::TreeBuilder->new; # Set some options for treebuilder - # Comments are neccessary to convert HTML back to BBCode + # Comments are neccessary to convert HTML back to BBCode $tree->store_comments(1); # Avoid converting html into one long-long string $tree->ignore_ignorable_whitespace(0); $tree->no_space_compacting(1); $tree->p_strict(1); return $tree; -} +} sub treefromfile { my ($f) = shift; my $tree = make_tree(); $tree->parse_file($f); return $tree; -} +} # # ÐолÑÑÐ°ÐµÑ ÑникалÑнÑй ÑиÑловой иденÑиÑикаÑоÑ. -# +# sub get_uid { my $forum = shift; my $f; - open $f,"+<",datafile($forum,"sequence") or - flock $f,LOCK_EX; + (sysopen $f, datafile($forum,"sequence"), O_RDWR | O_CREAT, 0644) or + flock $f,LOCK_EX; my $id=<$f> || "0"; $id++; seek $f,0,0; @@ -2122,12 +2122,12 @@ sub create_openid_consumer { args => $cgi, consumer_secret=>"X9RWPo0rBE7yLja6VB3d", required_root => $cgi->url(-base=>1)); -} +} # openidstart - вÑзÑваеÑÑÑ ÐºÐ¾Ð³Ð´Ð° обнаÑÑжено ÑÑо ÑекÑÑее Ð¸Ð¼Ñ # полÑзоваÑелÑ, пÑÑаÑÑегоÑÑ Ð°ÑÑенÑиÑиÑиÑоваÑÑÑÑ, ÑодеÑÐ¶Ð¸Ñ http:// -# +# # sub openidstart { @@ -2140,7 +2140,7 @@ sub openidstart { my $csr = create_openid_consumer($cgi,$forum); my $claimed_identity=$csr->claimed_identity($openidurl); if (!defined $claimed_identity) { - show_error($forum,"Ð£ÐºÐ°Ð·Ð°Ð½Ð½Ð°Ñ URL $openidurl не ÑвлÑеÑÑÑ OpenId"); + show_error($forum,"Ð£ÐºÐ°Ð·Ð°Ð½Ð½Ð°Ñ URL $openidurl не ÑвлÑеÑÑÑ OpenId"); exit; } $cgi->param("openidvfy",1); @@ -2152,12 +2152,12 @@ sub openidstart { trust_root=> $cgi->url(-base=>1)); print $cgi->redirect(-location=>$check_url); exit; -} +} # # ÐÑзÑваеÑÑÑ Ð¿Ñи ÑедиÑекÑе Ð¾Ñ openid producer-а. ÐÑовеÑÑеÑ, ÑÑо # ÑдаленнÑй ÑеÑÐ²ÐµÑ Ð¿Ð¾Ð´ÑвеÑдил openid и вÑзÑÐ²Ð°ÐµÑ Ð¾Ð¿ÐµÑаÑÐ¸Ñ Ð´Ð»Ñ ÐºÐ¾ÑоÑой # (либо возвÑÐ°Ñ Ð½Ð° иÑÑ Ð¾Ð´Ð½ÑÑ ÑÑÑаниÑÑ Ð¿Ñи опеÑаÑии login, либо поÑÑинг -# Ñеплики) +# Ñеплики) # sub openid_verify { my ($action,$cgi,$forum) = @_; @@ -2170,23 +2170,23 @@ sub openid_verify { иденÑиÑноÑÑÑ"); exit; } elsif (my $vident = $csr->verified_identity) { - #УÑпеÑÐ½Ð°Ñ Ð°ÑÑенÑиÑикаÑиÑ. + #УÑпеÑÐ½Ð°Ñ Ð°ÑÑенÑиÑикаÑиÑ. #Создаем ÑеÑÑÐ¸Ñ - my $user = $vident->url; + my $user = $vident->url; # Remove trailing slash from URL if any $user=~s/\/$//; my %userbase; dbmopen %userbase,datafile($forum,"passwd"),0664; - my $username = $user; + my $username = $user; $username =~ s/^http:\/\///; if (!$userbase{$username}) { # ТаÑим foaf, еÑли полÑÑиÑÑÑ my %info=get_foaf($csr->ua,$vident->declared_foaf); if (ref($info{'avatar'}) eq "HASH" ) { delete $info{'avatar'}{'type'}; - } + } $info{"openiduser"}=1; - $info{"registered"}=time; + $info{"registered"}=time; set_default_user_attrs($forum,\%info); $info{'status'} = $forum->{openid_status} if $forum->{openid_status}; $forum->{authenticated}=\%info; @@ -2195,27 +2195,27 @@ sub openid_verify { $forum->{authenticated} = thaw ($userbase{$username}); } dbmclose %userbase; - if (defined $forum->{denied_status} && + if (defined $forum->{denied_status} && ($forum->{authenticated}{status} eq $forum->{denied_status})) { - show_error($forum,"ÐÑ Ð¾Ð´ полÑзоваÑÐµÐ»Ñ $username в ÑиÑÑÐµÐ¼Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñован"); - } + show_error($forum,"ÐÑ Ð¾Ð´ полÑзоваÑÐµÐ»Ñ $username в ÑиÑÑÐµÐ¼Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñован"); + } $forum->{"authenticated"}{"user"} = $username; newsession(undef,$forum,$user); # ÐÑли Ñказан паÑамеÑÑ reply, вÑзÑваем обÑабоÑÐºÑ Ñеплики - if ($cgi->param("reply")) { + if ($cgi->param("reply")) { reply("reply",$cgi,$forum); exit; - } + } #ÐнаÑе, возвÑаÑаемÑÑ Ð½Ð° иÑÑ Ð¾Ð´Ð½ÑÑ ÑÑÑаниÑÑ forum_redirect($cgi,$forum,undef); } else { show_error($forum,"ÐÑибка OpenId аÑÑенÑиÑикаÑии"); exit; - } + } } sub get_avatar_info { - my ($url,$ua) = @_; + my ($url,$ua) = @_; $ua = LWP::UserAgent->new( agent => "Stilllife/1.0") unless $ua; my $response = $ua->get($url); if ($response->is_success) { @@ -2225,21 +2225,21 @@ sub get_avatar_info { } else { print STDERR "Error getting $url: ".$response->status_line,"\n"; return undef; - } + } } sub get_foaf { - my ($ua,$foaf_url) = @_; + my ($ua,$foaf_url) = @_; my $response = $ua->get($foaf_url); unless ($response->is_success) { print STDERR "Error geting foaf from $foaf_url\n"; return (); - } + } my $foaf = $response->content; my %info = foaf_parse($foaf); if ($info{avatar}) { $info{avatar} = get_avatar_info($info{avatar},$ua); - } + } return %info; } @@ -2268,25 +2268,25 @@ sub input2tree { my $text = $cgi->param($field_name); return "" if (!$text); if ($format eq "bbcode") { - my $parser = HTML::BBReverse->new(); + my $parser = HTML::BBReverse->new(); $text="<div class=\"bbcode\">".$parser->parse($text)."</div>"; } elsif ($format eq "text") { $text = escapeHTML($text); $text=~s/\r?\n\r?\n/<\/p><p class=\"text\">/sg; $text=~s/\r?\n/<br>/sg; $text = "<div><p class=\"text\">$text</p></div>"; - } + } my $txtree = str2tree($text); for my $badtag ("script","style","head","html","object","embed","iframe","frameset","frame", ($forum->{forbid_tags}?split(/\s*,\s*/,$forum->{forbid_tags}):())) { for my $element ($txtree->find_by_tag_name($badtag)) { $element->delete() if defined $element; - } - } + } + } # FIXME ÐÑовеÑÑем на налиÑие URL-ок не оÑоÑмленнÑÑ ÑÑÑлками. return $txtree; -} +} sub tree2input { @@ -2312,7 +2312,7 @@ sub str2tree { $element->detach; $tree->destroy; return $element; -} +} sub tree2str { my ($tree)=@_; @@ -2322,9 +2322,9 @@ sub tree2str { #------------------------------------------------------------------------ # ÐодÑÑановка в деÑеве #------------------------------------------------------------------------ -# ÐÐ°Ñ Ð¾Ð´Ð¸Ñ +# ÐÐ°Ñ Ð¾Ð´Ð¸Ñ # ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ñказанного клаÑÑа и ÑдалÑÐµÑ display: none из его аÑÑибÑÑа -# style. ÐозвÑаÑÐ°ÐµÑ 1, еÑли ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð±Ñл ÑаÑкÑÑÑ, и 0, еÑли он и до ÑÑого +# style. ÐозвÑаÑÐ°ÐµÑ 1, еÑли ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð±Ñл ÑаÑкÑÑÑ, и 0, еÑли он и до ÑÑого # бÑл видимÑм. sub unhide_list { my ($tree,$class) = @_; @@ -2336,9 +2336,9 @@ sub unhide_list { return 1; } else { return 0; - } - } -} + } + } +} # # ÐÐ°Ñ Ð¾Ð´Ð¸Ñ Ð¿ÐµÑвÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ñказанного клаÑÑа, и пÑипиÑÑÐ²Ð°ÐµÑ ÐµÐ¼Ñ display: # none в style. @@ -2353,42 +2353,42 @@ sub hide_list { my $style = $msglist->attr("style"); unless ($style=~ s/\bdisplay:\s+\w+\s*;/display: none;/) { $style .= "display: none;"; - } + } $msglist->attr("style",$style); - } + } return 1; -} +} # # УдалÑÐµÑ Ð¸Ð· ÑпиÑка ÑлеменÑ, еÑли он не поÑледий. ÐÑли поÑледний - -# ÑкÑÑÐ²Ð°ÐµÑ Ð²ÐµÑÑ ÑпиÑок. ÐÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð¾Ð¶Ð½Ð¾ ÑказÑваÑÑ ÐºÐ°Ðº ÑÑÑлкой на обÑÐµÐºÑ -# HTML::Element, Ñак и знаÑением аÑÑибÑÑа id +# ÑкÑÑÐ²Ð°ÐµÑ Ð²ÐµÑÑ ÑпиÑок. ÐÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð¾Ð¶Ð½Ð¾ ÑказÑваÑÑ ÐºÐ°Ðº ÑÑÑлкой на обÑÐµÐºÑ +# HTML::Element, Ñак и знаÑением аÑÑибÑÑа id # sub delete_from_list { my ($tree,$listclass,$itemclass,$item) = @_; my $list = $tree->look_down(class =>$listclass); ($item) = $list->look_down(id =>$item) unless ref($item); return undef unless $item; - my (@items)=$tree->look_down(class=>$itemclass); + my (@items)=$tree->look_down(class=>$itemclass); if (@items == 1) { hide_list($tree,$listclass); } else { $item->delete; } return 1; -} +} # # ÐайÑи вÑе ÑлеменÑÑ, ÑдоволеÑвоÑÑÑÑие Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ ÐºÑиÑеÑÐ¸Ñ Ð¸ подÑÑавиÑÑ Ð² # Ð½Ð¸Ñ ÑказаннÑе аÑÑибÑÑÑ -# +# # ÐаÑамеÑÑÑ 1. ÐеÑево (клаÑÑа HTML::Element) -# 2. ÐапÑÐ¾Ñ - ÑÑÑлка на ÑпиÑок вида аÑÑибÑÑ=>знаÑение. +# 2. ÐапÑÐ¾Ñ - ÑÑÑлка на ÑпиÑок вида аÑÑибÑÑ=>знаÑение. # ÐÑÐ¾Ñ ÑпиÑок бÑÐ´ÐµÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно пеÑедан в # HTML::Element::look_down # 3. Ðалее паÑÑ Ð¸Ð¼Ñ-аÑÑибÑÑа, знаÑение. ÐÑли вмеÑÑо имени аÑÑибÑÑа # иÑполÑзоваÑÑ Ñлово _content, заменено бÑÐ´ÐµÑ ÑодеÑжимое ÑлеменÑа. # ÐнаÑение Ð´Ð»Ñ _content - ÑÑÑлка на HTML::Element. ÐÑли Ñам ÑÑÑока, # она бÑÐ´ÐµÑ Ð²ÑÑавлена как одиноÑнÑй ÑекÑÑовÑй Ñзел. -# 4. ÐозвÑаÑÐ°ÐµÑ ÑиÑло вÑполненнÑÑ Ð¿Ð¾Ð´ÑÑановок (0, еÑли иÑкомÑÑ ÑлеменÑов +# 4. ÐозвÑаÑÐ°ÐµÑ ÑиÑло вÑполненнÑÑ Ð¿Ð¾Ð´ÑÑановок (0, еÑли иÑкомÑÑ ÑлеменÑов # не найдено. # sub substinfo { @@ -2406,18 +2406,18 @@ sub substinfo { } else { $element->push_content($value); } - } else { + } else { $element->attr($attr,$value); - } - } + } + } } - return $count; + return $count; } # -# newlistelement($tree,$elementclass,$listclass) +# newlistelement($tree,$elementclass,$listclass) # -# ÐÑли ÑпиÑок Ñ ÑказаннÑм клаÑÑом ÑкÑÑÑ, ÑаÑкÑÑÐ²Ð°ÐµÑ ÐµÐ³Ð¾ и возвÑаÑÐ°ÐµÑ -# (единÑÑвеннÑй) ÑÐ»ÐµÐ¼ÐµÐ½Ñ +# ÐÑли ÑпиÑок Ñ ÑказаннÑм клаÑÑом ÑкÑÑÑ, ÑаÑкÑÑÐ²Ð°ÐµÑ ÐµÐ³Ð¾ и возвÑаÑÐ°ÐµÑ +# (единÑÑвеннÑй) ÑÐ»ÐµÐ¼ÐµÐ½Ñ sub newlistelement { my ($tree,$element,$list) =@_; my $msglist = $tree->look_down("class"=>$list); @@ -2436,7 +2436,7 @@ sub newlistelement { } else { return undef; } -} +} sub escapeHTML { local $_ = shift; @@ -2444,4 +2444,4 @@ sub escapeHTML { s/\</</g; s/\>/>/g; return $_; -} +}