92abab
From 14e4011027214bd2c33ef4975a3ed43486e4de70 Mon Sep 17 00:00:00 2001
92abab
From: Matthew Harmsen <mharmsen@redhat.com>
92abab
Date: Sat, 23 Oct 2021 23:19:57 -0600
92abab
Subject: [PATCH 1/3] Fixes gleaned from the following DOGTAG_10_5_COMMITS:
92abab
92abab
commit 68ef0c8a4208b9deea819c41d65639edd6de8e8c
92abab
Author: Chris Kelley <ckelley@redhat.com>
92abab
Date:   Tue Aug 31 12:41:06 2021 +0100
92abab
92abab
    Fix navigation buttons in CA EE list certs page
92abab
92abab
commit 64e6acd3e035ecb0eb84d8fe47cd513eb8eaeb3b
92abab
Author: Jon Parrish <jonathon.d.parrish2.ctr@mail.mil>
92abab
Date:   Thu Oct 7 16:39:38 2021 +0000
92abab
92abab
    Close table so that top navigation is at the top
92abab
---
92abab
 base/ca/shared/webapps/ca/ee/ca/queryCert.template | 6 +++---
92abab
 1 file changed, 3 insertions(+), 3 deletions(-)
92abab
92abab
diff --git a/base/ca/shared/webapps/ca/ee/ca/queryCert.template b/base/ca/shared/webapps/ca/ee/ca/queryCert.template
92abab
index 878e3be..65718e1 100644
92abab
--- a/base/ca/shared/webapps/ca/ee/ca/queryCert.template
92abab
+++ b/base/ca/shared/webapps/ca/ee/ca/queryCert.template
92abab
@@ -336,7 +336,7 @@ if (result.recordSet.length == 0) {
92abab
 	);
92abab
 
92abab
 	document.write("\n"+
92abab
-		"\n");
92abab
+		"\n");
92abab
 	displayNextForm();
92abab
 
92abab
 	document.write(
92abab
@@ -370,7 +370,7 @@ document.write("\n");
92abab
     }
92abab
 
92abab
 	document.write("\n"+
92abab
-		"\n");
92abab
+		"\n");
92abab
 
92abab
 	if (result.header.revokeAll != null && result.header.totalRecordCount > 1) {
92abab
 		displayRevokeAllForm(result.header.totalRecordCount);
92abab
@@ -407,7 +407,7 @@ function renderNextButtonElement(name, label, disabled)
92abab
     result.innerText = label;
92abab
     result.width = 72;
92abab
     result.disabled = disabled ? true : false;
92abab
-    result.onClick = () => doNext(result);
92abab
+    result.onclick = () => doNext(result);
92abab
     return result;
92abab
 }
92abab
 
92abab
-- 
92abab
1.8.3.1
92abab
92abab
92abab
From 33fd6ff7de3c847939269ca1307d5854af258d4c Mon Sep 17 00:00:00 2001
92abab
From: Christina Fu <cfu@redhat.com>
92abab
Date: Mon, 11 Oct 2021 16:26:19 -0700
92abab
Subject: [PATCH 2/3] Bug2007405-pkispawn bails out too easily in
92abab
 validate_system_cert
92abab
92abab
For pkispawn, in def validate_system_cert, it appears some unexpected
92abab
conditions could happen that would trigger failur to
92abab
  pki-server subsystem-cert-validate
92abab
92abab
Some of these conditions probably could have been resolved manually
92abab
if installation were allowed to complete.
92abab
92abab
This patch is to print out the result as information then allow the
92abab
installation to continue. It doesn't necessarily mean that the
92abab
installation will succeed, but it will at least go further to allow
92abab
for better investigation.
92abab
92abab
fixes https://bugzilla.redhat.com/show_bug.cgi?id=2007405
92abab
92abab
(cherry picked from commit 656d3426cc3ace5cac3624384e05c4233caae022)
92abab
---
92abab
 base/server/python/pki/server/__init__.py | 9 ++++++---
92abab
 1 file changed, 6 insertions(+), 3 deletions(-)
92abab
92abab
diff --git a/base/server/python/pki/server/__init__.py b/base/server/python/pki/server/__init__.py
92abab
index 3512e94..3856c85 100644
92abab
--- a/base/server/python/pki/server/__init__.py
92abab
+++ b/base/server/python/pki/server/__init__.py
92abab
@@ -450,9 +450,12 @@ class PKISubsystem(object):
92abab
 
92abab
         logger.debug('Command: %s', ' '.join(cmd))
92abab
 
92abab
-        subprocess.check_output(
92abab
-            cmd,
92abab
-            stderr=subprocess.STDOUT)
92abab
+        try:
92abab
+            print(subprocess.check_output(
92abab
+                cmd,
92abab
+                stderr=subprocess.STDOUT))
92abab
+        except subprocess.CalledProcessError as v:
92abab
+            print("pki-server subsystem-cert-validate stdout output:\n", v.output)
92abab
 
92abab
     def export_system_cert(
92abab
             self,
92abab
-- 
92abab
1.8.3.1
92abab
92abab
92abab
From 82a3f261c83c33c395f4ee720b3cb09c9007580c Mon Sep 17 00:00:00 2001
92abab
From: Andrew Wnuk <92763627+ajwnuk@users.noreply.github.com>
92abab
Date: Thu, 21 Oct 2021 15:17:55 -0700
92abab
Subject: [PATCH 3/3] Authentication issue #3629 (#3787)
92abab
92abab
Co-authored-by: Andrew Wnuk <awnuk@purestorage.com>
92abab
(cherry picked from commit cf3fb92a029991da029ba81b5f68e254e44532d7)
92abab
---
92abab
 .../authentication/UserPwdDirAuthentication.java   | 150 +++++++++++++++++++++
92abab
 1 file changed, 150 insertions(+)
92abab
92abab
diff --git a/base/server/cms/src/com/netscape/cms/authentication/UserPwdDirAuthentication.java b/base/server/cms/src/com/netscape/cms/authentication/UserPwdDirAuthentication.java
92abab
index ead8650..faaefb6 100644
92abab
--- a/base/server/cms/src/com/netscape/cms/authentication/UserPwdDirAuthentication.java
92abab
+++ b/base/server/cms/src/com/netscape/cms/authentication/UserPwdDirAuthentication.java
92abab
@@ -18,12 +18,21 @@
92abab
 package com.netscape.cms.authentication;
92abab
 
92abab
 // ldap java sdk
92abab
+import java.util.ArrayList;
92abab
 import java.util.Enumeration;
92abab
+import java.util.HashMap;
92abab
 import java.util.Locale;
92abab
+import java.util.Map;
92abab
 import java.util.Vector;
92abab
 
92abab
+
92abab
 import netscape.ldap.LDAPConnection;
92abab
 import netscape.ldap.LDAPException;
92abab
+import netscape.ldap.LDAPAttribute;
92abab
+import netscape.ldap.LDAPConnection;
92abab
+import netscape.ldap.LDAPEntry;
92abab
+import netscape.ldap.LDAPSearchResults;
92abab
+import netscape.ldap.LDAPv2;
92abab
 
92abab
 import com.netscape.certsrv.apps.CMS;
92abab
 import com.netscape.certsrv.authentication.AuthToken;
92abab
@@ -44,6 +53,8 @@ import com.netscape.certsrv.profile.IProfileAuthenticator;
92abab
 import com.netscape.certsrv.property.Descriptor;
92abab
 import com.netscape.certsrv.property.IDescriptor;
92abab
 import com.netscape.certsrv.request.IRequest;
92abab
+import com.netscape.certsrv.usrgrp.IUGSubsystem;
92abab
+import com.netscape.certsrv.usrgrp.IUser;
92abab
 // cert server x509 imports
92abab
 // java sdk imports.
92abab
 
92abab
@@ -65,6 +76,12 @@ public class UserPwdDirAuthentication extends DirBasedAuthentication
92abab
 
92abab
     protected String mAttrName = null;
92abab
     protected String mAttrDesc = null;
92abab
+    protected String mMemberAttrName = null;
92abab
+    protected String mMemberAttrValue = null;
92abab
+    protected String mInternalGroup = null;
92abab
+    protected boolean mInternalUserRequired = false;
92abab
+    protected IUGSubsystem mUGS = null;
92abab
+    protected String mAttrs[] = null;
92abab
 
92abab
     /* Holds configuration parameters accepted by this implementation.
92abab
      * This list is passed to the configuration console so configuration
92abab
@@ -82,6 +99,10 @@ public class UserPwdDirAuthentication extends DirBasedAuthentication
92abab
                     "ldap.basedn",
92abab
                     "ldap.attrName",
92abab
                     "ldap.attrDesc",
92abab
+                    "ldap.memberAttrName",
92abab
+                    "ldap.memberAttrValue",
92abab
+                    "ldap.internalUserRequired",
92abab
+                    "ldap.internalGroup",
92abab
                     "ldap.minConns",
92abab
                     "ldap.maxConns",
92abab
             };
92abab
@@ -138,6 +159,36 @@ public class UserPwdDirAuthentication extends DirBasedAuthentication
92abab
         }
92abab
         CMS.debug("UserPwdDirAuthentication init  mAttr=" + mAttr +
92abab
                 "  mAttrName=" + mAttrName + "  mAttrDesc=" + mAttrDesc);
92abab
+
92abab
+        // Optional attribute, which presence and value have to be checked if included in configuration
92abab
+        mMemberAttrName = mLdapConfig.getString("memberAttrName", null);
92abab
+        mMemberAttrName = (mMemberAttrName != null)? mMemberAttrName.trim(): mMemberAttrName; 
92abab
+        if (mMemberAttrName != null && mMemberAttrName.length() > 0) {
92abab
+            mMemberAttrValue = mLdapConfig.getString("memberAttrValue", null);
92abab
+            mMemberAttrValue = (mMemberAttrValue != null)? mMemberAttrValue.trim(): mMemberAttrValue; 
92abab
+            CMS.debug("UserPwdDirAuthentication init  mMemberAttrName=" + mMemberAttrName + "  mMemberAttrValue=" + mMemberAttrValue);
92abab
+        }
92abab
+        // Optional attribute, which indicates local user entry presence that have to be checked if included in configuration
92abab
+        mInternalUserRequired = mLdapConfig.getBoolean("internalUserRequired", false);
92abab
+        CMS.debug("UserPwdDirAuthentication init  mInternalUserRequired=" + mInternalUserRequired);
92abab
+        mInternalGroup = mLdapConfig.getString("internalGroup", null);
92abab
+        mInternalGroup = (mInternalGroup != null)? mInternalGroup.trim(): mInternalGroup;
92abab
+        if (mInternalGroup != null && mInternalGroup.length() > 0) {
92abab
+            mInternalUserRequired = true;
92abab
+            CMS.debug("UserPwdDirAuthentication init  mInternalGroup=" + mInternalGroup);
92abab
+        }
92abab
+        if (mInternalUserRequired) {
92abab
+            mUGS = (IUGSubsystem) CMS.getSubsystem(CMS.SUBSYSTEM_UG);
92abab
+        }
92abab
+
92abab
+        ArrayList<String> attrList = new ArrayList<>();
92abab
+        if (mInternalUserRequired) {
92abab
+            attrList.add(CRED_UID);
92abab
+        }
92abab
+        if (mMemberAttrName != null && mMemberAttrName.length() > 0 && !mMemberAttrName.equalsIgnoreCase(CRED_UID)) {
92abab
+            attrList.add(mMemberAttrName);
92abab
+        }
92abab
+        mAttrs = (String[])attrList.toArray(new String[attrList.size()]);
92abab
     }
92abab
 
92abab
     /**
92abab
@@ -182,6 +233,105 @@ public class UserPwdDirAuthentication extends DirBasedAuthentication
92abab
             // bind as user dn and pwd - authenticates user with pwd.
92abab
             conn.authenticate(userdn, pwd);
92abab
             CMS.debug("Authenticated: userdn=" + userdn);
92abab
+
92abab
+            LDAPEntry entry = null;
92abab
+            Map<String, String[]> entryAttributes = new HashMap<String, String[]>();
92abab
+            if (mAttrs != null && mAttrs.length > 0) {
92abab
+                LDAPSearchResults results = conn.search(userdn, LDAPConnection.SCOPE_BASE, null, mAttrs, false);
92abab
+                if (results != null && results.hasMoreElements()) {
92abab
+                    entry = results.next();
92abab
+                    if (entry != null) {
92abab
+                        CMS.debug("Reviewing entry: " + entry.getDN());
92abab
+                        for (int i = 0; i < mAttrs.length; i++) {
92abab
+                            LDAPAttribute memberAttribute = entry.getAttribute(mAttrs[i]);
92abab
+                            if (memberAttribute != null) {
92abab
+                                String[] values = memberAttribute.getStringValueArray();
92abab
+                                if (values != null && values.length > 0) {
92abab
+                                    entryAttributes.put(mAttrs[i], values);
92abab
+                                }
92abab
+                            }
92abab
+                        }
92abab
+                    }
92abab
+                }
92abab
+            }
92abab
+            if (mAttrs != null && mAttrs.length > 0 && (entry == null || entryAttributes.size() == 0)) {
92abab
+                CMS.debug("Failed to obtain data required for verification.");
92abab
+                throw new EMissingCredential(CMS.getUserMessage("CMS_AUTHENTICATION_INVALID_CREDENTIAL"));
92abab
+            }
92abab
+
92abab
+            if (mMemberAttrName != null && mMemberAttrName.length() > 0) {
92abab
+                CMS.debug("Authenticating: memberAttribute=" + mMemberAttrName);
92abab
+                String[] values = entryAttributes.get(mMemberAttrName);
92abab
+                boolean verified = false;
92abab
+                if (values != null && values.length > 0) {
92abab
+                    if (mMemberAttrValue != null && mMemberAttrValue.length() > 0) {
92abab
+                        for (int i = 0; i < values.length; i++) {
92abab
+                            if (mMemberAttrValue.equalsIgnoreCase(values[i])) {
92abab
+                                verified = true;
92abab
+                            }
92abab
+                        }
92abab
+                    } else {
92abab
+                        verified = true;
92abab
+                    }
92abab
+                }
92abab
+                if (!verified) {
92abab
+                    CMS.debug("Failed to verify memberAttribute");
92abab
+                    throw new EMissingCredential(CMS.getUserMessage("CMS_AUTHENTICATION_INVALID_CREDENTIAL"));
92abab
+                }
92abab
+
92abab
+                if (mInternalUserRequired) {
92abab
+                    values = entryAttributes.get(CRED_UID);
92abab
+                    verified = false;
92abab
+                    if (values != null && values.length > 0) {
92abab
+                        for (int i = 0; i < values.length; i++) {
92abab
+                            IUser user = mUGS.getUser(values[i]);
92abab
+                            if (user != null) {
92abab
+                                if (mInternalGroup != null && mInternalGroup.length() > 0) {
92abab
+                                    if (mUGS.isMemberOf(values[i], mInternalGroup)) {
92abab
+                                        verified = true;
92abab
+                                        CMS.debug("Authenticated: user='" + user.getUserDN() + "' is member of '" + mInternalGroup + "'");
92abab
+                                    }
92abab
+                                } else {
92abab
+                                    verified = true;
92abab
+                                    CMS.debug("Authenticated: user='" + user.getUserDN() + "'");
92abab
+                                }
92abab
+                            }
92abab
+                        }
92abab
+                    }
92abab
+                    if (!verified) {
92abab
+                        CMS.debug("Failed to verify userAttribute");
92abab
+                        throw new EMissingCredential(CMS.getUserMessage("CMS_AUTHENTICATION_INVALID_CREDENTIAL"));
92abab
+                    }
92abab
+                }
92abab
+
92abab
+            } else {
92abab
+                if (mInternalUserRequired) {
92abab
+                    String userAttr = (mAttr.equalsIgnoreCase(CRED_UID))? attr: entryAttributes.get(CRED_UID)[0];
92abab
+                    if (userAttr != null  && userAttr.length() > 0) {
92abab
+                        CMS.debug("Authenticating: InternalUser: '" + CRED_UID + "=" + userAttr + "'");
92abab
+                        IUser user = mUGS.getUser(userAttr);
92abab
+                        if (user != null) {
92abab
+                            if (mInternalGroup != null && mInternalGroup.length() > 0) {
92abab
+                                if (mUGS.isMemberOf(userAttr, mInternalGroup)) {
92abab
+                                    CMS.debug("Authenticated: user='" + user.getUserDN() + "' is member of '" + mInternalGroup + "'");
92abab
+                                } else {
92abab
+                                    CMS.debug("Authenticated: user='" + user.getUserDN() + "' is NOT member of '" + mInternalGroup + "'");
92abab
+                                    throw new EMissingCredential(CMS.getUserMessage("CMS_AUTHENTICATION_INVALID_CREDENTIAL"));
92abab
+                                }
92abab
+                            } else {
92abab
+                                CMS.debug("Authenticated: user='" + user.getUserDN() + "'");
92abab
+                            }
92abab
+                        } else {
92abab
+                            CMS.debug("Missing InternalUser='" + userAttr + "'");
92abab
+                            throw new EMissingCredential(CMS.getUserMessage("CMS_AUTHENTICATION_INVALID_CREDENTIAL"));
92abab
+                        }
92abab
+                    } else {
92abab
+                        CMS.debug("Incorrect attribute requested: '" + mAttr + "' instead of '" + CRED_UID + "'");
92abab
+                        throw new EMissingCredential(CMS.getUserMessage("CMS_AUTHENTICATION_INVALID_CREDENTIAL"));
92abab
+                    }
92abab
+                }
92abab
+            }
92abab
+
92abab
             // set attr in the token.
92abab
             token.set(mAttr, attr);
92abab
 
92abab
-- 
92abab
1.8.3.1
92abab