commit
12c12067c7
@ -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
|
@ -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
|
Binary file not shown.
@ -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 = '<link type="text/css" rel="stylesheet" href="' + url(getThemeFile(css)) + '"/>';
|
|
||||||
insertData(this, template, "header", "css", key, css);
|
|
||||||
};
|
|
||||||
|
|
||||||
var addHeaderCSSCode = function (template, key, css) {
|
|
||||||
css = '<style type="text/css">' + css + '</style>';
|
|
||||||
insertData(this, template, "header", "css", key, css);
|
|
||||||
};
|
|
||||||
|
|
||||||
var addHeaderJS = function (template, key, js) {
|
|
||||||
js = '<script type="text/javascript" src="' + url(getThemeFile(js)) + '"></script>\n';
|
|
||||||
insertData(this, template, "header", "js", key, js);
|
|
||||||
};
|
|
||||||
|
|
||||||
var addHeaderJSCode = function (template, key, js) {
|
|
||||||
js = '<script type="text/javascript">' + js + '</script>';
|
|
||||||
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 = '<link type="text/css" rel="stylesheet" href="' + url(getThemeFile(css)) + '"/>';
|
|
||||||
insertData(this, template, "footer", "css", key, css);
|
|
||||||
};
|
|
||||||
|
|
||||||
var addFooterCSSCode = function (template, key, css) {
|
|
||||||
css = '<style type="text/css">' + css + '</style>';
|
|
||||||
insertData(this, template, "footer", "css", key, css);
|
|
||||||
};
|
|
||||||
|
|
||||||
var addFooterJS = function (template, key, js) {
|
|
||||||
js = '\t<script type="text/javascript" src="' + url(getThemeFile(js)) + '"></script>\n';
|
|
||||||
insertData(this, template, "footer", "js", key, js);
|
|
||||||
};
|
|
||||||
|
|
||||||
var addFooterJSCode = function (template, key, js) {
|
|
||||||
js = '<script type="text/javascript">' + js + '</script>';
|
|
||||||
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
|
|
||||||
};
|
|
||||||
|
|
||||||
}());
|
|
||||||
%>
|
|
@ -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);
|
|
||||||
}
|
|
||||||
|
|
||||||
%>
|
|
@ -0,0 +1,10 @@
|
|||||||
|
<module name="lifecycle" xmlns="http://wso2.org/projects/jaggery/module.xml">
|
||||||
|
<script>
|
||||||
|
<name>core</name>
|
||||||
|
<path>scripts/core/core.js</path>
|
||||||
|
</script>
|
||||||
|
<script>
|
||||||
|
<name>api</name>
|
||||||
|
<path>scripts/api/api.js</path>
|
||||||
|
</script>
|
||||||
|
</module>
|
@ -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));
|
@ -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('<xml version="1.0"?>', EMPTY).replace('</xml>', 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));
|
@ -0,0 +1,6 @@
|
|||||||
|
<module name="utils" xmlns="http://wso2.org/projects/jaggery/module.xml">
|
||||||
|
<script>
|
||||||
|
<name>xml</name>
|
||||||
|
<path>scripts/xml/xml.js</path>
|
||||||
|
</script>
|
||||||
|
</module>
|
@ -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);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
}());
|
Loading…
Reference in new issue