The branch, v4-22-test has been updated
       via  33647976766 s3:utils: Allow ROLE_IPA_DC to allow to use Kerberos in 
gensec
       via  00adb3104e7 s3:netlogon: IPA DC is the PDC as well - allow 
ROLE_IPA_DC in _netr_DsRGetForestTrustInformation()
       via  d14fa6eb96a docs-xml: Make smb.conf 'server role' value consistent 
with ROLE_IPA_DC in libparam
       via  fe8eafc289d s3:winbindd: Resolve dc name using CLDAP also for 
ROLE_IPA_DC
       via  25f5debf01e s3-net: fix "net ads kerberos" krb5ccname handling
       via  b17dec31068 s3-selftest: add tests for "net ads kerberos" commands
      from  4a05b06b12a s3/libsmb: check the negative-conn-cache in 
resolve_ads()

https://git.samba.org/?p=samba.git;a=shortlog;h=v4-22-test


- Log -----------------------------------------------------------------
commit 3364797676624aa9367076a69b2daf73870429ba
Author: Pavel Filipenský <pfilipen...@samba.org>
Date:   Mon Aug 4 23:28:24 2025 +0200

    s3:utils: Allow ROLE_IPA_DC to allow to use Kerberos in gensec
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15891
    
    Signed-off-by: Pavel Filipenský <pfilipen...@samba.org>
    Reviewed-by: Alexander Bokovoy <a...@samba.org>
    Reviewed-by: Andreas Schneider <a...@samba.org>
    
    Autobuild-User(master): Andreas Schneider <a...@cryptomilk.org>
    Autobuild-Date(master): Tue Aug  5 14:51:51 UTC 2025 on atb-devel-224
    
    (cherry picked from commit a4dff82e45308db3ccabac2a55c03d52f04d7b4d)
    
    Autobuild-User(v4-22-test): Jule Anger <jan...@samba.org>
    Autobuild-Date(v4-22-test): Mon Aug 11 07:53:47 UTC 2025 on atb-devel-224

commit 00adb3104e745babb2c330fa9c9e324805395edb
Author: Pavel Filipenský <pfilipen...@samba.org>
Date:   Mon Aug 4 23:26:02 2025 +0200

    s3:netlogon: IPA DC is the PDC as well - allow ROLE_IPA_DC in 
_netr_DsRGetForestTrustInformation()
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15891
    
    Signed-off-by: Pavel Filipenský <pfilipen...@samba.org>
    Reviewed-by: Alexander Bokovoy <a...@samba.org>
    Reviewed-by: Andreas Schneider <a...@samba.org>
    (cherry picked from commit 1dbafcc4e4ff8f39af5ca737b30e9821413dd1f2)

commit d14fa6eb96a9f296d386ff4864e4f016440f2ac8
Author: Pavel Filipenský <pfilipen...@samba.org>
Date:   Mon Aug 4 08:35:29 2025 +0200

    docs-xml: Make smb.conf 'server role' value consistent with ROLE_IPA_DC in 
libparam
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15891
    
    Signed-off-by: Pavel Filipenský <pfilipen...@samba.org>
    Reviewed-by: Alexander Bokovoy <a...@samba.org>
    Reviewed-by: Andreas Schneider <a...@samba.org>
    (cherry picked from commit d88268102ade07fab345e04109818d97d8843a14)

commit fe8eafc289dfbb6f2b6c706f2a8a68186807d4f8
Author: Pavel Filipenský <pfilipen...@samba.org>
Date:   Wed Jul 23 15:09:21 2025 +0200

    s3:winbindd: Resolve dc name using CLDAP also for ROLE_IPA_DC
    
    server role ROLE_IPA_DC (introduced in e2d5b4d) needs special handling
    in dcip_check_name().  We should resolve the DC name using:
    - CLDAP in dcip_check_name_ads()
    instead of:
    - NETBIOS in nbt_getdc() that fails if Windows is not providing netbios.
    
    The impacted environment has:
    
    domain->alt_name = example.com
    domain->active_directory = 1
    security = USER
    server role = ROLE_IPA_DC
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15891
    
    Signed-off-by: Pavel Filipenský <pfilipen...@samba.org>
    Signed-off-by: Andreas Schneider <a...@samba.org>
    Pair-programmed-with: Andreas Schneider <a...@samba.org>
    
    Reviewed-by: Alexander Bokovoy <a...@samba.org>
    (cherry picked from commit 4921c3304e5e0480e5bb80a757b3f04b3b92c3b1)

commit 25f5debf01e8163d06c0039fb6a84b3ef0c4ded3
Author: Günther Deschner <g...@samba.org>
Date:   Sun Jul 20 18:00:22 2025 +0200

    s3-net: fix "net ads kerberos" krb5ccname handling
    
    We can only rely on KRB5CCNAME being set, --use-krb5-ccname content is
    not available.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15840
    
    Guenther
    
    Signed-off-by: Guenther Deschner <g...@samba.org>
    Reviewed-by: Andreas Schneider <a...@samba.org>
    
    Autobuild-User(master): Günther Deschner <g...@samba.org>
    Autobuild-Date(master): Thu Jul 24 17:31:14 UTC 2025 on atb-devel-224
    
    (cherry picked from commit 8a97afdae788e8d10a51035f8b287dc00293f90d)

commit b17dec310680ddc5f8d704e6cf3d4c6194f86acc
Author: Günther Deschner <g...@samba.org>
Date:   Sun Jul 20 17:59:37 2025 +0200

    s3-selftest: add tests for "net ads kerberos" commands
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15840
    
    Guenther
    
    Signed-off-by: Guenther Deschner <g...@samba.org>
    Reviewed-by: Andreas Schneider <a...@samba.org>
    (cherry picked from commit 18d0574a0fe4b5fd468f949cfaa507ab4519c9e6)

-----------------------------------------------------------------------

Summary of changes:
 docs-xml/smbdotconf/security/serverrole.xml   |   2 +-
 selftest/knownfail                            |   1 -
 source3/rpc_server/netlogon/srv_netlog_nt.c   |   5 +-
 source3/script/tests/test_net_ads_kerberos.sh | 158 ++++++++++++++++++++++++++
 source3/selftest/tests.py                     |  12 ++
 source3/utils/net.c                           |  15 +++
 source3/utils/net.h                           |   1 +
 source3/utils/net_ads.c                       |   6 +-
 source3/utils/ntlm_auth.c                     |   6 +-
 source3/winbindd/winbindd_cm.c                |   4 +-
 10 files changed, 202 insertions(+), 8 deletions(-)
 create mode 100755 source3/script/tests/test_net_ads_kerberos.sh


Changeset truncated at 500 lines:

diff --git a/docs-xml/smbdotconf/security/serverrole.xml 
b/docs-xml/smbdotconf/security/serverrole.xml
index 4ea4e4751ee..40244e125ce 100644
--- a/docs-xml/smbdotconf/security/serverrole.xml
+++ b/docs-xml/smbdotconf/security/serverrole.xml
@@ -78,7 +78,7 @@
     url="http://wiki.samba.org/index.php/Samba4/HOWTO";>Samba4
     HOWTO</ulink></para>
 
-    <para><anchor id="IPA-DC"/><emphasis>SERVER ROLE = IPA DOMAIN 
CONTROLLER</emphasis></para>
+    <para><anchor id="IPA-DC"/><emphasis>SERVER ROLE = IPA PRIMARY DOMAIN 
CONTROLLER</emphasis></para>
 
     <para>This mode of operation runs Samba in a hybrid mode for IPA
     domain controller, providing forest trust to Active Directory.
diff --git a/selftest/knownfail b/selftest/knownfail
index 103a0bb1d76..ab2d79d7114 100644
--- a/selftest/knownfail
+++ b/selftest/knownfail
@@ -338,4 +338,3 @@
 
 # We currently don't send referrals for LDAP modify of non-replicated attrs
 ^samba4.ldap.rodc.python\(rodc\).__main__.RodcTests.test_modify_nonreplicated.*
-
diff --git a/source3/rpc_server/netlogon/srv_netlog_nt.c 
b/source3/rpc_server/netlogon/srv_netlog_nt.c
index 896e4e60d5a..c3759a558ca 100644
--- a/source3/rpc_server/netlogon/srv_netlog_nt.c
+++ b/source3/rpc_server/netlogon/srv_netlog_nt.c
@@ -2655,7 +2655,10 @@ WERROR _netr_DsRGetForestTrustInformation(struct 
pipes_struct *p,
                return WERR_INVALID_FLAGS;
        }
 
-       if ((r->in.flags & DS_GFTI_UPDATE_TDO) && (lp_server_role() != 
ROLE_DOMAIN_PDC)) {
+       if ((r->in.flags & DS_GFTI_UPDATE_TDO) &&
+           (lp_server_role() != ROLE_DOMAIN_PDC) &&
+           (lp_server_role() != ROLE_IPA_DC))
+       {
                p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
                return WERR_NERR_NOTPRIMARY;
        }
diff --git a/source3/script/tests/test_net_ads_kerberos.sh 
b/source3/script/tests/test_net_ads_kerberos.sh
new file mode 100755
index 00000000000..8a3c9ef2bc7
--- /dev/null
+++ b/source3/script/tests/test_net_ads_kerberos.sh
@@ -0,0 +1,158 @@
+#!/bin/sh
+
+if [ $# -lt 5 ]; then
+       cat <<EOF
+Usage: test_net_ads_kerberos.sh USERNAME REALM PASSWORD PREFIX
+EOF
+       exit 1
+fi
+
+USERNAME="$1"
+REALM="$2"
+PASSWORD="$3"
+PREFIX="$4"
+shift 4
+ADDARGS="$*"
+
+incdir=$(dirname "$0")/../../../testprogs/blackbox
+. "$incdir"/subunit.sh
+
+mkdir -p "$PREFIX"/private
+PACFILE=$PREFIX/private/pacsave.$$
+
+KRB5CCNAME_PATH="$PREFIX/net_ads_kerberos_krb5ccache"
+rm -f "$KRB5CCNAME_PATH"
+
+KRB5CCNAME="FILE:$KRB5CCNAME_PATH"
+
+
+#################################################
+## Test "net ads kerberos kinit" variants
+#################################################
+
+testit "net_ads_kerberos_kinit" \
+       "$VALGRIND" "$BINDIR"/net ads kerberos kinit \
+       -U"$USERNAME"%"$PASSWORD" "$ADDARGS" \
+       || failed=$((failed + 1))
+
+export KRB5CCNAME="$KRB5CCNAME_PATH"
+testit "net_ads_kerberos_kinit (KRB5CCNAME env set)" \
+       "$VALGRIND" "$BINDIR"/net ads kerberos kinit \
+       -U"$USERNAME"%"$PASSWORD" "$ADDARGS" \
+       || failed=$((failed + 1))
+unset KRB5CCNAME
+rm -f "$KRB5CCNAME_PATH"
+
+# --use-krb5-ccache is not working
+#testit "net_ads_kerberos_kinit (with --use-krb5-ccache)" \
+#      $VALGRIND $BINDIR/net ads kerberos kinit \
+#      -U$USERNAME%$PASSWORD $ADDARGS \
+#      --use-krb5-ccache=${KRB5CCNAME} \
+#      || failed=$((failed + 1))
+
+testit "net_ads_kerberos_kinit (-P)" \
+       "$VALGRIND" "$BINDIR"/net ads kerberos kinit \
+       -P "$ADDARGS" \
+       || failed=$((failed + 1))
+
+export KRB5CCNAME="$KRB5CCNAME_PATH"
+testit "net_ads_kerberos_kinit (-P and KRB5CCNAME env set)" \
+       "$VALGRIND" "$BINDIR"/net ads kerberos kinit \
+       -P "$ADDARGS" \
+       || failed=$((failed + 1))
+unset KRB5CCNAME
+rm -f "$KRB5CCNAME_PATH"
+
+# --use-krb5-ccache is not working
+#testit "net_ads_kerberos_kinit (-P with --use-krb5-ccache)" \
+#      $VALGRIND $BINDIR/net ads kerberos kinit \
+#      -P $ADDARGS \
+#      --use-krb5-ccache=${KRB5CCNAME} \
+#      || failed=$((failed + 1))
+
+
+#################################################
+## Test "net ads kerberos renew" variants
+#################################################
+
+#testit "net_ads_kerberos_renew" \
+#      $VALGRIND $BINDIR/net ads kerberos renew \
+#      -U$USERNAME%$PASSWORD $ADDARGS \
+#      || failed=$((failed + 1))
+#
+#export KRB5CCNAME=$KRB5CCNAME_PATH
+#testit "net_ads_kerberos_renew (KRB5CCNAME env)" \
+#      $VALGRIND $BINDIR/net ads kerberos renew \
+#      -U$USERNAME%$PASSWORD $ADDARGS \
+#      || failed=$((failed + 1))
+#unset KRB5CCNAME
+#rm -f $KRB5CCNAME_PATH
+#
+# renew only succeeds with pre-kinit
+export KRB5CCNAME="$KRB5CCNAME_PATH"
+testit "net_ads_kerberos_kinit (KRB5CCNAME env set)" \
+       "$VALGRIND" "$BINDIR"/net ads kerberos kinit \
+       -U"$USERNAME"%"$PASSWORD" "$ADDARGS" \
+       || failed=$((failed + 1))
+
+testit "net_ads_kerberos_renew" \
+       "$VALGRIND" "$BINDIR"/net ads kerberos renew \
+       -U"$USERNAME"%"$PASSWORD" "$ADDARGS" \
+       || failed=$((failed + 1))
+unset KRB5CCNAME
+rm -f "$KRB5CCNAME_PATH"
+
+
+#################################################
+## Test "net ads kerberos pac" variants
+#################################################
+
+testit "net_ads_kerberos_pac_dump" \
+       "$VALGRIND" "$BINDIR"/net ads kerberos pac dump \
+       -U"$USERNAME"%"$PASSWORD" "$ADDARGS" \
+       || failed=$((failed + 1))
+
+testit "net_ads_kerberos_pac_dump (-P)" \
+       "$VALGRIND" "$BINDIR"/net ads kerberos pac dump \
+       -P "$ADDARGS" \
+       || failed=$((failed + 1))
+
+IMPERSONATE_PRINC="alice@$REALM"
+
+#testit "net_ads_kerberos_pac_dump (impersonate)" \
+#      $VALGRIND $BINDIR/net ads kerberos pac dump \
+#      -U$USERNAME%$PASSWORD \
+#      impersonate=$IMPERSONATE_PRINC $ADDARGS \
+#      || failed=$((failed + 1))
+
+testit "net_ads_kerberos_pac_dump (impersonate and -P)" \
+       "$VALGRIND" "$BINDIR"/net ads kerberos pac dump \
+       -P \
+       impersonate="$IMPERSONATE_PRINC" "$ADDARGS" \
+       || failed=$((failed + 1))
+
+# no clue why this doesn't work...
+#
+#testit_expect_failure "net_ads_kerberos_pac_save (without filename)"
+#      $VALGRIND $BINDIR/net ads kerberos pac save \
+#      -U$USERNAME%$PASSWORD $ADDARGS \
+#      || failed=$((failed + 1))
+
+testit "net_ads_kerberos_pac_save" \
+       "$VALGRIND" "$BINDIR"/net ads kerberos pac save \
+       -U"$USERNAME"%"$PASSWORD" "$ADDARGS" \
+       filename="$PACFILE" \
+       || failed=$((failed + 1))
+
+rm -f "$PACFILE"
+
+testit "net_ads_kerberos_pac_save (-P)" \
+       "$VALGRIND" "$BINDIR"/net ads kerberos pac save \
+       -P "$ADDARGS" \
+       filename="$PACFILE" \
+       || failed=$((failed + 1))
+
+rm -f "$PACFILE"
+rm -f "$KRB5CCNAME_PATH"
+
+testok "$0" "$failed"
diff --git a/source3/selftest/tests.py b/source3/selftest/tests.py
index 3768b919c3e..e4c897cd1da 100755
--- a/source3/selftest/tests.py
+++ b/source3/selftest/tests.py
@@ -1900,6 +1900,18 @@ plantestsuite(
      "bin/samba-tool",
      '$DNSNAME'])
 
+for auth in ["$DC_USERNAME", "$DOMAIN\\\\$DC_USERNAME", "$DC_USERNAME@$REALM" 
]:
+    plantestsuite(
+        "samba3.blackbox.net_ads_kerberos (%s)" % auth,
+        "ad_member:local",
+        [os.path.join(samba3srcdir,
+                      "script/tests/test_net_ads_kerberos.sh"),
+         auth,
+         '$REALM',
+         '$DC_PASSWORD',
+         '$PREFIX',
+         configuration])
+
 plantestsuite("samba3.blackbox.force-user-unlink",
               "maptoguest:local",
               [os.path.join(samba3srcdir,
diff --git a/source3/utils/net.c b/source3/utils/net.c
index c432ebe991f..7ce93ced79e 100644
--- a/source3/utils/net.c
+++ b/source3/utils/net.c
@@ -1394,6 +1394,7 @@ static struct functable net_func[] = {
                        cli_credentials_get_principal_obtained(c->creds);
                enum credentials_obtained password_obtained =
                        cli_credentials_get_password_obtained(c->creds);
+               char *krb5ccname = NULL;
 
                if (principal_obtained == CRED_SPECIFIED) {
                        c->explicit_credentials = true;
@@ -1410,6 +1411,20 @@ static struct functable net_func[] = {
                                GENSEC_FEATURE_NTLM_CCACHE,
                                CRED_SPECIFIED);
                }
+
+               /* cli_credentials_get_ccache_name_obtained() would not work
+                * here, we also cannot get the content of --use-krb5-ccache= so
+                * for now at least honour the KRB5CCNAME environment variable
+                * to get 'net ads kerberos' functions to work at all - gd */
+
+               krb5ccname = getenv("KRB5CCNAME");
+               if (krb5ccname == NULL) {
+                       krb5ccname = talloc_strdup(c, "MEMORY:net");
+               }
+               if (krb5ccname == NULL) {
+                       exit(1);
+               }
+               c->opt_krb5_ccache = krb5ccname;
        }
 
        c->msg_ctx = cmdline_messaging_context(get_dyn_CONFIGFILE());
diff --git a/source3/utils/net.h b/source3/utils/net.h
index 8540a6db9d4..8a4218b529f 100644
--- a/source3/utils/net.h
+++ b/source3/utils/net.h
@@ -97,6 +97,7 @@ struct net_context {
        const char *opt_witness_new_ip;
        int opt_witness_new_node;
        const char *opt_witness_forced_response;
+       const char *opt_krb5_ccache;
 
        int opt_have_ip;
        struct sockaddr_storage opt_dest_ip;
diff --git a/source3/utils/net_ads.c b/source3/utils/net_ads.c
index 0128f3eb7e8..46531210411 100644
--- a/source3/utils/net_ads.c
+++ b/source3/utils/net_ads.c
@@ -3036,7 +3036,7 @@ static int net_ads_kerberos_renew(struct net_context *c, 
int argc, const char **
                return -1;
        }
 
-       ret = smb_krb5_renew_ticket(NULL, NULL, NULL, NULL);
+       ret = smb_krb5_renew_ticket(c->opt_krb5_ccache, NULL, NULL, NULL);
        if (ret) {
                d_printf(_("failed to renew kerberos ticket: %s\n"),
                        error_message(ret));
@@ -3091,7 +3091,7 @@ static int net_ads_kerberos_pac_common(struct net_context 
*c, int argc, const ch
                                     0,
                                     NULL,
                                     NULL,
-                                    NULL,
+                                    c->opt_krb5_ccache,
                                     true,
                                     true,
                                     2592000, /* one month */
@@ -3272,7 +3272,7 @@ static int net_ads_kerberos_kinit(struct net_context *c, 
int argc, const char **
                                          0,
                                          NULL,
                                          NULL,
-                                         NULL,
+                                         c->opt_krb5_ccache,
                                          true,
                                          true,
                                          2592000, /* one month */
diff --git a/source3/utils/ntlm_auth.c b/source3/utils/ntlm_auth.c
index 905f33840b1..d39956c3bee 100644
--- a/source3/utils/ntlm_auth.c
+++ b/source3/utils/ntlm_auth.c
@@ -1355,7 +1355,11 @@ static NTSTATUS 
ntlm_auth_prepare_gensec_server(TALLOC_CTX *mem_ctx,
 
        cli_credentials_set_conf(server_credentials, lp_ctx);
 
-       if (lp_server_role() == ROLE_ACTIVE_DIRECTORY_DC || lp_security() == 
SEC_ADS || USE_KERBEROS_KEYTAB) {
+       if (lp_server_role() == ROLE_ACTIVE_DIRECTORY_DC ||
+           lp_server_role() == ROLE_IPA_DC ||
+           lp_security() == SEC_ADS ||
+           USE_KERBEROS_KEYTAB)
+       {
                cli_credentials_set_kerberos_state(server_credentials,
                                                   CRED_USE_KERBEROS_DESIRED,
                                                   CRED_SPECIFIED);
diff --git a/source3/winbindd/winbindd_cm.c b/source3/winbindd/winbindd_cm.c
index bff3a9ce4f9..d52deccf430 100644
--- a/source3/winbindd/winbindd_cm.c
+++ b/source3/winbindd/winbindd_cm.c
@@ -1098,7 +1098,9 @@ static bool dcip_check_name(TALLOC_CTX *mem_ctx,
 
        if ((lp_security() == SEC_ADS) && (domain->alt_name != NULL)) {
                is_ad_domain = true;
-       } else if (lp_server_role() == ROLE_ACTIVE_DIRECTORY_DC) {
+       } else if (lp_server_role() == ROLE_ACTIVE_DIRECTORY_DC ||
+                  lp_server_role() == ROLE_IPA_DC)
+       {
                is_ad_domain = domain->active_directory;
        }
 


-- 
Samba Shared Repository

Reply via email to