diff --git a/spring-integration-smb/src/main/java/org/springframework/integration/smb/session/SmbConfig.java b/spring-integration-smb/src/main/java/org/springframework/integration/smb/session/SmbConfig.java index 27de4cef6c..22fe581ae4 100644 --- a/spring-integration-smb/src/main/java/org/springframework/integration/smb/session/SmbConfig.java +++ b/spring-integration-smb/src/main/java/org/springframework/integration/smb/session/SmbConfig.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,7 +25,7 @@ import org.springframework.util.Assert; import org.springframework.util.StringUtils; /** - * Data holder class for a SMB share configuration. + * Data holder class for an SMB share configuration. *

* SmbFile URLs syntax: * smb://[[[domain;]username[:password]@]server[:port]/[[share/[dir/]file]]][?[param=value[param2=value2[...]]] @@ -197,22 +197,50 @@ public class SmbConfig { } public final String getUrl(boolean _includePassword) { - String domainUserPass = getDomainUserPass(_includePassword); + return createUri(_includePassword).toASCIIString(); + } + /** + * Return the url string for the share connection without encoding. + * Used in the {@link SmbShare} constructor delegation. + * @return the url string for the share connection without encoding. + * @since 6.3.8 + */ + public final String rawUrl() { + return rawUrl(true); + } + + /** + * Return the url string for the share connection without encoding. + * Used in the {@link SmbShare} constructor delegation. + * @param _includePassword whether password has to be masked in credentials of URL. + * @return the url string for the share connection without encoding. + * @since 6.3.8 + */ + public final String rawUrl(boolean _includePassword) { + String domainUserPass = getDomainUserPass(_includePassword); + String path = cleanPath(); + return "smb://%s@%s%s".formatted(domainUserPass, getHostPort(), path); + } + + private URI createUri(boolean _includePassword) { + String domainUserPass = getDomainUserPass(_includePassword); + String path = cleanPath(); + try { + return new URI("smb", domainUserPass, this.host, this.port, path, null, null); + } + catch (URISyntaxException e) { + throw new IllegalArgumentException(e); + } + } + + private String cleanPath() { String path = StringUtils.cleanPath(this.shareAndDir); if (!path.startsWith("/")) { path = "/" + path; } - - try { - return new URI("smb", domainUserPass, this.host, this.port, path, null, null) - .toASCIIString(); - } - catch (URISyntaxException e) { - throw new IllegalArgumentException(e); - } - + return path; } @Override diff --git a/spring-integration-smb/src/main/java/org/springframework/integration/smb/session/SmbShare.java b/spring-integration-smb/src/main/java/org/springframework/integration/smb/session/SmbShare.java index d287a481e1..f96102937e 100644 --- a/spring-integration-smb/src/main/java/org/springframework/integration/smb/session/SmbShare.java +++ b/spring-integration-smb/src/main/java/org/springframework/integration/smb/session/SmbShare.java @@ -63,7 +63,7 @@ public class SmbShare extends SmbFile { * @throws IOException if an invalid SMB URL was constructed by jCIFS */ public SmbShare(SmbConfig _smbConfig) throws IOException { - super(StringUtils.cleanPath(_smbConfig.validate().getUrl()), + super(StringUtils.cleanPath(_smbConfig.validate().rawUrl()), SingletonContext.getInstance().withCredentials( new NtlmPasswordAuthenticator( _smbConfig.getDomain(), _smbConfig.getUsername(), _smbConfig.getPassword()))); @@ -76,7 +76,7 @@ public class SmbShare extends SmbFile { * @throws IOException if an invalid SMB URL was constructed by jCIFS */ public SmbShare(SmbConfig _smbConfig, CIFSContext _context) throws IOException { - super(StringUtils.cleanPath(_smbConfig.validate().getUrl()), _context); + super(StringUtils.cleanPath(_smbConfig.validate().rawUrl()), _context); } /** @@ -88,7 +88,7 @@ public class SmbShare extends SmbFile { * @throws IOException if an invalid property was set or an invalid SMB URL was constructed by jCIFS */ public SmbShare(SmbConfig _smbConfig, Properties _props) throws IOException { - super(StringUtils.cleanPath(_smbConfig.validate().getUrl()), + super(StringUtils.cleanPath(_smbConfig.validate().rawUrl()), new BaseContext( new PropertyConfiguration(_props)).withCredentials( new NtlmPasswordAuthenticator( diff --git a/spring-integration-smb/src/test/java/org/springframework/integration/smb/SmbMessageHistoryTests-context.xml b/spring-integration-smb/src/test/java/org/springframework/integration/smb/SmbMessageHistoryTests-context.xml index 9c9bf00a91..ecda2bf347 100644 --- a/spring-integration-smb/src/test/java/org/springframework/integration/smb/SmbMessageHistoryTests-context.xml +++ b/spring-integration-smb/src/test/java/org/springframework/integration/smb/SmbMessageHistoryTests-context.xml @@ -1,30 +1,31 @@ - - - - - - + + + + + + + session-factory="smbSessionFactory" + channel="smbInboundChannel" + auto-create-local-directory="true" + local-directory="file:test-temp/local-5" + remote-directory="test-temp/remote-9" + auto-startup="false" + delete-remote-files="false"> diff --git a/spring-integration-smb/src/test/java/org/springframework/integration/smb/SmbMessageHistoryTests.java b/spring-integration-smb/src/test/java/org/springframework/integration/smb/SmbMessageHistoryTests.java index 643fbe3cd7..65549313e3 100644 --- a/spring-integration-smb/src/test/java/org/springframework/integration/smb/SmbMessageHistoryTests.java +++ b/spring-integration-smb/src/test/java/org/springframework/integration/smb/SmbMessageHistoryTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -47,8 +47,10 @@ public class SmbMessageHistoryTests extends AbstractBaseTests { String url = smbSessionFactory.getUrl(); URI uri = new URI(url); - assertThat("sambagu%40est:sambag%25uest").isEqualTo(uri.getRawUserInfo()); - assertThat("sambagu@est:sambag%uest").isEqualTo(uri.getUserInfo()); + assertThat(uri.getRawUserInfo()).isEqualTo("sambagu%40est:sambag%25uest"); + assertThat(uri.getUserInfo()).isEqualTo("sambagu@est:sambag%uest"); + assertThat(uri.getPath()).isEqualTo("/smb share/"); + assertThat(uri.getRawPath()).isEqualTo("/smb%20share/"); } } diff --git a/spring-integration-smb/src/test/java/org/springframework/integration/smb/SmbParserInboundTests-context.xml b/spring-integration-smb/src/test/java/org/springframework/integration/smb/SmbParserInboundTests-context.xml index a3bced155c..88483c27ac 100644 --- a/spring-integration-smb/src/test/java/org/springframework/integration/smb/SmbParserInboundTests-context.xml +++ b/spring-integration-smb/src/test/java/org/springframework/integration/smb/SmbParserInboundTests-context.xml @@ -1,48 +1,49 @@ - - - - + + + + - + session-factory="smbSessionFactory" + channel="smbIn" + filename-pattern="foo" + local-directory="test-temp/local-10" + remote-directory="test-temp/remote-10" + auto-create-local-directory="true" + auto-startup="false" + delete-remote-files="false"> + - + session-factory="smbSessionFactory" + channel="smbIn" + filter="filter" + local-directory="test-temp" + remote-directory="test-temp/remote-11" + auto-create-local-directory="true" + auto-startup="false" + delete-remote-files="false"> + - + - + diff --git a/spring-integration-smb/src/test/java/org/springframework/integration/smb/SmbParserInboundTests.java b/spring-integration-smb/src/test/java/org/springframework/integration/smb/SmbParserInboundTests.java index 783d80fb39..8d6f2dba31 100644 --- a/spring-integration-smb/src/test/java/org/springframework/integration/smb/SmbParserInboundTests.java +++ b/spring-integration-smb/src/test/java/org/springframework/integration/smb/SmbParserInboundTests.java @@ -60,9 +60,4 @@ public class SmbParserInboundTests extends AbstractBaseTests { delete("test-temp/local-10", "test-temp/local-6"); } - public static void main(String[] _args) throws Exception { - new SmbParserInboundTests().cleanUp(); - runTests(SmbParserInboundTests.class, "testLocalFilesAutoCreationTrue", "testLocalFilesAutoCreationFalse"); - } - } diff --git a/spring-integration-smb/src/test/java/org/springframework/integration/smb/SmbTestSupport.java b/spring-integration-smb/src/test/java/org/springframework/integration/smb/SmbTestSupport.java index a641226173..b802097257 100644 --- a/spring-integration-smb/src/test/java/org/springframework/integration/smb/SmbTestSupport.java +++ b/spring-integration-smb/src/test/java/org/springframework/integration/smb/SmbTestSupport.java @@ -68,7 +68,7 @@ public class SmbTestSupport extends RemoteFileTestSupport { public static final String HOST = "127.0.0.1"; - public static final String SHARE_AND_DIR = "smb-share"; + public static final String SHARE_AND_DIR = "smb share"; public static final String USERNAME = "sambaguest"; @@ -110,7 +110,7 @@ public class SmbTestSupport extends RemoteFileTestSupport { } public static String smbServerUrl() { - return smbSessionFactory.getUrl().replaceFirst('/' + SHARE_AND_DIR + '/', ""); + return smbSessionFactory.rawUrl().replaceFirst('/' + SHARE_AND_DIR + '/', ""); } public static SessionFactory sessionFactory() {