From 801861fe3487dd0ba6f40673a0d9003b809d871f Mon Sep 17 00:00:00 2001 From: lauri457 <55710064+lauri457@users.noreply.github.com> Date: Wed, 8 Oct 2025 16:41:29 +1100 Subject: [PATCH 1/6] Create LDAPquery.js --- .../Query ldap server/LDAPquery.js | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 Server-Side Components/Script Includes/Query ldap server/LDAPquery.js diff --git a/Server-Side Components/Script Includes/Query ldap server/LDAPquery.js b/Server-Side Components/Script Includes/Query ldap server/LDAPquery.js new file mode 100644 index 0000000000..8b964ca03e --- /dev/null +++ b/Server-Side Components/Script Includes/Query ldap server/LDAPquery.js @@ -0,0 +1,56 @@ +var LDAPquery = Class.create(); +LDAPquery.prototype = { + initialize: function () { + this.LDAP_CONFIG = ''; + this.RDN = ''; + this.FILTER = ''; + this.BOOLEAN = true; + this.ROWS_PAGE = 1; + this.GLIDE_LDAP = new GlideLDAP(); + }, + + setRDN: function (rdn) { + this.RDN = rdn || ''; + return this; + }, + + setFilter: function (filter) { + this.FILTER = filter || ''; + return this; + }, + + setPagination: function (rows) { + this.ROWS_PAGE = rows || 1; + return this; + }, + + setConfig: function (config) { + this.LDAP_CONFIG = config || ''; + this.GLIDE_LDAP.setConfigID(config) + return this; + }, + + getOne: function () { + if (!this.LDAP_CONFIG) { + NiceError.raise('no ldap config defined'); + } + var entry; + + if (entry = this._query().next()) { + return j2js(entry); + } + return null; + }, + + getIterable: function () { + if (!this.LDAP_CONFIG) { + NiceError.raise('no ldap config defined'); + } + return this._query(); + }, + + _query: function () { + return this.GLIDE_LDAP.getMatching(this.RDN, this.FILTER, this.BOOLEAN, this.ROWS_PAGE); + }, + type: 'LDAPquery' +}; From a1f0f02feb644ccc25d0ca397b4a2076b5d34788 Mon Sep 17 00:00:00 2001 From: lauri457 <55710064+lauri457@users.noreply.github.com> Date: Wed, 8 Oct 2025 16:52:11 +1100 Subject: [PATCH 2/6] Create README.md --- .../Query ldap server/README.md | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 Server-Side Components/Script Includes/Query ldap server/README.md diff --git a/Server-Side Components/Script Includes/Query ldap server/README.md b/Server-Side Components/Script Includes/Query ldap server/README.md new file mode 100644 index 0000000000..4ff0327676 --- /dev/null +++ b/Server-Side Components/Script Includes/Query ldap server/README.md @@ -0,0 +1,55 @@ +# Query ldap server by config sys_id + +# How to use it? +Configure LDAP server in *ldap_server_config* table +Query server from serverside script using script include LDAPQuery + +# Example 1: get one entry + +``` +var result = new LDAPquery() + .setRDN('') //set relative start + .setFilter('uid=einstein') //set filter + .setConfig('2fd003c083e07e10557ff0d6feaad3d7') //set the sys_id for ldap_server_config record + .getOne(); //returns first entry as js object +gs.info(result.telephoneNumber); + +output: +*** Script: 314-159-2653 + +``` + +# Example 2: get the iterable for query + +``` +var result = new LDAPquery() + .setRDN('ou=scientists') + .setPagination(1000) //set how many records per page + .setConfig('2fd003c083e07e10557ff0d6feaad3d7') + .getIterable(); //returns iterable result object + +var item; +while (item = result.next()) { + gs.info(JSON.stringify(j2js(item), null, 2)); //note that next returns a java object, hence the j2js to convert to js +} + +output: +*** Script: { + "dn": "ou=scientists,dc=example,dc=com", + "objectClass": "groupOfUniqueNames^top", + "ou": "scientists", + "source": "ldap:ou=scientists,dc=example,dc=com", + "uniqueMember": "uid=einstein,dc=example,dc=com^uid=tesla,dc=example,dc=com^uid=newton,dc=example,dc=com^uid=galileo,dc=example,dc=com", + "cn": "Scientists" +} +*** Script: { + "dn": "ou=italians,ou=scientists,dc=example,dc=com", + "objectClass": "groupOfUniqueNames^top", + "ou": "italians", + "source": "ldap:ou=italians,ou=scientists,dc=example,dc=com", + "uniqueMember": "uid=tesla,dc=example,dc=com", + "cn": "Italians" +} +LDAP SEARCH: >>Next Page + +``` From 9c8590e1578daa696933cc4eb7d5679288100712 Mon Sep 17 00:00:00 2001 From: lauri457 <55710064+lauri457@users.noreply.github.com> Date: Wed, 8 Oct 2025 16:54:52 +1100 Subject: [PATCH 3/6] Update README.md --- .../Script Includes/Query ldap server/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Server-Side Components/Script Includes/Query ldap server/README.md b/Server-Side Components/Script Includes/Query ldap server/README.md index 4ff0327676..a17998b6f7 100644 --- a/Server-Side Components/Script Includes/Query ldap server/README.md +++ b/Server-Side Components/Script Includes/Query ldap server/README.md @@ -6,7 +6,7 @@ Query server from serverside script using script include LDAPQuery # Example 1: get one entry -``` +```javascript var result = new LDAPquery() .setRDN('') //set relative start .setFilter('uid=einstein') //set filter @@ -21,7 +21,7 @@ output: # Example 2: get the iterable for query -``` +```javascript var result = new LDAPquery() .setRDN('ou=scientists') .setPagination(1000) //set how many records per page From 1e1d9b9b4731fcaddd393807f3332a70a3277ce0 Mon Sep 17 00:00:00 2001 From: lauri457 <55710064+lauri457@users.noreply.github.com> Date: Wed, 8 Oct 2025 16:56:11 +1100 Subject: [PATCH 4/6] Update README.md --- .../Script Includes/Query ldap server/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Server-Side Components/Script Includes/Query ldap server/README.md b/Server-Side Components/Script Includes/Query ldap server/README.md index a17998b6f7..8af5bbdb80 100644 --- a/Server-Side Components/Script Includes/Query ldap server/README.md +++ b/Server-Side Components/Script Includes/Query ldap server/README.md @@ -13,10 +13,10 @@ var result = new LDAPquery() .setConfig('2fd003c083e07e10557ff0d6feaad3d7') //set the sys_id for ldap_server_config record .getOne(); //returns first entry as js object gs.info(result.telephoneNumber); - +``` +``` output: *** Script: 314-159-2653 - ``` # Example 2: get the iterable for query @@ -32,7 +32,8 @@ var item; while (item = result.next()) { gs.info(JSON.stringify(j2js(item), null, 2)); //note that next returns a java object, hence the j2js to convert to js } - +``` +``` output: *** Script: { "dn": "ou=scientists,dc=example,dc=com", @@ -51,5 +52,4 @@ output: "cn": "Italians" } LDAP SEARCH: >>Next Page - ``` From 83a21840fe1665b04afcdf3e3351eaaf28c9e1c4 Mon Sep 17 00:00:00 2001 From: lauri457 <55710064+lauri457@users.noreply.github.com> Date: Thu, 9 Oct 2025 11:56:38 +1100 Subject: [PATCH 5/6] Update LDAPquery.js --- .../Query ldap server/LDAPquery.js | 106 +++++++++++++++--- 1 file changed, 91 insertions(+), 15 deletions(-) diff --git a/Server-Side Components/Script Includes/Query ldap server/LDAPquery.js b/Server-Side Components/Script Includes/Query ldap server/LDAPquery.js index 8b964ca03e..9a60b50d6f 100644 --- a/Server-Side Components/Script Includes/Query ldap server/LDAPquery.js +++ b/Server-Side Components/Script Includes/Query ldap server/LDAPquery.js @@ -1,56 +1,132 @@ +/** + * LDAPquery class provides a fluent interface for querying LDAP entries. + * It wraps GlideLDAP and allows configuration of RDN, filters, pagination, and server config. + * @class + * + * @example + * Example 1: Retrieve a single LDAP record + * var result = new LDAPquery() + * .setRDN('') + * .setFilter('uid=einstein') + * .setConfig('2fd003c083e07e10557ff0d6feaad3d7') + * .getOne(); + * gs.info(result.telephoneNumber); + * + * @example + * Example 2: Retrieve multiple LDAP records with pagination + * var result = new LDAPquery() + * .setRDN('ou=scientists') + * .setPagination(1000) + * .setConfig('2fd003c083e07e10557ff0d6feaad3d7') + * .getIterable(); + * + * var item; + * while (item = result.next()) { + * gs.info(JSON.stringify(j2js(item), null, 2)); + * } + */ var LDAPquery = Class.create(); + +/** + * @typedef {Object} LDAPquery + * @property {string} ldapConfig - The sys_id of the LDAP server config. + * @property {string} rdn - The relative distinguished name to start the query from. + * @property {string} filter - LDAP filter string. + * @property {boolean} boolean - Boolean flag used in query logic. + * @property {number} rowsPerPage - Number of rows to return per page. + * @property {GlideLDAP} glideLdap - GlideLDAP instance used to perform queries. + */ LDAPquery.prototype = { + /** + * Initializes the LDAPquery instance with default values. + */ initialize: function () { - this.LDAP_CONFIG = ''; - this.RDN = ''; - this.FILTER = ''; - this.BOOLEAN = true; - this.ROWS_PAGE = 1; - this.GLIDE_LDAP = new GlideLDAP(); + this.ldapConfig = ''; + this.rdn = ''; + this.filter = ''; + this.boolean = true; + this.rowsPerPage = 1; + this.glideLdap = new GlideLDAP(); }, + /** + * Sets the relative distinguished name (RDN) for the query. + * @param {string} rdn - The RDN string. + * @returns {LDAPquery} Returns the current instance for chaining. + */ setRDN: function (rdn) { - this.RDN = rdn || ''; + this.rdn = rdn || ''; return this; }, + /** + * Sets the LDAP filter string. + * @param {string} filter - The LDAP filter. + * @returns {LDAPquery} Returns the current instance for chaining. + */ setFilter: function (filter) { - this.FILTER = filter || ''; + this.filter = filter || ''; return this; }, + /** + * Sets the number of rows to return per page. + * @param {number} rows - Number of rows. + * @returns {LDAPquery} Returns the current instance for chaining. + */ setPagination: function (rows) { - this.ROWS_PAGE = rows || 1; + this.rowsPerPage = rows || 1; return this; }, + /** + * Sets the LDAP server configuration using its sys_id. + * Also sets the config on the GlideLDAP instance. + * @param {string} config - The sys_id of the LDAP server config. + * @returns {LDAPquery} Returns the current instance for chaining. + */ setConfig: function (config) { - this.LDAP_CONFIG = config || ''; - this.GLIDE_LDAP.setConfigID(config) + this.ldapConfig = config || ''; + this.glideLdap.setConfigID(config); return this; }, + /** + * Executes the query and returns the first matching LDAP entry. + * @returns {Object|null} Returns the first matching entry as a JavaScript object, or null if none found. + * @throws Will raise an error if ldapConfig is not set. + */ getOne: function () { - if (!this.LDAP_CONFIG) { + if (!this.ldapConfig) { NiceError.raise('no ldap config defined'); } var entry; - if (entry = this._query().next()) { return j2js(entry); } return null; }, + /** + * Executes the query and returns an iterable result set. + * @returns Returns a iterator over matching LDAP entries. + * @throws Will raise an error if ldapConfig is not set. + */ getIterable: function () { - if (!this.LDAP_CONFIG) { + if (!this.ldapConfig) { NiceError.raise('no ldap config defined'); } return this._query(); }, + /** + * Internal method to perform the LDAP query using GlideLDAP. + * @private + * @returns Returns the result iterator. + */ _query: function () { - return this.GLIDE_LDAP.getMatching(this.RDN, this.FILTER, this.BOOLEAN, this.ROWS_PAGE); + return this.glideLdap.getMatching(this.rdn, this.filter, this.boolean, this.rowsPerPage); }, + type: 'LDAPquery' }; From 6f4c33f2ef48fcd5f1147c086ebddf6ab0e6dd72 Mon Sep 17 00:00:00 2001 From: lauri457 <55710064+lauri457@users.noreply.github.com> Date: Thu, 9 Oct 2025 12:02:34 +1100 Subject: [PATCH 6/6] Update README.md --- .../Script Includes/Query ldap server/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Server-Side Components/Script Includes/Query ldap server/README.md b/Server-Side Components/Script Includes/Query ldap server/README.md index 8af5bbdb80..387fdf79e4 100644 --- a/Server-Side Components/Script Includes/Query ldap server/README.md +++ b/Server-Side Components/Script Includes/Query ldap server/README.md @@ -1,4 +1,5 @@ # Query ldap server by config sys_id +Interact with GlideLDAP using a fluent wrapper. Handy for querying ldap server for non-persistent data for example via remote tables. # How to use it? Configure LDAP server in *ldap_server_config* table