mirror of
https://repository.entgra.net/community/device-mgt-core.git
synced 2025-10-06 02:01:45 +00:00
Merge branch 'master' of https://repository.entgra.net/community/device-mgt-core
This commit is contained in:
commit
d4c3af5d12
@ -0,0 +1,86 @@
|
||||
/*
|
||||
* Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
|
||||
*
|
||||
* Entgra (Pvt) Ltd. 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 io.entgra.device.mgt.core.application.mgt.common;
|
||||
|
||||
public class DepConfig {
|
||||
|
||||
private String agentPackageName;
|
||||
private String consumerKey;
|
||||
private String consumerSecret;
|
||||
private String accessToken;
|
||||
private String accessSecret;
|
||||
private String accessTokenExpiry;
|
||||
private String vppToken;
|
||||
|
||||
public String getAgentPackageName() {
|
||||
return agentPackageName;
|
||||
}
|
||||
|
||||
public void setAgentPackageName(String agentPackageName) {
|
||||
this.agentPackageName = agentPackageName;
|
||||
}
|
||||
|
||||
public String getConsumerKey() {
|
||||
return consumerKey;
|
||||
}
|
||||
|
||||
public void setConsumerKey(String consumerKey) {
|
||||
this.consumerKey = consumerKey;
|
||||
}
|
||||
|
||||
public String getConsumerSecret() {
|
||||
return consumerSecret;
|
||||
}
|
||||
|
||||
public void setConsumerSecret(String consumerSecret) {
|
||||
this.consumerSecret = consumerSecret;
|
||||
}
|
||||
|
||||
public String getAccessToken() {
|
||||
return accessToken;
|
||||
}
|
||||
|
||||
public void setAccessToken(String accessToken) {
|
||||
this.accessToken = accessToken;
|
||||
}
|
||||
|
||||
public String getVppToken() {
|
||||
return vppToken;
|
||||
}
|
||||
|
||||
public void setVppToken(String vppToken) {
|
||||
this.vppToken = vppToken;
|
||||
}
|
||||
|
||||
public String getAccessSecret() {
|
||||
return accessSecret;
|
||||
}
|
||||
|
||||
public void setAccessSecret(String accessSecret) {
|
||||
this.accessSecret = accessSecret;
|
||||
}
|
||||
|
||||
public String getAccessTokenExpiry() {
|
||||
return accessTokenExpiry;
|
||||
}
|
||||
|
||||
public void setAccessTokenExpiry(String accessTokenExpiry) {
|
||||
this.accessTokenExpiry = accessTokenExpiry;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,95 @@
|
||||
/*
|
||||
* Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
|
||||
*
|
||||
* Entgra (Pvt) Ltd. 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 io.entgra.device.mgt.core.application.mgt.common.dto;
|
||||
|
||||
public class ItuneAppDTO {
|
||||
int id;
|
||||
String packageName;
|
||||
String version;
|
||||
String description;
|
||||
String title;
|
||||
String paymentMethod;
|
||||
String iconURL;
|
||||
String category;
|
||||
|
||||
public String getCategory() {
|
||||
return category;
|
||||
}
|
||||
|
||||
public void setCategory(String category) {
|
||||
this.category = category;
|
||||
}
|
||||
|
||||
public String getIconURL() {
|
||||
return iconURL;
|
||||
}
|
||||
|
||||
public void setIconURL(String iconURL) {
|
||||
this.iconURL = iconURL;
|
||||
}
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(int id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getPackageName() {
|
||||
return packageName;
|
||||
}
|
||||
|
||||
public void setPackageName(String packageName) {
|
||||
this.packageName = packageName;
|
||||
}
|
||||
|
||||
|
||||
public String getVersion() {
|
||||
return version;
|
||||
}
|
||||
|
||||
public void setVersion(String version) {
|
||||
this.version = version;
|
||||
}
|
||||
|
||||
public String getDescription() {
|
||||
return description;
|
||||
}
|
||||
|
||||
public void setDescription(String description) {
|
||||
this.description = description;
|
||||
}
|
||||
|
||||
public String getTitle() {
|
||||
return title;
|
||||
}
|
||||
|
||||
public void setTitle(String title) {
|
||||
this.title = title;
|
||||
}
|
||||
|
||||
public String getPaymentMethod() {
|
||||
return paymentMethod;
|
||||
}
|
||||
|
||||
public void setPaymentMethod(String paymentMethod) {
|
||||
this.paymentMethod = paymentMethod;
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,37 @@
|
||||
/*
|
||||
* Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
|
||||
*
|
||||
* Entgra (Pvt) Ltd. 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 io.entgra.device.mgt.core.application.mgt.common.dto;
|
||||
|
||||
public class ProxyResponse {
|
||||
|
||||
private int code;
|
||||
private String data;
|
||||
private String executorResponse;
|
||||
|
||||
public int getCode() { return code; }
|
||||
|
||||
public void setCode(int code) { this.code = code; }
|
||||
|
||||
public String getData() { return data; }
|
||||
|
||||
public void setData(String data) { this.data = data; }
|
||||
|
||||
public String getExecutorResponse() { return executorResponse; }
|
||||
|
||||
public void setExecutorResponse(String executorResponse) { this.executorResponse = executorResponse; }
|
||||
}
|
||||
@ -0,0 +1,67 @@
|
||||
/*
|
||||
* Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
|
||||
*
|
||||
* Entgra (Pvt) Ltd. 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 io.entgra.device.mgt.core.application.mgt.common.dto;
|
||||
|
||||
public class VppAssetDTO extends VppItuneAssetDTO {
|
||||
int id;
|
||||
int appId;
|
||||
int tenantId;
|
||||
String createdTime;
|
||||
String lastUpdatedTime;
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(int id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public int getAppId() {
|
||||
return appId;
|
||||
}
|
||||
|
||||
public void setAppId(int appId) {
|
||||
this.appId = appId;
|
||||
}
|
||||
|
||||
public int getTenantId() {
|
||||
return tenantId;
|
||||
}
|
||||
|
||||
public void setTenantId(int tenantId) {
|
||||
this.tenantId = tenantId;
|
||||
}
|
||||
|
||||
public String getCreatedTime() {
|
||||
return createdTime;
|
||||
}
|
||||
|
||||
public void setCreatedTime(String createdTime) {
|
||||
this.createdTime = createdTime;
|
||||
}
|
||||
|
||||
public String getLastUpdatedTime() {
|
||||
return lastUpdatedTime;
|
||||
}
|
||||
|
||||
public void setLastUpdatedTime(String lastUpdatedTime) {
|
||||
this.lastUpdatedTime = lastUpdatedTime;
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,113 @@
|
||||
/*
|
||||
* Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
|
||||
*
|
||||
* Entgra (Pvt) Ltd. 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 io.entgra.device.mgt.core.application.mgt.common.dto;
|
||||
|
||||
public class VppAssociationDTO {
|
||||
int id;
|
||||
String adamId;
|
||||
String clientUserId;
|
||||
String pricingParam;
|
||||
String associationType;
|
||||
|
||||
int assetId;
|
||||
int clientId;
|
||||
int tenantId;
|
||||
String createdTime;
|
||||
String lastUpdatedTime;
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(int id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getAdamId() {
|
||||
return adamId;
|
||||
}
|
||||
|
||||
public void setAdamId(String adamId) {
|
||||
this.adamId = adamId;
|
||||
}
|
||||
|
||||
public String getClientUserId() {
|
||||
return clientUserId;
|
||||
}
|
||||
|
||||
public void setClientUserId(String clientUserId) {
|
||||
this.clientUserId = clientUserId;
|
||||
}
|
||||
|
||||
public String getPricingParam() {
|
||||
return pricingParam;
|
||||
}
|
||||
|
||||
public void setPricingParam(String pricingParam) {
|
||||
this.pricingParam = pricingParam;
|
||||
}
|
||||
|
||||
public String getAssociationType() {
|
||||
return associationType;
|
||||
}
|
||||
|
||||
public void setAssociationType(String associationType) {
|
||||
this.associationType = associationType;
|
||||
}
|
||||
|
||||
public int getAssetId() {
|
||||
return assetId;
|
||||
}
|
||||
|
||||
public void setAssetId(int assetId) {
|
||||
this.assetId = assetId;
|
||||
}
|
||||
|
||||
public int getClientId() {
|
||||
return clientId;
|
||||
}
|
||||
|
||||
public void setClientId(int clientId) {
|
||||
this.clientId = clientId;
|
||||
}
|
||||
|
||||
public int getTenantId() {
|
||||
return tenantId;
|
||||
}
|
||||
|
||||
public void setTenantId(int tenantId) {
|
||||
this.tenantId = tenantId;
|
||||
}
|
||||
|
||||
public String getCreatedTime() {
|
||||
return createdTime;
|
||||
}
|
||||
|
||||
public void setCreatedTime(String createdTime) {
|
||||
this.createdTime = createdTime;
|
||||
}
|
||||
|
||||
public String getLastUpdatedTime() {
|
||||
return lastUpdatedTime;
|
||||
}
|
||||
|
||||
public void setLastUpdatedTime(String lastUpdatedTime) {
|
||||
this.lastUpdatedTime = lastUpdatedTime;
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,109 @@
|
||||
/*
|
||||
* Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
|
||||
*
|
||||
* Entgra (Pvt) Ltd. licenses this file to you under the Apache License,
|
||||
* Version 2.0 (the String LicenseString ); 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
|
||||
* String AS ISString 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 io.entgra.device.mgt.core.application.mgt.common.dto;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class VppItuneAssetDTO {
|
||||
|
||||
|
||||
String adamId;
|
||||
String assignedCount;
|
||||
String availableCount;
|
||||
String deviceAssignable;
|
||||
String pricingParam;
|
||||
String productType;
|
||||
String retiredCount;
|
||||
String revocable;
|
||||
|
||||
List<String> supportedPlatforms;
|
||||
|
||||
public List<String> getSupportedPlatforms() {
|
||||
return supportedPlatforms;
|
||||
}
|
||||
|
||||
public void setSupportedPlatforms(List<String> supportedPlatforms) {
|
||||
this.supportedPlatforms = supportedPlatforms;
|
||||
}
|
||||
|
||||
public String getAdamId() {
|
||||
return adamId;
|
||||
}
|
||||
|
||||
public void setAdamId(String adamId) {
|
||||
this.adamId = adamId;
|
||||
}
|
||||
|
||||
public String getAssignedCount() {
|
||||
return assignedCount;
|
||||
}
|
||||
|
||||
public void setAssignedCount(String assignedCount) {
|
||||
this.assignedCount = assignedCount;
|
||||
}
|
||||
|
||||
public String getAvailableCount() {
|
||||
return availableCount;
|
||||
}
|
||||
|
||||
public void setAvailableCount(String availableCount) {
|
||||
this.availableCount = availableCount;
|
||||
}
|
||||
|
||||
public String getDeviceAssignable() {
|
||||
return deviceAssignable;
|
||||
}
|
||||
|
||||
public void setDeviceAssignable(String deviceAssignable) {
|
||||
this.deviceAssignable = deviceAssignable;
|
||||
}
|
||||
|
||||
public String getPricingParam() {
|
||||
return pricingParam;
|
||||
}
|
||||
|
||||
public void setPricingParam(String pricingParam) {
|
||||
this.pricingParam = pricingParam;
|
||||
}
|
||||
|
||||
public String getProductType() {
|
||||
return productType;
|
||||
}
|
||||
|
||||
public void setProductType(String productType) {
|
||||
this.productType = productType;
|
||||
}
|
||||
|
||||
public String getRetiredCount() {
|
||||
return retiredCount;
|
||||
}
|
||||
|
||||
public void setRetiredCount(String retiredCount) {
|
||||
this.retiredCount = retiredCount;
|
||||
}
|
||||
|
||||
public String getRevocable() {
|
||||
return revocable;
|
||||
}
|
||||
|
||||
public void setRevocable(String revocable) {
|
||||
this.revocable = revocable;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -0,0 +1,67 @@
|
||||
/*
|
||||
* Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
|
||||
*
|
||||
* Entgra (Pvt) Ltd. 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 io.entgra.device.mgt.core.application.mgt.common.dto;
|
||||
|
||||
public class VppItuneUserDTO {
|
||||
String clientUserId;
|
||||
String inviteCode;
|
||||
String status;
|
||||
String email;
|
||||
String managedId;
|
||||
|
||||
public String getClientUserId() {
|
||||
return clientUserId;
|
||||
}
|
||||
|
||||
public void setClientUserId(String clientUserId) {
|
||||
this.clientUserId = clientUserId;
|
||||
}
|
||||
|
||||
public String getInviteCode() {
|
||||
return inviteCode;
|
||||
}
|
||||
|
||||
public void setInviteCode(String inviteCode) {
|
||||
this.inviteCode = inviteCode;
|
||||
}
|
||||
|
||||
public String getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public void setStatus(String status) {
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
public String getEmail() {
|
||||
return email;
|
||||
}
|
||||
|
||||
public void setEmail(String email) {
|
||||
this.email = email;
|
||||
}
|
||||
|
||||
public String getManagedId() {
|
||||
return managedId;
|
||||
}
|
||||
|
||||
public void setManagedId(String managedId) {
|
||||
this.managedId = managedId;
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,85 @@
|
||||
/*
|
||||
* Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
|
||||
*
|
||||
* Entgra (Pvt) Ltd. 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 io.entgra.device.mgt.core.application.mgt.common.dto;
|
||||
|
||||
public class VppPaginationDTO {
|
||||
|
||||
int currentPageIndex;
|
||||
int size;
|
||||
String tokenExpirationDate;
|
||||
int nextPageIndex;
|
||||
int totalPages;
|
||||
String uId;
|
||||
String versionId;
|
||||
|
||||
public int getCurrentPageIndex() {
|
||||
return currentPageIndex;
|
||||
}
|
||||
|
||||
public void setCurrentPageIndex(int currentPageIndex) {
|
||||
this.currentPageIndex = currentPageIndex;
|
||||
}
|
||||
|
||||
public int getSize() {
|
||||
return size;
|
||||
}
|
||||
|
||||
public void setSize(int size) {
|
||||
this.size = size;
|
||||
}
|
||||
|
||||
public String getTokenExpirationDate() {
|
||||
return tokenExpirationDate;
|
||||
}
|
||||
|
||||
public void setTokenExpirationDate(String tokenExpirationDate) {
|
||||
this.tokenExpirationDate = tokenExpirationDate;
|
||||
}
|
||||
|
||||
public int getNextPageIndex() {
|
||||
return nextPageIndex;
|
||||
}
|
||||
|
||||
public void setNextPageIndex(int nextPageIndex) {
|
||||
this.nextPageIndex = nextPageIndex;
|
||||
}
|
||||
|
||||
public int getTotalPages() {
|
||||
return totalPages;
|
||||
}
|
||||
|
||||
public void setTotalPages(int totalPages) {
|
||||
this.totalPages = totalPages;
|
||||
}
|
||||
|
||||
public String getuId() {
|
||||
return uId;
|
||||
}
|
||||
|
||||
public void setuId(String uId) {
|
||||
this.uId = uId;
|
||||
}
|
||||
|
||||
public String getVersionId() {
|
||||
return versionId;
|
||||
}
|
||||
|
||||
public void setVersionId(String versionId) {
|
||||
this.versionId = versionId;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,92 @@
|
||||
/*
|
||||
* Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
|
||||
*
|
||||
* Entgra (Pvt) Ltd. 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 io.entgra.device.mgt.core.application.mgt.common.dto;
|
||||
|
||||
public class VppUserDTO extends VppItuneUserDTO {
|
||||
int id;
|
||||
String dmUsername;
|
||||
int tenantId;
|
||||
String createdTime;
|
||||
String lastUpdatedTime;
|
||||
String tmpPassword;
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(int id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getDmUsername() {
|
||||
return dmUsername;
|
||||
}
|
||||
|
||||
public void setDmUsername(String dmUsername) {
|
||||
this.dmUsername = dmUsername;
|
||||
}
|
||||
|
||||
public int getTenantId() {
|
||||
return tenantId;
|
||||
}
|
||||
|
||||
public void setTenantId(int tenantId) {
|
||||
this.tenantId = tenantId;
|
||||
}
|
||||
|
||||
public String getCreatedTime() {
|
||||
return createdTime;
|
||||
}
|
||||
|
||||
public void setCreatedTime(String createdTime) {
|
||||
this.createdTime = createdTime;
|
||||
}
|
||||
|
||||
public String getLastUpdatedTime() {
|
||||
return lastUpdatedTime;
|
||||
}
|
||||
|
||||
public void setLastUpdatedTime(String lastUpdatedTime) {
|
||||
this.lastUpdatedTime = lastUpdatedTime;
|
||||
}
|
||||
|
||||
public String getTmpPassword() {
|
||||
return tmpPassword;
|
||||
}
|
||||
|
||||
public void setTmpPassword(String tmpPassword) {
|
||||
this.tmpPassword = tmpPassword;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "VppUserDTO{" +
|
||||
"id=" + id +
|
||||
", dmUsername='" + dmUsername + '\'' +
|
||||
", tenantId=" + tenantId +
|
||||
", createdTime='" + createdTime + '\'' +
|
||||
", lastUpdatedTime='" + lastUpdatedTime + '\'' +
|
||||
", tmpPassword='" + tmpPassword + '\'' +
|
||||
", clientUserId='" + clientUserId + '\'' +
|
||||
", inviteCode='" + inviteCode + '\'' +
|
||||
", status='" + status + '\'' +
|
||||
", email='" + email + '\'' +
|
||||
", managedId='" + managedId + '\'' +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
@ -108,6 +108,12 @@ public class Application {
|
||||
value = "if the app is favoured by the user")
|
||||
private boolean isFavourite;
|
||||
|
||||
@ApiModelProperty(name = "isExternalAppStoreApp",
|
||||
value = "Is the app coming from an external application store",
|
||||
required = true,
|
||||
example = "true or false")
|
||||
private boolean isExternalAppStoreApp;
|
||||
|
||||
public String getPackageName() {
|
||||
return packageName;
|
||||
}
|
||||
@ -194,4 +200,12 @@ public class Application {
|
||||
public void setFavourite(boolean favourite) {
|
||||
isFavourite = favourite;
|
||||
}
|
||||
|
||||
public boolean isExternalAppStoreApp() {
|
||||
return isExternalAppStoreApp;
|
||||
}
|
||||
|
||||
public void setExternalAppStoreApp(boolean externalAppStoreApp) {
|
||||
isExternalAppStoreApp = externalAppStoreApp;
|
||||
}
|
||||
}
|
||||
|
||||
@ -27,6 +27,7 @@ import io.entgra.device.mgt.core.application.mgt.common.response.Category;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.response.Tag;
|
||||
import io.entgra.device.mgt.core.device.mgt.common.Base64File;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.ApplicationDTO;
|
||||
import io.entgra.device.mgt.core.device.mgt.common.PaginationRequest;
|
||||
import io.entgra.device.mgt.core.device.mgt.common.exceptions.MetadataManagementException;
|
||||
import org.apache.cxf.jaxrs.ext.multipart.Attachment;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.ApplicationArtifact;
|
||||
@ -273,6 +274,17 @@ public interface ApplicationManager {
|
||||
*/
|
||||
ApplicationDTO getApplication(int applicationId) throws ApplicationManagementException;
|
||||
|
||||
/**
|
||||
* This method is responsible to provide application data for given deviceId.
|
||||
*
|
||||
* @param deviceId id of the device
|
||||
* @return {@link ApplicationDTO}
|
||||
* @throws ApplicationManagementException
|
||||
* if an error occurred while getting subscribed app details for relevant device id,
|
||||
*/
|
||||
ApplicationList getSubscribedAppsOfDevice(int deviceId, PaginationRequest request)
|
||||
throws ApplicationManagementException;
|
||||
|
||||
/**
|
||||
* To get the Application for given Id.
|
||||
*
|
||||
|
||||
@ -27,6 +27,7 @@ import io.entgra.device.mgt.core.device.mgt.common.DeviceIdentifier;
|
||||
import io.entgra.device.mgt.core.device.mgt.common.PaginationRequest;
|
||||
import io.entgra.device.mgt.core.device.mgt.common.PaginationResult;
|
||||
import io.entgra.device.mgt.core.device.mgt.common.app.mgt.App;
|
||||
import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.Activity;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Properties;
|
||||
@ -207,4 +208,13 @@ public interface SubscriptionManager {
|
||||
*/
|
||||
PaginationResult getAppInstalledSubscribeDevices(PaginationRequest request, String appUUID, String subType,
|
||||
String subTypeName) throws ApplicationManagementException;
|
||||
|
||||
|
||||
/***
|
||||
* This method is responsible for retrieving application details of the passed operation id.
|
||||
* @param id ID of the related operation
|
||||
* @return {@link Activity} Activity result of the app information.
|
||||
* @throws {@link SubscriptionManagementException} Exception of the subscription management
|
||||
*/
|
||||
Activity getOperationAppDetails(String id) throws SubscriptionManagementException;
|
||||
}
|
||||
|
||||
@ -0,0 +1,52 @@
|
||||
/*
|
||||
* Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
|
||||
*
|
||||
* Entgra (Pvt) Ltd. 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 io.entgra.device.mgt.core.application.mgt.common.services;
|
||||
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.ProxyResponse;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.VppAssetDTO;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.VppAssociationDTO;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.VppUserDTO;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.exception.ApplicationManagementException;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
|
||||
public interface VPPApplicationManager {
|
||||
|
||||
VppUserDTO addUser(VppUserDTO userDTO) throws ApplicationManagementException;
|
||||
|
||||
VppUserDTO getUserByDMUsername(String emmUsername) throws ApplicationManagementException;
|
||||
|
||||
void updateUser(VppUserDTO userDTO) throws ApplicationManagementException;
|
||||
|
||||
void syncUsers(String clientId) throws ApplicationManagementException;
|
||||
|
||||
void syncAssets(int nextPageIndex) throws ApplicationManagementException;
|
||||
|
||||
VppAssetDTO getAssetByAppId(int appId) throws ApplicationManagementException;
|
||||
|
||||
ProxyResponse callVPPBackend(String url, String payload, String accessToken, String method) throws IOException;
|
||||
|
||||
boolean addAssociation(VppAssetDTO asset, List<VppUserDTO> vppUsers) throws
|
||||
ApplicationManagementException;
|
||||
|
||||
VppAssociationDTO getAssociation(int assetId, int userId) throws ApplicationManagementException;
|
||||
|
||||
VppAssociationDTO getUserAssociation(String adamId, String emmUsername) throws ApplicationManagementException;
|
||||
}
|
||||
@ -0,0 +1,47 @@
|
||||
/*
|
||||
* Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
|
||||
*
|
||||
* Entgra (Pvt) Ltd. 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 io.entgra.device.mgt.core.application.mgt.common.wrapper;
|
||||
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.VppItuneAssetDTO;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.VppItuneUserDTO;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class VppAssociateRequestWrapper {
|
||||
|
||||
List<VppItuneAssetDTO> assets;
|
||||
List<String> clientUserIds;
|
||||
|
||||
public List<VppItuneAssetDTO> getAssets() {
|
||||
return assets;
|
||||
}
|
||||
|
||||
public void setAssets(List<VppItuneAssetDTO> assets) {
|
||||
this.assets = assets;
|
||||
}
|
||||
|
||||
public List<String> getClientUserIds() {
|
||||
return clientUserIds;
|
||||
}
|
||||
|
||||
public void setClientUserIds(List<String> clientUserIds) {
|
||||
this.clientUserIds = clientUserIds;
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,39 @@
|
||||
/*
|
||||
* Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
|
||||
*
|
||||
* Entgra (Pvt) Ltd. 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 io.entgra.device.mgt.core.application.mgt.common.wrapper;
|
||||
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.VppAssetDTO;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.VppItuneUserDTO;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.VppPaginationDTO;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class VppItuneAssetResponseWrapper extends VppPaginationDTO {
|
||||
|
||||
List<VppAssetDTO> assets;
|
||||
|
||||
public List<VppAssetDTO> getAssets() {
|
||||
return assets;
|
||||
}
|
||||
|
||||
public void setAssets(List<VppAssetDTO> assets) {
|
||||
this.assets = assets;
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,40 @@
|
||||
/*
|
||||
* Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
|
||||
*
|
||||
* Entgra (Pvt) Ltd. 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 io.entgra.device.mgt.core.application.mgt.common.wrapper;
|
||||
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.VppItuneUserDTO;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class VppItuneUserRequestWrapper {
|
||||
|
||||
List<VppItuneUserDTO> users;
|
||||
|
||||
public VppItuneUserRequestWrapper() {
|
||||
users = new ArrayList<>();
|
||||
}
|
||||
public List<VppItuneUserDTO> getUser() {
|
||||
return users;
|
||||
}
|
||||
|
||||
public void setUser(List<VppItuneUserDTO> users) {
|
||||
this.users = users;
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,40 @@
|
||||
/*
|
||||
* Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
|
||||
*
|
||||
* Entgra (Pvt) Ltd. 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 io.entgra.device.mgt.core.application.mgt.common.wrapper;
|
||||
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.VppItuneUserDTO;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.VppPaginationDTO;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class VppItuneUserResponseWrapper extends VppPaginationDTO {
|
||||
|
||||
List<VppItuneUserDTO> users;
|
||||
|
||||
public VppItuneUserResponseWrapper() {
|
||||
users = new ArrayList<>();
|
||||
}
|
||||
public List<VppItuneUserDTO> getUser() {
|
||||
return users;
|
||||
}
|
||||
|
||||
public void setUser(List<VppItuneUserDTO> users) {
|
||||
this.users = users;
|
||||
}
|
||||
}
|
||||
@ -22,6 +22,7 @@ import io.entgra.device.mgt.core.application.mgt.common.dto.ApplicationDTO;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.CategoryDTO;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.TagDTO;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.exception.ApplicationManagementDAOException;
|
||||
import io.entgra.device.mgt.core.device.mgt.common.PaginationRequest;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@ -150,6 +151,16 @@ public interface ApplicationDAO {
|
||||
*/
|
||||
ApplicationDTO getApplication(int applicationId, int tenantId) throws ApplicationManagementDAOException;
|
||||
|
||||
/**
|
||||
* To get the application with the given id
|
||||
*
|
||||
* @param deviceId ID of the device which the apps are installed on.
|
||||
* @param tenantId ID of the tenant.
|
||||
* @return the application
|
||||
* @throws ApplicationManagementDAOException ApplicationDTO Management DAO Exception.
|
||||
*/
|
||||
List<ApplicationDTO> getSubscribedAppsOfDevice(int deviceId, int tenantId, PaginationRequest request) throws ApplicationManagementDAOException;
|
||||
|
||||
/**
|
||||
* To get the application with the given uuid
|
||||
*
|
||||
|
||||
@ -23,6 +23,7 @@ import io.entgra.device.mgt.core.application.mgt.common.dto.DeviceSubscriptionDT
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.ScheduledSubscriptionDTO;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.exception.SubscriptionManagementException;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.exception.ApplicationManagementDAOException;
|
||||
import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.Activity;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@ -252,4 +253,15 @@ public interface SubscriptionDAO {
|
||||
* @throws {@link ApplicationManagementDAOException} if connections establishment fails.
|
||||
*/
|
||||
Map<Integer,String> getCurrentInstalledAppVersion(int appId, List<Integer> deviceIdList, String installedVersion) throws ApplicationManagementDAOException;
|
||||
|
||||
|
||||
/**
|
||||
* Retrieves app details by operation id.
|
||||
*
|
||||
* @param operationId ID of the operation which app details needs to be retrieved
|
||||
* @param tenantId ID of tenant
|
||||
* @return {@link Activity}
|
||||
* @throws ApplicationManagementDAOException if error occurred while retrieving the app details
|
||||
*/
|
||||
Activity getOperationAppDetails(int operationId, int tenantId) throws ApplicationManagementDAOException;
|
||||
}
|
||||
|
||||
@ -0,0 +1,46 @@
|
||||
/*
|
||||
* Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
|
||||
*
|
||||
* Entgra (Pvt) Ltd. 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 io.entgra.device.mgt.core.application.mgt.core.dao;
|
||||
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.VppAssetDTO;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.VppAssociationDTO;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.VppUserDTO;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.exception.ApplicationManagementDAOException;
|
||||
|
||||
|
||||
public interface VppApplicationDAO {
|
||||
|
||||
int addVppUser(VppUserDTO userDTO, int tenantId) throws ApplicationManagementDAOException;
|
||||
|
||||
VppUserDTO updateVppUser(VppUserDTO userDTO, int tenantId) throws ApplicationManagementDAOException;
|
||||
|
||||
VppUserDTO getUserByDMUsername(String emmUsername, int tenantId) throws ApplicationManagementDAOException;
|
||||
|
||||
VppAssetDTO getAssetByAppId(int appId, int tenantId) throws ApplicationManagementDAOException;
|
||||
|
||||
int addAsset(VppAssetDTO vppAssetDTO, int tenantId) throws ApplicationManagementDAOException;
|
||||
|
||||
VppAssetDTO updateAsset(VppAssetDTO vppAssetDTO, int tenantId) throws ApplicationManagementDAOException;
|
||||
|
||||
VppAssociationDTO getAssociation(int assetId, int userId, int tenantId) throws ApplicationManagementDAOException;
|
||||
|
||||
int addAssociation(VppAssociationDTO vppAssociationDTO, int tenantId) throws ApplicationManagementDAOException;
|
||||
|
||||
VppAssociationDTO updateAssociation(VppAssociationDTO vppAssociationDTO, int tenantId) throws ApplicationManagementDAOException;
|
||||
}
|
||||
@ -17,7 +17,7 @@
|
||||
*/
|
||||
package io.entgra.device.mgt.core.application.mgt.core.dao.common;
|
||||
|
||||
import io.entgra.device.mgt.core.application.mgt.core.dao.SPApplicationDAO;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.dao.*;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.dao.impl.application.spapplication.GenericSPApplicationDAOImpl;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.dao.impl.application.spapplication.OracleSPApplicationDAOImpl;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.dao.impl.application.spapplication.PostgreSQLSPApplicationDAOImpl;
|
||||
@ -26,16 +26,14 @@ import io.entgra.device.mgt.core.application.mgt.core.dao.impl.visibility.Generi
|
||||
import io.entgra.device.mgt.core.application.mgt.core.dao.impl.visibility.OracleVisibilityDAOImpl;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.dao.impl.visibility.PostgreSQLVisibilityDAOImpl;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.dao.impl.visibility.SQLServerVisibilityDAOImpl;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.dao.impl.vpp.GenericVppApplicationDAOImpl;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.dao.impl.vpp.OracleVppApplicationDAOImpl;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.dao.impl.vpp.PostgreSQLVppApplicationDAO;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.dao.impl.vpp.SQLServerVppApplicationDAOImpl;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.util.Constants;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.exception.UnsupportedDatabaseEngineException;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.dao.ApplicationDAO;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.dao.ApplicationReleaseDAO;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.dao.LifecycleStateDAO;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.dao.ReviewDAO;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.dao.SubscriptionDAO;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.dao.VisibilityDAO;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.dao.impl.application.PostgreSQLApplicationDAOImpl;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.dao.impl.application.SQLServerApplicationDAOImpl;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.dao.impl.application.release.OracleApplicationReleaseDAOImpl;
|
||||
@ -232,4 +230,28 @@ public class ApplicationManagementDAOFactory {
|
||||
}
|
||||
throw new IllegalStateException("Database engine has not initialized properly.");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* To get the instance of VppApplicationImplementation of the particular database engine.
|
||||
* @return specific VppApplicationImplementation
|
||||
*/
|
||||
public static VppApplicationDAO getVppApplicationDAO() {
|
||||
if (databaseEngine != null) {
|
||||
switch (databaseEngine) {
|
||||
case Constants.DataBaseTypes.DB_TYPE_H2:
|
||||
case Constants.DataBaseTypes.DB_TYPE_MYSQL:
|
||||
return new GenericVppApplicationDAOImpl();
|
||||
case Constants.DataBaseTypes.DB_TYPE_POSTGRESQL:
|
||||
return new PostgreSQLVppApplicationDAO();
|
||||
case Constants.DataBaseTypes.DB_TYPE_ORACLE:
|
||||
return new OracleVppApplicationDAOImpl();
|
||||
case Constants.DataBaseTypes.DB_TYPE_MSSQL:
|
||||
return new SQLServerVppApplicationDAOImpl();
|
||||
default:
|
||||
throw new UnsupportedDatabaseEngineException("Unsupported database engine : " + databaseEngine);
|
||||
}
|
||||
}
|
||||
throw new IllegalStateException("Database engine has not initialized properly.");
|
||||
}
|
||||
}
|
||||
|
||||
@ -22,6 +22,7 @@ import io.entgra.device.mgt.core.application.mgt.core.dao.impl.AbstractDAOImpl;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.exception.UnexpectedServerErrorException;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.util.Constants;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.util.DAOUtil;
|
||||
import io.entgra.device.mgt.core.device.mgt.common.PaginationRequest;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
@ -656,6 +657,84 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ApplicationDTO> getSubscribedAppsOfDevice(int deviceId, int tenantId, PaginationRequest request) throws
|
||||
ApplicationManagementDAOException {
|
||||
if (log.isDebugEnabled()) {
|
||||
log.debug("Getting all installed apps of device " + deviceId
|
||||
+ " from the database");
|
||||
}
|
||||
List<ApplicationDTO> appList = null;
|
||||
|
||||
String sql = "SELECT "
|
||||
+ "AP_APP.ID AS APP_ID, "
|
||||
+ "AP_APP.NAME AS APP_NAME, "
|
||||
+ "AP_APP.DESCRIPTION AS APP_DESCRIPTION, "
|
||||
+ "AP_APP.TYPE AS APP_TYPE, "
|
||||
+ "AP_APP.STATUS AS APP_STATUS, "
|
||||
+ "AP_APP.SUB_TYPE AS APP_SUB_TYPE, "
|
||||
+ "AP_APP.CURRENCY AS APP_CURRENCY, "
|
||||
+ "AP_APP.RATING AS APP_RATING, "
|
||||
+ "AP_APP.DEVICE_TYPE_ID AS APP_DEVICE_TYPE_ID, "
|
||||
+ "AP_APP_RELEASE.ID AS RELEASE_ID, "
|
||||
+ "AP_APP_RELEASE.DESCRIPTION AS RELEASE_DESCRIPTION, "
|
||||
+ "AP_APP_RELEASE.VERSION AS RELEASE_VERSION, "
|
||||
+ "AP_APP_RELEASE.UUID AS RELEASE_UUID, "
|
||||
+ "AP_APP_RELEASE.RELEASE_TYPE AS RELEASE_TYPE, "
|
||||
+ "AP_APP_RELEASE.INSTALLER_LOCATION AS AP_RELEASE_STORED_LOC, "
|
||||
+ "AP_APP_RELEASE.ICON_LOCATION AS AP_RELEASE_ICON_LOC, "
|
||||
+ "AP_APP_RELEASE.BANNER_LOCATION AS AP_RELEASE_BANNER_LOC, "
|
||||
+ "AP_APP_RELEASE.SC_1_LOCATION AS AP_RELEASE_SC1, "
|
||||
+ "AP_APP_RELEASE.SC_2_LOCATION AS AP_RELEASE_SC2, "
|
||||
+ "AP_APP_RELEASE.SC_3_LOCATION AS AP_RELEASE_SC3, "
|
||||
+ "AP_APP_RELEASE.APP_HASH_VALUE AS RELEASE_HASH_VALUE, "
|
||||
+ "AP_APP_RELEASE.APP_PRICE AS RELEASE_PRICE, "
|
||||
+ "AP_APP_RELEASE.APP_META_INFO AS RELEASE_META_INFO, "
|
||||
+ "AP_APP_RELEASE.PACKAGE_NAME AS PACKAGE_NAME, "
|
||||
+ "AP_APP_RELEASE.SUPPORTED_OS_VERSIONS AS RELEASE_SUP_OS_VERSIONS, "
|
||||
+ "AP_APP_RELEASE.RATING AS RELEASE_RATING, "
|
||||
+ "AP_APP_RELEASE.CURRENT_STATE AS RELEASE_CURRENT_STATE, "
|
||||
+ "AP_APP_RELEASE.RATED_USERS AS RATED_USER_COUNT "
|
||||
+ "FROM AP_APP "
|
||||
+ "JOIN AP_APP_RELEASE ON AP_APP.ID = AP_APP_RELEASE.AP_APP_ID "
|
||||
+ "JOIN AP_DEVICE_SUBSCRIPTION ON AP_APP_RELEASE.ID = AP_DEVICE_SUBSCRIPTION.AP_APP_RELEASE_ID "
|
||||
+ "WHERE AP_DEVICE_SUBSCRIPTION.DM_DEVICE_ID = ? AND AP_DEVICE_SUBSCRIPTION.TENANT_ID= ? "
|
||||
+"AND AP_DEVICE_SUBSCRIPTION.STATUS= 'COMPLETED'";
|
||||
|
||||
if (request != null) {
|
||||
sql = sql + " LIMIT ?,?";
|
||||
}
|
||||
|
||||
try {
|
||||
Connection conn = this.getDBConnection();
|
||||
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
|
||||
stmt.setInt(1, deviceId);
|
||||
stmt.setInt(2, tenantId);
|
||||
if (request != null) {
|
||||
stmt.setInt(3, request.getStartIndex());
|
||||
stmt.setInt(4, request.getRowCount());
|
||||
}
|
||||
try (ResultSet rs = stmt.executeQuery()) {
|
||||
appList = new ArrayList<>();
|
||||
while (rs.next()) {
|
||||
ApplicationDTO app = DAOUtil.loadDeviceApp(rs);
|
||||
appList.add(app);
|
||||
}
|
||||
return appList;
|
||||
}
|
||||
}
|
||||
} catch (DBConnectionException e) {
|
||||
String msg = "Error occurred while obtaining the DB connection for getting all apps installed on the device of "
|
||||
+ "device Id: " + deviceId + ".";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementDAOException(msg, e);
|
||||
} catch (SQLException e) {
|
||||
String msg = "Error occurred while while running SQL to get all installed apps of device with device Id: " + deviceId;
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementDAOException(msg, e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean updateApplication(ApplicationDTO applicationDTO, int tenantId)
|
||||
throws ApplicationManagementDAOException {
|
||||
|
||||
@ -21,6 +21,7 @@ import io.entgra.device.mgt.core.application.mgt.core.dao.SubscriptionDAO;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.dao.impl.AbstractDAOImpl;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.exception.UnexpectedServerErrorException;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.util.DAOUtil;
|
||||
import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.Activity;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.ExecutionStatus;
|
||||
@ -1435,4 +1436,44 @@ public class GenericSubscriptionDAOImpl extends AbstractDAOImpl implements Subsc
|
||||
throw new ApplicationManagementDAOException(msg, e);
|
||||
}
|
||||
}
|
||||
|
||||
public Activity getOperationAppDetails(int operationId, int tenantId) throws ApplicationManagementDAOException {
|
||||
try {
|
||||
String sql = "SELECT "
|
||||
+ "AP.NAME, "
|
||||
+ "AP.TYPE, "
|
||||
+ "AR.PACKAGE_NAME, "
|
||||
+ "AR.VERSION, "
|
||||
+ "DS.SUBSCRIBED_BY, "
|
||||
+ "DS.STATUS, "
|
||||
+ "DS.ACTION_TRIGGERED_FROM "
|
||||
+ "FROM AP_APP_SUB_OP_MAPPING SOP "
|
||||
+ "JOIN AP_DEVICE_SUBSCRIPTION DS ON SOP.AP_DEVICE_SUBSCRIPTION_ID = DS.ID "
|
||||
+ "JOIN AP_APP_RELEASE AR ON DS.AP_APP_RELEASE_ID = AR.ID "
|
||||
+ "JOIN AP_APP AP ON AP.ID = AR.AP_APP_ID "
|
||||
+ " WHERE SOP.OPERATION_ID = ? AND SOP.TENANT_ID = ?";
|
||||
|
||||
Connection conn = this.getDBConnection();
|
||||
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
|
||||
stmt.setInt(1, operationId);
|
||||
stmt.setInt(2,tenantId);
|
||||
try (ResultSet rs = stmt.executeQuery()) {
|
||||
return DAOUtil.loadOperationActivity(rs);
|
||||
}
|
||||
}
|
||||
} catch (DBConnectionException e) {
|
||||
String msg =
|
||||
"Error occurred while getting the app details from the database related to operation " + operationId;
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementDAOException(msg, e);
|
||||
} catch (SQLException e) {
|
||||
String msg = "Error occurred when processing SQL to retrieve app details of operation" + operationId;
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementDAOException(msg, e);
|
||||
} catch (UnexpectedServerErrorException e) {
|
||||
String msg = "More than one app for operation " + operationId;
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementDAOException(msg, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,508 @@
|
||||
/*
|
||||
* Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
|
||||
*
|
||||
* Entgra (Pvt) Ltd. 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 io.entgra.device.mgt.core.application.mgt.core.dao.impl.vpp;
|
||||
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.VppAssetDTO;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.VppAssociationDTO;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.VppUserDTO;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.exception.DBConnectionException;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.dao.VppApplicationDAO;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.dao.impl.AbstractDAOImpl;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.exception.ApplicationManagementDAOException;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.exception.UnexpectedServerErrorException;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.util.DAOUtil;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import java.sql.*;
|
||||
import java.util.List;
|
||||
|
||||
public class GenericVppApplicationDAOImpl extends AbstractDAOImpl implements VppApplicationDAO {
|
||||
private static final Log log = LogFactory.getLog(GenericVppApplicationDAOImpl.class);
|
||||
|
||||
@Override
|
||||
public int addVppUser(VppUserDTO userDTO, int tenantId)
|
||||
throws ApplicationManagementDAOException {
|
||||
int vppUserId = -1;
|
||||
String sql = "INSERT INTO "
|
||||
+ "AP_VPP_USER("
|
||||
+ "CLIENT_USER_ID, "
|
||||
+ "DM_USERNAME, "
|
||||
+ "TENANT_ID, "
|
||||
+ "EMAIL, "
|
||||
+ "INVITE_CODE, "
|
||||
+ "STATUS,"
|
||||
+ "CREATED_TIME,"
|
||||
+ "LAST_UPDATED_TIME,"
|
||||
+ "MANAGED_ID,"
|
||||
+ "TEMP_PASSWORD) "
|
||||
+ "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
|
||||
try {
|
||||
Connection conn = this.getDBConnection();
|
||||
try (PreparedStatement stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
|
||||
long currentTime = System.currentTimeMillis();
|
||||
stmt.setString(1, userDTO.getClientUserId());
|
||||
stmt.setString(2, userDTO.getDmUsername());
|
||||
stmt.setInt(3, tenantId);
|
||||
stmt.setString(4, userDTO.getEmail());
|
||||
stmt.setString(5, userDTO.getInviteCode());
|
||||
stmt.setString(6, userDTO.getStatus());
|
||||
stmt.setLong(7, currentTime);
|
||||
stmt.setLong(8, currentTime);
|
||||
stmt.setString(9, userDTO.getManagedId());
|
||||
stmt.setString(10, userDTO.getTmpPassword());
|
||||
stmt.executeUpdate();
|
||||
try (ResultSet rs = stmt.getGeneratedKeys()) {
|
||||
if (rs.next()) {
|
||||
vppUserId = rs.getInt(1);
|
||||
}
|
||||
}
|
||||
return vppUserId;
|
||||
}
|
||||
} catch (DBConnectionException e) {
|
||||
String msg = "Error occurred while obtaining database connection when adding the vpp user";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementDAOException(msg, e);
|
||||
} catch (SQLException e) {
|
||||
String msg = "Error occurred when processing SQL to add the vpp user.";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementDAOException(msg, e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public VppUserDTO updateVppUser(VppUserDTO userDTO, int tenantId)
|
||||
throws ApplicationManagementDAOException {
|
||||
|
||||
String sql = "UPDATE AP_VPP_USER SET ";
|
||||
if (userDTO.getClientUserId() != null && !userDTO.getClientUserId().isEmpty()) {
|
||||
sql += "CLIENT_USER_ID = ?,";
|
||||
}
|
||||
if (userDTO.getDmUsername() != null && !userDTO.getDmUsername().isEmpty()) {
|
||||
sql += "DM_USERNAME = ?,";
|
||||
}
|
||||
if (userDTO.getEmail() != null && !userDTO.getEmail().isEmpty()) {
|
||||
sql += "EMAIL = ?,";
|
||||
}
|
||||
if (userDTO.getInviteCode() != null && !userDTO.getInviteCode().isEmpty()) {
|
||||
sql += "INVITE_CODE = ?,";
|
||||
}
|
||||
if (userDTO.getStatus() != null && !userDTO.getStatus().isEmpty()) {
|
||||
sql += "STATUS = ?,";
|
||||
}
|
||||
if (userDTO.getManagedId() != null && !userDTO.getManagedId().isEmpty()) {
|
||||
sql += "MANAGED_ID = ?,";
|
||||
}
|
||||
if (userDTO.getTmpPassword() != null && !userDTO.getTmpPassword().isEmpty()) {
|
||||
sql += "TEMP_PASSWORD = ?,";
|
||||
}
|
||||
|
||||
sql += " TENANT_ID = ?, LAST_UPDATED_TIME = ? WHERE ID = ?";
|
||||
|
||||
try {
|
||||
Connection conn = this.getDBConnection();
|
||||
long updatedTime = System.currentTimeMillis();
|
||||
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
|
||||
int x = 0;
|
||||
|
||||
if (userDTO.getClientUserId() != null && !userDTO.getClientUserId().isEmpty()) {
|
||||
stmt.setString(++x, userDTO.getClientUserId());
|
||||
}
|
||||
if (userDTO.getDmUsername() != null && !userDTO.getDmUsername().isEmpty()) {
|
||||
stmt.setString(++x, userDTO.getDmUsername());
|
||||
}
|
||||
if (userDTO.getEmail() != null && !userDTO.getEmail().isEmpty()) {
|
||||
stmt.setString(++x, userDTO.getEmail());
|
||||
}
|
||||
if (userDTO.getInviteCode() != null && !userDTO.getInviteCode().isEmpty()) {
|
||||
stmt.setString(++x, userDTO.getInviteCode());
|
||||
}
|
||||
if (userDTO.getStatus() != null && !userDTO.getStatus().isEmpty()) {
|
||||
stmt.setString(++x, userDTO.getStatus());
|
||||
}
|
||||
if (userDTO.getManagedId() != null && !userDTO.getManagedId().isEmpty()) {
|
||||
stmt.setString(++x, userDTO.getManagedId());
|
||||
}
|
||||
if (userDTO.getTmpPassword() != null && !userDTO.getTmpPassword().isEmpty()) {
|
||||
stmt.setString(++x, userDTO.getTmpPassword());
|
||||
}
|
||||
stmt.setInt(++x, tenantId);
|
||||
stmt.setLong(++x, updatedTime);
|
||||
stmt.setInt(++x, userDTO.getId());
|
||||
if (stmt.executeUpdate() == 1) {
|
||||
return userDTO;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
} catch (DBConnectionException e) {
|
||||
String msg = "Error occurred while obtaining database connection when updating the vpp user";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementDAOException(msg, e);
|
||||
} catch (SQLException e) {
|
||||
String msg = "Error occurred when processing SQL to updating the vpp user.";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementDAOException(msg, e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public VppUserDTO getUserByDMUsername(String emmUsername, int tenantId)
|
||||
throws ApplicationManagementDAOException {
|
||||
String sql = "SELECT "
|
||||
+ "ID, "
|
||||
+ "CLIENT_USER_ID, "
|
||||
+ "TENANT_ID, "
|
||||
+ "EMAIL, "
|
||||
+ "INVITE_CODE, "
|
||||
+ "STATUS, "
|
||||
+ "CREATED_TIME, "
|
||||
+ "LAST_UPDATED_TIME, "
|
||||
+ "MANAGED_ID, "
|
||||
+ "TEMP_PASSWORD, "
|
||||
+ "DM_USERNAME "
|
||||
+ "FROM AP_VPP_USER "
|
||||
+ "WHERE DM_USERNAME = ? AND TENANT_ID = ?";
|
||||
try {
|
||||
Connection conn = this.getDBConnection();
|
||||
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
|
||||
stmt.setString(1, emmUsername);
|
||||
stmt.setInt(2, tenantId);
|
||||
try (ResultSet rs = stmt.executeQuery()) {
|
||||
return DAOUtil.loadVppUser(rs);
|
||||
}
|
||||
}
|
||||
} catch (DBConnectionException e) {
|
||||
String msg = "Error occurred while obtaining database connection when retrieving vpp user by EMM Username.";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementDAOException(msg, e);
|
||||
} catch (SQLException e) {
|
||||
String msg = "Error occurred when processing SQL to retrieve vpp user by EMM Username.";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementDAOException(msg, e);
|
||||
} catch (UnexpectedServerErrorException e) {
|
||||
String msg = "Found more than one user for: " + emmUsername;
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementDAOException(msg, e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public VppAssetDTO getAssetByAppId(int appId, int tenantId)
|
||||
throws ApplicationManagementDAOException {
|
||||
String sql = "SELECT "
|
||||
+ "ID, "
|
||||
+ "APP_ID, "
|
||||
+ "TENANT_ID, "
|
||||
+ "CREATED_TIME, "
|
||||
+ "LAST_UPDATED_TIME, "
|
||||
+ "ADAM_ID, "
|
||||
+ "ASSIGNED_COUNT, "
|
||||
+ "DEVICE_ASSIGNABLE, "
|
||||
+ "PRICING_PARAMS, "
|
||||
+ "PRODUCT_TYPE, "
|
||||
+ "RETIRED_COUNT, "
|
||||
+ "REVOCABLE "
|
||||
// + "SUPPORTED_PLATFORMS "
|
||||
+ "FROM AP_ASSETS "
|
||||
+ "WHERE APP_ID = ? AND TENANT_ID = ?";
|
||||
try {
|
||||
Connection conn = this.getDBConnection();
|
||||
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
|
||||
stmt.setInt(1, appId);
|
||||
stmt.setInt(2, tenantId);
|
||||
try (ResultSet rs = stmt.executeQuery()) {
|
||||
return DAOUtil.loadAsset(rs);
|
||||
}
|
||||
}
|
||||
} catch (DBConnectionException e) {
|
||||
String msg = "Error occurred while obtaining database connection when retrieving asset data of app id "+ appId;
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementDAOException(msg, e);
|
||||
} catch (SQLException e) {
|
||||
String msg = "Error occurred when processing SQL to retrieve asset by app id.";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementDAOException(msg, e);
|
||||
} catch (UnexpectedServerErrorException e) {
|
||||
String msg = "Found more than one app for app id: " + appId;
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementDAOException(msg, e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int addAsset(VppAssetDTO vppAssetDTO, int tenantId)
|
||||
throws ApplicationManagementDAOException {
|
||||
int assetId = -1;
|
||||
String sql = "INSERT INTO "
|
||||
+ "AP_ASSETS("
|
||||
+ "APP_ID, "
|
||||
+ "TENANT_ID, "
|
||||
+ "CREATED_TIME,"
|
||||
+ "LAST_UPDATED_TIME,"
|
||||
+ "ADAM_ID,"
|
||||
+ "ASSIGNED_COUNT,"
|
||||
+ "DEVICE_ASSIGNABLE,"
|
||||
+ "PRICING_PARAMS,"
|
||||
+ "PRODUCT_TYPE,"
|
||||
+ "RETIRED_COUNT,"
|
||||
+ "REVOCABLE, "
|
||||
+ "SUPPORTED_PLATFORMS) "
|
||||
+ "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
|
||||
try {
|
||||
Connection conn = this.getDBConnection();
|
||||
try (PreparedStatement stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
|
||||
long currentTime = System.currentTimeMillis();
|
||||
stmt.setInt(1, vppAssetDTO.getAppId());
|
||||
stmt.setInt(2, tenantId);
|
||||
stmt.setLong(3, currentTime);
|
||||
stmt.setLong(4, currentTime);
|
||||
stmt.setString(5, vppAssetDTO.getAdamId());
|
||||
stmt.setString(6, vppAssetDTO.getAssignedCount());
|
||||
stmt.setString(7, vppAssetDTO.getDeviceAssignable());
|
||||
stmt.setString(8, vppAssetDTO.getPricingParam());
|
||||
stmt.setString(9, vppAssetDTO.getProductType());
|
||||
stmt.setString(10, vppAssetDTO.getRetiredCount());
|
||||
stmt.setString(11, vppAssetDTO.getRevocable());
|
||||
List<String> platformList = vppAssetDTO.getSupportedPlatforms();
|
||||
String platformString = String.join(",", platformList);
|
||||
stmt.setString(12, platformString);
|
||||
stmt.executeUpdate();
|
||||
try (ResultSet rs = stmt.getGeneratedKeys()) {
|
||||
if (rs.next()) {
|
||||
assetId = rs.getInt(1);
|
||||
}
|
||||
}
|
||||
return assetId;
|
||||
}
|
||||
} catch (DBConnectionException e) {
|
||||
String msg = "Error occurred while obtaining database connection when adding the asset.";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementDAOException(msg, e);
|
||||
} catch (SQLException e) {
|
||||
String msg = "Error occurred when processing SQL to add the asset.";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementDAOException(msg, e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public VppAssetDTO updateAsset(VppAssetDTO vppAssetDTO, int tenantId)
|
||||
throws ApplicationManagementDAOException {
|
||||
|
||||
String sql = "UPDATE AP_ASSETS SET ";
|
||||
|
||||
if (vppAssetDTO.getAdamId() != null && !vppAssetDTO.getAdamId().isEmpty()) {
|
||||
sql += "ADAM_ID = ?, ";
|
||||
}
|
||||
if (vppAssetDTO.getAssignedCount() != null && !vppAssetDTO.getAssignedCount().isEmpty()) {
|
||||
sql += "ASSIGNED_COUNT = ?, ";
|
||||
}
|
||||
if (vppAssetDTO.getDeviceAssignable() != null && !vppAssetDTO.getDeviceAssignable().isEmpty()) {
|
||||
sql += "DEVICE_ASSIGNABLE = ?, ";
|
||||
}
|
||||
if (vppAssetDTO.getPricingParam() != null && !vppAssetDTO.getPricingParam().isEmpty()) {
|
||||
sql += "PRICING_PARAMS = ?, ";
|
||||
}
|
||||
if (vppAssetDTO.getProductType() != null && !vppAssetDTO.getProductType().isEmpty()) {
|
||||
sql += "PRODUCT_TYPE = ?, ";
|
||||
}
|
||||
if (vppAssetDTO.getRetiredCount() != null && !vppAssetDTO.getRetiredCount().isEmpty()) {
|
||||
sql += "RETIRED_COUNT = ?, ";
|
||||
}
|
||||
if (vppAssetDTO.getRevocable() != null && !vppAssetDTO.getRevocable().isEmpty()) {
|
||||
sql += "REVOCABLE = ?, ";
|
||||
}
|
||||
if (vppAssetDTO.getSupportedPlatforms() != null && !vppAssetDTO.getSupportedPlatforms().isEmpty()) {
|
||||
sql += "SUPPORTED_PLATFORMS = ?,";
|
||||
}
|
||||
sql += "APP_ID = ?, LAST_UPDATED_TIME = ? WHERE ID = ? AND TENANT_ID = ?";
|
||||
|
||||
try {
|
||||
Connection conn = this.getDBConnection();
|
||||
long updatedTime = System.currentTimeMillis();
|
||||
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
|
||||
int x = 0;
|
||||
|
||||
if (vppAssetDTO.getAdamId() != null && !vppAssetDTO.getAdamId().isEmpty()) {
|
||||
stmt.setString(++x, vppAssetDTO.getAdamId());
|
||||
}
|
||||
if (vppAssetDTO.getAssignedCount() != null && !vppAssetDTO.getAssignedCount().isEmpty()) {
|
||||
stmt.setString(++x, vppAssetDTO.getAssignedCount());
|
||||
}
|
||||
if (vppAssetDTO.getDeviceAssignable() != null && !vppAssetDTO.getDeviceAssignable().isEmpty()) {
|
||||
stmt.setString(++x, vppAssetDTO.getDeviceAssignable());
|
||||
}
|
||||
if (vppAssetDTO.getPricingParam() != null && !vppAssetDTO.getPricingParam().isEmpty()) {
|
||||
stmt.setString(++x, vppAssetDTO.getPricingParam());
|
||||
}
|
||||
if (vppAssetDTO.getProductType() != null && !vppAssetDTO.getProductType().isEmpty()) {
|
||||
stmt.setString(++x, vppAssetDTO.getProductType());
|
||||
}
|
||||
if (vppAssetDTO.getRetiredCount() != null && !vppAssetDTO.getRetiredCount().isEmpty()) {
|
||||
stmt.setString(++x, vppAssetDTO.getRetiredCount());
|
||||
}
|
||||
if (vppAssetDTO.getRevocable() != null && !vppAssetDTO.getRevocable().isEmpty()) {
|
||||
stmt.setString(++x, vppAssetDTO.getRevocable());
|
||||
}
|
||||
if (vppAssetDTO.getSupportedPlatforms() != null && !vppAssetDTO.getSupportedPlatforms().isEmpty()) {
|
||||
List<String> platformList = vppAssetDTO.getSupportedPlatforms();
|
||||
String platformString = String.join(",", platformList);
|
||||
stmt.setString(++x, platformString);
|
||||
}
|
||||
|
||||
stmt.setInt(++x, vppAssetDTO.getAppId());
|
||||
stmt.setLong(++x, updatedTime);
|
||||
stmt.setInt(++x, vppAssetDTO.getId());
|
||||
stmt.setLong(++x, tenantId);
|
||||
if (stmt.executeUpdate() == 1) {
|
||||
return vppAssetDTO;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
} catch (DBConnectionException e) {
|
||||
String msg = "Error occurred while obtaining database connection when updating the vpp user";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementDAOException(msg, e);
|
||||
} catch (SQLException e) {
|
||||
String msg = "Error occurred when processing SQL to updating the vpp user.";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementDAOException(msg, e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public VppAssociationDTO getAssociation(int assetId, int userId, int tenantId)
|
||||
throws ApplicationManagementDAOException {
|
||||
String sql = "SELECT "
|
||||
+ "ID, "
|
||||
+ "ASSOCIATION_TYPE, "
|
||||
+ "CREATED_TIME, "
|
||||
+ "LAST_UPDATED_TIME, "
|
||||
+ "PRICING_PARAMS "
|
||||
+ "FROM AP_VPP_ASSOCIATION "
|
||||
+ "WHERE ASSET_ID = ? AND USER_ID = ? AND TENANT_ID = ?";
|
||||
try {
|
||||
Connection conn = this.getDBConnection();
|
||||
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
|
||||
stmt.setInt(1, assetId);
|
||||
stmt.setInt(2, userId);
|
||||
stmt.setInt(3, tenantId);
|
||||
try (ResultSet rs = stmt.executeQuery()) {
|
||||
return DAOUtil.loadAssignment(rs);
|
||||
}
|
||||
}
|
||||
} catch (DBConnectionException e) {
|
||||
String msg = "Error occurred while obtaining database connection when retrieving assignment data of user with id "+ userId;
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementDAOException(msg, e);
|
||||
} catch (SQLException e) {
|
||||
String msg = "Error occurred when processing SQL to retrieve assignment by asset id and user id.";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementDAOException(msg, e);
|
||||
} catch (UnexpectedServerErrorException e) {
|
||||
String msg = "Found more than one assignment for user id: " + userId + " and asset id: " + assetId;
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementDAOException(msg, e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int addAssociation(VppAssociationDTO vppAssociationDTO, int tenantId)
|
||||
throws ApplicationManagementDAOException {
|
||||
int associationId = -1;
|
||||
String sql = "INSERT INTO "
|
||||
+ "AP_VPP_ASSOCIATION("
|
||||
+ "ASSET_ID, "
|
||||
+ "USER_ID, "
|
||||
+ "TENANT_ID, "
|
||||
+ "ASSOCIATION_TYPE,"
|
||||
+ "CREATED_TIME,"
|
||||
+ "LAST_UPDATED_TIME,"
|
||||
+ "PRICING_PARAMS) "
|
||||
+ "VALUES (?, ?, ?, ?, ?)";
|
||||
try {
|
||||
Connection conn = this.getDBConnection();
|
||||
try (PreparedStatement stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
|
||||
long currentTime = System.currentTimeMillis();
|
||||
stmt.setInt(1, vppAssociationDTO.getAssetId());
|
||||
stmt.setInt(2, vppAssociationDTO.getClientId());
|
||||
stmt.setInt(3, tenantId);
|
||||
stmt.setString(4, vppAssociationDTO.getAssociationType());
|
||||
stmt.setLong(5, currentTime);
|
||||
stmt.setLong(6, currentTime);
|
||||
stmt.setString(7, vppAssociationDTO.getPricingParam());
|
||||
stmt.executeUpdate();
|
||||
try (ResultSet rs = stmt.getGeneratedKeys()) {
|
||||
if (rs.next()) {
|
||||
associationId = rs.getInt(1);
|
||||
}
|
||||
}
|
||||
return associationId;
|
||||
}
|
||||
} catch (DBConnectionException e) {
|
||||
String msg = "Error occurred while obtaining database connection when adding the asset.";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementDAOException(msg, e);
|
||||
} catch (SQLException e) {
|
||||
String msg = "Error occurred when processing SQL to add the asset.";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementDAOException(msg, e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public VppAssociationDTO updateAssociation(VppAssociationDTO vppAssociationDTO, int tenantId)
|
||||
throws ApplicationManagementDAOException {
|
||||
|
||||
String sql = "UPDATE "
|
||||
+ "AP_VPP_ASSOCIATION "
|
||||
+ "SET "
|
||||
+ "ASSET_ID = ?,"
|
||||
+ "USER_ID = ?, "
|
||||
+ "ASSOCIATION_TYPE = ?, "
|
||||
+ "LAST_UPDATED_TIME = ?, "
|
||||
+ "PRICING_PARAMS = ? "
|
||||
+ "WHERE ID = ? AND TENANT_ID = ?";
|
||||
try {
|
||||
Connection conn = this.getDBConnection();
|
||||
long updatedTime = System.currentTimeMillis();
|
||||
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
|
||||
stmt.setInt(1, vppAssociationDTO.getAssetId());
|
||||
stmt.setInt(2, vppAssociationDTO.getClientId());
|
||||
stmt.setString(3, vppAssociationDTO.getAssociationType());
|
||||
stmt.setLong(4, updatedTime);
|
||||
stmt.setString(5, vppAssociationDTO.getPricingParam());
|
||||
stmt.setInt(6, vppAssociationDTO.getId());
|
||||
stmt.setLong(7, tenantId);
|
||||
if (stmt.executeUpdate() == 1) {
|
||||
return vppAssociationDTO;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
} catch (DBConnectionException e) {
|
||||
String msg = "Error occurred while obtaining database connection when updating the vpp user";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementDAOException(msg, e);
|
||||
} catch (SQLException e) {
|
||||
String msg = "Error occurred when processing SQL to updating the vpp user.";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementDAOException(msg, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,82 @@
|
||||
/*
|
||||
* Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
|
||||
*
|
||||
* Entgra (Pvt) Ltd. 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 io.entgra.device.mgt.core.application.mgt.core.dao.impl.vpp;
|
||||
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.VppUserDTO;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.exception.DBConnectionException;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.exception.ApplicationManagementDAOException;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import java.sql.*;
|
||||
|
||||
public class OracleVppApplicationDAOImpl extends GenericVppApplicationDAOImpl {
|
||||
|
||||
private static final Log log = LogFactory.getLog(GenericVppApplicationDAOImpl.class);
|
||||
|
||||
@Override
|
||||
public int addVppUser(VppUserDTO userDTO, int tenantId)
|
||||
throws ApplicationManagementDAOException {
|
||||
int vppUserId = -1;
|
||||
String sql = "INSERT INTO "
|
||||
+ "AP_VPP_USER("
|
||||
+ "CLIENT_USER_ID, "
|
||||
+ "DM_USERNAME, "
|
||||
+ "TENANT_ID, "
|
||||
+ "EMAIL, "
|
||||
+ "INVITE_CODE, "
|
||||
+ "STATUS,"
|
||||
+ "CREATED_TIME,"
|
||||
+ "LAST_UPDATED_TIME,"
|
||||
+ "MANAGED_ID,"
|
||||
+ "TEMP_PASSWORD) "
|
||||
+ "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
|
||||
try {
|
||||
Connection conn = this.getDBConnection();
|
||||
try (PreparedStatement stmt = conn.prepareStatement(sql, new String[] {"ID"})) {
|
||||
long currentTime = System.currentTimeMillis();
|
||||
stmt.setString(1, userDTO.getClientUserId());
|
||||
stmt.setString(2, userDTO.getDmUsername());
|
||||
stmt.setInt(3, tenantId);
|
||||
stmt.setString(4, userDTO.getEmail());
|
||||
stmt.setString(5, userDTO.getInviteCode());
|
||||
stmt.setString(6, userDTO.getStatus());
|
||||
stmt.setLong(7, currentTime);
|
||||
stmt.setLong(8, currentTime);
|
||||
stmt.setString(9, userDTO.getManagedId());
|
||||
stmt.setString(10, userDTO.getTmpPassword());
|
||||
stmt.executeUpdate();
|
||||
try (ResultSet rs = stmt.getGeneratedKeys()) {
|
||||
if (rs.next()) {
|
||||
vppUserId = rs.getInt(1);
|
||||
}
|
||||
}
|
||||
return vppUserId;
|
||||
}
|
||||
} catch (DBConnectionException e) {
|
||||
String msg = "Error occurred while obtaining database connection when adding the vpp user";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementDAOException(msg, e);
|
||||
} catch (SQLException e) {
|
||||
String msg = "Error occurred when processing SQL to add the vpp user.";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementDAOException(msg, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,81 @@
|
||||
/*
|
||||
* Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
|
||||
*
|
||||
* Entgra (Pvt) Ltd. 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 io.entgra.device.mgt.core.application.mgt.core.dao.impl.vpp;
|
||||
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.VppUserDTO;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.exception.DBConnectionException;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.exception.ApplicationManagementDAOException;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import java.sql.*;
|
||||
|
||||
public class PostgreSQLVppApplicationDAO extends GenericVppApplicationDAOImpl {
|
||||
|
||||
private static final Log log = LogFactory.getLog(GenericVppApplicationDAOImpl.class);
|
||||
|
||||
public int addVppUser(VppUserDTO userDTO, int tenantId)
|
||||
throws ApplicationManagementDAOException {
|
||||
int vppUserId = -1;
|
||||
String sql = "INSERT INTO "
|
||||
+ "AP_VPP_USER("
|
||||
+ "CLIENT_USER_ID, "
|
||||
+ "DM_USERNAME, "
|
||||
+ "TENANT_ID, "
|
||||
+ "EMAIL, "
|
||||
+ "INVITE_CODE, "
|
||||
+ "STATUS,"
|
||||
+ "CREATED_TIME,"
|
||||
+ "LAST_UPDATED_TIME,"
|
||||
+ "MANAGED_ID,"
|
||||
+ "TEMP_PASSWORD) "
|
||||
+ "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
|
||||
try {
|
||||
Connection conn = this.getDBConnection();
|
||||
try (PreparedStatement stmt = conn.prepareStatement(sql, new String[]{"ID"})) {
|
||||
long currentTime = System.currentTimeMillis();
|
||||
stmt.setString(1, userDTO.getClientUserId());
|
||||
stmt.setString(2, userDTO.getDmUsername());
|
||||
stmt.setInt(3, tenantId);
|
||||
stmt.setString(4, userDTO.getEmail());
|
||||
stmt.setString(5, userDTO.getInviteCode());
|
||||
stmt.setString(6, userDTO.getStatus());
|
||||
stmt.setLong(7, currentTime);
|
||||
stmt.setLong(8, currentTime);
|
||||
stmt.setString(9, userDTO.getManagedId());
|
||||
stmt.setString(10, userDTO.getTmpPassword());
|
||||
stmt.executeUpdate();
|
||||
try (ResultSet rs = stmt.getGeneratedKeys()) {
|
||||
if (rs.next()) {
|
||||
vppUserId = rs.getInt(1);
|
||||
}
|
||||
}
|
||||
return vppUserId;
|
||||
}
|
||||
} catch (DBConnectionException e) {
|
||||
String msg = "Error occurred while obtaining database connection when adding the vpp user";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementDAOException(msg, e);
|
||||
} catch (SQLException e) {
|
||||
String msg = "Error occurred when processing SQL to add the vpp user.";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementDAOException(msg, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,22 @@
|
||||
/*
|
||||
* Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
|
||||
*
|
||||
* Entgra (Pvt) Ltd. 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 io.entgra.device.mgt.core.application.mgt.core.dao.impl.vpp;
|
||||
|
||||
public class SQLServerVppApplicationDAOImpl extends GenericVppApplicationDAOImpl {
|
||||
}
|
||||
@ -22,6 +22,7 @@ import io.entgra.device.mgt.core.application.mgt.core.exception.BadRequestExcept
|
||||
import io.entgra.device.mgt.core.device.mgt.common.Base64File;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.dao.SPApplicationDAO;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.util.ApplicationManagementUtil;
|
||||
import io.entgra.device.mgt.core.device.mgt.common.PaginationRequest;
|
||||
import io.entgra.device.mgt.core.device.mgt.common.exceptions.MetadataManagementException;
|
||||
import io.entgra.device.mgt.core.device.mgt.common.metadata.mgt.Metadata;
|
||||
import org.apache.commons.codec.digest.DigestUtils;
|
||||
@ -1444,6 +1445,43 @@ public class ApplicationManagerImpl implements ApplicationManager {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ApplicationList getSubscribedAppsOfDevice(int deviceId, PaginationRequest request) throws ApplicationManagementException {
|
||||
ApplicationList applicationList = new ApplicationList();
|
||||
List<Application> applications = new ArrayList<>();
|
||||
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
|
||||
try {
|
||||
ConnectionManagerUtil.openDBConnection();
|
||||
List<ApplicationDTO> applicationDTOS = this.applicationDAO.getSubscribedAppsOfDevice(deviceId, tenantId, request);
|
||||
for (ApplicationDTO applicationDTO: applicationDTOS) {
|
||||
applicationDTO.setTags(this.applicationDAO.getAppTags(applicationDTO.getId(), tenantId));
|
||||
applicationDTO.setAppCategories(this.applicationDAO.getAppCategories(applicationDTO.getId(), tenantId));
|
||||
applications.add(APIUtil.appDtoToAppResponse(applicationDTO));
|
||||
}
|
||||
|
||||
List<ApplicationDTO> totalApplications = this.applicationDAO.getSubscribedAppsOfDevice(deviceId, tenantId, null);
|
||||
Pagination pagination = new Pagination();
|
||||
pagination.setCount(totalApplications.size());
|
||||
pagination.setSize(applications.size());
|
||||
pagination.setOffset(request.getStartIndex());
|
||||
pagination.setLimit(request.getRowCount());
|
||||
applicationList.setApplications(applications);
|
||||
applicationList.setPagination(pagination);
|
||||
return applicationList;
|
||||
} catch (ApplicationManagementDAOException e) {
|
||||
String msg = "Error occurred when getting installed apps of device with device id: "
|
||||
+ deviceId;
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
} catch (DBConnectionException e) {
|
||||
String msg = "DB Connection error occurred while getting installed apps of device with device id: " + deviceId;
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
} finally {
|
||||
ConnectionManagerUtil.closeDBConnection();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check whether given OS range is valid or invalid
|
||||
*
|
||||
|
||||
@ -19,7 +19,14 @@
|
||||
package io.entgra.device.mgt.core.application.mgt.core.impl;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.VppAssetDTO;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.VppUserDTO;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.services.VPPApplicationManager;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.dao.VppApplicationDAO;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.exception.BadRequestException;
|
||||
import io.entgra.device.mgt.core.device.mgt.core.DeviceManagementConstants;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.exception.UnexpectedServerErrorException;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.util.VppHttpUtil;
|
||||
import io.entgra.device.mgt.core.device.mgt.extensions.logger.spi.EntgraLogger;
|
||||
import io.entgra.device.mgt.core.notification.logger.AppInstallLogContext;
|
||||
import io.entgra.device.mgt.core.notification.logger.impl.EntgraAppInstallLoggerImpl;
|
||||
@ -118,12 +125,14 @@ public class SubscriptionManagerImpl implements SubscriptionManager {
|
||||
private static final EntgraLogger log = new EntgraAppInstallLoggerImpl(SubscriptionManagerImpl.class);
|
||||
private SubscriptionDAO subscriptionDAO;
|
||||
private ApplicationDAO applicationDAO;
|
||||
private VppApplicationDAO vppApplicationDAO;
|
||||
private LifecycleStateManager lifecycleStateManager;
|
||||
|
||||
public SubscriptionManagerImpl() {
|
||||
this.lifecycleStateManager = DataHolder.getInstance().getLifecycleStateManager();
|
||||
this.subscriptionDAO = ApplicationManagementDAOFactory.getSubscriptionDAO();
|
||||
this.applicationDAO = ApplicationManagementDAOFactory.getApplicationDAO();
|
||||
this.vppApplicationDAO = ApplicationManagementDAOFactory.getVppApplicationDAO();
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -148,6 +157,7 @@ public class SubscriptionManagerImpl implements SubscriptionManager {
|
||||
ApplicationDTO applicationDTO = getApplicationDTO(applicationUUID);
|
||||
ApplicationSubscriptionInfo applicationSubscriptionInfo = getAppSubscriptionInfo(applicationDTO, subType,
|
||||
params);
|
||||
performExternalStoreSubscription(applicationDTO, applicationSubscriptionInfo);
|
||||
ApplicationInstallResponse applicationInstallResponse = performActionOnDevices(
|
||||
applicationSubscriptionInfo.getAppSupportingDeviceTypeName(), applicationSubscriptionInfo.getDevices(),
|
||||
applicationDTO, subType, applicationSubscriptionInfo.getSubscribers(), action, properties, isOperationReExecutingDisabled);
|
||||
@ -156,6 +166,51 @@ public class SubscriptionManagerImpl implements SubscriptionManager {
|
||||
return applicationInstallResponse;
|
||||
}
|
||||
|
||||
private void performExternalStoreSubscription(ApplicationDTO applicationDTO,
|
||||
ApplicationSubscriptionInfo
|
||||
applicationSubscriptionInfo) throws ApplicationManagementException {
|
||||
try {
|
||||
// Only for iOS devices
|
||||
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
|
||||
if (DeviceTypes.IOS.toString().equalsIgnoreCase(APIUtil.getDeviceTypeData(applicationDTO
|
||||
.getDeviceTypeId()).getName())) {
|
||||
// TODO: replace getAssetByAppId with the correct one in DAO
|
||||
// Check if the app trying to subscribe is a VPP asset.
|
||||
VppAssetDTO storedAsset = vppApplicationDAO.getAssetByAppId(applicationDTO.getId(), tenantId);
|
||||
if (storedAsset != null) { // This is a VPP asset
|
||||
List<VppUserDTO> users = new ArrayList<>();
|
||||
List<Device> devices = applicationSubscriptionInfo.getDevices();// get
|
||||
// subscribed device list, so that we can extract the users of those devices.
|
||||
for (Device device : devices) {
|
||||
VppUserDTO user = vppApplicationDAO.getUserByDMUsername(device.getEnrolmentInfo()
|
||||
.getOwner(), PrivilegedCarbonContext.getThreadLocalCarbonContext()
|
||||
.getTenantId(true));
|
||||
users.add(user);
|
||||
}
|
||||
VPPApplicationManager vppManager = APIUtil.getVPPManager();
|
||||
vppManager.addAssociation(storedAsset, users);
|
||||
}
|
||||
}
|
||||
} catch (BadRequestException e) {
|
||||
String msg = "Device Type not found";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
} catch (UnexpectedServerErrorException e) {
|
||||
String msg = "Unexpected error while getting device type";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
} catch (ApplicationManagementDAOException e) {
|
||||
String msg = "Error while getting the device user";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
} catch (ApplicationManagementException e) {
|
||||
String msg = "Error while associating user";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void createScheduledSubscription(ScheduledSubscriptionDTO subscriptionDTO)
|
||||
throws SubscriptionManagementException {
|
||||
@ -1568,4 +1623,29 @@ public class SubscriptionManagerImpl implements SubscriptionManager {
|
||||
ConnectionManagerUtil.closeDBConnection();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Activity getOperationAppDetails(String id) throws SubscriptionManagementException {
|
||||
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
|
||||
int operationId = Integer.parseInt(
|
||||
id.replace(DeviceManagementConstants.OperationAttributes.ACTIVITY, ""));
|
||||
if (operationId == 0) {
|
||||
throw new IllegalArgumentException("Operation ID cannot be null or zero (0).");
|
||||
}
|
||||
try {
|
||||
ConnectionManagerUtil.openDBConnection();
|
||||
return subscriptionDAO.getOperationAppDetails(operationId, tenantId);
|
||||
} catch (ApplicationManagementDAOException e) {
|
||||
String msg = "Error occurred while retrieving app details of operation: " + operationId;
|
||||
log.error(msg, e);
|
||||
throw new SubscriptionManagementException(msg, e);
|
||||
} catch (DBConnectionException e) {
|
||||
String msg = "Error occurred while retrieving the database connection";
|
||||
log.error(msg, e);
|
||||
throw new SubscriptionManagementException(msg, e);
|
||||
} finally {
|
||||
ConnectionManagerUtil.closeDBConnection();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -0,0 +1,610 @@
|
||||
/*
|
||||
* Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
|
||||
*
|
||||
* Entgra (Pvt) Ltd. 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 io.entgra.device.mgt.core.application.mgt.core.impl;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.DepConfig;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.ItuneAppDTO;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.ProxyResponse;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.VppAssetDTO;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.VppAssociationDTO;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.VppItuneAssetDTO;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.VppItuneUserDTO;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.response.Application;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.VppUserDTO;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.exception.ApplicationManagementException;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.exception.DBConnectionException;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.exception.TransactionManagementException;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.services.VPPApplicationManager;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.wrapper.VppAssociateRequestWrapper;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.wrapper.VppItuneAssetResponseWrapper;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.wrapper.VppItuneUserRequestWrapper;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.wrapper.VppItuneUserResponseWrapper;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.dao.ApplicationDAO;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.dao.SPApplicationDAO;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.dao.VisibilityDAO;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.dao.VppApplicationDAO;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.dao.common.ApplicationManagementDAOFactory;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.exception.ApplicationManagementDAOException;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.internal.DataHolder;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.lifecycle.LifecycleStateManager;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.util.ApplicationManagementUtil;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.util.ConnectionManagerUtil;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.util.Constants;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.util.VppHttpUtil;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.util.APIUtil;
|
||||
import io.entgra.device.mgt.core.device.mgt.common.exceptions.MetadataManagementException;
|
||||
import io.entgra.device.mgt.core.device.mgt.common.metadata.mgt.Metadata;
|
||||
import io.entgra.device.mgt.core.device.mgt.common.metadata.mgt.MetadataManagementService;
|
||||
import io.entgra.device.mgt.core.device.mgt.core.DeviceManagementConstants;
|
||||
import io.entgra.device.mgt.core.device.mgt.core.internal.DeviceManagementDataHolder;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.apache.http.HttpStatus;
|
||||
import org.wso2.carbon.context.PrivilegedCarbonContext;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class VppApplicationManagerImpl implements VPPApplicationManager {
|
||||
private static final String APP_API = "https://vpp.itunes.apple.com/mdm/v2";
|
||||
private static final String ASSETS = APP_API + "/assets";
|
||||
private static final String USER_CREATE = APP_API + "/users/create";
|
||||
private static final String USER_UPDATE = APP_API + "/users/update";
|
||||
private static final String USER_GET = APP_API + "/users";
|
||||
private static final String ASSIGNMENTS_POST = APP_API + "/assets/associate";
|
||||
private static final String ASSIGNMENTS_GET = APP_API + "/assignments";
|
||||
private static final String TOKEN = "";
|
||||
private static final String LOOKUP_API = "https://uclient-api.itunes.apple" +
|
||||
".com/WebObjects/MZStorePlatform.woa/wa/lookup?version=2&id=";
|
||||
private static final String LOOKUP_API_PREFIX =
|
||||
"&p=mdm-lockup&caller=MDM&platform=enterprisestore&cc=us&l=en";
|
||||
|
||||
|
||||
private static final Log log = LogFactory.getLog(VppApplicationManagerImpl.class);
|
||||
|
||||
private ApplicationDAO applicationDAO;
|
||||
private SPApplicationDAO spApplicationDAO;
|
||||
private VisibilityDAO visibilityDAO;
|
||||
private final LifecycleStateManager lifecycleStateManager;
|
||||
private VppApplicationDAO vppApplicationDAO;
|
||||
|
||||
public VppApplicationManagerImpl() {
|
||||
initDataAccessObjects();
|
||||
lifecycleStateManager = DataHolder.getInstance().getLifecycleStateManager();
|
||||
}
|
||||
|
||||
private void initDataAccessObjects() {
|
||||
this.applicationDAO = ApplicationManagementDAOFactory.getApplicationDAO();
|
||||
this.visibilityDAO = ApplicationManagementDAOFactory.getVisibilityDAO();
|
||||
this.spApplicationDAO = ApplicationManagementDAOFactory.getSPApplicationDAO();
|
||||
this.vppApplicationDAO = ApplicationManagementDAOFactory.getVppApplicationDAO();
|
||||
}
|
||||
|
||||
@Override
|
||||
public VppUserDTO addUser(VppUserDTO userDTO) throws ApplicationManagementException {
|
||||
|
||||
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
|
||||
|
||||
// Call the API to add
|
||||
try {
|
||||
VppItuneUserDTO ituneUserDTO = userDTO;
|
||||
VppItuneUserRequestWrapper wrapper = new VppItuneUserRequestWrapper();
|
||||
wrapper.getUser().add(ituneUserDTO);
|
||||
|
||||
Gson gson = new Gson();
|
||||
String userPayload = gson.toJson(wrapper);
|
||||
|
||||
ProxyResponse proxyResponse = callVPPBackend(USER_CREATE, userPayload, getVppToken(), Constants.VPP.POST);
|
||||
if ((proxyResponse.getCode() == HttpStatus.SC_OK || proxyResponse.getCode() ==
|
||||
HttpStatus.SC_CREATED) && proxyResponse.getData().contains(Constants.VPP.EVENT_ID)) {
|
||||
// Create user does not return any useful data. Its needed to call the backend again
|
||||
ProxyResponse getUserResponse = callVPPBackend(USER_GET + Constants.VPP.CLIENT_USER_ID_PARAM +
|
||||
userDTO.getClientUserId(), userPayload, getVppToken(), Constants.VPP.GET);
|
||||
if ((getUserResponse.getCode() == HttpStatus.SC_OK || getUserResponse.getCode() ==
|
||||
HttpStatus.SC_CREATED) && getUserResponse.getData().contains(Constants.VPP.TOTAL_PAGES)) {
|
||||
VppItuneUserResponseWrapper vppItuneUserResponseWrapper = gson.fromJson
|
||||
(getUserResponse.getData(), VppItuneUserResponseWrapper.class);
|
||||
userDTO.setInviteCode(vppItuneUserResponseWrapper.getUser().get(0)
|
||||
.getInviteCode());
|
||||
userDTO.setStatus(vppItuneUserResponseWrapper.getUser().get(0).getStatus());
|
||||
log.error("userDTO " + userDTO.toString());
|
||||
try {
|
||||
ConnectionManagerUtil.beginDBTransaction();
|
||||
int id = vppApplicationDAO.addVppUser(userDTO, tenantId);
|
||||
if (id != -1) {
|
||||
ConnectionManagerUtil.commitDBTransaction();
|
||||
userDTO.setId(id);
|
||||
userDTO.setTenantId(PrivilegedCarbonContext
|
||||
.getThreadLocalCarbonContext().getTenantId());
|
||||
return userDTO;
|
||||
}
|
||||
ConnectionManagerUtil.rollbackDBTransaction();
|
||||
return null;
|
||||
} catch (ApplicationManagementDAOException e) {
|
||||
ConnectionManagerUtil.rollbackDBTransaction();
|
||||
String msg = "Error occurred while adding the Vpp User.";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
} catch (TransactionManagementException e) {
|
||||
String msg = "Error occurred while executing database transaction for adding Vpp User.";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
} catch (DBConnectionException e) {
|
||||
String msg = "Error occurred while retrieving the database connection for adding Vpp User.";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
} finally {
|
||||
ConnectionManagerUtil.closeDBConnection();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
} catch (IOException e) {
|
||||
String msg = "Error while calling VPP backend to add user";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public VppUserDTO getUserByDMUsername(String emmUsername) throws ApplicationManagementException {
|
||||
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
|
||||
try {
|
||||
ConnectionManagerUtil.openDBConnection();
|
||||
return vppApplicationDAO.getUserByDMUsername(emmUsername, tenantId);
|
||||
} catch (DBConnectionException e) {
|
||||
String msg = "DB Connection error occurs while getting vpp User data related to EMM user " + emmUsername + ".";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
} catch (ApplicationManagementDAOException e) {
|
||||
String msg = "Error occurred while getting vpp User data related to EMM user " + emmUsername + ".";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
} finally {
|
||||
ConnectionManagerUtil.closeDBConnection();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateUser(VppUserDTO userDTO) throws ApplicationManagementException {
|
||||
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
|
||||
VppItuneUserDTO ituneUserDTO = userDTO;
|
||||
VppItuneUserRequestWrapper wrapper = new VppItuneUserRequestWrapper();
|
||||
wrapper.getUser().add(ituneUserDTO);
|
||||
|
||||
Gson gson = new Gson();
|
||||
String userPayload = gson.toJson(wrapper);
|
||||
try {
|
||||
ProxyResponse proxyResponse = callVPPBackend(USER_UPDATE, userPayload, getVppToken(), Constants.VPP.POST);
|
||||
if ((proxyResponse.getCode() == HttpStatus.SC_OK || proxyResponse.getCode() ==
|
||||
HttpStatus.SC_CREATED) && proxyResponse.getData().contains(Constants.VPP.EVENT_ID)) {
|
||||
VppUserDTO currentUserDTO = getUserByDMUsername(userDTO.getDmUsername());
|
||||
if (currentUserDTO != null) {
|
||||
userDTO.setId(currentUserDTO.getId());
|
||||
}
|
||||
try {
|
||||
ConnectionManagerUtil.beginDBTransaction();
|
||||
if (vppApplicationDAO.updateVppUser(userDTO, tenantId) == null) {
|
||||
ConnectionManagerUtil.rollbackDBTransaction();
|
||||
String msg = "Unable to update the Vpp user " +userDTO.getId();
|
||||
log.error(msg);
|
||||
throw new ApplicationManagementException(msg);
|
||||
}
|
||||
ConnectionManagerUtil.commitDBTransaction();
|
||||
} catch (ApplicationManagementDAOException e) {
|
||||
ConnectionManagerUtil.rollbackDBTransaction();
|
||||
String msg = "Error occurred while updating the Vpp User.";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
} catch (TransactionManagementException e) {
|
||||
String msg = "Error occurred while executing database transaction for Vpp User update.";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
} catch (DBConnectionException e) {
|
||||
String msg = "Error occurred while retrieving the database connection for Vpp User update.";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
} finally {
|
||||
ConnectionManagerUtil.closeDBConnection();
|
||||
}
|
||||
}
|
||||
|
||||
} catch (IOException e) {
|
||||
String msg = "Error while calling VPP backend to update";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void syncUsers(String clientId) throws ApplicationManagementException {
|
||||
ProxyResponse proxyResponse = null;
|
||||
try {
|
||||
proxyResponse = callVPPBackend(USER_GET, null, getVppToken(), Constants
|
||||
.VPP.GET);
|
||||
if ((proxyResponse.getCode() == HttpStatus.SC_OK || proxyResponse.getCode() ==
|
||||
HttpStatus.SC_CREATED) && proxyResponse.getData().contains(Constants.VPP.TOTAL_PAGES)) {
|
||||
log.error("proxyResponse " + proxyResponse.getData());
|
||||
Gson gson = new Gson();
|
||||
VppItuneUserResponseWrapper vppUserResponseWrapper = gson.fromJson
|
||||
(proxyResponse.getData(), VppItuneUserResponseWrapper.class);
|
||||
// TODO: to implement later
|
||||
}
|
||||
} catch (IOException e) {
|
||||
String msg = "Error while syncing VPP users with backend";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void syncAssets(int nextPageIndex) throws ApplicationManagementException {
|
||||
ProxyResponse proxyResponse = null;
|
||||
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
|
||||
try {
|
||||
String url = ASSETS;
|
||||
if (nextPageIndex > 0) { // Not the first page
|
||||
url += "?pageIndex=" + nextPageIndex;
|
||||
}
|
||||
proxyResponse = callVPPBackend(url, null, getVppToken(), Constants.VPP.GET);
|
||||
if ((proxyResponse.getCode() == HttpStatus.SC_OK || proxyResponse.getCode() ==
|
||||
HttpStatus.SC_CREATED) && proxyResponse.getData().contains(Constants.VPP.TOTAL_PAGES)) {
|
||||
Gson gson = new Gson();
|
||||
VppItuneAssetResponseWrapper vppItuneAssetResponse = gson.fromJson
|
||||
(proxyResponse.getData(), VppItuneAssetResponseWrapper.class);
|
||||
if (vppItuneAssetResponse.getSize() > 0) {
|
||||
for (VppAssetDTO vppAssetDTO : vppItuneAssetResponse.getAssets()) {
|
||||
vppAssetDTO.setTenantId(PrivilegedCarbonContext
|
||||
.getThreadLocalCarbonContext().getTenantId());
|
||||
vppAssetDTO.setCreatedTime(String.valueOf(System.currentTimeMillis()));
|
||||
vppAssetDTO.setLastUpdatedTime(String.valueOf(System.currentTimeMillis()));
|
||||
}
|
||||
|
||||
for (VppAssetDTO vppAssetDTO : vppItuneAssetResponse.getAssets()) {
|
||||
ItuneAppDTO ituneAppDTO = lookupAsset(vppAssetDTO.getAdamId());
|
||||
ApplicationManagementUtil.persistApp(ituneAppDTO);
|
||||
List<Application> applications = ApplicationManagementUtil.getAppDetails(vppAssetDTO.getAdamId());
|
||||
for (Application application :applications) {
|
||||
VppAssetDTO vppAssetDTOs = getAssetByAppId(application.getId());
|
||||
if (vppAssetDTOs == null) {
|
||||
vppAssetDTOs = new VppAssetDTO();
|
||||
vppAssetDTO.setAppId(application.getId());
|
||||
try {
|
||||
ConnectionManagerUtil.beginDBTransaction();
|
||||
if (vppApplicationDAO.addAsset(vppAssetDTO, tenantId) != -1) {
|
||||
ConnectionManagerUtil.commitDBTransaction();
|
||||
}
|
||||
ConnectionManagerUtil.rollbackDBTransaction();
|
||||
} catch (ApplicationManagementDAOException e) {
|
||||
ConnectionManagerUtil.rollbackDBTransaction();
|
||||
String msg = "Error occurred while adding the Asset.";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
} catch (TransactionManagementException e) {
|
||||
String msg = "Error occurred while executing database transaction for adding Asset.";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
} catch (DBConnectionException e) {
|
||||
String msg = "Error occurred while retrieving the database connection for adding Asset.";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
} finally {
|
||||
ConnectionManagerUtil.closeDBConnection();
|
||||
}
|
||||
} else {
|
||||
vppAssetDTOs.setAppId(application.getId());
|
||||
vppAssetDTOs.setSupportedPlatforms(vppAssetDTO.getSupportedPlatforms());
|
||||
try {
|
||||
ConnectionManagerUtil.beginDBTransaction();
|
||||
if (vppApplicationDAO.updateAsset(vppAssetDTOs, tenantId) == null) {
|
||||
ConnectionManagerUtil.rollbackDBTransaction();
|
||||
String msg = "Unable to update the asset: " +vppAssetDTOs.getAdamId();
|
||||
log.error(msg);
|
||||
throw new ApplicationManagementException(msg);
|
||||
}
|
||||
ConnectionManagerUtil.commitDBTransaction();
|
||||
} catch (ApplicationManagementDAOException e) {
|
||||
ConnectionManagerUtil.rollbackDBTransaction();
|
||||
String msg = "Error occurred while updating the Asset.";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
} catch (TransactionManagementException e) {
|
||||
String msg = "Error occurred while executing database transaction for Asset update.";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
} catch (DBConnectionException e) {
|
||||
String msg = "Error occurred while retrieving the database connection for Asset update.";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
} finally {
|
||||
ConnectionManagerUtil.closeDBConnection();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (vppItuneAssetResponse.getCurrentPageIndex() == (vppItuneAssetResponse
|
||||
.getTotalPages() - 1)) {
|
||||
return;
|
||||
} else {
|
||||
syncAssets(vppItuneAssetResponse.getNextPageIndex());
|
||||
}
|
||||
}
|
||||
} catch (IOException e) {
|
||||
String msg = "Error while syncing VPP users with backend";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
}
|
||||
}
|
||||
|
||||
private ItuneAppDTO lookupAsset(String packageName) throws ApplicationManagementException {
|
||||
String lookupURL = LOOKUP_API + packageName + LOOKUP_API_PREFIX;
|
||||
try {
|
||||
ProxyResponse proxyResponse = callVPPBackend(lookupURL, null, getVppToken(), Constants.VPP.GET);
|
||||
if ((proxyResponse.getCode() == HttpStatus.SC_OK || proxyResponse.getCode() ==
|
||||
HttpStatus.SC_CREATED) && proxyResponse.getData().contains(Constants.VPP.GET_APP_DATA_RESPONSE_START)) {
|
||||
String responseData = proxyResponse.getData();
|
||||
JsonObject responseJson = new JsonParser().parse(responseData)
|
||||
.getAsJsonObject();
|
||||
|
||||
JsonObject results = responseJson.getAsJsonObject(Constants.ApplicationProperties.RESULTS);
|
||||
JsonObject result = results.getAsJsonObject(packageName);
|
||||
|
||||
String iconUrl = result.getAsJsonObject(Constants.ApplicationProperties.ARTWORK)
|
||||
.get(Constants.ApplicationProperties.URL).getAsString();
|
||||
int lastSlashIndex = iconUrl.lastIndexOf("/");
|
||||
if (lastSlashIndex != -1) {
|
||||
iconUrl = iconUrl.substring(0, lastSlashIndex + 1) + Constants.VPP.REMOTE_FILE_NAME;
|
||||
}
|
||||
|
||||
String descriptionStandard = result.getAsJsonObject(Constants.ApplicationProperties.DESCRIPTION)
|
||||
.get(Constants.ApplicationProperties.STANDARD).getAsString();
|
||||
if (descriptionStandard != null && !descriptionStandard.isEmpty()) {
|
||||
descriptionStandard = descriptionStandard.substring(0, 199);
|
||||
}
|
||||
String name = result.get(Constants.ApplicationProperties.NAME).getAsString();
|
||||
double price = result.getAsJsonArray(Constants.ApplicationProperties.OFFERS).get(0)
|
||||
.getAsJsonObject().get(Constants.ApplicationProperties.PRICE).getAsDouble();
|
||||
String version = result.getAsJsonArray(Constants.ApplicationProperties.OFFERS)
|
||||
.get(0).getAsJsonObject().get(Constants.ApplicationProperties.VERSION)
|
||||
.getAsJsonObject().get(Constants.ApplicationProperties.DISPLAY).getAsString();
|
||||
|
||||
String[] genreNames = new Gson().fromJson(result.getAsJsonArray(Constants.ApplicationProperties.GENRE_NAMES),
|
||||
String[].class);
|
||||
|
||||
ItuneAppDTO ituneAppDTO = new ItuneAppDTO();
|
||||
ituneAppDTO.setPackageName(packageName);
|
||||
ituneAppDTO.setVersion(version);
|
||||
ituneAppDTO.setDescription(descriptionStandard);
|
||||
ituneAppDTO.setTitle(name);
|
||||
|
||||
if (Constants.ApplicationProperties.PRICE_ZERO.equalsIgnoreCase(String.valueOf(price))) {
|
||||
ituneAppDTO.setPaymentMethod(Constants.ApplicationProperties.FREE_SUB_METHOD);
|
||||
} else {
|
||||
ituneAppDTO.setPaymentMethod(Constants.ApplicationProperties.PAID_SUB_METHOD);
|
||||
}
|
||||
ituneAppDTO.setIconURL(iconUrl);
|
||||
ituneAppDTO.setCategory(genreNames[0]);
|
||||
|
||||
return ituneAppDTO;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
String msg = "Error while looking up the app details";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public VppAssetDTO getAssetByAppId(int appId) throws ApplicationManagementException {
|
||||
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
|
||||
try {
|
||||
ConnectionManagerUtil.openDBConnection();
|
||||
return vppApplicationDAO.getAssetByAppId(appId, tenantId);
|
||||
} catch (DBConnectionException e) {
|
||||
String msg = "DB Connection error occurs while getting asset related to app with app id " + appId + ".";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
} catch (ApplicationManagementDAOException e) {
|
||||
String msg = "Error occurred while getting asset data related to app with app id " + appId + ".";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
} finally {
|
||||
ConnectionManagerUtil.closeDBConnection();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean addAssociation(VppAssetDTO asset, List<VppUserDTO> vppUsers) throws
|
||||
ApplicationManagementException {
|
||||
|
||||
List<VppAssociationDTO> associations = new ArrayList<>(); // To save to UEM DBs
|
||||
List<String> clientUserIds = new ArrayList<>(); // Need this to send to vpp backend.
|
||||
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
|
||||
if (asset != null) {
|
||||
for (VppUserDTO vppUserDTO : vppUsers) {
|
||||
VppAssociationDTO associationDTO = VppHttpUtil.getAssociation(vppUserDTO, asset);
|
||||
associations.add(associationDTO);
|
||||
clientUserIds.add(vppUserDTO.getClientUserId());
|
||||
}
|
||||
|
||||
if (associations.size() > 0) {
|
||||
//TODO: Add or Update associations
|
||||
try {
|
||||
|
||||
// Create the VPP backend payload
|
||||
List<VppItuneAssetDTO> assets = new ArrayList<>();
|
||||
VppItuneAssetDTO assetDTO = new VppItuneAssetDTO();
|
||||
assetDTO.setAdamId(asset.getAdamId());
|
||||
assetDTO.setPricingParam(asset.getPricingParam());
|
||||
assets.add(assetDTO);
|
||||
|
||||
VppAssociateRequestWrapper vppAssociate = new VppAssociateRequestWrapper();
|
||||
vppAssociate.setAssets(assets);
|
||||
vppAssociate.setClientUserIds(clientUserIds);
|
||||
|
||||
Gson gson = new Gson();
|
||||
String payload = gson.toJson(vppAssociate);
|
||||
|
||||
ProxyResponse proxyResponse = callVPPBackend(ASSIGNMENTS_POST, payload, getVppToken(),
|
||||
Constants.VPP.POST);
|
||||
if ((proxyResponse.getCode() == HttpStatus.SC_OK || proxyResponse.getCode() ==
|
||||
HttpStatus.SC_CREATED) && proxyResponse.getData().contains(Constants.VPP.EVENT_ID)) {
|
||||
// Create assignment does not return any useful data. Its needed to call the backend again
|
||||
ProxyResponse getAssignmentResponse = callVPPBackend(ASSIGNMENTS_GET, null, getVppToken(), Constants.VPP.GET);
|
||||
if ((getAssignmentResponse.getCode() == HttpStatus.SC_OK || getAssignmentResponse.getCode() ==
|
||||
HttpStatus.SC_CREATED) && getAssignmentResponse.getData().contains(Constants.VPP.TOTAL_PAGES)) {
|
||||
// VppAssociateResponseWrapper vppAssociateResponseWrapper = gson.fromJson
|
||||
// (getAssignmentResponse.getData(), VppAssociateResponseWrapper.class);
|
||||
for (VppAssociationDTO association : associations) {
|
||||
|
||||
VppAssociationDTO vppAssociation = getAssociation(association.getAssetId(), association.getClientId());
|
||||
|
||||
if (vppAssociation == null) {
|
||||
try {
|
||||
ConnectionManagerUtil.beginDBTransaction();
|
||||
if (vppApplicationDAO.addAssociation(association, tenantId) != -1) {
|
||||
ConnectionManagerUtil.commitDBTransaction();
|
||||
return true;
|
||||
}
|
||||
ConnectionManagerUtil.rollbackDBTransaction();
|
||||
return false;
|
||||
} catch (ApplicationManagementDAOException e) {
|
||||
ConnectionManagerUtil.rollbackDBTransaction();
|
||||
String msg = "Error occurred while adding the Assignment.";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
} catch (TransactionManagementException e) {
|
||||
String msg = "Error occurred while executing database transaction for adding Assignment.";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
} catch (DBConnectionException e) {
|
||||
String msg = "Error occurred while retrieving the database connection for adding Assignment.";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
} finally {
|
||||
ConnectionManagerUtil.closeDBConnection();
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
ConnectionManagerUtil.beginDBTransaction();
|
||||
if (vppApplicationDAO.updateAssociation(association, tenantId) == null) {
|
||||
ConnectionManagerUtil.rollbackDBTransaction();
|
||||
String msg = "Unable to update the assignment: " +association.getAssetId();
|
||||
log.error(msg);
|
||||
throw new ApplicationManagementException(msg);
|
||||
}
|
||||
ConnectionManagerUtil.commitDBTransaction();
|
||||
return true;
|
||||
} catch (ApplicationManagementDAOException e) {
|
||||
ConnectionManagerUtil.rollbackDBTransaction();
|
||||
String msg = "Error occurred while updating the Asset.";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
} catch (TransactionManagementException e) {
|
||||
String msg = "Error occurred while executing database transaction for Asset update.";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
} catch (DBConnectionException e) {
|
||||
String msg = "Error occurred while retrieving the database connection for Asset update.";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
} finally {
|
||||
ConnectionManagerUtil.closeDBConnection();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} catch (IOException e) {
|
||||
String msg = "Error while adding associations";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public VppAssociationDTO getAssociation(int assetId, int userId) throws ApplicationManagementException {
|
||||
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
|
||||
try {
|
||||
ConnectionManagerUtil.openDBConnection();
|
||||
return vppApplicationDAO.getAssociation(assetId, userId, tenantId);
|
||||
} catch (DBConnectionException e) {
|
||||
String msg = "DB Connection error occurs while getting assignment related to user of id " + userId + ".";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
} catch (ApplicationManagementDAOException e) {
|
||||
String msg = "Error occurred while getting assignment data related to user of id " + userId + ".";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
} finally {
|
||||
ConnectionManagerUtil.closeDBConnection();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ProxyResponse callVPPBackend(String url,
|
||||
String payload,
|
||||
String accessToken,
|
||||
String method) throws IOException {
|
||||
return VppHttpUtil.execute(url, payload, accessToken, method);
|
||||
}
|
||||
|
||||
public String getVppToken() throws ApplicationManagementException {
|
||||
String token = "";
|
||||
MetadataManagementService meta = APIUtil.getMetadataManager();
|
||||
Metadata metadata = null;
|
||||
try {
|
||||
metadata = meta.retrieveMetadata("DEP_META_KEY");
|
||||
if (metadata != null) {
|
||||
|
||||
Gson g = new Gson();
|
||||
DepConfig depConfigs = g.fromJson(metadata.getMetaValue(), DepConfig.class);
|
||||
token = depConfigs.getVppToken();
|
||||
return token;
|
||||
}
|
||||
}catch (MetadataManagementException e) {
|
||||
String msg = "Error when retrieving metadata of vpp feature";
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
}
|
||||
return token;
|
||||
}
|
||||
|
||||
public VppAssociationDTO getUserAssociation(String adamId, String emmUsername) throws ApplicationManagementException {
|
||||
// Todo: Join the 3 tables and find a matching association
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@ -17,24 +17,25 @@
|
||||
*/
|
||||
package io.entgra.device.mgt.core.application.mgt.core.internal;
|
||||
|
||||
import io.entgra.device.mgt.core.application.mgt.common.services.SPApplicationManager;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.impl.AppmDataHandlerImpl;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.osgi.framework.BundleContext;
|
||||
import org.osgi.service.component.ComponentContext;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.config.LifecycleState;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.services.ApplicationManager;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.services.ApplicationStorageManager;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.services.AppmDataHandler;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.services.ReviewManager;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.services.SPApplicationManager;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.services.SubscriptionManager;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.services.VPPApplicationManager;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.config.ConfigurationManager;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.dao.common.ApplicationManagementDAOFactory;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.impl.AppmDataHandlerImpl;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.lifecycle.LifecycleStateManager;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.task.ScheduledAppSubscriptionTaskManager;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.util.ApplicationManagementUtil;
|
||||
import io.entgra.device.mgt.core.device.mgt.core.service.DeviceManagementProviderService;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.osgi.framework.BundleContext;
|
||||
import org.osgi.service.component.ComponentContext;
|
||||
import org.wso2.carbon.ndatasource.core.DataSourceService;
|
||||
import org.wso2.carbon.ntask.core.service.TaskService;
|
||||
import org.wso2.carbon.user.core.service.RealmService;
|
||||
@ -116,6 +117,12 @@ public class ApplicationManagementServiceComponent {
|
||||
DataHolder.getInstance().setConfigManager(configManager);
|
||||
bundleContext.registerService(AppmDataHandler.class.getName(), configManager, null);
|
||||
|
||||
// TODO: Get the new instance from extension like others
|
||||
VPPApplicationManager vppApplicationManager = ApplicationManagementUtil
|
||||
.getVPPManagerInstance();
|
||||
DataHolder.getInstance().setVppApplicationManager(vppApplicationManager);
|
||||
bundleContext.registerService(VPPApplicationManager.class.getName(), vppApplicationManager, null);
|
||||
|
||||
ScheduledAppSubscriptionTaskManager taskManager = new ScheduledAppSubscriptionTaskManager();
|
||||
taskManager.scheduleCleanupTask();
|
||||
|
||||
|
||||
@ -23,6 +23,7 @@ import io.entgra.device.mgt.core.application.mgt.common.services.AppmDataHandler
|
||||
import io.entgra.device.mgt.core.application.mgt.common.services.SPApplicationManager;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.services.ReviewManager;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.services.SubscriptionManager;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.services.VPPApplicationManager;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.lifecycle.LifecycleStateManager;
|
||||
import io.entgra.device.mgt.core.device.mgt.core.service.DeviceManagementProviderService;
|
||||
import org.wso2.carbon.ntask.core.service.TaskService;
|
||||
@ -39,6 +40,8 @@ public class DataHolder {
|
||||
|
||||
private SPApplicationManager SPApplicationManager;
|
||||
|
||||
private VPPApplicationManager vppApplicationManager;
|
||||
|
||||
private ApplicationManager applicationManager;
|
||||
|
||||
private ReviewManager reviewManager;
|
||||
@ -142,4 +145,12 @@ public class DataHolder {
|
||||
public void setISApplicationManager(SPApplicationManager SPApplicationManager) {
|
||||
this.SPApplicationManager = SPApplicationManager;
|
||||
}
|
||||
|
||||
public VPPApplicationManager getVppApplicationManager() {
|
||||
return vppApplicationManager;
|
||||
}
|
||||
|
||||
public void setVppApplicationManager(VPPApplicationManager vppApplicationManager) {
|
||||
this.vppApplicationManager = vppApplicationManager;
|
||||
}
|
||||
}
|
||||
|
||||
@ -72,6 +72,7 @@ public class APIUtil {
|
||||
private static volatile SubscriptionManager subscriptionManager;
|
||||
private static volatile ReviewManager reviewManager;
|
||||
private static volatile AppmDataHandler appmDataHandler;
|
||||
private static volatile VPPApplicationManager vppApplicationManager;
|
||||
private static volatile MetadataManagementService metadataManagementService;
|
||||
|
||||
public static SPApplicationManager getSPApplicationManager() {
|
||||
@ -114,6 +115,24 @@ public class APIUtil {
|
||||
return applicationManager;
|
||||
}
|
||||
|
||||
public static MetadataManagementService getMetadataManager() {
|
||||
if (metadataManagementService == null) {
|
||||
synchronized (APIUtil.class) {
|
||||
if (metadataManagementService == null) {
|
||||
PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext();
|
||||
metadataManagementService =
|
||||
(MetadataManagementService) ctx.getOSGiService(MetadataManagementService.class, null);
|
||||
if (metadataManagementService == null) {
|
||||
String msg = "MetadataManagement Manager service has not initialized.";
|
||||
log.error(msg);
|
||||
throw new IllegalStateException(msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return metadataManagementService;
|
||||
}
|
||||
|
||||
/**
|
||||
* To get the ApplicationDTO Storage Manager from the osgi context.
|
||||
* @return ApplicationStoreManager instance in the current osgi context.
|
||||
@ -202,6 +221,29 @@ public class APIUtil {
|
||||
return reviewManager;
|
||||
}
|
||||
|
||||
public static VPPApplicationManager getVPPManager() {
|
||||
try {
|
||||
if (vppApplicationManager == null) {
|
||||
synchronized (APIUtil.class) {
|
||||
if (vppApplicationManager == null) {
|
||||
vppApplicationManager = ApplicationManagementUtil.getVPPManagerInstance();
|
||||
if (vppApplicationManager == null) {
|
||||
String msg = "Vpp Manager service has not initialized.";
|
||||
log.error(msg);
|
||||
throw new IllegalStateException(msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
String msg = "Error occurred while getting the vpp manager";
|
||||
log.error(msg);
|
||||
throw new IllegalStateException(msg);
|
||||
}
|
||||
return vppApplicationManager;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* To get the DataHandler from the osgi context.
|
||||
* @return AppmDataHandler instance in the current osgi context.
|
||||
@ -426,9 +468,13 @@ public class APIUtil {
|
||||
}
|
||||
List<ApplicationRelease> applicationReleases = new ArrayList<>();
|
||||
if (ApplicationType.PUBLIC.toString().equals(applicationDTO.getType()) && application.getCategories()
|
||||
.contains("GooglePlaySyncedApp")) {
|
||||
.contains(Constants.GOOGLE_PLAY_SYNCED_APP)) {
|
||||
application.setAndroidEnterpriseApp(true);
|
||||
}
|
||||
if (ApplicationType.PUBLIC.toString().equals(applicationDTO.getType()) && application.getCategories()
|
||||
.contains(Constants.ApplicationProperties.APPLE_STORE_SYNCED_APP_CATEGORY)) {
|
||||
application.setExternalAppStoreApp(true);
|
||||
}
|
||||
for (ApplicationReleaseDTO applicationReleaseDTO : applicationDTO.getApplicationReleaseDTOs()) {
|
||||
applicationReleases.add(releaseDtoToRelease(applicationReleaseDTO));
|
||||
}
|
||||
|
||||
@ -18,15 +18,22 @@
|
||||
package io.entgra.device.mgt.core.application.mgt.core.util;
|
||||
|
||||
import io.entgra.device.mgt.core.application.mgt.common.ApplicationArtifact;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.config.ConfigurationManager;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.config.Extension;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.exception.BadRequestException;
|
||||
import io.entgra.device.mgt.core.device.mgt.common.Base64File;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.FileDataHolder;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.LifecycleChanger;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.ApplicationDTO;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.ItuneAppDTO;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.exception.ApplicationManagementException;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.exception.InvalidConfigurationException;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.exception.RequestValidatingException;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.response.Application;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.response.Category;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.services.ApplicationManager;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.services.ApplicationStorageManager;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.services.ReviewManager;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.services.SPApplicationManager;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.services.SubscriptionManager;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.services.VPPApplicationManager;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.wrapper.ApplicationUpdateWrapper;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.wrapper.ApplicationWrapper;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.wrapper.CustomAppReleaseWrapper;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.wrapper.CustomAppWrapper;
|
||||
@ -35,18 +42,34 @@ import io.entgra.device.mgt.core.application.mgt.common.wrapper.PublicAppRelease
|
||||
import io.entgra.device.mgt.core.application.mgt.common.wrapper.PublicAppWrapper;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.wrapper.WebAppReleaseWrapper;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.wrapper.WebAppWrapper;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.config.ConfigurationManager;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.config.Extension;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.exception.BadRequestException;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.impl.VppApplicationManagerImpl;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.lifecycle.LifecycleStateManager;
|
||||
import io.entgra.device.mgt.core.device.mgt.common.Base64File;
|
||||
import io.entgra.device.mgt.core.device.mgt.common.DeviceManagementConstants;
|
||||
import io.entgra.device.mgt.core.device.mgt.common.metadata.mgt.MetadataManagementService;
|
||||
import io.entgra.device.mgt.core.device.mgt.core.common.util.FileUtil;
|
||||
import io.entgra.device.mgt.core.device.mgt.core.metadata.mgt.MetadataManagementServiceImpl;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.exception.InvalidConfigurationException;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.services.ApplicationManager;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.services.ApplicationStorageManager;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.services.ReviewManager;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.services.SubscriptionManager;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.lifecycle.LifecycleStateManager;
|
||||
import io.entgra.device.mgt.core.device.mgt.core.common.util.FileUtil;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.nio.channels.Channels;
|
||||
import java.nio.channels.ReadableByteChannel;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Base64;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
@ -183,6 +206,10 @@ public class ApplicationManagementUtil {
|
||||
return getInstance(extension, LifecycleStateManager.class);
|
||||
}
|
||||
|
||||
public static VPPApplicationManager getVPPManagerInstance() {
|
||||
// TODO: implement as an extension
|
||||
return new VppApplicationManagerImpl();
|
||||
}
|
||||
/**
|
||||
* This is useful to delete application artifacts if any error occurred while creating release/application
|
||||
* after uploading the artifacts
|
||||
@ -247,4 +274,265 @@ public class ApplicationManagementUtil {
|
||||
throw new InvalidConfigurationException(msg, e);
|
||||
}
|
||||
}
|
||||
|
||||
public static void persistApp(ItuneAppDTO product) throws ApplicationManagementException {
|
||||
ApplicationManager applicationManager = APIUtil.getApplicationManager();
|
||||
List<Category> categories = applicationManager.getRegisteredCategories();
|
||||
if (product != null && product.getVersion() != null) {
|
||||
// Generate artifacts
|
||||
ApplicationArtifact applicationArtifact = generateArtifacts(product);
|
||||
|
||||
List<String> packageNamesOfApps = new ArrayList<>();
|
||||
packageNamesOfApps.add(product.getPackageName());
|
||||
|
||||
List<Application> existingApps = applicationManager.getApplications(packageNamesOfApps);
|
||||
|
||||
if (existingApps != null && existingApps.size() > 0) {
|
||||
Application app = existingApps.get(0);
|
||||
if (product.getPackageName().equals(app.getPackageName())) {
|
||||
ApplicationUpdateWrapper applicationUpdateWrapper = generatePubAppUpdateWrapper(product, categories);
|
||||
applicationManager.updateApplication(app.getId(), applicationUpdateWrapper);
|
||||
|
||||
PublicAppReleaseWrapper publicAppReleaseWrapper = new PublicAppReleaseWrapper();
|
||||
if (app.getSubMethod()
|
||||
.equalsIgnoreCase(Constants.ApplicationProperties.FREE_SUB_METHOD)) {
|
||||
publicAppReleaseWrapper.setPrice(0.0);
|
||||
} else {
|
||||
publicAppReleaseWrapper.setPrice(1.0);
|
||||
}
|
||||
|
||||
publicAppReleaseWrapper.setDescription(product.getDescription());
|
||||
publicAppReleaseWrapper.setReleaseType("ga");
|
||||
publicAppReleaseWrapper.setVersion(product.getVersion());
|
||||
publicAppReleaseWrapper.setSupportedOsVersions("4.0-12.3");
|
||||
applicationManager.updatePubAppRelease(app.getApplicationReleases().get(0).getUuid(),
|
||||
publicAppReleaseWrapper, applicationArtifact);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
|
||||
// Generate App wrapper
|
||||
PublicAppWrapper publicAppWrapper = generatePubAppWrapper(product, categories);
|
||||
PublicAppReleaseWrapper appReleaseWrapper = new PublicAppReleaseWrapper();
|
||||
|
||||
if (publicAppWrapper.getSubMethod()
|
||||
.equalsIgnoreCase(Constants.ApplicationProperties.FREE_SUB_METHOD)) {
|
||||
appReleaseWrapper.setPrice(0.0);
|
||||
} else {
|
||||
appReleaseWrapper.setPrice(1.0);
|
||||
}
|
||||
|
||||
appReleaseWrapper.setDescription(product.getDescription());
|
||||
appReleaseWrapper.setReleaseType("ga");
|
||||
appReleaseWrapper.setVersion(product.getVersion());
|
||||
appReleaseWrapper.setPackageName(product.getPackageName());
|
||||
appReleaseWrapper.setSupportedOsVersions("4.0-12.3");
|
||||
|
||||
publicAppWrapper.setPublicAppReleaseWrappers(
|
||||
Arrays.asList(new PublicAppReleaseWrapper[]{appReleaseWrapper}));
|
||||
|
||||
try {
|
||||
updateImages(appReleaseWrapper, applicationArtifact.getIconName(),
|
||||
applicationArtifact.getIconStream(), applicationArtifact.getScreenshots());
|
||||
|
||||
Application application = applicationManager.createApplication(publicAppWrapper, false);
|
||||
if (application != null && (application.getApplicationReleases().get(0).getCurrentStatus() == null
|
||||
|| application.getApplicationReleases().get(0).getCurrentStatus().equals("CREATED"))) {
|
||||
String uuid = application.getApplicationReleases().get(0).getUuid();
|
||||
LifecycleChanger lifecycleChanger = new LifecycleChanger();
|
||||
lifecycleChanger.setAction("IN-REVIEW");
|
||||
applicationManager.changeLifecycleState(uuid, lifecycleChanger);
|
||||
lifecycleChanger.setAction("APPROVED");
|
||||
applicationManager.changeLifecycleState(uuid, lifecycleChanger);
|
||||
lifecycleChanger.setAction("PUBLISHED");
|
||||
applicationManager.changeLifecycleState(uuid, lifecycleChanger);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
String msg = "Error while downloading images of release.";
|
||||
log.error(msg);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static PublicAppWrapper generatePubAppWrapper(ItuneAppDTO product, List<Category> categories) {
|
||||
PublicAppWrapper publicAppWrapper = new PublicAppWrapper();
|
||||
publicAppWrapper.setName(product.getTitle());
|
||||
publicAppWrapper.setDescription(product.getDescription());
|
||||
publicAppWrapper.setCategories(
|
||||
Collections.singletonList(Constants.ApplicationProperties.APPLE_STORE_SYNCED_APP_CATEGORY));//Default category
|
||||
for (Category category : categories) {
|
||||
if (product.getCategory() == null) {
|
||||
List<String> pubAppCategories = new ArrayList<>();
|
||||
pubAppCategories.add(Constants.ApplicationProperties.APPLE_STORE_SYNCED_APP_CATEGORY);
|
||||
publicAppWrapper.setCategories(pubAppCategories);
|
||||
break;
|
||||
} else if (product.getCategory().equalsIgnoreCase(category.getCategoryName())) {
|
||||
List<String> pubAppCategories = new ArrayList<>();
|
||||
pubAppCategories.add(category.getCategoryName());
|
||||
pubAppCategories.add(Constants.ApplicationProperties.APPLE_STORE_SYNCED_APP_CATEGORY);
|
||||
publicAppWrapper.setCategories(pubAppCategories);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (product.getPaymentMethod().equalsIgnoreCase(Constants.ApplicationProperties.FREE_SUB_METHOD)) {
|
||||
publicAppWrapper.setSubMethod(Constants.ApplicationProperties.FREE_SUB_METHOD);
|
||||
} else {
|
||||
publicAppWrapper.setSubMethod(Constants.ApplicationProperties.PAID_SUB_METHOD);
|
||||
}
|
||||
// TODO: purchase an app from app store and see how to capture the real value for price
|
||||
// field.
|
||||
publicAppWrapper.setPaymentCurrency("$");
|
||||
publicAppWrapper.setDeviceType(DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_IOS);
|
||||
return publicAppWrapper;
|
||||
}
|
||||
|
||||
private static ApplicationUpdateWrapper generatePubAppUpdateWrapper(ItuneAppDTO product, List<Category> categories) {
|
||||
ApplicationUpdateWrapper applicationUpdateWrapper = new ApplicationUpdateWrapper();
|
||||
applicationUpdateWrapper.setName(product.getTitle());
|
||||
applicationUpdateWrapper.setDescription(product.getDescription());
|
||||
applicationUpdateWrapper.setCategories(
|
||||
Collections.singletonList(Constants
|
||||
.ApplicationProperties.APPLE_STORE_SYNCED_APP_CATEGORY));//Default
|
||||
// add the default APPLE_STORE_SYNCED_APP_CATEGORY
|
||||
for (Category category : categories) {
|
||||
if (product.getCategory() == null) {
|
||||
List<String> pubAppCategories = new ArrayList<>();
|
||||
pubAppCategories.add(Constants.ApplicationProperties.APPLE_STORE_SYNCED_APP_CATEGORY);
|
||||
applicationUpdateWrapper.setCategories(pubAppCategories);
|
||||
break;
|
||||
} else if (product.getCategory().equalsIgnoreCase(category.getCategoryName())) {
|
||||
List<String> pubAppCategories = new ArrayList<>();
|
||||
pubAppCategories.add(category.getCategoryName());
|
||||
pubAppCategories.add(Constants.ApplicationProperties.APPLE_STORE_SYNCED_APP_CATEGORY);
|
||||
applicationUpdateWrapper.setCategories(pubAppCategories);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (product.getPaymentMethod().equalsIgnoreCase(Constants.ApplicationProperties.FREE_SUB_METHOD)) {
|
||||
applicationUpdateWrapper.setSubMethod(Constants.ApplicationProperties.FREE_SUB_METHOD);
|
||||
} else {
|
||||
applicationUpdateWrapper.setSubMethod(Constants.ApplicationProperties.PAID_SUB_METHOD);
|
||||
}
|
||||
// TODO: purchase an app from Playstore and see how to capture the real value for price field.
|
||||
applicationUpdateWrapper.setPaymentCurrency("$");
|
||||
return applicationUpdateWrapper;
|
||||
}
|
||||
|
||||
private static ApplicationArtifact generateArtifacts(ItuneAppDTO product) throws ApplicationManagementException {
|
||||
ApplicationArtifact applicationArtifact = new ApplicationArtifact();
|
||||
String prefix = product.getPackageName();
|
||||
try {
|
||||
String iconName = prefix + "_icon";
|
||||
applicationArtifact.setIconName(iconName);
|
||||
InputStream iconInputStream = getInputStream(iconName, product.getIconURL());
|
||||
applicationArtifact.setIconStream(iconInputStream);
|
||||
Map<String, InputStream> screenshotMap = new HashMap<>();
|
||||
// TODO: look for a way to get screenshots
|
||||
|
||||
for (int a = 0; a < 3; a++) {
|
||||
String screenshotName = product.getPackageName() + a;
|
||||
InputStream screenshotInputStream = getInputStream(screenshotName, product.getIconURL());
|
||||
screenshotMap.put(screenshotName, screenshotInputStream);
|
||||
}
|
||||
|
||||
applicationArtifact.setScreenshots(screenshotMap);
|
||||
return applicationArtifact;
|
||||
} catch (ApplicationManagementException e) {
|
||||
String msg = "Error occurred while generating Application artifact";
|
||||
log.error(msg);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
}
|
||||
}
|
||||
|
||||
private static InputStream getInputStream(String filename, String url) throws ApplicationManagementException {
|
||||
URL website;
|
||||
try {
|
||||
website = new URL(url);
|
||||
} catch (MalformedURLException e) {
|
||||
String msg = "Error occurred while converting the url " + url;
|
||||
log.error(msg);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
}
|
||||
ReadableByteChannel rbc = null;
|
||||
FileOutputStream fos = null;
|
||||
try {
|
||||
rbc = Channels.newChannel(website.openStream());
|
||||
fos = new FileOutputStream(System.getProperty("java.io.tmpdir")
|
||||
+ File.separator + filename);
|
||||
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
|
||||
} catch (IOException e) {
|
||||
String msg = "Error occurred while opening stream for url " + url;
|
||||
log.error(msg);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
} finally {
|
||||
try {
|
||||
fos.close();
|
||||
rbc.close();
|
||||
} catch (IOException e) {
|
||||
}
|
||||
}
|
||||
|
||||
File file = new File(System.getProperty("java.io.tmpdir") + File.separator + filename);
|
||||
InputStream targetStream;
|
||||
try {
|
||||
targetStream = new FileInputStream(file);
|
||||
} catch (FileNotFoundException e) {
|
||||
String msg = "Error occurred while reading the tmp file " + System.getProperty("java.io.tmpdir")
|
||||
+ File.separator + filename;
|
||||
log.error(msg);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
}
|
||||
file.deleteOnExit();
|
||||
return targetStream;
|
||||
}
|
||||
|
||||
private static void updateImages(PublicAppReleaseWrapper appReleaseWrapper, String iconName,
|
||||
InputStream iconStream, Map<String, InputStream>
|
||||
screenshotsMaps) throws IOException {
|
||||
List<Base64File> screenshots = new ArrayList<>();
|
||||
Base64File iconFile = new Base64File(iconName,
|
||||
convertStreamToBase64(iconStream));
|
||||
appReleaseWrapper.setIcon(iconFile);
|
||||
if (screenshotsMaps.size() > 0) {
|
||||
for (Map.Entry<String, InputStream> screenshotEntry : screenshotsMaps.entrySet()) {
|
||||
Base64File screenshot = new Base64File(screenshotEntry.getKey(),
|
||||
convertStreamToBase64(screenshotEntry.getValue()));
|
||||
screenshots.add(screenshot);
|
||||
}
|
||||
appReleaseWrapper.setScreenshots(screenshots);
|
||||
}
|
||||
}
|
||||
|
||||
private static String convertStreamToBase64(InputStream inputStream) throws IOException {
|
||||
final int bufLen = 4 * 0x400; // 4KB
|
||||
byte[] buf = new byte[bufLen];
|
||||
int readLen;
|
||||
|
||||
try {
|
||||
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
|
||||
while ((readLen = inputStream.read(buf, 0, bufLen)) != -1)
|
||||
outputStream.write(buf, 0, readLen);
|
||||
|
||||
return Base64.getEncoder().encodeToString(outputStream.toByteArray());
|
||||
}
|
||||
} catch (IOException e) {
|
||||
String msg = "Error while converting image to base64";
|
||||
log.error(msg);
|
||||
throw e;
|
||||
} finally {
|
||||
try {
|
||||
inputStream.close();
|
||||
} catch (IOException e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static List<Application> getAppDetails(String adamId) throws ApplicationManagementException {
|
||||
ApplicationManager applicationManager = APIUtil.getApplicationManager();
|
||||
List<String> packageNamesOfApps = new ArrayList<>();
|
||||
packageNamesOfApps.add(adamId);
|
||||
return applicationManager.getApplications(packageNamesOfApps);
|
||||
}
|
||||
}
|
||||
|
||||
@ -74,6 +74,7 @@ public class Constants {
|
||||
public static final String IS_USER_ABLE_TO_VIEW_ALL_ROLES = "isUserAbleToViewAllRoles";
|
||||
public static final String GOOGLE_PLAY_STORE_URL = "https://play.google.com/store/apps/details?id=";
|
||||
public static final String APPLE_STORE_URL = "https://itunes.apple.com/country/app/app-name/id";
|
||||
public static final String GOOGLE_PLAY_SYNCED_APP = "GooglePlaySyncedApp";
|
||||
|
||||
// Subscription task related constants
|
||||
public static final String SUBSCRIBERS = "SUBSCRIBERS";
|
||||
@ -101,6 +102,25 @@ public class Constants {
|
||||
}
|
||||
public static final Map<String, String> AGENT_FILE_NAMES = Collections.unmodifiableMap(AGENT_DATA);
|
||||
|
||||
public static final class VPP {
|
||||
public static final String GET = "GET";
|
||||
public static final String BEARER = "Bearer ";
|
||||
public static final String EXECUTOR_EXCEPTION_PREFIX = "ExecutorException-";
|
||||
public static final String TOKEN_IS_EXPIRED = "ACCESS_TOKEN_IS_EXPIRED";
|
||||
public static final int INTERNAL_ERROR_CODE = 500;
|
||||
public static final String POST = "POST";
|
||||
public static final String PUT = "PUT";
|
||||
public static final String DELETE = "DELETE";
|
||||
public static final String EVENT_ID = "eventId";
|
||||
public static final String CLIENT_USER_ID_PARAM = "?clientUserId=";
|
||||
public static final String TOTAL_PAGES = "totalPages";
|
||||
public static final String GET_APP_DATA_RESPONSE_START = "results";
|
||||
public static final String REMOTE_FILE_NAME = "512x512w.png";
|
||||
|
||||
private VPP() {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Database types supported by Application Management.
|
||||
@ -165,4 +185,31 @@ public class Constants {
|
||||
public static final String AUTHORIZATION = "Authorization";
|
||||
public static final String AUTHORIZATION_HEADER_VALUE = "Bearer ";
|
||||
}
|
||||
|
||||
public final class ApplicationProperties {
|
||||
private ApplicationProperties() {
|
||||
throw new AssertionError();
|
||||
}
|
||||
|
||||
public static final String NAME = "name";
|
||||
public static final String VERSION = "version";
|
||||
public static final String FREE_SUB_METHOD = "FREE";
|
||||
public static final String PAID_SUB_METHOD = "PAID";
|
||||
public static final String TYPE = "type";;
|
||||
public static final String PACKAGE_NAME = "packageName";
|
||||
public static final String APPLE_STORE_SYNCED_APP_CATEGORY = "AppleStoreSyncedApp";
|
||||
|
||||
public static final String RESULTS = "results";
|
||||
public static final String ARTWORK = "artwork";
|
||||
public static final String URL = "url";
|
||||
public static final String DESCRIPTION = "description";
|
||||
public static final String STANDARD = "standard";
|
||||
public static final String OFFERS = "offers";
|
||||
public static final String PRICE = "price";
|
||||
public static final String DISPLAY = "display";
|
||||
public static final String GENRE_NAMES = "genreNames";
|
||||
public static final String PRICE_ZERO = "0.0";
|
||||
public static final String ASSOCIATION_DEVICE = "ASSOCIATION_DEVICE";
|
||||
public static final String ASSOCIATION_USER = "ASSOCIATION_USER";
|
||||
}
|
||||
}
|
||||
|
||||
@ -19,30 +19,28 @@ package io.entgra.device.mgt.core.application.mgt.core.util;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.reflect.TypeToken;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.IdentityServerDTO;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.*;
|
||||
import io.entgra.device.mgt.core.application.mgt.core.exception.UnexpectedServerErrorException;
|
||||
import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.Activity;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.json.JSONException;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.ExecutionStatus;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.SubscriptionType;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.ApplicationDTO;
|
||||
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.ApplicationReleaseDTO;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.DeviceSubscriptionDTO;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.ReviewDTO;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.ScheduledSubscriptionDTO;
|
||||
import io.entgra.device.mgt.core.device.mgt.common.DeviceIdentifier;
|
||||
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.sql.Timestamp;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.time.Instant;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Date;
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@ -241,6 +239,26 @@ public class DAOUtil {
|
||||
return applicationDTOs.get(0);
|
||||
}
|
||||
|
||||
public static ApplicationDTO loadDeviceApp(ResultSet rs) throws SQLException {
|
||||
ApplicationDTO application = new ApplicationDTO();
|
||||
application.setId( rs.getInt("APP_ID"));
|
||||
application.setName(rs.getString("APP_NAME"));
|
||||
application.setDescription(rs.getString("APP_DESCRIPTION"));
|
||||
application.setType(rs.getString("APP_TYPE"));
|
||||
application.setSubType(rs.getString("APP_SUB_TYPE"));
|
||||
application.setPaymentCurrency(rs.getString("APP_CURRENCY"));
|
||||
application.setStatus(rs.getString("APP_STATUS"));
|
||||
application.setAppRating(rs.getDouble("APP_RATING"));
|
||||
application.setDeviceTypeId(rs.getInt("APP_DEVICE_TYPE_ID"));
|
||||
ApplicationReleaseDTO releaseDTO = constructAppReleaseDTO(rs);
|
||||
List<ApplicationReleaseDTO> releaseDtoList = new ArrayList<>();
|
||||
if (releaseDTO != null) {
|
||||
releaseDtoList.add(constructAppReleaseDTO(rs));
|
||||
application.setApplicationReleaseDTOs(releaseDtoList);
|
||||
}
|
||||
return application;
|
||||
}
|
||||
|
||||
/**
|
||||
* Populates {@link ApplicationReleaseDTO} object with the result obtained from the database.
|
||||
*
|
||||
@ -344,6 +362,185 @@ public class DAOUtil {
|
||||
return subscriptionDTOS;
|
||||
}
|
||||
|
||||
public static Activity loadOperationActivity(ResultSet rs) throws SQLException, UnexpectedServerErrorException {
|
||||
List<Activity> activity = loadOperationActivities(rs);
|
||||
if (activity.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
if (activity.size() > 1) {
|
||||
String msg = "Internal server error. Found more than one app for operation";
|
||||
log.error(msg);
|
||||
throw new UnexpectedServerErrorException(msg);
|
||||
}
|
||||
return activity.get(0);
|
||||
}
|
||||
|
||||
public static List<Activity> loadOperationActivities (ResultSet rs) throws SQLException {
|
||||
List<Activity> activities = new ArrayList<>();
|
||||
while (rs.next()) {
|
||||
Activity activity = new Activity();
|
||||
activity.setAppName(rs.getString("NAME"));
|
||||
activity.setAppType(rs.getString("TYPE"));
|
||||
activity.setUsername(rs.getString("SUBSCRIBED_BY"));
|
||||
activity.setPackageName(rs.getString("PACKAGE_NAME"));
|
||||
activity.setStatus(rs.getString("STATUS"));
|
||||
activity.setVersion(rs.getString("VERSION"));
|
||||
activity.setTriggeredBy(rs.getString("ACTION_TRIGGERED_FROM"));
|
||||
activities.add(activity);
|
||||
}
|
||||
return activities;
|
||||
}
|
||||
|
||||
public static VppUserDTO loadVppUser(ResultSet rs) throws SQLException, UnexpectedServerErrorException {
|
||||
List<VppUserDTO> vppUserDTOS = loadVppUsers(rs);
|
||||
if (vppUserDTOS.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
if (vppUserDTOS.size() > 1) {
|
||||
String msg = "Internal server error. Found more than one vpp user for requested emmUsername";
|
||||
log.error(msg);
|
||||
throw new UnexpectedServerErrorException(msg);
|
||||
}
|
||||
return vppUserDTOS.get(0);
|
||||
}
|
||||
|
||||
public static List<VppUserDTO> loadVppUsers (ResultSet rs) throws SQLException {
|
||||
List<VppUserDTO> vppUserDTOS = new ArrayList<>();
|
||||
while (rs.next()) {
|
||||
VppUserDTO vppUserDTO = new VppUserDTO();
|
||||
vppUserDTO.setId(rs.getInt("ID"));
|
||||
vppUserDTO.setClientUserId(rs.getString("CLIENT_USER_ID"));
|
||||
vppUserDTO.setTenantId(rs.getInt("TENANT_ID"));
|
||||
vppUserDTO.setEmail(rs.getString("EMAIL"));
|
||||
vppUserDTO.setInviteCode(rs.getString("INVITE_CODE"));
|
||||
if (columnExist(rs,"STATUS")) {
|
||||
vppUserDTO.setStatus(rs.getString("STATUS"));
|
||||
}
|
||||
if (columnExist(rs,"MANAGED_ID")) {
|
||||
vppUserDTO.setManagedId(rs.getString("MANAGED_ID"));
|
||||
}
|
||||
if (columnExist(rs,"TEMP_PASSWORD")) {
|
||||
vppUserDTO.setTmpPassword(rs.getString("TEMP_PASSWORD"));
|
||||
}
|
||||
if (columnExist(rs,"DM_USERNAME")) {
|
||||
vppUserDTO.setDmUsername(rs.getString("DM_USERNAME"));
|
||||
}
|
||||
if (rs.getLong("CREATED_TIME") != 0) {
|
||||
Date date = new Date(rs.getLong("CREATED_TIME"));
|
||||
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||
String dateString = dateFormat.format(date);
|
||||
vppUserDTO.setCreatedTime(dateString);
|
||||
}
|
||||
if (rs.getLong("LAST_UPDATED_TIME") != 0) {
|
||||
Date date = new Date(rs.getLong("LAST_UPDATED_TIME"));
|
||||
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||
String dateString = dateFormat.format(date);
|
||||
vppUserDTO.setLastUpdatedTime(dateString);
|
||||
}
|
||||
vppUserDTOS.add(vppUserDTO);
|
||||
}
|
||||
return vppUserDTOS;
|
||||
}
|
||||
|
||||
private static boolean columnExist(ResultSet rs, String column){
|
||||
try{
|
||||
rs.findColumn(column);
|
||||
return true;
|
||||
} catch (SQLException sqlex){
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public static VppAssetDTO loadAsset(ResultSet rs) throws SQLException, UnexpectedServerErrorException {
|
||||
List<VppAssetDTO> vppAssetDTOS = loadAssets(rs);
|
||||
if (vppAssetDTOS.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
if (vppAssetDTOS.size() > 1) {
|
||||
String msg = "Internal server error. Found more than one asset for given app id.";
|
||||
log.error(msg);
|
||||
throw new UnexpectedServerErrorException(msg);
|
||||
}
|
||||
return vppAssetDTOS.get(0);
|
||||
}
|
||||
|
||||
public static List<VppAssetDTO> loadAssets (ResultSet rs) throws SQLException {
|
||||
List<VppAssetDTO> vppAssetDTOS = new ArrayList<>();
|
||||
while (rs.next()) {
|
||||
VppAssetDTO vppAssetDTO = new VppAssetDTO();
|
||||
vppAssetDTO.setId(rs.getInt("ID"));
|
||||
vppAssetDTO.setAppId(rs.getInt("APP_ID"));
|
||||
vppAssetDTO.setTenantId(rs.getInt("TENANT_ID"));
|
||||
if (rs.getLong("CREATED_TIME") != 0) {
|
||||
Date date = new Date(rs.getLong("CREATED_TIME"));
|
||||
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||
String dateString = dateFormat.format(date);
|
||||
vppAssetDTO.setCreatedTime(dateString);
|
||||
}
|
||||
if (rs.getLong("LAST_UPDATED_TIME") != 0) {
|
||||
Date date = new Date(rs.getLong("LAST_UPDATED_TIME"));
|
||||
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||
String dateString = dateFormat.format(date);
|
||||
vppAssetDTO.setLastUpdatedTime(dateString);
|
||||
}
|
||||
vppAssetDTO.setAdamId(rs.getString("ADAM_ID"));
|
||||
vppAssetDTO.setAssignedCount(rs.getString("ASSIGNED_COUNT"));
|
||||
vppAssetDTO.setDeviceAssignable(rs.getString("DEVICE_ASSIGNABLE"));
|
||||
vppAssetDTO.setPricingParam(rs.getString("PRICING_PARAMS"));
|
||||
vppAssetDTO.setProductType(rs.getString("PRODUCT_TYPE"));
|
||||
vppAssetDTO.setRetiredCount(rs.getString("RETIRED_COUNT"));
|
||||
vppAssetDTO.setRevocable(rs.getString("REVOCABLE"));
|
||||
// String jsonString = rs.getString("SUPPORTED_PLATFORMS");
|
||||
// ObjectMapper objectMapper = new ObjectMapper();
|
||||
// try {
|
||||
// List<String> platformList = objectMapper.readValue(jsonString, new TypeReference<List<String>>() {});
|
||||
// vppAssetDTO.setSupportedPlatforms(platformList);
|
||||
// } catch (IOException e) {
|
||||
// e.printStackTrace();
|
||||
// }
|
||||
vppAssetDTOS.add(vppAssetDTO);
|
||||
}
|
||||
return vppAssetDTOS;
|
||||
}
|
||||
|
||||
public static VppAssociationDTO loadAssignment(ResultSet rs) throws SQLException, UnexpectedServerErrorException {
|
||||
List<VppAssociationDTO> vppAssociationDTOS = loadAssignments(rs);
|
||||
if (vppAssociationDTOS.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
if (vppAssociationDTOS.size() > 1) {
|
||||
String msg = "Internal server error. Found more than one asset for given app id.";
|
||||
log.error(msg);
|
||||
throw new UnexpectedServerErrorException(msg);
|
||||
}
|
||||
return vppAssociationDTOS.get(0);
|
||||
}
|
||||
|
||||
public static List<VppAssociationDTO> loadAssignments (ResultSet rs) throws SQLException {
|
||||
List<VppAssociationDTO> vppAssociationDTOS = new ArrayList<>();
|
||||
while (rs.next()) {
|
||||
VppAssociationDTO vppAssociationDTO = new VppAssociationDTO();
|
||||
vppAssociationDTO.setId(rs.getInt("ID"));
|
||||
vppAssociationDTO.setAssociationType(rs.getString("ASSOCIATION_TYPE"));
|
||||
if (rs.getLong("CREATED_TIME") != 0) {
|
||||
Date date = new Date(rs.getLong("CREATED_TIME"));
|
||||
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||
String dateString = dateFormat.format(date);
|
||||
vppAssociationDTO.setCreatedTime(dateString);
|
||||
}
|
||||
if (rs.getLong("LAST_UPDATED_TIME") != 0) {
|
||||
Date date = new Date(rs.getLong("LAST_UPDATED_TIME"));
|
||||
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||
String dateString = dateFormat.format(date);
|
||||
vppAssociationDTO.setLastUpdatedTime(dateString);
|
||||
}
|
||||
vppAssociationDTO.setPricingParam(rs.getString("PRICING_PARAMS"));
|
||||
vppAssociationDTOS.add(vppAssociationDTO);
|
||||
}
|
||||
return vppAssociationDTOS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Cleans up the statement and resultset after executing the query
|
||||
*
|
||||
|
||||
@ -0,0 +1,305 @@
|
||||
/*
|
||||
* Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
|
||||
*
|
||||
* Entgra (Pvt) Ltd. 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 io.entgra.device.mgt.core.application.mgt.core.util;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.ProxyResponse;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.VppAssetDTO;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.VppAssociationDTO;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.dto.VppUserDTO;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.apache.http.Consts;
|
||||
import org.apache.http.HttpEntity;
|
||||
import org.apache.http.HttpHeaders;
|
||||
import org.apache.http.HttpResponse;
|
||||
import org.apache.http.HttpStatus;
|
||||
import org.apache.http.client.methods.HttpGet;
|
||||
import org.apache.http.client.methods.HttpPost;
|
||||
import org.apache.http.client.methods.HttpPut;
|
||||
import org.apache.http.client.methods.HttpRequestBase;
|
||||
import org.apache.http.entity.ContentType;
|
||||
import org.apache.http.entity.StringEntity;
|
||||
import org.apache.http.impl.client.CloseableHttpClient;
|
||||
import org.apache.http.impl.client.HttpClients;
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
import org.wso2.carbon.context.PrivilegedCarbonContext;
|
||||
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.PrintWriter;
|
||||
|
||||
public class VppHttpUtil {
|
||||
private static final Log log = LogFactory.getLog(VppHttpUtil.class);
|
||||
|
||||
public static ProxyResponse execute(String url,
|
||||
String payload,
|
||||
String accessToken,
|
||||
String method) throws IOException {
|
||||
|
||||
HttpRequestBase endpoint = null;
|
||||
if (Constants.VPP.GET.equalsIgnoreCase(method) || Constants.VPP.DELETE.equalsIgnoreCase(method)) {
|
||||
endpoint = new HttpGet(url);
|
||||
addHeaders(endpoint, accessToken);
|
||||
return VppHttpUtil.execute(endpoint);
|
||||
} else if (Constants.VPP.POST.equalsIgnoreCase(method)) {
|
||||
endpoint = new HttpPost(url);
|
||||
} else if (Constants.VPP.PUT.equalsIgnoreCase(method)) {
|
||||
endpoint = new HttpPut(url);
|
||||
}
|
||||
addHeaders(endpoint, accessToken);
|
||||
|
||||
|
||||
if (payload != null) {
|
||||
HttpEntity forwardRequestBody = new StringEntity(payload, ContentType.APPLICATION_JSON.toString(), "utf-8");
|
||||
if (Constants.VPP.POST.equalsIgnoreCase(method)) {
|
||||
((HttpPost) endpoint).setEntity(forwardRequestBody);
|
||||
} else if (Constants.VPP.PUT.equalsIgnoreCase(method)) {
|
||||
((HttpPut) endpoint).setEntity(forwardRequestBody);
|
||||
}
|
||||
|
||||
}
|
||||
if (log.isDebugEnabled()) {
|
||||
log.info("Forwarding request to " + url);
|
||||
}
|
||||
return VppHttpUtil.execute(endpoint);
|
||||
}
|
||||
|
||||
private static void addHeaders(HttpRequestBase endpoint, String accessToken) {
|
||||
endpoint.setHeader(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON.toString());
|
||||
endpoint.setHeader(HttpHeaders.ACCEPT, ContentType.APPLICATION_JSON.toString());
|
||||
endpoint.setHeader(HttpHeaders.AUTHORIZATION, Constants.VPP.BEARER + accessToken);
|
||||
}
|
||||
|
||||
|
||||
/***
|
||||
*
|
||||
* @param httpRequest - httpMethod e.g:- HttpPost, HttpGet
|
||||
* @return response as string
|
||||
* @throws IOException IO exception returns if error occurs when executing the httpMethod
|
||||
*/
|
||||
private static ProxyResponse execute(HttpRequestBase httpRequest) throws IOException {
|
||||
try (CloseableHttpClient client = getHttpClient()) {
|
||||
HttpResponse response = client.execute(httpRequest);
|
||||
ProxyResponse proxyResponse = new ProxyResponse();
|
||||
|
||||
if (response == null) {
|
||||
log.error("Received null response for http request : " + httpRequest.getMethod() + " " + httpRequest
|
||||
.getURI().toString());
|
||||
proxyResponse.setCode(Constants.VPP.INTERNAL_ERROR_CODE);
|
||||
proxyResponse.setExecutorResponse(Constants.VPP.EXECUTOR_EXCEPTION_PREFIX + getStatusKey(
|
||||
Constants.VPP.INTERNAL_ERROR_CODE));
|
||||
return proxyResponse;
|
||||
} else {
|
||||
int statusCode = response.getStatusLine().getStatusCode();
|
||||
try (BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()))) {
|
||||
StringBuilder result = new StringBuilder();
|
||||
String line;
|
||||
while ((line = rd.readLine()) != null) {
|
||||
result.append(line);
|
||||
}
|
||||
|
||||
String jsonString = result.toString();
|
||||
if (statusCode == HttpStatus.SC_OK || statusCode == HttpStatus.SC_CREATED) {
|
||||
proxyResponse.setCode(statusCode);
|
||||
proxyResponse.setData(jsonString);
|
||||
proxyResponse.setExecutorResponse("SUCCESS");
|
||||
return proxyResponse;
|
||||
} else if (statusCode == HttpStatus.SC_UNAUTHORIZED) {
|
||||
if (jsonString.contains("Access token expired") || jsonString
|
||||
.contains("Invalid input. Access token validation failed")) {
|
||||
proxyResponse.setCode(statusCode);
|
||||
proxyResponse.setExecutorResponse(Constants.VPP.TOKEN_IS_EXPIRED);
|
||||
return proxyResponse;
|
||||
} else {
|
||||
log.error(
|
||||
"Received " + statusCode + " response for http request : " + httpRequest.getMethod()
|
||||
+ " " + httpRequest.getURI().toString() + ". Error message: " + jsonString);
|
||||
proxyResponse.setCode(statusCode);
|
||||
proxyResponse.setData(jsonString);
|
||||
proxyResponse.setExecutorResponse(
|
||||
Constants.VPP.EXECUTOR_EXCEPTION_PREFIX + getStatusKey(statusCode));
|
||||
return proxyResponse;
|
||||
}
|
||||
}
|
||||
log.error("Received " + statusCode +
|
||||
" response for http request : " + httpRequest.getMethod() + " " + httpRequest.getURI()
|
||||
.toString() + ". Error message: " + jsonString);
|
||||
proxyResponse.setCode(statusCode);
|
||||
proxyResponse.setData(jsonString);
|
||||
proxyResponse
|
||||
.setExecutorResponse(Constants.VPP.EXECUTOR_EXCEPTION_PREFIX + getStatusKey(statusCode));
|
||||
return proxyResponse;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/***
|
||||
*
|
||||
* @param statusCode Provide status code, e.g:- 400, 401, 500 etc
|
||||
* @return relative status code key for given status code.
|
||||
*/
|
||||
public static String getStatusKey(int statusCode) {
|
||||
String statusCodeKey;
|
||||
|
||||
switch (statusCode) {
|
||||
case HttpStatus.SC_INTERNAL_SERVER_ERROR:
|
||||
statusCodeKey = "internalServerError";
|
||||
break;
|
||||
case HttpStatus.SC_BAD_REQUEST:
|
||||
statusCodeKey = "badRequest";
|
||||
break;
|
||||
case HttpStatus.SC_UNAUTHORIZED:
|
||||
statusCodeKey = "unauthorized";
|
||||
break;
|
||||
case HttpStatus.SC_FORBIDDEN:
|
||||
statusCodeKey = "forbidden";
|
||||
break;
|
||||
case HttpStatus.SC_NOT_FOUND:
|
||||
statusCodeKey = "notFound";
|
||||
break;
|
||||
case HttpStatus.SC_METHOD_NOT_ALLOWED:
|
||||
statusCodeKey = "methodNotAllowed";
|
||||
break;
|
||||
case HttpStatus.SC_NOT_ACCEPTABLE:
|
||||
statusCodeKey = "notAcceptable";
|
||||
break;
|
||||
case HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE:
|
||||
statusCodeKey = "unsupportedMediaType";
|
||||
break;
|
||||
default:
|
||||
statusCodeKey = "defaultPage";
|
||||
break;
|
||||
}
|
||||
return statusCodeKey;
|
||||
}
|
||||
|
||||
|
||||
/***
|
||||
* Handle error requests.
|
||||
*
|
||||
* @param resp {@link HttpServletResponse}
|
||||
* @param proxyResponse {@link ProxyResponse}
|
||||
* @throws IOException If error occurred when trying to send the error response.
|
||||
*/
|
||||
public static void handleError(HttpServletResponse resp, ProxyResponse proxyResponse) throws IOException {
|
||||
Gson gson = new Gson();
|
||||
if (proxyResponse == null) {
|
||||
proxyResponse = new ProxyResponse();
|
||||
proxyResponse.setCode(HttpStatus.SC_INTERNAL_SERVER_ERROR);
|
||||
proxyResponse.setExecutorResponse(Constants.VPP.EXECUTOR_EXCEPTION_PREFIX + VppHttpUtil
|
||||
.getStatusKey(Constants.VPP.INTERNAL_ERROR_CODE));
|
||||
}
|
||||
resp.setStatus(proxyResponse.getCode());
|
||||
resp.setContentType(ContentType.APPLICATION_JSON.getMimeType());
|
||||
resp.setCharacterEncoding(Consts.UTF_8.name());
|
||||
|
||||
proxyResponse.setExecutorResponse(null);
|
||||
try (PrintWriter writer = resp.getWriter()) {
|
||||
writer.write(gson.toJson(proxyResponse));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle error requests with custom error codes.
|
||||
*
|
||||
* @param resp {@link HttpServletResponse}
|
||||
* @param errorCode HTTP error status code
|
||||
* @throws IOException If error occurred when trying to send the error response.
|
||||
*/
|
||||
public static void handleError(HttpServletResponse resp, int errorCode)
|
||||
throws IOException {
|
||||
ProxyResponse proxyResponse = new ProxyResponse();
|
||||
proxyResponse.setCode(errorCode);
|
||||
proxyResponse.setExecutorResponse(
|
||||
Constants.VPP.EXECUTOR_EXCEPTION_PREFIX + VppHttpUtil.getStatusKey(errorCode));
|
||||
VppHttpUtil.handleError(resp, proxyResponse);
|
||||
}
|
||||
|
||||
/***
|
||||
*
|
||||
* @param resp {@link HttpServletResponse}
|
||||
* Return Success Response.
|
||||
*/
|
||||
public static void handleSuccess(HttpServletResponse resp, ProxyResponse proxyResponse) throws IOException {
|
||||
if (proxyResponse == null) {
|
||||
handleError(resp, null);
|
||||
return;
|
||||
}
|
||||
resp.setStatus(proxyResponse.getCode());
|
||||
resp.setContentType(ContentType.APPLICATION_JSON.getMimeType());
|
||||
resp.setCharacterEncoding(Consts.UTF_8.name());
|
||||
JSONObject response = new JSONObject();
|
||||
String responseData = proxyResponse.getData();
|
||||
|
||||
if (!StringUtils.isEmpty(responseData)) {
|
||||
try {
|
||||
if (responseData.startsWith("{")) {
|
||||
JSONObject responseDataJsonObj = new JSONObject(responseData);
|
||||
response.put("data", responseDataJsonObj);
|
||||
} else if (responseData.startsWith("[")) {
|
||||
JSONArray responseDataJsonArr = new JSONArray(responseData);
|
||||
response.put("data", responseDataJsonArr);
|
||||
} else {
|
||||
log.warn("Response data is not valid json string >> " + responseData);
|
||||
response.put("data", responseData);
|
||||
}
|
||||
} catch (JSONException e) {
|
||||
log.error("Response data is not passable");
|
||||
response.put("data", responseData);
|
||||
}
|
||||
}
|
||||
|
||||
try (PrintWriter writer = resp.getWriter()) {
|
||||
writer.write(response.toString());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve Http client based on hostname verification.
|
||||
*
|
||||
* @return {@link CloseableHttpClient} http client
|
||||
*/
|
||||
public static CloseableHttpClient getHttpClient() {
|
||||
return HttpClients.custom().setMaxConnTotal(1).setMaxConnPerRoute(1).build();
|
||||
}
|
||||
|
||||
public static VppAssociationDTO getAssociation(VppUserDTO user, VppAssetDTO asset) {
|
||||
VppAssociationDTO associationDTO = new VppAssociationDTO();
|
||||
associationDTO.setAdamId(asset.getAdamId());
|
||||
associationDTO.setClientUserId(user.getClientUserId());
|
||||
associationDTO.setPricingParam(asset.getPricingParam());
|
||||
associationDTO.setAssociationType(Constants.ApplicationProperties.ASSOCIATION_USER);
|
||||
|
||||
associationDTO.setAssetId(asset.getId());
|
||||
associationDTO.setClientId(user.getId());
|
||||
associationDTO.setTenantId(PrivilegedCarbonContext.getThreadLocalCarbonContext()
|
||||
.getTenantId(true));
|
||||
associationDTO.setCreatedTime(String.valueOf(System.currentTimeMillis()));
|
||||
associationDTO.setLastUpdatedTime(String.valueOf(System.currentTimeMillis()));
|
||||
return associationDTO;
|
||||
}
|
||||
|
||||
}
|
||||
@ -247,14 +247,15 @@ public interface CertificateManagementAdminService {
|
||||
*
|
||||
* @return paginated result of certificate.
|
||||
*/
|
||||
|
||||
@GET
|
||||
@ApiOperation(
|
||||
consumes = MediaType.APPLICATION_JSON,
|
||||
produces = MediaType.APPLICATION_JSON,
|
||||
httpMethod = "GET",
|
||||
value = "Getting Details of Certificates",
|
||||
notes = "Get all the details of the certificates you have used for mutual SSL. In a situation where you wish to "
|
||||
+ "view all the certificate details, it is not feasible to show all the details on one "
|
||||
value = "Getting Details of search Certificates",
|
||||
notes = "Get all the details of the search certificates you have used for mutual SSL. In a situation where you wish to "
|
||||
+ "view all the search certificate details, it is not feasible to show all the details on one "
|
||||
+ "page. Therefore, the details are paginated.",
|
||||
tags = "Certificate Management",
|
||||
extensions = {
|
||||
@ -307,6 +308,28 @@ public interface CertificateManagementAdminService {
|
||||
response = ErrorResponse.class)
|
||||
})
|
||||
Response getAllCertificates(
|
||||
@ApiParam(
|
||||
name = "serialNumber",
|
||||
value = "The serial number of the certificates",
|
||||
required = false)
|
||||
@QueryParam("serialNumber") String serialNumber,
|
||||
@ApiParam(
|
||||
name = "deviceIdentifier",
|
||||
value = "The device identifier of the certificates",
|
||||
required = false)
|
||||
@QueryParam("deviceIdentifier") String deviceIdentifier,
|
||||
@ApiParam(
|
||||
name = "username",
|
||||
value = "User name of the certificate added user",
|
||||
required = false)
|
||||
@QueryParam("username") String username,
|
||||
@ApiParam(
|
||||
name = "If-Modified-Since",
|
||||
value = "Checks if the requested variant was modified, since the specified date-time. \n" +
|
||||
"Provide the value in the following format: EEE, d MMM yyyy HH:mm:ss Z.\n" +
|
||||
"Example: Mon, 05 Jan 2014 15:10:00 +0200",
|
||||
required = false)
|
||||
@HeaderParam("If-Modified-Since") String ifModifiedSince,
|
||||
@ApiParam(
|
||||
name = "offset",
|
||||
value = "The starting pagination index for the complete list of qualified items.",
|
||||
@ -318,14 +341,7 @@ public interface CertificateManagementAdminService {
|
||||
value = "Provide how many certificate details you require from the starting pagination index/offset.",
|
||||
required = false,
|
||||
defaultValue = "5")
|
||||
@QueryParam("limit") int limit,
|
||||
@ApiParam(
|
||||
name = "If-Modified-Since",
|
||||
value = "Checks if the requested variant was modified, since the specified date-time. \n" +
|
||||
"Provide the value in the following format: EEE, d MMM yyyy HH:mm:ss Z.\n" +
|
||||
"Example: Mon, 05 Jan 2014 15:10:00 +0200",
|
||||
required = false)
|
||||
@HeaderParam("If-Modified-Since") String ifModifiedSince);
|
||||
@QueryParam("limit") int limit);
|
||||
|
||||
@DELETE
|
||||
@ApiOperation(
|
||||
|
||||
@ -18,7 +18,6 @@
|
||||
|
||||
package io.entgra.device.mgt.core.certificate.mgt.cert.admin.api.impl;
|
||||
|
||||
import javax.ws.rs.Consumes;
|
||||
import javax.ws.rs.DELETE;
|
||||
import javax.ws.rs.GET;
|
||||
import javax.ws.rs.HeaderParam;
|
||||
@ -26,7 +25,9 @@ import javax.ws.rs.POST;
|
||||
import javax.ws.rs.Path;
|
||||
import javax.ws.rs.PathParam;
|
||||
import javax.ws.rs.QueryParam;
|
||||
import javax.ws.rs.core.MediaType;
|
||||
|
||||
import io.entgra.device.mgt.core.device.mgt.common.CertificatePaginationRequest;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import io.entgra.device.mgt.core.certificate.mgt.cert.admin.api.CertificateManagementAdminService;
|
||||
@ -84,6 +85,13 @@ public class CertificateManagementAdminServiceImpl implements CertificateManagem
|
||||
certificate.setTenantId(PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId());
|
||||
certificate.setSerial(enrollmentCertificate.getSerial());
|
||||
certificate.setCertificate(certificateService.pemToX509Certificate(enrollmentCertificate.getPem()));
|
||||
CertificateResponse existingCertificate = certificateService.getCertificateBySerial(enrollmentCertificate.getSerial());
|
||||
if (existingCertificate != null) {
|
||||
return Response.status(Response.Status.BAD_REQUEST)
|
||||
.entity("Certificate with serial number " + enrollmentCertificate.getSerial() + " already exists.")
|
||||
.build();
|
||||
}
|
||||
|
||||
certificates.add(certificate);
|
||||
}
|
||||
certificateService.saveCertificate(certificates);
|
||||
@ -131,13 +139,27 @@ public class CertificateManagementAdminServiceImpl implements CertificateManagem
|
||||
*/
|
||||
@GET
|
||||
public Response getAllCertificates(
|
||||
@QueryParam("serialNumber") String serialNumber,
|
||||
@QueryParam("deviceIdentifier") String deviceIdentifier,
|
||||
@QueryParam("username") String username,
|
||||
@HeaderParam("If-Modified-Since") String ifModifiedSince,
|
||||
@QueryParam("offset") int offset,
|
||||
@QueryParam("limit") int limit,
|
||||
@HeaderParam("If-Modified-Since") String ifModifiedSince) {
|
||||
@QueryParam("limit") int limit) {
|
||||
RequestValidationUtil.validatePaginationInfo(offset, limit);
|
||||
CertificateManagementService certificateService = CertificateMgtAPIUtils.getCertificateManagementService();
|
||||
CertificatePaginationRequest request = new CertificatePaginationRequest(offset, limit);
|
||||
|
||||
if (StringUtils.isNotEmpty(serialNumber)) {
|
||||
request.setSerialNumber(serialNumber);
|
||||
}
|
||||
if (StringUtils.isNotEmpty(deviceIdentifier)){
|
||||
request.setDeviceIdentifier(deviceIdentifier);
|
||||
}
|
||||
if (StringUtils.isNotEmpty(username)){
|
||||
request.setUsername(username);
|
||||
}
|
||||
try {
|
||||
PaginationResult result = certificateService.getAllCertificates(offset, limit);
|
||||
PaginationResult result = certificateService.getAllCertificates(request);
|
||||
CertificateList certificates = new CertificateList();
|
||||
certificates.setCount(result.getRecordsTotal());
|
||||
certificates.setList((List<CertificateResponse>) result.getData());
|
||||
@ -155,6 +177,9 @@ public class CertificateManagementAdminServiceImpl implements CertificateManagem
|
||||
RequestValidationUtil.validateSerialNumber(serialNumber);
|
||||
|
||||
CertificateManagementService certificateService = CertificateMgtAPIUtils.getCertificateManagementService();
|
||||
try {
|
||||
boolean decision = certificateService.getValidateMetaValue();
|
||||
if (decision) {
|
||||
try {
|
||||
boolean status = certificateService.removeCertificate(serialNumber);
|
||||
if (!status) {
|
||||
@ -167,7 +192,19 @@ public class CertificateManagementAdminServiceImpl implements CertificateManagem
|
||||
serialNumber + "' has been removed").build();
|
||||
}
|
||||
} catch (CertificateManagementException e) {
|
||||
String msg = "Error occurred while converting PEM file to X509Certificate";
|
||||
String msg = "Error occurred while removing certificate with the given " +
|
||||
"serial number '" + serialNumber + "'";
|
||||
log.error(msg, e);
|
||||
return Response.serverError().entity(
|
||||
new ErrorResponse.ErrorResponseBuilder().setMessage(msg).build()).build();
|
||||
}
|
||||
} else {
|
||||
return Response.status(Response.Status.UNAUTHORIZED).entity(
|
||||
"User unauthorized to delete certificate with " +
|
||||
"serial number '" + serialNumber + "'").build();
|
||||
}
|
||||
} catch (CertificateManagementException e) {
|
||||
String msg = "Error occurred while getting the metadata entry for certificate deletion.";
|
||||
log.error(msg, e);
|
||||
return Response.serverError().entity(
|
||||
new ErrorResponse.ErrorResponseBuilder().setMessage(msg).build()).build();
|
||||
|
||||
@ -56,6 +56,7 @@
|
||||
<Import-Package>
|
||||
org.osgi.framework.*;version="${imp.package.version.osgi.framework}",
|
||||
org.osgi.service.*;version="${imp.package.version.osgi.service}",
|
||||
org.apache.commons.lang,
|
||||
org.apache.commons.logging,
|
||||
org.apache.commons.collections.map,
|
||||
javax.security.auth.x500,
|
||||
@ -95,7 +96,8 @@
|
||||
io.entgra.device.mgt.core.device.mgt.core.*,
|
||||
org.wso2.carbon.registry.indexing.*,
|
||||
javax.cache.*,
|
||||
javax.naming.ldap
|
||||
javax.naming.ldap,
|
||||
com.google.gson.*
|
||||
<!--org.bouncycastle.pkcs.jcajce-->
|
||||
</Import-Package>
|
||||
<Export-Package>
|
||||
@ -253,6 +255,10 @@
|
||||
<artifactId>slf4j-simple</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.googlecode.json-simple.wso2</groupId>
|
||||
<artifactId>json-simple</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
|
||||
|
||||
@ -18,8 +18,10 @@
|
||||
|
||||
package io.entgra.device.mgt.core.certificate.mgt.core.dao;
|
||||
|
||||
import io.entgra.device.mgt.core.device.mgt.common.CertificatePaginationRequest;
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.bean.Certificate;
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.dto.CertificateResponse;
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.exception.CertificateManagementException;
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.service.PaginationResult;
|
||||
|
||||
import java.util.List;
|
||||
@ -75,13 +77,12 @@ public interface CertificateDAO {
|
||||
/**
|
||||
* Get all the certificates in a paginated manner.
|
||||
*
|
||||
* @param rowNum Stating index of the paginated result.
|
||||
* @param limit Number of records to return.
|
||||
* @param request index of the paginated result.
|
||||
* @return Pagination result with data and the count of results.
|
||||
* @throws CertificateManagementDAOException
|
||||
*
|
||||
*/
|
||||
PaginationResult getAllCertificates(int rowNum, int limit) throws CertificateManagementDAOException;
|
||||
PaginationResult getAllCertificates(CertificatePaginationRequest request) throws CertificateManagementDAOException;
|
||||
|
||||
/**
|
||||
* Get all the certificates.
|
||||
@ -95,7 +96,7 @@ public interface CertificateDAO {
|
||||
/**
|
||||
* Delete a certificate identified by a serial number()
|
||||
*
|
||||
* @param serialNumber serial number
|
||||
* @param serialNumber number
|
||||
* @return whether the certificate was removed or not.
|
||||
*/
|
||||
boolean removeCertificate(String serialNumber) throws CertificateManagementDAOException;
|
||||
|
||||
@ -279,7 +279,7 @@ public abstract class AbstractCertificateDAOImpl implements CertificateDAO{
|
||||
|
||||
return stmt.executeUpdate() > 0;
|
||||
} catch (SQLException e) {
|
||||
String msg = "Unable to get the read the certificate with serial" + serialNumber;
|
||||
String msg = "Unable to get the read the certificate with serialNumber" + serialNumber;
|
||||
log.error(msg, e);
|
||||
throw new CertificateManagementDAOException(msg, e);
|
||||
} finally {
|
||||
|
||||
@ -18,13 +18,14 @@
|
||||
|
||||
package io.entgra.device.mgt.core.certificate.mgt.core.dao.impl;
|
||||
|
||||
import io.entgra.device.mgt.core.device.mgt.common.CertificatePaginationRequest;
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.dto.CertificateResponse;
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.impl.CertificateGenerator;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.dao.CertificateManagementDAOException;
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.dao.CertificateManagementDAOFactory;
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.dao.CertificateManagementDAOUtil;
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.service.PaginationResult;
|
||||
import org.wso2.carbon.context.PrivilegedCarbonContext;
|
||||
|
||||
@ -48,44 +49,132 @@ public class GenericCertificateDAOImpl extends AbstractCertificateDAOImpl {
|
||||
return CertificateManagementDAOFactory.getConnection();
|
||||
}
|
||||
|
||||
private int getCertificateCount(CertificatePaginationRequest request) throws CertificateManagementDAOException {
|
||||
int certificateCount = 0;
|
||||
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId();
|
||||
String serialNumber = request.getSerialNumber();
|
||||
String deviceIdentifier = request.getDeviceIdentifier();
|
||||
String username = request.getUsername();
|
||||
|
||||
try {
|
||||
Connection conn = this.getConnection();
|
||||
String sql = "SELECT COUNT(*) AS DEVICE_CERTIFICATE_COUNT " +
|
||||
"FROM DM_DEVICE_CERTIFICATE " +
|
||||
"WHERE TENANT_ID = ?";
|
||||
|
||||
if (StringUtils.isNotEmpty(serialNumber)) {
|
||||
sql += " AND SERIAL_NUMBER = ?";
|
||||
}
|
||||
|
||||
if (StringUtils.isNotEmpty(deviceIdentifier)) {
|
||||
sql += " AND DEVICE_IDENTIFIER = ?";
|
||||
}
|
||||
|
||||
if (StringUtils.isNotEmpty(username)) {
|
||||
sql += " AND USERNAME LIKE ?";
|
||||
}
|
||||
|
||||
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
|
||||
stmt.setInt(1, tenantId);
|
||||
|
||||
int paramIdx = 2;
|
||||
if (StringUtils.isNotEmpty(serialNumber)) {
|
||||
stmt.setString(paramIdx++, serialNumber);
|
||||
}
|
||||
|
||||
if (StringUtils.isNotEmpty(deviceIdentifier)) {
|
||||
stmt.setString(paramIdx++, deviceIdentifier);
|
||||
}
|
||||
|
||||
if (StringUtils.isNotEmpty(username)) {
|
||||
stmt.setString(paramIdx, "%" + username + "%");
|
||||
}
|
||||
try (ResultSet rs = stmt.executeQuery()) {
|
||||
if (rs.next()) {
|
||||
certificateCount = rs.getInt("DEVICE_CERTIFICATE_COUNT");
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
String errorMsg = "SQL error occurred while retrieving the certificate count.";
|
||||
log.error(errorMsg, e);
|
||||
throw new CertificateManagementDAOException(errorMsg, e);
|
||||
}
|
||||
return certificateCount;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public PaginationResult getAllCertificates(int rowNum, int limit) throws CertificateManagementDAOException {
|
||||
PreparedStatement stmt = null;
|
||||
ResultSet resultSet = null;
|
||||
public PaginationResult getAllCertificates(CertificatePaginationRequest request) throws CertificateManagementDAOException {
|
||||
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId();
|
||||
CertificateResponse certificateResponse;
|
||||
List<CertificateResponse> certificates = new ArrayList<>();
|
||||
PaginationResult paginationResult;
|
||||
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId();
|
||||
String serialNumber = request.getSerialNumber();
|
||||
String deviceIdentifier = request.getDeviceIdentifier();
|
||||
String username = request.getUsername();
|
||||
boolean isCertificateSerialNumberProvided = false;
|
||||
boolean isCertificateDeviceIdentifierProvided = false;
|
||||
boolean isCertificateUsernameProvided = false;
|
||||
|
||||
try {
|
||||
Connection conn = this.getConnection();
|
||||
String sql = "SELECT CERTIFICATE, SERIAL_NUMBER, TENANT_ID, USERNAME FROM "
|
||||
+ "DM_DEVICE_CERTIFICATE WHERE TENANT_ID = ? ORDER BY ID DESC LIMIT ?,?";
|
||||
stmt = conn.prepareStatement(sql);
|
||||
stmt.setInt(1, tenantId);
|
||||
stmt.setInt(2, rowNum);
|
||||
stmt.setInt(3, limit);
|
||||
resultSet = stmt.executeQuery();
|
||||
String query = "SELECT * " +
|
||||
"FROM DM_DEVICE_CERTIFICATE " +
|
||||
"WHERE TENANT_ID = ? ";
|
||||
|
||||
int resultCount = 0;
|
||||
if (StringUtils.isNotEmpty(serialNumber)) {
|
||||
query += "AND SERIAL_NUMBER = ? ";
|
||||
isCertificateSerialNumberProvided = true;
|
||||
}
|
||||
|
||||
if (StringUtils.isNotEmpty(deviceIdentifier)) {
|
||||
query += "AND DEVICE_IDENTIFIER = ? ";
|
||||
isCertificateDeviceIdentifierProvided = true;
|
||||
}
|
||||
|
||||
if (StringUtils.isNotEmpty(username)) {
|
||||
query += "AND USERNAME LIKE ? ";
|
||||
isCertificateUsernameProvided = true;
|
||||
}
|
||||
|
||||
query += "ORDER BY ID LIMIT ?,?";
|
||||
|
||||
try (PreparedStatement stmt = conn.prepareStatement(query)) {
|
||||
int paramIdx = 1;
|
||||
stmt.setInt(paramIdx++, tenantId);
|
||||
if (isCertificateSerialNumberProvided) {
|
||||
stmt.setString(paramIdx++, serialNumber);
|
||||
}
|
||||
if (isCertificateDeviceIdentifierProvided) {
|
||||
stmt.setString(paramIdx++, deviceIdentifier);
|
||||
}
|
||||
if (isCertificateUsernameProvided) {
|
||||
stmt.setString(paramIdx++, "%" + username + "%");
|
||||
}
|
||||
stmt.setInt(paramIdx++, request.getStartIndex());
|
||||
stmt.setInt(paramIdx++, request.getRowCount());
|
||||
try (ResultSet resultSet = stmt.executeQuery()) {
|
||||
while (resultSet.next()) {
|
||||
certificateResponse = new CertificateResponse();
|
||||
byte[] certificateBytes = resultSet.getBytes("CERTIFICATE");
|
||||
certificateResponse.setSerialNumber(resultSet.getString("SERIAL_NUMBER"));
|
||||
certificateResponse.setCertificateId(resultSet.getString("ID"));
|
||||
certificateResponse.setDeviceIdentifier(resultSet.getString("DEVICE_IDENTIFIER"));
|
||||
certificateResponse.setTenantId(resultSet.getInt("TENANT_ID"));
|
||||
certificateResponse.setUsername(resultSet.getString("USERNAME"));
|
||||
CertificateGenerator.extractCertificateDetails(certificateBytes, certificateResponse);
|
||||
certificates.add(certificateResponse);
|
||||
resultCount++;
|
||||
}
|
||||
paginationResult = new PaginationResult();
|
||||
paginationResult.setData(certificates);
|
||||
paginationResult.setRecordsTotal(resultCount);
|
||||
paginationResult.setRecordsTotal(this.getCertificateCount(request));
|
||||
}
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
String errorMsg = "SQL error occurred while retrieving the certificates.";
|
||||
log.error(errorMsg, e);
|
||||
throw new CertificateManagementDAOException(errorMsg, e);
|
||||
} finally {
|
||||
CertificateManagementDAOUtil.cleanupResources(stmt, resultSet);
|
||||
}
|
||||
return paginationResult;
|
||||
}
|
||||
|
||||
@ -18,13 +18,14 @@
|
||||
|
||||
package io.entgra.device.mgt.core.certificate.mgt.core.dao.impl;
|
||||
|
||||
import io.entgra.device.mgt.core.device.mgt.common.CertificatePaginationRequest;
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.dto.CertificateResponse;
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.impl.CertificateGenerator;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.dao.CertificateManagementDAOException;
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.dao.CertificateManagementDAOFactory;
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.dao.CertificateManagementDAOUtil;
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.service.PaginationResult;
|
||||
import org.wso2.carbon.context.PrivilegedCarbonContext;
|
||||
|
||||
@ -44,43 +45,75 @@ public class OracleCertificateDAOImpl extends AbstractCertificateDAOImpl {
|
||||
private static final Log log = LogFactory.getLog(OracleCertificateDAOImpl.class);
|
||||
|
||||
@Override
|
||||
public PaginationResult getAllCertificates(int rowNum, int limit) throws CertificateManagementDAOException {
|
||||
PreparedStatement stmt = null;
|
||||
ResultSet resultSet = null;
|
||||
public PaginationResult getAllCertificates(CertificatePaginationRequest request) throws CertificateManagementDAOException {
|
||||
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId();
|
||||
CertificateResponse certificateResponse;
|
||||
List<CertificateResponse> certificates = new ArrayList<>();
|
||||
PaginationResult paginationResult;
|
||||
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId();
|
||||
String serialNumber = request.getSerialNumber();
|
||||
String deviceIdentifier = request.getDeviceIdentifier();
|
||||
String username = request.getUsername();
|
||||
boolean isCertificateSerialNumberProvided = false;
|
||||
boolean isCertificateDeviceIdentifierProvided = false;
|
||||
boolean isCertificateUsernameProvided = false;
|
||||
|
||||
try {
|
||||
Connection conn = this.getConnection();
|
||||
String sql = "SELECT CERTIFICATE, SERIAL_NUMBER, TENANT_ID, USERNAME FROM "
|
||||
+ "DM_DEVICE_CERTIFICATE WHERE TENANT_ID = ? ORDER BY ID DESC OFFSET ? ROWS FETCH NEXT ? ROWS ONLY";
|
||||
stmt = conn.prepareStatement(sql);
|
||||
stmt.setInt(1, tenantId);
|
||||
stmt.setInt(2, rowNum);
|
||||
stmt.setInt(3, limit);
|
||||
resultSet = stmt.executeQuery();
|
||||
String query = "SELECT * " +
|
||||
"FROM DM_DEVICE_CERTIFICATE " +
|
||||
"WHERE TENANT_ID = ? ";
|
||||
if (StringUtils.isNotEmpty(serialNumber)) {
|
||||
query += "AND SERIAL_NUMBER = ? ";
|
||||
isCertificateSerialNumberProvided = true;
|
||||
}
|
||||
|
||||
int resultCount = 0;
|
||||
if (StringUtils.isNotEmpty(deviceIdentifier)) {
|
||||
query += "AND DEVICE_IDENTIFIER = ? ";
|
||||
isCertificateDeviceIdentifierProvided = true;
|
||||
}
|
||||
|
||||
if (StringUtils.isNotEmpty(username)) {
|
||||
query += "AND USERNAME LIKE ? ";
|
||||
isCertificateUsernameProvided = true;
|
||||
}
|
||||
|
||||
query += "ORDER BY ID OFFSET ? ROWS FETCH NEXT ? ROWS ONLY";
|
||||
|
||||
try (PreparedStatement stmt = conn.prepareStatement(query)) {
|
||||
int paramIdx = 1;
|
||||
stmt.setInt(paramIdx++, tenantId);
|
||||
if (isCertificateSerialNumberProvided) {
|
||||
stmt.setString(paramIdx++, serialNumber);
|
||||
}
|
||||
if (isCertificateDeviceIdentifierProvided) {
|
||||
stmt.setString(paramIdx++, deviceIdentifier);
|
||||
}
|
||||
if (isCertificateUsernameProvided) {
|
||||
stmt.setString(paramIdx++, "%" + username + "%");
|
||||
}
|
||||
stmt.setInt(paramIdx++, request.getStartIndex());
|
||||
stmt.setInt(paramIdx++, request.getRowCount());
|
||||
try (ResultSet resultSet = stmt.executeQuery()) {
|
||||
while (resultSet.next()) {
|
||||
certificateResponse = new CertificateResponse();
|
||||
byte[] certificateBytes = resultSet.getBytes("CERTIFICATE");
|
||||
certificateResponse.setSerialNumber(resultSet.getString("SERIAL_NUMBER"));
|
||||
certificateResponse.setCertificateId(resultSet.getString("ID"));
|
||||
certificateResponse.setDeviceIdentifier(resultSet.getString("DEVICE_IDENTIFIER"));
|
||||
certificateResponse.setTenantId(resultSet.getInt("TENANT_ID"));
|
||||
certificateResponse.setUsername(resultSet.getString("USERNAME"));
|
||||
CertificateGenerator.extractCertificateDetails(certificateBytes, certificateResponse);
|
||||
certificates.add(certificateResponse);
|
||||
resultCount++;
|
||||
}
|
||||
paginationResult = new PaginationResult();
|
||||
paginationResult.setData(certificates);
|
||||
paginationResult.setRecordsTotal(resultCount);
|
||||
paginationResult.setRecordsTotal(this.getCertificateCount(request));
|
||||
}
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
String errorMsg = "SQL error occurred while retrieving the certificates.";
|
||||
log.error(errorMsg, e);
|
||||
throw new CertificateManagementDAOException(errorMsg, e);
|
||||
} finally {
|
||||
CertificateManagementDAOUtil.cleanupResources(stmt, resultSet);
|
||||
}
|
||||
return paginationResult;
|
||||
}
|
||||
@ -88,4 +121,60 @@ public class OracleCertificateDAOImpl extends AbstractCertificateDAOImpl {
|
||||
private Connection getConnection() throws SQLException {
|
||||
return CertificateManagementDAOFactory.getConnection();
|
||||
}
|
||||
|
||||
private int getCertificateCount(CertificatePaginationRequest request) throws CertificateManagementDAOException {
|
||||
int certificateCount = 0;
|
||||
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId();
|
||||
String serialNumber = request.getSerialNumber();
|
||||
String deviceIdentifier = request.getDeviceIdentifier();
|
||||
String username = request.getUsername();
|
||||
|
||||
try {
|
||||
Connection conn = this.getConnection();
|
||||
String sql = "SELECT COUNT(*) AS DEVICE_CERTIFICATE_COUNT " +
|
||||
"FROM DM_DEVICE_CERTIFICATE " +
|
||||
"WHERE TENANT_ID = ?";
|
||||
|
||||
if (StringUtils.isNotEmpty(serialNumber)) {
|
||||
sql += " AND SERIAL_NUMBER = ?";
|
||||
}
|
||||
|
||||
if (StringUtils.isNotEmpty(deviceIdentifier)) {
|
||||
sql += " AND DEVICE_IDENTIFIER = ?";
|
||||
}
|
||||
|
||||
if (StringUtils.isNotEmpty(username)) {
|
||||
sql += " AND USERNAME LIKE ?";
|
||||
}
|
||||
|
||||
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
|
||||
stmt.setInt(1, tenantId);
|
||||
|
||||
int paramIdx = 2;
|
||||
if (StringUtils.isNotEmpty(serialNumber)) {
|
||||
stmt.setString(paramIdx++, serialNumber);
|
||||
}
|
||||
|
||||
if (StringUtils.isNotEmpty(deviceIdentifier)) {
|
||||
stmt.setString(paramIdx++, deviceIdentifier);
|
||||
}
|
||||
|
||||
if (StringUtils.isNotEmpty(username)) {
|
||||
stmt.setString(paramIdx, "%" + username + "%");
|
||||
}
|
||||
|
||||
try (ResultSet rs = stmt.executeQuery()) {
|
||||
if (rs.next()) {
|
||||
certificateCount = rs.getInt("DEVICE_CERTIFICATE_COUNT");
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
String errorMsg = "SQL error occurred while retrieving the certificate count.";
|
||||
log.error(errorMsg, e);
|
||||
throw new CertificateManagementDAOException(errorMsg, e);
|
||||
}
|
||||
return certificateCount;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -18,13 +18,14 @@
|
||||
|
||||
package io.entgra.device.mgt.core.certificate.mgt.core.dao.impl;
|
||||
|
||||
import io.entgra.device.mgt.core.device.mgt.common.CertificatePaginationRequest;
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.dto.CertificateResponse;
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.impl.CertificateGenerator;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.dao.CertificateManagementDAOException;
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.dao.CertificateManagementDAOFactory;
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.dao.CertificateManagementDAOUtil;
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.service.PaginationResult;
|
||||
import org.wso2.carbon.context.PrivilegedCarbonContext;
|
||||
|
||||
@ -44,43 +45,75 @@ public class PostgreSQLCertificateDAOImpl extends AbstractCertificateDAOImpl {
|
||||
private static final Log log = LogFactory.getLog(PostgreSQLCertificateDAOImpl.class);
|
||||
|
||||
@Override
|
||||
public PaginationResult getAllCertificates(int rowNum, int limit) throws CertificateManagementDAOException {
|
||||
PreparedStatement stmt = null;
|
||||
ResultSet resultSet = null;
|
||||
public PaginationResult getAllCertificates(CertificatePaginationRequest request) throws CertificateManagementDAOException {
|
||||
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId();
|
||||
CertificateResponse certificateResponse;
|
||||
List<CertificateResponse> certificates = new ArrayList<>();
|
||||
PaginationResult paginationResult;
|
||||
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId();
|
||||
String serialNumber = request.getSerialNumber();
|
||||
String deviceIdentifier = request.getDeviceIdentifier();
|
||||
String username = request.getUsername();
|
||||
boolean isCertificateSerialNumberProvided = false;
|
||||
boolean isCertificateDeviceIdentifierProvided = false;
|
||||
boolean isCertificateUsernameProvided = false;
|
||||
|
||||
try {
|
||||
Connection conn = this.getConnection();
|
||||
String sql = "SELECT CERTIFICATE, SERIAL_NUMBER, TENANT_ID, USERNAME FROM "
|
||||
+ "DM_DEVICE_CERTIFICATE WHERE TENANT_ID = ? ORDER BY ID DESC LIMIT ? OFFSET ?";
|
||||
stmt = conn.prepareStatement(sql);
|
||||
stmt.setInt(1, tenantId);
|
||||
stmt.setInt(2, limit);
|
||||
stmt.setInt(3, rowNum);
|
||||
resultSet = stmt.executeQuery();
|
||||
String query = "SELECT * " +
|
||||
"FROM DM_DEVICE_CERTIFICATE " +
|
||||
"WHERE TENANT_ID = ? ";
|
||||
if (StringUtils.isNotEmpty(serialNumber)) {
|
||||
query += "AND SERIAL_NUMBER = ? ";
|
||||
isCertificateSerialNumberProvided = true;
|
||||
}
|
||||
|
||||
int resultCount = 0;
|
||||
if (StringUtils.isNotEmpty(deviceIdentifier)) {
|
||||
query += "AND DEVICE_IDENTIFIER = ? ";
|
||||
isCertificateDeviceIdentifierProvided = true;
|
||||
}
|
||||
|
||||
if (StringUtils.isNotEmpty(username)) {
|
||||
query += "AND USERNAME LIKE ? ";
|
||||
isCertificateUsernameProvided = true;
|
||||
}
|
||||
|
||||
query += "ORDER BY ID LIMIT ? OFFSET ?";
|
||||
|
||||
try (PreparedStatement stmt = conn.prepareStatement(query)) {
|
||||
int paramIdx = 1;
|
||||
stmt.setInt(paramIdx++, tenantId);
|
||||
if (isCertificateSerialNumberProvided) {
|
||||
stmt.setString(paramIdx++, serialNumber);
|
||||
}
|
||||
if (isCertificateDeviceIdentifierProvided) {
|
||||
stmt.setString(paramIdx++, deviceIdentifier);
|
||||
}
|
||||
if (isCertificateUsernameProvided) {
|
||||
stmt.setString(paramIdx++, "%" + username + "%");
|
||||
}
|
||||
stmt.setInt(paramIdx++, request.getStartIndex());
|
||||
stmt.setInt(paramIdx++, request.getRowCount());
|
||||
try (ResultSet resultSet = stmt.executeQuery()) {
|
||||
while (resultSet.next()) {
|
||||
certificateResponse = new CertificateResponse();
|
||||
byte[] certificateBytes = resultSet.getBytes("CERTIFICATE");
|
||||
certificateResponse.setSerialNumber(resultSet.getString("SERIAL_NUMBER"));
|
||||
certificateResponse.setCertificateId(resultSet.getString("ID"));
|
||||
certificateResponse.setDeviceIdentifier(resultSet.getString("DEVICE_IDENTIFIER"));
|
||||
certificateResponse.setTenantId(resultSet.getInt("TENANT_ID"));
|
||||
certificateResponse.setUsername(resultSet.getString("USERNAME"));
|
||||
CertificateGenerator.extractCertificateDetails(certificateBytes, certificateResponse);
|
||||
certificates.add(certificateResponse);
|
||||
resultCount++;
|
||||
}
|
||||
paginationResult = new PaginationResult();
|
||||
paginationResult.setData(certificates);
|
||||
paginationResult.setRecordsTotal(resultCount);
|
||||
paginationResult.setRecordsTotal(this.getCertificateCount(request));
|
||||
}
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
String errorMsg = "SQL error occurred while retrieving the certificates.";
|
||||
log.error(errorMsg, e);
|
||||
throw new CertificateManagementDAOException(errorMsg, e);
|
||||
} finally {
|
||||
CertificateManagementDAOUtil.cleanupResources(stmt, resultSet);
|
||||
}
|
||||
return paginationResult;
|
||||
}
|
||||
@ -88,4 +121,60 @@ public class PostgreSQLCertificateDAOImpl extends AbstractCertificateDAOImpl {
|
||||
private Connection getConnection() throws SQLException {
|
||||
return CertificateManagementDAOFactory.getConnection();
|
||||
}
|
||||
|
||||
private int getCertificateCount(CertificatePaginationRequest request) throws CertificateManagementDAOException {
|
||||
int certificateCount = 0;
|
||||
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId();
|
||||
String serialNumber = request.getSerialNumber();
|
||||
String deviceIdentifier = request.getDeviceIdentifier();
|
||||
String username = request.getUsername();
|
||||
|
||||
try {
|
||||
Connection conn = this.getConnection();
|
||||
String sql = "SELECT COUNT(*) AS DEVICE_CERTIFICATE_COUNT " +
|
||||
"FROM DM_DEVICE_CERTIFICATE " +
|
||||
"WHERE TENANT_ID = ?";
|
||||
|
||||
if (StringUtils.isNotEmpty(serialNumber)) {
|
||||
sql += " AND SERIAL_NUMBER = ?";
|
||||
}
|
||||
|
||||
if (StringUtils.isNotEmpty(deviceIdentifier)) {
|
||||
sql += " AND DEVICE_IDENTIFIER = ?";
|
||||
}
|
||||
|
||||
if (StringUtils.isNotEmpty(username)) {
|
||||
sql += " AND USERNAME ILIKE ?";
|
||||
}
|
||||
|
||||
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
|
||||
stmt.setInt(1, tenantId);
|
||||
|
||||
int paramIdx = 2;
|
||||
if (StringUtils.isNotEmpty(serialNumber)) {
|
||||
stmt.setString(paramIdx++, serialNumber);
|
||||
}
|
||||
|
||||
if (StringUtils.isNotEmpty(deviceIdentifier)) {
|
||||
stmt.setString(paramIdx++, deviceIdentifier);
|
||||
}
|
||||
|
||||
if (StringUtils.isNotEmpty(username)) {
|
||||
stmt.setString(paramIdx, "%" + username + "%");
|
||||
}
|
||||
|
||||
try (ResultSet rs = stmt.executeQuery()) {
|
||||
if (rs.next()) {
|
||||
certificateCount = rs.getInt("DEVICE_CERTIFICATE_COUNT");
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
String errorMsg = "SQL error occurred while retrieving the certificate count.";
|
||||
log.error(errorMsg, e);
|
||||
throw new CertificateManagementDAOException(errorMsg, e);
|
||||
}
|
||||
return certificateCount;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -18,13 +18,14 @@
|
||||
|
||||
package io.entgra.device.mgt.core.certificate.mgt.core.dao.impl;
|
||||
|
||||
import io.entgra.device.mgt.core.device.mgt.common.CertificatePaginationRequest;
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.dto.CertificateResponse;
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.impl.CertificateGenerator;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.dao.CertificateManagementDAOException;
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.dao.CertificateManagementDAOFactory;
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.dao.CertificateManagementDAOUtil;
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.service.PaginationResult;
|
||||
import org.wso2.carbon.context.PrivilegedCarbonContext;
|
||||
|
||||
@ -44,43 +45,75 @@ public class SQLServerCertificateDAOImpl extends AbstractCertificateDAOImpl {
|
||||
private static final Log log = LogFactory.getLog(SQLServerCertificateDAOImpl.class);
|
||||
|
||||
@Override
|
||||
public PaginationResult getAllCertificates(int rowNum, int limit) throws CertificateManagementDAOException {
|
||||
PreparedStatement stmt = null;
|
||||
ResultSet resultSet = null;
|
||||
public PaginationResult getAllCertificates(CertificatePaginationRequest request) throws CertificateManagementDAOException {
|
||||
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId();
|
||||
CertificateResponse certificateResponse;
|
||||
List<CertificateResponse> certificates = new ArrayList<>();
|
||||
PaginationResult paginationResult;
|
||||
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId();
|
||||
String serialNumber = request.getSerialNumber();
|
||||
String deviceIdentifier = request.getDeviceIdentifier();
|
||||
String username = request.getUsername();
|
||||
boolean isCertificateSerialNumberProvided = false;
|
||||
boolean isCertificateDeviceIdentifierProvided = false;
|
||||
boolean isCertificateUsernameProvided = false;
|
||||
|
||||
try {
|
||||
Connection conn = this.getConnection();
|
||||
String sql = "SELECT CERTIFICATE, SERIAL_NUMBER, TENANT_ID, USERNAME FROM "
|
||||
+ "DM_DEVICE_CERTIFICATE WHERE TENANT_ID = ? ORDER BY ID DESC OFFSET ? ROWS FETCH NEXT ? ROWS ONLY";
|
||||
stmt = conn.prepareStatement(sql);
|
||||
stmt.setInt(1, tenantId);
|
||||
stmt.setInt(2, rowNum);
|
||||
stmt.setInt(3, limit);
|
||||
resultSet = stmt.executeQuery();
|
||||
String query = "SELECT * " +
|
||||
"FROM DM_DEVICE_CERTIFICATE " +
|
||||
"WHERE TENANT_ID = ? ";
|
||||
if (StringUtils.isNotEmpty(serialNumber)) {
|
||||
query += "AND SERIAL_NUMBER = ? ";
|
||||
isCertificateSerialNumberProvided = true;
|
||||
}
|
||||
|
||||
int resultCount = 0;
|
||||
if (StringUtils.isNotEmpty(deviceIdentifier)) {
|
||||
query += "AND DEVICE_IDENTIFIER = ? ";
|
||||
isCertificateDeviceIdentifierProvided = true;
|
||||
}
|
||||
|
||||
if (StringUtils.isNotEmpty(username)) {
|
||||
query += "AND USERNAME LIKE ? ";
|
||||
isCertificateUsernameProvided = true;
|
||||
}
|
||||
|
||||
query += "ORDER BY ID OFFSET ? ROWS FETCH NEXT ? ROWS ONLY";
|
||||
|
||||
try (PreparedStatement stmt = conn.prepareStatement(query)) {
|
||||
int paramIdx = 1;
|
||||
stmt.setInt(paramIdx++, tenantId);
|
||||
if (isCertificateSerialNumberProvided) {
|
||||
stmt.setString(paramIdx++, serialNumber);
|
||||
}
|
||||
if (isCertificateDeviceIdentifierProvided) {
|
||||
stmt.setString(paramIdx++, deviceIdentifier);
|
||||
}
|
||||
if (isCertificateUsernameProvided) {
|
||||
stmt.setString(paramIdx++, "%" + username + "%");
|
||||
}
|
||||
stmt.setInt(paramIdx++, request.getStartIndex());
|
||||
stmt.setInt(paramIdx++, request.getRowCount());
|
||||
try (ResultSet resultSet = stmt.executeQuery()) {
|
||||
while (resultSet.next()) {
|
||||
certificateResponse = new CertificateResponse();
|
||||
byte[] certificateBytes = resultSet.getBytes("CERTIFICATE");
|
||||
certificateResponse.setSerialNumber(resultSet.getString("SERIAL_NUMBER"));
|
||||
certificateResponse.setCertificateId(resultSet.getString("ID"));
|
||||
certificateResponse.setDeviceIdentifier(resultSet.getString("DEVICE_IDENTIFIER"));
|
||||
certificateResponse.setTenantId(resultSet.getInt("TENANT_ID"));
|
||||
certificateResponse.setUsername(resultSet.getString("USERNAME"));
|
||||
CertificateGenerator.extractCertificateDetails(certificateBytes, certificateResponse);
|
||||
certificates.add(certificateResponse);
|
||||
resultCount++;
|
||||
}
|
||||
paginationResult = new PaginationResult();
|
||||
paginationResult.setData(certificates);
|
||||
paginationResult.setRecordsTotal(resultCount);
|
||||
paginationResult.setRecordsTotal(this.getCertificateCount(request));
|
||||
}
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
String errorMsg = "SQL error occurred while retrieving the certificates.";
|
||||
log.error(errorMsg, e);
|
||||
throw new CertificateManagementDAOException(errorMsg, e);
|
||||
} finally {
|
||||
CertificateManagementDAOUtil.cleanupResources(stmt, resultSet);
|
||||
}
|
||||
return paginationResult;
|
||||
}
|
||||
@ -88,4 +121,60 @@ public class SQLServerCertificateDAOImpl extends AbstractCertificateDAOImpl {
|
||||
private Connection getConnection() throws SQLException {
|
||||
return CertificateManagementDAOFactory.getConnection();
|
||||
}
|
||||
|
||||
private int getCertificateCount(CertificatePaginationRequest request) throws CertificateManagementDAOException {
|
||||
int certificateCount = 0;
|
||||
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId();
|
||||
String serialNumber = request.getSerialNumber();
|
||||
String deviceIdentifier = request.getDeviceIdentifier();
|
||||
String username = request.getUsername();
|
||||
|
||||
try {
|
||||
Connection conn = this.getConnection();
|
||||
String sql = "SELECT COUNT(*) AS DEVICE_CERTIFICATE_COUNT " +
|
||||
"FROM DM_DEVICE_CERTIFICATE " +
|
||||
"WHERE TENANT_ID = ?";
|
||||
|
||||
if (StringUtils.isNotEmpty(serialNumber)) {
|
||||
sql += " AND SERIAL_NUMBER = ?";
|
||||
}
|
||||
|
||||
if (StringUtils.isNotEmpty(deviceIdentifier)) {
|
||||
sql += " AND DEVICE_IDENTIFIER = ?";
|
||||
}
|
||||
|
||||
if (StringUtils.isNotEmpty(username)) {
|
||||
sql += " AND USERNAME LIKE ?";
|
||||
}
|
||||
|
||||
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
|
||||
stmt.setInt(1, tenantId);
|
||||
|
||||
int paramIdx = 2;
|
||||
if (StringUtils.isNotEmpty(serialNumber)) {
|
||||
stmt.setString(paramIdx++, serialNumber);
|
||||
}
|
||||
|
||||
if (StringUtils.isNotEmpty(deviceIdentifier)) {
|
||||
stmt.setString(paramIdx++, deviceIdentifier);
|
||||
}
|
||||
|
||||
if (StringUtils.isNotEmpty(username)) {
|
||||
stmt.setString(paramIdx, "%" + username + "%");
|
||||
}
|
||||
|
||||
try (ResultSet rs = stmt.executeQuery()) {
|
||||
if (rs.next()) {
|
||||
certificateCount = rs.getInt("DEVICE_CERTIFICATE_COUNT");
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
String errorMsg = "SQL error occurred while retrieving the certificate count.";
|
||||
log.error(errorMsg, e);
|
||||
throw new CertificateManagementDAOException(errorMsg, e);
|
||||
}
|
||||
return certificateCount;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -32,6 +32,12 @@ public class CertificateResponse {
|
||||
@ApiModelProperty(name = "serialNumber", value = "It is the unique ID that is used to identify a certificate", required = true)
|
||||
String serialNumber;
|
||||
|
||||
@ApiModelProperty(name = "deviceIdentifier", value = "It is use to identify a certificate list", required = true)
|
||||
String deviceIdentifier;
|
||||
|
||||
@ApiModelProperty(name = "certificateId", value = "It is the unique ID that is used to identify a certificate", required = true)
|
||||
String certificateId;
|
||||
|
||||
@ApiModelProperty(name = "tenantId", value = "The ID of the tenant who adds the certificate", required = true)
|
||||
int tenantId;
|
||||
|
||||
@ -44,8 +50,8 @@ public class CertificateResponse {
|
||||
@ApiModelProperty(name = "notBefore", value = "The date from when the certificate is valid", required = true)
|
||||
long notBefore;
|
||||
|
||||
@ApiModelProperty(name = "certificateserial", value = "The serial number of the certificate", required = true)
|
||||
BigInteger certificateserial;
|
||||
@ApiModelProperty(name = "certificateSerial", value = "The serial number of the certificate", required = true)
|
||||
BigInteger certificateSerial;
|
||||
|
||||
@ApiModelProperty(name = "issuer", value = "The identity of the authority that signs the SSL certificate", required = true)
|
||||
String issuer;
|
||||
@ -83,12 +89,12 @@ public class CertificateResponse {
|
||||
this.notBefore = notBefore;
|
||||
}
|
||||
|
||||
public BigInteger getCertificateserial() {
|
||||
return certificateserial;
|
||||
public BigInteger getCertificateSerial() {
|
||||
return certificateSerial;
|
||||
}
|
||||
|
||||
public void setCertificateserial(BigInteger certificateserial) {
|
||||
this.certificateserial = certificateserial;
|
||||
public void setCertificateSerial(BigInteger certificateSerial) {
|
||||
this.certificateSerial = certificateSerial;
|
||||
}
|
||||
|
||||
public String getIssuer() {
|
||||
@ -146,4 +152,20 @@ public class CertificateResponse {
|
||||
public void setTenantId(int tenantId) {
|
||||
this.tenantId = tenantId;
|
||||
}
|
||||
|
||||
public String getDeviceIdentifier() {
|
||||
return deviceIdentifier;
|
||||
}
|
||||
|
||||
public void setDeviceIdentifier(String deviceIdentifier) {
|
||||
this.deviceIdentifier = deviceIdentifier;
|
||||
}
|
||||
|
||||
public String getCertificateId() {
|
||||
return certificateId;
|
||||
}
|
||||
|
||||
public void setCertificateId(String certificateId) {
|
||||
this.certificateId = certificateId;
|
||||
}
|
||||
}
|
||||
|
||||
@ -130,7 +130,7 @@ public class CertificateGenerator {
|
||||
X509Certificate certificate = (X509Certificate) x509Certificate;
|
||||
certificateResponse.setNotAfter(certificate.getNotAfter().getTime());
|
||||
certificateResponse.setNotBefore(certificate.getNotBefore().getTime());
|
||||
certificateResponse.setCertificateserial(certificate.getSerialNumber());
|
||||
certificateResponse.setCertificateSerial(certificate.getSerialNumber());
|
||||
certificateResponse.setIssuer(certificate.getIssuerDN().getName());
|
||||
certificateResponse.setSubject(certificate.getSubjectDN().getName());
|
||||
certificateResponse.setCertificateVersion(certificate.getVersion());
|
||||
|
||||
@ -17,6 +17,7 @@
|
||||
*/
|
||||
package io.entgra.device.mgt.core.certificate.mgt.core.service;
|
||||
|
||||
import io.entgra.device.mgt.core.device.mgt.common.CertificatePaginationRequest;
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.dto.CertificateResponse;
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.dto.SCEPResponse;
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.exception.CertificateManagementException;
|
||||
@ -71,10 +72,12 @@ public interface CertificateManagementService {
|
||||
|
||||
CertificateResponse retrieveCertificate(String serialNumber) throws CertificateManagementException;
|
||||
|
||||
PaginationResult getAllCertificates(int rowNum, int limit) throws CertificateManagementException;
|
||||
PaginationResult getAllCertificates(CertificatePaginationRequest request) throws CertificateManagementException;
|
||||
|
||||
boolean removeCertificate(String serialNumber) throws CertificateManagementException;
|
||||
|
||||
boolean getValidateMetaValue() throws CertificateManagementException;
|
||||
|
||||
List<CertificateResponse> getCertificates() throws CertificateManagementException;
|
||||
|
||||
List<CertificateResponse> searchCertificates(String serialNumber) throws CertificateManagementException;
|
||||
|
||||
@ -17,6 +17,12 @@
|
||||
*/
|
||||
package io.entgra.device.mgt.core.certificate.mgt.core.service;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParseException;
|
||||
import com.google.gson.JsonParser;
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.util.CertificateManagementConstants;
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.util.CertificateManagerUtil;
|
||||
import io.entgra.device.mgt.core.device.mgt.common.CertificatePaginationRequest;
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.dao.CertificateDAO;
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.dao.CertificateManagementDAOException;
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.dao.CertificateManagementDAOFactory;
|
||||
@ -27,12 +33,15 @@ import io.entgra.device.mgt.core.certificate.mgt.core.exception.KeystoreExceptio
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.exception.TransactionManagementException;
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.impl.CertificateGenerator;
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.impl.KeyStoreReader;
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.util.CertificateManagementConstants;
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.util.CertificateManagerUtil;
|
||||
|
||||
import io.entgra.device.mgt.core.device.mgt.common.exceptions.MetadataManagementException;
|
||||
import io.entgra.device.mgt.core.device.mgt.common.metadata.mgt.Metadata;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.bouncycastle.pkcs.PKCS10CertificationRequest;
|
||||
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.security.PrivateKey;
|
||||
import java.security.cert.Certificate;
|
||||
@ -154,11 +163,11 @@ public class CertificateManagementServiceImpl implements CertificateManagementSe
|
||||
}
|
||||
|
||||
@Override
|
||||
public PaginationResult getAllCertificates(int rowNum, int limit) throws CertificateManagementException {
|
||||
public PaginationResult getAllCertificates(CertificatePaginationRequest request) throws CertificateManagementException {
|
||||
try {
|
||||
CertificateManagementDAOFactory.openConnection();
|
||||
CertificateDAO certificateDAO = CertificateManagementDAOFactory.getCertificateDAO();
|
||||
return certificateDAO.getAllCertificates(rowNum, CertificateManagerUtil.validateCertificateListPageSize(limit));
|
||||
return certificateDAO.getAllCertificates(request);
|
||||
} catch (SQLException e) {
|
||||
String msg = "Error occurred while opening a connection to the underlying data source";
|
||||
log.error(msg, e);
|
||||
@ -172,7 +181,6 @@ public class CertificateManagementServiceImpl implements CertificateManagementSe
|
||||
CertificateManagementDAOFactory.closeConnection();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean removeCertificate(String serialNumber) throws CertificateManagementException {
|
||||
try {
|
||||
@ -182,18 +190,43 @@ public class CertificateManagementServiceImpl implements CertificateManagementSe
|
||||
CertificateManagementDAOFactory.commitTransaction();
|
||||
return status;
|
||||
} catch (TransactionManagementException e) {
|
||||
String msg = "Error occurred while removing certificate carrying serial number '" + serialNumber + "'";
|
||||
String msg = "Error occurred while removing certificate carrying serialNumber '" + serialNumber + "'";
|
||||
log.error(msg, e);
|
||||
throw new CertificateManagementException(msg, e);
|
||||
} catch (CertificateManagementDAOException e) {
|
||||
CertificateManagementDAOFactory.rollbackTransaction();
|
||||
String msg = "Error occurred while removing the certificate carrying serial number '" + serialNumber +
|
||||
String msg = "Error occurred while removing the certificate carrying serialNumber '" + serialNumber +
|
||||
"' from the certificate repository";
|
||||
log.error(msg, e);
|
||||
throw new CertificateManagementException(msg, e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getValidateMetaValue() throws CertificateManagementException {
|
||||
Metadata metadata;
|
||||
try {
|
||||
metadata = CertificateManagerUtil.getMetadataManagementService().retrieveMetadata(CertificateManagementConstants.CERTIFICATE_DELETE);
|
||||
if (metadata != null) {
|
||||
String metaValue = metadata.getMetaValue();
|
||||
if (StringUtils.isNotEmpty(metaValue)) {
|
||||
JsonParser parser = new JsonParser();
|
||||
JsonObject jsonObject = parser.parse(metaValue).getAsJsonObject();
|
||||
return jsonObject.get(CertificateManagementConstants.IS_CERTIFICATE_DELETE_ENABLE).getAsBoolean();
|
||||
}
|
||||
}
|
||||
return false;
|
||||
} catch (MetadataManagementException e) {
|
||||
String msg = "Error occurred while getting the metadata entry for metaKey: " + CertificateManagementConstants.CERTIFICATE_DELETE;
|
||||
log.error(msg, e);
|
||||
throw new CertificateManagementException(msg, e);
|
||||
} catch (JsonParseException e) {
|
||||
String msg = "Error occurred while parsing the JSON metadata value for metaKey: " + CertificateManagementConstants.CERTIFICATE_DELETE;
|
||||
log.error(msg, e);
|
||||
throw new CertificateManagementException(msg, e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<CertificateResponse> getCertificates() throws CertificateManagementException {
|
||||
try {
|
||||
|
||||
@ -41,6 +41,12 @@ public final class CertificateManagementConstants {
|
||||
public static final int RSA_KEY_LENGTH = 2048;
|
||||
public static final String SIGNING_ALGORITHM = "SHA256withRSA";
|
||||
|
||||
public static final int DEFAULT_PAGE_LIMIT = 50;
|
||||
|
||||
public static final String CERTIFICATE_DELETE = "CERTIFICATE_DELETE";
|
||||
public static final String IS_CERTIFICATE_DELETE_ENABLE = "isCertificateDelete";
|
||||
|
||||
|
||||
public static final class DataBaseTypes {
|
||||
private DataBaseTypes() {
|
||||
throw new AssertionError();
|
||||
|
||||
@ -19,6 +19,7 @@
|
||||
|
||||
package io.entgra.device.mgt.core.certificate.mgt.core.util;
|
||||
|
||||
import io.entgra.device.mgt.core.device.mgt.common.metadata.mgt.MetadataManagementService;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.w3c.dom.Document;
|
||||
@ -28,6 +29,7 @@ import io.entgra.device.mgt.core.certificate.mgt.core.config.datasource.DataSour
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.config.datasource.JNDILookupDefinition;
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.dao.CertificateManagementDAOUtil;
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.exception.CertificateManagementException;
|
||||
import org.wso2.carbon.context.PrivilegedCarbonContext;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
import javax.xml.XMLConstants;
|
||||
@ -41,6 +43,7 @@ public class CertificateManagerUtil {
|
||||
|
||||
public static final String GENERAL_CONFIG_RESOURCE_PATH = "general";
|
||||
public static final String MONITORING_FREQUENCY = "notifierFrequency";
|
||||
private static MetadataManagementService metadataManagementService;
|
||||
private static final Log log = LogFactory.getLog(CertificateManagerUtil.class);
|
||||
|
||||
public static Document convertToDocument(File file) throws CertificateManagementException {
|
||||
@ -105,4 +108,26 @@ public class CertificateManagerUtil {
|
||||
return limit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializing and accessing method for MetadataManagementService.
|
||||
*
|
||||
* @return MetadataManagementService instance
|
||||
* @throws IllegalStateException if metadataManagementService cannot be initialized
|
||||
*/
|
||||
public static MetadataManagementService getMetadataManagementService() {
|
||||
if (metadataManagementService == null) {
|
||||
synchronized (CertificateManagerUtil.class) {
|
||||
if (metadataManagementService == null) {
|
||||
PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext();
|
||||
metadataManagementService = (MetadataManagementService) ctx.getOSGiService(
|
||||
MetadataManagementService.class, null);
|
||||
if (metadataManagementService == null) {
|
||||
throw new IllegalStateException("Metadata Management service not initialized.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return metadataManagementService;
|
||||
}
|
||||
|
||||
}
|
||||
@ -18,6 +18,7 @@
|
||||
|
||||
package io.entgra.device.mgt.core.certificate.mgt.core.impl;
|
||||
|
||||
import io.entgra.device.mgt.core.device.mgt.common.CertificatePaginationRequest;
|
||||
import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter;
|
||||
import org.mockito.Mockito;
|
||||
import org.powermock.api.mockito.PowerMockito;
|
||||
@ -110,7 +111,8 @@ public class CertificateManagementServiceImplNegativeTests extends PowerMockTest
|
||||
public void negativeTestGetAllCertificates() throws Exception {
|
||||
PowerMockito.mockStatic(CertificateManagementDAOFactory.class);
|
||||
PowerMockito.doThrow(new SQLException()).when(CertificateManagementDAOFactory.class, "openConnection");
|
||||
instance.getAllCertificates(1, 2);
|
||||
CertificatePaginationRequest request = new CertificatePaginationRequest(0, 2);
|
||||
instance.getAllCertificates(request);
|
||||
}
|
||||
|
||||
@Test(description = "This test case tests behaviour when an error occurs getting the list of certificates from repository"
|
||||
@ -118,7 +120,8 @@ public class CertificateManagementServiceImplNegativeTests extends PowerMockTest
|
||||
public void negativeTestGetAllCertificates2() throws Exception {
|
||||
CertificateManagementDAOFactory.init(daoExceptionDatasource);
|
||||
CertificateManagementServiceImpl instance1 = CertificateManagementServiceImpl.getInstance();
|
||||
instance1.getAllCertificates(1, 2);
|
||||
CertificatePaginationRequest request = new CertificatePaginationRequest(0, 2);
|
||||
instance.getAllCertificates(request);
|
||||
}
|
||||
|
||||
@Test(description = "This test case tests behaviour when data source transaction error occurs when removing the certificate"
|
||||
|
||||
@ -20,6 +20,7 @@ package io.entgra.device.mgt.core.certificate.mgt.core.impl;
|
||||
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.util.CSRGenerator;
|
||||
import io.entgra.device.mgt.core.certificate.mgt.core.util.DummyCertificate;
|
||||
import io.entgra.device.mgt.core.device.mgt.common.CertificatePaginationRequest;
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
@ -210,14 +211,15 @@ public class CertificateManagementServiceImplTests extends BaseDeviceManagementC
|
||||
X509Certificate x509Certificate = managementService.generateX509Certificate();
|
||||
CertificateResponse certificateResponse = managementService.retrieveCertificate(x509Certificate.getSerialNumber().toString());
|
||||
Assert.assertNotNull(certificateResponse);
|
||||
Assert.assertEquals(x509Certificate.getSerialNumber(), certificateResponse.getCertificateserial());
|
||||
Assert.assertEquals(x509Certificate.getSerialNumber(), certificateResponse.getCertificateSerial());
|
||||
}
|
||||
|
||||
@Test(description = "This test case tests the retrieval of Certificates from keystore in desired pagination")
|
||||
public void testGetAllCertificatesPaginated() throws CertificateManagementException, KeystoreException {
|
||||
managementService.generateX509Certificate();
|
||||
managementService.generateX509Certificate();
|
||||
PaginationResult allCertificates = managementService.getAllCertificates(0, 2);
|
||||
CertificatePaginationRequest request = new CertificatePaginationRequest(0,2);
|
||||
PaginationResult allCertificates = managementService.getAllCertificates(request);
|
||||
Assert.assertEquals(allCertificates.getData().size(), 2);
|
||||
log.info("GetAllCertificatesPaginated Test Successful");
|
||||
}
|
||||
|
||||
@ -37,6 +37,7 @@ CREATE TABLE IF NOT EXISTS DM_DEVICE_CERTIFICATE (
|
||||
SERIAL_NUMBER VARCHAR(500) DEFAULT NULL,
|
||||
CERTIFICATE BLOB DEFAULT NULL,
|
||||
TENANT_ID INTEGER DEFAULT 0,
|
||||
DEVICE_IDENTIFIER VARCHAR(300),
|
||||
USERNAME VARCHAR(500) DEFAULT NULL,
|
||||
PRIMARY KEY (ID)
|
||||
);
|
||||
@ -41,6 +41,14 @@ public class ApplicationUninstallation {
|
||||
@Pattern(regexp = "^[A-Za-z]*$")
|
||||
String type;
|
||||
|
||||
String name;
|
||||
|
||||
String platform;
|
||||
|
||||
String version;
|
||||
|
||||
String user;
|
||||
|
||||
public ApplicationUninstallation() {
|
||||
}
|
||||
|
||||
@ -49,6 +57,47 @@ public class ApplicationUninstallation {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
public ApplicationUninstallation(String appIdentifier, String type, String name, String platform, String version, String user) {
|
||||
this.appIdentifier = appIdentifier;
|
||||
this.type = type;
|
||||
this.name = name;
|
||||
this.platform = platform;
|
||||
this.version = version;
|
||||
this.user = user;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getPlatform() {
|
||||
return platform;
|
||||
}
|
||||
|
||||
public void setPlatform(String platform) {
|
||||
this.platform = platform;
|
||||
}
|
||||
|
||||
public String getVersion() {
|
||||
return version;
|
||||
}
|
||||
|
||||
public void setVersion(String version) {
|
||||
this.version = version;
|
||||
}
|
||||
|
||||
public String getUser() {
|
||||
return user;
|
||||
}
|
||||
|
||||
public void setUser(String user) {
|
||||
this.user = user;
|
||||
}
|
||||
|
||||
public String getAppIdentifier() {
|
||||
return appIdentifier;
|
||||
}
|
||||
|
||||
@ -308,7 +308,17 @@ public interface ActivityInfoProviderService {
|
||||
"Provide the value in the Java Date Format: EEE, d MMM yyyy HH:mm:ss Z\n." +
|
||||
"Example: Mon, 05 Jan 2014 15:10:00 +0200",
|
||||
required = false)
|
||||
@HeaderParam("If-Modified-Since") String ifModifiedSince);
|
||||
@HeaderParam("If-Modified-Since") String ifModifiedSince,
|
||||
@ApiParam(
|
||||
name = "response",
|
||||
value = "The starting pagination index for the complete list of qualified items.",
|
||||
required = false)
|
||||
@QueryParam("response") Boolean response,
|
||||
@ApiParam(
|
||||
name = "appInstall",
|
||||
value = "The starting pagination index for the complete list of qualified items.",
|
||||
required = false)
|
||||
@QueryParam("appInstall") Boolean appInstall);
|
||||
|
||||
@GET
|
||||
@Path("/type/{operationCode}")
|
||||
|
||||
@ -1657,7 +1657,31 @@ public interface DeviceManagementService {
|
||||
value = "The package name of the app user want to uninstall",
|
||||
required = true)
|
||||
@QueryParam("packageName")
|
||||
String packageName);
|
||||
String packageName,
|
||||
@ApiParam(
|
||||
name = "platform",
|
||||
value = "The platform of the app user want to uninstall",
|
||||
required = false)
|
||||
@QueryParam("platform")
|
||||
String platform,
|
||||
@ApiParam(
|
||||
name = "name",
|
||||
value = "The name of the app user want to uninstall",
|
||||
required = false)
|
||||
@QueryParam("name")
|
||||
String name,
|
||||
@ApiParam(
|
||||
name = "version",
|
||||
value = "The version of the app user want to uninstall",
|
||||
required = false)
|
||||
@QueryParam("version")
|
||||
String version,
|
||||
@ApiParam(
|
||||
name = "user",
|
||||
value = "The user who triggered the app uninstall",
|
||||
required = false)
|
||||
@QueryParam("user")
|
||||
String user);
|
||||
|
||||
@GET
|
||||
@Produces(MediaType.APPLICATION_JSON)
|
||||
|
||||
@ -18,6 +18,8 @@
|
||||
package io.entgra.device.mgt.core.device.mgt.api.jaxrs.service.impl;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.exception.SubscriptionManagementException;
|
||||
import io.entgra.device.mgt.core.application.mgt.common.services.SubscriptionManager;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import io.entgra.device.mgt.core.device.mgt.common.ActivityPaginationRequest;
|
||||
@ -146,8 +148,11 @@ public class ActivityProviderServiceImpl implements ActivityInfoProviderService
|
||||
@Size(max = 45) String devicetype,
|
||||
@PathParam("deviceid")
|
||||
@Size(max = 45) String deviceid,
|
||||
@HeaderParam("If-Modified-Since") String ifModifiedSince) {
|
||||
Activity activity;
|
||||
@HeaderParam("If-Modified-Since") String ifModifiedSince,
|
||||
@QueryParam("response") Boolean response,
|
||||
@QueryParam("appInstall") Boolean appInstall) {
|
||||
Activity activity = new Activity();
|
||||
Activity appActivity = null;
|
||||
DeviceManagementProviderService dmService;
|
||||
try {
|
||||
RequestValidationUtil.validateActivityId(id);
|
||||
@ -157,7 +162,29 @@ public class ActivityProviderServiceImpl implements ActivityInfoProviderService
|
||||
deviceIdentifier.setType(devicetype);
|
||||
|
||||
dmService = DeviceMgtAPIUtils.getDeviceManagementService();
|
||||
|
||||
if (appInstall != null && appInstall) {
|
||||
if (response != null && response) {
|
||||
activity = dmService.getOperationByActivityIdAndDevice(id, deviceIdentifier);
|
||||
}
|
||||
SubscriptionManager subscriptionManager = DeviceMgtAPIUtils.getSubscriptionManager();
|
||||
appActivity = subscriptionManager.getOperationAppDetails(id);
|
||||
if (appActivity != null) {
|
||||
activity.setUsername(appActivity.getUsername());
|
||||
activity.setPackageName(appActivity.getPackageName());
|
||||
activity.setAppName(appActivity.getAppName());
|
||||
activity.setStatus(appActivity.getStatus());
|
||||
activity.setAppType(appActivity.getAppType());
|
||||
activity.setVersion(appActivity.getVersion());
|
||||
activity.setTriggeredBy(appActivity.getTriggeredBy());
|
||||
} else {
|
||||
String msg = "Cannot find the app details related to the operation ";
|
||||
log.error(msg);
|
||||
Response.status(404).entity(msg).build();
|
||||
}
|
||||
} else {
|
||||
activity = dmService.getOperationByActivityIdAndDevice(id, deviceIdentifier);
|
||||
}
|
||||
if (activity == null) {
|
||||
String msg = "No activity can be " +
|
||||
"found upon the provided activity id '" + id + "'";
|
||||
@ -169,6 +196,11 @@ public class ActivityProviderServiceImpl implements ActivityInfoProviderService
|
||||
log.error(msg, e);
|
||||
return Response.serverError().entity(
|
||||
new ErrorResponse.ErrorResponseBuilder().setMessage(msg).build()).build();
|
||||
} catch (SubscriptionManagementException e) {
|
||||
String msg = "ErrorResponse occurred while fetching the app details for the supplied id.";
|
||||
log.error(msg, e);
|
||||
return Response.serverError().entity(
|
||||
new ErrorResponse.ErrorResponseBuilder().setMessage(msg).build()).build();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -981,7 +981,11 @@ public class DeviceManagementServiceImpl implements DeviceManagementService {
|
||||
public Response uninstallation(
|
||||
@PathParam("type") @Size(max = 45) String type,
|
||||
@PathParam("id") @Size(max = 45) String id,
|
||||
@QueryParam("packageName") String packageName) {
|
||||
@QueryParam("packageName") String packageName,
|
||||
@QueryParam("platform") String platform,
|
||||
@QueryParam("name") String name,
|
||||
@QueryParam("version") String version,
|
||||
@QueryParam("user") String user) {
|
||||
List<DeviceIdentifier> deviceIdentifiers = new ArrayList<>();
|
||||
Operation operation = new Operation();
|
||||
try {
|
||||
@ -1004,7 +1008,7 @@ public class DeviceManagementServiceImpl implements DeviceManagementService {
|
||||
//if the applications not installed via entgra store
|
||||
} else {
|
||||
if (Constants.ANDROID.equals(type)) {
|
||||
ApplicationUninstallation applicationUninstallation = new ApplicationUninstallation(packageName, "PUBLIC");
|
||||
ApplicationUninstallation applicationUninstallation = new ApplicationUninstallation(packageName, "PUBLIC", name, platform, version, user);
|
||||
Gson gson = new Gson();
|
||||
operation.setCode(MDMAppConstants.AndroidConstants.UNMANAGED_APP_UNINSTALL);
|
||||
operation.setType(Operation.Type.PROFILE);
|
||||
|
||||
@ -206,7 +206,7 @@ public class ActivityProviderServiceImplTest {
|
||||
Mockito.when(this.deviceManagementProviderService
|
||||
.getOperationByActivityIdAndDevice(TEST_ACTIVITY_ID, deviceIdentifier)).thenReturn(activity);
|
||||
Response response = this.activityInfoProviderService.getActivityByDevice(TEST_ACTIVITY_ID,
|
||||
DEVICE_TYPE, DEVICE_ID, IF_MODIFIED_SINCE);
|
||||
DEVICE_TYPE, DEVICE_ID, IF_MODIFIED_SINCE, false, false);
|
||||
Assert.assertNotNull(response);
|
||||
Assert.assertEquals(response.getStatus(), Response.Status.OK.getStatusCode());
|
||||
Mockito.reset(this.deviceManagementProviderService);
|
||||
|
||||
@ -0,0 +1,77 @@
|
||||
/*
|
||||
* Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
|
||||
*
|
||||
* Entgra (Pvt) Ltd. 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 io.entgra.device.mgt.core.device.mgt.common;
|
||||
|
||||
public class CertificatePaginationRequest {
|
||||
private int startIndex;
|
||||
private int rowCount;
|
||||
private String serialNumber;
|
||||
private String deviceIdentifier;
|
||||
private String username;
|
||||
|
||||
public CertificatePaginationRequest(int start, int rowCount) {
|
||||
this.startIndex = start;
|
||||
this.rowCount = rowCount;
|
||||
}
|
||||
|
||||
public int getStartIndex() {
|
||||
return startIndex;
|
||||
}
|
||||
|
||||
public void setStartIndex(int startIndex) {
|
||||
this.startIndex = startIndex;
|
||||
}
|
||||
|
||||
public int getRowCount() {
|
||||
return rowCount;
|
||||
}
|
||||
|
||||
public void setRowCount(int rowCount) {
|
||||
this.rowCount = rowCount;
|
||||
}
|
||||
|
||||
public String getSerialNumber() {
|
||||
return serialNumber;
|
||||
}
|
||||
|
||||
public void setSerialNumber(String serialNumber) {
|
||||
this.serialNumber = serialNumber;
|
||||
}
|
||||
|
||||
public String getDeviceIdentifier() {
|
||||
return deviceIdentifier;
|
||||
}
|
||||
|
||||
public void setDeviceIdentifier(String deviceIdentifier) {
|
||||
this.deviceIdentifier = deviceIdentifier;
|
||||
}
|
||||
|
||||
public String getUsername() {
|
||||
return username;
|
||||
}
|
||||
|
||||
public void setUsername(String username) {
|
||||
this.username = username;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Certificate serial number '" + this.serialNumber + "' num of rows: " + this.rowCount + " start index: " + this.startIndex;
|
||||
}
|
||||
}
|
||||
@ -80,6 +80,32 @@ public class Activity {
|
||||
@JsonProperty("initiatedBy")
|
||||
private String initiatedBy;
|
||||
|
||||
@ApiModelProperty(name = "appName", value = "App Name.")
|
||||
private String appName;
|
||||
|
||||
@ApiModelProperty(name = "packageName",
|
||||
value = "package name of the application")
|
||||
private String packageName;
|
||||
@ApiModelProperty(name = "username",
|
||||
value = "username of subscribed person")
|
||||
private String username;
|
||||
@ApiModelProperty(name = "status",
|
||||
value = "Status of app install")
|
||||
private String status;
|
||||
|
||||
@ApiModelProperty(name = "version",
|
||||
value = "Version of app")
|
||||
private String version;
|
||||
|
||||
@ApiModelProperty(name = "triggeredBy",
|
||||
value = "Operation triggered by what")
|
||||
private String triggeredBy;
|
||||
|
||||
@ApiModelProperty(name = "appType",
|
||||
value = "Type of application")
|
||||
private String appType;
|
||||
|
||||
|
||||
public String getActivityId() {
|
||||
return activityId;
|
||||
}
|
||||
@ -127,5 +153,61 @@ public class Activity {
|
||||
public void setInitiatedBy(String initiatedBy) {
|
||||
this.initiatedBy = initiatedBy;
|
||||
}
|
||||
|
||||
public String getAppName() {
|
||||
return appName;
|
||||
}
|
||||
|
||||
public void setAppName(String appName) {
|
||||
this.appName = appName;
|
||||
}
|
||||
|
||||
public String getPackageName() {
|
||||
return packageName;
|
||||
}
|
||||
|
||||
public void setPackageName(String packageName) {
|
||||
this.packageName = packageName;
|
||||
}
|
||||
|
||||
public String getUsername() {
|
||||
return username;
|
||||
}
|
||||
|
||||
public void setUsername(String username) {
|
||||
this.username = username;
|
||||
}
|
||||
|
||||
public String getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public void setStatus(String status) {
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
public String getVersion() {
|
||||
return version;
|
||||
}
|
||||
|
||||
public void setVersion(String version) {
|
||||
this.version = version;
|
||||
}
|
||||
|
||||
public String getTriggeredBy() {
|
||||
return triggeredBy;
|
||||
}
|
||||
|
||||
public void setTriggeredBy(String triggeredBy) {
|
||||
this.triggeredBy = triggeredBy;
|
||||
}
|
||||
|
||||
public String getAppType() {
|
||||
return appType;
|
||||
}
|
||||
|
||||
public void setAppType(String appType) {
|
||||
this.appType = appType;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -29,6 +29,7 @@ public final class DeviceManagementConstants {
|
||||
public static final String GEOFENCE_CACHE = "GEOFENCE_CACHE";
|
||||
public static final String BILLING_CACHE = "BILLING_CACHE";
|
||||
public static final String META_KEY = "PER_DEVICE_COST";
|
||||
public static final String DEP_META_KEY = "DEP_CONFIG";
|
||||
public static final String ACTIVE_STATUS = "ACTIVE";
|
||||
public static final String ENROLLMENT_NOTIFICATION_API_ENDPOINT = "/api/device-mgt/enrollment-notification";
|
||||
public static final String URL_SEPERATOR = "/";
|
||||
|
||||
@ -0,0 +1,36 @@
|
||||
/*
|
||||
* Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
|
||||
*
|
||||
* Entgra (Pvt) Ltd. 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 io.entgra.device.mgt.core.device.mgt.core.config.ui;
|
||||
|
||||
import javax.xml.bind.annotation.XmlElement;
|
||||
import java.util.List;
|
||||
|
||||
class DeviceInfoConfigurations {
|
||||
|
||||
private List<DeviceInfoItem> deviceInfoItems;
|
||||
|
||||
@XmlElement(name = "DeviceInfoItem")
|
||||
public List<DeviceInfoItem> getDeviceInfoItems() {
|
||||
return deviceInfoItems;
|
||||
}
|
||||
|
||||
public void setDeviceInfoItems(List<DeviceInfoItem> deviceInfoItems) {
|
||||
this.deviceInfoItems = deviceInfoItems;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,56 @@
|
||||
/*
|
||||
* Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
|
||||
*
|
||||
* Entgra (Pvt) Ltd. 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 io.entgra.device.mgt.core.device.mgt.core.config.ui;
|
||||
|
||||
import javax.xml.bind.annotation.XmlElement;
|
||||
|
||||
class DeviceInfoItem {
|
||||
|
||||
private String definedValue;
|
||||
private String displayValue;
|
||||
|
||||
private String type;
|
||||
|
||||
@XmlElement(name = "DefinedValue")
|
||||
public String getDefinedValue() {
|
||||
return definedValue;
|
||||
}
|
||||
|
||||
public void setDefinedValue(String definedValue) {
|
||||
this.definedValue = definedValue;
|
||||
}
|
||||
|
||||
@XmlElement(name = "DisplayValue")
|
||||
public String getDisplayValue() {
|
||||
return displayValue;
|
||||
}
|
||||
|
||||
public void setDisplayValue(String displayValue) {
|
||||
this.displayValue = displayValue;
|
||||
}
|
||||
|
||||
@XmlElement(name = "Type")
|
||||
public String getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public void setType(String type) {
|
||||
this.type = type;
|
||||
}
|
||||
}
|
||||
@ -36,6 +36,8 @@ public class UIConfiguration {
|
||||
private Billing billing;
|
||||
private HubspotChat hubspotChat;
|
||||
|
||||
private DeviceInfoConfigurations deviceInfoConfigurations;
|
||||
|
||||
@XmlElement(name = "AppRegistration", required=true)
|
||||
public AppRegistration getAppRegistration() {
|
||||
return appRegistration;
|
||||
@ -98,4 +100,13 @@ public class UIConfiguration {
|
||||
public void setLoginCacheCapacity(int loginCacheCapacity) {
|
||||
this.loginCacheCapacity = loginCacheCapacity;
|
||||
}
|
||||
|
||||
@XmlElement(name = "DeviceInfoConfigurations", required = true)
|
||||
public DeviceInfoConfigurations getDeviceInfoConfigurations() {
|
||||
return deviceInfoConfigurations;
|
||||
}
|
||||
|
||||
public void setDeviceInfoConfigurations(DeviceInfoConfigurations deviceInfoConfigurations) {
|
||||
this.deviceInfoConfigurations = deviceInfoConfigurations;
|
||||
}
|
||||
}
|
||||
|
||||
@ -17,6 +17,8 @@
|
||||
*/
|
||||
package io.entgra.device.mgt.core.device.mgt.core.operation.mgt.dao.impl;
|
||||
|
||||
import io.entgra.device.mgt.core.device.mgt.common.MDMAppConstants;
|
||||
import io.entgra.device.mgt.core.device.mgt.core.dto.operation.mgt.ProfileOperation;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.wso2.carbon.context.PrivilegedCarbonContext;
|
||||
@ -41,6 +43,8 @@ import io.entgra.device.mgt.core.device.mgt.core.operation.mgt.dao.util.Operatio
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.ObjectOutputStream;
|
||||
import java.io.ObjectInputStream;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.sql.Connection;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
@ -1353,6 +1357,7 @@ public class GenericOperationDAOImpl implements OperationDAO {
|
||||
List<Operation> operations = new ArrayList<>();
|
||||
String createdTo = null;
|
||||
String createdFrom = null;
|
||||
ProfileOperation profileOperation = null;
|
||||
DateFormat simple = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
|
||||
boolean isCreatedDayProvided = false;
|
||||
boolean isUpdatedDayProvided = false; //updated day = received day
|
||||
@ -1375,6 +1380,7 @@ public class GenericOperationDAOImpl implements OperationDAO {
|
||||
"o.RECEIVED_TIMESTAMP, " +
|
||||
"o.OPERATION_CODE, " +
|
||||
"o.INITIATED_BY, " +
|
||||
"o.OPERATION_DETAILS, " +
|
||||
"om.STATUS, " +
|
||||
"om.ID AS OM_MAPPING_ID, " +
|
||||
"om.UPDATED_TIMESTAMP " +
|
||||
@ -1473,6 +1479,22 @@ public class GenericOperationDAOImpl implements OperationDAO {
|
||||
}
|
||||
operation.setCode(rs.getString("OPERATION_CODE"));
|
||||
operation.setInitiatedBy(rs.getString("INITIATED_BY"));
|
||||
if (MDMAppConstants.AndroidConstants.UNMANAGED_APP_UNINSTALL.equals(operation.getCode())) {
|
||||
byte[] operationDetails = rs.getBytes("OPERATION_DETAILS");
|
||||
try (ByteArrayInputStream bais = new ByteArrayInputStream(operationDetails);
|
||||
ObjectInputStream ois = new ObjectInputStream(bais)) {
|
||||
profileOperation = (ProfileOperation) ois.readObject();
|
||||
operation.setPayLoad(profileOperation.getPayLoad());
|
||||
} catch (IOException e) {
|
||||
String msg = "IO Error occurred while retrieving app data of operation ";
|
||||
log.error(msg, e);
|
||||
throw new OperationManagementDAOException(msg, e);
|
||||
} catch (ClassNotFoundException e) {
|
||||
String msg = "Class not found error occurred while retrieving app data of operation ";
|
||||
log.error(msg, e);
|
||||
throw new OperationManagementDAOException(msg, e);
|
||||
}
|
||||
}
|
||||
operation.setStatus(Operation.Status.valueOf(rs.getString("STATUS")));
|
||||
OperationDAOUtil.setActivityId(operation, rs.getInt("ID"));
|
||||
operations.add(operation);
|
||||
@ -1493,6 +1515,7 @@ public class GenericOperationDAOImpl implements OperationDAO {
|
||||
List<Operation> operations = new ArrayList<>();
|
||||
String createdTo = null;
|
||||
String createdFrom = null;
|
||||
ProfileOperation profileOperation = null;
|
||||
DateFormat simple = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
|
||||
boolean isCreatedDayProvided = false;
|
||||
boolean isUpdatedDayProvided = false; //updated day = received day
|
||||
@ -1515,6 +1538,7 @@ public class GenericOperationDAOImpl implements OperationDAO {
|
||||
"o.RECEIVED_TIMESTAMP, " +
|
||||
"o.OPERATION_CODE, " +
|
||||
"o.INITIATED_BY, " +
|
||||
"o.OPERATION_DETAILS, " +
|
||||
"om.STATUS, " +
|
||||
"om.ID AS OM_MAPPING_ID, " +
|
||||
"om.UPDATED_TIMESTAMP " +
|
||||
@ -1613,6 +1637,22 @@ public class GenericOperationDAOImpl implements OperationDAO {
|
||||
}
|
||||
operation.setCode(rs.getString("OPERATION_CODE"));
|
||||
operation.setInitiatedBy(rs.getString("INITIATED_BY"));
|
||||
if (MDMAppConstants.AndroidConstants.UNMANAGED_APP_UNINSTALL.equals(operation.getCode())) {
|
||||
byte[] operationDetails = rs.getBytes("OPERATION_DETAILS");
|
||||
try (ByteArrayInputStream bais = new ByteArrayInputStream(operationDetails);
|
||||
ObjectInputStream ois = new ObjectInputStream(bais)) {
|
||||
profileOperation = (ProfileOperation) ois.readObject();
|
||||
operation.setPayLoad(profileOperation.getPayLoad());
|
||||
} catch (IOException e) {
|
||||
String msg = "IO Error occurred while retrieving app data of operation ";
|
||||
log.error(msg, e);
|
||||
throw new OperationManagementDAOException(msg, e);
|
||||
} catch (ClassNotFoundException e) {
|
||||
String msg = "Class not found error occurred while retrieving app data of operation ";
|
||||
log.error(msg, e);
|
||||
throw new OperationManagementDAOException(msg, e);
|
||||
}
|
||||
}
|
||||
operation.setStatus(Operation.Status.valueOf(rs.getString("STATUS")));
|
||||
OperationDAOUtil.setActivityId(operation, rs.getInt("ID"));
|
||||
operations.add(operation);
|
||||
|
||||
@ -276,9 +276,7 @@ public class OTPManagementServiceImpl implements OTPManagementService {
|
||||
public OneTimePinDTO generateOneTimePin(OneTimePinDTO oneTimePinDTO, boolean persistPin) throws OTPManagementException {
|
||||
|
||||
String otpValue = UUID.randomUUID().toString();
|
||||
|
||||
Gson gson = new Gson();
|
||||
String metaInfo = gson.toJson(oneTimePinDTO.getMetaInfo());
|
||||
String metaInfo = oneTimePinDTO.getMetaInfo();
|
||||
|
||||
oneTimePinDTO.setMetaInfo(metaInfo);
|
||||
oneTimePinDTO.setOtpToken(otpValue);
|
||||
|
||||
@ -79,7 +79,8 @@
|
||||
io.entgra.device.mgt.core.device.mgt.extensions.license.mgt.registry,
|
||||
javax.net.ssl,
|
||||
org.wso2.carbon.core.util,
|
||||
okhttp3
|
||||
okhttp3,
|
||||
com.google.common.cache.*
|
||||
</Import-Package>
|
||||
<Export-Package>
|
||||
!io.entgra.device.mgt.core.operation.template.internal,
|
||||
@ -300,6 +301,8 @@
|
||||
<dependency>
|
||||
<groupId>com.google.guava</groupId>
|
||||
<artifactId>guava</artifactId>
|
||||
<version>${guava.version}</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.github.openfeign</groupId>
|
||||
|
||||
@ -31,7 +31,7 @@ import org.osgi.service.component.ComponentContext;
|
||||
import org.wso2.carbon.ndatasource.core.DataSourceService;
|
||||
|
||||
/**
|
||||
* @scr.component name="io.entgra.device.mgt.operation.template.internal.OperationTemplateMgtServiceComponent" immediate="true"
|
||||
* @scr.component name="io.entgra.device.mgt.core.operation.template.internal.OperationTemplateMgtServiceComponent" immediate="true"
|
||||
* immediate="true"
|
||||
* @scr.reference name="org.wso2.carbon.ndatasource"
|
||||
* interface="org.wso2.carbon.ndatasource.core.DataSourceService"
|
||||
|
||||
@ -79,11 +79,6 @@ public class PermissionAuthorizer {
|
||||
matchingResources.add(new MatchingResource(permission.getUrlPattern().replace(context, ""), permission.getPath()));
|
||||
}
|
||||
}
|
||||
//TODO :: Temporary fix for windows bst api url mismatch error
|
||||
else if ("/api/device-mgt/windows/v1.0/bst/authentication".equals(permission.getUrl())) {
|
||||
requiredPermission = "/permission/admin/device-mgt/devices/enroll/windows";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (requiredPermission == null) {
|
||||
|
||||
@ -171,6 +171,7 @@
|
||||
<Category>Video Players & Editors</Category>
|
||||
<Category>Weather</Category>
|
||||
<Category>GooglePlaySyncedApp</Category>
|
||||
<Category>AppleStoreSyncedApp</Category>
|
||||
</AppCategories>
|
||||
|
||||
<RatingConfig>
|
||||
|
||||
@ -202,6 +202,7 @@
|
||||
<Category>Video Players & Editors</Category>
|
||||
<Category>Weather</Category>
|
||||
<Category>GooglePlaySyncedApp</Category>
|
||||
<Category>AppleStoreSyncedApp</Category>
|
||||
{% if application_mgt_conf.app_categories is defined %}
|
||||
{%- for app_category in application_mgt_conf.app_categories -%}
|
||||
<Category>{{app_category}}</Category>
|
||||
|
||||
@ -325,3 +325,59 @@ CREATE TABLE IF NOT EXISTS AP_APP_FAVOURITES(
|
||||
FOREIGN KEY (AP_APP_ID)
|
||||
REFERENCES AP_APP (ID) ON DELETE NO ACTION ON UPDATE NO ACTION
|
||||
);
|
||||
|
||||
-- -----------------------------------------------------
|
||||
-- Table AP_VPP_USER
|
||||
-- -----------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS AP_VPP_USER (
|
||||
ID INT NOT NULL AUTO_INCREMENT,
|
||||
CLIENT_USER_ID VARCHAR(255) NULL,
|
||||
DM_USERNAME VARCHAR(255) NOT NULL,
|
||||
TENANT_ID INT NOT NULL,
|
||||
EMAIL VARCHAR(255) NULL,
|
||||
INVITE_CODE VARCHAR(255) NULL,
|
||||
STATUS VARCHAR(255) NULL,
|
||||
CREATED_TIME BIGINT NULL,
|
||||
LAST_UPDATED_TIME BIGINT NULL,
|
||||
MANAGED_ID VARCHAR(255) NULL,
|
||||
TEMP_PASSWORD VARCHAR(255) NULL,
|
||||
PRIMARY KEY (ID)
|
||||
);
|
||||
|
||||
-- -----------------------------------------------------
|
||||
-- Table AP_ASSETS
|
||||
-- -----------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS AP_ASSETS (
|
||||
ID INT NOT NULL AUTO_INCREMENT,
|
||||
APP_ID INT NULL,
|
||||
TENANT_ID INT NOT NULL,
|
||||
CREATED_TIME BIGINT NULL,
|
||||
LAST_UPDATED_TIME BIGINT NULL,
|
||||
ADAM_ID VARCHAR(255) NULL,
|
||||
ASSIGNED_COUNT VARCHAR(255) NULL,
|
||||
DEVICE_ASSIGNABLE VARCHAR(255) NULL,
|
||||
PRICING_PARAMS VARCHAR(255) NULL,
|
||||
PRODUCT_TYPE VARCHAR(255) NULL,
|
||||
RETIRED_COUNT VARCHAR(255) NULL,
|
||||
REVOCABLE VARCHAR(255) NULL,
|
||||
SUPPORTED_PLATFORMS VARCHAR(255) NULL,
|
||||
PRIMARY KEY (ID)
|
||||
);
|
||||
|
||||
-- -----------------------------------------------------
|
||||
-- Table AP_VPP_ASSOCIATION
|
||||
-- -----------------------------------------------------
|
||||
|
||||
CREATE TABLE IF NOT EXISTS AP_VPP_ASSOCIATION (
|
||||
ID INT NOT NULL AUTO_INCREMENT,
|
||||
ASSET_ID INT,
|
||||
USER_ID INT,
|
||||
TENANT_ID INT NOT NULL,
|
||||
ASSOCIATION_TYPE VARCHAR(255) NOT NULL,
|
||||
PRICING_PARAMS VARCHAR(255) NULL,
|
||||
CREATED_TIME BIGINT NULL,
|
||||
LAST_UPDATED_TIME BIGINT NULL,
|
||||
PRIMARY KEY (ID),
|
||||
CONSTRAINT AP_VPP_ASSETS_fk FOREIGN KEY (ASSET_ID) REFERENCES AP_ASSETS (ID) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT AP_VPP_VPP_USER_fk FOREIGN KEY (USER_ID) REFERENCES AP_VPP_USER (ID) ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
|
||||
@ -342,3 +342,61 @@ CREATE TABLE AP_APP_FAVOURITES(
|
||||
FOREIGN KEY (AP_APP_ID)
|
||||
REFERENCES AP_APP (ID)
|
||||
);
|
||||
|
||||
-- -----------------------------------------------------
|
||||
-- Table AP_VPP_USER
|
||||
-- -----------------------------------------------------
|
||||
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'AP_VPP_USER') AND type in (N'U'))
|
||||
CREATE TABLE AP_VPP_USER (
|
||||
ID INT NOT NULL IDENTITY(1,1),
|
||||
CLIENT_USER_ID VARCHAR(255) NULL,
|
||||
DM_USERNAME VARCHAR(255) NOT NULL,
|
||||
TENANT_ID INT NOT NULL,
|
||||
EMAIL VARCHAR(255) NULL,
|
||||
INVITE_CODE VARCHAR(255) NULL,
|
||||
STATUS VARCHAR(255) NULL,
|
||||
CREATED_TIME BIGINT NULL,
|
||||
LAST_UPDATED_TIME BIGINT NULL,
|
||||
MANAGED_ID VARCHAR(255) NULL,
|
||||
TEMP_PASSWORD VARCHAR(255) NULL,
|
||||
PRIMARY KEY (ID)
|
||||
);
|
||||
|
||||
-- -----------------------------------------------------
|
||||
-- Table AP_ASSETS
|
||||
-- -----------------------------------------------------
|
||||
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'AP_ASSETS') AND type in (N'U'))
|
||||
CREATE TABLE AP_ASSETS (
|
||||
ID INT NOT NULL IDENTITY(1,1),
|
||||
APP_ID INT NULL,
|
||||
TENANT_ID INT NOT NULL,
|
||||
CREATED_TIME BIGINT NULL,
|
||||
LAST_UPDATED_TIME BIGINT NULL,
|
||||
ADAM_ID VARCHAR(255) NULL,
|
||||
ASSIGNED_COUNT VARCHAR(255) NULL,
|
||||
DEVICE_ASSIGNABLE VARCHAR(255) NULL,
|
||||
PRICING_PARAMS VARCHAR(255) NULL,
|
||||
PRODUCT_TYPE VARCHAR(255) NULL,
|
||||
RETIRED_COUNT VARCHAR(255) NULL,
|
||||
REVOCABLE VARCHAR(255) NULL,
|
||||
SUPPORTED_PLATFORMS VARCHAR(255) NULL,
|
||||
PRIMARY KEY (ID)
|
||||
);
|
||||
|
||||
-- -----------------------------------------------------
|
||||
-- Table AP_VPP_ASSOCIATION
|
||||
-- -----------------------------------------------------
|
||||
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'AP_VPP_ASSOCIATION') AND type in (N'U'))
|
||||
CREATE TABLE AP_VPP_ASSOCIATION (
|
||||
ID INT NOT NULL IDENTITY(1,1),
|
||||
ASSET_ID INT,
|
||||
USER_ID INT,
|
||||
TENANT_ID INT NOT NULL,
|
||||
ASSOCIATION_TYPE VARCHAR(255) NOT NULL,
|
||||
CREATED_TIME BIGINT NULL,
|
||||
LAST_UPDATED_TIME BIGINT NULL,
|
||||
PRICING_PARAMS VARCHAR(255) NULL,
|
||||
PRIMARY KEY (ID),
|
||||
CONSTRAINT AP_VPP_ASSETS_fk FOREIGN KEY (ASSET_ID) REFERENCES AP_ASSETS (ID) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT AP_VPP_VPP_USER_fk FOREIGN KEY (USER_ID) REFERENCES AP_VPP_USER (ID) ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
|
||||
@ -273,3 +273,59 @@ CREATE TABLE IF NOT EXISTS AP_APP_FAVOURITES(
|
||||
PRIMARY KEY(ID),
|
||||
CONSTRAINT AP_APP_FAVOURITES_AP_APP_ID_fk FOREIGN KEY (AP_APP_ID) REFERENCES AP_APP (ID)
|
||||
);
|
||||
|
||||
-- -----------------------------------------------------
|
||||
-- Table AP_VPP_USER
|
||||
-- -----------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS AP_VPP_USER (
|
||||
ID INT NOT NULL AUTO_INCREMENT,
|
||||
CLIENT_USER_ID VARCHAR(255) NULL,
|
||||
DM_USERNAME VARCHAR(255) NOT NULL,
|
||||
TENANT_ID INT NOT NULL,
|
||||
EMAIL VARCHAR(255) NULL,
|
||||
INVITE_CODE VARCHAR(255) NULL,
|
||||
STATUS VARCHAR(255) NULL,
|
||||
CREATED_TIME BIGINT NULL,
|
||||
LAST_UPDATED_TIME BIGINT NULL,
|
||||
MANAGED_ID VARCHAR(255) NULL,
|
||||
TEMP_PASSWORD VARCHAR(255) NULL,
|
||||
PRIMARY KEY (ID)
|
||||
);
|
||||
|
||||
-- -----------------------------------------------------
|
||||
-- Table AP_ASSETS
|
||||
-- -----------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS AP_ASSETS (
|
||||
ID INT NOT NULL AUTO_INCREMENT,
|
||||
APP_ID INT NULL,
|
||||
TENANT_ID INT NOT NULL,
|
||||
CREATED_TIME BIGINT NULL,
|
||||
LAST_UPDATED_TIME BIGINT NULL,
|
||||
ADAM_ID VARCHAR(255) NULL,
|
||||
ASSIGNED_COUNT VARCHAR(255) NULL,
|
||||
DEVICE_ASSIGNABLE VARCHAR(255) NULL,
|
||||
PRICING_PARAMS VARCHAR(255) NULL,
|
||||
PRODUCT_TYPE VARCHAR(255) NULL,
|
||||
RETIRED_COUNT VARCHAR(255) NULL,
|
||||
REVOCABLE VARCHAR(255) NULL,
|
||||
SUPPORTED_PLATFORMS VARCHAR(255) NULL,
|
||||
PRIMARY KEY (ID)
|
||||
);
|
||||
|
||||
-- -----------------------------------------------------
|
||||
-- Table AP_VPP_ASSOCIATION
|
||||
-- -----------------------------------------------------
|
||||
|
||||
CREATE TABLE IF NOT EXISTS AP_VPP_ASSOCIATION (
|
||||
ID INT NOT NULL AUTO_INCREMENT,
|
||||
ASSET_ID INT,
|
||||
USER_ID INT,
|
||||
TENANT_ID INT NOT NULL,
|
||||
ASSOCIATION_TYPE VARCHAR(255) NOT NULL,
|
||||
PRICING_PARAMS VARCHAR(255) NULL,
|
||||
CREATED_TIME BIGINT NULL,
|
||||
LAST_UPDATED_TIME BIGINT NULL,
|
||||
PRIMARY KEY (ID),
|
||||
CONSTRAINT AP_VPP_ASSETS_fk FOREIGN KEY (ASSET_ID) REFERENCES AP_ASSETS (ID) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT AP_VPP_VPP_USER_fk FOREIGN KEY (USER_ID) REFERENCES AP_VPP_USER (ID) ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
@ -420,3 +420,52 @@ CREATE TABLE IF NOT EXISTS AP_APP_FAVOURITES(
|
||||
REFERENCES AP_APP (ID)
|
||||
)
|
||||
/
|
||||
|
||||
CREATE TABLE AP_VPP_USER (
|
||||
ID number GENERATED BY DEFAULT AS IDENTITY(START WITH 1) NOT NULL,
|
||||
CLIENT_USER_ID VARCHAR2(255) NULL,
|
||||
DM_USERNAME VARCHAR2(255) NOT NULL,
|
||||
TENANT_ID INT NOT NULL,
|
||||
EMAIL VARCHAR2(255) NULL,
|
||||
INVITE_CODE VARCHAR2(255) NULL,
|
||||
STATUS VARCHAR2(255) NULL,
|
||||
CREATED_TIME NUMBER(19) NULL,
|
||||
LAST_UPDATED_TIME NUMBER(19) NULL,
|
||||
MANAGED_ID VARCHAR2(255) NULL,
|
||||
TEMP_PASSWORD VARCHAR2(255) NULL,
|
||||
PRIMARY KEY (ID)
|
||||
)
|
||||
/
|
||||
|
||||
CREATE TABLE AP_ASSETS (
|
||||
ID number GENERATED BY DEFAULT AS IDENTITY(START WITH 1) NOT NULL,
|
||||
APP_ID INT NULL,
|
||||
TENANT_ID INT NOT NULL,
|
||||
CREATED_TIME NUMBER(19) NULL,
|
||||
LAST_UPDATED_TIME NUMBER(19) NULL,
|
||||
ADAM_ID VARCHAR2(255) NULL,
|
||||
ASSIGNED_COUNT VARCHAR2(255) NULL,
|
||||
DEVICE_ASSIGNABLE VARCHAR2(255) NULL,
|
||||
PRICING_PARAMS VARCHAR2(255) NULL,
|
||||
PRODUCT_TYPE VARCHAR2(255) NULL,
|
||||
RETIRED_COUNT VARCHAR2(255) NULL,
|
||||
REVOCABLE VARCHAR2(255) NULL,
|
||||
SUPPORTED_PLATFORMS VARCHAR2(255) NULL,
|
||||
PRIMARY KEY (ID)
|
||||
)
|
||||
/
|
||||
|
||||
CREATE TABLE AP_VPP_ASSOCIATION (
|
||||
ID number GENERATED BY DEFAULT AS IDENTITY(START WITH 1) NOT NULL,
|
||||
ASSET_ID INT,
|
||||
USER_ID INT,
|
||||
TENANT_ID INT NOT NULL,
|
||||
ASSOCIATION_TYPE VARCHAR2(255) NOT NULL,
|
||||
PRICING_PARAMS VARCHAR2(255) NULL,
|
||||
CREATED_TIME NUMBER(19) NULL,
|
||||
LAST_UPDATED_TIME NUMBER(19) NULL,
|
||||
PRIMARY KEY (ID),
|
||||
CONSTRAINT AP_VPP_ASSETS_fk FOREIGN KEY (ASSET_ID) REFERENCES AP_ASSETS (ID) ON DELETE CASCADE,
|
||||
CONSTRAINT AP_VPP_VPP_USER_fk FOREIGN KEY (USER_ID) REFERENCES AP_VPP_USER (ID) ON DELETE CASCADE
|
||||
)
|
||||
/
|
||||
|
||||
@ -352,3 +352,58 @@ CREATE TABLE IF NOT EXISTS AP_APP_FAVOURITES(
|
||||
FOREIGN KEY (AP_APP_ID)
|
||||
REFERENCES AP_APP (ID) ON DELETE NO ACTION ON UPDATE NO ACTION
|
||||
);
|
||||
|
||||
-- -----------------------------------------------------
|
||||
-- Table AP_VPP_USER
|
||||
-- -----------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS AP_VPP_USER (
|
||||
ID INTEGER NOT NULL DEFAULT NEXTVAL('AP_VPP_USER_seq'),
|
||||
CLIENT_USER_ID VARCHAR(255) NULL,
|
||||
DM_USERNAME VARCHAR(255) NOT NULL,
|
||||
TENANT_ID INTEGER NOT NULL,
|
||||
EMAIL VARCHAR(255) NULL,
|
||||
INVITE_CODE VARCHAR(255) NULL,
|
||||
STATUS VARCHAR(255) NULL,
|
||||
CREATED_TIME BIGINT NULL,
|
||||
LAST_UPDATED_TIME BIGINT NULL,
|
||||
MANAGED_ID VARCHAR(255) NULL,
|
||||
TEMP_PASSWORD VARCHAR(255) NULL,
|
||||
PRIMARY KEY (ID)
|
||||
);
|
||||
|
||||
-- -----------------------------------------------------
|
||||
-- Table AP_ASSETS
|
||||
-- -----------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS AP_ASSETS (
|
||||
ID INTEGER NOT NULL DEFAULT NEXTVAL('AP_ASSETS_seq'),
|
||||
APP_ID INTEGER NULL,
|
||||
TENANT_ID INTEGER NOT NULL,
|
||||
CREATED_TIME BIGINT NULL,
|
||||
LAST_UPDATED_TIME BIGINT NULL,
|
||||
ADAM_ID VARCHAR(255) NULL,
|
||||
ASSIGNED_COUNT VARCHAR(255) NULL,
|
||||
DEVICE_ASSIGNABLE VARCHAR(255) NULL,
|
||||
PRICING_PARAMS VARCHAR(255) NULL,
|
||||
PRODUCT_TYPE VARCHAR(255) NULL,
|
||||
RETIRED_COUNT VARCHAR(255) NULL,
|
||||
REVOCABLE VARCHAR(255) NULL,
|
||||
SUPPORTED_PLATFORMS VARCHAR(255) NULL,
|
||||
PRIMARY KEY (ID)
|
||||
);
|
||||
|
||||
-- -----------------------------------------------------
|
||||
-- Table AP_VPP_ASSOCIATION
|
||||
-- -----------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS AP_VPP_ASSOCIATION (
|
||||
ID INTEGER NOT NULL DEFAULT NEXTVAL('AP_VPP_ASSOCIATION_seq'),
|
||||
ASSET_ID INTEGER,
|
||||
USER_ID INTEGER,
|
||||
TENANT_ID INTEGER NOT NULL,
|
||||
ASSOCIATION_TYPE VARCHAR(255) NOT NULL,
|
||||
PRICING_PARAMS VARCHAR(255) NULL,
|
||||
CREATED_TIME BIGINT NULL,
|
||||
LAST_UPDATED_TIME BIGINT NULL,
|
||||
PRIMARY KEY (ID),
|
||||
CONSTRAINT AP_VPP_ASSETS_fk FOREIGN KEY (ASSET_ID) REFERENCES AP_ASSETS (ID) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT AP_VPP_VPP_USER_fk FOREIGN KEY (USER_ID) REFERENCES AP_VPP_USER (ID) ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
|
||||
@ -40,6 +40,143 @@
|
||||
<HideDomainSelectionInSuperTenant>false</HideDomainSelectionInSuperTenant>
|
||||
<HideDomainSelectionInSubTenant>true</HideDomainSelectionInSubTenant>
|
||||
</Billing>
|
||||
<DeviceInfoConfigurations>
|
||||
<DeviceInfoItem>
|
||||
<DefinedValue>name</DefinedValue>
|
||||
<DisplayValue>label_device</DisplayValue>
|
||||
<Type>default</Type>
|
||||
</DeviceInfoItem>
|
||||
<DeviceInfoItem>
|
||||
<DefinedValue>type</DefinedValue>
|
||||
<DisplayValue>label_type</DisplayValue>
|
||||
<Type>default</Type>
|
||||
</DeviceInfoItem>
|
||||
<DeviceInfoItem>
|
||||
<DefinedValue>owner</DefinedValue>
|
||||
<DisplayValue>label_owner</DisplayValue>
|
||||
<Type>default</Type>
|
||||
</DeviceInfoItem>
|
||||
<DeviceInfoItem>
|
||||
<DefinedValue>serial</DefinedValue>
|
||||
<DisplayValue>label_serialNumber</DisplayValue>
|
||||
<Type>default</Type>
|
||||
</DeviceInfoItem>
|
||||
<DeviceInfoItem>
|
||||
<DefinedValue>ownership</DefinedValue>
|
||||
<DisplayValue>label_ownership</DisplayValue>
|
||||
<Type>default</Type>
|
||||
</DeviceInfoItem>
|
||||
<DeviceInfoItem>
|
||||
<DefinedValue>status</DefinedValue>
|
||||
<DisplayValue>label_status</DisplayValue>
|
||||
<Type>default</Type>
|
||||
</DeviceInfoItem>
|
||||
<DeviceInfoItem>
|
||||
<DefinedValue>dateOfLastUpdate</DefinedValue>
|
||||
<DisplayValue>label_last_updated</DisplayValue>
|
||||
<Type>default</Type>
|
||||
</DeviceInfoItem>
|
||||
<DeviceInfoItem>
|
||||
<DefinedValue>actions</DefinedValue>
|
||||
<DisplayValue>label_actions</DisplayValue>
|
||||
<Type>default</Type>
|
||||
</DeviceInfoItem>
|
||||
<DeviceInfoItem>
|
||||
<DefinedValue>FIRMWARE_VERSION</DefinedValue>
|
||||
<DisplayValue>label_firmware_version</DisplayValue>
|
||||
<Type>deviceDetailsMap</Type>
|
||||
</DeviceInfoItem>
|
||||
<DeviceInfoItem>
|
||||
<DefinedValue>FIRMWARE_APP_VERSION</DefinedValue>
|
||||
<DisplayValue>label_app_version</DisplayValue>
|
||||
<Type>deviceDetailsMap</Type>
|
||||
</DeviceInfoItem>
|
||||
<DeviceInfoItem>
|
||||
<DefinedValue>FIRMWARE_SYSTEM_VERSION</DefinedValue>
|
||||
<DisplayValue>label_firmware_system_version</DisplayValue>
|
||||
<Type>deviceDetailsMap</Type>
|
||||
</DeviceInfoItem>
|
||||
<DeviceInfoItem>
|
||||
<DefinedValue>batteryLevel</DefinedValue>
|
||||
<DisplayValue>label_battery_leve</DisplayValue>
|
||||
<Type>deviceInfo</Type>
|
||||
</DeviceInfoItem>
|
||||
<DeviceInfoItem>
|
||||
<DefinedValue>deviceModel</DefinedValue>
|
||||
<DisplayValue>label_deviceModel</DisplayValue>
|
||||
<Type>deviceInfo</Type>
|
||||
</DeviceInfoItem>
|
||||
<DeviceInfoItem>
|
||||
<DefinedValue>osVersion</DefinedValue>
|
||||
<DisplayValue>label_os_version</DisplayValue>
|
||||
<Type>deviceInfo</Type>
|
||||
</DeviceInfoItem>
|
||||
<DeviceInfoItem>
|
||||
<DefinedValue>vendor</DefinedValue>
|
||||
<DisplayValue>label_vendor</DisplayValue>
|
||||
<Type>deviceInfo</Type>
|
||||
</DeviceInfoItem>
|
||||
<DeviceInfoItem>
|
||||
<DefinedValue>availableRAMMemory</DefinedValue>
|
||||
<DisplayValue>label_available_ram_memory</DisplayValue>
|
||||
<Type>deviceInfo</Type>
|
||||
</DeviceInfoItem>
|
||||
<DeviceInfoItem>
|
||||
<DefinedValue>connectionType</DefinedValue>
|
||||
<DisplayValue>label_connection_type</DisplayValue>
|
||||
<Type>deviceInfo</Type>
|
||||
</DeviceInfoItem>
|
||||
<DeviceInfoItem>
|
||||
<DefinedValue>cpuUsage</DefinedValue>
|
||||
<DisplayValue>label_cpu_usage</DisplayValue>
|
||||
<Type>deviceInfo</Type>
|
||||
</DeviceInfoItem>
|
||||
<DeviceInfoItem>
|
||||
<DefinedValue>externalAvailableMemory</DefinedValue>
|
||||
<DisplayValue>label_external_available_memory</DisplayValue>
|
||||
<Type>deviceInfo</Type>
|
||||
</DeviceInfoItem>
|
||||
<DeviceInfoItem>
|
||||
<DefinedValue>externalTotalMemory</DefinedValue>
|
||||
<DisplayValue>label_external_tot_memory</DisplayValue>
|
||||
<Type>deviceInfo</Type>
|
||||
</DeviceInfoItem>
|
||||
<DeviceInfoItem>
|
||||
<DefinedValue>internalAvailableMemory</DefinedValue>
|
||||
<DisplayValue>label_internal_available_memory</DisplayValue>
|
||||
<Type>deviceInfo</Type>
|
||||
</DeviceInfoItem>
|
||||
<DeviceInfoItem>
|
||||
<DefinedValue>internalTotalMemory</DefinedValue>
|
||||
<DisplayValue>label_internal_tot_memory</DisplayValue>
|
||||
<Type>deviceInfo</Type>
|
||||
</DeviceInfoItem>
|
||||
<DeviceInfoItem>
|
||||
<DefinedValue>osBuildDate</DefinedValue>
|
||||
<DisplayValue>label_os_build_date</DisplayValue>
|
||||
<Type>deviceInfo</Type>
|
||||
</DeviceInfoItem>
|
||||
<DeviceInfoItem>
|
||||
<DefinedValue>pluggedIn</DefinedValue>
|
||||
<DisplayValue>label_plugged_in</DisplayValue>
|
||||
<Type>deviceInfo</Type>
|
||||
</DeviceInfoItem>
|
||||
<DeviceInfoItem>
|
||||
<DefinedValue>ssid</DefinedValue>
|
||||
<DisplayValue>label_ssid</DisplayValue>
|
||||
<Type>deviceInfo</Type>
|
||||
</DeviceInfoItem>
|
||||
<DeviceInfoItem>
|
||||
<DefinedValue>totalRAMMemory</DefinedValue>
|
||||
<DisplayValue>label_tot_ram_memory</DisplayValue>
|
||||
<Type>deviceInfo</Type>
|
||||
</DeviceInfoItem>
|
||||
<DeviceInfoItem>
|
||||
<DefinedValue>updatedTime</DefinedValue>
|
||||
<DisplayValue>label_updated_time</DisplayValue>
|
||||
<Type>deviceInfo</Type>
|
||||
</DeviceInfoItem>
|
||||
</DeviceInfoConfigurations>
|
||||
<AppRegistration>
|
||||
<Tags>
|
||||
<Tag>analytics_management</Tag>
|
||||
@ -215,6 +352,7 @@
|
||||
<Scope>perm:android:google-account</Scope>
|
||||
<Scope>perm:android:info</Scope>
|
||||
<Scope>perm:windows:lock-devices</Scope>
|
||||
<Scope>perm:windows:enroll</Scope>
|
||||
<Scope>perm:windows:disenroll</Scope>
|
||||
<Scope>perm:windows:wipe</Scope>
|
||||
<Scope>perm:windows:ring</Scope>
|
||||
@ -240,6 +378,10 @@
|
||||
<Scope>perm:ios:app-configurations</Scope>
|
||||
<Scope>perm:mac-os:restart</Scope>
|
||||
<Scope>perm:mac-os:shut-down</Scope>
|
||||
<Scope>perm:app:vpp:user:modify</Scope>
|
||||
<Scope>perm:app:vpp:user:view</Scope>
|
||||
<Scope>perm:app:vpp:asset:modify</Scope>
|
||||
<Scope>perm:app:vpp:asset:view</Scope>
|
||||
</Scopes>
|
||||
<SSOConfiguration>
|
||||
<Issuer>device-mgt</Issuer>
|
||||
|
||||
@ -608,7 +608,7 @@ CREATE TABLE IF NOT EXISTS DM_OTP_DATA (
|
||||
USERNAME VARCHAR(500) DEFAULT NOT NULL,
|
||||
EMAIL VARCHAR(100) NOT NULL,
|
||||
EMAIL_TYPE VARCHAR(20) NOT NULL,
|
||||
META_INFO VARCHAR(20000) NOT NULL,
|
||||
META_INFO VARCHAR(20000) NULL,
|
||||
CREATED_AT TIMESTAMP NOT NULL,
|
||||
EXPIRY_TIME INT NOT NULL DEFAULT 3600,
|
||||
IS_EXPIRED BOOLEAN DEFAULT false,
|
||||
|
||||
@ -669,7 +669,7 @@ CREATE TABLE DM_OTP_DATA (
|
||||
USERNAME VARCHAR(500) NOT NULL,
|
||||
EMAIL VARCHAR(100) NOT NULL,
|
||||
EMAIL_TYPE VARCHAR(20) NOT NULL,
|
||||
META_INFO VARCHAR(8000) NOT NULL,
|
||||
META_INFO VARCHAR(8000) NULL,
|
||||
CREATED_AT DATETIME2(0) NOT NULL,
|
||||
EXPIRY_TIME INT NOT NULL DEFAULT 3600,
|
||||
IS_EXPIRED BIT DEFAULT 0,
|
||||
|
||||
@ -665,7 +665,7 @@ CREATE TABLE IF NOT EXISTS DM_OTP_DATA (
|
||||
USERNAME VARCHAR(500) NOT NULL,
|
||||
EMAIL VARCHAR(100) NOT NULL,
|
||||
EMAIL_TYPE VARCHAR(20) NOT NULL,
|
||||
META_INFO VARCHAR(20000) NOT NULL,
|
||||
META_INFO VARCHAR(20000) NULL,
|
||||
CREATED_AT TIMESTAMP NOT NULL,
|
||||
EXPIRY_TIME INT NOT NULL DEFAULT 3600,
|
||||
IS_EXPIRED BOOLEAN DEFAULT false,
|
||||
|
||||
@ -1026,7 +1026,7 @@ CREATE TABLE DM_OTP_DATA (
|
||||
USERNAME VARCHAR(500) NOT NULL,
|
||||
EMAIL VARCHAR2(100) NOT NULL,
|
||||
EMAIL_TYPE VARCHAR2(20) NOT NULL,
|
||||
META_INFO VARCHAR2(20000) NOT NULL,
|
||||
META_INFO VARCHAR2(20000) NULL,
|
||||
CREATED_AT TIMESTAMP(0) NOT NULL,
|
||||
EXPIRY_TIME NUMBER(10) DEFAULT 3600 NOT NULL,
|
||||
IS_EXPIRED CHAR(1) DEFAULT false,
|
||||
|
||||
@ -672,7 +672,7 @@ CREATE TABLE IF NOT EXISTS DM_OTP_DATA (
|
||||
USERNAME VARCHAR(500) NOT NULL,
|
||||
EMAIL VARCHAR(100) NOT NULL,
|
||||
EMAIL_TYPE VARCHAR(20) NOT NULL,
|
||||
META_INFO VARCHAR(20000) NOT NULL,
|
||||
META_INFO VARCHAR(20000) NULL,
|
||||
CREATED_AT TIMESTAMP(0) NOT NULL,
|
||||
EXPIRY_TIME INT NOT NULL DEFAULT 3600,
|
||||
IS_EXPIRED BOOLEAN DEFAULT false,
|
||||
|
||||
Loading…
Reference in New Issue
Block a user