@ -1,9 +1,8 @@
|
|||||||
{{authorized}}
|
|
||||||
{{layout "fluid"}}
|
{{layout "fluid"}}
|
||||||
{{#zone "title"}}
|
{{#zone "title"}}
|
||||||
WSO2 DC | FireAlarm
|
WSO2 DC | FireAlarm
|
||||||
{{/zone}}
|
{{/zone}}
|
||||||
{{#zone "body"}}
|
{{#zone "body"}}
|
||||||
{{unit "appbar"}}
|
{{unit "appbar"}}
|
||||||
{{unit "mydevice"}}
|
{{unit "sensebot"}}
|
||||||
{{/zone}}
|
{{/zone}}
|
Before Width: | Height: | Size: 516 B After Width: | Height: | Size: 516 B |
Before Width: | Height: | Size: 451 B After Width: | Height: | Size: 451 B |
Before Width: | Height: | Size: 650 B After Width: | Height: | Size: 650 B |
Before Width: | Height: | Size: 373 B After Width: | Height: | Size: 373 B |
After Width: | Height: | Size: 8.0 KiB |
After Width: | Height: | Size: 15 KiB |
@ -1,50 +0,0 @@
|
|||||||
<%
|
|
||||||
/*
|
|
||||||
* Copyright (c) 2015, 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 uri = request.getRequestURI();
|
|
||||||
var uriMatcher = new URIMatcher(String(uri));
|
|
||||||
|
|
||||||
var log = new Log("api/device-api.jag");
|
|
||||||
|
|
||||||
var constants = require("/modules/constants.js");
|
|
||||||
var dcProps = require('/config/dc-props.js').config();
|
|
||||||
var downloadModule = require("/modules/download.js").downloadModule;
|
|
||||||
var utility = require("/modules/utility.js").utility;
|
|
||||||
|
|
||||||
var carbon = require('carbon');
|
|
||||||
var carbonHttpServletTransport = carbon.server.address('http');
|
|
||||||
var carbonHttpsServletTransport = carbon.server.address('https');
|
|
||||||
|
|
||||||
var result;
|
|
||||||
|
|
||||||
if (uriMatcher.match("/{context}/api/device/sketch/")) {
|
|
||||||
sketchType = request.getParameter("type");
|
|
||||||
if(!sketchType){log.error("Sketch Type is empty");}
|
|
||||||
|
|
||||||
senseBotManagerService = carbonHttpsServletTransport+"/iotdevices/SenseBotManager";
|
|
||||||
sketchDownloadEndPoint = senseBotManagerService + "/downloadSketch/device/";
|
|
||||||
response.sendRedirect(sketchDownloadEndPoint + sketchType + "?owner=anonymous");
|
|
||||||
exit();
|
|
||||||
}
|
|
||||||
|
|
||||||
// returning the result.
|
|
||||||
if (result) {
|
|
||||||
print(result);
|
|
||||||
}
|
|
||||||
%>
|
|
@ -1,144 +0,0 @@
|
|||||||
<%
|
|
||||||
/*
|
|
||||||
* Copyright (c) 2015, 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 uri = request.getRequestURI();
|
|
||||||
var uriMatcher = new URIMatcher(String(uri));
|
|
||||||
|
|
||||||
var log = new Log("api/stats-api.jag");
|
|
||||||
|
|
||||||
var constants = require("/modules/constants.js");
|
|
||||||
var dcProps = require('/config/dc-props.js').config();
|
|
||||||
var utility = require("/modules/utility.js").utility;
|
|
||||||
|
|
||||||
var result;
|
|
||||||
var statsClient = new Packages.org.wso2.carbon.device.mgt.iot.usage.statistics.IoTUsageStatisticsClient;
|
|
||||||
|
|
||||||
if (uriMatcher.match("/{context}/api/stats")) {
|
|
||||||
|
|
||||||
var deviceId = request.getParameter("deviceId");
|
|
||||||
var from = request.getParameter("from");
|
|
||||||
var to = request.getParameter("to");
|
|
||||||
|
|
||||||
log.info("deviceId : " + deviceId + " from : " + from + " to : " + to);
|
|
||||||
|
|
||||||
result = getData(getUsername(), deviceId, from, to);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// returning the result.
|
|
||||||
if (result) {
|
|
||||||
print(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
function getUsername() {
|
|
||||||
|
|
||||||
var user = session.get(constants.USER_SESSION_KEY);
|
|
||||||
|
|
||||||
if (user) {
|
|
||||||
log.info("username: "+ user.username);
|
|
||||||
return user.username;
|
|
||||||
} else {
|
|
||||||
log.info("username is null");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
function getData(user, deviceId, from, to) {
|
|
||||||
|
|
||||||
result = new Object();
|
|
||||||
|
|
||||||
result['sonarData'] = getSensorData("SONAR_SENSOR_SUMMARY","sonar",user, deviceId, from, to);
|
|
||||||
result['motionData'] = getSensorData("PIR_MOTION_SENSOR_SUMMARY","motion",user, deviceId, from, to);
|
|
||||||
result['lightData'] = getSensorData("LDR_LIGHT_SENSOR_SUMMARY","light",user, deviceId, from, to);
|
|
||||||
result['temperatureData'] = getSensorData("DEVICE_TEMPERATURE_SUMMARY","TEMPERATURE",user, deviceId, from, to);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
function getSensorData(table, column, user, deviceId, from, to) {
|
|
||||||
|
|
||||||
var fetchedData = statsClient.getDeviceStats(table, column, user, deviceId, from, to);
|
|
||||||
|
|
||||||
var temperatureData = [];
|
|
||||||
|
|
||||||
for (var i = 0; i < fetchedData.size(); i++) {
|
|
||||||
temperatureData.push({
|
|
||||||
time: fetchedData.get(i).getTime(),
|
|
||||||
value: fetchedData.get(i).getValue()
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return temperatureData;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ------------- Sample data generation -----------------
|
|
||||||
|
|
||||||
function getSampleData() {
|
|
||||||
|
|
||||||
result = new Object();
|
|
||||||
|
|
||||||
result['bulbStatusData'] = getBulbStatusSampleData();
|
|
||||||
result['fanStatusData'] = getFanStatusSampleData();
|
|
||||||
result['temperatureData'] = getTemperatureSampleData();
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getBulbStatusSampleData(from, to) {
|
|
||||||
|
|
||||||
var bulbStatusData = [];
|
|
||||||
|
|
||||||
for (var i = 0; i < 100; i++) {
|
|
||||||
bulbStatusData.push({
|
|
||||||
time: Date.now() + (i * 1000),
|
|
||||||
value: Math.floor((Math.random() * 100) + 1) % 2 == 0 ? 'ON' : 'OFF'});
|
|
||||||
}
|
|
||||||
|
|
||||||
return bulbStatusData;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
function getFanStatusSampleData(from, to) {
|
|
||||||
|
|
||||||
var fanStatusData = [];
|
|
||||||
|
|
||||||
for (var i = 0; i < 100; i++) {
|
|
||||||
fanStatusData.push({time: Date.now() + (i * 1000), value: Math.floor((Math.random() * 100) + 1) % 2 == 0 ? 'ON' : 'OFF'});
|
|
||||||
}
|
|
||||||
|
|
||||||
return fanStatusData;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getTemperatureSampleData(from, to) {
|
|
||||||
|
|
||||||
var temperatureData = [];
|
|
||||||
|
|
||||||
for (var i = 0; i < 100; i++) {
|
|
||||||
temperatureData.push({time: Date.now() + (i * 1000), value: Math.random() * 100});
|
|
||||||
}
|
|
||||||
|
|
||||||
return temperatureData;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
%>
|
|
@ -1,16 +0,0 @@
|
|||||||
{
|
|
||||||
"appContext" : "/iot/",
|
|
||||||
"apiContext" : "api",
|
|
||||||
"httpsURL": "%https.ip%",
|
|
||||||
"httpURL": "%http.ip%",
|
|
||||||
"ssoConfiguration": {
|
|
||||||
"enabled": false,
|
|
||||||
"issuer": "iot",
|
|
||||||
"appName": "iot",
|
|
||||||
"identityProviderURL": "%https.ip%/sso/samlsso.jag",
|
|
||||||
"responseSigningEnabled": "true",
|
|
||||||
"keyStorePassword": "wso2carbon",
|
|
||||||
"identityAlias": "wso2carbon",
|
|
||||||
"keyStoreName": "/repository/resources/security/wso2carbon.jks"
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,37 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015, 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 config = function () {
|
|
||||||
var conf = application.get("PINCH_CONFIG");
|
|
||||||
if (!conf) {//if not in cache
|
|
||||||
var pinch = require('/modules/pinch.min.js').pinch;
|
|
||||||
var server = require('carbon').server;
|
|
||||||
var config = require('/config/config.json');
|
|
||||||
pinch(config, /^/, function (path, key, value) {
|
|
||||||
if ((typeof value === 'string') && value.indexOf('%https.ip%') > -1) {
|
|
||||||
return value.replace('%https.ip%', server.address("https"));
|
|
||||||
} else if ((typeof value === 'string') && value.indexOf('%http.ip%') > -1) {
|
|
||||||
return value.replace('%http.ip%', server.address("http"));
|
|
||||||
}
|
|
||||||
return value;
|
|
||||||
});
|
|
||||||
application.put("PINCH_CONFIG", config);//caching
|
|
||||||
conf = config;
|
|
||||||
}
|
|
||||||
return conf;
|
|
||||||
};
|
|
@ -1,28 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015, 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 carbonModule = require("carbon");
|
|
||||||
var dcProps = require('/config/dc-props.js').config();
|
|
||||||
var carbonServer = new carbonModule.server.Server({
|
|
||||||
tenanted: true,
|
|
||||||
url: dcProps.httpsURL + '/admin'
|
|
||||||
});
|
|
||||||
application.put("carbonServer", carbonServer);
|
|
||||||
var userModule = require("/modules/user.js").userModule;
|
|
||||||
var utility = require("/modules/utility.js").utility;
|
|
||||||
utility.insertAppPermissions(userModule, "init");
|
|
@ -1,23 +0,0 @@
|
|||||||
{
|
|
||||||
"displayName": "Fuse Sample",
|
|
||||||
"logLevel": "info",
|
|
||||||
"initScripts": ["/config/init.js"],
|
|
||||||
"urlMappings": [
|
|
||||||
{
|
|
||||||
"url" : "/test/*",
|
|
||||||
"path" : "test/testExecutor.jag"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "/api/stats/*",
|
|
||||||
"path": "/api/stats-api.jag"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "/api/device/*",
|
|
||||||
"path": "/api/device-api.jag"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "/*",
|
|
||||||
"path": "/lib/fuse.jag"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
@ -1,29 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
||||||
<title>
|
|
||||||
{{ defineZone "title"}}
|
|
||||||
</title>
|
|
||||||
{{ defineZone "topLibCss"}}
|
|
||||||
{{ defineZone "topCss"}}
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div class="container col-lg-12 col-md-12 col-sm-12">
|
|
||||||
<!-- header -->
|
|
||||||
<header>
|
|
||||||
<div class="row wr-global-header">
|
|
||||||
<div class="col-sm-8 app-logo">
|
|
||||||
{{ defineZone "brand"}}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
<!-- /header -->
|
|
||||||
{{ defineZone "body"}}
|
|
||||||
</div>
|
|
||||||
{{ defineZone "bottomjquery" }}
|
|
||||||
{{ defineZone "bottomLibJs" }}
|
|
||||||
{{ defineZone "bottomJs" }}
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -1,23 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
||||||
<!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
|
|
||||||
<title>{{ defineZone "title"}}</title>
|
|
||||||
{{ defineZone "topLibCss"}}
|
|
||||||
{{ defineZone "topCss"}}
|
|
||||||
{{ defineZone "topJs"}}
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<section class="content-wrapper">
|
|
||||||
<!-- header -->
|
|
||||||
{{ defineZone "header"}}
|
|
||||||
<!-- /header -->
|
|
||||||
{{ defineZone "body"}}
|
|
||||||
</section>
|
|
||||||
{{ defineZone "bottomLibJs" }}
|
|
||||||
{{ defineZone "bottomJs" }}
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -1,50 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<title>{{ defineZone "title"}}</title>
|
|
||||||
{{ defineZone "topCss"}}
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div class="navbar navbar-default navbar-fixed-top" role="navigation">
|
|
||||||
<div class="container-liquid">
|
|
||||||
<div class="navbar-header">
|
|
||||||
<a class="navbar-brand" href="#">{{defineZone "brand"}}</a>
|
|
||||||
</div>
|
|
||||||
<div class="navbar-collapse collapse">
|
|
||||||
<ul class="nav navbar-nav navbar-right">
|
|
||||||
<li><a href="/login">Login</a></li>
|
|
||||||
{{ defineZone "upperRight"}}
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div id="wrap">
|
|
||||||
<div class="container-fluid">
|
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-2">
|
|
||||||
{{ defineZone "left"}}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-sm-10">
|
|
||||||
{{ defineZone "content"}}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<!-- /container -->
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="footer">
|
|
||||||
<div class="container">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-12">
|
|
||||||
{{ defineZone "footer"}}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -1,49 +0,0 @@
|
|||||||
<%
|
|
||||||
/*
|
|
||||||
* Copyright (c) 2015, 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 dataConfig = require('/config/dc-props.js').config();
|
|
||||||
var sso = require('/modules/sso.js').sso;
|
|
||||||
var constants = require('/modules/constants.js');
|
|
||||||
var carbonModule = require("carbon");
|
|
||||||
var log = new Log();
|
|
||||||
var keyStoreParams = {
|
|
||||||
keyStoreName: dataConfig.ssoConfiguration.keyStoreName,
|
|
||||||
keyStorePassword: dataConfig.ssoConfiguration.keyStorePassword,
|
|
||||||
identityAlias: dataConfig.ssoConfiguration.identityAlias
|
|
||||||
};
|
|
||||||
sso.configure(dataConfig.ssoConfiguration.issuer,
|
|
||||||
dataConfig.ssoConfiguration.appName,
|
|
||||||
keyStoreParams, dataConfig.ssoConfiguration.identityProviderURL);
|
|
||||||
sso.acs(
|
|
||||||
function(loggedInUser) {
|
|
||||||
var carbonUser = carbonModule.server.tenantUser(loggedInUser);
|
|
||||||
session.put(constants.USER_SESSION_KEY, carbonUser);
|
|
||||||
var username = carbonUser.username;
|
|
||||||
if(log.isDebugEnabled()){
|
|
||||||
log.debug("User logged in: "+username);
|
|
||||||
}
|
|
||||||
response.sendRedirect(dataConfig.appContext);
|
|
||||||
}, function() {
|
|
||||||
if(log.isDebugEnabled()){
|
|
||||||
log.debug("User logged out");
|
|
||||||
}
|
|
||||||
response.sendRedirect(dataConfig.appContext);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
%>
|
|
@ -1,210 +0,0 @@
|
|||||||
//public function declarations
|
|
||||||
var route;
|
|
||||||
|
|
||||||
(function () {
|
|
||||||
|
|
||||||
//public
|
|
||||||
/**
|
|
||||||
* front controller entity point. acts as the main function for every request.
|
|
||||||
*/
|
|
||||||
route = function () {
|
|
||||||
//lets assume URL looks like https://my.domain.com/app/{one}/{two}/{three}/{four}
|
|
||||||
var uri = request.getRequestURI(); // = app/{one}/{two}/{three}/{four}
|
|
||||||
var parts = splitFirst(uri);
|
|
||||||
fuseState.appName = parts.head;
|
|
||||||
var path = parts.tail; // = /{one}/{two}/{three}/{four}
|
|
||||||
var handled = false;
|
|
||||||
|
|
||||||
parts = splitFirst(path);
|
|
||||||
if (parts.head == 'public') { // {one} == 'public'
|
|
||||||
parts = splitFirst(parts.tail);
|
|
||||||
if (splitFirst(parts.tail).head == 'less') { // {three} == 'less'
|
|
||||||
handled = renderLess(parts.head, parts.tail); // renderLess({two},{three}/{four})
|
|
||||||
} else {
|
|
||||||
handled = renderStatic(parts.head, parts.tail);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
handled = renderPage(path);
|
|
||||||
if (!handled) {
|
|
||||||
handled = renderUnit(path);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!handled) {
|
|
||||||
response.sendError(404, 'Requested resource not found');
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
//private
|
|
||||||
var log = new Log('fuse.router');
|
|
||||||
|
|
||||||
var getMime = function (path) {
|
|
||||||
var index = path.lastIndexOf('.') + 1;
|
|
||||||
var knowMime = {
|
|
||||||
'js': 'application/javascript',
|
|
||||||
'html': 'text/html',
|
|
||||||
'htm': 'text/html',
|
|
||||||
'woff': 'application/x-font-woff',
|
|
||||||
"png": "image/png",
|
|
||||||
"css": "text/css",
|
|
||||||
"hbs": "text/x-handlebars-template",
|
|
||||||
"apk": "application/vnd.android.package-archive",
|
|
||||||
"ipa": "application/octet-stream"
|
|
||||||
};
|
|
||||||
var mime;
|
|
||||||
if (index >= 0) {
|
|
||||||
mime = knowMime[path.substr(index)];
|
|
||||||
}
|
|
||||||
return mime || 'text/plain';
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* '/a/b/c/d' -> {'a','b/c/d'}
|
|
||||||
* @param path URI part, should start with '/'
|
|
||||||
* @returns {{head: string, tail: string}}
|
|
||||||
*/
|
|
||||||
var splitFirst = function (path) {
|
|
||||||
var firstSlashPos = path.indexOf('/', 1);
|
|
||||||
var head = path.substring(1, firstSlashPos);
|
|
||||||
var tail = path.substring(firstSlashPos);
|
|
||||||
return {head: head, tail: tail};
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param str
|
|
||||||
* @param prefix
|
|
||||||
* @returns {boolean} true iif str starts with prefix
|
|
||||||
*/
|
|
||||||
var startsWith = function (str, prefix) {
|
|
||||||
return (str.lastIndexOf(prefix, 0) === 0);
|
|
||||||
};
|
|
||||||
|
|
||||||
var renderStatic = function (unit, path) {
|
|
||||||
log.debug('[' + requestId + '] for unit "' + unit + '" a request received for a static file "' + path + '"');
|
|
||||||
var staticFile = fuse.getFile(unit, 'public' + path);
|
|
||||||
if (staticFile.isExists() && !staticFile.isDirectory()) {
|
|
||||||
response.addHeader('Content-type', getMime(path));
|
|
||||||
response.addHeader('Cache-Control', 'public,max-age=12960000');
|
|
||||||
staticFile.open('r');
|
|
||||||
var stream = staticFile.getStream();
|
|
||||||
print(stream);
|
|
||||||
staticFile.close();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
|
|
||||||
var renderPage = function (path) {
|
|
||||||
var jagFile;
|
|
||||||
if (path.indexOf('/', path.length - 1) !== -1) {
|
|
||||||
jagFile = new File('/pages' + path + 'index.jag');
|
|
||||||
} else {
|
|
||||||
jagFile = new File('/pages' + path + '.jag');
|
|
||||||
}
|
|
||||||
if (jagFile.isExists()) {
|
|
||||||
include(jagFile.getPath());
|
|
||||||
return true;
|
|
||||||
}else{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
var renderUnit = function (path) {
|
|
||||||
var mainUnit = null;
|
|
||||||
var matchedUnits = fuse.getMatchedUnitDefinitions();
|
|
||||||
fuse.addDependencies(matchedUnits);
|
|
||||||
var zones = fuseState.zones;
|
|
||||||
|
|
||||||
// A map of maps. this is used to ensure same zone is not render twice in to same definition.
|
|
||||||
// zonesAdded = { titleZone : { zoneFromA : true, zoneFromB : true } }
|
|
||||||
var zonesAdded = {};
|
|
||||||
|
|
||||||
for (var i = 0; i < matchedUnits.length; i++) {
|
|
||||||
var definition = matchedUnits[i];
|
|
||||||
|
|
||||||
for (var j = 0; j < definition.zones.length; j++) {
|
|
||||||
var zone = definition.zones[j];
|
|
||||||
if (!zones[zone.name]) {
|
|
||||||
zones[zone.name] = [];
|
|
||||||
zonesAdded[zone.name] = {};
|
|
||||||
}
|
|
||||||
var zoneKey = zone.origin + ':' + zone.name; // temp unique key to identify zone form a given unit.
|
|
||||||
if (!zonesAdded[zone.name][zoneKey]) {
|
|
||||||
var zoneInfo = {unitName: definition.name};
|
|
||||||
if (zone.origin != definition.name) {
|
|
||||||
zoneInfo.originUnitName = zone.origin;
|
|
||||||
}
|
|
||||||
zones[zone.name].push(zoneInfo);
|
|
||||||
zonesAdded[zone.name][zoneKey] = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
var layout = fuseState.layout;
|
|
||||||
if (layout !== null) {
|
|
||||||
log.debug(
|
|
||||||
'[' + requestId + '] request for "' + path + '" will be rendered using layout "' +
|
|
||||||
layout + '" (defined in "' + mainUnit + '") and zones ' +
|
|
||||||
stringify(zones)
|
|
||||||
);
|
|
||||||
|
|
||||||
var output = handlebars.Handlebars.compileFile(fuse.getLayoutPath(layout))({});
|
|
||||||
response.addHeader('Content-type', 'text/html');
|
|
||||||
print(output);
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
log.debug(
|
|
||||||
'[' + requestId + '] request for "' + path + '" will can\'t be rendered, since no layout is defined' +
|
|
||||||
'in any of the units ' + stringify(zones));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
function fileToString(path) {
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* convert less file to css and print to output. add '?nocache=true' to force regenerate.
|
|
||||||
* @param unit name of the unit
|
|
||||||
* @param path the path to the less file relative to unit root (should start with slash)
|
|
||||||
* @returns {boolean} is successfully rendered.
|
|
||||||
*/
|
|
||||||
function renderLess(unit, path) {
|
|
||||||
//TODO: fix - incorrect less files makes it respond the old less even if it is nocahce.
|
|
||||||
log.debug('[' + requestId + '] for unit "' + unit + '" a request received for a less file "' + path + '"');
|
|
||||||
var cacheKey = '/tmp/cached_' + unit + path.replace(/[^\w\.-]/g, '_');
|
|
||||||
fuseState.currentUnit = unit;
|
|
||||||
var cachedCss = new File(cacheKey);
|
|
||||||
|
|
||||||
//TODO: move this check to caller function ??
|
|
||||||
if (fuseDebug || request.getParameter('nocache') == 'true' || !cachedCss.isExists()) {
|
|
||||||
var parts = splitFirst(path);
|
|
||||||
var lessPath = '/public/less' + parts.tail.replace(/\.css$/, '') + '.less';
|
|
||||||
var lessFile = fuse.getFile(unit, lessPath);
|
|
||||||
|
|
||||||
if (lessFile.isExists()) {
|
|
||||||
var x = require('less-rhino-1.7.5.js');
|
|
||||||
x.compile([lessFile.getPath(), cacheKey]);
|
|
||||||
log.debug('[' + requestId + '] for unit "' + unit + '" request for "' + path + '" is cached as "' + cacheKey + '"');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (cachedCss.isExists()) {
|
|
||||||
response.addHeader('Content-type', 'text/css');
|
|
||||||
response.addHeader('Cache-Control', 'public,max-age=12960000');
|
|
||||||
cachedCss.open('r');
|
|
||||||
var stream = cachedCss.getStream();
|
|
||||||
print(stream);
|
|
||||||
cachedCss.close();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
})();
|
|
@ -1,29 +0,0 @@
|
|||||||
<%
|
|
||||||
|
|
||||||
//global object to pass request stat among fuse framework files.
|
|
||||||
var fuseState = {
|
|
||||||
zones: {},
|
|
||||||
appName: '',
|
|
||||||
zoneStack: [],
|
|
||||||
currentUnit: null
|
|
||||||
};
|
|
||||||
|
|
||||||
var requestId = function makeId() {
|
|
||||||
var text = "";
|
|
||||||
var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
|
||||||
for (var i = 0; i < 5; i++)
|
|
||||||
text += possible.charAt(Math.floor(Math.random() * possible.length));
|
|
||||||
|
|
||||||
return text;
|
|
||||||
}();
|
|
||||||
var fuseDebug = false;
|
|
||||||
//var fuseDebug = true;
|
|
||||||
|
|
||||||
var handlebars = require('handlebars-helpers.js');
|
|
||||||
var fuseRouter = require('fuse-router.js');
|
|
||||||
var fuse = require('fuse.js');
|
|
||||||
|
|
||||||
|
|
||||||
fuseRouter.route();
|
|
||||||
|
|
||||||
%>
|
|
@ -1,417 +0,0 @@
|
|||||||
//public function declarations
|
|
||||||
var getHbsFile, getFile, toRelativePath, cleanupAncestors,
|
|
||||||
getUnitPath, getMatchedUnitDefinitions, getZoneDefinition, getUnitDefinition,
|
|
||||||
getUnitDefinitions, getLayoutPath;
|
|
||||||
|
|
||||||
(function () {
|
|
||||||
//private
|
|
||||||
var log = new Log('fuse.core');
|
|
||||||
var lookUpTable = null;
|
|
||||||
var definitions = null;
|
|
||||||
|
|
||||||
var initLookUp = function (definitions) {
|
|
||||||
if (lookUpTable === null) {
|
|
||||||
lookUpTable = {};
|
|
||||||
for (var i = 0; i < definitions.length; i++) {
|
|
||||||
var definition = definitions[i];
|
|
||||||
lookUpTable[definition.name] = i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
var isMatched = function (definition, layout) {
|
|
||||||
var urlMatch = function (pattern) {
|
|
||||||
var uriMatcher = new URIMatcher(request.getRequestURI());
|
|
||||||
return Boolean(uriMatcher.match('/{appName}' + pattern));
|
|
||||||
};
|
|
||||||
var permission = function (permissionStr) {
|
|
||||||
var carbonModule = require("carbon");
|
|
||||||
var carbonServer = application.get("carbonServer");
|
|
||||||
var carbonUser = session.get("USER");
|
|
||||||
if (carbonUser) {
|
|
||||||
var userManager = new carbonModule.user.UserManager(carbonServer, carbonUser.tenantId);
|
|
||||||
var user = new carbonModule.user.User(userManager, carbonUser.username);
|
|
||||||
return user.isAuthorized(permissionStr, "ui.execute");
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
var config = {'theme': 'default'};
|
|
||||||
var predicateStr = definition.definition.predicate;
|
|
||||||
if (predicateStr) {
|
|
||||||
var js = 'function(config,urlMatch,permission,layout){ return ' + predicateStr + ';}';
|
|
||||||
return Boolean(eval(js)(config, urlMatch,permission, layout ? layout : NaN));
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
|
|
||||||
var getAncestorModels = function (unit) {
|
|
||||||
var unitModel = getUnitDefinition(unit);
|
|
||||||
var ancestors = [unitModel];
|
|
||||||
var parentName;
|
|
||||||
while ((parentName = unitModel.definition.extends) != null) {
|
|
||||||
unitModel = getUnitDefinition(parentName);
|
|
||||||
ancestors.push(unitModel);
|
|
||||||
}
|
|
||||||
return ancestors;
|
|
||||||
};
|
|
||||||
|
|
||||||
addDependencies = function (unitModels) {
|
|
||||||
var resolved = {};
|
|
||||||
for (var i = 0; i < unitModels.length; i++) {
|
|
||||||
resolved[unitModels[i].name] = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < unitModels.length; i++) {
|
|
||||||
var unitModel = unitModels[i];
|
|
||||||
var dependencies = unitModel.definition.dependencies;
|
|
||||||
if (dependencies) {
|
|
||||||
for (var j = 0; j < dependencies.length; j++) {
|
|
||||||
var dependencyName = dependencies[j];
|
|
||||||
unitModels.push(getUnitDefinition(dependencyName));
|
|
||||||
resolved[dependencyName] = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
//public
|
|
||||||
getMatchedUnitDefinitions = function () {
|
|
||||||
//TODO: return map not list
|
|
||||||
var unitDefinitions = getUnitDefinitions();
|
|
||||||
var matched = [];
|
|
||||||
var unMatched = [];
|
|
||||||
var layout = null;
|
|
||||||
var mainUnit = null;
|
|
||||||
|
|
||||||
var addToMatched = function (model) {
|
|
||||||
matched.push(model);
|
|
||||||
if (model.layout) {
|
|
||||||
if (layout == null) {
|
|
||||||
layout = model.layout;
|
|
||||||
mainUnit = model.name;
|
|
||||||
} else {
|
|
||||||
log.warn(
|
|
||||||
'[' + requestId + '] multiple layouts ' + mainUnit + ':' +
|
|
||||||
layout + ' vs ' + model.name + ':' + model.layout
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// first pass
|
|
||||||
for (var i = 0; i < unitDefinitions.length; i++) {
|
|
||||||
var unitDefinition = unitDefinitions[i];
|
|
||||||
if (isMatched(unitDefinition)) {
|
|
||||||
addToMatched(unitDefinition);
|
|
||||||
} else {
|
|
||||||
unMatched.push(unitDefinition);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fuseState.layout = layout;
|
|
||||||
|
|
||||||
// second pass : we have to do this two passes since we don't know the layout
|
|
||||||
// first time around
|
|
||||||
if (layout) {
|
|
||||||
for (i = 0; i < unMatched.length; i++) {
|
|
||||||
unitDefinition = unMatched[i];
|
|
||||||
if (isMatched(unitDefinition, layout)) {
|
|
||||||
addToMatched(unitDefinition)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
var toDelete = [];
|
|
||||||
|
|
||||||
for (i = 0; i < matched.length; i++) {
|
|
||||||
var ancestors = getAncestorModels(matched[i].name);
|
|
||||||
for (var j = 1; j < ancestors.length; j++) {
|
|
||||||
var ancestor = ancestors[j];
|
|
||||||
toDelete.push(ancestor.name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
for (i = matched.length - 1; i >= 0; i--) {
|
|
||||||
//log.info(matched[i].name);
|
|
||||||
if (toDelete.indexOf(matched[i].name) >= 0) {
|
|
||||||
matched.splice(i, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return matched;
|
|
||||||
};
|
|
||||||
|
|
||||||
getUnitDefinition = function (unit) {
|
|
||||||
var definitions = getUnitDefinitions();
|
|
||||||
initLookUp(definitions);
|
|
||||||
var model = definitions[lookUpTable[unit]];
|
|
||||||
if (!model) {
|
|
||||||
log.warn('[' + requestId + '] unit "' + unit + '" does not exits');
|
|
||||||
throw '[' + requestId + '] unit "' + unit + '" does not exits';
|
|
||||||
}
|
|
||||||
return model;
|
|
||||||
};
|
|
||||||
|
|
||||||
var flattenAllInheritance = function (unitModels) {
|
|
||||||
var hasFlattend = {};
|
|
||||||
for (var i = 0; i < unitModels.length; i++) {
|
|
||||||
var model = unitModels[i];
|
|
||||||
if (!hasFlattend[model]) {
|
|
||||||
var ancestors = getAncestorModels(model.name);
|
|
||||||
for (var j = ancestors.length - 1; j >= 1; j--) {
|
|
||||||
flattenInheritance(ancestors[j], ancestors[j - 1]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
var flattenInheritance = function (parent, child) {
|
|
||||||
var parentZones = parent.zones;
|
|
||||||
for (var i = 0; i < parentZones.length; i++) {
|
|
||||||
var parentZone = parentZones[i];
|
|
||||||
child.zones.push(parentZone);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
getUnitDefinitions = function () {
|
|
||||||
if (definitions !== null) {
|
|
||||||
return definitions;
|
|
||||||
} else {
|
|
||||||
definitions = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
var unitDirs = new File('/units').listFiles();
|
|
||||||
for (var i = 0; i < unitDirs.length; i++) {
|
|
||||||
var unitDir = unitDirs[i];
|
|
||||||
if (unitDir.isDirectory()) {
|
|
||||||
|
|
||||||
var unitName = unitDir.getName();
|
|
||||||
var unitModel = {
|
|
||||||
name: unitName,
|
|
||||||
path: unitDir.getPath()
|
|
||||||
};
|
|
||||||
|
|
||||||
// unit definition is read form is the <unit name>.json file.
|
|
||||||
// if doesn't exits it will be an empty json.
|
|
||||||
var definitionFile = new File(fuse.getUnitPath(unitName) + '/' + unitName + '.json');
|
|
||||||
if (definitionFile.isExists() && !definitionFile.isDirectory()) {
|
|
||||||
var path = definitionFile.getPath();
|
|
||||||
log.debug('[' + requestId + '] reading file "' + path + '"');
|
|
||||||
unitModel.definition = require(path);
|
|
||||||
} else {
|
|
||||||
log.warn('[' + requestId + '] for unit "' + unitName + '", unable to find a definition file');
|
|
||||||
unitModel.definition = {};
|
|
||||||
}
|
|
||||||
|
|
||||||
// add the information derived by parsing hbs file to the same model
|
|
||||||
var hbsMetadata = getHbsMetadata(unitModel);
|
|
||||||
unitModel.zones = hbsMetadata.zones;
|
|
||||||
if (hbsMetadata.layout) {
|
|
||||||
unitModel.layout = hbsMetadata.layout;
|
|
||||||
}
|
|
||||||
|
|
||||||
definitions.push(unitModel);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
addPageUnitDefinitions(definitions);
|
|
||||||
|
|
||||||
initLookUp(definitions);
|
|
||||||
flattenAllInheritance(definitions);
|
|
||||||
|
|
||||||
return definitions;
|
|
||||||
};
|
|
||||||
|
|
||||||
addPageUnitDefinitions = function (unitModels, dir) {
|
|
||||||
var pageFiles = new File(dir || '/pages').listFiles();
|
|
||||||
for (var i = 0; i < pageFiles.length; i++) {
|
|
||||||
var pageFile = pageFiles[i];
|
|
||||||
var fileName = pageFile.getName();
|
|
||||||
if (pageFile.isDirectory()) {
|
|
||||||
addPageUnitDefinitions(unitModels, pageFile.getPath())
|
|
||||||
} else if (fileName.indexOf('.hbs', fileName.length - 4) !== -1) { // File name ends with '.hbs'
|
|
||||||
|
|
||||||
var isLeaf = true;
|
|
||||||
//path relative to app root
|
|
||||||
var relativePath = pageFile.getPath()
|
|
||||||
.substring(6 + pageFile.getPath().indexOf('/pages/'), pageFile.getPath().length - 4);
|
|
||||||
|
|
||||||
if (relativePath.match(/\/index$/)) {
|
|
||||||
relativePath = relativePath.replace(/\/index$/, '');
|
|
||||||
var parentFile = new File(pageFile.getPath().substr(0, pageFile.getPath().lastIndexOf('/')));
|
|
||||||
var hasSiblings = parentFile.listFiles().length != 1;
|
|
||||||
if (hasSiblings) {
|
|
||||||
isLeaf = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//this will be used as a name for the virtual unit, useful for debugging purposes.
|
|
||||||
var unitName = (relativePath == '' ? 'index' : relativePath.substr(1).replace(/\//, '-') ) + '-page';
|
|
||||||
|
|
||||||
var predicate = "urlMatch('" + relativePath + "')";
|
|
||||||
// leaf is page that can handle multiple URLs. in this case it should have a wildcard at end.
|
|
||||||
// but since our current matcher doesn't support {/wildcard*} patten, "OR" ( || ) is used
|
|
||||||
if (isLeaf) {
|
|
||||||
predicate += " || urlMatch('" + relativePath + "/{+wildcard}')";
|
|
||||||
}
|
|
||||||
var unitModel = {
|
|
||||||
name: unitName,
|
|
||||||
|
|
||||||
path: pageFile.getPath(),
|
|
||||||
definition: {predicate: predicate}
|
|
||||||
};
|
|
||||||
var hbsMetadata = getHbsMetadata(unitModel);
|
|
||||||
unitModel.zones = hbsMetadata.zones;
|
|
||||||
if (hbsMetadata.layout) {
|
|
||||||
unitModel.layout = hbsMetadata.layout;
|
|
||||||
}
|
|
||||||
|
|
||||||
unitModels.push(unitModel);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
getLayoutPath = function (layout) {
|
|
||||||
return '/layouts/' + layout + '.hbs';
|
|
||||||
};
|
|
||||||
|
|
||||||
getHbsFile = function (unit) {
|
|
||||||
// we determining if it's page unit or a proper unit
|
|
||||||
// by checking if path ends with '.hbs'
|
|
||||||
// TODO: improve getFile to do include this logic
|
|
||||||
if (unit.path.indexOf('.hbs', unit.path.length - 4) !== -1) {
|
|
||||||
return new File(unit.path);
|
|
||||||
} else {
|
|
||||||
return new File(unit.path + '/' + unit.name + '.hbs');
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
var getHbsMetadata = function (unit) {
|
|
||||||
var zoneDef = {'zones': []};
|
|
||||||
var hbsFile = getHbsFile(unit);
|
|
||||||
if (!hbsFile.isExists()) {
|
|
||||||
return zoneDef;
|
|
||||||
}
|
|
||||||
var output = handlebars.Handlebars.compileFile(hbsFile)({});
|
|
||||||
var zonesAndLayouts = output.trim().split(/\s+/gm);
|
|
||||||
for (var i = 0; i < zonesAndLayouts.length; i++) {
|
|
||||||
var name = zonesAndLayouts[i];
|
|
||||||
if (name.lastIndexOf('zone_', 0) === 0) {
|
|
||||||
zoneDef.zones.push({name: name.substr(5), origin: unit.name});
|
|
||||||
} else if (name.lastIndexOf('layout_', 0) === 0) {
|
|
||||||
zoneDef.layout = name.substr(7);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return zoneDef;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
getUnitPath = function (unit) {
|
|
||||||
return '/units/' + unit;
|
|
||||||
};
|
|
||||||
|
|
||||||
cleanupAncestors = function (units) {
|
|
||||||
var toDelete = {};
|
|
||||||
var len = units.length;
|
|
||||||
for (var i = 0; i < len; i++) {
|
|
||||||
var unit = units[i];
|
|
||||||
if (!toDelete[unit]) {
|
|
||||||
var ancestors = getAncestorModels(unit.name);
|
|
||||||
for (var j = 1; j < ancestors.length; j++) {
|
|
||||||
toDelete[ancestors[j].name] = unit;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
while (len--) {
|
|
||||||
if (toDelete[units[len]]) {
|
|
||||||
log.debug(
|
|
||||||
'[' + requestId + '] unit "' + units[len] +
|
|
||||||
'" is overridden by "' + toDelete[units[len]] + '"'
|
|
||||||
);
|
|
||||||
units.splice(len, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
toRelativePath = function (path) {
|
|
||||||
var start = 0;
|
|
||||||
if (path.lastIndexOf('/units/', 0) == 0) {
|
|
||||||
start = 7; // len('/units/')
|
|
||||||
}
|
|
||||||
var slashPos = path.indexOf('/', 7);
|
|
||||||
return {
|
|
||||||
unit: path.substring(start, slashPos),
|
|
||||||
path: path.substr(slashPos)
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get a file inside a unit by relative path. if the file is not available in the given unit,
|
|
||||||
* the closest ancestor's file will be returned. if an optional suffix is used the relative path is
|
|
||||||
* calculated as ( path + < unit name > + opt_suffix ). if no such a file exists a returned file object will
|
|
||||||
* point to provided unit's non-existing file location (not to any ancestors).
|
|
||||||
*
|
|
||||||
* @param unitName name of the unit
|
|
||||||
* @param path path relative to unit root.
|
|
||||||
* @param opt_suffix
|
|
||||||
* @returns {File}
|
|
||||||
*/
|
|
||||||
getFile = function (unitName, path, opt_suffix) {
|
|
||||||
var slashPath = ((path[0] === '/') ? '' : '/') + path;
|
|
||||||
var selfFileName = '';
|
|
||||||
var fileName = '';
|
|
||||||
if (opt_suffix) {
|
|
||||||
selfFileName = unitName + opt_suffix;
|
|
||||||
slashPath = slashPath + ((slashPath[slashPath.length - 1] === '/') ? '' : '/');
|
|
||||||
}
|
|
||||||
|
|
||||||
//TODO: remove this hack that makes in page-unit, any file is same
|
|
||||||
var unitDef = getUnitDefinition(unitName);
|
|
||||||
if (unitDef.path.indexOf('.hbs', unitDef.path.length - 4) !== -1) {
|
|
||||||
if (opt_suffix.indexOf('.hbs', opt_suffix.length - 4) !== -1) {
|
|
||||||
return new File(unitDef.path);
|
|
||||||
} else {
|
|
||||||
return new File(unitDef.path.replace(/.hbs$/, opt_suffix));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var selfFile = new File(getUnitPath(unitName) + slashPath + selfFileName);
|
|
||||||
if (selfFile.isExists()) {
|
|
||||||
log.debug(
|
|
||||||
'[' + requestId + '] for unit "' + unitName + '" file resolved : "'
|
|
||||||
+ slashPath + selfFileName + '" -> "' + selfFile.getPath() + '"'
|
|
||||||
);
|
|
||||||
|
|
||||||
return selfFile;
|
|
||||||
}
|
|
||||||
|
|
||||||
var ancestors = getAncestorModels(unitName);
|
|
||||||
for (var i = 1; i < ancestors.length; i++) {
|
|
||||||
var ancestorName = ancestors[i].name;
|
|
||||||
if (opt_suffix) {
|
|
||||||
fileName = ancestorName + opt_suffix;
|
|
||||||
}
|
|
||||||
var file = new File(getUnitPath(ancestorName) + slashPath + fileName);
|
|
||||||
if (file.isExists()) {
|
|
||||||
log.debug(
|
|
||||||
'[' + requestId + '] for unit "' + unitName + '" file resolved : "'
|
|
||||||
+ slashPath + selfFileName + '" -> "' + file.getPath() + '"'
|
|
||||||
);
|
|
||||||
return file;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
log.debug(
|
|
||||||
'[' + requestId + '] for unit "' + unitName + '" (non-excising) file resolved : "'
|
|
||||||
+ slashPath + selfFileName + '" -> "' + selfFile.getPath() + '"'
|
|
||||||
);
|
|
||||||
return selfFile;
|
|
||||||
};
|
|
||||||
|
|
||||||
})();
|
|
@ -1,194 +0,0 @@
|
|||||||
var log = new Log('fuse.handlebars');
|
|
||||||
//TODO: create a different set of helpers for init parsing
|
|
||||||
|
|
||||||
var Handlebars = require('handlebars-v2.0.0.js').Handlebars;
|
|
||||||
var USER_SESSION_KEY = "USER";
|
|
||||||
var getScope = function (unit,configs) {
|
|
||||||
var jsFile = fuse.getFile(unit, '', '.js');
|
|
||||||
var templateConfigs = configs || {};
|
|
||||||
var script;
|
|
||||||
var onRequestCb = function(){}; //Assume that onRequest function will not be defined by the user
|
|
||||||
var viewModel = {};
|
|
||||||
var cbResult;
|
|
||||||
if (jsFile.isExists()) {
|
|
||||||
script = require(jsFile.getPath());
|
|
||||||
//Eagerly make the viewModel the template configs
|
|
||||||
viewModel = templateConfigs;
|
|
||||||
//Check if the unit author has specified an onRequest
|
|
||||||
//callback
|
|
||||||
if(script.hasOwnProperty('onRequest')){
|
|
||||||
script.app = {
|
|
||||||
url: '/' + fuseState.appName,
|
|
||||||
publicURL: '/' + fuseState.appName + '/public/' + unit,
|
|
||||||
"class": unit + '-unit'
|
|
||||||
};
|
|
||||||
onRequestCb = script.onRequest;
|
|
||||||
cbResult = onRequestCb(templateConfigs);
|
|
||||||
log.debug("passing configs to unit "+unit+" configs: "+stringify(templateConfigs));
|
|
||||||
//If the execution does not yield an object we will print
|
|
||||||
//a warning as the unit author may have forgotten to return a data object
|
|
||||||
if(cbResult===undefined){
|
|
||||||
cbResult = {}; //Give an empty data object
|
|
||||||
log.warn('[' + requestId + '] unit "' + unit + '" has a onRequest method which does not return a value.This may lead to the '
|
|
||||||
+'unit not been rendered correctly.');
|
|
||||||
}
|
|
||||||
viewModel = cbResult;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
//If there is no script then the view should get the configurations
|
|
||||||
//passed in the unit call
|
|
||||||
viewModel = templateConfigs;
|
|
||||||
}
|
|
||||||
viewModel.app = {
|
|
||||||
url: '/' + fuseState.appName
|
|
||||||
};
|
|
||||||
viewModel.self = {
|
|
||||||
publicURL: '/' + fuseState.appName + '/public/' + unit,
|
|
||||||
"class": unit + '-unit'
|
|
||||||
};
|
|
||||||
return viewModel;
|
|
||||||
};
|
|
||||||
|
|
||||||
Handlebars.innerZones = [];
|
|
||||||
Handlebars.innerZonesFromUnit = null;
|
|
||||||
|
|
||||||
Handlebars.registerHelper('defineZone', function (zoneName, zoneContent) {
|
|
||||||
var result = '';
|
|
||||||
var zone = Handlebars.Utils.escapeExpression(zoneName);
|
|
||||||
fuseState.zoneStack.push(zone);
|
|
||||||
var unitsToRender = fuseState.zones[zone] || [];
|
|
||||||
|
|
||||||
if (Handlebars.innerZones.length > 0) {
|
|
||||||
unitsToRender = fuseState.zones[Handlebars.innerZones[0]] || [];
|
|
||||||
}
|
|
||||||
|
|
||||||
// if there is no one overriding, then display inline zone
|
|
||||||
if (zoneContent['fn'] && unitsToRender.length == 0) {
|
|
||||||
return zoneContent.fn(this).trim();
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var i = 0; i < unitsToRender.length; i++) {
|
|
||||||
var unit = unitsToRender[i];
|
|
||||||
if (Handlebars.innerZonesFromUnit == null || Handlebars.innerZonesFromUnit.unitName == unit.unitName) {
|
|
||||||
var template = fuse.getFile(unit.originUnitName || unit.unitName, '', '.hbs');
|
|
||||||
log.debug('[' + requestId + '] for zone "' + zone + '" including template :"' + template.getPath() + '"');
|
|
||||||
result += Handlebars.compileFile(template)(getScope(unit.unitName, zoneContent.data.root));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// we go to inner zones if result is empty, what we should really do it
|
|
||||||
// if matched zone is fully made of sub-zones. this is a hack to
|
|
||||||
// make it easy to implement.
|
|
||||||
if (result.trim().length == 0 && zoneContent['fn']) {
|
|
||||||
Handlebars.innerZones.push(zoneName);
|
|
||||||
for (i = 0; i < unitsToRender.length; i++) {
|
|
||||||
unit = unitsToRender[i];
|
|
||||||
Handlebars.innerZonesFromUnit = unit;
|
|
||||||
result += zoneContent.fn(this).trim();
|
|
||||||
Handlebars.innerZonesFromUnit = null;
|
|
||||||
}
|
|
||||||
Handlebars.innerZones.pop();
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
fuseState.zoneStack.pop();
|
|
||||||
return new Handlebars.SafeString(result);
|
|
||||||
});
|
|
||||||
|
|
||||||
Handlebars.registerHelper('zone', function (zoneName, zoneContent) {
|
|
||||||
var currentZone = fuseState.zoneStack[fuseState.zoneStack.length - 1];
|
|
||||||
if (currentZone == null) {
|
|
||||||
return 'zone_' + zoneName + ' ';
|
|
||||||
}
|
|
||||||
|
|
||||||
// if it's exact zone match or if any in inner zone matches we render zone.
|
|
||||||
// this second condition is a hack. what we should really do is to keep another stack,
|
|
||||||
// and only match with the peek of that stack and always fill it with next in innerZone stack.
|
|
||||||
if (zoneName == currentZone || Handlebars.innerZones.indexOf(zoneName) >= 0) {
|
|
||||||
return zoneContent.fn(this).trim();
|
|
||||||
} else {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Handlebars.registerHelper('layout', function (layoutName) {
|
|
||||||
var currentZone = fuseState.zoneStack[fuseState.zoneStack.length - 1];
|
|
||||||
if (currentZone == null) {
|
|
||||||
return 'layout_' + layoutName;
|
|
||||||
} else {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Handlebars.registerHelper('authorized', function () {
|
|
||||||
var currentZone = fuseState.zoneStack[fuseState.zoneStack.length - 1];
|
|
||||||
if (currentZone == null) {
|
|
||||||
return '';
|
|
||||||
} else {
|
|
||||||
var loggedUser = session.get(USER_SESSION_KEY);
|
|
||||||
if(loggedUser == null){
|
|
||||||
response.sendRedirect("/"+ fuseState.appName + "/login");
|
|
||||||
exit();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Handlebars.registerHelper('unit', function (unitName,options) {
|
|
||||||
var unitDef = fuse.getUnitDefinition(unitName);
|
|
||||||
var baseUnit = null;
|
|
||||||
var templateConfigs = options.hash || {};
|
|
||||||
for (var i = 0; i < unitDef.zones.length; i++) {
|
|
||||||
var zone = unitDef.zones[i];
|
|
||||||
if (zone.name == 'main') {
|
|
||||||
baseUnit = zone.origin;
|
|
||||||
} else {
|
|
||||||
var golbalZone = fuseState.zones[zone.name];
|
|
||||||
if (!golbalZone) {
|
|
||||||
fuseState.zones[zone.name] = [{"unitName": unitName}];
|
|
||||||
} else {
|
|
||||||
fuseState.zones[zone.name].push({"unitName": unitName});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (baseUnit == null) {
|
|
||||||
log.error('unit does not have a main zone');
|
|
||||||
}
|
|
||||||
//TODO warn when unspecified decencies are included.
|
|
||||||
fuseState.zoneStack.push('main');
|
|
||||||
var template = fuse.getFile(baseUnit, '', '.hbs');
|
|
||||||
log.debug('[' + requestId + '] including "' + baseUnit + '"'+" with configs "+stringify(templateConfigs));
|
|
||||||
var result = new Handlebars.SafeString(Handlebars.compileFile(template)(getScope(baseUnit,templateConfigs)));
|
|
||||||
fuseState.zoneStack.pop();
|
|
||||||
return result;
|
|
||||||
});
|
|
||||||
|
|
||||||
Handlebars.compileFile = function (file) {
|
|
||||||
//TODO: remove this overloaded argument
|
|
||||||
var f = (typeof file === 'string') ? new File(file) : file;
|
|
||||||
|
|
||||||
if (!Handlebars.cache) {
|
|
||||||
Handlebars.cache = {};
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Handlebars.cache[f.getPath()] != null) {
|
|
||||||
return Handlebars.cache[f.getPath()];
|
|
||||||
}
|
|
||||||
|
|
||||||
f.open('r');
|
|
||||||
log.debug('[' + requestId + '] reading file "' + f.getPath() + '"');
|
|
||||||
var content = f.readAll().trim();
|
|
||||||
f.close();
|
|
||||||
var compiled = Handlebars.compile(content);
|
|
||||||
Handlebars.cache[f.getPath()] = compiled;
|
|
||||||
return compiled;
|
|
||||||
};
|
|
||||||
Handlebars.registerHelper('equal', function(lvalue, rvalue, options) {
|
|
||||||
if (arguments.length < 3)
|
|
||||||
throw new Error("Handlebars Helper equal needs 2 parameters");
|
|
||||||
if( lvalue!=rvalue ) {
|
|
||||||
return options.inverse(this);
|
|
||||||
} else {
|
|
||||||
return options.fn(this);
|
|
||||||
}
|
|
||||||
});
|
|
@ -1,36 +0,0 @@
|
|||||||
<%
|
|
||||||
/*
|
|
||||||
* Copyright (c) 2015, 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.
|
|
||||||
*/
|
|
||||||
(function(){
|
|
||||||
var constants = require('/modules/constants.js');
|
|
||||||
if (!session.get(constants.USER_SESSION_KEY)) {
|
|
||||||
var dataConfig = require('/config/dc-props.js').config();
|
|
||||||
var sso = require('/modules/sso.js').sso;
|
|
||||||
var keyStoreParams = {
|
|
||||||
keyStoreName : dataConfig.ssoConfiguration.keyStoreName,
|
|
||||||
keyStorePassword : dataConfig.ssoConfiguration.keyStorePassword,
|
|
||||||
identityAlias : dataConfig.ssoConfiguration.identityAlias
|
|
||||||
}
|
|
||||||
sso.configure(dataConfig.ssoConfiguration.issuer, dataConfig.ssoConfiguration.appName, keyStoreParams,
|
|
||||||
dataConfig.ssoConfiguration.identityProviderURL);
|
|
||||||
sso.login();
|
|
||||||
}else{
|
|
||||||
response.sendRedirect(dataConfig.appContext);
|
|
||||||
}
|
|
||||||
}());
|
|
||||||
%>
|
|
@ -1,37 +0,0 @@
|
|||||||
<%
|
|
||||||
/*
|
|
||||||
* Copyright (c) 2015, 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 constants = require('/modules/constants.js');
|
|
||||||
var user = session.get(constants.USER_SESSION_KEY);
|
|
||||||
var dataConfig = require('/config/dc-props.js').config();
|
|
||||||
var log = new Log();
|
|
||||||
if (user === null) {
|
|
||||||
log.debug("Cannot perform logout. No user session found.");
|
|
||||||
response.sendRedirect(dataConfig.appContext+'dashboard');
|
|
||||||
} else {
|
|
||||||
var sso = require('/modules/sso.js').sso;
|
|
||||||
var keyStoreParams = {
|
|
||||||
keyStoreName: dataConfig.ssoConfiguration.keyStoreName,
|
|
||||||
keyStorePassword: dataConfig.ssoConfiguration.keyStorePassword,
|
|
||||||
identityAlias: dataConfig.ssoConfiguration.identityAlias
|
|
||||||
}
|
|
||||||
sso.configure(dataConfig.ssoConfiguration.issuer, dataConfig.ssoConfiguration.appName, keyStoreParams,
|
|
||||||
dataConfig.ssoConfiguration.identityProviderURL);
|
|
||||||
sso.logout(user);
|
|
||||||
}
|
|
||||||
%>
|
|
@ -1,26 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015, 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 WEB_APP_TITLE = "WSO2 DC - Device Cloud";
|
|
||||||
var WEB_APP_CONTEXT = "/iot";
|
|
||||||
var USER_SESSION_KEY = "USER";
|
|
||||||
var UNSPECIFIED = "Unspecified";
|
|
||||||
|
|
||||||
var ERRORS = {
|
|
||||||
"USER_NOT_FOUND": "USER_NOT_FOUND"
|
|
||||||
};
|
|
@ -1,68 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015, 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 downloadModule;
|
|
||||||
var Handlebars = require('../lib/handlebars-v2.0.0.js').Handlebars;
|
|
||||||
downloadModule = function () {
|
|
||||||
var log = new Log("modules/download.js");
|
|
||||||
|
|
||||||
var constants = require("/modules/constants.js");
|
|
||||||
|
|
||||||
var publicMethods = {};
|
|
||||||
var privateMethods = {};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Downloading a specified sketch file.
|
|
||||||
*
|
|
||||||
* @param file File name or file object of the downloading file
|
|
||||||
* @param replaceParams
|
|
||||||
*/
|
|
||||||
publicMethods.downloadSketch = function (file, response, replaceParams) {
|
|
||||||
var file = new File("../sketch/" + file);
|
|
||||||
|
|
||||||
file.open('r');
|
|
||||||
log.debug("Reading file '" + file.getPath() + "'");
|
|
||||||
var content = file.readAll().trim();
|
|
||||||
file.close();
|
|
||||||
|
|
||||||
var downloadFile = privateMethods.allReplace(content,replaceParams);
|
|
||||||
|
|
||||||
response.contentType = "application/octet-stream";
|
|
||||||
response.addHeader("Content-Disposition", "attachment; filename='sketch.hbs'");
|
|
||||||
response.addHeader("Content-Length", String(downloadFile.length));
|
|
||||||
response.content = downloadFile;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Find and replace all occurrences.
|
|
||||||
* @param inStr input string
|
|
||||||
* @param replaceParams key value array
|
|
||||||
* @returns retStr replaced string
|
|
||||||
*/
|
|
||||||
privateMethods.allReplace = function (inStr, replaceParams) {
|
|
||||||
var retStr = inStr;
|
|
||||||
for (var x in replaceParams) {
|
|
||||||
retStr = retStr.replace(new RegExp(x, 'g'), replaceParams[x])
|
|
||||||
}
|
|
||||||
return retStr;
|
|
||||||
};
|
|
||||||
|
|
||||||
return publicMethods;
|
|
||||||
}();
|
|
||||||
|
|
||||||
|
|
@ -1,27 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2011 František Hába <hello@frantisekhaba.com>
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
* this software and associated documentation files (the 'Software'), to deal in
|
|
||||||
* the Software without restriction, including without limitation the rights to use,
|
|
||||||
* copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
|
|
||||||
* Software, and to permit persons to whom the Software is furnished to do so,
|
|
||||||
* subject to the following conditions:
|
|
||||||
* The above copyright notice and this permission notice shall be included in all
|
|
||||||
* copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
||||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
* SOFTWARE.
|
|
||||||
*
|
|
||||||
* Reference:- https://github.com/Baggz/Pinch
|
|
||||||
* Pinch is a small JavaScript utility which is able to replace any data in a JavaScript object (or JSON).
|
|
||||||
* */
|
|
||||||
(function(){var k=function(a,c){return a.length!==c.length?!1:a.every(function(a,b){return c[b]===a})},j=function(a,c,d){var b,e;if("[object Array]"===Object.prototype.toString.call(a)){b=0;for(e=a.length;b<e;b++)c.apply(d,[b,a[b],a])}else for(b in a)a.hasOwnProperty(b)&&c.apply(d,[b,a[b],a])},h=function(a){for(var c=[],d=!1,b=0,e=a.length,f="",g=function(){f&&(c.push(f),f="")};b<e;b++)a[b].match(/\[|\]/)?(g(),d="]"===a[b]?!1:!0):'"'!==a[b]&&"'"!==a[b]&&("."===a[b]&&!d?g():f+=a[b]),b===e-1&&g();return c},
|
|
||||||
g=function(a,c,d){var b=-1!==["string","object"].indexOf(typeof a),e="string"===typeof c||c&&c.test&&c.exec,f=-1!==["string","object","function"].indexOf(typeof d);b&&e&&f&&("string"===typeof a?(this.instance=JSON.parse(a),this.json=!0):this.instance=a,this.pattern="string"===typeof c?c.replace(/'/g,'"'):c,this.replacement=d,this.createIndex(this.instance))};g.prototype.createIndex=function(a,c){var d=this;this.index=this.index||[];c=c||"";j(a,function(a,e){var f,a=a+"";f=a.match(/^[a-zA-Z]+$/)?c?
|
|
||||||
c+"."+a:a:a.match(/\d+/)?c+"["+a+"]":c+'["'+a+'"]';d.index.push(f);"object"===typeof e&&d.createIndex(e,f)})};g.prototype.replace=function(){var a=this;j(this.index,function(c,d){if(a.pattern&&a.pattern.test&&a.pattern.exec&&d.match(a.pattern))return a.replaceValue(d);if("string"===typeof a.pattern){var b=h(d),e=h(a.pattern);if(k(b,e))return a.replaceValue(d)}});return this.json?JSON.stringify(this.instance):this.instance};g.prototype.replaceValue=function(a){var c=this,d=h(a);d.reduce(function(b,
|
|
||||||
e,f){if(f===d.length-1)f="function"===typeof c.replacement?c.replacement(a,e,b[e]):c.replacement,b[e]=f;else return b[e]},this.instance)};var i=function(a,c,d,b){a=(new g(a,c,d)).replace();return"function"===typeof b?b(null,a):a};"undefined"!==typeof module&&module.exports?module.exports=i:"undefined"!==typeof define?define(function(){return i}):this.pinch=i})();
|
|
@ -1,161 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015, 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 sso = {};
|
|
||||||
var ssoMod = require("sso");
|
|
||||||
var log = new Log();
|
|
||||||
(function () {
|
|
||||||
var carbon = require("carbon");
|
|
||||||
var process = require("process");
|
|
||||||
var getSSOSessions = function () {
|
|
||||||
var sso_sessions = application.get('sso_sessions');
|
|
||||||
|
|
||||||
if (!sso_sessions) {
|
|
||||||
application.put('sso_sessions', {});
|
|
||||||
sso_sessions = application.get('sso_sessions');
|
|
||||||
}
|
|
||||||
return sso_sessions;
|
|
||||||
};
|
|
||||||
|
|
||||||
sso.configure = function (issuer, appName, keyStoreParams, address, transport, ssoService, responseSign) {
|
|
||||||
sso.issuer = issuer;
|
|
||||||
sso.appName = appName;
|
|
||||||
sso.relayState = "/" + appName;
|
|
||||||
sso.transport = (transport ? transport : "https");
|
|
||||||
sso.ssoService = (ssoService ? ssoService : "/samlsso");
|
|
||||||
sso.responseSign = (responseSign ? responseSign : true);
|
|
||||||
sso.log = new Log("SSO Module");
|
|
||||||
sso.address = carbon.server.address(sso.transport);
|
|
||||||
sso.keyStoreProps = {
|
|
||||||
KEY_STORE_NAME: process.getProperty('carbon.home') + keyStoreParams.keyStoreName,
|
|
||||||
KEY_STORE_PASSWORD: keyStoreParams.keyStorePassword,
|
|
||||||
IDP_ALIAS: keyStoreParams.identityAlias
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
sso.login = function () {
|
|
||||||
sso.sessionId = session.getId();
|
|
||||||
var referer = request.getHeader("referer");
|
|
||||||
sso.relayState = (referer ? referer : sso.relayState);
|
|
||||||
sso.relayState = sso.relayState;// append query string
|
|
||||||
var log = new Log();
|
|
||||||
|
|
||||||
if (request.getQueryString()) {
|
|
||||||
|
|
||||||
sso.relayState += request.getQueryString();
|
|
||||||
}
|
|
||||||
sso.encodedSAMLAuthRequest = ssoMod.client.getEncodedSAMLAuthRequest(sso.issuer);
|
|
||||||
var postUrl = sso.address + sso.ssoService;
|
|
||||||
if (log.isDebugEnabled()) {
|
|
||||||
log.debug("Request sent to IdP");
|
|
||||||
}
|
|
||||||
print("<div><p>You are now being redirected to SSO Provider. If the redirection fails, please click on the "+
|
|
||||||
"button below.</p> <form method='post' action='" + postUrl + "'><p><input type='hidden' " +
|
|
||||||
"name='SAMLRequest' value='" + sso.encodedSAMLAuthRequest + "'/><input type='hidden' " +
|
|
||||||
"name='RelayState' value='" + sso.relayState + "'/><input type='hidden' name='SSOAuthSessionID' " +
|
|
||||||
"value='" + sso.sessionId + "'/><button type='submit'>Redirect manually</button></p></form></div>" +
|
|
||||||
"<script type = 'text/javascript' >document.forms[0].submit();</script>");
|
|
||||||
};
|
|
||||||
|
|
||||||
sso.logout = function (user) {
|
|
||||||
var sso_sessions = getSSOSessions();
|
|
||||||
sso.sessionId = session.getId();
|
|
||||||
sso.sessionIndex = sso_sessions[sso.sessionId];
|
|
||||||
|
|
||||||
var referer = request.getHeader("referer");
|
|
||||||
sso.relayState = (referer ? referer : sso.relayState);
|
|
||||||
sso.relayState = sso.relayState + request.getQueryString(); // append query string
|
|
||||||
sso.encodedSAMLLogoutRequest = ssoMod.client.getEncodedSAMLLogoutRequest(user, sso.sessionIndex, sso.issuer);
|
|
||||||
var postUrl = sso.address + sso.ssoService;
|
|
||||||
|
|
||||||
if (log.isDebugEnabled()) {
|
|
||||||
sso.log.debug("Logout request recieved from session id ::: " + sso.sessionId);
|
|
||||||
}
|
|
||||||
print("<div><p>You are now redirected to Stratos Identity. If theredirection fails, please click the post " +
|
|
||||||
"button.</p> <form id='logoutForm' method='post' action='" + postUrl + "'> <p> <input type='hidden' " +
|
|
||||||
"name='SAMLRequest' value='" + sso.encodedSAMLLogoutRequest + "'/> <input type='hidden' " +
|
|
||||||
"name='RelayState' value='" + sso.relayState + "'/> <input type='hidden' name='SSOAuthSessionID' " +
|
|
||||||
"value='" + sso.sessionId + "'/> <button type='submit'>POST</button> </p> </form> </div> <script " +
|
|
||||||
"type = 'text/javascript' > document.forms[0].submit(); </script>");
|
|
||||||
};
|
|
||||||
|
|
||||||
sso.acs = function (loginCallback, logoutCallback) {
|
|
||||||
var sso_sessions = getSSOSessions();
|
|
||||||
sso.sessionId = session.getId();
|
|
||||||
var samlResponse = request.getParameter('SAMLResponse');
|
|
||||||
var samlRequest = request.getParameter('SAMLRequest');
|
|
||||||
var relayState = request.getParameter('RelayState');
|
|
||||||
var samlRespObj;
|
|
||||||
|
|
||||||
if (samlResponse != null) {
|
|
||||||
samlRespObj = ssoMod.client.getSamlObject(samlResponse);
|
|
||||||
if (ssoMod.client.isLogoutResponse(samlRespObj)) {
|
|
||||||
logoutCallback();
|
|
||||||
if (log.isDebugEnabled()) {
|
|
||||||
sso.log.debug('Session Id Invalidated :::' + sso.sessionId);
|
|
||||||
}
|
|
||||||
// Invalidating the session after the callback
|
|
||||||
session.invalidate();
|
|
||||||
} else {
|
|
||||||
if (log.isDebugEnabled()) {
|
|
||||||
sso.log.debug("Login request");
|
|
||||||
}
|
|
||||||
// validating the signature
|
|
||||||
if (sso.responseSign) {
|
|
||||||
if (ssoMod.client.validateSignature(samlRespObj, sso.keyStoreProps)) {
|
|
||||||
var sessionObj = ssoMod.client.decodeSAMLLoginResponse(samlRespObj, samlResponse,
|
|
||||||
sso.sessionId);
|
|
||||||
if (log.isDebugEnabled()) {
|
|
||||||
sso.log.debug("Saml object session ID :::" + sessionObj.sessionId);
|
|
||||||
}
|
|
||||||
if (sessionObj.sessionIndex != null || sessionObj.sessionIndex != 'undefined') {
|
|
||||||
sso_sessions[sso_sessions[sessionObj.sessionIndex] = sessionObj.sessionId] =
|
|
||||||
sessionObj.sessionIndex;
|
|
||||||
if (log.isDebugEnabled()) {
|
|
||||||
sso.log.debug("Login successful");
|
|
||||||
sso.log.debug('User is set :::' + sessionObj.loggedInUser);
|
|
||||||
}
|
|
||||||
loginCallback(sessionObj.loggedInUser);
|
|
||||||
} else {
|
|
||||||
sso.log.error("Session index invalid");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
sso.log.error("Response Signing failed");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (log.isDebugEnabled()) {
|
|
||||||
sso.log.debug("Response Signing is disabled");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
Executed for single logout requests
|
|
||||||
*/
|
|
||||||
if (samlRequest != null) {
|
|
||||||
var index = ssoMod.client.decodeSAMLLogoutRequest(ssoMod.client.getSamlObject(samlRequest));
|
|
||||||
var jSessionId = getSSOSessions()[index];
|
|
||||||
delete getSSOSessions()[index];
|
|
||||||
if (log.isDebugEnabled()) {
|
|
||||||
sso.log.debug('Backend logout received from store. The index is :::' + index);
|
|
||||||
sso.log.debug('Session Id Invalidated :::' + jSessionId);
|
|
||||||
}
|
|
||||||
session.invalidate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})();
|
|
@ -1,299 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015, 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 userModule;
|
|
||||||
userModule = function () {
|
|
||||||
var log = new Log("modules/user.js");
|
|
||||||
|
|
||||||
var constants = require("/modules/constants.js");
|
|
||||||
var utility = require("/modules/utility.js").utility;
|
|
||||||
|
|
||||||
//var userManagementService = utility.getUserManagementService();
|
|
||||||
|
|
||||||
var publicMethods = {};
|
|
||||||
var privateMethods = {};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Authenticate a user when he or she attempts to login to DC.
|
|
||||||
*
|
|
||||||
* @param username Username of the user
|
|
||||||
* @param password Password of the user
|
|
||||||
* @param successCallback Function to be called at the event of successful authentication
|
|
||||||
* @param failureCallback Function to be called at the event of failed authentication
|
|
||||||
*/
|
|
||||||
publicMethods.login = function (username, password, successCallback, failureCallback) {
|
|
||||||
var carbonModule = require("carbon");
|
|
||||||
var carbonServer = application.get("carbonServer");
|
|
||||||
try {
|
|
||||||
// get tenant specific full user name.
|
|
||||||
username = username + "@" + carbonModule.server.tenantDomain();
|
|
||||||
// check if the user is an authenticated user.
|
|
||||||
var isAuthenticated = carbonServer.authenticate(username, password);
|
|
||||||
if (isAuthenticated) {
|
|
||||||
var tenantUser = carbonModule.server.tenantUser(username);
|
|
||||||
session.put(constants.USER_SESSION_KEY, tenantUser);
|
|
||||||
successCallback(tenantUser);
|
|
||||||
} else {
|
|
||||||
failureCallback();
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Register user to dc-user-store.
|
|
||||||
*
|
|
||||||
* @param username Username of the user
|
|
||||||
* @param firstname First name of the user
|
|
||||||
* @param lastname Last name of the user
|
|
||||||
* @param emailAddress Email address of the user
|
|
||||||
* @param password Password of the user
|
|
||||||
* @param userRoles Roles assigned to the user
|
|
||||||
*
|
|
||||||
* @returns {number} HTTP Status code 201 if succeeded, 409 if user already exists
|
|
||||||
*/
|
|
||||||
publicMethods.registerUser = function (username, firstname, lastname, emailAddress, password, userRoles) {
|
|
||||||
var carbon = require('carbon');
|
|
||||||
var tenantId = carbon.server.tenantId();
|
|
||||||
var url = carbon.server.address('https') + "/admin/services";
|
|
||||||
var server = new carbon.server.Server(url);
|
|
||||||
var userManager = new carbon.user.UserManager(server, tenantId);
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (userManager.userExists(username)) {
|
|
||||||
if (log.isDebugEnabled()) {
|
|
||||||
log.debug("A user with name '" + username + "' already exists.");
|
|
||||||
}
|
|
||||||
// http status code 409 refers to - conflict.
|
|
||||||
return 409;
|
|
||||||
} else {
|
|
||||||
var defaultUserClaims = privateMethods.buildDefaultUserClaims(firstname, lastname, emailAddress);
|
|
||||||
|
|
||||||
userManager.addUser(username, password, userRoles, defaultUserClaims, "default");
|
|
||||||
if (log.isDebugEnabled()) {
|
|
||||||
log.debug("A new user with name '" + username + "' was created.");
|
|
||||||
}
|
|
||||||
// http status code 201 refers to - created.
|
|
||||||
return 201;
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add user to dc-user-store.
|
|
||||||
*
|
|
||||||
* @param username Username of the user
|
|
||||||
* @param firstname First name of the user
|
|
||||||
* @param lastname Last name of the user
|
|
||||||
* @param emailAddress Email address of the user
|
|
||||||
* @param userRoles Roles assigned to the user
|
|
||||||
*
|
|
||||||
* @returns {number} HTTP Status code 201 if succeeded, 409 if user already exists
|
|
||||||
*/
|
|
||||||
publicMethods.addUser = function (username, firstname, lastname, emailAddress, userRoles) {
|
|
||||||
var carbon = require('carbon');
|
|
||||||
var tenantId = carbon.server.tenantId();
|
|
||||||
var url = carbon.server.address('https') + "/admin/services";
|
|
||||||
var server = new carbon.server.Server(url);
|
|
||||||
var userManager = new carbon.user.UserManager(server, tenantId);
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (userManager.userExists(username)) {
|
|
||||||
if (log.isDebugEnabled()) {
|
|
||||||
log.debug("A user with name '" + username + "' already exists.");
|
|
||||||
}
|
|
||||||
// http status code 409 refers to - conflict.
|
|
||||||
return 409;
|
|
||||||
} else {
|
|
||||||
var initialUserPassword = privateMethods.generateInitialUserPassword();
|
|
||||||
var defaultUserClaims = privateMethods.buildDefaultUserClaims(firstname, lastname, emailAddress);
|
|
||||||
|
|
||||||
userManager.addUser(username, initialUserPassword, userRoles, defaultUserClaims, "default");
|
|
||||||
privateMethods.inviteUserToEnroll(username, initialUserPassword);
|
|
||||||
if (log.isDebugEnabled()) {
|
|
||||||
log.debug("A new user with name '" + username + "' was created.");
|
|
||||||
}
|
|
||||||
// http status code 201 refers to - created.
|
|
||||||
return 201;
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove an existing user from mdm-user-store.
|
|
||||||
*
|
|
||||||
* @param username Username of the user
|
|
||||||
* @returns {number} HTTP Status code 200 if succeeded, 409 if the user does not exist
|
|
||||||
*/
|
|
||||||
publicMethods.removeUser = function (username) {
|
|
||||||
var carbon = require('carbon');
|
|
||||||
var tenantId = carbon.server.tenantId();
|
|
||||||
var url = carbon.server.address('https') + "/admin/services";
|
|
||||||
var server = new carbon.server.Server(url);
|
|
||||||
var userManager = new carbon.user.UserManager(server, tenantId);
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (userManager.userExists(username)) {
|
|
||||||
userManager.removeUser(username);
|
|
||||||
if (log.isDebugEnabled()) {
|
|
||||||
log.debug("An existing user with name '" + username + "' was removed.");
|
|
||||||
}
|
|
||||||
// http status code 200 refers to - success.
|
|
||||||
return 200;
|
|
||||||
} else {
|
|
||||||
if (log.isDebugEnabled()) {
|
|
||||||
log.debug("A user with name '" + username + "' does not exist to remove.");
|
|
||||||
}
|
|
||||||
// http status code 409 refers to - conflict.
|
|
||||||
return 409;
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Private method to be used by addUser() to
|
|
||||||
* generate an initial user password for a user.
|
|
||||||
* This will be the password used by a user for his initial login to the system.
|
|
||||||
*
|
|
||||||
* @returns {string} Initial User Password
|
|
||||||
*/
|
|
||||||
privateMethods.generateInitialUserPassword = function () {
|
|
||||||
var passwordLength = 6;
|
|
||||||
//defining the pool of characters to be used for initial password generation
|
|
||||||
var lowerCaseCharset = "abcdefghijklmnopqrstuvwxyz";
|
|
||||||
var upperCaseCharset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
|
||||||
var numericCharset = "0123456789";
|
|
||||||
|
|
||||||
var totalCharset = lowerCaseCharset + upperCaseCharset + numericCharset;
|
|
||||||
var totalCharsetLength = totalCharset.length;
|
|
||||||
|
|
||||||
var initialUserPassword = "";
|
|
||||||
for (var i = 0; i < passwordLength; ++i) {
|
|
||||||
initialUserPassword += totalCharset.charAt(Math.floor(Math.random() * totalCharsetLength));
|
|
||||||
}
|
|
||||||
if (log.isDebugEnabled()) {
|
|
||||||
log.debug("Initial password created for new user : " + initialUserPassword);
|
|
||||||
}
|
|
||||||
return String(initialUserPassword);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Build default user claims.
|
|
||||||
*
|
|
||||||
* @param firstname First name of the user
|
|
||||||
* @param lastname Last name of the user
|
|
||||||
* @param emailAddress Email address of the user
|
|
||||||
*
|
|
||||||
* @returns {Object} Default user claims to be provided
|
|
||||||
*/
|
|
||||||
privateMethods.buildDefaultUserClaims = function (firstname, lastname, emailAddress) {
|
|
||||||
var defaultUserClaims = {
|
|
||||||
"http://wso2.org/claims/givenname": firstname,
|
|
||||||
"http://wso2.org/claims/lastname": lastname,
|
|
||||||
"http://wso2.org/claims/emailaddress": emailAddress
|
|
||||||
};
|
|
||||||
if (log.isDebugEnabled()) {
|
|
||||||
log.debug("ClaimMap created for new user : " + stringify(defaultUserClaims));
|
|
||||||
}
|
|
||||||
return defaultUserClaims;
|
|
||||||
};
|
|
||||||
|
|
||||||
publicMethods.addPermissions = function (permissionList, path, init) {
|
|
||||||
var carbonModule = require("carbon");
|
|
||||||
var carbonServer = application.get("carbonServer");
|
|
||||||
var options = {system: true};
|
|
||||||
if (init == "login") {
|
|
||||||
var carbonUser = session.get(constants.USER_SESSION_KEY);
|
|
||||||
if (carbonUser) {
|
|
||||||
options.tenantId = carbonUser.tenantId;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var registry = new carbonModule.registry.Registry(carbonServer, options);
|
|
||||||
var i, permission, resource;
|
|
||||||
for (i = 0; i < permissionList.length; i++) {
|
|
||||||
permission = permissionList[i];
|
|
||||||
resource = {
|
|
||||||
collection : true,
|
|
||||||
name : permission.name,
|
|
||||||
properties : {
|
|
||||||
name : permission.name
|
|
||||||
}
|
|
||||||
};
|
|
||||||
registry.put("/_system/governance/permission/" + path + "/" + permission.key, resource);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
//publicMethods.getUsers = function () {
|
|
||||||
// var carbon = require('carbon');
|
|
||||||
//
|
|
||||||
// var carbonUser = session.get(constants.USER_SESSION_KEY);
|
|
||||||
// if (!carbonUser) {
|
|
||||||
// log.error("User object was not found in the session");
|
|
||||||
// throw constants.ERRORS.USER_NOT_FOUND;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// var userList;
|
|
||||||
// try{
|
|
||||||
// userList = userManagementService.getUsersForTenant(carbonUser.tenantId);
|
|
||||||
// }catch(e){
|
|
||||||
// log.error("Error occurred while reading all users");
|
|
||||||
// return [];
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// var users = [];
|
|
||||||
// var i, userObject;
|
|
||||||
// for (i = 0; i < userList.size(); i++) {
|
|
||||||
// userObject = userList.get(i);
|
|
||||||
// users.push({
|
|
||||||
// "username" : userObject.getUserName(),
|
|
||||||
// "email" : userObject.getEmail(),
|
|
||||||
// "name" : userObject.getFirstName() + " " + userObject.getLastName()
|
|
||||||
// });
|
|
||||||
// }
|
|
||||||
// return users;
|
|
||||||
//};
|
|
||||||
|
|
||||||
publicMethods.isAuthorized = function (permission) {
|
|
||||||
var carbonModule = require("carbon");
|
|
||||||
var carbonServer = application.get("carbonServer");
|
|
||||||
var carbonUser = session.get(constants.USER_SESSION_KEY);
|
|
||||||
if (!carbonUser) {
|
|
||||||
log.error("User object was not found in the session");
|
|
||||||
throw constants.ERRORS.USER_NOT_FOUND;
|
|
||||||
}
|
|
||||||
var userManager = new carbonModule.user.UserManager(carbonServer, carbonUser.tenantId);
|
|
||||||
var user = new carbonModule.user.User(userManager, carbonUser.username);
|
|
||||||
return user.isAuthorized(permission, "ui.execute");
|
|
||||||
};
|
|
||||||
|
|
||||||
publicMethods.logout = function (successCallback) {
|
|
||||||
session.invalidate();
|
|
||||||
successCallback();
|
|
||||||
};
|
|
||||||
|
|
||||||
return publicMethods;
|
|
||||||
}();
|
|
||||||
|
|
||||||
|
|
@ -1,59 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015, 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 utility;
|
|
||||||
utility = function () {
|
|
||||||
//var JavaClass = Packages.java.lang.Class;
|
|
||||||
//var PrivilegedCarbonContext = Packages.org.wso2.carbon.context.PrivilegedCarbonContext;
|
|
||||||
|
|
||||||
//var getOsgiService = function (className) {
|
|
||||||
// var log = new Log();
|
|
||||||
// log.info("###### Current Class : "+className);
|
|
||||||
// return PrivilegedCarbonContext.getThreadLocalCarbonContext().getOSGiService(JavaClass.forName(className));
|
|
||||||
//};
|
|
||||||
|
|
||||||
var publicMethods = {};
|
|
||||||
|
|
||||||
//publicMethods.getUserManagementService = function () {
|
|
||||||
// return getOsgiService('org.wso2.carbon.device.mgt.user.core.service.UserManagementService');
|
|
||||||
//};
|
|
||||||
|
|
||||||
publicMethods.insertAppPermissions = function (userModule, type) {
|
|
||||||
userModule.addPermissions([{key: "device-mgt", name: "Device Management"}], "", type);
|
|
||||||
userModule.addPermissions([{key: "admin", name: "Device Management Admin"}], "device-mgt", type);
|
|
||||||
userModule.addPermissions([{key: "user", name: "Device Management User"}], "device-mgt", type);
|
|
||||||
|
|
||||||
userModule.addPermissions([{key: "devices", name: "Devices"}], "device-mgt/admin", type);
|
|
||||||
userModule.addPermissions([{key: "devices/list", name: "List Devices"}], "device-mgt/admin", type);
|
|
||||||
userModule.addPermissions([{key: "devices/operation", name: "Perform Operation"}], "device-mgt/admin", type);
|
|
||||||
|
|
||||||
userModule.addPermissions([{key: "users", name: "Users"}], "device-mgt/admin", type);
|
|
||||||
userModule.addPermissions([{key: "users/add", name: "Add New Users"}], "device-mgt/admin", type);
|
|
||||||
userModule.addPermissions([{key: "users/invite", name: "Invite Users"}], "device-mgt/admin", type);
|
|
||||||
userModule.addPermissions([{key: "users/list", name: "List Users"}], "device-mgt/admin", type);
|
|
||||||
userModule.addPermissions([{key: "users/remove", name: "Remove Users"}], "device-mgt/admin", type);
|
|
||||||
|
|
||||||
userModule.addPermissions([{key: "devices", name: "Devices"}], "device-mgt/user", type);
|
|
||||||
userModule.addPermissions([{key: "devices/list", name: "List Devices"}], "device-mgt/user", type);
|
|
||||||
userModule.addPermissions([{key: "devices/operation", name: "Perform Operation"}], "device-mgt/user", "init");
|
|
||||||
};
|
|
||||||
|
|
||||||
return publicMethods;
|
|
||||||
}();
|
|
||||||
|
|
||||||
|
|
@ -1,8 +0,0 @@
|
|||||||
{{layout "fluid"}}
|
|
||||||
{{#zone "title"}}
|
|
||||||
WSO2 DC | Device Cloud
|
|
||||||
{{/zone}}
|
|
||||||
{{#zone "body"}}
|
|
||||||
{{unit "appbar"}}
|
|
||||||
{{unit "mydevice"}}
|
|
||||||
{{/zone}}
|
|
@ -1,20 +0,0 @@
|
|||||||
<%
|
|
||||||
/*
|
|
||||||
* Copyright (c) 2015, 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.
|
|
||||||
*/
|
|
||||||
require("jaggery-test").test.run();
|
|
||||||
%>
|
|
@ -1,141 +0,0 @@
|
|||||||
{{#zone "main"}}
|
|
||||||
|
|
||||||
<header>
|
|
||||||
<div class="container container-fluid">
|
|
||||||
<!-- Static navbar -->
|
|
||||||
<nav class="navbar navbar-default">
|
|
||||||
<div class=" margin-top">
|
|
||||||
<!-- Brand and toggle get grouped for better mobile display -->
|
|
||||||
<div class="navbar-header">
|
|
||||||
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
|
|
||||||
<span class="sr-only">Toggle navigation</span>
|
|
||||||
<span class="icon-bar"></span>
|
|
||||||
<span class="icon-bar"></span>
|
|
||||||
<span class="icon-bar"></span>
|
|
||||||
</button>
|
|
||||||
<a class="navbar-brand" href="/sensebot/"><img src="{{self
|
|
||||||
.publicURL}}/images/logo.png" </a>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Collect the nav links, forms, and other content for toggling -->
|
|
||||||
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
|
|
||||||
<ul class="nav navbar-nav">
|
|
||||||
<li><a href="#"></a></li>
|
|
||||||
<li><a href="#">ARCHITECTURE</a></li>
|
|
||||||
<li><a href="#">GUIDE</a></li>
|
|
||||||
<li><a href="#">SUPPORT</a></li>
|
|
||||||
<li><a href="#">COMMUNITY</a></li>
|
|
||||||
{{#if user}}
|
|
||||||
<li><a href="/iot/alldevices">MY DEVICES</a></li>
|
|
||||||
{{/if}}
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<ul class="nav navbar-nav navbar-right">
|
|
||||||
<li >
|
|
||||||
<form class="navbar-form" role="search">
|
|
||||||
<div class="input-group">
|
|
||||||
<input type="text" class="form-control" name="q">
|
|
||||||
<div class="input-group-btn">
|
|
||||||
<button class="btn btn-default" type="submit"><i class="glyphicon glyphicon-search"></i></button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
</div><!-- /.navbar-collapse -->
|
|
||||||
|
|
||||||
</div><!-- /.container-fluid -->
|
|
||||||
</nav>
|
|
||||||
</div><!--container-->
|
|
||||||
<div class="sign-panel" data-type="register">
|
|
||||||
<div class="container padding margin-top-double ">
|
|
||||||
<h5 >Register </h5> <hr class="opacity">
|
|
||||||
<div class="form-group" align="center">
|
|
||||||
<span class="wr-validation-summary hidden">
|
|
||||||
<strong class="label label-danger"></strong>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div class="col-lg-5 padding center ">
|
|
||||||
<div class="col-lg-5 right padding-top-double uppercase ">
|
|
||||||
First Name
|
|
||||||
</div>
|
|
||||||
<div class="col-lg-7 ">
|
|
||||||
<input type="text right" id="first_name" placeholder="First Name">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-lg-5 padding center ">
|
|
||||||
<div class="col-lg-5 right padding-top-double uppercase ">
|
|
||||||
Last Name
|
|
||||||
</div>
|
|
||||||
<div class="col-lg-7 ">
|
|
||||||
<input type="text right" id="last_name" placeholder="Last Name">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-lg-5 padding center ">
|
|
||||||
<div class="col-lg-5 right padding-top-double uppercase ">
|
|
||||||
Username
|
|
||||||
</div>
|
|
||||||
<div class="col-lg-7 ">
|
|
||||||
<input type="text right" id="user_name" placeholder="Username ">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-lg-5 padding center ">
|
|
||||||
<div class="col-lg-5 right padding-top-double uppercase ">
|
|
||||||
Email
|
|
||||||
</div>
|
|
||||||
<div class="col-lg-7 ">
|
|
||||||
<input type="text right" id="email" placeholder="Email">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-lg-5 padding center ">
|
|
||||||
<div class="col-lg-5 right padding-top-double uppercase ">
|
|
||||||
Password
|
|
||||||
</div>
|
|
||||||
<div class="col-lg-7 ">
|
|
||||||
<input type="password" id="password" placeholder="Password">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-lg-5 padding center ">
|
|
||||||
<div class="col-lg-5 right padding-top-double uppercase ">
|
|
||||||
Confirm Password
|
|
||||||
</div>
|
|
||||||
<div class="col-lg-7 ">
|
|
||||||
<input type="password" id="password_confirmation"
|
|
||||||
placeholder="Confirm Password">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-lg-9 right padding-top-double padding-bottom-double margin-right-none">
|
|
||||||
<input type="checkbox" name="Agree" id="t_and_c" value="Bike"> <span class="italic">
|
|
||||||
I Agree by Clicking register, you agree to the Terms and Conditions set out by this site</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-lg-12 center padding-top-double padding-bottom-double">
|
|
||||||
<button id="add-user-btn" class="blue-action-btn uppercase margin">
|
|
||||||
Register </button>
|
|
||||||
<button class="black-btn uppercase margin cancel-btn" > Cancel</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="sign-panel" data-type="login">
|
|
||||||
<form method="POST" class="form-login-box" action="{{loginPath}}">
|
|
||||||
<div class="container padding margin-top-double ">
|
|
||||||
<h5 >Login </h5> <hr class="opacity">
|
|
||||||
|
|
||||||
<div class="col-lg-3 padding ">
|
|
||||||
Username :<br> <input type="text" name="username" />
|
|
||||||
</div>
|
|
||||||
<div class="col-lg-3 padding ">
|
|
||||||
Password: <br> <input type="password" name="password" />
|
|
||||||
</div>
|
|
||||||
<div class="col-lg-6 padding-top-double padding-bottom-double padding-left-none">
|
|
||||||
<button class="blue-action-btn uppercase margin" onclick="document.location.href='home.html';"> Login</button>
|
|
||||||
<button class="black-btn uppercase margin cancel-btn " > Cancel</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
{{/zone}}
|
|
@ -1,19 +0,0 @@
|
|||||||
function onRequest(context){
|
|
||||||
var dcProps = require('/config/dc-props.js').config();
|
|
||||||
if (dcProps.ssoConfiguration.enabled) {
|
|
||||||
response.sendRedirect(dcProps.appContext + "sso/login");
|
|
||||||
exit();
|
|
||||||
}else{
|
|
||||||
context.loginPath = "api/user/login";
|
|
||||||
}
|
|
||||||
|
|
||||||
var constants = require("/modules/constants.js");
|
|
||||||
var localLogoutURL = dcProps.appContext + "api/user/logout";
|
|
||||||
var ssoLogoutURL = dcProps.appContext + "sso/logout";
|
|
||||||
context.logoutURL = dcProps.ssoConfiguration.enabled? ssoLogoutURL : localLogoutURL;
|
|
||||||
context.user = session.get(constants.USER_SESSION_KEY);
|
|
||||||
|
|
||||||
context.viewonly = !context.user;
|
|
||||||
|
|
||||||
return context;
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
{
|
|
||||||
"predicate": "false"
|
|
||||||
}
|
|
Before Width: | Height: | Size: 5.1 KiB |
@ -1,74 +0,0 @@
|
|||||||
.navbar-default {
|
|
||||||
background-color: #2a2a2a;
|
|
||||||
border-color:#2a2a2a ;
|
|
||||||
}
|
|
||||||
.navbar-nav{color: #a5a5a5; font-weight:300; padding-top: 5px; padding-left:0px;}
|
|
||||||
.form-control {background-color: #121212; border: 0px;}
|
|
||||||
.btn-default {background-color: #121212; border: 1px solid #121212;}
|
|
||||||
.container { padding:0px;}
|
|
||||||
.container-fluid{padding-left:0px;}
|
|
||||||
.navbar-default .navbar-nav > li > a {color: #a5a5a5; font-size: 14px; font-weight: 500;}
|
|
||||||
.navbar-form .input-group > .form-control { height: 39px; margin-top: 0; }
|
|
||||||
.input-group-btn:last-child > .btn, .input-group-btn:last-child > .btn-group { height: 39px;}
|
|
||||||
.container-bg{background-image: url("../images/content-bg.png"); background-repeat: no-repeat; background-position: top left; min-height: 550px; overflow: hidden; padding: 0 15px;}
|
|
||||||
.navbar-default .navbar-nav > li > a :focus,.navbar-default .navbar-nav>li>a:hover{color:#ccc;background-color:transparent;}
|
|
||||||
.btn-default.active,
|
|
||||||
.btn-default.focus,
|
|
||||||
.btn-default:active,
|
|
||||||
.btn-default:focus,
|
|
||||||
.btn-default:hover,
|
|
||||||
.open>.dropdown-toggle.btn-default {
|
|
||||||
color: #ccc;
|
|
||||||
background-color: #121212;
|
|
||||||
border-color: #121212;
|
|
||||||
}
|
|
||||||
input {
|
|
||||||
background-color: #333;
|
|
||||||
border: 1px solid #2a2a2a;
|
|
||||||
border-radius: 3px;
|
|
||||||
height: 45px;
|
|
||||||
margin: 5px 0;
|
|
||||||
width: 100%;
|
|
||||||
padding-left: 10px;
|
|
||||||
}
|
|
||||||
input[type="checkbox"], input[type="radio"] {
|
|
||||||
line-height: normal;
|
|
||||||
margin-top: -3px;
|
|
||||||
width: 30px;
|
|
||||||
}
|
|
||||||
.navbar-default .navbar-nav>li>a:focus,
|
|
||||||
.navbar-default .navbar-nav>li>a:hover {
|
|
||||||
color: #747474;
|
|
||||||
outline: 0;
|
|
||||||
}
|
|
||||||
.navbar {
|
|
||||||
margin-bottom: 5px;
|
|
||||||
}
|
|
||||||
.navbar-brand {
|
|
||||||
padding: 15px 10px;
|
|
||||||
}
|
|
||||||
.navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:focus, .navbar-default .navbar-nav > .open > a:hover {
|
|
||||||
color: #fff;
|
|
||||||
background-color:#202020 ;
|
|
||||||
}
|
|
||||||
.dropdown-menu {
|
|
||||||
background-clip: padding-box;
|
|
||||||
background-color: #202020;
|
|
||||||
border: 0px solid rgba(0, 0, 0, 0.15);
|
|
||||||
border-radius: 0;
|
|
||||||
box-shadow: none;
|
|
||||||
display: none;
|
|
||||||
float: left;
|
|
||||||
font-size: 14px;
|
|
||||||
left: 0;
|
|
||||||
color: #a5a5a5;
|
|
||||||
}
|
|
||||||
.dropdown-menu > li > a {
|
|
||||||
color: #a5a5a5;
|
|
||||||
}
|
|
||||||
.dropdown-menu>li>a:focus,
|
|
||||||
.dropdown-menu>li>a:hover {
|
|
||||||
color: #fff;
|
|
||||||
text-decoration: none;
|
|
||||||
background-color: #313131;
|
|
||||||
}
|
|
@ -1,177 +0,0 @@
|
|||||||
.fw, [class^="fw-"], [class*=" fw-"] {
|
|
||||||
display: inline-block;
|
|
||||||
font: normal normal normal 14px/1 fontwso2;
|
|
||||||
font-size: inherit;
|
|
||||||
speak: none;
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: normal;
|
|
||||||
font-variant: normal;
|
|
||||||
text-transform: none;
|
|
||||||
vertical-align: middle;
|
|
||||||
|
|
||||||
/* Better Font Rendering =========== */
|
|
||||||
-webkit-font-smoothing: antialiased;
|
|
||||||
-moz-osx-font-smoothing: grayscale;
|
|
||||||
text-rendering: auto;
|
|
||||||
transform: translate(0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* icon options */
|
|
||||||
.fw-lg {
|
|
||||||
font-size: 1.33333333em;
|
|
||||||
line-height: 0.75em;
|
|
||||||
vertical-align: -15%;
|
|
||||||
}
|
|
||||||
.fw-1-5x {
|
|
||||||
font-size: 1.5em;
|
|
||||||
}
|
|
||||||
.fw-2x {
|
|
||||||
font-size: 2em;
|
|
||||||
}
|
|
||||||
.fw-3x {
|
|
||||||
font-size: 3em;
|
|
||||||
}
|
|
||||||
.fw-4x {
|
|
||||||
font-size: 4em;
|
|
||||||
}
|
|
||||||
.fw-5x {
|
|
||||||
font-size: 5em;
|
|
||||||
}
|
|
||||||
.fw-fixedwidth {
|
|
||||||
width: 1.28571429em;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
.fw-ul {
|
|
||||||
padding-left: 0;
|
|
||||||
margin-left: 2.14285714em;
|
|
||||||
list-style-type: none;
|
|
||||||
}
|
|
||||||
.fw-ul > li {
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
.fw-li {
|
|
||||||
position: absolute;
|
|
||||||
left: -2.14285714em;
|
|
||||||
width: 2.14285714em;
|
|
||||||
top: 0.14285714em;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
.fw-li.fw-lg {
|
|
||||||
left: -1.85714286em;
|
|
||||||
}
|
|
||||||
.fw-border {
|
|
||||||
padding: .2em .25em .15em;
|
|
||||||
border: solid 0.08em #eeeeee;
|
|
||||||
border-radius: .1em;
|
|
||||||
}
|
|
||||||
.pull-right {
|
|
||||||
float: right;
|
|
||||||
}
|
|
||||||
.pull-left {
|
|
||||||
float: left;
|
|
||||||
}
|
|
||||||
.fw.pull-left {
|
|
||||||
margin-right: .3em;
|
|
||||||
}
|
|
||||||
.fw.pull-right {
|
|
||||||
margin-left: .3em;
|
|
||||||
}
|
|
||||||
.fw-spin {
|
|
||||||
-webkit-animation: wso2icon-spin 2s infinite linear;
|
|
||||||
animation: wso2icon-spin 2s infinite linear;
|
|
||||||
}
|
|
||||||
.fw-pulse {
|
|
||||||
-webkit-animation: wso2icon-spin 1s infinite steps(8);
|
|
||||||
animation: wso2icon-spin 1s infinite steps(8);
|
|
||||||
}
|
|
||||||
@-webkit-keyframes wso2icon-spin {
|
|
||||||
0% {
|
|
||||||
-webkit-transform: rotate(0deg);
|
|
||||||
transform: rotate(0deg);
|
|
||||||
}
|
|
||||||
100% {
|
|
||||||
-webkit-transform: rotate(359deg);
|
|
||||||
transform: rotate(359deg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@keyframes wso2icon-spin {
|
|
||||||
0% {
|
|
||||||
-webkit-transform: rotate(0deg);
|
|
||||||
transform: rotate(0deg);
|
|
||||||
}
|
|
||||||
100% {
|
|
||||||
-webkit-transform: rotate(359deg);
|
|
||||||
transform: rotate(359deg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.fw-rotate-90 {
|
|
||||||
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);
|
|
||||||
-webkit-transform: rotate(90deg);
|
|
||||||
-ms-transform: rotate(90deg);
|
|
||||||
transform: rotate(90deg);
|
|
||||||
}
|
|
||||||
.fw-rotate-180 {
|
|
||||||
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);
|
|
||||||
-webkit-transform: rotate(180deg);
|
|
||||||
-ms-transform: rotate(180deg);
|
|
||||||
transform: rotate(180deg);
|
|
||||||
}
|
|
||||||
.fw-rotate-270 {
|
|
||||||
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
|
|
||||||
-webkit-transform: rotate(270deg);
|
|
||||||
-ms-transform: rotate(270deg);
|
|
||||||
transform: rotate(270deg);
|
|
||||||
}
|
|
||||||
.fw-flip-horizontal {
|
|
||||||
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);
|
|
||||||
-webkit-transform: scale(-1, 1);
|
|
||||||
-ms-transform: scale(-1, 1);
|
|
||||||
transform: scale(-1, 1);
|
|
||||||
}
|
|
||||||
.fw-flip-vertical {
|
|
||||||
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);
|
|
||||||
-webkit-transform: scale(1, -1);
|
|
||||||
-ms-transform: scale(1, -1);
|
|
||||||
transform: scale(1, -1);
|
|
||||||
}
|
|
||||||
:root .fw-rotate-90,
|
|
||||||
:root .fw-rotate-180,
|
|
||||||
:root .fw-rotate-270,
|
|
||||||
:root .fw-flip-horizontal,
|
|
||||||
:root .fw-flip-vertical {
|
|
||||||
filter: none;
|
|
||||||
}
|
|
||||||
.fw-stack, .fw-stack-md {
|
|
||||||
position: relative;
|
|
||||||
display: inline-block;
|
|
||||||
width: 2em;
|
|
||||||
height: 2em;
|
|
||||||
line-height: 1.8em;
|
|
||||||
vertical-align: middle;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
.fw-stack-md {
|
|
||||||
width: 1em;
|
|
||||||
}
|
|
||||||
.fw-stack-1x,
|
|
||||||
.fw-stack-2x,
|
|
||||||
.fw-stack-1-5x {
|
|
||||||
position: absolute;
|
|
||||||
left: 0;
|
|
||||||
width: 100%;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
.fw-stack-1x {
|
|
||||||
line-height: inherit;
|
|
||||||
font-size: 0.9em;
|
|
||||||
}
|
|
||||||
.fw-stack-1-5x {
|
|
||||||
line-height: inherit;
|
|
||||||
font-size: 1.2em;
|
|
||||||
}
|
|
||||||
.fw-stack-2x {
|
|
||||||
font-size: 1.8em;
|
|
||||||
}
|
|
||||||
.fw-inverse {
|
|
||||||
color: #ffffff;
|
|
||||||
}
|
|
@ -1,481 +0,0 @@
|
|||||||
@font-face {
|
|
||||||
font-family: 'fontwso2';
|
|
||||||
src:url('../fonts/fontwso2.eot?3uii6i');
|
|
||||||
src:url('../fonts/fontwso2.eot?#iefix3uii6i') format('embedded-opentype'),
|
|
||||||
url('../fonts/fontwso2.woff?3uii6i') format('woff'),
|
|
||||||
url('../fonts/fontwso2.ttf?3uii6i') format('truetype'),
|
|
||||||
url('../fonts/fontwso2.svg?3uii6i#fontwso2') format('svg');
|
|
||||||
font-weight: normal;
|
|
||||||
font-style: normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw {
|
|
||||||
font-family: 'fontwso2';
|
|
||||||
speak: none;
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: normal;
|
|
||||||
font-variant: normal;
|
|
||||||
text-transform: none;
|
|
||||||
line-height: 1;
|
|
||||||
|
|
||||||
/* Better Font Rendering =========== */
|
|
||||||
-webkit-font-smoothing: antialiased;
|
|
||||||
-moz-osx-font-smoothing: grayscale;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-lifecycle:before {
|
|
||||||
content: "\e617";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-globe:before {
|
|
||||||
content: "\e666";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-filter:before {
|
|
||||||
content: "\e65b";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-store:before {
|
|
||||||
content: "\e61b";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-apple:before {
|
|
||||||
content: "\e613";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-android:before {
|
|
||||||
content: "\e653";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-windows:before {
|
|
||||||
content: "\e654";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-monitor:before {
|
|
||||||
content: "\e658";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-laptop:before {
|
|
||||||
content: "\e659";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-computer:before {
|
|
||||||
content: "\e655";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-mobile:before {
|
|
||||||
content: "\e656";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-dots:before {
|
|
||||||
content: "\e615";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-tiles:before {
|
|
||||||
content: "\e60e";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-menu:before {
|
|
||||||
content: "\e60f";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-list:before {
|
|
||||||
content: "\e610";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-grid:before {
|
|
||||||
content: "\e611";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-list2:before {
|
|
||||||
content: "\e667";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-user:before {
|
|
||||||
content: "\e601";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-add-user:before {
|
|
||||||
content: "\e668";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-key:before {
|
|
||||||
content: "\e665";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-star:before {
|
|
||||||
content: "\e65c";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-star-2:before {
|
|
||||||
content: "\e612";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-view:before {
|
|
||||||
content: "\e652";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-edit:before {
|
|
||||||
content: "\e65d";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-register2:before {
|
|
||||||
content: "\e669";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-register:before {
|
|
||||||
content: "\e65f";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-search:before {
|
|
||||||
content: "\e657";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-send:before {
|
|
||||||
content: "\e66a";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-delete:before {
|
|
||||||
content: "\e614";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-settings:before {
|
|
||||||
content: "\e65e";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-share:before {
|
|
||||||
content: "\e65a";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-message:before {
|
|
||||||
content: "\e616";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-bell:before {
|
|
||||||
content: "\e66b";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-lock:before {
|
|
||||||
content: "\e618";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-battery:before {
|
|
||||||
content: "\e619";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-camera:before {
|
|
||||||
content: "\e61a";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-wifi:before {
|
|
||||||
content: "\e606";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-usb-drive:before {
|
|
||||||
content: "\e602";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-hdd:before {
|
|
||||||
content: "\e61c";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-map-location:before {
|
|
||||||
content: "\e61d";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-invitation:before {
|
|
||||||
content: "\e664";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-dial-up:before {
|
|
||||||
content: "\e61f";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-incoming-call:before {
|
|
||||||
content: "\e620";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-clock:before {
|
|
||||||
content: "\e621";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-clean:before {
|
|
||||||
content: "\e622";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-sort:before {
|
|
||||||
content: "\e623";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-list-sort:before {
|
|
||||||
content: "\e624";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-sequence:before {
|
|
||||||
content: "\e625";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-rules:before {
|
|
||||||
content: "\e626";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-padlock:before {
|
|
||||||
content: "\e66c";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-uri:before {
|
|
||||||
content: "\e603";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-pdf:before {
|
|
||||||
content: "\e627";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-ms-document:before {
|
|
||||||
content: "\e629";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-swagger:before {
|
|
||||||
content: "\e62a";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-jquery:before {
|
|
||||||
content: "\e62b";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-java:before {
|
|
||||||
content: "\e62c";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-javaee:before {
|
|
||||||
content: "\e62d";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-javascript:before {
|
|
||||||
content: "\e62e";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-jaggery:before {
|
|
||||||
content: "\e62f";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-uncheck:before {
|
|
||||||
content: "\e630";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-check:before {
|
|
||||||
content: "\e631";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-up-arrow-2:before {
|
|
||||||
content: "\e660";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-down-arrow-2:before {
|
|
||||||
content: "\e661";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-left-arrow-2:before {
|
|
||||||
content: "\e662";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-right-arrow-2:before {
|
|
||||||
content: "\e663";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-up-arrow:before {
|
|
||||||
content: "\e632";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-down-arrow:before {
|
|
||||||
content: "\e63e";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-left-arrow:before {
|
|
||||||
content: "\e633";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-right-arrow:before {
|
|
||||||
content: "\e634";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-cancel:before {
|
|
||||||
content: "\e635";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-add:before {
|
|
||||||
content: "\e636";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-minus:before {
|
|
||||||
content: "\e628";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-refresh:before {
|
|
||||||
content: "\e637";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-ring:before {
|
|
||||||
content: "\e600";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-circle:before {
|
|
||||||
content: "\e638";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-ok:before {
|
|
||||||
content: "\e639";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-error:before {
|
|
||||||
content: "\e63a";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-block:before {
|
|
||||||
content: "\e63b";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-warning:before {
|
|
||||||
content: "\e605";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-deploy:before {
|
|
||||||
content: "\e66d";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-devices:before {
|
|
||||||
content: "\e63c";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-dss:before {
|
|
||||||
content: "\e63d";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-database:before {
|
|
||||||
content: "\e66e";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-computer2:before {
|
|
||||||
content: "\e66f";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-endpoint:before {
|
|
||||||
content: "\e63f";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-bpmn:before {
|
|
||||||
content: "\e640";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-bpel:before {
|
|
||||||
content: "\e641";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-gadget:before {
|
|
||||||
content: "\e642";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-application:before {
|
|
||||||
content: "\e643";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-cloud:before {
|
|
||||||
content: "\e644";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-service:before {
|
|
||||||
content: "\e645";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-rest-service:before {
|
|
||||||
content: "\e646";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-rest-api:before {
|
|
||||||
content: "\e647";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-api:before {
|
|
||||||
content: "\e648";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-service-provider:before {
|
|
||||||
content: "\e649";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-website:before {
|
|
||||||
content: "\e604";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-proxy:before {
|
|
||||||
content: "\e64a";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-policy:before {
|
|
||||||
content: "\e64b";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-security-policy:before {
|
|
||||||
content: "\e64c";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-throttling-policy:before {
|
|
||||||
content: "\e64d";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-blank-document:before {
|
|
||||||
content: "\e64e";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-ebook:before {
|
|
||||||
content: "\e670";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-document:before {
|
|
||||||
content: "\e671";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-text:before {
|
|
||||||
content: "\e64f";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-html:before {
|
|
||||||
content: "\e650";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-wadl:before {
|
|
||||||
content: "\e608";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-wsdl:before {
|
|
||||||
content: "\e609";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-xacml:before {
|
|
||||||
content: "\e60a";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-xsd:before {
|
|
||||||
content: "\e60b";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-xq:before {
|
|
||||||
content: "\e60c";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-xslt:before {
|
|
||||||
content: "\e60d";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-xml:before {
|
|
||||||
content: "\e61e";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-soap:before {
|
|
||||||
content: "\e651";
|
|
||||||
}
|
|
||||||
|
|
||||||
.fw-wso2:before {
|
|
||||||
content: "\e607";
|
|
||||||
}
|
|
||||||
|
|
@ -1,485 +0,0 @@
|
|||||||
/* _____________________________________________________________________________
|
|
||||||
|
|
||||||
FONT
|
|
||||||
_____________________________________________________________________________ */
|
|
||||||
/* Regular */
|
|
||||||
@font-face {
|
|
||||||
font-family: 'Open Sans';
|
|
||||||
|
|
||||||
src: url('../fonts/OpenSans-Regular-webfont.eot');
|
|
||||||
src: url('../fonts/OpenSans-Regular-webfont.eot?#iefix') format('embedded-opentype'),
|
|
||||||
url('../fonts/OpenSans-Regular-webfont.woff') format('woff'),
|
|
||||||
url('../fonts/OpenSans-Regular-webfont.ttf') format('truetype'),
|
|
||||||
url('../fonts/OpenSans-Regular-webfont.svg#OpenSansRegular') format('svg');
|
|
||||||
font-weight: normal;
|
|
||||||
font-weight: 400;
|
|
||||||
font-style: normal;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Italic */
|
|
||||||
@font-face {
|
|
||||||
font-family: 'Open Sans';
|
|
||||||
src: url('../fonts/OpenSans-Italic-webfont.eot');
|
|
||||||
src: url('../fonts/OpenSans-Italic-webfont.eot?#iefix') format('embedded-opentype'),
|
|
||||||
url('../fonts/OpenSans-Italic-webfont.woff') format('woff'),
|
|
||||||
url('../fonts/OpenSans-Italic-webfont.ttf') format('truetype'),
|
|
||||||
url('../fonts/OpenSans-Italic-webfont.svg#OpenSansItalic') format('svg');
|
|
||||||
font-weight: normal;
|
|
||||||
font-weight: 400;
|
|
||||||
font-style: italic;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Light */
|
|
||||||
@font-face {
|
|
||||||
font-family: 'Open Sans';
|
|
||||||
src: url('../fonts/OpenSans-Light-webfont.eot');
|
|
||||||
src: url('../fonts/OpenSans-Light-webfont.eot?#iefix') format('embedded-opentype'),
|
|
||||||
url('../fonts/OpenSans-Light-webfont.woff') format('woff'),
|
|
||||||
url('../fonts/OpenSans-Light-webfont.ttf') format('truetype'),
|
|
||||||
url('../fonts/OpenSans-Light-webfont.svg#OpenSansLight') format('svg');
|
|
||||||
font-weight: 200;
|
|
||||||
font-style: normal;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Light Italic */
|
|
||||||
@font-face {
|
|
||||||
font-family: 'Open Sans';
|
|
||||||
src: url('../fonts/OpenSans-LightItalic-webfont.eot');
|
|
||||||
src: url('../fonts/OpenSans-LightItalic-webfont.eot?#iefix') format('embedded-opentype'),
|
|
||||||
url('../fonts/OpenSans-LightItalic-webfont.woff') format('woff'),
|
|
||||||
url('../fonts/OpenSans-LightItalic-webfont.ttf') format('truetype'),
|
|
||||||
url('../fonts/OpenSans-LightItalic-webfont.svg#OpenSansLightItalic') format('svg');
|
|
||||||
font-weight: 200;
|
|
||||||
font-style: italic;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Semibold */
|
|
||||||
@font-face {
|
|
||||||
font-family: 'Open Sans';
|
|
||||||
src: url('../fonts/OpenSans-Semibold-webfont.eot');
|
|
||||||
src: url('../fonts/OpenSans-Semibold-webfont.eot?#iefix') format('embedded-opentype'),
|
|
||||||
url('../fonts/OpenSans-Semibold-webfont.woff') format('woff'),
|
|
||||||
url('../fonts/OpenSans-Semibold-webfont.ttf') format('truetype'),
|
|
||||||
url('../fonts/OpenSans-Semibold-webfont.svg#OpenSansSemibold') format('svg');
|
|
||||||
font-weight: 500;
|
|
||||||
font-style: normal;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Semibold Italic */
|
|
||||||
@font-face {
|
|
||||||
font-family: 'Open Sans';
|
|
||||||
src: url('../fonts/OpenSans-SemiboldItalic-webfont.eot');
|
|
||||||
src: url('../fonts/OpenSans-SemiboldItalic-webfont.eot?#iefix') format('embedded-opentype'),
|
|
||||||
url('../fonts/OpenSans-SemiboldItalic-webfont.woff') format('woff'),
|
|
||||||
url('../fonts/OpenSans-SemiboldItalic-webfont.ttf') format('truetype'),
|
|
||||||
url('../fonts/OpenSans-SemiboldItalic-webfont.svg#OpenSansSemiboldItalic') format('svg');
|
|
||||||
font-weight: 500;
|
|
||||||
font-style: italic;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Bold */
|
|
||||||
@font-face {
|
|
||||||
font-family: 'Open Sans';
|
|
||||||
src: url('../fonts/OpenSans-Bold-webfont.eot');
|
|
||||||
src: url('../fonts/OpenSans-Bold-webfont.eot?#iefix') format('embedded-opentype'),
|
|
||||||
url('../fonts/OpenSans-Bold-webfont.woff') format('woff'),
|
|
||||||
url('../fonts/OpenSans-Bold-webfont.ttf') format('truetype'),
|
|
||||||
url('../fonts/OpenSans-Bold-webfont.svg#OpenSansBold') format('svg');
|
|
||||||
font-weight: bold;
|
|
||||||
font-weight: 700;
|
|
||||||
font-style: normal;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Bold Italic */
|
|
||||||
@font-face {
|
|
||||||
font-family: 'Open Sans';
|
|
||||||
src: url('../fonts/OpenSans-BoldItalic-webfont.eot');
|
|
||||||
src: url('../fonts/OpenSans-BoldItalic-webfont.eot?#iefix') format('embedded-opentype'),
|
|
||||||
url('../fonts/OpenSans-BoldItalic-webfont.woff') format('woff'),
|
|
||||||
url('../fonts/OpenSans-BoldItalic-webfont.ttf') format('truetype'),
|
|
||||||
url('../fonts/OpenSans-BoldItalic-webfont.svg#OpenSansBoldItalic') format('svg');
|
|
||||||
font-weight: bold;
|
|
||||||
font-weight: 700;
|
|
||||||
font-style: italic;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Extra Bold */
|
|
||||||
@font-face {
|
|
||||||
font-family: 'Open Sans';
|
|
||||||
src: url('../fonts/OpenSans-ExtraBold-webfont.eot');
|
|
||||||
src: url('../fonts/OpenSans-ExtraBold-webfont.eot?#iefix') format('embedded-opentype'),
|
|
||||||
url('../fonts/OpenSans-ExtraBold-webfont.woff') format('woff'),
|
|
||||||
url('../fonts/OpenSans-ExtraBold-webfont.ttf') format('truetype'),
|
|
||||||
url('../fonts/OpenSans-ExtraBold-webfont.svg#OpenSansExtrabold') format('svg');
|
|
||||||
font-weight: 900;
|
|
||||||
font-style: normal;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Extra Bold Italic */
|
|
||||||
@font-face {
|
|
||||||
font-family: 'Open Sans';
|
|
||||||
src: url('../fonts/OpenSans-ExtraBoldItalic-webfont.eot');
|
|
||||||
src: url('../fonts/OpenSans-ExtraBoldItalic-webfont.eot?#iefix') format('embedded-opentype'),
|
|
||||||
url('../fonts/OpenSans-ExtraBoldItalic-webfont.woff') format('woff'),
|
|
||||||
url('../fonts/OpenSans-ExtraBoldItalic-webfont.ttf') format('truetype'),
|
|
||||||
url('../fonts/OpenSans-ExtraBoldItalic-webfont.svg#OpenSansExtraboldItalic') format('svg');
|
|
||||||
font-weight: 900;
|
|
||||||
font-style: italic;
|
|
||||||
|
|
||||||
}
|
|
||||||
/* _____________________________________________________________________________
|
|
||||||
|
|
||||||
RESET
|
|
||||||
_____________________________________________________________________________ */
|
|
||||||
html, body, div, span, object, iframe,
|
|
||||||
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
|
|
||||||
abbr, address, cite, code,
|
|
||||||
del, dfn, em, img, ins, kbd, q, samp,
|
|
||||||
small, strong, sub, sup, var,
|
|
||||||
b, i,
|
|
||||||
dl, dt, dd, ol, ul, li,
|
|
||||||
fieldset, form, label, legend,
|
|
||||||
table, caption, tbody, tfoot, thead, tr, th, td,
|
|
||||||
article, aside, canvas, details, figcaption, figure,
|
|
||||||
footer, header, hgroup, menu, nav, section, summary,
|
|
||||||
time, mark, audio, video {
|
|
||||||
margin:0;
|
|
||||||
padding:0;
|
|
||||||
border:0;
|
|
||||||
outline:0;
|
|
||||||
font-size:100%;
|
|
||||||
vertical-align:baseline;
|
|
||||||
background:transparent;
|
|
||||||
}
|
|
||||||
body {
|
|
||||||
font-family: 'Open Sans';
|
|
||||||
line-height:1;
|
|
||||||
color:#141414;
|
|
||||||
line-height:1;
|
|
||||||
background: url("../images/content-bg-1.png")repeat scroll 0 0 #f0f2f4;
|
|
||||||
margin: 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
article,aside,details,figcaption,figure,
|
|
||||||
footer,header,hgroup,menu,nav,section {
|
|
||||||
display:block;
|
|
||||||
}
|
|
||||||
nav ul {
|
|
||||||
list-style:none;
|
|
||||||
}
|
|
||||||
blockquote, q {
|
|
||||||
quotes:none;
|
|
||||||
}
|
|
||||||
blockquote:before, blockquote:after,
|
|
||||||
q:before, q:after {
|
|
||||||
content:'';
|
|
||||||
content:none;
|
|
||||||
}
|
|
||||||
a {
|
|
||||||
margin:0;
|
|
||||||
padding:0;
|
|
||||||
font-size:100%;
|
|
||||||
vertical-align:baseline;
|
|
||||||
background:transparent;
|
|
||||||
}
|
|
||||||
/* change colours to suit your needs */
|
|
||||||
ins {
|
|
||||||
background-color:#ff9;
|
|
||||||
color:#000;
|
|
||||||
text-decoration:none;
|
|
||||||
}
|
|
||||||
/* change colours to suit your needs */
|
|
||||||
mark {
|
|
||||||
background-color:#ff9;
|
|
||||||
color:#000;
|
|
||||||
font-style:italic;
|
|
||||||
font-weight:bold;
|
|
||||||
}
|
|
||||||
del {
|
|
||||||
text-decoration: line-through;
|
|
||||||
}
|
|
||||||
abbr[title], dfn[title] {
|
|
||||||
border-bottom:1px dotted;
|
|
||||||
cursor:help;
|
|
||||||
}
|
|
||||||
table {
|
|
||||||
border-collapse:collapse;
|
|
||||||
border-spacing:0;
|
|
||||||
}
|
|
||||||
/* change border colour to suit your needs */
|
|
||||||
hr {
|
|
||||||
display:block;
|
|
||||||
height:1px;
|
|
||||||
border:0;
|
|
||||||
border-top:1px solid #7f7f7f;
|
|
||||||
margin:1em 0;
|
|
||||||
padding:0;
|
|
||||||
opacity: 0.2;
|
|
||||||
}
|
|
||||||
input, select {
|
|
||||||
vertical-align:middle;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* _____________________________________________________________________________
|
|
||||||
|
|
||||||
TYPOGRAPHY
|
|
||||||
_____________________________________________________________________________ */
|
|
||||||
|
|
||||||
|
|
||||||
p{font-size:17px; line-height:24px; color:#c7c7c7;}
|
|
||||||
h1{ font-size:39px;font-weight:100; line-height:Auto; font-style: normal;}
|
|
||||||
h2{font-size:24px; line-height:Auto; font-weight: 400; }
|
|
||||||
h3{font-size:15px; line-height:Auto; font-weight: 400; }
|
|
||||||
h4{font-size:20px; line-height:Auto; font-weight: 400; }
|
|
||||||
h5{ font-size:30px;font-weight:100; line-height:Auto; font-style: normal; color: #929292;}
|
|
||||||
.font-small{font-size:12px;}
|
|
||||||
.font-large{font-size:25px;}
|
|
||||||
.font-medium{font-size:16px;}
|
|
||||||
.medium-weight{font-weight: 100;}
|
|
||||||
|
|
||||||
.uppercase{text-transform:uppercase;}
|
|
||||||
.capitalize{text-transform:capitalize;}
|
|
||||||
.lowercase{text-transform:lowercase;}
|
|
||||||
|
|
||||||
|
|
||||||
.light-blue{color:#3a9ecf;}
|
|
||||||
.black{color:#000;}
|
|
||||||
.grey{color:#333;}
|
|
||||||
.light-grey{color:#7c7c7c;}
|
|
||||||
.white{color:#FFF;}
|
|
||||||
.blue{color: #00979c;} .blue:hover{color: #03c5cb;}
|
|
||||||
|
|
||||||
.bold{font-weight:bold;}
|
|
||||||
.no-underline{text-decoration:none;}
|
|
||||||
.italic{font-style: italic;}
|
|
||||||
|
|
||||||
.center{text-align:center;}
|
|
||||||
.right{text-align:right;}
|
|
||||||
.left{text-align:left;}
|
|
||||||
.justify{text-align:justify;}
|
|
||||||
|
|
||||||
.middle{vertical-align: middle;}
|
|
||||||
|
|
||||||
.top{vertical-align: top;}
|
|
||||||
.middle{vertical-align: middle;}
|
|
||||||
.bottom{vertical-align: bottom;}
|
|
||||||
.rounded{-webkit-border-radius: 0px;
|
|
||||||
-moz-border-radius: 0px;
|
|
||||||
border-radius: 0px;}
|
|
||||||
.opacity{opacity: 0.8;}
|
|
||||||
|
|
||||||
|
|
||||||
.circle {
|
|
||||||
background: none repeat scroll 0 0 #191919;
|
|
||||||
border-radius: 50px;
|
|
||||||
height: 50px;
|
|
||||||
padding: 10px;
|
|
||||||
width: 50px;
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* _____________________________________________________________________________
|
|
||||||
|
|
||||||
BACKGROUND
|
|
||||||
_____________________________________________________________________________ */
|
|
||||||
.grey-bg{ background-color:#f6f4f4;}
|
|
||||||
.light-grey-bg{ background-color:#f5f5f5 ; }
|
|
||||||
.white-bg{background-color:#fff;}
|
|
||||||
.off-white{background-color:#3a9ecf;}
|
|
||||||
.dark-grey{background-color: #2a2a2a;}
|
|
||||||
.blue-bg{background-color: #00979c;}
|
|
||||||
|
|
||||||
/* _____________________________________________________________________________
|
|
||||||
|
|
||||||
Main
|
|
||||||
_____________________________________________________________________________ */
|
|
||||||
|
|
||||||
body { margin: 0; }
|
|
||||||
header{background-color: #2a2a2a;}
|
|
||||||
|
|
||||||
|
|
||||||
.product-wrapper{ float: left; width:100%; margin-top: -2px; min-height: 310px; -webkit-box-shadow: 5px 5px 5px 0px rgba(0,0,0,0.14);
|
|
||||||
-moz-box-shadow: 5px 5px 5px 0px rgba(0,0,0,0.14);
|
|
||||||
box-shadow: 5px 5px 5px 0px rgba(0,0,0,0.14);}
|
|
||||||
.icon-wrapper{min-height: 110px; padding-top: 12px; text-align: center; }
|
|
||||||
.text-wrapper{margin:15px; font-size:14px; border-top: 1px solid #404040; padding-top: 20px; color:#c6c5c5; line-height: 18px; text-align: center }
|
|
||||||
.sign-panel {background-color: #191919; width: 100%; height: auto; min-height: 150px; display: none; padding:15px; color: #a5a5a5; cursor:pointer;}
|
|
||||||
#flip-login{ font-weight: 500; font-size: 14px; padding: 20px; cursor:pointer; margin-top:-2px; }
|
|
||||||
.chart1,.chart2,.chart3 {width: 100%; height: 350px;}
|
|
||||||
/* ____________________________________________________________________________
|
|
||||||
|
|
||||||
COLUMNS
|
|
||||||
_____________________________________________________________________________ */
|
|
||||||
|
|
||||||
.col-row{width:100%; height: 100px;}
|
|
||||||
.col-x-large{width:100%; }
|
|
||||||
.col-large{width:75%; }
|
|
||||||
.col-medium{width:50%; }
|
|
||||||
.col-small{width:24%; }
|
|
||||||
.col-x-small{width:223px; }
|
|
||||||
|
|
||||||
.opacity{opacity: 0.2;}
|
|
||||||
/* ____________________________________________________________________________
|
|
||||||
|
|
||||||
padding-margin
|
|
||||||
_____________________________________________________________________________ */
|
|
||||||
.padding-left {padding-left:10px;}
|
|
||||||
.padding-right {padding-right:10px;}
|
|
||||||
.padding-top {padding-top:10px;}
|
|
||||||
.padding-bottom {padding-bottom:10px;}
|
|
||||||
.padding{padding:10px;}
|
|
||||||
.padding-none{ padding:0px;}
|
|
||||||
.padding-left-none{ padding-left:0px;}
|
|
||||||
|
|
||||||
|
|
||||||
.padding-left-double {padding-left:20px;}
|
|
||||||
.padding-right-double {padding-right:20px;}
|
|
||||||
.padding-top-double {padding-top:20px;}
|
|
||||||
.padding-bottom-double {padding-bottom:20px;}
|
|
||||||
.padding-double{padding:20px;}
|
|
||||||
.padding-top-large{padding-top:60px;}
|
|
||||||
.padding-bottom-large{padding-bottom:60px;}
|
|
||||||
|
|
||||||
.margin-left {margin-left:10px;}
|
|
||||||
.margin-right {margin-right:10px;}
|
|
||||||
.margin-top {margin-top:10px;}
|
|
||||||
.margin-bottom {margin-bottom:10px;}
|
|
||||||
.margin{margin:10px;}
|
|
||||||
.margin-top-minus{margin-top:-123px;}
|
|
||||||
|
|
||||||
.margin-left-double {margin-left:20px;}
|
|
||||||
.margin-right-double {margin-right:20px;}
|
|
||||||
.margin-top-double {margin-top:20px;}
|
|
||||||
.margin-bottom-double {margin-bottom:20px;}
|
|
||||||
.margin-double{margin:20px;}
|
|
||||||
.margin-left-none{margin-left: 0px;}
|
|
||||||
.margin-right-none{margin-right: 0px;}
|
|
||||||
|
|
||||||
.float-left{float:left;}
|
|
||||||
.float-right{float:right;}
|
|
||||||
.clear{ clear:both;}
|
|
||||||
|
|
||||||
.inline-block{display: inline-block;}
|
|
||||||
.relative{ position:relative;}
|
|
||||||
.border{border: 2px solid #dddddd;}
|
|
||||||
.border-bottom{border-bottom: 1px solid #efefef;}
|
|
||||||
.border-radius{border-radius: 5px;}
|
|
||||||
.border-top{border-top: 1px solid #ddd;}
|
|
||||||
|
|
||||||
/* ____________________________________________________________________________
|
|
||||||
|
|
||||||
button
|
|
||||||
_____________________________________________________________________________ */
|
|
||||||
.blue-btn {
|
|
||||||
-webkit-border-radius: 0;
|
|
||||||
-moz-border-radius: 0;
|
|
||||||
border-radius: 0px;
|
|
||||||
color: #ffffff;
|
|
||||||
font-size: 15px;
|
|
||||||
font-weight: 500;
|
|
||||||
background: #00979c;
|
|
||||||
padding: 10px 20px 10px 20px;
|
|
||||||
text-decoration: none;
|
|
||||||
border: 0px; cursor:pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.blue-btn:hover {
|
|
||||||
background: #00787a;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
.blue-action-btn {
|
|
||||||
-webkit-border-radius: 0px;
|
|
||||||
-moz-border-radius: 0px;
|
|
||||||
border-radius: 0px;
|
|
||||||
color: #ffffff;
|
|
||||||
font-size: 15px;
|
|
||||||
font-weight: 500;
|
|
||||||
background: #00979c;
|
|
||||||
padding: 10px 30px;
|
|
||||||
height: 45px;
|
|
||||||
text-decoration: none;
|
|
||||||
border: 0px; cursor:pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.blue-action-btn:hover {
|
|
||||||
background: #00787a;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
.black-btn {
|
|
||||||
-webkit-border-radius: 0px;
|
|
||||||
-moz-border-radius: 0px;
|
|
||||||
border-radius: 0px;
|
|
||||||
color: #ccc;
|
|
||||||
font-size: 15px;
|
|
||||||
font-weight: 500;
|
|
||||||
background: #333333;
|
|
||||||
padding: 10px 30px;
|
|
||||||
height: 45px;
|
|
||||||
text-decoration: none;
|
|
||||||
border: 0px; cursor:pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.black-btn:hover {
|
|
||||||
background: #2a2a2a;
|
|
||||||
text-decoration: none; ;
|
|
||||||
}
|
|
||||||
.grey-btn {
|
|
||||||
background: none repeat scroll 0 0 #00979c;
|
|
||||||
border: 0 none;
|
|
||||||
border-top-left-radius: 0;
|
|
||||||
border-top-right-radius: 0;
|
|
||||||
color: #ffffff;
|
|
||||||
cursor: pointer;
|
|
||||||
font-size: 18px;
|
|
||||||
font-weight: 300;
|
|
||||||
padding: 10px 35px;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
.grey-btn:hover {
|
|
||||||
background: none repeat scroll 0 0 #006a6d;
|
|
||||||
border: 0 none;
|
|
||||||
border-top-left-radius: 0;
|
|
||||||
border-top-right-radius: 0;
|
|
||||||
color: #ffffff;
|
|
||||||
cursor: pointer;
|
|
||||||
font-size: 18px;
|
|
||||||
font-weight: 300;
|
|
||||||
padding: 10px 35px;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
.grey-btn a{color: #fff; text-decoration: none;}
|
|
||||||
.btn-black{color: #ffffff; margin-right: 5px; padding: 10px; text-decoration: none; overflow: hidden; background:#5c5c5c; text-align: center; float: left; cursor: pointer; }
|
|
||||||
.btn-black:hover{opacity: 0.8; }
|
|
||||||
|
|
||||||
.menu-button-wrapper-temp{float: left; font-size: 13px; width: 125px;}
|
|
||||||
.menu-button-wrapper{float: left; font-size: 13px; width: 100px;}
|
|
||||||
.tick { opacity: 0 !important; }
|
|
||||||
.nv-discreteBarWithAxes>g>.nv-x>g>g>g{opacity: 1 !important;}
|
|
||||||
#date-range1{
|
|
||||||
background: #fff none repeat scroll 0 0;
|
|
||||||
border: 1px solid #ccc;
|
|
||||||
width: 300px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#device_id{
|
|
||||||
background: #fff none repeat scroll 0 0;
|
|
||||||
border: 1px solid #ccc;
|
|
||||||
width: 220px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.hour-range,.minute-range{background: #fff none repeat scroll 0 0; border: 1px solid #ccc;}
|
|
||||||
|
|
||||||
.btn-black-action{color: #ffffff; padding: 5px 20px; text-decoration: none; overflow: hidden; background:#5c5c5c; text-align: center; margin: 0 10px; float: left; cursor: pointer; border: none; outline:none;}
|
|
||||||
.btn-black-action:hover{background-color: #0076a3; }
|
|
||||||
.date-picker-wrapper {box-shadow:none;}
|
|
Before Width: | Height: | Size: 56 KiB |
Before Width: | Height: | Size: 59 KiB |
Before Width: | Height: | Size: 57 KiB |
Before Width: | Height: | Size: 60 KiB |
Before Width: | Height: | Size: 61 KiB |
Before Width: | Height: | Size: 55 KiB |
Before Width: | Height: | Size: 61 KiB |
Before Width: | Height: | Size: 57 KiB |
Before Width: | Height: | Size: 56 KiB |