]> git.donarmstrong.com Git - debbugs.git/blob - Debbugs/Config.pm
Include the protocol (http://) in gWebDomain and gCGIDomain
[debbugs.git] / Debbugs / Config.pm
1 # This module is part of debbugs, and is released
2 # under the terms of the GPL version 2, or any later
3 # version at your option.
4 # See the file README and COPYING for more information.
5 #
6 # Copyright 2007 by Don Armstrong <don@donarmstrong.com>.
7
8 package Debbugs::Config;
9
10 =head1 NAME
11
12 Debbugs::Config -- Configuration information for debbugs
13
14 =head1 SYNOPSIS
15
16  use Debbugs::Config;
17
18 # to get the compatiblity interface
19
20  use Debbugs::Config qw(:globals);
21
22 =head1 DESCRIPTION
23
24 This module provides configuration variables for all of debbugs.
25
26 =head1 CONFIGURATION FILES
27
28 The default configuration file location is /etc/debbugs/config; this
29 configuration file location can be set by modifying the
30 DEBBUGS_CONFIG_FILE env variable to point at a different location.
31
32 =cut
33
34 use warnings;
35 use strict;
36 use vars qw($VERSION $DEBUG %EXPORT_TAGS @EXPORT_OK @EXPORT $USING_GLOBALS %config);
37 use base qw(Exporter);
38
39 BEGIN {
40      # set the version for version checking
41      $VERSION     = 1.00;
42      $DEBUG = 0 unless defined $DEBUG;
43      $USING_GLOBALS = 0;
44
45      @EXPORT = ();
46      %EXPORT_TAGS = (globals => [qw($gEmailDomain $gListDomain $gWebHost $gWebHostBugDir),
47                                  qw($gWebDomain $gHTMLSuffix $gCGIDomain $gMirrors),
48                                  qw($gPackagePages $gSubscriptionDomain $gProject $gProjectTitle),
49                                  qw($gMaintainer $gMaintainerWebpage $gMaintainerEmail $gUnknownMaintainerEmail),
50                                  qw($gSubmitList $gMaintList $gQuietList $gForwardList),
51                                  qw($gDoneList $gRequestList $gSubmitterList $gControlList),
52                                  qw($gStrongList),
53                                  qw($gBugSubscriptionDomain),
54                                  qw($gPackageVersionRe),
55                                  qw($gSummaryList $gMirrorList $gMailer $gBug),
56                                  qw($gBugs $gRemoveAge $gSaveOldBugs $gDefaultSeverity),
57                                  qw($gShowSeverities $gBounceFroms $gConfigDir $gSpoolDir),
58                                  qw($gIncomingDir $gWebDir $gDocDir $gMaintainerFile),
59                                  qw($gMaintainerFileOverride $gPseudoMaintFile $gPseudoDescFile $gPackageSource),
60                                  qw($gVersionPackagesDir $gVersionIndex $gBinarySourceMap $gSourceBinaryMap),
61                                  qw($gVersionTimeIndex),
62                                  qw($gSimpleVersioning),
63                                  qw($gCVETracker),
64                                  qw($gSendmail @gSendmailArguments $gLibPath $gSpamScan @gExcludeFromControl),
65                                  qw(%gSeverityDisplay @gTags @gSeverityList @gStrongSeverities),
66                                  qw(%gTagsSingleLetter),
67                                  qw(%gSearchEstraier),
68                                  qw(%gDistributionAliases),
69                                  qw(%gObsoleteSeverities),
70                                  qw(@gPostProcessall @gRemovalDefaultDistributionTags @gRemovalDistributionTags @gRemovalArchitectures),
71                                  qw(@gRemovalStrongSeverityDefaultDistributionTags),
72                                  qw(@gAffectsDistributionTags),
73                                  qw(@gDefaultArchitectures),
74                                  qw($gMachineName),
75                                  qw($gTemplateDir),
76                                  qw($gDefaultPackage),
77                                  qw($gSpamMaxThreads $gSpamSpamsPerThread $gSpamKeepRunning $gSpamScan $gSpamCrossassassinDb),
78                                 ],
79                      text     => [qw($gBadEmailPrefix $gHTMLTail $gHTMLExpireNote),
80                                  ],
81                      cgi => [qw($gLibravatarUri $gLibravatarCacheDir $gLibravatarUriOptions @gLibravatarBlacklist)],
82                      config   => [qw(%config)],
83                     );
84      @EXPORT_OK = ();
85      Exporter::export_ok_tags(keys %EXPORT_TAGS);
86      $EXPORT_TAGS{all} = [@EXPORT_OK];
87      $ENV{HOME} = '' if not defined $ENV{HOME};
88 }
89
90 use Sys::Hostname;
91 use File::Basename qw(dirname);
92 use IO::File;
93 use Safe;
94
95 =head1 CONFIGURATION VARIABLES
96
97 =head2 General Configuration
98
99 =over
100
101 =cut
102
103 # read in the files;
104 %config = ();
105 # untaint $ENV{DEBBUGS_CONFIG_FILE} if it's owned by us
106 # This enables us to test things that are -T.
107 if (exists $ENV{DEBBUGS_CONFIG_FILE}) {
108 # This causes all sorts of problems for mirrors of debbugs; disable
109 # it.
110 #     if (${[stat($ENV{DEBBUGS_CONFIG_FILE})]}[4] == $<) {
111           $ENV{DEBBUGS_CONFIG_FILE} =~ /(.+)/;
112           $ENV{DEBBUGS_CONFIG_FILE} = $1;
113 #      }
114 #      else {
115 #         die "Environmental variable DEBBUGS_CONFIG_FILE set, and $ENV{DEBBUGS_CONFIG_FILE} is not owned by the user running this script.";
116 #      }
117 }
118 read_config(exists $ENV{DEBBUGS_CONFIG_FILE}?$ENV{DEBBUGS_CONFIG_FILE}:'/etc/debbugs/config');
119
120 =item email_domain $gEmailDomain
121
122 The email domain of the bts
123
124 =cut
125
126 set_default(\%config,'email_domain','bugs.something');
127
128 =item list_domain $gListDomain
129
130 The list domain of the bts, defaults to the email domain
131
132 =cut
133
134 set_default(\%config,'list_domain',$config{email_domain});
135
136 =item web_host $gWebHost
137
138 The web host of the bts; defaults to the email domain
139
140 =cut
141
142 set_default(\%config,'web_host',$config{email_domain});
143
144 =item web_host_bug_dir $gWebHostDir
145
146 The directory of the web host on which bugs are kept, defaults to C<''>
147
148 =cut
149
150 set_default(\%config,'web_host_bug_dir','');
151
152 =item web_domain $gWebDomain
153
154 Full path of the web domain where bugs are kept including the protocol (http://
155 or https://). Defaults to the concatenation of 'http://', L</web_host> and
156 L</web_host_bug_dir>
157
158 =cut
159
160 set_default(\%config,'web_domain','http://'.$config{web_host}.($config{web_host}=~m{/$}?'':'/').$config{web_host_bug_dir});
161
162 =item html_suffix $gHTMLSuffix
163
164 Suffix of html pages, defaults to .html
165
166 =cut
167
168 set_default(\%config,'html_suffix','.html');
169
170 =item cgi_domain $gCGIDomain
171
172 Full path of the web domain where cgi scripts are kept. Defaults to
173 the concatentation of L</web_domain> and cgi.
174
175 =cut
176
177 set_default(\%config,'cgi_domain',$config{web_domain}.($config{web_domain}=~m{/$}?'':'/').'cgi');
178
179 =item mirrors @gMirrors
180
181 List of mirrors [What these mirrors are used for, no one knows.]
182
183 =cut
184
185
186 set_default(\%config,'mirrors',[]);
187
188 =item package_pages  $gPackagePages
189
190 Domain where the package pages are kept; links should work in a
191 package_pages/foopackage manner. Defaults to undef, which means that
192 package links will not be made.
193
194 =cut
195
196
197 set_default(\%config,'package_pages',undef);
198
199 =item package_pages  $gUsertagPackageDomain
200
201 Domain where where usertags of packages belong; defaults to $gPackagePages
202
203 =cut
204
205 set_default(\%config,'usertag_package_domain',$config{package_pages});
206
207
208 =item subscription_domain $gSubscriptionDomain
209
210 Domain where subscriptions to package lists happen
211
212 =cut
213
214 set_default(\%config,'subscription_domain',undef);
215
216
217 =item cc_all_mails_to_addr $gCcAllMailsToAddr
218
219 Address to Cc (well, Bcc) all e-mails to
220
221 =cut
222
223 set_default(\%config,'cc_all_mails_to_addr',undef);
224
225
226 =item cve_tracker $gCVETracker
227
228 URI to CVE security tracker; in bugreport.cgi, CVE-2001-0002 becomes
229 linked to http://$config{cve_tracker}CVE-2001-002
230
231 Default: security-tracker.debian.org/tracker/
232
233 =cut
234
235 set_default(\%config,'cve_tracker','security-tracker.debian.org/tracker/');
236
237
238 =back
239
240 =cut
241
242
243 =head2 Project Identification
244
245 =over
246
247 =item project $gProject
248
249 Name of the project
250
251 Default: 'Something'
252
253 =cut
254
255 set_default(\%config,'project','Something');
256
257 =item project_title $gProjectTitle
258
259 Name of this install of Debbugs, defaults to "L</project> Debbugs Install"
260
261 Default: "$config{project} Debbugs Install"
262
263 =cut
264
265 set_default(\%config,'project_title',"$config{project} Debbugs Install");
266
267 =item maintainer $gMaintainer
268
269 Name of the maintainer of this debbugs install
270
271 Default: 'Local DebBugs Owner's
272
273 =cut
274
275 set_default(\%config,'maintainer','Local DebBugs Owner');
276
277 =item maintainer_webpage $gMaintainerWebpage
278
279 Webpage of the maintainer of this install of debbugs
280
281 Default: "$config{web_domain}/~owner"
282
283 =cut
284
285 set_default(\%config,'maintainer_webpage',"$config{web_domain}/~owner");
286
287 =item maintainer_email $gMaintainerEmail
288
289 Email address of the maintainer of this Debbugs install
290
291 Default: 'root@'.$config{email_domain}
292
293 =cut
294
295 set_default(\%config,'maintainer_email','root@'.$config{email_domain});
296
297 =item unknown_maintainer_email
298
299 Email address where packages with an unknown maintainer will be sent
300
301 Default: $config{maintainer_email}
302
303 =cut
304
305 set_default(\%config,'unknown_maintainer_email',$config{maintainer_email});
306
307 =item machine_name
308
309 The name of the machine that this instance of debbugs is running on
310 (currently used for debbuging purposes and web page output.)
311
312 Default: Sys::Hostname::hostname()
313
314 =back
315
316 =cut
317
318 set_default(\%config,'machine_name',Sys::Hostname::hostname());
319
320 =head2 BTS Mailing Lists
321
322
323 =over
324
325 =item submit_list
326
327 =item maint_list
328
329 =item forward_list
330
331 =item done_list
332
333 =item request_list
334
335 =item submitter_list
336
337 =item control_list
338
339 =item summary_list
340
341 =item mirror_list
342
343 =item strong_list
344
345 =cut
346
347 set_default(\%config,   'submit_list',   'bug-submit-list');
348 set_default(\%config,    'maint_list',    'bug-maint-list');
349 set_default(\%config,    'quiet_list',    'bug-quiet-list');
350 set_default(\%config,  'forward_list',  'bug-forward-list');
351 set_default(\%config,     'done_list',     'bug-done-list');
352 set_default(\%config,  'request_list',  'bug-request-list');
353 set_default(\%config,'submitter_list','bug-submitter-list');
354 set_default(\%config,  'control_list',  'bug-control-list');
355 set_default(\%config,  'summary_list',  'bug-summary-list');
356 set_default(\%config,   'mirror_list',   'bug-mirror-list');
357 set_default(\%config,   'strong_list',   'bug-strong-list');
358
359 =item bug_subscription_domain
360
361 Domain of list for messages regarding a single bug; prefixed with
362 bug=${bugnum}@ when bugs are actually sent out. Set to undef or '' to
363 disable sending messages to the bug subscription list.
364
365 Default: list_domain
366
367 =back
368
369 =cut
370
371 set_default(\%config,'bug_subscription_domain',$config{list_domain});
372
373
374
375 =head2 Misc Options
376
377 =over
378
379 =item mailer
380
381 Name of the mailer to use
382
383 Default: exim
384
385 =cut
386
387 set_default(\%config,'mailer','exim');
388
389
390 =item bug
391
392 Default: bug
393
394 =item ubug
395
396 Default: ucfirst($config{bug});
397
398 =item bugs
399
400 Default: bugs
401
402 =item ubugs
403
404 Default: ucfirst($config{ubugs});
405
406 =cut
407
408 set_default(\%config,'bug','bug');
409 set_default(\%config,'ubug',ucfirst($config{bug}));
410 set_default(\%config,'bugs','bugs');
411 set_default(\%config,'ubugs',ucfirst($config{bugs}));
412
413 =item remove_age
414
415 Age at which bugs are archived/removed
416
417 Default: 28
418
419 =cut
420
421 set_default(\%config,'remove_age',28);
422
423 =item save_old_bugs
424
425 Whether old bugs are saved or deleted
426
427 Default: 1
428
429 =cut
430
431 set_default(\%config,'save_old_bugs',1);
432
433 =item distribution_aliases
434
435 Map of distribution aliases to the distribution name
436
437 Default:
438          {experimental => 'experimental',
439           unstable     => 'unstable',
440           testing      => 'testing',
441           stable       => 'stable',
442           oldstable    => 'oldstable',
443           sid          => 'unstable',
444           lenny        => 'testing',
445           etch         => 'stable',
446           sarge        => 'oldstable',
447          }
448
449 =cut
450
451 set_default(\%config,'distribution_aliases',
452             {experimental => 'experimental',
453              unstable     => 'unstable',
454              testing      => 'testing',
455              stable       => 'stable',
456              oldstable    => 'oldstable',
457              sid          => 'unstable',
458              lenny        => 'testing',
459              etch         => 'stable',
460              sarge        => 'oldstable',
461             },
462            );
463
464
465
466 =item distributions
467
468 List of valid distributions
469
470 Default: The values of the distribution aliases map.
471
472 =cut
473
474 my %_distributions_default;
475 @_distributions_default{values %{$config{distribution_aliases}}} = values %{$config{distribution_aliases}};
476 set_default(\%config,'distributions',[keys %_distributions_default]);
477
478
479 =item default_architectures
480
481 List of default architectures to use when architecture(s) are not
482 specified
483
484 Default: i386 amd64 arm ppc sparc alpha
485
486 =cut
487
488 set_default(\%config,'default_architectures',
489             [qw(i386 amd64 arm powerpc sparc alpha)]
490            );
491
492 =item affects_distribution_tags
493
494 List of tags which restrict the buggy state to a set of distributions.
495
496 The set of distributions that are buggy is the intersection of the set
497 of distributions that would be buggy without reference to these tags
498 and the set of these tags that are distributions which are set on a
499 bug.
500
501 Setting this to [] will remove this feature.
502
503 Default: @{$config{distributions}}
504
505 =cut
506
507 set_default(\%config,'affects_distribution_tags',
508             [@{$config{distributions}}],
509            );
510
511 =item removal_unremovable_tags
512
513 Bugs which have these tags set cannot be archived
514
515 Default: []
516
517 =cut
518
519 set_default(\%config,'removal_unremovable_tags',
520             [],
521            );
522
523 =item removal_distribution_tags
524
525 Tags which specifiy distributions to check
526
527 Default: @{$config{distributions}}
528
529 =cut
530
531 set_default(\%config,'removal_distribution_tags',
532             [@{$config{distributions}}]);
533
534 =item removal_default_distribution_tags
535
536 For removal/archival purposes, all bugs are assumed to have these tags
537 set.
538
539 Default: qw(experimental unstable testing);
540
541 =cut
542
543 set_default(\%config,'removal_default_distribution_tags',
544             [qw(experimental unstable testing)]
545            );
546
547 =item removal_strong_severity_default_distribution_tags
548
549 For removal/archival purposes, all bugs with strong severity are
550 assumed to have these tags set.
551
552 Default: qw(experimental unstable testing stable);
553
554 =cut
555
556 set_default(\%config,'removal_strong_severity_default_distribution_tags',
557             [qw(experimental unstable testing stable)]
558            );
559
560
561 =item removal_architectures
562
563 For removal/archival purposes, these architectures are consulted if
564 there is more than one architecture applicable. If the bug is in a
565 package not in any of these architectures, the architecture actually
566 checked is undefined.
567
568 Default: value of default_architectures
569
570 =cut
571
572 set_default(\%config,'removal_architectures',
573             $config{default_architectures},
574            );
575
576
577 =item package_name_re
578
579 The regex which will match a package name
580
581 Default: '[a-z0-9][a-z0-9\.+-]+'
582
583 =cut
584
585 set_default(\%config,'package_name_re',
586             '[a-z0-9][a-z0-9\.+-]+');
587
588 =item package_version_re
589
590 The regex which will match a package version
591
592 Default: '[A-Za-z0-9:+\.-]+'
593
594 =cut
595
596
597 set_default(\%config,'package_version_re',
598             '[A-Za-z0-9:+\.~-]+');
599
600
601 =item default_package
602
603 This is the name of the default package. If set, bugs assigned to
604 packages without a maintainer and bugs missing a Package: psuedoheader
605 will be assigned to this package instead.
606
607 Defaults to unset, which is the traditional debbugs behavoir
608
609 =cut
610
611 set_default(\%config,'default_package',
612             undef
613            );
614
615
616 =item control_internal_requester
617
618 This address is used by Debbugs::Control as the request address which
619 sent a control request for faked log messages.
620
621 Default:"Debbugs Internal Request <$config{maintainer_email}>"
622
623 =cut
624
625 set_default(\%config,'control_internal_requester',
626             "Debbugs Internal Request <$config{maintainer_email}>",
627            );
628
629 =item control_internal_request_addr
630
631 This address is used by Debbugs::Control as the address to which a
632 faked log message request was sent.
633
634 Default: "internal_control\@$config{email_domain}";
635
636 =cut
637
638 set_default(\%config,'control_internal_request_addr',
639             'internal_control@'.$config{email_domain},
640            );
641
642
643 =item exclude_from_control
644
645 Addresses which are not allowed to send messages to control
646
647 =cut
648
649 set_default(\%config,'exclude_from_control',[]);
650
651
652
653 =item default_severity
654
655 The default severity of bugs which have no severity set
656
657 Default: normal
658
659 =cut
660
661 set_default(\%config,'default_severity','normal');
662
663 =item severity_display
664
665 A hashref of severities and the informative text which describes them.
666
667 Default:
668
669  {critical => "Critical $config{bugs}",
670   grave    => "Grave $config{bugs}",
671   normal   => "Normal $config{bugs}",
672   wishlist => "Wishlist $config{bugs}",
673  }
674
675 =cut
676
677 set_default(\%config,'severity_display',{critical => "Critical $config{bugs}",
678                                          grave    => "Grave $config{bugs}",
679                                          serious  => "Serious $config{bugs}",
680                                          important=> "Important $config{bugs}",
681                                          normal   => "Normal $config{bugs}",
682                                          minor    => "Minor $config{bugs}",
683                                          wishlist => "Wishlist $config{bugs}",
684                                         });
685
686 =item show_severities
687
688 A scalar list of the severities to show
689
690 Defaults to the concatenation of the keys of the severity_display
691 hashlist with ', ' above.
692
693 =cut
694
695 set_default(\%config,'show_severities',join(', ',keys %{$config{severity_display}}));
696
697 =item strong_severities
698
699 An arrayref of the serious severities which shoud be emphasized
700
701 Default: [qw(critical grave)]
702
703 =cut
704
705 set_default(\%config,'strong_severities',[qw(critical grave)]);
706
707 =item severity_list
708
709 An arrayref of a list of the severities
710
711 Defaults to the keys of the severity display hashref
712
713 =cut
714
715 set_default(\%config,'severity_list',[keys %{$config{severity_display}}]);
716
717 =item obsolete_severities
718
719 A hashref of obsolete severities with the replacing severity
720
721 Default: {}
722
723 =cut
724
725 set_default(\%config,'obsolete_severities',{});
726
727 =item tags
728
729 An arrayref of the tags used
730
731 Default: [qw(patch wontfix moreinfo unreproducible fixed)] and also
732 includes the distributions.
733
734 =cut
735
736 set_default(\%config,'tags',[qw(patch wontfix moreinfo unreproducible fixed),
737                              @{$config{distributions}}
738                             ]);
739
740 set_default(\%config,'tags_single_letter',
741             {patch => '+',
742              wontfix => '',
743              moreinfo => 'M',
744              unreproducible => 'R',
745              fixed   => 'F',
746             }
747            );
748
749 set_default(\%config,'bounce_froms','^mailer|^da?emon|^post.*mast|^root|^wpuser|^mmdf|^smt.*|'.
750             '^mrgate|^vmmail|^mail.*system|^uucp|-maiser-|^mal\@|'.
751             '^mail.*agent|^tcpmail|^bitmail|^mailman');
752
753 set_default(\%config,'config_dir',dirname(exists $ENV{DEBBUGS_CONFIG_FILE}?$ENV{DEBBUGS_CONFIG_FILE}:'/etc/debbugs/config'));
754 set_default(\%config,'spool_dir','/var/lib/debbugs/spool');
755
756 =item usertag_dir
757
758 Directory which contains the usertags
759
760 Default: $config{spool_dir}/user
761
762 =cut
763
764 set_default(\%config,'usertag_dir',$config{spool_dir}.'/user');
765 set_default(\%config,'incoming_dir','incoming');
766
767 =item web_dir $gWebDir
768
769 Directory where base html files are kept. Should normally be the same
770 as the web server's document root.
771
772 Default: /var/lib/debbugs/www
773
774 =cut
775
776 set_default(\%config,'web_dir','/var/lib/debbugs/www');
777 set_default(\%config,'doc_dir','/var/lib/debbugs/www/txt');
778 set_default(\%config,'lib_path','/usr/lib/debbugs');
779
780
781 =item template_dir
782
783 directory of templates; defaults to /usr/share/debbugs/templates.
784
785 =cut
786
787 set_default(\%config,'template_dir','/usr/share/debbugs/templates');
788
789
790 set_default(\%config,'maintainer_file',$config{config_dir}.'/Maintainers');
791 set_default(\%config,'maintainer_file_override',$config{config_dir}.'/Maintainers.override');
792 set_default(\%config,'source_maintainer_file',$config{config_dir}.'/Source_maintainers');
793 set_default(\%config,'source_maintainer_file_override',undef);
794 set_default(\%config,'pseudo_maint_file',$config{config_dir}.'/pseudo-packages.maintainers');
795 set_default(\%config,'pseudo_desc_file',$config{config_dir}.'/pseudo-packages.description');
796 set_default(\%config,'package_source',$config{config_dir}.'/indices/sources');
797
798
799 =item simple_versioning
800
801 If true this causes debbugs to ignore version information and just
802 look at whether a bug is done or not done. Primarily of interest for
803 debbugs installs which don't track versions. defaults to false.
804
805 =cut
806
807 set_default(\%config,'simple_versioning',0);
808
809
810 =item version_packages_dir
811
812 Location where the version package information is kept; defaults to
813 spool_dir/../versions/pkg
814
815 =cut
816
817 set_default(\%config,'version_packages_dir',$config{spool_dir}.'/../versions/pkg');
818
819 =item version_time_index
820
821 Location of the version/time index file. Defaults to
822 spool_dir/../versions/idx/versions_time.idx if spool_dir/../versions
823 exists; otherwise defaults to undef.
824
825 =cut
826
827
828 set_default(\%config,'version_time_index', -d $config{spool_dir}.'/../versions' ? $config{spool_dir}.'/../versions/indices/versions_time.idx' : undef);
829
830 =item version_index
831
832 Location of the version index file. Defaults to
833 spool_dir/../versions/indices/versions.idx if spool_dir/../versions
834 exists; otherwise defaults to undef.
835
836 =cut
837
838 set_default(\%config,'version_index',-d $config{spool_dir}.'/../versions' ? $config{spool_dir}.'/../versions/indices/versions.idx' : undef);
839
840 =item binary_source_map
841
842 Location of the binary -> source map. Defaults to
843 spool_dir/../versions/indices/bin2src.idx if spool_dir/../versions
844 exists; otherwise defaults to undef.
845
846 =cut
847
848 set_default(\%config,'binary_source_map',-d $config{spool_dir}.'/../versions' ? $config{spool_dir}.'/../versions/indices/binsrc.idx' : undef);
849
850 =item source_binary_map
851
852 Location of the source -> binary map. Defaults to
853 spool_dir/../versions/indices/src2bin.idx if spool_dir/../versions
854 exists; otherwise defaults to undef.
855
856 =cut
857
858 set_default(\%config,'source_binary_map',-d $config{spool_dir}.'/../versions' ? $config{spool_dir}.'/../versions/indices/srcbin.idx' : undef);
859
860
861
862 set_default(\%config,'post_processall',[]);
863
864 =item sendmail
865
866 Sets the sendmail binary to execute; defaults to /usr/lib/sendmail
867
868 =cut
869
870 set_default(\%config,'sendmail','/usr/lib/sendmail');
871
872 =item sendmail_arguments
873
874 Default arguments to pass to sendmail. Defaults to C<qw(-oem -oi)>.
875
876 =cut
877
878 set_default(\%config,'sendmail_arguments',[qw(-oem -oi)]);
879
880 =item spam_scan
881
882 Whether or not spamscan is being used; defaults to 0 (not being used
883
884 =cut
885
886 set_default(\%config,'spam_scan',0);
887
888 =item spam_crossassassin_db
889
890 Location of the crosassassin database, defaults to
891 spool_dir/../CrossAssassinDb
892
893 =cut
894
895 set_default(\%config,'spam_crossassassin_db',$config{spool_dir}.'/../CrossAssassinDb');
896
897 =item spam_max_cross
898
899 Maximum number of cross-posted messages
900
901 =cut
902
903 set_default(\%config,'spam_max_cross',6);
904
905
906 =item spam_spams_per_thread
907
908 Number of spams for each thread (on average). Defaults to 200
909
910 =cut
911
912 set_default(\%config,'spam_spams_per_thread',200);
913
914 =item spam_max_threads
915
916 Maximum number of threads to start. Defaults to 20
917
918 =cut
919
920 set_default(\%config,'spam_max_threads',20);
921
922 =item spam_keep_running
923
924 Maximum number of seconds to run without restarting. Defaults to 3600.
925
926 =cut
927
928 set_default(\%config,'spam_keep_running',3600);
929
930 =item spam_mailbox
931
932 Location to store spam messages; is run through strftime to allow for
933 %d,%m,%Y, et al. Defaults to 'spool_dir/../mail/spam/assassinated.%Y-%m-%d'
934
935 =cut
936
937 set_default(\%config,'spam_mailbox',$config{spool_dir}.'/../mail/spam/assassinated.%Y-%m-%d');
938
939 =item spam_crossassassin_mailbox
940
941 Location to store crossassassinated messages; is run through strftime
942 to allow for %d,%m,%Y, et al. Defaults to
943 'spool_dir/../mail/spam/crossassassinated.%Y-%m-%d'
944
945 =cut
946
947 set_default(\%config,'spam_crossassassin_mailbox',$config{spool_dir}.'/../mail/spam/crossassassinated.%Y-%m-%d');
948
949 =item spam_local_tests_only
950
951 Whether only local tests are run, defaults to 0
952
953 =cut
954
955 set_default(\%config,'spam_local_tests_only',0);
956
957 =item spam_user_prefs
958
959 User preferences for spamassassin, defaults to $ENV{HOME}/.spamassassin/user_prefs
960
961 =cut
962
963 set_default(\%config,'spam_user_prefs',"$ENV{HOME}/.spamassassin/user_prefs");
964
965 =item spam_rules_dir
966
967 Site rules directory for spamassassin, defaults to
968 '/usr/share/spamassassin'
969
970 =cut
971
972 set_default(\%config,'spam_rules_dir','/usr/share/spamassassin');
973
974 =back
975
976 =head2 CGI Options
977
978 =over
979
980 =item libravatar_uri $gLibravatarUri
981
982 URI to a libravatar configuration. If empty or undefined, libravatar
983 support will be disabled. Defaults to
984 libravatar.cgi, our internal federated libravatar system.
985
986 =cut
987
988 set_default(\%config,'libravatar_uri',$config{cgi_domain}.'/libravatar.cgi?email=');
989
990 =item libravatar_uri_options $gLibravatarUriOptions
991
992 Options to append to the md5_hex of the e-mail. This sets the default
993 avatar used when an avatar isn't available. Currently defaults to
994 '?d=retro', which causes a bitmap-looking avatar to be displayed for
995 unknown e-mails.
996
997 Other options which make sense include ?d=404, ?d=wavatar, etc. See
998 the API of libravatar for details.
999
1000 =cut
1001
1002 set_default(\%config,'libravatar_uri_options','');
1003
1004 =item libravatar_default_image
1005
1006 Default image to serve for libravatar if there is no avatar for an
1007 e-mail address. By default, this is a 1x1 png. [This will also be the
1008 image served if someone specifies avatar=no.]
1009
1010 Default: $config{web_dir}/1x1.png
1011
1012 =cut
1013
1014 set_default(\%config,'libravatar_default_image',$config{web_dir}.'/1x1.png');
1015
1016 =item libravatar_cache_dir
1017
1018 Directory where cached libravatar images are stored
1019
1020 Default: $config{web_dir}/libravatar/
1021
1022 =cut
1023
1024 set_default(\%config,'libravatar_cache_dir',$config{web_dir}.'/libravatar/');
1025
1026 =item libravatar_blacklist
1027
1028 Array of regular expressions to match against emails, domains, or
1029 images to only show the default image
1030
1031 Default: empty array
1032
1033 =cut
1034
1035 set_default(\%config,'libravatar_blacklist',[]);
1036
1037 =back
1038
1039 =head2 Text Fields
1040
1041 The following are the only text fields in general use in the scripts;
1042 a few additional text fields are defined in text.in, but are only used
1043 in db2html and a few other specialty scripts.
1044
1045 Earlier versions of debbugs defined these values in /etc/debbugs/text,
1046 but now they are required to be in the configuration file. [Eventually
1047 the longer ones will move out into a fully fledged template system.]
1048
1049 =cut
1050
1051 =over
1052
1053 =item bad_email_prefix
1054
1055 This prefixes the text of all lines in a bad e-mail message ack.
1056
1057 =cut
1058
1059 set_default(\%config,'bad_email_prefix','');
1060
1061
1062 =item text_instructions
1063
1064 This gives more information about bad e-mails to receive.in
1065
1066 =cut
1067
1068 set_default(\%config,'text_instructions',$config{bad_email_prefix});
1069
1070 =item html_tail
1071
1072 This shows up at the end of (most) html pages
1073
1074 In many pages this has been replaced by the html/tail template.
1075
1076 =cut
1077
1078 set_default(\%config,'html_tail',<<END);
1079  <ADDRESS>$config{maintainer} &lt;<A HREF=\"mailto:$config{maintainer_email}\">$config{maintainer_email}</A>&gt;.
1080  Last modified:
1081  <!--timestamp-->
1082  SUBSTITUTE_DTIME
1083  <!--timestamp-->
1084  <P>
1085  <A HREF=\"$config{web_domain}/\">Debian $config{bug} tracking system</A><BR>
1086  Copyright (C) 1999 Darren O. Benham,
1087  1997,2003 nCipher Corporation Ltd,
1088  1994-97 Ian Jackson.
1089  </P>
1090  </ADDRESS>
1091 END
1092
1093
1094 =item html_expire_note
1095
1096 This message explains what happens to archive/remove-able bugs
1097
1098 =cut
1099
1100 set_default(\%config,'html_expire_note',
1101             "(Closed $config{bugs} are archived $config{remove_age} days after the last related message is received.)");
1102
1103 =back
1104
1105 =cut
1106
1107
1108 sub read_config{
1109      my ($conf_file) = @_;
1110      if (not -e $conf_file) {
1111          print STDERR "configuration file '$conf_file' doesn't exist; skipping it\n" if $DEBUG;
1112          return;
1113      }
1114      # first, figure out what type of file we're reading in.
1115      my $fh = new IO::File $conf_file,'r'
1116           or die "Unable to open configuration file $conf_file for reading: $!";
1117      # A new version configuration file must have a comment as its first line
1118      my $first_line = <$fh>;
1119      my ($version) = defined $first_line?$first_line =~ /VERSION:\s*(\d+)/i:undef;
1120      if (defined $version) {
1121           if ($version == 1) {
1122                # Do something here;
1123                die "Version 1 configuration files not implemented yet";
1124           }
1125           else {
1126                die "Version $version configuration files are not supported";
1127           }
1128      }
1129      else {
1130           # Ugh. Old configuration file
1131           # What we do here is we create a new Safe compartment
1132           # so fucked up crap in the config file doesn't sink us.
1133           my $cpt = new Safe or die "Unable to create safe compartment";
1134           # perldoc Opcode; for details
1135           $cpt->permit('require',':filesys_read','entereval','caller','pack','unpack','dofile');
1136           $cpt->reval(qq(require '$conf_file';));
1137           die "Error in configuration file: $@" if $@;
1138           # Now what we do is check out the contents of %EXPORT_TAGS to see exactly which variables
1139           # we want to glob in from the configuration file
1140           for my $variable (map {$_ =~ /^(?:config|all)$/ ? () : @{$EXPORT_TAGS{$_}}} keys %EXPORT_TAGS) {
1141                my ($hash_name,$glob_name,$glob_type) = __convert_name($variable);
1142                my $var_glob = $cpt->varglob($glob_name);
1143                my $value; #= $cpt->reval("return $variable");
1144                # print STDERR "$variable $value",qq(\n);
1145                if (defined $var_glob) {{
1146                     no strict 'refs';
1147                     if ($glob_type eq '%') {
1148                          $value = {%{*{$var_glob}}} if defined *{$var_glob}{HASH};
1149                     }
1150                     elsif ($glob_type eq '@') {
1151                          $value = [@{*{$var_glob}}] if defined *{$var_glob}{ARRAY};
1152                     }
1153                     else {
1154                          $value = ${*{$var_glob}};
1155                     }
1156                     # We punt here, because we can't tell if the value was
1157                     # defined intentionally, or if it was just left alone;
1158                     # this tries to set sane defaults.
1159                     set_default(\%config,$hash_name,$value) if defined $value;
1160                }}
1161           }
1162      }
1163 }
1164
1165 sub __convert_name{
1166      my ($variable) = @_;
1167      my $hash_name = $variable;
1168      $hash_name =~ s/^([\$\%\@])g//;
1169      my $glob_type = $1;
1170      my $glob_name = 'g'.$hash_name;
1171      $hash_name =~ s/(HTML|CGI|CVE)/ucfirst(lc($1))/ge;
1172      $hash_name =~ s/^([A-Z]+)/lc($1)/e;
1173      $hash_name =~ s/([A-Z]+)/'_'.lc($1)/ge;
1174      return $hash_name unless wantarray;
1175      return ($hash_name,$glob_name,$glob_type);
1176 }
1177
1178 # set_default
1179
1180 # sets the configuration hash to the default value if it's not set,
1181 # otherwise doesn't do anything
1182 # If $USING_GLOBALS, then sets an appropriate global.
1183
1184 sub set_default{
1185      my ($config,$option,$value) = @_;
1186      my $varname;
1187      if ($USING_GLOBALS) {
1188           # fix up the variable name
1189           $varname = 'g'.join('',map {ucfirst $_} split /_/, $option);
1190           # Fix stupid HTML names
1191           $varname =~ s/(Html|Cgi)/uc($1)/ge;
1192      }
1193      # update the configuration value
1194      if (not $USING_GLOBALS and not exists $config->{$option}) {
1195           $config->{$option} = $value;
1196      }
1197      elsif ($USING_GLOBALS) {{
1198           no strict 'refs';
1199           # Need to check if a value has already been set in a global
1200           if (defined *{"Debbugs::Config::${varname}"}) {
1201                $config->{$option} = *{"Debbugs::Config::${varname}"};
1202           }
1203           else {
1204                $config->{$option} = $value;
1205           }
1206      }}
1207      if ($USING_GLOBALS) {{
1208           no strict 'refs';
1209           *{"Debbugs::Config::${varname}"} = $config->{$option};
1210      }}
1211 }
1212
1213
1214 ### import magick
1215
1216 # All we care about here is whether we've been called with the globals or text option;
1217 # if so, then we need to export some symbols back up.
1218 # In any event, we call exporter.
1219
1220 sub import {
1221      if (grep /^:(?:text|globals)$/, @_) {
1222           $USING_GLOBALS=1;
1223           for my $variable (map {@$_} @EXPORT_TAGS{map{(/^:(text|globals)$/?($1):())} @_}) {
1224                my $tmp = $variable;
1225                no strict 'refs';
1226                # Yes, I don't care if these are only used once
1227                no warnings 'once';
1228                # No, it doesn't bother me that I'm assigning an undefined value to a typeglob
1229                no warnings 'misc';
1230                my ($hash_name,$glob_name,$glob_type) = __convert_name($variable);
1231                $tmp =~ s/^[\%\$\@]//;
1232                *{"Debbugs::Config::${tmp}"} = ref($config{$hash_name})?$config{$hash_name}:\$config{$hash_name};
1233           }
1234      }
1235      Debbugs::Config->export_to_level(1,@_);
1236 }
1237
1238
1239 1;