diff --git a/majordomo/alias_setup.cgi b/majordomo/alias_setup.cgi index 313421e09..75b58e452 100755 --- a/majordomo/alias_setup.cgi +++ b/majordomo/alias_setup.cgi @@ -20,6 +20,6 @@ if ($in{'owner_a'}) { $email = { 'enabled' => 1, 'name' => $in{'email_a'}, 'values' => [ "|$wrapper_path majordomo" ] }; -&foreign_call("sendmail", "create_alias", $email, $aliases_files); +&foreign_call($aliases_module, "create_alias", $email, $aliases_files); &redirect(""); diff --git a/majordomo/create_form.cgi b/majordomo/create_form.cgi index 6b7a533ca..1abf6cc35 100755 --- a/majordomo/create_form.cgi +++ b/majordomo/create_form.cgi @@ -6,6 +6,7 @@ require './majordomo-lib.pl'; %access = &get_module_acl(); $access{'create'} || &error($text{'create_ecannot'}); &ui_print_header(undef, $text{'create_title'}, ""); +$bcss=' style="display: box; float: left; padding: 10px;"'; print < @@ -38,14 +39,16 @@ print < $text{'create_archive'} - +
EOF +print &ui_submit($text{'create'})."
"; + &ui_print_footer("", $text{'index_return'}); diff --git a/majordomo/create_list.cgi b/majordomo/create_list.cgi index c55597471..76312a859 100755 --- a/majordomo/create_list.cgi +++ b/majordomo/create_list.cgi @@ -44,15 +44,26 @@ $in{'footer'} =~ s/\r//g; &set_permissions("$ldir/$in{'name'}"); &unlock_file("$ldir/$in{'name'}"); + + # Have majordomo create the new config file, by fooling the wrapper # into thinking it has received an email with a resend command +#$lfile = "$ldir/$in{'name'}.config"; +#$cmd = "$wrapper_program_path resend -l $in{'name'} nobody"; +#open(WRAPPER, "|$cmd nobody >/dev/null 2>&1"); +#print WRAPPER "config $in{'name'} $in{'password'}\n\n"; +#close(WRAPPER); +#&additional_log("exec", $cmd); +#sleep(3); + +# use provided template, majordomo provides onyl minimal needed config $lfile = "$ldir/$in{'name'}.config"; -$cmd = "$wrapper_program_path resend -l $in{'name'} nobody"; -open(WRAPPER, "|$cmd nobody >/dev/null 2>&1"); -print WRAPPER "config $in{'name'} $in{'password'}\n\n"; -close(WRAPPER); -&additional_log("exec", $cmd); -sleep(3); +# copy listdir template to list.info, fallback copy from template.dist +if ( ! -f "template/list.config") { ©_source_dest("template/list.config.dist","template/list.config"); } +if ( ! -f "template/list.config") { &error("No default template found: template/list.config"); } +if ( ! -f "$lfile") { ©_source_dest("template/list.config", $lfile); } +if ( ! -f "$lfile") { &error("Could not create list config: $file"); } +&set_permissions("$lfile"); # create the .info file &lock_file($lfile); @@ -72,7 +83,11 @@ if (&find_value("date_info", $list) eq "yes") { # create the archive directory $adir = &perl_var_replace(&find_value("filedir", $conf), $conf); $aext = &perl_var_replace(&find_value("filedir_suffix", $conf), $conf); -if ($adir && $aext) { +if( -d "$adir" && $adir =~ /\/archive$/) { + # filedir exist and ends with /archive + $arch = "$adir/$in{'name'}"; +} +elsif ($adir && $aext) { &lock_file("$adir/$in{'name'}$aext"); mkdir("$adir/$in{'name'}$aext", 0755); &set_permissions("$adir/$in{'name'}$aext"); diff --git a/majordomo/delete_list.cgi b/majordomo/delete_list.cgi index e494b9a45..3d68e55df 100755 --- a/majordomo/delete_list.cgi +++ b/majordomo/delete_list.cgi @@ -83,23 +83,37 @@ if ($in{'confirm'}) { &redirect(""); } else { + # css for table + local $tcss='style="width: 98%; margin: 1% !important;"'; + local $dcss='style="text-align: right; vertical-align: middle; padding: 0.3em 1em !important; min_heigth: 5em;"'; + local $vcss='style="width: 40%; border: 1px solid lightgrey; padding: 0.3em !important;"'; + # ask the user if he is sure - &ui_print_header(undef, $text{'delete_title'}."
".&html_escape($name)."", ""); - print "",&text('delete_rusure', "".&html_escape($name).""), + &ui_print_header(undef, $text{'delete_title'}.": ".&html_escape($in{'name'}), ""); + print "\n"; + print ""; + print "
".&text('delete_rusure', "".&html_escape($name).""),"
\n"; "
\n"; print "
    \n"; foreach $f (@files) { print "",&html_escape($f),"
    \n"; } print "
\n"; - print "$text{'delete_aliases'}
\n"; + print "\n"; + print "
\n"; + print "\n"; + print ""; + print "
".&text('delete_aliases'),"
\n"; print "
    \n"; foreach $a (@daliases) { print "",&html_escape("$a->{'name'}: $a->{'value'}"), "
    \n"; } print "
\n"; + print "\n"; + print "
\n"; local $bcss=' style="padding: 10px; text-align: center;"'; + local $name_link="?name=".&urlize($in{'name'}); print "
", &ui_submit($text{'delete_ok'})."
\n"; &ui_print_footer("edit_list.cgi?name=$name", $text{'edit_return'}); diff --git a/majordomo/digest_form.cgi b/majordomo/digest_form.cgi index fd95b5b84..a4c07189d 100755 --- a/majordomo/digest_form.cgi +++ b/majordomo/digest_form.cgi @@ -40,7 +40,8 @@ print < $lines - +EOF +print &ui_submit($text{'create'}),""; EOF &ui_print_footer("", $text{'index_return'}); diff --git a/majordomo/edit_access.cgi b/majordomo/edit_access.cgi index 915e73e6e..e0b6c8b82 100755 --- a/majordomo/edit_access.cgi +++ b/majordomo/edit_access.cgi @@ -83,7 +83,7 @@ print "\n"; print " $text{'access_taboo'} \n"; print "\n"; -print "\n"; +print &ui_submit($text{'save'}),"\n"; &ui_print_footer("edit_list.cgi?name=$in{'name'}", $text{'edit_return'}); diff --git a/majordomo/edit_head.cgi b/majordomo/edit_head.cgi index 7cfa0e4d2..35fc5677e 100755 --- a/majordomo/edit_head.cgi +++ b/majordomo/edit_head.cgi @@ -30,6 +30,6 @@ print &multi_input("message_headers", $text{'head_headers'}, $conf); print "\n"; print "\n"; -print "\n"; +print &ui_submit($text{'save'}),"\n"; &ui_print_footer("edit_list.cgi?name=$in{'name'}", $text{'edit_return'}); diff --git a/majordomo/edit_info.cgi b/majordomo/edit_info.cgi index e190dc521..9e106bb93 100755 --- a/majordomo/edit_info.cgi +++ b/majordomo/edit_info.cgi @@ -45,7 +45,7 @@ close(INTRO); print " \n"; print "\n"; -print "\n"; +print &ui_submit($text{'save'}),"\n"; &ui_print_footer("edit_list.cgi?name=$in{'name'}", $text{'edit_return'}); diff --git a/majordomo/edit_list.cgi b/majordomo/edit_list.cgi index f2dd6511d..cdcdbd670 100755 --- a/majordomo/edit_list.cgi +++ b/majordomo/edit_list.cgi @@ -11,11 +11,9 @@ $list = &get_list($in{'name'}, &get_config()); $conf = &get_list_config($list->{'config'}); local $moderate= (&find_value('moderate', $conf) =~ /no/) ? "" : " (".$text{'index_moderated'}.")"; -&ui_print_header(undef, $text{'edit_title'}."
".&html_escape($in{'name'})."$moderate", ""); +&ui_print_header( $text{'misc_header'}, $text{'edit_title'}.": ".&html_escape($in{'name'})."$moderate", ""); -@links = ( "edit_subs.cgi", - "edit_mesg.cgi", "edit_access.cgi", - "edit_misc.cgi" ); +@links = ( "edit_subs.cgi", "edit_access.cgi", "edit_misc.cgi" ); foreach $a (&foreign_call($aliases_module, "list_aliases", &get_aliases_file())) { if ($a->{'name'} =~ /-digestify$/i && @@ -39,8 +37,19 @@ print $otherbut; # css for table local $tcss='style="width: 98%; margin: 1% !important;"'; -local $dcss='style="text-align: right; vertical-align: top; padding: 5px !important; min_heigth: 5em;"'; -local $vcss='style="width: 40%; border: 1px solid lightgrey; padding: 5px !important;"'; +local $dcss='style="text-align: right; vertical-align: middle; padding: 0.3em 1em !important; min_heigth: 5em;"'; +local $vcss='style="width: 40%; border: 1px solid lightgrey; padding: 0.3em !important;"'; + +# list optionen +print "\n"; +print ""; +print "\n"; +print "
$text{'mesg_header'}
", + &ui_submit($text{'modify'}),"
\n
\n"; + +print "\n"; +print "\n"; +print "
".$text{'mesg_reply'}."",&find_value("reply_to", $conf)."
".$text{'mesg_subject'}."".&find_value("subject_prefix", $conf)."
\n"; # title, descritpion, info print "\n"; @@ -111,4 +120,7 @@ print "
$text{'edit_deletemsg'}
\n"; &ui_print_footer("", $text{'index_return'}); - +print ""; diff --git a/majordomo/edit_members.cgi b/majordomo/edit_members.cgi index 52f9c0a96..f291e43e2 100755 --- a/majordomo/edit_members.cgi +++ b/majordomo/edit_members.cgi @@ -10,12 +10,16 @@ $list = &get_list($in{'name'}, &get_config()); $desc = &text('edit_for', "".&html_escape($in{'name'}).""); &ui_print_header($desc, $text{'members_title'}, ""); +print "
\n"; +print "\n"; +print "\n"; + print "
"; if ($access{'edit'}) { - print "$text{'members_desc'}
\n"; + print "$text{'members_desc'}\n"; } else { - print "$text{'members_rodesc'}
\n"; + print "$text{'members_rodesc'}\n"; } +print "
\n"; print "\n"; print "\n"; print "\n"; if (!$access{'edit'}) { - print "

\n"; + print "

\n"; } else { - print "
\n"; - print &ui_hr(); + print "
\n"; - print "\n"; + print "
\n"; print "\n"; print "\n"; + &ui_submit($text{'members_add'}, "add"),"\n"; print "\n"; - print "\n"; - print "
$text{'members_sub'} ", - "
$text{'members_unsub'} ", - "
\n"; + print "
", + &ui_submit($text{'delete'}, "remove"), "
\n"; - print &ui_hr(); print "
\n"; print "\n"; - print "\n"; + print "
\n"; + print "\n"; + print "
$text{'misc_header'}
\n"; $sync = $config{"sync_$in{'name'}"}; print "\n"; - print "\n"; - - print "
$text{'members_sync'} \n"; printf " %s\n", @@ -57,11 +59,9 @@ else { $shost = $config{"shost_$in{'name'}"}; print "
$text{'members_dom'}\n"; - print "
\n"; + print "\n"; + print &ui_submit($text{'save'})," \n"; + print "\n"; } &ui_print_footer("edit_list.cgi?name=$in{'name'}", $text{'edit_return'}); - diff --git a/majordomo/edit_mesg.cgi b/majordomo/edit_mesg.cgi index acb16ebe4..3b7180844 100755 --- a/majordomo/edit_mesg.cgi +++ b/majordomo/edit_mesg.cgi @@ -48,7 +48,7 @@ print &opt_input("maxlength", $text{'mesg_maxlength'}, $conf, print "\n"; print "\n"; -print "\n"; +print &ui_submit($text{'save'}),"\n"; &ui_print_footer("edit_list.cgi?name=$in{'name'}", $text{'edit_return'}); diff --git a/majordomo/edit_misc.cgi b/majordomo/edit_misc.cgi index 8732dd579..69de78856 100755 --- a/majordomo/edit_misc.cgi +++ b/majordomo/edit_misc.cgi @@ -32,7 +32,7 @@ print &choice_input("date_intro", $text{'misc_intro'}, print "\n"; print "\n"; -print "\n"; +print &ui_submit($text{'save'}),"\n"; &ui_print_footer("edit_list.cgi?name=$in{'name'}", $text{'edit_return'}); diff --git a/majordomo/edit_subs.cgi b/majordomo/edit_subs.cgi index 78358a77f..fc122747e 100755 --- a/majordomo/edit_subs.cgi +++ b/majordomo/edit_subs.cgi @@ -91,7 +91,7 @@ print "$text{'subs_approval'}\n"; print " \n"; print "\n"; -print "\n"; +print &ui_submit($text{'save'}),"\n"; &ui_print_footer("edit_list.cgi?name=$in{'name'}", $text{'edit_return'}); diff --git a/majordomo/index.cgi b/majordomo/index.cgi index 321136fc4..c48572356 100755 --- a/majordomo/index.cgi +++ b/majordomo/index.cgi @@ -135,12 +135,16 @@ if (@lists) { push(@cols, "",""); push(@cols, "". &html_escape($l) ."" ); open(INFO, $list->{'info'}); - push(@cols, "".."" ."  edit"); + local $info=; + $info= if ( $info =~ !/^\[Last updated on:/); + push(@cols, "".$info."" ."  edit"); close(INFO); - #push(@cols, $l . "-owner"); - push(@cols, "". &find_value('reply_to', $conf) .""); - push(@cols, "
". $text{&find_value('moderate', $conf)} ."
"); - push(@cols, "
".`cat $list->{'members'} | wc -l` . "  edit
"); + push(@cols, "". &find_value('reply_to', $conf) . + "  edit"); + push(@cols, "
". $text{&find_value('moderate', $conf)} . + "" ."  edit
"); + push(@cols, "
".`cat $list->{'members'} | wc -l` . + "  edit
"); print&ui_columns_row(\@cols, \@tds); } } else { @@ -156,10 +160,14 @@ if ($access{'global'}) { &ui_print_footer("/", $text{'index'}); print "", ""; diff --git a/majordomo/majordomo-lib.pl b/majordomo/majordomo-lib.pl index d5c2f51e6..119728979 100755 --- a/majordomo/majordomo-lib.pl +++ b/majordomo/majordomo-lib.pl @@ -129,6 +129,7 @@ $list{'members'} = "$ldir/$_[0]"; $list{'config'} = "$ldir/$_[0].config"; $list{'info'} = "$ldir/$_[0].info"; $list{'intro'} = "$ldir/$_[0].intro"; +$list{'owner'} = "$ldir/$_[0].owner"; return \%list; } diff --git a/majordomo/save_members.cgi b/majordomo/save_members.cgi index 0bc017347..db68e9437 100755 --- a/majordomo/save_members.cgi +++ b/majordomo/save_members.cgi @@ -34,34 +34,50 @@ if ($in{'update'}) { &webmin_log("members", undef, $in{'name'}); } elsif ($in{'add'}) { - # call majordomo to subscribe an address + # call send_mail to subscribe an address $pass || &error($text{'members_esub'}); $in{'addr_a'} =~ /^(\S+)\@(\S+)\.(\S+)$/ || &error($text{'members_esubaddr'}); - open(WRAPPER, "|$wrapper_path majordomo"); - printf WRAPPER "From: %s\n\n", - $owner ? $owner : $in{'addr_a'}; - print WRAPPER "approve $pass subscribe $in{'name'} $in{'addr_a'}\n\n"; - close(WRAPPER); - sleep(1); + $mail=sprintf("From: %s\nTo: %s\nSubject: subcribe\n\n", + $owner ? $owner : $in{'addr_a'}, "majordomo"); + $mail .= "approve $pass subscribe $in{'name'} $in{'addr_a'}\n\n"; + &send_mail($mail); &unlock_file($list->{'members'}); &webmin_log("subscribe", undef, $in{'name'}, { 'addr' => $in{'addr_a'} }); } elsif ($in{'remove'}) { - # call majordomo to unsubscribe an address + # call send_mail to unsubscribe an address $pass || &error($text{'members_eunsub'}); $in{'addr_r'} =~ /^(\S+)\@(\S+)\.(\S+)$/ || &error($text{'members_eunsubaddr'}); - open(WRAPPER, "|$wrapper_path majordomo"); - printf WRAPPER "From: %s\n\n", - $owner ? $owner : $in{'addr_r'}; - print WRAPPER "approve $pass unsubscribe $in{'name'} $in{'addr_r'}\n\n"; - close(WRAPPER); - sleep(1); + $mail=sprintf("From: %s\nTo: %s\nSubject: unsubcribe\n\n", + $owner ? $owner : $in{'addr_a'}, "majordomo"); + $mail .= "approve $pass unsubscribe $in{'name'} $in{'addr_r'}\n\n"; + &send_mail($mail); &unlock_file($list->{'members'}); &webmin_log("unsubscribe", undef, $in{'name'}, { 'addr' => $in{'addr_r'} }); } &redirect("edit_list.cgi?name=$in{'name'}"); +sub send_mail + { + local $sent,$mail=$_[0]; + if (!$sent) { + # Try to send the email by calling sendmail -t + %sconfig = &foreign_config("sendmail"); + $sendmail = $sconfig{'sendmail_path'} ? $sconfig{'sendmail_path'} + : &has_command("sendmail"); + if (-x $sendmail && open(MAIL, "| $sendmail -t")) { + print MAIL $mail; + if (close(MAIL)) { + $sent = 2; + } + } + } + + if (!$sent) { + &error($text{'global_esendmail'}, ""); + } + } diff --git a/majordomo/save_subs.cgi b/majordomo/save_subs.cgi index 6e8244fe9..7895ca52d 100755 --- a/majordomo/save_subs.cgi +++ b/majordomo/save_subs.cgi @@ -32,15 +32,15 @@ foreach $a (@aliases) { $ownerlist = $a if (lc($a->{'name'}) eq lc("owner-$in{'name'}")); $approval = $a if (lc($a->{'name'}) eq lc("$in{'name'}-approval")); } -&foreign_call('sendmail', 'modify_alias', $listowner, +&foreign_call($aliases_module, 'modify_alias', $listowner, { 'name' => "$in{'name'}-owner", 'values' => [ $in{'owner'} ], 'enabled' => 1 }) if ($listowner); -&foreign_call('sendmail', 'modify_alias', $ownerlist, +&foreign_call($aliases_module, 'modify_alias', $ownerlist, { 'name' => "owner-$in{'name'}", 'values' => [ $in{'owner'} ], 'enabled' => 1 }) if ($ownerlist); -&foreign_call('sendmail', 'modify_alias', $approval, +&foreign_call($aliases_module, 'modify_alias', $approval, { 'name' => "$in{'name'}-approval", 'values' => [ $in{'approval'} ], 'enabled' => 1 }) if ($approval); diff --git a/majordomo/template/list.config.dist b/majordomo/template/list.config.dist new file mode 100644 index 000000000..3777bee06 --- /dev/null +++ b/majordomo/template/list.config.dist @@ -0,0 +1,388 @@ +# The DEFAULT webmin configuration file for a majordomo mailing list. +# Comments start with the first # on a line, and continue to the end +# of the line. There is no way to escape the # character. The file +# uses either a key = value for simple (i.e. a single) values, or uses +# a here document +# key << END +# value 1 +# value 2 +# [ more values 1 per line] +# END +# for installing multiple values in array types. Note that the here +# document delimiter (END in the example above) must be the same at the end +# of the list of entries as it is after the << characters. +# Within a here document, the # sign is NOT a comment character. +# A blank line is allowed only as the last line in the here document. +# +# The values can have multiple forms: +# +# absolute_dir -- A root anchored (i.e begins with a /) directory +# absolute_file -- A root anchored (i.e begins with a /) file +# bool -- choose from: yes, no, y, n +# enum -- One of a list of possible values +# integer -- an integer (string made up of the digits 0-9, +# no decimal point) +# float -- a floating point number with decimal point. +# regexp -- A perl style regular expression with +# leading and trailing /'s. +# restrict_post -- a series of space or : separated file names in which +# to look up the senders address +# (restrict-post should go away to be replaced by an +# array of files) +# string -- any text up until a \n stripped of +# leading and trailing whitespace +# word -- any text with no embedded whitespace +# +# A blank value is also accepted, and will undefine the corresponding keyword. +# The character Control-A may not be used in the file. +# +# A trailing _array on any of the above types means that that keyword +# will allow more than one value. +# +# Within a here document for a string_array, the '-' sign takes on a special +# significance. +# +# To embed a blank line in the here document, put a '-' as the first +# and ONLY character on the line. +# +# To preserve whitespace at the beginning of a line, put a - on the +# line before the whitespace to be preserved +# +# To put a literal '-' at the beginning of a line, double it. +# +# +# The default if the keyword is not supplied is given in ()'s while the +# type of value is given in [], the subsystem the keyword is used in is +# listed in <>'s. (undef) as default value means that the keyword is not +# defined or used. + + # admin_passwd [word] (admin.admin) + # The password for handling administrative tasks on the list. +admin_passwd = + + # administrivia [bool] (yes) + # Look for administrative requests (e.g. subscribe/unsubscribe) and + # forward them to the list maintainer instead of the list. +administrivia = no + + # advertise [regexp_array] (undef) + # If the requestor email address matches one of these regexps, then + # the list will be listed in the output of a lists command. Failure + # to match any regexp excludes the list from the output. The + # regexps under noadvertise override these regexps. +advertise << END + +END + + # announcements [bool] (yes) + # If set to yes, comings and goings to the list will be sent to the + # list owner. These SUBSCRIBE/UNSUBSCRIBE event announcements are + # informational only (no action is required), although it is highly + # recommended that they be monitored to watch for list abuse. +announcements = yes + + # approve_passwd [word] (admin.pass) + # Password to be used in the approved header to allow posting to + # moderated list, or to bypass resend checks. +approve_passwd = + + # archive_dir [absolute_dir] (undef) + # The directory where the mailing list archive is kept. This item + # does not currently work. Leave it blank. +archive_dir = + + # comments [string_array] (undef) + # Comment string that will be retained across config file rewrites. +comments << END + +END + + # date_info [bool] (yes) + # Put the last updated date for the info file at the top of the + # info file rather than having it appended with an info command. + # This is useful if the file is being looked at by some means other + # than majordomo (e.g. finger). +date_info = yes + + # date_intro [bool] (yes) + # Put the last updated date for the intro file at the top of the + # intro file rather than having it appended with an intro command. + # This is useful if the file is being looked at by some means other + # than majordomo (e.g. finger). +date_intro = yes + + # debug [bool] (no) + # Don't actually forward message, just go though the motions. +debug = no + + # description [string] (undef) + # Used as description for mailing list when replying to the lists + # command. There is no quoting mechanism, and there is only room + # for 50 or so characters. +description = + + # digest_archive [absolute_dir] (undef) + # The directory where the digest archive is kept. This item does + # not currently work. Leave it blank. +digest_archive = + + # digest_issue [integer] (1) + # The issue number of the next issue +digest_issue = 1 + + # digest_maxdays [integer] (undef) + # automatically generate a new digest when the age of the oldest + # article in the queue exceeds this number of days. +digest_maxdays = + + # digest_maxlines [integer] (undef) + # automatically generate a new digest when the size of the digest + # exceeds this number of lines. +digest_maxlines = + + # digest_name [string] (admin) + # The subject line for the digest. This string has the volume and + # issue appended to it. +digest_name = + + # digest_rm_footer [word] (undef) + # The value is the name of the list that applies the header and + # footers to the messages that are received by digest. This allows + # the list supplied headers and footers to be stripped before the + # messages are included in the digest. +digest_rm_footer = + + # digest_rm_fronter [word] (undef) + # Works just like digest_rm_footer, except it removes the front + # material. +digest_rm_fronter = + + # digest_volume [integer] (1) + # The current volume number +digest_volume = 1 + + # digest_work_dir [absolute_dir] (undef) + # The directory used as scratch space for digest. Don't change + # this unless you know what you are doing +digest_work_dir = + + # get_access [enum] (list) /open;closed;list/ + # One of three values: open, list, closed. Open allows anyone + # access to this command and closed completely disables the command + # for everyone. List allows only list members access, or if + # restrict_post is defined, only the addresses in those files are + # allowed access. +get_access = list + + # index_access [enum] (open) /open;closed;list/ + # One of three values: open, list, closed. Open allows anyone + # access to this command and closed completely disables the command + # for everyone. List allows only list members access, or if + # restrict_post is defined, only the addresses in those files are + # allowed access. +index_access = open + + # info_access [enum] (open) /open;closed;list/ + # One of three values: open, list, closed. Open allows anyone + # access to this command and closed completely disables the command + # for everyone. List allows only list members access, or if + # restrict_post is defined, only the addresses in those files are + # allowed access. +info_access = open + + # intro_access [enum] (list) /open;closed;list/ + # One of three values: open, list, closed. Open allows anyone + # access to this command and closed completely disables the command + # for everyone. List allows only list members access, or if + # restrict_post is defined, only the addresses in those files are + # allowed access. +intro_access = list + + # maxlength [integer] (40000) + # The maximum size of an unapproved message in characters. When + # used with digest, a new digest will be automatically generated if + # the size of the digest exceeds this number of characters. +maxlength = 40000 + + # message_footer [string_array] (undef) + # Text to be appended at the end of all messages posted to the + # list. The text is expanded before being used. The following + # expansion tokens are defined: $LIST - the name of the current + # list, $SENDER - the sender as taken from the from line, $VERSION, + # the version of majordomo. If used in a digest, no expansion + # tokens are provided +message_footer << END + +END + + # message_fronter [string_array] (undef) + # Text to be prepended to the beginning of all messages posted to + # the list. The text is expanded before being used. The following + # expansion tokens are defined: $LIST - the name of the current + # list, $SENDER - the sender as taken from the from line, $VERSION, + # the version of majordomo. If used in a digest, only the expansion + # token _SUBJECTS_ is available, and it expands to the list of + # message subjects in the digest +message_fronter << END + +END + + # message_headers [string_array] (undef) + # These headers will be appended to the headers of the posted + # message. The text is expanded before being used. The following + # expansion tokens are defined: $LIST - the name of the current + # list, $SENDER - the sender as taken from the from line, $VERSION, + # the version of majordomo. +message_headers << END + +END + + # moderate [bool] (no) + # If yes, all postings to the list will be bounced to the moderator + # for approval. +moderate = no + + # moderator [word] (undef) + # Address for directing posts which require approval. Such + # approvals might include moderated mail, administrivia traps, and + # restrict_post authorizations. If the moderator address is not + # set, it will default to the list-approval address. +moderator = + + # mungedomain [bool] (no) + # If set to yes, a different method is used to determine a matching + # address. When set to yes, addresses of the form user@dom.ain.com + # are considered equivalent to addresses of the form user@ain.com. + # This allows a user to subscribe to a list using the domain + # address rather than the address assigned to a particular machine + # in the domain. This keyword affects the interpretation of + # addresses for subscribe, unsubscribe, and all private options. +mungedomain = no + + # noadvertise [regexp_array] (undef) + # If the requestor name matches one of these regexps, then the list + # will not be listed in the output of a lists command. Noadvertise + # overrides advertise. +noadvertise << END + +END + + # precedence [word] (bulk) + # Put a precedence header with value into the outgoing + # message. +precedence = bulk + + # purge_received [bool] (no) + # Remove all received lines before resending the message. +purge_received = no + + # reply_to [word] () + # Put a reply-to header with value into the outgoing + # message. If the token $SENDER is used, then the address of the + # sender is used as the value of the reply-to header. This is the + # value of the reply-to header for digest lists. +reply_to = + + # resend_host [word] (undef) + # The host name that is appended to all address strings specified + # for resend. +resend_host = + + # restrict_post [restrict_post] (undef) + # If defined, only addresses listed in these files (colon or space + # separated) can post to the mailing list. By default, these files + # are relative to the lists directory. These files are also checked + # when get_access, index_access, info_access, intro_access, + # which_access, or who_access is set to 'list'. This is less useful + # than it seems it should be since there is no way to create these + # files if you do not have access to the machine running resend. + # This mechanism will be replaced in a future version of + # majordomo/resend. +restrict_post = + + # sender [word] (owner-admin) + # The envelope and sender address for the resent mail. This string + # has "@" and the value of resend_host appended to it to make a + # complete address. For majordomo, it provides the sender address + # for the welcome mail message generated as part of the subscribe + # command. +sender = + + # strip [bool] (yes) + # When adding address to the list, strip off all comments etc, and + # put just the raw address in the list file. In addition to the + # keyword, if the file .strip exists, it is the same as + # specifying a yes value. That yes value is overridden by the value + # of this keyword. +strip = yes + + # subject_prefix [word] (undef) + # This word will be prefixed to the subject line, if it is not + # already in the subject. The text is expanded before being used. + # The following expansion tokens are defined: $LIST - the name of + # the current list, $SENDER - the sender as taken from the from + # line, $VERSION, the version of majordomo. +subject_prefix = + + # subscribe_policy [enum] (open+confirm) /open;closed + # One of three values: open, closed, auto; plus an optional + # modifier: '+confirm'. Open allows people to subscribe themselves + # to the list. Auto allows anybody to subscribe anybody to the list + # without maintainer approval. Closed requires maintainer approval + # for all subscribe requests to the list. Adding '+confirm', ie, + # 'open+confirm', will cause majordomo to send a reply back to the + # subscriber which includes a authentication number which must be + # sent back in with another subscribe command. +subscribe_policy = open + + # taboo_body [regexp_array] (undef) + # If any line of the body matches one of these regexps, then the + # message will be bounced for review. +taboo_body << END + +END + + # taboo_headers [regexp_array] (undef) + # If any of the headers matches one of these regexps, then the + # message will be bounced for review. +taboo_headers << END + +END + + # unsubscribe_policy [enum] (open) /open;closed;auto;op + # One of three values: open, closed, auto; plus an optional + # modifier: '+confirm'. Open allows people to unsubscribe + # themselves from the list. Auto allows anybody to unsubscribe + # anybody to the list without maintainer approval. The existence of + # the file .auto is the same as specifying the value + # auto. Closed requires maintainer approval for all unsubscribe + # requests to the list. In addition to the keyword, if the file + # .closed exists, it is the same as specifying the value + # closed. Adding '+confirm', ie, 'auto+confirm', will cause + # majordomo to send a reply back to the subscriber if the request + # didn't come from the subscriber. The reply includes a + # authentication number which must be sent back in with another + # subscribe command. The value of this keyword overrides the value + # supplied by any existent files. +unsubscribe_policy = auto + + # welcome [bool] (yes) + # If set to yes, a welcome message (and optional 'intro' file) will + # be sent to the newly subscribed user. +welcome = yes + + # which_access [enum] (open) /open;closed;list/ + # One of three values: open, list, closed. Open allows anyone + # access to this command and closed completely disables the command + # for everyone. List allows only list members access, or if + # restrict_post is defined, only the addresses in those files are + # allowed access. +which_access = open + + # who_access [enum] (open) /open;closed;list/ + # One of three values: open, list, closed. Open allows anyone + # access to this command and closed completely disables the command + # for everyone. List allows only list members access, or if + # restrict_post is defined, only the addresses in those files are + # allowed access. +who_access = open