various: add read-only mode support
[girocco.git] / cgi / tagproj.cgi
blob2a7b5db347e8c9e3163ddce83f9d3d0ef7b81f48
1 #!/usr/bin/perl
2 # (c) Petr Baudis <pasky@suse.cz>
3 # GPLv2
5 use strict;
6 use warnings;
8 use lib "__BASEDIR__";
9 use Girocco::Config;
10 use Girocco::CGI;
11 use Girocco::Project;
12 use Girocco::Util;
13 use CGI;
15 our $cgi = CGI->new;
16 $cgi->charset('UTF-8');
18 my $pname = to_utf8($cgi->param('p'), 1);
19 my $ctags = to_utf8($cgi->param('t'), 1);
20 defined $pname or $pname = '';
21 defined $ctags or $ctags = '';
22 $pname =~ s/\.git$//;
24 if ($cgi->request_method ne 'POST' || $pname eq '') {
25 print $cgi->header(-status=>403);
26 print "<p>Invalid data. Go away, sorcerer.</p>\n";
27 exit;
30 if (my $romsg=check_readonly(1)) {
31 print $cgi->header(-status=>403);
32 print "<p>$romsg</p>\n";
33 exit;
36 my $proj = Girocco::Project::does_exist($pname, 1) && Girocco::Project->load($pname);
37 if (not $proj) {
38 print $cgi->header(-status=>404);
39 print "<p>Project \"".html_esc($pname)."\" does not exist.</p>";
40 exit;
43 my $refproj = $ENV{'HTTP_REFERER'};
44 defined($refproj) or $refproj = "";
45 $refproj = url_path($refproj);
46 $refproj =~ s{^/w/}{/};
47 my $projurl = url_path($Girocco::Config::gitweburl, 1) . $pname . ".git";
48 $projurl =~ s{^/w/}{/};
49 if ($refproj ne $projurl) {
50 print $cgi->header(-status=>403);
51 print "<p>Invalid request. Go away, sorcerer.</p>\n";
52 exit;
55 if ($ctags =~ /[^ a-zA-Z0-9:.+#_-]/) {
56 print $cgi->header(-status=>403);
57 print "<p>Content tag(s) '".html_esc($ctags)."' contain evil characters.</p>";
58 exit;
61 my $oldmask = umask();
62 umask($oldmask & ~0060);
63 my $changed;
64 foreach my $ctag (split(/ /, $ctags)) {
65 $changed = 1 if $proj->add_ctag($ctag, 1);
67 if ($changed) {
68 $proj->_set_changed;
69 $proj->_set_forkchange;
71 umask($oldmask);
73 print $cgi->header(-status=>303, -location=>"@{[url_path($Girocco::Config::gitweburl)]}/$pname.git");