Support source_code input
[gruntmaster-handlers.git] / lib / Gruntmaster / Handlers.pm
CommitLineData
9f02ff25
MG
1package Gruntmaster::Handlers;
2
3use 5.014000;
4use strict;
5use warnings;
6our $VERSION = '0.001';
7
9f02ff25 8use Apache2::Access;
b746d002 9use Apache2::Authen::Passphrase qw/pwcheck pwset USER_REGEX/;
9f02ff25
MG
10use Apache2::AuthzCaps qw/hascaps/;
11use Apache2::RequestRec;
12use Apache2::RequestIO;
13use Apache2::Request;
14use Apache2::Const qw/OK DECLINED/;
15use Apache2::Log;
16use Apache2::Upload;
17
18use Cwd qw/cwd/;
19use File::Basename qw/fileparse/;
20use File::Temp qw/tempdir/;
21use File::Copy qw/move/;
b746d002 22use Gruntmaster::Data qw/contest_start contest_end push_job set_job_inmeta insert_user PUBLISH/;
f0ae016e
MG
23
24use constant FORMAT_EXTENSION => {
25 C => 'c',
26 CPP => 'cpp',
27 MONO => 'cs',
28 JAVA => 'java',
29 PASCAL => 'pas',
30 PERL => 'pl',
31 PYTHON => 'py',
32 RUBY => 'rb',
33};
9f02ff25 34
b746d002
MG
35sub aputs{
36 my ($r, $str) = @_;
37 $r->set_content_length(length $str);
38 $r->puts($str);
39 $r->content_type('text/plain');
40 OK
41}
42
9f02ff25
MG
43sub submit{
44 my $r = shift;
9f02ff25 45 my $req = Apache2::Request->new($r);
69ae93bf
MG
46 my ($problem, $format, $contest, $private, $prog) = map {scalar $req->param($_)} 'problem', 'prog_format', 'contest', 'private', 'source_code';
47 my $upload = $req->upload('prog');
48 if (defined $upload) {
49 my $temp;
50 $upload->slurp($temp);
51 $prog = $temp if $temp
52 }
5855b3bd
MG
53 die if defined $contest && $contest !~ /^\w+$/ ;
54 die if defined $contest && (time < contest_start $contest || time > contest_end $contest);
55
56 my $job = push_job (
57 date => time,
58 problem => $problem,
59 user => $r->user,
60 defined $private ? (private => $private) : (),
61 defined $contest ? (contest => $contest, private => 1) : (),
62 filesize => length $prog,
f0ae016e 63 extension => FORMAT_EXTENSION->{$format},
5855b3bd
MG
64 );
65
66 set_job_inmeta $job, {
67 files => {
68 prog => {
69 format => $format,
f0ae016e 70 name => 'prog.' . FORMAT_EXTENSION->{$format},
5855b3bd
MG
71 content => $prog,
72 }
9f02ff25 73 }
9f02ff25
MG
74 };
75
b16e6cc2 76 PUBLISH 'jobs', $job;
9f02ff25
MG
77 $r->print("Job submitted");
78 OK
79}
80
b746d002
MG
81sub register{
82 my $r = shift;
83 my $req = Apache2::Request->new($r);
f1df5335 84 my ($username, $password, $confirm_password, $name, $email, $phone, $town, $university, $level) = map { die if length > 200; $_ } map {scalar $req->param($_)} qw/username password confirm_password name email phone town university level/;
b746d002
MG
85
86 local $Apache2::Authen::Passphrase::rootdir = $r->dir_config('AuthenPassphraseRootdir');
87 return aputs $r, 'Bad username. Allowed characters are letters, digits and underscores, and the username must be between 2 and 20 characters long.' unless $username =~ USER_REGEX;
88 return aputs $r, 'Username already in use' if -e "$Apache2::Authen::Passphrase::rootdir/$username.yml";
89 return aputs $r, 'The two passwords do not match' unless $password eq $confirm_password;
f1df5335 90 return aputs $r, 'All fields are required' if grep { !length } $username, $password, $confirm_password, $name, $email, $phone, $town, $university, $level;
b746d002
MG
91 pwset $username, $password;
92
f1df5335 93 insert_user $username, name => $name, email => $email, phone => $phone, town => $town, university => $university, level => $level;
b746d002 94
35504454
MG
95 PUBLISH genpage => "us/index.html";
96 PUBLISH genpage => "us/$username.html";
b746d002
MG
97 aputs $r, 'Registered successfully';
98}
99
100sub passwd{
101 my $r = shift;
102 my $req = Apache2::Request->new($r);
103 my ($oldpass, $newpass, $confirm) = map {scalar $req->param($_)} 'password', 'new_password', 'confirm_new_password';
104
105 local $Apache2::Authen::Passphrase::rootdir = $r->dir_config('AuthenPassphraseRootdir');
106 return aputs $r, 'Incorrect password' unless eval { pwcheck $r->user, $oldpass; 1 };
107 return aputs $r, 'The two passwords do not match' unless $newpass eq $confirm;
108
109 pwset $r->user, $newpass;
110 aputs $r, 'Password changed successfully';
111}
112
5855b3bd
MG
113=begin comment
114
9f02ff25
MG
115sub private{
116 my $r = shift;
117 my $dir = (fileparse $r->uri)[1];
118 my $user = $r->user;
119 chdir $r->dir_config('root') . $dir;
120
121 for my $requirement (map { $_->{requirement} } @{$r->requires}) {
122 my ($command, @args) = split ' ', $requirement;
123
124 given ($command){
125 when('admin-if-private'){
126 my $meta = LoadFile 'meta.yml';
127 return OK if !$meta->{private} || ($r->user && hascaps $r->user, 'gmadm')
128 }
129
130 }
131 }
132
133 DECLINED
134}
135
5855b3bd
MG
136=end comment
137
138=cut
139
9f02ff25
MG
1401;
141__END__
142# Below is stub documentation for your module. You'd better edit it!
143
144=head1 NAME
145
146Gruntmaster::Handlers - Perl extension for blah blah blah
147
148=head1 SYNOPSIS
149
150 use Gruntmaster::Handlers;
151 blah blah blah
152
153=head1 DESCRIPTION
154
155Stub documentation for Gruntmaster::Handlers, created by h2xs. It looks like the
156author of the extension was negligent enough to leave the stub
157unedited.
158
159Blah blah blah.
160
161
162=head1 SEE ALSO
163
164Mention other useful documentation such as the documentation of
165related modules or operating system documentation (such as man pages
166in UNIX), or any relevant external documentation such as RFCs or
167standards.
168
169If you have a mailing list set up for your module, mention it here.
170
171If you have a web site set up for your module, mention it here.
172
173=head1 AUTHOR
174
175Marius Gavrilescu, E<lt>marius@E<gt>
176
177=head1 COPYRIGHT AND LICENSE
178
179Copyright (C) 2013 by Marius Gavrilescu
180
181This library is free software; you can redistribute it and/or modify
182it under the same terms as Perl itself, either Perl version 5.18.1 or,
183at your option, any later version of Perl 5 you may have available.
184
185
186=cut
This page took 0.022421 seconds and 4 git commands to generate.