Linux mail.vriendennsm.nl 6.1.0-51-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.177-1 (2026-07-16) x86_64
Apache/2.4.68 (Debian)
Server IP : 217.154.75.17 & Your IP : 216.73.217.15
Domains :
Cant Read [ /etc/named.conf ]
User : www-data
Terminal
Auto Root
Create File
Create Folder
Localroot Suggester
Backdoor Destroyer
Readme
/
usr /
share /
webmin /
webmin /
Delete
Unzip
Name
Size
Permission
Date
Action
help
[ DIR ]
drwxr-xr-x
2026-07-25 20:55
images
[ DIR ]
drwxr-xr-x
2026-07-25 20:55
lang
[ DIR ]
drwxr-xr-x
2026-07-25 20:55
subdir
[ DIR ]
drwxr-xr-x
2026-07-25 20:55
CHANGELOG
12.02
KB
-rw-r--r--
2026-07-17 21:17
acme_tiny.py
11.53
KB
-rwxr-xr-x
2026-07-17 21:17
adminupgrade
299
B
-rw-r--r--
2026-07-17 21:17
backup_config.pl
1.97
KB
-rwxr-xr-x
2026-07-17 21:17
bootup.cgi
1.04
KB
-rwxr-xr-x
2026-07-17 21:22
cache.cgi
1.47
KB
-rwxr-xr-x
2026-07-17 21:22
cgi_args.pl
159
B
-rwxr-xr-x
2026-07-17 21:17
change_access.cgi
1.93
KB
-rwxr-xr-x
2026-07-17 21:22
change_advanced.cgi
7.02
KB
-rwxr-xr-x
2026-07-17 21:22
change_anon.cgi
712
B
-rwxr-xr-x
2026-07-17 21:22
change_bind.cgi
5.08
KB
-rwxr-xr-x
2026-07-17 21:22
change_ca.cgi
674
B
-rwxr-xr-x
2026-07-17 21:22
change_debug.cgi
1.38
KB
-rwxr-xr-x
2026-07-17 21:22
change_lang.cgi
558
B
-rwxr-xr-x
2026-07-17 21:22
change_lock.cgi
554
B
-rwxr-xr-x
2026-07-17 21:22
change_log.cgi
2.42
KB
-rwxr-xr-x
2026-07-17 21:22
change_mobile.cgi
940
B
-rwxr-xr-x
2026-07-17 21:22
change_os.cgi
2.21
KB
-rwxr-xr-x
2026-07-17 21:22
change_osdn.cgi
1.54
KB
-rwxr-xr-x
2026-07-17 21:22
change_overlay.cgi
1.17
KB
-rwxr-xr-x
2026-07-17 21:22
change_proxy.cgi
1.09
KB
-rwxr-xr-x
2026-07-17 21:22
change_referers.cgi
633
B
-rwxr-xr-x
2026-07-17 21:22
change_session.cgi
5.88
KB
-rwxr-xr-x
2026-07-17 21:22
change_ssl.cgi
3.08
KB
-rwxr-xr-x
2026-07-17 21:22
change_startpage.cgi
687
B
-rwxr-xr-x
2026-07-17 21:22
change_status.cgi
1.08
KB
-rwxr-xr-x
2026-07-17 21:22
change_theme.cgi
1.17
KB
-rwxr-xr-x
2026-07-17 21:22
change_twofactor.cgi
1.48
KB
-rwxr-xr-x
2026-07-17 21:22
change_ui.cgi
1.61
KB
-rwxr-xr-x
2026-07-17 21:22
change_web.cgi
2.47
KB
-rwxr-xr-x
2026-07-17 21:22
clear_blocked.cgi
230
B
-rwxr-xr-x
2026-07-17 21:22
clear_cache.cgi
205
B
-rwxr-xr-x
2026-07-17 21:22
clone_mod.cgi
2.15
KB
-rwxr-xr-x
2026-07-17 21:22
config
155
B
-rw-r--r--
2026-07-17 21:17
config.info
940
B
-rw-r--r--
2026-07-17 21:17
config.info.ar
406
B
-rw-r--r--
2026-07-17 21:17
config.info.ca
388
B
-rw-r--r--
2026-07-17 21:17
config.info.cs
225
B
-rw-r--r--
2026-07-17 21:17
config.info.de
351
B
-rw-r--r--
2026-07-17 21:17
config.info.es
221
B
-rw-r--r--
2026-07-17 21:17
config.info.fa
293
B
-rw-r--r--
2026-07-17 21:17
config.info.fr
554
B
-rw-r--r--
2026-07-17 21:17
config.info.hr
0
B
-rw-r--r--
2026-07-17 21:17
config.info.hu
0
B
-rw-r--r--
2026-07-17 21:17
config.info.it
237
B
-rw-r--r--
2026-07-17 21:17
config.info.ja
514
B
-rw-r--r--
2026-07-17 21:17
config.info.ko
198
B
-rw-r--r--
2026-07-17 21:17
config.info.ms
278
B
-rw-r--r--
2026-07-17 21:17
config.info.nl
291
B
-rw-r--r--
2026-07-17 21:17
config.info.no
275
B
-rw-r--r--
2026-07-17 21:17
config.info.pl
276
B
-rw-r--r--
2026-07-17 21:17
config.info.pt_BR
291
B
-rw-r--r--
2026-07-17 21:17
config.info.ru
483
B
-rw-r--r--
2026-07-17 21:17
config.info.sk
124
B
-rw-r--r--
2026-07-17 21:17
config.info.sv
194
B
-rw-r--r--
2026-07-17 21:17
config.info.tr
147
B
-rw-r--r--
2026-07-17 21:17
cpan_modules.pl
229
B
-rwxr-xr-x
2026-07-17 21:17
defaultacl
17
B
-rw-r--r--
2026-07-17 21:17
delete_cache.cgi
471
B
-rwxr-xr-x
2026-07-17 21:22
delete_mod.cgi
2.24
KB
-rwxr-xr-x
2026-07-17 21:22
delete_webmincron.cgi
1.51
KB
-rwxr-xr-x
2026-07-17 21:22
developers-key.asc
3.07
KB
-rw-r--r--
2026-07-17 21:17
download_cert.cgi
532
B
-rwxr-xr-x
2026-07-17 21:22
edit_access.cgi
1.88
KB
-rwxr-xr-x
2026-07-17 21:22
edit_advanced.cgi
4.24
KB
-rwxr-xr-x
2026-07-17 21:22
edit_anon.cgi
812
B
-rwxr-xr-x
2026-07-17 21:22
edit_assignment.cgi
1.12
KB
-rwxr-xr-x
2026-07-17 21:22
edit_bind.cgi
3.54
KB
-rwxr-xr-x
2026-07-17 21:22
edit_blocked.cgi
944
B
-rwxr-xr-x
2026-07-17 21:22
edit_ca.cgi
2.82
KB
-rwxr-xr-x
2026-07-17 21:22
edit_categories.cgi
1.69
KB
-rwxr-xr-x
2026-07-17 21:22
edit_debug.cgi
2.05
KB
-rwxr-xr-x
2026-07-17 21:22
edit_descs.cgi
1.49
KB
-rwxr-xr-x
2026-07-17 21:22
edit_ipkey.cgi
1.7
KB
-rwxr-xr-x
2026-07-17 21:22
edit_lang.cgi
1.83
KB
-rwxr-xr-x
2026-07-17 21:22
edit_lock.cgi
2.13
KB
-rwxr-xr-x
2026-07-17 21:22
edit_log.cgi
3.16
KB
-rwxr-xr-x
2026-07-17 21:22
edit_mobile.cgi
1.26
KB
-rwxr-xr-x
2026-07-17 21:22
edit_mods.cgi
4.45
KB
-rwxr-xr-x
2026-07-17 21:22
edit_os.cgi
3.17
KB
-rwxr-xr-x
2026-07-17 21:22
edit_proxy.cgi
3.7
KB
-rwxr-xr-x
2026-07-17 21:22
edit_referers.cgi
899
B
-rwxr-xr-x
2026-07-17 21:22
edit_sendmail.cgi
3.68
KB
-rwxr-xr-x
2026-07-17 21:22
edit_session.cgi
6.23
KB
-rwxr-xr-x
2026-07-17 21:22
edit_ssl.cgi
13.69
KB
-rwxr-xr-x
2026-07-17 21:22
edit_startpage.cgi
1.48
KB
-rwxr-xr-x
2026-07-17 21:22
edit_status.cgi
1.26
KB
-rwxr-xr-x
2026-07-17 21:22
edit_themes.cgi
4.15
KB
-rwxr-xr-x
2026-07-17 21:22
edit_twofactor.cgi
1.5
KB
-rwxr-xr-x
2026-07-17 21:22
edit_ui.cgi
2.51
KB
-rwxr-xr-x
2026-07-17 21:22
edit_upgrade.cgi
4.39
KB
-rwxr-xr-x
2026-07-17 21:22
edit_web.cgi
2.92
KB
-rwxr-xr-x
2026-07-17 21:22
edit_webmincron.cgi
1.35
KB
-rwxr-xr-x
2026-07-17 21:22
export_mod.cgi
1.23
KB
-rwxr-xr-x
2026-07-17 21:22
feedback_files.pl
126
B
-rwxr-xr-x
2026-07-17 21:17
fix_os.cgi
228
B
-rwxr-xr-x
2026-07-17 21:22
fix_repo.cgi
1.87
KB
-rwxr-xr-x
2026-07-17 21:22
gnupg-lib.pl
14.82
KB
-rwxr-xr-x
2026-07-17 21:17
hide.cgi
326
B
-rwxr-xr-x
2026-07-17 21:22
index.cgi
4.41
KB
-rwxr-xr-x
2026-07-17 21:22
install_mod.cgi
3.11
KB
-rwxr-xr-x
2026-07-17 21:22
install_theme.cgi
2.29
KB
-rwxr-xr-x
2026-07-17 21:22
jcameron-key.asc
1.29
KB
-rw-r--r--
2026-07-17 21:17
kill_lock.cgi
1.57
KB
-rwxr-xr-x
2026-07-17 21:22
letsencrypt-cleanup.pl
1.94
KB
-rwxr-xr-x
2026-07-17 21:22
letsencrypt-dns.pl
2.49
KB
-rwxr-xr-x
2026-07-17 21:22
letsencrypt-lib.pl
19.62
KB
-rwxr-xr-x
2026-07-17 21:17
letsencrypt.cgi
8.25
KB
-rwxr-xr-x
2026-07-17 21:22
log_parser.pl
1.23
KB
-rwxr-xr-x
2026-07-17 21:17
module.info
195
B
-rw-r--r--
2026-07-17 21:17
module.info.ar
185
B
-rw-r--r--
2026-07-17 21:17
module.info.ar.auto
22
B
-rw-r--r--
2026-07-17 21:17
module.info.bg
0
B
-rw-r--r--
2026-07-17 21:17
module.info.bg.auto
218
B
-rw-r--r--
2026-07-17 21:17
module.info.ca
134
B
-rw-r--r--
2026-07-17 21:17
module.info.ca.auto
15
B
-rw-r--r--
2026-07-17 21:17
module.info.cs
28
B
-rw-r--r--
2026-07-17 21:17
module.info.cs.auto
128
B
-rw-r--r--
2026-07-17 21:17
module.info.da
0
B
-rw-r--r--
2026-07-17 21:17
module.info.da.auto
142
B
-rw-r--r--
2026-07-17 21:17
module.info.de
126
B
-rw-r--r--
2026-07-17 21:17
module.info.de.auto
15
B
-rw-r--r--
2026-07-17 21:17
module.info.el
0
B
-rw-r--r--
2026-07-17 21:17
module.info.el.auto
262
B
-rw-r--r--
2026-07-17 21:17
module.info.es
33
B
-rw-r--r--
2026-07-17 21:17
module.info.es.auto
109
B
-rw-r--r--
2026-07-17 21:17
module.info.eu
0
B
-rw-r--r--
2026-07-17 21:17
module.info.eu.auto
158
B
-rw-r--r--
2026-07-17 21:17
module.info.fa
0
B
-rw-r--r--
2026-07-17 21:17
module.info.fa.auto
202
B
-rw-r--r--
2026-07-17 21:17
module.info.fi
0
B
-rw-r--r--
2026-07-17 21:17
module.info.fi.auto
141
B
-rw-r--r--
2026-07-17 21:17
module.info.fr
32
B
-rw-r--r--
2026-07-17 21:17
module.info.fr.auto
129
B
-rw-r--r--
2026-07-17 21:17
module.info.hr
0
B
-rw-r--r--
2026-07-17 21:17
module.info.hr.auto
149
B
-rw-r--r--
2026-07-17 21:17
module.info.hu
30
B
-rw-r--r--
2026-07-17 21:17
module.info.hu.auto
148
B
-rw-r--r--
2026-07-17 21:17
module.info.it
33
B
-rw-r--r--
2026-07-17 21:17
module.info.it.auto
107
B
-rw-r--r--
2026-07-17 21:17
module.info.ja
180
B
-rw-r--r--
2026-07-17 21:17
module.info.ko
22
B
-rw-r--r--
2026-07-17 21:17
module.info.ko.auto
129
B
-rw-r--r--
2026-07-17 21:17
module.info.ms
119
B
-rw-r--r--
2026-07-17 21:17
module.info.ms.auto
15
B
-rw-r--r--
2026-07-17 21:17
module.info.nl
28
B
-rw-r--r--
2026-07-17 21:17
module.info.nl.auto
117
B
-rw-r--r--
2026-07-17 21:17
module.info.no
29
B
-rw-r--r--
2026-07-17 21:17
module.info.no.auto
117
B
-rw-r--r--
2026-07-17 21:17
module.info.pl
155
B
-rw-r--r--
2026-07-17 21:17
module.info.pl.auto
15
B
-rw-r--r--
2026-07-17 21:17
module.info.pt
33
B
-rw-r--r--
2026-07-17 21:17
module.info.pt.auto
113
B
-rw-r--r--
2026-07-17 21:17
module.info.pt_BR
36
B
-rw-r--r--
2026-07-17 21:17
module.info.pt_BR.auto
119
B
-rw-r--r--
2026-07-17 21:17
module.info.ru
34
B
-rw-r--r--
2026-07-17 21:17
module.info.ru.auto
172
B
-rw-r--r--
2026-07-17 21:17
module.info.sk
30
B
-rw-r--r--
2026-07-17 21:17
module.info.sk.auto
132
B
-rw-r--r--
2026-07-17 21:17
module.info.sv
30
B
-rw-r--r--
2026-07-17 21:17
module.info.sv.auto
114
B
-rw-r--r--
2026-07-17 21:17
module.info.tr
33
B
-rw-r--r--
2026-07-17 21:17
module.info.tr.auto
128
B
-rw-r--r--
2026-07-17 21:17
module.info.uk
0
B
-rw-r--r--
2026-07-17 21:17
module.info.uk.auto
215
B
-rw-r--r--
2026-07-17 21:17
module.info.zh
22
B
-rw-r--r--
2026-07-17 21:17
module.info.zh_TW
25
B
-rw-r--r--
2026-07-17 21:17
module.info.zh_TW.auto
115
B
-rw-r--r--
2026-07-17 21:17
newcsr.cgi
800
B
-rwxr-xr-x
2026-07-17 21:22
newkey.cgi
879
B
-rwxr-xr-x
2026-07-17 21:22
os-eol-lib.pl
9.55
KB
-rwxr-xr-x
2026-07-17 21:17
postinstall.pl
2.59
KB
-rwxr-xr-x
2026-07-17 21:17
refresh_modules.cgi
661
B
-rwxr-xr-x
2026-07-17 21:22
restart.cgi
87
B
-rwxr-xr-x
2026-07-17 21:22
save_assignment.cgi
485
B
-rwxr-xr-x
2026-07-17 21:22
save_categories.cgi
986
B
-rwxr-xr-x
2026-07-17 21:22
save_descs.cgi
1006
B
-rwxr-xr-x
2026-07-17 21:22
save_ipkey.cgi
1.31
KB
-rwxr-xr-x
2026-07-17 21:22
save_newmod.cgi
278
B
-rwxr-xr-x
2026-07-17 21:22
save_sendmail.cgi
2.32
KB
-rwxr-xr-x
2026-07-17 21:22
save_webmincron.cgi
1016
B
-rwxr-xr-x
2026-07-17 21:22
savekey.cgi
2.8
KB
-rwxr-xr-x
2026-07-17 21:22
setup_ca.cgi
1.52
KB
-rwxr-xr-x
2026-07-17 21:22
standard_chooser.cgi
1.68
KB
-rwxr-xr-x
2026-07-17 21:22
stop_ca.cgi
1.03
KB
-rwxr-xr-x
2026-07-17 21:22
syslog_logs.pl
633
B
-rwxr-xr-x
2026-07-17 21:17
system_info.pl
5.08
KB
-rw-r--r--
2026-07-17 21:17
test_sendmail.cgi
784
B
-rwxr-xr-x
2026-07-17 21:22
third_chooser.cgi
1.55
KB
-rwxr-xr-x
2026-07-17 21:22
twofactor-funcs-lib.pl
11.24
KB
-rw-r--r--
2026-07-17 21:17
uninstall.pl
236
B
-rwxr-xr-x
2026-07-17 21:17
update.cgi
2.89
KB
-rwxr-xr-x
2026-07-17 21:22
upgrade.cgi
16.95
KB
-rwxr-xr-x
2026-07-17 21:22
view_webmincron.cgi
1.66
KB
-rwxr-xr-x
2026-07-17 21:22
webmin-lib.pl
75.99
KB
-rwxr-xr-x
2026-07-17 21:17
Save
Rename
#!/usr/bin/perl # Webserver SSL form use strict; use warnings; no warnings 'redefine'; no warnings 'uninitialized'; require "./webmin-lib.pl"; # Globals our %text; our %miniserv; our %in; our $config_directory; our $module_name; our $strong_ssl_ciphers; our $pfs_ssl_ciphers; our $info; our $root_directory; our %config; our $letsencrypt_cmd; ui_print_header(undef, $text{'ssl_title'}, ""); ReadParse(); get_miniserv_config(\%miniserv); # Check if we even *have* SSL support $@ = undef; eval "use Net::SSLeay"; if ($@) { print text('ssl_essl', "https://webmin.com/ssl.html"),"<p>\n"; if (foreign_available("cpan")) { print text('ssl_cpan', "../cpan/download.cgi?source=3&cpan=Net::SSLeay&mode=2&return=/$module_name/&returndesc=".urlize($text{'index_return'})),"<p>\n"; } my $err = $@; $err =~ s/\s+at.*line\s+\d+[\000-\377]*$//; print text('ssl_emessage', "<tt>$err</tt>"),"<p>\n"; ui_print_footer("", $text{'index_return'}); exit; } # Show tabs my @tabs = map { [ $_, $text{'ssl_tab'.$_}, "edit_ssl.cgi?mode=$_" ] } ( "ssl", "current", "ips", "create", "csr", "upload", "lets" ); print ui_tabs_start(\@tabs, "mode", $in{'mode'} || $tabs[0]->[0], 1); # Basic SSL settings print ui_tabs_start_tab("mode", "ssl"); print $text{'ssl_desc1'},"<p>\n"; print ui_form_start("change_ssl.cgi", "post"); print ui_table_start($text{'ssl_header'}, undef, 2); print ui_table_row($text{'ssl_on'}, ui_yesno_radio("ssl", $miniserv{'ssl'})); print ui_table_row($text{'ssl_enforce'}, ui_radio("ssl_enforce", $miniserv{'ssl_enforce'} // 1, [ [ 2, $text{'ssl_hsts'} ], [ 1, $text{'yes'} ], [ 0, $text{'no'} ] ])); print ui_table_row($text{'ssl_key'}, ui_textbox("key", $miniserv{'keyfile'}, 40)." ". file_chooser_button("key")); print ui_table_row($text{'ssl_cert'}, ui_opt_textbox("cert", $miniserv{'certfile'}, 40, $text{'ssl_cert_def'}."<br>",$text{'ssl_cert_oth'})." ". file_chooser_button("cert")); print ui_table_row($text{'ssl_version'}, ui_opt_textbox("version", $miniserv{'ssl_version'}, 4, $text{'ssl_auto'})); print ui_table_row($text{'ssl_deny'}, ui_checkbox("no_ssl2", 1, "SSLv2", $miniserv{'no_ssl2'})."\n". ui_checkbox("no_ssl3", 1, "SSLv3", $miniserv{'no_ssl3'})."\n". ui_checkbox("no_tls1", 1, "TLSv1.0", $miniserv{'no_tls1'})."\n". ui_checkbox("no_tls1_1", 1, "TLSv1.1", $miniserv{'no_tls1_1'})."\n". ui_checkbox("no_tls1_2", 1, "TLSv1.2", $miniserv{'no_tls1_2'})."\n" ); print ui_table_row($text{'ssl_compression'}, ui_yesno_radio("ssl_compression", !$miniserv{'no_sslcompression'})); print ui_table_row($text{'ssl_honorcipherorder'}, ui_yesno_radio("ssl_honorcipherorder", $miniserv{'ssl_honorcipherorder'})); my $clist = $miniserv{'ssl_cipher_list'}; my $clist_def = $miniserv{'cipher_list_def'}; my $cmode = !$clist ? 1 : ($clist_def && $clist eq $strong_ssl_ciphers) ? 2 : ($clist_def && $clist eq $pfs_ssl_ciphers) ? 3 : 0; print ui_table_row($text{'ssl_cipher_list'}, ui_radio("cipher_list_def", $cmode, [ [ 1, $text{'ssl_auto'}."<br>" ], [ 2, $text{'ssl_strong'}."<br>" ], [ 3, $text{'ssl_pfs'}."<br>" ], [ 0, $text{'ssl_clist'}." ". ui_textbox("cipher_list", $cmode == 0 ? $clist : "", 50) ] ])); my $extracas; if (defined $miniserv{'extracas'}) { $extracas = $miniserv{'extracas'}; } else { $extracas = ""; } print ui_table_row($text{'ssl_extracas'}, ui_textarea("extracas", join("\n",split(/\s+/, $extracas)), 3, 60)." ". "<br>".file_chooser_button("extracas", 0, undef, undef, 1)."<p><br><p>"); print ui_table_end(); print ui_form_end([ [ "", $text{'save'} ] ]); print ui_tabs_end_tab(); # Page showing current cert print ui_tabs_start_tab("mode", "current"); print "$text{'ssl_current'}<p>\n"; print ui_table_start($text{'ssl_cheader'}, undef, 4); $info = &cert_info($miniserv{'certfile'} || $miniserv{'keyfile'}); foreach my $i ('cn', 'alt', 'o', 'email', 'issuer_cn', 'issuer_o', 'issuer_email', 'notafter', 'type') { if ($info->{$i}) { print ui_table_row($text{'ca_'.$i}, ref($info->{$i}) ? join(", ", @{$info->{$i}}) : $info->{$i}); } } my @clinks = ( ui_link("download_cert.cgi/cert.pem", $text{'ssl_pem'}), ui_link("download_cert.cgi/cert.p12", $text{'ssl_pkcs12'}) ); print ui_table_row($text{'ssl_download'}, &ui_links_row(\@clinks)); print ui_table_end(); print ui_tabs_end_tab(); # Table listing per-IP / domain SSL certs print ui_tabs_start_tab("mode", "ips"); print "$text{'ssl_ipkeys'}<p>\n"; my @ipkeys = get_ipkeys(\%miniserv); if (@ipkeys) { print ui_columns_start([ $text{'ssl_ips'}, $text{'ssl_key'}, $text{'ssl_cert'} ]); foreach my $k (@ipkeys) { print ui_columns_row([ ui_link("edit_ipkey.cgi?idx=".$k->{'index'}, join(", ", @{$k->{'ips'}}) ), "<tt>$k->{'key'}</tt>", $k->{'cert'} ? "<tt>$k->{'cert'}</tt>" : $text{'ssl_cert_def'}, ]); } print ui_columns_end(); } else { print "<b>$text{'ssl_ipkeynone'}</b><p>\n"; } print ui_link("edit_ipkey.cgi?new=1", $text{'ssl_addipkey'}); print "<p>\n"; print ui_tabs_end_tab(); # SSL key generation form print ui_tabs_start_tab("mode", "create"); print "$text{'ssl_newkey'}<p>\n"; my $curkey = read_file_contents($miniserv{'keyfile'}); my $origkey = read_file_contents("$root_directory/miniserv.pem"); if ($curkey eq $origkey) { # System is using the original (insecure) Webmin key! print "<b>$text{'ssl_hole'}</b><p>\n"; } print ui_form_start("newkey.cgi"); print ui_table_start($text{'ssl_header1'}, undef, 2); my $host = $ENV{'HTTP_HOST'}; $host =~ s/:.*//; print show_ssl_key_form($host, undef, "Webmin Webserver on ".get_system_hostname()); print ui_table_row($text{'ssl_newfile'}, ui_textbox("newfile", "$config_directory/miniserv.pem", 40)); print ui_table_row($text{'ssl_usenew'}, ui_yesno_radio("usenew", 1)); print ui_table_end(); print ui_form_end([ [ "", $text{'ssl_create'} ] ]); print ui_tabs_end_tab(); # SSL CSR generation form my $keydata = read_file_contents("$config_directory/miniserv.newkey"); my $csrdata = read_file_contents("$config_directory/miniserv.csr"); print ui_tabs_start_tab("mode", "csr"); print "$text{'ssl_newcsr'}<p>\n"; print ui_form_start("newcsr.cgi"); print ui_table_start($text{'ssl_header2'}, undef, 2); print show_ssl_key_form($host, undef, "Webmin Webserver on ".get_system_hostname()); print ui_table_row($text{'ssl_newfile'}, ui_textbox("newfile", "$config_directory/miniserv.newkey", 40)); print ui_table_row($text{'ssl_csrfile'}, ui_textbox("csrfile", "$config_directory/miniserv.csr", 40)); print ui_table_end(); print ui_form_end([ [ "", $text{'ssl_create'} ] ]); if ($keydata) { # Show most recent CSR and key print "<p>\n"; print ui_hidden_start($text{'ssl_csralready'}, "already", 0); print $text{'ssl_already1'},"<p>\n"; print "<pre>".html_escape($keydata)."</pre>\n"; print $text{'ssl_already2'},"<p>\n"; print "<pre>".html_escape($csrdata)."</pre>\n"; print ui_hidden_end("already"); } print ui_tabs_end_tab(); # SSL key upload form print ui_tabs_start_tab("mode", "upload"); print "$text{'ssl_savekey'}<p>\n"; print ui_form_start("savekey.cgi", "form-data"); print ui_table_start($text{'ssl_saveheader'}, undef, 2); print ui_table_row($text{'ssl_privkey'}, ui_textarea("key", $keydata, 7, 70)."<br>\n". "<b>$text{'ssl_upload'}</b>\n". ui_upload("keyfile"). ($keydata ? "<br>".$text{'ssl_fromcsr'} : "")); print ui_table_row($text{'ssl_privcert'}, ui_radio("cert_def", 1, [ [ 1, $text{'ssl_same'} ], [ 0, $text{'ssl_below'} ] ])."<br>\n". ui_textarea("cert", undef, 7, 70)."<br>\n". "<b>$text{'ssl_upload'}</b>\n". ui_upload("certfile", undef, undef, "onChange='form.cert_def.value = 0'")); print ui_table_row($text{'ssl_privchain'}, ui_radio("chain_def", 1, [ [ 1, $miniserv{'extracas'} ? $text{'ssl_leavechain'} : $text{'ssl_nochain'} ], [ 0, $text{'ssl_below'} ] ])."<br>\n". ui_textarea("chain", undef, 7, 70)."<br>\n". "<b>$text{'ssl_upload'}</b>\n". ui_upload("chainfile", undef, undef, "onChange='form.chain_def.value = 0'")); print ui_table_end(); print ui_form_end([ [ "save", $text{'save'} ] ]); print ui_tabs_end_tab(); # Let's Encrypt form print ui_tabs_start_tab("mode", "lets"); my $err = &check_letsencrypt(); print $text{'ssl_letsdesc'}; if (!$err) { print &ui_tag('span', &ui_details({ 'class' => 'inline inlined', 'title' => '', 'content' => $text{'ssl_letsdesc2'}, }))."\n". &ui_tag('style', ".ui--span>details.inline>summary+span {\n". "margin-top: 0;\n". "}\n"); } print "<p>\n"; if ($err) { print "<b>",&text('ssl_letserr', $err),"</b><p>\n"; print &get_letsencrypt_install_message( "/$module_name/edit_ssl.cgi?mode=lets", $text{'ssl_title'}); print "<p>\n"; print &text('ssl_letserr2', "../config.cgi?$module_name"),"<p>\n"; } else { # Show form to create a cert print &ui_form_start("letsencrypt.cgi"); print &ui_table_start($text{'ssl_letsheader'}, undef, 2); # For domain names my @doms = $config{'letsencrypt_doms'} ? split(/\s+/, $config{'letsencrypt_doms'}) : ( $host ); print &ui_table_row($text{'ssl_letsdoms'}, &ui_textarea("dom", join("\n", @doms), 5, 40)."<br>\n". &ui_checkbox("subset", 1, $text{'ssl_subset'}, $config{'letsencrypt_subset'})); # Apache vhost or other path my @opts; my $certbot_by_webmin = $letsencrypt_cmd ? &is_webmin_listening_on_port(80) : 0; my $certbot_warning = $letsencrypt_cmd ? &get_letsencrypt_certbot_port_error() : undef; my $webroot = $config{'letsencrypt_webroot'}; my $hasapache = &foreign_installed("apache"); my $saved_mode = $config{'letsencrypt_mode'} || "web"; my $mode = $saved_mode eq 'dns' ? 3 : $saved_mode eq 'certbot' ? 4 : $webroot ? 2 : $hasapache ? 0 : $letsencrypt_cmd ? 4 : 2; if ($hasapache) { &foreign_require("apache"); my $conf = &apache::get_config(); my @snames; foreach my $virt (&apache::find_directive_struct( "VirtualHost", $conf)) { my $sn = &apache::find_directive( "ServerName", $virt->{'members'}); push(@snames, [ $sn, $sn || "<".$text{'default'}.">" ]); } my %done; @snames = grep { !$done{$_->[0]}++ } @snames; if (@snames) { @snames = sort { $a->[0] cmp $b->[0] } @snames; push(@opts, [ 0, $text{'ssl_letsmode0'} ]); push(@opts, [ 1, $text{'ssl_letsmode1'}, &ui_select("vhost", undef, \@snames) ]); } else { $webroot ||= &apache::find_directive("DocumentRoot", $conf); } } push(@opts, [ 2, $text{'ssl_letsmode2'}, &ui_textbox("webroot", $webroot, 40) ]); if ($letsencrypt_cmd && &foreign_installed("bind8")) { push(@opts, [ 3, $text{'ssl_letsmode3'} ]); } if ($letsencrypt_cmd) { push(@opts, [ 4, $text{'ssl_letsmode4'} ]); } my $mode_html = &ui_radio_table("webroot_mode", $mode, \@opts); if ($certbot_warning) { # Keep the warning aligned with the validation options (hacky as # we have no API for this yet) $certbot_warning .= " ".$text{'ssl_certbotprehook'} if (!$certbot_by_webmin && $config{'letsencrypt_before'}); my $warning_note = &ui_note($certbot_warning, 0); my $warning_html = "<tr><td colspan='2'>". &ui_tag('div', $warning_note, { 'style' => 'padding-left: 19px; '. 'margin-top: -8px !important' }). "</td></tr>\n"; $mode_html =~ s#</table>\s*$#$warning_html</table>#; } print &ui_table_row($text{'ssl_letsmode'}, $mode_html); # Install in Webmin now? print &ui_table_row($text{'ssl_usewebmin'}, &ui_yesno_radio("use", !$config{'letsencrypt_nouse'})); # SSL key size print &ui_table_row($text{'ssl_size'}, &ui_opt_textbox("size", undef, 6, $text{'default'}). " ".$text{'ssl_bits'}); # Staging mode print &ui_table_row($text{'ssl_staging'}, &ui_radio("staging", 0, [ [ 0, $text{'ssl_staging0'} ], [ 1, $text{'ssl_staging1'} ] ])); my $acme_extra = &ui_table_start(undef, undef, 2); $acme_extra .= &ui_table_row($text{'ssl_acmedir'}, &ui_textbox("directory_url", $config{'letsencrypt_directory_url'}, 60)."<br>\n". &ui_note($text{'ssl_acmedirdesc'}, 0)); $acme_extra .= &ui_table_row($text{'ssl_acmekid'}, &ui_textbox("eab_kid", $config{'letsencrypt_eab_kid'}, 40)."<br>\n". &ui_note($text{'ssl_acmekiddesc'}, 0)); $acme_extra .= &ui_table_row($text{'ssl_acmehmac'}, &ui_password("eab_hmac", $config{'letsencrypt_eab_hmac'}, 50)."<br>\n". &ui_note($text{'ssl_acmehmacdesc'}, 0)); $acme_extra .= &ui_table_end(); print &ui_table_row($text{'ssl_acmeopts'}, &ui_details({ 'class' => 'inline inlined', 'html' => 1, 'title' => $text{'ssl_acmeextra'}, 'content' => $acme_extra, })."\n". &ui_tag('style', "tr>td>details.inline>summary+span {\n". "margin-left: 0;\n". "}\n")); # Renewal option my $job = &find_letsencrypt_cron_job(); my $has_ip_doms = &letsencrypt_doms_have_ips(\@doms); my $renew_unit = $has_ip_doms ? "days" : ($config{'letsencrypt_renew_unit'} || "months"); my $renew; if ($job && $renew_unit eq "days" && $job->{'interval'}) { $renew = int($job->{'interval'} / (24*60*60)); } elsif ($job && $job->{'months'} =~ /^\*\/(\d+)$/) { $renew_unit = "months"; $renew = $1; } elsif ($job && $job->{'interval'}) { $renew_unit = "months"; $renew = int($job->{'interval'} / (30*24*60*60)); } my @renew_units = ( [ "months", $text{'ssl_letsrenew_months'} ], [ "days", $text{'ssl_letsrenew_days'} ] ); my $renew_disabled = $renew eq ''; print &ui_table_row(&hlink($text{'ssl_letsrenew'}, "letsrenew"), &ui_opt_textbox("renew", $renew, 4, $text{'ssl_letsnotrenew'}, undef, undef, [ "renew_unit" ])." ". &ui_select("renew_unit", $renew_unit, \@renew_units, undef, undef, undef, $renew_disabled)); print &ui_table_end(); print &ui_form_end([ [ undef, $text{'ssl_letsok'} ], [ 'save', $text{'ssl_letsonly'} ] ]); } print ui_tabs_end_tab(); print ui_tabs_end(1); ui_print_footer("", $text{'index_return'});