Blame SOURCES/0007-Don-t-always-override-the-port-in-import_included_profiles_rhbz#2022483.patch

a24961
From edb216849e4f47d6cae95981edf0c3fe2653fd7a Mon Sep 17 00:00:00 2001
a24961
From: Rob Crittenden <rcritten@redhat.com>
a24961
Date: Fri, 28 Jan 2022 16:46:35 -0500
a24961
Subject: [PATCH] Don't always override the port in import_included_profiles
a24961
a24961
I can only guess to the original purpose of this override. I
a24961
believe it was because this is called in the installer prior
a24961
to Apache being set up. The expectation was that this would
a24961
only be called locally. It predates the RestClient class.
a24961
a24961
RestClient will attempt to find an available service. In this
a24961
case, during a CA installation, the local server is not
a24961
considered available because it lacks an entry in
a24961
cn=masters. So it will never be returned as an option.
a24961
a24961
So by overriding the port to 8443 the remote connection will
a24961
likely fail because we don't require that the port be open.
a24961
a24961
So instead, instantiate a RestClient and see what happens.
a24961
a24961
There are several use-cases:
a24961
a24961
1. Installing an initial server. The RestClient connection
a24961
   should fail, so we will fall back to the override port and
a24961
   use the local server. If Apache happens to be running with
a24961
   a globally-issued certificate then the RestClient will
a24961
   succeed. In this case if the connected host and the local
a24961
   hostname are the same, override in that case as well.
a24961
a24961
2. Installing as a replica. In this case the local server should
a24961
   be ignored in all cases and a remote CA will be picked with
a24961
   no override done.
a24961
a24961
3. Switching from CA-less to CA-ful. The web server will be
a24961
   trusted but the RestClient login will fail with a 404. Fall
a24961
   back to the override port in this case.
a24961
a24961
The motivation for this is trying to install an EL 8.x replica
a24961
against an EL 7.9 server. 8.5+ includes the ACME service and
a24961
a new profile is needed which doesn't exist in 7. This was
a24961
failing because the RestClient determined that the local server
a24961
wasn't running a CA so tried the remote one (7.9) on the override
a24961
port 8443. Since this port isn't open: failure.
a24961
a24961
Chances are that adding the profile is still going to fail
a24961
because again, 7.9 lacks ACME capabilities, but it will fail in
a24961
a way that allows the installation to continue.
a24961
a24961
I suspect that all of the overrides can similarly handled, or
a24961
handled directly within the RestClient class, but for the sake
a24961
of "do no harm" I'm only changing this instance for now.
a24961
a24961
https://pagure.io/freeipa/issue/9100
a24961
a24961
Signed-off-by: Rob Crittenden <rcritten@redhat.com>
a24961
Reviewed-By: Florence Blanc-Renaud <frenaud@redhat.com>
a24961
---
a24961
 ipaserver/install/cainstance.py | 30 +++++++++++++++++++++++++++++-
a24961
 1 file changed, 29 insertions(+), 1 deletion(-)
a24961
a24961
diff --git a/ipaserver/install/cainstance.py b/ipaserver/install/cainstance.py
a24961
index 8c8bf1b3a..ad206aad4 100644
a24961
--- a/ipaserver/install/cainstance.py
a24961
+++ b/ipaserver/install/cainstance.py
a24961
@@ -1953,7 +1953,35 @@ def import_included_profiles():
a24961
         cn=['certprofiles'],
a24961
     )
a24961
 
a24961
-    api.Backend.ra_certprofile.override_port = 8443
a24961
+    # At this point Apache may or may not be running with a valid
a24961
+    # certificate. The local server is not yet recognized as a full
a24961
+    # CA yet so it isn't discoverable. So try to do some detection
a24961
+    # on what port to use, 443 (remote) or 8443 (local) for importing
a24961
+    # the profiles.
a24961
+    #
a24961
+    # api.Backend.ra_certprofile invokes the RestClient class
a24961
+    # which will discover and login to the CA REST API. We can
a24961
+    # use this information to detect where to import the profiles.
a24961
+    #
a24961
+    # If the login is successful (e.g. doesn't raise an exception)
a24961
+    # and it returns our hostname (it prefers the local host) then
a24961
+    # we override and talk locally.
a24961
+    #
a24961
+    # Otherwise a NetworkError means we can't connect on 443 (perhaps
a24961
+    # a firewall) or we get an HTTP error (valid TLS certificate on
a24961
+    # Apache but no CA, login fails with 404) so we override to the
a24961
+    # local server.
a24961
+    #
a24961
+    # When override port was always set to 8443 the RestClient could
a24961
+    # pick a remote server and since 8443 isn't in our firewall profile
a24961
+    # setting up a new server would fail.
a24961
+    try:
a24961
+        with api.Backend.ra_certprofile as profile_api:
a24961
+            if profile_api.ca_host == api.env.host:
a24961
+                api.Backend.ra_certprofile.override_port = 8443
a24961
+    except (errors.NetworkError, errors.RemoteRetrieveError) as e:
a24961
+        logger.debug('Overriding CA port: %s', e)
a24961
+        api.Backend.ra_certprofile.override_port = 8443
a24961
 
a24961
     for (profile_id, desc, store_issued) in dogtag.INCLUDED_PROFILES:
a24961
         dn = DN(('cn', profile_id),
a24961
-- 
a24961
2.34.1
a24961