X-Git-Url: http://git.ieval.ro/?a=blobdiff_plain;f=lib%2FPlack%2FApp%2FGruntmaster.pm;h=35d788e8887c7e5589c38ffd19d3b80d7fe66e06;hb=90bc9e17c33ac70d287b31fefd4ad7f7997b4c09;hp=a7e4e1dd52dc63c335482347c70359aedd42c400;hpb=1bc7c028ecfdd1cb24ba0b01317bfda06b441a69;p=plack-app-gruntmaster.git diff --git a/lib/Plack/App/Gruntmaster.pm b/lib/Plack/App/Gruntmaster.pm index a7e4e1d..35d788e 100644 --- a/lib/Plack/App/Gruntmaster.pm +++ b/lib/Plack/App/Gruntmaster.pm @@ -4,10 +4,8 @@ use 5.014000; use strict; our $VERSION = '5999.000_001'; -use CSS::Minifier::XS; use Encode qw/encode decode/; use File::Slurp qw/read_file/; -use JavaScript::Minifier::XS; use JSON::MaybeXS qw/encode_json/; use PerlX::Maybe; use Scope::Upper qw/unwind SUB UP/; @@ -54,16 +52,13 @@ use constant FORMAT_EXTENSION => { }; use constant NOT_FOUND => [404, ['X-Forever' => 1, 'Content-Type' => 'text/plain'], ['Not found']]; -use constant FORBIDDEN => [401, ['Content-Type' => 'text/plain', 'WWW-Authenticate' => 'Basic realm="Gruntmaster 6000"'], ['Forbidden']]; - -sub development() { ($ENV{PLACK_ENV} // 'development') eq 'development' } my ($env, $privacy); sub db { $env->{'gruntmaster.dbic'} } sub remote_user { - my $user = $env->{'gruntmaster.user'}; + my $user = $env->{REMOTE_USER}; $user &&= db->user($user); $user } @@ -91,7 +86,7 @@ sub forbid { my ($condition) = @_; $privacy = 'private' if $condition; return if !$condition || admin; - unwind FORBIDDEN, SUB UP + unwind $env->{authcomplex}->unauthorized, SUB UP } sub dispatch_request{ @@ -99,24 +94,7 @@ sub dispatch_request{ $privacy = 'public'; sub (GET) { - sub (/css/:theme) { - my $theme = $_{theme}; - return NOT_FOUND unless -e "css/themes/$theme.css"; - my $css = read_file "css/themes/$theme.css"; - $css .= read_file $_ for ; - my @headers = ('X-Forever' => 1, 'Cache-Control' => 'public, max-age=604800', 'Content-Type' => 'text/css; charset=utf-8'); - [200, \@headers, [development ? $css : CSS::Minifier::XS::minify $css]] - }, - - sub (/js.js) { - my $js; - $js .= read_file $_ for ; - my @headers = ('X-Forever' => 1, 'Cache-Control' => 'public, max-age=604800', 'Content-Type' => 'application/javascript; charset=utf-8'); - [200, \@headers, [development ? $js : JavaScript::Minifier::XS::minify $js]] - }, - sub (/robots.txt) { NOT_FOUND }, - sub (/favicon.ico) { NOT_FOUND }, sub (/src/:job) { return NOT_FOUND if !job; @@ -165,8 +143,9 @@ sub dispatch_request{ }, sub (/ed/:contest) { - forbid contest->is_running; - response ed => 'Editorial of ' . contest->name, db->problem_list(contest => $_{contest}, solution => 1); + forbid !contest->is_finished; + my $pblist = db->problem_list(contest => $_{contest}, solution => 1); + response ed => 'Editorial of ' . contest->name, {%$pblist, editorial => contest->editorial}; }, sub (/login) { @@ -217,26 +196,6 @@ sub dispatch_request{ }, sub (POST) { - sub (/action/register + %:username=&:password=&:confirm_password=&:name=&:email=&:phone=&:town=&:university=&:country=&:level=) { - return reply 'Parameter too long' if grep { length > 200 } values %_; - return reply 'Bad username. Allowed characters are letters, digits and underscores, and the username must be between 2 and 20 characters long.' unless $_{username} =~ USER_REGEX; - return reply 'Username already in use' if db->user($_{username}); - return reply 'The two passwords do not match' unless $_{password} eq $_{confirm_password}; - - db->users->create({id => $_{username}, name => $_{name}, email => $_{email}, phone => $_{phone}, town => $_{town}, university => $_{university}, country => $_{country}, level => $_{level}}); - db->user($_{username})->set_passphrase($_{password}); - - reply 'Registered successfully'; - }, - - sub (/action/passwd + %:password=&:new_password=&:confirm_new_password=) { - forbid !remote_user; - return reply 'Incorrect password' unless remote_user->check_passphrase($_{password}); - return reply 'The two passwords do not match' unless $_{new_password} eq $_{confirm_new_password}; - remote_user->set_passphrase($_{new_password}); - reply 'Password changed successfully'; - }, - sub (/action/submit + %:problem=&:contest~&:prog_format=&:source_code~ + *prog~) { my (undef, undef, $prog) = @_; forbid !remote_user; @@ -264,51 +223,6 @@ sub dispatch_request{ [303, [Location => '/log/' . $newjob->id], []] }, - - sub (/action/request-reset + %:username=) { - return reply 'Password resets are disabled' unless $ENV{GRUNTMASTER_RESET_FROM}; - my $user = db->user($_{username}); - return reply 'No such user' unless $user; - my $token = join ':', $user->make_reset_hmac; - my $body = < -Reset token: $token - -The token is valid for 24 hours. -EOF - my $email = Email::Simple->create( - header => [ - From => $ENV{GRUNTMASTER_RESET_FROM}, - To => $user->email, - Subject => 'Password reset token', - ], - body => $body, - ); - - my $ok = 0; - eval { - sendmail $email; - $ok = 1; - }; - return reply 'Email sent' if $ok; - reply "Failure sending email: $@"; - }, - - sub (/action/reset + %:username=&:password=&:token=) { - my $user = db->user($_{username}); - return reply 'No such user' unless $user; - my ($token, $exp) = split ':', $_{token}; - return reply 'Reset token is expired' if time >= $exp; - return reply 'Bad reset token' unless $user->make_reset_hmac($exp) eq $token; - $user->set_passphrase($_{password}); - reply 'Password reset successfully'; - }, } }