revert-70aa11f8
prabathabey 8 years ago
commit df49788219

@ -36,11 +36,14 @@ import org.wso2.carbon.apimgt.webapp.publisher.config.PermissionManagementExcept
import javax.servlet.ServletContext; import javax.servlet.ServletContext;
import javax.ws.rs.*; import javax.ws.rs.*;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.lang.annotation.Annotation; import java.lang.annotation.Annotation;
import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.lang.reflect.Proxy; import java.lang.reflect.Proxy;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL; import java.net.URL;
import java.security.AccessController; import java.security.AccessController;
import java.security.PrivilegedAction; import java.security.PrivilegedAction;
@ -85,16 +88,13 @@ public class AnnotationProcessor {
* @throws IOException * @throws IOException
*/ */
public Set<String> scanStandardContext(String className) throws IOException { public Set<String> scanStandardContext(String className) throws IOException {
AnnotationDB db = new AnnotationDB(); ExtendedAnnotationDB db = new ExtendedAnnotationDB();
db.addIgnoredPackages(PACKAGE_ORG_APACHE); db.addIgnoredPackages(PACKAGE_ORG_APACHE);
db.addIgnoredPackages(PACKAGE_ORG_CODEHAUS); db.addIgnoredPackages(PACKAGE_ORG_CODEHAUS);
db.addIgnoredPackages(PACKAGE_ORG_SPRINGFRAMEWORK); db.addIgnoredPackages(PACKAGE_ORG_SPRINGFRAMEWORK);
URL[] libPath = WarUrlFinder.findWebInfLibClasspaths(servletContext); URL classPath = findWebInfClassesPath(servletContext);
URL classPath = WarUrlFinder.findWebInfClassesPath(servletContext); db.scanArchives(classPath);
URL[] urls = (URL[]) ArrayUtils.add(libPath, libPath.length, classPath);
db.scanArchives(urls);
//Returns a list of classes with given Annotation //Returns a list of classes with given Annotation
return db.getAnnotationIndex().get(className); return db.getAnnotationIndex().get(className);
@ -387,4 +387,28 @@ public class AnnotationProcessor {
} }
} }
/**
* Find the URL pointing to "/WEB-INF/classes" This method may not work in conjunction with IteratorFactory
* if your servlet container does not extract the /WEB-INF/classes into a real file-based directory
*
* @param servletContext
* @return null if cannot determin /WEB-INF/classes
*/
public static URL findWebInfClassesPath(ServletContext servletContext)
{
String path = servletContext.getRealPath("/WEB-INF/classes");
if (path == null) return null;
File fp = new File(path);
if (fp.exists() == false) return null;
try
{
URI uri = fp.toURI();
return uri.toURL();
}
catch (MalformedURLException e)
{
throw new RuntimeException(e);
}
}
} }

@ -0,0 +1,92 @@
/*
* Copyright (c) 2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.wso2.carbon.apimgt.webapp.publisher.lifecycle.util;
import org.scannotation.AnnotationDB;
import org.scannotation.archiveiterator.Filter;
import org.scannotation.archiveiterator.StreamIterator;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
public class ExtendedAnnotationDB extends AnnotationDB {
public ExtendedAnnotationDB() {
super();
}
public void scanArchives(URL... urls) throws IOException {
URL[] arr$ = urls;
int len$ = urls.length;
for(int i$ = 0; i$ < len$; ++i$) {
URL url = arr$[i$];
Filter filter = new Filter() {
public boolean accepts(String filename) {
if(filename.endsWith(".class")) {
if(filename.startsWith("/") || filename.startsWith("\\")) {
filename = filename.substring(1);
}
if(!ExtendedAnnotationDB.this.ignoreScan(filename.replace('/', '.'))) {
return true;
}
}
return false;
}
};
StreamIterator it = ExtendedIteratorFactory.create(url, filter);
InputStream stream;
while((stream = it.next()) != null) {
this.scanClass(stream);
}
}
}
private boolean ignoreScan(String intf) {
String[] arr$;
int len$;
int i$;
String ignored;
if(this.scanPackages != null) {
arr$ = this.scanPackages;
len$ = arr$.length;
for(i$ = 0; i$ < len$; ++i$) {
ignored = arr$[i$];
if(intf.startsWith(ignored + ".")) {
return false;
}
}
return true;
} else {
arr$ = this.ignoredPackages;
len$ = arr$.length;
for(i$ = 0; i$ < len$; ++i$) {
ignored = arr$[i$];
if(intf.startsWith(ignored + ".")) {
return true;
}
}
return false;
}
}
}

@ -0,0 +1,34 @@
/*
* Copyright (c) 2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.wso2.carbon.apimgt.webapp.publisher.lifecycle.util;
import org.scannotation.archiveiterator.*;
import java.io.File;
import java.io.IOException;
import java.net.URL;
public class ExtendedFileProtocolIteratorFactory implements DirectoryIteratorFactory {
private static final String ENCODING_SCHEME = "UTF-8";
@Override
public StreamIterator create(URL url, Filter filter) throws IOException {
File f = new File(java.net.URLDecoder.decode(url.getPath(), ENCODING_SCHEME));
return f.isDirectory()?new FileIterator(f, filter):new JarIterator(url.openStream(), filter);
}
}

@ -0,0 +1,54 @@
/*
* Copyright (c) 2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.wso2.carbon.apimgt.webapp.publisher.lifecycle.util;
import org.scannotation.archiveiterator.DirectoryIteratorFactory;
import org.scannotation.archiveiterator.Filter;
import org.scannotation.archiveiterator.JarIterator;
import org.scannotation.archiveiterator.StreamIterator;
import java.io.IOException;
import java.net.URL;
import java.util.concurrent.ConcurrentHashMap;
public class ExtendedIteratorFactory {
private static final ConcurrentHashMap<String, DirectoryIteratorFactory> registry = new ConcurrentHashMap();
public static StreamIterator create(URL url, Filter filter) throws IOException {
String urlString = url.toString();
if(urlString.endsWith("!/")) {
urlString = urlString.substring(4);
urlString = urlString.substring(0, urlString.length() - 2);
url = new URL(urlString);
}
if(!urlString.endsWith("/")) {
return new JarIterator(url.openStream(), filter);
} else {
DirectoryIteratorFactory factory = registry.get(url.getProtocol());
if(factory == null) {
throw new IOException("Unable to scan directory of protocol: " + url.getProtocol());
} else {
return factory.create(url, filter);
}
}
}
static {
registry.put("file", new ExtendedFileProtocolIteratorFactory());
}
}

@ -99,7 +99,7 @@ public class CommandOperationDAOImpl extends GenericOperationDAOImpl {
if (rs.next()) { if (rs.next()) {
commandOperation = new CommandOperation(); commandOperation = new CommandOperation();
commandOperation.setEnabled(rs.getInt("ENABLED") != 0); commandOperation.setEnabled(rs.getBoolean("ENABLED"));
} }
} catch (SQLException e) { } catch (SQLException e) {
throw new OperationManagementDAOException("SQL Error occurred while retrieving the command operation " + throw new OperationManagementDAOException("SQL Error occurred while retrieving the command operation " +

@ -22,27 +22,24 @@ var log = new Log("api/data-tables-invoker-api.jag");
var uri = request.getRequestURI(); var uri = request.getRequestURI();
var uriMatcher = new URIMatcher(String(uri)); var uriMatcher = new URIMatcher(String(uri));
var devicemgtProps = require('/app/conf/devicemgt-props.js').config(); var devicemgtProps = require("/app/conf/reader/main.js")["conf"];
var serviceInvokers = require("/app/modules/backend-service-invoker.js")["backendServiceInvoker"]; var serviceInvokers = require("/app/modules/backend-service-invoker.js")["backendServiceInvoker"];
if (uriMatcher.match("/{context}/api/data-tables/invoker")) { function appendQueryParam (url, queryParam , value) {
var url = request.getParameter("url");
var targetURL;
var payload = request.getContent();
function appendQueryParam (url, queryParam , value) {
if (url.indexOf("?") > 0) { if (url.indexOf("?") > 0) {
return url + "&" + queryParam + "=" + value; return url + "&" + queryParam + "=" + value;
} }
return url + "?" + queryParam + "=" + value; return url + "?" + queryParam + "=" + value;
} }
targetURL = devicemgtProps["httpsURL"] + request.getParameter("url");
if (uriMatcher.match("/{context}/api/data-tables/invoker")) {
var url = request.getParameter("url");
var targetURL = devicemgtProps["httpsURL"] + request.getParameter("url");
var allParams = request.getAllParameters(); var allParams = request.getAllParameters();
for (var key in allParams) { for (var key in allParams) {
if (allParams.hasOwnProperty(key)) { if (allParams.hasOwnProperty(key)) {
if(key == "limit" || key == "offset" || key == "filter"){ if (key == "limit" || key == "offset" || key == "filter") {
targetURL = appendQueryParam(targetURL, key, allParams[key]); targetURL = appendQueryParam(targetURL, key, allParams[key]);
} }
} }

@ -24,7 +24,7 @@ var log = new Log("api/device-api.jag");
var constants = require("/app/modules/constants.js"); var constants = require("/app/modules/constants.js");
var deviceModule = require("/app/modules/device.js").deviceModule; var deviceModule = require("/app/modules/device.js").deviceModule;
var utility = require("/app/modules/utility.js").utility; var utility = require("/app/modules/utility.js").utility;
var devicemgtProps = require('/app/conf/devicemgt-props.js').config(); var devicemgtProps = require("/app/conf/reader/main.js")["conf"];
var userModule = require("/app/modules/user.js").userModule; var userModule = require("/app/modules/user.js").userModule;
var serviceInvokers = require("/app/modules/backend-service-invoker.js").backendServiceInvoker; var serviceInvokers = require("/app/modules/backend-service-invoker.js").backendServiceInvoker;

@ -23,7 +23,7 @@ var uriMatcher = new URIMatcher(String(uri));
var log = new Log("api/device-api.jag"); var log = new Log("api/device-api.jag");
var constants = require("/app/modules/constants.js"); var constants = require("/app/modules/constants.js");
var utility = require("/app/modules/utility.js").utility; var utility = require("/app/modules/utility.js").utility;
var devicemgtProps = require('/app/conf/devicemgt-props.js').config(); var devicemgtProps = require("/app/conf/reader/main.js")["conf"];
var serviceInvokers = require("/app/modules/backend-service-invoker.js").backendServiceInvoker; var serviceInvokers = require("/app/modules/backend-service-invoker.js").backendServiceInvoker;
var user = session.get(constants.USER_SESSION_KEY); var user = session.get(constants.USER_SESSION_KEY);

@ -23,7 +23,7 @@ var uri = request.getRequestURI();
var uriMatcher = new URIMatcher(String(uri)); var uriMatcher = new URIMatcher(String(uri));
var constants = require("/app/modules/constants.js"); var constants = require("/app/modules/constants.js");
var devicemgtProps = require('/app/conf/devicemgt-props.js').config(); var devicemgtProps = require("/app/conf/reader/main.js")["conf"];
var serviceInvokers = require("/app/modules/backend-service-invoker.js")["backendServiceInvoker"]; var serviceInvokers = require("/app/modules/backend-service-invoker.js")["backendServiceInvoker"];
if (uriMatcher.match("/{context}/api/invoker/execute/")) { if (uriMatcher.match("/{context}/api/invoker/execute/")) {

@ -23,7 +23,7 @@ var uriMatcher = new URIMatcher(String(uri));
var log = new Log("api/operation-api.jag"); var log = new Log("api/operation-api.jag");
var serviceInvokers = require("/app/modules/backend-service-invoker.js")["backendServiceInvoker"]; var serviceInvokers = require("/app/modules/backend-service-invoker.js")["backendServiceInvoker"];
var devicemgtProps = require('/app/conf/devicemgt-props.js').config(); var devicemgtProps = require("/app/conf/reader/main.js")["conf"];
if (uriMatcher.match("/{context}/api/operation/paginate")) { if (uriMatcher.match("/{context}/api/operation/paginate")) {
var deviceType = request.getParameter("deviceType"); var deviceType = request.getParameter("deviceType");

@ -23,7 +23,7 @@ var uriMatcher = new URIMatcher(String(uri));
var log = new Log("api/user-api.jag"); var log = new Log("api/user-api.jag");
var constants = require("/app/modules/constants.js"); var constants = require("/app/modules/constants.js");
var devicemgtProps = require('/app/conf/devicemgt-props.js').config(); var devicemgtProps = require("/app/conf/reader/main.js")["conf"];
var userModule = require("/app/modules/user.js").userModule; var userModule = require("/app/modules/user.js").userModule;
var deviceModule = require("/app/modules/device.js").deviceModule; var deviceModule = require("/app/modules/device.js").deviceModule;
var utility = require("/app/modules/utility.js").utility; var utility = require("/app/modules/utility.js").utility;

@ -1,40 +0,0 @@
/*
* Copyright (c) 2016, 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) {
var pinch = require('/app/modules/pinch.min.js').pinch;
var server = require('carbon').server;
var config = require('/app/conf/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"));
} else if ((typeof value === 'string') && value.indexOf('%date-year%') > -1) {
var year = new Date().getFullYear();
return value.replace("%date-year%", year);
}
return value;
});
application.put("PINCH_CONFIG", config);
conf = config;
}
return conf;
};

@ -0,0 +1,41 @@
/*
* Copyright (c) 2016, 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 conf = function () {
var conf = application.get("UI_CONF");
if (!conf) {
conf = require("/app/conf/config.json");
var pinch = require("/app/conf/reader/pinch.min.js")["pinch"];
var server = require("carbon")["server"];
pinch(conf, /^/,
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"));
} else if ((typeof value === "string") && value.indexOf("%date-year%") > -1) {
var year = new Date().getFullYear();
return value.replace("%date-year%", year);
}
return value;
}
);
application.put("UI_CONF", conf);
}
return conf;
}();

@ -1,19 +1,36 @@
{{!-- 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. --}}
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{#defineZone "title"}}WSO2 Template{{/defineZone}}</title>
{{defineZone "favicon"}} {{defineZone "favicon"}}
<title>
{{defineZone "title"}}
</title>
{{defineZone "topLibCss"}}
{{defineZone "topCss"}} {{defineZone "topCss"}}
{{defineZone "topJs"}} {{defineZone "topJs"}}
</head> </head>
<body> <body>
<!--modal-->
<!--modal--> <div class="wr-modalpopup">
<div class="wr-modalpopup">
<div class="modalpopup-container"> <div class="modalpopup-container">
<div class="modalpopup-close-btn" onclick="hidePopup();"> <div class="modalpopup-close-btn" onclick="hidePopup();">
<span class="fw-stack"> <span class="fw-stack">
@ -22,43 +39,38 @@
</span> </span>
GO BACK GO BACK
</div> </div>
<div class="modalpopup-content"><!-- dynamic content --></div> <div class="modalpopup-content">
<!-- dynamic content -->
</div>
</div> </div>
<div class="modalpopup-bg"></div> <div class="modalpopup-bg"></div>
</div> </div>
<!--modal--> <!--modal-->
<!-- header --> {{defineZone "header"}}
{{defineZone "header"}}
<!-- /header -->
<!-- navbars --> <div class="navbar-wrapper">
<div class="navbar-wrapper">
{{defineZone "navbars"}} {{defineZone "navbars"}}
</div> </div>
<!-- /navbars -->
<!-- sidepanes --> {{defineZone "sidePanes"}}
{{defineZone "sidePanes"}}
<!-- /sidepanes -->
<!-- page-content-wrapper --> <!-- page-content-wrapper -->
<div class="page-content-wrapper"> <div class="page-content-wrapper">
{{defineZone "contentTitle"}} {{defineZone "contentTitle"}}
<div class="container-fluid body-wrapper"> <div class="container-fluid body-wrapper">
{{defineZone "content"}} {{defineZone "content"}}
</div> </div>
</div> </div>
<!-- /page-content-wrapper --> <!-- /page-content-wrapper -->
<!-- footer --> <footer class="footer">
<footer class="footer">
<div class="container-fluid"> <div class="container-fluid">
{{defineZone "footer"}} {{defineZone "footer"}}
</div> </div>
</footer> </footer>
<!-- /footer -->
{{defineZone "bottomJs"}} {{defineZone "bottomLibJs"}}
</body> {{defineZone "bottomJs"}}
</body>
</html> </html>

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
* *
* WSO2 Inc. licenses this file to you under the Apache License, * WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except * Version 2.0 (the "License"); you may not use this file except
@ -10,46 +10,53 @@
* *
* Unless required by applicable law or agreed to in writing, * Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an * software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* KIND, either express or implied. See the License for the * either express or implied. See the License for the
* specific language governing permissions and limitations * specific language governing permissions and limitations
* under the License. * under the License.
*/ */
var apiWrapperUtil = function () { var apiWrapperUtil = function () {
var module = {}; // var log = new Log("/app/modules/api-wrapper-util.js");
var tokenUtil = require("/app/modules/util.js").util;
var tokenUtil = require("/app/modules/util.js")["util"];
var constants = require("/app/modules/constants.js"); var constants = require("/app/modules/constants.js");
var devicemgtProps = require('/app/conf/devicemgt-props.js').config(); var devicemgtProps = require("/app/conf/reader/main.js")["conf"];
var log = new Log("/app/modules/api-wrapper-util.js");
var publicMethods = {};
module.refreshToken = function () {
var tokenPair = session.get(constants.ACCESS_TOKEN_PAIR_IDENTIFIER); publicMethods.refreshToken = function () {
var clientData = session.get(constants.ENCODED_CLIENT_KEYS_IDENTIFIER); var accessTokenPair = session.get(constants["ACCESS_TOKEN_PAIR_IDENTIFIER"]);
tokenPair = tokenUtil.refreshToken(tokenPair, clientData); // accessTokenPair includes current access token as well as current refresh token
session.put(constants.ACCESS_TOKEN_PAIR_IDENTIFIER, tokenPair); var encodedClientCredentials = session.get(constants["ENCODED_CLIENT_KEYS_IDENTIFIER"]);
accessTokenPair = tokenUtil.refreshToken(accessTokenPair, encodedClientCredentials);
session.put(constants["ACCESS_TOKEN_PAIR_IDENTIFIER"], accessTokenPair);
}; };
module.setupAccessTokenPair = function (type, properties) {
var tokenPair; publicMethods.setupAccessTokenPair = function (type, properties) {
var clientData = tokenUtil.getDyanmicCredentials(properties); var dynamicClientCredentials = tokenUtil.getDyanmicCredentials(properties);
var jwtToken = tokenUtil.getTokenWithJWTGrantType(clientData); var jwtToken = tokenUtil.getTokenWithJWTGrantType(dynamicClientCredentials);
clientData = tokenUtil.getTenantBasedAppCredentials(properties.username, jwtToken); var tenantBasedClientCredentials = tokenUtil.getTenantBasedAppCredentials(properties["username"], jwtToken);
var encodedClientKeys = tokenUtil.encode(clientData.clientId + ":" + clientData.clientSecret); var encodedTenantBasedClientCredentials = tokenUtil.
session.put(constants.ENCODED_CLIENT_KEYS_IDENTIFIER, encodedClientKeys); encode(tenantBasedClientCredentials["clientId"] + ":" + tenantBasedClientCredentials["clientSecret"]);
if (type == constants.GRANT_TYPE_PASSWORD) {
var scopes = devicemgtProps.scopes; session.put(constants["ENCODED_CLIENT_KEYS_IDENTIFIER"], encodedTenantBasedClientCredentials);
var scope = "";
scopes.forEach(function(entry) { var accessTokenPair;
scope += entry + " "; // accessTokenPair will include current access token as well as current refresh token
}); if (type == constants["GRANT_TYPE_PASSWORD"]) {
tokenPair = var arrayOfScopes = devicemgtProps["scopes"];
tokenUtil.getTokenWithPasswordGrantType(properties.username, encodeURIComponent(properties.password), var stringOfScopes = "";
encodedClientKeys, scope); arrayOfScopes.forEach(function (entry) { stringOfScopes += entry + " "; });
} else if (type == constants.GRANT_TYPE_SAML) { accessTokenPair = tokenUtil.getTokenWithPasswordGrantType(properties["username"],
tokenPair = tokenUtil. encodeURIComponent(properties["password"]), encodedTenantBasedClientCredentials, stringOfScopes);
getTokenWithSAMLGrantType(properties.samlToken, encodedClientKeys, "PRODUCTION"); } else if (type == constants["GRANT_TYPE_SAML"]) {
accessTokenPair = tokenUtil.getTokenWithSAMLGrantType(properties["samlToken"],
encodedTenantBasedClientCredentials, "PRODUCTION");
} }
session.put(constants.ACCESS_TOKEN_PAIR_IDENTIFIER, tokenPair);
session.put(constants["ACCESS_TOKEN_PAIR_IDENTIFIER"], accessTokenPair);
}; };
return module;
return publicMethods;
}(); }();

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
* *
* WSO2 Inc. licenses this file to you under the Apache License, * WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except * Version 2.0 (the "License"); you may not use this file except
@ -10,34 +10,38 @@
* *
* Unless required by applicable law or agreed to in writing, * Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an * software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* KIND, either express or implied. See the License for the * either express or implied. See the License for the
* specific language governing permissions and limitations * specific language governing permissions and limitations
* under the License. * under the License.
*/ */
/** /**
* This backendServiceInvoker contains the wrappers for back end jaggary calls. * This backendServiceInvoker contains the wrappers for back end jaggery calls.
*/ */
var backendServiceInvoker = function () { var backendServiceInvoker = function () {
var log = new Log("/app/modules/backend-service-invoker.js"); var log = new Log("/app/modules/backend-service-invoker.js");
var publicXMLHTTPInvokers = {}; var publicXMLHTTPInvokers = {};
var publicHTTPClientInvokers = {};
var privateMethods = {}; var privateMethods = {};
var publicWSInvokers = {}; var publicWSInvokers = {};
var publicHTTPClientInvokers = {};
var IS_OAUTH_ENABLED = true;
var TOKEN_EXPIRED = "Access token expired"; var TOKEN_EXPIRED = "Access token expired";
var TOKEN_INVALID = "Invalid input. Access token validation failed"; var TOKEN_INVALID = "Invalid input. Access token validation failed";
var devicemgtProps = require("/app/conf/reader/main.js")["conf"];
var constants = require("/app/modules/constants.js"); var constants = require("/app/modules/constants.js");
var tokenUtil = require("/app/modules/api-wrapper-util.js").apiWrapperUtil; var userModule = require("/app/modules/user.js")["userModule"];
var devicemgtProps = require('/app/conf/devicemgt-props.js').config(); var tokenUtil = require("/app/modules/api-wrapper-util.js")["apiWrapperUtil"];
/** /**
* This methoad reads the token pair from the session and return the access token. * This method reads the token pair from the session and return the access token.
* If the token pair s not set in the session this will send a redirect to the login page. * If the token pair s not set in the session this will send a redirect to the login page.
*/ */
privateMethods.getAccessToken = function () { privateMethods.getAccessToken = function () {
var tokenPair = session.get(constants.ACCESS_TOKEN_PAIR_IDENTIFIER); var tokenPair = session.get(constants["ACCESS_TOKEN_PAIR_IDENTIFIER"]);
if (tokenPair) { if (tokenPair) {
return tokenPair.accessToken; return tokenPair.accessToken;
} else { } else {
@ -46,152 +50,119 @@ var backendServiceInvoker = function () {
}; };
/** /**
* This method add Oauth authentication header to outgoing XMLHTTP Requests if Oauth authentication is enabled. * ---------------------------------------------------------------------------
* @param method HTTP request type. * Start of XML-HTTP-REQUEST based Interceptor implementations
* @param url target url. * ---------------------------------------------------------------------------
* @param payload payload/data which need to be send. */
* @param successCallback a function to be called if the respond if successful.
* @param errorCallback a function to be called if en error is reserved. /**
* This method add Oauth authentication header to outgoing XML-HTTP Requests if Oauth authentication is enabled.
* @param httpMethod HTTP request type.
* @param requestPayload payload/data if exists which is needed to be send.
* @param endpoint Backend REST API url.
* @param responseCallback a function to be called with response retrieved.
* @param count a counter which hold the number of recursive execution * @param count a counter which hold the number of recursive execution
*/ */
privateMethods.execute = function (method, url, successCallback, errorCallback, payload, count, contentType, acceptType) { privateMethods.execute = function (httpMethod, requestPayload, endpoint, responseCallback, count) {
var xmlHttpRequest = new XMLHttpRequest(); var xmlHttpRequest = new XMLHttpRequest();
xmlHttpRequest.open(method, url);
if(!contentType){ xmlHttpRequest.open(httpMethod, endpoint);
contentType = constants.APPLICATION_JSON; xmlHttpRequest.setRequestHeader(constants["CONTENT_TYPE_IDENTIFIER"], constants["APPLICATION_JSON"]);
} xmlHttpRequest.setRequestHeader(constants["ACCEPT_IDENTIFIER"], constants["APPLICATION_JSON"]);
if(!acceptType){
acceptType = constants.APPLICATION_JSON; if (devicemgtProps["isOAuthEnabled"]) {
}
xmlHttpRequest.setRequestHeader(constants.CONTENT_TYPE_IDENTIFIER, contentType);
xmlHttpRequest.setRequestHeader(constants.ACCEPT_IDENTIFIER, acceptType);
xmlHttpRequest.setRequestHeader(constants.REFERER, String(privateMethods.getClientDomain()));
if (IS_OAUTH_ENABLED) {
var accessToken = privateMethods.getAccessToken(); var accessToken = privateMethods.getAccessToken();
if (!accessToken) { if (!accessToken) {
response.sendRedirect(devicemgtProps["httpsURL"] + "/devicemgt/login"); userModule.logout(function () {
response.sendRedirect(devicemgtProps["appContext"] + "login");
});
} else { } else {
xmlHttpRequest.setRequestHeader(constants.AUTHORIZATION_HEADER, constants.BEARER_PREFIX + accessToken); xmlHttpRequest.
setRequestHeader(constants["AUTHORIZATION_HEADER"], constants["BEARER_PREFIX"] + accessToken);
} }
} }
if (payload) {
xmlHttpRequest.send(payload); if (requestPayload) {
xmlHttpRequest.send(requestPayload);
} else { } else {
xmlHttpRequest.send(); xmlHttpRequest.send();
} }
if ((xmlHttpRequest.status >= 200 && xmlHttpRequest.status < 300) || xmlHttpRequest.status == 302) { log.debug("Service Invoker-URL: " + endpoint);
if (xmlHttpRequest.responseText != null) { log.debug("Service Invoker-Method: " + httpMethod);
return successCallback(parse(xmlHttpRequest.responseText));
} else { log.info("Request : " + httpMethod + " " + endpoint);
return successCallback({"status": xmlHttpRequest.status, "messageFromServer": "Operation Completed"}); log.info("Request payload if any : " + stringify(requestPayload));
} log.info("Response status : " + xmlHttpRequest.status);
} else if (xmlHttpRequest.status == 401 && (xmlHttpRequest.responseText == TOKEN_EXPIRED || log.info("Response payload if any : " + xmlHttpRequest.responseText);
//log.info("Response headers : " + xmlHttpRequest.getAllResponseHeaders());
if (xmlHttpRequest.status == 401 && (xmlHttpRequest.responseText == TOKEN_EXPIRED ||
xmlHttpRequest.responseText == TOKEN_INVALID ) && count < 5) { xmlHttpRequest.responseText == TOKEN_INVALID ) && count < 5) {
tokenUtil.refreshToken(); tokenUtil.refreshToken();
return privateMethods.execute(method, url, successCallback, errorCallback, payload, (count + 1)); return privateMethods.execute(httpMethod, requestPayload, endpoint, responseCallback, ++count);
} else if (xmlHttpRequest.status == 500) {
return errorCallback(xmlHttpRequest);
} else { } else {
return errorCallback(xmlHttpRequest); return responseCallback(xmlHttpRequest);
} }
}; };
/** /**
* This method add Oauth authentication header to outgoing XMLHTTP Requests if Oauth authentication is enabled. * This method add Oauth authentication header to outgoing XML-HTTP Requests if Oauth authentication is enabled.
* @param method HTTP request type. * @param httpMethod HTTP request type.
* @param url target url. * @param requestPayload payload/data if exists which is needed to be send.
* @param payload payload/data which need to be send. * @param endpoint Backend REST API url.
* @param successCallback a function to be called if the respond if successful. * @param responseCallback a function to be called with response retrieved.
* @param errorCallback a function to be called if en error is reserved.
*/ */
privateMethods.initiateXMLHTTPRequest = function (method, url, successCallback, errorCallback, payload, contentType, acceptType) { privateMethods.initiateXMLHTTPRequest = function (httpMethod, requestPayload, endpoint, responseCallback) {
if (privateMethods.getAccessToken()) { return privateMethods.execute(httpMethod, requestPayload, endpoint, responseCallback, 0);
return privateMethods.execute(method, url, successCallback, errorCallback, payload, 0, contentType, acceptType);
}
}; };
/** /**
* This method add Oauth authentication header to outgoing HTTPClient Requests if Oauth authentication is enabled. * This method invokes return initiateXMLHttpRequest for get calls
* @param method HTTP request type. * @param endpoint Backend REST API url.
* @param url target url. * @param responseCallback a function to be called with response retrieved.
* @param payload payload/data which need to be send.
* @param successCallback a function to be called if the respond if successful.
* @param errorCallback a function to be called if en error is reserved.
*/ */
privateMethods.initiateHTTPClientRequest = function (method, url, successCallback, errorCallback, payload, contentType, acceptType) { publicXMLHTTPInvokers.get = function (endpoint, responseCallback) {
var HttpClient = Packages.org.apache.commons.httpclient.HttpClient; var requestPayload = null;
var httpMethodObject; return privateMethods.initiateXMLHTTPRequest(constants["HTTP_GET"], requestPayload, endpoint, responseCallback);
switch (method) { };
case constants.HTTP_POST:
var PostMethod = Packages.org.apache.commons.httpclient.methods.PostMethod;
httpMethodObject = new PostMethod(url);
break;
case constants.HTTP_PUT:
var PutMethod = Packages.org.apache.commons.httpclient.methods.PutMethod;
httpMethodObject = new PutMethod(url);
break;
case constants.HTTP_GET:
var GetMethod = Packages.org.apache.commons.httpclient.methods.GetMethod;
httpMethodObject = new GetMethod(url);
break;
case constants.HTTP_DELETE:
var DeleteMethod = Packages.org.apache.commons.httpclient.methods.DeleteMethod;
httpMethodObject = new DeleteMethod(url);
break;
default:
throw new IllegalArgumentException("Invalid HTTP request type: " + method);
}
var Header = Packages.org.apache.commons.httpclient.Header;
var header = new Header();
header.setName(constants.CONTENT_TYPE_IDENTIFIER);
header.setValue(contentType);
httpMethodObject.addRequestHeader(header);
header = new Header();
header.setName(constants.ACCEPT_IDENTIFIER);
header.setValue(acceptType);
httpMethodObject.addRequestHeader(header);
header = new Header();
header.setName(constants.REFERER);
header.setValue(String(privateMethods.getClientDomain()));
httpMethodObject.addRequestHeader(header);
if (IS_OAUTH_ENABLED) {
var accessToken = privateMethods.getAccessToken();
if (accessToken) {
header = new Header();
header.setName(constants.AUTHORIZATION_HEADER);
header.setValue(constants.BEARER_PREFIX + accessToken);
httpMethodObject.addRequestHeader(header);
} else {
response.sendRedirect(devicemgtProps["httpsURL"] + "/devicemgt/login");
}
} /**
if (payload) { * This method invokes return initiateXMLHttpRequest for post calls
var stringRequestEntity = new StringRequestEntity(stringify(payload)); * @param endpoint Backend REST API url.
httpMethodObject.setRequestEntity(stringRequestEntity); * @param requestPayload payload/data if exists which is needed to be send.
} * @param responseCallback a function to be called with response retrieved.
var client = new HttpClient(); */
try { publicXMLHTTPInvokers.post = function (endpoint, requestPayload, responseCallback) {
client.executeMethod(httpMethodObject); return privateMethods.initiateXMLHTTPRequest(constants["HTTP_POST"], requestPayload, endpoint, responseCallback);
var status = httpMethodObject.getStatusCode(); };
if (status == 200) {
var responseContentDispositionHeader = httpMethodObject.getResponseHeader(constants.CONTENT_DISPOSITION_IDENTIFIER); /**
if (responseContentDispositionHeader) { * This method invokes return initiateXMLHttpRequest for put calls
return successCallback(httpMethodObject.getResponseBodyAsStream(), httpMethodObject.getResponseHeaders()); * @param endpoint Backend REST API url.
} else { * @param requestPayload payload/data if exists which is needed to be send.
return successCallback(httpMethodObject.getResponseBody()); * @param responseCallback a function to be called with response retrieved.
} */
} else { publicXMLHTTPInvokers.put = function (endpoint, requestPayload, responseCallback) {
return errorCallback(httpMethodObject.getResponseBody()); return privateMethods.initiateXMLHTTPRequest(constants["HTTP_PUT"], requestPayload, endpoint, responseCallback);
} };
} catch (e) {
return errorCallback(response); /**
} finally { * This method invokes return initiateXMLHttpRequest for delete calls
httpMethodObject.releaseConnection(); * @param endpoint Backend REST API url.
} * @param responseCallback a function to be called with response retrieved.
*/
publicXMLHTTPInvokers.delete = function (endpoint, responseCallback) {
var requestPayload = null;
return privateMethods.initiateXMLHTTPRequest(constants["HTTP_DELETE"], requestPayload, endpoint, responseCallback);
}; };
/**
* ---------------------------------------------------------------------------
* Start of WS-REQUEST based Interceptor implementations
* ---------------------------------------------------------------------------
*/
/** /**
* This method add Oauth authentication header to outgoing WS Requests if Oauth authentication is enabled. * This method add Oauth authentication header to outgoing WS Requests if Oauth authentication is enabled.
* @param action * @param action
@ -202,32 +173,26 @@ var backendServiceInvoker = function () {
* @param soapVersion soapVersion which need to used. * @param soapVersion soapVersion which need to used.
*/ */
privateMethods.initiateWSRequest = function (action, endpoint, successCallback, errorCallback, soapVersion, payload) { privateMethods.initiateWSRequest = function (action, endpoint, successCallback, errorCallback, soapVersion, payload) {
var ws = require('ws'); var ws = require("ws");
var wsRequest = new ws.WSRequest(); var wsRequest = new ws.WSRequest();
var options = []; var options = [];
if (IS_OAUTH_ENABLED) { if (devicemgtProps["isOAuthEnabled"]) {
var accessToken = privateMethods.getAccessToken(); var accessToken = privateMethods.getAccessToken();
if (accessToken) { if (accessToken) {
var authenticationHeaderName = String(constants.AUTHORIZATION_HEADER); var authenticationHeaderName = String(constants["AUTHORIZATION_HEADER"]);
var authenticationHeaderValue = String(constants.BEARER_PREFIX + accessToken); var authenticationHeaderValue = String(constants["BEARER_PREFIX"] + accessToken);
var headers = []; var headers = [];
var oAuthAuthenticationData = {}; var oAuthAuthenticationData = {};
oAuthAuthenticationData.name = authenticationHeaderName; oAuthAuthenticationData.name = authenticationHeaderName;
oAuthAuthenticationData.value = authenticationHeaderValue; oAuthAuthenticationData.value = authenticationHeaderValue;
headers.push(oAuthAuthenticationData); headers.push(oAuthAuthenticationData);
var referrerData = {};
referrerData.name = constants.REFERER;
referrerData.value = String(privateMethods.getClientDomain());
headers.push(referrerData);
options.HTTPHeaders = headers; options.HTTPHeaders = headers;
} else { } else {
response.sendRedirect(devicemgtProps["httpsURL"] + "/devicemgt/login"); response.sendRedirect(devicemgtProps["appContext"] + "login");
} }
} }
options.useSOAP = soapVersion; options.useSOAP = soapVersion;
options.useWSA = constants.WEB_SERVICE_ADDRESSING_VERSION; options.useWSA = constants["WEB_SERVICE_ADDRESSING_VERSION"];
options.action = action; options.action = action;
var wsResponse; var wsResponse;
try { try {
@ -245,68 +210,104 @@ var backendServiceInvoker = function () {
}; };
/** /**
* This method invokes return initiateXMLHttpRequest for get calls * This method invokes return initiateWSRequest for soap calls
* @param url target url. * @param action describes particular soap action.
* @param requestPayload SOAP request payload which is needed to be send.
* @param endpoint service end point to be triggered.
* @param successCallback a function to be called if the respond if successful. * @param successCallback a function to be called if the respond if successful.
* @param errorCallback a function to be called if en error is reserved. * @param errorCallback a function to be called if en error is reserved.
* @param soapVersion soapVersion which need to used.
*/ */
publicXMLHTTPInvokers.get = function (url, successCallback, errorCallback, contentType, acceptType) { publicWSInvokers.soapRequest = function (action, requestPayload, endpoint, successCallback, errorCallback, soapVersion) {
return privateMethods.initiateXMLHTTPRequest(constants.HTTP_GET, url, successCallback, errorCallback, contentType, acceptType); return privateMethods.initiateWSRequest(action, endpoint, successCallback, errorCallback, soapVersion, requestPayload);
}; };
/** /**
* This method invokes return initiateXMLHttpRequest for post calls * ---------------------------------------------------------------------------
* @param url target url. * Start of HTTP-CLIENT-REQUEST based Interceptor implementations
* @param payload payload/data which need to be send. * ---------------------------------------------------------------------------
* @param successCallback a function to be called if the respond if successful.
* @param errorCallback a function to be called if en error is reserved.
*/ */
publicXMLHTTPInvokers.post = function (url, payload, successCallback, errorCallback, contentType, acceptType) {
return privateMethods.initiateXMLHTTPRequest(constants.HTTP_POST, url, successCallback, errorCallback, payload, contentType, acceptType);
};
/** /**
* This method invokes return initiateXMLHttpRequest for put calls * This method add Oauth authentication header to outgoing HTTPClient Requests if Oauth authentication is enabled.
* @param method HTTP request type.
* @param url target url. * @param url target url.
* @param payload payload/data which need to be send. * @param payload payload/data which need to be send.
* @param successCallback a function to be called if the respond if successful. * @param successCallback a function to be called if the respond if successful.
* @param errorCallback a function to be called if en error is reserved. * @param errorCallback a function to be called if en error is reserved.
*/ */
publicXMLHTTPInvokers.put = function (url, payload, successCallback, errorCallback, contentType, acceptType) { privateMethods.initiateHTTPClientRequest = function (method, url, successCallback, errorCallback, payload) {
return privateMethods.initiateXMLHTTPRequest(constants.HTTP_PUT, url, successCallback, errorCallback, payload, contentType, acceptType); var HttpClient = Packages.org.apache.commons.httpclient.HttpClient;
}; var httpMethodObject;
switch (method) {
/** case constants["HTTP_GET"]:
* This method invokes return initiateXMLHttpRequest for delete calls var GetMethod = Packages.org.apache.commons.httpclient.methods.GetMethod;
* @param url target url. httpMethodObject = new GetMethod(url);
* @param successCallback a function to be called if the respond if successful. break;
* @param errorCallback a function to be called if en error is reserved. case constants["HTTP_POST"]:
*/ var PostMethod = Packages.org.apache.commons.httpclient.methods.PostMethod;
publicXMLHTTPInvokers.delete = function (url, successCallback, errorCallback, contentType, acceptType) { httpMethodObject = new PostMethod(url);
return privateMethods.initiateXMLHTTPRequest(constants.HTTP_DELETE, url, successCallback, errorCallback, contentType, acceptType); break;
}; case constants["HTTP_PUT"]:
var PutMethod = Packages.org.apache.commons.httpclient.methods.PutMethod;
httpMethodObject = new PutMethod(url);
break;
case constants["HTTP_DELETE"]:
var DeleteMethod = Packages.org.apache.commons.httpclient.methods.DeleteMethod;
httpMethodObject = new DeleteMethod(url);
break;
default:
throw new IllegalArgumentException("Invalid HTTP request method: " + method);
}
var Header = Packages.org.apache.commons.httpclient.Header;
var header = new Header();
header.setName(constants["CONTENT_TYPE_IDENTIFIER"]);
header.setValue(constants["APPLICATION_JSON"]);
httpMethodObject.addRequestHeader(header);
header = new Header();
header.setName(constants["ACCEPT_IDENTIFIER"]);
header.setValue(constants["APPLICATION_JSON"]);
httpMethodObject.addRequestHeader(header);
/** if (devicemgtProps["isOAuthEnabled"]) {
* This method invokes return initiateWSRequest for soap calls var accessToken = privateMethods.getAccessToken();
* @param endpoint service end point to be triggered. if (accessToken) {
* @param payload soap payload which need to be send. header = new Header();
* @param successCallback a function to be called if the respond if successful. header.setName(constants["AUTHORIZATION_HEADER"]);
* @param errorCallback a function to be called if en error is reserved. header.setValue(constants["BEARER_PREFIX"] + accessToken);
* @param soapVersion soapVersion which need to used. httpMethodObject.addRequestHeader(header);
*/ } else {
publicWSInvokers.soapRequest = function (action, endpoint, payload, successCallback, errorCallback, soapVersion) { response.sendRedirect(devicemgtProps["appContext"] + "login");
return privateMethods.initiateWSRequest(action, endpoint, successCallback, errorCallback, soapVersion, payload); }
}
var stringRequestEntity = new StringRequestEntity(stringify(payload));
httpMethodObject.setRequestEntity(stringRequestEntity);
var client = new HttpClient();
try {
client.executeMethod(httpMethodObject);
var status = httpMethodObject.getStatusCode();
if (status == 200) {
return successCallback(httpMethodObject.getResponseBody());
} else {
return errorCallback(httpMethodObject.getResponseBody());
}
} catch (e) {
return errorCallback(response);
} finally {
method.releaseConnection();
}
}; };
/** /**
* This method invokes return initiateHTTPClientRequest for get calls * This method invokes return initiateHTTPClientRequest for get calls
* @param url target url. * @param url target url.
* @param successCallback a function to be called if the respond if successful. * @param successCallback a function to be called if the respond if successful.
* @param errorCallback a function to be called if en error is reserved. * @param errorCallback a function to be called if en error is reserved.
*/ */
publicHTTPClientInvokers.get = function (url, successCallback, errorCallback, contentType, acceptType) { publicHTTPClientInvokers.get = function (url, successCallback, errorCallback) {
return privateMethods.initiateHTTPClientRequest(constants.HTTP_GET, url, successCallback, errorCallback, null, contentType, acceptType); var requestPayload = null;
return privateMethods.
initiateHTTPClientRequest(constants["HTTP_GET"], url, successCallback, errorCallback, requestPayload);
}; };
/** /**
@ -316,9 +317,9 @@ var backendServiceInvoker = function () {
* @param successCallback a function to be called if the respond if successful. * @param successCallback a function to be called if the respond if successful.
* @param errorCallback a function to be called if en error is reserved. * @param errorCallback a function to be called if en error is reserved.
*/ */
publicHTTPClientInvokers.post = function (url, payload, successCallback, errorCallback, contentType, acceptType) { publicHTTPClientInvokers.post = function (url, payload, successCallback, errorCallback) {
return privateMethods. return privateMethods.
initiateHTTPClientRequest(constants.HTTP_POST, url, successCallback, errorCallback, payload, contentType, acceptType); initiateHTTPClientRequest(constants["HTTP_POST"], url, successCallback, errorCallback, payload);
}; };
/** /**
@ -328,8 +329,9 @@ var backendServiceInvoker = function () {
* @param successCallback a function to be called if the respond if successful. * @param successCallback a function to be called if the respond if successful.
* @param errorCallback a function to be called if en error is reserved. * @param errorCallback a function to be called if en error is reserved.
*/ */
publicHTTPClientInvokers.put = function (url, payload, successCallback, errorCallback, contentType, acceptType) { publicHTTPClientInvokers.put = function (url, payload, successCallback, errorCallback) {
return privateMethods.initiateHTTPClientRequest(constants.HTTP_PUT, url, successCallback, errorCallback, payload, contentType, acceptType); return privateMethods.
initiateHTTPClientRequest(constants["HTTP_PUT"], url, successCallback, errorCallback, payload);
}; };
/** /**
@ -338,23 +340,16 @@ var backendServiceInvoker = function () {
* @param successCallback a function to be called if the respond if successful. * @param successCallback a function to be called if the respond if successful.
* @param errorCallback a function to be called if en error is reserved. * @param errorCallback a function to be called if en error is reserved.
*/ */
publicHTTPClientInvokers.delete = function (url, successCallback, errorCallback, contentType, acceptType) { publicHTTPClientInvokers.delete = function (url, successCallback, errorCallback) {
return privateMethods.initiateHTTPClientRequest(constants.HTTP_DELETE, url, successCallback, errorCallback, contentType, acceptType); var requestPayload = null;
return privateMethods.
initiateHTTPClientRequest(constants["HTTP_DELETE"], url, successCallback, errorCallback, requestPayload);
}; };
/** var publicMethods = {};
* This method fetch the current logged user from the session and returns publicMethods.XMLHttp = publicXMLHTTPInvokers;
* the tenant domain name of the user publicMethods.WS = publicWSInvokers;
* @returns {tenantDomain} publicMethods.HttpClient = publicHTTPClientInvokers;
*/
privateMethods.getClientDomain = function () {
var user = session.get(constants.USER_SESSION_KEY);
return user.domain;
}
var publicInvokers = {}; return publicMethods;
publicInvokers.XMLHttp = publicXMLHTTPInvokers;
publicInvokers.WS = publicWSInvokers;
publicInvokers.HttpClient = publicHTTPClientInvokers;
return publicInvokers;
}(); }();

@ -22,7 +22,7 @@ deviceModule = function () {
var utility = require('/app/modules/utility.js').utility; var utility = require('/app/modules/utility.js').utility;
var constants = require('/app/modules/constants.js'); var constants = require('/app/modules/constants.js');
var devicemgtProps = require('/app/conf/devicemgt-props.js').config(); var devicemgtProps = require("/app/conf/reader/main.js")["conf"];
var serviceInvokers = require("/app/modules/backend-service-invoker.js").backendServiceInvoker; var serviceInvokers = require("/app/modules/backend-service-invoker.js").backendServiceInvoker;
var ArrayList = Packages.java.util.ArrayList; var ArrayList = Packages.java.util.ArrayList;

@ -22,7 +22,7 @@ var groupModule = {};
var userModule = require("/app/modules/user.js").userModule; var userModule = require("/app/modules/user.js").userModule;
var constants = require('/app/modules/constants.js'); var constants = require('/app/modules/constants.js');
var devicemgtProps = require('/app/conf/devicemgt-props.js').config(); var devicemgtProps = require("/app/conf/reader/main.js")["conf"];
var utility = require("/app/modules/utility.js").utility; var utility = require("/app/modules/utility.js").utility;
var serviceInvokers = require("/app/modules/backend-service-invoker.js").backendServiceInvoker; var serviceInvokers = require("/app/modules/backend-service-invoker.js").backendServiceInvoker;

@ -17,7 +17,7 @@
*/ */
var carbonModule = require("carbon"); var carbonModule = require("carbon");
var devicemgtProps = require("/app/conf/devicemgt-props.js").config(); var devicemgtProps = require("/app/conf/reader/main.js")["conf"];
var carbonServer = new carbonModule.server.Server({ var carbonServer = new carbonModule.server.Server({
tenanted: true, tenanted: true,
url: devicemgtProps["httpsURL"] + "/admin" url: devicemgtProps["httpsURL"] + "/admin"
@ -31,4 +31,4 @@ var permissions = {
'/permission/admin/device-mgt/user': ['ui.execute'], '/permission/admin/device-mgt/user': ['ui.execute'],
'/permission/admin/manage/api/subscribe': ['ui.execute'] '/permission/admin/manage/api/subscribe': ['ui.execute']
}; };
userModule.addRole("internal/devicemgt-user", ["admin"], permissions); //userModule.addRole("internal/devicemgt-user", ["admin"], permissions);

@ -16,79 +16,83 @@
* under the License. * under the License.
*/ */
/*
@Deprecated - new
*/
/** /**
* This invokerRequestWrapper contains the wrappers for invoker util requests. * This invokerRequestWrapper contains the wrappers for invoker util requests.
*/ */
var invokerRequestWrapper = function () { //var invokerRequestWrapper = function () {
//
var constants = require("/modules/constants.js"); // var constants = require("/modules/constants.js");
var serviceInvokers = require("/modules/backend-service-invoker.js").backendServiceInvoker; // var serviceInvokers = require("/modules/backend-service-invoker.js").backendServiceInvoker;
//
var publicWrappers = []; // var publicWrappers = [];
//
publicWrappers.initiate = function (method, url, payload) { // publicWrappers.initiate = function (method, url, payload) {
switch (method) { // switch (method) {
case constants.HTTP_GET: // case constants.HTTP_GET:
var response = serviceInvokers.XMLHttp.get(url, function (responsePayload) { // var response = serviceInvokers.XMLHttp.get(url, function (responsePayload) {
var response = {}; // var response = {};
response.content = responsePayload["responseContent"]; // response.content = responsePayload["responseContent"];
response.status = "success"; // response.status = "success";
return response; // return response;
}, // },
function (responsePayload) { // function (responsePayload) {
var response = {}; // var response = {};
response.content = responsePayload; // response.content = responsePayload;
response.status = "error"; // response.status = "error";
return response; // return response;
}); // });
return response; // return response;
break; // break;
case constants.HTTP_POST: // case constants.HTTP_POST:
var response = serviceInvokers.XMLHttp.post(url, payload, function (responsePayload) { // var response = serviceInvokers.XMLHttp.post(url, payload, function (responsePayload) {
var response = {}; // var response = {};
response.content = responsePayload["responseContent"]; // response.content = responsePayload["responseContent"];
response.status = "success"; // response.status = "success";
return response; // return response;
}, // },
function (responsePayload) { // function (responsePayload) {
var response = {}; // var response = {};
response.content = responsePayload; // response.content = responsePayload;
response.status = "error"; // response.status = "error";
return response; // return response;
}); // });
return response; // return response;
break; // break;
case constants.HTTP_PUT: // case constants.HTTP_PUT:
var response = serviceInvokers.XMLHttp.put(url, payload, function (responsePayload) { // var response = serviceInvokers.XMLHttp.put(url, payload, function (responsePayload) {
var response = {}; // var response = {};
response.content = responsePayload["responseContent"]; // response.content = responsePayload["responseContent"];
response.status = "success"; // response.status = "success";
return response; // return response;
}, // },
function (responsePayload) { // function (responsePayload) {
var response = {}; // var response = {};
response.content = responsePayload; // response.content = responsePayload;
response.status = "error"; // response.status = "error";
return response; // return response;
}); // });
return response; // return response;
break; // break;
case constants.HTTP_DELETE: // case constants.HTTP_DELETE:
var response = serviceInvokers.XMLHttp.delete(url, function (responsePayload) { // var response = serviceInvokers.XMLHttp.delete(url, function (responsePayload) {
var response = {}; // var response = {};
response.content = responsePayload["responseContent"]; // response.content = responsePayload["responseContent"];
response.status = "success"; // response.status = "success";
return response; // return response;
}, // },
function (responsePayload) { // function (responsePayload) {
var response = {}; // var response = {};
response.content = responsePayload; // response.content = responsePayload;
response.status = "error"; // response.status = "error";
return response; // return response;
}); // });
return response; // return response;
break; // break;
} // }
} // }
//
}(); //}();

@ -33,7 +33,7 @@ var onFail;
properties = {username: context.input.username, password: context.input.password}; properties = {username: context.input.username, password: context.input.password};
apiWrapperUtil.setupAccessTokenPair(constants.GRANT_TYPE_PASSWORD, properties); apiWrapperUtil.setupAccessTokenPair(constants.GRANT_TYPE_PASSWORD, properties);
} }
var devicemgtProps = require('/app/conf/devicemgt-props.js').config(); var devicemgtProps = require("/app/conf/reader/main.js")["conf"];
var carbonServer = require("carbon").server; var carbonServer = require("carbon").server;
(new carbonServer.Server({url: devicemgtProps["adminService"]})) (new carbonServer.Server({url: devicemgtProps["adminService"]}))
.login(context.input.username, context.input.password); .login(context.input.username, context.input.password);

@ -20,7 +20,7 @@ var operationModule = function () {
var log = new Log("/app/modules/operation.js"); var log = new Log("/app/modules/operation.js");
var utility = require('/app/modules/utility.js').utility; var utility = require('/app/modules/utility.js').utility;
var constants = require('/app/modules/constants.js'); var constants = require('/app/modules/constants.js');
var devicemgtProps = require('/app/conf/devicemgt-props.js').config(); var devicemgtProps = require("/app/conf/reader/main.js")["conf"];
var serviceInvokers = require("/app/modules/backend-service-invoker.js").backendServiceInvoker; var serviceInvokers = require("/app/modules/backend-service-invoker.js").backendServiceInvoker;
var publicMethods = {}; var publicMethods = {};

@ -25,7 +25,7 @@ policyModule = function () {
var constants = require('/app/modules/constants.js'); var constants = require('/app/modules/constants.js');
var utility = require("/app/modules/utility.js")["utility"]; var utility = require("/app/modules/utility.js")["utility"];
var devicemgtProps = require('/app/conf/devicemgt-props.js').config(); var devicemgtProps = require("/app/conf/reader/main.js")["conf"];
var serviceInvokers = require("/app/modules/backend-service-invoker.js").backendServiceInvoker; var serviceInvokers = require("/app/modules/backend-service-invoker.js").backendServiceInvoker;
var publicMethods = {}; var publicMethods = {};

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
* *
* WSO2 Inc. licenses this file to you under the Apache License, * WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except * Version 2.0 (the "License"); you may not use this file except
@ -10,47 +10,42 @@
* *
* Unless required by applicable law or agreed to in writing, * Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an * software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* KIND, either express or implied. See the License for the * either express or implied. See the License for the
* specific language governing permissions and limitations * specific language governing permissions and limitations
* under the License. * under the License.
*/ */
/* /*
* This module contains user and roles related functionality * This module contains user and roles related functionality.
*/ */
var userModule = function () { var userModule = function () {
var log = new Log("/app/modules/user.js"); var log = new Log("/app/modules/user.js");
var constants = require("/app/modules/constants.js"); var constants = require("/app/modules/constants.js");
var utility = require("/app/modules/utility.js")["utility"]; var utility = require("/app/modules/utility.js")["utility"];
var devicemgtProps = require('/app/conf/devicemgt-props.js').config(); var devicemgtProps = require("/app/conf/reader/main.js")["conf"];
var serviceInvokers = require("/app/modules/backend-service-invoker.js").backendServiceInvoker; var serviceInvokers = require("/app/modules/backend-service-invoker.js")["backendServiceInvoker"];
/* Initializing user manager */ /* Initializing user manager */
var carbon = require('carbon'); var carbon = require("carbon");
var tenantId = carbon.server.tenantId(); var url = carbon.server.address("https") + "/admin/services";
var url = carbon.server.address('https') + "/admin/services";
var server = new carbon.server.Server(url); var server = new carbon.server.Server(url);
var userManager = new carbon.user.UserManager(server, tenantId);
var deviceManagementService = utility.getDeviceManagementService();
var EmailMessageProperties = Packages.org.wso2.carbon.device.mgt.common.EmailMessageProperties;
var publicMethods = {}; var publicMethods = {};
var privateMethods = {}; var privateMethods = {};
/** /**
* Get the carbon user object from the session. If not found - it will throw a user not found error. * Get the carbon user object from the session. If not found - it will throw a user not found error.
* @returns {carbon user object} * @returns {object} carbon user object
*/ */
privateMethods.getCarbonUser = function () { privateMethods.getCarbonUser = function () {
var carbon = require('carbon'); var carbon = require("carbon");
var carbonUser = session.get(constants.USER_SESSION_KEY); var carbonUser = session.get(constants["USER_SESSION_KEY"]);
var utility = require('/app/modules/utility.js').utility; var utility = require("/modules/utility.js")["utility"];
if (!carbonUser) { if (!carbonUser) {
log.error("User object was not found in the session"); log.error("User object was not found in the session");
throw constants.ERRORS.USER_NOT_FOUND; throw constants["ERRORS"]["USER_NOT_FOUND"];
} }
return carbonUser; return carbonUser;
}; };
@ -59,83 +54,25 @@ var userModule = function () {
* Only GET method is implemented for now since there are no other type of methods used this method. * Only GET method is implemented for now since there are no other type of methods used this method.
* @param url - URL to call the backend without the host * @param url - URL to call the backend without the host
* @param method - HTTP Method (GET, POST) * @param method - HTTP Method (GET, POST)
* @returns { * @returns An object with 'status': 'success'|'error', 'content': {}
* 'status': 'success'|'error',
* 'content': {}
* }
*/ */
privateMethods.callBackend = function (url, method) { privateMethods.callBackend = function (url, method) {
if (constants.HTTP_GET == method) { if (constants["HTTP_GET"] == method) {
var response = serviceInvokers.XMLHttp.get(url, function (responsePayload) { return serviceInvokers.XMLHttp.get(url,
function (backendResponse) {
var response = {}; var response = {};
response.content = responsePayload["responseContent"]; response.content = backendResponse.responseText;
if (responsePayload["responseContent"] == null && responsePayload != null) { if (backendResponse.status == 200) {
response.content = responsePayload;
}
response.status = "success"; response.status = "success";
return response; } else if (backendResponse.status == 400 || backendResponse.status == 401 ||
}, backendResponse.status == 404 || backendResponse.status == 500) {
function (responsePayload) {
var response = {};
response.content = responsePayload;
response.status = "error"; response.status = "error";
return response;
});
return response;
} else {
log.error("Programming error : This method only support HTTP GET requests.");
} }
}; return response;
/*
@Deprecated
*/
/**
* Add user to mdm-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 statusCode, carbon = require('carbon');
var carbonUser = session.get(constants.USER_SESSION_KEY);
var utility = require('/app/modules/utility.js').utility;
if (!carbonUser) {
log.error("User object was not found in the session");
throw constants.ERRORS.USER_NOT_FOUND;
}
try {
utility.startTenantFlow(carbonUser);
var tenantId = carbon.server.tenantId();
var userManager = new carbon.user.UserManager(server, tenantId);
if (userManager.userExists(username)) {
if (log.isDebugEnabled()) {
log.debug("A user with name '" + username + "' already exists.");
} }
// http status code 409 refers to - conflict. );
statusCode = 409;
} else { } else {
var initialUserPassword = privateMethods.generateInitialUserPassword(); log.error("Runtime error : This method only support HTTP GET requests.");
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.
statusCode = 201;
}
return statusCode;
} catch (e) {
throw e;
} finally {
utility.endTenantFlow();
} }
}; };
@ -179,197 +116,6 @@ var userModule = function () {
} }
}; };
/*
@Deprecated
*/
/**
* 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 statusCode, carbon = require('carbon');
var carbonUser = session.get(constants.USER_SESSION_KEY);
var utility = require('/app/modules/utility.js').utility;
if (!carbonUser) {
log.error("User object was not found in the session");
throw constants.ERRORS.USER_NOT_FOUND;
}
try {
utility.startTenantFlow(carbonUser);
var tenantId = carbon.server.tenantId();
var userManager = new carbon.user.UserManager(server, tenantId);
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.
statusCode = 200;
} else {
if (log.isDebugEnabled()) {
log.debug("A user with name '" + username + "' does not exist to remove.");
}
// http status code 409 refers to - conflict.
statusCode = 409;
}
return statusCode;
} catch (e) {
throw e;
} finally {
utility.endTenantFlow();
}
};
/*
@Deprecated
*/
/**
* 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);
};
/*
@Deprecated
*/
/**
* 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;
};
/*
@Deprecated
*/
/**
* Send an initial invitation email to a user with username/password attached
* for the very-first enrollment with WSO2 MDM.
*
* @param username Username of the user
* @param password Password of the user
*/
privateMethods.inviteUserToEnroll = function (username, password) {
var carbon = require('carbon');
var enrollmentURL = devicemgtProps.generalConfig.host + devicemgtProps.webAgentContext + "download-agent";
var carbonUser = session.get(constants.USER_SESSION_KEY);
var utility = require('/app/modules/utility.js').utility;
if (!carbonUser) {
log.error("User object was not found in the session");
throw constants.ERRORS.USER_NOT_FOUND;
}
//var user = userManagementService.getUser(username, carbonUser.tenantId);
try {
utility.startTenantFlow(carbonUser);
var tenantId = carbon.server.tenantId();
var userManager = new carbon.user.UserManager(server, tenantId);
var emailTo = [];
var user = userManager.getUser(username);
emailTo[0] = privateMethods.getEmail(username, userManager);
var emailMessageProperties = new EmailMessageProperties();
emailMessageProperties.setMailTo(emailTo);
emailMessageProperties.setFirstName(privateMethods.getFirstName(username, userManager));
emailMessageProperties.setUserName(username);
emailMessageProperties.setPassword(password);
emailMessageProperties.setEnrolmentUrl(enrollmentURL);
deviceManagementService.sendRegistrationEmail(emailMessageProperties);
} catch (e) {
throw e;
} finally {
utility.endTenantFlow();
}
};
/*
@Deprecated
*/
privateMethods.getEmail = function (username, userManager) {
return userManager.getClaim(username, "http://wso2.org/claims/emailaddress", null)
};
/*
@Deprecated
*/
privateMethods.getFirstName = function (username, userManager) {
return userManager.getClaim(username, "http://wso2.org/claims/givenname", null)
};
/*
@Deprecated
*/
privateMethods.getLastName = function (username, userManager) {
return userManager.getClaim(username, "http://wso2.org/claims/lastname", null)
};
/*
@Deprecated
*/
publicMethods.inviteUser = function (username) {
var carbonUser = session.get(constants.USER_SESSION_KEY);
var utility = require('/app/modules/utility.js').utility;
if (!carbonUser) {
log.error("User object was not found in the session");
throw constants.ERRORS.USER_NOT_FOUND;
}
var enrollmentURL = devicemgtProps.generalConfig.host + devicemgtProps.webAgentContext + "download-agent";
try {
utility.startTenantFlow(carbonUser);
var tenantId = carbon.server.tenantId();
var userManager = new carbon.user.UserManager(server, tenantId);
var user = userManager.getUser(username);
var emailProperties = new EmailMessageProperties();
var emailTo = [];
emailTo[0] = privateMethods.getEmail(username, userManager);
emailProperties.setMailTo(emailTo);
//emailProperties.setFirstName(user.getFirstName());
emailProperties.setFirstName(privateMethods.getFirstName(username, userManager));
emailProperties.setEnrolmentUrl(enrollmentURL);
deviceManagementService.sendEnrolmentInvitation(emailProperties);
} catch (e) {
throw e;
} finally {
utility.endTenantFlow();
}
};
/* /*
@Updated @Updated
*/ */
@ -382,9 +128,12 @@ var userModule = function () {
} }
try { try {
utility.startTenantFlow(carbonUser); utility.startTenantFlow(carbonUser);
var url = devicemgtProps["httpsURL"] + constants.ADMIN_SERVICE_CONTEXT + "/users"; var url = devicemgtProps["httpsURL"] + devicemgtProps["backendRestEndpoints"]["deviceMgt"] + "/users?offset=0&limit=100";
return privateMethods.callBackend(url, constants.HTTP_GET); var response = privateMethods.callBackend(url, constants["HTTP_GET"]);
if (response.status == "success") {
response.content = parse(response.content).users;
}
return response;
} catch (e) { } catch (e) {
throw e; throw e;
} finally { } finally {
@ -395,22 +144,16 @@ var userModule = function () {
/** /**
* Return a User object from the backend by calling the JAX-RS * Return a User object from the backend by calling the JAX-RS
* @param username * @param username
* @returns { * @returns {object} a response object with status and content on success.
* 'status': 'success'|'error',
* 'content': {
"username": "abc",
"firstname": "abc",
"lastname": "efj",
"emailAddress": "abc@abc.com"
}
* }
*/ */
publicMethods.getUser = function (username) { publicMethods.getUser = function (username) {
var carbonUser = privateMethods.getCarbonUser(); var carbonUser = privateMethods.getCarbonUser();
try { try {
utility.startTenantFlow(carbonUser); utility.startTenantFlow(carbonUser);
var url = devicemgtProps["httpsURL"] + constants.ADMIN_SERVICE_CONTEXT + "/users/view?username=" + username; var url = devicemgtProps["httpsURL"] + devicemgtProps["backendRestEndpoints"]["deviceMgt"] + "/users/" +
var response = privateMethods.callBackend(url, constants.HTTP_GET); encodeURIComponent(username);
var response = privateMethods.callBackend(url, constants["HTTP_GET"]);
response["content"] = parse(response.content);
response["userDomain"] = carbonUser.domain; response["userDomain"] = carbonUser.domain;
return response; return response;
} catch (e) { } catch (e) {
@ -419,18 +162,19 @@ var userModule = function () {
utility.endTenantFlow(); utility.endTenantFlow();
} }
}; };
/** /**
* TODO: comment * Returns a set of roles assigned to a particular user
* @param username * @param username
* @returns {*} * @returns {object} a response object with status and content on success.
*/ */
publicMethods.getRolesByUsername = function (username) { publicMethods.getRolesByUsername = function (username) {
var carbonUser = privateMethods.getCarbonUser(); var carbonUser = privateMethods.getCarbonUser();
try { try {
utility.startTenantFlow(carbonUser); utility.startTenantFlow(carbonUser);
var url = devicemgtProps["httpsURL"] + constants.ADMIN_SERVICE_CONTEXT + "/users/roles?username=" + username; var url = devicemgtProps["httpsURL"] + devicemgtProps["backendRestEndpoints"]["deviceMgt"] + "/users/" +
var response = privateMethods.callBackend(url, constants.HTTP_GET); encodeURIComponent(username) + "/roles";
return response; return privateMethods.callBackend(url, constants["HTTP_GET"]);
} catch (e) { } catch (e) {
throw e; throw e;
} finally { } finally {
@ -450,8 +194,8 @@ var userModule = function () {
} }
try { try {
utility.startTenantFlow(carbonUser); utility.startTenantFlow(carbonUser);
var url = devicemgtProps["httpsURL"] + constants.ADMIN_SERVICE_CONTEXT + "/users/users-by-username"; var url = devicemgtProps["httpsURL"] + "/mdm-admin/users/users-by-username";
return privateMethods.callBackend(url, constants.HTTP_GET) return privateMethods.callBackend(url, constants["HTTP_GET"]);
} catch (e) { } catch (e) {
throw e; throw e;
} finally { } finally {
@ -467,15 +211,19 @@ var userModule = function () {
*/ */
publicMethods.getRoles = function () { publicMethods.getRoles = function () {
var carbonUser = session.get(constants["USER_SESSION_KEY"]); var carbonUser = session.get(constants["USER_SESSION_KEY"]);
var utility = require('/app/modules/utility.js')["utility"]; var utility = require("/app/modules/utility.js")["utility"];
if (!carbonUser) { if (!carbonUser) {
log.error("User object was not found in the session"); log.error("User object was not found in the session");
throw constants["ERRORS"]["USER_NOT_FOUND"]; throw constants["ERRORS"]["USER_NOT_FOUND"];
} }
try { try {
utility.startTenantFlow(carbonUser); utility.startTenantFlow(carbonUser);
var url = devicemgtProps["httpsURL"] + constants.ADMIN_SERVICE_CONTEXT + "/roles"; var url = devicemgtProps["httpsURL"] + devicemgtProps["backendRestEndpoints"]["deviceMgt"] + "/roles";
return privateMethods.callBackend(url, constants.HTTP_GET); var response = privateMethods.callBackend(url, constants["HTTP_GET"]);
if (response.status == "success") {
response.content = parse(response.content).roles;
}
return response;
} catch (e) { } catch (e) {
throw e; throw e;
} finally { } finally {
@ -488,18 +236,24 @@ var userModule = function () {
*/ */
/** /**
* Get User Roles from user store (Internal roles not included). * Get User Roles from user store (Internal roles not included).
* @returns {object} a response object with status and content on success.
*/ */
publicMethods.getRolesByUserStore = function (userStore) { publicMethods.getRolesByUserStore = function () {
var ROLE_LIMIT = devicemgtProps["pageSize"];
var carbonUser = session.get(constants["USER_SESSION_KEY"]); var carbonUser = session.get(constants["USER_SESSION_KEY"]);
var utility = require('/app/modules/utility.js')["utility"]; var utility = require("/app/modules/utility.js")["utility"];
if (!carbonUser) { if (!carbonUser) {
log.error("User object was not found in the session"); log.error("User object was not found in the session");
throw constants["ERRORS"]["USER_NOT_FOUND"]; throw constants["ERRORS"]["USER_NOT_FOUND"];
} }
try { try {
utility.startTenantFlow(carbonUser); utility.startTenantFlow(carbonUser);
var url = devicemgtProps["httpsURL"] + constants.ADMIN_SERVICE_CONTEXT + "/roles/" + encodeURIComponent(userStore); var url = devicemgtProps["httpsURL"] + devicemgtProps["backendRestEndpoints"]["deviceMgt"] + "/roles?limit=" + ROLE_LIMIT;
return privateMethods.callBackend(url, constants.HTTP_GET); var response = privateMethods.callBackend(url, constants["HTTP_GET"]);
if (response.status == "success") {
response.content = parse(response.content).roles;
}
return response;
} catch (e) { } catch (e) {
throw e; throw e;
} finally { } finally {
@ -510,40 +264,45 @@ var userModule = function () {
/** /**
* Get Platforms. * Get Platforms.
*/ */
//TODO Move this piece of logic out of user.js to somewhere else appropriate.
publicMethods.getPlatforms = function () { publicMethods.getPlatforms = function () {
var carbonUser = session.get(constants["USER_SESSION_KEY"]); var carbonUser = session.get(constants["USER_SESSION_KEY"]);
var utility = require('/app/modules/utility.js')["utility"]; var utility = require("/app/modules/utility.js")["utility"];
if (!carbonUser) { if (!carbonUser) {
log.error("User object was not found in the session"); log.error("User object was not found in the session");
throw constants["ERRORS"]["USER_NOT_FOUND"]; throw constants["ERRORS"]["USER_NOT_FOUND"];
} }
try { try {
utility.startTenantFlow(carbonUser); utility.startTenantFlow(carbonUser);
var url = devicemgtProps["httpsURL"] + constants.ADMIN_SERVICE_CONTEXT + "/devices/types"; var url = devicemgtProps["httpsURL"] + devicemgtProps["backendRestEndpoints"]["deviceMgt"] + "/admin/device-types";
return privateMethods.callBackend(url, constants.HTTP_GET); var response = privateMethods.callBackend(url, constants["HTTP_GET"]);
if (response.status == "success") {
response.content = parse(response.content);
}
return response;
} catch (e) { } catch (e) {
throw e; throw e;
} finally { } finally {
utility.endTenantFlow(); utility.endTenantFlow();
} }
}; };
/*
@Updated
*/
/** /**
* Get role * Get role
*/ */
publicMethods.getRole = function (roleName) { publicMethods.getRole = function (roleName) {
var carbonUser = session.get(constants["USER_SESSION_KEY"]); var carbonUser = session.get(constants["USER_SESSION_KEY"]);
var utility = require('/app/modules/utility.js')["utility"]; var utility = require("/app/modules/utility.js")["utility"];
if (!carbonUser) { if (!carbonUser) {
log.error("User object was not found in the session"); log.error("User object was not found in the session");
throw constants["ERRORS"]["USER_NOT_FOUND"]; throw constants["ERRORS"]["USER_NOT_FOUND"];
} }
try { try {
utility.startTenantFlow(carbonUser); utility.startTenantFlow(carbonUser);
var url = devicemgtProps["httpsURL"] + constants.ADMIN_SERVICE_CONTEXT + "/roles/role?rolename=" + encodeURIComponent(roleName); var url = devicemgtProps["httpsURL"] + devicemgtProps["backendRestEndpoints"]["deviceMgt"] +
var response = privateMethods.callBackend(url, constants.HTTP_GET); "/roles/" + encodeURIComponent(roleName);
var response = privateMethods.callBackend(url, constants["HTTP_GET"]);
response.content = parse(response.content);
return response; return response;
} catch (e) { } catch (e) {
throw e; throw e;
@ -687,30 +446,6 @@ var userModule = function () {
return permissions; return permissions;
}; };
/**
* Add new role with permissions.
*
* @param roleName Name of the role
* @param users List of users to assign the role
* @param permissions List of permissions
*/
publicMethods.addRole = function (roleName, users, permissions) {
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.roleExists(roleName)) {
userManager.addRole(roleName, users, permissions);
} else {
log.info("Role exist with name: " + roleName);
}
} catch (e) {
throw e;
}
};
publicMethods.addPermissions = function (permissionList, path, init) { publicMethods.addPermissions = function (permissionList, path, init) {
var registry, carbon = require("carbon"); var registry, carbon = require("carbon");
var carbonServer = application.get("carbonServer"); var carbonServer = application.get("carbonServer");
@ -776,24 +511,29 @@ var userModule = function () {
* retrieve secondary user stores. * retrieve secondary user stores.
* This needs Authentication since the method access admin services. * This needs Authentication since the method access admin services.
* *
* @returns {string array} Array of secondary user stores. * @returns Array of secondary user stores.
*/ */
publicMethods.getSecondaryUserStores = function () { publicMethods.getSecondaryUserStores = function () {
var returnVal = []; var returnVal = [];
var endpoint = devicemgtProps.adminService + constants.USER_STORE_CONFIG_ADMIN_SERVICE_END_POINT; var endpoint = devicemgtProps["adminService"] + constants["USER_STORE_CONFIG_ADMIN_SERVICE_END_POINT"];
var wsPayload = "<xsd:getSecondaryRealmConfigurations xmlns:xsd='http://org.apache.axis2/xsd'/>"; var wsPayload = "<xsd:getSecondaryRealmConfigurations xmlns:xsd='http://org.apache.axis2/xsd'/>";
serviceInvokers.WS.soapRequest( serviceInvokers.WS.soapRequest(
"urn:getSecondaryRealmConfigurations", endpoint, wsPayload, function (wsResponse) { "urn:getSecondaryRealmConfigurations",
wsPayload,
endpoint,
function (wsResponse) {
var domainIDs = stringify(wsResponse.*::['return']. *::domainId.text()); var domainIDs = stringify(wsResponse.*::['return']. *::domainId.text());
if (domainIDs != "\"\"") { if (domainIDs != "\"\"") {
var regExpForSearch = new RegExp(constants.USER_STORES_NOISY_CHAR, "g"); var regExpForSearch = new RegExp(constants["USER_STORES_NOISY_CHAR"], "g");
domainIDs = domainIDs.replace(regExpForSearch, ""); domainIDs = domainIDs.replace(regExpForSearch, "");
returnVal = domainIDs.split(constants.USER_STORES_SPLITTING_CHAR); returnVal = domainIDs.split(constants["USER_STORES_SPLITTING_CHAR"]);
} }
}, function (e) { }, function (e) {
log.error("Error retrieving secondary user stores", e); log.error("Error retrieving secondary user stores", e);
}, constants.SOAP_VERSION); },
constants["SOAP_VERSION"]);
return returnVal; return returnVal;
}; };
return publicMethods; return publicMethods;
}(); }();

@ -21,15 +21,16 @@ var util = function () {
var module = {}; var module = {};
var Base64 = Packages.org.apache.commons.codec.binary.Base64; var Base64 = Packages.org.apache.commons.codec.binary.Base64;
var String = Packages.java.lang.String; var String = Packages.java.lang.String;
var devicemgtProps = require('/app/conf/devicemgt-props.js').config(); var devicemgtProps = require("/app/conf/reader/main.js")["conf"];
var carbon = require('carbon'); var carbon = require('carbon');
var constants = require("/app/modules/constants.js"); var constants = require("/app/modules/constants.js");
var adminUser = devicemgtProps["adminUser"]; var adminUser = devicemgtProps["adminUser"];
var clientName = devicemgtProps["clientName"];
module.getDyanmicCredentials = function (owner) { module.getDyanmicCredentials = function (owner) {
var payload = { var payload = {
"callbackUrl": devicemgtProps.callBackUrl, "callbackUrl": devicemgtProps.callBackUrl,
"clientName": "devicemgt", "clientName": clientName,
"tokenScope": "admin", "tokenScope": "admin",
"owner": adminUser, "owner": adminUser,
"applicationType": "webapp", "applicationType": "webapp",
@ -79,7 +80,7 @@ var util = function () {
*/ */
module.getTokenWithPasswordGrantType = function (username, password, encodedClientKeys, scope) { module.getTokenWithPasswordGrantType = function (username, password, encodedClientKeys, scope) {
var xhr = new XMLHttpRequest(); var xhr = new XMLHttpRequest();
var tokenEndpoint = devicemgtProps.idPServer + "/token"; var tokenEndpoint = devicemgtProps.idPServer;
xhr.open("POST", tokenEndpoint, false); xhr.open("POST", tokenEndpoint, false);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.setRequestHeader("Authorization", "Basic " + encodedClientKeys); xhr.setRequestHeader("Authorization", "Basic " + encodedClientKeys);
@ -119,7 +120,7 @@ var util = function () {
encodedExtractedAssertion = this.encode(extractedAssertion); encodedExtractedAssertion = this.encode(extractedAssertion);
var xhr = new XMLHttpRequest(); var xhr = new XMLHttpRequest();
var tokenEndpoint = devicemgtProps.idPServer + "/token"; var tokenEndpoint = devicemgtProps.idPServer;
xhr.open("POST", tokenEndpoint, false); xhr.open("POST", tokenEndpoint, false);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.setRequestHeader("Authorization", "Basic " + clientKeys); xhr.setRequestHeader("Authorization", "Basic " + clientKeys);
@ -140,7 +141,7 @@ var util = function () {
module.refreshToken = function (tokenPair, clientData, scope) { module.refreshToken = function (tokenPair, clientData, scope) {
var xhr = new XMLHttpRequest(); var xhr = new XMLHttpRequest();
var tokenEndpoint = devicemgtProps.idPServer + "/token"; var tokenEndpoint = devicemgtProps.idPServer;
xhr.open("POST", tokenEndpoint, false); xhr.open("POST", tokenEndpoint, false);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.setRequestHeader("Authorization", "Basic " + clientData); xhr.setRequestHeader("Authorization", "Basic " + clientData);

@ -20,7 +20,7 @@ var utility;
utility = function () { utility = function () {
var constants = require('/app/modules/constants.js'); var constants = require('/app/modules/constants.js');
var devicemgtProps = require('/app/conf/devicemgt-props.js').config(); var devicemgtProps = require("/app/conf/reader/main.js")["conf"];
var log = new Log("/app/modules/utility.js"); var log = new Log("/app/modules/utility.js");
var JavaClass = Packages.java.lang.Class; var JavaClass = Packages.java.lang.Class;
var PrivilegedCarbonContext = Packages.org.wso2.carbon.context.PrivilegedCarbonContext; var PrivilegedCarbonContext = Packages.org.wso2.carbon.context.PrivilegedCarbonContext;

@ -21,7 +21,7 @@ function onRequest(context) {
var user = session.get(constants.USER_SESSION_KEY); var user = session.get(constants.USER_SESSION_KEY);
var userModule = require("/app/modules/user.js").userModule; var userModule = require("/app/modules/user.js").userModule;
var permissions = userModule.getUIPermissions(); var permissions = userModule.getUIPermissions();
var devicemgtProps = require('/app/conf/devicemgt-props.js').config(); var devicemgtProps = require("/app/conf/reader/main.js")["conf"];
if (!permissions.VIEW_DASHBOARD) { if (!permissions.VIEW_DASHBOARD) {
response.sendRedirect(constants.WEB_APP_CONTEXT + "/devices"); response.sendRedirect(constants.WEB_APP_CONTEXT + "/devices");

@ -23,7 +23,7 @@
* @returns {*} A context object that returns the dynamic state of this page to be presented * @returns {*} A context object that returns the dynamic state of this page to be presented
*/ */
function onRequest(context) { function onRequest(context) {
var devicemgtProps = require('/app/conf/devicemgt-props.js').config(); var devicemgtProps = require("/app/conf/reader/main.js")["conf"];
var page = {}; var page = {};
page["groupNameJSRegEx"] = devicemgtProps.groupValidationConfig.groupNameJSRegEx; page["groupNameJSRegEx"] = devicemgtProps.groupValidationConfig.groupNameJSRegEx;
page["groupNameRegExViolationErrorMsg"] = devicemgtProps.groupValidationConfig.groupNameRegExViolationErrorMsg; page["groupNameRegExViolationErrorMsg"] = devicemgtProps.groupValidationConfig.groupNameRegExViolationErrorMsg;

@ -15,7 +15,7 @@
specific language governing permissions and limitations specific language governing permissions and limitations
under the License. under the License.
}} }}
{{unit "cdmf.unit.ui.title" pageTitle="User Management"}} {{unit "cdmf.unit.ui.title" pageTitle="User Management | Add User"}}
{{#zone "breadcrumbs"}} {{#zone "breadcrumbs"}}
<li> <li>
@ -50,8 +50,8 @@
<div id="user-create-error-msg" class="alert alert-danger hidden" role="alert"> <div id="user-create-error-msg" class="alert alert-danger hidden" role="alert">
<i class="icon fw fw-error"></i><span></span> <i class="icon fw fw-error"></i><span></span>
</div> </div>
<label class="wr-input-label" title="List of available secondary user stores"> <label class="wr-input-label" title="Select the domain of the user store from the drop-down given below. The domain of the default user store is PRIMARY">
User Stores User Store Domain
<span class="wr-help-tip glyphicon glyphicon-question-sign"></span> <span class="wr-help-tip glyphicon glyphicon-question-sign"></span>
</label> </label>
<div class="wr-input-control"> <div class="wr-input-control">
@ -96,12 +96,10 @@
<div id="emailField" class=" form-group wr-input-control"> <div id="emailField" class=" form-group wr-input-control">
<input type="email" id="emailAddress" class="form-control"/> <input type="email" id="emailAddress" class="form-control"/>
<span class="glyphicon glyphicon-remove form-control-feedback hidden emailError"></span> <span class="glyphicon glyphicon-remove form-control-feedback hidden emailError"></span>
<label class=" hidden error email-required" for="summary">This field is <label class=" hidden error email-required" for="summary">This field is required.</label>
required.</label>
<label class=" hidden error email-invalid" for="summary">Invalid Email Address.</label> <label class=" hidden error email-invalid" for="summary">Invalid Email Address.</label>
</div> </div>
<label class="wr-input-label" <label class="wr-input-label" title="Optional field that can have 0-to-many roles for the user">
title="Optional field that can have 0-to-many roles for the user">
User Roles User Roles
<span class="wr-help-tip glyphicon glyphicon-question-sign"></span> <span class="wr-help-tip glyphicon glyphicon-question-sign"></span>
</label> </label>
@ -123,7 +121,6 @@
<p class="page-sub-title">User was added successfully.</p> <p class="page-sub-title">User was added successfully.</p>
<br> <br>
An invitation mail will be sent to this user to initiate device enrollment. An invitation mail will be sent to this user to initiate device enrollment.
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-body"> <div class="panel-body">
<div class="qr-code col-lg-5 col-md-6 col-centered"></div> <div class="qr-code col-lg-5 col-md-6 col-centered"></div>
@ -132,8 +129,7 @@
<br>Please click <b>"Add Another User"</b>, if you wish to add another user or click <br>Please click <b>"Add Another User"</b>, if you wish to add another user or click
<b>"View User List"</b> to complete the process and go back to the user list. <b>"View User List"</b> to complete the process and go back to the user list.
<hr/> <hr/>
<button class="wr-btn" onclick="window.location.href='{{@app.context}}/users'">View User List <button class="wr-btn" onclick="window.location.href='{{@app.context}}/users'">View User List</button>
</button>
<a href="{{@app.context}}/user/add" class="cu-btn-inner"> <a href="{{@app.context}}/user/add" class="cu-btn-inner">
<span class="fw-stack"> <span class="fw-stack">
<i class="fw fw-ring fw-stack-2x"></i> <i class="fw fw-ring fw-stack-2x"></i>

@ -23,20 +23,24 @@
* @returns {*} A context object that returns the dynamic state of this page to be presented * @returns {*} A context object that returns the dynamic state of this page to be presented
*/ */
function onRequest(context) { function onRequest(context) {
//var log = new Log("/app/pages/cdmf.page.user.create server-side js");
var userModule = require("/app/modules/user.js")["userModule"]; var userModule = require("/app/modules/user.js")["userModule"];
var response = userModule.getRolesByUserStore("PRIMARY"); var devicemgtProps = require("/app/conf/reader/main.js")["conf"];
var devicemgtProps = require('/app/conf/devicemgt-props.js').config();
var page = {}; var page = {};
page["charLimit"] = devicemgtProps.usernameLength; var response = userModule.getRolesByUserStore();
if (response["status"] == "success") { if (response["status"] == "success") {
page["roles"] = response["content"]; page["roles"] = response["content"];
} }
page["usernameJSRegEx"] = devicemgtProps.userValidationConfig.usernameJSRegEx; page["charLimit"] = devicemgtProps["usernameLength"];
page["usernameHelpMsg"] = devicemgtProps.userValidationConfig.usernameHelpMsg; page["usernameJSRegEx"] = devicemgtProps["userValidationConfig"]["usernameJSRegEx"];
page["usernameRegExViolationErrorMsg"] = devicemgtProps.userValidationConfig.usernameRegExViolationErrorMsg; page["usernameHelpMsg"] = devicemgtProps["userValidationConfig"]["usernameHelpMsg"];
page["firstnameJSRegEx"] = devicemgtProps.userValidationConfig.firstnameJSRegEx; page["usernameRegExViolationErrorMsg"] = devicemgtProps["userValidationConfig"]["usernameRegExViolationErrorMsg"];
page["firstnameRegExViolationErrorMsg"] = devicemgtProps.userValidationConfig.firstnameRegExViolationErrorMsg; page["firstnameJSRegEx"] = devicemgtProps["userValidationConfig"]["firstnameJSRegEx"];
page["lastnameJSRegEx"] = devicemgtProps.userValidationConfig.lastnameJSRegEx; page["firstnameRegExViolationErrorMsg"] = devicemgtProps["userValidationConfig"]["firstnameRegExViolationErrorMsg"];
page["lastnameRegExViolationErrorMsg"] = devicemgtProps.userValidationConfig.lastnameRegExViolationErrorMsg; page["lastnameJSRegEx"] = devicemgtProps["userValidationConfig"]["lastnameJSRegEx"];
page["lastnameRegExViolationErrorMsg"] = devicemgtProps["userValidationConfig"]["lastnameRegExViolationErrorMsg"];
return page; return page;
} }

@ -10,8 +10,8 @@
* *
* Unless required by applicable law or agreed to in writing, * Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an * software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* KIND, either express or implied. See the License for the * either express or implied. See the License for the
* specific language governing permissions and limitations * specific language governing permissions and limitations
* under the License. * under the License.
*/ */
@ -30,6 +30,7 @@ function inputIsValid(regExp, inputString) {
var validateInline = {}; var validateInline = {};
var clearInline = {}; var clearInline = {};
var deviceMgtAPIsBasePath = "/api/device-mgt/v1.0";
var enableInlineError = function (inputField, errorMsg, errorSign) { var enableInlineError = function (inputField, errorMsg, errorSign) {
var fieldIdentifier = "#" + inputField; var fieldIdentifier = "#" + inputField;
@ -160,16 +161,16 @@ function emailIsValid(email) {
return regExp.test(email); return regExp.test(email);
} }
$("#userStore") $("#userStore").change(
.change(function () { function () {
var str = ""; var str = "";
$("select option:selected").each(function () { $("select option:selected").each(function () {
str += $(this).text() + " "; str += $(this).text() + " ";
}); });
var addUserAPI = "/devicemgt_admin/roles/" + str; var getRolesAPI = deviceMgtAPIsBasePath + "/roles/"+ str;
invokerUtil.get( invokerUtil.get(
addUserAPI, getRolesAPI,
function (data) { function (data) {
data = JSON.parse(data); data = JSON.parse(data);
if (data.errorMessage) { if (data.errorMessage) {
@ -182,9 +183,13 @@ $("#userStore")
$('#roles').append(newOption); $('#roles').append(newOption);
} }
} }
},
function (jqXHR) {
} }
); );
}).change(); }
).change();
$(document).ready(function () { $(document).ready(function () {
$("#emailValidationText").hide(); $("#emailValidationText").hide();
@ -202,7 +207,7 @@ $(document).ready(function () {
var usernameInput = $("input#username"); var usernameInput = $("input#username");
var firstnameInput = $("input#firstname"); var firstnameInput = $("input#firstname");
var lastnameInput = $("input#lastname"); var lastnameInput = $("input#lastname");
var charLimit = parseInt($("input#username").attr("limit")); //var charLimit = parseInt($("input#username").attr("limit"));
var domain = $("#userStore").val(); var domain = $("#userStore").val();
var username = usernameInput.val().trim(); var username = usernameInput.val().trim();
var firstname = firstnameInput.val(); var firstname = firstnameInput.val();
@ -244,17 +249,13 @@ $(document).ready(function () {
addUserFormData.emailAddress = emailAddress; addUserFormData.emailAddress = emailAddress;
addUserFormData.roles = roles; addUserFormData.roles = roles;
var addUserAPI = "/devicemgt_admin/users"; var addUserAPI = deviceMgtAPIsBasePath + "/users";
invokerUtil.post( invokerUtil.post(
addUserAPI, addUserAPI,
addUserFormData, addUserFormData,
function (data) { function (data, textStatus, jqXHR) {
data = JSON.parse(data); if (jqXHR.status == 201) {
if (data.errorMessage) {
$(errorMsg).text("Selected user store prompted an error : " + data.errorMessage);
$(errorMsgWrapper).removeClass("hidden");
} else if (data["statusCode"] == 201) {
// Clearing user input fields. // Clearing user input fields.
$("input#username").val(""); $("input#username").val("");
$("input#firstname").val(""); $("input#firstname").val("");
@ -264,21 +265,17 @@ $(document).ready(function () {
// Refreshing with success message // Refreshing with success message
$("#user-create-form").addClass("hidden"); $("#user-create-form").addClass("hidden");
$("#user-created-msg").removeClass("hidden"); $("#user-created-msg").removeClass("hidden");
} else if (data["statusCode"] == 409) { generateQRCode("#user-created-msg .qr-code");
$(errorMsg).text(data["messageFromServer"]);
$(errorMsgWrapper).removeClass("hidden");
} else if (data["statusCode"] == 500) {
$(errorMsg).text("An unexpected error occurred at backend server. Please try again later.");
$(errorMsgWrapper).removeClass("hidden");
} }
}, function (data) { }, function (data) {
data = JSON.parse(data.responseText); var payload = JSON.parse(data.responseText);
if (data["statusCode"] == 409) { if (data.status == 409) {
$(errorMsg).text("User : " + username + " already exists. Pick another username."); $(errorMsg).text("User : " + username + " already exists. Pick another username.");
} else if (data["statusCode"] == 500) { } else if (data.status == 500) {
$(errorMsg).text("An unexpected error occurred at backend server. Please try again later."); $(errorMsg).text("An unexpected error occurred at backend server. Please try again later.");
} else { } else {
$(errorMsg).text(data.errorMessage); $(errorMsg).text(payload.message);
} }
$(errorMsgWrapper).removeClass("hidden"); $(errorMsgWrapper).removeClass("hidden");
} }

@ -20,7 +20,7 @@ function onRequest(context) {
var userModule = require("/app/modules/user.js").userModule; var userModule = require("/app/modules/user.js").userModule;
var userName = request.getParameter("username"); var userName = request.getParameter("username");
var user = userModule.getUser(userName)["content"]; var user = userModule.getUser(userName)["content"];
var devicemgtProps = require('/app/conf/devicemgt-props.js').config(); var devicemgtProps = require("/app/conf/reader/main.js")["conf"];
if (user) { if (user) {
var title; var title;
if (user.firstname || user.lastname) { if (user.firstname || user.lastname) {

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
* *
* WSO2 Inc. licenses this file to you under the Apache License, * WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except * Version 2.0 (the "License"); you may not use this file except
@ -10,12 +10,14 @@
* *
* Unless required by applicable law or agreed to in writing, * Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an * software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* KIND, either express or implied. See the License for the * either express or implied. See the License for the
* specific language governing permissions and limitations * specific language governing permissions and limitations
* under the License. * under the License.
*/ */
var deviceMgtAPIsBasePath = "/api/device-mgt/v1.0";
/** /**
* Checks if provided input is valid against RegEx input. * Checks if provided input is valid against RegEx input.
* *
@ -36,7 +38,7 @@ $(function () {
var sortableElem = '.wr-sortable'; var sortableElem = '.wr-sortable';
$(sortableElem).sortable({ $(sortableElem).sortable({
beforeStop: function () { beforeStop: function () {
var sortedIDs = $(this).sortable('toArray'); $(this).sortable('toArray');
} }
}); });
$(sortableElem).disableSelection(); $(sortableElem).disableSelection();
@ -46,11 +48,9 @@ var modalPopup = ".wr-modalpopup";
var modalPopupContainer = modalPopup + " .modalpopup-container"; var modalPopupContainer = modalPopup + " .modalpopup-container";
var modalPopupContent = modalPopup + " .modalpopup-content"; var modalPopupContent = modalPopup + " .modalpopup-content";
var body = "body"; var body = "body";
var isInit = true; //var isInit = true;
$(".icon .text").res_text(0.2); $(".icon .text").res_text(0.2);
var resetPasswordServiceURL = "/devicemgt_admin/users/reset-password";
/* /*
* set popup maximum height function. * set popup maximum height function.
*/ */
@ -80,11 +80,9 @@ function hidePopup() {
*/ */
function getSelectedUsernames() { function getSelectedUsernames() {
var usernameList = []; var usernameList = [];
var userList = $("#user-grid").find('> tbody > tr'); var userList = $("#user-grid").find('tr.DTTT_selected');
userList.each(function () { userList.each(function () {
if ($(this).hasClass('DTTT_selected')) { usernameList.push($(this).data('username'));
usernameList.push($(this).attr('data-username'));
}
}); });
return usernameList; return usernameList;
} }
@ -96,7 +94,7 @@ function getSelectedUsernames() {
*/ */
$("a.invite-user-link").click(function () { $("a.invite-user-link").click(function () {
var usernameList = getSelectedUsernames(); var usernameList = getSelectedUsernames();
var inviteUserAPI = "/devicemgt_admin/users/email-invitation"; var inviteUserAPI = deviceMgtAPIsBasePath + "/users/send-invitation";
if (usernameList.length == 0) { if (usernameList.length == 0) {
$(modalPopupContent).html($("#errorUsers").html()); $(modalPopupContent).html($("#errorUsers").html());
@ -110,13 +108,18 @@ $("a.invite-user-link").click(function () {
invokerUtil.post( invokerUtil.post(
inviteUserAPI, inviteUserAPI,
usernameList, usernameList,
function () { // success callback
function (data, textStatus, jqXHR) {
if (jqXHR.status == 200) {
$(modalPopupContent).html($('#invite-user-success-content').html()); $(modalPopupContent).html($('#invite-user-success-content').html());
$("a#invite-user-success-link").click(function () { $("a#invite-user-success-link").click(function () {
hidePopup(); hidePopup();
}); });
}
}, },
function () { // error callback
function (jqXHR) {
console.log("error in invite-user API, status code: " + jqXHR.status);
$(modalPopupContent).html($('#invite-user-error-content').html()); $(modalPopupContent).html($('#invite-user-error-content').html());
$("a#invite-user-error-link").click(function () { $("a#invite-user-error-link").click(function () {
hidePopup(); hidePopup();
@ -135,29 +138,28 @@ $("a.invite-user-link").click(function () {
* when a user clicks on "Remove" link * when a user clicks on "Remove" link
* on User Listing page in WSO2 Devicemgt Console. * on User Listing page in WSO2 Devicemgt Console.
*/ */
function removeUser(uname, uid) { function removeUser(username) {
var username = uname; var removeUserAPI = deviceMgtAPIsBasePath + "/users/" + username;
var userid = uid;
var removeUserAPI = "/devicemgt_admin/users?username=" + username;
$(modalPopupContent).html($('#remove-user-modal-content').html()); $(modalPopupContent).html($('#remove-user-modal-content').html());
showPopup(); showPopup();
$("a#remove-user-yes-link").click(function () { $("a#remove-user-yes-link").click(function () {
invokerUtil.delete( invokerUtil.delete(
removeUserAPI, removeUserAPI,
function () { // success callback
$("#" + userid).remove(); function (data, textStatus, jqXHR) {
// get new user-list-count if (jqXHR.status == 200) {
var newUserListCount = $(".user-list > span").length;
// update user-listing-status-msg with new user-count
$("#user-listing-status-msg").text("Total number of Users found : " + newUserListCount);
// update modal-content with success message // update modal-content with success message
$(modalPopupContent).html($('#remove-user-success-content').html()); $(modalPopupContent).html($('#remove-user-success-content').html());
$("a#remove-user-success-link").click(function () { $("a#remove-user-success-link").click(function () {
hidePopup(); hidePopup();
location.reload();
}); });
}
}, },
function () { // error callback
function (jqXHR) {
console.log("error in remove-user API, status code: " + jqXHR.status);
$(modalPopupContent).html($('#remove-user-error-content').html()); $(modalPopupContent).html($('#remove-user-error-content').html());
$("a#remove-user-error-link").click(function () { $("a#remove-user-error-link").click(function () {
hidePopup(); hidePopup();
@ -202,29 +204,30 @@ function resetPassword(uname) {
$(errorMsgWrapper).removeClass("hidden"); $(errorMsgWrapper).removeClass("hidden");
} else { } else {
var resetPasswordFormData = {}; var resetPasswordFormData = {};
resetPasswordFormData.username = user; //resetPasswordFormData.username = user;
resetPasswordFormData.newPassword = window.btoa(unescape(encodeURIComponent(confirmedPassword))); resetPasswordFormData.newPassword = unescape(confirmedPassword);
var resetPasswordServiceURL = deviceMgtAPIsBasePath + "/admin/users/"+ user +"/credentials";
invokerUtil.post( invokerUtil.post(
resetPasswordServiceURL, resetPasswordServiceURL,
resetPasswordFormData, resetPasswordFormData,
function (data) { // The success callback // success callback
data = JSON.parse(data); function (data, textStatus, jqXHR) {
if (data.statusCode == 201) { if (jqXHR.status == 200) {
$(modalPopupContent).html($('#reset-password-success-content').html()); $(modalPopupContent).html($('#reset-password-success-content').html());
$("a#reset-password-success-link").click(function () { $("a#reset-password-success-link").click(function () {
hidePopup(); hidePopup();
}); });
} }
}, function (data) { // The error callback },
if (data.statusCode == 400) { // error callback
$(errorMsg).text("Old password does not match with the provided value."); function (jqXHR) {
$(errorMsgWrapper).removeClass("hidden"); console.log("error in reset-password API, status code: " + jqXHR.status);
} else { var payload = JSON.parse(jqXHR.responseText);
$(errorMsg).text("An unexpected error occurred. Please try again later."); $(errorMsg).text(payload.message);
$(errorMsgWrapper).removeClass("hidden"); $(errorMsgWrapper).removeClass("hidden");
} }
}
); );
} }
}); });
@ -250,7 +253,7 @@ $("#search-btn").click(function () {
* when a user clicks on the list item * when a user clicks on the list item
* initial mode and with out select mode. * initial mode and with out select mode.
*/ */
function InitiateViewOption() { function initiateViewOption() {
if ($("#can-view").val()) { if ($("#can-view").val()) {
$(location).attr('href', $(this).data("url")); $(location).attr('href', $(this).data("url"));
} else { } else {
@ -259,73 +262,137 @@ function InitiateViewOption() {
} }
} }
function loadUsers(searchParam) { function loadUsers() {
$("#loading-content").show(); var loadingContentIcon = "#loading-content";
var userListing = $("#user-listing"); $(loadingContentIcon).show();
var userListingSrc = userListing.attr("src");
$.template("user-listing", userListingSrc, function (template) { var dataFilter = function (data) {
var serviceURL = "/devicemgt_admin/users";
if (searchParam) {
serviceURL = serviceURL + "/view-users?username=" + searchParam;
}
var successCallback = function (data) {
if (!data) {
$('#ast-container').addClass('hidden');
$('#user-listing-status-msg').text('No users are available to be displayed.');
return;
}
var canRemove = $("#can-remove").val();
var canEdit = $("#can-edit").val();
var canResetPassword = $("#can-reset-password").val();
data = JSON.parse(data); data = JSON.parse(data);
data = data.responseContent;
var viewModel = {}; var objects = [];
viewModel.users = data;
for (var i = 0; i < viewModel.users.length; i++) { $(data.users).each(
viewModel.users[i].userid = viewModel.users[i].username.replace(/[^\w\s]/gi, ''); function (index) {
if (canRemove) { objects.push(
viewModel.users[i].canRemove = true; {
username: data.users[index].username,
firstname: data.users[index].firstname ? data.users[index].firstname: '' ,
lastname: data.users[index].lastname ? data.users[index].lastname : '',
emailAddress : data.users[index].emailAddress ? data.users[index].emailAddress: '',
DT_RowId : "user-" + data.users[index].username
} }
if (canEdit) { )
viewModel.users[i].canEdit = true;
} }
if (canResetPassword) { );
viewModel.users[i].canResetPassword = true;
var json = {
"recordsTotal": data.count,
"recordsFiltered": data.count,
"data": objects
};
return JSON.stringify(json);
};
var fnCreatedRow = function(nRow, aData, iDataIndex) {
console.log(JSON.stringify(aData));
$(nRow).attr('data-type', 'selectable');
$(nRow).attr('data-username', aData["username"]);
};
var columns = [
{
class: "remove-padding icon-only content-fill",
data: null,
defaultContent:
'<div class="thumbnail icon">' +
'<i class="square-element text fw fw-user" style="font-size: 30px;"></i>' +
'</div>'
},
{
class: "fade-edge",
data: null,
render: function (data, type, row, meta) {
return '<h4>' + data.firstname + ' ' + data.lastname + '</h4>';
} }
viewModel.users[i].adminUser = $("#user-table").data("user"); },
{
class: "fade-edge remove-padding-top",
data: null,
render: function (data, type, row, meta) {
return '<i class="fw-user"></i> ' + data.username;
} }
if (data.length > 0) { },
$('#ast-container').removeClass('hidden'); {
$('#user-listing-status-msg').text(""); class: "fade-edge remove-padding-top",
var content = template(viewModel); data: null,
$("#ast-container").html(content); render: function (data, type, row, meta) {
} else { return '<a href="mailto:' + data.emailAddress + ' " class="wr-list-email"><i class="fw-mail"></i> ' +
$('#ast-container').addClass('hidden'); data.emailAddress + ' </a>';
$('#user-listing-status-msg').text('No users are available to be displayed.');
} }
$("#loading-content").hide(); },
if (isInit) { {
$('#user-grid').datatables_extended(); class: "text-right content-fill text-left-on-grid-view no-wrap",
isInit = false; data: null,
render: function (data, type, row, meta) {
return '<a href="/emm/users/edit-user?username=' + data.username + '" ' +
'data-username="' + data.username + '" ' +
'data-click-event="edit-form" ' +
'class="btn padding-reduce-on-grid-view edit-user-link">' +
'<span class="fw-stack">' +
'<i class="fw fw-ring fw-stack-2x"></i>' +
'<i class="fw fw-edit fw-stack-1x"></i>' +
'</span>' +
'<span class="hidden-xs hidden-on-grid-view">&nbsp;&nbsp;Edit</span>' +
'</a>' +
'<a href="#" ' +
'data-username="' + data.username + '" ' +
'data-user-id="' + data.username + '" ' +
'data-click-event="edit-form" ' +
'onclick="javascript:resetPassword(\'' + data.username + '\')" ' +
'class="btn padding-reduce-on-grid-view remove-user-link">' +
'<span class="fw-stack">' +
'<i class="fw fw-ring fw-stack-2x"></i>' +
'<i class="fw fw-key fw-stack-1x"></i>' +
'<span class="fw-stack fw-move-right fw-move-bottom">' +
'<i class="fw fw-circle fw-stack-2x fw-stroke fw-inverse"></i> ' +
'<i class="fw fw-circle fw-stack-2x"></i>' +
'<i class="fw fw-refresh fw-stack-1x fw-inverse"></i> ' +
'</span>' +
'</span>' +
'<span class="hidden-xs hidden-on-grid-view">&nbsp;&nbsp;Reset Password</span>' +
'</a>' +
'<a href="#" ' +
'data-username="' + data.username + '" ' +
'data-user-id=' + data.username + ' ' +
'data-click-event="remove-form" ' +
'onclick="javascript:removeUser(\'' + data.username + '\', \'' + data.username + '\')" ' +
'class="btn padding-reduce-on-grid-view remove-user-link">' +
'<span class="fw-stack">' +
'<i class="fw fw-ring fw-stack-2x"></i>' +
'<i class="fw fw-delete fw-stack-1x"></i>' +
'</span>' +
'<span class="hidden-xs hidden-on-grid-view">&nbsp;&nbsp;Remove</span> ' +
'</a>'
} }
$(".icon .text").res_text(0.2);
};
invokerUtil.get(serviceURL,
successCallback,
function (message) {
$('#ast-container').addClass('hidden');
$('#user-listing-status-msg').text('Invalid search query. Try again with a valid search query');
} }
];
$("#user-grid").datatables_extended_serverside_paging(
null, '/api/device-mgt/v1.0/users', dataFilter, columns, fnCreatedRow, null
); );
});
$("#loading-content").hide();
} }
$(document).ready(function () { $(document).ready(function () {
loadUsers(); loadUsers();
$(".viewEnabledIcon").click(function () { $(".viewEnabledIcon").click(function () {
InitiateViewOption(); initiateViewOption();
}); });
if (!$("#can-invite").val()) { if (!$("#can-invite").val()) {
$("#invite-user-button").remove(); $("#invite-user-button").remove();
} }

@ -52,6 +52,11 @@
<span class="fw-stack"> <span class="fw-stack">
<i class="fw fw-ring fw-stack-2x"></i> <i class="fw fw-ring fw-stack-2x"></i>
<i class="fw fw-key fw-stack-1x"></i> <i class="fw fw-key fw-stack-1x"></i>
<span class="fw-stack fw-move-right fw-move-bottom">
<i class="fw fw-circle fw-stack-2x fw-stroke fw-inverse"></i>
<i class="fw fw-circle fw-stack-2x"></i>
<i class="fw fw-refresh fw-stack-1x fw-inverse"></i>
</span>
</span> </span>
<span class="hidden-xs hidden-on-grid-view">Reset</span> <span class="hidden-xs hidden-on-grid-view">Reset</span>
</a> </a>

@ -27,14 +27,14 @@
</li> </li>
<li> <li>
<a href="{{@app.context}}/users"> <a href="{{@app.context}}/users">
Users USERS
</a> </a>
</li> </li>
{{/zone}} {{/zone}}
{{#zone "navbarActions"}} {{#zone "navbarActions"}}
<li> <li>
<a href="{{@app.context}}/user/add" class="cu-btn"> <a href="{{@app.context}}/user/add">
<span class="icon fw-stack"> <span class="icon fw-stack">
<i class="fw fw-add fw-stack-1x"></i> <i class="fw fw-add fw-stack-1x"></i>
<i class="fw fw-ring fw-stack-2x"></i> <i class="fw fw-ring fw-stack-2x"></i>
@ -298,15 +298,13 @@
Enter new password Enter new password
<br><br> <br><br>
<div> <div>
<input type="password" class="form-control modal-input operationDataKeys" id="new-password" <input type="password" class="form-control modal-input operationDataKeys" id="new-password" data-key="message"/>
data-key="message"/>
</div> </div>
<br> <br>
Retype new password Retype new password
<br><br> <br><br>
<div> <div>
<input type="password" class="form-control modal-input operationDataKeys" <input type="password" class="form-control modal-input operationDataKeys" id="confirmed-password" data-key="message"/>
id="confirmed-password" data-key="message"/>
</div> </div>
<br> <br>
</h4> </h4>
@ -338,6 +336,7 @@
</div> </div>
</div> </div>
</div> </div>
{{/zone}} {{/zone}}
{{#zone "common-navigation"}} {{#zone "common-navigation"}}
<!--Later add the navigation menu from here--> <!--Later add the navigation menu from here-->

@ -26,13 +26,13 @@ function onRequest(context) {
return options.fn(this); return options.fn(this);
} }
}); });
var page = {}; var page = {};
var userModule = require("/app/modules/user.js")["userModule"]; var userModule = require("/app/modules/user.js")["userModule"];
var deviceMgtProps = require("/app/conf/devicemgt-props.js").config(); var deviceMgtProps = require("/app/conf/reader/main.js")["conf"];
page["adminUser"] = deviceMgtProps["adminUser"];
page["permissions"] = userModule.getUIPermissions(); page["permissions"] = userModule.getUIPermissions();
if (userModule.isAuthorized("/permission/admin/device-mgt/users/delete")) {
page["removePermitted"] = true;
}
if (userModule.isAuthorized("/permission/admin/device-mgt/users/remove")) { if (userModule.isAuthorized("/permission/admin/device-mgt/users/remove")) {
page["removePermitted"] = true; page["removePermitted"] = true;
@ -51,6 +51,5 @@ function onRequest(context) {
page["resetPasswordPermitted"] = true; page["resetPasswordPermitted"] = true;
} }
page["adminUser"] = deviceMgtProps.adminUser;
return page; return page;
} }

@ -19,9 +19,10 @@
{{~css "css/dataTables.bootstrap.css"}} {{~css "css/dataTables.bootstrap.css"}}
{{~css "css/dataTables.responsive.css"}} {{~css "css/dataTables.responsive.css"}}
{{/zone}} {{/zone}}
{{~#zone "bottomJs"}} {{#zone "bottomJs"}}
{{~js "js/jquery.dataTables.min.js"}} {{~js "js/jquery.dataTables.min.js"}}
{{~js "js/dataTables.bootstrap.js"}} {{~js "js/dataTables.bootstrap.js"}}
{{~js "js/dataTables.responsive.min.js"}} {{~js "js/dataTables.responsive.min.js"}}
{{~js "js/dataTables.extended.js"}} {{~js "js/dataTables.extended.js"}}
{{~js "js/dataTables.extended.serversidepaging.js"}}
{{/zone}} {{/zone}}

@ -0,0 +1,281 @@
/*
* 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.
*/
/*
* =========================================================
* data-tables extended function (Server-side Pagination)
* =========================================================
*/
/**
* @namespace $
* The $ is just a function.
* It is actually an alias for the function called jQuery.
* For ex: $(this) means jQuery(this) and S.fn.x means jQuery.fn.x
*/
$.fn.datatables_extended_serverside_paging = function (settings , url, dataFilter,
columns, fnCreatedRow, fnDrawCallback) {
var elem = $(this);
// EMM related function
if (initiateViewOption) {
$(".viewEnabledIcon").bind("click", initiateViewOption);
}
//--- End of EMM related codes
$(elem).DataTable(
$.extend({},{
serverSide: true,
bSortCellsTop: true,
ajax : {
url: "/emm/api/data-tables/invoker",
data : function (params) {
var filter = "";
var i;
for (i = 0; i < params.columns.length; i++) {
// console.log(i);
filter += "&" + params.columns[i].data + "=" + params.columns[i].search.value;
}
// console.log(filter);
params.offset = params.start;
params.limit = params.length;
params.filter = filter;
params.url = url;
},
dataFilter: dataFilter
},
columns: columns,
responsive: false,
autoWidth: false,
dom:'<"dataTablesTop"' +
'f' +
'<"dataTables_toolbar">' +
'>' +
'rt' +
'<"dataTablesBottom"' +
'lip' +
'>',
language: {
searchPlaceholder: 'Search by Role name',
search: ''
},
fnCreatedRow: fnCreatedRow,
"fnDrawCallback": fnDrawCallback,
initComplete: function () {
this.api().columns().every(function () {
var column = this;
var filterColumn = $('.filter-row th', elem);
/**
* Create & add select/text filters to each column
*/
if (filterColumn.eq(column.index()).hasClass('select-filter')) {
var select = $('<select class="form-control"><option value="">All</option></select>')
.appendTo(filterColumn.eq(column.index()).empty())
.on('change', function () {
var val = $.fn.dataTable.util.escapeRegex(
$(this).val()
);
column
//.search(val ? '^' + val + '$' : '', true, false)
.search(val ? val : '', true, false)
.draw();
if (filterColumn.eq(column.index()).hasClass('data-platform')) {
if (val == null || val == undefined || val == "") {
$("#operation-bar").hide();
$("#operation-guide").show();
} else {
$("#operation-guide").hide();
$("#operation-bar").show();
loadOperationBar(val);
}
}
});
$(column).each(function () {
if ($(column.nodes()).attr('data-search')) {
var titles = [];
column.nodes().unique().sort().each(function (d, j) {
var title = $(d).attr('data-display');
if ($.inArray(title, titles) < 0) {
titles.push(title);
if (title !== undefined) {
select.append('<option value="' + title + '">' + title + '</option>')
}
}
});
} else {
column.data().unique().sort().each(function (d, j) {
select.append('<option value="' + d + '">' + d + '</option>')
});
}
});
} else if (filterColumn.eq(column.index()).hasClass('text-filter')) {
var title = filterColumn.eq(column.index()).attr('data-for');
$(filterColumn.eq(column.index()).empty()).html('<input type="text" class="form-control" placeholder="Search ' + title + '" />');
filterColumn.eq(column.index()).find('input').on('keyup change', function () {
column.search($(this).val()).draw();
if ($('.dataTables_empty').length > 0) {
$('.bulk-action-row').addClass("hidden");
} else {
$('.bulk-action-row').removeClass("hidden");
}
});
}
});
/**
* search input default styles override
*/
var search_input = $(this).closest('.dataTables_wrapper').find('div[id$=_filter] input');
search_input.before('<i class="fw fw-search search-icon"></i>').removeClass('input-sm');
/**
* create sorting dropdown menu for list table advance operations
*/
var dropdownmenu = $('<ul class="dropdown-menu arrow arrow-top-right dark sort-list add-margin-top-2x"><li class="dropdown-header">Sort by</li></ul>');
$('.sort-row th', elem).each(function () {
if (!$(this).hasClass('no-sort')) {
dropdownmenu.append('<li><a href="#' + $(this).html() + '" data-column="' + $(this).index() + '">' + $(this).html() + '</a></li>');
}
});
/**
* append advance operations to list table toolbar
*/
$('.dataTable.list-table').closest('.dataTables_wrapper').find('.dataTablesTop .dataTables_toolbar').html('' +
'<ul class="nav nav-pills navbar-right remove-margin" role="tablist">' +
'<li><button data-click-event="toggle-selectable" class="btn btn-default btn-primary select-enable-btn">Select</li>' +
'<li><button data-click-event="toggle-selected" id="dt-select-all" class="btn btn-default btn-primary disabled">Select All</li>' +
'<li><button data-click-event="toggle-list-view" data-view="grid" class="btn btn-default"><i class="fw fw-grid"></i></button></li>' +
'<li><button data-click-event="toggle-list-view" data-view="list" class="btn btn-default"><i class="fw fw-list"></i></button></li>' +
'<li><button class="btn btn-default" data-toggle="dropdown"><i class="fw fw-sort"></i></button>' + dropdownmenu[0].outerHTML + '</li>' +
'</ul>'
);
/**
* sorting dropdown menu select function
*/
$('.dataTables_wrapper .sort-list li a').click(function () {
$(this).closest('li').siblings('li').find('a').removeClass('sorting_asc').removeClass('sorting_desc');
var thisTable = $(this).closest('.dataTables_wrapper').find('.dataTable').dataTable();
if (!($(this).hasClass('sorting_asc')) && !($(this).hasClass('sorting_desc'))) {
$(this).addClass('sorting_asc');
thisTable.fnSort([[$(this).attr('data-column'), 'asc']]);
}
else if ($(this).hasClass('sorting_asc')) {
$(this).switchClass('sorting_asc', 'sorting_desc');
thisTable.fnSort([[$(this).attr('data-column'), 'desc']]);
}
else if ($(this).hasClass('sorting_desc')) {
$(this).switchClass('sorting_desc', 'sorting_asc');
thisTable.fnSort([[$(this).attr('data-column'), 'asc']]);
}
});
var rowSelectedClass = 'DTTT_selected selected';
/**
* Enable/Disable selection on rows
*/
$('.dataTables_wrapper [data-click-event=toggle-selectable]').click(function () {
var button = this,
thisTable = $(this).closest('.dataTables_wrapper').find('.dataTable').dataTable();
if ($(button).html() == 'Select') {
thisTable.addClass("table-selectable");
$(button).addClass("active").html('Cancel');
$(button).parent().next().children("button").removeClass("disabled");
// EMM related code
$(".viewEnabledIcon").unbind("click");
//--- End of EMM related codes
} else if ($(button).html() == 'Cancel') {
thisTable.removeClass("table-selectable");
$(button).addClass("active").html('Select');
$(button).parent().next().children().addClass("disabled");
// EMM related function
$(".viewEnabledIcon").bind("click", initiateViewOption);
//--- End of EMM related codes
}
});
/**
* select/deselect all rows function
*/
$('.dataTables_wrapper [data-click-event=toggle-selected]').click(function () {
var button = this,
thisTable = $(this).closest('.dataTables_wrapper').find('.dataTable').dataTable();
if (!$(button).hasClass('disabled')) {
if ($(button).html() == 'Select All') {
thisTable.api().rows().every(function () {
$(this.node()).addClass(rowSelectedClass);
$(button).html('Deselect All');
});
}
else if ($(button).html() == 'Deselect All') {
thisTable.api().rows().every(function () {
$(this.node()).removeClass(rowSelectedClass);
$(button).html('Select All');
});
}
}
});
/**
* on row click select/deselect row function
*/
$('body').on('click', '[data-type=selectable]', function () {
var rowSelectedClass = 'DTTT_selected selected';
$(this).toggleClass(rowSelectedClass);
var button = this,
thisTable = $(this).closest('.dataTables_wrapper').find('.dataTable').dataTable();
thisTable.api().rows().every(function () {
if (!$(this.node()).hasClass(rowSelectedClass)) {
$(button).closest('.dataTables_wrapper').find('[data-click-event=toggle-selected]').html('Select All');
}
});
});
/**
* list table list/grid view toggle function
*/
var toggleButton = $('[data-click-event=toggle-list-view]');
toggleButton.click(function () {
if ($(this).attr('data-view') == 'grid') {
$(this).closest('.dataTables_wrapper').find('.dataTable').addClass('grid-view');
//$(this).closest('li').hide();
//$(this).closest('li').siblings().show();
}
else {
$(this).closest('.dataTables_wrapper').find('.dataTable').removeClass('grid-view');
//$(this).closest('li').hide();
//$(this).closest('li').siblings().show();
}
})
}
},settings)
);
};

@ -30,9 +30,9 @@ function onRequest (context) {
var userModule = require("/app/modules/user.js").userModule; var userModule = require("/app/modules/user.js").userModule;
var constants = require("/app/modules/constants.js"); var constants = require("/app/modules/constants.js");
var permissions = userModule.getUIPermissions(); var permissions = userModule.getUIPermissions();
var mdmProps = require('/app/conf/devicemgt-props.js').config(); var deviceMgtProps = require("/app/conf/reader/main.js")["conf"];
context.permissions = permissions; context.permissions = permissions;
context["enrollmentURL"] = mdmProps.enrollmentURL; context["enrollmentURL"] = deviceMgtProps.enrollmentURL;
return configs; return configs;
} }

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
* *
* WSO2 Inc. licenses this file to you under the Apache License, * WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except * Version 2.0 (the "License"); you may not use this file except
@ -10,63 +10,61 @@
* *
* Unless required by applicable law or agreed to in writing, * Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an * software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* KIND, either express or implied. See the License for the * either express or implied. See the License for the
* specific language governing permissions and limitations * specific language governing permissions and limitations
* under the License. * under the License.
*/ */
var invokerUtil = function () { var invokerUtil = function () {
var module = {}; var publicMethods = {};
var privateMethods = {};
var END_POINT = window.location.origin+"/devicemgt/api/invoker/execute/"; privateMethods.execute = function (requestMethod, requestURL, requestPayload, successCallback, errorCallback) {
var restAPIRequestDetails = {};
restAPIRequestDetails["requestMethod"] = requestMethod;
restAPIRequestDetails["requestURL"] = requestURL;
restAPIRequestDetails["requestPayload"] = JSON.stringify(requestPayload);
module.get = function (url, successCallback, errorCallback, contentType, acceptType) { var request = {
var payload = null; url: context + "/api/invoker/execute/",
execute("GET", url, payload, successCallback, errorCallback, contentType, acceptType);
};
module.post = function (url, payload, successCallback, errorCallback, contentType, acceptType) {
execute("POST", url, payload, successCallback, errorCallback, contentType, acceptType);
};
module.put = function (url, payload, successCallback, errorCallback, contentType, acceptType) {
execute("PUT", url, payload, successCallback, errorCallback, contentType, acceptType);
};
module.delete = function (url, successCallback, errorCallback, contentType, acceptType) {
var payload = null;
execute("DELETE", url, payload, successCallback, errorCallback, contentType, acceptType);
};
function execute (methoad, url, payload, successCallback, errorCallback, contentType, acceptType) {
if(contentType == undefined){
contentType = "application/json";
}
if(acceptType == undefined){
acceptType = "application/json";
}
var data = {
url: END_POINT,
type: "POST", type: "POST",
contentType: contentType, contentType: "application/json",
accept: acceptType, data: JSON.stringify(restAPIRequestDetails),
success: successCallback accept: "application/json",
}; success: successCallback,
var paramValue = {}; error: function (jqXHR) {
paramValue.actionMethod = methoad; if (jqXHR.status == 401) {
paramValue.actionUrl = url;
paramValue.actionPayload = payload;
if(contentType == "application/json"){
paramValue.actionPayload = JSON.stringify(payload);
}
data.data = JSON.stringify(paramValue);
$.ajax(data).fail(function (jqXHR) {
if (jqXHR.status == "401") {
console.log("Unauthorized access attempt!"); console.log("Unauthorized access attempt!");
$(modalPopupContent).html($('#error-msg').html()); $(modalPopupContent).html($("#error-msg").html());
showPopup(); showPopup();
} else { } else {
errorCallback(jqXHR); errorCallback(jqXHR);
} }
}); }
};
$.ajax(request);
};
publicMethods.get = function (requestURL, successCallback, errorCallback) {
var requestPayload = null;
privateMethods.execute("GET", requestURL, requestPayload, successCallback, errorCallback);
};
publicMethods.post = function (requestURL, requestPayload, successCallback, errorCallback) {
privateMethods.execute("POST", requestURL, requestPayload, successCallback, errorCallback);
}; };
return module;
publicMethods.put = function (requestURL, requestPayload, successCallback, errorCallback) {
privateMethods.execute("PUT", requestURL, requestPayload, successCallback, errorCallback);
};
publicMethods.delete = function (requestURL, successCallback, errorCallback) {
var requestPayload = null;
privateMethods.execute("DELETE", requestURL, requestPayload, successCallback, errorCallback);
};
return publicMethods;
}(); }();

@ -15,10 +15,7 @@
specific language governing permissions and limitations specific language governing permissions and limitations
under the License. under the License.
}} }}
{{#zone "bottomJs"}} {{#zone "content"}}
{{js "js/js.cookie.js"}}
{{js "js/invoker-lib.js"}}
<div id="error-msg" class="hide"> <div id="error-msg" class="hide">
<div class="content"> <div class="content">
<div class="row"> <div class="row">
@ -35,3 +32,10 @@
</div> </div>
</div> </div>
{{/zone}} {{/zone}}
{{#zone "bottomJs"}}
<script type="text/javascript">
var context = "{{@app.context}}"
</script>
{{js "js/js.cookie.js"}}
{{js "js/invoker-lib.js"}}
{{/zone}}

@ -24,7 +24,7 @@
*/ */
function onRequest(context) { function onRequest(context) {
var userModule = require("/app/modules/user.js")["userModule"]; var userModule = require("/app/modules/user.js")["userModule"];
var deviceMgtProps = require('/app/conf/devicemgt-props.js').config(); var deviceMgtProps = require("/app/conf/reader/main.js")["conf"];
var response = userModule.getRoles(); var response = userModule.getRoles();
if (response["status"] == "success") { if (response["status"] == "success") {
context["roles"] = response["content"]; context["roles"] = response["content"];

@ -24,7 +24,7 @@
*/ */
function onRequest(context) { function onRequest(context) {
var userModule = require("/app/modules/user.js")["userModule"]; var userModule = require("/app/modules/user.js")["userModule"];
var deviceMgtProps = require("/app/conf/devicemgt-props.js").config(); var deviceMgtProps = require("/app/conf/reader/main.js")["conf"];
var uri = request.getRequestURI(); var uri = request.getRequestURI();
var uriMatcher = new URIMatcher(String(uri)); var uriMatcher = new URIMatcher(String(uri));
var isMatched = uriMatcher.match("/{context}/role/edit/{rolename}"); var isMatched = uriMatcher.match("/{context}/role/edit/{rolename}");

@ -30,7 +30,7 @@ function onRequest(context) {
if (userModule.isAuthorized("/permission/admin/device-mgt/roles/remove")) { if (userModule.isAuthorized("/permission/admin/device-mgt/roles/remove")) {
context["removePermitted"] = true; context["removePermitted"] = true;
} }
var deviceMgtProps = require("/app/conf/devicemgt-props.js").config(); var deviceMgtProps = require("/app/conf/reader/main.js")["conf"];
context["appContext"] = deviceMgtProps.appContext; context["appContext"] = deviceMgtProps.appContext;
context["adminRole"] = deviceMgtProps.adminRole; context["adminRole"] = deviceMgtProps.adminRole;
return context; return context;

@ -16,38 +16,58 @@
under the License. under the License.
}} }}
{{#zone "navMenu-icon"}} {{#zone "navMenu-icon"}}
<span class="icon fw-stack"><i class="fw fw-tiles fw-stack-1x"></i></span> <span class="icon fw-stack">
<i class="fw fw-tiles fw-stack-1x toggle-icon-up"></i>
</span>
{{/zone}} {{/zone}}
{{~#zone "navMenu-items"}} {{#zone "navMenu-items"}}
{{#if permissions.VIEW_DASHBOARD}} {{#if permissions.VIEW_DASHBOARD}}
<li> <li>
<a href="{{@app.context}}"><i class="fw fw-dashboard"></i>Admin Dashboard</a> <a href="{{@app.context}}">
<i class="fw fw-dashboard"></i>
Admin Dashboard
</a>
</li> </li>
{{/if}} {{/if}}
{{#if permissions.LIST_OWN_DEVICES}} {{#if permissions.LIST_OWN_DEVICES}}
<li> <li>
<a href="{{@app.context}}/devices"><i class="fw fw-mobile"></i>Device Management</a> <a href="{{@app.context}}/devices">
<i class="fw fw-mobile"></i>
Device Management
</a>
</li> </li>
{{/if}} {{/if}}
{{#if permissions.LIST_GROUPS}} {{#if permissions.LIST_GROUPS}}
<li> <li>
<a href="{{@app.context}}/groups"><i class="fw fw-grouping"></i>Group Management</a> <a href="{{@app.context}}/groups">
<i class="fw fw-grouping"></i>
Group Management
</a>
</li> </li>
{{/if}} {{/if}}
{{#if permissions.ADD_USER}} {{#if permissions.ADD_USER}}
<li> <li>
<a href="{{@app.context}}/users"><i class="fw fw-user"></i>User Management</a> <a href="{{@app.context}}/users">
<i class="fw fw-user"></i>
User Management
</a>
</li> </li>
{{/if}} {{/if}}
{{#if permissions.ADD_ROLE}} {{#if permissions.ADD_ROLE}}
<li> <li>
<a href="{{@app.context}}/roles"><i class="fw fw-bookmark"></i>Role Management</a> <a href="{{@app.context}}/roles">
<i class="fw fw-bookmark"></i>
Role Management
</a>
</li> </li>
{{/if}} {{/if}}
{{#if permissions.ADD_POLICY}} {{#if permissions.ADD_POLICY}}
<li> <li>
<a href="{{@app.context}}/policies"><i class="fw fw-policy"></i>Policy Management</a> <a href="{{@app.context}}/policies">
<i class="fw fw-policy"></i>
Policy Management
</a>
</li> </li>
{{/if}} {{/if}}
{{#if permissions.TENANT_CONFIGURATION}} {{#if permissions.TENANT_CONFIGURATION}}

@ -1,6 +1,6 @@
{ {
"displayName": "Carbon Device Management App", "displayName": "Carbon Device Management App",
"logLevel": "warn", "logLevel": "info",
"initScripts": ["/app/modules/init.js"], "initScripts": ["/app/modules/init.js"],
"urlMappings": [ "urlMappings": [
{ {
@ -50,6 +50,10 @@
{ {
"url": "/*", "url": "/*",
"path": "/lib/pages.jag" "path": "/lib/pages.jag"
},
{
"url": "/api/data-tables/invoker",
"path": "/api/data-tables-invoker-api.jag"
} }
] ]
} }

@ -29,7 +29,7 @@ public class CertificateAuthenticator implements WebappAuthenticator {
private static final String CERTIFICATE_AUTHENTICATOR = "CertificateAuth"; private static final String CERTIFICATE_AUTHENTICATOR = "CertificateAuth";
private static final String MUTUAL_AUTH_HEADER = "mutual-auth-header"; private static final String MUTUAL_AUTH_HEADER = "mutual-auth-header";
private static final String PROXY_MUTUAL_AUTH_HEADER = "proxy-mutual-auth-header"; private static final String PROXY_MUTUAL_AUTH_HEADER = "proxy-mutual-auth-header";
private static final String CERTIFICATE_VERIFICATION_HEADER = "certificate-verification-header"; private static final String CERTIFICATE_VERIFICATION_HEADER = "Mdm-Signature";
private static final String CLIENT_CERTIFICATE_ATTRIBUTE = "javax.servlet.request.X509Certificate"; private static final String CLIENT_CERTIFICATE_ATTRIBUTE = "javax.servlet.request.X509Certificate";
@Override @Override
@ -55,7 +55,6 @@ public class CertificateAuthenticator implements WebappAuthenticator {
authenticationInfo.setStatus(Status.CONTINUE); authenticationInfo.setStatus(Status.CONTINUE);
} }
String certVerificationHeader = request.getContext().findParameter(CERTIFICATE_VERIFICATION_HEADER);
try { try {
// When there is a load balancer terminating mutual SSL, it should pass this header along and // When there is a load balancer terminating mutual SSL, it should pass this header along and
// as the value of this header, the client certificate subject dn should be passed. // as the value of this header, the client certificate subject dn should be passed.
@ -78,7 +77,7 @@ public class CertificateAuthenticator implements WebappAuthenticator {
} }
} else if (request.getHeader(CERTIFICATE_VERIFICATION_HEADER) != null) { } else if (request.getHeader(CERTIFICATE_VERIFICATION_HEADER) != null) {
String certHeader = request.getHeader(certVerificationHeader); String certHeader = request.getHeader(CERTIFICATE_VERIFICATION_HEADER);
if (certHeader != null && if (certHeader != null &&
AuthenticatorFrameworkDataHolder.getInstance().getCertificateManagementService(). AuthenticatorFrameworkDataHolder.getInstance().getCertificateManagementService().
verifySignature(certHeader)) { verifySignature(certHeader)) {

@ -0,0 +1,8 @@
CREATE TABLE IF NOT EXISTS DM_DEVICE_CERTIFICATE (
ID INTEGER auto_increment NOT NULL,
SERIAL_NUMBER VARCHAR(500) DEFAULT NULL,
CERTIFICATE BLOB DEFAULT NULL,
TENANT_ID INTEGER DEFAULT 0,
USERNAME VARCHAR(500) DEFAULT NULL,
PRIMARY KEY (ID)
);

@ -0,0 +1,8 @@
CREATE TABLE DM_DEVICE_CERTIFICATE (
ID INTEGER IDENTITY NOT NULL,
SERIAL_NUMBER VARCHAR(500) DEFAULT NULL,
CERTIFICATE VARBINARY(max) DEFAULT NULL,
TENANT_ID INTEGER DEFAULT 0,
USERNAME VARCHAR(500) DEFAULT NULL,
PRIMARY KEY (ID)
);

@ -0,0 +1,8 @@
CREATE TABLE IF NOT EXISTS DM_DEVICE_CERTIFICATE (
ID INTEGER auto_increment NOT NULL,
SERIAL_NUMBER VARCHAR(500) DEFAULT NULL,
CERTIFICATE BLOB DEFAULT NULL,
TENANT_ID INTEGER DEFAULT 0,
USERNAME VARCHAR(500) DEFAULT NULL,
PRIMARY KEY (ID)
)ENGINE = InnoDB;

@ -0,0 +1,8 @@
CREATE TABLE DM_DEVICE_CERTIFICATE (
ID NUMBER(10) NOT NULL,
SERIAL_NUMBER VARCHAR2(500) DEFAULT NULL,
CERTIFICATE BLOB DEFAULT NULL,
TENANT_ID NUMBER(10) DEFAULT 0,
USERNAME VARCHAR2(500) DEFAULT NULL,
PRIMARY KEY (ID)
)

@ -0,0 +1,7 @@
CREATE TABLE IF NOT EXISTS DM_DEVICE_CERTIFICATE (
ID BIGSERIAL NOT NULL PRIMARY KEY,
SERIAL_NUMBER VARCHAR(500) DEFAULT NULL,
CERTIFICATE BYTEA DEFAULT NULL,
TENANT_ID INTEGER DEFAULT 0,
USERNAME VARCHAR(500) DEFAULT NULL
);

@ -1,3 +1,4 @@
instructions.configure = \ instructions.configure = \
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.certificate.mgt.server_${feature.version}/conf/wso2certs.jks,target:${installFolder}/../../resources/security/wso2certs.jks,overwrite:true);\ org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.certificate.mgt.server_${feature.version}/conf/wso2certs.jks,target:${installFolder}/../../resources/security/wso2certs.jks,overwrite:true);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.certificate.mgt.server_${feature.version}/conf/certificate-config.xml,target:${installFolder}/../../conf/certificate-config.xml,overwrite:true);\ org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.certificate.mgt.server_${feature.version}/conf/certificate-config.xml,target:${installFolder}/../../conf/certificate-config.xml,overwrite:true);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.certificate.mgt.server_${feature.version}/dbscripts/cdm/,target:${installFolder}/../../../dbscripts/cdm,overwrite:true);\

@ -17,15 +17,6 @@ CREATE TABLE IF NOT EXISTS DM_GROUP (
PRIMARY KEY (ID) PRIMARY KEY (ID)
); );
CREATE TABLE IF NOT EXISTS DM_DEVICE_CERTIFICATE (
ID INTEGER auto_increment NOT NULL,
SERIAL_NUMBER VARCHAR(500) DEFAULT NULL,
CERTIFICATE BLOB DEFAULT NULL,
TENANT_ID INTEGER DEFAULT 0,
USERNAME VARCHAR(500) DEFAULT NULL,
PRIMARY KEY (ID)
);
CREATE TABLE IF NOT EXISTS DM_DEVICE ( CREATE TABLE IF NOT EXISTS DM_DEVICE (
ID INTEGER auto_increment NOT NULL, ID INTEGER auto_increment NOT NULL,
DESCRIPTION TEXT DEFAULT NULL, DESCRIPTION TEXT DEFAULT NULL,

@ -17,15 +17,6 @@ CREATE TABLE DM_GROUP (
PRIMARY KEY (ID) PRIMARY KEY (ID)
); );
CREATE TABLE DM_DEVICE_CERTIFICATE (
ID INTEGER IDENTITY NOT NULL,
SERIAL_NUMBER VARCHAR(500) DEFAULT NULL,
CERTIFICATE VARBINARY(max) DEFAULT NULL,
TENANT_ID INTEGER DEFAULT 0,
USERNAME VARCHAR(500) DEFAULT NULL,
PRIMARY KEY (ID)
);
CREATE TABLE DM_DEVICE ( CREATE TABLE DM_DEVICE (
ID INTEGER identity NOT NULL, ID INTEGER identity NOT NULL,
DESCRIPTION VARCHAR(max) DEFAULT NULL, DESCRIPTION VARCHAR(max) DEFAULT NULL,

@ -6,15 +6,6 @@ CREATE TABLE IF NOT EXISTS DM_DEVICE_TYPE (
PRIMARY KEY (ID) PRIMARY KEY (ID)
)ENGINE = InnoDB; )ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS DM_DEVICE_CERTIFICATE (
ID INTEGER auto_increment NOT NULL,
SERIAL_NUMBER VARCHAR(500) DEFAULT NULL,
CERTIFICATE BLOB DEFAULT NULL,
TENANT_ID INTEGER DEFAULT 0,
USERNAME VARCHAR(500) DEFAULT NULL,
PRIMARY KEY (ID)
)ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS DM_DEVICE ( CREATE TABLE IF NOT EXISTS DM_DEVICE (
ID INTEGER AUTO_INCREMENT NOT NULL, ID INTEGER AUTO_INCREMENT NOT NULL,
DESCRIPTION TEXT DEFAULT NULL, DESCRIPTION TEXT DEFAULT NULL,

@ -44,16 +44,6 @@ WHEN (NEW.ID IS NULL)
SELECT DM_GROUP_seq.NEXTVAL INTO :NEW.ID FROM DUAL; SELECT DM_GROUP_seq.NEXTVAL INTO :NEW.ID FROM DUAL;
END; END;
/ /
CREATE TABLE DM_DEVICE_CERTIFICATE (
ID NUMBER(10) NOT NULL,
SERIAL_NUMBER VARCHAR2(500) DEFAULT NULL,
CERTIFICATE BLOB DEFAULT NULL,
TENANT_ID NUMBER(10) DEFAULT 0,
USERNAME VARCHAR2(500) DEFAULT NULL,
PRIMARY KEY (ID)
)
/
-- Generate ID using sequence and trigger -- Generate ID using sequence and trigger
CREATE SEQUENCE DM_DEVICE_CERTIFICATE_seq START WITH 1 INCREMENT BY 1 NOCACHE CREATE SEQUENCE DM_DEVICE_CERTIFICATE_seq START WITH 1 INCREMENT BY 1 NOCACHE
/ /

@ -5,14 +5,6 @@ CREATE TABLE IF NOT EXISTS DM_DEVICE_TYPE (
SHARED_WITH_ALL_TENANTS BOOLEAN NOT NULL DEFAULT FALSE SHARED_WITH_ALL_TENANTS BOOLEAN NOT NULL DEFAULT FALSE
); );
CREATE TABLE IF NOT EXISTS DM_DEVICE_CERTIFICATE (
ID BIGSERIAL NOT NULL PRIMARY KEY,
SERIAL_NUMBER VARCHAR(500) DEFAULT NULL,
CERTIFICATE BYTEA DEFAULT NULL,
TENANT_ID INTEGER DEFAULT 0,
USERNAME VARCHAR(500) DEFAULT NULL
);
CREATE TABLE IF NOT EXISTS DM_DEVICE ( CREATE TABLE IF NOT EXISTS DM_DEVICE (
ID BIGSERIAL NOT NULL PRIMARY KEY, ID BIGSERIAL NOT NULL PRIMARY KEY,
DESCRIPTION TEXT DEFAULT NULL, DESCRIPTION TEXT DEFAULT NULL,

Loading…
Cancel
Save