@snyk/docker-registry-v2-client
Advanced tools
Comparing version 2.4.1 to 2.5.0
@@ -9,3 +9,4 @@ import { checkSupport } from "./check-support"; | ||
import { getTags } from "./get-tags"; | ||
import { registryCall } from "./registry-call"; | ||
import * as types from "./types"; | ||
export { checkSupport, getAuthTokenForEndpoint, getImageConfig, getImageSize, getLayer, getManifest, getRepos, getTags, types, }; | ||
export { checkSupport, getAuthTokenForEndpoint, getImageConfig, getImageSize, getLayer, getManifest, getRepos, getTags, registryCall, types, }; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.types = exports.getTags = exports.getRepos = exports.getManifest = exports.getLayer = exports.getImageSize = exports.getImageConfig = exports.getAuthTokenForEndpoint = exports.checkSupport = void 0; | ||
exports.types = exports.registryCall = exports.getTags = exports.getRepos = exports.getManifest = exports.getLayer = exports.getImageSize = exports.getImageConfig = exports.getAuthTokenForEndpoint = exports.checkSupport = void 0; | ||
const check_support_1 = require("./check-support"); | ||
@@ -20,4 +20,6 @@ Object.defineProperty(exports, "checkSupport", { enumerable: true, get: function () { return check_support_1.checkSupport; } }); | ||
Object.defineProperty(exports, "getTags", { enumerable: true, get: function () { return get_tags_1.getTags; } }); | ||
const registry_call_1 = require("./registry-call"); | ||
Object.defineProperty(exports, "registryCall", { enumerable: true, get: function () { return registry_call_1.registryCall; } }); | ||
const types = require("./types"); | ||
exports.types = types; | ||
//# sourceMappingURL=index.js.map |
import { NeedleResponse } from "needle"; | ||
export declare function registryV2Call(registryBase: string, endpoint: string, accept: string, username?: string, password?: string, reqOptions?: any): Promise<NeedleResponse>; | ||
/** | ||
* WARNING!!! | ||
* | ||
* This function was created for a very specific usecase (https://snyksec.atlassian.net/browse/MAGMA-1262) | ||
* It uses the existing mechanism of obtaining a token for authenticating, but can be used to hit any API endpoint, | ||
* and not necessarily a Docker V2 endpoint. | ||
* This is clearly an abuse of a library that's named after the v2 API, and this function should be considered a tech debt. | ||
* Once it's no longer necessary, it is advised that this function is removed. | ||
* | ||
*/ | ||
export declare function registryCall(uri: string, username?: string, password?: string, reqOptions?: any): Promise<NeedleResponse>; | ||
export declare function paginatedV2Call(registryBase: string, accept: string, username: string, password: string, endpoint: string, key: string, pageSize?: number, maxPages?: number, reqOptions?: any): Promise<string[]>; | ||
export declare function getToken(registryBase: string, authBase: string, service: string, scope: string, username: string, password: string, reqOptions?: any): Promise<string>; | ||
export declare function parseChallengeHeaders(challangeHeaders: any): any[]; | ||
export declare function parseChallengeHeaders(challengeHeaders: any): string[]; | ||
export declare function buildUnauthenticatedV2RequestConfig(registryBase: string, endpoint: string, accept: string, reqOptions?: any): any; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.buildUnauthenticatedV2RequestConfig = exports.parseChallengeHeaders = exports.getToken = exports.paginatedV2Call = exports.registryV2Call = void 0; | ||
exports.buildUnauthenticatedV2RequestConfig = exports.parseChallengeHeaders = exports.getToken = exports.paginatedV2Call = exports.registryCall = exports.registryV2Call = void 0; | ||
const parseLink = require("parse-link-header"); | ||
@@ -40,2 +40,43 @@ const url = require("url"); | ||
exports.registryV2Call = registryV2Call; | ||
/** | ||
* WARNING!!! | ||
* | ||
* This function was created for a very specific usecase (https://snyksec.atlassian.net/browse/MAGMA-1262) | ||
* It uses the existing mechanism of obtaining a token for authenticating, but can be used to hit any API endpoint, | ||
* and not necessarily a Docker V2 endpoint. | ||
* This is clearly an abuse of a library that's named after the v2 API, and this function should be considered a tech debt. | ||
* Once it's no longer necessary, it is advised that this function is removed. | ||
* | ||
*/ | ||
async function registryCall(uri, username, password, reqOptions = {}) { | ||
const reqConfig = applyRequestOptions({ uri: `https://${uri}` }, reqOptions); | ||
try { | ||
return await needle_1.needleWrapper(reqConfig, MAX_RETRIES); | ||
} | ||
catch (err) { | ||
if (err.statusCode === 401) { | ||
if (!username || !password) { | ||
// Supply and empty username and password if no credentials | ||
// are provided. These might be added later by a broker client. | ||
username = username ? username : ""; | ||
password = password ? password : ""; | ||
} | ||
const authConfig = await setAuthConfig("", err, reqConfig, username, password, reqOptions); | ||
try { | ||
return await needle_1.needleWrapper(authConfig, MAX_RETRIES); | ||
} | ||
catch (err) { | ||
if (err.statusCode === 307 || err.statusCode === 302) { | ||
return await handleRedirect(err, reqConfig); | ||
} | ||
throw err; | ||
} | ||
} | ||
if (err.statusCode === 307 || err.statusCode === 302) { | ||
return await handleRedirect(err, reqConfig); | ||
} | ||
throw err; | ||
} | ||
} | ||
exports.registryCall = registryCall; | ||
async function paginatedV2Call(registryBase, accept, username, password, endpoint, key, pageSize = 1000, maxPages = Number.MAX_SAFE_INTEGER, reqOptions = {}) { | ||
@@ -78,8 +119,18 @@ const result = []; | ||
exports.getToken = getToken; | ||
function parseChallengeHeaders(challangeHeaders) { | ||
const headersMap = challangeHeaders.split(",").reduce((map, entry) => { | ||
function parseChallengeHeaders(challengeHeaders) { | ||
const headersMap = {}; | ||
const headerSplit = challengeHeaders.split(","); | ||
for (let i = 0; i < headerSplit.length; i++) { | ||
const entry = headerSplit[i]; | ||
if (!entry.includes("=") && i > 0) { | ||
// we'll get here in case a value includes a comma. we want to concat what's after the comma to the previous value | ||
headerSplit[i - 1] += `,${entry}`; | ||
headerSplit.splice(i, 1); | ||
i--; | ||
} | ||
} | ||
headerSplit.forEach(entry => { | ||
const [key, value] = entry.split("="); | ||
map[key] = JSON.parse(value); | ||
return map; | ||
}, {}); | ||
headersMap[key] = JSON.parse(value); | ||
}); | ||
return [headersMap[BEARER_REALM], headersMap.service, headersMap.scope]; | ||
@@ -86,0 +137,0 @@ } |
@@ -45,3 +45,3 @@ { | ||
}, | ||
"version": "2.4.1" | ||
"version": "2.5.0" | ||
} |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
52769
660