Merge branch 'master' into rorcz
[girocco.git] / Girocco / Config.pm
blob05ebfa6d7ea38e726f31ab9aabd9abf4c65b345d
1 package Girocco::Config;
3 use strict;
4 use warnings;
7 ## Basic settings
9 # Name of the service
10 our $name = "repo.or.cz";
12 # Nickname of the service (undef for initial part of $name upto first '.')
13 our $nickname = "rorcz";
15 # Title of the service (as shown in gitweb)
16 our $title = "Public Git Hosting";
18 # Path to the Git binary to use (you MUST set this, even if to /usr/bin/git!)
19 our $git_bin = '/home/repo/bin/git';
21 # Path to the git-http-backend binary to use (undef to use /usr/lib/git-core/git-http-backend)
22 # If both $httppullurl and $httpspushurl are undef this will never be used
23 our $git_http_backend_bin = undef;
25 # E-mail of the site admin
26 our $admin = 'admin@repo.or.cz';
28 # Copy $admin on failure/recovery messages?
29 our $admincc = 0;
31 # Girocco branch to use for html.cgi view source links (undef for HEAD)
32 our $giroccobranch = 'rorcz';
35 ## Feature knobs
37 # Enable mirroring mode if true
38 our $mirror = 1;
40 # Enable push mode if true
41 our $push = 1;
43 # Enable user management if true; this means the interface for registering
44 # user accounts and uploading SSH keys. This implies full chroot.
45 our $manage_users = 1;
47 # Minimum key length (in bits) for uploaded SSH RSA/DSA keys.
48 # If this is not set (i.e. undef) keys as small as 512 bits will be allowed.
49 # Nowadays keys less than 2048 bits in length should probably not be allowed.
50 # Note, however, that versions of OpenSSH starting with 4.3p1 will only generate
51 # DSA keys of exactly 1024 bits in length even though that length is no longer
52 # recommended. (OpenSSL can be used to generate DSA keys with lengths > 1024.)
53 # OpenSSH does not have any problem generating RSA keys longer than 1024 bits.
54 # This setting is only checked when new keys are added so setting it/increasing it
55 # will not affect existing keys. For maximum compatibility a value of 1024 may
56 # be used however 2048 is recommended. Setting it to anything other than 1024,
57 # 2048 or 3072 may have the side effect of making it very difficult to generate
58 # DSA keys that satisfy the restriction (but RSA keys should not be a problem).
59 # Note that no matter what setting is specified here keys smaller than 512 bits
60 # will never be allowed via the reguser.cgi/edituser.cgi interface.
61 our $min_key_length = 1024;
63 # Disable DSA public keys?
64 # If this is set to 1, adding DSA keys at reguser.cgi/edituser.cgi time will be
65 # prohibited. If $pushurl is undef then this is implicitly set to 1 since DSA
66 # keys are not usable with https push.
67 # OpenSSH will only generate 1024 bit DSA keys starting with version 4.3p1.
68 # Even if OpenSSL is used to generate a longer DSA key (which can then be used
69 # with OpenSSH), the SSH protocol itself still forces use of SHA-1 in the DSA
70 # signature blob which tends to defeat the purpose of going to a longer key in
71 # the first place. So it may be better from a security standpoint to simply
72 # disable DSA keys especially if $min_key_length and $rsakeylength have been set
73 # to something higher such as 3072 or 4096. This setting is only checked when
74 # new keys are added so setting it/increasing it will not affect existing keys.
75 # There is no way to disable DSA keys in the OpenSSH server config file itself.
76 our $disable_dsa = 0;
78 # Enable the special 'mob' user if set to 'mob'
79 our $mob = "mob";
81 # Let users set admin passwords; if false, all password inputs are assumed empty.
82 # This will make new projects use empty passwords and all operations on them
83 # unrestricted, but you will be able to do no operations on previously created
84 # projects you have set a password on.
85 our $project_passwords = 1;
87 # How to determine project owner; 'email' adds a form item asking for their
88 # email contact, 'source' takes realname of owner of source repository if it
89 # is a local path (and empty string otherwise). 'source' is suitable in case
90 # the site operates only as mirror of purely local-filesystem repositories.
91 our $project_owners = 'email';
93 # Which project fields to make editable, out of 'shortdesc', 'homepage',
94 # 'README', 'notifymail', 'notifyjson', 'notifycia'. (This is currently
95 # soft restriction - form fields aren't used, but manually injected values
96 # *are* used. Submit a patch if that's an issue for you.)
97 our @project_fields = qw(homepage shortdesc README notifymail notifyjson notifycia);
99 # Minimal number of seconds to pass between two updates of a project.
100 our $min_mirror_interval = 3600; # 1 hour
102 # Minimal number of seconds to pass between two garbage collections of a project.
103 our $min_gc_interval = 604800; # 1 week
106 ## Paths
108 # Path where the main chunk of Girocco files will be installed
109 # This will get COMPLETELY OVERWRITTEN by each make install!!!
110 our $basedir = '/home/repo/repomgr';
112 # Path where the automatically generated non-user certificates will be stored
113 # (The per-user certificates are always stored in $chroot/etc/sshcerts/)
114 # This is preserved by each make install and MUST NOT be under $basedir!
115 # Not used unless $httpspushurl is defined
116 our $certsdir = '/home/repo/certs';
118 # The repository collection
119 # "$reporoot-recyclebin" will also be created for use by toolbox/trash-project.pl
120 our $reporoot = "/srv/git";
122 # The repository collection's location within the chroot jail
123 # Normally $reporoot will be bind mounted onto $chroot/$jailreporoot
124 # Should NOT start with '/'
125 our $jailreporoot = "srv/git";
127 # The chroot for ssh pushing; location for project database and other run-time
128 # data even in non-chroot setups
129 our $chroot = "/home/repo/j";
131 # The gitweb files web directory (corresponds to $gitwebfiles)
132 our $webroot = "/home/repo/WWW";
134 # The CGI-enabled web directory (corresponds to $gitweburl and $webadmurl)
135 our $cgiroot = "/home/repo/WWW";
137 # A web-accessible symlink to $reporoot (corresponds to $httppullurl, can be undef)
138 our $webreporoot = "/home/repo/WWW/r";
141 ## Certificates (only used if $httpspushurl is defined)
143 # path to root certificate (undef to use automatic root cert)
144 # this certificate is made available for easy download and should be whatever
145 # the root certificate is for the https certificate being used by the web server
146 our $rootcert = undef;
148 # The certificate to sign user push client authentication certificates with (undef for auto)
149 # The automatically generated certificate should always be fine
150 our $clientcert = undef;
152 # The private key for $clientcert (undef for auto)
153 # The automatically generated key should always be fine
154 our $clientkey = undef;
156 # The client certificate chain suffix (a pemseq file to append to user client certs) (undef for auto)
157 # The automatically generated chain should always be fine
158 # This suffix will also be appended to the $mobusercert before making it available for download
159 our $clientcertsuffix = undef;
161 # The mob user certificate signed by $clientcert (undef for auto)
162 # The automatically generated certificate should always be fine
163 # Not used unless $mob is set to 'mob'
164 # The $clientcertsuffix will be appended before making $mobusercert available for download
165 our $mobusercert = undef;
167 # The private key for $mobusercert (undef for auto)
168 # The automatically generated key should always be fine
169 # Not used unless $mob is set to 'mob'
170 our $mobuserkey = undef;
172 # The key length for automatically generated RSA private keys (in bits).
173 # These keys are then used to create the automatically generated certificates.
174 # If undef or set to a value less than 2048, then 2048 will be used.
175 # Set to 3072 to generate more secure keys/certificates. Set to 4096 (or higher) for
176 # even greater security. Be warned that setting to a non-multiple of 8 and/or greater
177 # than 4096 could negatively impact compatibility with some clients.
178 # The values 2048, 3072 and 4096 are expected to be compatible with all clients.
179 # Note that OpenSSL has no problem with > 4096 or non-multiple of 8 lengths.
180 # See also the $min_key_length setting above to restrict user key sizes.
181 our $rsakeylength = undef;
183 ## URL addresses
185 # URL of the gitweb.cgi script (must be in pathinfo mode)
186 our $gitweburl = "http://repo.or.cz/w";
188 # URL of the extra gitweb files (CSS, .js files, images, ...)
189 our $gitwebfiles = "http://repo.or.cz";
191 # URL of the Girocco CGI web admin interface (Girocco cgi/ subdirectory)
192 our $webadmurl = "http://repo.or.cz";
194 # URL of the Girocco CGI html templater (Girocco cgi/html.cgi)
195 our $htmlurl = "http://repo.or.cz/h";
197 # HTTP URL of the repository collection (undef if N/A)
198 our $httppullurl = "http://repo.or.cz/r";
200 # HTTPS push URL of the repository collection (undef if N/A)
201 # If this is defined, the openssl command must be available
202 # Normally this should be set to $httppullurl with http: replaced with https:
203 our $httpspushurl = "https://repo.or.cz/r";
205 # Git URL of the repository collection (undef if N/A)
206 # (You need to set up git-daemon on your system, and Girocco will not
207 # do this particular thing for you.)
208 our $gitpullurl = "git://repo.or.cz";
210 # Pushy SSH URL of the repository collection (undef if N/A)
211 our $pushurl = "ssh://repo.or.cz/$jailreporoot";
213 # URL of gitweb of this Girocco instance (set to undef if you're not nice
214 # to the community)
215 our $giroccourl = "$Girocco::Config::gitweburl/girocco.git";
218 ## Some templating settings
220 # Legal warning (on reguser and regproj pages)
221 our $legalese = <<EOT;
222 <p>By submitting this form, you are confirming that you will mirror or push
223 only free software and redistributing it will not violate any law
224 of Czech Republic.
225 <sup><a href="/h/about.html">(more details)</a></sup>
226 </p>
229 # Pre-configured mirror sources (set to undef for none)
230 # Arrayref of name - record pairs, the record has these attributes:
231 # label: The label of this source
232 # url: The template URL; %1, %2, ... will be substituted for inputs
233 # desc: Optional VERY short description
234 # link: Optional URL to make the desc point at
235 # inputs: Arrayref of hashref input records:
236 # label: Label of input record
237 # suffix: Optional suffix
238 # If the inputs arrayref is undef, single URL input is shown,
239 # pre-filled with url (probably empty string).
240 our $mirror_sources = [
242 label => 'Anywhere',
243 url => '',
244 desc => 'Any HTTP/Git/rsync pull URL - bring it on!',
245 inputs => undef
248 label => 'GitHub',
249 url => 'git://github.com/%1/%2.git',
250 desc => 'GitHub Social Code Hosting',
251 link => 'http://github.com/',
252 inputs => [ { label => 'User:' }, { label => 'Project:', suffix => '.git' } ]
255 label => 'Gitorious',
256 url => 'git://gitorious.org/%1/%2.git',
257 desc => 'Green and Orange Boxes',
258 link => 'http://gitorious.org/',
259 inputs => [ { label => 'Project:' }, { label => 'Repository:', suffix => '.git' } ]
263 # You can customize the gitweb interface widely by editing
264 # gitweb/gitweb_config.perl
267 ## Permission settings
269 # Girocco needs some way to manipulate write permissions to various parts of
270 # all repositories; this concerns three entities:
271 # - www-data: the web interface needs to be able to rewrite few files within
272 # the repository
273 # - repo: a user designated for cronjobs; handles mirroring and repacking;
274 # this one is optional if not $mirror
275 # - others: the designated users that are supposed to be able to push; they
276 # may have account either within chroot, or outside of it
278 # There are several ways how to use Girocco based on a combination of the
279 # following settings.
281 # (Non-chroot) UNIX user the CGI scripts run on; note that if some non-related
282 # untrusted CGI scripts run on this account too, that can be a big security
283 # problem and you'll probably need to set up suexec (poor you).
284 # This must always be set.
285 our $cgi_user = 'www-data';
287 # (Non-chroot) UNIX user performing mirroring jobs; this is the user who
288 # should run all the daemons and cronjobs and
289 # the user who should be running make install (if not root).
290 # This must always be set.
291 our $mirror_user = 'repo';
293 # (Non-chroot) UNIX group owning the repositories by default; it owns whole
294 # mirror repositories and at least web-writable metadata of push repositories.
295 # If you undefine this, all the data will become WORLD-WRITABLE.
296 # Both $cgi_user and $mirror_user should be members of this group!
297 our $owning_group = 'repo';
299 # Whether to use chroot jail for pushing; this must be always the same
300 # as $manage_users.
301 # TODO: Gitosis support for $manage_users and not $chrooted?
302 our $chrooted = $manage_users;
304 # How to control permissions of push-writable data in push repositories:
305 # * 'Group' for the traditional model: The $chroot/etc/group project database
306 # file is used as the UNIX group(5) file; the directories have gid appropriate
307 # for the particular repository and are group-writable. This works only if
308 # $chrooted so that users are put in the proper groups on login when using
309 # SSH push. Smart HTTPS push does not require a chroot to work -- simply
310 # run "make install" as the non-root $mirror_user user, but leave
311 # $manage_users and $chrooted enabled.
312 # * 'ACL' for a model based on POSIX ACL: The directories are coupled with ACLs
313 # listing the users with push permissions. This works for both chroot and
314 # non-chroot setups, however it requires ACL support within the filesystem.
315 # This option is BASICALLY UNTESTED, too. And UNIMPLEMENTED. :-)
316 # * 'Hooks' for a relaxed model: The directories are world-writable and push
317 # permission control is purely hook-driven. This is INSECURE and works only
318 # when you trust all your users; on the other hand, the attack vectors are
319 # mostly just DoS or fully-traceable tinkering.
320 our $permission_control = 'Group';
322 # Path to alternate screen multiuser acl file (see screen/README, undef for none)
323 our $screen_acl_file = undef;
325 # Couple of sanity checks and default settings (do not change these)
326 use Digest::MD5 qw(md5);
327 use MIME::Base64 qw(encode_base64);
328 $nickname = (split(/[.]/, $name))[0] unless $nickname;
329 our $tmpsuffix = substr(encode_base64(md5($name.':'.$nickname)),0,6);
330 $tmpsuffix =~ tr,+/,=_,;
331 ($mirror_user) or die "Girocco::Config: \$mirror_user must be set even if to current user";
332 $screen_acl_file = "$basedir/screen/giroccoacl" unless $screen_acl_file;
333 $jailreporoot =~ s,^/+,,;
334 ($reporoot) or die "Girocco::Config \$reporoot must be set";
335 ($jailreporoot) or die "Girocco::Config \$jailreporoot must be set";
336 (not $mob or $mob eq 'mob') or die "Girocco::Config \$mob must be undef (or '') or 'mob'";
337 (not $min_key_length or $min_key_length =~ /^[1-9][0-9]*$/)
338 or die "Girocco::Config \$min_key_length must be undef or numeric";
339 $admincc = $admincc ? 1 : 0;
340 $rootcert = "$certsdir/girocco_root_crt.pem" if $httpspushurl && !$rootcert;
341 $clientcert = "$certsdir/girocco_client_crt.pem" if $httpspushurl && !$clientcert;
342 $clientkey = "$certsdir/girocco_client_key.pem" if $httpspushurl && !$clientkey;
343 $clientcertsuffix = "$certsdir/girocco_client_suffix.pem" if $httpspushurl && !$clientcertsuffix;
344 $mobusercert = "$certsdir/girocco_mob_user_crt.pem" if $httpspushurl && $mob && !$mobusercert;
345 $mobuserkey = "$certsdir/girocco_mob_user_key.pem" if $httpspushurl && $mob && !$mobuserkey;
346 our $mobpushurl = $pushurl;
347 $mobpushurl =~ s,^ssh://,ssh://mob@,i if $mobpushurl;
348 $disable_dsa = 1 unless $pushurl;
349 our $httpsdnsname = ($httpspushurl =~ m,https://([A-Za-z0-9.-]+),i) ? lc($1) : undef if $httpspushurl;
350 ($mirror or $push) or die "Girocco::Config: neither \$mirror nor \$push is set?!";
351 (not $push or ($pushurl or $httpspushurl or $gitpullurl or $httppullurl)) or die "Girocco::Config: no pull URL is set";
352 (not $push or ($pushurl or $httpspushurl)) or die "Girocco::Config: \$push set but \$pushurl and \$httpspushurl are undef";
353 (not $mirror or $mirror_user) or die "Girocco::Config: \$mirror set but \$mirror_user is undef";
354 ($manage_users == $chrooted) or die "Girocco::Config: \$manage_users and \$chrooted must be set to the same value";
355 (not $chrooted or $permission_control ne 'ACL') or die "Girocco::Config: resolving uids for ACL not supported when using chroot";
356 (grep { $permission_control eq $_ } qw(Group Hooks)) or die "Girocco::Config: \$permission_control must be set to Group or Hooks";
357 ($chrooted or not $mob) or die "Girocco::Config: mob user supported only in the chrooted mode";
358 (not $httpspushurl or $httpsdnsname) or die "Girocco::Config invalid \$httpspushurl does not start with https://domainname";