From 07873be84d0956a33e356c533009e4f09ee15fbe Mon Sep 17 00:00:00 2001 From: Jeroen van Erp Date: Thu, 28 Jul 2016 11:24:11 +0200 Subject: [PATCH 01/40] Started work on SMBJ adding --- build.gradle | 3 + .../overthere/smb2/Smb2Connection.java | 113 +++++++++++++++ .../overthere/smb2/Smb2ConnectionBuilder.java | 38 +++++ .../xebialabs/overthere/smb2/Smb2File.java | 134 ++++++++++++++++++ 4 files changed, 288 insertions(+) create mode 100644 src/main/java/com/xebialabs/overthere/smb2/Smb2Connection.java create mode 100644 src/main/java/com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java create mode 100644 src/main/java/com/xebialabs/overthere/smb2/Smb2File.java diff --git a/build.gradle b/build.gradle index e6fd046d..d6ded992 100644 --- a/build.gradle +++ b/build.gradle @@ -60,6 +60,9 @@ dependencies { // CIFS compile 'jcifs:jcifs:1.3.17' + // SMB2/3 + compile 'com.hierynomus:smbj:0.0.3' + // Telnet compile 'commons-net:commons-net:3.3' diff --git a/src/main/java/com/xebialabs/overthere/smb2/Smb2Connection.java b/src/main/java/com/xebialabs/overthere/smb2/Smb2Connection.java new file mode 100644 index 00000000..27ce7154 --- /dev/null +++ b/src/main/java/com/xebialabs/overthere/smb2/Smb2Connection.java @@ -0,0 +1,113 @@ +package com.xebialabs.overthere.smb2; + +import com.hierynomus.smbj.DefaultConfig; +import com.hierynomus.smbj.SMBClient; +import com.hierynomus.smbj.auth.AuthenticationContext; +import com.hierynomus.smbj.connection.Connection; +import com.hierynomus.smbj.session.Session; +import com.hierynomus.smbj.share.DiskShare; +import com.hierynomus.smbj.share.Share; +import com.xebialabs.overthere.ConnectionOptions; +import com.xebialabs.overthere.OverthereFile; +import com.xebialabs.overthere.RuntimeIOException; +import com.xebialabs.overthere.spi.AddressPortMapper; +import com.xebialabs.overthere.spi.BaseOverthereConnection; + +import java.io.IOException; +import java.net.InetSocketAddress; + +import static com.xebialabs.overthere.ConnectionOptions.*; +import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.*; +import static java.net.InetSocketAddress.createUnresolved; + +public class Smb2Connection extends BaseOverthereConnection { + + private final SMBClient client; + private final String hostname; + private final int port; + private final String username; + private final String password; + private final String domain; + private final String shareName; + private Connection connection; + private Session session; + private DiskShare share; + + protected Smb2Connection(String protocol, ConnectionOptions options, AddressPortMapper mapper) { + super(protocol, options, mapper, false); + String unmappedAddress = options.get(ADDRESS); + int unmappedPort = options.getInteger(PORT, PORT_DEFAULT_SMB2); + InetSocketAddress addressPort = mapper.map(createUnresolved(unmappedAddress, unmappedPort)); + hostname = addressPort.getHostName(); + port = addressPort.getPort(); + username = options.get(USERNAME); + password = options.get(PASSWORD); + domain = options.getOptional(DOMAIN); + shareName = options.get(SHARE); + + client = new SMBClient(new DefaultConfig()); + } + + public void connect() { + try { + connection = client.connect(hostname); + AuthenticationContext authContext = new AuthenticationContext(username, password.toCharArray(), domain); + session = connection.authenticate(authContext); + Share share = session.connectShare(shareName); + if (!(share instanceof DiskShare)) { + close(); + throw new RuntimeIOException("The share " + shareName + " is not a disk share"); + } + this.share = (DiskShare) share; + } catch (IOException e) { + throw new RuntimeIOException(e); + } + connected(); + } + + + @Override + public OverthereFile getFile(String hostPath) { + return new Smb2File(this, hostPath); + } + + @Override + public OverthereFile getFile(OverthereFile parent, String child) { + return parent.getFile(child); + } + + @Override + protected void doClose() { + try { + share.close(); + } catch (IOException e) { + + } finally { + try { + session.close(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + connection.close(); + } catch (Exception e) { + + } + } + } + } + + @Override + protected OverthereFile getFileForTempFile(OverthereFile parent, String name) { + return null; + } + + @Override + public String toString() { + return null; + } + + DiskShare getShare() { + return share; + } +} diff --git a/src/main/java/com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java b/src/main/java/com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java new file mode 100644 index 00000000..74dc6d94 --- /dev/null +++ b/src/main/java/com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java @@ -0,0 +1,38 @@ +package com.xebialabs.overthere.smb2; + +import com.xebialabs.overthere.ConnectionOptions; +import com.xebialabs.overthere.OverthereConnection; +import com.xebialabs.overthere.spi.AddressPortMapper; +import com.xebialabs.overthere.spi.OverthereConnectionBuilder; +import com.xebialabs.overthere.spi.Protocol; + +import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.SMB2_PROTOCOL; + +@Protocol(name = SMB2_PROTOCOL) +public class Smb2ConnectionBuilder implements OverthereConnectionBuilder { + public static final String SMB2_PROTOCOL = "SMB2"; + + /** + * The default port for SMB2 connections over TCP/IP + */ + public static final int PORT_DEFAULT_SMB2 = 445; + + /** + * The Windows Domain to authenticate the user against. If not set, bla bla bla + */ + public static final String DOMAIN = "domain"; + + public static final String SHARE = "share"; + + private final Smb2Connection connection; + + public Smb2ConnectionBuilder(String type, ConnectionOptions options, AddressPortMapper mapper) { + connection = new Smb2Connection(type, options, mapper); + } + + @Override + public OverthereConnection connect() { + connection.connect(); + return connection; + } +} diff --git a/src/main/java/com/xebialabs/overthere/smb2/Smb2File.java b/src/main/java/com/xebialabs/overthere/smb2/Smb2File.java new file mode 100644 index 00000000..a75c05ad --- /dev/null +++ b/src/main/java/com/xebialabs/overthere/smb2/Smb2File.java @@ -0,0 +1,134 @@ +package com.xebialabs.overthere.smb2; + +import com.hierynomus.msdtyp.AccessMask; +import com.hierynomus.smbj.share.Directory; +import com.hierynomus.smbj.share.File; +import com.xebialabs.overthere.OverthereFile; +import com.xebialabs.overthere.spi.BaseOverthereFile; + +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Collections; +import java.util.List; + +public class Smb2File extends BaseOverthereFile { + private final String hostPath; + private File file; + private Directory directory; + + public Smb2File(Smb2Connection connection, String hostPath) { + super(connection); + this.hostPath = hostPath; + } + + @Override + public String getPath() { + return hostPath; + } + + @Override + public String getName() { + int i = hostPath.lastIndexOf('\\'); + return hostPath.substring(i); + } + + @Override + public OverthereFile getParentFile() { + return null; + } + + @Override + public boolean exists() { + return isFile() || isDirectory(); + } + + @Override + public boolean canRead() { + return checkAccessMask(AccessMask.GENERIC_READ); + } + + private boolean checkAccessMask(AccessMask mask) { + long accessMask = connection.getShare().getFileInformation(hostPath).getAccessMask(); + return AccessMask.EnumUtils.isSet(accessMask, mask); + } + + @Override + public boolean canWrite() { + return checkAccessMask(AccessMask.GENERIC_WRITE); + } + + @Override + public boolean canExecute() { + return checkAccessMask(AccessMask.GENERIC_EXECUTE); + } + + @Override + public boolean isFile() { + return connection.getShare().fileExists(hostPath); + } + + @Override + public boolean isDirectory() { + return connection.getShare().folderExists(hostPath); + } + + @Override + public boolean isHidden() { + return false; + } + + @Override + public long lastModified() { + return 0; + } + + @Override + public long length() { + return 0; + } + + @Override + public InputStream getInputStream() { + return null; + } + + @Override + public OutputStream getOutputStream() { + return null; + } + + @Override + public void setExecutable(boolean executable) { + + } + + @Override + public void delete() { + + } + + @Override + public List listFiles() { + return Collections.emptyList(); + } + + @Override + public void mkdir() { + + } + + @Override + public void mkdirs() { + + } + + @Override + public void renameTo(OverthereFile dest) { + + } + + @Override + public String toString() { + return null; + } +} From dd6235f6227676b195d8427d34e0e8266335cbfa Mon Sep 17 00:00:00 2001 From: Aditya Kalia Date: Thu, 4 Aug 2016 18:39:42 +0530 Subject: [PATCH 02/40] Refactoring code to segregate remote process and data connections --- .../overthere/cifs/CifsConnection.java | 18 +- .../overthere/cifs/CifsConnectionType.java | 23 +- .../cifs/telnet/CifsTelnetConnection.java | 252 +--------------- .../cifs/telnet/TelnetConnection.java | 282 ++++++++++++++++++ .../cifs/winrm/CifsWinRmConnection.java | 220 +------------- .../overthere/cifs/winrm/WinRmConnection.java | 234 +++++++++++++++ .../cifs/winrs/CifsWinrsConnection.java | 68 +---- .../overthere/cifs/winrs/WinrsConnection.java | 104 +++++++ 8 files changed, 658 insertions(+), 543 deletions(-) create mode 100644 src/main/java/com/xebialabs/overthere/cifs/telnet/TelnetConnection.java create mode 100644 src/main/java/com/xebialabs/overthere/cifs/winrm/WinRmConnection.java create mode 100644 src/main/java/com/xebialabs/overthere/cifs/winrs/WinrsConnection.java diff --git a/src/main/java/com/xebialabs/overthere/cifs/CifsConnection.java b/src/main/java/com/xebialabs/overthere/cifs/CifsConnection.java index df2e9ed5..01656b01 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/CifsConnection.java +++ b/src/main/java/com/xebialabs/overthere/cifs/CifsConnection.java @@ -98,7 +98,7 @@ public CifsConnection(String protocol, ConnectionOptions options, AddressPortMap throw new IllegalArgumentException("Cannot open a cifs:" + cifsConnectionType.toString().toLowerCase() + ": connection through an HTTP proxy"); } this.unmappedAddress = options.get(ADDRESS); - this.unmappedPort = options.get(PORT, getDefaultPort(options)); + this.unmappedPort = options.get(PORT, this.cifsConnectionType.getDefaultPort(options)); InetSocketAddress addressPort = mapper.map(createUnresolved(unmappedAddress, unmappedPort)); this.address = addressPort.getHostName(); this.port = addressPort.getPort(); @@ -111,22 +111,6 @@ public CifsConnection(String protocol, ConnectionOptions options, AddressPortMap this.authentication = new NtlmPasswordAuthentication(null, username, password); } - private int getDefaultPort(ConnectionOptions options) { - switch (cifsConnectionType) { - case TELNET: - return PORT_DEFAULT_TELNET; - case WINRM_INTERNAL: - case WINRM_NATIVE: - if (!options.getBoolean(WINRM_ENABLE_HTTPS, WINRM_ENABLE_HTTPS_DEFAULT)) { - return PORT_DEFAULT_WINRM_HTTP; - } else { - return PORT_DEFAULT_WINRM_HTTPS; - } - default: - throw new IllegalArgumentException("Unknown CIFS connection type " + cifsConnectionType); - } - } - protected abstract void connect(); @Override diff --git a/src/main/java/com/xebialabs/overthere/cifs/CifsConnectionType.java b/src/main/java/com/xebialabs/overthere/cifs/CifsConnectionType.java index a890d8da..64cf39aa 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/CifsConnectionType.java +++ b/src/main/java/com/xebialabs/overthere/cifs/CifsConnectionType.java @@ -22,6 +22,11 @@ */ package com.xebialabs.overthere.cifs; +import com.xebialabs.overthere.ConnectionOptions; + +import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.*; +import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.PORT_DEFAULT_WINRM_HTTPS; + /** * Enumeration of CIFS connection types. */ @@ -41,6 +46,22 @@ public enum CifsConnectionType { * A CIFS connection to a Windows host that uses the winrs command native to Windows to execute commands. * N.B.: This implementation only works when Overthere runs on Windows. */ - WINRM_NATIVE + WINRM_NATIVE; + + public int getDefaultPort(ConnectionOptions options) { + switch (this) { + case TELNET: + return PORT_DEFAULT_TELNET; + case WINRM_INTERNAL: + case WINRM_NATIVE: + if (!options.getBoolean(WINRM_ENABLE_HTTPS, WINRM_ENABLE_HTTPS_DEFAULT)) { + return PORT_DEFAULT_WINRM_HTTP; + } else { + return PORT_DEFAULT_WINRM_HTTPS; + } + default: + throw new IllegalArgumentException("Unknown CIFS connection type " + this); + } + } } diff --git a/src/main/java/com/xebialabs/overthere/cifs/telnet/CifsTelnetConnection.java b/src/main/java/com/xebialabs/overthere/cifs/telnet/CifsTelnetConnection.java index 5b109526..2b98bf0a 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/telnet/CifsTelnetConnection.java +++ b/src/main/java/com/xebialabs/overthere/cifs/telnet/CifsTelnetConnection.java @@ -22,33 +22,14 @@ */ package com.xebialabs.overthere.cifs.telnet; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.PipedInputStream; -import java.io.PipedOutputStream; -import org.apache.commons.net.telnet.InvalidTelnetOptionException; -import org.apache.commons.net.telnet.TelnetClient; -import org.apache.commons.net.telnet.WindowSizeOptionHandler; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.xebialabs.overthere.CmdLine; -import com.xebialabs.overthere.ConnectionOptions; -import com.xebialabs.overthere.Overthere; -import com.xebialabs.overthere.OverthereProcess; -import com.xebialabs.overthere.RuntimeIOException; +import com.xebialabs.overthere.*; import com.xebialabs.overthere.cifs.CifsConnection; import com.xebialabs.overthere.spi.AddressPortMapper; import static com.xebialabs.overthere.util.OverthereUtils.checkArgument; -import static com.xebialabs.overthere.util.OverthereUtils.checkNotNull; -import static com.xebialabs.overthere.OperatingSystemFamily.WINDOWS; import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.CIFS_PROTOCOL; -import static com.xebialabs.overthere.util.OverthereUtils.closeQuietly; -import static java.lang.String.format; +import static com.xebialabs.overthere.OperatingSystemFamily.WINDOWS; + /** * A connection to a Windows host using CIFS and Telnet. @@ -64,12 +45,6 @@ */ public class CifsTelnetConnection extends CifsConnection { - private static final String DETECTABLE_WINDOWS_PROMPT = "TELNET4OVERTHERE "; - - private static final String ERRORLEVEL_PREAMBLE = "ERRORLEVEL-PREAMBLE"; - - private static final String ERRORLEVEL_POSTAMBLE = "ERRORLEVEL-POSTAMBLE"; - /** * Creates a {@link CifsTelnetConnection}. Don't invoke directly. Use * {@link Overthere#getConnection(String, ConnectionOptions)} instead. @@ -90,224 +65,7 @@ public void connect() { @Override public OverthereProcess startProcess(final CmdLine cmd) { - checkNotNull(cmd, "Cannot execute null command line"); - checkArgument(cmd.getArguments().size() > 0, "Cannot execute empty command line"); - - final String obfuscatedCmd = cmd.toCommandLine(os, true); - logger.info("Starting command [{}] on [{}]", obfuscatedCmd, this); - - try { - final TelnetClient tc = new TelnetClient(); - tc.setSocketFactory(mapper.socketFactory()); - tc.setConnectTimeout(connectionTimeoutMillis); - tc.addOptionHandler(new WindowSizeOptionHandler(299, 25, true, false, true, false)); - logger.info("Connecting to telnet://{}@{}", username, address); - tc.connect(address, port); - tc.setSoTimeout(socketTimeoutMillis); - final InputStream stdout = tc.getInputStream(); - final OutputStream stdin = tc.getOutputStream(); - final PipedInputStream callersStdout = new PipedInputStream(); - final PipedOutputStream toCallersStdout = new PipedOutputStream(callersStdout); - final ByteArrayOutputStream outputBuf = new ByteArrayOutputStream(); - final int[] exitValue = new int[1]; - exitValue[0] = -1; - - final Thread outputReaderThread = new Thread("Telnet output reader") { - @Override - public void run() { - try { - receive(stdout, outputBuf, toCallersStdout, "ogin:"); - send(stdin, username); - - receive(stdout, outputBuf, toCallersStdout, "assword:"); - send(stdin, password); - - receive(stdout, outputBuf, toCallersStdout, ">", "ogon failure"); - send(stdin, "PROMPT " + DETECTABLE_WINDOWS_PROMPT); - // We must wait for the prompt twice; the first time is an echo of the PROMPT command, - // the second is the actual prompt - receive(stdout, outputBuf, toCallersStdout, DETECTABLE_WINDOWS_PROMPT); - receive(stdout, outputBuf, toCallersStdout, DETECTABLE_WINDOWS_PROMPT); - - if (workingDirectory != null) { - send(stdin, "CD /D " + workingDirectory.getPath()); - receive(stdout, outputBuf, toCallersStdout, DETECTABLE_WINDOWS_PROMPT); - } - - send(stdin, cmd.toCommandLine(getHostOperatingSystem(), false)); - - receive(stdout, outputBuf, toCallersStdout, DETECTABLE_WINDOWS_PROMPT); - - send(stdin, "ECHO \"" + ERRORLEVEL_PREAMBLE + "%errorlevel%" + ERRORLEVEL_POSTAMBLE); - receive(stdout, outputBuf, toCallersStdout, ERRORLEVEL_POSTAMBLE); - receive(stdout, outputBuf, toCallersStdout, ERRORLEVEL_POSTAMBLE); - String outputBufStr = outputBuf.toString(); - int preamblePos = outputBufStr.indexOf(ERRORLEVEL_PREAMBLE); - int postamblePos = outputBufStr.indexOf(ERRORLEVEL_POSTAMBLE); - if (preamblePos >= 0 && postamblePos >= 0) { - String errorlevelString = outputBufStr.substring(preamblePos + ERRORLEVEL_PREAMBLE.length(), postamblePos); - logger.debug("Errorlevel string found: {}", errorlevelString); - - try { - synchronized (exitValue) { - exitValue[0] = Integer.parseInt(errorlevelString); - } - } catch (NumberFormatException exc) { - logger.error("Cannot parse errorlevel in Windows output: " + outputBuf); - } - } else { - logger.error("Cannot find errorlevel in Windows output: " + outputBuf); - } - } catch (IOException exc) { - throw new RuntimeIOException(format("Cannot start command [%s] on [%s]", obfuscatedCmd, CifsTelnetConnection.this), exc); - } finally { - closeQuietly(toCallersStdout); - } - } - }; - outputReaderThread.setDaemon(true); - outputReaderThread.start(); - - return new OverthereProcess() { - @Override - public synchronized OutputStream getStdin() { - return stdin; - } - - @Override - public synchronized InputStream getStdout() { - return callersStdout; - } - - @Override - public synchronized InputStream getStderr() { - return new ByteArrayInputStream(new byte[0]); - } - - @Override - public synchronized int waitFor() { - if (!tc.isConnected()) { - return exitValue[0]; - } - - try { - try { - outputReaderThread.join(); - } finally { - disconnect(); - } - return exitValue[0]; - } catch (InterruptedException exc) { - throw new RuntimeIOException(format("Cannot start command [%s] on [%s]", obfuscatedCmd, CifsTelnetConnection.this), exc); - } - } - - @Override - public synchronized void destroy() { - if (!tc.isConnected()) { - return; - } - - disconnect(); - } - - private synchronized void disconnect() { - try { - tc.disconnect(); - logger.info("Disconnected from {}", CifsTelnetConnection.this); - - closeQuietly(toCallersStdout); - } catch (IOException exc) { - throw new RuntimeIOException(format("Cannot disconnect from %s", CifsTelnetConnection.this), exc); - } - } - - @Override - public synchronized int exitValue() { - if (tc.isConnected()) { - throw new IllegalThreadStateException(format("Process for command [%s] on %s is still running", obfuscatedCmd, CifsTelnetConnection.this)); - } - - synchronized (exitValue) { - return exitValue[0]; - } - } - }; - } catch (InvalidTelnetOptionException exc) { - throw new RuntimeIOException("Cannot execute command " + cmd + " at telnet://" + username + "@" + address, exc); - } catch (IOException exc) { - throw new RuntimeIOException("Cannot execute command " + cmd + " at telnet://" + username + "@" + address, exc); - } - } - - private static void receive(final InputStream stdout, final ByteArrayOutputStream outputBuf, final PipedOutputStream toCallersStdout, - final String expectedString) throws IOException { - receive(stdout, outputBuf, toCallersStdout, expectedString, null); + TelnetConnection connection = new TelnetConnection(options, mapper, workingDirectory); + return connection.startProcess(cmd); } - - private static void receive(final InputStream stdout, final ByteArrayOutputStream outputBuf, final PipedOutputStream toCallersStdout, - final String expectedString, final String unexpectedString) throws IOException { - boolean lastCharWasCr = false; - boolean lastCharWasEsc = false; - for (; ; ) { - int cInt = stdout.read(); - if (cInt == -1) { - throw new IOException("End of stream reached"); - } - - outputBuf.write(cInt); - final String outputBufStr = outputBuf.toString(); - char c = (char) cInt; - switch (c) { - case '\r': - handleReceivedLine(outputBuf, outputBufStr, toCallersStdout); - break; - case '\n': - if (!lastCharWasCr) { - handleReceivedLine(outputBuf, outputBufStr, toCallersStdout); - } - break; - case '[': - if (lastCharWasEsc) { - throw new RuntimeIOException( - "VT100/ANSI escape sequence found in output stream. Please configure the Windows Telnet server to use stream mode (tlntadmn config mode=stream)."); - } - } - lastCharWasCr = (c == '\r'); - lastCharWasEsc = (c == 27); - - if (unexpectedString != null && outputBufStr.length() >= unexpectedString.length()) { - String s = outputBufStr.substring(outputBufStr.length() - unexpectedString.length(), outputBufStr.length()); - if (s.equals(unexpectedString)) { - logger.debug("Unexpected string [{}] found in Windows Telnet output", unexpectedString); - throw new IOException(format("Unexpected string [%s] found in Windows Telnet output", unexpectedString)); - } - } - - if (outputBufStr.length() >= expectedString.length()) { - String s = outputBufStr.substring(outputBufStr.length() - expectedString.length(), outputBufStr.length()); - if (s.equals(expectedString)) { - logger.debug("Expected string [{}] found in Windows Telnet output", expectedString); - return; - } - } - } - } - - private static void handleReceivedLine(final ByteArrayOutputStream outputBuf, final String outputBufStr, final PipedOutputStream toCallersStdout) - throws IOException { - if (!outputBufStr.contains(DETECTABLE_WINDOWS_PROMPT)) { - toCallersStdout.write(outputBuf.toByteArray()); - toCallersStdout.flush(); - } - outputBuf.reset(); - } - - private static void send(final OutputStream stdin, final String lineToSend) throws IOException { - byte[] bytesToSend = (lineToSend + "\r\n").getBytes(); - stdin.write(bytesToSend); - stdin.flush(); - } - - private static Logger logger = LoggerFactory.getLogger(CifsTelnetConnection.class); } diff --git a/src/main/java/com/xebialabs/overthere/cifs/telnet/TelnetConnection.java b/src/main/java/com/xebialabs/overthere/cifs/telnet/TelnetConnection.java new file mode 100644 index 00000000..cb19efbf --- /dev/null +++ b/src/main/java/com/xebialabs/overthere/cifs/telnet/TelnetConnection.java @@ -0,0 +1,282 @@ +package com.xebialabs.overthere.cifs.telnet; + +import com.xebialabs.overthere.*; +import com.xebialabs.overthere.cifs.CifsConnectionType; +import com.xebialabs.overthere.spi.AddressPortMapper; +import org.apache.commons.net.telnet.InvalidTelnetOptionException; +import org.apache.commons.net.telnet.TelnetClient; +import org.apache.commons.net.telnet.WindowSizeOptionHandler; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.*; +import java.net.InetSocketAddress; + +import static com.xebialabs.overthere.ConnectionOptions.*; +import static com.xebialabs.overthere.util.OverthereUtils.checkArgument; +import static com.xebialabs.overthere.util.OverthereUtils.checkNotNull; +import static com.xebialabs.overthere.util.OverthereUtils.closeQuietly; +import static java.lang.String.format; +import static java.net.InetSocketAddress.createUnresolved; + +class TelnetConnection { + + private static final String DETECTABLE_WINDOWS_PROMPT = "TELNET4OVERTHERE "; + + private static final String ERRORLEVEL_PREAMBLE = "ERRORLEVEL-PREAMBLE"; + + private static final String ERRORLEVEL_POSTAMBLE = "ERRORLEVEL-POSTAMBLE"; + private String address; + private int port; + private String password; + private AddressPortMapper mapper; + private int connectionTimeoutMillis; + + private int socketTimeoutMillis; + private OperatingSystemFamily os; + private OverthereFile workingDirectory; + private String username; + private CifsConnectionType connectionType = CifsConnectionType.TELNET; + + TelnetConnection(ConnectionOptions options, AddressPortMapper mapper, OverthereFile workingDirectory) { + String unmappedAddress = options.get(ADDRESS); + int unmappedPort = options.get(PORT, connectionType.getDefaultPort(options)); + InetSocketAddress addressPort = mapper.map(createUnresolved(unmappedAddress, unmappedPort)); + + this.os = options.getEnum(OPERATING_SYSTEM, OperatingSystemFamily.class); + this.connectionTimeoutMillis = options.getInteger(CONNECTION_TIMEOUT_MILLIS, CONNECTION_TIMEOUT_MILLIS_DEFAULT); + this.socketTimeoutMillis = options.getInteger(SOCKET_TIMEOUT_MILLIS, SOCKET_TIMEOUT_MILLIS_DEFAULT); + + this.address = addressPort.getHostName(); + this.port = addressPort.getPort(); + this.username = options.get(USERNAME); + this.password = options.get(PASSWORD); + this.mapper = mapper; + + this.workingDirectory = workingDirectory; + } + + OverthereProcess startProcess(final CmdLine cmd) { + checkNotNull(cmd, "Cannot execute null command line"); + checkArgument(cmd.getArguments().size() > 0, "Cannot execute empty command line"); + + final String obfuscatedCmd = cmd.toCommandLine(os, true); + logger.info("Starting command [{}] on [{}]", obfuscatedCmd, this); + + try { + final TelnetClient tc = new TelnetClient(); + tc.setSocketFactory(mapper.socketFactory()); + tc.setConnectTimeout(connectionTimeoutMillis); + tc.addOptionHandler(new WindowSizeOptionHandler(299, 25, true, false, true, false)); + logger.info("Connecting to telnet://{}@{}", username, address); + tc.connect(address, port); + tc.setSoTimeout(socketTimeoutMillis); + final InputStream stdout = tc.getInputStream(); + final OutputStream stdin = tc.getOutputStream(); + final PipedInputStream callersStdout = new PipedInputStream(); + final PipedOutputStream toCallersStdout = new PipedOutputStream(callersStdout); + final ByteArrayOutputStream outputBuf = new ByteArrayOutputStream(); + final int[] exitValue = new int[1]; + exitValue[0] = -1; + + final Thread outputReaderThread = new Thread("Telnet output reader") { + @Override + public void run() { + try { + receive(stdout, outputBuf, toCallersStdout, "ogin:"); + send(stdin, username); + + receive(stdout, outputBuf, toCallersStdout, "assword:"); + send(stdin, password); + + receive(stdout, outputBuf, toCallersStdout, ">", "ogon failure"); + send(stdin, "PROMPT " + DETECTABLE_WINDOWS_PROMPT); + // We must wait for the prompt twice; the first time is an echo of the PROMPT command, + // the second is the actual prompt + receive(stdout, outputBuf, toCallersStdout, DETECTABLE_WINDOWS_PROMPT); + receive(stdout, outputBuf, toCallersStdout, DETECTABLE_WINDOWS_PROMPT); + + if (workingDirectory != null) { + send(stdin, "CD /D " + workingDirectory.getPath()); + receive(stdout, outputBuf, toCallersStdout, DETECTABLE_WINDOWS_PROMPT); + } + + send(stdin, cmd.toCommandLine(os, false)); + + receive(stdout, outputBuf, toCallersStdout, DETECTABLE_WINDOWS_PROMPT); + + send(stdin, "ECHO \"" + ERRORLEVEL_PREAMBLE + "%errorlevel%" + ERRORLEVEL_POSTAMBLE); + receive(stdout, outputBuf, toCallersStdout, ERRORLEVEL_POSTAMBLE); + receive(stdout, outputBuf, toCallersStdout, ERRORLEVEL_POSTAMBLE); + String outputBufStr = outputBuf.toString(); + int preamblePos = outputBufStr.indexOf(ERRORLEVEL_PREAMBLE); + int postamblePos = outputBufStr.indexOf(ERRORLEVEL_POSTAMBLE); + if (preamblePos >= 0 && postamblePos >= 0) { + String errorlevelString = outputBufStr.substring(preamblePos + ERRORLEVEL_PREAMBLE.length(), postamblePos); + logger.debug("Errorlevel string found: {}", errorlevelString); + + try { + synchronized (exitValue) { + exitValue[0] = Integer.parseInt(errorlevelString); + } + } catch (NumberFormatException exc) { + logger.error("Cannot parse errorlevel in Windows output: " + outputBuf); + } + } else { + logger.error("Cannot find errorlevel in Windows output: " + outputBuf); + } + } catch (IOException exc) { + throw new RuntimeIOException(format("Cannot start command [%s] on [%s]", obfuscatedCmd, TelnetConnection.this), exc); + } finally { + closeQuietly(toCallersStdout); + } + } + }; + outputReaderThread.setDaemon(true); + outputReaderThread.start(); + + return new OverthereProcess() { + @Override + public synchronized OutputStream getStdin() { + return stdin; + } + + @Override + public synchronized InputStream getStdout() { + return callersStdout; + } + + @Override + public synchronized InputStream getStderr() { + return new ByteArrayInputStream(new byte[0]); + } + + @Override + public synchronized int waitFor() { + if (!tc.isConnected()) { + return exitValue[0]; + } + + try { + try { + outputReaderThread.join(); + } finally { + disconnect(); + } + return exitValue[0]; + } catch (InterruptedException exc) { + throw new RuntimeIOException(format("Cannot start command [%s] on [%s]", obfuscatedCmd, TelnetConnection.this), exc); + } + } + + @Override + public synchronized void destroy() { + if (!tc.isConnected()) { + return; + } + + disconnect(); + } + + private synchronized void disconnect() { + try { + tc.disconnect(); + logger.info("Disconnected from {}", TelnetConnection.this); + + closeQuietly(toCallersStdout); + } catch (IOException exc) { + throw new RuntimeIOException(format("Cannot disconnect from %s", TelnetConnection.this), exc); + } + } + + @Override + public synchronized int exitValue() { + if (tc.isConnected()) { + throw new IllegalThreadStateException(format("Process for command [%s] on %s is still running", obfuscatedCmd, TelnetConnection.this)); + } + + synchronized (exitValue) { + return exitValue[0]; + } + } + }; + } catch (InvalidTelnetOptionException exc) { + throw new RuntimeIOException("Cannot execute command " + cmd + " at telnet://" + username + "@" + address, exc); + } catch (IOException exc) { + throw new RuntimeIOException("Cannot execute command " + cmd + " at telnet://" + username + "@" + address, exc); + } + } + + private static void receive(final InputStream stdout, final ByteArrayOutputStream outputBuf, final PipedOutputStream toCallersStdout, + final String expectedString) throws IOException { + receive(stdout, outputBuf, toCallersStdout, expectedString, null); + } + + private static void receive(final InputStream stdout, final ByteArrayOutputStream outputBuf, final PipedOutputStream toCallersStdout, + final String expectedString, final String unexpectedString) throws IOException { + boolean lastCharWasCr = false; + boolean lastCharWasEsc = false; + for (; ; ) { + int cInt = stdout.read(); + if (cInt == -1) { + throw new IOException("End of stream reached"); + } + + outputBuf.write(cInt); + final String outputBufStr = outputBuf.toString(); + char c = (char) cInt; + switch (c) { + case '\r': + handleReceivedLine(outputBuf, outputBufStr, toCallersStdout); + break; + case '\n': + if (!lastCharWasCr) { + handleReceivedLine(outputBuf, outputBufStr, toCallersStdout); + } + break; + case '[': + if (lastCharWasEsc) { + throw new RuntimeIOException( + "VT100/ANSI escape sequence found in output stream. Please configure the Windows Telnet server to use stream mode (tlntadmn config mode=stream)."); + } + } + lastCharWasCr = (c == '\r'); + lastCharWasEsc = (c == 27); + + if (unexpectedString != null && outputBufStr.length() >= unexpectedString.length()) { + String s = outputBufStr.substring(outputBufStr.length() - unexpectedString.length(), outputBufStr.length()); + if (s.equals(unexpectedString)) { + logger.debug("Unexpected string [{}] found in Windows Telnet output", unexpectedString); + throw new IOException(format("Unexpected string [%s] found in Windows Telnet output", unexpectedString)); + } + } + + if (outputBufStr.length() >= expectedString.length()) { + String s = outputBufStr.substring(outputBufStr.length() - expectedString.length(), outputBufStr.length()); + if (s.equals(expectedString)) { + logger.debug("Expected string [{}] found in Windows Telnet output", expectedString); + return; + } + } + } + } + + private static void handleReceivedLine(final ByteArrayOutputStream outputBuf, final String outputBufStr, final PipedOutputStream toCallersStdout) + throws IOException { + if (!outputBufStr.contains(DETECTABLE_WINDOWS_PROMPT)) { + toCallersStdout.write(outputBuf.toByteArray()); + toCallersStdout.flush(); + } + outputBuf.reset(); + } + + private static void send(final OutputStream stdin, final String lineToSend) throws IOException { + byte[] bytesToSend = (lineToSend + "\r\n").getBytes(); + stdin.write(bytesToSend); + stdin.flush(); + } + + private static Logger logger = LoggerFactory.getLogger(TelnetConnection.class); +} + + diff --git a/src/main/java/com/xebialabs/overthere/cifs/winrm/CifsWinRmConnection.java b/src/main/java/com/xebialabs/overthere/cifs/winrm/CifsWinRmConnection.java index 98226537..c59ede65 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/winrm/CifsWinRmConnection.java +++ b/src/main/java/com/xebialabs/overthere/cifs/winrm/CifsWinRmConnection.java @@ -22,66 +22,22 @@ */ package com.xebialabs.overthere.cifs.winrm; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.PipedInputStream; -import java.io.PipedOutputStream; -import java.net.MalformedURLException; -import java.net.URL; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import com.xebialabs.overthere.CmdLine; import com.xebialabs.overthere.ConnectionOptions; import com.xebialabs.overthere.Overthere; -import com.xebialabs.overthere.OverthereConnection; import com.xebialabs.overthere.OverthereProcess; -import com.xebialabs.overthere.RuntimeIOException; import com.xebialabs.overthere.cifs.CifsConnection; -import com.xebialabs.overthere.cifs.WinrmHttpsCertificateTrustStrategy; -import com.xebialabs.overthere.cifs.WinrmHttpsHostnameVerificationStrategy; import com.xebialabs.overthere.spi.AddressPortMapper; -import static com.xebialabs.overthere.ConnectionOptions.*; import static com.xebialabs.overthere.util.OverthereUtils.checkArgument; -import static com.xebialabs.overthere.util.OverthereUtils.checkNotNull; import static com.xebialabs.overthere.OperatingSystemFamily.WINDOWS; import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.CIFS_PROTOCOL; -import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.WINRM_CONTEXT_DEFAULT; -import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.WINRM_ENABLE_HTTPS_DEFAULT; -import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.WINRM_ENVELOP_SIZE_DEFAULT; -import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.WINRM_HTTPS_CERTIFICATE_TRUST_STRATEGY_DEFAULT; -import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.WINRM_HTTPS_HOSTNAME_VERIFICATION_STRATEGY_DEFAULT; -import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.WINRM_KERBEROS_ADD_PORT_TO_SPN_DEFAULT; -import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.WINRM_KERBEROS_DEBUG_DEFAULT; -import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.WINRM_KERBEROS_USE_HTTP_SPN_DEFAULT; -import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.WINRM_LOCALE_DEFAULT; -import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.DEFAULT_WINRM_TIMEOUT; -import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.WINRM_CONTEXT; -import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.WINRM_ENABLE_HTTPS; -import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.WINRM_ENVELOP_SIZE; -import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.WINRM_HTTPS_CERTIFICATE_TRUST_STRATEGY; -import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.WINRM_HTTPS_HOSTNAME_VERIFICATION_STRATEGY; -import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.WINRM_KERBEROS_ADD_PORT_TO_SPN; -import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.WINRM_KERBEROS_DEBUG; -import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.WINRM_KERBEROS_USE_HTTP_SPN; -import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.WINRM_LOCALE; -import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.WINRM_TIMEMOUT; -import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.WINRM_KERBEROS_TICKET_CACHE; -import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.WINRM_KERBEROS_TICKET_CACHE_DEFAULT; -import static com.xebialabs.overthere.ConnectionOptions.CONNECTION_TIMEOUT_MILLIS; -import static com.xebialabs.overthere.ConnectionOptions.CONNECTION_TIMEOUT_MILLIS_DEFAULT; -import static com.xebialabs.overthere.util.OverthereUtils.closeQuietly; -import static java.lang.String.format; /** * A connection to a Windows host using CIFS and a Java implementation of WinRM. */ public class CifsWinRmConnection extends CifsConnection { - private ConnectionOptions options; - public static final int STDIN_BUF_SIZE = 4096; /** @@ -93,7 +49,6 @@ public CifsWinRmConnection(String type, ConnectionOptions options, AddressPortMa checkArgument(os == WINDOWS, "Cannot create a " + CIFS_PROTOCOL + ":%s connection to a host that is not running Windows", cifsConnectionType.toString().toLowerCase()); checkArgument(!username.contains("\\"), "Cannot create a " + CIFS_PROTOCOL + ":%s connection with an old-style Windows domain account [%s], use USER@DOMAIN instead.", cifsConnectionType.toString().toLowerCase(), username); - this.options = options; } @Override @@ -103,179 +58,8 @@ public void connect() { @Override public OverthereProcess startProcess(final CmdLine cmd) { - checkNotNull(cmd, "Cannot execute null command line"); - checkArgument(cmd.getArguments().size() > 0, "Cannot execute empty command line"); - - final String obfuscatedCmd = cmd.toCommandLine(os, true); - logger.info("Starting command [{}] on [{}]", obfuscatedCmd, this); - - String cmdString = cmd.toCommandLine(os, false); - if (workingDirectory != null) { - cmdString = "CD /D " + workingDirectory.getPath() + " & " + cmdString; - } - - final WinRmClient winRmClient = createWinrmClient(); - try { - final PipedInputStream fromCallersStdin = new PipedInputStream(); - final PipedOutputStream callersStdin = new PipedOutputStream(fromCallersStdin); - final PipedInputStream callersStdout = new PipedInputStream(); - final PipedOutputStream toCallersStdout = new PipedOutputStream(callersStdout); - final PipedInputStream callersStderr = new PipedInputStream(); - final PipedOutputStream toCallersStderr = new PipedOutputStream(callersStderr); - - winRmClient.createShell(); - final String commandId = winRmClient.executeCommand(cmdString); - - final Exception inputReaderTheaException[] = new Exception[1]; - final Thread inputReaderThead = new Thread(format("WinRM input reader for command [%s]", commandId)) { - @Override - public void run() { - try { - byte[] buf = new byte[STDIN_BUF_SIZE]; - for (; ; ) { - int n = fromCallersStdin.read(buf); - if (n == -1) - break; - if (n == 0) - continue; - - byte[] bufToSend = new byte[n]; - System.arraycopy(buf, 0, bufToSend, 0, n); - winRmClient.sendInput(bufToSend); - } - } catch (Exception exc) { - inputReaderTheaException[0] = exc; - } finally { - closeQuietly(fromCallersStdin); - } - } - }; - inputReaderThead.setDaemon(true); - inputReaderThead.start(); - - final Exception outputReaderThreadException[] = new Exception[1]; - final Thread outputReaderThread = new Thread(format("WinRM output reader for command [%s]", commandId)) { - @Override - public void run() { - try { - for (; ; ) { - if (!winRmClient.receiveOutput(toCallersStdout, toCallersStderr)) - break; - } - } catch (Exception exc) { - outputReaderThreadException[0] = exc; - } finally { - closeQuietly(toCallersStdout); - closeQuietly(toCallersStderr); - } - } - }; - outputReaderThread.setDaemon(true); - outputReaderThread.start(); - - return new OverthereProcess() { - boolean processTerminated = false; - - @Override - public synchronized OutputStream getStdin() { - return callersStdin; - } - - @Override - public synchronized InputStream getStdout() { - return callersStdout; - } - - @Override - public synchronized InputStream getStderr() { - return callersStderr; - } - - @Override - public synchronized int waitFor() { - if (processTerminated) { - return exitValue(); - } - - try { - try { - outputReaderThread.join(); - } finally { - closeQuietly(callersStdin); - processTerminated = true; - try { - winRmClient.deleteShell(); - }catch (Throwable t){ - logger.warn("Failure while deleting winrm shell", t); - } - } - if (outputReaderThreadException[0] != null) { - if (outputReaderThreadException[0] instanceof RuntimeException) { - throw (RuntimeException) outputReaderThreadException[0]; - } else { - throw new RuntimeIOException(format("Cannot execute command [%s] on [%s]", obfuscatedCmd, CifsWinRmConnection.this), outputReaderThreadException[0]); - } - } - return exitValue(); - } catch (InterruptedException exc) { - throw new RuntimeIOException(format("Cannot execute command [%s] on [%s]", obfuscatedCmd, CifsWinRmConnection.this), exc); - } - } - - @Override - public synchronized void destroy() { - if (processTerminated) { - return; - } - - closeQuietly(callersStdin); - processTerminated = true; - winRmClient.signal(); - winRmClient.deleteShell(); - } - - @Override - public synchronized int exitValue() { - if (!processTerminated) { - throw new IllegalThreadStateException(format("Process for command [%s] on [%s] is still running", obfuscatedCmd, - CifsWinRmConnection.this)); - } - - return winRmClient.exitValue(); - } - }; - - } catch (IOException exc) { - throw new RuntimeIOException("Cannot execute command " + cmd + " on " + this, exc); - } - } - - private WinRmClient createWinrmClient() { - final WinRmClient client = new WinRmClient(username, password, createWinrmURL(), unmappedAddress, unmappedPort, mapper.socketFactory()); - client.setWinRmTimeout(options.get(WINRM_TIMEMOUT, DEFAULT_WINRM_TIMEOUT)); - client.setWinRmEnvelopSize(options.get(WINRM_ENVELOP_SIZE, WINRM_ENVELOP_SIZE_DEFAULT)); - client.setWinRmLocale(options.get(WINRM_LOCALE, WINRM_LOCALE_DEFAULT)); - client.setHttpsCertTrustStrategy(options.getEnum(WINRM_HTTPS_CERTIFICATE_TRUST_STRATEGY, WinrmHttpsCertificateTrustStrategy.class, WINRM_HTTPS_CERTIFICATE_TRUST_STRATEGY_DEFAULT)); - client.setHttpsHostnameVerifyStrategy(options.getEnum(WINRM_HTTPS_HOSTNAME_VERIFICATION_STRATEGY, WinrmHttpsHostnameVerificationStrategy.class, WINRM_HTTPS_HOSTNAME_VERIFICATION_STRATEGY_DEFAULT)); - client.setKerberosUseHttpSpn(options.getBoolean(WINRM_KERBEROS_USE_HTTP_SPN, WINRM_KERBEROS_USE_HTTP_SPN_DEFAULT)); - client.setKerberosAddPortToSpn(options.getBoolean(WINRM_KERBEROS_ADD_PORT_TO_SPN, WINRM_KERBEROS_ADD_PORT_TO_SPN_DEFAULT)); - client.setKerberosDebug(options.getBoolean(WINRM_KERBEROS_DEBUG, WINRM_KERBEROS_DEBUG_DEFAULT)); - client.setKerberosTicketCache(options.getBoolean(WINRM_KERBEROS_TICKET_CACHE, WINRM_KERBEROS_TICKET_CACHE_DEFAULT)); - client.setConnectionTimeout(connectionTimeoutMillis); - client.setSoTimeout(socketTimeoutMillis); - return client; + WinRmConnection connection = new WinRmConnection(options, mapper, workingDirectory); + return connection.startProcess(cmd); } - private URL createWinrmURL() { - final String scheme = options.getBoolean(WINRM_ENABLE_HTTPS, WINRM_ENABLE_HTTPS_DEFAULT) ? "https" : "http"; - final String context = options.get(WINRM_CONTEXT, WINRM_CONTEXT_DEFAULT); - try { - return new URL(scheme, address, port, context); - } catch (MalformedURLException e) { - throw new WinRmRuntimeIOException("Cannot build a new URL for " + this, e); - } - } - - private static Logger logger = LoggerFactory.getLogger(CifsWinRmConnection.class); - } diff --git a/src/main/java/com/xebialabs/overthere/cifs/winrm/WinRmConnection.java b/src/main/java/com/xebialabs/overthere/cifs/winrm/WinRmConnection.java new file mode 100644 index 00000000..9fb2f93e --- /dev/null +++ b/src/main/java/com/xebialabs/overthere/cifs/winrm/WinRmConnection.java @@ -0,0 +1,234 @@ +package com.xebialabs.overthere.cifs.winrm; + +import com.xebialabs.overthere.*; +import com.xebialabs.overthere.cifs.CifsConnectionType; +import com.xebialabs.overthere.cifs.WinrmHttpsCertificateTrustStrategy; +import com.xebialabs.overthere.cifs.WinrmHttpsHostnameVerificationStrategy; +import com.xebialabs.overthere.spi.AddressPortMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.*; +import java.net.InetSocketAddress; +import java.net.MalformedURLException; +import java.net.URL; + +import static com.xebialabs.overthere.ConnectionOptions.*; +import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.*; +import static com.xebialabs.overthere.util.OverthereUtils.checkArgument; +import static com.xebialabs.overthere.util.OverthereUtils.checkNotNull; +import static com.xebialabs.overthere.util.OverthereUtils.closeQuietly; +import static java.lang.String.format; +import static java.net.InetSocketAddress.createUnresolved; + +class WinRmConnection { + + private int connectionTimeoutMillis; + private int socketTimeoutMillis; + private OperatingSystemFamily os; + private OverthereFile workingDirectory; + private AddressPortMapper mapper; + private String address; + private int port; + private String password; + private String username; + private CifsConnectionType connectionType = CifsConnectionType.WINRM_INTERNAL; + private ConnectionOptions options; + private final String unmappedAddress; + private final int unmappedPort; + + WinRmConnection(ConnectionOptions options, AddressPortMapper mapper, OverthereFile workingDirectory) { + this.workingDirectory = workingDirectory; + this.options = options; + this.mapper = mapper; + + this.os = options.getEnum(OPERATING_SYSTEM, OperatingSystemFamily.class); + this.connectionTimeoutMillis = options.getInteger(CONNECTION_TIMEOUT_MILLIS, CONNECTION_TIMEOUT_MILLIS_DEFAULT); + this.socketTimeoutMillis = options.getInteger(SOCKET_TIMEOUT_MILLIS, SOCKET_TIMEOUT_MILLIS_DEFAULT); + + unmappedAddress = options.get(ADDRESS); + unmappedPort = options.get(PORT, connectionType.getDefaultPort(options)); + InetSocketAddress addressPort = mapper.map(createUnresolved(unmappedAddress, unmappedPort)); + this.address = addressPort.getHostName(); + this.port = addressPort.getPort(); + this.username = options.get(USERNAME); + this.password = options.get(PASSWORD); + + } + + OverthereProcess startProcess(final CmdLine cmd) { + checkNotNull(cmd, "Cannot execute null command line"); + checkArgument(cmd.getArguments().size() > 0, "Cannot execute empty command line"); + + final String obfuscatedCmd = cmd.toCommandLine(os, true); + logger.info("Starting command [{}] on [{}]", obfuscatedCmd, this); + + String cmdString = cmd.toCommandLine(os, false); + if (workingDirectory != null) { + cmdString = "CD /D " + workingDirectory.getPath() + " & " + cmdString; + } + + final WinRmClient winRmClient = createWinrmClient(); + try { + final PipedInputStream fromCallersStdin = new PipedInputStream(); + final PipedOutputStream callersStdin = new PipedOutputStream(fromCallersStdin); + final PipedInputStream callersStdout = new PipedInputStream(); + final PipedOutputStream toCallersStdout = new PipedOutputStream(callersStdout); + final PipedInputStream callersStderr = new PipedInputStream(); + final PipedOutputStream toCallersStderr = new PipedOutputStream(callersStderr); + + winRmClient.createShell(); + final String commandId = winRmClient.executeCommand(cmdString); + + final Exception inputReaderTheaException[] = new Exception[1]; + final Thread inputReaderThead = new Thread(format("WinRM input reader for command [%s]", commandId)) { + @Override + public void run() { + try { + byte[] buf = new byte[CifsWinRmConnection.STDIN_BUF_SIZE]; + for (; ; ) { + int n = fromCallersStdin.read(buf); + if (n == -1) + break; + if (n == 0) + continue; + + byte[] bufToSend = new byte[n]; + System.arraycopy(buf, 0, bufToSend, 0, n); + winRmClient.sendInput(bufToSend); + } + } catch (Exception exc) { + inputReaderTheaException[0] = exc; + } finally { + closeQuietly(fromCallersStdin); + } + } + }; + inputReaderThead.setDaemon(true); + inputReaderThead.start(); + + final Exception outputReaderThreadException[] = new Exception[1]; + final Thread outputReaderThread = new Thread(format("WinRM output reader for command [%s]", commandId)) { + @Override + public void run() { + try { + for (; ; ) { + if (!winRmClient.receiveOutput(toCallersStdout, toCallersStderr)) + break; + } + } catch (Exception exc) { + outputReaderThreadException[0] = exc; + } finally { + closeQuietly(toCallersStdout); + closeQuietly(toCallersStderr); + } + } + }; + outputReaderThread.setDaemon(true); + outputReaderThread.start(); + + return new OverthereProcess() { + boolean processTerminated = false; + + @Override + public synchronized OutputStream getStdin() { + return callersStdin; + } + + @Override + public synchronized InputStream getStdout() { + return callersStdout; + } + + @Override + public synchronized InputStream getStderr() { + return callersStderr; + } + + @Override + public synchronized int waitFor() { + if (processTerminated) { + return exitValue(); + } + + try { + try { + outputReaderThread.join(); + } finally { + closeQuietly(callersStdin); + processTerminated = true; + try { + winRmClient.deleteShell(); + }catch (Throwable t){ + logger.warn("Failure while deleting winrm shell", t); + } + } + if (outputReaderThreadException[0] != null) { + if (outputReaderThreadException[0] instanceof RuntimeException) { + throw (RuntimeException) outputReaderThreadException[0]; + } else { + throw new RuntimeIOException(format("Cannot execute command [%s] on [%s]", obfuscatedCmd, WinRmConnection.this), outputReaderThreadException[0]); + } + } + return exitValue(); + } catch (InterruptedException exc) { + throw new RuntimeIOException(format("Cannot execute command [%s] on [%s]", obfuscatedCmd, WinRmConnection.this), exc); + } + } + + @Override + public synchronized void destroy() { + if (processTerminated) { + return; + } + + closeQuietly(callersStdin); + processTerminated = true; + winRmClient.signal(); + winRmClient.deleteShell(); + } + + @Override + public synchronized int exitValue() { + if (!processTerminated) { + throw new IllegalThreadStateException(format("Process for command [%s] on [%s] is still running", obfuscatedCmd, + WinRmConnection.this)); + } + + return winRmClient.exitValue(); + } + }; + + } catch (IOException exc) { + throw new RuntimeIOException("Cannot execute command " + cmd + " on " + this, exc); + } + } + + private WinRmClient createWinrmClient() { + final WinRmClient client = new WinRmClient(username, password, createWinrmURL(), unmappedAddress, unmappedPort, mapper.socketFactory()); + client.setWinRmTimeout(options.get(WINRM_TIMEMOUT, DEFAULT_WINRM_TIMEOUT)); + client.setWinRmEnvelopSize(options.get(WINRM_ENVELOP_SIZE, WINRM_ENVELOP_SIZE_DEFAULT)); + client.setWinRmLocale(options.get(WINRM_LOCALE, WINRM_LOCALE_DEFAULT)); + client.setHttpsCertTrustStrategy(options.getEnum(WINRM_HTTPS_CERTIFICATE_TRUST_STRATEGY, WinrmHttpsCertificateTrustStrategy.class, WINRM_HTTPS_CERTIFICATE_TRUST_STRATEGY_DEFAULT)); + client.setHttpsHostnameVerifyStrategy(options.getEnum(WINRM_HTTPS_HOSTNAME_VERIFICATION_STRATEGY, WinrmHttpsHostnameVerificationStrategy.class, WINRM_HTTPS_HOSTNAME_VERIFICATION_STRATEGY_DEFAULT)); + client.setKerberosUseHttpSpn(options.getBoolean(WINRM_KERBEROS_USE_HTTP_SPN, WINRM_KERBEROS_USE_HTTP_SPN_DEFAULT)); + client.setKerberosAddPortToSpn(options.getBoolean(WINRM_KERBEROS_ADD_PORT_TO_SPN, WINRM_KERBEROS_ADD_PORT_TO_SPN_DEFAULT)); + client.setKerberosDebug(options.getBoolean(WINRM_KERBEROS_DEBUG, WINRM_KERBEROS_DEBUG_DEFAULT)); + client.setKerberosTicketCache(options.getBoolean(WINRM_KERBEROS_TICKET_CACHE, WINRM_KERBEROS_TICKET_CACHE_DEFAULT)); + client.setConnectionTimeout(connectionTimeoutMillis); + client.setSoTimeout(socketTimeoutMillis); + return client; + } + + private URL createWinrmURL() { + final String scheme = options.getBoolean(WINRM_ENABLE_HTTPS, WINRM_ENABLE_HTTPS_DEFAULT) ? "https" : "http"; + final String context = options.get(WINRM_CONTEXT, WINRM_CONTEXT_DEFAULT); + try { + return new URL(scheme, address, port, context); + } catch (MalformedURLException e) { + throw new WinRmRuntimeIOException("Cannot build a new URL for " + this, e); + } + } + + private static Logger logger = LoggerFactory.getLogger(WinRmConnection.class); +} diff --git a/src/main/java/com/xebialabs/overthere/cifs/winrs/CifsWinrsConnection.java b/src/main/java/com/xebialabs/overthere/cifs/winrs/CifsWinrsConnection.java index 834e8ca6..4917893f 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/winrs/CifsWinrsConnection.java +++ b/src/main/java/com/xebialabs/overthere/cifs/winrs/CifsWinrsConnection.java @@ -26,8 +26,6 @@ import com.xebialabs.overthere.cifs.CifsConnection; import com.xebialabs.overthere.spi.AddressPortMapper; import com.xebialabs.overthere.util.DefaultAddressPortMapper; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import static com.xebialabs.overthere.OperatingSystemFamily.WINDOWS; import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.*; @@ -39,9 +37,9 @@ */ public class CifsWinrsConnection extends CifsConnection { - private ConnectionOptions options; + private WinrsConnection connection; - private OverthereConnection winrsProxyConnection; + private ConnectionOptions options; public CifsWinrsConnection(String type, ConnectionOptions options, AddressPortMapper mapper) { super(type, options, mapper, true); @@ -54,10 +52,11 @@ public CifsWinrsConnection(String type, ConnectionOptions options, AddressPortMa @Override public void connect() { - connectToWinrsProxy(options); + connection = new WinrsConnection(options, mapper, workingDirectory); + connection.connectToWinrsProxy(options); - if (winrsProxyConnection.getHostOperatingSystem() != WINDOWS) { - disconnectFromWinrsProxy(); + if (connection.getWinrsProxyConnection().getHostOperatingSystem() != WINDOWS) { + connection.disconnectFromWinrsProxy(); throw new IllegalArgumentException(format("Cannot create a " + CIFS_PROTOCOL + ":%s connection with a winrs proxy that is not running Windows", cifsConnectionType.toString().toLowerCase())); } @@ -66,62 +65,11 @@ public void connect() { @Override public void doClose() { - disconnectFromWinrsProxy(); - } - - private void connectToWinrsProxy(ConnectionOptions options) { - logger.debug("Connecting to winrs proxy"); - - String winrsProxyProtocol = options.get(WINRS_PROXY_PROTOCOL, WINRS_PROXY_PROTOCOL_DEFAULT); - ConnectionOptions winrsProxyConnectionOptions = options.get(WINRS_PROXY_CONNECTION_OPTIONS, new ConnectionOptions()); - winrsProxyConnection = Overthere.getConnection(winrsProxyProtocol, winrsProxyConnectionOptions); - } - - private void disconnectFromWinrsProxy() { - logger.debug("Disconnecting from winrs proxy"); - - closeQuietly(winrsProxyConnection); + connection.disconnectFromWinrsProxy(); } @Override public OverthereProcess startProcess(final CmdLine cmd) { - checkNotNull(cmd, "Cannot execute null command line"); - checkArgument(cmd.getArguments().size() > 0, "Cannot execute empty command line"); - - final String obfuscatedCmd = cmd.toCommandLine(os, true); - logger.info("Starting command [{}] on [{}]", obfuscatedCmd, this); - - final CmdLine winrsCmd = new CmdLine(); - winrsCmd.addArgument("winrs"); - winrsCmd.addArgument("-remote:" + address + ":" + port); - winrsCmd.addArgument("-username:" + username); - winrsCmd.addPassword("-password:" + password); - if (workingDirectory != null) { - winrsCmd.addArgument("-directory:" + workingDirectory.getPath()); - } - if (options.getBoolean(WINRS_NOECHO, WINRS_NOECHO_DEFAULT)) { - winrsCmd.addArgument("-noecho"); - } - if (options.getBoolean(WINRS_NOPROFILE, WINRS_NOPROFILE_DEFAULT)) { - winrsCmd.addArgument("-noprofile"); - } - if (options.getBoolean(WINRS_ALLOW_DELEGATE, DEFAULT_WINRS_ALLOW_DELEGATE)) { - winrsCmd.addArgument("-allowdelegate"); - } - if (options.getBoolean(WINRS_COMPRESSION, WINRS_COMPRESSION_DEFAULT)) { - winrsCmd.addArgument("-compression"); - } - if (options.getBoolean(WINRS_UNENCRYPTED, WINRS_UNENCRYPTED_DEFAULT)) { - winrsCmd.addArgument("-unencrypted"); - } - if (options.getBoolean(WINRM_ENABLE_HTTPS, WINRM_ENABLE_HTTPS_DEFAULT)) { - winrsCmd.addArgument("-usessl"); - } - winrsCmd.add(cmd.getArguments()); - - return winrsProxyConnection.startProcess(winrsCmd); + return connection.startProcess(cmd); } - - private static final Logger logger = LoggerFactory.getLogger(CifsWinrsConnection.class); - } diff --git a/src/main/java/com/xebialabs/overthere/cifs/winrs/WinrsConnection.java b/src/main/java/com/xebialabs/overthere/cifs/winrs/WinrsConnection.java new file mode 100644 index 00000000..f3697468 --- /dev/null +++ b/src/main/java/com/xebialabs/overthere/cifs/winrs/WinrsConnection.java @@ -0,0 +1,104 @@ +package com.xebialabs.overthere.cifs.winrs; + +import com.xebialabs.overthere.*; +import com.xebialabs.overthere.cifs.CifsConnectionType; +import com.xebialabs.overthere.spi.AddressPortMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.net.InetSocketAddress; + +import static com.xebialabs.overthere.ConnectionOptions.*; +import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.*; +import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.WINRM_ENABLE_HTTPS; +import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.WINRM_ENABLE_HTTPS_DEFAULT; +import static com.xebialabs.overthere.util.OverthereUtils.checkArgument; +import static com.xebialabs.overthere.util.OverthereUtils.checkNotNull; +import static com.xebialabs.overthere.util.OverthereUtils.closeQuietly; +import static java.net.InetSocketAddress.createUnresolved; + +class WinrsConnection { + + private OperatingSystemFamily os; + private OverthereFile workingDirectory; + private String address; + private int port; + private String password; + private String username; + private CifsConnectionType connectionType = CifsConnectionType.WINRM_INTERNAL; + private ConnectionOptions options; + + private OverthereConnection winrsProxyConnection; + + WinrsConnection(ConnectionOptions options, AddressPortMapper mapper, OverthereFile workingDirectory) { + this.workingDirectory = workingDirectory; + this.options = options; + this.os = options.getEnum(OPERATING_SYSTEM, OperatingSystemFamily.class); + String unmappedAddress = options.get(ADDRESS); + int unmappedPort = options.get(PORT, connectionType.getDefaultPort(options)); + InetSocketAddress addressPort = mapper.map(createUnresolved(unmappedAddress, unmappedPort)); + this.address = addressPort.getHostName(); + this.port = addressPort.getPort(); + this.username = options.get(USERNAME); + this.password = options.get(PASSWORD); + } + + OverthereConnection getWinrsProxyConnection() { + return this.winrsProxyConnection; + } + + OverthereConnection connectToWinrsProxy(ConnectionOptions options) { + logger.debug("Connecting to winrs proxy"); + + String winrsProxyProtocol = options.get(WINRS_PROXY_PROTOCOL, WINRS_PROXY_PROTOCOL_DEFAULT); + ConnectionOptions winrsProxyConnectionOptions = options.get(WINRS_PROXY_CONNECTION_OPTIONS, new ConnectionOptions()); + winrsProxyConnection = Overthere.getConnection(winrsProxyProtocol, winrsProxyConnectionOptions); + return winrsProxyConnection; + } + + void disconnectFromWinrsProxy() { + logger.debug("Disconnecting from winrs proxy"); + + closeQuietly(winrsProxyConnection); + } + + OverthereProcess startProcess(final CmdLine cmd) { + checkNotNull(cmd, "Cannot execute null command line"); + checkArgument(cmd.getArguments().size() > 0, "Cannot execute empty command line"); + + final String obfuscatedCmd = cmd.toCommandLine(os, true); + logger.info("Starting command [{}] on [{}]", obfuscatedCmd, this); + + final CmdLine winrsCmd = new CmdLine(); + winrsCmd.addArgument("winrs"); + winrsCmd.addArgument("-remote:" + address + ":" + port); + winrsCmd.addArgument("-username:" + username); + winrsCmd.addPassword("-password:" + password); + if (workingDirectory != null) { + winrsCmd.addArgument("-directory:" + workingDirectory.getPath()); + } + if (options.getBoolean(WINRS_NOECHO, WINRS_NOECHO_DEFAULT)) { + winrsCmd.addArgument("-noecho"); + } + if (options.getBoolean(WINRS_NOPROFILE, WINRS_NOPROFILE_DEFAULT)) { + winrsCmd.addArgument("-noprofile"); + } + if (options.getBoolean(WINRS_ALLOW_DELEGATE, DEFAULT_WINRS_ALLOW_DELEGATE)) { + winrsCmd.addArgument("-allowdelegate"); + } + if (options.getBoolean(WINRS_COMPRESSION, WINRS_COMPRESSION_DEFAULT)) { + winrsCmd.addArgument("-compression"); + } + if (options.getBoolean(WINRS_UNENCRYPTED, WINRS_UNENCRYPTED_DEFAULT)) { + winrsCmd.addArgument("-unencrypted"); + } + if (options.getBoolean(WINRM_ENABLE_HTTPS, WINRM_ENABLE_HTTPS_DEFAULT)) { + winrsCmd.addArgument("-usessl"); + } + winrsCmd.add(cmd.getArguments()); + + return winrsProxyConnection.startProcess(winrsCmd); + } + + private static final Logger logger = LoggerFactory.getLogger(WinrsConnection.class); +} From 5cc081f58aea6582ca2b26e4513dc7cf593c9397 Mon Sep 17 00:00:00 2001 From: Aditya Kalia Date: Sun, 7 Aug 2016 14:24:57 +0530 Subject: [PATCH 03/40] Implementing telnet, winrm, winrs connections connections for smb2 --- build.gradle | 2 +- libs/smbj-0.0.4-dev.jar | Bin 0 -> 236461 bytes .../overthere/cifs/CifsConnectionBuilder.java | 197 +---------------- .../overthere/cifs/ConnectionBuilder.java | 203 ++++++++++++++++++ .../cifs/telnet/TelnetConnection.java | 6 +- .../overthere/cifs/winrm/WinRmConnection.java | 6 +- .../overthere/cifs/winrs/WinrsConnection.java | 12 +- .../overthere/smb2/Smb2Connection.java | 39 +++- .../overthere/smb2/Smb2ConnectionBuilder.java | 27 ++- .../xebialabs/overthere/smb2/Smb2File.java | 191 ++++++++++++++-- .../smb2/telnet/Smb2TelnetConnection.java | 67 ++++++ .../smb2/winrm/Smb2WinRmConnection.java | 63 ++++++ .../smb2/winrs/Smb2WinrsConnection.java | 75 +++++++ 13 files changed, 653 insertions(+), 235 deletions(-) create mode 100644 libs/smbj-0.0.4-dev.jar create mode 100644 src/main/java/com/xebialabs/overthere/cifs/ConnectionBuilder.java create mode 100644 src/main/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnection.java create mode 100644 src/main/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnection.java create mode 100644 src/main/java/com/xebialabs/overthere/smb2/winrs/Smb2WinrsConnection.java diff --git a/build.gradle b/build.gradle index d6ded992..52e4d496 100644 --- a/build.gradle +++ b/build.gradle @@ -61,7 +61,7 @@ dependencies { compile 'jcifs:jcifs:1.3.17' // SMB2/3 - compile 'com.hierynomus:smbj:0.0.3' + compile files('libs/smbj-0.0.4-dev.jar') // Telnet compile 'commons-net:commons-net:3.3' diff --git a/libs/smbj-0.0.4-dev.jar b/libs/smbj-0.0.4-dev.jar new file mode 100644 index 0000000000000000000000000000000000000000..24efb8d5d8741bb2bfe58d82ce0228cb8417cc2e GIT binary patch literal 236461 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

hKlKtNlcmTxLjyn7 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%0De7wG~`wu}y>P&EzV#&%%;N(y}DwFA+Mm!P6mQ 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

UhIb7>C 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

  • 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 |cd|z#GDDn}~D3@k|PGZ_XL>DGp&b*a9(#COI zllC4NPMm#`y&t80&xNFwB}B|bivE7rJFa? z!rr-v_f+iNaSwEM^~eN!ya)^G9t~=O)dS7Z4f^k-w&Ra>=&uz{H8bI56z!ly8I=%C zP|2tLOcGtmyH&(Ngu?oAn>U;DY9ts+qWt?tZHpN2Rip;zl0j;tV>LwL_DF-SSTJwV z^@;-DG0868?AJ8tcEzk};dja!zaNv1iDG3-GR(Z!2qyd|`v3jVgN{5F7znr|lt=#8 z@b-Vy<^M*_2AFl&0pMEy4jfju^v3>;>Nl3e^TgoT9|E!}c|hVuG~p-$1BnohqUjc) z>lp~RuZA+Ci9cdojNxLIl6+2U2}RTDYIi9v^_G@aqABm7+0yR%4D-A4-#z10H`Yuu z`Q!I?Bj`T6$vNe{?S0j$Zr}SjY5l`)tPfQr!E(fr=FZ@*VL56nK{X+Gq@JzsSknt% z8cv!H9uFQAk8Z-FFKEnBa{&BC5EOqf9QATk+~caawj&~*@`Zzs@Bk9@-9dDK{FV|l ze>9mXFXak@`b5)@Mqt8Q2oS9SCIWK zC+N;_yNQpsQ1c1K=y(r^rApA{@iCdJy`qpilkJI7blILx+ojGx>_U1e#>|loby;c) z*jm4X?ou1c!!qj)|5(dnG7ZWSu9icq=oTZzu`rUBEIZ=!j(c`p+Ddbn?#%}#YwgJ+ zC$qIz*`8DfXJ?82qA}>)^k`VEkQ_75-JhyVOzCGR8wQPP$2KgjSyG2jMq8T({SZl& zVGNEjf~7W7OiOu_m2OB>Ypg~QO_HU4oj?b?YHMR1CYtymxMl_o2gyE9#rET7kPii4 zAWVIk0+XZWGE=V;5*_GxJM+M{Rx($LEy2+Z85SmD!i5dImh$A zlG$p$V(v12&*Z_|MV*w%q*`SaF1{2Zv)i$HbSJAkpC`7Y*5$t+pB%cWjXffxivB{2 zyQ#Dlx~#ZGR$twunU3!X*;#s10St({QykvOWDX;^d5t@Qko1}hn-E3ey23>No(O<8 zKQQV#;LP6p1h%u9y=Uaa>RdvMejC+WVQ29|GsG`>Ixk4_8 z!5Z2yd=N0(~5|Jvi_R}{-JXE^^j zpsfkX(+3%}c)UFxNl5ceaxg~)kR4TdpkI|HHyEAKJ$1l`dv8L}o^mZlc9II7?x^%c z_D#KnNBQsTyC~RK=S!X1GBrQg)>9Qp^)xqjQPS2W6 zq5HLsjmkBbFqzIk=Lc_VAa%skZ;JUu+ZM8}@mhA4E2q6I=d!r#1;x4y4`S6mb@4V1 z-a~L)-ux3>Z~4~dp8Q{Z?^{yuPLFTLhn4=|$E7zaMu9M^IjD9Kci%v0m9>W71WYaq zm0j3%W|GzghWxts!+K{L4=;JzCmvIsV1_yovF}oc54&ho`|<&566KYABKZYdtJ9vh zBL(z2-Z8)PZ2ZLWDi-xOW?>)XS1IeOV9tMJRL)er>6B|Lb*K!uYTM25##OQCXG~>X z5#_&Zbi6~N*j}t9vE{$tk@9LYkfEJMK*Xz&&E|u%;UHS8haQ7&Oq{6{y07lN?Yo`g z^b@{?V;1&}L1n$X2`C}&5DX{NAwJlgcn5pr-Q|~mlIvm%41```zAeBCO)rrOO)mtB z&!H_w8YgTcKRoG!Sb%xByMQV^>@sB)`A$KIa0g96h;a+8B2X21Vm2jchip=rh>o)- z^uVyL3*OaPg!ja>RUgs?5Ms&if?>%MN%U(&x?%s^5^m^*xO4pZOc&(FewH^tF@Q_< z7dinGZuWprKtd*%goKQUfTWCwg5(Ja38{R8hD1(-Og`XTds`Awh>w++C2lc?1R`P~ z*;QyEz43yyuzx;#!uT~_fCH=^8nmpM{7hJ(e^D4QT3@z?M#i4zZEF>`i|zXAQLRgg6eP~ zDvsZ;_6TB@rM9T6p#1#u#fSr&%Gs_a#87NuY`Uv|b8U=TV^m$tb!;t%5>GhM=8TFcZ#*68)4P_K-l6}rvF^U&_T z*+I#Skz&(>vL?r+Xw}gr*I3u--;p>qaXD4iGS6x|9&4)?Ht^wkq9mvWAghSKl?3%{ z{&IO$>+&h>H8o!@B4|N>1ONA(yk=?K@eF{T;ssDLiT_3a2VlS=Y-9PK9!dY^BZ#aH zu&ixrFli2`Fjz9WEw$2%vIf5xIVS8zspp}1VA}yjY$`+hOUs=sVrQYGE z{i}wtMmA(J%Y>`Wx>dD)_rTD<%^+i)W_g}vtzjlw+wQW6^87o!YQIxV`i~m7WthYt zi;Sv^KPFqAJ6UIuw7+dAOjp^a#kwjqZA&drp8_pgdBq*qAALY5&QziJH1mZX44IP-lEIFv38SyBZA~>z&>E{@pbL(~2 zZG1Y-q0`FRs;X}6I_Xn($Obpjf|wQabfyVLQcMYbuq^X5uF>c28TzznMl!oZ8x~n| z)>XFot`Rq4lnlyeZST#-Mc{@>!*0>eC$DOUEiFGwxm{sQ75|{gHU}n#g@vhP)M)&ZX7%0Lg=b{7c(RR4-?LK4>-iFT)UvC;V5&P{?j^yr zgPV}jV3}*w??2D0Spf~=hj$!A6FkqrH!iuTCTNhEz)H^^YydSLH-+*&? zv0im{vqDj~qIef3yNz0_%&B%?G|8k?G42so6?5{Ews%*FW6HtqbE@RK>hhCi@p6>zskVt6dC&!j|E68t5l9^>_-<6;bD-{3Epe`R01tTQd5V2vR{#M%| z?1t6kH}4O*%<;F?#P;O+upU9Vo)L3!PJ?eyB^Cu)Jflo$c7btyWI74~S?RuSujd*Y zS?@pyW6pSRe?$Fq16}w9TA8FihPF30_EWL~w8k(!$>ddKsW-Z+FWmQLl|j%tuIDa8 zFwmeLd3;Re8f?o$C{NqZQ1VV!f9@0kLS9RAau1n*yD3Ku6sJ7))br~lQI%~lnoMhoCyx(UcLjQ``)LWa(! zD*y3c|1L66y->#%MfsN1&}gEG2MVQ9TY_Q<=~r4Of)E9b24$aTlPG;zr%7&T_*44+ zgY$gn;3SW@aFX+>`#Tx$`Z7$wvc$uQ$^Dqm?-`)N`+A(i_Xp|-_67CLK%F9o;u|rS z?1|>YyobVKq=w6nJ_^)81G$FAghy?GNEW4GJ&+c31?8lP-iitm_t*>~AE!2Hs@kQl zned=Gum=65fsQa|Vl)0CHrfs&+onzB7+!M&XGg`MeF%+d8tG z_nZSzp>&umbDA+|^C1Cm%P7H2cXm#pZaYpdP8#&4HY*fcJP{kL_sk8AV;xhe!PFh5 zn9CBawKm!_98NpVTb4eZjrCx3--TBooB4~+0Xi{i!S@>8)eikRxt@C*y0Ip zny(XQ-I25NK|G9eIC!F;G9e9`Xeamum_$$01w?VDguKchr&nwDhPz$y=g+l^NON5`E>LKQ@ymbHY~{JVzq9YRMH8MI^@3p`o^@+zqBFsvHicmsK8c@*`sz zX?xWWA|kr3SCNL7`*t;`)n-IcXjN;-2}9q-shC_vKWv65EvZ9o?U1OwC9k_23ACCo zPz+tCoSzTEf9vcI^w_>E6YHK4eyWfgDLH!2&BcQb!RTBEkp0X&|INsp;5Xz_v3;0$ zY2i?^z4Dv!P1w!`>cKDSvX9oN_6%B4J^|2AcHCi?N_k%kZBPYJV!4O@pe#k{=n%g9 zv{vp{qRupvhP5qyxUNzzByTWZCe)*d8m7;xsYO6m9r$=!T+aW^L|I$@W3{MJw4Jvy z$1Z>y=h3|N7=|T?{&#-IsKX7dYX$rk0UFnldlB}n{~>UXSK<`qI+M>L$)gCdR9&h? zxo6{adKjkQ5iQrrq5yY3ofBxvgi4}EWQee2nh|R?e%=M*6*LlAVrgA$G9pJuoI4P1 zK{9qGaezV5$}vWz5I;F}-hKiGzlbxLSLBXonZOs=UXU;@Kx*V%m7)F=)`5Uu@@?k1 zrun7aDmp2Snj|&sS6>1K!JjSM2hR$>WmHbzzyImV@$~S?cNCDQq@n(`A=v+u<`fK# ztxa8&Obt!`!(pmc&02W_pjK>(HH{&F3lT4X7nZsW)&f~1`+2~!x3I_o`BMtYce06r zsO@l)DdglR`>HIXSa9#%V)m6 zA1FiEUxqgZT4OR8e6wsvRQ#J8LU?CGpOAMR6VFG%3>$z7dB61)0k7TQXEd$G;22Zd zP{ghzM1F%~=$87Q&m{ytd{gp#}?ds4(I}UTbd9RwbS8#zM1D zTcM!277`aT_7+)LR$JFuD)lYVRmK)1+R2NoRQkJZ6}5Kh^Daw{jWpdVwPh*F_QI|> zGu6qqgR1+iuVn{xm@Ni&P`mpg%?6hCa}19IW_Cb4?IS);4$ zw7q^i!c3{MuF_?8d8zYU{c&5Er&&jr$xb^nBbgqROLb)=y)}glq~w-oqBE79^3b3? zf-#qzLWNCK)TO4gj+=0v!*E!gi3-_s9$mO2($^I)Y?}&qSfvke&ggpo4!*-en|kI} zJxBD9*&#Jz@dBG&+}oH2plG|xW>hV8T_C>#)zF$M`Y0833?L2n)9OdcAPr;jeNj3NzOLQM4QeF(Uk8LC{B1Y!GETTq0MJQ^~fAxCi z-{~yZ1iewT8=hW?1e+FGY1X7+(ygnCvzy7%ogIy4m9FUzAc&C;&uyLb5Y`(Y*i(BT zD}sJvBp6a?2n!By$$(<>Y#Oa4Mz2T@TzCZ6g^J}VUUQV0@Te+?NP@loDS&#yOT5e? zE&gd4!Rv+Q*=&hgBwkXk1l21h88~D_COC0@`$msX3q5DSh5LEDVL>*OhYCtpg@km% zkHo}=YO|LaGJdPH@XD)6Z8fz<yzSu>KRrR}ieD4E_bzZbH^j3E~blz{5RkyY?XhBHM=>Y@dm&ziwN||AK zzgnQrhsKNGkW~Z$`ezDXUEs~{hlg9lf>!JOPujPIy@F?gKVb;Po;hYaiGBHbzLCBX zk?A)8G{xSIC_&<;sIrj<`T(xh6S1H%dX~i{Iw29rw&dD-Qd}iC?U&buvs!MrFYNgAxHRrl-q7;)+G0$IOUyNzvLp{=3q7J6_RvVJ0=VQt?jD7{K7F34TX&1A>1)N`<{V1s zq@^41^t`+&m0k^Q`_Ltoy~)G8!hbrH)jzAMWLf%TH5273O>J$1Ru%yophHj~pU_10 zt^MDxa6%q^d9gnUe?qwLoZt@HoJkE+)Dif1K83lb(t4Wz!+CdlMhSpea)1fO;$T=@lF}4^p znL0}p3+Is|offgpmK>QM%x+eNC-(+lz)slaLD~Iw%}TAu`((Cw4x6vnAn0der&FWy z4vnJqQ5?l$%$liE*l*q820gr?yXW>o52?Q2G13C_!p>fB18_Lnf7d4)yP)eA8qMwB zFj_pzVH$TvgXRBqDNXc0uBVH!!~bGz(duJSbOd-CNr0V-{r~76{$X&TV(jpb*Yl5} zI#)&39^jG;bna`pg^puvVE`^YhBEsxa8F zyPxqLTqX_EY4k$g{lK1>kqokzB$s+?CeWfL?eVzef1iOn?Q@w@wj=cV8CLfdZ}?!l z19@({gqx<@L#|=vc_*45TN_KjcnmGRko6_$rHlwuYd_Zfrc8IMk@>%NU-N-l6qDZ|MdBi5IZ83)N26A3299oeaKTTK=2EwiVVn7~Acj0BG4yXjouv4@(1p&33)h60^<8WI`dEtZZcz z3JboRmnI9XyH`G9qO`fyw##s`JF}gnNhgq{+YMD!OqHw{%7>50tWS>4C$U0Rt_)@q`Zm|eaGTB%vZ9I3g!Bdw}Sm0E4pH5KdXUENjI zUAG$TCt~avAu+1Um|gc_l{@vSZZ6)sTa?MA?Dm#cp2DrLU)u~&b`uU5X5Zv-)vBqY zLo2NAy4AfnE48mefmZSwxcsX)Gs;=D4dL_t&TBA%{{?i9U zuk{S+N08Pd3ku^Pfob2$LzT4#StKT%RyE#3>Wj5Yb=#3vma1Boi8sf0sz35dc2JtC zv%F={T;!S&#|fk`xZ^4}kQ5!C6s6dvv9x(>4VGC~qUMRzMRpFe?AC0G>exc$Uu)8p zlGE}lie7=JKK}~PXaKrSZD!?xG#Fj^yONY?06Fm%j&8goWQvF{nK8;X?BZJ&;iBGb z<^hw=Bt0E0KZRnQV6~s&8SJz9_$8kirqwxQ^BEdZ-w6xe)F;3aQ{5r8uwHX$Y9@mS zk8zVLTjZ-a)a@A(+PvWIhI`q|o~92%Rt%9#d?U3nJP8JP35MBzZ5k%>$!ppDin~-u zTa>34;uJ5!zTBBpuWZ3X+H{F2x6s`_bUc_}{(QmWChCggJnzaQx3>xze`x`_*HQAf z&J>?P2fBTI_(qrL=$s3KN_K5zZMw|`WFKCf^HeK*CTnzMtHHq^q+w@e+UM^PsMd5h{HdT3D+fWfakcO22>ohB49rP zq$BkaBu2rEMub7y%R>9zPh&(w#Vhf@zo@A|dc{`}Lu$7baQD!~5!xdZ$7be7=IbMP zh#LyTFR_TWDGWk{hRZzRfnkYpD*VGJ`QpvRF0ArfJe?Q?7d z2Q>*|47H{bSOXcQ2qnEuK=g@-jB*;MwlWB$GoB_+iR43#ULpO3A#@rnir_5y7!|}% zntA5TYT}&fdq^R3TW0*-Sd-335e&kFd?i*iwfg?3WK(+#6;mU3O1|anS&3s$knj@4 z^s1HdC z@;|ogT>>oE2r5}|T*Bgj>RbAy02T|#l3!Tr&MJvAl2d3;l;O~Fy-MxJycD)6sM52=cf1}{(s+Ri9*wUMF6CuFMxc<_5Ur`{ZscTSJ_$~g%O2U7cC4|JRv;5 z{_u#7fH>&o#{i8)(*ywtLd>2rrdj&HpR=+h#aDShMl1%b&!1lu2Y;vOkO)LR<~N?6 z@|Ko1y!}7Fo{;-d^fDS4ObpgUz=$~y9pvlp)=^q8SsB9|fuCh%`d5C!!^mKHjL#!Q zNR1@J1w`0l9fL zOqA9?yPB*0eM20IIf$zIb>Z#AkMf(NsrdXUua*S9I4faN&2C2TuJoh|w!Lk^Vd-cz z&V$xhR3`Kz6X&oxYFgH4T=cw z{s?@vno>U`F_1E>4NCHMk_T=Xt1w9<4MXc>vmj5?S$BBxG0iu(X?rO$W9{I&Bb55o zAfu;&1opC-AyypC>}G8c`9a$w$`5#sX4)vu@Xfz>tlt^>UZY_?%q^_(o->N)F0KIP z;6xl>l*>n7-7I}J;4gG{i&u)SR7pf+)tDs?z-SDu+Le@7uQcA`Sn1A}YS729S|Ygy zvT6he^j%OZZ_Atz@`bOKlekZnCe=msG0!H(^ooiwl1IGnV)@;iBVP*AL!%KL7*Di0 zbcr^!d)WsKgKnv#E?FEmr_%ah+894Uw~rq)ELs*A;1-|K>uDhHNo9na!wy2*`AEwXkLOsF zrDKa{uu+o<a$R#Fym%y9^B5amDFo z6oU;dJL(pI{}kZx$&siGsUlK^a2l46TdvTs#p=JCU4kCC+3HAly`z%E%2l=`0wJwyRmPAPIe~ zanU+d%!3^QRVh5oEzb-2s@! zJ!>Hvc}02&rRw(Rv3ti-&I)Io`{*r&5Kf0i)x%UueM`GTc8zxBi6v-Br8@iZ*FW{Q zMiFYqh5<423vlVj_WvVh{&8?9Rg$$wW<>CnTeNA0O-V~bfugmIqEH$1!9jK^0D`1+ zkX()`Zq|sb*7d%!PdAMId7tXmmiNYSrc6eVaJ7=k78v^XM9CKs$#>E0l5r0!Svw+R=RxFR zW-V704Qkg}eg8O+wA$0evR}l-uWiRl;C!8haL4siue%J zIGrHX93hL!Klr%u!>F1{7`j#=4}Q0CjMpw2U&ouyPNq_az1pFq|5bI@HRE6ijXlIZ zifOCU^4J&2>WC9X*IFK_k-g+`o_-_~qG904O`W}Qz&iT)e%;-wj+U`mhyZgK^4vgm z7M3c9s$2MAS_K-x4tap6p4am4aR+ldcTS@S!`te|VQZA>);`hfh(ztbR)aLwt7et0 zcG9%YZdw1H*CI}TAnXW!RI2{#91wb4;m0BTm-<-Fms>ioUn;Y^cbu2S2lGurKInuEL_pzGTLpVTM|xR?h`lRCT!IL+se{m>=|d;-dCgrb?MV6sh|f zXITQX5vHvsqc^J0l*Y+XwWoKFRjatH%!Q+jyU^=ym1bN-6Oy^MYf`@R`s)*(_Gta~+5rILQ%`y;t+zrn!Z+EiyNsF3`yg#T1izFhFjZ-YDw zcng@t#qs;6lNDg`{_}zi?f>P=ajM-}zUo@pXmMsJ-(SGe6Wt1WqgX-gw3ZJi`{CC~(k$x>R2p;tyP zSu&aZj7AqlWD~)`5ZO{x;AgN68%-qXqG$s}!G3Qc0acW%x(=1X_q*90Q*!LE&(7xa z_OIuh`~0IkXS+P#i%8=iD-o@3n->DOy#)oUfij!v!CF3w1D|jv2YlfCcnL$nP972i zLr}ek0a3(IcoPE$r|t$=V2AtZs5q_#@bVlA0fL-9q65iLag-c&yCJ}#9dmKXcdx3P zJfz{}xEbN~lpIF^$a54gUBIF*VL|49J?Oya4zk^Rq?x|k4xfX9t~qu`-Em*=dawK8 zZ(4BqU3SG^8gpJFH(!)FKc?f*NuTpKZlOWx|J*hKpX{Y8HLG8~q^8_n=zM_HPwurt z`I(PdcfRn-QU9AfoJ%2=pHm@}UmE*EwC+O{&VOoT=N6u`r*1bNPA9~l@})iK8)CX@ z9mnF<_HmWnOB)Nz_X|s3ShZF_(6+oy{@%q>teYGmIwa=l5y+F(kQi$zX3edZx(@o# ztc~t zYgyx{66!_$ce~s9Kt{bRyHVj5A#ao4!5g9G9&Z<6LSwZSfw%BD#0VRdNtaX`^qSS6 zZ3^=*Hj~pY5BF+3%SEkjmr6;F3Rl}zBEr|)oR$$TArM_1Y#4WME{cN!#H%=Q-UU2i zdwA~;uWrgoambY1R(_>Gm(Fj~vH&4!WnIli_?N;|=MESZ;O?tlyacHK% z8Az0OtU-q?(5Bqy5TX=X3KzFwm%`dX^)nvCId7xF+OC$HP+EX_R0YU!$wmmC%)060 zvWBgL^y(p~k(Pse?us$fo+L7ddsJFdj10Y)ORa4G(YmTGljKedUd+Ucvqst8SQ{m` zmD8Y^6)&%DVFB3)h}Q$b5Hm%C4Ny9ph|pG{hDE;I`G-P#3ET+K+jfT?h%08mK{DLm zq=EbZWqhk_jVx4wk_nE6^(fqX40czM!S`@9(}((ufaJN;$T5!_*IMsio1AT)K*z=$ z6qyp4XDB)US7}!Q59Rj$MaoXr#HD13kX`l|`qInpRd}Xl27o(ND0V4$3jEPUWJSsFP$R z>fVdCO7!{EFvCZxxg-rN313c+_al4yVw5Mu!I^E!S_wZWNB86kFzD4Od#Q4>T;@9% zw>MF~ww};bBGyk}Bqu(Di#YobH!4BO#ZGLXoi4lkg0l0?RDup);kAM+kyg3R5*GRdCdi_vWIEK$YQj6+W6p4!}#ElHRdMq zoRgnttGk%J=gTc+qSap0W#+&`4Kv{V9D5n}d36zY=!_>aNg^HhrAeDNc(gwGO_iy{A&)KUu|PrFBDhn~$Z|GY7{$gTm9VzcM*bjK3_- z9HaF;(=i_dQxXbVEGH09ZJC=Q57aWxl{cIoMS*=7n()~RXS1QDHbO-J3 zJ#KhVH|E0ceo9{}Q?$aDzLb+jB_=ynJ0`+OIH~Y6p_T0PBl?=gKCe3zb7T!Sg@;pk z>NKm$XK(YFXx;2ozj-aRshP~qqdW@wbH0+KOb0n14YMaaXemG#F&cCKz?H6et8G`h z-qSYE558mZuZ+%k0Y8o`Q8ix{Og=>}S7&0AxRKybM|Xxc&Qwf=@>S65j2pjFPd72t1$gF8{`T3&(4&_Y>Y(*c!X)#rr%r z7oLw|F+aJxt^2Zdb==Deq4fV6No5wG?sgHZQ)Fr|ndij&CjIjY&Odl+dGe3!arNs=pt^ebYNAUX?bmzs zmtcM^47WW?vrH)@#{aV@3MV!gP_aEOsX`0MOJNV@;!#r#^|VZg8<32SV`SZ>4oT5S zf_Lf;rr)%_5;U;?qfSZ;tEtHR7f1@#*=nvR)RtCU(b` zDD`SIONBDbN-YR6Qd=LN+e_xyh#(tXuu)9OWheh$;6QLCf~iOM$@S#H2rizZM%Rtw zW4j|VV!H#odG!5uPaD02ar$p>(y+`|@@QZi9TsfnXw6u5i@jN0_wJ6+4RuYQf~=P& zf*G;%!+o{dffvUP75#V5sMK@lQ%8WNuXjp+U-q->O7FZ9ZuF};mEhtmi3sN5?;{kMz>Zoq<3kxe92VWt}pGqvm;7c*Dra*m7UkcOa7~! z{i}*2-!32ro9r%D)+0YVHnrVRQ|TIyA?c<3BH(QB={T|JfznwWFNO-eDr5VM(_{np z-b~bTcr8~{7X;Rr{Ae+N`S#qW=y-d(x$t6Slv#!+z29CQu4dYlCB?J;B<#9Dvxudu znKI0$kha9BUoCX_q0c= zc!&A(#uHO+^yb+uBX-A~uJTRmWt-{y(2o80G}S0{j7P|#?YIx&*q4!j`U3cFyKUnr zy`#-M*U!V1rQn(IJCl8KvN7EH z!jpZ@!%cyNJo#-W;7P+`!)GE(WmT?$7e3As)~OZn63O_q%1hmiVxbC8PE~zikk-5C zPvYdZn`v0I+2z4pS6>yYCr?C;m5Fp^X>J$Daymr7ecydM>KA@fuTj54*{yoKVH9l?!B z+rUrZpPTwAl6}2CeN-X!(J9i+W19Okplr*`{cT?nyl}4>8{g3EbH*4`Thz zfdJJ{=AMm-y^UJdU-c^tzgY{O@O#Nr7h587owTyj{)9Nxo@$umdbc3A-8o0^J)_Fo z9wv{!*~Xo?)4Pbx`k6v=q(Zete|`2+W>$?V_x0CHRuPt&?>P9=AHcaH%#VF7GJiEe zGB0roY+=Y3qeyo+OmyAVIw}A{MwMI@AWC7TxN|V+)tN$V1`$z>eoZ=kkz<|zjan!a zK0TtDpA)y2A(>0;>xmMX-3Lg+S)y4B`!gDdVj3q&3E8xVVqIn$C3>kFCIv^kYk6nl z2am)lOWx08({dEOf7O|`;ltcgzssZk3-#J<&aDoeYEg3vm=jTx`->DVVDn8lxPNo= z36T-h!+xbCVe0M2QpfP4Bd&PfF1jn6$Xz{?c33&inVbjQh@K91C~Pl@?$Lb08dzKu zC0TGfuqY(@#qFbwuj4!}vJkqYc#;=!Mw$uS-tJQ>Q2FuuqmT1He&vN72 z!d&xIv#;x;g-S_R)q6h|GE51apFGZSzZUR(@mAseNV;vi(ll4)2dWEc|MuYhdedzw0=XboniuP61KED`xjbU-- zsJML7^1;5uyr(&Rk8j^1O^%-Vddd&=_;F_By=aj~Mq!6cM-EO^Pl`MOI~8dswB_u& zgX~!1y6@e2xxeIMq0hYI&Y~m73NH~^sq)+Q_-N~$)-;RPk7ZlTPlf^?ZJQ zm#DZ5*h|vc8hu7WQg0$hIfiu657OM2Z5}B?%Xz<0%vXZqAWhHpGglD4PdYfh`xal^ z8-`F3O@ds84P$_rR`tMYT?9J2u2A*>Si~cPT4ZL~}KzvC{M# z9nLH@pv;)%9cq-US?+sg7Wv|;QB!S0O8fZDy0Fxdx|G~^8P(=wbH~19IUuY*Gcg%{ zbpB?zZRj~up^t0cR8V*8f5N4i)c97l6hrSPN@;Hdn1q--KOlK)FtTHuzOc&GV@`l! z@TrT@JtM!JgRw7U$2gjL6d9ND4XF5HYycaPgI-I;r{- zR)|_p9@{}-80mH?1dhxqWtF3ii{X71!=0gaSiY!LY6gWG$onCtBAGYF&^1BLbxiD@ zMS)#suwA@WOaG%=@3kne-%grhYct@L;~G)pI~$t(Nl?LfSJeP>nwi08qa_Lj`{EOs zi(F?jhC8*pU1^%XS{*YmUW)5?NHDw}Gb6+BxSri;DN0~4SfAlinbdiGQhUAYt+a!& z5~`_FJy-ij&$jOom+MxZJKEuGv_yJtbo7vsh-{4I+xT3bFAg_C9uK=tRSnvIDcf63 zAM~bbyLm?%o3GgdedQjxft&q9Cl||6Zs#&x)e3p6+vIQGJT(&^*T2tg2~wxveq;M! zUu)?_0ToNeN`zxmUQ<9nRL{XO{}5{r8`->GuW5A<2a#Q#wNFLWqyEaOAGt$sN<S^&k_X3l^9h#+T4dk4`r>kn)$?NquM8MVF=;U>-(CFC+J9iuuF{wMgn#j{i&0FX zan!DZ8KQSHy=-3;=(-c$z1drMi7h!sLag2X@`+3PzVRy3m8m?4Q-9BW-RVo5#<-)Q zuJHc!gB2;=aXBsrO=I^|v=eJsJC;!{#1J&dE!%Z#c-0sS#d>;1NL=kG2su0Dy5o%! z@rnCl*>6}3KO-GO9$9|=61gaN`?QR|ixOAZ`BTX`#~W`AUySTi1P4q#yQ+O!Fe54< z7D96Evj2MnE~^svi?+vJ-HSi+?pBldw$77UJB*o2zc1yEMAqy36ZhuQpJvjht~Suy z-LlWWh|co_o}y{%VcgoGXCXeZGZ;9E3_zc;FB81L<((CD*9daF@q@a!w#HY>rv*p~a$g=d3B%&4&!j^y`b#4c-AEIp zgAdUB_geY0b*hiRu9up&$F#*h)9l*iA*YcysF61imZO27QFCWts~7jy%yE}_F66JK z4-x4Mj$~_U_iIk^4tZ%qmC;G&)Bm%|g8Ad&oUCz*?(9hSo1v5Y8eW`Y&Ay~A5#SJa zN;8MA0FvuU79}Z6Soif3D$}%_ zdu^WOX(7s{x|ci7lv=X%D;bSmf12H{(l+xS&zl_H?avQKRNqf*u_*b-eWa2;Qpo>| zf&3YAwfX8J(R8Zp?*xKxsk}W#l*_Lc$_aM9(|PRp@?9vDzF504cx}h~t5KQPPcOo6-Qz5aejco$A4zbNqhy{L6(Mr?yXig;3Ny8z zlm49ffZfS`6Maav~8!d6v>tiNxj?R+pS#vdCIeb z#k0a`?r{)h#BiTdD3h%)9GU-h>7I4XVTqec{q)T~`t$Hq7x?YZ<$)~=xx|q@vynX{ zpYn+=H+l*uUiitL7-Vqx3{9d8Y0G!g7Aw&wQevWsHQt9yi0bv+1o=^O9pi3-vVlDY z{0lU3zNAh1(rVQ7CuhbA7ROH~>}m@0=D+kG|A&hz{`5Iy1;>=lN?$P5=-0QolaXug zlG6@m+cy$1v(^4_$3(U_S56a4lR}>I9WKgf~*#eDBAD z)afbo&$f?O$Pz`ux1|SAu}%6BurpcE?r~SBOBr3aKa%*3H_th+Zjuf58VKO5;pmhQQho) zty=F((SPurG-PydsSyQHxI}isVjfv*;N&g?Bq47_If@|~}!zNt^Zgp0NhMB)*?urYPVgZZ$ zQCg^X3Vfmzw~>8xx7)@=oR_9!7*#(-YZlLvH@T(T(oTR`_`z;^RW3=pXQrIDMUa?V%!k_JU>Nv7{;XU7J1&+D%Ne@f9nA9$V3(RDes4yoVE)kjH-+=}F zfi(}}w4~v$rJS{8^xt+2JF25qD@31Y>XhT@+4*I1N^yx0@u{@wxU%8_pUf#aONiu4 zZmph>AN+a&JI|e0(Db7mRy@T0X`rIv2J^G}v0j<;2nss>6m}aLn`oM_;6KZC^(5@tmuFptZZLaJgysN(r-wGZYSDc6NF)7PFdLFFpdFbgLd>nm%Z(o)Iu0`3Q>897%$ z^u4U-(@1KMT^>%1Z@n@U5CU%|4Rhu75(}wM^*W|kb>xhi?VqU;Ul^I)ly{y{L zMFCg%lBx;`-z+f5^6WD}k`p&YzmS{oA?`oa(&w$pP6>n1zIr0(Bvl`()DpWlO#M9t zu~eEZX_)9!DafHcx{9qklRnUA?&`LeIh}u^x})~l>%s53>XD+;V#ShSJ>juAF}L|Y z#tR!$d?>rEFAMc5S+rtmth)O_t4sJ)IhTJ&NrhCsfU#fyAsLgZ*KYk9TEp$Y++kIBL9GA zGJd+~Jfd2JsFOS`_*D_t`^nFcn2W3&agi36Oi8UcI-W=n_Igh2IDMk#iGO!mvqe<` zTe397lh3t8>s_i#kK%yOMT-9p^wJh7l^%9xZs&+WIkCtbWo%3t^XnG*z}%buJoiL% z*D-HiC*MxB#z$|@>N|In-!^6x^doL9?3g`WB^(f#seU-bC%n_0O-jnh*gGT=w$r`Jsv0bf#-6((E#aGpkW1`h*_j6C{ z9zrP>Iv@2x+ESxFc!10&NXB?KcZS zMq-7IPjpL0HLY%sFMjrE33Z!CP(FTgh+#>y=AOGobzVnlyHLcS(6{1mCr1c`vkv-x zbgL5#x>Ld9i*g`zl4dKNVeTE0b*d9zVmu_mG^0HFX;Gb|Z`^X#A07_SF) z&IAQX&hV7{U=)G;Y`T5(@MFrU%aVmml72o@Avf~q%yi#KF3AOx#x?$|JVw7{USsKH z3E8tOR@6LgQ079aQj!x9DwzSL{1isl5OddupgYoXLP1B4|N3F^mmW<$l|HYE&#T_n zpwsG@?b^rjb${7ZiaX=?Jx@(13eFX=v^!J#q;hHNKr@LClDtcO`0Vnd1}N$B*@`!^wT=d&fCLI<@7Q8k4#)z1joU1TNkBMwcTC&!c_a$|}&GxZ8Yk zj;UGTOQZO_8qovpt8V_o6JdRAg?o+|^fpAsX`YrewtOi3Du}TxRKWY#yQf`ZPK!2q z_OL4^8i|FGrH0KxHdZ7P)v@s`54uZY552e$bl`H?o{6?^5KnuA?e)~5?+|~}$5!tS zCztZdH}|@y9WFdpd|8V#(L2Iznt+|puT-lv`Z4zb*RcxTG6G)jc3%gr+k=qrGAY$o ztPj5i?<_&|p>+GgC-dpf7}DO$8fq%tNn%vP2!Xv@r6FFz9l*`jzrNbkvwnT zK6J2Du2=Ti7DarZOhuW8@rBfZ`nQi2bFCrT(_^J1E~#?dhfa>1RO9Q=uk$o^mj0@{ z`{wx$tu*jXg1X1eYC+XR?oeM6+xWfPo0r8OP{uP;Ku?f}Uhw@|9M(g$$oEL~MkU1u z0+`4G{8k`ES$Tv^@wXrQY|Esd6*qsSp}NEw_NlYeUBQ&X$S3^q#rjqQ_OwY_i93R6 zIU&zEhOfCVaFp{f76euuAM7`*GYRRH@^sC~?aeMtk$LKw9m0}R>bOnvoRO$oli4?$ z&n^4AorgNO$=#{OVY#1SpH18?^L`RJUvne1E`U_S`UKUvi@ehlbUrwX6kma8A1`5u zCWYqj=M~BS{^jSgr_{C!cX!ON=U+-;=dM#z@6)hbCN=Pj`uymK$e70T!Sn?>+HbrX zOH91Wl9!KZw#Y7oS%((+H=d9RjYhugRPVAcl2$E`c;h|ocV6s7tvjnq((dpXUy7)t zN>jIM0VAfj4jgtTW+vwOStH_Xs~J}p*ctN>{)1XBu;CkX7uzV)(Fc2H;qhR(8Q;~ z?>4S37@X_BLB09~0`xZ$R=(i?(o=7^tBWTB@0ZcLTz)_3FE@Z+(R6=(*#%*X^mf~T zVfC){zdIm9prQPIFWo9iI_f7*3`H9o7y_XKML7LV7x1Y8RE}33v|JP5pepQgL2Y0g zWIG>}l8FF&<7~jU&UPTYqSX$B6!d`R3Ib)L&)8Uf(osF+ zn?Pc3s{%_f>jfa=H~>YL$XB0q)E8R3fHp8yXQ=(k#ACgf+9QPr9s&;<145ylZ}mw> zJpzWt({dY_`d=@=u7{0OqG4(W6QfpQpn+9P@R^Q!0vsPN?C%*99+5R-3qINc+$TU} zbgH@fq@xDG5e0a$jl5S6VqPyW^Z?S~I?!$hus5c5gE_YVDvaG`IoGb(O96Y?0Vlvj zwFiH0D(cETOY3C~n;Wxu4Qyry6o8333Us|Gswj3@hqjk@+5yz#8&J22Z2?sbJF3nF zQrSLWERL0hoj=CP1)G;Ql@*8Ax;%Q2QVLMdgFSTYtB~L`9n~t23sn)Kja|eTc2R8~ z(C`4zuVeaCtuih!9fUFz2}QdT4hfyyxur7z=nXI|NMJ~KK?4`4A zIJzNSJvhNBdPomfXY7L8!|aI2ffjOr#V~`+Pj~Aa*s;qBrfUxX`2~RdhcM)CH{1+c z18(Q);Q~c(HpdQb6kbtW1i-xkIHtzc&2WNiD03P*+TxC2-oS?Bl*aiz2%)>BI2O6=5H>a&#Cm6*sow;&-wL$Px7Idv@Vv)~fxaqM5sCD0wDv^ea{0ey z<6gr>>+CxMmuz+b*YS_LY>@S_ZF)5)=$79C!-8ID?MX)|BDac(mL2Vq*e$L0Y1Zf) zDEuS=7Uea3v^E}``B#P&r&opAfY|lMl^GB^?srQCy8i%DKP3!CI-ma^BlZ?X!_uZ^ zK^Kt)x?mv;K8B09_*Qkc(jtg66oJDd^;Qh+OhP~)z6uLI(^2Lz_>c{~5ipm(`XD^Qqfv2$Q#=+5gp0Mv1{eJs z~7dD2ll*KrB71_q976M;BD;r6iK z$~Azwd%_SaTgTTY5hE_msve;21z-TtUZnw_>8Nuz{|6>;02CYn<3#(-Z*trbH~iDy z_y%BwfQbP5W#rW-9c6jze`dz+`a$|GcOZc3IT#Z#M@aqKTcdJzMXX%iv0j0Pwy85# z0PF?O49pS!P0rS^Jz!8I46l)b@8li{1R-Do!WaF<|LT*D`c&{w9KX$jT}hGZM-FKN zPY?x-K`&&iKIy2&k}Z*_*f`+mT(#mg{FeaqH0ZuD^$#uE611wbC&B@{*yEi+`z3(L z&0vK6HQip3I~|o(u_bH`R~w}BiuzX*Er_cv4s$1Qb*PyFQ<#CC8?!f(ul{E`>@Aup zf0iK!D9~@|V|vv4r~g8M&)CcrRL2*uWx#Ge z7Ra6VlfXAdfe97Xn9%0qdiy_d;Zv@k$*y7zKo$)eCxb!eGPZRx^eD5cR~&QjJQ#xI zFt8#NSWyduhcnjQCq#L>J`Ljt&IJ8)CXXvqKYKM`ZM+GOz4{o_E9oxp0C z(IEHvUup0eY5Ybh6vu#PNQgqh!QaH0|v}4cJ$jnFyL#% zvcrxKF9F36a0bjlL-ofNDSpH2{LbJuN%hzJGN3gr=_F)z{LIF^pDu#jJBwHdg1Z@Iyc0(A_(~T4DdI)c?$hU6qO#)qe53^@~wRcM_e_bDex4)39bhxw#h-^T_?mQW zVh3j_2(2j)%b3<_JFsOYWk-a~-rw zLqI#EK|3%rO!%RHp}?oB(3v-}!oZW+fK@Qd4ca2OIMDF{admNXhM~&=U=j&#^~3JM z)5(WCrGb+2fRfNh3a>uts3r-#=)Wdgzyxlt2uIvChc=xsx9>nXk3a^CITtdL-W*=< z*8v+i3MG1Rk>?@-^Zj5IXF4k32tH_KN2v4KMJnrkMv<;H79DGcK&)|NfV!&U z1N~LsvBj=p7q?SmHK3R11&+dtfk~{17t<5|tD1wO{g9<2m5=O z30E;KDfC)46nL5^(|QFQ*4-Qxy8`C4TA@L}Qt7}_=#vjuACPmK;=^3Y34kNJK;gEy zr;?YspP!5YTHpdkJGcrCKGRW!R$IVF4~^Ib*H_Mx=mw#;afvk&iVyhj(*f6e*x_eV zv@O6B%7H>Kh0V3YhxzN~$lvR?*o9sEwlu2_v{1Gol4~6|1%^P~pw^DgAd9PSHj&#PqV$Ozv5P<{1ZZ!fn6bT>xB;%3+OC2mF=5(V3u*s;K6L99J&_LR4YW3(GJstH$gk6a?|}y5ftO;2?AM?z z5P+(wvoj17PH}ZJv5P`p_d!iI0k{(8pe7vhFZkG{_vRmCBLZ=YUTj;39=!$hwWwYrsr=Ro$qs9b) z$8^UNx3EK_9cJAw-Ss|>_Q2I}*}dkD=x||9-2m$5;fi#%adqAh(|@Dv#X!-=g94o0 z1(eG1qWu|l(K1DC0nHj5N&f2!hV@Nt-+x*hJ?j1h?ZvDP^!y8~CiFDa1ngeNxukn_ zmyRnRFuxN>oRrp-fsSwnaDec-2wzj_sxsEZ*R*w#R7WD+j(WIyc^kT-&soRr)b+&N zbx(j(qsM;CsZ4Ut=6vX@CM3i-HQ;WZV7V2fhA!AyL{Cl^d<86xAQQkW;S?8anMKbN zxe1LhTa{uZ7g$QrUB8A#T)I^n><#$aNB@Km+N&tQ8FHJN#na9X=CQ$5xl_-@$%7$c z8yF%mC*X!#2UYrojjO+v?QO2(25w6N+!li2PH%^{EcXhLYdj@>Hz#U8v01l5b(Kzo?OVKF%0`Jc$J6TDP1SEvNmsbW|^ zU%j%hWdaqrts@l9spN2Bot}Pb!hV6O4pZ!4pg*iZWlWk6*WFkOfjWD_IMILMakFrCt)Yj< zx@a_j{OiFS%hg0SherHLrZ#jSw+4?wz5-d%o02idz3_hk{gbV&*ciKVhHO=zp_4X6 zs`csATgffA;CEK|_uYi+b6%+zue&&aX|Dinajqx~{gICPE{B^2-z)_E?N!xd786b= zY(NC70jDOrluK+||Y5MmBh&G=ycnm~gL9=)j) z=7l4%rcLll^Z>$L1V8-0rTq2pbX2_}_NM+4^e+Zi9Hm>tUH!sWK=vgdJ7#x#K?x7? zx&i>$6pPo#6hwAt)&Tzs=2$}tU)^@`owka zRUGh{j^a1N3j}e1+2DAqLoYI~O&{Q)cWz;pLzpe_VuED^MK{N_R0ey~qih$yp;6zz$8w2O;U6}0X?^=q<_HCi|Cwc&aT!_=d~pO zZ|u71)p>Ro{rb@u7z{9{jlmcGkr6uq!_r&TQDDxupjnuU!kL#hC0MK3+JZ^Sulgc( zlFBpGe4}9YKtr>B&>R8j&AL*-ugv2w3xmoN0tuF)9O3pW3+XuKr;3d(uh7+;a=;>p zVIB79O<6YCf8|U5&a4PvZUd^q+z#NJuw`rr6mA0pCUNa))Wtbh*(-{c@5ohm) z*2`*Nv}a98=#-)*6FVsEG`5n4{}n+JIUw8@@Plbak}P~UE4!Ce(4g3xouObx!wyh8 z!4GC$5djWy!4^xuC0s!UJ74W#wtBcWzb+1VymJQa_60wf`&zgZK}MxTR~OA^(K*Epr^b&P{ervj;Rdsd-#CSn{)o`WP#yW@RMbVa0v&B z$O1o@N!CO@c687U+JlM^Lfa96gu!tYpa9&Old+=z`1PQj>`4K3T*U89Z5u{AWD7}u z90dWvZLnU-y9xw8(@{&CAg#Cqb{|6{VUL3DM>qs@fO>3vBU#}Jr`|~r{~@5biYXr5 zV|+MkyN$7nM?GfeC)zvup<9PBhCpai~zX{Xbm)5g|SA%3~huhQC4M_g|?zZ|K7>;|xm z02Z@vZU2D}_Na#=C>eO*F_jqyP3{~i$n8K>a$$s%H~|qJf$=~x(bc0+z*2g2>$^TD zu;moD4*uFch+VmN+n>3QgCLLt@wFdQR$A=9U}A}{;PiLUW9}3=0d_lKlN7mn&;5pe z$;Ej0UGzrKJ|LVhhHy7G#X>J@u3gfCz3uC7x?W{SN2#)GD(Z%Nuh&=J*54WX2i;=t zR?+{yL3Ta<--_l~1^@M0ZuY*-@X=W9~N%Ge`moS z59@D0`okd)Hh|+d&RR?Ux({i+@zHpz`2gc8_%Dw=FT4@|_iaJzG1lJ}v>e?1pf!@ct2+V literal 0 HcmV?d00001 diff --git a/src/main/java/com/xebialabs/overthere/cifs/CifsConnectionBuilder.java b/src/main/java/com/xebialabs/overthere/cifs/CifsConnectionBuilder.java index e092a7ac..6ef30e49 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/CifsConnectionBuilder.java +++ b/src/main/java/com/xebialabs/overthere/cifs/CifsConnectionBuilder.java @@ -43,33 +43,13 @@ * Builds CIFS connections. */ @Protocol(name = CIFS_PROTOCOL) -public class CifsConnectionBuilder implements OverthereConnectionBuilder { +public class CifsConnectionBuilder extends ConnectionBuilder implements OverthereConnectionBuilder { /** * Name of the protocol handled by this connection builder, i.e. "cifs". */ public static final String CIFS_PROTOCOL = "cifs"; - /** - * See the online documentation - */ - public static final String CONNECTION_TYPE = "connectionType"; - - /** - * See the online documentation - */ - public static final int PORT_DEFAULT_TELNET = 23; - - /** - * See the online documentation - */ - public static final int PORT_DEFAULT_WINRM_HTTP = 5985; - - /** - * See the online documentation - */ - public static final int PORT_DEFAULT_WINRM_HTTPS = 5986; - /** * See the online documentation */ @@ -90,181 +70,6 @@ public class CifsConnectionBuilder implements OverthereConnectionBuilder { */ public static final Map PATH_SHARE_MAPPINGS_DEFAULT = Collections.emptyMap(); - /** - * See the online documentation - */ - public static final String WINRM_ENABLE_HTTPS = "winrmEnableHttps"; - - /** - * See the online documentation - */ - public static final boolean WINRM_ENABLE_HTTPS_DEFAULT = false; - - /** - * See the online documentation - */ - public static final String WINRM_CONTEXT = "winrmContext"; - - /** - * See the online documentation - */ - public static final String WINRM_CONTEXT_DEFAULT = "/wsman"; - - /** - * See the online documentation - */ - public static final String WINRM_ENVELOP_SIZE = "winrmEnvelopSize"; - - /** - * See the online documentation - */ - public static final int WINRM_ENVELOP_SIZE_DEFAULT = 153600; - - /** - * See the online documentation - */ - public static final String WINRM_HTTPS_CERTIFICATE_TRUST_STRATEGY = "winrmHttpsCertificateTrustStrategy"; - - /** - * See the online documentation - */ - public static final WinrmHttpsCertificateTrustStrategy WINRM_HTTPS_CERTIFICATE_TRUST_STRATEGY_DEFAULT = STRICT; - - /** - * See the online documentation - */ - public static final String WINRM_HTTPS_HOSTNAME_VERIFICATION_STRATEGY = "winrmHttpsHostnameVerificationStrategy"; - - /** - * See the online documentation - */ - public static final WinrmHttpsHostnameVerificationStrategy WINRM_HTTPS_HOSTNAME_VERIFICATION_STRATEGY_DEFAULT = BROWSER_COMPATIBLE; - - /** - * See the online documentation - */ - public static final String WINRM_KERBEROS_DEBUG = "winrmKerberosDebug"; - - /** - * See the online documentation - */ - public static final boolean WINRM_KERBEROS_DEBUG_DEFAULT = false; - - /** - * See the online documentation - */ - public static final String WINRM_KERBEROS_TICKET_CACHE = "winrmKerberosTicketCache"; - - /** - * See the online documentation - */ - public static final boolean WINRM_KERBEROS_TICKET_CACHE_DEFAULT = false; - - /** - * See the online documentation - */ - public static final String WINRM_LOCALE = ""; - - /** - * See the online documentation - */ - public static final String WINRM_LOCALE_DEFAULT = "en-US"; - - /** - * See the online documentation - */ - public static final String WINRM_KERBEROS_USE_HTTP_SPN = "winrmKerberosUseHttpSpn"; - - /** - * See the online documentation - */ - public static final boolean WINRM_KERBEROS_USE_HTTP_SPN_DEFAULT = false; - - /** - * See the online documentation - */ - public static final String WINRM_KERBEROS_ADD_PORT_TO_SPN = "winrmKerberosAddPortToSpn"; - - /** - * See the online documentation - */ - public static final boolean WINRM_KERBEROS_ADD_PORT_TO_SPN_DEFAULT = false; - - /** - * See the online documentation - */ - public static final String WINRM_TIMEMOUT = "winrmTimeout"; - - /** - * See the online documentation - */ - public static final String DEFAULT_WINRM_TIMEOUT = "PT60.000S"; - - /** - * See the online documentation - */ - public static final String WINRS_ALLOW_DELEGATE = "winrsAllowDelegate"; - - /** - * See the online documentation - */ - public static final boolean DEFAULT_WINRS_ALLOW_DELEGATE = false; - - /** - * See the online documentation - */ - public static final String WINRS_COMPRESSION = "winrsCompression"; - - /** - * See the online documentation - */ - public static final boolean WINRS_COMPRESSION_DEFAULT = false; - - /** - * See the online documentation - */ - public static final String WINRS_NOECHO = "winrsNoecho"; - - /** - * See the online documentation - */ - public static final boolean WINRS_NOECHO_DEFAULT = false; - - /** - * See the online documentation - */ - public static final String WINRS_NOPROFILE = "winrsNoprofile"; - - /** - * See the online documentation - */ - public static final boolean WINRS_NOPROFILE_DEFAULT = false; - - /** - * See the online documentation - */ - public static final String WINRS_PROXY_PROTOCOL = "winrsProxyProtocol"; - - /** - * See the online documentation - */ - public static final String WINRS_PROXY_PROTOCOL_DEFAULT = LOCAL_PROTOCOL; - - /** - * See the online documentation - */ - public static final String WINRS_PROXY_CONNECTION_OPTIONS = "winrsProxyConnectionOptions"; - - /** - * See the online documentation - */ - public static final String WINRS_UNENCRYPTED = "winrsUnencrypted"; - - /** - * See the online documentation - */ - public static final boolean WINRS_UNENCRYPTED_DEFAULT = false; - private CifsConnection connection; public CifsConnectionBuilder(String type, ConnectionOptions options, AddressPortMapper mapper) { diff --git a/src/main/java/com/xebialabs/overthere/cifs/ConnectionBuilder.java b/src/main/java/com/xebialabs/overthere/cifs/ConnectionBuilder.java new file mode 100644 index 00000000..426e07f5 --- /dev/null +++ b/src/main/java/com/xebialabs/overthere/cifs/ConnectionBuilder.java @@ -0,0 +1,203 @@ +package com.xebialabs.overthere.cifs; + +import static com.xebialabs.overthere.cifs.WinrmHttpsCertificateTrustStrategy.STRICT; +import static com.xebialabs.overthere.cifs.WinrmHttpsHostnameVerificationStrategy.BROWSER_COMPATIBLE; +import static com.xebialabs.overthere.local.LocalConnection.LOCAL_PROTOCOL; + +public abstract class ConnectionBuilder { + + /** + * See the online documentation + */ + public static final String CONNECTION_TYPE = "connectionType"; + + /** + * See the online documentation + */ + public static final int PORT_DEFAULT_TELNET = 23; + + /** + * See the online documentation + */ + public static final int PORT_DEFAULT_WINRM_HTTP = 5985; + + /** + * See the online documentation + */ + public static final int PORT_DEFAULT_WINRM_HTTPS = 5986; + + /** + * See the online documentation + */ + public static final String WINRM_ENABLE_HTTPS = "winrmEnableHttps"; + + /** + * See the online documentation + */ + public static final boolean WINRM_ENABLE_HTTPS_DEFAULT = false; + + /** + * See the online documentation + */ + public static final String WINRM_CONTEXT = "winrmContext"; + + /** + * See the online documentation + */ + public static final String WINRM_CONTEXT_DEFAULT = "/wsman"; + + /** + * See the online documentation + */ + public static final String WINRM_ENVELOP_SIZE = "winrmEnvelopSize"; + + /** + * See the online documentation + */ + public static final int WINRM_ENVELOP_SIZE_DEFAULT = 153600; + + /** + * See the online documentation + */ + public static final String WINRM_HTTPS_CERTIFICATE_TRUST_STRATEGY = "winrmHttpsCertificateTrustStrategy"; + + /** + * See the online documentation + */ + public static final WinrmHttpsCertificateTrustStrategy WINRM_HTTPS_CERTIFICATE_TRUST_STRATEGY_DEFAULT = STRICT; + + /** + * See the online documentation + */ + public static final String WINRM_HTTPS_HOSTNAME_VERIFICATION_STRATEGY = "winrmHttpsHostnameVerificationStrategy"; + + /** + * See the online documentation + */ + public static final WinrmHttpsHostnameVerificationStrategy WINRM_HTTPS_HOSTNAME_VERIFICATION_STRATEGY_DEFAULT = BROWSER_COMPATIBLE; + + /** + * See the online documentation + */ + public static final String WINRM_KERBEROS_DEBUG = "winrmKerberosDebug"; + + /** + * See the online documentation + */ + public static final boolean WINRM_KERBEROS_DEBUG_DEFAULT = false; + + /** + * See the online documentation + */ + public static final String WINRM_KERBEROS_TICKET_CACHE = "winrmKerberosTicketCache"; + + /** + * See the online documentation + */ + public static final boolean WINRM_KERBEROS_TICKET_CACHE_DEFAULT = false; + + /** + * See the online documentation + */ + public static final String WINRM_LOCALE = ""; + + /** + * See the online documentation + */ + public static final String WINRM_LOCALE_DEFAULT = "en-US"; + + /** + * See the online documentation + */ + public static final String WINRM_KERBEROS_USE_HTTP_SPN = "winrmKerberosUseHttpSpn"; + + /** + * See the online documentation + */ + public static final boolean WINRM_KERBEROS_USE_HTTP_SPN_DEFAULT = false; + + /** + * See the online documentation + */ + public static final String WINRM_KERBEROS_ADD_PORT_TO_SPN = "winrmKerberosAddPortToSpn"; + + /** + * See the online documentation + */ + public static final boolean WINRM_KERBEROS_ADD_PORT_TO_SPN_DEFAULT = false; + + /** + * See the online documentation + */ + public static final String WINRM_TIMEMOUT = "winrmTimeout"; + + /** + * See the online documentation + */ + public static final String DEFAULT_WINRM_TIMEOUT = "PT60.000S"; + + /** + * See the online documentation + */ + public static final String WINRS_ALLOW_DELEGATE = "winrsAllowDelegate"; + + /** + * See the online documentation + */ + public static final boolean DEFAULT_WINRS_ALLOW_DELEGATE = false; + + /** + * See the online documentation + */ + public static final String WINRS_COMPRESSION = "winrsCompression"; + + /** + * See the online documentation + */ + public static final boolean WINRS_COMPRESSION_DEFAULT = false; + + /** + * See the online documentation + */ + public static final String WINRS_NOECHO = "winrsNoecho"; + + /** + * See the online documentation + */ + public static final boolean WINRS_NOECHO_DEFAULT = false; + + /** + * See the online documentation + */ + public static final String WINRS_NOPROFILE = "winrsNoprofile"; + + /** + * See the online documentation + */ + public static final boolean WINRS_NOPROFILE_DEFAULT = false; + + /** + * See the online documentation + */ + public static final String WINRS_PROXY_PROTOCOL = "winrsProxyProtocol"; + + /** + * See the online documentation + */ + public static final String WINRS_PROXY_PROTOCOL_DEFAULT = LOCAL_PROTOCOL; + + /** + * See the online documentation + */ + public static final String WINRS_PROXY_CONNECTION_OPTIONS = "winrsProxyConnectionOptions"; + + /** + * See the online documentation + */ + public static final String WINRS_UNENCRYPTED = "winrsUnencrypted"; + + /** + * See the online documentation + */ + public static final boolean WINRS_UNENCRYPTED_DEFAULT = false; +} diff --git a/src/main/java/com/xebialabs/overthere/cifs/telnet/TelnetConnection.java b/src/main/java/com/xebialabs/overthere/cifs/telnet/TelnetConnection.java index cb19efbf..c4820e6f 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/telnet/TelnetConnection.java +++ b/src/main/java/com/xebialabs/overthere/cifs/telnet/TelnetConnection.java @@ -19,7 +19,7 @@ import static java.lang.String.format; import static java.net.InetSocketAddress.createUnresolved; -class TelnetConnection { +public class TelnetConnection { private static final String DETECTABLE_WINDOWS_PROMPT = "TELNET4OVERTHERE "; @@ -38,7 +38,7 @@ class TelnetConnection { private String username; private CifsConnectionType connectionType = CifsConnectionType.TELNET; - TelnetConnection(ConnectionOptions options, AddressPortMapper mapper, OverthereFile workingDirectory) { + public TelnetConnection(ConnectionOptions options, AddressPortMapper mapper, OverthereFile workingDirectory) { String unmappedAddress = options.get(ADDRESS); int unmappedPort = options.get(PORT, connectionType.getDefaultPort(options)); InetSocketAddress addressPort = mapper.map(createUnresolved(unmappedAddress, unmappedPort)); @@ -56,7 +56,7 @@ class TelnetConnection { this.workingDirectory = workingDirectory; } - OverthereProcess startProcess(final CmdLine cmd) { + public OverthereProcess startProcess(final CmdLine cmd) { checkNotNull(cmd, "Cannot execute null command line"); checkArgument(cmd.getArguments().size() > 0, "Cannot execute empty command line"); diff --git a/src/main/java/com/xebialabs/overthere/cifs/winrm/WinRmConnection.java b/src/main/java/com/xebialabs/overthere/cifs/winrm/WinRmConnection.java index 9fb2f93e..80ccf4bd 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/winrm/WinRmConnection.java +++ b/src/main/java/com/xebialabs/overthere/cifs/winrm/WinRmConnection.java @@ -21,7 +21,7 @@ import static java.lang.String.format; import static java.net.InetSocketAddress.createUnresolved; -class WinRmConnection { +public class WinRmConnection { private int connectionTimeoutMillis; private int socketTimeoutMillis; @@ -37,7 +37,7 @@ class WinRmConnection { private final String unmappedAddress; private final int unmappedPort; - WinRmConnection(ConnectionOptions options, AddressPortMapper mapper, OverthereFile workingDirectory) { + public WinRmConnection(ConnectionOptions options, AddressPortMapper mapper, OverthereFile workingDirectory) { this.workingDirectory = workingDirectory; this.options = options; this.mapper = mapper; @@ -56,7 +56,7 @@ class WinRmConnection { } - OverthereProcess startProcess(final CmdLine cmd) { + public OverthereProcess startProcess(final CmdLine cmd) { checkNotNull(cmd, "Cannot execute null command line"); checkArgument(cmd.getArguments().size() > 0, "Cannot execute empty command line"); diff --git a/src/main/java/com/xebialabs/overthere/cifs/winrs/WinrsConnection.java b/src/main/java/com/xebialabs/overthere/cifs/winrs/WinrsConnection.java index f3697468..da1ba2ee 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/winrs/WinrsConnection.java +++ b/src/main/java/com/xebialabs/overthere/cifs/winrs/WinrsConnection.java @@ -17,7 +17,7 @@ import static com.xebialabs.overthere.util.OverthereUtils.closeQuietly; import static java.net.InetSocketAddress.createUnresolved; -class WinrsConnection { +public class WinrsConnection { private OperatingSystemFamily os; private OverthereFile workingDirectory; @@ -30,7 +30,7 @@ class WinrsConnection { private OverthereConnection winrsProxyConnection; - WinrsConnection(ConnectionOptions options, AddressPortMapper mapper, OverthereFile workingDirectory) { + public WinrsConnection(ConnectionOptions options, AddressPortMapper mapper, OverthereFile workingDirectory) { this.workingDirectory = workingDirectory; this.options = options; this.os = options.getEnum(OPERATING_SYSTEM, OperatingSystemFamily.class); @@ -43,11 +43,11 @@ class WinrsConnection { this.password = options.get(PASSWORD); } - OverthereConnection getWinrsProxyConnection() { + public OverthereConnection getWinrsProxyConnection() { return this.winrsProxyConnection; } - OverthereConnection connectToWinrsProxy(ConnectionOptions options) { + public OverthereConnection connectToWinrsProxy(ConnectionOptions options) { logger.debug("Connecting to winrs proxy"); String winrsProxyProtocol = options.get(WINRS_PROXY_PROTOCOL, WINRS_PROXY_PROTOCOL_DEFAULT); @@ -56,13 +56,13 @@ OverthereConnection connectToWinrsProxy(ConnectionOptions options) { return winrsProxyConnection; } - void disconnectFromWinrsProxy() { + public void disconnectFromWinrsProxy() { logger.debug("Disconnecting from winrs proxy"); closeQuietly(winrsProxyConnection); } - OverthereProcess startProcess(final CmdLine cmd) { + public OverthereProcess startProcess(final CmdLine cmd) { checkNotNull(cmd, "Cannot execute null command line"); checkArgument(cmd.getArguments().size() > 0, "Cannot execute empty command line"); diff --git a/src/main/java/com/xebialabs/overthere/smb2/Smb2Connection.java b/src/main/java/com/xebialabs/overthere/smb2/Smb2Connection.java index 27ce7154..ef8009be 100644 --- a/src/main/java/com/xebialabs/overthere/smb2/Smb2Connection.java +++ b/src/main/java/com/xebialabs/overthere/smb2/Smb2Connection.java @@ -10,13 +10,18 @@ import com.xebialabs.overthere.ConnectionOptions; import com.xebialabs.overthere.OverthereFile; import com.xebialabs.overthere.RuntimeIOException; +import com.xebialabs.overthere.cifs.CifsConnectionType; +import com.xebialabs.overthere.proxy.ProxyConnection; import com.xebialabs.overthere.spi.AddressPortMapper; import com.xebialabs.overthere.spi.BaseOverthereConnection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.IOException; import java.net.InetSocketAddress; import static com.xebialabs.overthere.ConnectionOptions.*; +import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.CONNECTION_TYPE; import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.*; import static java.net.InetSocketAddress.createUnresolved; @@ -24,7 +29,7 @@ public class Smb2Connection extends BaseOverthereConnection { private final SMBClient client; private final String hostname; - private final int port; + private final int smbPort; private final String username; private final String password; private final String domain; @@ -32,19 +37,32 @@ public class Smb2Connection extends BaseOverthereConnection { private Connection connection; private Session session; private DiskShare share; + // TODO refactor, backwards compatible connection type for cifs and smb + protected CifsConnectionType cifsConnectionType; + private int port; protected Smb2Connection(String protocol, ConnectionOptions options, AddressPortMapper mapper) { super(protocol, options, mapper, false); + this.cifsConnectionType = options.getEnum(CONNECTION_TYPE, CifsConnectionType.class); + if (mapper instanceof ProxyConnection) { + throw new IllegalArgumentException("Cannot open a smb2:" + cifsConnectionType.toString().toLowerCase() + ": connection through an HTTP proxy"); + } + String unmappedAddress = options.get(ADDRESS); - int unmappedPort = options.getInteger(PORT, PORT_DEFAULT_SMB2); + + int unmappedPort = options.get(PORT, this.cifsConnectionType.getDefaultPort(options)); InetSocketAddress addressPort = mapper.map(createUnresolved(unmappedAddress, unmappedPort)); hostname = addressPort.getHostName(); - port = addressPort.getPort(); + this.port = addressPort.getPort(); + + int unmappedSmbPort = options.getInteger(PORT, PORT_DEFAULT_SMB2); + InetSocketAddress smbAddressPort = mapper.map(createUnresolved(unmappedAddress, unmappedSmbPort)); + port = smbAddressPort.getPort(); + smbPort = smbAddressPort.getPort(); username = options.get(USERNAME); password = options.get(PASSWORD); domain = options.getOptional(DOMAIN); shareName = options.get(SHARE); - client = new SMBClient(new DefaultConfig()); } @@ -81,17 +99,18 @@ protected void doClose() { try { share.close(); } catch (IOException e) { - + logger.warn("Exception while trying to close smb2 share", e); } finally { try { session.close(); } catch (IOException e) { - e.printStackTrace(); + logger.warn("Exception while trying to close smb2 session", e); } finally { + try { connection.close(); } catch (Exception e) { - + logger.warn("Exception while trying to close smb2 connection", e); } } } @@ -99,15 +118,17 @@ protected void doClose() { @Override protected OverthereFile getFileForTempFile(OverthereFile parent, String name) { - return null; + return getFile(parent, name); } @Override public String toString() { - return null; + return "smb:" + cifsConnectionType.toString().toLowerCase() + "://" + username + "@" + hostname + ":" + smbPort + ":" + port; } DiskShare getShare() { return share; } + + private static Logger logger = LoggerFactory.getLogger(Smb2Connection.class); } diff --git a/src/main/java/com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java b/src/main/java/com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java index 74dc6d94..4ad9367a 100644 --- a/src/main/java/com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java +++ b/src/main/java/com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java @@ -2,6 +2,10 @@ import com.xebialabs.overthere.ConnectionOptions; import com.xebialabs.overthere.OverthereConnection; +import com.xebialabs.overthere.cifs.CifsConnectionType; +import com.xebialabs.overthere.cifs.ConnectionBuilder; +import com.xebialabs.overthere.smb2.telnet.Smb2TelnetConnection; +import com.xebialabs.overthere.smb2.winrm.Smb2WinRmConnection; import com.xebialabs.overthere.spi.AddressPortMapper; import com.xebialabs.overthere.spi.OverthereConnectionBuilder; import com.xebialabs.overthere.spi.Protocol; @@ -9,7 +13,7 @@ import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.SMB2_PROTOCOL; @Protocol(name = SMB2_PROTOCOL) -public class Smb2ConnectionBuilder implements OverthereConnectionBuilder { +public class Smb2ConnectionBuilder extends ConnectionBuilder implements OverthereConnectionBuilder { public static final String SMB2_PROTOCOL = "SMB2"; /** @@ -27,7 +31,21 @@ public class Smb2ConnectionBuilder implements OverthereConnectionBuilder { private final Smb2Connection connection; public Smb2ConnectionBuilder(String type, ConnectionOptions options, AddressPortMapper mapper) { - connection = new Smb2Connection(type, options, mapper); + CifsConnectionType cifsConnectionType = options.getEnum(CONNECTION_TYPE, CifsConnectionType.class); + + switch (cifsConnectionType) { + case TELNET: + connection = new Smb2TelnetConnection(type, options, mapper); + break; + case WINRM_INTERNAL: + connection = new Smb2WinRmConnection(type, options, mapper); + break; + case WINRM_NATIVE: + connection = new Smb2WinRmConnection(type, options, mapper); + break; + default: + throw new IllegalArgumentException("Unknown CIFS connection type " + cifsConnectionType); + } } @Override @@ -35,4 +53,9 @@ public OverthereConnection connect() { connection.connect(); return connection; } + + @Override + public String toString() { + return connection.toString(); + } } diff --git a/src/main/java/com/xebialabs/overthere/smb2/Smb2File.java b/src/main/java/com/xebialabs/overthere/smb2/Smb2File.java index a75c05ad..cc1d22fb 100644 --- a/src/main/java/com/xebialabs/overthere/smb2/Smb2File.java +++ b/src/main/java/com/xebialabs/overthere/smb2/Smb2File.java @@ -1,20 +1,31 @@ package com.xebialabs.overthere.smb2; import com.hierynomus.msdtyp.AccessMask; -import com.hierynomus.smbj.share.Directory; +import com.hierynomus.msfscc.FileAttributes; +import com.hierynomus.msfscc.fileinformation.FileInfo; +import com.hierynomus.mssmb2.SMB2CreateDisposition; +import com.hierynomus.smbj.share.DiskShare; import com.hierynomus.smbj.share.File; +import com.hierynomus.smbj.transport.TransportException; import com.xebialabs.overthere.OverthereFile; +import com.xebialabs.overthere.RuntimeIOException; import com.xebialabs.overthere.spi.BaseOverthereFile; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.util.Collections; +import java.util.ArrayList; +import java.util.EnumSet; import java.util.List; +import static java.lang.String.format; + public class Smb2File extends BaseOverthereFile { + private final String hostPath; - private File file; - private Directory directory; + private boolean overWrite; public Smb2File(Smb2Connection connection, String hostPath) { super(connection); @@ -34,7 +45,12 @@ public String getName() { @Override public OverthereFile getParentFile() { - return null; + OverthereFile f = null; + String[] s = hostPath.split("\\\\"); + if (s.length > 1) { + f = getFile(s[hostPath.length() - 1]); + } + return f; } @Override @@ -52,6 +68,11 @@ private boolean checkAccessMask(AccessMask mask) { return AccessMask.EnumUtils.isSet(accessMask, mask); } + private boolean checkAttributes(FileAttributes mask) { + long attrMask = connection.getShare().getFileInformation(hostPath).getFileAttributes(); + return FileAttributes.EnumUtils.isSet(attrMask, mask); + } + @Override public boolean canWrite() { return checkAccessMask(AccessMask.GENERIC_WRITE); @@ -74,7 +95,7 @@ public boolean isDirectory() { @Override public boolean isHidden() { - return false; + return checkAttributes(FileAttributes.FILE_ATTRIBUTE_HIDDEN); } @Override @@ -84,51 +105,191 @@ public long lastModified() { @Override public long length() { - return 0; + return connection.getShare().getFileInformation(hostPath).getFileSize(); } @Override - public InputStream getInputStream() { - return null; + public InputStream getInputStream() throws RuntimeIOException { + logger.debug("Opening SMB2 input stream for {}", hostPath); + try { + final File file = connection.getShare().openFile(hostPath, + EnumSet.of(AccessMask.GENERIC_READ), SMB2CreateDisposition.FILE_OPEN); + try { + final InputStream wrapped = file.getInputStream(); + return asBuffered(new InputStream() { + + @Override + public int read() throws IOException { + return wrapped.read(); + } + + @Override + public int read(byte[] b) throws IOException { + return wrapped.read(b); + } + + @Override + public int read(byte[] b, int off, int len) throws IOException { + return wrapped.read(b, off, len); + } + + @Override + public long skip(long n) throws IOException { + return wrapped.skip(n); + } + + @Override + public int available() throws IOException { + return wrapped.available(); + } + + @Override + public void close() throws IOException { + logger.debug("Closing SMB2 input stream for {}", hostPath); + wrapped.close(); + file.close(); + } + }); + } finally { + file.close(); + } + } catch (TransportException e) { + throw new RuntimeIOException(format("Cannot open %s for reading: %s", hostPath, e.toString()), e); + } } @Override public OutputStream getOutputStream() { - return null; + logger.debug("Opening SMB2 output stream for {}", hostPath); + try { + SMB2CreateDisposition createDisposition = SMB2CreateDisposition.FILE_OVERWRITE_IF; + if (!overWrite) createDisposition = SMB2CreateDisposition.FILE_CREATE; + final File file = connection.getShare().openFile(hostPath, + EnumSet.of(AccessMask.GENERIC_READ), createDisposition); + + try { + final OutputStream wrapped = file.getOutputStream(); + + return asBuffered(new OutputStream() { + + @Override + public void write(int b) throws IOException { + wrapped.write(b); + } + + @Override + public void write(byte[] b, int off, int len) throws IOException { + wrapped.write(b, off, len); + } + + @Override + public void write(byte[] b) throws IOException { + wrapped.write(b); + } + + @Override + public void flush() throws IOException { + wrapped.flush(); + } + + @Override + public void close() throws IOException { + logger.debug("Closing SMB2 output stream for {}", hostPath); + wrapped.close(); + } + }); + } finally { + file.close(); + } + } catch (TransportException e) { + throw new RuntimeIOException(format("Cannot open %s for writing: %s", hostPath, e.toString()), e); + } } @Override public void setExecutable(boolean executable) { - + // the execute permission does not exist on Windows } @Override public void delete() { + try { + DiskShare share = connection.getShare(); + if (isFile()) { + logger.debug("deleting file {}", hostPath); + share.rm(hostPath); + } else { + logger.debug("deleting directory {}", hostPath); + share.rmdir(hostPath, true); + } + } catch (TransportException e) { + throw new RuntimeIOException(format("Cannot delete %s: %s", hostPath, e.toString()), e); + } + } + @Override + public void deleteRecursively() { + logger.debug("deleting directory recursively {}", hostPath); + try { + connection.getShare().rmdir(hostPath, true); + } catch (TransportException e) { + throw new RuntimeIOException(format("Cannot delete recursively %s: %s", hostPath, e.toString()), e); + } } @Override public List listFiles() { - return Collections.emptyList(); + logger.debug("Listing directory {}", hostPath); + try { + List files = new ArrayList(); + for (FileInfo info : connection.getShare().list(hostPath)) { + files.add(getFile(info.getFileName())); + } + return files; + } catch (TransportException e) { + throw new RuntimeIOException(format("Cannot list directory %s: %s", hostPath, e.toString()), e); + } } @Override public void mkdir() { - + logger.debug("Creating directory {}", hostPath); + try { + connection.getShare().mkdir(hostPath); + } catch (TransportException e) { + throw new RuntimeIOException(format("Cannot create directory %s: %s", hostPath, e.toString()), e); + } } @Override public void mkdirs() { - + logger.debug("Creating directories {}", hostPath); + mkdir(); } @Override public void renameTo(OverthereFile dest) { + throw new RuntimeException("Operation not supported"); + } + + @Override + public boolean equals(Object that) { + if (!(that instanceof Smb2File)) { + return false; + } + return getPath().equals(((Smb2File) that).getPath()); + } + + @Override + public int hashCode() { + return getPath().hashCode(); } @Override public String toString() { - return null; + return getConnection() + "/" + getPath(); } + + private static Logger logger = LoggerFactory.getLogger(Smb2File.class); } diff --git a/src/main/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnection.java b/src/main/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnection.java new file mode 100644 index 00000000..c10f74fe --- /dev/null +++ b/src/main/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnection.java @@ -0,0 +1,67 @@ +/** + * Copyright (c) 2008-2016, XebiaLabs B.V., All rights reserved. + * + * + * Overthere is licensed under the terms of the GPLv2 + * , like most XebiaLabs Libraries. + * There are special exceptions to the terms and conditions of the GPLv2 as it is applied to + * this software, see the FLOSS License Exception + * . + * + * This program is free software; you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation; version 2 + * of the License. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth + * Floor, Boston, MA 02110-1301 USA + */ +package com.xebialabs.overthere.smb2.telnet; + +import com.xebialabs.overthere.*; +import com.xebialabs.overthere.cifs.telnet.TelnetConnection; +import com.xebialabs.overthere.smb2.Smb2Connection; +import com.xebialabs.overthere.spi.AddressPortMapper; + +import static com.xebialabs.overthere.util.OverthereUtils.checkArgument; +import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.SMB2_PROTOCOL; +import static com.xebialabs.overthere.OperatingSystemFamily.WINDOWS; + + +/** + * A connection to a Windows host using SMB2 and Telnet. + *

    + * Limitations: + *

      + *
    • Windows Telnet Service must be configured to use stream mode:
      + * > tlntadmn config mode=stream
    • + *
    • Not tested with domain accounts.
    • + *
    + */ +public class Smb2TelnetConnection extends Smb2Connection { + + /** + * Creates a {@link Smb2TelnetConnection}. Don't invoke directly. Use + * {@link Overthere#getConnection(String, ConnectionOptions)} instead. + */ + public Smb2TelnetConnection(String type, ConnectionOptions options, AddressPortMapper mapper) { + super(type, options, mapper); + checkArgument(os == WINDOWS, "Cannot create a " + SMB2_PROTOCOL + ":%s connection to a host that is not running Windows", cifsConnectionType.toString().toLowerCase()); + connected(); + } + + @Override + public void connect() { + connected(); + } + + @Override + public OverthereProcess startProcess(final CmdLine cmd) { + TelnetConnection connection = new TelnetConnection(options, mapper, workingDirectory); + return connection.startProcess(cmd); + } +} diff --git a/src/main/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnection.java b/src/main/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnection.java new file mode 100644 index 00000000..9d77a9a6 --- /dev/null +++ b/src/main/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnection.java @@ -0,0 +1,63 @@ +/** + * Copyright (c) 2008-2016, XebiaLabs B.V., All rights reserved. + * + * + * Overthere is licensed under the terms of the GPLv2 + * , like most XebiaLabs Libraries. + * There are special exceptions to the terms and conditions of the GPLv2 as it is applied to + * this software, see the FLOSS License Exception + * . + * + * This program is free software; you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation; version 2 + * of the License. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth + * Floor, Boston, MA 02110-1301 USA + */ +package com.xebialabs.overthere.smb2.winrm; + +import com.xebialabs.overthere.CmdLine; +import com.xebialabs.overthere.ConnectionOptions; +import com.xebialabs.overthere.Overthere; +import com.xebialabs.overthere.OverthereProcess; +import com.xebialabs.overthere.cifs.CifsConnection; +import com.xebialabs.overthere.cifs.winrm.WinRmConnection; +import com.xebialabs.overthere.smb2.Smb2Connection; +import com.xebialabs.overthere.spi.AddressPortMapper; + +import static com.xebialabs.overthere.util.OverthereUtils.checkArgument; +import static com.xebialabs.overthere.OperatingSystemFamily.WINDOWS; +import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.CIFS_PROTOCOL; + +/** + * A connection to a Windows host using SMB2 and a Java implementation of WinRM. + */ +public class Smb2WinRmConnection extends Smb2Connection { + + /** + * Creates a {@link Smb2WinRmConnection}. Don't invoke directly. Use + * {@link Overthere#getConnection(String, ConnectionOptions)} instead. + */ + public Smb2WinRmConnection(String type, ConnectionOptions options, AddressPortMapper mapper) { + super(type, options, mapper); + checkArgument(os == WINDOWS, "Cannot create a " + CIFS_PROTOCOL + ":%s connection to a host that is not running Windows", cifsConnectionType.toString().toLowerCase()); + } + + @Override + public void connect() { + connected(); + } + + @Override + public OverthereProcess startProcess(final CmdLine cmd) { + WinRmConnection connection = new WinRmConnection(options, mapper, workingDirectory); + return connection.startProcess(cmd); + } + +} diff --git a/src/main/java/com/xebialabs/overthere/smb2/winrs/Smb2WinrsConnection.java b/src/main/java/com/xebialabs/overthere/smb2/winrs/Smb2WinrsConnection.java new file mode 100644 index 00000000..fedcf22d --- /dev/null +++ b/src/main/java/com/xebialabs/overthere/smb2/winrs/Smb2WinrsConnection.java @@ -0,0 +1,75 @@ +/** + * Copyright (c) 2008-2016, XebiaLabs B.V., All rights reserved. + * + * + * Overthere is licensed under the terms of the GPLv2 + * , like most XebiaLabs Libraries. + * There are special exceptions to the terms and conditions of the GPLv2 as it is applied to + * this software, see the FLOSS License Exception + * . + * + * This program is free software; you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation; version 2 + * of the License. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth + * Floor, Boston, MA 02110-1301 USA + */ +package com.xebialabs.overthere.cmb2.winrs; + +import com.xebialabs.overthere.*; +import com.xebialabs.overthere.cifs.CifsConnection; +import com.xebialabs.overthere.cifs.winrs.WinrsConnection; +import com.xebialabs.overthere.smb2.Smb2Connection; +import com.xebialabs.overthere.spi.AddressPortMapper; +import com.xebialabs.overthere.util.DefaultAddressPortMapper; + +import static com.xebialabs.overthere.OperatingSystemFamily.WINDOWS; +import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.*; +import static com.xebialabs.overthere.util.OverthereUtils.*; +import static java.lang.String.format; + +/** + * A connection to a Windows host using SMB2 and the Windows native implementation of WinRM, i.e. the winrs command. + */ +public class Smb2WinrsConnection extends Smb2Connection { + + private WinrsConnection connection; + + private ConnectionOptions options; + + public Smb2WinrsConnection(String type, ConnectionOptions options, AddressPortMapper mapper) { + super(type, options, mapper); + checkArgument(os == WINDOWS, "Cannot create a " + CIFS_PROTOCOL + ":%s connection to a machine that is not running Windows", cifsConnectionType.toString().toLowerCase()); + checkArgument(mapper instanceof DefaultAddressPortMapper, "Cannot create a " + CIFS_PROTOCOL + ":%s connection when connecting through a SSH jumpstation", cifsConnectionType.toString().toLowerCase()); + this.options = options; + } + + @Override + public void connect() { + connection = new WinrsConnection(options, mapper, workingDirectory); + connection.connectToWinrsProxy(options); + + if (connection.getWinrsProxyConnection().getHostOperatingSystem() != WINDOWS) { + connection.disconnectFromWinrsProxy(); + throw new IllegalArgumentException(format("Cannot create a " + CIFS_PROTOCOL + ":%s connection with a winrs proxy that is not running Windows", cifsConnectionType.toString().toLowerCase())); + } + + connected(); + } + + @Override + public void doClose() { + connection.disconnectFromWinrsProxy(); + } + + @Override + public OverthereProcess startProcess(final CmdLine cmd) { + return connection.startProcess(cmd); + } +} From e7612c9a74e7c71573aade12e1a504fb06941895 Mon Sep 17 00:00:00 2001 From: Aditya Kalia Date: Mon, 8 Aug 2016 14:53:05 +0530 Subject: [PATCH 04/40] Implementing test cases --- build.gradle | 1 + .../overthere/cifs/CifsConnectionBuilder.java | 3 - .../overthere/cifs/ConnectionBuilder.java | 22 +++++ .../overthere/cifs/ConnectionValidator.java | 55 ++++++++++++ .../cifs/telnet/CifsTelnetConnection.java | 8 +- .../cifs/telnet/TelnetConnection.java | 22 +++++ .../cifs/winrm/CifsWinRmConnection.java | 8 +- .../overthere/cifs/winrm/WinRmConnection.java | 22 +++++ .../cifs/winrs/CifsWinrsConnection.java | 10 +-- .../overthere/cifs/winrs/WinrsConnection.java | 22 +++++ .../overthere/smb2/Smb2Connection.java | 37 ++++++-- .../overthere/smb2/Smb2ConnectionBuilder.java | 31 ++++++- .../xebialabs/overthere/smb2/Smb2File.java | 23 ++++- .../smb2/telnet/Smb2TelnetConnection.java | 8 +- .../smb2/winrm/Smb2WinRmConnection.java | 11 ++- .../smb2/winrs/Smb2WinrsConnection.java | 17 ++-- .../overthere/smb2/Smb2FileTest.java | 80 +++++++++++++++++ .../smb2/telnet/Smb2TelnetConnectionTest.java | 76 +++++++++++++++++ ...ConnectionWithAdministrativeUserItest.java | 68 +++++++++++++++ ...2TelnetConnectionWithRegularUserItest.java | 73 ++++++++++++++++ ...onOverHttpWithAdministrativeUserItest.java | 45 ++++++++++ ...nOverHttpsWithAdministrativeUserItest.java | 46 ++++++++++ .../smb2/winrm/Smb2WinRmConnectionTest.java | 77 +++++++++++++++++ .../smb2/winrs/Smb2WinRsConnectionTest.java | 85 +++++++++++++++++++ 24 files changed, 802 insertions(+), 48 deletions(-) create mode 100644 src/main/java/com/xebialabs/overthere/cifs/ConnectionValidator.java create mode 100644 src/test/java/com/xebialabs/overthere/smb2/Smb2FileTest.java create mode 100644 src/test/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnectionTest.java create mode 100644 src/test/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnectionWithAdministrativeUserItest.java create mode 100644 src/test/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnectionWithRegularUserItest.java create mode 100644 src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpWithAdministrativeUserItest.java create mode 100644 src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpsWithAdministrativeUserItest.java create mode 100644 src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionTest.java create mode 100644 src/test/java/com/xebialabs/overthere/smb2/winrs/Smb2WinRsConnectionTest.java diff --git a/build.gradle b/build.gradle index 52e4d496..728a54cc 100644 --- a/build.gradle +++ b/build.gradle @@ -62,6 +62,7 @@ dependencies { // SMB2/3 compile files('libs/smbj-0.0.4-dev.jar') + compile 'net.engio:mbassador:1.2.4.2' // Telnet compile 'commons-net:commons-net:3.3' diff --git a/src/main/java/com/xebialabs/overthere/cifs/CifsConnectionBuilder.java b/src/main/java/com/xebialabs/overthere/cifs/CifsConnectionBuilder.java index 6ef30e49..08275e70 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/CifsConnectionBuilder.java +++ b/src/main/java/com/xebialabs/overthere/cifs/CifsConnectionBuilder.java @@ -35,9 +35,6 @@ import com.xebialabs.overthere.spi.Protocol; import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.CIFS_PROTOCOL; -import static com.xebialabs.overthere.cifs.WinrmHttpsCertificateTrustStrategy.STRICT; -import static com.xebialabs.overthere.cifs.WinrmHttpsHostnameVerificationStrategy.BROWSER_COMPATIBLE; -import static com.xebialabs.overthere.local.LocalConnection.LOCAL_PROTOCOL; /** * Builds CIFS connections. diff --git a/src/main/java/com/xebialabs/overthere/cifs/ConnectionBuilder.java b/src/main/java/com/xebialabs/overthere/cifs/ConnectionBuilder.java index 426e07f5..a3205ef3 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/ConnectionBuilder.java +++ b/src/main/java/com/xebialabs/overthere/cifs/ConnectionBuilder.java @@ -1,3 +1,25 @@ +/** + * Copyright (c) 2008-2016, XebiaLabs B.V., All rights reserved. + * + * + * Overthere is licensed under the terms of the GPLv2 + * , like most XebiaLabs Libraries. + * There are special exceptions to the terms and conditions of the GPLv2 as it is applied to + * this software, see the FLOSS License Exception + * . + * + * This program is free software; you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation; version 2 + * of the License. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth + * Floor, Boston, MA 02110-1301 USA + */ package com.xebialabs.overthere.cifs; import static com.xebialabs.overthere.cifs.WinrmHttpsCertificateTrustStrategy.STRICT; diff --git a/src/main/java/com/xebialabs/overthere/cifs/ConnectionValidator.java b/src/main/java/com/xebialabs/overthere/cifs/ConnectionValidator.java new file mode 100644 index 00000000..e82b25f0 --- /dev/null +++ b/src/main/java/com/xebialabs/overthere/cifs/ConnectionValidator.java @@ -0,0 +1,55 @@ +/** + * Copyright (c) 2008-2016, XebiaLabs B.V., All rights reserved. + * + * + * Overthere is licensed under the terms of the GPLv2 + * , like most XebiaLabs Libraries. + * There are special exceptions to the terms and conditions of the GPLv2 as it is applied to + * this software, see the FLOSS License Exception + * . + * + * This program is free software; you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation; version 2 + * of the License. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth + * Floor, Boston, MA 02110-1301 USA + */ +package com.xebialabs.overthere.cifs; + +import com.xebialabs.overthere.OperatingSystemFamily; +import com.xebialabs.overthere.spi.AddressPortMapper; +import com.xebialabs.overthere.util.DefaultAddressPortMapper; + +import static com.xebialabs.overthere.OperatingSystemFamily.WINDOWS; +import static com.xebialabs.overthere.util.OverthereUtils.checkArgument; + +public abstract class ConnectionValidator { + + public static void assertIsWindowsHost(OperatingSystemFamily os, String protocol, CifsConnectionType connectionType) { + checkArgument(os == WINDOWS, "Cannot create a " + protocol + ":%s connection to a host that is not running Windows", connectionType.toString().toLowerCase()); + } + + public static void assertNotNewStyleWindowsDomain(String username, String protocol, CifsConnectionType connectionType) { + checkArgument(!username.contains("@"), "Cannot create a " + protocol + ":%s connection with a new-style Windows domain account [%s], use DOMAIN\\USER instead.", connectionType.toString().toLowerCase(), username); + } + + public static void assertNotOldStyleWindowsDomain(String username, String protocol, CifsConnectionType connectionType) { + checkArgument(!username.contains("\\"), "Cannot create a " + protocol + ":%s connection with an old-style Windows domain account [%s], use USER@DOMAIN instead.", connectionType.toString().toLowerCase(), username); + } + + public static void assetNotThroughJumpstation(AddressPortMapper mapper, String protocol, CifsConnectionType connectionType) { + checkArgument(mapper instanceof DefaultAddressPortMapper, "Cannot create a " + protocol + ":%s connection when connecting through a SSH jumpstation", connectionType.toString().toLowerCase()); + + } + + public static void assertNoSingleQuoteInPassword(String password, String protocol, CifsConnectionType connectionType) { + checkArgument(password.indexOf('\'') == -1 && password.indexOf('\"') == -1, "Cannot create a " + protocol + ":%s connection with a password that contains a single quote (\') or a double quote (\")", connectionType.toString().toLowerCase()); + } +} + diff --git a/src/main/java/com/xebialabs/overthere/cifs/telnet/CifsTelnetConnection.java b/src/main/java/com/xebialabs/overthere/cifs/telnet/CifsTelnetConnection.java index 2b98bf0a..71d37006 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/telnet/CifsTelnetConnection.java +++ b/src/main/java/com/xebialabs/overthere/cifs/telnet/CifsTelnetConnection.java @@ -24,11 +24,10 @@ import com.xebialabs.overthere.*; import com.xebialabs.overthere.cifs.CifsConnection; +import com.xebialabs.overthere.cifs.ConnectionValidator; import com.xebialabs.overthere.spi.AddressPortMapper; -import static com.xebialabs.overthere.util.OverthereUtils.checkArgument; import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.CIFS_PROTOCOL; -import static com.xebialabs.overthere.OperatingSystemFamily.WINDOWS; /** @@ -51,9 +50,8 @@ public class CifsTelnetConnection extends CifsConnection { */ public CifsTelnetConnection(String type, ConnectionOptions options, AddressPortMapper mapper) { super(type, options, mapper, true); - checkArgument(os == WINDOWS, "Cannot create a " + CIFS_PROTOCOL + ":%s connection to a host that is not running Windows", cifsConnectionType.toString().toLowerCase()); - checkArgument(!username.contains("@"), "Cannot create a " + CIFS_PROTOCOL + ":%s connection with a new-style Windows domain account [%s], use DOMAIN\\USER instead.", cifsConnectionType.toString().toLowerCase(), username); - + ConnectionValidator.assertIsWindowsHost(os, CIFS_PROTOCOL, cifsConnectionType); + ConnectionValidator.assertNotNewStyleWindowsDomain(username, CIFS_PROTOCOL, cifsConnectionType); // Make sure that we're properly cleaned up by setting the connected state. connected(); } diff --git a/src/main/java/com/xebialabs/overthere/cifs/telnet/TelnetConnection.java b/src/main/java/com/xebialabs/overthere/cifs/telnet/TelnetConnection.java index c4820e6f..3a0ec2a0 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/telnet/TelnetConnection.java +++ b/src/main/java/com/xebialabs/overthere/cifs/telnet/TelnetConnection.java @@ -1,3 +1,25 @@ +/** + * Copyright (c) 2008-2016, XebiaLabs B.V., All rights reserved. + * + * + * Overthere is licensed under the terms of the GPLv2 + * , like most XebiaLabs Libraries. + * There are special exceptions to the terms and conditions of the GPLv2 as it is applied to + * this software, see the FLOSS License Exception + * . + * + * This program is free software; you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation; version 2 + * of the License. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth + * Floor, Boston, MA 02110-1301 USA + */ package com.xebialabs.overthere.cifs.telnet; import com.xebialabs.overthere.*; diff --git a/src/main/java/com/xebialabs/overthere/cifs/winrm/CifsWinRmConnection.java b/src/main/java/com/xebialabs/overthere/cifs/winrm/CifsWinRmConnection.java index c59ede65..c44f2a44 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/winrm/CifsWinRmConnection.java +++ b/src/main/java/com/xebialabs/overthere/cifs/winrm/CifsWinRmConnection.java @@ -27,10 +27,9 @@ import com.xebialabs.overthere.Overthere; import com.xebialabs.overthere.OverthereProcess; import com.xebialabs.overthere.cifs.CifsConnection; +import com.xebialabs.overthere.cifs.ConnectionValidator; import com.xebialabs.overthere.spi.AddressPortMapper; -import static com.xebialabs.overthere.util.OverthereUtils.checkArgument; -import static com.xebialabs.overthere.OperatingSystemFamily.WINDOWS; import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.CIFS_PROTOCOL; /** @@ -46,9 +45,8 @@ public class CifsWinRmConnection extends CifsConnection { */ public CifsWinRmConnection(String type, ConnectionOptions options, AddressPortMapper mapper) { super(type, options, mapper, true); - checkArgument(os == WINDOWS, "Cannot create a " + CIFS_PROTOCOL + ":%s connection to a host that is not running Windows", cifsConnectionType.toString().toLowerCase()); - checkArgument(!username.contains("\\"), "Cannot create a " + CIFS_PROTOCOL + ":%s connection with an old-style Windows domain account [%s], use USER@DOMAIN instead.", cifsConnectionType.toString().toLowerCase(), username); - + ConnectionValidator.assertIsWindowsHost(os, CIFS_PROTOCOL, cifsConnectionType); + ConnectionValidator.assertNotOldStyleWindowsDomain(username, CIFS_PROTOCOL, cifsConnectionType); } @Override diff --git a/src/main/java/com/xebialabs/overthere/cifs/winrm/WinRmConnection.java b/src/main/java/com/xebialabs/overthere/cifs/winrm/WinRmConnection.java index 80ccf4bd..3a599834 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/winrm/WinRmConnection.java +++ b/src/main/java/com/xebialabs/overthere/cifs/winrm/WinRmConnection.java @@ -1,3 +1,25 @@ +/** + * Copyright (c) 2008-2016, XebiaLabs B.V., All rights reserved. + * + * + * Overthere is licensed under the terms of the GPLv2 + * , like most XebiaLabs Libraries. + * There are special exceptions to the terms and conditions of the GPLv2 as it is applied to + * this software, see the FLOSS License Exception + * . + * + * This program is free software; you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation; version 2 + * of the License. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth + * Floor, Boston, MA 02110-1301 USA + */ package com.xebialabs.overthere.cifs.winrm; import com.xebialabs.overthere.*; diff --git a/src/main/java/com/xebialabs/overthere/cifs/winrs/CifsWinrsConnection.java b/src/main/java/com/xebialabs/overthere/cifs/winrs/CifsWinrsConnection.java index 4917893f..5574bd4e 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/winrs/CifsWinrsConnection.java +++ b/src/main/java/com/xebialabs/overthere/cifs/winrs/CifsWinrsConnection.java @@ -24,12 +24,11 @@ import com.xebialabs.overthere.*; import com.xebialabs.overthere.cifs.CifsConnection; +import com.xebialabs.overthere.cifs.ConnectionValidator; import com.xebialabs.overthere.spi.AddressPortMapper; -import com.xebialabs.overthere.util.DefaultAddressPortMapper; import static com.xebialabs.overthere.OperatingSystemFamily.WINDOWS; import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.*; -import static com.xebialabs.overthere.util.OverthereUtils.*; import static java.lang.String.format; /** @@ -43,10 +42,9 @@ public class CifsWinrsConnection extends CifsConnection { public CifsWinrsConnection(String type, ConnectionOptions options, AddressPortMapper mapper) { super(type, options, mapper, true); - checkArgument(os == WINDOWS, "Cannot create a " + CIFS_PROTOCOL + ":%s connection to a machine that is not running Windows", cifsConnectionType.toString().toLowerCase()); - checkArgument(mapper instanceof DefaultAddressPortMapper, "Cannot create a " + CIFS_PROTOCOL + ":%s connection when connecting through a SSH jumpstation", cifsConnectionType.toString().toLowerCase()); - checkArgument(password.indexOf('\'') == -1 && password.indexOf('\"') == -1, "Cannot create a " + CIFS_PROTOCOL + ":%s connection with a password that contains a single quote (\') or a double quote (\")", cifsConnectionType.toString().toLowerCase()); - + ConnectionValidator.assertIsWindowsHost(os, CIFS_PROTOCOL, cifsConnectionType); + ConnectionValidator.assetNotThroughJumpstation(mapper, CIFS_PROTOCOL, cifsConnectionType); + ConnectionValidator.assertNoSingleQuoteInPassword(password, CIFS_PROTOCOL, cifsConnectionType); this.options = options; } diff --git a/src/main/java/com/xebialabs/overthere/cifs/winrs/WinrsConnection.java b/src/main/java/com/xebialabs/overthere/cifs/winrs/WinrsConnection.java index da1ba2ee..92a7ea58 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/winrs/WinrsConnection.java +++ b/src/main/java/com/xebialabs/overthere/cifs/winrs/WinrsConnection.java @@ -1,3 +1,25 @@ +/** + * Copyright (c) 2008-2016, XebiaLabs B.V., All rights reserved. + * + * + * Overthere is licensed under the terms of the GPLv2 + * , like most XebiaLabs Libraries. + * There are special exceptions to the terms and conditions of the GPLv2 as it is applied to + * this software, see the FLOSS License Exception + * . + * + * This program is free software; you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation; version 2 + * of the License. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth + * Floor, Boston, MA 02110-1301 USA + */ package com.xebialabs.overthere.cifs.winrs; import com.xebialabs.overthere.*; diff --git a/src/main/java/com/xebialabs/overthere/smb2/Smb2Connection.java b/src/main/java/com/xebialabs/overthere/smb2/Smb2Connection.java index ef8009be..b77dc89a 100644 --- a/src/main/java/com/xebialabs/overthere/smb2/Smb2Connection.java +++ b/src/main/java/com/xebialabs/overthere/smb2/Smb2Connection.java @@ -1,3 +1,25 @@ +/** + * Copyright (c) 2008-2016, XebiaLabs B.V., All rights reserved. + * + * + * Overthere is licensed under the terms of the GPLv2 + * , like most XebiaLabs Libraries. + * There are special exceptions to the terms and conditions of the GPLv2 as it is applied to + * this software, see the FLOSS License Exception + * . + * + * This program is free software; you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation; version 2 + * of the License. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth + * Floor, Boston, MA 02110-1301 USA + */ package com.xebialabs.overthere.smb2; import com.hierynomus.smbj.DefaultConfig; @@ -30,19 +52,19 @@ public class Smb2Connection extends BaseOverthereConnection { private final SMBClient client; private final String hostname; private final int smbPort; - private final String username; - private final String password; private final String domain; private final String shareName; private Connection connection; private Session session; private DiskShare share; - // TODO refactor, backwards compatible connection type for cifs and smb + protected final String password; + protected CifsConnectionType cifsConnectionType; + protected final String username; private int port; - protected Smb2Connection(String protocol, ConnectionOptions options, AddressPortMapper mapper) { - super(protocol, options, mapper, false); + protected Smb2Connection(String protocol, ConnectionOptions options, AddressPortMapper mapper, boolean canStartProcess) { + super(protocol, options, mapper, canStartProcess); this.cifsConnectionType = options.getEnum(CONNECTION_TYPE, CifsConnectionType.class); if (mapper instanceof ProxyConnection) { throw new IllegalArgumentException("Cannot open a smb2:" + cifsConnectionType.toString().toLowerCase() + ": connection through an HTTP proxy"); @@ -53,11 +75,10 @@ protected Smb2Connection(String protocol, ConnectionOptions options, AddressPort int unmappedPort = options.get(PORT, this.cifsConnectionType.getDefaultPort(options)); InetSocketAddress addressPort = mapper.map(createUnresolved(unmappedAddress, unmappedPort)); hostname = addressPort.getHostName(); - this.port = addressPort.getPort(); + port = addressPort.getPort(); - int unmappedSmbPort = options.getInteger(PORT, PORT_DEFAULT_SMB2); + int unmappedSmbPort = options.getInteger(SMB2_PORT, PORT_DEFAULT_SMB2); InetSocketAddress smbAddressPort = mapper.map(createUnresolved(unmappedAddress, unmappedSmbPort)); - port = smbAddressPort.getPort(); smbPort = smbAddressPort.getPort(); username = options.get(USERNAME); password = options.get(PASSWORD); diff --git a/src/main/java/com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java b/src/main/java/com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java index 4ad9367a..2194fc5d 100644 --- a/src/main/java/com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java +++ b/src/main/java/com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java @@ -1,11 +1,37 @@ +/** + * Copyright (c) 2008-2016, XebiaLabs B.V., All rights reserved. + * + * + * Overthere is licensed under the terms of the GPLv2 + * , like most XebiaLabs Libraries. + * There are special exceptions to the terms and conditions of the GPLv2 as it is applied to + * this software, see the FLOSS License Exception + * . + * + * This program is free software; you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation; version 2 + * of the License. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth + * Floor, Boston, MA 02110-1301 USA + */ package com.xebialabs.overthere.smb2; import com.xebialabs.overthere.ConnectionOptions; import com.xebialabs.overthere.OverthereConnection; import com.xebialabs.overthere.cifs.CifsConnectionType; import com.xebialabs.overthere.cifs.ConnectionBuilder; +import com.xebialabs.overthere.cifs.telnet.CifsTelnetConnection; +import com.xebialabs.overthere.cifs.winrm.CifsWinRmConnection; +import com.xebialabs.overthere.cifs.winrs.CifsWinrsConnection; import com.xebialabs.overthere.smb2.telnet.Smb2TelnetConnection; import com.xebialabs.overthere.smb2.winrm.Smb2WinRmConnection; +import com.xebialabs.overthere.smb2.winrs.Smb2WinrsConnection; import com.xebialabs.overthere.spi.AddressPortMapper; import com.xebialabs.overthere.spi.OverthereConnectionBuilder; import com.xebialabs.overthere.spi.Protocol; @@ -14,6 +40,7 @@ @Protocol(name = SMB2_PROTOCOL) public class Smb2ConnectionBuilder extends ConnectionBuilder implements OverthereConnectionBuilder { + public static final String SMB2_PROTOCOL = "SMB2"; /** @@ -21,6 +48,8 @@ public class Smb2ConnectionBuilder extends ConnectionBuilder implements Overther */ public static final int PORT_DEFAULT_SMB2 = 445; + public static final String SMB2_PORT = "cifsPort"; + /** * The Windows Domain to authenticate the user against. If not set, bla bla bla */ @@ -41,7 +70,7 @@ public Smb2ConnectionBuilder(String type, ConnectionOptions options, AddressPort connection = new Smb2WinRmConnection(type, options, mapper); break; case WINRM_NATIVE: - connection = new Smb2WinRmConnection(type, options, mapper); + connection = new Smb2WinrsConnection(type, options, mapper); break; default: throw new IllegalArgumentException("Unknown CIFS connection type " + cifsConnectionType); diff --git a/src/main/java/com/xebialabs/overthere/smb2/Smb2File.java b/src/main/java/com/xebialabs/overthere/smb2/Smb2File.java index cc1d22fb..0d09a133 100644 --- a/src/main/java/com/xebialabs/overthere/smb2/Smb2File.java +++ b/src/main/java/com/xebialabs/overthere/smb2/Smb2File.java @@ -1,3 +1,25 @@ +/** + * Copyright (c) 2008-2016, XebiaLabs B.V., All rights reserved. + * + * + * Overthere is licensed under the terms of the GPLv2 + * , like most XebiaLabs Libraries. + * There are special exceptions to the terms and conditions of the GPLv2 as it is applied to + * this software, see the FLOSS License Exception + * . + * + * This program is free software; you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation; version 2 + * of the License. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth + * Floor, Boston, MA 02110-1301 USA + */ package com.xebialabs.overthere.smb2; import com.hierynomus.msdtyp.AccessMask; @@ -147,7 +169,6 @@ public int available() throws IOException { public void close() throws IOException { logger.debug("Closing SMB2 input stream for {}", hostPath); wrapped.close(); - file.close(); } }); } finally { diff --git a/src/main/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnection.java b/src/main/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnection.java index c10f74fe..6d795d7d 100644 --- a/src/main/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnection.java +++ b/src/main/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnection.java @@ -23,13 +23,12 @@ package com.xebialabs.overthere.smb2.telnet; import com.xebialabs.overthere.*; +import com.xebialabs.overthere.cifs.ConnectionValidator; import com.xebialabs.overthere.cifs.telnet.TelnetConnection; import com.xebialabs.overthere.smb2.Smb2Connection; import com.xebialabs.overthere.spi.AddressPortMapper; -import static com.xebialabs.overthere.util.OverthereUtils.checkArgument; import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.SMB2_PROTOCOL; -import static com.xebialabs.overthere.OperatingSystemFamily.WINDOWS; /** @@ -49,8 +48,9 @@ public class Smb2TelnetConnection extends Smb2Connection { * {@link Overthere#getConnection(String, ConnectionOptions)} instead. */ public Smb2TelnetConnection(String type, ConnectionOptions options, AddressPortMapper mapper) { - super(type, options, mapper); - checkArgument(os == WINDOWS, "Cannot create a " + SMB2_PROTOCOL + ":%s connection to a host that is not running Windows", cifsConnectionType.toString().toLowerCase()); + super(type, options, mapper, true); + ConnectionValidator.assertIsWindowsHost(os, SMB2_PROTOCOL, cifsConnectionType); + ConnectionValidator.assertNotNewStyleWindowsDomain(username, SMB2_PROTOCOL, cifsConnectionType); connected(); } diff --git a/src/main/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnection.java b/src/main/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnection.java index 9d77a9a6..94181567 100644 --- a/src/main/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnection.java +++ b/src/main/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnection.java @@ -26,14 +26,12 @@ import com.xebialabs.overthere.ConnectionOptions; import com.xebialabs.overthere.Overthere; import com.xebialabs.overthere.OverthereProcess; -import com.xebialabs.overthere.cifs.CifsConnection; +import com.xebialabs.overthere.cifs.ConnectionValidator; import com.xebialabs.overthere.cifs.winrm.WinRmConnection; import com.xebialabs.overthere.smb2.Smb2Connection; import com.xebialabs.overthere.spi.AddressPortMapper; -import static com.xebialabs.overthere.util.OverthereUtils.checkArgument; -import static com.xebialabs.overthere.OperatingSystemFamily.WINDOWS; -import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.CIFS_PROTOCOL; +import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.SMB2_PROTOCOL; /** * A connection to a Windows host using SMB2 and a Java implementation of WinRM. @@ -45,8 +43,9 @@ public class Smb2WinRmConnection extends Smb2Connection { * {@link Overthere#getConnection(String, ConnectionOptions)} instead. */ public Smb2WinRmConnection(String type, ConnectionOptions options, AddressPortMapper mapper) { - super(type, options, mapper); - checkArgument(os == WINDOWS, "Cannot create a " + CIFS_PROTOCOL + ":%s connection to a host that is not running Windows", cifsConnectionType.toString().toLowerCase()); + super(type, options, mapper, true); + ConnectionValidator.assertIsWindowsHost(os, SMB2_PROTOCOL, cifsConnectionType); + ConnectionValidator.assertNotOldStyleWindowsDomain(username, SMB2_PROTOCOL, cifsConnectionType); } @Override diff --git a/src/main/java/com/xebialabs/overthere/smb2/winrs/Smb2WinrsConnection.java b/src/main/java/com/xebialabs/overthere/smb2/winrs/Smb2WinrsConnection.java index fedcf22d..80fe9dd3 100644 --- a/src/main/java/com/xebialabs/overthere/smb2/winrs/Smb2WinrsConnection.java +++ b/src/main/java/com/xebialabs/overthere/smb2/winrs/Smb2WinrsConnection.java @@ -20,18 +20,16 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.cmb2.winrs; +package com.xebialabs.overthere.smb2.winrs; import com.xebialabs.overthere.*; -import com.xebialabs.overthere.cifs.CifsConnection; +import com.xebialabs.overthere.cifs.ConnectionValidator; import com.xebialabs.overthere.cifs.winrs.WinrsConnection; import com.xebialabs.overthere.smb2.Smb2Connection; import com.xebialabs.overthere.spi.AddressPortMapper; -import com.xebialabs.overthere.util.DefaultAddressPortMapper; import static com.xebialabs.overthere.OperatingSystemFamily.WINDOWS; -import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.*; -import static com.xebialabs.overthere.util.OverthereUtils.*; +import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.SMB2_PROTOCOL; import static java.lang.String.format; /** @@ -44,9 +42,10 @@ public class Smb2WinrsConnection extends Smb2Connection { private ConnectionOptions options; public Smb2WinrsConnection(String type, ConnectionOptions options, AddressPortMapper mapper) { - super(type, options, mapper); - checkArgument(os == WINDOWS, "Cannot create a " + CIFS_PROTOCOL + ":%s connection to a machine that is not running Windows", cifsConnectionType.toString().toLowerCase()); - checkArgument(mapper instanceof DefaultAddressPortMapper, "Cannot create a " + CIFS_PROTOCOL + ":%s connection when connecting through a SSH jumpstation", cifsConnectionType.toString().toLowerCase()); + super(type, options, mapper, true); + ConnectionValidator.assertIsWindowsHost(os, SMB2_PROTOCOL, cifsConnectionType); + ConnectionValidator.assetNotThroughJumpstation(mapper, SMB2_PROTOCOL, cifsConnectionType); + ConnectionValidator.assertNoSingleQuoteInPassword(password, SMB2_PROTOCOL, cifsConnectionType); this.options = options; } @@ -57,7 +56,7 @@ public void connect() { if (connection.getWinrsProxyConnection().getHostOperatingSystem() != WINDOWS) { connection.disconnectFromWinrsProxy(); - throw new IllegalArgumentException(format("Cannot create a " + CIFS_PROTOCOL + ":%s connection with a winrs proxy that is not running Windows", cifsConnectionType.toString().toLowerCase())); + throw new IllegalArgumentException(format("Cannot create a " + SMB2_PROTOCOL + ":%s connection with a winrs proxy that is not running Windows", cifsConnectionType.toString().toLowerCase())); } connected(); diff --git a/src/test/java/com/xebialabs/overthere/smb2/Smb2FileTest.java b/src/test/java/com/xebialabs/overthere/smb2/Smb2FileTest.java new file mode 100644 index 00000000..24d68ac5 --- /dev/null +++ b/src/test/java/com/xebialabs/overthere/smb2/Smb2FileTest.java @@ -0,0 +1,80 @@ +/** + * Copyright (c) 2008-2016, XebiaLabs B.V., All rights reserved. + * + * + * Overthere is licensed under the terms of the GPLv2 + * , like most XebiaLabs Libraries. + * There are special exceptions to the terms and conditions of the GPLv2 as it is applied to + * this software, see the FLOSS License Exception + * . + * + * This program is free software; you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation; version 2 + * of the License. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth + * Floor, Boston, MA 02110-1301 USA + */ +package com.xebialabs.overthere.smb2; + +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import com.xebialabs.overthere.ConnectionOptions; +import com.xebialabs.overthere.OverthereFile; +import com.xebialabs.overthere.cifs.winrm.CifsWinRmConnection; + +import static com.xebialabs.overthere.ConnectionOptions.ADDRESS; +import static com.xebialabs.overthere.ConnectionOptions.OPERATING_SYSTEM; +import static com.xebialabs.overthere.ConnectionOptions.PASSWORD; +import static com.xebialabs.overthere.ConnectionOptions.PORT; +import static com.xebialabs.overthere.ConnectionOptions.USERNAME; +import static com.xebialabs.overthere.OperatingSystemFamily.WINDOWS; + +import static com.xebialabs.overthere.cifs.CifsConnectionType.WINRM_INTERNAL; +import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.*; +import static com.xebialabs.overthere.util.DefaultAddressPortMapper.INSTANCE; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.nullValue; + +public class Smb2FileTest { + + private ConnectionOptions options; + + @BeforeMethod + public void setupOptions() { + options = new ConnectionOptions(); + options.set(OPERATING_SYSTEM, WINDOWS); + options.set(CONNECTION_TYPE, WINRM_INTERNAL); + options.set(PASSWORD, "foobar"); + options.set(PORT, PORT_DEFAULT_WINRM_HTTP); + options.set(SMB2_PORT, PORT_DEFAULT_SMB2); + options.set(SHARE, "smb-share"); + options.set(ADDRESS, "localhost"); + } + + + @Test + public void shouldReturnNullForParentFileOfRoot() { + options.set(USERNAME, "user@domain.com"); + CifsWinRmConnection cifsWinRmConnection = new CifsWinRmConnection(SMB2_PROTOCOL, options, INSTANCE); + OverthereFile file = cifsWinRmConnection.getFile("C:\\"); + assertThat(file.getParentFile(), nullValue()); + } + + @Test + public void shouldSucceedForNonRoot() { + options.set(USERNAME, "user@domain.com"); + CifsWinRmConnection cifsWinRmConnection = new CifsWinRmConnection(SMB2_PROTOCOL, options, INSTANCE); + OverthereFile file = cifsWinRmConnection.getFile("C:\\windows\\temp\\ot-2015060"); + assertThat(file.getParentFile(), not(nullValue())); + } + + +} \ No newline at end of file diff --git a/src/test/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnectionTest.java b/src/test/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnectionTest.java new file mode 100644 index 00000000..55a5f1a0 --- /dev/null +++ b/src/test/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnectionTest.java @@ -0,0 +1,76 @@ +/** + * Copyright (c) 2008-2016, XebiaLabs B.V., All rights reserved. + * + * + * Overthere is licensed under the terms of the GPLv2 + * , like most XebiaLabs Libraries. + * There are special exceptions to the terms and conditions of the GPLv2 as it is applied to + * this software, see the FLOSS License Exception + * . + * + * This program is free software; you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation; version 2 + * of the License. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth + * Floor, Boston, MA 02110-1301 USA + */ +package com.xebialabs.overthere.smb2.telnet; + +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import com.xebialabs.overthere.ConnectionOptions; + +import static com.xebialabs.overthere.ConnectionOptions.ADDRESS; +import static com.xebialabs.overthere.ConnectionOptions.OPERATING_SYSTEM; +import static com.xebialabs.overthere.ConnectionOptions.PASSWORD; +import static com.xebialabs.overthere.ConnectionOptions.PORT; +import static com.xebialabs.overthere.ConnectionOptions.USERNAME; +import static com.xebialabs.overthere.OperatingSystemFamily.WINDOWS; +import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.*; +import static com.xebialabs.overthere.util.DefaultAddressPortMapper.INSTANCE; +import static com.xebialabs.overthere.cifs.CifsConnectionType.TELNET; + +public class Smb2TelnetConnectionTest { + + private ConnectionOptions options; + + @BeforeMethod + public void setupOptions() { + options = new ConnectionOptions(); + options.set(OPERATING_SYSTEM, WINDOWS); + options.set(CONNECTION_TYPE, TELNET); + options.set(SHARE, "smb-share"); + options.set(PASSWORD, "foobar"); + options.set(PORT, PORT_DEFAULT_TELNET); + options.set(SMB2_PORT, PORT_DEFAULT_SMB2); + options.set(ADDRESS, "localhost"); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + @SuppressWarnings("resource") + public void shouldNotSupportNewStyleDomainAccount() { + options.set(USERNAME, "user@domain.com"); + new Smb2TelnetConnection(SMB2_PROTOCOL, options, INSTANCE); + } + + @Test + @SuppressWarnings("resource") + public void shouldSupportOldStyleDomainAccount() { + options.set(USERNAME, "domain\\user"); + new Smb2TelnetConnection(SMB2_PROTOCOL, options, INSTANCE); + } + + @Test + @SuppressWarnings("resource") + public void shouldSupportDomainlessAccount() { + options.set(USERNAME, "user"); + new Smb2TelnetConnection(SMB2_PROTOCOL, options, INSTANCE); + } +} diff --git a/src/test/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnectionWithAdministrativeUserItest.java b/src/test/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnectionWithAdministrativeUserItest.java new file mode 100644 index 00000000..b76f8505 --- /dev/null +++ b/src/test/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnectionWithAdministrativeUserItest.java @@ -0,0 +1,68 @@ +/** + * Copyright (c) 2008-2016, XebiaLabs B.V., All rights reserved. + * + * + * Overthere is licensed under the terms of the GPLv2 + * , like most XebiaLabs Libraries. + * There are special exceptions to the terms and conditions of the GPLv2 as it is applied to + * this software, see the FLOSS License Exception + * . + * + * This program is free software; you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation; version 2 + * of the License. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth + * Floor, Boston, MA 02110-1301 USA + */ +package com.xebialabs.overthere.smb2.telnet; + +import org.testng.annotations.Listeners; +import org.testng.annotations.Test; + +import com.xebialabs.overthere.ConnectionOptions; +import com.xebialabs.overthere.WindowsCloudHostListener; +import com.xebialabs.overthere.itest.OverthereConnectionItestBase; + +import static com.xebialabs.overthere.ConnectionOptions.ADDRESS; +import static com.xebialabs.overthere.ConnectionOptions.OPERATING_SYSTEM; +import static com.xebialabs.overthere.ConnectionOptions.PASSWORD; +import static com.xebialabs.overthere.ConnectionOptions.USERNAME; +import static com.xebialabs.overthere.OperatingSystemFamily.WINDOWS; +import static com.xebialabs.overthere.WindowsCloudHostListener.ADMINISTRATIVE_WINDOWS_USER_PASSWORD; +import static com.xebialabs.overthere.WindowsCloudHostListener.ADMINISTRATIVE_WINDOWS_USER_USERNAME; +import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.CONNECTION_TYPE; +import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.SMB2_PROTOCOL; +import static com.xebialabs.overthere.cifs.CifsConnectionType.TELNET; + +@Test +@Listeners({WindowsCloudHostListener.class}) +public class Smb2TelnetConnectionWithAdministrativeUserItest extends OverthereConnectionItestBase { + + @Override + protected String getProtocol() { + return SMB2_PROTOCOL; + } + + @Override + protected ConnectionOptions getOptions() { + ConnectionOptions options = new ConnectionOptions(); + options.set(ADDRESS, WindowsCloudHostListener.getHost().getHostName()); + options.set(CONNECTION_TYPE, TELNET); + options.set(OPERATING_SYSTEM, WINDOWS); + options.set(USERNAME, ADMINISTRATIVE_WINDOWS_USER_USERNAME); + options.set(PASSWORD, ADMINISTRATIVE_WINDOWS_USER_PASSWORD); + return options; + } + + @Override + protected String getExpectedConnectionClassName() { + return Smb2TelnetConnection.class.getName(); + } + +} diff --git a/src/test/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnectionWithRegularUserItest.java b/src/test/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnectionWithRegularUserItest.java new file mode 100644 index 00000000..79d29482 --- /dev/null +++ b/src/test/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnectionWithRegularUserItest.java @@ -0,0 +1,73 @@ +/** + * Copyright (c) 2008-2016, XebiaLabs B.V., All rights reserved. + * + * + * Overthere is licensed under the terms of the GPLv2 + * , like most XebiaLabs Libraries. + * There are special exceptions to the terms and conditions of the GPLv2 as it is applied to + * this software, see the FLOSS License Exception + * . + * + * This program is free software; you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation; version 2 + * of the License. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth + * Floor, Boston, MA 02110-1301 USA + */ +package com.xebialabs.overthere.smb2.telnet; + +import org.testng.annotations.Listeners; +import org.testng.annotations.Test; +import com.google.common.collect.ImmutableMap; + +import com.xebialabs.overthere.ConnectionOptions; +import com.xebialabs.overthere.WindowsCloudHostListener; +import com.xebialabs.overthere.itest.OverthereConnectionItestBase; + +import static com.xebialabs.overthere.ConnectionOptions.ADDRESS; +import static com.xebialabs.overthere.ConnectionOptions.OPERATING_SYSTEM; +import static com.xebialabs.overthere.ConnectionOptions.PASSWORD; +import static com.xebialabs.overthere.ConnectionOptions.TEMPORARY_DIRECTORY_PATH; +import static com.xebialabs.overthere.ConnectionOptions.USERNAME; +import static com.xebialabs.overthere.OperatingSystemFamily.WINDOWS; +import static com.xebialabs.overthere.WindowsCloudHostListener.REGULAR_WINDOWS_USER_PASSWORD; +import static com.xebialabs.overthere.WindowsCloudHostListener.REGULAR_WINDOWS_USER_USERNAME; +import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.CONNECTION_TYPE; +//import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.PATH_SHARE_MAPPINGS; +import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.SMB2_PROTOCOL; +import static com.xebialabs.overthere.cifs.CifsConnectionType.TELNET; + +@Test +@Listeners({WindowsCloudHostListener.class}) +public class Smb2TelnetConnectionWithRegularUserItest extends OverthereConnectionItestBase { + + @Override + protected String getProtocol() { + return SMB2_PROTOCOL; + } + + @Override + protected ConnectionOptions getOptions() { + ConnectionOptions options = new ConnectionOptions(); + options.set(OPERATING_SYSTEM, WINDOWS); + options.set(CONNECTION_TYPE, TELNET); + options.set(ADDRESS, WindowsCloudHostListener.getHost().getHostName()); + options.set(USERNAME, REGULAR_WINDOWS_USER_USERNAME); + options.set(PASSWORD, REGULAR_WINDOWS_USER_PASSWORD); + options.set(TEMPORARY_DIRECTORY_PATH, "C:\\overthere\\temp"); +// options.set(PATH_SHARE_MAPPINGS, ImmutableMap.of("C:\\overthere", "sharethere")); + return options; + } + + @Override + protected String getExpectedConnectionClassName() { + return Smb2TelnetConnection.class.getName(); + } + +} diff --git a/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpWithAdministrativeUserItest.java b/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpWithAdministrativeUserItest.java new file mode 100644 index 00000000..f8993981 --- /dev/null +++ b/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpWithAdministrativeUserItest.java @@ -0,0 +1,45 @@ +/** + * Copyright (c) 2008-2016, XebiaLabs B.V., All rights reserved. + * + * + * Overthere is licensed under the terms of the GPLv2 + * , like most XebiaLabs Libraries. + * There are special exceptions to the terms and conditions of the GPLv2 as it is applied to + * this software, see the FLOSS License Exception + * . + * + * This program is free software; you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation; version 2 + * of the License. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth + * Floor, Boston, MA 02110-1301 USA + */ +package com.xebialabs.overthere.smb2.winrm; + +import com.xebialabs.overthere.cifs.winrm.CifsWinRmConnectionOverHttpWithAdministrativeUserItest; +import org.testng.annotations.Listeners; +import org.testng.annotations.Test; + +import com.xebialabs.overthere.WindowsCloudHostListener; +import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.SMB2_PROTOCOL; + +@Test +@Listeners({WindowsCloudHostListener.class}) +public class Smb2WinRmConnectionOverHttpWithAdministrativeUserItest extends CifsWinRmConnectionOverHttpWithAdministrativeUserItest { + + @Override + protected String getProtocol() { + return SMB2_PROTOCOL; + } + + @Override + protected String getExpectedConnectionClassName() { + return Smb2WinRmConnection.class.getName(); + } +} diff --git a/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpsWithAdministrativeUserItest.java b/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpsWithAdministrativeUserItest.java new file mode 100644 index 00000000..2981f20d --- /dev/null +++ b/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpsWithAdministrativeUserItest.java @@ -0,0 +1,46 @@ +/** + * Copyright (c) 2008-2016, XebiaLabs B.V., All rights reserved. + * + * + * Overthere is licensed under the terms of the GPLv2 + * , like most XebiaLabs Libraries. + * There are special exceptions to the terms and conditions of the GPLv2 as it is applied to + * this software, see the FLOSS License Exception + * . + * + * This program is free software; you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation; version 2 + * of the License. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth + * Floor, Boston, MA 02110-1301 USA + */ +package com.xebialabs.overthere.smb2.winrm; + +import com.xebialabs.overthere.cifs.winrm.CifsWinRmConnectionOverHttpsWithAdministrativeUserItest; +import org.testng.annotations.Listeners; +import org.testng.annotations.Test; + +import com.xebialabs.overthere.WindowsCloudHostListener; +import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.SMB2_PROTOCOL; + +@Test +@Listeners({WindowsCloudHostListener.class}) +public class Smb2WinRmConnectionOverHttpsWithAdministrativeUserItest extends CifsWinRmConnectionOverHttpsWithAdministrativeUserItest { + + @Override + protected String getProtocol() { + return SMB2_PROTOCOL; + } + + @Override + protected String getExpectedConnectionClassName() { + return Smb2WinRmConnection.class.getName(); + } + +} diff --git a/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionTest.java b/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionTest.java new file mode 100644 index 00000000..c4ae3ae9 --- /dev/null +++ b/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionTest.java @@ -0,0 +1,77 @@ +/** + * Copyright (c) 2008-2016, XebiaLabs B.V., All rights reserved. + * + * + * Overthere is licensed under the terms of the GPLv2 + * , like most XebiaLabs Libraries. + * There are special exceptions to the terms and conditions of the GPLv2 as it is applied to + * this software, see the FLOSS License Exception + * . + * + * This program is free software; you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation; version 2 + * of the License. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth + * Floor, Boston, MA 02110-1301 USA + */ +package com.xebialabs.overthere.smb2.winrm; + +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import com.xebialabs.overthere.ConnectionOptions; + +import static com.xebialabs.overthere.ConnectionOptions.ADDRESS; +import static com.xebialabs.overthere.ConnectionOptions.OPERATING_SYSTEM; +import static com.xebialabs.overthere.ConnectionOptions.PASSWORD; +import static com.xebialabs.overthere.ConnectionOptions.PORT; +import static com.xebialabs.overthere.ConnectionOptions.USERNAME; +import static com.xebialabs.overthere.OperatingSystemFamily.WINDOWS; +import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.*; +import static com.xebialabs.overthere.util.DefaultAddressPortMapper.INSTANCE; +import static com.xebialabs.overthere.cifs.CifsConnectionType.WINRM_INTERNAL; + +public class Smb2WinRmConnectionTest { + + private ConnectionOptions options; + + @BeforeMethod + public void setupOptions() { + options = new ConnectionOptions(); + options.set(OPERATING_SYSTEM, WINDOWS); + options.set(CONNECTION_TYPE, WINRM_INTERNAL); + options.set(PASSWORD, "foobar"); + options.set(SMB2_PORT, PORT_DEFAULT_SMB2); + options.set(PORT, PORT_DEFAULT_WINRM_HTTP); + options.set(ADDRESS, "localhost"); + options.set(SHARE, "smb-share"); + } + + @Test + @SuppressWarnings("resource") + public void shouldSupportNewStyleDomainAccount() { + options.set(USERNAME, "user@domain.com"); + new Smb2WinRmConnection(SMB2_PROTOCOL, options, INSTANCE); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + @SuppressWarnings("resource") + public void shouldNotSupportOldStyleDomainAccount() { + options.set(USERNAME, "domain\\user"); + new Smb2WinRmConnection(SMB2_PROTOCOL, options, INSTANCE); + } + + @Test + @SuppressWarnings("resource") + public void shouldSupportDomainlessAccount() { + options.set(USERNAME, "user"); + new Smb2WinRmConnection(SMB2_PROTOCOL, options, INSTANCE); + } + +} diff --git a/src/test/java/com/xebialabs/overthere/smb2/winrs/Smb2WinRsConnectionTest.java b/src/test/java/com/xebialabs/overthere/smb2/winrs/Smb2WinRsConnectionTest.java new file mode 100644 index 00000000..cf41abec --- /dev/null +++ b/src/test/java/com/xebialabs/overthere/smb2/winrs/Smb2WinRsConnectionTest.java @@ -0,0 +1,85 @@ +/** + * Copyright (c) 2008-2016, XebiaLabs B.V., All rights reserved. + * + * + * Overthere is licensed under the terms of the GPLv2 + * , like most XebiaLabs Libraries. + * There are special exceptions to the terms and conditions of the GPLv2 as it is applied to + * this software, see the FLOSS License Exception + * . + * + * This program is free software; you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation; version 2 + * of the License. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth + * Floor, Boston, MA 02110-1301 USA + */ +package com.xebialabs.overthere.smb2.winrs; + +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import com.xebialabs.overthere.ConnectionOptions; + +import nl.javadude.assumeng.Assumption; + +import static com.xebialabs.overthere.ConnectionOptions.ADDRESS; +import static com.xebialabs.overthere.ConnectionOptions.OPERATING_SYSTEM; +import static com.xebialabs.overthere.ConnectionOptions.PASSWORD; +import static com.xebialabs.overthere.ConnectionOptions.PORT; +import static com.xebialabs.overthere.ConnectionOptions.USERNAME; +import static com.xebialabs.overthere.OperatingSystemFamily.WINDOWS; +import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.*; +import static com.xebialabs.overthere.util.DefaultAddressPortMapper.INSTANCE; +import static com.xebialabs.overthere.cifs.CifsConnectionType.WINRM_NATIVE; + +public class Smb2WinRsConnectionTest { + + private ConnectionOptions options; + + public static boolean onWindows() { + return System.getProperty("os.name", "").toLowerCase().contains("windows"); + } + + @BeforeMethod + public void setupOptions() { + options = new ConnectionOptions(); + options.set(OPERATING_SYSTEM, WINDOWS); + options.set(CONNECTION_TYPE, WINRM_NATIVE); + options.set(PASSWORD, "foobar"); + options.set(SHARE, "smb-share"); + options.set(PORT, PORT_DEFAULT_WINRM_HTTP); + options.set(SMB2_PORT, PORT_DEFAULT_SMB2); + options.set(ADDRESS, "localhost"); + } + + @Test + @Assumption(methods = "onWindows") + @SuppressWarnings("resource") + public void shouldSupportNewStyleDomainAccount() { + options.set(USERNAME, "user@domain.com"); + new Smb2WinrsConnection(SMB2_PROTOCOL, options, INSTANCE); + } + + @Test + @Assumption(methods = "onWindows") + @SuppressWarnings("resource") + public void shouldSupportOldStyleDomainAccount() { + options.set(USERNAME, "domain\\user"); + new Smb2WinrsConnection(SMB2_PROTOCOL, options, INSTANCE); + } + + @Test + @Assumption(methods = "onWindows") + @SuppressWarnings("resource") + public void shouldSupportDomainlessAccount() { + options.set(USERNAME, "user"); + new Smb2WinrsConnection(SMB2_PROTOCOL, options, INSTANCE); + } +} From 62067aa31fbb004899aa5dda4d6f37dc901d58aa Mon Sep 17 00:00:00 2001 From: Aditya Kalia Date: Wed, 10 Aug 2016 14:47:21 +0530 Subject: [PATCH 05/40] Refactoring --- libs/smbj-0.0.4-dev.jar | Bin 236461 -> 236381 bytes .../overthere/cifs/CifsConnection.java | 5 ---- .../overthere/cifs/CifsConnectionBuilder.java | 10 ------- .../overthere/cifs/ConnectionBuilder.java | 14 +++++++++ .../xebialabs/overthere/cifs/PathMapper.java | 8 ++--- .../smb2/telnet/Smb2TelnetConnection.java | 1 + .../smb2/winrm/Smb2WinRmConnection.java | 1 + .../smb2/winrs/Smb2WinrsConnection.java | 1 + .../overthere/smb2/Smb2FileTest.java | 25 ++++++---------- .../smb2/telnet/Smb2TelnetConnectionTest.java | 1 - ...2TelnetConnectionWithRegularUserItest.java | 4 +-- ...onOverHttpWithAdministrativeUserItest.java | 26 ++++++++++++++-- ...nOverHttpsWithAdministrativeUserItest.java | 28 ++++++++++++++++-- .../smb2/winrm/Smb2WinRmConnectionTest.java | 1 - .../smb2/winrs/Smb2WinRsConnectionTest.java | 1 - 15 files changed, 81 insertions(+), 45 deletions(-) diff --git a/libs/smbj-0.0.4-dev.jar b/libs/smbj-0.0.4-dev.jar index 24efb8d5d8741bb2bfe58d82ce0228cb8417cc2e..041a56fab138b41648cc2309372a57cf23d85e7a 100644 GIT binary patch delta 10743 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 delta 10805 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 online documentation - */ - public static final String PATH_SHARE_MAPPINGS = "pathShareMappings"; - - /** - * See the online documentation - */ - public static final Map PATH_SHARE_MAPPINGS_DEFAULT = Collections.emptyMap(); - private CifsConnection connection; public CifsConnectionBuilder(String type, ConnectionOptions options, AddressPortMapper mapper) { diff --git a/src/main/java/com/xebialabs/overthere/cifs/ConnectionBuilder.java b/src/main/java/com/xebialabs/overthere/cifs/ConnectionBuilder.java index a3205ef3..8cbcbd3e 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/ConnectionBuilder.java +++ b/src/main/java/com/xebialabs/overthere/cifs/ConnectionBuilder.java @@ -22,6 +22,9 @@ */ package com.xebialabs.overthere.cifs; +import java.util.Collections; +import java.util.Map; + import static com.xebialabs.overthere.cifs.WinrmHttpsCertificateTrustStrategy.STRICT; import static com.xebialabs.overthere.cifs.WinrmHttpsHostnameVerificationStrategy.BROWSER_COMPATIBLE; import static com.xebialabs.overthere.local.LocalConnection.LOCAL_PROTOCOL; @@ -222,4 +225,15 @@ public abstract class ConnectionBuilder { * See the online documentation */ public static final boolean WINRS_UNENCRYPTED_DEFAULT = false; + + /** + * See the online documentation + */ + public static final String PATH_SHARE_MAPPINGS = "pathShareMappings"; + + /** + * See the online documentation + */ + public static final Map PATH_SHARE_MAPPINGS_DEFAULT = Collections.emptyMap(); + } diff --git a/src/main/java/com/xebialabs/overthere/cifs/PathMapper.java b/src/main/java/com/xebialabs/overthere/cifs/PathMapper.java index 2b8e201d..b5bf3856 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/PathMapper.java +++ b/src/main/java/com/xebialabs/overthere/cifs/PathMapper.java @@ -30,7 +30,7 @@ import static java.lang.String.format; import static java.util.regex.Pattern.quote; -class PathMapper { +public class PathMapper { private static final String DRIVE_DESIGNATOR = ":"; private static final String ADMIN_SHARE_DESIGNATOR = "$"; private static final Pattern ADMIN_SHARE_PATTERN = Pattern.compile("[a-zA-Z]" + quote(ADMIN_SHARE_DESIGNATOR)); @@ -38,7 +38,7 @@ class PathMapper { private final SortedMap sharesForPaths; private final Map pathsForShares; - PathMapper(final Map mappings) { + public PathMapper(final Map mappings) { // longest first, so reverse lexicographical order SortedMap sharesForPath = new TreeMap(new Comparator() { @Override @@ -67,7 +67,7 @@ public int compare(String o1, String o2) { * @param path the local path to convert * @return the remotely accessible path (using shares) at which the local path can be accessed using SMB */ - String toSharedPath(String path) { + public String toSharedPath(String path) { final String lowerCasePath = path.toLowerCase(); // assumes correct format drive: or drive:\path String mappedPathPrefix = null; @@ -87,7 +87,7 @@ String toSharedPath(String path) { * @param path the remotely accessible path to convert (minus the host name, i.e. beginning with the share) * @return the local path (using drive letters) corresponding to the path that is remotely accessible using SMB */ - String toLocalPath(String path) { + public String toLocalPath(String path) { final String lowerCasePath = path.toLowerCase(); // assumes correct format share or share\path String mappedShare = null; diff --git a/src/main/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnection.java b/src/main/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnection.java index 6d795d7d..d014fdac 100644 --- a/src/main/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnection.java +++ b/src/main/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnection.java @@ -56,6 +56,7 @@ public Smb2TelnetConnection(String type, ConnectionOptions options, AddressPortM @Override public void connect() { + super.connect(); connected(); } diff --git a/src/main/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnection.java b/src/main/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnection.java index 94181567..5757cd8f 100644 --- a/src/main/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnection.java +++ b/src/main/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnection.java @@ -50,6 +50,7 @@ public Smb2WinRmConnection(String type, ConnectionOptions options, AddressPortMa @Override public void connect() { + super.connect(); connected(); } diff --git a/src/main/java/com/xebialabs/overthere/smb2/winrs/Smb2WinrsConnection.java b/src/main/java/com/xebialabs/overthere/smb2/winrs/Smb2WinrsConnection.java index 80fe9dd3..24ad337d 100644 --- a/src/main/java/com/xebialabs/overthere/smb2/winrs/Smb2WinrsConnection.java +++ b/src/main/java/com/xebialabs/overthere/smb2/winrs/Smb2WinrsConnection.java @@ -51,6 +51,7 @@ public Smb2WinrsConnection(String type, ConnectionOptions options, AddressPortMa @Override public void connect() { + super.connect(); connection = new WinrsConnection(options, mapper, workingDirectory); connection.connectToWinrsProxy(options); diff --git a/src/test/java/com/xebialabs/overthere/smb2/Smb2FileTest.java b/src/test/java/com/xebialabs/overthere/smb2/Smb2FileTest.java index 24d68ac5..76bd2b5d 100644 --- a/src/test/java/com/xebialabs/overthere/smb2/Smb2FileTest.java +++ b/src/test/java/com/xebialabs/overthere/smb2/Smb2FileTest.java @@ -22,21 +22,17 @@ */ package com.xebialabs.overthere.smb2; +import com.xebialabs.overthere.smb2.winrm.Smb2WinRmConnection; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import com.xebialabs.overthere.ConnectionOptions; import com.xebialabs.overthere.OverthereFile; -import com.xebialabs.overthere.cifs.winrm.CifsWinRmConnection; -import static com.xebialabs.overthere.ConnectionOptions.ADDRESS; -import static com.xebialabs.overthere.ConnectionOptions.OPERATING_SYSTEM; -import static com.xebialabs.overthere.ConnectionOptions.PASSWORD; -import static com.xebialabs.overthere.ConnectionOptions.PORT; -import static com.xebialabs.overthere.ConnectionOptions.USERNAME; -import static com.xebialabs.overthere.OperatingSystemFamily.WINDOWS; +import static com.xebialabs.overthere.ConnectionOptions.*; -import static com.xebialabs.overthere.cifs.CifsConnectionType.WINRM_INTERNAL; +import static com.xebialabs.overthere.OperatingSystemFamily.WINDOWS; +import static com.xebialabs.overthere.cifs.CifsConnectionType.WINRM_NATIVE; import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.*; import static com.xebialabs.overthere.util.DefaultAddressPortMapper.INSTANCE; import static org.hamcrest.MatcherAssert.assertThat; @@ -51,11 +47,10 @@ public class Smb2FileTest { public void setupOptions() { options = new ConnectionOptions(); options.set(OPERATING_SYSTEM, WINDOWS); - options.set(CONNECTION_TYPE, WINRM_INTERNAL); + options.set(CONNECTION_TYPE, WINRM_NATIVE); options.set(PASSWORD, "foobar"); options.set(PORT, PORT_DEFAULT_WINRM_HTTP); options.set(SMB2_PORT, PORT_DEFAULT_SMB2); - options.set(SHARE, "smb-share"); options.set(ADDRESS, "localhost"); } @@ -63,18 +58,16 @@ public void setupOptions() { @Test public void shouldReturnNullForParentFileOfRoot() { options.set(USERNAME, "user@domain.com"); - CifsWinRmConnection cifsWinRmConnection = new CifsWinRmConnection(SMB2_PROTOCOL, options, INSTANCE); - OverthereFile file = cifsWinRmConnection.getFile("C:\\"); + Smb2WinRmConnection smb2WinRmConnection = new Smb2WinRmConnection(SMB2_PROTOCOL, options, INSTANCE); + OverthereFile file = smb2WinRmConnection.getFile("C:\\"); assertThat(file.getParentFile(), nullValue()); } @Test public void shouldSucceedForNonRoot() { options.set(USERNAME, "user@domain.com"); - CifsWinRmConnection cifsWinRmConnection = new CifsWinRmConnection(SMB2_PROTOCOL, options, INSTANCE); - OverthereFile file = cifsWinRmConnection.getFile("C:\\windows\\temp\\ot-2015060"); + Smb2WinRmConnection smb2WinRmConnection = new Smb2WinRmConnection(SMB2_PROTOCOL, options, INSTANCE); + OverthereFile file = smb2WinRmConnection.getFile("C:\\windows\\temp\\ot-2015060"); assertThat(file.getParentFile(), not(nullValue())); } - - } \ No newline at end of file diff --git a/src/test/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnectionTest.java b/src/test/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnectionTest.java index 55a5f1a0..9bc282f0 100644 --- a/src/test/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnectionTest.java +++ b/src/test/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnectionTest.java @@ -46,7 +46,6 @@ public void setupOptions() { options = new ConnectionOptions(); options.set(OPERATING_SYSTEM, WINDOWS); options.set(CONNECTION_TYPE, TELNET); - options.set(SHARE, "smb-share"); options.set(PASSWORD, "foobar"); options.set(PORT, PORT_DEFAULT_TELNET); options.set(SMB2_PORT, PORT_DEFAULT_SMB2); diff --git a/src/test/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnectionWithRegularUserItest.java b/src/test/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnectionWithRegularUserItest.java index 79d29482..2d5c16a5 100644 --- a/src/test/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnectionWithRegularUserItest.java +++ b/src/test/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnectionWithRegularUserItest.java @@ -39,7 +39,7 @@ import static com.xebialabs.overthere.WindowsCloudHostListener.REGULAR_WINDOWS_USER_PASSWORD; import static com.xebialabs.overthere.WindowsCloudHostListener.REGULAR_WINDOWS_USER_USERNAME; import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.CONNECTION_TYPE; -//import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.PATH_SHARE_MAPPINGS; +import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.PATH_SHARE_MAPPINGS; import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.SMB2_PROTOCOL; import static com.xebialabs.overthere.cifs.CifsConnectionType.TELNET; @@ -61,7 +61,7 @@ protected ConnectionOptions getOptions() { options.set(USERNAME, REGULAR_WINDOWS_USER_USERNAME); options.set(PASSWORD, REGULAR_WINDOWS_USER_PASSWORD); options.set(TEMPORARY_DIRECTORY_PATH, "C:\\overthere\\temp"); -// options.set(PATH_SHARE_MAPPINGS, ImmutableMap.of("C:\\overthere", "sharethere")); + options.set(PATH_SHARE_MAPPINGS, ImmutableMap.of("C:\\overthere", "sharethere")); return options; } diff --git a/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpWithAdministrativeUserItest.java b/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpWithAdministrativeUserItest.java index f8993981..cd93e679 100644 --- a/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpWithAdministrativeUserItest.java +++ b/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpWithAdministrativeUserItest.java @@ -22,24 +22,44 @@ */ package com.xebialabs.overthere.smb2.winrm; -import com.xebialabs.overthere.cifs.winrm.CifsWinRmConnectionOverHttpWithAdministrativeUserItest; +import com.xebialabs.overthere.ConnectionOptions; +import com.xebialabs.overthere.cifs.winrm.CifsWinRmConnection; +import com.xebialabs.overthere.itest.OverthereConnectionItestBase; import org.testng.annotations.Listeners; import org.testng.annotations.Test; import com.xebialabs.overthere.WindowsCloudHostListener; + +import static com.xebialabs.overthere.ConnectionOptions.*; +import static com.xebialabs.overthere.OperatingSystemFamily.WINDOWS; +import static com.xebialabs.overthere.WindowsCloudHostListener.ADMINISTRATIVE_WINDOWS_USER_PASSWORD; +import static com.xebialabs.overthere.WindowsCloudHostListener.ADMINISTRATIVE_WINDOWS_USER_USERNAME; +import static com.xebialabs.overthere.cifs.CifsConnectionType.WINRM_INTERNAL; +import static com.xebialabs.overthere.cifs.ConnectionBuilder.CONNECTION_TYPE; import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.SMB2_PROTOCOL; @Test @Listeners({WindowsCloudHostListener.class}) -public class Smb2WinRmConnectionOverHttpWithAdministrativeUserItest extends CifsWinRmConnectionOverHttpWithAdministrativeUserItest { +public class Smb2WinRmConnectionOverHttpWithAdministrativeUserItest extends OverthereConnectionItestBase { @Override protected String getProtocol() { return SMB2_PROTOCOL; } + @Override + protected ConnectionOptions getOptions() { + ConnectionOptions options = new ConnectionOptions(); + options.set(OPERATING_SYSTEM, WINDOWS); + options.set(CONNECTION_TYPE, WINRM_INTERNAL); + options.set(ADDRESS, WindowsCloudHostListener.getHost().getHostName()); + options.set(USERNAME, ADMINISTRATIVE_WINDOWS_USER_USERNAME); + options.set(PASSWORD, ADMINISTRATIVE_WINDOWS_USER_PASSWORD); + return options; + } + @Override protected String getExpectedConnectionClassName() { - return Smb2WinRmConnection.class.getName(); + return CifsWinRmConnection.class.getName(); } } diff --git a/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpsWithAdministrativeUserItest.java b/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpsWithAdministrativeUserItest.java index 2981f20d..ba7ae41e 100644 --- a/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpsWithAdministrativeUserItest.java +++ b/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpsWithAdministrativeUserItest.java @@ -22,16 +22,26 @@ */ package com.xebialabs.overthere.smb2.winrm; -import com.xebialabs.overthere.cifs.winrm.CifsWinRmConnectionOverHttpsWithAdministrativeUserItest; +import com.xebialabs.overthere.ConnectionOptions; +import com.xebialabs.overthere.cifs.WinrmHttpsCertificateTrustStrategy; +import com.xebialabs.overthere.cifs.WinrmHttpsHostnameVerificationStrategy; +import com.xebialabs.overthere.itest.OverthereConnectionItestBase; import org.testng.annotations.Listeners; import org.testng.annotations.Test; import com.xebialabs.overthere.WindowsCloudHostListener; + +import static com.xebialabs.overthere.ConnectionOptions.*; +import static com.xebialabs.overthere.OperatingSystemFamily.WINDOWS; +import static com.xebialabs.overthere.WindowsCloudHostListener.ADMINISTRATIVE_WINDOWS_USER_PASSWORD; +import static com.xebialabs.overthere.WindowsCloudHostListener.ADMINISTRATIVE_WINDOWS_USER_USERNAME; +import static com.xebialabs.overthere.cifs.CifsConnectionType.WINRM_INTERNAL; +import static com.xebialabs.overthere.cifs.ConnectionBuilder.*; import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.SMB2_PROTOCOL; @Test @Listeners({WindowsCloudHostListener.class}) -public class Smb2WinRmConnectionOverHttpsWithAdministrativeUserItest extends CifsWinRmConnectionOverHttpsWithAdministrativeUserItest { +public class Smb2WinRmConnectionOverHttpsWithAdministrativeUserItest extends OverthereConnectionItestBase { @Override protected String getProtocol() { @@ -43,4 +53,18 @@ protected String getExpectedConnectionClassName() { return Smb2WinRmConnection.class.getName(); } + @Override + protected ConnectionOptions getOptions() { + ConnectionOptions options = new ConnectionOptions(); + options.set(OPERATING_SYSTEM, WINDOWS); + options.set(CONNECTION_TYPE, WINRM_INTERNAL); + options.set(ADDRESS, WindowsCloudHostListener.getHost().getHostName()); + options.set(USERNAME, ADMINISTRATIVE_WINDOWS_USER_USERNAME); + options.set(PASSWORD, ADMINISTRATIVE_WINDOWS_USER_PASSWORD); + options.set(WINRM_ENABLE_HTTPS, true); + options.set(WINRM_HTTPS_CERTIFICATE_TRUST_STRATEGY, WinrmHttpsCertificateTrustStrategy.ALLOW_ALL); + options.set(WINRM_HTTPS_HOSTNAME_VERIFICATION_STRATEGY, WinrmHttpsHostnameVerificationStrategy.ALLOW_ALL); + return options; + } + } diff --git a/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionTest.java b/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionTest.java index c4ae3ae9..0d4df9d3 100644 --- a/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionTest.java +++ b/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionTest.java @@ -50,7 +50,6 @@ public void setupOptions() { options.set(SMB2_PORT, PORT_DEFAULT_SMB2); options.set(PORT, PORT_DEFAULT_WINRM_HTTP); options.set(ADDRESS, "localhost"); - options.set(SHARE, "smb-share"); } @Test diff --git a/src/test/java/com/xebialabs/overthere/smb2/winrs/Smb2WinRsConnectionTest.java b/src/test/java/com/xebialabs/overthere/smb2/winrs/Smb2WinRsConnectionTest.java index cf41abec..d86bab14 100644 --- a/src/test/java/com/xebialabs/overthere/smb2/winrs/Smb2WinRsConnectionTest.java +++ b/src/test/java/com/xebialabs/overthere/smb2/winrs/Smb2WinRsConnectionTest.java @@ -53,7 +53,6 @@ public void setupOptions() { options.set(OPERATING_SYSTEM, WINDOWS); options.set(CONNECTION_TYPE, WINRM_NATIVE); options.set(PASSWORD, "foobar"); - options.set(SHARE, "smb-share"); options.set(PORT, PORT_DEFAULT_WINRM_HTTP); options.set(SMB2_PORT, PORT_DEFAULT_SMB2); options.set(ADDRESS, "localhost"); From 9ced219cc0a858ba14c6ea5b80be8cd6f82234e5 Mon Sep 17 00:00:00 2001 From: Aditya Kalia Date: Wed, 10 Aug 2016 17:47:27 +0530 Subject: [PATCH 06/40] Refactoring code --- build.gradle | 2 + .../overthere/smb2/Smb2Connection.java | 55 ++-- .../overthere/smb2/Smb2ConnectionBuilder.java | 5 - .../xebialabs/overthere/smb2/Smb2File.java | 282 ++++++++++-------- .../xebialabs/overthere/smb2/Smb2Paths.java | 96 ++++++ ...2TelnetConnectionWithRegularUserItest.java | 8 +- 6 files changed, 301 insertions(+), 147 deletions(-) create mode 100644 src/main/java/com/xebialabs/overthere/smb2/Smb2Paths.java diff --git a/build.gradle b/build.gradle index 728a54cc..88c66ca3 100644 --- a/build.gradle +++ b/build.gradle @@ -63,6 +63,8 @@ dependencies { // SMB2/3 compile files('libs/smbj-0.0.4-dev.jar') compile 'net.engio:mbassador:1.2.4.2' + compile "org.bouncycastle:bcprov-jdk15on:1.54" + compile "org.bouncycastle:bcpkix-jdk15on:1.54" // Telnet compile 'commons-net:commons-net:3.3' diff --git a/src/main/java/com/xebialabs/overthere/smb2/Smb2Connection.java b/src/main/java/com/xebialabs/overthere/smb2/Smb2Connection.java index b77dc89a..6e47894d 100644 --- a/src/main/java/com/xebialabs/overthere/smb2/Smb2Connection.java +++ b/src/main/java/com/xebialabs/overthere/smb2/Smb2Connection.java @@ -22,13 +22,13 @@ */ package com.xebialabs.overthere.smb2; +import com.hierynomus.ntlm.NtlmException; import com.hierynomus.smbj.DefaultConfig; import com.hierynomus.smbj.SMBClient; import com.hierynomus.smbj.auth.AuthenticationContext; import com.hierynomus.smbj.connection.Connection; import com.hierynomus.smbj.session.Session; import com.hierynomus.smbj.share.DiskShare; -import com.hierynomus.smbj.share.Share; import com.xebialabs.overthere.ConnectionOptions; import com.xebialabs.overthere.OverthereFile; import com.xebialabs.overthere.RuntimeIOException; @@ -36,11 +36,15 @@ import com.xebialabs.overthere.proxy.ProxyConnection; import com.xebialabs.overthere.spi.AddressPortMapper; import com.xebialabs.overthere.spi.BaseOverthereConnection; +import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.net.InetSocketAddress; +import java.security.Security; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import static com.xebialabs.overthere.ConnectionOptions.*; import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.CONNECTION_TYPE; @@ -53,15 +57,19 @@ public class Smb2Connection extends BaseOverthereConnection { private final String hostname; private final int smbPort; private final String domain; - private final String shareName; private Connection connection; private Session session; - private DiskShare share; - protected final String password; + private int port; + private Map shareCache = new ConcurrentHashMap<>(); + protected final String password; protected CifsConnectionType cifsConnectionType; protected final String username; - private int port; + private static final String EMPTY = ""; + + static { + Security.addProvider(new BouncyCastleProvider()); + } protected Smb2Connection(String protocol, ConnectionOptions options, AddressPortMapper mapper, boolean canStartProcess) { super(protocol, options, mapper, canStartProcess); @@ -82,8 +90,7 @@ protected Smb2Connection(String protocol, ConnectionOptions options, AddressPort smbPort = smbAddressPort.getPort(); username = options.get(USERNAME); password = options.get(PASSWORD); - domain = options.getOptional(DOMAIN); - shareName = options.get(SHARE); + domain = options.get(DOMAIN, EMPTY); client = new SMBClient(new DefaultConfig()); } @@ -92,22 +99,19 @@ public void connect() { connection = client.connect(hostname); AuthenticationContext authContext = new AuthenticationContext(username, password.toCharArray(), domain); session = connection.authenticate(authContext); - Share share = session.connectShare(shareName); - if (!(share instanceof DiskShare)) { - close(); - throw new RuntimeIOException("The share " + shareName + " is not a disk share"); - } - this.share = (DiskShare) share; } catch (IOException e) { throw new RuntimeIOException(e); + } catch (NtlmException e) { + throw new RuntimeIOException(e); } connected(); } - @Override public OverthereFile getFile(String hostPath) { - return new Smb2File(this, hostPath); + hostPath = Smb2Paths.escapeForwardSlashes(hostPath); + Map pathMappings = options.get(PATH_SHARE_MAPPINGS, PATH_SHARE_MAPPINGS_DEFAULT); + return new Smb2File(this, hostPath, pathMappings); } @Override @@ -118,10 +122,14 @@ public OverthereFile getFile(OverthereFile parent, String child) { @Override protected void doClose() { try { - share.close(); - } catch (IOException e) { - logger.warn("Exception while trying to close smb2 share", e); + for (DiskShare s : shareCache.values()) + try { + s.close(); + } catch (IOException e) { + logger.warn("Exception while trying to close smb2 share", e); + } } finally { + shareCache.clear(); try { session.close(); } catch (IOException e) { @@ -147,7 +155,16 @@ public String toString() { return "smb:" + cifsConnectionType.toString().toLowerCase() + "://" + username + "@" + hostname + ":" + smbPort + ":" + port; } - DiskShare getShare() { + protected DiskShare getShare(String shareName) { + DiskShare share = shareCache.get(shareName); + if (share == null) { + share = (DiskShare) session.connectShare(shareName); + if (!(share instanceof DiskShare)) { + close(); + throw new RuntimeIOException("The share " + shareName + " is not a disk share"); + } + shareCache.put(shareName, share); + } return share; } diff --git a/src/main/java/com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java b/src/main/java/com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java index 2194fc5d..78919e85 100644 --- a/src/main/java/com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java +++ b/src/main/java/com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java @@ -26,9 +26,6 @@ import com.xebialabs.overthere.OverthereConnection; import com.xebialabs.overthere.cifs.CifsConnectionType; import com.xebialabs.overthere.cifs.ConnectionBuilder; -import com.xebialabs.overthere.cifs.telnet.CifsTelnetConnection; -import com.xebialabs.overthere.cifs.winrm.CifsWinRmConnection; -import com.xebialabs.overthere.cifs.winrs.CifsWinrsConnection; import com.xebialabs.overthere.smb2.telnet.Smb2TelnetConnection; import com.xebialabs.overthere.smb2.winrm.Smb2WinRmConnection; import com.xebialabs.overthere.smb2.winrs.Smb2WinrsConnection; @@ -55,8 +52,6 @@ public class Smb2ConnectionBuilder extends ConnectionBuilder implements Overther */ public static final String DOMAIN = "domain"; - public static final String SHARE = "share"; - private final Smb2Connection connection; public Smb2ConnectionBuilder(String type, ConnectionOptions options, AddressPortMapper mapper) { diff --git a/src/main/java/com/xebialabs/overthere/smb2/Smb2File.java b/src/main/java/com/xebialabs/overthere/smb2/Smb2File.java index 0d09a133..233db7d5 100644 --- a/src/main/java/com/xebialabs/overthere/smb2/Smb2File.java +++ b/src/main/java/com/xebialabs/overthere/smb2/Smb2File.java @@ -23,9 +23,11 @@ package com.xebialabs.overthere.smb2; import com.hierynomus.msdtyp.AccessMask; +import com.hierynomus.mserref.NtStatus; import com.hierynomus.msfscc.FileAttributes; import com.hierynomus.msfscc.fileinformation.FileInfo; import com.hierynomus.mssmb2.SMB2CreateDisposition; +import com.hierynomus.smbj.common.SMBApiException; import com.hierynomus.smbj.share.DiskShare; import com.hierynomus.smbj.share.File; import com.hierynomus.smbj.transport.TransportException; @@ -41,17 +43,20 @@ import java.util.ArrayList; import java.util.EnumSet; import java.util.List; +import java.util.Map; import static java.lang.String.format; public class Smb2File extends BaseOverthereFile { private final String hostPath; - private boolean overWrite; + private boolean overwrite = true; + private Map pathMappings; - public Smb2File(Smb2Connection connection, String hostPath) { + public Smb2File(Smb2Connection connection, String hostPath, Map pathMappings) { super(connection); this.hostPath = hostPath; + this.pathMappings = pathMappings; } @Override @@ -61,17 +66,20 @@ public String getPath() { @Override public String getName() { - int i = hostPath.lastIndexOf('\\'); - return hostPath.substring(i); + return Smb2Paths.getFileName(getPathOnShare()); + } + + @Override + public OverthereFile getFile(String child) { + return new Smb2File(getConnection(), Smb2Paths.join(hostPath, child), pathMappings); } @Override public OverthereFile getParentFile() { OverthereFile f = null; - String[] s = hostPath.split("\\\\"); - if (s.length > 1) { - f = getFile(s[hostPath.length() - 1]); - } + String parentPath = Smb2Paths.getParentPath(getPathOnShare()); + if (parentPath != null) + f = getFile(parentPath); return f; } @@ -85,16 +93,6 @@ public boolean canRead() { return checkAccessMask(AccessMask.GENERIC_READ); } - private boolean checkAccessMask(AccessMask mask) { - long accessMask = connection.getShare().getFileInformation(hostPath).getAccessMask(); - return AccessMask.EnumUtils.isSet(accessMask, mask); - } - - private boolean checkAttributes(FileAttributes mask) { - long attrMask = connection.getShare().getFileInformation(hostPath).getFileAttributes(); - return FileAttributes.EnumUtils.isSet(attrMask, mask); - } - @Override public boolean canWrite() { return checkAccessMask(AccessMask.GENERIC_WRITE); @@ -107,12 +105,26 @@ public boolean canExecute() { @Override public boolean isFile() { - return connection.getShare().fileExists(hostPath); + try { + return getShare().fileExists(getPathOnShare()); + } catch (SMBApiException e) { + if (e.getStatus().equals(NtStatus.STATUS_FILE_IS_A_DIRECTORY) || + e.getStatus().equals(NtStatus.STATUS_OBJECT_PATH_NOT_FOUND)) + return false; + throw new RuntimeIOException(e); + } } @Override public boolean isDirectory() { - return connection.getShare().folderExists(hostPath); + try { + return getShare().folderExists(getPathOnShare()); + } catch (SMBApiException e) { + if (e.getStatus().equals(NtStatus.STATUS_NOT_A_DIRECTORY) || + e.getStatus().equals(NtStatus.STATUS_OBJECT_PATH_NOT_FOUND)) + return false; + throw new RuntimeIOException(e); + } } @Override @@ -127,103 +139,93 @@ public long lastModified() { @Override public long length() { - return connection.getShare().getFileInformation(hostPath).getFileSize(); + return getShare().getFileInformation(getPathOnShare()).getFileSize(); } @Override public InputStream getInputStream() throws RuntimeIOException { - logger.debug("Opening SMB2 input stream for {}", hostPath); + logger.debug("Opening SMB2 input stream for {}", getSharePath()); try { - final File file = connection.getShare().openFile(hostPath, + final File file = getShare().openFile(getPathOnShare(), EnumSet.of(AccessMask.GENERIC_READ), SMB2CreateDisposition.FILE_OPEN); - try { - final InputStream wrapped = file.getInputStream(); - return asBuffered(new InputStream() { - - @Override - public int read() throws IOException { - return wrapped.read(); - } - - @Override - public int read(byte[] b) throws IOException { - return wrapped.read(b); - } - - @Override - public int read(byte[] b, int off, int len) throws IOException { - return wrapped.read(b, off, len); - } - - @Override - public long skip(long n) throws IOException { - return wrapped.skip(n); - } - - @Override - public int available() throws IOException { - return wrapped.available(); - } - - @Override - public void close() throws IOException { - logger.debug("Closing SMB2 input stream for {}", hostPath); - wrapped.close(); - } - }); - } finally { - file.close(); - } + + final InputStream wrapped = file.getInputStream(); + return asBuffered(new InputStream() { + + @Override + public int read() throws IOException { + return wrapped.read(); + } + + @Override + public int read(byte[] b) throws IOException { + return wrapped.read(b); + } + + @Override + public int read(byte[] b, int off, int len) throws IOException { + return wrapped.read(b, off, len); + } + + @Override + public long skip(long n) throws IOException { + return wrapped.skip(n); + } + + @Override + public void close() throws IOException { + logger.debug("Closing SMB2 input stream for {}", getSharePath()); + wrapped.close(); + file.close(); + } + }); } catch (TransportException e) { - throw new RuntimeIOException(format("Cannot open %s for reading: %s", hostPath, e.toString()), e); + throw new RuntimeIOException(format("Cannot open %s for reading: %s", getSharePath(), e.toString()), e); } } @Override public OutputStream getOutputStream() { - logger.debug("Opening SMB2 output stream for {}", hostPath); + logger.debug("Opening SMB2 output stream for {}", getSharePath()); try { SMB2CreateDisposition createDisposition = SMB2CreateDisposition.FILE_OVERWRITE_IF; - if (!overWrite) createDisposition = SMB2CreateDisposition.FILE_CREATE; - final File file = connection.getShare().openFile(hostPath, - EnumSet.of(AccessMask.GENERIC_READ), createDisposition); - - try { - final OutputStream wrapped = file.getOutputStream(); - - return asBuffered(new OutputStream() { - - @Override - public void write(int b) throws IOException { - wrapped.write(b); - } - - @Override - public void write(byte[] b, int off, int len) throws IOException { - wrapped.write(b, off, len); - } - - @Override - public void write(byte[] b) throws IOException { - wrapped.write(b); - } - - @Override - public void flush() throws IOException { - wrapped.flush(); - } - - @Override - public void close() throws IOException { - logger.debug("Closing SMB2 output stream for {}", hostPath); - wrapped.close(); - } - }); - } finally { - file.close(); - } + if (!overwrite) createDisposition = SMB2CreateDisposition.FILE_CREATE; + final File file = getShare().openFile(getPathOnShare(), + EnumSet.of(AccessMask.GENERIC_WRITE), createDisposition); + + final OutputStream wrapped = file.getOutputStream(); + + return asBuffered(new OutputStream() { + + @Override + public void write(int b) throws IOException { + wrapped.write(b); + } + + @Override + public void write(byte[] b, int off, int len) throws IOException { + wrapped.write(b, off, len); + } + + @Override + public void write(byte[] b) throws IOException { + wrapped.write(b); + } + + @Override + public void flush() throws IOException { + wrapped.flush(); + } + + @Override + public void close() throws IOException { + logger.debug("Closing SMB2 output stream for {}", getSharePath()); + wrapped.close(); + file.close(); + } + }); } catch (TransportException e) { - throw new RuntimeIOException(format("Cannot open %s for writing: %s", hostPath, e.toString()), e); + throw new RuntimeIOException(format("Cannot open %s for writing: %s", getSharePath(), e.toString()), e); } } @@ -234,58 +236,76 @@ public void setExecutable(boolean executable) { @Override public void delete() { + String sharePath = getPathOnShare(); try { - DiskShare share = connection.getShare(); if (isFile()) { - logger.debug("deleting file {}", hostPath); - share.rm(hostPath); + logger.debug("deleting file {}", sharePath); + getShare().rm(sharePath); } else { - logger.debug("deleting directory {}", hostPath); - share.rmdir(hostPath, true); + logger.debug("deleting directory {}", sharePath); + getShare().rmdir(sharePath, false); } } catch (TransportException e) { - throw new RuntimeIOException(format("Cannot delete %s: %s", hostPath, e.toString()), e); + throw new RuntimeIOException(format("Cannot delete %s: %s", sharePath, e.toString()), e); + } catch (SMBApiException e) { + throw new RuntimeIOException(format("Cannot delete %s: %s", sharePath, e.toString()), e); } } @Override public void deleteRecursively() { - logger.debug("deleting directory recursively {}", hostPath); + String sharePath = getPathOnShare(); + logger.debug("deleting directory recursively {}", sharePath); try { - connection.getShare().rmdir(hostPath, true); + getShare().rmdir(sharePath, true); } catch (TransportException e) { - throw new RuntimeIOException(format("Cannot delete recursively %s: %s", hostPath, e.toString()), e); + throw new RuntimeIOException(format("Cannot delete recursively %s: %s", sharePath, e.toString()), e); } } @Override public List listFiles() { - logger.debug("Listing directory {}", hostPath); + String sharePath = getPathOnShare(); + logger.debug("Listing directory {}", sharePath); try { List files = new ArrayList(); - for (FileInfo info : connection.getShare().list(hostPath)) { + for (FileInfo info : getShare().list(sharePath)) { files.add(getFile(info.getFileName())); } return files; } catch (TransportException e) { - throw new RuntimeIOException(format("Cannot list directory %s: %s", hostPath, e.toString()), e); + throw new RuntimeIOException(format("Cannot list directory %s: %s", sharePath, e.toString()), e); + } catch (SMBApiException e) { + throw new RuntimeIOException(format("Cannot list directory %s: %s", sharePath, e.toString()), e); } } @Override public void mkdir() { - logger.debug("Creating directory {}", hostPath); + makeDirectory(getPathOnShare()); + } + + private void makeDirectory(String path) { + String sharePath = getPathOnShare(); + logger.debug("Creating directory {}", sharePath); try { - connection.getShare().mkdir(hostPath); + getShare().mkdir(path); } catch (TransportException e) { - throw new RuntimeIOException(format("Cannot create directory %s: %s", hostPath, e.toString()), e); + throw new RuntimeIOException(format("Cannot create directory %s: %s", sharePath, e.toString()), e); + } catch (SMBApiException e) { + throw new RuntimeIOException(format("Cannot create directory %s: %s", sharePath, e.toString()), e); } } @Override public void mkdirs() { - logger.debug("Creating directories {}", hostPath); - mkdir(); + String sharePath = getPathOnShare(); + logger.debug("Creating directories {}", sharePath); + String [] paths = Smb2Paths.getPathListFromOuterToInner(sharePath); + for (String p : paths) { + if (!getShare().folderExists(p)) + makeDirectory(p); + } } @Override @@ -298,7 +318,6 @@ public boolean equals(Object that) { if (!(that instanceof Smb2File)) { return false; } - return getPath().equals(((Smb2File) that).getPath()); } @@ -312,5 +331,28 @@ public String toString() { return getConnection() + "/" + getPath(); } + private boolean checkAccessMask(AccessMask mask) { + long accessMask = getShare().getFileInformation(getPathOnShare()).getAccessMask(); + return AccessMask.EnumUtils.isSet(accessMask, mask); + } + + private String getSharePath() { + return Smb2Paths.getSharePath(hostPath, pathMappings); + } + + private String getPathOnShare() { + return Smb2Paths.getPathOnShare(getSharePath()); + } + + private DiskShare getShare() { + String shareName = Smb2Paths.getShareName(getSharePath()); + return connection.getShare(shareName); + } + + private boolean checkAttributes(FileAttributes mask) { + long attrMask = getShare().getFileInformation(getPathOnShare()).getFileAttributes(); + return FileAttributes.EnumUtils.isSet(attrMask, mask); + } + private static Logger logger = LoggerFactory.getLogger(Smb2File.class); } diff --git a/src/main/java/com/xebialabs/overthere/smb2/Smb2Paths.java b/src/main/java/com/xebialabs/overthere/smb2/Smb2Paths.java new file mode 100644 index 00000000..f16640b5 --- /dev/null +++ b/src/main/java/com/xebialabs/overthere/smb2/Smb2Paths.java @@ -0,0 +1,96 @@ +/** + * Copyright (c) 2008-2016, XebiaLabs B.V., All rights reserved. + * + * + * Overthere is licensed under the terms of the GPLv2 + * , like most XebiaLabs Libraries. + * There are special exceptions to the terms and conditions of the GPLv2 as it is applied to + * this software, see the FLOSS License Exception + * . + * + * This program is free software; you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation; version 2 + * of the License. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth + * Floor, Boston, MA 02110-1301 USA + */ +package com.xebialabs.overthere.smb2; + +import com.xebialabs.overthere.cifs.PathMapper; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public abstract class Smb2Paths { + + public static final char SLASH = '\\'; + public static final String EMPTY = ""; + + static String getShareName(String sharePath) { + int i = sharePath.indexOf(SLASH); + if (i != -1) + return sharePath.substring(0, i); + return sharePath; + } + + static String getSharePath(String hostPath, Map pathMappings) { + PathMapper mapper = new PathMapper(pathMappings); + String p = mapper.toSharedPath(hostPath); + int first = p.indexOf(SLASH); + int last = p.lastIndexOf(SLASH); + if (first == last && p.endsWith(String.valueOf(SLASH))) + p = p.substring(0, p.length() - 1); + return p; + } + + static String getPathOnShare(String sharePath) { + if (sharePath.endsWith(String.valueOf(SLASH))) + sharePath = sharePath.substring(0, sharePath.length() - 1); + int i = sharePath.indexOf(SLASH); + if (i != -1) + return sharePath.substring(i + 1, sharePath.length()); + else + return EMPTY; + } + + static String escapeForwardSlashes(String hostPath) { + return hostPath.replace('/', SLASH); + } + + static String getParentPath(String sharePath) { + int i = sharePath.lastIndexOf(SLASH); + if (i != -1) { + return sharePath.substring(0, i); + } + return null; + } + + static String getFileName(String sharePath) { + int i = sharePath.lastIndexOf(SLASH); + if (i != -1) + return sharePath.substring(i + 1); + return sharePath; + } + + static String join(String parent, String child) { + return parent + SLASH + child; + } + + static String[] getPathListFromOuterToInner(String sharePath) { + String[] split = sharePath.split("\\\\"); + String path = EMPTY; + List l = new ArrayList<>(); + for (String s : split) { + path = path + (path.isEmpty() ? EMPTY : SLASH) + s; + l.add(path); + } + return l.toArray(new String[l.size()]); + } +} diff --git a/src/test/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnectionWithRegularUserItest.java b/src/test/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnectionWithRegularUserItest.java index 2d5c16a5..d7b055c9 100644 --- a/src/test/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnectionWithRegularUserItest.java +++ b/src/test/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnectionWithRegularUserItest.java @@ -41,6 +41,7 @@ import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.CONNECTION_TYPE; import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.PATH_SHARE_MAPPINGS; import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.SMB2_PROTOCOL; +import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.DOMAIN; import static com.xebialabs.overthere.cifs.CifsConnectionType.TELNET; @Test @@ -57,9 +58,10 @@ protected ConnectionOptions getOptions() { ConnectionOptions options = new ConnectionOptions(); options.set(OPERATING_SYSTEM, WINDOWS); options.set(CONNECTION_TYPE, TELNET); - options.set(ADDRESS, WindowsCloudHostListener.getHost().getHostName()); - options.set(USERNAME, REGULAR_WINDOWS_USER_USERNAME); - options.set(PASSWORD, REGULAR_WINDOWS_USER_PASSWORD); + options.set(ADDRESS, "192.168.2.184"); + options.set(USERNAME, "elton"); + options.set(PASSWORD, "metoni1"); + options.set(DOMAIN, "ELTON-PC"); options.set(TEMPORARY_DIRECTORY_PATH, "C:\\overthere\\temp"); options.set(PATH_SHARE_MAPPINGS, ImmutableMap.of("C:\\overthere", "sharethere")); return options; From 7685d88977b0bccb2eb82e75e3307bbd3543994b Mon Sep 17 00:00:00 2001 From: Aditya Kalia Date: Wed, 10 Aug 2016 17:49:11 +0530 Subject: [PATCH 07/40] Reverting connection configuration --- .../telnet/Smb2TelnetConnectionWithRegularUserItest.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/test/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnectionWithRegularUserItest.java b/src/test/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnectionWithRegularUserItest.java index d7b055c9..2d5c16a5 100644 --- a/src/test/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnectionWithRegularUserItest.java +++ b/src/test/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnectionWithRegularUserItest.java @@ -41,7 +41,6 @@ import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.CONNECTION_TYPE; import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.PATH_SHARE_MAPPINGS; import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.SMB2_PROTOCOL; -import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.DOMAIN; import static com.xebialabs.overthere.cifs.CifsConnectionType.TELNET; @Test @@ -58,10 +57,9 @@ protected ConnectionOptions getOptions() { ConnectionOptions options = new ConnectionOptions(); options.set(OPERATING_SYSTEM, WINDOWS); options.set(CONNECTION_TYPE, TELNET); - options.set(ADDRESS, "192.168.2.184"); - options.set(USERNAME, "elton"); - options.set(PASSWORD, "metoni1"); - options.set(DOMAIN, "ELTON-PC"); + options.set(ADDRESS, WindowsCloudHostListener.getHost().getHostName()); + options.set(USERNAME, REGULAR_WINDOWS_USER_USERNAME); + options.set(PASSWORD, REGULAR_WINDOWS_USER_PASSWORD); options.set(TEMPORARY_DIRECTORY_PATH, "C:\\overthere\\temp"); options.set(PATH_SHARE_MAPPINGS, ImmutableMap.of("C:\\overthere", "sharethere")); return options; From 371716cd872ae864bb99f2fc2c0d2ad50a360e7d Mon Sep 17 00:00:00 2001 From: Aditya Kalia Date: Wed, 10 Aug 2016 19:16:50 +0530 Subject: [PATCH 08/40] Updating protocol case --- .../com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java b/src/main/java/com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java index 78919e85..783fbcfc 100644 --- a/src/main/java/com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java +++ b/src/main/java/com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java @@ -38,7 +38,7 @@ @Protocol(name = SMB2_PROTOCOL) public class Smb2ConnectionBuilder extends ConnectionBuilder implements OverthereConnectionBuilder { - public static final String SMB2_PROTOCOL = "SMB2"; + public static final String SMB2_PROTOCOL = "smb2"; /** * The default port for SMB2 connections over TCP/IP From 5e5797047ec06203150f0bec914cf1784cda6312 Mon Sep 17 00:00:00 2001 From: Aditya Kalia Date: Mon, 22 Aug 2016 17:46:35 +0530 Subject: [PATCH 09/40] Refactoring --- libs/smbj-0.0.4-dev.jar | Bin 236381 -> 237278 bytes .../overthere/cifs/CifsConnectionBuilder.java | 4 +--- .../xebialabs/overthere/cifs/PathEncoder.java | 1 + .../cifs/telnet/CifsTelnetConnection.java | 3 ++- .../cifs/winrm/CifsWinRmConnection.java | 3 ++- .../cifs/winrs/CifsWinrsConnection.java | 3 ++- .../{cifs => smb}/ConnectionBuilder.java | 8 +++---- .../{cifs => smb}/ConnectionValidator.java | 3 ++- .../overthere/{cifs => smb}/PathMapper.java | 2 +- .../WinrmHttpsCertificateTrustStrategy.java | 2 +- ...inrmHttpsHostnameVerificationStrategy.java | 2 +- .../telnet/TelnetConnection.java | 2 +- .../{cifs => smb}/winrm/JavaVendor.java | 2 +- .../winrm/KerberosJaasConfiguration.java | 2 +- .../{cifs => smb}/winrm/Namespaces.java | 2 +- .../winrm/ProvidedAuthCallback.java | 2 +- .../winrm/ResponseExtractor.java | 2 +- .../{cifs => smb}/winrm/WinRmClient.java | 8 +++---- .../{cifs => smb}/winrm/WinRmConnection.java | 7 +++--- .../winrm/WinRmRuntimeIOException.java | 2 +- .../winrm/WsmanKerberosScheme.java | 2 +- .../winrm/WsmanKerberosSchemeFactory.java | 2 +- .../winrm/WsmanSPNegoScheme.java | 2 +- .../winrm/WsmanSPNegoSchemeFactory.java | 2 +- .../{cifs => smb}/winrm/soap/Action.java | 2 +- .../{cifs => smb}/winrm/soap/BodyBuilder.java | 2 +- .../winrm/soap/HeaderBuilder.java | 22 ++++++++---------- .../winrm/soap/KeyValuePair.java | 2 +- .../{cifs => smb}/winrm/soap/OptionSet.java | 2 +- .../{cifs => smb}/winrm/soap/ResourceURI.java | 2 +- .../{cifs => smb}/winrm/soap/SoapAction.java | 2 +- .../winrm/soap/SoapMessageBuilder.java | 4 ++-- .../{cifs => smb}/winrm/soap/Soapy.java | 4 ++-- .../{cifs => smb}/winrs/WinrsConnection.java | 2 +- .../overthere/smb2/Smb2ConnectionBuilder.java | 2 +- .../xebialabs/overthere/smb2/Smb2File.java | 17 +++++++++----- .../xebialabs/overthere/smb2/Smb2Paths.java | 2 +- .../smb2/telnet/Smb2TelnetConnection.java | 4 ++-- .../smb2/winrm/Smb2WinRmConnection.java | 4 ++-- .../smb2/winrs/Smb2WinrsConnection.java | 4 ++-- .../overthere/cifs/PathMapperTest.java | 1 + ...nOverHttpsWithAdministrativeUserItest.java | 4 ++-- .../cifs/winrm/ResponseExtractorTest.java | 2 ++ ...onOverHttpWithAdministrativeUserItest.java | 2 +- ...nOverHttpsWithAdministrativeUserItest.java | 6 ++--- 45 files changed, 84 insertions(+), 76 deletions(-) rename src/main/java/com/xebialabs/overthere/{cifs => smb}/ConnectionBuilder.java (96%) rename src/main/java/com/xebialabs/overthere/{cifs => smb}/ConnectionValidator.java (97%) rename src/main/java/com/xebialabs/overthere/{cifs => smb}/PathMapper.java (99%) rename src/main/java/com/xebialabs/overthere/{cifs => smb}/WinrmHttpsCertificateTrustStrategy.java (97%) rename src/main/java/com/xebialabs/overthere/{cifs => smb}/WinrmHttpsHostnameVerificationStrategy.java (97%) rename src/main/java/com/xebialabs/overthere/{cifs => smb}/telnet/TelnetConnection.java (99%) rename src/main/java/com/xebialabs/overthere/{cifs => smb}/winrm/JavaVendor.java (97%) rename src/main/java/com/xebialabs/overthere/{cifs => smb}/winrm/KerberosJaasConfiguration.java (98%) rename src/main/java/com/xebialabs/overthere/{cifs => smb}/winrm/Namespaces.java (98%) rename src/main/java/com/xebialabs/overthere/{cifs => smb}/winrm/ProvidedAuthCallback.java (98%) rename src/main/java/com/xebialabs/overthere/{cifs => smb}/winrm/ResponseExtractor.java (98%) rename src/main/java/com/xebialabs/overthere/{cifs => smb}/winrm/WinRmClient.java (99%) rename src/main/java/com/xebialabs/overthere/{cifs => smb}/winrm/WinRmConnection.java (97%) rename src/main/java/com/xebialabs/overthere/{cifs => smb}/winrm/WinRmRuntimeIOException.java (98%) rename src/main/java/com/xebialabs/overthere/{cifs => smb}/winrm/WsmanKerberosScheme.java (98%) rename src/main/java/com/xebialabs/overthere/{cifs => smb}/winrm/WsmanKerberosSchemeFactory.java (98%) rename src/main/java/com/xebialabs/overthere/{cifs => smb}/winrm/WsmanSPNegoScheme.java (98%) rename src/main/java/com/xebialabs/overthere/{cifs => smb}/winrm/WsmanSPNegoSchemeFactory.java (98%) rename src/main/java/com/xebialabs/overthere/{cifs => smb}/winrm/soap/Action.java (97%) rename src/main/java/com/xebialabs/overthere/{cifs => smb}/winrm/soap/BodyBuilder.java (96%) rename src/main/java/com/xebialabs/overthere/{cifs => smb}/winrm/soap/HeaderBuilder.java (73%) rename src/main/java/com/xebialabs/overthere/{cifs => smb}/winrm/soap/KeyValuePair.java (96%) rename src/main/java/com/xebialabs/overthere/{cifs => smb}/winrm/soap/OptionSet.java (97%) rename src/main/java/com/xebialabs/overthere/{cifs => smb}/winrm/soap/ResourceURI.java (96%) rename src/main/java/com/xebialabs/overthere/{cifs => smb}/winrm/soap/SoapAction.java (96%) rename src/main/java/com/xebialabs/overthere/{cifs => smb}/winrm/soap/SoapMessageBuilder.java (94%) rename src/main/java/com/xebialabs/overthere/{cifs => smb}/winrm/soap/Soapy.java (95%) rename src/main/java/com/xebialabs/overthere/{cifs => smb}/winrs/WinrsConnection.java (99%) diff --git a/libs/smbj-0.0.4-dev.jar b/libs/smbj-0.0.4-dev.jar index 041a56fab138b41648cc2309372a57cf23d85e7a..e6c95b606d60630419299dfbb96e7e3eb1247014 100644 GIT binary patch delta 16495 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 delta 15552 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 diff --git a/src/main/java/com/xebialabs/overthere/cifs/CifsConnectionBuilder.java b/src/main/java/com/xebialabs/overthere/cifs/CifsConnectionBuilder.java index 824a3a79..2559facc 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/CifsConnectionBuilder.java +++ b/src/main/java/com/xebialabs/overthere/cifs/CifsConnectionBuilder.java @@ -22,14 +22,12 @@ */ package com.xebialabs.overthere.cifs; -import java.util.Collections; -import java.util.Map; - import com.xebialabs.overthere.ConnectionOptions; import com.xebialabs.overthere.OverthereConnection; import com.xebialabs.overthere.cifs.telnet.CifsTelnetConnection; import com.xebialabs.overthere.cifs.winrm.CifsWinRmConnection; import com.xebialabs.overthere.cifs.winrs.CifsWinrsConnection; +import com.xebialabs.overthere.smb.ConnectionBuilder; import com.xebialabs.overthere.spi.AddressPortMapper; import com.xebialabs.overthere.spi.OverthereConnectionBuilder; import com.xebialabs.overthere.spi.Protocol; diff --git a/src/main/java/com/xebialabs/overthere/cifs/PathEncoder.java b/src/main/java/com/xebialabs/overthere/cifs/PathEncoder.java index 46f99561..e9757082 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/PathEncoder.java +++ b/src/main/java/com/xebialabs/overthere/cifs/PathEncoder.java @@ -29,6 +29,7 @@ import java.util.regex.Pattern; import com.xebialabs.overthere.RuntimeIOException; +import com.xebialabs.overthere.smb.PathMapper; import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.CIFS_PORT_DEFAULT; import static java.lang.String.format; diff --git a/src/main/java/com/xebialabs/overthere/cifs/telnet/CifsTelnetConnection.java b/src/main/java/com/xebialabs/overthere/cifs/telnet/CifsTelnetConnection.java index 71d37006..b9300e40 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/telnet/CifsTelnetConnection.java +++ b/src/main/java/com/xebialabs/overthere/cifs/telnet/CifsTelnetConnection.java @@ -24,7 +24,8 @@ import com.xebialabs.overthere.*; import com.xebialabs.overthere.cifs.CifsConnection; -import com.xebialabs.overthere.cifs.ConnectionValidator; +import com.xebialabs.overthere.smb.ConnectionValidator; +import com.xebialabs.overthere.smb.telnet.TelnetConnection; import com.xebialabs.overthere.spi.AddressPortMapper; import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.CIFS_PROTOCOL; diff --git a/src/main/java/com/xebialabs/overthere/cifs/winrm/CifsWinRmConnection.java b/src/main/java/com/xebialabs/overthere/cifs/winrm/CifsWinRmConnection.java index c44f2a44..e61e6631 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/winrm/CifsWinRmConnection.java +++ b/src/main/java/com/xebialabs/overthere/cifs/winrm/CifsWinRmConnection.java @@ -27,7 +27,8 @@ import com.xebialabs.overthere.Overthere; import com.xebialabs.overthere.OverthereProcess; import com.xebialabs.overthere.cifs.CifsConnection; -import com.xebialabs.overthere.cifs.ConnectionValidator; +import com.xebialabs.overthere.smb.ConnectionValidator; +import com.xebialabs.overthere.smb.winrm.WinRmConnection; import com.xebialabs.overthere.spi.AddressPortMapper; import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.CIFS_PROTOCOL; diff --git a/src/main/java/com/xebialabs/overthere/cifs/winrs/CifsWinrsConnection.java b/src/main/java/com/xebialabs/overthere/cifs/winrs/CifsWinrsConnection.java index 5574bd4e..43daf118 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/winrs/CifsWinrsConnection.java +++ b/src/main/java/com/xebialabs/overthere/cifs/winrs/CifsWinrsConnection.java @@ -24,7 +24,8 @@ import com.xebialabs.overthere.*; import com.xebialabs.overthere.cifs.CifsConnection; -import com.xebialabs.overthere.cifs.ConnectionValidator; +import com.xebialabs.overthere.smb.ConnectionValidator; +import com.xebialabs.overthere.smb.winrs.WinrsConnection; import com.xebialabs.overthere.spi.AddressPortMapper; import static com.xebialabs.overthere.OperatingSystemFamily.WINDOWS; diff --git a/src/main/java/com/xebialabs/overthere/cifs/ConnectionBuilder.java b/src/main/java/com/xebialabs/overthere/smb/ConnectionBuilder.java similarity index 96% rename from src/main/java/com/xebialabs/overthere/cifs/ConnectionBuilder.java rename to src/main/java/com/xebialabs/overthere/smb/ConnectionBuilder.java index 8cbcbd3e..2b6ef4bf 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/ConnectionBuilder.java +++ b/src/main/java/com/xebialabs/overthere/smb/ConnectionBuilder.java @@ -20,13 +20,11 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.cifs; +package com.xebialabs.overthere.smb; import java.util.Collections; import java.util.Map; -import static com.xebialabs.overthere.cifs.WinrmHttpsCertificateTrustStrategy.STRICT; -import static com.xebialabs.overthere.cifs.WinrmHttpsHostnameVerificationStrategy.BROWSER_COMPATIBLE; import static com.xebialabs.overthere.local.LocalConnection.LOCAL_PROTOCOL; public abstract class ConnectionBuilder { @@ -89,7 +87,7 @@ public abstract class ConnectionBuilder { /** * See the online documentation */ - public static final WinrmHttpsCertificateTrustStrategy WINRM_HTTPS_CERTIFICATE_TRUST_STRATEGY_DEFAULT = STRICT; + public static final WinrmHttpsCertificateTrustStrategy WINRM_HTTPS_CERTIFICATE_TRUST_STRATEGY_DEFAULT = WinrmHttpsCertificateTrustStrategy.STRICT; /** * See the online documentation @@ -99,7 +97,7 @@ public abstract class ConnectionBuilder { /** * See the online documentation */ - public static final WinrmHttpsHostnameVerificationStrategy WINRM_HTTPS_HOSTNAME_VERIFICATION_STRATEGY_DEFAULT = BROWSER_COMPATIBLE; + public static final WinrmHttpsHostnameVerificationStrategy WINRM_HTTPS_HOSTNAME_VERIFICATION_STRATEGY_DEFAULT = WinrmHttpsHostnameVerificationStrategy.BROWSER_COMPATIBLE; /** * See the online documentation diff --git a/src/main/java/com/xebialabs/overthere/cifs/ConnectionValidator.java b/src/main/java/com/xebialabs/overthere/smb/ConnectionValidator.java similarity index 97% rename from src/main/java/com/xebialabs/overthere/cifs/ConnectionValidator.java rename to src/main/java/com/xebialabs/overthere/smb/ConnectionValidator.java index e82b25f0..28765945 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/ConnectionValidator.java +++ b/src/main/java/com/xebialabs/overthere/smb/ConnectionValidator.java @@ -20,9 +20,10 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.cifs; +package com.xebialabs.overthere.smb; import com.xebialabs.overthere.OperatingSystemFamily; +import com.xebialabs.overthere.cifs.CifsConnectionType; import com.xebialabs.overthere.spi.AddressPortMapper; import com.xebialabs.overthere.util.DefaultAddressPortMapper; diff --git a/src/main/java/com/xebialabs/overthere/cifs/PathMapper.java b/src/main/java/com/xebialabs/overthere/smb/PathMapper.java similarity index 99% rename from src/main/java/com/xebialabs/overthere/cifs/PathMapper.java rename to src/main/java/com/xebialabs/overthere/smb/PathMapper.java index b5bf3856..cfd62c1b 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/PathMapper.java +++ b/src/main/java/com/xebialabs/overthere/smb/PathMapper.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.cifs; +package com.xebialabs.overthere.smb; import java.util.*; import java.util.Map.Entry; diff --git a/src/main/java/com/xebialabs/overthere/cifs/WinrmHttpsCertificateTrustStrategy.java b/src/main/java/com/xebialabs/overthere/smb/WinrmHttpsCertificateTrustStrategy.java similarity index 97% rename from src/main/java/com/xebialabs/overthere/cifs/WinrmHttpsCertificateTrustStrategy.java rename to src/main/java/com/xebialabs/overthere/smb/WinrmHttpsCertificateTrustStrategy.java index 0b51eb63..80b33717 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/WinrmHttpsCertificateTrustStrategy.java +++ b/src/main/java/com/xebialabs/overthere/smb/WinrmHttpsCertificateTrustStrategy.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.cifs; +package com.xebialabs.overthere.smb; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; diff --git a/src/main/java/com/xebialabs/overthere/cifs/WinrmHttpsHostnameVerificationStrategy.java b/src/main/java/com/xebialabs/overthere/smb/WinrmHttpsHostnameVerificationStrategy.java similarity index 97% rename from src/main/java/com/xebialabs/overthere/cifs/WinrmHttpsHostnameVerificationStrategy.java rename to src/main/java/com/xebialabs/overthere/smb/WinrmHttpsHostnameVerificationStrategy.java index d1c4b97c..5f5c1fb8 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/WinrmHttpsHostnameVerificationStrategy.java +++ b/src/main/java/com/xebialabs/overthere/smb/WinrmHttpsHostnameVerificationStrategy.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.cifs; +package com.xebialabs.overthere.smb; import org.apache.http.conn.ssl.DefaultHostnameVerifier; import org.apache.http.conn.ssl.NoopHostnameVerifier; diff --git a/src/main/java/com/xebialabs/overthere/cifs/telnet/TelnetConnection.java b/src/main/java/com/xebialabs/overthere/smb/telnet/TelnetConnection.java similarity index 99% rename from src/main/java/com/xebialabs/overthere/cifs/telnet/TelnetConnection.java rename to src/main/java/com/xebialabs/overthere/smb/telnet/TelnetConnection.java index 3a0ec2a0..ef473149 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/telnet/TelnetConnection.java +++ b/src/main/java/com/xebialabs/overthere/smb/telnet/TelnetConnection.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.cifs.telnet; +package com.xebialabs.overthere.smb.telnet; import com.xebialabs.overthere.*; import com.xebialabs.overthere.cifs.CifsConnectionType; diff --git a/src/main/java/com/xebialabs/overthere/cifs/winrm/JavaVendor.java b/src/main/java/com/xebialabs/overthere/smb/winrm/JavaVendor.java similarity index 97% rename from src/main/java/com/xebialabs/overthere/cifs/winrm/JavaVendor.java rename to src/main/java/com/xebialabs/overthere/smb/winrm/JavaVendor.java index cddb233a..ee034b55 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/winrm/JavaVendor.java +++ b/src/main/java/com/xebialabs/overthere/smb/winrm/JavaVendor.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.cifs.winrm; +package com.xebialabs.overthere.smb.winrm; import java.util.HashMap; import javax.security.auth.login.AppConfigurationEntry; diff --git a/src/main/java/com/xebialabs/overthere/cifs/winrm/KerberosJaasConfiguration.java b/src/main/java/com/xebialabs/overthere/smb/winrm/KerberosJaasConfiguration.java similarity index 98% rename from src/main/java/com/xebialabs/overthere/cifs/winrm/KerberosJaasConfiguration.java rename to src/main/java/com/xebialabs/overthere/smb/winrm/KerberosJaasConfiguration.java index c447616b..18071ddf 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/winrm/KerberosJaasConfiguration.java +++ b/src/main/java/com/xebialabs/overthere/smb/winrm/KerberosJaasConfiguration.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.cifs.winrm; +package com.xebialabs.overthere.smb.winrm; import java.util.HashMap; import javax.security.auth.login.AppConfigurationEntry; diff --git a/src/main/java/com/xebialabs/overthere/cifs/winrm/Namespaces.java b/src/main/java/com/xebialabs/overthere/smb/winrm/Namespaces.java similarity index 98% rename from src/main/java/com/xebialabs/overthere/cifs/winrm/Namespaces.java rename to src/main/java/com/xebialabs/overthere/smb/winrm/Namespaces.java index e5b0e331..8c14be52 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/winrm/Namespaces.java +++ b/src/main/java/com/xebialabs/overthere/smb/winrm/Namespaces.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.cifs.winrm; +package com.xebialabs.overthere.smb.winrm; import org.dom4j.Namespace; diff --git a/src/main/java/com/xebialabs/overthere/cifs/winrm/ProvidedAuthCallback.java b/src/main/java/com/xebialabs/overthere/smb/winrm/ProvidedAuthCallback.java similarity index 98% rename from src/main/java/com/xebialabs/overthere/cifs/winrm/ProvidedAuthCallback.java rename to src/main/java/com/xebialabs/overthere/smb/winrm/ProvidedAuthCallback.java index 99ca37b7..3bf74b64 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/winrm/ProvidedAuthCallback.java +++ b/src/main/java/com/xebialabs/overthere/smb/winrm/ProvidedAuthCallback.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.cifs.winrm; +package com.xebialabs.overthere.smb.winrm; import java.io.IOException; import javax.security.auth.callback.Callback; diff --git a/src/main/java/com/xebialabs/overthere/cifs/winrm/ResponseExtractor.java b/src/main/java/com/xebialabs/overthere/smb/winrm/ResponseExtractor.java similarity index 98% rename from src/main/java/com/xebialabs/overthere/cifs/winrm/ResponseExtractor.java rename to src/main/java/com/xebialabs/overthere/smb/winrm/ResponseExtractor.java index 5a1ee8c0..e9f4f937 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/winrm/ResponseExtractor.java +++ b/src/main/java/com/xebialabs/overthere/smb/winrm/ResponseExtractor.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.cifs.winrm; +package com.xebialabs.overthere.smb.winrm; import org.dom4j.DocumentHelper; import org.dom4j.Namespace; diff --git a/src/main/java/com/xebialabs/overthere/cifs/winrm/WinRmClient.java b/src/main/java/com/xebialabs/overthere/smb/winrm/WinRmClient.java similarity index 99% rename from src/main/java/com/xebialabs/overthere/cifs/winrm/WinRmClient.java rename to src/main/java/com/xebialabs/overthere/smb/winrm/WinRmClient.java index 8a9b3706..41489ee4 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/winrm/WinRmClient.java +++ b/src/main/java/com/xebialabs/overthere/smb/winrm/WinRmClient.java @@ -20,11 +20,11 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.cifs.winrm; +package com.xebialabs.overthere.smb.winrm; -import com.xebialabs.overthere.cifs.WinrmHttpsCertificateTrustStrategy; -import com.xebialabs.overthere.cifs.WinrmHttpsHostnameVerificationStrategy; -import com.xebialabs.overthere.cifs.winrm.soap.*; +import com.xebialabs.overthere.smb.WinrmHttpsCertificateTrustStrategy; +import com.xebialabs.overthere.smb.WinrmHttpsHostnameVerificationStrategy; +import com.xebialabs.overthere.smb.winrm.soap.*; import org.apache.commons.codec.binary.Base64; import org.apache.http.Header; import org.apache.http.HttpEntity; diff --git a/src/main/java/com/xebialabs/overthere/cifs/winrm/WinRmConnection.java b/src/main/java/com/xebialabs/overthere/smb/winrm/WinRmConnection.java similarity index 97% rename from src/main/java/com/xebialabs/overthere/cifs/winrm/WinRmConnection.java rename to src/main/java/com/xebialabs/overthere/smb/winrm/WinRmConnection.java index 3a599834..9c3a614e 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/winrm/WinRmConnection.java +++ b/src/main/java/com/xebialabs/overthere/smb/winrm/WinRmConnection.java @@ -20,12 +20,13 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.cifs.winrm; +package com.xebialabs.overthere.smb.winrm; import com.xebialabs.overthere.*; import com.xebialabs.overthere.cifs.CifsConnectionType; -import com.xebialabs.overthere.cifs.WinrmHttpsCertificateTrustStrategy; -import com.xebialabs.overthere.cifs.WinrmHttpsHostnameVerificationStrategy; +import com.xebialabs.overthere.cifs.winrm.CifsWinRmConnection; +import com.xebialabs.overthere.smb.WinrmHttpsCertificateTrustStrategy; +import com.xebialabs.overthere.smb.WinrmHttpsHostnameVerificationStrategy; import com.xebialabs.overthere.spi.AddressPortMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/com/xebialabs/overthere/cifs/winrm/WinRmRuntimeIOException.java b/src/main/java/com/xebialabs/overthere/smb/winrm/WinRmRuntimeIOException.java similarity index 98% rename from src/main/java/com/xebialabs/overthere/cifs/winrm/WinRmRuntimeIOException.java rename to src/main/java/com/xebialabs/overthere/smb/winrm/WinRmRuntimeIOException.java index 5793f609..046e8646 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/winrm/WinRmRuntimeIOException.java +++ b/src/main/java/com/xebialabs/overthere/smb/winrm/WinRmRuntimeIOException.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.cifs.winrm; +package com.xebialabs.overthere.smb.winrm; import java.io.IOException; import java.io.StringWriter; diff --git a/src/main/java/com/xebialabs/overthere/cifs/winrm/WsmanKerberosScheme.java b/src/main/java/com/xebialabs/overthere/smb/winrm/WsmanKerberosScheme.java similarity index 98% rename from src/main/java/com/xebialabs/overthere/cifs/winrm/WsmanKerberosScheme.java rename to src/main/java/com/xebialabs/overthere/smb/winrm/WsmanKerberosScheme.java index a2e2487e..a7a0fcde 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/winrm/WsmanKerberosScheme.java +++ b/src/main/java/com/xebialabs/overthere/smb/winrm/WsmanKerberosScheme.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.cifs.winrm; +package com.xebialabs.overthere.smb.winrm; import org.apache.http.auth.Credentials; import org.apache.http.auth.KerberosCredentials; diff --git a/src/main/java/com/xebialabs/overthere/cifs/winrm/WsmanKerberosSchemeFactory.java b/src/main/java/com/xebialabs/overthere/smb/winrm/WsmanKerberosSchemeFactory.java similarity index 98% rename from src/main/java/com/xebialabs/overthere/cifs/winrm/WsmanKerberosSchemeFactory.java rename to src/main/java/com/xebialabs/overthere/smb/winrm/WsmanKerberosSchemeFactory.java index 41c323fe..bc0b5ee2 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/winrm/WsmanKerberosSchemeFactory.java +++ b/src/main/java/com/xebialabs/overthere/smb/winrm/WsmanKerberosSchemeFactory.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.cifs.winrm; +package com.xebialabs.overthere.smb.winrm; import org.apache.http.auth.AuthScheme; import org.apache.http.impl.auth.KerberosSchemeFactory; diff --git a/src/main/java/com/xebialabs/overthere/cifs/winrm/WsmanSPNegoScheme.java b/src/main/java/com/xebialabs/overthere/smb/winrm/WsmanSPNegoScheme.java similarity index 98% rename from src/main/java/com/xebialabs/overthere/cifs/winrm/WsmanSPNegoScheme.java rename to src/main/java/com/xebialabs/overthere/smb/winrm/WsmanSPNegoScheme.java index 3ee604af..4ac92db9 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/winrm/WsmanSPNegoScheme.java +++ b/src/main/java/com/xebialabs/overthere/smb/winrm/WsmanSPNegoScheme.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.cifs.winrm; +package com.xebialabs.overthere.smb.winrm; import org.apache.http.auth.Credentials; import org.apache.http.auth.KerberosCredentials; diff --git a/src/main/java/com/xebialabs/overthere/cifs/winrm/WsmanSPNegoSchemeFactory.java b/src/main/java/com/xebialabs/overthere/smb/winrm/WsmanSPNegoSchemeFactory.java similarity index 98% rename from src/main/java/com/xebialabs/overthere/cifs/winrm/WsmanSPNegoSchemeFactory.java rename to src/main/java/com/xebialabs/overthere/smb/winrm/WsmanSPNegoSchemeFactory.java index 674fb4c6..bf6483af 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/winrm/WsmanSPNegoSchemeFactory.java +++ b/src/main/java/com/xebialabs/overthere/smb/winrm/WsmanSPNegoSchemeFactory.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.cifs.winrm; +package com.xebialabs.overthere.smb.winrm; import org.apache.http.auth.AuthScheme; import org.apache.http.impl.auth.SPNegoSchemeFactory; diff --git a/src/main/java/com/xebialabs/overthere/cifs/winrm/soap/Action.java b/src/main/java/com/xebialabs/overthere/smb/winrm/soap/Action.java similarity index 97% rename from src/main/java/com/xebialabs/overthere/cifs/winrm/soap/Action.java rename to src/main/java/com/xebialabs/overthere/smb/winrm/soap/Action.java index 1b86201c..51dff8e5 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/winrm/soap/Action.java +++ b/src/main/java/com/xebialabs/overthere/smb/winrm/soap/Action.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.cifs.winrm.soap; +package com.xebialabs.overthere.smb.winrm.soap; import java.net.URI; diff --git a/src/main/java/com/xebialabs/overthere/cifs/winrm/soap/BodyBuilder.java b/src/main/java/com/xebialabs/overthere/smb/winrm/soap/BodyBuilder.java similarity index 96% rename from src/main/java/com/xebialabs/overthere/cifs/winrm/soap/BodyBuilder.java rename to src/main/java/com/xebialabs/overthere/smb/winrm/soap/BodyBuilder.java index b9558ae8..cf3e2315 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/winrm/soap/BodyBuilder.java +++ b/src/main/java/com/xebialabs/overthere/smb/winrm/soap/BodyBuilder.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.cifs.winrm.soap; +package com.xebialabs.overthere.smb.winrm.soap; import org.dom4j.Element; diff --git a/src/main/java/com/xebialabs/overthere/cifs/winrm/soap/HeaderBuilder.java b/src/main/java/com/xebialabs/overthere/smb/winrm/soap/HeaderBuilder.java similarity index 73% rename from src/main/java/com/xebialabs/overthere/cifs/winrm/soap/HeaderBuilder.java rename to src/main/java/com/xebialabs/overthere/smb/winrm/soap/HeaderBuilder.java index cc88385e..aa2e12ca 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/winrm/soap/HeaderBuilder.java +++ b/src/main/java/com/xebialabs/overthere/smb/winrm/soap/HeaderBuilder.java @@ -20,18 +20,16 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.cifs.winrm.soap; +package com.xebialabs.overthere.smb.winrm.soap; import java.net.URI; import java.util.List; import org.dom4j.Element; import org.dom4j.QName; -import static com.xebialabs.overthere.cifs.winrm.Namespaces.NS_ADDRESSING; -import static com.xebialabs.overthere.cifs.winrm.Namespaces.NS_WSMAN_DMTF; -import static com.xebialabs.overthere.cifs.winrm.Namespaces.NS_WSMAN_MSFT; -import static com.xebialabs.overthere.cifs.winrm.soap.Soapy.mustUnderstand; -import static com.xebialabs.overthere.cifs.winrm.soap.Soapy.needNotUnderstand; +import static com.xebialabs.overthere.smb.winrm.Namespaces.NS_ADDRESSING; +import static com.xebialabs.overthere.smb.winrm.Namespaces.NS_WSMAN_DMTF; +import static com.xebialabs.overthere.smb.winrm.Namespaces.NS_WSMAN_MSFT; public class HeaderBuilder { private Element header; @@ -47,12 +45,12 @@ public HeaderBuilder to(URI address) { public HeaderBuilder replyTo(URI address) { final Element replyTo = header.addElement(QName.get("ReplyTo", NS_ADDRESSING)); - mustUnderstand(replyTo.addElement(QName.get("Address", NS_ADDRESSING))).addText(address.toString()); + Soapy.mustUnderstand(replyTo.addElement(QName.get("Address", NS_ADDRESSING))).addText(address.toString()); return this; } public HeaderBuilder maxEnvelopeSize(int size) { - mustUnderstand(header.addElement(QName.get("MaxEnvelopeSize", NS_WSMAN_DMTF))).addText("" + size); + Soapy.mustUnderstand(header.addElement(QName.get("MaxEnvelopeSize", NS_WSMAN_DMTF))).addText("" + size); return this; } @@ -62,8 +60,8 @@ public HeaderBuilder withId(String id) { } public HeaderBuilder withLocale(String locale) { - needNotUnderstand(header.addElement(QName.get("Locale", NS_WSMAN_DMTF))).addAttribute("xml:lang", locale); - needNotUnderstand(header.addElement(QName.get("DataLocale", NS_WSMAN_MSFT))).addAttribute("xml:lang", locale); + Soapy.needNotUnderstand(header.addElement(QName.get("Locale", NS_WSMAN_DMTF))).addAttribute("xml:lang", locale); + Soapy.needNotUnderstand(header.addElement(QName.get("DataLocale", NS_WSMAN_MSFT))).addAttribute("xml:lang", locale); return this; } @@ -73,7 +71,7 @@ public HeaderBuilder withTimeout(String timeout) { } public HeaderBuilder withAction(URI uri) { - mustUnderstand(header.addElement(QName.get("Action", NS_ADDRESSING))).addText(uri.toString()); + Soapy.mustUnderstand(header.addElement(QName.get("Action", NS_ADDRESSING))).addText(uri.toString()); return this; } @@ -85,7 +83,7 @@ public HeaderBuilder withShellId(String shellId) { } public HeaderBuilder withResourceURI(URI uri) { - mustUnderstand(header.addElement(QName.get("ResourceURI", NS_WSMAN_DMTF))).addText(uri.toString()); + Soapy.mustUnderstand(header.addElement(QName.get("ResourceURI", NS_WSMAN_DMTF))).addText(uri.toString()); return this; } diff --git a/src/main/java/com/xebialabs/overthere/cifs/winrm/soap/KeyValuePair.java b/src/main/java/com/xebialabs/overthere/smb/winrm/soap/KeyValuePair.java similarity index 96% rename from src/main/java/com/xebialabs/overthere/cifs/winrm/soap/KeyValuePair.java rename to src/main/java/com/xebialabs/overthere/smb/winrm/soap/KeyValuePair.java index 18074498..02255c30 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/winrm/soap/KeyValuePair.java +++ b/src/main/java/com/xebialabs/overthere/smb/winrm/soap/KeyValuePair.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.cifs.winrm.soap; +package com.xebialabs.overthere.smb.winrm.soap; public class KeyValuePair { diff --git a/src/main/java/com/xebialabs/overthere/cifs/winrm/soap/OptionSet.java b/src/main/java/com/xebialabs/overthere/smb/winrm/soap/OptionSet.java similarity index 97% rename from src/main/java/com/xebialabs/overthere/cifs/winrm/soap/OptionSet.java rename to src/main/java/com/xebialabs/overthere/smb/winrm/soap/OptionSet.java index 40507f25..61154b04 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/winrm/soap/OptionSet.java +++ b/src/main/java/com/xebialabs/overthere/smb/winrm/soap/OptionSet.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.cifs.winrm.soap; +package com.xebialabs.overthere.smb.winrm.soap; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/xebialabs/overthere/cifs/winrm/soap/ResourceURI.java b/src/main/java/com/xebialabs/overthere/smb/winrm/soap/ResourceURI.java similarity index 96% rename from src/main/java/com/xebialabs/overthere/cifs/winrm/soap/ResourceURI.java rename to src/main/java/com/xebialabs/overthere/smb/winrm/soap/ResourceURI.java index bbb66f24..02f21896 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/winrm/soap/ResourceURI.java +++ b/src/main/java/com/xebialabs/overthere/smb/winrm/soap/ResourceURI.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.cifs.winrm.soap; +package com.xebialabs.overthere.smb.winrm.soap; import java.net.URI; import java.net.URISyntaxException; diff --git a/src/main/java/com/xebialabs/overthere/cifs/winrm/soap/SoapAction.java b/src/main/java/com/xebialabs/overthere/smb/winrm/soap/SoapAction.java similarity index 96% rename from src/main/java/com/xebialabs/overthere/cifs/winrm/soap/SoapAction.java rename to src/main/java/com/xebialabs/overthere/smb/winrm/soap/SoapAction.java index 623144fc..9021f0d5 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/winrm/soap/SoapAction.java +++ b/src/main/java/com/xebialabs/overthere/smb/winrm/soap/SoapAction.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.cifs.winrm.soap; +package com.xebialabs.overthere.smb.winrm.soap; public enum SoapAction { diff --git a/src/main/java/com/xebialabs/overthere/cifs/winrm/soap/SoapMessageBuilder.java b/src/main/java/com/xebialabs/overthere/smb/winrm/soap/SoapMessageBuilder.java similarity index 94% rename from src/main/java/com/xebialabs/overthere/cifs/winrm/soap/SoapMessageBuilder.java rename to src/main/java/com/xebialabs/overthere/smb/winrm/soap/SoapMessageBuilder.java index 65f516ec..c7dcb5d9 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/winrm/soap/SoapMessageBuilder.java +++ b/src/main/java/com/xebialabs/overthere/smb/winrm/soap/SoapMessageBuilder.java @@ -20,14 +20,14 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.cifs.winrm.soap; +package com.xebialabs.overthere.smb.winrm.soap; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.QName; -import static com.xebialabs.overthere.cifs.winrm.Namespaces.NS_SOAP_ENV; +import static com.xebialabs.overthere.smb.winrm.Namespaces.NS_SOAP_ENV; public class SoapMessageBuilder { diff --git a/src/main/java/com/xebialabs/overthere/cifs/winrm/soap/Soapy.java b/src/main/java/com/xebialabs/overthere/smb/winrm/soap/Soapy.java similarity index 95% rename from src/main/java/com/xebialabs/overthere/cifs/winrm/soap/Soapy.java rename to src/main/java/com/xebialabs/overthere/smb/winrm/soap/Soapy.java index 47ecf8db..07de90a5 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/winrm/soap/Soapy.java +++ b/src/main/java/com/xebialabs/overthere/smb/winrm/soap/Soapy.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.cifs.winrm.soap; +package com.xebialabs.overthere.smb.winrm.soap; import java.io.IOException; import java.io.StringWriter; @@ -31,7 +31,7 @@ import org.dom4j.io.OutputFormat; import org.dom4j.io.XMLWriter; -import com.xebialabs.overthere.cifs.winrm.WinRmRuntimeIOException; +import com.xebialabs.overthere.smb.winrm.WinRmRuntimeIOException; public class Soapy { private Soapy() { diff --git a/src/main/java/com/xebialabs/overthere/cifs/winrs/WinrsConnection.java b/src/main/java/com/xebialabs/overthere/smb/winrs/WinrsConnection.java similarity index 99% rename from src/main/java/com/xebialabs/overthere/cifs/winrs/WinrsConnection.java rename to src/main/java/com/xebialabs/overthere/smb/winrs/WinrsConnection.java index 92a7ea58..4db2a205 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/winrs/WinrsConnection.java +++ b/src/main/java/com/xebialabs/overthere/smb/winrs/WinrsConnection.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.cifs.winrs; +package com.xebialabs.overthere.smb.winrs; import com.xebialabs.overthere.*; import com.xebialabs.overthere.cifs.CifsConnectionType; diff --git a/src/main/java/com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java b/src/main/java/com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java index 783fbcfc..d25c37e9 100644 --- a/src/main/java/com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java +++ b/src/main/java/com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java @@ -25,7 +25,7 @@ import com.xebialabs.overthere.ConnectionOptions; import com.xebialabs.overthere.OverthereConnection; import com.xebialabs.overthere.cifs.CifsConnectionType; -import com.xebialabs.overthere.cifs.ConnectionBuilder; +import com.xebialabs.overthere.smb.ConnectionBuilder; import com.xebialabs.overthere.smb2.telnet.Smb2TelnetConnection; import com.xebialabs.overthere.smb2.winrm.Smb2WinRmConnection; import com.xebialabs.overthere.smb2.winrs.Smb2WinrsConnection; diff --git a/src/main/java/com/xebialabs/overthere/smb2/Smb2File.java b/src/main/java/com/xebialabs/overthere/smb2/Smb2File.java index 233db7d5..dc1ef447 100644 --- a/src/main/java/com/xebialabs/overthere/smb2/Smb2File.java +++ b/src/main/java/com/xebialabs/overthere/smb2/Smb2File.java @@ -255,11 +255,16 @@ public void delete() { @Override public void deleteRecursively() { String sharePath = getPathOnShare(); - logger.debug("deleting directory recursively {}", sharePath); - try { - getShare().rmdir(sharePath, true); - } catch (TransportException e) { - throw new RuntimeIOException(format("Cannot delete recursively %s: %s", sharePath, e.toString()), e); + if (isFile()) { + logger.debug("deleting file {}", sharePath); + delete(); + } else { + logger.debug("deleting directory recursively {}", sharePath); + try { + getShare().rmdir(sharePath, true); + } catch (TransportException e) { + throw new RuntimeIOException(format("Cannot delete recursively %s: %s", sharePath, e.toString()), e); + } } } @@ -301,7 +306,7 @@ private void makeDirectory(String path) { public void mkdirs() { String sharePath = getPathOnShare(); logger.debug("Creating directories {}", sharePath); - String [] paths = Smb2Paths.getPathListFromOuterToInner(sharePath); + String[] paths = Smb2Paths.getPathListFromOuterToInner(sharePath); for (String p : paths) { if (!getShare().folderExists(p)) makeDirectory(p); diff --git a/src/main/java/com/xebialabs/overthere/smb2/Smb2Paths.java b/src/main/java/com/xebialabs/overthere/smb2/Smb2Paths.java index f16640b5..4b81c8b9 100644 --- a/src/main/java/com/xebialabs/overthere/smb2/Smb2Paths.java +++ b/src/main/java/com/xebialabs/overthere/smb2/Smb2Paths.java @@ -22,7 +22,7 @@ */ package com.xebialabs.overthere.smb2; -import com.xebialabs.overthere.cifs.PathMapper; +import com.xebialabs.overthere.smb.PathMapper; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnection.java b/src/main/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnection.java index d014fdac..320a2243 100644 --- a/src/main/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnection.java +++ b/src/main/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnection.java @@ -23,8 +23,8 @@ package com.xebialabs.overthere.smb2.telnet; import com.xebialabs.overthere.*; -import com.xebialabs.overthere.cifs.ConnectionValidator; -import com.xebialabs.overthere.cifs.telnet.TelnetConnection; +import com.xebialabs.overthere.smb.ConnectionValidator; +import com.xebialabs.overthere.smb.telnet.TelnetConnection; import com.xebialabs.overthere.smb2.Smb2Connection; import com.xebialabs.overthere.spi.AddressPortMapper; diff --git a/src/main/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnection.java b/src/main/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnection.java index 5757cd8f..bc2ecaeb 100644 --- a/src/main/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnection.java +++ b/src/main/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnection.java @@ -26,8 +26,8 @@ import com.xebialabs.overthere.ConnectionOptions; import com.xebialabs.overthere.Overthere; import com.xebialabs.overthere.OverthereProcess; -import com.xebialabs.overthere.cifs.ConnectionValidator; -import com.xebialabs.overthere.cifs.winrm.WinRmConnection; +import com.xebialabs.overthere.smb.ConnectionValidator; +import com.xebialabs.overthere.smb.winrm.WinRmConnection; import com.xebialabs.overthere.smb2.Smb2Connection; import com.xebialabs.overthere.spi.AddressPortMapper; diff --git a/src/main/java/com/xebialabs/overthere/smb2/winrs/Smb2WinrsConnection.java b/src/main/java/com/xebialabs/overthere/smb2/winrs/Smb2WinrsConnection.java index 24ad337d..f2d77747 100644 --- a/src/main/java/com/xebialabs/overthere/smb2/winrs/Smb2WinrsConnection.java +++ b/src/main/java/com/xebialabs/overthere/smb2/winrs/Smb2WinrsConnection.java @@ -23,8 +23,8 @@ package com.xebialabs.overthere.smb2.winrs; import com.xebialabs.overthere.*; -import com.xebialabs.overthere.cifs.ConnectionValidator; -import com.xebialabs.overthere.cifs.winrs.WinrsConnection; +import com.xebialabs.overthere.smb.ConnectionValidator; +import com.xebialabs.overthere.smb.winrs.WinrsConnection; import com.xebialabs.overthere.smb2.Smb2Connection; import com.xebialabs.overthere.spi.AddressPortMapper; diff --git a/src/test/java/com/xebialabs/overthere/cifs/PathMapperTest.java b/src/test/java/com/xebialabs/overthere/cifs/PathMapperTest.java index 1eab55ec..3a184acf 100644 --- a/src/test/java/com/xebialabs/overthere/cifs/PathMapperTest.java +++ b/src/test/java/com/xebialabs/overthere/cifs/PathMapperTest.java @@ -22,6 +22,7 @@ */ package com.xebialabs.overthere.cifs; +import com.xebialabs.overthere.smb.PathMapper; import org.testng.annotations.Test; import com.google.common.collect.ImmutableMap; diff --git a/src/test/java/com/xebialabs/overthere/cifs/winrm/CifsWinRmConnectionOverHttpsWithAdministrativeUserItest.java b/src/test/java/com/xebialabs/overthere/cifs/winrm/CifsWinRmConnectionOverHttpsWithAdministrativeUserItest.java index c9f7422f..36e57f6c 100644 --- a/src/test/java/com/xebialabs/overthere/cifs/winrm/CifsWinRmConnectionOverHttpsWithAdministrativeUserItest.java +++ b/src/test/java/com/xebialabs/overthere/cifs/winrm/CifsWinRmConnectionOverHttpsWithAdministrativeUserItest.java @@ -27,8 +27,8 @@ import com.xebialabs.overthere.ConnectionOptions; import com.xebialabs.overthere.WindowsCloudHostListener; -import com.xebialabs.overthere.cifs.WinrmHttpsCertificateTrustStrategy; -import com.xebialabs.overthere.cifs.WinrmHttpsHostnameVerificationStrategy; +import com.xebialabs.overthere.smb.WinrmHttpsCertificateTrustStrategy; +import com.xebialabs.overthere.smb.WinrmHttpsHostnameVerificationStrategy; import com.xebialabs.overthere.itest.OverthereConnectionItestBase; import static com.xebialabs.overthere.ConnectionOptions.ADDRESS; diff --git a/src/test/java/com/xebialabs/overthere/cifs/winrm/ResponseExtractorTest.java b/src/test/java/com/xebialabs/overthere/cifs/winrm/ResponseExtractorTest.java index c55983c7..8b701720 100644 --- a/src/test/java/com/xebialabs/overthere/cifs/winrm/ResponseExtractorTest.java +++ b/src/test/java/com/xebialabs/overthere/cifs/winrm/ResponseExtractorTest.java @@ -26,6 +26,8 @@ import java.net.URL; import java.nio.charset.Charset; import java.util.List; + +import com.xebialabs.overthere.smb.winrm.ResponseExtractor; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; diff --git a/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpWithAdministrativeUserItest.java b/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpWithAdministrativeUserItest.java index cd93e679..2d62d844 100644 --- a/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpWithAdministrativeUserItest.java +++ b/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpWithAdministrativeUserItest.java @@ -35,7 +35,7 @@ import static com.xebialabs.overthere.WindowsCloudHostListener.ADMINISTRATIVE_WINDOWS_USER_PASSWORD; import static com.xebialabs.overthere.WindowsCloudHostListener.ADMINISTRATIVE_WINDOWS_USER_USERNAME; import static com.xebialabs.overthere.cifs.CifsConnectionType.WINRM_INTERNAL; -import static com.xebialabs.overthere.cifs.ConnectionBuilder.CONNECTION_TYPE; +import static com.xebialabs.overthere.smb.ConnectionBuilder.CONNECTION_TYPE; import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.SMB2_PROTOCOL; @Test diff --git a/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpsWithAdministrativeUserItest.java b/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpsWithAdministrativeUserItest.java index ba7ae41e..316cca5d 100644 --- a/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpsWithAdministrativeUserItest.java +++ b/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpsWithAdministrativeUserItest.java @@ -23,8 +23,8 @@ package com.xebialabs.overthere.smb2.winrm; import com.xebialabs.overthere.ConnectionOptions; -import com.xebialabs.overthere.cifs.WinrmHttpsCertificateTrustStrategy; -import com.xebialabs.overthere.cifs.WinrmHttpsHostnameVerificationStrategy; +import com.xebialabs.overthere.smb.WinrmHttpsCertificateTrustStrategy; +import com.xebialabs.overthere.smb.WinrmHttpsHostnameVerificationStrategy; import com.xebialabs.overthere.itest.OverthereConnectionItestBase; import org.testng.annotations.Listeners; import org.testng.annotations.Test; @@ -36,7 +36,7 @@ import static com.xebialabs.overthere.WindowsCloudHostListener.ADMINISTRATIVE_WINDOWS_USER_PASSWORD; import static com.xebialabs.overthere.WindowsCloudHostListener.ADMINISTRATIVE_WINDOWS_USER_USERNAME; import static com.xebialabs.overthere.cifs.CifsConnectionType.WINRM_INTERNAL; -import static com.xebialabs.overthere.cifs.ConnectionBuilder.*; +import static com.xebialabs.overthere.smb.ConnectionBuilder.*; import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.SMB2_PROTOCOL; @Test From 8ba25abaf4f020fc8764ca0661b8e5c3fad1513c Mon Sep 17 00:00:00 2001 From: Aditya Kalia Date: Tue, 23 Aug 2016 11:49:37 +0530 Subject: [PATCH 10/40] temp change to validate winssh connection for itest failures --- .../com/xebialabs/overthere/ssh/SshConnectionBuilder.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/xebialabs/overthere/ssh/SshConnectionBuilder.java b/src/main/java/com/xebialabs/overthere/ssh/SshConnectionBuilder.java index 242a56ee..a3a479d0 100644 --- a/src/main/java/com/xebialabs/overthere/ssh/SshConnectionBuilder.java +++ b/src/main/java/com/xebialabs/overthere/ssh/SshConnectionBuilder.java @@ -524,7 +524,11 @@ public SshConnectionBuilder(String type, ConnectionOptions options, AddressPortM @Override public OverthereConnection connect() { - connection.connect(); + try { + connection.connect(); + } catch (Exception e) { + connection.connect(); + } return connection; } From e206376b0474e4d1fae425b716c4cc69a8a56007 Mon Sep 17 00:00:00 2001 From: Aditya Kalia Date: Tue, 23 Aug 2016 19:28:18 +0530 Subject: [PATCH 11/40] Fixing test cases --- .../com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java | 2 +- src/main/java/com/xebialabs/overthere/smb2/Smb2File.java | 6 +++--- ...2WinRmConnectionOverHttpWithAdministrativeUserItest.java | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java b/src/main/java/com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java index d25c37e9..5d31206c 100644 --- a/src/main/java/com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java +++ b/src/main/java/com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java @@ -48,7 +48,7 @@ public class Smb2ConnectionBuilder extends ConnectionBuilder implements Overther public static final String SMB2_PORT = "cifsPort"; /** - * The Windows Domain to authenticate the user against. If not set, bla bla bla + * The Windows Domain to authenticate the user against. If not set blank value will be used */ public static final String DOMAIN = "domain"; diff --git a/src/main/java/com/xebialabs/overthere/smb2/Smb2File.java b/src/main/java/com/xebialabs/overthere/smb2/Smb2File.java index dc1ef447..6b9611c4 100644 --- a/src/main/java/com/xebialabs/overthere/smb2/Smb2File.java +++ b/src/main/java/com/xebialabs/overthere/smb2/Smb2File.java @@ -90,17 +90,17 @@ public boolean exists() { @Override public boolean canRead() { - return checkAccessMask(AccessMask.GENERIC_READ); + return checkAccessMask(AccessMask.FILE_READ_DATA); } @Override public boolean canWrite() { - return checkAccessMask(AccessMask.GENERIC_WRITE); + return checkAccessMask(AccessMask.FILE_APPEND_DATA); } @Override public boolean canExecute() { - return checkAccessMask(AccessMask.GENERIC_EXECUTE); + return canRead(); } @Override diff --git a/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpWithAdministrativeUserItest.java b/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpWithAdministrativeUserItest.java index 2d62d844..e8a2ece0 100644 --- a/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpWithAdministrativeUserItest.java +++ b/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpWithAdministrativeUserItest.java @@ -60,6 +60,6 @@ protected ConnectionOptions getOptions() { @Override protected String getExpectedConnectionClassName() { - return CifsWinRmConnection.class.getName(); + return Smb2WinRmConnection.class.getName(); } } From a4bd156527bf9c9a667ca66852972dd17c445ab7 Mon Sep 17 00:00:00 2001 From: Aditya Kalia Date: Fri, 2 Sep 2016 12:19:09 +0200 Subject: [PATCH 12/40] Revert "Fixing test cases" This reverts commit e206376b0474e4d1fae425b716c4cc69a8a56007. --- .../com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java | 2 +- src/main/java/com/xebialabs/overthere/smb2/Smb2File.java | 6 +++--- ...2WinRmConnectionOverHttpWithAdministrativeUserItest.java | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java b/src/main/java/com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java index 5d31206c..d25c37e9 100644 --- a/src/main/java/com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java +++ b/src/main/java/com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java @@ -48,7 +48,7 @@ public class Smb2ConnectionBuilder extends ConnectionBuilder implements Overther public static final String SMB2_PORT = "cifsPort"; /** - * The Windows Domain to authenticate the user against. If not set blank value will be used + * The Windows Domain to authenticate the user against. If not set, bla bla bla */ public static final String DOMAIN = "domain"; diff --git a/src/main/java/com/xebialabs/overthere/smb2/Smb2File.java b/src/main/java/com/xebialabs/overthere/smb2/Smb2File.java index 6b9611c4..dc1ef447 100644 --- a/src/main/java/com/xebialabs/overthere/smb2/Smb2File.java +++ b/src/main/java/com/xebialabs/overthere/smb2/Smb2File.java @@ -90,17 +90,17 @@ public boolean exists() { @Override public boolean canRead() { - return checkAccessMask(AccessMask.FILE_READ_DATA); + return checkAccessMask(AccessMask.GENERIC_READ); } @Override public boolean canWrite() { - return checkAccessMask(AccessMask.FILE_APPEND_DATA); + return checkAccessMask(AccessMask.GENERIC_WRITE); } @Override public boolean canExecute() { - return canRead(); + return checkAccessMask(AccessMask.GENERIC_EXECUTE); } @Override diff --git a/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpWithAdministrativeUserItest.java b/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpWithAdministrativeUserItest.java index e8a2ece0..2d62d844 100644 --- a/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpWithAdministrativeUserItest.java +++ b/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpWithAdministrativeUserItest.java @@ -60,6 +60,6 @@ protected ConnectionOptions getOptions() { @Override protected String getExpectedConnectionClassName() { - return Smb2WinRmConnection.class.getName(); + return CifsWinRmConnection.class.getName(); } } From 56128a3a88a7450a300ef6fadbe24a170ad0cc8b Mon Sep 17 00:00:00 2001 From: Aditya Kalia Date: Fri, 2 Sep 2016 12:19:14 +0200 Subject: [PATCH 13/40] Revert "temp change to validate winssh connection for itest failures" This reverts commit 8ba25abaf4f020fc8764ca0661b8e5c3fad1513c. --- .../com/xebialabs/overthere/ssh/SshConnectionBuilder.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/java/com/xebialabs/overthere/ssh/SshConnectionBuilder.java b/src/main/java/com/xebialabs/overthere/ssh/SshConnectionBuilder.java index a3a479d0..242a56ee 100644 --- a/src/main/java/com/xebialabs/overthere/ssh/SshConnectionBuilder.java +++ b/src/main/java/com/xebialabs/overthere/ssh/SshConnectionBuilder.java @@ -524,11 +524,7 @@ public SshConnectionBuilder(String type, ConnectionOptions options, AddressPortM @Override public OverthereConnection connect() { - try { - connection.connect(); - } catch (Exception e) { - connection.connect(); - } + connection.connect(); return connection; } From 2152bb659eb69b6d39694ce4ab5a5562caed8d76 Mon Sep 17 00:00:00 2001 From: Aditya Kalia Date: Fri, 2 Sep 2016 12:19:21 +0200 Subject: [PATCH 14/40] Revert "Refactoring" This reverts commit 5e5797047ec06203150f0bec914cf1784cda6312. --- libs/smbj-0.0.4-dev.jar | Bin 237278 -> 236381 bytes .../overthere/cifs/CifsConnectionBuilder.java | 4 +++- .../{smb => cifs}/ConnectionBuilder.java | 8 ++++--- .../{smb => cifs}/ConnectionValidator.java | 3 +-- .../xebialabs/overthere/cifs/PathEncoder.java | 1 - .../overthere/{smb => cifs}/PathMapper.java | 2 +- .../WinrmHttpsCertificateTrustStrategy.java | 2 +- ...inrmHttpsHostnameVerificationStrategy.java | 2 +- .../cifs/telnet/CifsTelnetConnection.java | 3 +-- .../telnet/TelnetConnection.java | 2 +- .../cifs/winrm/CifsWinRmConnection.java | 3 +-- .../{smb => cifs}/winrm/JavaVendor.java | 2 +- .../winrm/KerberosJaasConfiguration.java | 2 +- .../{smb => cifs}/winrm/Namespaces.java | 2 +- .../winrm/ProvidedAuthCallback.java | 2 +- .../winrm/ResponseExtractor.java | 2 +- .../{smb => cifs}/winrm/WinRmClient.java | 8 +++---- .../{smb => cifs}/winrm/WinRmConnection.java | 7 +++--- .../winrm/WinRmRuntimeIOException.java | 2 +- .../winrm/WsmanKerberosScheme.java | 2 +- .../winrm/WsmanKerberosSchemeFactory.java | 2 +- .../winrm/WsmanSPNegoScheme.java | 2 +- .../winrm/WsmanSPNegoSchemeFactory.java | 2 +- .../{smb => cifs}/winrm/soap/Action.java | 2 +- .../{smb => cifs}/winrm/soap/BodyBuilder.java | 2 +- .../winrm/soap/HeaderBuilder.java | 22 ++++++++++-------- .../winrm/soap/KeyValuePair.java | 2 +- .../{smb => cifs}/winrm/soap/OptionSet.java | 2 +- .../{smb => cifs}/winrm/soap/ResourceURI.java | 2 +- .../{smb => cifs}/winrm/soap/SoapAction.java | 2 +- .../winrm/soap/SoapMessageBuilder.java | 4 ++-- .../{smb => cifs}/winrm/soap/Soapy.java | 4 ++-- .../cifs/winrs/CifsWinrsConnection.java | 3 +-- .../{smb => cifs}/winrs/WinrsConnection.java | 2 +- .../overthere/smb2/Smb2ConnectionBuilder.java | 2 +- .../xebialabs/overthere/smb2/Smb2File.java | 17 +++++--------- .../xebialabs/overthere/smb2/Smb2Paths.java | 2 +- .../smb2/telnet/Smb2TelnetConnection.java | 4 ++-- .../smb2/winrm/Smb2WinRmConnection.java | 4 ++-- .../smb2/winrs/Smb2WinrsConnection.java | 4 ++-- .../overthere/cifs/PathMapperTest.java | 1 - ...nOverHttpsWithAdministrativeUserItest.java | 4 ++-- .../cifs/winrm/ResponseExtractorTest.java | 2 -- ...onOverHttpWithAdministrativeUserItest.java | 2 +- ...nOverHttpsWithAdministrativeUserItest.java | 6 ++--- 45 files changed, 76 insertions(+), 84 deletions(-) rename src/main/java/com/xebialabs/overthere/{smb => cifs}/ConnectionBuilder.java (96%) rename src/main/java/com/xebialabs/overthere/{smb => cifs}/ConnectionValidator.java (97%) rename src/main/java/com/xebialabs/overthere/{smb => cifs}/PathMapper.java (99%) rename src/main/java/com/xebialabs/overthere/{smb => cifs}/WinrmHttpsCertificateTrustStrategy.java (97%) rename src/main/java/com/xebialabs/overthere/{smb => cifs}/WinrmHttpsHostnameVerificationStrategy.java (97%) rename src/main/java/com/xebialabs/overthere/{smb => cifs}/telnet/TelnetConnection.java (99%) rename src/main/java/com/xebialabs/overthere/{smb => cifs}/winrm/JavaVendor.java (97%) rename src/main/java/com/xebialabs/overthere/{smb => cifs}/winrm/KerberosJaasConfiguration.java (98%) rename src/main/java/com/xebialabs/overthere/{smb => cifs}/winrm/Namespaces.java (98%) rename src/main/java/com/xebialabs/overthere/{smb => cifs}/winrm/ProvidedAuthCallback.java (98%) rename src/main/java/com/xebialabs/overthere/{smb => cifs}/winrm/ResponseExtractor.java (98%) rename src/main/java/com/xebialabs/overthere/{smb => cifs}/winrm/WinRmClient.java (99%) rename src/main/java/com/xebialabs/overthere/{smb => cifs}/winrm/WinRmConnection.java (97%) rename src/main/java/com/xebialabs/overthere/{smb => cifs}/winrm/WinRmRuntimeIOException.java (98%) rename src/main/java/com/xebialabs/overthere/{smb => cifs}/winrm/WsmanKerberosScheme.java (98%) rename src/main/java/com/xebialabs/overthere/{smb => cifs}/winrm/WsmanKerberosSchemeFactory.java (98%) rename src/main/java/com/xebialabs/overthere/{smb => cifs}/winrm/WsmanSPNegoScheme.java (98%) rename src/main/java/com/xebialabs/overthere/{smb => cifs}/winrm/WsmanSPNegoSchemeFactory.java (98%) rename src/main/java/com/xebialabs/overthere/{smb => cifs}/winrm/soap/Action.java (97%) rename src/main/java/com/xebialabs/overthere/{smb => cifs}/winrm/soap/BodyBuilder.java (96%) rename src/main/java/com/xebialabs/overthere/{smb => cifs}/winrm/soap/HeaderBuilder.java (73%) rename src/main/java/com/xebialabs/overthere/{smb => cifs}/winrm/soap/KeyValuePair.java (96%) rename src/main/java/com/xebialabs/overthere/{smb => cifs}/winrm/soap/OptionSet.java (97%) rename src/main/java/com/xebialabs/overthere/{smb => cifs}/winrm/soap/ResourceURI.java (96%) rename src/main/java/com/xebialabs/overthere/{smb => cifs}/winrm/soap/SoapAction.java (96%) rename src/main/java/com/xebialabs/overthere/{smb => cifs}/winrm/soap/SoapMessageBuilder.java (94%) rename src/main/java/com/xebialabs/overthere/{smb => cifs}/winrm/soap/Soapy.java (95%) rename src/main/java/com/xebialabs/overthere/{smb => cifs}/winrs/WinrsConnection.java (99%) diff --git a/libs/smbj-0.0.4-dev.jar b/libs/smbj-0.0.4-dev.jar index e6c95b606d60630419299dfbb96e7e3eb1247014..041a56fab138b41648cc2309372a57cf23d85e7a 100644 GIT binary patch delta 15552 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 delta 16495 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 diff --git a/src/main/java/com/xebialabs/overthere/cifs/CifsConnectionBuilder.java b/src/main/java/com/xebialabs/overthere/cifs/CifsConnectionBuilder.java index 2559facc..824a3a79 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/CifsConnectionBuilder.java +++ b/src/main/java/com/xebialabs/overthere/cifs/CifsConnectionBuilder.java @@ -22,12 +22,14 @@ */ package com.xebialabs.overthere.cifs; +import java.util.Collections; +import java.util.Map; + import com.xebialabs.overthere.ConnectionOptions; import com.xebialabs.overthere.OverthereConnection; import com.xebialabs.overthere.cifs.telnet.CifsTelnetConnection; import com.xebialabs.overthere.cifs.winrm.CifsWinRmConnection; import com.xebialabs.overthere.cifs.winrs.CifsWinrsConnection; -import com.xebialabs.overthere.smb.ConnectionBuilder; import com.xebialabs.overthere.spi.AddressPortMapper; import com.xebialabs.overthere.spi.OverthereConnectionBuilder; import com.xebialabs.overthere.spi.Protocol; diff --git a/src/main/java/com/xebialabs/overthere/smb/ConnectionBuilder.java b/src/main/java/com/xebialabs/overthere/cifs/ConnectionBuilder.java similarity index 96% rename from src/main/java/com/xebialabs/overthere/smb/ConnectionBuilder.java rename to src/main/java/com/xebialabs/overthere/cifs/ConnectionBuilder.java index 2b6ef4bf..8cbcbd3e 100644 --- a/src/main/java/com/xebialabs/overthere/smb/ConnectionBuilder.java +++ b/src/main/java/com/xebialabs/overthere/cifs/ConnectionBuilder.java @@ -20,11 +20,13 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.smb; +package com.xebialabs.overthere.cifs; import java.util.Collections; import java.util.Map; +import static com.xebialabs.overthere.cifs.WinrmHttpsCertificateTrustStrategy.STRICT; +import static com.xebialabs.overthere.cifs.WinrmHttpsHostnameVerificationStrategy.BROWSER_COMPATIBLE; import static com.xebialabs.overthere.local.LocalConnection.LOCAL_PROTOCOL; public abstract class ConnectionBuilder { @@ -87,7 +89,7 @@ public abstract class ConnectionBuilder { /** * See the online documentation */ - public static final WinrmHttpsCertificateTrustStrategy WINRM_HTTPS_CERTIFICATE_TRUST_STRATEGY_DEFAULT = WinrmHttpsCertificateTrustStrategy.STRICT; + public static final WinrmHttpsCertificateTrustStrategy WINRM_HTTPS_CERTIFICATE_TRUST_STRATEGY_DEFAULT = STRICT; /** * See the online documentation @@ -97,7 +99,7 @@ public abstract class ConnectionBuilder { /** * See the online documentation */ - public static final WinrmHttpsHostnameVerificationStrategy WINRM_HTTPS_HOSTNAME_VERIFICATION_STRATEGY_DEFAULT = WinrmHttpsHostnameVerificationStrategy.BROWSER_COMPATIBLE; + public static final WinrmHttpsHostnameVerificationStrategy WINRM_HTTPS_HOSTNAME_VERIFICATION_STRATEGY_DEFAULT = BROWSER_COMPATIBLE; /** * See the online documentation diff --git a/src/main/java/com/xebialabs/overthere/smb/ConnectionValidator.java b/src/main/java/com/xebialabs/overthere/cifs/ConnectionValidator.java similarity index 97% rename from src/main/java/com/xebialabs/overthere/smb/ConnectionValidator.java rename to src/main/java/com/xebialabs/overthere/cifs/ConnectionValidator.java index 28765945..e82b25f0 100644 --- a/src/main/java/com/xebialabs/overthere/smb/ConnectionValidator.java +++ b/src/main/java/com/xebialabs/overthere/cifs/ConnectionValidator.java @@ -20,10 +20,9 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.smb; +package com.xebialabs.overthere.cifs; import com.xebialabs.overthere.OperatingSystemFamily; -import com.xebialabs.overthere.cifs.CifsConnectionType; import com.xebialabs.overthere.spi.AddressPortMapper; import com.xebialabs.overthere.util.DefaultAddressPortMapper; diff --git a/src/main/java/com/xebialabs/overthere/cifs/PathEncoder.java b/src/main/java/com/xebialabs/overthere/cifs/PathEncoder.java index e9757082..46f99561 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/PathEncoder.java +++ b/src/main/java/com/xebialabs/overthere/cifs/PathEncoder.java @@ -29,7 +29,6 @@ import java.util.regex.Pattern; import com.xebialabs.overthere.RuntimeIOException; -import com.xebialabs.overthere.smb.PathMapper; import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.CIFS_PORT_DEFAULT; import static java.lang.String.format; diff --git a/src/main/java/com/xebialabs/overthere/smb/PathMapper.java b/src/main/java/com/xebialabs/overthere/cifs/PathMapper.java similarity index 99% rename from src/main/java/com/xebialabs/overthere/smb/PathMapper.java rename to src/main/java/com/xebialabs/overthere/cifs/PathMapper.java index cfd62c1b..b5bf3856 100644 --- a/src/main/java/com/xebialabs/overthere/smb/PathMapper.java +++ b/src/main/java/com/xebialabs/overthere/cifs/PathMapper.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.smb; +package com.xebialabs.overthere.cifs; import java.util.*; import java.util.Map.Entry; diff --git a/src/main/java/com/xebialabs/overthere/smb/WinrmHttpsCertificateTrustStrategy.java b/src/main/java/com/xebialabs/overthere/cifs/WinrmHttpsCertificateTrustStrategy.java similarity index 97% rename from src/main/java/com/xebialabs/overthere/smb/WinrmHttpsCertificateTrustStrategy.java rename to src/main/java/com/xebialabs/overthere/cifs/WinrmHttpsCertificateTrustStrategy.java index 80b33717..0b51eb63 100644 --- a/src/main/java/com/xebialabs/overthere/smb/WinrmHttpsCertificateTrustStrategy.java +++ b/src/main/java/com/xebialabs/overthere/cifs/WinrmHttpsCertificateTrustStrategy.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.smb; +package com.xebialabs.overthere.cifs; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; diff --git a/src/main/java/com/xebialabs/overthere/smb/WinrmHttpsHostnameVerificationStrategy.java b/src/main/java/com/xebialabs/overthere/cifs/WinrmHttpsHostnameVerificationStrategy.java similarity index 97% rename from src/main/java/com/xebialabs/overthere/smb/WinrmHttpsHostnameVerificationStrategy.java rename to src/main/java/com/xebialabs/overthere/cifs/WinrmHttpsHostnameVerificationStrategy.java index 5f5c1fb8..d1c4b97c 100644 --- a/src/main/java/com/xebialabs/overthere/smb/WinrmHttpsHostnameVerificationStrategy.java +++ b/src/main/java/com/xebialabs/overthere/cifs/WinrmHttpsHostnameVerificationStrategy.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.smb; +package com.xebialabs.overthere.cifs; import org.apache.http.conn.ssl.DefaultHostnameVerifier; import org.apache.http.conn.ssl.NoopHostnameVerifier; diff --git a/src/main/java/com/xebialabs/overthere/cifs/telnet/CifsTelnetConnection.java b/src/main/java/com/xebialabs/overthere/cifs/telnet/CifsTelnetConnection.java index b9300e40..71d37006 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/telnet/CifsTelnetConnection.java +++ b/src/main/java/com/xebialabs/overthere/cifs/telnet/CifsTelnetConnection.java @@ -24,8 +24,7 @@ import com.xebialabs.overthere.*; import com.xebialabs.overthere.cifs.CifsConnection; -import com.xebialabs.overthere.smb.ConnectionValidator; -import com.xebialabs.overthere.smb.telnet.TelnetConnection; +import com.xebialabs.overthere.cifs.ConnectionValidator; import com.xebialabs.overthere.spi.AddressPortMapper; import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.CIFS_PROTOCOL; diff --git a/src/main/java/com/xebialabs/overthere/smb/telnet/TelnetConnection.java b/src/main/java/com/xebialabs/overthere/cifs/telnet/TelnetConnection.java similarity index 99% rename from src/main/java/com/xebialabs/overthere/smb/telnet/TelnetConnection.java rename to src/main/java/com/xebialabs/overthere/cifs/telnet/TelnetConnection.java index ef473149..3a0ec2a0 100644 --- a/src/main/java/com/xebialabs/overthere/smb/telnet/TelnetConnection.java +++ b/src/main/java/com/xebialabs/overthere/cifs/telnet/TelnetConnection.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.smb.telnet; +package com.xebialabs.overthere.cifs.telnet; import com.xebialabs.overthere.*; import com.xebialabs.overthere.cifs.CifsConnectionType; diff --git a/src/main/java/com/xebialabs/overthere/cifs/winrm/CifsWinRmConnection.java b/src/main/java/com/xebialabs/overthere/cifs/winrm/CifsWinRmConnection.java index e61e6631..c44f2a44 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/winrm/CifsWinRmConnection.java +++ b/src/main/java/com/xebialabs/overthere/cifs/winrm/CifsWinRmConnection.java @@ -27,8 +27,7 @@ import com.xebialabs.overthere.Overthere; import com.xebialabs.overthere.OverthereProcess; import com.xebialabs.overthere.cifs.CifsConnection; -import com.xebialabs.overthere.smb.ConnectionValidator; -import com.xebialabs.overthere.smb.winrm.WinRmConnection; +import com.xebialabs.overthere.cifs.ConnectionValidator; import com.xebialabs.overthere.spi.AddressPortMapper; import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.CIFS_PROTOCOL; diff --git a/src/main/java/com/xebialabs/overthere/smb/winrm/JavaVendor.java b/src/main/java/com/xebialabs/overthere/cifs/winrm/JavaVendor.java similarity index 97% rename from src/main/java/com/xebialabs/overthere/smb/winrm/JavaVendor.java rename to src/main/java/com/xebialabs/overthere/cifs/winrm/JavaVendor.java index ee034b55..cddb233a 100644 --- a/src/main/java/com/xebialabs/overthere/smb/winrm/JavaVendor.java +++ b/src/main/java/com/xebialabs/overthere/cifs/winrm/JavaVendor.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.smb.winrm; +package com.xebialabs.overthere.cifs.winrm; import java.util.HashMap; import javax.security.auth.login.AppConfigurationEntry; diff --git a/src/main/java/com/xebialabs/overthere/smb/winrm/KerberosJaasConfiguration.java b/src/main/java/com/xebialabs/overthere/cifs/winrm/KerberosJaasConfiguration.java similarity index 98% rename from src/main/java/com/xebialabs/overthere/smb/winrm/KerberosJaasConfiguration.java rename to src/main/java/com/xebialabs/overthere/cifs/winrm/KerberosJaasConfiguration.java index 18071ddf..c447616b 100644 --- a/src/main/java/com/xebialabs/overthere/smb/winrm/KerberosJaasConfiguration.java +++ b/src/main/java/com/xebialabs/overthere/cifs/winrm/KerberosJaasConfiguration.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.smb.winrm; +package com.xebialabs.overthere.cifs.winrm; import java.util.HashMap; import javax.security.auth.login.AppConfigurationEntry; diff --git a/src/main/java/com/xebialabs/overthere/smb/winrm/Namespaces.java b/src/main/java/com/xebialabs/overthere/cifs/winrm/Namespaces.java similarity index 98% rename from src/main/java/com/xebialabs/overthere/smb/winrm/Namespaces.java rename to src/main/java/com/xebialabs/overthere/cifs/winrm/Namespaces.java index 8c14be52..e5b0e331 100644 --- a/src/main/java/com/xebialabs/overthere/smb/winrm/Namespaces.java +++ b/src/main/java/com/xebialabs/overthere/cifs/winrm/Namespaces.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.smb.winrm; +package com.xebialabs.overthere.cifs.winrm; import org.dom4j.Namespace; diff --git a/src/main/java/com/xebialabs/overthere/smb/winrm/ProvidedAuthCallback.java b/src/main/java/com/xebialabs/overthere/cifs/winrm/ProvidedAuthCallback.java similarity index 98% rename from src/main/java/com/xebialabs/overthere/smb/winrm/ProvidedAuthCallback.java rename to src/main/java/com/xebialabs/overthere/cifs/winrm/ProvidedAuthCallback.java index 3bf74b64..99ca37b7 100644 --- a/src/main/java/com/xebialabs/overthere/smb/winrm/ProvidedAuthCallback.java +++ b/src/main/java/com/xebialabs/overthere/cifs/winrm/ProvidedAuthCallback.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.smb.winrm; +package com.xebialabs.overthere.cifs.winrm; import java.io.IOException; import javax.security.auth.callback.Callback; diff --git a/src/main/java/com/xebialabs/overthere/smb/winrm/ResponseExtractor.java b/src/main/java/com/xebialabs/overthere/cifs/winrm/ResponseExtractor.java similarity index 98% rename from src/main/java/com/xebialabs/overthere/smb/winrm/ResponseExtractor.java rename to src/main/java/com/xebialabs/overthere/cifs/winrm/ResponseExtractor.java index e9f4f937..5a1ee8c0 100644 --- a/src/main/java/com/xebialabs/overthere/smb/winrm/ResponseExtractor.java +++ b/src/main/java/com/xebialabs/overthere/cifs/winrm/ResponseExtractor.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.smb.winrm; +package com.xebialabs.overthere.cifs.winrm; import org.dom4j.DocumentHelper; import org.dom4j.Namespace; diff --git a/src/main/java/com/xebialabs/overthere/smb/winrm/WinRmClient.java b/src/main/java/com/xebialabs/overthere/cifs/winrm/WinRmClient.java similarity index 99% rename from src/main/java/com/xebialabs/overthere/smb/winrm/WinRmClient.java rename to src/main/java/com/xebialabs/overthere/cifs/winrm/WinRmClient.java index 41489ee4..8a9b3706 100644 --- a/src/main/java/com/xebialabs/overthere/smb/winrm/WinRmClient.java +++ b/src/main/java/com/xebialabs/overthere/cifs/winrm/WinRmClient.java @@ -20,11 +20,11 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.smb.winrm; +package com.xebialabs.overthere.cifs.winrm; -import com.xebialabs.overthere.smb.WinrmHttpsCertificateTrustStrategy; -import com.xebialabs.overthere.smb.WinrmHttpsHostnameVerificationStrategy; -import com.xebialabs.overthere.smb.winrm.soap.*; +import com.xebialabs.overthere.cifs.WinrmHttpsCertificateTrustStrategy; +import com.xebialabs.overthere.cifs.WinrmHttpsHostnameVerificationStrategy; +import com.xebialabs.overthere.cifs.winrm.soap.*; import org.apache.commons.codec.binary.Base64; import org.apache.http.Header; import org.apache.http.HttpEntity; diff --git a/src/main/java/com/xebialabs/overthere/smb/winrm/WinRmConnection.java b/src/main/java/com/xebialabs/overthere/cifs/winrm/WinRmConnection.java similarity index 97% rename from src/main/java/com/xebialabs/overthere/smb/winrm/WinRmConnection.java rename to src/main/java/com/xebialabs/overthere/cifs/winrm/WinRmConnection.java index 9c3a614e..3a599834 100644 --- a/src/main/java/com/xebialabs/overthere/smb/winrm/WinRmConnection.java +++ b/src/main/java/com/xebialabs/overthere/cifs/winrm/WinRmConnection.java @@ -20,13 +20,12 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.smb.winrm; +package com.xebialabs.overthere.cifs.winrm; import com.xebialabs.overthere.*; import com.xebialabs.overthere.cifs.CifsConnectionType; -import com.xebialabs.overthere.cifs.winrm.CifsWinRmConnection; -import com.xebialabs.overthere.smb.WinrmHttpsCertificateTrustStrategy; -import com.xebialabs.overthere.smb.WinrmHttpsHostnameVerificationStrategy; +import com.xebialabs.overthere.cifs.WinrmHttpsCertificateTrustStrategy; +import com.xebialabs.overthere.cifs.WinrmHttpsHostnameVerificationStrategy; import com.xebialabs.overthere.spi.AddressPortMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/com/xebialabs/overthere/smb/winrm/WinRmRuntimeIOException.java b/src/main/java/com/xebialabs/overthere/cifs/winrm/WinRmRuntimeIOException.java similarity index 98% rename from src/main/java/com/xebialabs/overthere/smb/winrm/WinRmRuntimeIOException.java rename to src/main/java/com/xebialabs/overthere/cifs/winrm/WinRmRuntimeIOException.java index 046e8646..5793f609 100644 --- a/src/main/java/com/xebialabs/overthere/smb/winrm/WinRmRuntimeIOException.java +++ b/src/main/java/com/xebialabs/overthere/cifs/winrm/WinRmRuntimeIOException.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.smb.winrm; +package com.xebialabs.overthere.cifs.winrm; import java.io.IOException; import java.io.StringWriter; diff --git a/src/main/java/com/xebialabs/overthere/smb/winrm/WsmanKerberosScheme.java b/src/main/java/com/xebialabs/overthere/cifs/winrm/WsmanKerberosScheme.java similarity index 98% rename from src/main/java/com/xebialabs/overthere/smb/winrm/WsmanKerberosScheme.java rename to src/main/java/com/xebialabs/overthere/cifs/winrm/WsmanKerberosScheme.java index a7a0fcde..a2e2487e 100644 --- a/src/main/java/com/xebialabs/overthere/smb/winrm/WsmanKerberosScheme.java +++ b/src/main/java/com/xebialabs/overthere/cifs/winrm/WsmanKerberosScheme.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.smb.winrm; +package com.xebialabs.overthere.cifs.winrm; import org.apache.http.auth.Credentials; import org.apache.http.auth.KerberosCredentials; diff --git a/src/main/java/com/xebialabs/overthere/smb/winrm/WsmanKerberosSchemeFactory.java b/src/main/java/com/xebialabs/overthere/cifs/winrm/WsmanKerberosSchemeFactory.java similarity index 98% rename from src/main/java/com/xebialabs/overthere/smb/winrm/WsmanKerberosSchemeFactory.java rename to src/main/java/com/xebialabs/overthere/cifs/winrm/WsmanKerberosSchemeFactory.java index bc0b5ee2..41c323fe 100644 --- a/src/main/java/com/xebialabs/overthere/smb/winrm/WsmanKerberosSchemeFactory.java +++ b/src/main/java/com/xebialabs/overthere/cifs/winrm/WsmanKerberosSchemeFactory.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.smb.winrm; +package com.xebialabs.overthere.cifs.winrm; import org.apache.http.auth.AuthScheme; import org.apache.http.impl.auth.KerberosSchemeFactory; diff --git a/src/main/java/com/xebialabs/overthere/smb/winrm/WsmanSPNegoScheme.java b/src/main/java/com/xebialabs/overthere/cifs/winrm/WsmanSPNegoScheme.java similarity index 98% rename from src/main/java/com/xebialabs/overthere/smb/winrm/WsmanSPNegoScheme.java rename to src/main/java/com/xebialabs/overthere/cifs/winrm/WsmanSPNegoScheme.java index 4ac92db9..3ee604af 100644 --- a/src/main/java/com/xebialabs/overthere/smb/winrm/WsmanSPNegoScheme.java +++ b/src/main/java/com/xebialabs/overthere/cifs/winrm/WsmanSPNegoScheme.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.smb.winrm; +package com.xebialabs.overthere.cifs.winrm; import org.apache.http.auth.Credentials; import org.apache.http.auth.KerberosCredentials; diff --git a/src/main/java/com/xebialabs/overthere/smb/winrm/WsmanSPNegoSchemeFactory.java b/src/main/java/com/xebialabs/overthere/cifs/winrm/WsmanSPNegoSchemeFactory.java similarity index 98% rename from src/main/java/com/xebialabs/overthere/smb/winrm/WsmanSPNegoSchemeFactory.java rename to src/main/java/com/xebialabs/overthere/cifs/winrm/WsmanSPNegoSchemeFactory.java index bf6483af..674fb4c6 100644 --- a/src/main/java/com/xebialabs/overthere/smb/winrm/WsmanSPNegoSchemeFactory.java +++ b/src/main/java/com/xebialabs/overthere/cifs/winrm/WsmanSPNegoSchemeFactory.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.smb.winrm; +package com.xebialabs.overthere.cifs.winrm; import org.apache.http.auth.AuthScheme; import org.apache.http.impl.auth.SPNegoSchemeFactory; diff --git a/src/main/java/com/xebialabs/overthere/smb/winrm/soap/Action.java b/src/main/java/com/xebialabs/overthere/cifs/winrm/soap/Action.java similarity index 97% rename from src/main/java/com/xebialabs/overthere/smb/winrm/soap/Action.java rename to src/main/java/com/xebialabs/overthere/cifs/winrm/soap/Action.java index 51dff8e5..1b86201c 100644 --- a/src/main/java/com/xebialabs/overthere/smb/winrm/soap/Action.java +++ b/src/main/java/com/xebialabs/overthere/cifs/winrm/soap/Action.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.smb.winrm.soap; +package com.xebialabs.overthere.cifs.winrm.soap; import java.net.URI; diff --git a/src/main/java/com/xebialabs/overthere/smb/winrm/soap/BodyBuilder.java b/src/main/java/com/xebialabs/overthere/cifs/winrm/soap/BodyBuilder.java similarity index 96% rename from src/main/java/com/xebialabs/overthere/smb/winrm/soap/BodyBuilder.java rename to src/main/java/com/xebialabs/overthere/cifs/winrm/soap/BodyBuilder.java index cf3e2315..b9558ae8 100644 --- a/src/main/java/com/xebialabs/overthere/smb/winrm/soap/BodyBuilder.java +++ b/src/main/java/com/xebialabs/overthere/cifs/winrm/soap/BodyBuilder.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.smb.winrm.soap; +package com.xebialabs.overthere.cifs.winrm.soap; import org.dom4j.Element; diff --git a/src/main/java/com/xebialabs/overthere/smb/winrm/soap/HeaderBuilder.java b/src/main/java/com/xebialabs/overthere/cifs/winrm/soap/HeaderBuilder.java similarity index 73% rename from src/main/java/com/xebialabs/overthere/smb/winrm/soap/HeaderBuilder.java rename to src/main/java/com/xebialabs/overthere/cifs/winrm/soap/HeaderBuilder.java index aa2e12ca..cc88385e 100644 --- a/src/main/java/com/xebialabs/overthere/smb/winrm/soap/HeaderBuilder.java +++ b/src/main/java/com/xebialabs/overthere/cifs/winrm/soap/HeaderBuilder.java @@ -20,16 +20,18 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.smb.winrm.soap; +package com.xebialabs.overthere.cifs.winrm.soap; import java.net.URI; import java.util.List; import org.dom4j.Element; import org.dom4j.QName; -import static com.xebialabs.overthere.smb.winrm.Namespaces.NS_ADDRESSING; -import static com.xebialabs.overthere.smb.winrm.Namespaces.NS_WSMAN_DMTF; -import static com.xebialabs.overthere.smb.winrm.Namespaces.NS_WSMAN_MSFT; +import static com.xebialabs.overthere.cifs.winrm.Namespaces.NS_ADDRESSING; +import static com.xebialabs.overthere.cifs.winrm.Namespaces.NS_WSMAN_DMTF; +import static com.xebialabs.overthere.cifs.winrm.Namespaces.NS_WSMAN_MSFT; +import static com.xebialabs.overthere.cifs.winrm.soap.Soapy.mustUnderstand; +import static com.xebialabs.overthere.cifs.winrm.soap.Soapy.needNotUnderstand; public class HeaderBuilder { private Element header; @@ -45,12 +47,12 @@ public HeaderBuilder to(URI address) { public HeaderBuilder replyTo(URI address) { final Element replyTo = header.addElement(QName.get("ReplyTo", NS_ADDRESSING)); - Soapy.mustUnderstand(replyTo.addElement(QName.get("Address", NS_ADDRESSING))).addText(address.toString()); + mustUnderstand(replyTo.addElement(QName.get("Address", NS_ADDRESSING))).addText(address.toString()); return this; } public HeaderBuilder maxEnvelopeSize(int size) { - Soapy.mustUnderstand(header.addElement(QName.get("MaxEnvelopeSize", NS_WSMAN_DMTF))).addText("" + size); + mustUnderstand(header.addElement(QName.get("MaxEnvelopeSize", NS_WSMAN_DMTF))).addText("" + size); return this; } @@ -60,8 +62,8 @@ public HeaderBuilder withId(String id) { } public HeaderBuilder withLocale(String locale) { - Soapy.needNotUnderstand(header.addElement(QName.get("Locale", NS_WSMAN_DMTF))).addAttribute("xml:lang", locale); - Soapy.needNotUnderstand(header.addElement(QName.get("DataLocale", NS_WSMAN_MSFT))).addAttribute("xml:lang", locale); + needNotUnderstand(header.addElement(QName.get("Locale", NS_WSMAN_DMTF))).addAttribute("xml:lang", locale); + needNotUnderstand(header.addElement(QName.get("DataLocale", NS_WSMAN_MSFT))).addAttribute("xml:lang", locale); return this; } @@ -71,7 +73,7 @@ public HeaderBuilder withTimeout(String timeout) { } public HeaderBuilder withAction(URI uri) { - Soapy.mustUnderstand(header.addElement(QName.get("Action", NS_ADDRESSING))).addText(uri.toString()); + mustUnderstand(header.addElement(QName.get("Action", NS_ADDRESSING))).addText(uri.toString()); return this; } @@ -83,7 +85,7 @@ public HeaderBuilder withShellId(String shellId) { } public HeaderBuilder withResourceURI(URI uri) { - Soapy.mustUnderstand(header.addElement(QName.get("ResourceURI", NS_WSMAN_DMTF))).addText(uri.toString()); + mustUnderstand(header.addElement(QName.get("ResourceURI", NS_WSMAN_DMTF))).addText(uri.toString()); return this; } diff --git a/src/main/java/com/xebialabs/overthere/smb/winrm/soap/KeyValuePair.java b/src/main/java/com/xebialabs/overthere/cifs/winrm/soap/KeyValuePair.java similarity index 96% rename from src/main/java/com/xebialabs/overthere/smb/winrm/soap/KeyValuePair.java rename to src/main/java/com/xebialabs/overthere/cifs/winrm/soap/KeyValuePair.java index 02255c30..18074498 100644 --- a/src/main/java/com/xebialabs/overthere/smb/winrm/soap/KeyValuePair.java +++ b/src/main/java/com/xebialabs/overthere/cifs/winrm/soap/KeyValuePair.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.smb.winrm.soap; +package com.xebialabs.overthere.cifs.winrm.soap; public class KeyValuePair { diff --git a/src/main/java/com/xebialabs/overthere/smb/winrm/soap/OptionSet.java b/src/main/java/com/xebialabs/overthere/cifs/winrm/soap/OptionSet.java similarity index 97% rename from src/main/java/com/xebialabs/overthere/smb/winrm/soap/OptionSet.java rename to src/main/java/com/xebialabs/overthere/cifs/winrm/soap/OptionSet.java index 61154b04..40507f25 100644 --- a/src/main/java/com/xebialabs/overthere/smb/winrm/soap/OptionSet.java +++ b/src/main/java/com/xebialabs/overthere/cifs/winrm/soap/OptionSet.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.smb.winrm.soap; +package com.xebialabs.overthere.cifs.winrm.soap; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/xebialabs/overthere/smb/winrm/soap/ResourceURI.java b/src/main/java/com/xebialabs/overthere/cifs/winrm/soap/ResourceURI.java similarity index 96% rename from src/main/java/com/xebialabs/overthere/smb/winrm/soap/ResourceURI.java rename to src/main/java/com/xebialabs/overthere/cifs/winrm/soap/ResourceURI.java index 02f21896..bbb66f24 100644 --- a/src/main/java/com/xebialabs/overthere/smb/winrm/soap/ResourceURI.java +++ b/src/main/java/com/xebialabs/overthere/cifs/winrm/soap/ResourceURI.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.smb.winrm.soap; +package com.xebialabs.overthere.cifs.winrm.soap; import java.net.URI; import java.net.URISyntaxException; diff --git a/src/main/java/com/xebialabs/overthere/smb/winrm/soap/SoapAction.java b/src/main/java/com/xebialabs/overthere/cifs/winrm/soap/SoapAction.java similarity index 96% rename from src/main/java/com/xebialabs/overthere/smb/winrm/soap/SoapAction.java rename to src/main/java/com/xebialabs/overthere/cifs/winrm/soap/SoapAction.java index 9021f0d5..623144fc 100644 --- a/src/main/java/com/xebialabs/overthere/smb/winrm/soap/SoapAction.java +++ b/src/main/java/com/xebialabs/overthere/cifs/winrm/soap/SoapAction.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.smb.winrm.soap; +package com.xebialabs.overthere.cifs.winrm.soap; public enum SoapAction { diff --git a/src/main/java/com/xebialabs/overthere/smb/winrm/soap/SoapMessageBuilder.java b/src/main/java/com/xebialabs/overthere/cifs/winrm/soap/SoapMessageBuilder.java similarity index 94% rename from src/main/java/com/xebialabs/overthere/smb/winrm/soap/SoapMessageBuilder.java rename to src/main/java/com/xebialabs/overthere/cifs/winrm/soap/SoapMessageBuilder.java index c7dcb5d9..65f516ec 100644 --- a/src/main/java/com/xebialabs/overthere/smb/winrm/soap/SoapMessageBuilder.java +++ b/src/main/java/com/xebialabs/overthere/cifs/winrm/soap/SoapMessageBuilder.java @@ -20,14 +20,14 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.smb.winrm.soap; +package com.xebialabs.overthere.cifs.winrm.soap; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.QName; -import static com.xebialabs.overthere.smb.winrm.Namespaces.NS_SOAP_ENV; +import static com.xebialabs.overthere.cifs.winrm.Namespaces.NS_SOAP_ENV; public class SoapMessageBuilder { diff --git a/src/main/java/com/xebialabs/overthere/smb/winrm/soap/Soapy.java b/src/main/java/com/xebialabs/overthere/cifs/winrm/soap/Soapy.java similarity index 95% rename from src/main/java/com/xebialabs/overthere/smb/winrm/soap/Soapy.java rename to src/main/java/com/xebialabs/overthere/cifs/winrm/soap/Soapy.java index 07de90a5..47ecf8db 100644 --- a/src/main/java/com/xebialabs/overthere/smb/winrm/soap/Soapy.java +++ b/src/main/java/com/xebialabs/overthere/cifs/winrm/soap/Soapy.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.smb.winrm.soap; +package com.xebialabs.overthere.cifs.winrm.soap; import java.io.IOException; import java.io.StringWriter; @@ -31,7 +31,7 @@ import org.dom4j.io.OutputFormat; import org.dom4j.io.XMLWriter; -import com.xebialabs.overthere.smb.winrm.WinRmRuntimeIOException; +import com.xebialabs.overthere.cifs.winrm.WinRmRuntimeIOException; public class Soapy { private Soapy() { diff --git a/src/main/java/com/xebialabs/overthere/cifs/winrs/CifsWinrsConnection.java b/src/main/java/com/xebialabs/overthere/cifs/winrs/CifsWinrsConnection.java index 43daf118..5574bd4e 100644 --- a/src/main/java/com/xebialabs/overthere/cifs/winrs/CifsWinrsConnection.java +++ b/src/main/java/com/xebialabs/overthere/cifs/winrs/CifsWinrsConnection.java @@ -24,8 +24,7 @@ import com.xebialabs.overthere.*; import com.xebialabs.overthere.cifs.CifsConnection; -import com.xebialabs.overthere.smb.ConnectionValidator; -import com.xebialabs.overthere.smb.winrs.WinrsConnection; +import com.xebialabs.overthere.cifs.ConnectionValidator; import com.xebialabs.overthere.spi.AddressPortMapper; import static com.xebialabs.overthere.OperatingSystemFamily.WINDOWS; diff --git a/src/main/java/com/xebialabs/overthere/smb/winrs/WinrsConnection.java b/src/main/java/com/xebialabs/overthere/cifs/winrs/WinrsConnection.java similarity index 99% rename from src/main/java/com/xebialabs/overthere/smb/winrs/WinrsConnection.java rename to src/main/java/com/xebialabs/overthere/cifs/winrs/WinrsConnection.java index 4db2a205..92a7ea58 100644 --- a/src/main/java/com/xebialabs/overthere/smb/winrs/WinrsConnection.java +++ b/src/main/java/com/xebialabs/overthere/cifs/winrs/WinrsConnection.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.smb.winrs; +package com.xebialabs.overthere.cifs.winrs; import com.xebialabs.overthere.*; import com.xebialabs.overthere.cifs.CifsConnectionType; diff --git a/src/main/java/com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java b/src/main/java/com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java index d25c37e9..783fbcfc 100644 --- a/src/main/java/com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java +++ b/src/main/java/com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java @@ -25,7 +25,7 @@ import com.xebialabs.overthere.ConnectionOptions; import com.xebialabs.overthere.OverthereConnection; import com.xebialabs.overthere.cifs.CifsConnectionType; -import com.xebialabs.overthere.smb.ConnectionBuilder; +import com.xebialabs.overthere.cifs.ConnectionBuilder; import com.xebialabs.overthere.smb2.telnet.Smb2TelnetConnection; import com.xebialabs.overthere.smb2.winrm.Smb2WinRmConnection; import com.xebialabs.overthere.smb2.winrs.Smb2WinrsConnection; diff --git a/src/main/java/com/xebialabs/overthere/smb2/Smb2File.java b/src/main/java/com/xebialabs/overthere/smb2/Smb2File.java index dc1ef447..233db7d5 100644 --- a/src/main/java/com/xebialabs/overthere/smb2/Smb2File.java +++ b/src/main/java/com/xebialabs/overthere/smb2/Smb2File.java @@ -255,16 +255,11 @@ public void delete() { @Override public void deleteRecursively() { String sharePath = getPathOnShare(); - if (isFile()) { - logger.debug("deleting file {}", sharePath); - delete(); - } else { - logger.debug("deleting directory recursively {}", sharePath); - try { - getShare().rmdir(sharePath, true); - } catch (TransportException e) { - throw new RuntimeIOException(format("Cannot delete recursively %s: %s", sharePath, e.toString()), e); - } + logger.debug("deleting directory recursively {}", sharePath); + try { + getShare().rmdir(sharePath, true); + } catch (TransportException e) { + throw new RuntimeIOException(format("Cannot delete recursively %s: %s", sharePath, e.toString()), e); } } @@ -306,7 +301,7 @@ private void makeDirectory(String path) { public void mkdirs() { String sharePath = getPathOnShare(); logger.debug("Creating directories {}", sharePath); - String[] paths = Smb2Paths.getPathListFromOuterToInner(sharePath); + String [] paths = Smb2Paths.getPathListFromOuterToInner(sharePath); for (String p : paths) { if (!getShare().folderExists(p)) makeDirectory(p); diff --git a/src/main/java/com/xebialabs/overthere/smb2/Smb2Paths.java b/src/main/java/com/xebialabs/overthere/smb2/Smb2Paths.java index 4b81c8b9..f16640b5 100644 --- a/src/main/java/com/xebialabs/overthere/smb2/Smb2Paths.java +++ b/src/main/java/com/xebialabs/overthere/smb2/Smb2Paths.java @@ -22,7 +22,7 @@ */ package com.xebialabs.overthere.smb2; -import com.xebialabs.overthere.smb.PathMapper; +import com.xebialabs.overthere.cifs.PathMapper; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnection.java b/src/main/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnection.java index 320a2243..d014fdac 100644 --- a/src/main/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnection.java +++ b/src/main/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnection.java @@ -23,8 +23,8 @@ package com.xebialabs.overthere.smb2.telnet; import com.xebialabs.overthere.*; -import com.xebialabs.overthere.smb.ConnectionValidator; -import com.xebialabs.overthere.smb.telnet.TelnetConnection; +import com.xebialabs.overthere.cifs.ConnectionValidator; +import com.xebialabs.overthere.cifs.telnet.TelnetConnection; import com.xebialabs.overthere.smb2.Smb2Connection; import com.xebialabs.overthere.spi.AddressPortMapper; diff --git a/src/main/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnection.java b/src/main/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnection.java index bc2ecaeb..5757cd8f 100644 --- a/src/main/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnection.java +++ b/src/main/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnection.java @@ -26,8 +26,8 @@ import com.xebialabs.overthere.ConnectionOptions; import com.xebialabs.overthere.Overthere; import com.xebialabs.overthere.OverthereProcess; -import com.xebialabs.overthere.smb.ConnectionValidator; -import com.xebialabs.overthere.smb.winrm.WinRmConnection; +import com.xebialabs.overthere.cifs.ConnectionValidator; +import com.xebialabs.overthere.cifs.winrm.WinRmConnection; import com.xebialabs.overthere.smb2.Smb2Connection; import com.xebialabs.overthere.spi.AddressPortMapper; diff --git a/src/main/java/com/xebialabs/overthere/smb2/winrs/Smb2WinrsConnection.java b/src/main/java/com/xebialabs/overthere/smb2/winrs/Smb2WinrsConnection.java index f2d77747..24ad337d 100644 --- a/src/main/java/com/xebialabs/overthere/smb2/winrs/Smb2WinrsConnection.java +++ b/src/main/java/com/xebialabs/overthere/smb2/winrs/Smb2WinrsConnection.java @@ -23,8 +23,8 @@ package com.xebialabs.overthere.smb2.winrs; import com.xebialabs.overthere.*; -import com.xebialabs.overthere.smb.ConnectionValidator; -import com.xebialabs.overthere.smb.winrs.WinrsConnection; +import com.xebialabs.overthere.cifs.ConnectionValidator; +import com.xebialabs.overthere.cifs.winrs.WinrsConnection; import com.xebialabs.overthere.smb2.Smb2Connection; import com.xebialabs.overthere.spi.AddressPortMapper; diff --git a/src/test/java/com/xebialabs/overthere/cifs/PathMapperTest.java b/src/test/java/com/xebialabs/overthere/cifs/PathMapperTest.java index 3a184acf..1eab55ec 100644 --- a/src/test/java/com/xebialabs/overthere/cifs/PathMapperTest.java +++ b/src/test/java/com/xebialabs/overthere/cifs/PathMapperTest.java @@ -22,7 +22,6 @@ */ package com.xebialabs.overthere.cifs; -import com.xebialabs.overthere.smb.PathMapper; import org.testng.annotations.Test; import com.google.common.collect.ImmutableMap; diff --git a/src/test/java/com/xebialabs/overthere/cifs/winrm/CifsWinRmConnectionOverHttpsWithAdministrativeUserItest.java b/src/test/java/com/xebialabs/overthere/cifs/winrm/CifsWinRmConnectionOverHttpsWithAdministrativeUserItest.java index 36e57f6c..c9f7422f 100644 --- a/src/test/java/com/xebialabs/overthere/cifs/winrm/CifsWinRmConnectionOverHttpsWithAdministrativeUserItest.java +++ b/src/test/java/com/xebialabs/overthere/cifs/winrm/CifsWinRmConnectionOverHttpsWithAdministrativeUserItest.java @@ -27,8 +27,8 @@ import com.xebialabs.overthere.ConnectionOptions; import com.xebialabs.overthere.WindowsCloudHostListener; -import com.xebialabs.overthere.smb.WinrmHttpsCertificateTrustStrategy; -import com.xebialabs.overthere.smb.WinrmHttpsHostnameVerificationStrategy; +import com.xebialabs.overthere.cifs.WinrmHttpsCertificateTrustStrategy; +import com.xebialabs.overthere.cifs.WinrmHttpsHostnameVerificationStrategy; import com.xebialabs.overthere.itest.OverthereConnectionItestBase; import static com.xebialabs.overthere.ConnectionOptions.ADDRESS; diff --git a/src/test/java/com/xebialabs/overthere/cifs/winrm/ResponseExtractorTest.java b/src/test/java/com/xebialabs/overthere/cifs/winrm/ResponseExtractorTest.java index 8b701720..c55983c7 100644 --- a/src/test/java/com/xebialabs/overthere/cifs/winrm/ResponseExtractorTest.java +++ b/src/test/java/com/xebialabs/overthere/cifs/winrm/ResponseExtractorTest.java @@ -26,8 +26,6 @@ import java.net.URL; import java.nio.charset.Charset; import java.util.List; - -import com.xebialabs.overthere.smb.winrm.ResponseExtractor; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; diff --git a/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpWithAdministrativeUserItest.java b/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpWithAdministrativeUserItest.java index 2d62d844..cd93e679 100644 --- a/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpWithAdministrativeUserItest.java +++ b/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpWithAdministrativeUserItest.java @@ -35,7 +35,7 @@ import static com.xebialabs.overthere.WindowsCloudHostListener.ADMINISTRATIVE_WINDOWS_USER_PASSWORD; import static com.xebialabs.overthere.WindowsCloudHostListener.ADMINISTRATIVE_WINDOWS_USER_USERNAME; import static com.xebialabs.overthere.cifs.CifsConnectionType.WINRM_INTERNAL; -import static com.xebialabs.overthere.smb.ConnectionBuilder.CONNECTION_TYPE; +import static com.xebialabs.overthere.cifs.ConnectionBuilder.CONNECTION_TYPE; import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.SMB2_PROTOCOL; @Test diff --git a/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpsWithAdministrativeUserItest.java b/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpsWithAdministrativeUserItest.java index 316cca5d..ba7ae41e 100644 --- a/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpsWithAdministrativeUserItest.java +++ b/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpsWithAdministrativeUserItest.java @@ -23,8 +23,8 @@ package com.xebialabs.overthere.smb2.winrm; import com.xebialabs.overthere.ConnectionOptions; -import com.xebialabs.overthere.smb.WinrmHttpsCertificateTrustStrategy; -import com.xebialabs.overthere.smb.WinrmHttpsHostnameVerificationStrategy; +import com.xebialabs.overthere.cifs.WinrmHttpsCertificateTrustStrategy; +import com.xebialabs.overthere.cifs.WinrmHttpsHostnameVerificationStrategy; import com.xebialabs.overthere.itest.OverthereConnectionItestBase; import org.testng.annotations.Listeners; import org.testng.annotations.Test; @@ -36,7 +36,7 @@ import static com.xebialabs.overthere.WindowsCloudHostListener.ADMINISTRATIVE_WINDOWS_USER_PASSWORD; import static com.xebialabs.overthere.WindowsCloudHostListener.ADMINISTRATIVE_WINDOWS_USER_USERNAME; import static com.xebialabs.overthere.cifs.CifsConnectionType.WINRM_INTERNAL; -import static com.xebialabs.overthere.smb.ConnectionBuilder.*; +import static com.xebialabs.overthere.cifs.ConnectionBuilder.*; import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.SMB2_PROTOCOL; @Test From 4fbbb851598c353e55373370cf4834a03de2362a Mon Sep 17 00:00:00 2001 From: Aditya Kalia Date: Fri, 2 Sep 2016 12:23:35 +0200 Subject: [PATCH 15/40] Fixing bug in delete logic --- libs/smbj-0.0.4-dev.jar | Bin 236381 -> 245490 bytes .../xebialabs/overthere/smb2/Smb2File.java | 5 ++++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/libs/smbj-0.0.4-dev.jar b/libs/smbj-0.0.4-dev.jar index 041a56fab138b41648cc2309372a57cf23d85e7a..4489c9dc68c75449b12c61a7ffee5f255db8b2e8 100644 GIT binary patch delta 68030 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

    ^Z^ul$UuuB%f$v%YDByNI1Rj#WMvI~KrR zjEuV!8N}bo7P-C8j$<`q9q&gWm|n_9ffqpG!ro9g>v^_-qAeT0U@9|aAFsfum_J%_ zXCh2+^ThPq;vc$xF6YPM=9xGLLw*JtY`1^CpE14Y%Rwrr?|RAiSG4- z8LX`GjC)8?V19|a+e8N) zda|}1JXgiCh(wyGQR!q}lF`X#k1}XE+g5j7HPusE#!@Wcf z({Xg4c2y~@1?;h{JM*DF@s`ATq2+lR*_QO-j|=lgq91$8zHLZQTK6-5w4HD^9b0!O zZ(q;-`jk5eG0U^49rQS|{<&#PeP08aCx6G!pytTqT(Ue!drlqdMHbn%jF`ZkZ4U;f zZPwOp>+GG@i?We>pVtt?o8X8L{zYb1!R}yUO$|DGQ#DRCF3Z#%d^K+HTq6dT{Z8b9 z_aJePVgHyw*r)8w3W@xZytmGbyI#0Oj5(t@3u9rnMr$#Xci6)N%IV>- zM=~!-q!;3S1Ydo4npup0tQYb#VldQY74^3uS}zsHrl91xkfYWHUS9C;pI9j0k8Y9O z(=Ox;=x(A(WXM))iqCh+r>~!>bSdwC7|6Y;GDeya^$OY1$6M#j*^_v9{e$7CN6t@d ze%hH3E^tcR&TEzs%lbfq$cN749xROc| zi=lSGUaoSL+#Q2=Qxm@zhr%4-bTWO2)bBqWd z*E9~#TMT<7TtH){@KX`=D29o1z-J zldK^?73DLjkw;PSYG-rdg-2U<7~f>d{qO)kjfSFkyqAqf!tX??(}W&lGxFlx)!5Go zPg$fQG~Y4Abq~sm?4=H+yq&)7f}65PfO}O@x_R+RdO}*Ln&PP@YSYBk$NM+KhZl(m zTVsWINA@>_ks;inW*sKmMz}UzuW@mFiK%es+9hd1iRO&ASy*=$n+aQEwl3_4g|jWF zQ(iBBcWVDZ`-jG}7dnQweF@t1wl5r<@2sLZz-yz~UKWaqh_IBGG0&s=9@L31;NN+w zq~{01fmd#JE`8iyXOl0`;aeeJZp|>Agx2lwx%oZW14U#9+s>(prD4LuPV=8Mx*GfW z;cbg-goiJ7r(*JX@OS-cC%);-eO%}MY#~2H$0tsCSp05oKPB=PUqj+A0s%k06*czp ztcZ$%uLZjGp*rllX)1i!-)IK50yXhfgH*!W3q>dzZ$I!F+$0;jyR`Z-H zXVvX1x;{vXOp%LaDsy%E##MP6m*JJJ9qT}_jHFfAuPp1~JToc-tkiOyin&MruO`0p z?74B;Jv&x6DB!y$k#2Qv`NEfUis)nlGI^uxd~77I?l#H}e;r!qDNDm=sHwUB8SMX> zduxVaHc(BZ=TR6#o#koe>tB1MJc2K>rw=(wOPo+Gz$r#*$MqRfaHbXdm3s_R`h8`c z-xbPS=E-zztI&;Z5>)ruN@`;Cr7XR2#d66npF#8^)?CoG(CO2&(6GC7%bxy^dvCNQ#Kf61=BU(b+#h;}$Z6#h z>NsT?co!>|AoDc5zRpRTT|bebn+rYbqmdrs@GXdx9GGuP$jPh6@wuVU5@Oz6NoYDa z-r)DM)x@B{q{`1F z$HR4qEXU6>iMv+tdxEJ_+lfsB9*yRj7j2iHwd$^G?|x>IH>#5D;bu?xEFCul={U_k zRCDXnYRslbW|(AMo%&XBDn_1=bi(8O`8XPaSQZPZ!AYL^4p=lz{=f>Z+7&K%1EAb>-gss?y-p`ecdihrgl+~ zuDc{%S4cTUuE1GQ$yr=^%5=&*mFJou7jx%JZ0A=I`2@mMrqW~;WQz>qj|l@QYGXbW z6e;1p5Mt|4iuOKd+|;a^+m#g<*j&~vZMdiSskAz>gI4O2$(`6-ipiP#?D=DP0bYq^@kd@*ly;jZ>!<*17X{c+2glamhGn-WwNHCK-H2Wfu( zR8C{8Tv#1JA81RVIwa~dgeUrogsUb>fz@w%EtVyQVW1uP-YC*=N2*NToF>uC*=+C_ z_sZ)*BPGK$ikvA1V>@d8kRIiP0@L?+vl1RWm39qpMwoim0%l*8RF~ZQ$Q;UP`h#b} z-{ZXfHO8!Ey|3&K)vE8F@)eFxlIyx(d0(?j_rqOR|E@{DIMYn|4>^UI_*IS!F2_E$ z+!&0KTEFDf?1p4_z7alpq3KMzVDpPM_oA;HKI-v)Pb2)Aj;s4@_@1=CtyZ|vi{t=OCo>;w zs-N!8%F^dgc;1CvW>C3Hd?HzW_-T%0e9x`;^=R*(#cr{U`p9(ffFQER_rH^`O$VWsfRc=*c7NQ&rMH|S9}I*H5FzoEbgOsL#}5ch-!HdKMCNEYk3F} zy~knFcLZTHD`2k&Iq(326aGjYqN4;G8i5PT>mD_a93CsU5J{Xb7OLZBvMp1s;9BD5 zFm+?kDtfS!@Yt;GgVlvPX8LPC(8lj=fv;KW;AH zyy~&L_3Jv4=1iDpUs3y`2~$H0>P}N8g>X(ihSgW z)^y<)y1MT;Z0Z`8U0Y=-^(m_d**&QxU*FDrICoBP%a~!3wkxQk&QkYrOWwq8l2p63 zh}K%2BSVw(TVo^FCnPnQyS2-CYge5tW+s}S2<*z?*AH4FAW>}=c zsjg^>rPh&gD9kZ1)WlyV>6(A4>gg}t$PL1FPHq)M<|B`*8iHF*B^Jqu#{(^FpsDyT+SJMB{A&#kIK$D5HS z0_ZEnNvbqVW-sS^^iT53L{SO4QdrgvsjD$c(Tgsh<@0lo(MU9r)&3P$!n1NVsUlW% z-q>w!G)X(d=9x;{n}nM}U0?6ZGWCcJdR~26+20VCvR^1X%}UJgJ$kKoKH}m^0+~d; z>Nm&G8)gi?4Lx4#1$bIL{?n;D1oAXHNYft4Nk@$~Un2VKLOVJ2$Ck5^(}%_F4sX|t8_$WHnqYtQ)@Ot5 zs;=!p#okbAQM~NnlWFxH?5;1X(rX>gFXu#poLdt#=I(sI-od@u?p1g%=C&--O)L#* zubmw9y0mFa{ZZ1pb8aWFLe7ip>MxPzUzRFa)ny@1?WAc@M}FlUvkSU?UHnRs4apa> zRdoZp=i+)D1U<{pghkP5P8~{i{@zPpIiDqy|Kg5q)h<(!xx=o>=^dl~)lMWue3Mz7 zzNY-3F#O69_wnfyjnZXPNU}SJXOo+^IBVY!A>Ej zwyc6Xj4PbVvhpX{hWFVAa`Z$EHeOM@r@OW?dgB8)l$r9{{bR+JTy2bX3xeNP)1vPD zB7dO&cK!UdWuYaL*j$J{W!_nU#lBD{y4qgrA}^hW7OU+QGYx{=H*;PhvDySe-n_}k zQeNBn!G!HEOZ11&j;;1{5_w+aM3TE=uTK_p1s^_inNvMIxrqIZiT<8{RH3m*ltkfE z9j?!Yo?#OwR6X#(SDk4k7Hu)y>9Ia-&q7R3K=SwA#Lj4i>~oix7ufg*h#v?hZ6nt1|tI2}Zl(T*0h^)pU^#@$479i`hnO!pr2 zsIaxiTpV_@U{}E3u^YN6?K>nnC++NX{nxi0qIPOy!^`xV>|vSl`iT!TI5|~~nr@9mnY}V`9~SMdGn?_qTlI3BySDl!JXLg+NaVS30RQ(1HF-Ab1Qk;sq+!`~ zsAHUwpj6k&s|9+>1Bv>Av!2H6nYHyLMl^L6J2YBiPqOgG_&&8$2*p~NlKUhK=j+^4 zTFYh%Dyj9j5Ig&sV2N}UpM*u@N>C&NZi>XfLR@$$qldj-7xM=R0S$NB1jg)Chn&OP zW4xvl+r+^n?w6hE+n70rudPdE+9DTxw(NBy*j`w?xOK8>ZLHW}tofS~J{AAj zFr>n1>8np)H}YDhoS+)FxVJ-iarLZAjLG@$@m<%Dg1(2g?^xwHNQhs%Os6}RAR&70 zf~E^K8OCP^6F->lGEF*PG#^o|kq{@nlV4;U*iP~#a{g(9rnTrkXT=F|PlvWb?u*I} zEzv9CmR|z>T7D=*H?f`@&Dj6Z+Q_~|pJdEn6mddZ;+d`nF^7&%&U<{vR3)~bq`Zl? z>4ymt4wu-OD4EMME|X`PvpMoVwk}cUpVGaINNU*{X}ECsb=o&+`kv1vF@hH6wB_-;oQpc70W57W6(>O)CJ0H`4+|5(>Ba+d zLM8}07+8%0t_#AzO#oy^88UyY>9rGRf7V3*io+8}QD(@B6G1wrz!x}#ra(lE6f7dw z6fMHNwf=4c@Z$!^EE|R|efc6%;IEUxfmawnPxaKDm0IJX;Km z$Oo&tGZ+$LA#XE;Dy+K^#T}*tb3f9dhs+|;+>O;ApYZ_h(|}tDgL@LRbc8&dFT>=P z+9!Z07!aMpAksF4MTVMEK$^}7VwjpYs##PKWR~oITmo+rps@%i_5g!1BD)GluREb+>0(NF-)EaT>Kat4EP<&4h3EQA$p0fcmH&H+i=o$dR zGUuW@-(UloD?p|!hD?E6K*^oaUO);>+n@_`(S1P82SlqH6sHyjbxZ-8nit|t`0e&3 zpwRvf8bO`$=nftS3HID1FRCsCS|{DF0d*XAhL_^q>*PGlYAI|At`` zg$(b9EfR7-(8Ebd+f#fN3M_I0Ekqi_BG)09GSLBX0#08(1=mPp#X&`o&AkDYG(va0JyaXfQqnzuq~m+6t$Wl-bHE`hCE;PwFQ(X4oz zAG8PBgAB#L9*1oHW?_LXZ*vAlKL7F?hzAj0Mn`Q*GtN;1s67qTiesoH*azg?8EtzM z|H;Z_Am`o>Gy*T<^pF2!Wdnso{6ZliK^Jt)EL;#wU{1u&NE_!uL202O9Be#DJ`6$3 zf%3tr+-vg_YH$EQ)G+k(6JSI0MA(uL%M}DO?1k(VAS;X*2CGA+p6G-r)V6ZTR zB*VrN_@|L+PQ8DSAq>1c1-w+j&|*mk3A-XL!cDZ%E&aI}$e1svX-N#KkI-FLgc@wb znk(?~CL4-N5aMIQ{!ak(+<+me9N5qfJGSiKpf#evGTbm&1RCT*vmAA&H9W2c;Qj_E zTuhZoypV!BLKP0ug5c|~MZo-eU_R#1$rCt=ESmuKe+JLGJJ6UWe1xhJ!lwFL-MStC zaARKYn9^LFzWGb+D76j@P zMxdT5!n91#9Zv)UEV%_GB3&H~{_2UKhr#4t0L*g%4VF8PP4-v3YedznMX<=D1ukQ* zEkw0{i}yk>!ln!}Ie#h#9YqX$sq=RxLbZ1bT{Nwi4v4sHHo96Uyn*5iW@y}bZv+=? zk2ea;VS@&*TVYc`&EDu5wdTm`5dcX_1hpZ8;qIZ`5d*olznha+xeH26@%0RCS}JM zODK-!UxeI}V5*U2{MV3jnB(04$YsHhD+-RU^+T{hzkms-3t5QN4~!^JG_?OJHsSxM z{LYZ(m71gH^RKye5|w`Z}BW5f(~;UzmY(0vm0D0~n&Wei1KODHyd zcmeO&akps`P?-T2&tXuVUp^9EzX&>wR17d5C6!aWemn}y=JcS;V-|YmDvDkx`vaIf zVRF>u>BH(;gnEl>5B$NL7q0w3k@G?$d)UXJd$9;Ac(#%InPGAqRD3t>zq5_&!5?~Z zh&L47_$vAErL_S4XFz`z!~EW3IMB{jgb=j)3-m5j@xx7uDO;+i3`E2eq!ZJAR}z>( z5ZVX@OL$bBV_yS(&Y2ts!d}4UfE2DF*x?MK)ch_+{y#cVh3-rZ-MEH;H?V|SP|P*d zIFKS4juOOt9bF#$*8zB%1_ld25IGJB+!SGbX#j^4z<`n=2u)uHmmnxBzM-Jru7m>-SLI;vS?Fyta1gaP9z}uEm0^Vp5ZKm%{(sVmITh`yK;EecI{yD$ zbD~T^1^RdX8U92am47}}s5%OCx`GIFOv@uc?(EUfLq!}SXe$CN6;Vc#Mgo+z`Vj*_ zQ9&$G=oaByuK#!(gz*4OrkE{_s3Qi!4h=;kSlLkZ>L_J`UkP;Lf>jycABm`X)rHz)5FC&|3_2;p zh1&H8z(O*Ra?D#5s!k}OyiigMf*N*4p!qXaCm==LWWp@G} zNX`+AqWj?L5q<{d#`Vh`8zfX3=sE)h#v!;NuV}>a>?4Fps{?o3px5Z3FwhnkO2JW%l!|EJrRci zUPr@5DE7IJV}nbECh~vp?m6B0!$bkSa6(YQL9LHU(Y91t~zDGFXS8OdCl-aKf(tJ*(v31!mvV zzxIODOHQz%$`PgKcYnmZ(}#qr(-3rm;4p!IFMl!4Gr=&l4(6f!-_uPX;olwL&w&O1 zvzTUj2HQvb{~urQR|3Xf?HKCadSMAHK*E1M%KK;Q_P>H;=~CR2fq)0#4`zqE*N2)+ zq~Nrbr-CpC_e0eg2s-FpDp>oV;^sGmKa&lv!Aii@2rq^awSP&ELn3MDnG&v;^huNy zW{lMzO4zvsF5OF@AH>uAD{SD10~!Ja2V1j&syyF$SPsOUj$neV`MZ(!zXFbd|s-Ex}Nx{r%wa-yTlq*;*ErC)=0hAxC?Ora{=s;s1H*&4 z6KDqTjt3pAn2xG9EDUs2T`-aSU7(_-S(?*mS_47^1r+R#7LM^22&Qmx1SH}KS_*h8 zgbZFv!Nq~1`8~ujugUSHA-xQX~P`?Jv9ZW9IFk~^a1%SN!mm3Sc= zKoQDE(AaDQJN#U#3~}K z1_BnqkI@h;7eT}?Am}ib(J1WQT##%7G!_!bL*PTRxd>VglbxXw}btsfI|WY`TxEBXTbv9436+ekQv^JX0bvB*!f^mD z5cj2W!;r@mmnKqbmK8ZkQiTbFF6~jfJ;4muNlHivuV>cwFRtjDn-Lk6Wl4I#T6$=% zBNt&8Wy4Xa233hvOJ(1x)GJj18dd7iebQ;KaKm0!oLdHbI!@oZyskQ*0*`b3X1spH z^}SwA34yG{CTd)amVg;Z5Kw|gnaTo0L?uG0$SthKTT>@hWE08`ttG>wbs&$`OOlgC zH9a*!{F2n>;=W+4&@P#%dip>n#2~1y5Qm4vc+#}UnJ7w>qw|(JZzV>mL$K8EjM284 z%qK=3-lMDvoQ)}=^HVB(EGCW}F8(lo3VXPdfy6@RFWs>Lg|-e|tua9=`Q;DT8i%V9 z!aV20#}mLK!XqHU#v_W)i$~fbLPHJ(0~IjAXL~3yf!pBEZD5_lS!g(J)+|d(w7iqC z62v-8x8DBg@C8C$Aes5@1w{amAR7U3c5kU_yx_5OJ1_*nLCD@*=2qUn>#SfIQDuFe zk9>omEhF~TV&yyT7+e<35a9x#d_LC(uMO4LSF~M$28$|SCT>F7zS7c{Sd!~}NY!V^ zXWbq8+;G=Ukc|WHP=9n%a-Zz|JzPCzMpk}5l@D{p5KmIrr8Z8-{l`%uWWtiI<4?1S z#z<7j8J1dlpI`I}r4M0dtM~XW3oHH!k?WcQNUlJ5Xo=vmj$*2r_!AxgSAK~g4AqWT zO@~>|s!g!R?$xeNfMR0VuM79Z9Ew*cp9Yi^iGngrhc)L{S^ssEI^QJLQ4Un>4E*yR z#$huZpk3jxVj1x5fk?h2_Cjr6b3hSWN`3-XD7011w|18p3OgCMXU-Y#5yrl!4h#2j zKPY0|B{IS+%BF+58)g`Q&R@R^*+V_sYP*B+COS0bEiqK>t>9U2=MC;;`%Gbow$eo# zm>3}f|Fg->i6O_a)?$GH?2-aD4znpCizVHgy1`^|9PcqV8NQ63FO!xVavd7;E&~2T zPv20n;3Fi<(`WuWyFib6Iiig>-u3vE!BIDtHmzhNM9A`ElQ;|j;d(a!wTf#z`>^U& zcnEuxV6Q{<|VN@qS{r_hrCL zlZljFn6!uR9*FSFugcp$b+x^+l}DO@mYPcU@i>M$-#2jUk6k6xJ*Vc)nO7WM(h_`ZwiV2KG`33sIN(Zds<|rQJjKv?Q{`j2EE8Z}&B~p_E zayL?(uhf7e+V0qQOX`dE1#2u_>Au3j?=sWpAFZx#s`?(uf{F-5l=+;Q3}@5ssX?rsNg&%T(* zQ4MNxxH&e2aTNsxX$l=9KRt^hwRvUP5_YJ=eoz^4)P0C()h~Vy6@8=^ec+V@GTe1r zKt0a&U$Q$(Wd)~GfHUNS(gLF~uq8prv=kNz_VGOcQEbVO>;~GgmM)MC0MUErFtpm< z1F)s2i7RR6E|rU~&&Lw(svGhya3eqH8i}+_jcSJtD~4w@ zOv~v2jZYe;U+6~O(^m3j?WGQF7f3_O*SZ+Z&WZdi2G2IbzR4Q~Kb55oI33G>QA;-~ zA|$aOGW%d+)nQ73aY}}~X0<3_?(Z9L(I0@JPniLXQ1|YwUlC!C3Avzt4g@^oKJE9( z4}LmJF7AWQMaj%T8PrILx|7g|N=I*IV)~f?V!D~>UXwA$l2M)pQOixbOJID-oh!jw zVo=uj2kbqf1UJM!&#d*ff;qNH%Z=4VdOGizlt-CJjK)UjQrwS;&D!JVU|KhOf-X~L z;8x}^A4fl0PkKY5a!+q9(G&ED41}-2JkwXUPHcINJZYZ%=#LMxoS7^-k*IKRe?(FP z3S7NHTe|f(_btwFV=^Rn(9OC~Yv{iibx=OD2ev@e>4E(Qbi==0aP$Y}>d+eIUBND= zZksJz)g7UF!)XZY(DF}xhKjKMY#tZS;uBK(gwNk+P})ECh6%m~{T~375yFeY4+RGS zIsJou)F2=rW=;-F*3ATH4d8zfbQbdy0`Wh5OcF)LS^xt9`2h)ZDZ|Pj_5_D*{=mBd z`)hSeSO)o5$R^+Tcb^Zn|6k;7erCk}r$S?|g!pUI$4&H4wJUh{Pqif8^G}r~^Y~9l zP*ne?I#hH0cSTqG|5R!Qet&NV&Y7|Q^#^U<3HzV$5B(Y3zW~o2|H1#OBl2G_Km>QO zzmw=QFBv5NGuZuR&}_i zMI5Y@X_uiyMh4!7B6uaxB;6Tkzj-mb+0Fe-^adK}HTr`$Bw_y<{7oeE)ukP|h zN<3D8Vg+M!aRhfL@B(b(OPA$M#CWQ#lh+5+Dz!lTH4B965{VB1%{gU#M;^H2atnB< zW|2j8A&y^mt=zXhY-EQ`lMcUxAw)0y+L1iN!L{twJq)>%>3xEa)+qv=U}&7jXts?G zae#X&L8LLwHR}%&6E~*a{m&AwjR2Y3?oTEQaKl8ykTfTIgPZITWTBxrMIpI4-7!`Q z>1$K-gUZ=pDz@(iSMXvDHr5PP)6N>!@%3%3jzUDqRflT`jG?BPyyeXIteTKW>IW*y zx1fYo-dNX_*h3r`XqoD_f@SLVCh8(85&)QjYHBk*5s48pat!~%q6h;FzX~?`&-U{H z=77KuA~p3~dB=RGrp=*pRd@FL2Cv5AExMHTNln6|C%Q!2kwLVG7dTiS%&-)_L<}aE zYA7*=H1onp0+Vip7gCL1PSMvF7Ly7BBG==NbLenW@Tb}=A7$rt4lvawIPb-ZRRFI7 z)%v$*>`Z_)1=oONoA=oh}OmC~n z08lxENN=!4rljs*08>#O5n>iW_YmVf-vfxkg7Nu88(b=sBA4Kml8I~57j4p>^=F8w zVU!gTebEtkN05AWIlu3~qmz~&KtT$c9hnrnaiBSR43*550Qv-f2=;_65x^{tRQ}8upR~_w_Nol=??a| zyKO-F<@;1n3XIU2aPxw`h@GmVwHZA{4 zHQQ~e|BO95CBRYsOD(6%5oDZ@ARyoW&>;~Z2|GG)r$-ak5hyuJfgpz`-vku?#sqdP z0Cf50j?<7au#K;u!Lke*&@nLZo7HvdOV`A}7uGxA$2V+%3EqtPylYwJWhVWEJe#97 zDio?=txsTlrJ5Qaw|&`_H6lWsPaEpVD$Jl zSltv!fehq;vg7%dz$dZEc{du%QHLY#Q}3nhnHBfk-N=2)oIEp3p&ALaJRD7Jj79TX z87p2#1vzY8vNRxG9nC_2qM#LPW&a4tg<}qU)%h`9pNo5+}_y|Hk3X#xs8Ee~20q>Ni8tc@-M{R(85X!5Lk zRLh~!@V!IR7S$RC$y&>A`g-`WHEfrdLv$E)ou=QuH^0z;x0?PuH2aj1vLa+!o}7lE z-No$&%qdB@w)AwWm&u(rPsX;IHftQC44H}>y61E%()bRd&_?hZRz2TB&&K^W5YegC zATU~fp&TVN2yDFK_?Ds-jau*98X=v+#Fa7Jwv?kF+IQG`M!}_X^we=VclzaJ7d`g~ zFk^-8AM-=>S$}Yaw~3Z|4-WG9wloCHa7QT?09)oPI{?oG#YN*dzhT}n;mS4@KM_9? zKRu1l#p8Il@jXAPcA5eXRD) zF;TI1E~34J@xvDgB4TGX@>4@)(rWjzU3`5O#c8qh$V^G3=L|KR0N-auU#X`pk&`9a zI1yaP+Otv*@RpddHAOT2y%cU_z@F3@Kt!jeOE}9=a%9_haogDWfiJ8#z})Vzt`_p$ znYF6I15-|DotVLO2-y_|^2%6tSAIM(~z(etC+6Qi7_q8-L z-p#2(mqB_ofZOlS`iTGg4A0ZY%ahX&(73PY!eD43J&`g@!(%}pyv!8i2qKQKtPIks zN$SXKnHc7bfGEWc)D3@R8*>ORy`-9u+z?2}Sa=4S1!wx^6jr%h5d}P`c2$h&w$AC< zyqwy&-DxLEt>Yuh46f#8xc0kyczUs}5iJj@W{GCp?sB*DLK96p&l=nHpS9jK zlMZ_8N1pZ+8FA&)MQS=nM#~+S4}E*Q13Pr*82OAWfLy-8q}c+X)rq?>m#6Ja+>teW zT|9YcyFJhb);>>O;UwZpp5+Z$aC9lIPQ!an#+>yU{bjv)Q@ReRhQ%9~yVb%YlxeX_ zZ)4I<46X|WGFl4 zX|9$u3`yNTs+m?$G%+S|uDU2lg|%`IQBbWBkbrV#rWz6~f`XZs~5Dg=X^M_kI9VLriY0m=BJaJla08tE9Z22^6PZsHWivV&iP$!By3V1U&91-5!0ykaL1XJ#S z??pO1;=>6JGW@1Yyy_I-QyWK1j7%dozC+VFH%@L=3e}6$_+H+`_pBAk9niE3Jreb~ zv!762;dM@pi-hDvynA&-Fizw-913hdMVQct^C@u|iU>@*4ho>;KWs)13P$5T7=8O+ zofA%ce5W>U$fV~RrGI-rXf353i*hxg%!HHBrQ!!C;j#F&3M z*!z6cSLKwS*?XAf0?DGF-Za0HVZTEk;MIkl<6R8VemS$Q-B%CR4i9s<+?Gc@2Yj$~ z62kvywnwi1DPDM2Xoj}jg*9%M7a@@YJvq{-g57IbjY_gziv%H5L3XVn*oM> zx90k>;1kt@mV4*g6&nt?Yvanuo_PV=?~Cj8?NzHEZy!%eeIVHV%Yy8t!;va+FD?-K zf;|y1LX5jjEtH4I=|dPoWyrT?xGFZ&fM=V_Dxzg(y4pe z`pK7g*q-W}Z| zm>F(fb7bi}hu*$OT{@QQzS*mY*VJ-3A?G2}P2E10au{buah>UYgkH8-UB4I1+jAFx zV`ACQsLx`o5Qd4?gjqA#;j+$K13n%dEP1*o(GnEaE}f8MhP{1t;_6^HQwsN|=O?I@ z2VrT=M3uI(mfReD5juOQCs{0ULuzB7+b6o&i3{mYUc4Ja)Y~)B@i!wOU}e3_L)I8X z!yud8O>{$Pp?e(ZxKWyi@qbK`mH%Q9D5vs{fSZ9{A!57NOflF?aocya0<6%9uy2g| zVAvo`?cgSuNDL8}tDAFRGjp^QDGaH&+m4$Ej~F0e+GB`{5k9eRMAn*MlVDWiF5L(Z zL58vCrVZKT&fPH1*m)ye({b;Tr_IH?Q#-D_=+Cr3$W0%Z2X3%aY69u05O~>();VXp z*N%K!UAm{4CDw7t*m9ZCtY&w78Ot9DIo>RiuP@F*Eey7!MZ&CS5@SlC4#Em4iR)QjpS%&@!x! z2FcveV112LHTb}lgBc(Oe^U=@#rht`xE-fw<)?Vn?NfA95flt$0A#sNM=M*hu$#4G zVp-IxE@8qb6iXRu{8ihwu>r!_?pMbVYRhGGs7QE4*Kr|%F)exKGpylR>}*$>eCpOD zg{G0*9mUls6zhe;TtfOCFU{XAmju$+YN6Fk8L+b3#ykqAJZZYYFR33s=lUOyo?_lg zSOsOhY>X?NDigO%0W!70?9L`xxT*xlNZtqMBm%em)o=Xh- z>$DdyzT|Guq>njMw*Gi;H&q#CN4xi>R8qCk6Xz}c%5-z~Mdh>&k}q8WzD72syN9S7 zb53y^OzH%#IP9Y$K6qw0%VSo^gS~0W<`O$$;SFM%a4=T&72t4PcjXU%$Rg|Ci;(L1 z38Hk$JJ}Vgq`b9x4{`Q%pdJGf|BJe~5l-WTk}t~g0eMzN7xbNX;6w)5xdsfzM&=py z4wBugG|gIo${UsNfmGa0<{T-8jEn&)I@*h%7t$uRe&~9I(28D9YDCn_85~zYEmTQ` zhDyVgTX}Q$6_CNOUG;dx*y0bzpnd5e!{f)P{4MJTj{3Yeu3*zyMJ(4oz6-As>Nk-% zs8chCC{0G=6yHDyER-?mx`oJf%ih=#f2>>HSL#Ta#jgdP={xEocUDmgv5LKf8}Mc= zYE{nKcm8pq=M_F-lLam(z6zI6XMvjsT8GB+$WwCGUjgF=5|BvU9p(5&rNJOGm=tdj zmV~be=wTHFS1%|Cu!M!laYL|yVrJ~#t^^9IQ`a9aZfFgot6UPI;wR%}G`fqRmu0^! zQ%>=t)nq*uWWf+nVNK8>p*z5&WihCIpz31^`zpxg4&>%bE$2NuYt0fjLeH%Yog*$a zyyDd}DdaGYW<`%@6CfkC14wj}#m6vF>llY5Zc5;`$Oj6FEU4~0DKK}(5El0+16Y_G zK<#P4IKM$_%NZ->{ z4mCS{knHC!h)y0#ECg^jv$-ARWH~+NzW+L2R|3IeS%-&N7V8KOivz{s5<3~BHga_N zp^co3JmFHefmk$_c(yQ%fF|`P zmF_9K%v=nq@$+hFe2$FRnEt3{$N8A5tjc)j^^wSrI(-(n-X(m zzKMv%uf#FkurnmJJKTyl?f0;xCz`WE8HT+Ng*k;5Tu<=FAJJ^Q;V(sIKzJ!L54T(+ zfDYRoA&Seb(5p#@{%2wIIhD(7^ojvrpC;m~u-R%ON!RbLerJf_M(ATu;#D=^H;&aY zifnE(;dK>3y!m(QQDQ~a2b%d;nL8?V(BC0t49|i|qt4k&K{o=$?<&K#znRbo+X>Ht z&_7{6F-wq0WdekAHA}k?teiEUZA@ES0Z}&3{Z1|vfn|PZ!Ozh@l7y~|TavK6CA8~l zUgP`E$cd!XCB)w1+Yg2yQ8>i2B2JCe7?f)oqg6_t}c5VaT|7F<;>RC+cKu zbiT=O{%H^_ApJiD7LfS>64-x<4sb`)K>siVu*&eJft4m{Hwf3*z#=#tmbVPgbJEb9 zI;B9-W0y~qjZ?jUfw1BF@0%|K28-<7*Wg(%NOw0_g8a^GkA(E(5qErWp{lH4lUxd!W%A?Z)a`c8+MFIY`bh#D^i!Pw zfCwip*Th&1K0P%hJya$F98egRemg@;USpe;do_LHYuPn4r2+MwXA@rYuyJd^vPoOc}BhIuS9If)ROLx#JcXW;Q?F_acr;rT{5iR@652M$;C9 zO(J`34Xnkol8kbVXAF6BYPKr#+PXIpa#|;k$-HujMYIu#jj~Tr(YVSbExF8HkrDZM z)5ocOu1)Hmm}Rd^Q4Uk&Vj6wvCH;GhIEHH!ivKd^swG?!>Dyp9g`eA@m>%;bbA61 zupN{;0VqU!5mAXZEMmu)#DlXff)AtA5d7Fu?IGVhp+4OP=mX@IxLi8ERu|0ERZf`d z?1JCkRsi<=`2pOh*cR67#(*?iV*BBZ0fme8yB0(Qm)xZ@NzRNNqVxvW@Hh_#s9N>p z6EjSND#_n05r|$5ho_}jP1%JME$%AnPnd0?Pb_P-Y)vdQrEV?erQP8Ph+v=mj5w^z z%UZp?ELz?wEU3*b5*=`L7&=-c@O4r)o(`PT7-}uxkN}1pb#)qtY?l;BnqWN6+_>u(x2>X5WNkHdE9Ni*-Io62vJYnl^j5Y zBBxk0XaSW##LFOIBn=H)ubWq!M|I=reA}8;wJZ+5suoM7k@T5$!y-E8Fv3Y9-imAT z8KVZ#lHMt`<#}JMn##g6K6URimCiWZL^17%k^Kfnu^VptsRm#CM~fByglvly0mLa* z+g_4g*&bO3woP*3D!aKbU)_EgIQBVdwuBUtF+h}C$cMoLREhC%Eb3E-55g&{RHjTG z`4g>tRZayhaIa2RK8BAj6WwdsR#o7jVY;Ma3UYem6gQVtm;OvZer6ecXou`uePM(0!Wn)&AhQ0?Bgwo_l%Y0u4R3aM1!M>%MS#>t&{H1*QLoc61?L&M;k{3 z1dfdX0Yd(}7Eg7!k}_?5n~{MN7lCAj+2XZ{ZY-82k}vhrk#W+3mGUp-+1$Dxf0Ljmrh++tM0#C5y$0S{u&5JMgDD*iDn{t+(z zBB(}l7Ho;sf&JuxqVP!0hLK`u#-iLhooUZwgwA0AiL18%p8FD@rZa)3l-}NQcP`pUb%i_8{QgcV?S77UkLjmMXln* zpgnVwJIkQ2%j2UH1)z5V!f1v;zeu34&+F`Ne&wRu_|HO|;9L}M$u#3uO5~+6t|_wr z;yvLEARy|0B>G>dIgc78JN?sVUWUw=D+9#gsZzleA5B9g2yLVb^ zj`^pV`}topmk*%6s*0w9ERaDjwnvOjQb$cJhiNQ5NE?NUDI>3nejbXnl(f-r%o@su zhOr&+q}4*6F8B-@m};>t6N0IZ?0vf4Uf%9j_WR@YeV-}_!Zi?{UQf-zP@4^5eH^cJ^%G0Jd|}rC>ZwTOYs@8%!f~gpPexA8nPW74a9pyM+g$rECD%aa5~Q9;dR|yj1((s7CmD)5AStAa;cLnJX?P>o`O_Vn&Ty3Td&uDr}6^ zl7(tFI?jhb4P}@O2TpqOL_8x7#BuVZ9|0%!Bn8kwZiYk0ns25d32TGH^an4JlO>3T zP7W(9Pi#KUmlxmcSaKWX78LuRI=+=uQn;F6Lx=y!YUsjiu{EGPEn;BW}<7n(~lalkJK;Qle< zy6pSyJ$FvDp|8;TX{*QF+rkYH6FEoNDpnir*t~_dU3#l*ovLL}$_h|IhFKdDAR^~9 zdyh~Dy}2=VBOZ~s8xK)xCS8zs!bcu@lLWy33LBbg0lf*mi}LN*PUo-$A9%?D3t2^`mvaq|%GTzfu7 z8pYYmT687J61f|=VuC3F)lMh2675q}M;Z#<_=)-au3k$tr)eRE96tS)>Jv*0q3ehe zC6na}>kp{#0aE0tI#HP8n|fRs3^<@TfO5GsN#E57K7$8C0$d}K;&J6pSQUw zYAP~LJZ*G)J?!5+l2>UU%%N=*Yjs&I6}F~(hX}cRl3^vEO9?cX6XW2|B=^hp|E)$xw3Xg8-2yOs?}ZW_jaXQEQ~vUwo6VF174{T z44{Y9&wWstWZo*!`h?s*l<_?fi^C5fz8MD?b4Lm{6?lOX3$7f9DF}Y&S@Z4-s=N0m zC;vT{z@kriO-CM&d`zeQ<#$9I!E>9mX@@L3vAtW1P>8kLC;G0-Wfq}y~kcUaR56U6({Y`M+2tf8?t)CODQO<}2ur_o;OqWDfbA0fPyuo*36h%V? z`E!rrg_*I3l6s!}odp-BY8v9bkts=tP?}*oCA$v>YuKTxYWFSp@%Gm%Rf(zBEY_Oj zZ>z8{cS%?=6xYZkzIPLMm`=TMfnerA(W^8-@}O3EwQB0w$!yFAZ&$17S3yOlPpbwc zKY}Za_{{PmHuhFX+c`Dzis0_j%>jdf>s_z{6d#$)(HHYi!2iUU%vU~jHQfwQJWyEx zBTVP2g&9rlqP2vz4MJfGD(xB+HG&X3iZ#WXvQ6pK5hcBXr;FDDVlUr*H9(@^Qaaa# zH{eqK6X6r4VA#!x)bqPA@N}y4cANSg^wn?Rk$=H(Emj zMAmcnp`GeXUwdzGNGZBWT_qyqZ?q;eL zt?=s{i(R_05a@%c>b=P9o6y~5GLn`|-<(HU+z7kcB#P}O)mR0#dRwTrb83K{YvRSC zEX6L1yMqPJ%*$YvkEioZHpP%NojD8liV}uyJjGt><;np3P(ifXN@n|XOhbsg;Ab0p zPu86x_9^kt+KX{0G4B}$Rf-?J3tk!lqBxD;^70>tQX4!N9g@h4=W{usnmx?VS{Z1bUB|i{Hu1CD|dM~ zxjA`ycd?Ckl&C!#k67bcQd0@n<>qvLdK~2F{8Ye^iIdb?wRAIZ_z@50CP!hUY)C(L z%MfblY?n`AUWv`v(!|V1xG6S&C;3y9L)O;!bq;}{S-h!0 zTm0B*B+aJxxvyvK0(kI4m*}~@npBY;8#|^6{_^E3nN68JD~$9t4#%39*Q{}Q^Y67E zi$*!o`gq_AIJSaJ>jHqIFNV{ww)xa6LaG&OfehL|cm|%y#dwqPUWAT%kD=-gHM2{e zD@P-_J@{egnxHwq%f>f|Mx)^BDn_k_3QPCcAA5g7u_vd4yv%^YgK1;*-Vnx;n#57@ zMxJOIp+*qGSO_Msj@O%*R`2^;FaAC`COj!iqs(s+`N)`koJVpYfv{+}5P-I8RBB81F=fvEp_Fv_!3yii4>e zCYMX3r%sI-A`){VDkl0^XuNVF4N6k8sQHq)Xtv^)auV}&N0{7^e+`H{ad3H*5Y&cCUoqy>0; zc=7|`sTochHOCk0AQ&PpTQOgG8@J3>NLOG?z}YYXTDfs0_;vg^2@Vbk)(HkwXw`pF zg^6NyI8zi$w*_0ys5WG4K9~M%J?GF9DZ_!7zO=UtD9toj^nwN3&91c%p4Ch?d+ z>ub$kpWkk1$2-8$d93m@TX+NzY(3?gw4N&qE=Yx0PZBqHnSV9Y@Ryq4cqyU)mylKJ zb{$hos5P(6sOXPJt3Zi@6hHT7#Nw#(udKG~F?~f)BK{?z5Vh|U;ji$+qRO<|Fe5Pd zr(`<^W+wM4UNARc_Uz-c4rsP%_o6Y8hR*G!eX{8GyVSvWW|%*a)ddtFl!HBhgJ$J2 zBMw%s0N>2>;|L2Kfj-kaN{SM*(R@#f9)~)M+H7Okj2_Osw{aeiQah7|huzOr|uCC6(-h)E|6jj4?D8N5lg zRESZfyZS{nKZai=2UVwl9$`)$SpvkqW53C2-}tQs;suA??;=JQXa`O5${&FtZ{Hh@ z+E#KXQ8ur^%1>6a->bN=T_5n4%bgHg`pZ6!s?Hi~^qIe*#}9ShYjBSW;_ zNi=0xKOwzFgG%cSEu8idkD?}fLF)h=9(1tcIR`b1`r@O~qS{dat*DlGqXpRqtgCj+ zr58#qC++>REC3D!NOXYJOqA2m)0b*pB zv-K!)adyL|@?kEaMINR8#85{SCAIA**TkAQTRCz@CjI%+UtAE12y&}t*D|j9<;Na3 zBcK9aeU}OG!}+k4D&FY$ltO~(VWw1I*~s@1U+z=K4Nw7zidV%!U)WJ$wFl`nnIjdl zN%Rxu9Amy5R_stxN`ojx>8Zi;hSe{+FG{ENyk zK2Wj0O^o(Q5zzU6g?E7zDDa<_Lk{%IKY|-Ms20Bu3Ic)&4kTp9%1|}}g~^Cd21f+M zt137x2qOpNbhx1Eqsj&=!@ft!pj9x3kwt-*VrZZpBU>X0h~xSFwAb-VzC`c1@!|$Y z6@~uw<)#?98H%I4N_s2LXFrRpxc&b8DNzk1u~A0?oQtlZQJv&EJ$Q=K5zl#SG$!67 zLc!}<(Q=^V$97k6!bUXuM5MOV!eTsNo*ma~)8y0VDf~bd0!M7uIiv86U70m~l`X=w zyZMK)!>Ka!qAx4v2Rm-;0R|CW4E=+9|4%`sl7Y_<$lH9APOtAu9p&Es2QR+d2$X!P z70!Gz?ss7(ftj~E2ncD*v$OC&3-c+1SCS)&Ez5jqys1;ZL`0FUyL@%0-7oG1j8pQq z%(d+DcEqNK!d4-2&U(%c2t<_L`|))oat`s@>`u4beAw4Z%Kh?jas#c#R~6D*P@oc%!bd~JTk2xmH?3kNM-(a+=8x?N=2;t|)HRRokcThLwF<)BT&AfOX-lAUcgppFbH~^I!dX}3#8_oe zq7AxS0o4$NrCqE>!MXm`_vL@nyG(vuMwJN+2#5z3NJfeUC=o!~!o=LdmC?-J#LX>F z>ji**i1VqK@QoD)58fI=ju;bkmmi;N!kZ7m778yFy9oXXTsVkcQVt~v$)hdzY1+^Lfa5W>#KRm<8W8Z~;cYwuz zI-1JBdlH-}|A^}c^N(iv{QX0he1Yo$IPc^Prp}utJW&5UFT-80dSB@UF7HQN;IaUB zuoElK!~w$A?{u_nPcw?GgL}o>8NIk0zV9~%l;v4Hm%{)Ys@~&a9hfBIr>d$V$bA$8 zEq54?!kfBXV{dP*r(Wgjd`B47`mi-))t~WEwigM*3$hfQmN^i|-t?$iMG;{~AJ(iW znK3kLE!pxVzl24X(abJ`XN9$Xdjf4@A(YhBM$IIdD}mCrohzjqKuvFh41;qTURjb$ z7>Q*vAUnXWJLVA-NRuf~PI~6e%u_cj;wabRl{@>CTool)E9rAciS|od^{{hj7JXok zcq)!PtGDNYSYjbHy8kN*D!qN!#CIy0iu^w*UZ%lN0}&51qA(i9fFu;ZeRMIiQA5;X z>TDCWN$WU=Co~)5cjHSBZUU;DRxAtxUQfBN>$& z*^*fp21M0tN54mV`T)74NTG%ED5av5j=1F>9o8SLdYMoj9{(~24xXGE?o!Fk#f?$; z5FN>#V5?sEOtU5u-lOZ(%PA&^F~^<4>SIYvlv9;17@?Z6ji6K>9bl)frh#!hg{xLk{n05ujzXV$_4`t=>x!_R+Ajuql1gubE2^J^Qm(D<#hOZC5W$~ z3N@nYWg4+Z7^6_7ev3=fQz;*+O}0L~ir(Za-)z8|?w+-l8@9@+546Nh0?WwH;heoP zwmG($b!ZnTG}n!#6<~Rs4)KSxStsJbPHqJE;&xFS_3<|v&5S|qVD!Q&)neE}bj2$i!~GRIzvtdg|l=*v9fgQP7K$ zllz<&XSC178W;aZHoygL+@d{-q#m zm+8%suOgHwhs>DuBj#&d-|jVQm-i#mo7!lf_Q$roV1FcP_L1$Ox`&SuLi{DxyV;1o zYVR*pM>;yXfFtFd7f1@e-j@xSMRzqDGpz&V<(2^>L;?oCZrK#SnL7_)!Y;t@r*>a5 zpQO_Z>{9B&`m`#l5z9+4-`dMb?`z#!&84YdpC+@{(UrcFii~PS?EO4~%K)50zUE$;7 z;*_k4cplD%LBzimc$Gd6Z>c&8Pac#rb$he=5a;cIq-ieb6AAJFxk~{f296POM>f5S z)iS@f>U_L!VV$)V0pt!3_sWryEeqReVF)c%{R$7tR9J3jQ>GjC@$K4VnGPr z_*I$e?XN!ulY@a?K39{98#vy>C6s*0Y!w8%Tvp0ngm4MPk6=B;aOXcvb`O`}>rmto zbgm?D=*#wd;!0D#&Z;RSh7wW%+&ob#N&@mhAXv6Kg zPOdSu6HC$iEbolqB%B#WoY+R{V@W%Jdst;Z4ba=)(b+=xI27^$Nqg?8rVpSljdECj z4hHE@HY@F^9V{9Q&dp1aYY%J_YJN@74m6aKG|U#W_u*Gp>Ep)nHaWeEK>6p zCzZPlqNjyQX@PWY7f6yA5q3{uu>@_J216alG_bB?Sn`N+C&-t;;?iEi81as-qhRYO z)L#Bpa^4Hjao@CWRfI%KuOqA$J%1}+tgUz!bTNmzGR=D`#zaCtshK*hDRx$b$z#zg zpBhmFj4z%3zKnOn0QU(qC(Ik^m`->3LM>l1faQ>njitY!%_@~dtGoj|pSBab4u``?*^nu>* zre1nx2#JAb7~#uud9ADNsK1VqF}=VOQ(a?Ed?$?KPfRohlL!~l0#e|8W8i&o5xgVn zBCRSz1*Ne1UAhtqsK|`IUOkd>glAAsGO5kj#Q7S= z;JYdTW@LJbbqr>MV-mkEr*Mvvs$i6c`ytK0A^#MyxzUZmo5gGUC}=~-ujlqIw+|Px zqq|_l6m+2TuMb$DrYUJAXJeE5@YGY-7t|x>7!jUX2YbmCNXj-P#*#Ujr~lL0N`mz_ z9N$nXK=4P>Ld|UrT9&xw4Tj%9Um)70a{fg6f4)laALrKA0bTf4$uk;(uKi=$D&m!# zs}LX{$Osw97NCp(J*_{-0Y4DKHZoBw7=A9b6&|7vQUqC7p{L3v+Z94pco&dIGP7qz zv!OW{^gaXJTMecnS}%0ZnuR70w}1;I5u6A}0X)m!`mWc1U#w0DeSX|h1wGvm$H-|T z?k-TTHQRJ4d~D!0R>pNo7Yj))rOGs_xGPikQ=8N(zaI@Q##phDInTIU%FfiT zu$sM*Lk`oDY;ejC<)K+C!C%8bVAk?)4s*h*ZPlhW&2P;$OYrjanH)asAjJJS9? zuHG@auJ8LEZfRE zgcRA4oba^r>s|6Lf#XfaiwK`1uLW3D&NV7_%<>>Q)t$}VauRvViVomX_W~Z}6q0Pl z8y!^@X1Pi=c}vwCULN?3*7~9S7O)(^i>7FUq#2CRWHL8pw+^F7-XZx^7AA!(X}s?0 zu&t21Uhko;&&hxXoU>TvhKGA~z2{`E0H&!jR_#GHzo*j^<$j))ifx#U#VfoKx(M9Y zXv+~{OU|v_ACmCRS6w|bk^}8UN>nLyYe~kk1wN%XVwutGN`e|@>Y-jv?b zyoH3_me7BYF`3g#KT$;HamlMpD{A-}(I%W3sXG^UF&DAK>t05yH#gpb);?lY-}OzN z{nmR>-v7Wp;ilb!@H(%zji>C^0z5mo`75f6ioEOuBP{;+p8~fgYt+z@nN)g5`2;7@ zNbc#reGK+Mt~p@97d6t!!=ntC)S=S`EkT~j9~XN}A~#&C4>7ZU;QWf6mx4K?bc{iS zppXnB8DGqc7rpI4IV?;&e1jfgH6YFL&3mMEJ%Xe6E}mW7-QpEpCmZHkY@5r787r)ppcM89E+i^8?}8hg>1<@v%El6L^?!k!jHllaPTK$ z$He__m}C^=NnOE=L>@t+Xg#JP=+C9)UgPJx_8J(tDoJlGBUQiE;fhOz9j5Z}<;r_g zeY>;==3T7wyt!rf6gXxPTXn(KJE3QGvpvZ#KZp2yP`wO$rgiKtLmX-`5M6F#6lN@s zq>-E(-o#Nikis8gOFywAPb)r8dzg2!AqqI@B+j#LgSXJo{N}nbDnD{^KF^N9%YUtg zFmXGn$>Ud5Hn_KEDC8N^RKqrsGD5WC&Gw!H5;`V{RK<MfT$MZF!jH?rwo9u6B-II9JTef^E(2{W7Zhn$hFNfYwj&OD1> zlhUT)t0=9{|U>R%Pm0w|1gdk8<51m zQHr<&2-9EjwwD74&tLSi)d3^`{_l_g5QO{hkT(#7^B;)P8~{QC`FCtT9E9!PVtCOY z?@)io@KQkJ{>`&Z2VsWz3wP#6tkmdyzD71gN(>JOddl}iQ1BGJ6j1n-sT5GS=IvY% zvwuj9bOA{7U;H!$yy$c3&!nEhR|LZMH}EL}5&Qdup&}5@f73xqK|=n4I1$w#sQ;qe zMiAM5(RDir82R5@k2wHLDfT-ckSUBiAb*A8%>p|h(f?k3W*;Q*A7-m|2qOM(;oM`8 zdE~#ZJ}0Ch&kB zv(5VBS(O@%1rg=>(>Ryerqh&H)}zOUQ{12D?Cw8!f+*SU4w!14Ey4bH>UwSlz$Nfs zuoP8o3dSyB=+*UkXF;Ioh*2u)3MTaj>Zjc4Fg&t)Zbn&_Gvq;Hq8dp>3=)#CVzdc8Nhh)gSGRhiCojg9ayV)B4XKe*cGS$?Xo?LyZS<= zp$Ngb(jPMAWDke#L=5@ylQhDt99XYp$VDQ9K7xWvV;a=wkxN@^w|?~9v;am{R@wuh z3t0nWTo^o85qb0{?l^{-5lg)K=LS>1C{>|MPd#W|i$wBjtxz>kR5m|v$mOazCF$Rh z?S1E9-mROAcKtiFVnAt+&QY#f_yQZFh4;VBjw!&BW zd_Hab0x|NO3@tjM>m^BfY|D$PsEd(knYvo|XX3hg*Cj_ZxIu$jcB77RkNu}y!`K}W z@raivKTR@Pm?sw+2OFTtn@$adug$r_U|^8n(kMQxI!->{lAmeXnwz8Tmr&Fa^dMsc z{lZa^6^rEoUt_N9SOxs+6|lr;D4ZD&zY3so7zBXiz{$hn3M)z;lxobGi7Sv(DcUWC zE~Kr!P^!#EFj5QRB2q=#^Om{od+`32csmAXP*qZN=ifKQuvW+#QYgETtoj7NPWn*V zoAg~As5<)NuX@T|%u39j0%}!YTiAm98eKysy%A>En1Mbmab|3@47^C}x6VLh!gbiD z;Q!svgX_9{5Upk+nuZ=F94RcGzw4|*y|E`pqrF**#BKLF!+p*iv;E>n*Ezhj~o3J>u!NXg5@P@K{(;@<=SQsekn z^mU07dee-syU@4S%bG(b+=Q6z3~gbpnMN2lbM!0~_vM*C9?sxhM|&_$+Roa~uuXx0 z3yupj?5IZ;xG-VSy7Zbayp;>k0uRLg@0?-u9sZ!y+`2&FoP49o-6JLBn0x{XsN)~V zpr<^Nm3E~YHh^5FN zW$VgwI?Do}{G!VU-7FE{V;%5};Wf2GTs4D+W*IQxSFtRCYlLsGnOEKolZ4({pxeFG zguMFSp45P4HIVe^1qoemXo`VCTw(bmgrbl>)skTy$i^GriDR}Q$Zq5n33{$S|2;^{cW3;DC5l>115r#9d_cpw*>fB|Wg&Y48@vE4SRefJ z6z&CaPBrWl{o@rCm#_ympkwjb&CA06SMR&;J8Z()>b)k>G7O#iAp68NQlrsNwOlcv zc}BvR+VK}R^$i1dY@T0VxNW7tR>MDn=X-r5eJkU)iRq8GX}=R_<&*4XJg2`}H+Z2# z;_q%5KV~E8_UDR2Y-*|e*&sdQn2i<%rIcmca>2}S-D*EMpBL-(iD9ix|KZAOu&h_~ zfW8W{S_RCsJXrtWCDITT3Bu^S(g4jdHsLn4Q+l;QCF}+nvHNmk1f$`2O#bW$|KrWY zF=8QaQ{hFcQVUrAD_~kc=w14}>bTH!Ii*2?yiPHXC+*xW{RNB{22s=_O8xf#C|e{a zs6WWSp}u^%ME{TYNRdLA0Sb{)^Y(dgKm`XN1I4las3uoLm`E$o%LPD5p(+iQm8m=K zu}Z=>rR(Fc&8#>$;F&MqXl|(LQq56^;e=Y9%*@RRt=h|K(#vWggb2Zi1#=hg_uw=` z(j)$62He8e!R#eSxPq3IXtAFux z8!i3S*H)jsv$hPLDyC2Xl7FjDmUA-PgXh9+D}dg57}PpfR5hb^S6GfWG(;O}r@zAe zXDWfi7Ktmb<**ST?QuN3;sM4S<^mU0ABZ<1BMIPz)`&wuH>D{2UBa149>EYN8Gg*f zL{V?IZmwds$NMZXQa0ALE*wt04>4!R&k)C#C1Gkx!cv!*uEbm)%TBPkk=%2G{RkoHOJ{qELs6DguVqaHex708)h zgkfxBVj$5|G}d!iSGd)VbK4GdcGhFyvcppt-0N%((^!vk5|N|I(;QLY`Mh-5=zeY! zOJsvlJerg+P>M1?E0($;3D$~`AtR-sQltx#$`emmiE+n}V4tb>i0!P{ zpey^Q8M_Xqu2pU@O`str_E$@H;AA5f`z=0$1uBPCKYxa|3~_z|*vhG_(H}+@aC#}lf-Wl{I4Vy3X-C%47891 zWMqX?-{CxLPnMT-)OS%e5!2L+?tw6EOAMR49_!iF8*NrNUOs^cY)auCK;asCo~k$* zqLf60G1}H9bB=LY>kORs8Ixi0^(V|Jm=(n=ua=yWn+oGSCXn;R=vP=r&+v8f^x(u@ zL(ME0b2pJ6{4jGHKX77pp;a@Sj3Ah`PIqm+0iSo1daggAO|@NH+^KSfx~AYNyA0%+ zPG^^%M7gDS4aeH=uD9p_d+6Y6JA}(+zIj>FW`gGB887rimdF&6*-U!paM(M2RvPa` z+y-~NT-_e;&Nk}H#bcg$>1%c*R|^->R<9FrvIh@WMyA`Z!FkVzM0tfd4AVAWLBgy= zzn(UBV1otXq&*A`Kb~HOvP+K6)A13S4i;2Q&7M+}@Uae9C+8#p`}H&Vw2bE5P|lTs zHB-;@Zgv%i(R{N-A}R$ZBJ9G@qxqjycKR`kcZK9n8=|eN#g2B39bVe3ncK9e8kxI# z&%A89x~OU8JsDCil7pLgDFk!W(AH9r^YjDG=t%sIa+)ko!4N717F_~y>CPZ;-PY{v zlf;4(!6t}m=0qZ(^(e*y^95%An*K#UyC;MAlT{l$U>rtS?3hNVQLwSn39Aowp=Kt6 z!2Donct*BR3+KoBig4qP^x71$+R;sNn$A-PPGg$B9RbAR&1Gj~Ej4{SJwF?7tVw<^ zWCS4c6tVWWxd&GRn47sbbfuf-n@ zxcY3AiStA~%(frFg5txPuO)h0m0B~>5}T$2Jue$_mHZd$JHPyW@vp!9vK<7u8OY-n zrO_<8FjQzv+VbG!mAA%Il~-Hqh)&?YJbvw#Nl4=~|LSJ%Cnzxb&2|nKo3PzE*2G+g zyCDEKO;ErB$ZCF>^N{oHY1*YvDc3aM%0(scwJPiiJHJ^dsIo@snUxM0r|cfA?4As8 zk5+ynF1jX5K%pWTNz4_25mu2ZsLC6t$sO2jLkXb$EtXiqliBhH1rqxNV}?8MCTv4iHE&J>r{2W8IydX*^_$dW4Ngg(3wgX5PWlWw_W zl$qTxHQJgk)p;(@Pn+gQtR&asZx$$D(HZ^`{q2YTV&RR2xJ8!W9{~Xy5$qq)0v|$+ zrd^?I?<3jk78g}zs?#goV24>h9~pxUK5gA|@XU=8?=$`;goj+(uUBlua=OCZedV3h zwV4|V?6#V7TMe~t6WctdIr93sN)p@^bMgWqxeA*U4?#_K4mUg8R0qM&fBD*w4-_1I z3TXimV0OS~jRl9F3c#$~;WgjsfbL^Q-4}-&lSbm<78cc(_p;04=3wk6 zj5cxZz;*9}*^IFOzJV=o7o&Yl%RF(zdE;>dyY5-@vGqcr3Dya#KglNa*+yjiK{*Jn zRC_Kne$U+*0oYbKRcz|ZZRJ%i^2gp5?Ue}+I9IUY&nW}z)kli&Z2L8v`hf01rZ)t{ zokwTnHxRvH0@)0Dtj}K>!)$8Bp0ng(1MR&RTqy&p+nFmI&nqX;Zr$pBb+;+1=@#gY zip;kBwPmVpb_jJpHKD zG*Ss*_7Mn+lhe;_4ja{(5McTdn%<*uqZ>@XZWE@et}C9t82t!S-KXbf)`94DTsx^i zu!eQ+yEb7mocp~c6h{>a7ZC{0lLDOe7$xkEN_a*j-pMxa?dCj@vnlgyTqkV7bGt1s z!8#>GSt3VWdY~!zA!$j$R9O7ONSWm_3kO;fnF!&0h)1^saA!BxTCMOZKrV<68aw=D z&rhUvSSbHIgO`O+KInnUa`uw;eH&wmz*e^FicFbz4XpRh+G;MPVGCb(BZ3CscZKea z4>KeoFJlmp@$tXDQj)_m%d^p+D982Z0fHqZ4hul?4|Ax22Ot1#?B>3s`O?!Qax`;g z!f?BUa~Emti!Su4*KwgrM^XeE8$Junz;)P36v<+9XZ6g}DotCMZ#T^0yoYpV4 z$5vB}QJeJNLS(j%#WK07b6#+B(T(yJ2gd0XvY#Xd>#b!z?a;06sZ3eMYU54Zclk8MJ1`eME z_J(%>JmYuQ*sAY=>+)^04xAPyiI^3o>_pU@IKu1#3vozO%B^PtG9}c6X&1_6Kv_}c zb0GC%seCRsoQr`wj8JF`^&<0eIy`L9@RS$+)VHGVPS*6%y3gk-d~^KfQqnBx;a~G9 zuU?rKFNT+ajEBTmdXp-1hr;sht=DXU(w^nr0{Lv^W~W0|^cY4HT6L#=WYHelrX#PK z(^Pib!w#R$#aO^DXQ}}v3fyIHuDNperQNlmxLh9Ql15oQ_d;G~^^iN544zhVovi!@ z88?GK`iU==dvX@s)n$zVI9`cCB`*c`AOb zcBc6=raVNl6=}6FmeF&f{v=$_cnc*+L@`u{K<@-off864ES@liejO1bsz}0s$+{rd zKqxsCldw1Dj(}{edBzb+_=?CL$N!L}Byk8v!Kyw9iQfO|c+gX>_Cb(SF0(+lX9nPSopGteKAF7y4okX>r zsws}@AR8`}1WszzzyRWyid)>L>aDwmdiU)0i4W;bF=$!3&srh|g-od~ zJ#D8NSu*sTGlj&4vYI=BEc)rwc*av9peLOuw9Rx0Rusz6Rf z&)QfmJ`t@3TU2J>ME*`n7>W;{HBcZ$VKbTJ309k68PCnFJ(F&E-`YM|d=b-d9B?Xp zOsvRbVbhHhndM(mLDq9jw8oCc{mx2~O~Dn#a;h9yepLkJX6CgYbs4X8Iew0uJjy)4Z(_g&^RSLcIoJg>$ z8y%KejVIr6G94qHGdv~~#V^zRA4hU9(~y@9hHIcgilyP`lMSB$9)3|)wa|A9BIa=5 z-*1){Y0bi;&FIpMmYojbdBecw@`Dqc@w~XWtjHt4o#;KHwny1K;uZJ%@WUEL`0)Ex zfZDraG27h9MlF5}M(&6tOx{7&9++L*biMUJ^uy9$njh;uut9Qw=Hv=Y-DS3oKE8_ zf*DRk+^EO`0)v1a<7pBwFk2%5Jyt&oDAUHk2OOd1*@di`EW$gewjMVUnvxH2;5KYJ z2_n+F%l`BH13{{|l2!A!!$;Ms+9)fVVV(@GP*N=i$mkql1F3m8p5gP1(fXcVvqPq#)t`KHOma@ z*83<1Q}S#?3qAxcZq(&RzM(6mK(o_q{rrj-2R+7_ui+s(z3oR5=GWitRPCgX_O^)F z*TotrayP~MpVNtIZ{DV}y!Kz*O31j8$(BrsW%M~-W@RV%o_<^wLyJ4wXYk%DE%@vS znkhqczCD*RF-L(K(~g)?cyLLuL2J~4+%JU)(^C4;?n0`^8&i%JXVVov0aJ8;)h!cN z#+R#_Pfm}jhdRR_yQ>Y0^0wtGQkZf{#!;9m;7m}JZOwHMNmS(@OB%MXAXN!Cfh9bpnWID> zg+T2c_Q@5@#$VpeZ8w((1MYg-v1dTh*xNK;5GF!xwwEf!byK5RsK7mx^PdtDVBO4) zKl-Xtf6LA_#9Ik`gl3EMv|NyO@&E1Eo`^!kyp)?5J7GF5W$YkCMYK7Dg|h|oT5|1B zn76s_yODSTeVk4AT0Hg#^)A8LT39eV|8*y0VRi&qI^Cq=LyqMHqe75;S1VaMp_cLo zZ+qQ(%jh2kdW)0Hj||hPR)UtdaPqgHlk!;s68XFT53H;lCPV+$tfSIcQ zj~M_h!wmQMDjLx^6Z^%2E*z?I5RH_Kv=)qZ!yYr35y^DN*uK~Cc|&09qsBa)+Uofz zpnG)RF`GpgVBil+z*)~#|JdAZm)$wNR}J+20PO+gG;rQg!s1gukX95U$O<0S+?JN= zD}#f!_(R`cSrIsG%({!E2V82Arw_b0wcc{-y4CJ8#nju9PSx*@ziN!Mt0CLg3NG?b znm%P0HXEzEy;d}E^AyNJ@p6Lmk;h2ESW;@O6d}*lmDy`@996)D2t!__tJSro6Zb4hb*0SNmK8~BYVJ9mV)6=X^SNT@9CLy)Ol`R z>Orb*BMVg`xz`X8M%}uG04EHqK3zq&;X1CujZo?OoV4esG$R~SU;5EjN}-{?sp!fS zsf=E9j^LWBQB8KqV_^8g33@m&pyG8*nj^&Yv@E|p19Ql`RhdLbV2q~pu)$w6PFt6E z=`PPGRuh`KUs#}k`g=Tvd@2x7*mJ6bym?9>1&-uv3z8RyL#keK=nWc~gbnvN=rQ7Q z`8E?=4Xbay!9I~G^({?mBhKZCu(5)x%(bQrLo|C%Uy<*&4OoB1IatAio&Vu5b9jrA zwhXiJW5jAHuJTwK;_|Jlypne?0Nr{w+24(^a0`{R#YL-k&D#!47%t$R%yBc+pYx!l za29C^YIhA4#x;lLX!y&dTOXb&vA~WxiNG7Bf!a5GFBrJ9`5L`sl5Igh=!ji3EYpw2 z8L1~ZKX~pSeqh%26F_`AAXs6Ky~3SYDHV>|jJrO`C)uM*GO1*(!rS~=g9T3160vzs zU~fU!OG`1s;6fA5%}4IBPtMdUyNsNX^pd~eqC8!i@uW?AoToK`xckd`NIWSLkHU9p zvP?bb@mB5RT#9{EVLq4Y2Wm$>ZHmTfRm;LDgOgLIdtgeMW=$?v`;BDo{AI2k7SaIW zB}pB`2sU8x#~DP2C~%>+uc)Z7Sm?4O&cY|Ji%E69A)!-u#A<^Xw6RpK`1I=ojKewNFsnlDLUQ{7u>`yXc35+_-PAg#VlT*`Cd2 zmf3%Hg@#ouL@&1#W>qo-^mqO}KS)Q2>dQApIw39aj>+AzO5|!Nhj1$-3)R`9Lau-Y zEF5~0fib8LZOM63A+r;~&Bv29F)+?M&{-C^d1Bz`t8ToHkVSzRkPVuH+{@o&g#Xup zXp;p;QG8{0eC6i&P$gohmY_PpoNi5UueDBUUG_v!8?#we+_QpC>P;ha%E?$ptKS5~ zAFeCRHxd308bdSljmSUYL(GYH1KCiravfshRGK_%hTXY*KSnV-Z9Jo*CFQ6ICE!u$ zwy1!z^DwJ%c{qf!g(EYV#^AFhusTH8Bzd>~=5UCkmN_F@?twATmrUouJ%7YvL_{m& zlb*j$pI(`~h)xW;Wam2FqUm&~Dqv@P$69YJ9Mk!kZp*ZYq$)EZ3nfp@F>SLg&$1kp z#c}iwUdb?6s5ppCnkeem9VpC{8R_fnmUo5ZzNPoS$v2b_fcCGBp8c8H{^ryFhysKu zv7!L*6iQLR-#U5)#;?2>`{vdb)xX00HrDJv|-?ZF%xj zPw@`=*IMAe)nJ+ck2&j`7whNeozJ(; zn;^9M;=Q~W%8~kU5%S8k+e+vuwG)G&K?7#m6_o0O!u-ucgNM{zJ#CS|yhxOQHjSzz zj^^>0tSJ`Khwyin2)JXFwZ;H82r7Zb$yizsx`^#?gZ8Ce-C~1hm-_9QiI#0PS+lh} z8~$kWgl}sX%)i;vbj9t~l7V}knYwD1uGrJgX{YX0y5$%Vo$o&5dIl2vkKujN<8U&; z(jlGt^Cy~rV9N&?v#Vu*@csxs3|DDcsJ(5T!Z~+8f4b5>5}LErzy$0(;1;{1siP$* z)+1`O96h5QB;<~kA8O5Fi{{+Z8Acn>3%n7#hBUV7yWf7`&K=XRR)BY%<1;4S46)n> zmGTsM<%A^AeC3R_4a5u2$VBNtjY&@zu2!D`_NxuvL)<1Vx;)_{iXxMPi z(ycsi`YTxJPTOhXus?F5e6&wL3J;OMn^>D;4yR~)ljY}aTY2aA3aa!Qd6#d)h_OW) zC=a<|cMTT>dzDy}?6yVH!4v$jT{^!V=x5|vpq{SQbJc1(R?K7?gM0CKWNy&hCexQd z)s?|0Ez$0=RwgwBGSuMttUpeYlwpnftT|8yK~s(;mdGE(D2Qro4O$(&5~2oxKJC!! z^Hb$H+sNBB$#z?TJ6p*#o4iyiau)T>Y28N^^Hw_zQJqUfNC;#&d@_p#ybC%K-+X$- zAo;=$3;iWMGsTW9qzQ-XQ$4w|W)`S(!u`rgH*;rEEEp|;EJ4{lzTb9|YDVLgOTldg zhh(+$voKD!bvnf9%sL2|mWZHr3K{7L=Lq*OQhi7XmxTtQ`nf#mN&JyS^ay%{}ONYW(C6 zPPV+Ie~$(870HN@JeijK3g9ojm#%>jw#@xIv^Z9sW&(Q|JPbnayn18`Ry}9Ac7@aeg4a?bO3NE zjHRDYM7${g;$J#RHwVD{i%Kj3*8iffHUPzck+mHF>0bnN0MPwQ9o3Ei$iHKs9U=%* zwu%8rDaXzLxW6f>lR8$R_tR8soBZzs|6a5T1Hhzwl!HP53pF6!aTgo^#5CMUlsjAw z4OwZcm%Fdyk?yKb)zCb?k3 zHjevu?7Trnw$ZLM}TVxPR!}1xUTo`cA=u z3h4P^`ceu2y9oulj|LgGQ})l*#;(hgp4i^nQXsn(!Zru&sGe+6pYa&jcg1x}o^(=Q zJ7Mm29y>q#R^<8%C|(W2{1NHR_N)ciCGAe{Js;}Q4(hpIr##VM{b_uAi~2f#ZDerY zy#K`G@u&0a#}6Qy7#6GQ)HzZ=(YW6?t}4By4BrL(hD5l0`8py zgSKpH&p!6fGacUoQ;|DFl>2Z?6S?AsrA=64T!=(-9T`+&mm|2#61f(oZ!JKaa)NGb z;)J9-%zLz8=VD9zXor>>*gsm|;SO^9tEEZOnbec!@{!G!p^-_V#C5 zuYHx%mW-ySj7UgASRkf5r3D!(b^_fL(Ef4>6Q>{T9raCWg(vE#!6d7&!eqm~i=56B zubK>mi8Cp@Oux+7S@wDv=!CcL%+5D)^MM1Z(KrMLZcDDOOJZPB5M9K!Ei))%eYGv6 zR10Hsw}upYeM=f!X&gH*IentJQA|Z7U}U-L=?gMhRJgfZwwJDyCe;x4CCDgCz`&J1 zS#88f?$zvPm&dgR%EFRXp#rA{4|uuNHA_Nh<|B$H>~+bmas_Cb`pndZMl&9(Af|)C zPU-{2lc-HKQ>6=lgmIM`RW4nxonkh*2=0JRs+jpuFy|bWkZ>-f^p@X#qA`%GZOpTM zPD#Yejo~#uRh%`akirJ4&WW1{z{1T1c2~DNDhy@~x4sK5%#KkL#p$4USUej1#fk~` z2wd5LN_S3tlC$ft58vcU_8Af|@nNu#e?_N9Ko{xKAHl`f7m>vweN^7a%gtTa*L^*g zkyM2^rmF97(GhUeh(ttiM5e`cwuPCR5o?rK-pZNmBu>Vc`zkU|OI~py2W0N+*Q~ZZ zsgMgW7^sX*XJl`}NkgBBq=X#4`toYciZm}PZS)laVJ%o1({@71Z2+7t79`@kqb*M_ z2M$@TH<0rHqw#BT;lX8pg+Wi`c$wggFYBOlQ!PKFadftO!XDSB!Ci#C`uwzc7;$|S z2c|rE-zt&Lj;TSDy$vcE8j!m}5eHA<8fm?VIE;mQY9}LH;dk-(b}77t(j8spsuGi_;sgtGH=>?Pu6h!nB#be6#Dn$-(^b>_+Os1yx1J&3w*7Clvo7$fk@PjR$8bD3*cO+F)Dt}df z1q+!ICfg8o4PLPl8!nDMBnxD{5ejDSOu9-PJ{x#Gx~_&q>`lSBo7yApY$=Lk{3IdP zobT#|P!=~P-wP?h2VaPioVf?VxzoSS$(0x_sA%_@1j&`7tVYl@6}}ccONj-uUOe|M^ykN0MlmG1rv&kjZ=OH#w^wMZY-#R5lK77T=R=fV z82QSOZeOAJs^(Bz^5(>kC4;hv&psOx9&Xq^coxl393@cugl7R&kFh+Hzmri!`?=3S z#RLl%q0a+|=2wu-pSLklbxR7O(=^YZ?q=8BCh3RJPlF_{z;gBDC=AlxMUY0VwD_!*o@Tt@37@E{!hSM&iWFKgHBB+5Hoju^-w;u&wL2>fkSU*Hm4W zcc%E7$VDh}aS0%@*pR*ESscch{*cve=Xvs!Q9iP=)*zZ1Je%#B5q+g+B1 zNGXt*b=^{y56yZ~lX)BlC{x4=x3K?U$s1lu)>b}KI;zn+IT}{cZH0R4wV7zjQB+(S zJOYfBe5JGIWpL&6yeDSt3%E)r8cDnc_I!FmCK~?$NmwitZ3i>umHPN?z+RWqxh}-d zV!hNTybT(RrYI0G=-YXGT5CPTO0=2TPY&`Pf->>nl=52{A>xf!BjXANHydUc%|`BA z*uFrrHu&EhaTME@&p@t6s=-X0q(vwcB9d z!&KD)gG3wrNJGR`t{sE_#;+`}R!hTKXC!{P)Z)nIR z<)$Sx1%+?~x;xixYN)Z3p%A!2c)g3?0P;hf7@9|;rB}X*1qKYCf5>cemKTCAp-Y5{ zR_u(W&Ez>^%kE8}ltpxz)!_lzbI18&NNFg5LDYBTpv!26_C~U~>efHb$?q`6UFP?a z>UA^FBU}0=Ym|UmvMdS0XG>}wo%infK73SP2Yo-ThrBt^I{s*6X-)GqT*dyDOj9~F zZnxDNqjFp~T)qNNIOOcDGf|b`n6P*W=h;uoYD6t)mPI9*-*C+QiT;xDy2G`(gonHd z#P_I1f!T~cBnLfo<^AlxDd(lVqr!z6PS#lUE&6a&MW$%qQG$bF@KNzY8QV`ygpI5r z)Yb&?7i`}HWPK7xr_OTn+WSwuqNseXUwQP|Cf9C_`*lu+xh1KaAqU2YYH3K0fD{G_ z#72$=2zhp}SDth^b{7|CR%iCFPpHxcK>T|cAAt|j%;hr)j^$yBEL}hMgve-z87Yd4 zTiv4cZ^sp``yss(a5h_H4kPP9cgr}iNw!fOZ-kId!UI1lvx5ThzMfeeabfU!G!)ji zR@Nuga8UMS1Zfm_y@xp{uF;2sT`MnBQeRMT!iuOi0FL6QuWG!K zCwKmkMOEJr@I!w$Qg1a@fho6AQcviEr>c-OSjV*O(0zqSUi1i@x0HuD6|I=wZYK&# zAF8cIGi)4gY70LHU#&qAN9wUz32+_C0j)e5K#H!@vNbzxyH)_RL38D4YM}(P=iv7r z#tPy)>PMAP=__CJ_~Rhf3)Da3kEYO=Q>ya9Et6+lq<9_&%rJm z{UE?krwlsZT~UB3+Ms$mbL^;H`!*C7LRYf2$)l07s~*w*y}xN`7YHUkBssK$-$V-b zX_G`8LEdHY@|V00zHf_b}LiY!6BL3x4vXGzw3qRRE(RYjzd)RA6|JBjlbN&vVSn# zyhc35*MBQbB%^wJ9{|JV{E5RuJ~J?FDn6ZzhT!68-YmCe50r(mG2UXxP)4T0aZ z?4jyq9O8UN^JzEu5ne~FtHvH&6~SQSdkAKGS&b+B=+ZVa2OQ%{ZvTZ-$b}3f0Q&r> zSEWa}G4yxoDY27ZjHp8l34}f(KYlYxa z)E!#3M$8%^bOPuNb66jDK9TD>82R!`ZHlG%U$RoSsQ1pN*#DYT=UM+k<;G#PM0I<1 zDSrSa+Da3=2Sk~XWnEhraq=^OW^cLp#Ec8<&%muS1ntP}?i@C@pfuX|5PWOr#Xej( zew3X%JDR}^Q#iDgPwh_p_Q9g4+TOcWKa9L=jhvBI|Mb|vmmu<{VnOwQ&XP`eGN*#O zaaJbYydKsa0&`DO0YcEYZ(f>wZD#KC!DUm3#)>dH02+vWAP+rB4&70Cr}JG&$+7B= z===6Y4KeHPiWm{RZiEfNy?F82?S}f7-#P&j_o^1}g;^MA95~7-r%n(|ILel@+9yCh z$}0O{LfG^D!>zXb`}Op87cQ*d$y1C9_pp6%i=`NowmAj##tqa{4b;Ofcf2O9TsV-b zKqIi#floN}w^}*}=qiiaWQv@bCg%f_S-4H;SWW2esGEn+v=IAGAQUu^0qJK+6~7e+ zstle~C{xbN#~s(lFPxh0<+qE^52tI4Nc|G?{4jR4w5RxkxnG_-99QKw^VGgyfBX;X zDS7={7h~`fSQP!_@QC~sOv#1;P{96{j@D#HDyBb$REG%v@q0c&N8*%Em;fOqCkg-s z{N?p&!2KbM$}P)nV=f&5{!KKNl{QY1T}#RahU_PXd7HYR0e5S`JUNSjXL#xyp6Aoc%@42|0s)a4@UQtR;nK_t zltL{7RIm!>BMzaXEx4i)(o?r4OfY!TK<4CU-7V=j1_-?g%GK{X+G?DZ4kHJ#B>A|5 zD%!h=rx}g`!W{W6K^(>%RJ%=q_q*Uu-{=Y!;@fh*Iv)muk=bBQNTDmQnX>0LthQOm zl*59H0aD5C%hG6hJc&|gZOpz4k(M9AFH&hacTBqR?(Kjtj!>A%@^Ns=0CdPAfTbp8 zpAzTRaax|Hd~B}u5&2pg6H^{zU&8#adM zHC%R9_F^2a+qA$vOV2tNKtUdf-C6>z9e3MFjfGPx7E0Pwj8y3AMB7-!bzN3@%fkT-y;PQsp9A(Cz?fpD43s59 ztabf_{T)DkhtS!?&os@SDs-8<_)KTCCl4Q#`7f9Xf@vYn!fwH2XQ8jsg|)0Nrd0Vf zgGAdBzwK(w6Gs0S$9alRvhbv4VxCuT*oXfjo3BazzF_F_GcX{gIEVwpsjf?P_3NdU z6H8-UmaIVvs2VPSO!0S&48NLv%O zIzXqE<_YeW?%q#gce>URvH}=F4Dxaj@E=x<(4kL~i8z&DGxq)TcqRF|Xi5G$l3+>d zqfu{daTZ8V?#lO}i%$#=eWqxSYbSZ6=LLt>@gtLYL-h)Q9R1EH1{la^Ma>TGa7VQg zQ4r~d-VtJ?Tx&%S1Ae&+3jV460VlZKNA1EL#sgxT4}uV0<(7OS*3L zXSh!C55W9>#n$Ws7GmO^zoq5f>? zko3_7mX$BxS9zzi>PPP1{H^ackj;SS-Sx@dQWiuhAS{zx=WGGeus92q$0c;-mG8wD zPWc`;XY(6@FH{J)_rRLo%^jTQYpmH}NspGKE9S5{9uci%yU1(XKy|DyhBd?dDs8A1 zqg440Ghq6T(a8CnqN}pv)v7zYbk4AW3gZ-|?a^fLGh`To_$n^*t zGHY}~mX#YJ?3lUXvfcNV#Srs!ik3`YrkBcMyZARY zA{h2+_qMP;z(ibkwc_0&RoNls!Qt_l|5eR!qx!u)nnec6wGVje4|nnR>n=>pOK2Gg zsBvEdy6;b{qVwqZB(}a7B-@jxwjWSjZ>W8_ULr7yC8NtFVIG!KFiEmDB){L#_6ue+ z>AQKx{eTxTkQ;?-4Au}Z)B5a!EsG4+kTBB5kSZF2scN|@ z)8+_;Ct`?{)nswzI}@*w{6YYzdLzNchQ_L2fq0|sOmXrWcTlFkrg>d(Jz92sJiWm8 zFs-sF&uR*RudSY$*OyP~qQ9!(GAa+pL-xsIA-r_KbV^h0G{?c1g?%NLxQ@XV|M<$&ePxE1GY*!~NKv-hD?xZg4 z*nO0r^d@#6AgJ0e_p;G)mE>OZ%$j1k1owYzBp9en-vRJtI}Y&g>5i`!&<=idPb8|nFbwv!63T2AU0X>1|yz)}6`Q~aGT zngg}6a6GIgUpYcOKwr)0#`~>N7Ht9Kb5cLU8j|C~8q(^*8t@}FmhG)_he)blZ5~;q z2!N<+GPO1m85IWKgxrQbL0aC3ATKcdIbeEK@x8l|Iy9h~Znye{uJGm??@|Bv^w8;s zNPX~0Zfq7z1u#PXEiQZ;vsnQ7)DO2IeYWgIPuZ#jC1|e80l@wfQ1=uAU_kyJE-=6Q z!6AI|QpP@cDYX9`E~tS2Y{eQ?ZT@wzhSI28p9|IetlttZk*c$cz%)wc+fbszfhWX< zGi3gLyIcfIuYo*|1q}%43Ran(NRp zoA2Y5;0wWyFD~@&9pN}cD`wq38-A_Bemv;xvDm&$cp!8-GrurZG~MqcA|tK7=tv81 z`dr#v;@mMtodxUln(#D}MYeYy2$TLM_-1p9EHigF{aDSac~-svgVq8b+523J7J2Jp zEO+Y6r|1iH>T?dfwfyQz$SSLqt~ON5eas#7dIKxpEtCOyBf-5_m$a{>3qw(I)`T0@k%Set=z&rYl)E^pRq+qP}nwrzE6+qP{d6ZOQlolKI6Gr`ICJnuPG?{}*9 zkFLGCx__*yeeLUB7ub^pE^&4t!%rh1uul{`qUD@w@*CK7`!a2_XQPtXZlda3LtI8~ z9SImHlBr!Nb=(M$j8A3C?YH2w-AC$d++#c}Wa8_!*{9h7uiY)!kA&H&^+y0CVeVz` zJsa-W;8@@ebISaYMfDgGFsJ<-6H6mG=L0Plk5O_j=n8KID8s^T@avr~{Q$N)1uRVM zkNoF*Az);oA@O8IIq8>m7eT1M5-z*yeII8pVyuPL_2lg-PGA}TkkR@1G5!mv+{(FIZ+t-!K3o-+%x#C$wM1F|h zkJwmoDB~qs_buBY4tcS2^mxFylP{aEE#7Hs;VK-^t-o8L8eU_X7Tbwt%O8lo%YF@^ zU!1^3%hWz#?v=*Sq%!aWdBCf?oN~gqe#HixVI*#`v^!=_nR4;?s8I9^HaSI!uuEn9 zdKO1rD>xrR2#&Rv>m2)*r;emk$hKNFd-fIt-B+!|L|&bG#q~gsBF~dq@zA$b#k#-% zHB%1o6%}O|wr2iwmJ{<-EaVYZT5*9hM?fg`P<%mi<7g$!D(AL9WP^854c9q)%C`lu|C>+= z!KoeI!|a))uLvQN^lCOO6G8ZU5Ku@M?Tx|94%a=9vl>zS;^+}LO=Dkrf;E)PQo z6%5^x#%Iv&*qIM`bBzbD$;wVQI znLDzKczb#Sue{?b5GHe+>sg7=`uwwI^ zg~vf=aLVQPilbgB7eO6jp`R#T+#KTUBmtlQm-C?Ou$!pv8u-4z1-#Oln7QOwQ@7@S|+#IA}ori#&X$#^%VV#U~-gT`sPhjtLxUu0`aIL;?hO2@eyt+$qHvB3z8?7CA2oYAj-yy&nYP?-1Y?b zsGK_&yr>G37S($M#j{Cesb&i9*%{hNhNUvwm5zW_<~-VxB5HdP$5eo>$)n9b%kkeA zCO>V7381dt$FD$g6zCXW(|8nAbY#0Db-_2k$PyxMUm>V&|UV< zaemHwSsm2ZlYIEU3ZJ-ml&Vs`A;J7Vev<$2&F@`B$k=W8=9~Wm3OgLy=^5eWsUYT6 zX%t#e8yM&`*+xU7w(T>2A?C)6fMStsS&#XJfhmwFh*}N)Njx1!!fq&oA>wwDq zo^=STtoXd&TN$pi-ubTizJE>{Dh57&?!jEJj3s6?l97fYqGJ7mhX%3~Ya!<(j8+rP zM574AmjK8_$Eum?p%1&|1aMIVl9&Vi@Hl_zVT^Z-UMzBP9Il}NXUXhx?T>_D4zZ&BM7x*S$2@WrDi6@6E{KTHp+b^o@UU7y)X>aSNOiS;)Y|5$6!vR`O# zv$)T;cb!|Xui9YwaGWZV18W(W$XZ939*-IsSOHz*_1|(u2A0spEcx(>Wc8xK&t&7j z>QyGh2ub!c2`3*JcG%Per6`Jx_Qb*>Dd5 zr+dG7Ciy0z@{zc9y=N@{AUPwFD^WijG}+1O@odeamSk%v0+EX(Ix-`Nb5x>gbO zd2C6*bjwS>btG?if(8=_shT|!1Ix^JKnH2>fKs7J@cui{QKEB(x-)PU%`d6}%`XlJ z$4Ys*Wd#+ddC$qe$d2g{fmQqD_=&r3Ah0t6?{ zJ^4lXv@be09~3GRTrJ9sRMz3Ug~HWt)e_EH_XO!|#9^e|KwQ#fAT=JkR_t6-o)#&? z`i)@JDkRzFmR&QGl`}2ldO$^Lb^4Ze)m)C+_v!c&HCyxFw3_kpWAMpV8e( z7SM8T{BbF*w2Pi`^L!l35IH40; z!2dIfhuL)#*t~C-3{qh#!xoPUwf3_o}MreBzT9%(CC=w8T=a zKIzXZ?e4?Y-UW1jfjKeaqzLLP*KxLV|4MHXT`rY@h2xGdO;$f+P{ zFjhS@F^^5*kkm-Y2O;PvBciO^3dR!wnIBC1mevbGZ2z&sd3s1IZH8tYo#eaTbL2aNMNhm%=QMG}LcTyCuWa}q~y$g%R;@D8wTgQ|M*9_PrPr~=^ zlkFjgBym3M8zii}rwCbxPM%AGq)Gcn+3io=4}}nK9p3zOEyW{Uc|hA!g8wS~@-cYm z6%7xXgQx3dvBxb5?~VY=2-kb$6=sis%L}*c`_H&C7664R=G`94&SqY_m zzh_&j?T~blHmWYLo>#*dqxij*L`f-0k0a|b4VP*I0NN-Z&N!z%9FB-RVxN2_l)!vk zKbW*ytA?9dLgf)F5-7FR57iP*_;*VLL?qjF~A4L3S4v5Vc&k{>h4dO)L^0jZ3_ zZfVlbd+JMqxlOz&!o5=$RAA4mA^<=B*Jfupb%1dGN3&Vo0rEeYO3Ym#Hvg4{=68cM z{AW?A2PE{r`mEJHkmmm`Hco*o{-4E+a3Bcxe~6RY4Agcy+>amS_!&a7-5w0gT(*WmuB}ttP+Ux z{d>L1efswuAmAGuIn}C9@b*Kq>l~xr!&x3-^)G;hlkpUtp#Ct;A%L?XdECZ(N!BnV zXZ2Q`;J4$$9M{ui$>c9vcLU0pRo@pA2akJ*owF0!7nLlpteG6JA&aa_&pQlk>-nx_ zQPg98qLdB2UUdq4R4QRiM@$-zi4y%e52%gAA5cAAfxO$jDWuH|)vg&ijHlZKGza_y z{lS3e3%{}%O>ZjA&-tjSnfpscFGg{3(Z9Iy?u%7-C;;b=zcL}`0PaTjDXvv&hvye^aPS#9VkxR z@Qd8{@cRB=wGkVk%9wBe!oOS@0Z2*Oxy>- zKl>x^p)=bA8^0BOUZ_7~b9`SSXC%!h{TT#KiZniJ;RrE>`ReXjo8Lks6#t%rt+jwW z-8+1O0F=RA$Pw*NPu)J7BS_v$V+M-vHTjo*%>qGh3|;S5!)hF%G|l*(+jbE#VYUmiwLbvuQ@~?pE>DlIJUzx`)5l z-Ii#W%|@N8xs7dOhr`qNoMu@wXkL6siK#ubs^3UmwzI@dmkDVd6~@y|T($&Xw>_h{ zffSGC(cMn_Fu}e?ikGr`nh-jbLmU7Sbm2sWW)-FWTWkEN5}^YkGrR#N9OO|SUl$~a z;w$|ru(;&cZvPA+^iR_pId2IvrFX^qVo5l#OYMjOY#KkH=@@c z`qx8L7)O}38-I3>8SS4V+SA`ml8mfuf5ElX(0&gL^~1DTdQ|7xXxv#+D(C@g1X}xu zZ7@AqudzQoxtbwkT>O~UCL=De^)CORI$}UA zEy&9ygz!yqKbxD_W-&c|nTRFR5=Ok+3%JWUOYiD_pGg!F+8?-3JD4m7`4Fm~iuRQ? zBbbq8*D^y0*uSYC>*}*r@u2}Pra#YmSn=Rt;0yho{{DT@)d875vjMn4E}pSz8AIEs zmt~K$HJ33mlqVA>K@g%uEw{1gCmI(eo6uS$$Z~w~=Q(3)CCWJ9ptp@Zxut7t=+TtX z;VjAIpcyv&So)g*Q8pqx@4^wH{R=Tkr z34R;ebS^RmK~X}#wSyBmTEWfh(F#HOAt$*;*v5_&BMCyn4)%mKPMWE+TZ`x* z!qdo3%mxCN`YLm532SW~J@JUMg0P&|DC@H>$SU}!j_r>Lc*3h_v5=lZ)>H;H_osEq zQ`Jg>A(c{4kRCpi*q=}0=U^5d;3H-3#8fDKKLL_&8|Lz4z3dk^%B}wTieysWFbS9cw5>m-6LPW$-I}&j&ziRS)>74Es#;?AjqhSwjWam5Q^h1~r ziCSze!W{qV!p|Vco*4+k90vLq?-|)8SW%*KOV6{%c~){^LTaE!wu=SlmHXq&lcDLL z*b z4; zg?KQLCKXq#`v}QHBq3p{Xmra$*`K%{%i>t7X1sCHUAxRo z-zWTZ;=bDeZBce`#zvf30u7c$6fQu+J)zrY$qZnj3-<)C5oRJ-m?9e9qhFmB6}Gju zl5m4+rt{uVUws{0PA}E=&jZfE<}tbGW{nzUy#`!=;k~levmC4FKw{YazSChOOrAyJ z{OfGxwAqvR-OqJy7XJe{(**djXslQ2M#v6M6?R=ffsbL@0Xi#(#*lX~M;UOJqFHIW zy=*9BjDSTMGU(zRv%KNcaLUoD%4K3$fGzX=<7=El;tFmIRDy4X$5W=!JX=tV<)^QYe}w%? zTV)wwn(epy4X7Ez2WF3S>fn4amU!qk-ieSi zTe*-5*P?oFEC*c zY#w1IL-B!qLX8ECzo(6}*_RqY!k41rtEBaN2ItDHUYWSwLT4CpH`MI2XDZ%vd!i=*}VZ)LJ+zmVB6TI(Gq-pj{ zZPil+Z&28n$WUpm%C*an@xu8mci4*GYwP|b>sk{_0? zT)Hi-Tiwi@hRuydHvf^!%AAIEjeFhB98N2Hw?|SDyN!U?>K;(BT$y5`mqYMjH5=0Z z1iC;zyj?@r((1A;22xV{ufXhFb{l+m`}`ckJOg_xP^=@T)kJ?24sp31O9yrf)k-G` zJEDJf5M%v9nv6GZ<=?sdmwI_wnE{-t*{B>XMN!>CWwxr`v!6zm$b>o z(OP)I+IpRhyV=S*5hikhaOFKqrpp@lEv~UQy)W;6Gl!SP3Ab;@)rr7ZVCS-{Xm<_F zH6rKLkHOMWi($@N{jy_6O%i<7VwVn=-z3=wP6Nw&gJ_^KtuC;cIRG=Foi34w3Ic@J zZ>F!8gaO-R!yM_$b=BKPy2|TXJyqo%>h`Mk*|=W;^~A(=q05)Jmu7dj zp$sWq8)(UpK8mx+y21`xs=A0@v{LutLEZ=_AqJvNPyFYKiX7#tS@rJB^jMW9C^9RM zrkg9Tn>`?}f7>x8j!lC@Jv``oY4Ak6o-oLewD27qI~0Cf)B@z(|ANKT#soa%d z@k%o5tuHNUX|}aPzg5}R);ZW%*(tc1Cu4w_vG^xiQbSS0~WXTVvn zGQYgG6|EE!-m(wr@vO<(x}s-h>ozvoM8=36#Dup48+S5Z>t_AOJl{y?g?O0VOSSg) zJOP$}=?A%^#*8p|qQ{f^K-Kr1e1%GDZ<3)_=O{R@Z~-WeQMK4E&d9Ab`OeZsT>E2s zyC(@NkRIbp*1sS^BNBbERhdYa2ZbXa>BUTbjPi)dS~6A3q&Ekrfkx9)OVljx;OJ4gYDbOn&p9KPuuEG*qM497 z)<#a}(CZ5F5Fgy7@jI=65fqL+sf~`^oZ=!2x`=r-)i<(};i>#Nx2B=vC|@nL{qU3* zEZ@*j)ofjd_$ch|UN<}L_DM82qiBldPf^z3zjdd$p#zyLdn1{@k{r5b@jW_D@;}=0 zr2|kbLAHmR3Xj&Uu&4hi9mAeGQ_WB>&BurDop@NxE*#M3zFvxr)m}Wx$u&5|@Q$<_ zeJ$%Vn>f|9vEA&cVNW*9K=>GmAPX$?5Wyi|BL`N=C6UbBO{IeItI^CH{Vo5}O(E7B z&y+Sh)^^T%F)ksaOVcz*-0F$Aufl&XOb75XJWCS2NT>hfP^%NOAE@egX|tox=AgIL z(ls<){dyv3>MwG3Kc+dU?TAU~xNN?vU9y;cypDq4QNggQmC=N)yG$88^sRz}))QE^ zm3k{&RxT7#`lU^Vq)e_O_v<5d-`ckcaOR6u<0$<^YN#T0pPenB<`jsBf3XP0{d3#M9BxT~M4VPyM0j%hB6D z5|GJvm^vpmb$3QQUcnTU%d%9@sY=k`XDEkYqzz-CG5{O{<{g!~PayPZb3+ znX;d-DN)xA#X?jMIx;S+b1bX7A#TIURLqmTk!?e+J(qaWnD>dB^Y9lgelB87FPsbK z5r{xGDIgArI~4k4A{g0lq_?VI^B03XQp*LTBIw8g!t}5xb%^Bz8zX(PNnSMXm^&wFs(q zdJ?De-*vjWXtuI)dK|X2bStIq-)%!n9l->mw6bjk6(dK37yA!j!pIL~KI7Ug2=l5> z@3Te$xr;2fHZB{W6W>Vs3vh0_x1`a)*@IXCE!V8#>LJZ3-{|FrR}nRB5b^7!OiVX5hUjJFxR zsQBa;8@XcohXCqJ9T(Ui=rf09p@s!DT=av4`hI9%;$pdyyw;UrGL8JiqMuOM4X-5( zHR=y}CsPr$lKm*e*Fso`dEk#^CJ_6bwmbg*FKy9$K>U*_K}FgQ}~(h0N}))W|)kKVU3FYkUlBkdWLUY^GL>p(M@LitY*u%$1# z+Q%vlQ`ztF=M?>_IG?h?F?=XqApZ12wP? z^DM?F-y8mi0klcJi6E>N1ywnI^tp6t9t4XeU-O5sb58!U;6g#IUI5HX=rYT`qdYSy z4QZkNl3yrJ*!ba5%G%13s4e206SeY`Qn6IyJr4rt9F~{1z(F2q&`^_+6JMM$W8Q2E z6`+7}jxArR#j9DrQ%=+;WsR~nef>Yze1W>pY!L`LcuU|Z-y5tQHFF=Zc0e0hg}GoC z_`Zuw=DwCQI+@E>w)sUx{N7?n{F_^sSS|v|LI_G6X;==b2up-22uTJKEja7Pj1JT+ zB3-DavSF{pSMw7HB524Q%RN_}tpvciy*&OrE&Fs4%s@zWE`JEt9>{?NW)N}7`=*BMs1scv{Z;<0 zdBJtQ5_H>u>4C6zOe$i%!yPX18#CvzS+U2${aK4BC3IaB_egY(a-75ORs|qycIdvM zvVX&~Pe)o2{Uq2}kf%qSZ#`Vvz`H>XPf#*a!_^Y?v4hZ+w7QhW-qEP%jaO;ha?fq& zjET58EAk*ZXF?9|roIxlxHN0Hgu15l^u;&mD17qbcV0^Ri^nJ;!A5$a#d2}Dl!lO_ zDJar2r7v`VLgvuG8(%8R^aPkY#!k9YkZ=j)nTm_ebP1x?WP-m(xctSo#p@TD*&7}m zje8Eh26hKxKsAs)U>9+WWGKa8AT!dLJ?0F5Wr00?a=bK3YfaifBG^!#)0OnplrC{=U+l~0w#}=UYsu7ZVS&?{j z|1=TOvHbYTh?35Mkbd8;Ga9m;D@T7Kg*!4CxE=y^9o#@?3|jK7@0jj7yTA3ZWy|2y zEg9(?!NF(H!0vErt(^-`&&t#H!$dsXZ@e}3<4xF0N*v?rPm}x^jrwjlQsNEAXG2;_ zge%m`;TJz+kVkpOrz~j|-tzrS zx}#{*AePK6=a`b`MRpB^T?ZSX6!s0*j#7`H*geW7*66`zNp;yvEnVWbkU92=>d>s5 zvQ+D(k>kPtPMNLyj+IK~lPn8kn(c$M^663)(p&Bs!bpj`X#(V}1sLRso8m{1!92{d zZ@XQOv@+TDvqFn`Kp?GSK%Ejd9GZ3Ix6Y&)=K=L1lA)4yB9RQEaM&>?eQ?E`$@L{U zb#4-b;Wit^Q+6vF(fx5gAeDddt&EemlZ1g8>+xD4+?0CvLYBQ5P`%kyAJJB2Hx&Qa z*yIw~%isfNs%U(LwNo&*1|8cM+ukWgnyMO? ze5@^i819;~JOzQzo;!XTQjMxnAZrfv+7mFhyi)ZGlF{g@O#7wRf}(;p<`tb*Tu=IJ z4MoAMD45V$@A`?>L?>x7;HJn=FYal=_*M(kQR>jzj zcJt%4I|rDqU2O}?zB;VU=cxfbhvNT~SKNhWETY8)ZC^z{CBah2CSw#c(a*U0lUUgoSZ)T z<7Xc@9-}QsfyNB_u#_|{Xu4FPe}9?foQuwk~Vdf@0c^qZ`RCyF4ZH7K~D#B7>|hh_nm9~Qn826Fy0wFIwh3k|1U#VYcslvF@b?-kgw?^)FwFYWbSI}oOE>+3EGB| z6lc}T$3)9jyA$RsOion&{YISbrXx;Ea1@vI?f!~T_X9(ueW{GTykkZu9RI#GRKn*U zn=^j7OZSz13+ zj|oqc)7_-At9%MH25=^o!&ha#*>dj(|0i|7)e|Pvme5V6V1#Y!10*Er zI8rm5;+v#w*~*`R*rJA4C7`)bZxbx4XzN(ZYFX3!YPG=UXJCfFY5s7F7iRf(#xLW! zgb&ICiEMV|A)z+9B`Dy;ibMFC9#KK^Vz6Binmm5Ff~f(|01ABETZ`_AF9;WuFx`jA znH-xrJl;UJhoE5HM(FkO(N+(Y7)(7+CMLF(sM^sh*iGqRA^VH)jOr+1pP1l9xg=a)tZ$+j^Q%SF8SeCo*vVi039 ze<_;b=_0=Ue}%O{bnw-aCdU&qIEce~pF*2wT*RGpr%TzaS+~l^58hyN{~$ z)|`e3wxBg`L8JKBXd7+a9W-x6qX_r8qX-YZqYCya04R)3ixI9Uf+ODG;!!9T=z58r zk(l5IHEaW;;HsuGoZfS}F6}9TS_Hy#DGH6=LvQZsOTig&C@ygHPlvvuhy4clNr- z#QMY_xw*c9?UKc`e!=bafw6x$p>OKEYCH@?0iSIKHSkHJ2S|5+z1)6@NI@85&9kQ4 zTA^W^d9KRnY6oqmkE={eWQvd_`14CCuNcsm_}#tqzpA~%F|2vb0Z_vIxUZlMxHWjC z(!-m3Pl}3&ZJ&zuuZWZ;J88 zP7Qcu{HpnvscWLgGGr9Xbqho6>&Vq9V^i*uSdgK&o8h3%Ymc;^*NTqrj*516KFw72 z@M)21kP-!^%Q85yqFmCtD^rXxNFWp8lhVo9!%(pGp0P zC7|Pw5U3xi^{sB%k(<1{Rk3=C6pdGMTayYqJot)QS+SNA?699wS{C7RD%d)6l2wEH znAp{Bn2xBTKoepx6A?vpmR#f-R;9K9YzI(D(A}22wq%WEmDj4xmdF5wJ(PzyK>ab} zE5x@2-pMyEr+*@>?Jv#nL*A0Op#kxdGrd>|4?{?AJ`Hh0g~`NaRsEe$bxd!*3~6Cm zm@I8W1y9UM$ir?#08J63)dLgA1LPL+rgCVcJDM_PjyMqpFQPNS5Xwc2)t}Ag4&l7tGd)(_xgW{g8^s>DwucIMk2nIbTn9T#6DR z6=?fv9E-#`gxnx%9%uqNY43wGoiWF^({6!b+b|~rR2QpK_4azjwu_EiB=a(yH{8$L z8>O%Fx-U9qD00s|i6d{l6PD3BEin3cZ{nDvVv|i{Pr0Vr@7|Ah_1Xjn^nRG@2{yNc z;>vX1;c?`N(@3;TiznaUXRC!<83VE7uAK<}R#WOWcRoTHj>&}`Sg12_q zn<`^E-HY2H7RJY;U^6c2iMaV;G;suPBGU$Gcutc9{JN*k`6OCV%^`s-J%`ni!ho}qh!O5w)o0!$ zH}}Bx1}ozcb*!tM_7}9SBrTmLjbe!}6gB&P^o_K7hH7jm?QYybSfFjy8R-qp$J3*s z#O5rZeE>z#s+hifH{$T~eh$Mf3gU=-VtUR3dmUX!9}FejMM6O@by8X)WA zPC3yoZ}DPUx+Q@Sq+Nh(Q9`cuUO_mXM!{&?q}Be2_kDO4zF$!>`}^#j`VaMHUVKkysi+n6~lrG$Rsn*B_2PDxz}UDA*<@o$z- z4B}~(Us;ebkX(q~Mwg`ObA6P`VY3%iNKU7)UI4Y341_M_-hAkv9U#B{{pW2EMWA1& zVAuDb$IfrZcuv-TLlKyapf6CLhvNvPUQ$57*=Qx9^cl;Tli-cHnOV|d8Zl|Y2#cK7 zyVbqY-aZtfq&L^th%+?e(tc>{@k_1TEG4;LyrRDW#h9UyhoRXY!{jCuLyLUFyF+0< zvO{A&l6__D%R6;!!;#gG7YKrsTY2c+MYOB8wxk+^!hc!IR=&t$@#<#m< zg%q&5a?>00M0IHivWuW3%QM{6CacF0vb*bkJwmemoTr>i<&0~U{%zWAZp%H5wx*YK zy2I@@I>V_V1+9jEfn3S1LM_`8WvNyO;8A9ZQp|G@X9+JOw|*u-2@soZwJ0xJ+9>H> z-XKP*tbMMuvDxSMksuXr>v_m^xWPDsWf1G-y1IshG9Q&nMo$0rkjtSo5pQ*p$dg=@ zcaoW;#0sgVdTQy|lD!WT_;5xVlbsZ6ljI1-!4O#4mV#EvJ*7d(FeHFMF9C)FIB3uA z959^r1v%O=g{Gg4Cn;yIk{iMyhlRv1m6X439E|TuZpN6rfU}flWv|oT_W~$Z9PapU z><3${lXdPO_f{BT$|XCC+R5=3hr_n#?_(KrT66PW^?MlGXc!c_LMPYq5uc3I)N^d! zy{Df4$ydCnFN@jO7WdQ~w(d>`fN>8IOPs{ug0mJi{Q`ggE*({w9O&bwn0Gx7m?mIP zMln#kMd@!K3g$(7*gJ&rVJ_W+=XZUs);(E|_<~<7pIRs%ynr}lr!z=ttW6<5=U}wh#%+&>g@=g}d zQb(Ff5%r4Q(7bSup`$6QFa_PiFx<|?#K2HEOAmkdKOIJga-zS3I6}M8EziO1jPauE zsNWLoWZcSv4-7+s6is1M<{Z;4?=I%8T3YvRG>J+~myMM2au-z;S|0a7m&-$SO|R8@@b6cE~SJ~pk!d+^Q2*uidZ6ZP+>ryupkLbgBq$ab2lhPO<# zI>@MICPsF~7Iq@x!#f9GU?;_vsm}wd*7m++O3-UZ*JWJ&{#`{}#63j)U)Mo&Y~>3(%E9NKILjoHNRK zpgle(oT|E~RL!yDfN9<6Jwnm;)uZa9u~oN$l45e4bV4M6IV{2pf(^m}&VE6Z^SE(v z2R*P&9gVyY8{e`^wf5uX?0W8p{I-*lh8B3wmpWw?8fjf1?)=KVD6U?Ix)4jK_PEwh^bqF^eb86 zncyvxFQF*|72C+A#Fy@x>%jofF36AXYU-iGt{-K9ZW0`kPZAu_evAPOkT0I`wm7EE0DpD|1VO36}(fFz}0d{)Y43r@eyk)M~>p5GSsI`Vl%f zvvaF}D-~v`X_ty&Lu*odc6=LT*Fhce-&nhJG>u|lg*^SR3n=0tpZ}{7tND# zmgyBRMT?uyzFpmJ9Yv#uLZ8+Cv`w{=u(W7iFzC|6&%ze^@~tCp5QDPkCJr< z|EBK&hw0Mx4A+5*Xe@}37}o8a?DtQ)Sp|;5xibRKdE&nN-yhY7_~}is-3Tt?{Y4ae z0n+`Qr)5p;w|;8b#V8s|la=sl>XWrT;vr*NE+cEJOlZ;7O~-HiC=c|D7{1eQRnqK- zxS56NYa=+rb{42aNI)jb?IU9go_$W~#-(Jq{l7q;z}}wv_S-@zjQryVSw;~CC~?N0 zw(l6iG)-Gw+;Q{(NuoHd2KaCz-TF%tNL*r~VFeMLP-l27$+$o;J=Im|Y;ii1rc!ke z&8WO3`J2^J`D}v)+l|sXU&pN{WdCHo*PpM6hDnUCu&+v|x!Y}YjI>I7#ugqYdOO~; zS*#;HUx0i3AI}F8knso2!2xLKIB72}wS!^+@u8GPv^6I*wL7#1fx11IdKxc?S(kfr zhx)r=%}(!l%?4>d^&ta4`GZRspU$uFU;{tact__idyiXu0)NiT=~6r{(i<*`s|t*ilmpALCm4>a~5|ddn^s zDY$2Nv$n#YQqvi1jzxSXn_^vvS-pe{{WtWM!FgOIvoIoT!cLE0i45u7QK|vUvWJs2b_d1imddvYJ^A+?XMZZ9$ z9haFF*Imjk5(Deg^gwv*Xm9*s9>QgysVp0g9-~b&&2`X$!RmMGWsEfTylgi>l2s-s*g(dItNx}h${Nh_PWa|_$%q!obdWDBJ`z^}+UwL- z!ALU7E19WZ{$1c2R`SHrO}ezTR@$PuCZVtO9a+5sU3GrR{%42svUScK-{{cj4oRxxd6{-ZWY8fApcTAKE zw>$Zi)DuS;sUw9=Cs;k7nUv5$rK+(;8`NU= zf1*=5H;gu@ze5a^fvMcl1W0O^9z1)=AGo6f1_{68*-TSSX)x|6Wf)cfz4ZsPM7A|s zbO-k|>CQ=0t53@{Utm3-z!?`xYUkiy1@*XtYKJE9xM%?&|7F^+D$Qr~Ko!<6Xo8PC zjfj5^%MGfaG=D}udT$ZY6Aoo*@{Q(bCt&e*2qH!W)!$(qp|-a5oW>d%3+Q<{42@cJlJkbvTyf3 zLvC=>^P1Ei@mZWPAkQ~;mNhu*ymw7$y*%6%`r0QozLQ=Op0ucdZL0aBGU`9%kLz?P z*!r{@*X}`A9?GtSWOar}%ylaBz#2JyDX2@NkX^^LT6S87q*X_dQj>?bB^{)S&F#o_IR zA8f^D5!W~Or58`8FKhy$>0{f@VAyh<9*W)`;<)=!i#i;ShOMhed4yHO96R}iO|`_I z9)5h;I6GqFUUV!J5h(LGsWGN3e`$PBo5Wh{GD1DbP1q{|tB(D%9}eLwCnB=QT%U{~ z9W4=h1f|n>#9SX>XJ9|4=5E-2dM9#>&tdWtxu0nh@+43=Xa5*?hA1c-;AqYmLbL8j zS!T0vN{8YS3CjA#yEE(+QhaoGP+5X_M3%_1 z0_PQzsEgF90MXI6e4?^MH5~#H_=i`d3#}yC4C+o8 zM6=~Zq@~{|U$^*^Sl$(L!IeRBzmRZL^0sk?2}RE=0A2`cJ%KGT4^@mS5z47Kmhr{X zD)l5ZV}EoQ*S+5K&sA}Z&Lf%M5^_NN%SK9QylG)?SRbaUXwDgej+R4Ys>*IhFyn&5 z`K0`8f#gV{8`yO(UUVpdqHfYdr_>)99WQf8vIoCAd-{J;5<4O{zvQnjcML~sSJ{7)2CovZXK1)qJ~nrEIzAIE_ah!(9!oBMQxf*}6Wh&t}$-y-QRT?Q%n z718qr>P$*hK=v;@#yrF=$N}eZ@Zb8SJK=XgFf1t8chol&)Q@kENC!O;sLp?5eWQs% z4gdS;iUgDu=0C;}Ow{q9pl{l&h?)UF13}Li>;%Q@FrWvGf&7orzIJiK`TW}_%m3}F zB+Wn;2f@rB=mJH|AYumv`?mh01voS}nzaO08ZDaKmDw0X+k)%LlE@e!ks-;N*u9mt zXs?)AH|MNl>VC=q!t$u6wZ__22Obk16y138d!V5eJg{C9eQ&(GPWeu^PR+hvzn%qu z&=paT&<7Ed8e<@m{U#*r}Lf^Pm~au0Q5&qp%>qu&^TV2 zC+QVmn#qf)Omc*0FjrRd(P?)D>8~}g)+k2IW?1kw*|)1V{ys1b?l8&OrdwZR+iF>e z*LAoppgk{VR3CIn$gXSfT8B%mTV+;XuA6Op?`EGz(J$LknXhvEmguh3wlA|jdkV5{ zac=R{V6rY5T2b`&BUVU-RmX7B9J0OBL@!)4*O>E}{bb;B2z zo@G4#U;#^h(B)WylETBoRk7-$^Q6lYQ2^_!KZNN1_9(QXD;IZ~16$brxAzd4*{z=J z<1_Ycl=6E&MILn=8ZKGt4_W)kupJO4Wwh94+qsopLJq?(*r*3$6`2@Ke`;bm_#q9M z>HT8IHr%U^1XQr}4>5=ygy;@7;vHRXRG;6jP}Q#}{|%SlL9bKg*0?X8Vo|A_@CvVv zJ$*^v|67G;&c*3>rsBT~_<-%7YD}G82xK1D*=<^Att0d;VS3%^WfiL;(PWpilod3} zSX6Z^>t7UN82_`j;YAz!|;B2NtraRIFRgco3j-9V0x zkhSV!lrZ-V{cdtvWm-XDiaSGew`xvfxKLW}xh4a0`J+et8_0T)s8+Ck;RuFi%Hf*? zA3;qn0Eml6)?6Q$LH?lRbNSn(J0Sx@AMy(<>oIEzA_~0VACib|0u(s%?}PM*ly3T?sT*+y8g%C{u>ZHD^dK%3MiBQoK?mH1`TU8PXggaY-Z! zb$hn*Ohp+oRiZ@0QyL_tUuocZp;Bp{qyFEs&vCD#wf=W4>mJ|FciP|m-NQNO?!9HF zJC?;i^jY++xN1g-#_`A|zSJG-o(i9}PhWSIDtMGys9(Ifc;C@Se`jB7a#wUr=d0cP^Wx)&i~1g_&iEqZVNkl;q;}7qKBs(%W8Qe5&)50Q zwTXr2c1FCpXKo*uboO1EeY968_e%Zz*OINF(=(SvdON+F)l_8W_V1A4Ve?iNd+OV@ zj$F6nP2SJdIX_cW-Y#&e>*IEf+txF2U6(fdVH<4bA|{TbH*z$v`3xj4kJwAwDm^Bl zBSXmYwO(7KC_%0iW*`@O`I?slvLl^O#Ww##U9jA7-w=VqaTOfpfVkMI8p$)8d1TCY zS>HTOAtD{Nr!tLo&;Bt zRJrPCo403X9B-)H@mkK+_Ueg`73H~-Hs1a}xSmdCvsdc%sy0;(R7H1z+A}QOjD*xoyu+D<{?#eak!^)Lse_0v2XJ1RJMVxIke{z-M z$(?njm5yWj+O=<5dRA>*`SjxVmjToY$<-RqC9U3GoF;LEBO`~Fg$8)RGRe|S&EwWQ zy_S+=<>FG1pgdk@?$#yaO}1=3bU44hCO)TK%c7;(%ImRX#hQcb=4P$2uCQLvn0Lr) zi%b2rd%^m}Dc@&KbgvFqj|!g>WtTUF|NVt~U%joFw$(Gso4ViqI|KFw-QE)LQNmFv zyRAhdI>7JWd0&!N9=4udAXu_u;=-9#%~wONXOsq&iN$=dyq1g26IE>LG;H-=7%aFG z@1Gh{$es7-pGRpYlfH*e+n;!Hit7l8eXtMHNShHqv;G*gqy6$rqoh~vg_ZoLq^Lvh zyeGj;U5yix!*^BP}${HTpO|3_E%nOqFyU zdYc}8`jpw+{4ku~_u~`yyz+{)GIJlV76-|ZlR7uJmcDzSd{TXaMchX8*~R(%U5>o0 zvqtEZCZ+h|>7(q-C7YMm z-Ts&wk#W4Oc~@FX$Lp%tvCq8H&XyU-y*y#QXC}}0P0K~@hh?D&k?5vz0~~(wjbB@T zezVN`#br%#A#vsJCneatOUjn*csi4><2ZSn=OSO+7}XUec2IZof3M)lX0A%hcjYBhM``{wv7wW9FLO zt6q)K+hsHJ+>1Nk{j9TQONA~jS4ATnPsBEx#8%(g##1wGt|}4C)c!kfLZ8|FxexA- z=Z`y>K2!d})LZ&7rpHZoz2}{|x->wn_YE=c;G)R102V|?-MNc)gp zu^Z!;`l}7~@0;@=b%^}FBYKbOHcW5JQo3{X<8uw8y!zYSatYT`M*nYH`ep3|*I?H> z!G2R(l9NaKs3u))ynA4ok?Nj_@&==$?#Dh_l$Nzo-6_zgUhTtjB=w?Qht+RZ{_Tt` z=*7HEbCC*t^=uxpqx;1%?r0q8D!ts%a5-|d(G!(PlPiPOsGgp@y$VG39MS|9yM41N zg~uOXhm+;vQSNZO*Y#SYSh;#Fs+L6gutL}{2#qHfou#^tnoK=79;5#=u#tGjFN9uwaCmrK?b2#G4 zNI08!@>}JLWMEs(BJj_YCADpCzmy{G*~*0Obor|~Loi|jM$B03%^ozn+Mh1c1A>AJ`Yl!&Q-t&2qZs#%qd?~~Le;}_{z9_SRC76HoZj{W z;ixDCN6#LhM1I5B(MV1Zen19i#53vFv9{s&O%SPaNG4~NS$>94hAViKp@Qc|GxnB8 zgS}b5RiqC;?%Z*{h!?EH|3N*6MP$@K*G|q9UQuLilUCfW-*9I6wFC;is*%+y@H%& zJLG+uW=)7es>Gr0dvPPJz@Y}nOZ$F9@SPi7fX~OEc|>34sJk;4fkTU-5wUA%>P37Z z23cSn&$PFU@0z&x&T(V;+8r9j)u7%sSGfA~=p<;y-uu~f`O<}RG zecI11AvoV7gFhD|*p#E2zt6=+xOUDZ}3J zh@7*GkHte7Y(ETCA&I}nGhuz)UF^eyfcykC<5`YHe#REN&~#E-r;{B>4!Degi(S!A zzENCbaqTXq_U`WjbHD$fsH3rV0x~2DnjeiHau7n*0ZoA&t}WttV+v9ecpZ?#nhA)9 zvlEz<@jbSo=N;7$!RYTS*VYXqGB`z*BahcfarCf8BGVF$62W|(3>#O(k%>r)q(ugW zTgtO>Y5XFQF>1eK)(>+i>1aq02bR$+o>0j2m(eGC%6yNdP`8_*xv-n2g@#ZJMvngG zAeR%kCKGP(s9dyWnQ0$E^Ec^m^hy2@w{7=;+jn#cL_)>igA7PyZEO5@egQ3iLc_9Q zY2q8O*yZr9Q5;#3N`)j)dCO45(`dv|#*eC)jD5+y|H>Bhw*FG(ZDU0;4~;oWI60P) z@u`zaN`M-h3^mPet89Z>dq!2B9bR36=6O);0JV-&;t!Sup3P%zf zTfU%$v0ab?3fBKlE4Vfj0`n?` z(cMQu60>Q@YYs;~6$TIz>zx-p_H;n4Q4NMY2a@ zdM?GKkGuCWBjb;~V5)TyZEE5^WI%jdu@9&xmebTFo>1=meT)Zg4h2^CAh$la2HiK051?X$s0BBw+(k9Rb3bIHT0F?oSK#c?v z2q7L;#Y_zuW02a8g%Dk&B#K&@A*9OTM$Cl0n}R&EX=p<(hl|b97{8~c0i=Ei=cFNx zUwRNKw*7(DWd+)eNSKn`8pvhD;@V5N^l{Sx2&KjW#-z~!F!?|PN#jiin4WMi1*zmw z-ViBfwt5h#Sw%E;+Ciq18Rzv1enke`%0ioB4>T3!Le`&? zJFo@O{>EEDqfzBI5@z!>o+6X_6j10y?DsE&#(Yz~bT3t*Uhqbx3i|HxwE7nlWl z4CFJ)p3;3L;Df8)PGO62WQNfIZ_5#LlUU%i~E2NS1h_V!rm{B&Y>74n2H$aa`#f?rDhD-WP-RHUY*1E zJuvv}w4Q0n2&5iHToNAE;o+<@CiU~eVd8YQs^@~u&WVhQ)3$I#t;uPo{-P-CyDh=g z@s$~H!sRjnlaK@bVfWjfcGw~h@&4ZqNL}a^l|BL@F`C4DSst{W213xp2OY&VaY-KI zP7MXs+f&*JB$IjsDU)7n^D(y*cVOJ?g)xVn4>8kecGn|Jc_WU1l41uTRS_p0WoqRi z1=V`c5S;a^hifC5(&i64ySWw&B!U4;q3=}IbSx0^bBU^7x=~FbKULPZi?CiH(#EYv znNqzx3RaC5)70MO(0=?&7-(8PKri2#ZpxRcKWNs6`OM^7bVljm zhY-bHG;2x$^yW5jY$;J~T>W0`A{3K)xMado{b{9;pB~am3cxqCilUCd-35%nH3mP| za-heV1XBq11Z|Ta#p*!JoHqSu=>;%T0A|?t1oZ(FmpL{{W9sBuA((j(NX3|k`wAH| zZK@KNsNEX#L4g6wPwBNZ>zpEH6e4%(%ImSkF?gDt-`|~z&Qcv57!SfamO50Geg-!9 zsFi+mxzXNyN~=3566?^Feir!7jgF6@xXh^IS0r)EF(gawtOoDU-!GCIosZ3r!GH<- z^V5?x=VFLJM1nGYos zZSoupu%g)`6}>a{G^kMm`xco1vAzDp1`2Ixc2@xAYEiJ?r2~3YB zTAVPL|7#E7wEkUWneuRo1=#K_tOYR9Mt z4Ub^X$i8)R8Ne%zFP&y)h0i)aMO+4fIWTo+=k6yBk#ZS4Z3es}F+RhXQFG(17K32q z!5@1-mDU|3#U-yUNUupntv|!{g(0Led@1HYm@pJW+AQeL4Zl1B7rpQvJn8;hBq@B` zDTx;dkP?Xpyc89^6BU}If_`_T$Wdvb=m;VudPO>Tx_;4cpj1XRG9&_06BdQFK`c}t zlI$7Gp|Jx6e$GWoxYZdA!#Zb~-puqYRODTgL0oF&HihW^cG>XhJ8*sdFR^}QHc;y3 zS)@yHnR@1p%q&Sy8_fro3ZX{XlZ`P>v}rtNHPoqTEu+V_7W90W&0s2P5Pd5~l!;!*4IVPA Zof!dmKc_zYir5t~%~{X@sRv_X{|6y!>VE(L diff --git a/src/main/java/com/xebialabs/overthere/smb2/Smb2File.java b/src/main/java/com/xebialabs/overthere/smb2/Smb2File.java index 233db7d5..eb6da69e 100644 --- a/src/main/java/com/xebialabs/overthere/smb2/Smb2File.java +++ b/src/main/java/com/xebialabs/overthere/smb2/Smb2File.java @@ -257,7 +257,10 @@ public void deleteRecursively() { String sharePath = getPathOnShare(); logger.debug("deleting directory recursively {}", sharePath); try { - getShare().rmdir(sharePath, true); + if (isFile()) + delete(); + else + getShare().rmdir(sharePath, true); } catch (TransportException e) { throw new RuntimeIOException(format("Cannot delete recursively %s: %s", sharePath, e.toString()), e); } From bd244ac349242246d2247a810a8e4aa671b52152 Mon Sep 17 00:00:00 2001 From: Aditya Kalia Date: Fri, 2 Sep 2016 13:26:12 +0200 Subject: [PATCH 16/40] Add bouncy castle provider if does not exist --- .../java/com/xebialabs/overthere/smb2/Smb2Connection.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/xebialabs/overthere/smb2/Smb2Connection.java b/src/main/java/com/xebialabs/overthere/smb2/Smb2Connection.java index 6e47894d..553da247 100644 --- a/src/main/java/com/xebialabs/overthere/smb2/Smb2Connection.java +++ b/src/main/java/com/xebialabs/overthere/smb2/Smb2Connection.java @@ -68,7 +68,9 @@ public class Smb2Connection extends BaseOverthereConnection { private static final String EMPTY = ""; static { - Security.addProvider(new BouncyCastleProvider()); + if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) == null) { + Security.addProvider(new BouncyCastleProvider()); + } } protected Smb2Connection(String protocol, ConnectionOptions options, AddressPortMapper mapper, boolean canStartProcess) { From 8704cde46fae5870f2bcbaad7294777ed21b42a2 Mon Sep 17 00:00:00 2001 From: Aditya Kalia Date: Fri, 2 Sep 2016 13:42:50 +0200 Subject: [PATCH 17/40] Minor fixes --- .../xebialabs/overthere/smb2/Smb2ConnectionBuilder.java | 2 +- ...nRmConnectionOverHttpWithAdministrativeUserItest.java | 3 +-- ...RmConnectionOverHttpsWithAdministrativeUserItest.java | 9 ++++----- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java b/src/main/java/com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java index 783fbcfc..3e63262d 100644 --- a/src/main/java/com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java +++ b/src/main/java/com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java @@ -48,7 +48,7 @@ public class Smb2ConnectionBuilder extends ConnectionBuilder implements Overther public static final String SMB2_PORT = "cifsPort"; /** - * The Windows Domain to authenticate the user against. If not set, bla bla bla + * The Windows Domain to authenticate the user against. If not set blank value will be used */ public static final String DOMAIN = "domain"; diff --git a/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpWithAdministrativeUserItest.java b/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpWithAdministrativeUserItest.java index cd93e679..c0f63779 100644 --- a/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpWithAdministrativeUserItest.java +++ b/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpWithAdministrativeUserItest.java @@ -23,7 +23,6 @@ package com.xebialabs.overthere.smb2.winrm; import com.xebialabs.overthere.ConnectionOptions; -import com.xebialabs.overthere.cifs.winrm.CifsWinRmConnection; import com.xebialabs.overthere.itest.OverthereConnectionItestBase; import org.testng.annotations.Listeners; import org.testng.annotations.Test; @@ -60,6 +59,6 @@ protected ConnectionOptions getOptions() { @Override protected String getExpectedConnectionClassName() { - return CifsWinRmConnection.class.getName(); + return Smb2WinRmConnection.class.getName(); } } diff --git a/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpsWithAdministrativeUserItest.java b/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpsWithAdministrativeUserItest.java index ba7ae41e..fd6f8e80 100644 --- a/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpsWithAdministrativeUserItest.java +++ b/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpsWithAdministrativeUserItest.java @@ -48,11 +48,6 @@ protected String getProtocol() { return SMB2_PROTOCOL; } - @Override - protected String getExpectedConnectionClassName() { - return Smb2WinRmConnection.class.getName(); - } - @Override protected ConnectionOptions getOptions() { ConnectionOptions options = new ConnectionOptions(); @@ -67,4 +62,8 @@ protected ConnectionOptions getOptions() { return options; } + @Override + protected String getExpectedConnectionClassName() { + return Smb2WinRmConnection.class.getName(); + } } From 093225a9279c3354e074480570e38b800f943352 Mon Sep 17 00:00:00 2001 From: Aditya Kalia Date: Tue, 6 Sep 2016 17:01:43 +0530 Subject: [PATCH 18/40] Refactoring --- .../SmbConnection.java} | 24 ++++++------- .../SmbConnectionBuilder.java} | 32 ++++++++--------- .../{smb2/Smb2File.java => smb/SmbFile.java} | 34 +++++++++---------- .../Smb2Paths.java => smb/SmbPaths.java} | 4 +-- .../telnet/SmbTelnetConnection.java} | 18 +++++----- .../winrm/SmbWinRmConnection.java} | 18 +++++----- .../winrs/SmbWinrsConnection.java} | 20 +++++------ .../SmbFileTest.java} | 18 +++++----- .../telnet/SmbTelnetConnectionTest.java} | 14 ++++---- ...onnectionWithAdministrativeUserItest.java} | 12 +++---- ...TelnetConnectionWithRegularUserItest.java} | 14 ++++---- ...nOverHttpWithAdministrativeUserItest.java} | 10 +++--- ...OverHttpsWithAdministrativeUserItest.java} | 10 +++--- .../winrm/SmbWinRmConnectionTest.java} | 14 ++++---- .../winrs/SmbWinRsConnectionTest.java} | 14 ++++---- 15 files changed, 128 insertions(+), 128 deletions(-) rename src/main/java/com/xebialabs/overthere/{smb2/Smb2Connection.java => smb/SmbConnection.java} (89%) rename src/main/java/com/xebialabs/overthere/{smb2/Smb2ConnectionBuilder.java => smb/SmbConnectionBuilder.java} (69%) rename src/main/java/com/xebialabs/overthere/{smb2/Smb2File.java => smb/SmbFile.java} (90%) rename src/main/java/com/xebialabs/overthere/{smb2/Smb2Paths.java => smb/SmbPaths.java} (97%) rename src/main/java/com/xebialabs/overthere/{smb2/telnet/Smb2TelnetConnection.java => smb/telnet/SmbTelnetConnection.java} (77%) rename src/main/java/com/xebialabs/overthere/{smb2/winrm/Smb2WinRmConnection.java => smb/winrm/SmbWinRmConnection.java} (76%) rename src/main/java/com/xebialabs/overthere/{smb2/winrs/Smb2WinrsConnection.java => smb/winrs/SmbWinrsConnection.java} (75%) rename src/test/java/com/xebialabs/overthere/{smb2/Smb2FileTest.java => smb/SmbFileTest.java} (79%) rename src/test/java/com/xebialabs/overthere/{smb2/telnet/Smb2TelnetConnectionTest.java => smb/telnet/SmbTelnetConnectionTest.java} (86%) rename src/test/java/com/xebialabs/overthere/{smb2/telnet/Smb2TelnetConnectionWithAdministrativeUserItest.java => smb/telnet/SmbTelnetConnectionWithAdministrativeUserItest.java} (87%) rename src/test/java/com/xebialabs/overthere/{smb2/telnet/Smb2TelnetConnectionWithRegularUserItest.java => smb/telnet/SmbTelnetConnectionWithRegularUserItest.java} (85%) rename src/test/java/com/xebialabs/overthere/{smb2/winrm/Smb2WinRmConnectionOverHttpWithAdministrativeUserItest.java => smb/winrm/SmbWinRmConnectionOverHttpWithAdministrativeUserItest.java} (88%) rename src/test/java/com/xebialabs/overthere/{smb2/winrm/Smb2WinRmConnectionOverHttpsWithAdministrativeUserItest.java => smb/winrm/SmbWinRmConnectionOverHttpsWithAdministrativeUserItest.java} (90%) rename src/test/java/com/xebialabs/overthere/{smb2/winrm/Smb2WinRmConnectionTest.java => smb/winrm/SmbWinRmConnectionTest.java} (86%) rename src/test/java/com/xebialabs/overthere/{smb2/winrs/Smb2WinRsConnectionTest.java => smb/winrs/SmbWinRsConnectionTest.java} (87%) diff --git a/src/main/java/com/xebialabs/overthere/smb2/Smb2Connection.java b/src/main/java/com/xebialabs/overthere/smb/SmbConnection.java similarity index 89% rename from src/main/java/com/xebialabs/overthere/smb2/Smb2Connection.java rename to src/main/java/com/xebialabs/overthere/smb/SmbConnection.java index 553da247..9a1d9482 100644 --- a/src/main/java/com/xebialabs/overthere/smb2/Smb2Connection.java +++ b/src/main/java/com/xebialabs/overthere/smb/SmbConnection.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.smb2; +package com.xebialabs.overthere.smb; import com.hierynomus.ntlm.NtlmException; import com.hierynomus.smbj.DefaultConfig; @@ -48,10 +48,10 @@ import static com.xebialabs.overthere.ConnectionOptions.*; import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.CONNECTION_TYPE; -import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.*; +import static com.xebialabs.overthere.smb.SmbConnectionBuilder.*; import static java.net.InetSocketAddress.createUnresolved; -public class Smb2Connection extends BaseOverthereConnection { +public class SmbConnection extends BaseOverthereConnection { private final SMBClient client; private final String hostname; @@ -73,11 +73,11 @@ public class Smb2Connection extends BaseOverthereConnection { } } - protected Smb2Connection(String protocol, ConnectionOptions options, AddressPortMapper mapper, boolean canStartProcess) { + protected SmbConnection(String protocol, ConnectionOptions options, AddressPortMapper mapper, boolean canStartProcess) { super(protocol, options, mapper, canStartProcess); this.cifsConnectionType = options.getEnum(CONNECTION_TYPE, CifsConnectionType.class); if (mapper instanceof ProxyConnection) { - throw new IllegalArgumentException("Cannot open a smb2:" + cifsConnectionType.toString().toLowerCase() + ": connection through an HTTP proxy"); + throw new IllegalArgumentException("Cannot open a smb:" + cifsConnectionType.toString().toLowerCase() + ": connection through an HTTP proxy"); } String unmappedAddress = options.get(ADDRESS); @@ -87,7 +87,7 @@ protected Smb2Connection(String protocol, ConnectionOptions options, AddressPort hostname = addressPort.getHostName(); port = addressPort.getPort(); - int unmappedSmbPort = options.getInteger(SMB2_PORT, PORT_DEFAULT_SMB2); + int unmappedSmbPort = options.getInteger(SMB_PORT, PORT_DEFAULT_SMB); InetSocketAddress smbAddressPort = mapper.map(createUnresolved(unmappedAddress, unmappedSmbPort)); smbPort = smbAddressPort.getPort(); username = options.get(USERNAME); @@ -111,9 +111,9 @@ public void connect() { @Override public OverthereFile getFile(String hostPath) { - hostPath = Smb2Paths.escapeForwardSlashes(hostPath); + hostPath = SmbPaths.escapeForwardSlashes(hostPath); Map pathMappings = options.get(PATH_SHARE_MAPPINGS, PATH_SHARE_MAPPINGS_DEFAULT); - return new Smb2File(this, hostPath, pathMappings); + return new SmbFile(this, hostPath, pathMappings); } @Override @@ -128,20 +128,20 @@ protected void doClose() { try { s.close(); } catch (IOException e) { - logger.warn("Exception while trying to close smb2 share", e); + logger.warn("Exception while trying to close smb share", e); } } finally { shareCache.clear(); try { session.close(); } catch (IOException e) { - logger.warn("Exception while trying to close smb2 session", e); + logger.warn("Exception while trying to close smb session", e); } finally { try { connection.close(); } catch (Exception e) { - logger.warn("Exception while trying to close smb2 connection", e); + logger.warn("Exception while trying to close smb connection", e); } } } @@ -170,5 +170,5 @@ protected DiskShare getShare(String shareName) { return share; } - private static Logger logger = LoggerFactory.getLogger(Smb2Connection.class); + private static Logger logger = LoggerFactory.getLogger(SmbConnection.class); } diff --git a/src/main/java/com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java b/src/main/java/com/xebialabs/overthere/smb/SmbConnectionBuilder.java similarity index 69% rename from src/main/java/com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java rename to src/main/java/com/xebialabs/overthere/smb/SmbConnectionBuilder.java index 3e63262d..821341bb 100644 --- a/src/main/java/com/xebialabs/overthere/smb2/Smb2ConnectionBuilder.java +++ b/src/main/java/com/xebialabs/overthere/smb/SmbConnectionBuilder.java @@ -20,52 +20,52 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.smb2; +package com.xebialabs.overthere.smb; import com.xebialabs.overthere.ConnectionOptions; import com.xebialabs.overthere.OverthereConnection; import com.xebialabs.overthere.cifs.CifsConnectionType; import com.xebialabs.overthere.cifs.ConnectionBuilder; -import com.xebialabs.overthere.smb2.telnet.Smb2TelnetConnection; -import com.xebialabs.overthere.smb2.winrm.Smb2WinRmConnection; -import com.xebialabs.overthere.smb2.winrs.Smb2WinrsConnection; +import com.xebialabs.overthere.smb.telnet.SmbTelnetConnection; +import com.xebialabs.overthere.smb.winrm.SmbWinRmConnection; +import com.xebialabs.overthere.smb.winrs.SmbWinrsConnection; import com.xebialabs.overthere.spi.AddressPortMapper; import com.xebialabs.overthere.spi.OverthereConnectionBuilder; import com.xebialabs.overthere.spi.Protocol; -import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.SMB2_PROTOCOL; +import static com.xebialabs.overthere.smb.SmbConnectionBuilder.SMB_PROTOCOL; -@Protocol(name = SMB2_PROTOCOL) -public class Smb2ConnectionBuilder extends ConnectionBuilder implements OverthereConnectionBuilder { +@Protocol(name = SMB_PROTOCOL) +public class SmbConnectionBuilder extends ConnectionBuilder implements OverthereConnectionBuilder { - public static final String SMB2_PROTOCOL = "smb2"; + public static final String SMB_PROTOCOL = "smb"; /** - * The default port for SMB2 connections over TCP/IP + * The default port for SMB connections over TCP/IP */ - public static final int PORT_DEFAULT_SMB2 = 445; + public static final int PORT_DEFAULT_SMB = 445; - public static final String SMB2_PORT = "cifsPort"; + public static final String SMB_PORT = "cifsPort"; /** * The Windows Domain to authenticate the user against. If not set blank value will be used */ public static final String DOMAIN = "domain"; - private final Smb2Connection connection; + private final SmbConnection connection; - public Smb2ConnectionBuilder(String type, ConnectionOptions options, AddressPortMapper mapper) { + public SmbConnectionBuilder(String type, ConnectionOptions options, AddressPortMapper mapper) { CifsConnectionType cifsConnectionType = options.getEnum(CONNECTION_TYPE, CifsConnectionType.class); switch (cifsConnectionType) { case TELNET: - connection = new Smb2TelnetConnection(type, options, mapper); + connection = new SmbTelnetConnection(type, options, mapper); break; case WINRM_INTERNAL: - connection = new Smb2WinRmConnection(type, options, mapper); + connection = new SmbWinRmConnection(type, options, mapper); break; case WINRM_NATIVE: - connection = new Smb2WinrsConnection(type, options, mapper); + connection = new SmbWinrsConnection(type, options, mapper); break; default: throw new IllegalArgumentException("Unknown CIFS connection type " + cifsConnectionType); diff --git a/src/main/java/com/xebialabs/overthere/smb2/Smb2File.java b/src/main/java/com/xebialabs/overthere/smb/SmbFile.java similarity index 90% rename from src/main/java/com/xebialabs/overthere/smb2/Smb2File.java rename to src/main/java/com/xebialabs/overthere/smb/SmbFile.java index eb6da69e..828936d5 100644 --- a/src/main/java/com/xebialabs/overthere/smb2/Smb2File.java +++ b/src/main/java/com/xebialabs/overthere/smb/SmbFile.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.smb2; +package com.xebialabs.overthere.smb; import com.hierynomus.msdtyp.AccessMask; import com.hierynomus.mserref.NtStatus; @@ -47,13 +47,13 @@ import static java.lang.String.format; -public class Smb2File extends BaseOverthereFile { +public class SmbFile extends BaseOverthereFile { private final String hostPath; private boolean overwrite = true; private Map pathMappings; - public Smb2File(Smb2Connection connection, String hostPath, Map pathMappings) { + public SmbFile(SmbConnection connection, String hostPath, Map pathMappings) { super(connection); this.hostPath = hostPath; this.pathMappings = pathMappings; @@ -66,18 +66,18 @@ public String getPath() { @Override public String getName() { - return Smb2Paths.getFileName(getPathOnShare()); + return SmbPaths.getFileName(getPathOnShare()); } @Override public OverthereFile getFile(String child) { - return new Smb2File(getConnection(), Smb2Paths.join(hostPath, child), pathMappings); + return new SmbFile(getConnection(), SmbPaths.join(hostPath, child), pathMappings); } @Override public OverthereFile getParentFile() { OverthereFile f = null; - String parentPath = Smb2Paths.getParentPath(getPathOnShare()); + String parentPath = SmbPaths.getParentPath(getPathOnShare()); if (parentPath != null) f = getFile(parentPath); return f; @@ -144,7 +144,7 @@ public long length() { @Override public InputStream getInputStream() throws RuntimeIOException { - logger.debug("Opening SMB2 input stream for {}", getSharePath()); + logger.debug("Opening SMB input stream for {}", getSharePath()); try { final File file = getShare().openFile(getPathOnShare(), EnumSet.of(AccessMask.GENERIC_READ), SMB2CreateDisposition.FILE_OPEN); @@ -174,7 +174,7 @@ public long skip(long n) throws IOException { @Override public void close() throws IOException { - logger.debug("Closing SMB2 input stream for {}", getSharePath()); + logger.debug("Closing SMB input stream for {}", getSharePath()); wrapped.close(); file.close(); } @@ -186,7 +186,7 @@ public void close() throws IOException { @Override public OutputStream getOutputStream() { - logger.debug("Opening SMB2 output stream for {}", getSharePath()); + logger.debug("Opening SMB output stream for {}", getSharePath()); try { SMB2CreateDisposition createDisposition = SMB2CreateDisposition.FILE_OVERWRITE_IF; if (!overwrite) createDisposition = SMB2CreateDisposition.FILE_CREATE; @@ -219,7 +219,7 @@ public void flush() throws IOException { @Override public void close() throws IOException { - logger.debug("Closing SMB2 output stream for {}", getSharePath()); + logger.debug("Closing SMB output stream for {}", getSharePath()); wrapped.close(); file.close(); } @@ -304,7 +304,7 @@ private void makeDirectory(String path) { public void mkdirs() { String sharePath = getPathOnShare(); logger.debug("Creating directories {}", sharePath); - String [] paths = Smb2Paths.getPathListFromOuterToInner(sharePath); + String [] paths = SmbPaths.getPathListFromOuterToInner(sharePath); for (String p : paths) { if (!getShare().folderExists(p)) makeDirectory(p); @@ -318,10 +318,10 @@ public void renameTo(OverthereFile dest) { @Override public boolean equals(Object that) { - if (!(that instanceof Smb2File)) { + if (!(that instanceof SmbFile)) { return false; } - return getPath().equals(((Smb2File) that).getPath()); + return getPath().equals(((SmbFile) that).getPath()); } @Override @@ -340,15 +340,15 @@ private boolean checkAccessMask(AccessMask mask) { } private String getSharePath() { - return Smb2Paths.getSharePath(hostPath, pathMappings); + return SmbPaths.getSharePath(hostPath, pathMappings); } private String getPathOnShare() { - return Smb2Paths.getPathOnShare(getSharePath()); + return SmbPaths.getPathOnShare(getSharePath()); } private DiskShare getShare() { - String shareName = Smb2Paths.getShareName(getSharePath()); + String shareName = SmbPaths.getShareName(getSharePath()); return connection.getShare(shareName); } @@ -357,5 +357,5 @@ private boolean checkAttributes(FileAttributes mask) { return FileAttributes.EnumUtils.isSet(attrMask, mask); } - private static Logger logger = LoggerFactory.getLogger(Smb2File.class); + private static Logger logger = LoggerFactory.getLogger(SmbFile.class); } diff --git a/src/main/java/com/xebialabs/overthere/smb2/Smb2Paths.java b/src/main/java/com/xebialabs/overthere/smb/SmbPaths.java similarity index 97% rename from src/main/java/com/xebialabs/overthere/smb2/Smb2Paths.java rename to src/main/java/com/xebialabs/overthere/smb/SmbPaths.java index f16640b5..35d45aab 100644 --- a/src/main/java/com/xebialabs/overthere/smb2/Smb2Paths.java +++ b/src/main/java/com/xebialabs/overthere/smb/SmbPaths.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.smb2; +package com.xebialabs.overthere.smb; import com.xebialabs.overthere.cifs.PathMapper; @@ -28,7 +28,7 @@ import java.util.List; import java.util.Map; -public abstract class Smb2Paths { +public abstract class SmbPaths { public static final char SLASH = '\\'; public static final String EMPTY = ""; diff --git a/src/main/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnection.java b/src/main/java/com/xebialabs/overthere/smb/telnet/SmbTelnetConnection.java similarity index 77% rename from src/main/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnection.java rename to src/main/java/com/xebialabs/overthere/smb/telnet/SmbTelnetConnection.java index d014fdac..67dff30d 100644 --- a/src/main/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnection.java +++ b/src/main/java/com/xebialabs/overthere/smb/telnet/SmbTelnetConnection.java @@ -20,19 +20,19 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.smb2.telnet; +package com.xebialabs.overthere.smb.telnet; import com.xebialabs.overthere.*; import com.xebialabs.overthere.cifs.ConnectionValidator; import com.xebialabs.overthere.cifs.telnet.TelnetConnection; -import com.xebialabs.overthere.smb2.Smb2Connection; +import com.xebialabs.overthere.smb.SmbConnection; import com.xebialabs.overthere.spi.AddressPortMapper; -import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.SMB2_PROTOCOL; +import static com.xebialabs.overthere.smb.SmbConnectionBuilder.SMB_PROTOCOL; /** - * A connection to a Windows host using SMB2 and Telnet. + * A connection to a Windows host using SMB and Telnet. *

    * Limitations: *

      @@ -41,16 +41,16 @@ *
    • Not tested with domain accounts.
    • *
    */ -public class Smb2TelnetConnection extends Smb2Connection { +public class SmbTelnetConnection extends SmbConnection { /** - * Creates a {@link Smb2TelnetConnection}. Don't invoke directly. Use + * Creates a {@link SmbTelnetConnection}. Don't invoke directly. Use * {@link Overthere#getConnection(String, ConnectionOptions)} instead. */ - public Smb2TelnetConnection(String type, ConnectionOptions options, AddressPortMapper mapper) { + public SmbTelnetConnection(String type, ConnectionOptions options, AddressPortMapper mapper) { super(type, options, mapper, true); - ConnectionValidator.assertIsWindowsHost(os, SMB2_PROTOCOL, cifsConnectionType); - ConnectionValidator.assertNotNewStyleWindowsDomain(username, SMB2_PROTOCOL, cifsConnectionType); + ConnectionValidator.assertIsWindowsHost(os, SMB_PROTOCOL, cifsConnectionType); + ConnectionValidator.assertNotNewStyleWindowsDomain(username, SMB_PROTOCOL, cifsConnectionType); connected(); } diff --git a/src/main/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnection.java b/src/main/java/com/xebialabs/overthere/smb/winrm/SmbWinRmConnection.java similarity index 76% rename from src/main/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnection.java rename to src/main/java/com/xebialabs/overthere/smb/winrm/SmbWinRmConnection.java index 5757cd8f..b09aa90c 100644 --- a/src/main/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnection.java +++ b/src/main/java/com/xebialabs/overthere/smb/winrm/SmbWinRmConnection.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.smb2.winrm; +package com.xebialabs.overthere.smb.winrm; import com.xebialabs.overthere.CmdLine; import com.xebialabs.overthere.ConnectionOptions; @@ -28,24 +28,24 @@ import com.xebialabs.overthere.OverthereProcess; import com.xebialabs.overthere.cifs.ConnectionValidator; import com.xebialabs.overthere.cifs.winrm.WinRmConnection; -import com.xebialabs.overthere.smb2.Smb2Connection; +import com.xebialabs.overthere.smb.SmbConnection; import com.xebialabs.overthere.spi.AddressPortMapper; -import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.SMB2_PROTOCOL; +import static com.xebialabs.overthere.smb.SmbConnectionBuilder.SMB_PROTOCOL; /** - * A connection to a Windows host using SMB2 and a Java implementation of WinRM. + * A connection to a Windows host using SMB and a Java implementation of WinRM. */ -public class Smb2WinRmConnection extends Smb2Connection { +public class SmbWinRmConnection extends SmbConnection { /** - * Creates a {@link Smb2WinRmConnection}. Don't invoke directly. Use + * Creates a {@link SmbWinRmConnection}. Don't invoke directly. Use * {@link Overthere#getConnection(String, ConnectionOptions)} instead. */ - public Smb2WinRmConnection(String type, ConnectionOptions options, AddressPortMapper mapper) { + public SmbWinRmConnection(String type, ConnectionOptions options, AddressPortMapper mapper) { super(type, options, mapper, true); - ConnectionValidator.assertIsWindowsHost(os, SMB2_PROTOCOL, cifsConnectionType); - ConnectionValidator.assertNotOldStyleWindowsDomain(username, SMB2_PROTOCOL, cifsConnectionType); + ConnectionValidator.assertIsWindowsHost(os, SMB_PROTOCOL, cifsConnectionType); + ConnectionValidator.assertNotOldStyleWindowsDomain(username, SMB_PROTOCOL, cifsConnectionType); } @Override diff --git a/src/main/java/com/xebialabs/overthere/smb2/winrs/Smb2WinrsConnection.java b/src/main/java/com/xebialabs/overthere/smb/winrs/SmbWinrsConnection.java similarity index 75% rename from src/main/java/com/xebialabs/overthere/smb2/winrs/Smb2WinrsConnection.java rename to src/main/java/com/xebialabs/overthere/smb/winrs/SmbWinrsConnection.java index 24ad337d..dc50fba3 100644 --- a/src/main/java/com/xebialabs/overthere/smb2/winrs/Smb2WinrsConnection.java +++ b/src/main/java/com/xebialabs/overthere/smb/winrs/SmbWinrsConnection.java @@ -20,32 +20,32 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.smb2.winrs; +package com.xebialabs.overthere.smb.winrs; import com.xebialabs.overthere.*; import com.xebialabs.overthere.cifs.ConnectionValidator; import com.xebialabs.overthere.cifs.winrs.WinrsConnection; -import com.xebialabs.overthere.smb2.Smb2Connection; +import com.xebialabs.overthere.smb.SmbConnection; import com.xebialabs.overthere.spi.AddressPortMapper; import static com.xebialabs.overthere.OperatingSystemFamily.WINDOWS; -import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.SMB2_PROTOCOL; +import static com.xebialabs.overthere.smb.SmbConnectionBuilder.SMB_PROTOCOL; import static java.lang.String.format; /** - * A connection to a Windows host using SMB2 and the Windows native implementation of WinRM, i.e. the winrs command. + * A connection to a Windows host using SMB and the Windows native implementation of WinRM, i.e. the winrs command. */ -public class Smb2WinrsConnection extends Smb2Connection { +public class SmbWinrsConnection extends SmbConnection { private WinrsConnection connection; private ConnectionOptions options; - public Smb2WinrsConnection(String type, ConnectionOptions options, AddressPortMapper mapper) { + public SmbWinrsConnection(String type, ConnectionOptions options, AddressPortMapper mapper) { super(type, options, mapper, true); - ConnectionValidator.assertIsWindowsHost(os, SMB2_PROTOCOL, cifsConnectionType); - ConnectionValidator.assetNotThroughJumpstation(mapper, SMB2_PROTOCOL, cifsConnectionType); - ConnectionValidator.assertNoSingleQuoteInPassword(password, SMB2_PROTOCOL, cifsConnectionType); + ConnectionValidator.assertIsWindowsHost(os, SMB_PROTOCOL, cifsConnectionType); + ConnectionValidator.assetNotThroughJumpstation(mapper, SMB_PROTOCOL, cifsConnectionType); + ConnectionValidator.assertNoSingleQuoteInPassword(password, SMB_PROTOCOL, cifsConnectionType); this.options = options; } @@ -57,7 +57,7 @@ public void connect() { if (connection.getWinrsProxyConnection().getHostOperatingSystem() != WINDOWS) { connection.disconnectFromWinrsProxy(); - throw new IllegalArgumentException(format("Cannot create a " + SMB2_PROTOCOL + ":%s connection with a winrs proxy that is not running Windows", cifsConnectionType.toString().toLowerCase())); + throw new IllegalArgumentException(format("Cannot create a " + SMB_PROTOCOL + ":%s connection with a winrs proxy that is not running Windows", cifsConnectionType.toString().toLowerCase())); } connected(); diff --git a/src/test/java/com/xebialabs/overthere/smb2/Smb2FileTest.java b/src/test/java/com/xebialabs/overthere/smb/SmbFileTest.java similarity index 79% rename from src/test/java/com/xebialabs/overthere/smb2/Smb2FileTest.java rename to src/test/java/com/xebialabs/overthere/smb/SmbFileTest.java index 76bd2b5d..7afbad54 100644 --- a/src/test/java/com/xebialabs/overthere/smb2/Smb2FileTest.java +++ b/src/test/java/com/xebialabs/overthere/smb/SmbFileTest.java @@ -20,9 +20,9 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.smb2; +package com.xebialabs.overthere.smb; -import com.xebialabs.overthere.smb2.winrm.Smb2WinRmConnection; +import com.xebialabs.overthere.smb.winrm.SmbWinRmConnection; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; @@ -33,13 +33,13 @@ import static com.xebialabs.overthere.OperatingSystemFamily.WINDOWS; import static com.xebialabs.overthere.cifs.CifsConnectionType.WINRM_NATIVE; -import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.*; +import static com.xebialabs.overthere.smb.SmbConnectionBuilder.*; import static com.xebialabs.overthere.util.DefaultAddressPortMapper.INSTANCE; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.not; import static org.hamcrest.Matchers.nullValue; -public class Smb2FileTest { +public class SmbFileTest { private ConnectionOptions options; @@ -50,7 +50,7 @@ public void setupOptions() { options.set(CONNECTION_TYPE, WINRM_NATIVE); options.set(PASSWORD, "foobar"); options.set(PORT, PORT_DEFAULT_WINRM_HTTP); - options.set(SMB2_PORT, PORT_DEFAULT_SMB2); + options.set(SMB_PORT, PORT_DEFAULT_SMB); options.set(ADDRESS, "localhost"); } @@ -58,16 +58,16 @@ public void setupOptions() { @Test public void shouldReturnNullForParentFileOfRoot() { options.set(USERNAME, "user@domain.com"); - Smb2WinRmConnection smb2WinRmConnection = new Smb2WinRmConnection(SMB2_PROTOCOL, options, INSTANCE); - OverthereFile file = smb2WinRmConnection.getFile("C:\\"); + SmbWinRmConnection smbWinRmConnection = new SmbWinRmConnection(SMB_PROTOCOL, options, INSTANCE); + OverthereFile file = smbWinRmConnection.getFile("C:\\"); assertThat(file.getParentFile(), nullValue()); } @Test public void shouldSucceedForNonRoot() { options.set(USERNAME, "user@domain.com"); - Smb2WinRmConnection smb2WinRmConnection = new Smb2WinRmConnection(SMB2_PROTOCOL, options, INSTANCE); - OverthereFile file = smb2WinRmConnection.getFile("C:\\windows\\temp\\ot-2015060"); + SmbWinRmConnection smbWinRmConnection = new SmbWinRmConnection(SMB_PROTOCOL, options, INSTANCE); + OverthereFile file = smbWinRmConnection.getFile("C:\\windows\\temp\\ot-2015060"); assertThat(file.getParentFile(), not(nullValue())); } } \ No newline at end of file diff --git a/src/test/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnectionTest.java b/src/test/java/com/xebialabs/overthere/smb/telnet/SmbTelnetConnectionTest.java similarity index 86% rename from src/test/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnectionTest.java rename to src/test/java/com/xebialabs/overthere/smb/telnet/SmbTelnetConnectionTest.java index 9bc282f0..549aaccd 100644 --- a/src/test/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnectionTest.java +++ b/src/test/java/com/xebialabs/overthere/smb/telnet/SmbTelnetConnectionTest.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.smb2.telnet; +package com.xebialabs.overthere.smb.telnet; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; @@ -33,11 +33,11 @@ import static com.xebialabs.overthere.ConnectionOptions.PORT; import static com.xebialabs.overthere.ConnectionOptions.USERNAME; import static com.xebialabs.overthere.OperatingSystemFamily.WINDOWS; -import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.*; +import static com.xebialabs.overthere.smb.SmbConnectionBuilder.*; import static com.xebialabs.overthere.util.DefaultAddressPortMapper.INSTANCE; import static com.xebialabs.overthere.cifs.CifsConnectionType.TELNET; -public class Smb2TelnetConnectionTest { +public class SmbTelnetConnectionTest { private ConnectionOptions options; @@ -48,7 +48,7 @@ public void setupOptions() { options.set(CONNECTION_TYPE, TELNET); options.set(PASSWORD, "foobar"); options.set(PORT, PORT_DEFAULT_TELNET); - options.set(SMB2_PORT, PORT_DEFAULT_SMB2); + options.set(SMB_PORT, PORT_DEFAULT_SMB); options.set(ADDRESS, "localhost"); } @@ -56,20 +56,20 @@ public void setupOptions() { @SuppressWarnings("resource") public void shouldNotSupportNewStyleDomainAccount() { options.set(USERNAME, "user@domain.com"); - new Smb2TelnetConnection(SMB2_PROTOCOL, options, INSTANCE); + new SmbTelnetConnection(SMB_PROTOCOL, options, INSTANCE); } @Test @SuppressWarnings("resource") public void shouldSupportOldStyleDomainAccount() { options.set(USERNAME, "domain\\user"); - new Smb2TelnetConnection(SMB2_PROTOCOL, options, INSTANCE); + new SmbTelnetConnection(SMB_PROTOCOL, options, INSTANCE); } @Test @SuppressWarnings("resource") public void shouldSupportDomainlessAccount() { options.set(USERNAME, "user"); - new Smb2TelnetConnection(SMB2_PROTOCOL, options, INSTANCE); + new SmbTelnetConnection(SMB_PROTOCOL, options, INSTANCE); } } diff --git a/src/test/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnectionWithAdministrativeUserItest.java b/src/test/java/com/xebialabs/overthere/smb/telnet/SmbTelnetConnectionWithAdministrativeUserItest.java similarity index 87% rename from src/test/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnectionWithAdministrativeUserItest.java rename to src/test/java/com/xebialabs/overthere/smb/telnet/SmbTelnetConnectionWithAdministrativeUserItest.java index b76f8505..b39aecba 100644 --- a/src/test/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnectionWithAdministrativeUserItest.java +++ b/src/test/java/com/xebialabs/overthere/smb/telnet/SmbTelnetConnectionWithAdministrativeUserItest.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.smb2.telnet; +package com.xebialabs.overthere.smb.telnet; import org.testng.annotations.Listeners; import org.testng.annotations.Test; @@ -36,17 +36,17 @@ import static com.xebialabs.overthere.OperatingSystemFamily.WINDOWS; import static com.xebialabs.overthere.WindowsCloudHostListener.ADMINISTRATIVE_WINDOWS_USER_PASSWORD; import static com.xebialabs.overthere.WindowsCloudHostListener.ADMINISTRATIVE_WINDOWS_USER_USERNAME; -import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.CONNECTION_TYPE; -import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.SMB2_PROTOCOL; +import static com.xebialabs.overthere.smb.SmbConnectionBuilder.CONNECTION_TYPE; +import static com.xebialabs.overthere.smb.SmbConnectionBuilder.SMB_PROTOCOL; import static com.xebialabs.overthere.cifs.CifsConnectionType.TELNET; @Test @Listeners({WindowsCloudHostListener.class}) -public class Smb2TelnetConnectionWithAdministrativeUserItest extends OverthereConnectionItestBase { +public class SmbTelnetConnectionWithAdministrativeUserItest extends OverthereConnectionItestBase { @Override protected String getProtocol() { - return SMB2_PROTOCOL; + return SMB_PROTOCOL; } @Override @@ -62,7 +62,7 @@ protected ConnectionOptions getOptions() { @Override protected String getExpectedConnectionClassName() { - return Smb2TelnetConnection.class.getName(); + return SmbTelnetConnection.class.getName(); } } diff --git a/src/test/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnectionWithRegularUserItest.java b/src/test/java/com/xebialabs/overthere/smb/telnet/SmbTelnetConnectionWithRegularUserItest.java similarity index 85% rename from src/test/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnectionWithRegularUserItest.java rename to src/test/java/com/xebialabs/overthere/smb/telnet/SmbTelnetConnectionWithRegularUserItest.java index 2d5c16a5..98be17e0 100644 --- a/src/test/java/com/xebialabs/overthere/smb2/telnet/Smb2TelnetConnectionWithRegularUserItest.java +++ b/src/test/java/com/xebialabs/overthere/smb/telnet/SmbTelnetConnectionWithRegularUserItest.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.smb2.telnet; +package com.xebialabs.overthere.smb.telnet; import org.testng.annotations.Listeners; import org.testng.annotations.Test; @@ -38,18 +38,18 @@ import static com.xebialabs.overthere.OperatingSystemFamily.WINDOWS; import static com.xebialabs.overthere.WindowsCloudHostListener.REGULAR_WINDOWS_USER_PASSWORD; import static com.xebialabs.overthere.WindowsCloudHostListener.REGULAR_WINDOWS_USER_USERNAME; -import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.CONNECTION_TYPE; -import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.PATH_SHARE_MAPPINGS; -import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.SMB2_PROTOCOL; +import static com.xebialabs.overthere.smb.SmbConnectionBuilder.CONNECTION_TYPE; +import static com.xebialabs.overthere.smb.SmbConnectionBuilder.PATH_SHARE_MAPPINGS; +import static com.xebialabs.overthere.smb.SmbConnectionBuilder.SMB_PROTOCOL; import static com.xebialabs.overthere.cifs.CifsConnectionType.TELNET; @Test @Listeners({WindowsCloudHostListener.class}) -public class Smb2TelnetConnectionWithRegularUserItest extends OverthereConnectionItestBase { +public class SmbTelnetConnectionWithRegularUserItest extends OverthereConnectionItestBase { @Override protected String getProtocol() { - return SMB2_PROTOCOL; + return SMB_PROTOCOL; } @Override @@ -67,7 +67,7 @@ protected ConnectionOptions getOptions() { @Override protected String getExpectedConnectionClassName() { - return Smb2TelnetConnection.class.getName(); + return SmbTelnetConnection.class.getName(); } } diff --git a/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpWithAdministrativeUserItest.java b/src/test/java/com/xebialabs/overthere/smb/winrm/SmbWinRmConnectionOverHttpWithAdministrativeUserItest.java similarity index 88% rename from src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpWithAdministrativeUserItest.java rename to src/test/java/com/xebialabs/overthere/smb/winrm/SmbWinRmConnectionOverHttpWithAdministrativeUserItest.java index c0f63779..5b23b0b3 100644 --- a/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpWithAdministrativeUserItest.java +++ b/src/test/java/com/xebialabs/overthere/smb/winrm/SmbWinRmConnectionOverHttpWithAdministrativeUserItest.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.smb2.winrm; +package com.xebialabs.overthere.smb.winrm; import com.xebialabs.overthere.ConnectionOptions; import com.xebialabs.overthere.itest.OverthereConnectionItestBase; @@ -35,15 +35,15 @@ import static com.xebialabs.overthere.WindowsCloudHostListener.ADMINISTRATIVE_WINDOWS_USER_USERNAME; import static com.xebialabs.overthere.cifs.CifsConnectionType.WINRM_INTERNAL; import static com.xebialabs.overthere.cifs.ConnectionBuilder.CONNECTION_TYPE; -import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.SMB2_PROTOCOL; +import static com.xebialabs.overthere.smb.SmbConnectionBuilder.SMB_PROTOCOL; @Test @Listeners({WindowsCloudHostListener.class}) -public class Smb2WinRmConnectionOverHttpWithAdministrativeUserItest extends OverthereConnectionItestBase { +public class SmbWinRmConnectionOverHttpWithAdministrativeUserItest extends OverthereConnectionItestBase { @Override protected String getProtocol() { - return SMB2_PROTOCOL; + return SMB_PROTOCOL; } @Override @@ -59,6 +59,6 @@ protected ConnectionOptions getOptions() { @Override protected String getExpectedConnectionClassName() { - return Smb2WinRmConnection.class.getName(); + return SmbWinRmConnection.class.getName(); } } diff --git a/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpsWithAdministrativeUserItest.java b/src/test/java/com/xebialabs/overthere/smb/winrm/SmbWinRmConnectionOverHttpsWithAdministrativeUserItest.java similarity index 90% rename from src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpsWithAdministrativeUserItest.java rename to src/test/java/com/xebialabs/overthere/smb/winrm/SmbWinRmConnectionOverHttpsWithAdministrativeUserItest.java index fd6f8e80..2f1b3240 100644 --- a/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionOverHttpsWithAdministrativeUserItest.java +++ b/src/test/java/com/xebialabs/overthere/smb/winrm/SmbWinRmConnectionOverHttpsWithAdministrativeUserItest.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.smb2.winrm; +package com.xebialabs.overthere.smb.winrm; import com.xebialabs.overthere.ConnectionOptions; import com.xebialabs.overthere.cifs.WinrmHttpsCertificateTrustStrategy; @@ -37,15 +37,15 @@ import static com.xebialabs.overthere.WindowsCloudHostListener.ADMINISTRATIVE_WINDOWS_USER_USERNAME; import static com.xebialabs.overthere.cifs.CifsConnectionType.WINRM_INTERNAL; import static com.xebialabs.overthere.cifs.ConnectionBuilder.*; -import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.SMB2_PROTOCOL; +import static com.xebialabs.overthere.smb.SmbConnectionBuilder.SMB_PROTOCOL; @Test @Listeners({WindowsCloudHostListener.class}) -public class Smb2WinRmConnectionOverHttpsWithAdministrativeUserItest extends OverthereConnectionItestBase { +public class SmbWinRmConnectionOverHttpsWithAdministrativeUserItest extends OverthereConnectionItestBase { @Override protected String getProtocol() { - return SMB2_PROTOCOL; + return SMB_PROTOCOL; } @Override @@ -64,6 +64,6 @@ protected ConnectionOptions getOptions() { @Override protected String getExpectedConnectionClassName() { - return Smb2WinRmConnection.class.getName(); + return SmbWinRmConnection.class.getName(); } } diff --git a/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionTest.java b/src/test/java/com/xebialabs/overthere/smb/winrm/SmbWinRmConnectionTest.java similarity index 86% rename from src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionTest.java rename to src/test/java/com/xebialabs/overthere/smb/winrm/SmbWinRmConnectionTest.java index 0d4df9d3..75cb365f 100644 --- a/src/test/java/com/xebialabs/overthere/smb2/winrm/Smb2WinRmConnectionTest.java +++ b/src/test/java/com/xebialabs/overthere/smb/winrm/SmbWinRmConnectionTest.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.smb2.winrm; +package com.xebialabs.overthere.smb.winrm; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; @@ -33,11 +33,11 @@ import static com.xebialabs.overthere.ConnectionOptions.PORT; import static com.xebialabs.overthere.ConnectionOptions.USERNAME; import static com.xebialabs.overthere.OperatingSystemFamily.WINDOWS; -import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.*; +import static com.xebialabs.overthere.smb.SmbConnectionBuilder.*; import static com.xebialabs.overthere.util.DefaultAddressPortMapper.INSTANCE; import static com.xebialabs.overthere.cifs.CifsConnectionType.WINRM_INTERNAL; -public class Smb2WinRmConnectionTest { +public class SmbWinRmConnectionTest { private ConnectionOptions options; @@ -47,7 +47,7 @@ public void setupOptions() { options.set(OPERATING_SYSTEM, WINDOWS); options.set(CONNECTION_TYPE, WINRM_INTERNAL); options.set(PASSWORD, "foobar"); - options.set(SMB2_PORT, PORT_DEFAULT_SMB2); + options.set(SMB_PORT, PORT_DEFAULT_SMB); options.set(PORT, PORT_DEFAULT_WINRM_HTTP); options.set(ADDRESS, "localhost"); } @@ -56,21 +56,21 @@ public void setupOptions() { @SuppressWarnings("resource") public void shouldSupportNewStyleDomainAccount() { options.set(USERNAME, "user@domain.com"); - new Smb2WinRmConnection(SMB2_PROTOCOL, options, INSTANCE); + new SmbWinRmConnection(SMB_PROTOCOL, options, INSTANCE); } @Test(expectedExceptions = IllegalArgumentException.class) @SuppressWarnings("resource") public void shouldNotSupportOldStyleDomainAccount() { options.set(USERNAME, "domain\\user"); - new Smb2WinRmConnection(SMB2_PROTOCOL, options, INSTANCE); + new SmbWinRmConnection(SMB_PROTOCOL, options, INSTANCE); } @Test @SuppressWarnings("resource") public void shouldSupportDomainlessAccount() { options.set(USERNAME, "user"); - new Smb2WinRmConnection(SMB2_PROTOCOL, options, INSTANCE); + new SmbWinRmConnection(SMB_PROTOCOL, options, INSTANCE); } } diff --git a/src/test/java/com/xebialabs/overthere/smb2/winrs/Smb2WinRsConnectionTest.java b/src/test/java/com/xebialabs/overthere/smb/winrs/SmbWinRsConnectionTest.java similarity index 87% rename from src/test/java/com/xebialabs/overthere/smb2/winrs/Smb2WinRsConnectionTest.java rename to src/test/java/com/xebialabs/overthere/smb/winrs/SmbWinRsConnectionTest.java index d86bab14..53dff48d 100644 --- a/src/test/java/com/xebialabs/overthere/smb2/winrs/Smb2WinRsConnectionTest.java +++ b/src/test/java/com/xebialabs/overthere/smb/winrs/SmbWinRsConnectionTest.java @@ -20,7 +20,7 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.smb2.winrs; +package com.xebialabs.overthere.smb.winrs; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; @@ -35,11 +35,11 @@ import static com.xebialabs.overthere.ConnectionOptions.PORT; import static com.xebialabs.overthere.ConnectionOptions.USERNAME; import static com.xebialabs.overthere.OperatingSystemFamily.WINDOWS; -import static com.xebialabs.overthere.smb2.Smb2ConnectionBuilder.*; +import static com.xebialabs.overthere.smb.SmbConnectionBuilder.*; import static com.xebialabs.overthere.util.DefaultAddressPortMapper.INSTANCE; import static com.xebialabs.overthere.cifs.CifsConnectionType.WINRM_NATIVE; -public class Smb2WinRsConnectionTest { +public class SmbWinRsConnectionTest { private ConnectionOptions options; @@ -54,7 +54,7 @@ public void setupOptions() { options.set(CONNECTION_TYPE, WINRM_NATIVE); options.set(PASSWORD, "foobar"); options.set(PORT, PORT_DEFAULT_WINRM_HTTP); - options.set(SMB2_PORT, PORT_DEFAULT_SMB2); + options.set(SMB_PORT, PORT_DEFAULT_SMB); options.set(ADDRESS, "localhost"); } @@ -63,7 +63,7 @@ public void setupOptions() { @SuppressWarnings("resource") public void shouldSupportNewStyleDomainAccount() { options.set(USERNAME, "user@domain.com"); - new Smb2WinrsConnection(SMB2_PROTOCOL, options, INSTANCE); + new SmbWinrsConnection(SMB_PROTOCOL, options, INSTANCE); } @Test @@ -71,7 +71,7 @@ public void shouldSupportNewStyleDomainAccount() { @SuppressWarnings("resource") public void shouldSupportOldStyleDomainAccount() { options.set(USERNAME, "domain\\user"); - new Smb2WinrsConnection(SMB2_PROTOCOL, options, INSTANCE); + new SmbWinrsConnection(SMB_PROTOCOL, options, INSTANCE); } @Test @@ -79,6 +79,6 @@ public void shouldSupportOldStyleDomainAccount() { @SuppressWarnings("resource") public void shouldSupportDomainlessAccount() { options.set(USERNAME, "user"); - new Smb2WinrsConnection(SMB2_PROTOCOL, options, INSTANCE); + new SmbWinrsConnection(SMB_PROTOCOL, options, INSTANCE); } } From 30ece603bafc6cf9daa5e11822b26ae6efc79429 Mon Sep 17 00:00:00 2001 From: Aditya Kalia Date: Wed, 7 Sep 2016 16:39:22 +0530 Subject: [PATCH 19/40] adding test cases for domain --- .../overthere/smb/SmbConnection.java | 38 +++++++++-- .../overthere/smb/SmbConnectionBuilder.java | 7 +- .../WindowsCloudHostWithDomainListener.java | 45 +++++++++++++ .../overthere/itest/ItestsBase1Utils.java | 11 ++++ .../overthere/itest/ItestsBase6Windows.java | 52 ++++++++++----- ...mbTelnetConnectionWithDomainUserItest.java | 47 ++++++++++++++ ...ConnectionOverHttpWithDomainUserItest.java | 64 +++++++++++++++++++ src/test/resources/overcast.properties | 3 + 8 files changed, 241 insertions(+), 26 deletions(-) create mode 100644 src/test/java/com/xebialabs/overthere/WindowsCloudHostWithDomainListener.java create mode 100644 src/test/java/com/xebialabs/overthere/smb/telnet/SmbTelnetConnectionWithDomainUserItest.java create mode 100644 src/test/java/com/xebialabs/overthere/smb/winrm/SmbWinRmConnectionOverHttpWithDomainUserItest.java diff --git a/src/main/java/com/xebialabs/overthere/smb/SmbConnection.java b/src/main/java/com/xebialabs/overthere/smb/SmbConnection.java index 9a1d9482..0a387d6f 100644 --- a/src/main/java/com/xebialabs/overthere/smb/SmbConnection.java +++ b/src/main/java/com/xebialabs/overthere/smb/SmbConnection.java @@ -56,7 +56,6 @@ public class SmbConnection extends BaseOverthereConnection { private final SMBClient client; private final String hostname; private final int smbPort; - private final String domain; private Connection connection; private Session session; private int port; @@ -65,7 +64,7 @@ public class SmbConnection extends BaseOverthereConnection { protected final String password; protected CifsConnectionType cifsConnectionType; protected final String username; - private static final String EMPTY = ""; + protected final String domain; static { if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) == null) { @@ -90,9 +89,10 @@ protected SmbConnection(String protocol, ConnectionOptions options, AddressPortM int unmappedSmbPort = options.getInteger(SMB_PORT, PORT_DEFAULT_SMB); InetSocketAddress smbAddressPort = mapper.map(createUnresolved(unmappedAddress, unmappedSmbPort)); smbPort = smbAddressPort.getPort(); - username = options.get(USERNAME); + UserAndDomain ud = getUserNameAndDomain(options.get(USERNAME)); + username = ud.getUsername(); + domain = ud.getDomain(); password = options.get(PASSWORD); - domain = options.get(DOMAIN, EMPTY); client = new SMBClient(new DefaultConfig()); } @@ -170,5 +170,35 @@ protected DiskShare getShare(String shareName) { return share; } + private UserAndDomain getUserNameAndDomain(String user) { + if (user.contains("\\")) { + String[] split = user.split("\\\\"); + return new UserAndDomain(split[1], split[0]); + } + if (user.contains("@")) { + String[] split = user.split("@"); + return new UserAndDomain(split[0], split[1]); + } + return new UserAndDomain(user, ""); + } + + private static class UserAndDomain { + String username; + String domain; + + private UserAndDomain(String username, String domain) { + this.username = username; + this.domain = domain; + } + + private String getUsername() { + return username; + } + + private String getDomain() { + return domain; + } + } + private static Logger logger = LoggerFactory.getLogger(SmbConnection.class); } diff --git a/src/main/java/com/xebialabs/overthere/smb/SmbConnectionBuilder.java b/src/main/java/com/xebialabs/overthere/smb/SmbConnectionBuilder.java index 821341bb..4f499152 100644 --- a/src/main/java/com/xebialabs/overthere/smb/SmbConnectionBuilder.java +++ b/src/main/java/com/xebialabs/overthere/smb/SmbConnectionBuilder.java @@ -45,12 +45,7 @@ public class SmbConnectionBuilder extends ConnectionBuilder implements Overthere */ public static final int PORT_DEFAULT_SMB = 445; - public static final String SMB_PORT = "cifsPort"; - - /** - * The Windows Domain to authenticate the user against. If not set blank value will be used - */ - public static final String DOMAIN = "domain"; + public static final String SMB_PORT = "smbPort"; private final SmbConnection connection; diff --git a/src/test/java/com/xebialabs/overthere/WindowsCloudHostWithDomainListener.java b/src/test/java/com/xebialabs/overthere/WindowsCloudHostWithDomainListener.java new file mode 100644 index 00000000..89bb53f5 --- /dev/null +++ b/src/test/java/com/xebialabs/overthere/WindowsCloudHostWithDomainListener.java @@ -0,0 +1,45 @@ +/** + * Copyright (c) 2008-2016, XebiaLabs B.V., All rights reserved. + * + * + * Overthere is licensed under the terms of the GPLv2 + * , like most XebiaLabs Libraries. + * There are special exceptions to the terms and conditions of the GPLv2 as it is applied to + * this software, see the FLOSS License Exception + * . + * + * This program is free software; you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation; version 2 + * of the License. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth + * Floor, Boston, MA 02110-1301 USA + */ +package com.xebialabs.overthere; + +import com.xebialabs.overcast.host.CloudHost; + +import java.util.concurrent.atomic.AtomicReference; + +import static com.xebialabs.overthere.util.OverthereUtils.checkNotNull; + +public class WindowsCloudHostWithDomainListener extends CloudHostListener { + + public static final String DOMAIN_WINDOWS_USER_PASSWORD = "Xebia@123"; + + private static AtomicReference windowsHost = new AtomicReference(); + + public WindowsCloudHostWithDomainListener() { + super("overthere-windows-domain-accounts", windowsHost); + } + + public static CloudHost getHost() { + return checkNotNull(windowsHost.get(), "Cloud host overthere-windows-domain-accounts has not been started. Did you wire up the right CloudHostListener?"); + } + +} diff --git a/src/test/java/com/xebialabs/overthere/itest/ItestsBase1Utils.java b/src/test/java/com/xebialabs/overthere/itest/ItestsBase1Utils.java index 0e940a58..08583c21 100644 --- a/src/test/java/com/xebialabs/overthere/itest/ItestsBase1Utils.java +++ b/src/test/java/com/xebialabs/overthere/itest/ItestsBase1Utils.java @@ -48,6 +48,7 @@ import static com.xebialabs.overthere.OperatingSystemFamily.UNIX; import static com.xebialabs.overthere.OperatingSystemFamily.WINDOWS; import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.CIFS_PROTOCOL; +import static com.xebialabs.overthere.smb.SmbConnectionBuilder.SMB_PROTOCOL; import static com.xebialabs.overthere.cifs.CifsConnectionType.TELNET; import static com.xebialabs.overthere.cifs.CifsConnectionType.WINRM_INTERNAL; import static com.xebialabs.overthere.local.LocalConnection.LOCAL_PROTOCOL; @@ -203,6 +204,16 @@ public boolean onlyCifsTelnet() { return protocol.equals(CIFS_PROTOCOL) && options.get(CONNECTION_TYPE).equals(TELNET); } + public boolean onlySmbWinrm() { + checkConnected("onlySmbWinrm"); + return protocol.equals(SMB_PROTOCOL) && options.get(CONNECTION_TYPE).equals(WINRM_INTERNAL); + } + + public boolean onlySmbTelnet() { + checkConnected("onlySmbTelnet"); + return protocol.equals(SMB_PROTOCOL) && options.get(CONNECTION_TYPE).equals(TELNET); + } + public boolean notSftpCygwin() { checkConnected("notSftpCygwin"); return !onlySftpCygwin(); diff --git a/src/test/java/com/xebialabs/overthere/itest/ItestsBase6Windows.java b/src/test/java/com/xebialabs/overthere/itest/ItestsBase6Windows.java index ba1d4d6c..c3d32acf 100644 --- a/src/test/java/com/xebialabs/overthere/itest/ItestsBase6Windows.java +++ b/src/test/java/com/xebialabs/overthere/itest/ItestsBase6Windows.java @@ -42,6 +42,7 @@ import static com.xebialabs.overthere.ConnectionOptions.USERNAME; import static com.xebialabs.overthere.cifs.CifsConnectionBuilder.CIFS_PROTOCOL; +import static com.xebialabs.overthere.smb.SmbConnectionBuilder.SMB_PROTOCOL; import static com.xebialabs.overthere.cifs.CifsConnectionType.TELNET; import static com.xebialabs.overthere.cifs.CifsConnectionType.WINRM_INTERNAL; import static com.xebialabs.overthere.util.CapturingOverthereExecutionOutputHandler.capturingHandler; @@ -60,27 +61,25 @@ public abstract class ItestsBase6Windows extends ItestsBase5Unix { @Test @Assumption(methods = {"onWindows", "onlyCifsWinrm"}) public void shouldThrowValidationMessageWhenTryingToConnectWithOldStyleWindowsDomainAccount() { - ConnectionOptions incorrectUserNameOptions = new ConnectionOptions(options); - incorrectUserNameOptions.set(USERNAME, "DOMAIN\\user"); - try { - Overthere.getConnection(protocol, incorrectUserNameOptions); - fail("Expected not to be able to connect with an old-style Windows domain account"); - } catch (IllegalArgumentException expected) { - assertThat(expected.getMessage(), containsString("Cannot create a " + CIFS_PROTOCOL + ":" + WINRM_INTERNAL.toString().toLowerCase() + " connection with an old-style Windows domain account")); - } + assertWithOldStyleDomain("Cannot create a " + CIFS_PROTOCOL + ":" + WINRM_INTERNAL.toString().toLowerCase() + " connection with an old-style Windows domain account"); + } + + @Test + @Assumption(methods = {"onWindows", "onlySmbWinrm"}) + public void shouldThrowValidationMessageWhenTryingToConnectWithOldStyleWindowsDomainAccountSmb() { + assertWithOldStyleDomain("Cannot create a " + SMB_PROTOCOL + ":" + WINRM_INTERNAL.toString().toLowerCase() + " connection with an old-style Windows domain account"); } @Test @Assumption(methods = {"onWindows", "onlyCifsTelnet"}) public void shouldThrowValidationMessageWhenTryingToConnectWithNewStyleWindowsDomainAccount() { - ConnectionOptions incorrectUserNameOptions = new ConnectionOptions(options); - incorrectUserNameOptions.set(USERNAME, "user@DOMAIN"); - try { - Overthere.getConnection(protocol, incorrectUserNameOptions); - fail("Expected not to be able to connect with a new-style Windows domain account"); - } catch (IllegalArgumentException expected) { - assertThat(expected.getMessage(), containsString("Cannot create a " + CIFS_PROTOCOL + ":" + TELNET.toString().toLowerCase() + " connection with a new-style Windows domain account")); - } + assertWithNewStyleDomain("Cannot create a " + CIFS_PROTOCOL + ":" + TELNET.toString().toLowerCase() + " connection with a new-style Windows domain account"); + } + + @Test + @Assumption(methods = {"onWindows", "onlySmbTelnet"}) + public void shouldThrowValidationMessageWhenTryingToConnectWithNewStyleWindowsDomainAccountSmb() { + assertWithNewStyleDomain("Cannot create a " + SMB_PROTOCOL + ":" + TELNET.toString().toLowerCase() + " connection with a new-style Windows domain account"); } @Test @@ -250,4 +249,25 @@ public void shouldNormalizeWindowsPathWithForwardSlashes() { assertThat(file.getPath(), equalTo("C:\\Windows\\System32")); } + private void assertWithOldStyleDomain(String str) { + ConnectionOptions incorrectUserNameOptions = new ConnectionOptions(options); + incorrectUserNameOptions.set(USERNAME, "DOMAIN\\user"); + try { + Overthere.getConnection(protocol, incorrectUserNameOptions); + fail("Expected not to be able to connect with an old-style Windows domain account"); + } catch (IllegalArgumentException expected) { + assertThat(expected.getMessage(), containsString(str)); + } + } + + private void assertWithNewStyleDomain(String str) { + ConnectionOptions incorrectUserNameOptions = new ConnectionOptions(options); + incorrectUserNameOptions.set(USERNAME, "user@DOMAIN"); + try { + Overthere.getConnection(protocol, incorrectUserNameOptions); + fail("Expected not to be able to connect with a new-style Windows domain account"); + } catch (IllegalArgumentException expected) { + assertThat(expected.getMessage(), containsString(str)); + } + } } diff --git a/src/test/java/com/xebialabs/overthere/smb/telnet/SmbTelnetConnectionWithDomainUserItest.java b/src/test/java/com/xebialabs/overthere/smb/telnet/SmbTelnetConnectionWithDomainUserItest.java new file mode 100644 index 00000000..d97948d1 --- /dev/null +++ b/src/test/java/com/xebialabs/overthere/smb/telnet/SmbTelnetConnectionWithDomainUserItest.java @@ -0,0 +1,47 @@ +package com.xebialabs.overthere.smb.telnet; + +import com.google.common.collect.ImmutableMap; +import com.xebialabs.overthere.ConnectionOptions; +import com.xebialabs.overthere.WindowsCloudHostWithDomainListener; +import com.xebialabs.overthere.itest.OverthereConnectionItestBase; +import org.testng.annotations.Listeners; +import org.testng.annotations.Test; + +import static com.xebialabs.overthere.ConnectionOptions.*; +import static com.xebialabs.overthere.OperatingSystemFamily.WINDOWS; +import static com.xebialabs.overthere.WindowsCloudHostWithDomainListener.DOMAIN_WINDOWS_USER_PASSWORD; +import static com.xebialabs.overthere.cifs.CifsConnectionType.TELNET; +import static com.xebialabs.overthere.cifs.ConnectionBuilder.CONNECTION_TYPE; +import static com.xebialabs.overthere.cifs.ConnectionBuilder.PATH_SHARE_MAPPINGS; +import static com.xebialabs.overthere.smb.SmbConnectionBuilder.SMB_PROTOCOL; + +@Test +@Listeners({WindowsCloudHostWithDomainListener.class}) +public class SmbTelnetConnectionWithDomainUserItest extends OverthereConnectionItestBase { + + public static final String WINDOWS_USERNAME = "W2K8R2\\itest"; + + @Override + protected String getProtocol() { + return SMB_PROTOCOL; + } + + @Override + protected ConnectionOptions getOptions() { + ConnectionOptions options = new ConnectionOptions(); + options.set(OPERATING_SYSTEM, WINDOWS); + options.set(CONNECTION_TYPE, TELNET); + options.set(ADDRESS, WindowsCloudHostWithDomainListener.getHost().getHostName()); + options.set(USERNAME, WINDOWS_USERNAME); + options.set(PASSWORD, DOMAIN_WINDOWS_USER_PASSWORD); + options.set(TEMPORARY_DIRECTORY_PATH, "C:\\overthere\\temp"); + options.set(PATH_SHARE_MAPPINGS, ImmutableMap.of("C:\\overthere", "sharethere")); + return options; + } + + @Override + protected String getExpectedConnectionClassName() { + return SmbTelnetConnection.class.getName(); + } + +} diff --git a/src/test/java/com/xebialabs/overthere/smb/winrm/SmbWinRmConnectionOverHttpWithDomainUserItest.java b/src/test/java/com/xebialabs/overthere/smb/winrm/SmbWinRmConnectionOverHttpWithDomainUserItest.java new file mode 100644 index 00000000..b8e868e4 --- /dev/null +++ b/src/test/java/com/xebialabs/overthere/smb/winrm/SmbWinRmConnectionOverHttpWithDomainUserItest.java @@ -0,0 +1,64 @@ +/** + * Copyright (c) 2008-2016, XebiaLabs B.V., All rights reserved. + * + * + * Overthere is licensed under the terms of the GPLv2 + * , like most XebiaLabs Libraries. + * There are special exceptions to the terms and conditions of the GPLv2 as it is applied to + * this software, see the FLOSS License Exception + * . + * + * This program is free software; you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation; version 2 + * of the License. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth + * Floor, Boston, MA 02110-1301 USA + */ +package com.xebialabs.overthere.smb.winrm; + +import com.xebialabs.overthere.ConnectionOptions; +import com.xebialabs.overthere.WindowsCloudHostWithDomainListener; +import com.xebialabs.overthere.itest.OverthereConnectionItestBase; +import org.testng.annotations.Listeners; +import org.testng.annotations.Test; + +import static com.xebialabs.overthere.ConnectionOptions.*; +import static com.xebialabs.overthere.OperatingSystemFamily.WINDOWS; +import static com.xebialabs.overthere.WindowsCloudHostWithDomainListener.DOMAIN_WINDOWS_USER_PASSWORD; +import static com.xebialabs.overthere.cifs.CifsConnectionType.WINRM_INTERNAL; +import static com.xebialabs.overthere.cifs.ConnectionBuilder.CONNECTION_TYPE; +import static com.xebialabs.overthere.smb.SmbConnectionBuilder.SMB_PROTOCOL; + +@Test +@Listeners({WindowsCloudHostWithDomainListener.class}) +public class SmbWinRmConnectionOverHttpWithDomainUserItest extends OverthereConnectionItestBase { + + public static final String DOMAIN_WINDOWS_USERNAME = "itest@W2K8R2.XEBIALABS.COM"; + + @Override + protected String getProtocol() { + return SMB_PROTOCOL; + } + + @Override + protected ConnectionOptions getOptions() { + ConnectionOptions options = new ConnectionOptions(); + options.set(OPERATING_SYSTEM, WINDOWS); + options.set(CONNECTION_TYPE, WINRM_INTERNAL); + options.set(ADDRESS, WindowsCloudHostWithDomainListener.getHost().getHostName()); + options.set(USERNAME, DOMAIN_WINDOWS_USERNAME); + options.set(PASSWORD, DOMAIN_WINDOWS_USER_PASSWORD); + return options; + } + + @Override + protected String getExpectedConnectionClassName() { + return SmbWinRmConnection.class.getName(); + } +} diff --git a/src/test/resources/overcast.properties b/src/test/resources/overcast.properties index 3f8bcfc6..67fe00ee 100644 --- a/src/test/resources/overcast.properties +++ b/src/test/resources/overcast.properties @@ -26,3 +26,6 @@ overthere-unix.hostname=overthere-unix.xebialabs.com # Overthere Windows image overthere-windows-local-accounts.hostname=overthere-winla.xebialabs.com + +# Overthere Windows image With Domain +overthere-windows-domain-accounts.hostname=w2k8r2-dm1.xebialabs.com \ No newline at end of file From 8b9bad257f16c781e5dbd39e8f6249b9c5f0b683 Mon Sep 17 00:00:00 2001 From: Aditya Kalia Date: Wed, 7 Sep 2016 17:01:49 +0530 Subject: [PATCH 20/40] Fixing issue --- .../com/xebialabs/overthere/smb/SmbConnection.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/xebialabs/overthere/smb/SmbConnection.java b/src/main/java/com/xebialabs/overthere/smb/SmbConnection.java index 0a387d6f..96b55960 100644 --- a/src/main/java/com/xebialabs/overthere/smb/SmbConnection.java +++ b/src/main/java/com/xebialabs/overthere/smb/SmbConnection.java @@ -64,7 +64,6 @@ public class SmbConnection extends BaseOverthereConnection { protected final String password; protected CifsConnectionType cifsConnectionType; protected final String username; - protected final String domain; static { if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) == null) { @@ -89,17 +88,18 @@ protected SmbConnection(String protocol, ConnectionOptions options, AddressPortM int unmappedSmbPort = options.getInteger(SMB_PORT, PORT_DEFAULT_SMB); InetSocketAddress smbAddressPort = mapper.map(createUnresolved(unmappedAddress, unmappedSmbPort)); smbPort = smbAddressPort.getPort(); - UserAndDomain ud = getUserNameAndDomain(options.get(USERNAME)); - username = ud.getUsername(); - domain = ud.getDomain(); + username = options.get(USERNAME); password = options.get(PASSWORD); client = new SMBClient(new DefaultConfig()); } public void connect() { try { + UserAndDomain ud = getUserNameAndDomain(username); + String user = ud.getUsername(); + String domain = ud.getDomain(); connection = client.connect(hostname); - AuthenticationContext authContext = new AuthenticationContext(username, password.toCharArray(), domain); + AuthenticationContext authContext = new AuthenticationContext(user, password.toCharArray(), domain); session = connection.authenticate(authContext); } catch (IOException e) { throw new RuntimeIOException(e); From 517396054f627b67ef3da87036448bf93ff2282b Mon Sep 17 00:00:00 2001 From: Sameer Arora Date: Wed, 7 Sep 2016 18:28:47 +0530 Subject: [PATCH 21/40] DEPL-10110 Added fix for checking access mask. --- .../com/xebialabs/overthere/smb/SmbFile.java | 44 ++++++++++++++----- 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/xebialabs/overthere/smb/SmbFile.java b/src/main/java/com/xebialabs/overthere/smb/SmbFile.java index 828936d5..a70db6f8 100644 --- a/src/main/java/com/xebialabs/overthere/smb/SmbFile.java +++ b/src/main/java/com/xebialabs/overthere/smb/SmbFile.java @@ -1,21 +1,21 @@ /** * Copyright (c) 2008-2016, XebiaLabs B.V., All rights reserved. - * - * + *

    + *

    * Overthere is licensed under the terms of the GPLv2 * , like most XebiaLabs Libraries. * There are special exceptions to the terms and conditions of the GPLv2 as it is applied to * this software, see the FLOSS License Exception * . - * + *

    * This program is free software; you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Foundation; version 2 * of the License. - * + *

    * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. - * + *

    * You should have received a copy of the GNU General Public License along with this * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA @@ -23,6 +23,11 @@ package com.xebialabs.overthere.smb; import com.hierynomus.msdtyp.AccessMask; +import com.hierynomus.msdtyp.SID; +import com.hierynomus.msdtyp.SecurityDescriptor; +import com.hierynomus.msdtyp.SecurityInformation; +import com.hierynomus.msdtyp.ace.ACE; +import com.hierynomus.msdtyp.ace.AceType; import com.hierynomus.mserref.NtStatus; import com.hierynomus.msfscc.FileAttributes; import com.hierynomus.msfscc.fileinformation.FileInfo; @@ -45,6 +50,9 @@ import java.util.List; import java.util.Map; +import static com.hierynomus.msdtyp.AccessMask.FILE_READ_DATA; +import static com.hierynomus.msdtyp.AccessMask.FILE_WRITE_DATA; +import static com.hierynomus.msdtyp.ace.AceType.ACCESS_ALLOWED_ACE_TYPE; import static java.lang.String.format; public class SmbFile extends BaseOverthereFile { @@ -90,17 +98,17 @@ public boolean exists() { @Override public boolean canRead() { - return checkAccessMask(AccessMask.GENERIC_READ); + return checkAccessMask(FILE_READ_DATA); } @Override public boolean canWrite() { - return checkAccessMask(AccessMask.GENERIC_WRITE); + return checkAccessMask(FILE_WRITE_DATA); } @Override public boolean canExecute() { - return checkAccessMask(AccessMask.GENERIC_EXECUTE); + return checkAccessMask(FILE_READ_DATA); } @Override @@ -304,7 +312,7 @@ private void makeDirectory(String path) { public void mkdirs() { String sharePath = getPathOnShare(); logger.debug("Creating directories {}", sharePath); - String [] paths = SmbPaths.getPathListFromOuterToInner(sharePath); + String[] paths = SmbPaths.getPathListFromOuterToInner(sharePath); for (String p : paths) { if (!getShare().folderExists(p)) makeDirectory(p); @@ -335,8 +343,22 @@ public String toString() { } private boolean checkAccessMask(AccessMask mask) { - long accessMask = getShare().getFileInformation(getPathOnShare()).getAccessMask(); - return AccessMask.EnumUtils.isSet(accessMask, mask); + try { + SecurityDescriptor securityInfo = getShare(). + getSecurityInfo(getPathOnShare(), EnumSet.of(SecurityInformation.OWNER_SECURITY_INFORMATION, + SecurityInformation.GROUP_SECURITY_INFORMATION, SecurityInformation.DACL_SECURITY_INFORMATION)); + String ownerSid = securityInfo.getOwnerSid().toString(); + for (ACE ace : securityInfo.getDacl().getAces()) { + String aceSid = ace.getSid().toString(); + AceType aceType = ace.getAceHeader().getAceType(); + if (aceSid.equals(ownerSid) && aceType.equals(ACCESS_ALLOWED_ACE_TYPE)) { + return AccessMask.EnumUtils.isSet(ace.getAccessMask(), mask); + } + } + } catch (TransportException e) { + throw new IllegalStateException("Exception Occured while trying to query security information!"); + } + return false; } private String getSharePath() { From d13722287da754bc608e270be09aa08e0c01baa5 Mon Sep 17 00:00:00 2001 From: Sameer Arora Date: Fri, 9 Sep 2016 11:24:57 +0530 Subject: [PATCH 22/40] DEPL-10110 removed eager connection from SmbTelnet and SmbWinrm connection classes, updated/added headers. --- .../overthere/smb/SmbConnection.java | 9 +++++--- .../com/xebialabs/overthere/smb/SmbFile.java | 10 ++++----- .../smb/telnet/SmbTelnetConnection.java | 1 - .../smb/winrm/SmbWinRmConnection.java | 1 - .../xebialabs/overthere/ssh/SshSftpFile.java | 10 ++++----- ...mbTelnetConnectionWithDomainUserItest.java | 22 +++++++++++++++++++ 6 files changed, 38 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/xebialabs/overthere/smb/SmbConnection.java b/src/main/java/com/xebialabs/overthere/smb/SmbConnection.java index 96b55960..8587f34f 100644 --- a/src/main/java/com/xebialabs/overthere/smb/SmbConnection.java +++ b/src/main/java/com/xebialabs/overthere/smb/SmbConnection.java @@ -133,13 +133,16 @@ protected void doClose() { } finally { shareCache.clear(); try { - session.close(); + if(session!=null) { + session.close(); + } } catch (IOException e) { logger.warn("Exception while trying to close smb session", e); } finally { - try { - connection.close(); + if (connection != null) { + connection.close(); + } } catch (Exception e) { logger.warn("Exception while trying to close smb connection", e); } diff --git a/src/main/java/com/xebialabs/overthere/smb/SmbFile.java b/src/main/java/com/xebialabs/overthere/smb/SmbFile.java index a70db6f8..d6e99cc1 100644 --- a/src/main/java/com/xebialabs/overthere/smb/SmbFile.java +++ b/src/main/java/com/xebialabs/overthere/smb/SmbFile.java @@ -1,21 +1,21 @@ /** * Copyright (c) 2008-2016, XebiaLabs B.V., All rights reserved. - *

    - *

    + * + * * Overthere is licensed under the terms of the GPLv2 * , like most XebiaLabs Libraries. * There are special exceptions to the terms and conditions of the GPLv2 as it is applied to * this software, see the FLOSS License Exception * . - *

    + * * This program is free software; you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Foundation; version 2 * of the License. - *

    + * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. - *

    + * * You should have received a copy of the GNU General Public License along with this * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA diff --git a/src/main/java/com/xebialabs/overthere/smb/telnet/SmbTelnetConnection.java b/src/main/java/com/xebialabs/overthere/smb/telnet/SmbTelnetConnection.java index 67dff30d..1c3c97a3 100644 --- a/src/main/java/com/xebialabs/overthere/smb/telnet/SmbTelnetConnection.java +++ b/src/main/java/com/xebialabs/overthere/smb/telnet/SmbTelnetConnection.java @@ -56,7 +56,6 @@ public SmbTelnetConnection(String type, ConnectionOptions options, AddressPortMa @Override public void connect() { - super.connect(); connected(); } diff --git a/src/main/java/com/xebialabs/overthere/smb/winrm/SmbWinRmConnection.java b/src/main/java/com/xebialabs/overthere/smb/winrm/SmbWinRmConnection.java index b09aa90c..87bd1bd3 100644 --- a/src/main/java/com/xebialabs/overthere/smb/winrm/SmbWinRmConnection.java +++ b/src/main/java/com/xebialabs/overthere/smb/winrm/SmbWinRmConnection.java @@ -50,7 +50,6 @@ public SmbWinRmConnection(String type, ConnectionOptions options, AddressPortMap @Override public void connect() { - super.connect(); connected(); } diff --git a/src/main/java/com/xebialabs/overthere/ssh/SshSftpFile.java b/src/main/java/com/xebialabs/overthere/ssh/SshSftpFile.java index a0dbacea..87485671 100644 --- a/src/main/java/com/xebialabs/overthere/ssh/SshSftpFile.java +++ b/src/main/java/com/xebialabs/overthere/ssh/SshSftpFile.java @@ -1,21 +1,21 @@ /** * Copyright (c) 2008-2016, XebiaLabs B.V., All rights reserved. - *

    - *

    + * + * * Overthere is licensed under the terms of the GPLv2 * , like most XebiaLabs Libraries. * There are special exceptions to the terms and conditions of the GPLv2 as it is applied to * this software, see the FLOSS License Exception * . - *

    + * * This program is free software; you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Foundation; version 2 * of the License. - *

    + * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. - *

    + * * You should have received a copy of the GNU General Public License along with this * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA diff --git a/src/test/java/com/xebialabs/overthere/smb/telnet/SmbTelnetConnectionWithDomainUserItest.java b/src/test/java/com/xebialabs/overthere/smb/telnet/SmbTelnetConnectionWithDomainUserItest.java index d97948d1..44b02651 100644 --- a/src/test/java/com/xebialabs/overthere/smb/telnet/SmbTelnetConnectionWithDomainUserItest.java +++ b/src/test/java/com/xebialabs/overthere/smb/telnet/SmbTelnetConnectionWithDomainUserItest.java @@ -1,3 +1,25 @@ +/** + * Copyright (c) 2008-2016, XebiaLabs B.V., All rights reserved. + * + * + * Overthere is licensed under the terms of the GPLv2 + * , like most XebiaLabs Libraries. + * There are special exceptions to the terms and conditions of the GPLv2 as it is applied to + * this software, see the FLOSS License Exception + * . + * + * This program is free software; you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation; version 2 + * of the License. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth + * Floor, Boston, MA 02110-1301 USA + */ package com.xebialabs.overthere.smb.telnet; import com.google.common.collect.ImmutableMap; From 41c97a41943dccd795917883fa9b0b2a6e52b84e Mon Sep 17 00:00:00 2001 From: Aditya Kalia Date: Fri, 9 Sep 2016 11:41:52 +0530 Subject: [PATCH 23/40] Refactoring test cases --- ...ConnectionOverHttpWithDomainUserItest.java | 64 ------------------- 1 file changed, 64 deletions(-) delete mode 100644 src/test/java/com/xebialabs/overthere/smb/winrm/SmbWinRmConnectionOverHttpWithDomainUserItest.java diff --git a/src/test/java/com/xebialabs/overthere/smb/winrm/SmbWinRmConnectionOverHttpWithDomainUserItest.java b/src/test/java/com/xebialabs/overthere/smb/winrm/SmbWinRmConnectionOverHttpWithDomainUserItest.java deleted file mode 100644 index b8e868e4..00000000 --- a/src/test/java/com/xebialabs/overthere/smb/winrm/SmbWinRmConnectionOverHttpWithDomainUserItest.java +++ /dev/null @@ -1,64 +0,0 @@ -/** - * Copyright (c) 2008-2016, XebiaLabs B.V., All rights reserved. - * - * - * Overthere is licensed under the terms of the GPLv2 - * , like most XebiaLabs Libraries. - * There are special exceptions to the terms and conditions of the GPLv2 as it is applied to - * this software, see the FLOSS License Exception - * . - * - * This program is free software; you can redistribute it and/or modify it under the terms - * of the GNU General Public License as published by the Free Software Foundation; version 2 - * of the License. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this - * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth - * Floor, Boston, MA 02110-1301 USA - */ -package com.xebialabs.overthere.smb.winrm; - -import com.xebialabs.overthere.ConnectionOptions; -import com.xebialabs.overthere.WindowsCloudHostWithDomainListener; -import com.xebialabs.overthere.itest.OverthereConnectionItestBase; -import org.testng.annotations.Listeners; -import org.testng.annotations.Test; - -import static com.xebialabs.overthere.ConnectionOptions.*; -import static com.xebialabs.overthere.OperatingSystemFamily.WINDOWS; -import static com.xebialabs.overthere.WindowsCloudHostWithDomainListener.DOMAIN_WINDOWS_USER_PASSWORD; -import static com.xebialabs.overthere.cifs.CifsConnectionType.WINRM_INTERNAL; -import static com.xebialabs.overthere.cifs.ConnectionBuilder.CONNECTION_TYPE; -import static com.xebialabs.overthere.smb.SmbConnectionBuilder.SMB_PROTOCOL; - -@Test -@Listeners({WindowsCloudHostWithDomainListener.class}) -public class SmbWinRmConnectionOverHttpWithDomainUserItest extends OverthereConnectionItestBase { - - public static final String DOMAIN_WINDOWS_USERNAME = "itest@W2K8R2.XEBIALABS.COM"; - - @Override - protected String getProtocol() { - return SMB_PROTOCOL; - } - - @Override - protected ConnectionOptions getOptions() { - ConnectionOptions options = new ConnectionOptions(); - options.set(OPERATING_SYSTEM, WINDOWS); - options.set(CONNECTION_TYPE, WINRM_INTERNAL); - options.set(ADDRESS, WindowsCloudHostWithDomainListener.getHost().getHostName()); - options.set(USERNAME, DOMAIN_WINDOWS_USERNAME); - options.set(PASSWORD, DOMAIN_WINDOWS_USER_PASSWORD); - return options; - } - - @Override - protected String getExpectedConnectionClassName() { - return SmbWinRmConnection.class.getName(); - } -} From dfacfad8aaf2b86d7a48e69965725454492ad9dd Mon Sep 17 00:00:00 2001 From: Aditya Kalia Date: Fri, 9 Sep 2016 11:43:09 +0530 Subject: [PATCH 24/40] Refactoring test cases --- ...tConnectionWithRegularDomainUserItest.java | 47 +++++++++++++++++++ ...ttpWithAdministrativeDomainUserItest.java} | 19 +++----- 2 files changed, 54 insertions(+), 12 deletions(-) create mode 100644 src/test/java/com/xebialabs/overthere/smb/telnet/SmbTelnetConnectionWithRegularDomainUserItest.java rename src/test/java/com/xebialabs/overthere/smb/{telnet/SmbTelnetConnectionWithDomainUserItest.java => winrm/SmbWinRmConnectionOverHttpWithAdministrativeDomainUserItest.java} (76%) diff --git a/src/test/java/com/xebialabs/overthere/smb/telnet/SmbTelnetConnectionWithRegularDomainUserItest.java b/src/test/java/com/xebialabs/overthere/smb/telnet/SmbTelnetConnectionWithRegularDomainUserItest.java new file mode 100644 index 00000000..b8b978fb --- /dev/null +++ b/src/test/java/com/xebialabs/overthere/smb/telnet/SmbTelnetConnectionWithRegularDomainUserItest.java @@ -0,0 +1,47 @@ +package com.xebialabs.overthere.smb.telnet; + +import com.google.common.collect.ImmutableMap; +import com.xebialabs.overthere.ConnectionOptions; +import com.xebialabs.overthere.WindowsCloudHostWithDomainListener; +import com.xebialabs.overthere.itest.OverthereConnectionItestBase; +import org.testng.annotations.Listeners; +import org.testng.annotations.Test; + +import static com.xebialabs.overthere.ConnectionOptions.*; +import static com.xebialabs.overthere.OperatingSystemFamily.WINDOWS; +import static com.xebialabs.overthere.WindowsCloudHostWithDomainListener.DOMAIN_WINDOWS_USER_PASSWORD; +import static com.xebialabs.overthere.cifs.CifsConnectionType.TELNET; +import static com.xebialabs.overthere.cifs.ConnectionBuilder.CONNECTION_TYPE; +import static com.xebialabs.overthere.cifs.ConnectionBuilder.PATH_SHARE_MAPPINGS; +import static com.xebialabs.overthere.smb.SmbConnectionBuilder.SMB_PROTOCOL; + +@Test +@Listeners({WindowsCloudHostWithDomainListener.class}) +public class SmbTelnetConnectionWithRegularDomainUserItest extends OverthereConnectionItestBase { + + public static final String WINDOWS_USERNAME = "W2K8R2\\itest"; + + @Override + protected String getProtocol() { + return SMB_PROTOCOL; + } + + @Override + protected ConnectionOptions getOptions() { + ConnectionOptions options = new ConnectionOptions(); + options.set(OPERATING_SYSTEM, WINDOWS); + options.set(CONNECTION_TYPE, TELNET); + options.set(ADDRESS, WindowsCloudHostWithDomainListener.getHost().getHostName()); + options.set(USERNAME, WINDOWS_USERNAME); + options.set(PASSWORD, DOMAIN_WINDOWS_USER_PASSWORD); + options.set(TEMPORARY_DIRECTORY_PATH, "C:\\overthere\\temp"); + options.set(PATH_SHARE_MAPPINGS, ImmutableMap.of("C:\\overthere", "sharethere")); + return options; + } + + @Override + protected String getExpectedConnectionClassName() { + return SmbTelnetConnection.class.getName(); + } + +} diff --git a/src/test/java/com/xebialabs/overthere/smb/telnet/SmbTelnetConnectionWithDomainUserItest.java b/src/test/java/com/xebialabs/overthere/smb/winrm/SmbWinRmConnectionOverHttpWithAdministrativeDomainUserItest.java similarity index 76% rename from src/test/java/com/xebialabs/overthere/smb/telnet/SmbTelnetConnectionWithDomainUserItest.java rename to src/test/java/com/xebialabs/overthere/smb/winrm/SmbWinRmConnectionOverHttpWithAdministrativeDomainUserItest.java index 44b02651..45dcdc5e 100644 --- a/src/test/java/com/xebialabs/overthere/smb/telnet/SmbTelnetConnectionWithDomainUserItest.java +++ b/src/test/java/com/xebialabs/overthere/smb/winrm/SmbWinRmConnectionOverHttpWithAdministrativeDomainUserItest.java @@ -20,9 +20,8 @@ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA */ -package com.xebialabs.overthere.smb.telnet; +package com.xebialabs.overthere.smb.winrm; -import com.google.common.collect.ImmutableMap; import com.xebialabs.overthere.ConnectionOptions; import com.xebialabs.overthere.WindowsCloudHostWithDomainListener; import com.xebialabs.overthere.itest.OverthereConnectionItestBase; @@ -32,16 +31,15 @@ import static com.xebialabs.overthere.ConnectionOptions.*; import static com.xebialabs.overthere.OperatingSystemFamily.WINDOWS; import static com.xebialabs.overthere.WindowsCloudHostWithDomainListener.DOMAIN_WINDOWS_USER_PASSWORD; -import static com.xebialabs.overthere.cifs.CifsConnectionType.TELNET; +import static com.xebialabs.overthere.cifs.CifsConnectionType.WINRM_INTERNAL; import static com.xebialabs.overthere.cifs.ConnectionBuilder.CONNECTION_TYPE; -import static com.xebialabs.overthere.cifs.ConnectionBuilder.PATH_SHARE_MAPPINGS; import static com.xebialabs.overthere.smb.SmbConnectionBuilder.SMB_PROTOCOL; @Test @Listeners({WindowsCloudHostWithDomainListener.class}) -public class SmbTelnetConnectionWithDomainUserItest extends OverthereConnectionItestBase { +public class SmbWinRmConnectionOverHttpWithAdministrativeDomainUserItest extends OverthereConnectionItestBase { - public static final String WINDOWS_USERNAME = "W2K8R2\\itest"; + public static final String DOMAIN_WINDOWS_USERNAME = "itest@W2K8R2.XEBIALABS.COM"; @Override protected String getProtocol() { @@ -52,18 +50,15 @@ protected String getProtocol() { protected ConnectionOptions getOptions() { ConnectionOptions options = new ConnectionOptions(); options.set(OPERATING_SYSTEM, WINDOWS); - options.set(CONNECTION_TYPE, TELNET); + options.set(CONNECTION_TYPE, WINRM_INTERNAL); options.set(ADDRESS, WindowsCloudHostWithDomainListener.getHost().getHostName()); - options.set(USERNAME, WINDOWS_USERNAME); + options.set(USERNAME, DOMAIN_WINDOWS_USERNAME); options.set(PASSWORD, DOMAIN_WINDOWS_USER_PASSWORD); - options.set(TEMPORARY_DIRECTORY_PATH, "C:\\overthere\\temp"); - options.set(PATH_SHARE_MAPPINGS, ImmutableMap.of("C:\\overthere", "sharethere")); return options; } @Override protected String getExpectedConnectionClassName() { - return SmbTelnetConnection.class.getName(); + return SmbWinRmConnection.class.getName(); } - } From 5b6b1ed740b9ce0c271ff42f4aa16b80e2feb0ec Mon Sep 17 00:00:00 2001 From: Sameer Arora Date: Fri, 9 Sep 2016 13:21:07 +0530 Subject: [PATCH 25/40] DEPL-10110 fixed getFile to create a connection lazily at the time of file transfer --- .../overthere/smb/SmbConnection.java | 21 ++++++++++++------- .../com/xebialabs/overthere/smb/SmbFile.java | 1 - 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/xebialabs/overthere/smb/SmbConnection.java b/src/main/java/com/xebialabs/overthere/smb/SmbConnection.java index 8587f34f..f11e5525 100644 --- a/src/main/java/com/xebialabs/overthere/smb/SmbConnection.java +++ b/src/main/java/com/xebialabs/overthere/smb/SmbConnection.java @@ -1,21 +1,21 @@ /** * Copyright (c) 2008-2016, XebiaLabs B.V., All rights reserved. - * - * + *

    + *

    * Overthere is licensed under the terms of the GPLv2 * , like most XebiaLabs Libraries. * There are special exceptions to the terms and conditions of the GPLv2 as it is applied to * this software, see the FLOSS License Exception * . - * + *

    * This program is free software; you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Foundation; version 2 * of the License. - * + *

    * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. - * + *

    * You should have received a copy of the GNU General Public License along with this * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA @@ -94,6 +94,11 @@ protected SmbConnection(String protocol, ConnectionOptions options, AddressPortM } public void connect() { + createConnection(); + connected(); + } + + private void createConnection() { try { UserAndDomain ud = getUserNameAndDomain(username); String user = ud.getUsername(); @@ -106,7 +111,6 @@ public void connect() { } catch (NtlmException e) { throw new RuntimeIOException(e); } - connected(); } @Override @@ -118,6 +122,9 @@ public OverthereFile getFile(String hostPath) { @Override public OverthereFile getFile(OverthereFile parent, String child) { + if (connection == null) { + createConnection(); + } return parent.getFile(child); } @@ -133,7 +140,7 @@ protected void doClose() { } finally { shareCache.clear(); try { - if(session!=null) { + if (session != null) { session.close(); } } catch (IOException e) { diff --git a/src/main/java/com/xebialabs/overthere/smb/SmbFile.java b/src/main/java/com/xebialabs/overthere/smb/SmbFile.java index d6e99cc1..e7484d38 100644 --- a/src/main/java/com/xebialabs/overthere/smb/SmbFile.java +++ b/src/main/java/com/xebialabs/overthere/smb/SmbFile.java @@ -23,7 +23,6 @@ package com.xebialabs.overthere.smb; import com.hierynomus.msdtyp.AccessMask; -import com.hierynomus.msdtyp.SID; import com.hierynomus.msdtyp.SecurityDescriptor; import com.hierynomus.msdtyp.SecurityInformation; import com.hierynomus.msdtyp.ace.ACE; From f643c28e2178746544aef2339be026dc66ab385e Mon Sep 17 00:00:00 2001 From: Sameer Arora Date: Tue, 13 Sep 2016 18:24:07 +0530 Subject: [PATCH 26/40] DEPL-10110 fixed checkAccessMask and file close on share. --- .../com/xebialabs/overthere/smb/SmbFile.java | 58 ++++++++++--------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/xebialabs/overthere/smb/SmbFile.java b/src/main/java/com/xebialabs/overthere/smb/SmbFile.java index e7484d38..7b911bb3 100644 --- a/src/main/java/com/xebialabs/overthere/smb/SmbFile.java +++ b/src/main/java/com/xebialabs/overthere/smb/SmbFile.java @@ -1,21 +1,21 @@ /** * Copyright (c) 2008-2016, XebiaLabs B.V., All rights reserved. - * - * + *

    + *

    * Overthere is licensed under the terms of the GPLv2 * , like most XebiaLabs Libraries. * There are special exceptions to the terms and conditions of the GPLv2 as it is applied to * this software, see the FLOSS License Exception * . - * + *

    * This program is free software; you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Foundation; version 2 * of the License. - * + *

    * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. - * + *

    * You should have received a copy of the GNU General Public License along with this * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA @@ -23,10 +23,6 @@ package com.xebialabs.overthere.smb; import com.hierynomus.msdtyp.AccessMask; -import com.hierynomus.msdtyp.SecurityDescriptor; -import com.hierynomus.msdtyp.SecurityInformation; -import com.hierynomus.msdtyp.ace.ACE; -import com.hierynomus.msdtyp.ace.AceType; import com.hierynomus.mserref.NtStatus; import com.hierynomus.msfscc.FileAttributes; import com.hierynomus.msfscc.fileinformation.FileInfo; @@ -50,8 +46,6 @@ import java.util.Map; import static com.hierynomus.msdtyp.AccessMask.FILE_READ_DATA; -import static com.hierynomus.msdtyp.AccessMask.FILE_WRITE_DATA; -import static com.hierynomus.msdtyp.ace.AceType.ACCESS_ALLOWED_ACE_TYPE; import static java.lang.String.format; public class SmbFile extends BaseOverthereFile { @@ -102,7 +96,7 @@ public boolean canRead() { @Override public boolean canWrite() { - return checkAccessMask(FILE_WRITE_DATA); + return checkAccessMask(AccessMask.FILE_WRITE_DATA); } @Override @@ -183,7 +177,7 @@ public long skip(long n) throws IOException { public void close() throws IOException { logger.debug("Closing SMB input stream for {}", getSharePath()); wrapped.close(); - file.close(); + getShare().close(file.getFileId()); } }); } catch (TransportException e) { @@ -228,7 +222,7 @@ public void flush() throws IOException { public void close() throws IOException { logger.debug("Closing SMB output stream for {}", getSharePath()); wrapped.close(); - file.close(); + getShare().close(file.getFileId()); } }); } catch (TransportException e) { @@ -342,22 +336,32 @@ public String toString() { } private boolean checkAccessMask(AccessMask mask) { + File file = null; try { - SecurityDescriptor securityInfo = getShare(). - getSecurityInfo(getPathOnShare(), EnumSet.of(SecurityInformation.OWNER_SECURITY_INFORMATION, - SecurityInformation.GROUP_SECURITY_INFORMATION, SecurityInformation.DACL_SECURITY_INFORMATION)); - String ownerSid = securityInfo.getOwnerSid().toString(); - for (ACE ace : securityInfo.getDacl().getAces()) { - String aceSid = ace.getSid().toString(); - AceType aceType = ace.getAceHeader().getAceType(); - if (aceSid.equals(ownerSid) && aceType.equals(ACCESS_ALLOWED_ACE_TYPE)) { - return AccessMask.EnumUtils.isSet(ace.getAccessMask(), mask); - } - } + file = getShare().openFile(getPathOnShare(), EnumSet.of(mask), SMB2CreateDisposition.FILE_OPEN); + return file !=null; + } catch (TransportException e) { + throw new IllegalStateException("Exception occurred while trying to determine permissions on file", e); + } catch (SMBApiException e) { + return checkPermissions(e); + } finally { + close(file); + } + } + + private boolean checkPermissions(SMBApiException e) { + if (e.getStatus().equals(NtStatus.STATUS_ACCESS_DENIED)) { + return false; + } + throw new IllegalStateException("Exception occurred while trying to determine permissions on file", e); + } + + private void close(File file) { + try { + getShare().close(file.getFileId()); } catch (TransportException e) { - throw new IllegalStateException("Exception Occured while trying to query security information!"); + throw new IllegalStateException("Exception occured while trying to determine permissions on file", e); } - return false; } private String getSharePath() { From 8a3569971af7547c88623e5ed3ceda3fb2056a12 Mon Sep 17 00:00:00 2001 From: Aditya Kalia Date: Thu, 15 Sep 2016 11:28:55 +0530 Subject: [PATCH 27/40] Fixing headers --- build.gradle | 2 +- libs/smbj-0.0.4-dev.jar | Bin 245490 -> 0 bytes .../overthere/smb/SmbConnection.java | 10 ++++---- .../com/xebialabs/overthere/smb/SmbFile.java | 10 ++++---- ...tConnectionWithRegularDomainUserItest.java | 22 ++++++++++++++++++ 5 files changed, 33 insertions(+), 11 deletions(-) delete mode 100644 libs/smbj-0.0.4-dev.jar diff --git a/build.gradle b/build.gradle index 88c66ca3..5632d5e1 100644 --- a/build.gradle +++ b/build.gradle @@ -61,7 +61,7 @@ dependencies { compile 'jcifs:jcifs:1.3.17' // SMB2/3 - compile files('libs/smbj-0.0.4-dev.jar') + compile 'com.hierynomus:smbj:0.0.4' compile 'net.engio:mbassador:1.2.4.2' compile "org.bouncycastle:bcprov-jdk15on:1.54" compile "org.bouncycastle:bcpkix-jdk15on:1.54" diff --git a/libs/smbj-0.0.4-dev.jar b/libs/smbj-0.0.4-dev.jar deleted file mode 100644 index 4489c9dc68c75449b12c61a7ffee5f255db8b2e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 245490 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

    >c?MyqW9LmGJ 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

    5+`ap*Tx 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 z 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 dHf7+b8yAZwbU;Rj+aK^xV - *

    + * + * * Overthere is licensed under the terms of the GPLv2 * , like most XebiaLabs Libraries. * There are special exceptions to the terms and conditions of the GPLv2 as it is applied to * this software, see the FLOSS License Exception * . - *

    + * * This program is free software; you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Foundation; version 2 * of the License. - *

    + * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. - *

    + * * You should have received a copy of the GNU General Public License along with this * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA diff --git a/src/main/java/com/xebialabs/overthere/smb/SmbFile.java b/src/main/java/com/xebialabs/overthere/smb/SmbFile.java index 7b911bb3..a58a7fd2 100644 --- a/src/main/java/com/xebialabs/overthere/smb/SmbFile.java +++ b/src/main/java/com/xebialabs/overthere/smb/SmbFile.java @@ -1,21 +1,21 @@ /** * Copyright (c) 2008-2016, XebiaLabs B.V., All rights reserved. - *

    - *

    + * + * * Overthere is licensed under the terms of the GPLv2 * , like most XebiaLabs Libraries. * There are special exceptions to the terms and conditions of the GPLv2 as it is applied to * this software, see the FLOSS License Exception * . - *

    + * * This program is free software; you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Foundation; version 2 * of the License. - *

    + * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. - *

    + * * You should have received a copy of the GNU General Public License along with this * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA diff --git a/src/test/java/com/xebialabs/overthere/smb/telnet/SmbTelnetConnectionWithRegularDomainUserItest.java b/src/test/java/com/xebialabs/overthere/smb/telnet/SmbTelnetConnectionWithRegularDomainUserItest.java index b8b978fb..e81d36ff 100644 --- a/src/test/java/com/xebialabs/overthere/smb/telnet/SmbTelnetConnectionWithRegularDomainUserItest.java +++ b/src/test/java/com/xebialabs/overthere/smb/telnet/SmbTelnetConnectionWithRegularDomainUserItest.java @@ -1,3 +1,25 @@ +/** + * Copyright (c) 2008-2016, XebiaLabs B.V., All rights reserved. + * + * + * Overthere is licensed under the terms of the GPLv2 + * , like most XebiaLabs Libraries. + * There are special exceptions to the terms and conditions of the GPLv2 as it is applied to + * this software, see the FLOSS License Exception + * . + * + * This program is free software; you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation; version 2 + * of the License. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth + * Floor, Boston, MA 02110-1301 USA + */ package com.xebialabs.overthere.smb.telnet; import com.google.common.collect.ImmutableMap; From d0be4e29164186183210ffe31383e03c2e764bbc Mon Sep 17 00:00:00 2001 From: Aditya Kalia Date: Thu, 15 Sep 2016 17:11:21 +0530 Subject: [PATCH 28/40] Updating implementation for canRead, canWrite --- .../com/xebialabs/overthere/smb/SmbFile.java | 39 +++---------------- 1 file changed, 6 insertions(+), 33 deletions(-) diff --git a/src/main/java/com/xebialabs/overthere/smb/SmbFile.java b/src/main/java/com/xebialabs/overthere/smb/SmbFile.java index a58a7fd2..732a542a 100644 --- a/src/main/java/com/xebialabs/overthere/smb/SmbFile.java +++ b/src/main/java/com/xebialabs/overthere/smb/SmbFile.java @@ -45,7 +45,6 @@ import java.util.List; import java.util.Map; -import static com.hierynomus.msdtyp.AccessMask.FILE_READ_DATA; import static java.lang.String.format; public class SmbFile extends BaseOverthereFile { @@ -91,17 +90,20 @@ public boolean exists() { @Override public boolean canRead() { - return checkAccessMask(FILE_READ_DATA); + logger.debug("Checking whether {} can be read", this.getPath()); + return getShare().checkAccessMask(AccessMask.FILE_READ_DATA, getPathOnShare()); } @Override public boolean canWrite() { - return checkAccessMask(AccessMask.FILE_WRITE_DATA); + logger.debug("Checking whether {} can be write", this.getPath()); + return getShare().checkAccessMask(AccessMask.FILE_WRITE_DATA, getPathOnShare()); } @Override public boolean canExecute() { - return checkAccessMask(FILE_READ_DATA); + logger.debug("Checking whether {} can execute", this.getPath()); + return getShare().checkAccessMask(AccessMask.FILE_READ_DATA, getPathOnShare()); } @Override @@ -335,35 +337,6 @@ public String toString() { return getConnection() + "/" + getPath(); } - private boolean checkAccessMask(AccessMask mask) { - File file = null; - try { - file = getShare().openFile(getPathOnShare(), EnumSet.of(mask), SMB2CreateDisposition.FILE_OPEN); - return file !=null; - } catch (TransportException e) { - throw new IllegalStateException("Exception occurred while trying to determine permissions on file", e); - } catch (SMBApiException e) { - return checkPermissions(e); - } finally { - close(file); - } - } - - private boolean checkPermissions(SMBApiException e) { - if (e.getStatus().equals(NtStatus.STATUS_ACCESS_DENIED)) { - return false; - } - throw new IllegalStateException("Exception occurred while trying to determine permissions on file", e); - } - - private void close(File file) { - try { - getShare().close(file.getFileId()); - } catch (TransportException e) { - throw new IllegalStateException("Exception occured while trying to determine permissions on file", e); - } - } - private String getSharePath() { return SmbPaths.getSharePath(hostPath, pathMappings); } From 95766635b41607a7e92121cff424df6416a80784 Mon Sep 17 00:00:00 2001 From: Aditya Kalia Date: Thu, 15 Sep 2016 18:20:09 +0530 Subject: [PATCH 29/40] Running tests selectively --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 5632d5e1..055476df 100644 --- a/build.gradle +++ b/build.gradle @@ -124,7 +124,7 @@ test { task itest(type: Test) { useTestNG() - includes = ['**/*Itest.*', '**/LocalConnectionTest.*'] + includes = ['**/*Itest.shouldCreateWriteReadAndRemoveTemporaryFile'] reports.junitXml.destination = file("${buildDir}/itest-results") reports.html.destination = file("${buildDir}/reports/itests") From 2d985195dd8792a28c16fee21bb0c05f4fbd7a63 Mon Sep 17 00:00:00 2001 From: Aditya Kalia Date: Thu, 15 Sep 2016 18:33:16 +0530 Subject: [PATCH 30/40] Running tests selectively --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 055476df..a25a1691 100644 --- a/build.gradle +++ b/build.gradle @@ -124,7 +124,7 @@ test { task itest(type: Test) { useTestNG() - includes = ['**/*Itest.shouldCreateWriteReadAndRemoveTemporaryFile'] + includes = ['**/*Itest*.shouldCreateWriteReadAndRemoveTemporaryFile'] reports.junitXml.destination = file("${buildDir}/itest-results") reports.html.destination = file("${buildDir}/reports/itests") From 5e4e06d71092fe497092021b1a04fbb470cf2a5b Mon Sep 17 00:00:00 2001 From: Aditya Kalia Date: Thu, 15 Sep 2016 18:44:34 +0530 Subject: [PATCH 31/40] Running smb tests only --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index a25a1691..8b1db4cd 100644 --- a/build.gradle +++ b/build.gradle @@ -61,7 +61,7 @@ dependencies { compile 'jcifs:jcifs:1.3.17' // SMB2/3 - compile 'com.hierynomus:smbj:0.0.4' + compile files('libs/smbj-0.0.4-dev.jar') compile 'net.engio:mbassador:1.2.4.2' compile "org.bouncycastle:bcprov-jdk15on:1.54" compile "org.bouncycastle:bcpkix-jdk15on:1.54" @@ -124,7 +124,7 @@ test { task itest(type: Test) { useTestNG() - includes = ['**/*Itest*.shouldCreateWriteReadAndRemoveTemporaryFile'] + includes = ['**/SmbTelnetConnectionWithAdministrativeUserItest.*'] reports.junitXml.destination = file("${buildDir}/itest-results") reports.html.destination = file("${buildDir}/reports/itests") From 0e823259f17585480844f801ac8cfbff7cafd7fc Mon Sep 17 00:00:00 2001 From: Aditya Kalia Date: Thu, 15 Sep 2016 18:58:44 +0530 Subject: [PATCH 32/40] wip --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 8b1db4cd..f56fbcc9 100644 --- a/build.gradle +++ b/build.gradle @@ -124,7 +124,7 @@ test { task itest(type: Test) { useTestNG() - includes = ['**/SmbTelnetConnectionWithAdministrativeUserItest.*'] + includes = ['**/SmbTelnetConnectionWithAdministrativeUserItest.*shouldCreateWriteReadAndRemoveTemporaryFile*'] reports.junitXml.destination = file("${buildDir}/itest-results") reports.html.destination = file("${buildDir}/reports/itests") From 68d15829ba2586d75b77b2375a012037fe7fe562 Mon Sep 17 00:00:00 2001 From: Aditya Kalia Date: Thu, 15 Sep 2016 19:03:31 +0530 Subject: [PATCH 33/40] wip --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index f56fbcc9..cd92f622 100644 --- a/build.gradle +++ b/build.gradle @@ -124,7 +124,7 @@ test { task itest(type: Test) { useTestNG() - includes = ['**/SmbTelnetConnectionWithAdministrativeUserItest.*shouldCreateWriteReadAndRemoveTemporaryFile*'] + includes = ['**/SmbTelnetConnectionWithAdministrativeUserItest.shouldCreateWriteReadAndRemoveTemporaryFile*'] reports.junitXml.destination = file("${buildDir}/itest-results") reports.html.destination = file("${buildDir}/reports/itests") From 6421d78b1377c79bfd815f0f61262b53ddb9b417 Mon Sep 17 00:00:00 2001 From: Aditya Kalia Date: Thu, 15 Sep 2016 19:59:28 +0530 Subject: [PATCH 34/40] wip --- build.gradle | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index cd92f622..e1289e66 100644 --- a/build.gradle +++ b/build.gradle @@ -61,7 +61,7 @@ dependencies { compile 'jcifs:jcifs:1.3.17' // SMB2/3 - compile files('libs/smbj-0.0.4-dev.jar') + compile 'com.hierynomus:smbj:0.0.4' compile 'net.engio:mbassador:1.2.4.2' compile "org.bouncycastle:bcprov-jdk15on:1.54" compile "org.bouncycastle:bcpkix-jdk15on:1.54" @@ -124,7 +124,8 @@ test { task itest(type: Test) { useTestNG() - includes = ['**/SmbTelnetConnectionWithAdministrativeUserItest.shouldCreateWriteReadAndRemoveTemporaryFile*'] + //includes = ['**/*Itest.*', '**/LocalConnectionTest.*'] + includes = ['**/SmbTelnetConnectionWithAdministrativeUserTempItest.*'] reports.junitXml.destination = file("${buildDir}/itest-results") reports.html.destination = file("${buildDir}/reports/itests") From ce59b396380ac424d4c5cd29186edc83d6542ddc Mon Sep 17 00:00:00 2001 From: Aditya Kalia Date: Thu, 15 Sep 2016 20:08:17 +0530 Subject: [PATCH 35/40] wip --- build.gradle | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index e1289e66..5632d5e1 100644 --- a/build.gradle +++ b/build.gradle @@ -124,8 +124,7 @@ test { task itest(type: Test) { useTestNG() - //includes = ['**/*Itest.*', '**/LocalConnectionTest.*'] - includes = ['**/SmbTelnetConnectionWithAdministrativeUserTempItest.*'] + includes = ['**/*Itest.*', '**/LocalConnectionTest.*'] reports.junitXml.destination = file("${buildDir}/itest-results") reports.html.destination = file("${buildDir}/reports/itests") From 01f64fa515eb29d3b8a86ca3e83c43dc0af02829 Mon Sep 17 00:00:00 2001 From: Aditya Kalia Date: Fri, 16 Sep 2016 06:53:12 +0530 Subject: [PATCH 36/40] wip --- src/main/java/com/xebialabs/overthere/smb/SmbFile.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/main/java/com/xebialabs/overthere/smb/SmbFile.java b/src/main/java/com/xebialabs/overthere/smb/SmbFile.java index 732a542a..12d785fd 100644 --- a/src/main/java/com/xebialabs/overthere/smb/SmbFile.java +++ b/src/main/java/com/xebialabs/overthere/smb/SmbFile.java @@ -215,11 +215,6 @@ public void write(byte[] b) throws IOException { wrapped.write(b); } - @Override - public void flush() throws IOException { - wrapped.flush(); - } - @Override public void close() throws IOException { logger.debug("Closing SMB output stream for {}", getSharePath()); From e4f104712a813ac5970c86c3a95ecb363ee9f09c Mon Sep 17 00:00:00 2001 From: Aditya Kalia Date: Sun, 18 Sep 2016 12:52:05 +0530 Subject: [PATCH 37/40] Fixing winrm domain controller config for tests --- ...HttpWithAdministrativeDomainUserItest.java | 24 +++++++++++++++++++ src/test/resources/winrm/conf/krb5.conf | 7 ++++++ 2 files changed, 31 insertions(+) create mode 100644 src/test/resources/winrm/conf/krb5.conf diff --git a/src/test/java/com/xebialabs/overthere/smb/winrm/SmbWinRmConnectionOverHttpWithAdministrativeDomainUserItest.java b/src/test/java/com/xebialabs/overthere/smb/winrm/SmbWinRmConnectionOverHttpWithAdministrativeDomainUserItest.java index 45dcdc5e..652b607c 100644 --- a/src/test/java/com/xebialabs/overthere/smb/winrm/SmbWinRmConnectionOverHttpWithAdministrativeDomainUserItest.java +++ b/src/test/java/com/xebialabs/overthere/smb/winrm/SmbWinRmConnectionOverHttpWithAdministrativeDomainUserItest.java @@ -22,12 +22,19 @@ */ package com.xebialabs.overthere.smb.winrm; +import com.google.common.io.Resources; import com.xebialabs.overthere.ConnectionOptions; import com.xebialabs.overthere.WindowsCloudHostWithDomainListener; import com.xebialabs.overthere.itest.OverthereConnectionItestBase; import org.testng.annotations.Listeners; import org.testng.annotations.Test; +import java.io.File; +import java.io.IOException; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.StandardCopyOption; + import static com.xebialabs.overthere.ConnectionOptions.*; import static com.xebialabs.overthere.OperatingSystemFamily.WINDOWS; import static com.xebialabs.overthere.WindowsCloudHostWithDomainListener.DOMAIN_WINDOWS_USER_PASSWORD; @@ -41,6 +48,10 @@ public class SmbWinRmConnectionOverHttpWithAdministrativeDomainUserItest extends public static final String DOMAIN_WINDOWS_USERNAME = "itest@W2K8R2.XEBIALABS.COM"; + public SmbWinRmConnectionOverHttpWithAdministrativeDomainUserItest() { + System.setProperty("java.security.krb5.conf", getConfigFilePath()); + } + @Override protected String getProtocol() { return SMB_PROTOCOL; @@ -57,6 +68,19 @@ protected ConnectionOptions getOptions() { return options; } + private String getConfigFilePath() { + URL url = Resources.getResource("winrm/conf/krb5.conf"); + File tempFile; + try { + tempFile = File.createTempFile("krb5", ".conf"); + Files.copy(url.openStream(), tempFile.toPath(), StandardCopyOption.REPLACE_EXISTING); + } catch (IOException e) { + throw new RuntimeException("Unable to create krb5.conf file"); + } + tempFile.deleteOnExit(); + return tempFile.getAbsolutePath(); + } + @Override protected String getExpectedConnectionClassName() { return SmbWinRmConnection.class.getName(); diff --git a/src/test/resources/winrm/conf/krb5.conf b/src/test/resources/winrm/conf/krb5.conf new file mode 100644 index 00000000..bd990d77 --- /dev/null +++ b/src/test/resources/winrm/conf/krb5.conf @@ -0,0 +1,7 @@ +[libdefaults] +default_realm = W2K8R2.XEBIALABS.COM + +[realms] +W2K8R2.XEBIALABS.COM = { + kdc = w2k8r2-dc.xebialabs.com +} From 6170e1b4a9177129f9898635fd1fd9d77842cd19 Mon Sep 17 00:00:00 2001 From: Aditya Kalia Date: Sun, 18 Sep 2016 16:35:40 +0530 Subject: [PATCH 38/40] fixing build --- .../com/xebialabs/overthere/smb/SmbConnection.java | 13 +++++-------- .../overthere/smb/telnet/SmbTelnetConnection.java | 1 + .../overthere/smb/winrm/SmbWinRmConnection.java | 1 + 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/xebialabs/overthere/smb/SmbConnection.java b/src/main/java/com/xebialabs/overthere/smb/SmbConnection.java index a9cdbdec..7c06d48f 100644 --- a/src/main/java/com/xebialabs/overthere/smb/SmbConnection.java +++ b/src/main/java/com/xebialabs/overthere/smb/SmbConnection.java @@ -1,21 +1,21 @@ /** * Copyright (c) 2008-2016, XebiaLabs B.V., All rights reserved. - * - * + *

    + *

    * Overthere is licensed under the terms of the GPLv2 * , like most XebiaLabs Libraries. * There are special exceptions to the terms and conditions of the GPLv2 as it is applied to * this software, see the FLOSS License Exception * . - * + *

    * This program is free software; you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Foundation; version 2 * of the License. - * + *

    * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. - * + *

    * You should have received a copy of the GNU General Public License along with this * program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth * Floor, Boston, MA 02110-1301 USA @@ -122,9 +122,6 @@ public OverthereFile getFile(String hostPath) { @Override public OverthereFile getFile(OverthereFile parent, String child) { - if (connection == null) { - createConnection(); - } return parent.getFile(child); } diff --git a/src/main/java/com/xebialabs/overthere/smb/telnet/SmbTelnetConnection.java b/src/main/java/com/xebialabs/overthere/smb/telnet/SmbTelnetConnection.java index 1c3c97a3..67dff30d 100644 --- a/src/main/java/com/xebialabs/overthere/smb/telnet/SmbTelnetConnection.java +++ b/src/main/java/com/xebialabs/overthere/smb/telnet/SmbTelnetConnection.java @@ -56,6 +56,7 @@ public SmbTelnetConnection(String type, ConnectionOptions options, AddressPortMa @Override public void connect() { + super.connect(); connected(); } diff --git a/src/main/java/com/xebialabs/overthere/smb/winrm/SmbWinRmConnection.java b/src/main/java/com/xebialabs/overthere/smb/winrm/SmbWinRmConnection.java index 87bd1bd3..b09aa90c 100644 --- a/src/main/java/com/xebialabs/overthere/smb/winrm/SmbWinRmConnection.java +++ b/src/main/java/com/xebialabs/overthere/smb/winrm/SmbWinRmConnection.java @@ -50,6 +50,7 @@ public SmbWinRmConnection(String type, ConnectionOptions options, AddressPortMap @Override public void connect() { + super.connect(); connected(); } From 567aacdb566ac2ed94939e0e7a49a9a8834d4926 Mon Sep 17 00:00:00 2001 From: Aditya Kalia Date: Mon, 19 Sep 2016 12:37:28 +0530 Subject: [PATCH 39/40] Re-implementing flush method for Output stream --- src/main/java/com/xebialabs/overthere/smb/SmbFile.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/com/xebialabs/overthere/smb/SmbFile.java b/src/main/java/com/xebialabs/overthere/smb/SmbFile.java index 12d785fd..732a542a 100644 --- a/src/main/java/com/xebialabs/overthere/smb/SmbFile.java +++ b/src/main/java/com/xebialabs/overthere/smb/SmbFile.java @@ -215,6 +215,11 @@ public void write(byte[] b) throws IOException { wrapped.write(b); } + @Override + public void flush() throws IOException { + wrapped.flush(); + } + @Override public void close() throws IOException { logger.debug("Closing SMB output stream for {}", getSharePath()); From 5e03e1d79f7ff95ff049cd5f54acd78dc0679f3b Mon Sep 17 00:00:00 2001 From: Aditya Kalia Date: Mon, 19 Sep 2016 14:20:44 +0530 Subject: [PATCH 40/40] Updating smbj version --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 5632d5e1..f4d4422e 100644 --- a/build.gradle +++ b/build.gradle @@ -61,7 +61,7 @@ dependencies { compile 'jcifs:jcifs:1.3.17' // SMB2/3 - compile 'com.hierynomus:smbj:0.0.4' + compile 'com.hierynomus:smbj:0.0.5' compile 'net.engio:mbassador:1.2.4.2' compile "org.bouncycastle:bcprov-jdk15on:1.54" compile "org.bouncycastle:bcpkix-jdk15on:1.54"