openapi: 3.2.0 info: title: Jans Config Custom Scripts API contact: name: Contact url: https://github.com/JanssenProject/jans/discussions license: name: License url: https://github.com/JanssenProject/jans/blob/main/LICENSE version: OAS Version servers: - url: https://jans.local.io description: The Jans server tags: - name: Custom Scripts paths: /api/v1/config/scripts: get: tags: - Custom Scripts summary: Gets a list of custom scripts operationId: get-config-scripts parameters: - name: limit in: query description: Search size - max size of the results to return schema: type: integer format: int32 default: 50 - name: pattern in: query description: Search pattern schema: type: string default: '' - name: startIndex in: query description: The 1-based index of the first query result schema: type: integer format: int32 default: 0 - name: sortBy in: query description: Attribute whose value will be used to order the returned response schema: type: string default: inum - name: sortOrder in: query description: Order in which the sortBy param is applied. Allowed values are "ascending" and "descending" schema: type: string default: ascending - name: fieldValuePair in: query description: Field and value pair for seraching schema: type: string default: '' examples: Field value example: description: Field value example value: adminCanEdit=true,dataType=string responses: '200': description: Ok content: application/json: schema: $ref: '#/components/schemas/PagedResult' examples: Response json example: description: Response json example value: "{\n \"start\": 0,\n \"totalEntriesCount\": 37,\n \"entriesCount\": 2,\n \"entries\": [\n {\n \"dn\": \"inum=0300-BA90,ou=scripts,o=jans\",\n \"inum\": \"0300-BA90\",\n \"name\": \"discovery_java_params\",\n \"description\": \"Java Custom Sample Script\",\n \"script\": \"/* Copyright (c) 2022, Gluu\\n Author: Yuriy Z\\n */\\n\\nimport io.jans.model.SimpleCustomProperty;\\nimport io.jans.model.custom.script.model.CustomScript;\\nimport io.jans.model.custom.script.type.discovery.DiscoveryType;\\nimport io.jans.service.custom.script.CustomScriptManager;\\nimport org.slf4j.Logger;\\nimport org.slf4j.LoggerFactory;\\nimport org.json.JSONObject;\\n\\nimport java.util.Map;\\n\\npublic class Discovery implements DiscoveryType {\\n\\n private static final Logger log = LoggerFactory.getLogger(Discovery.class);\\n private static final Logger scriptLogger = LoggerFactory.getLogger(CustomScriptManager.class);\\n\\n @Override\\n public boolean init(Map configurationAttributes) {\\n log.info(\\\"Init of Discovery Java custom script\\\");\\n return true;\\n }\\n\\n @Override\\n public boolean init(CustomScript customScript, Map configurationAttributes) {\\n log.info(\\\"Init of Discovery Java custom script\\\");\\n return true;\\n }\\n\\n @Override\\n public boolean destroy(Map configurationAttributes) {\\n log.info(\\\"Destroy of Discovery Java custom script\\\");\\n return true;\\n }\\n\\n @Override\\n public int getApiVersion() {\\n log.info(\\\"getApiVersion Discovery Java custom script: 11\\\");\\n return 11;\\n }\\n\\n @Override\\n public boolean modifyResponse(Object responseAsJsonObject, Object context) {\\n scriptLogger.info(\\\"write to script logger\\\");\\n JSONObject response = (JSONObject) responseAsJsonObject;\\n response.accumulate(\\\"key_from_java\\\", \\\"value_from_script_on_java\\\");\\n return true;\\n }\\n}\\n\",\n \"scriptType\": \"discovery\",\n \"programmingLanguage\": \"java\",\n \"moduleProperties\": [\n {\n \"value1\": \"location_type\",\n \"value2\": \"db\"\n }\n ],\n \"level\": 1,\n \"revision\": 11,\n \"enabled\": true,\n \"modified\": false,\n \"internal\": false,\n \"locationType\": \"db\",\n \"baseDn\": \"inum=0300-BA90,ou=scripts,o=jans\"\n },\n {\n \"dn\": \"inum=031C-4A65,ou=scripts,o=jans\",\n \"inum\": \"031C-4A65\",\n \"name\": \"id_generator\",\n \"description\": \"Sample Id Generator script\",\n \"script\": \"# oxAuth is available under the MIT License (2008). See http://opensource.org/licenses/MIT for full text.\\n# Copyright (c) 2016, Janssen\\n#\\n# Author: Yuriy Movchan\\n#\\n\\nfrom io.jans.model.custom.script.type.id import IdGeneratorType\\nfrom io.jans.util import StringHelper, ArrayHelper\\nfrom java.util import Arrays, ArrayList\\n\\nimport java\\n\\nclass IdGenerator(IdGeneratorType):\\n def __init__(self, currentTimeMillis):\\n self.currentTimeMillis = currentTimeMillis\\n\\n def init(self, customScript, configurationAttributes):\\n print \\\"Id generator. Initialization\\\"\\n print \\\"Id generator. Initialized successfully\\\"\\n\\n return True \\n\\n def destroy(self, configurationAttributes):\\n print \\\"Id generator. Destroy\\\"\\n print \\\"Id generator. Destroyed successfully\\\"\\n return True \\n\\n def getApiVersion(self):\\n return 11\\n\\n # Id generator init method\\n # appId is application Id\\n # idType is Id Type\\n # idPrefix is Id Prefix\\n # user is io.jans.oxtrust.model.JanssenCustomPerson\\n # configurationAttributes is java.util.Map\\n def generateId(self, appId, idType, idPrefix, configurationAttributes):\\n print \\\"Id generator. Generate Id\\\"\\n print \\\"Id generator. Generate Id. AppId: '\\\", appId, \\\"', IdType: '\\\", idType, \\\"', IdPrefix: '\\\", idPrefix, \\\"'\\\"\\n\\n # Return None or empty string to trigger default Id generation method\\n return None\\n\",\n \"scriptType\": \"id_generator\",\n \"programmingLanguage\": \"python\",\n \"moduleProperties\": [\n {\n \"value1\": \"location_type\",\n \"value2\": \"db\"\n }\n ],\n \"level\": 100,\n \"revision\": 1,\n \"enabled\": false,\n \"modified\": false,\n \"internal\": false,\n \"locationType\": \"db\",\n \"baseDn\": \"inum=031C-4A65,ou=scripts,o=jans\"\n }\n ]\n}\n" '401': description: Unauthorized '500': description: InternalServerError security: - oauth2: - https://jans.io/oauth/config/scripts.readonly - oauth2: - https://jans.io/oauth/config/scripts.write - oauth2: - https://jans.io/oauth/config/scripts.admin - oauth2: - https://jans.io/oauth/config/read-all - oauth2: - https://jans.io/oauth/config/write-all put: tags: - Custom Scripts summary: Updates a custom script operationId: put-config-scripts requestBody: description: CustomScript object content: application/json: schema: $ref: '#/components/schemas/CustomScript' examples: Request json example: description: Request json example value: "{\n \"name\": \"test_application_session_test\",\n \"description\": \"Sample Application Session script\",\n \"script\": \"# oxAuth is available under the MIT License (2008). See http://opensource.org/licenses/MIT for full text.\\n# Copyright (c) 2016, Janssen\\n#\\n# Author: Yuriy Movchan\\n#\\n\\nfrom io.jans.model.custom.script.type.session import ApplicationSessionType\\nfrom io.jans.service.cdi.util import CdiUtil\\nfrom io.jans.persist import PersistenceEntryManager\\nfrom io.jans.as.model.config import StaticConfiguration\\nfrom io.jans.as.model.ldap import TokenEntity\\nfrom jakarta.faces.application import FacesMessage\\nfrom io.jans.jsf2.message import FacesMessages\\nfrom io.jans.util import StringHelper, ArrayHelper\\nfrom io.jans.as.model.config import Constants\\nfrom java.util import Arrays, ArrayList\\nfrom io.jans.as.service.external.session import SessionEventType\\n\\nimport java\\n\\nclass ApplicationSession(ApplicationSessionType):\\n def __init__(self, currentTimeMillis):\\n self.currentTimeMillis = currentTimeMillis\\n\\n def init(self, customScript, configurationAttributes):\\n print \\\"Application session. Initialization\\\"\\n\\n self.entryManager = CdiUtil.bean(PersistenceEntryManager)\\n self.staticConfiguration = CdiUtil.bean(StaticConfiguration)\\n\\n print \\\"Application session. Initialized successfully\\\"\\n\\n return True \\n\\n def destroy(self, configurationAttributes):\\n print \\\"Application session. Destroy\\\"\\n print \\\"Application session. Destroyed successfully\\\"\\n return True \\n\\n def getApiVersion(self):\\n return 11\\n\\n # Called each time specific session event occurs\\n # event is io.jans.as.service.external.session.SessionEvent\\n def onEvent(self, event):\\n if event.getType() == SessionEventType.AUTHENTICATED:\\n print \\\"Session is authenticated, session: \\\" + event.getSessionId().getId()\\n return\\n\\n # Application calls it at start session request to allow notify 3rd part systems\\n # httpRequest is jakarta.servlet.http.HttpServletRequest\\n # sessionId is io.jans.as.model.common.SessionId\\n # configurationAttributes is java.util.Map\\n def startSession(self, httpRequest, sessionId, configurationAttributes):\\n print \\\"Application session. Starting external session\\\"\\n\\n user_name = sessionId.getSessionAttributes().get(Constants.AUTHENTICATED_USER)\\n\\n first_session = self.isFirstSession(user_name)\\n if not first_session:\\n facesMessages = CdiUtil.bean(FacesMessages)\\n facesMessages.add(FacesMessage.SEVERITY_ERROR, \\\"Please, end active session first!\\\")\\n return False\\n\\n print \\\"Application session. External session started successfully\\\"\\n return True\\n\\n # Application calls it at end session request to allow notify 3rd part systems\\n # httpRequest is jakarta.servlet.http.HttpServletRequest\\n # sessionId is io.jans.as.model.common.SessionId\\n # configurationAttributes is java.util.Map\\n def endSession(self, httpRequest, sessionId, configurationAttributes):\\n print \\\"Application session. Starting external session end\\\"\\n\\n print \\\"Application session. External session ended successfully\\\"\\n return True\\n\\n # Application calls it during /session/active endpoint call to modify response if needed\\n # jsonArray is org.json.JSONArray\\n # context is io.jans.as.server.model.common.ExecutionContext\\n def modifyActiveSessionsResponse(self, jsonArray, context):\\n return False\\n\\n def isFirstSession(self, user_name):\\n tokenLdap = TokenEntity()\\n tokenLdap.setDn(self.staticConfiguration.getBaseDn().getClients())\\n tokenLdap.setUserId(user_name)\\n\\n tokenLdapList = self.entryManager.findEntries(tokenLdap, 1)\\n print \\\"Application session. isFirstSession. Get result: '%s'\\\" % tokenLdapList\\n\\n if (tokenLdapList != None) and (tokenLdapList.size() > 0):\\n print \\\"Application session. isFirstSession: False\\\"\\n return False\\n\\n print \\\"Application session. isFirstSession: True\\\"\\n return True\\n\",\n \"scriptType\": \"application_session\",\n \"programmingLanguage\": \"python\",\n \"moduleProperties\": [\n {\n \"value1\": \"location_type\",\n \"value2\": \"db\"\n }\n ],\n \"level\": 800,\n \"revision\": 8,\n \"enabled\": false,\n \"modified\": false,\n \"internal\": false,\n \"locationType\": \"db\"\n }\n" responses: '200': description: Ok content: application/json: schema: $ref: '#/components/schemas/CustomScript' examples: Response json example: description: Response json example value: "{\n \"dn\": \"inum=4144edf6-af99-451d-be29-f3eb5c0e9143,ou=scripts,o=jans\",\n \"inum\": \"4144edf6-af99-451d-be29-f3eb5c0e9143\",\n \"name\": \"test_application_session_test\",\n \"description\": \"Sample Application Session script\",\n \"script\": \"# oxAuth is available under the MIT License (2008). See http://opensource.org/licenses/MIT for full text.\\n# Copyright (c) 2016, Janssen\\n#\\n# Author: Yuriy Movchan\\n#\\n\\nfrom io.jans.model.custom.script.type.session import ApplicationSessionType\\nfrom io.jans.service.cdi.util import CdiUtil\\nfrom io.jans.persist import PersistenceEntryManager\\nfrom io.jans.as.model.config import StaticConfiguration\\nfrom io.jans.as.model.ldap import TokenEntity\\nfrom jakarta.faces.application import FacesMessage\\nfrom io.jans.jsf2.message import FacesMessages\\nfrom io.jans.util import StringHelper, ArrayHelper\\nfrom io.jans.as.model.config import Constants\\nfrom java.util import Arrays, ArrayList\\nfrom io.jans.as.service.external.session import SessionEventType\\n\\nimport java\\n\\nclass ApplicationSession(ApplicationSessionType):\\n def __init__(self, currentTimeMillis):\\n self.currentTimeMillis = currentTimeMillis\\n\\n def init(self, customScript, configurationAttributes):\\n print \\\"Application session. Initialization\\\"\\n\\n self.entryManager = CdiUtil.bean(PersistenceEntryManager)\\n self.staticConfiguration = CdiUtil.bean(StaticConfiguration)\\n\\n print \\\"Application session. Initialized successfully\\\"\\n\\n return True \\n\\n def destroy(self, configurationAttributes):\\n print \\\"Application session. Destroy\\\"\\n print \\\"Application session. Destroyed successfully\\\"\\n return True \\n\\n def getApiVersion(self):\\n return 11\\n\\n # Called each time specific session event occurs\\n # event is io.jans.as.service.external.session.SessionEvent\\n def onEvent(self, event):\\n if event.getType() == SessionEventType.AUTHENTICATED:\\n print \\\"Session is authenticated, session: \\\" + event.getSessionId().getId()\\n return\\n\\n # Application calls it at start session request to allow notify 3rd part systems\\n # httpRequest is jakarta.servlet.http.HttpServletRequest\\n # sessionId is io.jans.as.model.common.SessionId\\n # configurationAttributes is java.util.Map\\n def startSession(self, httpRequest, sessionId, configurationAttributes):\\n print \\\"Application session. Starting external session\\\"\\n\\n user_name = sessionId.getSessionAttributes().get(Constants.AUTHENTICATED_USER)\\n\\n first_session = self.isFirstSession(user_name)\\n if not first_session:\\n facesMessages = CdiUtil.bean(FacesMessages)\\n facesMessages.add(FacesMessage.SEVERITY_ERROR, \\\"Please, end active session first!\\\")\\n return False\\n\\n print \\\"Application session. External session started successfully\\\"\\n return True\\n\\n # Application calls it at end session request to allow notify 3rd part systems\\n # httpRequest is jakarta.servlet.http.HttpServletRequest\\n # sessionId is io.jans.as.model.common.SessionId\\n # configurationAttributes is java.util.Map\\n def endSession(self, httpRequest, sessionId, configurationAttributes):\\n print \\\"Application session. Starting external session end\\\"\\n\\n print \\\"Application session. External session ended successfully\\\"\\n return True\\n\\n # Application calls it during /session/active endpoint call to modify response if needed\\n # jsonArray is org.json.JSONArray\\n # context is io.jans.as.server.model.common.ExecutionContext\\n def modifyActiveSessionsResponse(self, jsonArray, context):\\n return False\\n\\n def isFirstSession(self, user_name):\\n tokenLdap = TokenEntity()\\n tokenLdap.setDn(self.staticConfiguration.getBaseDn().getClients())\\n tokenLdap.setUserId(user_name)\\n\\n tokenLdapList = self.entryManager.findEntries(tokenLdap, 1)\\n print \\\"Application session. isFirstSession. Get result: '%s'\\\" % tokenLdapList\\n\\n if (tokenLdapList != None) and (tokenLdapList.size() > 0):\\n print \\\"Application session. isFirstSession: False\\\"\\n return False\\n\\n print \\\"Application session. isFirstSession: True\\\"\\n return True\\n\",\n \"scriptType\": \"application_session\",\n \"programmingLanguage\": \"python\",\n \"moduleProperties\": [\n {\n \"value1\": \"location_type\",\n \"value2\": \"db\"\n }\n ],\n \"level\": 800,\n \"revision\": 8,\n \"enabled\": false,\n \"modified\": false,\n \"internal\": false,\n \"locationType\": \"db\",\n \"baseDn\": \"inum=4144edf6-af99-451d-be29-f3eb5c0e9143,ou=scripts,o=jans\"\n}\n" '401': description: Unauthorized '404': description: Not Found '500': description: InternalServerError security: - oauth2: - https://jans.io/oauth/config/scripts.write - oauth2: - https://jans.io/oauth/config/scripts.admin - oauth2: - https://jans.io/oauth/config/write-all post: tags: - Custom Scripts summary: Adds a new custom script operationId: post-config-scripts parameters: - name: addScriptTemplate in: query description: Boolean flag to indicate if script template is to be added. If CustomScript request object has script populated then script template will not be added. schema: type: boolean default: false requestBody: description: CustomScript object content: application/json: schema: $ref: '#/components/schemas/CustomScript' examples: Request json example: description: Request json example value: "{\n \"name\": \"test_application_session_test\",\n \"description\": \"Sample Application Session script\",\n \"script\": \"# oxAuth is available under the MIT License (2008). See http://opensource.org/licenses/MIT for full text.\\n# Copyright (c) 2016, Janssen\\n#\\n# Author: Yuriy Movchan\\n#\\n\\nfrom io.jans.model.custom.script.type.session import ApplicationSessionType\\nfrom io.jans.service.cdi.util import CdiUtil\\nfrom io.jans.persist import PersistenceEntryManager\\nfrom io.jans.as.model.config import StaticConfiguration\\nfrom io.jans.as.model.ldap import TokenEntity\\nfrom jakarta.faces.application import FacesMessage\\nfrom io.jans.jsf2.message import FacesMessages\\nfrom io.jans.util import StringHelper, ArrayHelper\\nfrom io.jans.as.model.config import Constants\\nfrom java.util import Arrays, ArrayList\\nfrom io.jans.as.service.external.session import SessionEventType\\n\\nimport java\\n\\nclass ApplicationSession(ApplicationSessionType):\\n def __init__(self, currentTimeMillis):\\n self.currentTimeMillis = currentTimeMillis\\n\\n def init(self, customScript, configurationAttributes):\\n print \\\"Application session. Initialization\\\"\\n\\n self.entryManager = CdiUtil.bean(PersistenceEntryManager)\\n self.staticConfiguration = CdiUtil.bean(StaticConfiguration)\\n\\n print \\\"Application session. Initialized successfully\\\"\\n\\n return True \\n\\n def destroy(self, configurationAttributes):\\n print \\\"Application session. Destroy\\\"\\n print \\\"Application session. Destroyed successfully\\\"\\n return True \\n\\n def getApiVersion(self):\\n return 11\\n\\n # Called each time specific session event occurs\\n # event is io.jans.as.service.external.session.SessionEvent\\n def onEvent(self, event):\\n if event.getType() == SessionEventType.AUTHENTICATED:\\n print \\\"Session is authenticated, session: \\\" + event.getSessionId().getId()\\n return\\n\\n # Application calls it at start session request to allow notify 3rd part systems\\n # httpRequest is jakarta.servlet.http.HttpServletRequest\\n # sessionId is io.jans.as.model.common.SessionId\\n # configurationAttributes is java.util.Map\\n def startSession(self, httpRequest, sessionId, configurationAttributes):\\n print \\\"Application session. Starting external session\\\"\\n\\n user_name = sessionId.getSessionAttributes().get(Constants.AUTHENTICATED_USER)\\n\\n first_session = self.isFirstSession(user_name)\\n if not first_session:\\n facesMessages = CdiUtil.bean(FacesMessages)\\n facesMessages.add(FacesMessage.SEVERITY_ERROR, \\\"Please, end active session first!\\\")\\n return False\\n\\n print \\\"Application session. External session started successfully\\\"\\n return True\\n\\n # Application calls it at end session request to allow notify 3rd part systems\\n # httpRequest is jakarta.servlet.http.HttpServletRequest\\n # sessionId is io.jans.as.model.common.SessionId\\n # configurationAttributes is java.util.Map\\n def endSession(self, httpRequest, sessionId, configurationAttributes):\\n print \\\"Application session. Starting external session end\\\"\\n\\n print \\\"Application session. External session ended successfully\\\"\\n return True\\n\\n # Application calls it during /session/active endpoint call to modify response if needed\\n # jsonArray is org.json.JSONArray\\n # context is io.jans.as.server.model.common.ExecutionContext\\n def modifyActiveSessionsResponse(self, jsonArray, context):\\n return False\\n\\n def isFirstSession(self, user_name):\\n tokenLdap = TokenEntity()\\n tokenLdap.setDn(self.staticConfiguration.getBaseDn().getClients())\\n tokenLdap.setUserId(user_name)\\n\\n tokenLdapList = self.entryManager.findEntries(tokenLdap, 1)\\n print \\\"Application session. isFirstSession. Get result: '%s'\\\" % tokenLdapList\\n\\n if (tokenLdapList != None) and (tokenLdapList.size() > 0):\\n print \\\"Application session. isFirstSession: False\\\"\\n return False\\n\\n print \\\"Application session. isFirstSession: True\\\"\\n return True\\n\",\n \"scriptType\": \"application_session\",\n \"programmingLanguage\": \"python\",\n \"moduleProperties\": [\n {\n \"value1\": \"location_type\",\n \"value2\": \"db\"\n }\n ],\n \"level\": 800,\n \"revision\": 8,\n \"enabled\": false,\n \"modified\": false,\n \"internal\": false,\n \"locationType\": \"db\"\n }\n" responses: '201': description: Created content: application/json: schema: $ref: '#/components/schemas/CustomScript' examples: Response json example: description: Response json example value: "{\n \"dn\": \"inum=4144edf6-af99-451d-be29-f3eb5c0e9143,ou=scripts,o=jans\",\n \"inum\": \"4144edf6-af99-451d-be29-f3eb5c0e9143\",\n \"name\": \"test_application_session_test\",\n \"description\": \"Sample Application Session script\",\n \"script\": \"# oxAuth is available under the MIT License (2008). See http://opensource.org/licenses/MIT for full text.\\n# Copyright (c) 2016, Janssen\\n#\\n# Author: Yuriy Movchan\\n#\\n\\nfrom io.jans.model.custom.script.type.session import ApplicationSessionType\\nfrom io.jans.service.cdi.util import CdiUtil\\nfrom io.jans.persist import PersistenceEntryManager\\nfrom io.jans.as.model.config import StaticConfiguration\\nfrom io.jans.as.model.ldap import TokenEntity\\nfrom jakarta.faces.application import FacesMessage\\nfrom io.jans.jsf2.message import FacesMessages\\nfrom io.jans.util import StringHelper, ArrayHelper\\nfrom io.jans.as.model.config import Constants\\nfrom java.util import Arrays, ArrayList\\nfrom io.jans.as.service.external.session import SessionEventType\\n\\nimport java\\n\\nclass ApplicationSession(ApplicationSessionType):\\n def __init__(self, currentTimeMillis):\\n self.currentTimeMillis = currentTimeMillis\\n\\n def init(self, customScript, configurationAttributes):\\n print \\\"Application session. Initialization\\\"\\n\\n self.entryManager = CdiUtil.bean(PersistenceEntryManager)\\n self.staticConfiguration = CdiUtil.bean(StaticConfiguration)\\n\\n print \\\"Application session. Initialized successfully\\\"\\n\\n return True \\n\\n def destroy(self, configurationAttributes):\\n print \\\"Application session. Destroy\\\"\\n print \\\"Application session. Destroyed successfully\\\"\\n return True \\n\\n def getApiVersion(self):\\n return 11\\n\\n # Called each time specific session event occurs\\n # event is io.jans.as.service.external.session.SessionEvent\\n def onEvent(self, event):\\n if event.getType() == SessionEventType.AUTHENTICATED:\\n print \\\"Session is authenticated, session: \\\" + event.getSessionId().getId()\\n return\\n\\n # Application calls it at start session request to allow notify 3rd part systems\\n # httpRequest is jakarta.servlet.http.HttpServletRequest\\n # sessionId is io.jans.as.model.common.SessionId\\n # configurationAttributes is java.util.Map\\n def startSession(self, httpRequest, sessionId, configurationAttributes):\\n print \\\"Application session. Starting external session\\\"\\n\\n user_name = sessionId.getSessionAttributes().get(Constants.AUTHENTICATED_USER)\\n\\n first_session = self.isFirstSession(user_name)\\n if not first_session:\\n facesMessages = CdiUtil.bean(FacesMessages)\\n facesMessages.add(FacesMessage.SEVERITY_ERROR, \\\"Please, end active session first!\\\")\\n return False\\n\\n print \\\"Application session. External session started successfully\\\"\\n return True\\n\\n # Application calls it at end session request to allow notify 3rd part systems\\n # httpRequest is jakarta.servlet.http.HttpServletRequest\\n # sessionId is io.jans.as.model.common.SessionId\\n # configurationAttributes is java.util.Map\\n def endSession(self, httpRequest, sessionId, configurationAttributes):\\n print \\\"Application session. Starting external session end\\\"\\n\\n print \\\"Application session. External session ended successfully\\\"\\n return True\\n\\n # Application calls it during /session/active endpoint call to modify response if needed\\n # jsonArray is org.json.JSONArray\\n # context is io.jans.as.server.model.common.ExecutionContext\\n def modifyActiveSessionsResponse(self, jsonArray, context):\\n return False\\n\\n def isFirstSession(self, user_name):\\n tokenLdap = TokenEntity()\\n tokenLdap.setDn(self.staticConfiguration.getBaseDn().getClients())\\n tokenLdap.setUserId(user_name)\\n\\n tokenLdapList = self.entryManager.findEntries(tokenLdap, 1)\\n print \\\"Application session. isFirstSession. Get result: '%s'\\\" % tokenLdapList\\n\\n if (tokenLdapList != None) and (tokenLdapList.size() > 0):\\n print \\\"Application session. isFirstSession: False\\\"\\n return False\\n\\n print \\\"Application session. isFirstSession: True\\\"\\n return True\\n\",\n \"scriptType\": \"application_session\",\n \"programmingLanguage\": \"python\",\n \"moduleProperties\": [\n {\n \"value1\": \"location_type\",\n \"value2\": \"db\"\n }\n ],\n \"level\": 800,\n \"revision\": 8,\n \"enabled\": false,\n \"modified\": false,\n \"internal\": false,\n \"locationType\": \"db\",\n \"baseDn\": \"inum=4144edf6-af99-451d-be29-f3eb5c0e9143,ou=scripts,o=jans\"\n}\n" '401': description: Unauthorized '400': description: Bad Request '500': description: InternalServerError security: - oauth2: - https://jans.io/oauth/config/scripts.write - oauth2: - https://jans.io/oauth/config/scripts.admin - oauth2: - https://jans.io/oauth/config/write-all /api/v1/config/scripts/{inum}: delete: tags: - Custom Scripts summary: Deletes a custom script operationId: delete-config-scripts-by-inum parameters: - name: inum in: path description: Script identifier required: true schema: type: string responses: '204': description: No Content '401': description: Unauthorized '404': description: Not Found '500': description: InternalServerError security: - oauth2: - https://jans.io/oauth/config/scripts.delete - oauth2: - https://jans.io/oauth/config/scripts.admin - oauth2: - https://jans.io/oauth/config/delete-all patch: tags: - Custom Scripts summary: Patches a custom script operationId: patch-config-scripts-by-inum parameters: - name: inum in: path description: Script identifier required: true schema: type: string requestBody: description: JsonPatch object content: application/json-patch+json: schema: type: array items: $ref: '#/components/schemas/JsonPatch' examples: Request json example: description: Request json example value: "[{ \"op\": \"replace\", \"path\": \"/enabled\", \"value\":false},{ \"op\": \"replace\", \"path\": \"/revision\", \"value\":2}] \n" responses: '200': description: Ok content: application/json: schema: $ref: '#/components/schemas/CustomScript' '401': description: Unauthorized '404': description: Not Found '500': description: InternalServerError security: - oauth2: - https://jans.io/oauth/config/scripts.write - oauth2: - https://jans.io/oauth/config/scripts.admin - oauth2: - https://jans.io/oauth/config/write-all /api/v1/config/scripts/inum/{inum}: get: tags: - Custom Scripts summary: Gets a script by Inum operationId: get-config-scripts-by-inum parameters: - name: inum in: path description: Script identifier required: true schema: type: string responses: '200': description: Ok content: application/json: schema: $ref: '#/components/schemas/CustomScript' examples: Response json example: description: Response json example value: "{\n \"dn\": \"inum=0300-BA90,ou=scripts,o=jans\",\n \"inum\": \"0300-BA90\",\n \"name\": \"discovery_java_params\",\n \"description\": \"Java Custom Sample Script\",\n \"script\": \"/* Copyright (c) 2022, Gluu\\n Author: Yuriy Z\\n */\\n\\nimport io.jans.model.SimpleCustomProperty;\\nimport io.jans.model.custom.script.model.CustomScript;\\nimport io.jans.model.custom.script.type.discovery.DiscoveryType;\\nimport io.jans.service.custom.script.CustomScriptManager;\\nimport org.slf4j.Logger;\\nimport org.slf4j.LoggerFactory;\\nimport org.json.JSONObject;\\n\\nimport java.util.Map;\\n\\npublic class Discovery implements DiscoveryType {\\n\\n private static final Logger log = LoggerFactory.getLogger(Discovery.class);\\n private static final Logger scriptLogger = LoggerFactory.getLogger(CustomScriptManager.class);\\n\\n @Override\\n public boolean init(Map configurationAttributes) {\\n log.info(\\\"Init of Discovery Java custom script\\\");\\n return true;\\n }\\n\\n @Override\\n public boolean init(CustomScript customScript, Map configurationAttributes) {\\n log.info(\\\"Init of Discovery Java custom script\\\");\\n return true;\\n }\\n\\n @Override\\n public boolean destroy(Map configurationAttributes) {\\n log.info(\\\"Destroy of Discovery Java custom script\\\");\\n return true;\\n }\\n\\n @Override\\n public int getApiVersion() {\\n log.info(\\\"getApiVersion Discovery Java custom script: 11\\\");\\n return 11;\\n }\\n\\n @Override\\n public boolean modifyResponse(Object responseAsJsonObject, Object context) {\\n scriptLogger.info(\\\"write to script logger\\\");\\n JSONObject response = (JSONObject) responseAsJsonObject;\\n response.accumulate(\\\"key_from_java\\\", \\\"value_from_script_on_java\\\");\\n return true;\\n }\\n}\\n\",\n \"scriptType\": \"discovery\",\n \"programmingLanguage\": \"java\",\n \"moduleProperties\": [\n {\n \"value1\": \"location_type\",\n \"value2\": \"db\"\n }\n ],\n \"level\": 1,\n \"revision\": 11,\n \"enabled\": true,\n \"modified\": false,\n \"internal\": false,\n \"locationType\": \"db\",\n \"baseDn\": \"inum=0300-BA90,ou=scripts,o=jans\"\n}\n" '401': description: Unauthorized '404': description: Not Found '500': description: InternalServerError security: - oauth2: - https://jans.io/oauth/config/scripts.readonly - oauth2: - https://jans.io/oauth/config/scripts.write - oauth2: - https://jans.io/oauth/config/scripts.admin - oauth2: - https://jans.io/oauth/config/read-all - oauth2: - https://jans.io/oauth/config/write-all /api/v1/config/scripts/name/{name}: get: tags: - Custom Scripts summary: Fetch custom script by name operationId: get-custom-script-by-name parameters: - name: name in: path description: Script name required: true schema: type: string responses: '200': description: CustomScript content: application/json: schema: $ref: '#/components/schemas/CustomScript' examples: Response json example: description: Response json example value: "{\n \"dn\": \"inum=0300-BA90,ou=scripts,o=jans\",\n \"inum\": \"0300-BA90\",\n \"name\": \"discovery_java_params\",\n \"description\": \"Java Custom Sample Script\",\n \"script\": \"/* Copyright (c) 2022, Gluu\\n Author: Yuriy Z\\n */\\n\\nimport io.jans.model.SimpleCustomProperty;\\nimport io.jans.model.custom.script.model.CustomScript;\\nimport io.jans.model.custom.script.type.discovery.DiscoveryType;\\nimport io.jans.service.custom.script.CustomScriptManager;\\nimport org.slf4j.Logger;\\nimport org.slf4j.LoggerFactory;\\nimport org.json.JSONObject;\\n\\nimport java.util.Map;\\n\\npublic class Discovery implements DiscoveryType {\\n\\n private static final Logger log = LoggerFactory.getLogger(Discovery.class);\\n private static final Logger scriptLogger = LoggerFactory.getLogger(CustomScriptManager.class);\\n\\n @Override\\n public boolean init(Map configurationAttributes) {\\n log.info(\\\"Init of Discovery Java custom script\\\");\\n return true;\\n }\\n\\n @Override\\n public boolean init(CustomScript customScript, Map configurationAttributes) {\\n log.info(\\\"Init of Discovery Java custom script\\\");\\n return true;\\n }\\n\\n @Override\\n public boolean destroy(Map configurationAttributes) {\\n log.info(\\\"Destroy of Discovery Java custom script\\\");\\n return true;\\n }\\n\\n @Override\\n public int getApiVersion() {\\n log.info(\\\"getApiVersion Discovery Java custom script: 11\\\");\\n return 11;\\n }\\n\\n @Override\\n public boolean modifyResponse(Object responseAsJsonObject, Object context) {\\n scriptLogger.info(\\\"write to script logger\\\");\\n JSONObject response = (JSONObject) responseAsJsonObject;\\n response.accumulate(\\\"key_from_java\\\", \\\"value_from_script_on_java\\\");\\n return true;\\n }\\n}\\n\",\n \"scriptType\": \"discovery\",\n \"programmingLanguage\": \"java\",\n \"moduleProperties\": [\n {\n \"value1\": \"location_type\",\n \"value2\": \"db\"\n }\n ],\n \"level\": 1,\n \"revision\": 11,\n \"enabled\": true,\n \"modified\": false,\n \"internal\": false,\n \"locationType\": \"db\",\n \"baseDn\": \"inum=0300-BA90,ou=scripts,o=jans\"\n}\n" '401': description: Unauthorized '404': description: Not Found '500': description: InternalServerError security: - oauth2: - https://jans.io/oauth/config/scripts.readonly - oauth2: - https://jans.io/oauth/config/scripts.write - oauth2: - https://jans.io/oauth/config/scripts.admin - oauth2: - https://jans.io/oauth/config/read-all - oauth2: - https://jans.io/oauth/config/write-all /api/v1/config/scripts/types: get: tags: - Custom Scripts summary: Fetch custom script types operationId: get-custom-script-type responses: '200': description: Ok content: application/json: schema: type: array items: type: string enum: - person_authentication - authorization_challenge - introspection - resource_owner_password_credentials - application_session - link_interception - client_registration - id_generator - uma_rpt_policy - uma_rpt_claims - uma_claims_gathering - access_evaluation - access_evaluation_discovery - token_exchange - identity_assertion - consent_gathering - dynamic_scope - spontaneous_scope - end_session - post_authn - client_authn - select_account - create_user - scim - ciba_end_user_notification - revoke_token - persistence_extension - idp - discovery - cookie - health_check - authz_detail - update_token - tx_token - logout_status_jwt - par - config_api_auth - modify_ssa_response - fido2_extension - lock_extension examples: Response json example: description: Response json example value: "[\n \"discovery\",\n \"consent_gathering\",\n \"ciba_end_user_notification\",\n \"id_generator\",\n \"idp\",\n \"introspection\",\n \"persistence_extension\",\n \"link_interception\",\n \"uma_rpt_policy\",\n \"update_token\",\n \"scim\",\n \"end_session\",\n \"config_api_auth\",\n \"uma_claims_gathering\",\n \"person_authentication\",\n \"resource_owner_password_credentials\",\n \"authorization_challenge\",\n \"client_registration\",\n \"dynamic_scope\",\n \"application_session\"\n]\n" '401': description: Unauthorized '404': description: Not Found '500': description: InternalServerError security: - oauth2: - https://jans.io/oauth/config/scripts.readonly - oauth2: - https://jans.io/oauth/config/scripts.write - oauth2: - https://jans.io/oauth/config/scripts.admin - oauth2: - https://jans.io/oauth/config/read-all - oauth2: - https://jans.io/oauth/config/write-all /api/v1/config/scripts/script-types: get: tags: - Custom Scripts summary: Fetch custom script types operationId: get-custom-script-types responses: '200': description: Ok content: application/json: schema: type: array items: type: string examples: Response json example: description: Response json example value: "[\n \"discovery\",\n \"consent_gathering\",\n \"ciba_end_user_notification\",\n \"id_generator\",\n \"idp\",\n \"introspection\",\n \"persistence_extension\",\n \"link_interception\",\n \"uma_rpt_policy\",\n \"update_token\",\n \"scim\",\n \"end_session\",\n \"config_api_auth\",\n \"uma_claims_gathering\",\n \"person_authentication\",\n \"resource_owner_password_credentials\",\n \"authorization_challenge\",\n \"client_registration\",\n \"dynamic_scope\",\n \"application_session\"\n]\n" '401': description: Unauthorized '404': description: Not Found '500': description: InternalServerError security: - oauth2: - https://jans.io/oauth/config/scripts.readonly - oauth2: - https://jans.io/oauth/config/scripts.write - oauth2: - https://jans.io/oauth/config/scripts.admin - oauth2: - https://jans.io/oauth/config/read-all - oauth2: - https://jans.io/oauth/config/write-all /api/v1/config/scripts/type/{type}: get: tags: - Custom Scripts summary: Gets list of scripts by type operationId: get-config-scripts-by-type parameters: - name: type in: path description: Script type required: true schema: type: string - name: limit in: query description: Search size - max size of the results to return schema: type: integer format: int32 default: 50 - name: pattern in: query description: Search pattern schema: type: string default: '' - name: startIndex in: query description: The 1-based index of the first query result schema: type: integer format: int32 default: 0 - name: sortBy in: query description: Attribute whose value will be used to order the returned response schema: type: string default: inum - name: sortOrder in: query description: Order in which the sortBy param is applied. Allowed values are "ascending" and "descending" schema: type: string default: ascending - name: fieldValuePair in: query description: Field and value pair for seraching schema: type: string default: '' examples: Field value example: description: Field value example value: adminCanEdit=true,dataType=string responses: '200': description: Ok content: application/json: schema: $ref: '#/components/schemas/PagedResult' examples: Response json example: description: Response json example value: "{\n \"start\": 0,\n \"totalEntriesCount\": 1,\n \"entriesCount\": 1,\n \"entries\": [\n {\n \"dn\": \"inum=0300-BA90,ou=scripts,o=jans\",\n \"inum\": \"0300-BA90\",\n \"name\": \"discovery_java_params\",\n \"description\": \"Java Custom Sample Script\",\n \"script\": \"/* Copyright (c) 2022, Gluu\\n Author: Yuriy Z\\n */\\n\\nimport io.jans.model.SimpleCustomProperty;\\nimport io.jans.model.custom.script.model.CustomScript;\\nimport io.jans.model.custom.script.type.discovery.DiscoveryType;\\nimport io.jans.service.custom.script.CustomScriptManager;\\nimport org.slf4j.Logger;\\nimport org.slf4j.LoggerFactory;\\nimport org.json.JSONObject;\\n\\nimport java.util.Map;\\n\\npublic class Discovery implements DiscoveryType {\\n\\n private static final Logger log = LoggerFactory.getLogger(Discovery.class);\\n private static final Logger scriptLogger = LoggerFactory.getLogger(CustomScriptManager.class);\\n\\n @Override\\n public boolean init(Map configurationAttributes) {\\n log.info(\\\"Init of Discovery Java custom script\\\");\\n return true;\\n }\\n\\n @Override\\n public boolean init(CustomScript customScript, Map configurationAttributes) {\\n log.info(\\\"Init of Discovery Java custom script\\\");\\n return true;\\n }\\n\\n @Override\\n public boolean destroy(Map configurationAttributes) {\\n log.info(\\\"Destroy of Discovery Java custom script\\\");\\n return true;\\n }\\n\\n @Override\\n public int getApiVersion() {\\n log.info(\\\"getApiVersion Discovery Java custom script: 11\\\");\\n return 11;\\n }\\n\\n @Override\\n public boolean modifyResponse(Object responseAsJsonObject, Object context) {\\n scriptLogger.info(\\\"write to script logger\\\");\\n JSONObject response = (JSONObject) responseAsJsonObject;\\n response.accumulate(\\\"key_from_java\\\", \\\"value_from_script_on_java\\\");\\n return true;\\n }\\n}\\n\",\n \"scriptType\": \"discovery\",\n \"programmingLanguage\": \"java\",\n \"moduleProperties\": [\n {\n \"value1\": \"location_type\",\n \"value2\": \"db\"\n }\n ],\n \"level\": 1,\n \"revision\": 11,\n \"enabled\": true,\n \"modified\": false,\n \"internal\": false,\n \"locationType\": \"db\",\n \"baseDn\": \"inum=0300-BA90,ou=scripts,o=jans\"\n }\n ]\n}\n" '401': description: Unauthorized '404': description: Not Found '500': description: InternalServerError security: - oauth2: - https://jans.io/oauth/config/scripts.readonly - oauth2: - https://jans.io/oauth/config/scripts.write - oauth2: - https://jans.io/oauth/config/scripts.admin - oauth2: - https://jans.io/oauth/config/read-all - oauth2: - https://jans.io/oauth/config/write-all components: schemas: SimpleExtendedCustomProperty: type: object properties: value1: type: string value2: type: string hide: type: boolean description: type: string ScriptError: type: object properties: raisedAt: type: string format: date-time stackTrace: type: string SimpleCustomProperty: type: object properties: value1: type: string value2: type: string description: type: string JsonPatch: type: object CustomScript: type: object properties: dn: type: string inum: type: string name: maxLength: 60 minLength: 2 pattern: ^[a-zA-Z0-9_\-\:\/\.]+$ type: string aliases: type: array items: type: string description: type: string script: type: string scriptType: type: string enum: - person_authentication - authorization_challenge - introspection - resource_owner_password_credentials - application_session - link_interception - client_registration - id_generator - uma_rpt_policy - uma_rpt_claims - uma_claims_gathering - access_evaluation - access_evaluation_discovery - token_exchange - identity_assertion - consent_gathering - dynamic_scope - spontaneous_scope - end_session - post_authn - client_authn - select_account - create_user - scim - ciba_end_user_notification - revoke_token - persistence_extension - idp - discovery - cookie - health_check - authz_detail - update_token - tx_token - logout_status_jwt - par - config_api_auth - modify_ssa_response - fido2_extension - lock_extension programmingLanguage: type: string enum: - python - java moduleProperties: type: array items: $ref: '#/components/schemas/SimpleCustomProperty' configurationProperties: type: array items: $ref: '#/components/schemas/SimpleExtendedCustomProperty' level: type: integer format: int32 revision: type: integer format: int64 enabled: type: boolean scriptError: $ref: '#/components/schemas/ScriptError' modified: type: boolean internal: type: boolean locationType: type: string enum: - ldap - db baseDn: type: string PagedResult: type: object properties: start: type: integer format: int32 totalEntriesCount: type: integer format: int32 entriesCount: type: integer format: int32 entries: type: array items: type: object securitySchemes: oauth2: type: oauth2 flows: clientCredentials: tokenUrl: https://{op-hostname}/.../token scopes: https://jans.io/oauth/jans-auth-server/config/properties.readonly: View Auth Server properties related information https://jans.io/oauth/jans-auth-server/config/properties.write: Manage Auth Server properties related information https://jans.io/oauth/config/attributes.readonly: View attribute related information https://jans.io/oauth/config/attributes.write: Manage attribute related information https://jans.io/oauth/config/attributes.delete: Delete attribute related information https://jans.io/oauth/config/acrs.readonly: View ACRS related information https://jans.io/oauth/config/acrs.write: Manage ACRS related information https://jans.io/oauth/config/database/ldap.readonly: View LDAP database related information https://jans.io/oauth/config/database/ldap.write: Manage LDAP database related information https://jans.io/oauth/config/database/ldap.delete: Delete LDAP database related information https://jans.io/oauth/config/scripts.readonly: View cache scripts information https://jans.io/oauth/config/scripts.write: Manage scripts related information https://jans.io/oauth/config/scripts.delete: Delete scripts related information https://jans.io/oauth/config/cache.readonly: View cache related information https://jans.io/oauth/config/cache.write: Manage cache related information https://jans.io/oauth/config/smtp.readonly: View SMTP related information https://jans.io/oauth/config/smtp.write: Manage SMTP related information https://jans.io/oauth/config/smtp.delete: Delete SMTP related information https://jans.io/oauth/config/logging.readonly: View logging related information https://jans.io/oauth/config/logging.write: Manage logging related information https://jans.io/oauth/config/jwks.readonly: View JWKS related information https://jans.io/oauth/config/jwks.write: Manage JWKS related information https://jans.io/oauth/config/jwks.delete: Delete JWKS related information https://jans.io/oauth/config/openid/clients.readonly: View clients related information https://jans.io/oauth/config/openid/clients.write: Manage clients related information https://jans.io/oauth/config/openid/clients.delete: Delete clients related information https://jans.io/oauth/config/scopes.readonly: View scope related information https://jans.io/oauth/config/scopes.write: Manage scope related information https://jans.io/oauth/config/scopes.delete: Delete scope related information https://jans.io/oauth/config/stats.readonly: View server with basic statistic https://jans.io/oauth/config/organization.readonly: View organization configuration information https://jans.io/oauth/config/organization.write: Manage organization configuration information https://jans.io/oauth/config/agama.readonly: View Agama Flow related information https://jans.io/oauth/config/agama.write: Manage Agama Flow related information https://jans.io/oauth/config/agama.delete: Delete Agama Flow related information https://jans.io/oauth/jans-auth-server/session.readonly: View Session related information https://jans.io/oauth/jans-auth-server/session.delete: Delete Session information https://jans.io/oauth/config/read-all: Super admin read access to all configuration resources https://jans.io/oauth/config/write-all: Super admin write access to all configuration resources https://jans.io/oauth/config/delete-all: Super admin delete access to all configuration resources https://jans.io/oauth/config/openid/openid.readonly: View OpenID functionality https://jans.io/oauth/config/openid/openid.write: Manage OpenID functionality https://jans.io/oauth/config/openid/openid.delete: Delete OpenID functionality https://jans.io/oauth/config/uma.readonly: View UMA functionality https://jans.io/oauth/config/uma.write: Manage UMA functionality https://jans.io/oauth/config/uma.delete: Delete UMA functionality https://jans.io/oauth/config/plugin.readonly: View Plugin information https://jans.io/oauth/config/properties.readonly: View Config-API related configuration properties https://jans.io/oauth/config/properties.write: Manage Config-API related configuration properties https://jans.io/oauth/client/authorizations.readonly: View ClientAuthorizations https://jans.io/oauth/client/authorizations.delete: Revoke ClientAuthorizations https://jans.io/oauth/config/asset.readonly: View Jans Assets https://jans.io/oauth/config/asset.write: Manage Jans Assets https://jans.io/oauth/config/asset.delete: Delete Jans Assets https://jans.io/oauth/config/token.readonly: View Token details https://jans.io/oauth/config/token.write: Manage Token details https://jans.io/oauth/config/token.delete: Delete Token details https://jans.io/oauth/config/data.readonly: View Config-API related data https://jans.io/oauth/config/ssa.readonly: View SSA details https://jans.io/oauth/config/ssa.write: Manage SSA details https://jans.io/oauth/config/ssa.delete: Delete SSA details https://jans.io/oauth/jans-auth-server/config/properties.admin: Admin scope for Auth Server properties https://jans.io/oauth/config/attributes.admin: Admin for Attribute management https://jans.io/oauth/config/acrs.admin: Admin for ACRS management https://jans.io/oauth/config/database.admin: Admin for Database config management https://jans.io/oauth/config/scripts.admin: Admin for Scripts management https://jans.io/oauth/config/cache.admin: Admin for Cache management https://jans.io/oauth/config/message.admin: Admin for Message management https://jans.io/oauth/config/smtp.admin: Admin for SMTP management https://jans.io/oauth/config/logging.admin: Admin for Logging management https://jans.io/oauth/config/jwks.admin: Admin for JWKS management https://jans.io/oauth/config/openid/clients.admin: Admin for clients management https://jans.io/oauth/config/token.admin: Admin for Token management https://jans.io/oauth/config/scopes.admin: Admin for scope management https://jans.io/oauth/config/stats.admin: Admin for statistic management https://jans.io/oauth/config/organization.admin: Admin for organization configuration management https://jans.io/oauth/config/agama.admin: Admin for Agama flow management https://jans.io/oauth/jans-auth-server/session.admin: Admin for Session management https://jans.io/oauth/config/uma.admin: Admin for UMA management https://jans.io/oauth/config/plugin.admin: Admin for Plugin management https://jans.io/oauth/config/properties.admin: Admin for Config-API management https://jans.io/oauth/client/authorizations.admin: Admin for Client Authorizations management https://jans.io/oauth/config/asset.admin: Admin for Jans Assets management https://jans.io/auth/ssa.admin: Admin for SSA management https://jans.io/oauth/config/health.admin: Admin for Health API management