Apply eclipse-formatter conventions
This commit is contained in:
parent
0def447750
commit
d784cb6a88
|
@ -74,25 +74,27 @@ import org.springframework.util.ClassUtils;
|
||||||
import org.springframework.util.StringUtils;
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@link EnableAutoConfiguration Auto-configuration} for embedding an extensible shell into a Spring
|
* {@link EnableAutoConfiguration Auto-configuration} for embedding an extensible shell
|
||||||
* Boot enabled application. By default a SSH daemon is started on port 2000 with a default username
|
* into a Spring Boot enabled application. By default a SSH daemon is started on port 2000
|
||||||
* <code>user</code> and password (default password is logged during application startup).
|
* with a default username <code>user</code> and password (default password is logged
|
||||||
|
* during application startup).
|
||||||
*
|
*
|
||||||
* <p>
|
* <p>
|
||||||
* This configuration will auto detect the existence of a Spring Security {@link AuthenticationManager}
|
* This configuration will auto detect the existence of a Spring Security
|
||||||
* and will delegate authentication requests for shell access to this detected instance.
|
* {@link AuthenticationManager} and will delegate authentication requests for shell
|
||||||
|
* access to this detected instance.
|
||||||
*
|
*
|
||||||
* <p>
|
* <p>
|
||||||
* To add customizations to the shell simply define beans of type {@link CRaSHPlugin} in the
|
* To add customizations to the shell simply define beans of type {@link CRaSHPlugin} in
|
||||||
* application context. Those beans will get auto detected during startup and registered with the
|
* the application context. Those beans will get auto detected during startup and
|
||||||
* underlying shell infrastructure.
|
* registered with the underlying shell infrastructure.
|
||||||
*
|
*
|
||||||
* <p>
|
* <p>
|
||||||
* Additional shell commands can be implemented using the guide and documentation at
|
* Additional shell commands can be implemented using the guide and documentation at <a
|
||||||
* <a href="http://www.crashub.org">crashub.org</a>. By default Boot will search for commands using
|
* href="http://www.crashub.org">crashub.org</a>. By default Boot will search for commands
|
||||||
* the following classpath scanning pattern <code>classpath*:/commands/**</code>. To add different
|
* using the following classpath scanning pattern <code>classpath*:/commands/**</code>. To
|
||||||
* locations or override the default use <code>shell.command_path_patterns</code> in your application
|
* add different locations or override the default use
|
||||||
* configuration.
|
* <code>shell.command_path_patterns</code> in your application configuration.
|
||||||
*
|
*
|
||||||
* @author Christian Dupuis
|
* @author Christian Dupuis
|
||||||
*/
|
*/
|
||||||
|
@ -104,8 +106,7 @@ public class CrshAutoConfiguration {
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private CrshProperties properties;
|
private CrshProperties properties;
|
||||||
|
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
@ConditionalOnExpression("#{environment['shell.auth'] == 'jaas'}")
|
@ConditionalOnExpression("#{environment['shell.auth'] == 'jaas'}")
|
||||||
@ConditionalOnMissingBean({ AuthenticationProperties.class })
|
@ConditionalOnMissingBean({ AuthenticationProperties.class })
|
||||||
|
@ -126,7 +127,7 @@ public class CrshAutoConfiguration {
|
||||||
public AuthenticationProperties simpleAuthenticationProperties() {
|
public AuthenticationProperties simpleAuthenticationProperties() {
|
||||||
return new SimpleAuthenticationProperties();
|
return new SimpleAuthenticationProperties();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
@ConditionalOnExpression("#{environment['shell.auth'] == 'spring'}")
|
@ConditionalOnExpression("#{environment['shell.auth'] == 'spring'}")
|
||||||
@ConditionalOnMissingBean({ AuthenticationProperties.class })
|
@ConditionalOnMissingBean({ AuthenticationProperties.class })
|
||||||
|
@ -144,23 +145,21 @@ public class CrshAutoConfiguration {
|
||||||
@ConditionalOnMissingBean({ PluginLifeCycle.class })
|
@ConditionalOnMissingBean({ PluginLifeCycle.class })
|
||||||
public PluginLifeCycle shellBootstrap() {
|
public PluginLifeCycle shellBootstrap() {
|
||||||
CrshBootstrap bs = new CrshBootstrap();
|
CrshBootstrap bs = new CrshBootstrap();
|
||||||
bs.setConfig(properties.mergeProperties(new Properties()));
|
bs.setConfig(this.properties.mergeProperties(new Properties()));
|
||||||
return bs;
|
return bs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static class CrshBootstrap extends PluginLifeCycle {
|
public static class CrshBootstrap extends PluginLifeCycle {
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private ListableBeanFactory beanFactory;
|
private ListableBeanFactory beanFactory;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private CrshProperties properties;
|
private CrshProperties properties;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private ResourcePatternResolver resourceLoader;
|
private ResourcePatternResolver resourceLoader;
|
||||||
|
|
||||||
|
|
||||||
@PreDestroy
|
@PreDestroy
|
||||||
public void destroy() {
|
public void destroy() {
|
||||||
stop();
|
stop();
|
||||||
|
@ -168,77 +167,83 @@ public class CrshAutoConfiguration {
|
||||||
|
|
||||||
@PostConstruct
|
@PostConstruct
|
||||||
public void init() throws Exception {
|
public void init() throws Exception {
|
||||||
FS commandFileSystem = createFileSystem(properties.getCommandPathPatterns());
|
FS commandFileSystem = createFileSystem(this.properties
|
||||||
FS confFileSystem = createFileSystem(properties.getConfigPathPatterns());
|
.getCommandPathPatterns());
|
||||||
|
FS confFileSystem = createFileSystem(this.properties.getConfigPathPatterns());
|
||||||
|
|
||||||
PluginDiscovery discovery = new BeanFactoryFilteringPluginDiscovery(resourceLoader.getClassLoader(),
|
PluginDiscovery discovery = new BeanFactoryFilteringPluginDiscovery(
|
||||||
beanFactory, properties.getDisabledPlugins());
|
this.resourceLoader.getClassLoader(), this.beanFactory,
|
||||||
|
this.properties.getDisabledPlugins());
|
||||||
|
|
||||||
PluginContext context = new PluginContext(discovery, createPluginContextAttributes(),
|
PluginContext context = new PluginContext(discovery,
|
||||||
commandFileSystem, confFileSystem, resourceLoader.getClassLoader());
|
createPluginContextAttributes(), commandFileSystem, confFileSystem,
|
||||||
|
this.resourceLoader.getClassLoader());
|
||||||
|
|
||||||
context.refresh();
|
context.refresh();
|
||||||
start(context);
|
start(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected FS createFileSystem(String[] pathPatterns) throws IOException,
|
||||||
protected FS createFileSystem(String[] pathPatterns) throws IOException, URISyntaxException {
|
URISyntaxException {
|
||||||
Assert.notNull(pathPatterns);
|
Assert.notNull(pathPatterns);
|
||||||
FS cmdFS = new FS();
|
FS cmdFS = new FS();
|
||||||
for (String pathPattern : pathPatterns) {
|
for (String pathPattern : pathPatterns) {
|
||||||
cmdFS.mount(new SimpleFileSystemDriver(new DirectoryHandle(pathPattern, resourceLoader)));
|
cmdFS.mount(new SimpleFileSystemDriver(new DirectoryHandle(pathPattern,
|
||||||
|
this.resourceLoader)));
|
||||||
}
|
}
|
||||||
return cmdFS;
|
return cmdFS;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Map<String, Object> createPluginContextAttributes() {
|
protected Map<String, Object> createPluginContextAttributes() {
|
||||||
Map<String, Object> attributes = new HashMap<String, Object>();
|
Map<String, Object> attributes = new HashMap<String, Object>();
|
||||||
String bootVersion = CrshAutoConfiguration.class.getPackage().getImplementationVersion();
|
String bootVersion = CrshAutoConfiguration.class.getPackage()
|
||||||
|
.getImplementationVersion();
|
||||||
if (bootVersion != null) {
|
if (bootVersion != null) {
|
||||||
attributes.put("spring.boot.version", bootVersion);
|
attributes.put("spring.boot.version", bootVersion);
|
||||||
}
|
}
|
||||||
attributes.put("spring.version", SpringVersion.getVersion());
|
attributes.put("spring.version", SpringVersion.getVersion());
|
||||||
if (beanFactory != null) {
|
if (this.beanFactory != null) {
|
||||||
attributes.put("spring.beanfactory", beanFactory);
|
attributes.put("spring.beanfactory", this.beanFactory);
|
||||||
}
|
}
|
||||||
return attributes;
|
return attributes;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@SuppressWarnings("rawtypes")
|
@SuppressWarnings("rawtypes")
|
||||||
private static class AuthenticationManagerAdapter extends CRaSHPlugin<AuthenticationPlugin> implements
|
private static class AuthenticationManagerAdapter extends
|
||||||
AuthenticationPlugin<String> {
|
CRaSHPlugin<AuthenticationPlugin> implements AuthenticationPlugin<String> {
|
||||||
|
|
||||||
private static final PropertyDescriptor<String> ROLES = PropertyDescriptor.create(
|
private static final PropertyDescriptor<String> ROLES = PropertyDescriptor
|
||||||
"auth.spring.roles", "ADMIN", "Comma separated list of roles required to access the shell");
|
.create("auth.spring.roles", "ADMIN",
|
||||||
|
"Comma separated list of roles required to access the shell");
|
||||||
|
|
||||||
@Autowired(required=false)
|
@Autowired(required = false)
|
||||||
private AccessDecisionManager accessDecisionManager;
|
private AccessDecisionManager accessDecisionManager;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private AuthenticationManager authenticationManager;
|
private AuthenticationManager authenticationManager;
|
||||||
|
|
||||||
private String[] roles = new String[] { "ROLE_ADMIN" };
|
private String[] roles = new String[] { "ROLE_ADMIN" };
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean authenticate(String username, String password) throws Exception {
|
public boolean authenticate(String username, String password) throws Exception {
|
||||||
// Authenticate first to make credentials are valid
|
// Authenticate first to make credentials are valid
|
||||||
Authentication token = new UsernamePasswordAuthenticationToken(username, password);
|
Authentication token = new UsernamePasswordAuthenticationToken(username,
|
||||||
|
password);
|
||||||
try {
|
try {
|
||||||
token = authenticationManager.authenticate(token);
|
token = this.authenticationManager.authenticate(token);
|
||||||
}
|
}
|
||||||
catch (AuthenticationException ae) {
|
catch (AuthenticationException ae) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test access rights if a Spring Security AccessDecisionManager is installed
|
// Test access rights if a Spring Security AccessDecisionManager is installed
|
||||||
if (accessDecisionManager != null && token.isAuthenticated() && roles != null) {
|
if (this.accessDecisionManager != null && token.isAuthenticated()
|
||||||
|
&& this.roles != null) {
|
||||||
try {
|
try {
|
||||||
accessDecisionManager.decide(token, this, SecurityConfig.createList(roles));
|
this.accessDecisionManager.decide(token, this,
|
||||||
|
SecurityConfig.createList(this.roles));
|
||||||
}
|
}
|
||||||
catch (AccessDeniedException e) {
|
catch (AccessDeniedException e) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -256,7 +261,7 @@ public class CrshAutoConfiguration {
|
||||||
public AuthenticationPlugin<String> getImplementation() {
|
public AuthenticationPlugin<String> getImplementation() {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return "spring";
|
return "spring";
|
||||||
|
@ -266,35 +271,33 @@ public class CrshAutoConfiguration {
|
||||||
public void init() {
|
public void init() {
|
||||||
String rolesPropertyValue = getContext().getProperty(ROLES);
|
String rolesPropertyValue = getContext().getProperty(ROLES);
|
||||||
if (rolesPropertyValue != null) {
|
if (rolesPropertyValue != null) {
|
||||||
this.roles = StringUtils.commaDelimitedListToStringArray(rolesPropertyValue);
|
this.roles = StringUtils
|
||||||
|
.commaDelimitedListToStringArray(rolesPropertyValue);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Iterable<PropertyDescriptor<?>> createConfigurationCapabilities() {
|
protected Iterable<PropertyDescriptor<?>> createConfigurationCapabilities() {
|
||||||
return Arrays.<PropertyDescriptor<?>>asList(ROLES);
|
return Arrays.<PropertyDescriptor<?>> asList(ROLES);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static class BeanFactoryFilteringPluginDiscovery extends
|
||||||
private static class BeanFactoryFilteringPluginDiscovery extends ServiceLoaderDiscovery {
|
ServiceLoaderDiscovery {
|
||||||
|
|
||||||
private ListableBeanFactory beanFactory;
|
private ListableBeanFactory beanFactory;
|
||||||
|
|
||||||
private String[] disabledPlugins;
|
private String[] disabledPlugins;
|
||||||
|
|
||||||
|
public BeanFactoryFilteringPluginDiscovery(ClassLoader classLoader,
|
||||||
public BeanFactoryFilteringPluginDiscovery(ClassLoader classLoader, ListableBeanFactory beanFactory,
|
ListableBeanFactory beanFactory, String[] disabledPlugins)
|
||||||
String[] disabledPlugins)
|
|
||||||
throws NullPointerException {
|
throws NullPointerException {
|
||||||
super(classLoader);
|
super(classLoader);
|
||||||
this.beanFactory = beanFactory;
|
this.beanFactory = beanFactory;
|
||||||
this.disabledPlugins = disabledPlugins;
|
this.disabledPlugins = disabledPlugins;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@SuppressWarnings("rawtypes")
|
@SuppressWarnings("rawtypes")
|
||||||
public Iterable<CRaSHPlugin<?>> getPlugins() {
|
public Iterable<CRaSHPlugin<?>> getPlugins() {
|
||||||
|
@ -306,29 +309,31 @@ public class CrshAutoConfiguration {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Collection<CRaSHPlugin> springPlugins = beanFactory.getBeansOfType(CRaSHPlugin.class).values();
|
Collection<CRaSHPlugin> springPlugins = this.beanFactory.getBeansOfType(
|
||||||
|
CRaSHPlugin.class).values();
|
||||||
for (CRaSHPlugin<?> p : springPlugins) {
|
for (CRaSHPlugin<?> p : springPlugins) {
|
||||||
if (!shouldFilter(p)) {
|
if (!shouldFilter(p)) {
|
||||||
plugins.add(p);
|
plugins.add(p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return plugins;
|
return plugins;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@SuppressWarnings("rawtypes")
|
@SuppressWarnings("rawtypes")
|
||||||
protected boolean shouldFilter(CRaSHPlugin<?> plugin) {
|
protected boolean shouldFilter(CRaSHPlugin<?> plugin) {
|
||||||
Assert.notNull(plugin);
|
Assert.notNull(plugin);
|
||||||
|
|
||||||
Set<Class> classes = ClassUtils.getAllInterfacesAsSet(plugin);
|
Set<Class> classes = ClassUtils.getAllInterfacesAsSet(plugin);
|
||||||
classes.add(plugin.getClass());
|
classes.add(plugin.getClass());
|
||||||
|
|
||||||
for (Class<?> clazz : classes) {
|
for (Class<?> clazz : classes) {
|
||||||
if (disabledPlugins != null && disabledPlugins.length > 0) {
|
if (this.disabledPlugins != null && this.disabledPlugins.length > 0) {
|
||||||
for (String disabledPlugin : disabledPlugins) {
|
for (String disabledPlugin : this.disabledPlugins) {
|
||||||
if (ClassUtils.getShortName(clazz).equalsIgnoreCase(disabledPlugin)
|
if (ClassUtils.getShortName(clazz).equalsIgnoreCase(
|
||||||
|| ClassUtils.getQualifiedName(clazz).equalsIgnoreCase(disabledPlugin)) {
|
disabledPlugin)
|
||||||
|
|| ClassUtils.getQualifiedName(clazz).equalsIgnoreCase(
|
||||||
|
disabledPlugin)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -336,22 +341,20 @@ public class CrshAutoConfiguration {
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static class SimpleFileSystemDriver extends AbstractFSDriver<ResourceHandle> {
|
private static class SimpleFileSystemDriver extends AbstractFSDriver<ResourceHandle> {
|
||||||
|
|
||||||
private ResourceHandle root;
|
private ResourceHandle root;
|
||||||
|
|
||||||
|
|
||||||
public SimpleFileSystemDriver(ResourceHandle handle) {
|
public SimpleFileSystemDriver(ResourceHandle handle) {
|
||||||
this.root = handle;
|
this.root = handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Iterable<ResourceHandle> children(ResourceHandle handle) throws IOException {
|
public Iterable<ResourceHandle> children(ResourceHandle handle)
|
||||||
|
throws IOException {
|
||||||
if (handle instanceof DirectoryHandle) {
|
if (handle instanceof DirectoryHandle) {
|
||||||
return ((DirectoryHandle) handle).members();
|
return ((DirectoryHandle) handle).members();
|
||||||
}
|
}
|
||||||
|
@ -379,32 +382,30 @@ public class CrshAutoConfiguration {
|
||||||
@Override
|
@Override
|
||||||
public Iterator<InputStream> open(ResourceHandle handle) throws IOException {
|
public Iterator<InputStream> open(ResourceHandle handle) throws IOException {
|
||||||
if (handle instanceof FileHandle) {
|
if (handle instanceof FileHandle) {
|
||||||
return Collections.singletonList(((FileHandle) handle).openStream()).iterator();
|
return Collections.singletonList(((FileHandle) handle).openStream())
|
||||||
|
.iterator();
|
||||||
}
|
}
|
||||||
return Collections.<InputStream>emptyList().iterator();
|
return Collections.<InputStream> emptyList().iterator();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ResourceHandle root() throws IOException {
|
public ResourceHandle root() throws IOException {
|
||||||
return root;
|
return this.root;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static class DirectoryHandle extends ResourceHandle {
|
private static class DirectoryHandle extends ResourceHandle {
|
||||||
|
|
||||||
private ResourcePatternResolver resourceLoader;
|
private ResourcePatternResolver resourceLoader;
|
||||||
|
|
||||||
|
|
||||||
public DirectoryHandle(String name, ResourcePatternResolver resourceLoader) {
|
public DirectoryHandle(String name, ResourcePatternResolver resourceLoader) {
|
||||||
super(name);
|
super(name);
|
||||||
this.resourceLoader = resourceLoader;
|
this.resourceLoader = resourceLoader;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public List<ResourceHandle> members() throws IOException {
|
public List<ResourceHandle> members() throws IOException {
|
||||||
Resource[] resources = resourceLoader.getResources(getName());
|
Resource[] resources = this.resourceLoader.getResources(getName());
|
||||||
List<ResourceHandle> files = new ArrayList<ResourceHandle>();
|
List<ResourceHandle> files = new ArrayList<ResourceHandle>();
|
||||||
for (Resource resource : resources) {
|
for (Resource resource : resources) {
|
||||||
if (!resource.getURL().getPath().endsWith("/")) {
|
if (!resource.getURL().getPath().endsWith("/")) {
|
||||||
|
@ -415,48 +416,43 @@ public class CrshAutoConfiguration {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static class FileHandle extends ResourceHandle {
|
private static class FileHandle extends ResourceHandle {
|
||||||
|
|
||||||
private Resource resource;
|
private Resource resource;
|
||||||
|
|
||||||
|
|
||||||
public FileHandle(String name, Resource resource) {
|
public FileHandle(String name, Resource resource) {
|
||||||
super(name);
|
super(name);
|
||||||
this.resource = resource;
|
this.resource = resource;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public InputStream openStream() throws IOException {
|
public InputStream openStream() throws IOException {
|
||||||
return this.resource.getInputStream();
|
return this.resource.getInputStream();
|
||||||
}
|
}
|
||||||
|
|
||||||
public long getLastModified() {
|
public long getLastModified() {
|
||||||
try {
|
try {
|
||||||
return this.resource.lastModified();
|
return this.resource.lastModified();
|
||||||
}
|
}
|
||||||
catch (IOException e) {}
|
catch (IOException e) {
|
||||||
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private abstract static class ResourceHandle {
|
private abstract static class ResourceHandle {
|
||||||
|
|
||||||
private String name;
|
private String name;
|
||||||
|
|
||||||
|
|
||||||
public ResourceHandle(String name) {
|
public ResourceHandle(String name) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return name;
|
return this.name;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,7 +36,7 @@ import org.springframework.util.StringUtils;
|
||||||
*/
|
*/
|
||||||
@ConfigurationProperties(name = "shell", ignoreUnknownFields = true)
|
@ConfigurationProperties(name = "shell", ignoreUnknownFields = true)
|
||||||
public class CrshProperties {
|
public class CrshProperties {
|
||||||
|
|
||||||
protected static final String CRASH_AUTH = "crash.auth";
|
protected static final String CRASH_AUTH = "crash.auth";
|
||||||
protected static final String CRASH_AUTH_JAAS_DOMAIN = "crash.auth.jaas.domain";
|
protected static final String CRASH_AUTH_JAAS_DOMAIN = "crash.auth.jaas.domain";
|
||||||
protected static final String CRASH_AUTH_KEY_PATH = "crash.auth.key.path";
|
protected static final String CRASH_AUTH_KEY_PATH = "crash.auth.key.path";
|
||||||
|
@ -49,13 +49,13 @@ public class CrshProperties {
|
||||||
protected static final String CRASH_VFS_REFRESH_PERIOD = "crash.vfs.refresh_period";
|
protected static final String CRASH_VFS_REFRESH_PERIOD = "crash.vfs.refresh_period";
|
||||||
|
|
||||||
private String auth = "simple";
|
private String auth = "simple";
|
||||||
|
|
||||||
@Autowired(required = false)
|
@Autowired(required = false)
|
||||||
private AuthenticationProperties authenticationProperties;
|
private AuthenticationProperties authenticationProperties;
|
||||||
|
|
||||||
private int commandRefreshInterval = -1;
|
private int commandRefreshInterval = -1;
|
||||||
|
|
||||||
private String[] commandPathPatterns = new String[] { "classpath*:/commands/**",
|
private String[] commandPathPatterns = new String[] { "classpath*:/commands/**",
|
||||||
"classpath*:/crash/commands/**" };
|
"classpath*:/crash/commands/**" };
|
||||||
|
|
||||||
private String[] configPathPatterns = new String[] { "classpath*:/crash/*" };
|
private String[] configPathPatterns = new String[] { "classpath*:/crash/*" };
|
||||||
|
@ -66,7 +66,6 @@ public class CrshProperties {
|
||||||
|
|
||||||
private Telnet telnet = new Telnet();
|
private Telnet telnet = new Telnet();
|
||||||
|
|
||||||
|
|
||||||
public String getAuth() {
|
public String getAuth() {
|
||||||
return this.auth;
|
return this.auth;
|
||||||
}
|
}
|
||||||
|
@ -74,11 +73,11 @@ public class CrshProperties {
|
||||||
public AuthenticationProperties getAuthenticationProperties() {
|
public AuthenticationProperties getAuthenticationProperties() {
|
||||||
return this.authenticationProperties;
|
return this.authenticationProperties;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getCommandRefreshInterval() {
|
public int getCommandRefreshInterval() {
|
||||||
return this.commandRefreshInterval;
|
return this.commandRefreshInterval;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String[] getCommandPathPatterns() {
|
public String[] getCommandPathPatterns() {
|
||||||
return this.commandPathPatterns;
|
return this.commandPathPatterns;
|
||||||
}
|
}
|
||||||
|
@ -100,28 +99,29 @@ public class CrshProperties {
|
||||||
}
|
}
|
||||||
|
|
||||||
public Properties mergeProperties(Properties properties) {
|
public Properties mergeProperties(Properties properties) {
|
||||||
properties = ssh.mergeProperties(properties);
|
properties = this.ssh.mergeProperties(properties);
|
||||||
properties = telnet.mergeProperties(properties);
|
properties = this.telnet.mergeProperties(properties);
|
||||||
|
|
||||||
properties.put(CRASH_AUTH, auth);
|
properties.put(CRASH_AUTH, this.auth);
|
||||||
if (authenticationProperties != null) {
|
if (this.authenticationProperties != null) {
|
||||||
properties = authenticationProperties.mergeProperties(properties);
|
properties = this.authenticationProperties.mergeProperties(properties);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.commandRefreshInterval > 0) {
|
if (this.commandRefreshInterval > 0) {
|
||||||
properties.put(CRASH_VFS_REFRESH_PERIOD, String.valueOf(this.commandRefreshInterval));
|
properties.put(CRASH_VFS_REFRESH_PERIOD,
|
||||||
|
String.valueOf(this.commandRefreshInterval));
|
||||||
}
|
}
|
||||||
|
|
||||||
// special handling for disabling Ssh and Telnet support
|
// special handling for disabling Ssh and Telnet support
|
||||||
List<String> dp = new ArrayList<String>(Arrays.asList(this.disabledPlugins));
|
List<String> dp = new ArrayList<String>(Arrays.asList(this.disabledPlugins));
|
||||||
if (!ssh.isEnabled()) {
|
if (!this.ssh.isEnabled()) {
|
||||||
dp.add("org.crsh.ssh.SSHPlugin");
|
dp.add("org.crsh.ssh.SSHPlugin");
|
||||||
}
|
}
|
||||||
if (!telnet.isEnabled()) {
|
if (!this.telnet.isEnabled()) {
|
||||||
dp.add("org.crsh.telnet.TelnetPlugin");
|
dp.add("org.crsh.telnet.TelnetPlugin");
|
||||||
}
|
}
|
||||||
this.disabledPlugins = dp.toArray(new String[dp.size()]);
|
this.disabledPlugins = dp.toArray(new String[dp.size()]);
|
||||||
|
|
||||||
return properties;
|
return properties;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -130,11 +130,12 @@ public class CrshProperties {
|
||||||
this.auth = auth;
|
this.auth = auth;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setAuthenticationProperties(AuthenticationProperties authenticationProperties) {
|
public void setAuthenticationProperties(
|
||||||
|
AuthenticationProperties authenticationProperties) {
|
||||||
Assert.notNull(authenticationProperties);
|
Assert.notNull(authenticationProperties);
|
||||||
this.authenticationProperties = authenticationProperties;
|
this.authenticationProperties = authenticationProperties;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setCommandRefreshInterval(int commandRefreshInterval) {
|
public void setCommandRefreshInterval(int commandRefreshInterval) {
|
||||||
this.commandRefreshInterval = commandRefreshInterval;
|
this.commandRefreshInterval = commandRefreshInterval;
|
||||||
}
|
}
|
||||||
|
@ -163,18 +164,15 @@ public class CrshProperties {
|
||||||
Assert.notNull(telnet);
|
Assert.notNull(telnet);
|
||||||
this.telnet = telnet;
|
this.telnet = telnet;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public interface AuthenticationProperties extends PropertiesProvider {
|
public interface AuthenticationProperties extends PropertiesProvider {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ConfigurationProperties(name = "shell.auth.jaas", ignoreUnknownFields = false)
|
@ConfigurationProperties(name = "shell.auth.jaas", ignoreUnknownFields = false)
|
||||||
public static class JaasAuthenticationProperties implements AuthenticationProperties {
|
public static class JaasAuthenticationProperties implements AuthenticationProperties {
|
||||||
|
|
||||||
private String domain = "my-domain";
|
private String domain = "my-domain";
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Properties mergeProperties(Properties properties) {
|
public Properties mergeProperties(Properties properties) {
|
||||||
properties.put(CRASH_AUTH_JAAS_DOMAIN, this.domain);
|
properties.put(CRASH_AUTH_JAAS_DOMAIN, this.domain);
|
||||||
|
@ -187,14 +185,12 @@ public class CrshProperties {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ConfigurationProperties(name = "shell.auth.key", ignoreUnknownFields = false)
|
@ConfigurationProperties(name = "shell.auth.key", ignoreUnknownFields = false)
|
||||||
public static class KeyAuthenticationProperties implements AuthenticationProperties {
|
public static class KeyAuthenticationProperties implements AuthenticationProperties {
|
||||||
|
|
||||||
private String path;
|
private String path;
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Properties mergeProperties(Properties properties) {
|
public Properties mergeProperties(Properties properties) {
|
||||||
if (this.path != null) {
|
if (this.path != null) {
|
||||||
|
@ -210,41 +206,40 @@ public class CrshProperties {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public interface PropertiesProvider {
|
public interface PropertiesProvider {
|
||||||
Properties mergeProperties(Properties properties);
|
Properties mergeProperties(Properties properties);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ConfigurationProperties(name = "shell.auth.simple", ignoreUnknownFields = false)
|
@ConfigurationProperties(name = "shell.auth.simple", ignoreUnknownFields = false)
|
||||||
public static class SimpleAuthenticationProperties implements AuthenticationProperties {
|
public static class SimpleAuthenticationProperties implements
|
||||||
|
AuthenticationProperties {
|
||||||
|
|
||||||
private static Log logger = LogFactory.getLog(SimpleAuthenticationProperties.class);
|
private static Log logger = LogFactory
|
||||||
|
.getLog(SimpleAuthenticationProperties.class);
|
||||||
|
|
||||||
private String username = "user";
|
private String username = "user";
|
||||||
|
|
||||||
private String password = UUID.randomUUID().toString();
|
private String password = UUID.randomUUID().toString();
|
||||||
|
|
||||||
private boolean defaultPassword = true;
|
|
||||||
|
|
||||||
|
private boolean defaultPassword = true;
|
||||||
|
|
||||||
public boolean isDefaultPassword() {
|
public boolean isDefaultPassword() {
|
||||||
return this.defaultPassword;
|
return this.defaultPassword;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Properties mergeProperties(Properties properties) {
|
public Properties mergeProperties(Properties properties) {
|
||||||
properties.put(CRASH_AUTH_SIMPLE_USERNAME, this.username);
|
properties.put(CRASH_AUTH_SIMPLE_USERNAME, this.username);
|
||||||
properties.put(CRASH_AUTH_SIMPLE_PASSWORD, this.password);
|
properties.put(CRASH_AUTH_SIMPLE_PASSWORD, this.password);
|
||||||
if (this.defaultPassword) {
|
if (this.defaultPassword) {
|
||||||
logger.info("Using default password for shell access: " + this.password);
|
logger.info("Using default password for shell access: " + this.password);
|
||||||
}
|
}
|
||||||
return properties;
|
return properties;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setPassword(String password) {
|
public void setPassword(String password) {
|
||||||
if (password.startsWith("${") && password.endsWith("}") || !StringUtils.hasLength(password)) {
|
if (password.startsWith("${") && password.endsWith("}")
|
||||||
|
|| !StringUtils.hasLength(password)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.password = password;
|
this.password = password;
|
||||||
|
@ -255,20 +250,20 @@ public class CrshProperties {
|
||||||
Assert.hasLength(username);
|
Assert.hasLength(username);
|
||||||
this.username = username;
|
this.username = username;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ConfigurationProperties(name = "shell.auth.spring", ignoreUnknownFields = false)
|
@ConfigurationProperties(name = "shell.auth.spring", ignoreUnknownFields = false)
|
||||||
public static class SpringAuthenticationProperties implements AuthenticationProperties {
|
public static class SpringAuthenticationProperties implements
|
||||||
|
AuthenticationProperties {
|
||||||
|
|
||||||
private String[] roles = new String[] { "ROLE_ADMIN" };
|
private String[] roles = new String[] { "ROLE_ADMIN" };
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Properties mergeProperties(Properties properties) {
|
public Properties mergeProperties(Properties properties) {
|
||||||
if (this.roles != null) {
|
if (this.roles != null) {
|
||||||
properties.put(CRASH_AUTH_SPRING_ROLES, StringUtils.arrayToCommaDelimitedString(this.roles));
|
properties.put(CRASH_AUTH_SPRING_ROLES,
|
||||||
|
StringUtils.arrayToCommaDelimitedString(this.roles));
|
||||||
}
|
}
|
||||||
return properties;
|
return properties;
|
||||||
}
|
}
|
||||||
|
@ -280,7 +275,6 @@ public class CrshProperties {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static class Ssh implements PropertiesProvider {
|
public static class Ssh implements PropertiesProvider {
|
||||||
|
|
||||||
private boolean enabled = true;
|
private boolean enabled = true;
|
||||||
|
@ -289,11 +283,10 @@ public class CrshProperties {
|
||||||
|
|
||||||
private String port = "2000";
|
private String port = "2000";
|
||||||
|
|
||||||
|
|
||||||
public boolean isEnabled() {
|
public boolean isEnabled() {
|
||||||
return this.enabled;
|
return this.enabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Properties mergeProperties(Properties properties) {
|
public Properties mergeProperties(Properties properties) {
|
||||||
if (this.enabled) {
|
if (this.enabled) {
|
||||||
|
@ -321,18 +314,16 @@ public class CrshProperties {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static class Telnet implements PropertiesProvider {
|
public static class Telnet implements PropertiesProvider {
|
||||||
|
|
||||||
private boolean enabled = false;
|
private boolean enabled = false;
|
||||||
|
|
||||||
private String port = "5000";
|
private String port = "5000";
|
||||||
|
|
||||||
|
|
||||||
public boolean isEnabled() {
|
public boolean isEnabled() {
|
||||||
return this.enabled;
|
return this.enabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Properties mergeProperties(Properties properties) {
|
public Properties mergeProperties(Properties properties) {
|
||||||
if (this.enabled) {
|
if (this.enabled) {
|
||||||
|
|
|
@ -16,13 +16,6 @@
|
||||||
|
|
||||||
package org.springframework.boot.actuate.autoconfigure;
|
package org.springframework.boot.actuate.autoconfigure;
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
|
||||||
import static org.junit.Assert.assertFalse;
|
|
||||||
import static org.junit.Assert.assertNotNull;
|
|
||||||
import static org.junit.Assert.assertNull;
|
|
||||||
import static org.junit.Assert.assertTrue;
|
|
||||||
import static org.junit.Assert.fail;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
@ -56,6 +49,13 @@ import org.springframework.security.core.AuthenticationException;
|
||||||
import org.springframework.security.core.authority.SimpleGrantedAuthority;
|
import org.springframework.security.core.authority.SimpleGrantedAuthority;
|
||||||
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
|
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertFalse;
|
||||||
|
import static org.junit.Assert.assertNotNull;
|
||||||
|
import static org.junit.Assert.assertNull;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
import static org.junit.Assert.fail;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests for {@link CrshAutoConfiguration}.
|
* Tests for {@link CrshAutoConfiguration}.
|
||||||
*
|
*
|
||||||
|
@ -65,7 +65,7 @@ import org.springframework.web.context.support.AnnotationConfigWebApplicationCon
|
||||||
public class CrshAutoConfigurationTests {
|
public class CrshAutoConfigurationTests {
|
||||||
|
|
||||||
private AnnotationConfigWebApplicationContext context;
|
private AnnotationConfigWebApplicationContext context;
|
||||||
|
|
||||||
@After
|
@After
|
||||||
public void tearDown() {
|
public void tearDown() {
|
||||||
if (this.context != null) {
|
if (this.context != null) {
|
||||||
|
@ -77,7 +77,8 @@ public class CrshAutoConfigurationTests {
|
||||||
@Test
|
@Test
|
||||||
public void testDisabledPlugins() throws Exception {
|
public void testDisabledPlugins() throws Exception {
|
||||||
MockEnvironment env = new MockEnvironment();
|
MockEnvironment env = new MockEnvironment();
|
||||||
env.setProperty("shell.disabled_plugins", "GroovyREPL, termIOHandler, org.crsh.auth.AuthenticationPlugin");
|
env.setProperty("shell.disabled_plugins",
|
||||||
|
"GroovyREPL, termIOHandler, org.crsh.auth.AuthenticationPlugin");
|
||||||
this.context = new AnnotationConfigWebApplicationContext();
|
this.context = new AnnotationConfigWebApplicationContext();
|
||||||
this.context.setEnvironment(env);
|
this.context.setEnvironment(env);
|
||||||
this.context.register(CrshAutoConfiguration.class);
|
this.context.register(CrshAutoConfiguration.class);
|
||||||
|
@ -96,15 +97,15 @@ public class CrshAutoConfigurationTests {
|
||||||
this.context = new AnnotationConfigWebApplicationContext();
|
this.context = new AnnotationConfigWebApplicationContext();
|
||||||
this.context.register(CrshAutoConfiguration.class);
|
this.context.register(CrshAutoConfiguration.class);
|
||||||
this.context.refresh();
|
this.context.refresh();
|
||||||
|
|
||||||
PluginLifeCycle lifeCycle = this.context.getBean(PluginLifeCycle.class);
|
PluginLifeCycle lifeCycle = this.context.getBean(PluginLifeCycle.class);
|
||||||
|
|
||||||
Map<String, Object> attributes = lifeCycle.getContext().getAttributes();
|
Map<String, Object> attributes = lifeCycle.getContext().getAttributes();
|
||||||
assertTrue(attributes.containsKey("spring.version"));
|
assertTrue(attributes.containsKey("spring.version"));
|
||||||
assertTrue(attributes.containsKey("spring.beanfactory"));
|
assertTrue(attributes.containsKey("spring.beanfactory"));
|
||||||
assertEquals(this.context.getBeanFactory(), attributes.get("spring.beanfactory"));
|
assertEquals(this.context.getBeanFactory(), attributes.get("spring.beanfactory"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSshConfiguration() {
|
public void testSshConfiguration() {
|
||||||
MockEnvironment env = new MockEnvironment();
|
MockEnvironment env = new MockEnvironment();
|
||||||
|
@ -129,10 +130,11 @@ public class CrshAutoConfigurationTests {
|
||||||
this.context.setEnvironment(env);
|
this.context.setEnvironment(env);
|
||||||
this.context.register(CrshAutoConfiguration.class);
|
this.context.register(CrshAutoConfiguration.class);
|
||||||
this.context.refresh();
|
this.context.refresh();
|
||||||
|
|
||||||
PluginLifeCycle lifeCycle = this.context.getBean(PluginLifeCycle.class);
|
PluginLifeCycle lifeCycle = this.context.getBean(PluginLifeCycle.class);
|
||||||
|
|
||||||
assertEquals(lifeCycle.getConfig().getProperty("crash.ssh.keypath"), "~/.ssh/id.pem");
|
assertEquals(lifeCycle.getConfig().getProperty("crash.ssh.keypath"),
|
||||||
|
"~/.ssh/id.pem");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -144,7 +146,8 @@ public class CrshAutoConfigurationTests {
|
||||||
PluginLifeCycle lifeCycle = this.context.getBean(PluginLifeCycle.class);
|
PluginLifeCycle lifeCycle = this.context.getBean(PluginLifeCycle.class);
|
||||||
|
|
||||||
int count = 0;
|
int count = 0;
|
||||||
Iterator<Resource> resources = lifeCycle.getContext().loadResources("login", ResourceKind.LIFECYCLE).iterator();
|
Iterator<Resource> resources = lifeCycle.getContext()
|
||||||
|
.loadResources("login", ResourceKind.LIFECYCLE).iterator();
|
||||||
while (resources.hasNext()) {
|
while (resources.hasNext()) {
|
||||||
count++;
|
count++;
|
||||||
resources.next();
|
resources.next();
|
||||||
|
@ -152,7 +155,8 @@ public class CrshAutoConfigurationTests {
|
||||||
assertEquals(1, count);
|
assertEquals(1, count);
|
||||||
|
|
||||||
count = 0;
|
count = 0;
|
||||||
resources = lifeCycle.getContext().loadResources("help.java", ResourceKind.COMMAND).iterator();
|
resources = lifeCycle.getContext()
|
||||||
|
.loadResources("help.java", ResourceKind.COMMAND).iterator();
|
||||||
while (resources.hasNext()) {
|
while (resources.hasNext()) {
|
||||||
count++;
|
count++;
|
||||||
resources.next();
|
resources.next();
|
||||||
|
@ -172,14 +176,15 @@ public class CrshAutoConfigurationTests {
|
||||||
PluginContext pluginContext = lifeCycle.getContext();
|
PluginContext pluginContext = lifeCycle.getContext();
|
||||||
|
|
||||||
int count = 0;
|
int count = 0;
|
||||||
Iterator<AuthenticationPlugin> plugins = pluginContext.getPlugins(AuthenticationPlugin.class).iterator();
|
Iterator<AuthenticationPlugin> plugins = pluginContext.getPlugins(
|
||||||
|
AuthenticationPlugin.class).iterator();
|
||||||
while (plugins.hasNext()) {
|
while (plugins.hasNext()) {
|
||||||
count++;
|
count++;
|
||||||
plugins.next();
|
plugins.next();
|
||||||
}
|
}
|
||||||
assertEquals(3, count);
|
assertEquals(3, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testJaasAuthenticationProvider() {
|
public void testJaasAuthenticationProvider() {
|
||||||
MockEnvironment env = new MockEnvironment();
|
MockEnvironment env = new MockEnvironment();
|
||||||
|
@ -191,10 +196,11 @@ public class CrshAutoConfigurationTests {
|
||||||
this.context.register(SecurityConfiguration.class);
|
this.context.register(SecurityConfiguration.class);
|
||||||
this.context.register(CrshAutoConfiguration.class);
|
this.context.register(CrshAutoConfiguration.class);
|
||||||
this.context.refresh();
|
this.context.refresh();
|
||||||
|
|
||||||
PluginLifeCycle lifeCycle = this.context.getBean(PluginLifeCycle.class);
|
PluginLifeCycle lifeCycle = this.context.getBean(PluginLifeCycle.class);
|
||||||
assertEquals(lifeCycle.getConfig().get("crash.auth"), "jaas");
|
assertEquals(lifeCycle.getConfig().get("crash.auth"), "jaas");
|
||||||
assertEquals(lifeCycle.getConfig().get("crash.auth.jaas.domain"), "my-test-domain");
|
assertEquals(lifeCycle.getConfig().get("crash.auth.jaas.domain"),
|
||||||
|
"my-test-domain");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -208,7 +214,7 @@ public class CrshAutoConfigurationTests {
|
||||||
this.context.register(SecurityConfiguration.class);
|
this.context.register(SecurityConfiguration.class);
|
||||||
this.context.register(CrshAutoConfiguration.class);
|
this.context.register(CrshAutoConfiguration.class);
|
||||||
this.context.refresh();
|
this.context.refresh();
|
||||||
|
|
||||||
PluginLifeCycle lifeCycle = this.context.getBean(PluginLifeCycle.class);
|
PluginLifeCycle lifeCycle = this.context.getBean(PluginLifeCycle.class);
|
||||||
assertEquals(lifeCycle.getConfig().get("crash.auth"), "key");
|
assertEquals(lifeCycle.getConfig().get("crash.auth"), "key");
|
||||||
assertEquals(lifeCycle.getConfig().get("crash.auth.key.path"), "~/test.pem");
|
assertEquals(lifeCycle.getConfig().get("crash.auth.key.path"), "~/test.pem");
|
||||||
|
@ -226,14 +232,15 @@ public class CrshAutoConfigurationTests {
|
||||||
this.context.register(SecurityConfiguration.class);
|
this.context.register(SecurityConfiguration.class);
|
||||||
this.context.register(CrshAutoConfiguration.class);
|
this.context.register(CrshAutoConfiguration.class);
|
||||||
this.context.refresh();
|
this.context.refresh();
|
||||||
|
|
||||||
PluginLifeCycle lifeCycle = this.context.getBean(PluginLifeCycle.class);
|
PluginLifeCycle lifeCycle = this.context.getBean(PluginLifeCycle.class);
|
||||||
assertEquals(lifeCycle.getConfig().get("crash.auth"), "simple");
|
assertEquals(lifeCycle.getConfig().get("crash.auth"), "simple");
|
||||||
|
|
||||||
AuthenticationPlugin<String> authenticationPlugin = null;
|
AuthenticationPlugin<String> authenticationPlugin = null;
|
||||||
String authentication = lifeCycle.getConfig().getProperty("crash.auth");
|
String authentication = lifeCycle.getConfig().getProperty("crash.auth");
|
||||||
assertNotNull(authentication);
|
assertNotNull(authentication);
|
||||||
for (AuthenticationPlugin plugin : lifeCycle.getContext().getPlugins(AuthenticationPlugin.class)) {
|
for (AuthenticationPlugin plugin : lifeCycle.getContext().getPlugins(
|
||||||
|
AuthenticationPlugin.class)) {
|
||||||
if (authentication.equals(plugin.getName())) {
|
if (authentication.equals(plugin.getName())) {
|
||||||
authenticationPlugin = plugin;
|
authenticationPlugin = plugin;
|
||||||
break;
|
break;
|
||||||
|
@ -246,7 +253,7 @@ public class CrshAutoConfigurationTests {
|
||||||
catch (Exception e) {
|
catch (Exception e) {
|
||||||
fail();
|
fail();
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
assertFalse(authenticationPlugin.authenticate(UUID.randomUUID().toString(),
|
assertFalse(authenticationPlugin.authenticate(UUID.randomUUID().toString(),
|
||||||
"password"));
|
"password"));
|
||||||
|
@ -272,7 +279,8 @@ public class CrshAutoConfigurationTests {
|
||||||
AuthenticationPlugin<String> authenticationPlugin = null;
|
AuthenticationPlugin<String> authenticationPlugin = null;
|
||||||
String authentication = lifeCycle.getConfig().getProperty("crash.auth");
|
String authentication = lifeCycle.getConfig().getProperty("crash.auth");
|
||||||
assertNotNull(authentication);
|
assertNotNull(authentication);
|
||||||
for (AuthenticationPlugin plugin : lifeCycle.getContext().getPlugins(AuthenticationPlugin.class)) {
|
for (AuthenticationPlugin plugin : lifeCycle.getContext().getPlugins(
|
||||||
|
AuthenticationPlugin.class)) {
|
||||||
if (authentication.equals(plugin.getName())) {
|
if (authentication.equals(plugin.getName())) {
|
||||||
authenticationPlugin = plugin;
|
authenticationPlugin = plugin;
|
||||||
break;
|
break;
|
||||||
|
@ -286,7 +294,7 @@ public class CrshAutoConfigurationTests {
|
||||||
catch (Exception e) {
|
catch (Exception e) {
|
||||||
fail();
|
fail();
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
assertFalse(authenticationPlugin.authenticate(UUID.randomUUID().toString(),
|
assertFalse(authenticationPlugin.authenticate(UUID.randomUUID().toString(),
|
||||||
SecurityConfiguration.PASSWORD));
|
SecurityConfiguration.PASSWORD));
|
||||||
|
@ -308,10 +316,15 @@ public class CrshAutoConfigurationTests {
|
||||||
return new AuthenticationManager() {
|
return new AuthenticationManager() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
|
public Authentication authenticate(Authentication authentication)
|
||||||
if (authentication.getName().equals(USERNAME) && authentication.getCredentials().equals(PASSWORD)) {
|
throws AuthenticationException {
|
||||||
authentication = new UsernamePasswordAuthenticationToken(authentication.getPrincipal(),
|
if (authentication.getName().equals(USERNAME)
|
||||||
authentication.getCredentials(), Collections.singleton(new SimpleGrantedAuthority("ROLE_ADMIN")));
|
&& authentication.getCredentials().equals(PASSWORD)) {
|
||||||
|
authentication = new UsernamePasswordAuthenticationToken(
|
||||||
|
authentication.getPrincipal(),
|
||||||
|
authentication.getCredentials(),
|
||||||
|
Collections.singleton(new SimpleGrantedAuthority(
|
||||||
|
"ROLE_ADMIN")));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
throw new BadCredentialsException("Invalid username and password");
|
throw new BadCredentialsException("Invalid username and password");
|
||||||
|
@ -320,13 +333,13 @@ public class CrshAutoConfigurationTests {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
public AccessDecisionManager accessDecisionManager() {
|
public AccessDecisionManager accessDecisionManager() {
|
||||||
List<AccessDecisionVoter> voters = new ArrayList<AccessDecisionVoter>();
|
List<AccessDecisionVoter> voters = new ArrayList<AccessDecisionVoter>();
|
||||||
voters.add(new RoleVoter());
|
voters.add(new RoleVoter());
|
||||||
AccessDecisionManager result = new UnanimousBased(voters);
|
AccessDecisionManager result = new UnanimousBased(voters);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,12 +16,6 @@
|
||||||
|
|
||||||
package org.springframework.boot.actuate.properties;
|
package org.springframework.boot.actuate.properties;
|
||||||
|
|
||||||
import static org.junit.Assert.assertArrayEquals;
|
|
||||||
import static org.junit.Assert.assertEquals;
|
|
||||||
import static org.junit.Assert.assertFalse;
|
|
||||||
import static org.junit.Assert.assertNull;
|
|
||||||
import static org.junit.Assert.assertTrue;
|
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -37,6 +31,12 @@ import org.springframework.boot.actuate.properties.CrshProperties.SpringAuthenti
|
||||||
import org.springframework.boot.bind.RelaxedDataBinder;
|
import org.springframework.boot.bind.RelaxedDataBinder;
|
||||||
import org.springframework.core.convert.support.DefaultConversionService;
|
import org.springframework.core.convert.support.DefaultConversionService;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertArrayEquals;
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertFalse;
|
||||||
|
import static org.junit.Assert.assertNull;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests for {@link CrshProperties}.
|
* Tests for {@link CrshProperties}.
|
||||||
*
|
*
|
||||||
|
@ -48,7 +48,8 @@ public class CrshPropertiesTests {
|
||||||
public void testBindingAuth() {
|
public void testBindingAuth() {
|
||||||
CrshProperties props = new CrshProperties();
|
CrshProperties props = new CrshProperties();
|
||||||
RelaxedDataBinder binder = new RelaxedDataBinder(props, "shell");
|
RelaxedDataBinder binder = new RelaxedDataBinder(props, "shell");
|
||||||
binder.bind(new MutablePropertyValues(Collections.singletonMap("shell.auth", "spring")));
|
binder.bind(new MutablePropertyValues(Collections.singletonMap("shell.auth",
|
||||||
|
"spring")));
|
||||||
assertFalse(binder.getBindingResult().hasErrors());
|
assertFalse(binder.getBindingResult().hasErrors());
|
||||||
assertEquals("spring", props.getAuth());
|
assertEquals("spring", props.getAuth());
|
||||||
}
|
}
|
||||||
|
@ -67,7 +68,8 @@ public class CrshPropertiesTests {
|
||||||
CrshProperties props = new CrshProperties();
|
CrshProperties props = new CrshProperties();
|
||||||
RelaxedDataBinder binder = new RelaxedDataBinder(props, "shell");
|
RelaxedDataBinder binder = new RelaxedDataBinder(props, "shell");
|
||||||
binder.setConversionService(new DefaultConversionService());
|
binder.setConversionService(new DefaultConversionService());
|
||||||
binder.bind(new MutablePropertyValues(Collections.singletonMap("shell.command_refresh_interval", "1")));
|
binder.bind(new MutablePropertyValues(Collections.singletonMap(
|
||||||
|
"shell.command_refresh_interval", "1")));
|
||||||
assertFalse(binder.getBindingResult().hasErrors());
|
assertFalse(binder.getBindingResult().hasErrors());
|
||||||
assertEquals(1, props.getCommandRefreshInterval());
|
assertEquals(1, props.getCommandRefreshInterval());
|
||||||
}
|
}
|
||||||
|
@ -77,11 +79,12 @@ public class CrshPropertiesTests {
|
||||||
CrshProperties props = new CrshProperties();
|
CrshProperties props = new CrshProperties();
|
||||||
RelaxedDataBinder binder = new RelaxedDataBinder(props, "shell");
|
RelaxedDataBinder binder = new RelaxedDataBinder(props, "shell");
|
||||||
binder.setConversionService(new DefaultConversionService());
|
binder.setConversionService(new DefaultConversionService());
|
||||||
binder.bind(new MutablePropertyValues(Collections.singletonMap("shell.command_path_patterns",
|
binder.bind(new MutablePropertyValues(Collections.singletonMap(
|
||||||
"pattern1, pattern2")));
|
"shell.command_path_patterns", "pattern1, pattern2")));
|
||||||
assertFalse(binder.getBindingResult().hasErrors());
|
assertFalse(binder.getBindingResult().hasErrors());
|
||||||
assertEquals(2, props.getCommandPathPatterns().length);
|
assertEquals(2, props.getCommandPathPatterns().length);
|
||||||
Assert.assertArrayEquals(new String[] { "pattern1", "pattern2" }, props.getCommandPathPatterns());
|
Assert.assertArrayEquals(new String[] { "pattern1", "pattern2" },
|
||||||
|
props.getCommandPathPatterns());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -89,11 +92,12 @@ public class CrshPropertiesTests {
|
||||||
CrshProperties props = new CrshProperties();
|
CrshProperties props = new CrshProperties();
|
||||||
RelaxedDataBinder binder = new RelaxedDataBinder(props, "shell");
|
RelaxedDataBinder binder = new RelaxedDataBinder(props, "shell");
|
||||||
binder.setConversionService(new DefaultConversionService());
|
binder.setConversionService(new DefaultConversionService());
|
||||||
binder.bind(new MutablePropertyValues(Collections.singletonMap("shell.config_path_patterns",
|
binder.bind(new MutablePropertyValues(Collections.singletonMap(
|
||||||
"pattern1, pattern2")));
|
"shell.config_path_patterns", "pattern1, pattern2")));
|
||||||
assertFalse(binder.getBindingResult().hasErrors());
|
assertFalse(binder.getBindingResult().hasErrors());
|
||||||
assertEquals(2, props.getConfigPathPatterns().length);
|
assertEquals(2, props.getConfigPathPatterns().length);
|
||||||
Assert.assertArrayEquals(new String[] { "pattern1", "pattern2" }, props.getConfigPathPatterns());
|
Assert.assertArrayEquals(new String[] { "pattern1", "pattern2" },
|
||||||
|
props.getConfigPathPatterns());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -101,11 +105,12 @@ public class CrshPropertiesTests {
|
||||||
CrshProperties props = new CrshProperties();
|
CrshProperties props = new CrshProperties();
|
||||||
RelaxedDataBinder binder = new RelaxedDataBinder(props, "shell");
|
RelaxedDataBinder binder = new RelaxedDataBinder(props, "shell");
|
||||||
binder.setConversionService(new DefaultConversionService());
|
binder.setConversionService(new DefaultConversionService());
|
||||||
binder.bind(new MutablePropertyValues(Collections.singletonMap("shell.disabled_plugins",
|
binder.bind(new MutablePropertyValues(Collections.singletonMap(
|
||||||
"pattern1, pattern2")));
|
"shell.disabled_plugins", "pattern1, pattern2")));
|
||||||
assertFalse(binder.getBindingResult().hasErrors());
|
assertFalse(binder.getBindingResult().hasErrors());
|
||||||
assertEquals(2, props.getDisabledPlugins().length);
|
assertEquals(2, props.getDisabledPlugins().length);
|
||||||
assertArrayEquals(new String[] { "pattern1", "pattern2" }, props.getDisabledPlugins());
|
assertArrayEquals(new String[] { "pattern1", "pattern2" },
|
||||||
|
props.getDisabledPlugins());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -119,10 +124,10 @@ public class CrshPropertiesTests {
|
||||||
map.put("shell.ssh.key_path", "~/.ssh/test.pem");
|
map.put("shell.ssh.key_path", "~/.ssh/test.pem");
|
||||||
binder.bind(new MutablePropertyValues(map));
|
binder.bind(new MutablePropertyValues(map));
|
||||||
assertFalse(binder.getBindingResult().hasErrors());
|
assertFalse(binder.getBindingResult().hasErrors());
|
||||||
|
|
||||||
Properties p = new Properties();
|
Properties p = new Properties();
|
||||||
p = props.mergeProperties(p);
|
p = props.mergeProperties(p);
|
||||||
|
|
||||||
assertEquals("2222", p.get(CrshProperties.CRASH_SSH_PORT));
|
assertEquals("2222", p.get(CrshProperties.CRASH_SSH_PORT));
|
||||||
assertEquals("~/.ssh/test.pem", p.get(CrshProperties.CRASH_SSH_KEYPATH));
|
assertEquals("~/.ssh/test.pem", p.get(CrshProperties.CRASH_SSH_KEYPATH));
|
||||||
}
|
}
|
||||||
|
@ -138,14 +143,14 @@ public class CrshPropertiesTests {
|
||||||
map.put("shell.ssh.key_path", "~/.ssh/test.pem");
|
map.put("shell.ssh.key_path", "~/.ssh/test.pem");
|
||||||
binder.bind(new MutablePropertyValues(map));
|
binder.bind(new MutablePropertyValues(map));
|
||||||
assertFalse(binder.getBindingResult().hasErrors());
|
assertFalse(binder.getBindingResult().hasErrors());
|
||||||
|
|
||||||
Properties p = new Properties();
|
Properties p = new Properties();
|
||||||
p = props.mergeProperties(p);
|
p = props.mergeProperties(p);
|
||||||
|
|
||||||
assertNull(p.get(CrshProperties.CRASH_SSH_PORT));
|
assertNull(p.get(CrshProperties.CRASH_SSH_PORT));
|
||||||
assertNull(p.get(CrshProperties.CRASH_SSH_KEYPATH));
|
assertNull(p.get(CrshProperties.CRASH_SSH_KEYPATH));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testBindingTelnet() {
|
public void testBindingTelnet() {
|
||||||
CrshProperties props = new CrshProperties();
|
CrshProperties props = new CrshProperties();
|
||||||
|
@ -156,13 +161,13 @@ public class CrshPropertiesTests {
|
||||||
map.put("shell.telnet.port", "2222");
|
map.put("shell.telnet.port", "2222");
|
||||||
binder.bind(new MutablePropertyValues(map));
|
binder.bind(new MutablePropertyValues(map));
|
||||||
assertFalse(binder.getBindingResult().hasErrors());
|
assertFalse(binder.getBindingResult().hasErrors());
|
||||||
|
|
||||||
Properties p = new Properties();
|
Properties p = new Properties();
|
||||||
p = props.mergeProperties(p);
|
p = props.mergeProperties(p);
|
||||||
|
|
||||||
assertEquals("2222", p.get(CrshProperties.CRASH_TELNET_PORT));
|
assertEquals("2222", p.get(CrshProperties.CRASH_TELNET_PORT));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testBindingTelnetIgnored() {
|
public void testBindingTelnetIgnored() {
|
||||||
CrshProperties props = new CrshProperties();
|
CrshProperties props = new CrshProperties();
|
||||||
|
@ -173,13 +178,13 @@ public class CrshPropertiesTests {
|
||||||
map.put("shell.telnet.port", "2222");
|
map.put("shell.telnet.port", "2222");
|
||||||
binder.bind(new MutablePropertyValues(map));
|
binder.bind(new MutablePropertyValues(map));
|
||||||
assertFalse(binder.getBindingResult().hasErrors());
|
assertFalse(binder.getBindingResult().hasErrors());
|
||||||
|
|
||||||
Properties p = new Properties();
|
Properties p = new Properties();
|
||||||
p = props.mergeProperties(p);
|
p = props.mergeProperties(p);
|
||||||
|
|
||||||
assertNull(p.get(CrshProperties.CRASH_TELNET_PORT));
|
assertNull(p.get(CrshProperties.CRASH_TELNET_PORT));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testBindingJaas() {
|
public void testBindingJaas() {
|
||||||
JaasAuthenticationProperties props = new JaasAuthenticationProperties();
|
JaasAuthenticationProperties props = new JaasAuthenticationProperties();
|
||||||
|
@ -189,13 +194,13 @@ public class CrshPropertiesTests {
|
||||||
map.put("shell.auth.jaas.domain", "my-test-domain");
|
map.put("shell.auth.jaas.domain", "my-test-domain");
|
||||||
binder.bind(new MutablePropertyValues(map));
|
binder.bind(new MutablePropertyValues(map));
|
||||||
assertFalse(binder.getBindingResult().hasErrors());
|
assertFalse(binder.getBindingResult().hasErrors());
|
||||||
|
|
||||||
Properties p = new Properties();
|
Properties p = new Properties();
|
||||||
p = props.mergeProperties(p);
|
p = props.mergeProperties(p);
|
||||||
|
|
||||||
assertEquals("my-test-domain", p.get(CrshProperties.CRASH_AUTH_JAAS_DOMAIN));
|
assertEquals("my-test-domain", p.get(CrshProperties.CRASH_AUTH_JAAS_DOMAIN));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testBindingKey() {
|
public void testBindingKey() {
|
||||||
KeyAuthenticationProperties props = new KeyAuthenticationProperties();
|
KeyAuthenticationProperties props = new KeyAuthenticationProperties();
|
||||||
|
@ -205,13 +210,13 @@ public class CrshPropertiesTests {
|
||||||
map.put("shell.auth.key.path", "~/.ssh/test.pem");
|
map.put("shell.auth.key.path", "~/.ssh/test.pem");
|
||||||
binder.bind(new MutablePropertyValues(map));
|
binder.bind(new MutablePropertyValues(map));
|
||||||
assertFalse(binder.getBindingResult().hasErrors());
|
assertFalse(binder.getBindingResult().hasErrors());
|
||||||
|
|
||||||
Properties p = new Properties();
|
Properties p = new Properties();
|
||||||
p = props.mergeProperties(p);
|
p = props.mergeProperties(p);
|
||||||
|
|
||||||
assertEquals("~/.ssh/test.pem", p.get(CrshProperties.CRASH_AUTH_KEY_PATH));
|
assertEquals("~/.ssh/test.pem", p.get(CrshProperties.CRASH_AUTH_KEY_PATH));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testBindingKeyIgnored() {
|
public void testBindingKeyIgnored() {
|
||||||
KeyAuthenticationProperties props = new KeyAuthenticationProperties();
|
KeyAuthenticationProperties props = new KeyAuthenticationProperties();
|
||||||
|
@ -220,10 +225,10 @@ public class CrshPropertiesTests {
|
||||||
Map<String, String> map = new HashMap<String, String>();
|
Map<String, String> map = new HashMap<String, String>();
|
||||||
binder.bind(new MutablePropertyValues(map));
|
binder.bind(new MutablePropertyValues(map));
|
||||||
assertFalse(binder.getBindingResult().hasErrors());
|
assertFalse(binder.getBindingResult().hasErrors());
|
||||||
|
|
||||||
Properties p = new Properties();
|
Properties p = new Properties();
|
||||||
p = props.mergeProperties(p);
|
p = props.mergeProperties(p);
|
||||||
|
|
||||||
assertNull(p.get(CrshProperties.CRASH_AUTH_KEY_PATH));
|
assertNull(p.get(CrshProperties.CRASH_AUTH_KEY_PATH));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -237,14 +242,14 @@ public class CrshPropertiesTests {
|
||||||
map.put("shell.auth.simple.password", "password123");
|
map.put("shell.auth.simple.password", "password123");
|
||||||
binder.bind(new MutablePropertyValues(map));
|
binder.bind(new MutablePropertyValues(map));
|
||||||
assertFalse(binder.getBindingResult().hasErrors());
|
assertFalse(binder.getBindingResult().hasErrors());
|
||||||
|
|
||||||
Properties p = new Properties();
|
Properties p = new Properties();
|
||||||
p = props.mergeProperties(p);
|
p = props.mergeProperties(p);
|
||||||
|
|
||||||
assertEquals("username123", p.get(CrshProperties.CRASH_AUTH_SIMPLE_USERNAME));
|
assertEquals("username123", p.get(CrshProperties.CRASH_AUTH_SIMPLE_USERNAME));
|
||||||
assertEquals("password123", p.get(CrshProperties.CRASH_AUTH_SIMPLE_PASSWORD));
|
assertEquals("password123", p.get(CrshProperties.CRASH_AUTH_SIMPLE_PASSWORD));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testDefaultPasswordAutogeneratedIfUnresolovedPlaceholder() {
|
public void testDefaultPasswordAutogeneratedIfUnresolovedPlaceholder() {
|
||||||
SimpleAuthenticationProperties security = new SimpleAuthenticationProperties();
|
SimpleAuthenticationProperties security = new SimpleAuthenticationProperties();
|
||||||
|
@ -264,19 +269,19 @@ public class CrshPropertiesTests {
|
||||||
assertFalse(binder.getBindingResult().hasErrors());
|
assertFalse(binder.getBindingResult().hasErrors());
|
||||||
assertTrue(security.isDefaultPassword());
|
assertTrue(security.isDefaultPassword());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testBindingSpring() {
|
public void testBindingSpring() {
|
||||||
SpringAuthenticationProperties props = new SpringAuthenticationProperties();
|
SpringAuthenticationProperties props = new SpringAuthenticationProperties();
|
||||||
RelaxedDataBinder binder = new RelaxedDataBinder(props, "shell.auth.spring");
|
RelaxedDataBinder binder = new RelaxedDataBinder(props, "shell.auth.spring");
|
||||||
binder.bind(new MutablePropertyValues(Collections.singletonMap("shell.auth.spring.roles", "role1, role2")));
|
binder.bind(new MutablePropertyValues(Collections.singletonMap(
|
||||||
|
"shell.auth.spring.roles", "role1, role2")));
|
||||||
assertFalse(binder.getBindingResult().hasErrors());
|
assertFalse(binder.getBindingResult().hasErrors());
|
||||||
|
|
||||||
Properties p = new Properties();
|
Properties p = new Properties();
|
||||||
p = props.mergeProperties(p);
|
p = props.mergeProperties(p);
|
||||||
|
|
||||||
assertEquals("role1, role2", p.get(CrshProperties.CRASH_AUTH_SPRING_ROLES));
|
assertEquals("role1, role2", p.get(CrshProperties.CRASH_AUTH_SPRING_ROLES));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,11 +16,6 @@
|
||||||
|
|
||||||
package org.springframework.boot.autoconfigure.jdbc;
|
package org.springframework.boot.autoconfigure.jdbc;
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
|
||||||
import static org.junit.Assert.assertNotNull;
|
|
||||||
import static org.junit.Assert.assertNull;
|
|
||||||
import static org.junit.Assert.assertTrue;
|
|
||||||
|
|
||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
import java.sql.Driver;
|
import java.sql.Driver;
|
||||||
import java.sql.DriverPropertyInfo;
|
import java.sql.DriverPropertyInfo;
|
||||||
|
@ -47,6 +42,10 @@ import org.springframework.jdbc.core.JdbcTemplate;
|
||||||
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations;
|
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations;
|
||||||
import org.springframework.util.ClassUtils;
|
import org.springframework.util.ClassUtils;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertNotNull;
|
||||||
|
import static org.junit.Assert.assertNull;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests for {@link DataSourceAutoConfiguration}.
|
* Tests for {@link DataSourceAutoConfiguration}.
|
||||||
|
|
|
@ -29,7 +29,7 @@ import org.springframework.boot.loader.tools.Repackager;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Repackage task.
|
* Repackage task.
|
||||||
*
|
*
|
||||||
* @author Phillip Webb
|
* @author Phillip Webb
|
||||||
*/
|
*/
|
||||||
public class Repackage extends DefaultTask {
|
public class Repackage extends DefaultTask {
|
||||||
|
|
Loading…
Reference in New Issue