Merge branch 'master' into rorcz
[girocco/readme.git] / Girocco / Config.pm
blob8ba770cd865ed19661653f3c1c8a61f59c8d215d
1 package Girocco::Config;
3 use strict;
4 use warnings;
8 ## --------------
9 ## Basic settings
10 ## --------------
13 # Name of the service (typically a single word or a domain name)
14 # (no spaces allowed)
15 our $name = "repo.or.cz";
17 # Nickname of the service (undef for initial part of $name upto first '.')
18 # (no spaces allowed)
19 our $nickname = "rorcz";
21 # Title of the service (as shown in gitweb)
22 # (may contain spaces)
23 our $title = "Public Git Hosting";
25 # Path to the Git binary to use (you MUST set this, even if to /usr/bin/git!)
26 our $git_bin = '/home/repo/bin/git';
28 # Path to the git-daemon binary to use (undef to use default)
29 # If $gitpullurl is undef this will never be used (assuming no git inetd
30 # service has been set up in that case).
31 # The default if this is undef is `$git_bin --exec-path`/git-daemon
32 our $git_daemon_bin = undef;
34 # Path to the git-http-backend binary to use (undef to use default)
35 # If both $httppullurl and $httpspushurl are undef this will never be used
36 # The default if this is undef is `$git_bin --exec-path`/git-http-backend
37 our $git_http_backend_bin = undef;
39 # Name (if in $PATH) or full path to netcat executable that accepts a -U option
40 # to connect to a unix socket. This may simply be 'nc' on many systems.
41 # See the ../src/dragonfly/README file for a DragonFly BSD nc with -U support.
42 our $nc_openbsd_bin = 'nc.openbsd';
44 # Path to POSIX sh executable to use. Set to undef to use /bin/sh
45 our $posix_sh_bin = undef;
47 # Path to Perl executable to use. Set to undef to use Perl found in $PATH
48 our $perl_bin = undef;
50 # Path to gzip executable to use. Set to undef to use gzip found in $PATH
51 our $gzip_bin = undef;
53 # Path to the sendmail instance to use. It should understand the -f <from>, -i and -t
54 # options as well as accepting a list of recipient addresses in order to be used here.
55 # You MUST set this, even if to '/usr/sbin/sendmail'!
56 # Setting this to 'sendmail.pl' is special and will automatically be expanded to
57 # a full path to the ../bin/sendmail.pl executable in this Girocco installation.
58 # sendmail.pl is a sendmail-compatible script that delivers the message directly
59 # using SMTP to a mail relay host. This is the recommended configuration as it
60 # minimizes the information exposed to recipients (no sender account names or uids),
61 # can talk to an SMTP server on another host (eliminating the need for a working
62 # sendmail and/or SMTP server on this host) and avoids any unwanted address rewriting.
63 # By default it expects the mail relay to be listening on localhost port 25.
64 # See the sendmail.pl section below for more information on configuring sendmail.pl.
65 our $sendmail_bin = 'sendmail.pl';
67 # E-mail of the site admin
68 our $admin = 'admin@repo.or.cz';
70 # Sender of emails
71 # This is the SMTP 'MAIL FROM:' value
72 # It will be passed to $sendmail_bin with the -f option
73 # Some sites may not allow non-privileged users to pass the -f option to
74 # $sendmail_bin. In that case set this to undef and no -f option will be
75 # passed which means the 'MAIL FROM:' value will be the user the mail is
76 # sent as (either $cgi_user or $mirror_user depending on the activity).
77 # To avoid having bounce emails go to $admin, this may be set to something
78 # else such as 'admin-noreply@example.org' and then the 'admin-noreply' address
79 # may be redirected to /dev/null. Setting this to '' or '<>' is not
80 # recommended because that will likely cause the emails to be marked as SPAM
81 # by the receiver's SPAM filter. If $sendmail_bin is set to 'sendmail.pl' this
82 # value must be acceptable to the receiving SMTP server as a 'MAIL FROM:' value.
83 # If this is set to undef and 'sendmail.pl' is used, the 'MAIL FROM:' value will
84 # be the user the mail is sent as (either $cgi_user or $mirror_user).
85 our $sender = 'admin-noreply@repo.or.cz';
87 # Copy $admin on failure/recovery messages?
88 our $admincc = 0;
90 # Girocco branch to use for html.cgi view source links (undef for HEAD)
91 our $giroccobranch = 'rorcz';
93 # PATH adjustments
94 # If the PATH needs to be customized to find required executables on
95 # the system, it can be done here.
96 # For example something like this:
97 #$ENV{PATH} = substr(`/usr/bin/getconf PATH`,0,-1).":/usr/local/bin";
101 ## ----------------------
102 ## Git user agent strings
103 ## ----------------------
106 # Git clients (i.e. fetch/clone) always send a user agent string when fetching
107 # over HTTP. Since version 1.7.12.1 an 'agent=' capability string is included
108 # as well which affects git:, smart HTTP and ssh: protocols.
110 # These settings allow the default user agent string to be changed independently
111 # for fetch/clone operations (only matters if $mirror is true) and server
112 # operations (some other Git client fetching from us). Note that it is not
113 # possible to suppress the capability entirely although it can be set to an
114 # empty string. If these values are not set, the default user agent string
115 # will be used. Typically (unless Git was built with non-standard options) the
116 # default is "git/" plus the version. So for example "git/1.8.5.6" or
117 # "git/2.1.4" might be seen.
119 # One might want to change the default user agent strings in order to prevent
120 # an attacker from learning the exact Git version being used to avoid being
121 # able to quickly target any version-specific vulnerabilities. Note that
122 # no matter what's set here, an attacker can easily determine whether a server
123 # is running JGit, libgit2 or Git and for Git whether it's version 1.7.12.1 or
124 # later. A reasonable value to hide the exact Git version number while
125 # remaining compatible with servers that require a "Git/" user agent string
126 # would be something like "git/2" or even just "git/".
128 # The GIT_USER_AGENT value to use when acting as a client (i.e. clone/fetch)
129 # This value is only used if $mirror is true and at least one mirror is set up.
130 # Setting this to the empty string will suppress the HTTP User-Agent header,
131 # but will still include an "agent=" capability in the packet protocol. The
132 # empty string is not recommended because some servers match on "git/".
133 # Leave undef to use the default Git user agent string
134 # IMPORTANT: some server sites will refuse to serve up Git repositories unless
135 # the client user agent string contains "Git/" (matched case insensitively)!
136 our $git_client_ua = undef;
138 # The GIT_USER_AGENT value to use when acting as a server (i.e. some Git client
139 # is fetching/cloning from us).
140 # Leave undef to use the default Git user agent string
141 our $git_server_ua = undef;
145 ## -------------
146 ## Feature knobs
147 ## -------------
150 # Enable mirroring mode if true (see "Foreign VCS mirrors" section below)
151 our $mirror = 1;
153 # Enable push mode if true
154 our $push = 1;
156 # If both $mirror and $push are enabled, setting this to 'mirror' pre-selects
157 # mirror mode on the initial regproj display, otherwise 'push' mode will be
158 # pre-selected. When forking the initial mode will be 'push' if $push enabled.
159 our $initial_regproj_mode = 'mirror';
161 # Enable user management if true; this means the interface for registering
162 # user accounts and uploading SSH keys. This implies full chroot.
163 our $manage_users = 1;
165 # Minimum key length (in bits) for uploaded SSH RSA/DSA keys.
166 # If this is not set (i.e. undef) keys as small as 512 bits will be allowed.
167 # Nowadays keys less than 2048 bits in length should probably not be allowed.
168 # Note, however, that versions of OpenSSH starting with 4.3p1 will only generate
169 # DSA keys of exactly 1024 bits in length even though that length is no longer
170 # recommended. (OpenSSL can be used to generate DSA keys with lengths > 1024.)
171 # OpenSSH does not have any problem generating RSA keys longer than 1024 bits.
172 # This setting is only checked when new keys are added so setting it/increasing it
173 # will not affect existing keys. For maximum compatibility a value of 1024 may
174 # be used however 2048 is recommended. Setting it to anything other than 1024,
175 # 2048 or 3072 may have the side effect of making it very difficult to generate
176 # DSA keys that satisfy the restriction (but RSA keys should not be a problem).
177 # Note that no matter what setting is specified here keys smaller than 512 bits
178 # will never be allowed via the reguser.cgi/edituser.cgi interface.
179 # RECOMMENDED VALUE: 2048 (ok) or 3072 (better)
180 our $min_key_length = 1024;
182 # Disable DSA public keys?
183 # If this is set to 1, adding DSA keys at reguser.cgi/edituser.cgi time will be
184 # prohibited. If $pushurl is undef then this is implicitly set to 1 since DSA
185 # keys are not usable with https push.
186 # OpenSSH will only generate 1024 bit DSA keys starting with version 4.3p1.
187 # Even if OpenSSL is used to generate a longer DSA key (which can then be used
188 # with OpenSSH), the SSH protocol itself still forces use of SHA-1 in the DSA
189 # signature blob which tends to defeat the purpose of going to a longer key in
190 # the first place. So it may be better from a security standpoint to simply
191 # disable DSA keys especially if $min_key_length and $rsakeylength have been set
192 # to something higher such as 3072 or 4096. This setting is only checked when
193 # new keys are added so setting it/increasing it will not affect existing keys.
194 # There is no way to disable DSA keys in the OpenSSH server config file itself.
195 # If this is set to 1, no ssh_host_dsa_key will be generated or used with the
196 # sshd running in the jail (but if the sshd_config has already been generated
197 # in the jail, it must be removed and 'sudo make install' run again or otherwise
198 # the sshd_config needs to be edited by hand for the change to take effect).
199 # RECOMMENDED VALUE: 1
200 our $disable_dsa = 0;
202 # Enable the special 'mob' user if set to 'mob'
203 our $mob = "mob";
205 # Let users set admin passwords; if false, all password inputs are assumed empty.
206 # This will make new projects use empty passwords and all operations on them
207 # unrestricted, but you will be able to do no operations on previously created
208 # projects you have set a password on.
209 our $project_passwords = 1;
211 # How to determine project owner; 'email' adds a form item asking for their
212 # email contact, 'source' takes realname of owner of source repository if it
213 # is a local path (and empty string otherwise). 'source' is suitable in case
214 # the site operates only as mirror of purely local-filesystem repositories.
215 our $project_owners = 'email';
217 # Which project fields to make editable, out of 'shortdesc', 'homepage', 'README',
218 # 'cleanmirror', 'notifymail', 'reverseorder', 'summaryonly', 'notifytag' and 'notifyjson'
219 # 'notifycia' was used by the now defunct CIA service and while allowing it to
220 # be edited does work and the value is saved, the value is totally ignored by Girocco
221 our @project_fields = qw(cleanmirror homepage shortdesc README notifymail reverseorder summaryonly notifytag notifyjson);
223 # Minimal number of seconds to pass between two updates of a project.
224 our $min_mirror_interval = 3600; # 1 hour
226 # Minimal number of seconds to pass between two garbage collections of a project.
227 our $min_gc_interval = 604800; # 1 week
229 # Minimal number of seconds to pass after first failure before sending failure email.
230 # A mirror update failed message will not be sent until mirror updates have been
231 # failing for at least this long. Set to 0 to send a failure message right away
232 # (provided the $min_mirror_failure_message_count condition has been met).
233 our $min_mirror_failure_message_interval = 216000; # 2.5 days
235 # Minimal number of consecutive failures required before sending failure email.
236 # A mirror update failed message will not be sent until mirror updates have failed
237 # for this many consecutive updates. Set to 0 to send a failure message right away
238 # (provided the $min_mirror_failure_message_interval condition has been met).
239 our $min_mirror_failure_message_count = 10;
241 # Maximum window memory size when repacking. If this is set, it will be used
242 # instead of the automatically computed value if it's less than that value.
243 # May use a 'k', 'm', or 'g' suffix otherwise value is in bytes.
244 our $max_gc_window_memory_size = undef;
246 # Maximum big file threshold size when repacking. If this is set, it will be
247 # used instead of the automatically computed value if it's less than that value.
248 # May use a 'k', 'm', or 'g' suffix otherwise value is in bytes.
249 our $max_gc_big_file_threshold_size = undef;
251 # Whether or not to run the ../bin/update-pwd-db script whenever the etc/passwd
252 # database is changed. This is typically needed (i.e. set to a true value) for
253 # FreeBSD style systems when using an sshd chroot jail for push access. So if
254 # $pushurl is undef or the system Girocco is running on is not like FreeBSD
255 # (e.g. a master.passwd file that must be transformed into pwd.db and spwd.db), then
256 # this setting should normally be left false (i.e. 0). See comments in the
257 # provided ../bin/update-pwd-db script about when and how it's invoked.
258 our $update_pwd_db = 0;
260 # Port the sshd running in the jail should listen on
261 # Be sure to update $pushurl to match
262 # Not used if $pushurl is undef
263 our $sshd_jail_port = 22;
265 # If this is true then host names used in mirror source URLs will be checked
266 # and any that are not DNS names (i.e. IPv4 or IPv6) or match one of the DNS
267 # host names in any of the URL settings below will be rejected.
268 our $restrict_mirror_hosts = 1;
270 # If $restrict_mirror_hosts is enabled this is the minimum number of labels
271 # required in a valid dns name. Normally 2 is the correct value, but if
272 # Girocco is being used internally where a common default or search domain
273 # is set for everyone then this should be changed to 1 to allow a dns name
274 # with a single label in it. No matter what is set here at least 1 label
275 # is always required when $restrict_mirror_hosts is enabled.
276 our $min_dns_labels = 2;
278 # If $xmllint_readme is true then the contents of the README.html section
279 # will be passed through xmllint and any errors must be corrected before
280 # it can be saved. If this is set to true then xmllint must be in the $PATH.
281 # RECOMMENDED VALUE: 1
282 our $xmllint_readme = 1;
284 # Maximum size of any single email sent by mail.sh in K (1024-byte) units
285 # If message is larger it will be truncated with a "...e-mail trimmed" line
286 # RECOMMENDED VALUE: 256 - 5120 (.25M - 5M)
287 our $mailsh_sizelimit = 512;
291 ## -------------------
292 ## Foreign VCS mirrors
293 ## -------------------
296 # Note that if any of these settings are changed from true to false, then
297 # any pre-existing mirrors using the now-disabled foreign VCS will stop
298 # updating, new mirrors using the now-disabled foreign VCS will be disallowed
299 # and attempts to update ANY project settings for a pre-existing project that
300 # uses a now-disabled foreign VCS source URL will also be disallowed.
302 # If $mirror is true and $mirror_svn is true then mirrors from svn source
303 # repositories will be allowed (and be converted to Git). These URLs have
304 # the form svn://... or svn+http://... or svn+https://...
305 # Note that for this to work the "svn" command line command must be available
306 # in PATH and the "git svn" commands must work (which generally requires both
307 # Perl and the subversion perl bindings be installed).
308 our $mirror_svn = 1;
310 # Prior to Git v1.5.1, git-svn always used a log window size of 1000.
311 # Starting with Git v1.5.1, git-svn defaults to using a log window size of 100
312 # and provides a --log-window-size= option to change it. Starting with Git
313 # v2.2.0, git-svn disconnects and reconnects to the server every log window size
314 # interval to attempt to reduce memory use by git-svn. If $svn_log_window_size
315 # is undefined, Girocco will use a log window size of 250 (instead of the
316 # the default 100). If $svn_log_window_size is set, Girocco will use that
317 # value instead. Beware that setting it too low (i.e. < 50) will almost
318 # certainly cause performance issues if not failures. Unless there are concerns
319 # about git-svn memory use on a server with extremely limited memory, the
320 # value of 250 that Girocco uses by default should be fine. Obviously if
321 # $mirror or $mirror_svn is false this setting is irrelevant.
322 our $svn_log_window_size = undef;
324 # If $mirror is true and $mirror_darcs is true then mirrors from darcs source
325 # repositories will be allowed (and be converted to Git). These URLs have
326 # the form darcs://...
327 # Note that for this to work the "darcs" command line command must be available
328 # in PATH and so must python (required to run the darcs-fast-export script).
329 our $mirror_darcs = 1;
331 # If $mirror is true and $mirror_bzr is true then mirrors from bzr source
332 # repositories will be allowed (and be converted to Git). These URLs have
333 # the form bzr://...
334 # Note that for this to work the "bzr" command line command must be available
335 # in PATH (it's a python script so python is required as well).
336 our $mirror_bzr = 1;
338 # If $mirror is true and $mirror_hg is true then mirrors from hg source
339 # repositories will be allowed (and be converted to Git). These URLs have
340 # the form hg+http://... or hg+https://...
341 # Note that for this to work the "hg" command line command must be available
342 # in PATH and so must python (required to run the hg-fast-export.py script).
343 # Note that if the PYTHON environment variable is set that will be used instead
344 # of just plain "python" to run the hg-fast-export.py script (which needs to
345 # be able to import from mercurial).
346 our $mirror_hg = 1;
350 ## -----
351 ## Paths
352 ## -----
355 # Path where the main chunk of Girocco files will be installed
356 # This will get COMPLETELY OVERWRITTEN by each make install!!!
357 # MUST be an absolute path
358 our $basedir = '/home/repo/repomgr';
360 # Path where the automatically generated non-user certificates will be stored
361 # (The per-user certificates are always stored in $chroot/etc/sshcerts/)
362 # This is preserved by each make install and MUST NOT be under $basedir!
363 # Not used unless $httpspushurl is defined
364 # MUST be an absolute path
365 our $certsdir = '/home/repo/certs';
367 # The repository collection
368 # "$reporoot/_recyclebin" will also be created for use by toolbox/trash-project.pl
369 # MUST be an absolute path
370 our $reporoot = "/srv/git";
372 # The repository collection's location within the chroot jail
373 # Normally $reporoot will be bind mounted onto $chroot/$jailreporoot
374 # Should NOT start with '/'
375 our $jailreporoot = "srv/git";
377 # The chroot for ssh pushing; location for project database and other run-time
378 # data even in non-chroot setups
379 # MUST be an absolute path
380 our $chroot = "/home/repo/j";
382 # An installation that will never run a chrooted sshd should set this
383 # to a true value (e.g. 1) to guarantee that jailsetup for a chrooted
384 # sshd never takes place no matter what user runs `make install`.
385 # Note that the "jailsetup.sh" script will still run to do the database
386 # setup that's stored in $chroot regardless of this setting, it will just
387 # always run in "dbonly" mode when this setting is true.
388 our $disable_jailsetup = 0;
390 # The gitweb files web directory (corresponds to $gitwebfiles)
391 # Note that it is safe to place this under $basedir since it's set up after
392 # $basedir is completely replaced during install time. Be WARNED, however,
393 # that normally the install process only adds/replaces things in $webroot,
394 # but if $webroot is under $basedir then it will be completely removed and
395 # rebuilt each time "make install" is run. This will make gitweb/git-browser
396 # web services very briefly unavailable while this is happening.
397 # MUST be an absolute path
398 our $webroot = "/home/repo/www";
400 # The CGI-enabled web directory (corresponds to $gitweburl and $webadmurl)
401 # This will not be web-accessible except that if any aliases point to
402 # a *.cgi file in here it will be allowed to run as a cgi-script.
403 # Note that it is safe to place this under $basedir since it's set up after
404 # $basedir is completely replaced during install time. Be WARNED, however,
405 # that normally the install process only adds/replaces things in $cgiroot,
406 # but if $cgiroot is under $basedir then it will be completely removed and
407 # rebuilt each time "make install" is run. This will make gitweb/git-browser
408 # web services very briefly unavailable while this is happening.
409 # MUST be an absolute path
410 our $cgiroot = "/home/repo/cgibin";
412 # A web-accessible symlink to $reporoot (corresponds to $httppullurl, can be undef)
413 # If using the sample apache.conf (with paths suitably updated) this is not required
414 # to serve either smart or non-smart HTTP repositories to the Git client
415 # MUST be an absolute path if not undef
416 our $webreporoot = "/home/repo/www/r";
418 # The location to store the project list cache, gitweb project list and gitweb
419 # cache file. Normally this should not be changed. Note that it must be in
420 # a directory that is writable by $mirror_user and $cgi_user (just in case the
421 # cache file is missing). The directory should have its group set to $owning_group.
422 # Again, this setting should not normally need to be changed.
423 # MUST be an absolute path
424 our $projlist_cache_dir = "$chroot/etc";
428 ## ----------------------------------------------------
429 ## Certificates (only used if $httpspushurl is defined)
430 ## ----------------------------------------------------
433 # path to root certificate (undef to use automatic root cert)
434 # this certificate is made available for easy download and should be whatever
435 # the root certificate is for the https certificate being used by the web server
436 our $rootcert = undef;
438 # The certificate to sign user push client authentication certificates with (undef for auto)
439 # The automatically generated certificate should always be fine
440 our $clientcert = undef;
442 # The private key for $clientcert (undef for auto)
443 # The automatically generated key should always be fine
444 our $clientkey = undef;
446 # The client certificate chain suffix (a pemseq file to append to user client certs) (undef for auto)
447 # The automatically generated chain should always be fine
448 # This suffix will also be appended to the $mobusercert before making it available for download
449 our $clientcertsuffix = undef;
451 # The mob user certificate signed by $clientcert (undef for auto)
452 # The automatically generated certificate should always be fine
453 # Not used unless $mob is set to 'mob'
454 # The $clientcertsuffix will be appended before making $mobusercert available for download
455 our $mobusercert = undef;
457 # The private key for $mobusercert (undef for auto)
458 # The automatically generated key should always be fine
459 # Not used unless $mob is set to 'mob'
460 our $mobuserkey = undef;
462 # Server alt names to embed in the auto-generated girocco_www_crt.pem certificate.
463 # The common name (CN) in the server certificate is the host name from $httpspushurl.
464 # By default no server alt names are embedded (not even the host from $httpspushurl).
465 # If the web server configuration is not using this auto-generated server certificate
466 # then the values set here will have no impact and this setting can be ignored.
467 # To embed server alternative names, list each (separated by spaces). The names
468 # may be DNS names, IPv4 addresses or IPv6 addresses (NO surrounding '[' ']' please).
469 # If ANY DNS names are included here be sure to also include the host name from
470 # the $httpspushurl or else standards-conforming clients will fail with a host name
471 # mismatch error when they attempt to verify the connection.
472 #our $wwwcertaltnames = 'example.com www.example.com git.example.com 127.0.0.1 ::1';
473 our $wwwcertaltnames = undef;
475 # The key length for automatically generated RSA private keys (in bits).
476 # These keys are then used to create the automatically generated certificates.
477 # If undef or set to a value less than 2048, then 2048 will be used.
478 # Set to 3072 to generate more secure keys/certificates. Set to 4096 (or higher) for
479 # even greater security. Be warned that setting to a non-multiple of 8 and/or greater
480 # than 4096 could negatively impact compatibility with some clients.
481 # The values 2048, 3072 and 4096 are expected to be compatible with all clients.
482 # Note that OpenSSL has no problem with > 4096 or non-multiple of 8 lengths.
483 # See also the $min_key_length setting above to restrict user key sizes.
484 # This value is also used when generating the ssh_host_rsa_key for the chroot jail sshd.
485 # RECOMMENDED VALUE: 3072
486 our $rsakeylength = undef;
490 ## -------------
491 ## URL addresses
492 ## -------------
495 # URL of the gitweb.cgi script (must be in pathinfo mode). If the sample
496 # apache.conf configuration is used, the trailing "/w" is optional.
497 our $gitweburl = "http://repo.or.cz";
499 # URL of the extra gitweb files (CSS, .js files, images, ...)
500 our $gitwebfiles = "http://repo.or.cz";
502 # URL of the Girocco CGI web admin interface (Girocco cgi/ subdirectory)
503 # e.g. reguser.cgi, edituser.cgi, regproj.cgi, editproj.cgi etc.
504 our $webadmurl = "http://repo.or.cz";
506 # URL of the Girocco CGI bundles information generator (Girocco cgi/bundles.cgi)
507 # If the sample apache.conf configuration is used, the trailing "/b" is optional.
508 # This is different from $httpbundleurl. This URL lists all available bundles
509 # for a project and returns that as an HTML page.
510 our $bundlesurl = "http://repo.or.cz";
512 # URL of the Girocco CGI html templater (Girocco cgi/html.cgi)
513 # If mod_rewrite is enabled and the sample apache.conf configuration is used,
514 # the trailing "/h" is optional when the template file name ends in ".html"
515 # (which all the provided ones do).
516 our $htmlurl = "http://repo.or.cz";
518 # HTTP URL of the repository collection (undef if N/A)
519 # If the sample apache.conf configuration is used, the trailing "/r" is optional.
520 our $httppullurl = "http://repo.or.cz";
522 # HTTP URL of the repository collection when fetching a bundle (undef if N/A)
523 # Normally this will be the same as $httppullurl, but note that the bundle
524 # fetching logic is located in git-http-backend-verify so whatever URL is
525 # given here MUST end up running the git-http-backend-verify script!
526 # For example, if we're fetching the 'clone.bundle' for the 'girocco.git'
527 # repository, the final URL will be "$httpbundleurl/girocco.git/clone.bundle"
528 # If the sample apache.conf configuration is used, the trailing "/r" is optional.
529 # This is different from $bundlesurl. This URL fetches a single Git-format
530 # .bundle file that is only usable with the 'git bundle' command.
531 our $httpbundleurl = "http://repo.or.cz";
533 # HTTPS push URL of the repository collection (undef if N/A)
534 # If this is defined, the openssl command must be available
535 # The sample apache.conf configuration requires mod_ssl, mod_authn_anon and
536 # mod_rewrite be enabled to support https push operations.
537 # Normally this should be set to $httppullurl with http: replaced with https:
538 # If the sample apache.conf configuration is used, the trailing "/r" is optional.
539 our $httpspushurl = "https://repo.or.cz";
541 # Git URL of the repository collection (undef if N/A)
542 # (You need to set up git-daemon on your system, and Girocco will not
543 # do this particular thing for you.)
544 our $gitpullurl = "git://repo.or.cz";
546 # Pushy SSH URL of the repository collection (undef if N/A)
547 # Note that the "/$jailreporoot" portion is optional and will be automatically
548 # added if appropriate when omitted by the client so this URL can typically
549 # be made the same as $gitpullurl with git: replaced with ssh:
550 our $pushurl = "ssh://repo.or.cz";
552 # URL of gitweb of this Girocco instance (set to undef if you're not nice
553 # to the community)
554 our $giroccourl = "$Girocco::Config::gitweburl/girocco.git";
558 ## -------------------
559 ## web server controls
560 ## -------------------
563 # If true then non-smart HTTP access will be disabled
564 # There's normally no reason to leave non-smart HTTP access enabled
565 # since downloadable bundles are provided. However, in case the
566 # non-smart HTTP access is needed for some reason, this can be set to undef or 0.
567 # This affects access via http: AND https: and processing of apache.conf.in.
568 # Note that this setting does not affect gitweb, ssh: or git: URL access in any way.
569 # RECOMMENDED VALUE: 1
570 our $SmartHTTPOnly = 1;
572 # If true, the https <VirtualHost ...> section in apache.conf.in will be
573 # automatically enabled when it's converted to apache.conf by the conversion
574 # script. Do NOT enable this unless the required Apache modules are present
575 # and loaded (mod_ssl, mod_rewrite, mod_authn_anon) AND $httpspushurl is
576 # defined above otherwise the server will fail to start (with various errors)
577 # when the resulting apache.conf is used.
578 our $TLSHost = 1;
582 ## ------------------------
583 ## Some templating settings
584 ## ------------------------
587 # Legal warning (on reguser and regproj pages)
588 our $legalese = <<EOT;
589 <p>By submitting this form, you are confirming that you will mirror or push
590 only free software and redistributing it will not violate any law
591 of Czech Republic.
592 <sup class="sup"><span><a href="/about.html">(more details)</a></span></sup>
593 </p>
596 # Pre-configured mirror sources (set to undef for none)
597 # Arrayref of name - record pairs, the record has these attributes:
598 # label: The label of this source
599 # url: The template URL; %1, %2, ... will be substituted for inputs
600 # desc: Optional VERY short description
601 # link: Optional URL to make the desc point at
602 # inputs: Arrayref of hashref input records:
603 # label: Label of input record
604 # suffix: Optional suffix
605 # If the inputs arrayref is undef, single URL input is shown,
606 # pre-filled with url (probably empty string).
607 our $mirror_sources = [
609 label => 'Anywhere',
610 url => '',
611 desc => 'Any HTTP/Git/rsync pull URL - bring it on!',
612 inputs => undef
615 label => 'GitHub',
616 url => 'https://github.com/%1/%2.git',
617 desc => 'GitHub Social Code Hosting',
618 link => 'http://github.com/',
619 inputs => [ { label => 'User:' }, { label => 'Project:', suffix => '.git' } ]
622 label => 'GitLab',
623 url => 'https://gitlab.com/%1/%2.git',
624 desc => 'Engulfed the Green and Orange Boxes',
625 link => 'https://gitlab.com/',
626 inputs => [ { label => 'Project:' }, { label => 'Repository:', suffix => '.git' } ]
630 # You can customize the gitweb interface widely by editing
631 # gitweb/gitweb_config.perl
635 ## -------------------
636 ## Permission settings
637 ## -------------------
640 # Girocco needs some way to manipulate write permissions to various parts of
641 # all repositories; this concerns three entities:
642 # - www-data: the web interface needs to be able to rewrite few files within
643 # the repository
644 # - repo: a user designated for cronjobs; handles mirroring and repacking;
645 # this one is optional if not $mirror
646 # - others: the designated users that are supposed to be able to push; they
647 # may have account either within chroot, or outside of it
649 # There are several ways how to use Girocco based on a combination of the
650 # following settings.
652 # (Non-chroot) UNIX user the CGI scripts run on; note that if some non-related
653 # untrusted CGI scripts run on this account too, that can be a big security
654 # problem and you'll probably need to set up suexec (poor you).
655 # This must always be set.
656 our $cgi_user = 'www-data';
658 # (Non-chroot) UNIX user performing mirroring jobs; this is the user who
659 # should run all the daemons and cronjobs and
660 # the user who should be running make install (if not root).
661 # This must always be set.
662 our $mirror_user = 'repo';
664 # (Non-chroot) UNIX group owning the repositories by default; it owns whole
665 # mirror repositories and at least web-writable metadata of push repositories.
666 # If you undefine this, all the data will become WORLD-WRITABLE.
667 # Both $cgi_user and $mirror_user should be members of this group!
668 our $owning_group = 'repo';
670 # Whether to use chroot jail for pushing; this must be always the same
671 # as $manage_users.
672 # TODO: Gitosis support for $manage_users and not $chrooted?
673 our $chrooted = $manage_users;
675 # How to control permissions of push-writable data in push repositories:
676 # * 'Group' for the traditional model: The $chroot/etc/group project database
677 # file is used as the UNIX group(5) file; the directories have gid appropriate
678 # for the particular repository and are group-writable. This works only if
679 # $chrooted so that users are put in the proper groups on login when using
680 # SSH push. Smart HTTPS push does not require a chroot to work -- simply
681 # run "make install" as the non-root $mirror_user user, but leave
682 # $manage_users and $chrooted enabled.
683 # * 'ACL' for a model based on POSIX ACL: The directories are coupled with ACLs
684 # listing the users with push permissions. This works for both chroot and
685 # non-chroot setups, however it requires ACL support within the filesystem.
686 # This option is BASICALLY UNTESTED, too. And UNIMPLEMENTED. :-)
687 # * 'Hooks' for a relaxed model: The directories are world-writable and push
688 # permission control is purely hook-driven. This is INSECURE and works only
689 # when you trust all your users; on the other hand, the attack vectors are
690 # mostly just DoS or fully-traceable tinkering.
691 our $permission_control = 'Group';
693 # Path to alternate screen multiuser acl file (see screen/README, undef for none)
694 our $screen_acl_file = undef;
696 # Reserved project name and user name suffixes.
698 # Note that with personal mob branches enabled, a user name can end up being a
699 # file name after having a 'mob.' prefix added or a directory name after having
700 # a 'mob_' prefix added. If there is ANY possibility that a file with a
701 # .suffix name may need to be served by the web server, lc(suffix) SHOULD be in
702 # this hash! Pre-existing project names or user names with a suffix in this
703 # table can continue to be used, but no new projects or users can be created
704 # that have a suffix (case-insensitive) listed here.
705 our %reserved_suffixes = (
706 # Entries must be lowercase WITHOUT a leading '.'
707 bmp => 1,
708 bz2 => 1,
709 cer => 1,
710 cgi => 1,
711 crt => 1,
712 css => 1,
713 dmg => 1,
714 fcgi => 1,
715 gif => 1,
716 gz => 1,
717 htm => 1,
718 html => 1,
719 ico => 1,
720 jp2 => 1,
721 jpeg => 1,
722 jpg => 1,
723 jpg2 => 1,
724 js => 1,
725 pdf => 1,
726 pem => 1,
727 php => 1,
728 png => 1,
729 sig => 1,
730 shtml => 1,
731 svg => 1,
732 svgz => 1,
733 tar => 1,
734 text => 1,
735 tgz => 1,
736 tif => 1,
737 tiff => 1,
738 txt => 1,
739 xbm => 1,
740 xht => 1,
741 xhtml => 1,
742 xz => 1,
743 zip => 1,
748 ## -------------------------
749 ## sendmail.pl configuration
750 ## -------------------------
753 # Full information on available sendmail.pl settings can be found by running
754 # ../bin/sendmail.pl -v -h
756 # These settings will only used if $sendmail_bin is set to 'sendmail.pl'
758 # sendmail.pl host name
759 #$ENV{'SENDMAIL_PL_HOST'} = 'localhost'; # localhost is the default
761 # sendmail.pl port name
762 #$ENV{'SENDMAIL_PL_PORT'} = '25'; # port 25 is the default
764 # sendmail.pl nc executable
765 #$ENV{'SENDMAIL_PL_NCBIN'} = "$chroot/bin/nc.openbsd"; # default is nc found in $PATH
767 # sendmail.pl nc options
768 # multiple options may be included, e.g. '-4 -X connect -x 192.168.100.10:8080'
769 #$ENV{'SENDMAIL_PL_NCOPT'} = '-4'; # force IPv4, default is to allow IPv4 & IPv6
773 ## -------------------------
774 ## Obscure Tuneable Features
775 ## -------------------------
778 # Throttle classes configured here override the defaults for them that
779 # are located in taskd/taskd.pl. See comments in that file for more info.
780 our @throttle_classes = ();
782 # Any tag names listed here will be allowed even if they would otherwise not be.
783 # Note that @allowed_tags takes precedence over @blocked_tags.
784 our @allowed_tags = (qw( ));
786 # Any tag names listed here will be disallowed in addition to the standard
787 # list of nonsense words etc. that are blocked as tags.
788 our @blocked_tags = (qw( ));
790 # Case folding tags
791 # If this setting is true, then tags that differ only in case will always use
792 # the same-cased version. If this setting is enabled and the tag is present in
793 # @allowed_tags (or the embedded white list in Util.pm) then the case of the
794 # tag will match the white list entry otherwise it will be all lowercased.
795 # If this setting is disabled (false) tags are used with their case left as-is.
796 # RECOMMENDED VALUE: 1 (true)
797 our $foldtags = 1;
799 # If there are no more than this many objects, then all deltas will be
800 # recomputed when gc takes place. Note that this does not affect any
801 # fast-import created packs as they ALWAYS have their deltas recomputed.
802 # Also when combining small packs, if the total object count in the packs
803 # to be combined is no more than this then the new, combined pack will have
804 # its deltas recomputed during the combine operation.
805 # Leave undef to use the default (which should generally be fine).
806 # Lowering this from the default can increase disk use.
807 # Values less than 1000 * number of CPU cores will be silently ignored.
808 # The "girocco.redelta" config item can be used to modify this behavior on
809 # a per-repository basis. See the description of it in gc.sh.
810 our $new_delta_threshold = undef;
812 # This setting is irrelevant unless foreign vcs mirrors that use git fast-import
813 # are enabled (e.g. $mirror_darcs, $mirror_bzr or $mirror_hg -- $mirror_svn does
814 # NOT use git fast-import and is not affected by this setting).
815 # The packs generated by git fast-import are very poor quality. For this reason
816 # they ALWAYS have their deltas recomputed at some point. Normally this is
817 # delayed until the next full (or mini) gc takes place. For this reason a full
818 # gc is always scheduled immediately after a fresh mirror clone completes.
819 # However, in the case of normal mirror updates, several git fast-import created
820 # packs may exist as a result of changes fetched during the normal mirror update
821 # process. These packs will persist (with their git fast-import poor quality)
822 # until the next full (or mini) gc triggers. The bad deltas in these update
823 # packs could be sent down to clients who fetch updates before the next gc
824 # triggers. To reduce (i.e. practically eliminate) the likelihood of this
825 # occurring, this setting can be changed to a false (0 or undef) value in which
826 # case after each mirror update of a git fast-import mirror, any newly created
827 # git fast-import packs (as a result of the mirror update running) will have
828 # their deltas recomputed shortly thereafter instead of waiting for the next gc.
829 # Recomputing deltas immediately (almost immediately) will result in an extra
830 # redeltification step (with associated CPU cost) that would otherwise not
831 # occur and, in some cases (mainly large repositories), could ultimately result
832 # in slightly less efficient deltas being retained.
833 # RECOMMENDED VALUE: 1
834 our $delay_gfi_redelta = 1;
836 # If this is set to a true value, then core.packedGitWindowSize will be set
837 # to 1 MiB (the same as if Git was compiled with NO_MMAP set). If this is NOT
838 # set, core.packedGitWindowSize will be set to 32 MiB (even on 64-bit) to avoid
839 # memory blowout. If your Git was built with NO_MMAP set and will not work
840 # without NO_MMAP set, you MUST set this to a true value!
841 our $git_no_mmap = undef;
843 # If set to a true value, the "X-Girocco: $gitweburl" header included in all
844 # Girocco-generated emails will be suppressed.
845 our $suppress_x_girocco = undef;
847 # Number of days to keep reflogs around
848 # May be set to a value between 1 and 30 (inclusive)
849 # The default of one day should normally suffice unless there's a need to
850 # support a "Where's the undo? WHERE IS THE UNDO?!!!" option ;)
851 our $reflogs_lifetime = 1;
853 # The pack.window size to use with git upload-pack
854 # When Git is creating a pack to send down to a client, if it needs to send
855 # down objects that are deltas against objects it is not sending and that it
856 # does not know the client already has, it must undelta and recompute deltas
857 # for those objects. This is the remote's "Compressing objects" phase the
858 # client sees during a fetch or clone. If this value is unset, the normal
859 # Git default of 10 will be used for the window size during these operations.
860 # This value may be set to a number between 2 and 50 inclusive to change the
861 # window size during upload pack operations. A window size of 2 provides the
862 # fastest response at the expense of less efficient deltas for the objects
863 # being recompressed (meaning more data to send to the client). A window
864 # size of 5 typically reduces the compression time by almost half and is
865 # usually nearly as fast as a window size of 2 while providing better deltas.
866 # A window size of 50 will increase the time spent in the "Compressing objects"
867 # phase by as much as 5 times but will produce deltas similar to those that
868 # Girocco generates when it performs garbage collection.
869 # RECOMMENDED VALUE: undef or 5
870 our $upload_pack_window = 5;
872 # If this is true then remote fetching of refs/stash and refs/tgstash will
873 # be allowed. Git does not allow single-level ref names to be pushed so the
874 # only way they could get in there is if a linked working tree (or, gasp, a
875 # non-bare Girocco repository) created them or they arrived via a non-clean
876 # mirror fetch. The client almost certainly does not want to see them.
877 # Unless this config item is true they will also be left out of the bundle too.
878 # Since both stash and tgstash are used with their ref logs and there's no way
879 # for a remote to fetch ref logs, the "log --walk-reflogs" feature could not be
880 # used with them by a remote that fetched them anyway.
882 # NOTE: The reason this doesn't just control all single-level refs is that the
883 # "hideRefs" configuration mechanism isn't flexible enough to hide all
884 # single-level refs without knowing their names. In addition, it hides the
885 # entire refs hierarchy so refs/stash/foo will also be hidden along with
886 # refs/stash, but Git doesn't actually support ref names that introduce a
887 # directory/file confict (aka D/F conflict) and "refs/stash" represents an
888 # official Git ref name therefore any refs/stash/... names really aren't
889 # allowed in the first place so it's no problem if they're incidentally hidden
890 # along with refs/stash itself.
892 # NOTE: Git 1.8.2 or later is required to actually hide the refs from fetchers
893 # over the "git:" protocol and Git 2.3.5 or later is required to properly hide
894 # them over the smart "http:" protocol (Girocco will not attempt to "hide" them
895 # on a smart HTTP fetch if Git is < 2.3.5 to avoid Git bugs.) They will never
896 # be hidden via the non-smart HTTP fetch or any other non-smart protocols that
897 # also make use of the $gitdir/info/refs file as they are not excluded from it.
898 # Nor will they be hidden when accessed via any non-Girocco mechanism.
899 # They will, however, always be excluded from the primary (aka .bitmap) pack
900 # and bundle no matter what version of Git is used unless this is set to a
901 # true value. It's only the server's Git version that matters when hiding refs.
903 # RECOMMENDED VALUE: undef or 0
904 our $fetch_stash_refs = undef;
906 # When set to a true value, Girocco will attempt to pick up ref changes made
907 # outside of Girocco itself and process them using the usual Girocco
908 # notification mechanism. Git lacks any "post-ref-change" hook capability that
909 # could facilitate this. This feature is primarily intended to detect running
910 # of "git fetch" in linked working trees of a Girocco repository. In many
911 # cases after running a command Git runs "git gc --auto". With the correct
912 # encouragement we can always induce Git to run our pre-auto-gc hook at that
913 # time. "git fetch" invokes "git gc --auto" after the fetch. Girocco needs
914 # to do additional maintenance to make this work properly so do not enable this
915 # unless it's really needed. Additionally, there are a number of commands
916 # (such as "git commit") that do not invoke "git gc --auto". Even with this
917 # enabled, additional hooks for post-rewrite and post-checkout
918 # would really be needed to catch more things and even then there are some
919 # Git commands that would never be caught ("git filter-branch",
920 # "git update-ref", "git reset", etc.) so this is hardly a complete solution.
921 # But it WILL catch "git fetch" changes although the hashes it uses for the
922 # "old" ref values may not be all that recent, the new ref values will be.
923 # When this is false, the hack is completely disabled.
924 # When this is true, the hack is enabled by default for all repositories,
925 # but can be controlled on an individual repository basis by setting the
926 # girocco.autogchack value explicitly to true (enable) or false (disable).
927 # If this is set to the special value "mirror" then it will behave as true
928 # for mirrors and false for non-mirrors thereby completely eliminating any
929 # overhead for push projects but detecting external "git fetch"s for mirrors.
930 # If this is enabled for a project, any third party script/tool can trigger
931 # the Girocco ref notification mechanism simply by making a ref change and
932 # then running "git gc --auto --quiet" on the project. In a capitulation to
933 # use of linked working trees, Girocco installs a post-commit hook that will
934 # trigger these notifications as well when this is enabled.
935 our $autogchack = 0;
937 # When set to a true value the initial setting for core.hooksPath will point
938 # to the repository's own hooks directory instead of $reporoot/_global/hooks.
939 # Due to the unfortunate implementation of core.hooksPath, Girocco must always
940 # ensure the value gets set in each repository's config file. Normally it
941 # just sets it to $reporoot/_global/hooks and that's that. However, the
942 # update-all-config script will also tolerate it pointing at the repository's
943 # own hooks directory -- Girocco maintains symbolic links in there to the
944 # global hooks to make sure they get run when using older versions of Git;
945 # therefore that setting is basically equivalent. The difference is that
946 # repository-specific hooks can be added when hooksPath is pointing at the
947 # repository's hooks directory but not when it's pointing at _global/hooks.
948 # A repository's setting can be changed manually (and it will stick), but
949 # sometimes it may be desirable to always just default to pointing at the
950 # repository's own hooks directory from the start. Perhaps linked working
951 # trees will be in use and software that needs to set repository-specific hooks
952 # will be in use. If $autogchack has been set to true this may very likely be
953 # the case.
954 our $localhooks = 0;
956 # If this is set to a true value changes to single-level refs (e.g. refs/stash)
957 # will be passed through to the notification machinery.
958 # Usually this is NOT wanted, especially when linked working trees are being
959 # used with the repository.
960 # However, in the unlikely event that changes to such ref names should NOT be
961 # ignored, this value may be set to any true value.
962 # RECOMMENDED VALUE: 0
963 our $notify_single_level = 0;
965 # If this is set to a non-empty value it will become the default value for
966 # all repositories' girocco.notifyHook value.
967 # Whenever taskd.pl receives a batch of ref changes for processing, it first
968 # sends them off to any configured "girocco.notifyHook" (same semantics as
969 # a post-receive hook except it also gets four command-line arguments like
970 # so: cat ref-changes | notifyhook $projname $user $linecount $contextlinecount
971 # There is no default notify hook, but each repository may set its own by
972 # setting the `girocco.notifyHook` config value which will be eval'd by the
973 # shell (like $GIT_EDITOR is) with the current directory set to the
974 # repository's git-dir and the changes on standard input.
975 # Note that normal notification processing does not take place until after
976 # this command (if it's not null) gets run (regardless of its result code).
977 our $default_notifyhook = undef;
979 # UNIX group owning the repositories' htmlcache subdirectory
980 # If not defined defaults to $owning_group
981 # If gitweb access is provided but only on a read-only basis, then setting
982 # this to a group to which Both $cgi_user and $mirror_user belong will still
983 # allow summary page caching.
984 # $mirror_user should always belong to this group
985 our $htmlcache_owning_group = undef;
987 # UNIX group owning the repositories' ctags subdirectory
988 # If not defined defaults to $owning_group
989 # If gitweb access is provided but only on a read-only basis, then setting
990 # this to a group to which Both $cgi_user and $mirror_user belong will still
991 # allow tags to be added to the repository in gitweb (provided that feature
992 # is enabled in gitweb/gitweb_config.perl).
993 # $mirror_user should always belong to this group
994 our $ctags_owning_group = undef;
996 # When using pack bitmaps and computing data to send to clients over a fetch,
997 # having pack.writeBitmapHashCache set to true produces better deltas (thereby
998 # potentially reducing the amount of data that needs to be sent). However,
999 # JGit does not understand this extra data, so if JGit needs to use the bitmaps
1000 # generated when Girocco runs Git, this setting needs to be set to a true value
1001 # so that the hash cache is excluded when Git generates the bitmaps thereby
1002 # making them compatible with JGit.
1003 # Note that changes to this setting will not take effect until the next time
1004 # gc is scheduled to run on a project and then only if gc actually takes place.
1005 # Use the $basedir/toolbox/make-all-gc-eligible.sh script to force all projects
1006 # to actually do a gc the next time they are scheduled for one.
1007 # RECOMMENDED VALUE: undef or 0
1008 our $jgit_compatible_bitmaps = 0;
1010 # Set the default value of receive.maxInputSize
1011 # This is only effective for receives (aka an incoming push) and causes the
1012 # push to abort if the incoming pack (which is generally thin and does not
1013 # have any index) exceeds this many bytes in size (a 'k', 'm' or 'g' suffix
1014 # may be used on the value). If undef or set to 0 there is no limit. This
1015 # limit is only effective when Girocco is running Git v2.11.0 or later.
1016 our $max_receive_size = undef;
1018 # Select the sshd to be installed into the chroot
1019 # If set this MUST be an absolute path
1020 # Ignored unless a chroot is actually being created
1021 # Leaving this undef will find sshd in "standard" system locations and
1022 # is the recommended value. Only set this if you need to override the
1023 # "standard" sshd for some reason.
1024 # RECOMMENDED VALUE: undef
1025 our $sshd_bin = undef;
1029 ## ------------------------
1030 ## Sanity checks & defaults
1031 ## ------------------------
1033 # Changing anything in this section can result in unexpected breakage
1035 # Couple of sanity checks and default settings (do not change these)
1036 use Digest::MD5 qw(md5);
1037 use MIME::Base64 qw(encode_base64);
1038 $name =~ s/\s+/_/gs;
1039 $nickname = lc((split(/[.]/, $name))[0]) unless $nickname;
1040 $nickname =~ s/\s+/_/gs;
1041 our $tmpsuffix = substr(encode_base64(md5($name.':'.$nickname)),0,6);
1042 $tmpsuffix =~ tr,+/,=_,;
1043 ($mirror_user) or die "Girocco::Config: \$mirror_user must be set even if to current user";
1044 ($basedir) or die "Girocco::Config: \$basedir must be set";
1045 ($sendmail_bin) or die "Girocco::Config: \$sendmail_bin must be set";
1046 $sendmail_bin = "$basedir/bin/sendmail.pl" if $sendmail_bin eq "sendmail.pl";
1047 $screen_acl_file = "$basedir/screen/giroccoacl" unless $screen_acl_file;
1048 $jailreporoot =~ s,^/+,,;
1049 ($reporoot) or die "Girocco::Config \$reporoot must be set";
1050 ($jailreporoot) or die "Girocco::Config \$jailreporoot must be set";
1051 $disable_jailsetup = $disable_jailsetup ? 1 : '';
1052 $notify_single_level = $notify_single_level ? 1 : '';
1053 $fetch_stash_refs = $fetch_stash_refs ? 1 : '';
1054 (not $mob or $mob eq 'mob') or die "Girocco::Config \$mob must be undef (or '') or 'mob'";
1055 (not $min_key_length or $min_key_length =~ /^[1-9][0-9]*$/)
1056 or die "Girocco::Config \$min_key_length must be undef or numeric";
1057 (defined $mailsh_sizelimit and $mailsh_sizelimit =~ /^[1-9][0-9]*$/)
1058 or die "Girocco::Config \$mailsh_sizelimit must be a positive number";
1059 $admincc = $admincc ? 1 : 0;
1060 $rootcert = "$certsdir/girocco_root_crt.pem" if $httpspushurl && !$rootcert;
1061 $clientcert = "$certsdir/girocco_client_crt.pem" if $httpspushurl && !$clientcert;
1062 $clientkey = "$certsdir/girocco_client_key.pem" if $httpspushurl && !$clientkey;
1063 $clientcertsuffix = "$certsdir/girocco_client_suffix.pem" if $httpspushurl && !$clientcertsuffix;
1064 $mobusercert = "$certsdir/girocco_mob_user_crt.pem" if $httpspushurl && $mob && !$mobusercert;
1065 $mobuserkey = "$certsdir/girocco_mob_user_key.pem" if $httpspushurl && $mob && !$mobuserkey;
1066 our $mobpushurl = $pushurl;
1067 $mobpushurl =~ s,^ssh://,ssh://mob@,i if $mobpushurl;
1068 $disable_dsa = 1 unless $pushurl;
1069 $disable_dsa = $disable_dsa ? 1 : '';
1070 our $httpdnsname = ($gitweburl =~ m,https?://([A-Za-z0-9.-]+),i) ? lc($1) : undef if $gitweburl;
1071 our $httpsdnsname = ($httpspushurl =~ m,https://([A-Za-z0-9.-]+),i) ? lc($1) : undef if $httpspushurl;
1072 ($mirror or $push) or die "Girocco::Config: neither \$mirror nor \$push is set?!";
1073 (not $push or ($pushurl or $httpspushurl or $gitpullurl or $httppullurl)) or die "Girocco::Config: no pull URL is set";
1074 (not $push or ($pushurl or $httpspushurl)) or die "Girocco::Config: \$push set but \$pushurl and \$httpspushurl are undef";
1075 (not $mirror or $mirror_user) or die "Girocco::Config: \$mirror set but \$mirror_user is undef";
1076 ($manage_users == $chrooted) or die "Girocco::Config: \$manage_users and \$chrooted must be set to the same value";
1077 (not $chrooted or $permission_control ne 'ACL') or die "Girocco::Config: resolving uids for ACL not supported when using chroot";
1078 (grep { $permission_control eq $_ } qw(Group Hooks)) or die "Girocco::Config: \$permission_control must be set to Group or Hooks";
1079 ($chrooted or not $mob) or die "Girocco::Config: mob user supported only in the chrooted mode";
1080 (not $httpspushurl or $httpsdnsname) or die "Girocco::Config invalid \$httpspushurl does not start with https://domainname";
1081 (not $svn_log_window_size or $svn_log_window_size =~ /^[1-9][0-9]*$/)
1082 or die "Girocco::Config \$svn_log_window_size must be undef or numeric";
1083 (not $posix_sh_bin or $posix_sh_bin !~ /\s/) or die "Girocco::Config: \$posix_sh_bin must not contain any whitespace";
1084 (not $perl_bin or $perl_bin !~ /\s/) or die "Girocco::Config: \$perl_bin must not contain any whitespace";
1085 !$delay_gfi_redelta and $delay_gfi_redelta = undef;
1086 !$git_no_mmap and $git_no_mmap = undef;
1087 !$suppress_x_girocco and $suppress_x_girocco = undef;
1088 !$jgit_compatible_bitmaps and $jgit_compatible_bitmaps = undef;
1089 !$autogchack and $autogchack = undef;
1090 (not $reflogs_lifetime or $reflogs_lifetime !~ /^[1-9][0-9]*$/) and $reflogs_lifetime = 1;
1091 $reflogs_lifetime = 0 + $reflogs_lifetime;
1092 $reflogs_lifetime >= 0 or $reflogs_lifetime = 1;
1093 $reflogs_lifetime <= 30 or $reflogs_lifetime = 30;
1094 (not defined $upload_pack_window or $upload_pack_window =~ /^[1-9][0-9]*$/)
1095 or die "Girocco::Config \$upload_pack_window must be undef or numeric";
1096 (not defined $upload_pack_window or $upload_pack_window >= 2 && $upload_pack_window <= 50)
1097 or die "Girocco::Config \$upload_pack_window must be in range 2..50";
1098 (not defined $max_receive_size or $max_receive_size =~ /^\d+[kKmMgG]?$/)
1099 or die "Girocco::Config \$max_receive_size setting is invalid";
1100 defined($ENV{'SENDMAIL_PL_HOST'}) and our $sendmail_pl_host = $ENV{'SENDMAIL_PL_HOST'};
1101 defined($ENV{'SENDMAIL_PL_PORT'}) and our $sendmail_pl_port = $ENV{'SENDMAIL_PL_PORT'};
1102 defined($ENV{'SENDMAIL_PL_NCBIN'}) and our $sendmail_pl_ncbin = $ENV{'SENDMAIL_PL_NCBIN'};
1103 defined($ENV{'SENDMAIL_PL_NCOPT'}) and our $sendmail_pl_ncopt = $ENV{'SENDMAIL_PL_NCOPT'};
1104 defined($ENV{'PYTHON'}) and our $python = $ENV{'PYTHON'};
1105 my $op; BEGIN {$op = $ENV{'PATH'}}
1106 defined($op) && defined($ENV{'PATH'}) && $op ne $ENV{'PATH'} and our $path=$ENV{'PATH'};
1108 # jailreporoot MUST NOT be absolute
1109 defined($jailreporoot) && substr($jailreporoot, 0, 1) ne "/" or
1110 die "\$jailreporoot MUST NOT be an absolute path\n";
1112 # webreporoot can be undef
1113 !defined($webreporoot) || substr($webreporoot, 0, 1) eq "/" or
1114 die "\$webreporoot MUST be an absolute path if not undef\n";
1116 # All these MUST be absolute paths
1118 no strict 'refs';
1119 defined(${$_}) && substr(${$_}, 0, 1) eq "/" or
1120 die "\$$_ MUST be an absolute path\n"
1121 foreach qw(basedir certsdir reporoot chroot webroot cgiroot projlist_cache_dir);
1124 # Make sure Git has a consistent and reproducible environment
1126 $ENV{'XDG_CONFIG_HOME'} = $chroot.'/var/empty';
1127 $ENV{'HOME'} = $chroot.'/etc/girocco';
1128 $ENV{'TMPDIR'} = '/tmp';
1129 $ENV{'GIT_CONFIG_NOSYSTEM'} = 1;
1130 $ENV{'GIT_ATTR_NOSYSTEM'} = 1;
1131 $ENV{'GIT_NO_REPLACE_OBJECTS'} = 1;
1132 $ENV{'GIT_TERMINAL_PROMPT'} = 0;
1133 $ENV{'GIT_ASKPASS'} = $basedir.'/bin/git-askpass-password';
1134 delete $ENV{'GIT_USER_AGENT'};
1135 $ENV{'GIT_USER_AGENT'} = $git_client_ua if defined($git_client_ua);
1136 delete $ENV{'GIT_HTTP_USER_AGENT'};
1137 delete $ENV{'GIT_CONFIG_PARAMETERS'};
1138 delete $ENV{'GIT_ALTERNATE_OBJECT_DIRECTORIES'};
1139 delete $ENV{'GIT_CONFIG'};
1140 delete $ENV{'GIT_DIR'};
1141 delete $ENV{'GIT_GRAFT_FILE'};
1142 delete $ENV{'GIT_INDEX_FILE'};
1143 delete $ENV{'GIT_OBJECT_DIRECTORY'};
1144 delete $ENV{'GIT_NAMESPACE'};
1146 # Guarantee a sane umask for Girocco
1148 umask(umask() & ~0770);