indextext.html: update notice about ssh host key change
[girocco.git] / Girocco / Config.pm
blobd7508c0ca951b7d0660e48629e69aab755c51774
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 # For a Linux-like system try installing the 'netcat-openbsd' package.
43 our $nc_openbsd_bin = 'nc.openbsd';
45 # Path to POSIX sh executable to use. Set to undef to use /bin/sh
46 our $posix_sh_bin = undef;
48 # Path to Perl executable to use. Set to undef to use Perl found in $PATH
49 our $perl_bin = undef;
51 # Path to gzip executable to use. Set to undef to use gzip found in $PATH
52 our $gzip_bin = undef;
54 # Path to OpenSSL/LibreSSL executable to use.
55 # Set to undef to use openssl found in $PATH
56 # Not used unless $httpspushurl is defined
57 our $openssl_bin = undef;
59 # Path to the sendmail instance to use. It should understand the -f <from>, -i and -t
60 # options as well as accepting a list of recipient addresses in order to be used here.
61 # You MUST set this, even if to '/usr/sbin/sendmail'!
62 # Setting this to 'sendmail.pl' is special and will automatically be expanded to
63 # a full path to the ../bin/sendmail.pl executable in this Girocco installation.
64 # sendmail.pl is a sendmail-compatible script that delivers the message directly
65 # using SMTP to a mail relay host. This is the recommended configuration as it
66 # minimizes the information exposed to recipients (no sender account names or uids),
67 # can talk to an SMTP server on another host (eliminating the need for a working
68 # sendmail and/or SMTP server on this host) and avoids any unwanted address rewriting.
69 # By default it expects the mail relay to be listening on localhost port 25.
70 # See the sendmail.pl section below for more information on configuring sendmail.pl.
71 our $sendmail_bin = 'sendmail.pl';
73 # E-mail of the site admin
74 our $admin = 'admin@repo.or.cz';
76 # Sender of emails
77 # This is the SMTP 'MAIL FROM:' value
78 # It will be passed to $sendmail_bin with the -f option
79 # Some sites may not allow non-privileged users to pass the -f option to
80 # $sendmail_bin. In that case set this to undef and no -f option will be
81 # passed which means the 'MAIL FROM:' value will be the user the mail is
82 # sent as (either $cgi_user or $mirror_user depending on the activity).
83 # To avoid having bounce emails go to $admin, this may be set to something
84 # else such as 'admin-noreply@example.org' and then the 'admin-noreply' address
85 # may be redirected to /dev/null. Setting this to '' or '<>' is not
86 # recommended because that will likely cause the emails to be marked as SPAM
87 # by the receiver's SPAM filter. If $sendmail_bin is set to 'sendmail.pl' this
88 # value must be acceptable to the receiving SMTP server as a 'MAIL FROM:' value.
89 # If this is set to undef and 'sendmail.pl' is used, the 'MAIL FROM:' value will
90 # be the user the mail is sent as (either $cgi_user or $mirror_user).
91 our $sender = 'admin-noreply@repo.or.cz';
93 # Copy $admin on failure/recovery messages?
94 our $admincc = 0;
96 # Girocco branch to use for html.cgi view source links (undef for HEAD)
97 our $giroccobranch = 'rorcz';
99 # PATH adjustments
100 # If the PATH needs to be customized to find required executables on
101 # the system, it can be done here.
102 # IMPORTANT: If PATH is NOT set here,
103 # it *will* be set to `/usr/bin/getconf PATH`!
104 # To keep whatever PATH is in effect when Girocco is installed use:
105 #$ENV{PATH} = $ENV{PATH};
106 # To add /usr/local/bin to the standard PATH, use something like this:
107 #use Girocco::Dumper qw(GetConfPath);
108 #$ENV{PATH} = GetConfPath().":/usr/local/bin";
112 ## ----------------------
113 ## Git user agent strings
114 ## ----------------------
117 # Git clients (i.e. fetch/clone) always send a user agent string when fetching
118 # over HTTP. Since version 1.7.12.1 an 'agent=' capability string is included
119 # as well which affects git:, smart HTTP and ssh: protocols.
121 # These settings allow the default user agent string to be changed independently
122 # for fetch/clone operations (only matters if $mirror is true) and server
123 # operations (some other Git client fetching from us). Note that it is not
124 # possible to suppress the capability entirely although it can be set to an
125 # empty string. If these values are not set, the default user agent string
126 # will be used. Typically (unless Git was built with non-standard options) the
127 # default is "git/" plus the version. So for example "git/1.8.5.6" or
128 # "git/2.1.4" might be seen.
130 # One might want to change the default user agent strings in order to prevent
131 # an attacker from learning the exact Git version being used to avoid being
132 # able to quickly target any version-specific vulnerabilities. Note that
133 # no matter what's set here, an attacker can easily determine whether a server
134 # is running JGit, libgit2 or Git and for Git whether it's version 1.7.12.1 or
135 # later. A reasonable value to hide the exact Git version number while
136 # remaining compatible with servers that require a "Git/" user agent string
137 # would be something like "git/2" or even just "git/".
139 # The GIT_USER_AGENT value to use when acting as a client (i.e. clone/fetch)
140 # This value is only used if $mirror is true and at least one mirror is set up.
141 # Setting this to the empty string will suppress the HTTP User-Agent header,
142 # but will still include an "agent=" capability in the packet protocol. The
143 # empty string is not recommended because some servers match on "git/".
144 # Leave undef to use the default Git user agent string
145 # IMPORTANT: some server sites will refuse to serve up Git repositories unless
146 # the client user agent string contains "Git/" (matched case insensitively)!
147 our $git_client_ua = undef;
149 # The GIT_USER_AGENT value to use when acting as a server (i.e. some Git client
150 # is fetching/cloning from us).
151 # Leave undef to use the default Git user agent string
152 our $git_server_ua = undef;
156 ## -------------
157 ## Feature knobs
158 ## -------------
161 # Enable mirroring mode if true (see "Foreign VCS mirrors" section below)
162 our $mirror = 1;
164 # Enable push mode if true
165 our $push = 1;
167 # If both $mirror and $push are enabled, setting this to 'mirror' pre-selects
168 # mirror mode on the initial regproj display, otherwise 'push' mode will be
169 # pre-selected. When forking the initial mode will be 'push' if $push enabled.
170 our $initial_regproj_mode = 'mirror';
172 # Enable user management if true; this means the interface for registering
173 # user accounts and uploading SSH keys. This implies full chroot.
174 our $manage_users = 1;
176 # Minimum key length (in bits) for uploaded SSH RSA/DSA keys.
177 # If this is not set (i.e. undef) keys as small as 512 bits will be allowed.
178 # Nowadays keys less than 2048 bits in length should probably not be allowed.
179 # Note, however, that versions of OpenSSH starting with 4.3p1 will only generate
180 # DSA keys of exactly 1024 bits in length even though that length is no longer
181 # recommended. (OpenSSL can be used to generate DSA keys with lengths > 1024.)
182 # OpenSSH does not have any problem generating RSA keys longer than 1024 bits.
183 # This setting is only checked when new keys are added so setting it/increasing it
184 # will not affect existing keys. For maximum compatibility a value of 1024 may
185 # be used however 2048 is recommended. Setting it to anything other than 1024,
186 # 2048 or 3072 may have the side effect of making it very difficult to generate
187 # DSA keys that satisfy the restriction (but RSA keys should not be a problem).
188 # Note that no matter what setting is specified here keys smaller than 512 bits
189 # will never be allowed via the reguser.cgi/edituser.cgi interface.
190 # RECOMMENDED VALUE: 2048 (ok) or 3072 (better)
191 our $min_key_length = 2048;
193 # Disable DSA public keys?
195 # If this is set to 1, adding DSA keys at reguser.cgi/edituser.cgi time will be
196 # prohibited. If $pushurl is undef then this is implicitly set to 1 since DSA
197 # keys are not usable with https push.
199 # OpenSSH will only generate 1024 bit DSA keys starting with version 4.3p1.
200 # Even if OpenSSL is used to generate a longer DSA key (which can then be used
201 # with OpenSSH), the SSH protocol itself still forces use of SHA-1 in the DSA
202 # signature blob which tends to defeat the purpose of going to a longer key in
203 # the first place. So it may be better from a security standpoint to simply
204 # disable DSA keys especially if $min_key_length and $rsakeylength have been set
205 # to something higher such as 3072 or 4096.
207 # This setting is only checked when new keys are added so changing it will not
208 # affect existing keys. There is no way to disable DSA keys in the sshd_config
209 # file of older versions of the OpenSSH server, but newer versions of OpenSSH
210 # WILL DISABLE DSA KEYS BY DEFAULT!
212 # IMPORTANT: If you do enable DSA keys ($disable_dsa is set to 0) and you are
213 # using a more recent version of the OpenSSH server software in the
214 # chroot jail, you MUST manually ADD the following line
215 # (the "+" IS REQUIRED) to the $chroot/j/etc/ssh/sshd_config file
216 # otherwise dsa keys WILL NOT BE ACCEPTED!
218 # PubkeyAcceptedKeyTypes +ssh-dss
220 # If this is set to 1, no ssh_host_dsa_key will be generated or used with the
221 # sshd running in the jail (but if the sshd_config has already been generated
222 # in the jail, it must be removed and 'sudo make install' run again or otherwise
223 # the sshd_config needs to be edited by hand for the change to take effect).
225 # RECOMMENDED VALUE: 1
226 our $disable_dsa = 1;
228 # Enable the special 'mob' user if set to 'mob'
229 our $mob = "mob";
231 # Let users set admin passwords; if false, all password inputs are assumed empty.
232 # This will make new projects use empty passwords and all operations on them
233 # unrestricted, but you will be able to do no operations on previously created
234 # projects you have set a password on.
235 our $project_passwords = 1;
237 # How to determine project owner; 'email' adds a form item asking for their
238 # email contact, 'source' takes realname of owner of source repository if it
239 # is a local path (and empty string otherwise). 'source' is suitable in case
240 # the site operates only as mirror of purely local-filesystem repositories.
241 our $project_owners = 'email';
243 # Which project fields to make editable, out of 'shortdesc', 'homepage', 'README',
244 # 'cleanmirror', 'notifymail', 'reverseorder', 'summaryonly', 'notifytag' and 'notifyjson'
245 # 'notifycia' was used by the now defunct CIA service and while allowing it to
246 # be edited does work and the value is saved, the value is totally ignored by Girocco
247 our @project_fields = qw(cleanmirror homepage shortdesc README notifymail reverseorder summaryonly notifytag notifyjson);
249 # Which project fields to protect -- they will first require the project
250 # password to be entered before they can even be viewed on the editproj page
251 our $protect_fields = {map({$_ => 1} qw(notifymail notifytag notifyjson))};
253 # Registration/Edit expiration time
254 # The registration form must be completed within this amount of time
255 # or it will time out and require starting over. The project edit page
256 # must be submitted within this amount of time or it will time out and
257 # require starting over.
258 our $project_edit_timeout = 1800; # 30 minutes
260 # Minimal number of seconds to pass between two updates of a project.
261 our $min_mirror_interval = 3600; # 1 hour
263 # Minimal number of seconds to pass between two garbage collections of a project.
264 our $min_gc_interval = 604800; # 1 week
266 # Minimal number of seconds to pass after first failure before sending failure email.
267 # A mirror update failed message will not be sent until mirror updates have been
268 # failing for at least this long. Set to 0 to send a failure message right away
269 # (provided the $min_mirror_failure_message_count condition has been met).
270 our $min_mirror_failure_message_interval = 345600; # 4 days
272 # Minimal number of consecutive failures required before sending failure email.
273 # A mirror update failed message will not be sent until mirror updates have failed
274 # for this many consecutive updates. Set to 0 to send a failure message right away
275 # (provided the $min_mirror_failure_message_interval condition has been met).
276 our $min_mirror_failure_message_count = 10;
278 # Maximum window memory size when repacking. If this is set, it will be used
279 # instead of the automatically computed value if it's less than that value.
280 # May use a 'k', 'm', or 'g' suffix otherwise value is in bytes.
281 our $max_gc_window_memory_size = undef;
283 # Maximum big file threshold size when repacking. If this is set, it will be
284 # used instead of the automatically computed value if it's less than that value.
285 # May use a 'k', 'm', or 'g' suffix otherwise value is in bytes.
286 our $max_gc_big_file_threshold_size = undef;
288 # Whether or not to run the ../bin/update-pwd-db script whenever the etc/passwd
289 # database is changed. This is typically needed (i.e. set to a true value) for
290 # FreeBSD style systems when using an sshd chroot jail for push access. So if
291 # $pushurl is undef or the system Girocco is running on is not like FreeBSD
292 # (e.g. a master.passwd file that must be transformed into pwd.db and spwd.db), then
293 # this setting should normally be left false (i.e. 0). See comments in the
294 # provided ../bin/update-pwd-db script about when and how it's invoked.
295 our $update_pwd_db = 0;
297 # Port the sshd running in the jail should listen on
298 # Be sure to update $pushurl to match
299 # Not used if $pushurl is undef
300 our $sshd_jail_port = 22;
302 # If this is true then host names used in mirror source URLs will be checked
303 # and any that are not DNS names (i.e. IPv4 or IPv6) or match one of the DNS
304 # host names in any of the URL settings below will be rejected.
305 our $restrict_mirror_hosts = 1;
307 # If $restrict_mirror_hosts is enabled this is the minimum number of labels
308 # required in a valid dns name. Normally 2 is the correct value, but if
309 # Girocco is being used internally where a common default or search domain
310 # is set for everyone then this should be changed to 1 to allow a dns name
311 # with a single label in it. No matter what is set here at least 1 label
312 # is always required when $restrict_mirror_hosts is enabled.
313 our $min_dns_labels = 2;
315 # If defined, pass this value to format-readme as its `-m` option
316 # When format-readme is formatting an automatic readme, it will skip
317 # anything larger than this. The default is 32768 if unset.
318 # See `bin/format-readme -h` for details.
319 our $max_readme_size = 350000;
321 # Maximum size of any single email sent by mail.sh in K (1024-byte) units
322 # If message is larger it will be truncated with a "...e-mail trimmed" line
323 # RECOMMENDED VALUE: 256 - 5120 (.25M - 5M)
324 our $mailsh_sizelimit = 512;
328 ## ----------------------
329 ## Miscellaneous Settings
330 ## ----------------------
333 # When creating a push project the initial branch will, by default, be
334 # set to refs/heads/$initial_branch even on Git versions that do not have
335 # support for `git init --initial-branch=$initial_branch`.
336 # If this value is unset or invalid the default initial branch will always
337 # be "master". Note that this only applies to newly created "push" projects;
338 # mirror projects and "adopted" projects ignore this setting.
339 # Set the $empty_commit_message setting to make this setting truly take effect.
340 # RECOMMENDED VALUE: whatever-your-favored-initial-branch-name-is
341 #our $initial_branch = "supercalifragilisticexpialidocious";
342 #our $initial_branch = "frabjous";
343 our $initial_branch = undef;
345 # When creating a new push project, if this is DEFINED to any value (including
346 # the empty string), then an initial empty commit will be added to the newly
347 # created push project that has an empty tree and contains the $empty_commit_message
348 # as its commit message. By doing so, the initial branch will NOT be unborn and
349 # as a result, when cloning such a project the clone WILL respect the $initial_branch
350 # setting and set up its HEAD symbolic-ref to match. Since the initial commit will
351 # have an empty tree it should be no less convenient than cloning a project with an
352 # unborn initial branch. In fact, it should be more convenient as the expected
353 # $initial_branch will be checked out rather than whatever random initial branch the
354 # client might otherwise be inclined to set up for a newly initialized empty project.
355 # Defining this will also suppress the "You appear to have cloned an empty repository."
356 # message that would otherwise be generated by the Git client when cloning a newly
357 # created push project since the project will no longer technically be "empty".
358 # RECOMMENDED VALUE: defined if the $initial_branch setting should be respected
359 #our $empty_commit_message = "create project";
360 #our $empty_commit_message = "initial empty commit";
361 #our $empty_commit_message = "initial commit\n\ngit add ...\ngit commit\ngit push";
362 #our $empty_commit_message = "";
363 our $empty_commit_message = undef;
367 ## -------------------
368 ## Foreign VCS mirrors
369 ## -------------------
372 # Note that if any of these settings are changed from true to false, then
373 # any pre-existing mirrors using the now-disabled foreign VCS will stop
374 # updating, new mirrors using the now-disabled foreign VCS will be disallowed
375 # and attempts to update ANY project settings for a pre-existing project that
376 # uses a now-disabled foreign VCS source URL will also be disallowed.
378 # If $mirror is true and $mirror_svn is true then mirrors from svn source
379 # repositories will be allowed (and be converted to Git). These URLs have
380 # the form svn://... or svn+http://... or svn+https://...
381 # Since this functionality makes use of the "git svn" command and is maintained
382 # with Git, it tends to be kept up-to-date and highly usable.
383 # Note that for this to work the "svn" command line command must be available
384 # in PATH and the "git svn" commands must work (which generally requires both
385 # Perl and the subversion perl bindings be installed).
386 # RECOMMENDED VALUE: 1 (if the necessary prerequisites are installed)
387 our $mirror_svn = 1;
389 # Prior to Git v1.5.1, git-svn always used a log window size of 1000.
390 # Starting with Git v1.5.1, git-svn defaults to using a log window size of 100
391 # and provides a --log-window-size= option to change it. Starting with Git
392 # v2.2.0, git-svn disconnects and reconnects to the server every log window size
393 # interval to attempt to reduce memory use by git-svn. If $svn_log_window_size
394 # is undefined, Girocco will use a log window size of 250 (instead of the
395 # the default 100). If $svn_log_window_size is set, Girocco will use that
396 # value instead. Beware that setting it too low (i.e. < 50) will almost
397 # certainly cause performance issues if not failures. Unless there are concerns
398 # about git-svn memory use on a server with extremely limited memory, the
399 # value of 250 that Girocco uses by default should be fine. Obviously if
400 # $mirror or $mirror_svn is false this setting is irrelevant.
401 our $svn_log_window_size = undef;
403 # If $mirror is true and $mirror_darcs is true then mirrors from darcs source
404 # repositories will be allowed (and be converted to Git). These URLs have
405 # the form darcs+http://... darcs+https://... (and deprecated darcs://...)
406 # Note that for this to work the "darcs" command line command must be available
407 # in PATH and so must python (required to run the darcs-fast-export script).
408 # This support depends on items updated separately from Git and which may easily
409 # become out-of-date or incompatible (e.g. new python version).
410 # NOTE: If this is set to 0, the girocco-darcs-fast-export.git
411 # submodule need not be initialized or checked out.
412 # RECOMMENDED VALUE: 0 (unless you have a need to mirror darcs repos)
413 our $mirror_darcs = 0;
415 # If $mirror is true and $mirror_bzr is true then mirrors from bzr source
416 # repositories will be allowed (and be converted to Git). These URLs have
417 # the form bzr://...
418 # Note that for this to work the "bzr" command line command must be available
419 # in PATH (it's a python script so python is required as well).
420 # This support depends on items updated separately from Git and which may easily
421 # become out-of-date or incompatible (e.g. new python version).
422 # RECOMMENDED VALUE: 0 (unless you have a need to mirror bzr repos)
423 our $mirror_bzr = 0;
425 # If $mirror is true and $mirror_hg is true then mirrors from hg source
426 # repositories will be allowed (and be converted to Git). These URLs have
427 # the form hg+http://... or hg+https://...
428 # Note that for this to work the "hg" command line command must be available
429 # in PATH and so must python (required to run the hg-fast-export.py script).
430 # Note that if the PYTHON environment variable is set that will be used instead
431 # of just plain "python" to run the hg-fast-export.py script (which needs to
432 # be able to import from mercurial). Currently the hg-fast-export.py script
433 # used for this feature is likely incompatible with python 3 or later.
434 # Repositories created via this facility may need to be "reset" if the upstream
435 # hg repository moves the tip revision backwards and creates "unnamed heads".
436 # This support depends on items updated separately from Git and which may easily
437 # become out-of-date or incompatible (e.g. new python version).
438 # NOTE: If this is set to 0, the girocco-hg-fast-export.git
439 # submodule need not be initialized or checked out.
440 # RECOMMENDED VALUE: 0 (unless you have a need to mirror hg repos)
441 our $mirror_hg = 0;
445 ## -----
446 ## Paths
447 ## -----
450 # Path where the main chunk of Girocco files will be installed
451 # This will get COMPLETELY OVERWRITTEN by each make install!!!
452 # MUST be an absolute path
453 our $basedir = '/home/repo/repomgr';
455 # Path where the automatically generated non-user certificates will be stored
456 # (The per-user certificates are always stored in $chroot/etc/sshcerts/)
457 # This is preserved by each make install and MUST NOT be under $basedir!
458 # The secrets used to generate TimedTokens are also stored in here.
459 # MUST be an absolute path
460 our $certsdir = '/home/repo/certs';
462 # The repository collection
463 # "$reporoot/_recyclebin" will also be created for use by toolbox/trash-project.pl
464 # MUST be an absolute path
465 our $reporoot = "/srv/git";
467 # The repository collection's location within the chroot jail
468 # Normally $reporoot will be bind mounted onto $chroot/$jailreporoot
469 # Should NOT start with '/'
470 our $jailreporoot = "srv/git";
472 # The chroot for ssh pushing; location for project database and other run-time
473 # data even in non-chroot setups
474 # MUST be an absolute path
475 our $chroot = "/home/repo/j";
477 # An installation that will never run a chrooted sshd should set this
478 # to a true value (e.g. 1) to guarantee that jailsetup for a chrooted
479 # sshd never takes place no matter what user runs `make install`.
480 # Note that the "jailsetup.sh" script will still run to do the database
481 # setup that's stored in $chroot regardless of this setting, it will just
482 # always run in "dbonly" mode when this setting is true.
483 our $disable_jailsetup = 0;
485 # The gitweb files web directory (corresponds to $gitwebfiles)
486 # Note that it is safe to place this under $basedir since it's set up after
487 # $basedir is completely replaced during install time. Be WARNED, however,
488 # that normally the install process only adds/replaces things in $webroot,
489 # but if $webroot is under $basedir then it will be completely removed and
490 # rebuilt each time "make install" is run. This will make gitweb/git-browser
491 # web services very briefly unavailable while this is happening.
492 # MUST be an absolute path
493 our $webroot = "/home/repo/www";
495 # The CGI-enabled web directory (corresponds to $gitweburl and $webadmurl)
496 # This will not be web-accessible except that if any aliases point to
497 # a *.cgi file in here it will be allowed to run as a cgi-script.
498 # Note that it is safe to place this under $basedir since it's set up after
499 # $basedir is completely replaced during install time. Be WARNED, however,
500 # that normally the install process only adds/replaces things in $cgiroot,
501 # but if $cgiroot is under $basedir then it will be completely removed and
502 # rebuilt each time "make install" is run. This will make gitweb/git-browser
503 # web services very briefly unavailable while this is happening.
504 # MUST be an absolute path
505 our $cgiroot = "/home/repo/cgibin";
507 # A web-accessible symlink to $reporoot (corresponds to $httppullurl, can be undef)
508 # If using the sample apache.conf (with paths suitably updated) this is not required
509 # to serve either smart or non-smart HTTP repositories to the Git client
510 # MUST be an absolute path if not undef
511 our $webreporoot = "/home/repo/www/r";
513 # The location to store the project list cache, gitweb project list and gitweb
514 # cache file. Normally this should not be changed. Note that it must be in
515 # a directory that is writable by $mirror_user and $cgi_user (just in case the
516 # cache file is missing). The directory should have its group set to $owning_group.
517 # Again, this setting should not normally need to be changed.
518 # MUST be an absolute path
519 our $projlist_cache_dir = "$chroot/etc";
523 ## ----------------------------------------------------
524 ## Certificates (only used if $httpspushurl is defined)
525 ## ----------------------------------------------------
528 # path to root certificate (undef to use automatic root cert)
529 # this certificate is made available for easy download and should be whatever
530 # the root certificate is for the https certificate being used by the web server
531 our $rootcert = undef;
533 # The certificate to sign user push client authentication certificates with (undef for auto)
534 # The automatically generated certificate should always be fine
535 our $clientcert = undef;
537 # The private key for $clientcert (undef for auto)
538 # The automatically generated key should always be fine
539 our $clientkey = undef;
541 # The client certificate chain suffix (a pemseq file to append to user client certs) (undef for auto)
542 # The automatically generated chain should always be fine
543 # This suffix will also be appended to the $mobusercert before making it available for download
544 our $clientcertsuffix = undef;
546 # The mob user certificate signed by $clientcert (undef for auto)
547 # The automatically generated certificate should always be fine
548 # Not used unless $mob is set to 'mob'
549 # The $clientcertsuffix will be appended before making $mobusercert available for download
550 our $mobusercert = undef;
552 # The private key for $mobusercert (undef for auto)
553 # The automatically generated key should always be fine
554 # Not used unless $mob is set to 'mob'
555 our $mobuserkey = undef;
557 # Server alt names to embed in the auto-generated girocco_www_crt.pem certificate.
558 # The common name (CN) in the server certificate is the host name from $httpspushurl.
559 # By default no server alt names are embedded (not even the host from $httpspushurl).
560 # If the web server configuration is not using this auto-generated server certificate
561 # then the values set here will have no impact and this setting can be ignored.
562 # To embed server alternative names, list each (separated by spaces). The names
563 # may be DNS names, IPv4 addresses or IPv6 addresses (NO surrounding '[' ']' please).
564 # If ANY DNS names are included here be sure to also include the host name from
565 # the $httpspushurl or else standards-conforming clients will fail with a host name
566 # mismatch error when they attempt to verify the connection.
567 #our $wwwcertaltnames = 'example.com www.example.com git.example.com 127.0.0.1 ::1';
568 our $wwwcertaltnames = undef;
570 # The key length for automatically generated RSA private keys (in bits).
571 # These keys are then used to create the automatically generated certificates.
572 # If undef or set to a value less than 2048, then 2048 will be used.
573 # Set to 3072 to generate more secure keys/certificates. Set to 4096 (or higher) for
574 # even greater security. Be warned that setting to a non-multiple of 8 and/or greater
575 # than 4096 could negatively impact compatibility with some clients.
576 # The values 2048, 3072 and 4096 are expected to be compatible with all clients.
577 # Note that OpenSSL has no problem with > 4096 or non-multiple of 8 lengths.
578 # See also the $min_key_length setting above to restrict user key sizes.
579 # This value is also used when generating the ssh_host_rsa_key for the chroot jail sshd.
580 # RECOMMENDED VALUE: 3072
581 our $rsakeylength = undef;
585 ## -------------
586 ## URL addresses
587 ## -------------
590 # URL of the gitweb.cgi script (must be in pathinfo mode). If the sample
591 # apache.conf configuration is used, the trailing "/w" is optional.
592 our $gitweburl = "https://repo.or.cz";
594 # URL of the extra gitweb files (CSS, .js files, images, ...)
595 our $gitwebfiles = "https://repo.or.cz";
597 # URL of the Girocco CGI web admin interface (Girocco cgi/ subdirectory)
598 # e.g. reguser.cgi, edituser.cgi, regproj.cgi, editproj.cgi etc.
599 our $webadmurl = "https://repo.or.cz";
601 # URL of the Girocco CGI bundles information generator (Girocco cgi/bundles.cgi)
602 # If the sample apache.conf configuration is used, the trailing "/b" is optional.
603 # This is different from $httpbundleurl. This URL lists all available bundles
604 # for a project and returns that as an HTML page.
605 our $bundlesurl = "https://repo.or.cz";
607 # URL of the Girocco CGI html templater (Girocco cgi/html.cgi)
608 # If mod_rewrite is enabled and the sample apache.conf configuration is used,
609 # the trailing "/h" is optional when the template file name ends in ".html"
610 # (which all the provided ones do).
611 our $htmlurl = "https://repo.or.cz";
613 # HTTP URL of the repository collection (undef if N/A)
614 # If the sample apache.conf configuration is used, the trailing "/r" is optional.
615 our $httppullurl = "https://repo.or.cz";
617 # HTTP URL of the repository collection when fetching a bundle (undef if N/A)
618 # Normally this will be the same as $httppullurl, but note that the bundle
619 # fetching logic is located in git-http-backend-verify so whatever URL is
620 # given here MUST end up running the git-http-backend-verify script!
621 # For example, if we're fetching the 'clone.bundle' for the 'girocco.git'
622 # repository, the final URL will be "$httpbundleurl/girocco.git/clone.bundle"
623 # If the sample apache.conf configuration is used, the trailing "/r" is optional.
624 # This is different from $bundlesurl. This URL fetches a single Git-format
625 # .bundle file that is only usable with the 'git bundle' command.
626 our $httpbundleurl = "https://repo.or.cz";
628 # HTTPS push URL of the repository collection (undef if N/A)
629 # If this is defined, the openssl command must be available
630 # The sample apache.conf configuration requires mod_ssl, mod_authn_anon and
631 # mod_rewrite be enabled to support https push operations.
632 # Normally this should be set to $httppullurl with http: replaced with https:
633 # If the sample apache.conf configuration is used, the trailing "/r" is optional.
634 our $httpspushurl = "https://repo.or.cz";
636 # Git URL of the repository collection (undef if N/A)
637 # (You need to set up git-daemon on your system, and Girocco will not
638 # do this particular thing for you.)
639 our $gitpullurl = "git://repo.or.cz";
641 # Pushy SSH URL of the repository collection (undef if N/A)
642 # Note that the "/$jailreporoot" portion is optional and will be automatically
643 # added if appropriate when omitted by the client so this URL can typically
644 # be made the same as $gitpullurl with git: replaced with ssh:
645 our $pushurl = "ssh://repo.or.cz";
647 # URL of gitweb of this Girocco instance (set to undef if you're not nice
648 # to the community)
649 our $giroccourl = "$Girocco::Config::gitweburl/girocco.git";
653 ## -------------------
654 ## Web server controls
655 ## -------------------
658 # If true then non-smart HTTP access will be disabled
659 # There's normally no reason to leave non-smart HTTP access enabled
660 # since downloadable bundles are provided. However, in case the
661 # non-smart HTTP access is needed for some reason, this can be set to undef or 0.
662 # This affects access via http: AND https: and processing of apache.conf.in.
663 # Note that this setting does not affect gitweb, ssh: or git: URL access in any way.
664 # RECOMMENDED VALUE: 1
665 our $SmartHTTPOnly = 1;
667 # If true, the https <VirtualHost ...> section in apache.conf.in will be
668 # automatically enabled when it's converted to apache.conf by the conversion
669 # script. Do NOT enable this unless the required Apache modules are present
670 # and loaded (mod_ssl, mod_rewrite, mod_authn_anon) AND $httpspushurl is
671 # defined above otherwise the server will fail to start (with various errors)
672 # when the resulting apache.conf is used.
673 our $TLSHost = 1;
675 # If true, the information about configuring a Git client to trust
676 # a Girocco-generated TLS root will be suppressed presuming that some other
677 # means (such as LetsEncrypt.org) has been used to generate a TLS web
678 # certificate signed by a pre-trusted root. This does NOT affect the
679 # information on how to configure https push certificates as those are still
680 # required in order to push over https regardless of what web server certificate
681 # may be in use.
682 # RECOMMENDED VALUE: 0 (for girocco-generated root & server certificates)
683 # RECOMMENDED VALUE: 1 (for LetsEncrypt etc. generated server certificates)
684 our $pretrustedroot = 1;
688 ## ------------------------
689 ## Lighttpd server controls
690 ## ------------------------
693 # Of course, the lighttp.conf.in file can be edited directly, but these
694 # settings allow it to contain conditional sections that show how the
695 # various configurations can be achieved.
697 # If lighttpd will not be used, these settings can be ignored.
699 # N.B. The lighttpd.conf.in file MUST be edited if lighttpd should listen
700 # on ports other than 80 (http) and 443 (https)
702 # If true, the lighttpd.conf.in file will be processed into a lighttpd.conf
703 # file that tries very hard to be a complete, standalone configuration file for
704 # a lighttpd server. In other words, it will set things in the lighttpd global
705 # configuration that would not be needed (or safe) if it were being included
706 # to provide only a "virtual host" configuration.
707 # RECOMMENDED VALUE: 0 (for use as an included "virtual host" configuration)
708 # RECOMMENDED VALUE: 1 (for use as a standalone configuration file)
709 our $lighttpd_standalone = 0;
711 # Only applicable if $lighttpd_standlone has been set to a true value,
712 # otherwise this setting has no effect.
713 # If true, the parts of the standalone lighttpd configuration that would
714 # require privileges (e.g. log file, pid file, etc.) will be redirected to
715 # "unprivileged" locations and neither the username nor groupname settings
716 # will be set. Otherwise "standard" locations and so forth will be used
717 # (such as /var/run, /var/log etc.). Note that this will NOT change the
718 # ports lighttpd attempts to listen on -- edit lighttpd.conf.in to do that
719 # and note that the port numbers will likely need to be changed in order to
720 # run in unprivileged mode (e.g. to 8080 and 8443).
721 # RECOMMENDED_VALUE: 0 (if running privileged as $lighttpd_standalone)
722 # RECOMMENDED_VALUE: 1 (if running unprivileged as $lighttpd_standalone)
723 our $lighttpd_unprivileged = 0;
725 # If true, listen only to the loopback interface (i.e. 127.0.0.1/::1)
726 # Otherwise allow incoming connections from anywhere
727 # RECOMMENDED_VALUE: 0 (for an externally accessible girocco web interface)
728 # RECOMMENDED_VALUE: 1 (for a localhost-accessible-only girocco web interface)
729 our $lighttpd_loopback_only = 0;
731 # This will be ignored unless $lighttpd_standalone is a false value
732 # See the copious comments in lighttpd.conf.in (search for TLSHost)
733 # RECOMMENDED_VALUE: 0 (if !$lighttpd_standalone but no other TLS hosts)
734 # RECOMMENDED_VALUE: 1 (if !$lighttpd_standalone and other TLS hosts are present)
735 our $lighttpd_tls_virtualhost = 1;
739 ## ------------------------
740 ## Some templating settings
741 ## ------------------------
744 # Legal warning (on reguser and regproj pages)
745 our $legalese = <<EOT;
746 <p>By submitting this form, you are confirming that you will mirror or push
747 only free software and redistributing it will not violate any law
748 of Czech Republic, Germany or the European Union in general.
749 <sup class="sup"><span><a href="/about.html">(more details)</a></span></sup>
750 </p>
753 # Pre-configured mirror sources (set to undef for none)
754 # Arrayref of name - record pairs, the record has these attributes:
755 # label: The label of this source
756 # url: The template URL; %1, %2, ... will be substituted for inputs
757 # desc: Optional VERY short description
758 # link: Optional URL to make the desc point at
759 # inputs: Arrayref of hashref input records:
760 # label: Label of input record
761 # suffix: Optional suffix
762 # If the inputs arrayref is undef, single URL input is shown,
763 # pre-filled with url (probably empty string).
764 our $mirror_sources = [
766 label => 'Anywhere',
767 url => '',
768 desc => 'Any HTTP/Git/rsync pull URL - bring it on!',
769 inputs => undef
772 label => 'GitHub',
773 url => 'https://github.com/%1/%2.git',
774 desc => 'GitHub Social Code Hosting',
775 link => 'https://github.com/',
776 inputs => [ { label => 'User:' }, { label => 'Project:', suffix => '.git' } ]
779 label => 'GitLab',
780 url => 'https://gitlab.com/%1/%2.git',
781 desc => 'Engulfed the Green and Orange Boxes',
782 link => 'https://gitlab.com/',
783 inputs => [ { label => 'User:' }, { label => 'Project:', suffix => '.git' } ]
786 label => 'Bitbucket',
787 url => 'https://bitbucket.org/%1/%2.git',
788 desc => 'Embraced the best DVCS',
789 link => 'https://bitbucket.org/',
790 inputs => [ { label => 'User:' }, { label => 'Project:', suffix => '.git' } ]
794 # You can customize the gitweb interface widely by editing
795 # gitweb/gitweb_config.perl
799 ## -------------------
800 ## Permission settings
801 ## -------------------
804 # Girocco needs some way to manipulate write permissions to various parts of
805 # all repositories; this concerns three entities:
806 # - www-data: the web interface needs to be able to rewrite few files within
807 # the repository
808 # - repo: a user designated for cronjobs; handles mirroring and repacking;
809 # this one is optional if not $mirror
810 # - others: the designated users that are supposed to be able to push; they
811 # may have account either within chroot, or outside of it
813 # There are several ways how to use Girocco based on a combination of the
814 # following settings.
816 # (Non-chroot) UNIX user the CGI scripts run on; note that if some non-related
817 # untrusted CGI scripts run on this account too, that can be a big security
818 # problem and you'll probably need to set up suexec (poor you).
819 # This must always be set.
820 our $cgi_user = 'www-data';
822 # (Non-chroot) UNIX user performing mirroring jobs; this is the user who
823 # should run all the daemons and cronjobs and
824 # the user who should be running make install (if not root).
825 # This must always be set.
826 our $mirror_user = 'repo';
828 # (Non-chroot) UNIX group owning the repositories by default; it owns whole
829 # mirror repositories and at least web-writable metadata of push repositories.
830 # If you undefine this, all the data will become WORLD-WRITABLE.
831 # Both $cgi_user and $mirror_user should be members of this group!
832 our $owning_group = 'repo';
834 # Whether to use chroot jail for pushing; this must be always the same
835 # as $manage_users.
836 # TODO: Gitosis support for $manage_users and not $chrooted?
837 our $chrooted = $manage_users;
839 # How to control permissions of push-writable data in push repositories:
840 # * 'Group' for the traditional model: The $chroot/etc/group project database
841 # file is used as the UNIX group(5) file; the directories have gid appropriate
842 # for the particular repository and are group-writable. This works only if
843 # $chrooted so that users are put in the proper groups on login when using
844 # SSH push. Smart HTTPS push does not require a chroot to work -- simply
845 # run "make install" as the non-root $mirror_user user, but leave
846 # $manage_users and $chrooted enabled.
847 # * 'ACL' for a model based on POSIX ACL: The directories are coupled with ACLs
848 # listing the users with push permissions. This works for both chroot and
849 # non-chroot setups, however it requires ACL support within the filesystem.
850 # This option is BASICALLY UNTESTED, too. And UNIMPLEMENTED. :-)
851 # * 'Hooks' for a relaxed model: The directories are world-writable and push
852 # permission control is purely hook-driven. This is INSECURE and works only
853 # when you trust all your users; on the other hand, the attack vectors are
854 # mostly just DoS or fully-traceable tinkering.
855 our $permission_control = 'Group';
857 # Path to alternate screen multiuser acl file (see screen/README, undef for none)
858 our $screen_acl_file = undef;
860 # Reserved project name and user name suffixes.
862 # Note that with personal mob branches enabled, a user name can end up being a
863 # file name after having a 'mob.' prefix added or a directory name after having
864 # a 'mob_' prefix added. If there is ANY possibility that a file with a
865 # .suffix name may need to be served by the web server, lc(suffix) SHOULD be in
866 # this hash! Pre-existing project names or user names with a suffix in this
867 # table can continue to be used, but no new projects or users can be created
868 # that have a suffix (case-insensitive) listed here.
869 our %reserved_suffixes = (
870 # Entries must be lowercase WITHOUT a leading '.'
871 bmp => 1,
872 bz2 => 1,
873 cer => 1,
874 cgi => 1,
875 crt => 1,
876 css => 1,
877 dmg => 1,
878 fcgi => 1,
879 gif => 1,
880 gz => 1,
881 htm => 1,
882 html => 1,
883 ico => 1,
884 jp2 => 1,
885 jpeg => 1,
886 jpg => 1,
887 jpg2 => 1,
888 js => 1,
889 mp3 => 1,
890 mp4 => 1,
891 pdf => 1,
892 pem => 1,
893 php => 1,
894 png => 1,
895 sig => 1,
896 shtml => 1,
897 svg => 1,
898 svgz => 1,
899 tar => 1,
900 text => 1,
901 tgz => 1,
902 tif => 1,
903 tiff => 1,
904 txt => 1,
905 xbm => 1,
906 xht => 1,
907 xhtml => 1,
908 xz => 1,
909 zip => 1,
914 ## -------------------
915 ## Size limit settings
916 ## -------------------
919 # If this is set to a non-zero value, whenever a receive-pack, mirror fetch
920 # or clone runs, git will be run with a UL_SETFSIZE value set to this value.
922 # The limit is not active while performing garbage collection or other
923 # maintenance tasks.
925 # If git attempts to create a file larger than this limit, it will receive a
926 # SIGXFSZ signal which will cause git to terminate.
928 # Note that if the actual value of UL_GETFSIZE at runtime is already less than
929 # the value set here, then that value will be silently used instead.
931 # The value represents the maximum file size allowed in units of 512-byte blocks
932 # and must be <= 2147483647 (which represents a size of 1 TiB less 512 bytes).
934 our $max_file_size512 = 8388608; # 4 GiB
936 # If this is set to a non-zero value, after an otherwise successful clone,
937 # if the repository contains more than this many objects, the clone will
938 # be considered to fail.
940 # This setting only takes effect after an otherwise successful clone which
941 # means that if $max_file_size512 is non-zero that the resulting clone did
942 # not exceed the file size limit if it fails this check.
944 our $max_clone_objects = 9999999;
948 ## -------------------------
949 ## sendmail.pl configuration
950 ## -------------------------
953 # Full information on available sendmail.pl settings can be found by running
954 # ../bin/sendmail.pl -v -h
956 # These settings will only be used if $sendmail_bin is set to 'sendmail.pl'
958 # sendmail.pl host name
959 #$ENV{'SENDMAIL_PL_HOST'} = 'localhost'; # localhost is the default
961 # sendmail.pl port name
962 #$ENV{'SENDMAIL_PL_PORT'} = '25'; # port 25 is the default
964 # sendmail.pl nc executable
965 #$ENV{'SENDMAIL_PL_NCBIN'} = "$chroot/bin/nc.openbsd"; # default is nc found in $PATH
967 # sendmail.pl nc options
968 # multiple options may be included, e.g. '-4 -X connect -x 192.168.100.10:8080'
969 #$ENV{'SENDMAIL_PL_NCOPT'} = '-4'; # force IPv4, default is to allow IPv4 & IPv6
973 ## -------------------------
974 ## Obscure Tuneable Features
975 ## -------------------------
978 # Throttle classes configured here override the defaults for them that
979 # are located in taskd/taskd.pl. See comments in that file for more info.
980 our @throttle_classes = ();
982 # Any tag names listed here will be allowed even if they would otherwise not be.
983 # Note that @allowed_tags takes precedence over @blocked_tags.
984 our @allowed_tags = (qw( ));
986 # Any tag names listed here will be disallowed in addition to the standard
987 # list of nonsense words etc. that are blocked as tags.
988 our @blocked_tags = (qw( ));
990 # Case folding tags
991 # If this setting is true, then tags that differ only in case will always use
992 # the same-cased version. If this setting is enabled and the tag is present in
993 # @allowed_tags (or the embedded white list in Util.pm) then the case of the
994 # tag will match the white list entry otherwise it will be all lowercased.
995 # If this setting is disabled (false) tags are used with their case left as-is.
996 # RECOMMENDED VALUE: 1 (true)
997 our $foldtags = 1;
999 # If there are no more than this many objects, then all deltas will be
1000 # recomputed when gc takes place. Note that this does not affect any
1001 # fast-import created packs as they ALWAYS have their deltas recomputed.
1002 # Also when combining small packs, if the total object count in the packs
1003 # to be combined is no more than this then the new, combined pack will have
1004 # its deltas recomputed during the combine operation.
1005 # Leave undef to use the default (which should generally be fine).
1006 # Lowering this from the default can increase disk use.
1007 # Values less than 1000 * number of CPU cores will be silently ignored.
1008 # The "girocco.redelta" config item can be used to modify this behavior on
1009 # a per-repository basis. See the description of it in gc.sh.
1010 our $new_delta_threshold = undef;
1012 # This setting is irrelevant unless foreign vcs mirrors that use git fast-import
1013 # are enabled (e.g. $mirror_darcs, $mirror_bzr or $mirror_hg -- $mirror_svn does
1014 # NOT use git fast-import and is not affected by this setting).
1015 # The packs generated by git fast-import are very poor quality. For this reason
1016 # they ALWAYS have their deltas recomputed at some point. Normally this is
1017 # delayed until the next full (or mini) gc takes place. For this reason a full
1018 # gc is always scheduled immediately after a fresh mirror clone completes.
1019 # However, in the case of normal mirror updates, several git fast-import created
1020 # packs may exist as a result of changes fetched during the normal mirror update
1021 # process. These packs will persist (with their git fast-import poor quality)
1022 # until the next full (or mini) gc triggers. The bad deltas in these update
1023 # packs could be sent down to clients who fetch updates before the next gc
1024 # triggers. To reduce (i.e. practically eliminate) the likelihood of this
1025 # occurring, this setting can be changed to a false (0 or undef) value in which
1026 # case after each mirror update of a git fast-import mirror, any newly created
1027 # git fast-import packs (as a result of the mirror update running) will have
1028 # their deltas recomputed shortly thereafter instead of waiting for the next gc.
1029 # Recomputing deltas immediately (almost immediately) will result in an extra
1030 # redeltification step (with associated CPU cost) that would otherwise not
1031 # occur and, in some cases (mainly large repositories), could ultimately result
1032 # in slightly less efficient deltas being retained.
1033 # RECOMMENDED VALUE: 1
1034 our $delay_gfi_redelta = 1;
1036 # If this is set to a true value, then core.packedGitWindowSize will be set
1037 # to 1 MiB (the same as if Git was compiled with NO_MMAP set). If this is NOT
1038 # set, core.packedGitWindowSize will be set to 32 MiB (even on 64-bit) to avoid
1039 # memory blowout. If your Git was built with NO_MMAP set and will not work
1040 # without NO_MMAP set, you MUST set this to a true value!
1041 our $git_no_mmap = undef;
1043 # If set to a true value, the "X-Girocco: $gitweburl" header included in all
1044 # Girocco-generated emails will be suppressed.
1045 our $suppress_x_girocco = undef;
1047 # Number of days to keep reflogs around
1048 # May be set to a value between 1 and 30 (inclusive)
1049 # The default of one day should normally suffice unless there's a need to
1050 # support a "Where's the undo? WHERE IS THE UNDO?!!!" option ;)
1051 our $reflogs_lifetime = 7;
1053 # The pack.window size to use with git upload-pack
1054 # When Git is creating a pack to send down to a client, if it needs to send
1055 # down objects that are deltas against objects it is not sending and that it
1056 # does not know the client already has, it must undelta and recompute deltas
1057 # for those objects. This is the remote's "Compressing objects" phase the
1058 # client sees during a fetch or clone. If this value is unset, the normal
1059 # Git default of 10 will be used for the window size during these operations.
1060 # This value may be set to a number between 2 and 50 inclusive to change the
1061 # window size during upload pack operations. A window size of 2 provides the
1062 # fastest response at the expense of less efficient deltas for the objects
1063 # being recompressed (meaning more data to send to the client). A window
1064 # size of 5 typically reduces the compression time by almost half and is
1065 # usually nearly as fast as a window size of 2 while providing better deltas.
1066 # A window size of 50 will increase the time spent in the "Compressing objects"
1067 # phase by as much as 5 times but will produce deltas similar to those that
1068 # Girocco generates when it performs garbage collection.
1069 # RECOMMENDED VALUE: undef or 5
1070 our $upload_pack_window = 5;
1072 # If this is true then remote fetching of refs/stash and refs/tgstash will
1073 # be allowed. Git does not allow single-level ref names to be pushed so the
1074 # only way they could get in there is if a linked working tree (or, gasp, a
1075 # non-bare Girocco repository) created them or they arrived via a non-clean
1076 # mirror fetch. The client almost certainly does not want to see them.
1077 # Unless this config item is true they will also be left out of the bundle too.
1078 # Since both stash and tgstash are used with their ref logs and there's no way
1079 # for a remote to fetch ref logs, the "log --walk-reflogs" feature could not be
1080 # used with them by a remote that fetched them anyway.
1082 # NOTE: The reason this doesn't just control all single-level refs is that the
1083 # "hideRefs" configuration mechanism isn't flexible enough to hide all
1084 # single-level refs without knowing their names. In addition, it hides the
1085 # entire refs hierarchy so refs/stash/foo will also be hidden along with
1086 # refs/stash, but Git doesn't actually support ref names that introduce a
1087 # directory/file confict (aka D/F conflict) and "refs/stash" represents an
1088 # official Git ref name therefore any refs/stash/... names really aren't
1089 # allowed in the first place so it's no problem if they're incidentally hidden
1090 # along with refs/stash itself.
1092 # NOTE: Git 1.8.2 or later is required to actually hide the refs from fetchers
1093 # over the "git:" protocol and Git 2.3.5 or later is required to properly hide
1094 # them over the smart "http:" protocol (Girocco will not attempt to "hide" them
1095 # on a smart HTTP fetch if Git is < 2.3.5 to avoid Git bugs.) They will never
1096 # be hidden via the non-smart HTTP fetch or any other non-smart protocols that
1097 # also make use of the $gitdir/info/refs file as they are not excluded from it.
1098 # Nor will they be hidden when accessed via any non-Girocco mechanism.
1099 # They will, however, always be excluded from the primary (aka .bitmap) pack
1100 # and bundle no matter what version of Git is used unless this is set to a
1101 # true value. It's only the server's Git version that matters when hiding refs.
1103 # RECOMMENDED VALUE: undef or 0
1104 our $fetch_stash_refs = undef;
1106 # When set to a true value, Girocco will attempt to pick up ref changes made
1107 # outside of Girocco itself and process them using the usual Girocco
1108 # notification mechanism. Git lacks any "post-ref-change" hook capability that
1109 # could facilitate this prior to the introduction of the reference-transation
1110 # hook in Git v2.28.0. This feature is primarily intended to detect running
1111 # of "git fetch" in linked working trees of a Girocco repository. In many
1112 # cases after running a command Git runs "git gc --auto". With the correct
1113 # encouragement we can always induce Git to run our pre-auto-gc hook at that
1114 # time. "git fetch" invokes "git gc --auto" after the fetch. Girocco needs
1115 # to do additional maintenance to make this work properly so do not enable this
1116 # unless it's really needed. Additionally, there are a number of commands
1117 # (such as "git commit") that do not invoke "git gc --auto". Even with this
1118 # enabled, additional hooks for post-rewrite and post-checkout
1119 # would really be needed to catch more things and even then there are some
1120 # Git commands that would never be caught ("git filter-branch",
1121 # "git update-ref", "git reset", etc.) so this is hardly a complete solution.
1122 # But it WILL catch "git fetch" changes although the hashes it uses for the
1123 # "old" ref values may not be all that recent, the new ref values will be.
1124 # When this is false, the hack is completely disabled.
1125 # When this is true, the hack is enabled by default for all repositories,
1126 # but can be controlled on an individual repository basis by setting the
1127 # girocco.autogchack value explicitly to true (enable) or false (disable).
1128 # If this is set to the special value "mirror" then it will behave as true
1129 # for mirrors and false for non-mirrors thereby completely eliminating any
1130 # overhead for push projects but detecting external "git fetch"s for mirrors.
1131 # If this is enabled for a project, any third party script/tool can trigger
1132 # the Girocco ref notification mechanism simply by making a ref change and
1133 # then running "git gc --auto --quiet" on the project. In a capitulation to
1134 # use of linked working trees, Girocco installs a post-commit hook that will
1135 # trigger these notifications as well when this is enabled.
1136 our $autogchack = 0;
1138 # When set to a true value the initial setting for core.hooksPath will point
1139 # to the repository's own hooks directory instead of $reporoot/_global/hooks.
1140 # Due to the unfortunate implementation of core.hooksPath, Girocco must always
1141 # ensure the value gets set in each repository's config file. Normally it
1142 # just sets it to $reporoot/_global/hooks and that's that. However, the
1143 # update-all-config script will also tolerate it pointing at the repository's
1144 # own hooks directory -- Girocco maintains symbolic links in there to the
1145 # global hooks to make sure they get run when using older versions of Git;
1146 # therefore that setting is basically equivalent. The difference is that
1147 # repository-specific hooks can be added when hooksPath is pointing at the
1148 # repository's hooks directory but not when it's pointing at _global/hooks.
1149 # A repository's setting can be changed manually (and it will stick), but
1150 # sometimes it may be desirable to always just default to pointing at the
1151 # repository's own hooks directory from the start. Perhaps linked working
1152 # trees will be in use and software that needs to set repository-specific hooks
1153 # will be in use. If $autogchack has been set to true this may very likely be
1154 # the case.
1155 our $localhooks = 0;
1157 # If this is set to a true value changes to single-level refs (e.g. refs/stash)
1158 # will be passed through to the notification machinery.
1159 # Usually this is NOT wanted, especially when linked working trees are being
1160 # used with the repository.
1161 # However, in the unlikely event that changes to such ref names should NOT be
1162 # ignored, this value may be set to any true value.
1163 # RECOMMENDED VALUE: 0
1164 our $notify_single_level = 0;
1166 # If this is set to a non-empty value it will become the default value for
1167 # all repositories' girocco.notifyHook value.
1168 # Whenever taskd.pl receives a batch of ref changes for processing, it first
1169 # sends them off to any configured "girocco.notifyHook" (same semantics as
1170 # a post-receive hook except it also gets four command-line arguments like
1171 # so: cat ref-changes | notifyhook $projname $user $linecount $contextlinecount
1172 # There is no default notify hook, but each repository may set its own by
1173 # setting the `girocco.notifyHook` config value which will be eval'd by the
1174 # shell (like $GIT_EDITOR is) with the current directory set to the
1175 # repository's git-dir and the changes on standard input.
1176 # Note that normal notification processing does not take place until after
1177 # this command (if it's not null) gets run (regardless of its result code).
1178 our $default_notifyhook = undef;
1180 # UNIX group owning the repositories' htmlcache subdirectory
1181 # If not defined defaults to $owning_group
1182 # If gitweb access is provided but only on a read-only basis, then setting
1183 # this to a group to which Both $cgi_user and $mirror_user belong will still
1184 # allow summary page caching.
1185 # $mirror_user should always belong to this group
1186 our $htmlcache_owning_group = undef;
1188 # UNIX group owning the repositories' ctags subdirectory
1189 # If not defined defaults to $owning_group
1190 # If gitweb access is provided but only on a read-only basis, then setting
1191 # this to a group to which Both $cgi_user and $mirror_user belong will still
1192 # allow tags to be added to the repository in gitweb (provided that feature
1193 # is enabled in gitweb/gitweb_config.perl).
1194 # $mirror_user should always belong to this group
1195 our $ctags_owning_group = undef;
1197 # When using pack bitmaps and computing data to send to clients over a fetch,
1198 # having pack.writeBitmapHashCache set to true produces better deltas (thereby
1199 # potentially reducing the amount of data that needs to be sent). However, old
1200 # JGit does not understand this extra data, so if JGit needs to use the bitmaps
1201 # generated when Girocco runs Git, this setting needs to be set to a true value
1202 # so that the hash cache is excluded when Git generates the bitmaps thereby
1203 # making them compatible with JGit prior to JGit v3.5.0 released in late 2014.
1204 # Note that changes to this setting will not take effect until the next time
1205 # gc is scheduled to run on a project and then only if gc actually takes place.
1206 # Use the $basedir/toolbox/make-all-gc-eligible.sh script to force all projects
1207 # to actually do a gc the next time they are scheduled for one.
1208 # (Note that Git version 2.22.0, released 2019-06-07, enabled the HashCache by
1209 # default since it post dates the JGit v3.5.0 release by approximately 5 years
1210 # [that corresponds to a setting of undef or 0 here].)
1211 # RECOMMENDED VALUE: undef or 0
1212 our $jgit_compatible_bitmaps = 0;
1214 # Set the default value of receive.maxInputSize
1215 # This is only effective for receives (aka an incoming push) and causes the
1216 # push to abort if the incoming pack (which is generally thin and does not
1217 # have any index) exceeds this many bytes in size (a 'k', 'm' or 'g' suffix
1218 # may be used on the value). If undef or set to 0 there is no limit. This
1219 # limit is only effective when Girocco is running Git v2.11.0 or later.
1220 our $max_receive_size = undef;
1222 # Suppress git: and ssh: log messages
1223 # Access via http: and/or https: provides logging of the project being
1224 # cloned/fetched/pushed to. There is normally no such logging for access
1225 # via ssh: and/or git: protocols. However, Girocco intercepts those
1226 # accesses to perform sanity and permision checks and also logs the request
1227 # to the system log at that time. By setting this value to any true
1228 # value, that logging of git: and ssh: git activity will be suppressed.
1229 # RECOMMENDED VALUE: 0
1230 our $suppress_git_ssh_logging = 0;
1232 # Select the sshd to be installed into the chroot
1233 # If set this MUST be an absolute path
1234 # Ignored unless a chroot is actually being created
1235 # Leaving this undef will find sshd in "standard" system locations and
1236 # is the recommended value. Only set this if you need to override the
1237 # "standard" sshd for some reason.
1238 # RECOMMENDED VALUE: undef
1239 our $sshd_bin = undef;
1241 # Allow any git-daemon host
1242 # If set to a true value, then the extra "host=" parameter received
1243 # by git-daemon (if present) will be ignored. If the $gitpullurl value
1244 # is undefined or does not start with "git://<hostname>" then any host
1245 # will be allowed by default.
1246 # RECOMMENDED VALUE: undef
1247 our $git_daemon_any_host = undef;
1249 # Restrict git-daemon host names
1250 # If $git_daemon_any_host is any false value (or undef) AND this
1251 # value is set to a space-separated list of host names WITHOUT any
1252 # port numbers, then the "host=" parameter MUST be provided by
1253 # a git daemon client AND it must match one of the names in this
1254 # all-lowercase, space-separated list. Note that IPv6 literal
1255 # addresses MUST NOT be enclosed in brackets. If this value is
1256 # empty or undef it will default to the hostname extracted from
1257 # $gitpullurl if that is set plus several variants of localhost.
1258 # Note, do NOT terminate DNS names with a final "." or they will
1259 # never match!
1260 # EXAMPLE:
1261 # our $git_daemon_host_list = "foo.example.com localhost ::1 127.0.0.1";
1262 our $git_daemon_host_list = undef;
1264 # Shared repository setting
1265 # This is the value to set the core.sharedRepository value to in
1266 # each repository. If this is changed, running update-all-config
1267 # will update each project to the new value.
1268 # By default (if this is left undef) it will be set to 'all' (which
1269 # corresponds to a core.sharedRepository value of '2').
1270 # This makes it so repositories are group-writable and world readable.
1271 # If set to the more restrictive 'group' (which corresponds to a
1272 # core.sharedRepository value of '1'), repositories will still typically
1273 # be world readable as umask 002 is used in most places. However, if
1274 # worktrees are in use and the user has a umask that excludes other
1275 # read permissions, repositories might become only partially world
1276 # readable. This only matters when they are being served by a user
1277 # (such as git-daemon running as 'nobody') that does not have group
1278 # or owner read permission to the repository.
1279 # See the `git help init` output for the possible values of the
1280 # `--shared` option for allowed settings of this value.
1281 # Note that if an explicit octal value is used, any execute bits will
1282 # be removed and u+rw will always be added and there are no promises
1283 # that files will not end up group readable/writable anyway.
1284 # RECOMMENDED VALUE: undef
1285 our $git_shared_repository_setting = undef;
1288 ## ------------------------
1289 ## Sanity checks & defaults
1290 ## ------------------------
1293 # A separate, non-installed module handles the checks and defaults
1294 require Girocco::Validator;