diff --git a/.github/workflows/cypress.yml b/.github/workflows/cypress.yml index 68125b90c1..36a7ad94d8 100644 --- a/.github/workflows/cypress.yml +++ b/.github/workflows/cypress.yml @@ -107,6 +107,10 @@ jobs: with: name: keycloak + - name: Start LDAP server + run: npm run cy:ldap-server & + working-directory: apps/admin-ui + - name: Start Keycloak Server run: | tar xfvz keycloak-999-SNAPSHOT.tar.gz diff --git a/apps/admin-ui/cypress/e2e/user_fed_ldap_hardcoded_mapper_test.spec.ts b/apps/admin-ui/cypress/e2e/user_fed_ldap_hardcoded_mapper_test.spec.ts index 1b8dceff73..e2c7489150 100644 --- a/apps/admin-ui/cypress/e2e/user_fed_ldap_hardcoded_mapper_test.spec.ts +++ b/apps/admin-ui/cypress/e2e/user_fed_ldap_hardcoded_mapper_test.spec.ts @@ -27,12 +27,12 @@ const ldapName = "ldap-mappers-testing"; const ldapVendor = "Active Directory"; // connection and authentication settings -const connectionUrlValid = "ldap://ldap.forumsys.com:389"; +const connectionUrlValid = "ldap://localhost:3004"; const bindTypeSimple = "simple"; const truststoreSpiOnlyLdaps = "Only for ldaps"; const connectionTimeoutTwoSecs = "2000"; -const bindDnCnDc = "cn=read-only-admin,dc=example,dc=com"; -const bindCredsValid = "password"; +const bindDnCnDc = "cn=user,dc=test"; +const bindCredsValid = "user"; // ldap searching and updating const editModeReadOnly = "READ_ONLY"; diff --git a/apps/admin-ui/cypress/e2e/user_fed_ldap_mapper_test.spec.ts b/apps/admin-ui/cypress/e2e/user_fed_ldap_mapper_test.spec.ts index a6dd1f1eed..c2c4854a47 100644 --- a/apps/admin-ui/cypress/e2e/user_fed_ldap_mapper_test.spec.ts +++ b/apps/admin-ui/cypress/e2e/user_fed_ldap_mapper_test.spec.ts @@ -21,12 +21,12 @@ const ldapName = "ldap-mappers-testing"; const ldapVendor = "Active Directory"; // connection and authentication settings -const connectionUrlValid = "ldap://ldap.forumsys.com:389"; +const connectionUrlValid = "ldap://localhost:3004"; const bindTypeSimple = "simple"; const truststoreSpiOnlyLdaps = "Only for ldaps"; const connectionTimeoutTwoSecs = "2000"; -const bindDnCnDc = "cn=read-only-admin,dc=example,dc=com"; -const bindCredsValid = "password"; +const bindDnCnDc = "cn=user,dc=test"; +const bindCredsValid = "user"; // ldap searching and updating const editModeReadOnly = "READ_ONLY"; diff --git a/apps/admin-ui/cypress/e2e/user_fed_ldap_test.spec.ts b/apps/admin-ui/cypress/e2e/user_fed_ldap_test.spec.ts index 39d6fd8a90..6170d9ac07 100644 --- a/apps/admin-ui/cypress/e2e/user_fed_ldap_test.spec.ts +++ b/apps/admin-ui/cypress/e2e/user_fed_ldap_test.spec.ts @@ -21,12 +21,12 @@ const secondLdapVendor = "Other"; const updatedLdapName = `${firstLdapName}-updated`; // connection and authentication settings -const connectionUrlValid = "ldap://www.zflexldap.com"; +const connectionUrlValid = "ldap://localhost:3004"; const bindTypeSimple = "simple"; const truststoreSpiOnlyLdaps = "Only for ldaps"; const connectionTimeoutTwoSecs = "2000"; -const bindDnCnDc = "cn=ro_admin,ou=sysadmins,dc=zflexsoftware,dc=com"; -const bindCredsValid = "zflexpass"; +const bindDnCnDc = "cn=user,dc=test"; +const bindCredsValid = "user"; const connectionUrlInvalid = "ldap://nowhere.com"; const bindTypeNone = "none"; diff --git a/apps/admin-ui/cypress/fixtures/ldap/server.json b/apps/admin-ui/cypress/fixtures/ldap/server.json new file mode 100644 index 0000000000..8198a5dffa --- /dev/null +++ b/apps/admin-ui/cypress/fixtures/ldap/server.json @@ -0,0 +1,4 @@ +{ + "port": 3004, + "searchBase": "dc=test" +} \ No newline at end of file diff --git a/apps/admin-ui/cypress/fixtures/ldap/users.json b/apps/admin-ui/cypress/fixtures/ldap/users.json new file mode 100644 index 0000000000..a5088e4944 --- /dev/null +++ b/apps/admin-ui/cypress/fixtures/ldap/users.json @@ -0,0 +1,7 @@ +[ + { + "dn": "cn=user,dc=test", + "objectClass": "person", + "cn": "user-login" + } +] \ No newline at end of file diff --git a/apps/admin-ui/package.json b/apps/admin-ui/package.json index acac5597a6..ebd197d5b3 100644 --- a/apps/admin-ui/package.json +++ b/apps/admin-ui/package.json @@ -9,6 +9,7 @@ "cy:open": "cypress open --e2e --browser chrome", "cy:run": "cypress run --browser chrome", "cy:check-types": "tsc --project cypress/tsconfig.json", + "cy:ldap-server": "ldap-server-mock --conf=./cypress/fixtures/ldap/server.json --database=./cypress/fixtures/ldap/users.json", "server:start": "./scripts/start-server.mjs", "server:import-client": "./scripts/import-client.mjs" }, @@ -99,6 +100,7 @@ "gunzip-maybe": "^1.4.2", "http2-proxy": "^5.0.53", "jsdom": "^20.0.1", + "ldap-server-mock": "^5.0.0", "node-fetch": "^3.2.10", "progress-promise": "^0.0.6", "tar-fs": "^2.1.1", diff --git a/package-lock.json b/package-lock.json index 76b55f5cc5..56794e0358 100644 --- a/package-lock.json +++ b/package-lock.json @@ -178,6 +178,7 @@ "gunzip-maybe": "^1.4.2", "http2-proxy": "^5.0.53", "jsdom": "^20.0.1", + "ldap-server-mock": "^5.0.0", "node-fetch": "^3.2.10", "progress-promise": "^0.0.6", "tar-fs": "^2.1.1", @@ -4524,6 +4525,18 @@ "dev": true, "license": "BSD-3-Clause" }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/abstract-logging": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", + "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==", + "dev": true + }, "node_modules/account-ui": { "resolved": "apps/account-ui", "link": true @@ -5031,6 +5044,18 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/backoff": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", + "integrity": "sha512-wC5ihrnUXmR2douXmXLCe5O3zg3GKIyvRi/hi58a/XyRxVI+3/yM0PYueQOZXPXQ9pxBislYkw+sF9b7C/RuMA==", + "dev": true, + "dependencies": { + "precond": "0.2" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "dev": true, @@ -10092,6 +10117,54 @@ "node": "> 0.8" } }, + "node_modules/ldap-filter": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/ldap-filter/-/ldap-filter-0.3.3.tgz", + "integrity": "sha512-/tFkx5WIn4HuO+6w9lsfxq4FN3O+fDZeO9Mek8dCD8rTUpqzRa766BOBO7BcGkn3X86m5+cBm1/2S/Shzz7gMg==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/ldap-server-mock": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ldap-server-mock/-/ldap-server-mock-5.0.0.tgz", + "integrity": "sha512-H1TlHbgyS5OFPPK+5N5foPvuJcg/hNs4B4MZMlK3qAXHgdcjV6UO83K/WCMRIhAB6WBqMn8Y0+hj8xvwB0Ymqg==", + "dev": true, + "dependencies": { + "ldapjs": "^2.3.1", + "nopt": "^5.0.0" + }, + "bin": { + "ldap-server-mock": "server.js" + }, + "engines": { + "node": ">=16.3.0", + "npm": ">=7.15.1" + } + }, + "node_modules/ldapjs": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/ldapjs/-/ldapjs-2.3.3.tgz", + "integrity": "sha512-75QiiLJV/PQqtpH+HGls44dXweviFwQ6SiIK27EqzKQ5jU/7UFrl2E5nLdQ3IYRBzJ/AVFJI66u0MZ0uofKYwg==", + "dev": true, + "dependencies": { + "abstract-logging": "^2.0.0", + "asn1": "^0.2.4", + "assert-plus": "^1.0.0", + "backoff": "^2.5.0", + "ldap-filter": "^0.3.3", + "once": "^1.4.0", + "vasync": "^2.2.0", + "verror": "^1.8.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/levn": { "version": "0.4.1", "dev": true, @@ -10856,6 +10929,21 @@ "dev": true, "license": "MIT" }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "dev": true, @@ -11508,6 +11596,15 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/precond": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", + "integrity": "sha512-QCYG84SgGyGzqJ/vlMsxeXd/pgL/I94ixdNFyh1PusWmTCyVfPJjZ1K1jvHtsbfnXQs2TSkEP2fR7QiMZAnKFQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "dev": true, @@ -14144,6 +14241,18 @@ "version": "1.0.1", "license": "MIT" }, + "node_modules/vasync": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vasync/-/vasync-2.2.1.tgz", + "integrity": "sha512-Hq72JaTpcTFdWiNA4Y22Amej2GH3BFmBaKPPlDZ4/oC8HNn2ISHLkFrJU4Ds8R3jcUi7oo5Y9jcMHKjES+N9wQ==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "verror": "1.10.0" + } + }, "node_modules/verror": { "version": "1.10.0", "dev": true, @@ -17936,6 +18045,18 @@ "version": "2.0.6", "dev": true }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "abstract-logging": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", + "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==", + "dev": true + }, "account-ui": { "version": "file:apps/account-ui", "requires": { @@ -18062,6 +18183,7 @@ "i18next-http-backend": "^1.4.4", "jsdom": "^20.0.1", "keycloak-js": "999.0.0-dev", + "ldap-server-mock": "^5.0.0", "lodash-es": "^4.17.21", "node-fetch": "^3.2.10", "progress-promise": "^0.0.6", @@ -18387,6 +18509,15 @@ "@babel/helper-define-polyfill-provider": "^0.3.3" } }, + "backoff": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", + "integrity": "sha512-wC5ihrnUXmR2douXmXLCe5O3zg3GKIyvRi/hi58a/XyRxVI+3/yM0PYueQOZXPXQ9pxBislYkw+sF9b7C/RuMA==", + "dev": true, + "requires": { + "precond": "0.2" + } + }, "balanced-match": { "version": "1.0.2", "dev": true @@ -21650,6 +21781,41 @@ "version": "1.6.0", "dev": true }, + "ldap-filter": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/ldap-filter/-/ldap-filter-0.3.3.tgz", + "integrity": "sha512-/tFkx5WIn4HuO+6w9lsfxq4FN3O+fDZeO9Mek8dCD8rTUpqzRa766BOBO7BcGkn3X86m5+cBm1/2S/Shzz7gMg==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "ldap-server-mock": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ldap-server-mock/-/ldap-server-mock-5.0.0.tgz", + "integrity": "sha512-H1TlHbgyS5OFPPK+5N5foPvuJcg/hNs4B4MZMlK3qAXHgdcjV6UO83K/WCMRIhAB6WBqMn8Y0+hj8xvwB0Ymqg==", + "dev": true, + "requires": { + "ldapjs": "^2.3.1", + "nopt": "^5.0.0" + } + }, + "ldapjs": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/ldapjs/-/ldapjs-2.3.3.tgz", + "integrity": "sha512-75QiiLJV/PQqtpH+HGls44dXweviFwQ6SiIK27EqzKQ5jU/7UFrl2E5nLdQ3IYRBzJ/AVFJI66u0MZ0uofKYwg==", + "dev": true, + "requires": { + "abstract-logging": "^2.0.0", + "asn1": "^0.2.4", + "assert-plus": "^1.0.0", + "backoff": "^2.5.0", + "ldap-filter": "^0.3.3", + "once": "^1.4.0", + "vasync": "^2.2.0", + "verror": "^1.8.1" + } + }, "levn": { "version": "0.4.1", "dev": true, @@ -22171,6 +22337,15 @@ "version": "2.0.6", "dev": true }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, "normalize-path": { "version": "3.0.0", "dev": true @@ -22574,6 +22749,12 @@ "source-map-js": "^1.0.2" } }, + "precond": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", + "integrity": "sha512-QCYG84SgGyGzqJ/vlMsxeXd/pgL/I94ixdNFyh1PusWmTCyVfPJjZ1K1jvHtsbfnXQs2TSkEP2fR7QiMZAnKFQ==", + "dev": true + }, "prelude-ls": { "version": "1.2.1", "dev": true @@ -24325,6 +24506,15 @@ "value-equal": { "version": "1.0.1" }, + "vasync": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vasync/-/vasync-2.2.1.tgz", + "integrity": "sha512-Hq72JaTpcTFdWiNA4Y22Amej2GH3BFmBaKPPlDZ4/oC8HNn2ISHLkFrJU4Ds8R3jcUi7oo5Y9jcMHKjES+N9wQ==", + "dev": true, + "requires": { + "verror": "1.10.0" + } + }, "verror": { "version": "1.10.0", "dev": true,