mirror of
https://repository.entgra.net/community/device-mgt-core.git
synced 2025-10-06 02:01:45 +00:00
#726 : Resolving cannot log into devicemgt app when tenant is not loaded in API Manager
This commit is contained in:
parent
d3b322ed4e
commit
2831bfaf2c
@ -26,6 +26,12 @@ import org.wso2.carbon.apimgt.application.extension.exception.APIManagerExceptio
|
||||
*/
|
||||
public interface APIManagementProviderService {
|
||||
|
||||
/**
|
||||
* Check whether the tier is loaded for the tenant.
|
||||
* @return
|
||||
*/
|
||||
boolean isTierLoaded();
|
||||
|
||||
/**
|
||||
* Generate and retreive application keys. if the application does exist then
|
||||
* create it and subscribe to apis that are grouped with the tags.
|
||||
|
||||
@ -45,8 +45,22 @@ public class APIManagementProviderServiceImpl implements APIManagementProviderSe
|
||||
private static final String CONTENT_TYPE = "application/json";
|
||||
private static final int MAX_API_PER_TAG = 200;
|
||||
private static final String APP_TIER_TYPE = "application";
|
||||
private static final Map<String, String> tiersMap = new HashMap<>();
|
||||
private static final int MAX_ATTEMPTS = 20;
|
||||
|
||||
public boolean isTierLoaded() {
|
||||
StoreClient storeClient = APIApplicationManagerExtensionDataHolder.getInstance().getIntegrationClientService()
|
||||
.getStoreClient();
|
||||
String tenantDomain = PrivilegedCarbonContext.getThreadLocalCarbonContext()
|
||||
.getTenantDomain();
|
||||
try {
|
||||
|
||||
storeClient.getIndividualTier().tiersTierLevelTierNameGet(ApiApplicationConstants.DEFAULT_TIER,
|
||||
APP_TIER_TYPE,
|
||||
tenantDomain, CONTENT_TYPE, null, null);
|
||||
return true;
|
||||
} catch (FeignException e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeAPIApplication(String applicationName, String username) throws APIManagerException {
|
||||
@ -72,31 +86,8 @@ public class APIManagementProviderServiceImpl implements APIManagementProviderSe
|
||||
throws APIManagerException {
|
||||
StoreClient storeClient = APIApplicationManagerExtensionDataHolder.getInstance().getIntegrationClientService()
|
||||
.getStoreClient();
|
||||
//This is a fix to avoid race condition and trying to load tenant related tiers before invocation.
|
||||
String tenantDomain = PrivilegedCarbonContext.getThreadLocalCarbonContext()
|
||||
.getTenantDomain();
|
||||
String tiersLoadedForTenant = tiersMap.get(tenantDomain);
|
||||
|
||||
if (tiersLoadedForTenant == null) {
|
||||
boolean tierLoaded = false;
|
||||
int attempts = 0;
|
||||
do {
|
||||
try {
|
||||
storeClient.getIndividualTier()
|
||||
.tiersTierLevelTierNameGet(ApiApplicationConstants.DEFAULT_TIER, APP_TIER_TYPE,
|
||||
tenantDomain, CONTENT_TYPE, null, null);
|
||||
tiersMap.put(tenantDomain, "exist");
|
||||
tierLoaded = true;
|
||||
} catch (FeignException e) {
|
||||
attempts++;
|
||||
try {
|
||||
Thread.sleep(500);
|
||||
} catch (InterruptedException ex) {
|
||||
log.warn("Interrupted the waiting for tier availability.");
|
||||
}
|
||||
}
|
||||
} while ((!tierLoaded) && attempts < MAX_ATTEMPTS);
|
||||
}
|
||||
|
||||
ApplicationList applicationList = storeClient.getApplications()
|
||||
.applicationsGet("", applicationName, 1, 0, CONTENT_TYPE, null);
|
||||
|
||||
@ -19,7 +19,9 @@ package org.wso2.carbon.apimgt.integration.client.store;
|
||||
|
||||
import feign.Feign;
|
||||
import feign.Logger;
|
||||
import feign.Request;
|
||||
import feign.RequestInterceptor;
|
||||
import feign.Retryer;
|
||||
import feign.gson.GsonDecoder;
|
||||
import feign.gson.GsonEncoder;
|
||||
import feign.slf4j.Slf4jLogger;
|
||||
@ -28,6 +30,8 @@ import org.wso2.carbon.apimgt.integration.client.configs.APIMConfigReader;
|
||||
import org.wso2.carbon.apimgt.integration.generated.client.store.api.*;
|
||||
import org.wso2.carbon.core.util.Utils;
|
||||
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
* API Store client, created using swagger gen.
|
||||
*/
|
||||
@ -62,8 +66,10 @@ public class StoreClient {
|
||||
individualSubscription = builder.target(SubscriptionIndividualApi.class, basePath);
|
||||
subscriptionMultitpleApi = builder.target(SubscriptionMultitpleApi.class, basePath);
|
||||
tags = builder.target(TagCollectionApi.class, basePath);
|
||||
tiers = builder.target(ThrottlingTierCollectionApi.class, basePath);
|
||||
individualTier = builder.target(ThrottlingTierIndividualApi.class, basePath);
|
||||
tiers = builder.retryer(new Retryer.Default(100L, TimeUnit.SECONDS.toMillis(1L), 1))
|
||||
.options(new Request.Options(10000, 5000))
|
||||
.target(ThrottlingTierCollectionApi.class, basePath);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@ -176,6 +176,27 @@ if (uriMatcher.match("/{context}/api/user/authenticate")) {
|
||||
}
|
||||
} else if (uriMatcher.match("/{context}/api/user/all")) {
|
||||
result = userModule.getUsers();
|
||||
} else if (uriMatcher.match("/{context}/api/user/environment-loaded")) {
|
||||
try {
|
||||
var carbonUser = session.get(constants.USER_SESSION_KEY);
|
||||
if (!carbonUser) {
|
||||
response.sendRedirect("/devicemgt/login?#login-required");
|
||||
exit();
|
||||
}
|
||||
utility.startTenantFlow(carbonUser);
|
||||
var APIManagementProviderService = utility.getAPIManagementProviderService();
|
||||
var isLoaded = APIManagementProviderService.isTierLoaded();
|
||||
result = {"isLoaded": isLoaded};
|
||||
if (isLoaded) {
|
||||
var samlToken = session.get(constants.SAML_TOKEN_KEY);
|
||||
if (samlToken) {
|
||||
apiWrapperUtil.setupTokenPairByJWTGrantType(carbonUser.username + '@' + carbonUser.domain, samlToken);
|
||||
}
|
||||
}
|
||||
response.contentType = 'application/json';
|
||||
} finally {
|
||||
utility.endTenantFlow();
|
||||
}
|
||||
}
|
||||
|
||||
// returning the result.
|
||||
|
||||
@ -11,7 +11,7 @@
|
||||
"login": {
|
||||
"onSuccess": {
|
||||
"script": "/app/modules/login.js",
|
||||
"page": "cdmf.page.dashboard"
|
||||
"page": "cdmf.page.processing"
|
||||
},
|
||||
"onFail": {
|
||||
"script": "/app/modules/login.js",
|
||||
|
||||
@ -0,0 +1,57 @@
|
||||
{{!-- Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||
|
||||
WSO2 Inc. licenses this file to you under the Apache License,
|
||||
Version 2.0 (the "License"); you may not use this file except
|
||||
in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
|
||||
either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License. --}}
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
{{defineZone "favicon"}}
|
||||
<title>
|
||||
{{defineZone "title"}}
|
||||
</title>
|
||||
{{defineZone "topLibCss"}}
|
||||
{{defineZone "topCss"}}
|
||||
{{defineZone "topJs"}}
|
||||
</head>
|
||||
<body>
|
||||
<!--modal-->
|
||||
<div class="modal fade" tabindex="-1" role="dialog" aria-labelledby="modalDemo">
|
||||
<div class="modal-dialog" role="document">
|
||||
<div class="modal-content clearfix">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><i class="fw fw-cancel"></i></button>
|
||||
</div>
|
||||
<div class="modal-body add-margin-top-2x add-margin-bottom-2x">
|
||||
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--modal-->
|
||||
|
||||
{{defineZone "content"}}
|
||||
|
||||
{{defineZone "bottomModalContent"}}
|
||||
{{defineZone "bottomLibJs"}}
|
||||
{{defineZone "bottomJs"}}
|
||||
</body>
|
||||
</html>
|
||||
@ -81,3 +81,6 @@ var CACHED_CREDENTIALS = "tenantBasedCredentials";
|
||||
var CACHED_CREDENTIALS_FOR_WEBSOCKET_APP = "tenantBasedWebSocketClientCredentials";
|
||||
|
||||
var ALLOWED_SCOPES = "scopes";
|
||||
|
||||
var SAML_TOKEN_KEY = "samlToken";
|
||||
var SKIP_WELCOME_SCREEN ="skipWelcomeScreen";
|
||||
|
||||
@ -25,6 +25,19 @@ var onFail;
|
||||
onSuccess = function (context) {
|
||||
var utility = require("/app/modules/utility.js").utility;
|
||||
var apiWrapperUtil = require("/app/modules/oauth/token-handlers.js")["handlers"];
|
||||
try {
|
||||
utility.startTenantFlow(context.user);
|
||||
var APIManagementProviderService = utility.getAPIManagementProviderService();
|
||||
var isLoaded = APIManagementProviderService.isTierLoaded();
|
||||
if(!isLoaded && context.input.samlToken) {
|
||||
session.put(constants.SKIP_WELCOME_SCREEN, false);
|
||||
session.put(constants.SAML_TOKEN_KEY, context.input.samlToken);
|
||||
return;
|
||||
}
|
||||
} finally {
|
||||
utility.endTenantFlow();
|
||||
}
|
||||
session.put(constants.SKIP_WELCOME_SCREEN, true);
|
||||
if (context.input.samlToken) {
|
||||
//apiWrapperUtil.setupTokenPairBySamlGrantType(context.user.username + '@' + context.user.domain, context.input.samlToken);
|
||||
/**
|
||||
|
||||
@ -53,6 +53,10 @@ utility = function () {
|
||||
return getOsgiService('org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService');
|
||||
};
|
||||
|
||||
publicMethods.getAPIManagementProviderService = function () {
|
||||
return getOsgiService('org.wso2.carbon.apimgt.application.extension.APIManagementProviderService');
|
||||
};
|
||||
|
||||
publicMethods.getUserManagementService = function () {
|
||||
return getOsgiService("org.wso2.carbon.device.mgt.user.core.UserManager");
|
||||
};
|
||||
|
||||
@ -16,7 +16,7 @@
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
function onRequest() {
|
||||
function onRequest(context) {
|
||||
var constants = require("/app/modules/constants.js");
|
||||
var userModule = require("/app/modules/business-controllers/user.js")["userModule"];
|
||||
var devicemgtProps = require("/app/modules/conf-reader/main.js")["conf"];
|
||||
@ -24,6 +24,11 @@ function onRequest() {
|
||||
var groupModule = require("/app/modules/business-controllers/group.js")["groupModule"];
|
||||
var policyModule = require("/app/modules/business-controllers/policy.js")["policyModule"];
|
||||
|
||||
if(!session.get(constants["TOKEN_PAIR"])){
|
||||
response.sendRedirect(context.app.context + "/welcome");
|
||||
return;
|
||||
}
|
||||
|
||||
var user = session.get(constants["USER_SESSION_KEY"]);
|
||||
var permissions = userModule.getUIPermissions();
|
||||
|
||||
|
||||
@ -0,0 +1,57 @@
|
||||
{{!
|
||||
Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||
|
||||
WSO2 Inc. licenses this file to you under the Apache License,
|
||||
Version 2.0 (the "License"); you may not use this file except
|
||||
in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
}}
|
||||
{{unit "cdmf.unit.ui.title" pageTitle="Home"}}
|
||||
|
||||
{{#zone "breadcrumbs"}}
|
||||
<li>
|
||||
<a href="{{@app.context}}/">
|
||||
<i class="icon fw fw-home"></i>
|
||||
</a>
|
||||
</li>
|
||||
{{/zone}}
|
||||
|
||||
{{#zone "content"}}
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
Loading...Please Wait
|
||||
</div>
|
||||
</div>
|
||||
{{/zone}}
|
||||
|
||||
{{#zone "bottomJs"}}
|
||||
<script type="text/javascript">
|
||||
$('body').attr("data-toggle", "loading")
|
||||
.attr("data-loading-style", "overlay")
|
||||
.attr("data-loading-text", "SETTING UP YOUR ENVIRONMENT . . .");
|
||||
$('[data-toggle="loading"]').loading('show');
|
||||
</script>
|
||||
{{js "/js/script.js"}}
|
||||
{{/zone}}
|
||||
|
||||
{{#zone "topCss"}}
|
||||
<style>
|
||||
.loading[data-loading-style=overlay] .loading-bg{
|
||||
background: #11375B;
|
||||
opacity: 1;
|
||||
filter: alpha(opacity=100);
|
||||
}
|
||||
.loading .loading-animation{
|
||||
width : 200px;
|
||||
}
|
||||
</style>
|
||||
{{/zone}}
|
||||
@ -0,0 +1,27 @@
|
||||
/*
|
||||
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||
*
|
||||
* WSO2 Inc. licenses this file to you under the Apache License,
|
||||
* Version 2.0 (the "License"); you may not use this file except
|
||||
* in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
function onRequest(context) {
|
||||
var constants = require("/app/modules/constants.js");
|
||||
var skipWelcomeScreen = session.get(constants.SKIP_WELCOME_SCREEN);
|
||||
if (skipWelcomeScreen) {
|
||||
response.sendRedirect(context.app.context + "/");
|
||||
exit();
|
||||
}
|
||||
return {};
|
||||
}
|
||||
@ -0,0 +1,5 @@
|
||||
{
|
||||
"version": "1.0.0",
|
||||
"uri": "/welcome",
|
||||
"layout": "cdmf.layout.loading"
|
||||
}
|
||||
@ -0,0 +1,30 @@
|
||||
var pollingCount = 24;
|
||||
function poll() {
|
||||
$.ajax({
|
||||
url: context + "/api/user/environment-loaded",
|
||||
type: "GET",
|
||||
success: function (data) {
|
||||
if (data.isLoaded) {
|
||||
window.location = context + "/";
|
||||
}
|
||||
},
|
||||
dataType: "json",
|
||||
complete: setTimeout(function () {
|
||||
pollingCount = pollingCount - 1;
|
||||
if (pollingCount > 0) {
|
||||
poll();
|
||||
} else {
|
||||
$(".loading-animation .logo").hide();
|
||||
$(".loading-animation").prepend(
|
||||
'<i class="fw fw-error fw-inverse fw-2x" style="float: left;"></i>');
|
||||
$(".loading-animation p").css("width", "150%")
|
||||
.html("Ops... it seems something went wrong.<br/> Refresh the page to retry!");
|
||||
}
|
||||
}, 5000),
|
||||
timeout: 5000
|
||||
});
|
||||
}
|
||||
|
||||
$(document).ready(function () {
|
||||
poll();
|
||||
});
|
||||
Loading…
Reference in New Issue
Block a user