summaryrefslogtreecommitdiff
blob: 1d49b8d6ac107a5318d54c5e9a7e28802e26e511 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.

package Bugzilla::Constants;

use 5.10.1;
use strict;
use warnings;

use parent qw(Exporter);

# For bz_locations
use File::Basename;
use Memoize;

@Bugzilla::Constants::EXPORT = qw(
  BUGZILLA_VERSION
  REST_DOC

  REMOTE_FILE
  LOCAL_FILE

  bz_locations

  CONCATENATE_ASSETS

  IS_NULL
  NOT_NULL

  CONTROLMAPNA
  CONTROLMAPSHOWN
  CONTROLMAPDEFAULT
  CONTROLMAPMANDATORY

  AUTH_OK
  AUTH_NODATA
  AUTH_ERROR
  AUTH_LOGINFAILED
  AUTH_DISABLED
  AUTH_NO_SUCH_USER
  AUTH_LOCKOUT
  AUTH_RH_RADIUS_LOGINFAILED

  USER_PASSWORD_MIN_LENGTH

  LOGIN_OPTIONAL
  LOGIN_NORMAL
  LOGIN_REQUIRED

  LOGOUT_ALL
  LOGOUT_CURRENT
  LOGOUT_KEEP_CURRENT

  GRANT_DIRECT
  GRANT_REGEXP

  GROUP_MEMBERSHIP
  GROUP_BLESS
  GROUP_VISIBLE

  MAILTO_USER
  MAILTO_GROUP

  DEFAULT_COLUMN_LIST
  DEFAULT_QUERY_NAME
  DEFAULT_MILESTONE
  DEFAULT_RELEASE

  SAVE_NUM_SEARCHES

  COMMENT_COLS
  MAX_COMMENT_LENGTH

  MIN_COMMENT_TAG_LENGTH
  MAX_COMMENT_TAG_LENGTH

  CMT_NORMAL
  CMT_DUPE_OF
  CMT_HAS_DUPE
  CMT_ATTACHMENT_CREATED
  CMT_ATTACHMENT_UPDATED

  THROW_ERROR

  RELATIONSHIPS
  REL_ASSIGNEE REL_QA REL_REPORTER REL_CC REL_GLOBAL_WATCHER REL_DOCS
  REL_ANY

  POS_EVENTS
  EVT_OTHER EVT_ADDED_REMOVED EVT_COMMENT EVT_ATTACHMENT EVT_ATTACHMENT_DATA
  EVT_PROJ_MANAGEMENT EVT_OPENED_CLOSED EVT_KEYWORD EVT_CC EVT_DEPEND_BLOCK
  EVT_BUG_CREATED EVT_COMPONENT

  NEG_EVENTS
  EVT_UNCONFIRMED EVT_CHANGED_BY_ME EVT_MINOR_UPDATE

  GLOBAL_EVENTS
  EVT_FLAG_REQUESTED EVT_REQUESTED_FLAG

  ADMIN_GROUP_NAME
  PER_PRODUCT_PRIVILEGES

  SENDMAIL_EXE
  SENDMAIL_PATH

  FIELD_TYPE_UNKNOWN
  FIELD_TYPE_FREETEXT
  FIELD_TYPE_SINGLE_SELECT
  FIELD_TYPE_MULTI_SELECT
  FIELD_TYPE_ONE_SELECT
  FIELD_TYPE_TEXTAREA
  FIELD_TYPE_DATETIME
  FIELD_TYPE_DATE
  FIELD_TYPE_BUG_ID
  FIELD_TYPE_BUG_URLS
  FIELD_TYPE_KEYWORDS
  FIELD_TYPE_INTEGER
  FIELD_TYPE_HIGHEST_PLUS_ONE

  ACCESS_TYPE_VIEW
  ACCESS_TYPE_EDIT
  ACCESS_TYPE_ADMIN

  EMPTY_DATETIME_REGEX

  ABNORMAL_SELECTS

  TIMETRACKING_FIELDS

  USAGE_MODE_BROWSER
  USAGE_MODE_CMDLINE
  USAGE_MODE_XMLRPC
  USAGE_MODE_EMAIL
  USAGE_MODE_JSON
  USAGE_MODE_TEST
  USAGE_MODE_REST

  ERROR_MODE_WEBPAGE
  ERROR_MODE_DIE
  ERROR_MODE_DIE_SOAP_FAULT
  ERROR_MODE_JSON_RPC
  ERROR_MODE_TEST
  ERROR_MODE_REST

  COLOR_ERROR
  COLOR_SUCCESS

  INSTALLATION_MODE_INTERACTIVE
  INSTALLATION_MODE_NON_INTERACTIVE

  DB_MODULE
  ROOT_USER
  ON_WINDOWS
  ON_ACTIVESTATE

  MAX_TOKEN_AGE
  MAX_LOGINCOOKIE_AGE
  MAX_SUDO_TOKEN_AGE
  MAX_LOGIN_ATTEMPTS
  LOGIN_LOCKOUT_INTERVAL
  ACCOUNT_CHANGE_INTERVAL
  MAX_STS_AGE

  SAFE_PROTOCOLS
  LEGAL_CONTENT_TYPES

  MIN_SMALLINT
  MAX_SMALLINT
  MAX_INT_32

  MAX_LEN_QUERY_NAME
  MAX_CLASSIFICATION_SIZE
  MAX_PRODUCT_SIZE
  MAX_MILESTONE_SIZE
  MAX_RELEASE_SIZE
  MAX_COMPONENT_SIZE
  MAX_FIELD_VALUE_SIZE
  MAX_FIELD_LONG_DESC_LENGTH
  MAX_FREETEXT_LENGTH
  MAX_BUG_URL_LENGTH
  MAX_POSSIBLE_DUPLICATES
  MAX_ATTACH_FILENAME_LENGTH
  MAX_QUIP_LENGTH
  MAX_WEBDOT_BUGS

  LOG4PERL_DEFAULT_CONFIG
  PASSWORD_DIGEST_ALGORITHM
  PASSWORD_SALT_LENGTH

  CGI_URI_LIMIT

  PRIVILEGES_REQUIRED_NONE
  PRIVILEGES_REQUIRED_REPORTER
  PRIVILEGES_REQUIRED_ASSIGNEE
  PRIVILEGES_REQUIRED_EMPOWERED

  AUDIT_CREATE
  AUDIT_REMOVE

  MOST_FREQUENT_THRESHOLD

  MAX_LOGINS

  MIN_PASSWORD_STRENGTH
);

@Bugzilla::Constants::EXPORT_OK = qw(contenttypes);

# CONSTANTS
#
# Bugzilla version
use constant BUGZILLA_VERSION => "5.0.4.rh79";

# A base link to the current REST Documentation. We place it here
# as it will need to be updated to whatever the current release is.
use constant REST_DOC => 'https://bugzilla.readthedocs.org/en/5.0/api/';

# Location of the remote and local XML files to track new releases.
use constant REMOTE_FILE => 'http://updates.bugzilla.org/bugzilla-update.xml';
use constant LOCAL_FILE => 'bugzilla-update.xml';    # Relative to datadir.

# When true CSS and JavaScript assets will be concatanted and minified at
# run-time, to reduce the number of requests required to render a page.
# Setting this to a false value can help debugging.
use constant CONCATENATE_ASSETS => 0; # REDHAT EXTENSION 1886846

# These are unique values that are unlikely to match a string or a number,
# to be used in criteria for match() functions and other things. They start
# and end with spaces because most Bugzilla stuff has trim() called on it,
# so this is unlikely to match anything we get out of the DB.
#
# We can't use a reference, because Template Toolkit doesn't work with
# them properly (constants.IS_NULL => {} just returns an empty string instead
# of the reference).
use constant IS_NULL  => '  __IS_NULL__  ';
use constant NOT_NULL => '  __NOT_NULL__  ';

#
# ControlMap constants for group_control_map.
# membercontol:othercontrol => meaning
# Na:Na               => Bugs in this product may not be restricted to this
#                        group.
# Shown:Na            => Members of the group may restrict bugs
#                        in this product to this group.
# Shown:Shown         => Members of the group may restrict bugs
#                        in this product to this group.
#                        Anyone who can enter bugs in this product may initially
#                        restrict bugs in this product to this group.
# Shown:Mandatory     => Members of the group may restrict bugs
#                        in this product to this group.
#                        Non-members who can enter bug in this product
#                        will be forced to restrict it.
# Default:Na          => Members of the group may restrict bugs in this
#                        product to this group and do so by default.
# Default:Default     => Members of the group may restrict bugs in this
#                        product to this group and do so by default and
#                        nonmembers have this option on entry.
# Default:Mandatory   => Members of the group may restrict bugs in this
#                        product to this group and do so by default.
#                        Non-members who can enter bug in this product
#                        will be forced to restrict it.
# Mandatory:Mandatory => Bug will be forced into this group regardless.
# All other combinations are illegal.

use constant CONTROLMAPNA        => 0;
use constant CONTROLMAPSHOWN     => 1;
use constant CONTROLMAPDEFAULT   => 2;
use constant CONTROLMAPMANDATORY => 3;

# See Bugzilla::Auth for docs on AUTH_*, LOGIN_* and LOGOUT_*

use constant AUTH_OK           => 0;
use constant AUTH_NODATA       => 1;
use constant AUTH_ERROR        => 2;
use constant AUTH_LOGINFAILED  => 3;
use constant AUTH_DISABLED     => 4;
use constant AUTH_NO_SUCH_USER => 5;
use constant AUTH_LOCKOUT      => 6;
## REDHAT EXTENSION 1262651 BEGIN
use constant AUTH_RH_RADIUS_LOGINFAILED => 20;
## REDHAT EXTENSION 1262651 END

# The minimum length a password must have.
use constant USER_PASSWORD_MIN_LENGTH => 8;

use constant LOGIN_OPTIONAL => 0;
use constant LOGIN_NORMAL   => 1;
use constant LOGIN_REQUIRED => 2;

use constant LOGOUT_ALL          => 0;
use constant LOGOUT_CURRENT      => 1;
use constant LOGOUT_KEEP_CURRENT => 2;

use constant GRANT_DIRECT => 0;
use constant GRANT_REGEXP => 2;

use constant GROUP_MEMBERSHIP => 0;
use constant GROUP_BLESS      => 1;
use constant GROUP_VISIBLE    => 2;

use constant MAILTO_USER  => 0;
use constant MAILTO_GROUP => 1;

# The default list of columns for buglist.cgi
use constant DEFAULT_COLUMN_LIST => (
  "product",    "component",  "assigned_to", "bug_status",
  "short_desc", "changeddate", "bug_severity"
);

# Used by query.cgi and buglist.cgi as the named-query name
# for the default settings.
use constant DEFAULT_QUERY_NAME => '(Default query)';

# The default "defaultmilestone" created for products.
use constant DEFAULT_MILESTONE => '---';

# The default "defaultrelease" created for products.
use constant DEFAULT_RELEASE => '---';

## REDHAT EXTENSION START 840265
# How many of the user's most recent searches to save.
use constant SAVE_NUM_SEARCHES => 50;
## REDHAT EXTENSION END 840265

# The column width for comment textareas and comments in bugmails.
use constant COMMENT_COLS => 80;

# Used in _check_comment(). Gives the max length allowed for a comment.
use constant MAX_COMMENT_LENGTH => 65535;

# The minimum and maximum length of comment tags.
use constant MIN_COMMENT_TAG_LENGTH => 3;
use constant MAX_COMMENT_TAG_LENGTH => 24;

# The type of bug comments.
use constant CMT_NORMAL   => 0;
use constant CMT_DUPE_OF  => 1;
use constant CMT_HAS_DUPE => 2;

# Type 3 was CMT_POPULAR_VOTES, which moved to the Voting extension.
# Type 4 was CMT_MOVED_TO, which moved to the OldBugMove extension.
use constant CMT_ATTACHMENT_CREATED => 5;
use constant CMT_ATTACHMENT_UPDATED => 6;

# Determine whether a validation routine should return 0 or throw
# an error when the validation fails.
use constant THROW_ERROR => 1;

use constant REL_ASSIGNEE => 0;
use constant REL_QA       => 1;
use constant REL_REPORTER => 2;
use constant REL_CC       => 3;

# REL 4 was REL_VOTER, before it was moved ino an extension.
use constant REL_GLOBAL_WATCHER => 5;

## REDHAT EXTENSION START 876015
use constant REL_DOCS => 9;
## REDHAT EXTENSION END 876015

# We need these strings for the X-Bugzilla-Reasons header
# Note: this hash uses "," rather than "=>" to avoid auto-quoting of the LHS.
# This should be accessed through Bugzilla::BugMail::relationships() instead
# of being accessed directly.
## REDHAT EXTENSION 876015: Add REL_DOCS
use constant RELATIONSHIPS => {
  REL_ASSIGNEE, "AssignedTo", REL_REPORTER,       "Reporter",
  REL_QA,       "QAcontact",  REL_DOCS,           "Docscontact",
  REL_CC,       "CC",         REL_GLOBAL_WATCHER, "GlobalWatcher"
};

# Used for global events like EVT_FLAG_REQUESTED
use constant REL_ANY => 100;

# There are two sorts of event - positive and negative. Positive events are
# those for which the user says "I want mail if this happens." Negative events
# are those for which the user says "I don't want mail if this happens."
#
# Exactly when each event fires is defined in wants_bug_mail() in User.pm; I'm
# not commenting them here in case the comments and the code get out of sync.
use constant EVT_OTHER           => 0;
use constant EVT_ADDED_REMOVED   => 1;
use constant EVT_COMMENT         => 2;
use constant EVT_ATTACHMENT      => 3;
use constant EVT_ATTACHMENT_DATA => 4;
use constant EVT_PROJ_MANAGEMENT => 5;
use constant EVT_OPENED_CLOSED   => 6;
use constant EVT_KEYWORD         => 7;
use constant EVT_CC              => 8;
use constant EVT_DEPEND_BLOCK    => 9;
use constant EVT_BUG_CREATED     => 10;
use constant EVT_COMPONENT       => 11;

use constant
  POS_EVENTS => EVT_OTHER,
  EVT_ADDED_REMOVED,   EVT_COMMENT,       EVT_ATTACHMENT, EVT_ATTACHMENT_DATA,
  EVT_PROJ_MANAGEMENT, EVT_OPENED_CLOSED, EVT_KEYWORD,    EVT_CC,
  EVT_DEPEND_BLOCK,    EVT_BUG_CREATED,   EVT_COMPONENT;

use constant EVT_UNCONFIRMED   => 50;
use constant EVT_CHANGED_BY_ME => 51;
use constant EVT_MINOR_UPDATE  => 52;

use constant NEG_EVENTS => EVT_UNCONFIRMED, EVT_CHANGED_BY_ME, EVT_MINOR_UPDATE;

# These are the "global" flags, which aren't tied to a particular relationship.
# and so use REL_ANY.
use constant EVT_FLAG_REQUESTED => 100;    # Flag has been requested of me
use constant EVT_REQUESTED_FLAG => 101;    # I have requested a flag

use constant GLOBAL_EVENTS => EVT_FLAG_REQUESTED, EVT_REQUESTED_FLAG;

# Default administration group name.
use constant ADMIN_GROUP_NAME => 'admin';

# Privileges which can be per-product.
use constant PER_PRODUCT_PRIVILEGES =>
  ('editcomponents', 'editbugs', 'canconfirm');

# Path to sendmail.exe (Windows only)
use constant SENDMAIL_EXE => '/usr/lib/sendmail.exe';

# Paths to search for the sendmail binary (non-Windows)
use constant SENDMAIL_PATH => '/usr/lib:/usr/sbin:/usr/ucblib';

# Field types.  Match values in fielddefs.type column.  These are purposely
# not named after database column types, since Bugzilla fields comprise not
# only storage but also logic.  For example, we might add a "user" field type
# whose values are stored in an integer column in the database but for which
# we do more than we would do for a standard integer type (f.e. we might
# display a user picker).

use constant FIELD_TYPE_UNKNOWN       => 0;
use constant FIELD_TYPE_FREETEXT      => 1;
use constant FIELD_TYPE_SINGLE_SELECT => 2;
use constant FIELD_TYPE_MULTI_SELECT  => 3;
use constant FIELD_TYPE_TEXTAREA      => 4;
use constant FIELD_TYPE_DATETIME      => 5;
use constant FIELD_TYPE_BUG_ID        => 6;
use constant FIELD_TYPE_BUG_URLS      => 7;
use constant FIELD_TYPE_KEYWORDS      => 8;
use constant FIELD_TYPE_DATE          => 9;
use constant FIELD_TYPE_INTEGER       => 10;
use constant FIELD_TYPE_ONE_SELECT    => 11;

# Add new field types above this line, and change the below value in the
# obvious fashion
use constant FIELD_TYPE_HIGHEST_PLUS_ONE => 12;

# What access does a user have to a field?
# It's important that higher numbers are more privileged as they cascade.
use constant ACCESS_TYPE_VIEW  => 0;
use constant ACCESS_TYPE_EDIT  => 1;
use constant ACCESS_TYPE_ADMIN => 2;

use constant EMPTY_DATETIME_REGEX => qr/^[0\-:\sA-Za-z]+$/;

# See the POD for Bugzilla::Field/is_abnormal to see why these are listed
# here.
use constant ABNORMAL_SELECTS => {
  classification     => 1,
  component          => 1,
  product            => 1,
  dependent_products => 1,    ## REDHAT EXTENSION 1341100
};

# The fields from fielddefs that are blocked from non-timetracking users.
# work_time is sometimes called actual_time.
use constant TIMETRACKING_FIELDS =>
  qw(estimated_time remaining_time work_time actual_time percentage_complete);

# The maximum number of days a token will remain valid.
use constant MAX_TOKEN_AGE => 3;

# How many days a logincookie will remain valid if not used.
use constant MAX_LOGINCOOKIE_AGE => 7;

## REDHAT EXTENSION START 1854250
use constant MAX_LOGINS => 42;
## REDHAT EXTENSION END 1854250

# How many seconds (default is 6 hours) a sudo cookie remains valid.
use constant MAX_SUDO_TOKEN_AGE => 21600;

# Maximum failed logins to lock account for this IP
use constant MAX_LOGIN_ATTEMPTS => 5;

# If the maximum login attempts occur during this many minutes, the
# account is locked.
use constant LOGIN_LOCKOUT_INTERVAL => 30;

# The time in minutes a user must wait before they can request another email to
# create a new account or change their password.
use constant ACCOUNT_CHANGE_INTERVAL => 10;

# The maximum number of seconds the Strict-Transport-Security header
# will remain valid. Default is one week.
use constant MAX_STS_AGE => 604800;

# Protocols which are considered as safe.
use constant SAFE_PROTOCOLS => (
  'afs',    'cid',         'ftp', 'gopher', 'http', 'https',
  'irc',    'ircs',        'mid', 'news',   'nntp', 'prospero',
  'telnet', 'view-source', 'wais'
);

# Valid MIME types for attachments.
use constant LEGAL_CONTENT_TYPES => (
  'application', 'audio',     'image', 'message',
  'model',       'multipart', 'text',  'video'
);

use constant contenttypes => {
  "html" => "text/html",
  "rdf"  => "application/rdf+xml",
  "atom" => "application/atom+xml",
  "xml"  => "application/xml",
  "dtd"  => "application/xml-dtd",
  "js"   => "application/x-javascript",
  "json" => "application/json",
  "csv"  => "text/csv",
  "png"  => "image/png",
  "ics"  => "text/calendar",
};

# Usage modes. Default USAGE_MODE_BROWSER. Use with Bugzilla->usage_mode.
use constant USAGE_MODE_BROWSER => 0;
use constant USAGE_MODE_CMDLINE => 1;
use constant USAGE_MODE_XMLRPC  => 2;
use constant USAGE_MODE_EMAIL   => 3;
use constant USAGE_MODE_JSON    => 4;
use constant USAGE_MODE_TEST    => 5;
use constant USAGE_MODE_REST    => 6;

# Error modes. Default set by Bugzilla->usage_mode (so ERROR_MODE_WEBPAGE
# usually). Use with Bugzilla->error_mode.
use constant ERROR_MODE_WEBPAGE        => 0;
use constant ERROR_MODE_DIE            => 1;
use constant ERROR_MODE_DIE_SOAP_FAULT => 2;
use constant ERROR_MODE_JSON_RPC       => 3;
use constant ERROR_MODE_TEST           => 4;
use constant ERROR_MODE_REST           => 5;

# The ANSI colors of messages that command-line scripts use
use constant COLOR_ERROR   => 'red';
use constant COLOR_SUCCESS => 'green';

# The various modes that checksetup.pl can run in.
use constant INSTALLATION_MODE_INTERACTIVE     => 0;
use constant INSTALLATION_MODE_NON_INTERACTIVE => 1;

# Data about what we require for different databases.
use constant DB_MODULE => {

  # MySQL 5.0.15 was the first production 5.0.x release.
  'mysql' => {
    db         => 'Bugzilla::DB::Mysql',
    db_version => '5.0.15',
    dbd        => {
      package => 'DBD-mysql',
      module  => 'DBD::mysql',

      # Disallow development versions
      blacklist => ['_'],

      # For UTF-8 support. 4.001 makes sure that blobs aren't
      # marked as UTF-8.
      version => '4.001',
    },
    name => 'MySQL'
  },

  # Also see Bugzilla::DB::Pg::bz_check_server_version, which has special
  # code to require DBD::Pg 2.17.2 for PostgreSQL 9 and above.
  'pg' => {
    db         => 'Bugzilla::DB::Pg',
    db_version => '8.03.0000',
    dbd        => {
      package => 'DBD-Pg',
      module  => 'DBD::Pg',

      # 2.7.0 fixes a problem with quoting strings
      # containing backslashes in them.
      version => '2.7.0',
    },
    name => 'PostgreSQL'
  },
  'oracle' => {
    db         => 'Bugzilla::DB::Oracle',
    db_version => '10.02.0',
    dbd  => {package => 'DBD-Oracle', module => 'DBD::Oracle', version => '1.19',},
    name => 'Oracle'
  },

  # SQLite 3.6.22 fixes a WHERE clause problem that may affect us.
  sqlite => {
    db         => 'Bugzilla::DB::Sqlite',
    db_version => '3.6.22',
    dbd        => {
      package => 'DBD-SQLite',
      module  => 'DBD::SQLite',

      # 1.29 is the version that contains 3.6.22.
      version => '1.29',
    },
    name => 'SQLite'
  },
};

# True if we're on Win32.
use constant ON_WINDOWS => ($^O =~ /MSWin32/i) ? 1 : 0;

# True if we're using ActiveState Perl (as opposed to Strawberry) on Windows.
use constant ON_ACTIVESTATE => eval {&Win32::BuildNumber};

# The user who should be considered "root" when we're giving
# instructions to Bugzilla administrators.
use constant ROOT_USER => ON_WINDOWS ? 'Administrator' : 'root';

use constant MIN_SMALLINT => -32768;
use constant MAX_SMALLINT => 32767;
use constant MAX_INT_32   => 2147483647;

# The longest that a saved search name can be.
use constant MAX_LEN_QUERY_NAME => 64;

# The longest classification name allowed.
use constant MAX_CLASSIFICATION_SIZE => 64;

# The longest product name allowed.
use constant MAX_PRODUCT_SIZE => 64;

# The longest milestone name allowed.
use constant MAX_MILESTONE_SIZE => 64;

# The longest release name allowed.
use constant MAX_RELEASE_SIZE => 64;

# The longest component name allowed.
use constant MAX_COMPONENT_SIZE => 64;

# The maximum length for values of <select> fields.
use constant MAX_FIELD_VALUE_SIZE => 64;

# The maximum length for the long description of fields.
use constant MAX_FIELD_LONG_DESC_LENGTH => 32767; ## REDHAT EXTENSION 1888499

# Maximum length allowed for free text fields.
use constant MAX_FREETEXT_LENGTH => 255;

## REDHAT EXTENSION BEGIN 406301
# default log4perl config
use constant LOG4PERL_DEFAULT_CONFIG => q(
log4perl.rootLogger=DEBUG, LOGFILE
log4perl.appender.LOGFILE=Log::Log4perl::Appender::File
log4perl.appender.LOGFILE.filename=data/bz.log
log4perl.appender.LOGFILE.mode=append
log4perl.appender.LOGFILE.layout=PatternLayout
log4perl.appender.LOGFILE.layout.ConversionPattern=[%d.%r] [%H;%P] [%p] [%X{script}:%X{remote_addr}:%X{http_x_forwarded_for}:%X{userid}:%X{username}:%X{userlogin}] [%l] - %m%n
);
## REDHAT EXTENSION END 406301

# The longest a bug URL in a BUG_URLS field can be.
use constant MAX_BUG_URL_LENGTH => 255;

# The largest number of possible duplicates that Bug::possible_duplicates
# will return.
use constant MAX_POSSIBLE_DUPLICATES => 25;

# Maximum length of filename stored in attachments table (longer ones will
# be truncated to this value). Do not increase above 255 without making the
# necessary schema changes to store longer names.
use constant MAX_ATTACH_FILENAME_LENGTH => 255;

# Maximum length of a quip.
use constant MAX_QUIP_LENGTH => 512;

# Maximum number of bugs to display in a dependency graph
use constant MAX_WEBDOT_BUGS => 2000;

# This is the name of the algorithm used to hash passwords before storing
# them in the database. This can be any string that is valid to pass to
# Perl's "Digest" module. Note that if you change this, it won't take
# effect until a user logs in or changes their password.
use constant PASSWORD_DIGEST_ALGORITHM => 'SHA-256';

# How long of a salt should we use? Note that if you change this, it
# won't take effect until a user logs in or changes their password.
use constant PASSWORD_SALT_LENGTH => 8;

# Certain scripts redirect to GET even if the form was submitted originally
# via POST such as buglist.cgi. This value determines whether the redirect
# can be safely done or not based on the web server's URI length setting.
# See http://support.microsoft.com/kb/208427 for why MSIE is different
use constant CGI_URI_LIMIT => ($ENV{'HTTP_USER_AGENT'} || '') =~ /MSIE/
  ? 2083
  : 8000;

# If the user isn't allowed to change a field, we must tell them who can.
# We store the required permission set into the $PrivilegesRequired
# variable which gets passed to the error template.

use constant PRIVILEGES_REQUIRED_NONE      => 0;
use constant PRIVILEGES_REQUIRED_REPORTER  => 1;
use constant PRIVILEGES_REQUIRED_ASSIGNEE  => 2;
use constant PRIVILEGES_REQUIRED_EMPOWERED => 3;

# Special field values used in the audit_log table to mean either
# "we just created this object" or "we just deleted this object".
use constant AUDIT_CREATE => '__create__';
use constant AUDIT_REMOVE => '__remove__';

# The minimum number of duplicates a bug needs to show up
# on the "Most frequently reported bugs" page.
use constant MOST_FREQUENT_THRESHOLD => 2;

## REDHAT EXTENSION START 1265066
use constant MIN_PASSWORD_STRENGTH => 4;
## REDHAT EXTENSION END 1265066

sub bz_locations {

  # Force memoize() to re-compute data per project, to avoid
  # sharing the same data across different installations.
  return _bz_locations($ENV{'PROJECT'});
}

sub _bz_locations {
  my $project = shift;

  # We know that Bugzilla/Constants.pm must be in %INC at this point.
  # So the only question is, what's the name of the directory
  # above it? This is the most reliable way to get our current working
  # directory under both mod_cgi and mod_perl. We call dirname twice
  # to get the name of the directory above the "Bugzilla/" directory.
  #
  # Calling dirname twice like that won't work on VMS or AmigaOS
  # but I doubt anybody runs Bugzilla on those.
  #
  # On mod_cgi this will be a relative path. On mod_perl it will be an
  # absolute path.
  my $libpath = dirname(dirname($INC{'Bugzilla/Constants.pm'}));

  # We have to detaint $libpath, but we can't use Bugzilla::Util here.
  $libpath =~ /(.*)/;
  $libpath = $1;

  my ($localconfig, $datadir);
  if ($project && $project =~ /^(\w+)$/) {
    $project     = $1;
    $localconfig = "localconfig.$project";
    $datadir     = "data/$project";
  }
  else {
    $project     = undef;
    $localconfig = "localconfig";
    $datadir     = "data";
  }

  $datadir = "$libpath/$datadir";

  # We have to return absolute paths for mod_perl.
  # That means that if you modify these paths, they must be absolute paths.
  return {
    'libpath'     => $libpath,
    'ext_libpath' => "$libpath/lib",

    # If you put the libraries in a different location than the CGIs,
    # make sure this still points to the CGIs.
    'cgi_path'       => $libpath,
    'templatedir'    => "$libpath/template",
    'template_cache' => "$datadir/template",
    'project'        => $project,
    'localconfig'    => "$libpath/$localconfig",
    'datadir'        => $datadir,
    'attachdir'      => "$datadir/attachments",
    'skinsdir'       => "$libpath/skins",
    'graphsdir'      => "$libpath/graphs",

    # $webdotdir must be in the web server's tree somewhere. Even if you use a
    # local dot, we output images to there. Also, if $webdotdir is
    # not relative to the bugzilla root directory, you'll need to
    # change showdependencygraph.cgi to set image_url to the correct
    # location.
    # The script should really generate these graphs directly...
    'webdotdir'     => "$datadir/webdot",
    'extensionsdir' => "$libpath/extensions",
    'assetsdir'     => "$datadir/assets",
  };
}

# This makes us not re-compute all the bz_locations data every time it's
# called.
BEGIN { memoize('_bz_locations') }

1;

__END__

=head1 B<Methods in need of POD>

=over

=item DB_MODULE

=item contenttypes

=item bz_locations

=item LOG4PERL_DEFAULT_CONFIG

=back