c7c376270893979d7069fa5db53dab68422f3f6d
[usit-rt.git] / etc / RT_Config.pm
1 #
2 # RT was configured with:
3 #
4 #   $ ./configure --prefix=/www/var/rt/ --with-web-user=httpd --with-web-group=httpd --with-rt-group=uio-rt --with-db-type=Pg --with-db-dba=postgres --disable-gpg
5 #
6
7 package RT;
8
9 #############################  WARNING  #############################
10 #                                                                   #
11 #                     NEVER EDIT RT_Config.pm !                     #
12 #                                                                   #
13 #         Instead, copy any sections you want to change to          #
14 #         RT_SiteConfig.pm and edit them there.  Otherwise,         #
15 #         your changes will be lost when you upgrade RT.            #
16 #                                                                   #
17 #############################  WARNING  #############################
18
19 =head1 NAME
20
21 RT::Config
22
23 =head1 Base configuration
24
25 =over 4
26
27 =item C<$rtname>
28
29 C<$rtname> is the string that RT will look for in mail messages to
30 figure out what ticket a new piece of mail belongs to.
31
32 Your domain name is recommended, so as not to pollute the namespace.
33 Once you start using a given tag, you should probably never change it;
34 otherwise, mail for existing tickets won't get put in the right place.
35
36 =cut
37
38 Set($rtname, "example.com");
39
40 =item C<$Organization>
41
42 You should set this to your organization's DNS domain. For example,
43 I<fsck.com> or I<asylum.arkham.ma.us>. It is used by the linking
44 interface to guarantee that ticket URIs are unique and easy to
45 construct.  Changing it after you have created tickets in the system
46 will B<break> all existing ticket links!
47
48 =cut
49
50 Set($Organization, "example.com");
51
52 =item C<$CorrespondAddress>, C<$CommentAddress>
53
54 RT is designed such that any mail which already has a ticket-id
55 associated with it will get to the right place automatically.
56
57 C<$CorrespondAddress> and C<$CommentAddress> are the default addresses
58 that will be listed in From: and Reply-To: headers of correspondence
59 and comment mail tracked by RT, unless overridden by a queue-specific
60 address.  They should be set to email addresses which have been
61 configured as aliases for F<rt-mailgate>.
62
63 =cut
64
65 Set($CorrespondAddress, '');
66
67 Set($CommentAddress, '');
68
69 =item C<$WebDomain>
70
71 Domain name of the RT server, e.g. 'www.example.com'. It should not
72 contain anything except the server name.
73
74 =cut
75
76 Set($WebDomain, "localhost");
77
78 =item C<$WebPort>
79
80 If we're running as a superuser, run on port 80.  Otherwise, pick a
81 high port for this user.
82
83 443 is default port for https protocol.
84
85 =cut
86
87 Set($WebPort, 80);
88
89 =item C<$WebPath>
90
91 If you're putting the web UI somewhere other than at the root of your
92 server, you should set C<$WebPath> to the path you'll be serving RT
93 at.
94
95 C<$WebPath> requires a leading / but no trailing /, or it can be
96 blank.
97
98 In most cases, you should leave C<$WebPath> set to "" (an empty
99 value).
100
101 =cut
102
103 Set($WebPath, "");
104
105 =item C<$Timezone>
106
107 C<$Timezone> is the default timezone, used to convert times entered by
108 users into GMT, as they are stored in the database, and back again;
109 users can override this.  It should be set to a timezone recognized by
110 your server.
111
112 =cut
113
114 Set($Timezone, "US/Eastern");
115
116 =item C<@Plugins>
117
118 Set C<@Plugins> to a list of external RT plugins that should be
119 enabled (those plugins have to be previously downloaded and
120 installed).
121
122 Example:
123
124 C<Set(@Plugins, (qw(Extension::QuickDelete RT::Extension::CommandByMail)));>
125
126 =cut
127
128 Set(@Plugins, ());
129
130 =item C<@StaticRoots>
131
132 Set C<@StaticRoots> to serve extra paths with a static handler.  The
133 contents of each hashref should be the the same arguments as
134 L<Plack::Middleware::Static> takes.  These paths will be checked before
135 any plugin or core static paths.
136
137 Example:
138
139     Set( @StaticRoots,
140         {
141             path => qr{^/static/},
142             root => '/local/path/to/static/parent',
143         },
144     );
145
146 =cut
147
148 Set( @StaticRoots, () );
149
150 =back
151
152
153
154
155 =head1 Database connection
156
157 =over 4
158
159 =item C<$DatabaseType>
160
161 Database driver being used; case matters.  Valid types are "mysql",
162 "Oracle" and "Pg".
163
164 =cut
165
166 Set($DatabaseType, "Pg");
167
168 =item C<$DatabaseHost>, C<$DatabaseRTHost>
169
170 The domain name of your database server.  If you're running MySQL and
171 on localhost, leave it blank for enhanced performance.
172
173 C<DatabaseRTHost> is the fully-qualified hostname of your RT server,
174 for use in granting ACL rights on MySQL.
175
176 =cut
177
178 Set($DatabaseHost,   "localhost");
179 Set($DatabaseRTHost, "localhost");
180
181 =item C<$DatabasePort>
182
183 The port that your database server is running on.  Ignored unless it's
184 a positive integer. It's usually safe to leave this blank; RT will
185 choose the correct default.
186
187 =cut
188
189 Set($DatabasePort, "");
190
191 =item C<$DatabaseUser>
192
193 The name of the user to connect to the database as.
194
195 =cut
196
197 Set($DatabaseUser, "rt_user");
198
199 =item C<$DatabasePassword>
200
201 The password the C<$DatabaseUser> should use to access the database.
202
203 =cut
204
205 Set($DatabasePassword, q{rt_pass});
206
207 =item C<$DatabaseName>
208
209 The name of the RT database on your database server. For Oracle, the
210 SID and database objects are created in C<$DatabaseUser>'s schema.
211
212 =cut
213
214 Set($DatabaseName, q{rt4});
215
216 =item C<$DatabaseRequireSSL>
217
218 If you're using PostgreSQL and have compiled in SSL support, set
219 C<$DatabaseRequireSSL> to 1 to turn on SSL communication with the
220 database.
221
222 =cut
223
224 Set($DatabaseRequireSSL, undef);
225
226 =item <$DatabaseAdmin>
227
228 The name of the database administrator to connect to the database as
229 during upgrades.
230
231 =cut
232
233 Set($DatabaseAdmin, "postgres");
234
235 =back
236
237
238
239
240 =head1 Logging
241
242 The default is to log anything except debugging information to syslog.
243 Check the L<Log::Dispatch> POD for information about how to get things
244 by syslog, mail or anything else, get debugging info in the log, etc.
245
246 It might generally make sense to send error and higher by email to
247 some administrator.  If you do this, be careful that this email isn't
248 sent to this RT instance.  Mail loops will generate a critical log
249 message.
250
251 =over 4
252
253 =item C<$LogToSyslog>, C<$LogToSTDERR>
254
255 The minimum level error that will be logged to the specific device.
256 From lowest to highest priority, the levels are:
257
258     debug info notice warning error critical alert emergency
259
260 Many syslogds are configured to discard or file debug messages away, so
261 if you're attempting to debug RT you may need to reconfigure your
262 syslogd or use one of the other logging options.
263
264 Logging to your screen affects scripts run from the command line as well
265 as the STDERR sent to your webserver (so these logs will usually show up
266 in your web server's error logs).
267
268 =cut
269
270 Set($LogToSyslog, "info");
271 Set($LogToSTDERR, "info");
272
273 =item C<$LogToFile>, C<$LogDir>, C<$LogToFileNamed>
274
275 Logging to a standalone file is also possible. The file needs to both
276 exist and be writable by all direct users of the RT API. This generally
277 includes the web server and whoever rt-crontool runs as. Note that
278 rt-mailgate and the RT CLI go through the webserver, so their users do
279 not need to have write permissions to this file. If you expect to have
280 multiple users of the direct API, Best Practical recommends using syslog
281 instead of direct file logging.
282
283 You should set C<$LogToFile> to one of the levels documented above.
284
285 =cut
286
287 Set($LogToFile, undef);
288 Set($LogDir, q{var/log});
289 Set($LogToFileNamed, "rt.log");    #log to rt.log
290
291 =item C<$LogStackTraces>
292
293 If set to a log level then logging will include stack traces for
294 messages with level equal to or greater than specified.
295
296 NOTICE: Stack traces include parameters supplied to functions or
297 methods. It is possible for stack trace logging to reveal sensitive
298 information such as passwords or ticket content in your logs.
299
300 =cut
301
302 Set($LogStackTraces, "");
303
304 =item C<@LogToSyslogConf>
305
306 Additional options to pass to L<Log::Dispatch::Syslog>; the most
307 interesting flags include C<facility>, C<logopt>, and possibly C<ident>.
308 See the L<Log::Dispatch::Syslog> documentation for more information.
309
310 =cut
311
312 Set(@LogToSyslogConf, ());
313
314 =back
315
316
317
318 =head1 Incoming mail gateway
319
320 =over 4
321
322 =item C<$EmailSubjectTagRegex>
323
324 This regexp controls what subject tags RT recognizes as its own.  If
325 you're not dealing with historical C<$rtname> values, you'll likely
326 never have to change this configuration.
327
328 Be B<very careful> with it. Note that it overrides C<$rtname> for
329 subject token matching.
330
331 The setting below would make RT behave exactly as it does without the
332 setting enabled.
333
334 =cut
335
336 # Set($EmailSubjectTagRegex, qr/\Q$rtname\E/i );
337
338 =item C<$OwnerEmail>
339
340 C<$OwnerEmail> is the address of a human who manages RT. RT will send
341 errors generated by the mail gateway to this address; it will also be
342 displayed as the contact person on the RT's login page.  Because RT
343 sends errors to this address, it should I<not> be an address that's
344 managed by your RT instance, to avoid mail loops.
345
346 =cut
347
348 Set($OwnerEmail, 'root');
349
350 =item C<$LoopsToRTOwner>
351
352 If C<$LoopsToRTOwner> is defined, RT will send mail that it believes
353 might be a loop to C<$OwnerEmail>.
354
355 =cut
356
357 Set($LoopsToRTOwner, 1);
358
359 =item C<$StoreLoops>
360
361 If C<$StoreLoops> is defined, RT will record messages that it believes
362 to be part of mail loops.  As it does this, it will try to be careful
363 not to send mail to the sender of these messages.
364
365 =cut
366
367 Set($StoreLoops, undef);
368
369 =item C<$MaxAttachmentSize>
370
371 C<$MaxAttachmentSize> sets the maximum size (in bytes) of attachments
372 stored in the database.  This setting is irrelevant unless one of
373 $TruncateLongAttachments or $DropLongAttachments (below) are set, B<OR>
374 the database is stored in Oracle.  On Oracle, attachments larger than
375 this can be fully stored, but will be truncated to this length when
376 read.
377
378 =cut
379
380 Set($MaxAttachmentSize, 10_000_000);  # 10M
381
382 =item C<$TruncateLongAttachments>
383
384 If this is set to a non-undef value, RT will truncate attachments
385 longer than C<$MaxAttachmentSize>.
386
387 =cut
388
389 Set($TruncateLongAttachments, undef);
390
391 =item C<$DropLongAttachments>
392
393 If this is set to a non-undef value, RT will silently drop attachments
394 longer than C<MaxAttachmentSize>.  C<$TruncateLongAttachments>, above,
395 takes priority over this.
396
397 =cut
398
399 Set($DropLongAttachments, undef);
400
401 =item C<$RTAddressRegexp>
402
403 C<$RTAddressRegexp> is used to make sure RT doesn't add itself as a
404 ticket CC if C<$ParseNewMessageForTicketCcs>, above, is enabled.  It
405 is important that you set this to a regular expression that matches
406 all addresses used by your RT.  This lets RT avoid sending mail to
407 itself.  It will also hide RT addresses from the list of "One-time Cc"
408 and Bcc lists on ticket reply.
409
410 If you have a number of addresses configured in your RT database
411 already, you can generate a naive first pass regexp by using:
412
413     perl etc/upgrade/generate-rtaddressregexp
414
415 If left blank, RT will compare each address to your configured
416 C<$CorrespondAddress> and C<$CommentAddress> before searching for a
417 Queue configured with a matching "Reply Address" or "Comment Address"
418 on the Queue Admin page.
419
420 =cut
421
422 Set($RTAddressRegexp, undef);
423
424 =item C<$CanonicalizeEmailAddressMatch>, C<$CanonicalizeEmailAddressReplace>
425
426 RT provides functionality which allows the system to rewrite incoming
427 email addresses.  In its simplest form, you can substitute the value
428 in C<CanonicalizeEmailAddressReplace> for the value in
429 C<CanonicalizeEmailAddressMatch> (These values are passed to the
430 C<CanonicalizeEmailAddress> subroutine in F<RT/User.pm>)
431
432 By default, that routine performs a C<s/$Match/$Replace/gi> on any
433 address passed to it.
434
435 =cut
436
437 # Set($CanonicalizeEmailAddressMatch, '@subdomain\.example\.com$');
438 # Set($CanonicalizeEmailAddressReplace, '@example.com');
439
440 =item C<$CanonicalizeOnCreate>
441
442 Set this to 1 and the create new user page will use the values that
443 you enter in the form but use the function CanonicalizeUserInfo in
444 F<RT/User_Local.pm>
445
446 =cut
447
448 Set($CanonicalizeOnCreate, 0);
449
450 =item C<$ValidateUserEmailAddresses>
451
452 By default C<$ValidateUserEmailAddresses> is 1, and RT will refuse to create
453 users with an invalid email address (as specified in RFC 2822) or with
454 an email address made of multiple email addresses.
455
456 Set this to 0 to skip any email address validation.  Doing so may open up
457 vulnerabilities.
458
459 =cut
460
461 Set($ValidateUserEmailAddresses, 1);
462
463 =item C<@MailPlugins>
464
465 C<@MailPlugins> is a list of authentication plugins for
466 L<RT::Interface::Email> to use; see L<rt-mailgate>
467
468 =cut
469
470 =item C<$UnsafeEmailCommands>
471
472 C<$UnsafeEmailCommands>, if set to 1, enables 'take' and 'resolve'
473 as possible actions via the mail gateway.  As its name implies, this
474 is very unsafe, as it allows email with a forged sender to possibly
475 resolve arbitrary tickets!
476
477 =cut
478
479 =item C<$ExtractSubjectTagMatch>, C<$ExtractSubjectTagNoMatch>
480
481 The default "extract remote tracking tags" scrip settings; these
482 detect when your RT is talking to another RT, and adjust the subject
483 accordingly.
484
485 =cut
486
487 Set($ExtractSubjectTagMatch, qr/\[[^\]]+? #\d+\]/);
488 Set($ExtractSubjectTagNoMatch, ( ${RT::EmailSubjectTagRegex}
489        ? qr/\[(?:${RT::EmailSubjectTagRegex}) #\d+\]/
490        : qr/\[\Q$RT::rtname\E #\d+\]/));
491
492 =item C<$CheckMoreMSMailHeaders>
493
494 Some email clients create a plain text version of HTML-formatted
495 email to help other clients that read only plain text.
496 Unfortunately, the plain text parts sometimes end up with
497 doubled newlines and these can then end up in RT. This
498 is most often seen in MS Outlook.
499
500 Enable this option to have RT check for additional mail headers
501 and attempt to identify email from MS Outlook. When detected,
502 RT will then clean up double newlines. Note that it may
503 clean up intentional double newlines as well.
504
505 =cut
506
507 Set( $CheckMoreMSMailHeaders, 0);
508
509 =back
510
511
512
513 =head1 Outgoing mail
514
515 =over 4
516
517 =item C<$MailCommand>
518
519 C<$MailCommand> defines which method RT will use to try to send mail.
520 We know that 'sendmailpipe' works fairly well.  If 'sendmailpipe'
521 doesn't work well for you, try 'sendmail'.  'qmail' is also a supported
522 value.
523
524 For testing purposes, or to simply disable sending mail out into the
525 world, you can set C<$MailCommand> to 'testfile' which writes all mail
526 to a temporary file.  RT will log the location of the temporary file
527 so you can extract mail from it afterward.
528
529 On shutdown, RT will clean up the temporary file created when using
530 the 'testfile' option. If testing while the RT server is still running,
531 you can find the files in the location noted in the log file. If you run
532 a tool like C<rt-crontool> however, or if you look after stopping the server,
533 the files will have been deleted when the process completed. If you need to
534 keep the files for development or debugging, you can manually set
535 C<< UNLINK => 0 >> where the testfile config is processed in
536 F<lib/RT/Interface/Email.pm>.
537
538 =cut
539
540 Set($MailCommand, "sendmailpipe");
541
542 =item C<$SetOutgoingMailFrom>
543
544 C<$SetOutgoingMailFrom> tells RT to set the sender envelope to the
545 Correspond mail address of the ticket's queue.
546
547 Warning: If you use this setting, bounced mails will appear to be
548 incoming mail to the system, thus creating new tickets.
549
550 If the value contains an C<@>, it is assumed to be an email address and used as
551 a global envelope sender.  Expected usage in this case is to simply set the
552 same envelope sender on all mail from RT, without defining
553 C<$OverrideOutgoingMailFrom>.  If you do define C<$OverrideOutgoingMailFrom>,
554 anything specified there overrides the global value (including Default).
555
556 This option only works if C<$MailCommand> is set to 'sendmailpipe'.
557
558 =cut
559
560 Set($SetOutgoingMailFrom, 0);
561
562 =item C<$OverrideOutgoingMailFrom>
563
564 C<$OverrideOutgoingMailFrom> is used for overwriting the Correspond
565 address of the queue as it is handed to sendmail -f. This helps force
566 the From_ header away from www-data or other email addresses that show
567 up in the "Sent by" line in Outlook.
568
569 The option is a hash reference of queue name to email address.  If
570 there is no ticket involved, then the value of the C<Default> key will
571 be used.
572
573 This option only works if C<$SetOutgoingMailFrom> is enabled and
574 C<$MailCommand> is set to 'sendmailpipe'.
575
576 =cut
577
578 Set($OverrideOutgoingMailFrom, {
579 #    'Default' => 'admin@rt.example.com',
580 #    'General' => 'general@rt.example.com',
581 });
582
583 =item C<$DefaultMailPrecedence>
584
585 C<$DefaultMailPrecedence> is used to control the default Precedence
586 level of outgoing mail where none is specified.  By default it is
587 C<bulk>, but if you only send mail to your staff, you may wish to
588 change it.
589
590 Note that you can set the precedence of individual templates by
591 including an explicit Precedence header.
592
593 If you set this value to C<undef> then we do not set a default
594 Precedence header to outgoing mail. However, if there already is a
595 Precedence header, it will be preserved.
596
597 =cut
598
599 Set($DefaultMailPrecedence, "bulk");
600
601 =item C<$DefaultErrorMailPrecedence>
602
603 C<$DefaultErrorMailPrecedence> is used to control the default
604 Precedence level of outgoing mail that indicates some kind of error
605 condition. By default it is C<bulk>, but if you only send mail to your
606 staff, you may wish to change it.
607
608 If you set this value to C<undef> then we do not add a Precedence
609 header to error mail.
610
611 =cut
612
613 Set($DefaultErrorMailPrecedence, "bulk");
614
615 =item C<$UseOriginatorHeader>
616
617 C<$UseOriginatorHeader> is used to control the insertion of an
618 RT-Originator Header in every outgoing mail, containing the mail
619 address of the transaction creator.
620
621 =cut
622
623 Set($UseOriginatorHeader, 1);
624
625 =item C<$UseFriendlyFromLine>
626
627 By default, RT sets the outgoing mail's "From:" header to "SenderName
628 via RT".  Setting C<$UseFriendlyFromLine> to 0 disables it.
629
630 =cut
631
632 Set($UseFriendlyFromLine, 1);
633
634 =item C<$FriendlyFromLineFormat>
635
636 C<sprintf()> format of the friendly 'From:' header; its arguments are
637 SenderName and SenderEmailAddress.
638
639 =cut
640
641 Set($FriendlyFromLineFormat, "\"%s via RT\" <%s>");
642
643 =item C<$UseFriendlyToLine>
644
645 RT can optionally set a "Friendly" 'To:' header when sending messages
646 to Ccs or AdminCcs (rather than having a blank 'To:' header.
647
648 This feature DOES NOT WORK WITH SENDMAIL[tm] BRAND SENDMAIL.  If you
649 are using sendmail, rather than postfix, qmail, exim or some other
650 MTA, you _must_ disable this option.
651
652 =cut
653
654 Set($UseFriendlyToLine, 0);
655
656 =item C<$FriendlyToLineFormat>
657
658 C<sprintf()> format of the friendly 'To:' header; its arguments are
659 WatcherType and TicketId.
660
661 =cut
662
663 Set($FriendlyToLineFormat, "\"%s of ". RT->Config->Get('rtname') ." Ticket #%s\":;");
664
665 =item C<$NotifyActor>
666
667 By default, RT doesn't notify the person who performs an update, as
668 they already know what they've done. If you'd like to change this
669 behavior, Set C<$NotifyActor> to 1
670
671 =cut
672
673 Set($NotifyActor, 0);
674
675 =item C<$RecordOutgoingEmail>
676
677 By default, RT records each message it sends out to its own internal
678 database.  To change this behavior, set C<$RecordOutgoingEmail> to 0
679
680 If this is disabled, users' digest mail delivery preferences
681 (i.e. EmailFrequency) will also be ignored.
682
683 =cut
684
685 Set($RecordOutgoingEmail, 1);
686
687 =item C<$VERPPrefix>, C<$VERPDomain>
688
689 Setting these options enables VERP support
690 L<http://cr.yp.to/proto/verp.txt>.
691
692 Uncomment the following two directives to generate envelope senders
693 of the form C<${VERPPrefix}${originaladdress}@${VERPDomain}>
694 (i.e. rt-jesse=fsck.com@rt.example.com ).
695
696 This currently only works with sendmail and sendmailpipe.
697
698 =cut
699
700 # Set($VERPPrefix, "rt-");
701 # Set($VERPDomain, $RT::Organization);
702
703
704 =item C<$ForwardFromUser>
705
706 By default, RT forwards a message using queue's address and adds RT's
707 tag into subject of the outgoing message, so recipients' replies go
708 into RT as correspondents.
709
710 To change this behavior, set C<$ForwardFromUser> to 1 and RT
711 will use the address of the current user and remove RT's subject tag.
712
713 =cut
714
715 Set($ForwardFromUser, 0);
716
717 =back
718
719 =head2 Email dashboards
720
721 =over 4
722
723 =item C<$DashboardAddress>
724
725 The email address from which RT will send dashboards. If none is set,
726 then C<$OwnerEmail> will be used.
727
728 =cut
729
730 Set($DashboardAddress, '');
731
732 =item C<$DashboardSubject>
733
734 Lets you set the subject of dashboards. Arguments are the frequency (Daily,
735 Weekly, Monthly) of the dashboard and the dashboard's name.
736
737 =cut
738
739 Set($DashboardSubject, "%s Dashboard: %s");
740
741 =item C<@EmailDashboardRemove>
742
743 A list of regular expressions that will be used to remove content from
744 mailed dashboards.
745
746 =cut
747
748 Set(@EmailDashboardRemove, ());
749
750 =back
751
752
753
754 =head2 Sendmail configuration
755
756 These options only take effect if C<$MailCommand> is 'sendmail' or
757 'sendmailpipe'
758
759 =over 4
760
761 =item C<$SendmailArguments>
762
763 C<$SendmailArguments> defines what flags to pass to C<$SendmailPath>
764 These options are good for most sendmail wrappers and work-a-likes.
765
766 These arguments are good for sendmail brand sendmail 8 and newer:
767 C<Set($SendmailArguments,"-oi -ODeliveryMode=b -OErrorMode=m");>
768
769 =cut
770
771 Set($SendmailArguments, "-oi");
772
773
774 =item C<$SendmailBounceArguments>
775
776 C<$SendmailBounceArguments> defines what flags to pass to C<$Sendmail>
777 assuming RT needs to send an error (i.e. bounce).
778
779 =cut
780
781 Set($SendmailBounceArguments, '-f "<>"');
782
783 =item C<$SendmailPath>
784
785 If you selected 'sendmailpipe' above, you MUST specify the path to
786 your sendmail binary in C<$SendmailPath>.
787
788 =cut
789
790 Set($SendmailPath, "/usr/sbin/sendmail");
791
792
793 =back
794
795 =head2 Other mailers
796
797 =over 4
798
799 =item C<@MailParams>
800
801 C<@MailParams> defines a list of options passed to $MailCommand if it
802 is not 'sendmailpipe' or 'sendmail';
803
804 =cut
805
806 Set(@MailParams, ());
807
808 =back
809
810
811 =head1 Web interface
812
813 =over 4
814
815 =item C<$WebDefaultStylesheet>
816
817 This determines the default stylesheet the RT web interface will use.
818 RT ships with several themes by default:
819
820   rudder          The default theme for RT 4.2
821   aileron         The default layout for RT 4.0
822   web2            The default layout for RT 3.8
823   ballard         Theme which doesn't rely on JavaScript for menuing
824
825 This value actually specifies a directory in F<share/static/css/>
826 from which RT will try to load the file main.css (which should @import
827 any other files the stylesheet needs).  This allows you to easily and
828 cleanly create your own stylesheets to apply to RT.  This option can
829 be overridden by users in their preferences.
830
831 =cut
832
833 Set($WebDefaultStylesheet, "rudder");
834
835 =item C<$DefaultQueue>
836
837 Use this to select the default queue name that will be used for
838 creating new tickets. You may use either the queue's name or its
839 ID. This only affects the queue selection boxes on the web interface.
840
841 =cut
842
843 # Set($DefaultQueue, "General");
844
845 =item C<$RememberDefaultQueue>
846
847 When a queue is selected in the new ticket dropdown, make it the new
848 default for the new ticket dropdown.
849
850 =cut
851
852 # Set($RememberDefaultQueue, 1);
853
854 =item C<$EnableReminders>
855
856 Hide all links and portlets related to Reminders by setting this to 0
857
858 =cut
859
860 Set($EnableReminders, 1);
861
862 =item C<@CustomFieldValuesSources>
863
864 Set C<@CustomFieldValuesSources> to a list of class names which extend
865 L<RT::CustomFieldValues::External>.  This can be used to pull lists of
866 custom field values from external sources at runtime.
867
868 =cut
869
870 Set(@CustomFieldValuesSources, ());
871
872 =item C<%CustomFieldGroupings>
873
874 This option affects the display of ticket and user custom fields in the
875 web interface. It does not address the sorting of custom fields within
876 the groupings; which is controlled by the Ticket Custom Fields tab in
877 Queue Configuration in the Admin UI.
878
879 A nested datastructure defines how to group together custom fields
880 under a mix of built-in and arbitrary headings ("groupings").
881
882 Set C<%CustomFieldGroupings> to a nested structure similar to the following:
883
884     Set(%CustomFieldGroupings,
885         'RT::Ticket' => [
886             'Grouping Name'     => ['CF Name', 'Another CF'],
887             'Another Grouping'  => ['Some CF'],
888             'Dates'             => ['Shipped date'],
889         ],
890         'RT::User' => [
891             'Phones' => ['Fax number'],
892         ],
893     );
894
895 The first level keys are record types for which CFs may be used, and the
896 values are either hashrefs or arrayrefs -- if arrayrefs, then the
897 ordering is preserved during display, otherwise groupings are displayed
898 alphabetically.  The second level keys are the grouping names and the
899 values are array refs containing a list of CF names.
900
901 There are several special built-in groupings which RT displays in
902 specific places (usually the collapsible box of the same title).  The
903 ordering of these standard groupings cannot be modified.  You may also
904 only append Custom Fields to the list in these boxes, not reorder or
905 remove core fields.
906
907 For C<RT::Ticket>, these groupings are: C<Basics>, C<Dates>, C<Links>, C<People>
908
909 For C<RT::User>: C<Identity>, C<Access control>, C<Location>, C<Phones>
910
911 Extensions may also add their own built-in groupings, refer to the individual
912 extension documentation for those.
913
914 =item C<$CanonicalizeRedirectURLs>
915
916 Set C<$CanonicalizeRedirectURLs> to 1 to use C<$WebURL> when
917 redirecting rather than the one we get from C<%ENV>.
918
919 Apache's UseCanonicalName directive changes the hostname that RT
920 finds in C<%ENV>.  You can read more about what turning it On or Off
921 means in the documentation for your version of Apache.
922
923 If you use RT behind a reverse proxy, you almost certainly want to
924 enable this option.
925
926 =cut
927
928 Set($CanonicalizeRedirectURLs, 0);
929
930 =item C<$CanonicalizeURLsInFeeds>
931
932 Set C<$CanonicalizeURLsInFeeds> to 1 to use C<$WebURL> in feeds
933 rather than the one we get from request.
934
935 If you use RT behind a reverse proxy, you almost certainly want to
936 enable this option.
937
938 =cut
939
940 Set($CanonicalizeURLsInFeeds, 0);
941
942 =item C<@JSFiles>
943
944 A list of additional JavaScript files to be included in head.
945
946 =cut
947
948 Set(@JSFiles, qw//);
949
950 =item C<$JSMinPath>
951
952 Path to the jsmin binary; if specified, it will be used to minify
953 C<JSFiles>.  The default, and the fallback if the binary cannot be
954 found, is to simply concatenate the files.
955
956 jsmin can be installed by running 'make jsmin' from the RT install
957 directory, or from http://www.crockford.com/javascript/jsmin.html
958
959 =cut
960
961 # Set($JSMinPath, "/path/to/jsmin");
962
963 =item C<@CSSFiles>
964
965 A list of additional CSS files to be included in head.
966
967 If you're a plugin author, refer to RT->AddStyleSheets.
968
969 =cut
970
971 Set(@CSSFiles, qw//);
972
973 =item C<$UsernameFormat>
974
975 This determines how user info is displayed. 'concise' will show the
976 first of RealName, Name or EmailAddress that has a value. 'verbose' will
977 show EmailAddress, and the first of RealName or Name which is defined.
978 The default, 'role', uses 'verbose' for unprivileged users, and the Name
979 followed by the RealName for privileged users.
980
981 =cut
982
983 Set($UsernameFormat, "role");
984
985 =item C<$UserSearchResultFormat>
986
987 This controls the display of lists of users returned from the User
988 Summary Search. The display of users in the Admin interface is
989 controlled by C<%AdminSearchResultFormat>.
990
991 =cut
992
993 Set($UserSearchResultFormat,
994          q{ '<a href="__WebPath__/User/Summary.html?id=__id__">__id__</a>/TITLE:#'}
995         .q{,'<a href="__WebPath__/User/Summary.html?id=__id__">__Name__</a>/TITLE:Name'}
996         .q{,__RealName__, __EmailAddress__}
997 );
998
999 =item C<@UserSummaryPortlets>
1000
1001 A list of portlets to be displayed on the User Summary page.
1002 By default, we show all of the available portlets.
1003 Extensions may provide their own portlets for this page.
1004
1005 =cut
1006
1007 Set(@UserSummaryPortlets, (qw/ExtraInfo CreateTicket ActiveTickets InactiveTickets/));
1008
1009 =item C<$UserSummaryExtraInfo>
1010
1011 This controls what information is displayed on the User Summary
1012 portal. By default the user's Real Name, Email Address and Username
1013 are displayed. You can remove these or add more as needed. This
1014 expects a Format string of user attributes. Please note that not all
1015 the attributes are supported in this display because we're not
1016 building a table.
1017
1018 =cut
1019
1020 Set($UserSummaryExtraInfo, "RealName, EmailAddress, Name");
1021
1022 =item C<$UserSummaryTicketListFormat>
1023
1024 Control the appearance of the Active and Inactive ticket lists in the
1025 User Summary.
1026
1027 =cut
1028
1029 Set($UserSummaryTicketListFormat, q{
1030        '<B><A HREF="__WebPath__/Ticket/Display.html?id=__id__">__id__</a></B>/TITLE:#',
1031        '<B><A HREF="__WebPath__/Ticket/Display.html?id=__id__">__Subject__</a></B>/TITLE:Subject',
1032        Status,
1033        QueueName,
1034        Owner,
1035        Priority,
1036        '__NEWLINE__',
1037        '',
1038        '<small>__Requestors__</small>',
1039        '<small>__CreatedRelative__</small>',
1040        '<small>__ToldRelative__</small>',
1041        '<small>__LastUpdatedRelative__</small>',
1042        '<small>__TimeLeft__</small>'
1043 });
1044
1045 =item C<$WebBaseURL>, C<$WebURL>
1046
1047 Usually you don't want to set these options. The only obvious reason
1048 is if RT is accessible via https protocol on a non standard port, e.g.
1049 'https://rt.example.com:9999'. In all other cases these options are
1050 computed using C<$WebDomain>, C<$WebPort> and C<$WebPath>.
1051
1052 C<$WebBaseURL> is the scheme, server and port
1053 (e.g. 'http://rt.example.com') for constructing URLs to the web
1054 UI. C<$WebBaseURL> doesn't need a trailing /.
1055
1056 C<$WebURL> is the C<$WebBaseURL>, C<$WebPath> and trailing /, for
1057 example: 'http://www.example.com/rt/'.
1058
1059 =cut
1060
1061 my $port = RT->Config->Get('WebPort');
1062 Set($WebBaseURL,
1063     ($port == 443? 'https': 'http') .'://'
1064     . RT->Config->Get('WebDomain')
1065     . ($port != 80 && $port != 443? ":$port" : '')
1066 );
1067
1068 Set($WebURL, RT->Config->Get('WebBaseURL') . RT->Config->Get('WebPath') . "/");
1069
1070 =item C<$WebImagesURL>
1071
1072 C<$WebImagesURL> points to the base URL where RT can find its images.
1073 Define the directory name to be used for images in RT web documents.
1074
1075 =cut
1076
1077 Set($WebImagesURL, RT->Config->Get('WebPath') . "/static/images/");
1078
1079 =item C<$LogoURL>
1080
1081 C<$LogoURL> points to the URL of the RT logo displayed in the web UI.
1082 This can also be configured via the web UI.
1083
1084 =cut
1085
1086 Set($LogoURL, RT->Config->Get('WebImagesURL') . "bpslogo.png");
1087
1088 =item C<$LogoLinkURL>
1089
1090 C<$LogoLinkURL> is the URL that the RT logo hyperlinks to.
1091
1092 =cut
1093
1094 Set($LogoLinkURL, "http://bestpractical.com");
1095
1096 =item C<$LogoAltText>
1097
1098 C<$LogoAltText> is a string of text for the alt-text of the logo. It
1099 will be passed through C<loc> for localization.
1100
1101 =cut
1102
1103 Set($LogoAltText, "Best Practical Solutions, LLC corporate logo");
1104
1105 =item C<$LogoImageHeight>
1106
1107 C<$LogoImageHeight> is the value of the C<height> attribute of the logo
1108 C<img> tag.
1109
1110 =cut
1111
1112 Set($LogoImageHeight, 38);
1113
1114 =item C<$LogoImageWidth>
1115
1116 C<$LogoImageWidth> is the value of the C<width> attribute of the logo
1117 C<img> tag.
1118
1119 =cut
1120
1121 Set($LogoImageWidth, 181);
1122
1123 =item C<$WebNoAuthRegex>
1124
1125 What portion of RT's URL space should not require authentication.  The
1126 default is almost certainly correct, and should only be changed if you
1127 are extending RT.
1128
1129 =cut
1130
1131 Set($WebNoAuthRegex, qr{^ (?:/+NoAuth/ | /+REST/\d+\.\d+/NoAuth/) }x );
1132
1133 =item C<$SelfServiceRegex>
1134
1135 What portion of RT's URLspace should be accessible to Unprivileged
1136 users This does not override the redirect from F</Ticket/Display.html>
1137 to F</SelfService/Display.html> when Unprivileged users attempt to
1138 access ticked displays.
1139
1140 =cut
1141
1142 Set($SelfServiceRegex, qr!^(?:/+SelfService/)!x );
1143
1144 =item C<$WebFlushDbCacheEveryRequest>
1145
1146 By default, RT clears its database cache after every page view.  This
1147 ensures that you've always got the most current information when
1148 working in a multi-process (mod_perl or FastCGI) Environment.  Setting
1149 C<$WebFlushDbCacheEveryRequest> to 0 will turn this off, which will
1150 speed RT up a bit, at the expense of a tiny bit of data accuracy.
1151
1152 =cut
1153
1154 Set($WebFlushDbCacheEveryRequest, 1);
1155
1156 =item C<%ChartFont>
1157
1158 The L<GD> module (which RT uses for graphs) ships with a built-in font
1159 that doesn't have full Unicode support. You can use a given TrueType
1160 font for a specific language by setting %ChartFont to (language =E<gt>
1161 the absolute path of a font) pairs. Your GD library must have support
1162 for TrueType fonts to use this option. If there is no entry for a
1163 language in the hash then font with 'others' key is used.
1164
1165 RT comes with two TrueType fonts covering most available languages.
1166
1167 =cut
1168
1169 Set(
1170     %ChartFont,
1171     'zh-cn'  => "$RT::BasePath/share/fonts/DroidSansFallback.ttf",
1172     'zh-tw'  => "$RT::BasePath/share/fonts/DroidSansFallback.ttf",
1173     'ja'     => "$RT::BasePath/share/fonts/DroidSansFallback.ttf",
1174     'others' => "$RT::BasePath/share/fonts/DroidSans.ttf",
1175 );
1176
1177 =item C<$ChartsTimezonesInDB>
1178
1179 RT stores dates using the UTC timezone in the DB, so charts grouped by
1180 dates and time are not representative. Set C<$ChartsTimezonesInDB> to 1
1181 to enable timezone conversions using your DB's capabilities. You may
1182 need to do some work on the DB side to use this feature, read more in
1183 F<docs/customizing/timezones_in_charts.pod>.
1184
1185 At this time, this feature only applies to MySQL and PostgreSQL.
1186
1187 =cut
1188
1189 Set($ChartsTimezonesInDB, 0);
1190
1191 =item C<@ChartColors>
1192
1193 An array of 6-digit hexadecimal RGB color values used for chart series.  By
1194 default there are 12 distinct colors.
1195
1196 =cut
1197
1198 Set(@ChartColors, qw(
1199     66cc66 ff6666 ffcc66 663399
1200     3333cc 339933 993333 996633
1201     33cc33 cc3333 cc9933 6633cc
1202 ));
1203
1204 =back
1205
1206
1207
1208 =head2 Home page
1209
1210 =over 4
1211
1212 =item C<$DefaultSummaryRows>
1213
1214 C<$DefaultSummaryRows> is default number of rows displayed in for
1215 search results on the front page.
1216
1217 =cut
1218
1219 Set($DefaultSummaryRows, 10);
1220
1221 =item C<$HomePageRefreshInterval>
1222
1223 C<$HomePageRefreshInterval> is default number of seconds to refresh
1224 the RT home page. Choose from [0, 120, 300, 600, 1200, 3600, 7200].
1225
1226 =cut
1227
1228 Set($HomePageRefreshInterval, 0);
1229
1230 =item C<$HomepageComponents>
1231
1232 C<$HomepageComponents> is an arrayref of allowed components on a
1233 user's customized homepage ("RT at a glance").
1234
1235 =cut
1236
1237 Set(
1238     $HomepageComponents,
1239     [
1240         qw(QuickCreate Quicksearch MyAdminQueues MySupportQueues MyReminders RefreshHomepage Dashboards SavedSearches FindUser) # loc_qw
1241     ]
1242 );
1243
1244 =back
1245
1246
1247
1248
1249 =head2 Ticket search
1250
1251 =over 4
1252
1253 =item C<$UseSQLForACLChecks>
1254
1255 Historically, ACLs were checked on display, which could lead to empty
1256 search pages and wrong ticket counts.  Set C<$UseSQLForACLChecks> to 0
1257 to go back to this method; this will reduce the complexity of the
1258 generated SQL statements, at the cost of the aforementioned bugs.
1259
1260 =cut
1261
1262 Set($UseSQLForACLChecks, 1);
1263
1264 =item C<$TicketsItemMapSize>
1265
1266 On the display page of a ticket from search results, RT provides links
1267 to the first, next, previous and last ticket from the results.  In
1268 order to build these links, RT needs to fetch the full result set from
1269 the database, which can be resource-intensive.
1270
1271 Set C<$TicketsItemMapSize> to number of tickets you want RT to examine
1272 to build these links. If the full result set is larger than this
1273 number, RT will omit the "last" link in the menu.  Set this to zero to
1274 always examine all results.
1275
1276 =cut
1277
1278 Set($TicketsItemMapSize, 1000);
1279
1280 =item C<$SearchResultsRefreshInterval>
1281
1282 C<$SearchResultsRefreshInterval> is default number of seconds to
1283 refresh search results in RT. Choose from [0, 120, 300, 600, 1200,
1284 3600, 7200].
1285
1286 =cut
1287
1288 Set($SearchResultsRefreshInterval, 0);
1289
1290 =item C<$DefaultSearchResultFormat>
1291
1292 C<$DefaultSearchResultFormat> is the default format for RT search
1293 results
1294
1295 =cut
1296
1297 Set ($DefaultSearchResultFormat, qq{
1298    '<B><A HREF="__WebPath__/Ticket/Display.html?id=__id__">__id__</a></B>/TITLE:#',
1299    '<B><A HREF="__WebPath__/Ticket/Display.html?id=__id__">__Subject__</a></B>/TITLE:Subject',
1300    Status,
1301    QueueName,
1302    Owner,
1303    Priority,
1304    '__NEWLINE__',
1305    '__NBSP__',
1306    '<small>__Requestors__</small>',
1307    '<small>__CreatedRelative__</small>',
1308    '<small>__ToldRelative__</small>',
1309    '<small>__LastUpdatedRelative__</small>',
1310    '<small>__TimeLeft__</small>'});
1311
1312 =item C<$DefaultSelfServiceSearchResultFormat>
1313
1314 C<$DefaultSelfServiceSearchResultFormat> is the default format of
1315 searches displayed in the SelfService interface.
1316
1317 =cut
1318
1319 Set($DefaultSelfServiceSearchResultFormat, qq{
1320    '<B><A HREF="__WebPath__/SelfService/Display.html?id=__id__">__id__</a></B>/TITLE:#',
1321    '<B><A HREF="__WebPath__/SelfService/Display.html?id=__id__">__Subject__</a></B>/TITLE:Subject',
1322    Status,
1323    Requestors,
1324    Owner});
1325
1326 =item C<%FullTextSearch>
1327
1328 Full text search (FTS) without database indexing is a very slow
1329 operation, and is thus disabled by default.
1330
1331 Before setting C<Indexed> to 1, read F<docs/full_text_indexing.pod> for
1332 the full details of FTS on your particular database.
1333
1334 It is possible to enable FTS without database indexing support, simply
1335 by setting the C<Enable> key to 1, while leaving C<Indexed> set to 0.
1336 This is not generally suggested, as unindexed full-text searching can
1337 cause severe performance problems.
1338
1339 =cut
1340
1341 Set(%FullTextSearch,
1342     Enable  => 0,
1343     Indexed => 0,
1344 );
1345
1346 =item C<$DontSearchFileAttachments>
1347
1348 If C<$DontSearchFileAttachments> is set to 1, then uploaded files
1349 (attachments with file names) are not searched during content
1350 search.
1351
1352 Note that if you use indexed FTS then named attachments are still
1353 indexed by default regardless of this option.
1354
1355 =cut
1356
1357 Set($DontSearchFileAttachments, undef);
1358
1359 =item C<$OnlySearchActiveTicketsInSimpleSearch>
1360
1361 When query in simple search doesn't have status info, use this to only
1362 search active ones.
1363
1364 =cut
1365
1366 Set($OnlySearchActiveTicketsInSimpleSearch, 1);
1367
1368 =item C<$SearchResultsAutoRedirect>
1369
1370 When only one ticket is found in search, use this to redirect to the
1371 ticket display page automatically.
1372
1373 =cut
1374
1375 Set($SearchResultsAutoRedirect, 0);
1376
1377 =back
1378
1379
1380
1381 =head2 Ticket display
1382
1383 =over 4
1384
1385 =item C<$ShowMoreAboutPrivilegedUsers>
1386
1387 This determines if the 'More about requestor' box on
1388 Ticket/Display.html is shown for Privileged Users.
1389
1390 =cut
1391
1392 Set($ShowMoreAboutPrivilegedUsers, 0);
1393
1394 =item C<$MoreAboutRequestorTicketList>
1395
1396 This can be set to Active, Inactive, All or None.  It controls what
1397 ticket list will be displayed in the 'More about requestor' box on
1398 Ticket/Display.html.  This option can be controlled by users also.
1399
1400 =cut
1401
1402 Set($MoreAboutRequestorTicketList, "Active");
1403
1404 =item C<$MoreAboutRequestorTicketListFormat>
1405
1406 Control the appearance of the ticket lists in the 'More About Requestors' box.
1407
1408 =cut
1409
1410 Set($MoreAboutRequestorTicketListFormat, q{
1411        '<a href="__WebPath__/Ticket/Display.html?id=__id__">__id__</a>',
1412        '__Owner__',
1413        '<a href="__WebPath__/Ticket/Display.html?id=__id__">__Subject__</a>',
1414        '__Status__',
1415 });
1416
1417
1418 =item C<$MoreAboutRequestorExtraInfo>
1419
1420 By default, the 'More about requestor' box on Ticket/Display.html
1421 shows the Requestor's name and ticket list.  If you would like to see
1422 extra information about the user, this expects a Format string of user
1423 attributes.  Please note that not all the attributes are supported in
1424 this display because we're not building a table.
1425
1426 Example:
1427 C<Set($MoreAboutRequestorExtraInfo,"Organization, Address1")>
1428
1429 =cut
1430
1431 Set($MoreAboutRequestorExtraInfo, "");
1432
1433 =item C<$MoreAboutRequestorGroupsLimit>
1434
1435 By default, the 'More about requestor' box on Ticket/Display.html
1436 shows all the groups of the Requestor.  Use this to limit the number
1437 of groups; a value of undef removes the group display entirely.
1438
1439 =cut
1440
1441 Set($MoreAboutRequestorGroupsLimit, 0);
1442
1443 =item C<$UseSideBySideLayout>
1444
1445 Should the ticket create and update forms use a more space efficient
1446 two column layout.  This layout may not work in narrow browsers if you
1447 set a MessageBoxWidth (below).
1448
1449 =cut
1450
1451 Set($UseSideBySideLayout, 1);
1452
1453 =item C<$EditCustomFieldsSingleColumn>
1454
1455 When displaying a list of Ticket Custom Fields for editing, RT
1456 defaults to a 2 column list.  If you set this to 1, it will instead
1457 display the Custom Fields in a single column.
1458
1459 =cut
1460
1461 Set($EditCustomFieldsSingleColumn, 0);
1462
1463 =item C<$ShowUnreadMessageNotifications>
1464
1465 If set to 1, RT will prompt users when there are new,
1466 unread messages on tickets they are viewing.
1467
1468 =cut
1469
1470 Set($ShowUnreadMessageNotifications, 0);
1471
1472 =item C<$AutocompleteOwners>
1473
1474 If set to 1, the owner drop-downs for ticket update/modify and the query
1475 builder are replaced by text fields that autocomplete.  This can
1476 alleviate the sometimes huge owner list for installations where many
1477 users have the OwnTicket right.
1478
1479 Autocompleter is automatically turned on if list contains more than
1480 50 users, but penalty of executing potentially slow query is still paid.
1481
1482 Drop down doesn't show unprivileged users. If your setup allows unprivileged
1483 to own ticket then you have to enable autocompleting.
1484
1485 =cut
1486
1487 Set($AutocompleteOwners, 0);
1488
1489 =item C<$AutocompleteOwnersForSearch>
1490
1491 If set to 1, the owner drop-downs for the query builder are always
1492 replaced by text field that autocomplete and C<$AutocompleteOwners>
1493 is ignored. Helpful when owners list is huge in the query builder.
1494
1495 =cut
1496
1497 Set($AutocompleteOwnersForSearch, 0);
1498
1499 =item C<$UserSearchFields>
1500
1501 Used by the User Autocompleter as well as the User Search.
1502
1503 Specifies which fields of L<RT::User> to match against and how to match
1504 each field when autocompleting users.  Valid match methods are LIKE,
1505 STARTSWITH, ENDSWITH, =, and !=.  Valid search fields are the core User
1506 fields, as well as custom fields, which are specified as "CF.1234" or
1507 "CF.Name"
1508
1509 =cut
1510
1511 Set($UserSearchFields, {
1512     EmailAddress => 'STARTSWITH',
1513     Name         => 'STARTSWITH',
1514     RealName     => 'LIKE',
1515 });
1516
1517 =item C<$AllowUserAutocompleteForUnprivileged>
1518
1519 Should unprivileged users be allowed to autocomplete users.  Setting
1520 this option to 1 means unprivileged users will be able to search all
1521 your users.
1522
1523 =cut
1524
1525 Set($AllowUserAutocompleteForUnprivileged, 0);
1526
1527 =item C<$TicketAutocompleteFields>
1528
1529 Specifies which fields of L<RT::Ticket> to match against and how to match each
1530 field when autocompleting users.  Valid match methods are LIKE, STARTSWITH,
1531 ENDSWITH, C<=>, and C<!=>.
1532
1533 Not all Ticket fields are publically accessible and hence won't work for
1534 autocomplete unless you override their accessibility using a local overlay or a
1535 plugin.  Out of the box the following fields are public: id, Subject.
1536
1537 =cut
1538
1539 Set( $TicketAutocompleteFields, {
1540     id      => 'STARTSWITH',
1541     Subject => 'LIKE',
1542 });
1543
1544 =item C<$DisplayTicketAfterQuickCreate>
1545
1546 Enable this to redirect to the created ticket display page
1547 automatically when using QuickCreate.
1548
1549 =cut
1550
1551 Set($DisplayTicketAfterQuickCreate, 0);
1552
1553 =item C<$WikiImplicitLinks>
1554
1555 Support implicit links in WikiText custom fields?  Setting this to 1
1556 causes InterCapped or ALLCAPS words in WikiText fields to automatically
1557 become links to searches for those words.  If used on Articles, it links
1558 to the Article with that name.
1559
1560 =cut
1561
1562 Set($WikiImplicitLinks, 0);
1563
1564 =item C<$PreviewScripMessages>
1565
1566 Set C<$PreviewScripMessages> to 1 if the scrips preview on the ticket
1567 reply page should include the content of the messages to be sent.
1568
1569 =cut
1570
1571 Set($PreviewScripMessages, 0);
1572
1573 =item C<$SimplifiedRecipients>
1574
1575 If C<$SimplifiedRecipients> is set, a simple list of who will receive
1576 B<any> kind of mail will be shown on the ticket reply page, instead of a
1577 detailed breakdown by scrip.
1578
1579 =cut
1580
1581 Set($SimplifiedRecipients, 0);
1582
1583 =item C<$HideResolveActionsWithDependencies>
1584
1585 If set to 1, this option will skip ticket menu actions which can't be
1586 completed successfully because of outstanding active Depends On tickets.
1587
1588 By default, all ticket actions are displayed in the menu even if some of
1589 them can't be successful until all Depends On links are resolved or
1590 transitioned to another inactive status.
1591
1592 =cut
1593
1594 Set($HideResolveActionsWithDependencies, 0);
1595
1596 =back
1597
1598
1599
1600 =head2 Articles
1601
1602 =over 4
1603
1604 =item C<$ArticleOnTicketCreate>
1605
1606 Set this to 1 to display the Articles interface on the Ticket Create
1607 page in addition to the Reply/Comment page.
1608
1609 =cut
1610
1611 Set($ArticleOnTicketCreate, 0);
1612
1613 =item C<$HideArticleSearchOnReplyCreate>
1614
1615 Set this to 1 to hide the search and include boxes from the Article
1616 UI.  This assumes you have enabled Article Hotlist feature, otherwise
1617 you will have no access to Articles.
1618
1619 =cut
1620
1621 Set($HideArticleSearchOnReplyCreate, 0);
1622
1623 =back
1624
1625
1626
1627 =head2 Message box properties
1628
1629 =over 4
1630
1631 =item C<$MessageBoxWidth>, C<$MessageBoxHeight>
1632
1633 For message boxes, set the entry box width, height and what type of
1634 wrapping to use.  These options can be overridden by users in their
1635 preferences.
1636
1637 When the width is set to undef, no column count is specified and the
1638 message box will take up 100% of the available width.  Combining this
1639 with HARD messagebox wrapping (below) is not recommended, as it will
1640 lead to inconsistent width in transactions between browsers.
1641
1642 These settings only apply to the non-RichText message box.  See below
1643 for Rich Text settings.
1644
1645 =cut
1646
1647 Set($MessageBoxWidth, undef);
1648 Set($MessageBoxHeight, 15);
1649
1650 =item C<$MessageBoxRichText>
1651
1652 Should "rich text" editing be enabled? This option lets your users
1653 send HTML email messages from the web interface.
1654
1655 =cut
1656
1657 Set($MessageBoxRichText, 1);
1658
1659 =item C<$MessageBoxRichTextHeight>
1660
1661 Height of rich text JavaScript enabled editing boxes (in pixels)
1662
1663 =cut
1664
1665 Set($MessageBoxRichTextHeight, 200);
1666
1667 =item C<$MessageBoxIncludeSignature>
1668
1669 Should your users' signatures (from their Preferences page) be
1670 included in Comments and Replies.
1671
1672 =cut
1673
1674 Set($MessageBoxIncludeSignature, 1);
1675
1676 =item C<$MessageBoxIncludeSignatureOnComment>
1677
1678 Should your users' signatures (from their Preferences page) be
1679 included in Comments. Setting this to false overrides
1680 C<$MessageBoxIncludeSignature>.
1681
1682 =cut
1683
1684 Set($MessageBoxIncludeSignatureOnComment, 1);
1685
1686 =back
1687
1688
1689 =head2 Transaction display
1690
1691 =over 4
1692
1693 =item C<$OldestTransactionsFirst>
1694
1695 By default, RT shows newest transactions at the bottom of the ticket
1696 history page, if you want see them at the top set this to 0.  This
1697 option can be overridden by users in their preferences.
1698
1699 =cut
1700
1701 Set($OldestTransactionsFirst, 1);
1702
1703 =item C<$ShowHistory>
1704
1705 This option controls how history is shown on the ticket display page.  It
1706 accepts one of three possible modes and is overrideable on a per-user
1707 preference level.  If you regularly deal with long tickets and don't care much
1708 about the history, you may wish to change this option to C<click>.
1709
1710 =over
1711
1712 =item C<delay> (the default)
1713
1714 When set to C<delay>, history is loaded via javascript after the rest of the
1715 page has been loaded.  This speeds up apparent page load times and generally
1716 provides a smoother experience.  You may notice slight delays before the ticket
1717 history appears on very long tickets.
1718
1719 =item C<click>
1720
1721 When set to C<click>, history is loaded on demand when a placeholder link is
1722 clicked.  This speeds up ticket display page loads and history is never loaded
1723 if not requested.
1724
1725 =item C<always>
1726
1727 When set to C<always>, history is loaded before showing the page.  This ensures
1728 history is always available immediately, but at the expense of longer page load
1729 times.  This behaviour was the default in RT 4.0.
1730
1731 =back
1732
1733 =cut
1734
1735 Set($ShowHistory, 'delay');
1736
1737 =item C<$ShowBccHeader>
1738
1739 By default, RT hides from the web UI information about blind copies
1740 user sent on reply or comment.
1741
1742 =cut
1743
1744 Set($ShowBccHeader, 0);
1745
1746 =item C<$TrustHTMLAttachments>
1747
1748 If C<TrustHTMLAttachments> is not defined, we will display them as
1749 text. This prevents malicious HTML and JavaScript from being sent in a
1750 request (although there is probably more to it than that)
1751
1752 =cut
1753
1754 Set($TrustHTMLAttachments, undef);
1755
1756 =item C<$AlwaysDownloadAttachments>
1757
1758 Always download attachments, regardless of content type. If set, this
1759 overrides C<TrustHTMLAttachments>.
1760
1761 =cut
1762
1763 Set($AlwaysDownloadAttachments, undef);
1764
1765 =item C<$PreferRichText>
1766
1767 By default, RT shows rich text (HTML) messages if possible.
1768
1769 If C<$PreferRichText> is set to 0, RT will show plain text messages
1770 in preference to any rich text alternatives.
1771
1772 =cut
1773
1774 Set($PreferRichText, 1);
1775
1776 =item C<$MaxInlineBody>
1777
1778 C<$MaxInlineBody> is the maximum attachment size that we want to see
1779 inline when viewing a transaction.  RT will inline any text if the
1780 value is undefined or 0.  This option can be overridden by users in
1781 their preferences.
1782
1783 =cut
1784
1785 Set($MaxInlineBody, 12000);
1786
1787 =item C<$ShowTransactionImages>
1788
1789 By default, RT shows images attached to incoming (and outgoing) ticket
1790 updates inline. Set this variable to 0 if you'd like to disable that
1791 behavior.
1792
1793 =cut
1794
1795 Set($ShowTransactionImages, 1);
1796
1797 =item C<$ShowRemoteImages>
1798
1799 By default, RT doesn't show remote images attached to incoming (and outgoing)
1800 ticket updates inline.  Set this variable to 1 if you'd like to enable remote
1801 image display.  Showing remote images may allow spammers and other senders to
1802 track when messages are viewed and see referer information.
1803
1804 Note that this setting is independent of L</$ShowTransactionImages> above.
1805
1806 =cut
1807
1808 Set($ShowRemoteImages, 0);
1809
1810 =item C<$PlainTextMono>
1811
1812 Normally plaintext attachments are displayed as HTML with line breaks
1813 preserved.  This causes space- and tab-based formatting not to be
1814 displayed correctly.  Set C<$PlainTextMono> to 1 to use a monospaced
1815 font and preserve formatting.
1816
1817 =cut
1818
1819 Set($PlainTextMono, 0);
1820
1821 =item C<$SuppressInlineTextFiles>
1822
1823 If C<$SuppressInlineTextFiles> is set to 1, then uploaded text files
1824 (text-type attachments with file names) are prevented from being
1825 displayed in-line when viewing a ticket's history.
1826
1827 =cut
1828
1829 Set($SuppressInlineTextFiles, undef);
1830
1831
1832 =item C<@Active_MakeClicky>
1833
1834 MakeClicky detects various formats of data in headers and email
1835 messages, and extends them with supporting links.  By default, RT
1836 provides two formats:
1837
1838 * 'httpurl': detects http:// and https:// URLs and adds '[Open URL]'
1839   link after the URL.
1840
1841 * 'httpurl_overwrite': also detects URLs as 'httpurl' format, but
1842   replaces the URL with a link.  Enabled by default.
1843
1844 See F<share/html/Elements/MakeClicky> for documentation on how to add
1845 your own styles of link detection.
1846
1847 =cut
1848
1849 Set(@Active_MakeClicky, qw(httpurl_overwrite));
1850
1851 =item C<$QuoteFolding>
1852
1853 Quote folding is the hiding of old replies in transaction history.
1854 It defaults to on.  Set this to 0 to disable it.
1855
1856 =cut
1857
1858 Set($QuoteFolding, 1);
1859
1860 =back
1861
1862
1863
1864 =head1 Application logic
1865
1866 =over 4
1867
1868 =item C<$ParseNewMessageForTicketCcs>
1869
1870 If C<$ParseNewMessageForTicketCcs> is set to 1, RT will attempt to
1871 divine Ticket 'Cc' watchers from the To and Cc lines of incoming
1872 messages that create new Tickets. This option does not apply to replies
1873 or comments on existing Tickets. Be forewarned that if you have I<any>
1874 addresses which forward mail to RT automatically and you enable this
1875 option without modifying C<$RTAddressRegexp> below, you will get
1876 yourself into a heap of trouble.
1877
1878 =cut
1879
1880 Set($ParseNewMessageForTicketCcs, undef);
1881
1882 =item C<$UseTransactionBatch>
1883
1884 Set C<$UseTransactionBatch> to 1 to execute transactions in batches,
1885 such that a resolve and comment (for example) would happen
1886 simultaneously, instead of as two transactions, unaware of each
1887 others' existence.
1888
1889 =cut
1890
1891 Set($UseTransactionBatch, 1);
1892
1893 =item C<$StrictLinkACL>
1894
1895 When this feature is enabled a user needs I<ModifyTicket> rights on
1896 both tickets to link them together; otherwise, I<ModifyTicket> rights
1897 on either of them is sufficient.
1898
1899 =cut
1900
1901 Set($StrictLinkACL, 1);
1902
1903 =item C<$RedistributeAutoGeneratedMessages>
1904
1905 Should RT redistribute correspondence that it identifies as machine
1906 generated?  A 1 will do so; setting this to 0 will cause no
1907 such messages to be redistributed.  You can also use 'privileged' (the
1908 default), which will redistribute only to privileged users. This helps
1909 to protect against malformed bounces and loops caused by auto-created
1910 requestors with bogus addresses.
1911
1912 =cut
1913
1914 Set($RedistributeAutoGeneratedMessages, "privileged");
1915
1916 =item C<$ApprovalRejectionNotes>
1917
1918 Should rejection notes from approvals be sent to the requestors?
1919
1920 =cut
1921
1922 Set($ApprovalRejectionNotes, 1);
1923
1924 =item C<$ForceApprovalsView>
1925
1926 Should approval tickets only be viewed and modified through the standard
1927 approval interface?  With this setting enabled (by default), any attempt to use
1928 the normal ticket display and modify page for approval tickets will be
1929 redirected.
1930
1931 For example, with this option set to 1 and an approval ticket #123:
1932
1933     /Ticket/Display.html?id=123
1934
1935 is redirected to
1936
1937     /Approval/Display.html?id=123
1938
1939 With this option set to 0, the redirect won't happen.
1940
1941 =back
1942
1943 =cut
1944
1945 Set($ForceApprovalsView, 1);
1946
1947 =head1 Extra security
1948
1949 This is a list of extra security measures to enable that help keep your RT
1950 safe.  If you don't know what these mean, you should almost certainly leave the
1951 defaults alone.
1952
1953 =over 4
1954
1955 =item C<$DisallowExecuteCode>
1956
1957 If set to a true value, the C<ExecuteCode> right will be removed from
1958 all users, B<including> the superuser.  This is intended for when RT is
1959 installed into a shared environment where even the superuser should not
1960 be allowed to run arbitrary Perl code on the server via scrips.
1961
1962 =cut
1963
1964 Set($DisallowExecuteCode, 0);
1965
1966 =item C<$Framebusting>
1967
1968 If set to a false value, framekiller javascript will be disabled and the
1969 X-Frame-Options: DENY header will be suppressed from all responses.
1970 This disables RT's clickjacking protection.
1971
1972 =cut
1973
1974 Set($Framebusting, 1);
1975
1976 =item C<$RestrictReferrer>
1977
1978 If set to a false value, the HTTP C<Referer> (sic) header will not be
1979 checked to ensure that requests come from RT's own domain.  As RT allows
1980 for GET requests to alter state, disabling this opens RT up to
1981 cross-site request forgery (CSRF) attacks.
1982
1983 =cut
1984
1985 Set($RestrictReferrer, 1);
1986
1987 =item C<$RestrictLoginReferrer>
1988
1989 If set to a false value, RT will allow the user to log in from any link
1990 or request, merely by passing in C<user> and C<pass> parameters; setting
1991 it to a true value forces all logins to come from the login box, so the
1992 user is aware that they are being logged in.  The default is off, for
1993 backwards compatability.
1994
1995 =cut
1996
1997 Set($RestrictLoginReferrer, 0);
1998
1999 =item C<@ReferrerWhitelist>
2000
2001 This is a list of hostname:port combinations that RT will treat as being
2002 part of RT's domain. This is particularly useful if you access RT as
2003 multiple hostnames or have an external auth system that needs to
2004 redirect back to RT once authentication is complete.
2005
2006  Set(@ReferrerWhitelist, qw(www.example.com:443  www3.example.com:80));
2007
2008 If the "RT has detected a possible cross-site request forgery" error is triggered
2009 by a host:port sent by your browser that you believe should be valid, you can copy
2010 the host:port from the error message into this list.
2011
2012 Simple wildcards, similar to SSL certificates, are allowed.  For example:
2013
2014     *.example.com:80    # matches foo.example.com
2015                         # but not example.com
2016                         #      or foo.bar.example.com
2017
2018     www*.example.com:80 # matches www3.example.com
2019                         #     and www-test.example.com
2020                         #     and www.example.com
2021
2022 =cut
2023
2024 Set(@ReferrerWhitelist, qw());
2025
2026
2027 =item C<$BcryptCost>
2028
2029 This sets the default cost parameter used for the C<bcrypt> key
2030 derivation function.  Valid values range from 4 to 31, inclusive, with
2031 higher numbers denoting greater effort.
2032
2033 =cut
2034
2035 Set($BcryptCost, 10);
2036
2037 =back
2038
2039
2040
2041 =head1 Authorization and user configuration
2042
2043 =over 4
2044
2045 =item C<$WebRemoteUserAuth>
2046
2047 If C<$WebRemoteUserAuth> is defined, RT will defer to the environment's
2048 REMOTE_USER variable, which should be set by the webserver's
2049 authentication layer.
2050
2051 =cut
2052
2053 Set($WebRemoteUserAuth, undef);
2054
2055 =item C<$WebRemoteUserContinuous>
2056
2057 If C<$WebRemoteUserContinuous> is defined, RT will check for the
2058 REMOTE_USER on each access.  If you would prefer this to only happen
2059 once (at initial login) set this to a false value.  The default
2060 setting will help ensure that if your webserver's authentication layer
2061 deauthenticates a user, RT notices as soon as possible.
2062
2063 =cut
2064
2065 Set($WebRemoteUserContinuous, 1);
2066
2067 =item C<$WebFallbackToRTLogin>
2068
2069 If C<$WebFallbackToRTLogin> is defined, the user is allowed a
2070 chance of fallback to the login screen, even if REMOTE_USER failed.
2071
2072 =cut
2073
2074 Set($WebFallbackToRTLogin, undef);
2075
2076 =item C<$WebRemoteUserGecos>
2077
2078 C<$WebRemoteUserGecos> means to match 'gecos' field as the user
2079 identity; useful with C<mod_auth_pwcheck> and IIS Integrated Windows
2080 logon.
2081
2082 =cut
2083
2084 Set($WebRemoteUserGecos, undef);
2085
2086 =item C<$WebRemoteUserAutocreate>
2087
2088 C<$WebRemoteUserAutocreate> will create users under the same name as
2089 REMOTE_USER upon login, if they are missing from the Users table.
2090
2091 =cut
2092
2093 Set($WebRemoteUserAutocreate, undef);
2094
2095 =item C<$UserAutocreateDefaultsOnLogin>
2096
2097 If C<$WebRemoteUserAutocreate> is set to 1, C<$UserAutocreateDefaultsOnLogin>
2098 will be passed to L<RT::User/Create>.  Use it to set defaults, such as
2099 creating unprivileged users with C<<{ Privileged => 0 }>>.  This must be
2100 a hashref.
2101
2102 =cut
2103
2104 Set($UserAutocreateDefaultsOnLogin, undef);
2105
2106 =item C<$WebSessionClass>
2107
2108 C<$WebSessionClass> is the class you wish to use for storing sessions.  On
2109 MySQL, Pg, and Oracle it defaults to using your database, in other cases
2110 sessions are stored in files using L<Apache::Session::File>. Other installed
2111 Apache:Session::* modules can be used to store sessions.
2112
2113     Set($WebSessionClass, "Apache::Session::File");
2114
2115 =cut
2116
2117 Set($WebSessionClass, undef);
2118
2119 =item C<%WebSessionProperties>
2120
2121 C<%WebSessionProperties> is the hash to configure class L</$WebSessionClass>
2122 in case custom class is used. By default it's empty and values are picked
2123 depending on the class. Make sure that it's empty if you're using DB as session
2124 backend.
2125
2126 =cut
2127
2128 Set( %WebSessionProperties );
2129
2130 =item C<$AutoLogoff>
2131
2132 By default, RT's user sessions persist until a user closes his or her
2133 browser. With the C<$AutoLogoff> option you can setup session lifetime
2134 in minutes. A user will be logged out if he or she doesn't send any
2135 requests to RT for the defined time.
2136
2137 =cut
2138
2139 Set($AutoLogoff, 0);
2140
2141 =item C<$LogoutRefresh>
2142
2143 The number of seconds to wait after logout before sending the user to
2144 the login page. By default, 1 second, though you may want to increase
2145 this if you display additional information on the logout page.
2146
2147 =cut
2148
2149 Set($LogoutRefresh, 1);
2150
2151 =item C<$WebSecureCookies>
2152
2153 By default, RT's session cookie isn't marked as "secure". Some web
2154 browsers will treat secure cookies more carefully than non-secure
2155 ones, being careful not to write them to disk, only sending them over
2156 an SSL secured connection, and so on. To enable this behavior, set
2157 C<$WebSecureCookies> to 1.  NOTE: You probably don't want to turn this
2158 on I<unless> users are only connecting via SSL encrypted HTTPS
2159 connections.
2160
2161 =cut
2162
2163 Set($WebSecureCookies, 0);
2164
2165 =item C<$WebHttpOnlyCookies>
2166
2167 Default RT's session cookie to not being directly accessible to
2168 javascript.  The content is still sent during regular and AJAX requests,
2169 and other cookies are unaffected, but the session-id is less
2170 programmatically accessible to javascript.  Turning this off should only
2171 be necessary in situations with odd client-side authentication
2172 requirements.
2173
2174 =cut
2175
2176 Set($WebHttpOnlyCookies, 1);
2177
2178 =item C<$MinimumPasswordLength>
2179
2180 C<$MinimumPasswordLength> defines the minimum length for user
2181 passwords. Setting it to 0 disables this check.
2182
2183 =cut
2184
2185 Set($MinimumPasswordLength, 5);
2186
2187 =back
2188
2189
2190 =head1 Internationalization
2191
2192 =over 4
2193
2194 =item C<@LexiconLanguages>
2195
2196 An array that contains languages supported by RT's
2197 internationalization interface.  Defaults to all *.po lexicons;
2198 setting it to C<qw(en ja)> will make RT bilingual instead of
2199 multilingual, but will save some memory.
2200
2201 =cut
2202
2203 Set(@LexiconLanguages, qw(*));
2204
2205 =item C<@EmailInputEncodings>
2206
2207 An array that contains default encodings used to guess which charset
2208 an attachment uses, if it does not specify one explicitly.  All
2209 options must be recognized by L<Encode::Guess>.  The first element may
2210 also be '*', which enables encoding detection using
2211 L<Encode::Detect::Detector>, if installed.
2212
2213 =cut
2214
2215 Set(@EmailInputEncodings, qw(utf-8 iso-8859-1 us-ascii));
2216
2217 =item C<$EmailOutputEncoding>
2218
2219 The charset for localized email.  Must be recognized by Encode.
2220
2221 =cut
2222
2223 Set($EmailOutputEncoding, "utf-8");
2224
2225 =back
2226
2227
2228
2229
2230
2231
2232
2233 =head1 Date and time handling
2234
2235 =over 4
2236
2237 =item C<$DateTimeFormat>
2238
2239 You can choose date and time format.  See the "Output formatters"
2240 section in perldoc F<lib/RT/Date.pm> for more options.  This option
2241 can be overridden by users in their preferences.
2242
2243 Some examples:
2244
2245 C<Set($DateTimeFormat, "LocalizedDateTime");>
2246 C<Set($DateTimeFormat, { Format => "ISO", Seconds => 0 });>
2247 C<Set($DateTimeFormat, "RFC2822");>
2248 C<Set($DateTimeFormat, { Format => "RFC2822", Seconds => 0, DayOfWeek => 0 });>
2249
2250 =cut
2251
2252 Set($DateTimeFormat, "DefaultFormat");
2253
2254 # Next two options are for Time::ParseDate
2255
2256 =item C<$DateDayBeforeMonth>
2257
2258 Set this to 1 if your local date convention looks like "dd/mm/yy"
2259 instead of "mm/dd/yy". Used only for parsing, not for displaying
2260 dates.
2261
2262 =cut
2263
2264 Set($DateDayBeforeMonth, 1);
2265
2266 =item C<$AmbiguousDayInPast>, C<$AmbiguousDayInFuture>
2267
2268 Should an unspecified day or year in a date refer to a future or a
2269 past value? For example, should a date of "Tuesday" default to mean
2270 the date for next Tuesday or last Tuesday? Should the date "March 1"
2271 default to the date for next March or last March?
2272
2273 Set C<$AmbiguousDayInPast> for the last date, or
2274 C<$AmbiguousDayInFuture> for the next date; the default is usually
2275 correct.  If both are set, C<$AmbiguousDayInPast> takes precedence.
2276
2277 =cut
2278
2279 Set($AmbiguousDayInPast, 0);
2280 Set($AmbiguousDayInFuture, 0);
2281
2282 =item C<$DefaultTimeUnitsToHours>
2283
2284 Use this to set the default units for time entry to hours instead of
2285 minutes.  Note that this only effects entry, not display.
2286
2287 =cut
2288
2289 Set($DefaultTimeUnitsToHours, 0);
2290
2291 =item C<$TimeInICal>
2292
2293 By default, events in the iCal feed on the ticket search page
2294 contain only dates, making them all day calendar events. Set
2295 C<$TimeInICal> if you have start or due dates on tickets that
2296 have significant time values and you want those times to be
2297 included in the events in the iCal feed.
2298
2299 This option can also be set as an individual user preference.
2300
2301 =cut
2302
2303 Set($TimeInICal, 0);
2304
2305 =back
2306
2307
2308
2309 =head1 Cryptography
2310
2311 A complete description of RT's cryptography capabilities can be found in
2312 L<RT::Crypt>. At this moment, GnuPG (PGP) and SMIME security protocols are
2313 supported.
2314
2315 =over 4
2316
2317 =item C<%Crypt>
2318
2319 The following options apply to all cryptography protocols.
2320
2321 By default, all enabled security protocols will analyze each incoming
2322 email. You may set C<Incoming> to a subset of this list, if some enabled
2323 protocols do not apply to incoming mail; however, this is usually
2324 unnecessary. Note that for any verification or decryption to occur for
2325 incoming mail, the C<Auth::Crypt> mail plugin must be added to
2326 L</@MailPlugins> as specified in L<RT::Crypt/Handling incoming messages>.
2327
2328 For outgoing emails, the first security protocol from the above list is
2329 used. Use the C<Outgoing> option to set a security protocol that should
2330 be used in outgoing emails.  At this moment, only one protocol can be
2331 used to protect outgoing emails.
2332
2333 Set C<RejectOnUnencrypted> to true if all incoming email must be
2334 properly encrypted.  All unencrypted emails will be rejected by RT.
2335
2336 Set C<RejectOnMissingPrivateKey> to false if you don't want to reject
2337 emails encrypted for key RT doesn't have and can not decrypt.
2338
2339 Set C<RejectOnBadData> to false if you don't want to reject letters
2340 with incorrect data.
2341
2342 If you want to allow people to encrypt attachments inside the DB then
2343 set C<AllowEncryptDataInDB> to 1.
2344
2345 Set C<Dashboards> to a hash with Encrypt and Sign keys to control
2346 whether dashboards should be encrypted and/or signed correspondingly.
2347 By default they are not encrypted or signed.
2348
2349 =back
2350
2351 =cut
2352
2353 Set( %Crypt,
2354     Incoming                  => undef, # ['GnuPG', 'SMIME']
2355     Outgoing                  => undef, # 'SMIME'
2356
2357     RejectOnUnencrypted       => 0,
2358     RejectOnMissingPrivateKey => 1,
2359     RejectOnBadData           => 1,
2360
2361     AllowEncryptDataInDB      => 0,
2362
2363     Dashboards => {
2364         Encrypt => 0,
2365         Sign    => 0,
2366     },
2367 );
2368
2369 =head2 SMIME configuration
2370
2371 A full description of the SMIME integration can be found in
2372 L<RT::Crypt::SMIME>.
2373
2374 =over 4
2375
2376 =item C<%SMIME>
2377
2378 Set C<Enable> to false or true value to disable or enable SMIME for
2379 encrypting and signing messages.
2380
2381 Set C<OpenSSL> to path to F<openssl> executable.
2382
2383 Set C<Keyring> to directory with key files.  Key and certificates should
2384 be stored in a PEM file in this directory named named, e.g.,
2385 F<email.address@example.com.pem>.
2386
2387 Set C<CAPath> to either a PEM-formatted certificate of a single signing
2388 certificate authority, or a directory of such (including hash symlinks
2389 as created by the openssl tool C<c_rehash>).  Only SMIME certificates
2390 signed by these certificate authorities will be treated as valid
2391 signatures.  If left unset (and C<AcceptUntrustedCAs> is unset, as it is
2392 by default), no signatures will be marked as valid!
2393
2394 Set C<AcceptUntrustedCAs> to allow arbitrary SMIME certificates, no
2395 matter their signing entities.  Such mails will be marked as untrusted,
2396 but signed; C<CAPath> will be used to mark which mails are signed by
2397 trusted certificate authorities.  This configuration is generally
2398 insecure, as it allows the possibility of accepting forged mail signed
2399 by an untrusted certificate authority.
2400
2401 Setting C<AcceptUntrustedCAs> also allows encryption to users with
2402 certificates created by untrusted CAs.
2403
2404 Set C<Passphrase> to a scalar (to use for all keys), an anonymous
2405 function, or a hash (to look up by address).  If the hash is used, the
2406 '' key is used as a default.
2407
2408 See L<RT::Crypt::SMIME> for details.
2409
2410 =back
2411
2412 =cut
2413
2414 Set( %SMIME,
2415     Enable => 0,
2416     OpenSSL => 'openssl',
2417     Keyring => q{var/data/smime},
2418     CAPath => undef,
2419     AcceptUntrustedCAs => undef,
2420     Passphrase => undef,
2421 );
2422
2423 =head2 GnuPG configuration
2424
2425 A full description of the (somewhat extensive) GnuPG integration can
2426 be found by running the command `perldoc L<RT::Crypt::GnuPG>` (or
2427 `perldoc lib/RT/Crypt/GnuPG.pm` from your RT install directory).
2428
2429 =over 4
2430
2431 =item C<%GnuPG>
2432
2433 Set C<Enable> to false or true value to disable or enable GnuPG interfaces
2434 for encrypting and signing outgoing messages.
2435
2436 Set C<GnuPG> to the name or path of the gpg binary to use.
2437
2438 Set C<Passphrase> to a scalar (to use for all keys), an anonymous
2439 function, or a hash (to look up by address).  If the hash is used, the
2440 '' key is used as a default.
2441
2442 Set C<OutgoingMessagesFormat> to 'inline' to use inline encryption and
2443 signatures instead of 'RFC' (GPG/MIME: RFC3156 and RFC1847) format.
2444
2445 =cut
2446
2447 Set(%GnuPG,
2448     Enable                 => 0,
2449     GnuPG                  => 'gpg',
2450     Passphrase             => undef,
2451     OutgoingMessagesFormat => "RFC", # Inline
2452 );
2453
2454 =item C<%GnuPGOptions>
2455
2456 Options to pass to the GnuPG program.
2457
2458 If you override this in your RT_SiteConfig, you should be sure to
2459 include a homedir setting.
2460
2461 Note that options with '-' character MUST be quoted.
2462
2463 =cut
2464
2465 Set(%GnuPGOptions,
2466     homedir => q{var/data/gpg},
2467
2468 # URL of a keyserver
2469 #    keyserver => 'hkp://subkeys.pgp.net',
2470
2471 # enables the automatic retrieving of keys when encrypting
2472 #    'auto-key-locate' => 'keyserver',
2473
2474 # enables the automatic retrieving of keys when verifying signatures
2475 #    'keyserver-options' => 'auto-key-retrieve',
2476 );
2477
2478 =back
2479
2480
2481
2482 =head1 Lifecycles
2483
2484 =head2 Lifecycle definitions
2485
2486 Each lifecycle is a list of possible statuses split into three logic
2487 sets: B<initial>, B<active> and B<inactive>. Each status in a
2488 lifecycle must be unique. (Statuses may not be repeated across sets.)
2489 Each set may have any number of statuses.
2490
2491 For example:
2492
2493     default => {
2494         initial  => ['new'],
2495         active   => ['open', 'stalled'],
2496         inactive => ['resolved', 'rejected', 'deleted'],
2497         ...
2498     },
2499
2500 Status names can be from 1 to 64 ASCII characters.  Statuses are
2501 localized using RT's standard internationalization and localization
2502 system.
2503
2504 =over 4
2505
2506 =item initial
2507
2508 You can define multiple B<initial> statuses for tickets in a given
2509 lifecycle.
2510
2511 RT will automatically set its B<Started> date when you change a
2512 ticket's status from an B<initial> state to an B<active> or
2513 B<inactive> status.
2514
2515 =item active
2516
2517 B<Active> tickets are "currently in play" - they're things that are
2518 being worked on and not yet complete.
2519
2520 =item inactive
2521
2522 B<Inactive> tickets are typically in their "final resting state".
2523
2524 While you're free to implement a workflow that ignores that
2525 description, typically once a ticket enters an inactive state, it will
2526 never again enter an active state.
2527
2528 RT will automatically set the B<Resolved> date when a ticket's status
2529 is changed from an B<Initial> or B<Active> status to an B<Inactive>
2530 status.
2531
2532 B<deleted> is still a special status and protected by the
2533 B<DeleteTicket> right, unless you re-defined rights (read below). If
2534 you don't want to allow ticket deletion at any time simply don't
2535 include it in your lifecycle.
2536
2537 =back
2538
2539 Statuses in each set are ordered and listed in the UI in the defined
2540 order.
2541
2542 Changes between statuses are constrained by transition rules, as
2543 described below.
2544
2545 =head2 Default values
2546
2547 In some cases a default value is used to display in UI or in API when
2548 value is not provided. You can configure defaults using the following
2549 syntax:
2550
2551     default => {
2552         ...
2553         defaults => {
2554             on_create => 'new',
2555             on_resolve => 'resolved',
2556             ...
2557         },
2558     },
2559
2560 The following defaults are used.
2561
2562 =over 4
2563
2564 =item on_create
2565
2566 If you (or your code) doesn't specify a status when creating a ticket,
2567 RT will use the this status. See also L</Statuses available during
2568 ticket creation>.
2569
2570 =item on_merge
2571
2572 When tickets are merged, the status of the ticket that was merged
2573 away is forced to this value.  It should be one of inactive statuses;
2574 'resolved' or its equivalent is most probably the best candidate.
2575
2576 =item approved
2577
2578 When an approval is accepted, the status of depending tickets will
2579 be changed to this value.
2580
2581 =item denied
2582
2583 When an approval is denied, the status of depending tickets will
2584 be changed to this value.
2585
2586 =item reminder_on_open
2587
2588 When a reminder is opened, the status will be changed to this value.
2589
2590 =item reminder_on_resolve
2591
2592 When a reminder is resolved, the status will be changed to this value.
2593
2594 =back
2595
2596 =head2 Transitions between statuses and UI actions
2597
2598 A B<Transition> is a change of status from A to B. You should define
2599 all possible transitions in each lifecycle using the following format:
2600
2601     default => {
2602         ...
2603         transitions => {
2604             ''       => [qw(new open resolved)],
2605             new      => [qw(open resolved rejected deleted)],
2606             open     => [qw(stalled resolved rejected deleted)],
2607             stalled  => [qw(open)],
2608             resolved => [qw(open)],
2609             rejected => [qw(open)],
2610             deleted  => [qw(open)],
2611         },
2612         ...
2613     },
2614
2615 =head3 Statuses available during ticket creation
2616
2617 By default users can create tickets with a status of new,
2618 open, or resolved, but cannot create tickets with a status of
2619 rejected, stalled, or deleted. If you want to change the statuses
2620 available during creation, update the transition from '' (empty
2621 string), like in the example above.
2622
2623 =head3 Protecting status changes with rights
2624
2625 A transition or group of transitions can be protected by a specific
2626 right.  Additionally, you can name new right names, which will be added
2627 to the system to control that transition.  For example, if you wished to
2628 create a lesser right than ModifyTicket for rejecting tickets, you could
2629 write:
2630
2631     default => {
2632         ...
2633         rights => {
2634             '* -> deleted'  => 'DeleteTicket',
2635             '* -> rejected' => 'RejectTicket',
2636             '* -> *'        => 'ModifyTicket',
2637         },
2638         ...
2639     },
2640
2641 This would create a new C<RejectTicket> right in the system which you
2642 could assign to whatever groups you choose.
2643
2644 On the left hand side you can have the following variants:
2645
2646     '<from> -> <to>'
2647     '* -> <to>'
2648     '<from> -> *'
2649     '* -> *'
2650
2651 Valid transitions are listed in order of priority. If a user attempts
2652 to change a ticket's status from B<new> to B<open> then the lifecycle
2653 is checked for presence of an exact match, then for 'any to B<open>',
2654 'B<new> to any' and finally 'any to any'.
2655
2656 If you don't define any rights, or there is no match for a transition,
2657 RT will use the B<DeleteTicket> or B<ModifyTicket> as appropriate.
2658
2659 =head3 Labeling and defining actions
2660
2661 For each transition you can define an action that will be shown in the
2662 UI; each action annotated with a label and an update type.
2663
2664 Each action may provide a default update type, which can be
2665 B<Comment>, B<Respond>, or absent. For example, you may want your
2666 staff to write a reply to the end user when they change status from
2667 B<new> to B<open>, and thus set the update to B<Respond>.  Neither
2668 B<Comment> nor B<Respond> are mandatory, and user may leave the
2669 message empty, regardless of the update type.
2670
2671 This configuration can be used to accomplish what
2672 $ResolveDefaultUpdateType was used for in RT 3.8.
2673
2674 Use the following format to define labels and actions of transitions:
2675
2676     default => {
2677         ...
2678         actions => [
2679             'new -> open'     => { label => 'Open it', update => 'Respond' },
2680             'new -> resolved' => { label => 'Resolve', update => 'Comment' },
2681             'new -> rejected' => { label => 'Reject',  update => 'Respond' },
2682             'new -> deleted'  => { label => 'Delete' },
2683
2684             'open -> stalled'  => { label => 'Stall',   update => 'Comment' },
2685             'open -> resolved' => { label => 'Resolve', update => 'Comment' },
2686             'open -> rejected' => { label => 'Reject',  update => 'Respond' },
2687
2688             'stalled -> open'  => { label => 'Open it' },
2689             'resolved -> open' => { label => 'Re-open', update => 'Comment' },
2690             'rejected -> open' => { label => 'Re-open', update => 'Comment' },
2691             'deleted -> open'  => { label => 'Undelete' },
2692         ],
2693         ...
2694     },
2695
2696 In addition, you may define multiple actions for the same transition.
2697 Alternately, you may use '* -> x' to match more than one transition.
2698 For example:
2699
2700     default => {
2701         ...
2702         actions => [
2703             ...
2704             'new -> rejected' => { label => 'Reject', update => 'Respond' },
2705             'new -> rejected' => { label => 'Quick Reject' },
2706             ...
2707             '* -> deleted' => { label => 'Delete' },
2708             ...
2709         ],
2710         ...
2711     },
2712
2713 =head2 Moving tickets between queues with different lifecycles
2714
2715 Unless there is an explicit mapping between statuses in two different
2716 lifecycles, you can not move tickets between queues with these
2717 lifecycles.  This is true even if the different lifecycles use the exact
2718 same set of statuses.  Such a mapping is defined as follows:
2719
2720     __maps__ => {
2721         'from lifecycle -> to lifecycle' => {
2722             'status in left lifecycle' => 'status in right lifecycle',
2723             ...
2724         },
2725         ...
2726     },
2727
2728 =cut
2729
2730 Set(%Lifecycles,
2731     default => {
2732         initial         => [ 'new' ],
2733         active          => [ 'open', 'stalled' ],
2734         inactive        => [ 'resolved', 'rejected', 'deleted' ],
2735
2736         defaults => {
2737             on_create => 'new',
2738             on_merge  => 'resolved',
2739             approved  => 'open',
2740             denied    => 'rejected',
2741             reminder_on_open     => 'open',
2742             reminder_on_resolve  => 'resolved',
2743         },
2744
2745         transitions => {
2746             ''       => [qw(new open resolved)],
2747
2748             # from   => [ to list ],
2749             new      => [qw(open stalled resolved rejected deleted)],
2750             open     => [qw(new stalled resolved rejected deleted)],
2751             stalled  => [qw(new open rejected resolved deleted)],
2752             resolved => [qw(new open stalled rejected deleted)],
2753             rejected => [qw(new open stalled resolved deleted)],
2754             deleted  => [qw(new open stalled rejected resolved)],
2755         },
2756         rights => {
2757             '* -> deleted'  => 'DeleteTicket',
2758             '* -> *'        => 'ModifyTicket',
2759         },
2760         actions => [
2761             'new -> open'      => {
2762                 label  => 'Open It', # loc
2763                 update => 'Respond',
2764             },
2765             'new -> resolved'  => {
2766                 label  => 'Resolve', # loc
2767                 update => 'Comment',
2768             },
2769             'new -> rejected'  => {
2770                 label  => 'Reject', # loc
2771                 update => 'Respond',
2772             },
2773             'new -> deleted'   => {
2774                 label  => 'Delete', # loc
2775             },
2776
2777             'open -> stalled'  => {
2778                 label  => 'Stall', # loc
2779                 update => 'Comment',
2780             },
2781             'open -> resolved' => {
2782                 label  => 'Resolve', # loc
2783                 update => 'Comment',
2784             },
2785             'open -> rejected' => {
2786                 label  => 'Reject', # loc
2787                 update => 'Respond',
2788             },
2789
2790             'stalled -> open'  => {
2791                 label  => 'Open It', # loc
2792             },
2793             'resolved -> open' => {
2794                 label  => 'Re-open', # loc
2795                 update => 'Comment',
2796             },
2797             'rejected -> open' => {
2798                 label  => 'Re-open', # loc
2799                 update => 'Comment',
2800             },
2801             'deleted -> open'  => {
2802                 label  => 'Undelete', # loc
2803             },
2804         ],
2805     },
2806 # don't change lifecyle of the approvals, they are not capable to deal with
2807 # custom statuses
2808     approvals => {
2809         initial         => [ 'new' ],
2810         active          => [ 'open', 'stalled' ],
2811         inactive        => [ 'resolved', 'rejected', 'deleted' ],
2812
2813         defaults => {
2814             on_create => 'new',
2815             on_merge => 'resolved',
2816             reminder_on_open     => 'open',
2817             reminder_on_resolve  => 'resolved',
2818         },
2819
2820         transitions => {
2821             ''       => [qw(new open resolved)],
2822
2823             # from   => [ to list ],
2824             new      => [qw(open stalled resolved rejected deleted)],
2825             open     => [qw(new stalled resolved rejected deleted)],
2826             stalled  => [qw(new open rejected resolved deleted)],
2827             resolved => [qw(new open stalled rejected deleted)],
2828             rejected => [qw(new open stalled resolved deleted)],
2829             deleted  => [qw(new open stalled rejected resolved)],
2830         },
2831         rights => {
2832             '* -> deleted'  => 'DeleteTicket',
2833             '* -> rejected' => 'ModifyTicket',
2834             '* -> *'        => 'ModifyTicket',
2835         },
2836         actions => [
2837             'new -> open'      => {
2838                 label  => 'Open It', # loc
2839                 update => 'Respond',
2840             },
2841             'new -> resolved'  => {
2842                 label  => 'Resolve', # loc
2843                 update => 'Comment',
2844             },
2845             'new -> rejected'  => {
2846                 label  => 'Reject', # loc
2847                 update => 'Respond',
2848             },
2849             'new -> deleted'   => {
2850                 label  => 'Delete', # loc
2851             },
2852
2853             'open -> stalled'  => {
2854                 label  => 'Stall', # loc
2855                 update => 'Comment',
2856             },
2857             'open -> resolved' => {
2858                 label  => 'Resolve', # loc
2859                 update => 'Comment',
2860             },
2861             'open -> rejected' => {
2862                 label  => 'Reject', # loc
2863                 update => 'Respond',
2864             },
2865
2866             'stalled -> open'  => {
2867                 label  => 'Open It', # loc
2868             },
2869             'resolved -> open' => {
2870                 label  => 'Re-open', # loc
2871                 update => 'Comment',
2872             },
2873             'rejected -> open' => {
2874                 label  => 'Re-open', # loc
2875                 update => 'Comment',
2876             },
2877             'deleted -> open'  => {
2878                 label  => 'Undelete', # loc
2879             },
2880         ],
2881     },
2882 );
2883
2884
2885
2886
2887
2888 =head1 Administrative interface
2889
2890 =over 4
2891
2892 =item C<$ShowRTPortal>
2893
2894 RT can show administrators a feed of recent RT releases and other
2895 related announcements and information from Best Practical on the top
2896 level Admin page.  This feature helps you stay up to date on
2897 RT security announcements and version updates.
2898
2899 RT provides this feature using an "iframe" on C</Admin/index.html>
2900 which asks the administrator's browser to show an inline page from
2901 Best Practical's website.
2902
2903 If you'd rather not make this feature available to your
2904 administrators, set C<$ShowRTPortal> to a false value.
2905
2906 =cut
2907
2908 Set($ShowRTPortal, 1);
2909
2910 =item C<%AdminSearchResultFormat>
2911
2912 In the admin interface, format strings similar to tickets result
2913 formats are used. Use C<%AdminSearchResultFormat> to define the format
2914 strings used in the admin interface on a per-RT-class basis.
2915
2916 =cut
2917
2918 Set(%AdminSearchResultFormat,
2919     Queues =>
2920         q{'<a href="__WebPath__/Admin/Queues/Modify.html?id=__id__">__id__</a>/TITLE:#'}
2921         .q{,'<a href="__WebPath__/Admin/Queues/Modify.html?id=__id__">__Name__</a>/TITLE:Name'}
2922         .q{,__Description__,__Address__,__Priority__,__DefaultDueIn__,__Disabled__,__Lifecycle__},
2923
2924     Groups =>
2925         q{'<a href="__WebPath__/Admin/Groups/Modify.html?id=__id__">__id__</a>/TITLE:#'}
2926         .q{,'<a href="__WebPath__/Admin/Groups/Modify.html?id=__id__">__Name__</a>/TITLE:Name'}
2927         .q{,'__Description__'},
2928
2929     Users =>
2930         q{'<a href="__WebPath__/Admin/Users/Modify.html?id=__id__">__id__</a>/TITLE:#'}
2931         .q{,'<a href="__WebPath__/Admin/Users/Modify.html?id=__id__">__Name__</a>/TITLE:Name'}
2932         .q{,__RealName__, __EmailAddress__},
2933
2934     CustomFields =>
2935         q{'<a href="__WebPath__/Admin/CustomFields/Modify.html?id=__id__">__id__</a>/TITLE:#'}
2936         .q{,'<a href="__WebPath__/Admin/CustomFields/Modify.html?id=__id__">__Name__</a>/TITLE:Name'}
2937         .q{,__AddedTo__, __FriendlyType__, __FriendlyPattern__},
2938
2939     Scrips =>
2940         q{'<a href="__WebPath__/Admin/Scrips/Modify.html?id=__id__">__id__</a>/TITLE:#'}
2941         .q{,'<a href="__WebPath__/Admin/Scrips/Modify.html?id=__id__">__Description__</a>/TITLE:Description'}
2942         .q{,__Condition__, __Action__, __Template__, __Disabled__},
2943
2944     Templates =>
2945         q{'<a href="__WebPath__/__WebRequestPathDir__/Template.html?Queue=__QueueId__&Template=__id__">__id__</a>/TITLE:#'}
2946         .q{,'<a href="__WebPath__/__WebRequestPathDir__/Template.html?Queue=__QueueId__&Template=__id__">__Name__</a>/TITLE:Name'}
2947         .q{,'__Description__','__UsedBy__','__IsEmpty__'},
2948     Classes =>
2949         q{ '<a href="__WebPath__/Admin/Articles/Classes/Modify.html?id=__id__">__id__</a>/TITLE:#'}
2950         .q{,'<a href="__WebPath__/Admin/Articles/Classes/Modify.html?id=__id__">__Name__</a>/TITLE:Name'}
2951         .q{,__Description__},
2952 );
2953
2954 =back
2955
2956
2957
2958
2959 =head1 Development options
2960
2961 =over 4
2962
2963 =item C<$DevelMode>
2964
2965 RT comes with a "Development mode" setting.  This setting, as a
2966 convenience for developers, turns on several of development options
2967 that you most likely don't want in production:
2968
2969 =over 4
2970
2971 =item *
2972
2973 Disables CSS and JS minification and concatenation.  Both CSS and JS
2974 will be instead be served as a number of individual smaller files,
2975 unchanged from how they are stored on disk.
2976
2977 =item *
2978
2979 Uses L<Module::Refresh> to reload changed Perl modules on each
2980 request.
2981
2982 =item *
2983
2984 Turns off Mason's C<static_source> directive; this causes Mason to
2985 reload template files which have been modified on disk.
2986
2987 =item *
2988
2989 Turns on Mason's HTML C<error_format>; this renders compilation errors
2990 to the browser, along with a full stack trace.  It is possible for
2991 stack traces to reveal sensitive information such as passwords or
2992 ticket content.
2993
2994 =item *
2995
2996 Turns off caching of callbacks; this enables additional callbacks to
2997 be added while the server is running.
2998
2999 =back
3000
3001 =cut
3002
3003 Set($DevelMode, 0);
3004
3005
3006 =item C<$RecordBaseClass>
3007
3008 What abstract base class should RT use for its records. You should
3009 probably never change this.
3010
3011 Valid values are C<DBIx::SearchBuilder::Record> or
3012 C<DBIx::SearchBuilder::Record::Cachable>
3013
3014 =cut
3015
3016 Set($RecordBaseClass, "DBIx::SearchBuilder::Record::Cachable");
3017
3018
3019 =item C<@MasonParameters>
3020
3021 C<@MasonParameters> is the list of parameters for the constructor of
3022 HTML::Mason's Apache or CGI Handler.  This is normally only useful for
3023 debugging, e.g. profiling individual components with:
3024
3025     use MasonX::Profiler; # available on CPAN
3026     Set(@MasonParameters, (preamble => 'my $p = MasonX::Profiler->new($m, $r);'));
3027
3028 =cut
3029
3030 Set(@MasonParameters, ());
3031
3032 =item C<$StatementLog>
3033
3034 RT has rudimentary SQL statement logging support; simply set
3035 C<$StatementLog> to be the level that you wish SQL statements to be
3036 logged at.
3037
3038 Enabling this option will also expose the SQL Queries page in the
3039 Admin -> Tools menu for SuperUsers.
3040
3041 =cut
3042
3043 Set($StatementLog, undef);
3044
3045 =back
3046
3047 =cut
3048
3049 1;