1#!/usr/local/bin/perl
2# Create, update or delete an autoreply filter
3
4require './filter-lib.pl';
5&ReadParse();
6&error_setup($text{'auto_err'});
7use Time::Local;
8
9# Find existing autoreply filter object
10&lock_file($procmail::procmailrc);
11@filters = &list_filters();
12($old) = grep { $_->{'actionreply'} && $_->{'nocond'} } @filters;
13$filter = $old;
14
15if ($filter && !$in{'enabled'}) {
16	# Just delete
17	&delete_filter($filter);
18	}
19elsif ($in{'enabled'}) {
20	# Create or update
21	if (!$filter) {
22		$filter = { 'actionreply' => 1,
23			    'body' => 0,
24			    'continue' => 1 };
25		}
26	$in{'reply'} =~ /\S/ || &error($text{'save_ereply'});
27	$in{'reply'} =~ s/\r//g;
28	$filter->{'reply'}->{'autotext'} = $in{'reply'};
29
30	# From address (automatic)
31	$filter->{'reply'}->{'from'} = &mailbox::get_preferred_from_address();
32
33	# File
34	$idx = defined($filter->{'index'}) ? $filter->{'index'}
35					   : scalar(@filters);
36	$filter->{'reply'}->{'autoreply'} ||=
37		"$remote_user_info[7]/autoreply.$idx.txt";
38
39	# Reply period
40	if ($config{'reply_force'}) {
41		# Forced to minimum
42		$min = $config{'reply_min'} || 60;
43		$filter->{'reply'}->{'period'} = $min*60;
44		$filter->{'reply'}->{'replies'} ||=
45			"$user_module_config_directory/replies";
46		}
47	elsif ($in{'period_def'}) {
48		# No autoreply period
49		delete($filter->{'reply'}->{'replies'});
50		delete($filter->{'reply'}->{'period'});
51		}
52	else {
53		# Set reply period and tracking file
54		$in{'period'} =~ /^\d+$/ ||
55			&error($text{'save_eperiod'});
56		if ($config{'reply_min'} &&
57		    $in{'period'} < $config{'reply_min'}) {
58			&error(&text('save_eperiodmin', $config{'reply_min'}));
59			}
60		$filter->{'reply'}->{'period'} = $in{'period'}*60;
61		$filter->{'reply'}->{'replies'} ||=
62			"$user_module_config_directory/replies";
63		}
64
65	# Save character set
66	if ($in{'charset_def'} == 1) {
67		delete($filter->{'reply'}->{'charset'});
68		}
69	elsif ($in{'charset_def'} == 2) {
70		$filter->{'reply'}->{'charset'} = &get_charset();
71		}
72	else {
73		$in{'charset'} =~ /^[a-z0-9\.\-\_]+$/i ||
74			error($text{'save_echarset'});
75		$filter->{'reply'}->{'charset'} = $in{'charset'};
76		}
77
78	# Save subject
79	if ($in{'subject_def'}) {
80		delete($filter->{'reply'}->{'subject'});
81		}
82	else {
83		$filter->{'reply'}->{'subject'} = $in{'subject'};
84		}
85
86	# Save autoreply start and end
87	foreach $p ('start', 'end') {
88		local ($s, $m, $h) = $p eq 'start' ? (0, 0, 0) :
89					(59, 59, 23);
90		if (!$in{$p.'_def'}) {
91			eval {
92				$tm = timelocal($s, $m, $h, $in{'d'.$p},
93				    $in{'m'.$p}-1, $in{'y'.$p}-1900);
94				};
95			$tm || &error($text{'save_e'.$p});
96			$filter->{'reply'}->{'autoreply_'.$p} = $tm;
97			}
98		else {
99			delete($filter->{'reply'}->{'autoreply_'.$p});
100			}
101		}
102
103	if ($old) {
104		&modify_filter($filter);
105		}
106	else {
107		&insert_filter($filter);
108		}
109	}
110
111&unlock_file($procmail::procmailrc);
112&redirect("");
113
114