sub (/src/:job) {
return NOT_FOUND if !job;
- forbid job->private || job->problem->private || job->contest && job->contest->is_running;
+ my $isowner = remote_user && remote_user->id eq job->rawowner;
+ forbid !$isowner && (job->private || job->problem->private || job->contest && job->contest->is_running);
my @headers = ('X-Forever' => 1, 'Cache-Control' => 'public, max-age=604800', 'Content-Type' => CONTENT_TYPES->{job->format});
[200, \@headers, [job->source]]
},
my $source = $prog ? read_file $prog->path : $_{source_code};
unlink $prog->path if $prog;
+ my $private = (problem->private && !$_{contest}) ? 1 : 0;
my $newjob = db->jobs->create({
maybe contest => $_{contest},
- maybe private => problem->private && !$_{contest},
+ private => $private,
date => time,
extension => FORMAT_EXTENSION->{$_{prog_format}},
format => $_{prog_format},
sub process_ct_entry {
my ($tree, %args) = @_;
$_->edit_href (sub {s/contest_id/$args{id}/}) for $tree->find('a');
+ $tree->fid('editorial')->detach unless $args{finished};
$tree->fid('links')->detach unless $args{started};
$tree->content_handler(
start => ftime $args{start},
my ($data, $th) = @_;
$th->attr(class => undef);
$th->namedlink(@$data);
+ $th->find('a')->edit_href(sub{s/$/?contest=$args{args}{contest}/});
};
$tree->fclass('problem')->iter3($args{problems}, $pbiter);
my $iter = sub {