admserv/newinst/src/AdminServer.pm.in | 44 +++++++++++++++++++++++-------
admserv/newinst/src/setup-ds-admin.res.in | 2 +
2 files changed, 36 insertions(+), 10 deletions(-)
New commits:
commit 894e5b9a64c2edaea6f1a1ef089015a1920169df
Author: Noriko Hosoi <nhosoi(a)redhat.com>
Date: Tue Jan 20 13:18:59 2015 -0800
Ticket 47891 - Admin Server reconfig breaks SSL config
Description:
1) Use mkdtemp to reduce the risk to disclose the sec file backup
location that is in the same file system as the original files
exist.
2) reconfig_backup_secfiles and reconfig_restore_secfiles expect
the admin config dir, e.g., "/etc/dirsrv/admin-serv" or the dir
specified by the environment variable.
3) Update (--update) did not call reconfig_restore_secfiles in which
restores and delete the backup dir.
4) If creating or accessing the sec backup dir fails, it issues a
fatal error and quits the reconfiguration.
https://fedorahosted.org/389/ticket/47891
Reviewed by rmeggins(a)redhat.com (Thank you, Rich!!)
diff --git a/admserv/newinst/src/AdminServer.pm.in
b/admserv/newinst/src/AdminServer.pm.in
index a189c66..0c98a6e 100644
--- a/admserv/newinst/src/AdminServer.pm.in
+++ b/admserv/newinst/src/AdminServer.pm.in
@@ -30,8 +30,11 @@ require Exporter;
use File::Path;
use File::Copy;
+use File::Basename;
+use File::Temp;
-my $secfile_backup_dir = "/tmp/adm-sec-files." . $$;
+my $template_backup_dir = "tmpdirXXXX";
+my $secfile_backup_dir = "";
# tempfiles
use File::Temp qw(tempfile tempdir);
@@ -515,8 +518,12 @@ sub reconfig_backup_secfiles
#
my $configdir = shift;
+ my $dirname = dirname $configdir;
+ my $my_template_backup_dir = $dirname . "/" . $template_backup_dir;
+ $secfile_backup_dir = mkdtemp($my_template_backup_dir);
if ( ! -d $secfile_backup_dir){
- mkdir ($secfile_backup_dir, 0755);
+ $setup->msg($FATAL, 'error_creating_secfile_backup',
$secfile_backup_dir, $!);
+ return 0;
}
foreach my $savefile (@reconfigsavefiles) {
if ( -e "$configdir/$savefile"){
@@ -527,6 +534,7 @@ sub reconfig_backup_secfiles
}
}
}
+ return 1;
}
sub reconfig_restore_secfiles
@@ -536,11 +544,16 @@ sub reconfig_restore_secfiles
#
my $configdir = shift;
+ if ( ! -d $secfile_backup_dir){
+ $setup->msg($FATAL, 'error_accessing_secfile_backup',
$secfile_backup_dir);
+ return 0;
+ }
foreach my $savefile (@reconfigsavefiles) {
move ("$secfile_backup_dir/$savefile"
,"$configdir/$savefile");
debug(1, "Restoring $configdir/$savefile with
$secfile_backup_dir/$savefile\n");
}
rmdir ($secfile_backup_dir);
+ return 1;
}
sub createAdminServer {
@@ -548,13 +561,6 @@ sub createAdminServer {
my $reconfig = shift;
# setup has inf, res, and log
- if ($reconfig) {
- $setup->msg('begin_reconfig_adminserver');
- reconfig_backup_secfiles($setup->{inf}->{admin}->{config_dir});
- } else {
- $setup->msg('begin_create_adminserver');
- }
-
if (!setDefaults($setup)) {
return 0;
}
@@ -578,6 +584,15 @@ sub createAdminServer {
$ENV{ADMSERV_PID_DIR} ||
"@piddir@";
+ if ($reconfig) {
+ $setup->msg('begin_reconfig_adminserver');
+ if (!reconfig_backup_secfiles($configdir)) {
+ return 0;
+ }
+ } else {
+ $setup->msg('begin_create_adminserver');
+ }
+
# if we're just doing the update, just register and return
if ($setup->{update}) {
if (!registerASWithConfigDS($setup, $configdir)) {
@@ -587,6 +602,13 @@ sub createAdminServer {
# Update SELinux policy if needed
updateSelinuxPolicy($setup, $configdir, $securitydir, $logdir, $rundir);
+ # Restore the security files before we start the server
+ if ($reconfig) {
+ if (!reconfig_restore_secfiles($configdir)) {
+ return 0;
+ }
+ }
+
return 1;
}
@@ -619,7 +641,9 @@ sub createAdminServer {
# Restore the security files before we start the server
if ($reconfig) {
- reconfig_restore_secfiles($setup->{inf}->{admin}->{config_dir});
+ if (!reconfig_restore_secfiles($configdir)) {
+ return 0;
+ }
}
if (!startAdminServer($setup, $configdir, $logdir, $rundir)) {
diff --git a/admserv/newinst/src/setup-ds-admin.res.in
b/admserv/newinst/src/setup-ds-admin.res.in
index e83d045..b03bc0c 100644
--- a/admserv/newinst/src/setup-ds-admin.res.in
+++ b/admserv/newinst/src/setup-ds-admin.res.in
@@ -161,3 +161,5 @@ error_removing_port_label = Error: could not remove selinux label from
port '%s'
error_product_already_exists = Error: the product %s already exists.\
If you want to delete this entry and force the conversion of the older\
product, run this program again with the --force option.\n\n
+error_creating_secfile_backup = Could not create temporary directory %s to backup
security files. Error: %s\n
+error_accessing_secfile_backup = Could not access temporary directory %s to restore
security files.\n