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