blob: 33cb17aadd1e645cd1d169a08ebd1952d97dc60b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF 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.apache.fineract.cn.anubis.test.v1;
import static org.apache.fineract.cn.test.env.TestEnvironment.SPRING_APPLICATION_NAME_PROPERTY;
import org.apache.fineract.cn.anubis.api.v1.client.Anubis;
import org.apache.fineract.cn.anubis.api.v1.client.AnubisApiFactory;
import org.apache.fineract.cn.anubis.api.v1.domain.AllowedOperation;
import org.apache.fineract.cn.anubis.api.v1.domain.ApplicationSignatureSet;
import org.apache.fineract.cn.anubis.api.v1.domain.Signature;
import org.apache.fineract.cn.api.context.AutoSeshat;
import org.apache.fineract.cn.api.context.AutoUserContext;
import org.apache.fineract.cn.lang.AutoTenantContext;
import org.apache.fineract.cn.lang.TenantContextHolder;
import org.apache.fineract.cn.test.env.TestEnvironment;
import org.junit.rules.ExternalResource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.security.interfaces.RSAPublicKey;
import java.util.Collections;
import java.util.function.BooleanSupplier;
/**
* Needs to be initialized after the tenant context is set.
*
* @author Myrle Krantz
*/
@SuppressWarnings({"WeakerAccess", "unused"})
public class TenantApplicationSecurityEnvironmentTestRule extends ExternalResource {
private final String applicationName;
private final String applicationUri;
private final SystemSecurityEnvironment systemSecurityEnvironment;
private final BooleanSupplier waitForInitialize;
private final Logger logger;
public TenantApplicationSecurityEnvironmentTestRule(final TestEnvironment testEnvironment) {
this(testEnvironment, () -> true);
}
public TenantApplicationSecurityEnvironmentTestRule(final TestEnvironment testEnvironment, final BooleanSupplier waitForInitialize)
{
this(testEnvironment.getProperty(SPRING_APPLICATION_NAME_PROPERTY),
testEnvironment.serverURI(),
new SystemSecurityEnvironment(
testEnvironment.getSystemKeyTimestamp(),
testEnvironment.getSystemPublicKey(),
testEnvironment.getSystemPrivateKey()),
waitForInitialize);
}
public TenantApplicationSecurityEnvironmentTestRule(final String applicationName, final String applicationUri, final SystemSecurityEnvironment systemSecurityEnvironment) {
this(applicationName, applicationUri, systemSecurityEnvironment, () -> true);
}
public TenantApplicationSecurityEnvironmentTestRule(final String applicationName, final String applicationUri, final SystemSecurityEnvironment systemSecurityEnvironment, final BooleanSupplier waitForInitialize)
{
this.applicationName = applicationName;
this.applicationUri = applicationUri;
this.systemSecurityEnvironment = systemSecurityEnvironment;
this.waitForInitialize = waitForInitialize;
this.logger = LoggerFactory.getLogger(SystemSecurityEnvironment.LOGGER_NAME);
}
@Override
protected void before(){
initializeTenantInApplication();
if (!waitForInitialize.getAsBoolean())
throw new IllegalStateException("Initialize didn't complete.");
}
public ApplicationSignatureSet initializeTenantInApplication()
{
final Anubis anubis = getAnubis();
final String systemToken = systemSecurityEnvironment.systemToken(applicationName);
try (final AutoTenantContext x = new AutoTenantContext(TenantContextHolder.checkedGetIdentifier())) {
try (final AutoSeshat y = new AutoSeshat(systemToken)) {
final String keyTimestamp = systemSecurityEnvironment.tenantKeyTimestamp();
final RSAPublicKey publicKey = systemSecurityEnvironment.tenantPublicKey();
final Signature identityManagerSignature = new Signature(publicKey.getModulus(), publicKey.getPublicExponent());
final ApplicationSignatureSet resultingSignatureSet
= anubis.createSignatureSet(keyTimestamp, identityManagerSignature);
anubis.initializeResources();
return resultingSignatureSet;
}}
}
public Anubis getAnubis() {
return AnubisApiFactory.create(applicationUri, logger);
}
public SystemSecurityEnvironment getSystemSecurityEnvironment()
{
return systemSecurityEnvironment;
}
public AutoUserContext createAutoUserContext(final String userName)
{
return systemSecurityEnvironment.createAutoUserContext(userName, Collections.singletonList(applicationName));
}
public AutoUserContext createAutoSeshatContext()
{
return systemSecurityEnvironment.createAutoSystemContext(applicationName);
}
public AutoUserContext createAutoSeshatContext(final String tenantName)
{
return systemSecurityEnvironment.createAutoSystemContext(tenantName, applicationName);
}
public String getPermissionToken(
final String userName,
final String uri,
final AllowedOperation allowedOperation) {
return systemSecurityEnvironment.getPermissionToken(userName, applicationName, uri, allowedOperation);
}
public String systemToken() {
return systemSecurityEnvironment.systemToken(applicationName);
}
}