forked from community/product-iots
parent
59b86f9d50
commit
0779e358ed
@ -0,0 +1,94 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
~ Copyright (c) 2017, 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.
|
||||
-->
|
||||
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<groupId>org.wso2.iot</groupId>
|
||||
<artifactId>wso2iot-core-scripts</artifactId>
|
||||
<version>3.1.0-SNAPSHOT</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>org.wso2.iot</groupId>
|
||||
<artifactId>mobile-qsg</artifactId>
|
||||
<version>3.1.0-SNAPSHOT</version>
|
||||
<name>WSO2 IoTs QSG Script</name>
|
||||
<description>This includes the tools for IoTs Quick Start Guide</description>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-assembly-plugin</artifactId>
|
||||
<configuration>
|
||||
<descriptorRefs>
|
||||
<descriptorRef>jar-with-dependencies</descriptorRef>
|
||||
</descriptorRefs>
|
||||
<finalName>${project.artifactId}</finalName>
|
||||
<appendAssemblyId>false</appendAssemblyId>
|
||||
<archive>
|
||||
<manifest>
|
||||
<addClasspath>true</addClasspath>
|
||||
<classpathPrefix>lib/</classpathPrefix>
|
||||
<mainClass>org.wso2.mdm.qsg.QSGExecutor</mainClass>
|
||||
</manifest>
|
||||
</archive>
|
||||
</configuration>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>single</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
<finalName>${project.artifactId}</finalName>
|
||||
</build>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.apache.httpcomponents</groupId>
|
||||
<artifactId>httpclient</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.httpcomponents.wso2</groupId>
|
||||
<artifactId>httpcore</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.googlecode.json-simple.wso2</groupId>
|
||||
<artifactId>json-simple</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.httpcomponents</groupId>
|
||||
<artifactId>httpmime</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-codec</groupId>
|
||||
<artifactId>commons-codec</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
</project>
|
@ -0,0 +1,189 @@
|
||||
/*
|
||||
* Copyright (c) 2017, 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.
|
||||
*/
|
||||
|
||||
package org.wso2.mdm.qsg;
|
||||
|
||||
import org.json.simple.JSONArray;
|
||||
import org.json.simple.JSONObject;
|
||||
import org.json.simple.parser.JSONParser;
|
||||
import org.json.simple.parser.ParseException;
|
||||
import org.wso2.mdm.qsg.dto.EMMQSGConfig;
|
||||
import org.wso2.mdm.qsg.dto.HTTPResponse;
|
||||
import org.wso2.mdm.qsg.dto.MobileApplication;
|
||||
import org.wso2.mdm.qsg.utils.Constants;
|
||||
import org.wso2.mdm.qsg.utils.HTTPInvoker;
|
||||
import org.wso2.mdm.qsg.utils.QSGUtils;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.HashMap;
|
||||
|
||||
/**
|
||||
* This class holds the app-mgt related operations.
|
||||
*/
|
||||
public class AppOperations {
|
||||
|
||||
public static MobileApplication uploadApplication(String platform, String appName, String appContentType) {
|
||||
String appUploadEndpoint =
|
||||
EMMQSGConfig.getInstance().getEmmHost() + "/api/appm/publisher/v1.1/apps/mobile/binaries";
|
||||
String filePath = "apps" + File.separator + platform + File.separator + appName;
|
||||
HTTPResponse
|
||||
httpResponse = HTTPInvoker.uploadFile(appUploadEndpoint, filePath, appContentType);
|
||||
|
||||
if (Constants.HTTPStatus.OK == httpResponse.getResponseCode()) {
|
||||
JSONObject appMeta = null;
|
||||
MobileApplication application = new MobileApplication();
|
||||
try {
|
||||
appMeta = (JSONObject) new JSONParser().parse(httpResponse.getResponse());
|
||||
application.setPackageId((String) appMeta.get("package"));
|
||||
application.setAppId(QSGUtils.getResourceId((String) appMeta.get("path")));
|
||||
application.setVersion((String) appMeta.get("version"));
|
||||
application.setPlatform(platform);
|
||||
} catch (ParseException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return application;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static MobileApplication getPublicApplication(String packageId, String version, String platform) {
|
||||
MobileApplication application = new MobileApplication();
|
||||
application.setVersion(version);
|
||||
application.setPackageId(packageId);
|
||||
application.setPlatform(platform);
|
||||
return application;
|
||||
}
|
||||
|
||||
private static String uploadAsset(String path) {
|
||||
String resUploadEndpoint =
|
||||
EMMQSGConfig.getInstance().getEmmHost() + "/api/appm/publisher/v1.1/apps/static-contents?appType=mobileapp";
|
||||
HTTPResponse httpResponse = HTTPInvoker.uploadFile(resUploadEndpoint, path, "image/jpeg");
|
||||
if (Constants.HTTPStatus.OK == httpResponse.getResponseCode()) {
|
||||
JSONObject resp = null;
|
||||
try {
|
||||
resp = (JSONObject) new JSONParser().parse(httpResponse.getResponse());
|
||||
return (String) resp.get("id");
|
||||
} catch (ParseException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static MobileApplication uploadAssets(String platform, MobileApplication application) {
|
||||
String assetDir = "apps" + File.separator + platform + File.separator + "images";
|
||||
//Upload the icon file
|
||||
String imgFile = assetDir + File.separator + "icon.jpg";
|
||||
String uploadPath = uploadAsset(imgFile);
|
||||
if (uploadPath != null && !uploadPath.isEmpty()) {
|
||||
application.setIcon(uploadPath);
|
||||
} else {
|
||||
System.out.println("Unable to upload the app icon file.");
|
||||
return null;
|
||||
}
|
||||
|
||||
//Upload the banner file
|
||||
imgFile = assetDir + File.separator + "banner.jpg";
|
||||
uploadPath = uploadAsset(imgFile);
|
||||
if (uploadPath != null && !uploadPath.isEmpty()) {
|
||||
application.setBanner(uploadPath);
|
||||
} else {
|
||||
System.out.println("Unable to upload the app banner file.");
|
||||
return null;
|
||||
}
|
||||
|
||||
//Upload the screenshot1 file
|
||||
imgFile = assetDir + File.separator + "screen1.jpg";
|
||||
uploadPath = uploadAsset(imgFile);
|
||||
if (uploadPath != null && !uploadPath.isEmpty()) {
|
||||
application.setScreenshot1(uploadPath);
|
||||
} else {
|
||||
System.out.println("Unable to upload the app screenshot1 file.");
|
||||
return null;
|
||||
}
|
||||
|
||||
//Upload the screenshot2 file
|
||||
imgFile = assetDir + File.separator + "screen2.jpg";
|
||||
uploadPath = uploadAsset(imgFile);
|
||||
if (uploadPath != null && !uploadPath.isEmpty()) {
|
||||
application.setScreenshot2(uploadPath);
|
||||
} else {
|
||||
System.out.println("Unable to upload the app screenshot2 file.");
|
||||
return null;
|
||||
}
|
||||
|
||||
//Upload the screenshot3 file
|
||||
imgFile = assetDir + File.separator + "screen3.jpg";
|
||||
uploadPath = uploadAsset(imgFile);
|
||||
if (uploadPath != null && !uploadPath.isEmpty()) {
|
||||
application.setScreenshot3(uploadPath);
|
||||
} else {
|
||||
System.out.println("Unable to upload the app screenshot3 file.");
|
||||
return null;
|
||||
}
|
||||
return application;
|
||||
}
|
||||
|
||||
public static boolean addApplication(String name, MobileApplication mblApp, boolean isEnterpriseApp) {
|
||||
HashMap<String, String> headers = new HashMap<String, String>();
|
||||
String appEndpoint = EMMQSGConfig.getInstance().getEmmHost() + "/api/appm/publisher/v1.1/apps/mobileapp";
|
||||
//Set the application payload
|
||||
JSONObject application = new JSONObject();
|
||||
application.put("name", name);
|
||||
application.put("description", "Sample application");
|
||||
application.put("type", "enterprise");
|
||||
//Set appMeta data
|
||||
JSONObject appMeta = new JSONObject();
|
||||
appMeta.put("package", mblApp.getPackageId());
|
||||
appMeta.put("version", mblApp.getVersion());
|
||||
if (isEnterpriseApp) {
|
||||
application.put("marketType", "enterprise");
|
||||
appMeta.put("path", mblApp.getAppId());
|
||||
} else {
|
||||
application.put("marketType", "public");
|
||||
}
|
||||
application.put("provider", "admin");
|
||||
application.put("displayName", name);
|
||||
application.put("category", "Business");
|
||||
application.put("icon", mblApp.getIcon());
|
||||
application.put("version", mblApp.getVersion());
|
||||
application.put("banner", mblApp.getBanner());
|
||||
application.put("platform", mblApp.getPlatform());
|
||||
application.put("appType", mblApp.getPlatform());
|
||||
//application.put("appUrL", mblApp.getAppId());
|
||||
application.put("mediaType", "application/vnd.wso2-mobileapp+xml");
|
||||
|
||||
//Set screenshots
|
||||
JSONArray screenshots = new JSONArray();
|
||||
screenshots.add(mblApp.getScreenshot1());
|
||||
screenshots.add(mblApp.getScreenshot2());
|
||||
screenshots.add(mblApp.getScreenshot3());
|
||||
application.put("appmeta", appMeta);
|
||||
application.put("screenshots", screenshots);
|
||||
|
||||
//Set the headers
|
||||
headers.put(Constants.Header.CONTENT_TYPE, Constants.ContentType.APPLICATION_JSON);
|
||||
HTTPResponse
|
||||
httpResponse =
|
||||
HTTPInvoker.sendHTTPPostWithOAuthSecurity(appEndpoint, application.toJSONString(), headers);
|
||||
if (Constants.HTTPStatus.OK == httpResponse.getResponseCode()) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
@ -0,0 +1,77 @@
|
||||
/*
|
||||
* Copyright (c) 2017, 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.
|
||||
*/
|
||||
|
||||
package org.wso2.mdm.qsg;
|
||||
|
||||
import org.json.simple.JSONArray;
|
||||
import org.json.simple.JSONObject;
|
||||
import org.wso2.mdm.qsg.dto.EMMQSGConfig;
|
||||
import org.wso2.mdm.qsg.dto.HTTPResponse;
|
||||
import org.wso2.mdm.qsg.utils.Constants;
|
||||
import org.wso2.mdm.qsg.utils.HTTPInvoker;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
/**
|
||||
* This class holds the methods to create policies.
|
||||
*/
|
||||
public class PolicyOperations {
|
||||
|
||||
public static boolean createPasscodePolicy(String policyName, String deviceType) {
|
||||
HashMap<String, String> headers = new HashMap<String, String>();
|
||||
String policyEndpoint = EMMQSGConfig.getInstance().getEmmHost() + "/api/device-mgt/v1.0/policies";
|
||||
//Set the policy payload
|
||||
JSONObject policyData = new JSONObject();
|
||||
policyData.put("policyName", policyName);
|
||||
policyData.put("description", "Passcode Policy");
|
||||
policyData.put("compliance", "enforce");
|
||||
policyData.put("ownershipType", "ANY");
|
||||
policyData.put("active", false);
|
||||
JSONObject profile = new JSONObject();
|
||||
profile.put("profileName", "passcode");
|
||||
profile.put("deviceType", deviceType);
|
||||
JSONArray featureList = new JSONArray();
|
||||
JSONObject feature = new JSONObject();
|
||||
feature.put("featureCode", "PASSCODE_POLICY");
|
||||
feature.put("deviceType", deviceType);
|
||||
JSONObject featureContent = new JSONObject();
|
||||
featureContent.put("allowSimple", false);
|
||||
featureContent.put("requireAlphanumeric", true);
|
||||
featureContent.put("minLength", "5");
|
||||
featureContent.put("minComplexChars", "2");
|
||||
featureContent.put("maxPINAgeInDays", 7);
|
||||
featureContent.put("pinHistory", 7);
|
||||
featureContent.put("maxFailedAttempts", null);
|
||||
feature.put("content", featureContent);
|
||||
featureList.add(feature);
|
||||
profile.put("profileFeaturesList", featureList);
|
||||
JSONArray roles = new JSONArray();
|
||||
roles.add(Constants.EMM_USER_ROLE);
|
||||
policyData.put("profile", profile);
|
||||
policyData.put("roles", roles);
|
||||
//Set the headers
|
||||
headers.put(Constants.Header.CONTENT_TYPE, Constants.ContentType.APPLICATION_JSON);
|
||||
HTTPResponse
|
||||
httpResponse = HTTPInvoker
|
||||
.sendHTTPPostWithOAuthSecurity(policyEndpoint, policyData.toJSONString(), headers);
|
||||
if (httpResponse.getResponseCode() == Constants.HTTPStatus.CREATED) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
@ -0,0 +1,137 @@
|
||||
/*
|
||||
* Copyright (c) 2017, 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.
|
||||
*/
|
||||
|
||||
package org.wso2.mdm.qsg;
|
||||
|
||||
import org.wso2.mdm.qsg.dto.MobileApplication;
|
||||
import org.wso2.mdm.qsg.utils.Constants;
|
||||
import org.wso2.mdm.qsg.utils.HTTPInvoker;
|
||||
import org.wso2.mdm.qsg.utils.QSGUtils;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* Main class of EMM-QSG module. This class will populate each sample scenario.
|
||||
*/
|
||||
public class QSGExecutor {
|
||||
|
||||
public static void main(String[] args) {
|
||||
boolean status = false;
|
||||
Scanner scanner = new Scanner(System.in);
|
||||
// prompt for the user's name
|
||||
System.out.print("Enter your email address and press enter : ");
|
||||
String email = scanner.next();
|
||||
if (!QSGUtils.isValidEmailAddress(email)) {
|
||||
do {
|
||||
System.out.print("Please enter a valid email address and press enter : ");
|
||||
email = scanner.next();
|
||||
} while (!QSGUtils.isValidEmailAddress(email));
|
||||
}
|
||||
//Setup the OAuth token
|
||||
String token = QSGUtils.getOAuthToken();
|
||||
if (token == null) {
|
||||
System.out.println("Unable to get the OAuth token. Please check the config.properties file.");
|
||||
System.exit(0);
|
||||
}
|
||||
HTTPInvoker.oAuthToken = token;
|
||||
//Creates the admin user
|
||||
status = UserOperations.createUser("tom", "tom@mobx.com", true);
|
||||
if (!status) {
|
||||
System.out.println("Unable to create the admin user. Please check the config.properties file.");
|
||||
System.exit(0);
|
||||
}
|
||||
status = UserOperations.changePassword("tom", "tomemm");
|
||||
if (!status) {
|
||||
System.out.println("Unable to change the password of the admin user. Terminating the EMM QSG now.");
|
||||
System.exit(0);
|
||||
}
|
||||
//Creates the emm user
|
||||
status = UserOperations.createUser("kim", email, false);
|
||||
if (!status) {
|
||||
System.out.println("Unable to create the emm user Kim. Terminating the EMM QSG now.");
|
||||
System.exit(0);
|
||||
}
|
||||
status = UserOperations.changePassword("kim", "kimemm");
|
||||
if (!status) {
|
||||
System.out.println("Unable to change the password of the emm user. Terminating the EMM QSG now.");
|
||||
System.exit(0);
|
||||
}
|
||||
//Creates the emm-user role
|
||||
status = UserOperations.createRole(Constants.EMM_USER_ROLE, new String[] { "kim" });
|
||||
if (!status) {
|
||||
System.out.println("Unable to create the emm user role. Terminating the EMM QSG now.");
|
||||
System.exit(0);
|
||||
}
|
||||
//Add the android policy
|
||||
status = PolicyOperations.createPasscodePolicy("android-passcode-policy1", Constants.DeviceType.ANDROID);
|
||||
if (!status) {
|
||||
System.out.println("Unable to create the android passcode policy. Terminating the EMM QSG now.");
|
||||
System.exit(0);
|
||||
}
|
||||
//Add the windows policy
|
||||
status = PolicyOperations.createPasscodePolicy("windows-passcode-policy1", Constants.DeviceType.WINDOWS);
|
||||
if (!status) {
|
||||
System.out.println("Unable to create the windows passcode policy. Terminating the EMM QSG now.");
|
||||
System.exit(0);
|
||||
}
|
||||
//Add the iOS policy
|
||||
status = PolicyOperations.createPasscodePolicy("ios-passcode-policy1", Constants.DeviceType.IOS);
|
||||
if (!status) {
|
||||
System.out.println("Unable to create the ios passcode policy. Terminating the EMM QSG now.");
|
||||
System.exit(0);
|
||||
}
|
||||
//Upload the android application
|
||||
MobileApplication application = AppOperations.uploadApplication(Constants.DeviceType.ANDROID, "catalog.apk",
|
||||
"application/vnd.android.package-archive");
|
||||
if (application == null) {
|
||||
System.out.println("Unable to upload the sample android application. Terminating the EMM QSG now.");
|
||||
System.exit(0);
|
||||
}
|
||||
//Upload the assets
|
||||
application = AppOperations.uploadAssets(Constants.DeviceType.ANDROID, application);
|
||||
if (application == null) {
|
||||
System.out.println(
|
||||
"Unable to upload the assets for sample android application. Terminating the EMM QSG now.");
|
||||
System.exit(0);
|
||||
}
|
||||
//Create application entry in publisher
|
||||
status = AppOperations.addApplication("Catalog", application, true);
|
||||
if (!status) {
|
||||
System.out.println("Unable to create the mobile application. Terminating the EMM QSG now.");
|
||||
System.exit(0);
|
||||
}
|
||||
|
||||
//Upload the ios application
|
||||
MobileApplication iOSApplication = AppOperations.uploadApplication(Constants.DeviceType.IOS, "PNDemo.ipa",
|
||||
"application/octet-stream");
|
||||
iOSApplication.setVersion("1.0.0");
|
||||
//Upload the assets
|
||||
iOSApplication = AppOperations.uploadAssets(Constants.DeviceType.IOS, iOSApplication);
|
||||
if (iOSApplication == null) {
|
||||
System.out.println(
|
||||
"Unable to upload the assets for sample iOS application. Terminating the EMM QSG now.");
|
||||
System.exit(0);
|
||||
}
|
||||
//Create application entry in publisher
|
||||
status = AppOperations.addApplication("WSO2Con", iOSApplication, true);
|
||||
if (!status) {
|
||||
System.out.println("Unable to create the mobile application. Terminating the EMM QSG now.");
|
||||
System.exit(0);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,185 @@
|
||||
/*
|
||||
* Copyright (c) 2017, 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.
|
||||
*/
|
||||
|
||||
package org.wso2.mdm.qsg;
|
||||
|
||||
import org.json.simple.JSONArray;
|
||||
import org.json.simple.JSONObject;
|
||||
import org.wso2.mdm.qsg.dto.EMMQSGConfig;
|
||||
import org.wso2.mdm.qsg.dto.HTTPResponse;
|
||||
import org.wso2.mdm.qsg.utils.Constants;
|
||||
import org.wso2.mdm.qsg.utils.HTTPInvoker;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
/**
|
||||
* This class holds the user-mgt related operations like user-create, role-create and change-password.
|
||||
*/
|
||||
public class UserOperations {
|
||||
|
||||
public static boolean createUser(String username, String email, boolean isAdmin) {
|
||||
HashMap<String, String> headers = new HashMap<String, String>();
|
||||
String userEndpoint = EMMQSGConfig.getInstance().getEmmHost() + "/api/device-mgt/v1.0/users";
|
||||
//Set the user payload
|
||||
JSONObject userData = new JSONObject();
|
||||
userData.put("username", username);
|
||||
userData.put("emailAddress", email);
|
||||
JSONArray roles = new JSONArray();
|
||||
if (isAdmin) {
|
||||
roles.add("admin");
|
||||
userData.put("firstname", "Tom");
|
||||
userData.put("lastname", "Admin");
|
||||
} else {
|
||||
userData.put("password", "kimemmtrial");
|
||||
userData.put("firstname", "Kim");
|
||||
userData.put("lastname", "User");
|
||||
}
|
||||
userData.put("roles", roles);
|
||||
//Set the headers
|
||||
headers.put(Constants.Header.CONTENT_TYPE, Constants.ContentType.APPLICATION_JSON);
|
||||
HTTPResponse httpResponse = HTTPInvoker
|
||||
.sendHTTPPostWithOAuthSecurity(userEndpoint, userData.toJSONString(), headers);
|
||||
if (httpResponse.getResponseCode() == Constants.HTTPStatus.CREATED) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static boolean changePassword(String username, String pwd) {
|
||||
HashMap<String, String> headers = new HashMap<String, String>();
|
||||
String pwdEndpoint =
|
||||
EMMQSGConfig.getInstance().getEmmHost() + "/api/device-mgt/v1.0/admin/users/" + username + "/credentials";
|
||||
//Set the password payload
|
||||
JSONObject pwdData = new JSONObject();
|
||||
pwdData.put("newPassword", pwd);
|
||||
|
||||
//Set the headers
|
||||
headers.put(Constants.Header.CONTENT_TYPE, Constants.ContentType.APPLICATION_JSON);
|
||||
HTTPResponse httpResponse =
|
||||
HTTPInvoker.sendHTTPPostWithOAuthSecurity(pwdEndpoint, pwdData.toJSONString(), headers);
|
||||
if (httpResponse.getResponseCode() == Constants.HTTPStatus.OK) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private static String[] getUserPermissions() {
|
||||
String permissions = "/permission/admin/device-mgt/certificates/manage," +
|
||||
"/permission/admin/device-mgt/certificates/view," +
|
||||
"/permission/admin/device-mgt/configurations/view," +
|
||||
"/permission/admin/device-mgt/devices/enroll/android," +
|
||||
"/permission/admin/device-mgt/devices/enroll/ios," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/view," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/android/applications," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/android/blacklist-app," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/android/camera," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/android/change-lock-code," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/android/clear-password," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/android/encrypt," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/android/enterprise-wipe," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/android/info," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/android/install-app," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/android/location," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/android/lock," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/android/logcat," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/android/mute," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/android/password-policy," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/android/ring," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/android/reboot," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/android/send-notification," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/android/uninstall-app," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/android/update-app," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/android/unlock," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/android/upgrade," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/android/vpn," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/android/webclip," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/android/wifi," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/android/wipe," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/ios," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/ios/airplay," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/ios/apn," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/ios/app-list," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/ios/app-lock," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/ios/app-to-per-app-vpn," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/ios/cal-subscription," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/ios/caldav," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/ios/cellular," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/ios/clear-passcode," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/ios/device-info," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/ios/email," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/ios/enterprise-app," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/ios/enterprise-wipe," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/ios/get-restrictions," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/ios/ldap," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/ios/location," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/ios/lock," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/ios/notification," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/ios/passcode-policy," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/ios/per-app-vpn," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/ios/profile-list," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/ios/remove-app," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/ios/remove-profile," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/ios/restriction," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/ios/ring," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/ios/store-app," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/ios/vpn," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/ios/webclip," +
|
||||
"/permission/admin/device-mgt/devices/owning-device/operations/ios/wifi," +
|
||||
"/permission/admin/device-mgt/notifications/view," +
|
||||
"/permission/admin/device-mgt/platform-configurations/view," +
|
||||
"/permission/admin/device-mgt/policies/view," +
|
||||
"/permission/admin/device-mgt/applications/manage," +
|
||||
"/permission/admin/manage/mobileapp/create," +
|
||||
"/permission/admin/manage/mobileapp/install," +
|
||||
"/permission/admin/manage/resources/browse," +
|
||||
"/permission/admin/manage/webapp/subscribe," +
|
||||
"/permission/admin/manage/search/advanced-search," +
|
||||
"/permission/admin/manage/search/resources," +
|
||||
"/permission/admin/manage/resources/govern/mobileapp/list," +
|
||||
"/permission/admin/login";
|
||||
return permissions.split(",");
|
||||
}
|
||||
|
||||
public static boolean createRole(String roleName, String[] users) {
|
||||
HashMap<String, String> headers = new HashMap<String, String>();
|
||||
String roleEndpoint = EMMQSGConfig.getInstance().getEmmHost() + "/api/device-mgt/v1.0/roles";
|
||||
//Set the role payload
|
||||
JSONObject roleData = new JSONObject();
|
||||
roleData.put("roleName", roleName);
|
||||
JSONArray perms = new JSONArray();
|
||||
String[] permissions = getUserPermissions();
|
||||
for (String perm : permissions) {
|
||||
perms.add(perm);
|
||||
}
|
||||
roleData.put("permissions", perms);
|
||||
JSONArray usrs = new JSONArray();
|
||||
for (String usr : users) {
|
||||
usrs.add(usr);
|
||||
}
|
||||
roleData.put("permissions", perms);
|
||||
roleData.put("users", usrs);
|
||||
//Set the headers
|
||||
headers.put(Constants.Header.CONTENT_TYPE, Constants.ContentType.APPLICATION_JSON);
|
||||
HTTPResponse httpResponse =
|
||||
HTTPInvoker.sendHTTPPostWithOAuthSecurity(roleEndpoint, roleData.toJSONString(), headers);
|
||||
if (httpResponse.getResponseCode() == Constants.HTTPStatus.CREATED) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
@ -0,0 +1,44 @@
|
||||
/*
|
||||
* Copyright (c) 2017, 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.
|
||||
*/
|
||||
|
||||
package org.wso2.mdm.qsg.dto;
|
||||
|
||||
/**
|
||||
* This holds the domain-model of client-credentials.
|
||||
*/
|
||||
public class ClientCredentials {
|
||||
|
||||
private String clientKey;
|
||||
private String clientSecret;
|
||||
|
||||
public String getClientKey() {
|
||||
return clientKey;
|
||||
}
|
||||
|
||||
public void setClientKey(String clientKey) {
|
||||
this.clientKey = clientKey;
|
||||
}
|
||||
|
||||
public String getClientSecret() {
|
||||
return clientSecret;
|
||||
}
|
||||
|
||||
public void setClientSecret(String clientSecret) {
|
||||
this.clientSecret = clientSecret;
|
||||
}
|
||||
}
|
@ -0,0 +1,80 @@
|
||||
/*
|
||||
* Copyright (c) 2017, 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.
|
||||
*/
|
||||
|
||||
package org.wso2.mdm.qsg.dto;
|
||||
|
||||
/**
|
||||
* This holds the model object of EMM configuration.
|
||||
*/
|
||||
public class EMMQSGConfig {
|
||||
|
||||
private String dcrEndPoint;
|
||||
private String oauthEndPoint;
|
||||
private String emmHost;
|
||||
private String username;
|
||||
private String password;
|
||||
private static EMMQSGConfig instance = new EMMQSGConfig();
|
||||
|
||||
private EMMQSGConfig() {
|
||||
|
||||
}
|
||||
|
||||
public String getDcrEndPoint() {
|
||||
return dcrEndPoint;
|
||||
}
|
||||
|
||||
public void setDcrEndPoint(String dcrEndPoint) {
|
||||
this.dcrEndPoint = dcrEndPoint;
|
||||
}
|
||||
|
||||
public String getOauthEndPoint() {
|
||||
return oauthEndPoint;
|
||||
}
|
||||
|
||||
public void setOauthEndPoint(String oauthEndPoint) {
|
||||
this.oauthEndPoint = oauthEndPoint;
|
||||
}
|
||||
|
||||
public String getEmmHost() {
|
||||
return emmHost;
|
||||
}
|
||||
|
||||
public void setEmmHost(String emmHost) {
|
||||
this.emmHost = emmHost;
|
||||
}
|
||||
|
||||
public String getUsername() {
|
||||
return username;
|
||||
}
|
||||
|
||||
public void setUsername(String username) {
|
||||
this.username = username;
|
||||
}
|
||||
|
||||
public String getPassword() {
|
||||
return password;
|
||||
}
|
||||
|
||||
public void setPassword(String password) {
|
||||
this.password = password;
|
||||
}
|
||||
|
||||
public static EMMQSGConfig getInstance() {
|
||||
return instance;
|
||||
}
|
||||
}
|
@ -0,0 +1,44 @@
|
||||
/*
|
||||
* Copyright (c) 2017, 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.
|
||||
*/
|
||||
|
||||
package org.wso2.mdm.qsg.dto;
|
||||
|
||||
/**
|
||||
* This holds the domain-model of HTTP Response.
|
||||
*/
|
||||
public class HTTPResponse {
|
||||
|
||||
private String response;
|
||||
private int responseCode;
|
||||
|
||||
public String getResponse() {
|
||||
return response;
|
||||
}
|
||||
|
||||
public void setResponse(String response) {
|
||||
this.response = response;
|
||||
}
|
||||
|
||||
public int getResponseCode() {
|
||||
return responseCode;
|
||||
}
|
||||
|
||||
public void setResponseCode(int responseCode) {
|
||||
this.responseCode = responseCode;
|
||||
}
|
||||
}
|
@ -0,0 +1,107 @@
|
||||
/*
|
||||
* Copyright (c) 2017, 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.
|
||||
*/
|
||||
|
||||
package org.wso2.mdm.qsg.dto;
|
||||
|
||||
/**
|
||||
* This serves as the domain-model of MobileApplication related data.
|
||||
*/
|
||||
public class MobileApplication {
|
||||
|
||||
private String appId;
|
||||
private String packageId;
|
||||
private String version;
|
||||
private String icon;
|
||||
private String banner;
|
||||
private String screenshot1;
|
||||
private String screenshot2;
|
||||
private String screenshot3;
|
||||
private String platform;
|
||||
|
||||
public String getPlatform() {
|
||||
return platform;
|
||||
}
|
||||
|
||||
public void setPlatform(String platform) {
|
||||
this.platform = platform;
|
||||
}
|
||||
|
||||
public String getAppId() {
|
||||
return appId;
|
||||
}
|
||||
|
||||
public void setAppId(String appId) {
|
||||
this.appId = appId;
|
||||
}
|
||||
|
||||
public String getPackageId() {
|
||||
return packageId;
|
||||
}
|
||||
|
||||
public void setPackageId(String packageId) {
|
||||
this.packageId = packageId;
|
||||
}
|
||||
|
||||
public String getVersion() {
|
||||
return version;
|
||||
}
|
||||
|
||||
public void setVersion(String version) {
|
||||
this.version = version;
|
||||
}
|
||||
|
||||
public String getIcon() {
|
||||
return icon;
|
||||
}
|
||||
|
||||
public void setIcon(String icon) {
|
||||
this.icon = icon;
|
||||
}
|
||||
|
||||
public String getBanner() {
|
||||
return banner;
|
||||
}
|
||||
|
||||
public void setBanner(String banner) {
|
||||
this.banner = banner;
|
||||
}
|
||||
|
||||
public String getScreenshot1() {
|
||||
return screenshot1;
|
||||
}
|
||||
|
||||
public void setScreenshot1(String screenshot1) {
|
||||
this.screenshot1 = screenshot1;
|
||||
}
|
||||
|
||||
public String getScreenshot2() {
|
||||
return screenshot2;
|
||||
}
|
||||
|
||||
public void setScreenshot2(String screenshot2) {
|
||||
this.screenshot2 = screenshot2;
|
||||
}
|
||||
|
||||
public String getScreenshot3() {
|
||||
return screenshot3;
|
||||
}
|
||||
|
||||
public void setScreenshot3(String screenshot3) {
|
||||
this.screenshot3 = screenshot3;
|
||||
}
|
||||
}
|
@ -0,0 +1,65 @@
|
||||
/*
|
||||
* Copyright (c) 2017, 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.
|
||||
*/
|
||||
|
||||
package org.wso2.mdm.qsg.utils;
|
||||
|
||||
/**
|
||||
* This class defines the constants used by the EMm-QSG package.
|
||||
*/
|
||||
public final class Constants {
|
||||
|
||||
public static final class DeviceType {
|
||||
private DeviceType() {
|
||||
throw new AssertionError();
|
||||
}
|
||||
|
||||
public static final String ANDROID = "android";
|
||||
public static final String WINDOWS = "windows";
|
||||
public static final String IOS = "ios";
|
||||
}
|
||||
|
||||
public static final class ContentType {
|
||||
private ContentType() {
|
||||
throw new AssertionError();
|
||||
}
|
||||
|
||||
public static final String APPLICATION_JSON = "application/json";
|
||||
public static final String APPLICATION_URL_ENCODED = "application/x-www-form-urlencoded";
|
||||
}
|
||||
|
||||
public static final class Header {
|
||||
private Header() {
|
||||
throw new AssertionError();
|
||||
}
|
||||
|
||||
public static final String AUTH = "Authorization";
|
||||
public static final String CONTENT_TYPE = "Content-Type";
|
||||
}
|
||||
|
||||
public static final class HTTPStatus {
|
||||
private HTTPStatus() {
|
||||
throw new AssertionError();
|
||||
}
|
||||
|
||||
public static final int OK = 200;
|
||||
public static final int CREATED = 201;
|
||||
}
|
||||
|
||||
public static final String UTF_8 = "utf-8";
|
||||
public static final String EMM_USER_ROLE = "emm-user";
|
||||
}
|
@ -0,0 +1,437 @@
|
||||
/*
|
||||
* Copyright (c) 2017, 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.
|
||||
*/
|
||||
|
||||
package org.wso2.mdm.qsg.utils;
|
||||
|
||||
import org.apache.http.HttpEntity;
|
||||
import org.apache.http.HttpResponse;
|
||||
import org.apache.http.NameValuePair;
|
||||
import org.apache.http.client.ClientProtocolException;
|
||||
import org.apache.http.client.HttpClient;
|
||||
import org.apache.http.client.entity.UrlEncodedFormEntity;
|
||||
import org.apache.http.client.methods.HttpPost;
|
||||
import org.apache.http.client.methods.HttpPut;
|
||||
import org.apache.http.config.Registry;
|
||||
import org.apache.http.config.RegistryBuilder;
|
||||
import org.apache.http.conn.socket.ConnectionSocketFactory;
|
||||
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
|
||||
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
|
||||
import org.apache.http.entity.StringEntity;
|
||||
import org.apache.http.entity.mime.MultipartEntity;
|
||||
import org.apache.http.entity.mime.content.ContentBody;
|
||||
import org.apache.http.entity.mime.content.FileBody;
|
||||
import org.apache.http.impl.client.CloseableHttpClient;
|
||||
import org.apache.http.impl.client.HttpClientBuilder;
|
||||
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
|
||||
import org.apache.http.ssl.SSLContextBuilder;
|
||||
import org.apache.http.ssl.TrustStrategy;
|
||||
import org.wso2.mdm.qsg.dto.HTTPResponse;
|
||||
|
||||
import javax.net.ssl.HostnameVerifier;
|
||||
import javax.net.ssl.SSLContext;
|
||||
import java.io.*;
|
||||
import java.security.KeyManagementException;
|
||||
import java.security.KeyStoreException;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.cert.CertificateException;
|
||||
import java.security.cert.X509Certificate;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* This class provides the utility methods to make a HTTP request.
|
||||
*/
|
||||
public class HTTPInvoker {
|
||||
|
||||
private static final String OAUTH_BEARER = "Bearer ";
|
||||
public static String oAuthToken;
|
||||
|
||||
private static HttpClient createHttpClient()
|
||||
throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
|
||||
HttpClientBuilder b = HttpClientBuilder.create();
|
||||
|
||||
// setup a Trust Strategy that allows all certificates.
|
||||
//
|
||||
SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
|
||||
public boolean isTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
|
||||
return true;
|
||||
}
|
||||
}).build();
|
||||
b.setSSLContext(sslContext);
|
||||
//b.setSSLHostnameVerifier(new NoopHostnameVerifier());
|
||||
|
||||
// don't check Hostnames, either.
|
||||
// -- use SSLConnectionSocketFactory.getDefaultHostnameVerifier(), if you don't want to weaken
|
||||
HostnameVerifier hostnameVerifier = SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;
|
||||
|
||||
// here's the special part:
|
||||
// -- need to create an SSL Socket Factory, to use our weakened "trust strategy";
|
||||
// -- and create a Registry, to register it.
|
||||
//
|
||||
SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContext, hostnameVerifier);
|
||||
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
|
||||
.register("http", PlainConnectionSocketFactory.getSocketFactory())
|
||||
.register("https", sslSocketFactory)
|
||||
.build();
|
||||
|
||||
// now, we create connection-manager using our Registry.
|
||||
// -- allows multi-threaded use
|
||||
PoolingHttpClientConnectionManager connMgr = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
|
||||
b.setConnectionManager(connMgr);
|
||||
|
||||
// finally, build the HttpClient;
|
||||
// -- done!
|
||||
CloseableHttpClient client = b.build();
|
||||
return client;
|
||||
}
|
||||
|
||||
public static HTTPResponse sendHTTPPostWithURLParams(String url, List<NameValuePair> params, HashMap<String, String>
|
||||
headers) {
|
||||
HttpPost post = null;
|
||||
HttpResponse response = null;
|
||||
CloseableHttpClient httpclient = null;
|
||||
HTTPResponse httpResponse = new HTTPResponse();
|
||||
try {
|
||||
httpclient = (CloseableHttpClient) createHttpClient();
|
||||
post = new HttpPost(url);
|
||||
post.setEntity(new UrlEncodedFormEntity(params));
|
||||
for (String key : headers.keySet()) {
|
||||
post.setHeader(key, headers.get(key));
|
||||
}
|
||||
response = httpclient.execute(post);
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
e.printStackTrace();
|
||||
} catch (ClientProtocolException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
e.printStackTrace();
|
||||
} catch (KeyStoreException e) {
|
||||
e.printStackTrace();
|
||||
} catch (KeyManagementException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
BufferedReader rd = null;
|
||||
try {
|
||||
rd = new BufferedReader(
|
||||
new InputStreamReader(response.getEntity().getContent()));
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
StringBuffer result = new StringBuffer();
|
||||
String line = "";
|
||||
try {
|
||||
while ((line = rd.readLine()) != null) {
|
||||
result.append(line);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
httpResponse.setResponseCode(response.getStatusLine().getStatusCode());
|
||||
httpResponse.setResponse(result.toString());
|
||||
return httpResponse;
|
||||
}
|
||||
|
||||
public static HTTPResponse sendHTTPPost(String url, String payload, HashMap<String, String>
|
||||
headers) {
|
||||
HttpPost post = null;
|
||||
HttpResponse response = null;
|
||||
HTTPResponse httpResponse = new HTTPResponse();
|
||||
CloseableHttpClient httpclient = null;
|
||||
try {
|
||||
httpclient = (CloseableHttpClient) createHttpClient();
|
||||
StringEntity requestEntity = new StringEntity(payload, Constants.UTF_8);
|
||||
post = new HttpPost(url);
|
||||
post.setEntity(requestEntity);
|
||||
for (String key : headers.keySet()) {
|
||||
post.setHeader(key, headers.get(key));
|
||||
}
|
||||
response = httpclient.execute(post);
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
e.printStackTrace();
|
||||
} catch (ClientProtocolException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
e.printStackTrace();
|
||||
} catch (KeyStoreException e) {
|
||||
e.printStackTrace();
|
||||
} catch (KeyManagementException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
BufferedReader rd = null;
|
||||
try {
|
||||
rd = new BufferedReader(
|
||||
new InputStreamReader(response.getEntity().getContent()));
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
StringBuffer result = new StringBuffer();
|
||||
String line = "";
|
||||
try {
|
||||
while ((line = rd.readLine()) != null) {
|
||||
result.append(line);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
httpResponse.setResponseCode(response.getStatusLine().getStatusCode());
|
||||
httpResponse.setResponse(result.toString());
|
||||
try {
|
||||
httpclient.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return httpResponse;
|
||||
}
|
||||
|
||||
public static HTTPResponse sendHTTPPutWithOAuthSecurity(String url, String payload, HashMap<String, String>
|
||||
headers) {
|
||||
HttpPut put = null;
|
||||
HttpResponse response = null;
|
||||
HTTPResponse httpResponse = new HTTPResponse();
|
||||
CloseableHttpClient httpclient = null;
|
||||
try {
|
||||
httpclient = (CloseableHttpClient) createHttpClient();
|
||||
StringEntity requestEntity = new StringEntity(payload, Constants.UTF_8);
|
||||
put = new HttpPut(url);
|
||||
put.setEntity(requestEntity);
|
||||
for (String key : headers.keySet()) {
|
||||
put.setHeader(key, headers.get(key));
|
||||
}
|
||||
put.setHeader(Constants.Header.AUTH, OAUTH_BEARER + oAuthToken);
|
||||
response = httpclient.execute(put);
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
e.printStackTrace();
|
||||
} catch (ClientProtocolException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
e.printStackTrace();
|
||||
} catch (KeyStoreException e) {
|
||||
e.printStackTrace();
|
||||
} catch (KeyManagementException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
BufferedReader rd = null;
|
||||
try {
|
||||
rd = new BufferedReader(
|
||||
new InputStreamReader(response.getEntity().getContent()));
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
StringBuffer result = new StringBuffer();
|
||||
String line = "";
|
||||
try {
|
||||
while ((line = rd.readLine()) != null) {
|
||||
result.append(line);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
httpResponse.setResponseCode(response.getStatusLine().getStatusCode());
|
||||
httpResponse.setResponse(result.toString());
|
||||
try {
|
||||
httpclient.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return httpResponse;
|
||||
}
|
||||
|
||||
public static HTTPResponse sendHTTPPostWithOAuthSecurity(String url, String payload, HashMap<String, String>
|
||||
headers) {
|
||||
HttpPost post = null;
|
||||
HttpResponse response = null;
|
||||
HTTPResponse httpResponse = new HTTPResponse();
|
||||
CloseableHttpClient httpclient = null;
|
||||
try {
|
||||
httpclient = (CloseableHttpClient) createHttpClient();
|
||||
StringEntity requestEntity = new StringEntity(payload, Constants.UTF_8);
|
||||
post = new HttpPost(url);
|
||||
post.setEntity(requestEntity);
|
||||
for (String key : headers.keySet()) {
|
||||
post.setHeader(key, headers.get(key));
|
||||
}
|
||||
post.setHeader(Constants.Header.AUTH, OAUTH_BEARER + oAuthToken);
|
||||
response = httpclient.execute(post);
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
e.printStackTrace();
|
||||
} catch (ClientProtocolException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
e.printStackTrace();
|
||||
} catch (KeyStoreException e) {
|
||||
e.printStackTrace();
|
||||
} catch (KeyManagementException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
BufferedReader rd = null;
|
||||
try {
|
||||
rd = new BufferedReader(
|
||||
new InputStreamReader(response.getEntity().getContent()));
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
StringBuffer result = new StringBuffer();
|
||||
String line = "";
|
||||
try {
|
||||
while ((line = rd.readLine()) != null) {
|
||||
result.append(line);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
httpResponse.setResponseCode(response.getStatusLine().getStatusCode());
|
||||
httpResponse.setResponse(result.toString());
|
||||
try {
|
||||
httpclient.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return httpResponse;
|
||||
}
|
||||
|
||||
public static HTTPResponse sendHTTPPostWithOAuthSecurity(String url, HttpEntity entity, HashMap<String, String>
|
||||
headers) {
|
||||
HttpPost post = null;
|
||||
HttpResponse response = null;
|
||||
HTTPResponse httpResponse = new HTTPResponse();
|
||||
CloseableHttpClient httpclient = null;
|
||||
try {
|
||||
httpclient = (CloseableHttpClient) createHttpClient();
|
||||
post = new HttpPost(url);
|
||||
post.setEntity(entity);
|
||||
for (String key : headers.keySet()) {
|
||||
post.setHeader(key, headers.get(key));
|
||||
}
|
||||
post.setHeader(Constants.Header.AUTH, OAUTH_BEARER + oAuthToken);
|
||||
response = httpclient.execute(post);
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
e.printStackTrace();
|
||||
} catch (ClientProtocolException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
e.printStackTrace();
|
||||
} catch (KeyStoreException e) {
|
||||
e.printStackTrace();
|
||||
} catch (KeyManagementException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
BufferedReader rd = null;
|
||||
try {
|
||||
rd = new BufferedReader(
|
||||
new InputStreamReader(response.getEntity().getContent()));
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
StringBuffer result = new StringBuffer();
|
||||
String line = "";
|
||||
try {
|
||||
while ((line = rd.readLine()) != null) {
|
||||
result.append(line);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
httpResponse.setResponseCode(response.getStatusLine().getStatusCode());
|
||||
httpResponse.setResponse(result.toString());
|
||||
try {
|
||||
httpclient.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return httpResponse;
|
||||
}
|
||||
|
||||
public static HTTPResponse uploadFile(String url, String fileName, String fileContentType) {
|
||||
HttpPost post = null;
|
||||
HttpResponse response = null;
|
||||
HTTPResponse httpResponse = new HTTPResponse();
|
||||
CloseableHttpClient httpclient = null;
|
||||
try {
|
||||
httpclient = (CloseableHttpClient) createHttpClient();
|
||||
post = new HttpPost(url);
|
||||
File file = new File(fileName);
|
||||
|
||||
MultipartEntity mpEntity = new MultipartEntity();
|
||||
ContentBody cbFile = new FileBody(file, fileContentType);
|
||||
mpEntity.addPart("file", cbFile);
|
||||
post.setEntity(mpEntity);
|
||||
post.setHeader(Constants.Header.AUTH, OAUTH_BEARER + oAuthToken);
|
||||
//post.setHeader(Constants.Header.CONTENT_TYPE, "multipart/form-data");
|
||||
post.setHeader("Accept", Constants.ContentType.APPLICATION_JSON);
|
||||
response = httpclient.execute(post);
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
e.printStackTrace();
|
||||
} catch (ClientProtocolException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
e.printStackTrace();
|
||||
} catch (KeyStoreException e) {
|
||||
e.printStackTrace();
|
||||
} catch (KeyManagementException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
BufferedReader rd = null;
|
||||
try {
|
||||
rd = new BufferedReader(
|
||||
new InputStreamReader(response.getEntity().getContent()));
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
StringBuffer result = new StringBuffer();
|
||||
String line = "";
|
||||
try {
|
||||
while ((line = rd.readLine()) != null) {
|
||||
result.append(line);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
httpResponse.setResponseCode(response.getStatusLine().getStatusCode());
|
||||
httpResponse.setResponse(result.toString());
|
||||
try {
|
||||
httpclient.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return httpResponse;
|
||||
}
|
||||
}
|
@ -0,0 +1,142 @@
|
||||
/*
|
||||
* Copyright (c) 2017, 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.
|
||||
*/
|
||||
|
||||
package org.wso2.mdm.qsg.utils;
|
||||
|
||||
import org.apache.commons.codec.binary.Base64;
|
||||
import org.apache.http.NameValuePair;
|
||||
import org.apache.http.message.BasicNameValuePair;
|
||||
import org.json.simple.JSONObject;
|
||||
import org.json.simple.parser.JSONParser;
|
||||
import org.json.simple.parser.ParseException;
|
||||
import org.wso2.mdm.qsg.dto.ClientCredentials;
|
||||
import org.wso2.mdm.qsg.dto.EMMQSGConfig;
|
||||
import org.wso2.mdm.qsg.dto.HTTPResponse;
|
||||
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Properties;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/**
|
||||
* This class holds the utility methods used by the EMM-QSG package.
|
||||
*/
|
||||
public class QSGUtils {
|
||||
|
||||
public static EMMQSGConfig initConfig() {
|
||||
Properties props = new Properties();
|
||||
InputStream input = null;
|
||||
EMMQSGConfig emmConfig = null;
|
||||
try {
|
||||
input = new FileInputStream("config.properties");
|
||||
// load a properties file and set the properties
|
||||
props.load(input);
|
||||
emmConfig = EMMQSGConfig.getInstance();
|
||||
emmConfig.setEmmHost(props.getProperty("emm-host"));
|
||||
emmConfig.setDcrEndPoint(props.getProperty("dcr-endpoint"));
|
||||
emmConfig.setOauthEndPoint(props.getProperty("oauth-endpoint"));
|
||||
emmConfig.setUsername(props.getProperty("username"));
|
||||
emmConfig.setPassword(props.getProperty("password"));
|
||||
} catch (IOException ex) {
|
||||
ex.printStackTrace();
|
||||
} finally {
|
||||
if (input != null) {
|
||||
try {
|
||||
input.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
return emmConfig;
|
||||
}
|
||||
|
||||
private static ClientCredentials getClientCredentials() {
|
||||
ClientCredentials clientCredentials = null;
|
||||
HashMap<String, String> headers = new HashMap<String, String>();
|
||||
String dcrEndPoint = EMMQSGConfig.getInstance().getDcrEndPoint();
|
||||
//Set the DCR payload
|
||||
JSONObject obj = new JSONObject();
|
||||
obj.put("owner", "admin");
|
||||
obj.put("clientName", "qsg");
|
||||
obj.put("grantType", "refresh_token password client_credentials");
|
||||
obj.put("tokenScope", "user:view,user:manage,user:admin:reset-password,role:view,role:manage,policy:view," +
|
||||
"policy:manage,application:manage,appm:create,appm:publish,appm:update,appm:read");
|
||||
//Set the headers
|
||||
headers.put(Constants.Header.CONTENT_TYPE, Constants.ContentType.APPLICATION_JSON);
|
||||
HTTPResponse httpResponse = HTTPInvoker.sendHTTPPost(dcrEndPoint, obj.toJSONString(), headers);
|
||||
if (httpResponse.getResponseCode() == Constants.HTTPStatus.CREATED) {
|
||||
try {
|
||||
JSONObject jsonObject = (JSONObject) new JSONParser().parse(httpResponse.getResponse());
|
||||
clientCredentials = new ClientCredentials();
|
||||
clientCredentials.setClientKey((String) jsonObject.get("client_id"));
|
||||
clientCredentials.setClientSecret((String) jsonObject.get("client_secret"));
|
||||
} catch (ParseException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
return clientCredentials;
|
||||
}
|
||||
|
||||
public static String getOAuthToken() {
|
||||
QSGUtils.initConfig();
|
||||
ClientCredentials clientCredentials = getClientCredentials();
|
||||
String authorizationStr = clientCredentials.getClientKey() + ":" + clientCredentials.getClientSecret();
|
||||
String authHeader = "Basic " + new String(Base64.encodeBase64(authorizationStr.getBytes()));
|
||||
HashMap<String, String> headers = new HashMap<String, String>();
|
||||
//Set the form params
|
||||
List<NameValuePair> urlParameters = new ArrayList<NameValuePair>();
|
||||
urlParameters.add(new BasicNameValuePair("username", EMMQSGConfig.getInstance().getUsername()));
|
||||
urlParameters.add(new BasicNameValuePair("password", EMMQSGConfig.getInstance().getPassword()));
|
||||
urlParameters.add(new BasicNameValuePair("grant_type", "password"));
|
||||
urlParameters.add(new BasicNameValuePair("scope",
|
||||
"user:view user:manage user:admin:reset-password role:view role:manage policy:view policy:manage " +
|
||||
"application:manage appm:create appm:publish appm:update appm:read"));
|
||||
//Set the headers
|
||||
headers.put(Constants.Header.CONTENT_TYPE, Constants.ContentType.APPLICATION_URL_ENCODED);
|
||||
headers.put(Constants.Header.AUTH, authHeader);
|
||||
HTTPResponse httpResponse = HTTPInvoker
|
||||
.sendHTTPPostWithURLParams(EMMQSGConfig.getInstance().getOauthEndPoint(), urlParameters, headers);
|
||||
if (httpResponse.getResponseCode() == Constants.HTTPStatus.OK) {
|
||||
try {
|
||||
JSONObject jsonObject = (JSONObject) new JSONParser().parse(httpResponse.getResponse());
|
||||
return (String) jsonObject.get("access_token");
|
||||
} catch (ParseException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static boolean isValidEmailAddress(String email) {
|
||||
String emailPattern =
|
||||
"^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$";
|
||||
Pattern p = Pattern.compile(emailPattern);
|
||||
Matcher m = p.matcher(email);
|
||||
return m.matches();
|
||||
}
|
||||
|
||||
public static String getResourceId(String resourcePath) {
|
||||
return resourcePath.substring(resourcePath.lastIndexOf('/') + 1);
|
||||
}
|
||||
}
|
@ -0,0 +1,38 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
~ Copyright (c) 2017, 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.
|
||||
-->
|
||||
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||
<parent>
|
||||
<groupId>org.wso2.iot</groupId>
|
||||
<artifactId>wso2iot-core-parent</artifactId>
|
||||
<version>3.1.0-SNAPSHOT</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>wso2iot-core-scripts</artifactId>
|
||||
<packaging>pom</packaging>
|
||||
<name>WSO2 IoT - Core - Scripts</name>
|
||||
<url>http://maven.apache.org</url>
|
||||
|
||||
<modules>
|
||||
<module>mobile-qsg</module>
|
||||
</modules>
|
||||
|
||||
</project>
|
Loading…
Reference in new issue