pgreco / rpms / ipa

Forked from forks/areguera/rpms/ipa 4 years ago
Clone

Blame SOURCES/0043-Fix-filtering-of-enctypes-in-server-code.patch

e3ffab
From 6a6389fefdc055b5a920e6e4412ff0b7e37ef33a Mon Sep 17 00:00:00 2001
e3ffab
From: Simo Sorce <simo@redhat.com>
e3ffab
Date: Mon, 17 Nov 2014 21:05:56 -0500
e3ffab
Subject: [PATCH] Fix filtering of enctypes in server code.
e3ffab
e3ffab
The filtering was incorrect and would result in always discarding all values.
e3ffab
Also make sure there are no duplicates in the list.
e3ffab
e3ffab
Partial fix for:
e3ffab
https://fedorahosted.org/freeipa/ticket/4718
e3ffab
e3ffab
Reviewed-By: Alexander Bokovoy <abokovoy@redhat.com>
e3ffab
Reviewed-By: Nathaniel McCallum <npmccallum@redhat.com>
e3ffab
---
e3ffab
 .../ipa-pwd-extop/ipa_pwd_extop.c                  | 60 ++++++++++++++++------
e3ffab
 1 file changed, 43 insertions(+), 17 deletions(-)
e3ffab
e3ffab
diff --git a/daemons/ipa-slapi-plugins/ipa-pwd-extop/ipa_pwd_extop.c b/daemons/ipa-slapi-plugins/ipa-pwd-extop/ipa_pwd_extop.c
e3ffab
index f0346a343188930dfc90e19d2e5d38cb30741b90..b87ae0dc7a180008228f31293b49212df80584e8 100644
e3ffab
--- a/daemons/ipa-slapi-plugins/ipa-pwd-extop/ipa_pwd_extop.c
e3ffab
+++ b/daemons/ipa-slapi-plugins/ipa-pwd-extop/ipa_pwd_extop.c
e3ffab
@@ -125,6 +125,48 @@ static void filter_keys(struct ipapwd_krbcfg *krbcfg,
e3ffab
     }
e3ffab
 }
e3ffab
 
e3ffab
+static void filter_enctypes(struct ipapwd_krbcfg *krbcfg,
e3ffab
+                            krb5_key_salt_tuple *kenctypes,
e3ffab
+                            int *num_kenctypes)
e3ffab
+{
e3ffab
+    /* first filter for duplicates */
e3ffab
+    for (int i = 0; i + 1 < *num_kenctypes; i++) {
e3ffab
+        for (int j = i + 1; j < *num_kenctypes; j++) {
e3ffab
+            if (kenctypes[i].ks_enctype == kenctypes[j].ks_enctype) {
e3ffab
+                /* duplicate, filter out */
e3ffab
+                for (int k = j; k + 1 < *num_kenctypes; k++) {
e3ffab
+                    kenctypes[k].ks_enctype = kenctypes[k + 1].ks_enctype;
e3ffab
+                    kenctypes[k].ks_salttype = kenctypes[k + 1].ks_salttype;
e3ffab
+                }
e3ffab
+                (*num_kenctypes)--;
e3ffab
+                j--;
e3ffab
+            }
e3ffab
+        }
e3ffab
+    }
e3ffab
+
e3ffab
+    /* then filter for supported */
e3ffab
+    for (int i = 0; i < *num_kenctypes; i++) {
e3ffab
+        int j;
e3ffab
+
e3ffab
+        /* Check if supported */
e3ffab
+        for (j = 0; j < krbcfg->num_supp_encsalts; j++) {
e3ffab
+            if (kenctypes[i].ks_enctype ==
e3ffab
+                                    krbcfg->supp_encsalts[j].ks_enctype) {
e3ffab
+                break;
e3ffab
+            }
e3ffab
+        }
e3ffab
+        if (j == krbcfg->num_supp_encsalts) {
e3ffab
+            /* Unsupported, filter out */
e3ffab
+            for (int k = i; k + 1 < *num_kenctypes; k++) {
e3ffab
+                kenctypes[k].ks_enctype = kenctypes[k + 1].ks_enctype;
e3ffab
+                kenctypes[k].ks_salttype = kenctypes[k + 1].ks_salttype;
e3ffab
+            }
e3ffab
+            (*num_kenctypes)--;
e3ffab
+            i--;
e3ffab
+        }
e3ffab
+    }
e3ffab
+}
e3ffab
+
e3ffab
 static int ipapwd_to_ldap_pwpolicy_error(int ipapwderr)
e3ffab
 {
e3ffab
     switch (ipapwderr) {
e3ffab
@@ -1740,23 +1782,7 @@ static int ipapwd_getkeytab(Slapi_PBlock *pb, struct ipapwd_krbcfg *krbcfg)
e3ffab
             goto free_and_return;
e3ffab
         }
e3ffab
 
e3ffab
-        for (int i = 0; i < num_kenctypes; i++) {
e3ffab
-
e3ffab
-            /* Check if supported */
e3ffab
-            for (int j = 0; j < krbcfg->num_supp_encsalts; j++) {
e3ffab
-                if (kenctypes[i].ks_enctype ==
e3ffab
-                                        krbcfg->supp_encsalts[j].ks_enctype) {
e3ffab
-                    continue;
e3ffab
-                }
e3ffab
-            }
e3ffab
-            /* Unsupported, filter out */
e3ffab
-            for (int j = i; j + 1 < num_kenctypes; j++) {
e3ffab
-                kenctypes[j].ks_enctype = kenctypes[j + 1].ks_enctype;
e3ffab
-                kenctypes[j].ks_salttype = kenctypes[j + 1].ks_salttype;
e3ffab
-            }
e3ffab
-            num_kenctypes--;
e3ffab
-            i--;
e3ffab
-        }
e3ffab
+        filter_enctypes(krbcfg, kenctypes, &num_kenctypes);
e3ffab
 
e3ffab
         /* check if we have any left */
e3ffab
         if (num_kenctypes == 0 && kenctypes != NULL) {
e3ffab
-- 
e3ffab
2.1.0
e3ffab