org.wso2.am.integration.tests.other.TokenEncryptionScopeTestCase.java Source code

Java tutorial

Introduction

Here is the source code for org.wso2.am.integration.tests.other.TokenEncryptionScopeTestCase.java

Source

/*
 *   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.
 *
 */
package org.wso2.am.integration.tests.other;

import org.apache.axis2.AxisFault;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.json.JSONException;
import org.json.JSONObject;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import org.wso2.am.integration.test.utils.APIManagerIntegrationTestException;
import org.wso2.am.integration.test.utils.base.APIMIntegrationBaseTest;
import org.wso2.am.integration.test.utils.base.APIMIntegrationConstants;
import org.wso2.am.integration.test.utils.bean.APILifeCycleState;
import org.wso2.am.integration.test.utils.bean.APILifeCycleStateRequest;
import org.wso2.am.integration.test.utils.bean.APIRequest;
import org.wso2.am.integration.test.utils.bean.APPKeyRequestGenerator;
import org.wso2.am.integration.test.utils.bean.SubscriptionRequest;
import org.wso2.am.integration.test.utils.clients.APIPublisherRestClient;
import org.wso2.am.integration.test.utils.clients.APIStoreRestClient;
import org.wso2.carbon.automation.engine.annotations.ExecutionEnvironment;
import org.wso2.carbon.automation.engine.annotations.SetEnvironment;
import org.wso2.carbon.automation.test.utils.common.TestConfigurationProvider;
import org.wso2.carbon.integration.common.admin.client.UserManagementClient;
import org.wso2.carbon.integration.common.utils.mgt.ServerConfigurationManager;
import org.wso2.carbon.user.mgt.stub.UserAdminUserAdminException;
import org.wso2.carbon.utils.ServerConstants;

import javax.xml.xpath.XPathExpressionException;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.rmi.RemoteException;

@SetEnvironment(executionEnvironments = { ExecutionEnvironment.STANDALONE })
public class TokenEncryptionScopeTestCase extends APIMIntegrationBaseTest {

    private static final Log log = LogFactory.getLog(TokenEncryptionScopeTestCase.class);

    private APIPublisherRestClient apiPublisher;

    private APIStoreRestClient apiStore;

    private UserManagementClient userManagementClient = null;

    private static final String API_NAME = "TokenEncryptionAPI";

    private static final String API_VERSION = "1.0.0";

    private static final String APP_NAME = "TokenEncryptionApp";

    private static final String USER_SAM = "sam";

    private static final String APP_DEV_USER = "mike";

    private static final String APP_DEV_PWD = "mike123";

    private static final String SUBSCRIBER_ROLE = "subscriber";

    private ServerConfigurationManager serverManager;

    private static final String APIM_CONFIG_XML = "api-manager.xml";

    private static final String IDENTITY_CONFIG_XML = "identity.xml";

    private static String apiProvider;

    @BeforeClass(alwaysRun = true)
    public void setEnvironment() throws Exception {

        super.init();

        apiProvider = publisherContext.getSuperTenant().getContextUser().getUserName();

        String carbonHome = System.getProperty(ServerConstants.CARBON_HOME);
        String artifactsLocation = TestConfigurationProvider.getResourceLocation() + File.separator + "artifacts"
                + File.separator + "AM" + File.separator + "configFiles" + File.separator + "token_encryption"
                + File.separator;

        String apimConfigArtifactLocation = artifactsLocation + APIM_CONFIG_XML;
        String identityConfigArtifactLocation = artifactsLocation + IDENTITY_CONFIG_XML;

        String apimRepositoryConfigLocation = carbonHome + File.separator + "repository" + File.separator + "conf"
                + File.separator + APIM_CONFIG_XML;

        String identityRepositoryConfigLocation = carbonHome + File.separator + "repository" + File.separator
                + "conf" + File.separator + "identity" + File.separator + IDENTITY_CONFIG_XML;

        File apimConfSourceFile = new File(apimConfigArtifactLocation);
        File apimConfTargetFile = new File(apimRepositoryConfigLocation);

        File identityConfSourceFile = new File(identityConfigArtifactLocation);
        File identityConfTargetFile = new File(identityRepositoryConfigLocation);

        serverManager = new ServerConfigurationManager(gatewayContextWrk);

        // apply configuration to  api-manager.xml
        serverManager.applyConfigurationWithoutRestart(apimConfSourceFile, apimConfTargetFile, true);
        log.info("api-manager.xml configuration file copy from :" + apimConfigArtifactLocation + " to :"
                + apimRepositoryConfigLocation);

        // apply configuration to identity.xml
        serverManager.applyConfigurationWithoutRestart(identityConfSourceFile, identityConfTargetFile, true);
        log.info("identity.xml configuration file copy from :" + identityConfigArtifactLocation + " to :"
                + identityRepositoryConfigLocation);

        serverManager.restartGracefully();

        //Initialize publisher and store.
        String publisherURLHttp = publisherUrls.getWebAppURLHttp();

        String storeURLHttp = storeUrls.getWebAppURLHttp();

        apiPublisher = new APIPublisherRestClient(publisherURLHttp);

        apiStore = new APIStoreRestClient(storeURLHttp);
    }

    @Test(groups = "wso2.am", description = "Check if Scopes work fine with token encryption enabled.")
    public void testTokenEncryptionWithScopes() {

        try {
            userManagementClient = new UserManagementClient(publisherContext.getContextUrls().getBackEndUrl(),
                    publisherContext.getContextTenant().getContextUser().getUserName(),
                    publisherContext.getContextTenant().getContextUser().getPassword());
            //adding new role subscriber
            userManagementClient.addRole(SUBSCRIBER_ROLE, new String[] {},
                    new String[] { "/permission/admin/login", "/permission/admin/manage/api/subscribe" });

            //creating user sam
            userManagementClient.addUser(USER_SAM, "sam123", new String[] { SUBSCRIBER_ROLE }, "sam");

            //creating user mike
            userManagementClient.addUser(APP_DEV_USER, APP_DEV_PWD, new String[] { SUBSCRIBER_ROLE }, APP_DEV_USER);

        } catch (AxisFault axisFault) {
            log.error("Error while creating UserManagementClient " + axisFault.getMessage());
            //Fail the test case.
            Assert.assertTrue(false, axisFault.getMessage());
        } catch (RemoteException e) {
            log.error("Error while adding role 'subscriber' or user 'mike'" + e.getMessage());
            //Fail the test case.
            Assert.assertTrue(false, e.getMessage());
        } catch (UserAdminUserAdminException e) {
            log.error("Error while adding role 'subscriber' or user 'mike'" + e.getMessage());
            //Fail the test case.
            Assert.assertTrue(false, e.getMessage());
        } catch (XPathExpressionException e) {
            log.error("Error when getting backend URLs of the publisher to initialize the UserManagementClient"
                    + e.getMessage());
            //Fail the test case.
            Assert.assertTrue(false, e.getMessage());
        }

        // Adding API
        String apiContext = "tokenencapi";
        String endpointUrl = gatewayUrlsWrk.getWebAppURLNhttp() + "response";

        //Create the api creation request object
        APIRequest apiRequest = null;
        try {
            apiRequest = new APIRequest(API_NAME, apiContext, new URL(endpointUrl));
        } catch (MalformedURLException e) {
            log.error("Invalid URL " + endpointUrl, e);
            //Fail the test case
            Assert.assertTrue(false);
        } catch (APIManagerIntegrationTestException e) {
            log.error("Integration Test error occurred ", e);
            //Fail the test case
            Assert.assertTrue(false);
        }
        apiRequest.setVersion(API_VERSION);
        apiRequest.setTiersCollection(APIMIntegrationConstants.API_TIER.UNLIMITED);
        apiRequest.setTier(APIMIntegrationConstants.API_TIER.UNLIMITED);

        try {
            apiPublisher.login(publisherContext.getContextTenant().getContextUser().getUserName(),
                    publisherContext.getContextTenant().getContextUser().getPassword());

            apiPublisher.addAPI(apiRequest);

            //publishing API
            APILifeCycleStateRequest updateRequest = new APILifeCycleStateRequest(API_NAME, apiProvider,
                    APILifeCycleState.PUBLISHED);
            apiPublisher.changeAPILifeCycleStatus(updateRequest);

            //resources are modified using swagger doc.
            // admin_scope(used for POST) :- admin
            // user_scope (used for GET) :- admin,subscriber
            String modifiedResource = "{\"paths\":{ \"/*\":{\"put\":{ \"responses\":{\"200\":{}},\"x-auth-type\":\"Application User\","
                    + "\"x-throttling-tier\":\"Unlimited\" },\"post\":{ \"responses\":{\"200\":{}},\"x-auth-type\":\"Application User\","
                    + "\"x-throttling-tier\":\"Unlimited\",\"x-scope\":\"admin_scope\"},\"get\":{ \"responses\":{\"200\":{}},\"x-auth-type\":\"Application User\","
                    + "\"x-throttling-tier\":\"Unlimited\",\"x-scope\":\"user_scope\"},\"delete\":{ \"responses\":{\"200\":{}},\"x-auth-type\":\"Application User\","
                    + "\"x-throttling-tier\":\"Unlimited\"},\"options\":{ \"responses\":{\"200\":{}},\"x-auth-type\":\"None\","
                    + "\"x-throttling-tier\":\"Unlimited\"}}},\"swagger\":\"2.0\",\"info\":{\"title\":\"" + API_NAME
                    + "\",\"version\":\"1.0.0\"},"
                    + "\"x-wso2-security\":{\"apim\":{\"x-wso2-scopes\":[{\"name\":\"admin_scope\",\"description\":\"\",\"key\":\"admin_scope\",\"roles\":\"admin\"},"
                    + "{\"name\":\"user_scope\",\"description\":\"\",\"key\":\"user_scope\",\"roles\":\"admin,subscriber\"}]}}}";

            apiPublisher.updateResourceOfAPI(apiProvider, API_NAME, API_VERSION, modifiedResource);

            // For Admin user
            // create new application and subscribing
            apiStore.login(APP_DEV_USER, APP_DEV_PWD);
            apiStore.addApplication(APP_NAME, APIMIntegrationConstants.APPLICATION_TIER.UNLIMITED, "some_url2",
                    "NewApp");
            SubscriptionRequest subscriptionRequest = new SubscriptionRequest(API_NAME, apiProvider);
            subscriptionRequest.setApplicationName(APP_NAME);
            subscriptionRequest.setTier(APIMIntegrationConstants.API_TIER.UNLIMITED);
            apiStore.subscribe(subscriptionRequest);

            //Generate production token and invoke with that
            APPKeyRequestGenerator generateAppKeyRequest = new APPKeyRequestGenerator(APP_NAME);
            String responseString = apiStore.generateApplicationKey(generateAppKeyRequest).getData();
            JSONObject jsonResponse = new JSONObject(responseString);

            // get Consumer Key and Consumer Secret
            String consumerKey = jsonResponse.getJSONObject("data").getJSONObject("key").getString("consumerKey");
            String consumerSecret = jsonResponse.getJSONObject("data").getJSONObject("key")
                    .getString("consumerSecret");

            URL tokenEndpointURL = new URL(gatewayUrlsWrk.getWebAppURLNhttps() + "token");
            String requestBody;
            JSONObject accessTokenGenerationResponse;

            //Obtain user access token for sam, request scope 'user_scope'
            requestBody = "grant_type=password&username=" + USER_SAM + "&password=sam123&scope=user_scope";
            accessTokenGenerationResponse = new JSONObject(apiStore
                    .generateUserAccessKey(consumerKey, consumerSecret, requestBody, tokenEndpointURL).getData());
            String receivedScope = accessTokenGenerationResponse.getString("scope");

            //Check if we receive the scope we requested for.
            Assert.assertEquals(receivedScope, "user_scope",
                    "Received scope is " + receivedScope + ", but expected user_scope");
        } catch (APIManagerIntegrationTestException e) {
            log.error("Error occurred while executing Test", e);
            //Fail the test case
            Assert.assertTrue(false);
        } catch (MalformedURLException e) {
            log.error("Malformed tokenEndpointURL ", e);
            //Fail the test case
            Assert.assertTrue(false);
        } catch (JSONException e) {
            log.error("Could not parse response JSON message received from the token endpoint ", e);
            //Fail the test case
            //Assert.assertTrue(false);
        } catch (XPathExpressionException e) {
            log.error("Error occurred while getting credentials from the publisher/store context ", e);
            //Fail the test case
            Assert.assertTrue(false);
        }
    }

    @AfterClass(alwaysRun = true)
    public void destroy() throws Exception {

        if (apiStore != null) {
            apiStore.removeApplication(APP_NAME);
        }

        if (apiPublisher != null) {
            apiPublisher.deleteAPI(API_NAME, API_VERSION, apiProvider);
        }

        if (userManagementClient != null) {
            userManagementClient.deleteUser(USER_SAM);
            userManagementClient.deleteUser(APP_DEV_USER);
            userManagementClient.deleteRole(SUBSCRIBER_ROLE);
        }

        serverManager.restoreToLastConfiguration();
        serverManager.restartGracefully();
        log.info("Restored configuration and restarted gracefully...");
    }

}