All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.gesellix.docker.client.authentication.CredsStoreHelper.groovy Maven / Gradle / Ivy

package de.gesellix.docker.client.authentication

import com.squareup.moshi.Moshi
import groovy.util.logging.Slf4j

import java.util.concurrent.TimeUnit

@Slf4j
class CredsStoreHelper {

  private Moshi moshi = new Moshi.Builder().build()

  CredsStoreHelperResult getAuthentication(String credsStore, String hostname = "https://index.docker.io/v1/") {
    def result = execCredsHelper(credsStore, "get", hostname)
    return toCredsStoreHelperResult(result, credsStore)
  }

  CredsStoreHelperResult getAllAuthentications(String credsStore) {
    def result = execCredsHelper(credsStore, "list", "unused")
    return toCredsStoreHelperResult(result, credsStore)
  }

  CredsStoreHelperResult toCredsStoreHelperResult(Result result, String credsStore) {
    if (!result.success) {
      return new CredsStoreHelperResult(error: result.message)
    }

    try {
      return new CredsStoreHelperResult(data: moshi.adapter(Map).fromJson(result.message))
    }
    catch (IOException exc) {
      log.error("cannot parse docker-credential-${credsStore} result", exc)
      return new CredsStoreHelperResult(error: exc.message)
    }
    catch (Exception exc) {
      log.error("error trying to get credentials from docker-credential-${credsStore}", exc)
      return new CredsStoreHelperResult(error: exc.message)
    }
  }

  private Result execCredsHelper(String credsStore, String command, String input) {
    def process
    try {
      process = new ProcessBuilder("docker-credential-${credsStore}", command)
          .redirectErrorStream(true)
          .redirectOutput(ProcessBuilder.Redirect.PIPE)
          .start()
    }
    catch (Exception exc) {
      log.error("error trying to execute docker-credential-${credsStore} ${command}", exc)
      return new Result(
          success: false,
          message: exc.message
      )
    }

    def buffer = new BufferedReader(new InputStreamReader(process.inputStream))

    process.outputStream.write(input?.bytes)
    process.outputStream.flush()
    process.outputStream.close()

    process.waitFor(10, TimeUnit.SECONDS)

    if (process.exitValue() != 0) {
      log.error("docker-credential-${credsStore} ${command} failed")
    }
    return new Result(
        success: process.exitValue() == 0,
        message: buffer.readLines().join('')
    )
  }

  static class Result {

    boolean success
    String message
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy