Work on support for selecting extensions

This commit is contained in:
Jamie Cameron
2022-11-06 17:31:45 -08:00
parent 676f369cd3
commit 3a67aa1071
4 changed files with 65 additions and 2 deletions

View File

@@ -27,6 +27,12 @@ print &ui_table_row($text{'dirs_ext'},
60, $text{'default'})." ".
&file_chooser_button("ext", 1));
# Enabled extensions
my @exts = map { $_->{'value'} } &find("extension", $conf);
my @avail = &list_available_extensions($conf, $in{'file'});
print &ui_table_row($text{'dirs_exts'},
&ui_select("exts", \@exts, \@avail, 10, 1, 1));
# Can accept uploads?
print &ui_table_row($text{'dirs_upload'},
&onoff_radio("file_uploads"));

View File

@@ -39,6 +39,7 @@ dirs_header=PHP script and extension directory settings
dirs_include=Search directories for includes
dirs_below=Listed below..
dirs_ext=Directory for extensions
dirs_exts=Extensions to load
dirs_upload=Allow file uploads?
dirs_utmp=Temporary directory for uploaded files
dirs_err=Failed to save directory settings

View File

@@ -224,11 +224,13 @@ return undef;
}
# list_php_configs()
# Returns a list of allowed config files and descriptions
# Returns a list of allowed config files, descriptions and PHP commands
sub list_php_configs
{
local @rv;
&get_default_php_ini(); # Force copy of sample ini file
# Add system-wide INI files
if ($access{'global'}) {
foreach my $ai (split(/\t+/, $config{'php_ini'})) {
local ($f, $d) = split(/=/, $ai);
@@ -239,6 +241,8 @@ if ($access{'global'}) {
}
}
}
# Add INI files from ACL
foreach my $ai (split(/\t+/, $access{'php_inis'})) {
local ($f, $d) = split(/=/, $ai);
foreach my $fp (split(/,/, $f)) {
@@ -247,12 +251,16 @@ foreach my $ai (split(/\t+/, $access{'php_inis'})) {
}
}
}
# Convert dirs to files
foreach my $i (@rv) {
if (-d $i->[0] && -r "$i->[0]/php.ini") {
$i->[0] = "$i->[0]/php.ini";
}
}
if ($access{'global'} && &foreign_installed("virtual-server")) {
# Add PHP INI files from Virtualmin
if ($access{'global'} && &foreign_check("virtual-server")) {
&foreign_require("virtual-server");
foreach my $v (&virtual_server::list_available_php_versions()) {
if ($v->[0]) {
@@ -261,6 +269,26 @@ if ($access{'global'} && &foreign_installed("virtual-server")) {
}
}
}
# Merge in paths to PHP if we can get them
if (&foreign_check("virtual-server")) {
&foreign_require("virtual-server");
my %vmap = map { $_->[0], $_ }
&virtual_server::list_available_php_versions();
foreach my $rv (@rv) {
if ($rv->[0] =~ /etc\/php(\S+)\/php.ini/ && $vmap{$1}) {
$rv->[2] = $vmap{$1}->[1];
$rv->[2] =~ s/-cgi//;
}
}
}
foreach my $rv (@rv) {
if ($rv->[0] =~ /php(\d+)/) {
$rv->[2] ||= &has_command("php$1");
}
$rv->[2] ||= &has_command("php");
}
my %done;
return grep { !$done{$_->[0]}++ } @rv;
}
@@ -398,5 +426,31 @@ else {
}
}
# list_available_extensions(&conf, file)
# Returns a list of all available PHP extension modules
sub list_available_extensions
{
my ($conf, $file) = @_;
my $dir = &find_value("extension_dir", $conf);
if (!$dir) {
# Figure it out from the PHP command
my ($conf) = grep { $_->[0] eq $file } &list_php_configs();
if ($conf && $conf->[2]) {
my $out = &backquote_command("$conf->[2] -i 2>/dev/null </dev/null");
if ($out =~ /extension_dir\s+=>\s+(\S+)/) {
$dir = $1;
}
}
}
if ($dir) {
# Get all the extensions
opendir(DIR, $dir);
my @exts = grep { /\.so$/ } readdir(DIR);
closedir(DIR);
return @exts;
}
return ();
}
1;

View File

@@ -22,6 +22,8 @@ else {
$in{'ext_def'} || $in{'ext'} =~ /\S/ || &error($text{'dirs_eext'});
&save_directive($conf, "extension_dir", $in{'ext_def'} ? undef : $in{'ext'});
&save_directive($conf, "extension", [ split(/\0/, $in{'exts'}) ]);
&save_directive($conf, "file_uploads", $in{'file_uploads'} || undef);
$in{'utmp_def'} || -d $in{'utmp'} || &error($text{'dirs_eutmp'});