kerberos: make sure we only use prompter type when available.
authorGünther Deschner <gd@samba.org>
Fri, 2 Oct 2015 02:23:59 +0000 (04:23 +0200)
committerGünther Deschner <gd@samba.org>
Fri, 2 Oct 2015 05:29:43 +0000 (07:29 +0200)
We also verified that we cannot simply remove the prompter as several older
versions of Heimdal would crash.

Guenther

Signed-off-by: Günther Deschner <gd@samba.org>
Reviewed-by: Volker Lendecke <vl@samba.org>
Autobuild-User(master): Günther Deschner <gd@samba.org>
Autobuild-Date(master): Fri Oct  2 07:29:43 CEST 2015 on sn-devel-104

source3/libads/kerberos.c
source4/heimdal_build/wscript_configure
wscript_configure_system_mitkrb5

index 7fe864bf96e4fdcc2776719c2f372079abbb34b1..9a7a1e70b1d3ba672d40720102a13cafb75cc218 100644 (file)
@@ -47,6 +47,16 @@ kerb_prompter(krb5_context ctx, void *data,
               krb5_prompt prompts[])
 {
        if (num_prompts == 0) return 0;
+#if HAVE_KRB5_PROMPT_TYPE
+
+       /*
+        * only heimdal has a prompt type and we need to deal with it here to
+        * avoid loops.
+        *
+        * removing the prompter completely is not an option as at least these
+        * versions would crash: heimdal-1.0.2 and heimdal-1.1. Later heimdal
+        * version have looping detection and return with a proper error code.
+        */
 
        if ((num_prompts == 2) &&
            (prompts[0].type == KRB5_PROMPT_TYPE_NEW_PASSWORD) &&
@@ -63,7 +73,7 @@ kerb_prompter(krb5_context ctx, void *data,
                 */
                return KRB5KDC_ERR_KEY_EXPIRED;
        }
-
+#endif /* HAVE_KRB5_PROMPT_TYPE */
        memset(prompts[0].reply->data, '\0', prompts[0].reply->length);
        if (prompts[0].reply->length > 0) {
                if (data) {
index 710a53de85ad66fa552d51f8e0e0296049e6914e..2635b8aeb73810eb43bd986cf130c83c758544e7 100755 (executable)
@@ -168,6 +168,7 @@ conf.define('HAVE_KRB5_PRINCIPAL_SET_REALM', 1)
 conf.define('HAVE_KRB5_PRINCIPAL_SET_TYPE', 1)
 conf.define('HAVE_KRB5_PRINCIPAL_GET_TYPE', 1)
 conf.define('HAVE_KRB5_WARNX', 1)
+conf.define('HAVE_KRB5_PROMPT_TYPE', 1)
 
 heimdal_includedirs = []
 heimdal_libdirs = []
index 351e9d83a6dab4b41091a8d6a739a5f3e8068e77..4b3a69fa34415174404cbdc4f4bd95a90d17d6e4 100644 (file)
@@ -137,6 +137,8 @@ conf.CHECK_STRUCTURE_MEMBER('krb5_address', 'addrtype', headers='krb5.h',
                             define='HAVE_ADDRTYPE_IN_KRB5_ADDRESS')
 conf.CHECK_STRUCTURE_MEMBER('krb5_ap_req', 'ticket', headers='krb5.h',
                             define='HAVE_TICKET_POINTER_IN_KRB5_AP_REQ')
+conf.CHECK_STRUCTURE_MEMBER('krb5_prompt', 'type', headers='krb5.h',
+                            define='HAVE_KRB5_PROMPT_TYPE')
 
 conf.CHECK_TYPE('krb5_encrypt_block', headers='krb5.h')