# Functions for cert creation with Let's Encrypt if ($config{'letsencrypt_cmd'}) { $letsencrypt_cmd = &has_command($config{'letsencrypt_cmd'}); } else { $letsencrypt_cmd = &has_command("letsencrypt-auto") || &has_command("letsencrypt") || &has_command("certbot-auto") || &has_command("certbot"); } $account_key = "$module_config_directory/letsencrypt.pem"; $letsencrypt_chain_urls = [ "https://letsencrypt.org/certs/lets-encrypt-r3-cross-signed.pem", "https://letsencrypt.org/certs/lets-encrypt-r3.pem", "https://letsencrypt.org/certs/lets-encrypt-e1.pem", ]; # check_letsencrypt() # Returns undef if all dependencies are installed, or an error message sub check_letsencrypt { if (&has_command($letsencrypt_cmd)) { # Use official client return undef; } my $python = &get_python_cmd(); if (!$python || !&has_command("openssl")) { return $text{'letsencrypt_ecmds'}; } my $out = &backquote_command("$python -c 'import argparse' 2>&1"); if ($?) { return &text('letsencrypt_epythonmod', '<tt>argparse</tt>'); } my $ver = &backquote_command("$python --version 2>&1"); if ($ver !~ /Python\s+([0-9\.]+)/) { return &text('letsencrypt_epythonver', "<tt>".&html_escape($out)."</tt>"); } $ver = $1; if ($ver < 2.5) { return &text('letsencrypt_epythonver2', '2.5', $ver); } return undef; } # get_letsencrypt_install_message(return-link, return-title) # Returns a link or form to install Let's Encrypt sub get_letsencrypt_install_message { my ($rlink, $rmsg) = @_; &foreign_require("software"); return &software::missing_install_link( "certbot", $text{'letsencrypt_certbot'}, $rlink, $rmsg); } # request_letsencrypt_cert(domain|&domains, webroot, [email], [keysize], # [request-mode], [use-staging], [account-email]) # Attempt to request a cert using a generated key with the Let's Encrypt client # command, and write it to the given path. Returns a status flag, and either # an error message or the paths to cert, key and chain files. sub request_letsencrypt_cert { my ($dom, $webroot, $email, $size, $mode, $staging, $account_email, $key_type) = @_; my @doms = ref($dom) ? @$dom : ($dom); $email ||= "root\@$doms[0]"; $mode ||= "web"; @doms = &unique(@doms); my ($challenge, $wellknown, $challenge_new, $wellknown_new, $wildcard); # Wildcard mode? foreach my $d (@doms) { if ($d =~ /^\*/) { $wildcard = $d; } } if ($mode eq "web") { # Create a challenges directory under the web root if ($wildcard) { return (0, "Wildcard hostname $wildcard can only be ". "validated in DNS mode"); } $wellknown = "$webroot/.well-known"; $challenge = "$wellknown/acme-challenge"; $wellknown_new = !-d $wellknown ? $wellknown : undef; $challenge_new = !-d $challenge ? $challenge : undef; my @st = stat($webroot); my $user = getpwuid($st[4]); if (!-d $challenge) { my $cmd = "mkdir -p -m 755 ".quotemeta($challenge). " && chmod 755 ".quotemeta($wellknown); if ($user && $user ne "root") { $cmd = &command_as_user($user, 0, $cmd); } my $out = &backquote_logged("$cmd 2>&1"); if ($?) { return (0, "mkdir failed : $out"); } } # Create a .htaccess file to ensure the directory is accessible if (&foreign_installed("apache")) { &foreign_require("apache"); my $htaccess = "$challenge/.htaccess"; if (!-r $htaccess && $apache::httpd_modules{'core'} >= 2.2) { &open_tempfile(HT, ">$htaccess"); &print_tempfile(HT, "AuthType None\n"); &print_tempfile(HT, "Require all granted\n"); &print_tempfile(HT, "Satisfy any\n"); &close_tempfile(HT); &set_ownership_permissions( $user, undef, 0755, $htaccess); } } } elsif ($mode eq "dns") { # Make sure all the DNS zones exist if ($wildcard && !$letsencrypt_cmd) { return (0, "Wildcard hostname $wildcard can only be ". "validated when the certbot Let's Encrypt client ". "is installed"); } &foreign_require("bind8"); foreach my $d (@doms) { my $z = &get_bind_zone_for_domain($d); my $d = &get_virtualmin_for_domain($d); $z || $d || return (0, "Neither DNS zone $d or any of its ". "sub-domains exist on this system"); } } else { return (0, "Unknown mode $mode"); } # Create DNS hook wrapper scripts my $dns_hook = "$module_config_directory/letsencrypt-dns.pl"; my $cleanup_hook = "$module_config_directory/letsencrypt-cleanup.pl"; if ($mode eq "dns") { &foreign_require("cron"); &cron::create_wrapper($dns_hook, $module_name, "letsencrypt-dns.pl"); &cron::create_wrapper($cleanup_hook, $module_name, "letsencrypt-cleanup.pl"); } # Run the before command if ($config{'letsencrypt_before'}) { my $out = &backquote_logged("$config{'letsencrypt_before'} 2>&1 </dev/null"); if ($?) { return (0, "Pre-request command failed : $out"); } } my @rv; if ($letsencrypt_cmd) { # Call the native Let's Encrypt client my $temp = &transname(); &open_tempfile(TEMP, ">$temp"); &print_tempfile(TEMP, "email = $email\n"); &print_tempfile(TEMP, "text = True\n"); &close_tempfile(TEMP); my $dir = $letsencrypt_cmd; my $cmd_ver = &get_certbot_major_version($letsencrypt_cmd); my $old_flags; my $new_flags; $key_type ||= $config{'letsencrypt_algo'} || 'rsa'; if (&compare_version_numbers($cmd_ver, 1.11) < 0) { $old_flags = " --manual-public-ip-logging-ok"; } if (&compare_version_numbers($cmd_ver, 2.0) >= 0) { $new_flags = " --key-type ".quotemeta($key_type); } $dir =~ s/\/[^\/]+$//; $size ||= 2048; my $out; if ($mode eq "web") { # Webserver based validation &clean_environment(); $out = &backquote_command( "cd $dir && (echo A | $letsencrypt_cmd certonly". " -a webroot ". join("", map { " -d ".quotemeta($_) } @doms). " --webroot-path ".quotemeta($webroot). " --duplicate". " --force-renewal". "$old_flags". " --non-interactive". " --agree-tos". " --config ".quotemeta($temp)."". "$new_flags". " --rsa-key-size ".quotemeta($size). " --cert-name ".quotemeta($doms[0]). ($staging ? " --test-cert" : ""). " 2>&1)"); &reset_environment(); } elsif ($mode eq "dns") { # DNS based validation, via hook script &clean_environment(); $out = &backquote_command( "cd $dir && (echo A | $letsencrypt_cmd certonly". " --manual". join("", map { " -d ".quotemeta($_) } @doms). " --preferred-challenges=dns". " --manual-auth-hook $dns_hook". " --manual-cleanup-hook $cleanup_hook". " --duplicate". " --force-renewal". "$old_flags". " --non-interactive". " --agree-tos". " --config ".quotemeta($temp)."". "$new_flags". " --rsa-key-size $size". " --cert-name ".quotemeta($doms[0]). ($staging ? " --test-cert" : ""). " 2>&1)"); &reset_environment(); } else { @rv = (0, "Bad mode $mode"); goto FAILED; } if ($?) { @rv = (0, "<pre>".&html_escape($out || "No output from $letsencrypt_cmd")."</pre>"); goto FAILED; } my ($full, $cert, $key, $chain); if ($out =~ /((?:\/usr\/local)?\/etc\/letsencrypt\/(?:live|archive)\/[a-zA-Z0-9\.\_\-\/\r\n\* ]*\.pem)/) { # Output contained the full path $full = $1; $full =~ s/\s//g; } else { # Try searching common paths my @fulls = (glob("/etc/letsencrypt/live/$doms[0]-*/cert.pem"), glob("/usr/local/etc/letsencrypt/live/$doms[0]-*/cert.pem")); if (@fulls) { my %stats = map { $_, [ stat($_) ] } @fulls; @fulls = sort { $stats{$a}->[9] <=> $stats{$b}->[9] } @fulls; $full = pop(@fulls); } else { @rv = (0, "Output did not contain a PEM path!"); goto FAILED; } } if (!-r $full || !-s $full) { @rv = (0, &text('letsencrypt_efull', $full)); goto FAILED; } $full =~ s/\/[^\/]+$//; $cert = $full."/cert.pem"; if (!-r $cert || !-s $cert) { @rv = (0, &text('letsencrypt_ecert', $cert)); goto FAILED; } $key = $full."/privkey.pem"; if (!-r $key || !-s $key) { @rv = (0, &text('letsencrypt_ekey', $key)); goto FAILED; } $chain = $full."/chain.pem"; $chain = undef if (!-r $chain); &set_ownership_permissions(undef, undef, 0600, $cert); &set_ownership_permissions(undef, undef, 0600, $key); &set_ownership_permissions(undef, undef, 0600, $chain); if ($account_email) { # Attempt to update the contact email on file with let's encrypt &system_logged( "$letsencrypt_cmd register --update-registration". " --email ".quotemeta($account_email). " >/dev/null 2>&1 </dev/null"); } @rv = (1, $cert, $key, $chain); } elsif ($mode eq "dns") { # Python client doesn't support DNS @rv = (0, $text{'letsencrypt_eacmedns'}); } else { # Fall back to local Python client $size ||= 4096; # Generate the account key if missing if (!-r $account_key) { my $out = &backquote_logged( "openssl genrsa 4096 2>&1 >$account_key"); if ($?) { @rv = (0, &text('letsencrypt_eaccountkey', &html_escape($out))); goto FAILED; } } # Generate a key for the domain my $key = &transname(); my $out = &backquote_logged("openssl genrsa $size 2>&1 >".quotemeta($key).""); if ($?) { @rv = (0, &text('letsencrypt_ekeygen', &html_escape($out))); goto FAILED; } # Generate a CSR my $csr = &transname(); my ($ok, $csr) = &generate_ssl_csr($key, undef, undef, undef, undef, undef, \@doms, undef); if (!$ok) { @rv = &text('letsencrypt_ecsr', $csr); goto FAILED; } ©_source_dest($csr, "/tmp/lets.csr", 1); # Find a reasonable python version my $python = &get_python_cmd(); # Request the cert and key my $cert = &transname(); &clean_environment(); my $out = &backquote_logged( "$python $module_root_directory/acme_tiny.py ". "--account-key ".quotemeta($account_key)." ". "--csr ".quotemeta($csr)." ". ($mode eq "web" ? "--acme-dir ".quotemeta($challenge)." " : "--dns-hook $dns_hook ". "--cleanup-hook $cleanup_hook "). ($staging ? "--ca https://acme-staging-v02.api.letsencrypt.org " : "--disable-check "). "--quiet ". "2>&1 >".quotemeta($cert)); &reset_environment(); if ($?) { my @lines = split(/\r?\n/, $out); my $trace; for(my $i=1; $i<@lines; $i++) { if ($lines[$i] =~ /^Traceback\s+/) { $trace = $i; last; } } if ($trace) { @lines = @lines[0 .. $trace-1]; $out = join("\n", @lines); } @rv = (0, &text('letsencrypt_etiny', "<pre>".&html_escape($out))."</pre>"); goto FAILED; } if (!-r $cert || !-s $cert) { @rv = (0, &text('letsencrypt_ecert', $cert)); goto FAILED; } # Check if the returned cert contains a CA cert as well my $chain = &transname(); my @certs = &cert_file_split($cert); if (@certs > 1) { # Yes .. keep the first as the cert, and use the others as # the chain my $orig = shift(@certs); my $fh = "CHAIN"; &open_tempfile($fh, ">$chain"); foreach my $c (@certs) { &print_tempfile($fh, $c); } &close_tempfile($fh); my $fh2 = "CERT"; &open_tempfile($fh2, ">$cert"); &print_tempfile($fh2, $orig); &close_tempfile($fh2); } else { # Download the fixed list chained cert files foreach my $url (@$letsencrypt_chain_urls) { my $cout; my ($host, $port, $page, $ssl) = &parse_http_url($url); my $err; &http_download($host, $port, $page, \$cout, \$err, undef, $ssl); if ($err) { @rv = (0, &text('letsencrypt_echain', $err)); goto FAILED; } if ($cout !~ /\S/ && !-r $chain) { @rv = (0, &text('letsencrypt_echain2', $url)); goto FAILED; } my $fh = "CHAIN"; &open_tempfile($fh, ">>$chain"); &print_tempfile($fh, $cout); &close_tempfile($fh); } } # Copy the per-domain files my $certfinal = "$module_config_directory/$doms[0].cert"; my $keyfinal = "$module_config_directory/$doms[0].key"; my $chainfinal = "$module_config_directory/$doms[0].ca"; ©_source_dest($cert, $certfinal, 1); ©_source_dest($key, $keyfinal, 1); ©_source_dest($chain, $chainfinal, 1); &set_ownership_permissions(undef, undef, 0600, $certfinal); &set_ownership_permissions(undef, undef, 0600, $keyfinal); &set_ownership_permissions(undef, undef, 0600, $chainfinal); &unlink_file($cert); &unlink_file($key); &unlink_file($chain); @rv = (1, $certfinal, $keyfinal, $chainfinal); } # Run the after command FAILED: if ($wellknown_new) { &cleanup_wellknown($wellknown_new, $challenge_new); } if ($config{'letsencrypt_after'}) { &backquote_logged("$config{'letsencrypt_after'} 2>&1 </dev/null"); } return @rv; } # cleanup_wellknown(wellknown, challenge) # Delete directories that were created as part of this process sub cleanup_wellknown { my ($wellknown_new, $challenge_new) = @_; &unlink_file($challenge_new) if ($challenge_new); &unlink_file($wellknown_new) if ($wellknown_new); } # get_bind_zone_for_domain(domain) # Given a hostname like www.foo.com, return the local BIND zone that contains # it like foo.com sub get_bind_zone_for_domain { my ($d) = @_; &foreign_require("bind8"); my $bd = $d; while ($bd =~ /\./) { my $z = &bind8::get_zone_name($bd, "any"); if ($z && $z->{'file'} && $z->{'type'} eq 'master') { return ($z, $bd); } $bd =~ s/^[^\.]+\.//; } return ( ); } # get_virtualmin_for_domain(domain-name) # If Virtualmin is installed, return the domain object that contains the given DNS domain sub get_virtualmin_for_domain { my ($bd) = @_; return undef if (!&foreign_check("virtual-server")); &foreign_require("virtual-server"); while ($bd =~ /\./) { my $d = &virtual_server::get_domain_by("dom", $bd); if ($d && $d->{'dns'}) { return $d; } $bd =~ s/^[^\.]+\.//; } return undef; } # get_certbot_major_version(cmd) # Returns Let's Encrypt client major version, such as 1.11 or 0.40 sub get_certbot_major_version { my ($cmd) = @_; my $out = &backquote_command("$cmd --version 2>&1"); if ($out && $out =~ /\s*(\d+\.\d+)\s*/) { return $1; } return undef; } # cleanup_letsencrypt_files(domain) # Delete all temporary files under /etc/letsencrypt for a domain name sub cleanup_letsencrypt_files { my ($dname) = @_; foreach my $base ("/etc/letsencrypt", "/usr/local/etc/letsencrypt") { next if (!-d $base); foreach my $f ("$base/live/$dname", glob("$base/live/$dname-[0-9][0-9][0-9][0-9]"), "$base/archive/$dname", glob("$base/archive/$dname-[0-9][0-9][0-9][0-9]"), "$base/renewal/$dname.conf", glob("$base/renewal/$dname-[0-9][0-9][0-9][0-9].conf")) { &unlink_file($f) if (-e $f); } } } 1;
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
help | Folder | 0755 |
|
|
images | Folder | 0755 |
|
|
lang | Folder | 0755 |
|
|
subdir | Folder | 0755 |
|
|
CHANGELOG | File | 12.02 KB | 0644 |
|
acme_tiny.py | File | 11.24 KB | 0755 |
|
adminupgrade | File | 299 B | 0644 |
|
backup_config.pl | File | 1.97 KB | 0755 |
|
bootup.cgi | File | 1.04 KB | 0755 |
|
cache.cgi | File | 1.47 KB | 0755 |
|
cgi_args.pl | File | 159 B | 0755 |
|
change_access.cgi | File | 1.34 KB | 0755 |
|
change_advanced.cgi | File | 3 KB | 0755 |
|
change_anon.cgi | File | 712 B | 0755 |
|
change_bind.cgi | File | 4.8 KB | 0755 |
|
change_ca.cgi | File | 674 B | 0755 |
|
change_debug.cgi | File | 1.38 KB | 0755 |
|
change_lang.cgi | File | 558 B | 0755 |
|
change_lock.cgi | File | 554 B | 0755 |
|
change_log.cgi | File | 2.38 KB | 0755 |
|
change_mobile.cgi | File | 940 B | 0755 |
|
change_os.cgi | File | 1.85 KB | 0755 |
|
change_osdn.cgi | File | 1.54 KB | 0755 |
|
change_overlay.cgi | File | 1.16 KB | 0755 |
|
change_proxy.cgi | File | 1.09 KB | 0755 |
|
change_referers.cgi | File | 633 B | 0755 |
|
change_session.cgi | File | 4.77 KB | 0755 |
|
change_ssl.cgi | File | 3.03 KB | 0755 |
|
change_startpage.cgi | File | 773 B | 0755 |
|
change_status.cgi | File | 1.02 KB | 0755 |
|
change_theme.cgi | File | 1.16 KB | 0755 |
|
change_twofactor.cgi | File | 1.43 KB | 0755 |
|
change_ui.cgi | File | 1.61 KB | 0755 |
|
change_web.cgi | File | 2.47 KB | 0755 |
|
clear_blocked.cgi | File | 154 B | 0755 |
|
clear_cache.cgi | File | 205 B | 0755 |
|
clone_mod.cgi | File | 2.06 KB | 0755 |
|
config | File | 114 B | 0644 |
|
config.info | File | 696 B | 0644 |
|
config.info.ar | File | 414 B | 0644 |
|
config.info.ca | File | 408 B | 0644 |
|
config.info.cs | File | 233 B | 0644 |
|
config.info.de | File | 368 B | 0644 |
|
config.info.es | File | 229 B | 0644 |
|
config.info.fa | File | 301 B | 0644 |
|
config.info.fr | File | 577 B | 0644 |
|
config.info.hr | File | 0 B | 0644 |
|
config.info.hu | File | 0 B | 0644 |
|
config.info.it | File | 245 B | 0644 |
|
config.info.ja | File | 531 B | 0644 |
|
config.info.ko | File | 206 B | 0644 |
|
config.info.ms | File | 286 B | 0644 |
|
config.info.nl | File | 299 B | 0644 |
|
config.info.no | File | 283 B | 0644 |
|
config.info.pl | File | 284 B | 0644 |
|
config.info.pt_BR | File | 299 B | 0644 |
|
config.info.ru | File | 491 B | 0644 |
|
config.info.sk | File | 132 B | 0644 |
|
config.info.sv | File | 202 B | 0644 |
|
config.info.tr | File | 155 B | 0644 |
|
cpan_modules.pl | File | 229 B | 0755 |
|
defaultacl | File | 17 B | 0644 |
|
delete_cache.cgi | File | 471 B | 0755 |
|
delete_mod.cgi | File | 2.24 KB | 0755 |
|
delete_webmincron.cgi | File | 1.51 KB | 0755 |
|
download_cert.cgi | File | 532 B | 0755 |
|
edit_access.cgi | File | 1.38 KB | 0755 |
|
edit_advanced.cgi | File | 3.87 KB | 0755 |
|
edit_anon.cgi | File | 812 B | 0755 |
|
edit_assignment.cgi | File | 1.12 KB | 0755 |
|
edit_bind.cgi | File | 2.95 KB | 0755 |
|
edit_blocked.cgi | File | 944 B | 0755 |
|
edit_ca.cgi | File | 2.82 KB | 0755 |
|
edit_categories.cgi | File | 1.69 KB | 0755 |
|
edit_debug.cgi | File | 2.04 KB | 0755 |
|
edit_descs.cgi | File | 1.49 KB | 0755 |
|
edit_ipkey.cgi | File | 1.7 KB | 0755 |
|
edit_lang.cgi | File | 1.82 KB | 0755 |
|
edit_lock.cgi | File | 763 B | 0755 |
|
edit_log.cgi | File | 3.04 KB | 0755 |
|
edit_mobile.cgi | File | 1.26 KB | 0755 |
|
edit_mods.cgi | File | 4.45 KB | 0755 |
|
edit_os.cgi | File | 2.72 KB | 0755 |
|
edit_proxy.cgi | File | 3.7 KB | 0755 |
|
edit_referers.cgi | File | 899 B | 0755 |
|
edit_sendmail.cgi | File | 3.48 KB | 0755 |
|
edit_session.cgi | File | 5.18 KB | 0755 |
|
edit_ssl.cgi | File | 10.55 KB | 0755 |
|
edit_startpage.cgi | File | 1.68 KB | 0755 |
|
edit_status.cgi | File | 1.13 KB | 0755 |
|
edit_themes.cgi | File | 3.72 KB | 0755 |
|
edit_twofactor.cgi | File | 1.5 KB | 0755 |
|
edit_ui.cgi | File | 2.51 KB | 0755 |
|
edit_upgrade.cgi | File | 4.26 KB | 0755 |
|
edit_web.cgi | File | 2.88 KB | 0755 |
|
edit_webmincron.cgi | File | 1.35 KB | 0755 |
|
export_mod.cgi | File | 1.23 KB | 0755 |
|
feedback_files.pl | File | 126 B | 0755 |
|
fix_os.cgi | File | 228 B | 0755 |
|
gnupg-lib.pl | File | 13.38 KB | 0755 |
|
hide.cgi | File | 326 B | 0755 |
|
index.cgi | File | 4.16 KB | 0755 |
|
install_mod.cgi | File | 3.11 KB | 0755 |
|
install_theme.cgi | File | 2.29 KB | 0755 |
|
jcameron-key.asc | File | 1.29 KB | 0644 |
|
letsencrypt-cleanup.pl | File | 2.02 KB | 0755 |
|
letsencrypt-dns.pl | File | 2.57 KB | 0755 |
|
letsencrypt-lib.pl | File | 14.03 KB | 0755 |
|
letsencrypt.cgi | File | 4.64 KB | 0755 |
|
log_parser.pl | File | 1.23 KB | 0755 |
|
module.info | File | 195 B | 0644 |
|
module.info.af | File | 0 B | 0644 |
|
module.info.af.auto | File | 142 B | 0644 |
|
module.info.ar | File | 185 B | 0644 |
|
module.info.ar.auto | File | 22 B | 0644 |
|
module.info.be | File | 0 B | 0644 |
|
module.info.be.auto | File | 208 B | 0644 |
|
module.info.bg | File | 0 B | 0644 |
|
module.info.bg.auto | File | 218 B | 0644 |
|
module.info.ca | File | 134 B | 0644 |
|
module.info.ca.auto | File | 15 B | 0644 |
|
module.info.cs | File | 28 B | 0644 |
|
module.info.cs.auto | File | 128 B | 0644 |
|
module.info.da | File | 0 B | 0644 |
|
module.info.da.auto | File | 142 B | 0644 |
|
module.info.de | File | 126 B | 0644 |
|
module.info.de.auto | File | 15 B | 0644 |
|
module.info.el | File | 0 B | 0644 |
|
module.info.el.auto | File | 262 B | 0644 |
|
module.info.es | File | 33 B | 0644 |
|
module.info.es.auto | File | 109 B | 0644 |
|
module.info.eu | File | 0 B | 0644 |
|
module.info.eu.auto | File | 158 B | 0644 |
|
module.info.fa | File | 0 B | 0644 |
|
module.info.fa.auto | File | 202 B | 0644 |
|
module.info.fi | File | 0 B | 0644 |
|
module.info.fi.auto | File | 141 B | 0644 |
|
module.info.fr | File | 32 B | 0644 |
|
module.info.fr.auto | File | 129 B | 0644 |
|
module.info.he | File | 0 B | 0644 |
|
module.info.he.auto | File | 195 B | 0644 |
|
module.info.hr | File | 0 B | 0644 |
|
module.info.hr.auto | File | 149 B | 0644 |
|
module.info.hu | File | 30 B | 0644 |
|
module.info.hu.auto | File | 148 B | 0644 |
|
module.info.it | File | 33 B | 0644 |
|
module.info.it.auto | File | 107 B | 0644 |
|
module.info.ja | File | 180 B | 0644 |
|
module.info.ko | File | 22 B | 0644 |
|
module.info.ko.auto | File | 129 B | 0644 |
|
module.info.lt | File | 0 B | 0644 |
|
module.info.lt.auto | File | 180 B | 0644 |
|
module.info.lv | File | 0 B | 0644 |
|
module.info.lv.auto | File | 157 B | 0644 |
|
module.info.ms | File | 119 B | 0644 |
|
module.info.ms.auto | File | 15 B | 0644 |
|
module.info.mt | File | 0 B | 0644 |
|
module.info.mt.auto | File | 144 B | 0644 |
|
module.info.nl | File | 28 B | 0644 |
|
module.info.nl.auto | File | 117 B | 0644 |
|
module.info.no | File | 29 B | 0644 |
|
module.info.no.auto | File | 117 B | 0644 |
|
module.info.pl | File | 155 B | 0644 |
|
module.info.pl.auto | File | 15 B | 0644 |
|
module.info.pt | File | 33 B | 0644 |
|
module.info.pt.auto | File | 113 B | 0644 |
|
module.info.pt_BR | File | 36 B | 0644 |
|
module.info.pt_BR.auto | File | 119 B | 0644 |
|
module.info.ro | File | 0 B | 0644 |
|
module.info.ro.auto | File | 147 B | 0644 |
|
module.info.ru | File | 34 B | 0644 |
|
module.info.ru.auto | File | 172 B | 0644 |
|
module.info.sk | File | 30 B | 0644 |
|
module.info.sk.auto | File | 132 B | 0644 |
|
module.info.sl | File | 0 B | 0644 |
|
module.info.sl.auto | File | 147 B | 0644 |
|
module.info.sv | File | 30 B | 0644 |
|
module.info.sv.auto | File | 114 B | 0644 |
|
module.info.th | File | 0 B | 0644 |
|
module.info.th.auto | File | 258 B | 0644 |
|
module.info.tr | File | 33 B | 0644 |
|
module.info.tr.auto | File | 128 B | 0644 |
|
module.info.uk | File | 0 B | 0644 |
|
module.info.uk.auto | File | 215 B | 0644 |
|
module.info.ur | File | 0 B | 0644 |
|
module.info.ur.auto | File | 209 B | 0644 |
|
module.info.vi | File | 0 B | 0644 |
|
module.info.vi.auto | File | 177 B | 0644 |
|
module.info.zh | File | 22 B | 0644 |
|
module.info.zh_TW | File | 25 B | 0644 |
|
module.info.zh_TW.auto | File | 115 B | 0644 |
|
newcsr.cgi | File | 800 B | 0755 |
|
newkey.cgi | File | 879 B | 0755 |
|
postinstall.pl | File | 2.01 KB | 0755 |
|
refresh_modules.cgi | File | 664 B | 0755 |
|
restart.cgi | File | 87 B | 0755 |
|
save_assignment.cgi | File | 485 B | 0755 |
|
save_categories.cgi | File | 946 B | 0755 |
|
save_descs.cgi | File | 1006 B | 0755 |
|
save_ipkey.cgi | File | 1.31 KB | 0755 |
|
save_newmod.cgi | File | 278 B | 0755 |
|
save_sendmail.cgi | File | 2.08 KB | 0755 |
|
save_webmincron.cgi | File | 1016 B | 0755 |
|
savekey.cgi | File | 2.8 KB | 0755 |
|
setup_ca.cgi | File | 1.52 KB | 0755 |
|
standard_chooser.cgi | File | 1.68 KB | 0755 |
|
stop_ca.cgi | File | 1.03 KB | 0755 |
|
syslog_logs.pl | File | 633 B | 0755 |
|
system_info.pl | File | 5.02 KB | 0644 |
|
test_sendmail.cgi | File | 784 B | 0755 |
|
third_chooser.cgi | File | 1.55 KB | 0755 |
|
twofactor-funcs-lib.pl | File | 8.81 KB | 0644 |
|
uninstall.pl | File | 236 B | 0755 |
|
update.cgi | File | 2.86 KB | 0755 |
|
upgrade.cgi | File | 16.6 KB | 0755 |
|
view_webmincron.cgi | File | 1.66 KB | 0755 |
|
webmin-lib.pl | File | 68.77 KB | 0755 |
|