testcontainers
Version:
Testcontainers is a NodeJS library that supports tests, providing lightweight, throwaway instances of common databases, Selenium web browsers, or anything else that can run in a Docker container
72 lines • 3.41 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.CredentialProvider = void 0;
const child_process_1 = require("child_process");
const registry_matches_1 = require("./registry-matches");
const common_1 = require("../../common");
class CredentialProvider {
async getAuthConfig(registry, dockerConfig) {
const credentialProviderName = this.getCredentialProviderName(registry, dockerConfig);
if (!credentialProviderName) {
return undefined;
}
const programName = `docker-credential-${credentialProviderName}`;
common_1.log.debug(`Executing Docker credential provider "${programName}"`);
const credentials = await this.listCredentials(programName);
const credentialForRegistry = Object.keys(credentials).find((aRegistry) => (0, registry_matches_1.registryMatches)(aRegistry, registry));
if (!credentialForRegistry) {
common_1.log.debug(`No credential found for registry "${registry}"`);
return undefined;
}
const response = await this.runCredentialProvider(registry, programName);
return {
username: response.Username,
password: response.Secret,
registryAddress: response.ServerURL ?? credentialForRegistry,
};
}
listCredentials(providerName) {
return new Promise((resolve, reject) => {
(0, child_process_1.exec)(`${providerName} list`, (err, stdout) => {
if (err) {
common_1.log.error(`An error occurred listing credentials: ${err}`);
return reject(new Error("An error occurred listing credentials"));
}
try {
const response = JSON.parse(stdout);
return resolve(response);
}
catch (e) {
common_1.log.error(`Unexpected response from Docker credential provider LIST command: "${stdout}"`);
return reject(new Error("Unexpected response from Docker credential provider LIST command"));
}
});
});
}
runCredentialProvider(registry, providerName) {
return new Promise((resolve, reject) => {
const sink = (0, child_process_1.spawn)(providerName, ["get"]);
const chunks = [];
sink.stdout.on("data", (chunk) => chunks.push(chunk));
sink.on("close", (code) => {
if (code !== 0) {
common_1.log.error(`An error occurred getting a credential: ${code}`);
return reject(new Error("An error occurred getting a credential"));
}
const response = chunks.join("");
try {
const parsedResponse = JSON.parse(response);
return resolve(parsedResponse);
}
catch (e) {
common_1.log.error(`Unexpected response from Docker credential provider GET command: "${response}"`);
return reject(new Error("Unexpected response from Docker credential provider GET command"));
}
});
sink.stdin.write(`${registry}\n`);
sink.stdin.end();
});
}
}
exports.CredentialProvider = CredentialProvider;
//# sourceMappingURL=credential-provider.js.map
;