Compare commits

..
2 Commits
4 changed files with 34 additions and 7 deletions
+5 -3
View File
@@ -2,8 +2,10 @@
set -e set -e
export VERSION="${CIRRUS_TAG:-0}"
mkdir -p .ci/pkg/ mkdir -p .ci/pkg/
cp .build/arm64-apple-macosx/debug/tart .ci/pkg/ cp .build/arm64-apple-macosx/debug/tart .ci/pkg/
pkgbuild --root .ci/pkg --version "${CIRRUS_TAG:-0}" --install-location /usr/local/bin/ --identifier com.github.cirruslabs.tart --sign "Developer ID Installer: Fedor Korotkov (9M2P8L4D89)" ./dist/Tart.pkg pkgbuild --root .ci/pkg --version $VERSION --install-location /usr/local/bin/ --identifier com.github.cirruslabs.tart --sign "Developer ID Installer: Fedor Korotkov (9M2P8L4D89)" "./dist/Tart-$VERSION.pkg"
xcrun notarytool submit ./dist/Tart.pkg --keychain-profile "notarytool" --wait xcrun notarytool submit "./dist/Tart-$VERSION.pkg" --keychain-profile "notarytool" --wait
xcrun stapler staple ./dist/Tart.pkg xcrun stapler staple "./dist/Tart-$VERSION.pkg"
+1 -1
View File
@@ -28,7 +28,7 @@ archives:
release: release:
prerelease: auto prerelease: auto
extra_files: extra_files:
- glob: ./dist/Tart.pkg - glob: ./dist/Tart-{{ .Tag }}.pkg
brews: brews:
- name: tart - name: tart
@@ -1,6 +1,6 @@
import Foundation import Foundation
class HelperProgramCredentialsProvider: CredentialsProvider { class DockerConfigCredentialsProvider: CredentialsProvider {
func retrieve(host: String) throws -> (String, String)? { func retrieve(host: String) throws -> (String, String)? {
let dockerConfigURL = FileManager.default.homeDirectoryForCurrentUser.appendingPathComponent(".docker").appendingPathComponent("config.json") let dockerConfigURL = FileManager.default.homeDirectoryForCurrentUser.appendingPathComponent(".docker").appendingPathComponent("config.json")
if !FileManager.default.fileExists(atPath: dockerConfigURL.path) { if !FileManager.default.fileExists(atPath: dockerConfigURL.path) {
@@ -8,6 +8,9 @@ class HelperProgramCredentialsProvider: CredentialsProvider {
} }
let config = try JSONDecoder().decode(DockerConfig.self, from: Data(contentsOf: dockerConfigURL)) let config = try JSONDecoder().decode(DockerConfig.self, from: Data(contentsOf: dockerConfigURL))
if let credentialsFromAuth = config.auths?[host]?.decodeCredentials() {
return credentialsFromAuth
}
if let helperProgram = config.credHelpers?[host] { if let helperProgram = config.credHelpers?[host] {
return try executeHelper(binaryName: "docker-credential-\(helperProgram)", host: host) return try executeHelper(binaryName: "docker-credential-\(helperProgram)", host: host)
} }
@@ -54,9 +57,31 @@ class HelperProgramCredentialsProvider: CredentialsProvider {
} }
struct DockerConfig: Codable { struct DockerConfig: Codable {
var auths: Dictionary<String, DockerAuthConfig>? = Dictionary()
var credHelpers: Dictionary<String, String>? = Dictionary() var credHelpers: Dictionary<String, String>? = Dictionary()
} }
struct DockerAuthConfig: Codable {
var auth: String? = nil
func decodeCredentials() -> (String, String)? {
// auth is a base64("username:password")
guard let authBase64 = auth else {
return nil
}
guard let data = Data(base64Encoded: authBase64) else {
return nil
}
guard let components = String(data: data, encoding: .utf8)?.components(separatedBy: ":") else {
return nil
}
if components.count != 2 {
return nil
}
return (components[0], components[1])
}
}
struct DockerGetOutput: Codable { struct DockerGetOutput: Codable {
var Username: String var Username: String
var Secret: String var Secret: String
+2 -2
View File
@@ -94,7 +94,7 @@ class Registry {
init(urlComponents: URLComponents, init(urlComponents: URLComponents,
namespace: String, namespace: String,
credentialsProviders: [CredentialsProvider] = [HelperProgramCredentialsProvider(), KeychainCredentialsProvider()] credentialsProviders: [CredentialsProvider] = [DockerConfigCredentialsProvider(), KeychainCredentialsProvider()]
) throws { ) throws {
baseURL = urlComponents.url! baseURL = urlComponents.url!
self.namespace = namespace self.namespace = namespace
@@ -105,7 +105,7 @@ class Registry {
host: String, host: String,
namespace: String, namespace: String,
insecure: Bool = false, insecure: Bool = false,
credentialsProviders: [CredentialsProvider] = [HelperProgramCredentialsProvider(), KeychainCredentialsProvider()] credentialsProviders: [CredentialsProvider] = [DockerConfigCredentialsProvider(), KeychainCredentialsProvider()]
) throws { ) throws {
let proto = insecure ? "http" : "https" let proto = insecure ? "http" : "https"
let baseURLComponents = URLComponents(string: proto + "://" + host + "/v2/")! let baseURLComponents = URLComponents(string: proto + "://" + host + "/v2/")!