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