diff --git a/.gitignore b/.gitignore index 16b42aab4..b647e70f5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,13 @@ /META.yml /Makefile /inc +*.bak +*.old +*.log +var +wwwdocs +actdocs +git +github-hook +conf +*.sw[p-z] diff --git a/Makefile.PL b/Makefile.PL index 90d1804ab..08be65016 100644 --- a/Makefile.PL +++ b/Makefile.PL @@ -31,6 +31,7 @@ requires( 'JSON::XS' => 0, 'LWP::Simple' => 0, 'LWP::UserAgent' => 0, +'lib::abs' => '0.93', 'List::Pairwise' => 0, 'Locale::Maketext::Lexicon' => 0, 'Net::OpenID::Server' => 0, diff --git a/app.psgi b/app.psgi index 2463b3fd5..62d46329b 100644 --- a/app.psgi +++ b/app.psgi @@ -1,14 +1,16 @@ #!/usr/bin/env perl - use strict; use warnings; -use lib 'lib'; +use lib::abs 'lib'; use Act::Dispatcher; use Plack::Builder; builder { - enable 'Session::Cookie'; + enable 'Session', + session_key => 'act_session', + expires => 3600 * 24 * 30, # 30 days + secret => 'abcddcba'; enable "SimpleLogger", level => "warn"; Act::Dispatcher->to_app; }; diff --git a/cpanfile b/cpanfile new file mode 100644 index 000000000..a31c18da4 --- /dev/null +++ b/cpanfile @@ -0,0 +1,56 @@ +requires 'AppConfig' => 0; +requires 'Clone' => 0; +requires 'Crypt::Eksblowfish::Bcrypt' => 0; +requires 'DBI' => 0; +requires 'DBD::Pg' => 1.22; +requires 'Data::ICal' => '0.16'; # Data::ICal::Entry::Event +requires 'Data::ICal::DateTime' => 0; +requires 'Data::ICal::TimeZone' => 0; +requires 'DateTime::Format::Pg' => 0; +requires 'DateTime::Locale' => 0; +requires 'DateTime::TimeZone' => 0; +requires 'DateTime' => 0; +requires 'Digest::HMAC_SHA1' => 0; +requires 'Email::Address' => 0; +requires 'Email::Date' => 0; +requires 'Email::MessageID' => 1.4; +requires 'Email::Send' => 0; +requires 'Email::Send::Sendmail' => 0; +requires 'Email::Simple::Creator' => 0; +requires 'Email::Simple' => 0; +requires 'Email::Valid' => 0; +requires 'Flickr::API' => 0; +requires 'HTML::Entities' => 0; +requires 'HTML::TagCloud' => 0; +requires 'HTTP::Request::Common' => 0; +requires 'Imager' => 0; +requires 'JSON::XS' => 0; +requires 'LWP::Simple' => 0; +requires 'LWP::UserAgent' => 0; +requires 'lib::abs' => '0.93'; +requires 'List::Pairwise' => 0; +requires 'Locale::Maketext::Lexicon' => 0; +requires 'Net::OpenID::Server' => 0; +requires 'Pod::POM' => 0; +requires 'Plack' => 0; +requires 'Plack::App::Cascade' => 0; +requires 'Plack::Builder' => 0; +requires 'Plack::Middleware::Session::Cookie' => 0; +requires 'Plack::Request' => 0; +requires 'Plack::Util::Accessor' => 0; +requires 'Plack::Test' => 0; +requires 'Template' => 2.16; # Template::Constants +requires 'Template::Multilingual::Parser' => 0; +requires 'Term::ReadKey' => 0; +requires 'Test::Deep::NoTest' => 0; +requires 'Test::MockObject' => 0; +requires 'Text::Diff' => 0; +requires 'Text::WikiFormat' => 0; +requires 'Text::xSV' => 0; +requires 'Try::Tiny' => 0; +requires 'URI::Escape' => 0; +requires 'URI' => 1.31; +requires 'Wiki::Toolkit' => 0; # Wiki::Toolkit::Formatter::Default Wiki::Toolkit::Store::Pg +requires 'XML::Atom' => '0.20'; # XML::Atom::Entry XML::Atom::Feed XML::Atom::Link +requires 'parent' => 0; +requires 'version' => 0; diff --git a/lib/Act/Dispatcher.pm b/lib/Act/Dispatcher.pm index d18fc168d..5d44d89d6 100644 --- a/lib/Act/Dispatcher.pm +++ b/lib/Act/Dispatcher.pm @@ -78,7 +78,11 @@ sub to_app { sub { my $env = shift; my $req = Plack::Request->new($env); - $env->{'act.base_url'} = $req->base->as_string; + + # Make sure there is no trailing slash in base_url + my $base_url = $req->base->as_string; + $base_url =~ s{/$}{}; + $env->{'act.base_url'} = $base_url; $env->{'act.dbh'} = Act::Util::db_connect(); $app->($env); }; @@ -101,7 +105,10 @@ sub to_app { } sub conference_app { - my $static_app = Act::Handler::Static->new; + my $static_app = builder { + enable '+Act::Middleware::Auth'; + Act::Handler::Static->new->to_app; + }; builder { enable '+Act::Middleware::Language'; enable sub { @@ -158,7 +165,7 @@ sub _handler_app { my $subhandler = $1; } _load($handler); - return $handler->new(subhandler => $subhandler); + return $handler->new(subhandler => $subhandler)->to_app; } sub _load { diff --git a/lib/Act/Handler/Login.pm b/lib/Act/Handler/Login.pm index 30ecf9221..8640bc814 100644 --- a/lib/Act/Handler/Login.pm +++ b/lib/Act/Handler/Login.pm @@ -23,7 +23,7 @@ sub handler error => $env->{'act.login.error'}, destination => $uri, action => join('/', '', $Request{conference}, 'LOGIN'), - domain => join('.', (split /\./, $r->env->{SERVER_NAME})[-2, -1]), + domain => join('.', (split /\./, $r->env->{HTTP_HOST})[-2, -1]), ); $template->process('login'); $Request{status} = 200; diff --git a/lib/Act/Handler/User/Register.pm b/lib/Act/Handler/User/Register.pm index 12b040340..23f5a13f2 100644 --- a/lib/Act/Handler/User/Register.pm +++ b/lib/Act/Handler/User/Register.pm @@ -66,7 +66,7 @@ sub handler "INSERT INTO participations (user_id, conf_id, datetime, ip) VALUES (?,?, NOW(), ?);" ); $sth->execute( $Request{user}->user_id, $Request{conference}, - $Request{r}->connection->remote_ip ); + $Request{r}->address ); $sth->finish(); $Request{dbh}->commit; return Act::Util::redirect(make_uri('main')) diff --git a/lib/Act/Middleware/Auth.pm b/lib/Act/Middleware/Auth.pm index ecb1583ac..780d5e22f 100644 --- a/lib/Act/Middleware/Auth.pm +++ b/lib/Act/Middleware/Auth.pm @@ -4,6 +4,7 @@ use warnings; use parent qw(Plack::Middleware); use Plack::Request; +use Plack::Response; use Act::Config (); use Try::Tiny; use Plack::Util::Accessor qw(private); @@ -97,7 +98,7 @@ sub check_login { $user->check_password($sent_pw); } catch { - die ['Bad password']; + die ["Bad password. (Error: $_)"]; }; # user is authenticated - create a session @@ -110,14 +111,14 @@ sub check_login { catch { my $env = $req->env; - my $error = $_->[0]; + my $error = ref $_ eq 'ARRAY' ? $_->[0] : $_; my $full_error = join ' ', map { "[$_]" } - $env->{SERVER_NAME}, + $env->{HTTP_HOST}, $req->address, $login, $error; - $req->logger->({ level => 'error', $full_error }); + $req->logger->({ level => 'error', message => $full_error }); $env->{'act.login.destination'} = $dest; $env->{'act.login.error'} = 1; diff --git a/lib/Act/Middleware/Language.pm b/lib/Act/Middleware/Language.pm index f761c03f1..daa909ec0 100644 --- a/lib/Act/Middleware/Language.pm +++ b/lib/Act/Middleware/Language.pm @@ -29,7 +29,7 @@ sub call { $language = $s->{language} = $force_language; my $uri = $req->uri; my @query = $uri->query_form; - for (my $i; $i < @query; $i+=2 ) { + for (my $i = 0; $i < @query; $i += 2 ) { if ($query[$i] eq 'language') { splice @query, $i, 2; } @@ -37,6 +37,7 @@ sub call { $uri->query_form(\@query); my $resp = Plack::Response->new; $resp->redirect($uri->as_string); + $env->{'psgix.session'}->{'act'}->{language} = $language; return $resp->finalize; } diff --git a/lib/Act/Request.pm b/lib/Act/Request.pm index 1818061e8..6942782d6 100644 --- a/lib/Act/Request.pm +++ b/lib/Act/Request.pm @@ -60,6 +60,10 @@ sub upload { # XXX returned value must support fh method (return psgi.input? but that only supports readline...) } +sub header_in { + shift->header(@_); +} + 1; __END__ diff --git a/lib/Act/User.pm b/lib/Act/User.pm index de1712e69..44a52a61d 100644 --- a/lib/Act/User.pm +++ b/lib/Act/User.pm @@ -342,8 +342,9 @@ sub possible_duplicates { for my $attr (qw( login email nick_name full_name last_name )) { push @twins, grep { !$seen{ $_->user_id }++ } map {@$_} - Act::User->get_items( $attr => map { s/([.*(){}^$?])/\\$1/g; $_ } - $self->$attr() ) + Act::User->get_items( + $attr => map { s/([.*(){}^\$?])/\\$1/g; $_ } $self->$attr() + ) if $self->$attr(); } $_->most_recent_participation() for @twins; @@ -381,7 +382,7 @@ sub set_password { my $self = shift; my $password = shift; my $crypted = $self->_crypt_password($password); - $Request{user}->update( passwd => $crypted ); + $self->update( passwd => $crypted ); return 1; } diff --git a/lib/Act/Util.pm b/lib/Act/Util.pm index 9b7f030b4..442bf7adf 100644 --- a/lib/Act/Util.pm +++ b/lib/Act/Util.pm @@ -184,7 +184,7 @@ sub date_format my $dt = ref $s ? $s : DateTime::Format::Pg->parse_timestamp($s); my $lang = $Request{language} || $Config->general_default_language; my $variant = $Config->language_variants->{$lang} || $lang; - $dt->set(locale => $variant); + $dt->set_locale($variant); if ($variant =~ /^((\w+)_.*)$/) { # $1 = en_US, $2 = en $variant = $2 unless exists $Act::Config::Languages{$variant}; diff --git a/lib/Act/Wiki.pm b/lib/Act/Wiki.pm index 791bd2032..1d5e4a956 100644 --- a/lib/Act/Wiki.pm +++ b/lib/Act/Wiki.pm @@ -14,9 +14,11 @@ use Act::Wiki::Store; sub new { return Wiki::Toolkit->new( - store => Act::Wiki::Store->new(charset => 'UTF-8', - map { $_ => $Config->get("wiki_$_") } - qw(dbname dbuser dbpass)), + store => Act::Wiki::Store->new( + charset => 'UTF-8', + map { $_ => $Config->get("wiki_$_") } + qw(dbhost dbname dbuser dbpass) + ), formatter => Act::Wiki::Formatter->new(), ); } diff --git a/lib/Act/Wiki/Store.pm b/lib/Act/Wiki/Store.pm index 113e56d4b..0ebdff87d 100644 --- a/lib/Act/Wiki/Store.pm +++ b/lib/Act/Wiki/Store.pm @@ -15,4 +15,14 @@ sub check_and_write_node $self->write_node_post_locking( %args ); return 1; } + +sub _get_dbh_connect_attr { + my ($self) = @_; + + return { + %{ $self->SUPER::_get_dbh_connect_attr() }, + pg_enable_utf8 => 0, + }; +} + 1; diff --git a/po/en.po b/po/en.po index 976860c66..ca5b7537d 100644 --- a/po/en.po +++ b/po/en.po @@ -62,9 +62,15 @@ msgstr "Perl mongers group" msgid "Company" msgstr "Company" +msgid "Position" +msgstr "Position" + msgid "Email" msgstr "Email" +msgid "Phone" +msgstr "Phone" + msgid "Web page" msgstr "Web page" diff --git a/po/ru.po b/po/ru.po index a5a8d47dc..e0feb88e6 100644 --- a/po/ru.po +++ b/po/ru.po @@ -58,9 +58,15 @@ msgstr "PM-группа" msgid "Company" msgstr "Компания" +msgid "Position" +msgstr "Должность" + msgid "Email" msgstr "Электронная почта" +msgid "Phone" +msgstr "Телефон" + msgid "Web page" msgstr "Сайт" diff --git a/templates/talk/notify_body b/templates/talk/notify_body index 0fa03c719..9cf4ce2d1 100644 --- a/templates/talk/notify_body +++ b/templates/talk/notify_body @@ -57,5 +57,5 @@ [% talk.abstract %] -{{Comments:}} +{{Comments}}: [% talk.comment %]