diff --git a/modules/distribution/src/api-resources/api_templates/default_api_template.xml b/modules/distribution/src/api-resources/api_templates/default_api_template.xml index 8cbb8f05..e69e8ade 100644 --- a/modules/distribution/src/api-resources/api_templates/default_api_template.xml +++ b/modules/distribution/src/api-resources/api_templates/default_api_template.xml @@ -1,13 +1,7 @@ - #foreach($resource in $resources) - + @@ -72,7 +66,6 @@ - #end ## end of resource iterator diff --git a/modules/distribution/src/api-resources/api_templates/velocity_template.xml b/modules/distribution/src/api-resources/api_templates/velocity_template.xml index c484f5f2..acec1df1 100644 --- a/modules/distribution/src/api-resources/api_templates/velocity_template.xml +++ b/modules/distribution/src/api-resources/api_templates/velocity_template.xml @@ -76,16 +76,32 @@ #end - #macro ( http_endpoint $name $ep ) +#macro ( http_endpoint $name $ep ) - -#timeout( $ep.get('config') ) - - #if($destinationBasedStatsEnabled) - - #end - - #end + + #timeout( $ep.get('config') ) + + + +#end + +#macro ( address_endpoint $name $ep ) + + #set( $advance_ep = $ep.get("config") ) +
+ #timeout( $ep.get('config') ) +
+ +
+#end + #macro ( draw_endpoint $type $endpoint_config ) @@ -157,9 +173,7 @@ > #timeout( $endpoints.get('config') ) -#if($destinationBasedStatsEnabled) -#end #elseif ($endpointClass == "wsdl") @@ -172,19 +186,25 @@ #timeout() #end - #if($destinationBasedStatsEnabled) - #end #elseif ($endpointClass == "failover") #set( $failover_endpoints = $endpoint_config.get("${type}_failovers")) - #http_endpoint("${ep_name}_0" $endpoints) + #if($endpoints.get("endpoint_type") == "address") + #address_endpoint("${ep_name}_0" $endpoints) + #else + #http_endpoint("${ep_name}_0" $endpoints) + #end #set( $i = 1) #foreach($endpoint in $failover_endpoints) - #http_endpoint("${ep_name}_$i" $endpoint) - #set( $i = $i + 1) + #if($endpoint.get("endpoint_type") == "address") + #address_endpoint("${ep_name}_$i" $endpoint) + #else + #http_endpoint("${ep_name}_$i" $endpoint) + #end + #set( $i = $i + 1) #end @@ -203,8 +223,12 @@ #end> #set( $i = 0) #foreach($endpoint in $endpoints) - #http_endpoint("${ep_name}_$i" $endpoint) - #set( $i = $i + 1) + #if($endpoint.get("endpoint_type") == "address") + #address_endpoint("${ep_name}_$i" $endpoint) + #else + #http_endpoint("${ep_name}_$i" $endpoint) + #end + #set( $i = $i + 1) #end @@ -215,17 +239,6 @@ #end - #if($destinationBasedStatsEnabled) - - - - - - - - - - #end #end ######################## End of Macros ###################################### @@ -266,17 +279,14 @@ #end methods="$resource.getMethodsAsString()" faultSequence=#print_string_if_exist($faultSequence "fault")> -## check and set jwt -#if($jwtIsEnabled && ($apiStatus != 'PROTOTYPED')) - -#end + ## check and set response caching #if($responseCacheEnabled) #end - + ############## define the filter based on environment type production only, sandbox only , hybrid ############ #if(($environmentType == 'sandbox') || ($environmentType =='hybrid' && !$endpoint_config.get("production_endpoints") )) @@ -288,7 +298,6 @@ #end - #if(($environmentType == 'sandbox') || ($environmentType =='hybrid' && ! $endpoint_config.get("production_endpoints") )) #draw_endpoint( "sandbox" $endpoint_config ) #else @@ -329,6 +338,7 @@ #end + ## check and set response caching #if($responseCacheEnabled) @@ -342,7 +352,6 @@ #if($handlers.size() > 0) #foreach($handler in $handlers) -#if($handler.className != 'org.wso2.carbon.apimgt.usage.publisher.APIMgtUsageHandler') #if($handler.hasProperties()) #set ($map = $handler.getProperties() ) @@ -352,7 +361,6 @@ #end #end -#end #end #end diff --git a/modules/distribution/src/assembly/bin.xml b/modules/distribution/src/assembly/bin.xml index 65c34dbf..bd414507 100644 --- a/modules/distribution/src/assembly/bin.xml +++ b/modules/distribution/src/assembly/bin.xml @@ -218,6 +218,8 @@ **/application-authentication.xml **/broker.xml **/log4j.properties + **/nhttp.properties + **/passthru-http.properties @@ -464,8 +466,6 @@ base-page/** login/** styles-layout.css - modules/manager/manager.jag - jagg/jagg.jag @@ -677,19 +677,7 @@ ${pom.artifactId}-${pom.version}/bin 755 - - - src/repository/jaggeryapps/api-store/jagg.jag - ${pom.artifactId}-${pom.version}/repository/deployment/server/jaggeryapps/api-store/jagg - - 755 - - - src/repository/jaggeryapps/api-store/manager.jag - ${pom.artifactId}-${pom.version}/repository/deployment/server/jaggeryapps/api-store/modules/manager - - 755 - + src/repository/jaggeryapps/portal/controllers/apis/analytics.jag diff --git a/modules/distribution/src/repository/conf/api-manager.xml b/modules/distribution/src/repository/conf/api-manager.xml index 5192aa4f..2c47adb8 100755 --- a/modules/distribution/src/repository/conf/api-manager.xml +++ b/modules/distribution/src/repository/conf/api-manager.xml @@ -1,247 +1,181 @@ - - + jdbc/WSO2AM_DB - None + Synapse + By default secure vault is disabled.--> false - - - - - - + + + + https://localhost:${mgt.transport.https.port}${carbon.context}services/ + + ${admin.username} + + ${admin.password} + + false + - - + true + + X-JWT-Assertion - JDBC driver for the database. - --> - + + - - - - https://${carbon.local.ip}:${mgt.transport.https.port}${carbon.context}/services/ - - admin - - admin - + + http://wso2.org/claims - - - - X-JWT-Assertion - - - + + SHA256withRSA - - - - - - - - - - - - + + + + + + + + + - + - + - + An API deployed on a 'production' type gateway will only support production keys + An API deployed on a 'sandbox' type gateway will only support sandbox keys + An API deployed on a 'hybrid' type gateway will support both production and sandbox keys. --> + + Production and Sandbox - - https://${carbon.local.ip}:${mgt.transport.https.port}${carbon.context}/services/ - - admin - - admin - + This is a hybrid gateway that handles both production and sandbox token traffic. + + https://localhost:${mgt.transport.https.port}${carbon.context}services/ + + ${admin.username} + + ${admin.password} + http://${carbon.local.ip}:${http.nio.port},https://${carbon.local.ip}:${https.nio.port} - - - true - - - true - - - referer - - - false + + + true + + true + + false + + false + + + + + + + - - - + + false - + + {tcp://localhost:7612} + + + ${admin.username} + + ${admin.password} + + + org.wso2.carbon.apimgt.usage.client.impl.APIUsageStatisticsRdbmsClientImpl + + + https://localhost:9444 + ${admin.username} + ${admin.password} + + + false + + org.wso2.carbon.apimgt.usage.publisher.APIMgtUsageDataBridgeDataPublisher - - 7612 - - - tcp://localhost:7612/ - - - admin - - - admin - - - - - - + + false + org.wso2.apimgt.statistics.request - 1.0.0 + 1.1.0 org.wso2.apimgt.statistics.response - 1.0.0 + 1.1.0 org.wso2.apimgt.statistics.fault 1.0.0 - - org_wso2_apimgt_statistics_destination - 1.0.0 - bam-profile - org.wso2.apimgt.statistics.throttle 1.0.0 @@ -250,224 +184,168 @@ org.wso2.apimgt.statistics.workflow 1.0.0 + + org.wso2.apimgt.statistics.execution.time + 1.0.0 + + + org.wso2.analytics.apim.alertStakeholderInfo + 1.0.0 + - + + - - https://${carbon.local.ip}:${mgt.transport.https.port}${carbon.context}/services/ - - - admin - - - admin - - false - - - - false - - - - ThriftClient - 10397 + + https://localhost:${mgt.transport.https.port}${carbon.context}services/ + + + ${admin.username} + + ${admin.password} + + + WSClient 10000 - 10397 - - true - - - am_application_scope - - + + + false + localhost + + + + org.wso2.carbon.apimgt.keymgt.handlers.DefaultKeyValidationHandler - - - - - - - - /oauth2/token - - - https://${carbon.local.ip}:${https.nio.port}/revoke - - - false - - - org.wso2.carbon.apimgt.impl.AMDefaultKeyManagerImpl + + - + + + + + am_application_scope + + + + /oauth2/token + + https://localhost:${https.nio.port}/revoke + + false + + + - + true - - - - true - - - subscriber - - - + + true false - https://${carbon.local.ip}:${mgt.transport.https.port}/store - - false - + https://localhost:${mgt.transport.https.port}${carbon.context}services/ + + ${admin.username} - --> + + ${admin.password} + + false + false + + - + true - + true - - - - - false - + + false - https://${carbon.local.ip}:${mgt.transport.https.port}/publisher - + https://localhost:${mgt.transport.https.port}/publisher + + + - + - + - - - + false - + /resource @@ -478,56 +356,188 @@ Any - - + + - - - - - - - + - - + true - - https://localhost:9443,http://localhost:9763 + + * - - authorization,Access-Control-Allow-Origin,Content-Type + + GET,PUT,POST,DELETE,PATCH,OPTIONS + + authorization,Access-Control-Allow-Origin,Content-Type,SOAPAction + + + + false + - - \ No newline at end of file + You can enable this and set preferable Logger name. --> + + + + + + + /api/am/publisher/{version}/swagger.json + GET,HEAD + + + /api/am/store/{version}/swagger.json + GET,HEAD + + + /api/am/admin/{version}/swagger.json + GET,HEAD + + + /api/am/store/{version}/apis + GET,HEAD + + + /api/am/store/{version}/apis/{apiId} + GET,HEAD + + + /api/am/store/{version}/apis/{apiId}/swagger + GET,HEAD + + + /api/am/store/{version}/apis/{apiId}/documents + GET,HEAD + + + /api/am/store/{version}/apis/{apiId}/documents/{documentId} + GET,HEAD + + + /api/am/store/{version}/apis/{apiId}/documents/{documentId}/content + GET,HEAD + + + /api/am/store/{version}/apis/{apiId}/thumbnail + GET,HEAD + + + /api/am/store/{version}/tags + GET,HEAD + + + /api/am/store/{version}/tiers/{tierLevel} + GET,HEAD + + + /api/am/store/{version}/tiers/{tierLevel}/{tierName} + GET,HEAD + + + + + false + + false + Binary + tcp://${carbon.local.ip}:${receiver.url.port} + ssl://${carbon.local.ip}:${auth.url.port} + ${admin.username} + ${admin.password} + + 1000 + 200 + + + 200 + 1000 + 200 + + + + https://localhost:${mgt.transport.https.port}${carbon.context}services/ + ${admin.username} + ${admin.password} + + + false + + + + false + tcp://${carbon.local.ip}:${jms.port} + ${admin.username} + ${admin.password} + throttleData + + + TopicConnectionFactory + topic + org.wso2.andes.jndi.PropertiesFileInitialContextFactory + amqp://${jms.username}:${jms.password}@clientid/carbon?brokerlist='${jms.url}' + + + 20 + 100 + 1000 + 10 + + + + org.wso2.andes.jndi.PropertiesFileInitialContextFactory + repository/conf/jndi.properties + topic + throttleData + allow + TopicConnectionFactory + + + true + false + false + false + + + diff --git a/modules/distribution/src/repository/conf/cdm-config.xml b/modules/distribution/src/repository/conf/cdm-config.xml index 1e833eef..85998819 100644 --- a/modules/distribution/src/repository/conf/cdm-config.xml +++ b/modules/distribution/src/repository/conf/cdm-config.xml @@ -43,7 +43,7 @@ 20 - true + false 600000 org.wso2.carbon.device.mgt.core.task.impl.DeviceDetailsRetrieverTask diff --git a/modules/distribution/src/repository/conf/etc/webapp-publisher-config.xml b/modules/distribution/src/repository/conf/etc/webapp-publisher-config.xml index 15fce63f..d67a0cf9 100644 --- a/modules/distribution/src/repository/conf/etc/webapp-publisher-config.xml +++ b/modules/distribution/src/repository/conf/etc/webapp-publisher-config.xml @@ -24,10 +24,14 @@ - https://localhost:9443 + https://localhost:${carbon.https.port} true + + + false + default diff --git a/modules/distribution/src/repository/conf/identity/identity.xml b/modules/distribution/src/repository/conf/identity/identity.xml index f7a1383c..f4930e5a 100644 --- a/modules/distribution/src/repository/conf/identity/identity.xml +++ b/modules/distribution/src/repository/conf/identity/identity.xml @@ -128,9 +128,10 @@ authorization_code org.wso2.carbon.identity.oauth2.token.handlers.grant.AuthorizationCodeGrantHandler + password - org.wso2.carbon.apimgt.keymgt.handlers.ExtendedPasswordGrantHandler + org.wso2.carbon.device.mgt.oauth.extensions.handlers.grant.ExtendedPasswordGrantHandler refresh_token diff --git a/modules/distribution/src/repository/conf/nhttp.properties b/modules/distribution/src/repository/conf/nhttp.properties new file mode 100644 index 00000000..56abe765 --- /dev/null +++ b/modules/distribution/src/repository/conf/nhttp.properties @@ -0,0 +1,46 @@ +# +# Copyright (c) 2005-2010, WSO2 Inc. (http://wso2.com) All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# This file contains the configuration parameters used by the Non-blocking HTTP transport + +#http.socket.timeout=60000 +#http.socket.buffer-size=8192 +#http.tcp.nodelay=1 +#http.connection.stalecheck=0 + +# Uncomment the following property for an AIX based deployment +#http.nio.interest-ops-queueing=true + +# HTTP Sender thread pool parameters +#snd_t_core=20 +#snd_t_max=100 +#snd_alive_sec=5 +#snd_qlen=-1 +#snd_io_threads=2 + +# HTTP Listener thread pool parameters +#lst_t_core=20 +#lst_t_max=100 +#lst_alive_sec=5 +#lst_qlen=-1 +#lst_io_threads=2 +nhttp.rest.dispatcher.service=__MultitenantDispatcherService + +rest_uri_api_regex=\\w+://.+:\\d+/t/.*|\\w+://.+\\w+/t/.*|^(/t/).* +rest_uri_proxy_regex=\\w+://.+:\\d+/services/t/.*|\\w+://.+\\w+/services/t/.*|^(/services/t/) + +# This property is crucial for automated tests +http.socket.reuseaddr=true \ No newline at end of file diff --git a/modules/distribution/src/repository/conf/passthru-http.properties b/modules/distribution/src/repository/conf/passthru-http.properties new file mode 100644 index 00000000..6645b8d1 --- /dev/null +++ b/modules/distribution/src/repository/conf/passthru-http.properties @@ -0,0 +1,51 @@ +# +# Copyright (c) 2005-2010, WSO2 Inc. (http://wso2.com) All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +## This file contains the configuration parameters used by the Pass-through HTTP transport + +## Nhttp tuning parameters +#http.socket.timeout=60000 +#http.connection.timeout=0 +#http.socket.buffer-size=8192 +#http.socket.linger=-1 +#http.nio.select-interval=1000 +#http.tcp.nodelay=true +#http.connection.stalecheck=false +#http.socket.reuseaddr=false + +## Uncomment the following for AIX based deployments +#http.nio.interest-ops-queueing=true + +## Pass-through HTTP transport specific tuning parameters +worker_pool_size_core=400 +worker_pool_size_max=500 +#worker_thread_keepalive_sec=60 +#worker_pool_queue_length=-1 +#io_threads_per_reactor=2 +io_buffer_size=16384 +#http.max.connection.per.host.port=32767 + +## Other parameters +#http.user.agent.preserve=false +#http.server.preserve=true +#http.connection.disable.keepalive=false + +# URI configurations that determine if it requires custom rest dispatcher +rest_uri_api_regex=\\w+://.+:\\d+/t/.*|\\w+://.+\\w+/t/.*|^(/t/).* +rest_uri_proxy_regex=\\w+://.+:\\d+/services/t/.*|\\w+://.+\\w+/services/t/.*|^(/services/t/) + +# This property is crucial for automated tests +http.socket.reuseaddr=true \ No newline at end of file diff --git a/modules/distribution/src/repository/database/WSO2MobileDM_DB.h2.db b/modules/distribution/src/repository/database/WSO2MobileDM_DB.h2.db deleted file mode 100644 index 45be40b9..00000000 Binary files a/modules/distribution/src/repository/database/WSO2MobileDM_DB.h2.db and /dev/null differ diff --git a/modules/distribution/src/repository/jaggeryapps/api-store/jagg.jag b/modules/distribution/src/repository/jaggeryapps/api-store/jagg.jag deleted file mode 100644 index c1068ed4..00000000 --- a/modules/distribution/src/repository/jaggeryapps/api-store/jagg.jag +++ /dev/null @@ -1,897 +0,0 @@ -<% -var site = require("/site/conf/site.json"); -//TODO : remove this when log configs are implemented -//Log.prototype.isDebugEnabled = function () { -// return false; -//}; - -//TODO : remove this when Context HO is implemented. -var context = context || { - put:function (key, value) { - session.put(key, value); - }, - get:function (key) { - return session.get(key); - }, - remove:function (key) { - session.remove(key); - } - }; - -var jagg = jagg || (function () { - var ctx = context; - - var modules = {}; - - var requirs = {}; - - var templates = {}; - - var initializers = {}; - - var bloks = {}; - - var data; - - var reverse_proxy; - - var setData = function (d) { - data = d; - }; - - var getData = function () { - return data; - }; - - var getUser = function () { - var user = session.get("logged.user"); - - // If user is null then check for mutual auth - if (!user) { - user = mutualAuthVerifier(user); - } - - return user; - }; - - var setUser = function (user) { - //if jaggery allow session reset - if (typeof request.getSession == "function") { - if (session && !session.isNew()) { - session.invalidate(); - } - session = request.getSession(true); - } - session.put("logged.user", user); - }; - - var mutualAuthVerifier = function(user){ - - var log = new Log(); - var site = require("/site/conf/site.json"); - - if(site.mutualAuthConfiguration){ - if (site.mutualAuthConfiguration.enabled == "true") { - - // cert will be available only if trust store holds client certificate. Otherwise it is null - var cert = request.getAttribute("javax.servlet.request.X509Certificate"); - var userName = request.getHeader("MutualAuthUserName"); - - // proceed mutul ssl validation if cert and user name set properly - - if (cert != null) { - if (userName) { - var security = require("apimstore"); - var mutualAuthHostObject = new security.MutualAuthHostObject(); - var isValidUser = mutualAuthHostObject.validateUserNameHeader(userName); - // Group ID feature not supported here - var groupId=""; - session.put("groupId", groupId); - if (isValidUser) { - log.info("Mutual Auth authentication success for user : " + userName); - user = {username: userName, cookie: null, hasPublisherAccess: false}; - return user; - } else { - log.debug("Mutual authentication failed for invalid user : " + userName); - } - - } else { - log.debug("Mutual authentication failed for invalid user : MutualAuthUserName header is empty"); - } - } else { - log.debug("Mutual Authentication failed due to no trusted certificate"); - } - } - } - }; - - var getThemeFile = function (path) { - var p, index, theme = getUserTheme(); - if (theme.tenant_theme) { - p = getTenantThemePath() + path; - index = p.indexOf("?"); - if (new File(p.substring(0, index == -1 ? p.length : index)).isExists()) { - return p; - } - } - if (theme.subtheme) { - p = getThemePath() + "subthemes/" + theme.subtheme + "/" + path; - index = p.indexOf("?"); - if(new File(p.substring(0, index == -1 ? p.length : index)).isExists()) { - return p; - } - } - return getThemePath() + path; - }; - - var getThemesPath = function () { - return "/site/themes/"; - }; - - var getTenantThemesPath = function(){ - return "/site/tenant_themes/"; - }; - - var getThemePath = function () { - return getThemesPath() + getUserTheme().base + "/"; - }; - - var getTenantThemePath = function (){ - return getTenantThemesPath() + getTheme().tenant_theme + "/"; - } - - var getBlockFile = function (name) { - return getBlocksDir() + name + "/block.jag"; - }; - - var getInitializerFile = function (name) { - return getThemeFile("templates/" + name + "/initializer.jag"); - }; - - var getTemplateFile = function (name) { - return getThemeFile("templates/" + name + "/template.jag"); - }; - - var getTemplatePath = function(themeDir, name) { - return themeDir + "templates/" + name + "/template.jag"; - }; - - var getModuleFile = function (name) { - return getModulesDir() + name + "/module.jag"; - }; - - var getBlocksDir = function () { - return "/site/blocks/"; - }; - - var getThemesDir = function () { - return "/site/themes/"; - }; - - var getModulesDir = function () { - return "/modules/"; - }; - - var getTheme = function () { - //TODO : remove following lines if theme switching need to be avoided - var site = require("/site/conf/site.json"), - theme = request.getParameter("theme"), - subtheme = request.getParameter("subtheme"); - var r = { - base : theme ? theme : site.theme.base, - subtheme : subtheme ? subtheme : site.theme.subtheme, - }; - //load the tenant theme if exists - var tenant = getTenantDomain(); - if(tenant){ - tenant = tenant.replace("/","."); - r.tenant_theme = getTenantDomain(); - } - return r; - }; - - var getUserTheme = function () { - return session.get("theme") ? session.get("theme") : getTheme(); - }; - - var mergeParams = function (extInputs, defInputs) { - var key, obj; - extInputs = extInputs || {}; - for (key in defInputs) { - if (defInputs.hasOwnProperty(key)) { - obj = extInputs[key]; - if (!obj) { - extInputs[key] = defInputs[key]; - } - } - } - return extInputs; - }; - - var renderBlock = function (name, inputs, outputs, populate) { - //initializeTemplate({name:name, params:null}, jagg); - - var init, fn, blok, log = new Log(); - - fn = template(name); - if (!fn) { - log.error("Template header and footer includes are missing for : " + name); - } - if (populate) { - blok = block(name); - - if (!inputs) { - inputs = blok.getInputs ? blok.getInputs() : {}; - } else { - mergeParams(inputs, blok.getInputs ? blok.getInputs() : null); - } - - if (blok.getOutputs) { - outputs = blok.getOutputs(inputs); - } else if (blok.getInputs) { - outputs = inputs; - } else { - outputs = {}; - } - } - init = initializer(name); - if (init.postInitialize) { - init.postInitialize(inputs, outputs); - } - fn(inputs, outputs, jagg); - }; - - var inheritParent = function (blok, name) { - var parent = require(getBlockFile(name)); - for (var prop in parent) { - if (parent.hasOwnProperty(prop)) { - if (!blok[prop]) { - blok[prop] = parent[prop]; - } - } - } - }; - - var initializeBlock = function (obj) { - if (!obj) { - return; - } - var extInputs, defInputs, parent, tmpl, inputBlocks, outputBlocks, outputs, tmplInitializer, bloks, i, length, - name = obj.name, blok = block(name), log = new Log(); - - template(name); - extInputs = obj.inputs || (obj.inputs = {}); - defInputs = blok.getInputs ? blok.getInputs() : {}; - mergeParams(extInputs, defInputs); - - if (blok.getInputBlocks) { - inputBlocks = blok.getInputBlocks(); - length = inputBlocks.length; - for (i = 0; i < length; i++) { - initializeBlocks(inputBlocks[i], extInputs); - } - } - - if (blok.getOutputs) { - outputs = blok.getOutputs(extInputs); - } else if (blok.getInputs) { - outputs = extInputs; - } else { - outputs = {}; - } - - obj.outputs = outputs; - if (blok.getOutputBlocks) { - outputBlocks = blok.getOutputBlocks(); - length = outputBlocks.length; - for (i = 0; i < length; i++) { - initializeBlocks(outputBlocks[i], outputs); - } - } - - if (blok.getStaticBlocks) { - bloks = blok.getStaticBlocks(); - length = bloks.length; - for (i = 0; i < length; i++) { - initializeBlock({name:bloks[i], inputs:null}); - } - } - }; - - // [ "foo", "bar", "mar"] - // [{ "name" : "foo/bar", params : {}}] - var initializeBlocks = function (keys, inputs) { - if (!inputs) { - return; - } - var i, length, values, last; - if (typeof keys !== "string") { - length = keys.length; - values = inputs[keys[0]]; - last = (length == 1); - if (values instanceof Array) { - length = values.length; - for (i = 0; i < length; i++) { - if (last) { - initializeBlock(values[i]); - } else { - initializeBlocks(keys.slice(1), values[i]); - } - } - } else { - if (last) { - initializeBlock(values); - } else { - initializeBlocks(keys.slice(1), values); - } - } - return; - } else { - values = inputs[keys]; - } - - if (values instanceof Array) { - length = values.length; - for (i = 0; i < length; i++) { - initializeBlock(values[i]); - } - } else { - initializeBlock(values); - } - }; - - var insertData = function (jagg, template, parent, name, key, value) { - var keys, values, data = getData(); - data = data[parent] || (data[parent] = {}); - data = data[name] || (data[name] = {}); - data = data[template] || (data[template] = {}); - - keys = data.keys || (data.keys = []); - values = data.values || (data.values = {}); - - keys.push(key); - values[key] = value; - }; - - - var printData = function (tmpls) { - var key, tmpl, keys, values, i, length; - for (key in tmpls) { - if (tmpls.hasOwnProperty(key)) { - tmpl = tmpls[key]; - keys = tmpl.keys; - values = tmpl.values; - length = keys.length; - for (i = 0; i < length; i++) { - print(values[keys[i]]); - } - } - } - }; - - var getUrlMapping = function (path) { - var urlMap = ctx.get("url.map"), url, configs, i, length, mapping, mappings, file; - if (urlMap) { - url = urlMap[path]; - return url ? url : path; - } - file = new File("/jaggery.conf"); - file.open("r"); - configs = parse(file.readAll()); - file.close(); - - urlMap = {}; - mappings = configs.urlMappings; - length = mappings.length; - for (i = 0; i < length; i++) { - mapping = mappings[i]; - urlMap[mapping.path] = mapping.url; - } - ctx.put("url.map", urlMap); - url = urlMap[path]; - return url ? url : path; - }; - - var getRequestSegments = function(){ - var href = request.getRequestURL() - var match = href.match(/^(https?\:)\/\/(([^:\/?#]*)(?:\:([0-9]+))?)(\/[^?#]*)(\?[^#]*|)(#.*|)$/); - return match && { - protocol: match[1], - host: match[2], - hostname: match[3], - port: match[4], - pathname: match[5], - search: match[6], - hash: match[7] - } - - }; - - var getMappedUrl = function (path) { - return getAbsoluteUrl(getUrlMapping(path)); - }; - - var getAbsoluteUrl = function (path) { - var host = "" - if(isReverseProxyEnabled()){ - host = "https://" + site.reverseProxy.host ; - }else{ - var match = getRequestSegments(); - var host = match.protocol + "//" + match.host; - } - return host + url(path); - }; - - var getSiteDomainFromRequest = function(){ - var match = href.match(/^(https?\:)\/\/(([^:\/?#]*)(?:\:([0-9]+))?)(\/[^?#]*)(\?[^#]*|)(#.*|)$/); - } - - var getHttpsUrl = function(path, parameters){ - var hostname = ""; - var requestSegments = getRequestSegments(); - mod = jagg.module("manager"); - hostname = mod.getHTTPsURL(); - hostname = hostname.replace("https://",""); - - // if the site is fronted by a proxy server - if(isReverseProxyEnabled()){ - hostname = site.reverseProxy.host ; - //if a custom https port is used - if(site.reverseProxy.hosts_port){ - hostname = hostname + ":" + site.reverseProxy.hosts_port; - } - } - - return "https://" + hostname + url(path, parameters); - } - - var url = function(path,parameters){ - var tail = ""; - if(parameters){ - var params = []; - for (var key in parameters) { - params.push(key+"="+parameters[key]) ; - } - if(/\?/.test(path)){ - tail = "&"; - } - else{ - tail = "?"; - } - tail = tail + params.join("&"); - } - return getSiteContext()+ path + tail; - }; - - var getTenantURLPrefix = function(tail) { - if (!tail) { - tail = ""; - } - if( site.reverseProxy.tenantHeader == null || - request.getHeader(site.reverseProxy.tenantHeader) == null){ - if(getTenantDomain() != null){ - return tail + "tenant=" + getTenantDomain(); - } - } - return ""; - } - - // following function will generate a url with the currently activated tenant - var urlTenanted = function(path, parameters){ - //if tenented add tenant url - if(getTenantDomain() != null && !(/(\?tenant\=|\&tenant\=)/i.test(path))){ - if(!parameters){ - parameters = {}; - } - parameters.tenant = getTenantDomain(); - } - if(isReverseProxyEnabled()){ - return getHttpsUrl(path, parameters) - } - return url(path,parameters) - }; - - var getCarbonProxyContextPath = function(){ - var CarbonUtils = Packages.org.wso2.carbon.utils.CarbonUtils; - var carbonUtils = new CarbonUtils(); - var context = carbonUtils.getServerConfiguration().getFirstProperty("ProxyContextPath"); - if(context != null) - return context; - else - return ''; - }; - - var isReverseProxyEnabled = function(){ - if(reverse_proxy != undefined){ - return reverse_proxy; - } - if(site.reverseProxy.enabled){ - if(site.reverseProxy.enabled == "auto"){ - var xfwd = request.getHeader("X-Forwarded-Host"); - if(xfwd != null){ - var xfwd = xfwd.split(",")[0]; - //if(xfwd.trim() == site.reverseProxy.host){ - reverse_proxy = true; - site.reverseProxy.host = xfwd.trim(); - //} - }else{ - reverse_proxy = false; - } - } - else{ - reverse_proxy = true; - } - } - else{ - reverse_proxy = false; - } - return reverse_proxy; - }; - - var getSiteContext = function(){ - if(isReverseProxyEnabled()){ - //If we use a custom domain mapping we will not use the context. - if( site.reverseProxy.tenantHeader != null && - request.getHeader(site.reverseProxy.tenantHeader) != null){ - return ""; - } - else{ - return site.reverseProxy.context - } - } - - var proxyContext = getCarbonProxyContextPath(); - return proxyContext + site.context; - }; - - var getRegistryPath = function(path){ - if(isReverseProxyEnabled()){ - if(site.reverseProxy.regContext != undefined){ - return site.reverseProxy.regContext + path; - } - return site.reverseProxy.context + path; - } - - var ProxyContextPath = getCarbonProxyContextPath(); - return ProxyContextPath + path; - } - - var module = function (name, module) { - if (module) { - return modules[name] = module; - } - module = modules[name]; - if (module) { - return module; - } - include(getModuleFile(name)); - return modules[name]; - }; - - var requir = function (path) { - var obj = requirs[path]; - return obj ? obj : requirs[path] = require(path); - }; - - var block = function (name, blok) { - var parent; - if (blok) { - return bloks[name] = blok; - } - blok = bloks[name]; - if (blok) { - return blok; - } - //we need to include and initialize - include(getBlockFile(name)); - blok = bloks[name]; - parent = blok.getParent; - if (parent) { - parent = parent(); - inheritParent(blok, parent); - } - if (blok.initialize) { - //TODO which to pass into initialize method - blok.initialize(getData()); - } - return bloks[name]; - }; - - var template = function (name, tmpl) { - var blok, parent, init; - if (tmpl) { - return templates[name] = tmpl; - } - tmpl = templates[name]; - if (tmpl) { - return tmpl; - } - - blok = block(name); - parent = blok.getParent; - if (parent) { - name = parent(); - } - - tmpl = templates[name]; - if (tmpl) { - return tmpl; - } - - include(getTemplateFile(name)); - init = initializer(name); - if (init.preInitialize) { - init.preInitialize(); - } - return templates[name]; - }; - - var initializer = function (name, init) { - var blok, parent; - if (init) { - return initializers[name] = init; - } - init = initializers[name]; - if (init) { - return init; - } - - blok = block(name); - parent = blok.getParent; - if (parent) { - name = parent(); - } - - init = initializers[name]; - if (init) { - return init; - } - - include(getInitializerFile(name)); - return initializers[name]; - }; - - var render = function (obj) { - var init, fn, inputs, outputs, name = obj.name, log = new Log(), blok; - setData(obj); - initializeBlock(obj); - include(getTemplateFile(name)); - fn = template(name); - if (!fn) { - log.error("Template header and footer includes are missing for : " + name); - } - inputs = obj.inputs; - blok = block(name); - if (blok.getOutputs) { - outputs = blok.getOutputs(inputs); - } else if (blok.getInputs) { - outputs = inputs; - } else { - outputs = {}; - } - init = initializer(name); - if (init.postInitialize) { - init.postInitialize(inputs, outputs); - } - fn(inputs, outputs, jagg); - }; - - var includeBlock = function (name, inputs) { - renderBlock(name, inputs, null, true); - }; - - var includeBlocks = function (bloks) { - if (!bloks) { - return; - } - - var i, d, length; - if (bloks instanceof Array) { - length = bloks.length; - for (i = 0; i < length; i++) { - d = bloks[i]; - renderBlock(d.name, d.inputs, d.outputs, false); - } - } else { - renderBlock(bloks.name, bloks.inputs, bloks.outputs, false); - } - }; - - var addHeaderCSS = function (template, key, css) { - css = ''; - insertData(this, template, "header", "css", key, css); - }; - - var addHeaderCSSCode = function (template, key, css) { - css = ''; - insertData(this, template, "header", "css", key, css); - }; - - var addHeaderJS = function (template, key, js) { - js = '\n'; - insertData(this, template, "header", "js", key, js); - }; - - var addHeaderJSCode = function (template, key, js) { - js = ''; - insertData(this, template, "header", "js", key, js); - }; - - var addHeaderCode = function (template, key, code) { - insertData(this, template, "header", "code", key, code); - }; - - var addFooterCSS = function (template, key, css) { - css = ''; - insertData(this, template, "footer", "css", key, css); - }; - - var addFooterCSSCode = function (template, key, css) { - css = ''; - insertData(this, template, "footer", "css", key, css); - }; - - var addFooterJS = function (template, key, js) { - js = '\t\n'; - insertData(this, template, "footer", "js", key, js); - }; - - var addFooterJSCode = function (template, key, js) { - js = ''; - insertData(this, template, "footer", "js", key, js); - }; - - var addFooterCode = function (template, key, code) { - insertData(this, template, "footer", "code", key, code); - }; - - var includeJag = function (path) { - include(getThemeFile(path)); - }; - - var getTenantDomain = function(){ - if(isReverseProxyEnabled()){ - // check if tenant header exists - if(site.reverseProxy.tenantHeader != undefined && site.reverseProxy.tenantHeader != null - && request.getHeader(site.reverseProxy.tenantHeader) != null){ - return request.getHeader(site.reverseProxy.tenantHeader); - } - } - return request.getParameter("tenant"); - } - - var setCSRFToken = function(){ - var cookie = request.getCookie("csrftoken"); - var user = jagg.getUser(); - var csrfuser = session.get('csrfuser'); - //set CSRF if it is not set + you need to refresh the token if the user has changed. - if( !cookie || user != csrfuser){ - //Use a secure random as the CSRF token. - var SecureRandom = Packages.java.security.SecureRandom; - var random = new SecureRandom(); - var BigInteger = Packages.java.math.BigInteger; - var token = new BigInteger(130, random).toString(32); - - var cookie= {'name':'csrftoken','value': token , 'maxAge': 86400, 'path':"/"}; - session.put('csrfuser',user); - response.addCookie(cookie); - } - } - - var isCSRFTokenValid = function(){ - var log = new Log(); - var cookie = request.getCookie("csrftoken"); - var token = request.getHeader("X-CSRFToken"); - var user = jagg.getUser(); - if(cookie == null || cookie.value == token){ - return true; - } - else{ - log.info("CSRF Token error at "+request.getRequestURI()); - return false; - } - } - - var validateInputs = function(config){ - var errors = []; - //set most used parapeters - config.name = { type:"name"}; - config.provider = { type:"provider"}; - config.version = { type:"name"}; - - for(var key in config){ - var value = request.getParameter(key); - if(value == null){ - if(config[key].required) - errors.push(key); - continue; - } - switch (config[key].type) { - case "url": - break; - case "input": - var regex = /([<>\"\'])/; - if(regex.test(value)) errors.push(key); - break; - case "number": - var regex = /^[0-9]*$/; - if(!regex.test(value)) errors.push(key); - break; - case "safetext": - var regex = /^[a-zA-Z0-9]*$/; - if(!regex.test(value)) errors.push(key); - break; - case "uuid": - var regex = /^[a-zA-Z0-9\-]*$/; - if(!regex.test(value)) errors.push(key); - break; - case "name": - var regex = /([~!#$;%^*+={}\|\\<>\"\'\/,])/; - if(regex.test(value)) errors.push(key); - break; - case "password": - var regex = /^[\S]{5,30}$/; - if(!regex.test(value)) errors.push(key); - break; - case "email": - var regex = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/; - if(!regex.test(value)) errors.push(key); - break; - case "provider": - var regex = /([~!#$;%^*+={}\|\\<>\"\'\,])/; - if(regex.test(value)) errors.push(key); - break; - default: - } - } - if(errors.length > 0){ - return errors; - } - else{ - return true; - } - } - - return { - setUser:setUser, - getUser:getUser, - block:block, - module:module, - initializer:initializer, - includeBlock:includeBlock, - includeBlocks:includeBlocks, - render:render, - template:template, - require:requir, - getAbsoluteUrl:getAbsoluteUrl, - getMappedUrl:getMappedUrl, - printData:printData, - getUserTheme:getUserTheme, - getThemeFile:getThemeFile, - getModulesDir:getModulesDir, - data:getData, - addHeaderCSS:addHeaderCSS, - addHeaderCSSCode:addHeaderCSSCode, - addHeaderJS:addHeaderJS, - addHeaderJSCode:addHeaderJSCode, - addHeaderCode:addHeaderCode, - addFooterCSS:addFooterCSS, - addFooterCSSCode:addFooterCSSCode, - addFooterJS:addFooterJS, - addFooterJSCode:addFooterJSCode, - addFooterCode:addFooterCode, - includeJag:includeJag, - url:url, - urlTenanted:urlTenanted, - getRegistryPath:getRegistryPath, - getSiteContext:getSiteContext, - getHttpsUrl:getHttpsUrl, - getTenantDomain:getTenantDomain, - setCSRFToken:setCSRFToken, - isCSRFTokenValid:isCSRFTokenValid, - validateInputs:validateInputs, - getTenantURLPrefix:getTenantURLPrefix - }; - -}()); -%> diff --git a/modules/distribution/src/repository/jaggeryapps/api-store/manager.jag b/modules/distribution/src/repository/jaggeryapps/api-store/manager.jag deleted file mode 100644 index 318c1550..00000000 --- a/modules/distribution/src/repository/jaggeryapps/api-store/manager.jag +++ /dev/null @@ -1,168 +0,0 @@ -<% -var getAuthServerURL = function() { - return getAPIStoreObj().getAuthServerURL(); -}; - -var getHTTPsURL = function() { - return getAPIStoreObj().getHTTPsURL(request.getRequestURL()); -}; - -var getHTTPURL = function() { - return getAPIStoreObj().getHTTPURL(); -}; - -var getHostname = function() { - return getAPIStoreObj().getHostName(); -}; - -var getAPIPublisherURL = function() { - var result,log=new Log(); - var store = getAPIStoreObj(); - try { - result = store.getAPIPublisherURL(); - if (log.isDebugEnabled()) { - log.debug("getAPIPublisherURL : "); - } - return { - error:false, - url:result - }; - } catch (e) { - return { - error:true, - message:e.message.split(":")[1] - }; - } - -}; - -var getServer = function() { - return { - server : "localhost", - port : "9443" - }; -}; - -var isSelfSignupEnabled = function(){ - return getAPIStoreObj().isSelfSignupEnabled(); -}; - -var isSelfSignupEnabledForTenantUser = function(tenantDomain){ - var log = new Log(); - try { - - if (tenantDomain == null) { - return getAPIStoreObj().isSelfSignupEnabledForTenant("carbon.super"); - } else { - return getAPIStoreObj().isSelfSignupEnabledForTenant(tenantDomain); - } - } catch (e) { - log.error(e.message); - return false; - } - - -}; - -var getAdminCookie = function() { - //TODO : this should be set in the Context during the deployment - -}; - -var getAPIStoreObj = function() { - - var tenantDomain = jagg.getTenantDomain(); - var user = jagg.getUser(); - var store; - if (user == null) { - store = require('apimstore'); - var storeHostObj = new store.APIStore(); - if(tenantDomain != null && tenantDomain != ""){ - storeHostObj.loadRegistryOfTenant(tenantDomain); - } - return storeHostObj; - } else { - store = require('apimstore'); - return new store.APIStore(user.username); - } -}; - -var getAPIConsumerObj = function() { - var user = jagg.getUser(); - - var APIManagerFactory = Packages.org.wso2.carbon.apimgt.impl.APIManagerFactory; - - return APIManagerFactory.getInstance().getAPIConsumer(user); -}; - -var loadTenantRegistry = function (tenantDomain) { - try { - if (tenantDomain != null && tenantDomain != "") { - getAPIStoreObj().loadRegistryOfTenant(tenantDomain); - return - { - error:false - } - ; - } - } catch (e) { - return { - error:true, - message:e.message - }; - } -}; - -var loadTenantAxisConfiguration = function (tenantDomain) { - - try { - if (tenantDomain != null && tenantDomain != "") { - - getAPIStoreObj().loadAxisConfigOfTenant(String(tenantDomain)); - return - { - error:false - } - ; - } - } catch (e) { - return { - error:true, - message:e.message - }; - } -}; - -var getActiveTenantDomains=function(){ - var tenantDomains, - log = new Log(), - store = jagg.module("manager").getAPIStoreObj(); - - try { - tenantDomains = store.getActiveTenantDomains(); - tenantDomains = parse(stringify(tenantDomains)); - if (log.isDebugEnabled()) { - log.debug("isTenantMode : " + stringify(api)); - } - - return { - error:false, - tenantDomains:tenantDomains - }; - } catch (e) { - //log.error(e.message); - return { - error:true, - tenantDomains:null, - message:e.message - }; - } - -}; - -var getUsageClient = function(){ - var user = jagg.getUser(); - return org.wso2.carbon.apimgt.usage.client.UsageClient.getClient(user); -} - -%> diff --git a/modules/distribution/src/repository/modules/encode/module.xml b/modules/distribution/src/repository/modules/encode/module.xml old mode 100644 new mode 100755 diff --git a/modules/distribution/src/repository/modules/lifecycle/module.xml b/modules/distribution/src/repository/modules/lifecycle/module.xml new file mode 100755 index 00000000..e063a048 --- /dev/null +++ b/modules/distribution/src/repository/modules/lifecycle/module.xml @@ -0,0 +1,10 @@ + + + + diff --git a/modules/distribution/src/repository/modules/lifecycle/scripts/api/api.js b/modules/distribution/src/repository/modules/lifecycle/scripts/api/api.js new file mode 100755 index 00000000..4cd81d5e --- /dev/null +++ b/modules/distribution/src/repository/modules/lifecycle/scripts/api/api.js @@ -0,0 +1,89 @@ +/* + * Copyright (c) WSO2 Inc. (http://wso2.com) All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * The api namespace exposes methods to retrieve information individual states of the lifecycles + * deployed to the Governance Registry + * @namespace + * @example + * var api = require('lifecycle').api; + * var superTenantId=-1234; + * + * api.getLifecycleList(superTenantId); + * @requires store + * @requires event + * @requires utils + * @requires Packages.org.wso2.carbon.governance.lcm.util.CommonUtil + */ +var api = {}; +(function (api, core) { + var log = new Log('lifecycle'); + + /** + * Represents a class which models a lifecycle + * @constructor + * @param {Object} definiton The JSON definition of a lifecycle + * @memberOf api + */ + function Lifecycle(definiton) { + this.definition = definiton; + } + + /** + * Returns the JSON definition for the lifecycle managed by the instance + * @return {Object} Lifecycle definition + */ + Lifecycle.prototype.getDefinition = function () { + return this.definition; + }; + + /** + * Returns the name of the lifecycle + * @return {String} The name of the lifecycle + */ + Lifecycle.prototype.getName = function () { + if (!this.definition.name) { + throw 'Unable to locate name attribute in the lifecycle definition '; + } + return this.definition.name; + }; + + + /** + * Returns an instance of the Lifecycle class + * @example + * var lc = api.getLifecycle('SimpleLifeCycle',-1234); + * lc.nextStates('initial'); + * @param {String} lifecycleName The name of the lifecycle + * @param {Number} tenantDomain The tenant ID + * @return {Object} An instance of the Lifecycle class + * @throws Unable to locate lifecycle without a tenant ID + */ + api.getLifecycle = function (tenantDomain, APIProvider) { + if (!tenantDomain) { + throw 'Unable to locate lifecycle without a tenantDomain'; + } + var lcJSON = core.getJSONDef(tenantDomain,APIProvider); + + if (!lcJSON) { + log.warn('Unable to locate lifecycle for the tenant: ' + tenantDomain); + return null; //TODO: This should throw an exception + } + return new Lifecycle(lcJSON); + }; + + +}(api, core)); diff --git a/modules/distribution/src/repository/modules/lifecycle/scripts/core/core.js b/modules/distribution/src/repository/modules/lifecycle/scripts/core/core.js new file mode 100755 index 00000000..bf224cba --- /dev/null +++ b/modules/distribution/src/repository/modules/lifecycle/scripts/core/core.js @@ -0,0 +1,158 @@ + +/* + * Copyright (c) WSO2 Inc. (http://wso2.com) All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * The core namespace contains methods that load the lifecycle definitions from the registry + * @namespace + * @example + * var core = require('lifecycle').core; + * core.init(); //Should only be called once in the lifecycle of an app.Ideally in an init script + * @requires store + * @requires event + * @requires utils + * @requires Packages.org.wso2.carbon.governance.lcm.util.CommonUtil + */ +var core = {}; +(function(core) { + var CommonUtil = Packages.org.wso2.carbon.governance.lcm.util.CommonUtil; + var LC_MAP = 'lc.map'; + var EMPTY = ''; + var log = new Log('lifecycle'); + var addRawLifecycle = function(lifecycleName, content, tenantId) { + var lcMap = core.configs(tenantId); + if (!lcMap.raw) { + lcMap.raw = {}; + } + lcMap.raw[lifecycleName] = new String(content); + }; + var addJsonLifecycle = function(lifecycleName, definition, tenantId) { + var lcMap = core.configs(tenantId); + if (!lcMap.json) { + lcMap.json = {}; + } + lcMap.json[lifecycleName] = definition; + }; + + /** + * Converts array references to properties.The JSON conversion produces some properties which need to be accessed + * using array indexes. + * @param {Object} obj Unaltered JSON object + * @return {Object} JSON object with resolved array references + */ + var transformJSONLifecycle = function(obj) { + obj.configuration = obj.configuration[0]; + obj.configuration.lifecycle = obj.configuration.lifecycle[0]; + obj.configuration.lifecycle.scxml = obj.configuration.lifecycle.scxml[0]; + var states = obj.configuration.lifecycle.scxml.state; + var stateObj = {}; + var state; + for (var index = 0; index < states.length; index++) { + state = states[index]; + stateObj[state.id.toLowerCase()] = state; + if (stateObj[state.id.toLowerCase()].datamodel) { + stateObj[state.id.toLowerCase()].datamodel = stateObj[state.id.toLowerCase()].datamodel[0]; + } + } + obj.configuration.lifecycle.scxml.state = stateObj; + return obj; + }; + /* + Creates an xml file from the contents of an Rxt file + @rxtFile: An rxt file + @return: An xml file + */ + var createXml = function(content) { + var fixedContent = content.replace('', EMPTY).replace('', EMPTY); + return new XML(fixedContent); + }; + var parseLifeycle = function(content) { + var ref = require('utils').xml; + var obj = ref.convertE4XtoJSON(createXml(content)); + return obj; + }; + var loadLifecycles = function(tenantDomain,APIProvider) { + + //Obtain the definition + content = APIProvider.getLifecycleConfiguration(tenantDomain); + //Store the raw lifecycle + addRawLifecycle("APILifeCycle", content, tenantDomain); + //Parse the raw lifecycle definition into a json + var jsonLifecycle = parseLifeycle(new String(content)); + //Correct any array references + jsonLifecycle = transformJSONLifecycle(jsonLifecycle); + //Store the json lifecycle definition + addJsonLifecycle("APILifeCycle", jsonLifecycle, tenantDomain); + if(log.isDebugEnabled()){ + log.debug('Found lifecycle: ' + jsonLifecycle.name + ' tenant: ' + tenantDomain); + } + + }; + var init = function(tenantDomain,APIProvider) { + loadLifecycles(tenantDomain,APIProvider); + }; + core.force = function(tenantDomain,APIProvider) { + init(tenantDomain,APIProvider); + }; + + /** + * Returns the lifecycle map which is stored in the application context + * The map is maintained on a per user basis + * @param {Number} tenantId The tenant ID + * @return {Object} The lifecycle map + */ + core.configs = function(tenantDomain) { + var lcMap = application.get(LC_MAP); + if (!lcMap) { + log.debug('Creating lcMap in the application context'); + lcMap = {}; + application.put(LC_MAP, lcMap); + } + if (!lcMap[tenantDomain]) { + log.debug('Creating lcMap for the tenant: ' + tenantDomain + ' in application context'); + lcMap[tenantDomain] = {}; + } + return lcMap[tenantDomain]; + }; + + /** + * Returns the JSON definition of the provided lifecycle for the given tenant + * @param {Number} tenantDomain The tenant Domain + * @return {Object} The JSON definitin of the lifecycle + * @throws There is no lifcycle information for the tenant + * @throws There is no json lifecycle information for the lifecycle of the tenant + */ + core.getJSONDef = function(tenantDomain,APIProvider) { + var lifecycleName='APILifeCycle'; + var lcMap = core.configs(tenantDomain); + if (!lcMap) { + throw 'There is no lifecycle information for the tenant: ' + tenantDomain; + } + //if (!lcMap.json) { + // throw 'There is no json lifecycle information for the lifecycle of tenant: ' + tenantDomain; + //} + if (!lcMap.json) { + core.force(tenantDomain,APIProvider); + lcMap = core.configs(tenantDomain); + if (!lcMap.json[lifecycleName]){ + throw 'There is no lifecycle information for '; + } + } + return lcMap.json[lifecycleName]; + }; + + +}(core)); diff --git a/modules/distribution/src/repository/modules/sso/module.xml b/modules/distribution/src/repository/modules/sso/module.xml old mode 100644 new mode 100755 diff --git a/modules/distribution/src/repository/modules/sso/scripts/sso.client.js b/modules/distribution/src/repository/modules/sso/scripts/sso.client.js index 272f0897..27327a95 100644 --- a/modules/distribution/src/repository/modules/sso/scripts/sso.client.js +++ b/modules/distribution/src/repository/modules/sso/scripts/sso.client.js @@ -26,123 +26,123 @@ var client = {}; (function (client) { - var Util = Packages.org.jaggeryjs.modules.sso.common.util.Util, - carbon = require('carbon'), - log = new Log(); - - /** - * obtains an encoded saml response and return a decoded/unmarshalled saml obj - * @param samlResp - * @return {*} - */ - client.getSamlObject = function (samlResp) { - var decodedResp = Util.decode(samlResp); - return Util.unmarshall(decodedResp); - }; - - /** - * validating the signature of the response saml object - */ - client.validateSignature = function (samlObj, config) { - var tDomain = Util.getDomainName(samlObj); - var tId = carbon.server.tenantId({domain: tDomain}); - - return Util.validateSignature(samlObj, - config.KEY_STORE_NAME, config.KEY_STORE_PASSWORD, config.IDP_ALIAS, tId, tDomain); - }; - - /** - * Checking if the request is a logout call - */ - client.isLogoutRequest = function (samlObj) { - return samlObj instanceof Packages.org.opensaml.saml2.core.LogoutRequest; - }; - - /** - * Checking if the request is a logout call - */ - client.isLogoutResponse = function (samlObj) { - return samlObj instanceof Packages.org.opensaml.saml2.core.LogoutResponse; - }; - - /** - * getting url encoded saml authentication request - * @param issuerId - */ - client.getEncodedSAMLAuthRequest = function (issuerId) { - return Util.encode( - Util.marshall( - new Packages.org.jaggeryjs.modules.sso.common.builders.AuthReqBuilder().buildAuthenticationRequest(issuerId) - )); - }; - - /** - * get url encoded saml logout request - */ - client.getEncodedSAMLLogoutRequest = function (user, sessionIndex, issuerId) { - return Util.encode( - Util.marshall( - new Packages.org.jaggeryjs.modules.sso.common.builders.LogoutRequestBuilder().buildLogoutRequest(user, sessionIndex, - Packages.org.jaggeryjs.modules.sso.common.constants.SSOConstants.LOGOUT_USER, - issuerId))); - }; - - /** - * Reads the returning SAML login response and populates a session info object - */ - client.decodeSAMLLoginResponse = function (samlObj, samlResp, sessionId) { - var samlSessionObj = { - // sessionId, loggedInUser, sessionIndex, samlToken - }; - - if (samlObj instanceof Packages.org.opensaml.saml2.core.Response) { - - var assertions = samlObj.getAssertions(); - - // extract the session index - if (assertions != null && assertions.size() > 0) { - var authenticationStatements = assertions.get(0).getAuthnStatements(); - var authnStatement = authenticationStatements.get(0); - if (authnStatement != null) { - if (authnStatement.getSessionIndex() != null) { - samlSessionObj.sessionIndex = authnStatement.getSessionIndex(); - } - } - } - - // extract the username - if (assertions != null && assertions.size() > 0) { - var subject = assertions.get(0).getSubject(); - if (subject != null) { - if (subject.getNameID() != null) { - samlSessionObj.loggedInUser = subject.getNameID().getValue(); - } - } - } - samlSessionObj.sessionId = sessionId; - samlSessionObj.samlToken = samlResp; - } - - return samlSessionObj; - }; - - /** - * This method is to get the session index when a single logout happens - * The IDP sends a logout request to the ACS with the session index, so that - * the app can invalidate the associated HTTP Session - */ - client.decodeSAMLLogoutRequest = function (samlObj) { - var sessionIndex = null; - - if (samlObj instanceof org.opensaml.saml2.core.LogoutRequest) { - var sessionIndexes = samlObj.getSessionIndexes(); - if (sessionIndexes != null && sessionIndexes.size() > 0) { - sessionIndex = sessionIndexes.get(0).getSessionIndex(); - } - } - - return sessionIndex; - - }; + var Util = Packages.org.jaggeryjs.modules.sso.common.util.Util, + carbon = require('carbon'), + log = new Log(); + + /** + * obtains an encoded saml response and return a decoded/unmarshalled saml obj + * @param samlResp + * @return {*} + */ + client.getSamlObject = function (samlResp) { + var decodedResp = Util.decode(samlResp); + return Util.unmarshall(decodedResp); + }; + + /** + * validating the signature of the response saml object + */ + client.validateSignature = function (samlObj, config) { + var tDomain = Util.getDomainName(samlObj); + var tId = carbon.server.tenantId({domain: tDomain}); + + return Util.validateSignature(samlObj, + config.KEY_STORE_NAME, config.KEY_STORE_PASSWORD, config.IDP_ALIAS, tId, tDomain); + }; + + /** + * Checking if the request is a logout call + */ + client.isLogoutRequest = function (samlObj) { + return samlObj instanceof Packages.org.opensaml.saml2.core.LogoutRequest; + }; + + /** + * Checking if the request is a logout call + */ + client.isLogoutResponse = function (samlObj) { + return samlObj instanceof Packages.org.opensaml.saml2.core.LogoutResponse; + }; + + /** + * getting url encoded saml authentication request + * @param issuerId + */ + client.getEncodedSAMLAuthRequest = function (issuerId) { + return Util.encode( + Util.marshall( + new Packages.org.jaggeryjs.modules.sso.common.builders.AuthReqBuilder().buildAuthenticationRequest(issuerId) + )); + }; + + /** + * get url encoded saml logout request + */ + client.getEncodedSAMLLogoutRequest = function (user, sessionIndex, issuerId) { + return Util.encode( + Util.marshall( + new Packages.org.jaggeryjs.modules.sso.common.builders.LogoutRequestBuilder().buildLogoutRequest(user, sessionIndex, + Packages.org.jaggeryjs.modules.sso.common.constants.SSOConstants.LOGOUT_USER, + issuerId))); + }; + + /** + * Reads the returning SAML login response and populates a session info object + */ + client.decodeSAMLLoginResponse = function (samlObj, samlResp, sessionId) { + var samlSessionObj = { + // sessionId, loggedInUser, sessionIndex, samlToken + }; + + if (samlObj instanceof Packages.org.opensaml.saml2.core.Response) { + + var assertions = samlObj.getAssertions(); + + // extract the session index + if (assertions != null && assertions.size() > 0) { + var authenticationStatements = assertions.get(0).getAuthnStatements(); + var authnStatement = authenticationStatements.get(0); + if (authnStatement != null) { + if (authnStatement.getSessionIndex() != null) { + samlSessionObj.sessionIndex = authnStatement.getSessionIndex(); + } + } + } + + // extract the username + if (assertions != null && assertions.size() > 0) { + var subject = assertions.get(0).getSubject(); + if (subject != null) { + if (subject.getNameID() != null) { + samlSessionObj.loggedInUser = subject.getNameID().getValue(); + } + } + } + samlSessionObj.sessionId = sessionId; + samlSessionObj.samlToken = samlResp; + } + + return samlSessionObj; + }; + + /** + * This method is to get the session index when a single logout happens + * The IDP sends a logout request to the ACS with the session index, so that + * the app can invalidate the associated HTTP Session + */ + client.decodeSAMLLogoutRequest = function (samlObj) { + var sessionIndex = null; + + if (samlObj instanceof org.opensaml.saml2.core.LogoutRequest) { + var sessionIndexes = samlObj.getSessionIndexes(); + if (sessionIndexes != null && sessionIndexes.size() > 0) { + sessionIndex = sessionIndexes.get(0).getSessionIndex(); + } + } + + return sessionIndex; + + }; }(client)); \ No newline at end of file diff --git a/modules/distribution/src/repository/modules/tenantmanager/module.xml b/modules/distribution/src/repository/modules/tenantmanager/module.xml old mode 100644 new mode 100755 diff --git a/modules/distribution/src/repository/modules/utils/module.xml b/modules/distribution/src/repository/modules/utils/module.xml new file mode 100755 index 00000000..98050dee --- /dev/null +++ b/modules/distribution/src/repository/modules/utils/module.xml @@ -0,0 +1,6 @@ + + + diff --git a/modules/distribution/src/repository/modules/utils/scripts/xml/xml.js b/modules/distribution/src/repository/modules/utils/scripts/xml/xml.js new file mode 100755 index 00000000..7caefe9d --- /dev/null +++ b/modules/distribution/src/repository/modules/utils/scripts/xml/xml.js @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2005-2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +var xml = {}; + +(function () { + + var log=new Log('util.xml') + + /* + The method is used to create a JSON object using + an xml object. + @xmlElement: An xml element object to be processed + @return: A pseudo object containing the properties of the + xml element. + */ + var createJSONObject = function (xmlElement) { + + var pseudo = {}; + + //Extract all attributes + var attributes = xmlElement.@*; + + //Fill the pseudo object with the attributes of the element + for (var attributeKey in attributes) { + var attribute = attributes[attributeKey]; + pseudo[attribute.localName()] = attribute.toString(); + } + + return pseudo; + }; + + /* + The function converts an E4X Xml object to a JSON object + This function has been adapted from the work of Oleg Podsechin available at + https://gist.github.com/olegp/642667 + It uses a slightly modified version of his algorithm , therefore + all credit should be attributed to Oleg Podsechin. + IMPORTANT: + 1. It does not create a 1..1 mapping due to the differences + between Xml and JSON.It is IMPORTANT that you verify the structure + of the object generated before using it. + 2. The input xml object must not contain the xml header information + This is a known bug 336551 (Mozilla Developer Network) + Source: https://developer.mozilla.org/en/docs/E4X + Please remove the header prior to sending the xml object for processing. + @root: A starting element in an E4X Xml object + @return: A JSON object mirroring the provided Xml object + */ + var recursiveConvertE4XtoJSON = function (root) { + + log.debug('Root: ' + root.localName()); + + //Obtain child nodes + var children = root.*; + + //The number of children + var numChildren = children.length(); + + //No children + if (numChildren == 0) { + + //Extract contents + return createJSONObject(root); + } + else { + + //Create an empty object + var rootObject = createJSONObject(root); + + //Could be multiple children + for (var childElementKey in children) { + + var child = children[childElementKey]; + + log.debug('Examining child: ' + child.localName()); + + //If the child just contains a single value then stop + if (child.localName() == undefined) { + + log.debug('Child is undefined: ' + child.toString()); + + //Change the object to just a key value pair + rootObject[root.localName()] = child.toString(); + return rootObject; + } + + //Make a recursive call to construct the child element + var createdObject = recursiveConvertE4XtoJSON(child); + + log.debug('Converted object: ' + stringify(createdObject)); + + //Check if the root object has the property + if (rootObject.hasOwnProperty(child.localName())) { + + log.debug('key: ' + child.localName() + ' already present.'); + rootObject[child.localName()].push(createdObject); + } + else { + + log.debug('key: ' + child.localName() + ' not present.'); + rootObject[child.localName()] = []; + rootObject[child.localName()].push(createdObject); + + } + } + + log.debug('root: ' + root.localName()); + + return rootObject; + } + }; + + /** + * The function is used to convert an E4X xml to JSON + * @param root + */ + xml.convertE4XtoJSON = function (root) { + return recursiveConvertE4XtoJSON(root); + }; + + +}());