]> git.donarmstrong.com Git - debbugs.git/blob - Debbugs/Config.pm
add envelope_from option so a valid user can be set
[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 envelope_from
881
882 Envelope from to use for sent messages. If not set, whatever sendmail picks is
883 used.
884
885 =cut
886
887 set_default(\%config,'envelope_from',undef);
888
889 =item spam_scan
890
891 Whether or not spamscan is being used; defaults to 0 (not being used
892
893 =cut
894
895 set_default(\%config,'spam_scan',0);
896
897 =item spam_crossassassin_db
898
899 Location of the crosassassin database, defaults to
900 spool_dir/../CrossAssassinDb
901
902 =cut
903
904 set_default(\%config,'spam_crossassassin_db',$config{spool_dir}.'/../CrossAssassinDb');
905
906 =item spam_max_cross
907
908 Maximum number of cross-posted messages
909
910 =cut
911
912 set_default(\%config,'spam_max_cross',6);
913
914
915 =item spam_spams_per_thread
916
917 Number of spams for each thread (on average). Defaults to 200
918
919 =cut
920
921 set_default(\%config,'spam_spams_per_thread',200);
922
923 =item spam_max_threads
924
925 Maximum number of threads to start. Defaults to 20
926
927 =cut
928
929 set_default(\%config,'spam_max_threads',20);
930
931 =item spam_keep_running
932
933 Maximum number of seconds to run without restarting. Defaults to 3600.
934
935 =cut
936
937 set_default(\%config,'spam_keep_running',3600);
938
939 =item spam_mailbox
940
941 Location to store spam messages; is run through strftime to allow for
942 %d,%m,%Y, et al. Defaults to 'spool_dir/../mail/spam/assassinated.%Y-%m-%d'
943
944 =cut
945
946 set_default(\%config,'spam_mailbox',$config{spool_dir}.'/../mail/spam/assassinated.%Y-%m-%d');
947
948 =item spam_crossassassin_mailbox
949
950 Location to store crossassassinated messages; is run through strftime
951 to allow for %d,%m,%Y, et al. Defaults to
952 'spool_dir/../mail/spam/crossassassinated.%Y-%m-%d'
953
954 =cut
955
956 set_default(\%config,'spam_crossassassin_mailbox',$config{spool_dir}.'/../mail/spam/crossassassinated.%Y-%m-%d');
957
958 =item spam_local_tests_only
959
960 Whether only local tests are run, defaults to 0
961
962 =cut
963
964 set_default(\%config,'spam_local_tests_only',0);
965
966 =item spam_user_prefs
967
968 User preferences for spamassassin, defaults to $ENV{HOME}/.spamassassin/user_prefs
969
970 =cut
971
972 set_default(\%config,'spam_user_prefs',"$ENV{HOME}/.spamassassin/user_prefs");
973
974 =item spam_rules_dir
975
976 Site rules directory for spamassassin, defaults to
977 '/usr/share/spamassassin'
978
979 =cut
980
981 set_default(\%config,'spam_rules_dir','/usr/share/spamassassin');
982
983 =back
984
985 =head2 CGI Options
986
987 =over
988
989 =item libravatar_uri $gLibravatarUri
990
991 URI to a libravatar configuration. If empty or undefined, libravatar
992 support will be disabled. Defaults to
993 libravatar.cgi, our internal federated libravatar system.
994
995 =cut
996
997 set_default(\%config,'libravatar_uri',$config{cgi_domain}.'/libravatar.cgi?email=');
998
999 =item libravatar_uri_options $gLibravatarUriOptions
1000
1001 Options to append to the md5_hex of the e-mail. This sets the default
1002 avatar used when an avatar isn't available. Currently defaults to
1003 '?d=retro', which causes a bitmap-looking avatar to be displayed for
1004 unknown e-mails.
1005
1006 Other options which make sense include ?d=404, ?d=wavatar, etc. See
1007 the API of libravatar for details.
1008
1009 =cut
1010
1011 set_default(\%config,'libravatar_uri_options','');
1012
1013 =item libravatar_default_image
1014
1015 Default image to serve for libravatar if there is no avatar for an
1016 e-mail address. By default, this is a 1x1 png. [This will also be the
1017 image served if someone specifies avatar=no.]
1018
1019 Default: $config{web_dir}/1x1.png
1020
1021 =cut
1022
1023 set_default(\%config,'libravatar_default_image',$config{web_dir}.'/1x1.png');
1024
1025 =item libravatar_cache_dir
1026
1027 Directory where cached libravatar images are stored
1028
1029 Default: $config{web_dir}/libravatar/
1030
1031 =cut
1032
1033 set_default(\%config,'libravatar_cache_dir',$config{web_dir}.'/libravatar/');
1034
1035 =item libravatar_blacklist
1036
1037 Array of regular expressions to match against emails, domains, or
1038 images to only show the default image
1039
1040 Default: empty array
1041
1042 =cut
1043
1044 set_default(\%config,'libravatar_blacklist',[]);
1045
1046 =back
1047
1048 =head2 Text Fields
1049
1050 The following are the only text fields in general use in the scripts;
1051 a few additional text fields are defined in text.in, but are only used
1052 in db2html and a few other specialty scripts.
1053
1054 Earlier versions of debbugs defined these values in /etc/debbugs/text,
1055 but now they are required to be in the configuration file. [Eventually
1056 the longer ones will move out into a fully fledged template system.]
1057
1058 =cut
1059
1060 =over
1061
1062 =item bad_email_prefix
1063
1064 This prefixes the text of all lines in a bad e-mail message ack.
1065
1066 =cut
1067
1068 set_default(\%config,'bad_email_prefix','');
1069
1070
1071 =item text_instructions
1072
1073 This gives more information about bad e-mails to receive.in
1074
1075 =cut
1076
1077 set_default(\%config,'text_instructions',$config{bad_email_prefix});
1078
1079 =item html_tail
1080
1081 This shows up at the end of (most) html pages
1082
1083 In many pages this has been replaced by the html/tail template.
1084
1085 =cut
1086
1087 set_default(\%config,'html_tail',<<END);
1088  <ADDRESS>$config{maintainer} &lt;<A HREF=\"mailto:$config{maintainer_email}\">$config{maintainer_email}</A>&gt;.
1089  Last modified:
1090  <!--timestamp-->
1091  SUBSTITUTE_DTIME
1092  <!--timestamp-->
1093  <P>
1094  <A HREF=\"$config{web_domain}/\">Debian $config{bug} tracking system</A><BR>
1095  Copyright (C) 1999 Darren O. Benham,
1096  1997,2003 nCipher Corporation Ltd,
1097  1994-97 Ian Jackson.
1098  </P>
1099  </ADDRESS>
1100 END
1101
1102
1103 =item html_expire_note
1104
1105 This message explains what happens to archive/remove-able bugs
1106
1107 =cut
1108
1109 set_default(\%config,'html_expire_note',
1110             "(Closed $config{bugs} are archived $config{remove_age} days after the last related message is received.)");
1111
1112 =back
1113
1114 =cut
1115
1116
1117 sub read_config{
1118      my ($conf_file) = @_;
1119      if (not -e $conf_file) {
1120          print STDERR "configuration file '$conf_file' doesn't exist; skipping it\n" if $DEBUG;
1121          return;
1122      }
1123      # first, figure out what type of file we're reading in.
1124      my $fh = new IO::File $conf_file,'r'
1125           or die "Unable to open configuration file $conf_file for reading: $!";
1126      # A new version configuration file must have a comment as its first line
1127      my $first_line = <$fh>;
1128      my ($version) = defined $first_line?$first_line =~ /VERSION:\s*(\d+)/i:undef;
1129      if (defined $version) {
1130           if ($version == 1) {
1131                # Do something here;
1132                die "Version 1 configuration files not implemented yet";
1133           }
1134           else {
1135                die "Version $version configuration files are not supported";
1136           }
1137      }
1138      else {
1139           # Ugh. Old configuration file
1140           # What we do here is we create a new Safe compartment
1141           # so fucked up crap in the config file doesn't sink us.
1142           my $cpt = new Safe or die "Unable to create safe compartment";
1143           # perldoc Opcode; for details
1144           $cpt->permit('require',':filesys_read','entereval','caller','pack','unpack','dofile');
1145           $cpt->reval(qq(require '$conf_file';));
1146           die "Error in configuration file: $@" if $@;
1147           # Now what we do is check out the contents of %EXPORT_TAGS to see exactly which variables
1148           # we want to glob in from the configuration file
1149           for my $variable (map {$_ =~ /^(?:config|all)$/ ? () : @{$EXPORT_TAGS{$_}}} keys %EXPORT_TAGS) {
1150                my ($hash_name,$glob_name,$glob_type) = __convert_name($variable);
1151                my $var_glob = $cpt->varglob($glob_name);
1152                my $value; #= $cpt->reval("return $variable");
1153                # print STDERR "$variable $value",qq(\n);
1154                if (defined $var_glob) {{
1155                     no strict 'refs';
1156                     if ($glob_type eq '%') {
1157                          $value = {%{*{$var_glob}}} if defined *{$var_glob}{HASH};
1158                     }
1159                     elsif ($glob_type eq '@') {
1160                          $value = [@{*{$var_glob}}] if defined *{$var_glob}{ARRAY};
1161                     }
1162                     else {
1163                          $value = ${*{$var_glob}};
1164                     }
1165                     # We punt here, because we can't tell if the value was
1166                     # defined intentionally, or if it was just left alone;
1167                     # this tries to set sane defaults.
1168                     set_default(\%config,$hash_name,$value) if defined $value;
1169                }}
1170           }
1171      }
1172 }
1173
1174 sub __convert_name{
1175      my ($variable) = @_;
1176      my $hash_name = $variable;
1177      $hash_name =~ s/^([\$\%\@])g//;
1178      my $glob_type = $1;
1179      my $glob_name = 'g'.$hash_name;
1180      $hash_name =~ s/(HTML|CGI|CVE)/ucfirst(lc($1))/ge;
1181      $hash_name =~ s/^([A-Z]+)/lc($1)/e;
1182      $hash_name =~ s/([A-Z]+)/'_'.lc($1)/ge;
1183      return $hash_name unless wantarray;
1184      return ($hash_name,$glob_name,$glob_type);
1185 }
1186
1187 # set_default
1188
1189 # sets the configuration hash to the default value if it's not set,
1190 # otherwise doesn't do anything
1191 # If $USING_GLOBALS, then sets an appropriate global.
1192
1193 sub set_default{
1194      my ($config,$option,$value) = @_;
1195      my $varname;
1196      if ($USING_GLOBALS) {
1197           # fix up the variable name
1198           $varname = 'g'.join('',map {ucfirst $_} split /_/, $option);
1199           # Fix stupid HTML names
1200           $varname =~ s/(Html|Cgi)/uc($1)/ge;
1201      }
1202      # update the configuration value
1203      if (not $USING_GLOBALS and not exists $config->{$option}) {
1204           $config->{$option} = $value;
1205      }
1206      elsif ($USING_GLOBALS) {{
1207           no strict 'refs';
1208           # Need to check if a value has already been set in a global
1209           if (defined *{"Debbugs::Config::${varname}"}) {
1210                $config->{$option} = *{"Debbugs::Config::${varname}"};
1211           }
1212           else {
1213                $config->{$option} = $value;
1214           }
1215      }}
1216      if ($USING_GLOBALS) {{
1217           no strict 'refs';
1218           *{"Debbugs::Config::${varname}"} = $config->{$option};
1219      }}
1220 }
1221
1222
1223 ### import magick
1224
1225 # All we care about here is whether we've been called with the globals or text option;
1226 # if so, then we need to export some symbols back up.
1227 # In any event, we call exporter.
1228
1229 sub import {
1230      if (grep /^:(?:text|globals)$/, @_) {
1231           $USING_GLOBALS=1;
1232           for my $variable (map {@$_} @EXPORT_TAGS{map{(/^:(text|globals)$/?($1):())} @_}) {
1233                my $tmp = $variable;
1234                no strict 'refs';
1235                # Yes, I don't care if these are only used once
1236                no warnings 'once';
1237                # No, it doesn't bother me that I'm assigning an undefined value to a typeglob
1238                no warnings 'misc';
1239                my ($hash_name,$glob_name,$glob_type) = __convert_name($variable);
1240                $tmp =~ s/^[\%\$\@]//;
1241                *{"Debbugs::Config::${tmp}"} = ref($config{$hash_name})?$config{$hash_name}:\$config{$hash_name};
1242           }
1243      }
1244      Debbugs::Config->export_to_level(1,@_);
1245 }
1246
1247
1248 1;