Skip to content

Commit d71df70

Browse files
author
Kristan Kenney
committed
Merge branch 'feature-mail-ssl' into develop
2 parents 2dc7f08 + e6a4687 commit d71df70

File tree

152 files changed

+2036
-548
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

152 files changed

+2036
-548
lines changed

bin/v-add-backup-host

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -169,9 +169,7 @@ fi
169169

170170
# Adding backup host
171171
if [ $type != 'local' ]; then
172-
time_n_date=$(date +'%T %F')
173-
time=$(echo "$time_n_date" |cut -f 1 -d \ )
174-
date=$(echo "$time_n_date" |cut -f 2 -d \ )
172+
new_timestamp
175173
str="HOST='$host'\nUSERNAME='$user'\nPASSWORD='$password'"
176174
str="$str\nBPATH='$path'\nPORT='$port'\nTIME='$time'\nDATE='$date'"
177175
echo -e "$str" > $HESTIA/conf/$type.backup.conf

bin/v-add-cron-hestia-autoupdate

100644100755
File mode changed.

bin/v-add-letsencrypt-domain

Lines changed: 80 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#!/bin/bash
22
# info: check letsencrypt domain
3-
# options: USER DOMAIN [ALIASES]
3+
# options: USER DOMAIN [ALIASES] [MAIL]
44
#
55
# The function check and validates domain with Let's Encrypt
66

@@ -13,6 +13,7 @@
1313
user=$1
1414
domain=$2
1515
aliases=$3
16+
mail=$4
1617

1718
# LE API
1819
LE_API='https://acme-v02.api.letsencrypt.org'
@@ -54,29 +55,41 @@ query_le_v2() {
5455
# Verifications #
5556
#----------------------------------------------------------#
5657

57-
check_args '2' "$#" 'USER DOMAIN [ALIASES]'
58+
check_args '2' "$#" 'USER DOMAIN [ALIASES] [MAIL]'
5859
is_format_valid 'user' 'domain' 'aliases'
59-
is_system_enabled "$WEB_SYSTEM" 'WEB_SYSTEM'
6060
is_object_valid 'user' 'USER' "$user"
6161
is_object_unsuspended 'user' 'USER' "$user"
62-
is_object_valid 'web' 'DOMAIN' "$domain"
63-
is_object_unsuspended 'web' 'DOMAIN' "$domain"
64-
get_domain_values 'web'
65-
# check if alias is the letsencrypt wildcard domain, if not, make the normal checks
66-
if [[ "$aliases" != "*.$domain" ]]; then
62+
if [ -z "$mail" ]; then
63+
is_system_enabled "$WEB_SYSTEM" 'WEB_SYSTEM'
64+
is_object_valid 'web' 'DOMAIN' "$domain"
65+
is_object_unsuspended 'web' 'DOMAIN' "$domain"
66+
get_domain_values 'web'
6767
for alias in $(echo "$aliases" |tr ',' '\n' |sort -u); do
6868
check_alias="$(echo $ALIAS |tr ',' '\n' |grep ^$alias$)"
6969
if [ -z "$check_alias" ]; then
7070
check_result $E_NOTEXIST "domain alias $alias doesn't exist"
7171
fi
7272
done
73-
fi;
73+
else
74+
is_system_enabled "$MAIL_SYSTEM" 'MAIL_SYSTEM'
75+
is_object_valid 'mail' 'DOMAIN' "$domain"
76+
is_object_unsuspended 'mail' 'DOMAIN' "$domain"
77+
is_object_value_empty 'mail' 'DOMAIN' "$domain" '$SSL'
78+
fi
79+
7480

7581

7682
#----------------------------------------------------------#
7783
# Action #
7884
#----------------------------------------------------------#
7985

86+
# Generate correct variables for mail domain SSL certificates
87+
if [ ! -z "$mail" ]; then
88+
root_domain=$domain
89+
domain="mail.$root_domain"
90+
aliases="$WEBMAIL_ALIAS.$root_domain"
91+
fi
92+
8093
# Registering LetsEncrypt user account
8194
$BIN/v-add-letsencrypt-user $user
8295
if [ "$?" -ne 0 ]; then
@@ -152,24 +165,38 @@ for auth in $authz; do
152165
$BIN/v-add-dns-record $user $domain "_acme-challenge" "TXT" $record
153166
check_result $? "DNS _acme-challenge record wasn't created"
154167
else
155-
if [ "$WEB_SYSTEM" = 'nginx' ] || [ ! -z "$PROXY_SYSTEM" ]; then
156-
conf="$HOMEDIR/$user/conf/web/nginx.$domain.conf_letsencrypt"
157-
sconf="$HOMEDIR/$user/conf/web/snginx.$domain.conf_letsencrypt"
158-
if [ ! -e "$conf" ]; then
159-
echo 'location ~ "^/\.well-known/acme-challenge/(.*)$" {' \
160-
> $conf
161-
echo ' default_type text/plain;' >> $conf
162-
echo ' return 200 "$1.'$THUMB'";' >> $conf
163-
echo '}' >> $conf
164-
fi
165-
if [ ! -e "$sconf" ]; then
166-
ln -s "$conf" "$sconf"
168+
if [ -z "$mail" ]; then
169+
if [ "$WEB_SYSTEM" = 'nginx' ] && [ ! -z "$PROXY_SYSTEM" ]; then
170+
if [ ! -z "$mail" ]; then
171+
conf="$HOMEDIR/$user/conf/mail/$root_domain/$PROXY_SYSTEM.conf_letsencrypt"
172+
sconf="$HOMEDIR/$user/conf/mail/$root_domain/$PROXY_SYSTEM.ssl.conf_letsencrypt"
173+
else
174+
conf="$HOMEDIR/$user/conf/web/$domain/$PROXY_SYSTEM.conf_letsencrypt"
175+
sconf="$HOMEDIR/$user/conf/web/$domain/$PROXY_SYSTEM.ssl.conf_letsencrypt"
176+
fi
177+
178+
if [ ! -e "$conf" ]; then
179+
echo 'location ~ "^/\.well-known/acme-challenge/(.*)$" {' \
180+
> $conf
181+
echo ' default_type text/plain;' >> $conf
182+
echo ' return 200 "$1.'$THUMB'";' >> $conf
183+
echo '}' >> $conf
184+
fi
185+
if [ ! -e "$sconf" ]; then
186+
ln -s "$conf" "$sconf"
187+
fi
188+
$BIN/v-restart-proxy
189+
check_result $? "Proxy restart failed" > /dev/null
190+
191+
else
192+
well_known="$HOMEDIR/$user/web/$domain/public_html/.well-known"
193+
acme_challenge="$well_known/acme-challenge"
194+
mkdir -p $acme_challenge
195+
echo "$token.$THUMB" > $acme_challenge/$token
196+
chown -R $user:$user $well_known
167197
fi
168-
$BIN/v-restart-proxy
169-
check_result $? "Proxy restart failed" > /dev/null
170-
171198
else
172-
well_known="$HOMEDIR/$user/web/$rdomain/public_html/.well-known"
199+
well_known="/var/lib/roundcube/.well-known"
173200
acme_challenge="$well_known/acme-challenge"
174201
mkdir -p $acme_challenge
175202
echo "$token.$THUMB" > $acme_challenge/$token
@@ -242,10 +269,25 @@ if [[ $(head -n 1 $ssl_dir/$domain.ca) = "-----END CERTIFICATE-----" ]]; then
242269
sed -i '1,2d' $ssl_dir/$domain.ca
243270
fi
244271

272+
# Rename certs for mail
273+
if [ ! -z "$mail" ]; then
274+
mv $ssl_dir/$domain.ca $ssl_dir/$root_domain.ca
275+
mv $ssl_dir/$domain.crt $ssl_dir/$root_domain.crt
276+
mv $ssl_dir/$domain.csr $ssl_dir/$root_domain.csr
277+
mv $ssl_dir/$domain.key $ssl_dir/$root_domain.key
278+
mv $ssl_dir/$domain.pem $ssl_dir/$root_domain.pem
279+
fi
280+
245281
# Adding SSL
246-
ssl_home=$(search_objects 'web' 'LETSENCRYPT' 'yes' 'SSL_HOME')
247-
$BIN/v-delete-web-domain-ssl $user $domain > /dev/null 2>&1
248-
$BIN/v-add-web-domain-ssl $user $domain $ssl_dir $ssl_home
282+
if [ -z "$mail" ]; then
283+
ssl_home=$(search_objects 'web' 'LETSENCRYPT' 'yes' 'SSL_HOME')
284+
$BIN/v-delete-web-domain-ssl $user $domain > /dev/null 2>&1
285+
$BIN/v-add-web-domain-ssl $user $domain $ssl_dir $ssl_home
286+
else
287+
$BIN/v-delete-mail-domain-ssl $user $root_domain >/dev/null 2>&1
288+
$BIN/v-add-mail-domain-ssl $user $root_domain $ssl_dir
289+
fi
290+
249291
if [ "$?" -ne '0' ]; then
250292
touch $HESTIA/data/queue/letsencrypt.pipe
251293
sed -i "/ $domain /d" $HESTIA/data/queue/letsencrypt.pipe
@@ -262,11 +304,17 @@ if [ -z "$(grep v-update-lets $HESTIA/data/users/admin/cron.conf)" ]; then
262304
fi
263305

264306
# Updating letsencrypt key
265-
if [ -z "$LETSENCRYPT" ]; then
266-
add_object_key "web" 'DOMAIN' "$domain" 'LETSENCRYPT' 'FTP_USER'
307+
if [ -z "$mail" ]; then
308+
if [ -z "$LETSENCRYPT" ]; then
309+
add_object_key "web" 'DOMAIN' "$domain" 'LETSENCRYPT' 'FTP_USER'
310+
fi
311+
update_object_value 'web' 'DOMAIN' "$domain" '$LETSENCRYPT' 'yes'
312+
else
313+
if [ -z "$LETSENCRYPT" ]; then
314+
add_object_key "mail" 'DOMAIN' "$root_domain" 'LETSENCRYPT'
315+
fi
316+
update_object_value 'mail' 'DOMAIN' "$root_domain" '$LETSENCRYPT' 'yes'
267317
fi
268-
update_object_value 'web' 'DOMAIN' "$domain" '$LETSENCRYPT' 'yes'
269-
270318

271319
#----------------------------------------------------------#
272320
# Hestia #

bin/v-add-mail-domain

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ dkim_size=${6-1024}
2121
source $HESTIA/func/main.sh
2222
source $HESTIA/func/domain.sh
2323
source $HESTIA/conf/hestia.conf
24+
source $HESTIA/func/ip.sh
2425

2526
# Define mail user
2627
if [ "$MAIL_SYSTEM" = 'exim4' ]; then
@@ -32,7 +33,7 @@ fi
3233
# Additional argument formatting
3334
format_domain
3435
format_domain_idn
35-
36+
get_user_ip
3637

3738
#----------------------------------------------------------#
3839
# Verifications #
@@ -53,13 +54,11 @@ is_dir_symlink $HOMEDIR/$user/mail
5354
#----------------------------------------------------------#
5455

5556
# Generating timestamp
56-
time_n_date=$(date +'%T %F')
57-
time=$(echo "$time_n_date" |cut -f 1 -d \ )
58-
date=$(echo "$time_n_date" |cut -f 2 -d \ )
57+
new_timestamp
5958

6059
# Adding domain to mail.conf
6160
s="DOMAIN='$domain' ANTIVIRUS='$antivirus' ANTISPAM='$antispam' DKIM='$dkim'"
62-
s="$s CATCHALL='' ACCOUNTS='0' U_DISK='0' SUSPENDED='no' TIME='$time'"
61+
s="$s SSL='no' LETSENCRYPT='no' CATCHALL='' ACCOUNTS='0' WEBMAIL='yes' U_DISK='0' SUSPENDED='no' TIME='$time'"
6362
s="$s DATE='$date'"
6463
echo $s >> $USER_DATA/mail.conf
6564
touch $USER_DATA/mail/$domain.conf
@@ -128,17 +127,33 @@ if [ ! -z "$DNS_SYSTEM" ] && [ "$dkim" = 'yes' ]; then
128127
fi
129128
fi
130129

130+
# Add webmail configuration to mail domain
131+
if [ ! -z "$WEB_SYSTEM" ]; then
132+
add_webmail_config "$WEB_SYSTEM" "default.tpl"
133+
fi
134+
if [ ! -z "$PROXY_SYSTEM" ]; then
135+
add_webmail_config "$PROXY_SYSTEM" "default.tpl"
136+
fi
131137

132138
#----------------------------------------------------------#
133139
# Hestia #
134140
#----------------------------------------------------------#
135141

136142
# Increasing domain value
137143
increase_user_value "$user" '$U_MAIL_DOMAINS'
144+
138145
if [ "$dkim" = 'yes' ]; then
139-
increase_user_value "$user" '$U_MAIL_DKMI'
146+
increase_user_value "$user" '$U_MAIL_DKIM'
140147
fi
141148

149+
# Restarting web server
150+
$BIN/v-restart-web $restart
151+
check_result $? "Web restart failed" >/dev/null
152+
153+
# Restarting proxy server
154+
$BIN/v-restart-proxy $restart
155+
check_result $? "Proxy restart failed" >/dev/null
156+
142157
# Logging
143158
log_history "added mail domain $domain"
144159
log_event "$OK" "$ARGUMENTS"

bin/v-add-mail-domain-ssl

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
#!/bin/bash
2+
# info: add mail SSL for $domain
3+
# options: USER DOMAIN SSL_DIR [RESTART]
4+
#
5+
# The function turns on SSL support for a mail domain. Parameter ssl_dir
6+
# is a path to a directory where 2 or 3 ssl files can be found. Certificate file
7+
# mail.domain.tld.crt and its key mail.domain.tld.key are mandatory. Certificate
8+
# authority mail.domain.tld.ca file is optional.
9+
10+
#----------------------------------------------------------#
11+
# Variable&Function #
12+
#----------------------------------------------------------#
13+
14+
# Argument definition
15+
user=$1
16+
domain=$2
17+
ssl_dir=$3
18+
restart="$3"
19+
20+
# Additional argument formatting
21+
if [[ "$domain" =~ [[:upper:]] ]]; then
22+
domain=$(echo "$domain" |tr '[:upper:]' '[:lower:]')
23+
fi
24+
if [[ "$domain" =~ ^www\..* ]]; then
25+
domain=$(echo "$domain" |sed -e "s/^www.//")
26+
fi
27+
if [[ "$domain" =~ .*\.$ ]]; then
28+
domain=$(echo "$domain" |sed -e "s/\.$//")
29+
fi
30+
31+
domain=$(idn -t --quiet -u "$domain" )
32+
domain_idn=$(idn -t --quiet -a "$domain")
33+
34+
# Includes
35+
source $HESTIA/func/main.sh
36+
source $HESTIA/func/domain.sh
37+
source $HESTIA/func/ip.sh
38+
source $HESTIA/conf/hestia.conf
39+
40+
# Additional argument formatting
41+
format_domain
42+
format_domain_idn
43+
get_user_ip
44+
45+
#----------------------------------------------------------#
46+
# Verifications #
47+
#----------------------------------------------------------#
48+
49+
check_args '3' "$#" 'USER DOMAIN SSL_DIR [RESTART]'
50+
is_format_valid 'user' 'domain' 'ssl_dir'
51+
is_system_enabled "$MAIL_SYSTEM" 'MAIL_SYSTEM'
52+
is_object_valid 'user' 'USER' "$user"
53+
is_object_unsuspended 'user' 'USER' "$user"
54+
is_object_valid 'mail' 'DOMAIN' "$domain"
55+
is_object_unsuspended 'mail' 'DOMAIN' "$domain"
56+
is_object_value_empty 'mail' 'DOMAIN' "$domain" '$SSL'
57+
is_web_domain_cert_valid
58+
59+
#----------------------------------------------------------#
60+
# Action #
61+
#----------------------------------------------------------#
62+
63+
# Call routine to add SSL configuration to mail domain
64+
add_mail_ssl_config
65+
66+
# Add webmail configuration to mail domain
67+
if [ ! -z "$WEB_SYSTEM" ]; then
68+
add_webmail_config "$WEB_SYSTEM" "default.stpl"
69+
fi
70+
if [ ! -z "$PROXY_SYSTEM" ]; then
71+
add_webmail_config "$PROXY_SYSTEM" "default.stpl"
72+
fi
73+
74+
# Increase value for domain
75+
increase_user_value "$user" '$U_MAIL_SSL'
76+
77+
# Set SSL as enabled in configuration
78+
update_object_value 'mail' 'DOMAIN' "$domain" '$SSL' "yes"
79+
80+
#----------------------------------------------------------#
81+
# Hestia #
82+
#----------------------------------------------------------#
83+
84+
# Restarting mail server
85+
$BIN/v-restart-mail $restart
86+
$BIN/v-restart-service $IMAP_SYSTEM $restart
87+
check_result $? "Mail restart failed" >/dev/null
88+
89+
# Restarting web server
90+
$BIN/v-restart-web $restart
91+
check_result $? "Web restart failed" >/dev/null
92+
93+
# Restarting proxy server
94+
$BIN/v-restart-proxy $restart
95+
check_result $? "Proxy restart failed" >/dev/null
96+
97+
# Logging
98+
log_history "enabled mail ssl support for $domain"
99+
log_event "$OK" "$ARGUMENTS"
100+
101+
exit

bin/v-add-user

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ fi
8484

8585
# Set permissions
8686
chmod a+x $HOMEDIR/$user
87-
chattr +i $HOMEDIR/$user/conf
87+
chattr +i $HOMEDIR/$user/conf > /dev/null 2>&1
8888

8989

9090
#----------------------------------------------------------#
@@ -179,6 +179,7 @@ U_DNS_RECORDS='0'
179179
U_MAIL_DOMAINS='0'
180180
U_MAIL_DKIM='0'
181181
U_MAIL_ACCOUNTS='0'
182+
U_MAIL_SSL='0'
182183
U_DATABASES='0'
183184
U_CRON_JOBS='0'
184185
U_BACKUPS='0'

bin/v-add-web-domain

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ date=$(echo "$time_n_date" |cut -f 2 -d \ )
165165

166166
# Adding domain in web.conf
167167
echo "DOMAIN='$domain' IP='$ip' IP6='' ALIAS='$ALIAS' TPL='$WEB_TEMPLATE'\
168-
SSL='no' SSL_HOME='same' LETSENCRYPT='no' FTP_USER='' FTP_MD5=''\
168+
SSL='no' FORCESSL='no' SSL_HOME='same' LETSENCRYPT='no' FTP_USER='' FTP_MD5=''\
169169
BACKEND='$BACKEND_TEMPLATE' PROXY='$PROXY_TEMPLATE' PROXY_EXT='$PROXY_EXT'\
170170
STATS='' STATS_USER='' STATS_CRYPT='' U_DISK='0' U_BANDWIDTH='0'\
171171
SUSPENDED='no' TIME='$time' DATE='$date'" >> $USER_DATA/web.conf

bin/v-add-web-domain-httpauth

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@ source $HESTIA/func/domain.sh
2222
source $HESTIA/conf/hestia.conf
2323

2424
# Defining htpasswd file
25-
htaccess="$HOMEDIR/$user/conf/web/$WEB_SYSTEM.$domain.conf_htaccess"
26-
htpasswd="$HOMEDIR/$user/conf/web/$WEB_SYSTEM.$domain.htpasswd"
27-
shtaccess="$HOMEDIR/$user/conf/web/s$WEB_SYSTEM.$domain.conf_htaccess"
28-
shtpasswd="$HOMEDIR/$user/conf/web/s$WEB_SYSTEM.$domain.htpasswd"
25+
htaccess="$HOMEDIR/$user/conf/web/$domain/htaccess"
26+
htpasswd="$HOMEDIR/$user/conf/web/$domain/htpasswd"
27+
shtaccess="$htaccess"
28+
shtpasswd="$htpasswd"
2929
docroot="$HOMEDIR/$user/web/$domain/public_html"
3030

3131

0 commit comments

Comments
 (0)