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