Merge branch master into rorcz
[girocco.git] / Girocco / Config.pm
blobf6d3387c4ecb8cf64f6d095e5a01387b089451d1
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 our $nc_openbsd_bin = 'nc.openbsd';
43 # Path to POSIX sh executable to use. Set to undef to use /bin/sh
44 our $posix_sh_bin = undef;
46 # Path to Perl executable to use. Set to undef to use Perl found in $PATH
47 our $perl_bin = undef;
49 # Path to the sendmail instance to use. It should understand the -f <from>, -i and -t
50 # options as well as accepting a list of recipient addresses in order to be used here.
51 # You MUST set this, even if to '/usr/sbin/sendmail'!
52 # Setting this to 'sendmail.pl' is special and will automatically be expanded to
53 # a full path to the ../bin/sendmail.pl executable in this Girocco installation.
54 # sendmail.pl is a sendmail-compatible script that delivers the message directly
55 # using SMTP to a mail relay host. This is the recommended configuration as it
56 # minimizes the information exposed to recipients (no sender account names or uids),
57 # can talk to an SMTP server on another host (eliminating the need for a working
58 # sendmail and/or SMTP server on this host) and avoids any unwanted address rewriting.
59 # By default it expects the mail relay to be listening on localhost port 25.
60 # See the sendmail.pl section below for more information on configuring sendmail.pl.
61 our $sendmail_bin = 'sendmail.pl';
63 # E-mail of the site admin
64 our $admin = 'admin@repo.or.cz';
66 # Sender of emails
67 # This is the SMTP 'MAIL FROM:' value
68 # It will be passed to $sendmail_bin with the -f option
69 # Some sites may not allow non-privileged users to pass the -f option to
70 # $sendmail_bin. In that case set this to undef and no -f option will be
71 # passed which means the 'MAIL FROM:' value will be the user the mail is
72 # sent as (either $cgi_user or $mirror_user depending on the activity).
73 # To avoid having bounce emails go to $admin, this may be set to something
74 # else such as 'admin-noreply@example.org' and then the 'admin-noreply' address
75 # may be redirected to /dev/null. Setting this to '' or '<>' is not
76 # recommended because that will likely cause the emails to be marked as SPAM
77 # by the receiver's SPAM filter. If $sendmail_bin is set to 'sendmail.pl' this
78 # value must be acceptable to the receiving SMTP server as a 'MAIL FROM:' value.
79 # If this is set to undef and 'sendmail.pl' is used, the 'MAIL FROM:' value will
80 # be the user the mail is sent as (either $cgi_user or $mirror_user).
81 our $sender = 'admin-noreply@repo.or.cz';
83 # Copy $admin on failure/recovery messages?
84 our $admincc = 0;
86 # Girocco branch to use for html.cgi view source links (undef for HEAD)
87 our $giroccobranch = 'rorcz';
89 # PATH adjustments
90 # If the PATH needs to be customized to find required executables on
91 # the system, it can be done here.
92 # For example something like this:
93 #$ENV{PATH} = substr(`/usr/bin/getconf PATH`,0,-1).":/usr/local/bin";
97 ## ----------------------
98 ## Git user agent strings
99 ## ----------------------
102 # Git clients (i.e. fetch/clone) always send a user agent string when fetching
103 # over HTTP. Since version 1.7.12.1 an 'agent=' capability string is included
104 # as well which affects git:, smart HTTP and ssh: protocols.
106 # These settings allow the default user agent string to be changed independently
107 # for fetch/clone operations (only matters if $mirror is true) and server
108 # operations (some other Git client fetching from us). Note that it is not
109 # possible to suppress the capability entirely although it can be set to an
110 # empty string. If these values are not set, the default user agent string
111 # will be used. Typically (unless Git was built with non-standard options) the
112 # default is "git/" plus the version. So for example "git/1.8.5.6" or
113 # "git/2.1.4" might be seen.
115 # One might want to change the default user agent strings in order to prevent
116 # an attacker from learning the exact Git version being used to avoid being
117 # able to quickly target any version-specific vulnerabilities. Note that
118 # no matter what's set here, an attacker can easily determine whether a server
119 # is running JGit, libgit2 or Git and for Git whether it's version 1.7.12.1 or
120 # later. A reasonable value to hide the exact Git version number while
121 # remaining compatible with servers that require a "Git/" user agent string
122 # would be something like "git/2" or even just "git/".
124 # The GIT_USER_AGENT value to use when acting as a client (i.e. clone/fetch)
125 # This value is only used if $mirror is true and at least one mirror is set up.
126 # Setting this to the empty string will suppress the HTTP User-Agent header,
127 # but will still include an "agent=" capability in the packet protocol. The
128 # empty string is not recommended because some servers match on "git/".
129 # Leave undef to use the default Git user agent string
130 # IMPORTANT: some server sites will refuse to serve up Git repositories unless
131 # the client user agent string contains "Git/" (matched case insensitively)!
132 our $git_client_ua = undef;
134 # The GIT_USER_AGENT value to use when acting as a server (i.e. some Git client
135 # is fetching/cloning from us).
136 # Leave undef to use the default Git user agent string
137 our $git_server_ua = undef;
141 ## -------------
142 ## Feature knobs
143 ## -------------
146 # Enable mirroring mode if true (see "Foreign VCS mirrors" section below)
147 our $mirror = 1;
149 # Enable push mode if true
150 our $push = 1;
152 # If both $mirror and $push are enabled, setting this to 'mirror' pre-selects
153 # mirror mode on the initial regproj display, otherwise 'push' mode will be
154 # pre-selected. When forking the initial mode will be 'push' if $push enabled.
155 our $initial_regproj_mode = 'mirror';
157 # Enable user management if true; this means the interface for registering
158 # user accounts and uploading SSH keys. This implies full chroot.
159 our $manage_users = 1;
161 # Minimum key length (in bits) for uploaded SSH RSA/DSA keys.
162 # If this is not set (i.e. undef) keys as small as 512 bits will be allowed.
163 # Nowadays keys less than 2048 bits in length should probably not be allowed.
164 # Note, however, that versions of OpenSSH starting with 4.3p1 will only generate
165 # DSA keys of exactly 1024 bits in length even though that length is no longer
166 # recommended. (OpenSSL can be used to generate DSA keys with lengths > 1024.)
167 # OpenSSH does not have any problem generating RSA keys longer than 1024 bits.
168 # This setting is only checked when new keys are added so setting it/increasing it
169 # will not affect existing keys. For maximum compatibility a value of 1024 may
170 # be used however 2048 is recommended. Setting it to anything other than 1024,
171 # 2048 or 3072 may have the side effect of making it very difficult to generate
172 # DSA keys that satisfy the restriction (but RSA keys should not be a problem).
173 # Note that no matter what setting is specified here keys smaller than 512 bits
174 # will never be allowed via the reguser.cgi/edituser.cgi interface.
175 # RECOMMENDED VALUE: 2048 (ok) or 3072 (better)
176 our $min_key_length = 1024;
178 # Disable DSA public keys?
179 # If this is set to 1, adding DSA keys at reguser.cgi/edituser.cgi time will be
180 # prohibited. If $pushurl is undef then this is implicitly set to 1 since DSA
181 # keys are not usable with https push.
182 # OpenSSH will only generate 1024 bit DSA keys starting with version 4.3p1.
183 # Even if OpenSSL is used to generate a longer DSA key (which can then be used
184 # with OpenSSH), the SSH protocol itself still forces use of SHA-1 in the DSA
185 # signature blob which tends to defeat the purpose of going to a longer key in
186 # the first place. So it may be better from a security standpoint to simply
187 # disable DSA keys especially if $min_key_length and $rsakeylength have been set
188 # to something higher such as 3072 or 4096. This setting is only checked when
189 # new keys are added so setting it/increasing it will not affect existing keys.
190 # There is no way to disable DSA keys in the OpenSSH server config file itself.
191 # If this is set to 1, no ssh_host_dsa_key will be generated or used with the
192 # sshd running in the jail (but if the sshd_config has already been generated
193 # in the jail, it must be removed and 'sudo make install' run again or otherwise
194 # the sshd_config needs to be edited by hand for the change to take effect).
195 # RECOMMENDED VALUE: 1
196 our $disable_dsa = 0;
198 # Enable the special 'mob' user if set to 'mob'
199 our $mob = "mob";
201 # Let users set admin passwords; if false, all password inputs are assumed empty.
202 # This will make new projects use empty passwords and all operations on them
203 # unrestricted, but you will be able to do no operations on previously created
204 # projects you have set a password on.
205 our $project_passwords = 1;
207 # How to determine project owner; 'email' adds a form item asking for their
208 # email contact, 'source' takes realname of owner of source repository if it
209 # is a local path (and empty string otherwise). 'source' is suitable in case
210 # the site operates only as mirror of purely local-filesystem repositories.
211 our $project_owners = 'email';
213 # Which project fields to make editable, out of 'shortdesc', 'homepage',
214 # 'README', 'notifymail', 'summaryonly', 'notifytag' and 'notifyjson'
215 # 'notifycia' was used by the now defunct CIA service and while allowing it to
216 # be edited does work and the value is saved, the value is totally ignored by Girocco
217 our @project_fields = qw(homepage shortdesc README notifymail summaryonly notifytag notifyjson);
219 # Minimal number of seconds to pass between two updates of a project.
220 our $min_mirror_interval = 3600; # 1 hour
222 # Minimal number of seconds to pass between two garbage collections of a project.
223 our $min_gc_interval = 604800; # 1 week
225 # Maximum window memory size when repacking. If this is set, it will be used
226 # instead of the automatically computed value if it's less than that value.
227 # May use a 'k', 'm', or 'g' suffix otherwise value is in bytes.
228 our $max_gc_window_memory_size = undef;
230 # Maximum big file threshold size when repacking. If this is set, it will be
231 # used instead of the automatically computed value if it's less than that value.
232 # May use a 'k', 'm', or 'g' suffix otherwise value is in bytes.
233 our $max_gc_big_file_threshold_size = undef;
235 # Whether or not to run the ../bin/update-pwd-db script whenever the etc/passwd
236 # database is changed. This is typically needed (i.e. set to a true value) for
237 # FreeBSD style systems when using an sshd chroot jail for push access. So if
238 # $pushurl is undef or the system Girocco is running on is not like FreeBSD
239 # (e.g. a master.passwd file that must be transformed into pwd.db and spwd.db), then
240 # this setting should normally be left false (i.e. 0). See comments in the
241 # provided ../bin/update-pwd-db script about when and how it's invoked.
242 our $update_pwd_db = 0;
244 # Port the sshd running in the jail should listen on
245 # Be sure to update $pushurl to match
246 # Not used if $pushurl is undef
247 our $sshd_jail_port = 22;
249 # If this is true then host names used in mirror source URLs will be checked
250 # and any that are not DNS names (i.e. IPv4 or IPv6) or match one of the DNS
251 # host names in any of the URL settings below will be rejected.
252 our $restrict_mirror_hosts = 1;
254 # If $restrict_mirror_hosts is enabled this is the minimum number of labels
255 # required in a valid dns name. Normally 2 is the correct value, but if
256 # Girocco is being used internally where a common default or search domain
257 # is set for everyone then this should be changed to 1 to allow a dns name
258 # with a single label in it. No matter what is set here at least 1 label
259 # is always required when $restrict_mirror_hosts is enabled.
260 our $min_dns_labels = 2;
262 # If $xmllint_readme is true then the contents of the README.html section
263 # will be passed through xmllint and any errors must be corrected before
264 # it can be saved. If this is set to true then xmllint must be in the $PATH.
265 # RECOMMENDED VALUE: 1
266 our $xmllint_readme = 1;
270 ## -------------------
271 ## Foreign VCS mirrors
272 ## -------------------
275 # Note that if any of these settings are changed from true to false, then
276 # any pre-existing mirrors using the now-disabled foreign VCS will stop
277 # updating, new mirrors using the now-disabled foreign VCS will be disallowed
278 # and attempts to update ANY project settings for a pre-existing project that
279 # uses a now-disabled foreign VCS source URL will also be disallowed.
281 # If $mirror is true and $mirror_svn is true then mirrors from svn source
282 # repositories will be allowed (and be converted to Git). These URLs have
283 # the form svn://... or svn+http://... or svn+https://...
284 # Note that for this to work the "svn" command line command must be available
285 # in PATH and the "git svn" commands must work (which generally requires both
286 # Perl and the subversion perl bindings be installed).
287 our $mirror_svn = 1;
289 # Prior to Git v1.5.1, git-svn always used a log window size of 1000.
290 # Starting with Git v1.5.1, git-svn defaults to using a log window size of 100
291 # and provides a --log-window-size= option to change it. Starting with Git
292 # v2.2.0, git-svn disconnects and reconnects to the server every log window size
293 # interval to attempt to reduce memory use by git-svn. If $svn_log_window_size
294 # is undefined, Girocco will use a log window size of 250 (instead of the
295 # the default 100). If $svn_log_window_size is set, Girocco will use that
296 # value instead. Beware that setting it too low (i.e. < 50) will almost
297 # certainly cause performance issues if not failures. Unless there are concerns
298 # about git-svn memory use on a server with extremely limited memory, the
299 # value of 250 that Girocco uses by default should be fine. Obviously if
300 # $mirror or $mirror_svn is false this setting is irrelevant.
301 our $svn_log_window_size = undef;
303 # If $mirror is true and $mirror_darcs is true then mirrors from darcs source
304 # repositories will be allowed (and be converted to Git). These URLs have
305 # the form darcs://...
306 # Note that for this to work the "darcs" command line command must be available
307 # in PATH and so must python (required to run the darcs-fast-export script).
308 our $mirror_darcs = 1;
310 # If $mirror is true and $mirror_bzr is true then mirrors from bzr source
311 # repositories will be allowed (and be converted to Git). These URLs have
312 # the form bzr://...
313 # Note that for this to work the "bzr" command line command must be available
314 # in PATH (it's a python script so python is required as well).
315 our $mirror_bzr = 1;
317 # If $mirror is true and $mirror_hg is true then mirrors from hg source
318 # repositories will be allowed (and be converted to Git). These URLs have
319 # the form hg+http://... or hg+https://...
320 # Note that for this to work the "hg" command line command must be available
321 # in PATH and so must python (required to run the hg-fast-export.py script).
322 # Note that if the PYTHON environment variable is set that will be used instead
323 # of just plain "python" to run the hg-fast-export.py script (which needs to
324 # be able to import from mercurial).
325 our $mirror_hg = 1;
329 ## -----
330 ## Paths
331 ## -----
334 # Path where the main chunk of Girocco files will be installed
335 # This will get COMPLETELY OVERWRITTEN by each make install!!!
336 our $basedir = '/home/repo/repomgr';
338 # Path where the automatically generated non-user certificates will be stored
339 # (The per-user certificates are always stored in $chroot/etc/sshcerts/)
340 # This is preserved by each make install and MUST NOT be under $basedir!
341 # Not used unless $httpspushurl is defined
342 our $certsdir = '/home/repo/certs';
344 # The repository collection
345 # "$reporoot/_recyclebin" will also be created for use by toolbox/trash-project.pl
346 our $reporoot = "/srv/git";
348 # The repository collection's location within the chroot jail
349 # Normally $reporoot will be bind mounted onto $chroot/$jailreporoot
350 # Should NOT start with '/'
351 our $jailreporoot = "srv/git";
353 # The chroot for ssh pushing; location for project database and other run-time
354 # data even in non-chroot setups
355 our $chroot = "/home/repo/j";
357 # The gitweb files web directory (corresponds to $gitwebfiles)
358 # Note that it is safe to place this under $basedir since it's set up after
359 # $basedir is completely replaced during install time. Be WARNED, however,
360 # that normally the install process only adds/replaces things in $webroot,
361 # but if $webroot is under $basedir then it will be completely removed and
362 # rebuilt each time "make install" is run. This will make gitweb/git-browser
363 # web services very briefly unavailable while this is happening.
364 our $webroot = "/home/repo/www";
366 # The CGI-enabled web directory (corresponds to $gitweburl and $webadmurl)
367 # This will not be web-accessible except that if any aliases point to
368 # a *.cgi file in here it will be allowed to run as a cgi-script.
369 # Note that it is safe to place this under $basedir since it's set up after
370 # $basedir is completely replaced during install time. Be WARNED, however,
371 # that normally the install process only adds/replaces things in $cgiroot,
372 # but if $cgiroot is under $basedir then it will be completely removed and
373 # rebuilt each time "make install" is run. This will make gitweb/git-browser
374 # web services very briefly unavailable while this is happening.
375 our $cgiroot = "/home/repo/cgibin";
377 # A web-accessible symlink to $reporoot (corresponds to $httppullurl, can be undef)
378 # If using the sample apache.conf (with paths suitably updated) this is not required
379 # to serve either smart or non-smart HTTP repositories to the Git client
380 our $webreporoot = "/home/repo/www/r";
382 # The location to store the project list cache, gitweb project list and gitweb
383 # cache file. Normally this should not be changed. Note that it must be in
384 # a directory that is writable by $mirror_user and $cgi_user (just in case the
385 # cache file is missing). The directory should have its group set to $owning_group.
386 # Again, this setting should not normally need to be changed.
387 our $projlist_cache_dir = "$chroot/etc";
391 ## ----------------------------------------------------
392 ## Certificates (only used if $httpspushurl is defined)
393 ## ----------------------------------------------------
396 # path to root certificate (undef to use automatic root cert)
397 # this certificate is made available for easy download and should be whatever
398 # the root certificate is for the https certificate being used by the web server
399 our $rootcert = undef;
401 # The certificate to sign user push client authentication certificates with (undef for auto)
402 # The automatically generated certificate should always be fine
403 our $clientcert = undef;
405 # The private key for $clientcert (undef for auto)
406 # The automatically generated key should always be fine
407 our $clientkey = undef;
409 # The client certificate chain suffix (a pemseq file to append to user client certs) (undef for auto)
410 # The automatically generated chain should always be fine
411 # This suffix will also be appended to the $mobusercert before making it available for download
412 our $clientcertsuffix = undef;
414 # The mob user certificate signed by $clientcert (undef for auto)
415 # The automatically generated certificate should always be fine
416 # Not used unless $mob is set to 'mob'
417 # The $clientcertsuffix will be appended before making $mobusercert available for download
418 our $mobusercert = undef;
420 # The private key for $mobusercert (undef for auto)
421 # The automatically generated key should always be fine
422 # Not used unless $mob is set to 'mob'
423 our $mobuserkey = undef;
425 # Server alt names to embed in the auto-generated girocco_www_crt.pem certificate.
426 # The common name (CN) in the server certificate is the host name from $httpspushurl.
427 # By default no server alt names are embedded (not even the host from $httpspushurl).
428 # If the web server configuration is not using this auto-generated server certificate
429 # then the values set here will have no impact and this setting can be ignored.
430 # To embed server alternative names, list each (separated by spaces). The names
431 # may be DNS names, IPv4 addresses or IPv6 addresses (NO surrounding '[' ']' please).
432 # If ANY DNS names are included here be sure to also include the host name from
433 # the $httpspushurl or else standards-conforming clients will fail with a host name
434 # mismatch error when they attempt to verify the connection.
435 #our $wwwcertaltnames = 'example.com www.example.com git.example.com 127.0.0.1 ::1';
436 our $wwwcertaltnames = undef;
438 # The key length for automatically generated RSA private keys (in bits).
439 # These keys are then used to create the automatically generated certificates.
440 # If undef or set to a value less than 2048, then 2048 will be used.
441 # Set to 3072 to generate more secure keys/certificates. Set to 4096 (or higher) for
442 # even greater security. Be warned that setting to a non-multiple of 8 and/or greater
443 # than 4096 could negatively impact compatibility with some clients.
444 # The values 2048, 3072 and 4096 are expected to be compatible with all clients.
445 # Note that OpenSSL has no problem with > 4096 or non-multiple of 8 lengths.
446 # See also the $min_key_length setting above to restrict user key sizes.
447 # This value is also used when generating the ssh_host_rsa_key for the chroot jail sshd.
448 # RECOMMENDED VALUE: 3072
449 our $rsakeylength = undef;
453 ## -------------
454 ## URL addresses
455 ## -------------
458 # URL of the gitweb.cgi script (must be in pathinfo mode). If the sample
459 # apache.conf configuration is used, the trailing "/w" is optional.
460 our $gitweburl = "http://repo.or.cz";
462 # URL of the extra gitweb files (CSS, .js files, images, ...)
463 our $gitwebfiles = "http://repo.or.cz";
465 # URL of the Girocco CGI web admin interface (Girocco cgi/ subdirectory)
466 # e.g. reguser.cgi, edituser.cgi, regproj.cgi, editproj.cgi etc.
467 our $webadmurl = "http://repo.or.cz";
469 # URL of the Girocco CGI bundles information generator (Girocco cgi/bundles.cgi)
470 # If the sample apache.conf configuration is used, the trailing "/b" is optional.
471 # This is different from $httpbundleurl. This URL lists all available bundles
472 # for a project and returns that as an HTML page.
473 our $bundlesurl = "http://repo.or.cz";
475 # URL of the Girocco CGI html templater (Girocco cgi/html.cgi)
476 # If mod_rewrite is enabled and the sample apache.conf configuration is used,
477 # the trailing "/h" is optional when the template file name ends in ".html"
478 # (which all the provided ones do).
479 our $htmlurl = "http://repo.or.cz";
481 # HTTP URL of the repository collection (undef if N/A)
482 # If the sample apache.conf configuration is used, the trailing "/r" is optional.
483 our $httppullurl = "http://repo.or.cz";
485 # HTTP URL of the repository collection when fetching a bundle (undef if N/A)
486 # Normally this will be the same as $httppullurl, but note that the bundle
487 # fetching logic is located in git-http-backend-verify so whatever URL is
488 # given here MUST end up running the git-http-backend-verify script!
489 # For example, if we're fetching the 'clone.bundle' for the 'girocco.git'
490 # repository, the final URL will be "$httpbundleurl/girocco.git/clone.bundle"
491 # If the sample apache.conf configuration is used, the trailing "/r" is optional.
492 # This is different from $bundlesurl. This URL fetches a single Git-format
493 # .bundle file that is only usable with the 'git bundle' command.
494 our $httpbundleurl = "http://repo.or.cz";
496 # HTTPS push URL of the repository collection (undef if N/A)
497 # If this is defined, the openssl command must be available
498 # The sample apache.conf configuration requires mod_ssl, mod_authn_anon and
499 # mod_rewrite be enabled to support https push operations.
500 # Normally this should be set to $httppullurl with http: replaced with https:
501 # If the sample apache.conf configuration is used, the trailing "/r" is optional.
502 our $httpspushurl = "https://repo.or.cz";
504 # Git URL of the repository collection (undef if N/A)
505 # (You need to set up git-daemon on your system, and Girocco will not
506 # do this particular thing for you.)
507 our $gitpullurl = "git://repo.or.cz";
509 # Pushy SSH URL of the repository collection (undef if N/A)
510 # Note that the "/$jailreporoot" portion is optional and will be automatically
511 # added if appropriate when omitted by the client so this URL can typically
512 # be made the same as $gitpullurl with git: replaced with ssh:
513 our $pushurl = "ssh://repo.or.cz";
515 # URL of gitweb of this Girocco instance (set to undef if you're not nice
516 # to the community)
517 our $giroccourl = "$Girocco::Config::gitweburl/girocco.git";
521 ## -------------------
522 ## web server controls
523 ## -------------------
526 # If true then non-smart HTTP access will be disabled
527 # There's normally no reason to leave non-smart HTTP access enabled
528 # since downloadable bundles are provided. However, in case the
529 # non-smart HTTP access is needed for some reason, this can be set to undef or 0.
530 # This affects access via http: AND https: and processing of apache.conf.in.
531 # Note that this setting does not affect gitweb, ssh: or git: URL access in any way.
532 # RECOMMENDED VALUE: 1
533 our $SmartHTTPOnly = 0;
535 # If true, the https <VirtualHost ...> section in apache.conf.in will be
536 # automatically enabled when it's converted to apache.conf by the conversion
537 # script. Do NOT enable this unless the required Apache modules are present
538 # and loaded (mod_ssl, mod_rewrite, mod_authn_anon) AND $httpspushurl is
539 # defined above otherwise the server will fail to start (with various errors)
540 # when the resulting apache.conf is used.
541 our $TLSHost = 1;
545 ## ------------------------
546 ## Some templating settings
547 ## ------------------------
550 # Legal warning (on reguser and regproj pages)
551 our $legalese = <<EOT;
552 <p>By submitting this form, you are confirming that you will mirror or push
553 only free software and redistributing it will not violate any law
554 of Czech Republic.
555 <sup><a href="/h/about.html">(more details)</a></sup>
556 </p>
559 # Pre-configured mirror sources (set to undef for none)
560 # Arrayref of name - record pairs, the record has these attributes:
561 # label: The label of this source
562 # url: The template URL; %1, %2, ... will be substituted for inputs
563 # desc: Optional VERY short description
564 # link: Optional URL to make the desc point at
565 # inputs: Arrayref of hashref input records:
566 # label: Label of input record
567 # suffix: Optional suffix
568 # If the inputs arrayref is undef, single URL input is shown,
569 # pre-filled with url (probably empty string).
570 our $mirror_sources = [
572 label => 'Anywhere',
573 url => '',
574 desc => 'Any HTTP/Git/rsync pull URL - bring it on!',
575 inputs => undef
578 label => 'GitHub',
579 url => 'git://github.com/%1/%2.git',
580 desc => 'GitHub Social Code Hosting',
581 link => 'http://github.com/',
582 inputs => [ { label => 'User:' }, { label => 'Project:', suffix => '.git' } ]
585 label => 'GitLab',
586 url => 'https://gitlab.com/%1/%2.git',
587 desc => 'Engulfed the Green and Orange Boxes',
588 link => 'https://gitlab.com/',
589 inputs => [ { label => 'Project:' }, { label => 'Repository:', suffix => '.git' } ]
593 # You can customize the gitweb interface widely by editing
594 # gitweb/gitweb_config.perl
598 ## -------------------
599 ## Permission settings
600 ## -------------------
603 # Girocco needs some way to manipulate write permissions to various parts of
604 # all repositories; this concerns three entities:
605 # - www-data: the web interface needs to be able to rewrite few files within
606 # the repository
607 # - repo: a user designated for cronjobs; handles mirroring and repacking;
608 # this one is optional if not $mirror
609 # - others: the designated users that are supposed to be able to push; they
610 # may have account either within chroot, or outside of it
612 # There are several ways how to use Girocco based on a combination of the
613 # following settings.
615 # (Non-chroot) UNIX user the CGI scripts run on; note that if some non-related
616 # untrusted CGI scripts run on this account too, that can be a big security
617 # problem and you'll probably need to set up suexec (poor you).
618 # This must always be set.
619 our $cgi_user = 'www-data';
621 # (Non-chroot) UNIX user performing mirroring jobs; this is the user who
622 # should run all the daemons and cronjobs and
623 # the user who should be running make install (if not root).
624 # This must always be set.
625 our $mirror_user = 'repo';
627 # (Non-chroot) UNIX group owning the repositories by default; it owns whole
628 # mirror repositories and at least web-writable metadata of push repositories.
629 # If you undefine this, all the data will become WORLD-WRITABLE.
630 # Both $cgi_user and $mirror_user should be members of this group!
631 our $owning_group = 'repo';
633 # Whether to use chroot jail for pushing; this must be always the same
634 # as $manage_users.
635 # TODO: Gitosis support for $manage_users and not $chrooted?
636 our $chrooted = $manage_users;
638 # How to control permissions of push-writable data in push repositories:
639 # * 'Group' for the traditional model: The $chroot/etc/group project database
640 # file is used as the UNIX group(5) file; the directories have gid appropriate
641 # for the particular repository and are group-writable. This works only if
642 # $chrooted so that users are put in the proper groups on login when using
643 # SSH push. Smart HTTPS push does not require a chroot to work -- simply
644 # run "make install" as the non-root $mirror_user user, but leave
645 # $manage_users and $chrooted enabled.
646 # * 'ACL' for a model based on POSIX ACL: The directories are coupled with ACLs
647 # listing the users with push permissions. This works for both chroot and
648 # non-chroot setups, however it requires ACL support within the filesystem.
649 # This option is BASICALLY UNTESTED, too. And UNIMPLEMENTED. :-)
650 # * 'Hooks' for a relaxed model: The directories are world-writable and push
651 # permission control is purely hook-driven. This is INSECURE and works only
652 # when you trust all your users; on the other hand, the attack vectors are
653 # mostly just DoS or fully-traceable tinkering.
654 our $permission_control = 'Group';
656 # Path to alternate screen multiuser acl file (see screen/README, undef for none)
657 our $screen_acl_file = undef;
659 # Reserved project name and user name suffixes.
661 # Note that with personal mob branches enabled, a user name can end up being a
662 # file name after having a 'mob.' prefix added or a directory name after having
663 # a 'mob_' prefix added. If there is ANY possibility that a file with a
664 # .suffix name may need to be served by the web server, lc(suffix) SHOULD be in
665 # this hash! Pre-existing project names or user names with a suffix in this
666 # table can continue to be used, but no new projects or users can be created
667 # that have a suffix (case-insensitive) listed here.
668 our %reserved_suffixes = (
669 # Entries must be lowercase WITHOUT a leading '.'
670 bmp => 1,
671 bz2 => 1,
672 cgi => 1,
673 css => 1,
674 dmg => 1,
675 fcgi => 1,
676 gif => 1,
677 gz => 1,
678 htm => 1,
679 html => 1,
680 ico => 1,
681 jp2 => 1,
682 jpeg => 1,
683 jpg => 1,
684 jpg2 => 1,
685 js => 1,
686 pdf => 1,
687 pem => 1,
688 php => 1,
689 png => 1,
690 shtml => 1,
691 svg => 1,
692 svgz => 1,
693 tar => 1,
694 text => 1,
695 tgz => 1,
696 tif => 1,
697 tiff => 1,
698 txt => 1,
699 xbm => 1,
700 xht => 1,
701 xhtml => 1,
702 xz => 1,
703 zip => 1,
708 ## -------------------------
709 ## sendmail.pl configuration
710 ## -------------------------
713 # Full information on available sendmail.pl settings can be found by running
714 # ../bin/sendmail.pl -v -h
716 # These settings will only used if $sendmail_bin is set to 'sendmail.pl'
718 # sendmail.pl host name
719 #$ENV{'SENDMAIL_PL_HOST'} = 'localhost'; # localhost is the default
721 # sendmail.pl port name
722 #$ENV{'SENDMAIL_PL_PORT'} = '25'; # port 25 is the default
724 # sendmail.pl nc executable
725 #$ENV{'SENDMAIL_PL_NCBIN'} = "$chroot/bin/nc.openbsd"; # default is nc found in $PATH
727 # sendmail.pl nc options
728 # multiple options may be included, e.g. '-4 -X connect -x 192.168.100.10:8080'
729 #$ENV{'SENDMAIL_PL_NCOPT'} = '-4'; # force IPv4, default is to allow IPv4 & IPv6
733 ## -------------------------
734 ## Obscure Tuneable Features
735 ## -------------------------
738 # Throttle classes configured here override the defaults for them that
739 # are located in taskd/taskd.pl. See comments in that file for more info.
740 our @throttle_classes = ();
742 # Any tag names listed here will be allowed even if they would otherwise not be.
743 our @allowed_tags = ();
745 # Any tag names listed here will be disallowed in addition to the standard
746 # list of nonsense words etc. that are blocked as tags.
747 our @blocked_tags = ();
749 # If there are no more than this many objects, then all deltas will be
750 # recomputed when gc takes place. Note that this does not affect any
751 # fast-import created packs as they ALWAYS have their deltas recomputed.
752 # Also when combining small packs, if the total object count in the packs
753 # to be combined is no more than this then the new, combined pack will have
754 # its deltas recomputed during the combine operation.
755 # Leave undef to use the default (which should generally be fine).
756 # Lowering this from the default can increase disk use.
757 # Values less than 1000 * number of CPU cores will be silently ignored.
758 our $new_delta_threshold = undef;
760 # If this is set to a true value, then core.packedGitWindowSize will be set
761 # to 1 MiB the same as if Git was compiled with NO_MMAP set. If this is NOT
762 # set, core.packedGitWindowSize will be set to 32 MiB (even on 64-bit) to avoid
763 # memory blowout. If your Git was built with NO_MMAP set and will not work
764 # without NO_MMAP set, you MUST set this to a true value!
765 our $git_no_mmap = undef;
767 # If set to a true value, the "X-Girocco: $gitweburl" header included in all
768 # Girocco-generated emails will be suppressed.
769 our $suppress_x_girocco = undef;
773 ## ------------------------
774 ## Sanity checks & defaults
775 ## ------------------------
777 # Changing anything in this section can result in unexpected breakage
779 # Couple of sanity checks and default settings (do not change these)
780 use Digest::MD5 qw(md5);
781 use MIME::Base64 qw(encode_base64);
782 $name =~ s/\s+/_/gs;
783 $nickname = lc((split(/[.]/, $name))[0]) unless $nickname;
784 $nickname =~ s/\s+/_/gs;
785 our $tmpsuffix = substr(encode_base64(md5($name.':'.$nickname)),0,6);
786 $tmpsuffix =~ tr,+/,=_,;
787 ($mirror_user) or die "Girocco::Config: \$mirror_user must be set even if to current user";
788 ($basedir) or die "Girocco::Config: \$basedir must be set";
789 ($sendmail_bin) or die "Girocco::Config: \$sendmail_bin must be set";
790 $sendmail_bin = "$basedir/bin/sendmail.pl" if $sendmail_bin eq "sendmail.pl";
791 $screen_acl_file = "$basedir/screen/giroccoacl" unless $screen_acl_file;
792 $jailreporoot =~ s,^/+,,;
793 ($reporoot) or die "Girocco::Config \$reporoot must be set";
794 ($jailreporoot) or die "Girocco::Config \$jailreporoot must be set";
795 (not $mob or $mob eq 'mob') or die "Girocco::Config \$mob must be undef (or '') or 'mob'";
796 (not $min_key_length or $min_key_length =~ /^[1-9][0-9]*$/)
797 or die "Girocco::Config \$min_key_length must be undef or numeric";
798 $admincc = $admincc ? 1 : 0;
799 $rootcert = "$certsdir/girocco_root_crt.pem" if $httpspushurl && !$rootcert;
800 $clientcert = "$certsdir/girocco_client_crt.pem" if $httpspushurl && !$clientcert;
801 $clientkey = "$certsdir/girocco_client_key.pem" if $httpspushurl && !$clientkey;
802 $clientcertsuffix = "$certsdir/girocco_client_suffix.pem" if $httpspushurl && !$clientcertsuffix;
803 $mobusercert = "$certsdir/girocco_mob_user_crt.pem" if $httpspushurl && $mob && !$mobusercert;
804 $mobuserkey = "$certsdir/girocco_mob_user_key.pem" if $httpspushurl && $mob && !$mobuserkey;
805 our $mobpushurl = $pushurl;
806 $mobpushurl =~ s,^ssh://,ssh://mob@,i if $mobpushurl;
807 $disable_dsa = 1 unless $pushurl;
808 $disable_dsa = $disable_dsa ? 1 : '';
809 our $httpdnsname = ($gitweburl =~ m,https?://([A-Za-z0-9.-]+),i) ? lc($1) : undef if $gitweburl;
810 our $httpsdnsname = ($httpspushurl =~ m,https://([A-Za-z0-9.-]+),i) ? lc($1) : undef if $httpspushurl;
811 ($mirror or $push) or die "Girocco::Config: neither \$mirror nor \$push is set?!";
812 (not $push or ($pushurl or $httpspushurl or $gitpullurl or $httppullurl)) or die "Girocco::Config: no pull URL is set";
813 (not $push or ($pushurl or $httpspushurl)) or die "Girocco::Config: \$push set but \$pushurl and \$httpspushurl are undef";
814 (not $mirror or $mirror_user) or die "Girocco::Config: \$mirror set but \$mirror_user is undef";
815 ($manage_users == $chrooted) or die "Girocco::Config: \$manage_users and \$chrooted must be set to the same value";
816 (not $chrooted or $permission_control ne 'ACL') or die "Girocco::Config: resolving uids for ACL not supported when using chroot";
817 (grep { $permission_control eq $_ } qw(Group Hooks)) or die "Girocco::Config: \$permission_control must be set to Group or Hooks";
818 ($chrooted or not $mob) or die "Girocco::Config: mob user supported only in the chrooted mode";
819 (not $httpspushurl or $httpsdnsname) or die "Girocco::Config invalid \$httpspushurl does not start with https://domainname";
820 (not $svn_log_window_size or $svn_log_window_size =~ /^[1-9][0-9]*$/)
821 or die "Girocco::Config \$svn_log_window_size must be undef or numeric";
822 (not $posix_sh_bin or $posix_sh_bin !~ /\s/) or die "Girocco::Config: \$posix_sh_bin must not contain any whitespace";
823 (not $perl_bin or $perl_bin !~ /\s/) or die "Girocco::Config: \$perl_bin must not contain any whitespace";
824 !$git_no_mmap and $git_no_mmap = undef;
825 !$suppress_x_girocco and $suppress_x_girocco = undef;
827 # Make sure Git has a consistent and reproducible environment
829 $ENV{'XDG_CONFIG_HOME'} = $chroot.'/var/empty';
830 $ENV{'HOME'} = $chroot.'/etc/girocco';
831 $ENV{'TMPDIR'} = '/tmp';
832 $ENV{'GIT_CONFIG_NOSYSTEM'} = 1;
833 $ENV{'GIT_ATTR_NOSYSTEM'} = 1;
834 $ENV{'GIT_NO_REPLACE_OBJECTS'} = 1;
835 $ENV{'GIT_TERMINAL_PROMPT'} = 0;
836 $ENV{'GIT_ASKPASS'} = $basedir.'/bin/git-askpass-password';
837 delete $ENV{'GIT_USER_AGENT'};
838 $ENV{'GIT_USER_AGENT'} = $git_client_ua if defined($git_client_ua);
839 delete $ENV{'GIT_HTTP_USER_AGENT'};
840 $ENV{'GIT_HTTP_USER_AGENT'} = $git_client_ua if defined($git_client_ua);
841 delete $ENV{'GIT_CONFIG_PARAMETERS'};
843 # Guarantee a sane umask for Girocco
845 umask(umask() & ~0770);