Better error handling in htpasswd
CSP handling is now separate, and the MQ return codes are tidied up. Also added defaultIdentityTest to JMS tests and fixed copyright dates for htpasswd code
This commit is contained in:
committed by
Arthur J Barr
parent
76070234d4
commit
a24258834e
@@ -1,4 +1,4 @@
|
||||
# © Copyright IBM Corporation 2018, 2019
|
||||
# © Copyright IBM Corporation 2018, 2021
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
@@ -33,4 +33,5 @@ RUN find /usr/src/mymaven
|
||||
FROM docker.io/ibmjava:8-jre
|
||||
COPY --from=builder /usr/src/mymaven/target/*.jar /opt/app/
|
||||
COPY --from=builder /usr/src/mymaven/target/lib/*.jar /opt/app/
|
||||
USER 1001
|
||||
ENTRYPOINT ["java", "-classpath", "/opt/app/*", "org.junit.platform.console.ConsoleLauncher", "-p", "com.ibm.mqcontainer.test", "--details", "verbose"]
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!--
|
||||
© Copyright IBM Corporation 2018, 2020
|
||||
© Copyright IBM Corporation 2018, 2021
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
@@ -65,5 +65,9 @@ limitations under the License.
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</build>
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||
</properties>
|
||||
</project>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
© Copyright IBM Corporation 2018
|
||||
© Copyright IBM Corporation 2018, 2021
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
@@ -15,7 +15,7 @@ limitations under the License.
|
||||
*/
|
||||
package com.ibm.mqcontainer.test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
@@ -32,9 +32,12 @@ import javax.net.ssl.SSLContext;
|
||||
import javax.net.ssl.SSLSocketFactory;
|
||||
import javax.net.ssl.TrustManagerFactory;
|
||||
|
||||
import com.ibm.mq.MQException;
|
||||
import com.ibm.mq.constants.MQConstants;
|
||||
import com.ibm.mq.jms.MQConnectionFactory;
|
||||
import com.ibm.mq.jms.MQQueue;
|
||||
import com.ibm.msg.client.wmq.WMQConstants;
|
||||
import com.ibm.msg.client.jms.DetailedJMSSecurityRuntimeException;
|
||||
|
||||
import org.junit.jupiter.api.AfterAll;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
@@ -57,27 +60,18 @@ class JMSTests {
|
||||
static SSLSocketFactory createSSLSocketFactory() throws IOException, GeneralSecurityException {
|
||||
KeyStore ts=KeyStore.getInstance("jks");
|
||||
ts.load(new FileInputStream(TRUSTSTORE), PASSPHRASE.toCharArray());
|
||||
// KeyManagerFactory kmf=KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
|
||||
TrustManagerFactory tmf=TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
|
||||
tmf.init(ts);
|
||||
// tmf.init();
|
||||
SSLContext ctx = SSLContext.getInstance("TLSv1.2");
|
||||
// Security.setProperty("crypto.policy", "unlimited");
|
||||
ctx.init(null, tmf.getTrustManagers(), null);
|
||||
return ctx.getSocketFactory();
|
||||
}
|
||||
|
||||
static JMSContext create(String channel, String addr, String user, String password) throws JMSException, IOException, GeneralSecurityException {
|
||||
LOGGER.info(String.format("Connecting to %s/TCP/%s(1414) as %s", channel, addr, user));
|
||||
static MQConnectionFactory createMQConnectionFactory(String channel, String addr) throws JMSException, IOException, GeneralSecurityException {
|
||||
MQConnectionFactory factory = new MQConnectionFactory();
|
||||
factory.setTransportType(WMQConstants.WMQ_CM_CLIENT);
|
||||
factory.setChannel(channel);
|
||||
factory.setConnectionNameList(String.format("%s(1414)", addr));
|
||||
// If a password is set, make sure it gets sent to the queue manager for authentication
|
||||
if (password != null) {
|
||||
factory.setBooleanProperty(WMQConstants.USER_AUTHENTICATION_MQCSP, true);
|
||||
}
|
||||
// factory.setClientReconnectOptions(WMQConstants.WMQ_CLIENT_RECONNECT);
|
||||
if (TRUSTSTORE == null) {
|
||||
LOGGER.info("Not using TLS");
|
||||
}
|
||||
@@ -94,12 +88,33 @@ class JMSTests {
|
||||
factory.setSSLCipherSuite("TLS_RSA_WITH_AES_128_CBC_SHA256");
|
||||
}
|
||||
}
|
||||
// Give up if unable to reconnect for 10 minutes
|
||||
// factory.setClientReconnectTimeout(600);
|
||||
// LOGGER.info(String.format("user=%s pw=%s", user, password));
|
||||
return factory;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a JMSContext with the supplied user and password.
|
||||
*/
|
||||
static JMSContext create(String channel, String addr, String user, String password) throws JMSException, IOException, GeneralSecurityException {
|
||||
LOGGER.info(String.format("Connecting to %s/TCP/%s(1414) as %s", channel, addr, user));
|
||||
MQConnectionFactory factory = createMQConnectionFactory(channel, addr);
|
||||
// If a password is set, make sure it gets sent to the queue manager for authentication
|
||||
if (password != null) {
|
||||
factory.setBooleanProperty(WMQConstants.USER_AUTHENTICATION_MQCSP, true);
|
||||
}
|
||||
LOGGER.info(String.format("CSP authentication: %s", factory.getBooleanProperty(WMQConstants.USER_AUTHENTICATION_MQCSP)));
|
||||
return factory.createContext(user, password);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a JMSContext with the default user identity (from the OS)
|
||||
*/
|
||||
static JMSContext create(String channel, String addr) throws JMSException, IOException, GeneralSecurityException {
|
||||
LOGGER.info(String.format("Connecting to %s/TCP/%s(1414) as OS user '%s'", channel, addr, System.getProperty("user.name")));
|
||||
MQConnectionFactory factory = createMQConnectionFactory(channel, addr);
|
||||
LOGGER.info(String.format("CSP authentication: %s", factory.getBooleanProperty(WMQConstants.USER_AUTHENTICATION_MQCSP)));
|
||||
return factory.createContext();
|
||||
}
|
||||
|
||||
@BeforeAll
|
||||
private static void waitForQueueManager() {
|
||||
for (int i = 0; i < 20; i++) {
|
||||
@@ -116,28 +131,34 @@ class JMSTests {
|
||||
}
|
||||
}
|
||||
|
||||
@BeforeEach
|
||||
void connect() throws Exception {
|
||||
context = create(CHANNEL, ADDR, USER, PASSWORD);
|
||||
}
|
||||
|
||||
@Test
|
||||
void succeedingTest(TestInfo t) throws JMSException {
|
||||
void putGetTest(TestInfo t) throws Exception {
|
||||
context = create(CHANNEL, ADDR, USER, PASSWORD);
|
||||
Queue queue = new MQQueue("DEV.QUEUE.1");
|
||||
context.createProducer().send(queue, t.getDisplayName());
|
||||
Message m = context.createConsumer(queue).receive();
|
||||
assertNotNull(m.getBody(String.class));
|
||||
}
|
||||
|
||||
// @Test
|
||||
// void failingTest() {
|
||||
// fail("a failing test");
|
||||
// }
|
||||
|
||||
@Test
|
||||
@Disabled("for demonstration purposes")
|
||||
void skippedTest() {
|
||||
// not executed
|
||||
void defaultIdentityTest(TestInfo t) throws Exception {
|
||||
LOGGER.info(String.format("Password='%s'", PASSWORD));
|
||||
try {
|
||||
// Don't pass a user/password, which should cause the default identity to be used
|
||||
context = create(CHANNEL, ADDR);
|
||||
} catch (DetailedJMSSecurityRuntimeException ex) {
|
||||
Throwable cause = ex.getCause();
|
||||
assertNotNull(cause);
|
||||
assertTrue(cause instanceof MQException);
|
||||
assertEquals(MQConstants.MQRC_NOT_AUTHORIZED, ((MQException)cause).getReason());
|
||||
return;
|
||||
}
|
||||
// The default developer config allows any user to appear as "app", and use a blank password. This is done with the MCAUSER on the channel.
|
||||
// If this test is run on a queue manager without a password set, then it should be possible to connect without exception.
|
||||
// If this test is run on a queue manager with a password set, then an exception should be thrown, because this test doesn't send a password.
|
||||
if ((PASSWORD != null) && (PASSWORD != "")) {
|
||||
fail("Exception not thrown");
|
||||
}
|
||||
}
|
||||
|
||||
@AfterEach
|
||||
@@ -146,9 +167,4 @@ class JMSTests {
|
||||
context.close();
|
||||
}
|
||||
}
|
||||
|
||||
@AfterAll
|
||||
static void tearDownAll() {
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user