|
|
776d17 |
From e9198751411d11785ac6e7e533d63911b6e51326 Mon Sep 17 00:00:00 2001
|
|
|
776d17 |
From: Sumit Bose <sbose@redhat.com>
|
|
|
776d17 |
Date: Mon, 11 Jun 2018 09:44:49 +0200
|
|
|
776d17 |
Subject: [PATCH 5/7] join: add all attributes while creating computer object
|
|
|
776d17 |
|
|
|
776d17 |
It is possible to create special accounts which can only join a computer
|
|
|
776d17 |
to a domain but is not allowed to do any further operations which the
|
|
|
776d17 |
computer object. As a result if such an account is used during the join
|
|
|
776d17 |
only the ldapadd operation is permitted but not any later ldapmodify
|
|
|
776d17 |
operation. To create the computer object correctly in this case all
|
|
|
776d17 |
attributes must be added while the object is created and not later.
|
|
|
776d17 |
|
|
|
776d17 |
Related to https://bugzilla.redhat.com/show_bug.cgi?id=1542354
|
|
|
776d17 |
---
|
|
|
776d17 |
library/adenroll.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++-----
|
|
|
776d17 |
1 file changed, 47 insertions(+), 5 deletions(-)
|
|
|
776d17 |
|
|
|
776d17 |
diff --git a/library/adenroll.c b/library/adenroll.c
|
|
|
776d17 |
index 1ed94f2..3f8d017 100644
|
|
|
776d17 |
--- a/library/adenroll.c
|
|
|
776d17 |
+++ b/library/adenroll.c
|
|
|
776d17 |
@@ -573,7 +573,7 @@ calculate_enctypes (adcli_enroll *enroll, char **enctype)
|
|
|
776d17 |
is_2008_or_later = adcli_conn_server_has_capability (enroll->conn, ADCLI_CAP_V60_OID);
|
|
|
776d17 |
|
|
|
776d17 |
/* In 2008 or later, use the msDS-supportedEncryptionTypes attribute */
|
|
|
776d17 |
- if (is_2008_or_later) {
|
|
|
776d17 |
+ if (is_2008_or_later && enroll->computer_attributes != NULL) {
|
|
|
776d17 |
value = _adcli_ldap_parse_value (ldap, enroll->computer_attributes,
|
|
|
776d17 |
"msDS-supportedEncryptionTypes");
|
|
|
776d17 |
|
|
|
776d17 |
@@ -618,7 +618,6 @@ calculate_enctypes (adcli_enroll *enroll, char **enctype)
|
|
|
776d17 |
return ADCLI_SUCCESS;
|
|
|
776d17 |
}
|
|
|
776d17 |
|
|
|
776d17 |
-
|
|
|
776d17 |
static adcli_result
|
|
|
776d17 |
create_computer_account (adcli_enroll *enroll,
|
|
|
776d17 |
LDAP *ldap)
|
|
|
776d17 |
@@ -628,22 +627,65 @@ create_computer_account (adcli_enroll *enroll,
|
|
|
776d17 |
char *vals_sAMAccountName[] = { enroll->computer_sam, NULL };
|
|
|
776d17 |
LDAPMod sAMAccountName = { LDAP_MOD_ADD, "sAMAccountName", { vals_sAMAccountName, } };
|
|
|
776d17 |
char *vals_userAccountControl[] = { "69632", NULL }; /* WORKSTATION_TRUST_ACCOUNT | DONT_EXPIRE_PASSWD */
|
|
|
776d17 |
- LDAPMod userAccountControl = { LDAP_MOD_REPLACE, "userAccountControl", { vals_userAccountControl, } };
|
|
|
776d17 |
+ LDAPMod userAccountControl = { LDAP_MOD_ADD, "userAccountControl", { vals_userAccountControl, } };
|
|
|
776d17 |
+ char *vals_supportedEncryptionTypes[] = { NULL, NULL };
|
|
|
776d17 |
+ LDAPMod encTypes = { LDAP_MOD_ADD, "msDS-supportedEncryptionTypes", { vals_supportedEncryptionTypes, } };
|
|
|
776d17 |
+ char *vals_dNSHostName[] = { enroll->host_fqdn, NULL };
|
|
|
776d17 |
+ LDAPMod dNSHostName = { LDAP_MOD_ADD, "dNSHostName", { vals_dNSHostName, } };
|
|
|
776d17 |
+ char *vals_operatingSystem[] = { enroll->os_name, NULL };
|
|
|
776d17 |
+ LDAPMod operatingSystem = { LDAP_MOD_ADD, "operatingSystem", { vals_operatingSystem, } };
|
|
|
776d17 |
+ char *vals_operatingSystemVersion[] = { enroll->os_version, NULL };
|
|
|
776d17 |
+ LDAPMod operatingSystemVersion = { LDAP_MOD_ADD, "operatingSystemVersion", { vals_operatingSystemVersion, } };
|
|
|
776d17 |
+ char *vals_operatingSystemServicePack[] = { enroll->os_service_pack, NULL };
|
|
|
776d17 |
+ LDAPMod operatingSystemServicePack = { LDAP_MOD_ADD, "operatingSystemServicePack", { vals_operatingSystemServicePack, } };
|
|
|
776d17 |
+ char *vals_userPrincipalName[] = { enroll->user_principal, NULL };
|
|
|
776d17 |
+ LDAPMod userPrincipalName = { LDAP_MOD_ADD, "userPrincipalName", { vals_userPrincipalName, }, };
|
|
|
776d17 |
+ LDAPMod servicePrincipalName = { LDAP_MOD_ADD, "servicePrincipalName", { enroll->service_principals, } };
|
|
|
776d17 |
+
|
|
|
776d17 |
+ char *val = NULL;
|
|
|
776d17 |
|
|
|
776d17 |
int ret;
|
|
|
776d17 |
+ size_t c;
|
|
|
776d17 |
+ size_t m;
|
|
|
776d17 |
|
|
|
776d17 |
- LDAPMod *mods[] = {
|
|
|
776d17 |
+ LDAPMod *all_mods[] = {
|
|
|
776d17 |
&objectClass,
|
|
|
776d17 |
&sAMAccountName,
|
|
|
776d17 |
&userAccountControl,
|
|
|
776d17 |
- NULL,
|
|
|
776d17 |
+ &encTypes,
|
|
|
776d17 |
+ &dNSHostName,
|
|
|
776d17 |
+ &operatingSystem,
|
|
|
776d17 |
+ &operatingSystemVersion,
|
|
|
776d17 |
+ &operatingSystemServicePack,
|
|
|
776d17 |
+ &userPrincipalName,
|
|
|
776d17 |
+ &servicePrincipalName,
|
|
|
776d17 |
+ NULL
|
|
|
776d17 |
};
|
|
|
776d17 |
|
|
|
776d17 |
+ size_t mods_count = sizeof (all_mods) / sizeof (LDAPMod *);
|
|
|
776d17 |
+ LDAPMod *mods[mods_count];
|
|
|
776d17 |
+
|
|
|
776d17 |
if (adcli_enroll_get_trusted_for_delegation (enroll)) {
|
|
|
776d17 |
vals_userAccountControl[0] = "593920"; /* WORKSTATION_TRUST_ACCOUNT | DONT_EXPIRE_PASSWD | TRUSTED_FOR_DELEGATION */
|
|
|
776d17 |
}
|
|
|
776d17 |
|
|
|
776d17 |
+ ret = calculate_enctypes (enroll, &val;;
|
|
|
776d17 |
+ if (ret != ADCLI_SUCCESS) {
|
|
|
776d17 |
+ return ret;
|
|
|
776d17 |
+ }
|
|
|
776d17 |
+ vals_supportedEncryptionTypes[0] = val;
|
|
|
776d17 |
+
|
|
|
776d17 |
+ m = 0;
|
|
|
776d17 |
+ for (c = 0; c < mods_count - 1; c++) {
|
|
|
776d17 |
+ /* Skip empty LDAP sttributes */
|
|
|
776d17 |
+ if (all_mods[c]->mod_vals.modv_strvals[0] != NULL) {
|
|
|
776d17 |
+ mods[m++] = all_mods[c];
|
|
|
776d17 |
+ }
|
|
|
776d17 |
+ }
|
|
|
776d17 |
+ mods[m] = NULL;
|
|
|
776d17 |
+
|
|
|
776d17 |
ret = ldap_add_ext_s (ldap, enroll->computer_dn, mods, NULL, NULL);
|
|
|
776d17 |
+ free (val);
|
|
|
776d17 |
|
|
|
776d17 |
/*
|
|
|
776d17 |
* Hand to head. This is really dumb... AD returns
|
|
|
776d17 |
--
|
|
|
776d17 |
2.14.4
|
|
|
776d17 |
|