mirror of
https://salsa.debian.org/freeipa-team/freeipa.git
synced 2025-01-11 08:41:55 -06:00
ipa-client-install: Fix joining when LDAP access is restricted
Fixes: https://fedorahosted.org/freeipa/ticket/1881
This commit is contained in:
parent
79e9feb247
commit
8f2e333395
@ -818,6 +818,13 @@ def install(options, env, fstore, statestore):
|
|||||||
if ret == ipadiscovery.NOT_IPA_SERVER:
|
if ret == ipadiscovery.NOT_IPA_SERVER:
|
||||||
print >>sys.stderr, "%s is not an IPA v2 Server." % cli_server
|
print >>sys.stderr, "%s is not an IPA v2 Server." % cli_server
|
||||||
return CLIENT_INSTALL_ERROR
|
return CLIENT_INSTALL_ERROR
|
||||||
|
|
||||||
|
if ret == ipadiscovery.NO_ACCESS_TO_LDAP:
|
||||||
|
print "Warning: Anonymous access to the LDAP server is disabled."
|
||||||
|
print "Proceeding without strict verification."
|
||||||
|
print "Note: This is not an error if anonymous access has been explicitly restricted."
|
||||||
|
ret = 0
|
||||||
|
|
||||||
if ret != 0:
|
if ret != 0:
|
||||||
print >>sys.stderr, "Failed to verify that "+cli_server+" is an IPA Server."
|
print >>sys.stderr, "Failed to verify that "+cli_server+" is an IPA Server."
|
||||||
print >>sys.stderr, "This may mean that the remote server is not up or is not reachable"
|
print >>sys.stderr, "This may mean that the remote server is not up or is not reachable"
|
||||||
|
@ -31,7 +31,9 @@ NOT_FQDN = -1
|
|||||||
NO_LDAP_SERVER = -2
|
NO_LDAP_SERVER = -2
|
||||||
REALM_NOT_FOUND = -3
|
REALM_NOT_FOUND = -3
|
||||||
NOT_IPA_SERVER = -4
|
NOT_IPA_SERVER = -4
|
||||||
|
NO_ACCESS_TO_LDAP = -5
|
||||||
BAD_HOST_CONFIG = -10
|
BAD_HOST_CONFIG = -10
|
||||||
|
UNKNOWN_ERROR = -15
|
||||||
|
|
||||||
class IPADiscovery:
|
class IPADiscovery:
|
||||||
|
|
||||||
@ -170,13 +172,15 @@ class IPADiscovery:
|
|||||||
# check ldap now
|
# check ldap now
|
||||||
ldapret = self.ipacheckldap(self.server, self.realm)
|
ldapret = self.ipacheckldap(self.server, self.realm)
|
||||||
|
|
||||||
if not ldapret:
|
if ldapret[0] == 0:
|
||||||
return NOT_IPA_SERVER
|
self.server = ldapret[1]
|
||||||
|
self.realm = ldapret[2]
|
||||||
|
|
||||||
self.server = ldapret[0]
|
if ldapret[0] == NO_ACCESS_TO_LDAP and self.realm == None:
|
||||||
self.realm = ldapret[1]
|
# Assume realm is the same as domain.upper()
|
||||||
|
self.realm = self.domain.upper()
|
||||||
|
|
||||||
return 0
|
return ldapret[0]
|
||||||
|
|
||||||
def ipacheckldap(self, thost, trealm):
|
def ipacheckldap(self, thost, trealm):
|
||||||
"""
|
"""
|
||||||
@ -185,7 +189,12 @@ class IPADiscovery:
|
|||||||
so the remote IPA CA cert must be available at
|
so the remote IPA CA cert must be available at
|
||||||
http://HOST/ipa/config/ca.crt
|
http://HOST/ipa/config/ca.crt
|
||||||
|
|
||||||
Returns a list [host, realm] or an empty list on error.
|
Returns a list [errno, host, realm] or an empty list on error.
|
||||||
|
Errno is an error number:
|
||||||
|
0 means all ok
|
||||||
|
1 means we could not check the info in LDAP (may happend when
|
||||||
|
anonymous binds are siabled)
|
||||||
|
2 means the server is certainly not an IPA server
|
||||||
"""
|
"""
|
||||||
|
|
||||||
lret = []
|
lret = []
|
||||||
@ -207,7 +216,7 @@ class IPADiscovery:
|
|||||||
run(["/usr/bin/wget", "-O", "%s/ca.crt" % temp_ca_dir, "http://%s/ipa/config/ca.crt" % thost])
|
run(["/usr/bin/wget", "-O", "%s/ca.crt" % temp_ca_dir, "http://%s/ipa/config/ca.crt" % thost])
|
||||||
except CalledProcessError, e:
|
except CalledProcessError, e:
|
||||||
logging.debug('Retrieving CA from %s failed.\n%s' % (thost, str(e)))
|
logging.debug('Retrieving CA from %s failed.\n%s' % (thost, str(e)))
|
||||||
return []
|
return [NOT_IPA_SERVER]
|
||||||
|
|
||||||
#now verify the server is really an IPA server
|
#now verify the server is really an IPA server
|
||||||
try:
|
try:
|
||||||
@ -229,7 +238,7 @@ class IPADiscovery:
|
|||||||
logging.debug("Search for (info=*) in "+self.basedn+"(base)")
|
logging.debug("Search for (info=*) in "+self.basedn+"(base)")
|
||||||
lret = lh.search_s(self.basedn, ldap.SCOPE_BASE, "(info=IPA*)")
|
lret = lh.search_s(self.basedn, ldap.SCOPE_BASE, "(info=IPA*)")
|
||||||
if not lret:
|
if not lret:
|
||||||
return []
|
return [NOT_IPA_SERVER]
|
||||||
logging.debug("Found: "+str(lret))
|
logging.debug("Found: "+str(lret))
|
||||||
|
|
||||||
for lattr in lret[0][1]:
|
for lattr in lret[0][1]:
|
||||||
@ -238,14 +247,14 @@ class IPADiscovery:
|
|||||||
break
|
break
|
||||||
|
|
||||||
if not linfo or linfo.lower() != 'ipa v2.0':
|
if not linfo or linfo.lower() != 'ipa v2.0':
|
||||||
return []
|
return [NOT_IPA_SERVER]
|
||||||
|
|
||||||
#search and return known realms
|
#search and return known realms
|
||||||
logging.debug("Search for (objectClass=krbRealmContainer) in "+self.basedn+"(sub)")
|
logging.debug("Search for (objectClass=krbRealmContainer) in "+self.basedn+"(sub)")
|
||||||
lret = lh.search_s("cn=kerberos,"+self.basedn, ldap.SCOPE_SUBTREE, "(objectClass=krbRealmContainer)")
|
lret = lh.search_s("cn=kerberos,"+self.basedn, ldap.SCOPE_SUBTREE, "(objectClass=krbRealmContainer)")
|
||||||
if not lret:
|
if not lret:
|
||||||
#something very wrong
|
#something very wrong
|
||||||
return []
|
return [REALM_NOT_FOUND]
|
||||||
logging.debug("Found: "+str(lret))
|
logging.debug("Found: "+str(lret))
|
||||||
|
|
||||||
for lres in lret:
|
for lres in lret:
|
||||||
@ -257,26 +266,31 @@ class IPADiscovery:
|
|||||||
if trealm:
|
if trealm:
|
||||||
for r in lrealms:
|
for r in lrealms:
|
||||||
if trealm == r:
|
if trealm == r:
|
||||||
return [thost, trealm]
|
return [0, thost, trealm]
|
||||||
# must match or something is very wrong
|
# must match or something is very wrong
|
||||||
return []
|
return [REALM_NOT_FOUND]
|
||||||
else:
|
else:
|
||||||
if len(lrealms) != 1:
|
if len(lrealms) != 1:
|
||||||
#which one? we can't attach to a multi-realm server without DNS working
|
#which one? we can't attach to a multi-realm server without DNS working
|
||||||
return []
|
return [REALM_NOT_FOUND]
|
||||||
else:
|
else:
|
||||||
return [thost, lrealms[0]]
|
return [0, thost, lrealms[0]]
|
||||||
|
|
||||||
#we shouldn't get here
|
#we shouldn't get here
|
||||||
return []
|
return [UNKNOWN_ERROR]
|
||||||
|
|
||||||
except LDAPError, err:
|
except LDAPError, err:
|
||||||
if not isinstance(err, ldap.TIMEOUT):
|
if isinstance(err, ldap.TIMEOUT):
|
||||||
logging.error("LDAP Error: %s: %s" %
|
|
||||||
(err.args[0]['desc'], err.args[0].get('info', '')))
|
|
||||||
else:
|
|
||||||
logging.error("LDAP Error: timeout")
|
logging.error("LDAP Error: timeout")
|
||||||
return []
|
return [NO_LDAP_SERVER]
|
||||||
|
|
||||||
|
if isinstance(err, ldap.INAPPROPRIATE_AUTH):
|
||||||
|
logging.debug("LDAP Error: Anonymous acces not allowed")
|
||||||
|
return [NO_ACCESS_TO_LDAP]
|
||||||
|
|
||||||
|
logging.error("LDAP Error: %s: %s" %
|
||||||
|
(err.args[0]['desc'], err.args[0].get('info', '')))
|
||||||
|
return [UNKNOWN_ERROR]
|
||||||
|
|
||||||
finally:
|
finally:
|
||||||
os.remove("%s/ca.crt" % temp_ca_dir)
|
os.remove("%s/ca.crt" % temp_ca_dir)
|
||||||
@ -307,8 +321,8 @@ class IPADiscovery:
|
|||||||
return servers
|
return servers
|
||||||
|
|
||||||
def ipadnssearchkrb(self, tdomain):
|
def ipadnssearchkrb(self, tdomain):
|
||||||
realm = ""
|
realm = None
|
||||||
kdc = ""
|
kdc = None
|
||||||
# now, check for a Kerberos realm the local host or domain is in
|
# now, check for a Kerberos realm the local host or domain is in
|
||||||
qname = "_kerberos." + tdomain
|
qname = "_kerberos." + tdomain
|
||||||
# terminate the name
|
# terminate the name
|
||||||
|
Loading…
Reference in New Issue
Block a user