From a93465a3d8e686f2e463a519d96d0a626ce83577 Mon Sep 17 00:00:00 2001 From: Lucas Welscher Date: Mon, 5 Aug 2024 21:56:26 +0200 Subject: [PATCH] `Development`: Fix running server tests on Windows --- .../icl/ssh/MultipleHostKeyProvider.java | 23 +++++------ .../artemis/config/icl/ssh/SshGitCommand.java | 41 ++++++++++--------- .../buildagent/BuildAgentSshKeyService.java | 7 +++- 3 files changed, 38 insertions(+), 33 deletions(-) diff --git a/src/main/java/de/tum/in/www1/artemis/config/icl/ssh/MultipleHostKeyProvider.java b/src/main/java/de/tum/in/www1/artemis/config/icl/ssh/MultipleHostKeyProvider.java index 4545d106efd1..2fac32c26c4f 100644 --- a/src/main/java/de/tum/in/www1/artemis/config/icl/ssh/MultipleHostKeyProvider.java +++ b/src/main/java/de/tum/in/www1/artemis/config/icl/ssh/MultipleHostKeyProvider.java @@ -7,6 +7,7 @@ import java.security.KeyPair; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import org.apache.sshd.common.NamedResource; import org.apache.sshd.common.session.SessionContext; @@ -45,20 +46,18 @@ public synchronized List loadKeys(SessionContext session) { var keys = new ArrayList(); try (var stream = Files.list(path)) { - stream.forEach(file -> { - if (file != null) { - try { - // Read a single key pair in the directory - Iterable ids = readKeyPairs(session, file, IoUtils.EMPTY_OPEN_OPTIONS); - KeyPair kp = GenericUtils.head(ids); - if (kp != null) { - keys.addAll(Lists.newArrayList(ids)); - } - } - catch (Exception e) { - warn("resolveKeyPair({}) Failed ({}) to load: {}", file, e.getClass().getSimpleName(), e.getMessage(), e); + stream.filter(Objects::nonNull).forEach(file -> { + try { + // Read a single key pair in the directory + Iterable ids = readKeyPairs(session, file, IoUtils.EMPTY_OPEN_OPTIONS); + KeyPair kp = GenericUtils.head(ids); + if (kp != null) { + keys.addAll(Lists.newArrayList(ids)); } } + catch (Exception e) { + warn("resolveKeyPair({}) Failed ({}) to load: {}", file, e.getClass().getSimpleName(), e.getMessage(), e); + } }); } catch (IOException e) { diff --git a/src/main/java/de/tum/in/www1/artemis/config/icl/ssh/SshGitCommand.java b/src/main/java/de/tum/in/www1/artemis/config/icl/ssh/SshGitCommand.java index 31053931a149..4d650d29c7af 100644 --- a/src/main/java/de/tum/in/www1/artemis/config/icl/ssh/SshGitCommand.java +++ b/src/main/java/de/tum/in/www1/artemis/config/icl/ssh/SshGitCommand.java @@ -72,28 +72,29 @@ public void run() { Path rootDir = resolveRootDirectory(command, args); RepositoryCache.FileKey key = RepositoryCache.FileKey.lenient(rootDir.toFile(), FS.DETECTED); - Repository repository = key.open(true /* must exist */); - User user = getServerSession().getAttribute(SshConstants.USER_KEY); + try (Repository repository = key.open(true /* must exist */)) { + User user = getServerSession().getAttribute(SshConstants.USER_KEY); - String subCommand = args[0]; - if (RemoteConfig.DEFAULT_UPLOAD_PACK.equals(subCommand)) { - UploadPack uploadPack = new UploadPack(repository); - Environment environment = getEnvironment(); - Map envVars = environment.getEnv(); - String protocol = MapEntryUtils.isEmpty(envVars) ? null : envVars.get(GitProtocolConstants.PROTOCOL_ENVIRONMENT_VARIABLE); - if (GenericUtils.isNotBlank(protocol)) { - uploadPack.setExtraParameters(Collections.singleton(protocol)); + String subCommand = args[0]; + if (RemoteConfig.DEFAULT_UPLOAD_PACK.equals(subCommand)) { + UploadPack uploadPack = new UploadPack(repository); + Environment environment = getEnvironment(); + Map envVars = environment.getEnv(); + String protocol = MapEntryUtils.isEmpty(envVars) ? null : envVars.get(GitProtocolConstants.PROTOCOL_ENVIRONMENT_VARIABLE); + if (GenericUtils.isNotBlank(protocol)) { + uploadPack.setExtraParameters(Collections.singleton(protocol)); + } + uploadPack.upload(getInputStream(), getOutputStream(), getErrorStream()); + } + else if (RemoteConfig.DEFAULT_RECEIVE_PACK.equals(subCommand)) { + var receivePack = new ReceivePack(repository); + receivePack.setPreReceiveHook(new LocalVCPrePushHook(localVCServletService, user)); + receivePack.setPostReceiveHook(new LocalVCPostPushHook(localVCServletService)); + receivePack.receive(getInputStream(), getOutputStream(), getErrorStream()); + } + else { + throw new IllegalArgumentException("Unknown git command: " + command); } - uploadPack.upload(getInputStream(), getOutputStream(), getErrorStream()); - } - else if (RemoteConfig.DEFAULT_RECEIVE_PACK.equals(subCommand)) { - var receivePack = new ReceivePack(repository); - receivePack.setPreReceiveHook(new LocalVCPrePushHook(localVCServletService, user)); - receivePack.setPostReceiveHook(new LocalVCPostPushHook(localVCServletService)); - receivePack.receive(getInputStream(), getOutputStream(), getErrorStream()); - } - else { - throw new IllegalArgumentException("Unknown git command: " + command); } onExit(0); diff --git a/src/main/java/de/tum/in/www1/artemis/service/connectors/localci/buildagent/BuildAgentSshKeyService.java b/src/main/java/de/tum/in/www1/artemis/service/connectors/localci/buildagent/BuildAgentSshKeyService.java index 393e250e6b00..587aa1291dba 100644 --- a/src/main/java/de/tum/in/www1/artemis/service/connectors/localci/buildagent/BuildAgentSshKeyService.java +++ b/src/main/java/de/tum/in/www1/artemis/service/connectors/localci/buildagent/BuildAgentSshKeyService.java @@ -5,6 +5,7 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; +import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.attribute.PosixFilePermissions; @@ -79,7 +80,11 @@ private void writePrivateKey() throws IOException, GeneralSecurityException { writer.writePrivateKey(keyPair, sshKeyComment, new OpenSSHKeyEncryptionContext(), outputStream); } - Files.setPosixFilePermissions(privateKeyPath, PosixFilePermissions.fromString("rw-------")); + // Avoid an UnsupportedOperationException on Windows + boolean posixSupported = FileSystems.getDefault().supportedFileAttributeViews().contains("posix"); + if (posixSupported) { + Files.setPosixFilePermissions(privateKeyPath, PosixFilePermissions.fromString("rw-------")); + } } /**